@w6w/embed 0.2.21 → 0.2.22

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/rail.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as r } from "react/jsx-runtime";
3
3
  import { useMemo as u } from "react";
4
- import { W as d, R as p, P as m, u as f, a as v, e as b, b as h } from "./editor-tools-j3ThBY_4.js";
4
+ import { W as d, R as p, P as m, u as f, a as v, e as b, b as h } from "./editor-tools-DHyWiG21.js";
5
5
  import { r as P, a as j } from "./project-context-Tvp-La7A.js";
6
6
  const R = () => {
7
7
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@w6w/embed",
3
- "version": "0.2.21",
3
+ "version": "0.2.22",
4
4
  "description": "Embed w6w's managed editor and providers in a host React app.",
5
5
  "license": "FSL-1.1-ALv2",
6
6
  "repository": {
@@ -76,7 +76,7 @@
76
76
  "@w6w/react": "^0.9.15",
77
77
  "@w6w/sdk": "^0.9.30",
78
78
  "@w6w/expr": "^0.1.2",
79
- "@w6w/ui": "^0.2.57",
79
+ "@w6w/ui": "^0.2.58",
80
80
  "yaml": "^2.4.2"
81
81
  },
82
82
  "peerDependencies": {
package/src/styles.css CHANGED
@@ -444,15 +444,41 @@
444
444
  gap: var(--w6w-sp-2);
445
445
  }
446
446
 
447
- .w6w-embed-root .workflow-variable-row {
447
+ /* key | type | required | remove, with the default on its own labelled line
448
+ below; the header row uses the same columns so each label sits over its cell. */
449
+ .w6w-embed-root .workflow-variable-row,
450
+ .w6w-embed-root .workflow-variable-head {
448
451
  display: grid;
449
- grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
452
+ grid-template-columns: minmax(0, 1fr) minmax(0, 7rem) auto auto;
450
453
  gap: var(--w6w-sp-2);
451
454
  align-items: center;
452
455
  }
453
456
 
454
- .w6w-embed-root .workflow-variable-row > .w6w-expr-field {
455
- grid-column: 1 / -1;
457
+ .w6w-embed-root .workflow-variable-head,
458
+ .w6w-embed-root .input-list-head {
459
+ font-size: var(--w6w-fs-xs);
460
+ font-weight: 500;
461
+ color: var(--muted);
462
+ }
463
+
464
+ .w6w-embed-root .workflow-variable-default {
465
+ display: flex;
466
+ flex-direction: column;
467
+ gap: var(--w6w-sp-1);
468
+ min-width: 0;
469
+ }
470
+
471
+ /* key | label | type | required | remove (Functions/Endpoints input editor). */
472
+ .w6w-embed-root .list li.input-list-row,
473
+ .w6w-embed-root .input-list-head {
474
+ display: grid;
475
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 7rem) auto auto;
476
+ gap: var(--w6w-sp-2);
477
+ align-items: center;
478
+ }
479
+
480
+ .w6w-embed-root .input-list-row > * {
481
+ min-width: 0;
456
482
  }
457
483
 
458
484
  .w6w-embed-root .workflow-variable-row > * {
@@ -1 +0,0 @@
1
- {"version":3,"file":"ModelRoutesManager-1Ac5wcas.js","sources":["../src/forms/ModelRoutesManager.tsx"],"sourcesContent":["/**\n * `<ModelRoutesManager>` — list, add, edit and delete the project's model routes. A route is the\n * name callers ask for; it resolves to one model reached through one connection, plus optional\n * fallbacks. `broken` marks a route whose connection stopped working, so it stays visible (and\n * editable) instead of silently disappearing from the list.\n *\n * The project comes from `useEditorProject(projectId)`: omitted defers to `<W6WEmbedProvider\n * project>`; `null` or `\"\"` REFUSES — the list query is disabled, no `/model-routes` request is\n * sent and \"Add\" is disabled. Every write names the resolved project, never `undefined`.\n *\n * `initialEditRouteId` (with `initialConnection`) opens that route's editor on mount, prefilled:\n * the connection dependents view's reconnect affordance lands here, naming the replacement\n * connection. Both are read ONCE — remount to reopen the editor.\n */\nimport { ApiError } from \"@w6w/sdk\";\nimport {\n DataTable,\n type DataTableColumn,\n DeleteButton,\n EditButton,\n EmptyState,\n useEnterSubmit,\n} from \"@w6w/ui\";\nimport { type ReactNode, useState } from \"react\";\nimport { ConfirmModal } from \"../chrome/ConfirmModal.tsx\";\nimport { Modal } from \"../chrome/Modal.tsx\";\nimport { useEditorProject } from \"../project-context.ts\";\nimport { useConnectionsQuery } from \"../repos/connections.ts\";\nimport {\n type ConnectionChoice,\n type Model,\n type ModelFallback,\n type ModelRoute,\n connectionChoices,\n useAllModelCatalogQuery,\n useCreateModelRouteMutation,\n useDeleteModelRouteMutation,\n useModelProvidersQuery,\n useModelRoutesQuery,\n useUpdateModelRouteMutation,\n} from \"../repos/models.ts\";\n\n/**\n * Actionable copy for the route write failures the server names by code. `invalid_route_name` is\n * a 400 the NAME field caused, so it states the rule instead of only echoing the server's\n * sentence; any other error falls back to its own message.\n */\nconst COPY: Record<string, string> = {\n invalid_route_name:\n \"That route name is not valid. Use lowercase letters, digits and dashes (e.g. gpt-4o-fast): 3 to 39 characters, starting with a letter, no double dashes, not ending in a dash.\",\n};\n\nexport function modelRouteErrorCopy(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\nexport interface ModelRoutesManagerProps {\n /**\n * The project whose routes are managed. Omitted: the `<W6WEmbedProvider project>`. `null` or\n * `\"\"`: no project — nothing is requested and nothing can be written.\n */\n projectId?: string | null;\n /** Open this route's editor on mount (read once). The dependents view's reconnect passes it. */\n initialEditRouteId?: string;\n /** Prefill the editor's connection — a reconnect names the connection that should replace it. */\n initialConnection?: string;\n}\n\n/** Which route the editor has open: `routeId: null` is the create form. */\ninterface EditorState {\n routeId: string | null;\n connection?: string;\n}\n\n/** One-line summary of a route's resolution, safe against long ids. */\nfunction routeSummary(r: ModelRoute): string {\n const fallbacks = r.fallbacks.length;\n const tail = fallbacks === 0 ? \"\" : ` · ${fallbacks} fallback${fallbacks === 1 ? \"\" : \"s\"}`;\n return `${r.modelId} via ${r.connectionId}${tail}`;\n}\n\nexport function ModelRoutesManager(props: ModelRoutesManagerProps): ReactNode {\n const project = useEditorProject(props.projectId);\n const [editor, setEditor] = useState<EditorState | null>(() =>\n props.initialEditRouteId\n ? { routeId: props.initialEditRouteId, connection: props.initialConnection }\n : null,\n );\n const [pending, setPending] = useState<ModelRoute | null>(null);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n\n const routesQuery = useModelRoutesQuery(project ?? undefined);\n const deleteMut = useDeleteModelRouteMutation();\n const routes = routesQuery.data ?? [];\n const canCreate = project != null;\n // The reconnect flow names a route by id; the row itself arrives with the list.\n const editing = editor?.routeId == null ? undefined : routes.find((r) => r.id === editor.routeId);\n const editorReady = editor != null && (editor.routeId == null || editing != null);\n\n const columns: DataTableColumn<ModelRoute>[] = [\n {\n key: \"name\",\n header: \"Route\",\n render: (r) => (\n <div className=\"list-main\" style={{ maxWidth: 0, minWidth: \"100%\" }}>\n <strong className=\"list-name\" title={r.name}>\n {r.name}\n </strong>{\" \"}\n <span className={r.status === \"broken\" ? \"tag warn\" : \"tag\"}>{r.status}</span>\n <div className=\"muted small list-preview\" title={routeSummary(r)}>\n {routeSummary(r)}\n </div>\n </div>\n ),\n },\n {\n key: \"connection\",\n header: \"Connection\",\n render: (r) => <code>{r.connectionId}</code>,\n },\n {\n key: \"actions\",\n header: \"\",\n align: \"right\",\n link: false,\n render: (r) => (\n <div style={{ display: \"flex\", gap: \"var(--w6w-sp-1-5)\" }}>\n <EditButton\n label=\"Edit\"\n onClick={() => setEditor({ routeId: r.id })}\n data-testid={`model-route-edit-${r.name}`}\n />\n <DeleteButton\n label=\"Delete\"\n onClick={() => setPending(r)}\n disabled={deleteMut.isPending}\n data-testid={`model-route-delete-${r.name}`}\n />\n </div>\n ),\n },\n ];\n\n return (\n <div className=\"w6w-embed-root\">\n <section className=\"section\">\n <div className=\"section-head\">\n <div>\n <h3>Model routes</h3>\n <p className=\"muted small\">\n The names callers ask for. Each route resolves to a model through a connection, with\n fallbacks when that model cannot answer.\n </p>\n </div>\n <button\n type=\"button\"\n className=\"btn\"\n disabled={!canCreate}\n onClick={() => setEditor({ routeId: null })}\n data-testid=\"model-route-add\"\n >\n + Add route\n </button>\n </div>\n\n {deleteError && (\n <div className=\"result error\" role=\"alert\" data-testid=\"model-route-delete-error\">\n {deleteError}\n </div>\n )}\n\n <div className=\"card\">\n {routesQuery.isLoading && <p className=\"muted\">Loading…</p>}\n {routesQuery.data?.length === 0 && (\n <EmptyState testId=\"model-routes-empty\">\n No model routes yet. Add one to give callers a stable name for a model.\n </EmptyState>\n )}\n {routes.length > 0 && (\n <DataTable\n columns={columns}\n rows={routes}\n rowKey={(r) => r.id}\n testId=\"model-routes-table\"\n />\n )}\n </div>\n\n {editorReady && project != null && editor != null && (\n <RouteModal\n project={project}\n initial={editing}\n initialConnection={editor.connection}\n onClose={() => setEditor(null)}\n onSaved={() => setEditor(null)}\n />\n )}\n\n {pending != null && project != null && (\n <ConfirmModal\n title=\"Delete model route\"\n message={`Delete the model route \"${pending.name}\"? Calls that name it will fail until another route covers the model.`}\n confirmLabel=\"Delete\"\n onConfirm={() => {\n const name = pending.name;\n setDeleteError(null);\n deleteMut.mutate(\n { project, name },\n {\n onError: (e: unknown) =>\n setDeleteError(`Could not delete \"${name}\": ${modelRouteErrorCopy(e)}`),\n },\n );\n setPending(null);\n }}\n onClose={() => setPending(null)}\n />\n )}\n </section>\n </div>\n );\n}\n\n/**\n * Create/edit modal. The name is the route's address, so it is fixed once created (the server\n * patches by name); model and connection stay editable — a reconnect is exactly a connection\n * change.\n */\nfunction RouteModal(props: {\n project: string;\n initial?: ModelRoute;\n initialConnection?: string;\n onClose: () => void;\n onSaved: () => void;\n}) {\n const isEdit = !!props.initial;\n const [name, setName] = useState(props.initial?.name ?? \"\");\n const [model, setModel] = useState(props.initial?.modelId ?? \"\");\n const [connection, setConnection] = useState(\n props.initialConnection ?? props.initial?.connectionId ?? \"\",\n );\n const [fallbacks, setFallbacks] = useState<ModelFallback[]>(props.initial?.fallbacks ?? []);\n const [error, setError] = useState<string | null>(null);\n\n const catalog = useAllModelCatalogQuery({ status: \"active\" });\n const connectionsQuery = useConnectionsQuery();\n const models = catalog.data?.models ?? [];\n const providersQuery = useModelProvidersQuery();\n // Descriptor-driven: only designated providers, disabled with a reason when `complete` is not\n // supported. Never an app id or category guess.\n const connections = connectionChoices(\n connectionsQuery.data ?? [],\n providersQuery.data ?? [],\n \"complete\",\n );\n const catalogEmpty = catalog.isSuccess && models.length === 0;\n\n const createMut = useCreateModelRouteMutation();\n const updateMut = useUpdateModelRouteMutation();\n const saving = createMut.isPending || updateMut.isPending;\n const canSave =\n !!name &&\n !!model &&\n !!connection &&\n fallbacks.every((f) => !!f.model && !!f.connection) &&\n !saving;\n\n function save() {\n setError(null);\n const onSettled = {\n onSuccess: () => props.onSaved(),\n onError: (e: unknown) => setError(modelRouteErrorCopy(e)),\n };\n if (props.initial) {\n updateMut.mutate(\n {\n project: props.project,\n name: props.initial.name,\n patch: { model, connection, fallbacks },\n },\n onSettled,\n );\n return;\n }\n createMut.mutate(\n {\n project: props.project,\n input: { name, model, connection, ...(fallbacks.length > 0 ? { fallbacks } : {}) },\n },\n onSettled,\n );\n }\n\n const enterSubmit = useEnterSubmit(save, { enabled: canSave });\n\n return (\n <Modal\n title={props.initial ? `Edit ${props.initial.name}` : \"Add model route\"}\n onClose={props.onClose}\n >\n <div className=\"modal-body\">\n <label className=\"field\">\n <span>Name</span>\n <input\n type=\"text\"\n value={name}\n disabled={isEdit}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"e.g. gpt-4o-fast\"\n maxLength={64}\n data-testid=\"model-route-name\"\n {...enterSubmit}\n />\n {!isEdit && (\n <span className=\"hint\">\n 3 to 39 characters: lowercase letters, digits and dashes, starting with a letter, no\n double dashes, not ending in a dash. Callers use this name; it cannot be renamed\n later.\n </span>\n )}\n </label>\n\n {catalogEmpty && (\n <EmptyState testId=\"model-route-catalog-empty\">\n The model catalog is empty. Open the Catalog tab to discover models; until then you can\n type ids by hand.\n </EmptyState>\n )}\n\n <PairFields\n label=\"\"\n model={model}\n connection={connection}\n onModel={setModel}\n onConnection={setConnection}\n models={models}\n connections={connections}\n catalogEmpty={catalogEmpty}\n testIdPrefix=\"model-route\"\n enterSubmit={enterSubmit}\n />\n <span className=\"hint\">\n The connection holds the credentials for the model. Changing it fixes a broken route.\n </span>\n\n <div className=\"field\">\n <span>Fallbacks</span>\n {fallbacks.map((f, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: rows have no identity beyond position\n <div key={i} style={{ display: \"flex\", gap: \"var(--w6w-sp-1-5)\" }}>\n <PairFields\n label={`Fallback ${i + 1} `}\n model={f.model}\n connection={f.connection}\n onModel={(v) =>\n setFallbacks((fs) => fs.map((x, j) => (j === i ? { ...x, model: v } : x)))\n }\n onConnection={(v) =>\n setFallbacks((fs) => fs.map((x, j) => (j === i ? { ...x, connection: v } : x)))\n }\n models={models}\n connections={connections}\n catalogEmpty={catalogEmpty}\n testIdPrefix={`model-route-fallback-${i}`}\n enterSubmit={enterSubmit}\n />\n <button\n type=\"button\"\n className=\"btn ghost\"\n onClick={() => setFallbacks((fs) => fs.filter((_, j) => j !== i))}\n data-testid={`model-route-fallback-${i}-remove`}\n >\n Remove\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n className=\"btn ghost\"\n onClick={() => setFallbacks((fs) => [...fs, { model: \"\", connection: \"\" }])}\n data-testid=\"model-route-fallback-add\"\n >\n + Add fallback\n </button>\n </div>\n\n {error && (\n <div className=\"result error\" data-testid=\"model-route-error\">\n {error}\n </div>\n )}\n </div>\n <div className=\"modal-actions\">\n <button type=\"button\" className=\"btn ghost\" onClick={props.onClose}>\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"btn\"\n disabled={!canSave}\n onClick={save}\n data-testid=\"model-route-save\"\n >\n {saving ? \"Saving…\" : isEdit ? \"Save changes\" : \"Save route\"}\n </button>\n </div>\n </Modal>\n );\n}\n\ninterface PairFieldsProps {\n label: string;\n model: string;\n connection: string;\n onModel: (v: string) => void;\n onConnection: (v: string) => void;\n models: Model[];\n connections: ConnectionChoice[];\n catalogEmpty: boolean;\n testIdPrefix: string;\n enterSubmit: Record<string, unknown>;\n}\n\n/**\n * A model + connection pair as selects fed by the catalog and the connections list. Connections\n * narrow to the chosen model's provider app; if none match, all are listed (labelled) so the\n * route can still be saved. An empty catalog falls back to free text.\n */\nfunction PairFields(p: PairFieldsProps) {\n const picked = p.models.find((m) => m.id === p.model);\n const matching = picked\n ? p.connections.filter((c) => c.appId === picked.providerAppId)\n : p.connections;\n const narrowed = picked != null && matching.length > 0;\n const options = narrowed ? matching : p.connections;\n const connHas = options.some((c) => c.id === p.connection);\n const modelHas = p.models.some((m) => m.id === p.model);\n return (\n <>\n <div className=\"field\">\n <span>{p.label}Model</span>\n {p.catalogEmpty ? (\n <input\n type=\"text\"\n value={p.model}\n onChange={(e) => p.onModel(e.target.value)}\n placeholder=\"model id\"\n aria-label={`${p.label}Model`}\n data-testid={`${p.testIdPrefix}-model`}\n {...p.enterSubmit}\n />\n ) : (\n <select\n value={p.model}\n onChange={(e) => p.onModel(e.target.value)}\n aria-label={`${p.label}Model`}\n data-testid={`${p.testIdPrefix}-model`}\n >\n <option value=\"\">Select a model…</option>\n {p.model && !modelHas && <option value={p.model}>{p.model}</option>}\n {p.models.map((m) => (\n <option key={m.id} value={m.id}>\n {m.displayName} ({m.provider})\n </option>\n ))}\n </select>\n )}\n </div>\n <div className=\"field\">\n <span>{p.label}Connection</span>\n {p.catalogEmpty && p.connections.length === 0 ? (\n <input\n type=\"text\"\n value={p.connection}\n onChange={(e) => p.onConnection(e.target.value)}\n placeholder=\"connection id\"\n aria-label={`${p.label}Connection`}\n data-testid={`${p.testIdPrefix}-connection`}\n {...p.enterSubmit}\n />\n ) : (\n <select\n value={p.connection}\n onChange={(e) => p.onConnection(e.target.value)}\n aria-label={`${p.label}Connection`}\n data-testid={`${p.testIdPrefix}-connection`}\n >\n <option value=\"\">Select a connection…</option>\n {p.connection && !connHas && <option value={p.connection}>{p.connection}</option>}\n {options.map((c) => (\n <option key={c.id} value={c.id} disabled={c.disabledReason != null}>\n {c.displayName}\n {narrowed ? \"\" : ` (${c.appId})`}\n {c.disabledReason != null ? ` — ${c.disabledReason}` : \"\"}\n </option>\n ))}\n </select>\n )}\n </div>\n </>\n );\n}\n"],"names":["COPY","modelRouteErrorCopy","ApiError","routeSummary","r","fallbacks","tail","ModelRoutesManager","props","project","useEditorProject","editor","setEditor","useState","pending","setPending","deleteError","setDeleteError","routesQuery","useModelRoutesQuery","deleteMut","useDeleteModelRouteMutation","routes","canCreate","editing","editorReady","columns","jsxs","jsx","EditButton","DeleteButton","_a","EmptyState","DataTable","RouteModal","ConfirmModal","name","e","isEdit","setName","model","setModel","_b","connection","setConnection","_c","setFallbacks","_d","error","setError","catalog","useAllModelCatalogQuery","connectionsQuery","useConnectionsQuery","models","_e","providersQuery","useModelProvidersQuery","connections","connectionChoices","catalogEmpty","createMut","useCreateModelRouteMutation","updateMut","useUpdateModelRouteMutation","saving","canSave","f","save","onSettled","enterSubmit","useEnterSubmit","Modal","PairFields","i","v","fs","x","j","_","p","picked","m","matching","c","narrowed","options","connHas","modelHas","Fragment"],"mappings":"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"}