@haiiro/docuflow 0.0.11 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/README.md +45 -9
  2. package/manifest.json +117 -16
  3. package/package.json +6 -3
  4. package/public/app/docflow-app.css +2 -0
  5. package/public/app/docflow-app.js +94 -0
  6. package/src/front-components/docflow-documents.front-component.mjs +42 -42
  7. package/src/front-components/docflow-documents.front-component.tsx +336 -128
  8. package/src/front-components/docflow-processes.front-component.mjs +35 -35
  9. package/src/front-components/docflow-processes.front-component.tsx +527 -131
  10. package/src/front-components/docflow-tasks.front-component.mjs +46 -41
  11. package/src/front-components/docflow-tasks.front-component.tsx +489 -132
  12. package/src/front-components/launch-process.front-component.mjs +75 -0
  13. package/src/front-components/launch-process.front-component.tsx +270 -0
  14. package/src/front-components/process-steps.front-component.mjs +25 -25
  15. package/src/front-components/process-steps.front-component.tsx +55 -10
  16. package/src/front-components/task-form.front-component.mjs +46 -41
  17. package/src/logic-functions/bitrix-app.logic-function.mjs +424 -198
  18. package/src/logic-functions/bitrix-app.logic-function.ts +54 -82
  19. package/src/logic-functions/bitrix-install.logic-function.mjs +0 -11
  20. package/src/logic-functions/bitrix-install.logic-function.ts +0 -3
  21. package/src/logic-functions/capture-file.logic-function.mjs +2 -1
  22. package/src/logic-functions/docflow-app-session.logic-function.mjs +60043 -0
  23. package/src/logic-functions/docflow-app-session.logic-function.ts +54 -0
  24. package/src/logic-functions/docflow-app.logic-function.mjs +60122 -0
  25. package/src/logic-functions/docflow-app.logic-function.ts +37 -0
  26. package/src/logic-functions/hand-out-form-step.logic-function.mjs +2 -1
  27. package/src/logic-functions/launch-process.logic-function.mjs +113 -29
  28. package/src/logic-functions/launch-process.logic-function.ts +83 -22
  29. package/src/logic-functions/on-workflow-run-updated.logic-function.mjs +2 -1
  30. package/src/logic-functions/publish-process.logic-function.mjs +119519 -0
  31. package/src/logic-functions/publish-process.logic-function.ts +91 -0
  32. package/src/logic-functions/save-launch-fields.logic-function.mjs +178 -10
  33. package/src/logic-functions/save-launch-fields.logic-function.ts +24 -6
@@ -1673,37 +1673,6 @@ var __anyHandler = {
1673
1673
  var __anyStub = new Proxy(() => void 0, __anyHandler);
1674
1674
  var defineLogicFunction = __defineFactoryStub;
1675
1675
 
1676
- // src/shared/api/rest-filter.util.ts
1677
- var UNSAFE_FILTER_CHARACTERS = /[()[\]'",]/g;
1678
- var sanitizeFilterText = (text) => text.replace(UNSAFE_FILTER_CHARACTERS, " ").trim();
1679
- var quote = (value) => `'${sanitizeFilterText(value)}'`;
1680
- var restEq = (field, value) => `${field}[eq]:${quote(value)}`;
1681
- var restNeq = (field, value) => `${field}[neq]:${quote(value)}`;
1682
- var restIsNull = (field) => `${field}[is]:NULL`;
1683
- var restAnd = (...conditions) => {
1684
- const present = conditions.filter(
1685
- (condition) => condition !== void 0
1686
- );
1687
- return present.length === 0 ? void 0 : `and(${present.join(",")})`;
1688
- };
1689
- var restOr = (...conditions) => `or(${conditions.join(",")})`;
1690
-
1691
- // src/shared/api/rest-response.util.ts
1692
- var readDataValue = (response) => {
1693
- const data = response?.data;
1694
- if (typeof data !== "object" || data === null) {
1695
- return void 0;
1696
- }
1697
- return Object.values(data)[0];
1698
- };
1699
- var readRestList = (response) => {
1700
- const value = readDataValue(response);
1701
- return {
1702
- records: Array.isArray(value) ? value : [],
1703
- pageInfo: response?.pageInfo ?? {}
1704
- };
1705
- };
1706
-
1707
1676
  // src/shared/bitrix/bitrix.util.ts
1708
1677
  var BITRIX_OAUTH_TOKEN_URL = "https://oauth.bitrix.info/oauth/token/";
1709
1678
  var BITRIX_PORTAL_KV_KEY = "bitrix:portal";
@@ -1839,101 +1808,78 @@ var callBitrix = async ({
1839
1808
  return body.result;
1840
1809
  };
1841
1810
 
1842
- // src/shared/docflow.constants.ts
1843
- var DOCFLOW_SECTION = "DOCFLOW";
1844
- var DOCFLOW_LAUNCH_PARAMETERS_KEY = "smbDocflowParameters";
1845
- var LAUNCH_PARAMETERS_STEP_INPUT = `{{trigger.${DOCFLOW_LAUNCH_PARAMETERS_KEY}}}`;
1846
- var TASK_DONE_STATUS = "DONE";
1811
+ // src/shared/app/docflow-app.util.ts
1812
+ var DOCFLOW_APP_SECTIONS = ["tasks", "processes", "documents"];
1813
+ var readDocflowAppSection = (value) => DOCFLOW_APP_SECTIONS.find((section) => section === value) ?? "tasks";
1814
+ var SESSION_RENEW_BEFORE_MS = 10 * 60 * 1e3;
1815
+ var SESSION_EXPIRY_MARGIN_MS = 60 * 1e3;
1847
1816
 
1848
- // node_modules/twenty-sdk/dist/logic-function/isDefined-Dtu5EYqP-CMNeFg4z.mjs
1849
- var import_guards = __toESM(require_build(), 1);
1850
- var n = (n4) => !(0, import_guards.isUndefined)(n4) && !(0, import_guards.isNull)(n4);
1851
-
1852
- // node_modules/twenty-sdk/dist/logic-function/index.mjs
1853
- var import_guards2 = __toESM(require_build(), 1);
1817
+ // src/server/bitrix-member.ts
1818
+ import { randomBytes } from "node:crypto";
1854
1819
 
1855
- // node_modules/uuid/dist-node/stringify.js
1856
- var byteToHex = [];
1857
- for (let i5 = 0; i5 < 256; ++i5) {
1858
- byteToHex.push((i5 + 256).toString(16).slice(1));
1859
- }
1860
- function unsafeStringify(arr, offset = 0) {
1861
- return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
1862
- }
1863
-
1864
- // node_modules/uuid/dist-node/rng.js
1865
- import { randomFillSync } from "node:crypto";
1866
- var rnds8Pool = new Uint8Array(256);
1867
- var poolPtr = rnds8Pool.length;
1868
- function rng() {
1869
- if (poolPtr > rnds8Pool.length - 16) {
1870
- randomFillSync(rnds8Pool);
1871
- poolPtr = 0;
1872
- }
1873
- return rnds8Pool.slice(poolPtr, poolPtr += 16);
1874
- }
1875
-
1876
- // node_modules/uuid/dist-node/native.js
1877
- import { randomUUID } from "node:crypto";
1878
- var native_default = { randomUUID };
1820
+ // src/shared/api/rest-filter.util.ts
1821
+ var UNSAFE_FILTER_CHARACTERS = /[()[\]'",]/g;
1822
+ var sanitizeFilterText = (text) => text.replace(UNSAFE_FILTER_CHARACTERS, " ").trim();
1823
+ var quote = (value) => `'${sanitizeFilterText(value)}'`;
1824
+ var restEq = (field, value) => `${field}[eq]:${quote(value)}`;
1879
1825
 
1880
- // node_modules/uuid/dist-node/v4.js
1881
- function _v4(options, buf, offset) {
1882
- options = options || {};
1883
- const rnds = options.random ?? options.rng?.() ?? rng();
1884
- if (rnds.length < 16) {
1885
- throw new Error("Random bytes length must be >= 16");
1886
- }
1887
- rnds[6] = rnds[6] & 15 | 64;
1888
- rnds[8] = rnds[8] & 63 | 128;
1889
- if (buf) {
1890
- offset = offset || 0;
1891
- if (offset < 0 || offset + 16 > buf.length) {
1892
- throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);
1893
- }
1894
- for (let i5 = 0; i5 < 16; ++i5) {
1895
- buf[offset + i5] = rnds[i5];
1896
- }
1897
- return buf;
1898
- }
1899
- return unsafeStringify(rnds);
1900
- }
1901
- function v4(options, buf, offset) {
1902
- if (native_default.randomUUID && !buf && !options) {
1903
- return native_default.randomUUID();
1826
+ // src/shared/api/rest-response.util.ts
1827
+ var readDataValue = (response) => {
1828
+ const data = response?.data;
1829
+ if (typeof data !== "object" || data === null) {
1830
+ return void 0;
1904
1831
  }
1905
- return _v4(options, buf, offset);
1906
- }
1907
- var v4_default = v4;
1832
+ return Object.values(data)[0];
1833
+ };
1834
+ var readRestList = (response) => {
1835
+ const value = readDataValue(response);
1836
+ return {
1837
+ records: Array.isArray(value) ? value : [],
1838
+ pageInfo: response?.pageInfo ?? {},
1839
+ totalCount: response?.totalCount
1840
+ };
1841
+ };
1842
+ var readRestRecord = (response) => {
1843
+ const value = readDataValue(response);
1844
+ return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
1845
+ };
1908
1846
 
1909
- // node_modules/twenty-sdk/dist/logic-function/index.mjs
1910
- var l4 = __toESM(require_react(), 1);
1911
- import { MetadataApiClient as u3 } from "twenty-client-sdk/metadata";
1847
+ // src/shared/bitrix/bitrix-user.util.ts
1848
+ var readText = (value) => typeof value === "string" ? value.trim() : "";
1849
+ var readBitrixUserEmail = (user) => {
1850
+ const email = readText(user.EMAIL);
1851
+ return email.length > 0 ? email.toLowerCase() : void 0;
1852
+ };
1853
+ var readBitrixUserName = (user) => {
1854
+ const firstName = readText(user.NAME);
1855
+ const lastName = [readText(user.LAST_NAME), readText(user.SECOND_NAME)].filter((part) => part.length > 0).join(" ");
1856
+ return { firstName, lastName };
1857
+ };
1912
1858
 
1913
1859
  // node_modules/twenty-client-sdk/dist/chunk-Dqa2HsxW.mjs
1914
- var e2 = Object.create;
1915
- var t2 = Object.defineProperty;
1916
- var n2 = Object.getOwnPropertyDescriptor;
1860
+ var e = Object.create;
1861
+ var t = Object.defineProperty;
1862
+ var n = Object.getOwnPropertyDescriptor;
1917
1863
  var r = Object.getOwnPropertyNames;
1918
1864
  var i = Object.getPrototypeOf;
1919
1865
  var a = Object.prototype.hasOwnProperty;
1920
1866
  var o = (e3, t4) => () => (t4 || (e3((t4 = { exports: {} }).exports, t4), e3 = null), t4.exports);
1921
1867
  var s = (e3, n4) => {
1922
1868
  let r4 = {};
1923
- for (var i5 in e3) t2(r4, i5, {
1869
+ for (var i5 in e3) t(r4, i5, {
1924
1870
  get: e3[i5],
1925
1871
  enumerable: true
1926
1872
  });
1927
- return n4 || t2(r4, Symbol.toStringTag, { value: "Module" }), r4;
1873
+ return n4 || t(r4, Symbol.toStringTag, { value: "Module" }), r4;
1928
1874
  };
1929
1875
  var c = (e3, i5, o5, s5) => {
1930
- if (i5 && typeof i5 == "object" || typeof i5 == "function") for (var c4 = r(i5), l5 = 0, u4 = c4.length, d2; l5 < u4; l5++) d2 = c4[l5], !a.call(e3, d2) && d2 !== o5 && t2(e3, d2, {
1876
+ if (i5 && typeof i5 == "object" || typeof i5 == "function") for (var c4 = r(i5), l5 = 0, u4 = c4.length, d2; l5 < u4; l5++) d2 = c4[l5], !a.call(e3, d2) && d2 !== o5 && t(e3, d2, {
1931
1877
  get: ((e4) => i5[e4]).bind(null, d2),
1932
- enumerable: !(s5 = n2(i5, d2)) || s5.enumerable
1878
+ enumerable: !(s5 = n(i5, d2)) || s5.enumerable
1933
1879
  });
1934
1880
  return e3;
1935
1881
  };
1936
- var l = (n4, r4, a5) => (a5 = n4 == null ? {} : e2(i(n4)), c(r4 || !n4 || !n4.__esModule ? t2(a5, "default", {
1882
+ var l = (n4, r4, a5) => (a5 = n4 == null ? {} : e(i(n4)), c(r4 || !n4 || !n4.__esModule ? t(a5, "default", {
1937
1883
  value: n4,
1938
1884
  enumerable: true
1939
1885
  }) : a5, n4));
@@ -61274,7 +61220,201 @@ var u2 = class {
61274
61220
  }
61275
61221
  };
61276
61222
 
61223
+ // src/shared/docflow.constants.ts
61224
+ var DOCFLOW_LAUNCH_PARAMETERS_KEY = "smbDocflowParameters";
61225
+ var LAUNCH_PARAMETERS_STEP_INPUT = `{{trigger.${DOCFLOW_LAUNCH_PARAMETERS_KEY}}}`;
61226
+
61227
+ // src/server/records.ts
61228
+ var clients = {
61229
+ person: new u2(),
61230
+ application: new u2({ runAs: "application" })
61231
+ };
61232
+ var restClient = (runAs) => clients[runAs];
61233
+
61234
+ // src/server/bitrix-member.ts
61235
+ var callMetadataGraphql = async ({
61236
+ query,
61237
+ variables,
61238
+ token
61239
+ }) => {
61240
+ const apiUrl = process.env.TWENTY_API_URL?.replace(/\/$/, "");
61241
+ if (apiUrl === void 0 || apiUrl.length === 0) {
61242
+ throw new Error("TWENTY_API_URL is not set");
61243
+ }
61244
+ const headers = {
61245
+ "content-type": "application/json"
61246
+ };
61247
+ if (token !== void 0 && token.length > 0) {
61248
+ headers.authorization = `Bearer ${token}`;
61249
+ }
61250
+ const response = await fetch(`${apiUrl}/metadata`, {
61251
+ method: "POST",
61252
+ headers,
61253
+ body: JSON.stringify({ query, variables })
61254
+ });
61255
+ const body = await response.json().catch(() => null);
61256
+ const [firstError] = body?.errors ?? [];
61257
+ if (firstError !== void 0 || body?.data === void 0) {
61258
+ throw new Error(firstError?.message ?? `Metadata request failed with ${response.status}`);
61259
+ }
61260
+ return body.data;
61261
+ };
61262
+ var findMemberByEmail = async (email) => readRestList(
61263
+ await restClient("application").get("/rest/workspaceMembers", {
61264
+ query: { filter: restEq("userEmail", email), limit: 1 }
61265
+ })
61266
+ ).records[0];
61267
+ var loadWorkspaceInvite = async () => {
61268
+ const token = process.env.TWENTY_APP_APPLICATION_ACCESS_TOKEN ?? process.env.TWENTY_APP_ACCESS_TOKEN;
61269
+ const data = await callMetadataGraphql({
61270
+ query: `query {
61271
+ currentWorkspace { id inviteHash isPublicInviteLinkEnabled }
61272
+ }`,
61273
+ token
61274
+ });
61275
+ const inviteHash = data.currentWorkspace.inviteHash?.trim() ?? "";
61276
+ if (inviteHash.length === 0) {
61277
+ throw new Error("\u0423 \u043A\u043E\u043C\u043F\u0430\u043D\u0438\u0438 \u0432 CRM \u043D\u0435\u0442 \u0441\u0441\u044B\u043B\u043A\u0438-\u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u043D\u043E\u0432\u044B\u0445 \u0441\u043E\u0442\u0440\u0443\u0434\u043D\u0438\u043A\u043E\u0432");
61278
+ }
61279
+ if (data.currentWorkspace.isPublicInviteLinkEnabled === false) {
61280
+ throw new Error(
61281
+ "\u0412 CRM \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u0430 \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u0430\u044F \u0441\u0441\u044B\u043B\u043A\u0430-\u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435. \u0412\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u0435\u0451 \u0432 \xAB\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u2192 \u0423\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0438\xBB, \u0447\u0442\u043E\u0431\u044B \u0441\u043E\u0442\u0440\u0443\u0434\u043D\u0438\u043A\u0438 \u0438\u0437 \u0411\u0438\u0442\u0440\u0438\u043A\u044124 \u043F\u043E\u044F\u0432\u043B\u044F\u043B\u0438\u0441\u044C \u0441\u0430\u043C\u0438."
61282
+ );
61283
+ }
61284
+ return {
61285
+ id: data.currentWorkspace.id,
61286
+ inviteHash,
61287
+ isPublicInviteLinkEnabled: true
61288
+ };
61289
+ };
61290
+ var signUpMember = async (email, workspace) => {
61291
+ await callMetadataGraphql({
61292
+ query: `mutation SignUpInWorkspace(
61293
+ $email: String!
61294
+ $password: String!
61295
+ $workspaceId: UUID
61296
+ $workspaceInviteHash: String
61297
+ $locale: String
61298
+ ) {
61299
+ signUpInWorkspace(
61300
+ email: $email
61301
+ password: $password
61302
+ workspaceId: $workspaceId
61303
+ workspaceInviteHash: $workspaceInviteHash
61304
+ locale: $locale
61305
+ ) { workspace { id } }
61306
+ }`,
61307
+ variables: {
61308
+ email,
61309
+ password: randomBytes(24).toString("base64url"),
61310
+ workspaceId: workspace.id,
61311
+ workspaceInviteHash: workspace.inviteHash,
61312
+ locale: "ru-RU"
61313
+ }
61314
+ });
61315
+ };
61316
+ var nameIsEmpty = (member) => {
61317
+ const firstName = member.name?.firstName?.trim() ?? "";
61318
+ const lastName = member.name?.lastName?.trim() ?? "";
61319
+ return firstName.length === 0 && lastName.length === 0;
61320
+ };
61321
+ var applyBitrixName = async (member, user) => {
61322
+ const name = readBitrixUserName(user);
61323
+ if (name.firstName.length === 0 && name.lastName.length === 0) {
61324
+ return member;
61325
+ }
61326
+ if (!nameIsEmpty(member) && member.name?.firstName === name.firstName && member.name?.lastName === name.lastName) {
61327
+ return member;
61328
+ }
61329
+ if (!nameIsEmpty(member)) {
61330
+ return member;
61331
+ }
61332
+ return readRestRecord(
61333
+ await restClient("application").patch(`/rest/workspaceMembers/${member.id}`, { name })
61334
+ ) ?? { ...member, name };
61335
+ };
61336
+ var findOrCreateWorkspaceMemberFromBitrix = async (user) => {
61337
+ const email = readBitrixUserEmail(user);
61338
+ if (email === void 0) {
61339
+ return void 0;
61340
+ }
61341
+ const existing = await findMemberByEmail(email);
61342
+ if (existing !== void 0) {
61343
+ return applyBitrixName(existing, user);
61344
+ }
61345
+ const workspace = await loadWorkspaceInvite();
61346
+ await signUpMember(email, workspace);
61347
+ const created = await findMemberByEmail(email);
61348
+ if (created === void 0) {
61349
+ throw new Error("\u0421\u043E\u0442\u0440\u0443\u0434\u043D\u0438\u043A \u0441\u043E\u0437\u0434\u0430\u043D \u0432 CRM, \u043D\u043E \u0437\u0430\u043F\u0438\u0441\u044C \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430 \u043F\u043E \u043F\u043E\u0447\u0442\u0435");
61350
+ }
61351
+ return applyBitrixName(created, user);
61352
+ };
61353
+
61354
+ // node_modules/twenty-sdk/dist/logic-function/isDefined-Dtu5EYqP-CMNeFg4z.mjs
61355
+ var import_guards = __toESM(require_build(), 1);
61356
+ var n2 = (n4) => !(0, import_guards.isUndefined)(n4) && !(0, import_guards.isNull)(n4);
61357
+
61277
61358
  // node_modules/twenty-sdk/dist/logic-function/index.mjs
61359
+ var import_guards2 = __toESM(require_build(), 1);
61360
+
61361
+ // node_modules/uuid/dist-node/stringify.js
61362
+ var byteToHex = [];
61363
+ for (let i5 = 0; i5 < 256; ++i5) {
61364
+ byteToHex.push((i5 + 256).toString(16).slice(1));
61365
+ }
61366
+ function unsafeStringify(arr, offset = 0) {
61367
+ return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
61368
+ }
61369
+
61370
+ // node_modules/uuid/dist-node/rng.js
61371
+ import { randomFillSync } from "node:crypto";
61372
+ var rnds8Pool = new Uint8Array(256);
61373
+ var poolPtr = rnds8Pool.length;
61374
+ function rng() {
61375
+ if (poolPtr > rnds8Pool.length - 16) {
61376
+ randomFillSync(rnds8Pool);
61377
+ poolPtr = 0;
61378
+ }
61379
+ return rnds8Pool.slice(poolPtr, poolPtr += 16);
61380
+ }
61381
+
61382
+ // node_modules/uuid/dist-node/native.js
61383
+ import { randomUUID } from "node:crypto";
61384
+ var native_default = { randomUUID };
61385
+
61386
+ // node_modules/uuid/dist-node/v4.js
61387
+ function _v4(options, buf, offset) {
61388
+ options = options || {};
61389
+ const rnds = options.random ?? options.rng?.() ?? rng();
61390
+ if (rnds.length < 16) {
61391
+ throw new Error("Random bytes length must be >= 16");
61392
+ }
61393
+ rnds[6] = rnds[6] & 15 | 64;
61394
+ rnds[8] = rnds[8] & 63 | 128;
61395
+ if (buf) {
61396
+ offset = offset || 0;
61397
+ if (offset < 0 || offset + 16 > buf.length) {
61398
+ throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);
61399
+ }
61400
+ for (let i5 = 0; i5 < 16; ++i5) {
61401
+ buf[offset + i5] = rnds[i5];
61402
+ }
61403
+ return buf;
61404
+ }
61405
+ return unsafeStringify(rnds);
61406
+ }
61407
+ function v4(options, buf, offset) {
61408
+ if (native_default.randomUUID && !buf && !options) {
61409
+ return native_default.randomUUID();
61410
+ }
61411
+ return _v4(options, buf, offset);
61412
+ }
61413
+ var v4_default = v4;
61414
+
61415
+ // node_modules/twenty-sdk/dist/logic-function/index.mjs
61416
+ var l4 = __toESM(require_react(), 1);
61417
+ import { MetadataApiClient as u3 } from "twenty-client-sdk/metadata";
61278
61418
  var f2 = Object.defineProperty;
61279
61419
  var p2 = (e3, t4) => () => (t4 || (e3((t4 = { exports: {} }).exports, t4), e3 = null), t4.exports);
61280
61420
  var m2 = (e3, t4) => {
@@ -71982,17 +72122,17 @@ var gp2 = {
71982
72122
  };
71983
72123
  var _p = /* @__PURE__ */ new WeakSet();
71984
72124
  var vp = /* @__PURE__ */ new WeakMap();
71985
- var yp2 = (t4) => n(t4) && !(typeof t4 == "object" && _p.has(t4));
72125
+ var yp2 = (t4) => n2(t4) && !(typeof t4 == "object" && _p.has(t4));
71986
72126
  var bp = (e3) => typeof e3 == "object" && !!e3 && !Array.isArray(e3);
71987
72127
  var xp2 = (t4) => {
71988
- if (!n(t4) || t4 === "") return true;
72128
+ if (!n2(t4) || t4 === "") return true;
71989
72129
  if (Array.isArray(t4)) return t4.length === 0;
71990
72130
  if (!bp(t4) || t4 instanceof Date) return false;
71991
72131
  if (_p.has(t4)) return true;
71992
72132
  let n4 = vp.get(t4);
71993
72133
  if (n4 === W2.RICH_TEXT) return !(0, import_guards2.isNonEmptyString)(t4.markdown) || t4.markdown.trim().length === 0;
71994
- let i5 = n(n4) ? gp2[n4] : void 0;
71995
- return (n(i5) ? i5.map((e3) => t4[e3]) : Object.values(t4)).every(xp2);
72134
+ let i5 = n2(n4) ? gp2[n4] : void 0;
72135
+ return (n2(i5) ? i5.map((e3) => t4[e3]) : Object.values(t4)).every(xp2);
71996
72136
  };
71997
72137
  var Sp2 = {
71998
72138
  isDefined: {
@@ -116675,7 +116815,7 @@ var Vj2 = (t4, n4) => {
116675
116815
  if (!(0, import_guards2.isString)(n4)) return;
116676
116816
  let r4 = n4.split("."), i5 = t4;
116677
116817
  for (let t5 of r4) {
116678
- if (!n(i5) || !(0, import_guards2.isObject)(i5) || Bj2.has(t5) || !Object.prototype.hasOwnProperty.call(i5, t5)) return;
116818
+ if (!n2(i5) || !(0, import_guards2.isObject)(i5) || Bj2.has(t5) || !Object.prototype.hasOwnProperty.call(i5, t5)) return;
116679
116819
  i5 = i5[t5];
116680
116820
  }
116681
116821
  return i5;
@@ -116683,7 +116823,7 @@ var Vj2 = (t4, n4) => {
116683
116823
  var Hj2 = (e3, n4) => (r4, i5) => (0, import_guards2.isNonEmptyArray)(r4) ? r4[e3]((e4) => n4(Vj2(e4, i5))) : false;
116684
116824
  var Uj = (e3, n4) => (r4, i5, a5) => (0, import_guards2.isNonEmptyArray)(r4) ? r4[e3]((e4) => n4(Vj2(e4, i5), a5)) : false;
116685
116825
  var Wj2 = new ph2();
116686
- Wj2.functions.isDefined = (t4) => n(t4), Wj2.functions.isNonEmptyString = (e3) => (0, import_guards2.isNonEmptyString)(e3), Wj2.functions.includes = (e3, t4) => Array.isArray(e3) && e3.includes(t4), Wj2.functions.arrayLength = (e3) => Array.isArray(e3) ? e3.length : 0, Wj2.functions.every = Hj2("every", Boolean), Wj2.functions.everyDefined = Hj2("every", n), Wj2.functions.some = Hj2("some", Boolean), Wj2.functions.someDefined = Hj2("some", n), Wj2.functions.someNonEmptyString = Hj2("some", import_guards2.isNonEmptyString), Wj2.functions.none = Hj2("every", (e3) => !e3), Wj2.functions.noneDefined = Hj2("every", (t4) => !n(t4)), Wj2.functions.everyEquals = Uj("every", (e3, t4) => e3 === t4), Wj2.functions.someEquals = Uj("some", (e3, t4) => e3 === t4), Wj2.functions.noneEquals = Uj("every", (e3, t4) => e3 !== t4), Wj2.functions.includesEvery = Uj("every", (e3, t4) => Array.isArray(e3) && e3.includes(t4)), Wj2.functions.includesSome = Uj("some", (e3, t4) => Array.isArray(e3) && e3.includes(t4)), Wj2.functions.includesNone = Uj("every", (e3, t4) => Array.isArray(e3) && !e3.includes(t4));
116826
+ Wj2.functions.isDefined = (t4) => n2(t4), Wj2.functions.isNonEmptyString = (e3) => (0, import_guards2.isNonEmptyString)(e3), Wj2.functions.includes = (e3, t4) => Array.isArray(e3) && e3.includes(t4), Wj2.functions.arrayLength = (e3) => Array.isArray(e3) ? e3.length : 0, Wj2.functions.every = Hj2("every", Boolean), Wj2.functions.everyDefined = Hj2("every", n2), Wj2.functions.some = Hj2("some", Boolean), Wj2.functions.someDefined = Hj2("some", n2), Wj2.functions.someNonEmptyString = Hj2("some", import_guards2.isNonEmptyString), Wj2.functions.none = Hj2("every", (e3) => !e3), Wj2.functions.noneDefined = Hj2("every", (t4) => !n2(t4)), Wj2.functions.everyEquals = Uj("every", (e3, t4) => e3 === t4), Wj2.functions.someEquals = Uj("some", (e3, t4) => e3 === t4), Wj2.functions.noneEquals = Uj("every", (e3, t4) => e3 !== t4), Wj2.functions.includesEvery = Uj("every", (e3, t4) => Array.isArray(e3) && e3.includes(t4)), Wj2.functions.includesSome = Uj("some", (e3, t4) => Array.isArray(e3) && e3.includes(t4)), Wj2.functions.includesNone = Uj("every", (e3, t4) => Array.isArray(e3) && !e3.includes(t4));
116687
116827
  var Kj2 = [
116688
116828
  "yyyy.MM.dd",
116689
116829
  "yyyy/MM/dd",
@@ -118752,7 +118892,7 @@ var jF2 = (e3) => {
118752
118892
  var MF2 = /{{([^{}]+)}}/g;
118753
118893
  function* NF2(t4) {
118754
118894
  if ((0, import_guards2.isString)(t4)) {
118755
- for (let [, n4] of t4.matchAll(MF2)) n(n4) && (yield n4);
118895
+ for (let [, n4] of t4.matchAll(MF2)) n2(n4) && (yield n4);
118756
118896
  return;
118757
118897
  }
118758
118898
  if ((0, import_guards2.isObject)(t4)) for (let e3 of Object.values(t4)) yield* NF2(e3);
@@ -118772,9 +118912,9 @@ var FF2 = (e3, t4) => {
118772
118912
  return i5[e3.length][t4.length];
118773
118913
  };
118774
118914
  var IF2 = (t4) => {
118775
- if (!n(t4) || !Kf2(t4) || Array.isArray(t4)) return false;
118915
+ if (!n2(t4) || !Kf2(t4) || Array.isArray(t4)) return false;
118776
118916
  let n4 = Object.values(t4);
118777
- return n4.length === 0 ? false : n4.every((t5) => n(t5) && Kf2(t5) && Wf2(t5.isLeaf));
118917
+ return n4.length === 0 ? false : n4.every((t5) => n2(t5) && Kf2(t5) && Wf2(t5.isLeaf));
118778
118918
  };
118779
118919
  var LF2 = (e3, t4 = []) => {
118780
118920
  let n4 = [];
@@ -118790,21 +118930,21 @@ var RF2 = ({ schema: t4, propertyPath: n4 }) => {
118790
118930
  let r4 = t4;
118791
118931
  for (let t5 = 0; t5 < n4.length; t5++) {
118792
118932
  let i5 = n4[t5];
118793
- if (!n(i5)) return;
118933
+ if (!n2(i5)) return;
118794
118934
  if (!(0, import_guards2.isObject)(r4)) return {
118795
118935
  validPrefix: n4.slice(0, t5),
118796
118936
  failedSegment: i5,
118797
118937
  availableKeys: []
118798
118938
  };
118799
118939
  let o5 = r4[i5];
118800
- if (!n(o5)) return {
118940
+ if (!n2(o5)) return {
118801
118941
  validPrefix: n4.slice(0, t5),
118802
118942
  failedSegment: i5,
118803
118943
  availableKeys: Object.keys(r4)
118804
118944
  };
118805
118945
  if (o5.isLeaf) {
118806
118946
  let r5 = n4[t5 + 1];
118807
- return n(r5) ? {
118947
+ return n2(r5) ? {
118808
118948
  validPrefix: n4.slice(0, t5 + 1),
118809
118949
  failedSegment: r5,
118810
118950
  availableKeys: []
@@ -118841,9 +118981,9 @@ var KF2 = (e3, t4) => {
118841
118981
  };
118842
118982
  var qF2 = (t4, n4) => {
118843
118983
  let [r4, ...i5] = n4;
118844
- if (!n(r4)) return zF2;
118984
+ if (!n2(r4)) return zF2;
118845
118985
  let a5 = t4[r4];
118846
- return BF2(a5) ? WF2(a5, i5) : n(a5) ? i5.length === 0 ? { found: true } : bp(a5) ? qF2(a5, i5) : zF2 : zF2;
118986
+ return BF2(a5) ? WF2(a5, i5) : n2(a5) ? i5.length === 0 ? { found: true } : bp(a5) ? qF2(a5, i5) : zF2 : zF2;
118847
118987
  };
118848
118988
  var JF2 = (e3, t4) => t4.length === 0 || !bp(e3) ? zF2 : VF2(e3) ? GF2(e3.fields, t4) : HF2(e3) ? KF2(e3, t4) : qF2(e3, t4);
118849
118989
  var YF2 = ({ schema: e3, propertyPath: t4 }) => JF2(e3, t4);
@@ -118854,7 +118994,7 @@ var XF2 = (t4) => {
118854
118994
  let e3 = i5.value;
118855
118995
  if (VF2(e3)) for (let t5 of XF2(e3.fields)) n4.push(`${r4}.${t5}`);
118856
118996
  else if (bp(e3)) for (let t5 of XF2(e3)) n4.push(`${r4}.${t5}`);
118857
- } else if (n(i5) && (n4.push(r4), bp(i5))) for (let e3 of XF2(i5)) n4.push(`${r4}.${e3}`);
118997
+ } else if (n2(i5) && (n4.push(r4), bp(i5))) for (let e3 of XF2(i5)) n4.push(`${r4}.${e3}`);
118858
118998
  return n4;
118859
118999
  };
118860
119000
  var ZF2 = (t4) => {
@@ -118866,7 +119006,7 @@ var ZF2 = (t4) => {
118866
119006
  n4.push("first");
118867
119007
  for (let e3 of ZF2(t4.first.value)) n4.push(`first.${e3}`);
118868
119008
  }
118869
- return n(t4.all) && n4.push("all"), n4.push("totalCount"), n4;
119009
+ return n2(t4.all) && n4.push("all"), n4.push("totalCount"), n4;
118870
119010
  }
118871
119011
  return XF2(t4);
118872
119012
  };
@@ -118885,7 +119025,7 @@ var tI2 = ({ schema: n4, propertyPath: r4, referencedStepId: i5 }) => {
118885
119025
  schema: n4,
118886
119026
  propertyPath: r4
118887
119027
  });
118888
- if (!n(a5)) return [];
119028
+ if (!n2(a5)) return [];
118889
119029
  let o5 = eI2(a5.failedSegment, a5.availableKeys).map((e3) => [
118890
119030
  i5,
118891
119031
  ...a5.validPrefix,
@@ -118901,7 +119041,7 @@ var nI2 = ({ workflow: t4, graph: n4, stepsById: r4 }) => {
118901
119041
  let s5 = PF2(o5.settings?.input), c4 = n4.ancestorsByStepId.get(o5.id) ?? /* @__PURE__ */ new Set();
118902
119042
  for (let n5 of s5) {
118903
119043
  let s6 = jF2(n5), l5 = s6[0];
118904
- if (!n(l5)) {
119044
+ if (!n2(l5)) {
118905
119045
  i5.push({
118906
119046
  severity: "error",
118907
119047
  code: "VARIABLE_INVALID_PATH",
@@ -118950,8 +119090,8 @@ var nI2 = ({ workflow: t4, graph: n4, stepsById: r4 }) => {
118950
119090
  var rI2 = ({ step: n4, variable: r4, pathSegments: i5, referencedStepId: o5, isTriggerReference: s5, trigger: c4, stepsById: l5 }) => {
118951
119091
  let u4 = i5.slice(1);
118952
119092
  if (u4.length === 0) return [];
118953
- let d2 = s5 ? c4?.settings?.outputSchema : l5.get(o5)?.settings?.outputSchema, f3 = n(d2) && (0, import_guards2.isObject)(d2) && !Array.isArray(d2) && Object.keys(d2).length === 0;
118954
- if (!n(d2) || f3) return [];
119093
+ let d2 = s5 ? c4?.settings?.outputSchema : l5.get(o5)?.settings?.outputSchema, f3 = n2(d2) && (0, import_guards2.isObject)(d2) && !Array.isArray(d2) && Object.keys(d2).length === 0;
119094
+ if (!n2(d2) || f3) return [];
118955
119095
  if (!YF2({
118956
119096
  schema: d2,
118957
119097
  propertyPath: u4
@@ -118967,7 +119107,7 @@ var rI2 = ({ step: n4, variable: r4, pathSegments: i5, referencedStepId: o5, isT
118967
119107
  message: `Step "${n4.name ?? n4.id}" references variable "{{${r4}}}" but the path "${u4.join(".")}" was not found in the output of step "${o5}".`,
118968
119108
  stepId: n4.id,
118969
119109
  path: r4,
118970
- ...n(s6) ? { hint: s6 } : {},
119110
+ ...n2(s6) ? { hint: s6 } : {},
118971
119111
  ...(0, import_guards2.isNonEmptyArray)(i6) ? { suggestions: i6 } : {},
118972
119112
  ...(0, import_guards2.isNonEmptyArray)(a5) ? { availablePaths: a5 } : {}
118973
119113
  }];
@@ -119151,7 +119291,7 @@ sI2.extend({ input: V2({
119151
119291
  fieldName: z2()
119152
119292
  }).optional()
119153
119293
  }).superRefine((t4, n4) => {
119154
- t4.strategy === "LOAD_BALANCED" && !n(t4.loadBalance) && n4.addIssue({
119294
+ t4.strategy === "LOAD_BALANCED" && !n2(t4.loadBalance) && n4.addIssue({
119155
119295
  code: Cf2.custom,
119156
119296
  path: ["loadBalance"],
119157
119297
  message: "loadBalance is required when strategy is LOAD_BALANCED"
@@ -119167,7 +119307,7 @@ var NI2 = (e3) => {
119167
119307
  };
119168
119308
  var PI2 = (t4) => {
119169
119309
  let n4 = t4.settings?.input;
119170
- if (n(n4) && (0, import_guards2.isObject)(n4)) return n4;
119310
+ if (n2(n4) && (0, import_guards2.isObject)(n4)) return n4;
119171
119311
  };
119172
119312
  var FI2 = (e3) => {
119173
119313
  let t4 = new Set(e3.nextStepIds ?? []);
@@ -119176,13 +119316,13 @@ var FI2 = (e3) => {
119176
119316
  return [...t4];
119177
119317
  };
119178
119318
  var II2 = ({ trigger: t4, steps: n4 }) => {
119179
- let r4 = /* @__PURE__ */ new Map(), i5 = n(t4?.nextStepIds) ? t4.nextStepIds.filter(n) : [];
119319
+ let r4 = /* @__PURE__ */ new Map(), i5 = n2(t4?.nextStepIds) ? t4.nextStepIds.filter(n2) : [];
119180
119320
  r4.set(AF2, i5);
119181
119321
  for (let e3 of n4 ?? []) r4.set(e3.id, FI2(e3));
119182
119322
  let a5 = /* @__PURE__ */ new Set(), o5 = [AF2];
119183
119323
  for (; o5.length > 0; ) {
119184
119324
  let t5 = o5.shift();
119185
- if (!(!n(t5) || a5.has(t5))) {
119325
+ if (!(!n2(t5) || a5.has(t5))) {
119186
119326
  a5.add(t5);
119187
119327
  for (let e3 of r4.get(t5) ?? []) a5.has(e3) || o5.push(e3);
119188
119328
  }
@@ -119228,10 +119368,10 @@ var RI2 = ({ workflow: t4, graph: n4 }) => {
119228
119368
  return;
119229
119369
  }
119230
119370
  let d2 = o5.get(t5), f3 = `${t5}:${c4.join(",")}`;
119231
- if (!n(d2) || a5.has(f3)) return;
119371
+ if (!n2(d2) || a5.has(f3)) return;
119232
119372
  i5.add(t5), NI2(d2) && (d2.settings.input.initialLoopStepIds ?? []).forEach((e3) => s5(e3, [...c4, t5], t5));
119233
119373
  let p3 = d2.type === kF2.ITERATOR ? d2.nextStepIds ?? [] : n4.childrenByStepId.get(t5) ?? [];
119234
- n(u4) && p3.length === 0 && r4.push({
119374
+ n2(u4) && p3.length === 0 && r4.push({
119235
119375
  severity: "error",
119236
119376
  code: "ITERATOR_MISSING_RETURN",
119237
119377
  stepId: t5,
@@ -119248,7 +119388,7 @@ var zI2 = ({ workflow: t4, graph: n4 }) => {
119248
119388
  message: `Duplicate step id "${e3.id}". Every step id must be unique within the workflow.`,
119249
119389
  stepId: e3.id
119250
119390
  }), o5.add(e3.id);
119251
- let s5 = (t4.trigger?.nextStepIds ?? []).filter(n);
119391
+ let s5 = (t4.trigger?.nextStepIds ?? []).filter(n2);
119252
119392
  zj2(i5) && s5.length === 0 && r4.push({
119253
119393
  severity: "error",
119254
119394
  code: "TRIGGER_HAS_NO_NEXT_STEP",
@@ -119286,7 +119426,7 @@ var BI = (t4) => {
119286
119426
  message: `If/Else step "${t4.name ?? t4.id}" should have at least two branches (a condition branch and an else branch).`,
119287
119427
  stepId: t4.id
119288
119428
  });
119289
- let o5 = r4?.stepFilterGroups, s5 = new Set((Array.isArray(o5) ? o5 : []).filter(n).map((e3) => e3.id));
119429
+ let o5 = r4?.stepFilterGroups, s5 = new Set((Array.isArray(o5) ? o5 : []).filter(n2).map((e3) => e3.id));
119290
119430
  for (let r5 of a5) {
119291
119431
  let i6 = r5?.nextStepIds;
119292
119432
  (!Array.isArray(i6) || i6.length === 0) && n4.push({
@@ -119294,7 +119434,7 @@ var BI = (t4) => {
119294
119434
  code: "IF_ELSE_BRANCH_HAS_NO_NEXT_STEP",
119295
119435
  message: `A branch of If/Else step "${t4.name ?? t4.id}" is not connected to any step.`,
119296
119436
  stepId: t4.id
119297
- }), n(r5?.filterGroupId) && !s5.has(r5.filterGroupId) && n4.push({
119437
+ }), n2(r5?.filterGroupId) && !s5.has(r5.filterGroupId) && n4.push({
119298
119438
  severity: "error",
119299
119439
  code: "INVALID_STEP_PARAMS",
119300
119440
  message: `A branch of If/Else step "${t4.name ?? t4.id}" references filter group "${r5.filterGroupId}", which does not exist.`,
@@ -119383,7 +119523,7 @@ var YI2 = gd2("type", [
119383
119523
  fieldUniversalIdentifier: Wl2()
119384
119524
  }).optional()
119385
119525
  }).superRefine((t4, n4) => {
119386
- t4.strategy === "LOAD_BALANCED" && !n(t4.loadBalance) && n4.addIssue({
119526
+ t4.strategy === "LOAD_BALANCED" && !n2(t4.loadBalance) && n4.addIssue({
119387
119527
  code: "custom",
119388
119528
  path: ["loadBalance"],
119389
119529
  message: "loadBalance is required when strategy is LOAD_BALANCED"
@@ -119577,7 +119717,6 @@ var renderBitrixPage = ({
119577
119717
  title,
119578
119718
  message,
119579
119719
  crmUrl,
119580
- tasks,
119581
119720
  isInstall
119582
119721
  }) => `<!doctype html>
119583
119722
  <html lang="ru">
@@ -119591,73 +119730,140 @@ var renderBitrixPage = ({
119591
119730
  h1 { font-size: 20px; margin: 0 0 8px; }
119592
119731
  p { color: #666; margin: 0 0 16px; }
119593
119732
  a.button { display: inline-block; padding: 8px 16px; border-radius: 8px; background: #1961ed; color: #fff; text-decoration: none; }
119594
- ul { list-style: none; padding: 0; margin: 16px 0 0; }
119595
- li { padding: 8px 0; border-top: 1px solid #eee; display: flex; justify-content: space-between; gap: 16px; }
119596
- li a { color: #1961ed; text-decoration: none; }
119597
- .due { color: #999; white-space: nowrap; }
119598
119733
  </style>
119599
119734
  </head>
119600
119735
  <body>
119601
119736
  <h1>${escapeHtml(title)}</h1>
119602
119737
  <p>${escapeHtml(message)}</p>
119603
119738
  ${crmUrl !== void 0 ? `<a class="button" href="${escapeHtml(crmUrl)}" target="_blank" rel="noopener">\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442</a>` : ""}
119604
- ${tasks.length > 0 ? `<ul>${tasks.map(
119605
- (task) => `<li>${task.url !== void 0 ? `<a href="${escapeHtml(task.url)}" target="_blank" rel="noopener">${escapeHtml(task.title)}</a>` : escapeHtml(task.title)}<span class="due">${escapeHtml(task.dueAt ?? "")}</span></li>`
119606
- ).join("")}</ul>` : ""}
119607
119739
  ${isInstall ? "<script>if (window.BX24) { BX24.init(function () { BX24.installFinish(); }); }</script>" : ""}
119608
119740
  </body>
119609
119741
  </html>`;
119610
119742
 
119743
+ // src/server/crm-url.ts
119744
+ var getCrmUrl = () => {
119745
+ const value = process.env.CRM_PUBLIC_URL?.trim();
119746
+ return value !== void 0 && /^https?:\/\//.test(value) ? value.replace(/\/$/, "") : void 0;
119747
+ };
119748
+
119749
+ // package.json
119750
+ var package_default = {
119751
+ name: "@haiiro/docuflow",
119752
+ version: "0.0.13",
119753
+ description: "NorDiv \u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442: \u0437\u0430\u0434\u0430\u043D\u0438\u044F \u0441 \u043F\u043E\u043B\u044F\u043C\u0438, \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u044B \u0441 \u0437\u0430\u043F\u0443\u0441\u043A\u043E\u043C \u043F\u043E \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430\u043C, \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u044B \u0441\u043E \u0432\u0441\u0435\u0445 \u0437\u0430\u043F\u0438\u0441\u0435\u0439, \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u0411\u0438\u0442\u0440\u0438\u043A\u044124",
119754
+ license: "AGPL-3.0-only",
119755
+ publishConfig: {
119756
+ access: "public",
119757
+ registry: "https://registry.npmjs.org/"
119758
+ },
119759
+ bin: {
119760
+ "nordiv-docuflow": "bin/install.mjs"
119761
+ },
119762
+ files: [
119763
+ "bin/**/*",
119764
+ "manifest.json",
119765
+ "front-component-shared-dependencies.mjs",
119766
+ "yarn.lock",
119767
+ "src/**/*",
119768
+ "public/**/*",
119769
+ "README.md",
119770
+ "tsconfig.json",
119771
+ "tsconfig.spec.json",
119772
+ "vitest.unit.config.ts",
119773
+ ".oxlintrc.json",
119774
+ ".nvmrc",
119775
+ ".yarnrc.yml",
119776
+ "!**/*.map",
119777
+ "!**/__tests__/**"
119778
+ ],
119779
+ engines: {
119780
+ node: "^24.5.0",
119781
+ npm: "please-use-yarn",
119782
+ yarn: ">=4.0.2"
119783
+ },
119784
+ keywords: [
119785
+ "twenty-app"
119786
+ ],
119787
+ packageManager: "yarn@4.13.0",
119788
+ scripts: {
119789
+ twenty: "twenty",
119790
+ app: "twenty",
119791
+ build: "yarn build:app && twenty dev:build",
119792
+ lint: "oxlint -c .oxlintrc.json .",
119793
+ "lint:fix": "oxlint --fix -c .oxlintrc.json .",
119794
+ typecheck: "tsc --noEmit -p tsconfig.spec.json",
119795
+ test: "vitest run --config vitest.unit.config.ts",
119796
+ "build:app": "vite build --config vite.app.config.ts"
119797
+ },
119798
+ devDependencies: {
119799
+ "@types/node": "^24.7.2",
119800
+ "@types/react": "^19.0.0",
119801
+ "@types/react-dom": "^19.0.0",
119802
+ oxlint: "^0.16.0",
119803
+ react: "^19.0.0",
119804
+ "react-dom": "^19.0.0",
119805
+ "twenty-client-sdk": "2.45.0",
119806
+ "twenty-sdk": "2.45.0",
119807
+ "twenty-ui": "2.45.0",
119808
+ typescript: "^5.9.3",
119809
+ vite: "^8.0.0",
119810
+ "vite-tsconfig-paths": "^4.2.1",
119811
+ vitest: "^4.0.0"
119812
+ },
119813
+ frontComponentSharedDependencies: [
119814
+ "react",
119815
+ "react-dom/client",
119816
+ "twenty-ui/primitives/input",
119817
+ "twenty-ui/primitives/data-display",
119818
+ "twenty-ui/theme",
119819
+ "twenty-ui/icon"
119820
+ ]
119821
+ };
119822
+
119823
+ // src/server/docflow-app-page.ts
119824
+ var BX24_SDK_URL2 = "https://api.bitrix24.com/api/v1/";
119825
+ var buildAssetUrl = (workspaceId, file) => `/public-assets/${workspaceId}/${process.env.APPLICATION_ID ?? ""}/public/app/${file}?v=${encodeURIComponent(package_default.version)}`;
119826
+ var serializeConfig = (config) => JSON.stringify(config).replace(/</g, "\\u003c");
119827
+ var renderDocflowAppPage = ({
119828
+ workspaceId,
119829
+ config
119830
+ }) => new AL(
119831
+ `<!doctype html>
119832
+ <html lang="ru" class="dark">
119833
+ <head>
119834
+ <meta charset="utf-8">
119835
+ <meta name="viewport" content="width=device-width, initial-scale=1">
119836
+ <title>\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442</title>
119837
+ <link rel="stylesheet" href="${escapeHtml(buildAssetUrl(workspaceId, "docflow-app.css"))}">
119838
+ <style>html, body, #root { height: 100%; margin: 0; } body { font-family: Inter, -apple-system, "Segoe UI", Roboto, sans-serif; }</style>
119839
+ ${config.mode === "bitrix" ? `<script src="${BX24_SDK_URL2}"></script>` : ""}
119840
+ <script id="docflow-app-config" type="application/json">${serializeConfig(config)}</script>
119841
+ </head>
119842
+ <body>
119843
+ <div id="root"></div>
119844
+ <script src="${escapeHtml(buildAssetUrl(workspaceId, "docflow-app.js"))}"></script>
119845
+ </body>
119846
+ </html>`,
119847
+ {
119848
+ status: 200,
119849
+ headers: {
119850
+ "content-type": "text/html; charset=utf-8",
119851
+ "cache-control": "no-store"
119852
+ }
119853
+ }
119854
+ );
119855
+
119611
119856
  // src/server/http-response.ts
119612
119857
  var htmlResponse = (status, html) => new AL(html, {
119613
119858
  status,
119614
119859
  headers: { "content-type": "text/html; charset=utf-8" }
119615
119860
  });
119616
119861
 
119617
- // src/server/records.ts
119618
- var clients = {
119619
- person: new u2(),
119620
- application: new u2({ runAs: "application" })
119621
- };
119622
- var restClient = (runAs) => clients[runAs];
119623
-
119624
119862
  // src/universal-identifiers.ts
119625
119863
  var BITRIX_APP_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER = "00fa5cea-d57b-4215-980a-c4bed9232a4f";
119626
119864
 
119627
119865
  // src/logic-functions/bitrix-app.logic-function.ts
119628
- var TASKS_SHOWN_IN_PORTAL = 20;
119629
- var getCrmUrl = () => {
119630
- const value = process.env.CRM_PUBLIC_URL?.trim();
119631
- return value !== void 0 && /^https?:\/\//.test(value) ? value.replace(/\/$/, "") : void 0;
119632
- };
119633
- var findMyTasks = async (email, crmUrl) => {
119634
- const [member] = readRestList(
119635
- await restClient("application").get("/rest/workspaceMembers", {
119636
- query: { filter: restEq("userEmail", email), limit: 1 }
119637
- })
119638
- ).records;
119639
- if (member === void 0) {
119640
- return void 0;
119641
- }
119642
- return readRestList(
119643
- await restClient("application").get("/rest/tasks", {
119644
- query: {
119645
- filter: restAnd(
119646
- restEq("smbSection", DOCFLOW_SECTION),
119647
- restEq("assigneeId", member.id),
119648
- restOr(restNeq("status", TASK_DONE_STATUS), restIsNull("status"))
119649
- ),
119650
- order_by: "dueAt[AscNullsLast]",
119651
- limit: TASKS_SHOWN_IN_PORTAL
119652
- }
119653
- })
119654
- ).records.map((task) => ({
119655
- title: task.title?.trim() || "\u0411\u0435\u0437 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044F",
119656
- url: crmUrl !== void 0 ? `${crmUrl}/object/task/${task.id}` : void 0,
119657
- dueAt: typeof task.dueAt === "string" ? new Date(task.dueAt).toLocaleDateString("ru-RU") : void 0
119658
- }));
119659
- };
119660
- var handler = async (event) => {
119866
+ var handler = async (event, context) => {
119661
119867
  const crmUrl = getCrmUrl();
119662
119868
  if (!isBitrixConfigured()) {
119663
119869
  return htmlResponse(
@@ -119666,7 +119872,6 @@ var handler = async (event) => {
119666
119872
  title: "\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442",
119667
119873
  message: "\u0412 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0445 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F \u0432 CRM \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u044B BITRIX_CLIENT_ID \u0438 BITRIX_CLIENT_SECRET.",
119668
119874
  crmUrl,
119669
- tasks: [],
119670
119875
  isInstall: false
119671
119876
  })
119672
119877
  );
@@ -119684,25 +119889,46 @@ var handler = async (event) => {
119684
119889
  method: "user.current",
119685
119890
  params: {}
119686
119891
  });
119687
- const tasks = typeof user.EMAIL === "string" && user.EMAIL.length > 0 ? await findMyTasks(user.EMAIL, crmUrl) : void 0;
119688
- return htmlResponse(
119689
- 200,
119690
- renderBitrixPage({
119691
- title: "\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442",
119692
- message: tasks === void 0 ? "\u0412 CRM \u043D\u0435\u0442 \u0441\u043E\u0442\u0440\u0443\u0434\u043D\u0438\u043A\u0430 \u0441 \u043F\u043E\u0447\u0442\u043E\u0439 \u0432\u0430\u0448\u0435\u0433\u043E \u043F\u0440\u043E\u0444\u0438\u043B\u044F \u0411\u0438\u0442\u0440\u0438\u043A\u044124." : tasks.length === 0 ? "\u041E\u0442\u043A\u0440\u044B\u0442\u044B\u0445 \u0437\u0430\u0434\u0430\u043D\u0438\u0439 \u043D\u0435\u0442." : "\u0412\u0430\u0448\u0438 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u0435 \u0437\u0430\u0434\u0430\u043D\u0438\u044F:",
119693
- crmUrl,
119694
- tasks: tasks ?? [],
119695
- isInstall: false
119696
- })
119697
- );
119892
+ const member = await findOrCreateWorkspaceMemberFromBitrix(user);
119893
+ if (member === void 0) {
119894
+ return htmlResponse(
119895
+ 200,
119896
+ renderBitrixPage({
119897
+ title: "\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442",
119898
+ message: "\u0412 \u043F\u0440\u043E\u0444\u0438\u043B\u0435 \u0411\u0438\u0442\u0440\u0438\u043A\u044124 \u043D\u0435\u0442 \u043F\u043E\u0447\u0442\u044B \u2014 \u0431\u0435\u0437 \u043D\u0435\u0451 \u043D\u0435\u043B\u044C\u0437\u044F \u043D\u0430\u0439\u0442\u0438 \u0438\u043B\u0438 \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0441\u043E\u0442\u0440\u0443\u0434\u043D\u0438\u043A\u0430 \u0432 CRM.",
119899
+ crmUrl,
119900
+ isInstall: false
119901
+ })
119902
+ );
119903
+ }
119904
+ return renderDocflowAppPage({
119905
+ workspaceId: context.workspaceId,
119906
+ config: {
119907
+ mode: "bitrix",
119908
+ crmUrl: crmUrl ?? "",
119909
+ section: readDocflowAppSection(event.queryStringParameters.section),
119910
+ expectedWorkspaceMemberId: member.id,
119911
+ portalDomain: portal.portalDomain
119912
+ }
119913
+ });
119698
119914
  } catch (error) {
119915
+ if (error instanceof BitrixError) {
119916
+ return htmlResponse(
119917
+ 403,
119918
+ renderBitrixPage({
119919
+ title: "\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442",
119920
+ message: `\u0417\u0430\u043F\u0440\u043E\u0441 \u043F\u043E\u0440\u0442\u0430\u043B\u0430 \u043D\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043D: ${error.message}`,
119921
+ crmUrl,
119922
+ isInstall: false
119923
+ })
119924
+ );
119925
+ }
119699
119926
  return htmlResponse(
119700
- 403,
119927
+ 200,
119701
119928
  renderBitrixPage({
119702
119929
  title: "\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442",
119703
- message: error instanceof BitrixError ? `\u0417\u0430\u043F\u0440\u043E\u0441 \u043F\u043E\u0440\u0442\u0430\u043B\u0430 \u043D\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043D: ${error.message}` : "\u0417\u0430\u043F\u0440\u043E\u0441 \u043F\u043E\u0440\u0442\u0430\u043B\u0430 \u043D\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043D.",
119930
+ message: error instanceof Error ? error.message : "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043E\u0442\u043A\u0440\u044B\u0442\u044C \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442 \u0434\u043B\u044F \u0432\u0430\u0448\u0435\u0433\u043E \u043F\u0440\u043E\u0444\u0438\u043B\u044F \u0411\u0438\u0442\u0440\u0438\u043A\u044124.",
119704
119931
  crmUrl,
119705
- tasks: [],
119706
119932
  isInstall: false
119707
119933
  })
119708
119934
  );