orcheo-studio 0.22.2 → 0.23.1

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 (88) hide show
  1. package/.bumpversion.cfg +1 -1
  2. package/dist/assets/{arc-De9dLqyl.js → arc-CqnxfCHp.js} +1 -1
  3. package/dist/assets/{architectureDiagram-VXUJARFQ-hEslfmYm.js → architectureDiagram-VXUJARFQ-UGPIhA1j.js} +1 -1
  4. package/dist/assets/{blockDiagram-VD42YOAC-CyWSMWJa.js → blockDiagram-VD42YOAC-Cn6wka40.js} +1 -1
  5. package/dist/assets/{c4Diagram-YG6GDRKO-CxoTVJ47.js → c4Diagram-YG6GDRKO-BvPRNdur.js} +1 -1
  6. package/dist/assets/channel-FjxqoZWk.js +1 -0
  7. package/dist/assets/{chunk-4BX2VUAB-twftUw9o.js → chunk-4BX2VUAB-F_o1AmTw.js} +1 -1
  8. package/dist/assets/{chunk-55IACEB6-DQZDNQUo.js → chunk-55IACEB6-Cl075es2.js} +1 -1
  9. package/dist/assets/{chunk-B4BG7PRW-BYGOoNB5.js → chunk-B4BG7PRW-DcErQhy9.js} +1 -1
  10. package/dist/assets/{chunk-DI55MBZ5-qyPhcZF3.js → chunk-DI55MBZ5-CFxCndOp.js} +1 -1
  11. package/dist/assets/{chunk-FMBD7UC4-BgUDHGEG.js → chunk-FMBD7UC4-XOcF0fgy.js} +1 -1
  12. package/dist/assets/{chunk-QN33PNHL-DHlMh8NC.js → chunk-QN33PNHL-CjJH_Bvj.js} +1 -1
  13. package/dist/assets/{chunk-QZHKN3VN-Bfc8IV0O.js → chunk-QZHKN3VN-nLb-Go8u.js} +1 -1
  14. package/dist/assets/{chunk-TZMSLE5B-BqwdftTm.js → chunk-TZMSLE5B-L07ovmT0.js} +1 -1
  15. package/dist/assets/classDiagram-2ON5EDUG-8JYNY9Ic.js +1 -0
  16. package/dist/assets/classDiagram-v2-WZHVMYZB-8JYNY9Ic.js +1 -0
  17. package/dist/assets/clone-NPVQC0Uc.js +1 -0
  18. package/dist/assets/{cose-bilkent-S5V4N54A-g5agH7fS.js → cose-bilkent-S5V4N54A-B6IcYcMk.js} +1 -1
  19. package/dist/assets/{dagre-6UL2VRFP-ajLMaXPP.js → dagre-6UL2VRFP-CN7ADhef.js} +1 -1
  20. package/dist/assets/{diagram-PSM6KHXK-BndVcBhB.js → diagram-PSM6KHXK-3chqLyzk.js} +1 -1
  21. package/dist/assets/{diagram-QEK2KX5R-BFiIYeu7.js → diagram-QEK2KX5R-MrbKZWaG.js} +1 -1
  22. package/dist/assets/{diagram-S2PKOQOG-DXy-A9pn.js → diagram-S2PKOQOG-Dr7BijIx.js} +1 -1
  23. package/dist/assets/{erDiagram-Q2GNP2WA-D_Bac_58.js → erDiagram-Q2GNP2WA-Ck-v9a6N.js} +1 -1
  24. package/dist/assets/{flowDiagram-NV44I4VS-DhEi8qtz.js → flowDiagram-NV44I4VS-D662eMD1.js} +1 -1
  25. package/dist/assets/{ganttDiagram-JELNMOA3-BtpUvOuc.js → ganttDiagram-JELNMOA3-c2mXK47M.js} +1 -1
  26. package/dist/assets/{gitGraphDiagram-V2S2FVAM-MBES60cx.js → gitGraphDiagram-V2S2FVAM-DUMhfhsS.js} +1 -1
  27. package/dist/assets/{graph-BcwvIN-m.js → graph-DkWlmVun.js} +1 -1
  28. package/dist/assets/index-BVY_PYJU.css +1 -0
  29. package/dist/assets/index-kH6EkBsZ.js +790 -0
  30. package/dist/assets/{infoDiagram-HS3SLOUP-vaIFYyC9.js → infoDiagram-HS3SLOUP-OTL7qvkP.js} +1 -1
  31. package/dist/assets/{isUndefined-DVO6xakl.js → isUndefined-BmZvH1PX.js} +1 -1
  32. package/dist/assets/{journeyDiagram-XKPGCS4Q-D-_q99If.js → journeyDiagram-XKPGCS4Q-BYzqE5D8.js} +1 -1
  33. package/dist/assets/{kanban-definition-3W4ZIXB7-i_AZcs_J.js → kanban-definition-3W4ZIXB7-NtzQ4y9p.js} +1 -1
  34. package/dist/assets/{layout-CPJ9nR_z.js → layout-CwhyLMkP.js} +1 -1
  35. package/dist/assets/{linear-KBGpPBiH.js → linear-Cirf2V1x.js} +1 -1
  36. package/dist/assets/{min-By5f7YdD.js → min-C81vLJYh.js} +1 -1
  37. package/dist/assets/{mindmap-definition-VGOIOE7T-DRjtRxFS.js → mindmap-definition-VGOIOE7T-TDnLQIKZ.js} +1 -1
  38. package/dist/assets/{pieDiagram-ADFJNKIX-BkkSglWM.js → pieDiagram-ADFJNKIX-d0-JhjNZ.js} +1 -1
  39. package/dist/assets/{quadrantDiagram-AYHSOK5B-DY-Ng2qt.js → quadrantDiagram-AYHSOK5B-wCoihp8a.js} +1 -1
  40. package/dist/assets/{requirementDiagram-UZGBJVZJ-B5w0etXG.js → requirementDiagram-UZGBJVZJ-BqiCIjcI.js} +1 -1
  41. package/dist/assets/{sankeyDiagram-TZEHDZUN-BWntUp8b.js → sankeyDiagram-TZEHDZUN-BPH0Pd1D.js} +1 -1
  42. package/dist/assets/{sequenceDiagram-WL72ISMW-Cl77fd7y.js → sequenceDiagram-WL72ISMW-B8FfJraH.js} +1 -1
  43. package/dist/assets/{stateDiagram-FKZM4ZOC-B8_DoPW6.js → stateDiagram-FKZM4ZOC-ZQR3Q9_8.js} +1 -1
  44. package/dist/assets/stateDiagram-v2-4FDKWEC3-uDYn1wPF.js +1 -0
  45. package/dist/assets/{timeline-definition-IT6M3QCI-udvNLTe_.js → timeline-definition-IT6M3QCI-D-arYxX5.js} +1 -1
  46. package/dist/assets/{treemap-GDKQZRPO-BSvoMl74.js → treemap-GDKQZRPO-Dw5BHp_B.js} +1 -1
  47. package/dist/assets/{xychartDiagram-PRI3JC2R-CTdy-FCX.js → xychartDiagram-PRI3JC2R-Dt1zH6V2.js} +1 -1
  48. package/dist/index.html +2 -2
  49. package/package.json +1 -1
  50. package/src/App.tsx +7 -2
  51. package/src/features/account/pages/invitation-accept.tsx +92 -0
  52. package/src/features/account/pages/workspace-members.tsx +153 -42
  53. package/src/features/auth/components/require-auth.tsx +13 -18
  54. package/src/features/auth/lib/auth-api.ts +196 -0
  55. package/src/features/auth/lib/auth-session.ts +0 -1
  56. package/src/features/auth/pages/login.tsx +169 -16
  57. package/src/features/auth/pages/verify.tsx +89 -0
  58. package/src/features/chatkit/components/public-chat-widget.tsx +89 -8
  59. package/src/features/chatkit/lib/chatkit-client.ts +66 -0
  60. package/src/features/chatkit/pages/public-chat.tsx +17 -30
  61. package/src/features/shared/components/top-navigation/account-menu.tsx +20 -7
  62. package/src/features/shared/components/top-navigation/studio-brand.tsx +14 -3
  63. package/src/features/workflow/components/dialogs/publish-workflow-dialog.tsx +121 -0
  64. package/src/features/workflow/data/templates/candidate-badges.ts +28 -0
  65. package/src/features/workflow/data/workflow-types.ts +6 -0
  66. package/src/features/workflow/lib/workflow-storage-helpers.ts +5 -3
  67. package/src/features/workflow/lib/workflow-storage-versioning.ts +4 -0
  68. package/src/features/workflow/lib/workflow-storage.types.ts +1 -0
  69. package/src/features/workflow/pages/workflow/components/workflow-tab-content.tsx +122 -37
  70. package/src/features/workflow/pages/workflow/hooks/controller/build-layout-props.ts +2 -0
  71. package/src/features/workflow/pages/workflow/hooks/controller/use-workflow-lifecycle.ts +1 -0
  72. package/src/features/workflow/pages/workflow/hooks/use-workflow-loader.ts +5 -0
  73. package/src/features/workflow/pages/workflow/hooks/use-workflow-metadata-state.ts +3 -0
  74. package/src/features/workflow/pages/workflow/hooks/use-workflow-saver.ts +11 -2
  75. package/src/features/workflow/pages/workflow-gallery/workflow-gallery-tabs.tsx +47 -4
  76. package/src/lib/api.ts +78 -1
  77. package/src/vite-env.d.ts +1 -0
  78. package/dist/assets/channel-CzCzGn0f.js +0 -1
  79. package/dist/assets/classDiagram-2ON5EDUG-ekNI5d_4.js +0 -1
  80. package/dist/assets/classDiagram-v2-WZHVMYZB-ekNI5d_4.js +0 -1
  81. package/dist/assets/clone-DowBu1Kh.js +0 -1
  82. package/dist/assets/index-DLYzf0K-.js +0 -775
  83. package/dist/assets/index-DebsXgfj.css +0 -1
  84. package/dist/assets/stateDiagram-v2-4FDKWEC3-DHL7p-md.js +0 -1
  85. package/src/features/MODULES.md +0 -199
  86. package/src/features/auth/components/auto-login.tsx +0 -51
  87. package/src/features/auth/lib/oidc-client.ts +0 -565
  88. package/src/features/auth/pages/oauth-callback.tsx +0 -63
@@ -9,6 +9,7 @@ import {
9
9
  } from "@/design-system/ui/tabs";
10
10
  import { Loader2, Search, Upload, Zap } from "lucide-react";
11
11
  import { type Workflow } from "@features/workflow/data/workflow-data";
12
+ import { formatCandidateGroupName } from "@features/workflow/data/templates/candidate-badges";
12
13
  import { type ApiTeam } from "@features/workflow/lib/workflow-storage-api";
13
14
  import { UploadWorkflowDialog } from "@features/workflow/components/dialogs/upload-workflow-dialog";
14
15
  import { useUploadsAllowed } from "@/hooks/use-uploads-allowed";
@@ -84,11 +85,53 @@ export const WorkflowGalleryTabs = ({
84
85
  </div>
85
86
  );
86
87
 
87
- // Group colleagues into vertical, collapsible team sections. Candidate
88
- // (template) view stays flat since candidates are not yet assigned a team.
88
+ // Group candidates into vertical, collapsible sections that mirror the
89
+ // grouping of the colleague-candidates repository (one level under
90
+ // `colleagues/`). Independent candidates — those that live directly under
91
+ // `colleagues/` — stay in a flat grid above the grouped sections.
92
+ const renderCandidates = () => {
93
+ const independents: Workflow[] = [];
94
+ const byGroup = new Map<string, Workflow[]>();
95
+ for (const workflow of sortedWorkflows) {
96
+ const group = workflow.candidateGroup;
97
+ if (!group) {
98
+ independents.push(workflow);
99
+ continue;
100
+ }
101
+ const bucket = byGroup.get(group);
102
+ if (bucket) {
103
+ bucket.push(workflow);
104
+ } else {
105
+ byGroup.set(group, [workflow]);
106
+ }
107
+ }
108
+
109
+ // Nothing is grouped — keep the flat grid.
110
+ if (byGroup.size === 0) {
111
+ return renderGrid(sortedWorkflows);
112
+ }
113
+
114
+ return (
115
+ <div className="flex flex-col gap-1 pb-6">
116
+ {independents.length > 0 ? renderGrid(independents) : null}
117
+ {[...byGroup.entries()].map(([slug, items]) => (
118
+ <TeamSection
119
+ key={slug}
120
+ name={formatCandidateGroupName(slug)}
121
+ count={items.length}
122
+ >
123
+ {renderGrid(items)}
124
+ </TeamSection>
125
+ ))}
126
+ </div>
127
+ );
128
+ };
129
+
130
+ // Group colleagues into vertical, collapsible team sections. Candidates are
131
+ // grouped to mirror the colleague-candidates repository layout instead.
89
132
  const renderColleagues = () => {
90
133
  if (isTemplateView) {
91
- return renderGrid(sortedWorkflows);
134
+ return renderCandidates();
92
135
  }
93
136
 
94
137
  // No teams yet — fall back to flat grid (e.g. during first load).
@@ -159,7 +202,7 @@ export const WorkflowGalleryTabs = ({
159
202
  <div className="flex flex-col gap-4 md:flex-row md:items-center md:gap-4">
160
203
  <TabsList className="flex h-auto flex-wrap justify-start gap-1">
161
204
  <TabsTrigger value="all" className="gap-2">
162
- <span>AI Colleagues</span>
205
+ <span>AI Teams</span>
163
206
  <span className="text-xs text-muted-foreground">
164
207
  {tabCounts.all}
165
208
  </span>
package/src/lib/api.ts CHANGED
@@ -266,7 +266,8 @@ export interface WorkspaceMember {
266
266
  id: string;
267
267
  workspace_id: string;
268
268
  user_id: string;
269
- user_name?: string;
269
+ email?: string | null;
270
+ user_name?: string | null;
270
271
  role: "owner" | "admin" | "editor" | "viewer";
271
272
  created_at: string;
272
273
  }
@@ -326,6 +327,82 @@ export async function removeWorkspaceMember(
326
327
  }
327
328
  }
328
329
 
330
+ export type WorkspaceRole = "owner" | "admin" | "editor" | "viewer";
331
+
332
+ export type InvitationStatus = "pending" | "accepted" | "revoked";
333
+
334
+ export interface WorkspaceInvitation {
335
+ id: string;
336
+ workspace_id: string;
337
+ email: string;
338
+ role: WorkspaceRole;
339
+ status: InvitationStatus;
340
+ invited_by?: string | null;
341
+ accepted_by?: string | null;
342
+ created_at: string;
343
+ expires_at: string;
344
+ accepted_at?: string | null;
345
+ }
346
+
347
+ interface WorkspaceInvitationListResponse {
348
+ invitations: WorkspaceInvitation[];
349
+ }
350
+
351
+ export interface InvitationAcceptResult {
352
+ workspace_id: string;
353
+ slug: string;
354
+ name: string;
355
+ role: WorkspaceRole;
356
+ }
357
+
358
+ export async function listWorkspaceInvitations(
359
+ slug: string,
360
+ baseUrl?: string,
361
+ ): Promise<WorkspaceInvitation[]> {
362
+ const data = await requestSystemJson<WorkspaceInvitationListResponse>(
363
+ `/api/workspaces/${slug}/invitations`,
364
+ { method: "GET" },
365
+ baseUrl,
366
+ );
367
+ return data.invitations;
368
+ }
369
+
370
+ export async function createWorkspaceInvitation(
371
+ slug: string,
372
+ request: { email: string; role: WorkspaceRole },
373
+ baseUrl?: string,
374
+ ): Promise<WorkspaceInvitation> {
375
+ return requestSystemJson<WorkspaceInvitation>(
376
+ `/api/workspaces/${slug}/invitations`,
377
+ { method: "POST", body: JSON.stringify(request) },
378
+ baseUrl,
379
+ );
380
+ }
381
+
382
+ export async function revokeWorkspaceInvitation(
383
+ slug: string,
384
+ invitationId: string,
385
+ baseUrl?: string,
386
+ ): Promise<WorkspaceInvitation> {
387
+ return requestSystemJson<WorkspaceInvitation>(
388
+ `/api/workspaces/${slug}/invitations/${invitationId}`,
389
+ { method: "DELETE" },
390
+ baseUrl,
391
+ );
392
+ }
393
+
394
+ export async function acceptWorkspaceInvitation(
395
+ token: string,
396
+ baseUrl?: string,
397
+ ): Promise<InvitationAcceptResult> {
398
+ return requestSystemJson<InvitationAcceptResult>(
399
+ "/api/workspaces/invitations/accept",
400
+ { method: "POST", body: JSON.stringify({ token }) },
401
+ baseUrl,
402
+ { includeWorkspaceHeaders: false },
403
+ );
404
+ }
405
+
329
406
  export interface ServiceToken {
330
407
  identifier: string;
331
408
  secret?: string | null;
package/src/vite-env.d.ts CHANGED
@@ -3,6 +3,7 @@
3
3
  interface ImportMetaEnv {
4
4
  readonly VITE_ORCHEO_BACKEND_URL?: string;
5
5
  readonly VITE_ORCHEO_CHATKIT_DOMAIN_KEY?: string;
6
+ readonly VITE_ORCHEO_AUTH_DISABLED?: string;
6
7
  }
7
8
 
8
9
  interface ImportMeta {
@@ -1 +0,0 @@
1
- import{ap as o,aq as n}from"./index-DLYzf0K-.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-BYGOoNB5.js";import{_ as i}from"./index-DLYzf0K-.js";import"./chunk-FMBD7UC4-BgUDHGEG.js";import"./chunk-55IACEB6-DQZDNQUo.js";import"./chunk-QN33PNHL-DHlMh8NC.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-BYGOoNB5.js";import{_ as i}from"./index-DLYzf0K-.js";import"./chunk-FMBD7UC4-BgUDHGEG.js";import"./chunk-55IACEB6-DQZDNQUo.js";import"./chunk-QN33PNHL-DHlMh8NC.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-DLYzf0K-.js";var a=4;function n(o){return r(o,a)}export{n as c};