@haiiro/docuflow 0.0.19 → 0.0.21

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.
@@ -1691,6 +1691,7 @@ var readUserMessage = (value) => {
1691
1691
  }
1692
1692
  return void 0;
1693
1693
  };
1694
+ var isMissingGraphqlField = (error) => error instanceof CoreGraphqlError && /Cannot query field|Unknown type/i.test(error.message);
1694
1695
  var callCoreGraphql = async ({
1695
1696
  query,
1696
1697
  variables,
@@ -1724,6 +1725,24 @@ var callCoreGraphql = async ({
1724
1725
  }
1725
1726
  return body.data;
1726
1727
  };
1728
+ var CORE_WORKFLOWS_QUERY = `query CoreWorkflows($first: Int!, $after: String) {
1729
+ coreWorkflows(first: $first, after: $after) {
1730
+ pageInfo { hasNextPage endCursor }
1731
+ edges { node { id name updatedAt workspaceWorkflowId lastPublishedCoreWorkflowVersionId statuses } }
1732
+ }
1733
+ }`;
1734
+ var CORE_WORKFLOWS_WITH_CURRENT_VERSIONS_QUERY = `query CoreWorkflowsWithCurrentVersions($input: CoreWorkflowsWithCurrentVersionsInput!) {
1735
+ coreWorkflowsWithCurrentVersions(input: $input) {
1736
+ workflow { id }
1737
+ currentVersion { id status createdAt trigger steps workspaceWorkflowVersionId }
1738
+ versions { id status createdAt workspaceWorkflowVersionId }
1739
+ }
1740
+ }`;
1741
+ var CORE_WORKFLOW_VERSION_BY_ID_QUERY = `query CoreWorkflowVersionById($coreWorkflowVersionId: UUID!) {
1742
+ coreWorkflowVersionById(coreWorkflowVersionId: $coreWorkflowVersionId) {
1743
+ id status createdAt trigger steps workspaceWorkflowVersionId
1744
+ }
1745
+ }`;
1727
1746
  var UPDATE_WORKFLOW_VERSION_STEP_MUTATION = `mutation UpdateWorkflowVersionStep($input: UpdateWorkflowVersionStepInput!) {
1728
1747
  updateWorkflowVersionStep(input: $input) { id }
1729
1748
  }`;
@@ -1797,28 +1816,8 @@ var listLaunchObjects = async () => {
1797
1816
  return launchObjects;
1798
1817
  };
1799
1818
 
1800
- // src/shared/api/rest-response.util.ts
1801
- var readDataValue = (response) => {
1802
- const data = response?.data;
1803
- if (typeof data !== "object" || data === null) {
1804
- return void 0;
1805
- }
1806
- return Object.values(data)[0];
1807
- };
1808
- var readRestList = (response) => {
1809
- const value = readDataValue(response);
1810
- return {
1811
- records: Array.isArray(value) ? value : [],
1812
- pageInfo: response?.pageInfo ?? {},
1813
- totalCount: response?.totalCount
1814
- };
1815
- };
1816
- var readRestRecord = (response) => {
1817
- const value = readDataValue(response);
1818
- return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
1819
- };
1820
-
1821
1819
  // src/shared/docflow.constants.ts
1820
+ var DOCFLOW_SECTION = "DOCFLOW";
1822
1821
  var DOCFLOW_LAUNCH_PARAMETERS_KEY = "smbDocflowParameters";
1823
1822
  var LAUNCH_PARAMETERS_STEP_INPUT = `{{trigger.${DOCFLOW_LAUNCH_PARAMETERS_KEY}}}`;
1824
1823
  var LAUNCH_TRIGGER_NAME = "\u0417\u0430\u043F\u0443\u0441\u043A \u0441 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0430\u043C\u0438";
@@ -1863,6 +1862,15 @@ var isLaunchParametersStep = (step) => {
1863
1862
  return isPlainRecord(input.logicFunctionInput) && input.logicFunctionInput.parameters === LAUNCH_PARAMETERS_STEP_INPUT;
1864
1863
  };
1865
1864
  var isLaunchTrigger = (trigger) => trigger?.type === "WEBHOOK" && trigger.name === LAUNCH_TRIGGER_NAME;
1865
+ var parseExpectedBodyFields = (trigger) => {
1866
+ const expectedBody = trigger?.type === "WEBHOOK" ? trigger.settings?.expectedBody : void 0;
1867
+ if (!isPlainRecord(expectedBody)) {
1868
+ return [];
1869
+ }
1870
+ return Object.entries(expectedBody).flatMap(
1871
+ ([name, sample]) => name === LAUNCH_RECORD_KEY || name.startsWith("smbDocflow") || isPlainRecord(sample) || Array.isArray(sample) ? [] : [{ id: `body-${name}`, name, label: name, type: typeof sample === "number" ? "NUMBER" : "TEXT" }]
1872
+ );
1873
+ };
1866
1874
  var findLaunchParametersStep = (steps) => (steps ?? []).find(isLaunchParametersStep);
1867
1875
  var parseLaunchFields = (value) => getFillableFormFields(parseFormFields(value));
1868
1876
  var parseLaunchObject = (value) => typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
@@ -1987,30 +1995,199 @@ var buildLaunchRecordOutputSchema = (object) => ({
1987
1995
  }
1988
1996
  });
1989
1997
 
1998
+ // src/shared/workflow/workflow-run.util.ts
1999
+ var DAY_IN_MS = 24 * 60 * 60 * 1e3;
2000
+
2001
+ // src/shared/workflow/process-engine.ts
2002
+ var MANUAL_TRIGGER = {
2003
+ name: "\u0417\u0430\u043F\u0443\u0441\u043A \u0432\u0440\u0443\u0447\u043D\u0443\u044E",
2004
+ type: "MANUAL",
2005
+ position: { x: 0, y: 0 },
2006
+ settings: {
2007
+ outputSchema: {},
2008
+ availability: { type: "GLOBAL" },
2009
+ icon: "IconPlayerPlay",
2010
+ isPinned: false
2011
+ },
2012
+ nextStepIds: []
2013
+ };
2014
+ var buildLaunchTrigger = (base, fields, launchObject) => ({
2015
+ name: LAUNCH_TRIGGER_NAME,
2016
+ type: "WEBHOOK",
2017
+ position: base.position ?? { x: 0, y: 0 },
2018
+ nextStepIds: base.nextStepIds ?? [],
2019
+ settings: {
2020
+ httpMethod: "POST",
2021
+ authentication: "API_KEY",
2022
+ expectedBody: {
2023
+ ...buildFieldsExpectedBody(fields),
2024
+ ...launchObject !== void 0 ? { [LAUNCH_RECORD_KEY]: { id: "" } } : {}
2025
+ },
2026
+ outputSchema: {
2027
+ ...buildFieldsOutputSchema(fields),
2028
+ ...launchObject !== void 0 ? { [LAUNCH_RECORD_KEY]: buildLaunchRecordOutputSchema(launchObject) } : {}
2029
+ }
2030
+ }
2031
+ });
2032
+ var buildManualTrigger = (base) => ({
2033
+ ...MANUAL_TRIGGER,
2034
+ ...base.type === "MANUAL" ? { name: base.name ?? MANUAL_TRIGGER.name, settings: base.settings } : {},
2035
+ position: base.position ?? MANUAL_TRIGGER.position,
2036
+ nextStepIds: base.nextStepIds ?? []
2037
+ });
2038
+ var findOrCreateDraft = async (engine, workflowId) => {
2039
+ const versions = await engine.listVersions(workflowId);
2040
+ const draftId = versions.find(({ status }) => status === "DRAFT")?.id;
2041
+ if (draftId !== void 0) {
2042
+ return engine.getVersion(draftId);
2043
+ }
2044
+ if (versions.length === 0) {
2045
+ return void 0;
2046
+ }
2047
+ await engine.createDraft(workflowId, versions[0].id);
2048
+ const createdId = (await engine.listVersions(workflowId)).find(({ status }) => status === "DRAFT")?.id;
2049
+ return createdId === void 0 ? void 0 : engine.getVersion(createdId);
2050
+ };
2051
+ var STEP_ROW_HEIGHT = 150;
2052
+ var retargetStepVariables = (step, launchStepId) => {
2053
+ const settings = JSON.stringify(step.settings ?? {});
2054
+ const retargeted = settings.split(`{{${launchStepId}.`).join(`{{${TRIGGER_STEP_ID}.`);
2055
+ return retargeted === settings ? void 0 : { ...step, settings: JSON.parse(retargeted) };
2056
+ };
2057
+ var removeLegacyLaunchStep = async (engine, draft) => {
2058
+ const launchStep = findLaunchParametersStep(draft.steps);
2059
+ if (launchStep === void 0) {
2060
+ return;
2061
+ }
2062
+ await engine.deleteStep(draft.id, launchStep.id);
2063
+ const removedY = launchStep.position?.y;
2064
+ for (const step of draft.steps ?? []) {
2065
+ if (step.id === launchStep.id) {
2066
+ continue;
2067
+ }
2068
+ const retargeted = retargetStepVariables(step, launchStep.id);
2069
+ const movesUp = typeof removedY === "number" && typeof step.position?.y === "number" && step.position.y > removedY;
2070
+ if (retargeted === void 0 && !movesUp) {
2071
+ continue;
2072
+ }
2073
+ const updated = retargeted ?? step;
2074
+ await engine.updateStep(
2075
+ draft.id,
2076
+ movesUp && step.position ? { ...updated, position: { ...step.position, y: step.position.y - STEP_ROW_HEIGHT } } : updated
2077
+ );
2078
+ }
2079
+ };
2080
+ var syncLaunchTrigger = async (engine, {
2081
+ workflowId,
2082
+ fields,
2083
+ launchObject
2084
+ }) => {
2085
+ const draft = await findOrCreateDraft(engine, workflowId);
2086
+ if (draft === void 0) {
2087
+ return { status: "NO_VERSION" };
2088
+ }
2089
+ const current = draft.trigger ?? MANUAL_TRIGGER;
2090
+ if (current.type !== "MANUAL" && !isLaunchTrigger(current)) {
2091
+ return { status: "NOT_MANUAL" };
2092
+ }
2093
+ await removeLegacyLaunchStep(engine, draft);
2094
+ const trigger = (await engine.getVersion(draft.id))?.trigger ?? current;
2095
+ await engine.updateTrigger(
2096
+ draft.id,
2097
+ fields.length > 0 || launchObject !== void 0 ? buildLaunchTrigger(trigger, fields, launchObject) : buildManualTrigger(trigger)
2098
+ );
2099
+ return { status: "SAVED", workflowVersionId: draft.id };
2100
+ };
2101
+
2102
+ // node_modules/twenty-sdk/dist/logic-function/isDefined-Dtu5EYqP-CMNeFg4z.mjs
2103
+ var import_guards = __toESM(require_build(), 1);
2104
+ var n = (n4) => !(0, import_guards.isUndefined)(n4) && !(0, import_guards.isNull)(n4);
2105
+
2106
+ // node_modules/twenty-sdk/dist/logic-function/index.mjs
2107
+ var import_guards2 = __toESM(require_build(), 1);
2108
+
2109
+ // node_modules/uuid/dist-node/stringify.js
2110
+ var byteToHex = [];
2111
+ for (let i5 = 0; i5 < 256; ++i5) {
2112
+ byteToHex.push((i5 + 256).toString(16).slice(1));
2113
+ }
2114
+ function unsafeStringify(arr, offset = 0) {
2115
+ 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();
2116
+ }
2117
+
2118
+ // node_modules/uuid/dist-node/rng.js
2119
+ import { randomFillSync } from "node:crypto";
2120
+ var rnds8Pool = new Uint8Array(256);
2121
+ var poolPtr = rnds8Pool.length;
2122
+ function rng() {
2123
+ if (poolPtr > rnds8Pool.length - 16) {
2124
+ randomFillSync(rnds8Pool);
2125
+ poolPtr = 0;
2126
+ }
2127
+ return rnds8Pool.slice(poolPtr, poolPtr += 16);
2128
+ }
2129
+
2130
+ // node_modules/uuid/dist-node/native.js
2131
+ import { randomUUID } from "node:crypto";
2132
+ var native_default = { randomUUID };
2133
+
2134
+ // node_modules/uuid/dist-node/v4.js
2135
+ function _v4(options, buf, offset) {
2136
+ options = options || {};
2137
+ const rnds = options.random ?? options.rng?.() ?? rng();
2138
+ if (rnds.length < 16) {
2139
+ throw new Error("Random bytes length must be >= 16");
2140
+ }
2141
+ rnds[6] = rnds[6] & 15 | 64;
2142
+ rnds[8] = rnds[8] & 63 | 128;
2143
+ if (buf) {
2144
+ offset = offset || 0;
2145
+ if (offset < 0 || offset + 16 > buf.length) {
2146
+ throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);
2147
+ }
2148
+ for (let i5 = 0; i5 < 16; ++i5) {
2149
+ buf[offset + i5] = rnds[i5];
2150
+ }
2151
+ return buf;
2152
+ }
2153
+ return unsafeStringify(rnds);
2154
+ }
2155
+ function v4(options, buf, offset) {
2156
+ if (native_default.randomUUID && !buf && !options) {
2157
+ return native_default.randomUUID();
2158
+ }
2159
+ return _v4(options, buf, offset);
2160
+ }
2161
+ var v4_default = v4;
2162
+
2163
+ // node_modules/twenty-sdk/dist/logic-function/index.mjs
2164
+ var l4 = __toESM(require_react(), 1);
2165
+ import { MetadataApiClient as u3 } from "twenty-client-sdk/metadata";
2166
+
1990
2167
  // node_modules/twenty-client-sdk/dist/chunk-Dqa2HsxW.mjs
1991
- var e = Object.create;
1992
- var t = Object.defineProperty;
1993
- var n = Object.getOwnPropertyDescriptor;
2168
+ var e2 = Object.create;
2169
+ var t2 = Object.defineProperty;
2170
+ var n2 = Object.getOwnPropertyDescriptor;
1994
2171
  var r = Object.getOwnPropertyNames;
1995
2172
  var i = Object.getPrototypeOf;
1996
2173
  var a = Object.prototype.hasOwnProperty;
1997
2174
  var o = (e3, t4) => () => (t4 || (e3((t4 = { exports: {} }).exports, t4), e3 = null), t4.exports);
1998
2175
  var s = (e3, n4) => {
1999
2176
  let r4 = {};
2000
- for (var i5 in e3) t(r4, i5, {
2177
+ for (var i5 in e3) t2(r4, i5, {
2001
2178
  get: e3[i5],
2002
2179
  enumerable: true
2003
2180
  });
2004
- return n4 || t(r4, Symbol.toStringTag, { value: "Module" }), r4;
2181
+ return n4 || t2(r4, Symbol.toStringTag, { value: "Module" }), r4;
2005
2182
  };
2006
2183
  var c = (e3, i5, o5, s5) => {
2007
- 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, {
2184
+ 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, {
2008
2185
  get: ((e4) => i5[e4]).bind(null, d2),
2009
- enumerable: !(s5 = n(i5, d2)) || s5.enumerable
2186
+ enumerable: !(s5 = n2(i5, d2)) || s5.enumerable
2010
2187
  });
2011
2188
  return e3;
2012
2189
  };
2013
- var l = (n4, r4, a5) => (a5 = n4 == null ? {} : e(i(n4)), c(r4 || !n4 || !n4.__esModule ? t(a5, "default", {
2190
+ var l = (n4, r4, a5) => (a5 = n4 == null ? {} : e2(i(n4)), c(r4 || !n4 || !n4.__esModule ? t2(a5, "default", {
2014
2191
  value: n4,
2015
2192
  enumerable: true
2016
2193
  }) : a5, n4));
@@ -61351,205 +61528,7 @@ var u2 = class {
61351
61528
  }
61352
61529
  };
61353
61530
 
61354
- // src/shared/api/rest-filter.util.ts
61355
- var UNSAFE_FILTER_CHARACTERS = /[()[\]'",]/g;
61356
- var sanitizeFilterText = (text) => text.replace(UNSAFE_FILTER_CHARACTERS, " ").trim();
61357
- var quote = (value) => `'${sanitizeFilterText(value)}'`;
61358
- var restEq = (field, value) => `${field}[eq]:${quote(value)}`;
61359
-
61360
- // src/server/records.ts
61361
- var clients = {
61362
- person: new u2(),
61363
- application: new u2({ runAs: "application" })
61364
- };
61365
- var restClient = (runAs) => clients[runAs];
61366
- var listWorkflowVersions = async (runAs, workflowId) => readRestList(
61367
- await restClient(runAs).get("/rest/workflowVersions", {
61368
- query: {
61369
- filter: restEq("workflowId", workflowId),
61370
- order_by: "createdAt[DescNullsLast]",
61371
- limit: 50
61372
- }
61373
- })
61374
- ).records;
61375
-
61376
- // src/server/launch-step.ts
61377
- var MANUAL_TRIGGER = {
61378
- name: "\u0417\u0430\u043F\u0443\u0441\u043A \u0432\u0440\u0443\u0447\u043D\u0443\u044E",
61379
- type: "MANUAL",
61380
- position: { x: 0, y: 0 },
61381
- settings: {
61382
- outputSchema: {},
61383
- availability: { type: "GLOBAL" },
61384
- icon: "IconPlayerPlay",
61385
- isPinned: false
61386
- },
61387
- nextStepIds: []
61388
- };
61389
- var buildLaunchTrigger = (base, fields, launchObject) => ({
61390
- name: LAUNCH_TRIGGER_NAME,
61391
- type: "WEBHOOK",
61392
- position: base.position ?? { x: 0, y: 0 },
61393
- nextStepIds: base.nextStepIds ?? [],
61394
- settings: {
61395
- httpMethod: "POST",
61396
- authentication: "API_KEY",
61397
- expectedBody: {
61398
- ...buildFieldsExpectedBody(fields),
61399
- ...launchObject !== void 0 ? { [LAUNCH_RECORD_KEY]: { id: "" } } : {}
61400
- },
61401
- outputSchema: {
61402
- ...buildFieldsOutputSchema(fields),
61403
- ...launchObject !== void 0 ? { [LAUNCH_RECORD_KEY]: buildLaunchRecordOutputSchema(launchObject) } : {}
61404
- }
61405
- }
61406
- });
61407
- var buildManualTrigger = (base) => ({
61408
- ...MANUAL_TRIGGER,
61409
- ...base.type === "MANUAL" ? { name: base.name ?? MANUAL_TRIGGER.name, settings: base.settings } : {},
61410
- position: base.position ?? MANUAL_TRIGGER.position,
61411
- nextStepIds: base.nextStepIds ?? []
61412
- });
61413
- var findOrCreateDraft = async (workflowId) => {
61414
- const versions = await listWorkflowVersions("person", workflowId);
61415
- const draft = versions.find(({ status }) => status === "DRAFT");
61416
- if (draft !== void 0 || versions.length === 0) {
61417
- return draft;
61418
- }
61419
- await callCoreGraphql({
61420
- query: CREATE_DRAFT_FROM_WORKFLOW_VERSION_MUTATION,
61421
- variables: { input: { workflowId, workflowVersionIdToCopy: versions[0].id } }
61422
- });
61423
- return (await listWorkflowVersions("person", workflowId)).find(({ status }) => status === "DRAFT");
61424
- };
61425
- var STEP_ROW_HEIGHT = 150;
61426
- var retargetStepVariables = (step, launchStepId) => {
61427
- const settings = JSON.stringify(step.settings ?? {});
61428
- const retargeted = settings.split(`{{${launchStepId}.`).join(`{{${TRIGGER_STEP_ID}.`);
61429
- return retargeted === settings ? void 0 : { ...step, settings: JSON.parse(retargeted) };
61430
- };
61431
- var removeLegacyLaunchStep = async (draft) => {
61432
- const launchStep = findLaunchParametersStep(draft.steps);
61433
- if (launchStep === void 0) {
61434
- return;
61435
- }
61436
- await callCoreGraphql({
61437
- query: DELETE_WORKFLOW_VERSION_STEP_MUTATION,
61438
- variables: { input: { workflowVersionId: draft.id, stepId: launchStep.id } }
61439
- });
61440
- const removedY = launchStep.position?.y;
61441
- for (const step of draft.steps ?? []) {
61442
- if (step.id === launchStep.id) {
61443
- continue;
61444
- }
61445
- const retargeted = retargetStepVariables(step, launchStep.id);
61446
- const movesUp = typeof removedY === "number" && typeof step.position?.y === "number" && step.position.y > removedY;
61447
- if (retargeted === void 0 && !movesUp) {
61448
- continue;
61449
- }
61450
- const updated = retargeted ?? step;
61451
- await callCoreGraphql({
61452
- query: UPDATE_WORKFLOW_VERSION_STEP_MUTATION,
61453
- variables: {
61454
- input: {
61455
- workflowVersionId: draft.id,
61456
- step: movesUp && step.position ? { ...updated, position: { ...step.position, y: step.position.y - STEP_ROW_HEIGHT } } : updated
61457
- }
61458
- }
61459
- });
61460
- }
61461
- };
61462
- var syncLaunchTrigger = async ({
61463
- workflowId,
61464
- fields,
61465
- launchObject
61466
- }) => {
61467
- const draft = await findOrCreateDraft(workflowId);
61468
- if (draft === void 0) {
61469
- return void 0;
61470
- }
61471
- const current = draft.trigger ?? MANUAL_TRIGGER;
61472
- if (current.type !== "MANUAL" && !isLaunchTrigger(current)) {
61473
- return { status: "NOT_MANUAL" };
61474
- }
61475
- await removeLegacyLaunchStep(draft);
61476
- const trigger = (await listWorkflowVersions("person", workflowId)).find(({ id: id3 }) => id3 === draft.id)?.trigger ?? current;
61477
- await callCoreGraphql({
61478
- query: UPDATE_WORKFLOW_VERSION_TRIGGER_MUTATION,
61479
- variables: {
61480
- input: {
61481
- workflowVersionId: draft.id,
61482
- trigger: fields.length > 0 || launchObject !== void 0 ? buildLaunchTrigger(trigger, fields, launchObject) : buildManualTrigger(trigger)
61483
- }
61484
- }
61485
- });
61486
- return { status: "SAVED", workflowVersionId: draft.id };
61487
- };
61488
-
61489
- // node_modules/twenty-sdk/dist/logic-function/isDefined-Dtu5EYqP-CMNeFg4z.mjs
61490
- var import_guards = __toESM(require_build(), 1);
61491
- var n2 = (n4) => !(0, import_guards.isUndefined)(n4) && !(0, import_guards.isNull)(n4);
61492
-
61493
61531
  // node_modules/twenty-sdk/dist/logic-function/index.mjs
61494
- var import_guards2 = __toESM(require_build(), 1);
61495
-
61496
- // node_modules/uuid/dist-node/stringify.js
61497
- var byteToHex = [];
61498
- for (let i5 = 0; i5 < 256; ++i5) {
61499
- byteToHex.push((i5 + 256).toString(16).slice(1));
61500
- }
61501
- function unsafeStringify(arr, offset = 0) {
61502
- 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();
61503
- }
61504
-
61505
- // node_modules/uuid/dist-node/rng.js
61506
- import { randomFillSync } from "node:crypto";
61507
- var rnds8Pool = new Uint8Array(256);
61508
- var poolPtr = rnds8Pool.length;
61509
- function rng() {
61510
- if (poolPtr > rnds8Pool.length - 16) {
61511
- randomFillSync(rnds8Pool);
61512
- poolPtr = 0;
61513
- }
61514
- return rnds8Pool.slice(poolPtr, poolPtr += 16);
61515
- }
61516
-
61517
- // node_modules/uuid/dist-node/native.js
61518
- import { randomUUID } from "node:crypto";
61519
- var native_default = { randomUUID };
61520
-
61521
- // node_modules/uuid/dist-node/v4.js
61522
- function _v4(options, buf, offset) {
61523
- options = options || {};
61524
- const rnds = options.random ?? options.rng?.() ?? rng();
61525
- if (rnds.length < 16) {
61526
- throw new Error("Random bytes length must be >= 16");
61527
- }
61528
- rnds[6] = rnds[6] & 15 | 64;
61529
- rnds[8] = rnds[8] & 63 | 128;
61530
- if (buf) {
61531
- offset = offset || 0;
61532
- if (offset < 0 || offset + 16 > buf.length) {
61533
- throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);
61534
- }
61535
- for (let i5 = 0; i5 < 16; ++i5) {
61536
- buf[offset + i5] = rnds[i5];
61537
- }
61538
- return buf;
61539
- }
61540
- return unsafeStringify(rnds);
61541
- }
61542
- function v4(options, buf, offset) {
61543
- if (native_default.randomUUID && !buf && !options) {
61544
- return native_default.randomUUID();
61545
- }
61546
- return _v4(options, buf, offset);
61547
- }
61548
- var v4_default = v4;
61549
-
61550
- // node_modules/twenty-sdk/dist/logic-function/index.mjs
61551
- var l4 = __toESM(require_react(), 1);
61552
- import { MetadataApiClient as u3 } from "twenty-client-sdk/metadata";
61553
61532
  var f2 = Object.defineProperty;
61554
61533
  var p2 = (e3, t4) => () => (t4 || (e3((t4 = { exports: {} }).exports, t4), e3 = null), t4.exports);
61555
61534
  var m2 = (e3, t4) => {
@@ -72257,17 +72236,17 @@ var gp2 = {
72257
72236
  };
72258
72237
  var _p = /* @__PURE__ */ new WeakSet();
72259
72238
  var vp = /* @__PURE__ */ new WeakMap();
72260
- var yp2 = (t4) => n2(t4) && !(typeof t4 == "object" && _p.has(t4));
72239
+ var yp2 = (t4) => n(t4) && !(typeof t4 == "object" && _p.has(t4));
72261
72240
  var bp = (e3) => typeof e3 == "object" && !!e3 && !Array.isArray(e3);
72262
72241
  var xp2 = (t4) => {
72263
- if (!n2(t4) || t4 === "") return true;
72242
+ if (!n(t4) || t4 === "") return true;
72264
72243
  if (Array.isArray(t4)) return t4.length === 0;
72265
72244
  if (!bp(t4) || t4 instanceof Date) return false;
72266
72245
  if (_p.has(t4)) return true;
72267
72246
  let n4 = vp.get(t4);
72268
72247
  if (n4 === W2.RICH_TEXT) return !(0, import_guards2.isNonEmptyString)(t4.markdown) || t4.markdown.trim().length === 0;
72269
- let i5 = n2(n4) ? gp2[n4] : void 0;
72270
- return (n2(i5) ? i5.map((e3) => t4[e3]) : Object.values(t4)).every(xp2);
72248
+ let i5 = n(n4) ? gp2[n4] : void 0;
72249
+ return (n(i5) ? i5.map((e3) => t4[e3]) : Object.values(t4)).every(xp2);
72271
72250
  };
72272
72251
  var Sp2 = {
72273
72252
  isDefined: {
@@ -116950,7 +116929,7 @@ var Vj2 = (t4, n4) => {
116950
116929
  if (!(0, import_guards2.isString)(n4)) return;
116951
116930
  let r4 = n4.split("."), i5 = t4;
116952
116931
  for (let t5 of r4) {
116953
- if (!n2(i5) || !(0, import_guards2.isObject)(i5) || Bj2.has(t5) || !Object.prototype.hasOwnProperty.call(i5, t5)) return;
116932
+ if (!n(i5) || !(0, import_guards2.isObject)(i5) || Bj2.has(t5) || !Object.prototype.hasOwnProperty.call(i5, t5)) return;
116954
116933
  i5 = i5[t5];
116955
116934
  }
116956
116935
  return i5;
@@ -116958,7 +116937,7 @@ var Vj2 = (t4, n4) => {
116958
116937
  var Hj2 = (e3, n4) => (r4, i5) => (0, import_guards2.isNonEmptyArray)(r4) ? r4[e3]((e4) => n4(Vj2(e4, i5))) : false;
116959
116938
  var Uj = (e3, n4) => (r4, i5, a5) => (0, import_guards2.isNonEmptyArray)(r4) ? r4[e3]((e4) => n4(Vj2(e4, i5), a5)) : false;
116960
116939
  var Wj2 = new ph2();
116961
- 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));
116940
+ 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));
116962
116941
  var Kj2 = [
116963
116942
  "yyyy.MM.dd",
116964
116943
  "yyyy/MM/dd",
@@ -119027,7 +119006,7 @@ var jF2 = (e3) => {
119027
119006
  var MF2 = /{{([^{}]+)}}/g;
119028
119007
  function* NF2(t4) {
119029
119008
  if ((0, import_guards2.isString)(t4)) {
119030
- for (let [, n4] of t4.matchAll(MF2)) n2(n4) && (yield n4);
119009
+ for (let [, n4] of t4.matchAll(MF2)) n(n4) && (yield n4);
119031
119010
  return;
119032
119011
  }
119033
119012
  if ((0, import_guards2.isObject)(t4)) for (let e3 of Object.values(t4)) yield* NF2(e3);
@@ -119047,9 +119026,9 @@ var FF2 = (e3, t4) => {
119047
119026
  return i5[e3.length][t4.length];
119048
119027
  };
119049
119028
  var IF2 = (t4) => {
119050
- if (!n2(t4) || !Kf2(t4) || Array.isArray(t4)) return false;
119029
+ if (!n(t4) || !Kf2(t4) || Array.isArray(t4)) return false;
119051
119030
  let n4 = Object.values(t4);
119052
- return n4.length === 0 ? false : n4.every((t5) => n2(t5) && Kf2(t5) && Wf2(t5.isLeaf));
119031
+ return n4.length === 0 ? false : n4.every((t5) => n(t5) && Kf2(t5) && Wf2(t5.isLeaf));
119053
119032
  };
119054
119033
  var LF2 = (e3, t4 = []) => {
119055
119034
  let n4 = [];
@@ -119065,21 +119044,21 @@ var RF2 = ({ schema: t4, propertyPath: n4 }) => {
119065
119044
  let r4 = t4;
119066
119045
  for (let t5 = 0; t5 < n4.length; t5++) {
119067
119046
  let i5 = n4[t5];
119068
- if (!n2(i5)) return;
119047
+ if (!n(i5)) return;
119069
119048
  if (!(0, import_guards2.isObject)(r4)) return {
119070
119049
  validPrefix: n4.slice(0, t5),
119071
119050
  failedSegment: i5,
119072
119051
  availableKeys: []
119073
119052
  };
119074
119053
  let o5 = r4[i5];
119075
- if (!n2(o5)) return {
119054
+ if (!n(o5)) return {
119076
119055
  validPrefix: n4.slice(0, t5),
119077
119056
  failedSegment: i5,
119078
119057
  availableKeys: Object.keys(r4)
119079
119058
  };
119080
119059
  if (o5.isLeaf) {
119081
119060
  let r5 = n4[t5 + 1];
119082
- return n2(r5) ? {
119061
+ return n(r5) ? {
119083
119062
  validPrefix: n4.slice(0, t5 + 1),
119084
119063
  failedSegment: r5,
119085
119064
  availableKeys: []
@@ -119116,9 +119095,9 @@ var KF2 = (e3, t4) => {
119116
119095
  };
119117
119096
  var qF2 = (t4, n4) => {
119118
119097
  let [r4, ...i5] = n4;
119119
- if (!n2(r4)) return zF2;
119098
+ if (!n(r4)) return zF2;
119120
119099
  let a5 = t4[r4];
119121
- return BF2(a5) ? WF2(a5, i5) : n2(a5) ? i5.length === 0 ? { found: true } : bp(a5) ? qF2(a5, i5) : zF2 : zF2;
119100
+ return BF2(a5) ? WF2(a5, i5) : n(a5) ? i5.length === 0 ? { found: true } : bp(a5) ? qF2(a5, i5) : zF2 : zF2;
119122
119101
  };
119123
119102
  var JF2 = (e3, t4) => t4.length === 0 || !bp(e3) ? zF2 : VF2(e3) ? GF2(e3.fields, t4) : HF2(e3) ? KF2(e3, t4) : qF2(e3, t4);
119124
119103
  var YF2 = ({ schema: e3, propertyPath: t4 }) => JF2(e3, t4);
@@ -119129,7 +119108,7 @@ var XF2 = (t4) => {
119129
119108
  let e3 = i5.value;
119130
119109
  if (VF2(e3)) for (let t5 of XF2(e3.fields)) n4.push(`${r4}.${t5}`);
119131
119110
  else if (bp(e3)) for (let t5 of XF2(e3)) n4.push(`${r4}.${t5}`);
119132
- } else if (n2(i5) && (n4.push(r4), bp(i5))) for (let e3 of XF2(i5)) n4.push(`${r4}.${e3}`);
119111
+ } else if (n(i5) && (n4.push(r4), bp(i5))) for (let e3 of XF2(i5)) n4.push(`${r4}.${e3}`);
119133
119112
  return n4;
119134
119113
  };
119135
119114
  var ZF2 = (t4) => {
@@ -119141,7 +119120,7 @@ var ZF2 = (t4) => {
119141
119120
  n4.push("first");
119142
119121
  for (let e3 of ZF2(t4.first.value)) n4.push(`first.${e3}`);
119143
119122
  }
119144
- return n2(t4.all) && n4.push("all"), n4.push("totalCount"), n4;
119123
+ return n(t4.all) && n4.push("all"), n4.push("totalCount"), n4;
119145
119124
  }
119146
119125
  return XF2(t4);
119147
119126
  };
@@ -119160,7 +119139,7 @@ var tI2 = ({ schema: n4, propertyPath: r4, referencedStepId: i5 }) => {
119160
119139
  schema: n4,
119161
119140
  propertyPath: r4
119162
119141
  });
119163
- if (!n2(a5)) return [];
119142
+ if (!n(a5)) return [];
119164
119143
  let o5 = eI2(a5.failedSegment, a5.availableKeys).map((e3) => [
119165
119144
  i5,
119166
119145
  ...a5.validPrefix,
@@ -119176,7 +119155,7 @@ var nI2 = ({ workflow: t4, graph: n4, stepsById: r4 }) => {
119176
119155
  let s5 = PF2(o5.settings?.input), c4 = n4.ancestorsByStepId.get(o5.id) ?? /* @__PURE__ */ new Set();
119177
119156
  for (let n5 of s5) {
119178
119157
  let s6 = jF2(n5), l5 = s6[0];
119179
- if (!n2(l5)) {
119158
+ if (!n(l5)) {
119180
119159
  i5.push({
119181
119160
  severity: "error",
119182
119161
  code: "VARIABLE_INVALID_PATH",
@@ -119225,8 +119204,8 @@ var nI2 = ({ workflow: t4, graph: n4, stepsById: r4 }) => {
119225
119204
  var rI2 = ({ step: n4, variable: r4, pathSegments: i5, referencedStepId: o5, isTriggerReference: s5, trigger: c4, stepsById: l5 }) => {
119226
119205
  let u4 = i5.slice(1);
119227
119206
  if (u4.length === 0) return [];
119228
- 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;
119229
- if (!n2(d2) || f3) return [];
119207
+ 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;
119208
+ if (!n(d2) || f3) return [];
119230
119209
  if (!YF2({
119231
119210
  schema: d2,
119232
119211
  propertyPath: u4
@@ -119242,7 +119221,7 @@ var rI2 = ({ step: n4, variable: r4, pathSegments: i5, referencedStepId: o5, isT
119242
119221
  message: `Step "${n4.name ?? n4.id}" references variable "{{${r4}}}" but the path "${u4.join(".")}" was not found in the output of step "${o5}".`,
119243
119222
  stepId: n4.id,
119244
119223
  path: r4,
119245
- ...n2(s6) ? { hint: s6 } : {},
119224
+ ...n(s6) ? { hint: s6 } : {},
119246
119225
  ...(0, import_guards2.isNonEmptyArray)(i6) ? { suggestions: i6 } : {},
119247
119226
  ...(0, import_guards2.isNonEmptyArray)(a5) ? { availablePaths: a5 } : {}
119248
119227
  }];
@@ -119426,7 +119405,7 @@ sI2.extend({ input: V2({
119426
119405
  fieldName: z2()
119427
119406
  }).optional()
119428
119407
  }).superRefine((t4, n4) => {
119429
- t4.strategy === "LOAD_BALANCED" && !n2(t4.loadBalance) && n4.addIssue({
119408
+ t4.strategy === "LOAD_BALANCED" && !n(t4.loadBalance) && n4.addIssue({
119430
119409
  code: Cf2.custom,
119431
119410
  path: ["loadBalance"],
119432
119411
  message: "loadBalance is required when strategy is LOAD_BALANCED"
@@ -119442,7 +119421,7 @@ var NI2 = (e3) => {
119442
119421
  };
119443
119422
  var PI2 = (t4) => {
119444
119423
  let n4 = t4.settings?.input;
119445
- if (n2(n4) && (0, import_guards2.isObject)(n4)) return n4;
119424
+ if (n(n4) && (0, import_guards2.isObject)(n4)) return n4;
119446
119425
  };
119447
119426
  var FI2 = (e3) => {
119448
119427
  let t4 = new Set(e3.nextStepIds ?? []);
@@ -119451,13 +119430,13 @@ var FI2 = (e3) => {
119451
119430
  return [...t4];
119452
119431
  };
119453
119432
  var II2 = ({ trigger: t4, steps: n4 }) => {
119454
- let r4 = /* @__PURE__ */ new Map(), i5 = n2(t4?.nextStepIds) ? t4.nextStepIds.filter(n2) : [];
119433
+ let r4 = /* @__PURE__ */ new Map(), i5 = n(t4?.nextStepIds) ? t4.nextStepIds.filter(n) : [];
119455
119434
  r4.set(AF2, i5);
119456
119435
  for (let e3 of n4 ?? []) r4.set(e3.id, FI2(e3));
119457
119436
  let a5 = /* @__PURE__ */ new Set(), o5 = [AF2];
119458
119437
  for (; o5.length > 0; ) {
119459
119438
  let t5 = o5.shift();
119460
- if (!(!n2(t5) || a5.has(t5))) {
119439
+ if (!(!n(t5) || a5.has(t5))) {
119461
119440
  a5.add(t5);
119462
119441
  for (let e3 of r4.get(t5) ?? []) a5.has(e3) || o5.push(e3);
119463
119442
  }
@@ -119503,10 +119482,10 @@ var RI2 = ({ workflow: t4, graph: n4 }) => {
119503
119482
  return;
119504
119483
  }
119505
119484
  let d2 = o5.get(t5), f3 = `${t5}:${c4.join(",")}`;
119506
- if (!n2(d2) || a5.has(f3)) return;
119485
+ if (!n(d2) || a5.has(f3)) return;
119507
119486
  i5.add(t5), NI2(d2) && (d2.settings.input.initialLoopStepIds ?? []).forEach((e3) => s5(e3, [...c4, t5], t5));
119508
119487
  let p3 = d2.type === kF2.ITERATOR ? d2.nextStepIds ?? [] : n4.childrenByStepId.get(t5) ?? [];
119509
- n2(u4) && p3.length === 0 && r4.push({
119488
+ n(u4) && p3.length === 0 && r4.push({
119510
119489
  severity: "error",
119511
119490
  code: "ITERATOR_MISSING_RETURN",
119512
119491
  stepId: t5,
@@ -119523,7 +119502,7 @@ var zI2 = ({ workflow: t4, graph: n4 }) => {
119523
119502
  message: `Duplicate step id "${e3.id}". Every step id must be unique within the workflow.`,
119524
119503
  stepId: e3.id
119525
119504
  }), o5.add(e3.id);
119526
- let s5 = (t4.trigger?.nextStepIds ?? []).filter(n2);
119505
+ let s5 = (t4.trigger?.nextStepIds ?? []).filter(n);
119527
119506
  zj2(i5) && s5.length === 0 && r4.push({
119528
119507
  severity: "error",
119529
119508
  code: "TRIGGER_HAS_NO_NEXT_STEP",
@@ -119561,7 +119540,7 @@ var BI = (t4) => {
119561
119540
  message: `If/Else step "${t4.name ?? t4.id}" should have at least two branches (a condition branch and an else branch).`,
119562
119541
  stepId: t4.id
119563
119542
  });
119564
- let o5 = r4?.stepFilterGroups, s5 = new Set((Array.isArray(o5) ? o5 : []).filter(n2).map((e3) => e3.id));
119543
+ let o5 = r4?.stepFilterGroups, s5 = new Set((Array.isArray(o5) ? o5 : []).filter(n).map((e3) => e3.id));
119565
119544
  for (let r5 of a5) {
119566
119545
  let i6 = r5?.nextStepIds;
119567
119546
  (!Array.isArray(i6) || i6.length === 0) && n4.push({
@@ -119569,7 +119548,7 @@ var BI = (t4) => {
119569
119548
  code: "IF_ELSE_BRANCH_HAS_NO_NEXT_STEP",
119570
119549
  message: `A branch of If/Else step "${t4.name ?? t4.id}" is not connected to any step.`,
119571
119550
  stepId: t4.id
119572
- }), n2(r5?.filterGroupId) && !s5.has(r5.filterGroupId) && n4.push({
119551
+ }), n(r5?.filterGroupId) && !s5.has(r5.filterGroupId) && n4.push({
119573
119552
  severity: "error",
119574
119553
  code: "INVALID_STEP_PARAMS",
119575
119554
  message: `A branch of If/Else step "${t4.name ?? t4.id}" references filter group "${r5.filterGroupId}", which does not exist.`,
@@ -119592,6 +119571,8 @@ var VI2 = /* @__PURE__ */ (function(e3) {
119592
119571
  return e3.OK = "OK", e3.SUCCESS = "SUCCESS", e3.INFO = "INFO", e3.WARNING = "WARNING", e3.ERROR = "ERROR", e3.NEUTRAL = "NEUTRAL", e3.UNKNOWN = "UNKNOWN", e3;
119593
119572
  })({});
119594
119573
  Object.values(VI2).filter((e3) => e3 !== VI2.OK && e3 !== VI2.UNKNOWN), W2.TEXT, W2.ARRAY, W2.BOOLEAN, W2.DATE, W2.DATE_TIME, W2.NUMBER, W2.NUMERIC, W2.RAW_JSON, W2.RICH_TEXT, W2.SELECT, W2.MULTI_SELECT, kF2.SEND_EMAIL, kF2.DRAFT_EMAIL, kF2.CREATE_CALENDAR_EVENT;
119574
+ var HI2 = "TWENTY_API_URL";
119575
+ var UI2 = "TWENTY_APP_APPLICATION_ACCESS_TOKEN";
119595
119576
  hp2.map((e3) => mp2[e3]);
119596
119577
  var WI2 = {
119597
119578
  universalIdentifier: Wl2(),
@@ -119656,7 +119637,7 @@ var YI2 = gd2("type", [
119656
119637
  fieldUniversalIdentifier: Wl2()
119657
119638
  }).optional()
119658
119639
  }).superRefine((t4, n4) => {
119659
- t4.strategy === "LOAD_BALANCED" && !n2(t4.loadBalance) && n4.addIssue({
119640
+ t4.strategy === "LOAD_BALANCED" && !n(t4.loadBalance) && n4.addIssue({
119660
119641
  code: "custom",
119661
119642
  path: ["loadBalance"],
119662
119643
  message: "loadBalance is required when strategy is LOAD_BALANCED"
@@ -119724,6 +119705,27 @@ fd2({
119724
119705
  message: e4.message
119725
119706
  });
119726
119707
  });
119708
+ var XI2 = () => process.env.TWENTY_APP_APPLICATION_ACCESS_TOKEN ?? process.env.TWENTY_APP_ACCESS_TOKEN;
119709
+ var ZI = async ({ query: e3, variables: t4, caller: n4 }) => {
119710
+ let r4 = process.env[HI2], i5 = XI2();
119711
+ if (!r4 || !i5) throw Error(`${n4}() requires the app runtime env vars ${HI2} and ${UI2}.`);
119712
+ let a5 = await fetch(`${r4}/metadata`, {
119713
+ method: "POST",
119714
+ headers: {
119715
+ "Content-Type": "application/json",
119716
+ Authorization: `Bearer ${i5}`
119717
+ },
119718
+ body: JSON.stringify({
119719
+ query: e3,
119720
+ variables: t4
119721
+ })
119722
+ });
119723
+ if (!a5.ok) throw Error(`${n4}() failed: HTTP ${a5.status} ${a5.statusText}`);
119724
+ let o5 = await a5.json();
119725
+ if (o5.errors && o5.errors.length > 0) throw Error(`${n4}() failed: ${o5.errors.map((e4) => e4.message).join(", ")}`);
119726
+ if (!o5.data) throw Error(`${n4}() failed: response contained no data.`);
119727
+ return o5.data;
119728
+ };
119727
119729
  var aL = "\n id\n handle\n displayName\n visibility\n connectedAccountId\n isSyncEnabled\n";
119728
119730
  var oL = `
119729
119731
  mutation CreateAppMessageChannel($input: CreateAppMessageChannelInput!) {
@@ -119753,6 +119755,45 @@ var fL = `
119753
119755
  }
119754
119756
  }
119755
119757
  `;
119758
+ var TL = "\n query GetAppKeyValue($key: String!, $scope: AppKeyValueScope) {\n appKeyValue(key: $key, scope: $scope) {\n key\n value\n scope\n }\n }\n";
119759
+ var EL = "\n mutation SetAppKeyValue($input: SetAppKeyValueInput!) {\n setAppKeyValue(input: $input) {\n key\n value\n scope\n }\n }\n";
119760
+ var DL = "\n mutation DeleteAppKeyValue($key: String!, $scope: AppKeyValueScope) {\n deleteAppKeyValue(key: $key, scope: $scope)\n }\n";
119761
+ var OL = "WORKSPACE";
119762
+ var kL = {
119763
+ async get(e3, t4) {
119764
+ let { appKeyValue: n4 } = await ZI({
119765
+ query: TL,
119766
+ variables: {
119767
+ key: e3,
119768
+ scope: t4?.scope ?? OL
119769
+ },
119770
+ caller: "kv.get"
119771
+ });
119772
+ return n4?.value ?? null;
119773
+ },
119774
+ async set(e3, t4, n4) {
119775
+ await ZI({
119776
+ query: EL,
119777
+ variables: { input: {
119778
+ key: e3,
119779
+ value: t4,
119780
+ scope: n4?.scope ?? OL
119781
+ } },
119782
+ caller: "kv.set"
119783
+ });
119784
+ },
119785
+ async delete(e3, t4) {
119786
+ let { deleteAppKeyValue: n4 } = await ZI({
119787
+ query: DL,
119788
+ variables: {
119789
+ key: e3,
119790
+ scope: t4?.scope ?? OL
119791
+ },
119792
+ caller: "kv.delete"
119793
+ });
119794
+ return n4;
119795
+ }
119796
+ };
119756
119797
  var AL = class {
119757
119798
  constructor(e3, t4) {
119758
119799
  this.__twentyHttpResponse = true, this.body = e3, this.status = t4?.status, this.headers = t4?.headers;
@@ -119788,6 +119829,208 @@ var withRouteErrors = (name, handler2) => async (...args) => {
119788
119829
  }
119789
119830
  };
119790
119831
 
119832
+ // src/shared/api/rest-response.util.ts
119833
+ var readDataValue = (response) => {
119834
+ const data = response?.data;
119835
+ if (typeof data !== "object" || data === null) {
119836
+ return void 0;
119837
+ }
119838
+ return Object.values(data)[0];
119839
+ };
119840
+ var readRestList = (response) => {
119841
+ const value = readDataValue(response);
119842
+ return {
119843
+ records: Array.isArray(value) ? value : [],
119844
+ pageInfo: response?.pageInfo ?? {},
119845
+ totalCount: response?.totalCount
119846
+ };
119847
+ };
119848
+ var readRestRecord = (response) => {
119849
+ const value = readDataValue(response);
119850
+ return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
119851
+ };
119852
+
119853
+ // src/shared/api/rest-filter.util.ts
119854
+ var UNSAFE_FILTER_CHARACTERS = /[()[\]'",]/g;
119855
+ var sanitizeFilterText = (text) => text.replace(UNSAFE_FILTER_CHARACTERS, " ").trim();
119856
+ var quote = (value) => `'${sanitizeFilterText(value)}'`;
119857
+ var restEq = (field, value) => `${field}[eq]:${quote(value)}`;
119858
+
119859
+ // src/server/records.ts
119860
+ var clients = {
119861
+ person: new u2(),
119862
+ application: new u2({ runAs: "application" })
119863
+ };
119864
+ var restClient = (runAs) => clients[runAs];
119865
+ var listWorkflowVersions = async (runAs, workflowId) => readRestList(
119866
+ await restClient(runAs).get("/rest/workflowVersions", {
119867
+ query: {
119868
+ filter: restEq("workflowId", workflowId),
119869
+ order_by: "createdAt[DescNullsLast]",
119870
+ limit: 50
119871
+ }
119872
+ })
119873
+ ).records;
119874
+
119875
+ // src/server/launch-step.ts
119876
+ var recordsEngine = {
119877
+ listVersions: (workflowId) => listWorkflowVersions("person", workflowId),
119878
+ getVersion: async (versionId) => readRestRecord(
119879
+ await restClient("person").get(`/rest/workflowVersions/${versionId}`)
119880
+ ),
119881
+ createDraft: async (workflowId, fromVersionId) => {
119882
+ await callCoreGraphql({
119883
+ query: CREATE_DRAFT_FROM_WORKFLOW_VERSION_MUTATION,
119884
+ variables: { input: { workflowId, workflowVersionIdToCopy: fromVersionId } }
119885
+ });
119886
+ },
119887
+ updateTrigger: async (versionId, trigger) => {
119888
+ await callCoreGraphql({
119889
+ query: UPDATE_WORKFLOW_VERSION_TRIGGER_MUTATION,
119890
+ variables: { input: { workflowVersionId: versionId, trigger } }
119891
+ });
119892
+ },
119893
+ updateStep: async (versionId, step) => {
119894
+ await callCoreGraphql({
119895
+ query: UPDATE_WORKFLOW_VERSION_STEP_MUTATION,
119896
+ variables: { input: { workflowVersionId: versionId, step } }
119897
+ });
119898
+ },
119899
+ deleteStep: async (versionId, stepId) => {
119900
+ await callCoreGraphql({
119901
+ query: DELETE_WORKFLOW_VERSION_STEP_MUTATION,
119902
+ variables: { input: { workflowVersionId: versionId, stepId } }
119903
+ });
119904
+ }
119905
+ };
119906
+
119907
+ // src/server/process-catalog.ts
119908
+ var MEMBERSHIP_KEY = "docflow-processes";
119909
+ var LAUNCH_SETTINGS_KEY = "docflow-launch-settings";
119910
+ var PAGE_SIZE = 200;
119911
+ var VERSIONS_BATCH_SIZE = 50;
119912
+ var readStringList = (value) => Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
119913
+ var readMembership = async () => {
119914
+ const stored = await kL.get(MEMBERSHIP_KEY);
119915
+ return { included: readStringList(stored?.included), excluded: readStringList(stored?.excluded) };
119916
+ };
119917
+ var readLaunchSettings = async () => {
119918
+ const stored = await kL.get(LAUNCH_SETTINGS_KEY);
119919
+ return typeof stored === "object" && stored !== null ? stored : {};
119920
+ };
119921
+ var saveLaunchSettings = async (workflowId, settings) => {
119922
+ await kL.set(LAUNCH_SETTINGS_KEY, { ...await readLaunchSettings(), [workflowId]: settings });
119923
+ };
119924
+ var NIL_ID = "00000000-0000-0000-0000-000000000000";
119925
+ var canAppEditCache;
119926
+ var canAppEditProcesses = async () => {
119927
+ if (canAppEditCache === void 0) {
119928
+ try {
119929
+ await callCoreGraphql({
119930
+ query: "mutation($id: UUID!) { activateWorkflowVersion(workflowVersionId: $id) }",
119931
+ variables: { id: NIL_ID }
119932
+ });
119933
+ canAppEditCache = true;
119934
+ } catch (error) {
119935
+ canAppEditCache = !isMissingGraphqlField(error);
119936
+ }
119937
+ }
119938
+ return canAppEditCache;
119939
+ };
119940
+ var readLegacyWorkflows = async (runAs) => {
119941
+ try {
119942
+ const { records } = readRestList(
119943
+ await restClient(runAs).get("/rest/workflows", {
119944
+ query: { filter: restEq("smbSection", DOCFLOW_SECTION), limit: PAGE_SIZE }
119945
+ })
119946
+ );
119947
+ return new Map(records.map((record) => [record.id, record]));
119948
+ } catch {
119949
+ return /* @__PURE__ */ new Map();
119950
+ }
119951
+ };
119952
+ var listCoreWorkflows = async (runAs) => {
119953
+ const nodes = [];
119954
+ let after;
119955
+ do {
119956
+ const { coreWorkflows } = await callCoreGraphql({ query: CORE_WORKFLOWS_QUERY, variables: { first: PAGE_SIZE, after }, runAs });
119957
+ nodes.push(...coreWorkflows.edges.map(({ node }) => node));
119958
+ after = coreWorkflows.pageInfo.hasNextPage ? coreWorkflows.pageInfo.endCursor ?? void 0 : void 0;
119959
+ } while (after !== void 0);
119960
+ return nodes;
119961
+ };
119962
+ var isDocflowNode = (node, membership, legacy) => !membership.excluded.includes(node.id) && (membership.included.includes(node.id) || typeof node.workspaceWorkflowId === "string" && legacy.has(node.workspaceWorkflowId));
119963
+ var byNewest = (first, second) => new Date(second.createdAt ?? 0).getTime() - new Date(first.createdAt ?? 0).getTime();
119964
+ var getVersion = async (id3, runAs) => (await callCoreGraphql({
119965
+ query: CORE_WORKFLOW_VERSION_BY_ID_QUERY,
119966
+ variables: { coreWorkflowVersionId: id3 },
119967
+ runAs
119968
+ })).coreWorkflowVersionById ?? void 0;
119969
+ var readVersions = async (workflowIds, runAs) => {
119970
+ const result = /* @__PURE__ */ new Map();
119971
+ for (let start = 0; start < workflowIds.length; start += VERSIONS_BATCH_SIZE) {
119972
+ const { coreWorkflowsWithCurrentVersions } = await callCoreGraphql({
119973
+ query: CORE_WORKFLOWS_WITH_CURRENT_VERSIONS_QUERY,
119974
+ variables: { input: { coreWorkflowIds: workflowIds.slice(start, start + VERSIONS_BATCH_SIZE) } },
119975
+ runAs
119976
+ });
119977
+ for (const { workflow, currentVersion, versions } of coreWorkflowsWithCurrentVersions) {
119978
+ const sorted = [...versions].sort(byNewest);
119979
+ const current = currentVersion ?? void 0;
119980
+ const activeId = sorted.find(({ status }) => status === "ACTIVE")?.id;
119981
+ const draft = current?.status === "DRAFT" ? current : void 0;
119982
+ const active = activeId === void 0 ? void 0 : current?.id === activeId ? current : await getVersion(activeId, runAs);
119983
+ const deactivatedId = sorted.find(({ status }) => status === "DEACTIVATED")?.id;
119984
+ const deactivated = deactivatedId === void 0 || active !== void 0 || draft !== void 0 ? void 0 : current?.id === deactivatedId ? current : await getVersion(deactivatedId, runAs);
119985
+ result.set(workflow.id, { active, draft, deactivated });
119986
+ }
119987
+ }
119988
+ return result;
119989
+ };
119990
+ var toProcess = (node, versions, legacy, launchSettings) => {
119991
+ const savedFields = parseLaunchFields(launchSettings?.fields ?? legacy?.smbLaunchFields);
119992
+ const savedObject = launchSettings !== void 0 ? launchSettings.launchObject : legacy?.smbLaunchObject;
119993
+ const active = versions?.active;
119994
+ return {
119995
+ workflowId: node.id,
119996
+ workspaceWorkflowId: node.workspaceWorkflowId ?? null,
119997
+ name: node.name?.trim() || "\u0411\u0435\u0437 \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044F",
119998
+ updatedAt: node.updatedAt ?? null,
119999
+ ...versions,
120000
+ // Fields saved by docflow, or for a webhook set up in the Twenty editor
120001
+ // the values its body expects
120002
+ launchFields: savedFields.length > 0 ? savedFields : parseExpectedBodyFields(active?.trigger),
120003
+ launchObject: isLaunchTrigger(active?.trigger) ? parseLaunchObject(savedObject) : void 0,
120004
+ // The draft is launched on this object once published: the settings page
120005
+ // shows what was saved, not what is published
120006
+ savedLaunchObject: parseLaunchObject(savedObject)
120007
+ };
120008
+ };
120009
+ var listDocflowProcesses = async (runAs = "person") => {
120010
+ const [nodes, membership, legacy, launchSettings] = await Promise.all([
120011
+ listCoreWorkflows(runAs),
120012
+ readMembership(),
120013
+ readLegacyWorkflows(runAs),
120014
+ readLaunchSettings()
120015
+ ]);
120016
+ const docflowNodes = nodes.filter((node) => isDocflowNode(node, membership, legacy));
120017
+ const versions = await readVersions(
120018
+ docflowNodes.map(({ id: id3 }) => id3),
120019
+ runAs
120020
+ );
120021
+ return docflowNodes.map(
120022
+ (node) => toProcess(
120023
+ node,
120024
+ versions.get(node.id),
120025
+ node.workspaceWorkflowId ? legacy.get(node.workspaceWorkflowId) : void 0,
120026
+ launchSettings[node.id]
120027
+ )
120028
+ );
120029
+ };
120030
+ var findDocflowProcess = async (workflowId, runAs = "person") => (await listDocflowProcesses(runAs)).find(
120031
+ (process2) => process2.workflowId === workflowId || process2.workspaceWorkflowId === workflowId
120032
+ );
120033
+
119791
120034
  // src/universal-identifiers.ts
119792
120035
  var SAVE_LAUNCH_FIELDS_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER = "d2cce9f2-6ba4-415c-aa3d-5d9aba6ae89c";
119793
120036
 
@@ -119808,19 +120051,38 @@ var handler = async (event) => {
119808
120051
  if (launchObjectName !== void 0 && launchObject === void 0) {
119809
120052
  return jsonResponse(422, { message: `\u041E\u0431\u044A\u0435\u043A\u0442 \xAB${launchObjectName}\xBB \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D` });
119810
120053
  }
119811
- const workflow = readRestRecord(
119812
- await restClient("person").patch(`/rest/workflows/${workflowId}`, {
120054
+ const docflowProcess = await findDocflowProcess(workflowId, "person");
120055
+ if (docflowProcess === void 0) {
120056
+ return jsonResponse(404, { message: "\u041F\u0440\u043E\u0446\u0435\u0441\u0441 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442\u0430 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D" });
120057
+ }
120058
+ await saveLaunchSettings(docflowProcess.workflowId, {
120059
+ fields,
120060
+ launchObject: launchObject?.nameSingular ?? null
120061
+ });
120062
+ const canAppEdit = await canAppEditProcesses();
120063
+ if (canAppEdit && docflowProcess.workspaceWorkflowId !== null) {
120064
+ await restClient("person").patch(`/rest/workflows/${docflowProcess.workspaceWorkflowId}`, {
119813
120065
  smbLaunchFields: fields.length > 0 ? fields : null,
119814
120066
  smbLaunchObject: launchObject?.nameSingular ?? null
119815
- })
119816
- );
119817
- if (workflow === void 0) {
119818
- return jsonResponse(404, { message: "\u041F\u0440\u043E\u0446\u0435\u0441\u0441 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D" });
120067
+ });
120068
+ }
120069
+ if (body.syncTrigger === false) {
120070
+ return { status: "SAVED" };
120071
+ }
120072
+ if (!canAppEdit || docflowProcess.workspaceWorkflowId === null) {
120073
+ return jsonResponse(409, {
120074
+ code: "EDIT_ON_STANDALONE_PAGE",
120075
+ message: "\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u044B. \u0417\u0430\u043F\u0443\u0441\u043A \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0430 \u0432 \u044D\u0442\u043E\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Twenty \u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u043D\u0430 \u043F\u043E\u043B\u043D\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u043E\u043E\u0431\u043E\u0440\u043E\u0442\u0430"
120076
+ });
119819
120077
  }
119820
120078
  try {
119821
- const result = await syncLaunchTrigger({ workflowId, fields, launchObject });
120079
+ const result = await syncLaunchTrigger(recordsEngine, {
120080
+ workflowId: docflowProcess.workspaceWorkflowId,
120081
+ fields,
120082
+ launchObject
120083
+ });
119822
120084
  logDocflow("launch fields: draft synced", { workflowId, result });
119823
- if (result?.status === "NOT_MANUAL") {
120085
+ if (result.status === "NOT_MANUAL") {
119824
120086
  return jsonResponse(409, {
119825
120087
  message: "\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u044B, \u043D\u043E \u0437\u0430\u043F\u0443\u0441\u043A \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0430 \u043D\u0435 \u0438\u0437\u043C\u0435\u043D\u0451\u043D: \u043E\u043D \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0435\u0442\u0441\u044F \u043D\u0435 \u0432\u0440\u0443\u0447\u043D\u0443\u044E"
119826
120088
  });