@wirecat/bitrix24-cli 0.3.0 → 0.5.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 (255) hide show
  1. package/CHANGELOG.md +130 -0
  2. package/README.md +84 -9
  3. package/dist/api-keys.d.ts +36 -9
  4. package/dist/api-keys.d.ts.map +1 -1
  5. package/dist/api-keys.js +139 -19
  6. package/dist/api-keys.js.map +1 -1
  7. package/dist/bin/b24.js +2 -2
  8. package/dist/bitrix/errors.js +1 -1
  9. package/dist/bitrix/errors.js.map +1 -1
  10. package/dist/bitrix/methods.d.ts.map +1 -1
  11. package/dist/bitrix/methods.js +7 -3
  12. package/dist/bitrix/methods.js.map +1 -1
  13. package/dist/bitrix/transport.d.ts +4 -7
  14. package/dist/bitrix/transport.d.ts.map +1 -1
  15. package/dist/bitrix/transport.js +29 -19
  16. package/dist/bitrix/transport.js.map +1 -1
  17. package/dist/body.d.ts +14 -0
  18. package/dist/body.d.ts.map +1 -0
  19. package/dist/body.js +44 -0
  20. package/dist/body.js.map +1 -0
  21. package/dist/bundle/{chunk-QIPTIUMJ.js → all-profiles-CANIDIDS.js} +12 -7
  22. package/dist/bundle/{anthropic-RHRAVHC2.js → anthropic-JUJB4DCF.js} +5 -5
  23. package/dist/bundle/{app-server-QIT6S7AZ.js → app-server-3V5Z4PTK.js} +68 -54
  24. package/dist/bundle/b24.js +18 -12
  25. package/dist/bundle/{bun-H6RSODZ3.js → bun-LKMV5TY7.js} +2 -2
  26. package/dist/bundle/{bun-sqlite-BO4LTQHX.js → bun-sqlite-S56EF74S.js} +3 -3
  27. package/dist/bundle/{chunk-D5S6QV6R.js → chunk-2I4KWS3H.js} +6 -6
  28. package/dist/bundle/chunk-36PO5NWY.js +147 -0
  29. package/dist/bundle/{chunk-ZIAQPTUS.js → chunk-42F7Q7V6.js} +3 -3
  30. package/dist/bundle/{chunk-6WY72XVQ.js → chunk-4D3K6GZW.js} +18 -4
  31. package/dist/bundle/chunk-5D4MJQ6X.js +22 -0
  32. package/dist/bundle/chunk-5JOPERVF.js +84 -0
  33. package/dist/bundle/chunk-6A4UPWDC.js +15 -0
  34. package/dist/bundle/{chunk-P33NDCDI.js → chunk-6MGWIZG4.js} +1 -1
  35. package/dist/bundle/{chunk-ZDQQCXFG.js → chunk-6YJTNZ7U.js} +13 -13
  36. package/dist/bundle/{chunk-MBDK4YXG.js → chunk-7FBFJ6B4.js} +4 -2
  37. package/dist/bundle/chunk-7VCMOTQP.js +55 -0
  38. package/dist/bundle/{chunk-P364PLIK.js → chunk-A5IMMGYU.js} +36 -34
  39. package/dist/bundle/{chunk-45AKJVKV.js → chunk-ASEHTBNK.js} +1 -1
  40. package/dist/bundle/{chunk-HGL63O5V.js → chunk-B6LPJYPQ.js} +2 -2
  41. package/dist/bundle/{chunk-LSPIOT6Z.js → chunk-BHEE2K6C.js} +7 -7
  42. package/dist/bundle/chunk-BYZQBE63.js +971 -0
  43. package/dist/bundle/{program-H3TGGRQ6.js → chunk-COKGNTDQ.js} +15761 -16685
  44. package/dist/bundle/{chunk-XJXONOB5.js → chunk-DVFYRQGE.js} +1 -1
  45. package/dist/bundle/{chunk-FLUEXJ4X.js → chunk-DVSIBZ3G.js} +1 -1
  46. package/dist/bundle/chunk-EJEIXC6Y.js +273 -0
  47. package/dist/bundle/chunk-EYTGCM44.js +130 -0
  48. package/dist/bundle/{chunk-IRV2PCQ2.js → chunk-EYYOKT23.js} +26 -26
  49. package/dist/bundle/{chunk-PH5FZX6E.js → chunk-FCWPIWSR.js} +2 -2
  50. package/dist/bundle/{chunk-YZ5LHE5Q.js → chunk-FSWRMQWX.js} +2 -2
  51. package/dist/bundle/{chunk-ADLS6FVG.js → chunk-FXBHOCJK.js} +1 -1
  52. package/dist/bundle/chunk-G5MW6RCM.js +723 -0
  53. package/dist/bundle/{chunk-VEWWAGTD.js → chunk-GLTKRLFT.js} +8 -8
  54. package/dist/bundle/chunk-GUUZQ7NE.js +581 -0
  55. package/dist/bundle/{chunk-QSNROIJL.js → chunk-H6RIPOOI.js} +42 -9
  56. package/dist/bundle/{chunk-H2ADPPSH.js → chunk-HGFNC4CR.js} +1819 -597
  57. package/dist/bundle/{chunk-7GRZAKBB.js → chunk-IERYD2N2.js} +6 -6
  58. package/dist/bundle/{chunk-N6FLBXZS.js → chunk-IGCLMEMB.js} +3 -3
  59. package/dist/bundle/{chunk-U5ACMCAQ.js → chunk-J7WCSZ2Q.js} +411 -919
  60. package/dist/bundle/{chunk-W5YAO5G5.js → chunk-JZYHQ4HB.js} +9 -4
  61. package/dist/bundle/{chunk-EVYSBZ3I.js → chunk-K4QM3X5F.js} +4 -4
  62. package/dist/bundle/{chunk-DTXERR44.js → chunk-KFSMY7SZ.js} +2 -2
  63. package/dist/bundle/{chunk-LRGYKOCP.js → chunk-KPEDH5T4.js} +1 -1
  64. package/dist/bundle/{chunk-XRFJWHY5.js → chunk-KUY7LII2.js} +4 -4
  65. package/dist/bundle/{chunk-QC53QBNC.js → chunk-LFXDHLFR.js} +3 -3
  66. package/dist/bundle/{chunk-CNNEA2M4.js → chunk-LGLT4JB6.js} +3 -3
  67. package/dist/bundle/{chunk-QGMDQ2PM.js → chunk-LM4OOBAW.js} +3 -3
  68. package/dist/bundle/chunk-M74BSKMA.js +234 -0
  69. package/dist/bundle/{chunk-2KCZ7BKW.js → chunk-MMMT6ORT.js} +11 -11
  70. package/dist/bundle/{chunk-WII44RXN.js → chunk-NGYD6QTE.js} +2 -2
  71. package/dist/bundle/{chunk-FOTREPNS.js → chunk-NO6QOPVT.js} +10 -19
  72. package/dist/bundle/chunk-O6XC7DZI.js +804 -0
  73. package/dist/bundle/chunk-OE3NFB53.js +64 -0
  74. package/dist/bundle/{chunk-XD4FRDSL.js → chunk-OUMFNB34.js} +13 -149
  75. package/dist/bundle/{chunk-ZGZT5S6B.js → chunk-P2RQTNVJ.js} +806 -850
  76. package/dist/bundle/{chunk-RRJNNPR4.js → chunk-PBIBGIZ7.js} +1 -1
  77. package/dist/bundle/{chunk-EXOOKUEA.js → chunk-Q6VQHTRW.js} +2 -2
  78. package/dist/bundle/{chunk-TE3FR6MI.js → chunk-QHBCNVUG.js} +5 -5
  79. package/dist/bundle/{chunk-SGRYYE4X.js → chunk-QNOXAQ6Y.js} +4 -4
  80. package/dist/bundle/{chunk-QQXH2OPB.js → chunk-R5F2O5GX.js} +15 -272
  81. package/dist/bundle/{chunk-SFRNX2TI.js → chunk-R5PBSKJL.js} +1 -1
  82. package/dist/bundle/{chunk-OTD2ZRXD.js → chunk-RS2BARUU.js} +4 -4
  83. package/dist/bundle/chunk-TG3DSPT5.js +14 -0
  84. package/dist/bundle/{chunk-BCF7P4FZ.js → chunk-U22JMKUO.js} +6 -125
  85. package/dist/bundle/chunk-U66Q5TVK.js +106 -0
  86. package/dist/bundle/{chunk-QMPN6WKD.js → chunk-UCHMQWON.js} +211 -89
  87. package/dist/bundle/{chunk-POC3V3AO.js → chunk-VMJS7FJZ.js} +526 -467
  88. package/dist/bundle/{chunk-FZL7F5NR.js → chunk-VMVAQHDC.js} +77 -615
  89. package/dist/bundle/{chunk-K3UIB6ZF.js → chunk-WWMCJFMT.js} +2 -2
  90. package/dist/bundle/{chunk-CXL33BFL.js → chunk-XTA5TN3H.js} +1 -1
  91. package/dist/bundle/{chunk-WTPMJYMD.js → chunk-XUHHBEA7.js} +652 -131
  92. package/dist/bundle/{chunk-WKRQ44EH.js → chunk-YDZHO4LT.js} +13 -13
  93. package/dist/bundle/{chunk-2SNUMZ7S.js → chunk-ZKINZFIT.js} +6 -6
  94. package/dist/bundle/{chunk-HAXNUIGQ.js → chunk-ZSQXSIFQ.js} +89 -39
  95. package/dist/bundle/{chunk-YYO7D2MO.js → chunk-ZZEHDIEG.js} +58 -54
  96. package/dist/bundle/command-contract-OQV6H7SR.js +36 -0
  97. package/dist/bundle/{decode-5ZPLTYV6.js → decode-QSTBX4MG.js} +3 -3
  98. package/dist/bundle/{echarts-J6LAPIX7.js → echarts-JZELFH2N.js} +2 -2
  99. package/dist/bundle/{embed-YG5LDHME.js → embed-4RIW2LVH.js} +4 -4
  100. package/dist/bundle/{embedder-7FNUA5OZ.js → embedder-SW7DTWSL.js} +7 -7
  101. package/dist/bundle/{first-run-JPZNWIJN.js → first-run-7AISOSOM.js} +8 -8
  102. package/dist/bundle/first-screen-NMHNFZ2B.js +34 -0
  103. package/dist/bundle/{instructions-AXWTQHMR.js → instructions-BZE5YUGG.js} +1 -1
  104. package/dist/bundle/{mcp-7F46P6AM.js → mcp-SDWHDJTY.js} +2 -2
  105. package/dist/bundle/{node-P4E63KXA.js → node-KM3CUABH.js} +9 -9
  106. package/dist/bundle/{node-CWKAIOEM.js → node-LTKZIO4U.js} +2 -2
  107. package/dist/bundle/{node-sqlite-LSEKVRDA.js → node-sqlite-HQ5PN2RH.js} +4 -4
  108. package/dist/bundle/{oauth-THYNLRLD.js → oauth-UH6FOZQL.js} +5 -5
  109. package/dist/bundle/{open-E47QYKFC.js → open-TSUP3XGL.js} +3 -3
  110. package/dist/bundle/{openai-EWSGC3BC.js → openai-GVEE52E3.js} +14 -14
  111. package/dist/bundle/{process-WKTEA3WE.js → process-AGXY76ZE.js} +1 -1
  112. package/dist/bundle/program-BI4A4HFJ.js +2247 -0
  113. package/dist/bundle/{prompt-CAQ7QR3U.js → prompt-NRSUY7FA.js} +3 -3
  114. package/dist/bundle/{recognize-6KGHNZC3.js → recognize-NPDPQ6PJ.js} +2 -2
  115. package/dist/bundle/{remote-3UO2WDC3.js → remote-HFASMVLB.js} +5 -5
  116. package/dist/bundle/{rerank-2JVDPZBX.js → rerank-TL6Z6F7K.js} +5 -5
  117. package/dist/bundle/{chunk-VL6SPMZV.js → serve-VB4DHDZQ.js} +8 -6
  118. package/dist/bundle/server-T5EDRPJI.js +68 -0
  119. package/dist/bundle/{chunk-ZEW4P6AH.js → server-Z6MW6C37.js} +50 -14
  120. package/dist/bundle/source-4IGO5J7E.js +237 -0
  121. package/dist/bundle/sqlite-runtime-YS4POY3W.js +17 -0
  122. package/dist/bundle/{state-7NH5G4XJ.js → state-ISZVVZGR.js} +4 -4
  123. package/dist/bundle/store-IZJBAKJV.js +58 -0
  124. package/dist/bundle/{store-7O4JQD2Z.js → store-L76MSQC3.js} +17 -12
  125. package/dist/bundle/store-PBTIB7BD.js +207 -0
  126. package/dist/bundle/store-maintenance-command-YFKII7TF.js +58 -0
  127. package/dist/bundle/writer-3O5EYMFE.js +214 -0
  128. package/dist/commands/api.d.ts.map +1 -1
  129. package/dist/commands/api.js +81 -30
  130. package/dist/commands/api.js.map +1 -1
  131. package/dist/commands/crm-shared.d.ts +4 -0
  132. package/dist/commands/crm-shared.d.ts.map +1 -0
  133. package/dist/commands/crm-shared.js +94 -0
  134. package/dist/commands/crm-shared.js.map +1 -0
  135. package/dist/commands/crm-writes.d.ts +0 -1
  136. package/dist/commands/crm-writes.d.ts.map +1 -1
  137. package/dist/commands/crm-writes.js +43 -88
  138. package/dist/commands/crm-writes.js.map +1 -1
  139. package/dist/commands/crm.d.ts.map +1 -1
  140. package/dist/commands/crm.js +30 -48
  141. package/dist/commands/crm.js.map +1 -1
  142. package/dist/commands/session.d.ts.map +1 -1
  143. package/dist/commands/session.js +1 -0
  144. package/dist/commands/session.js.map +1 -1
  145. package/dist/commands/write.d.ts +6 -6
  146. package/dist/commands/write.d.ts.map +1 -1
  147. package/dist/commands/write.js +11 -18
  148. package/dist/commands/write.js.map +1 -1
  149. package/dist/config.d.ts +0 -5
  150. package/dist/config.d.ts.map +1 -1
  151. package/dist/config.js +6 -8
  152. package/dist/config.js.map +1 -1
  153. package/dist/crm/capabilities.d.ts +7 -0
  154. package/dist/crm/capabilities.d.ts.map +1 -0
  155. package/dist/crm/capabilities.js +7 -0
  156. package/dist/crm/capabilities.js.map +1 -0
  157. package/dist/crm/conditions.d.ts +1 -1
  158. package/dist/crm/conditions.d.ts.map +1 -1
  159. package/dist/crm/conditions.js +4 -6
  160. package/dist/crm/conditions.js.map +1 -1
  161. package/dist/crm/custom-query.d.ts +19 -0
  162. package/dist/crm/custom-query.d.ts.map +1 -0
  163. package/dist/crm/custom-query.js +79 -0
  164. package/dist/crm/custom-query.js.map +1 -0
  165. package/dist/crm/deal.d.ts +4 -27
  166. package/dist/crm/deal.d.ts.map +1 -1
  167. package/dist/crm/deal.js +15 -48
  168. package/dist/crm/deal.js.map +1 -1
  169. package/dist/crm/fields.d.ts +20 -0
  170. package/dist/crm/fields.d.ts.map +1 -0
  171. package/dist/crm/fields.js +78 -0
  172. package/dist/crm/fields.js.map +1 -0
  173. package/dist/crm/items.d.ts +7 -1
  174. package/dist/crm/items.d.ts.map +1 -1
  175. package/dist/crm/items.js +21 -18
  176. package/dist/crm/items.js.map +1 -1
  177. package/dist/crm/lead.d.ts +5 -36
  178. package/dist/crm/lead.d.ts.map +1 -1
  179. package/dist/crm/lead.js +15 -61
  180. package/dist/crm/lead.js.map +1 -1
  181. package/dist/crm/organization.d.ts +1 -0
  182. package/dist/crm/organization.d.ts.map +1 -1
  183. package/dist/crm/person.d.ts +1 -0
  184. package/dist/crm/person.d.ts.map +1 -1
  185. package/dist/crm/pipelines.d.ts +5 -0
  186. package/dist/crm/pipelines.d.ts.map +1 -0
  187. package/dist/crm/pipelines.js +54 -0
  188. package/dist/crm/pipelines.js.map +1 -0
  189. package/dist/crm/product.d.ts.map +1 -1
  190. package/dist/crm/product.js +2 -2
  191. package/dist/crm/product.js.map +1 -1
  192. package/dist/crm/rest3-fields.d.ts +3 -0
  193. package/dist/crm/rest3-fields.d.ts.map +1 -0
  194. package/dist/crm/rest3-fields.js +38 -0
  195. package/dist/crm/rest3-fields.js.map +1 -0
  196. package/dist/crm/source.d.ts +15 -0
  197. package/dist/crm/source.d.ts.map +1 -0
  198. package/dist/crm/source.js +122 -0
  199. package/dist/crm/source.js.map +1 -0
  200. package/dist/crm/user.d.ts.map +1 -1
  201. package/dist/crm/user.js +2 -2
  202. package/dist/crm/user.js.map +1 -1
  203. package/dist/crm/values.d.ts +26 -5
  204. package/dist/crm/values.d.ts.map +1 -1
  205. package/dist/crm/values.js +40 -5
  206. package/dist/crm/values.js.map +1 -1
  207. package/dist/crm/writer.d.ts +9 -0
  208. package/dist/crm/writer.d.ts.map +1 -0
  209. package/dist/crm/writer.js +119 -0
  210. package/dist/crm/writer.js.map +1 -0
  211. package/dist/program.d.ts.map +1 -1
  212. package/dist/program.js +53 -5
  213. package/dist/program.js.map +1 -1
  214. package/dist/reasons.d.ts.map +1 -1
  215. package/dist/reasons.js +6 -1
  216. package/dist/reasons.js.map +1 -1
  217. package/dist/store.d.ts +15 -0
  218. package/dist/store.d.ts.map +1 -0
  219. package/dist/store.js +33 -0
  220. package/dist/store.js.map +1 -0
  221. package/dist/version.d.ts +1 -1
  222. package/dist/version.js +1 -1
  223. package/package.json +4 -6
  224. package/skills/bitrix24-cli/SKILL.md +16 -10
  225. package/dist/bundle/all-profiles-QJ444GSX.js +0 -24
  226. package/dist/bundle/chunk-XNHSPHUN.js +0 -48
  227. package/dist/bundle/command-contract-OKQOE6G4.js +0 -30
  228. package/dist/bundle/first-screen-VQM4MTS7.js +0 -28
  229. package/dist/bundle/mcp-5RSWNTHS.js +0 -160
  230. package/dist/bundle/mcp-J5R5A65I.js +0 -87
  231. package/dist/bundle/serve-ES7AG5IK.js +0 -19
  232. package/dist/bundle/server-5LE5LNUQ.js +0 -45
  233. package/dist/bundle/server-BU4VBM6S.js +0 -58
  234. package/dist/bundle/store-maintenance-command-UDVGEY2D.js +0 -47
  235. package/dist/commands/doctor.d.ts +0 -77
  236. package/dist/commands/doctor.d.ts.map +0 -1
  237. package/dist/commands/doctor.js +0 -74
  238. package/dist/commands/doctor.js.map +0 -1
  239. package/dist/commands/mcp.d.ts +0 -3
  240. package/dist/commands/mcp.d.ts.map +0 -1
  241. package/dist/commands/mcp.js +0 -97
  242. package/dist/commands/mcp.js.map +0 -1
  243. package/dist/crm/pipeline.d.ts +0 -17
  244. package/dist/crm/pipeline.d.ts.map +0 -1
  245. package/dist/crm/pipeline.js +0 -42
  246. package/dist/crm/pipeline.js.map +0 -1
  247. package/dist/crm/stage.d.ts +0 -20
  248. package/dist/crm/stage.d.ts.map +0 -1
  249. package/dist/crm/stage.js +0 -65
  250. package/dist/crm/stage.js.map +0 -1
  251. package/dist/mcp.d.ts +0 -29
  252. package/dist/mcp.d.ts.map +0 -1
  253. package/dist/mcp.js +0 -99
  254. package/dist/mcp.js.map +0 -1
  255. /package/dist/bundle/{chunk-4PDYYS5K.js → chunk-ZQ3GWKDQ.js} +0 -0
@@ -0,0 +1,122 @@
1
+ import { CliError, isCliError } from "@wirecat/cli-base";
2
+ import { DEAL } from "./deal.js";
3
+ import { loadFields, metadataOf } from "./fields.js";
4
+ import { LEAD } from "./lead.js";
5
+ import { ORGANIZATION } from "./organization.js";
6
+ import { PERSON } from "./person.js";
7
+ import { bitrixPipelines } from "./pipelines.js";
8
+ import { contacts, customFields, fullName, id, portalTime, text } from "./values.js";
9
+ /**
10
+ * Re-read before the last cursor: rows the portal saved while the round ran, and this computer's clock running ahead
11
+ * of the portal's. A row read twice is only saved twice.
12
+ */
13
+ const OVERLAP_MS = 10 * 60_000;
14
+ const PAGE = 500;
15
+ const TYPES = {
16
+ deal: DEAL,
17
+ lead: LEAD,
18
+ person: PERSON,
19
+ organization: ORGANIZATION,
20
+ };
21
+ const toPerson = (raw) => ({
22
+ externalId: id(raw.id) ?? "",
23
+ name: fullName(raw.name, raw.secondName, raw.lastName),
24
+ email: contacts(raw.email)[0]?.value ?? null,
25
+ phone: contacts(raw.phone)[0]?.value ?? null,
26
+ });
27
+ const toOrganization = (raw, metadata) => ({
28
+ externalId: id(raw.id) ?? "",
29
+ name: text(raw.title) ?? "",
30
+ url: text(raw.url),
31
+ ...(metadata ? { metadata } : {}),
32
+ });
33
+ const rowsOf = (result) => {
34
+ const items = result?.items;
35
+ return Array.isArray(items) ? items : [];
36
+ };
37
+ /** `<last id>@<when the round started>`: keyset paging by id, so a row changed mid-round never shifts the rest. */
38
+ const pageOf = (page, now) => {
39
+ const [after, started] = (page ?? "").split("@");
40
+ return { after: Number(after) || 0, started: Number(started) || now };
41
+ };
42
+ /**
43
+ * The portal's CRM for core's sync: REST 3.0 lists by id with `updatedTime` for changes, since a webhook gets no
44
+ * event feed, and a list of every id to find deletions.
45
+ */
46
+ export const bitrixCrmSource = (portal, now = Date.now) => {
47
+ const loaded = new Map();
48
+ const fields = (kind) => {
49
+ let found = loaded.get(kind);
50
+ if (!found) {
51
+ // A webhook without the rights to read field definitions still syncs its records, with no definitions. Any
52
+ // other failure fails the sync rather than mark every stored definition deleted over a passing fault.
53
+ found = loadFields(portal(), TYPES[kind].type).catch((error) => {
54
+ if (isCliError(error) && error.code === "permission_error")
55
+ return [];
56
+ throw error;
57
+ });
58
+ loaded.set(kind, found);
59
+ }
60
+ return found;
61
+ };
62
+ // core's CrmPerson has no metadata, so a contact's values are not read; its definitions still are, for `fields list`.
63
+ const custom = async (kind) => (kind === "person" ? [] : await fields(kind));
64
+ const mapped = (kind, raw, defined) => {
65
+ const values = customFields(raw);
66
+ const metadata = Object.keys(values).length ? metadataOf(values, defined) : undefined;
67
+ if (kind === "person")
68
+ return toPerson(raw);
69
+ if (kind === "organization")
70
+ return toOrganization(raw, metadata);
71
+ return TYPES[kind].map(raw, metadata);
72
+ };
73
+ const list = (kind, select, filter) => portal().call(`crm.${TYPES[kind].type}.list`, {
74
+ select,
75
+ filter,
76
+ order: { id: "ASC" },
77
+ pagination: { limit: PAGE, offset: 0 },
78
+ });
79
+ return {
80
+ provider: "bitrix24",
81
+ traits: { kinds: ["organization", "person", "deal", "lead"], removedInChanges: false },
82
+ pipelines: (kind) => bitrixPipelines(portal(), kind),
83
+ async changes(kind, cursor, page) {
84
+ const since = cursor === null ? null : Date.parse(cursor);
85
+ if (since !== null && Number.isNaN(since))
86
+ return { reset: true };
87
+ const { after, started } = pageOf(page, now());
88
+ const defined = await custom(kind);
89
+ const filter = [
90
+ ...(after ? [["id", ">", after]] : []),
91
+ ...(since === null ? [] : [["updatedTime", ">=", portalTime(since - OVERLAP_MS)]]),
92
+ ];
93
+ const rows = rowsOf((await list(kind, [...TYPES[kind].select, ...defined.map(({ code }) => code)], filter)).result);
94
+ const items = rows.map((raw) => mapped(kind, raw, defined));
95
+ const last = id(rows.at(-1)?.id);
96
+ // An empty page ends the round, not a short one: a portal that caps pages below PAGE still lists every row.
97
+ if (last !== null)
98
+ return { items, nextPage: `${last}@${started}` };
99
+ return { items, cursor: new Date(started).toISOString() };
100
+ },
101
+ async ids(kind, page) {
102
+ const after = Number(page) || 0;
103
+ const rows = rowsOf((await list(kind, ["id"], after ? [["id", ">", after]] : [])).result);
104
+ const ids = rows.map((raw) => id(raw.id)).filter((one) => one !== null);
105
+ const last = ids.at(-1);
106
+ return last === undefined ? { ids } : { ids, nextPage: last };
107
+ },
108
+ async item(kind, externalId) {
109
+ const defined = await custom(kind);
110
+ const answer = await portal().call(`crm.${TYPES[kind].type}.get`, {
111
+ id: Number(externalId),
112
+ select: [...TYPES[kind].select, ...defined.map(({ code }) => code)],
113
+ });
114
+ const raw = answer.result?.item;
115
+ if (!raw)
116
+ throw new CliError("not_found", `the portal has no ${kind} ${externalId}`);
117
+ return mapped(kind, raw, defined);
118
+ },
119
+ fields,
120
+ };
121
+ };
122
+ //# sourceMappingURL=source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/crm/source.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/crm/user.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,KAAK,SAAS,EAAe,MAAM,iBAAiB,CAAA;AAC7D,OAAO,EAAqB,KAAK,GAAG,EAAa,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,WAAW,CAAA;AAE7C,8DAA8D;AAC9D,eAAO,MAAM,UAAU;;;;;;;aAOrB,CAAA;AAEF,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,UAAU,CAAC,CAAA;AAEnD,eAAO,MAAM,WAAW;aACtB,IAAI;iBAAI,KAAK,EAAE,aAAa;iBAAE,IAAI,EAAE,MAAM;;aAC1C,MAAM;iBAAI,KAAK,EAAE,QAAQ;iBAAE,IAAI,EAAE,MAAM;;CAC/B,CAAA;AAEV,eAAO,MAAM,cAAc,QAAS,GAAG,KAAG,IAOxC,CAAA;AAWF,eAAO,MAAM,SAAS,WAAkB,eAAe,cAAc,SAAS,SAAS,EAAE,UAAU,MAAM;;;;;;;;;;EAWxG,CAAA;AAED,eAAO,MAAM,OAAO,WAAkB,eAAe,aAAa,MAAM,KAAG,OAAO,CAAC,IAAI,CAKtF,CAAA"}
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/crm/user.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,KAAK,SAAS,EAAe,MAAM,iBAAiB,CAAA;AAC7D,OAAO,EAAgC,KAAK,GAAG,EAAa,MAAM,aAAa,CAAA;AAC/E,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,WAAW,CAAA;AAE7C,8DAA8D;AAC9D,eAAO,MAAM,UAAU;;;;;;;aAOrB,CAAA;AAEF,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,UAAU,CAAC,CAAA;AAEnD,eAAO,MAAM,WAAW;aACtB,IAAI;iBAAI,KAAK,EAAE,aAAa;iBAAE,IAAI,EAAE,MAAM;;aAC1C,MAAM;iBAAI,KAAK,EAAE,QAAQ;iBAAE,IAAI,EAAE,MAAM;;CAC/B,CAAA;AAEV,eAAO,MAAM,cAAc,QAAS,GAAG,KAAG,IAOxC,CAAA;AAWF,eAAO,MAAM,SAAS,WAAkB,eAAe,cAAc,SAAS,SAAS,EAAE,UAAU,MAAM;;;;;;;;;;EAWxG,CAAA;AAED,eAAO,MAAM,OAAO,WAAkB,eAAe,aAAa,MAAM,KAAG,OAAO,CAAC,IAAI,CAKtF,CAAA"}
package/dist/crm/user.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { CliError } from "@wirecat/cli-base";
2
2
  import * as v from "valibot";
3
3
  import { rest2Filter } from "./conditions.js";
4
- import { fullName, id, ids, text, yes } from "./values.js";
4
+ import { fullName, id, ids, numericId, text, yes } from "./values.js";
5
5
  import { walk } from "./walk.js";
6
6
  /** An employee of the portal: who a record is assigned to. */
7
7
  export const userSchema = v.strictObject({
@@ -45,7 +45,7 @@ export const listUsers = async (portal, conditions, window) => {
45
45
  return { items: items.map(fromBitrixUser), has_more };
46
46
  };
47
47
  export const getUser = async (portal, reference) => {
48
- const answer = await portal.call("user.get", { FILTER: { ID: Number(reference) } });
48
+ const answer = await portal.call("user.get", { FILTER: { ID: numericId(reference, "users show") } });
49
49
  const found = Array.isArray(answer.result) ? answer.result[0] : undefined;
50
50
  if (!found)
51
51
  throw new CliError("not_found", `there is no user ${reference}`);
@@ -1 +1 @@
1
- {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/crm/user.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/crm/user.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,26 @@
1
+ import type { StageOutcome } from "@wirecat/cli-core";
1
2
  import * as v from "valibot";
2
3
  export type Raw = Record<string, unknown>;
3
- export declare const OUTCOMES: readonly ["open", "won", "lost"];
4
- export type Outcome = (typeof OUTCOMES)[number];
5
4
  /** Bitrix24's stage semantics: `S` success, `F` failure, anything else still in progress (apidocs crm.status.fields). */
6
- export declare const outcomeOf: (semantics: unknown) => Outcome;
7
- export declare const semanticsOf: (outcome: string) => string;
5
+ export declare const outcomeOf: (semantics: unknown) => StageOutcome;
8
6
  export declare const text: (value: unknown) => string | null;
9
7
  export declare const id: (value: unknown) => string | null;
8
+ /** `Number("anna")` is NaN, which goes out as null: Bitrix24 may then read the call as having no id at all. */
9
+ export declare const numericId: (value: string, what: string) => number;
10
10
  export declare const ids: (value: unknown) => string[];
11
11
  export declare const number: (value: unknown) => number | null;
12
12
  /** Bitrix24 answers with the portal's offset; every answer here is UTC (WC-OUT-13). */
13
13
  export declare const time: (value: unknown) => string | null;
14
+ /** Epoch milliseconds, as core's CRM copy keeps times. */
15
+ export declare const epoch: (value: unknown) => number | null;
16
+ /**
17
+ * Money as a decimal string in its currency, both or neither. Bitrix24 gives every deal a currency and `0` for no
18
+ * amount, so `0` is no amount.
19
+ */
20
+ export declare const amountOf: (value: unknown, currency: unknown) => {
21
+ amount: string | null;
22
+ currency: string | null;
23
+ };
14
24
  export declare const yes: (value: unknown) => boolean;
15
25
  export declare const fullName: (...parts: unknown[]) => string | null;
16
26
  export interface Contact {
@@ -19,6 +29,8 @@ export interface Contact {
19
29
  }
20
30
  /** REST 3.0 `phone` and `email`: `[{ valueTypeId, value }]`. */
21
31
  export declare const contacts: (value: unknown) => Contact[];
32
+ /** A portal's own field, not its read-only `_data` twin. */
33
+ export declare const isCustom: (name: string) => boolean;
22
34
  /**
23
35
  * The portal's own fields that hold a value, as it names them: their meaning is the portal owner's, so they stay
24
36
  * unmapped. `false` and `0` stay, since a yes/no field saying no is an answer.
@@ -29,10 +41,19 @@ export declare const contactSchema: v.StrictObjectSchema<{
29
41
  readonly value: v.StringSchema<undefined>;
30
42
  }, undefined>;
31
43
  export declare const nullableTime: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, "an ISO 8601 time in UTC">, v.EndsWithAction<string, "Z", "an ISO 8601 time in UTC, ending in `Z`">]>, undefined>;
32
- /** A custom field's value with its title on the portal; `label` is null when the portal did not give one. */
44
+ /**
45
+ * A custom field's value with its title on the portal; `label` is null when the portal did not give one. A list
46
+ * field's value is its option's label, and `option_id` the option's id (both arrays for a multiple field).
47
+ */
33
48
  export declare const metadataSchema: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StrictObjectSchema<{
34
49
  readonly label: v.NullableSchema<v.StringSchema<undefined>, undefined>;
35
50
  readonly value: v.UnknownSchema;
51
+ readonly option_id: v.OptionalSchema<v.UnionSchema<[v.StringSchema<undefined>, v.ArraySchema<v.StringSchema<undefined>, undefined>], undefined>, undefined>;
36
52
  }, undefined>, undefined>, undefined>;
37
53
  export type Metadata = NonNullable<v.InferOutput<typeof metadataSchema>>;
54
+ /**
55
+ * A filter's time as REST 3.0 takes it, whole seconds with an offset: a live portal refused a filter with
56
+ * `toISOString()`'s milliseconds and `Z` (REQUESTVALIDATIONEXCEPTION, 2026-11-07).
57
+ */
58
+ export declare const portalTime: (ms: number) => string;
38
59
  //# sourceMappingURL=values.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../src/crm/values.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEzC,eAAO,MAAM,QAAQ,YAAI,MAAM,EAAE,KAAK,EAAE,MAAM,CAAU,CAAA;AACxD,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAA;AAE/C,yHAAyH;AACzH,eAAO,MAAM,SAAS,cAAe,OAAO,KAAG,OACkB,CAAA;AACjE,eAAO,MAAM,WAAW,YAAa,MAAM,KAAG,MAAoE,CAAA;AAElH,eAAO,MAAM,IAAI,UAAW,OAAO,KAAG,MAAM,GAAG,IAI9C,CAAA;AAED,eAAO,MAAM,EAAE,UAAW,OAAO,KAAG,MAAM,GAAG,IAG5C,CAAA;AAED,eAAO,MAAM,GAAG,UAAW,OAAO,KAAG,MAAM,EAC6C,CAAA;AAExF,eAAO,MAAM,MAAM,UAAW,OAAO,KAAG,MAAM,GAAG,IAIhD,CAAA;AAED,uFAAuF;AACvF,eAAO,MAAM,IAAI,UAAW,OAAO,KAAG,MAAM,GAAG,IAK9C,CAAA;AAED,eAAO,MAAM,GAAG,UAAW,OAAO,KAAG,OAA0E,CAAA;AAE/G,eAAO,MAAM,QAAQ,aAAc,OAAO,EAAE,KAAG,MAAM,GAAG,IAIlC,CAAA;AAEtB,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,gEAAgE;AAChE,eAAO,MAAM,QAAQ,UAAW,OAAO,KAAG,OAAO,EAMzC,CAAA;AAMR;;;GAGG;AACH,eAAO,MAAM,YAAY,QAAS,GAAG,GAAG,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAGvE,CAAA;AAEH,eAAO,MAAM,aAAa;;;aAAsE,CAAA;AAChG,eAAO,MAAM,YAAY,uNAAsB,CAAA;AAC/C,6GAA6G;AAC7G,eAAO,MAAM,cAAc;;;qCAE1B,CAAA;AACD,MAAM,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,cAAc,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../src/crm/values.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEzC,yHAAyH;AACzH,eAAO,MAAM,SAAS,cAAe,OAAO,KAAG,YACkB,CAAA;AAEjE,eAAO,MAAM,IAAI,UAAW,OAAO,KAAG,MAAM,GAAG,IAI9C,CAAA;AAED,eAAO,MAAM,EAAE,UAAW,OAAO,KAAG,MAAM,GAAG,IAG5C,CAAA;AAED,+GAA+G;AAC/G,eAAO,MAAM,SAAS,UAAW,MAAM,QAAQ,MAAM,KAAG,MAIvD,CAAA;AAED,eAAO,MAAM,GAAG,UAAW,OAAO,KAAG,MAAM,EAC6C,CAAA;AAExF,eAAO,MAAM,MAAM,UAAW,OAAO,KAAG,MAAM,GAAG,IAIhD,CAAA;AAED,uFAAuF;AACvF,eAAO,MAAM,IAAI,UAAW,OAAO,KAAG,MAAM,GAAG,IAK9C,CAAA;AAED,0DAA0D;AAC1D,eAAO,MAAM,KAAK,UAAW,OAAO,KAAG,MAAM,GAAG,IAG/C,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,UAAW,OAAO,YAAY,OAAO,KAAG;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAK5G,CAAA;AAED,eAAO,MAAM,GAAG,UAAW,OAAO,KAAG,OAA0E,CAAA;AAE/G,eAAO,MAAM,QAAQ,aAAc,OAAO,EAAE,KAAG,MAAM,GAAG,IAIlC,CAAA;AAEtB,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,gEAAgE;AAChE,eAAO,MAAM,QAAQ,UAAW,OAAO,KAAG,OAAO,EAMzC,CAAA;AAIR,4DAA4D;AAC5D,eAAO,MAAM,QAAQ,SAAU,MAAM,YAAiD,CAAA;AAItF;;;GAGG;AACH,eAAO,MAAM,YAAY,QAAS,GAAG,GAAG,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAC8B,CAAA;AAExG,eAAO,MAAM,aAAa;;;aAAsE,CAAA;AAChG,eAAO,MAAM,YAAY,uNAAsB,CAAA;AAC/C;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;qCAS1B,CAAA;AACD,MAAM,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,cAAc,CAAC,CAAC,CAAA;AAExE;;;GAGG;AACH,eAAO,MAAM,UAAU,OAAQ,MAAM,WAC4C,CAAA"}
@@ -1,9 +1,8 @@
1
+ import { CliError } from "@wirecat/cli-base";
1
2
  import { isoTime } from "@wirecat/cli-base/standards";
2
3
  import * as v from "valibot";
3
- export const OUTCOMES = ["open", "won", "lost"];
4
4
  /** Bitrix24's stage semantics: `S` success, `F` failure, anything else still in progress (apidocs crm.status.fields). */
5
5
  export const outcomeOf = (semantics) => semantics === "S" ? "won" : semantics === "F" ? "lost" : "open";
6
- export const semanticsOf = (outcome) => (outcome === "won" ? "S" : outcome === "lost" ? "F" : "P");
7
6
  export const text = (value) => {
8
7
  if (typeof value !== "string" && typeof value !== "number")
9
8
  return null;
@@ -14,6 +13,12 @@ export const id = (value) => {
14
13
  const found = text(value);
15
14
  return found === null || found === "0" ? null : found;
16
15
  };
16
+ /** `Number("anna")` is NaN, which goes out as null: Bitrix24 may then read the call as having no id at all. */
17
+ export const numericId = (value, what) => {
18
+ if (!/^(0|[1-9][0-9]*)$/.test(value))
19
+ throw new CliError("validation_error", `${what} takes a number, such as 7`, { reason: "id.invalid", sent: false });
20
+ return Number(value);
21
+ };
17
22
  export const ids = (value) => Array.isArray(value) ? value.map(id).filter((one) => one !== null) : [];
18
23
  export const number = (value) => {
19
24
  if (value === null || value === undefined || value === "")
@@ -29,6 +34,22 @@ export const time = (value) => {
29
34
  const parsed = new Date(found);
30
35
  return Number.isNaN(parsed.getTime()) ? null : parsed.toISOString();
31
36
  };
37
+ /** Epoch milliseconds, as core's CRM copy keeps times. */
38
+ export const epoch = (value) => {
39
+ const found = time(value);
40
+ return found === null ? null : Date.parse(found);
41
+ };
42
+ /**
43
+ * Money as a decimal string in its currency, both or neither. Bitrix24 gives every deal a currency and `0` for no
44
+ * amount, so `0` is no amount.
45
+ */
46
+ export const amountOf = (value, currency) => {
47
+ const found = number(value);
48
+ const code = text(currency)?.toUpperCase() ?? null;
49
+ if (found === null || found <= 0 || code === null)
50
+ return { amount: null, currency: null };
51
+ return { amount: found.toFixed(6).replace(/\.?0+$/, ""), currency: code };
52
+ };
32
53
  export const yes = (value) => value === true || value === "Y" || value === "1" || value === 1;
33
54
  export const fullName = (...parts) => parts
34
55
  .map(text)
@@ -42,14 +63,28 @@ export const contacts = (value) => Array.isArray(value)
42
63
  })
43
64
  : [];
44
65
  const CUSTOM = /^(UF_CRM_|ufCrm)/;
66
+ /** A portal's own field, not its read-only `_data` twin. */
67
+ export const isCustom = (name) => CUSTOM.test(name) && !name.endsWith("_data");
45
68
  const empty = (value) => value === null || value === "" || (Array.isArray(value) && value.length === 0);
46
69
  /**
47
70
  * The portal's own fields that hold a value, as it names them: their meaning is the portal owner's, so they stay
48
71
  * unmapped. `false` and `0` stay, since a yes/no field saying no is an answer.
49
72
  */
50
- export const customFields = (raw) => Object.fromEntries(Object.entries(raw ?? {}).filter(([key, value]) => CUSTOM.test(key) && !key.endsWith("_data") && !empty(value)));
73
+ export const customFields = (raw) => Object.fromEntries(Object.entries(raw ?? {}).filter(([key, value]) => isCustom(key) && !empty(value)));
51
74
  export const contactSchema = v.strictObject({ type: v.nullable(v.string()), value: v.string() });
52
75
  export const nullableTime = v.nullable(isoTime);
53
- /** A custom field's value with its title on the portal; `label` is null when the portal did not give one. */
54
- export const metadataSchema = v.optional(v.record(v.string(), v.strictObject({ label: v.nullable(v.string()), value: v.unknown() })));
76
+ /**
77
+ * A custom field's value with its title on the portal; `label` is null when the portal did not give one. A list
78
+ * field's value is its option's label, and `option_id` the option's id (both arrays for a multiple field).
79
+ */
80
+ export const metadataSchema = v.optional(v.record(v.string(), v.strictObject({
81
+ label: v.nullable(v.string()),
82
+ value: v.unknown(),
83
+ option_id: v.optional(v.union([v.string(), v.array(v.string())])),
84
+ })));
85
+ /**
86
+ * A filter's time as REST 3.0 takes it, whole seconds with an offset: a live portal refused a filter with
87
+ * `toISOString()`'s milliseconds and `Z` (REQUESTVALIDATIONEXCEPTION, 2026-11-07).
88
+ */
89
+ export const portalTime = (ms) => new Date(Math.floor(ms / 1000) * 1000).toISOString().replace(".000Z", "+00:00");
55
90
  //# sourceMappingURL=values.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"values.js","sourceRoot":"","sources":["../../src/crm/values.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"values.js","sourceRoot":"","sources":["../../src/crm/values.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type CrmWriter } from "@wirecat/cli-core/crm";
2
+ import type { BitrixTransport } from "../bitrix/transport.js";
3
+ import type { BitrixCrmSource } from "./source.js";
4
+ /**
5
+ * Core's write port over REST 3.0. Each write is sent once with its operation id as the `Idempotency-Key` (the
6
+ * transport never retries a write), then the record is read back whole, as core's store wants it.
7
+ */
8
+ export declare const bitrixCrmWriter: (portal: () => BitrixTransport, source: BitrixCrmSource) => CrmWriter;
9
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/crm/writer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwC,KAAK,SAAS,EAAwB,MAAM,uBAAuB,CAAA;AAClH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAK7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAYlD;;;GAGG;AACH,eAAO,MAAM,eAAe,WAAY,MAAM,eAAe,UAAU,eAAe,KAAG,SAkGxF,CAAA"}
@@ -0,0 +1,119 @@
1
+ import { CliError, isCliError } from "@wirecat/cli-base";
2
+ import { fieldNamed, optionOf } from "@wirecat/cli-core/crm";
3
+ import { foldCode } from "../body.js";
4
+ import { BITRIX_WRITES } from "./capabilities.js";
5
+ import { LEAD_PIPELINE } from "./lead.js";
6
+ import { REST3_FIELDS } from "./rest3-fields.js";
7
+ import { id, numericId } from "./values.js";
8
+ /** A lead's REST 2 stage is `STATUS_ID`. */
9
+ const STANDARD = {
10
+ deal: new Set(REST3_FIELDS.deal.map(foldCode)),
11
+ lead: new Set([...REST3_FIELDS.lead, "statusId"].map(foldCode)),
12
+ };
13
+ const refused = (message, param) => new CliError("validation_error", message, { reason: "deal.field", sent: false, ...(param ? { param } : {}) });
14
+ /**
15
+ * Core's write port over REST 3.0. Each write is sent once with its operation id as the `Idempotency-Key` (the
16
+ * transport never retries a write), then the record is read back whole, as core's store wants it.
17
+ */
18
+ export const bitrixCrmWriter = (portal, source) => {
19
+ /** Every check comes before the first request: a custom code that is a standard field would get round its key. */
20
+ const fieldsOf = async (kind, given) => {
21
+ const custom = Object.entries(given.custom ?? {});
22
+ for (const [code] of custom)
23
+ if (STANDARD[kind].has(foldCode(code)))
24
+ throw refused(`${code} is one of Bitrix24's own fields; set it with its own option, not --field`, "--field");
25
+ if (given.people !== undefined)
26
+ throw refused("b24 does not set the contacts on a record yet");
27
+ if (given.owner === null)
28
+ throw refused("a Bitrix24 record is always assigned to an employee", "--owner");
29
+ if (kind === "lead" && given.closeDate !== undefined)
30
+ throw refused("Bitrix24 leads have no close date", "--close-date");
31
+ if (kind === "lead" && given.pipeline !== undefined && given.pipeline !== LEAD_PIPELINE.externalId)
32
+ throw refused("Bitrix24 leads have one pipeline", "--pipeline");
33
+ const fields = {};
34
+ if (given.title !== undefined)
35
+ fields.title = given.title;
36
+ if (kind === "deal" && given.pipeline !== undefined)
37
+ fields.categoryId = numericId(given.pipeline, "--pipeline");
38
+ if (given.stage !== undefined)
39
+ fields.stageId = given.stage;
40
+ if (given.amount !== undefined)
41
+ fields.opportunity = given.amount === null ? 0 : Number(given.amount);
42
+ if (given.currency != null)
43
+ fields.currencyId = given.currency;
44
+ if (given.closeDate !== undefined)
45
+ fields.closeTime = given.closeDate;
46
+ if (given.organization !== undefined)
47
+ fields.companyId = given.organization === null ? 0 : numericId(given.organization, "--organization");
48
+ if (given.owner != null)
49
+ fields.assignedById = numericId(given.owner, "--owner");
50
+ if (custom.length === 0)
51
+ return fields;
52
+ // Core resolves by the stored definitions, but a store not synced since they were added passes names as typed:
53
+ // they are checked here against the portal's, or `Number("Website")` would clear a list field.
54
+ const defined = await source.fields(kind);
55
+ for (const [name, value] of custom) {
56
+ const field = fieldNamed(defined, name);
57
+ const typed = (one) => (field.options ? Number(optionOf(field, one)) : one);
58
+ if (value === null)
59
+ fields[field.code] = field.multiple ? [] : null;
60
+ else
61
+ fields[field.code] = Array.isArray(value) ? value.map(typed) : typed(value);
62
+ }
63
+ return fields;
64
+ };
65
+ const keyed = (options) => ({ idempotencyKey: options.operationId });
66
+ /** The write went through: a failed read-back must never read as a failed write, or the owner repeats it. */
67
+ const readBack = async (kind, externalId, options) => {
68
+ try {
69
+ return await source.item(kind, externalId);
70
+ }
71
+ catch (error) {
72
+ throw new CliError("invalid_response", `Bitrix24 made the change to ${kind} ${externalId}, but reading it back failed` +
73
+ `${isCliError(error) ? ` (${error.code})` : ""}; run sync to store it — do not write it again`, { operation_id: options.operationId, external_id: externalId, sent: true });
74
+ }
75
+ };
76
+ const update = async (kind, externalId, fields, options) => {
77
+ await portal().call(`crm.${kind}.update`, { id: Number(externalId), fields }, keyed(options));
78
+ return readBack(kind, externalId, options);
79
+ };
80
+ return {
81
+ provider: "bitrix24",
82
+ capabilities: BITRIX_WRITES,
83
+ async create(kind, draft, options) {
84
+ const fields = await fieldsOf(kind, draft);
85
+ const answer = await portal().call(`crm.${kind}.add`, { fields }, keyed(options));
86
+ const externalId = id(answer.result?.id);
87
+ if (externalId === null)
88
+ throw new CliError("invalid_response", `Bitrix24 answered the new ${kind} without its id; run sync before writing again`, { operation_id: options.operationId, sent: true });
89
+ return readBack(kind, externalId, options);
90
+ },
91
+ async update(kind, externalId, patch, options) {
92
+ const fields = await fieldsOf(kind, patch);
93
+ if (Object.keys(fields).length === 0)
94
+ throw refused("nothing to change: name a field");
95
+ return update(kind, externalId, fields, options);
96
+ },
97
+ move: (kind, externalId, stage, options) => update(kind, externalId, { stageId: stage }, options),
98
+ async close(kind, externalId, outcome, options) {
99
+ if (options.reason !== undefined)
100
+ throw refused("Bitrix24 keeps no reason with a won or lost record; leave out --reason", "--reason");
101
+ const current = await source.item(kind, externalId);
102
+ const pipeline = (await source.pipelines(kind)).find((one) => one.externalId === current.pipeline);
103
+ // A pipeline may have several lost stages: the first one in its order is the one a close goes to.
104
+ const [stage] = (pipeline?.stages ?? [])
105
+ .filter((one) => one.outcome === outcome)
106
+ .sort((a, b) => a.position - b.position);
107
+ if (!stage)
108
+ throw new CliError("validation_error", `${pipeline?.name ?? "its pipeline"} has no ${outcome} stage`, {
109
+ reason: "deal.stage",
110
+ sent: false,
111
+ });
112
+ return update(kind, externalId, { stageId: stage.externalId }, options);
113
+ },
114
+ async remove(kind, externalId, options) {
115
+ await portal().call(`crm.${kind}.delete`, { id: Number(externalId) }, keyed(options));
116
+ },
117
+ };
118
+ };
119
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/crm/writer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,UAAU,EAKhB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAqBxC,eAAO,MAAM,UAAU,QAAO,iBAoB5B,CAAA;AAEF,eAAO,MAAM,aAAa,aAAc,cAAc,KAAG,OAAqD,CAAA;AAE9G,eAAO,MAAM,GAAG,SAAU,MAAM,EAAE,YAAY,UAAU,KAAG,OAAO,CAAC,MAAM,CAA2C,CAAA"}
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAEA,OAAO,EAQL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,UAAU,EAKhB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoDxC,eAAO,MAAM,UAAU,QAAO,iBAqC5B,CAAA;AAEF,eAAO,MAAM,aAAa,aAAc,cAAc,KAAG,OAAqD,CAAA;AAE9G,eAAO,MAAM,GAAG,SAAU,MAAM,EAAE,YAAY,UAAU,KAAG,OAAO,CAAC,MAAM,CAA2C,CAAA"}
package/dist/program.js CHANGED
@@ -1,33 +1,81 @@
1
1
  import { join } from "node:path";
2
2
  import { resolvePaths } from "@wirecat/cli-base";
3
- import { commandsCommand, configCommand, createProgram as createSharedProgram, outputFor, run as runShared, runsCommand, skillCommand, upgradeCommand, } from "@wirecat/cli-core/cli";
3
+ import { appDoctorCommand, appMcpCommand, commandsCommand, configCommand, createProgram as createSharedProgram, environmentOf, outputFor, run as runShared, runsCommand, skillCommand, upgradeCommand, } from "@wirecat/cli-core/cli";
4
4
  import { appUpdate } from "@wirecat/cli-core/update";
5
5
  import { apiCommand } from "./commands/api.js";
6
6
  import { crmCommands } from "./commands/crm.js";
7
+ import { crmSharedCommands } from "./commands/crm-shared.js";
7
8
  import { addWrites } from "./commands/crm-writes.js";
8
- import { doctorCommand } from "./commands/doctor.js";
9
- import { mcpCommand } from "./commands/mcp.js";
10
9
  import { sessionCommand } from "./commands/session.js";
11
10
  import { configuration } from "./config.js";
12
11
  import { IDENTITY, PACKAGE, SKILL } from "./identity.js";
12
+ import { tokens } from "./token.js";
13
13
  const update = appUpdate({
14
14
  packageName: PACKAGE,
15
15
  command: IDENTITY.command,
16
16
  version: IDENTITY.version,
17
17
  entry: import.meta.url,
18
18
  statePath: (env) => join(resolvePaths({ appName: IDENTITY.appName, prefix: IDENTITY.envPrefix, env }).state, "update-check.json"),
19
+ // biome-ignore lint/plugin/no-own-settings: the update check runs before any command exists to give baseContext
19
20
  enabled: (env) => configuration.resolveSettings({}, { env, needsProfile: false }).updateCheck,
20
21
  offVariables: [`${IDENTITY.envPrefix}_NO_UPDATE_CHECK`],
21
22
  });
23
+ const mcpCommand = () => {
24
+ // cli-core asks `signedIn` with no keyring; the run's own one, a test's `memoryKeyring()`, is taken here, as gcal does.
25
+ let keyring;
26
+ const mcp = appMcpCommand(IDENTITY, configuration, {
27
+ name: "Bitrix24",
28
+ untrusted: [
29
+ "deal and lead titles",
30
+ "pipeline and stage names",
31
+ "names of contacts, companies and employees",
32
+ "custom field values",
33
+ "phone numbers, e-mail addresses and links",
34
+ "whatever api call returns",
35
+ "the messages, notes and events search all finds",
36
+ ],
37
+ permissionExample: "deals.delete=deny",
38
+ skill: SKILL,
39
+ signedIn: (profile, env) => {
40
+ try {
41
+ return tokens(env, keyring).read(profile) !== undefined;
42
+ }
43
+ catch {
44
+ // A keyring that cannot be read fails the server's tools as well.
45
+ return false;
46
+ }
47
+ },
48
+ });
49
+ return mcp.hook("preAction", (_mcp, action) => {
50
+ keyring = environmentOf(action).keyring;
51
+ });
52
+ };
22
53
  export const definition = () => ({
23
54
  app: IDENTITY,
24
- configuration: { resolveSettings: configuration.resolveSettings },
55
+ // The whole object: cli-core refuses a command by its key only when it gets the permission table too.
56
+ configuration,
57
+ firstScreen: {
58
+ pitch: "a Bitrix24 portal's CRM in a local store, for scripts and agents, with a permission on every write.",
59
+ can: [
60
+ {
61
+ command: "sync",
62
+ does: "copy the portal's deals, leads, contacts and companies; the next sync takes the changes",
63
+ },
64
+ { command: "deals list status:open", does: "open deals with stage, amount and owner, from the store, offline" },
65
+ { command: 'search all "kitchen"', does: "stored deals and leads beside your other WireCat tools' data" },
66
+ { command: "deals move <ref> <stage>", does: "move a deal; deals.move=ask stops robots that write to clients" },
67
+ { command: "api call <method> --dry-run", does: "any REST method, with every permission it checks" },
68
+ { command: "mcp serve --permission deals=deny", does: "the CRM in any agent, with the levels you set" },
69
+ ],
70
+ start: `${IDENTITY.command} work session start`,
71
+ },
25
72
  commands: () => [
26
73
  commandsCommand(IDENTITY),
27
74
  sessionCommand(),
75
+ ...crmSharedCommands(),
28
76
  ...crmCommands().map(addWrites),
29
77
  apiCommand(),
30
- doctorCommand(),
78
+ appDoctorCommand(IDENTITY, configuration, { packageName: PACKAGE }),
31
79
  skillCommand(IDENTITY, SKILL),
32
80
  mcpCommand(),
33
81
  upgradeCommand(IDENTITY, PACKAGE, (command) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"reasons.d.ts","sourceRoot":"","sources":["../src/reasons.ts"],"names":[],"mappings":"AA+BA,eAAO,MAAM,OAAO;;;;;;GAAoG,CAAA;AAExH,4DAA4D;AAC5D,eAAO,MAAM,OAAO,UAAa,CAAA"}
1
+ {"version":3,"file":"reasons.d.ts","sourceRoot":"","sources":["../src/reasons.ts"],"names":[],"mappings":"AAoCA,eAAO,MAAM,OAAO;;;;;;GAAoG,CAAA;AAExH,4DAA4D;AAC5D,eAAO,MAAM,OAAO,UAAsB,CAAA"}