diff --git a/front/components/app/Deploy.tsx b/front/components/app/Deploy.tsx
index 76b479a42f61..6623b754226d 100644
--- a/front/components/app/Deploy.tsx
+++ b/front/components/app/Deploy.tsx
@@ -1,13 +1,16 @@
import "@uiw/react-textarea-code-editor/dist.css";
+import {
+ Button,
+ ClipboardIcon,
+ CubeIcon,
+ DocumentTextIcon,
+} from "@dust-tt/sparkle";
import { Dialog, Transition } from "@headlessui/react";
-import { CubeIcon, DocumentDuplicateIcon } from "@heroicons/react/20/solid";
-import { ArrowRightCircleIcon } from "@heroicons/react/24/outline";
import dynamic from "next/dynamic";
import Link from "next/link";
import { Fragment, useState } from "react";
-import { ActionButton, Button, HighlightButton } from "@app/components/Button";
import { useKeys } from "@app/lib/swr";
import { classNames } from "@app/lib/utils";
import { AppType, SpecificationType } from "@app/types/app";
@@ -82,15 +85,15 @@ export default function Deploy({
return (
-
{
setOpen(!open);
}}
- >
-
- Deploy
-
+ disabled={disabled}
+ icon={CubeIcon}
+ />
-
-
- {copyButtonText}
-
+
@@ -191,23 +196,29 @@ export default function Deploy({
creation parameters, refer to the API reference.
-
-
-
- Visit API Reference
-
-
+ {
+ window.open(
+ "https://docs.dust.tt/runs",
+ "_blank",
+ "noopener,noreferrer"
+ );
+ }}
+ />
- setOpen(false)}>Close
+ setOpen(false)}
+ label="Close"
+ />
diff --git a/front/components/app/NewBlock.tsx b/front/components/app/NewBlock.tsx
index d0abead13a71..a4fa2a3ba7f5 100644
--- a/front/components/app/NewBlock.tsx
+++ b/front/components/app/NewBlock.tsx
@@ -1,3 +1,4 @@
+import { Button } from "@dust-tt/sparkle";
import { Menu } from "@headlessui/react";
import { PlusIcon } from "@heroicons/react/20/solid";
@@ -121,18 +122,13 @@ export default function NewBlock({
) : (
-
-
- Block
+
+
)}
diff --git a/front/components/sparkle/navigation.tsx b/front/components/sparkle/navigation.tsx
index 8c3f90f4431a..87b74f765acf 100644
--- a/front/components/sparkle/navigation.tsx
+++ b/front/components/sparkle/navigation.tsx
@@ -158,6 +158,7 @@ export const subNavigationApp = ({
label: "Specification",
icon: CommandLineIcon,
href: `/w/${owner.sId}/a/${app.sId}`,
+ sizing: "expand",
current: current === "specification",
},
{
@@ -165,6 +166,7 @@ export const subNavigationApp = ({
label: "Datasets",
icon: DocumentTextIcon,
href: `/w/${owner.sId}/a/${app.sId}/datasets`,
+ sizing: "expand",
current: current === "datasets",
},
];
@@ -180,6 +182,7 @@ export const subNavigationApp = ({
label: "Run",
icon: PaperAirplaneIcon,
href: `/w/${owner.sId}/a/${app.sId}/execute`,
+ sizing: "expand",
current: current === "execute",
},
{
@@ -187,6 +190,7 @@ export const subNavigationApp = ({
label: "Logs",
icon: FolderOpenIcon,
href: `/w/${owner.sId}/a/${app.sId}/runs`,
+ sizing: "expand",
current: current === "runs",
},
{
@@ -194,6 +198,7 @@ export const subNavigationApp = ({
label: "Settings",
icon: Cog6ToothIcon,
href: `/w/${owner.sId}/a/${app.sId}/settings`,
+ sizing: "expand",
current: current === "settings",
},
]);
diff --git a/front/pages/w/[wId]/a/[aId]/clone.tsx b/front/pages/w/[wId]/a/[aId]/clone.tsx
index 872a7f5b1538..b71fbf808a50 100644
--- a/front/pages/w/[wId]/a/[aId]/clone.tsx
+++ b/front/pages/w/[wId]/a/[aId]/clone.tsx
@@ -1,3 +1,4 @@
+import { Tab } from "@dust-tt/sparkle";
import { ChevronRightIcon } from "@heroicons/react/20/solid";
import { GetServerSideProps, InferGetServerSidePropsType } from "next";
import Link from "next/link";
@@ -6,6 +7,7 @@ import { useEffect, useState } from "react";
import { Button } from "@app/components/Button";
import AppLayout from "@app/components/sparkle/AppLayout";
+import { AppLayoutSimpleCloseTitle } from "@app/components/sparkle/AppLayoutTitle";
import {
subNavigationAdmin,
subNavigationApp,
@@ -135,209 +137,226 @@ export default function CloneView({
subNavigation={subNavigationAdmin({
owner,
current: "developers",
- subMenuLabel: app.name,
- subMenu: subNavigationApp({ owner, app, current: "settings" }),
})}
+ titleChildren={
+ {
+ void router.push(`/w/${owner.sId}/a`);
+ }}
+ />
+ }
>
-
-
-
-
+
+
+
+
+
+
+
-
- Clone {owner.name}
-
-
- {app.name}
-
-
-
- This will clone the app (specification along with associated
- datasets). You can pick a new name and description for the
- newly cloned app.
-
+
+
+ Clone {owner.name}
+
+
+ {app.name}
+
+
+
+ This will clone the app (specification along with associated
+ datasets). You can pick a new name and description for the
+ newly cloned app.
+
+
-
-
-
- {user.workspaces.length > 1 ? (
-
+
+
+ {user.workspaces.length > 1 ? (
+
+
+ Target Workspace
+
+ {
+ setTargetWorkspace(w);
+ }}
+ />
+
+ ) : null}
+
+
- Target Workspace
+ App Name
- {
- setTargetWorkspace(w);
- }}
- />
-
- ) : null}
-
-
-
-
-
-
- Description
-
-
- optional
+
+
+
+ Description
+
+
+ optional
+
+
+ setAppDescription(e.target.value)}
+ />
+
+
+ A good description will help others discover and
+ understand the purpose of your app. It is also visible at
+ the top of your app specification.
+
-
- setAppDescription(e.target.value)}
- />
-
-
- A good description will help others discover and understand
- the purpose of your app. It is also visible at the top of
- your app specification.
-
-
-
-
-
- Visibility
-
-
-
-
{
- if (e.target.value != appVisibility) {
- setAppVisibility(e.target.value as AppVisibility);
- }
- }}
- />
-
- Public
-
- Anyone on the Internet can see the app. Only you can
- edit.
-
-
-
-
-
{
- if (e.target.value != appVisibility) {
- setAppVisibility(e.target.value as AppVisibility);
- }
- }}
- />
-
- Private
-
- Only you can see and edit the app.
-
-
-
-
-
{
- if (e.target.value != appVisibility) {
- setAppVisibility(e.target.value as AppVisibility);
- }
- }}
- />
-
- Unlisted
-
- Anyone with the link can see the app. Only you can
- edit.
-
-
+
+
+
+ Visibility
+
+
+
+
{
+ if (e.target.value != appVisibility) {
+ setAppVisibility(
+ e.target.value as AppVisibility
+ );
+ }
+ }}
+ />
+
+ Public
+
+ Anyone on the Internet can see the app. Only you
+ can edit.
+
+
+
+
+
{
+ if (e.target.value != appVisibility) {
+ setAppVisibility(
+ e.target.value as AppVisibility
+ );
+ }
+ }}
+ />
+
+ Private
+
+ Only you can see and edit the app.
+
+
+
+
+
{
+ if (e.target.value != appVisibility) {
+ setAppVisibility(
+ e.target.value as AppVisibility
+ );
+ }
+ }}
+ />
+
+ Unlisted
+
+ Anyone with the link can see the app. Only you can
+ edit.
+
+
+
-
-
+
+
-
-
-
-
- {cloning ? "Cloning..." : "Clone"}
-
+
+
+
+ {cloning ? "Cloning..." : "Clone"}
+
+
diff --git a/front/pages/w/[wId]/a/[aId]/datasets/[name]/index.tsx b/front/pages/w/[wId]/a/[aId]/datasets/[name]/index.tsx
index 8ae9f840406b..91ef49242380 100644
--- a/front/pages/w/[wId]/a/[aId]/datasets/[name]/index.tsx
+++ b/front/pages/w/[wId]/a/[aId]/datasets/[name]/index.tsx
@@ -1,12 +1,14 @@
import "@uiw/react-textarea-code-editor/dist.css";
+import { Tab } from "@dust-tt/sparkle";
import { GetServerSideProps, InferGetServerSidePropsType } from "next";
-import Router from "next/router";
+import Router, { useRouter } from "next/router";
import { useEffect, useState } from "react";
import DatasetView from "@app/components/app/DatasetView";
import { ActionButton } from "@app/components/Button";
import AppLayout from "@app/components/sparkle/AppLayout";
+import { AppLayoutSimpleCloseTitle } from "@app/components/sparkle/AppLayoutTitle";
import {
subNavigationAdmin,
subNavigationApp,
@@ -144,6 +146,8 @@ export default function ViewDatasetView({
setIsFinishedEditing(true);
};
+ const router = useRouter();
+
return (
{
+ void router.push(`/w/${owner.sId}/a`);
+ }}
+ />
+ }
>
-
-
-
-
-
{
- if (!readOnly) {
- onUpdate(initializing, valid, currentDatasetInEditor);
- }
- }}
- nameDisabled={true}
- />
-
- {readOnly ? null : (
-
-
-
handleSubmit()}
- >
- Update
-
+
+
+
+
+
+
+
+
+
{
+ if (!readOnly) {
+ onUpdate(initializing, valid, currentDatasetInEditor);
+ }
+ }}
+ nameDisabled={true}
+ />
+
+ {readOnly ? null : (
+
+
+
handleSubmit()}
+ >
+ Update
+
+
-
- )}
+ )}
+
diff --git a/front/pages/w/[wId]/a/[aId]/datasets/index.tsx b/front/pages/w/[wId]/a/[aId]/datasets/index.tsx
index acd86801fc62..a962d7fd5b18 100644
--- a/front/pages/w/[wId]/a/[aId]/datasets/index.tsx
+++ b/front/pages/w/[wId]/a/[aId]/datasets/index.tsx
@@ -1,10 +1,10 @@
-import { PlusIcon, TrashIcon } from "@heroicons/react/20/solid";
+import { Button, PlusIcon, Tab, TrashIcon } from "@dust-tt/sparkle";
import { GetServerSideProps, InferGetServerSidePropsType } from "next";
import Link from "next/link";
-import Router from "next/router";
+import Router, { useRouter } from "next/router";
-import { ActionButton } from "@app/components/Button";
import AppLayout from "@app/components/sparkle/AppLayout";
+import { AppLayoutSimpleCloseTitle } from "@app/components/sparkle/AppLayoutTitle";
import {
subNavigationAdmin,
subNavigationApp,
@@ -88,6 +88,8 @@ export default function DatasetsView({
}
};
+ const router = useRouter();
+
return (
{
+ void router.push(`/w/${owner.sId}/a`);
+ }}
+ />
+ }
>
-
-
-
-
-
-
- New Dataset
-
-
-
-
-
- {datasets.map((d) => {
- return (
-
-
+
+
+
+
+
+
+
+ {
+ void router.push(
+ `/w/${owner.sId}/a/${app.sId}/datasets/new`
+ );
+ }}
+ />
+
+
+
+ {datasets.map((d) => {
+ return (
+
-
-
- {d.name}
-
- {readOnly ? null : (
-
- {
- e.preventDefault();
- await handleDelete(d.name);
- }}
- />
-
- )}
-
-
-
-
- {d.description ? d.description : "No description"}
+
+
+
+ {d.name}
+ {readOnly ? null : (
+
+ {
+ e.preventDefault();
+ await handleDelete(d.name);
+ }}
+ />
+
+ )}
+
+
+
+
+ {d.description
+ ? d.description
+ : "No description"}
+
+
-
-
- );
- })}
-
-
-
- Datasets are used as input data to apps (
-
- input
- {" "}
- block) or few-shot examples to prompt models (
-
- data
- {" "}
- block).
+
+ );
+ })}
+
+
+
+ Datasets are used as input data to apps (
+
+ input
+ {" "}
+ block) or few-shot examples to prompt models (
+
+ data
+ {" "}
+ block).
+
diff --git a/front/pages/w/[wId]/a/[aId]/datasets/new.tsx b/front/pages/w/[wId]/a/[aId]/datasets/new.tsx
index 7e3ae41e9c75..8720e230cc56 100644
--- a/front/pages/w/[wId]/a/[aId]/datasets/new.tsx
+++ b/front/pages/w/[wId]/a/[aId]/datasets/new.tsx
@@ -1,12 +1,14 @@
import "@uiw/react-textarea-code-editor/dist.css";
+import { Tab } from "@dust-tt/sparkle";
import { GetServerSideProps, InferGetServerSidePropsType } from "next";
-import Router from "next/router";
+import Router, { useRouter } from "next/router";
import { useEffect, useState } from "react";
import DatasetView from "@app/components/app/DatasetView";
import { ActionButton } from "@app/components/Button";
import AppLayout from "@app/components/sparkle/AppLayout";
+import { AppLayoutSimpleCloseTitle } from "@app/components/sparkle/AppLayoutTitle";
import {
subNavigationAdmin,
subNavigationApp,
@@ -117,6 +119,8 @@ export default function NewDatasetView({
setIsFinishedEditing(true);
};
+ const router = useRouter();
+
return (
{
+ void router.push(`/w/${owner.sId}/a`);
+ }}
+ />
+ }
>
-
-
-
-
-
-
-
-
handleSubmit()}
- >
- Create
-
+
+
+
+
+
+
+
+
+
+
+
+
handleSubmit()}
+ >
+ Create
+
+
diff --git a/front/pages/w/[wId]/a/[aId]/execute/index.tsx b/front/pages/w/[wId]/a/[aId]/execute/index.tsx
index d4e6592e180c..c43f678ccc68 100644
--- a/front/pages/w/[wId]/a/[aId]/execute/index.tsx
+++ b/front/pages/w/[wId]/a/[aId]/execute/index.tsx
@@ -1,3 +1,4 @@
+import { Tab } from "@dust-tt/sparkle";
import {
ChevronDownIcon,
ChevronRightIcon,
@@ -6,6 +7,7 @@ import {
} from "@heroicons/react/20/solid";
import { GetServerSideProps, InferGetServerSidePropsType } from "next";
import dynamic from "next/dynamic";
+import { useRouter } from "next/router";
import { useEffect, useState } from "react";
import TextareaAutosize from "react-textarea-autosize";
// TODO: type sse.js or use something else
@@ -15,6 +17,7 @@ import { SSE } from "sse.js";
import { Execution } from "@app/components/app/blocks/Output";
import { ActionButton } from "@app/components/Button";
import AppLayout from "@app/components/sparkle/AppLayout";
+import { AppLayoutSimpleCloseTitle } from "@app/components/sparkle/AppLayoutTitle";
import {
subNavigationAdmin,
subNavigationApp,
@@ -558,6 +561,8 @@ export default function ExecuteView({
};
}, [handleKeyPress]);
+ const router = useRouter();
+
return (
{
+ void router.push(`/w/${owner.sId}/a`);
+ }}
+ />
+ }
>
-
-
-
-
-
- This panel lets you use your app on custom{" "}
-
- input
- {" "}
- values once finalized.{" "}
- {savedRun?.app_hash ? null : (
- <>
- You must run your app at least once from the Specification
- panel to be able to execute it here with custom values.
- >
- )}
+
+
+
+
+
+
+
+
+
+ This panel lets you use your app on custom{" "}
+
+ input
+ {" "}
+ values once finalized.{" "}
+ {savedRun?.app_hash ? null : (
+ <>
+ You must run your app at least once from the Specification
+ panel to be able to execute it here with custom values.
+ >
+ )}
+
+
+
+
+
+
handleRun()}
+ >
+
+ Execute
+
+
-
-
+ {inputDatasetKeys.length ? (
+ <>
+
Input
+
+ The input fields are inferred from the Dataset attached to
+ your app's{" "}
+
+ input
+ {" "}
+ block.
+
+
+ {inputDatasetKeys.map((k) => (
+
+ handleValueChange(k, value)}
+ inputType={datasetTypes[k]}
+ onKeyDown={handleKeyPress}
+ />
+
+ ))}
+
+ >
+ ) : null}
+ {executionLogs.blockOrder.length ? (
-
handleRun()}>
-
- Execute
-
+
+ Execution Trace
+
+
{
+ setOutputExpandedByBlockTypeName((prev) => {
+ const newExpanded: { [key: string]: boolean } = {
+ ...prev,
+ };
+ newExpanded[blockName] = !newExpanded[blockName];
+ return newExpanded;
+ });
+ }}
+ />
-
+ ) : null}
+ {finalOutputBlockTypeName && (
+
+
+ Output
+
+
+
+ )}
- {inputDatasetKeys.length ? (
- <>
-
Input
-
- The input fields are inferred from the Dataset attached to your
- app's{" "}
-
- input
- {" "}
- block.
-
-
- {inputDatasetKeys.map((k) => (
-
- handleValueChange(k, value)}
- inputType={datasetTypes[k]}
- onKeyDown={handleKeyPress}
- />
-
- ))}
-
- >
- ) : null}
- {executionLogs.blockOrder.length ? (
-
-
- Execution Trace
-
- {
- setOutputExpandedByBlockTypeName((prev) => {
- const newExpanded: { [key: string]: boolean } = {
- ...prev,
- };
- newExpanded[blockName] = !newExpanded[blockName];
- return newExpanded;
- });
- }}
- />
-
- ) : null}
- {finalOutputBlockTypeName && (
-
-
Output
-
-
- )}
diff --git a/front/pages/w/[wId]/a/[aId]/index.tsx b/front/pages/w/[wId]/a/[aId]/index.tsx
index c905a15d7ec0..8dd70b740781 100644
--- a/front/pages/w/[wId]/a/[aId]/index.tsx
+++ b/front/pages/w/[wId]/a/[aId]/index.tsx
@@ -1,18 +1,21 @@
import {
+ Button,
DocumentDuplicateIcon,
- PlayCircleIcon,
-} from "@heroicons/react/20/solid";
-import { ArrowRightCircleIcon } from "@heroicons/react/24/outline";
+ DocumentTextIcon,
+ RobotIcon,
+ SparklesIcon,
+ Tab,
+} from "@dust-tt/sparkle";
import { GetServerSideProps, InferGetServerSidePropsType } from "next";
-import Link from "next/link";
+import { useRouter } from "next/router";
import { useRef, useState } from "react";
import { mutate } from "swr";
import Deploy from "@app/components/app/Deploy";
import NewBlock from "@app/components/app/NewBlock";
import SpecRunView from "@app/components/app/SpecRunView";
-import { ActionButton, Button } from "@app/components/Button";
import AppLayout from "@app/components/sparkle/AppLayout";
+import { AppLayoutSimpleCloseTitle } from "@app/components/sparkle/AppLayoutTitle";
import {
subNavigationAdmin,
subNavigationApp,
@@ -297,6 +300,8 @@ export default function AppView({
}, 0);
};
+ const router = useRouter();
+
return (
{
+ void router.push(`/w/${owner.sId}/a`);
+ }}
+ />
+ }
>
-
-
-
+
+
+
+
+
+
+
{
@@ -322,131 +339,19 @@ export default function AppView({
direction="down"
small={false}
/>
-
-
-
handleRun()}
- >
-
- {runRequested || run?.status.run == "running" ? "Running" : "Run"}
-
-
- {runError ? (
-
- {(() => {
- switch (runError.code) {
- case "invalid_specification_error":
- return `Specification error: ${runError.message}`;
- default:
- return `Error: ${runError.message}`;
- }
- })()}
-
- ) : null}
- {readOnly && user ? (
-
- ) : null}
-
- {!readOnly ? (
-
-
-
-
- Documentation
-
-
-
- ) : null}
- {!readOnly && run ? (
-
-
-
- ) : null}
-
-
-
-
- {spec.length == 0 ? (
-
-
Welcome to your new Dust app.
-
To get started:
-
-
-
-
- Follow the QuickStart Guide
-
-
-
-
...or add your first block!
-
- ) : null}
-
- {spec.length > 2 && !readOnly ? (
-
-
- {
- await handleNewBlock(null, blockType);
- }}
- spec={spec}
- direction="up"
- small={false}
- />
-
-
-
handleRun()}
- >
-
- {runRequested || run?.status.run == "running"
- ? "Running"
- : "Run"}
-
-
+ icon={RobotIcon}
+ />
{runError ? (
-
+
{(() => {
switch (runError.code) {
case "invalid_specification_error":
@@ -457,10 +362,122 @@ export default function AppView({
})()}
) : null}
+ {readOnly && user ? (
+
+ {
+ void router.push(`/w/${owner.sId}/a/${app.sId}/clone`);
+ }}
+ />
+
+ ) : null}
+
+ {!readOnly ? (
+
+ {
+ window.open("https://docs.dust.tt", "_blank");
+ }}
+ />
+
+ ) : null}
+ {!readOnly && run ? (
+
+
+
+ ) : null}
- ) : null}
+
+
+
+ {spec.length == 0 ? (
+
+
Welcome to your new Dust app.
+
To get started:
+
+ {
+ window.open("https://docs.dust.tt/quickstart", "_blank");
+ }}
+ />
+
+
...or add your first block!
+
+ ) : null}
+
+ {spec.length > 2 && !readOnly ? (
+
+
+ {
+ await handleNewBlock(null, blockType);
+ }}
+ spec={spec}
+ direction="up"
+ small={false}
+ />
+
+
+ handleRun()}
+ icon={SparklesIcon}
+ />
+
+ {runError ? (
+
+ {(() => {
+ switch (runError.code) {
+ case "invalid_specification_error":
+ return `Specification error: ${runError.message}`;
+ default:
+ return `Error: ${runError.message}`;
+ }
+ })()}
+
+ ) : null}
+
+ ) : null}
+
+
-
);
}
diff --git a/front/pages/w/[wId]/a/[aId]/runs/[runId]/index.tsx b/front/pages/w/[wId]/a/[aId]/runs/[runId]/index.tsx
index 228b3d76fa01..666104271e8e 100644
--- a/front/pages/w/[wId]/a/[aId]/runs/[runId]/index.tsx
+++ b/front/pages/w/[wId]/a/[aId]/runs/[runId]/index.tsx
@@ -1,13 +1,16 @@
+import { Tab } from "@dust-tt/sparkle";
import {
ArrowLeftCircleIcon,
CheckCircleIcon,
} from "@heroicons/react/24/outline";
import { GetServerSideProps, InferGetServerSidePropsType } from "next";
+import { useRouter } from "next/router";
import { useState } from "react";
import SpecRunView from "@app/components/app/SpecRunView";
import { ActionButton } from "@app/components/Button";
import AppLayout from "@app/components/sparkle/AppLayout";
+import { AppLayoutSimpleCloseTitle } from "@app/components/sparkle/AppLayoutTitle";
import {
subNavigationAdmin,
subNavigationApp,
@@ -137,6 +140,8 @@ export default function AppRun({
setSavedRunId(run.run_id);
};
+ const router = useRouter();
+
return (
{
+ void router.push(`/w/${owner.sId}/a`);
+ }}
+ />
+ }
>
-
-
-
-
-
- Viewing run:{" "}
-
- {run.run_id}
-
-
- {run.run_id.slice(0, 8)}...{run.run_id.slice(-8)}
-
-
-
- {run.app_hash ? (
-
+
+
+
+
+
+
+
+
- Specification Hash:{" "}
-
- {run.app_hash}
+ Viewing run:{" "}
+
+ {run.run_id}
-
- {run.app_hash.slice(0, 8)}...{run.app_hash.slice(-8)}
+
+ {run.run_id.slice(0, 8)}...{run.run_id.slice(-8)}
- ) : null}
+ {run.app_hash ? (
+
+
+ Specification Hash:{" "}
+
+ {run.app_hash}
+
+
+ {run.app_hash.slice(0, 8)}...{run.app_hash.slice(-8)}
+
+
+
+ ) : null}
+
+
+ {savedRunId !== run.run_id ? (
+ <>
+ {" "}
+
+
+ {isLoading ? "Restoring..." : "Restore"}
+
+ >
+ ) : (
+ <>
+ {" "}
+
+
+ Latest version
+
+ >
+ )}
+
-
- {savedRunId !== run.run_id ? (
- <>
- {" "}
-
-
- {isLoading ? "Restoring..." : "Restore"}
-
- >
- ) : (
- <>
- {" "}
-
-
- Latest version
-
- >
- )}
-
+
+ {
+ // no-op
+ }}
+ handleDeleteBlock={() => {
+ // no-op
+ }}
+ handleMoveBlockUp={() => {
+ // no-op
+ }}
+ handleMoveBlockDown={() => {
+ // no-op
+ }}
+ handleNewBlock={() => {
+ // no-op
+ }}
+ />
+
+
-
- {
- // no-op
- }}
- handleDeleteBlock={() => {
- // no-op
- }}
- handleMoveBlockUp={() => {
- // no-op
- }}
- handleMoveBlockDown={() => {
- // no-op
- }}
- handleNewBlock={() => {
- // no-op
- }}
- />
-
-
);
}
diff --git a/front/pages/w/[wId]/a/[aId]/runs/index.tsx b/front/pages/w/[wId]/a/[aId]/runs/index.tsx
index d9af7ad7bab9..5193a835cbb2 100644
--- a/front/pages/w/[wId]/a/[aId]/runs/index.tsx
+++ b/front/pages/w/[wId]/a/[aId]/runs/index.tsx
@@ -1,9 +1,12 @@
+import { Tab } from "@dust-tt/sparkle";
import { GetServerSideProps, InferGetServerSidePropsType } from "next";
import Link from "next/link";
+import { useRouter } from "next/router";
import { useEffect, useState } from "react";
import { Button } from "@app/components/Button";
import AppLayout from "@app/components/sparkle/AppLayout";
+import { AppLayoutSimpleCloseTitle } from "@app/components/sparkle/AppLayoutTitle";
import {
subNavigationAdmin,
subNavigationApp,
@@ -121,6 +124,8 @@ export default function RunsView({
last = total;
}
+ const router = useRouter();
+
return (
{
+ void router.push(`/w/${owner.sId}/a`);
+ }}
+ />
+ }
>
-
-
- {tabs.map((tab, tabIdx) => (
- setRunType(tab.runType)}
- >
- {tab.name}
-
- ))}
-
+
+
+
+
+
+
+ {tabs.map((tab, tabIdx) => (
+ setRunType(tab.runType)}
+ >
+ {tab.name}
+
+ ))}
+
-
-
-
- {
- if (offset >= limit) {
- setOffset(offset - limit);
- } else {
- setOffset(0);
- }
- }}
- >
- Previous
-
-
-
-
= total}
- onClick={() => {
- if (offset + limit < total) {
- setOffset(offset + limit);
- }
- }}
- >
- Next
-
+
+
+
+ {
+ if (offset >= limit) {
+ setOffset(offset - limit);
+ } else {
+ setOffset(0);
+ }
+ }}
+ >
+ Previous
+
+
+
+ = total}
+ onClick={() => {
+ if (offset + limit < total) {
+ setOffset(offset + limit);
+ }
+ }}
+ >
+ Next
+
+
-
- {runs.length > 0 ? (
-
- Showing runs {offset + 1} - {last} of {total} runs
-
- ) : null}
+ {runs.length > 0 ? (
+
+ Showing runs {offset + 1} - {last} of {total} runs
+
+ ) : null}
-
-
- {runs.map((run) => (
-
-
-
-
-
-
- {run.run_id.slice(0, 8)}...
- {run.run_id.slice(-8)}
-
-
-
-
-
-
-
- {run.status.blocks.map((block) => (
-
+
+ {runs.map((run) => (
+
+
+
+
+
+
+ {run.run_id.slice(0, 8)}...
+ {run.run_id.slice(-8)}
+
+
+
+
+
- {block.name}
-
- ))}
-
- ({inputCount(run.status)} inputs)
-
+ {run.status.run}
+
+
-
-
{timeAgoFrom(run.created)} ago
+
+
+ {run.status.blocks.map((block) => (
+
+ {block.name}
+
+ ))}
+
+ ({inputCount(run.status)} inputs)
+
+
+
+
{timeAgoFrom(run.created)} ago
+
+
+ ))}
+ {runs.length == 0 ? (
+
+
No runs found 🔎
+ {runType == "local" ? (
+
+ Runs triggered from Dust will appear here.
+
+ ) : (
+
+ Runs triggered by API will appear here.
+
+ )}
-
- ))}
- {runs.length == 0 ? (
-
-
No runs found 🔎
- {runType == "local" ? (
-
- Runs triggered from Dust will appear here.
-
- ) : (
-
Runs triggered by API will appear here.
- )}
-
- ) : null}
-
+ ) : null}
+
+
);
diff --git a/front/pages/w/[wId]/a/[aId]/settings.tsx b/front/pages/w/[wId]/a/[aId]/settings.tsx
index 5ad9b122224f..8a40a460304c 100644
--- a/front/pages/w/[wId]/a/[aId]/settings.tsx
+++ b/front/pages/w/[wId]/a/[aId]/settings.tsx
@@ -1,3 +1,4 @@
+import { Tab } from "@dust-tt/sparkle";
import { ChevronRightIcon } from "@heroicons/react/24/outline";
import { GetServerSideProps, InferGetServerSidePropsType } from "next";
import Link from "next/link";
@@ -7,6 +8,7 @@ import { useEffect } from "react";
import { Button } from "@app/components/Button";
import AppLayout from "@app/components/sparkle/AppLayout";
+import { AppLayoutSimpleCloseTitle } from "@app/components/sparkle/AppLayoutTitle";
import {
subNavigationAdmin,
subNavigationApp,
@@ -160,187 +162,204 @@ export default function SettingsView({
subNavigation={subNavigationAdmin({
owner,
current: "developers",
- subMenuLabel: app.name,
- subMenu: subNavigationApp({ owner, app, current: "settings" }),
})}
+ titleChildren={
+
{
+ void router.push(`/w/${owner.sId}/a`);
+ }}
+ />
+ }
>
-
-
-
-
-
-
-
- App Name
-
-
-
- {owner.name}
-
-
- setAppName(e.target.value)}
- />
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
- Description
+ App Name
-
-
- setAppDescription(e.target.value)}
- />
-
-
- A good description will help others discover and understand
- the purpose of your app. It is also visible at the top of
- your app specification.
-
-
-
-
-
- Visibility
-
-
-
-
{
- if (e.target.value != appVisibility) {
- setAppVisibility(e.target.value as AppVisibility);
- }
- }}
- />
-
- Public
-
- Anyone on the Internet can see the app. Only you can
- edit.
-
-
-
-
-
{
- if (e.target.value != appVisibility) {
- setAppVisibility(e.target.value as AppVisibility);
- }
- }}
- />
-
- Private
-
- Only you can see and edit the app.
-
-
-
-
-
{
- if (e.target.value != appVisibility) {
- setAppVisibility(e.target.value as AppVisibility);
- }
- }}
- />
-
- Unlisted
-
- Anyone with the link can see the app. Only you can
- edit.
-
-
+
+
+
+ Description
+
+
+ optional
- {appVisibility == "deleted" ? (
-
- This app is currently marked as deleted. Change its
- visibility above to restore it.
-
- ) : null}
-
+
+ setAppDescription(e.target.value)}
+ />
+
+
+ A good description will help others discover and
+ understand the purpose of your app. It is also visible at
+ the top of your app specification.
+
+
+
+
+
+
+ Visibility
+
+
+
+
{
+ if (e.target.value != appVisibility) {
+ setAppVisibility(
+ e.target.value as AppVisibility
+ );
+ }
+ }}
+ />
+
+ Public
+
+ Anyone on the Internet can see the app. Only you
+ can edit.
+
+
+
+
+
{
+ if (e.target.value != appVisibility) {
+ setAppVisibility(
+ e.target.value as AppVisibility
+ );
+ }
+ }}
+ />
+
+ Private
+
+ Only you can see and edit the app.
+
+
+
+
+
{
+ if (e.target.value != appVisibility) {
+ setAppVisibility(
+ e.target.value as AppVisibility
+ );
+ }
+ }}
+ />
+
+ Unlisted
+
+ Anyone with the link can see the app. Only you can
+ edit.
+
+
+
+
+ {appVisibility == "deleted" ? (
+
+ This app is currently marked as deleted. Change its
+ visibility above to restore it.
+
+ ) : null}
+
+
-
-
-
- {isUpdating ? "Updating..." : "Update"}
-
-
-
-
- Clone
-
-
-
+
- {isDeleting ? "Deleting..." : "Delete"}
+ {isUpdating ? "Updating..." : "Update"}
+
+
+
+ Clone
+
+
+
+
+ {isDeleting ? "Deleting..." : "Delete"}
+
+
diff --git a/front/pages/w/[wId]/a/[aId]/specification.tsx b/front/pages/w/[wId]/a/[aId]/specification.tsx
index 7bee244ca816..b3ccaffa7da7 100644
--- a/front/pages/w/[wId]/a/[aId]/specification.tsx
+++ b/front/pages/w/[wId]/a/[aId]/specification.tsx
@@ -1,6 +1,9 @@
+import { Tab } from "@dust-tt/sparkle";
import { GetServerSideProps, InferGetServerSidePropsType } from "next";
+import { useRouter } from "next/router";
import AppLayout from "@app/components/sparkle/AppLayout";
+import { AppLayoutSimpleCloseTitle } from "@app/components/sparkle/AppLayoutTitle";
import {
subNavigationAdmin,
subNavigationApp,
@@ -84,6 +87,8 @@ export default function Specification({
specification,
gaTrackingId,
}: InferGetServerSidePropsType
) {
+ const router = useRouter();
+
return (
{
+ void router.push(`/w/${owner.sId}/a`);
+ }}
+ />
+ }
>
-
- {specification}
+
+
+
+
+
+ {specification}
+
);