@wirecat/bitrix24-cli 0.4.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 (248) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/README.md +84 -9
  3. package/dist/api-keys.d.ts +18 -13
  4. package/dist/api-keys.d.ts.map +1 -1
  5. package/dist/api-keys.js +79 -22
  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/transport.d.ts +1 -1
  11. package/dist/bitrix/transport.d.ts.map +1 -1
  12. package/dist/bitrix/transport.js +20 -6
  13. package/dist/bitrix/transport.js.map +1 -1
  14. package/dist/body.d.ts +14 -0
  15. package/dist/body.d.ts.map +1 -0
  16. package/dist/body.js +44 -0
  17. package/dist/body.js.map +1 -0
  18. package/dist/bundle/{chunk-JAS3OZSP.js → all-profiles-CANIDIDS.js} +12 -7
  19. package/dist/bundle/{anthropic-QCYLKSJJ.js → anthropic-JUJB4DCF.js} +5 -5
  20. package/dist/bundle/{app-server-FSLZ2Y6N.js → app-server-3V5Z4PTK.js} +68 -54
  21. package/dist/bundle/b24.js +18 -12
  22. package/dist/bundle/{bun-UYRQXF33.js → bun-LKMV5TY7.js} +2 -2
  23. package/dist/bundle/{bun-sqlite-GXME7EMT.js → bun-sqlite-S56EF74S.js} +3 -3
  24. package/dist/bundle/{chunk-D2IRPC5I.js → chunk-2I4KWS3H.js} +6 -6
  25. package/dist/bundle/chunk-36PO5NWY.js +147 -0
  26. package/dist/bundle/{chunk-COOOXDKZ.js → chunk-42F7Q7V6.js} +3 -3
  27. package/dist/bundle/{chunk-POUSZWMP.js → chunk-4D3K6GZW.js} +18 -4
  28. package/dist/bundle/chunk-5D4MJQ6X.js +22 -0
  29. package/dist/bundle/chunk-5JOPERVF.js +84 -0
  30. package/dist/bundle/chunk-6A4UPWDC.js +15 -0
  31. package/dist/bundle/{chunk-O7FVOICH.js → chunk-6MGWIZG4.js} +1 -1
  32. package/dist/bundle/{chunk-B252WFK7.js → chunk-6YJTNZ7U.js} +13 -13
  33. package/dist/bundle/{chunk-2D5W4LWL.js → chunk-7FBFJ6B4.js} +4 -2
  34. package/dist/bundle/chunk-7VCMOTQP.js +55 -0
  35. package/dist/bundle/{chunk-6BLVBGRK.js → chunk-A5IMMGYU.js} +36 -34
  36. package/dist/bundle/{chunk-66QLBRIT.js → chunk-ASEHTBNK.js} +1 -1
  37. package/dist/bundle/{chunk-MY6FAZRA.js → chunk-B6LPJYPQ.js} +2 -2
  38. package/dist/bundle/{chunk-EQLWU6ZB.js → chunk-BHEE2K6C.js} +7 -7
  39. package/dist/bundle/chunk-BYZQBE63.js +971 -0
  40. package/dist/bundle/{chunk-J7OMY6EO.js → chunk-COKGNTDQ.js} +1477 -723
  41. package/dist/bundle/{chunk-QVZSLBR6.js → chunk-DVFYRQGE.js} +1 -1
  42. package/dist/bundle/{chunk-Q7Z5IMVY.js → chunk-DVSIBZ3G.js} +1 -1
  43. package/dist/bundle/chunk-EJEIXC6Y.js +273 -0
  44. package/dist/bundle/chunk-EYTGCM44.js +130 -0
  45. package/dist/bundle/{chunk-SBW2Y7AZ.js → chunk-EYYOKT23.js} +26 -26
  46. package/dist/bundle/{chunk-Y5PPMGCS.js → chunk-FCWPIWSR.js} +2 -2
  47. package/dist/bundle/{chunk-AOUNT22U.js → chunk-FSWRMQWX.js} +2 -2
  48. package/dist/bundle/{chunk-ADLS6FVG.js → chunk-FXBHOCJK.js} +1 -1
  49. package/dist/bundle/chunk-G5MW6RCM.js +723 -0
  50. package/dist/bundle/{chunk-4OVK5XW2.js → chunk-GLTKRLFT.js} +8 -8
  51. package/dist/bundle/chunk-GUUZQ7NE.js +581 -0
  52. package/dist/bundle/{chunk-XOPMSWFC.js → chunk-H6RIPOOI.js} +36 -3
  53. package/dist/bundle/{chunk-GTMCLOYY.js → chunk-HGFNC4CR.js} +1447 -430
  54. package/dist/bundle/{chunk-IF27EQN6.js → chunk-IERYD2N2.js} +6 -6
  55. package/dist/bundle/{chunk-Q4ILKTV4.js → chunk-IGCLMEMB.js} +3 -3
  56. package/dist/bundle/{chunk-2IZ6GGU2.js → chunk-J7WCSZ2Q.js} +410 -918
  57. package/dist/bundle/{chunk-CR3TLGM4.js → chunk-JZYHQ4HB.js} +3 -3
  58. package/dist/bundle/{chunk-XR5SUCAC.js → chunk-K4QM3X5F.js} +4 -4
  59. package/dist/bundle/{chunk-OWILUBCI.js → chunk-KFSMY7SZ.js} +2 -2
  60. package/dist/bundle/{chunk-AMVRNYD6.js → chunk-KPEDH5T4.js} +1 -1
  61. package/dist/bundle/{chunk-NEK7LKC6.js → chunk-KUY7LII2.js} +4 -4
  62. package/dist/bundle/{chunk-NDSOBIR3.js → chunk-LFXDHLFR.js} +3 -3
  63. package/dist/bundle/{chunk-ZU4HXKEW.js → chunk-LGLT4JB6.js} +3 -3
  64. package/dist/bundle/{chunk-EIGPMMGC.js → chunk-LM4OOBAW.js} +3 -3
  65. package/dist/bundle/chunk-M74BSKMA.js +234 -0
  66. package/dist/bundle/{chunk-MPI2FDJ4.js → chunk-MMMT6ORT.js} +11 -11
  67. package/dist/bundle/{chunk-F5NH3UJQ.js → chunk-NGYD6QTE.js} +2 -2
  68. package/dist/bundle/{chunk-6ERX33NC.js → chunk-NO6QOPVT.js} +10 -19
  69. package/dist/bundle/chunk-O6XC7DZI.js +804 -0
  70. package/dist/bundle/chunk-OE3NFB53.js +64 -0
  71. package/dist/bundle/{chunk-VTIUWHZ3.js → chunk-OUMFNB34.js} +13 -149
  72. package/dist/bundle/{chunk-VMQL4GNH.js → chunk-P2RQTNVJ.js} +806 -850
  73. package/dist/bundle/{chunk-XKQZLR2X.js → chunk-PBIBGIZ7.js} +1 -1
  74. package/dist/bundle/{chunk-YFZXI3NN.js → chunk-Q6VQHTRW.js} +2 -2
  75. package/dist/bundle/{chunk-OKDC6CLH.js → chunk-QHBCNVUG.js} +5 -5
  76. package/dist/bundle/{chunk-WJRBX5QB.js → chunk-QNOXAQ6Y.js} +4 -4
  77. package/dist/bundle/{chunk-GTFRSYYJ.js → chunk-R5F2O5GX.js} +7 -269
  78. package/dist/bundle/{chunk-OCRCVLZQ.js → chunk-R5PBSKJL.js} +1 -1
  79. package/dist/bundle/{chunk-JB7OXYAU.js → chunk-RS2BARUU.js} +4 -4
  80. package/dist/bundle/chunk-TG3DSPT5.js +14 -0
  81. package/dist/bundle/{chunk-UH56WLDS.js → chunk-U22JMKUO.js} +6 -125
  82. package/dist/bundle/chunk-U66Q5TVK.js +106 -0
  83. package/dist/bundle/{chunk-NWKXMMON.js → chunk-UCHMQWON.js} +136 -33
  84. package/dist/bundle/{chunk-DQIQIZQS.js → chunk-VMJS7FJZ.js} +451 -433
  85. package/dist/bundle/{chunk-IWEWDVZ6.js → chunk-VMVAQHDC.js} +77 -615
  86. package/dist/bundle/{chunk-M5XMAUGZ.js → chunk-WWMCJFMT.js} +2 -2
  87. package/dist/bundle/{chunk-OYLJHX74.js → chunk-XTA5TN3H.js} +1 -1
  88. package/dist/bundle/{chunk-ELBOQHJA.js → chunk-XUHHBEA7.js} +652 -131
  89. package/dist/bundle/{chunk-BHZ5VDDY.js → chunk-YDZHO4LT.js} +13 -13
  90. package/dist/bundle/{chunk-NKLLI4B2.js → chunk-ZKINZFIT.js} +6 -6
  91. package/dist/bundle/{chunk-GTDOUP6L.js → chunk-ZSQXSIFQ.js} +85 -38
  92. package/dist/bundle/{chunk-LAYH344Y.js → chunk-ZZEHDIEG.js} +58 -54
  93. package/dist/bundle/command-contract-OQV6H7SR.js +36 -0
  94. package/dist/bundle/{decode-IF2F2SFC.js → decode-QSTBX4MG.js} +3 -3
  95. package/dist/bundle/{echarts-WDDVEJO2.js → echarts-JZELFH2N.js} +2 -2
  96. package/dist/bundle/{embed-VDUGYEAR.js → embed-4RIW2LVH.js} +4 -4
  97. package/dist/bundle/{embedder-DUN62H3Z.js → embedder-SW7DTWSL.js} +7 -7
  98. package/dist/bundle/{first-run-NDGYBQEN.js → first-run-7AISOSOM.js} +8 -8
  99. package/dist/bundle/first-screen-NMHNFZ2B.js +34 -0
  100. package/dist/bundle/{instructions-JIIKWS7X.js → instructions-BZE5YUGG.js} +1 -1
  101. package/dist/bundle/{mcp-33JX6KP4.js → mcp-SDWHDJTY.js} +2 -2
  102. package/dist/bundle/{node-P4E63KXA.js → node-KM3CUABH.js} +9 -9
  103. package/dist/bundle/{node-K57WT42O.js → node-LTKZIO4U.js} +2 -2
  104. package/dist/bundle/{node-sqlite-KS6ORRIG.js → node-sqlite-HQ5PN2RH.js} +4 -4
  105. package/dist/bundle/{oauth-SLSANN37.js → oauth-UH6FOZQL.js} +5 -5
  106. package/dist/bundle/{open-WJPHADEX.js → open-TSUP3XGL.js} +3 -3
  107. package/dist/bundle/{openai-HXB3GTOD.js → openai-GVEE52E3.js} +14 -14
  108. package/dist/bundle/{process-P73TFAXT.js → process-AGXY76ZE.js} +1 -1
  109. package/dist/bundle/{program-7BMG5NIN.js → program-BI4A4HFJ.js} +1045 -1048
  110. package/dist/bundle/{prompt-WDPV37R4.js → prompt-NRSUY7FA.js} +3 -3
  111. package/dist/bundle/{recognize-CXIFL6IV.js → recognize-NPDPQ6PJ.js} +2 -2
  112. package/dist/bundle/{remote-Q4VJ4OQW.js → remote-HFASMVLB.js} +5 -5
  113. package/dist/bundle/{rerank-SUFYK63I.js → rerank-TL6Z6F7K.js} +5 -5
  114. package/dist/bundle/{chunk-XG6QKS7L.js → serve-VB4DHDZQ.js} +8 -6
  115. package/dist/bundle/server-T5EDRPJI.js +68 -0
  116. package/dist/bundle/{chunk-K7XWCZF6.js → server-Z6MW6C37.js} +50 -14
  117. package/dist/bundle/source-4IGO5J7E.js +237 -0
  118. package/dist/bundle/sqlite-runtime-YS4POY3W.js +17 -0
  119. package/dist/bundle/{state-EZCCXQV7.js → state-ISZVVZGR.js} +4 -4
  120. package/dist/bundle/store-IZJBAKJV.js +58 -0
  121. package/dist/bundle/{store-MZ7JBYR6.js → store-L76MSQC3.js} +17 -12
  122. package/dist/bundle/store-PBTIB7BD.js +207 -0
  123. package/dist/bundle/store-maintenance-command-YFKII7TF.js +58 -0
  124. package/dist/bundle/writer-3O5EYMFE.js +214 -0
  125. package/dist/commands/api.d.ts.map +1 -1
  126. package/dist/commands/api.js +34 -33
  127. package/dist/commands/api.js.map +1 -1
  128. package/dist/commands/crm-shared.d.ts +4 -0
  129. package/dist/commands/crm-shared.d.ts.map +1 -0
  130. package/dist/commands/crm-shared.js +94 -0
  131. package/dist/commands/crm-shared.js.map +1 -0
  132. package/dist/commands/crm-writes.d.ts +0 -1
  133. package/dist/commands/crm-writes.d.ts.map +1 -1
  134. package/dist/commands/crm-writes.js +31 -92
  135. package/dist/commands/crm-writes.js.map +1 -1
  136. package/dist/commands/crm.d.ts.map +1 -1
  137. package/dist/commands/crm.js +1 -45
  138. package/dist/commands/crm.js.map +1 -1
  139. package/dist/commands/session.d.ts.map +1 -1
  140. package/dist/commands/session.js +1 -0
  141. package/dist/commands/session.js.map +1 -1
  142. package/dist/commands/write.d.ts +1 -6
  143. package/dist/commands/write.d.ts.map +1 -1
  144. package/dist/commands/write.js +7 -16
  145. package/dist/commands/write.js.map +1 -1
  146. package/dist/config.d.ts +0 -5
  147. package/dist/config.d.ts.map +1 -1
  148. package/dist/config.js +6 -9
  149. package/dist/config.js.map +1 -1
  150. package/dist/crm/capabilities.d.ts +7 -0
  151. package/dist/crm/capabilities.d.ts.map +1 -0
  152. package/dist/crm/capabilities.js +7 -0
  153. package/dist/crm/capabilities.js.map +1 -0
  154. package/dist/crm/conditions.d.ts +1 -1
  155. package/dist/crm/conditions.d.ts.map +1 -1
  156. package/dist/crm/conditions.js +3 -5
  157. package/dist/crm/conditions.js.map +1 -1
  158. package/dist/crm/custom-query.d.ts +1 -1
  159. package/dist/crm/custom-query.d.ts.map +1 -1
  160. package/dist/crm/custom-query.js +2 -2
  161. package/dist/crm/custom-query.js.map +1 -1
  162. package/dist/crm/deal.d.ts +4 -28
  163. package/dist/crm/deal.d.ts.map +1 -1
  164. package/dist/crm/deal.js +15 -48
  165. package/dist/crm/deal.js.map +1 -1
  166. package/dist/crm/fields.d.ts +2 -26
  167. package/dist/crm/fields.d.ts.map +1 -1
  168. package/dist/crm/fields.js +2 -67
  169. package/dist/crm/fields.js.map +1 -1
  170. package/dist/crm/items.d.ts.map +1 -1
  171. package/dist/crm/items.js +6 -5
  172. package/dist/crm/items.js.map +1 -1
  173. package/dist/crm/lead.d.ts +5 -37
  174. package/dist/crm/lead.d.ts.map +1 -1
  175. package/dist/crm/lead.js +15 -61
  176. package/dist/crm/lead.js.map +1 -1
  177. package/dist/crm/pipelines.d.ts +5 -0
  178. package/dist/crm/pipelines.d.ts.map +1 -0
  179. package/dist/crm/pipelines.js +54 -0
  180. package/dist/crm/pipelines.js.map +1 -0
  181. package/dist/crm/product.d.ts.map +1 -1
  182. package/dist/crm/product.js +2 -2
  183. package/dist/crm/product.js.map +1 -1
  184. package/dist/crm/rest3-fields.d.ts +3 -0
  185. package/dist/crm/rest3-fields.d.ts.map +1 -0
  186. package/dist/crm/rest3-fields.js +38 -0
  187. package/dist/crm/rest3-fields.js.map +1 -0
  188. package/dist/crm/source.d.ts +15 -0
  189. package/dist/crm/source.d.ts.map +1 -0
  190. package/dist/crm/source.js +122 -0
  191. package/dist/crm/source.js.map +1 -0
  192. package/dist/crm/user.d.ts.map +1 -1
  193. package/dist/crm/user.js +2 -2
  194. package/dist/crm/user.js.map +1 -1
  195. package/dist/crm/values.d.ts +19 -4
  196. package/dist/crm/values.d.ts.map +1 -1
  197. package/dist/crm/values.js +28 -2
  198. package/dist/crm/values.js.map +1 -1
  199. package/dist/crm/writer.d.ts +9 -0
  200. package/dist/crm/writer.d.ts.map +1 -0
  201. package/dist/crm/writer.js +119 -0
  202. package/dist/crm/writer.js.map +1 -0
  203. package/dist/program.d.ts.map +1 -1
  204. package/dist/program.js +51 -6
  205. package/dist/program.js.map +1 -1
  206. package/dist/store.d.ts +15 -0
  207. package/dist/store.d.ts.map +1 -0
  208. package/dist/store.js +33 -0
  209. package/dist/store.js.map +1 -0
  210. package/dist/version.d.ts +1 -1
  211. package/dist/version.js +1 -1
  212. package/package.json +4 -6
  213. package/skills/bitrix24-cli/SKILL.md +16 -15
  214. package/dist/bundle/all-profiles-MBQZCOVK.js +0 -24
  215. package/dist/bundle/chunk-UCLWWSQK.js +0 -48
  216. package/dist/bundle/command-contract-UON4EIC4.js +0 -30
  217. package/dist/bundle/first-screen-QAVKP5RF.js +0 -28
  218. package/dist/bundle/mcp-57EQ6QJO.js +0 -171
  219. package/dist/bundle/mcp-PFJER2DE.js +0 -87
  220. package/dist/bundle/serve-B7PGFOC2.js +0 -19
  221. package/dist/bundle/server-4DBNJWW6.js +0 -58
  222. package/dist/bundle/server-OKE7SXJ2.js +0 -45
  223. package/dist/bundle/store-maintenance-command-T5QZMENJ.js +0 -47
  224. package/dist/commands/doctor.d.ts +0 -77
  225. package/dist/commands/doctor.d.ts.map +0 -1
  226. package/dist/commands/doctor.js +0 -74
  227. package/dist/commands/doctor.js.map +0 -1
  228. package/dist/commands/fields.d.ts +0 -3
  229. package/dist/commands/fields.d.ts.map +0 -1
  230. package/dist/commands/fields.js +0 -45
  231. package/dist/commands/fields.js.map +0 -1
  232. package/dist/commands/mcp.d.ts +0 -3
  233. package/dist/commands/mcp.d.ts.map +0 -1
  234. package/dist/commands/mcp.js +0 -97
  235. package/dist/commands/mcp.js.map +0 -1
  236. package/dist/crm/pipeline.d.ts +0 -17
  237. package/dist/crm/pipeline.d.ts.map +0 -1
  238. package/dist/crm/pipeline.js +0 -42
  239. package/dist/crm/pipeline.js.map +0 -1
  240. package/dist/crm/stage.d.ts +0 -20
  241. package/dist/crm/stage.d.ts.map +0 -1
  242. package/dist/crm/stage.js +0 -65
  243. package/dist/crm/stage.js.map +0 -1
  244. package/dist/mcp.d.ts +0 -29
  245. package/dist/mcp.d.ts.map +0 -1
  246. package/dist/mcp.js +0 -102
  247. package/dist/mcp.js.map +0 -1
  248. /package/dist/bundle/{chunk-NDTJE6JQ.js → chunk-ZQ3GWKDQ.js} +0 -0
@@ -1,40 +1,8 @@
1
- import * as v from "valibot";
2
- import type { FieldMap } from "./conditions.js";
1
+ import type { CrmItem, CrmPipeline } from "@wirecat/cli-core";
3
2
  import type { ItemType } from "./items.js";
4
3
  import { type Metadata, type Raw } from "./values.js";
5
- export declare const leadSchema: v.StrictObjectSchema<{
6
- readonly id: v.StringSchema<undefined>;
7
- readonly title: v.NullableSchema<v.StringSchema<undefined>, undefined>;
8
- readonly name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
9
- readonly organization_name: v.NullableSchema<v.StringSchema<undefined>, undefined>;
10
- readonly stage_id: v.NullableSchema<v.StringSchema<undefined>, undefined>;
11
- readonly outcome: v.PicklistSchema<readonly ["open", "won", "lost"], undefined>;
12
- readonly amount: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
13
- readonly currency: v.NullableSchema<v.StringSchema<undefined>, undefined>;
14
- readonly assigned_to: v.NullableSchema<v.StringSchema<undefined>, undefined>;
15
- readonly organization_id: v.NullableSchema<v.StringSchema<undefined>, undefined>;
16
- readonly person_ids: v.ArraySchema<v.StringSchema<undefined>, undefined>;
17
- readonly phones: v.OptionalSchema<v.ArraySchema<v.StrictObjectSchema<{
18
- readonly type: v.NullableSchema<v.StringSchema<undefined>, undefined>;
19
- readonly value: v.StringSchema<undefined>;
20
- }, undefined>, undefined>, undefined>;
21
- readonly emails: v.OptionalSchema<v.ArraySchema<v.StrictObjectSchema<{
22
- readonly type: v.NullableSchema<v.StringSchema<undefined>, undefined>;
23
- readonly value: v.StringSchema<undefined>;
24
- }, undefined>, undefined>, undefined>;
25
- readonly source_id: v.NullableSchema<v.StringSchema<undefined>, undefined>;
26
- readonly created_at: 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>;
27
- readonly updated_at: 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>;
28
- readonly url: v.NullableSchema<v.StringSchema<undefined>, undefined>;
29
- readonly provider_metadata: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StrictObjectSchema<{
30
- readonly label: v.NullableSchema<v.StringSchema<undefined>, undefined>;
31
- readonly value: v.UnknownSchema;
32
- readonly option_id: v.OptionalSchema<v.UnionSchema<[v.StringSchema<undefined>, v.ArraySchema<v.StringSchema<undefined>, undefined>], undefined>, undefined>;
33
- }, undefined>, undefined>, undefined>;
34
- }, undefined>;
35
- export type Lead = v.InferOutput<typeof leadSchema>;
36
- export declare const LEAD_FIELDS: Record<string, FieldMap>;
37
- /** Phones and emails come from REST 3.0 only; REST 2's crm.item.list leaves them out, so they are left out here too. */
38
- export declare const fromBitrixLead: (raw: Raw, metadata?: Metadata) => Lead;
39
- export declare const LEAD: ItemType<Lead>;
4
+ /** Bitrix24's leads have no pipelines, only the one list of lead stages: core gets one pipeline of b24's making. */
5
+ export declare const LEAD_PIPELINE: Omit<CrmPipeline, "stages">;
6
+ export declare const fromBitrixLead: (raw: Raw, metadata?: Metadata) => CrmItem;
7
+ export declare const LEAD: ItemType<CrmItem>;
40
8
  //# sourceMappingURL=lead.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lead.d.ts","sourceRoot":"","sources":["../../src/crm/lead.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAML,KAAK,QAAQ,EAMb,KAAK,GAAG,EAGT,MAAM,aAAa,CAAA;AAEpB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAmBrB,CAAA;AAEF,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,UAAU,CAAC,CAAA;AAEnD,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAWhD,CAAA;AAED,wHAAwH;AACxH,eAAO,MAAM,cAAc,QAAS,GAAG,aAAa,QAAQ,KAAG,IAmB7D,CAAA;AAEF,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,IAAI,CA4B/B,CAAA"}
1
+ {"version":3,"file":"lead.d.ts","sourceRoot":"","sources":["../../src/crm/lead.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAA4B,KAAK,QAAQ,EAAE,KAAK,GAAG,EAAQ,MAAM,aAAa,CAAA;AAErF,oHAAoH;AACpH,eAAO,MAAM,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAsC,CAAA;AAE5F,eAAO,MAAM,cAAc,QAAS,GAAG,aAAa,QAAQ,KAAG,OAa7D,CAAA;AAEF,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,OAAO,CAoBlC,CAAA"}
package/dist/crm/lead.js CHANGED
@@ -1,57 +1,19 @@
1
- import * as v from "valibot";
2
- import { contactSchema, contacts, fullName, id, ids, metadataSchema, nullableTime, number, OUTCOMES, outcomeOf, text, time, } from "./values.js";
3
- export const leadSchema = v.strictObject({
4
- id: v.string(),
5
- title: v.nullable(v.string()),
6
- name: v.nullable(v.string()),
7
- organization_name: v.nullable(v.string()),
8
- stage_id: v.nullable(v.string()),
9
- outcome: v.picklist(OUTCOMES),
10
- amount: v.nullable(v.number()),
11
- currency: v.nullable(v.string()),
12
- assigned_to: v.nullable(v.string()),
13
- organization_id: v.nullable(v.string()),
14
- person_ids: v.array(v.string()),
15
- phones: v.optional(v.array(contactSchema)),
16
- emails: v.optional(v.array(contactSchema)),
17
- source_id: v.nullable(v.string()),
18
- created_at: nullableTime,
19
- updated_at: nullableTime,
20
- url: v.nullable(v.string()),
21
- provider_metadata: metadataSchema,
22
- });
23
- export const LEAD_FIELDS = {
24
- title: { field: "title", kind: "word" },
25
- stage_id: { field: "stageId", kind: "text" },
26
- outcome: { field: "stageSemanticId", kind: "outcome" },
27
- amount: { field: "opportunity", kind: "number" },
28
- currency: { field: "currencyId", kind: "text" },
29
- assigned_to: { field: "assignedById", kind: "id" },
30
- organization_id: { field: "companyId", kind: "id" },
31
- source_id: { field: "sourceId", kind: "text" },
32
- created_at: { field: "createdTime", kind: "time" },
33
- updated_at: { field: "updatedTime", kind: "time" },
34
- };
35
- /** Phones and emails come from REST 3.0 only; REST 2's crm.item.list leaves them out, so they are left out here too. */
1
+ import { amountOf, epoch, id, ids, text } from "./values.js";
2
+ /** Bitrix24's leads have no pipelines, only the one list of lead stages: core gets one pipeline of b24's making. */
3
+ export const LEAD_PIPELINE = { externalId: "0", name: "Leads" };
36
4
  export const fromBitrixLead = (raw, metadata) => ({
37
- id: id(raw.id) ?? "",
38
- title: text(raw.title),
39
- name: fullName(raw.name, raw.secondName, raw.lastName),
40
- organization_name: text(raw.companyTitle),
41
- stage_id: text(raw.stageId),
42
- outcome: outcomeOf(raw.stageSemanticId),
43
- amount: number(raw.opportunity),
44
- currency: text(raw.currencyId),
45
- assigned_to: id(raw.assignedById),
46
- organization_id: id(raw.companyId),
47
- person_ids: ids(raw.contactsId),
48
- ...(Array.isArray(raw.phone) ? { phones: contacts(raw.phone) } : {}),
49
- ...(Array.isArray(raw.email) ? { emails: contacts(raw.email) } : {}),
50
- source_id: text(raw.sourceId),
51
- created_at: time(raw.createdTime),
52
- updated_at: time(raw.updatedTime),
5
+ externalId: id(raw.id) ?? "",
6
+ title: text(raw.title) ?? "",
7
+ pipeline: LEAD_PIPELINE.externalId,
8
+ stage: text(raw.stageId) ?? "",
9
+ ...amountOf(raw.opportunity, raw.currencyId),
10
+ organization: id(raw.companyId),
11
+ people: ids(raw.contactsId).map((externalId) => ({ externalId, role: "contact" })),
12
+ createdAt: epoch(raw.createdTime),
13
+ updatedAt: epoch(raw.updatedTime),
53
14
  url: text(raw.url),
54
- ...(metadata ? { provider_metadata: metadata } : {}),
15
+ assignee: id(raw.assignedById),
16
+ ...(metadata ? { metadata } : {}),
55
17
  });
56
18
  export const LEAD = {
57
19
  type: "lead",
@@ -60,23 +22,15 @@ export const LEAD = {
60
22
  select: [
61
23
  "id",
62
24
  "title",
63
- "name",
64
- "secondName",
65
- "lastName",
66
- "companyTitle",
67
25
  "stageId",
68
- "stageSemanticId",
69
26
  "opportunity",
70
27
  "currencyId",
71
- "assignedById",
72
28
  "companyId",
73
29
  "contactsId",
74
- "phone",
75
- "email",
76
- "sourceId",
77
30
  "createdTime",
78
31
  "updatedTime",
79
32
  "url",
33
+ "assignedById",
80
34
  ],
81
35
  words: ["title"],
82
36
  nameOf: (lead) => lead.title,
@@ -1 +1 @@
1
- {"version":3,"file":"lead.js","sourceRoot":"","sources":["../../src/crm/lead.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAG5B,OAAO,EACL,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,EAAE,EACF,GAAG,EAEH,cAAc,EACd,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,SAAS,EAET,IAAI,EACJ,IAAI,GACL,MAAM,aAAa,CAAA;AAEpB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,YAAY,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5B,iBAAiB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACzC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAChC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAChC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACnC,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACvC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/B,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC1C,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjC,UAAU,EAAE,YAAY;IACxB,UAAU,EAAE,YAAY;IACxB,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC3B,iBAAiB,EAAE,cAAc;CAClC,CAAC,CAAA;AAIF,MAAM,CAAC,MAAM,WAAW,GAA6B;IACnD,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;IACvC,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE;IAC5C,OAAO,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE;IACtD,MAAM,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE;IAChD,QAAQ,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE;IAC/C,WAAW,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE;IAClD,eAAe,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE;IACnD,SAAS,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE;IAC9C,UAAU,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE;IAClD,UAAU,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE;CACnD,CAAA;AAED,wHAAwH;AACxH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAQ,EAAE,QAAmB,EAAQ,EAAE,CAAC,CAAC;IACtE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;IACpB,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IACtB,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC;IACtD,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC;IACzC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;IAC3B,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;IAC/B,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;IAC9B,WAAW,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC;IACjC,eAAe,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;IAClC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC;IAC/B,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC7B,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;IACjC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;IACjC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAClB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CACrD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,IAAI,GAAmB;IAClC,IAAI,EAAE,MAAM;IACZ,YAAY,EAAE,CAAC;IACf,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE;QACN,IAAI;QACJ,OAAO;QACP,MAAM;QACN,YAAY;QACZ,UAAU;QACV,cAAc;QACd,SAAS;QACT,iBAAiB;QACjB,aAAa;QACb,YAAY;QACZ,cAAc;QACd,WAAW;QACX,YAAY;QACZ,OAAO;QACP,OAAO;QACP,UAAU;QACV,aAAa;QACb,aAAa;QACb,KAAK;KACN;IACD,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK;IAC5B,GAAG,EAAE,cAAc;CACpB,CAAA"}
1
+ {"version":3,"file":"lead.js","sourceRoot":"","sources":["../../src/crm/lead.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAA2B,IAAI,EAAE,MAAM,aAAa,CAAA;AAErF,oHAAoH;AACpH,MAAM,CAAC,MAAM,aAAa,GAAgC,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;AAE5F,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAQ,EAAE,QAAmB,EAAW,EAAE,CAAC,CAAC;IACzE,UAAU,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;IAC5B,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;IAC5B,QAAQ,EAAE,aAAa,CAAC,UAAU;IAClC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;IAC9B,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC;IAC5C,YAAY,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;IAC/B,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,SAAkB,EAAE,CAAC,CAAC;IAC3F,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;IACjC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;IACjC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAClB,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC;IAC9B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CAClC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,IAAI,GAAsB;IACrC,IAAI,EAAE,MAAM;IACZ,YAAY,EAAE,CAAC;IACf,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE;QACN,IAAI;QACJ,OAAO;QACP,SAAS;QACT,aAAa;QACb,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,aAAa;QACb,aAAa;QACb,KAAK;QACL,cAAc;KACf;IACD,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK;IAC5B,GAAG,EAAE,cAAc;CACpB,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { CrmPipeline } from "@wirecat/cli-core";
2
+ import type { BitrixTransport } from "../bitrix/transport.js";
3
+ /** Deal pipelines are Bitrix24's deal categories, the default one id 0; leads get the one pipeline b24 makes them. */
4
+ export declare const bitrixPipelines: (portal: BitrixTransport, kind: "deal" | "lead") => Promise<CrmPipeline[]>;
5
+ //# sourceMappingURL=pipelines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipelines.d.ts","sourceRoot":"","sources":["../../src/crm/pipelines.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAY,MAAM,mBAAmB,CAAA;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAoC7D,sHAAsH;AACtH,eAAO,MAAM,eAAe,WAAkB,eAAe,QAAQ,MAAM,GAAG,MAAM,KAAG,OAAO,CAAC,WAAW,EAAE,CAc3G,CAAA"}
@@ -0,0 +1,54 @@
1
+ import { LEAD_PIPELINE } from "./lead.js";
2
+ import { number, outcomeOf, text } from "./values.js";
3
+ /** Lead stages are the `STATUS` directory; deal stages `DEAL_STAGE` for pipeline 0 and `DEAL_STAGE_<id>` for the rest. */
4
+ const directoryOf = (pipeline) => (pipeline === "0" ? "DEAL_STAGE" : `DEAL_STAGE_${pipeline}`);
5
+ /** One directory's stages, every page: REST 2 answers 50 rows at a time with `next`. */
6
+ const stagesOf = async (portal, directory) => {
7
+ const rows = [];
8
+ for (let start = 0;;) {
9
+ const answer = await portal.call("crm.status.list", {
10
+ filter: { ENTITY_ID: directory },
11
+ order: { SORT: "ASC" },
12
+ start,
13
+ });
14
+ if (Array.isArray(answer.result))
15
+ for (const row of answer.result)
16
+ rows.push(row);
17
+ if (answer.next === undefined || answer.next <= start)
18
+ break;
19
+ start = answer.next;
20
+ }
21
+ return rows.flatMap((raw) => {
22
+ const externalId = text(raw.STATUS_ID);
23
+ if (externalId === null)
24
+ return [];
25
+ const extra = (raw.EXTRA ?? {});
26
+ // The outcome comes from the stage's semantics, never its name (apidocs crm.status.fields).
27
+ return [
28
+ {
29
+ externalId,
30
+ name: text(raw.NAME) ?? externalId,
31
+ position: number(raw.SORT) ?? 0,
32
+ outcome: outcomeOf(raw.SEMANTICS ?? extra.SEMANTICS),
33
+ },
34
+ ];
35
+ });
36
+ };
37
+ /** Deal pipelines are Bitrix24's deal categories, the default one id 0; leads get the one pipeline b24 makes them. */
38
+ export const bitrixPipelines = async (portal, kind) => {
39
+ if (kind === "lead")
40
+ return [{ ...LEAD_PIPELINE, stages: await stagesOf(portal, "STATUS") }];
41
+ const answer = await portal.call("crm.category.list", { entityTypeId: 2 });
42
+ const categories = answer.result?.categories;
43
+ const pipelines = [];
44
+ for (const raw of Array.isArray(categories) ? categories : []) {
45
+ const externalId = text(raw.id) ?? "0";
46
+ pipelines.push({
47
+ externalId,
48
+ name: text(raw.name) ?? `Pipeline ${externalId}`,
49
+ stages: await stagesOf(portal, directoryOf(externalId)),
50
+ });
51
+ }
52
+ return pipelines;
53
+ };
54
+ //# sourceMappingURL=pipelines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipelines.js","sourceRoot":"","sources":["../../src/crm/pipelines.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAY,IAAI,EAAE,MAAM,aAAa,CAAA;AAE/D,0HAA0H;AAC1H,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,QAAQ,EAAE,CAAC,CAAA;AAEtG,wFAAwF;AACxF,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAuB,EAAE,SAAiB,EAAuB,EAAE;IACzF,MAAM,IAAI,GAAU,EAAE,CAAA;IACtB,KAAK,IAAI,KAAK,GAAG,CAAC,IAAM,CAAC;QACvB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAClD,MAAM,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE;YAChC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;YACtB,KAAK;SACN,CAAC,CAAA;QACF,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAe;gBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC1F,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,IAAI,KAAK;YAAE,MAAK;QAC5D,KAAK,GAAG,MAAM,CAAC,IAAI,CAAA;IACrB,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACtC,IAAI,UAAU,KAAK,IAAI;YAAE,OAAO,EAAE,CAAA;QAClC,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAQ,CAAA;QACtC,4FAA4F;QAC5F,OAAO;YACL;gBACE,UAAU;gBACV,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,UAAU;gBAClC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC/B,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;aACrD;SACF,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,sHAAsH;AACtH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,MAAuB,EAAE,IAAqB,EAA0B,EAAE;IAC9G,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,CAAC,EAAE,GAAG,aAAa,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC5F,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAA;IAC1E,MAAM,UAAU,GAAI,MAAM,CAAC,MAAmC,EAAE,UAAU,CAAA;IAC1E,MAAM,SAAS,GAAkB,EAAE,CAAA;IACnC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAE,UAAoB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACzE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAAA;QACtC,SAAS,CAAC,IAAI,CAAC;YACb,UAAU;YACV,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,YAAY,UAAU,EAAE;YAChD,MAAM,EAAE,MAAM,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;SACxD,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"product.d.ts","sourceRoot":"","sources":["../../src/crm/product.ts"],"names":[],"mappings":"AAAA,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,EAAc,KAAK,GAAG,EAAa,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,WAAW,CAAA;AAE7C,eAAO,MAAM,aAAa;;;;;;;aAOxB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,aAAa,CAAC,CAAA;AAEzD,eAAO,MAAM,cAAc;aACzB,IAAI;iBAAI,KAAK,EAAE,MAAM;iBAAE,IAAI,EAAE,MAAM;;aACnC,MAAM;iBAAI,KAAK,EAAE,QAAQ;iBAAE,IAAI,EAAE,MAAM;;aACvC,UAAU;iBAAI,KAAK,EAAE,YAAY;iBAAE,IAAI,EAAE,IAAI;;CACrC,CAAA;AAIV,uGAAuG;AACvG,eAAO,MAAM,iBAAiB,QAAS,GAAG,KAAG,OAO3C,CAAA;AAKF,eAAO,MAAM,YAAY,WAAkB,eAAe,cAAc,SAAS,SAAS,EAAE,UAAU,MAAM;;;;;;;;;;EAW3G,CAAA;AAED,eAAO,MAAM,UAAU,WAAkB,eAAe,aAAa,MAAM,KAAG,OAAO,CAAC,OAAO,CACO,CAAA"}
1
+ {"version":3,"file":"product.d.ts","sourceRoot":"","sources":["../../src/crm/product.ts"],"names":[],"mappings":"AAAA,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,EAAyB,KAAK,GAAG,EAAa,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,WAAW,CAAA;AAE7C,eAAO,MAAM,aAAa;;;;;;;aAOxB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,aAAa,CAAC,CAAA;AAEzD,eAAO,MAAM,cAAc;aACzB,IAAI;iBAAI,KAAK,EAAE,MAAM;iBAAE,IAAI,EAAE,MAAM;;aACnC,MAAM;iBAAI,KAAK,EAAE,QAAQ;iBAAE,IAAI,EAAE,MAAM;;aACvC,UAAU;iBAAI,KAAK,EAAE,YAAY;iBAAE,IAAI,EAAE,IAAI;;CACrC,CAAA;AAIV,uGAAuG;AACvG,eAAO,MAAM,iBAAiB,QAAS,GAAG,KAAG,OAO3C,CAAA;AAKF,eAAO,MAAM,YAAY,WAAkB,eAAe,cAAc,SAAS,SAAS,EAAE,UAAU,MAAM;;;;;;;;;;EAW3G,CAAA;AAED,eAAO,MAAM,UAAU,WAAkB,eAAe,aAAa,MAAM,KAAG,OAAO,CAAC,OAAO,CAC2B,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import * as v from "valibot";
2
2
  import { rest2Filter } from "./conditions.js";
3
- import { id, number, text, yes } from "./values.js";
3
+ import { id, number, numericId, text, yes } from "./values.js";
4
4
  import { walk } from "./walk.js";
5
5
  export const productSchema = v.strictObject({
6
6
  id: v.string(),
@@ -38,5 +38,5 @@ export const listProducts = async (portal, conditions, window) => {
38
38
  });
39
39
  return { items: items.map(fromBitrixProduct), has_more };
40
40
  };
41
- export const getProduct = async (portal, reference) => fromBitrixProduct((await portal.call("crm.product.get", { id: Number(reference) })).result);
41
+ export const getProduct = async (portal, reference) => fromBitrixProduct((await portal.call("crm.product.get", { id: numericId(reference, "products show") })).result);
42
42
  //# sourceMappingURL=product.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"product.js","sourceRoot":"","sources":["../../src/crm/product.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"product.js","sourceRoot":"","sources":["../../src/crm/product.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ItemType } from "./items.js";
2
+ export declare const REST3_FIELDS: Record<ItemType<unknown>["type"], readonly string[]>;
3
+ //# sourceMappingURL=rest3-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest3-fields.d.ts","sourceRoot":"","sources":["../../src/crm/rest3-fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAQ1C,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CA8B7E,CAAA"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The REST 3.0 fields b24 may name, per type, from the field pages: REST 3.0 refuses the whole call over one unknown
3
+ * field (BITRIX_REST_V3_EXCEPTION_UNKNOWNDTOPROPERTYEXCEPTION, seen live 2026-11-06).
4
+ * https://apidocs.bitrix24.com/api-reference/crm/rest-v3/items/fields-deal.html (and fields-lead, -contact, -company)
5
+ */
6
+ const COMMON = ["id", "title", "createdTime", "updatedTime", "assignedById", "url", "phone", "email"];
7
+ export const REST3_FIELDS = {
8
+ deal: [
9
+ ...COMMON,
10
+ "categoryId",
11
+ "stageId",
12
+ "stageSemanticId",
13
+ "opportunity",
14
+ "currencyId",
15
+ "companyId",
16
+ "contactsId",
17
+ "closeTime",
18
+ "sourceId",
19
+ "typeId",
20
+ ],
21
+ lead: [
22
+ ...COMMON,
23
+ "name",
24
+ "secondName",
25
+ "lastName",
26
+ "companyTitle",
27
+ "stageId",
28
+ "stageSemanticId",
29
+ "opportunity",
30
+ "currencyId",
31
+ "companyId",
32
+ "contactsId",
33
+ "sourceId",
34
+ ],
35
+ contact: [...COMMON, "name", "secondName", "lastName", "post", "companyId", "companiesId", "typeId", "sourceId"],
36
+ company: [...COMMON, "typeId", "industryId", "revenue", "currencyId", "contactsId"],
37
+ };
38
+ //# sourceMappingURL=rest3-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest3-fields.js","sourceRoot":"","sources":["../../src/crm/rest3-fields.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;AACrG,MAAM,CAAC,MAAM,YAAY,GAAyD;IAChF,IAAI,EAAE;QACJ,GAAG,MAAM;QACT,YAAY;QACZ,SAAS;QACT,iBAAiB;QACjB,aAAa;QACb,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,WAAW;QACX,UAAU;QACV,QAAQ;KACT;IACD,IAAI,EAAE;QACJ,GAAG,MAAM;QACT,MAAM;QACN,YAAY;QACZ,UAAU;QACV,cAAc;QACd,SAAS;QACT,iBAAiB;QACjB,aAAa;QACb,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,UAAU;KACX;IACD,OAAO,EAAE,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,CAAC;IAChH,OAAO,EAAE,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC;CACpF,CAAA"}
@@ -0,0 +1,15 @@
1
+ import type { CrmField, CrmItem, CrmKind } from "@wirecat/cli-core";
2
+ import type { CrmSource } from "@wirecat/cli-core/crm";
3
+ import type { BitrixTransport } from "../bitrix/transport.js";
4
+ export interface BitrixCrmSource extends CrmSource {
5
+ /** One deal or lead as the portal holds it now, custom fields included: what a write answers. */
6
+ item(kind: "deal" | "lead", externalId: string): Promise<CrmItem>;
7
+ /** The portal's custom fields of a kind, read once per source. */
8
+ fields(kind: CrmKind): Promise<CrmField[]>;
9
+ }
10
+ /**
11
+ * The portal's CRM for core's sync: REST 3.0 lists by id with `updatedTime` for changes, since a webhook gets no
12
+ * event feed, and a list of every id to find deletions.
13
+ */
14
+ export declare const bitrixCrmSource: (portal: () => BitrixTransport, now?: () => number) => BitrixCrmSource;
15
+ //# sourceMappingURL=source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/crm/source.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAA0C,MAAM,mBAAmB,CAAA;AAC3G,OAAO,KAAK,EAAyB,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAiD7D,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,iGAAiG;IACjG,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACjE,kEAAkE;IAClE,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;CAC3C;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,WAAY,MAAM,eAAe,QAAO,MAAM,MAAM,KAAc,eAyE7F,CAAA"}
@@ -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 {
@@ -41,4 +51,9 @@ export declare const metadataSchema: v.OptionalSchema<v.RecordSchema<v.StringSch
41
51
  readonly option_id: v.OptionalSchema<v.UnionSchema<[v.StringSchema<undefined>, v.ArraySchema<v.StringSchema<undefined>, undefined>], undefined>, undefined>;
42
52
  }, undefined>, undefined>, undefined>;
43
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;
44
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;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"}
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"}