weaver-work-cli 0.1.2 → 0.1.5

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 (405) hide show
  1. package/README.md +176 -78
  2. package/dist/cmd/setup/index.js +5 -5
  3. package/dist/cmd/skills/index.js +1 -1
  4. package/dist/core/hooks.js +7 -0
  5. package/dist/index.js +0 -0
  6. package/dist/internal/e10/auth/commands.js +159 -54
  7. package/dist/internal/e10/auth/xiaoe.js +268 -0
  8. package/dist/internal/e10/context.js +16 -2
  9. package/dist/internal/e10/index.js +1 -0
  10. package/dist/internal/e10/request-runtime.js +345 -0
  11. package/dist/internal/skills/install.js +48 -6
  12. package/dist/internal/skills/reader.js +27 -0
  13. package/dist/shortcuts/archive/continuation.js +70 -0
  14. package/dist/shortcuts/archive/errors.js +53 -0
  15. package/dist/shortcuts/archive/host.js +197 -0
  16. package/dist/shortcuts/archive/index.js +363 -0
  17. package/dist/shortcuts/archive/manifest.js +45 -0
  18. package/dist/shortcuts/archive/operations/archive-info.js +55 -0
  19. package/dist/shortcuts/archive/operations/borrow-car.js +146 -0
  20. package/dist/shortcuts/archive/operations/borrow-list.js +200 -0
  21. package/dist/shortcuts/archive/operations/confirm.js +46 -0
  22. package/dist/shortcuts/archive/operations/download.js +238 -0
  23. package/dist/shortcuts/archive/operations/flow-url.js +240 -0
  24. package/dist/shortcuts/archive/operations/fonds.js +95 -0
  25. package/dist/shortcuts/archive/operations/getPageUrl.js +137 -0
  26. package/dist/shortcuts/archive/operations/registry.js +43 -0
  27. package/dist/shortcuts/archive/operations/search.js +88 -0
  28. package/dist/shortcuts/archive/operations/shared.js +120 -0
  29. package/dist/shortcuts/archive/operations/types.js +23 -0
  30. package/dist/shortcuts/archive/operations/upload.js +182 -0
  31. package/dist/shortcuts/archive/operations.js +13 -0
  32. package/dist/shortcuts/archive/render/search-format.js +276 -0
  33. package/dist/shortcuts/archive/render/search-view.js +125 -0
  34. package/dist/shortcuts/asset/continuation.js +70 -0
  35. package/dist/shortcuts/asset/errors.js +67 -0
  36. package/dist/shortcuts/asset/host.js +438 -0
  37. package/dist/shortcuts/asset/index.js +255 -0
  38. package/dist/shortcuts/asset/manifest.js +471 -0
  39. package/dist/shortcuts/asset/operations/query.js +249 -0
  40. package/dist/shortcuts/asset/operations/registry.js +85 -0
  41. package/dist/shortcuts/asset/operations/shared.js +100 -0
  42. package/dist/shortcuts/asset/operations/type-cache.js +49 -0
  43. package/dist/shortcuts/asset/operations/types.js +1 -0
  44. package/dist/shortcuts/asset/operations/viewlink.js +117 -0
  45. package/dist/shortcuts/asset/operations/write.js +435 -0
  46. package/dist/shortcuts/asset/operations.js +9 -0
  47. package/dist/shortcuts/calendar/continuation.js +70 -0
  48. package/dist/shortcuts/calendar/errors.js +53 -0
  49. package/dist/shortcuts/calendar/host.js +148 -0
  50. package/dist/shortcuts/calendar/index.js +125 -0
  51. package/dist/shortcuts/calendar/manifest.js +26 -0
  52. package/dist/shortcuts/calendar/operations/read.js +259 -0
  53. package/dist/shortcuts/calendar/operations/registry.js +31 -0
  54. package/dist/shortcuts/calendar/operations/shared.js +132 -0
  55. package/dist/shortcuts/calendar/operations/types.js +25 -0
  56. package/dist/shortcuts/calendar/operations/write.js +439 -0
  57. package/dist/shortcuts/calendar/operations.js +8 -0
  58. package/dist/shortcuts/ehr/continuation.js +70 -0
  59. package/dist/shortcuts/ehr/errors.js +53 -0
  60. package/dist/shortcuts/ehr/host.js +213 -0
  61. package/dist/shortcuts/ehr/index.js +205 -0
  62. package/dist/shortcuts/ehr/manifest.js +47 -0
  63. package/dist/shortcuts/ehr/operations/attend-read.js +373 -0
  64. package/dist/shortcuts/ehr/operations/attend-write.js +514 -0
  65. package/dist/shortcuts/ehr/operations/hr-contact.js +363 -0
  66. package/dist/shortcuts/ehr/operations/hr-ds.js +298 -0
  67. package/dist/shortcuts/ehr/operations/hr-report.js +386 -0
  68. package/dist/shortcuts/ehr/operations/recruit-write.js +1629 -0
  69. package/dist/shortcuts/ehr/operations/recruit.js +803 -0
  70. package/dist/shortcuts/ehr/operations/registry.js +43 -0
  71. package/dist/shortcuts/ehr/operations/salary.js +319 -0
  72. package/dist/shortcuts/ehr/operations/shared.js +246 -0
  73. package/dist/shortcuts/ehr/operations/types.js +25 -0
  74. package/dist/shortcuts/ehr/operations.js +25 -0
  75. package/dist/shortcuts/esb/continuation.js +70 -0
  76. package/dist/shortcuts/esb/errors.js +65 -0
  77. package/dist/shortcuts/esb/host.js +187 -0
  78. package/dist/shortcuts/esb/index.js +112 -0
  79. package/dist/shortcuts/esb/manifest.js +91 -0
  80. package/dist/shortcuts/esb/operations/input-format.js +31 -0
  81. package/dist/shortcuts/esb/operations/registry.js +48 -0
  82. package/dist/shortcuts/esb/operations/shared.js +152 -0
  83. package/dist/shortcuts/esb/operations/trigger.js +76 -0
  84. package/dist/shortcuts/esb/operations/types.js +21 -0
  85. package/dist/shortcuts/esb/operations.js +15 -0
  86. package/dist/shortcuts/fna/continuation.js +70 -0
  87. package/dist/shortcuts/fna/errors.js +59 -0
  88. package/dist/shortcuts/fna/host.js +146 -0
  89. package/dist/shortcuts/fna/index.js +111 -0
  90. package/dist/shortcuts/fna/manifest.js +41 -0
  91. package/dist/shortcuts/fna/operations/budget.js +124 -0
  92. package/dist/shortcuts/fna/operations/expense-center.js +148 -0
  93. package/dist/shortcuts/fna/operations/invoice-writeoff.js +212 -0
  94. package/dist/shortcuts/fna/operations/loan.js +195 -0
  95. package/dist/shortcuts/fna/operations/registry.js +35 -0
  96. package/dist/shortcuts/fna/operations/shared.js +210 -0
  97. package/dist/shortcuts/fna/operations/types.js +25 -0
  98. package/dist/shortcuts/fna/operations.js +19 -0
  99. package/dist/shortcuts/hrm/errors.js +38 -0
  100. package/dist/shortcuts/hrm/host.js +156 -0
  101. package/dist/shortcuts/hrm/index.js +111 -0
  102. package/dist/shortcuts/hrm/manifest.js +32 -0
  103. package/dist/shortcuts/hrm/operations/employee.js +338 -0
  104. package/dist/shortcuts/hrm/operations/org.js +110 -0
  105. package/dist/shortcuts/hrm/operations/position.js +176 -0
  106. package/dist/shortcuts/hrm/operations/registry.js +33 -0
  107. package/dist/shortcuts/hrm/operations/shared.js +143 -0
  108. package/dist/shortcuts/hrm/operations/types.js +23 -0
  109. package/dist/shortcuts/hrm/operations.js +19 -0
  110. package/dist/shortcuts/index.js +24 -0
  111. package/dist/shortcuts/invoice/host.js +99 -94
  112. package/dist/shortcuts/invoice/index.js +58 -59
  113. package/dist/shortcuts/invoice/manifest.js +200 -3
  114. package/dist/shortcuts/invoice/operations/browse-field.js +17 -0
  115. package/dist/shortcuts/invoice/operations/issuing.js +198 -0
  116. package/dist/shortcuts/invoice/operations/registry.js +17 -0
  117. package/dist/shortcuts/invoice/operations/reim.js +401 -0
  118. package/dist/shortcuts/invoice/operations/shared.js +247 -0
  119. package/dist/shortcuts/jiuchuanhui/cache.js +441 -0
  120. package/dist/shortcuts/jiuchuanhui/continuation.js +70 -0
  121. package/dist/shortcuts/jiuchuanhui/errors.js +59 -0
  122. package/dist/shortcuts/jiuchuanhui/host.js +159 -0
  123. package/dist/shortcuts/jiuchuanhui/index.js +109 -0
  124. package/dist/shortcuts/jiuchuanhui/manifest.js +469 -0
  125. package/dist/shortcuts/jiuchuanhui/operations/datajson.js +214 -0
  126. package/dist/shortcuts/jiuchuanhui/operations/esb.js +157 -0
  127. package/dist/shortcuts/jiuchuanhui/operations/generic.js +146 -0
  128. package/dist/shortcuts/jiuchuanhui/operations/registry.js +133 -0
  129. package/dist/shortcuts/jiuchuanhui/operations/shared.js +158 -0
  130. package/dist/shortcuts/jiuchuanhui/operations/types.js +1 -0
  131. package/dist/shortcuts/jiuchuanhui/operations.js +8 -0
  132. package/dist/shortcuts/mail/continuation.js +70 -0
  133. package/dist/shortcuts/mail/errors.js +53 -0
  134. package/dist/shortcuts/mail/host.js +182 -0
  135. package/dist/shortcuts/mail/index.js +519 -0
  136. package/dist/shortcuts/mail/manifest.js +38 -0
  137. package/dist/shortcuts/mail/operations/mail-blacklist.js +79 -0
  138. package/dist/shortcuts/mail/operations/mail-contacts.js +195 -0
  139. package/dist/shortcuts/mail/operations/mail-manage.js +335 -0
  140. package/dist/shortcuts/mail/operations/mail-read.js +508 -0
  141. package/dist/shortcuts/mail/operations/mail-send.js +474 -0
  142. package/dist/shortcuts/mail/operations/mail-sign.js +203 -0
  143. package/dist/shortcuts/mail/operations/mail-template.js +170 -0
  144. package/dist/shortcuts/mail/operations/registry.js +41 -0
  145. package/dist/shortcuts/mail/operations/shared.js +64 -0
  146. package/dist/shortcuts/mail/operations/types.js +27 -0
  147. package/dist/shortcuts/mail/operations.js +19 -0
  148. package/dist/shortcuts/meeting/continuation.js +70 -0
  149. package/dist/shortcuts/meeting/errors.js +63 -0
  150. package/dist/shortcuts/meeting/host.js +167 -0
  151. package/dist/shortcuts/meeting/index.js +123 -0
  152. package/dist/shortcuts/meeting/manifest.js +64 -0
  153. package/dist/shortcuts/meeting/operations/catalogs.js +58 -0
  154. package/dist/shortcuts/meeting/operations/change.js +242 -0
  155. package/dist/shortcuts/meeting/operations/conflicts.js +142 -0
  156. package/dist/shortcuts/meeting/operations/create.js +349 -0
  157. package/dist/shortcuts/meeting/operations/env.js +191 -0
  158. package/dist/shortcuts/meeting/operations/lifecycle.js +139 -0
  159. package/dist/shortcuts/meeting/operations/meetings.js +73 -0
  160. package/dist/shortcuts/meeting/operations/receipts.js +195 -0
  161. package/dist/shortcuts/meeting/operations/registry.js +47 -0
  162. package/dist/shortcuts/meeting/operations/rooms.js +132 -0
  163. package/dist/shortcuts/meeting/operations/shared.js +112 -0
  164. package/dist/shortcuts/meeting/operations/signs.js +41 -0
  165. package/dist/shortcuts/meeting/operations/types.js +25 -0
  166. package/dist/shortcuts/meeting/operations.js +19 -0
  167. package/dist/shortcuts/plan/continuation.js +70 -0
  168. package/dist/shortcuts/plan/errors.js +70 -0
  169. package/dist/shortcuts/plan/host.js +180 -0
  170. package/dist/shortcuts/plan/index.js +150 -0
  171. package/dist/shortcuts/plan/manifest.js +53 -0
  172. package/dist/shortcuts/plan/operations/link.js +256 -0
  173. package/dist/shortcuts/plan/operations/read.js +259 -0
  174. package/dist/shortcuts/plan/operations/registry.js +33 -0
  175. package/dist/shortcuts/plan/operations/shared.js +246 -0
  176. package/dist/shortcuts/plan/operations/types.js +49 -0
  177. package/dist/shortcuts/plan/operations/version.js +49 -0
  178. package/dist/shortcuts/plan/operations/write.js +710 -0
  179. package/dist/shortcuts/plan/operations.js +8 -0
  180. package/dist/shortcuts/yimiaoban/continuation.js +70 -0
  181. package/dist/shortcuts/yimiaoban/errors.js +61 -0
  182. package/dist/shortcuts/yimiaoban/host.js +469 -0
  183. package/dist/shortcuts/yimiaoban/index.js +271 -0
  184. package/dist/shortcuts/yimiaoban/manifest.js +28 -0
  185. package/dist/shortcuts/yimiaoban/operations/file-user.js +288 -0
  186. package/dist/shortcuts/yimiaoban/operations/group-read.js +477 -0
  187. package/dist/shortcuts/yimiaoban/operations/group-write.js +591 -0
  188. package/dist/shortcuts/yimiaoban/operations/msg-parse.js +429 -0
  189. package/dist/shortcuts/yimiaoban/operations/msg-sync.js +519 -0
  190. package/dist/shortcuts/yimiaoban/operations/msg-write.js +593 -0
  191. package/dist/shortcuts/yimiaoban/operations/person.js +102 -0
  192. package/dist/shortcuts/yimiaoban/operations/registry.js +38 -0
  193. package/dist/shortcuts/yimiaoban/operations/session.js +437 -0
  194. package/dist/shortcuts/yimiaoban/operations/shared.js +236 -0
  195. package/dist/shortcuts/yimiaoban/operations/types.js +27 -0
  196. package/dist/shortcuts/yimiaoban/operations/write-util.js +78 -0
  197. package/dist/shortcuts/yimiaoban/operations.js +8 -0
  198. package/docs/SKILL.md +11 -7
  199. package/docs/_catalog.md +28 -5
  200. package/docs/agent-invoice.md +19 -9
  201. package/docs/agent-skill-install.md +141 -22
  202. package/docs/calendar.md +87 -0
  203. package/docs/e10-auth.md +28 -9
  204. package/docs/ehr.md +186 -0
  205. package/docs/esb.md +64 -0
  206. package/docs/fna.md +72 -0
  207. package/docs/hrm.md +89 -0
  208. package/docs/invoice.md +61 -20
  209. package/docs/jiuchuanhui.md +131 -0
  210. package/docs/meeting.md +48 -0
  211. package/docs/operation-manual.md +443 -0
  212. package/docs/plan.md +82 -0
  213. package/docs/wenshuding.md +129 -0
  214. package/docs/yimiaoban.md +86 -0
  215. package/docs/ziguanjia.md +89 -0
  216. package/package.json +4 -4
  217. package/scripts/package-skill.mjs +127 -34
  218. package/scripts/postbuild.mjs +13 -0
  219. package/skill-template/business-info.json +16 -2
  220. package/skill-template/domains/calendar.md +15 -0
  221. package/skill-template/domains/esb.md +13 -0
  222. package/skill-template/domains/hrm.md +16 -0
  223. package/skill-template/domains/jiuchuanhui.md +23 -0
  224. package/skill-template/domains/jucailin.md +22 -0
  225. package/skill-template/domains/mail.md +21 -0
  226. package/skill-template/domains/meeting.md +3 -0
  227. package/skill-template/domains/plan.md +17 -0
  228. package/skill-template/domains/qiyecheng.md +17 -0
  229. package/skill-template/domains/shared.md +5 -3
  230. package/skill-template/domains/skill-maker.md +10 -0
  231. package/skill-template/domains/wenshuding.md +22 -0
  232. package/skill-template/domains/{invoice.md → yepiaotong.md} +4 -0
  233. package/skill-template/domains/yimiaoban.md +21 -0
  234. package/skill-template/domains/ziguanjia.md +21 -0
  235. package/skill-template/master-skill-template.md +12 -6
  236. package/skill-template/skill-template.md +26 -10
  237. package/skills/weaver-e10-calendar/SKILL.md +102 -0
  238. package/skills/weaver-e10-calendar/product.json +8 -0
  239. package/skills/weaver-e10-calendar/references/calendar-app-check.md +65 -0
  240. package/skills/weaver-e10-calendar/references/calendar-dict.md +55 -0
  241. package/skills/weaver-e10-calendar/references/calendar-query.md +70 -0
  242. package/skills/weaver-e10-calendar/references/calendar-write.md +97 -0
  243. package/skills/weaver-e10-calendar/references/source-manifest.json +54 -0
  244. package/skills/weaver-e10-esb/SKILL.md +103 -0
  245. package/skills/weaver-e10-esb/product.json +8 -0
  246. package/skills/weaver-e10-esb/references/input-format.md +52 -0
  247. package/skills/weaver-e10-esb/references/source-manifest.json +242 -0
  248. package/skills/weaver-e10-esb/references/trigger.md +99 -0
  249. package/skills/weaver-e10-hrm/SKILL.md +88 -0
  250. package/skills/weaver-e10-hrm/product.json +8 -0
  251. package/skills/weaver-e10-hrm/references/employee.md +109 -0
  252. package/skills/weaver-e10-hrm/references/org.md +95 -0
  253. package/skills/weaver-e10-hrm/references/position.md +95 -0
  254. package/skills/weaver-e10-hrm/references/source-manifest.json +121 -0
  255. package/skills/weaver-e10-jiuchuanhui/SKILL.md +175 -0
  256. package/skills/weaver-e10-jiuchuanhui/product.json +8 -0
  257. package/skills/weaver-e10-jiuchuanhui/references/cache.md +110 -0
  258. package/skills/weaver-e10-jiuchuanhui/references/clue.md +61 -0
  259. package/skills/weaver-e10-jiuchuanhui/references/contact-plan.md +56 -0
  260. package/skills/weaver-e10-jiuchuanhui/references/contact-records.md +48 -0
  261. package/skills/weaver-e10-jiuchuanhui/references/contact.md +56 -0
  262. package/skills/weaver-e10-jiuchuanhui/references/customer.md +69 -0
  263. package/skills/weaver-e10-jiuchuanhui/references/disabled-capabilities.md +24 -0
  264. package/skills/weaver-e10-jiuchuanhui/references/discovery-config.md +60 -0
  265. package/skills/weaver-e10-jiuchuanhui/references/general-helpers.md +59 -0
  266. package/skills/weaver-e10-jiuchuanhui/references/jiuchuanhui-entry.md +60 -0
  267. package/skills/weaver-e10-jiuchuanhui/references/sale.md +72 -0
  268. package/skills/weaver-e10-jiuchuanhui/references/source-manifest.json +2632 -0
  269. package/skills/weaver-e10-jucailin/SKILL.md +102 -0
  270. package/skills/weaver-e10-jucailin/product.json +8 -0
  271. package/skills/weaver-e10-jucailin/references/attend-read.md +73 -0
  272. package/skills/weaver-e10-jucailin/references/attend-write.md +82 -0
  273. package/skills/weaver-e10-jucailin/references/hr-contact.md +92 -0
  274. package/skills/weaver-e10-jucailin/references/hr-datasource.md +104 -0
  275. package/skills/weaver-e10-jucailin/references/hr-report.md +76 -0
  276. package/skills/weaver-e10-jucailin/references/recruit-read.md +76 -0
  277. package/skills/weaver-e10-jucailin/references/recruit-write.md +70 -0
  278. package/skills/weaver-e10-jucailin/references/safety-boundaries.md +35 -0
  279. package/skills/weaver-e10-jucailin/references/salary.md +110 -0
  280. package/skills/weaver-e10-jucailin/references/source-manifest.json +152 -0
  281. package/skills/weaver-e10-mail/SKILL.md +152 -0
  282. package/skills/weaver-e10-mail/product.json +8 -0
  283. package/skills/weaver-e10-mail/references/mail-agent-entry.md +47 -0
  284. package/skills/weaver-e10-mail/references/mail-attachment.md +30 -0
  285. package/skills/weaver-e10-mail/references/mail-blacklist.md +27 -0
  286. package/skills/weaver-e10-mail/references/mail-contacts.md +33 -0
  287. package/skills/weaver-e10-mail/references/mail-manage.md +44 -0
  288. package/skills/weaver-e10-mail/references/mail-read.md +76 -0
  289. package/skills/weaver-e10-mail/references/mail-send.md +43 -0
  290. package/skills/weaver-e10-mail/references/mail-sign.md +33 -0
  291. package/skills/weaver-e10-mail/references/mail-template.md +31 -0
  292. package/skills/weaver-e10-mail/references/safety-boundaries.md +32 -0
  293. package/skills/weaver-e10-meeting/SKILL.md +106 -0
  294. package/skills/weaver-e10-meeting/product.json +8 -0
  295. package/skills/weaver-e10-meeting/references/meeting-change.md +67 -0
  296. package/skills/weaver-e10-meeting/references/meeting-create.md +52 -0
  297. package/skills/weaver-e10-meeting/references/meeting-lifecycle.md +57 -0
  298. package/skills/weaver-e10-meeting/references/meeting-queries.md +61 -0
  299. package/skills/weaver-e10-meeting/references/meeting-receipts-signs.md +48 -0
  300. package/skills/weaver-e10-meeting/references/meeting-update.md +7 -0
  301. package/skills/weaver-e10-meeting/references/source-manifest.json +50 -0
  302. package/skills/weaver-e10-plan/SKILL.md +140 -0
  303. package/skills/weaver-e10-plan/product.json +8 -0
  304. package/skills/weaver-e10-plan/references/plan-collect-and-compose.md +123 -0
  305. package/skills/weaver-e10-plan/references/plan-overview-and-routing.md +138 -0
  306. package/skills/weaver-e10-plan/references/plan-report-query.md +154 -0
  307. package/skills/weaver-e10-plan/references/plan-report-remind.md +104 -0
  308. package/skills/weaver-e10-plan/references/plan-report-write.md +162 -0
  309. package/skills/weaver-e10-plan/references/source-manifest.json +858 -0
  310. package/skills/weaver-e10-qiyecheng/SKILL.md +119 -0
  311. package/skills/weaver-e10-qiyecheng/product.json +8 -0
  312. package/skills/weaver-e10-qiyecheng/references/budget.md +65 -0
  313. package/skills/weaver-e10-qiyecheng/references/catalog.md +56 -0
  314. package/skills/weaver-e10-qiyecheng/references/expense-center.md +51 -0
  315. package/skills/weaver-e10-qiyecheng/references/invoice-writeoff.md +57 -0
  316. package/skills/weaver-e10-qiyecheng/references/loan-management.md +59 -0
  317. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +698 -0
  318. package/skills/weaver-e10-shared/SKILL.md +90 -0
  319. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +127 -0
  320. package/skills/{weaver-work-cli-shared → weaver-e10-shared}/references/json-output-contract.md +34 -0
  321. package/skills/weaver-e10-shared/references/weaver-e10-installation.md +110 -0
  322. package/skills/weaver-e10-skill-maker/SKILL.md +78 -0
  323. package/skills/weaver-e10-skill-maker/product.json +8 -0
  324. package/skills/weaver-e10-skill-maker/references/business-skill-generation.md +124 -0
  325. package/skills/weaver-e10-skill-maker/references/detector-validation.md +101 -0
  326. package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +230 -0
  327. package/skills/weaver-e10-skill-maker/references/post-generation-install.md +105 -0
  328. package/skills/weaver-e10-skill-maker/references/source-update-detection.md +261 -0
  329. package/skills/weaver-e10-skill-maker/references/weaver-skill-style.md +141 -0
  330. package/skills/weaver-e10-wenshuding/SKILL.md +158 -0
  331. package/skills/weaver-e10-wenshuding/product.json +8 -0
  332. package/skills/weaver-e10-wenshuding/references/archive-agent-entry.md +63 -0
  333. package/skills/weaver-e10-wenshuding/references/archive-borrow-car.md +52 -0
  334. package/skills/weaver-e10-wenshuding/references/archive-borrow-list.md +52 -0
  335. package/skills/weaver-e10-wenshuding/references/archive-disabled-capabilities.md +22 -0
  336. package/skills/weaver-e10-wenshuding/references/archive-download.md +48 -0
  337. package/skills/weaver-e10-wenshuding/references/archive-flow.md +46 -0
  338. package/skills/weaver-e10-wenshuding/references/archive-fonds.md +34 -0
  339. package/skills/weaver-e10-wenshuding/references/archive-info.md +33 -0
  340. package/skills/weaver-e10-wenshuding/references/archive-search.md +52 -0
  341. package/skills/weaver-e10-wenshuding/references/archive-upload.md +41 -0
  342. package/skills/weaver-e10-wenshuding/references/source-manifest.json +517 -0
  343. package/skills/weaver-e10-yepiaotong/SKILL.md +184 -0
  344. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-add.md +1 -1
  345. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-agent-entry.md +16 -9
  346. package/skills/weaver-e10-yepiaotong/references/invoice-browse-field-data.md +204 -0
  347. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-delete.md +1 -1
  348. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-detail.md +13 -5
  349. package/skills/weaver-e10-yepiaotong/references/invoice-disabled-capabilities.md +28 -0
  350. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-download.md +9 -2
  351. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-enterprise-list.md +12 -4
  352. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-file-upload.md +9 -2
  353. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-import.md +16 -7
  354. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +120 -0
  355. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-field-rules.md +161 -0
  356. package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +99 -0
  357. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-ocr-preview.md +12 -4
  358. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-personal-list.md +12 -4
  359. package/skills/weaver-e10-yepiaotong/references/invoice-red.md +261 -0
  360. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +97 -0
  361. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-update.md +1 -1
  362. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-validation-preview.md +9 -2
  363. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +1340 -0
  364. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +845 -0
  365. package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +94 -0
  366. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +449 -0
  367. package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +266 -0
  368. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +494 -0
  369. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +1103 -0
  370. package/skills/weaver-e10-yimiaoban/SKILL.md +104 -0
  371. package/skills/weaver-e10-yimiaoban/product.json +8 -0
  372. package/skills/weaver-e10-yimiaoban/references/ding-write.md +68 -0
  373. package/skills/weaver-e10-yimiaoban/references/error-codes.md +85 -0
  374. package/skills/weaver-e10-yimiaoban/references/field-resolution.md +46 -0
  375. package/skills/weaver-e10-yimiaoban/references/file-user-i18n.md +54 -0
  376. package/skills/weaver-e10-yimiaoban/references/group-read.md +55 -0
  377. package/skills/weaver-e10-yimiaoban/references/group-write.md +72 -0
  378. package/skills/weaver-e10-yimiaoban/references/msg-read.md +59 -0
  379. package/skills/weaver-e10-yimiaoban/references/msg-write.md +64 -0
  380. package/skills/weaver-e10-yimiaoban/references/person.md +44 -0
  381. package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +61 -0
  382. package/skills/weaver-e10-yimiaoban/references/session-sysmsg.md +47 -0
  383. package/skills/weaver-e10-yimiaoban/references/source-manifest.json +485 -0
  384. package/skills/weaver-e10-ziguanjia/SKILL.md +163 -0
  385. package/skills/weaver-e10-ziguanjia/product.json +8 -0
  386. package/skills/weaver-e10-ziguanjia/references/source-manifest.json +147 -0
  387. package/skills/weaver-e10-ziguanjia/references/ziguanjia-agent-entry.md +65 -0
  388. package/skills/weaver-e10-ziguanjia/references/ziguanjia-create.md +45 -0
  389. package/skills/weaver-e10-ziguanjia/references/ziguanjia-depre.md +48 -0
  390. package/skills/weaver-e10-ziguanjia/references/ziguanjia-disabled-capabilities.md +22 -0
  391. package/skills/weaver-e10-ziguanjia/references/ziguanjia-purch.md +57 -0
  392. package/skills/weaver-e10-ziguanjia/references/ziguanjia-query.md +62 -0
  393. package/skills/weaver-e10-ziguanjia/references/ziguanjia-repair.md +83 -0
  394. package/skills/weaver-e10-ziguanjia/references/ziguanjia-resolve.md +49 -0
  395. package/skills/weaver-e10-ziguanjia/references/ziguanjia-return.md +70 -0
  396. package/skills/weaver-e10-ziguanjia/references/ziguanjia-update.md +45 -0
  397. package/skills/weaver-e10-ziguanjia/references/ziguanjia-use.md +60 -0
  398. package/skills/weaver-e10-ziguanjia/references/ziguanjia-viewlink.md +81 -0
  399. package/skills/weaver-work-cli-invoice/SKILL.md +0 -122
  400. package/skills/weaver-work-cli-invoice/references/invoice-disabled-capabilities.md +0 -26
  401. package/skills/weaver-work-cli-shared/SKILL.md +0 -63
  402. package/skills/weaver-work-cli-shared/references/e10-auth-and-session.md +0 -90
  403. package/skills/weaver-work-cli-shared/references/weaver-work-cli-installation.md +0 -73
  404. /package/skills/{weaver-work-cli-shared → weaver-e10-shared}/references/high-risk-write.md +0 -0
  405. /package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/product.json +0 -0
@@ -4,7 +4,14 @@ import { CliError, ExitCode } from '../../../core/errors.js';
4
4
  import { clearInvoiceTokenForSession } from '../../../shortcuts/invoice/host.js';
5
5
  import { buildE10CookieHeader, E10AuthSession, clearProfileAuthFile, extractRawSetCookie, findAuthFile, getActiveProfile, getProfileAuthPath, getProfileDir, listProfiles, profileNameFromUrl, readProfileConfig, readTeamsCheckUserInfo, saveAuthFile, saveProfileConfig, setActiveProfile, } from './session.js';
6
6
  import { getE10AuthRoot } from './paths.js';
7
+ import { XIAOE_AGENT_TYPE, hasXiaoEEnv, resolveXiaoEPreferredBaseUrl, resolveXiaoEUnifiedLoginCredential, } from './xiaoe.js';
8
+ export { DEFAULT_E10_BASE_URL, XIAOE_AGENT_TYPE, hasXiaoEEnv, resolveXiaoEDefaultBaseUrl, resolveXiaoEPreferredBaseUrl, resolveXiaoEUnifiedLoginCredential, } from './xiaoe.js';
7
9
  const DEFAULT_AGENT_TYPE = 'weaver-work-cli';
10
+ const EXPLICIT_AGENT_TYPE_ENV_KEYS = [
11
+ 'WEAVER_AGENT_TYPE',
12
+ 'WORKBUDDY_AGENT_TYPE',
13
+ 'CODEX_AGENT_TYPE',
14
+ ];
8
15
  function asOptions(value) {
9
16
  return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
10
17
  }
@@ -16,6 +23,32 @@ function optionString(options, ...keys) {
16
23
  }
17
24
  return '';
18
25
  }
26
+ function envString(env, ...keys) {
27
+ for (const key of keys) {
28
+ const value = env[key];
29
+ if (typeof value === 'string' && value.trim())
30
+ return value.trim();
31
+ }
32
+ return '';
33
+ }
34
+ function hasEnvPrefix(env, prefix) {
35
+ return Object.keys(env).some((key) => key === prefix || key.startsWith(`${prefix}_`));
36
+ }
37
+ function inferAgentTypeFromEnv(env) {
38
+ if (hasXiaoEEnv(env))
39
+ return XIAOE_AGENT_TYPE;
40
+ if (hasEnvPrefix(env, 'WORKBUDDY'))
41
+ return 'workbuddy';
42
+ if (hasEnvPrefix(env, 'CODEX'))
43
+ return 'codex';
44
+ return '';
45
+ }
46
+ export function resolveAgentType(options = {}, env = process.env) {
47
+ return optionString(options, 'agentType', 'agent_type')
48
+ || envString(env, ...EXPLICIT_AGENT_TYPE_ENV_KEYS)
49
+ || inferAgentTypeFromEnv(env)
50
+ || DEFAULT_AGENT_TYPE;
51
+ }
19
52
  function normalizeUrl(value) {
20
53
  return value.replace(/\/+$/, '');
21
54
  }
@@ -50,8 +83,8 @@ function formatAuthStatus(status) {
50
83
  if (!status.loggedIn) {
51
84
  return [
52
85
  'Not logged in.',
53
- 'Run: weaver-work-cli auth login --base-url <url>',
54
- 'Or: weaver-work-cli auth set --eteamsid <id> --base-url <url>',
86
+ 'Run: weaver-work-cli auth login --base-url <url> --agent_type <agent_type>',
87
+ 'Or: weaver-work-cli auth set --eteamsid <id> --base-url <url> --agent_type <agent_type>',
55
88
  ].join('\n');
56
89
  }
57
90
  const lines = [
@@ -93,9 +126,27 @@ async function clearInvoiceTokenCache(profile, authData) {
93
126
  userId: authData.userId,
94
127
  }).catch(() => false);
95
128
  }
96
- function shellQuote(value) {
129
+ function posixShellQuote(value) {
97
130
  return `'${value.replace(/'/g, "'\\''")}'`;
98
131
  }
132
+ function powershellQuote(value) {
133
+ return `'${value.replace(/'/g, "''")}'`;
134
+ }
135
+ function resolveWeaverEnvShell(shell, platform = process.platform) {
136
+ if (shell === 'auto')
137
+ return platform === 'win32' ? 'powershell' : 'posix';
138
+ if (shell === 'posix' || shell === 'powershell')
139
+ return shell;
140
+ throw new CliError('Invalid --shell value. Use auto, posix, or powershell.', ExitCode.UsageError);
141
+ }
142
+ export function formatWeaverEnvExports(value, shell = 'auto', platform = process.platform) {
143
+ const resolved = resolveWeaverEnvShell(shell, platform);
144
+ return Object.entries(value)
145
+ .map(([name, envValue]) => resolved === 'powershell'
146
+ ? `$env:${name} = ${powershellQuote(envValue)}`
147
+ : `export ${name}=${posixShellQuote(envValue)}`)
148
+ .join('\n');
149
+ }
99
150
  function esc(value) {
100
151
  return String(value ?? '')
101
152
  .replace(/&/g, '&amp;')
@@ -104,18 +155,32 @@ function esc(value) {
104
155
  .replace(/"/g, '&quot;')
105
156
  .replace(/'/g, '&#39;');
106
157
  }
158
+ export function resolveBrowserOpenCommand(url, platform = process.platform) {
159
+ if (platform === 'win32') {
160
+ return { file: 'rundll32.exe', args: ['url.dll,FileProtocolHandler', url] };
161
+ }
162
+ if (platform === 'darwin')
163
+ return { file: 'open', args: [url] };
164
+ return { file: 'xdg-open', args: [url] };
165
+ }
107
166
  function openUrlInBrowser(url, ctx) {
108
- const command = process.platform === 'win32'
109
- ? { file: 'cmd', args: ['/c', 'start', '', url] }
110
- : process.platform === 'darwin'
111
- ? { file: 'open', args: [url] }
112
- : { file: 'xdg-open', args: [url] };
167
+ const command = resolveBrowserOpenCommand(url);
113
168
  execFile(command.file, command.args, (error) => {
114
169
  if (error) {
115
170
  ctx.logger.warn('Could not open browser automatically. Copy the login URL manually.');
116
171
  }
117
172
  });
118
173
  }
174
+ export function buildE10AuthorizeUrl(baseUrl, redirectUri, agentType) {
175
+ const authorizeParams = new URLSearchParams({
176
+ redirect_uri: redirectUri,
177
+ response_type: 'code',
178
+ access_type: 'agent',
179
+ agent_type: agentType,
180
+ from: agentType,
181
+ });
182
+ return `${baseUrl}/papi/sso/oauth2.0/authorize?${authorizeParams.toString()}`;
183
+ }
119
184
  async function readJsonObject(resp) {
120
185
  const data = await resp.json().catch(() => ({}));
121
186
  return data && typeof data === 'object' && !Array.isArray(data) ? data : {};
@@ -136,6 +201,69 @@ async function resolveUserInfo(baseUrl, eteamsId, rawCookie = '', agentType = ''
136
201
  const data = await resp.json().catch(() => ({}));
137
202
  return readTeamsCheckUserInfo(resp, data);
138
203
  }
204
+ async function saveEteamsIdLogin(input) {
205
+ const baseUrl = normalizeUrl(input.baseUrl);
206
+ const passportUrl = normalizeUrl(input.passportUrl || baseUrl);
207
+ const userInfo = await resolveUserInfo(baseUrl, input.eteamsId, input.rawCookie || '', input.agentType);
208
+ if (!userInfo.userId) {
209
+ throw new CliError('Could not resolve userId. Check whether ETEAMSID is valid for this E10 domain.', ExitCode.AuthError);
210
+ }
211
+ const tenantKey = userInfo.tenantKey || input.tenantKeyFallback;
212
+ const profile = input.profileHint || profileNameFromUrl(baseUrl);
213
+ setActiveProfile(profile);
214
+ const cookies = { ETEAMSID: input.eteamsId };
215
+ if (input.rawCookie)
216
+ cookies.raw = input.rawCookie;
217
+ const authData = {
218
+ cookies,
219
+ userId: userInfo.userId,
220
+ tenantKey,
221
+ tenantName: userInfo.tenantName,
222
+ department: userInfo.department,
223
+ subcompany: userInfo.subcompany,
224
+ position: userInfo.position,
225
+ agentType: input.agentType,
226
+ version: input.version || '',
227
+ baseUrl,
228
+ passportUrl,
229
+ cookieSavedAt: Date.now(),
230
+ };
231
+ await clearInvoiceTokenCache(profile, authData);
232
+ const authFile = saveAuthFile(authData, profile);
233
+ saveProfileConfig(baseUrl, passportUrl, profile, tenantKey);
234
+ return {
235
+ ...userInfo,
236
+ tenantKey,
237
+ eteamsId: input.eteamsId,
238
+ baseUrl,
239
+ passportUrl,
240
+ profile,
241
+ authFile,
242
+ agentType: input.agentType,
243
+ version: input.version || '',
244
+ };
245
+ }
246
+ async function tryXiaoEUnifiedLogin(ctx, baseUrl, tenantKeyFallback, profileHint) {
247
+ const credential = resolveXiaoEUnifiedLoginCredential(baseUrl, ctx.env);
248
+ if (!credential)
249
+ return null;
250
+ ctx.logger.info('Detected XiaoE unified login for this E10 domain. Trying XiaoE auth...');
251
+ try {
252
+ return await saveEteamsIdLogin({
253
+ baseUrl,
254
+ passportUrl: baseUrl,
255
+ eteamsId: credential.eteamsId,
256
+ tenantKeyFallback,
257
+ agentType: XIAOE_AGENT_TYPE,
258
+ profileHint,
259
+ });
260
+ }
261
+ catch (error) {
262
+ const message = error instanceof Error ? error.message : String(error);
263
+ ctx.logger.warn('XiaoE unified login failed; falling back to browser OAuth. ' + message);
264
+ return null;
265
+ }
266
+ }
139
267
  async function oidcExchange(code, redirectUri, baseUrl, tenantKeyFallback, agentTypeFallback, profileHint) {
140
268
  const base = normalizeUrl(baseUrl);
141
269
  const tokenParams = new URLSearchParams({
@@ -235,25 +363,27 @@ async function runBrowserLogin(ctx, options) {
235
363
  const globalOptions = ctx.getGlobalOptions();
236
364
  const profileFromGlobal = globalOptions.profile;
237
365
  const cfg = readProfileConfig(profileFromGlobal || getActiveProfile());
238
- const baseUrl = normalizeUrl(optionString(commandOpts, 'baseUrl') || globalOptions.baseUrl || cfg.baseUrl || '');
366
+ const explicitBaseUrl = optionString(commandOpts, 'baseUrl') || globalOptions.baseUrl || '';
367
+ const baseUrl = resolveXiaoEPreferredBaseUrl({
368
+ explicitBaseUrl,
369
+ profileBaseUrl: cfg.baseUrl,
370
+ env: ctx.env,
371
+ });
239
372
  const tenantKey = optionString(commandOpts, 'tenantKey');
240
373
  const portText = optionString(commandOpts, 'port') || '19800';
241
374
  const port = Number.parseInt(portText, 10);
242
375
  const explicitAgentType = optionString(commandOpts, 'agentType', 'agent_type');
243
- const agentType = explicitAgentType || DEFAULT_AGENT_TYPE;
376
+ const agentType = resolveAgentType(commandOpts, ctx.env);
244
377
  if (!baseUrl)
245
378
  throw new CliError('Missing --base-url', ExitCode.UsageError);
246
379
  if (!Number.isInteger(port) || port <= 0 || port > 65535) {
247
380
  throw new CliError('Invalid --port value', ExitCode.UsageError);
248
381
  }
382
+ const xiaoEResult = await tryXiaoEUnifiedLogin(ctx, baseUrl, tenantKey, profileFromGlobal);
383
+ if (xiaoEResult)
384
+ return xiaoEResult;
249
385
  const redirectUri = `http://127.0.0.1:${port}/callback`;
250
- const authorizeParams = new URLSearchParams({
251
- redirect_uri: redirectUri,
252
- response_type: 'code',
253
- access_type: 'agent',
254
- agent_type: agentType,
255
- });
256
- const loginUrl = `${baseUrl}/papi/sso/oauth2.0/authorize?${authorizeParams.toString()}`;
386
+ const loginUrl = buildE10AuthorizeUrl(baseUrl, redirectUri, agentType);
257
387
  ctx.logger.info('Open browser login: ' + loginUrl);
258
388
  ctx.logger.info('Waiting for E10 authorization callback...');
259
389
  return await new Promise((resolve, reject) => {
@@ -290,6 +420,7 @@ async function runBrowserLogin(ctx, options) {
290
420
  const redirectAgentType = explicitAgentType
291
421
  || callbackUrl.searchParams.get('agent_type')
292
422
  || callbackUrl.searchParams.get('agentType')
423
+ || callbackUrl.searchParams.get('from')
293
424
  || agentType;
294
425
  if (error) {
295
426
  const message = callbackUrl.searchParams.get('error_description') || error;
@@ -439,51 +570,26 @@ export function registerE10AuthCommands(parent, action) {
439
570
  const baseUrl = normalizeUrl(optionString(commandOpts, 'baseUrl') || globalOptions.baseUrl || cfg.baseUrl || '');
440
571
  const passportUrl = normalizeUrl(optionString(commandOpts, 'passportUrl') || globalOptions.passportUrl || cfg.passportUrl || baseUrl);
441
572
  const tenantKeyFallback = optionString(commandOpts, 'tenantKey');
442
- const agentType = optionString(commandOpts, 'agentType', 'agent_type');
573
+ const agentType = resolveAgentType(commandOpts, ctx.env);
443
574
  const eteamsId = optionString(commandOpts, 'eteamsid');
444
575
  if (!baseUrl)
445
576
  throw new CliError('Missing --base-url', ExitCode.UsageError);
446
577
  if (!eteamsId)
447
578
  throw new CliError('Missing --eteamsid', ExitCode.UsageError);
448
579
  ctx.logger.info('Resolving E10 user information...');
449
- const userInfo = await resolveUserInfo(baseUrl, eteamsId, '', agentType);
450
- if (!userInfo.userId) {
451
- throw new CliError('Could not resolve userId. Check whether ETEAMSID is valid.', ExitCode.AuthError);
452
- }
453
- const tenantKey = userInfo.tenantKey || tenantKeyFallback;
454
- const profile = profileFromGlobal || profileNameFromUrl(baseUrl);
455
- setActiveProfile(profile);
456
- const authData = {
457
- cookies: { ETEAMSID: eteamsId },
458
- userId: userInfo.userId,
459
- tenantKey,
460
- tenantName: userInfo.tenantName,
461
- department: userInfo.department,
462
- subcompany: userInfo.subcompany,
463
- position: userInfo.position,
464
- agentType,
580
+ const result = await saveEteamsIdLogin({
465
581
  baseUrl,
466
582
  passportUrl,
467
- cookieSavedAt: Date.now(),
468
- };
469
- await clearInvoiceTokenCache(profile, authData);
470
- const authFile = saveAuthFile(authData, profile);
471
- saveProfileConfig(baseUrl, passportUrl, profile, tenantKey);
472
- const result = {
473
- ...userInfo,
474
- tenantKey,
475
583
  eteamsId,
476
- baseUrl,
477
- passportUrl,
478
- profile,
479
- authFile,
584
+ tenantKeyFallback,
480
585
  agentType,
481
- version: '',
482
- };
586
+ profileHint: profileFromGlobal,
587
+ });
483
588
  ctx.output.write(result, { text: formatLoginResult(result) });
484
589
  }));
485
590
  registerBrowserLoginCommand(auth, action, 'login', 'Open browser OAuth2.0 login and save E10 auth');
486
591
  registerBrowserLoginCommand(auth, action, 'oidc', 'Alias of auth login for OAuth2.0 browser login');
592
+ registerBrowserLoginCommand(auth, action, 'xiaoe', 'Try XiaoE unified login before browser OAuth2.0 login');
487
593
  auth.command('logout')
488
594
  .alias('clear')
489
595
  .description('Clear saved E10 auth for the current or selected profile')
@@ -558,7 +664,9 @@ export function registerE10AuthCommands(parent, action) {
558
664
  }));
559
665
  auth.command('export-weaver-env')
560
666
  .description('Print WEAVER_* shell exports for the active E10 auth')
561
- .action(action(async (ctx) => {
667
+ .option('--shell <shell>', 'Shell syntax: auto, posix, or powershell', 'auto')
668
+ .action(action(async (ctx, options) => {
669
+ const commandOpts = asOptions(options);
562
670
  const session = await E10AuthSession.fromOptions(ctx.getGlobalOptions(), ctx.cwd);
563
671
  if (!session)
564
672
  throw new CliError('E10 auth not found.', ExitCode.AuthError);
@@ -573,11 +681,8 @@ export function registerE10AuthCommands(parent, action) {
573
681
  ctx.output.write(value);
574
682
  return;
575
683
  }
576
- ctx.output.raw(`export WEAVER_BASE_URL=${shellQuote(value.WEAVER_BASE_URL)}`);
577
- ctx.output.raw(`export WEAVER_ETEAMSID=${shellQuote(value.WEAVER_ETEAMSID)}`);
578
- ctx.output.raw(`export WEAVER_COOKIE=${shellQuote(value.WEAVER_COOKIE)}`);
579
- ctx.output.raw(`export WEAVER_USER_AGENT=${shellQuote(value.WEAVER_USER_AGENT)}`);
580
- ctx.output.raw(`export WEAVER_AGENT_TYPE=${shellQuote(value.WEAVER_AGENT_TYPE)}`);
684
+ const shell = optionString(commandOpts, 'shell') || 'auto';
685
+ ctx.output.raw(formatWeaverEnvExports(value, shell));
581
686
  }));
582
687
  const profile = auth.command('profile').description('Manage E10 profiles');
583
688
  profile.command('list')
@@ -0,0 +1,268 @@
1
+ import { CliError, ExitCode } from '../../../core/errors.js';
2
+ import { buildE10CookieHeader, E10AuthSession, profileNameFromUrl, readTeamsCheckUserInfo, saveAuthFile, saveProfileConfig, setActiveProfile, } from './session.js';
3
+ export const DEFAULT_E10_BASE_URL = 'https://www.e-cology.com.cn';
4
+ export const XIAOE_AGENT_TYPE = 'Xiao.E';
5
+ const XIAOE_UNIFIED_LOGIN_MAP_ENV_KEYS = [
6
+ 'XIAOE_E10_AUTH_MAP',
7
+ 'XIAOE_E10_DOMAIN_ETEAMSID_MAP',
8
+ 'XIAOE_DOMAIN_ETEAMSID_MAP',
9
+ 'XIAOE_UNIFIED_LOGIN_MAP',
10
+ ];
11
+ const XIAOE_SINGLE_DOMAIN_ENV_KEYS = [
12
+ 'XIAOE_DOMAIN',
13
+ 'XIAOE_E10_DOMAIN',
14
+ 'XIAOE_BASE_URL',
15
+ 'XIAOE_E10_BASE_URL',
16
+ ];
17
+ const XIAOE_DEFAULT_DOMAIN_ENV_KEYS = [
18
+ 'XIAOE_DEFAULT_DOMAIN',
19
+ 'XIAOE_DEFAULT_BASE_URL',
20
+ 'XIAOE_E10_DEFAULT_DOMAIN',
21
+ 'XIAOE_E10_DEFAULT_BASE_URL',
22
+ ];
23
+ const XIAOE_SINGLE_ETEAMSID_ENV_KEYS = [
24
+ 'XIAOE_ETEAMSID',
25
+ 'XIAOE_ETEAM_ID',
26
+ 'XIAOE_ETEAMID',
27
+ 'XIAOE_E10_ETEAMSID',
28
+ 'XIAOE_E10_ETEAM_ID',
29
+ ];
30
+ function envString(env, ...keys) {
31
+ for (const key of keys) {
32
+ const value = env[key];
33
+ if (typeof value === 'string' && value.trim())
34
+ return value.trim();
35
+ }
36
+ return '';
37
+ }
38
+ function hasEnvPrefix(env, prefix) {
39
+ return Object.keys(env).some((key) => key === prefix || key.startsWith(`${prefix}_`));
40
+ }
41
+ export function hasXiaoEEnv(env = process.env) {
42
+ return hasEnvPrefix(env, 'XIAOE');
43
+ }
44
+ function normalizeUrl(value) {
45
+ return value.replace(/\/+$/, '');
46
+ }
47
+ function readString(data, ...keys) {
48
+ for (const key of keys) {
49
+ const value = data[key];
50
+ if (typeof value === 'string' && value)
51
+ return value;
52
+ if (typeof value === 'number')
53
+ return String(value);
54
+ }
55
+ return '';
56
+ }
57
+ function normalizeDomainKey(value) {
58
+ const raw = normalizeUrl(value.trim());
59
+ if (!raw)
60
+ return null;
61
+ try {
62
+ const url = new URL(raw.includes('://') ? raw : `https://${raw}`);
63
+ return {
64
+ raw: raw.toLowerCase(),
65
+ origin: normalizeUrl(url.origin).toLowerCase(),
66
+ host: url.hostname.toLowerCase(),
67
+ };
68
+ }
69
+ catch {
70
+ return {
71
+ raw: raw.toLowerCase(),
72
+ origin: raw.toLowerCase(),
73
+ host: '',
74
+ };
75
+ }
76
+ }
77
+ function domainMatches(baseUrl, candidate) {
78
+ const base = normalizeDomainKey(baseUrl);
79
+ const target = normalizeDomainKey(candidate);
80
+ if (!base || !target)
81
+ return false;
82
+ return base.origin === target.origin
83
+ || base.raw === target.raw
84
+ || Boolean(base.host && target.host && base.host === target.host);
85
+ }
86
+ function readXiaoECredentialRecord(value, source, fallbackBaseUrl = '') {
87
+ const baseUrl = readString(value, 'domain', 'baseUrl', 'base_url', 'url', 'host') || fallbackBaseUrl;
88
+ const eteamsId = readString(value, 'eteamsId', 'eteamsid', 'ETEAMSID', 'eteamId', 'eteam_id', 'eTeamId');
89
+ if (!baseUrl || !eteamsId)
90
+ return null;
91
+ return { baseUrl: normalizeUrl(baseUrl), eteamsId, source };
92
+ }
93
+ function parseXiaoEUnifiedLoginMap(raw, source) {
94
+ const value = raw.trim();
95
+ if (!value)
96
+ return [];
97
+ try {
98
+ const parsed = JSON.parse(value);
99
+ if (Array.isArray(parsed)) {
100
+ return parsed
101
+ .map((entry) => entry && typeof entry === 'object' && !Array.isArray(entry)
102
+ ? readXiaoECredentialRecord(entry, source)
103
+ : null)
104
+ .filter((entry) => Boolean(entry));
105
+ }
106
+ if (parsed && typeof parsed === 'object') {
107
+ const record = parsed;
108
+ const direct = readXiaoECredentialRecord(record, source);
109
+ if (direct)
110
+ return [direct];
111
+ return Object.entries(record)
112
+ .map(([baseUrl, entry]) => {
113
+ if (typeof entry === 'string' || typeof entry === 'number') {
114
+ return { baseUrl: normalizeUrl(baseUrl), eteamsId: String(entry), source };
115
+ }
116
+ if (entry && typeof entry === 'object' && !Array.isArray(entry)) {
117
+ return readXiaoECredentialRecord(entry, source, baseUrl);
118
+ }
119
+ return null;
120
+ })
121
+ .filter((entry) => Boolean(entry));
122
+ }
123
+ }
124
+ catch {
125
+ // Fall through to compact text formats.
126
+ }
127
+ return value
128
+ .split(/[;,\n]+/u)
129
+ .map((entry) => entry.trim())
130
+ .filter(Boolean)
131
+ .map((entry) => {
132
+ const delimiter = entry.includes('|') ? '|' : entry.includes('=') ? '=' : '';
133
+ if (delimiter) {
134
+ const index = entry.indexOf(delimiter);
135
+ const baseUrl = entry.slice(0, index).trim();
136
+ const eteamsId = entry.slice(index + delimiter.length).trim();
137
+ return baseUrl && eteamsId ? { baseUrl: normalizeUrl(baseUrl), eteamsId, source } : null;
138
+ }
139
+ const parts = entry.split(/\s+/u).filter(Boolean);
140
+ return parts.length === 2 ? { baseUrl: normalizeUrl(parts[0]), eteamsId: parts[1], source } : null;
141
+ })
142
+ .filter((entry) => Boolean(entry));
143
+ }
144
+ function listXiaoEUnifiedLoginCredentials(env = process.env) {
145
+ const candidates = [];
146
+ for (const key of XIAOE_UNIFIED_LOGIN_MAP_ENV_KEYS) {
147
+ const raw = envString(env, key);
148
+ if (raw)
149
+ candidates.push(...parseXiaoEUnifiedLoginMap(raw, key));
150
+ }
151
+ const singleDomain = envString(env, ...XIAOE_SINGLE_DOMAIN_ENV_KEYS);
152
+ const singleEteamsId = envString(env, ...XIAOE_SINGLE_ETEAMSID_ENV_KEYS);
153
+ if (singleDomain && singleEteamsId) {
154
+ candidates.push({
155
+ baseUrl: normalizeUrl(singleDomain),
156
+ eteamsId: singleEteamsId,
157
+ source: `${XIAOE_SINGLE_DOMAIN_ENV_KEYS[0]}+${XIAOE_SINGLE_ETEAMSID_ENV_KEYS[0]}`,
158
+ });
159
+ }
160
+ return candidates;
161
+ }
162
+ export function resolveXiaoEUnifiedLoginCredential(baseUrl, env = process.env) {
163
+ const candidates = listXiaoEUnifiedLoginCredentials(env);
164
+ return candidates.find((candidate) => domainMatches(baseUrl, candidate.baseUrl)) || null;
165
+ }
166
+ export function resolveXiaoEDefaultBaseUrl(env = process.env) {
167
+ const explicitDefault = envString(env, ...XIAOE_DEFAULT_DOMAIN_ENV_KEYS);
168
+ if (explicitDefault)
169
+ return normalizeUrl(explicitDefault);
170
+ const firstCredential = listXiaoEUnifiedLoginCredentials(env)[0];
171
+ if (firstCredential?.baseUrl)
172
+ return normalizeUrl(firstCredential.baseUrl);
173
+ return hasXiaoEEnv(env) ? DEFAULT_E10_BASE_URL : '';
174
+ }
175
+ export function resolveXiaoEPreferredBaseUrl(options) {
176
+ const env = options.env || process.env;
177
+ const explicit = normalizeUrl(options.explicitBaseUrl || '');
178
+ if (explicit)
179
+ return explicit;
180
+ const xiaoEDefault = resolveXiaoEDefaultBaseUrl(env);
181
+ if (hasXiaoEEnv(env))
182
+ return xiaoEDefault || normalizeUrl(options.profileBaseUrl || '');
183
+ return normalizeUrl(options.profileBaseUrl || '') || xiaoEDefault;
184
+ }
185
+ async function resolveUserInfo(baseUrl, eteamsId, rawCookie = '', agentType = '') {
186
+ const resp = await fetch(`${baseUrl}/api/baseserver/layout/teamsCheck?clientType=not_xinchuang&client=WEB&domainName=${encodeURIComponent(baseUrl)}`, {
187
+ method: 'POST',
188
+ headers: {
189
+ accept: 'application/json',
190
+ 'content-type': 'application/json',
191
+ eteamsid: eteamsId,
192
+ cookie: buildE10CookieHeader(rawCookie, eteamsId, agentType),
193
+ 'user-agent': agentType ? `AgentType=${agentType},IsAgent=true` : 'weaver-work-cli',
194
+ origin: baseUrl,
195
+ },
196
+ redirect: 'manual',
197
+ });
198
+ const data = await resp.json().catch(() => ({}));
199
+ return readTeamsCheckUserInfo(resp, data);
200
+ }
201
+ async function saveXiaoEUnifiedLogin(input) {
202
+ const baseUrl = normalizeUrl(input.baseUrl);
203
+ const userInfo = await resolveUserInfo(baseUrl, input.eteamsId, '', XIAOE_AGENT_TYPE);
204
+ if (!userInfo.userId) {
205
+ throw new CliError('Could not resolve userId. Check whether XiaoE unified login is valid for this E10 domain.', ExitCode.AuthError);
206
+ }
207
+ const tenantKey = userInfo.tenantKey || input.tenantKeyFallback || '';
208
+ const profile = input.profileHint || profileNameFromUrl(baseUrl);
209
+ setActiveProfile(profile);
210
+ const authData = {
211
+ cookies: { ETEAMSID: input.eteamsId },
212
+ userId: userInfo.userId,
213
+ tenantKey,
214
+ tenantName: userInfo.tenantName,
215
+ department: userInfo.department,
216
+ subcompany: userInfo.subcompany,
217
+ position: userInfo.position,
218
+ agentType: XIAOE_AGENT_TYPE,
219
+ version: '',
220
+ baseUrl,
221
+ passportUrl: baseUrl,
222
+ cookieSavedAt: Date.now(),
223
+ loginSource: 'xiaoe-unified',
224
+ };
225
+ const authFile = saveAuthFile(authData, profile);
226
+ saveProfileConfig(baseUrl, baseUrl, profile, tenantKey);
227
+ const session = new E10AuthSession(authData, authFile);
228
+ return {
229
+ session,
230
+ result: {
231
+ ...userInfo,
232
+ tenantKey,
233
+ eteamsId: input.eteamsId,
234
+ baseUrl,
235
+ passportUrl: baseUrl,
236
+ profile,
237
+ authFile,
238
+ agentType: XIAOE_AGENT_TYPE,
239
+ version: '',
240
+ },
241
+ };
242
+ }
243
+ export async function tryXiaoEUnifiedLogin(options = {}) {
244
+ const env = options.env || process.env;
245
+ const baseUrl = resolveXiaoEPreferredBaseUrl({
246
+ explicitBaseUrl: options.baseUrl,
247
+ env,
248
+ });
249
+ if (!baseUrl)
250
+ return null;
251
+ const credential = resolveXiaoEUnifiedLoginCredential(baseUrl, env);
252
+ if (!credential)
253
+ return null;
254
+ options.logger?.info('Detected XiaoE unified login for this E10 domain. Trying XiaoE auth...');
255
+ try {
256
+ return await saveXiaoEUnifiedLogin({
257
+ baseUrl,
258
+ eteamsId: credential.eteamsId,
259
+ tenantKeyFallback: options.tenantKeyFallback,
260
+ profileHint: options.profileHint,
261
+ });
262
+ }
263
+ catch (error) {
264
+ const message = error instanceof Error ? error.message : String(error);
265
+ options.logger?.warn('XiaoE unified login failed; falling back to standard E10 auth. ' + message);
266
+ return null;
267
+ }
268
+ }
@@ -1,13 +1,27 @@
1
1
  import { CliError, ExitCode } from '../../core/errors.js';
2
2
  import { E10AuthSession } from './auth/session.js';
3
+ import { hasXiaoEEnv, tryXiaoEUnifiedLogin } from './auth/xiaoe.js';
3
4
  import { E10ApiClient } from './client.js';
5
+ function shouldPreferXiaoEUnifiedLogin(options, env) {
6
+ return hasXiaoEEnv(env) && !options.auth && !options.profile;
7
+ }
4
8
  export async function getE10Session(ctx) {
5
- return E10AuthSession.fromOptions(ctx.getGlobalOptions(), ctx.cwd);
9
+ const options = ctx.getGlobalOptions();
10
+ if (shouldPreferXiaoEUnifiedLogin(options, ctx.env)) {
11
+ const xiaoELogin = await tryXiaoEUnifiedLogin({
12
+ env: ctx.env,
13
+ baseUrl: options.baseUrl,
14
+ logger: ctx.logger,
15
+ });
16
+ if (xiaoELogin)
17
+ return xiaoELogin.session;
18
+ }
19
+ return E10AuthSession.fromOptions(options, ctx.cwd);
6
20
  }
7
21
  export async function requireE10Session(ctx) {
8
22
  const session = await getE10Session(ctx);
9
23
  if (!session) {
10
- throw new CliError('E10 auth not found. Ask the user for the E10 login domain (base URL), then run: weaver-work-cli auth login --base-url <url>.', ExitCode.AuthError);
24
+ throw new CliError('E10 auth not found. In XiaoE, run weaver-work-cli auth xiaoe first; if unified login is unavailable, ask the user for the E10 login domain (base URL), then run: weaver-work-cli auth login --base-url <url> --agent_type <agent_type>.', ExitCode.AuthError);
11
25
  }
12
26
  return session;
13
27
  }
@@ -1,2 +1,3 @@
1
1
  export { E10ApiClient } from './client.js';
2
2
  export { getE10Client, getE10Session, requireE10Client, requireE10Session } from './context.js';
3
+ export { E10ApiError, E10RequestRuntime, createE10RequestRuntime } from './request-runtime.js';