@w6w/embed 0.2.1 → 0.2.11
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/dist/{ConfirmModal-RLbZT5_k.js → ConfirmModal-BE-SdX-O.js} +53 -49
- package/dist/{ConfirmModal-RLbZT5_k.js.map → ConfirmModal-BE-SdX-O.js.map} +1 -1
- package/dist/{CreateFunctionModal-DRsFx-FB.js → CreateFunctionModal-D6CQLpa_.js} +25 -25
- package/dist/{CreateFunctionModal-DRsFx-FB.js.map → CreateFunctionModal-D6CQLpa_.js.map} +1 -1
- package/dist/{DocumentFormModal-BExK1V-B.js → DocumentFormModal-YauVdolr.js} +5 -5
- package/dist/{DocumentFormModal-BExK1V-B.js.map → DocumentFormModal-YauVdolr.js.map} +1 -1
- package/dist/{ImportSpecModal-BDQIf6rg.js → ImportSpecModal-B7qd1Km2.js} +3 -3
- package/dist/{ImportSpecModal-BDQIf6rg.js.map → ImportSpecModal-B7qd1Km2.js.map} +1 -1
- package/dist/ModelRoutesManager-BGESQahw.js +345 -0
- package/dist/ModelRoutesManager-BGESQahw.js.map +1 -0
- package/dist/WorkflowEditor-CwvmAGp2.js +925 -0
- package/dist/WorkflowEditor-CwvmAGp2.js.map +1 -0
- package/dist/{apps-1FNUwbGv.js → apps-CboASBKr.js} +14 -14
- package/dist/{apps-1FNUwbGv.js.map → apps-CboASBKr.js.map} +1 -1
- package/dist/{callables-3mFrMVG_.js → callables-tOlflvbl.js} +11 -11
- package/dist/{callables-3mFrMVG_.js.map → callables-tOlflvbl.js.map} +1 -1
- package/dist/chrome/ConfirmModal.d.ts +4 -1
- package/dist/chrome/workspace.d.ts +4 -0
- package/dist/{coerce-input-BicYr7nc.js → coerce-input-DttlcSdO.js} +70 -58
- package/dist/coerce-input-DttlcSdO.js.map +1 -0
- package/dist/connections-D7cgXhDS.js +119 -0
- package/dist/connections-D7cgXhDS.js.map +1 -0
- package/dist/credentials-DaQU3Ca_.js +171 -0
- package/dist/credentials-DaQU3Ca_.js.map +1 -0
- package/dist/document-sources-UCwe8x77.js +91 -0
- package/dist/document-sources-UCwe8x77.js.map +1 -0
- package/dist/draft.mjs +1 -1
- package/dist/editor/BindingBanner.d.ts +13 -0
- package/dist/editor/CallableEditorFrame.d.ts +7 -0
- package/dist/editor/EndpointCards.d.ts +4 -1
- package/dist/editor/PublishControl.d.ts +19 -0
- package/dist/editor/TargetSelector.d.ts +15 -0
- package/dist/editor/TargetSelector.types.d.ts +2 -0
- package/dist/editor/definition.d.ts +2 -0
- package/dist/{editor-apps-BdenSV1o.js → editor-apps-BUZWld-m.js} +5 -5
- package/dist/{editor-apps-BdenSV1o.js.map → editor-apps-BUZWld-m.js.map} +1 -1
- package/dist/{editor-tools-RxmY5iyi.js → editor-tools-B_Lfx3kw.js} +11 -11
- package/dist/editor-tools-B_Lfx3kw.js.map +1 -0
- package/dist/editor.mjs +1 -1
- package/dist/editors.mjs +768 -621
- package/dist/editors.mjs.map +1 -1
- package/dist/{endpoints-B2ynbZo-.js → endpoints-DSRo1Lc5.js} +113 -107
- package/dist/endpoints-DSRo1Lc5.js.map +1 -0
- package/dist/fields-DvS8XZFc.js +21 -0
- package/dist/fields-DvS8XZFc.js.map +1 -0
- package/dist/forms/ModelBudgetsManager.d.ts +9 -0
- package/dist/forms/ModelRoutesManager.d.ts +14 -0
- package/dist/forms.d.ts +4 -0
- package/dist/forms.mjs +611 -212
- package/dist/forms.mjs.map +1 -1
- package/dist/index.mjs +119 -112
- package/dist/index.mjs.map +1 -1
- package/dist/lib/binding-problems.d.ts +38 -0
- package/dist/lib/code-rail.d.ts +4 -2
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/invoke-error.d.ts +1 -0
- package/dist/lib/sdk-snippets.d.ts +1 -1
- package/dist/lib/target-fields.d.ts +8 -0
- package/dist/lib/trigger-preview.d.ts +1 -0
- package/dist/lib/workflow-live-run.d.ts +9 -2
- package/dist/lib/workflow-nodes.d.ts +5 -0
- package/dist/lib/workflow-validity.d.ts +1 -0
- package/dist/lib.mjs +72 -70
- package/dist/lists/ConnectionDependents.d.ts +31 -0
- package/dist/lists/ConnectionDetail.d.ts +4 -1
- package/dist/lists/ConnectionList.d.ts +4 -1
- package/dist/lists/CredentialDetail.d.ts +15 -0
- package/dist/lists/CredentialList.d.ts +14 -0
- package/dist/lists/ModelCatalog.d.ts +12 -0
- package/dist/lists/ModelUsage.d.ts +12 -0
- package/dist/lists.d.ts +8 -0
- package/dist/lists.mjs +1322 -604
- package/dist/lists.mjs.map +1 -1
- package/dist/models-bAayQPJ_.js +270 -0
- package/dist/models-bAayQPJ_.js.map +1 -0
- package/dist/{project-context-BiCjv_E3.js → project-context-Tvp-La7A.js} +3 -3
- package/dist/{project-context-BiCjv_E3.js.map → project-context-Tvp-La7A.js.map} +1 -1
- package/dist/rail.mjs +4 -4
- package/dist/repos/agents-studio-agents.d.ts +52 -0
- package/dist/repos/agents-studio-assets.d.ts +68 -0
- package/dist/repos/connections.d.ts +30 -12
- package/dist/repos/credentials.d.ts +83 -0
- package/dist/repos/endpoints.d.ts +9 -3
- package/dist/repos/fields.d.ts +34 -0
- package/dist/repos/functions.d.ts +7 -5
- package/dist/repos/index.d.ts +5 -0
- package/dist/repos/models.d.ts +289 -0
- package/dist/repos.mjs +613 -176
- package/dist/repos.mjs.map +1 -1
- package/dist/{slug-C4ktDPdy.js → slug-BVdgiP_L.js} +64 -60
- package/dist/slug-BVdgiP_L.js.map +1 -0
- package/dist/{spec-export-Cf3VQSQS.js → spec-export-CBbloO_n.js} +7 -7
- package/dist/{spec-export-Cf3VQSQS.js.map → spec-export-CBbloO_n.js.map} +1 -1
- package/dist/{spec-import-CjmxyZDR.js → spec-import-CW6R_Wk1.js} +160 -156
- package/dist/spec-import-CW6R_Wk1.js.map +1 -0
- package/dist/theme-context-E2ZhlXDX.js +6 -0
- package/dist/theme-context-E2ZhlXDX.js.map +1 -0
- package/dist/theme-context.d.ts +2 -0
- package/dist/trigger-preview-DKxfjzUY.js +145 -0
- package/dist/trigger-preview-DKxfjzUY.js.map +1 -0
- package/dist/{use-callable-draft-zHLpcr-b.js → use-callable-draft-DsALnSfF.js} +22 -22
- package/dist/{use-callable-draft-zHLpcr-b.js.map → use-callable-draft-DsALnSfF.js.map} +1 -1
- package/dist/{workflow-blank-DyL3_RUA.js → workflow-blank-DFpGObrn.js} +6 -6
- package/dist/{workflow-blank-DyL3_RUA.js.map → workflow-blank-DFpGObrn.js.map} +1 -1
- package/package.json +1 -1
- package/src/styles.css +2 -6
- package/dist/WorkflowEditor-DlbVv6Fs.js +0 -854
- package/dist/WorkflowEditor-DlbVv6Fs.js.map +0 -1
- package/dist/coerce-input-BicYr7nc.js.map +0 -1
- package/dist/connections-CjjYeRqb.js +0 -78
- package/dist/connections-CjjYeRqb.js.map +0 -1
- package/dist/document-sources-C0grrtdq.js +0 -86
- package/dist/document-sources-C0grrtdq.js.map +0 -1
- package/dist/editor-tools-RxmY5iyi.js.map +0 -1
- package/dist/endpoints-B2ynbZo-.js.map +0 -1
- package/dist/slug-C4ktDPdy.js.map +0 -1
- package/dist/spec-import-CjmxyZDR.js.map +0 -1
- package/dist/trigger-preview-VPkrryDl.js +0 -120
- package/dist/trigger-preview-VPkrryDl.js.map +0 -1
package/dist/editors.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editors.mjs","sources":["../src/editors/doc-format.ts","../src/editors/DocumentEditor.tsx","../src/lib/endpoint-editor.ts","../src/editor/CallableEditorFrame.tsx","../src/editor/EndpointCards.tsx","../src/editor/InputListEditor.tsx","../src/editor/TargetSelector.tsx","../src/editor/EndpointEditor.tsx","../src/editor/FunctionEditor.tsx"],"sourcesContent":["/**\n * T1.2.1: which `CodeBlock`/editor grammar a document's persisted `format`\n * maps to. A named `switch` over every `DocFormat` arm — mirrors\n * `rail-settings.ts`'s total-function idiom (`:36-102`): no `default:`, so a\n * sixth `DocFormat` value added later fails to compile here instead of\n * silently falling through to some default grammar. Split out into its own\n * `.ts` module (never `.tsx`) so `node --test` (`test:unit`'s glob is\n * `src/lib/__tests__/*.test.ts`) can pin the map directly, the same reason\n * `rail-settings.ts`/`alias-rail.ts` exist as standalone modules.\n *\n * All five `CodeLanguage` arms used below are already members of\n * `CodeBlock`'s exported union (`packages/ui/src/CodeBlock.tsx:52-68`) — no\n * new Prism grammar registration is needed.\n */\nimport type { DocFormat } from \"@w6w/sdk\";\nimport type { CodeLanguage } from \"@w6w/ui\";\n\nexport function codeLanguageForDocFormat(format: DocFormat): CodeLanguage {\n switch (format) {\n case \"yaml\":\n return \"yaml\";\n case \"json\":\n return \"json\";\n case \"markdown\":\n return \"markdown\";\n case \"html\":\n return \"markup\";\n case \"text\":\n return \"plaintext\";\n }\n}\n","/**\n * `<DocumentEditor documentId>` — one document: its key, its content (read-only, highlighted) and,\n * for a private document, Edit and Delete. No repository sync and no \"synced from\" markers; a host\n * adds those around it.\n */\nimport { CodeBlock, Copyable, DeleteButton, EditButton } from \"@w6w/ui\";\nimport type { ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { CallFromCodeButton } from \"../chrome/CallFromCodeButton.tsx\";\nimport { ConfirmModal } from \"../chrome/ConfirmModal.tsx\";\nimport { DocumentFormModal } from \"../forms/DocumentFormModal.tsx\";\nimport { useEditorProject } from \"../project-context.ts\";\nimport { useDeleteDocumentMutation, useDocumentQuery } from \"../repos/documents.ts\";\nimport { codeLanguageForDocFormat } from \"./doc-format.ts\";\n\nexport interface DocumentEditorSlots {\n /** Replaces the default heading (the key as an `<h3>`). `null`: none. */\n header?: ReactNode;\n /** Replaces the default action row (Call from code, Edit, Delete). `null`: none. */\n actions?: ReactNode;\n /** Replaces the not-found body. `null`: nothing. */\n empty?: ReactNode;\n}\n\nexport interface DocumentEditorProps {\n documentId: string;\n /** Omitted: the provider's project. `null` or `\"\"`: none; nothing is read and writes refuse. */\n project?: string | null;\n /** Called once, AFTER the delete succeeded. */\n onDeleted?: () => void;\n /** Given, the not-found body offers a \"Back to documents\" control that calls it. */\n onBack?: () => void;\n slots?: DocumentEditorSlots;\n}\n\nexport function DocumentEditor({\n documentId,\n project,\n onDeleted,\n onBack,\n slots,\n}: DocumentEditorProps) {\n const p = useEditorProject(project);\n const docQuery = useDocumentQuery(documentId, p ?? undefined, p != null);\n const deleteMut = useDeleteDocumentMutation();\n const [editing, setEditing] = useState(false);\n const [deletePending, setDeletePending] = useState(false);\n\n // isPending, not isLoading: the query is disabled while the project is unresolved, so\n // `isLoading` (pending AND fetching) would be false there and \"not found\" would flash.\n if (docQuery.isPending) {\n return (\n <div className=\"w6w-embed-root\">\n <p className=\"muted\">Loading…</p>\n </div>\n );\n }\n const doc = docQuery.data;\n if (!doc) {\n const empty =\n slots?.empty === undefined ? (\n <>\n <h3>Document not found</h3>\n {onBack && (\n <button type=\"button\" className=\"btn ghost\" onClick={onBack}>\n Back to documents\n </button>\n )}\n </>\n ) : (\n slots.empty\n );\n return <div className=\"w6w-embed-root\">{empty}</div>;\n }\n\n const header = slots?.header === undefined ? <h3>{doc.key}</h3> : slots.header;\n const actions =\n slots?.actions === undefined ? (\n <div className=\"card\">\n <div style={{ display: \"flex\", gap: \"var(--w6w-sp-1-5)\" }}>\n <CallFromCodeButton resource={{ kind: \"document\", key: doc.key }} />\n {!doc.shared && (\n <>\n <EditButton\n label=\"Edit\"\n onClick={() => setEditing(true)}\n data-testid=\"document-editor-edit\"\n />\n <DeleteButton\n label=\"Delete\"\n onClick={() => setDeletePending(true)}\n disabled={deleteMut.isPending}\n data-testid=\"document-editor-delete\"\n />\n </>\n )}\n </div>\n </div>\n ) : (\n slots.actions\n );\n\n return (\n <div className=\"w6w-embed-root w6w-doc-editor\">\n {header}\n {actions}\n\n <div className=\"card\">\n <h3>Key</h3>\n <Copyable value={doc.key} readOnly>\n {/* `.w6w-copyable`'s flex rule targets `> input, > textarea, > pre`, never `> code`, so\n a bare `<code>` keeps flexbox's min-content floor and can push the copy button out\n of a narrow box unless told to shrink. */}\n <code\n style={{\n overflowWrap: \"anywhere\",\n display: \"block\",\n minWidth: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n flex: 1,\n }}\n >\n {doc.key}\n </code>\n </Copyable>\n </div>\n\n <div className=\"card\">\n <h3>Content</h3>\n <p className=\"muted small\">\n Format <code>{doc.format}</code>. Stored verbatim — this is a read-only view, not a\n rendered preview.\n </p>\n <CodeBlock\n code={doc.content}\n language={codeLanguageForDocFormat(doc.format)}\n showLineNumbers\n />\n </div>\n\n {editing && (\n <DocumentFormModal\n initial={doc}\n project={p}\n onClose={() => setEditing(false)}\n onSaved={() => setEditing(false)}\n />\n )}\n\n {deletePending && (\n <ConfirmModal\n title=\"Delete document\"\n message={`Delete the document \"${doc.key}\"? This cannot be undone.`}\n confirmLabel=\"Delete\"\n onConfirm={() => {\n setDeletePending(false);\n if (p == null) return;\n deleteMut.mutate({ id: doc.id, project: p }, { onSuccess: () => onDeleted?.() });\n }}\n onClose={() => setDeletePending(false)}\n />\n )}\n </div>\n );\n}\n","/**\n * The pure half of `<EndpointEditor>` — loadable by `node --test` (no React, no `@w6w/ui`).\n *\n * - {@link BLANK_TARGET} / {@link normalizeEndpoint}: the hydration boundary. A server definition\n * with no `target` (a draft, HITL-8) must still leave `target` defined, because every read in\n * the editor does `target.kind` unguarded.\n * - {@link buildEndpointSaveBody}: the ONE body a Save posts. An unbound target and an untouched\n * empty Input are absent from the wire, never `null`/`[]`.\n * - {@link urlOptions} / {@link selectedUrlEntry} / {@link urlCardEntry}: which of the\n * server-rendered invoke URLs the card shows. Every string is the server's, verbatim.\n */\nimport type { EndpointDef, EndpointOwnTarget, InvokeUrlOption } from \"../repos/endpoints.ts\";\nimport { inputsForSave } from \"./input-seeding.ts\";\nimport { targetIsBound } from \"./target-fields.ts\";\n\n/** A blank `action` target — what an absent `target` hydrates to. */\nexport const BLANK_TARGET: EndpointOwnTarget = {\n kind: \"action\",\n uses: { app: \"\", action: \"\", connection: null },\n};\n\n/** `target` falls back to {@link BLANK_TARGET} and `input` to `[]`, only when absent. */\nexport function normalizeEndpoint(e: EndpointDef): EndpointDef {\n return { input: [], ...e, target: e.target ?? BLANK_TARGET };\n}\n\n/**\n * The exact body a Save posts. Unbound target ⇒ no `target` key; empty Input ⇒ no `input` key\n * (a documented pass-through mode server-side — saving `[]` would persist a spurious list). The\n * key is trimmed. Everything else, secrets included, passes through unchanged.\n */\nexport function buildEndpointSaveBody(draft: EndpointDef): Record<string, unknown> {\n const { target, input, ...rest } = normalizeEndpoint(draft);\n const body: Record<string, unknown> = {\n ...rest,\n key: String(draft.key ?? \"\").trim(),\n };\n if (targetIsBound(target)) body.target = target;\n const inputs = inputsForSave(input ?? [], { emptyMeansPassthrough: true });\n if (inputs !== undefined) body.input = inputs;\n return body;\n}\n\n/** Which of the two server-rendered forms of the URL is on screen. */\nexport type UrlForm = \"id\" | \"key\";\n\n/** The domain picker's options: only when there IS a second option (≤ 1 ⇒ `undefined`). */\nexport function urlOptions(\n invokeUrls: InvokeUrlOption[] | null | undefined,\n): InvokeUrlOption[] | undefined {\n return invokeUrls && invokeUrls.length > 1 ? invokeUrls : undefined;\n}\n\n/** The entry the card shows: the session pick (by domain NAME), else `default`, else the first. */\nexport function selectedUrlEntry(\n invokeUrls: InvokeUrlOption[] | null | undefined,\n pickedDomain: string | null,\n): InvokeUrlOption | null {\n const options = urlOptions(invokeUrls);\n if (!options) return null;\n return (\n options.find((u) => u.domain === pickedDomain) ?? options.find((u) => u.default) ?? options[0]\n );\n}\n\n/** What the URL card renders: the selected domain's entry, else the flat envelope fields. */\nexport function urlCardEntry(\n selected: InvokeUrlOption | null,\n invokeUrl: string | undefined,\n invokeUrlByKey: string | undefined,\n): { url: string; urlByKey?: string; resolves: boolean } {\n return (\n selected ?? {\n url: invokeUrl ?? \"\",\n urlByKey: invokeUrlByKey,\n resolves: true,\n }\n );\n}\n","import type { ReactNode } from \"react\";\nimport { ExecutionProfileHeader } from \"../chrome/ExecutionProfileHeader.tsx\";\nimport { descriptorFor } from \"../lib/callable-descriptors.ts\";\nimport type { CallableKind } from \"../lib/callable-kind.ts\";\nimport type { CallableEditorNavigation, CallableEditorSlots } from \"./types.ts\";\n\nexport interface CallableEditorFrameProps {\n /** Which kind's copy (back/save labels, not-found heading) the frame shows. */\n kind: CallableKind;\n /** The heading's text — the kind computes it from its own draft, because only it knows what\n * \"empty\" means for its definition. */\n title: string;\n /** Renders the `incomplete` badge beside the heading. */\n incomplete: boolean;\n canSave: boolean;\n isSaving: boolean;\n onSave: () => void;\n error: string | null;\n /** A 404 from the hydration GET: render the not-found card, never a blank editable form. */\n notFound: boolean;\n /** Where the host should take the user; back asks for `{ type: \"list\" }`. */\n onNavigate: (to: CallableEditorNavigation) => void;\n slots?: CallableEditorSlots;\n /** Statements BETWEEN the error banner and the body — the save-gate explanation, \"Saved.\". */\n banners?: ReactNode;\n /** Rendered as the FIRST child of the header action row, before Save (e.g. a JSON toggle). */\n headerActions?: ReactNode;\n children: ReactNode;\n}\n\n/**\n * The shared editor frame of the Function and Endpoint editors: back control, heading with the\n * `incomplete` badge, Save, the error banner and the body (or the not-found card). Router-free —\n * it asks the host to navigate through `onNavigate` and sets no document title. It publishes\n * nothing to the rail workspace either: each editor body does that itself (`useWorkspace`).\n */\nexport function CallableEditorFrame(props: CallableEditorFrameProps) {\n const descriptor = descriptorFor(props.kind);\n const slots = props.slots;\n const backLabel = slots?.backLabel ?? descriptor.editor.backLabel;\n const goBack = () => props.onNavigate({ type: \"list\" });\n\n if (props.notFound) {\n return (\n <div>\n <button type=\"button\" className=\"btn ghost\" onClick={goBack}>\n {backLabel}\n </button>\n <div className=\"card\">\n <h3>{descriptor.editor.notFoundTitle}</h3>\n <p className=\"error\">{props.error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"exec-profile-editor\">\n {slots?.header ?? (\n <ExecutionProfileHeader\n onBack={goBack}\n backLabel={backLabel}\n title={{ editable: false, value: props.title }}\n titleAdornment={\n props.incomplete && <span className=\"badge status-failed\">incomplete</span>\n }\n actions={\n <>\n {props.headerActions}\n <button\n type=\"button\"\n className=\"btn\"\n disabled={!props.canSave}\n onClick={props.onSave}\n >\n {props.isSaving ? \"Saving…\" : descriptor.editor.saveLabel}\n </button>\n {slots?.headerActions}\n </>\n }\n />\n )}\n\n <div className=\"exec-profile-body\">\n {props.error && <div className=\"error\">{props.error}</div>}\n {props.banners}\n {props.children}\n </div>\n </div>\n );\n}\n","import { useQueryClient } from \"@tanstack/react-query\";\nimport { ApiError } from \"@w6w/sdk\";\nimport { Copyable } from \"@w6w/ui\";\nimport { useState } from \"react\";\nimport { coerceInput } from \"../lib/coerce-input.ts\";\nimport type { UrlForm } from \"../lib/endpoint-editor.ts\";\nimport { historyKeys } from \"../lib/history-query.ts\";\nimport {\n type EndpointAuthMode,\n type EndpointInput,\n type EndpointSecurity,\n type InvokeUrlOption,\n SECRET_MASK,\n useInvokeEndpointMutation,\n} from \"../repos/endpoints.ts\";\n\n/** The auth modes offered, in the order an operator is likely to want them. */\nconst AUTH_MODES: Array<{\n value: EndpointAuthMode;\n label: string;\n hint: string;\n}> = [\n {\n value: \"platform\",\n label: \"Platform auth (default)\",\n hint: \"A w6w token or a partner OIDC token, exactly like the rest of the API. The call runs as the caller.\",\n },\n {\n value: \"none\",\n label: \"None — public\",\n hint: \"Anyone with the URL can invoke this. The call runs as this Endpoint's owner.\",\n },\n {\n value: \"basic\",\n label: \"Basic auth\",\n hint: \"HTTP Basic with the username and password below.\",\n },\n {\n value: \"header\",\n label: \"Header auth\",\n hint: \"The named header must carry the value below.\",\n },\n {\n value: \"jwt\",\n label: \"JWT (HMAC)\",\n hint: \"A Bearer JWT, verified HS256 against the shared secret below.\",\n },\n];\n\n/**\n * The Endpoint's callable URL — its own card, directly beneath Identity.\n *\n * **Every URL here comes from the SERVER, verbatim** (the `[\"endpoint\", id]` envelope's\n * `invokeUrl`, `invokeUrlByKey` and `invokeUrls[]`): this component picks between strings and\n * renders one. It holds no hostname, no path grammar and no account slug. `entry.urlByKey` is\n * absent until the server renders it; then the card is one URL line and one Copy button, no\n * id/key toggle. `domainOptions` renders the domain `<select>` only when there is a second option\n * (`lib/endpoint-editor.ts`'s `urlOptions` does that collapse).\n */\nexport function UrlCard(props: {\n entry: { url: string; urlByKey?: string; resolves: boolean };\n domainOptions?: InvokeUrlOption[];\n urlDomain: string | null;\n onUrlDomain: (domain: string) => void;\n urlForm: UrlForm;\n onUrlForm: (form: UrlForm) => void;\n}) {\n const { entry, domainOptions, urlDomain, onUrlDomain, urlForm, onUrlForm } = props;\n const hasByKey = entry.urlByKey !== undefined && entry.urlByKey !== \"\";\n const shown = urlForm === \"key\" && entry.urlByKey ? entry.urlByKey : entry.url;\n\n return (\n <div className=\"card\">\n <h3>URL</h3>\n {domainOptions && (\n <label className=\"field\">\n <span>Domain</span>\n <select\n data-testid=\"url-domain\"\n value={urlDomain ?? domainOptions[0]?.domain}\n onChange={(e) => onUrlDomain(e.target.value)}\n >\n {domainOptions.map((u) => (\n <option key={u.domain} value={u.domain}>\n {u.domain +\n (u.default ? \" · default\" : \"\") +\n (u.resolves ? \"\" : \" · not routable yet\")}\n </option>\n ))}\n </select>\n </label>\n )}\n {hasByKey && (\n <fieldset className=\"seg\" aria-label=\"URL form\">\n {(\n [\n [\"id\", \"By id\", \"The stable, host-issued address. Never changes.\"],\n [\"key\", \"By key\", \"The readable address, built from the account and this key.\"],\n ] as const\n ).map(([form, label, title]) => (\n <button\n key={form}\n type=\"button\"\n className={`seg-btn${urlForm === form ? \" active\" : \"\"}`}\n aria-pressed={urlForm === form}\n data-testid={`url-form-${form}`}\n title={title}\n onClick={() => onUrlForm(form)}\n >\n {label}\n </button>\n ))}\n </fieldset>\n )}\n <div className=\"row\" style={{ alignItems: \"center\", gap: \"var(--w6w-sp-2)\" }}>\n <Copyable value={shown} readOnly>\n <code style={{ overflowWrap: \"anywhere\" }}>\n <strong>POST</strong> <span data-testid=\"invoke-url\">{shown || \"…\"}</span>\n </code>\n </Copyable>\n </div>\n {!entry.resolves && (\n <p className=\"muted small\" data-testid=\"url-unroutable\">\n Not routable yet — this domain has no DNS or TLS behind it, so a call to this address will\n not answer.\n </p>\n )}\n <p className=\"muted small\" style={{ marginTop: \"var(--w6w-sp-2)\" }}>\n Send the declared input as a JSON body.\n </p>\n </div>\n );\n}\n\n/**\n * Who may call the URL above.\n *\n * Every mode except `platform` runs the target as the Endpoint's owner (there is no platform\n * identity on such a request), which is what the warning below says before an operator switches off\n * platform auth. Secrets are write-only: the server returns a mask for a configured secret, and\n * saving the mask back keeps the stored value.\n */\nexport function SecurityCard(props: {\n security: EndpointSecurity;\n onPatch: (next: Partial<EndpointSecurity>) => void;\n}) {\n const { security, onPatch } = props;\n const mode = security.auth;\n\n return (\n <div className=\"card\">\n <h3>Security</h3>\n\n <label className=\"field\">\n <span>Who may call it</span>\n <select\n value={mode}\n onChange={(e) => onPatch({ auth: e.target.value as EndpointAuthMode })}\n >\n {AUTH_MODES.map((m) => (\n <option key={m.value} value={m.value}>\n {m.label}\n </option>\n ))}\n </select>\n <span className=\"hint\">{AUTH_MODES.find((m) => m.value === mode)?.hint}</span>\n </label>\n\n {mode !== \"platform\" && (\n <p className=\"muted small\">\n <strong>Runs as this Endpoint's owner.</strong> A caller authenticated by the policy above\n carries no w6w identity, so the target runs with the connections and data of whoever owns\n this Endpoint.\n </p>\n )}\n\n {mode === \"basic\" && (\n <>\n <label className=\"field\">\n <span>Username</span>\n <input\n type=\"text\"\n value={security.basicUser ?? \"\"}\n onChange={(e) => onPatch({ basicUser: e.target.value })}\n />\n </label>\n <SecretField\n label=\"Password\"\n value={security.basicPassword}\n onChange={(v) => onPatch({ basicPassword: v })}\n />\n </>\n )}\n\n {mode === \"header\" && (\n <>\n <label className=\"field\">\n <span>Header name</span>\n <input\n type=\"text\"\n placeholder=\"X-API-Key\"\n value={security.headerName ?? \"\"}\n onChange={(e) => onPatch({ headerName: e.target.value })}\n />\n </label>\n <SecretField\n label=\"Header value\"\n value={security.headerValue}\n onChange={(v) => onPatch({ headerValue: v })}\n />\n </>\n )}\n\n {mode === \"jwt\" && (\n <SecretField\n label=\"JWT secret (HS256)\"\n value={security.jwtSecret}\n onChange={(v) => onPatch({ jwtSecret: v })}\n />\n )}\n </div>\n );\n}\n\n/**\n * A write-only secret input. A stored secret comes back as {@link SECRET_MASK}; the input renders\n * EMPTY (the mask is never a DOM value) with the \"stored — type to replace\" hint, and the buffer\n * keeps the mask until the operator types, so a save that never touches it preserves what is stored.\n */\nexport function SecretField(props: {\n label: string;\n value: string | undefined;\n onChange: (v: string) => void;\n}) {\n const stored = props.value === SECRET_MASK;\n return (\n <label className=\"field\">\n <span>{props.label}</span>\n <input\n type=\"password\"\n value={stored ? \"\" : (props.value ?? \"\")}\n placeholder={stored ? \"•••••••• (stored — type to replace)\" : \"\"}\n onChange={(e) => props.onChange(e.target.value)}\n />\n {stored && <span className=\"hint\">A secret is stored — type to replace it.</span>}\n </label>\n );\n}\n\n/**\n * Test-invoke panel: one field per declared input, POSTed to /endpoints/:id/invoke. The server\n * invokes the STORED definition, so unsaved edits are not what runs. The result is the\n * `kind`-tagged envelope: an Action or Function target answers with an inline `output`; a Workflow\n * target answers with a `runId` to poll.\n */\nexport function EndpointTestInvoke(props: {\n id: string;\n inputs: EndpointInput[];\n}) {\n const { id, inputs } = props;\n const [values, setValues] = useState<Record<string, string>>({});\n const [output, setOutput] = useState<unknown>(undefined);\n const [error, setError] = useState<string | null>(null);\n const qc = useQueryClient();\n const invokeMut = useInvokeEndpointMutation();\n\n const invoke = () => {\n const payload: Record<string, unknown> = {};\n for (const inp of inputs) {\n const coerced = coerceInput(inp.type, values[inp.key] ?? \"\");\n if (coerced !== undefined) payload[inp.key] = coerced;\n }\n invokeMut.mutate(\n { id, input: payload },\n {\n onSuccess: (out) => {\n setError(null);\n setOutput(out);\n },\n onError: (e) => {\n setOutput(undefined);\n setError(e instanceof ApiError ? e.message : (e as Error).message);\n },\n onSettled: () => qc.invalidateQueries({ queryKey: historyKeys.root }),\n },\n );\n };\n\n return (\n <div className=\"card\">\n <h3>Test invoke</h3>\n <p className=\"muted small\">\n Dispatches the saved Endpoint to its target. Save any edits first. An Action or Function\n target returns a value; a Workflow target returns a run id to poll.\n </p>\n {inputs.length === 0 && (\n <p className=\"muted small\">No declared inputs — the payload is passed through.</p>\n )}\n {inputs.map((inp) => {\n const fieldId = `ep-invoke-${id}-${inp.key || inp.label}`;\n return (\n <div className=\"field\" key={inp.key || inp.label}>\n <label htmlFor={fieldId}>\n {inp.label || inp.key}\n {inp.required && \" *\"}\n </label>\n {inp.type === \"boolean\" ? (\n <select\n id={fieldId}\n value={values[inp.key] ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, [inp.key]: e.target.value }))}\n >\n <option value=\"\">—</option>\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : (\n <input\n id={fieldId}\n type={inp.type === \"number\" ? \"number\" : \"text\"}\n value={values[inp.key] ?? \"\"}\n placeholder={inp.type === \"json\" ? \"{ }\" : (inp.hint ?? \"\")}\n onChange={(e) => setValues((v) => ({ ...v, [inp.key]: e.target.value }))}\n />\n )}\n </div>\n );\n })}\n <div className=\"row\">\n <button type=\"button\" className=\"btn\" disabled={invokeMut.isPending} onClick={invoke}>\n {invokeMut.isPending ? \"Invoking…\" : \"Invoke\"}\n </button>\n </div>\n {error && <div className=\"result error\">{error}</div>}\n {output !== undefined && (\n <pre className=\"result\" style={{ overflow: \"auto\" }}>\n {JSON.stringify(output, null, 2)}\n </pre>\n )}\n </div>\n );\n}\n","import { IconButton } from \"@w6w/ui\";\nimport type { ReactNode } from \"react\";\nimport { INPUT_TYPES, type InputRow } from \"../lib/input-seeding.ts\";\n\n/**\n * One input-row card, shared by the Functions \"Inputs\" editor and the\n * Endpoints \"Input\" editor (T3.2.1) — the two were byte-identical from\n * `<li key={i}>` through `</li>` on the merged branch, apart from the map\n * source variable (`draft.inputs` vs the `inputs` local alias for\n * `draft.input ?? []`). Controlled: the page owns `rows` as its `draft`'s\n * single source of truth and passes the next array back through `onChange`\n * on every add/update/remove — this component never holds its own copy.\n *\n * `emptyMeansPassthrough` carries the one real divergence between the two\n * forms: an Endpoint's declared `input` list absent/empty is a documented\n * pass-through mode, a Function's empty `inputs` just means \"no arguments\" —\n * so the empty-state copy (and nothing else) differs per page.\n */\nexport interface InputListEditorProps {\n rows: InputRow[];\n onChange: (next: InputRow[]) => void;\n /** The card's `<h3>` — \"Inputs\" (Functions) or \"Input\" (Endpoints). */\n title: string;\n /** The card's descriptive copy, caller-owned so wording stays per-surface. */\n description: ReactNode;\n /** Endpoints: `true` (the empty-state copy talks about pass-through). Functions: `false`. */\n emptyMeansPassthrough: boolean;\n /** Required target-field keys the current rows don't cover (HITL-1's post-touch flag). */\n uncoveredKeys?: string[];\n}\n\nexport function InputListEditor(props: InputListEditorProps) {\n const { rows, onChange, title, description, emptyMeansPassthrough, uncoveredKeys } = props;\n\n function addInput() {\n onChange([...rows, { key: \"\", label: \"\", type: \"string\" }]);\n }\n function updateInput(i: number, next: Partial<InputRow>) {\n onChange(rows.map((inp, idx) => (idx === i ? { ...inp, ...next } : inp)));\n }\n function removeInput(i: number) {\n onChange(rows.filter((_, idx) => idx !== i));\n }\n\n return (\n <div className=\"card\">\n <div className=\"row\" style={{ justifyContent: \"space-between\", alignItems: \"center\" }}>\n <h3>{title}</h3>\n <button type=\"button\" className=\"btn ghost\" onClick={addInput}>\n + Add input\n </button>\n </div>\n <p className=\"muted small\">{description}</p>\n {rows.length === 0 && (\n <p className=\"muted small\">\n {emptyMeansPassthrough ? \"No inputs — payload is passed through.\" : \"No inputs yet.\"}\n </p>\n )}\n <ul className=\"list\" data-testid=\"input-list\">\n {rows.map((inp, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: rows are positional and reorderable\n <li key={i} style={{ alignItems: \"center\", gap: 8 }}>\n <input\n type=\"text\"\n value={inp.key}\n placeholder=\"key\"\n aria-label=\"Input key\"\n onChange={(e) => updateInput(i, { key: e.target.value })}\n />\n <input\n type=\"text\"\n value={inp.label}\n placeholder=\"Label\"\n aria-label=\"Input label\"\n onChange={(e) => updateInput(i, { label: e.target.value })}\n />\n <select\n value={inp.type}\n aria-label=\"Input type\"\n onChange={(e) => updateInput(i, { type: e.target.value })}\n >\n {INPUT_TYPES.map((t) => (\n <option key={t} value={t}>\n {t}\n </option>\n ))}\n </select>\n <label className=\"row\" style={{ gap: 4, alignItems: \"center\" }}>\n <input\n type=\"checkbox\"\n checked={inp.required ?? false}\n onChange={(e) => updateInput(i, { required: e.target.checked })}\n />\n <span className=\"muted small\">required</span>\n </label>\n <IconButton\n danger\n icon=\"close\"\n label={`Remove input ${inp.key || i + 1}`}\n onClick={() => removeInput(i)}\n />\n </li>\n ))}\n </ul>\n {uncoveredKeys && uncoveredKeys.length > 0 && (\n <p className=\"muted small\" data-testid=\"input-uncovered\">\n Missing required field{uncoveredKeys.length > 1 ? \"s\" : \"\"} for the current target:{\" \"}\n {uncoveredKeys.join(\", \")}\n </p>\n )}\n </div>\n );\n}\n","import {\n type ActionParam,\n AppIcon,\n type BuiltStep,\n type ExprValue,\n ExpressionInput,\n type SecretValue,\n StepBuilderModal,\n} from \"@w6w/ui\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport {\n type TargetField,\n type WorkflowFieldCtx,\n type WorkflowLike,\n fieldsFromWorkflow,\n paramsToFields,\n targetRef as targetRefOf,\n} from \"../lib/target-fields.ts\";\nimport { CALL_APP } from \"../rail/ErrorHandlingTool.tsx\";\nimport { useAppActionsQuery } from \"../repos/apps.ts\";\nimport { useConnectionsForAppQuery } from \"../repos/connections.ts\";\nimport { useEndpointQuery, useEndpointsQuery } from \"../repos/endpoints.ts\";\nimport type { EndpointTarget } from \"../repos/endpoints.ts\";\nimport { useFunctionQuery, useFunctionsQuery } from \"../repos/functions.ts\";\nimport { useWorkflowQuery, useWorkflowsQuery } from \"../repos/workflows.ts\";\nimport type { TargetKind, TargetSelectorProps, TargetValue } from \"./TargetSelector.types.ts\";\nimport { useEditorApp } from \"./editor-apps.ts\";\n\nconst KIND_ORDER: readonly TargetKind[] = [\"action\", \"function\", \"workflow\", \"endpoint\"];\nconst KIND_LABEL: Record<TargetKind, string> = {\n action: \"Action (synchronous)\",\n function: \"Function (synchronous)\",\n workflow: \"Workflow (asynchronous)\",\n endpoint: \"Endpoint (dispatches to another Endpoint)\",\n};\n\n/**\n * One `target` picker for both the Functions editor's Implementation card and\n * the Endpoints editor's Target card (rfcs/endpoint.md:339-347,\n * rfcs/function.md:61-62). `allowedKinds` is the type-level RFC guard (A1,\n * see `TargetSelector.types.ts`) — Functions passes `[\"action\"]`, which makes\n * `{kind:\"function\"}`/`{kind:\"workflow\"}` unconstructable at that call site\n * and renders no kind control at all (A2); Endpoints passes all three.\n *\n * Owns every fetch its three arms need (apps/actions/connections for `action`;\n * the functions/workflows lists plus the picked one's own detail for the\n * other two — A8, gated `useQuery`s, mirroring the pages' existing\n * `actionsQuery` gating) and reuses `StepBuilderModal` verbatim for the\n * `action` arm (A3) — this is the one remaining `<StepBuilderModal` call\n * site; no second app/action picker.\n *\n * Resolves the picked target to a normalized `TargetField[]` (A5) and reports\n * it via `onResolved` on every change, so a page's own `useEffect` can seed\n * its input list from the same fields the mapping table below renders from\n * (A7) — by the time that table can render, `inputs.*` already resolves.\n *\n * **Takes no `exprOptions`.** The ƒx rail its mapping rows and its picker modal\n * offer is INHERITED — the app shell contributes the project's vars/secrets/\n * documents, the page contributes its `inputs` — so every expression editor\n * reachable from this card sees the same sources wherever it is opened. It used\n * to take the scope as a prop and wrap only the picker modal in a provider,\n * which is precisely how the mapping rows' `ƒx` toggles ended up offering an\n * empty rail while the \"Change\" button offered the full one.\n */\nexport function TargetSelector<K extends TargetKind>(props: TargetSelectorProps<K>) {\n const { allowedKinds, value, onChange, onResolved, title, description, passthroughHint } = props;\n const [pickerOpen, setPickerOpen] = useState(false);\n\n // Internally this operates on the full wire union — at runtime `value`\n // genuinely IS one of the three arms regardless of what `K` the caller\n // narrowed to; only the outward-facing generic signature is what enforces\n // A1's guard at the call site (TargetSelector.types.ts).\n const target = value as EndpointTarget;\n const kind = target.kind;\n const allowsKind = (k: TargetKind) => (allowedKinds as readonly TargetKind[]).includes(k);\n\n function emit(next: EndpointTarget) {\n onChange(next as unknown as TargetValue<K>);\n }\n\n const actionTarget = target.kind === \"action\" ? target : undefined;\n const app = actionTarget?.uses.app ?? \"\";\n const actionKey = actionTarget?.uses.action ?? \"\";\n const ref = targetRefOf(target);\n\n // This card already knows the EXACT bound app id, so resolving it never needs the whole\n // catalog: the host API's bounded `listAppsByIds` (`useEditorApp`). An empty id means\n // \"nothing selected yet\" and issues no request.\n const selectedAppSummary = useEditorApp(app);\n\n // `isTriggerApp`/`asFieldDefs` come from a LAZY `@w6w/ui/flow` import (the editor tree carries no\n // static flow import — `WorkflowEditor`'s `flowHelpers` idiom). The workflow arm's fields wait\n // for it exactly as they wait for the workflow detail query.\n const [flowHelpers, setFlowHelpers] = useState<WorkflowFieldCtx | null>(null);\n useEffect(() => {\n let canceled = false;\n import(\"@w6w/ui/flow\").then((m) => {\n if (canceled) return;\n setFlowHelpers({ isTriggerApp: m.isTriggerApp, asFieldDefs: m.asFieldDefs });\n });\n return () => {\n canceled = true;\n };\n }, []);\n const actionsQuery = useAppActionsQuery(app, app !== \"\");\n const connectionsQuery = useConnectionsForAppQuery(app, app !== \"\");\n const selectedAction = useMemo(\n () => (actionsQuery.data ?? []).find((a) => a.key === actionKey),\n [actionsQuery.data, actionKey],\n );\n\n /** Which callable tabs the picker offers — exactly this card's own\n * `allowedKinds`, so a call site that cannot accept a Workflow never sees\n * its tab. `endpoint` has no tab at all (F-2.0: \"no endpoints\"). */\n const callableFamilies = ([\"function\", \"workflow\"] as const).filter(allowsKind);\n\n /** The picker modal's heading, derived from this card's own so it always\n * names what the author is choosing — \"Choose implementation\" on the\n * Functions page, \"Choose target\" on Endpoints, \"Choose reroute target\"\n * from the rail. Never the old hard-coded \"Choose an action\", which stopped\n * being true the moment the Functions/Workflows tabs appeared here. */\n const pickerTitle = `Choose ${title.charAt(0).toLowerCase()}${title.slice(1)}`;\n\n const functionsQuery = useFunctionsQuery(allowsKind(\"function\"));\n const workflowsQuery = useWorkflowsQuery(undefined, allowsKind(\"workflow\"));\n const endpointsQuery = useEndpointsQuery(allowsKind(\"endpoint\"));\n const functionDetailQuery = useFunctionQuery(ref, kind === \"function\" && ref !== \"\");\n const workflowDetailQuery = useWorkflowQuery(ref, kind === \"workflow\" && ref !== \"\");\n const endpointDetailQuery = useEndpointQuery(ref, kind === \"endpoint\" && ref !== \"\");\n\n // A5: one normalized field list across four genuinely different sources.\n const fields = useMemo<TargetField[]>(() => {\n if (kind === \"action\") return paramsToFields(selectedAction?.params ?? []);\n if (kind === \"function\") return paramsToFields(functionDetailQuery.data?.inputs ?? []);\n if (kind === \"workflow\") {\n if (!flowHelpers) return [];\n return fieldsFromWorkflow(\n workflowDetailQuery.data?.workflow as WorkflowLike | undefined,\n flowHelpers,\n );\n }\n if (kind === \"endpoint\") {\n return paramsToFields(endpointDetailQuery.data?.endpoint.input ?? []);\n }\n return [];\n }, [\n kind,\n selectedAction,\n functionDetailQuery.data,\n workflowDetailQuery.data,\n endpointDetailQuery.data,\n flowHelpers,\n ]);\n\n useEffect(() => {\n onResolved?.({ meta: { kind, ref: kind === \"action\" ? app : ref }, kind: kind as K, fields });\n }, [kind, app, ref, fields, onResolved]);\n\n /**\n * The modal's `onAdd`. Handles BOTH shapes the picker can emit, because the\n * picker now offers all three of F-2.0's homepage tabs here\n * (`Connected apps | Functions | Workflows`), not just the app one:\n *\n * - an app action → `{ uses: {app, action, connection}, with }`\n * - a callable → `{ uses: {app: \"@w6w/call\", action: \"call\"},\n * with: {targetKind, targetId, …} }`\n *\n * Anything else `@w6w/*` is a graph-only internal node and is ignored — the\n * modal is opened `appsOnly`, so those tabs are not even rendered; the guard\n * stays as a belt-and-braces refusal.\n */\n function pickTarget(built: BuiltStep) {\n // The callable arm, FIRST: `@w6w/call` also matches the `@w6w/` prefix the\n // internal-node guard below rejects, so ordering is load-bearing.\n if (built.uses.app === CALL_APP) {\n const w = (built.with ?? {}) as { targetKind?: unknown; targetId?: unknown };\n const family = w.targetKind === \"workflow\" ? \"workflow\" : \"function\";\n const id = typeof w.targetId === \"string\" ? w.targetId : \"\";\n // A pick with no id cannot be emitted — it would blank a bound target.\n if (!id) return;\n emit(\n family === \"workflow\"\n ? { kind: \"workflow\", workflow: id }\n : { kind: \"function\", function: id },\n );\n setPickerOpen(false);\n return;\n }\n if (built.uses.app.startsWith(\"@w6w/\")) return; // apps only; ignore internal nodes\n // Pin 6: preserve compatible mappings. The modal returns `built.with` as\n // the NEWLY picked action's params (every key it declares, seeded blank).\n // Carry forward every existing `with` cell whose key the new action still\n // declares, and drop the cells it does not - never a wholesale overwrite.\n const existingWith = target.kind === \"action\" ? (target.with ?? {}) : {};\n const newWith = built.with ?? {};\n const preservedWith: Record<string, unknown> = {};\n for (const key of Object.keys(newWith)) {\n preservedWith[key] = key in existingWith ? existingWith[key] : newWith[key];\n }\n emit({ kind: \"action\", uses: built.uses, with: preservedWith });\n setPickerOpen(false);\n }\n\n function updateWith(paramKey: string, value: unknown) {\n if (target.kind !== \"action\") return;\n const nextWith = { ...(target.with ?? {}) };\n if (value === \"\" || value === undefined) delete nextWith[paramKey];\n else nextWith[paramKey] = value;\n emit({ ...target, with: nextWith });\n }\n\n function handleKindChange(next: TargetKind) {\n emit(\n next === \"action\"\n ? { kind: \"action\", uses: { app: \"\", action: \"\", connection: null } }\n : next === \"function\"\n ? { kind: \"function\", function: \"\" }\n : next === \"workflow\"\n ? { kind: \"workflow\", workflow: \"\" }\n : { kind: \"endpoint\", endpoint: \"\" },\n );\n }\n\n function handleRefChange(next: string) {\n emit(\n kind === \"function\"\n ? { kind: \"function\", function: next }\n : kind === \"workflow\"\n ? { kind: \"workflow\", workflow: next }\n : { kind: \"endpoint\", endpoint: next },\n );\n }\n\n /** Display name for the currently-bound callable, from whichever list owns\n * it. Falls back to the raw id in the JSX while the list is still loading. */\n const pickedCallableLabel = useMemo(() => {\n if (!ref) return undefined;\n if (kind === \"function\") {\n const fn = functionsQuery.data?.find((f) => f.id === ref);\n return fn ? fn.displayName || fn.key : undefined;\n }\n if (kind === \"workflow\") {\n const wf = workflowsQuery.data?.find((w) => w.id === ref);\n return wf ? wf.displayName || wf.name : undefined;\n }\n return undefined;\n }, [kind, ref, functionsQuery.data, workflowsQuery.data]);\n\n // Filter parameters based on showIf conditions and whether they have values\n const actionParams = useMemo(() => {\n const params = (selectedAction?.params ?? []) as ActionParam[];\n const currentWith = actionTarget?.with ?? {};\n\n return params.filter((p) => {\n // First, check showIf conditions - hide if condition not met\n if (p.showIf) {\n const { field, equals, in: inArray, notIn, truthy } = p.showIf;\n const fieldValue = currentWith[field];\n\n // Evaluate the showIf predicate\n if (equals !== undefined && fieldValue !== equals) return false;\n if (inArray !== undefined && !inArray.includes(fieldValue as string | number | boolean)) {\n return false;\n }\n if (notIn?.includes(fieldValue as string | number | boolean)) {\n return false;\n }\n if (truthy !== undefined && Boolean(fieldValue) !== truthy) return false;\n }\n\n // Then, show only: required fields OR fields that have been mapped\n const hasValue =\n p.key in currentWith && currentWith[p.key] !== \"\" && currentWith[p.key] !== undefined;\n return p.required || hasValue;\n });\n }, [selectedAction, actionTarget?.with]);\n\n return (\n <div className=\"card\">\n <h3>{title}</h3>\n <p className=\"muted small\">{description}</p>\n\n {allowedKinds.length > 1 && (\n <label className=\"field\">\n <span>Kind</span>\n <select value={kind} onChange={(e) => handleKindChange(e.target.value as TargetKind)}>\n {KIND_ORDER.filter(allowsKind).map((k) => (\n <option key={k} value={k}>\n {KIND_LABEL[k]}\n </option>\n ))}\n </select>\n </label>\n )}\n\n {kind === \"action\" && (\n <>\n {app && actionKey ? (\n <div className=\"row\" style={{ alignItems: \"center\", gap: 8 }}>\n <AppIcon\n src={selectedAppSummary?.iconSvg}\n srcDark={selectedAppSummary?.iconSvgDark}\n brandColor={selectedAppSummary?.brandColor}\n name={app}\n />\n <span className=\"list-main\">\n <strong>{selectedAction?.title ?? actionKey}</strong>{\" \"}\n <code className=\"muted\">{app}</code>\n <span className=\"muted small block\">\n {actionTarget?.uses.connection\n ? `via ${\n connectionsQuery.data?.find((c) => c.id === actionTarget.uses.connection)\n ?.displayName ?? actionTarget.uses.connection\n }`\n : \"no connection\"}\n </span>\n </span>\n <button type=\"button\" className=\"btn ghost\" onClick={() => setPickerOpen(true)}>\n Change\n </button>\n </div>\n ) : (\n <button type=\"button\" className=\"btn\" onClick={() => setPickerOpen(true)}>\n + Choose an action\n </button>\n )}\n\n {actionKey && (\n <div style={{ marginTop: 12 }}>\n <h4>Input mapping</h4>\n <p className=\"muted small\">\n Map each action param from the inputs above. Reference an input with{\" \"}\n <code>inputs.<key></code>; anything else is a literal.\n {passthroughHint &&\n \" Leave every cell blank to pass the inbound payload through as the action's params.\"}\n </p>\n {actionParams.length === 0 ? (\n <p className=\"muted small\">This action declares no params.</p>\n ) : (\n <ul className=\"list\">\n {actionParams.map((p) => (\n <li key={p.key} style={{ alignItems: \"center\", gap: 8 }}>\n <span className=\"list-main\">\n <code>{p.key}</code>\n {p.required && <span className=\"muted small\"> · required</span>}\n </span>\n <div style={{ flex: 1 }}>\n <ExpressionInput\n value={\n actionTarget?.with?.[p.key] as\n | string\n | ExprValue\n | SecretValue\n | undefined\n }\n onChange={(next) => updateWith(p.key, next)}\n placeholder={`inputs.${p.key}`}\n aria-label={`Mapping for ${p.key}`}\n />\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </>\n )}\n\n {/* Functions/Workflows go through the SAME modal the action arm uses —\n F-2.0's \"same flow as we do today for selecting action\", and the\n answer to its own `should we implement this everywhere … yes`. These\n two arms were bare `<select>`s, which is why the picker's Functions\n and Workflows tabs were unreachable from this card. */}\n {(kind === \"function\" || kind === \"workflow\") && (\n <div className=\"row\" style={{ alignItems: \"center\", gap: 8 }}>\n {ref ? (\n <>\n <span className=\"list-main\">\n <strong>{pickedCallableLabel ?? ref}</strong> <code className=\"muted\">{ref}</code>\n <span className=\"muted small block\">\n {kind === \"function\" ? \"Function (synchronous)\" : \"Workflow (asynchronous)\"}\n </span>\n </span>\n <button type=\"button\" className=\"btn ghost\" onClick={() => setPickerOpen(true)}>\n Change\n </button>\n </>\n ) : (\n <button type=\"button\" className=\"btn\" onClick={() => setPickerOpen(true)}>\n + Choose a {kind}\n </button>\n )}\n </div>\n )}\n\n {pickerOpen && (\n /* No provider here. The scope this modal needs is INHERITED from\n the page (which contributes its `inputs`) over the app shell\n (vars/secrets/documents) — the same scope the mapping rows below\n see, which is the entire point: reaching the expression editor\n through \"Change\" and reaching it through a row's `ƒx` toggle must\n offer the identical rail. Wrapping only this modal is what made\n them disagree.\n\n ONE modal for the whole card, not one per arm: it now offers every\n kind this card allows, so which arm is showing decides only which\n tab it OPENS on, never whether it renders. */\n <StepBuilderModal\n appsOnly\n callables={callableFamilies}\n initialTab={kind === \"function\" || kind === \"workflow\" ? `${kind}s` : \"connected\"}\n title={pickerTitle}\n onClose={() => setPickerOpen(false)}\n onAdd={pickTarget}\n initialApp={actionTarget && app ? selectedAppSummary : undefined}\n initialAction={actionTarget ? actionKey : undefined}\n initialConnection={actionTarget?.uses.connection ?? undefined}\n initialWith={actionTarget?.with}\n />\n )}\n\n {kind === \"endpoint\" && (\n <label className=\"field\">\n <span>Endpoint</span>\n <select value={ref} onChange={(e) => handleRefChange(e.target.value)}>\n <option value=\"\">— pick an endpoint —</option>\n {endpointsQuery.data?.map((ep) => (\n <option key={ep.id} value={ep.id}>\n {ep.displayName || ep.key} ({ep.id})\n </option>\n ))}\n </select>\n </label>\n )}\n </div>\n );\n}\n","import { ApiError } from \"@w6w/sdk\";\nimport { type ExpressionOptions, ExpressionOptionsProvider, IconButton } from \"@w6w/ui\";\nimport { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { HistoryButton } from \"../chrome/HistoryButton.tsx\";\nimport { JsonToggle, JsonToggleButton } from \"../chrome/JsonToggle.tsx\";\nimport { useWorkspace } from \"../chrome/workspace.tsx\";\nimport { useEndpointDraft } from \"../draft/index.ts\";\nimport { EndpointIdentityModal } from \"../forms/CreateEndpointModal.tsx\";\nimport { descriptorFor } from \"../lib/callable-descriptors.ts\";\nimport {\n type UrlForm,\n buildEndpointSaveBody,\n normalizeEndpoint,\n selectedUrlEntry,\n urlCardEntry,\n urlOptions,\n} from \"../lib/endpoint-editor.ts\";\nimport { uncoveredForEndpoint } from \"../lib/input-coverage.ts\";\nimport { mergeSeed, shouldSeed, uncoveredRequiredKeys } from \"../lib/input-seeding.ts\";\nimport { evaluateEdit } from \"../lib/rail-settings.ts\";\nimport type { TargetField } from \"../lib/target-fields.ts\";\nimport { useEditorProject } from \"../project-context.ts\";\nimport type { RailNavigation } from \"../rail/rail-env.tsx\";\nimport {\n type EndpointDef,\n type EndpointOwnTarget,\n type EndpointSecurity,\n useEndpointQuery,\n} from \"../repos/endpoints.ts\";\nimport { CallableEditorFrame } from \"./CallableEditorFrame.tsx\";\nimport { EditorShell } from \"./EditorShell.tsx\";\nimport { EndpointTestInvoke, SecurityCard, UrlCard } from \"./EndpointCards.tsx\";\nimport { InputListEditor } from \"./InputListEditor.tsx\";\nimport { TargetSelector } from \"./TargetSelector.tsx\";\nimport type { CallableEditorNavigation, EndpointEditorProps } from \"./types.ts\";\n\nconst NOOP = () => {};\n\nfunction messageOf(e: unknown): string {\n return e instanceof ApiError || e instanceof Error ? e.message : String(e);\n}\n\n/**\n * `<EndpointEditor endpointId>` — Studio's endpoint editor body (Identity, URL, Input, Target,\n * Security, Test invoke, History, JSON toggle) as a published component. The outermost element is\n * `.w6w-embed-root`; nothing goes through a portal.\n *\n * ## One cache, one draft\n *\n * Every field is the buffer of `useEndpointDraft` (seeded from, and refreshed by, the ONE\n * `[\"endpoint\", id]` query), and every write — the header Save, the bottom Save and the JSON\n * toggle's Save — is that draft's `commit`, so each issues one POST carrying the stored\n * `updatedAt` (`If-Unmodified-Since`). A 409 `endpoint_stale` is shown inline with a Reload and is\n * never retried. The invoke URLs are read from the same query's envelope, never copied into state,\n * so a rail save or an external change shows without a remount.\n *\n * A Save with nothing changed since the last read sends no request (the draft is clean).\n *\n * ## Rail\n *\n * `rail` omitted: the editor owns a rail. `rail={false}` inside a `<CallableWorkspace>` for the\n * SAME endpoint id publishes into it; with `rail={false}` the rail saves use the WORKSPACE's\n * `project`, not the `project` prop here. A workspace for a different id is silently overridden\n * while this editor is mounted.\n */\nexport function EndpointEditor(props: EndpointEditorProps): ReactNode {\n const { endpointId, onNavigate = NOOP, slots, tools } = props;\n const project = useEditorProject(props.project);\n const railNavigate = useCallback(\n (to: RailNavigation) => (onNavigate as (to: RailNavigation) => void)(to),\n [onNavigate],\n );\n return (\n <div\n className=\"w6w-embed-root\"\n style={{ display: \"flex\", width: \"100%\", height: \"100%\", minHeight: 0 }}\n >\n <EditorShell\n project={project}\n onNavigate={railNavigate}\n rail={props.rail}\n tools={tools}\n storageKey={project === null ? null : `w6w.rail.embed.${project}`}\n >\n <div style={{ flex: 1, minWidth: 0, overflow: \"auto\" }}>\n <EndpointBody\n key={endpointId}\n id={endpointId}\n onNavigate={onNavigate as (to: CallableEditorNavigation) => void}\n slots={slots}\n />\n </div>\n </EditorShell>\n </div>\n );\n}\n\nfunction EndpointBody(props: {\n id: string;\n onNavigate: (to: CallableEditorNavigation) => void;\n slots: EndpointEditorProps[\"slots\"];\n}) {\n const { id, onNavigate, slots } = props;\n const descriptor = descriptorFor(\"endpoint\");\n\n // The envelope the invoke URLs come from — the draft reads the same entry (one GET).\n const envelope = useEndpointQuery(id).data;\n\n const [resolvedFields, setResolvedFields] = useState<TargetField[]>([]);\n const resolvedRef = useRef(resolvedFields);\n resolvedRef.current = resolvedFields;\n const pendingPickRef = useRef(false);\n const touchedRef = useRef(false);\n const [urlForm, setUrlForm] = useState<UrlForm>(\"id\");\n const [urlDomain, setUrlDomain] = useState<string | null>(null);\n const [showIdentity, setShowIdentity] = useState(false);\n const [saved, setSaved] = useState(false);\n const [showJson, setShowJson] = useState(false);\n const [json, setJson] = useState(\"\");\n const [jsonStored, setJsonStored] = useState({ id, key: \"\" });\n const [jsonError, setJsonError] = useState<string | null>(null);\n\n // The save gate also guards every non-button save path (hide, unmount, registry flush).\n const saveGuard = useCallback((def: Record<string, unknown>) => {\n const e = normalizeEndpoint(def as unknown as EndpointDef);\n const unfed = uncoveredForEndpoint({\n target: e.target,\n rows: e.input ?? [],\n fields: resolvedRef.current,\n });\n return unfed.length > 0 ? `The target needs: ${unfed.join(\", \")}` : null;\n }, []);\n const draft = useEndpointDraft({ id, saveGuard });\n\n const view = useMemo(\n () => (draft.definition ? normalizeEndpoint(draft.definition as unknown as EndpointDef) : null),\n [draft.definition],\n );\n const inputs = view?.input ?? [];\n const security: EndpointSecurity = view?.exposure?.security ?? {\n auth: \"platform\",\n };\n\n const options = urlOptions(envelope?.invokeUrls);\n const selected = selectedUrlEntry(envelope?.invokeUrls, urlDomain);\n\n useWorkspace({\n kind: \"endpoint\",\n id,\n label: view?.displayName || undefined,\n key: view?.key.trim() || undefined,\n invokeUrl: selected ? selected.url : envelope?.invokeUrl,\n invokeUrlByKey: selected ? selected.urlByKey : envelope?.invokeUrlByKey,\n urlForm,\n inputs: resolvedFields.map((f) => f.key),\n policy: draft.policy,\n onPolicyChange: draft.onPolicyChange,\n });\n\n const { setDefinition } = draft;\n const patch = useCallback(\n (next: Partial<EndpointDef>) => {\n setSaved(false);\n setDefinition((d) => ({\n ...normalizeEndpoint(d as unknown as EndpointDef),\n ...next,\n }));\n },\n [setDefinition],\n );\n const patchSecurity = (next: Partial<EndpointSecurity>) => {\n setSaved(false);\n setDefinition((d) => {\n const e = normalizeEndpoint(d as unknown as EndpointDef);\n const merged = {\n ...(e.exposure?.security ?? { auth: \"platform\" }),\n ...next,\n };\n return { ...e, exposure: { ...e.exposure, security: merged } };\n });\n };\n\n function onTargetChange(next: EndpointOwnTarget) {\n pendingPickRef.current = true;\n patch({ target: next });\n }\n\n // Seeds the Input list from a freshly picked target — never on hydration (`pendingPickRef` is set\n // only by a genuine in-session pick), never over a touched or non-empty list.\n // biome-ignore lint/correctness/useExhaustiveDependencies: keyed on resolvedFields only — inputs/patch are read for their current value, not to retrigger the seed on every edit.\n useEffect(() => {\n if (!pendingPickRef.current) return;\n if (!shouldSeed({ rows: inputs, touched: touchedRef.current })) {\n pendingPickRef.current = false;\n return;\n }\n if (resolvedFields.length === 0) return;\n patch({ input: mergeSeed(inputs, resolvedFields) });\n pendingPickRef.current = false;\n }, [resolvedFields]);\n\n const pageExprScope = useMemo<ExpressionOptions>(\n () => ({ inputs: inputs.map((inp) => inp.key).filter(Boolean) }),\n [inputs],\n );\n const uncoveredKeys = useMemo(\n () => uncoveredRequiredKeys(inputs, resolvedFields),\n [inputs, resolvedFields],\n );\n const unfedKeys = useMemo(\n () =>\n view\n ? uncoveredForEndpoint({\n target: view.target,\n rows: inputs,\n fields: resolvedFields,\n })\n : [],\n [view, inputs, resolvedFields],\n );\n\n // Rendered beside BOTH Save buttons: a greyed button with its explanation off-screen is the\n // mysterious kind.\n const saveBlockedNote =\n view && unfedKeys.length > 0 ? (\n <p className=\"error small\" data-testid=\"save-blocked\">\n Can’t save yet — the target needs{\" \"}\n {view.target.kind === \"action\"\n ? \"these required params mapped under Input mapping\"\n : \"these required keys declared under Input\"}\n : <strong>{unfedKeys.join(\", \")}</strong>\n </p>\n ) : null;\n\n const key = view?.key.trim() ?? \"\";\n const canSave = Boolean(key) && unfedKeys.length === 0 && draft.canSave;\n\n async function onSave() {\n if (!view) return;\n const out = await draft.commit(buildEndpointSaveBody(view) as Record<string, unknown>);\n // A clean buffer writes nothing but still confirms, as FunctionEditor does (D-B5-1).\n setSaved(out.status === \"saved\" || out.status === \"clean\");\n }\n\n function openJson() {\n if (!view) return;\n const body = buildEndpointSaveBody(view);\n setJson(JSON.stringify(body, null, 2));\n setJsonStored({ id: String(body.id), key: String(body.key) });\n setJsonError(null);\n setShowJson(true);\n }\n\n async function onJsonSave() {\n const evalResult = evaluateEdit(json, jsonStored);\n const parsed = evalResult.parsed;\n if (!parsed || evalResult.blockedReason) return;\n const out = await draft.commit(parsed as Record<string, unknown>);\n if (out.status === \"saved\" || out.status === \"clean\") {\n setJsonError(null);\n setShowJson(false);\n // A clean buffer writes nothing but still confirms, as FunctionEditor does (D-B5-1).\n setSaved(out.status === \"saved\" || out.status === \"clean\");\n } else if (out.status === \"failed\") setJsonError(messageOf(out.error));\n else setJsonError(out.reason);\n }\n\n const loadErr = draft.loadError;\n const notFound = loadErr instanceof ApiError && loadErr.status === 404;\n if (!view) {\n if (loadErr !== null && !notFound) {\n return (\n <div className=\"error\" role=\"alert\">\n {messageOf(loadErr)}\n </div>\n );\n }\n if (!notFound) return <p className=\"muted\">Loading…</p>;\n }\n\n const title = view\n ? view.displayName || view.key || descriptor.editor.newTitle\n : descriptor.editor.newTitle;\n const stateError = draft.error !== null && !draft.stale ? messageOf(draft.error) : null;\n const staleBanner =\n draft.stale || draft.changedElsewhere ? (\n <div className=\"error\" role=\"alert\" data-testid=\"endpoint-stale\">\n {draft.stale\n ? messageOf(draft.error)\n : \"This endpoint was changed elsewhere. Reload to see the new version (your edits will be discarded).\"}{\" \"}\n <button type=\"button\" className=\"btn ghost\" onClick={() => void draft.reload()}>\n Reload\n </button>\n </div>\n ) : null;\n\n return (\n <ExpressionOptionsProvider value={pageExprScope}>\n <CallableEditorFrame\n kind=\"endpoint\"\n title={title}\n incomplete={false}\n canSave={canSave}\n isSaving={draft.saving}\n onSave={() => void onSave()}\n error={notFound ? messageOf(loadErr) : stateError}\n notFound={notFound}\n onNavigate={onNavigate}\n slots={slots}\n headerActions={\n <>\n <HistoryButton kind=\"endpoint\" id={id} />\n <JsonToggleButton onClick={openJson} />\n </>\n }\n banners={\n <>\n {staleBanner}\n {saveBlockedNote}\n {saved && <span className=\"ok\">Saved.</span>}\n </>\n }\n >\n {view && (\n <>\n <div className=\"card\">\n <div className=\"section-head\">\n <h3>Identity</h3>\n <IconButton\n icon=\"edit-2\"\n label=\"Edit name, key, and description\"\n onClick={() => setShowIdentity(true)}\n />\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Display name</span>\n <span>{view.displayName || \"—\"}</span>\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Key</span>\n <code className=\"muted\">{view.key || \"—\"}</code>\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Description</span>\n <span>{view.description || \"—\"}</span>\n </div>\n </div>\n\n <UrlCard\n entry={urlCardEntry(selected, envelope?.invokeUrl, envelope?.invokeUrlByKey)}\n domainOptions={options}\n urlDomain={selected?.domain ?? null}\n onUrlDomain={setUrlDomain}\n urlForm={urlForm}\n onUrlForm={setUrlForm}\n />\n\n <InputListEditor\n title=\"Input\"\n description=\"The declared inbound contract. Reuses core Param fields. Leave empty to pass the raw request payload through to the target unchanged.\"\n emptyMeansPassthrough={true}\n rows={inputs}\n onChange={(next) => {\n touchedRef.current = true;\n patch({ input: next });\n }}\n uncoveredKeys={uncoveredKeys}\n />\n\n <TargetSelector\n allowedKinds={[\"action\", \"function\", \"workflow\"] as const}\n title=\"Target\"\n description={\n <>\n The single thing this Endpoint dispatches to. An <strong>Action</strong> target\n runs one app action directly and a <strong>Function</strong> target resolves\n synchronously to a value; a <strong>Workflow</strong> target enqueues an\n asynchronous run. Switching the target here preserves the key and the input\n contract below, so callers never break.\n </>\n }\n passthroughHint\n value={view.target}\n onChange={onTargetChange}\n onResolved={(t) => setResolvedFields(t.fields)}\n />\n\n <SecurityCard security={security} onPatch={patchSecurity} />\n\n <EndpointTestInvoke id={id} inputs={inputs} />\n\n <div\n className=\"row\"\n style={{\n justifyContent: \"flex-end\",\n alignItems: \"center\",\n gap: \"var(--w6w-sp-3)\",\n marginTop: \"var(--w6w-sp-4)\",\n }}\n >\n {saveBlockedNote}\n {saved && <span className=\"ok\">Saved.</span>}\n <button\n type=\"button\"\n className=\"btn\"\n disabled={!canSave}\n onClick={() => void onSave()}\n >\n {draft.saving ? \"Saving…\" : \"Save\"}\n </button>\n </div>\n\n {showIdentity && (\n <EndpointIdentityModal\n initial={{\n key: view.key,\n displayName: view.displayName ?? \"\",\n description: view.description ?? \"\",\n }}\n onClose={() => setShowIdentity(false)}\n onSaved={(next) => {\n patch({\n displayName: next.displayName,\n description: next.description,\n });\n setShowIdentity(false);\n }}\n />\n )}\n\n <JsonToggle\n open={showJson}\n onClose={() => setShowJson(false)}\n title={`JSON — ${title}`}\n mode=\"disconnected\"\n value={json}\n onChange={setJson}\n guard={(t) => evaluateEdit(t, jsonStored).blockedReason}\n onSave={() => void onJsonSave()}\n saving={draft.saving}\n error={jsonError}\n editorLabel=\"Endpoint definition JSON\"\n />\n </>\n )}\n </CallableEditorFrame>\n </ExpressionOptionsProvider>\n );\n}\n","import { useQueryClient } from \"@tanstack/react-query\";\nimport { ApiError } from \"@w6w/sdk\";\nimport { type ExpressionOptions, ExpressionOptionsProvider, IconButton } from \"@w6w/ui\";\nimport { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { HistoryButton } from \"../chrome/HistoryButton.tsx\";\nimport { JsonToggle, JsonToggleButton } from \"../chrome/JsonToggle.tsx\";\nimport { useWorkspace } from \"../chrome/workspace.tsx\";\nimport { type CallableDraft, useFunctionDraft } from \"../draft/index.ts\";\nimport { FunctionIdentityModal } from \"../forms/CreateFunctionModal.tsx\";\nimport { coerceInput } from \"../lib/coerce-input.ts\";\nimport { historyKeys } from \"../lib/history-query.ts\";\nimport { uncoveredForFunction } from \"../lib/input-coverage.ts\";\nimport {\n inputsForSave,\n mergeSeed,\n shouldSeed,\n uncoveredRequiredKeys,\n} from \"../lib/input-seeding.ts\";\nimport { type EditStored, evaluateEdit } from \"../lib/rail-settings.ts\";\nimport { slugify } from \"../lib/slug.ts\";\nimport { type TargetField, implToTarget, targetToImpl } from \"../lib/target-fields.ts\";\nimport { useEditorProject } from \"../project-context.ts\";\nimport {\n type FunctionDef,\n type FunctionInput,\n type FunctionInvokeResult,\n useFunctionQuery,\n useInvokeFunctionMutation,\n} from \"../repos/functions.ts\";\nimport { CallableEditorFrame } from \"./CallableEditorFrame.tsx\";\nimport { EditorShell } from \"./EditorShell.tsx\";\nimport { InputListEditor } from \"./InputListEditor.tsx\";\nimport { TargetSelector } from \"./TargetSelector.tsx\";\nimport type { CallableEditorNavigation, FunctionEditorProps } from \"./types.ts\";\n\nconst NOOP = (): void => {};\n\nconst errMsg = (e: unknown): string => (e instanceof Error ? e.message : String(e));\n\n/**\n * The managed Function editor: Interface, Inputs, Implementation, Test invoke, History and a JSON\n * toggle, on `EditorShell`. The outermost element is `.w6w-embed-root`; nothing goes through a\n * portal.\n *\n * Every read and write goes through `useFunctionDraft` (one cache entry, `[\"function\", id]`; one\n * stale-write token). Save, the JSON toggle's Save and the rail's Error handling (`onPolicyChange`)\n * all persist through the draft, so each carries `If-Unmodified-Since`; a 409 shows inline with a\n * reload control and is never retried. `project` is not a save precondition (a Function is\n * account-scoped): it scopes the expression rail and the rail's storage key only.\n *\n * `rail` defaults to `true`: the editor renders its own right rail. `rail={false}` renders none and\n * publishes the Function (key, inputs, policy, `onPolicyChange`) into an enclosing\n * `<CallableWorkspace kind=\"function\" id>` for the SAME id; an editor whose id differs from its\n * workspace's overrides it and the host's rail renders empty. With `rail={false}` inside a\n * workspace, the rail's saves use that workspace's `project`, not this editor's `project` prop.\n * Aliases are not part of this editor; a host adds its own through `tools`.\n */\nexport function FunctionEditor(props: FunctionEditorProps): ReactNode {\n const { functionId, onNavigate = NOOP, slots, tools } = props;\n const project = useEditorProject(props.project);\n return (\n <div\n className=\"w6w-embed-root\"\n style={{ display: \"flex\", width: \"100%\", height: \"100%\", minHeight: 0 }}\n >\n <EditorShell\n project={project}\n onNavigate={onNavigate}\n rail={props.rail}\n tools={tools}\n storageKey={project === null ? null : `w6w.rail.embed.${project}`}\n >\n <FunctionDraftHost functionId={functionId} onNavigate={onNavigate} slots={slots} />\n </EditorShell>\n </div>\n );\n}\n\n/** Holds the draft ABOVE the per-id session, so a switch of `functionId` re-targets one hook (the\n * draft resets its own stale/error/changed-elsewhere/saving) while local UI state remounts. */\nfunction FunctionDraftHost(props: {\n functionId: string;\n onNavigate: (to: CallableEditorNavigation) => void;\n slots: FunctionEditorProps[\"slots\"];\n}): ReactNode {\n const draft = useFunctionDraft({ id: props.functionId });\n return <FunctionSession key={props.functionId} {...props} draft={draft} />;\n}\n\nfunction FunctionSession(props: {\n functionId: string;\n draft: CallableDraft;\n onNavigate: (to: CallableEditorNavigation) => void;\n slots: FunctionEditorProps[\"slots\"];\n}): ReactNode {\n const { functionId: id, draft, onNavigate, slots } = props;\n const def = draft.definition as FunctionDef | null;\n const inputs: FunctionDef[\"inputs\"] = def?.inputs ?? [];\n\n // `valid` is server-computed (never re-derived here); it rides the SAME cache entry the draft\n // reads, so this adds no request.\n const fnQuery = useFunctionQuery(id);\n const valid = (fnQuery.data as { valid?: boolean } | undefined)?.valid === true;\n\n const loadError = draft.loadError;\n const notFound = loadError instanceof ApiError && loadError.status === 404;\n\n const [showIdentity, setShowIdentity] = useState(false);\n const [notice, setNotice] = useState<string | null>(null);\n const [saved, setSaved] = useState(false);\n const [reloading, setReloading] = useState(false);\n\n const key = (def?.key ?? \"\").trim() || slugify(def?.displayName ?? \"\");\n\n // The resource this editor publishes into the rail (Studio's `workspace` memo, minus `alias`).\n useWorkspace({\n kind: \"function\",\n id,\n label: def?.displayName || undefined,\n key: key || undefined,\n inputs: inputs\n .filter((i) => Boolean(i.key))\n .map((i) => ({ key: i.key, required: i.required === true })),\n policy: draft.policy,\n onPolicyChange: draft.onPolicyChange,\n });\n\n const patch = (next: Partial<FunctionDef>) =>\n draft.setDefinition((d) => ({ ...d, ...next }) as Record<string, unknown>);\n\n // A pick's resolved fields seed an EMPTY, untouched Inputs list once (see `input-seeding.ts`).\n const [resolvedFields, setResolvedFields] = useState<TargetField[]>([]);\n const pendingPickRef = useRef(false);\n const touchedRef = useRef(false);\n // biome-ignore lint/correctness/useExhaustiveDependencies: keyed on resolvedFields only — inputs/patch are read for their current value, not to retrigger the seed on every edit.\n useEffect(() => {\n if (!pendingPickRef.current) return;\n if (!shouldSeed({ rows: inputs, touched: touchedRef.current })) {\n pendingPickRef.current = false;\n return;\n }\n if (resolvedFields.length === 0) return;\n patch({ inputs: mergeSeed(inputs, resolvedFields) });\n pendingPickRef.current = false;\n }, [resolvedFields]);\n\n const uncoveredKeys = useMemo(\n () => uncoveredRequiredKeys(inputs, resolvedFields),\n [inputs, resolvedFields],\n );\n const pageExprScope = useMemo<ExpressionOptions>(\n () => ({ inputs: inputs.map((inp) => inp.key).filter(Boolean) }),\n [inputs],\n );\n\n function onImplChange(next: Parameters<typeof targetToImpl>[0]) {\n pendingPickRef.current = true;\n const impl = targetToImpl(next);\n patch({ impl: def?.impl?.outputMap ? { ...impl, outputMap: def.impl.outputMap } : impl });\n }\n\n // A Function has no pass-through mode: every required param of the bound action must be mapped.\n // With no action chosen the field list is empty and the rule is vacuous (a deliberately\n // incomplete Function stays saveable; `incomplete` is its signal).\n const unfedKeys = useMemo(\n () => uncoveredForFunction({ impl: def?.impl, fields: resolvedFields }),\n [def?.impl, resolvedFields],\n );\n const canSave = Boolean(key) && unfedKeys.length === 0 && draft.canSave;\n\n // The exact body a Save sends — the ONE builder, so the JSON toggle's seed cannot drift from it.\n function buildSaveBody(): Record<string, unknown> {\n return {\n ...(def as FunctionDef),\n key,\n inputs: inputsForSave(inputs, { emptyMeansPassthrough: false }),\n };\n }\n\n async function onSave() {\n setNotice(null);\n setSaved(false);\n const out = await draft.commit(buildSaveBody());\n if (out.status === \"saved\" || out.status === \"clean\") setSaved(true);\n else if (out.status === \"blocked\") setNotice(out.reason);\n }\n\n const [showJson, setShowJson] = useState(false);\n const [json, setJson] = useState(\"\");\n const [jsonStored, setJsonStored] = useState<EditStored>({ id, key: \"\" });\n const [jsonError, setJsonError] = useState<string | null>(null);\n\n function openJson() {\n const body = buildSaveBody();\n setJson(JSON.stringify(body, null, 2));\n setJsonStored({ id: String(body.id), key: String(body.key) });\n setJsonError(null);\n setShowJson(true);\n }\n\n async function onJsonSave() {\n const evaluated = evaluateEdit(json, jsonStored);\n if (!evaluated.parsed || evaluated.blockedReason) return;\n setSaved(false);\n const out = await draft.commit(evaluated.parsed as Record<string, unknown>);\n if (out.status === \"saved\" || out.status === \"clean\") {\n setJsonError(null);\n setShowJson(false);\n setSaved(true);\n } else if (out.status === \"blocked\") setJsonError(out.reason);\n else if (out.status === \"failed\") setJsonError(errMsg(out.error));\n }\n\n const reload = useCallback(async () => {\n setReloading(true);\n try {\n await draft.reload();\n setNotice(null);\n setSaved(false);\n } finally {\n setReloading(false);\n }\n }, [draft.reload]);\n\n const failure = draft.stale ? null : (draft.error ?? loadError);\n const bannerError = notice ?? (failure === null ? null : errMsg(failure));\n\n const title = def?.displayName || def?.key || \"New function\";\n\n if (draft.loading || (def === null && loadError === null)) {\n return <p className=\"muted\">Loading…</p>;\n }\n\n return (\n <div style={{ flex: 1, minWidth: 0, overflow: \"auto\" }}>\n <ExpressionOptionsProvider value={pageExprScope}>\n <CallableEditorFrame\n kind=\"function\"\n title={title}\n incomplete={def !== null && !valid}\n canSave={canSave}\n isSaving={draft.saving}\n onSave={() => void onSave()}\n error={bannerError}\n notFound={notFound}\n onNavigate={onNavigate}\n slots={slots}\n headerActions={\n def && (\n <>\n <HistoryButton kind=\"function\" id={id} />\n <JsonToggleButton onClick={openJson} />\n </>\n )\n }\n banners={\n <>\n {draft.stale && (\n <div className=\"error\" role=\"alert\" data-testid=\"save-stale\">\n <p>\n This function changed on the server after you opened it. Your save was refused,\n so their work is intact.\n </p>\n <button type=\"button\" className=\"btn\" disabled={reloading} onClick={reload}>\n {reloading ? \"Reloading…\" : \"Reload from server\"}\n </button>\n </div>\n )}\n {draft.changedElsewhere && !draft.stale && (\n <div className=\"muted small\" data-testid=\"changed-elsewhere\">\n <p>\n This function was changed elsewhere. Reloading replaces your unsaved edits with\n the saved copy.\n </p>\n <button type=\"button\" className=\"btn ghost\" disabled={reloading} onClick={reload}>\n {reloading ? \"Reloading…\" : \"Reload from server\"}\n </button>\n </div>\n )}\n {unfedKeys.length > 0 && (\n <p className=\"error small\" data-testid=\"save-blocked\">\n Can’t save yet — map {unfedKeys.length > 1 ? \"these\" : \"this\"} required action{\" \"}\n {unfedKeys.length > 1 ? \"params\" : \"param\"} under Input mapping above:{\" \"}\n <strong>{unfedKeys.join(\", \")}</strong>\n </p>\n )}\n {saved && <span className=\"ok\">Saved.</span>}\n </>\n }\n >\n {def && (\n <>\n <div className=\"card\">\n <div className=\"section-head\">\n <h3>Interface</h3>\n <IconButton\n icon=\"edit-2\"\n label=\"Edit name, key, and description\"\n onClick={() => setShowIdentity(true)}\n />\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Display name</span>\n <span>{def.displayName || \"—\"}</span>\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Key</span>\n <code className=\"muted\">{def.key || \"—\"}</code>\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Description</span>\n <span>{def.description || \"—\"}</span>\n </div>\n </div>\n\n <InputListEditor\n title=\"Inputs\"\n description=\"The canonical, vendor-stable interface a caller binds to. Reuses core Param fields.\"\n emptyMeansPassthrough={false}\n rows={inputs}\n onChange={(next) => {\n touchedRef.current = true;\n patch({ inputs: next });\n }}\n uncoveredKeys={uncoveredKeys}\n />\n\n <TargetSelector\n allowedKinds={[\"action\", \"function\", \"workflow\"] as const}\n title=\"Implementation\"\n description={\n <>\n Bind the interface to one concrete app action, another Function, or a Workflow.\n Switching the provider here (a \"re-bind\") rewrites only <code>impl</code>'s\n target fields - the interface above, and every caller, is untouched.\n </>\n }\n value={implToTarget(def.impl)}\n onChange={onImplChange}\n onResolved={(t) => setResolvedFields(t.fields)}\n />\n\n <TestInvoke id={id} inputs={inputs} disabled={!valid} invalid={!valid} />\n\n {showIdentity && (\n <FunctionIdentityModal\n initial={{\n key: def.key,\n displayName: def.displayName ?? \"\",\n description: def.description ?? \"\",\n }}\n onClose={() => setShowIdentity(false)}\n onSaved={(next) => {\n patch({ displayName: next.displayName, description: next.description });\n setShowIdentity(false);\n }}\n />\n )}\n\n <JsonToggle\n open={showJson}\n onClose={() => setShowJson(false)}\n title={`JSON — ${title}`}\n mode=\"disconnected\"\n value={json}\n onChange={setJson}\n guard={(t) => evaluateEdit(t, jsonStored).blockedReason}\n onSave={() => void onJsonSave()}\n saving={draft.saving}\n error={jsonError}\n editorLabel=\"Function definition JSON\"\n />\n </>\n )}\n </CallableEditorFrame>\n </ExpressionOptionsProvider>\n </div>\n );\n}\n\n/** Test-invoke panel: one field per canonical input, run through `invokeFunction`. The server\n * invokes the STORED definition, so Save first. */\nfunction TestInvoke(props: {\n id: string;\n inputs: FunctionInput[];\n disabled: boolean;\n invalid: boolean;\n}): ReactNode {\n const { id, inputs } = props;\n const [values, setValues] = useState<Record<string, string>>({});\n const [result, setResult] = useState<FunctionInvokeResult | undefined>(undefined);\n const [error, setError] = useState<string | null>(null);\n const qc = useQueryClient();\n const invoke = useInvokeFunctionMutation();\n\n async function run() {\n const payload: Record<string, unknown> = {};\n for (const inp of inputs) {\n const coerced = coerceInput(inp.type, values[inp.key] ?? \"\");\n if (coerced !== undefined) payload[inp.key] = coerced;\n }\n try {\n const out = await invoke.mutateAsync({ id, inputs: payload });\n setError(null);\n setResult(out);\n } catch (e) {\n setResult(undefined);\n setError(errMsg(e));\n } finally {\n void qc.invalidateQueries({ queryKey: historyKeys.root });\n }\n }\n\n return (\n <div className=\"card\">\n <h3>Test invoke</h3>\n <p className=\"muted small\">\n Runs the saved Function through its bound action. Save any edits first.\n </p>\n {props.invalid && (\n <p className=\"muted small\">\n Pick an app and action to test this function — it has no implementation bound yet.\n </p>\n )}\n {inputs.length === 0 && (\n <p className=\"muted small\">Add inputs above to supply test values.</p>\n )}\n {inputs.map((inp) => {\n const fieldId = `fn-invoke-${inp.key || inp.label}`;\n return (\n <div className=\"field\" key={inp.key || inp.label}>\n <label htmlFor={fieldId}>\n {inp.label || inp.key}\n {inp.required && \" *\"}\n </label>\n {inp.type === \"boolean\" ? (\n <select\n id={fieldId}\n value={values[inp.key] ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, [inp.key]: e.target.value }))}\n >\n <option value=\"\">—</option>\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : (\n <input\n id={fieldId}\n type={inp.type === \"number\" ? \"number\" : \"text\"}\n value={values[inp.key] ?? \"\"}\n placeholder={inp.type === \"json\" ? \"{ }\" : (inp.hint ?? \"\")}\n onChange={(e) => setValues((v) => ({ ...v, [inp.key]: e.target.value }))}\n />\n )}\n </div>\n );\n })}\n <div className=\"row\">\n <button\n type=\"button\"\n className=\"btn\"\n disabled={props.disabled || invoke.isPending}\n onClick={() => void run()}\n >\n {invoke.isPending ? \"Invoking…\" : \"Invoke\"}\n </button>\n </div>\n {error && <div className=\"result error\">{error}</div>}\n {result !== undefined && (\n <>\n {result.invocationId && (\n <p className=\"muted small\">\n {result.status ?? \"done\"}\n {result.durationMs !== undefined ? ` · ${result.durationMs} ms` : \"\"}\n {\" · \"}\n <code>{result.invocationId}</code>\n </p>\n )}\n <pre className=\"result\" style={{ overflow: \"auto\" }}>\n {JSON.stringify(result.output, null, 2)}\n </pre>\n </>\n )}\n </div>\n );\n}\n"],"names":["codeLanguageForDocFormat","format","DocumentEditor","documentId","project","onDeleted","onBack","slots","p","useEditorProject","docQuery","useDocumentQuery","deleteMut","useDeleteDocumentMutation","editing","setEditing","useState","deletePending","setDeletePending","jsx","doc","empty","jsxs","Fragment","header","actions","CallFromCodeButton","EditButton","DeleteButton","Copyable","CodeBlock","DocumentFormModal","ConfirmModal","BLANK_TARGET","normalizeEndpoint","e","buildEndpointSaveBody","draft","target","input","rest","body","targetIsBound","inputs","inputsForSave","urlOptions","invokeUrls","selectedUrlEntry","pickedDomain","options","u","urlCardEntry","selected","invokeUrl","invokeUrlByKey","CallableEditorFrame","props","descriptor","descriptorFor","backLabel","goBack","ExecutionProfileHeader","AUTH_MODES","UrlCard","entry","domainOptions","urlDomain","onUrlDomain","urlForm","onUrlForm","hasByKey","shown","_a","form","label","title","SecurityCard","security","onPatch","mode","m","SecretField","v","stored","SECRET_MASK","EndpointTestInvoke","id","values","setValues","output","setOutput","error","setError","qc","useQueryClient","invokeMut","useInvokeEndpointMutation","invoke","payload","inp","coerced","coerceInput","out","ApiError","historyKeys","fieldId","InputListEditor","rows","onChange","description","emptyMeansPassthrough","uncoveredKeys","addInput","updateInput","i","next","idx","removeInput","_","INPUT_TYPES","IconButton","KIND_ORDER","KIND_LABEL","TargetSelector","allowedKinds","value","onResolved","passthroughHint","pickerOpen","setPickerOpen","kind","allowsKind","k","emit","actionTarget","app","actionKey","ref","targetRefOf","selectedAppSummary","useEditorApp","flowHelpers","setFlowHelpers","useEffect","canceled","actionsQuery","useAppActionsQuery","connectionsQuery","useConnectionsForAppQuery","selectedAction","useMemo","a","callableFamilies","pickerTitle","functionsQuery","useFunctionsQuery","workflowsQuery","useWorkflowsQuery","endpointsQuery","useEndpointsQuery","functionDetailQuery","useFunctionQuery","workflowDetailQuery","useWorkflowQuery","endpointDetailQuery","useEndpointQuery","fields","paramsToFields","fieldsFromWorkflow","_b","_c","pickTarget","built","CALL_APP","w","family","existingWith","newWith","preservedWith","key","updateWith","paramKey","nextWith","handleKindChange","handleRefChange","pickedCallableLabel","fn","f","wf","actionParams","params","currentWith","field","equals","inArray","notIn","truthy","fieldValue","hasValue","AppIcon","c","ExpressionInput","StepBuilderModal","ep","NOOP","messageOf","EndpointEditor","endpointId","onNavigate","tools","railNavigate","useCallback","to","EditorShell","EndpointBody","envelope","resolvedFields","setResolvedFields","resolvedRef","useRef","pendingPickRef","touchedRef","setUrlForm","setUrlDomain","showIdentity","setShowIdentity","saved","setSaved","showJson","setShowJson","json","setJson","jsonStored","setJsonStored","jsonError","setJsonError","saveGuard","def","unfed","uncoveredForEndpoint","useEndpointDraft","view","useWorkspace","setDefinition","patch","d","patchSecurity","merged","onTargetChange","shouldSeed","mergeSeed","pageExprScope","uncoveredRequiredKeys","unfedKeys","saveBlockedNote","canSave","onSave","openJson","onJsonSave","evalResult","evaluateEdit","parsed","loadErr","notFound","stateError","staleBanner","ExpressionOptionsProvider","HistoryButton","JsonToggleButton","t","EndpointIdentityModal","JsonToggle","errMsg","FunctionEditor","functionId","FunctionDraftHost","useFunctionDraft","FunctionSession","valid","loadError","notice","setNotice","reloading","setReloading","slugify","onImplChange","impl","targetToImpl","uncoveredForFunction","buildSaveBody","evaluated","reload","failure","bannerError","implToTarget","TestInvoke","FunctionIdentityModal","result","setResult","useInvokeFunctionMutation","run"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"editors.mjs","sources":["../src/editors/doc-format.ts","../src/editors/DocumentEditor.tsx","../src/lib/endpoint-editor.ts","../src/editor/PublishControl.tsx","../src/editor/CallableEditorFrame.tsx","../src/lib/invoke-error.ts","../src/editor/EndpointCards.tsx","../src/editor/InputListEditor.tsx","../src/editor/TargetSelector.tsx","../src/editor/EndpointEditor.tsx","../src/editor/FunctionEditor.tsx"],"sourcesContent":["/**\n * T1.2.1: which `CodeBlock`/editor grammar a document's persisted `format`\n * maps to. A named `switch` over every `DocFormat` arm — mirrors\n * `rail-settings.ts`'s total-function idiom (`:36-102`): no `default:`, so a\n * sixth `DocFormat` value added later fails to compile here instead of\n * silently falling through to some default grammar. Split out into its own\n * `.ts` module (never `.tsx`) so `node --test` (`test:unit`'s glob is\n * `src/lib/__tests__/*.test.ts`) can pin the map directly, the same reason\n * `rail-settings.ts`/`alias-rail.ts` exist as standalone modules.\n *\n * All five `CodeLanguage` arms used below are already members of\n * `CodeBlock`'s exported union (`packages/ui/src/CodeBlock.tsx:52-68`) — no\n * new Prism grammar registration is needed.\n */\nimport type { DocFormat } from \"@w6w/sdk\";\nimport type { CodeLanguage } from \"@w6w/ui\";\n\nexport function codeLanguageForDocFormat(format: DocFormat): CodeLanguage {\n switch (format) {\n case \"yaml\":\n return \"yaml\";\n case \"json\":\n return \"json\";\n case \"markdown\":\n return \"markdown\";\n case \"html\":\n return \"markup\";\n case \"text\":\n return \"plaintext\";\n }\n}\n","/**\n * `<DocumentEditor documentId>` — one document: its key, its content (read-only, highlighted) and,\n * for a private document, Edit and Delete. No repository sync and no \"synced from\" markers; a host\n * adds those around it.\n */\nimport { CodeBlock, Copyable, DeleteButton, EditButton } from \"@w6w/ui\";\nimport type { ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { CallFromCodeButton } from \"../chrome/CallFromCodeButton.tsx\";\nimport { ConfirmModal } from \"../chrome/ConfirmModal.tsx\";\nimport { DocumentFormModal } from \"../forms/DocumentFormModal.tsx\";\nimport { useEditorProject } from \"../project-context.ts\";\nimport { useDeleteDocumentMutation, useDocumentQuery } from \"../repos/documents.ts\";\nimport { codeLanguageForDocFormat } from \"./doc-format.ts\";\n\nexport interface DocumentEditorSlots {\n /** Replaces the default heading (the key as an `<h3>`). `null`: none. */\n header?: ReactNode;\n /** Replaces the default action row (Call from code, Edit, Delete). `null`: none. */\n actions?: ReactNode;\n /** Replaces the not-found body. `null`: nothing. */\n empty?: ReactNode;\n}\n\nexport interface DocumentEditorProps {\n documentId: string;\n /** Omitted: the provider's project. `null` or `\"\"`: none; nothing is read and writes refuse. */\n project?: string | null;\n /** Called once, AFTER the delete succeeded. */\n onDeleted?: () => void;\n /** Given, the not-found body offers a \"Back to documents\" control that calls it. */\n onBack?: () => void;\n slots?: DocumentEditorSlots;\n}\n\nexport function DocumentEditor({\n documentId,\n project,\n onDeleted,\n onBack,\n slots,\n}: DocumentEditorProps) {\n const p = useEditorProject(project);\n const docQuery = useDocumentQuery(documentId, p ?? undefined, p != null);\n const deleteMut = useDeleteDocumentMutation();\n const [editing, setEditing] = useState(false);\n const [deletePending, setDeletePending] = useState(false);\n\n // isPending, not isLoading: the query is disabled while the project is unresolved, so\n // `isLoading` (pending AND fetching) would be false there and \"not found\" would flash.\n if (docQuery.isPending) {\n return (\n <div className=\"w6w-embed-root\">\n <p className=\"muted\">Loading…</p>\n </div>\n );\n }\n const doc = docQuery.data;\n if (!doc) {\n const empty =\n slots?.empty === undefined ? (\n <>\n <h3>Document not found</h3>\n {onBack && (\n <button type=\"button\" className=\"btn ghost\" onClick={onBack}>\n Back to documents\n </button>\n )}\n </>\n ) : (\n slots.empty\n );\n return <div className=\"w6w-embed-root\">{empty}</div>;\n }\n\n const header = slots?.header === undefined ? <h3>{doc.key}</h3> : slots.header;\n const actions =\n slots?.actions === undefined ? (\n <div className=\"card\">\n <div style={{ display: \"flex\", gap: \"var(--w6w-sp-1-5)\" }}>\n <CallFromCodeButton resource={{ kind: \"document\", key: doc.key }} />\n {!doc.shared && (\n <>\n <EditButton\n label=\"Edit\"\n onClick={() => setEditing(true)}\n data-testid=\"document-editor-edit\"\n />\n <DeleteButton\n label=\"Delete\"\n onClick={() => setDeletePending(true)}\n disabled={deleteMut.isPending}\n data-testid=\"document-editor-delete\"\n />\n </>\n )}\n </div>\n </div>\n ) : (\n slots.actions\n );\n\n return (\n <div className=\"w6w-embed-root w6w-doc-editor\">\n {header}\n {actions}\n\n <div className=\"card\">\n <h3>Key</h3>\n <Copyable value={doc.key} readOnly>\n {/* `.w6w-copyable`'s flex rule targets `> input, > textarea, > pre`, never `> code`, so\n a bare `<code>` keeps flexbox's min-content floor and can push the copy button out\n of a narrow box unless told to shrink. */}\n <code\n style={{\n overflowWrap: \"anywhere\",\n display: \"block\",\n minWidth: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n flex: 1,\n }}\n >\n {doc.key}\n </code>\n </Copyable>\n </div>\n\n <div className=\"card\">\n <h3>Content</h3>\n <p className=\"muted small\">\n Format <code>{doc.format}</code>. Stored verbatim — this is a read-only view, not a\n rendered preview.\n </p>\n <CodeBlock\n code={doc.content}\n language={codeLanguageForDocFormat(doc.format)}\n showLineNumbers\n />\n </div>\n\n {editing && (\n <DocumentFormModal\n initial={doc}\n project={p}\n onClose={() => setEditing(false)}\n onSaved={() => setEditing(false)}\n />\n )}\n\n {deletePending && (\n <ConfirmModal\n title=\"Delete document\"\n message={`Delete the document \"${doc.key}\"? This cannot be undone.`}\n confirmLabel=\"Delete\"\n onConfirm={() => {\n setDeletePending(false);\n if (p == null) return;\n deleteMut.mutate({ id: doc.id, project: p }, { onSuccess: () => onDeleted?.() });\n }}\n onClose={() => setDeletePending(false)}\n />\n )}\n </div>\n );\n}\n","/**\n * The pure half of `<EndpointEditor>` — loadable by `node --test` (no React, no `@w6w/ui`).\n *\n * - {@link BLANK_TARGET} / {@link normalizeEndpoint}: the hydration boundary. A server definition\n * with no `target` (a draft, HITL-8) must still leave `target` defined, because every read in\n * the editor does `target.kind` unguarded.\n * - {@link buildEndpointSaveBody}: the ONE body a Save posts. An unbound target and an untouched\n * empty Input are absent from the wire, never `null`/`[]`.\n * - {@link urlOptions} / {@link selectedUrlEntry} / {@link urlCardEntry}: which of the\n * server-rendered invoke URLs the card shows. Every string is the server's, verbatim.\n */\nimport type { EndpointDef, EndpointOwnTarget, InvokeUrlOption } from \"../repos/endpoints.ts\";\nimport { inputsForSave } from \"./input-seeding.ts\";\nimport { targetIsBound } from \"./target-fields.ts\";\n\n/** A blank `action` target — what an absent `target` hydrates to. */\nexport const BLANK_TARGET: EndpointOwnTarget = {\n kind: \"action\",\n uses: { app: \"\", action: \"\", connection: null },\n};\n\n/** `target` falls back to {@link BLANK_TARGET} and `input` to `[]`, only when absent. */\nexport function normalizeEndpoint(e: EndpointDef): EndpointDef {\n return { input: [], ...e, target: e.target ?? BLANK_TARGET };\n}\n\n/**\n * The exact body a Save posts. Unbound target ⇒ no `target` key; empty Input ⇒ no `input` key\n * (a documented pass-through mode server-side — saving `[]` would persist a spurious list). The\n * key is trimmed. Everything else, secrets included, passes through unchanged.\n */\nexport function buildEndpointSaveBody(draft: EndpointDef): Record<string, unknown> {\n const { target, input, ...rest } = normalizeEndpoint(draft);\n const body: Record<string, unknown> = {\n ...rest,\n key: String(draft.key ?? \"\").trim(),\n };\n if (targetIsBound(target)) body.target = target;\n const inputs = inputsForSave(input ?? [], { emptyMeansPassthrough: true });\n if (inputs !== undefined) body.input = inputs;\n return body;\n}\n\n/** Which of the two server-rendered forms of the URL is on screen. */\nexport type UrlForm = \"id\" | \"key\";\n\n/** The domain picker's options: only when there IS a second option (≤ 1 ⇒ `undefined`). */\nexport function urlOptions(\n invokeUrls: InvokeUrlOption[] | null | undefined,\n): InvokeUrlOption[] | undefined {\n return invokeUrls && invokeUrls.length > 1 ? invokeUrls : undefined;\n}\n\n/** The entry the card shows: the session pick (by domain NAME), else `default`, else the first. */\nexport function selectedUrlEntry(\n invokeUrls: InvokeUrlOption[] | null | undefined,\n pickedDomain: string | null,\n): InvokeUrlOption | null {\n const options = urlOptions(invokeUrls);\n if (!options) return null;\n return (\n options.find((u) => u.domain === pickedDomain) ?? options.find((u) => u.default) ?? options[0]\n );\n}\n\n/** What the URL card renders: the selected domain's entry, else the flat envelope fields. */\nexport function urlCardEntry(\n selected: InvokeUrlOption | null,\n invokeUrl: string | undefined,\n invokeUrlByKey: string | undefined,\n): { url: string; urlByKey?: string; resolves: boolean } {\n return (\n selected ?? {\n url: invokeUrl ?? \"\",\n urlByKey: invokeUrlByKey,\n resolves: true,\n }\n );\n}\n","import { type ReactNode, useState } from \"react\";\nimport type { FlushOutcome } from \"../draft/use-workflow-draft.ts\";\nimport type { CallableKind } from \"../lib/callable-kind.ts\";\nimport { usePublishMutation, useVersionsQuery } from \"../repos/versions.ts\";\n\nexport interface PublishControlProps {\n kind: Extract<CallableKind, \"function\" | \"endpoint\">;\n id: string;\n /** The editor's `saveFirst`: publish runs only on `clean | saved`. */\n saveFirst: () => Promise<FlushOutcome>;\n /** The editor's own gate (`!canSave || incomplete`). */\n disabled: boolean;\n /** Where a `blocked` reason or a failed publish shows (the frame's banner). */\n onError: (message: string | null) => void;\n}\n\nconst messageOf = (e: unknown): string => (e instanceof Error ? e.message : String(e));\n\n/**\n * The header Publish of the Function and Endpoint editors, a copy of WorkflowEditor's `wf-publish`:\n * `Publish` → `● Published`, save-then-publish. Same versions cache key as the Settings rail, so\n * a publish from either surface refreshes both.\n */\nexport function PublishControl(props: PublishControlProps): ReactNode {\n const { kind, id, onError } = props;\n const versions = useVersionsQuery(kind, id, true);\n const publishMut = usePublishMutation(kind);\n const [busy, setBusy] = useState(false);\n const published = versions.data?.currentPublishedVersion != null;\n const testId = kind === \"function\" ? \"fn-publish\" : \"ep-publish\";\n\n async function onClick() {\n onError(null);\n setBusy(true);\n try {\n const saved = await props.saveFirst();\n if (saved.status === \"blocked\") {\n onError(saved.reason);\n return;\n }\n // `failed`: the draft already surfaces the save error; no publish is sent.\n if (saved.status === \"failed\") return;\n await publishMut.mutateAsync(id);\n } catch (e) {\n onError(messageOf(e));\n } finally {\n setBusy(false);\n }\n }\n\n return (\n <button\n type=\"button\"\n className={`btn ghost wf-publish${published ? \" active\" : \"\"}`}\n data-testid={testId}\n onClick={() => void onClick()}\n disabled={props.disabled || busy || publishMut.isPending}\n title={\n published\n ? \"Published — click to publish a new version\"\n : \"Never published — click to publish\"\n }\n >\n {busy || publishMut.isPending ? \"Publishing…\" : published ? \"● Published\" : \"Publish\"}\n </button>\n );\n}\n","import { type ReactNode, useState } from \"react\";\nimport { ExecutionProfileHeader } from \"../chrome/ExecutionProfileHeader.tsx\";\nimport { descriptorFor } from \"../lib/callable-descriptors.ts\";\nimport type { CallableKind } from \"../lib/callable-kind.ts\";\nimport { PublishControl, type PublishControlProps } from \"./PublishControl.tsx\";\nimport type { CallableEditorNavigation, CallableEditorSlots } from \"./types.ts\";\n\nexport interface CallableEditorFrameProps {\n /** Which kind's copy (back/save labels, not-found heading) the frame shows. */\n kind: CallableKind;\n /** The heading's text — the kind computes it from its own draft, because only it knows what\n * \"empty\" means for its definition. */\n title: string;\n /** Renders the `incomplete` badge beside the heading. */\n incomplete: boolean;\n canSave: boolean;\n isSaving: boolean;\n onSave: () => void;\n error: string | null;\n /** A 404 from the hydration GET: render the not-found card, never a blank editable form. */\n notFound: boolean;\n /** Where the host should take the user; back asks for `{ type: \"list\" }`. */\n onNavigate: (to: CallableEditorNavigation) => void;\n slots?: CallableEditorSlots;\n /** Statements BETWEEN the error banner and the body — the save-gate explanation, \"Saved.\". */\n banners?: ReactNode;\n /** Rendered as the FIRST child of the header action row, before Save (e.g. a JSON toggle). */\n headerActions?: ReactNode;\n /** The header Publish (save-then-publish). Omitted ⇒ no control; ignored when `slots.header`\n * replaces the header, since the host then owns the run/publish row. */\n publish?: Omit<PublishControlProps, \"kind\" | \"onError\">;\n children: ReactNode;\n}\n\n/**\n * The shared editor frame of the Function and Endpoint editors: back control, heading with the\n * `incomplete` badge, Save, the error banner and the body (or the not-found card). Router-free —\n * it asks the host to navigate through `onNavigate` and sets no document title. It publishes\n * nothing to the rail workspace either: each editor body does that itself (`useWorkspace`).\n *\n * The body is a `.w6w-card-stack` (@w6w/ui's shared rule): the cards an editor renders are ONE\n * vertical column, so the gap between them comes from that rule and never from the caller.\n */\nexport function CallableEditorFrame(props: CallableEditorFrameProps) {\n const descriptor = descriptorFor(props.kind);\n const [publishError, setPublishError] = useState<string | null>(null);\n const slots = props.slots;\n const backLabel = slots?.backLabel ?? descriptor.editor.backLabel;\n const goBack = () => props.onNavigate({ type: \"list\" });\n\n if (props.notFound) {\n return (\n <div>\n <button type=\"button\" className=\"btn ghost\" onClick={goBack}>\n {backLabel}\n </button>\n <div className=\"card\">\n <h3>{descriptor.editor.notFoundTitle}</h3>\n <p className=\"error\">{props.error}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"exec-profile-editor\">\n {slots?.header ?? (\n <ExecutionProfileHeader\n onBack={goBack}\n backLabel={backLabel}\n title={{ editable: false, value: props.title }}\n titleAdornment={\n props.incomplete && <span className=\"badge status-failed\">incomplete</span>\n }\n actions={\n <>\n {props.headerActions}\n {props.publish && props.kind !== \"workflow\" && (\n <PublishControl kind={props.kind} {...props.publish} onError={setPublishError} />\n )}\n <button\n type=\"button\"\n className=\"btn\"\n disabled={!props.canSave}\n onClick={props.onSave}\n >\n {props.isSaving ? \"Saving…\" : descriptor.editor.saveLabel}\n </button>\n {slots?.headerActions}\n </>\n }\n />\n )}\n\n <div className=\"exec-profile-body w6w-card-stack\">\n {props.error && <div className=\"error\">{props.error}</div>}\n {publishError && !slots?.header && <div className=\"error\">{publishError}</div>}\n {props.banners}\n {props.children}\n </div>\n </div>\n );\n}\n","import { ApiError } from \"@w6w/sdk\";\n\n/**\n * Actionable copy for the Test-invoke failures the server's publish/enable/completeness gates\n * raise. The server `message` names the state; this names the way out. Any other error falls\n * back to its own message.\n */\nconst COPY: Record<string, string> = {\n function_not_published:\n \"This Function has never been published, so callers outside the editor cannot run it yet. Publish it with the Publish button next to Save.\",\n endpoint_not_published:\n \"This Endpoint has never been published, so its public URL will not answer yet. Publish it with the Publish button next to Save.\",\n function_disabled: \"This Function is disabled. Enable it in Settings, then try again.\",\n endpoint_disabled: \"This Endpoint is disabled. Enable it in Settings, then try again.\",\n function_incomplete:\n \"This Function has no usable Implementation yet. Bind an app and action, or another callable, then try again.\",\n endpoint_incomplete:\n \"This Endpoint has no usable Target yet. Pick what it should dispatch to, then try again.\",\n};\n\nexport function invokeErrorCopy(e: unknown): string {\n if (e instanceof ApiError) {\n if (Object.hasOwn(COPY, e.code)) return COPY[e.code];\n return e.message;\n }\n return e instanceof Error ? e.message : String(e);\n}\n","import { useQueryClient } from \"@tanstack/react-query\";\nimport { Copyable } from \"@w6w/ui\";\nimport { useState } from \"react\";\nimport type { FlushOutcome } from \"../draft/use-workflow-draft.ts\";\nimport { coerceInput } from \"../lib/coerce-input.ts\";\nimport type { UrlForm } from \"../lib/endpoint-editor.ts\";\nimport { historyKeys } from \"../lib/history-query.ts\";\nimport { invokeErrorCopy } from \"../lib/invoke-error.ts\";\nimport {\n type EndpointAuthMode,\n type EndpointInput,\n type EndpointSecurity,\n type InvokeUrlOption,\n SECRET_MASK,\n useInvokeEndpointMutation,\n} from \"../repos/endpoints.ts\";\n\n/** The auth modes offered, in the order an operator is likely to want them. */\nconst AUTH_MODES: Array<{\n value: EndpointAuthMode;\n label: string;\n hint: string;\n}> = [\n {\n value: \"platform\",\n label: \"Platform auth (default)\",\n hint: \"A w6w token or a partner OIDC token, exactly like the rest of the API. The call runs as the caller.\",\n },\n {\n value: \"none\",\n label: \"None — public\",\n hint: \"Anyone with the URL can invoke this. The call runs as this Endpoint's owner.\",\n },\n {\n value: \"basic\",\n label: \"Basic auth\",\n hint: \"HTTP Basic with the username and password below.\",\n },\n {\n value: \"header\",\n label: \"Header auth\",\n hint: \"The named header must carry the value below.\",\n },\n {\n value: \"jwt\",\n label: \"JWT (HMAC)\",\n hint: \"A Bearer JWT, verified HS256 against the shared secret below.\",\n },\n];\n\n/**\n * The Endpoint's callable URL — its own card, directly beneath Identity.\n *\n * **Every URL here comes from the SERVER, verbatim** (the `[\"endpoint\", id]` envelope's\n * `invokeUrl`, `invokeUrlByKey` and `invokeUrls[]`): this component picks between strings and\n * renders one. It holds no hostname, no path grammar and no account slug. `entry.urlByKey` is\n * absent until the server renders it; then the card is one URL line and one Copy button, no\n * id/key toggle. `domainOptions` renders the domain `<select>` only when there is a second option\n * (`lib/endpoint-editor.ts`'s `urlOptions` does that collapse).\n */\nexport function UrlCard(props: {\n entry: { url: string; urlByKey?: string; resolves: boolean };\n domainOptions?: InvokeUrlOption[];\n urlDomain: string | null;\n onUrlDomain: (domain: string) => void;\n urlForm: UrlForm;\n onUrlForm: (form: UrlForm) => void;\n}) {\n const { entry, domainOptions, urlDomain, onUrlDomain, urlForm, onUrlForm } = props;\n const hasByKey = entry.urlByKey !== undefined && entry.urlByKey !== \"\";\n const shown = urlForm === \"key\" && entry.urlByKey ? entry.urlByKey : entry.url;\n\n return (\n <div className=\"card\">\n <h3>URL</h3>\n {domainOptions && (\n <label className=\"field\">\n <span>Domain</span>\n <select\n data-testid=\"url-domain\"\n value={urlDomain ?? domainOptions[0]?.domain}\n onChange={(e) => onUrlDomain(e.target.value)}\n >\n {domainOptions.map((u) => (\n <option key={u.domain} value={u.domain}>\n {u.domain +\n (u.default ? \" · default\" : \"\") +\n (u.resolves ? \"\" : \" · not routable yet\")}\n </option>\n ))}\n </select>\n </label>\n )}\n {hasByKey && (\n <fieldset className=\"seg\" aria-label=\"URL form\">\n {(\n [\n [\"id\", \"By id\", \"The stable, host-issued address. Never changes.\"],\n [\"key\", \"By key\", \"The readable address, built from the account and this key.\"],\n ] as const\n ).map(([form, label, title]) => (\n <button\n key={form}\n type=\"button\"\n className={`seg-btn${urlForm === form ? \" active\" : \"\"}`}\n aria-pressed={urlForm === form}\n data-testid={`url-form-${form}`}\n title={title}\n onClick={() => onUrlForm(form)}\n >\n {label}\n </button>\n ))}\n </fieldset>\n )}\n <div className=\"row\" style={{ alignItems: \"center\", gap: \"var(--w6w-sp-2)\" }}>\n <Copyable value={shown} readOnly>\n <code style={{ overflowWrap: \"anywhere\" }}>\n <strong>POST</strong> <span data-testid=\"invoke-url\">{shown || \"…\"}</span>\n </code>\n </Copyable>\n </div>\n {!entry.resolves && (\n <p className=\"muted small\" data-testid=\"url-unroutable\">\n Not routable yet — this domain has no DNS or TLS behind it, so a call to this address will\n not answer.\n </p>\n )}\n <p className=\"muted small\" style={{ marginTop: \"var(--w6w-sp-2)\" }}>\n Send the declared input as a JSON body.\n </p>\n </div>\n );\n}\n\n/**\n * Who may call the URL above.\n *\n * Every mode except `platform` runs the target as the Endpoint's owner (there is no platform\n * identity on such a request), which is what the warning below says before an operator switches off\n * platform auth. Secrets are write-only: the server returns a mask for a configured secret, and\n * saving the mask back keeps the stored value.\n */\nexport function SecurityCard(props: {\n security: EndpointSecurity;\n onPatch: (next: Partial<EndpointSecurity>) => void;\n}) {\n const { security, onPatch } = props;\n const mode = security.auth;\n\n return (\n <div className=\"card\">\n <h3>Security</h3>\n\n <label className=\"field\">\n <span>Who may call it</span>\n <select\n value={mode}\n onChange={(e) => onPatch({ auth: e.target.value as EndpointAuthMode })}\n >\n {AUTH_MODES.map((m) => (\n <option key={m.value} value={m.value}>\n {m.label}\n </option>\n ))}\n </select>\n <span className=\"hint\">{AUTH_MODES.find((m) => m.value === mode)?.hint}</span>\n </label>\n\n {mode !== \"platform\" && (\n <p className=\"muted small\">\n <strong>Runs as this Endpoint's owner.</strong> A caller authenticated by the policy above\n carries no w6w identity, so the target runs with the connections and data of whoever owns\n this Endpoint.\n </p>\n )}\n\n {mode === \"basic\" && (\n <>\n <label className=\"field\">\n <span>Username</span>\n <input\n type=\"text\"\n value={security.basicUser ?? \"\"}\n onChange={(e) => onPatch({ basicUser: e.target.value })}\n />\n </label>\n <SecretField\n label=\"Password\"\n value={security.basicPassword}\n onChange={(v) => onPatch({ basicPassword: v })}\n />\n </>\n )}\n\n {mode === \"header\" && (\n <>\n <label className=\"field\">\n <span>Header name</span>\n <input\n type=\"text\"\n placeholder=\"X-API-Key\"\n value={security.headerName ?? \"\"}\n onChange={(e) => onPatch({ headerName: e.target.value })}\n />\n </label>\n <SecretField\n label=\"Header value\"\n value={security.headerValue}\n onChange={(v) => onPatch({ headerValue: v })}\n />\n </>\n )}\n\n {mode === \"jwt\" && (\n <SecretField\n label=\"JWT secret (HS256)\"\n value={security.jwtSecret}\n onChange={(v) => onPatch({ jwtSecret: v })}\n />\n )}\n </div>\n );\n}\n\n/**\n * A write-only secret input. A stored secret comes back as {@link SECRET_MASK}; the input renders\n * EMPTY (the mask is never a DOM value) with the \"stored — type to replace\" hint, and the buffer\n * keeps the mask until the operator types, so a save that never touches it preserves what is stored.\n */\nexport function SecretField(props: {\n label: string;\n value: string | undefined;\n onChange: (v: string) => void;\n}) {\n const stored = props.value === SECRET_MASK;\n return (\n <label className=\"field\">\n <span>{props.label}</span>\n <input\n type=\"password\"\n value={stored ? \"\" : (props.value ?? \"\")}\n placeholder={stored ? \"•••••••• (stored — type to replace)\" : \"\"}\n onChange={(e) => props.onChange(e.target.value)}\n />\n {stored && <span className=\"hint\">A secret is stored — type to replace it.</span>}\n </label>\n );\n}\n\n/**\n * Test-invoke panel: one field per declared input, POSTed to /endpoints/:id/invoke. The server\n * invokes the STORED draft without publishing (`allowUnpublished`); unsaved edits are saved first\n * via `saveFirst`, so what runs is what the editor shows. The result is the\n * `kind`-tagged envelope: an Action or Function target answers with an inline `output`; a Workflow\n * target answers with a `runId` to poll.\n */\nexport function EndpointTestInvoke(props: {\n id: string;\n inputs: EndpointInput[];\n saveFirst: () => Promise<FlushOutcome>;\n}) {\n const { id, inputs } = props;\n const [values, setValues] = useState<Record<string, string>>({});\n const [output, setOutput] = useState<unknown>(undefined);\n const [error, setError] = useState<string | null>(null);\n // True from the click until saveFirst + invoke settle, so a second click cannot start a second save.\n const [busy, setBusy] = useState(false);\n const qc = useQueryClient();\n const invokeMut = useInvokeEndpointMutation();\n\n const invoke = async () => {\n const payload: Record<string, unknown> = {};\n for (const inp of inputs) {\n const coerced = coerceInput(inp.type, values[inp.key] ?? \"\");\n if (coerced !== undefined) payload[inp.key] = coerced;\n }\n setBusy(true);\n try {\n const saved = await props.saveFirst();\n if (saved.status === \"blocked\") {\n setOutput(undefined);\n setError(saved.reason);\n return;\n }\n if (saved.status === \"failed\") {\n setOutput(undefined);\n setError(invokeErrorCopy(saved.error));\n return;\n }\n const out = await invokeMut.mutateAsync({ id, input: payload });\n setError(null);\n setOutput(out);\n } catch (e) {\n setOutput(undefined);\n setError(invokeErrorCopy(e));\n } finally {\n setBusy(false);\n void qc.invalidateQueries({ queryKey: historyKeys.root });\n }\n };\n\n return (\n <div className=\"card\">\n <h3>Test invoke</h3>\n <p className=\"muted small\">\n Dispatches the saved draft to its target — no need to publish first. Unsaved edits are saved\n first. An Action or Function target returns a value; a Workflow target returns a run id to\n poll.\n </p>\n {inputs.length === 0 && (\n <p className=\"muted small\">No declared inputs — the payload is passed through.</p>\n )}\n {inputs.map((inp) => {\n const fieldId = `ep-invoke-${id}-${inp.key || inp.label}`;\n return (\n <div className=\"field\" key={inp.key || inp.label}>\n <label htmlFor={fieldId}>\n {inp.label || inp.key}\n {inp.required && \" *\"}\n </label>\n {inp.type === \"boolean\" ? (\n <select\n id={fieldId}\n value={values[inp.key] ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, [inp.key]: e.target.value }))}\n >\n <option value=\"\">—</option>\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : (\n <input\n id={fieldId}\n type={inp.type === \"number\" ? \"number\" : \"text\"}\n value={values[inp.key] ?? \"\"}\n placeholder={inp.type === \"json\" ? \"{ }\" : (inp.hint ?? \"\")}\n onChange={(e) => setValues((v) => ({ ...v, [inp.key]: e.target.value }))}\n />\n )}\n </div>\n );\n })}\n <div className=\"row\">\n <button\n type=\"button\"\n className=\"btn\"\n disabled={busy || invokeMut.isPending}\n onClick={() => void invoke()}\n >\n {busy || invokeMut.isPending ? \"Invoking…\" : \"Invoke\"}\n </button>\n </div>\n {error && <div className=\"result error\">{error}</div>}\n {output !== undefined && (\n <pre className=\"result\" style={{ overflow: \"auto\" }}>\n {JSON.stringify(output, null, 2)}\n </pre>\n )}\n </div>\n );\n}\n","import { IconButton } from \"@w6w/ui\";\nimport type { ReactNode } from \"react\";\nimport { INPUT_TYPES, type InputRow } from \"../lib/input-seeding.ts\";\n\n/**\n * One input-row card, shared by the Functions \"Inputs\" editor and the\n * Endpoints \"Input\" editor (T3.2.1) — the two were byte-identical from\n * `<li key={i}>` through `</li>` on the merged branch, apart from the map\n * source variable (`draft.inputs` vs the `inputs` local alias for\n * `draft.input ?? []`). Controlled: the page owns `rows` as its `draft`'s\n * single source of truth and passes the next array back through `onChange`\n * on every add/update/remove — this component never holds its own copy.\n *\n * `emptyMeansPassthrough` carries the one real divergence between the two\n * forms: an Endpoint's declared `input` list absent/empty is a documented\n * pass-through mode, a Function's empty `inputs` just means \"no arguments\" —\n * so the empty-state copy (and nothing else) differs per page.\n */\nexport interface InputListEditorProps {\n rows: InputRow[];\n onChange: (next: InputRow[]) => void;\n /** The card's `<h3>` — \"Inputs\" (Functions) or \"Input\" (Endpoints). */\n title: string;\n /** The card's descriptive copy, caller-owned so wording stays per-surface. */\n description: ReactNode;\n /** Endpoints: `true` (the empty-state copy talks about pass-through). Functions: `false`. */\n emptyMeansPassthrough: boolean;\n /** Required target-field keys the current rows don't cover (HITL-1's post-touch flag). */\n uncoveredKeys?: string[];\n}\n\nexport function InputListEditor(props: InputListEditorProps) {\n const { rows, onChange, title, description, emptyMeansPassthrough, uncoveredKeys } = props;\n\n function addInput() {\n onChange([...rows, { key: \"\", label: \"\", type: \"string\" }]);\n }\n function updateInput(i: number, next: Partial<InputRow>) {\n onChange(rows.map((inp, idx) => (idx === i ? { ...inp, ...next } : inp)));\n }\n function removeInput(i: number) {\n onChange(rows.filter((_, idx) => idx !== i));\n }\n\n return (\n <div className=\"card\">\n <div className=\"row\" style={{ justifyContent: \"space-between\", alignItems: \"center\" }}>\n <h3>{title}</h3>\n <button type=\"button\" className=\"btn ghost\" onClick={addInput}>\n + Add input\n </button>\n </div>\n <p className=\"muted small\">{description}</p>\n {rows.length === 0 && (\n <p className=\"muted small\">\n {emptyMeansPassthrough ? \"No inputs — payload is passed through.\" : \"No inputs yet.\"}\n </p>\n )}\n <ul className=\"list\" data-testid=\"input-list\">\n {rows.map((inp, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: rows are positional and reorderable\n <li key={i} style={{ alignItems: \"center\", gap: 8 }}>\n <input\n type=\"text\"\n value={inp.key}\n placeholder=\"key\"\n aria-label=\"Input key\"\n onChange={(e) => updateInput(i, { key: e.target.value })}\n />\n <input\n type=\"text\"\n value={inp.label}\n placeholder=\"Label\"\n aria-label=\"Input label\"\n onChange={(e) => updateInput(i, { label: e.target.value })}\n />\n <select\n value={inp.type}\n aria-label=\"Input type\"\n onChange={(e) => updateInput(i, { type: e.target.value })}\n >\n {INPUT_TYPES.map((t) => (\n <option key={t} value={t}>\n {t}\n </option>\n ))}\n </select>\n <label className=\"row\" style={{ gap: 4, alignItems: \"center\" }}>\n <input\n type=\"checkbox\"\n checked={inp.required ?? false}\n onChange={(e) => updateInput(i, { required: e.target.checked })}\n />\n <span className=\"muted small\">required</span>\n </label>\n <IconButton\n danger\n icon=\"close\"\n label={`Remove input ${inp.key || i + 1}`}\n onClick={() => removeInput(i)}\n />\n </li>\n ))}\n </ul>\n {uncoveredKeys && uncoveredKeys.length > 0 && (\n <p className=\"muted small\" data-testid=\"input-uncovered\">\n Missing required field{uncoveredKeys.length > 1 ? \"s\" : \"\"} for the current target:{\" \"}\n {uncoveredKeys.join(\", \")}\n </p>\n )}\n </div>\n );\n}\n","import { useQueryClient } from \"@tanstack/react-query\";\nimport {\n type ActionParam,\n AppIcon,\n type BuiltStep,\n type ExprValue,\n ExpressionInput,\n type SecretValue,\n StepBuilderModal,\n} from \"@w6w/ui\";\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport { disabledBannerState, findBindingProblems } from \"../lib/binding-problems.ts\";\nimport {\n type TargetField,\n type WorkflowFieldCtx,\n type WorkflowLike,\n fieldsFromWorkflow,\n paramsToFields,\n targetRef as targetRefOf,\n} from \"../lib/target-fields.ts\";\nimport { CALL_APP } from \"../rail/ErrorHandlingTool.tsx\";\nimport { useAppActionsQuery } from \"../repos/apps.ts\";\nimport { connectionsForAppKey, useConnectionsForAppQuery } from \"../repos/connections.ts\";\nimport { useEndpointQuery, useEndpointsQuery } from \"../repos/endpoints.ts\";\nimport type { EndpointTarget } from \"../repos/endpoints.ts\";\nimport { useFunctionQuery, useFunctionsQuery } from \"../repos/functions.ts\";\nimport { useSetEnabledMutation, useVersionsQuery } from \"../repos/versions.ts\";\nimport { useWorkflowQuery, useWorkflowsQuery } from \"../repos/workflows.ts\";\nimport { BindingBanner } from \"./BindingBanner.tsx\";\nimport type { TargetKind, TargetSelectorProps, TargetValue } from \"./TargetSelector.types.ts\";\nimport { useEditorApp } from \"./editor-apps.ts\";\n\nconst KIND_ORDER: readonly TargetKind[] = [\"action\", \"function\", \"workflow\", \"endpoint\"];\nconst KIND_LABEL: Record<TargetKind, string> = {\n action: \"Action (synchronous)\",\n function: \"Function (synchronous)\",\n workflow: \"Workflow (asynchronous)\",\n endpoint: \"Endpoint (dispatches to another Endpoint)\",\n};\n\n/**\n * The disabled-callable banner for a Function/Endpoint whose action target binds a connection the\n * account no longer has (R5). Shares the connections cache entry with `TargetSelector`; returns\n * `null` unless the callable is disabled and (has, or had this mount) a missing binding.\n */\nexport function useBindingBanner(args: {\n kind: \"function\" | \"endpoint\";\n id: string;\n uses: { app?: string; connection?: string | null } | undefined;\n dirty: boolean;\n}): ReactNode {\n const { kind, id, uses, dirty } = args;\n const app = uses?.app ?? \"\";\n const connection = uses?.connection ?? \"\";\n const qc = useQueryClient();\n const connections = useConnectionsForAppQuery(app, app !== \"\");\n const enabled = useVersionsQuery(kind, id, true).data?.enabled;\n const setEnabled = useSetEnabledMutation(kind);\n const settled = connections.isSuccess && !connections.isFetching;\n const ids = useMemo(() => new Set((connections.data ?? []).map((c) => c.id)), [connections.data]);\n const problemCount = findBindingProblems([{ id: \"target\", uses }], () =>\n settled ? { state: \"ready\", ids } : undefined,\n ).length;\n\n const hadRef = useRef({ id, had: false });\n if (hadRef.current.id !== id) hadRef.current = { id, had: false };\n if (problemCount > 0) hadRef.current.had = true;\n\n // A connection created through the picker never touched this cache: refetch once per pair.\n const seenRef = useRef<string | null>(null);\n useEffect(() => {\n const pair = `${app}|${connection}`;\n const prev = seenRef.current;\n seenRef.current = pair;\n if (prev !== null && prev !== pair && settled && connection && !ids.has(connection)) {\n qc.invalidateQueries({ queryKey: connectionsForAppKey(app) });\n }\n }, [app, connection, settled, ids, qc]);\n\n const state = disabledBannerState({\n enabled,\n problemCount,\n dirty,\n hadProblems: hadRef.current.had,\n });\n if (!state.show) return null;\n return (\n <BindingBanner\n kind={kind}\n problemCount={state.problemCount}\n canEnable={state.canEnable}\n pending={setEnabled.isPending}\n onEnable={() => setEnabled.mutate({ id, enabled: true })}\n />\n );\n}\n\n/**\n * One `target` picker for both the Functions editor's Implementation card and\n * the Endpoints editor's Target card (rfcs/endpoint.md:339-347,\n * rfcs/function.md:61-62). `allowedKinds` is the type-level RFC guard (A1,\n * see `TargetSelector.types.ts`) — Functions passes `[\"action\"]`, which makes\n * `{kind:\"function\"}`/`{kind:\"workflow\"}` unconstructable at that call site\n * and renders no kind control at all (A2); Endpoints passes all three.\n *\n * Owns every fetch its three arms need (apps/actions/connections for `action`;\n * the functions/workflows lists plus the picked one's own detail for the\n * other two — A8, gated `useQuery`s, mirroring the pages' existing\n * `actionsQuery` gating) and reuses `StepBuilderModal` verbatim for the\n * `action` arm (A3) — this is the one remaining `<StepBuilderModal` call\n * site; no second app/action picker.\n *\n * Resolves the picked target to a normalized `TargetField[]` (A5) and reports\n * it via `onResolved` on every change, so a page's own `useEffect` can seed\n * its input list from the same fields the mapping table below renders from\n * (A7) — by the time that table can render, `inputs.*` already resolves.\n *\n * **Takes no `exprOptions`.** The ƒx rail its mapping rows and its picker modal\n * offer is INHERITED — the app shell contributes the project's vars/secrets/\n * documents, the page contributes its `inputs` — so every expression editor\n * reachable from this card sees the same sources wherever it is opened. It used\n * to take the scope as a prop and wrap only the picker modal in a provider,\n * which is precisely how the mapping rows' `ƒx` toggles ended up offering an\n * empty rail while the \"Change\" button offered the full one.\n */\nexport function TargetSelector<K extends TargetKind>(props: TargetSelectorProps<K>) {\n const {\n allowedKinds,\n excludeCallableIds,\n value,\n onChange,\n onResolved,\n title,\n description,\n passthroughHint,\n } = props;\n const [pickerOpen, setPickerOpen] = useState(false);\n\n // Internally this operates on the full wire union — at runtime `value`\n // genuinely IS one of the three arms regardless of what `K` the caller\n // narrowed to; only the outward-facing generic signature is what enforces\n // A1's guard at the call site (TargetSelector.types.ts).\n const target = value as EndpointTarget;\n const kind = target.kind;\n const allowsKind = (k: TargetKind) => (allowedKinds as readonly TargetKind[]).includes(k);\n\n function emit(next: EndpointTarget) {\n onChange(next as unknown as TargetValue<K>);\n }\n\n const actionTarget = target.kind === \"action\" ? target : undefined;\n const app = actionTarget?.uses.app ?? \"\";\n const actionKey = actionTarget?.uses.action ?? \"\";\n const ref = targetRefOf(target);\n\n // This card already knows the EXACT bound app id, so resolving it never needs the whole\n // catalog: the host API's bounded `listAppsByIds` (`useEditorApp`). An empty id means\n // \"nothing selected yet\" and issues no request.\n const selectedAppSummary = useEditorApp(app);\n\n // `isTriggerApp`/`asFieldDefs` come from a LAZY `@w6w/ui/flow` import (the editor tree carries no\n // static flow import — `WorkflowEditor`'s `flowHelpers` idiom). The workflow arm's fields wait\n // for it exactly as they wait for the workflow detail query.\n const [flowHelpers, setFlowHelpers] = useState<WorkflowFieldCtx | null>(null);\n useEffect(() => {\n let canceled = false;\n import(\"@w6w/ui/flow\").then((m) => {\n if (canceled) return;\n setFlowHelpers({ isTriggerApp: m.isTriggerApp, asFieldDefs: m.asFieldDefs });\n });\n return () => {\n canceled = true;\n };\n }, []);\n const actionsQuery = useAppActionsQuery(app, app !== \"\");\n const connectionsQuery = useConnectionsForAppQuery(app, app !== \"\");\n // Only a settled, successful list can call a binding missing — loading/error keep the old text.\n const bindingMissing =\n findBindingProblems([{ id: \"target\", uses: actionTarget?.uses }], () =>\n connectionsQuery.isSuccess && !connectionsQuery.isFetching\n ? { state: \"ready\", ids: new Set((connectionsQuery.data ?? []).map((c) => c.id)) }\n : undefined,\n ).length > 0;\n const selectedAction = useMemo(\n () => (actionsQuery.data ?? []).find((a) => a.key === actionKey),\n [actionsQuery.data, actionKey],\n );\n\n /** Which callable tabs the picker offers — exactly this card's own\n * `allowedKinds`, so a call site that cannot accept a Workflow never sees\n * its tab. `endpoint` has no tab at all (F-2.0: \"no endpoints\"). */\n const callableFamilies = ([\"function\", \"workflow\"] as const).filter(allowsKind);\n\n /** The picker modal's heading, derived from this card's own so it always\n * names what the author is choosing — \"Choose implementation\" on the\n * Functions page, \"Choose target\" on Endpoints, \"Choose reroute target\"\n * from the rail. Never the old hard-coded \"Choose an action\", which stopped\n * being true the moment the Functions/Workflows tabs appeared here. */\n const pickerTitle = `Choose ${title.charAt(0).toLowerCase()}${title.slice(1)}`;\n\n const functionsQuery = useFunctionsQuery(allowsKind(\"function\"));\n const workflowsQuery = useWorkflowsQuery(undefined, allowsKind(\"workflow\"));\n const endpointsQuery = useEndpointsQuery(allowsKind(\"endpoint\"));\n const functionDetailQuery = useFunctionQuery(ref, kind === \"function\" && ref !== \"\");\n const workflowDetailQuery = useWorkflowQuery(ref, kind === \"workflow\" && ref !== \"\");\n const endpointDetailQuery = useEndpointQuery(ref, kind === \"endpoint\" && ref !== \"\");\n\n // A5: one normalized field list across four genuinely different sources.\n const fields = useMemo<TargetField[]>(() => {\n if (kind === \"action\") return paramsToFields(selectedAction?.params ?? []);\n if (kind === \"function\") return paramsToFields(functionDetailQuery.data?.inputs ?? []);\n if (kind === \"workflow\") {\n if (!flowHelpers) return [];\n return fieldsFromWorkflow(\n workflowDetailQuery.data?.workflow as WorkflowLike | undefined,\n flowHelpers,\n );\n }\n if (kind === \"endpoint\") {\n return paramsToFields(endpointDetailQuery.data?.endpoint.input ?? []);\n }\n return [];\n }, [\n kind,\n selectedAction,\n functionDetailQuery.data,\n workflowDetailQuery.data,\n endpointDetailQuery.data,\n flowHelpers,\n ]);\n\n useEffect(() => {\n onResolved?.({ meta: { kind, ref: kind === \"action\" ? app : ref }, kind: kind as K, fields });\n }, [kind, app, ref, fields, onResolved]);\n\n /**\n * The modal's `onAdd`. Handles BOTH shapes the picker can emit, because the\n * picker now offers all three of F-2.0's homepage tabs here\n * (`Connected apps | Functions | Workflows`), not just the app one:\n *\n * - an app action → `{ uses: {app, action, connection}, with }`\n * - a callable → `{ uses: {app: \"@w6w/call\", action: \"call\"},\n * with: {targetKind, targetId, …} }`\n *\n * Anything else `@w6w/*` is a graph-only internal node and is ignored — the\n * modal is opened `appsOnly`, so those tabs are not even rendered; the guard\n * stays as a belt-and-braces refusal.\n */\n function pickTarget(built: BuiltStep) {\n // The callable arm, FIRST: `@w6w/call` also matches the `@w6w/` prefix the\n // internal-node guard below rejects, so ordering is load-bearing.\n if (built.uses.app === CALL_APP) {\n const w = (built.with ?? {}) as { targetKind?: unknown; targetId?: unknown };\n const family = w.targetKind === \"workflow\" ? \"workflow\" : \"function\";\n const id = typeof w.targetId === \"string\" ? w.targetId : \"\";\n // A pick with no id cannot be emitted — it would blank a bound target.\n if (!id) return;\n emit(\n family === \"workflow\"\n ? { kind: \"workflow\", workflow: id }\n : { kind: \"function\", function: id },\n );\n setPickerOpen(false);\n return;\n }\n if (built.uses.app.startsWith(\"@w6w/\")) return; // apps only; ignore internal nodes\n // Pin 6: preserve compatible mappings. The modal returns `built.with` as\n // the NEWLY picked action's params (every key it declares, seeded blank).\n // Carry forward every existing `with` cell whose key the new action still\n // declares, and drop the cells it does not - never a wholesale overwrite.\n const existingWith = target.kind === \"action\" ? (target.with ?? {}) : {};\n const newWith = built.with ?? {};\n const preservedWith: Record<string, unknown> = {};\n for (const key of Object.keys(newWith)) {\n preservedWith[key] = key in existingWith ? existingWith[key] : newWith[key];\n }\n emit({ kind: \"action\", uses: built.uses, with: preservedWith });\n setPickerOpen(false);\n }\n\n function updateWith(paramKey: string, value: unknown) {\n if (target.kind !== \"action\") return;\n const nextWith = { ...(target.with ?? {}) };\n if (value === \"\" || value === undefined) delete nextWith[paramKey];\n else nextWith[paramKey] = value;\n emit({ ...target, with: nextWith });\n }\n\n function handleKindChange(next: TargetKind) {\n emit(\n next === \"action\"\n ? { kind: \"action\", uses: { app: \"\", action: \"\", connection: null } }\n : next === \"function\"\n ? { kind: \"function\", function: \"\" }\n : next === \"workflow\"\n ? { kind: \"workflow\", workflow: \"\" }\n : { kind: \"endpoint\", endpoint: \"\" },\n );\n }\n\n function handleRefChange(next: string) {\n emit(\n kind === \"function\"\n ? { kind: \"function\", function: next }\n : kind === \"workflow\"\n ? { kind: \"workflow\", workflow: next }\n : { kind: \"endpoint\", endpoint: next },\n );\n }\n\n /** Display name for the currently-bound callable, from whichever list owns\n * it. Falls back to the raw id in the JSX while the list is still loading. */\n const pickedCallableLabel = useMemo(() => {\n if (!ref) return undefined;\n if (kind === \"function\") {\n const fn = functionsQuery.data?.find((f) => f.id === ref);\n return fn ? fn.displayName || fn.key : undefined;\n }\n if (kind === \"workflow\") {\n const wf = workflowsQuery.data?.find((w) => w.id === ref);\n return wf ? wf.displayName || wf.name : undefined;\n }\n return undefined;\n }, [kind, ref, functionsQuery.data, workflowsQuery.data]);\n\n // Filter parameters based on showIf conditions and whether they have values\n const actionParams = useMemo(() => {\n const params = (selectedAction?.params ?? []) as ActionParam[];\n const currentWith = actionTarget?.with ?? {};\n\n return params.filter((p) => {\n // First, check showIf conditions - hide if condition not met\n if (p.showIf) {\n const { field, equals, in: inArray, notIn, truthy } = p.showIf;\n const fieldValue = currentWith[field];\n\n // Evaluate the showIf predicate\n if (equals !== undefined && fieldValue !== equals) return false;\n if (inArray !== undefined && !inArray.includes(fieldValue as string | number | boolean)) {\n return false;\n }\n if (notIn?.includes(fieldValue as string | number | boolean)) {\n return false;\n }\n if (truthy !== undefined && Boolean(fieldValue) !== truthy) return false;\n }\n\n // Then, show only: required fields OR fields that have been mapped\n const hasValue =\n p.key in currentWith && currentWith[p.key] !== \"\" && currentWith[p.key] !== undefined;\n return p.required || hasValue;\n });\n }, [selectedAction, actionTarget?.with]);\n\n return (\n <div className=\"card\">\n <h3>{title}</h3>\n <p className=\"muted small\">{description}</p>\n\n {allowedKinds.length > 1 && (\n <label className=\"field\">\n <span>Kind</span>\n <select value={kind} onChange={(e) => handleKindChange(e.target.value as TargetKind)}>\n {KIND_ORDER.filter(allowsKind).map((k) => (\n <option key={k} value={k}>\n {KIND_LABEL[k]}\n </option>\n ))}\n </select>\n </label>\n )}\n\n {kind === \"action\" && (\n <>\n {app && actionKey ? (\n <div className=\"row\" style={{ alignItems: \"center\", gap: 8 }}>\n <AppIcon\n src={selectedAppSummary?.iconSvg}\n srcDark={selectedAppSummary?.iconSvgDark}\n brandColor={selectedAppSummary?.brandColor}\n name={app}\n />\n <span className=\"list-main\">\n <strong>{selectedAction?.title ?? actionKey}</strong>{\" \"}\n <code className=\"muted\">{app}</code>\n <span className=\"muted small block\">\n {bindingMissing ? (\n <span className=\"error\" data-testid=\"binding-missing\">\n Missing connection — choose another\n </span>\n ) : actionTarget?.uses.connection ? (\n `via ${\n connectionsQuery.data?.find((c) => c.id === actionTarget.uses.connection)\n ?.displayName ?? actionTarget.uses.connection\n }`\n ) : (\n \"no connection\"\n )}\n </span>\n </span>\n <button type=\"button\" className=\"btn ghost\" onClick={() => setPickerOpen(true)}>\n Change\n </button>\n </div>\n ) : (\n <button type=\"button\" className=\"btn\" onClick={() => setPickerOpen(true)}>\n + Choose an action\n </button>\n )}\n\n {actionKey && (\n <div style={{ marginTop: 12 }}>\n <h4>Input mapping</h4>\n <p className=\"muted small\">\n Map each action param from the inputs above. Reference an input with{\" \"}\n <code>inputs.<key></code>; anything else is a literal.\n {passthroughHint &&\n \" Leave every cell blank to pass the inbound payload through as the action's params.\"}\n </p>\n {actionParams.length === 0 ? (\n <p className=\"muted small\">This action declares no params.</p>\n ) : (\n <ul className=\"list\">\n {actionParams.map((p) => (\n <li key={p.key} style={{ alignItems: \"center\", gap: 8 }}>\n <span className=\"list-main\">\n <code>{p.key}</code>\n {p.required && <span className=\"muted small\"> · required</span>}\n </span>\n <div style={{ flex: 1 }}>\n <ExpressionInput\n value={\n actionTarget?.with?.[p.key] as\n | string\n | ExprValue\n | SecretValue\n | undefined\n }\n onChange={(next) => updateWith(p.key, next)}\n placeholder={`inputs.${p.key}`}\n aria-label={`Mapping for ${p.key}`}\n />\n </div>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </>\n )}\n\n {/* Functions/Workflows go through the SAME modal the action arm uses —\n F-2.0's \"same flow as we do today for selecting action\", and the\n answer to its own `should we implement this everywhere … yes`. These\n two arms were bare `<select>`s, which is why the picker's Functions\n and Workflows tabs were unreachable from this card. */}\n {(kind === \"function\" || kind === \"workflow\") && (\n <div className=\"row\" style={{ alignItems: \"center\", gap: 8 }}>\n {ref ? (\n <>\n <span className=\"list-main\">\n <strong>{pickedCallableLabel ?? ref}</strong> <code className=\"muted\">{ref}</code>\n <span className=\"muted small block\">\n {kind === \"function\" ? \"Function (synchronous)\" : \"Workflow (asynchronous)\"}\n </span>\n </span>\n <button type=\"button\" className=\"btn ghost\" onClick={() => setPickerOpen(true)}>\n Change\n </button>\n </>\n ) : (\n <button type=\"button\" className=\"btn\" onClick={() => setPickerOpen(true)}>\n + Choose a {kind}\n </button>\n )}\n </div>\n )}\n\n {pickerOpen && (\n /* No provider here. The scope this modal needs is INHERITED from\n the page (which contributes its `inputs`) over the app shell\n (vars/secrets/documents) — the same scope the mapping rows below\n see, which is the entire point: reaching the expression editor\n through \"Change\" and reaching it through a row's `ƒx` toggle must\n offer the identical rail. Wrapping only this modal is what made\n them disagree.\n\n ONE modal for the whole card, not one per arm: it now offers every\n kind this card allows, so which arm is showing decides only which\n tab it OPENS on, never whether it renders. */\n <StepBuilderModal\n appsOnly\n callables={callableFamilies}\n excludeCallableIds={excludeCallableIds}\n initialTab={kind === \"function\" || kind === \"workflow\" ? `${kind}s` : \"connected\"}\n title={pickerTitle}\n onClose={() => setPickerOpen(false)}\n onAdd={pickTarget}\n initialApp={actionTarget && app ? selectedAppSummary : undefined}\n initialAction={actionTarget ? actionKey : undefined}\n initialConnection={actionTarget?.uses.connection ?? undefined}\n initialWith={actionTarget?.with}\n />\n )}\n\n {kind === \"endpoint\" && (\n <label className=\"field\">\n <span>Endpoint</span>\n <select value={ref} onChange={(e) => handleRefChange(e.target.value)}>\n <option value=\"\">— pick an endpoint —</option>\n {endpointsQuery.data?.map((ep) => (\n <option key={ep.id} value={ep.id}>\n {ep.displayName || ep.key} ({ep.id})\n </option>\n ))}\n </select>\n </label>\n )}\n </div>\n );\n}\n","import { ApiError } from \"@w6w/sdk\";\nimport { type ExpressionOptions, ExpressionOptionsProvider, IconButton } from \"@w6w/ui\";\nimport { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { HistoryButton } from \"../chrome/HistoryButton.tsx\";\nimport { JsonToggle, JsonToggleButton } from \"../chrome/JsonToggle.tsx\";\nimport { useWorkspace } from \"../chrome/workspace.tsx\";\nimport { useEndpointDraft } from \"../draft/index.ts\";\nimport type { FlushOutcome } from \"../draft/use-workflow-draft.ts\";\nimport { EndpointIdentityModal } from \"../forms/CreateEndpointModal.tsx\";\nimport { descriptorFor } from \"../lib/callable-descriptors.ts\";\nimport {\n type UrlForm,\n buildEndpointSaveBody,\n normalizeEndpoint,\n selectedUrlEntry,\n urlCardEntry,\n urlOptions,\n} from \"../lib/endpoint-editor.ts\";\nimport { uncoveredForEndpoint } from \"../lib/input-coverage.ts\";\nimport { mergeSeed, shouldSeed, uncoveredRequiredKeys } from \"../lib/input-seeding.ts\";\nimport { evaluateEdit } from \"../lib/rail-settings.ts\";\nimport type { TargetField } from \"../lib/target-fields.ts\";\nimport { useEditorProject } from \"../project-context.ts\";\nimport type { RailNavigation } from \"../rail/rail-env.tsx\";\nimport {\n type EndpointDef,\n type EndpointOwnTarget,\n type EndpointSecurity,\n useEndpointQuery,\n} from \"../repos/endpoints.ts\";\nimport { CallableEditorFrame } from \"./CallableEditorFrame.tsx\";\nimport { EditorShell } from \"./EditorShell.tsx\";\nimport { EndpointTestInvoke, SecurityCard, UrlCard } from \"./EndpointCards.tsx\";\nimport { InputListEditor } from \"./InputListEditor.tsx\";\nimport { TargetSelector, useBindingBanner } from \"./TargetSelector.tsx\";\nimport type { CallableEditorNavigation, EndpointEditorProps } from \"./types.ts\";\n\nconst NOOP = () => {};\n\nfunction messageOf(e: unknown): string {\n return e instanceof ApiError || e instanceof Error ? e.message : String(e);\n}\n\n/**\n * `<EndpointEditor endpointId>` — Studio's endpoint editor body (Identity, URL, Input, Target,\n * Security, Test invoke, History, JSON toggle) as a published component. The outermost element is\n * `.w6w-embed-root`; nothing goes through a portal.\n *\n * ## One cache, one draft\n *\n * Every field is the buffer of `useEndpointDraft` (seeded from, and refreshed by, the ONE\n * `[\"endpoint\", id]` query), and every write — the header Save, the bottom Save and the JSON\n * toggle's Save — is that draft's `commit`, so each issues one POST carrying the stored\n * `updatedAt` (`If-Unmodified-Since`). A 409 `endpoint_stale` is shown inline with a Reload and is\n * never retried. The invoke URLs are read from the same query's envelope, never copied into state,\n * so a rail save or an external change shows without a remount.\n *\n * A Save with nothing changed since the last read sends no request (the draft is clean).\n *\n * ## Rail\n *\n * `rail` omitted: the editor owns a rail. `rail={false}` inside a `<CallableWorkspace>` for the\n * SAME endpoint id publishes into it; with `rail={false}` the rail saves use the WORKSPACE's\n * `project`, not the `project` prop here. A workspace for a different id is silently overridden\n * while this editor is mounted.\n */\nexport function EndpointEditor(props: EndpointEditorProps): ReactNode {\n const { endpointId, onNavigate = NOOP, slots, tools } = props;\n const project = useEditorProject(props.project);\n const railNavigate = useCallback(\n (to: RailNavigation) => (onNavigate as (to: RailNavigation) => void)(to),\n [onNavigate],\n );\n return (\n <div\n className=\"w6w-embed-root\"\n style={{ display: \"flex\", width: \"100%\", height: \"100%\", minHeight: 0 }}\n >\n <EditorShell\n project={project}\n onNavigate={railNavigate}\n rail={props.rail}\n tools={tools}\n storageKey={project === null ? null : `w6w.rail.embed.${project}`}\n >\n <div style={{ flex: 1, minWidth: 0, overflow: \"auto\" }}>\n <EndpointBody\n key={endpointId}\n id={endpointId}\n onNavigate={onNavigate as (to: CallableEditorNavigation) => void}\n slots={slots}\n />\n </div>\n </EditorShell>\n </div>\n );\n}\n\nfunction EndpointBody(props: {\n id: string;\n onNavigate: (to: CallableEditorNavigation) => void;\n slots: EndpointEditorProps[\"slots\"];\n}) {\n const { id, onNavigate, slots } = props;\n const descriptor = descriptorFor(\"endpoint\");\n\n // The envelope the invoke URLs come from — the draft reads the same entry (one GET).\n const envelope = useEndpointQuery(id).data;\n\n const [resolvedFields, setResolvedFields] = useState<TargetField[]>([]);\n const resolvedRef = useRef(resolvedFields);\n resolvedRef.current = resolvedFields;\n const pendingPickRef = useRef(false);\n const touchedRef = useRef(false);\n const [urlForm, setUrlForm] = useState<UrlForm>(\"id\");\n const [urlDomain, setUrlDomain] = useState<string | null>(null);\n const [showIdentity, setShowIdentity] = useState(false);\n const [saved, setSaved] = useState(false);\n const [showJson, setShowJson] = useState(false);\n const [json, setJson] = useState(\"\");\n const [jsonStored, setJsonStored] = useState({ id, key: \"\" });\n const [jsonError, setJsonError] = useState<string | null>(null);\n\n // The save gate also guards every non-button save path (hide, unmount, registry flush).\n const saveGuard = useCallback((def: Record<string, unknown>) => {\n const e = normalizeEndpoint(def as unknown as EndpointDef);\n const unfed = uncoveredForEndpoint({\n target: e.target,\n rows: e.input ?? [],\n fields: resolvedRef.current,\n });\n return unfed.length > 0 ? `The target needs: ${unfed.join(\", \")}` : null;\n }, []);\n const draft = useEndpointDraft({ id, saveGuard });\n\n const view = useMemo(\n () => (draft.definition ? normalizeEndpoint(draft.definition as unknown as EndpointDef) : null),\n [draft.definition],\n );\n const inputs = view?.input ?? [];\n const bindingBanner = useBindingBanner({\n kind: \"endpoint\",\n id,\n uses: view?.target.kind === \"action\" ? view.target.uses : undefined,\n dirty: draft.dirty,\n });\n const security: EndpointSecurity = view?.exposure?.security ?? {\n auth: \"platform\",\n };\n\n const options = urlOptions(envelope?.invokeUrls);\n const selected = selectedUrlEntry(envelope?.invokeUrls, urlDomain);\n\n useWorkspace({\n kind: \"endpoint\",\n id,\n label: view?.displayName || undefined,\n key: view?.key.trim() || undefined,\n invokeUrl: selected ? selected.url : envelope?.invokeUrl,\n invokeUrlByKey: selected ? selected.urlByKey : envelope?.invokeUrlByKey,\n urlForm,\n inputs: resolvedFields.map((f) => f.key),\n policy: draft.policy,\n onPolicyChange: draft.onPolicyChange,\n });\n\n const { setDefinition } = draft;\n const patch = useCallback(\n (next: Partial<EndpointDef>) => {\n setSaved(false);\n setDefinition((d) => ({\n ...normalizeEndpoint(d as unknown as EndpointDef),\n ...next,\n }));\n },\n [setDefinition],\n );\n const patchSecurity = (next: Partial<EndpointSecurity>) => {\n setSaved(false);\n setDefinition((d) => {\n const e = normalizeEndpoint(d as unknown as EndpointDef);\n const merged = {\n ...(e.exposure?.security ?? { auth: \"platform\" }),\n ...next,\n };\n return { ...e, exposure: { ...e.exposure, security: merged } };\n });\n };\n\n function onTargetChange(next: EndpointOwnTarget) {\n pendingPickRef.current = true;\n patch({ target: next });\n }\n\n // Seeds the Input list from a freshly picked target — never on hydration (`pendingPickRef` is set\n // only by a genuine in-session pick), never over a touched or non-empty list.\n // biome-ignore lint/correctness/useExhaustiveDependencies: keyed on resolvedFields only — inputs/patch are read for their current value, not to retrigger the seed on every edit.\n useEffect(() => {\n if (!pendingPickRef.current) return;\n if (!shouldSeed({ rows: inputs, touched: touchedRef.current })) {\n pendingPickRef.current = false;\n return;\n }\n if (resolvedFields.length === 0) return;\n patch({ input: mergeSeed(inputs, resolvedFields) });\n pendingPickRef.current = false;\n }, [resolvedFields]);\n\n const pageExprScope = useMemo<ExpressionOptions>(\n () => ({ inputs: inputs.map((inp) => inp.key).filter(Boolean) }),\n [inputs],\n );\n const uncoveredKeys = useMemo(\n () => uncoveredRequiredKeys(inputs, resolvedFields),\n [inputs, resolvedFields],\n );\n const unfedKeys = useMemo(\n () =>\n view\n ? uncoveredForEndpoint({\n target: view.target,\n rows: inputs,\n fields: resolvedFields,\n })\n : [],\n [view, inputs, resolvedFields],\n );\n\n // Rendered beside BOTH Save buttons: a greyed button with its explanation off-screen is the\n // mysterious kind.\n const saveBlockedNote =\n view && unfedKeys.length > 0 ? (\n <p className=\"error small\" data-testid=\"save-blocked\">\n Can’t save yet — the target needs{\" \"}\n {view.target.kind === \"action\"\n ? \"these required params mapped under Input mapping\"\n : \"these required keys declared under Input\"}\n : <strong>{unfedKeys.join(\", \")}</strong>\n </p>\n ) : null;\n\n const key = view?.key.trim() ?? \"\";\n const canSave = Boolean(key) && unfedKeys.length === 0 && draft.canSave;\n\n async function onSave() {\n if (!view) return;\n const out = await draft.commit(buildEndpointSaveBody(view) as Record<string, unknown>);\n // A clean buffer writes nothing but still confirms, as FunctionEditor does (D-B5-1).\n setSaved(out.status === \"saved\" || out.status === \"clean\");\n }\n\n // Save-then-invoke (D3); the same pinned name/signature as FunctionEditor's, for T1.1.2's Publish.\n async function saveFirst(): Promise<FlushOutcome> {\n if (!view || !draft.dirty) return { status: \"clean\" };\n if (!canSave) {\n return {\n status: \"blocked\",\n reason: \"Fix the highlighted problems, then save, to test this Endpoint.\",\n };\n }\n return draft.commit(buildEndpointSaveBody(view) as Record<string, unknown>);\n }\n\n function openJson() {\n if (!view) return;\n const body = buildEndpointSaveBody(view);\n setJson(JSON.stringify(body, null, 2));\n setJsonStored({ id: String(body.id), key: String(body.key) });\n setJsonError(null);\n setShowJson(true);\n }\n\n async function onJsonSave() {\n const evalResult = evaluateEdit(json, jsonStored);\n const parsed = evalResult.parsed;\n if (!parsed || evalResult.blockedReason) return;\n const out = await draft.commit(parsed as Record<string, unknown>);\n if (out.status === \"saved\" || out.status === \"clean\") {\n setJsonError(null);\n setShowJson(false);\n // A clean buffer writes nothing but still confirms, as FunctionEditor does (D-B5-1).\n setSaved(out.status === \"saved\" || out.status === \"clean\");\n } else if (out.status === \"failed\") setJsonError(messageOf(out.error));\n else setJsonError(out.reason);\n }\n\n const loadErr = draft.loadError;\n const notFound = loadErr instanceof ApiError && loadErr.status === 404;\n if (!view) {\n if (loadErr !== null && !notFound) {\n return (\n <div className=\"error\" role=\"alert\">\n {messageOf(loadErr)}\n </div>\n );\n }\n if (!notFound) return <p className=\"muted\">Loading…</p>;\n }\n\n const title = view\n ? view.displayName || view.key || descriptor.editor.newTitle\n : descriptor.editor.newTitle;\n const stateError = draft.error !== null && !draft.stale ? messageOf(draft.error) : null;\n const staleBanner =\n draft.stale || draft.changedElsewhere ? (\n <div className=\"error\" role=\"alert\" data-testid=\"endpoint-stale\">\n {draft.stale\n ? messageOf(draft.error)\n : \"This endpoint was changed elsewhere. Reload to see the new version (your edits will be discarded).\"}{\" \"}\n <button type=\"button\" className=\"btn ghost\" onClick={() => void draft.reload()}>\n Reload\n </button>\n </div>\n ) : null;\n\n return (\n <ExpressionOptionsProvider value={pageExprScope}>\n <CallableEditorFrame\n kind=\"endpoint\"\n title={title}\n incomplete={false}\n canSave={canSave}\n isSaving={draft.saving}\n onSave={() => void onSave()}\n error={notFound ? messageOf(loadErr) : stateError}\n notFound={notFound}\n onNavigate={onNavigate}\n slots={slots}\n publish={{ id, saveFirst, disabled: !canSave }}\n headerActions={\n <>\n <HistoryButton kind=\"endpoint\" id={id} />\n <JsonToggleButton onClick={openJson} />\n </>\n }\n banners={\n <>\n {bindingBanner}\n {staleBanner}\n {saveBlockedNote}\n {saved && <span className=\"ok\">Saved.</span>}\n </>\n }\n >\n {view && (\n <>\n <div className=\"card\">\n <div className=\"section-head\">\n <h3>Identity</h3>\n <IconButton\n icon=\"edit-2\"\n label=\"Edit name, key, and description\"\n onClick={() => setShowIdentity(true)}\n />\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Display name</span>\n <span>{view.displayName || \"—\"}</span>\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Key</span>\n <code className=\"muted\">{view.key || \"—\"}</code>\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Description</span>\n <span>{view.description || \"—\"}</span>\n </div>\n </div>\n\n <UrlCard\n entry={urlCardEntry(selected, envelope?.invokeUrl, envelope?.invokeUrlByKey)}\n domainOptions={options}\n urlDomain={selected?.domain ?? null}\n onUrlDomain={setUrlDomain}\n urlForm={urlForm}\n onUrlForm={setUrlForm}\n />\n\n <InputListEditor\n title=\"Input\"\n description=\"The declared inbound contract. Reuses core Param fields. Leave empty to pass the raw request payload through to the target unchanged.\"\n emptyMeansPassthrough={true}\n rows={inputs}\n onChange={(next) => {\n touchedRef.current = true;\n patch({ input: next });\n }}\n uncoveredKeys={uncoveredKeys}\n />\n\n <TargetSelector\n allowedKinds={[\"action\", \"function\", \"workflow\"] as const}\n title=\"Target\"\n description={\n <>\n The single thing this Endpoint dispatches to. An <strong>Action</strong> target\n runs one app action directly and a <strong>Function</strong> target resolves\n synchronously to a value; a <strong>Workflow</strong> target enqueues an\n asynchronous run. Switching the target here preserves the key and the input\n contract below, so callers never break.\n </>\n }\n passthroughHint\n value={view.target}\n onChange={onTargetChange}\n onResolved={(t) => setResolvedFields(t.fields)}\n />\n\n <SecurityCard security={security} onPatch={patchSecurity} />\n\n <EndpointTestInvoke id={id} inputs={inputs} saveFirst={saveFirst} />\n\n <div\n className=\"row\"\n style={{\n justifyContent: \"flex-end\",\n alignItems: \"center\",\n gap: \"var(--w6w-sp-3)\",\n }}\n >\n {saveBlockedNote}\n {saved && <span className=\"ok\">Saved.</span>}\n <button\n type=\"button\"\n className=\"btn\"\n disabled={!canSave}\n onClick={() => void onSave()}\n >\n {draft.saving ? \"Saving…\" : \"Save\"}\n </button>\n </div>\n\n {showIdentity && (\n <EndpointIdentityModal\n initial={{\n key: view.key,\n displayName: view.displayName ?? \"\",\n description: view.description ?? \"\",\n }}\n onClose={() => setShowIdentity(false)}\n onSaved={(next) => {\n patch({\n displayName: next.displayName,\n description: next.description,\n });\n setShowIdentity(false);\n }}\n />\n )}\n\n <JsonToggle\n open={showJson}\n onClose={() => setShowJson(false)}\n title={`JSON — ${title}`}\n mode=\"disconnected\"\n value={json}\n onChange={setJson}\n guard={(t) => evaluateEdit(t, jsonStored).blockedReason}\n onSave={() => void onJsonSave()}\n saving={draft.saving}\n error={jsonError}\n editorLabel=\"Endpoint definition JSON\"\n />\n </>\n )}\n </CallableEditorFrame>\n </ExpressionOptionsProvider>\n );\n}\n","import { useQueryClient } from \"@tanstack/react-query\";\nimport { ApiError } from \"@w6w/sdk\";\nimport { type ExpressionOptions, ExpressionOptionsProvider, IconButton } from \"@w6w/ui\";\nimport { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { HistoryButton } from \"../chrome/HistoryButton.tsx\";\nimport { JsonToggle, JsonToggleButton } from \"../chrome/JsonToggle.tsx\";\nimport { useWorkspace } from \"../chrome/workspace.tsx\";\nimport { type CallableDraft, useFunctionDraft } from \"../draft/index.ts\";\nimport type { FlushOutcome } from \"../draft/use-workflow-draft.ts\";\nimport { FunctionIdentityModal } from \"../forms/CreateFunctionModal.tsx\";\nimport { coerceInput } from \"../lib/coerce-input.ts\";\nimport { historyKeys } from \"../lib/history-query.ts\";\nimport { uncoveredForFunction } from \"../lib/input-coverage.ts\";\nimport {\n inputsForSave,\n mergeSeed,\n shouldSeed,\n uncoveredRequiredKeys,\n} from \"../lib/input-seeding.ts\";\nimport { invokeErrorCopy } from \"../lib/invoke-error.ts\";\nimport { type EditStored, evaluateEdit } from \"../lib/rail-settings.ts\";\nimport { slugify } from \"../lib/slug.ts\";\nimport {\n type TargetField,\n implAfterRebind,\n implToTarget,\n type targetToImpl,\n} from \"../lib/target-fields.ts\";\nimport { useEditorProject } from \"../project-context.ts\";\nimport {\n type FunctionDef,\n type FunctionInput,\n type FunctionInvokeResult,\n useFunctionQuery,\n useInvokeFunctionMutation,\n} from \"../repos/functions.ts\";\nimport { CallableEditorFrame } from \"./CallableEditorFrame.tsx\";\nimport { EditorShell } from \"./EditorShell.tsx\";\nimport { InputListEditor } from \"./InputListEditor.tsx\";\nimport { TargetSelector, useBindingBanner } from \"./TargetSelector.tsx\";\nimport type { CallableEditorNavigation, FunctionEditorProps } from \"./types.ts\";\n\nconst NOOP = (): void => {};\n\nconst errMsg = (e: unknown): string => (e instanceof Error ? e.message : String(e));\n\n/**\n * The managed Function editor: Interface, Inputs, Implementation, Test invoke, History and a JSON\n * toggle, on `EditorShell`. The outermost element is `.w6w-embed-root`; nothing goes through a\n * portal.\n *\n * Every read and write goes through `useFunctionDraft` (one cache entry, `[\"function\", id]`; one\n * stale-write token). Save, the JSON toggle's Save and the rail's Error handling (`onPolicyChange`)\n * all persist through the draft, so each carries `If-Unmodified-Since`; a 409 shows inline with a\n * reload control and is never retried. `project` is not a save precondition (a Function is\n * account-scoped): it scopes the expression rail and the rail's storage key only.\n *\n * `rail` defaults to `true`: the editor renders its own right rail. `rail={false}` renders none and\n * publishes the Function (key, inputs, policy, `onPolicyChange`) into an enclosing\n * `<CallableWorkspace kind=\"function\" id>` for the SAME id; an editor whose id differs from its\n * workspace's overrides it and the host's rail renders empty. With `rail={false}` inside a\n * workspace, the rail's saves use that workspace's `project`, not this editor's `project` prop.\n * Aliases are not part of this editor; a host adds its own through `tools`.\n */\nexport function FunctionEditor(props: FunctionEditorProps): ReactNode {\n const { functionId, onNavigate = NOOP, slots, tools } = props;\n const project = useEditorProject(props.project);\n return (\n <div\n className=\"w6w-embed-root\"\n style={{ display: \"flex\", width: \"100%\", height: \"100%\", minHeight: 0 }}\n >\n <EditorShell\n project={project}\n onNavigate={onNavigate}\n rail={props.rail}\n tools={tools}\n storageKey={project === null ? null : `w6w.rail.embed.${project}`}\n >\n <FunctionDraftHost functionId={functionId} onNavigate={onNavigate} slots={slots} />\n </EditorShell>\n </div>\n );\n}\n\n/** Holds the draft ABOVE the per-id session, so a switch of `functionId` re-targets one hook (the\n * draft resets its own stale/error/changed-elsewhere/saving) while local UI state remounts. */\nfunction FunctionDraftHost(props: {\n functionId: string;\n onNavigate: (to: CallableEditorNavigation) => void;\n slots: FunctionEditorProps[\"slots\"];\n}): ReactNode {\n const draft = useFunctionDraft({ id: props.functionId });\n return <FunctionSession key={props.functionId} {...props} draft={draft} />;\n}\n\nfunction FunctionSession(props: {\n functionId: string;\n draft: CallableDraft;\n onNavigate: (to: CallableEditorNavigation) => void;\n slots: FunctionEditorProps[\"slots\"];\n}): ReactNode {\n const { functionId: id, draft, onNavigate, slots } = props;\n const def = draft.definition as FunctionDef | null;\n const inputs: FunctionDef[\"inputs\"] = def?.inputs ?? [];\n\n // `valid` is server-computed (never re-derived here); it rides the SAME cache entry the draft\n // reads, so this adds no request.\n const fnQuery = useFunctionQuery(id);\n const valid = (fnQuery.data as { valid?: boolean } | undefined)?.valid === true;\n\n const loadError = draft.loadError;\n const implTarget = def ? implToTarget(def.impl) : undefined;\n const bindingBanner = useBindingBanner({\n kind: \"function\",\n id,\n uses: implTarget?.kind === \"action\" ? implTarget.uses : undefined,\n dirty: draft.dirty,\n });\n const notFound = loadError instanceof ApiError && loadError.status === 404;\n\n const [showIdentity, setShowIdentity] = useState(false);\n const [notice, setNotice] = useState<string | null>(null);\n const [saved, setSaved] = useState(false);\n const [reloading, setReloading] = useState(false);\n\n const key = (def?.key ?? \"\").trim() || slugify(def?.displayName ?? \"\");\n\n // The resource this editor publishes into the rail (Studio's `workspace` memo, minus `alias`).\n useWorkspace({\n kind: \"function\",\n id,\n label: def?.displayName || undefined,\n key: key || undefined,\n inputs: inputs\n .filter((i) => Boolean(i.key))\n .map((i) => ({ key: i.key, required: i.required === true })),\n policy: draft.policy,\n onPolicyChange: draft.onPolicyChange,\n });\n\n const patch = (next: Partial<FunctionDef>) =>\n draft.setDefinition((d) => ({ ...d, ...next }) as Record<string, unknown>);\n\n // A pick's resolved fields seed an EMPTY, untouched Inputs list once (see `input-seeding.ts`).\n const [resolvedFields, setResolvedFields] = useState<TargetField[]>([]);\n const pendingPickRef = useRef(false);\n const touchedRef = useRef(false);\n // biome-ignore lint/correctness/useExhaustiveDependencies: keyed on resolvedFields only — inputs/patch are read for their current value, not to retrigger the seed on every edit.\n useEffect(() => {\n if (!pendingPickRef.current) return;\n if (!shouldSeed({ rows: inputs, touched: touchedRef.current })) {\n pendingPickRef.current = false;\n return;\n }\n if (resolvedFields.length === 0) return;\n patch({ inputs: mergeSeed(inputs, resolvedFields) });\n pendingPickRef.current = false;\n }, [resolvedFields]);\n\n const uncoveredKeys = useMemo(\n () => uncoveredRequiredKeys(inputs, resolvedFields),\n [inputs, resolvedFields],\n );\n const pageExprScope = useMemo<ExpressionOptions>(\n () => ({ inputs: inputs.map((inp) => inp.key).filter(Boolean) }),\n [inputs],\n );\n\n function onImplChange(next: Parameters<typeof targetToImpl>[0]) {\n pendingPickRef.current = true;\n patch({ impl: implAfterRebind(def?.impl, next) });\n }\n\n // A Function has no pass-through mode: every required param of the bound action must be mapped.\n // With no action chosen the field list is empty and the rule is vacuous (a deliberately\n // incomplete Function stays saveable; `incomplete` is its signal).\n const unfedKeys = useMemo(\n () => uncoveredForFunction({ impl: def?.impl, fields: resolvedFields }),\n [def?.impl, resolvedFields],\n );\n const canSave = Boolean(key) && unfedKeys.length === 0 && draft.canSave;\n\n // The exact body a Save sends — the ONE builder, so the JSON toggle's seed cannot drift from it.\n function buildSaveBody(): Record<string, unknown> {\n return {\n ...(def as FunctionDef),\n key,\n inputs: inputsForSave(inputs, { emptyMeansPassthrough: false }),\n };\n }\n\n async function onSave() {\n setNotice(null);\n setSaved(false);\n const out = await draft.commit(buildSaveBody());\n if (out.status === \"saved\" || out.status === \"clean\") setSaved(true);\n else if (out.status === \"blocked\") setNotice(out.reason);\n }\n\n // Save-then-invoke (D3). The ONE save path Test invoke and T1.1.2's Publish share: a clean\n // buffer sends nothing; a dirty one commits through `buildSaveBody` (never the raw `flush()`,\n // which would send the un-slugged key).\n async function saveFirst(): Promise<FlushOutcome> {\n if (!draft.dirty) return { status: \"clean\" };\n if (!canSave) {\n return {\n status: \"blocked\",\n reason: \"Fix the highlighted problems, then save, to test this Function.\",\n };\n }\n return draft.commit(buildSaveBody());\n }\n\n const [showJson, setShowJson] = useState(false);\n const [json, setJson] = useState(\"\");\n const [jsonStored, setJsonStored] = useState<EditStored>({ id, key: \"\" });\n const [jsonError, setJsonError] = useState<string | null>(null);\n\n function openJson() {\n const body = buildSaveBody();\n setJson(JSON.stringify(body, null, 2));\n setJsonStored({ id: String(body.id), key: String(body.key) });\n setJsonError(null);\n setShowJson(true);\n }\n\n async function onJsonSave() {\n const evaluated = evaluateEdit(json, jsonStored);\n if (!evaluated.parsed || evaluated.blockedReason) return;\n setSaved(false);\n const out = await draft.commit(evaluated.parsed as Record<string, unknown>);\n if (out.status === \"saved\" || out.status === \"clean\") {\n setJsonError(null);\n setShowJson(false);\n setSaved(true);\n } else if (out.status === \"blocked\") setJsonError(out.reason);\n else if (out.status === \"failed\") setJsonError(errMsg(out.error));\n }\n\n const reload = useCallback(async () => {\n setReloading(true);\n try {\n await draft.reload();\n setNotice(null);\n setSaved(false);\n } finally {\n setReloading(false);\n }\n }, [draft.reload]);\n\n const failure = draft.stale ? null : (draft.error ?? loadError);\n const bannerError = notice ?? (failure === null ? null : errMsg(failure));\n\n const title = def?.displayName || def?.key || \"New function\";\n\n if (draft.loading || (def === null && loadError === null)) {\n return <p className=\"muted\">Loading…</p>;\n }\n\n return (\n <div style={{ flex: 1, minWidth: 0, overflow: \"auto\" }}>\n <ExpressionOptionsProvider value={pageExprScope}>\n <CallableEditorFrame\n kind=\"function\"\n title={title}\n incomplete={def !== null && !valid}\n canSave={canSave}\n isSaving={draft.saving}\n onSave={() => void onSave()}\n error={bannerError}\n notFound={notFound}\n onNavigate={onNavigate}\n slots={slots}\n publish={{ id, saveFirst, disabled: !canSave || !valid }}\n headerActions={\n def && (\n <>\n <HistoryButton kind=\"function\" id={id} />\n <JsonToggleButton onClick={openJson} />\n </>\n )\n }\n banners={\n <>\n {bindingBanner}\n {draft.stale && (\n <div className=\"error\" role=\"alert\" data-testid=\"save-stale\">\n <p>\n This function changed on the server after you opened it. Your save was refused,\n so their work is intact.\n </p>\n <button type=\"button\" className=\"btn\" disabled={reloading} onClick={reload}>\n {reloading ? \"Reloading…\" : \"Reload from server\"}\n </button>\n </div>\n )}\n {draft.changedElsewhere && !draft.stale && (\n <div className=\"muted small\" data-testid=\"changed-elsewhere\">\n <p>\n This function was changed elsewhere. Reloading replaces your unsaved edits with\n the saved copy.\n </p>\n <button type=\"button\" className=\"btn ghost\" disabled={reloading} onClick={reload}>\n {reloading ? \"Reloading…\" : \"Reload from server\"}\n </button>\n </div>\n )}\n {unfedKeys.length > 0 && (\n <p className=\"error small\" data-testid=\"save-blocked\">\n Can’t save yet — map {unfedKeys.length > 1 ? \"these\" : \"this\"} required action{\" \"}\n {unfedKeys.length > 1 ? \"params\" : \"param\"} under Input mapping above:{\" \"}\n <strong>{unfedKeys.join(\", \")}</strong>\n </p>\n )}\n {saved && <span className=\"ok\">Saved.</span>}\n </>\n }\n >\n {def && (\n <>\n <div className=\"card\">\n <div className=\"section-head\">\n <h3>Interface</h3>\n <IconButton\n icon=\"edit-2\"\n label=\"Edit name, key, and description\"\n onClick={() => setShowIdentity(true)}\n />\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Display name</span>\n <span>{def.displayName || \"—\"}</span>\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Key</span>\n <code className=\"muted\">{def.key || \"—\"}</code>\n </div>\n <div className=\"field\">\n <span className=\"muted small\">Description</span>\n <span>{def.description || \"—\"}</span>\n </div>\n </div>\n\n <InputListEditor\n title=\"Inputs\"\n description=\"The canonical, vendor-stable interface a caller binds to. Reuses core Param fields.\"\n emptyMeansPassthrough={false}\n rows={inputs}\n onChange={(next) => {\n touchedRef.current = true;\n patch({ inputs: next });\n }}\n uncoveredKeys={uncoveredKeys}\n />\n\n <TargetSelector\n allowedKinds={[\"action\", \"function\", \"workflow\"] as const}\n excludeCallableIds={[id]}\n title=\"Implementation\"\n description={\n <>\n Bind the interface to one concrete app action, another Function, or a Workflow.\n Switching the provider here (a \"re-bind\") rewrites only <code>impl</code>'s\n target fields - the interface above, and every caller, is untouched.\n </>\n }\n value={implToTarget(def.impl)}\n onChange={onImplChange}\n onResolved={(t) => setResolvedFields(t.fields)}\n />\n\n <TestInvoke\n id={id}\n inputs={inputs}\n disabled={!valid}\n invalid={!valid}\n saveFirst={saveFirst}\n />\n\n {showIdentity && (\n <FunctionIdentityModal\n initial={{\n key: def.key,\n displayName: def.displayName ?? \"\",\n description: def.description ?? \"\",\n }}\n onClose={() => setShowIdentity(false)}\n onSaved={(next) => {\n patch({ displayName: next.displayName, description: next.description });\n setShowIdentity(false);\n }}\n />\n )}\n\n <JsonToggle\n open={showJson}\n onClose={() => setShowJson(false)}\n title={`JSON — ${title}`}\n mode=\"disconnected\"\n value={json}\n onChange={setJson}\n guard={(t) => evaluateEdit(t, jsonStored).blockedReason}\n onSave={() => void onJsonSave()}\n saving={draft.saving}\n error={jsonError}\n editorLabel=\"Function definition JSON\"\n />\n </>\n )}\n </CallableEditorFrame>\n </ExpressionOptionsProvider>\n </div>\n );\n}\n\n/** Test-invoke panel: one field per canonical input, run through `invokeFunction`. The server\n * invokes the STORED draft (no publish needed), so unsaved edits are saved first via `saveFirst`. */\nfunction TestInvoke(props: {\n id: string;\n inputs: FunctionInput[];\n disabled: boolean;\n invalid: boolean;\n saveFirst: () => Promise<FlushOutcome>;\n}): ReactNode {\n const { id, inputs } = props;\n const [values, setValues] = useState<Record<string, string>>({});\n const [result, setResult] = useState<FunctionInvokeResult | undefined>(undefined);\n const [error, setError] = useState<string | null>(null);\n // True from the click until saveFirst + invoke settle, so a second click cannot start a second save.\n const [busy, setBusy] = useState(false);\n const qc = useQueryClient();\n const invoke = useInvokeFunctionMutation();\n\n async function run() {\n const payload: Record<string, unknown> = {};\n for (const inp of inputs) {\n const coerced = coerceInput(inp.type, values[inp.key] ?? \"\");\n if (coerced !== undefined) payload[inp.key] = coerced;\n }\n setBusy(true);\n try {\n const saved = await props.saveFirst();\n if (saved.status === \"blocked\") {\n setResult(undefined);\n setError(saved.reason);\n return;\n }\n if (saved.status === \"failed\") {\n setResult(undefined);\n setError(invokeErrorCopy(saved.error));\n return;\n }\n const out = await invoke.mutateAsync({ id, inputs: payload });\n setError(null);\n setResult(out);\n } catch (e) {\n setResult(undefined);\n setError(invokeErrorCopy(e));\n } finally {\n setBusy(false);\n void qc.invalidateQueries({ queryKey: historyKeys.root });\n }\n }\n\n return (\n <div className=\"card\">\n <h3>Test invoke</h3>\n <p className=\"muted small\">\n Runs the saved draft through its bound action — no need to publish first. Unsaved edits are\n saved first.\n </p>\n {props.invalid && (\n <p className=\"muted small\">\n Pick an app and action to test this function — it has no implementation bound yet.\n </p>\n )}\n {inputs.length === 0 && (\n <p className=\"muted small\">Add inputs above to supply test values.</p>\n )}\n {inputs.map((inp) => {\n const fieldId = `fn-invoke-${inp.key || inp.label}`;\n return (\n <div className=\"field\" key={inp.key || inp.label}>\n <label htmlFor={fieldId}>\n {inp.label || inp.key}\n {inp.required && \" *\"}\n </label>\n {inp.type === \"boolean\" ? (\n <select\n id={fieldId}\n value={values[inp.key] ?? \"\"}\n onChange={(e) => setValues((v) => ({ ...v, [inp.key]: e.target.value }))}\n >\n <option value=\"\">—</option>\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : (\n <input\n id={fieldId}\n type={inp.type === \"number\" ? \"number\" : \"text\"}\n value={values[inp.key] ?? \"\"}\n placeholder={inp.type === \"json\" ? \"{ }\" : (inp.hint ?? \"\")}\n onChange={(e) => setValues((v) => ({ ...v, [inp.key]: e.target.value }))}\n />\n )}\n </div>\n );\n })}\n <div className=\"row\">\n <button\n type=\"button\"\n className=\"btn\"\n disabled={props.disabled || busy || invoke.isPending}\n onClick={() => void run()}\n >\n {busy || invoke.isPending ? \"Invoking…\" : \"Invoke\"}\n </button>\n </div>\n {error && <div className=\"result error\">{error}</div>}\n {result !== undefined && (\n <>\n {result.invocationId && (\n <p className=\"muted small\">\n {result.status ?? \"done\"}\n {result.durationMs !== undefined ? ` · ${result.durationMs} ms` : \"\"}\n {\" · \"}\n <code>{result.invocationId}</code>\n </p>\n )}\n <pre className=\"result\" style={{ overflow: \"auto\" }}>\n {JSON.stringify(result.output, null, 2)}\n </pre>\n </>\n )}\n </div>\n );\n}\n"],"names":["codeLanguageForDocFormat","format","DocumentEditor","documentId","project","onDeleted","onBack","slots","p","useEditorProject","docQuery","useDocumentQuery","deleteMut","useDeleteDocumentMutation","editing","setEditing","useState","deletePending","setDeletePending","jsx","doc","empty","jsxs","Fragment","header","actions","CallFromCodeButton","EditButton","DeleteButton","Copyable","CodeBlock","DocumentFormModal","ConfirmModal","BLANK_TARGET","normalizeEndpoint","e","buildEndpointSaveBody","draft","target","input","rest","body","targetIsBound","inputs","inputsForSave","urlOptions","invokeUrls","selectedUrlEntry","pickedDomain","options","u","urlCardEntry","selected","invokeUrl","invokeUrlByKey","messageOf","PublishControl","props","kind","id","onError","versions","useVersionsQuery","publishMut","usePublishMutation","busy","setBusy","published","_a","testId","onClick","saved","CallableEditorFrame","descriptor","descriptorFor","publishError","setPublishError","backLabel","goBack","ExecutionProfileHeader","COPY","invokeErrorCopy","ApiError","AUTH_MODES","UrlCard","entry","domainOptions","urlDomain","onUrlDomain","urlForm","onUrlForm","hasByKey","shown","form","label","title","SecurityCard","security","onPatch","mode","m","SecretField","v","stored","SECRET_MASK","EndpointTestInvoke","values","setValues","output","setOutput","error","setError","qc","useQueryClient","invokeMut","useInvokeEndpointMutation","invoke","payload","inp","coerced","coerceInput","out","historyKeys","fieldId","InputListEditor","rows","onChange","description","emptyMeansPassthrough","uncoveredKeys","addInput","updateInput","i","next","idx","removeInput","_","INPUT_TYPES","t","IconButton","KIND_ORDER","KIND_LABEL","useBindingBanner","args","uses","dirty","app","connection","connections","useConnectionsForAppQuery","enabled","setEnabled","useSetEnabledMutation","settled","ids","useMemo","c","problemCount","findBindingProblems","hadRef","useRef","seenRef","useEffect","pair","prev","connectionsForAppKey","state","disabledBannerState","BindingBanner","TargetSelector","allowedKinds","excludeCallableIds","value","onResolved","passthroughHint","pickerOpen","setPickerOpen","allowsKind","k","emit","actionTarget","actionKey","ref","targetRefOf","selectedAppSummary","useEditorApp","flowHelpers","setFlowHelpers","canceled","actionsQuery","useAppActionsQuery","connectionsQuery","bindingMissing","selectedAction","a","callableFamilies","pickerTitle","functionsQuery","useFunctionsQuery","workflowsQuery","useWorkflowsQuery","endpointsQuery","useEndpointsQuery","functionDetailQuery","useFunctionQuery","workflowDetailQuery","useWorkflowQuery","endpointDetailQuery","useEndpointQuery","fields","paramsToFields","fieldsFromWorkflow","_b","_c","pickTarget","built","CALL_APP","w","family","existingWith","newWith","preservedWith","key","updateWith","paramKey","nextWith","handleKindChange","handleRefChange","pickedCallableLabel","fn","f","wf","actionParams","params","currentWith","field","equals","inArray","notIn","truthy","fieldValue","hasValue","AppIcon","ExpressionInput","StepBuilderModal","ep","NOOP","EndpointEditor","endpointId","onNavigate","tools","railNavigate","useCallback","to","EditorShell","EndpointBody","envelope","resolvedFields","setResolvedFields","resolvedRef","pendingPickRef","touchedRef","setUrlForm","setUrlDomain","showIdentity","setShowIdentity","setSaved","showJson","setShowJson","json","setJson","jsonStored","setJsonStored","jsonError","setJsonError","saveGuard","def","unfed","uncoveredForEndpoint","useEndpointDraft","view","bindingBanner","useWorkspace","setDefinition","patch","d","patchSecurity","merged","onTargetChange","shouldSeed","mergeSeed","pageExprScope","uncoveredRequiredKeys","unfedKeys","saveBlockedNote","canSave","onSave","saveFirst","openJson","onJsonSave","evalResult","evaluateEdit","parsed","loadErr","notFound","stateError","staleBanner","ExpressionOptionsProvider","HistoryButton","JsonToggleButton","EndpointIdentityModal","JsonToggle","errMsg","FunctionEditor","functionId","FunctionDraftHost","useFunctionDraft","FunctionSession","valid","loadError","implTarget","implToTarget","notice","setNotice","reloading","setReloading","slugify","onImplChange","implAfterRebind","uncoveredForFunction","buildSaveBody","evaluated","reload","failure","bannerError","TestInvoke","FunctionIdentityModal","result","setResult","useInvokeFunctionMutation","run"],"mappings":"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"}
|