Unified · Split
| @@ -132,7 +132,7 @@ export default function AddGoogleSource(props: { · 131 unmodified lines | |||
| 132 | return ( | 132 | return ( |
| 133 | <div className="flex flex-1 flex-col gap-6"> | 133 | <div className="flex flex-1 flex-col gap-6"> |
| 134 | <div> | 134 | <div> |
| 135 | <h1 className="text-xl font-semibold text-foreground">Add Google</h1> | 135 | <h1 className="text-xl font-semibold text-foreground">Add Google integration</h1> |
| 136 | <p className="mt-1 text-[13px] text-muted-foreground"> | 136 | <p className="mt-1 text-[13px] text-muted-foreground"> |
| 137 | Bundle Google APIs into one integration with a shared OAuth consent. | 137 | Bundle Google APIs into one integration with a shared OAuth consent. |
| 138 | </p> | 138 | </p> |
| @@ -130,7 +130,7 @@ export default function AddGraphqlSource(props: { · 129 unmodified lines | |||
| 130 | 130 | ||
| 131 | return ( | 131 | return ( |
| 132 | <div className="flex flex-1 flex-col gap-6"> | 132 | <div className="flex flex-1 flex-col gap-6"> |
| 133 | <h1 className="text-xl font-semibold text-foreground">Add GraphQL Source</h1> | 133 | <h1 className="text-xl font-semibold text-foreground">Add GraphQL integration</h1> |
| 134 | 134 | ||
| 135 | <GraphqlSourceFields | 135 | <GraphqlSourceFields |
| 136 | endpoint={endpoint} | 136 | endpoint={endpoint} |
| @@ -143,8 +143,8 @@ export default function AddGraphqlSource(props: { · 6 unmodified lines | |||
| 143 | <AuthMethodListEditor | 143 | <AuthMethodListEditor |
| 144 | list={authMethodList} | 144 | list={authMethodList} |
| 145 | allowedKinds={["none", "apikey"]} | 145 | allowedKinds={["none", "apikey"]} |
| 146 | emptyHint="No authentication declared. Add a method, or add the source without auth and connect an account from the integration page later." | 146 | emptyHint="No authentication declared. Add a method, or add the integration without auth and connect an account from the integration page later." |
| 147 | footerHint="Every method here is registered with the source. Connect an account from the integration page after adding." | 147 | footerHint="Every method here is registered with the integration. Connect an account from the integration page after adding." |
| 148 | /> | 148 | /> |
| 149 | 149 | ||
| 150 | {slugAlreadyExists && !adding && <SlugCollisionAlert slug={resolvedSlug} />} | 150 | {slugAlreadyExists && !adding && <SlugCollisionAlert slug={resolvedSlug} />} |
| @@ -156,7 +156,7 @@ export default function AddGraphqlSource(props: { · 5 unmodified lines | |||
| 156 | Cancel | 156 | Cancel |
| 157 | </Button> | 157 | </Button> |
| 158 | <Button onClick={() => void handleAdd()} disabled={!canAdd} loading={adding}> | 158 | <Button onClick={() => void handleAdd()} disabled={!canAdd} loading={adding}> |
| 159 | Add source | 159 | Add integration |
| 160 | </Button> | 160 | </Button> |
| 161 | </FloatActions> | 161 | </FloatActions> |
| 162 | </div> | 162 | </div> |
| @@ -380,7 +380,7 @@ export default function AddMcpSource(props: { · 379 unmodified lines | |||
| 380 | return ( | 380 | return ( |
| 381 | <div className="flex flex-1 flex-col gap-6"> | 381 | <div className="flex flex-1 flex-col gap-6"> |
| 382 | <div> | 382 | <div> |
| 383 | <h1 className="text-xl font-semibold text-foreground">Add MCP Source</h1> | 383 | <h1 className="text-xl font-semibold text-foreground">Add MCP integration</h1> |
| 384 | <p className="mt-1 text-[13px] text-muted-foreground"> | 384 | <p className="mt-1 text-[13px] text-muted-foreground"> |
| 385 | Connect to an MCP server to discover and use its tools. | 385 | Connect to an MCP server to discover and use its tools. |
| 386 | </p> | 386 | </p> |
| @@ -473,7 +473,7 @@ export default function AddMcpSource(props: { · 86 unmodified lines | |||
| 473 | </Button> | 473 | </Button> |
| 474 | {(probe || isProbing) && ( | 474 | {(probe || isProbing) && ( |
| 475 | <Button type="button" onClick={handleAddRemote} disabled={!canAdd} loading={isAdding}> | 475 | <Button type="button" onClick={handleAddRemote} disabled={!canAdd} loading={isAdding}> |
| 476 | Add source | 476 | Add integration |
| 477 | </Button> | 477 | </Button> |
| 478 | )} | 478 | )} |
| 479 | </FloatActions> | 479 | </FloatActions> |
| @@ -542,7 +542,7 @@ export default function AddMcpSource(props: { · 62 unmodified lines | |||
| 542 | disabled={!stdioCommand.trim() || stdioSlugExists} | 542 | disabled={!stdioCommand.trim() || stdioSlugExists} |
| 543 | loading={stdioAdding} | 543 | loading={stdioAdding} |
| 544 | > | 544 | > |
| 545 | Add source | 545 | Add integration |
| 546 | </Button> | 546 | </Button> |
| 547 | </FloatActions> | 547 | </FloatActions> |
| 548 | </> | 548 | </> |
| @@ -108,7 +108,7 @@ export default function AddMicrosoftSource(props: { · 107 unmodified lines | |||
| 108 | return ( | 108 | return ( |
| 109 | <div className="flex flex-1 flex-col gap-6"> | 109 | <div className="flex flex-1 flex-col gap-6"> |
| 110 | <div> | 110 | <div> |
| 111 | <h1 className="text-xl font-semibold text-foreground">Add Microsoft Graph</h1> | 111 | <h1 className="text-xl font-semibold text-foreground">Add Microsoft integration</h1> |
| 112 | <p className="mt-1 text-[13px] text-muted-foreground"> | 112 | <p className="mt-1 text-[13px] text-muted-foreground"> |
| 113 | Pick Microsoft 365 workloads and connect them through one delegated OAuth consent. | 113 | Pick Microsoft 365 workloads and connect them through one delegated OAuth consent. |
| 114 | </p> | 114 | </p> |
| @@ -133,7 +133,7 @@ export function ApiKeysPage() { · 132 unmodified lines | |||
| 133 | <CopyButton value="Authorization: Bearer <api-key>" /> | 133 | <CopyButton value="Authorization: Bearer <api-key>" /> |
| 134 | </div> | 134 | </div> |
| 135 | <p className="mt-2 max-w-2xl text-xs leading-5 text-muted-foreground"> | 135 | <p className="mt-2 max-w-2xl text-xs leading-5 text-muted-foreground"> |
| 136 | API keys work as PATs and have full access to your account. | 136 | API keys work like personal access tokens and have full access to your account. |
| 137 | </p> | 137 | </p> |
| 138 | </PageHeader> | 138 | </PageHeader> |
| 139 | 139 | ||
| @@ -365,7 +365,7 @@ export function PoliciesPage() { · 364 unmodified lines | |||
| 365 | <PageContainer> | 365 | <PageContainer> |
| 366 | <PageHeader | 366 | <PageHeader |
| 367 | title="Policies" | 367 | title="Policies" |
| 368 | description="Override default approval behavior for tools. The most restrictive matched action wins. Blocked tools are hidden from agent search and fail at invoke." | 368 | description="Decide which tools run automatically, which ask for approval, and which are blocked. The most restrictive matching rule wins; blocked tools are hidden from agents." |
| 369 | /> | 369 | /> |
| 370 | 370 | ||
| 371 | <div className="mb-8"> | 371 | <div className="mb-8"> |
| @@ -33,7 +33,7 @@ import { isAsyncResultLoading } from "../lib/async-result"; · 32 unmodified lines | |||
| 33 | // --------------------------------------------------------------------------- | 33 | // --------------------------------------------------------------------------- |
| 34 | 34 | ||
| 35 | const PROVIDER_LABELS: Record<string, string> = { | 35 | const PROVIDER_LABELS: Record<string, string> = { |
| 36 | default: "Default store", | 36 | encrypted: "Encrypted store", |
| 37 | keychain: "Keychain", | 37 | keychain: "Keychain", |
| 38 | file: "Local file", | 38 | file: "Local file", |
| 39 | memory: "Memory", | 39 | memory: "Memory", |
| @@ -41,7 +41,13 @@ const PROVIDER_LABELS: Record<string, string> = { · 1 unmodified line | |||
| 41 | "workos-vault": "WorkOS Vault", | 41 | "workos-vault": "WorkOS Vault", |
| 42 | }; | 42 | }; |
| 43 | 43 | ||
| 44 | const providerLabel = (key: string): string => PROVIDER_LABELS[key] ?? key; | 44 | const providerLabel = (key: string): string => |
| 45 | PROVIDER_LABELS[key] ?? | ||
| 46 | key | ||
| 47 | .split(/[-_]/g) | ||
| 48 | .filter(Boolean) | ||
| 49 | .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) | ||
| 50 | .join(" "); | ||
| 45 | 51 | ||
| 46 | export function SecretsPage(props: { showProviderInfo?: boolean }) { | 52 | export function SecretsPage(props: { showProviderInfo?: boolean }) { |
| 47 | useExecutorDocumentTitle("Providers"); | 53 | useExecutorDocumentTitle("Providers"); |
| @@ -117,13 +123,17 @@ export function SecretsPage(props: { showProviderInfo?: boolean }) { · 69 unmodified lines | |||
| 117 | <span className="min-w-0 shrink truncate"> | 123 | <span className="min-w-0 shrink truncate"> |
| 118 | {providerLabel(String(key))} | 124 | {providerLabel(String(key))} |
| 119 | </span> | 125 | </span> |
| 120 | <span className="max-w-40 shrink truncate font-mono text-xs text-muted-foreground"> | ||
| 121 | {String(key)} | ||
| 122 | </span> | ||
| 123 | </CardStackEntryTitle> | 126 | </CardStackEntryTitle> |
| 127 | <CardStackEntryDescription> | ||
| 128 | {String(key) === "encrypted" | ||
| 129 | ? "Values you paste are encrypted and stored in this instance's database." | ||
| 130 | : `${providerLabel(String(key))} credential provider.`} | ||
| 131 | </CardStackEntryDescription> | ||
| 124 | </CardStackEntryContent> | 132 | </CardStackEntryContent> |
| 125 | <CardStackEntryActions> | 133 | <CardStackEntryActions> |
| 126 | <Badge variant="secondary">provider</Badge> | 134 | <Badge variant="secondary"> |
| 135 | {String(key) === "encrypted" ? "default" : "provider"} | ||
| 136 | </Badge> | ||
| 127 | </CardStackEntryActions> | 137 | </CardStackEntryActions> |
| 128 | </CardStackEntry> | 138 | </CardStackEntry> |
| 129 | )) | 139 | )) |