@wirecat/bitrix24-cli 0.0.0-stage → 0.2.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 +41 -0
- package/LICENSE +204 -0
- package/README.md +17 -2
- package/dist/api-keys.d.ts +21 -0
- package/dist/api-keys.d.ts.map +1 -0
- package/dist/api-keys.js +58 -0
- package/dist/api-keys.js.map +1 -0
- package/dist/bin/b24.d.ts +3 -0
- package/dist/bin/b24.d.ts.map +1 -0
- package/dist/bin/b24.js +40 -0
- package/dist/bin/b24.js.map +1 -0
- package/dist/bitrix/errors.d.ts +22 -0
- package/dist/bitrix/errors.d.ts.map +1 -0
- package/dist/bitrix/errors.js +76 -0
- package/dist/bitrix/errors.js.map +1 -0
- package/dist/bitrix/methods.d.ts +13 -0
- package/dist/bitrix/methods.d.ts.map +1 -0
- package/dist/bitrix/methods.js +33 -0
- package/dist/bitrix/methods.js.map +1 -0
- package/dist/bitrix/transport.d.ts +50 -0
- package/dist/bitrix/transport.d.ts.map +1 -0
- package/dist/bitrix/transport.js +189 -0
- package/dist/bitrix/transport.js.map +1 -0
- package/dist/bitrix/webhook.d.ts +14 -0
- package/dist/bitrix/webhook.d.ts.map +1 -0
- package/dist/bitrix/webhook.js +29 -0
- package/dist/bitrix/webhook.js.map +1 -0
- package/dist/bundle/all-profiles-QJ444GSX.js +24 -0
- package/dist/bundle/anthropic-RHRAVHC2.js +70 -0
- package/dist/bundle/app-server-QIT6S7AZ.js +224 -0
- package/dist/bundle/b24.js +32 -0
- package/dist/bundle/bun-H6RSODZ3.js +169 -0
- package/dist/bundle/bun-sqlite-BO4LTQHX.js +69 -0
- package/dist/bundle/chunk-2KCZ7BKW.js +215 -0
- package/dist/bundle/chunk-2SNUMZ7S.js +1028 -0
- package/dist/bundle/chunk-45AKJVKV.js +24 -0
- package/dist/bundle/chunk-4PDYYS5K.js +2 -0
- package/dist/bundle/chunk-5D4AEUVA.js +24783 -0
- package/dist/bundle/chunk-6WY72XVQ.js +216 -0
- package/dist/bundle/chunk-7GRZAKBB.js +639 -0
- package/dist/bundle/chunk-ADLS6FVG.js +24600 -0
- package/dist/bundle/chunk-BCF7P4FZ.js +558 -0
- package/dist/bundle/chunk-CNNEA2M4.js +54 -0
- package/dist/bundle/chunk-CXL33BFL.js +570 -0
- package/dist/bundle/chunk-D5S6QV6R.js +95 -0
- package/dist/bundle/chunk-DFDN6AUB.js +21 -0
- package/dist/bundle/chunk-DTXERR44.js +35 -0
- package/dist/bundle/chunk-EVYSBZ3I.js +153 -0
- package/dist/bundle/chunk-EXOOKUEA.js +82 -0
- package/dist/bundle/chunk-FLUEXJ4X.js +53 -0
- package/dist/bundle/chunk-FOTREPNS.js +366 -0
- package/dist/bundle/chunk-FZL7F5NR.js +2022 -0
- package/dist/bundle/chunk-GDFNH33E.js +1691 -0
- package/dist/bundle/chunk-H2ADPPSH.js +50910 -0
- package/dist/bundle/chunk-HAXNUIGQ.js +1245 -0
- package/dist/bundle/chunk-HGL63O5V.js +288 -0
- package/dist/bundle/chunk-INFYLWUA.js +929 -0
- package/dist/bundle/chunk-IRV2PCQ2.js +5213 -0
- package/dist/bundle/chunk-K3UIB6ZF.js +45 -0
- package/dist/bundle/chunk-LRGYKOCP.js +91 -0
- package/dist/bundle/chunk-LSPIOT6Z.js +459 -0
- package/dist/bundle/chunk-MBDK4YXG.js +34 -0
- package/dist/bundle/chunk-N6FLBXZS.js +73 -0
- package/dist/bundle/chunk-OTD2ZRXD.js +161 -0
- package/dist/bundle/chunk-P33NDCDI.js +78 -0
- package/dist/bundle/chunk-P364PLIK.js +257 -0
- package/dist/bundle/chunk-PH5FZX6E.js +193 -0
- package/dist/bundle/chunk-POC3V3AO.js +36616 -0
- package/dist/bundle/chunk-QC53QBNC.js +143 -0
- package/dist/bundle/chunk-QGMDQ2PM.js +122 -0
- package/dist/bundle/chunk-QIPTIUMJ.js +281 -0
- package/dist/bundle/chunk-QMPN6WKD.js +3512 -0
- package/dist/bundle/chunk-QQXH2OPB.js +594 -0
- package/dist/bundle/chunk-QSNROIJL.js +413 -0
- package/dist/bundle/chunk-RRJNNPR4.js +76 -0
- package/dist/bundle/chunk-SFRNX2TI.js +6848 -0
- package/dist/bundle/chunk-SGRYYE4X.js +266 -0
- package/dist/bundle/chunk-TE3FR6MI.js +884 -0
- package/dist/bundle/chunk-U5ACMCAQ.js +12049 -0
- package/dist/bundle/chunk-VEWWAGTD.js +2315 -0
- package/dist/bundle/chunk-VL6SPMZV.js +194 -0
- package/dist/bundle/chunk-WII44RXN.js +58 -0
- package/dist/bundle/chunk-WKRQ44EH.js +528 -0
- package/dist/bundle/chunk-WTPMJYMD.js +8308 -0
- package/dist/bundle/chunk-XD4FRDSL.js +565 -0
- package/dist/bundle/chunk-XJXONOB5.js +63 -0
- package/dist/bundle/chunk-XNHSPHUN.js +48 -0
- package/dist/bundle/chunk-XRFJWHY5.js +131 -0
- package/dist/bundle/chunk-Y5E2WNWB.js +35 -0
- package/dist/bundle/chunk-YYO7D2MO.js +783 -0
- package/dist/bundle/chunk-YZ5LHE5Q.js +31 -0
- package/dist/bundle/chunk-ZDQQCXFG.js +392 -0
- package/dist/bundle/chunk-ZEW4P6AH.js +158 -0
- package/dist/bundle/chunk-ZGZT5S6B.js +3480 -0
- package/dist/bundle/chunk-ZIAQPTUS.js +82 -0
- package/dist/bundle/chunk-ZVVMGPBJ.js +50 -0
- package/dist/bundle/command-contract-OKQOE6G4.js +30 -0
- package/dist/bundle/decode-5ZPLTYV6.js +160 -0
- package/dist/bundle/dist-6Y64DTOE.js +7577 -0
- package/dist/bundle/echarts-J6LAPIX7.js +42501 -0
- package/dist/bundle/embed-YG5LDHME.js +35 -0
- package/dist/bundle/embedder-7FNUA5OZ.js +108 -0
- package/dist/bundle/first-run-JPZNWIJN.js +23 -0
- package/dist/bundle/first-screen-VQM4MTS7.js +28 -0
- package/dist/bundle/instructions-AXWTQHMR.js +11 -0
- package/dist/bundle/mcp-7F46P6AM.js +165 -0
- package/dist/bundle/mcp-HUD6UH5X.js +160 -0
- package/dist/bundle/mcp-J5R5A65I.js +87 -0
- package/dist/bundle/node-CWKAIOEM.js +176 -0
- package/dist/bundle/node-P4E63KXA.js +2340 -0
- package/dist/bundle/node-TLZSIHIJ.js +21 -0
- package/dist/bundle/node-sqlite-LSEKVRDA.js +67 -0
- package/dist/bundle/oauth-THYNLRLD.js +17 -0
- package/dist/bundle/open-E47QYKFC.js +20 -0
- package/dist/bundle/openai-EWSGC3BC.js +227 -0
- package/dist/bundle/process-WKTEA3WE.js +91 -0
- package/dist/bundle/program-UYX5362I.js +20851 -0
- package/dist/bundle/prompt-CAQ7QR3U.js +12 -0
- package/dist/bundle/recognize-6KGHNZC3.js +23 -0
- package/dist/bundle/remote-3UO2WDC3.js +26 -0
- package/dist/bundle/rerank-2JVDPZBX.js +49 -0
- package/dist/bundle/serve-ES7AG5IK.js +19 -0
- package/dist/bundle/server-5LE5LNUQ.js +45 -0
- package/dist/bundle/server-BU4VBM6S.js +58 -0
- package/dist/bundle/state-7NH5G4XJ.js +33 -0
- package/dist/bundle/store-7O4JQD2Z.js +127 -0
- package/dist/bundle/store-maintenance-command-UDVGEY2D.js +47 -0
- package/dist/commands/api.d.ts +3 -0
- package/dist/commands/api.d.ts.map +1 -0
- package/dist/commands/api.js +131 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/crm-writes.d.ts +4 -0
- package/dist/commands/crm-writes.d.ts.map +1 -0
- package/dist/commands/crm-writes.js +182 -0
- package/dist/commands/crm-writes.js.map +1 -0
- package/dist/commands/crm.d.ts +3 -0
- package/dist/commands/crm.d.ts.map +1 -0
- package/dist/commands/crm.js +144 -0
- package/dist/commands/crm.js.map +1 -0
- package/dist/commands/doctor.d.ts +77 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +74 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +97 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/session.d.ts +3 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +101 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/write.d.ts +21 -0
- package/dist/commands/write.d.ts.map +1 -0
- package/dist/commands/write.js +47 -0
- package/dist/commands/write.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -0
- package/dist/crm/conditions.d.ts +25 -0
- package/dist/crm/conditions.d.ts.map +1 -0
- package/dist/crm/conditions.js +78 -0
- package/dist/crm/conditions.js.map +1 -0
- package/dist/crm/deal.d.ts +27 -0
- package/dist/crm/deal.d.ts.map +1 -0
- package/dist/crm/deal.js +74 -0
- package/dist/crm/deal.js.map +1 -0
- package/dist/crm/items.d.ts +30 -0
- package/dist/crm/items.d.ts.map +1 -0
- package/dist/crm/items.js +76 -0
- package/dist/crm/items.js.map +1 -0
- package/dist/crm/lead.d.ts +36 -0
- package/dist/crm/lead.d.ts.map +1 -0
- package/dist/crm/lead.js +85 -0
- package/dist/crm/lead.js.map +1 -0
- package/dist/crm/organization.d.ts +32 -0
- package/dist/crm/organization.d.ts.map +1 -0
- package/dist/crm/organization.js +67 -0
- package/dist/crm/organization.js.map +1 -0
- package/dist/crm/person.d.ts +31 -0
- package/dist/crm/person.d.ts.map +1 -0
- package/dist/crm/person.js +67 -0
- package/dist/crm/person.js.map +1 -0
- package/dist/crm/pipeline.d.ts +17 -0
- package/dist/crm/pipeline.d.ts.map +1 -0
- package/dist/crm/pipeline.js +42 -0
- package/dist/crm/pipeline.js.map +1 -0
- package/dist/crm/product.d.ts +43 -0
- package/dist/crm/product.d.ts.map +1 -0
- package/dist/crm/product.js +42 -0
- package/dist/crm/product.js.map +1 -0
- package/dist/crm/stage.d.ts +20 -0
- package/dist/crm/stage.d.ts.map +1 -0
- package/dist/crm/stage.js +65 -0
- package/dist/crm/stage.js.map +1 -0
- package/dist/crm/user.d.ts +39 -0
- package/dist/crm/user.d.ts.map +1 -0
- package/dist/crm/user.js +54 -0
- package/dist/crm/user.js.map +1 -0
- package/dist/crm/values.d.ts +33 -0
- package/dist/crm/values.d.ts.map +1 -0
- package/dist/crm/values.js +54 -0
- package/dist/crm/values.js.map +1 -0
- package/dist/crm/walk.d.ts +19 -0
- package/dist/crm/walk.d.ts.map +1 -0
- package/dist/crm/walk.js +22 -0
- package/dist/crm/walk.js.map +1 -0
- package/dist/identity.d.ts +5 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +18 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +29 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +99 -0
- package/dist/mcp.js.map +1 -0
- package/dist/portal.d.ts +47 -0
- package/dist/portal.d.ts.map +1 -0
- package/dist/portal.js +52 -0
- package/dist/portal.js.map +1 -0
- package/dist/program.d.ts +6 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +45 -0
- package/dist/program.js.map +1 -0
- package/dist/reasons.d.ts +10 -0
- package/dist/reasons.d.ts.map +1 -0
- package/dist/reasons.js +28 -0
- package/dist/reasons.js.map +1 -0
- package/dist/token.d.ts +12 -0
- package/dist/token.d.ts.map +1 -0
- package/dist/token.js +41 -0
- package/dist/token.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/dist/whoami.d.ts +8 -0
- package/dist/whoami.d.ts.map +1 -0
- package/dist/whoami.js +9 -0
- package/dist/whoami.js.map +1 -0
- package/package.json +83 -4
- package/skills/bitrix24-cli/SKILL.md +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAkHnC,eAAO,MAAM,cAAc,QAAO,OAMJ,CAAA"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { annotate } from "@wirecat/cli-base/commands";
|
|
3
|
+
import { readSecret } from "@wirecat/cli-core";
|
|
4
|
+
import { commandWords, environmentOf, FETCH, itemOf, LOCAL_READ, LOCAL_WRITE, listOf, logsInOrOut, outputFor, profileFree, profilesHere, REMOTE_READ, refuseCommandName, refuseUnderReadOnly, rememberAccount, renderAnswer, rootOf, secretInputOf, } from "@wirecat/cli-core/cli";
|
|
5
|
+
import { Command } from "commander";
|
|
6
|
+
import { parseWebhook } from "../bitrix/webhook.js";
|
|
7
|
+
import { configuration } from "../config.js";
|
|
8
|
+
import { IDENTITY } from "../identity.js";
|
|
9
|
+
import { contextOf, refuseOffline, transportFor, withPortal } from "../portal.js";
|
|
10
|
+
import { TOKEN_VARIABLE, tokens } from "../token.js";
|
|
11
|
+
import { webhookUser } from "../whoami.js";
|
|
12
|
+
const answer = (command, item) => renderAnswer(command, outputFor(command), itemOf(item));
|
|
13
|
+
const startCommand = () => logsInOrOut(annotate(new Command("start"), {
|
|
14
|
+
effects: FETCH,
|
|
15
|
+
lifetime: "interactive",
|
|
16
|
+
mcp: false,
|
|
17
|
+
examples: [`${IDENTITY.command} work session start`, `${IDENTITY.command} work session start --json`],
|
|
18
|
+
}))
|
|
19
|
+
.summary("sign in with a Bitrix24 incoming webhook")
|
|
20
|
+
.description("sign this profile in: the incoming webhook's address (Bitrix24 → Developer resources → Other → Incoming " +
|
|
21
|
+
"webhook) is asked hidden or read from stdin, checked against the portal, and only then kept in the keyring, " +
|
|
22
|
+
"or in a private file when the keyring fails; the webhook acts with the rights of the employee who made it")
|
|
23
|
+
.option("--credential-storage <storage>", "where the address is kept: keyring (the default, which falls back to a private file by itself when no " +
|
|
24
|
+
"keyring works), or file, not recommended", "keyring")
|
|
25
|
+
.action(async function (args) {
|
|
26
|
+
const storage = args.credentialStorage;
|
|
27
|
+
if (storage !== "keyring" && storage !== "file")
|
|
28
|
+
throw new CliError("validation_error", "--credential-storage takes keyring or file");
|
|
29
|
+
const { env, flags, profile, tokens, run } = contextOf(this);
|
|
30
|
+
refuseCommandName(profile, commandWords(rootOf(this)), IDENTITY.command);
|
|
31
|
+
refuseOffline(flags);
|
|
32
|
+
const address = (await readSecret("Bitrix24 webhook address: ", secretInputOf(this))).trim();
|
|
33
|
+
if (!address)
|
|
34
|
+
throw new CliError("validation_error", "no webhook address was given");
|
|
35
|
+
const webhook = parseWebhook(address);
|
|
36
|
+
const user = await run((events) => webhookUser(transportFor(this, webhook, events)));
|
|
37
|
+
const portal = new URL(webhook.origin).host;
|
|
38
|
+
const stored = tokens.write(profile, address, storage);
|
|
39
|
+
rememberAccount(IDENTITY, profile, `${portal}:${webhook.userId}`, env);
|
|
40
|
+
answer(this, { profile, state: "saved", stored_in: stored, verified: true, portal, user });
|
|
41
|
+
});
|
|
42
|
+
const statusCommand = () => annotate(new Command("status"), {
|
|
43
|
+
effects: REMOTE_READ,
|
|
44
|
+
examples: [`${IDENTITY.command} work session status`, `${IDENTITY.command} work session status --check --json`],
|
|
45
|
+
})
|
|
46
|
+
.summary("show where the webhook comes from, and with --check as whom it acts")
|
|
47
|
+
.description(`show where this profile's webhook address comes from: ${TOKEN_VARIABLE}, the keyring or a file; never the ` +
|
|
48
|
+
"address. --check asks the portal whose rights it carries: the user's id, name and whether they are an admin")
|
|
49
|
+
.option("--check", "ask the portal whether the webhook still works, and as whom")
|
|
50
|
+
.action(async function (args) {
|
|
51
|
+
const { profile, tokens } = contextOf(this);
|
|
52
|
+
const stored = tokens.read(profile);
|
|
53
|
+
const portal = stored ? new URL(parseWebhook(stored.secret).origin).host : null;
|
|
54
|
+
const status = { profile, state: stored ? "saved" : "missing", token_from: stored?.source ?? null, portal };
|
|
55
|
+
if (!args.check || !stored)
|
|
56
|
+
return answer(this, { ...status, verified: false });
|
|
57
|
+
answer(this, { ...status, verified: true, user: await withPortal(this, webhookUser) });
|
|
58
|
+
});
|
|
59
|
+
const endCommand = () => logsInOrOut(annotate(new Command("end"), {
|
|
60
|
+
effects: LOCAL_WRITE,
|
|
61
|
+
mcp: false,
|
|
62
|
+
examples: [`${IDENTITY.command} work session end`],
|
|
63
|
+
}))
|
|
64
|
+
.summary("forget this profile's webhook address on this computer")
|
|
65
|
+
.description("forget this profile's webhook address on this computer; the webhook itself stays in Bitrix24")
|
|
66
|
+
.action(function () {
|
|
67
|
+
refuseUnderReadOnly(this, "session end");
|
|
68
|
+
const { profile, tokens } = contextOf(this);
|
|
69
|
+
answer(this, { profile, ended: tokens.remove(profile) });
|
|
70
|
+
});
|
|
71
|
+
const listCommand = () => profileFree(annotate(new Command("list"), {
|
|
72
|
+
effects: LOCAL_READ,
|
|
73
|
+
examples: [`${IDENTITY.command} session list`, `${IDENTITY.command} session list --json`],
|
|
74
|
+
}))
|
|
75
|
+
.summary("list the profiles here and whether each is signed in")
|
|
76
|
+
.description("list the profiles on this computer and whether each has a webhook; picks none")
|
|
77
|
+
.action(function () {
|
|
78
|
+
const environment = environmentOf(this);
|
|
79
|
+
const env = environment.env ?? process.env;
|
|
80
|
+
const { configuredProfiles } = configuration.resolveSettings({}, { env, needsProfile: false });
|
|
81
|
+
const store = tokens(env, environment.keyring);
|
|
82
|
+
const items = profilesHere(IDENTITY, configuredProfiles, env).map((profile) => {
|
|
83
|
+
try {
|
|
84
|
+
const stored = store.read(profile);
|
|
85
|
+
return { profile, signed_in: stored !== undefined, token_from: stored?.source ?? null };
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
if (!(error instanceof CliError))
|
|
89
|
+
throw error;
|
|
90
|
+
return { profile, signed_in: null, token_from: null, error: error.message };
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
renderAnswer(this, outputFor(this), listOf("session list", { items, limit: Math.max(1, items.length), has_more: false }));
|
|
94
|
+
});
|
|
95
|
+
export const sessionCommand = () => annotate(new Command("session"), { effects: LOCAL_READ })
|
|
96
|
+
.description("keep this profile's Bitrix24 webhook in the OS keyring")
|
|
97
|
+
.addCommand(startCommand())
|
|
98
|
+
.addCommand(statusCommand())
|
|
99
|
+
.addCommand(endCommand())
|
|
100
|
+
.addCommand(listCommand());
|
|
101
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/commands/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import type { BitrixTransport } from "../bitrix/transport.js";
|
|
3
|
+
export declare const operationIdOf: (given: string | undefined) => string;
|
|
4
|
+
export interface Write {
|
|
5
|
+
/** The command's own permission key, `deals.create`. */
|
|
6
|
+
key: string;
|
|
7
|
+
/** The employee the record is assigned to, when the write sets one. */
|
|
8
|
+
assignee?: string | undefined;
|
|
9
|
+
/** False for a REST 2 write, which Bitrix24 does not answer from a record when it is repeated. */
|
|
10
|
+
keyed?: boolean;
|
|
11
|
+
/** Keys checked beside `key`, such as the command key a raw `api call` does the same as. */
|
|
12
|
+
extra?: readonly string[];
|
|
13
|
+
operationId?: string | undefined;
|
|
14
|
+
act: (portal: BitrixTransport, operationId: string) => Promise<Record<string, unknown>>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Every write's one path, as gcal-cli's `api call` (src/commands/api.ts): the read-only lock, the profile's levels,
|
|
18
|
+
* one question for every key at `ask`, the send journal, and an `operation_id` in the answer (WC-PERM-13, WC-OUT-10).
|
|
19
|
+
*/
|
|
20
|
+
export declare const write: (command: Command, { key, assignee, extra: also, keyed, operationId: given, act }: Write) => Promise<void>;
|
|
21
|
+
//# sourceMappingURL=write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/commands/write.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAQ7D,eAAO,MAAM,aAAa,UAAW,MAAM,GAAG,SAAS,KAAG,MAMzD,CAAA;AAED,MAAM,WAAW,KAAK;IACpB,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAA;IACX,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,kGAAkG;IAClG,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,4FAA4F;IAC5F,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,GAAG,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CACxF;AAED;;;GAGG;AACH,eAAO,MAAM,KAAK,YACP,OAAO,kEAC4D,KAAK,kBA0ClF,CAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { environmentOf, itemOf, outputFor, readOnlyLockOf, readOnlyRefusal, renderAnswer, terminalAsker, } from "@wirecat/cli-core/cli";
|
|
3
|
+
import { guardedWrite, guardFor, keyedGuard, levelFor, newOperationId } from "@wirecat/cli-core/sends";
|
|
4
|
+
import { ASSIGN_KEY, permissions } from "../config.js";
|
|
5
|
+
import { IDENTITY } from "../identity.js";
|
|
6
|
+
import { contextOf, transportFor, webhookOf } from "../portal.js";
|
|
7
|
+
/** REST 3.0's `Idempotency-Key`: 1 to 255 printable ASCII characters (apidocs "REST 3.0"). */
|
|
8
|
+
const OPERATION_ID = /^[\x21-\x7e]{1,255}$/;
|
|
9
|
+
export const operationIdOf = (given) => {
|
|
10
|
+
if (given !== undefined && !OPERATION_ID.test(given))
|
|
11
|
+
throw new CliError("validation_error", "--operation-id takes 1 to 255 printable characters with no spaces", {
|
|
12
|
+
param: "--operation-id",
|
|
13
|
+
});
|
|
14
|
+
return given ?? newOperationId();
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Every write's one path, as gcal-cli's `api call` (src/commands/api.ts): the read-only lock, the profile's levels,
|
|
18
|
+
* one question for every key at `ask`, the send journal, and an `operation_id` in the answer (WC-PERM-13, WC-OUT-10).
|
|
19
|
+
*/
|
|
20
|
+
export const write = async (command, { key, assignee, extra: also = [], keyed = true, operationId: given, act }) => {
|
|
21
|
+
const { env, settings, run } = contextOf(command);
|
|
22
|
+
const lock = readOnlyLockOf(IDENTITY, env);
|
|
23
|
+
if (lock)
|
|
24
|
+
throw readOnlyRefusal(lock, "change the Bitrix24 portal");
|
|
25
|
+
const operationId = operationIdOf(given);
|
|
26
|
+
const webhook = webhookOf(command);
|
|
27
|
+
const self = webhook.userId;
|
|
28
|
+
const extra = [...also, ...(assignee !== undefined && assignee !== self ? [ASSIGN_KEY] : [])];
|
|
29
|
+
const levelOf = (one) => levelFor(settings.permissions, one, permissions.defaults).level;
|
|
30
|
+
const guard = keyedGuard((ask) => guardFor(IDENTITY,
|
|
31
|
+
// The portal limits its own rate; the guard is here for the levels and the journal, not a send limit.
|
|
32
|
+
{ ...settings, sendsPerHour: Number.MAX_SAFE_INTEGER, permissionDefaults: permissions.defaults }, outputFor(command).renderer.warn, environmentOf(command).env ?? process.env, ask), terminalAsker(command), levelOf, extra);
|
|
33
|
+
const request = { chatId: null, kind: "edit", key, operationId };
|
|
34
|
+
guard.refuse(request);
|
|
35
|
+
let done;
|
|
36
|
+
try {
|
|
37
|
+
done = await guardedWrite(guard, request, () => run((events) => act(transportFor(command, webhook, events), operationId)));
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (keyed && error instanceof CliError && error.code === "outcome_unknown")
|
|
41
|
+
throw new CliError("outcome_unknown", `${error.message} — repeat it with --operation-id ${operationId}: Bitrix24 answers a repeat from its record ` +
|
|
42
|
+
"instead of running it again", { ...error.details, operation_id: operationId });
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
renderAnswer(command, outputFor(command), itemOf({ operation_id: operationId, ...done }));
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/commands/write.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Configuration } from "@wirecat/cli-core/cli";
|
|
2
|
+
/**
|
|
3
|
+
* Assigning a record to another employee tells that employee in Bitrix24 by itself, so it is its own key, denied
|
|
4
|
+
* until the owner allows it (WC-PERM-22). Assigning to the webhook's own user tells nobody.
|
|
5
|
+
*/
|
|
6
|
+
export declare const ASSIGN_KEY = "crm.assign-others";
|
|
7
|
+
export declare const permissions: import("@wirecat/cli-core/cli").CommandPermissions;
|
|
8
|
+
export declare const configuration: Configuration;
|
|
9
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAmD,MAAM,uBAAuB,CAAA;AAI3G;;;GAGG;AACH,eAAO,MAAM,UAAU,sBAAsB,CAAA;AAM7C,eAAO,MAAM,WAAW,oDAItB,CAAA;AAEF,eAAO,MAAM,aAAa,EAAE,aAAsD,CAAA"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { commandPathKey, commandPermissions, settingsFor } from "@wirecat/cli-core/cli";
|
|
2
|
+
import { API_DEFAULTS, API_KEYS } from "./api-keys.js";
|
|
3
|
+
import { IDENTITY } from "./identity.js";
|
|
4
|
+
/**
|
|
5
|
+
* Assigning a record to another employee tells that employee in Bitrix24 by itself, so it is its own key, denied
|
|
6
|
+
* until the owner allows it (WC-PERM-22). Assigning to the webhook's own user tells nobody.
|
|
7
|
+
*/
|
|
8
|
+
export const ASSIGN_KEY = "crm.assign-others";
|
|
9
|
+
/** `api list` and `show` never reach the portal; `api call` names its method only in its arguments and checks it itself. */
|
|
10
|
+
const keyOf = (path) => path[0] === "api" && ["call", "list", "show"].includes(path[1] ?? "") ? null : commandPathKey(path);
|
|
11
|
+
export const permissions = commandPermissions({
|
|
12
|
+
keyOf,
|
|
13
|
+
extra: [ASSIGN_KEY, ...API_KEYS],
|
|
14
|
+
defaults: { [ASSIGN_KEY]: "deny", ...API_DEFAULTS },
|
|
15
|
+
});
|
|
16
|
+
export const configuration = settingsFor(IDENTITY, { permissions });
|
|
17
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAC3G,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,mBAAmB,CAAA;AAE7C,4HAA4H;AAC5H,MAAM,KAAK,GAAG,CAAC,IAAuB,EAAE,EAAE,CACxC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;AAErG,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC;IAC5C,KAAK;IACL,KAAK,EAAE,CAAC,UAAU,EAAE,GAAG,QAAQ,CAAC;IAChC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE;CACpD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,aAAa,GAAkB,WAAW,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Predicate } from "@wirecat/cli-base/query";
|
|
2
|
+
export type Operator = "=" | ">" | ">=" | "<" | "<=" | "like";
|
|
3
|
+
/** One filter condition in Bitrix24's own field names, before it is written for REST 3.0 or REST 2. */
|
|
4
|
+
export interface Condition {
|
|
5
|
+
field: string;
|
|
6
|
+
op: Operator;
|
|
7
|
+
value: string | number;
|
|
8
|
+
}
|
|
9
|
+
/** How one query field reaches the portal: its Bitrix24 name, and how its values read. */
|
|
10
|
+
export interface FieldMap {
|
|
11
|
+
field: string;
|
|
12
|
+
kind: "id" | "number" | "time" | "text" | "outcome" | "word";
|
|
13
|
+
}
|
|
14
|
+
/** The query's terms as conditions, AND-ed: `nativeTerms` has already refused anything the portal cannot ask. */
|
|
15
|
+
export declare const conditionsOf: (terms: ReadonlyMap<string, Predicate>, fields: Readonly<Record<string, FieldMap>>) => Condition[];
|
|
16
|
+
/** A free word needs REST 2's substring match: REST 3.0 compares whole values only. */
|
|
17
|
+
export declare const needsRest2: (conditions: readonly Condition[]) => boolean;
|
|
18
|
+
/**
|
|
19
|
+
* REST 3.0's filter is always an array of triples: a filter that is not an array is ignored and every item comes back
|
|
20
|
+
* (apidocs crm.<type>.list).
|
|
21
|
+
*/
|
|
22
|
+
export declare const rest3Filter: (conditions: readonly Condition[]) => [string, string, string | number][];
|
|
23
|
+
/** REST 2's filter: the operator is a prefix of the key, `%` a substring match (apidocs crm.item.list). */
|
|
24
|
+
export declare const rest2Filter: (conditions: readonly Condition[], words?: Readonly<Record<string, readonly string[]>>) => Record<string, unknown>;
|
|
25
|
+
//# sourceMappingURL=conditions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conditions.d.ts","sourceRoot":"","sources":["../../src/crm/conditions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAIxD,MAAM,MAAM,QAAQ,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,MAAM,CAAA;AAE7D,uGAAuG;AACvG,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,EAAE,EAAE,QAAQ,CAAA;IACZ,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CACvB;AAED,0FAA0F;AAC1F,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAA;CAC7D;AAkCD,iHAAiH;AACjH,eAAO,MAAM,YAAY,UAAW,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,gBAiB1G,CAAA;AAEJ,uFAAuF;AACvF,eAAO,MAAM,UAAU,eAAgB,SAAS,SAAS,EAAE,YAAgD,CAAA;AAE3G;;;GAGG;AACH,eAAO,MAAM,WAAW,eAAgB,SAAS,SAAS,EAAE,KAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAI5F,CAAA;AAEJ,2GAA2G;AAC3G,eAAO,MAAM,WAAW,eACV,SAAS,SAAS,EAAE,UACzB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,4BAWnD,CAAA"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { timeBounds } from "@wirecat/cli-core/cli";
|
|
3
|
+
import { semanticsOf } from "./values.js";
|
|
4
|
+
const bare = (value) => value.replace(/^\*+|\*+$/g, "");
|
|
5
|
+
const valueFor = (kind, raw, name) => {
|
|
6
|
+
if (kind === "id" || kind === "number") {
|
|
7
|
+
const found = Number(raw);
|
|
8
|
+
if (!Number.isFinite(found) || (kind === "id" && !/^[1-9]\d*$/.test(raw)))
|
|
9
|
+
throw new CliError("validation_error", `${name} takes ${kind === "id" ? "an id" : "a number"}; got ${raw}`, {
|
|
10
|
+
reason: "query.bad-value",
|
|
11
|
+
});
|
|
12
|
+
return found;
|
|
13
|
+
}
|
|
14
|
+
if (kind === "outcome")
|
|
15
|
+
return semanticsOf(raw.toLowerCase());
|
|
16
|
+
return raw;
|
|
17
|
+
};
|
|
18
|
+
const range = (node, map, name) => {
|
|
19
|
+
const out = [];
|
|
20
|
+
if (node.value !== "*")
|
|
21
|
+
out.push({
|
|
22
|
+
field: map.field,
|
|
23
|
+
op: node.lower_inclusive === false ? ">" : ">=",
|
|
24
|
+
value: valueFor(map.kind, node.value, name),
|
|
25
|
+
});
|
|
26
|
+
if (node.upper !== undefined && node.upper !== "*")
|
|
27
|
+
out.push({
|
|
28
|
+
field: map.field,
|
|
29
|
+
op: node.upper_inclusive === false ? "<" : "<=",
|
|
30
|
+
value: valueFor(map.kind, node.upper, name),
|
|
31
|
+
});
|
|
32
|
+
return out;
|
|
33
|
+
};
|
|
34
|
+
/** The query's terms as conditions, AND-ed: `nativeTerms` has already refused anything the portal cannot ask. */
|
|
35
|
+
export const conditionsOf = (terms, fields) => [...terms].flatMap(([name, node]) => {
|
|
36
|
+
const map = fields[name];
|
|
37
|
+
if (!map)
|
|
38
|
+
throw new CliError("validation_error", `the portal cannot filter by ${name}`, {
|
|
39
|
+
reason: "query.unsupported-field",
|
|
40
|
+
});
|
|
41
|
+
if (map.kind === "word")
|
|
42
|
+
return [{ field: map.field, op: "like", value: bare(node.value) }];
|
|
43
|
+
if (map.kind === "time") {
|
|
44
|
+
const { since, until } = timeBounds(node);
|
|
45
|
+
return [
|
|
46
|
+
...(since === undefined ? [] : [{ field: map.field, op: ">=", value: new Date(since).toISOString() }]),
|
|
47
|
+
...(until === undefined ? [] : [{ field: map.field, op: "<=", value: new Date(until).toISOString() }]),
|
|
48
|
+
];
|
|
49
|
+
}
|
|
50
|
+
if (node.operator === "range")
|
|
51
|
+
return range(node, map, name);
|
|
52
|
+
return [{ field: map.field, op: "=", value: valueFor(map.kind, node.value, name) }];
|
|
53
|
+
});
|
|
54
|
+
/** A free word needs REST 2's substring match: REST 3.0 compares whole values only. */
|
|
55
|
+
export const needsRest2 = (conditions) => conditions.some((one) => one.op === "like");
|
|
56
|
+
/**
|
|
57
|
+
* REST 3.0's filter is always an array of triples: a filter that is not an array is ignored and every item comes back
|
|
58
|
+
* (apidocs crm.<type>.list).
|
|
59
|
+
*/
|
|
60
|
+
export const rest3Filter = (conditions) => conditions.map(({ field, op, value }) => {
|
|
61
|
+
if (op === "like")
|
|
62
|
+
throw new Error("a substring condition goes to REST 2");
|
|
63
|
+
return [field, op, value];
|
|
64
|
+
});
|
|
65
|
+
/** REST 2's filter: the operator is a prefix of the key, `%` a substring match (apidocs crm.item.list). */
|
|
66
|
+
export const rest2Filter = (conditions, words = {}) => {
|
|
67
|
+
const filter = {};
|
|
68
|
+
let group = 0;
|
|
69
|
+
for (const { field, op, value } of conditions) {
|
|
70
|
+
const alternatives = op === "like" ? words[field] : undefined;
|
|
71
|
+
if (alternatives && alternatives.length > 1)
|
|
72
|
+
filter[String(group++)] = { logic: "OR", ...Object.fromEntries(alternatives.map((one) => [`%${one}`, value])) };
|
|
73
|
+
else
|
|
74
|
+
filter[`${op === "like" ? "%" : op === "=" ? "=" : op}${field}`] = value;
|
|
75
|
+
}
|
|
76
|
+
return filter;
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=conditions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conditions.js","sourceRoot":"","sources":["../../src/crm/conditions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
import type { FieldMap } from "./conditions.js";
|
|
3
|
+
import type { ItemType } from "./items.js";
|
|
4
|
+
import { type Raw } from "./values.js";
|
|
5
|
+
export declare const dealSchema: v.StrictObjectSchema<{
|
|
6
|
+
readonly id: v.StringSchema<undefined>;
|
|
7
|
+
readonly title: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
8
|
+
readonly pipeline_id: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
9
|
+
readonly stage_id: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
10
|
+
readonly outcome: v.PicklistSchema<readonly ["open", "won", "lost"], undefined>;
|
|
11
|
+
readonly amount: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
|
|
12
|
+
readonly currency: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
13
|
+
readonly assigned_to: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
14
|
+
readonly organization_id: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
15
|
+
readonly person_ids: v.ArraySchema<v.StringSchema<undefined>, undefined>;
|
|
16
|
+
readonly closes_on: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
17
|
+
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>;
|
|
18
|
+
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>;
|
|
19
|
+
readonly url: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
20
|
+
readonly provider_metadata: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
|
|
21
|
+
}, undefined>;
|
|
22
|
+
export type Deal = v.InferOutput<typeof dealSchema>;
|
|
23
|
+
export declare const DEAL_FIELDS: Record<string, FieldMap>;
|
|
24
|
+
/** Bitrix24 ⇄ neutral for a deal. */
|
|
25
|
+
export declare const fromBitrixDeal: (raw: Raw, custom?: Raw) => Deal;
|
|
26
|
+
export declare const DEAL: ItemType<Deal>;
|
|
27
|
+
//# sourceMappingURL=deal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deal.d.ts","sourceRoot":"","sources":["../../src/crm/deal.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,EASL,KAAK,GAAG,EAGT,MAAM,aAAa,CAAA;AAEpB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;aAgBrB,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,qCAAqC;AACrC,eAAO,MAAM,cAAc,QAAS,GAAG,WAAW,GAAG,KAAG,IAgBtD,CAAA;AAEF,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,IAAI,CAuB/B,CAAA"}
|
package/dist/crm/deal.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
import { customFields, id, ids, metadataSchema, nullableTime, number, OUTCOMES, outcomeOf, text, time, } from "./values.js";
|
|
3
|
+
export const dealSchema = v.strictObject({
|
|
4
|
+
id: v.string(),
|
|
5
|
+
title: v.nullable(v.string()),
|
|
6
|
+
pipeline_id: v.nullable(v.string()),
|
|
7
|
+
stage_id: v.nullable(v.string()),
|
|
8
|
+
outcome: v.picklist(OUTCOMES),
|
|
9
|
+
amount: v.nullable(v.number()),
|
|
10
|
+
currency: v.nullable(v.string()),
|
|
11
|
+
assigned_to: v.nullable(v.string()),
|
|
12
|
+
organization_id: v.nullable(v.string()),
|
|
13
|
+
person_ids: v.array(v.string()),
|
|
14
|
+
closes_on: v.nullable(v.string()),
|
|
15
|
+
created_at: nullableTime,
|
|
16
|
+
updated_at: nullableTime,
|
|
17
|
+
url: v.nullable(v.string()),
|
|
18
|
+
provider_metadata: metadataSchema,
|
|
19
|
+
});
|
|
20
|
+
export const DEAL_FIELDS = {
|
|
21
|
+
title: { field: "title", kind: "word" },
|
|
22
|
+
pipeline_id: { field: "categoryId", kind: "id" },
|
|
23
|
+
stage_id: { field: "stageId", kind: "text" },
|
|
24
|
+
outcome: { field: "stageSemanticId", kind: "outcome" },
|
|
25
|
+
amount: { field: "opportunity", kind: "number" },
|
|
26
|
+
currency: { field: "currencyId", kind: "text" },
|
|
27
|
+
assigned_to: { field: "assignedById", kind: "id" },
|
|
28
|
+
organization_id: { field: "companyId", kind: "id" },
|
|
29
|
+
created_at: { field: "createdTime", kind: "time" },
|
|
30
|
+
updated_at: { field: "updatedTime", kind: "time" },
|
|
31
|
+
};
|
|
32
|
+
/** Bitrix24 ⇄ neutral for a deal. */
|
|
33
|
+
export const fromBitrixDeal = (raw, custom) => ({
|
|
34
|
+
id: id(raw.id) ?? "",
|
|
35
|
+
title: text(raw.title),
|
|
36
|
+
pipeline_id: text(raw.categoryId),
|
|
37
|
+
stage_id: text(raw.stageId),
|
|
38
|
+
outcome: outcomeOf(raw.stageSemanticId),
|
|
39
|
+
amount: number(raw.opportunity),
|
|
40
|
+
currency: text(raw.currencyId),
|
|
41
|
+
assigned_to: id(raw.assignedById),
|
|
42
|
+
organization_id: id(raw.companyId),
|
|
43
|
+
person_ids: ids(raw.contactsId),
|
|
44
|
+
closes_on: text(raw.closeTime)?.slice(0, 10) ?? null,
|
|
45
|
+
created_at: time(raw.createdTime),
|
|
46
|
+
updated_at: time(raw.updatedTime),
|
|
47
|
+
url: text(raw.url),
|
|
48
|
+
...(custom && Object.keys(customFields(custom)).length ? { provider_metadata: customFields(custom) } : {}),
|
|
49
|
+
});
|
|
50
|
+
export const DEAL = {
|
|
51
|
+
type: "deal",
|
|
52
|
+
entityTypeId: 2,
|
|
53
|
+
word: "deal",
|
|
54
|
+
select: [
|
|
55
|
+
"id",
|
|
56
|
+
"title",
|
|
57
|
+
"categoryId",
|
|
58
|
+
"stageId",
|
|
59
|
+
"stageSemanticId",
|
|
60
|
+
"opportunity",
|
|
61
|
+
"currencyId",
|
|
62
|
+
"assignedById",
|
|
63
|
+
"companyId",
|
|
64
|
+
"contactsId",
|
|
65
|
+
"closeTime",
|
|
66
|
+
"createdTime",
|
|
67
|
+
"updatedTime",
|
|
68
|
+
"url",
|
|
69
|
+
],
|
|
70
|
+
words: ["title"],
|
|
71
|
+
nameOf: (deal) => deal.title,
|
|
72
|
+
map: fromBitrixDeal,
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=deal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deal.js","sourceRoot":"","sources":["../../src/crm/deal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { BitrixTransport } from "../bitrix/transport.js";
|
|
2
|
+
import { type Condition } from "./conditions.js";
|
|
3
|
+
import { type Raw } from "./values.js";
|
|
4
|
+
import { type Window } from "./walk.js";
|
|
5
|
+
/** A CRM object REST 3.0 serves as `crm.<type>.*`, and REST 2 as `crm.item.*` with its `entityTypeId`. */
|
|
6
|
+
export interface ItemType<T> {
|
|
7
|
+
type: "deal" | "lead" | "contact" | "company";
|
|
8
|
+
entityTypeId: number;
|
|
9
|
+
/** What a person calls one, in a message: `deal`, `person`. */
|
|
10
|
+
word: string;
|
|
11
|
+
select: readonly string[];
|
|
12
|
+
/** The fields a free word in a list query, or a name in `show`, is matched against. */
|
|
13
|
+
words: readonly string[];
|
|
14
|
+
nameOf: (item: T) => string | null;
|
|
15
|
+
map: (raw: Raw, custom?: Raw) => T;
|
|
16
|
+
}
|
|
17
|
+
export declare const listItems: <T>(portal: BitrixTransport, type: ItemType<T>, conditions: readonly Condition[], window: Window) => Promise<{
|
|
18
|
+
items: T[];
|
|
19
|
+
has_more: boolean;
|
|
20
|
+
}>;
|
|
21
|
+
/** One item, with the portal's custom fields, which REST 3.0 returns only when each is named in `select`. */
|
|
22
|
+
export declare const getItem: <T>(portal: BitrixTransport, type: ItemType<T>, id: string) => Promise<T>;
|
|
23
|
+
/**
|
|
24
|
+
* An id as it is, or a name matched whole against the portal's substring search; two matches are refused with both,
|
|
25
|
+
* never guessed (as cli-core's `pickPerson` refuses).
|
|
26
|
+
*/
|
|
27
|
+
export declare const resolveItem: <T extends {
|
|
28
|
+
id: string;
|
|
29
|
+
}>(portal: BitrixTransport, type: ItemType<T>, reference: string) => Promise<string>;
|
|
30
|
+
//# sourceMappingURL=items.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"items.d.ts","sourceRoot":"","sources":["../../src/crm/items.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,KAAK,SAAS,EAAwC,MAAM,iBAAiB,CAAA;AACtF,OAAO,EAAgB,KAAK,GAAG,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,WAAW,CAAA;AAE7C,0GAA0G;AAC1G,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;IAC7C,YAAY,EAAE,MAAM,CAAA;IACpB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;IACzB,uFAAuF;IACvF,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACxB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,CAAA;IAClC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;CACnC;AAaD,eAAO,MAAM,SAAS,GAAU,CAAC,UACvB,eAAe,QACjB,QAAQ,CAAC,CAAC,CAAC,cACL,SAAS,SAAS,EAAE,UACxB,MAAM;;;EA2Bf,CAAA;AAED,6GAA6G;AAC7G,eAAO,MAAM,OAAO,GAAU,CAAC,UAAU,eAAe,QAAQ,QAAQ,CAAC,CAAC,CAAC,MAAM,MAAM,KAAG,OAAO,CAAC,CAAC,CAUlG,CAAA;AAID;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAU,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,UAChD,eAAe,QACjB,QAAQ,CAAC,CAAC,CAAC,aACN,MAAM,KAChB,OAAO,CAAC,MAAM,CAuBhB,CAAA"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { needsRest2, rest2Filter, rest3Filter } from "./conditions.js";
|
|
3
|
+
import { customFields } from "./values.js";
|
|
4
|
+
import { walk } from "./walk.js";
|
|
5
|
+
const REST3_PAGE = 1000;
|
|
6
|
+
const REST2_PAGE = 50;
|
|
7
|
+
const itemsOf = (result) => {
|
|
8
|
+
const items = result?.items;
|
|
9
|
+
return Array.isArray(items) ? items : [];
|
|
10
|
+
};
|
|
11
|
+
/** Newest first; REST 3.0 adds `id` itself for stable pages. */
|
|
12
|
+
const ORDER = { id: "DESC" };
|
|
13
|
+
export const listItems = async (portal, type, conditions, window) => {
|
|
14
|
+
const { items, has_more } = needsRest2(conditions)
|
|
15
|
+
? await walk(window, REST2_PAGE, async (start) => {
|
|
16
|
+
const answer = await portal.call("crm.item.list", {
|
|
17
|
+
entityTypeId: type.entityTypeId,
|
|
18
|
+
select: type.select,
|
|
19
|
+
filter: rest2Filter(conditions, { [type.words[0] ?? "title"]: type.words }),
|
|
20
|
+
order: ORDER,
|
|
21
|
+
start,
|
|
22
|
+
});
|
|
23
|
+
return { rows: itemsOf(answer.result), more: answer.next !== undefined };
|
|
24
|
+
})
|
|
25
|
+
: await walk(window, REST3_PAGE, async (offset, limit) => {
|
|
26
|
+
const rows = itemsOf((await portal.call(`crm.${type.type}.list`, {
|
|
27
|
+
select: type.select,
|
|
28
|
+
filter: rest3Filter(conditions),
|
|
29
|
+
order: ORDER,
|
|
30
|
+
pagination: { limit, offset },
|
|
31
|
+
})).result);
|
|
32
|
+
return { rows, more: rows.length === limit };
|
|
33
|
+
});
|
|
34
|
+
return { items: items.map((raw) => type.map(raw)), has_more };
|
|
35
|
+
};
|
|
36
|
+
/** One item, with the portal's custom fields, which REST 3.0 returns only when each is named in `select`. */
|
|
37
|
+
export const getItem = async (portal, type, id) => {
|
|
38
|
+
const answer = await portal.call(`crm.${type.type}.get`, { id: Number(id), select: type.select });
|
|
39
|
+
const item = answer.result?.item;
|
|
40
|
+
if (!item)
|
|
41
|
+
throw new CliError("not_found", `there is no ${type.word} ${id}`);
|
|
42
|
+
const full = await portal.call("crm.item.get", {
|
|
43
|
+
entityTypeId: type.entityTypeId,
|
|
44
|
+
id: Number(id),
|
|
45
|
+
useOriginalUfNames: "Y",
|
|
46
|
+
});
|
|
47
|
+
return type.map(item, customFields(full.result?.item));
|
|
48
|
+
};
|
|
49
|
+
const folded = (value) => value?.trim().toLocaleLowerCase() ?? "";
|
|
50
|
+
/**
|
|
51
|
+
* An id as it is, or a name matched whole against the portal's substring search; two matches are refused with both,
|
|
52
|
+
* never guessed (as cli-core's `pickPerson` refuses).
|
|
53
|
+
*/
|
|
54
|
+
export const resolveItem = async (portal, type, reference) => {
|
|
55
|
+
if (/^[1-9]\d*$/.test(reference))
|
|
56
|
+
return reference;
|
|
57
|
+
const word = type.words[0] ?? "title";
|
|
58
|
+
const found = await listItems(portal, type, [{ field: word, op: "like", value: reference.trim() }], {
|
|
59
|
+
offset: 0,
|
|
60
|
+
limit: 20,
|
|
61
|
+
});
|
|
62
|
+
const exact = found.items.filter((item) => folded(type.nameOf(item)) === folded(reference));
|
|
63
|
+
const candidates = (exact.length ? exact : found.items).map((item) => ({ id: item.id, name: type.nameOf(item) }));
|
|
64
|
+
if (exact.length === 1 && exact[0])
|
|
65
|
+
return exact[0].id;
|
|
66
|
+
if (exact.length > 1)
|
|
67
|
+
throw new CliError("validation_error", `${exact.length} ${type.word} records have that name; name one by its id`, {
|
|
68
|
+
reason: `${type.word}.ambiguous`,
|
|
69
|
+
candidates,
|
|
70
|
+
});
|
|
71
|
+
throw new CliError("not_found", `no ${type.word} has exactly that name${candidates.length ? "; close ones are in candidates" : ""}`, {
|
|
72
|
+
reason: `${type.word}.not-found`,
|
|
73
|
+
candidates,
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=items.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"items.js","sourceRoot":"","sources":["../../src/crm/items.ts"],"names":[],"mappings":"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"}
|