@w6w/embed 0.2.20 → 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/{ModelRoutesManager-1Ac5wcas.js → ModelRoutesManager-BUw_sm-M.js} +2 -2
- package/dist/ModelRoutesManager-BUw_sm-M.js.map +1 -0
- package/dist/{WorkflowEditor-CmhXHRxi.js → WorkflowEditor-LesBKjb2.js} +194 -186
- package/dist/{WorkflowEditor-CmhXHRxi.js.map → WorkflowEditor-LesBKjb2.js.map} +1 -1
- package/dist/{apps-ItBvnWX3.js → apps-CYUgEfGf.js} +2 -2
- package/dist/{apps-ItBvnWX3.js.map → apps-CYUgEfGf.js.map} +1 -1
- package/dist/editor/types.d.ts +2 -0
- package/dist/{editor-apps-DkkC7wOQ.js → editor-apps-LZmDWMqf.js} +3 -3
- package/dist/{editor-apps-DkkC7wOQ.js.map → editor-apps-LZmDWMqf.js.map} +1 -1
- package/dist/{editor-tools-BR27RGto.js → editor-tools-DHyWiG21.js} +49 -40
- package/dist/{editor-tools-BR27RGto.js.map → editor-tools-DHyWiG21.js.map} +1 -1
- package/dist/editor.mjs +1 -1
- package/dist/editors.mjs +67 -60
- package/dist/editors.mjs.map +1 -1
- package/dist/forms.mjs +272 -269
- package/dist/forms.mjs.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/lists.mjs +7 -7
- package/dist/lists.mjs.map +1 -1
- package/dist/rail.mjs +1 -1
- package/dist/repos/workflows.d.ts +1 -1
- package/dist/repos.mjs +3 -3
- package/dist/{spec-export-DGy5ijps.js → spec-export-DGigBUsP.js} +2 -2
- package/dist/{spec-export-DGy5ijps.js.map → spec-export-DGigBUsP.js.map} +1 -1
- package/dist/{workflows-BZN4Hyz1.js → workflows-BK6IM4if.js} +3 -3
- package/dist/{workflows-BZN4Hyz1.js.map → workflows-BK6IM4if.js.map} +1 -1
- package/package.json +3 -3
- package/src/styles.css +30 -4
- package/dist/ModelRoutesManager-1Ac5wcas.js.map +0 -1
package/dist/forms.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forms.mjs","sources":["../src/forms/VarsManager.tsx","../src/forms/SecretsManager.tsx","../src/forms/ModelBudgetsManager.tsx"],"sourcesContent":["/**\n * `<VarsManager>` — list, add, edit and delete the project's variables. Variables are\n * plaintext typed values scoped to ONE project (secrets, by contrast, are per account — see\n * `SecretsManager`).\n *\n * The project comes from `useEditorProject(project)`: omitted defers to `<W6WEmbedProvider\n * project>`; `null` or `\"\"` REFUSES — the list query is disabled, no `/vars` request is sent and\n * \"Add\" is disabled. Every list/create/update/delete call names the resolved project, never\n * `undefined` (a project-less write lands in the account default project).\n */\nimport { ApiError } from \"@w6w/sdk\";\nimport type { Var, VarType } from \"@w6w/sdk\";\nimport {\n Copyable,\n DataTable,\n type DataTableColumn,\n DeleteButton,\n EditButton,\n EmptyState,\n useEnterSubmit,\n} from \"@w6w/ui\";\nimport { type ReactNode, useState } from \"react\";\nimport { CallFromCodeButton } from \"../chrome/CallFromCodeButton.tsx\";\nimport { ConfirmModal } from \"../chrome/ConfirmModal.tsx\";\nimport { Modal } from \"../chrome/Modal.tsx\";\nimport { useEditorProject } from \"../project-context.ts\";\nimport {\n useCreateVarMutation,\n useDeleteVarMutation,\n useUpdateVarMutation,\n useVarsQuery,\n} from \"../repos/vars.ts\";\n\nconst TYPES: readonly VarType[] = [\"string\", \"number\", \"boolean\", \"json\"];\n\n/** What a function-form `actions` slot receives. */\nexport interface ConfigManagerActionsApi {\n /** Open the create form (a no-op while the manager is refusing, e.g. no project). */\n openCreate: () => void;\n /** `false` when the create control must be disabled (no project). */\n canCreate: boolean;\n}\n\n/**\n * Each slot: omitted ⇒ the built-in default; `null` ⇒ nothing; a node replaces it. `actions` also\n * accepts a function so a host that replaces the default \"+ Add\" button can still open the form.\n */\nexport interface VarsManagerSlots {\n /** The section heading + description. */\n header?: ReactNode;\n /** The trailing control(s) of the head row (the \"+ Add variable\" button). */\n actions?: ReactNode | ((api: ConfigManagerActionsApi) => ReactNode);\n /** Shown instead of the list when there are no variables. */\n empty?: ReactNode;\n}\n\nexport interface VarsManagerProps {\n /**\n * The project whose variables are managed. Omitted: the `<W6WEmbedProvider project>`. `null` or\n * `\"\"`: no project — nothing is requested and nothing can be written.\n */\n project?: string | null;\n slots?: VarsManagerSlots;\n}\n\n/** One-line preview of a var's current value, safe against long strings. */\nfunction previewValue(v: Var): string {\n if (v.type === \"boolean\") return String(v.value);\n if (v.type === \"number\") return String(v.value);\n if (v.type === \"string\") return String(v.value);\n const s = JSON.stringify(v.value);\n return s.length > 80 ? `${s.slice(0, 80)}…` : s;\n}\n\nexport function VarsManager(props: VarsManagerProps): ReactNode {\n const slots = props.slots;\n const project = useEditorProject(props.project);\n const [modal, setModal] = useState<{ mode: \"create\" } | { mode: \"edit\"; v: Var } | null>(null);\n const [pending, setPending] = useState<Var | null>(null);\n\n const varsQuery = useVarsQuery(project ?? undefined, project != null);\n const deleteMut = useDeleteVarMutation();\n const canCreate = project != null;\n const openCreate = () => {\n if (project != null) setModal({ mode: \"create\" });\n };\n\n const header =\n slots?.header === undefined ? (\n <div>\n <h3>Variables</h3>\n <p className=\"muted small\">\n User-defined typed values addressable by name. Plaintext — use <strong>Secrets</strong>{\" \"}\n for sensitive values.\n </p>\n </div>\n ) : (\n slots.header\n );\n const actionsSlot = slots?.actions;\n const actions =\n actionsSlot === undefined ? (\n <button type=\"button\" className=\"btn\" disabled={!canCreate} onClick={openCreate}>\n + Add variable\n </button>\n ) : typeof actionsSlot === \"function\" ? (\n actionsSlot({ openCreate, canCreate })\n ) : (\n actionsSlot\n );\n const empty =\n slots?.empty === undefined ? (\n <EmptyState testId=\"vars-manager-empty\">No variables yet.</EmptyState>\n ) : (\n slots.empty\n );\n\n const columns: DataTableColumn<Var>[] = [\n {\n key: \"name\",\n header: \"Variable\",\n render: (v) => (\n <div className=\"list-main\" style={{ maxWidth: 0, minWidth: \"100%\" }}>\n <strong className=\"list-name\" title={v.name}>\n {v.name}\n </strong>{\" \"}\n <span className=\"tag\">{v.type}</span>\n <div className=\"muted small list-preview\" title={previewValue(v)}>\n <Copyable value={previewValue(v)} readOnly>\n {/* `.w6w-copyable`'s flex rule only targets `> input, > textarea, > pre` —\n never `> code` — so this `<code>` keeps flexbox's automatic min-content\n floor unless told otherwise. `overflowWrap: \"anywhere\"` alone still\n leaves the content unshrunk, pushing the Copy button outside\n `.list-preview`'s clipped box at narrow widths. `minWidth: 0` lets the\n flex item shrink to the box; `overflow`/`textOverflow` give IT the\n ellipsis, restoring the single-line truncation `.list-preview` set up. */}\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 {previewValue(v)}\n </code>\n </Copyable>\n {v.description && <> · {v.description}</>}\n </div>\n </div>\n ),\n },\n {\n key: \"actions\",\n header: \"\",\n align: \"right\",\n link: false,\n render: (v) => (\n <div style={{ display: \"flex\", gap: \"var(--w6w-sp-1-5)\" }}>\n <CallFromCodeButton resource={{ kind: \"var\", name: v.name }} />\n <EditButton\n label=\"Edit\"\n onClick={() => setModal({ mode: \"edit\", v })}\n data-testid={`var-edit-${v.id}`}\n />\n <DeleteButton\n label=\"Delete\"\n onClick={() => setPending(v)}\n disabled={deleteMut.isPending}\n data-testid={`var-delete-${v.id}`}\n />\n </div>\n ),\n },\n ];\n\n return (\n <div className=\"w6w-embed-root\">\n <section className=\"section\">\n {(header != null || actions != null) && (\n <div className=\"section-head\">\n {header}\n {actions}\n </div>\n )}\n\n <div className=\"card\">\n {varsQuery.isLoading && <p className=\"muted\">Loading…</p>}\n {varsQuery.data?.length === 0 && empty}\n {varsQuery.data != null && varsQuery.data.length > 0 && (\n <DataTable columns={columns} rows={varsQuery.data} rowKey={(v) => v.id} />\n )}\n </div>\n\n {modal && project != null && (\n <VarModal\n project={project}\n initial={modal.mode === \"edit\" ? modal.v : undefined}\n onClose={() => setModal(null)}\n onSaved={() => setModal(null)}\n />\n )}\n\n {pending && project != null && (\n <ConfirmModal\n title=\"Delete variable\"\n message={`Delete the variable \"${pending.name}\"? This cannot be undone.`}\n confirmLabel=\"Delete\"\n onConfirm={() => {\n deleteMut.mutate({ id: pending.id, project });\n setPending(null);\n }}\n onClose={() => setPending(null)}\n />\n )}\n </section>\n </div>\n );\n}\n\n/**\n * Create/edit modal. The value widget switches on `type`; the raw string in the form is parsed to\n * the declared type at submit time so what's stored round-trips faithfully (e.g. the number `42`,\n * not the string `\"42\"`).\n */\nfunction VarModal(props: {\n project: string;\n initial?: Var;\n onClose: () => void;\n onSaved: () => void;\n}) {\n const isEdit = !!props.initial;\n const [name, setName] = useState(props.initial?.name ?? \"\");\n const [type, setType] = useState<VarType>(props.initial?.type ?? \"string\");\n const [raw, setRaw] = useState<string>(() => {\n if (!props.initial) return \"\";\n if (props.initial.type === \"string\") return String(props.initial.value ?? \"\");\n return JSON.stringify(props.initial.value, null, 2);\n });\n const [description, setDescription] = useState(props.initial?.description ?? \"\");\n const [error, setError] = useState<string | null>(null);\n\n /** Parse the raw string into a value that matches `type`. */\n function parseValue(): { ok: true; value: unknown } | { ok: false; error: string } {\n if (type === \"string\") return { ok: true, value: raw };\n if (type === \"boolean\") {\n if (raw === \"true\") return { ok: true, value: true };\n if (raw === \"false\") return { ok: true, value: false };\n return { ok: false, error: \"Value must be `true` or `false`.\" };\n }\n if (type === \"number\") {\n const n = Number(raw);\n if (!Number.isFinite(n)) return { ok: false, error: \"Value must be a finite number.\" };\n return { ok: true, value: n };\n }\n // json\n try {\n return { ok: true, value: JSON.parse(raw) };\n } catch (e) {\n return { ok: false, error: `Invalid JSON: ${(e as Error).message}` };\n }\n }\n\n const createMut = useCreateVarMutation();\n const updateMut = useUpdateVarMutation();\n const saving = createMut.isPending || updateMut.isPending;\n\n function save() {\n const parsed = parseValue();\n if (!parsed.ok) {\n setError(parsed.error);\n return;\n }\n setError(null);\n const onSettled = {\n onSuccess: () => props.onSaved(),\n onError: (e: unknown) => setError(e instanceof ApiError ? e.message : (e as Error).message),\n };\n if (props.initial) {\n updateMut.mutate(\n {\n id: props.initial.id,\n patch: { type, value: parsed.value, description },\n project: props.project,\n },\n onSettled,\n );\n return;\n }\n createMut.mutate(\n { input: { name, type, value: parsed.value, description }, project: props.project },\n onSettled,\n );\n }\n\n const enterSubmit = useEnterSubmit(save, { enabled: !!name && !saving });\n\n return (\n <Modal\n title={props.initial ? `Edit ${props.initial.name}` : \"Add variable\"}\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. api_base_url\"\n maxLength={64}\n {...enterSubmit}\n />\n {!isEdit && (\n <span className=\"hint\">\n Letters, digits, and underscores. Must start with a letter or underscore.\n Case-sensitive.\n </span>\n )}\n </label>\n\n <label className=\"field\">\n <span>Type</span>\n <select value={type} onChange={(e) => setType(e.target.value as VarType)}>\n {TYPES.map((t) => (\n <option key={t} value={t}>\n {t}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"field\" htmlFor=\"var-value\">\n <span>Value</span>\n {type === \"boolean\" ? (\n <select id=\"var-value\" value={raw || \"true\"} onChange={(e) => setRaw(e.target.value)}>\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : type === \"number\" ? (\n <input\n id=\"var-value\"\n type=\"number\"\n value={raw}\n onChange={(e) => setRaw(e.target.value)}\n placeholder=\"0\"\n {...enterSubmit}\n />\n ) : type === \"json\" ? (\n <textarea\n id=\"var-value\"\n className=\"code\"\n rows={6}\n value={raw}\n onChange={(e) => setRaw(e.target.value)}\n placeholder='{\"key\": \"value\"}'\n />\n ) : (\n <input\n id=\"var-value\"\n type=\"text\"\n value={raw}\n onChange={(e) => setRaw(e.target.value)}\n placeholder=\"\"\n {...enterSubmit}\n />\n )}\n </label>\n\n <label className=\"field\">\n <span>Description</span>\n <input\n type=\"text\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Optional\"\n {...enterSubmit}\n />\n </label>\n\n {error && <div className=\"result error\">{error}</div>}\n </div>\n <div className=\"modal-actions\">\n <button type=\"button\" className=\"btn ghost\" onClick={props.onClose}>\n Cancel\n </button>\n <button type=\"button\" className=\"btn\" disabled={!name || saving} onClick={save}>\n {saving ? \"Saving…\" : isEdit ? \"Save changes\" : \"Save variable\"}\n </button>\n </div>\n </Modal>\n );\n}\n","/**\n * `<SecretsManager>` — list, add, rotate and delete the account's secrets (vault). Secrets are\n * per ACCOUNT, not per project (variables are per project — see `VarsManager`), so there is no\n * `project` prop.\n *\n * WRITE-ONLY. A secret's value is typed into a form and sent; it is never read back. The value\n * field starts empty in create and in rotate; a blank rotate sends no `value` key; a blank create\n * is refused before any request; rows render only `name`, `description`, `updatedAt` and a fixed\n * mask — a row object is never spread or stringified, so a server that wrongly returns `value`\n * cannot reach the DOM. No prop receives, and no callback is handed, a secret value, and nothing\n * here writes the `[\"secrets\"]` cache (only the repo's own invalidation).\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 {\n type VaultSecretSummary,\n useCreateSecretMutation,\n useDeleteSecretMutation,\n useSecretsQuery,\n useUpdateSecretMutation,\n} from \"../repos/vault.ts\";\nimport type { ConfigManagerActionsApi } from \"./VarsManager.tsx\";\n\n/** Same contract as `VarsManagerSlots`: omitted ⇒ default, `null` ⇒ nothing, a node replaces. */\nexport interface SecretsManagerSlots {\n header?: ReactNode;\n actions?: ReactNode | ((api: ConfigManagerActionsApi) => ReactNode);\n empty?: ReactNode;\n}\n\nexport interface SecretsManagerProps {\n slots?: SecretsManagerSlots;\n}\n\nexport function SecretsManager(props: SecretsManagerProps): ReactNode {\n const slots = props.slots;\n const [modal, setModal] = useState<\n { mode: \"create\" } | { mode: \"edit\"; s: VaultSecretSummary } | null\n >(null);\n const [pending, setPending] = useState<VaultSecretSummary | null>(null);\n\n const secretsQuery = useSecretsQuery();\n const deleteMut = useDeleteSecretMutation();\n const openCreate = () => setModal({ mode: \"create\" });\n\n const header =\n slots?.header === undefined ? (\n <div>\n <h3>Secrets</h3>\n <p className=\"muted small\">\n Secrets addressable by name. Stored encrypted at rest and never returned from the server —\n to change a secret, overwrite it.\n </p>\n </div>\n ) : (\n slots.header\n );\n const actionsSlot = slots?.actions;\n const actions =\n actionsSlot === undefined ? (\n <button type=\"button\" className=\"btn\" onClick={openCreate}>\n + Add secret\n </button>\n ) : typeof actionsSlot === \"function\" ? (\n actionsSlot({ openCreate, canCreate: true })\n ) : (\n actionsSlot\n );\n const empty =\n slots?.empty === undefined ? (\n <EmptyState testId=\"secrets-manager-empty\">No secrets yet.</EmptyState>\n ) : (\n slots.empty\n );\n\n const columns: DataTableColumn<VaultSecretSummary>[] = [\n {\n key: \"name\",\n header: \"Secret\",\n render: (s) => (\n <div className=\"list-main\" style={{ maxWidth: 0, minWidth: \"100%\" }}>\n <strong className=\"list-name\" title={s.name}>\n {s.name}\n </strong>{\" \"}\n <code className=\"muted small\">••••••••</code>\n <div className=\"muted small list-preview\">\n {s.description && <>{s.description} · </>}\n updated {new Date(s.updatedAt).toLocaleString()}\n </div>\n </div>\n ),\n },\n {\n key: \"actions\",\n header: \"\",\n align: \"right\",\n link: false,\n render: (s) => (\n <div style={{ display: \"flex\", gap: \"var(--w6w-sp-1-5)\" }}>\n <EditButton\n label=\"Rotate\"\n onClick={() => setModal({ mode: \"edit\", s })}\n data-testid={`secret-rotate-${s.id}`}\n />\n <DeleteButton\n label=\"Delete\"\n onClick={() => setPending(s)}\n disabled={deleteMut.isPending}\n data-testid={`secret-delete-${s.id}`}\n />\n </div>\n ),\n },\n ];\n\n return (\n <div className=\"w6w-embed-root\">\n <section className=\"section\">\n {(header != null || actions != null) && (\n <div className=\"section-head\">\n {header}\n {actions}\n </div>\n )}\n\n <div className=\"card\">\n {secretsQuery.isLoading && <p className=\"muted\">Loading…</p>}\n {secretsQuery.data?.length === 0 && empty}\n {secretsQuery.data != null && secretsQuery.data.length > 0 && (\n <DataTable columns={columns} rows={secretsQuery.data} rowKey={(s) => s.id} />\n )}\n </div>\n\n {modal && (\n <SecretModal\n initial={modal.mode === \"edit\" ? modal.s : undefined}\n onClose={() => setModal(null)}\n onSaved={() => setModal(null)}\n />\n )}\n\n {pending && (\n <ConfirmModal\n title=\"Delete secret\"\n message={`Delete the secret \"${pending.name}\"? This cannot be undone.`}\n confirmLabel=\"Delete\"\n onConfirm={() => {\n deleteMut.mutate(pending.id);\n setPending(null);\n }}\n onClose={() => setPending(null)}\n />\n )}\n </section>\n </div>\n );\n}\n\n/**\n * Create/rotate a secret. On edit, the current value is intentionally not pre-filled — the server\n * never returns it. Leaving the value blank in edit mode updates only the description.\n */\nfunction SecretModal(props: {\n initial?: VaultSecretSummary;\n onClose: () => void;\n onSaved: () => void;\n}) {\n const isEdit = !!props.initial;\n const [name, setName] = useState(props.initial?.name ?? \"\");\n const [value, setValue] = useState(\"\");\n const [description, setDescription] = useState(props.initial?.description ?? \"\");\n const [error, setError] = useState<string | null>(null);\n\n const createMut = useCreateSecretMutation();\n const updateMut = useUpdateSecretMutation(props.initial?.id ?? \"\");\n const saveMut = isEdit ? updateMut : createMut;\n const canSave = !!name && (isEdit || !!value) && !saveMut.isPending;\n\n function handleSave() {\n setError(null);\n if (isEdit) {\n updateMut.mutate(\n { value: value === \"\" ? undefined : value, description },\n {\n onSuccess: () => props.onSaved(),\n onError: (e) => setError(e instanceof ApiError ? e.message : (e as Error).message),\n },\n );\n return;\n }\n if (value === \"\") {\n setError(\"A secret value is required.\");\n return;\n }\n createMut.mutate(\n { name, value, description },\n {\n onSuccess: () => props.onSaved(),\n onError: (e) => setError(e instanceof ApiError ? e.message : (e as Error).message),\n },\n );\n }\n const enterSubmit = useEnterSubmit(handleSave, { enabled: canSave });\n\n return (\n <Modal\n title={props.initial ? `Rotate ${props.initial.name}` : \"Add secret\"}\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. openai_api_key\"\n maxLength={64}\n {...enterSubmit}\n />\n {!isEdit && (\n <span className=\"hint\">\n Letters, digits, and underscores. Must start with a letter or underscore.\n Case-sensitive.\n </span>\n )}\n </label>\n\n <label className=\"field\">\n <span>{isEdit ? \"New value\" : \"Value\"}</span>\n <textarea\n className=\"code\"\n rows={3}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={isEdit ? \"Leave blank to keep the current value\" : \"sk-…\"}\n autoComplete=\"off\"\n spellCheck={false}\n />\n <span className=\"hint\">\n Stored encrypted at rest. Once saved, it is not readable through the UI.\n </span>\n </label>\n\n <label className=\"field\">\n <span>Description</span>\n <input\n type=\"text\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Optional\"\n {...enterSubmit}\n />\n </label>\n\n {error && <div className=\"result error\">{error}</div>}\n </div>\n <div className=\"modal-actions\">\n <button type=\"button\" className=\"btn ghost\" onClick={props.onClose}>\n Cancel\n </button>\n <button type=\"button\" className=\"btn\" disabled={!canSave} onClick={handleSave}>\n {saveMut.isPending ? \"Saving…\" : isEdit ? \"Save changes\" : \"Save secret\"}\n </button>\n </div>\n </Modal>\n );\n}\n","/**\n * `<ModelBudgetsManager>` — list, add, edit and delete the project's model budgets, each with a\n * usage meter fed by the budget's usage endpoint (spend so far and what is reserved for in-flight\n * calls, against the limit).\n *\n * The project comes from `useEditorProject(projectId)`: omitted defers to `<W6WEmbedProvider\n * project>`; `null` or `\"\"` REFUSES — the list query is disabled, no `/model-budgets` request is\n * sent and \"Add\" is disabled. Every write names the resolved project, never `undefined`.\n *\n * A budget is a scope (`scopeKind`, plus a `scopeId` for the route and connection kinds only), a\n * `window` (`day` or `month`) and one or more `limits`. The row's meter measures ONE of them —\n * cost when the budget has a cost limit, else tokens, else requests — because a meter needs a\n * single number pair; the limits column prints them all.\n */\nimport { ApiError } from \"@w6w/sdk\";\nimport {\n BudgetMeter,\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 {\n type ModelBudget,\n type ModelBudgetLimits,\n useCreateModelBudgetMutation,\n useDeleteModelBudgetMutation,\n useModelBudgetUsageQuery,\n useModelBudgetsQuery,\n useUpdateModelBudgetMutation,\n} from \"../repos/models.ts\";\n\nexport interface ModelBudgetsManagerProps {\n /**\n * The project whose budgets 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}\n\ntype MeterUnit = \"costMinor\" | \"tokens\" | \"requests\";\n\nconst UNIT_LABEL: Record<MeterUnit, string> = {\n costMinor: \"Cost\",\n tokens: \"Tokens\",\n requests: \"Requests\",\n};\n\nconst BREACHES = [\"block\", \"warn\"] as const;\n\n/**\n * The scopes the server accepts (`admin/model-budgets.ts` `SCOPE_KINDS`). `route` and `connection`\n * REQUIRE a scope id (the route name/id, the connection id); the other three refuse one — they cap\n * the caller's own tenant, account or project.\n */\nconst SCOPE_KINDS = [\"tenant\", \"account\", \"project\", \"route\", \"connection\"] as const;\ntype ScopeKind = (typeof SCOPE_KINDS)[number];\nconst SCOPE_LABEL: Record<ScopeKind, string> = {\n tenant: \"Tenant\",\n account: \"Account\",\n project: \"Project\",\n route: \"Model route\",\n connection: \"Connection\",\n};\nconst needsScopeId = (kind: string): boolean => kind === \"route\" || kind === \"connection\";\n\n/** The windows the server accepts; limits reset at the start of each UTC day or month. */\nconst WINDOWS = [\"day\", \"month\"] as const;\n\n/** Plain thousands separators — no `Intl`, so the text is identical in every host and test. */\nfunction grouped(n: number): string {\n return String(n).replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n}\n\n/** Minor units print as `<CUR> 12.34`; counts keep the plain grouping. */\nfunction meterFormatter(unit: MeterUnit, currency: string): (n: number) => string {\n if (unit === \"costMinor\") return (n) => `${currency} ${(n / 100).toFixed(2)}`;\n return grouped;\n}\n\n/** Which limit the row's meter measures: cost if set, else tokens, else requests. */\nfunction meterUnit(limits: ModelBudgetLimits): MeterUnit | null {\n if (limits.costMinor != null) return \"costMinor\";\n if (limits.tokens != null) return \"tokens\";\n if (limits.requests != null) return \"requests\";\n return null;\n}\n\nfunction costLimitText(limits: ModelBudgetLimits): string | null {\n if (limits.costMinor == null) return null;\n return `${limits.currency ?? \"USD\"} ${(limits.costMinor / 100).toFixed(2)}`;\n}\n\n/** Every configured limit, one line — the meter covers only the primary one. */\nfunction limitsSummary(limits: ModelBudgetLimits): string {\n const parts: string[] = [];\n if (limits.requests != null) parts.push(`${grouped(limits.requests)} requests`);\n if (limits.tokens != null) parts.push(`${grouped(limits.tokens)} tokens`);\n const cost = costLimitText(limits);\n if (cost != null) parts.push(cost);\n return parts.length === 0 ? \"no limit\" : parts.join(\" · \");\n}\n\nfunction scopeSummary(b: ModelBudget): string {\n return b.scopeId == null ? `this ${b.scopeKind}` : `${b.scopeKind} ${b.scopeId}`;\n}\n\n/** Unknown-but-named failures fall back to the server's own message. */\nfunction budgetErrorCopy(e: unknown): string {\n if (e instanceof ApiError) return e.message;\n return e instanceof Error ? e.message : String(e);\n}\n\n/** `null` for a blank field so an unset limit stays absent instead of becoming `0`. */\nfunction optionalNumber(raw: string): number | null {\n const trimmed = raw.trim();\n if (trimmed === \"\") return null;\n const n = Number(trimmed);\n return Number.isFinite(n) ? n : null;\n}\n\nexport function ModelBudgetsManager(props: ModelBudgetsManagerProps): ReactNode {\n const project = useEditorProject(props.projectId);\n const [editing, setEditing] = useState<{ budget?: ModelBudget } | null>(null);\n const [pending, setPending] = useState<ModelBudget | null>(null);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n\n const budgetsQuery = useModelBudgetsQuery(project ?? undefined);\n const deleteMut = useDeleteModelBudgetMutation();\n const budgets = budgetsQuery.data ?? [];\n const canCreate = project != null;\n\n const columns: DataTableColumn<ModelBudget>[] = [\n {\n key: \"scope\",\n header: \"Scope\",\n render: (b) => (\n <div className=\"list-main\" style={{ maxWidth: 0, minWidth: \"100%\" }}>\n <strong className=\"list-name\" title={scopeSummary(b)}>\n {b.scopeKind}\n </strong>{\" \"}\n <span className={b.onBreach === \"warn\" ? \"tag warn\" : \"tag\"}>{b.onBreach}</span>\n <div className=\"muted small list-preview\" title={scopeSummary(b)}>\n {b.scopeId == null ? `the whole ${b.scopeKind}` : b.scopeId}\n </div>\n </div>\n ),\n },\n {\n key: \"window\",\n header: \"Window\",\n render: (b) => b.window,\n },\n {\n key: \"limits\",\n header: \"Limit\",\n render: (b) => <span className=\"muted small\">{limitsSummary(b.limits)}</span>,\n },\n {\n key: \"usage\",\n header: \"Used\",\n // Rows only exist once the project-scoped query ran, so `project` is set here.\n render: (b) => (project == null ? null : <BudgetRowMeter budget={b} projectId={project} />),\n },\n {\n key: \"actions\",\n header: \"\",\n align: \"right\",\n link: false,\n render: (b) => (\n <div style={{ display: \"flex\", gap: \"var(--w6w-sp-1-5)\" }}>\n <EditButton\n label=\"Edit\"\n onClick={() => setEditing({ budget: b })}\n data-testid={`model-budget-edit-${b.id}`}\n />\n <DeleteButton\n label=\"Delete\"\n onClick={() => setPending(b)}\n disabled={deleteMut.isPending}\n data-testid={`model-budget-delete-${b.id}`}\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 budgets</h3>\n <p className=\"muted small\">\n Caps on what a tenant, account, project, route or connection may spend. A breached\n budget either warns or blocks the call, per its own setting.\n </p>\n </div>\n <button\n type=\"button\"\n className=\"btn\"\n disabled={!canCreate}\n onClick={() => setEditing({})}\n data-testid=\"model-budget-add\"\n >\n + Add budget\n </button>\n </div>\n\n {deleteError && (\n <div className=\"result error\" role=\"alert\" data-testid=\"model-budget-delete-error\">\n {deleteError}\n </div>\n )}\n\n <div className=\"card\">\n {budgetsQuery.isLoading && <p className=\"muted\">Loading…</p>}\n {budgetsQuery.data?.length === 0 && (\n <EmptyState testId=\"model-budgets-empty\">\n No model budgets yet. Add one to cap spend or request volume.\n </EmptyState>\n )}\n {budgets.length > 0 && (\n <DataTable\n columns={columns}\n rows={budgets}\n rowKey={(b) => b.id}\n testId=\"model-budgets-table\"\n />\n )}\n </div>\n\n {editing != null && project != null && (\n <BudgetModal\n project={project}\n initial={editing.budget}\n onClose={() => setEditing(null)}\n onSaved={() => setEditing(null)}\n />\n )}\n\n {pending != null && project != null && (\n <ConfirmModal\n title=\"Delete model budget\"\n message={`Delete the budget on ${scopeSummary(pending)}? Calls stop being capped by it immediately.`}\n confirmLabel=\"Delete\"\n onConfirm={() => {\n const target = pending;\n setDeleteError(null);\n deleteMut.mutate(\n { project, id: target.id },\n {\n onError: (e: unknown) =>\n setDeleteError(\n `Could not delete the budget on ${scopeSummary(target)}: ${budgetErrorCopy(e)}`,\n ),\n },\n );\n setPending(null);\n }}\n onClose={() => setPending(null)}\n />\n )}\n </section>\n </div>\n );\n}\n\n/**\n * One budget's meter, from ITS usage endpoint: `used` and `reserved` come from the server, never\n * from the list row, so the pair a call is measured against is the one the server enforces.\n */\nfunction BudgetRowMeter(props: { budget: ModelBudget; projectId: string }): ReactNode {\n const usageQuery = useModelBudgetUsageQuery(props.budget.id, props.projectId);\n if (usageQuery.isLoading) return <span className=\"muted small\">Loading…</span>;\n const usage = usageQuery.data;\n if (usage == null) return <span className=\"muted small\">—</span>;\n // The usage endpoint reports the limits actually in force (it echoes the budget's own).\n const limits = usage.limits ?? props.budget.limits;\n const unit = meterUnit(limits);\n if (unit == null) return <span className=\"muted small\">no limit</span>;\n return (\n <BudgetMeter\n label={UNIT_LABEL[unit]}\n used={usage.used[unit]}\n limit={limits[unit] ?? 0}\n reserved={usage.reserved[unit]}\n format={meterFormatter(unit, limits.currency ?? \"USD\")}\n testId={`model-budget-meter-${props.budget.id}`}\n />\n );\n}\n\n/**\n * Create/edit modal. `scopeKind`/`scopeId` are the budget's address and are fixed once created\n * (the server patches a budget by id); window, limits and the breach behaviour stay editable.\n */\nfunction BudgetModal(props: {\n project: string;\n initial?: ModelBudget;\n onClose: () => void;\n onSaved: () => void;\n}) {\n const isEdit = !!props.initial;\n const [scopeKind, setScopeKind] = useState(props.initial?.scopeKind ?? \"project\");\n const [scopeId, setScopeId] = useState(props.initial?.scopeId ?? \"\");\n const [window, setWindow] = useState(props.initial?.window ?? \"day\");\n const [requests, setRequests] = useState(\n props.initial?.limits.requests != null ? String(props.initial.limits.requests) : \"\",\n );\n const [tokens, setTokens] = useState(\n props.initial?.limits.tokens != null ? String(props.initial.limits.tokens) : \"\",\n );\n const [cost, setCost] = useState(\n props.initial?.limits.costMinor != null ? String(props.initial.limits.costMinor / 100) : \"\",\n );\n const [currency, setCurrency] = useState(props.initial?.limits.currency ?? \"\");\n const [onBreach, setOnBreach] = useState<\"block\" | \"warn\">(props.initial?.onBreach ?? \"warn\");\n const [error, setError] = useState<string | null>(null);\n\n const createMut = useCreateModelBudgetMutation();\n const updateMut = useUpdateModelBudgetMutation();\n const saving = createMut.isPending || updateMut.isPending;\n const scopeIdRequired = needsScopeId(scopeKind);\n const canSave =\n !!scopeKind && !!window && (!scopeIdRequired || isEdit || scopeId.trim() !== \"\") && !saving;\n\n /** The typed limits, with blank fields left out; `cost` is entered in major units. */\n function buildLimits(): ModelBudgetLimits | null {\n const limits: ModelBudgetLimits = {};\n const req = optionalNumber(requests);\n if (req != null) limits.requests = req;\n const tok = optionalNumber(tokens);\n if (tok != null) limits.tokens = tok;\n const costMajor = optionalNumber(cost);\n if (costMajor != null) limits.costMinor = Math.round(costMajor * 100);\n if (limits.costMinor != null && currency.trim() !== \"\") limits.currency = currency.trim();\n return Object.keys(limits).length === 0 ? null : limits;\n }\n\n function save() {\n const limits = buildLimits();\n if (limits == null) {\n setError(\"Set at least one limit: requests, tokens or cost.\");\n return;\n }\n setError(null);\n const onSettled = {\n onSuccess: () => props.onSaved(),\n onError: (e: unknown) => setError(budgetErrorCopy(e)),\n };\n if (props.initial) {\n updateMut.mutate(\n { project: props.project, id: props.initial.id, patch: { window, limits, onBreach } },\n onSettled,\n );\n return;\n }\n createMut.mutate(\n {\n project: props.project,\n input: {\n scopeKind,\n // Only route/connection budgets carry a scope id; the server refuses one elsewhere.\n ...(scopeIdRequired ? { scopeId: scopeId.trim() } : {}),\n window,\n limits,\n onBreach,\n },\n },\n onSettled,\n );\n }\n\n const enterSubmit = useEnterSubmit(save, { enabled: canSave });\n\n return (\n <Modal title={props.initial ? \"Edit model budget\" : \"Add model budget\"} onClose={props.onClose}>\n <div className=\"modal-body\">\n <label className=\"field\">\n <span>Scope</span>\n <select\n value={scopeKind}\n disabled={isEdit}\n onChange={(e) => setScopeKind(e.target.value)}\n data-testid=\"model-budget-scope-kind\"\n >\n {/* An existing row's kind is shown even if this list does not know it. */}\n {!(SCOPE_KINDS as readonly string[]).includes(scopeKind) && (\n <option value={scopeKind}>{scopeKind}</option>\n )}\n {SCOPE_KINDS.map((k) => (\n <option key={k} value={k}>\n {SCOPE_LABEL[k]}\n </option>\n ))}\n </select>\n {!isEdit && (\n <span className=\"hint\">\n What the budget caps — this tenant, account or project as a whole, or one model route\n or connection. Fixed once created.\n </span>\n )}\n </label>\n\n {scopeIdRequired && (\n <label className=\"field\">\n <span>{scopeKind === \"route\" ? \"Route\" : \"Connection id\"} *</span>\n <input\n type=\"text\"\n value={scopeId}\n disabled={isEdit}\n onChange={(e) => setScopeId(e.target.value)}\n placeholder={scopeKind === \"route\" ? \"e.g. fast\" : \"e.g. conn_…\"}\n data-testid=\"model-budget-scope-id\"\n {...enterSubmit}\n />\n {!isEdit && (\n <span className=\"hint\">\n {scopeKind === \"route\"\n ? \"The route's name or id. Required for a route budget.\"\n : \"The model-provider connection's id. Required for a connection budget.\"}\n </span>\n )}\n </label>\n )}\n\n <label className=\"field\">\n <span>Window</span>\n <select\n value={window}\n onChange={(e) => setWindow(e.target.value)}\n data-testid=\"model-budget-window\"\n >\n {!(WINDOWS as readonly string[]).includes(window) && (\n <option value={window}>{window}</option>\n )}\n {WINDOWS.map((w) => (\n <option key={w} value={w}>\n {w}\n </option>\n ))}\n </select>\n <span className=\"hint\">The period the limits reset over, in UTC.</span>\n </label>\n\n <label className=\"field\">\n <span>Requests</span>\n <input\n type=\"number\"\n min={0}\n value={requests}\n onChange={(e) => setRequests(e.target.value)}\n placeholder=\"Unlimited\"\n data-testid=\"model-budget-requests\"\n {...enterSubmit}\n />\n </label>\n\n <label className=\"field\">\n <span>Tokens</span>\n <input\n type=\"number\"\n min={0}\n value={tokens}\n onChange={(e) => setTokens(e.target.value)}\n placeholder=\"Unlimited\"\n data-testid=\"model-budget-tokens\"\n {...enterSubmit}\n />\n </label>\n\n <label className=\"field\">\n <span>Cost</span>\n <input\n type=\"number\"\n min={0}\n step=\"0.01\"\n value={cost}\n onChange={(e) => setCost(e.target.value)}\n placeholder=\"Unlimited\"\n data-testid=\"model-budget-cost\"\n {...enterSubmit}\n />\n <span className=\"hint\">In major units of the currency below (12.50 = 12.50 USD).</span>\n </label>\n\n <label className=\"field\">\n <span>Currency</span>\n <input\n type=\"text\"\n value={currency}\n onChange={(e) => setCurrency(e.target.value)}\n placeholder=\"USD\"\n maxLength={8}\n data-testid=\"model-budget-currency\"\n {...enterSubmit}\n />\n </label>\n\n <label className=\"field\">\n <span>On breach</span>\n <select\n value={onBreach}\n onChange={(e) => setOnBreach(e.target.value as \"block\" | \"warn\")}\n data-testid=\"model-budget-on-breach\"\n >\n {BREACHES.map((b) => (\n <option key={b} value={b}>\n {b}\n </option>\n ))}\n </select>\n <span className=\"hint\">\n `block` refuses calls past the limit; `warn` lets them through and flags them.\n </span>\n </label>\n\n {error && (\n <div className=\"result error\" data-testid=\"model-budget-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-budget-save\"\n >\n {saving ? \"Saving…\" : isEdit ? \"Save changes\" : \"Save budget\"}\n </button>\n </div>\n </Modal>\n );\n}\n"],"names":["TYPES","previewValue","v","s","VarsManager","props","slots","project","useEditorProject","modal","setModal","useState","pending","setPending","varsQuery","useVarsQuery","deleteMut","useDeleteVarMutation","canCreate","openCreate","header","jsx","jsxs","actionsSlot","actions","empty","EmptyState","columns","Copyable","Fragment","CallFromCodeButton","EditButton","DeleteButton","_a","DataTable","VarModal","ConfirmModal","isEdit","name","setName","type","setType","_b","raw","setRaw","description","setDescription","_c","error","setError","parseValue","n","e","createMut","useCreateVarMutation","updateMut","useUpdateVarMutation","saving","save","parsed","onSettled","ApiError","enterSubmit","useEnterSubmit","Modal","t","SecretsManager","secretsQuery","useSecretsQuery","useDeleteSecretMutation","SecretModal","value","setValue","useCreateSecretMutation","useUpdateSecretMutation","saveMut","canSave","handleSave","UNIT_LABEL","BREACHES","SCOPE_KINDS","SCOPE_LABEL","needsScopeId","kind","WINDOWS","grouped","meterFormatter","unit","currency","meterUnit","limits","costLimitText","limitsSummary","parts","cost","scopeSummary","b","budgetErrorCopy","optionalNumber","trimmed","ModelBudgetsManager","editing","setEditing","deleteError","setDeleteError","budgetsQuery","useModelBudgetsQuery","useDeleteModelBudgetMutation","budgets","BudgetRowMeter","BudgetModal","target","usageQuery","useModelBudgetUsageQuery","usage","BudgetMeter","scopeKind","setScopeKind","scopeId","setScopeId","window","setWindow","requests","setRequests","_d","tokens","setTokens","_e","setCost","_f","setCurrency","_g","onBreach","setOnBreach","_h","useCreateModelBudgetMutation","useUpdateModelBudgetMutation","scopeIdRequired","buildLimits","req","tok","costMajor","k","w"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"forms.mjs","sources":["../src/forms/VarsManager.tsx","../src/forms/SecretsManager.tsx","../src/forms/ModelBudgetsManager.tsx"],"sourcesContent":["/**\n * `<VarsManager>` — list, add, edit and delete the project's variables. Variables are\n * plaintext typed values scoped to ONE project (secrets, by contrast, are per account — see\n * `SecretsManager`).\n *\n * The project comes from `useEditorProject(project)`: omitted defers to `<W6WEmbedProvider\n * project>`; `null` or `\"\"` REFUSES — the list query is disabled, no `/vars` request is sent and\n * \"Add\" is disabled. Every list/create/update/delete call names the resolved project, never\n * `undefined` (a project-less write lands in the account default project).\n */\nimport { ApiError } from \"@w6w/sdk\";\nimport type { Var, VarType } 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 { CallFromCodeButton } from \"../chrome/CallFromCodeButton.tsx\";\nimport { ConfirmModal } from \"../chrome/ConfirmModal.tsx\";\nimport { Modal } from \"../chrome/Modal.tsx\";\nimport { useEditorProject } from \"../project-context.ts\";\nimport {\n useCreateVarMutation,\n useDeleteVarMutation,\n useUpdateVarMutation,\n useVarsQuery,\n} from \"../repos/vars.ts\";\n\nconst TYPES: readonly VarType[] = [\"string\", \"number\", \"boolean\", \"json\"];\n\n/** What a function-form `actions` slot receives. */\nexport interface ConfigManagerActionsApi {\n /** Open the create form (a no-op while the manager is refusing, e.g. no project). */\n openCreate: () => void;\n /** `false` when the create control must be disabled (no project). */\n canCreate: boolean;\n}\n\n/**\n * Each slot: omitted ⇒ the built-in default; `null` ⇒ nothing; a node replaces it. `actions` also\n * accepts a function so a host that replaces the default \"+ Add\" button can still open the form.\n */\nexport interface VarsManagerSlots {\n /** The section heading + description. */\n header?: ReactNode;\n /** The trailing control(s) of the head row (the \"+ Add variable\" button). */\n actions?: ReactNode | ((api: ConfigManagerActionsApi) => ReactNode);\n /** Shown instead of the list when there are no variables. */\n empty?: ReactNode;\n}\n\nexport interface VarsManagerProps {\n /**\n * The project whose variables are managed. Omitted: the `<W6WEmbedProvider project>`. `null` or\n * `\"\"`: no project — nothing is requested and nothing can be written.\n */\n project?: string | null;\n slots?: VarsManagerSlots;\n}\n\n/** One-line preview of a var's current value, safe against long strings. */\nfunction previewValue(v: Var): string {\n if (v.type === \"boolean\") return String(v.value);\n if (v.type === \"number\") return String(v.value);\n if (v.type === \"string\") return String(v.value);\n const s = JSON.stringify(v.value);\n return s.length > 80 ? `${s.slice(0, 80)}…` : s;\n}\n\nexport function VarsManager(props: VarsManagerProps): ReactNode {\n const slots = props.slots;\n const project = useEditorProject(props.project);\n const [modal, setModal] = useState<{ mode: \"create\" } | { mode: \"edit\"; v: Var } | null>(null);\n const [pending, setPending] = useState<Var | null>(null);\n\n const varsQuery = useVarsQuery(project ?? undefined, project != null);\n const deleteMut = useDeleteVarMutation();\n const canCreate = project != null;\n const openCreate = () => {\n if (project != null) setModal({ mode: \"create\" });\n };\n\n const header =\n slots?.header === undefined ? (\n <div>\n <h3>Variables</h3>\n <p className=\"muted small\">\n User-defined typed values addressable by name. Plaintext — use <strong>Secrets</strong>{\" \"}\n for sensitive values.\n </p>\n </div>\n ) : (\n slots.header\n );\n const actionsSlot = slots?.actions;\n const actions =\n actionsSlot === undefined ? (\n <button type=\"button\" className=\"btn\" disabled={!canCreate} onClick={openCreate}>\n + Add variable\n </button>\n ) : typeof actionsSlot === \"function\" ? (\n actionsSlot({ openCreate, canCreate })\n ) : (\n actionsSlot\n );\n const empty =\n slots?.empty === undefined ? (\n <EmptyState testId=\"vars-manager-empty\">No variables yet.</EmptyState>\n ) : (\n slots.empty\n );\n\n const columns: DataTableColumn<Var>[] = [\n {\n key: \"name\",\n header: \"Variable\",\n render: (v) => (\n <div className=\"list-main\" style={{ maxWidth: 0, minWidth: \"100%\" }}>\n <strong className=\"list-name\" title={v.name}>\n {v.name}\n </strong>{\" \"}\n <span className=\"tag\">{v.type}</span>\n {/* The value is plain muted text on one line (ellipsis), not a boxed field. */}\n <div className=\"muted small list-preview\" title={previewValue(v)}>\n {previewValue(v)}\n {v.description && <> · {v.description}</>}\n </div>\n </div>\n ),\n },\n {\n key: \"actions\",\n header: \"\",\n align: \"right\",\n // Shrink to the buttons: the name cell's `maxWidth: 0` would otherwise split the width evenly.\n width: \"1%\",\n link: false,\n render: (v) => (\n <div style={{ display: \"flex\", gap: \"var(--w6w-sp-1-5)\", whiteSpace: \"nowrap\" }}>\n <CallFromCodeButton resource={{ kind: \"var\", name: v.name }} />\n <EditButton\n label=\"Edit\"\n onClick={() => setModal({ mode: \"edit\", v })}\n data-testid={`var-edit-${v.id}`}\n />\n <DeleteButton\n label=\"Delete\"\n onClick={() => setPending(v)}\n disabled={deleteMut.isPending}\n data-testid={`var-delete-${v.id}`}\n />\n </div>\n ),\n },\n ];\n\n return (\n <div className=\"w6w-embed-root\">\n <section className=\"section\">\n {(header != null || actions != null) && (\n <div className=\"section-head\">\n {header}\n {actions}\n </div>\n )}\n\n {/* No `.card` around it: the table frame and the empty state draw their own border,\n and a card around either is a card in a card. */}\n {varsQuery.isLoading && <p className=\"muted\">Loading…</p>}\n {varsQuery.data?.length === 0 && empty}\n {varsQuery.data != null && varsQuery.data.length > 0 && (\n <DataTable\n className=\"w6w-data-table-rows\"\n columns={columns}\n rows={varsQuery.data}\n rowKey={(v) => v.id}\n />\n )}\n\n {modal && project != null && (\n <VarModal\n project={project}\n initial={modal.mode === \"edit\" ? modal.v : undefined}\n onClose={() => setModal(null)}\n onSaved={() => setModal(null)}\n />\n )}\n\n {pending && project != null && (\n <ConfirmModal\n title=\"Delete variable\"\n message={`Delete the variable \"${pending.name}\"? This cannot be undone.`}\n confirmLabel=\"Delete\"\n onConfirm={() => {\n deleteMut.mutate({ id: pending.id, project });\n setPending(null);\n }}\n onClose={() => setPending(null)}\n />\n )}\n </section>\n </div>\n );\n}\n\n/**\n * Create/edit modal. The value widget switches on `type`; the raw string in the form is parsed to\n * the declared type at submit time so what's stored round-trips faithfully (e.g. the number `42`,\n * not the string `\"42\"`).\n */\nfunction VarModal(props: {\n project: string;\n initial?: Var;\n onClose: () => void;\n onSaved: () => void;\n}) {\n const isEdit = !!props.initial;\n const [name, setName] = useState(props.initial?.name ?? \"\");\n const [type, setType] = useState<VarType>(props.initial?.type ?? \"string\");\n const [raw, setRaw] = useState<string>(() => {\n if (!props.initial) return \"\";\n if (props.initial.type === \"string\") return String(props.initial.value ?? \"\");\n return JSON.stringify(props.initial.value, null, 2);\n });\n const [description, setDescription] = useState(props.initial?.description ?? \"\");\n const [error, setError] = useState<string | null>(null);\n\n /** Parse the raw string into a value that matches `type`. */\n function parseValue(): { ok: true; value: unknown } | { ok: false; error: string } {\n if (type === \"string\") return { ok: true, value: raw };\n if (type === \"boolean\") {\n if (raw === \"true\") return { ok: true, value: true };\n if (raw === \"false\") return { ok: true, value: false };\n return { ok: false, error: \"Value must be `true` or `false`.\" };\n }\n if (type === \"number\") {\n const n = Number(raw);\n if (!Number.isFinite(n)) return { ok: false, error: \"Value must be a finite number.\" };\n return { ok: true, value: n };\n }\n // json\n try {\n return { ok: true, value: JSON.parse(raw) };\n } catch (e) {\n return { ok: false, error: `Invalid JSON: ${(e as Error).message}` };\n }\n }\n\n const createMut = useCreateVarMutation();\n const updateMut = useUpdateVarMutation();\n const saving = createMut.isPending || updateMut.isPending;\n\n function save() {\n const parsed = parseValue();\n if (!parsed.ok) {\n setError(parsed.error);\n return;\n }\n setError(null);\n const onSettled = {\n onSuccess: () => props.onSaved(),\n onError: (e: unknown) => setError(e instanceof ApiError ? e.message : (e as Error).message),\n };\n if (props.initial) {\n updateMut.mutate(\n {\n id: props.initial.id,\n patch: { type, value: parsed.value, description },\n project: props.project,\n },\n onSettled,\n );\n return;\n }\n createMut.mutate(\n { input: { name, type, value: parsed.value, description }, project: props.project },\n onSettled,\n );\n }\n\n const enterSubmit = useEnterSubmit(save, { enabled: !!name && !saving });\n\n return (\n <Modal\n title={props.initial ? `Edit ${props.initial.name}` : \"Add variable\"}\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. api_base_url\"\n maxLength={64}\n {...enterSubmit}\n />\n {!isEdit && (\n <span className=\"hint\">\n Letters, digits, and underscores. Must start with a letter or underscore.\n Case-sensitive.\n </span>\n )}\n </label>\n\n <label className=\"field\">\n <span>Type</span>\n <select value={type} onChange={(e) => setType(e.target.value as VarType)}>\n {TYPES.map((t) => (\n <option key={t} value={t}>\n {t}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"field\" htmlFor=\"var-value\">\n <span>Value</span>\n {type === \"boolean\" ? (\n <select id=\"var-value\" value={raw || \"true\"} onChange={(e) => setRaw(e.target.value)}>\n <option value=\"true\">true</option>\n <option value=\"false\">false</option>\n </select>\n ) : type === \"number\" ? (\n <input\n id=\"var-value\"\n type=\"number\"\n value={raw}\n onChange={(e) => setRaw(e.target.value)}\n placeholder=\"0\"\n {...enterSubmit}\n />\n ) : type === \"json\" ? (\n <textarea\n id=\"var-value\"\n className=\"code\"\n rows={6}\n value={raw}\n onChange={(e) => setRaw(e.target.value)}\n placeholder='{\"key\": \"value\"}'\n />\n ) : (\n <input\n id=\"var-value\"\n type=\"text\"\n value={raw}\n onChange={(e) => setRaw(e.target.value)}\n placeholder=\"\"\n {...enterSubmit}\n />\n )}\n </label>\n\n <label className=\"field\">\n <span>Description</span>\n <input\n type=\"text\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Optional\"\n {...enterSubmit}\n />\n </label>\n\n {error && <div className=\"result error\">{error}</div>}\n </div>\n <div className=\"modal-actions\">\n <button type=\"button\" className=\"btn ghost\" onClick={props.onClose}>\n Cancel\n </button>\n <button type=\"button\" className=\"btn\" disabled={!name || saving} onClick={save}>\n {saving ? \"Saving…\" : isEdit ? \"Save changes\" : \"Save variable\"}\n </button>\n </div>\n </Modal>\n );\n}\n","/**\n * `<SecretsManager>` — list, add, rotate and delete the account's secrets (vault). Secrets are\n * per ACCOUNT, not per project (variables are per project — see `VarsManager`), so there is no\n * `project` prop.\n *\n * WRITE-ONLY. A secret's value is typed into a form and sent; it is never read back. The value\n * field starts empty in create and in rotate; a blank rotate sends no `value` key; a blank create\n * is refused before any request; rows render only `name`, `description`, `updatedAt` and a fixed\n * mask — a row object is never spread or stringified, so a server that wrongly returns `value`\n * cannot reach the DOM. No prop receives, and no callback is handed, a secret value, and nothing\n * here writes the `[\"secrets\"]` cache (only the repo's own invalidation).\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 {\n type VaultSecretSummary,\n useCreateSecretMutation,\n useDeleteSecretMutation,\n useSecretsQuery,\n useUpdateSecretMutation,\n} from \"../repos/vault.ts\";\nimport type { ConfigManagerActionsApi } from \"./VarsManager.tsx\";\n\n/** Same contract as `VarsManagerSlots`: omitted ⇒ default, `null` ⇒ nothing, a node replaces. */\nexport interface SecretsManagerSlots {\n header?: ReactNode;\n actions?: ReactNode | ((api: ConfigManagerActionsApi) => ReactNode);\n empty?: ReactNode;\n}\n\nexport interface SecretsManagerProps {\n slots?: SecretsManagerSlots;\n}\n\nexport function SecretsManager(props: SecretsManagerProps): ReactNode {\n const slots = props.slots;\n const [modal, setModal] = useState<\n { mode: \"create\" } | { mode: \"edit\"; s: VaultSecretSummary } | null\n >(null);\n const [pending, setPending] = useState<VaultSecretSummary | null>(null);\n\n const secretsQuery = useSecretsQuery();\n const deleteMut = useDeleteSecretMutation();\n const openCreate = () => setModal({ mode: \"create\" });\n\n const header =\n slots?.header === undefined ? (\n <div>\n <h3>Secrets</h3>\n <p className=\"muted small\">\n Secrets addressable by name. Stored encrypted at rest and never returned from the server —\n to change a secret, overwrite it.\n </p>\n </div>\n ) : (\n slots.header\n );\n const actionsSlot = slots?.actions;\n const actions =\n actionsSlot === undefined ? (\n <button type=\"button\" className=\"btn\" onClick={openCreate}>\n + Add secret\n </button>\n ) : typeof actionsSlot === \"function\" ? (\n actionsSlot({ openCreate, canCreate: true })\n ) : (\n actionsSlot\n );\n const empty =\n slots?.empty === undefined ? (\n <EmptyState testId=\"secrets-manager-empty\">No secrets yet.</EmptyState>\n ) : (\n slots.empty\n );\n\n const columns: DataTableColumn<VaultSecretSummary>[] = [\n {\n key: \"name\",\n header: \"Secret\",\n render: (s) => (\n <div className=\"list-main\" style={{ maxWidth: 0, minWidth: \"100%\" }}>\n <strong className=\"list-name\" title={s.name}>\n {s.name}\n </strong>{\" \"}\n <code className=\"muted small\">••••••••</code>\n <div className=\"muted small list-preview\">\n {s.description && <>{s.description} · </>}\n updated {new Date(s.updatedAt).toLocaleString()}\n </div>\n </div>\n ),\n },\n {\n key: \"actions\",\n header: \"\",\n align: \"right\",\n // Shrink to the buttons: the name cell's `maxWidth: 0` would otherwise split the width evenly.\n width: \"1%\",\n link: false,\n render: (s) => (\n <div style={{ display: \"flex\", gap: \"var(--w6w-sp-1-5)\", whiteSpace: \"nowrap\" }}>\n <EditButton\n label=\"Rotate\"\n onClick={() => setModal({ mode: \"edit\", s })}\n data-testid={`secret-rotate-${s.id}`}\n />\n <DeleteButton\n label=\"Delete\"\n onClick={() => setPending(s)}\n disabled={deleteMut.isPending}\n data-testid={`secret-delete-${s.id}`}\n />\n </div>\n ),\n },\n ];\n\n return (\n <div className=\"w6w-embed-root\">\n <section className=\"section\">\n {(header != null || actions != null) && (\n <div className=\"section-head\">\n {header}\n {actions}\n </div>\n )}\n\n {/* No `.card` around it: the table frame and the empty state draw their own border,\n and a card around either is a card in a card. */}\n {secretsQuery.isLoading && <p className=\"muted\">Loading…</p>}\n {secretsQuery.data?.length === 0 && empty}\n {secretsQuery.data != null && secretsQuery.data.length > 0 && (\n <DataTable\n className=\"w6w-data-table-rows\"\n columns={columns}\n rows={secretsQuery.data}\n rowKey={(s) => s.id}\n />\n )}\n\n {modal && (\n <SecretModal\n initial={modal.mode === \"edit\" ? modal.s : undefined}\n onClose={() => setModal(null)}\n onSaved={() => setModal(null)}\n />\n )}\n\n {pending && (\n <ConfirmModal\n title=\"Delete secret\"\n message={`Delete the secret \"${pending.name}\"? This cannot be undone.`}\n confirmLabel=\"Delete\"\n onConfirm={() => {\n deleteMut.mutate(pending.id);\n setPending(null);\n }}\n onClose={() => setPending(null)}\n />\n )}\n </section>\n </div>\n );\n}\n\n/**\n * Create/rotate a secret. On edit, the current value is intentionally not pre-filled — the server\n * never returns it. Leaving the value blank in edit mode updates only the description.\n */\nfunction SecretModal(props: {\n initial?: VaultSecretSummary;\n onClose: () => void;\n onSaved: () => void;\n}) {\n const isEdit = !!props.initial;\n const [name, setName] = useState(props.initial?.name ?? \"\");\n const [value, setValue] = useState(\"\");\n const [description, setDescription] = useState(props.initial?.description ?? \"\");\n const [error, setError] = useState<string | null>(null);\n\n const createMut = useCreateSecretMutation();\n const updateMut = useUpdateSecretMutation(props.initial?.id ?? \"\");\n const saveMut = isEdit ? updateMut : createMut;\n const canSave = !!name && (isEdit || !!value) && !saveMut.isPending;\n\n function handleSave() {\n setError(null);\n if (isEdit) {\n updateMut.mutate(\n { value: value === \"\" ? undefined : value, description },\n {\n onSuccess: () => props.onSaved(),\n onError: (e) => setError(e instanceof ApiError ? e.message : (e as Error).message),\n },\n );\n return;\n }\n if (value === \"\") {\n setError(\"A secret value is required.\");\n return;\n }\n createMut.mutate(\n { name, value, description },\n {\n onSuccess: () => props.onSaved(),\n onError: (e) => setError(e instanceof ApiError ? e.message : (e as Error).message),\n },\n );\n }\n const enterSubmit = useEnterSubmit(handleSave, { enabled: canSave });\n\n return (\n <Modal\n title={props.initial ? `Rotate ${props.initial.name}` : \"Add secret\"}\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. openai_api_key\"\n maxLength={64}\n {...enterSubmit}\n />\n {!isEdit && (\n <span className=\"hint\">\n Letters, digits, and underscores. Must start with a letter or underscore.\n Case-sensitive.\n </span>\n )}\n </label>\n\n <label className=\"field\">\n <span>{isEdit ? \"New value\" : \"Value\"}</span>\n <textarea\n className=\"code\"\n rows={3}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={isEdit ? \"Leave blank to keep the current value\" : \"sk-…\"}\n autoComplete=\"off\"\n spellCheck={false}\n />\n <span className=\"hint\">\n Stored encrypted at rest. Once saved, it is not readable through the UI.\n </span>\n </label>\n\n <label className=\"field\">\n <span>Description</span>\n <input\n type=\"text\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Optional\"\n {...enterSubmit}\n />\n </label>\n\n {error && <div className=\"result error\">{error}</div>}\n </div>\n <div className=\"modal-actions\">\n <button type=\"button\" className=\"btn ghost\" onClick={props.onClose}>\n Cancel\n </button>\n <button type=\"button\" className=\"btn\" disabled={!canSave} onClick={handleSave}>\n {saveMut.isPending ? \"Saving…\" : isEdit ? \"Save changes\" : \"Save secret\"}\n </button>\n </div>\n </Modal>\n );\n}\n","/**\n * `<ModelBudgetsManager>` — list, add, edit and delete the project's model budgets, each with a\n * usage meter fed by the budget's usage endpoint (spend so far and what is reserved for in-flight\n * calls, against the limit).\n *\n * The project comes from `useEditorProject(projectId)`: omitted defers to `<W6WEmbedProvider\n * project>`; `null` or `\"\"` REFUSES — the list query is disabled, no `/model-budgets` request is\n * sent and \"Add\" is disabled. Every write names the resolved project, never `undefined`.\n *\n * A budget is a scope (`scopeKind`, plus a `scopeId` for the route and connection kinds only), a\n * `window` (`day` or `month`) and one or more `limits`. The row's meter measures ONE of them —\n * cost when the budget has a cost limit, else tokens, else requests — because a meter needs a\n * single number pair; the limits column prints them all.\n */\nimport { ApiError } from \"@w6w/sdk\";\nimport {\n BudgetMeter,\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 {\n type ModelBudget,\n type ModelBudgetLimits,\n useCreateModelBudgetMutation,\n useDeleteModelBudgetMutation,\n useModelBudgetUsageQuery,\n useModelBudgetsQuery,\n useUpdateModelBudgetMutation,\n} from \"../repos/models.ts\";\n\nexport interface ModelBudgetsManagerProps {\n /**\n * The project whose budgets 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}\n\ntype MeterUnit = \"costMinor\" | \"tokens\" | \"requests\";\n\nconst UNIT_LABEL: Record<MeterUnit, string> = {\n costMinor: \"Cost\",\n tokens: \"Tokens\",\n requests: \"Requests\",\n};\n\nconst BREACHES = [\"block\", \"warn\"] as const;\n\n/**\n * The scopes the server accepts (`admin/model-budgets.ts` `SCOPE_KINDS`). `route` and `connection`\n * REQUIRE a scope id (the route name/id, the connection id); the other three refuse one — they cap\n * the caller's own tenant, account or project.\n */\nconst SCOPE_KINDS = [\"tenant\", \"account\", \"project\", \"route\", \"connection\"] as const;\ntype ScopeKind = (typeof SCOPE_KINDS)[number];\nconst SCOPE_LABEL: Record<ScopeKind, string> = {\n tenant: \"Tenant\",\n account: \"Account\",\n project: \"Project\",\n route: \"Model route\",\n connection: \"Connection\",\n};\nconst needsScopeId = (kind: string): boolean => kind === \"route\" || kind === \"connection\";\n\n/** The windows the server accepts; limits reset at the start of each UTC day or month. */\nconst WINDOWS = [\"day\", \"month\"] as const;\n\n/** Plain thousands separators — no `Intl`, so the text is identical in every host and test. */\nfunction grouped(n: number): string {\n return String(n).replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n}\n\n/** Minor units print as `<CUR> 12.34`; counts keep the plain grouping. */\nfunction meterFormatter(unit: MeterUnit, currency: string): (n: number) => string {\n if (unit === \"costMinor\") return (n) => `${currency} ${(n / 100).toFixed(2)}`;\n return grouped;\n}\n\n/** Which limit the row's meter measures: cost if set, else tokens, else requests. */\nfunction meterUnit(limits: ModelBudgetLimits): MeterUnit | null {\n if (limits.costMinor != null) return \"costMinor\";\n if (limits.tokens != null) return \"tokens\";\n if (limits.requests != null) return \"requests\";\n return null;\n}\n\nfunction costLimitText(limits: ModelBudgetLimits): string | null {\n if (limits.costMinor == null) return null;\n return `${limits.currency ?? \"USD\"} ${(limits.costMinor / 100).toFixed(2)}`;\n}\n\n/** Every configured limit, one line — the meter covers only the primary one. */\nfunction limitsSummary(limits: ModelBudgetLimits): string {\n const parts: string[] = [];\n if (limits.requests != null) parts.push(`${grouped(limits.requests)} requests`);\n if (limits.tokens != null) parts.push(`${grouped(limits.tokens)} tokens`);\n const cost = costLimitText(limits);\n if (cost != null) parts.push(cost);\n return parts.length === 0 ? \"no limit\" : parts.join(\" · \");\n}\n\nfunction scopeSummary(b: ModelBudget): string {\n return b.scopeId == null ? `this ${b.scopeKind}` : `${b.scopeKind} ${b.scopeId}`;\n}\n\n/** Unknown-but-named failures fall back to the server's own message. */\nfunction budgetErrorCopy(e: unknown): string {\n if (e instanceof ApiError) return e.message;\n return e instanceof Error ? e.message : String(e);\n}\n\n/** `null` for a blank field so an unset limit stays absent instead of becoming `0`. */\nfunction optionalNumber(raw: string): number | null {\n const trimmed = raw.trim();\n if (trimmed === \"\") return null;\n const n = Number(trimmed);\n return Number.isFinite(n) ? n : null;\n}\n\nexport function ModelBudgetsManager(props: ModelBudgetsManagerProps): ReactNode {\n const project = useEditorProject(props.projectId);\n const [editing, setEditing] = useState<{ budget?: ModelBudget } | null>(null);\n const [pending, setPending] = useState<ModelBudget | null>(null);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n\n const budgetsQuery = useModelBudgetsQuery(project ?? undefined);\n const deleteMut = useDeleteModelBudgetMutation();\n const budgets = budgetsQuery.data ?? [];\n const canCreate = project != null;\n\n const columns: DataTableColumn<ModelBudget>[] = [\n {\n key: \"scope\",\n header: \"Scope\",\n render: (b) => (\n <div className=\"list-main\" style={{ maxWidth: 0, minWidth: \"100%\" }}>\n <strong className=\"list-name\" title={scopeSummary(b)}>\n {b.scopeKind}\n </strong>{\" \"}\n <span className={b.onBreach === \"warn\" ? \"tag warn\" : \"tag\"}>{b.onBreach}</span>\n <div className=\"muted small list-preview\" title={scopeSummary(b)}>\n {b.scopeId == null ? `the whole ${b.scopeKind}` : b.scopeId}\n </div>\n </div>\n ),\n },\n {\n key: \"window\",\n header: \"Window\",\n render: (b) => b.window,\n },\n {\n key: \"limits\",\n header: \"Limit\",\n render: (b) => <span className=\"muted small\">{limitsSummary(b.limits)}</span>,\n },\n {\n key: \"usage\",\n header: \"Used\",\n // Rows only exist once the project-scoped query ran, so `project` is set here.\n render: (b) => (project == null ? null : <BudgetRowMeter budget={b} projectId={project} />),\n },\n {\n key: \"actions\",\n header: \"\",\n align: \"right\",\n link: false,\n render: (b) => (\n <div style={{ display: \"flex\", gap: \"var(--w6w-sp-1-5)\" }}>\n <EditButton\n label=\"Edit\"\n onClick={() => setEditing({ budget: b })}\n data-testid={`model-budget-edit-${b.id}`}\n />\n <DeleteButton\n label=\"Delete\"\n onClick={() => setPending(b)}\n disabled={deleteMut.isPending}\n data-testid={`model-budget-delete-${b.id}`}\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 budgets</h3>\n <p className=\"muted small\">\n Caps on what a tenant, account, project, route or connection may spend. A breached\n budget either warns or blocks the call, per its own setting.\n </p>\n </div>\n <button\n type=\"button\"\n className=\"btn\"\n disabled={!canCreate}\n onClick={() => setEditing({})}\n data-testid=\"model-budget-add\"\n >\n + Add budget\n </button>\n </div>\n\n {deleteError && (\n <div className=\"result error\" role=\"alert\" data-testid=\"model-budget-delete-error\">\n {deleteError}\n </div>\n )}\n\n <div>\n {budgetsQuery.isLoading && <p className=\"muted\">Loading…</p>}\n {budgetsQuery.data?.length === 0 && (\n <EmptyState testId=\"model-budgets-empty\">\n No model budgets yet. Add one to cap spend or request volume.\n </EmptyState>\n )}\n {budgets.length > 0 && (\n <DataTable\n columns={columns}\n rows={budgets}\n rowKey={(b) => b.id}\n testId=\"model-budgets-table\"\n />\n )}\n </div>\n\n {editing != null && project != null && (\n <BudgetModal\n project={project}\n initial={editing.budget}\n onClose={() => setEditing(null)}\n onSaved={() => setEditing(null)}\n />\n )}\n\n {pending != null && project != null && (\n <ConfirmModal\n title=\"Delete model budget\"\n message={`Delete the budget on ${scopeSummary(pending)}? Calls stop being capped by it immediately.`}\n confirmLabel=\"Delete\"\n onConfirm={() => {\n const target = pending;\n setDeleteError(null);\n deleteMut.mutate(\n { project, id: target.id },\n {\n onError: (e: unknown) =>\n setDeleteError(\n `Could not delete the budget on ${scopeSummary(target)}: ${budgetErrorCopy(e)}`,\n ),\n },\n );\n setPending(null);\n }}\n onClose={() => setPending(null)}\n />\n )}\n </section>\n </div>\n );\n}\n\n/**\n * One budget's meter, from ITS usage endpoint: `used` and `reserved` come from the server, never\n * from the list row, so the pair a call is measured against is the one the server enforces.\n */\nfunction BudgetRowMeter(props: { budget: ModelBudget; projectId: string }): ReactNode {\n const usageQuery = useModelBudgetUsageQuery(props.budget.id, props.projectId);\n if (usageQuery.isLoading) return <span className=\"muted small\">Loading…</span>;\n const usage = usageQuery.data;\n if (usage == null) return <span className=\"muted small\">—</span>;\n // The usage endpoint reports the limits actually in force (it echoes the budget's own).\n const limits = usage.limits ?? props.budget.limits;\n const unit = meterUnit(limits);\n if (unit == null) return <span className=\"muted small\">no limit</span>;\n return (\n <BudgetMeter\n label={UNIT_LABEL[unit]}\n used={usage.used[unit]}\n limit={limits[unit] ?? 0}\n reserved={usage.reserved[unit]}\n format={meterFormatter(unit, limits.currency ?? \"USD\")}\n testId={`model-budget-meter-${props.budget.id}`}\n />\n );\n}\n\n/**\n * Create/edit modal. `scopeKind`/`scopeId` are the budget's address and are fixed once created\n * (the server patches a budget by id); window, limits and the breach behaviour stay editable.\n */\nfunction BudgetModal(props: {\n project: string;\n initial?: ModelBudget;\n onClose: () => void;\n onSaved: () => void;\n}) {\n const isEdit = !!props.initial;\n const [scopeKind, setScopeKind] = useState(props.initial?.scopeKind ?? \"project\");\n const [scopeId, setScopeId] = useState(props.initial?.scopeId ?? \"\");\n const [window, setWindow] = useState(props.initial?.window ?? \"day\");\n const [requests, setRequests] = useState(\n props.initial?.limits.requests != null ? String(props.initial.limits.requests) : \"\",\n );\n const [tokens, setTokens] = useState(\n props.initial?.limits.tokens != null ? String(props.initial.limits.tokens) : \"\",\n );\n const [cost, setCost] = useState(\n props.initial?.limits.costMinor != null ? String(props.initial.limits.costMinor / 100) : \"\",\n );\n const [currency, setCurrency] = useState(props.initial?.limits.currency ?? \"\");\n const [onBreach, setOnBreach] = useState<\"block\" | \"warn\">(props.initial?.onBreach ?? \"warn\");\n const [error, setError] = useState<string | null>(null);\n\n const createMut = useCreateModelBudgetMutation();\n const updateMut = useUpdateModelBudgetMutation();\n const saving = createMut.isPending || updateMut.isPending;\n const scopeIdRequired = needsScopeId(scopeKind);\n const canSave =\n !!scopeKind && !!window && (!scopeIdRequired || isEdit || scopeId.trim() !== \"\") && !saving;\n\n /** The typed limits, with blank fields left out; `cost` is entered in major units. */\n function buildLimits(): ModelBudgetLimits | null {\n const limits: ModelBudgetLimits = {};\n const req = optionalNumber(requests);\n if (req != null) limits.requests = req;\n const tok = optionalNumber(tokens);\n if (tok != null) limits.tokens = tok;\n const costMajor = optionalNumber(cost);\n if (costMajor != null) limits.costMinor = Math.round(costMajor * 100);\n if (limits.costMinor != null && currency.trim() !== \"\") limits.currency = currency.trim();\n return Object.keys(limits).length === 0 ? null : limits;\n }\n\n function save() {\n const limits = buildLimits();\n if (limits == null) {\n setError(\"Set at least one limit: requests, tokens or cost.\");\n return;\n }\n setError(null);\n const onSettled = {\n onSuccess: () => props.onSaved(),\n onError: (e: unknown) => setError(budgetErrorCopy(e)),\n };\n if (props.initial) {\n updateMut.mutate(\n { project: props.project, id: props.initial.id, patch: { window, limits, onBreach } },\n onSettled,\n );\n return;\n }\n createMut.mutate(\n {\n project: props.project,\n input: {\n scopeKind,\n // Only route/connection budgets carry a scope id; the server refuses one elsewhere.\n ...(scopeIdRequired ? { scopeId: scopeId.trim() } : {}),\n window,\n limits,\n onBreach,\n },\n },\n onSettled,\n );\n }\n\n const enterSubmit = useEnterSubmit(save, { enabled: canSave });\n\n return (\n <Modal title={props.initial ? \"Edit model budget\" : \"Add model budget\"} onClose={props.onClose}>\n <div className=\"modal-body\">\n <label className=\"field\">\n <span>Scope</span>\n <select\n value={scopeKind}\n disabled={isEdit}\n onChange={(e) => setScopeKind(e.target.value)}\n data-testid=\"model-budget-scope-kind\"\n >\n {/* An existing row's kind is shown even if this list does not know it. */}\n {!(SCOPE_KINDS as readonly string[]).includes(scopeKind) && (\n <option value={scopeKind}>{scopeKind}</option>\n )}\n {SCOPE_KINDS.map((k) => (\n <option key={k} value={k}>\n {SCOPE_LABEL[k]}\n </option>\n ))}\n </select>\n {!isEdit && (\n <span className=\"hint\">\n What the budget caps — this tenant, account or project as a whole, or one model route\n or connection. Fixed once created.\n </span>\n )}\n </label>\n\n {scopeIdRequired && (\n <label className=\"field\">\n <span>{scopeKind === \"route\" ? \"Route\" : \"Connection id\"} *</span>\n <input\n type=\"text\"\n value={scopeId}\n disabled={isEdit}\n onChange={(e) => setScopeId(e.target.value)}\n placeholder={scopeKind === \"route\" ? \"e.g. fast\" : \"e.g. conn_…\"}\n data-testid=\"model-budget-scope-id\"\n {...enterSubmit}\n />\n {!isEdit && (\n <span className=\"hint\">\n {scopeKind === \"route\"\n ? \"The route's name or id. Required for a route budget.\"\n : \"The model-provider connection's id. Required for a connection budget.\"}\n </span>\n )}\n </label>\n )}\n\n <label className=\"field\">\n <span>Window</span>\n <select\n value={window}\n onChange={(e) => setWindow(e.target.value)}\n data-testid=\"model-budget-window\"\n >\n {!(WINDOWS as readonly string[]).includes(window) && (\n <option value={window}>{window}</option>\n )}\n {WINDOWS.map((w) => (\n <option key={w} value={w}>\n {w}\n </option>\n ))}\n </select>\n <span className=\"hint\">The period the limits reset over, in UTC.</span>\n </label>\n\n <label className=\"field\">\n <span>Requests</span>\n <input\n type=\"number\"\n min={0}\n value={requests}\n onChange={(e) => setRequests(e.target.value)}\n placeholder=\"Unlimited\"\n data-testid=\"model-budget-requests\"\n {...enterSubmit}\n />\n </label>\n\n <label className=\"field\">\n <span>Tokens</span>\n <input\n type=\"number\"\n min={0}\n value={tokens}\n onChange={(e) => setTokens(e.target.value)}\n placeholder=\"Unlimited\"\n data-testid=\"model-budget-tokens\"\n {...enterSubmit}\n />\n </label>\n\n <label className=\"field\">\n <span>Cost</span>\n <input\n type=\"number\"\n min={0}\n step=\"0.01\"\n value={cost}\n onChange={(e) => setCost(e.target.value)}\n placeholder=\"Unlimited\"\n data-testid=\"model-budget-cost\"\n {...enterSubmit}\n />\n <span className=\"hint\">In major units of the currency below (12.50 = 12.50 USD).</span>\n </label>\n\n <label className=\"field\">\n <span>Currency</span>\n <input\n type=\"text\"\n value={currency}\n onChange={(e) => setCurrency(e.target.value)}\n placeholder=\"USD\"\n maxLength={8}\n data-testid=\"model-budget-currency\"\n {...enterSubmit}\n />\n </label>\n\n <label className=\"field\">\n <span>On breach</span>\n <select\n value={onBreach}\n onChange={(e) => setOnBreach(e.target.value as \"block\" | \"warn\")}\n data-testid=\"model-budget-on-breach\"\n >\n {BREACHES.map((b) => (\n <option key={b} value={b}>\n {b}\n </option>\n ))}\n </select>\n <span className=\"hint\">\n `block` refuses calls past the limit; `warn` lets them through and flags them.\n </span>\n </label>\n\n {error && (\n <div className=\"result error\" data-testid=\"model-budget-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-budget-save\"\n >\n {saving ? \"Saving…\" : isEdit ? \"Save changes\" : \"Save budget\"}\n </button>\n </div>\n </Modal>\n );\n}\n"],"names":["TYPES","previewValue","v","s","VarsManager","props","slots","project","useEditorProject","modal","setModal","useState","pending","setPending","varsQuery","useVarsQuery","deleteMut","useDeleteVarMutation","canCreate","openCreate","header","jsx","jsxs","actionsSlot","actions","empty","EmptyState","columns","Fragment","CallFromCodeButton","EditButton","DeleteButton","_a","DataTable","VarModal","ConfirmModal","isEdit","name","setName","type","setType","_b","raw","setRaw","description","setDescription","_c","error","setError","parseValue","n","e","createMut","useCreateVarMutation","updateMut","useUpdateVarMutation","saving","save","parsed","onSettled","ApiError","enterSubmit","useEnterSubmit","Modal","t","SecretsManager","secretsQuery","useSecretsQuery","useDeleteSecretMutation","SecretModal","value","setValue","useCreateSecretMutation","useUpdateSecretMutation","saveMut","canSave","handleSave","UNIT_LABEL","BREACHES","SCOPE_KINDS","SCOPE_LABEL","needsScopeId","kind","WINDOWS","grouped","meterFormatter","unit","currency","meterUnit","limits","costLimitText","limitsSummary","parts","cost","scopeSummary","b","budgetErrorCopy","optionalNumber","trimmed","ModelBudgetsManager","editing","setEditing","deleteError","setDeleteError","budgetsQuery","useModelBudgetsQuery","useDeleteModelBudgetMutation","budgets","BudgetRowMeter","BudgetModal","target","usageQuery","useModelBudgetUsageQuery","usage","BudgetMeter","scopeKind","setScopeKind","scopeId","setScopeId","window","setWindow","requests","setRequests","_d","tokens","setTokens","_e","setCost","_f","setCurrency","_g","onBreach","setOnBreach","_h","useCreateModelBudgetMutation","useUpdateModelBudgetMutation","scopeIdRequired","buildLimits","req","tok","costMajor","k","w"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -14,7 +14,7 @@ import { e as ie, c as ue } from "./data-stores-UeQvwVCa.js";
|
|
|
14
14
|
import { r as ae } from "./fields-DvS8XZFc.js";
|
|
15
15
|
import { l as ce } from "./models-bAayQPJ_.js";
|
|
16
16
|
import { path as q } from "@w6w/sdk";
|
|
17
|
-
import { s as le, t as de, J as fe } from "./workflows-
|
|
17
|
+
import { s as le, t as de, J as fe } from "./workflows-BK6IM4if.js";
|
|
18
18
|
import { E as pe } from "./theme-context-E2ZhlXDX.js";
|
|
19
19
|
class me extends Error {
|
|
20
20
|
constructor(s) {
|
package/dist/lists.mjs
CHANGED
|
@@ -7,18 +7,18 @@ import { u as G, b as Ce } from "./project-context-Tvp-La7A.js";
|
|
|
7
7
|
import { CallableList as vt, ReliabilityList as Nt, EmptyState as De, DataTable as $e, EditButton as Qe, DeleteButton as bt, ListItem as Ne, HealthStatusPill as ue, HistoryTimeline as kt, useW6WApi as Fe, connectionAppIdsToLookUp as qe, ConnectionList as Ct, AddConnectionModal as Dt, EditConnectionModal as _e, Modal as $t, resolveConnectionAppMeta as Tt, ConnectionHeader as Lt, IconButton as Mt, locateDataStoreError as It, tableSchemaOf as xt, draftFromEntry as ce, CsvPanel as Et, DataTableGrid as At, NEW_ROW_ID as te, newRowDraft as Ie, kvValueTypeOf as Rt, DataEntryList as St, DataEntryEditor as Pt, dirtyColumns as Ot, csvFilenameOf as jt, csvImportMessage as xe, buildRowValue as Kt, rowWriteOf as Qt, remainingTtlSeconds as We, isVersionConflict as Be, cellErrorsOf as Ft, parseDocText as qt, kvValueOf as _t, serializeCell as Wt, DataStoreList as Bt, DATA_STORE_KINDS as Ut, DATA_STORE_KIND_LABEL as Vt, SCALAR_TYPES as Ht, ColumnsEditor as Jt, errorPlacement as Yt } from "@w6w/ui";
|
|
8
8
|
import { I as zt } from "./ImportSpecModal-Cpzp8ndt.js";
|
|
9
9
|
import { i as Zt } from "./import-bindings-EUtxZ9Ti.js";
|
|
10
|
-
import { a3 as Gt, a1 as Ue, T as Xt, E as en } from "./workflows-
|
|
10
|
+
import { a3 as Gt, a1 as Ue, T as Xt, E as en } from "./workflows-BK6IM4if.js";
|
|
11
11
|
import { b as tn } from "./workflow-blank-DFpGObrn.js";
|
|
12
12
|
import { f as nn, e as Ee, g as an, b as sn, h as rn, i as ln } from "./api-calls--JHyif6a.js";
|
|
13
13
|
import { C as he, a as on, M as cn } from "./ConfirmModal-Pv2-A_3U.js";
|
|
14
14
|
import { D as dn } from "./DocumentFormModal-Br4s8wmi.js";
|
|
15
15
|
import { k as un, i as mn } from "./spec-import-SWOonsNr.js";
|
|
16
|
-
import { H as hn, a as Ve } from "./editor-apps-
|
|
16
|
+
import { H as hn, a as Ve } from "./editor-apps-LZmDWMqf.js";
|
|
17
17
|
import { ApiError as He } from "@w6w/sdk";
|
|
18
18
|
import { useQueryClient as we, useInfiniteQuery as Je } from "@tanstack/react-query";
|
|
19
19
|
import { u as wn, o as pn, k as Ye, c as be, b as ze, m as fn, p as gn } from "./connections-CzsCyIxY.js";
|
|
20
|
-
import { M as yn } from "./ModelRoutesManager-
|
|
21
|
-
import { j as vn } from "./apps-
|
|
20
|
+
import { M as yn } from "./ModelRoutesManager-BUw_sm-M.js";
|
|
21
|
+
import { j as vn } from "./apps-CYUgEfGf.js";
|
|
22
22
|
import { u as pe } from "./client-context-CX61Bgw-.js";
|
|
23
23
|
import { p as Nn, v as bn, n as kn, y as Cn } from "./models-bAayQPJ_.js";
|
|
24
24
|
import { n as Dn, m as $n, k as Tn, p as Ln, q as Mn, v as In, o as xn } from "./credentials-Cn92LGhJ.js";
|
|
@@ -316,7 +316,7 @@ function li({ project: e, onOpen: n, getHref: a, slots: s, rowSlots: i }) {
|
|
|
316
316
|
}
|
|
317
317
|
)
|
|
318
318
|
] }),
|
|
319
|
-
/* @__PURE__ */ r("div", {
|
|
319
|
+
/* @__PURE__ */ r("div", { children: [
|
|
320
320
|
l.isLoading && /* @__PURE__ */ t("p", { className: "muted", children: "Loading…" }),
|
|
321
321
|
((g = l.data) == null ? void 0 : g.length) === 0 && b,
|
|
322
322
|
l.data != null && l.data.length > 0 && /* @__PURE__ */ t(
|
|
@@ -1429,7 +1429,7 @@ function hi(e) {
|
|
|
1429
1429
|
/* @__PURE__ */ t("h3", { children: "Model catalog" }),
|
|
1430
1430
|
/* @__PURE__ */ t("p", { className: "muted small", children: "The models discovered on this tenant's connections, plus any added by hand. A route may only name a model from this list; the rate card is what usage is priced with." })
|
|
1431
1431
|
] }) }),
|
|
1432
|
-
/* @__PURE__ */ r("div", {
|
|
1432
|
+
/* @__PURE__ */ r("div", { children: [
|
|
1433
1433
|
s.isLoading && /* @__PURE__ */ t("p", { className: "muted", children: "Loading…" }),
|
|
1434
1434
|
s.error != null && /* @__PURE__ */ t("div", { className: "error", children: s.error.message }),
|
|
1435
1435
|
s.isSuccess && i.length === 0 && /* @__PURE__ */ t(De, { testId: "model-catalog-empty", children: "No models yet. Discover them from a provider connection to start routing to them." }),
|
|
@@ -1596,7 +1596,7 @@ function wi(e) {
|
|
|
1596
1596
|
] })
|
|
1597
1597
|
] }),
|
|
1598
1598
|
i.error != null && /* @__PURE__ */ t("div", { className: "error", role: "alert", "data-testid": "model-usage-error", children: i.error.message }),
|
|
1599
|
-
/* @__PURE__ */ r("div", {
|
|
1599
|
+
/* @__PURE__ */ r("div", { children: [
|
|
1600
1600
|
i.isLoading && /* @__PURE__ */ t("p", { className: "muted", children: "Loading…" }),
|
|
1601
1601
|
i.isSuccess && c.length === 0 && /* @__PURE__ */ t(De, { testId: "model-usage-empty", children: "No model calls in this window. Usage rows appear here as routes are invoked." }),
|
|
1602
1602
|
c.length > 0 && /* @__PURE__ */ t(
|