orcheo-studio 0.24.3 → 0.24.5

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 (83) hide show
  1. package/.bumpversion.cfg +1 -1
  2. package/dist/assets/{arc-BnLNnEym.js → arc-C-7b0zH4.js} +1 -1
  3. package/dist/assets/{architectureDiagram-VXUJARFQ-B8dIgVkK.js → architectureDiagram-VXUJARFQ-Ciy8lV6J.js} +1 -1
  4. package/dist/assets/{blockDiagram-VD42YOAC-BhDb_8Vg.js → blockDiagram-VD42YOAC-dC88adQ_.js} +1 -1
  5. package/dist/assets/{c4Diagram-YG6GDRKO-DxHEo9Fv.js → c4Diagram-YG6GDRKO-BiHVvXEu.js} +1 -1
  6. package/dist/assets/channel-pJdT5i-M.js +1 -0
  7. package/dist/assets/{chunk-4BX2VUAB-DMBtc1td.js → chunk-4BX2VUAB-C6V7Huup.js} +1 -1
  8. package/dist/assets/{chunk-55IACEB6-DMMV3uf8.js → chunk-55IACEB6-DRmZnlbz.js} +1 -1
  9. package/dist/assets/{chunk-B4BG7PRW-BVmjJQGD.js → chunk-B4BG7PRW-DwV5xRJr.js} +1 -1
  10. package/dist/assets/{chunk-DI55MBZ5-3C02UFww.js → chunk-DI55MBZ5-BHsUZ0IJ.js} +1 -1
  11. package/dist/assets/{chunk-FMBD7UC4-D-PvzEp6.js → chunk-FMBD7UC4-6Q-Lz0AM.js} +1 -1
  12. package/dist/assets/{chunk-QN33PNHL-BNp075o8.js → chunk-QN33PNHL-BFy_ml8O.js} +1 -1
  13. package/dist/assets/{chunk-QZHKN3VN-ChdFCxgk.js → chunk-QZHKN3VN-C1fN91FN.js} +1 -1
  14. package/dist/assets/{chunk-TZMSLE5B-DKr2kcEO.js → chunk-TZMSLE5B-FLRSQ_Fi.js} +1 -1
  15. package/dist/assets/classDiagram-2ON5EDUG-CNT-EGNU.js +1 -0
  16. package/dist/assets/classDiagram-v2-WZHVMYZB-CNT-EGNU.js +1 -0
  17. package/dist/assets/clone-BCi0j082.js +1 -0
  18. package/dist/assets/{cose-bilkent-S5V4N54A-T8_HzNYG.js → cose-bilkent-S5V4N54A-BSWP1X1D.js} +1 -1
  19. package/dist/assets/{dagre-6UL2VRFP-Chzqb9xS.js → dagre-6UL2VRFP-CYoZFlcz.js} +1 -1
  20. package/dist/assets/{diagram-PSM6KHXK-CLiXfMfi.js → diagram-PSM6KHXK-B8RGX0YL.js} +1 -1
  21. package/dist/assets/{diagram-QEK2KX5R-DYE_yT-r.js → diagram-QEK2KX5R-ChWXJ8p_.js} +1 -1
  22. package/dist/assets/{diagram-S2PKOQOG-B4LSPAmZ.js → diagram-S2PKOQOG-Dwic0Fjn.js} +1 -1
  23. package/dist/assets/{erDiagram-Q2GNP2WA-D9fO0sd2.js → erDiagram-Q2GNP2WA-0NSDB0DX.js} +1 -1
  24. package/dist/assets/{flowDiagram-NV44I4VS-BU7f4j4T.js → flowDiagram-NV44I4VS-DEoGWs9L.js} +1 -1
  25. package/dist/assets/{ganttDiagram-JELNMOA3-BSvXqVC4.js → ganttDiagram-JELNMOA3-DqzV4S6l.js} +1 -1
  26. package/dist/assets/{gitGraphDiagram-V2S2FVAM-B6qztLiE.js → gitGraphDiagram-V2S2FVAM-B-EIQM_H.js} +1 -1
  27. package/dist/assets/{graph-CxstBGnL.js → graph-Ha1DTJNG.js} +1 -1
  28. package/dist/assets/{index-Cnz1aoh0.js → index-DTxvVcXp.js} +108 -108
  29. package/dist/assets/{infoDiagram-HS3SLOUP-BN6_fsOH.js → infoDiagram-HS3SLOUP-C4_vpEkn.js} +1 -1
  30. package/dist/assets/{isUndefined-DxBJKB1b.js → isUndefined-DkuoqItu.js} +1 -1
  31. package/dist/assets/{journeyDiagram-XKPGCS4Q-CnjRjeOv.js → journeyDiagram-XKPGCS4Q-BxY4e6OZ.js} +1 -1
  32. package/dist/assets/{kanban-definition-3W4ZIXB7-qaU6OHR6.js → kanban-definition-3W4ZIXB7-BTX3_Q7O.js} +1 -1
  33. package/dist/assets/{layout-BULznkFT.js → layout-Dt1W0fl0.js} +1 -1
  34. package/dist/assets/{linear-ogckhhec.js → linear-CjywSMUX.js} +1 -1
  35. package/dist/assets/{min-DljR10o-.js → min-Dblq6bty.js} +1 -1
  36. package/dist/assets/{mindmap-definition-VGOIOE7T-DaEYqWVU.js → mindmap-definition-VGOIOE7T-C5P7bAFm.js} +1 -1
  37. package/dist/assets/{pieDiagram-ADFJNKIX-C_xhGVfM.js → pieDiagram-ADFJNKIX-BSMylwok.js} +1 -1
  38. package/dist/assets/{quadrantDiagram-AYHSOK5B-D_TV5asG.js → quadrantDiagram-AYHSOK5B-C74B7bqa.js} +1 -1
  39. package/dist/assets/{requirementDiagram-UZGBJVZJ-BuLlPC62.js → requirementDiagram-UZGBJVZJ-CvPzL8Le.js} +1 -1
  40. package/dist/assets/{sankeyDiagram-TZEHDZUN-1P0__QD_.js → sankeyDiagram-TZEHDZUN-BFHm6g6t.js} +1 -1
  41. package/dist/assets/{sequenceDiagram-WL72ISMW-TfKpluC6.js → sequenceDiagram-WL72ISMW-e74mJ0xk.js} +1 -1
  42. package/dist/assets/{stateDiagram-FKZM4ZOC-nQ-BoGjY.js → stateDiagram-FKZM4ZOC-VLQxNVA7.js} +1 -1
  43. package/dist/assets/stateDiagram-v2-4FDKWEC3-Bbpq2t6B.js +1 -0
  44. package/dist/assets/{timeline-definition-IT6M3QCI-Bz79EHNk.js → timeline-definition-IT6M3QCI-oveNP_QD.js} +1 -1
  45. package/dist/assets/{treemap-GDKQZRPO-BiJYOG6x.js → treemap-GDKQZRPO-Cowimd29.js} +1 -1
  46. package/dist/assets/{xychartDiagram-PRI3JC2R-_EJmDCRo.js → xychartDiagram-PRI3JC2R-CP9Fm_aO.js} +1 -1
  47. package/dist/index.html +1 -1
  48. package/dist/orcheo.png +0 -0
  49. package/package.json +1 -1
  50. package/public/orcheo.png +0 -0
  51. package/src/App.tsx +48 -44
  52. package/src/features/account/pages/workspace-members.tsx +58 -62
  53. package/src/features/auth/pages/login.tsx +3 -1
  54. package/src/features/chatkit/lib/public-chat-access.ts +13 -0
  55. package/src/features/chatkit/pages/public-chat.tsx +1 -12
  56. package/src/features/shared/components/chat-interface.types.ts +1 -5
  57. package/src/features/shared/components/top-navigation/version-status.tsx +27 -31
  58. package/src/features/workflow/components/dialogs/add-credential-dialog.tsx +6 -2
  59. package/src/features/workflow/components/dialogs/credentials-vault.tsx +9 -3
  60. package/src/features/workflow/components/dialogs/upload-workflow-dialog.tsx +5 -0
  61. package/src/features/workflow/components/panels/rjsf-cron-widget.tsx +35 -10
  62. package/src/features/workflow/components/trace/agent-prism/SpanCard/SpanCardConnector.tsx +1 -5
  63. package/src/features/workflow/components/trace/agent-prism/shared.ts +1 -10
  64. package/src/features/workflow/lib/workflow-execution-builders.ts +4 -4
  65. package/src/features/workflow/lib/workflow-execution.types.ts +2 -9
  66. package/src/features/workflow/lib/workflow-frontmatter.ts +112 -0
  67. package/src/features/workflow/lib/workflow-storage-api.ts +5 -9
  68. package/src/features/workflow/lib/workflow-storage-helpers.ts +2 -4
  69. package/src/features/workflow/lib/workflow-storage.ts +11 -4
  70. package/src/features/workflow/lib/workflow-storage.types.ts +1 -6
  71. package/src/features/workflow/lib/workflow-upload-errors.ts +6 -2
  72. package/src/features/workflow/pages/workflow/components/workflow-tab-content.tsx +3 -1
  73. package/src/features/workflow/pages/workflow/hooks/controller/use-workflow-execution-controller.ts +4 -1
  74. package/src/features/workflow/pages/workflow/hooks/use-execution-updates.ts +4 -2
  75. package/src/features/workflow/pages/workflow-gallery/create-team-dialog.tsx +2 -6
  76. package/src/lib/api.ts +7 -2
  77. package/src/lib/config.ts +25 -3
  78. package/src/lib/workspace-routing.ts +1 -3
  79. package/dist/assets/channel-0htV4G8n.js +0 -1
  80. package/dist/assets/classDiagram-2ON5EDUG-Blgk-ihj.js +0 -1
  81. package/dist/assets/classDiagram-v2-WZHVMYZB-Blgk-ihj.js +0 -1
  82. package/dist/assets/clone-BgMTf_8w.js +0 -1
  83. package/dist/assets/stateDiagram-v2-4FDKWEC3-hx1MeqAD.js +0 -1
@@ -498,7 +498,8 @@ export const extractCronConfigFromVersionGraph = (
498
498
 
499
499
  // Matches a value that is exactly a single `{{config.configurable.<name>}}`
500
500
  // placeholder, optionally padded with whitespace inside the braces.
501
- const CONFIGURABLE_TEMPLATE = /^\{\{\s*config\.configurable\.([^}\s.]+)\s*\}\}$/;
501
+ const CONFIGURABLE_TEMPLATE =
502
+ /^\{\{\s*config\.configurable\.([^}\s.]+)\s*\}\}$/;
502
503
 
503
504
  const resolveConfigurableTemplate = (
504
505
  value: string | null | undefined,
@@ -539,16 +540,11 @@ const resolveConfigurableCronConfig = (
539
540
  resolveConfigurableTemplate(config.expression, configurable) ??
540
541
  config.expression,
541
542
  timezone: resolveConfigurableTemplate(config.timezone, configurable) as
542
- | string
543
- | undefined,
543
+ string | undefined,
544
544
  start_at: resolveConfigurableTemplate(config.start_at, configurable) as
545
- | string
546
- | null
547
- | undefined,
545
+ string | null | undefined,
548
546
  end_at: resolveConfigurableTemplate(config.end_at, configurable) as
549
- | string
550
- | null
551
- | undefined,
547
+ string | null | undefined,
552
548
  };
553
549
  };
554
550
 
@@ -281,11 +281,9 @@ const parseWorkflowMetadata = (
281
281
 
282
282
  const workflowRecord = workflowMetadata as Record<string, unknown>;
283
283
  const snapshotPayload = workflowRecord.snapshot as
284
- | WorkflowSnapshot
285
- | undefined;
284
+ WorkflowSnapshot | undefined;
286
285
  const summaryPayload = workflowRecord.summary as
287
- | WorkflowDiffResult["summary"]
288
- | undefined;
286
+ WorkflowDiffResult["summary"] | undefined;
289
287
  const messagePayload = workflowRecord.message as string | undefined;
290
288
  const workflowToGraph = (workflowRecord.workflowToGraph ??
291
289
  workflowRecord.canvasToGraph) as Record<string, string> | undefined;
@@ -29,6 +29,7 @@ import {
29
29
  clearWorkflowUploadError,
30
30
  saveWorkflowUploadError,
31
31
  } from "./workflow-upload-errors";
32
+ import { parseWorkflowFrontmatter } from "./workflow-frontmatter";
32
33
  import type {
33
34
  ApiWorkflow,
34
35
  SaveWorkflowInput,
@@ -372,11 +373,13 @@ export const uploadWorkflowFromFiles = async (
372
373
  options?: { actor?: string },
373
374
  ): Promise<StoredWorkflow> => {
374
375
  const actor = resolveActor(options?.actor);
376
+ const frontmatter = parseWorkflowFrontmatter(script);
375
377
  const created = await request<ApiWorkflow>(API_BASE, {
376
378
  method: "POST",
377
379
  body: JSON.stringify({
378
380
  name: workflowName,
379
- description: null,
381
+ handle: frontmatter.handle ?? undefined,
382
+ description: frontmatter.description ?? null,
380
383
  tags: [],
381
384
  actor,
382
385
  }),
@@ -387,7 +390,7 @@ export const uploadWorkflowFromFiles = async (
387
390
  method: "POST",
388
391
  body: JSON.stringify({
389
392
  script,
390
- entrypoint: null,
393
+ entrypoint: frontmatter.entrypoint ?? null,
391
394
  runnable_config: config ?? null,
392
395
  metadata: { source: "studio-upload" },
393
396
  notes: null,
@@ -396,7 +399,9 @@ export const uploadWorkflowFromFiles = async (
396
399
  });
397
400
  } catch (error) {
398
401
  const message =
399
- error instanceof Error ? error.message : "Upload failed. Please try again.";
402
+ error instanceof Error
403
+ ? error.message
404
+ : "Upload failed. Please try again.";
400
405
  const uploadError = saveWorkflowUploadError(created.id, message);
401
406
  const stored = await ensureWorkflow(created.id);
402
407
  invalidateWorkflowListCache();
@@ -450,7 +455,9 @@ export const updateWorkflowFromFiles = async (
450
455
  });
451
456
  } catch (error) {
452
457
  const message =
453
- error instanceof Error ? error.message : "Update failed. Please try again.";
458
+ error instanceof Error
459
+ ? error.message
460
+ : "Update failed. Please try again.";
454
461
  saveWorkflowUploadError(workflowId, message);
455
462
  invalidateWorkflowListCache();
456
463
  invalidateWorkflowCache(workflowId);
@@ -161,12 +161,7 @@ export interface WorkflowListenerHealth {
161
161
  last_event_at?: string | null;
162
162
  last_error?: string | null;
163
163
  runtime_status:
164
- | "starting"
165
- | "healthy"
166
- | "backoff"
167
- | "stopped"
168
- | "error"
169
- | "unknown";
164
+ "starting" | "healthy" | "backoff" | "stopped" | "error" | "unknown";
170
165
  runtime_detail?: string | null;
171
166
  last_polled_at?: string | null;
172
167
  consecutive_failures: number;
@@ -7,7 +7,8 @@ export interface WorkflowUploadError {
7
7
 
8
8
  const STORAGE_PREFIX = "orcheo.workflowUploadError.";
9
9
 
10
- const storageKey = (workflowId: string): string => `${STORAGE_PREFIX}${workflowId}`;
10
+ const storageKey = (workflowId: string): string =>
11
+ `${STORAGE_PREFIX}${workflowId}`;
11
12
 
12
13
  const canUseSessionStorage = (): boolean =>
13
14
  typeof window !== "undefined" && Boolean(window.sessionStorage);
@@ -26,7 +27,10 @@ export const saveWorkflowUploadError = (
26
27
  }
27
28
 
28
29
  try {
29
- window.sessionStorage.setItem(storageKey(workflowId), JSON.stringify(error));
30
+ window.sessionStorage.setItem(
31
+ storageKey(workflowId),
32
+ JSON.stringify(error),
33
+ );
30
34
  } catch {
31
35
  // Upload failure rendering should not depend on storage availability.
32
36
  }
@@ -752,7 +752,9 @@ export function WorkflowTabContent({
752
752
  void handleScheduleToggle(checked)
753
753
  }
754
754
  disabled={
755
- isSchedulePending || !canToggleSchedule || uploadBlocksWorkflow
755
+ isSchedulePending ||
756
+ !canToggleSchedule ||
757
+ uploadBlocksWorkflow
756
758
  }
757
759
  />
758
760
  </div>
@@ -92,7 +92,10 @@ export function useWorkflowExecutionController(
92
92
 
93
93
  const graphToWorkflow = latestVersionRecord?.graphToWorkflow ?? {};
94
94
  const executionId = generateRandomId("run");
95
- const executionRecord = createExecutionRecord(executionId, graphToWorkflow);
95
+ const executionRecord = createExecutionRecord(
96
+ executionId,
97
+ graphToWorkflow,
98
+ );
96
99
 
97
100
  if (core.websocketRef.current) {
98
101
  core.websocketRef.current.close();
@@ -48,8 +48,10 @@ export function useExecutionUpdates({
48
48
  );
49
49
 
50
50
  const describePayload = useCallback(
51
- (payload: Record<string, unknown>, graphToWorkflow: Record<string, string>) =>
52
- describePayloadRaw(payload, graphToWorkflow, (id) => id),
51
+ (
52
+ payload: Record<string, unknown>,
53
+ graphToWorkflow: Record<string, string>,
54
+ ) => describePayloadRaw(payload, graphToWorkflow, (id) => id),
53
55
  [],
54
56
  );
55
57
 
@@ -70,9 +70,7 @@ export const CreateTeamDialog = ({
70
70
  await onCreate(trimmedName, trimmedSlug);
71
71
  onOpenChange(false);
72
72
  } catch (err) {
73
- setError(
74
- err instanceof Error ? err.message : "Failed to create team.",
75
- );
73
+ setError(err instanceof Error ? err.message : "Failed to create team.");
76
74
  } finally {
77
75
  setIsSubmitting(false);
78
76
  }
@@ -118,9 +116,7 @@ export const CreateTeamDialog = ({
118
116
  underscores only.
119
117
  </p>
120
118
  </div>
121
- {error ? (
122
- <p className="text-sm text-destructive">{error}</p>
123
- ) : null}
119
+ {error ? <p className="text-sm text-destructive">{error}</p> : null}
124
120
  </div>
125
121
 
126
122
  <DialogFooter>
package/src/lib/api.ts CHANGED
@@ -250,9 +250,14 @@ async function requestSystemJson<T>(
250
250
  message = detail;
251
251
  } else if (detail && typeof detail === "object" && "error" in detail) {
252
252
  const err = detail.error as Record<string, unknown>;
253
- message = typeof err.message === "string" ? err.message : `HTTP ${response.status}`;
253
+ message =
254
+ typeof err.message === "string"
255
+ ? err.message
256
+ : `HTTP ${response.status}`;
254
257
  } else if (Array.isArray(detail)) {
255
- message = detail.map((e: Record<string, unknown>) => e.msg ?? JSON.stringify(e)).join("; ");
258
+ message = detail
259
+ .map((e: Record<string, unknown>) => e.msg ?? JSON.stringify(e))
260
+ .join("; ");
256
261
  } else {
257
262
  message = `HTTP ${response.status}`;
258
263
  }
package/src/lib/config.ts CHANGED
@@ -1,4 +1,25 @@
1
- const DEFAULT_BACKEND_URL = "http://localhost:2025";
1
+ const VITE_DEV_ORIGINS = new Set([
2
+ "http://localhost:2026",
3
+ "http://127.0.0.1:2026",
4
+ // `vite preview`'s default port. It serves the built SPA standalone (not
5
+ // colocated with the backend), so it must fall back to the dev backend
6
+ // default rather than treating itself as the backend's own origin.
7
+ "http://localhost:4173",
8
+ "http://127.0.0.1:4173",
9
+ ]);
10
+
11
+ const getDefaultBackendUrl = (): string => {
12
+ if (typeof window === "undefined") {
13
+ return "http://localhost:2025";
14
+ }
15
+
16
+ const origin = window.location.origin;
17
+ if (origin && !VITE_DEV_ORIGINS.has(origin)) {
18
+ return origin;
19
+ }
20
+
21
+ return "http://localhost:2025";
22
+ };
2
23
 
3
24
  const trimTrailingSlash = (value: string) => value.replace(/\/+$/, "");
4
25
 
@@ -33,14 +54,15 @@ const normaliseBaseUrl = (value: string): string => {
33
54
 
34
55
  export const getBackendBaseUrl = (): string => {
35
56
  const fromEnv = (import.meta.env?.VITE_ORCHEO_BACKEND_URL ?? "") as string;
36
- const candidate = fromEnv || DEFAULT_BACKEND_URL;
57
+ const defaultBackendUrl = getDefaultBackendUrl();
58
+ const candidate = fromEnv || defaultBackendUrl;
37
59
  const normalised = normaliseBaseUrl(candidate);
38
60
 
39
61
  if (fromEnv && !isValidUrl(normalised)) {
40
62
  console.warn(
41
63
  "Invalid VITE_ORCHEO_BACKEND_URL provided, falling back to default backend URL.",
42
64
  );
43
- return normaliseBaseUrl(DEFAULT_BACKEND_URL);
65
+ return normaliseBaseUrl(defaultBackendUrl);
44
66
  }
45
67
 
46
68
  return normalised;
@@ -63,9 +63,7 @@ export const getWorkspaceTeamWorkflowPath = (
63
63
  if (!ref) {
64
64
  return getWorkspaceGalleryPath(slug);
65
65
  }
66
- return slug
67
- ? `/${slug}/team/${teamSlug}/${ref}`
68
- : `/team/${teamSlug}/${ref}`;
66
+ return slug ? `/${slug}/team/${teamSlug}/${ref}` : `/team/${teamSlug}/${ref}`;
69
67
  };
70
68
 
71
69
  export const getWorkspaceSlugFromPathname = (
@@ -1 +0,0 @@
1
- import{ap as o,aq as n}from"./index-Cnz1aoh0.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-B4BG7PRW-BVmjJQGD.js";import{_ as i}from"./index-Cnz1aoh0.js";import"./chunk-FMBD7UC4-D-PvzEp6.js";import"./chunk-55IACEB6-DMMV3uf8.js";import"./chunk-QN33PNHL-BNp075o8.js";var p={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{p as diagram};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-B4BG7PRW-BVmjJQGD.js";import{_ as i}from"./index-Cnz1aoh0.js";import"./chunk-FMBD7UC4-D-PvzEp6.js";import"./chunk-55IACEB6-DMMV3uf8.js";import"./chunk-QN33PNHL-BNp075o8.js";var p={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{p as diagram};
@@ -1 +0,0 @@
1
- import{ay as r}from"./index-Cnz1aoh0.js";var a=4;function n(o){return r(o,a)}export{n as c};
@@ -1 +0,0 @@
1
- import{s as t,b as r,a,S as s}from"./chunk-DI55MBZ5-3C02UFww.js";import{_ as i}from"./index-Cnz1aoh0.js";import"./chunk-55IACEB6-DMMV3uf8.js";import"./chunk-QN33PNHL-BNp075o8.js";var l={parser:a,get db(){return new s(2)},renderer:r,styles:t,init:i(e=>{e.state||(e.state={}),e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute},"init")};export{l as diagram};