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.
- package/.bumpversion.cfg +1 -1
- package/dist/assets/{arc-De9dLqyl.js → arc-CqnxfCHp.js} +1 -1
- package/dist/assets/{architectureDiagram-VXUJARFQ-hEslfmYm.js → architectureDiagram-VXUJARFQ-UGPIhA1j.js} +1 -1
- package/dist/assets/{blockDiagram-VD42YOAC-CyWSMWJa.js → blockDiagram-VD42YOAC-Cn6wka40.js} +1 -1
- package/dist/assets/{c4Diagram-YG6GDRKO-CxoTVJ47.js → c4Diagram-YG6GDRKO-BvPRNdur.js} +1 -1
- package/dist/assets/channel-FjxqoZWk.js +1 -0
- package/dist/assets/{chunk-4BX2VUAB-twftUw9o.js → chunk-4BX2VUAB-F_o1AmTw.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-DQZDNQUo.js → chunk-55IACEB6-Cl075es2.js} +1 -1
- package/dist/assets/{chunk-B4BG7PRW-BYGOoNB5.js → chunk-B4BG7PRW-DcErQhy9.js} +1 -1
- package/dist/assets/{chunk-DI55MBZ5-qyPhcZF3.js → chunk-DI55MBZ5-CFxCndOp.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-BgUDHGEG.js → chunk-FMBD7UC4-XOcF0fgy.js} +1 -1
- package/dist/assets/{chunk-QN33PNHL-DHlMh8NC.js → chunk-QN33PNHL-CjJH_Bvj.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-Bfc8IV0O.js → chunk-QZHKN3VN-nLb-Go8u.js} +1 -1
- package/dist/assets/{chunk-TZMSLE5B-BqwdftTm.js → chunk-TZMSLE5B-L07ovmT0.js} +1 -1
- package/dist/assets/classDiagram-2ON5EDUG-8JYNY9Ic.js +1 -0
- package/dist/assets/classDiagram-v2-WZHVMYZB-8JYNY9Ic.js +1 -0
- package/dist/assets/clone-NPVQC0Uc.js +1 -0
- package/dist/assets/{cose-bilkent-S5V4N54A-g5agH7fS.js → cose-bilkent-S5V4N54A-B6IcYcMk.js} +1 -1
- package/dist/assets/{dagre-6UL2VRFP-ajLMaXPP.js → dagre-6UL2VRFP-CN7ADhef.js} +1 -1
- package/dist/assets/{diagram-PSM6KHXK-BndVcBhB.js → diagram-PSM6KHXK-3chqLyzk.js} +1 -1
- package/dist/assets/{diagram-QEK2KX5R-BFiIYeu7.js → diagram-QEK2KX5R-MrbKZWaG.js} +1 -1
- package/dist/assets/{diagram-S2PKOQOG-DXy-A9pn.js → diagram-S2PKOQOG-Dr7BijIx.js} +1 -1
- package/dist/assets/{erDiagram-Q2GNP2WA-D_Bac_58.js → erDiagram-Q2GNP2WA-Ck-v9a6N.js} +1 -1
- package/dist/assets/{flowDiagram-NV44I4VS-DhEi8qtz.js → flowDiagram-NV44I4VS-D662eMD1.js} +1 -1
- package/dist/assets/{ganttDiagram-JELNMOA3-BtpUvOuc.js → ganttDiagram-JELNMOA3-c2mXK47M.js} +1 -1
- package/dist/assets/{gitGraphDiagram-V2S2FVAM-MBES60cx.js → gitGraphDiagram-V2S2FVAM-DUMhfhsS.js} +1 -1
- package/dist/assets/{graph-BcwvIN-m.js → graph-DkWlmVun.js} +1 -1
- package/dist/assets/index-BVY_PYJU.css +1 -0
- package/dist/assets/index-kH6EkBsZ.js +790 -0
- package/dist/assets/{infoDiagram-HS3SLOUP-vaIFYyC9.js → infoDiagram-HS3SLOUP-OTL7qvkP.js} +1 -1
- package/dist/assets/{isUndefined-DVO6xakl.js → isUndefined-BmZvH1PX.js} +1 -1
- package/dist/assets/{journeyDiagram-XKPGCS4Q-D-_q99If.js → journeyDiagram-XKPGCS4Q-BYzqE5D8.js} +1 -1
- package/dist/assets/{kanban-definition-3W4ZIXB7-i_AZcs_J.js → kanban-definition-3W4ZIXB7-NtzQ4y9p.js} +1 -1
- package/dist/assets/{layout-CPJ9nR_z.js → layout-CwhyLMkP.js} +1 -1
- package/dist/assets/{linear-KBGpPBiH.js → linear-Cirf2V1x.js} +1 -1
- package/dist/assets/{min-By5f7YdD.js → min-C81vLJYh.js} +1 -1
- package/dist/assets/{mindmap-definition-VGOIOE7T-DRjtRxFS.js → mindmap-definition-VGOIOE7T-TDnLQIKZ.js} +1 -1
- package/dist/assets/{pieDiagram-ADFJNKIX-BkkSglWM.js → pieDiagram-ADFJNKIX-d0-JhjNZ.js} +1 -1
- package/dist/assets/{quadrantDiagram-AYHSOK5B-DY-Ng2qt.js → quadrantDiagram-AYHSOK5B-wCoihp8a.js} +1 -1
- package/dist/assets/{requirementDiagram-UZGBJVZJ-B5w0etXG.js → requirementDiagram-UZGBJVZJ-BqiCIjcI.js} +1 -1
- package/dist/assets/{sankeyDiagram-TZEHDZUN-BWntUp8b.js → sankeyDiagram-TZEHDZUN-BPH0Pd1D.js} +1 -1
- package/dist/assets/{sequenceDiagram-WL72ISMW-Cl77fd7y.js → sequenceDiagram-WL72ISMW-B8FfJraH.js} +1 -1
- package/dist/assets/{stateDiagram-FKZM4ZOC-B8_DoPW6.js → stateDiagram-FKZM4ZOC-ZQR3Q9_8.js} +1 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-uDYn1wPF.js +1 -0
- package/dist/assets/{timeline-definition-IT6M3QCI-udvNLTe_.js → timeline-definition-IT6M3QCI-D-arYxX5.js} +1 -1
- package/dist/assets/{treemap-GDKQZRPO-BSvoMl74.js → treemap-GDKQZRPO-Dw5BHp_B.js} +1 -1
- package/dist/assets/{xychartDiagram-PRI3JC2R-CTdy-FCX.js → xychartDiagram-PRI3JC2R-Dt1zH6V2.js} +1 -1
- package/dist/index.html +2 -2
- package/package.json +1 -1
- package/src/App.tsx +7 -2
- package/src/features/account/pages/invitation-accept.tsx +92 -0
- package/src/features/account/pages/workspace-members.tsx +153 -42
- package/src/features/auth/components/require-auth.tsx +13 -18
- package/src/features/auth/lib/auth-api.ts +196 -0
- package/src/features/auth/lib/auth-session.ts +0 -1
- package/src/features/auth/pages/login.tsx +169 -16
- package/src/features/auth/pages/verify.tsx +89 -0
- package/src/features/chatkit/components/public-chat-widget.tsx +89 -8
- package/src/features/chatkit/lib/chatkit-client.ts +66 -0
- package/src/features/chatkit/pages/public-chat.tsx +17 -30
- package/src/features/shared/components/top-navigation/account-menu.tsx +20 -7
- package/src/features/shared/components/top-navigation/studio-brand.tsx +14 -3
- package/src/features/workflow/components/dialogs/publish-workflow-dialog.tsx +121 -0
- package/src/features/workflow/data/templates/candidate-badges.ts +28 -0
- package/src/features/workflow/data/workflow-types.ts +6 -0
- package/src/features/workflow/lib/workflow-storage-helpers.ts +5 -3
- package/src/features/workflow/lib/workflow-storage-versioning.ts +4 -0
- package/src/features/workflow/lib/workflow-storage.types.ts +1 -0
- package/src/features/workflow/pages/workflow/components/workflow-tab-content.tsx +122 -37
- package/src/features/workflow/pages/workflow/hooks/controller/build-layout-props.ts +2 -0
- package/src/features/workflow/pages/workflow/hooks/controller/use-workflow-lifecycle.ts +1 -0
- package/src/features/workflow/pages/workflow/hooks/use-workflow-loader.ts +5 -0
- package/src/features/workflow/pages/workflow/hooks/use-workflow-metadata-state.ts +3 -0
- package/src/features/workflow/pages/workflow/hooks/use-workflow-saver.ts +11 -2
- package/src/features/workflow/pages/workflow-gallery/workflow-gallery-tabs.tsx +47 -4
- package/src/lib/api.ts +78 -1
- package/src/vite-env.d.ts +1 -0
- package/dist/assets/channel-CzCzGn0f.js +0 -1
- package/dist/assets/classDiagram-2ON5EDUG-ekNI5d_4.js +0 -1
- package/dist/assets/classDiagram-v2-WZHVMYZB-ekNI5d_4.js +0 -1
- package/dist/assets/clone-DowBu1Kh.js +0 -1
- package/dist/assets/index-DLYzf0K-.js +0 -775
- package/dist/assets/index-DebsXgfj.css +0 -1
- package/dist/assets/stateDiagram-v2-4FDKWEC3-DHL7p-md.js +0 -1
- package/src/features/MODULES.md +0 -199
- package/src/features/auth/components/auto-login.tsx +0 -51
- package/src/features/auth/lib/oidc-client.ts +0 -565
- 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
|
|
88
|
-
//
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
@@ -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};
|