@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.
- package/CHANGELOG.md +78 -0
- package/README.md +84 -9
- package/dist/api-keys.d.ts +18 -13
- package/dist/api-keys.d.ts.map +1 -1
- package/dist/api-keys.js +79 -22
- package/dist/api-keys.js.map +1 -1
- package/dist/bin/b24.js +2 -2
- package/dist/bitrix/errors.js +1 -1
- package/dist/bitrix/errors.js.map +1 -1
- package/dist/bitrix/transport.d.ts +1 -1
- package/dist/bitrix/transport.d.ts.map +1 -1
- package/dist/bitrix/transport.js +20 -6
- package/dist/bitrix/transport.js.map +1 -1
- package/dist/body.d.ts +14 -0
- package/dist/body.d.ts.map +1 -0
- package/dist/body.js +44 -0
- package/dist/body.js.map +1 -0
- package/dist/bundle/{chunk-JAS3OZSP.js → all-profiles-CANIDIDS.js} +12 -7
- package/dist/bundle/{anthropic-QCYLKSJJ.js → anthropic-JUJB4DCF.js} +5 -5
- package/dist/bundle/{app-server-FSLZ2Y6N.js → app-server-3V5Z4PTK.js} +68 -54
- package/dist/bundle/b24.js +18 -12
- package/dist/bundle/{bun-UYRQXF33.js → bun-LKMV5TY7.js} +2 -2
- package/dist/bundle/{bun-sqlite-GXME7EMT.js → bun-sqlite-S56EF74S.js} +3 -3
- package/dist/bundle/{chunk-D2IRPC5I.js → chunk-2I4KWS3H.js} +6 -6
- package/dist/bundle/chunk-36PO5NWY.js +147 -0
- package/dist/bundle/{chunk-COOOXDKZ.js → chunk-42F7Q7V6.js} +3 -3
- package/dist/bundle/{chunk-POUSZWMP.js → chunk-4D3K6GZW.js} +18 -4
- package/dist/bundle/chunk-5D4MJQ6X.js +22 -0
- package/dist/bundle/chunk-5JOPERVF.js +84 -0
- package/dist/bundle/chunk-6A4UPWDC.js +15 -0
- package/dist/bundle/{chunk-O7FVOICH.js → chunk-6MGWIZG4.js} +1 -1
- package/dist/bundle/{chunk-B252WFK7.js → chunk-6YJTNZ7U.js} +13 -13
- package/dist/bundle/{chunk-2D5W4LWL.js → chunk-7FBFJ6B4.js} +4 -2
- package/dist/bundle/chunk-7VCMOTQP.js +55 -0
- package/dist/bundle/{chunk-6BLVBGRK.js → chunk-A5IMMGYU.js} +36 -34
- package/dist/bundle/{chunk-66QLBRIT.js → chunk-ASEHTBNK.js} +1 -1
- package/dist/bundle/{chunk-MY6FAZRA.js → chunk-B6LPJYPQ.js} +2 -2
- package/dist/bundle/{chunk-EQLWU6ZB.js → chunk-BHEE2K6C.js} +7 -7
- package/dist/bundle/chunk-BYZQBE63.js +971 -0
- package/dist/bundle/{chunk-J7OMY6EO.js → chunk-COKGNTDQ.js} +1477 -723
- package/dist/bundle/{chunk-QVZSLBR6.js → chunk-DVFYRQGE.js} +1 -1
- package/dist/bundle/{chunk-Q7Z5IMVY.js → chunk-DVSIBZ3G.js} +1 -1
- package/dist/bundle/chunk-EJEIXC6Y.js +273 -0
- package/dist/bundle/chunk-EYTGCM44.js +130 -0
- package/dist/bundle/{chunk-SBW2Y7AZ.js → chunk-EYYOKT23.js} +26 -26
- package/dist/bundle/{chunk-Y5PPMGCS.js → chunk-FCWPIWSR.js} +2 -2
- package/dist/bundle/{chunk-AOUNT22U.js → chunk-FSWRMQWX.js} +2 -2
- package/dist/bundle/{chunk-ADLS6FVG.js → chunk-FXBHOCJK.js} +1 -1
- package/dist/bundle/chunk-G5MW6RCM.js +723 -0
- package/dist/bundle/{chunk-4OVK5XW2.js → chunk-GLTKRLFT.js} +8 -8
- package/dist/bundle/chunk-GUUZQ7NE.js +581 -0
- package/dist/bundle/{chunk-XOPMSWFC.js → chunk-H6RIPOOI.js} +36 -3
- package/dist/bundle/{chunk-GTMCLOYY.js → chunk-HGFNC4CR.js} +1447 -430
- package/dist/bundle/{chunk-IF27EQN6.js → chunk-IERYD2N2.js} +6 -6
- package/dist/bundle/{chunk-Q4ILKTV4.js → chunk-IGCLMEMB.js} +3 -3
- package/dist/bundle/{chunk-2IZ6GGU2.js → chunk-J7WCSZ2Q.js} +410 -918
- package/dist/bundle/{chunk-CR3TLGM4.js → chunk-JZYHQ4HB.js} +3 -3
- package/dist/bundle/{chunk-XR5SUCAC.js → chunk-K4QM3X5F.js} +4 -4
- package/dist/bundle/{chunk-OWILUBCI.js → chunk-KFSMY7SZ.js} +2 -2
- package/dist/bundle/{chunk-AMVRNYD6.js → chunk-KPEDH5T4.js} +1 -1
- package/dist/bundle/{chunk-NEK7LKC6.js → chunk-KUY7LII2.js} +4 -4
- package/dist/bundle/{chunk-NDSOBIR3.js → chunk-LFXDHLFR.js} +3 -3
- package/dist/bundle/{chunk-ZU4HXKEW.js → chunk-LGLT4JB6.js} +3 -3
- package/dist/bundle/{chunk-EIGPMMGC.js → chunk-LM4OOBAW.js} +3 -3
- package/dist/bundle/chunk-M74BSKMA.js +234 -0
- package/dist/bundle/{chunk-MPI2FDJ4.js → chunk-MMMT6ORT.js} +11 -11
- package/dist/bundle/{chunk-F5NH3UJQ.js → chunk-NGYD6QTE.js} +2 -2
- package/dist/bundle/{chunk-6ERX33NC.js → chunk-NO6QOPVT.js} +10 -19
- package/dist/bundle/chunk-O6XC7DZI.js +804 -0
- package/dist/bundle/chunk-OE3NFB53.js +64 -0
- package/dist/bundle/{chunk-VTIUWHZ3.js → chunk-OUMFNB34.js} +13 -149
- package/dist/bundle/{chunk-VMQL4GNH.js → chunk-P2RQTNVJ.js} +806 -850
- package/dist/bundle/{chunk-XKQZLR2X.js → chunk-PBIBGIZ7.js} +1 -1
- package/dist/bundle/{chunk-YFZXI3NN.js → chunk-Q6VQHTRW.js} +2 -2
- package/dist/bundle/{chunk-OKDC6CLH.js → chunk-QHBCNVUG.js} +5 -5
- package/dist/bundle/{chunk-WJRBX5QB.js → chunk-QNOXAQ6Y.js} +4 -4
- package/dist/bundle/{chunk-GTFRSYYJ.js → chunk-R5F2O5GX.js} +7 -269
- package/dist/bundle/{chunk-OCRCVLZQ.js → chunk-R5PBSKJL.js} +1 -1
- package/dist/bundle/{chunk-JB7OXYAU.js → chunk-RS2BARUU.js} +4 -4
- package/dist/bundle/chunk-TG3DSPT5.js +14 -0
- package/dist/bundle/{chunk-UH56WLDS.js → chunk-U22JMKUO.js} +6 -125
- package/dist/bundle/chunk-U66Q5TVK.js +106 -0
- package/dist/bundle/{chunk-NWKXMMON.js → chunk-UCHMQWON.js} +136 -33
- package/dist/bundle/{chunk-DQIQIZQS.js → chunk-VMJS7FJZ.js} +451 -433
- package/dist/bundle/{chunk-IWEWDVZ6.js → chunk-VMVAQHDC.js} +77 -615
- package/dist/bundle/{chunk-M5XMAUGZ.js → chunk-WWMCJFMT.js} +2 -2
- package/dist/bundle/{chunk-OYLJHX74.js → chunk-XTA5TN3H.js} +1 -1
- package/dist/bundle/{chunk-ELBOQHJA.js → chunk-XUHHBEA7.js} +652 -131
- package/dist/bundle/{chunk-BHZ5VDDY.js → chunk-YDZHO4LT.js} +13 -13
- package/dist/bundle/{chunk-NKLLI4B2.js → chunk-ZKINZFIT.js} +6 -6
- package/dist/bundle/{chunk-GTDOUP6L.js → chunk-ZSQXSIFQ.js} +85 -38
- package/dist/bundle/{chunk-LAYH344Y.js → chunk-ZZEHDIEG.js} +58 -54
- package/dist/bundle/command-contract-OQV6H7SR.js +36 -0
- package/dist/bundle/{decode-IF2F2SFC.js → decode-QSTBX4MG.js} +3 -3
- package/dist/bundle/{echarts-WDDVEJO2.js → echarts-JZELFH2N.js} +2 -2
- package/dist/bundle/{embed-VDUGYEAR.js → embed-4RIW2LVH.js} +4 -4
- package/dist/bundle/{embedder-DUN62H3Z.js → embedder-SW7DTWSL.js} +7 -7
- package/dist/bundle/{first-run-NDGYBQEN.js → first-run-7AISOSOM.js} +8 -8
- package/dist/bundle/first-screen-NMHNFZ2B.js +34 -0
- package/dist/bundle/{instructions-JIIKWS7X.js → instructions-BZE5YUGG.js} +1 -1
- package/dist/bundle/{mcp-33JX6KP4.js → mcp-SDWHDJTY.js} +2 -2
- package/dist/bundle/{node-P4E63KXA.js → node-KM3CUABH.js} +9 -9
- package/dist/bundle/{node-K57WT42O.js → node-LTKZIO4U.js} +2 -2
- package/dist/bundle/{node-sqlite-KS6ORRIG.js → node-sqlite-HQ5PN2RH.js} +4 -4
- package/dist/bundle/{oauth-SLSANN37.js → oauth-UH6FOZQL.js} +5 -5
- package/dist/bundle/{open-WJPHADEX.js → open-TSUP3XGL.js} +3 -3
- package/dist/bundle/{openai-HXB3GTOD.js → openai-GVEE52E3.js} +14 -14
- package/dist/bundle/{process-P73TFAXT.js → process-AGXY76ZE.js} +1 -1
- package/dist/bundle/{program-7BMG5NIN.js → program-BI4A4HFJ.js} +1045 -1048
- package/dist/bundle/{prompt-WDPV37R4.js → prompt-NRSUY7FA.js} +3 -3
- package/dist/bundle/{recognize-CXIFL6IV.js → recognize-NPDPQ6PJ.js} +2 -2
- package/dist/bundle/{remote-Q4VJ4OQW.js → remote-HFASMVLB.js} +5 -5
- package/dist/bundle/{rerank-SUFYK63I.js → rerank-TL6Z6F7K.js} +5 -5
- package/dist/bundle/{chunk-XG6QKS7L.js → serve-VB4DHDZQ.js} +8 -6
- package/dist/bundle/server-T5EDRPJI.js +68 -0
- package/dist/bundle/{chunk-K7XWCZF6.js → server-Z6MW6C37.js} +50 -14
- package/dist/bundle/source-4IGO5J7E.js +237 -0
- package/dist/bundle/sqlite-runtime-YS4POY3W.js +17 -0
- package/dist/bundle/{state-EZCCXQV7.js → state-ISZVVZGR.js} +4 -4
- package/dist/bundle/store-IZJBAKJV.js +58 -0
- package/dist/bundle/{store-MZ7JBYR6.js → store-L76MSQC3.js} +17 -12
- package/dist/bundle/store-PBTIB7BD.js +207 -0
- package/dist/bundle/store-maintenance-command-YFKII7TF.js +58 -0
- package/dist/bundle/writer-3O5EYMFE.js +214 -0
- package/dist/commands/api.d.ts.map +1 -1
- package/dist/commands/api.js +34 -33
- package/dist/commands/api.js.map +1 -1
- package/dist/commands/crm-shared.d.ts +4 -0
- package/dist/commands/crm-shared.d.ts.map +1 -0
- package/dist/commands/crm-shared.js +94 -0
- package/dist/commands/crm-shared.js.map +1 -0
- package/dist/commands/crm-writes.d.ts +0 -1
- package/dist/commands/crm-writes.d.ts.map +1 -1
- package/dist/commands/crm-writes.js +31 -92
- package/dist/commands/crm-writes.js.map +1 -1
- package/dist/commands/crm.d.ts.map +1 -1
- package/dist/commands/crm.js +1 -45
- package/dist/commands/crm.js.map +1 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +1 -0
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/write.d.ts +1 -6
- package/dist/commands/write.d.ts.map +1 -1
- package/dist/commands/write.js +7 -16
- package/dist/commands/write.js.map +1 -1
- package/dist/config.d.ts +0 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -9
- package/dist/config.js.map +1 -1
- package/dist/crm/capabilities.d.ts +7 -0
- package/dist/crm/capabilities.d.ts.map +1 -0
- package/dist/crm/capabilities.js +7 -0
- package/dist/crm/capabilities.js.map +1 -0
- package/dist/crm/conditions.d.ts +1 -1
- package/dist/crm/conditions.d.ts.map +1 -1
- package/dist/crm/conditions.js +3 -5
- package/dist/crm/conditions.js.map +1 -1
- package/dist/crm/custom-query.d.ts +1 -1
- package/dist/crm/custom-query.d.ts.map +1 -1
- package/dist/crm/custom-query.js +2 -2
- package/dist/crm/custom-query.js.map +1 -1
- package/dist/crm/deal.d.ts +4 -28
- package/dist/crm/deal.d.ts.map +1 -1
- package/dist/crm/deal.js +15 -48
- package/dist/crm/deal.js.map +1 -1
- package/dist/crm/fields.d.ts +2 -26
- package/dist/crm/fields.d.ts.map +1 -1
- package/dist/crm/fields.js +2 -67
- package/dist/crm/fields.js.map +1 -1
- package/dist/crm/items.d.ts.map +1 -1
- package/dist/crm/items.js +6 -5
- package/dist/crm/items.js.map +1 -1
- package/dist/crm/lead.d.ts +5 -37
- package/dist/crm/lead.d.ts.map +1 -1
- package/dist/crm/lead.js +15 -61
- package/dist/crm/lead.js.map +1 -1
- package/dist/crm/pipelines.d.ts +5 -0
- package/dist/crm/pipelines.d.ts.map +1 -0
- package/dist/crm/pipelines.js +54 -0
- package/dist/crm/pipelines.js.map +1 -0
- package/dist/crm/product.d.ts.map +1 -1
- package/dist/crm/product.js +2 -2
- package/dist/crm/product.js.map +1 -1
- package/dist/crm/rest3-fields.d.ts +3 -0
- package/dist/crm/rest3-fields.d.ts.map +1 -0
- package/dist/crm/rest3-fields.js +38 -0
- package/dist/crm/rest3-fields.js.map +1 -0
- package/dist/crm/source.d.ts +15 -0
- package/dist/crm/source.d.ts.map +1 -0
- package/dist/crm/source.js +122 -0
- package/dist/crm/source.js.map +1 -0
- package/dist/crm/user.d.ts.map +1 -1
- package/dist/crm/user.js +2 -2
- package/dist/crm/user.js.map +1 -1
- package/dist/crm/values.d.ts +19 -4
- package/dist/crm/values.d.ts.map +1 -1
- package/dist/crm/values.js +28 -2
- package/dist/crm/values.js.map +1 -1
- package/dist/crm/writer.d.ts +9 -0
- package/dist/crm/writer.d.ts.map +1 -0
- package/dist/crm/writer.js +119 -0
- package/dist/crm/writer.js.map +1 -0
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +51 -6
- package/dist/program.js.map +1 -1
- package/dist/store.d.ts +15 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +33 -0
- package/dist/store.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -6
- package/skills/bitrix24-cli/SKILL.md +16 -15
- package/dist/bundle/all-profiles-MBQZCOVK.js +0 -24
- package/dist/bundle/chunk-UCLWWSQK.js +0 -48
- package/dist/bundle/command-contract-UON4EIC4.js +0 -30
- package/dist/bundle/first-screen-QAVKP5RF.js +0 -28
- package/dist/bundle/mcp-57EQ6QJO.js +0 -171
- package/dist/bundle/mcp-PFJER2DE.js +0 -87
- package/dist/bundle/serve-B7PGFOC2.js +0 -19
- package/dist/bundle/server-4DBNJWW6.js +0 -58
- package/dist/bundle/server-OKE7SXJ2.js +0 -45
- package/dist/bundle/store-maintenance-command-T5QZMENJ.js +0 -47
- package/dist/commands/doctor.d.ts +0 -77
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -74
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/fields.d.ts +0 -3
- package/dist/commands/fields.d.ts.map +0 -1
- package/dist/commands/fields.js +0 -45
- package/dist/commands/fields.js.map +0 -1
- package/dist/commands/mcp.d.ts +0 -3
- package/dist/commands/mcp.d.ts.map +0 -1
- package/dist/commands/mcp.js +0 -97
- package/dist/commands/mcp.js.map +0 -1
- package/dist/crm/pipeline.d.ts +0 -17
- package/dist/crm/pipeline.d.ts.map +0 -1
- package/dist/crm/pipeline.js +0 -42
- package/dist/crm/pipeline.js.map +0 -1
- package/dist/crm/stage.d.ts +0 -20
- package/dist/crm/stage.d.ts.map +0 -1
- package/dist/crm/stage.js +0 -65
- package/dist/crm/stage.js.map +0 -1
- package/dist/mcp.d.ts +0 -29
- package/dist/mcp.d.ts.map +0 -1
- package/dist/mcp.js +0 -102
- package/dist/mcp.js.map +0 -1
- /package/dist/bundle/{chunk-NDTJE6JQ.js → chunk-ZQ3GWKDQ.js} +0 -0
package/dist/crm/lead.d.ts
CHANGED
|
@@ -1,40 +1,8 @@
|
|
|
1
|
-
import
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
package/dist/crm/lead.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lead.d.ts","sourceRoot":"","sources":["../../src/crm/lead.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
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
|
|
2
|
-
|
|
3
|
-
export const
|
|
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
|
-
|
|
38
|
-
title: text(raw.title),
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
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,
|
package/dist/crm/lead.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lead.js","sourceRoot":"","sources":["../../src/crm/lead.ts"],"names":[],"mappings":"
|
|
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,
|
|
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"}
|
package/dist/crm/product.js
CHANGED
|
@@ -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:
|
|
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
|
package/dist/crm/product.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product.js","sourceRoot":"","sources":["../../src/crm/product.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,OAAO,EAAkB,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7D,OAAO,EAAE,EAAE,EAAE,MAAM,EAAY,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"product.js","sourceRoot":"","sources":["../../src/crm/product.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|
package/dist/crm/user.d.ts.map
CHANGED
|
@@ -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,
|
|
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:
|
|
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}`);
|
package/dist/crm/user.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/crm/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,OAAO,EAAkB,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAY,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/crm/user.ts"],"names":[],"mappings":"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"}
|
package/dist/crm/values.d.ts
CHANGED
|
@@ -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) =>
|
|
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
|
package/dist/crm/values.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../src/crm/values.ts"],"names":[],"mappings":"
|
|
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"}
|