@arbidocs/blocks 0.5.95 → 0.5.97

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 (109) hide show
  1. package/README.md +21 -8
  2. package/dist/{ConnectedNativeDocxComparison-FNHQKY57.js → ConnectedNativeDocxComparison-6KL5XI3L.js} +6 -6
  3. package/dist/{ConnectedNativeDocxComparison-FNHQKY57.js.map → ConnectedNativeDocxComparison-6KL5XI3L.js.map} +1 -1
  4. package/dist/{ConnectedNativeDocxComparison-KIMSYQV2.cjs → ConnectedNativeDocxComparison-P346QOX5.cjs} +7 -7
  5. package/dist/{ConnectedNativeDocxComparison-KIMSYQV2.cjs.map → ConnectedNativeDocxComparison-P346QOX5.cjs.map} +1 -1
  6. package/dist/{ConnectedNativeDocxEditor-UOZGILPM.cjs → ConnectedNativeDocxEditor-7JHSQ6KI.cjs} +7 -7
  7. package/dist/{ConnectedNativeDocxEditor-UOZGILPM.cjs.map → ConnectedNativeDocxEditor-7JHSQ6KI.cjs.map} +1 -1
  8. package/dist/{ConnectedNativeDocxEditor-WFDFGJYW.js → ConnectedNativeDocxEditor-ATZ2TG2L.js} +5 -5
  9. package/dist/{ConnectedNativeDocxEditor-WFDFGJYW.js.map → ConnectedNativeDocxEditor-ATZ2TG2L.js.map} +1 -1
  10. package/dist/{ConnectedStreamedWordArtifact-WFKYXIX5.cjs → ConnectedStreamedWordArtifact-5HI3WSAJ.cjs} +7 -7
  11. package/dist/ConnectedStreamedWordArtifact-5HI3WSAJ.cjs.map +1 -0
  12. package/dist/{ConnectedStreamedWordArtifact-SFELZUTS.js → ConnectedStreamedWordArtifact-FHSGQHXQ.js} +6 -6
  13. package/dist/{ConnectedStreamedWordArtifact-SFELZUTS.js.map → ConnectedStreamedWordArtifact-FHSGQHXQ.js.map} +1 -1
  14. package/dist/{DocumentReviewCard-X5DXEU2G.js → DocumentReviewCard-7UFQGDOG.js} +3 -3
  15. package/dist/{DocumentReviewCard-X5DXEU2G.js.map → DocumentReviewCard-7UFQGDOG.js.map} +1 -1
  16. package/dist/{DocumentReviewCard-7XUBPCQD.cjs → DocumentReviewCard-E3HB3K2G.cjs} +3 -3
  17. package/dist/{DocumentReviewCard-7XUBPCQD.cjs.map → DocumentReviewCard-E3HB3K2G.cjs.map} +1 -1
  18. package/dist/{FilesViewerDialog-H4ZXFNLV.cjs → FilesViewerDialog-3KWTQARB.cjs} +41 -32
  19. package/dist/FilesViewerDialog-3KWTQARB.cjs.map +1 -0
  20. package/dist/{FilesViewerDialog-4Q6WJMSX.js → FilesViewerDialog-EQKBFAWI.js} +40 -31
  21. package/dist/FilesViewerDialog-EQKBFAWI.js.map +1 -0
  22. package/dist/WorkspaceTableView-DYABS53K.js +1 -1
  23. package/dist/WorkspaceTableView-ZIQ7JWT5.cjs +1 -1
  24. package/dist/agents/index.cjs +254 -254
  25. package/dist/agents/index.js +4 -4
  26. package/dist/agents/workflows/WorkflowStepAction.d.ts +9 -2
  27. package/dist/agents/workflows/requiredLabels.d.ts +7 -2
  28. package/dist/{chunk-CY2K4K5M.js → chunk-42IVGYNL.js} +4 -4
  29. package/dist/{chunk-CY2K4K5M.js.map → chunk-42IVGYNL.js.map} +1 -1
  30. package/dist/{chunk-45M4QWCM.js → chunk-4LTDELP2.js} +3 -3
  31. package/dist/{chunk-45M4QWCM.js.map → chunk-4LTDELP2.js.map} +1 -1
  32. package/dist/{chunk-NIXAAPIG.js → chunk-4RCLA52C.js} +5 -5
  33. package/dist/{chunk-NIXAAPIG.js.map → chunk-4RCLA52C.js.map} +1 -1
  34. package/dist/{chunk-CJBDBBN2.cjs → chunk-6IS3IRUF.cjs} +4 -4
  35. package/dist/{chunk-CJBDBBN2.cjs.map → chunk-6IS3IRUF.cjs.map} +1 -1
  36. package/dist/{chunk-I4PB257E.js → chunk-76O7J6IZ.js} +3 -3
  37. package/dist/{chunk-I4PB257E.js.map → chunk-76O7J6IZ.js.map} +1 -1
  38. package/dist/{chunk-ZSWMRG72.cjs → chunk-AINS6VU6.cjs} +4 -4
  39. package/dist/{chunk-ZSWMRG72.cjs.map → chunk-AINS6VU6.cjs.map} +1 -1
  40. package/dist/{chunk-U4ZLFL6M.cjs → chunk-CCALU47C.cjs} +5 -5
  41. package/dist/{chunk-U4ZLFL6M.cjs.map → chunk-CCALU47C.cjs.map} +1 -1
  42. package/dist/{chunk-5ZWEUUJN.cjs → chunk-ECCV4YOL.cjs} +8 -8
  43. package/dist/{chunk-5ZWEUUJN.cjs.map → chunk-ECCV4YOL.cjs.map} +1 -1
  44. package/dist/{chunk-D3ABKS7T.cjs → chunk-HDPT7D6F.cjs} +3 -3
  45. package/dist/{chunk-D3ABKS7T.cjs.map → chunk-HDPT7D6F.cjs.map} +1 -1
  46. package/dist/{chunk-MBXQSBG3.cjs → chunk-J4CXF4A7.cjs} +170 -12
  47. package/dist/chunk-J4CXF4A7.cjs.map +1 -0
  48. package/dist/{chunk-TG4S236F.js → chunk-LZI4EGOW.js} +206 -53
  49. package/dist/chunk-LZI4EGOW.js.map +1 -0
  50. package/dist/{chunk-AJ4TBTA3.js → chunk-PCAWLVHE.js} +3 -3
  51. package/dist/{chunk-AJ4TBTA3.js.map → chunk-PCAWLVHE.js.map} +1 -1
  52. package/dist/{chunk-O5MH74TI.js → chunk-QSBPOYWA.js} +3 -3
  53. package/dist/{chunk-O5MH74TI.js.map → chunk-QSBPOYWA.js.map} +1 -1
  54. package/dist/{chunk-H2DG5HIO.js → chunk-RZG4ALKZ.js} +3 -3
  55. package/dist/{chunk-H2DG5HIO.js.map → chunk-RZG4ALKZ.js.map} +1 -1
  56. package/dist/{chunk-CVYFX7AD.js → chunk-SEBNGA3F.js} +31 -15
  57. package/dist/chunk-SEBNGA3F.js.map +1 -0
  58. package/dist/{chunk-6HI5OXB6.cjs → chunk-SYWJNSPS.cjs} +3 -3
  59. package/dist/{chunk-6HI5OXB6.cjs.map → chunk-SYWJNSPS.cjs.map} +1 -1
  60. package/dist/{chunk-SOBLG72E.js → chunk-T7LLYVOW.js} +166 -8
  61. package/dist/chunk-T7LLYVOW.js.map +1 -0
  62. package/dist/{chunk-VVQEEHDV.cjs → chunk-V2CNHRLZ.cjs} +4 -4
  63. package/dist/{chunk-VVQEEHDV.cjs.map → chunk-V2CNHRLZ.cjs.map} +1 -1
  64. package/dist/{chunk-KTHBUDYQ.cjs → chunk-WN7XPEYK.cjs} +5 -5
  65. package/dist/{chunk-KTHBUDYQ.cjs.map → chunk-WN7XPEYK.cjs.map} +1 -1
  66. package/dist/{chunk-DCHNB7DF.cjs → chunk-XM4KRGCK.cjs} +246 -93
  67. package/dist/chunk-XM4KRGCK.cjs.map +1 -0
  68. package/dist/{chunk-CIXA5A65.cjs → chunk-YZ6YOOTF.cjs} +30 -14
  69. package/dist/chunk-YZ6YOOTF.cjs.map +1 -0
  70. package/dist/{chunk-HU3MX5PY.js → chunk-Z4IPTLRS.js} +3 -3
  71. package/dist/{chunk-HU3MX5PY.js.map → chunk-Z4IPTLRS.js.map} +1 -1
  72. package/dist/connect/docx.cjs +10 -10
  73. package/dist/connect/docx.js +6 -6
  74. package/dist/connect/index.cjs +279 -249
  75. package/dist/connect/index.cjs.map +1 -1
  76. package/dist/connect/index.js +52 -22
  77. package/dist/connect/index.js.map +1 -1
  78. package/dist/connect/viewer.cjs +3 -3
  79. package/dist/connect/viewer.js +2 -2
  80. package/dist/connection/files/page/ConnectedFilesPage.d.ts +11 -7
  81. package/dist/connection/viewer/DocumentViewerDialog.d.ts +3 -0
  82. package/dist/connection/viewer/documentPlace.d.ts +10 -4
  83. package/dist/connection/workflows/ConnectedWorkflowRunPage.d.ts +4 -3
  84. package/dist/connection/workflows/WorkflowRunPage.d.ts +18 -15
  85. package/dist/connection/workflows/index.d.ts +2 -1
  86. package/dist/connection/workflows/runProject.d.ts +47 -0
  87. package/dist/embed/index.cjs +2 -2
  88. package/dist/embed/index.js +2 -2
  89. package/dist/facts/index.cjs +43 -43
  90. package/dist/facts/index.js +2 -2
  91. package/dist/index.cjs +307 -307
  92. package/dist/index.js +6 -6
  93. package/dist/settings/index.cjs +1 -1
  94. package/dist/settings/index.js +1 -1
  95. package/dist/workflow-canvas/index.cjs +23 -23
  96. package/dist/workflow-canvas/index.js +8 -8
  97. package/dist/workspaces/index.cjs +8 -8
  98. package/dist/workspaces/index.js +1 -1
  99. package/node_modules/@arbidocs/coedit/package.json +1 -1
  100. package/package.json +5 -5
  101. package/dist/ConnectedStreamedWordArtifact-WFKYXIX5.cjs.map +0 -1
  102. package/dist/FilesViewerDialog-4Q6WJMSX.js.map +0 -1
  103. package/dist/FilesViewerDialog-H4ZXFNLV.cjs.map +0 -1
  104. package/dist/chunk-CIXA5A65.cjs.map +0 -1
  105. package/dist/chunk-CVYFX7AD.js.map +0 -1
  106. package/dist/chunk-DCHNB7DF.cjs.map +0 -1
  107. package/dist/chunk-MBXQSBG3.cjs.map +0 -1
  108. package/dist/chunk-SOBLG72E.js.map +0 -1
  109. package/dist/chunk-TG4S236F.js.map +0 -1
@@ -1,31 +1,31 @@
1
1
  "use client";
2
- import { ProjectOptionRow, ProjectPicker } from './chunk-CVYFX7AD.js';
2
+ import { ProjectOptionRow, ProjectPicker } from './chunk-SEBNGA3F.js';
3
3
  import { workspaceGroupStats, isAgentAccount, workspaceConversationCount, workspaceDocumentCount } from './chunk-57CG33XJ.js';
4
4
  import { useConnectedThreadActivity, useSelectWorkspace } from './chunk-Y7UHKEVT.js';
5
5
  import { DocumentUser } from './chunk-5T5CM7UC.js';
6
- import { useConnectedWorkflowScopeSource, ConnectedWorkflowDocumentsField, useConnectedWorkspaceRole, ConnectedNativeDocxEditor } from './chunk-CY2K4K5M.js';
6
+ import { useConnectedWorkflowScopeSource, ConnectedWorkflowDocumentsField, useConnectedWorkspaceRole, ConnectedNativeDocxEditor } from './chunk-42IVGYNL.js';
7
7
  import { useOpenWorkflow } from './chunk-K2U5BCQ2.js';
8
8
  import { RenameDialog } from './chunk-N77UYRV7.js';
9
9
  import { SignDocumentDialog } from './chunk-2YOVK524.js';
10
10
  import { ThreadFollowMenuItem } from './chunk-66NMPTOH.js';
11
11
  import { PageHeader } from './chunk-XCVLUXFP.js';
12
- import { useWorkflowUsage, WEB_WORKFLOWS, DASHBOARD_PINNED, CUSTOM_TASK, REMIND_TASK, DASHBOARD_OPERATIONS, sortByRecentUse, taskComposerToCreateRequest, taskComposerToUpdateRequest, composerToWorkflowUpdate, moveTargets, workflowToComposerValues, REMIND_TASK_ID, CUSTOM_TASK_ID, taskToComposerValues, TaskComposer, renderWorkflowIcon, TaskPlan, TaskRunsDialog, TaskActivityDialog, WorkflowThreadStartedBy, matchRequiredLabels, requiredLabelsOf, withLabelIds, WorkflowStepBar, WorkflowThreadStrip, WorkflowStepAction, WorkflowRunner, useWorkflowView } from './chunk-SOBLG72E.js';
12
+ import { useWorkflowUsage, WEB_WORKFLOWS, DASHBOARD_PINNED, CUSTOM_TASK, REMIND_TASK, DASHBOARD_OPERATIONS, sortByRecentUse, taskComposerToCreateRequest, taskComposerToUpdateRequest, composerToWorkflowUpdate, moveTargets, workflowToComposerValues, REMIND_TASK_ID, CUSTOM_TASK_ID, taskToComposerValues, TaskComposer, renderWorkflowIcon, TaskPlan, TaskRunsDialog, TaskActivityDialog, WorkflowThreadStartedBy, matchRequiredLabels, requiredLabelsOf, withLabelIds, WorkflowStepBar, WorkflowThreadStrip, WorkflowStepAction, WorkflowRunner, useWorkflowView } from './chunk-T7LLYVOW.js';
13
13
  import { AUTOMATION_EVENTS, fromPlanSteps, TaskFlow, toPlanSteps } from './chunk-RIBQCTBQ.js';
14
- import { PersonPill } from './chunk-H2DG5HIO.js';
14
+ import { PersonPill, SchemaForm } from './chunk-RZG4ALKZ.js';
15
+ import { listTimeZones, detectTimeZone } from './chunk-OJIX5NBN.js';
15
16
  import { useDocumentFilter } from './chunk-CCUXCN4M.js';
16
17
  import { useConnectedWorkspace } from './chunk-JVJOIZNN.js';
17
- import { listTimeZones, detectTimeZone } from './chunk-OJIX5NBN.js';
18
18
  import { useOpenCitation } from './chunk-K57LFBUW.js';
19
19
  import { ChatPage } from './chunk-GWAL6O7B.js';
20
20
  import { stepDocuments, stepKindOf } from './chunk-U6C4R6J4.js';
21
21
  import { stepStatesFromActivity, splitDocRef, stepLevels, canAssign, assigneeName, runFieldsOf, initialRunInputs, workflowSteps, runThreadTitle, stepFields } from './chunk-MMSBCSGH.js';
22
- import { mergeSkillWorkflows } from './chunk-YQPI7SRN.js';
22
+ import { mergeSkillWorkflows, defaultInputs, validateInputs } from './chunk-YQPI7SRN.js';
23
23
  import { fmtDate } from './chunk-X5YMI6A7.js';
24
24
  import { useBlocksEnvironment } from './chunk-3KA6GZUW.js';
25
25
  import { ModalScaffold } from './chunk-TX2ZICS7.js';
26
- import { useUserSettings, useSkills, useRunWorkflow, useStartTaskQuery, useCreateWorkflow, useUpdateConversation, useUpdateWorkflow, useArbiSessionState, useCreateWork, useGrantAgentAccess, useDocuments, useTags, useWorkflows, useAgents, useWorkspaces, useWorkItems, usePlanWork, useWorkflowRuns, useConversationActivity, useWorkspaceUsers, useArbiSession, useConversationItems, useCanEditShared, useActOnStep, useFollowThread, useArbi, useCreateTag, useProjects, useProjectUsage, ConversationScope, useConversation, useArbiSessionStore, useAgentWorkspaces, useConversations, useConversationThreads, useCreateProject } from '@arbidocs/react';
26
+ import { useUserSettings, useSkills, useRunWorkflow, useStartTaskQuery, useCreateWorkflow, useUpdateConversation, useUpdateWorkflow, useArbiSessionState, useCreateWork, useGrantAgentAccess, useDocuments, useTags, useWorkflows, useAgents, useWorkspaces, useWorkItems, usePlanWork, useWorkflowRuns, useConversationActivity, useWorkspaceUsers, useArbiSession, useConversationItems, useCanEditShared, useActOnStep, useUploadDocuments, useConversationWorkspace, useFollowThread, useArbi, useCreateTag, useProjects, useProjectUsage, ConversationScope, useConversation, useArbiSessionStore, useAgentWorkspaces, useConversations, useConversationThreads, useCreateProject, useUpdateProjectFields, useUpdateWorkspace } from '@arbidocs/react';
27
27
  import { useMemo, useCallback, useState, useEffect, useRef, createElement, useLayoutEffect } from 'react';
28
- import { getDocumentTitle, Button, isAgent, getUserDisplayName, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, getEntityLabel, entityNoun, cn, formatRelativeTime, Card, Label, Input } from '@arbidocs/react/ui';
28
+ import { getDocumentTitle, Button, isAgent, getUserDisplayName, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, getEntityLabel, entityNoun, cn, formatRelativeTime, Card } from '@arbidocs/react/ui';
29
29
  import { ArbiApiError } from '@arbidocs/sdk/browser';
30
30
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
31
31
  import { MoreHorizontal, ExternalLink, Loader2, FolderKanban, Plus, AlertTriangle, Check, MessageSquare } from 'lucide-react';
@@ -608,6 +608,8 @@ function ConnectedThreadTaskBar({
608
608
  const canEditShared = useCanEditShared();
609
609
  const update = useUpdateConversation();
610
610
  const actOnStep = useActOnStep();
611
+ const upload = useUploadDocuments();
612
+ const runWorkspace = useConversationWorkspace(conversationId);
611
613
  const [error, setError] = useState(null);
612
614
  const [busy, setBusy] = useState(false);
613
615
  const [renameOpen, setRenameOpen] = useState(false);
@@ -627,6 +629,15 @@ function ConnectedThreadTaskBar({
627
629
  const states = stepStatesFromActivity(activity.data ?? []);
628
630
  const runInputs = task?.skill_inputs ?? {};
629
631
  const stepCall = (body) => actOnStep.mutateAsync({ conversationId, body });
632
+ const uploadToRun = async (files) => {
633
+ const workspaceExtId = runWorkspace ?? void 0;
634
+ const { doc_ext_ids = [] } = await upload.mutateAsync({
635
+ files,
636
+ options: { workspaceExtId }
637
+ });
638
+ if (!doc_ext_ids.length) throw new Error("The file was not added");
639
+ return doc_ext_ids;
640
+ };
630
641
  const canEdit = Boolean(task?.is_owner || task?.is_shared && canEditShared);
631
642
  const renameThread = () => {
632
643
  const title = newTitle.trim();
@@ -679,7 +690,13 @@ function ConnectedThreadTaskBar({
679
690
  inputs: runInputs,
680
691
  me,
681
692
  nameOf,
682
- onComplete: (inputs) => stepCall({ step: step.id, action: "complete", inputs }),
693
+ onComplete: (inputs, documents2) => stepCall({
694
+ step: step.id,
695
+ action: "complete",
696
+ ...inputs ? { inputs } : {},
697
+ ...documents2 ? { documents: documents2 } : {}
698
+ }),
699
+ onUpload: uploadToRun,
683
700
  onSendBack: (to, note) => stepCall({ step: step.id, action: "send_back", to, ...note ? { note } : {} }),
684
701
  onDecline: (note) => stepCall({ step: step.id, action: "decline", ...note ? { note } : {} }),
685
702
  onOpenDocument: (id) => openDocument(id),
@@ -975,6 +992,51 @@ function primaryProjectWorkspace(project) {
975
992
  const work = (w) => w.documentCount + w.conversationCount;
976
993
  return [...project.workspaces].sort((a, b) => work(b) - work(a))[0];
977
994
  }
995
+
996
+ // src/connection/workflows/runProject.ts
997
+ function projectStepOf(from) {
998
+ return typeof from === "object" && "step" in from ? from : void 0;
999
+ }
1000
+ function projectChosenOnPage(from) {
1001
+ return from === "pick" || typeof from === "object" && "fields" in from;
1002
+ }
1003
+ function newProjectFields(from, nameLabel) {
1004
+ const extra = typeof from === "object" && "fields" in from ? from.fields : [];
1005
+ const name = { name: "name", type: "text", label: nameLabel, required: true };
1006
+ return [extra.find((f) => f.name === "name") ?? name, ...extra.filter((f) => f.name !== "name")];
1007
+ }
1008
+ var PROJECT_DETAILS = ["client", "client_ref", "stage"];
1009
+ var isDetail = (key) => PROJECT_DETAILS.includes(key);
1010
+ function typedProjectInputs(inputs) {
1011
+ const out = {};
1012
+ for (const [key, raw] of Object.entries(inputs)) {
1013
+ const value = typeof raw === "string" ? raw.trim() : raw;
1014
+ if (value !== "" && value !== void 0) out[key] = value;
1015
+ }
1016
+ return out;
1017
+ }
1018
+ function stable(value) {
1019
+ if (Array.isArray(value)) return value.map(stable);
1020
+ if (value && typeof value === "object")
1021
+ return Object.fromEntries(
1022
+ Object.keys(value).sort().map((k) => [k, stable(value[k])])
1023
+ );
1024
+ return value;
1025
+ }
1026
+ function sameProjectVars(a, b) {
1027
+ return JSON.stringify(stable(a)) === JSON.stringify(stable(b));
1028
+ }
1029
+ function newProjectVars(from, inputs) {
1030
+ if (typeof from === "object" && "fields" in from && from.project) return from.project(inputs);
1031
+ const vars = { name: String(inputs.name ?? "") };
1032
+ const fields = {};
1033
+ for (const [key, value] of Object.entries(inputs)) {
1034
+ if (key === "name") continue;
1035
+ if (isDetail(key)) vars[key] = String(value);
1036
+ else fields[key] = value;
1037
+ }
1038
+ return Object.keys(fields).length ? { ...vars, fields } : vars;
1039
+ }
978
1040
  var DEFAULT_WORKFLOW_RUN_PAGE_LABELS = {
979
1041
  runsIn: "Runs in",
980
1042
  get chooseProject() {
@@ -991,6 +1053,8 @@ var DEFAULT_WORKFLOW_RUN_PAGE_LABELS = {
991
1053
  },
992
1054
  newProjectName: "Name",
993
1055
  createProject: "Create and continue",
1056
+ moreOptions: "More options",
1057
+ stillNeeded: "Still needed: {fields}",
994
1058
  get projectFromStep() {
995
1059
  return `A new ${entityNoun("PROJECT")}, from the first step`;
996
1060
  },
@@ -1028,11 +1092,14 @@ function useWorkflowRunTarget({
1028
1092
  const session = useArbiSessionStore();
1029
1093
  const selectWorkspace = useSelectWorkspace();
1030
1094
  const createProject = useCreateProject();
1095
+ const { mutateAsync: updateProject } = useUpdateProjectFields();
1096
+ const { mutateAsync: updateWorkspace } = useUpdateWorkspace();
1031
1097
  const { projects, isLoading: projectsLoading } = useProjectSummaries();
1032
1098
  const { data: workspaces } = useWorkspaces();
1033
1099
  const [own, setOwn] = useState(null);
1034
1100
  const projectId = controlled !== void 0 ? controlled : own;
1035
1101
  const [created, setCreated] = useState(null);
1102
+ const [settingUp, setSettingUp] = useState(null);
1036
1103
  const [startedIn, setStartedIn] = useState(null);
1037
1104
  const project = projectId ? projects.find((p) => p.id === projectId) : void 0;
1038
1105
  const projectWorkspace = created && created.projectId === projectId ? created.workspaceId : project ? primaryProjectWorkspace(project)?.id : void 0;
@@ -1049,8 +1116,18 @@ function useWorkflowRunTarget({
1049
1116
  selectWorkspace(target).catch(() => {
1050
1117
  }).finally(() => setOpening((o) => o === target ? null : o));
1051
1118
  }, [target, open, startedIn, selectWorkspace]);
1119
+ const madeRef = useRef(null);
1120
+ const lastProjectId = useRef(projectId);
1121
+ useEffect(() => {
1122
+ const madeId = madeRef.current?.made.external_id;
1123
+ const before = lastProjectId.current;
1124
+ lastProjectId.current = projectId;
1125
+ if (madeId && (before === madeId && projectId !== madeId || projectId && projectId !== madeId))
1126
+ madeRef.current = null;
1127
+ }, [projectId]);
1052
1128
  const pick = useCallback(
1053
1129
  (id) => {
1130
+ madeRef.current = null;
1054
1131
  setOwn(id);
1055
1132
  onProjectChange?.(id);
1056
1133
  },
@@ -1058,33 +1135,74 @@ function useWorkflowRunTarget({
1058
1135
  );
1059
1136
  const makeProject = useCallback(
1060
1137
  async (vars, inputs = {}) => {
1061
- const made = await createProject.mutateAsync({
1062
- plan: "free",
1063
- ...vars,
1064
- workspace: vars.workspace ?? {}
1065
- });
1066
- const ws = made.workspace?.external_id;
1067
- if (!ws) throw new Error(`The ${entityNoun("PROJECT")} has no workspace`);
1068
- setCreated({ projectId: made.external_id, workspaceId: ws });
1138
+ let kept = madeRef.current;
1139
+ if (!kept) {
1140
+ const fresh = await createProject.mutateAsync({
1141
+ plan: "free",
1142
+ ...vars,
1143
+ workspace: vars.workspace ?? {}
1144
+ });
1145
+ const freshWs = fresh.workspace?.external_id;
1146
+ if (!freshWs) throw new Error(`The ${entityNoun("PROJECT")} has no workspace`);
1147
+ kept = madeRef.current = { made: fresh, ws: freshWs, vars };
1148
+ }
1149
+ const { made, ws } = kept;
1150
+ const onPage = projectChosenOnPage(projectFrom);
1151
+ if (onPage) setSettingUp(made.external_id);
1152
+ setCreated({ projectId: made.external_id, workspaceId: ws, inputs });
1069
1153
  targetRef.current = ws;
1070
1154
  setOwn(made.external_id);
1071
1155
  onProjectChange?.(made.external_id);
1072
1156
  tried.current.add(ws);
1073
1157
  setOpening(ws);
1074
1158
  try {
1075
- await selectWorkspace(ws);
1159
+ try {
1160
+ await selectWorkspace(ws);
1161
+ } finally {
1162
+ setOpening((o) => o === ws ? null : o);
1163
+ }
1164
+ if (!sameProjectVars(kept.vars, vars)) {
1165
+ const { name, plan: _plan, workspace, ...details } = vars;
1166
+ await updateProject({
1167
+ projectExtId: made.external_id,
1168
+ patch: { name, ...details }
1169
+ });
1170
+ const description = workspace?.description;
1171
+ if (name !== kept.vars.name || description !== kept.vars.workspace?.description)
1172
+ await updateWorkspace({
1173
+ name,
1174
+ ...description !== void 0 ? { description } : {}
1175
+ });
1176
+ kept.vars = vars;
1177
+ kept.made = { ...made, name };
1178
+ }
1179
+ if (!kept.followUp) kept.followUp = { extra: await onProjectCreated?.(kept.made, inputs) };
1180
+ const extra = kept.followUp.extra;
1181
+ if (extra)
1182
+ setCreated({
1183
+ projectId: made.external_id,
1184
+ workspaceId: ws,
1185
+ inputs: { ...inputs, ...extra }
1186
+ });
1187
+ return { project: kept.made, workspaceId: ws, inputs: extra ?? void 0 };
1076
1188
  } finally {
1077
- setOpening((o) => o === ws ? null : o);
1189
+ if (onPage) setSettingUp(null);
1078
1190
  }
1079
- const extra = await onProjectCreated?.(made, inputs);
1080
- return { project: made, workspaceId: ws, inputs: extra ?? void 0 };
1081
1191
  },
1082
- [createProject, onProjectChange, selectWorkspace, onProjectCreated]
1192
+ [
1193
+ createProject,
1194
+ updateProject,
1195
+ updateWorkspace,
1196
+ projectFrom,
1197
+ onProjectChange,
1198
+ selectWorkspace,
1199
+ onProjectCreated
1200
+ ]
1083
1201
  );
1084
1202
  const nameOf = (id) => id ? project?.workspaces.find((w) => w.id === id)?.name ?? workspaces?.find(
1085
1203
  (w) => w.external_id === id
1086
1204
  )?.name : void 0;
1087
- const stage = projectFrom === "pick" && !projectId && !startedIn ? "pick" : projectFrom && projectId && !target ? "loading" : target && target !== open ? opening === target ? "opening" : "switch" : "ready";
1205
+ const stage = projectChosenOnPage(projectFrom) && !projectId && !startedIn ? "pick" : settingUp && settingUp === projectId ? "opening" : projectFrom && projectId && !target ? "loading" : target && target !== open ? opening === target ? "opening" : "switch" : "ready";
1088
1206
  return {
1089
1207
  stage,
1090
1208
  target,
@@ -1097,6 +1215,8 @@ function useWorkflowRunTarget({
1097
1215
  projectsLoading,
1098
1216
  pick,
1099
1217
  makeProject,
1218
+ /** What a project made on the page (not by the run's step) starts the run from. */
1219
+ createdInputs: projectChosenOnPage(projectFrom) && created?.projectId === projectId ? created.inputs : void 0,
1100
1220
  creating: createProject.isPending,
1101
1221
  /** The run started in `workspaceId`: it stays the run's. */
1102
1222
  pin: setStartedIn,
@@ -1107,14 +1227,30 @@ function WorkflowRunProjectChooser({
1107
1227
  projects,
1108
1228
  loading,
1109
1229
  onPick,
1230
+ fields,
1110
1231
  onCreate,
1111
1232
  creating,
1112
1233
  labels,
1113
1234
  testId
1114
1235
  }) {
1236
+ const form = {
1237
+ id: "new-project",
1238
+ title: "",
1239
+ description: "",
1240
+ inputs: fields,
1241
+ run: { kind: "operation" },
1242
+ landing: "chat"
1243
+ };
1115
1244
  const [adding, setAdding] = useState(false);
1116
- const [name, setName] = useState("");
1245
+ const [values, setValues] = useState(() => defaultInputs(form));
1117
1246
  const [error, setError] = useState(null);
1247
+ const formRef = useRef(null);
1248
+ useEffect(() => {
1249
+ if (adding) formRef.current?.querySelector("input, textarea")?.focus();
1250
+ }, [adding]);
1251
+ const problems = validateInputs(form, values);
1252
+ const complete = Object.keys(problems).length === 0;
1253
+ const missing = fields.filter((f) => problems[f.name]).map((f) => f.label);
1118
1254
  const options = useMemo(
1119
1255
  () => projects.map((p) => ({
1120
1256
  id: p.id,
@@ -1130,10 +1266,9 @@ function WorkflowRunProjectChooser({
1130
1266
  );
1131
1267
  const submit = (e) => {
1132
1268
  e.preventDefault();
1133
- const n = name.trim();
1134
- if (!n) return;
1269
+ if (!complete || creating) return;
1135
1270
  setError(null);
1136
- onCreate(n).catch(
1271
+ onCreate(typedProjectInputs(values)).catch(
1137
1272
  (err) => setError(err instanceof Error && err.message ? err.message : String(err))
1138
1273
  );
1139
1274
  };
@@ -1156,34 +1291,45 @@ function WorkflowRunProjectChooser({
1156
1291
  adding || !loading && !projects.length ? /* @__PURE__ */ jsxs(
1157
1292
  "form",
1158
1293
  {
1294
+ ref: formRef,
1159
1295
  onSubmit: submit,
1160
- className: "space-y-2 border-t border-border pt-4",
1296
+ className: "space-y-4 border-t border-border pt-4",
1161
1297
  "data-testid": `${testId}-new-project`,
1162
1298
  children: [
1163
- /* @__PURE__ */ jsx(Label, { htmlFor: `${testId}-new-project-name`, children: labels.newProjectName }),
1164
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 sm:flex-row", children: [
1165
- /* @__PURE__ */ jsx(
1166
- Input,
1167
- {
1168
- id: `${testId}-new-project-name`,
1169
- value: name,
1170
- onChange: (e) => setName(e.target.value),
1171
- autoFocus: adding,
1172
- className: "sm:max-w-md",
1173
- "data-testid": `${testId}-new-project-name`
1174
- }
1175
- ),
1299
+ /* @__PURE__ */ jsx(
1300
+ SchemaForm,
1301
+ {
1302
+ fields,
1303
+ values,
1304
+ onChange: (name, value) => setValues((v) => ({ ...v, [name]: value })),
1305
+ onEnterSubmit: () => formRef.current?.requestSubmit(),
1306
+ testIdPrefix: `${testId}-new-project`,
1307
+ labels: { advanced: labels.moreOptions },
1308
+ className: "sm:max-w-md"
1309
+ }
1310
+ ),
1311
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-1", children: [
1176
1312
  /* @__PURE__ */ jsxs(
1177
1313
  Button,
1178
1314
  {
1179
1315
  type: "submit",
1180
- disabled: !name.trim() || creating,
1316
+ disabled: !complete || creating,
1317
+ "aria-describedby": missing.length ? `${testId}-new-project-missing` : void 0,
1181
1318
  "data-testid": `${testId}-new-project-create`,
1182
1319
  children: [
1183
1320
  creating ? /* @__PURE__ */ jsx(Loader2, { className: "size-4 animate-spin" }) : /* @__PURE__ */ jsx(Plus, { className: "size-4" }),
1184
1321
  labels.createProject
1185
1322
  ]
1186
1323
  }
1324
+ ),
1325
+ missing.length > 0 && /* @__PURE__ */ jsx(
1326
+ "p",
1327
+ {
1328
+ id: `${testId}-new-project-missing`,
1329
+ className: "text-sm text-muted-foreground",
1330
+ "data-testid": `${testId}-new-project-missing`,
1331
+ children: labels.stillNeeded.replace("{fields}", missing.join(", "))
1332
+ }
1187
1333
  )
1188
1334
  ] }),
1189
1335
  error && /* @__PURE__ */ jsx("p", { role: "alert", className: "text-sm text-destructive", children: error })
@@ -1851,7 +1997,8 @@ function WorkflowRunBody({
1851
1997
  const pageTarget = page?.target;
1852
1998
  const projectFrom = page?.projectFrom;
1853
1999
  const inputsFromProject = page?.inputsFromProject;
1854
- const projectStep = pageTarget && typeof projectFrom === "object" ? projectFrom.step : void 0;
2000
+ const fromStep = pageTarget ? projectStepOf(projectFrom) : void 0;
2001
+ const projectStep = fromStep?.step;
1855
2002
  const workflow = useMemo(
1856
2003
  () => withCommitStep(withLabelIds(given, labelIds), projectStep),
1857
2004
  [given, labelIds, projectStep]
@@ -1874,23 +2021,28 @@ function WorkflowRunBody({
1874
2021
  }, [hostBeforeStart, pageTarget, noWorkspace, required, ensureLabels, session]);
1875
2022
  const hostCommit = options?.commit;
1876
2023
  const commit = useMemo(() => {
1877
- if (!pageTarget || typeof projectFrom !== "object") return hostCommit;
1878
- const step = projectFrom.step;
2024
+ if (!pageTarget || !fromStep) return hostCommit;
2025
+ const step = fromStep.step;
1879
2026
  return {
1880
2027
  ...hostCommit,
1881
2028
  [step]: async (inputs) => {
1882
- const made = await pageTarget.makeProject(projectFrom.project(inputs), inputs);
2029
+ const made = await pageTarget.makeProject(fromStep.project(inputs), inputs);
1883
2030
  const merged = { ...inputs, ...made.inputs };
1884
2031
  const fromHost = await hostCommit?.[step]?.(merged);
1885
2032
  return { ...made.inputs, ...fromHost ?? {} };
1886
2033
  }
1887
2034
  };
1888
- }, [hostCommit, pageTarget, projectFrom]);
2035
+ }, [hostCommit, pageTarget, fromStep]);
1889
2036
  const project = pageTarget?.project;
2037
+ const createdInputs = pageTarget?.createdInputs;
1890
2038
  const hostInitial = options?.initialInputs;
1891
2039
  const initialInputs = useMemo(
1892
- () => project && inputsFromProject ? { ...inputsFromProject(project), ...hostInitial } : hostInitial,
1893
- [project, inputsFromProject, hostInitial]
2040
+ () => project && inputsFromProject || createdInputs ? {
2041
+ ...project && inputsFromProject?.(project),
2042
+ ...createdInputs,
2043
+ ...hostInitial
2044
+ } : hostInitial,
2045
+ [project, inputsFromProject, createdInputs, hostInitial]
1894
2046
  );
1895
2047
  const { data: docs = [], refetch } = useDocuments(wsId);
1896
2048
  const documentFilter = useDocumentFilter();
@@ -2345,7 +2497,7 @@ function ConnectedWorkflowRunPage({
2345
2497
  const required = requiredLabelsOf(workflow);
2346
2498
  const ensure = useEnsureRequiredLabels();
2347
2499
  const labels = useRequiredLabels(required, target.target, ensure, target.stage === "ready");
2348
- const fromStep = typeof projectFrom === "object";
2500
+ const fromStep = !!projectStepOf(projectFrom);
2349
2501
  const labelsReady = !required.length || labels.status === "ready" || fromStep && !target.target;
2350
2502
  const [shown, setShown] = useState(false);
2351
2503
  if (!shown && target.stage === "ready" && labelsReady) setShown(true);
@@ -2379,7 +2531,8 @@ function ConnectedWorkflowRunPage({
2379
2531
  projects: target.projects,
2380
2532
  loading: target.projectsLoading,
2381
2533
  onPick: target.pick,
2382
- onCreate: (name) => target.makeProject({ name }),
2534
+ fields: newProjectFields(projectFrom, l.newProjectName),
2535
+ onCreate: (inputs) => target.makeProject(newProjectVars(projectFrom, inputs), inputs),
2383
2536
  creating: target.creating,
2384
2537
  labels: l,
2385
2538
  testId: testIdPrefix
@@ -2447,5 +2600,5 @@ function ConnectedWorkflowRunPage({
2447
2600
  }
2448
2601
 
2449
2602
  export { ConnectedTaskActivityDialog, ConnectedTaskComposer, ConnectedThreadTaskBar, ConnectedWorkflowHistory, ConnectedWorkflowRunPage, ConnectedWorkflowRunner, DEFAULT_CONNECTED_WORKFLOW_RUNNER_LABELS, DEFAULT_WORKFLOW_RUN_PAGE_LABELS, WorkflowRunThread, WorkflowRunWorkspaceChangedError, buildProjectSummaries, primaryProjectWorkspace, useEnsureRequiredLabels, useProjectSummaries, useProjectSummary, useRenderTaskPerson, useRequiredLabels, useSkillsEnabled, useTaskPeople, useWorkflowDefinitions, useWorkflowTasks, useWorkflowsPageState, workflowRunView };
2450
- //# sourceMappingURL=chunk-TG4S236F.js.map
2451
- //# sourceMappingURL=chunk-TG4S236F.js.map
2603
+ //# sourceMappingURL=chunk-LZI4EGOW.js.map
2604
+ //# sourceMappingURL=chunk-LZI4EGOW.js.map