@agent-native/core 0.24.1 → 0.24.2
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/README.md +22 -2
- package/dist/agent/thread-data-builder.d.ts +1 -0
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +8 -2
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/chat-threads/store.d.ts +9 -0
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +73 -8
- package/dist/chat-threads/store.js.map +1 -1
- package/dist/cli/templates-meta.js +1 -1
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +2 -0
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +2 -2
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts +3 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +12 -3
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.js +2 -2
- package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.js +1 -1
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +29 -2
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/org/workspace-app-links.d.ts +1 -0
- package/dist/client/org/workspace-app-links.d.ts.map +1 -1
- package/dist/client/org/workspace-app-links.js +7 -1
- package/dist/client/org/workspace-app-links.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts +9 -0
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +135 -32
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/client/use-chat-threads.spec.js +143 -0
- package/dist/client/use-chat-threads.spec.js.map +1 -1
- package/dist/scripts/chat/search-chats.d.ts.map +1 -1
- package/dist/scripts/chat/search-chats.js +7 -1
- package/dist/scripts/chat/search-chats.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +115 -6
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +45 -0
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/templates/workspace-root/AGENTS.md +6 -5
- package/dist/templates/workspace-root/README.md +1 -1
- package/docs/content/cloneable-saas.md +1 -0
- package/docs/content/faq.md +1 -0
- package/docs/content/getting-started.md +1 -0
- package/docs/content/multi-tenancy.md +1 -1
- package/package.json +1 -1
- package/src/templates/workspace-root/AGENTS.md +6 -5
- package/src/templates/workspace-root/README.md +1 -1
|
@@ -69,12 +69,12 @@ function buildNewWorkspaceAppPrompt(input) {
|
|
|
69
69
|
`Requested Dispatch workspace resources for this app:\n${resourceList}`,
|
|
70
70
|
`Dispatch workspace resources with scope=all are inherited workspace context. Do not copy or sync them into the new app; every workspace app reads them at runtime and may override with app shared or personal resources.`,
|
|
71
71
|
``,
|
|
72
|
-
`Pick a starter template that fits the user's prompt — analytics, calendar, content, design, dispatch, forms, mail, slides, clips, or starter when none of the others fit.`,
|
|
72
|
+
`Pick a starter template that fits the user's prompt — analytics, assets, brain, calendar, content, design, dispatch, forms, mail, slides, clips, or starter when none of the others fit.`,
|
|
73
73
|
`If you use the starter template, treat it as scaffolding only: the finished app must use the requested app's real name, home screen, navigation, package metadata, and manifest, and it must not leave visible "Starter", "Blank app", or "New app" UI behind.`,
|
|
74
74
|
`Use the workspace app layout: create it under apps/${input.appId}, mount it at /${input.appId}, keep it on the shared workspace database/hosting model, and avoid table-name collisions by namespacing any new domain tables to the app.`,
|
|
75
75
|
`Important routing rule: from outside the app, link to /${input.appId}; inside apps/${input.appId}, React Router routes are app-local. Use <Link to="/review"> and navigate("/review"), not "/${input.appId}/review"; APP_BASE_PATH supplies the mounted prefix, and hardcoding it causes doubled URLs like /${input.appId}/${input.appId}/review.`,
|
|
76
76
|
`Action-backed UI is mandatory for normal CRUD. Define reads/writes in actions/ with defineAction, expose read actions with http: { method: "GET" }, and call them from React with useActionQuery/useActionMutation. Do not create duplicate JSON CRUD routes under /api/* for data the agent can mutate; those bypass the action cache contract and make agent-created records invisible until reload. If a rare raw fetch is unavoidable, include useChangeVersions(["action", <domain-source>]) in the query key and wrap framework URLs with agentNativePath("/_agent-native/actions/<name>") so mounted apps call the right URL.`,
|
|
77
|
-
`If the user's prompt mentions sibling apps like Mail, Calendar, Dispatch, or other templates, treat them as existing workspace neighbors or integrations. Do not scaffold those sibling apps inside apps/${input.appId} unless the user explicitly asks to create them too.`,
|
|
77
|
+
`If the user's prompt mentions sibling apps like Mail, Calendar, Assets, Brain, Dispatch, or other templates, treat them as existing workspace neighbors or integrations. Do not scaffold those sibling apps inside apps/${input.appId} unless the user explicitly asks to create them too.`,
|
|
78
78
|
`Do not satisfy this by adding a route, page, component, or file inside apps/starter or another existing app unless the user explicitly asks to modify that existing app.`,
|
|
79
79
|
`Use relative workspace links like /${input.appId}. Do not hardcode localhost, 127.0.0.1, 8080, 8100, or any dev port; the active workspace gateway/browser origin owns the port.`,
|
|
80
80
|
`Use the framework/template UI stack: shadcn/ui components and @tabler/icons-react. Do not add lucide-react or another icon library for standard UI.`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NewWorkspaceAppFlow.js","sourceRoot":"","sources":["../../src/client/NewWorkspaceAppFlow.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport {\n IconArrowUpRight,\n IconBook,\n IconCheck,\n IconChevronDown,\n IconFileText,\n IconKey,\n} from \"@tabler/icons-react\";\nimport { agentNativePath, appBasePath } from \"./api-path.js\";\nimport { sendToAgentChat } from \"./agent-chat.js\";\nimport { isInBuilderFrame } from \"./builder-frame.js\";\nimport { useDevMode } from \"./use-dev-mode.js\";\nimport { getWorkspaceAppIdValidationError } from \"../shared/workspace-app-id.js\";\nimport { PromptComposer } from \"./composer/PromptComposer.js\";\n\nexport interface VaultSecretOption {\n id: string;\n name: string;\n credentialKey: string;\n provider?: string | null;\n description?: string | null;\n}\n\nexport interface WorkspaceResourceOption {\n id: string;\n kind: \"skill\" | \"instruction\" | \"agent\" | \"knowledge\";\n name: string;\n description?: string | null;\n path: string;\n scope: \"all\" | \"selected\";\n updatedAt?: number;\n}\n\ntype VaultAccessMode = \"all-apps\" | \"manual\";\n\nexport interface NewWorkspaceAppFlowProps {\n sourceApp?: string;\n className?: string;\n dispatchBasePath?: string | null;\n}\n\nfunction slugify(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/^[^a-z]+/, \"\")\n .slice(0, 48);\n}\n\nfunction titleFromPrompt(prompt: string): string {\n const cleaned = prompt\n .replace(/\\b(build|create|make|an?|the|app|tool|dashboard)\\b/gi, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n return slugify(cleaned || \"new-app\") || \"new-app\";\n}\n\nfunction actionUrl(basePath: string | null, action: string): string {\n const path = `/_agent-native/actions/${action}`;\n if (basePath === null) return agentNativePath(path);\n const normalized = basePath.replace(/\\/+$/, \"\");\n return `${normalized}${path}`;\n}\n\nfunction defaultDispatchBasePath(sourceApp?: string): string | null {\n if (sourceApp === \"dispatch\") return null;\n const base = appBasePath();\n if (base === \"/dispatch\") return null;\n return \"/dispatch\";\n}\n\nasync function fetchJson(url: string, init?: RequestInit): Promise<any> {\n const res = await fetch(url, init);\n const data = await res.json().catch(() => null);\n if (!res.ok) {\n throw new Error(\n data?.error || data?.message || `Request failed ${res.status}`,\n );\n }\n return data;\n}\n\nfunction buildNewWorkspaceAppPrompt(input: {\n appId: string;\n prompt: string;\n selectedKeys: string[];\n selectedResources: WorkspaceResourceOption[];\n vaultAccessMode: VaultAccessMode;\n}): string {\n const keyList = input.selectedKeys.join(\", \");\n const grantRequest =\n input.vaultAccessMode === \"all-apps\"\n ? `Dispatch vault access: all saved vault keys are available to every workspace app by default. No per-app vault grants are needed.`\n : keyList\n ? `Requested Dispatch vault key grants for this app: ${keyList}`\n : `Requested Dispatch vault key grants for this app: none`;\n const resourceList = input.selectedResources.length\n ? input.selectedResources\n .map(\n (resource) =>\n `- ${resource.name} (${resource.kind}, ${resource.path})`,\n )\n .join(\"\\n\")\n : \"none\";\n\n return [\n `Create a new agent-native app in this workspace.`,\n `This is a new workspace app request, not a feature request for the current app.`,\n ``,\n `Suggested app name: ${input.appId} (you may adjust the slug if it conflicts)`,\n `User prompt: ${input.prompt.trim()}`,\n `Generate a concise one-sentence app description from the user prompt before coding; save it in apps/${input.appId}/package.json \"description\" so Dispatch and A2A can describe the app.`,\n `If the user mentions a product or company such as Granola, Loom, Superhuman, Linear, or Notion, treat it as product inspiration unless they explicitly ask to connect to that service. Do not invent or require third-party API keys like GRANOLA_API_KEY just because a product is named.`,\n grantRequest,\n `Requested Dispatch workspace resources for this app:\\n${resourceList}`,\n `Dispatch workspace resources with scope=all are inherited workspace context. Do not copy or sync them into the new app; every workspace app reads them at runtime and may override with app shared or personal resources.`,\n ``,\n `Pick a starter template that fits the user's prompt — analytics, calendar, content, design, dispatch, forms, mail, slides, clips, or starter when none of the others fit.`,\n `If you use the starter template, treat it as scaffolding only: the finished app must use the requested app's real name, home screen, navigation, package metadata, and manifest, and it must not leave visible \"Starter\", \"Blank app\", or \"New app\" UI behind.`,\n `Use the workspace app layout: create it under apps/${input.appId}, mount it at /${input.appId}, keep it on the shared workspace database/hosting model, and avoid table-name collisions by namespacing any new domain tables to the app.`,\n `Important routing rule: from outside the app, link to /${input.appId}; inside apps/${input.appId}, React Router routes are app-local. Use <Link to=\"/review\"> and navigate(\"/review\"), not \"/${input.appId}/review\"; APP_BASE_PATH supplies the mounted prefix, and hardcoding it causes doubled URLs like /${input.appId}/${input.appId}/review.`,\n `Action-backed UI is mandatory for normal CRUD. Define reads/writes in actions/ with defineAction, expose read actions with http: { method: \"GET\" }, and call them from React with useActionQuery/useActionMutation. Do not create duplicate JSON CRUD routes under /api/* for data the agent can mutate; those bypass the action cache contract and make agent-created records invisible until reload. If a rare raw fetch is unavoidable, include useChangeVersions([\"action\", <domain-source>]) in the query key and wrap framework URLs with agentNativePath(\"/_agent-native/actions/<name>\") so mounted apps call the right URL.`,\n `If the user's prompt mentions sibling apps like Mail, Calendar, Dispatch, or other templates, treat them as existing workspace neighbors or integrations. Do not scaffold those sibling apps inside apps/${input.appId} unless the user explicitly asks to create them too.`,\n `Do not satisfy this by adding a route, page, component, or file inside apps/starter or another existing app unless the user explicitly asks to modify that existing app.`,\n `Use relative workspace links like /${input.appId}. Do not hardcode localhost, 127.0.0.1, 8080, 8100, or any dev port; the active workspace gateway/browser origin owns the port.`,\n `Use the framework/template UI stack: shadcn/ui components and @tabler/icons-react. Do not add lucide-react or another icon library for standard UI.`,\n `Ensure the React Router client entry preserves APP_BASE_PATH/VITE_APP_BASE_PATH via appBasePath().`,\n input.vaultAccessMode === \"all-apps\"\n ? `Do not create per-app Dispatch vault grants unless the workspace switches vault access to manual or the user explicitly asks for manual grants.`\n : keyList\n ? `After the app exists, grant the selected Dispatch vault keys to appId \"${input.appId}\" and sync them once the app server is available. Treat these as requested grants, not active grants before creation succeeds.`\n : `Do not grant any Dispatch vault keys unless the user asks later.`,\n input.selectedResources.length\n ? `After the app exists, grant the selected Dispatch workspace resources to appId \"${input.appId}\". Do not sync all-app workspace resources; they are inherited.`\n : `Do not grant any selected-only Dispatch workspace resources unless the user asks later.`,\n ``,\n `App readiness requirements before handing off:`,\n `- Ensure apps/${input.appId}/package.json exists with displayName/name and a concise description so Dispatch and the workspace gateway discover it from the filesystem. There is no separate workspace app registry to edit.`,\n `- Update the app manifest/package/deploy metadata needed by the existing workspace deployment model; do not leave the app relying only on local discovery.`,\n `- Verify the app's agent card/A2A metadata is ready so Dispatch can discover and delegate to the app after deployment. Every sibling workspace app is available over A2A by default through call-agent, with names and descriptions from the workspace app registry.`,\n `- Include a final verification note covering filesystem discovery, manifest/deploy metadata, relative same-origin routing, and agent-card readiness.`,\n `When it is ready, start or update the workspace dev server and navigate the user to /${input.appId}.`,\n ].join(\"\\n\");\n}\n\nexport function NewWorkspaceAppFlow({\n sourceApp = \"starter\",\n className = \"\",\n dispatchBasePath,\n}: NewWorkspaceAppFlowProps) {\n const [selectedSecretIds, setSelectedSecretIds] = useState<string[]>([]);\n const [selectedResourceIds, setSelectedResourceIds] = useState<string[]>([]);\n const [secrets, setSecrets] = useState<VaultSecretOption[]>([]);\n const [resources, setResources] = useState<WorkspaceResourceOption[]>([]);\n const [vaultAccessMode, setVaultAccessMode] =\n useState<VaultAccessMode>(\"all-apps\");\n const [secretsError, setSecretsError] = useState<string | null>(null);\n const [resourcesError, setResourcesError] = useState<string | null>(null);\n const [statusMessage, setStatusMessage] = useState<string | null>(null);\n const [branchUrl, setBranchUrl] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const { isDevMode } = useDevMode();\n\n const effectiveDispatchBasePath =\n dispatchBasePath === undefined\n ? defaultDispatchBasePath(sourceApp)\n : dispatchBasePath;\n\n useEffect(() => {\n let cancelled = false;\n const secretsUrl = actionUrl(\n effectiveDispatchBasePath,\n \"list-vault-secret-options\",\n );\n const vaultAccessUrl = actionUrl(\n effectiveDispatchBasePath,\n \"get-vault-access-settings\",\n );\n const resourcesUrl = actionUrl(\n effectiveDispatchBasePath,\n \"list-workspace-resource-options\",\n );\n\n fetchJson(secretsUrl)\n .then((data) => {\n if (cancelled) return;\n setSecrets(Array.isArray(data) ? data : []);\n setSecretsError(null);\n })\n .catch((err) => {\n if (cancelled) return;\n setSecrets([]);\n setSecretsError(err?.message || \"Could not load Dispatch keys\");\n });\n\n fetchJson(vaultAccessUrl)\n .then((data) => {\n if (cancelled) return;\n setVaultAccessMode(data?.mode === \"manual\" ? \"manual\" : \"all-apps\");\n })\n .catch(() => {\n if (cancelled) return;\n setVaultAccessMode(\"manual\");\n });\n\n fetchJson(resourcesUrl)\n .then((data) => {\n if (cancelled) return;\n setResources(Array.isArray(data) ? data : []);\n setResourcesError(null);\n })\n .catch((err) => {\n if (cancelled) return;\n setResources([]);\n setResourcesError(err?.message || \"Could not load Dispatch resources\");\n });\n\n return () => {\n cancelled = true;\n };\n }, [effectiveDispatchBasePath]);\n\n const selectedSecrets = useMemo(\n () => secrets.filter((secret) => selectedSecretIds.includes(secret.id)),\n [secrets, selectedSecretIds],\n );\n const selectedResources = useMemo(\n () =>\n resources.filter((resource) => selectedResourceIds.includes(resource.id)),\n [resources, selectedResourceIds],\n );\n const selectedSecretLabel =\n vaultAccessMode === \"all-apps\"\n ? \"All keys included\"\n : selectedSecretIds.length === 0\n ? \"No keys selected\"\n : `${selectedSecretIds.length} key${selectedSecretIds.length === 1 ? \"\" : \"s\"} selected`;\n const selectedResourceLabel =\n selectedResourceIds.length === 0\n ? \"No resources selected\"\n : `${selectedResourceIds.length} resource${selectedResourceIds.length === 1 ? \"\" : \"s\"} selected`;\n\n async function submit(rawPrompt: string) {\n const prompt = rawPrompt.trim();\n if (!prompt || isSubmitting) return;\n const appId = titleFromPrompt(prompt);\n const validationError = getWorkspaceAppIdValidationError(appId);\n if (validationError) {\n setStatusMessage(validationError);\n return;\n }\n\n const message = buildNewWorkspaceAppPrompt({\n appId,\n prompt,\n selectedKeys:\n vaultAccessMode === \"manual\"\n ? selectedSecrets.map((s) => s.credentialKey)\n : [],\n selectedResources,\n vaultAccessMode,\n });\n setIsSubmitting(true);\n setStatusMessage(null);\n setBranchUrl(null);\n\n try {\n if (isInBuilderFrame()) {\n sendToAgentChat({ message, submit: true, type: \"code\" });\n setStatusMessage(\"Sent to Builder chat.\");\n } else if (isDevMode) {\n sendToAgentChat({ message, submit: true, type: \"code\", newTab: true });\n setStatusMessage(\"Sent to the local agent.\");\n } else {\n const result = await fetchJson(\n actionUrl(effectiveDispatchBasePath, \"start-workspace-app-creation\"),\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n prompt,\n appId,\n secretIds: vaultAccessMode === \"manual\" ? selectedSecretIds : [],\n resourceIds: selectedResourceIds,\n }),\n },\n );\n if (result?.mode === \"builder\") {\n setBranchUrl(result?.url || null);\n setStatusMessage(\"Builder branch created.\");\n } else {\n setStatusMessage(\n result?.message ||\n \"Builder app creation is coming soon here. Open this workspace in Builder to create an app from this prompt.\",\n );\n }\n }\n } catch (err: any) {\n setStatusMessage(err?.message || \"Could not start the new app flow.\");\n } finally {\n setIsSubmitting(false);\n }\n }\n\n function toggleSecret(id: string) {\n setSelectedSecretIds((current) =>\n current.includes(id)\n ? current.filter((existing) => existing !== id)\n : [...current, id],\n );\n }\n\n function toggleResource(id: string) {\n setSelectedResourceIds((current) =>\n current.includes(id)\n ? current.filter((existing) => existing !== id)\n : [...current, id],\n );\n }\n\n return (\n <section\n className={`mx-auto flex w-full max-w-5xl flex-col gap-5 px-4 py-6 ${className}`}\n >\n <div className=\"grid gap-5 lg:grid-cols-[minmax(0,1fr)_320px]\">\n <div className=\"flex flex-col gap-3\">\n <PromptComposer\n autoFocus\n disabled={isSubmitting}\n placeholder=\"Describe the app your teammate should be able to use...\"\n draftScope=\"dispatch:new-app\"\n preserveDraftOnSubmit\n onSubmit={(text) => submit(text)}\n />\n\n {statusMessage ? (\n <div className=\"rounded-md border border-border bg-muted/40 px-3 py-2 text-sm text-muted-foreground\">\n {statusMessage}\n {branchUrl ? (\n <a\n href={branchUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"ml-2 inline-flex items-center gap-1 font-medium text-foreground underline\"\n >\n Open branch <IconArrowUpRight className=\"h-3 w-3\" />\n </a>\n ) : null}\n </div>\n ) : null}\n </div>\n\n <aside className=\"overflow-hidden rounded-lg border border-border bg-card\">\n <div className=\"border-b border-border px-4 py-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2 text-sm font-medium\">\n <IconKey className=\"h-4 w-4\" />\n Dispatch keys\n </div>\n <span className=\"shrink-0 rounded border border-border bg-background/40 px-2 py-0.5 text-[11px] text-muted-foreground\">\n {selectedSecretLabel}\n </span>\n </div>\n </div>\n <div className=\"max-h-[220px] space-y-2 overflow-y-auto p-3\">\n {vaultAccessMode === \"all-apps\" ? (\n <p className=\"rounded-md border border-dashed border-border px-3 py-3 text-xs text-muted-foreground\">\n Every saved Dispatch vault key is available to new apps.\n </p>\n ) : secretsError ? (\n <p className=\"rounded-md border border-dashed border-border px-3 py-3 text-xs text-muted-foreground\">\n {secretsError}\n </p>\n ) : secrets.length === 0 ? (\n <p className=\"rounded-md border border-dashed border-border px-3 py-3 text-xs text-muted-foreground\">\n No Dispatch vault keys found yet.\n </p>\n ) : (\n secrets.map((secret) => {\n const selected = selectedSecretIds.includes(secret.id);\n return (\n <div\n key={secret.id}\n className={`group rounded-md border text-sm transition ${\n selected\n ? \"border-primary/45 bg-primary/5 text-foreground shadow-[inset_0_0_0_1px_hsl(var(--primary)/0.08)]\"\n : \"border-border bg-background/25 text-foreground hover:border-muted-foreground/40 hover:bg-accent/35\"\n }`}\n >\n <button\n type=\"button\"\n aria-pressed={selected}\n onClick={() => toggleSecret(secret.id)}\n className=\"flex w-full cursor-pointer items-start gap-3 rounded-md px-3 py-2 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30\"\n >\n <span\n className={`mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded border transition ${\n selected\n ? \"border-primary/60 bg-primary/10 text-primary\"\n : \"border-muted-foreground/35 text-transparent group-hover:border-muted-foreground/60\"\n }`}\n >\n {selected ? <IconCheck className=\"h-3 w-3\" /> : null}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-medium\">\n {secret.credentialKey}\n </span>\n <span className=\"block truncate text-xs text-muted-foreground/70\">\n {selected\n ? \"Will be requested for this app\"\n : \"Click to request\"}\n </span>\n </span>\n </button>\n <details className=\"group/details border-t border-border/60 px-3 py-1.5 text-xs text-muted-foreground/75 open:bg-background/10\">\n <summary className=\"flex cursor-pointer list-none items-center gap-1.5 text-[11px] hover:text-muted-foreground [&::-webkit-details-marker]:hidden\">\n <IconChevronDown className=\"h-3 w-3 transition-transform group-open/details:rotate-180\" />\n Details\n </summary>\n <div className=\"mt-1.5 space-y-1 pb-0.5 pl-4\">\n <div className=\"truncate\">\n Provider: {secret.provider || \"Not specified\"}\n </div>\n <div className=\"truncate\">Name: {secret.name}</div>\n </div>\n </details>\n </div>\n );\n })\n )}\n </div>\n\n <div className=\"border-y border-border px-4 py-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2 text-sm font-medium\">\n <IconBook className=\"h-4 w-4\" />\n Resource packs\n </div>\n <span className=\"shrink-0 rounded border border-border bg-background/40 px-2 py-0.5 text-[11px] text-muted-foreground\">\n {selectedResourceLabel}\n </span>\n </div>\n </div>\n <div className=\"max-h-[220px] space-y-2 overflow-y-auto p-3\">\n {resourcesError ? (\n <p className=\"rounded-md border border-dashed border-border px-3 py-3 text-xs text-muted-foreground\">\n {resourcesError}\n </p>\n ) : resources.length === 0 ? (\n <p className=\"rounded-md border border-dashed border-border px-3 py-3 text-xs text-muted-foreground\">\n No Dispatch resource packs found yet.\n </p>\n ) : (\n resources.map((resource) => {\n const selected = selectedResourceIds.includes(resource.id);\n return (\n <div\n key={resource.id}\n className={`group rounded-md border text-sm transition ${\n selected\n ? \"border-primary/45 bg-primary/5 text-foreground shadow-[inset_0_0_0_1px_hsl(var(--primary)/0.08)]\"\n : \"border-border bg-background/25 text-foreground hover:border-muted-foreground/40 hover:bg-accent/35\"\n }`}\n >\n <button\n type=\"button\"\n aria-pressed={selected}\n onClick={() => toggleResource(resource.id)}\n className=\"flex w-full cursor-pointer items-start gap-3 rounded-md px-3 py-2 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30\"\n >\n <span\n className={`mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded border transition ${\n selected\n ? \"border-primary/60 bg-primary/10 text-primary\"\n : \"border-muted-foreground/35 text-transparent group-hover:border-muted-foreground/60\"\n }`}\n >\n {selected ? <IconCheck className=\"h-3 w-3\" /> : null}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <IconFileText className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/70\" />\n <span className=\"block truncate font-medium\">\n {resource.name}\n </span>\n </span>\n <span className=\"block truncate text-xs text-muted-foreground/70\">\n {resource.kind} · {resource.path}\n </span>\n </span>\n </button>\n <details className=\"group/details border-t border-border/60 px-3 py-1.5 text-xs text-muted-foreground/75 open:bg-background/10\">\n <summary className=\"flex cursor-pointer list-none items-center gap-1.5 text-[11px] hover:text-muted-foreground [&::-webkit-details-marker]:hidden\">\n <IconChevronDown className=\"h-3 w-3 transition-transform group-open/details:rotate-180\" />\n Details\n </summary>\n <div className=\"mt-1.5 space-y-1 pb-0.5 pl-4\">\n <div className=\"truncate\">\n Scope:{\" \"}\n {resource.scope === \"all\"\n ? \"All apps\"\n : \"Selected apps\"}\n </div>\n {resource.description ? (\n <div className=\"line-clamp-2\">\n {resource.description}\n </div>\n ) : null}\n </div>\n </details>\n </div>\n );\n })\n )}\n </div>\n </aside>\n </div>\n </section>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"NewWorkspaceAppFlow.js","sourceRoot":"","sources":["../../src/client/NewWorkspaceAppFlow.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport {\n IconArrowUpRight,\n IconBook,\n IconCheck,\n IconChevronDown,\n IconFileText,\n IconKey,\n} from \"@tabler/icons-react\";\nimport { agentNativePath, appBasePath } from \"./api-path.js\";\nimport { sendToAgentChat } from \"./agent-chat.js\";\nimport { isInBuilderFrame } from \"./builder-frame.js\";\nimport { useDevMode } from \"./use-dev-mode.js\";\nimport { getWorkspaceAppIdValidationError } from \"../shared/workspace-app-id.js\";\nimport { PromptComposer } from \"./composer/PromptComposer.js\";\n\nexport interface VaultSecretOption {\n id: string;\n name: string;\n credentialKey: string;\n provider?: string | null;\n description?: string | null;\n}\n\nexport interface WorkspaceResourceOption {\n id: string;\n kind: \"skill\" | \"instruction\" | \"agent\" | \"knowledge\";\n name: string;\n description?: string | null;\n path: string;\n scope: \"all\" | \"selected\";\n updatedAt?: number;\n}\n\ntype VaultAccessMode = \"all-apps\" | \"manual\";\n\nexport interface NewWorkspaceAppFlowProps {\n sourceApp?: string;\n className?: string;\n dispatchBasePath?: string | null;\n}\n\nfunction slugify(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/^[^a-z]+/, \"\")\n .slice(0, 48);\n}\n\nfunction titleFromPrompt(prompt: string): string {\n const cleaned = prompt\n .replace(/\\b(build|create|make|an?|the|app|tool|dashboard)\\b/gi, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n return slugify(cleaned || \"new-app\") || \"new-app\";\n}\n\nfunction actionUrl(basePath: string | null, action: string): string {\n const path = `/_agent-native/actions/${action}`;\n if (basePath === null) return agentNativePath(path);\n const normalized = basePath.replace(/\\/+$/, \"\");\n return `${normalized}${path}`;\n}\n\nfunction defaultDispatchBasePath(sourceApp?: string): string | null {\n if (sourceApp === \"dispatch\") return null;\n const base = appBasePath();\n if (base === \"/dispatch\") return null;\n return \"/dispatch\";\n}\n\nasync function fetchJson(url: string, init?: RequestInit): Promise<any> {\n const res = await fetch(url, init);\n const data = await res.json().catch(() => null);\n if (!res.ok) {\n throw new Error(\n data?.error || data?.message || `Request failed ${res.status}`,\n );\n }\n return data;\n}\n\nfunction buildNewWorkspaceAppPrompt(input: {\n appId: string;\n prompt: string;\n selectedKeys: string[];\n selectedResources: WorkspaceResourceOption[];\n vaultAccessMode: VaultAccessMode;\n}): string {\n const keyList = input.selectedKeys.join(\", \");\n const grantRequest =\n input.vaultAccessMode === \"all-apps\"\n ? `Dispatch vault access: all saved vault keys are available to every workspace app by default. No per-app vault grants are needed.`\n : keyList\n ? `Requested Dispatch vault key grants for this app: ${keyList}`\n : `Requested Dispatch vault key grants for this app: none`;\n const resourceList = input.selectedResources.length\n ? input.selectedResources\n .map(\n (resource) =>\n `- ${resource.name} (${resource.kind}, ${resource.path})`,\n )\n .join(\"\\n\")\n : \"none\";\n\n return [\n `Create a new agent-native app in this workspace.`,\n `This is a new workspace app request, not a feature request for the current app.`,\n ``,\n `Suggested app name: ${input.appId} (you may adjust the slug if it conflicts)`,\n `User prompt: ${input.prompt.trim()}`,\n `Generate a concise one-sentence app description from the user prompt before coding; save it in apps/${input.appId}/package.json \"description\" so Dispatch and A2A can describe the app.`,\n `If the user mentions a product or company such as Granola, Loom, Superhuman, Linear, or Notion, treat it as product inspiration unless they explicitly ask to connect to that service. Do not invent or require third-party API keys like GRANOLA_API_KEY just because a product is named.`,\n grantRequest,\n `Requested Dispatch workspace resources for this app:\\n${resourceList}`,\n `Dispatch workspace resources with scope=all are inherited workspace context. Do not copy or sync them into the new app; every workspace app reads them at runtime and may override with app shared or personal resources.`,\n ``,\n `Pick a starter template that fits the user's prompt — analytics, assets, brain, calendar, content, design, dispatch, forms, mail, slides, clips, or starter when none of the others fit.`,\n `If you use the starter template, treat it as scaffolding only: the finished app must use the requested app's real name, home screen, navigation, package metadata, and manifest, and it must not leave visible \"Starter\", \"Blank app\", or \"New app\" UI behind.`,\n `Use the workspace app layout: create it under apps/${input.appId}, mount it at /${input.appId}, keep it on the shared workspace database/hosting model, and avoid table-name collisions by namespacing any new domain tables to the app.`,\n `Important routing rule: from outside the app, link to /${input.appId}; inside apps/${input.appId}, React Router routes are app-local. Use <Link to=\"/review\"> and navigate(\"/review\"), not \"/${input.appId}/review\"; APP_BASE_PATH supplies the mounted prefix, and hardcoding it causes doubled URLs like /${input.appId}/${input.appId}/review.`,\n `Action-backed UI is mandatory for normal CRUD. Define reads/writes in actions/ with defineAction, expose read actions with http: { method: \"GET\" }, and call them from React with useActionQuery/useActionMutation. Do not create duplicate JSON CRUD routes under /api/* for data the agent can mutate; those bypass the action cache contract and make agent-created records invisible until reload. If a rare raw fetch is unavoidable, include useChangeVersions([\"action\", <domain-source>]) in the query key and wrap framework URLs with agentNativePath(\"/_agent-native/actions/<name>\") so mounted apps call the right URL.`,\n `If the user's prompt mentions sibling apps like Mail, Calendar, Assets, Brain, Dispatch, or other templates, treat them as existing workspace neighbors or integrations. Do not scaffold those sibling apps inside apps/${input.appId} unless the user explicitly asks to create them too.`,\n `Do not satisfy this by adding a route, page, component, or file inside apps/starter or another existing app unless the user explicitly asks to modify that existing app.`,\n `Use relative workspace links like /${input.appId}. Do not hardcode localhost, 127.0.0.1, 8080, 8100, or any dev port; the active workspace gateway/browser origin owns the port.`,\n `Use the framework/template UI stack: shadcn/ui components and @tabler/icons-react. Do not add lucide-react or another icon library for standard UI.`,\n `Ensure the React Router client entry preserves APP_BASE_PATH/VITE_APP_BASE_PATH via appBasePath().`,\n input.vaultAccessMode === \"all-apps\"\n ? `Do not create per-app Dispatch vault grants unless the workspace switches vault access to manual or the user explicitly asks for manual grants.`\n : keyList\n ? `After the app exists, grant the selected Dispatch vault keys to appId \"${input.appId}\" and sync them once the app server is available. Treat these as requested grants, not active grants before creation succeeds.`\n : `Do not grant any Dispatch vault keys unless the user asks later.`,\n input.selectedResources.length\n ? `After the app exists, grant the selected Dispatch workspace resources to appId \"${input.appId}\". Do not sync all-app workspace resources; they are inherited.`\n : `Do not grant any selected-only Dispatch workspace resources unless the user asks later.`,\n ``,\n `App readiness requirements before handing off:`,\n `- Ensure apps/${input.appId}/package.json exists with displayName/name and a concise description so Dispatch and the workspace gateway discover it from the filesystem. There is no separate workspace app registry to edit.`,\n `- Update the app manifest/package/deploy metadata needed by the existing workspace deployment model; do not leave the app relying only on local discovery.`,\n `- Verify the app's agent card/A2A metadata is ready so Dispatch can discover and delegate to the app after deployment. Every sibling workspace app is available over A2A by default through call-agent, with names and descriptions from the workspace app registry.`,\n `- Include a final verification note covering filesystem discovery, manifest/deploy metadata, relative same-origin routing, and agent-card readiness.`,\n `When it is ready, start or update the workspace dev server and navigate the user to /${input.appId}.`,\n ].join(\"\\n\");\n}\n\nexport function NewWorkspaceAppFlow({\n sourceApp = \"starter\",\n className = \"\",\n dispatchBasePath,\n}: NewWorkspaceAppFlowProps) {\n const [selectedSecretIds, setSelectedSecretIds] = useState<string[]>([]);\n const [selectedResourceIds, setSelectedResourceIds] = useState<string[]>([]);\n const [secrets, setSecrets] = useState<VaultSecretOption[]>([]);\n const [resources, setResources] = useState<WorkspaceResourceOption[]>([]);\n const [vaultAccessMode, setVaultAccessMode] =\n useState<VaultAccessMode>(\"all-apps\");\n const [secretsError, setSecretsError] = useState<string | null>(null);\n const [resourcesError, setResourcesError] = useState<string | null>(null);\n const [statusMessage, setStatusMessage] = useState<string | null>(null);\n const [branchUrl, setBranchUrl] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const { isDevMode } = useDevMode();\n\n const effectiveDispatchBasePath =\n dispatchBasePath === undefined\n ? defaultDispatchBasePath(sourceApp)\n : dispatchBasePath;\n\n useEffect(() => {\n let cancelled = false;\n const secretsUrl = actionUrl(\n effectiveDispatchBasePath,\n \"list-vault-secret-options\",\n );\n const vaultAccessUrl = actionUrl(\n effectiveDispatchBasePath,\n \"get-vault-access-settings\",\n );\n const resourcesUrl = actionUrl(\n effectiveDispatchBasePath,\n \"list-workspace-resource-options\",\n );\n\n fetchJson(secretsUrl)\n .then((data) => {\n if (cancelled) return;\n setSecrets(Array.isArray(data) ? data : []);\n setSecretsError(null);\n })\n .catch((err) => {\n if (cancelled) return;\n setSecrets([]);\n setSecretsError(err?.message || \"Could not load Dispatch keys\");\n });\n\n fetchJson(vaultAccessUrl)\n .then((data) => {\n if (cancelled) return;\n setVaultAccessMode(data?.mode === \"manual\" ? \"manual\" : \"all-apps\");\n })\n .catch(() => {\n if (cancelled) return;\n setVaultAccessMode(\"manual\");\n });\n\n fetchJson(resourcesUrl)\n .then((data) => {\n if (cancelled) return;\n setResources(Array.isArray(data) ? data : []);\n setResourcesError(null);\n })\n .catch((err) => {\n if (cancelled) return;\n setResources([]);\n setResourcesError(err?.message || \"Could not load Dispatch resources\");\n });\n\n return () => {\n cancelled = true;\n };\n }, [effectiveDispatchBasePath]);\n\n const selectedSecrets = useMemo(\n () => secrets.filter((secret) => selectedSecretIds.includes(secret.id)),\n [secrets, selectedSecretIds],\n );\n const selectedResources = useMemo(\n () =>\n resources.filter((resource) => selectedResourceIds.includes(resource.id)),\n [resources, selectedResourceIds],\n );\n const selectedSecretLabel =\n vaultAccessMode === \"all-apps\"\n ? \"All keys included\"\n : selectedSecretIds.length === 0\n ? \"No keys selected\"\n : `${selectedSecretIds.length} key${selectedSecretIds.length === 1 ? \"\" : \"s\"} selected`;\n const selectedResourceLabel =\n selectedResourceIds.length === 0\n ? \"No resources selected\"\n : `${selectedResourceIds.length} resource${selectedResourceIds.length === 1 ? \"\" : \"s\"} selected`;\n\n async function submit(rawPrompt: string) {\n const prompt = rawPrompt.trim();\n if (!prompt || isSubmitting) return;\n const appId = titleFromPrompt(prompt);\n const validationError = getWorkspaceAppIdValidationError(appId);\n if (validationError) {\n setStatusMessage(validationError);\n return;\n }\n\n const message = buildNewWorkspaceAppPrompt({\n appId,\n prompt,\n selectedKeys:\n vaultAccessMode === \"manual\"\n ? selectedSecrets.map((s) => s.credentialKey)\n : [],\n selectedResources,\n vaultAccessMode,\n });\n setIsSubmitting(true);\n setStatusMessage(null);\n setBranchUrl(null);\n\n try {\n if (isInBuilderFrame()) {\n sendToAgentChat({ message, submit: true, type: \"code\" });\n setStatusMessage(\"Sent to Builder chat.\");\n } else if (isDevMode) {\n sendToAgentChat({ message, submit: true, type: \"code\", newTab: true });\n setStatusMessage(\"Sent to the local agent.\");\n } else {\n const result = await fetchJson(\n actionUrl(effectiveDispatchBasePath, \"start-workspace-app-creation\"),\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n prompt,\n appId,\n secretIds: vaultAccessMode === \"manual\" ? selectedSecretIds : [],\n resourceIds: selectedResourceIds,\n }),\n },\n );\n if (result?.mode === \"builder\") {\n setBranchUrl(result?.url || null);\n setStatusMessage(\"Builder branch created.\");\n } else {\n setStatusMessage(\n result?.message ||\n \"Builder app creation is coming soon here. Open this workspace in Builder to create an app from this prompt.\",\n );\n }\n }\n } catch (err: any) {\n setStatusMessage(err?.message || \"Could not start the new app flow.\");\n } finally {\n setIsSubmitting(false);\n }\n }\n\n function toggleSecret(id: string) {\n setSelectedSecretIds((current) =>\n current.includes(id)\n ? current.filter((existing) => existing !== id)\n : [...current, id],\n );\n }\n\n function toggleResource(id: string) {\n setSelectedResourceIds((current) =>\n current.includes(id)\n ? current.filter((existing) => existing !== id)\n : [...current, id],\n );\n }\n\n return (\n <section\n className={`mx-auto flex w-full max-w-5xl flex-col gap-5 px-4 py-6 ${className}`}\n >\n <div className=\"grid gap-5 lg:grid-cols-[minmax(0,1fr)_320px]\">\n <div className=\"flex flex-col gap-3\">\n <PromptComposer\n autoFocus\n disabled={isSubmitting}\n placeholder=\"Describe the app your teammate should be able to use...\"\n draftScope=\"dispatch:new-app\"\n preserveDraftOnSubmit\n onSubmit={(text) => submit(text)}\n />\n\n {statusMessage ? (\n <div className=\"rounded-md border border-border bg-muted/40 px-3 py-2 text-sm text-muted-foreground\">\n {statusMessage}\n {branchUrl ? (\n <a\n href={branchUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"ml-2 inline-flex items-center gap-1 font-medium text-foreground underline\"\n >\n Open branch <IconArrowUpRight className=\"h-3 w-3\" />\n </a>\n ) : null}\n </div>\n ) : null}\n </div>\n\n <aside className=\"overflow-hidden rounded-lg border border-border bg-card\">\n <div className=\"border-b border-border px-4 py-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2 text-sm font-medium\">\n <IconKey className=\"h-4 w-4\" />\n Dispatch keys\n </div>\n <span className=\"shrink-0 rounded border border-border bg-background/40 px-2 py-0.5 text-[11px] text-muted-foreground\">\n {selectedSecretLabel}\n </span>\n </div>\n </div>\n <div className=\"max-h-[220px] space-y-2 overflow-y-auto p-3\">\n {vaultAccessMode === \"all-apps\" ? (\n <p className=\"rounded-md border border-dashed border-border px-3 py-3 text-xs text-muted-foreground\">\n Every saved Dispatch vault key is available to new apps.\n </p>\n ) : secretsError ? (\n <p className=\"rounded-md border border-dashed border-border px-3 py-3 text-xs text-muted-foreground\">\n {secretsError}\n </p>\n ) : secrets.length === 0 ? (\n <p className=\"rounded-md border border-dashed border-border px-3 py-3 text-xs text-muted-foreground\">\n No Dispatch vault keys found yet.\n </p>\n ) : (\n secrets.map((secret) => {\n const selected = selectedSecretIds.includes(secret.id);\n return (\n <div\n key={secret.id}\n className={`group rounded-md border text-sm transition ${\n selected\n ? \"border-primary/45 bg-primary/5 text-foreground shadow-[inset_0_0_0_1px_hsl(var(--primary)/0.08)]\"\n : \"border-border bg-background/25 text-foreground hover:border-muted-foreground/40 hover:bg-accent/35\"\n }`}\n >\n <button\n type=\"button\"\n aria-pressed={selected}\n onClick={() => toggleSecret(secret.id)}\n className=\"flex w-full cursor-pointer items-start gap-3 rounded-md px-3 py-2 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30\"\n >\n <span\n className={`mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded border transition ${\n selected\n ? \"border-primary/60 bg-primary/10 text-primary\"\n : \"border-muted-foreground/35 text-transparent group-hover:border-muted-foreground/60\"\n }`}\n >\n {selected ? <IconCheck className=\"h-3 w-3\" /> : null}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate font-medium\">\n {secret.credentialKey}\n </span>\n <span className=\"block truncate text-xs text-muted-foreground/70\">\n {selected\n ? \"Will be requested for this app\"\n : \"Click to request\"}\n </span>\n </span>\n </button>\n <details className=\"group/details border-t border-border/60 px-3 py-1.5 text-xs text-muted-foreground/75 open:bg-background/10\">\n <summary className=\"flex cursor-pointer list-none items-center gap-1.5 text-[11px] hover:text-muted-foreground [&::-webkit-details-marker]:hidden\">\n <IconChevronDown className=\"h-3 w-3 transition-transform group-open/details:rotate-180\" />\n Details\n </summary>\n <div className=\"mt-1.5 space-y-1 pb-0.5 pl-4\">\n <div className=\"truncate\">\n Provider: {secret.provider || \"Not specified\"}\n </div>\n <div className=\"truncate\">Name: {secret.name}</div>\n </div>\n </details>\n </div>\n );\n })\n )}\n </div>\n\n <div className=\"border-y border-border px-4 py-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2 text-sm font-medium\">\n <IconBook className=\"h-4 w-4\" />\n Resource packs\n </div>\n <span className=\"shrink-0 rounded border border-border bg-background/40 px-2 py-0.5 text-[11px] text-muted-foreground\">\n {selectedResourceLabel}\n </span>\n </div>\n </div>\n <div className=\"max-h-[220px] space-y-2 overflow-y-auto p-3\">\n {resourcesError ? (\n <p className=\"rounded-md border border-dashed border-border px-3 py-3 text-xs text-muted-foreground\">\n {resourcesError}\n </p>\n ) : resources.length === 0 ? (\n <p className=\"rounded-md border border-dashed border-border px-3 py-3 text-xs text-muted-foreground\">\n No Dispatch resource packs found yet.\n </p>\n ) : (\n resources.map((resource) => {\n const selected = selectedResourceIds.includes(resource.id);\n return (\n <div\n key={resource.id}\n className={`group rounded-md border text-sm transition ${\n selected\n ? \"border-primary/45 bg-primary/5 text-foreground shadow-[inset_0_0_0_1px_hsl(var(--primary)/0.08)]\"\n : \"border-border bg-background/25 text-foreground hover:border-muted-foreground/40 hover:bg-accent/35\"\n }`}\n >\n <button\n type=\"button\"\n aria-pressed={selected}\n onClick={() => toggleResource(resource.id)}\n className=\"flex w-full cursor-pointer items-start gap-3 rounded-md px-3 py-2 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/30\"\n >\n <span\n className={`mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded border transition ${\n selected\n ? \"border-primary/60 bg-primary/10 text-primary\"\n : \"border-muted-foreground/35 text-transparent group-hover:border-muted-foreground/60\"\n }`}\n >\n {selected ? <IconCheck className=\"h-3 w-3\" /> : null}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <IconFileText className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground/70\" />\n <span className=\"block truncate font-medium\">\n {resource.name}\n </span>\n </span>\n <span className=\"block truncate text-xs text-muted-foreground/70\">\n {resource.kind} · {resource.path}\n </span>\n </span>\n </button>\n <details className=\"group/details border-t border-border/60 px-3 py-1.5 text-xs text-muted-foreground/75 open:bg-background/10\">\n <summary className=\"flex cursor-pointer list-none items-center gap-1.5 text-[11px] hover:text-muted-foreground [&::-webkit-details-marker]:hidden\">\n <IconChevronDown className=\"h-3 w-3 transition-transform group-open/details:rotate-180\" />\n Details\n </summary>\n <div className=\"mt-1.5 space-y-1 pb-0.5 pl-4\">\n <div className=\"truncate\">\n Scope:{\" \"}\n {resource.scope === \"all\"\n ? \"All apps\"\n : \"Selected apps\"}\n </div>\n {resource.description ? (\n <div className=\"line-clamp-2\">\n {resource.description}\n </div>\n ) : null}\n </div>\n </details>\n </div>\n );\n })\n )}\n </div>\n </aside>\n </div>\n </section>\n );\n}\n"]}
|
|
@@ -82,7 +82,7 @@ function StepMethods({ step, methods, onCompleted, onMarkManualComplete, }) {
|
|
|
82
82
|
const formMethods = methods.filter(isFormMethod);
|
|
83
83
|
if (step.id === "llm" || step.id === "image-generation") {
|
|
84
84
|
return (_jsx(ManagedProviderMethodGroup, { methods: methods, formMethods: formMethods, stepId: step.id, secondaryLabel: step.id === "image-generation"
|
|
85
|
-
? "Add
|
|
85
|
+
? "Add image/video keys"
|
|
86
86
|
: "Add your own provider key", onCompleted: onCompleted, onMarkManualComplete: onMarkManualComplete }));
|
|
87
87
|
}
|
|
88
88
|
if (methods.length > 1 && formMethods.length === methods.length) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OnboardingPanel.js","sourceRoot":"","sources":["../../../src/client/onboarding/OnboardingPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\n/**\n * <OnboardingPanel /> — the setup checklist that sits above the agent chat.\n *\n * The active step is expanded; completed steps collapse with a green check;\n * remaining steps sit dimmed below. Each method renders differently based on\n * its `kind` (link / form / builder-cli-auth / agent-task).\n */\n\nimport React, { useState, useEffect } from \"react\";\nimport {\n IconCheck,\n IconChecklist,\n IconChevronDown,\n IconChevronRight,\n IconChevronUp,\n IconExternalLink,\n IconKey,\n IconLoader2,\n} from \"@tabler/icons-react\";\nimport { useOnboarding } from \"./use-onboarding.js\";\nimport { useOnboardingPreviewMode } from \"./use-preview-mode.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { useDevMode } from \"../use-dev-mode.js\";\nimport { useBuilderConnectFlow } from \"../settings/useBuilderStatus.js\";\nimport type {\n OnboardingMethod,\n OnboardingStepStatus,\n} from \"../../onboarding/types.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\n\ntype FormOnboardingMethod = Extract<OnboardingMethod, { kind: \"form\" }>;\n\ninterface OnboardingPanelProps {\n /** Optional extra styles / classes for the wrapper. */\n className?: string;\n /** Override the built-in title. */\n title?: string;\n}\n\nexport function OnboardingPanel({\n className,\n title = \"Setup\",\n}: OnboardingPanelProps) {\n const previewMode = useOnboardingPreviewMode();\n const onboarding = useOnboarding({ preview: previewMode });\n const { isDevMode } = useDevMode();\n const {\n steps: rawSteps,\n currentStepId: rawCurrentStepId,\n dismissed,\n loading,\n refresh,\n complete,\n dismiss,\n } = onboarding;\n // `database` and `auth` steps only apply to local dev (SQLite default,\n // local-mode auth bypass). In production those are configured via env\n // vars / deployment config, so don't nag the user about them.\n const DEV_ONLY_STEP_IDS = new Set([\"database\", \"auth\"]);\n const steps = isDevMode\n ? rawSteps\n : rawSteps.filter((s) => !DEV_ONLY_STEP_IDS.has(s.id));\n const totalCount = steps.length;\n const completeCount = steps.filter((s) => s.complete).length;\n const allComplete = steps.filter((s) => s.required).every((s) => s.complete);\n const currentStepId = steps.some((s) => s.id === rawCurrentStepId)\n ? rawCurrentStepId\n : (steps.find((s) => s.required && !s.complete)?.id ??\n steps.find((s) => !s.complete)?.id ??\n null);\n // Default expanded. (Older code used `useState(!allComplete)`, but the first\n // render fires with `steps === []` — `[].every()` is vacuously true, so\n // `allComplete` was true and `expanded` got locked to false even after the\n // real incomplete steps loaded.)\n const [expanded, setExpanded] = useState(true);\n\n if (loading || totalCount === 0) return null;\n // Preview mode (dev overlay) bypasses the auto-hide so template authors\n // can render the new-user flow even when their own setup is done.\n if (!previewMode) {\n if (dismissed) return null;\n // Auto-hide once every required step is done — no need to take up sidebar\n // space when there's nothing left to do.\n if (allComplete) return null;\n }\n\n if (!expanded) {\n return (\n <div className={className} style={styles.compactBanner}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setExpanded(true)}\n style={styles.compactBannerBtn}\n aria-label=\"Expand setup\"\n >\n <span style={allComplete ? styles.checkDone : styles.checkTodo}>\n {allComplete ? <IconCheck size={12} strokeWidth={3} /> : null}\n </span>\n <span style={styles.headerTitle}>{title}</span>\n <span style={styles.headerCounter}>\n {completeCount} of {totalCount}\n </span>\n <span\n style={{ marginLeft: \"auto\", opacity: 0.5, display: \"flex\" }}\n >\n <IconChevronDown size={14} />\n </span>\n </button>\n </TooltipTrigger>\n <TooltipContent>Expand setup</TooltipContent>\n </Tooltip>\n </div>\n );\n }\n\n return (\n <div className={className} style={styles.root}>\n <div style={styles.header}>\n <div style={styles.headerLeft}>\n {allComplete ? (\n <span style={styles.checkDone}>\n <IconCheck size={12} strokeWidth={3} />\n </span>\n ) : (\n <IconChecklist size={14} style={styles.headerIcon} aria-hidden />\n )}\n <span style={styles.headerTitle}>{title}</span>\n <span style={styles.headerCounter}>\n {completeCount} of {totalCount}\n </span>\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setExpanded(false)}\n aria-label=\"Collapse onboarding\"\n style={styles.dismissBtn}\n >\n <IconChevronUp size={14} />\n </button>\n </TooltipTrigger>\n <TooltipContent>Collapse</TooltipContent>\n </Tooltip>\n </div>\n\n <div style={styles.list}>\n {steps.map((step) => (\n <StepCard\n key={step.id}\n step={step}\n expanded={step.id === currentStepId}\n onMarkComplete={() => complete(step.id)}\n onRefresh={refresh}\n />\n ))}\n </div>\n\n <div style={styles.footer}>\n <button type=\"button\" onClick={dismiss} style={styles.hideLink}>\n Hide setup\n </button>\n </div>\n </div>\n );\n}\n\n// ─── StepCard ──────────────────────────────────────────────────────────────\n\nfunction StepCard({\n step,\n expanded: expandedProp,\n onMarkComplete,\n onRefresh,\n}: {\n step: OnboardingStepStatus;\n expanded: boolean;\n onMarkComplete: () => void;\n onRefresh: () => Promise<void>;\n}) {\n const [expanded, setExpanded] = useState(expandedProp);\n useEffect(() => setExpanded(expandedProp), [expandedProp]);\n\n const isDone = step.complete;\n const sortedMethods = [...step.methods].sort((a, b) => {\n if (!!a.primary === !!b.primary) return 0;\n return a.primary ? -1 : 1;\n });\n\n const handleCompleted = async () => {\n await onRefresh();\n };\n\n return (\n <div\n style={{\n ...styles.card,\n ...(isDone ? styles.cardDone : null),\n }}\n >\n <button\n type=\"button\"\n style={styles.cardHeader}\n onClick={() => setExpanded((e) => !e)}\n aria-expanded={expanded}\n >\n <span style={styles.cardHeaderLeft}>\n <span style={isDone ? styles.checkDone : styles.checkTodo}>\n {isDone ? <IconCheck size={12} strokeWidth={3} /> : null}\n </span>\n <span style={styles.cardTitle}>\n {step.title}\n {step.required && !isDone && (\n <span style={styles.requiredPill}>required</span>\n )}\n </span>\n </span>\n <span style={styles.chevron}>\n {expanded ? (\n <IconChevronDown size={14} />\n ) : (\n <IconChevronRight size={14} />\n )}\n </span>\n </button>\n\n {expanded && (\n <div style={styles.cardBody}>\n <p style={styles.cardDesc}>{step.description}</p>\n <StepMethods\n step={step}\n methods={sortedMethods}\n onCompleted={handleCompleted}\n onMarkManualComplete={onMarkComplete}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction isFormMethod(\n method: OnboardingMethod,\n): method is FormOnboardingMethod {\n return method.kind === \"form\";\n}\n\nfunction StepMethods({\n step,\n methods,\n onCompleted,\n onMarkManualComplete,\n}: {\n step: OnboardingStepStatus;\n methods: OnboardingMethod[];\n onCompleted: () => Promise<void>;\n onMarkManualComplete: () => void;\n}) {\n const formMethods = methods.filter(isFormMethod);\n\n if (step.id === \"llm\" || step.id === \"image-generation\") {\n return (\n <ManagedProviderMethodGroup\n methods={methods}\n formMethods={formMethods}\n stepId={step.id}\n secondaryLabel={\n step.id === \"image-generation\"\n ? \"Add a Gemini API key\"\n : \"Add your own provider key\"\n }\n onCompleted={onCompleted}\n onMarkManualComplete={onMarkManualComplete}\n />\n );\n }\n\n if (methods.length > 1 && formMethods.length === methods.length) {\n const pickerLabel = step.id === \"auth\" ? \"Sign-in path\" : \"Provider\";\n return (\n <div style={styles.methods}>\n <FormMethodPicker\n methods={formMethods}\n label={pickerLabel}\n onCompleted={onCompleted}\n />\n </div>\n );\n }\n\n return (\n <div style={styles.methods}>\n {methods.map((method) => (\n <MethodBlock\n key={method.id}\n method={method}\n stepId={step.id}\n onCompleted={onCompleted}\n onMarkManualComplete={onMarkManualComplete}\n />\n ))}\n </div>\n );\n}\n\nfunction ManagedProviderMethodGroup({\n methods,\n formMethods,\n stepId,\n secondaryLabel,\n onCompleted,\n onMarkManualComplete,\n}: {\n methods: OnboardingMethod[];\n formMethods: FormOnboardingMethod[];\n stepId: string;\n secondaryLabel: string;\n onCompleted: () => Promise<void>;\n onMarkManualComplete: () => void;\n}) {\n const [showKeyForm, setShowKeyForm] = useState(false);\n const primaryMethod =\n methods.find((method) => method.kind === \"builder-cli-auth\") ??\n methods.find((method) => method.primary);\n const otherMethods = methods.filter(\n (method) => method !== primaryMethod && !isFormMethod(method),\n );\n\n return (\n <div style={styles.methods}>\n {primaryMethod && (\n <MethodBlock\n method={primaryMethod}\n stepId={stepId}\n onCompleted={onCompleted}\n onMarkManualComplete={onMarkManualComplete}\n />\n )}\n\n {formMethods.length > 0 && (\n <div style={styles.secondaryPanel}>\n <button\n type=\"button\"\n onClick={() => setShowKeyForm((value) => !value)}\n style={styles.secondaryToggle}\n aria-expanded={showKeyForm}\n >\n <span style={styles.secondaryToggleLeft}>\n <IconKey size={13} aria-hidden />\n <span>{secondaryLabel}</span>\n </span>\n <span style={styles.chevron}>\n {showKeyForm ? (\n <IconChevronDown size={14} />\n ) : (\n <IconChevronRight size={14} />\n )}\n </span>\n </button>\n {showKeyForm && (\n <FormMethodPicker\n methods={formMethods}\n label=\"Provider\"\n onCompleted={onCompleted}\n embedded\n />\n )}\n </div>\n )}\n\n {otherMethods.map((method) => (\n <MethodBlock\n key={method.id}\n method={method}\n stepId={stepId}\n onCompleted={onCompleted}\n onMarkManualComplete={onMarkManualComplete}\n />\n ))}\n </div>\n );\n}\n\nfunction FormMethodPicker({\n methods,\n label,\n onCompleted,\n embedded,\n}: {\n methods: FormOnboardingMethod[];\n label: string;\n onCompleted: () => Promise<void>;\n embedded?: boolean;\n}) {\n const [selectedId, setSelectedId] = useState(methods[0]?.id ?? \"\");\n\n useEffect(() => {\n if (!methods.some((method) => method.id === selectedId)) {\n setSelectedId(methods[0]?.id ?? \"\");\n }\n }, [methods, selectedId]);\n\n const selectedMethod =\n methods.find((method) => method.id === selectedId) ?? methods[0];\n\n if (!selectedMethod) return null;\n\n return (\n <div style={embedded ? styles.methodPickerEmbedded : styles.method}>\n <label style={styles.pickerLabel}>\n <span style={styles.formLabelText}>{label}</span>\n <select\n value={selectedMethod.id}\n onChange={(event) => setSelectedId(event.target.value)}\n style={styles.select}\n >\n {methods.map((method) => (\n <option key={method.id} value={method.id}>\n {method.label}\n </option>\n ))}\n </select>\n </label>\n {selectedMethod.description && (\n <p style={styles.methodDesc}>{selectedMethod.description}</p>\n )}\n <FormMethod\n key={selectedMethod.id}\n method={selectedMethod}\n onCompleted={onCompleted}\n />\n </div>\n );\n}\n\n// ─── MethodBlock ───────────────────────────────────────────────────────────\n\nfunction MethodBlock({\n method,\n stepId,\n onCompleted,\n onMarkManualComplete,\n}: {\n method: OnboardingMethod;\n stepId: string;\n onCompleted: () => Promise<void>;\n onMarkManualComplete: () => void;\n}) {\n return (\n <div style={method.primary ? styles.methodPrimary : styles.method}>\n <div style={styles.methodHeader}>\n <span style={styles.methodLabel}>\n {method.label}\n {method.badge && (\n <span style={badgeStyle(method.badge)}>{method.badge}</span>\n )}\n </span>\n </div>\n {method.description && (\n <p style={styles.methodDesc}>{method.description}</p>\n )}\n <MethodBody\n method={method}\n stepId={stepId}\n onCompleted={onCompleted}\n onMarkManualComplete={onMarkManualComplete}\n />\n </div>\n );\n}\n\nfunction MethodBody({\n method,\n stepId,\n onCompleted,\n onMarkManualComplete,\n}: {\n method: OnboardingMethod;\n stepId: string;\n onCompleted: () => Promise<void>;\n onMarkManualComplete: () => void;\n}) {\n if (method.disabled) {\n return (\n <button\n type=\"button\"\n disabled\n style={buttonDisabled(method.primary)}\n aria-disabled=\"true\"\n >\n {method.disabledLabel ?? \"Coming soon\"}\n </button>\n );\n }\n\n switch (method.kind) {\n case \"link\":\n return (\n <LinkMethod method={method} onMarkComplete={onMarkManualComplete} />\n );\n case \"form\":\n return <FormMethod method={method} onCompleted={onCompleted} />;\n case \"builder-cli-auth\":\n return (\n <BuilderCliAuthMethod\n onCompleted={onCompleted}\n primary={method.primary}\n />\n );\n case \"agent-task\":\n return <AgentTaskMethod method={method} stepId={stepId} />;\n }\n}\n\n// ─── link ──────────────────────────────────────────────────────────────────\n\nfunction LinkMethod({\n method,\n onMarkComplete,\n}: {\n method: Extract<OnboardingMethod, { kind: \"link\" }>;\n onMarkComplete: () => void;\n}) {\n const { url, external } = method.payload;\n const isNoop = !url || url === \"#\";\n if (isNoop) {\n // Sentinel URL — treat as \"mark this method as the chosen one\".\n return (\n <button\n type=\"button\"\n style={buttonPrimary(method.primary)}\n onClick={onMarkComplete}\n >\n Use this option\n </button>\n );\n }\n return (\n <a\n href={url}\n target={external ? \"_blank\" : undefined}\n rel={external ? \"noopener noreferrer\" : undefined}\n style={{ ...buttonPrimary(method.primary), textDecoration: \"none\" }}\n >\n Continue\n {external && <IconExternalLink size={12} style={{ marginLeft: 4 }} />}\n </a>\n );\n}\n\n// ─── form ──────────────────────────────────────────────────────────────────\n\nfunction FormMethod({\n method,\n onCompleted,\n}: {\n method: Extract<OnboardingMethod, { kind: \"form\" }>;\n onCompleted: () => Promise<void>;\n}) {\n const { fields, writeScope } = method.payload;\n const [values, setValues] = useState<Record<string, string>>({});\n const [saving, setSaving] = useState(false);\n const [err, setErr] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setSaving(true);\n setErr(null);\n try {\n const vars = fields\n .map((f) => ({ key: f.key, value: (values[f.key] ?? \"\").trim() }))\n .filter((v) => v.value !== \"\");\n if (vars.length === 0) {\n setErr(\"Enter a value first.\");\n return;\n }\n const res = await fetch(agentNativePath(\"/_agent-native/env-vars\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ vars, scope: writeScope ?? \"workspace\" }),\n });\n if (!res.ok) {\n const data = await res.json().catch(() => ({}));\n throw new Error(\n (data as { error?: string }).error ?? `Save failed: ${res.status}`,\n );\n }\n setValues({});\n await onCompleted();\n } catch (e) {\n setErr(e instanceof Error ? e.message : \"Save failed\");\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <form onSubmit={handleSubmit} style={styles.form}>\n {fields.map((f) => (\n <label key={f.key} style={styles.formLabel}>\n <span style={styles.formLabelText}>{f.label}</span>\n <input\n type={f.secret ? \"password\" : \"text\"}\n value={values[f.key] ?? \"\"}\n placeholder={f.placeholder}\n onChange={(e) =>\n setValues((v) => ({ ...v, [f.key]: e.target.value }))\n }\n style={styles.input}\n autoComplete=\"off\"\n spellCheck={false}\n />\n </label>\n ))}\n {err && <p style={styles.errText}>{err}</p>}\n <button\n type=\"submit\"\n disabled={saving}\n style={{ ...buttonPrimary(method.primary), opacity: saving ? 0.6 : 1 }}\n >\n {saving ? \"Saving...\" : \"Save\"}\n </button>\n </form>\n );\n}\n\n// ─── builder-cli-auth ──────────────────────────────────────────────────────\n\nfunction BuilderCliAuthMethod({\n onCompleted,\n primary,\n}: {\n onCompleted: () => Promise<void>;\n primary?: boolean;\n}) {\n const { connecting, error, start } = useBuilderConnectFlow({\n trackingSource: \"onboarding_builder_cli_auth\",\n onConnected: onCompleted,\n });\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => start()}\n disabled={connecting}\n style={{ ...buttonPrimary(primary), opacity: connecting ? 0.7 : 1 }}\n >\n {connecting ? (\n <>\n <IconLoader2\n size={12}\n style={{ marginRight: 4 }}\n className=\"animate-spin\"\n />\n Waiting for Builder...\n </>\n ) : (\n \"Connect Builder\"\n )}\n </button>\n {connecting && (\n <p style={styles.methodHint}>\n A Builder tab opened. Choose your team or app space there; setup will\n continue here automatically.\n </p>\n )}\n {error && <p style={styles.errText}>{error}</p>}\n </>\n );\n}\n\n// ─── agent-task ────────────────────────────────────────────────────────────\n\nfunction AgentTaskMethod({\n method,\n stepId: _stepId,\n}: {\n method: Extract<OnboardingMethod, { kind: \"agent-task\" }>;\n stepId: string;\n}) {\n const handleClick = () => {\n sendToAgentChat({ message: method.payload.prompt, submit: true });\n };\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n style={buttonPrimary(method.primary)}\n >\n Ask the agent\n </button>\n );\n}\n\n// ─── styles ────────────────────────────────────────────────────────────────\n\nfunction buttonPrimary(primary: boolean | undefined): React.CSSProperties {\n return {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"6px 12px\",\n borderRadius: 6,\n border: primary\n ? \"1px solid transparent\"\n : \"1px solid rgba(255,255,255,0.15)\",\n background: primary ? \"#3b82f6\" : \"rgba(255,255,255,0.04)\",\n color: primary ? \"#fff\" : \"inherit\",\n fontSize: 12,\n fontWeight: 500,\n cursor: \"pointer\",\n };\n}\n\nfunction buttonDisabled(primary: boolean | undefined): React.CSSProperties {\n return {\n ...buttonPrimary(primary),\n border: \"1px solid rgba(255,255,255,0.12)\",\n background: primary ? \"rgba(255,255,255,0.08)\" : \"rgba(255,255,255,0.04)\",\n color: \"rgba(255,255,255,0.5)\",\n cursor: \"not-allowed\",\n };\n}\n\nfunction badgeStyle(\n kind: \"recommended\" | \"beta\" | \"free\" | \"soon\",\n): React.CSSProperties {\n const palette = {\n recommended: { bg: \"rgba(59,130,246,0.15)\", fg: \"#60a5fa\" },\n beta: { bg: \"rgba(6,182,212,0.15)\", fg: \"#22d3ee\" },\n free: { bg: \"rgba(34,197,94,0.15)\", fg: \"#4ade80\" },\n soon: { bg: \"rgba(148,163,184,0.15)\", fg: \"#cbd5e1\" },\n }[kind];\n return {\n marginLeft: 6,\n fontSize: 10,\n padding: \"1px 6px\",\n borderRadius: 4,\n background: palette.bg,\n color: palette.fg,\n fontWeight: 500,\n textTransform: \"uppercase\" as const,\n letterSpacing: 0.3,\n };\n}\n\nconst styles: Record<string, React.CSSProperties> = {\n root: {\n borderBottom: \"1px solid rgba(255,255,255,0.06)\",\n background: \"rgba(255,255,255,0.02)\",\n fontSize: 12,\n display: \"flex\",\n flexDirection: \"column\",\n maxHeight: \"60vh\",\n minHeight: 0,\n },\n compactBanner: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderBottom: \"1px solid rgba(255,255,255,0.06)\",\n background: \"rgba(34,197,94,0.04)\",\n fontSize: 12,\n },\n compactBannerBtn: {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n background: \"transparent\",\n border: \"none\",\n color: \"inherit\",\n cursor: \"pointer\",\n padding: \"6px 12px\",\n flex: 1,\n minWidth: 0,\n },\n header: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 12px\",\n },\n headerLeft: {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n },\n headerIcon: { color: \"#60a5fa\" },\n headerTitle: { fontWeight: 600, fontSize: 12 },\n headerCounter: {\n opacity: 0.5,\n fontSize: 11,\n marginLeft: 4,\n },\n dismissBtn: {\n background: \"transparent\",\n border: \"none\",\n color: \"inherit\",\n opacity: 0.5,\n cursor: \"pointer\",\n padding: 2,\n display: \"flex\",\n },\n list: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n padding: \"4px 8px 10px\",\n overflowY: \"auto\",\n minHeight: 0,\n flex: \"1 1 auto\",\n },\n card: {\n border: \"1px solid hsl(var(--border, 0 0% 100%) / 0.06)\",\n borderRadius: 6,\n background: \"hsl(var(--muted, 0 0% 0%) / 0.12)\",\n },\n cardDone: {\n borderColor: \"rgba(34,197,94,0.12)\",\n background: \"rgba(34,197,94,0.025)\",\n },\n cardHeader: {\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n background: \"transparent\",\n border: \"none\",\n color: \"inherit\",\n padding: \"7px 9px\",\n cursor: \"pointer\",\n textAlign: \"left\" as const,\n },\n cardHeaderLeft: {\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n minWidth: 0,\n },\n cardTitle: {\n fontSize: 12,\n fontWeight: 500,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n minWidth: 0,\n flexWrap: \"wrap\" as const,\n },\n requiredPill: {\n fontSize: 10,\n padding: \"1px 5px\",\n borderRadius: 4,\n background: \"rgba(239,68,68,0.12)\",\n color: \"#f87171\",\n fontWeight: 500,\n },\n chevron: { opacity: 0.5 },\n checkDone: {\n width: 16,\n height: 16,\n borderRadius: \"50%\",\n background: \"#22c55e\",\n color: \"#fff\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n checkTodo: {\n width: 16,\n height: 16,\n borderRadius: \"50%\",\n border: \"1px solid rgba(255,255,255,0.2)\",\n },\n cardBody: {\n padding: \"0 10px 10px 34px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n },\n cardDesc: {\n margin: 0,\n opacity: 0.65,\n fontSize: 12,\n lineHeight: 1.4,\n },\n methods: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n },\n method: {\n padding: \"8px 10px\",\n border: \"1px solid rgba(255,255,255,0.06)\",\n borderRadius: 6,\n background: \"rgba(255,255,255,0.02)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n },\n methodPrimary: {\n padding: \"10px\",\n border: \"1px solid rgba(59,130,246,0.25)\",\n borderRadius: 6,\n background: \"rgba(59,130,246,0.06)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n },\n methodHeader: { display: \"flex\", alignItems: \"center\" },\n methodLabel: { fontSize: 12, fontWeight: 500 },\n methodDesc: { margin: 0, opacity: 0.6, fontSize: 11, lineHeight: 1.4 },\n secondaryPanel: {\n paddingTop: 2,\n },\n secondaryToggle: {\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n padding: \"7px 8px\",\n borderRadius: 6,\n border: \"1px solid rgba(255,255,255,0.08)\",\n background: \"rgba(255,255,255,0.025)\",\n color: \"inherit\",\n cursor: \"pointer\",\n fontSize: 11,\n fontWeight: 500,\n textAlign: \"left\" as const,\n },\n secondaryToggleLeft: {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n minWidth: 0,\n },\n methodPickerEmbedded: {\n paddingTop: 8,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n },\n pickerLabel: { display: \"flex\", flexDirection: \"column\", gap: 3 },\n form: { display: \"flex\", flexDirection: \"column\", gap: 6 },\n formLabel: { display: \"flex\", flexDirection: \"column\", gap: 2 },\n formLabelText: { fontSize: 11, opacity: 0.6 },\n select: {\n width: \"100%\",\n padding: \"6px 8px\",\n fontSize: 12,\n borderRadius: 5,\n border: \"1px solid rgba(255,255,255,0.1)\",\n background: \"rgba(0,0,0,0.25)\",\n color: \"inherit\",\n outline: \"none\",\n boxSizing: \"border-box\" as const,\n },\n input: {\n width: \"100%\",\n padding: \"6px 8px\",\n fontSize: 12,\n borderRadius: 5,\n border: \"1px solid rgba(255,255,255,0.1)\",\n background: \"rgba(0,0,0,0.25)\",\n color: \"inherit\",\n outline: \"none\",\n boxSizing: \"border-box\" as const,\n },\n methodHint: { margin: 0, fontSize: 11, color: \"rgba(255,255,255,0.62)\" },\n errText: { margin: 0, fontSize: 11, color: \"#f87171\" },\n footer: {\n padding: \"0 12px 10px\",\n display: \"flex\",\n justifyContent: \"flex-end\",\n },\n hideLink: {\n background: \"transparent\",\n border: \"none\",\n color: \"inherit\",\n opacity: 0.5,\n cursor: \"pointer\",\n fontSize: 11,\n padding: \"2px 4px\",\n },\n};\n"]}
|
|
1
|
+
{"version":3,"file":"OnboardingPanel.js","sourceRoot":"","sources":["../../../src/client/onboarding/OnboardingPanel.tsx"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\n/**\n * <OnboardingPanel /> — the setup checklist that sits above the agent chat.\n *\n * The active step is expanded; completed steps collapse with a green check;\n * remaining steps sit dimmed below. Each method renders differently based on\n * its `kind` (link / form / builder-cli-auth / agent-task).\n */\n\nimport React, { useState, useEffect } from \"react\";\nimport {\n IconCheck,\n IconChecklist,\n IconChevronDown,\n IconChevronRight,\n IconChevronUp,\n IconExternalLink,\n IconKey,\n IconLoader2,\n} from \"@tabler/icons-react\";\nimport { useOnboarding } from \"./use-onboarding.js\";\nimport { useOnboardingPreviewMode } from \"./use-preview-mode.js\";\nimport { sendToAgentChat } from \"../agent-chat.js\";\nimport { useDevMode } from \"../use-dev-mode.js\";\nimport { useBuilderConnectFlow } from \"../settings/useBuilderStatus.js\";\nimport type {\n OnboardingMethod,\n OnboardingStepStatus,\n} from \"../../onboarding/types.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\n\ntype FormOnboardingMethod = Extract<OnboardingMethod, { kind: \"form\" }>;\n\ninterface OnboardingPanelProps {\n /** Optional extra styles / classes for the wrapper. */\n className?: string;\n /** Override the built-in title. */\n title?: string;\n}\n\nexport function OnboardingPanel({\n className,\n title = \"Setup\",\n}: OnboardingPanelProps) {\n const previewMode = useOnboardingPreviewMode();\n const onboarding = useOnboarding({ preview: previewMode });\n const { isDevMode } = useDevMode();\n const {\n steps: rawSteps,\n currentStepId: rawCurrentStepId,\n dismissed,\n loading,\n refresh,\n complete,\n dismiss,\n } = onboarding;\n // `database` and `auth` steps only apply to local dev (SQLite default,\n // local-mode auth bypass). In production those are configured via env\n // vars / deployment config, so don't nag the user about them.\n const DEV_ONLY_STEP_IDS = new Set([\"database\", \"auth\"]);\n const steps = isDevMode\n ? rawSteps\n : rawSteps.filter((s) => !DEV_ONLY_STEP_IDS.has(s.id));\n const totalCount = steps.length;\n const completeCount = steps.filter((s) => s.complete).length;\n const allComplete = steps.filter((s) => s.required).every((s) => s.complete);\n const currentStepId = steps.some((s) => s.id === rawCurrentStepId)\n ? rawCurrentStepId\n : (steps.find((s) => s.required && !s.complete)?.id ??\n steps.find((s) => !s.complete)?.id ??\n null);\n // Default expanded. (Older code used `useState(!allComplete)`, but the first\n // render fires with `steps === []` — `[].every()` is vacuously true, so\n // `allComplete` was true and `expanded` got locked to false even after the\n // real incomplete steps loaded.)\n const [expanded, setExpanded] = useState(true);\n\n if (loading || totalCount === 0) return null;\n // Preview mode (dev overlay) bypasses the auto-hide so template authors\n // can render the new-user flow even when their own setup is done.\n if (!previewMode) {\n if (dismissed) return null;\n // Auto-hide once every required step is done — no need to take up sidebar\n // space when there's nothing left to do.\n if (allComplete) return null;\n }\n\n if (!expanded) {\n return (\n <div className={className} style={styles.compactBanner}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setExpanded(true)}\n style={styles.compactBannerBtn}\n aria-label=\"Expand setup\"\n >\n <span style={allComplete ? styles.checkDone : styles.checkTodo}>\n {allComplete ? <IconCheck size={12} strokeWidth={3} /> : null}\n </span>\n <span style={styles.headerTitle}>{title}</span>\n <span style={styles.headerCounter}>\n {completeCount} of {totalCount}\n </span>\n <span\n style={{ marginLeft: \"auto\", opacity: 0.5, display: \"flex\" }}\n >\n <IconChevronDown size={14} />\n </span>\n </button>\n </TooltipTrigger>\n <TooltipContent>Expand setup</TooltipContent>\n </Tooltip>\n </div>\n );\n }\n\n return (\n <div className={className} style={styles.root}>\n <div style={styles.header}>\n <div style={styles.headerLeft}>\n {allComplete ? (\n <span style={styles.checkDone}>\n <IconCheck size={12} strokeWidth={3} />\n </span>\n ) : (\n <IconChecklist size={14} style={styles.headerIcon} aria-hidden />\n )}\n <span style={styles.headerTitle}>{title}</span>\n <span style={styles.headerCounter}>\n {completeCount} of {totalCount}\n </span>\n </div>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => setExpanded(false)}\n aria-label=\"Collapse onboarding\"\n style={styles.dismissBtn}\n >\n <IconChevronUp size={14} />\n </button>\n </TooltipTrigger>\n <TooltipContent>Collapse</TooltipContent>\n </Tooltip>\n </div>\n\n <div style={styles.list}>\n {steps.map((step) => (\n <StepCard\n key={step.id}\n step={step}\n expanded={step.id === currentStepId}\n onMarkComplete={() => complete(step.id)}\n onRefresh={refresh}\n />\n ))}\n </div>\n\n <div style={styles.footer}>\n <button type=\"button\" onClick={dismiss} style={styles.hideLink}>\n Hide setup\n </button>\n </div>\n </div>\n );\n}\n\n// ─── StepCard ──────────────────────────────────────────────────────────────\n\nfunction StepCard({\n step,\n expanded: expandedProp,\n onMarkComplete,\n onRefresh,\n}: {\n step: OnboardingStepStatus;\n expanded: boolean;\n onMarkComplete: () => void;\n onRefresh: () => Promise<void>;\n}) {\n const [expanded, setExpanded] = useState(expandedProp);\n useEffect(() => setExpanded(expandedProp), [expandedProp]);\n\n const isDone = step.complete;\n const sortedMethods = [...step.methods].sort((a, b) => {\n if (!!a.primary === !!b.primary) return 0;\n return a.primary ? -1 : 1;\n });\n\n const handleCompleted = async () => {\n await onRefresh();\n };\n\n return (\n <div\n style={{\n ...styles.card,\n ...(isDone ? styles.cardDone : null),\n }}\n >\n <button\n type=\"button\"\n style={styles.cardHeader}\n onClick={() => setExpanded((e) => !e)}\n aria-expanded={expanded}\n >\n <span style={styles.cardHeaderLeft}>\n <span style={isDone ? styles.checkDone : styles.checkTodo}>\n {isDone ? <IconCheck size={12} strokeWidth={3} /> : null}\n </span>\n <span style={styles.cardTitle}>\n {step.title}\n {step.required && !isDone && (\n <span style={styles.requiredPill}>required</span>\n )}\n </span>\n </span>\n <span style={styles.chevron}>\n {expanded ? (\n <IconChevronDown size={14} />\n ) : (\n <IconChevronRight size={14} />\n )}\n </span>\n </button>\n\n {expanded && (\n <div style={styles.cardBody}>\n <p style={styles.cardDesc}>{step.description}</p>\n <StepMethods\n step={step}\n methods={sortedMethods}\n onCompleted={handleCompleted}\n onMarkManualComplete={onMarkComplete}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction isFormMethod(\n method: OnboardingMethod,\n): method is FormOnboardingMethod {\n return method.kind === \"form\";\n}\n\nfunction StepMethods({\n step,\n methods,\n onCompleted,\n onMarkManualComplete,\n}: {\n step: OnboardingStepStatus;\n methods: OnboardingMethod[];\n onCompleted: () => Promise<void>;\n onMarkManualComplete: () => void;\n}) {\n const formMethods = methods.filter(isFormMethod);\n\n if (step.id === \"llm\" || step.id === \"image-generation\") {\n return (\n <ManagedProviderMethodGroup\n methods={methods}\n formMethods={formMethods}\n stepId={step.id}\n secondaryLabel={\n step.id === \"image-generation\"\n ? \"Add image/video keys\"\n : \"Add your own provider key\"\n }\n onCompleted={onCompleted}\n onMarkManualComplete={onMarkManualComplete}\n />\n );\n }\n\n if (methods.length > 1 && formMethods.length === methods.length) {\n const pickerLabel = step.id === \"auth\" ? \"Sign-in path\" : \"Provider\";\n return (\n <div style={styles.methods}>\n <FormMethodPicker\n methods={formMethods}\n label={pickerLabel}\n onCompleted={onCompleted}\n />\n </div>\n );\n }\n\n return (\n <div style={styles.methods}>\n {methods.map((method) => (\n <MethodBlock\n key={method.id}\n method={method}\n stepId={step.id}\n onCompleted={onCompleted}\n onMarkManualComplete={onMarkManualComplete}\n />\n ))}\n </div>\n );\n}\n\nfunction ManagedProviderMethodGroup({\n methods,\n formMethods,\n stepId,\n secondaryLabel,\n onCompleted,\n onMarkManualComplete,\n}: {\n methods: OnboardingMethod[];\n formMethods: FormOnboardingMethod[];\n stepId: string;\n secondaryLabel: string;\n onCompleted: () => Promise<void>;\n onMarkManualComplete: () => void;\n}) {\n const [showKeyForm, setShowKeyForm] = useState(false);\n const primaryMethod =\n methods.find((method) => method.kind === \"builder-cli-auth\") ??\n methods.find((method) => method.primary);\n const otherMethods = methods.filter(\n (method) => method !== primaryMethod && !isFormMethod(method),\n );\n\n return (\n <div style={styles.methods}>\n {primaryMethod && (\n <MethodBlock\n method={primaryMethod}\n stepId={stepId}\n onCompleted={onCompleted}\n onMarkManualComplete={onMarkManualComplete}\n />\n )}\n\n {formMethods.length > 0 && (\n <div style={styles.secondaryPanel}>\n <button\n type=\"button\"\n onClick={() => setShowKeyForm((value) => !value)}\n style={styles.secondaryToggle}\n aria-expanded={showKeyForm}\n >\n <span style={styles.secondaryToggleLeft}>\n <IconKey size={13} aria-hidden />\n <span>{secondaryLabel}</span>\n </span>\n <span style={styles.chevron}>\n {showKeyForm ? (\n <IconChevronDown size={14} />\n ) : (\n <IconChevronRight size={14} />\n )}\n </span>\n </button>\n {showKeyForm && (\n <FormMethodPicker\n methods={formMethods}\n label=\"Provider\"\n onCompleted={onCompleted}\n embedded\n />\n )}\n </div>\n )}\n\n {otherMethods.map((method) => (\n <MethodBlock\n key={method.id}\n method={method}\n stepId={stepId}\n onCompleted={onCompleted}\n onMarkManualComplete={onMarkManualComplete}\n />\n ))}\n </div>\n );\n}\n\nfunction FormMethodPicker({\n methods,\n label,\n onCompleted,\n embedded,\n}: {\n methods: FormOnboardingMethod[];\n label: string;\n onCompleted: () => Promise<void>;\n embedded?: boolean;\n}) {\n const [selectedId, setSelectedId] = useState(methods[0]?.id ?? \"\");\n\n useEffect(() => {\n if (!methods.some((method) => method.id === selectedId)) {\n setSelectedId(methods[0]?.id ?? \"\");\n }\n }, [methods, selectedId]);\n\n const selectedMethod =\n methods.find((method) => method.id === selectedId) ?? methods[0];\n\n if (!selectedMethod) return null;\n\n return (\n <div style={embedded ? styles.methodPickerEmbedded : styles.method}>\n <label style={styles.pickerLabel}>\n <span style={styles.formLabelText}>{label}</span>\n <select\n value={selectedMethod.id}\n onChange={(event) => setSelectedId(event.target.value)}\n style={styles.select}\n >\n {methods.map((method) => (\n <option key={method.id} value={method.id}>\n {method.label}\n </option>\n ))}\n </select>\n </label>\n {selectedMethod.description && (\n <p style={styles.methodDesc}>{selectedMethod.description}</p>\n )}\n <FormMethod\n key={selectedMethod.id}\n method={selectedMethod}\n onCompleted={onCompleted}\n />\n </div>\n );\n}\n\n// ─── MethodBlock ───────────────────────────────────────────────────────────\n\nfunction MethodBlock({\n method,\n stepId,\n onCompleted,\n onMarkManualComplete,\n}: {\n method: OnboardingMethod;\n stepId: string;\n onCompleted: () => Promise<void>;\n onMarkManualComplete: () => void;\n}) {\n return (\n <div style={method.primary ? styles.methodPrimary : styles.method}>\n <div style={styles.methodHeader}>\n <span style={styles.methodLabel}>\n {method.label}\n {method.badge && (\n <span style={badgeStyle(method.badge)}>{method.badge}</span>\n )}\n </span>\n </div>\n {method.description && (\n <p style={styles.methodDesc}>{method.description}</p>\n )}\n <MethodBody\n method={method}\n stepId={stepId}\n onCompleted={onCompleted}\n onMarkManualComplete={onMarkManualComplete}\n />\n </div>\n );\n}\n\nfunction MethodBody({\n method,\n stepId,\n onCompleted,\n onMarkManualComplete,\n}: {\n method: OnboardingMethod;\n stepId: string;\n onCompleted: () => Promise<void>;\n onMarkManualComplete: () => void;\n}) {\n if (method.disabled) {\n return (\n <button\n type=\"button\"\n disabled\n style={buttonDisabled(method.primary)}\n aria-disabled=\"true\"\n >\n {method.disabledLabel ?? \"Coming soon\"}\n </button>\n );\n }\n\n switch (method.kind) {\n case \"link\":\n return (\n <LinkMethod method={method} onMarkComplete={onMarkManualComplete} />\n );\n case \"form\":\n return <FormMethod method={method} onCompleted={onCompleted} />;\n case \"builder-cli-auth\":\n return (\n <BuilderCliAuthMethod\n onCompleted={onCompleted}\n primary={method.primary}\n />\n );\n case \"agent-task\":\n return <AgentTaskMethod method={method} stepId={stepId} />;\n }\n}\n\n// ─── link ──────────────────────────────────────────────────────────────────\n\nfunction LinkMethod({\n method,\n onMarkComplete,\n}: {\n method: Extract<OnboardingMethod, { kind: \"link\" }>;\n onMarkComplete: () => void;\n}) {\n const { url, external } = method.payload;\n const isNoop = !url || url === \"#\";\n if (isNoop) {\n // Sentinel URL — treat as \"mark this method as the chosen one\".\n return (\n <button\n type=\"button\"\n style={buttonPrimary(method.primary)}\n onClick={onMarkComplete}\n >\n Use this option\n </button>\n );\n }\n return (\n <a\n href={url}\n target={external ? \"_blank\" : undefined}\n rel={external ? \"noopener noreferrer\" : undefined}\n style={{ ...buttonPrimary(method.primary), textDecoration: \"none\" }}\n >\n Continue\n {external && <IconExternalLink size={12} style={{ marginLeft: 4 }} />}\n </a>\n );\n}\n\n// ─── form ──────────────────────────────────────────────────────────────────\n\nfunction FormMethod({\n method,\n onCompleted,\n}: {\n method: Extract<OnboardingMethod, { kind: \"form\" }>;\n onCompleted: () => Promise<void>;\n}) {\n const { fields, writeScope } = method.payload;\n const [values, setValues] = useState<Record<string, string>>({});\n const [saving, setSaving] = useState(false);\n const [err, setErr] = useState<string | null>(null);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setSaving(true);\n setErr(null);\n try {\n const vars = fields\n .map((f) => ({ key: f.key, value: (values[f.key] ?? \"\").trim() }))\n .filter((v) => v.value !== \"\");\n if (vars.length === 0) {\n setErr(\"Enter a value first.\");\n return;\n }\n const res = await fetch(agentNativePath(\"/_agent-native/env-vars\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ vars, scope: writeScope ?? \"workspace\" }),\n });\n if (!res.ok) {\n const data = await res.json().catch(() => ({}));\n throw new Error(\n (data as { error?: string }).error ?? `Save failed: ${res.status}`,\n );\n }\n setValues({});\n await onCompleted();\n } catch (e) {\n setErr(e instanceof Error ? e.message : \"Save failed\");\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <form onSubmit={handleSubmit} style={styles.form}>\n {fields.map((f) => (\n <label key={f.key} style={styles.formLabel}>\n <span style={styles.formLabelText}>{f.label}</span>\n <input\n type={f.secret ? \"password\" : \"text\"}\n value={values[f.key] ?? \"\"}\n placeholder={f.placeholder}\n onChange={(e) =>\n setValues((v) => ({ ...v, [f.key]: e.target.value }))\n }\n style={styles.input}\n autoComplete=\"off\"\n spellCheck={false}\n />\n </label>\n ))}\n {err && <p style={styles.errText}>{err}</p>}\n <button\n type=\"submit\"\n disabled={saving}\n style={{ ...buttonPrimary(method.primary), opacity: saving ? 0.6 : 1 }}\n >\n {saving ? \"Saving...\" : \"Save\"}\n </button>\n </form>\n );\n}\n\n// ─── builder-cli-auth ──────────────────────────────────────────────────────\n\nfunction BuilderCliAuthMethod({\n onCompleted,\n primary,\n}: {\n onCompleted: () => Promise<void>;\n primary?: boolean;\n}) {\n const { connecting, error, start } = useBuilderConnectFlow({\n trackingSource: \"onboarding_builder_cli_auth\",\n onConnected: onCompleted,\n });\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => start()}\n disabled={connecting}\n style={{ ...buttonPrimary(primary), opacity: connecting ? 0.7 : 1 }}\n >\n {connecting ? (\n <>\n <IconLoader2\n size={12}\n style={{ marginRight: 4 }}\n className=\"animate-spin\"\n />\n Waiting for Builder...\n </>\n ) : (\n \"Connect Builder\"\n )}\n </button>\n {connecting && (\n <p style={styles.methodHint}>\n A Builder tab opened. Choose your team or app space there; setup will\n continue here automatically.\n </p>\n )}\n {error && <p style={styles.errText}>{error}</p>}\n </>\n );\n}\n\n// ─── agent-task ────────────────────────────────────────────────────────────\n\nfunction AgentTaskMethod({\n method,\n stepId: _stepId,\n}: {\n method: Extract<OnboardingMethod, { kind: \"agent-task\" }>;\n stepId: string;\n}) {\n const handleClick = () => {\n sendToAgentChat({ message: method.payload.prompt, submit: true });\n };\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n style={buttonPrimary(method.primary)}\n >\n Ask the agent\n </button>\n );\n}\n\n// ─── styles ────────────────────────────────────────────────────────────────\n\nfunction buttonPrimary(primary: boolean | undefined): React.CSSProperties {\n return {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"6px 12px\",\n borderRadius: 6,\n border: primary\n ? \"1px solid transparent\"\n : \"1px solid rgba(255,255,255,0.15)\",\n background: primary ? \"#3b82f6\" : \"rgba(255,255,255,0.04)\",\n color: primary ? \"#fff\" : \"inherit\",\n fontSize: 12,\n fontWeight: 500,\n cursor: \"pointer\",\n };\n}\n\nfunction buttonDisabled(primary: boolean | undefined): React.CSSProperties {\n return {\n ...buttonPrimary(primary),\n border: \"1px solid rgba(255,255,255,0.12)\",\n background: primary ? \"rgba(255,255,255,0.08)\" : \"rgba(255,255,255,0.04)\",\n color: \"rgba(255,255,255,0.5)\",\n cursor: \"not-allowed\",\n };\n}\n\nfunction badgeStyle(\n kind: \"recommended\" | \"beta\" | \"free\" | \"soon\",\n): React.CSSProperties {\n const palette = {\n recommended: { bg: \"rgba(59,130,246,0.15)\", fg: \"#60a5fa\" },\n beta: { bg: \"rgba(6,182,212,0.15)\", fg: \"#22d3ee\" },\n free: { bg: \"rgba(34,197,94,0.15)\", fg: \"#4ade80\" },\n soon: { bg: \"rgba(148,163,184,0.15)\", fg: \"#cbd5e1\" },\n }[kind];\n return {\n marginLeft: 6,\n fontSize: 10,\n padding: \"1px 6px\",\n borderRadius: 4,\n background: palette.bg,\n color: palette.fg,\n fontWeight: 500,\n textTransform: \"uppercase\" as const,\n letterSpacing: 0.3,\n };\n}\n\nconst styles: Record<string, React.CSSProperties> = {\n root: {\n borderBottom: \"1px solid rgba(255,255,255,0.06)\",\n background: \"rgba(255,255,255,0.02)\",\n fontSize: 12,\n display: \"flex\",\n flexDirection: \"column\",\n maxHeight: \"60vh\",\n minHeight: 0,\n },\n compactBanner: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderBottom: \"1px solid rgba(255,255,255,0.06)\",\n background: \"rgba(34,197,94,0.04)\",\n fontSize: 12,\n },\n compactBannerBtn: {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n background: \"transparent\",\n border: \"none\",\n color: \"inherit\",\n cursor: \"pointer\",\n padding: \"6px 12px\",\n flex: 1,\n minWidth: 0,\n },\n header: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 12px\",\n },\n headerLeft: {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n },\n headerIcon: { color: \"#60a5fa\" },\n headerTitle: { fontWeight: 600, fontSize: 12 },\n headerCounter: {\n opacity: 0.5,\n fontSize: 11,\n marginLeft: 4,\n },\n dismissBtn: {\n background: \"transparent\",\n border: \"none\",\n color: \"inherit\",\n opacity: 0.5,\n cursor: \"pointer\",\n padding: 2,\n display: \"flex\",\n },\n list: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n padding: \"4px 8px 10px\",\n overflowY: \"auto\",\n minHeight: 0,\n flex: \"1 1 auto\",\n },\n card: {\n border: \"1px solid hsl(var(--border, 0 0% 100%) / 0.06)\",\n borderRadius: 6,\n background: \"hsl(var(--muted, 0 0% 0%) / 0.12)\",\n },\n cardDone: {\n borderColor: \"rgba(34,197,94,0.12)\",\n background: \"rgba(34,197,94,0.025)\",\n },\n cardHeader: {\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n background: \"transparent\",\n border: \"none\",\n color: \"inherit\",\n padding: \"7px 9px\",\n cursor: \"pointer\",\n textAlign: \"left\" as const,\n },\n cardHeaderLeft: {\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n minWidth: 0,\n },\n cardTitle: {\n fontSize: 12,\n fontWeight: 500,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n minWidth: 0,\n flexWrap: \"wrap\" as const,\n },\n requiredPill: {\n fontSize: 10,\n padding: \"1px 5px\",\n borderRadius: 4,\n background: \"rgba(239,68,68,0.12)\",\n color: \"#f87171\",\n fontWeight: 500,\n },\n chevron: { opacity: 0.5 },\n checkDone: {\n width: 16,\n height: 16,\n borderRadius: \"50%\",\n background: \"#22c55e\",\n color: \"#fff\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n checkTodo: {\n width: 16,\n height: 16,\n borderRadius: \"50%\",\n border: \"1px solid rgba(255,255,255,0.2)\",\n },\n cardBody: {\n padding: \"0 10px 10px 34px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n },\n cardDesc: {\n margin: 0,\n opacity: 0.65,\n fontSize: 12,\n lineHeight: 1.4,\n },\n methods: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n },\n method: {\n padding: \"8px 10px\",\n border: \"1px solid rgba(255,255,255,0.06)\",\n borderRadius: 6,\n background: \"rgba(255,255,255,0.02)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n },\n methodPrimary: {\n padding: \"10px\",\n border: \"1px solid rgba(59,130,246,0.25)\",\n borderRadius: 6,\n background: \"rgba(59,130,246,0.06)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n },\n methodHeader: { display: \"flex\", alignItems: \"center\" },\n methodLabel: { fontSize: 12, fontWeight: 500 },\n methodDesc: { margin: 0, opacity: 0.6, fontSize: 11, lineHeight: 1.4 },\n secondaryPanel: {\n paddingTop: 2,\n },\n secondaryToggle: {\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n padding: \"7px 8px\",\n borderRadius: 6,\n border: \"1px solid rgba(255,255,255,0.08)\",\n background: \"rgba(255,255,255,0.025)\",\n color: \"inherit\",\n cursor: \"pointer\",\n fontSize: 11,\n fontWeight: 500,\n textAlign: \"left\" as const,\n },\n secondaryToggleLeft: {\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n minWidth: 0,\n },\n methodPickerEmbedded: {\n paddingTop: 8,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n },\n pickerLabel: { display: \"flex\", flexDirection: \"column\", gap: 3 },\n form: { display: \"flex\", flexDirection: \"column\", gap: 6 },\n formLabel: { display: \"flex\", flexDirection: \"column\", gap: 2 },\n formLabelText: { fontSize: 11, opacity: 0.6 },\n select: {\n width: \"100%\",\n padding: \"6px 8px\",\n fontSize: 12,\n borderRadius: 5,\n border: \"1px solid rgba(255,255,255,0.1)\",\n background: \"rgba(0,0,0,0.25)\",\n color: \"inherit\",\n outline: \"none\",\n boxSizing: \"border-box\" as const,\n },\n input: {\n width: \"100%\",\n padding: \"6px 8px\",\n fontSize: 12,\n borderRadius: 5,\n border: \"1px solid rgba(255,255,255,0.1)\",\n background: \"rgba(0,0,0,0.25)\",\n color: \"inherit\",\n outline: \"none\",\n boxSizing: \"border-box\" as const,\n },\n methodHint: { margin: 0, fontSize: 11, color: \"rgba(255,255,255,0.62)\" },\n errText: { margin: 0, fontSize: 11, color: \"#f87171\" },\n footer: {\n padding: \"0 12px 10px\",\n display: \"flex\",\n justifyContent: \"flex-end\",\n },\n hideLink: {\n background: \"transparent\",\n border: \"none\",\n color: \"inherit\",\n opacity: 0.5,\n cursor: \"pointer\",\n fontSize: 11,\n padding: \"2px 4px\",\n },\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrgSwitcher.d.ts","sourceRoot":"","sources":["../../../src/client/org/OrgSwitcher.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"OrgSwitcher.d.ts","sourceRoot":"","sources":["../../../src/client/org/OrgSwitcher.tsx"],"names":[],"mappings":"AAsDA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AA0MD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,YAAY,EACZ,YAAiD,GAClD,EAAE,gBAAgB,2CAyblB"}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
import { useState } from "react";
|
|
3
3
|
import { useNavigate } from "react-router";
|
|
4
4
|
import * as PopoverPrimitive from "@radix-ui/react-popover";
|
|
5
|
-
import { IconApps, IconArrowUpRight, IconBuilding, IconCheck, IconChevronRight, IconLoader2, IconLogout, IconMessageCircle, IconPlus, IconSelector, IconSettings, IconUser, IconUserPlus, } from "@tabler/icons-react";
|
|
5
|
+
import { IconApps, IconArrowUpRight, IconBrain, IconBrandJira, IconBrush, IconBuilding, IconCalendar, IconCalendarTime, IconChartBar, IconCheck, IconChevronRight, IconClipboardList, IconCode, IconFileText, IconLoader2, IconLogout, IconMail, IconMessageCircle, IconMicrophone, IconNote, IconPhone, IconPhoto, IconPlus, IconPresentation, IconScreenShare, IconSelector, IconSettings, IconStack2, IconUser, IconUserPlus, IconUsers, IconVideo, IconWorld, } from "@tabler/icons-react";
|
|
6
6
|
import { useOrg, useSwitchOrg, useCreateOrg, useInviteMember, useAcceptInvitation, useJoinByDomain, } from "./hooks.js";
|
|
7
7
|
import { agentNativePath } from "../api-path.js";
|
|
8
8
|
import { ORG_SWITCHER_MAX_APP_LINKS, useOrgSwitcherAppLinks, visibleOrgAppLinks, } from "./workspace-app-links.js";
|
|
@@ -24,11 +24,38 @@ const ITEM_CLASS = "flex w-full items-center gap-2 px-2.5 py-1.5 text-xs text-fo
|
|
|
24
24
|
const SECTION_LABEL_CLASS = "px-2.5 pt-1 pb-0.5 text-[10px] uppercase tracking-wide text-muted-foreground";
|
|
25
25
|
const APP_SUBMENU_CONTENT_CLASS = "z-50 w-72 rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2";
|
|
26
26
|
const DEFAULT_ORGANIZATION_SETTINGS_PATH = "/team";
|
|
27
|
+
const APP_ICON_MAP = {
|
|
28
|
+
Mail: IconMail,
|
|
29
|
+
CalendarDays: IconCalendar,
|
|
30
|
+
FileText: IconFileText,
|
|
31
|
+
BarChart2: IconChartBar,
|
|
32
|
+
GalleryHorizontal: IconPresentation,
|
|
33
|
+
Video: IconVideo,
|
|
34
|
+
BrandJira: IconBrandJira,
|
|
35
|
+
ClipboardList: IconClipboardList,
|
|
36
|
+
Users: IconUsers,
|
|
37
|
+
Code: IconCode,
|
|
38
|
+
MessageCircle: IconMessageCircle,
|
|
39
|
+
ScreenShare: IconScreenShare,
|
|
40
|
+
Brush: IconBrush,
|
|
41
|
+
Brain: IconBrain,
|
|
42
|
+
Phone: IconPhone,
|
|
43
|
+
Note: IconNote,
|
|
44
|
+
Microphone: IconMicrophone,
|
|
45
|
+
CalendarTime: IconCalendarTime,
|
|
46
|
+
Globe: IconWorld,
|
|
47
|
+
Photo: IconPhoto,
|
|
48
|
+
};
|
|
49
|
+
function appMenuIcon(app) {
|
|
50
|
+
if (app.icon)
|
|
51
|
+
return APP_ICON_MAP[app.icon] ?? IconStack2;
|
|
52
|
+
return app.isDispatch ? IconMessageCircle : IconStack2;
|
|
53
|
+
}
|
|
27
54
|
function organizationSettingsPath(path) {
|
|
28
55
|
return `${path.replace(/#.*$/, "")}#workspace-settings`;
|
|
29
56
|
}
|
|
30
57
|
function AppMenuLink({ app, onNavigate, }) {
|
|
31
|
-
const Icon = app
|
|
58
|
+
const Icon = appMenuIcon(app);
|
|
32
59
|
return (_jsxs("a", { href: app.href, onClick: onNavigate, className: `flex items-center gap-2 rounded-sm px-2.5 py-2 text-xs outline-none hover:bg-accent focus:bg-accent ${app.isDispatch ? "border border-primary/20 bg-primary/5" : ""}`, children: [_jsx("span", { className: `flex h-7 w-7 shrink-0 items-center justify-center rounded-md ${app.isDispatch
|
|
33
60
|
? "bg-primary text-primary-foreground"
|
|
34
61
|
: "bg-muted text-muted-foreground"}`, children: _jsx(Icon, { className: "h-3.5 w-3.5" }) }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate font-medium text-foreground", children: app.name }), _jsx("span", { className: "block truncate text-[11px] text-muted-foreground", children: app.isDispatch
|