@oomol-lab/open-flow 0.1.0-beta.62 → 0.1.0-beta.63

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 (51) hide show
  1. package/dist/browser/{createResourceDialog-DZgJsr3e.js → createResourceDialog-BAJXbzNH.js} +20 -7
  2. package/dist/browser/flow-authoring.js +8 -7
  3. package/dist/browser/flow-change-schema.d.ts +1 -0
  4. package/dist/browser/flow-change.d.ts +1 -0
  5. package/dist/browser/flow-change.js +8 -7
  6. package/dist/browser/{flowChanges-CzYIVevI.js → flowChanges-DpZOQuJE.js} +784 -443
  7. package/dist/browser/{flowRunInputEditorStore-Dsxyfwae.js → flowRunInputEditorStore-B2Rw4VsT.js} +1 -1
  8. package/dist/browser/{flowWorkspace-BgZaFKZm.js → flowWorkspace-B7a5NNA_.js} +41 -29
  9. package/dist/browser/{icons-CajfDpy_.js → icons-Db2Jb2iX.js} +30 -10
  10. package/dist/browser/preview.css +5 -6
  11. package/dist/browser/preview.js +437 -402
  12. package/dist/browser/{typeScriptSession-fXPMFGjW.js → typeScriptSession-D0bjYDeg.js} +1 -1
  13. package/dist/browser/ui.css +4 -5
  14. package/dist/browser/ui.js +2 -2
  15. package/dist/browser/{value-DL_poNiC.js → value-BADHeZ9I.js} +12 -1
  16. package/dist/browser/workbench-contract.d.ts +10 -0
  17. package/dist/browser/workbench.css +5 -6
  18. package/dist/browser/workbench.d.ts +5 -3
  19. package/dist/browser/workbench.js +198 -171
  20. package/dist/browser/{workbenchSelect-H9wzEFkH.js → workbenchSelect-C-jf6NIM.js} +1 -1
  21. package/dist/command/index.js +40 -39
  22. package/dist/common/authoringSchema.d.ts +1 -0
  23. package/dist/common/connector-action.d.ts +1 -0
  24. package/dist/common/connector-action.js +15 -12
  25. package/dist/common/control-api-conformance.js +107 -8
  26. package/dist/common/control-api.d.ts +8 -0
  27. package/dist/common/control-api.js +47 -8
  28. package/dist/common/control-requests.d.ts +6 -0
  29. package/dist/common/control-requests.js +41 -18
  30. package/dist/common/decision.js +8 -7
  31. package/dist/common/flow-connectionUsage.d.ts +1 -0
  32. package/dist/common/flow-encoding.d.ts +1 -0
  33. package/dist/common/flow-encoding.js +202 -10
  34. package/dist/common/flow-semantics.js +64 -46
  35. package/dist/common/flow-workflowFile.d.ts +23 -0
  36. package/dist/common/integration-trigger.js +8 -7
  37. package/dist/common/localization.d.ts +1 -0
  38. package/dist/common/localization.js +12 -1
  39. package/dist/common/mcp.d.ts +61 -0
  40. package/dist/common/mcp.js +92 -9
  41. package/dist/common/openapi.js +8 -7
  42. package/dist/common/poll-trigger.js +8 -7
  43. package/dist/common/runtime-contract.js +1 -1
  44. package/dist/common/scheduler.d.ts +22 -2
  45. package/dist/common/scheduler.js +354 -83
  46. package/dist/common/trigger-config.d.ts +2 -0
  47. package/dist/common/webhook-trigger.js +8 -7
  48. package/dist/index.d.ts +2 -2
  49. package/package.json +1 -1
  50. package/skills/open-flow/SKILL.md +1 -1
  51. package/skills/open-flow/references/flow-authoring.md +20 -0
@@ -1,8 +1,8 @@
1
1
  import { o as __toESM, t as __commonJSMin } from "./rolldown-runtime-CEgmsyvS.js";
2
2
  import { a as derive, i as compute, l as val, r as combine, t as arrayShallowEqual } from "./dist-bO8nvHFH.js";
3
- import { l as useTranslate, o as I18nProvider } from "./dist-BFmpkX4P.js";
4
- import { $ as otherwiseOutput, $n as fastComponent, $t as adaptiveOrigin, Ai as useButton, An as PopupTriggerMap, Ar as isMac, B as applyFlowChanges$1, Bn as useFloatingNodeId, Br as transitionStatusMapping, Ci as clsx, Cn as useHoverReferenceInteraction, Ct as SelectContent, D as authoringDefinitionSchemas, Di as NOOP, Dt as SelectTrigger, Ei as EMPTY_OBJECT, En as useSyncedFloatingRootContext, Er as contains, F as comparePorts, Fi as useIsoLayoutEffect, Fn as useDismiss, Fr as createLucideIcon, G as portsByHandle, Gn as CLICK_TRIGGER_IDENTIFIER, Gr as cancelOpen, H as nextNodeName, Hi as isLastTraversableNode, Hn as useFloatingTree, Hr as useValueChanged, I as matchesSchema, Ii as SafeReact, In as useClick, Ir as useTransitionStatus, J as conditionInputPorts, Jn as FocusGuard, Jt as useAnchoredPopupScrollLock, Kn as DROPDOWN_COLLISION_AVOIDANCE, L as schemaObject, Li as useStableCallback, Ln as FloatingFocusManager, Lr as useOpenChangeComplete, M as decisionTask, Mi as useCompositeRootContext, Mn as useOpenStateTransitions, Ni as formatErrorMessage, Nn as useTriggerDataForwarding, O as decodeRevisionContent, Oi as warn, On as createInitialPopupStoreState, Ot as SelectValue, Pi as mergeProps, Pn as useTriggerRegistration, Pr as Check, Qt as useAnchorPositioning, Ri as useRefWithInit, Rn as FloatingNode, Rr as useAnimationsFinished, Rt as COMPOSITE_KEYS, Si as cva, Sn as useInteractions, Ti as EMPTY_ARRAY, Tn as useFocus, Tt as SelectItem, Un as FloatingTreeStore, Ur as createChangeEventDetails, V as isSchemaKeyword, Vi as isHTMLElement$1, Vn as useFloatingParentNodeId, Vr as useOnMount, W as normalizeNodeName, Wn as FloatingPortal, X as nodeInputMappings, Xn as ReactStore, Xr as imperativeAction, Xt as getDisabledMountTransitionStyles, Yr as focusOut, Yt as usePositioner, Zt as InternalBackdrop, _i as visuallyHiddenInput, _t as strictObject, an as pressableTriggerOpenStateMapping, ar as useOnFirstRender, at as webhookSupportsBody, bi as buttonVariants, bn as useRole, bt as unknown, ci as useLabelableContext, cn as useOpenInteractionType, cr as Timeout, ct as boolean, d as TooltipContent, di as useFieldRootContext, dr as getTabbableAfterElement, dt as json$2, ei as itemPress, en as useDirection, er as fastComponentRef, fi as useBaseUiId, fr as getTabbableBeforeElement, ft as lazy$1, gi as visuallyHidden, gt as record$2, hi as fieldValidityMapping, ht as object$1, ii as siblingOpen, in as popupStateMapping, jn as useImplicitActiveTrigger, jr as ownerDocument, jt as useCompositeListItem, ki as useMergedRefs, kn as popupStoreSelectors, kt as Separator, li as useFormContext, lr as useTimeout, lt as discriminatedUnion, mt as number, ni as none, nn as inertValue, nt as format, oi as triggerHover, on as triggerOpenStateMapping, or as Label, ot as _enum, p as TooltipTrigger, pi as useId$1, pr as isOutsideEvent, pt as literal, qn as POPUP_COLLISION_AVOIDANCE, qr as closePress, qt as useToolbarRootContext, rn as getPseudoElementBounds, rr as createSelector, rt as dequal, sr as Input, st as array, tn as CompositeList, u as Tooltip, ui as useRegisterFieldControl, ur as getNextTabbable, ut as int, vi as useControlled, vn as safePolygon, vt as string$1, wi as useRenderElement, wn as useHoverFloatingInteraction, wt as SelectGroup, xi as cn, xn as useListNavigation, xt as Select, yi as Button, yn as useTypeahead, yt as union, zi as getParentNode, zn as FloatingTree } from "./icons-CajfDpy_.js";
5
- import { c as isUiLanguage, d as uiLanguages, i as objectValue, l as resolveUiLanguage, s as valueType, t as initialValue } from "./value-DL_poNiC.js";
3
+ import { a as toPlainObject, l as useTranslate, o as I18nProvider } from "./dist-BFmpkX4P.js";
4
+ import { $t as InternalBackdrop, Ai as warn, An as createInitialPopupStoreState, At as SelectValue, Bi as useRefWithInit, Bn as FloatingNode, Br as useAnimationsFinished, Bt as COMPOSITE_KEYS, Ci as cn, Cn as useListNavigation, Ct as Select, D as authoringDefinitionSchemas, Di as EMPTY_ARRAY, Dn as useFocus, Dt as SelectItem, Ei as useRenderElement, En as useHoverFloatingInteraction, Et as SelectGroup, Fi as formatErrorMessage, Fn as useTriggerDataForwarding, G as normalizeNodeName, Gn as FloatingTreeStore, Gr as createChangeEventDetails, H as isSchemaKeyword, Hn as useFloatingNodeId, Hr as transitionStatusMapping, I as comparePorts, Ii as mergeProps, In as useTriggerRegistration, Ir as Check, J as clearConditionBindings, Jn as DROPDOWN_COLLISION_AVOIDANCE, K as portsByHandle, Kn as FloatingPortal, L as matchesSchema, Li as useIsoLayoutEffect, Ln as useDismiss, Lr as createLucideIcon, Mi as useButton, Mn as PopupTriggerMap, Mr as isMac, N as decisionTask, Nn as useImplicitActiveTrigger, Nr as ownerDocument, Nt as useCompositeListItem, O as decodeRevisionContent, Oi as EMPTY_OBJECT, On as useSyncedFloatingRootContext, Or as contains, Pi as useCompositeRootContext, Pn as useOpenStateTransitions, Q as nodeInputMappings, Qn as ReactStore, Qr as imperativeAction, Qt as getDisabledMountTransitionStyles, R as schemaObject, Ri as SafeReact, Rn as useClick, Rr as useTransitionStatus, Si as buttonVariants, Sn as useRole, St as unknown, Ti as clsx, Tn as useHoverReferenceInteraction, Tt as SelectContent, U as nextNodeName, Ui as isHTMLElement$1, Un as useFloatingParentNodeId, Ur as useOnMount, V as applyFlowChanges$1, Vi as getParentNode, Vn as FloatingTree, Wi as isLastTraversableNode, Wn as useFloatingTree, Wr as useValueChanged, X as conditionInputPorts, Xn as FocusGuard, Xt as useAnchoredPopupScrollLock, Yn as POPUP_COLLISION_AVOIDANCE, Yr as closePress, Yt as useToolbarRootContext, Zr as focusOut, Zt as usePositioner, _i as fieldValidityMapping, _t as object$1, an as getPseudoElementBounds, ar as createSelector, at as dequal, bi as useControlled, bn as safePolygon, bt as string$1, ci as triggerHover, cn as triggerOpenStateMapping, cr as Label, ct as _enum, d as TooltipContent, di as useFormContext, dr as useTimeout, dt as discriminatedUnion, en as useAnchorPositioning, fi as useRegisterFieldControl, fr as getNextTabbable, ft as int, gt as number, hi as useId$1, hr as isOutsideEvent, ht as literal, ii as none, in as inertValue, it as format, ji as useMergedRefs, jn as popupStoreSelectors, jt as Separator, k as checkJsonDepth, ki as NOOP, kt as SelectTrigger, lr as Input, lt as array, mi as useBaseUiId, mr as getTabbableBeforeElement, mt as lazy$1, ni as itemPress, nn as useDirection, nr as fastComponentRef, oi as siblingOpen, on as popupStateMapping, p as TooltipTrigger, pi as useFieldRootContext, pr as getTabbableAfterElement, pt as json$2, qn as CLICK_TRIGGER_IDENTIFIER, qr as cancelOpen, rn as CompositeList, sn as pressableTriggerOpenStateMapping, sr as useOnFirstRender, st as webhookSupportsBody, tn as adaptiveOrigin, tr as fastComponent, tt as otherwiseOutput, u as Tooltip, ui as useLabelableContext, un as useOpenInteractionType, ur as Timeout, ut as boolean, vi as visuallyHidden, vt as record$2, wi as cva, wn as useInteractions, xi as Button, xn as useTypeahead, xt as union, yi as visuallyHiddenInput, yt as strictObject, zi as useStableCallback, zn as FloatingFocusManager, zr as useOpenChangeComplete } from "./icons-Db2Jb2iX.js";
5
+ import { f as uiLanguages, i as objectValue, l as isUiLanguage, s as valueType, t as initialValue, u as resolveUiLanguage } from "./value-BADHeZ9I.js";
6
6
  import "./lib-Dws05GHj.js";
7
7
  import * as React from "react";
8
8
  import reactExports, { createContext, forwardRef, memo, useCallback, useContext, useEffect, useId, useImperativeHandle, useLayoutEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore } from "react";
@@ -1132,7 +1132,7 @@ var authoringConfigurations = {
1132
1132
  outputs: outputFields,
1133
1133
  capabilities: authoringDefinitionSchemas.capabilities.optional()
1134
1134
  }),
1135
- connector: authoringDefinitionSchemas.connector.strict(),
1135
+ connector: authoringDefinitionSchemas.connector.omit({ outputMode: true }).strict(),
1136
1136
  openapi: authoringOpenApiSchema,
1137
1137
  agent: authoringDefinitionSchemas.agent.omit({
1138
1138
  prompt: true,
@@ -1755,6 +1755,218 @@ function providerIconAppearance(metadata, position) {
1755
1755
  }
1756
1756
  };
1757
1757
  }
1758
+ //#endregion
1759
+ //#region src/trigger/common/config.ts
1760
+ /** Deployment-bound selections owned by the Trigger configuration contract. */
1761
+ function clearTriggerExternalConfig(key, config) {
1762
+ const fields = key == "feishu_app_bot.on_event" ? [
1763
+ "sourceId",
1764
+ "eventTypes",
1765
+ "resource",
1766
+ "chatIds"
1767
+ ] : key == "linear.on_issue_changed" ? ["teamId", "stateIds"] : [];
1768
+ return {
1769
+ ...config,
1770
+ ...Object.fromEntries(fields.map((field) => [field, { kind: "unset" }]))
1771
+ };
1772
+ }
1773
+ function triggerConfigValue(input, config) {
1774
+ return inputValue(config[input.handle], input.value);
1775
+ }
1776
+ /** Provider-specific controls consume values, never persistence wrappers. */
1777
+ function triggerConfigValues(inputs, config) {
1778
+ return Object.fromEntries(inputs.flatMap((input) => "handle" in input ? [[input.handle, triggerConfigValue(input, config) ?? null]] : []));
1779
+ }
1780
+ //#endregion
1781
+ //#region src/flow/common/connectionUsage.ts
1782
+ function connectionUsage$7(document) {
1783
+ const uses = [];
1784
+ for (const [nodeId, node] of Object.entries(document.graph.nodes)) {
1785
+ const task = node.kind == "task" && "executor" in node.task ? node.task : void 0;
1786
+ const name = node.name ?? task?.name ?? nodeId;
1787
+ const add = (kind, actionId, connectionId) => {
1788
+ uses.push({
1789
+ kind,
1790
+ providerId: actionId.split(".")[0],
1791
+ actionId,
1792
+ connectionId,
1793
+ nodeId,
1794
+ name
1795
+ });
1796
+ };
1797
+ if (node.kind == "poll" || node.kind == "integration") uses.push({
1798
+ kind: "trigger",
1799
+ triggerId: node.definition.key,
1800
+ providerId: node.definition.provider,
1801
+ connectionId: node.connectionId,
1802
+ nodeId,
1803
+ name
1804
+ });
1805
+ if (task?.executor.kind == "connector") add("connector", task.executor.action, task.executor.connectionId);
1806
+ if (node.kind == "task" && "moduleId" in node.task) {
1807
+ for (const capability of node.task.capabilities ?? []) if ("mode" in capability && capability.mode == "independent") for (const action of capability.actions) add("code", action.action, action.connectionId);
1808
+ }
1809
+ if (task?.executor.kind == "agent") {
1810
+ for (const tool of task.executor.tools) add("agent", tool.action, tool.connectionId);
1811
+ const notification = task.executor.notification;
1812
+ if (notification != null) add("notification", notification.action, notification.connectionId);
1813
+ }
1814
+ }
1815
+ return uses;
1816
+ }
1817
+ function clearNodeConnections(graph, connectionId) {
1818
+ return {
1819
+ ...graph,
1820
+ nodes: Object.fromEntries(Object.entries(graph.nodes).map(([id, node]) => {
1821
+ if ((node.kind == "poll" || node.kind == "integration") && (connectionId == null || node.connectionId == connectionId)) {
1822
+ const { connectionId: _, ...remaining } = node;
1823
+ return [id, remaining];
1824
+ }
1825
+ if (node.kind != "task") return [id, node];
1826
+ if ("executor" in node.task) {
1827
+ const executor = node.task.executor;
1828
+ const clear = (value) => {
1829
+ if (connectionId != null && value.connectionId != connectionId) return value;
1830
+ const { connectionId: _, ...rest } = value;
1831
+ return rest;
1832
+ };
1833
+ if (executor.kind == "connector") return [id, {
1834
+ ...node,
1835
+ task: {
1836
+ ...node.task,
1837
+ executor: clear(executor)
1838
+ }
1839
+ }];
1840
+ if (executor.kind == "agent") return [id, {
1841
+ ...node,
1842
+ task: {
1843
+ ...node.task,
1844
+ executor: {
1845
+ ...executor,
1846
+ tools: executor.tools.map(clear),
1847
+ ...executor.notification == null ? {} : { notification: clear(executor.notification) }
1848
+ }
1849
+ }
1850
+ }];
1851
+ return [id, node];
1852
+ }
1853
+ const capabilities = node.task.capabilities?.map((capability) => {
1854
+ if (!("mode" in capability)) {
1855
+ if ("action" in capability) {
1856
+ const { connectionId: selected, ...rest } = capability;
1857
+ return {
1858
+ ...rest,
1859
+ connections: capability.connections.filter((item) => connectionId != null && item.connectionId != connectionId),
1860
+ ...selected != null && connectionId != null && selected != connectionId ? { connectionId: selected } : {}
1861
+ };
1862
+ }
1863
+ return {
1864
+ ...capability,
1865
+ ...connectionId == null && (capability.connectionHints?.length ?? 0) > 0 ? { actionHints: [.../* @__PURE__ */ new Set([...capability.actionHints ?? [], ...capability.connectionHints.map((hint) => hint.action)])] } : {},
1866
+ ...capability.connectionHints == null ? {} : { connectionHints: capability.connectionHints.filter((item) => connectionId != null && item.connectionId != connectionId) }
1867
+ };
1868
+ }
1869
+ if (capability.mode != "independent") return capability;
1870
+ return {
1871
+ ...capability,
1872
+ actions: capability.actions.map((action) => {
1873
+ if (connectionId != null && action.connectionId != connectionId) return action;
1874
+ const { connectionId: _, ...remaining } = action;
1875
+ return remaining;
1876
+ })
1877
+ };
1878
+ });
1879
+ return [id, capabilities == null ? node : {
1880
+ ...node,
1881
+ task: {
1882
+ ...node.task,
1883
+ capabilities
1884
+ }
1885
+ }];
1886
+ }))
1887
+ };
1888
+ }
1889
+ //#endregion
1890
+ //#region src/flow/common/workflowFile.ts
1891
+ var envelope = strictObject({
1892
+ kind: literal("open-flow-workflow"),
1893
+ version: literal(1),
1894
+ name: string$1().optional(),
1895
+ content: unknown(),
1896
+ presentation: record$2(string$1(), json$2()).optional()
1897
+ });
1898
+ /** Structural decoding only: incomplete drafts are supported, repair is never attempted. */
1899
+ function decodeWorkflowFile(value) {
1900
+ checkJsonDepth(value, -1);
1901
+ const file = envelope.parse(value);
1902
+ return {
1903
+ ...file,
1904
+ content: decodeRevisionContent(file.content)
1905
+ };
1906
+ }
1907
+ function parseWorkflowFile(text) {
1908
+ return decodeWorkflowFile(JSON.parse(text));
1909
+ }
1910
+ function cleanInput(input) {
1911
+ if (input.kind != "sources" || !input.sources.some((source) => source.kind == "binding")) return input;
1912
+ const sources = input.sources.filter((source) => source.kind != "binding");
1913
+ return sources.length == 0 ? { kind: "unset" } : {
1914
+ kind: "sources",
1915
+ sources
1916
+ };
1917
+ }
1918
+ /** Clear only owned structured references, never strings in code or business values. */
1919
+ function cleanWorkflowFile(value) {
1920
+ const file = decodeWorkflowFile(value);
1921
+ const original = file.content.document.graph;
1922
+ const graph = clearNodeConnections(original);
1923
+ const nodes = Object.fromEntries(Object.entries(graph.nodes).map(([id, source]) => {
1924
+ let node = source;
1925
+ if ("inputs" in node) node = {
1926
+ ...node,
1927
+ inputs: Object.fromEntries(Object.entries(node.inputs).map(([key, input]) => [key, cleanInput(input)]))
1928
+ };
1929
+ if (node.kind == "condition") node = clearConditionBindings(node);
1930
+ if (node.kind == "error" && node.sourceFlowIds != null) node = {
1931
+ ...node,
1932
+ sourceFlowIds: []
1933
+ };
1934
+ if (node.kind == "poll" || node.kind == "integration") node = {
1935
+ ...node,
1936
+ config: clearTriggerExternalConfig(node.definition.key, node.config)
1937
+ };
1938
+ return [id, node];
1939
+ }));
1940
+ return {
1941
+ file: {
1942
+ ...file,
1943
+ content: {
1944
+ ...file.content,
1945
+ document: {
1946
+ ...file.content.document,
1947
+ bindings: {},
1948
+ graph: {
1949
+ ...graph,
1950
+ nodes
1951
+ }
1952
+ }
1953
+ }
1954
+ },
1955
+ summary: {
1956
+ changedNodeIds: Object.keys(nodes).filter((id) => !dequal(nodes[id], original.nodes[id])),
1957
+ removedBindings: Object.keys(file.content.document.bindings).length
1958
+ }
1959
+ };
1960
+ }
1961
+ function encodeWorkflowFile(file) {
1962
+ return `${JSON.stringify(cleanWorkflowFile(file).file, null, 2)}\n`;
1963
+ }
1964
+ function workflowFileName(name) {
1965
+ return `${name.replace(/[<>:"/\\|?*\u0000-\u001f]/g, "_").replace(/[. ]+$/g, "") || "workflow"}.openflow.json`;
1966
+ }
1967
+ function workflowNameFromFile(name) {
1968
+ return name.replace(/(?:\.openflow)?\.json$/i, "");
1969
+ }
1758
1970
  new TextEncoder();
1759
1971
  //#endregion
1760
1972
  //#region src/control/common/providerAccess.ts
@@ -2120,15 +2332,6 @@ function connectorProvider(value) {
2120
2332
  };
2121
2333
  }
2122
2334
  //#endregion
2123
- //#region src/trigger/common/config.ts
2124
- function triggerConfigValue(input, config) {
2125
- return inputValue(config[input.handle], input.value);
2126
- }
2127
- /** Provider-specific controls consume values, never persistence wrappers. */
2128
- function triggerConfigValues(inputs, config) {
2129
- return Object.fromEntries(inputs.flatMap((input) => "handle" in input ? [[input.handle, triggerConfigValue(input, config) ?? null]] : []));
2130
- }
2131
- //#endregion
2132
2335
  //#region src/base/common/json.ts
2133
2336
  function hasJsonShape(root) {
2134
2337
  if (root === null || typeof root == "boolean" || typeof root == "string") return true;
@@ -2546,18 +2749,13 @@ function mappingAvailable(graph, target, mapping, analysis) {
2546
2749
  if (target != null && mapping.sources.some((source) => source.kind == "node" && isResolutionNode(graph.nodes[source.nodeId]) && !analysis.resolutionOutputs.get(target)?.has(resolutionOutputKey(source.nodeId, source.output)))) return false;
2547
2750
  const sources = mapping.sources.map((source) => sourcePaths(graph, paths, source));
2548
2751
  const targetPaths = target == null ? [{}] : paths.get(target) ?? [];
2549
- for (const [index, routes] of sources.entries()) for (const [offset, other] of sources.slice(index + 1).entries()) {
2550
- const leftSource = mapping.sources[index];
2551
- const rightSource = mapping.sources[index + offset + 1];
2552
- if (target != null && leftSource.kind == "node" && rightSource.kind == "node" && leftSource.nodeId != rightSource.nodeId && !ancestors.get(leftSource.nodeId)?.has(rightSource.nodeId) && !ancestors.get(rightSource.nodeId)?.has(leftSource.nodeId)) continue;
2553
- for (const left of routes) for (const targetRoute of targetPaths) {
2554
- if (!routesCompatible(left, targetRoute)) continue;
2555
- const path = {
2556
- ...targetRoute,
2557
- ...left
2558
- };
2559
- if (other.some((right) => routesCompatible(right, path))) return false;
2560
- }
2752
+ for (const [index, routes] of sources.entries()) for (const other of sources.slice(index + 1)) for (const left of routes) for (const targetRoute of targetPaths) {
2753
+ if (!routesCompatible(left, targetRoute)) continue;
2754
+ const path = {
2755
+ ...targetRoute,
2756
+ ...left
2757
+ };
2758
+ if (other.some((right) => routesCompatible(right, path))) return false;
2561
2759
  }
2562
2760
  return true;
2563
2761
  }
@@ -3648,6 +3846,26 @@ var ControlClient = class {
3648
3846
  exact(source, ["version"]);
3649
3847
  if (source.version != 1) return invalidResponse();
3650
3848
  }
3849
+ async exportFlow(flowId) {
3850
+ const value = await this.request(`/v1/flows/${segment$1(flowId)}/export`);
3851
+ try {
3852
+ return decodeWorkflowFile(value);
3853
+ } catch {
3854
+ return invalidResponse();
3855
+ }
3856
+ }
3857
+ async importFlow(file, options = {}) {
3858
+ return flow(await this.request("/v1/flows/import", {
3859
+ method: "POST",
3860
+ headers: { "Idempotency-Key": options.idempotencyKey ?? `flow-${randomId()}` },
3861
+ body: JSON.stringify({
3862
+ file,
3863
+ name: options.name,
3864
+ teamId: options.teamId,
3865
+ version: 1
3866
+ })
3867
+ }));
3868
+ }
3651
3869
  async createFlow(name, idempotencyKey = `flow-${randomId()}`, teamId) {
3652
3870
  return flow(await this.request("/v1/flows", {
3653
3871
  body: JSON.stringify({
@@ -10619,7 +10837,10 @@ var resources$1 = {
10619
10837
  "enabledHint": "Controls new live runs. Draft tests remain available.",
10620
10838
  "publish": "Publish",
10621
10839
  "publishUpdate": "Update",
10622
- "deleteDescription": "This deletes the flow and its run history and stops live triggers. This cannot be undone."
10840
+ "deleteDescription": "This deletes the flow and its run history and stops live triggers. This cannot be undone.",
10841
+ "importFlow": "Import workflow",
10842
+ "exportFlow": "Export workflow",
10843
+ "importInvalid": "Invalid or unsupported workflow file."
10623
10844
  },
10624
10845
  inspector: {
10625
10846
  "outline": "Node outline",
@@ -10884,7 +11105,9 @@ var resources$1 = {
10884
11105
  "networkFailed": "Could not reach the service. Check your connection and try again.",
10885
11106
  "published": "Published {{name}}.",
10886
11107
  "rolledBack": "Rolled Live back to revision {{revision}}.",
10887
- "requestFailed": "The service could not complete this operation. Try again later."
11108
+ "requestFailed": "The service could not complete this operation. Try again later.",
11109
+ "flowImported": "Workflow imported. Configure external resources before running or publishing.",
11110
+ "exportSaveFailed": "Export stopped because the draft or layout could not be saved. Retry saving before exporting."
10888
11111
  },
10889
11112
  publication: {
10890
11113
  "active": "Active",
@@ -12059,7 +12282,10 @@ var resources$1 = {
12059
12282
  "enabledHint": "控制新的线上运行,草稿测试仍可使用。",
12060
12283
  "publish": "发布",
12061
12284
  "publishUpdate": "更新",
12062
- "deleteDescription": "此操作将删除工作流及其运行记录,并停止线上触发,无法撤销。"
12285
+ "deleteDescription": "此操作将删除工作流及其运行记录,并停止线上触发,无法撤销。",
12286
+ "importFlow": "导入工作流",
12287
+ "exportFlow": "导出工作流",
12288
+ "importInvalid": "文件损坏或工作流格式不受支持。"
12063
12289
  },
12064
12290
  inspector: {
12065
12291
  "outline": "节点大纲",
@@ -12324,7 +12550,9 @@ var resources$1 = {
12324
12550
  "networkFailed": "暂时无法连接服务,请检查网络后重试。",
12325
12551
  "published": "已发布 {{name}}。",
12326
12552
  "rolledBack": "已将线上版本回滚到修订 {{revision}}。",
12327
- "requestFailed": "服务未能完成此操作,请稍后重试。"
12553
+ "requestFailed": "服务未能完成此操作,请稍后重试。",
12554
+ "flowImported": "工作流已导入。运行或发布前请重新配置外部资源。",
12555
+ "exportSaveFailed": "草稿或布局未能保存,已停止导出。请保存成功后重试。"
12328
12556
  },
12329
12557
  publication: {
12330
12558
  "active": "运行中",
@@ -13499,7 +13727,10 @@ var resources$1 = {
13499
13727
  "enabledHint": "控制新的線上執行,草稿測試仍可使用。",
13500
13728
  "publish": "發佈",
13501
13729
  "publishUpdate": "更新",
13502
- "deleteDescription": "此操作將刪除工作流程及其執行記錄,並停止線上觸發,無法復原。"
13730
+ "deleteDescription": "此操作將刪除工作流程及其執行記錄,並停止線上觸發,無法復原。",
13731
+ "importFlow": "匯入工作流",
13732
+ "exportFlow": "匯出工作流",
13733
+ "importInvalid": "檔案損壞或工作流格式不受支援。"
13503
13734
  },
13504
13735
  inspector: {
13505
13736
  "outline": "節點大綱",
@@ -13764,7 +13995,9 @@ var resources$1 = {
13764
13995
  "networkFailed": "暫時無法連線到服務,請檢查網路後再試一次。",
13765
13996
  "published": "已發布 {{name}}。",
13766
13997
  "rolledBack": "已將線上版本還原到修訂 {{revision}}。",
13767
- "requestFailed": "服務未能完成此操作,請稍後再試一次。"
13998
+ "requestFailed": "服務未能完成此操作,請稍後再試一次。",
13999
+ "flowImported": "工作流已匯入。執行或發佈前請重新設定外部資源。",
14000
+ "exportSaveFailed": "草稿或版面未能儲存,已停止匯出。請儲存成功後重試。"
13768
14001
  },
13769
14002
  publication: {
13770
14003
  "active": "運作中",
@@ -14939,7 +15172,10 @@ var resources$1 = {
14939
15172
  "enabledHint": "新しい本番実行を制御します。下書きのテストは引き続き利用できます。",
14940
15173
  "publish": "公開",
14941
15174
  "publishUpdate": "更新",
14942
- "deleteDescription": "フローと実行履歴を削除し、本番のトリガーを停止します。この操作は取り消せません。"
15175
+ "deleteDescription": "フローと実行履歴を削除し、本番のトリガーを停止します。この操作は取り消せません。",
15176
+ "importFlow": "ワークフローをインポート",
15177
+ "exportFlow": "ワークフローをエクスポート",
15178
+ "importInvalid": "無効または未対応のワークフローファイルです。"
14943
15179
  },
14944
15180
  inspector: /* @__PURE__ */ JSON.parse("{\"outline\":\"ノード一覧\",\"backToOutline\":\"ノード一覧に戻る\",\"emptyOutline\":\"ノードはまだありません\",\"triggers\":\"トリガー\",\"nodes\":\"ノード\",\"multipleSelected\":\"{{count}} 個のノードを選択中\",\"account\":{\"contactAdmin\":\"この操作を実行する権限がありません。管理者にお問い合わせください。\",\"accessTitle\":\"アクセス権限\",\"manageFlowAccess\":\"Code で使用できる接続\",\"configureAccess\":\"アカウントを選択\",\"manageAccount\":\"アカウントを管理\",\"required\":\"アカウント接続が必要\",\"addAccount\":\"アカウントを追加\",\"manage\":\"管理\",\"authorizationPending\":\"Connection ページで認証を完了してください。ここに戻ると、このアカウントが更新されます。\",\"chooseAccount\":\"アカウントを選択\",\"connectBeforeRun\":\"このノードを実行または公開するには、先に {{service}} を接続してください。\",\"connectService\":\"{{service}} を接続\",\"connection\":\"Connection\",\"loading\":\"Connection を読み込み中…\",\"oomolBuiltIn\":\"OOMOL 組み込みアカウント\",\"missing\":\"このノードで選択されたアカウントは現在利用できません。別のアカウントを選択するか、アカウントを管理してください。\",\"refreshFailed\":\"Connection を更新できませんでした。\",\"retry\":\"再試行\",\"status\":{\"disconnected\":\"この Connection は切断されています。再接続するか、別のアカウントを選択してください。\",\"error\":\"この Connection にエラーがあります。修復するか、別のアカウントを選択してください。\",\"reauth_required\":\"この Connection は再認証が必要です。再接続するか、別のアカウントを選択してください。\"},\"statusUnavailable\":\"{{action}} の Connection 状態を取得できません。\",\"teamDefault\":\"チームのデフォルト\",\"title\":\"アカウント\",\"unavailable\":\"利用不可\"},\"close\":\"インスペクターを閉じる\",\"configurationRequired\":\"設定が必要\",\"diagnostics\":\"診断\",\"errors\":{\"jsonObject\":\"{{label}} は JSON オブジェクトである必要があります。\",\"portDefinitions\":\"有効なポート定義を入力してください。\"},\"node\":{\"nameDuplicate\":\"このグラフには同じ名前のノードが既に存在します。\",\"nameEmpty\":\"ノード名を空にすることはできません。\",\"timeout\":\"タイムアウト(ミリ秒)\",\"maxExecutions\":\"ノード実行上限\",\"maxExecutionsError\":\"ノード実行上限は正の整数で指定してください。\",\"timeoutError\":\"タイムアウトはミリ秒単位の正の整数で指定してください。\",\"title\":\"ノード設定\",\"description\":\"目的\",\"describe\":\"このステップの目的を記述します。\",\"icon\":\"アイコン\",\"name\":\"タイトル\"},\"selectNode\":\"ドラフトのノードを 1 つ選択すると、内容を確認して編集できます。\",\"locateNode\":\"キャンバス上でこのノードを表示\",\"task\":{\"sharedPermissions\":\"Flow の共有権限グループを使用\",\"sharedPermissionsHint\":\"Flow の共有権限グループで許可されたすべての Action を使用します。個別の追加は不要です。\",\"addAction\":\"Action を追加\",\"removeAction\":\"Action を削除\",\"actionAccount\":\"アカウント\",\"chooseAccount\":\"アカウントを選択\",\"permissionSaveFailed\":\"Code の権限を保存できませんでした。再試行してください。\",\"chatText\":\"チャットテキスト\",\"connectorAction\":\"Connector アクション\",\"definition\":\"タスク定義\",\"discardCode\":\"変更を破棄\",\"editorLoading\":\"エディターを読み込み中…\",\"editorUnavailable\":\"コードエディターを読み込めませんでした。\",\"inputPorts\":\"入力ポート\",\"javascriptModule\":\"コード\",\"missing\":\"参照しているタスクが存在しません。\",\"outputPorts\":\"出力ポート\",\"responseMode\":\"応答モード\",\"source\":\"ソースコード\",\"structuredJson\":\"構造化 JSON\",\"retrySave\":\"保存を再試行\",\"additionalInputs\":\"追加入力\"},\"wait\":{\"approval\":\"承認または拒否\",\"changeNotification\":\"変更\",\"continue\":\"続行\",\"mode\":\"処理方法\",\"inputsLoading\":\"通知パラメーターを読み込んでいます…\",\"pendingDescription\":\"確認待ち出力は待機開始時に一度だけ発火し、確認リンクと関連データを提供します。接続先でメッセージの送信や他のステップを実行できます。\",\"prompt\":\"プロンプト\",\"promptError\":\"プロンプトは1〜1,000文字で入力してください。\"},\"title\":\"インスペクター\",\"sources\":{\"loading\":\"入力元を読み込み中…\",\"loadFailed\":\"入力元を読み込めません。メニューを開き直してください。\",\"checkFailed\":\"このソースを確認できませんでした。\",\"select\":\"入力元を選択\",\"title\":\"入力元\",\"sourceMissing\":\"元の入力元は存在しません。選択し直してください。\",\"outputMissing\":\"「{{source}}」に「{{output}}」が見つかりません。選択し直してください。\",\"wholeObject\":\"オブジェクト全体\",\"fieldMissing\":\"「{{output}}」にフィールド {{field}} が宣言されていません。選択し直してください。\",\"notReady\":\"ここを実行するとき、「{{source}} {{handle}}」にまだ値がない可能性があります。\",\"sourceConflict\":\"同時に値を持つ可能性があります:{{sources}}。ここでは 1 つだけ使用できます。\",\"incompatibleRight\":\"右辺の値の型はこの比較に対応していません。\",\"incompatible\":\"非互換\",\"unverified\":\"未検証\",\"schemaIncompatible\":\"データ形式が一致しません。\",\"schemaPathIncompatible\":\"「{{path}}」のデータ形式が一致しません。\",\"schemaCompareFailed\":\"データ形式を確認できません。JSON Schema を確認してください。\",\"binaryIncompatible\":\"バイナリデータは使用できません。\",\"artifactIncompatible\":\"ファイルデータは使用できません。\",\"nullableIncompatible\":\"値が必要ですが、選択したフィールドは空になる可能性があります。\",\"typeIncompatible\":\"{{target}}が必要ですが、選択したフィールドは{{source}}です。\",\"propertyTypeIncompatible\":\"「{{path}}」は{{target}}である必要がありますが、実際は{{source}}です。\",\"requiredIncompatible\":\"必須プロパティ「{{property}}」がない可能性があります。\",\"enumIncompatible\":\"使用できない値が含まれる可能性があります:{{values}}。\",\"constIncompatible\":\"{{target}}のみ使用できますが、選択したフィールドは常に {{source}} です。\",\"constraintSubject\":\"「{{path}}」は\",\"minLength\":\"{{subject}}少なくとも {{value}} 文字必要です。\",\"maxLength\":\"{{subject}}最大 {{value}} 文字です。\",\"pattern\":\"{{subject}}{{value}} に一致する必要があります。\",\"minimum\":\"{{subject}}{{value}} 未満にできません。\",\"exclusiveMinimum\":\"{{subject}}{{value}} より大きい必要があります。\",\"maximum\":\"{{subject}}{{value}} を超えられません。\",\"exclusiveMaximum\":\"{{subject}}{{value}} より小さい必要があります。\",\"multipleOf\":\"{{subject}}{{value}} の倍数である必要があります。\",\"minItems\":\"{{subject}}少なくとも {{value}} 項必要です。\",\"maxItems\":\"{{subject}}最大 {{value}} 項です。\",\"minProperties\":\"{{subject}}少なくとも {{value}} 個のプロパティが必要です。\",\"maxProperties\":\"{{subject}}最大 {{value}} 個のプロパティです。\",\"integer\":\"整数\",\"unknownType\":\"不明な型\",\"typeSeparator\":\"または\"},\"actions\":{\"flowAccess\":\"利用可能なサービス\",\"flowAccessHint\":\"この Flow のすべての Code ノードで共有する接続を管理\",\"chooseConnection\":\"{{provider}} Connection を選択\",\"connectionDescription\":\"Connection はこの呼び出しに挿入されます。使用可否は引き続き Flow Provider Access によって制御されます。\",\"title\":\"このコードから呼び出せるアクション\",\"search\":\"Action を検索\",\"description\":\"このコードで使用する Action とアカウントを選択します。\",\"empty\":\"一致する Action はありません。\",\"remove\":\"削除\",\"default\":\"既定のアカウント\",\"defaultHint\":\"呼び出し時にアカウントを指定しない場合に使用します。\",\"removeAction\":\"アクションを削除\",\"explicit\":\"コード内で明示的に選択\",\"connect\":\"アカウントを接続\",\"refresh\":\"アカウントを更新\",\"aliases\":\"保存済みの別名を更新\",\"add\":\"アクションを追加\",\"cancel\":\"キャンセル\",\"loading\":\"検索中…\",\"needsAccount\":\"アカウントを接続\",\"accounts\":\"{{count}} アカウント\",\"public\":\"アカウント不要\",\"allowed\":\"使用するアカウント\",\"unavailable\":\"利用不可\",\"details\":\"接続の詳細\",\"example\":\"呼び出し例\",\"syntax\":\"呼び出し形式\",\"nested\":\"プロバイダー形式\",\"fullId\":\"完全な ID\",\"copy\":\"コピー\",\"copied\":\"コピー済み\",\"copyError\":\"コピーできませんでした。コードを選択して手動でコピーしてください。\",\"introDescription\":\"必要に応じてアクションを追加し、{{context}} から外部アプリを呼び出せます。\",\"insertAction\":\"コードを挿入\",\"chooseAccounts\":\"アカウントを管理\"},\"comment\":{\"markdown\":\"Markdown\",\"preview\":\"プレビュー\"},\"ports\":{\"reorder\":\"{{name}} の順序を変更\",\"reorderHint\":\"ドラッグでグループ内の順序を変更。フォーカス時は上下キーでも移動できます。\",\"moved\":\"{{name}} を {{position}} 番目に移動しました。\",\"groupSettings\":\"グループ設定\",\"connected\":\"接続済み\",\"sort\":\"並べ替え\",\"finishSorting\":\"並べ替えを完了\",\"inputsTitle\":\"入力\",\"noInputs\":\"このノードには入力データが必要ありません。\",\"noOutputs\":\"このノードは出力データを提供しません。\",\"outputsTitle\":\"出力\",\"valuesTitle\":\"値\",\"columnHandle\":\"Handle\",\"columnName\":\"名前\",\"columnType\":\"型\",\"columnValue\":\"値\",\"builtIn\":{\"cron\":{\"scheduledAt\":\"この実行をトリガーした予定時刻(ISO 8601 形式)です。\"},\"webhook\":{\"headers\":\"この Webhook リクエストで受信したリクエストヘッダーです。\",\"query\":\"この Webhook リクエストで受信した URL クエリパラメーターです。\",\"body\":\"この Webhook リクエストで受信したリクエストボディです。\",\"webhookUrl\":\"このリクエストを受信した Webhook URL(クエリパラメーターを除く)です。\"}}}}"),
14945
15181
  language: { "label": "言語" },
@@ -15000,7 +15236,9 @@ var resources$1 = {
15000
15236
  "networkFailed": "サービスに接続できません。ネットワーク接続を確認してから再試行してください。",
15001
15237
  "published": "{{name}} を公開しました。",
15002
15238
  "rolledBack": "本番をリビジョン {{revision}} にロールバックしました。",
15003
- "requestFailed": "サービスがこの操作を完了できませんでした。しばらくしてから再試行してください。"
15239
+ "requestFailed": "サービスがこの操作を完了できませんでした。しばらくしてから再試行してください。",
15240
+ "flowImported": "インポートしました。実行や公開の前に外部リソースを設定してください。",
15241
+ "exportSaveFailed": "下書きまたはレイアウトを保存できませんでした。保存後に再度エクスポートしてください。"
15004
15242
  },
15005
15243
  publication: {
15006
15244
  "active": "稼働中",
@@ -16175,7 +16413,10 @@ var resources$1 = {
16175
16413
  "enabledHint": "새 프로덕션 실행을 제어합니다. 초안 테스트는 계속 사용할 수 있습니다.",
16176
16414
  "publish": "게시",
16177
16415
  "publishUpdate": "업데이트",
16178
- "deleteDescription": "워크플로와 실행 기록을 삭제하고 프로덕션 트리거를 중지합니다. 이 작업은 되돌릴 수 없습니다."
16416
+ "deleteDescription": "워크플로와 실행 기록을 삭제하고 프로덕션 트리거를 중지합니다. 이 작업은 되돌릴 수 없습니다.",
16417
+ "importFlow": "워크플로 가져오기",
16418
+ "exportFlow": "워크플로 내보내기",
16419
+ "importInvalid": "잘못되었거나 지원하지 않는 워크플로 파일입니다."
16179
16420
  },
16180
16421
  inspector: {
16181
16422
  "outline": "노드 목록",
@@ -16440,7 +16681,9 @@ var resources$1 = {
16440
16681
  "networkFailed": "서비스에 연결할 수 없습니다. 네트워크 연결을 확인한 뒤 다시 시도하세요.",
16441
16682
  "published": "{{name}} 게시를 완료했습니다.",
16442
16683
  "rolledBack": "라이브를 리비전 {{revision}}(으)로 롤백했습니다.",
16443
- "requestFailed": "서비스에서 이 작업을 완료하지 못했습니다. 나중에 다시 시도하세요."
16684
+ "requestFailed": "서비스에서 이 작업을 완료하지 못했습니다. 나중에 다시 시도하세요.",
16685
+ "flowImported": "가져왔습니다. 실행하거나 게시하기 전에 외부 리소스를 설정하세요.",
16686
+ "exportSaveFailed": "초안 또는 레이아웃을 저장하지 못했습니다. 저장 후 다시 내보내세요."
16444
16687
  },
16445
16688
  publication: {
16446
16689
  "active": "활성",
@@ -17615,7 +17858,10 @@ var resources$1 = {
17615
17858
  "enabledHint": "Управляет новыми рабочими запусками. Тесты черновика остаются доступны.",
17616
17859
  "publish": "Опубликовать",
17617
17860
  "publishUpdate": "Обновить",
17618
- "deleteDescription": "Поток и история запусков будут удалены, рабочие триггеры остановлены. Это действие нельзя отменить."
17861
+ "deleteDescription": "Поток и история запусков будут удалены, рабочие триггеры остановлены. Это действие нельзя отменить.",
17862
+ "importFlow": "Импортировать процесс",
17863
+ "exportFlow": "Экспортировать процесс",
17864
+ "importInvalid": "Некорректный или неподдерживаемый файл процесса."
17619
17865
  },
17620
17866
  inspector: /* @__PURE__ */ JSON.parse("{\"outline\":\"Список узлов\",\"backToOutline\":\"Вернуться к списку узлов\",\"emptyOutline\":\"Узлов пока нет\",\"triggers\":\"Триггеры\",\"nodes\":\"Узлы\",\"multipleSelected\":\"Выбрано узлов: {{count}}\",\"account\":{\"contactAdmin\":\"У вас нет прав для выполнения этой операции. Обратитесь к администратору.\",\"accessTitle\":\"Права доступа\",\"manageFlowAccess\":\"Подключения, доступные Code\",\"configureAccess\":\"Выбрать аккаунт\",\"manageAccount\":\"Управление аккаунтами\",\"required\":\"Требуется подключение аккаунта\",\"addAccount\":\"Добавить аккаунт\",\"manage\":\"Управление\",\"authorizationPending\":\"Завершите авторизацию на странице Connection, затем вернитесь сюда, чтобы обновить этот аккаунт.\",\"chooseAccount\":\"Выберите аккаунт\",\"connectBeforeRun\":\"Подключите {{service}}, чтобы этот узел можно было запускать и публиковать.\",\"connectService\":\"Подключить {{service}}\",\"connection\":\"Connection\",\"loading\":\"Загрузка Connection…\",\"oomolBuiltIn\":\"Встроенный аккаунт OOMOL\",\"missing\":\"Выбранный для этого узла аккаунт недоступен. Выберите другой аккаунт или откройте управление подключениями.\",\"refreshFailed\":\"Не удалось обновить Connection.\",\"retry\":\"Повторить\",\"status\":{\"disconnected\":\"Этот Connection отключён. Подключите его заново или выберите другой аккаунт.\",\"error\":\"В этом Connection ошибка. Исправьте её или выберите другой аккаунт.\",\"reauth_required\":\"Этому Connection нужна повторная авторизация. Подключите его заново или выберите другой аккаунт.\"},\"statusUnavailable\":\"Статус Connection недоступен для {{action}}.\",\"teamDefault\":\"По умолчанию для команды\",\"title\":\"Аккаунт\",\"unavailable\":\"недоступно\"},\"close\":\"Закрыть инспектор\",\"configurationRequired\":\"Требуется настройка\",\"diagnostics\":\"Диагностика\",\"errors\":{\"jsonObject\":\"{{label}} должен быть JSON-объектом.\",\"portDefinitions\":\"Введите корректные определения портов.\"},\"node\":{\"nameDuplicate\":\"Узел с таким именем уже существует в этом графе.\",\"nameEmpty\":\"Имя узла не может быть пустым.\",\"timeout\":\"Время ожидания (мс)\",\"maxExecutions\":\"Лимит выполнений узла\",\"maxExecutionsError\":\"Лимит выполнений узла должен быть положительным целым числом.\",\"timeoutError\":\"Время ожидания должно быть положительным целым числом в миллисекундах.\",\"title\":\"Настройки узла\",\"description\":\"Назначение\",\"describe\":\"Опишите назначение этого шага.\",\"icon\":\"Значок\",\"name\":\"Заголовок\"},\"selectNode\":\"Выберите один узел черновика, чтобы просмотреть и изменить его.\",\"locateNode\":\"Найти этот узел на холсте\",\"task\":{\"sharedPermissions\":\"Использовать общую группу разрешений Flow\",\"sharedPermissionsHint\":\"Используйте все Actions, разрешённые общей группой Flow. Добавлять их в узел по отдельности не нужно.\",\"addAction\":\"Добавить Action\",\"removeAction\":\"Удалить Action\",\"actionAccount\":\"Аккаунт\",\"chooseAccount\":\"Выбрать аккаунт\",\"permissionSaveFailed\":\"Не удалось сохранить разрешения Code. Повторите попытку.\",\"chatText\":\"Текст чата\",\"connectorAction\":\"Действие Connector\",\"definition\":\"Определение задачи\",\"discardCode\":\"Отменить изменения\",\"editorLoading\":\"Загрузка редактора…\",\"editorUnavailable\":\"Не удалось загрузить редактор кода.\",\"inputPorts\":\"Входные порты\",\"javascriptModule\":\"Код\",\"missing\":\"Указанная задача не существует.\",\"outputPorts\":\"Выходные порты\",\"responseMode\":\"Режим ответа\",\"source\":\"Исходный код\",\"structuredJson\":\"Структурированный JSON\",\"retrySave\":\"Повторить сохранение\",\"additionalInputs\":\"Дополнительные входы\"},\"wait\":{\"approval\":\"Одобрить или отклонить\",\"changeNotification\":\"Изменить\",\"continue\":\"Продолжить\",\"mode\":\"Обработка\",\"inputsLoading\":\"Загрузка параметров уведомления…\",\"pendingDescription\":\"Выход ожидания срабатывает один раз при начале ожидания и передаёт ссылки подтверждения и связанные данные. Подключите его для отправки сообщения или выполнения других шагов.\",\"prompt\":\"Запрос\",\"promptError\":\"Запрос должен содержать от 1 до 1 000 символов.\"},\"title\":\"Инспектор\",\"sources\":{\"loading\":\"Загрузка источников входных данных…\",\"loadFailed\":\"Не удалось загрузить источники входных данных. Откройте меню ещё раз.\",\"checkFailed\":\"Не удалось проверить этот источник.\",\"select\":\"Выбрать источник входных данных\",\"title\":\"Источник входных данных\",\"sourceMissing\":\"Исходный источник входных данных больше не существует. Выберите другой.\",\"outputMissing\":\"«{{output}}» не найден в «{{source}}». Выберите снова.\",\"wholeObject\":\"Весь объект\",\"fieldMissing\":\"Поле {{field}} больше не объявлено в «{{output}}». Выберите снова.\",\"notReady\":\"К моменту выполнения этого шага у «{{source}} {{handle}}» может ещё не быть значения.\",\"sourceConflict\":\"Эти поля могут иметь значения одновременно: {{sources}}. Здесь можно использовать только одно.\",\"incompatibleRight\":\"Тип правого значения несовместим с этим сравнением.\",\"incompatible\":\"Несовместимо\",\"unverified\":\"Не проверено\",\"schemaIncompatible\":\"Формат данных не совпадает.\",\"schemaPathIncompatible\":\"Формат данных «{{path}}» не совпадает.\",\"schemaCompareFailed\":\"Не удалось проверить формат данных. Проверьте схему JSON.\",\"binaryIncompatible\":\"Двоичные данные здесь использовать нельзя.\",\"artifactIncompatible\":\"Файловые данные здесь использовать нельзя.\",\"nullableIncompatible\":\"Требуется значение, но выбранное поле может быть пустым.\",\"typeIncompatible\":\"Ожидается {{target}}, но выбранное поле имеет тип {{source}}.\",\"propertyTypeIncompatible\":\"«{{path}}» должно иметь тип {{target}}, но имеет тип {{source}}.\",\"requiredIncompatible\":\"Обязательное свойство «{{property}}» может отсутствовать.\",\"enumIncompatible\":\"Некоторые возможные значения не принимаются: {{values}}.\",\"constIncompatible\":\"Принимается только {{target}}, но выбранное поле всегда равно {{source}}.\",\"constraintSubject\":\"«{{path}}» \",\"minLength\":\"{{subject}}должно содержать не менее {{value}} символов.\",\"maxLength\":\"{{subject}}должно содержать не более {{value}} символов.\",\"pattern\":\"{{subject}}должно соответствовать {{value}}.\",\"minimum\":\"{{subject}}не может быть меньше {{value}}.\",\"exclusiveMinimum\":\"{{subject}}должно быть больше {{value}}.\",\"maximum\":\"{{subject}}не может быть больше {{value}}.\",\"exclusiveMaximum\":\"{{subject}}должно быть меньше {{value}}.\",\"multipleOf\":\"{{subject}}должно быть кратно {{value}}.\",\"minItems\":\"{{subject}}должно содержать не менее {{value}} элементов.\",\"maxItems\":\"{{subject}}должно содержать не более {{value}} элементов.\",\"minProperties\":\"{{subject}}должно содержать не менее {{value}} свойств.\",\"maxProperties\":\"{{subject}}должно содержать не более {{value}} свойств.\",\"integer\":\"Целое число\",\"unknownType\":\"неизвестный тип\",\"typeSeparator\":\" или \"},\"actions\":{\"flowAccess\":\"Доступные сервисы\",\"flowAccessHint\":\"Управлять подключениями, общими для всех узлов Code в этом Flow\",\"chooseConnection\":\"Выбрать подключение {{provider}}\",\"connectionDescription\":\"Подключение будет вставлено в этот вызов. Возможность его использования по-прежнему контролирует Flow Provider Access.\",\"title\":\"Действия, доступные коду\",\"search\":\"Поиск действий\",\"description\":\"Выберите действия и аккаунты, доступные этому коду.\",\"empty\":\"Подходящих действий нет.\",\"remove\":\"Удалить\",\"default\":\"Аккаунт по умолчанию\",\"defaultHint\":\"Используется, если при вызове не указан аккаунт.\",\"removeAction\":\"Удалить действие\",\"explicit\":\"Выбирать явно в коде\",\"connect\":\"Подключить аккаунт\",\"refresh\":\"Обновить аккаунты\",\"aliases\":\"Обновить сохранённые псевдонимы\",\"add\":\"Добавить действие\",\"cancel\":\"Отмена\",\"loading\":\"Поиск…\",\"needsAccount\":\"Подключите аккаунт\",\"accounts\":\"Аккаунты: {{count}}\",\"public\":\"Без аккаунта\",\"allowed\":\"Разрешённые аккаунты\",\"unavailable\":\"Недоступен\",\"details\":\"Данные подключений\",\"example\":\"Пример вызова\",\"syntax\":\"Синтаксис вызова\",\"nested\":\"Через провайдера\",\"fullId\":\"Полный ID\",\"copy\":\"Копировать\",\"copied\":\"Скопировано\",\"copyError\":\"Не удалось скопировать. Выделите код и скопируйте вручную.\",\"introDescription\":\"При необходимости добавьте действия для вызова внешних приложений через {{context}}.\",\"insertAction\":\"Вставить код\",\"chooseAccounts\":\"Управление аккаунтами\"},\"comment\":{\"markdown\":\"Markdown\",\"preview\":\"Предпросмотр\"},\"ports\":{\"reorder\":\"Изменить порядок {{name}}\",\"reorderHint\":\"Перетащите внутри группы или используйте стрелки вверх / вниз при фокусе.\",\"moved\":\"{{name}} перемещён на позицию {{position}}.\",\"groupSettings\":\"Настройки группы\",\"connected\":\"Подключено\",\"sort\":\"Изменить порядок\",\"finishSorting\":\"Готово\",\"inputsTitle\":\"Входы\",\"noInputs\":\"Этому узлу не требуются входные данные.\",\"noOutputs\":\"Этот узел не предоставляет выходных данных.\",\"outputsTitle\":\"Выходы\",\"valuesTitle\":\"Значения\",\"columnHandle\":\"Handle\",\"columnName\":\"Имя\",\"columnType\":\"Тип\",\"columnValue\":\"Значение\",\"builtIn\":{\"cron\":{\"scheduledAt\":\"Запланированное время этого запуска в формате ISO 8601.\"},\"webhook\":{\"headers\":\"Заголовки, полученные с этим Webhook-запросом.\",\"query\":\"Параметры URL-запроса, полученные с этим Webhook-запросом.\",\"body\":\"Тело, полученное с этим Webhook-запросом.\",\"webhookUrl\":\"URL Webhook, получивший этот запрос, без параметров запроса.\"}}}}"),
17621
17867
  language: { "label": "Язык" },
@@ -17676,7 +17922,9 @@ var resources$1 = {
17676
17922
  "networkFailed": "Не удалось подключиться к сервису. Проверьте сетевое соединение и повторите попытку.",
17677
17923
  "published": "Опубликовано: {{name}}.",
17678
17924
  "rolledBack": "Рабочая версия откачена к ревизии {{revision}}.",
17679
- "requestFailed": "Сервис не смог выполнить эту операцию. Повторите попытку позже."
17925
+ "requestFailed": "Сервис не смог выполнить эту операцию. Повторите попытку позже.",
17926
+ "flowImported": "Процесс импортирован. Настройте внешние ресурсы перед запуском или публикацией.",
17927
+ "exportSaveFailed": "Экспорт остановлен: не удалось сохранить черновик или расположение. Сохраните изменения и повторите попытку."
17680
17928
  },
17681
17929
  publication: {
17682
17930
  "active": "Активно",
@@ -18710,7 +18958,10 @@ var resources$1 = {
18710
18958
  "enabledHint": "Contrôle les nouvelles exécutions en production. Les tests du brouillon restent disponibles.",
18711
18959
  "publish": "Publier",
18712
18960
  "publishUpdate": "Mettre à jour",
18713
- "deleteDescription": "Le flux et son historique seront supprimés et les déclencheurs arrêtés. Cette action est irréversible."
18961
+ "deleteDescription": "Le flux et son historique seront supprimés et les déclencheurs arrêtés. Cette action est irréversible.",
18962
+ "importFlow": "Importer un workflow",
18963
+ "exportFlow": "Exporter le workflow",
18964
+ "importInvalid": "Fichier de workflow invalide ou non pris en charge."
18714
18965
  },
18715
18966
  inspector: {
18716
18967
  "outline": "Liste des nœuds",
@@ -18975,7 +19226,9 @@ var resources$1 = {
18975
19226
  "networkFailed": "Impossible de joindre le service. Vérifiez votre connexion, puis réessayez.",
18976
19227
  "published": "{{name}} publié.",
18977
19228
  "rolledBack": "Version en ligne restaurée à la révision {{revision}}.",
18978
- "requestFailed": "Le service n’a pas pu terminer cette opération. Réessayez plus tard."
19229
+ "requestFailed": "Le service n’a pas pu terminer cette opération. Réessayez plus tard.",
19230
+ "flowImported": "Workflow importé. Configurez les ressources externes avant de lancer ou publier.",
19231
+ "exportSaveFailed": "Export arrêté : le brouillon ou la disposition n’a pas pu être enregistré. Réessayez après avoir enregistré."
18979
19232
  },
18980
19233
  publication: {
18981
19234
  "active": "Actif",
@@ -26568,6 +26821,20 @@ function IdTooltip(props) {
26568
26821
  });
26569
26822
  }
26570
26823
  //#endregion
26824
+ //#region src/workbench/browser/runtime/shell/workflowExportMenuItem.tsx
26825
+ function WorkflowExportMenuItem({ disabled, onClick, className }) {
26826
+ const t = useTranslate();
26827
+ return /* @__PURE__ */ jsxs(DropdownMenuItem, {
26828
+ disabled,
26829
+ onClick,
26830
+ className,
26831
+ children: [/* @__PURE__ */ jsx("i", {
26832
+ "aria-hidden": "true",
26833
+ className: "i-lucide-light:download size-4 shrink-0"
26834
+ }), t("resource.exportFlow")]
26835
+ });
26836
+ }
26837
+ //#endregion
26571
26838
  //#region src/flow/common/nodeChanges.ts
26572
26839
  var codeTaskTemplate = `export default async function (inputs, context) {
26573
26840
  return { result: inputs.value }
@@ -27526,43 +27793,6 @@ var Latest = class {
27526
27793
  }
27527
27794
  };
27528
27795
  //#endregion
27529
- //#region src/flow/common/connectionUsage.ts
27530
- function connectionUsage(document) {
27531
- const uses = [];
27532
- for (const [nodeId, node] of Object.entries(document.graph.nodes)) {
27533
- const task = node.kind == "task" && "executor" in node.task ? node.task : void 0;
27534
- const name = node.name ?? task?.name ?? nodeId;
27535
- const add = (kind, actionId, connectionId) => {
27536
- uses.push({
27537
- kind,
27538
- providerId: actionId.split(".")[0],
27539
- actionId,
27540
- connectionId,
27541
- nodeId,
27542
- name
27543
- });
27544
- };
27545
- if (node.kind == "poll" || node.kind == "integration") uses.push({
27546
- kind: "trigger",
27547
- triggerId: node.definition.key,
27548
- providerId: node.definition.provider,
27549
- connectionId: node.connectionId,
27550
- nodeId,
27551
- name
27552
- });
27553
- if (task?.executor.kind == "connector") add("connector", task.executor.action, task.executor.connectionId);
27554
- if (node.kind == "task" && "moduleId" in node.task) {
27555
- for (const capability of node.task.capabilities ?? []) if ("mode" in capability && capability.mode == "independent") for (const action of capability.actions) add("code", action.action, action.connectionId);
27556
- }
27557
- if (task?.executor.kind == "agent") {
27558
- for (const tool of task.executor.tools) add("agent", tool.action, tool.connectionId);
27559
- const notification = task.executor.notification;
27560
- if (notification != null) add("notification", notification.action, notification.connectionId);
27561
- }
27562
- }
27563
- return uses;
27564
- }
27565
- //#endregion
27566
27796
  //#region src/flow/common/promptTemplate.ts
27567
27797
  var promptReferencePattern = /\{\{\s*([^{}\s]+)\s*\}\}/g;
27568
27798
  function renamePromptInput(template, before, after) {
@@ -27732,7 +27962,7 @@ function variableBindings(revision, bindingIds) {
27732
27962
  }
27733
27963
  function flowResourceReferences(content) {
27734
27964
  const connections = /* @__PURE__ */ new Map();
27735
- for (const use of connectionUsage(content.document)) {
27965
+ for (const use of connectionUsage$7(content.document)) {
27736
27966
  if (use.connectionId == null) continue;
27737
27967
  connections.set(JSON.stringify([use.providerId, use.connectionId]), {
27738
27968
  providerId: use.providerId,
@@ -27976,7 +28206,7 @@ function revisionView(revision) {
27976
28206
  }
27977
28207
  function connectorAccessReferences(document) {
27978
28208
  return {
27979
- accounts: [...new Map(connectionUsage(document).map((use) => [JSON.stringify([
28209
+ accounts: [...new Map(connectionUsage$7(document).map((use) => [JSON.stringify([
27980
28210
  use.nodeId,
27981
28211
  use.kind,
27982
28212
  use.providerId,
@@ -28517,18 +28747,18 @@ var RunStore = class {
28517
28747
  //#region \0virtual:oomol-provider-icons
28518
28748
  var spriteCatalog = {
28519
28749
  "iconSprite": {
28520
- "version": "8ea143c870865b9d01ef4a921f01e711fa37e575648a97baf41bf53705f72f81",
28750
+ "version": "fc73797317d203337fb05a8ccc50220a78ead444f276bc60c80412f87eef9a80",
28521
28751
  "pixelRatio": 2,
28522
28752
  "iconSize": 48,
28523
28753
  "bleed": 1,
28524
28754
  "width": 2050,
28525
28755
  "height": 2e3,
28526
- "lightUrl": "https://static.oomol.com/logo/provider-sprites/8ea143c870865b9d01ef4a921f01e711fa37e575648a97baf41bf53705f72f81/light.png",
28527
- "darkUrl": "https://static.oomol.com/logo/provider-sprites/8ea143c870865b9d01ef4a921f01e711fa37e575648a97baf41bf53705f72f81/dark.png"
28756
+ "lightUrl": "https://static.oomol.com/logo/provider-sprites/fc73797317d203337fb05a8ccc50220a78ead444f276bc60c80412f87eef9a80/light.png",
28757
+ "darkUrl": "https://static.oomol.com/logo/provider-sprites/fc73797317d203337fb05a8ccc50220a78ead444f276bc60c80412f87eef9a80/dark.png"
28528
28758
  },
28529
28759
  "positions": {
28530
28760
  "solarwinds_service_desk": {
28531
- "x": 51,
28761
+ "x": 1,
28532
28762
  "y": 1601
28533
28763
  },
28534
28764
  "finlight": {
@@ -28540,7 +28770,7 @@ var spriteCatalog = {
28540
28770
  "y": 851
28541
28771
  },
28542
28772
  "viral_loops": {
28543
- "x": 1451,
28773
+ "x": 1401,
28544
28774
  "y": 1801
28545
28775
  },
28546
28776
  "greip": {
@@ -28552,11 +28782,11 @@ var spriteCatalog = {
28552
28782
  "y": 51
28553
28783
  },
28554
28784
  "unirateapi": {
28555
- "x": 1801,
28785
+ "x": 1751,
28556
28786
  "y": 1751
28557
28787
  },
28558
28788
  "thesportsdb": {
28559
- "x": 651,
28789
+ "x": 601,
28560
28790
  "y": 1701
28561
28791
  },
28562
28792
  "17track": {
@@ -28792,7 +29022,7 @@ var spriteCatalog = {
28792
29022
  "y": 51
28793
29023
  },
28794
29024
  "voicemaker": {
28795
- "x": 1651,
29025
+ "x": 1601,
28796
29026
  "y": 1801
28797
29027
  },
28798
29028
  "aircall": {
@@ -29052,7 +29282,7 @@ var spriteCatalog = {
29052
29282
  "y": 551
29053
29283
  },
29054
29284
  "xydc_mcp": {
29055
- "x": 1251,
29285
+ "x": 1201,
29056
29286
  "y": 1901
29057
29287
  },
29058
29288
  "sellersprite_mcp": {
@@ -29060,11 +29290,11 @@ var spriteCatalog = {
29060
29290
  "y": 1501
29061
29291
  },
29062
29292
  "slickdeals": {
29063
- "x": 1301,
29293
+ "x": 1251,
29064
29294
  "y": 1551
29065
29295
  },
29066
29296
  "sif": {
29067
- "x": 351,
29297
+ "x": 301,
29068
29298
  "y": 1551
29069
29299
  },
29070
29300
  "ixspy": {
@@ -29072,11 +29302,11 @@ var spriteCatalog = {
29072
29302
  "y": 851
29073
29303
  },
29074
29304
  "sorftime": {
29075
- "x": 201,
29305
+ "x": 151,
29076
29306
  "y": 1601
29077
29307
  },
29078
29308
  "sorftime_mcp": {
29079
- "x": 251,
29309
+ "x": 201,
29080
29310
  "y": 1601
29081
29311
  },
29082
29312
  "sage_hr": {
@@ -29164,11 +29394,11 @@ var spriteCatalog = {
29164
29394
  "y": 501
29165
29395
  },
29166
29396
  "thehive": {
29167
- "x": 501,
29397
+ "x": 451,
29168
29398
  "y": 1701
29169
29399
  },
29170
29400
  "thehive5": {
29171
- "x": 551,
29401
+ "x": 501,
29172
29402
  "y": 1701
29173
29403
  },
29174
29404
  "eraser": {
@@ -29432,11 +29662,11 @@ var spriteCatalog = {
29432
29662
  "y": 901
29433
29663
  },
29434
29664
  "waitwhile": {
29435
- "x": 2001,
29665
+ "x": 1951,
29436
29666
  "y": 1801
29437
29667
  },
29438
29668
  "workpath": {
29439
- "x": 551,
29669
+ "x": 501,
29440
29670
  "y": 1901
29441
29671
  },
29442
29672
  "apiverve": {
@@ -29532,15 +29762,15 @@ var spriteCatalog = {
29532
29762
  "y": 1501
29533
29763
  },
29534
29764
  "smartsheet": {
29535
- "x": 1601,
29765
+ "x": 1551,
29536
29766
  "y": 1551
29537
29767
  },
29538
29768
  "smartrecruiters": {
29539
- "x": 1551,
29769
+ "x": 1501,
29540
29770
  "y": 1551
29541
29771
  },
29542
29772
  "smartlead_ai": {
29543
- "x": 1501,
29773
+ "x": 1451,
29544
29774
  "y": 1551
29545
29775
  },
29546
29776
  "shipengine": {
@@ -29552,11 +29782,11 @@ var spriteCatalog = {
29552
29782
  "y": 1151
29553
29783
  },
29554
29784
  "shotstack": {
29555
- "x": 301,
29785
+ "x": 251,
29556
29786
  "y": 1551
29557
29787
  },
29558
29788
  "skyvern": {
29559
- "x": 1101,
29789
+ "x": 1051,
29560
29790
  "y": 1551
29561
29791
  },
29562
29792
  "shopify": {
@@ -29567,18 +29797,14 @@ var spriteCatalog = {
29567
29797
  "x": 1851,
29568
29798
  "y": 1501
29569
29799
  },
29570
- "shopify_admin": {
29800
+ "shopify_partner": {
29571
29801
  "x": 1951,
29572
29802
  "y": 1501
29573
29803
  },
29574
- "shopify_partner": {
29804
+ "shopify_storefront": {
29575
29805
  "x": 2001,
29576
29806
  "y": 1501
29577
29807
  },
29578
- "shopify_storefront": {
29579
- "x": 1,
29580
- "y": 1551
29581
- },
29582
29808
  "shippo": {
29583
29809
  "x": 1751,
29584
29810
  "y": 1501
@@ -29648,7 +29874,7 @@ var spriteCatalog = {
29648
29874
  "y": 1051
29649
29875
  },
29650
29876
  "wbiztool": {
29651
- "x": 501,
29877
+ "x": 451,
29652
29878
  "y": 1851
29653
29879
  },
29654
29880
  "calendarific": {
@@ -29664,7 +29890,7 @@ var spriteCatalog = {
29664
29890
  "y": 551
29665
29891
  },
29666
29892
  "zyhub": {
29667
- "x": 801,
29893
+ "x": 751,
29668
29894
  "y": 1951
29669
29895
  },
29670
29896
  "benchmarkone": {
@@ -29720,7 +29946,7 @@ var spriteCatalog = {
29720
29946
  "y": 351
29721
29947
  },
29722
29948
  "surveymethods": {
29723
- "x": 501,
29949
+ "x": 451,
29724
29950
  "y": 1651
29725
29951
  },
29726
29952
  "countly": {
@@ -29748,8 +29974,8 @@ var spriteCatalog = {
29748
29974
  "y": 351
29749
29975
  },
29750
29976
  "waiverfile": {
29751
- "x": 1,
29752
- "y": 1851
29977
+ "x": 2001,
29978
+ "y": 1801
29753
29979
  },
29754
29980
  "northbeam": {
29755
29981
  "x": 551,
@@ -29908,7 +30134,7 @@ var spriteCatalog = {
29908
30134
  "y": 1151
29909
30135
  },
29910
30136
  "wordpress": {
29911
- "x": 251,
30137
+ "x": 201,
29912
30138
  "y": 1901
29913
30139
  },
29914
30140
  "onlyoffice_docspace": {
@@ -29992,7 +30218,7 @@ var spriteCatalog = {
29992
30218
  "y": 251
29993
30219
  },
29994
30220
  "sslmate_cert_spotter_api": {
29995
- "x": 701,
30221
+ "x": 651,
29996
30222
  "y": 1601
29997
30223
  },
29998
30224
  "issue_badge": {
@@ -31108,7 +31334,7 @@ var spriteCatalog = {
31108
31334
  "y": 601
31109
31335
  },
31110
31336
  "square": {
31111
- "x": 651,
31337
+ "x": 601,
31112
31338
  "y": 1601
31113
31339
  },
31114
31340
  "moonclerk": {
@@ -31352,7 +31578,7 @@ var spriteCatalog = {
31352
31578
  "y": 651
31353
31579
  },
31354
31580
  "wandb": {
31355
- "x": 251,
31581
+ "x": 201,
31356
31582
  "y": 1851
31357
31583
  },
31358
31584
  "gitee": {
@@ -31452,7 +31678,7 @@ var spriteCatalog = {
31452
31678
  "y": 701
31453
31679
  },
31454
31680
  "youtube": {
31455
- "x": 1601,
31681
+ "x": 1551,
31456
31682
  "y": 1901
31457
31683
  },
31458
31684
  "groqcloud": {
@@ -31464,11 +31690,11 @@ var spriteCatalog = {
31464
31690
  "y": 701
31465
31691
  },
31466
31692
  "x_ai": {
31467
- "x": 1001,
31693
+ "x": 951,
31468
31694
  "y": 1901
31469
31695
  },
31470
31696
  "xata": {
31471
- "x": 1051,
31697
+ "x": 1001,
31472
31698
  "y": 1901
31473
31699
  },
31474
31700
  "quickbooks": {
@@ -31476,15 +31702,15 @@ var spriteCatalog = {
31476
31702
  "y": 1351
31477
31703
  },
31478
31704
  "xero": {
31479
- "x": 1101,
31705
+ "x": 1051,
31480
31706
  "y": 1901
31481
31707
  },
31482
31708
  "xingpan": {
31483
- "x": 1201,
31709
+ "x": 1151,
31484
31710
  "y": 1901
31485
31711
  },
31486
31712
  "xiaohongshu_store": {
31487
- "x": 1151,
31713
+ "x": 1101,
31488
31714
  "y": 1901
31489
31715
  },
31490
31716
  "oura": {
@@ -31680,7 +31906,7 @@ var spriteCatalog = {
31680
31906
  "y": 801
31681
31907
  },
31682
31908
  "tomba": {
31683
- "x": 2001,
31909
+ "x": 1951,
31684
31910
  "y": 1701
31685
31911
  },
31686
31912
  "hubspot": {
@@ -31816,7 +32042,7 @@ var spriteCatalog = {
31816
32042
  "y": 851
31817
32043
  },
31818
32044
  "typesafe_ai": {
31819
- "x": 1501,
32045
+ "x": 1451,
31820
32046
  "y": 1751
31821
32047
  },
31822
32048
  "jira": {
@@ -31844,7 +32070,7 @@ var spriteCatalog = {
31844
32070
  "y": 851
31845
32071
  },
31846
32072
  "zipcodebase": {
31847
- "x": 501,
32073
+ "x": 451,
31848
32074
  "y": 1951
31849
32075
  },
31850
32076
  "ipqualityscore": {
@@ -32552,7 +32778,7 @@ var spriteCatalog = {
32552
32778
  "y": 1051
32553
32779
  },
32554
32780
  "supermemory": {
32555
- "x": 251,
32781
+ "x": 201,
32556
32782
  "y": 1651
32557
32783
  },
32558
32784
  "memberstack": {
@@ -32752,11 +32978,11 @@ var spriteCatalog = {
32752
32978
  "y": 1151
32753
32979
  },
32754
32980
  "signwell": {
32755
- "x": 551,
32981
+ "x": 501,
32756
32982
  "y": 1551
32757
32983
  },
32758
32984
  "signaturely": {
32759
- "x": 451,
32985
+ "x": 401,
32760
32986
  "y": 1551
32761
32987
  },
32762
32988
  "opencage": {
@@ -33032,7 +33258,7 @@ var spriteCatalog = {
33032
33258
  "y": 1351
33033
33259
  },
33034
33260
  "signalbase": {
33035
- "x": 401,
33261
+ "x": 351,
33036
33262
  "y": 1551
33037
33263
  },
33038
33264
  "pingbell": {
@@ -33104,7 +33330,7 @@ var spriteCatalog = {
33104
33330
  "y": 1301
33105
33331
  },
33106
33332
  "umami": {
33107
- "x": 1601,
33333
+ "x": 1551,
33108
33334
  "y": 1751
33109
33335
  },
33110
33336
  "pdf_api_io": {
@@ -33500,7 +33726,7 @@ var spriteCatalog = {
33500
33726
  "y": 1451
33501
33727
  },
33502
33728
  "spider": {
33503
- "x": 451,
33729
+ "x": 401,
33504
33730
  "y": 1601
33505
33731
  },
33506
33732
  "scraperapi": {
@@ -33524,8 +33750,8 @@ var spriteCatalog = {
33524
33750
  "y": 1451
33525
33751
  },
33526
33752
  "zenscrape": {
33527
- "x": 1,
33528
- "y": 1951
33753
+ "x": 2001,
33754
+ "y": 1901
33529
33755
  },
33530
33756
  "search_api": {
33531
33757
  "x": 51,
@@ -33544,11 +33770,11 @@ var spriteCatalog = {
33544
33770
  "y": 1451
33545
33771
  },
33546
33772
  "the_colony": {
33547
- "x": 251,
33773
+ "x": 201,
33548
33774
  "y": 1701
33549
33775
  },
33550
33776
  "the_official_board": {
33551
- "x": 401,
33777
+ "x": 351,
33552
33778
  "y": 1701
33553
33779
  },
33554
33780
  "semantic_scholar": {
@@ -33564,7 +33790,7 @@ var spriteCatalog = {
33564
33790
  "y": 1501
33565
33791
  },
33566
33792
  "spyfu": {
33567
- "x": 601,
33793
+ "x": 551,
33568
33794
  "y": 1601
33569
33795
  },
33570
33796
  "serpdog": {
@@ -33588,11 +33814,11 @@ var spriteCatalog = {
33588
33814
  "y": 1501
33589
33815
  },
33590
33816
  "shortpixel": {
33591
- "x": 251,
33817
+ "x": 201,
33592
33818
  "y": 1551
33593
33819
  },
33594
33820
  "signpath": {
33595
- "x": 501,
33821
+ "x": 451,
33596
33822
  "y": 1551
33597
33823
  },
33598
33824
  "sendbird": {
@@ -33648,16 +33874,16 @@ var spriteCatalog = {
33648
33874
  "y": 1501
33649
33875
  },
33650
33876
  "sitespeakai": {
33651
- "x": 951,
33877
+ "x": 901,
33652
33878
  "y": 1551
33653
33879
  },
33654
33880
  "speak_ai": {
33655
- "x": 301,
33881
+ "x": 251,
33656
33882
  "y": 1601
33657
33883
  },
33658
33884
  "softr": {
33659
- "x": 1,
33660
- "y": 1601
33885
+ "x": 2001,
33886
+ "y": 1551
33661
33887
  },
33662
33888
  "planly": {
33663
33889
  "x": 701,
@@ -33684,11 +33910,11 @@ var spriteCatalog = {
33684
33910
  "y": 1451
33685
33911
  },
33686
33912
  "smartsuite": {
33687
- "x": 1651,
33913
+ "x": 1601,
33688
33914
  "y": 1551
33689
33915
  },
33690
33916
  "sportsdata": {
33691
- "x": 551,
33917
+ "x": 501,
33692
33918
  "y": 1601
33693
33919
  },
33694
33920
  "ringg_ai": {
@@ -33704,7 +33930,7 @@ var spriteCatalog = {
33704
33930
  "y": 1401
33705
33931
  },
33706
33932
  "workiz": {
33707
- "x": 451,
33933
+ "x": 401,
33708
33934
  "y": 1901
33709
33935
  },
33710
33936
  "salesflare": {
@@ -33728,87 +33954,87 @@ var spriteCatalog = {
33728
33954
  "y": 1501
33729
33955
  },
33730
33956
  "supportbee": {
33731
- "x": 351,
33957
+ "x": 301,
33732
33958
  "y": 1651
33733
33959
  },
33734
33960
  "similarweb_digitalrank_api": {
33735
- "x": 601,
33961
+ "x": 551,
33736
33962
  "y": 1551
33737
33963
  },
33738
33964
  "simla": {
33739
- "x": 651,
33965
+ "x": 601,
33740
33966
  "y": 1551
33741
33967
  },
33742
33968
  "simplybook_me": {
33743
- "x": 901,
33969
+ "x": 851,
33744
33970
  "y": 1551
33745
33971
  },
33746
33972
  "short_io": {
33747
- "x": 51,
33973
+ "x": 1,
33748
33974
  "y": 1551
33749
33975
  },
33750
33976
  "shorten_rest": {
33751
- "x": 201,
33977
+ "x": 151,
33752
33978
  "y": 1551
33753
33979
  },
33754
33980
  "shortcut": {
33755
- "x": 151,
33981
+ "x": 101,
33756
33982
  "y": 1551
33757
33983
  },
33758
33984
  "short_menu": {
33759
- "x": 101,
33985
+ "x": 51,
33760
33986
  "y": 1551
33761
33987
  },
33762
33988
  "simple_analytics": {
33763
- "x": 701,
33989
+ "x": 651,
33764
33990
  "y": 1551
33765
33991
  },
33766
33992
  "simplelocalize": {
33767
- "x": 751,
33993
+ "x": 701,
33768
33994
  "y": 1551
33769
33995
  },
33770
33996
  "simplesat": {
33771
- "x": 801,
33997
+ "x": 751,
33772
33998
  "y": 1551
33773
33999
  },
33774
34000
  "slack": {
33775
- "x": 1201,
34001
+ "x": 1151,
33776
34002
  "y": 1551
33777
34003
  },
33778
34004
  "slackbot": {
33779
- "x": 1251,
34005
+ "x": 1201,
33780
34006
  "y": 1551
33781
34007
  },
33782
34008
  "slab": {
33783
- "x": 1151,
34009
+ "x": 1101,
33784
34010
  "y": 1551
33785
34011
  },
33786
34012
  "slicktext": {
33787
- "x": 1351,
34013
+ "x": 1301,
33788
34014
  "y": 1551
33789
34015
  },
33790
34016
  "sling": {
33791
- "x": 1401,
34017
+ "x": 1351,
33792
34018
  "y": 1551
33793
34019
  },
33794
34020
  "splunk_http_event_collector": {
33795
- "x": 501,
34021
+ "x": 451,
33796
34022
  "y": 1601
33797
34023
  },
33798
34024
  "snipe_it": {
33799
- "x": 1901,
34025
+ "x": 1851,
33800
34026
  "y": 1551
33801
34027
  },
33802
34028
  "snipcart": {
33803
- "x": 1851,
34029
+ "x": 1801,
33804
34030
  "y": 1551
33805
34031
  },
33806
34032
  "snyk": {
33807
- "x": 1951,
34033
+ "x": 1901,
33808
34034
  "y": 1551
33809
34035
  },
33810
34036
  "slite": {
33811
- "x": 1451,
34037
+ "x": 1401,
33812
34038
  "y": 1551
33813
34039
  },
33814
34040
  "picky_assist": {
@@ -33816,195 +34042,195 @@ var spriteCatalog = {
33816
34042
  "y": 1251
33817
34043
  },
33818
34044
  "sms_alert": {
33819
- "x": 1701,
34045
+ "x": 1651,
33820
34046
  "y": 1551
33821
34047
  },
33822
34048
  "smtp2go": {
33823
- "x": 1751,
34049
+ "x": 1701,
33824
34050
  "y": 1551
33825
34051
  },
33826
34052
  "smugmug": {
33827
- "x": 1801,
34053
+ "x": 1751,
33828
34054
  "y": 1551
33829
34055
  },
33830
34056
  "solcast": {
33831
- "x": 101,
34057
+ "x": 51,
33832
34058
  "y": 1601
33833
34059
  },
33834
34060
  "sonarcloud": {
33835
- "x": 151,
34061
+ "x": 101,
33836
34062
  "y": 1601
33837
34063
  },
33838
34064
  "social_fetch": {
33839
- "x": 2001,
34065
+ "x": 1951,
33840
34066
  "y": 1551
33841
34067
  },
33842
34068
  "stannp": {
33843
- "x": 901,
34069
+ "x": 851,
33844
34070
  "y": 1601
33845
34071
  },
33846
34072
  "stealthgpt": {
33847
- "x": 1351,
34073
+ "x": 1301,
33848
34074
  "y": 1601
33849
34075
  },
33850
34076
  "speechmatics": {
33851
- "x": 351,
34077
+ "x": 301,
33852
34078
  "y": 1601
33853
34079
  },
33854
34080
  "statista": {
33855
- "x": 1051,
34081
+ "x": 1001,
33856
34082
  "y": 1601
33857
34083
  },
33858
34084
  "statamic": {
33859
- "x": 1001,
34085
+ "x": 951,
33860
34086
  "y": 1601
33861
34087
  },
33862
34088
  "statsig": {
33863
- "x": 1101,
34089
+ "x": 1051,
33864
34090
  "y": 1601
33865
34091
  },
33866
34092
  "statuscake": {
33867
- "x": 1151,
34093
+ "x": 1101,
33868
34094
  "y": 1601
33869
34095
  },
33870
34096
  "statuspage": {
33871
- "x": 1201,
34097
+ "x": 1151,
33872
34098
  "y": 1601
33873
34099
  },
33874
34100
  "statuspal": {
33875
- "x": 1251,
34101
+ "x": 1201,
33876
34102
  "y": 1601
33877
34103
  },
33878
34104
  "stay_ai": {
33879
- "x": 1301,
34105
+ "x": 1251,
33880
34106
  "y": 1601
33881
34107
  },
33882
34108
  "store_leads": {
33883
- "x": 1401,
34109
+ "x": 1351,
33884
34110
  "y": 1601
33885
34111
  },
33886
34112
  "storecensus": {
33887
- "x": 1451,
34113
+ "x": 1401,
33888
34114
  "y": 1601
33889
34115
  },
33890
34116
  "stormboard": {
33891
- "x": 1501,
34117
+ "x": 1451,
33892
34118
  "y": 1601
33893
34119
  },
33894
34120
  "storyblok": {
33895
- "x": 1601,
34121
+ "x": 1551,
33896
34122
  "y": 1601
33897
34123
  },
33898
34124
  "stripe": {
33899
- "x": 1851,
34125
+ "x": 1801,
33900
34126
  "y": 1601
33901
34127
  },
33902
34128
  "streak": {
33903
- "x": 1701,
34129
+ "x": 1651,
33904
34130
  "y": 1601
33905
34131
  },
33906
34132
  "stabilityai": {
33907
- "x": 751,
34133
+ "x": 701,
33908
34134
  "y": 1601
33909
34135
  },
33910
34136
  "subvisory": {
33911
- "x": 1901,
34137
+ "x": 1851,
33912
34138
  "y": 1601
33913
34139
  },
33914
34140
  "supervisely": {
33915
- "x": 301,
34141
+ "x": 251,
33916
34142
  "y": 1651
33917
34143
  },
33918
34144
  "starton": {
33919
- "x": 951,
34145
+ "x": 901,
33920
34146
  "y": 1601
33921
34147
  },
33922
34148
  "stormglass_io": {
33923
- "x": 1551,
34149
+ "x": 1501,
33924
34150
  "y": 1601
33925
34151
  },
33926
34152
  "stream_estate": {
33927
- "x": 1751,
34153
+ "x": 1701,
33928
34154
  "y": 1601
33929
34155
  },
33930
34156
  "streamtime": {
33931
- "x": 1801,
34157
+ "x": 1751,
33932
34158
  "y": 1601
33933
34159
  },
33934
34160
  "sunoapi": {
33935
- "x": 2001,
34161
+ "x": 1951,
33936
34162
  "y": 1601
33937
34163
  },
33938
34164
  "strava": {
33939
- "x": 1651,
34165
+ "x": 1601,
33940
34166
  "y": 1601
33941
34167
  },
33942
34168
  "supabase": {
33943
- "x": 51,
34169
+ "x": 1,
33944
34170
  "y": 1651
33945
34171
  },
33946
34172
  "surecontact": {
33947
- "x": 401,
34173
+ "x": 351,
33948
34174
  "y": 1651
33949
34175
  },
33950
34176
  "supadata": {
33951
- "x": 101,
34177
+ "x": 51,
33952
34178
  "y": 1651
33953
34179
  },
33954
34180
  "sumup": {
33955
- "x": 1951,
34181
+ "x": 1901,
33956
34182
  "y": 1601
33957
34183
  },
33958
34184
  "superchat": {
33959
- "x": 201,
34185
+ "x": 151,
33960
34186
  "y": 1651
33961
34187
  },
33962
34188
  "super_saas": {
33963
- "x": 151,
34189
+ "x": 101,
33964
34190
  "y": 1651
33965
34191
  },
33966
34192
  "sunsama_mcp": {
33967
- "x": 1,
33968
- "y": 1651
34193
+ "x": 2001,
34194
+ "y": 1601
33969
34195
  },
33970
34196
  "skio": {
33971
- "x": 1001,
34197
+ "x": 951,
33972
34198
  "y": 1551
33973
34199
  },
33974
34200
  "skyfire": {
33975
- "x": 1051,
34201
+ "x": 1001,
33976
34202
  "y": 1551
33977
34203
  },
33978
34204
  "stack_ai": {
33979
- "x": 801,
34205
+ "x": 751,
33980
34206
  "y": 1601
33981
34207
  },
33982
34208
  "stack_overflow_for_teams": {
33983
- "x": 851,
34209
+ "x": 801,
33984
34210
  "y": 1601
33985
34211
  },
33986
34212
  "svix": {
33987
- "x": 551,
34213
+ "x": 501,
33988
34214
  "y": 1651
33989
34215
  },
33990
34216
  "systeme_io": {
33991
- "x": 651,
34217
+ "x": 601,
33992
34218
  "y": 1651
33993
34219
  },
33994
34220
  "swaggerhub": {
33995
- "x": 601,
34221
+ "x": 551,
33996
34222
  "y": 1651
33997
34223
  },
33998
34224
  "taggun": {
33999
- "x": 751,
34225
+ "x": 701,
34000
34226
  "y": 1651
34001
34227
  },
34002
34228
  "tabapi": {
34003
- "x": 701,
34229
+ "x": 651,
34004
34230
  "y": 1651
34005
34231
  },
34006
34232
  "talenox": {
34007
- "x": 901,
34233
+ "x": 851,
34008
34234
  "y": 1651
34009
34235
  },
34010
34236
  "commonninja": {
@@ -34012,7 +34238,7 @@ var spriteCatalog = {
34012
34238
  "y": 351
34013
34239
  },
34014
34240
  "simpletexting": {
34015
- "x": 851,
34241
+ "x": 801,
34016
34242
  "y": 1551
34017
34243
  },
34018
34244
  "pointagram": {
@@ -34020,7 +34246,7 @@ var spriteCatalog = {
34020
34246
  "y": 1301
34021
34247
  },
34022
34248
  "validemail": {
34023
- "x": 551,
34249
+ "x": 501,
34024
34250
  "y": 1801
34025
34251
  },
34026
34252
  "kenjo": {
@@ -34028,171 +34254,171 @@ var spriteCatalog = {
34028
34254
  "y": 901
34029
34255
  },
34030
34256
  "talenthr": {
34031
- "x": 951,
34257
+ "x": 901,
34032
34258
  "y": 1651
34033
34259
  },
34034
34260
  "talentlms": {
34035
- "x": 1001,
34261
+ "x": 951,
34036
34262
  "y": 1651
34037
34263
  },
34038
34264
  "tailscale": {
34039
- "x": 851,
34265
+ "x": 801,
34040
34266
  "y": 1651
34041
34267
  },
34042
34268
  "teamtailor": {
34043
- "x": 1451,
34269
+ "x": 1401,
34044
34270
  "y": 1651
34045
34271
  },
34046
34272
  "teable": {
34047
- "x": 1351,
34273
+ "x": 1301,
34048
34274
  "y": 1651
34049
34275
  },
34050
34276
  "telnyx": {
34051
- "x": 1601,
34277
+ "x": 1551,
34052
34278
  "y": 1651
34053
34279
  },
34054
34280
  "taxjar": {
34055
- "x": 1301,
34281
+ "x": 1251,
34056
34282
  "y": 1651
34057
34283
  },
34058
34284
  "tally": {
34059
- "x": 1051,
34285
+ "x": 1001,
34060
34286
  "y": 1651
34061
34287
  },
34062
34288
  "tapfiliate": {
34063
- "x": 1151,
34289
+ "x": 1101,
34064
34290
  "y": 1651
34065
34291
  },
34066
34292
  "tanium": {
34067
- "x": 1101,
34293
+ "x": 1051,
34068
34294
  "y": 1651
34069
34295
  },
34070
34296
  "taiga": {
34071
- "x": 801,
34297
+ "x": 751,
34072
34298
  "y": 1651
34073
34299
  },
34074
34300
  "teamcamp": {
34075
- "x": 1401,
34301
+ "x": 1351,
34076
34302
  "y": 1651
34077
34303
  },
34078
34304
  "teamup": {
34079
- "x": 1501,
34305
+ "x": 1451,
34080
34306
  "y": 1651
34081
34307
  },
34082
34308
  "tave": {
34083
- "x": 1201,
34309
+ "x": 1151,
34084
34310
  "y": 1651
34085
34311
  },
34086
34312
  "tavily": {
34087
- "x": 1251,
34313
+ "x": 1201,
34088
34314
  "y": 1651
34089
34315
  },
34090
34316
  "tianyancha": {
34091
- "x": 751,
34317
+ "x": 701,
34092
34318
  "y": 1701
34093
34319
  },
34094
34320
  "tongdaxin": {
34095
- "x": 51,
34321
+ "x": 1,
34096
34322
  "y": 1751
34097
34323
  },
34098
34324
  "terraform": {
34099
- "x": 2001,
34325
+ "x": 1951,
34100
34326
  "y": 1651
34101
34327
  },
34102
34328
  "torii": {
34103
- "x": 101,
34329
+ "x": 51,
34104
34330
  "y": 1751
34105
34331
  },
34106
34332
  "torii_image_translator": {
34107
- "x": 151,
34333
+ "x": 101,
34108
34334
  "y": 1751
34109
34335
  },
34110
34336
  "the_swarm": {
34111
- "x": 451,
34337
+ "x": 401,
34112
34338
  "y": 1701
34113
34339
  },
34114
34340
  "valyu": {
34115
- "x": 601,
34341
+ "x": 551,
34116
34342
  "y": 1801
34117
34343
  },
34118
34344
  "vbout": {
34119
- "x": 751,
34345
+ "x": 701,
34120
34346
  "y": 1801
34121
34347
  },
34122
34348
  "vitally": {
34123
- "x": 1551,
34349
+ "x": 1501,
34124
34350
  "y": 1801
34125
34351
  },
34126
34352
  "templated": {
34127
- "x": 1701,
34353
+ "x": 1651,
34128
34354
  "y": 1651
34129
34355
  },
34130
34356
  "templatefox": {
34131
- "x": 1801,
34357
+ "x": 1751,
34132
34358
  "y": 1651
34133
34359
  },
34134
34360
  "tikhub": {
34135
- "x": 1101,
34361
+ "x": 1051,
34136
34362
  "y": 1701
34137
34363
  },
34138
34364
  "tianapi": {
34139
- "x": 701,
34365
+ "x": 651,
34140
34366
  "y": 1701
34141
34367
  },
34142
34368
  "tiktok_business": {
34143
- "x": 1151,
34369
+ "x": 1101,
34144
34370
  "y": 1701
34145
34371
  },
34146
34372
  "tiktok_business_mcp": {
34147
- "x": 1201,
34373
+ "x": 1151,
34148
34374
  "y": 1701
34149
34375
  },
34150
34376
  "timem_space": {
34151
- "x": 1451,
34377
+ "x": 1401,
34152
34378
  "y": 1701
34153
34379
  },
34154
34380
  "timelinesai": {
34155
- "x": 1351,
34381
+ "x": 1301,
34156
34382
  "y": 1701
34157
34383
  },
34158
34384
  "tidb": {
34159
- "x": 1051,
34385
+ "x": 1001,
34160
34386
  "y": 1701
34161
34387
  },
34162
34388
  "teltel": {
34163
- "x": 1651,
34389
+ "x": 1601,
34164
34390
  "y": 1651
34165
34391
  },
34166
34392
  "timelink": {
34167
- "x": 1401,
34393
+ "x": 1351,
34168
34394
  "y": 1701
34169
34395
  },
34170
34396
  "timecamp": {
34171
- "x": 1301,
34397
+ "x": 1251,
34172
34398
  "y": 1701
34173
34399
  },
34174
34400
  "timebuzzer": {
34175
- "x": 1251,
34401
+ "x": 1201,
34176
34402
  "y": 1701
34177
34403
  },
34178
34404
  "tldv": {
34179
- "x": 1701,
34405
+ "x": 1651,
34180
34406
  "y": 1701
34181
34407
  },
34182
34408
  "tencent_docs": {
34183
- "x": 1851,
34409
+ "x": 1801,
34184
34410
  "y": 1651
34185
34411
  },
34186
34412
  "tencent_maps": {
34187
- "x": 1901,
34413
+ "x": 1851,
34188
34414
  "y": 1651
34189
34415
  },
34190
34416
  "terminus_app": {
34191
- "x": 1951,
34417
+ "x": 1901,
34192
34418
  "y": 1651
34193
34419
  },
34194
34420
  "templatedocs": {
34195
- "x": 1751,
34421
+ "x": 1701,
34196
34422
  "y": 1651
34197
34423
  },
34198
34424
  "pdf_vector": {
@@ -34200,211 +34426,211 @@ var spriteCatalog = {
34200
34426
  "y": 1251
34201
34427
  },
34202
34428
  "tinypng": {
34203
- "x": 1551,
34429
+ "x": 1501,
34204
34430
  "y": 1701
34205
34431
  },
34206
34432
  "tinybird": {
34207
- "x": 1501,
34433
+ "x": 1451,
34208
34434
  "y": 1701
34209
34435
  },
34210
34436
  "telegram": {
34211
- "x": 1551,
34437
+ "x": 1501,
34212
34438
  "y": 1651
34213
34439
  },
34214
34440
  "ticketmaster": {
34215
- "x": 951,
34441
+ "x": 901,
34216
34442
  "y": 1701
34217
34443
  },
34218
34444
  "ticket_tailor": {
34219
- "x": 901,
34445
+ "x": 851,
34220
34446
  "y": 1701
34221
34447
  },
34222
34448
  "ticket_source": {
34223
- "x": 851,
34449
+ "x": 801,
34224
34450
  "y": 1701
34225
34451
  },
34226
34452
  "tick": {
34227
- "x": 801,
34453
+ "x": 751,
34228
34454
  "y": 1701
34229
34455
  },
34230
34456
  "ticktick": {
34231
- "x": 1001,
34457
+ "x": 951,
34232
34458
  "y": 1701
34233
34459
  },
34234
34460
  "textrazor": {
34235
- "x": 151,
34461
+ "x": 101,
34236
34462
  "y": 1701
34237
34463
  },
34238
34464
  "textcortex": {
34239
- "x": 1,
34240
- "y": 1701
34465
+ "x": 2001,
34466
+ "y": 1651
34241
34467
  },
34242
34468
  "textit": {
34243
- "x": 51,
34469
+ "x": 1,
34244
34470
  "y": 1701
34245
34471
  },
34246
34472
  "textmagic": {
34247
- "x": 101,
34473
+ "x": 51,
34248
34474
  "y": 1701
34249
34475
  },
34250
34476
  "wp_maps": {
34251
- "x": 701,
34477
+ "x": 651,
34252
34478
  "y": 1901
34253
34479
  },
34254
34480
  "you": {
34255
- "x": 1551,
34481
+ "x": 1501,
34256
34482
  "y": 1901
34257
34483
  },
34258
34484
  "y_gy": {
34259
- "x": 1301,
34485
+ "x": 1251,
34260
34486
  "y": 1901
34261
34487
  },
34262
34488
  "yoplanning": {
34263
- "x": 1501,
34489
+ "x": 1451,
34264
34490
  "y": 1901
34265
34491
  },
34266
34492
  "yuandian": {
34267
- "x": 1701,
34493
+ "x": 1651,
34268
34494
  "y": 1901
34269
34495
  },
34270
34496
  "yuanfenju": {
34271
- "x": 1751,
34497
+ "x": 1701,
34272
34498
  "y": 1901
34273
34499
  },
34274
34500
  "zhihu": {
34275
- "x": 351,
34501
+ "x": 301,
34276
34502
  "y": 1951
34277
34503
  },
34278
34504
  "ynab": {
34279
- "x": 1451,
34505
+ "x": 1401,
34280
34506
  "y": 1901
34281
34507
  },
34282
34508
  "tisane": {
34283
- "x": 1651,
34509
+ "x": 1601,
34284
34510
  "y": 1701
34285
34511
  },
34286
34512
  "tinyurl": {
34287
- "x": 1601,
34513
+ "x": 1551,
34288
34514
  "y": 1701
34289
34515
  },
34290
34516
  "todoist": {
34291
- "x": 1801,
34517
+ "x": 1751,
34292
34518
  "y": 1701
34293
34519
  },
34294
34520
  "tmdb": {
34295
- "x": 1751,
34521
+ "x": 1701,
34296
34522
  "y": 1701
34297
34523
  },
34298
34524
  "toggl": {
34299
- "x": 1901,
34525
+ "x": 1851,
34300
34526
  "y": 1701
34301
34527
  },
34302
34528
  "tomtom": {
34303
- "x": 1,
34304
- "y": 1751
34529
+ "x": 2001,
34530
+ "y": 1701
34305
34531
  },
34306
34532
  "trello": {
34307
- "x": 351,
34533
+ "x": 301,
34308
34534
  "y": 1751
34309
34535
  },
34310
34536
  "trendshift": {
34311
- "x": 451,
34537
+ "x": 401,
34312
34538
  "y": 1751
34313
34539
  },
34314
34540
  "trilium": {
34315
- "x": 651,
34541
+ "x": 601,
34316
34542
  "y": 1751
34317
34543
  },
34318
34544
  "trent": {
34319
- "x": 501,
34545
+ "x": 451,
34320
34546
  "y": 1751
34321
34547
  },
34322
34548
  "tremendous": {
34323
- "x": 401,
34549
+ "x": 351,
34324
34550
  "y": 1751
34325
34551
  },
34326
34552
  "trawlingweb": {
34327
- "x": 301,
34553
+ "x": 251,
34328
34554
  "y": 1751
34329
34555
  },
34330
34556
  "twelve_data": {
34331
- "x": 1051,
34557
+ "x": 1001,
34332
34558
  "y": 1751
34333
34559
  },
34334
34560
  "turbot_pipes": {
34335
- "x": 851,
34561
+ "x": 801,
34336
34562
  "y": 1751
34337
34563
  },
34338
34564
  "tushare": {
34339
- "x": 951,
34565
+ "x": 901,
34340
34566
  "y": 1751
34341
34567
  },
34342
34568
  "tuskr": {
34343
- "x": 1001,
34569
+ "x": 951,
34344
34570
  "y": 1751
34345
34571
  },
34346
34572
  "together_ai": {
34347
- "x": 1851,
34573
+ "x": 1801,
34348
34574
  "y": 1701
34349
34575
  },
34350
34576
  "token_metrics": {
34351
- "x": 1951,
34577
+ "x": 1901,
34352
34578
  "y": 1701
34353
34579
  },
34354
34580
  "totp": {
34355
- "x": 201,
34581
+ "x": 151,
34356
34582
  "y": 1751
34357
34583
  },
34358
34584
  "theirstack": {
34359
- "x": 601,
34585
+ "x": 551,
34360
34586
  "y": 1701
34361
34587
  },
34362
34588
  "the_odds_api": {
34363
- "x": 351,
34589
+ "x": 301,
34364
34590
  "y": 1701
34365
34591
  },
34366
34592
  "the_cat_api": {
34367
- "x": 201,
34593
+ "x": 151,
34368
34594
  "y": 1701
34369
34595
  },
34370
34596
  "the_dog_api": {
34371
- "x": 301,
34597
+ "x": 251,
34372
34598
  "y": 1701
34373
34599
  },
34374
34600
  "tripadvisor": {
34375
- "x": 701,
34601
+ "x": 651,
34376
34602
  "y": 1751
34377
34603
  },
34378
34604
  "triple_whale": {
34379
- "x": 751,
34605
+ "x": 701,
34380
34606
  "y": 1751
34381
34607
  },
34382
34608
  "tpscheck": {
34383
- "x": 251,
34609
+ "x": 201,
34384
34610
  "y": 1751
34385
34611
  },
34386
34612
  "twochat": {
34387
- "x": 1301,
34613
+ "x": 1251,
34388
34614
  "y": 1751
34389
34615
  },
34390
34616
  "unifapi": {
34391
- "x": 1651,
34617
+ "x": 1601,
34392
34618
  "y": 1751
34393
34619
  },
34394
34620
  "unione": {
34395
- "x": 1701,
34621
+ "x": 1651,
34396
34622
  "y": 1751
34397
34623
  },
34398
34624
  "unipile": {
34399
- "x": 1751,
34625
+ "x": 1701,
34400
34626
  "y": 1751
34401
34627
  },
34402
34628
  "unpaywall": {
34403
- "x": 1901,
34629
+ "x": 1851,
34404
34630
  "y": 1751
34405
34631
  },
34406
34632
  "unthread": {
34407
- "x": 2001,
34633
+ "x": 1951,
34408
34634
  "y": 1751
34409
34635
  },
34410
34636
  "practitest": {
@@ -34412,155 +34638,155 @@ var spriteCatalog = {
34412
34638
  "y": 1301
34413
34639
  },
34414
34640
  "u301": {
34415
- "x": 1551,
34641
+ "x": 1501,
34416
34642
  "y": 1751
34417
34643
  },
34418
34644
  "updown_io": {
34419
- "x": 1,
34420
- "y": 1801
34645
+ "x": 2001,
34646
+ "y": 1751
34421
34647
  },
34422
34648
  "upstash_redis": {
34423
- "x": 151,
34649
+ "x": 101,
34424
34650
  "y": 1801
34425
34651
  },
34426
34652
  "uploadcare": {
34427
- "x": 51,
34653
+ "x": 1,
34428
34654
  "y": 1801
34429
34655
  },
34430
34656
  "upsales": {
34431
- "x": 101,
34657
+ "x": 51,
34432
34658
  "y": 1801
34433
34659
  },
34434
34660
  "uptimerobot": {
34435
- "x": 201,
34661
+ "x": 151,
34436
34662
  "y": 1801
34437
34663
  },
34438
34664
  "vapi": {
34439
- "x": 651,
34665
+ "x": 601,
34440
34666
  "y": 1801
34441
34667
  },
34442
34668
  "vonage": {
34443
- "x": 1701,
34669
+ "x": 1651,
34444
34670
  "y": 1801
34445
34671
  },
34446
34672
  "vida": {
34447
- "x": 1251,
34673
+ "x": 1201,
34448
34674
  "y": 1801
34449
34675
  },
34450
34676
  "vtex": {
34451
- "x": 1751,
34677
+ "x": 1701,
34452
34678
  "y": 1801
34453
34679
  },
34454
34680
  "vultr": {
34455
- "x": 1801,
34681
+ "x": 1751,
34456
34682
  "y": 1801
34457
34683
  },
34458
34684
  "venafitlsprotectcloud": {
34459
- "x": 901,
34685
+ "x": 851,
34460
34686
  "y": 1801
34461
34687
  },
34462
34688
  "venafitlsprotectdatacenter": {
34463
- "x": 951,
34689
+ "x": 901,
34464
34690
  "y": 1801
34465
34691
  },
34466
34692
  "vectera": {
34467
- "x": 801,
34693
+ "x": 751,
34468
34694
  "y": 1801
34469
34695
  },
34470
34696
  "vectorshift": {
34471
- "x": 851,
34697
+ "x": 801,
34472
34698
  "y": 1801
34473
34699
  },
34474
34700
  "twilio": {
34475
- "x": 1151,
34701
+ "x": 1101,
34476
34702
  "y": 1751
34477
34703
  },
34478
34704
  "twenty_crm": {
34479
- "x": 1101,
34705
+ "x": 1051,
34480
34706
  "y": 1751
34481
34707
  },
34482
34708
  "truvera": {
34483
- "x": 801,
34709
+ "x": 751,
34484
34710
  "y": 1751
34485
34711
  },
34486
34712
  "twitter": {
34487
- "x": 1201,
34713
+ "x": 1151,
34488
34714
  "y": 1751
34489
34715
  },
34490
34716
  "twitterapi_io": {
34491
- "x": 1251,
34717
+ "x": 1201,
34492
34718
  "y": 1751
34493
34719
  },
34494
34720
  "uniswap_api": {
34495
- "x": 1851,
34721
+ "x": 1801,
34496
34722
  "y": 1751
34497
34723
  },
34498
34724
  "typebot": {
34499
- "x": 1351,
34725
+ "x": 1301,
34500
34726
  "y": 1751
34501
34727
  },
34502
34728
  "typeform": {
34503
- "x": 1401,
34729
+ "x": 1351,
34504
34730
  "y": 1751
34505
34731
  },
34506
34732
  "survey_monkey": {
34507
- "x": 451,
34733
+ "x": 401,
34508
34734
  "y": 1651
34509
34735
  },
34510
34736
  "typefully": {
34511
- "x": 1451,
34737
+ "x": 1401,
34512
34738
  "y": 1751
34513
34739
  },
34514
34740
  "trigger_dev": {
34515
- "x": 551,
34741
+ "x": 501,
34516
34742
  "y": 1751
34517
34743
  },
34518
34744
  "triggercmd": {
34519
- "x": 601,
34745
+ "x": 551,
34520
34746
  "y": 1751
34521
34747
  },
34522
34748
  "turso": {
34523
- "x": 901,
34749
+ "x": 851,
34524
34750
  "y": 1751
34525
34751
  },
34526
34752
  "unsplash": {
34527
- "x": 1951,
34753
+ "x": 1901,
34528
34754
  "y": 1751
34529
34755
  },
34530
34756
  "uspto": {
34531
- "x": 401,
34757
+ "x": 351,
34532
34758
  "y": 1801
34533
34759
  },
34534
34760
  "urlscan": {
34535
- "x": 251,
34761
+ "x": 201,
34536
34762
  "y": 1801
34537
34763
  },
34538
34764
  "userflow": {
34539
- "x": 301,
34765
+ "x": 251,
34540
34766
  "y": 1801
34541
34767
  },
34542
34768
  "userlist": {
34543
- "x": 351,
34769
+ "x": 301,
34544
34770
  "y": 1801
34545
34771
  },
34546
34772
  "v2ex": {
34547
- "x": 501,
34773
+ "x": 451,
34548
34774
  "y": 1801
34549
34775
  },
34550
34776
  "viggle": {
34551
- "x": 1301,
34777
+ "x": 1251,
34552
34778
  "y": 1801
34553
34779
  },
34554
34780
  "vimeo": {
34555
- "x": 1351,
34781
+ "x": 1301,
34556
34782
  "y": 1801
34557
34783
  },
34558
34784
  "vercel": {
34559
- "x": 1001,
34785
+ "x": 951,
34560
34786
  "y": 1801
34561
34787
  },
34562
34788
  "veremark": {
34563
- "x": 1051,
34789
+ "x": 1001,
34564
34790
  "y": 1801
34565
34791
  },
34566
34792
  "mumble": {
@@ -34568,31 +34794,31 @@ var spriteCatalog = {
34568
34794
  "y": 1101
34569
34795
  },
34570
34796
  "veriphone": {
34571
- "x": 1151,
34797
+ "x": 1101,
34572
34798
  "y": 1801
34573
34799
  },
34574
34800
  "vincario": {
34575
- "x": 1401,
34801
+ "x": 1351,
34576
34802
  "y": 1801
34577
34803
  },
34578
34804
  "verifiedemail": {
34579
- "x": 1101,
34805
+ "x": 1051,
34580
34806
  "y": 1801
34581
34807
  },
34582
34808
  "vatlayer": {
34583
- "x": 701,
34809
+ "x": 651,
34584
34810
  "y": 1801
34585
34811
  },
34586
34812
  "vestaboard": {
34587
- "x": 1201,
34813
+ "x": 1151,
34588
34814
  "y": 1801
34589
34815
  },
34590
34816
  "v0": {
34591
- "x": 451,
34817
+ "x": 401,
34592
34818
  "y": 1801
34593
34819
  },
34594
34820
  "virustotal": {
34595
- "x": 1501,
34821
+ "x": 1451,
34596
34822
  "y": 1801
34597
34823
  },
34598
34824
  "kling": {
@@ -34612,7 +34838,7 @@ var spriteCatalog = {
34612
34838
  "y": 451
34613
34839
  },
34614
34840
  "wanx": {
34615
- "x": 351,
34841
+ "x": 301,
34616
34842
  "y": 1851
34617
34843
  },
34618
34844
  "qwen": {
@@ -34620,75 +34846,75 @@ var spriteCatalog = {
34620
34846
  "y": 1351
34621
34847
  },
34622
34848
  "voiceflow": {
34623
- "x": 1601,
34849
+ "x": 1551,
34624
34850
  "y": 1801
34625
34851
  },
34626
34852
  "waboxapp": {
34627
- "x": 1851,
34853
+ "x": 1801,
34628
34854
  "y": 1801
34629
34855
  },
34630
34856
  "wachete": {
34631
- "x": 1901,
34857
+ "x": 1851,
34632
34858
  "y": 1801
34633
34859
  },
34634
34860
  "wufoo": {
34635
- "x": 951,
34861
+ "x": 901,
34636
34862
  "y": 1901
34637
34863
  },
34638
34864
  "waffo": {
34639
- "x": 1951,
34865
+ "x": 1901,
34640
34866
  "y": 1801
34641
34867
  },
34642
34868
  "walmart_marketplace": {
34643
- "x": 201,
34869
+ "x": 151,
34644
34870
  "y": 1851
34645
34871
  },
34646
34872
  "waiverforever": {
34647
- "x": 51,
34873
+ "x": 1,
34648
34874
  "y": 1851
34649
34875
  },
34650
34876
  "wakatime": {
34651
- "x": 101,
34877
+ "x": 51,
34652
34878
  "y": 1851
34653
34879
  },
34654
34880
  "wangdian": {
34655
- "x": 301,
34881
+ "x": 251,
34656
34882
  "y": 1851
34657
34883
  },
34658
34884
  "waterfall": {
34659
- "x": 451,
34885
+ "x": 401,
34660
34886
  "y": 1851
34661
34887
  },
34662
34888
  "wappalyzer": {
34663
- "x": 401,
34889
+ "x": 351,
34664
34890
  "y": 1851
34665
34891
  },
34666
34892
  "walletap": {
34667
- "x": 151,
34893
+ "x": 101,
34668
34894
  "y": 1851
34669
34895
  },
34670
34896
  "webinarjam": {
34671
- "x": 901,
34897
+ "x": 851,
34672
34898
  "y": 1851
34673
34899
  },
34674
34900
  "web_of_science": {
34675
- "x": 701,
34901
+ "x": 651,
34676
34902
  "y": 1851
34677
34903
  },
34678
34904
  "web_of_science_expanded": {
34679
- "x": 751,
34905
+ "x": 701,
34680
34906
  "y": 1851
34681
34907
  },
34682
34908
  "wejam_ai": {
34683
- "x": 1401,
34909
+ "x": 1351,
34684
34910
  "y": 1851
34685
34911
  },
34686
34912
  "weatherapi": {
34687
- "x": 551,
34913
+ "x": 501,
34688
34914
  "y": 1851
34689
34915
  },
34690
34916
  "weatherbit": {
34691
- "x": 601,
34917
+ "x": 551,
34692
34918
  "y": 1851
34693
34919
  },
34694
34920
  "iqair_airvisual": {
@@ -34696,47 +34922,47 @@ var spriteCatalog = {
34696
34922
  "y": 851
34697
34923
  },
34698
34924
  "wttr_in": {
34699
- "x": 901,
34925
+ "x": 851,
34700
34926
  "y": 1901
34701
34927
  },
34702
34928
  "weaviate": {
34703
- "x": 651,
34929
+ "x": 601,
34704
34930
  "y": 1851
34705
34931
  },
34706
34932
  "webvizio": {
34707
- "x": 1101,
34933
+ "x": 1051,
34708
34934
  "y": 1851
34709
34935
  },
34710
34936
  "webshare": {
34711
- "x": 1051,
34937
+ "x": 1001,
34712
34938
  "y": 1851
34713
34939
  },
34714
34940
  "webscraping_ai": {
34715
- "x": 1001,
34941
+ "x": 951,
34716
34942
  "y": 1851
34717
34943
  },
34718
34944
  "webflow": {
34719
- "x": 851,
34945
+ "x": 801,
34720
34946
  "y": 1851
34721
34947
  },
34722
34948
  "woodpecker_co": {
34723
- "x": 151,
34949
+ "x": 101,
34724
34950
  "y": 1901
34725
34951
  },
34726
34952
  "webscraper_io": {
34727
- "x": 951,
34953
+ "x": 901,
34728
34954
  "y": 1851
34729
34955
  },
34730
34956
  "what3words": {
34731
- "x": 1451,
34957
+ "x": 1401,
34732
34958
  "y": 1851
34733
34959
  },
34734
34960
  "woocommerce": {
34735
- "x": 101,
34961
+ "x": 51,
34736
34962
  "y": 1901
34737
34963
  },
34738
34964
  "woot": {
34739
- "x": 201,
34965
+ "x": 151,
34740
34966
  "y": 1901
34741
34967
  },
34742
34968
  "baizhi_mcp": {
@@ -34752,7 +34978,7 @@ var spriteCatalog = {
34752
34978
  "y": 601
34753
34979
  },
34754
34980
  "zerotier": {
34755
- "x": 301,
34981
+ "x": 251,
34756
34982
  "y": 1951
34757
34983
  },
34758
34984
  "linear_mcp": {
@@ -34768,95 +34994,95 @@ var spriteCatalog = {
34768
34994
  "y": 1101
34769
34995
  },
34770
34996
  "wisburg": {
34771
- "x": 1901,
34997
+ "x": 1851,
34772
34998
  "y": 1851
34773
34999
  },
34774
35000
  "wise": {
34775
- "x": 1951,
35001
+ "x": 1901,
34776
35002
  "y": 1851
34777
35003
  },
34778
35004
  "wrike": {
34779
- "x": 801,
35005
+ "x": 751,
34780
35006
  "y": 1901
34781
35007
  },
34782
35008
  "workiom": {
34783
- "x": 401,
35009
+ "x": 351,
34784
35010
  "y": 1901
34785
35011
  },
34786
35012
  "worksnaps": {
34787
- "x": 601,
35013
+ "x": 551,
34788
35014
  "y": 1901
34789
35015
  },
34790
35016
  "workable": {
34791
- "x": 301,
35017
+ "x": 251,
34792
35018
  "y": 1901
34793
35019
  },
34794
35020
  "workast": {
34795
- "x": 351,
35021
+ "x": 301,
34796
35022
  "y": 1901
34797
35023
  },
34798
35024
  "workos": {
34799
- "x": 501,
35025
+ "x": 451,
34800
35026
  "y": 1901
34801
35027
  },
34802
35028
  "wecom_bot": {
34803
- "x": 1151,
35029
+ "x": 1101,
34804
35030
  "y": 1851
34805
35031
  },
34806
35032
  "weixin_bot": {
34807
- "x": 1251,
35033
+ "x": 1201,
34808
35034
  "y": 1851
34809
35035
  },
34810
35036
  "weixin_official_account": {
34811
- "x": 1301,
35037
+ "x": 1251,
34812
35038
  "y": 1851
34813
35039
  },
34814
35040
  "weixin_store": {
34815
- "x": 1351,
35041
+ "x": 1301,
34816
35042
  "y": 1851
34817
35043
  },
34818
35044
  "wecom_mcp": {
34819
- "x": 1201,
35045
+ "x": 1151,
34820
35046
  "y": 1851
34821
35047
  },
34822
35048
  "whatsapp": {
34823
- "x": 1551,
35049
+ "x": 1501,
34824
35050
  "y": 1851
34825
35051
  },
34826
35052
  "whatsable": {
34827
- "x": 1501,
35053
+ "x": 1451,
34828
35054
  "y": 1851
34829
35055
  },
34830
35056
  "whop": {
34831
- "x": 1701,
35057
+ "x": 1651,
34832
35058
  "y": 1851
34833
35059
  },
34834
35060
  "who_gho": {
34835
- "x": 1601,
35061
+ "x": 1551,
34836
35062
  "y": 1851
34837
35063
  },
34838
35064
  "whoisfreaks": {
34839
- "x": 1651,
35065
+ "x": 1601,
34840
35066
  "y": 1851
34841
35067
  },
34842
35068
  "wolfram_alpha_api": {
34843
- "x": 51,
35069
+ "x": 1,
34844
35070
  "y": 1901
34845
35071
  },
34846
35072
  "world_news_api": {
34847
- "x": 651,
35073
+ "x": 601,
34848
35074
  "y": 1901
34849
35075
  },
34850
35076
  "writer": {
34851
- "x": 851,
35077
+ "x": 801,
34852
35078
  "y": 1901
34853
35079
  },
34854
35080
  "winston_ai": {
34855
- "x": 1801,
35081
+ "x": 1751,
34856
35082
  "y": 1851
34857
35083
  },
34858
35084
  "wire2air": {
34859
- "x": 1851,
35085
+ "x": 1801,
34860
35086
  "y": 1851
34861
35087
  },
34862
35088
  "optimoroute": {
@@ -34868,31 +35094,31 @@ var spriteCatalog = {
34868
35094
  "y": 1451
34869
35095
  },
34870
35096
  "wiza": {
34871
- "x": 1,
34872
- "y": 1901
35097
+ "x": 2001,
35098
+ "y": 1851
34873
35099
  },
34874
35100
  "wit_ai": {
34875
- "x": 2001,
35101
+ "x": 1951,
34876
35102
  "y": 1851
34877
35103
  },
34878
35104
  "zep": {
34879
- "x": 151,
35105
+ "x": 101,
34880
35106
  "y": 1951
34881
35107
  },
34882
35108
  "z_api": {
34883
- "x": 1801,
35109
+ "x": 1751,
34884
35110
  "y": 1901
34885
35111
  },
34886
35112
  "zerobounce": {
34887
- "x": 251,
35113
+ "x": 201,
34888
35114
  "y": 1951
34889
35115
  },
34890
35116
  "yelp": {
34891
- "x": 1351,
35117
+ "x": 1301,
34892
35118
  "y": 1901
34893
35119
  },
34894
35120
  "wind": {
34895
- "x": 1751,
35121
+ "x": 1701,
34896
35122
  "y": 1851
34897
35123
  },
34898
35124
  "investoday_mcp": {
@@ -34900,71 +35126,71 @@ var spriteCatalog = {
34900
35126
  "y": 801
34901
35127
  },
34902
35128
  "yingmi_mcp": {
34903
- "x": 1401,
35129
+ "x": 1351,
34904
35130
  "y": 1901
34905
35131
  },
34906
35132
  "wps_mcp": {
34907
- "x": 751,
35133
+ "x": 701,
34908
35134
  "y": 1901
34909
35135
  },
34910
35136
  "youzan": {
34911
- "x": 1651,
35137
+ "x": 1601,
34912
35138
  "y": 1901
34913
35139
  },
34914
35140
  "zendesk": {
34915
- "x": 1901,
35141
+ "x": 1851,
34916
35142
  "y": 1901
34917
35143
  },
34918
35144
  "zenkit": {
34919
- "x": 1951,
35145
+ "x": 1901,
34920
35146
  "y": 1901
34921
35147
  },
34922
35148
  "zammad": {
34923
- "x": 1851,
35149
+ "x": 1801,
34924
35150
  "y": 1901
34925
35151
  },
34926
35152
  "zenventory": {
34927
- "x": 101,
35153
+ "x": 51,
34928
35154
  "y": 1951
34929
35155
  },
34930
35156
  "zenrows": {
34931
- "x": 2001,
35157
+ "x": 1951,
34932
35158
  "y": 1901
34933
35159
  },
34934
35160
  "zenserp": {
34935
- "x": 51,
35161
+ "x": 1,
34936
35162
  "y": 1951
34937
35163
  },
34938
35164
  "zeplin": {
34939
- "x": 201,
35165
+ "x": 151,
34940
35166
  "y": 1951
34941
35167
  },
34942
35168
  "zigpoll": {
34943
- "x": 401,
35169
+ "x": 351,
34944
35170
  "y": 1951
34945
35171
  },
34946
35172
  "zip_archive_api": {
34947
- "x": 451,
35173
+ "x": 401,
34948
35174
  "y": 1951
34949
35175
  },
34950
35176
  "zlibrary": {
34951
- "x": 601,
35177
+ "x": 551,
34952
35178
  "y": 1951
34953
35179
  },
34954
35180
  "zylvie": {
34955
- "x": 851,
35181
+ "x": 801,
34956
35182
  "y": 1951
34957
35183
  },
34958
35184
  "zyte_api": {
34959
- "x": 901,
35185
+ "x": 851,
34960
35186
  "y": 1951
34961
35187
  },
34962
35188
  "zorus": {
34963
- "x": 701,
35189
+ "x": 651,
34964
35190
  "y": 1951
34965
35191
  },
34966
35192
  "zixflow": {
34967
- "x": 551,
35193
+ "x": 501,
34968
35194
  "y": 1951
34969
35195
  },
34970
35196
  "evervault": {
@@ -34976,19 +35202,19 @@ var spriteCatalog = {
34976
35202
  "y": 551
34977
35203
  },
34978
35204
  "zoom": {
34979
- "x": 651,
35205
+ "x": 601,
34980
35206
  "y": 1951
34981
35207
  },
34982
35208
  "webex": {
34983
- "x": 801,
35209
+ "x": 751,
34984
35210
  "y": 1851
34985
35211
  },
34986
35212
  "zotero": {
34987
- "x": 751,
35213
+ "x": 701,
34988
35214
  "y": 1951
34989
35215
  },
34990
35216
  "speedtest_tracker": {
34991
- "x": 401,
35217
+ "x": 351,
34992
35218
  "y": 1601
34993
35219
  },
34994
35220
  "bloomerang": {
@@ -35014,6 +35240,8 @@ var _virtual_oomol_provider_icons_default = {
35014
35240
  "7_shifts": "https://static.oomol.com/logo/third-party/7_shifts.png",
35015
35241
  "ably": "https://static.oomol.com/logo/third-party/ably.svg",
35016
35242
  "aisa": "https://static.oomol.com/logo/third-party/aisa.svg",
35243
+ "opper": "https://static.oomol.com/logo/third-party/opper.svg",
35244
+ "scanmalware": "https://static.oomol.com/logo/third-party/scanmalware.svg",
35017
35245
  "osv": "https://static.oomol.com/logo/third-party/osv.svg",
35018
35246
  "ably_control": "https://static.oomol.com/logo/third-party/ably_control.svg",
35019
35247
  "abyssale": "https://static.oomol.com/logo/third-party/abyssale.svg",
@@ -35260,7 +35488,6 @@ var _virtual_oomol_provider_icons_default = {
35260
35488
  "skyvern": "https://static.oomol.com/logo/third-party/skyvern.png",
35261
35489
  "shopify": "https://static.oomol.com/logo/third-party/shopify.svg",
35262
35490
  "shopee": "https://static.oomol.com/logo/third-party/shopee.svg",
35263
- "shopify_admin": "https://static.oomol.com/logo/third-party/shopify_admin.svg",
35264
35491
  "shopify_partner": "https://static.oomol.com/logo/third-party/shopify_partner.svg",
35265
35492
  "shopify_storefront": "https://static.oomol.com/logo/third-party/shopify_storefront.svg",
35266
35493
  "shippo": "https://static.oomol.com/logo/third-party/shippo.png",
@@ -37725,6 +37952,119 @@ function designerGraph(draft, presentation = {}, diagnostics = [], connectorActi
37725
37952
  };
37726
37953
  }
37727
37954
  //#endregion
37955
+ //#region src/connector/common/actionSchema.ts
37956
+ function connectorActionPorts(inputSchema, outputSchema) {
37957
+ const inputs = inputPorts(inputSchema);
37958
+ return {
37959
+ inputs,
37960
+ initialInputs: inputs.flatMap((input) => input.value === void 0 ? [] : [{
37961
+ handle: input.handle,
37962
+ value: input.value
37963
+ }]),
37964
+ outputs: outputPorts(outputSchema)
37965
+ };
37966
+ }
37967
+ function inputPorts(schema) {
37968
+ const root = toPlainObject(schema);
37969
+ if (root == null || root.type != "object" && root.properties == null) throw new Error("Connector action inputSchema must be an object schema.");
37970
+ const properties = toPlainObject(root.properties);
37971
+ if (properties == null) return [];
37972
+ const required = stringSet(root.required);
37973
+ return Object.entries(properties).map(([handle, propertySchema]) => {
37974
+ const nullable = !required.has(handle) || schemaAllowsNull(propertySchema, root);
37975
+ return {
37976
+ description: schemaDescription(root, propertySchema),
37977
+ handle,
37978
+ json_schema: propertySchemaWithDefinitions(root, propertySchema),
37979
+ nullable,
37980
+ value: schemaDefault(root, propertySchema, nullable)
37981
+ };
37982
+ });
37983
+ }
37984
+ function connectorOutputMode(schema) {
37985
+ const root = toPlainObject(schema);
37986
+ const properties = toPlainObject(root?.properties);
37987
+ return properties != null && Object.keys(properties).length > 0 || root?.type == "object" && root.additionalProperties === false ? "fields" : "value";
37988
+ }
37989
+ function outputPorts(schema) {
37990
+ const root = toPlainObject(schema);
37991
+ if (connectorOutputMode(schema) == "value") return [{
37992
+ description: schemaDescription(root, schema),
37993
+ handle: "output",
37994
+ json_schema: schema,
37995
+ nullable: schemaAllowsNull(schema)
37996
+ }];
37997
+ const properties = toPlainObject(root?.properties) ?? {};
37998
+ const required = stringSet(root?.required);
37999
+ return Object.entries(properties).map(([handle, propertySchema]) => ({
38000
+ description: schemaDescription(root, propertySchema),
38001
+ handle,
38002
+ json_schema: propertySchemaWithDefinitions(root, propertySchema),
38003
+ nullable: !required.has(handle) || schemaAllowsNull(propertySchema, root)
38004
+ }));
38005
+ }
38006
+ function propertySchemaWithDefinitions(root, schema) {
38007
+ const property = toPlainObject(schema);
38008
+ if (property == null) return schema;
38009
+ const result = Object.assign({}, property);
38010
+ if (result.$defs == null && root.$defs != null) result.$defs = root.$defs;
38011
+ if (result.definitions == null && root.definitions != null) result.definitions = root.definitions;
38012
+ return result;
38013
+ }
38014
+ function schemaDescription(root, schema) {
38015
+ for (const object of referencedSchemas(root, schema)) if (typeof object.description == "string") return object.description;
38016
+ }
38017
+ function schemaDefault(root, schema, nullable) {
38018
+ for (const object of referencedSchemas(root, schema)) if (Object.hasOwn(object, "default")) return object.default;
38019
+ return nullable ? null : void 0;
38020
+ }
38021
+ function stringSet(value) {
38022
+ if (!Array.isArray(value)) return /* @__PURE__ */ new Set();
38023
+ return new Set(value.filter((item) => typeof item == "string"));
38024
+ }
38025
+ function schemaAllowsNull(schema, root = schema, references = /* @__PURE__ */ new Set()) {
38026
+ const object = toPlainObject(schema);
38027
+ if (object == null) return false;
38028
+ if (Object.hasOwn(object, "type")) return object.type == "null" || Array.isArray(object.type) && object.type.includes("null");
38029
+ if (Object.hasOwn(object, "enum")) return Array.isArray(object.enum) && object.enum.includes(null);
38030
+ for (const key of ["anyOf", "oneOf"]) if (Object.hasOwn(object, key)) return Array.isArray(object[key]) && object[key].some((item) => schemaAllowsNull(item, root, references));
38031
+ const reference = typeof object.$ref == "string" ? object.$ref : void 0;
38032
+ if (reference == null || references.has(reference)) return false;
38033
+ const target = resolveLocalReference(root, reference);
38034
+ if (target === void 0) return false;
38035
+ const nextReferences = new Set(references);
38036
+ nextReferences.add(reference);
38037
+ return schemaAllowsNull(target, root, nextReferences);
38038
+ }
38039
+ function referencedSchemas(root, schema) {
38040
+ const result = [];
38041
+ const references = /* @__PURE__ */ new Set();
38042
+ let current = schema;
38043
+ while (true) {
38044
+ const object = toPlainObject(current);
38045
+ if (object == null) return result;
38046
+ result.push(object);
38047
+ const reference = typeof object.$ref == "string" ? object.$ref : void 0;
38048
+ if (reference == null || references.has(reference)) return result;
38049
+ const target = resolveLocalReference(root, reference);
38050
+ if (target === void 0) return result;
38051
+ references.add(reference);
38052
+ current = target;
38053
+ }
38054
+ }
38055
+ function resolveLocalReference(root, reference) {
38056
+ if (reference == "#") return root;
38057
+ if (!reference.startsWith("#/")) return void 0;
38058
+ let current = root;
38059
+ for (const encodedToken of reference.slice(2).split("/")) {
38060
+ const object = toPlainObject(current);
38061
+ const token = encodedToken.replaceAll("~1", "/").replaceAll("~0", "~");
38062
+ if (object == null || !Object.hasOwn(object, token)) return void 0;
38063
+ current = object[token];
38064
+ }
38065
+ return current;
38066
+ }
38067
+ //#endregion
37728
38068
  //#region src/workbench/browser/runtime/stores/resource.ts
37729
38069
  var dataSources = /* @__PURE__ */ new WeakMap();
37730
38070
  /** Keep data-only consumers independent from refresh and error notifications. */
@@ -38817,6 +39157,7 @@ function connectorTask(action) {
38817
39157
  return {
38818
39158
  executor: {
38819
39159
  action: action.actionId,
39160
+ ...action.outputSchema !== void 0 && connectorOutputMode(action.outputSchema) == "value" ? { outputMode: "value" } : {},
38820
39161
  ...action.defaultConnection == null ? {} : { connectionId: action.defaultConnection.connectionId },
38821
39162
  kind: "connector"
38822
39163
  },
@@ -39352,4 +39693,4 @@ function replaceTaskPorts(revision, nodeId, task, values) {
39352
39693
  return changes;
39353
39694
  }
39354
39695
  //#endregion
39355
- export { RunStore as $, connection as $n, DropdownMenuContent as $t, datePickerValue as A, zh_TW_default$3 as An, followWorkbenchLink as At, CacheResource as B, errorNotice as Bn, VirtualScrollArea as Bt, valueForEditor as C, Badge as Cn, setCodeActions as Ct, calendarChange as D, createI18n as Dn, updateTriggerConfig as Dt, typeOfSchema as E, SourceSelect as En, setTriggerConnection as Et, feishuResourceKind as F, fr_default$3 as Fn, PopoverPanelContent as Ft, semanticNodeIcon as G, decodeTriggerCatalog as Gn, Empty as Gt, resourceData as H, randomId as Hn, InputGroup as Ht, supportsFeishuChatFilter as I, en_default$3 as In, PopoverTitle as It, providerIcon as J, sampleErrorOutputs as Jn, EmptyHeader as Jt, triggerNodeIcon as K, resolutionOutputPorts as Kn, EmptyContent as Kt, combineSources as L, I18n as Ln, PopoverTrigger as Lt, addNodeIntent as M, ru_default$3 as Mn, PopoverContent as Mt, deriveAddNodeOptions as N, ko_default$3 as Nn, PopoverDescription as Nt, calendarDate as O, uiLocales as On, updateTriggerSchedule as Ot, indexAddNodeOptions as P, ja_default$3 as Pn, PopoverHeader as Pt, useIconifyData as Q, triggerConfigValues as Qn, DropdownMenuCheckboxItem as Qt, mapSource as R, FeishuEventPicker as Rn, NativeScrollArea as Rt, schemaForEditor as S, useMenuRootContext as Sn, resetInputValues as St, isUnconstrainedSchema as T, SourceForm as Tn, setInputSources as Tt, resourceValue as U, allConnectorConnectionsQuery as Un, InputGroupAddon as Ut, observeResource as V, WorkbenchClient as Vn, Z as Vt, designerGraph as W, decodeResultList as Wn, InputGroupInput as Wt, IconifyProvider as X, isJsonObject as Xn, EmptyTitle as Xt, ContentIcon as Y, triggerOutputDefinitions as Yn, EmptyMedia as Yt, useIconifyCollectionLoader as Z, triggerConfigValue as Zn, DropdownMenu as Zt, updateValue as _, MenuItem as _n, Checkbox as _r, setComment as _t, nameCreatedNodes as a, DropdownMenuSeparator as an, openApiTask as ar, deriveInspectorDiagnostics as at, editorComponent as b, useContextMenuRootContext as bn, setNodePositions as bt, updateCondition as c, DropdownMenuSubTrigger as cn, serverAddress as cr, diagnosticNodeId as ct, updateNodeName as d, findRootOwnerId as dn, invalidResponse as dr, connectionCatalog as dt, DropdownMenuGroup as en, connectorActionMetadata as er, canCancelRun as et, updateNodeSettings as f, useCompositeItem as fn, jsonValue as fr, canvasPresentationChange as ft, updateTaskPorts as g, MenuPopup as gn, controlErrorCode as gr, restoreCanvasPresentation as gt, updateTaskAdditionalInputs as h, MenuPortal as hn, ApiError as hr, removeComments as ht, deleteSelection as i, DropdownMenuRadioItem as in, openApiFieldIssues as ir, Latest as it, isDateFormat as j, zh_CN_default$3 as jn, Popover as jt, datePickerChange as k, waitBranchDescription as kn, IdTooltip as kt, updateNodeDescription as l, DropdownMenuTrigger as ln, servers as lr, schemaMismatchMessage as lt, updateTask as m, MenuPositioner as mn, string as mr, flowPresentation as mt, agentTool as n, DropdownMenuLabel as nn, listOperations as nr, revisionView as nt, setInputValue as o, DropdownMenuSub as on, securityOptions as or, diagnosticItems as ot, updateResolution as p, MenuRoot as pn, record$1 as pr, commentIds as pt, actionSummary as q, sourceOutputLabel as qn, EmptyDescription as qt, applyFlowChanges as r, DropdownMenuRadioGroup as rn, object as rr, flowResourceReferences as rt, setInputVariable as s, DropdownMenuSubContent as sn, selectOperation as sr, diagnosticMessage as st, addNode as t, DropdownMenuItem as tn, providerIconAppearance as tr, hasRunFilter as tt, updateNodeIcon as u, isElementDisabled as un, inputValue as ur, actionWithConnections as ut, updateWebhook as v, MenuGroup as vn, useAriaLabelledBy as vr, setFlowViewport as vt, getDefaultValue as w, EventSourcesPage as wn, setConnectorConnection as wt, editorGroups as x, MenuRootContext as xn, repairNodeNames as xt, defaultValueEditorSchema as y, ContextMenuRootContext as yn, IconThemeContext as yr, setNodeContentHidden as yt, scopedValue as z, EventSourceSetup as zn, ScrollArea as zt };
39696
+ export { useIconifyData as $, connection as $n, DropdownMenu as $t, datePickerValue as A, uiLocales as An, WorkflowExportMenuItem as At, CacheResource as B, FeishuEventPicker as Bn, NativeScrollArea as Bt, valueForEditor as C, MenuRootContext as Cn, Checkbox as Cr, resetInputValues as Ct, calendarChange as D, SourceForm as Dn, setTriggerConnection as Dt, typeOfSchema as E, EventSourcesPage as En, setInputSources as Et, feishuResourceKind as F, ko_default$3 as Fn, PopoverDescription as Ft, designerGraph as G, allConnectorConnectionsQuery as Gn, InputGroupAddon as Gt, resourceData as H, errorNotice as Hn, VirtualScrollArea as Ht, supportsFeishuChatFilter as I, ja_default$3 as In, PopoverHeader as It, actionSummary as J, resolutionOutputPorts as Jn, EmptyContent as Jt, semanticNodeIcon as K, decodeResultList as Kn, InputGroupInput as Kt, combineSources as L, fr_default$3 as Ln, PopoverPanelContent as Lt, addNodeIntent as M, zh_TW_default$3 as Mn, followWorkbenchLink as Mt, deriveAddNodeOptions as N, zh_CN_default$3 as Nn, Popover as Nt, calendarDate as O, SourceSelect as On, updateTriggerConfig as Ot, indexAddNodeOptions as P, ru_default$3 as Pn, PopoverContent as Pt, useIconifyCollectionLoader as Q, isJsonObject as Qn, EmptyTitle as Qt, mapSource as R, en_default$3 as Rn, PopoverTitle as Rt, schemaForEditor as S, useContextMenuRootContext as Sn, controlErrorCode as Sr, repairNodeNames as St, isUnconstrainedSchema as T, Badge as Tn, IconThemeContext as Tr, setConnectorConnection as Tt, resourceValue as U, WorkbenchClient as Un, Z as Ut, observeResource as V, EventSourceSetup as Vn, ScrollArea as Vt, connectorActionPorts as W, randomId as Wn, InputGroup as Wt, ContentIcon as X, sampleErrorOutputs as Xn, EmptyHeader as Xt, providerIcon as Y, sourceOutputLabel as Yn, EmptyDescription as Yt, IconifyProvider as Z, triggerOutputDefinitions as Zn, EmptyMedia as Zt, updateValue as _, MenuPortal as _n, invalidResponse as _r, restoreCanvasPresentation as _t, nameCreatedNodes as a, DropdownMenuRadioGroup as an, triggerConfigValue as ar, Latest as at, editorComponent as b, MenuGroup as bn, string as br, setNodeContentHidden as bt, updateCondition as c, DropdownMenuSub as cn, listOperations as cr, diagnosticMessage as ct, updateNodeName as d, DropdownMenuTrigger as dn, openApiTask as dr, actionWithConnections as dt, DropdownMenuCheckboxItem as en, connectorActionMetadata as er, RunStore as et, updateNodeSettings as f, isElementDisabled as fn, securityOptions as fr, connectionCatalog as ft, updateTaskPorts as g, MenuPositioner as gn, inputValue as gr, removeComments as gt, updateTaskAdditionalInputs as h, MenuRoot as hn, servers as hr, flowPresentation as ht, deleteSelection as i, DropdownMenuLabel as in, workflowNameFromFile as ir, flowResourceReferences as it, isDateFormat as j, waitBranchDescription as jn, IdTooltip as jt, datePickerChange as k, createI18n as kn, updateTriggerSchedule as kt, updateNodeDescription as l, DropdownMenuSubContent as ln, object as lr, diagnosticNodeId as lt, updateTask as m, useCompositeItem as mn, serverAddress as mr, commentIds as mt, agentTool as n, DropdownMenuGroup as nn, parseWorkflowFile as nr, hasRunFilter as nt, setInputValue as o, DropdownMenuRadioItem as on, triggerConfigValues as or, deriveInspectorDiagnostics as ot, updateResolution as p, findRootOwnerId as pn, selectOperation as pr, canvasPresentationChange as pt, triggerNodeIcon as q, decodeTriggerCatalog as qn, Empty as qt, applyFlowChanges as r, DropdownMenuItem as rn, workflowFileName as rr, revisionView as rt, setInputVariable as s, DropdownMenuSeparator as sn, providerIconAppearance as sr, diagnosticItems as st, addNode as t, DropdownMenuContent as tn, encodeWorkflowFile as tr, canCancelRun as tt, updateNodeIcon as u, DropdownMenuSubTrigger as un, openApiFieldIssues as ur, schemaMismatchMessage as ut, updateWebhook as v, MenuPopup as vn, jsonValue as vr, setComment as vt, getDefaultValue as w, useMenuRootContext as wn, useAriaLabelledBy as wr, setCodeActions as wt, editorGroups as x, ContextMenuRootContext as xn, ApiError as xr, setNodePositions as xt, defaultValueEditorSchema as y, MenuItem as yn, record$1 as yr, setFlowViewport as yt, scopedValue as z, I18n as zn, PopoverTrigger as zt };