@cerebro-labs/agentnava-sdk 0.53.2 → 0.74.0

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/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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","sourcesContent":["// Ready-made React views for the widgets an agent draws in its replies.\n//\n// import { ReplyView } from '@cerebro-labs/agentnava-sdk/react'\n// import '@cerebro-labs/agentnava-sdk/react/styles.css'\n//\n// <ReplyView text={reply} widgets={widgets} onAsk={send} />\n//\n// React is optional for the SDK: only this entry needs it, and the rest of the\n// package never imports it. Every kind of part has a default look (styles.css,\n// themed through CSS variables), and any kind can be swapped for your own\n// component with `parts`.\n//\n// A widget is written by the model, so it is drawn defensively: a kind this\n// does not know, or a part missing a field, is skipped; each part is drawn\n// once, even if two containers name it; links and pictures open only over\n// https:// (narrow it further with `allowUrl`); and a widget that throws while\n// drawing is left out rather than breaking the screen around it.\n\nimport { Component, Fragment, type ReactNode } from 'react';\nimport type { Widget, WidgetPart } from './types.ts';\nimport { placeWidgets } from './widgets.ts';\n\nexport { placeWidgets, type ReplyPiece } from './widgets.ts';\n\n/** Every kind of part an agent may draw. */\nexport type WidgetKind =\n\t| 'Column'\n\t| 'Row'\n\t| 'Card'\n\t| 'Text'\n\t| 'Stat'\n\t| 'KeyValue'\n\t| 'Table'\n\t| 'Chart'\n\t| 'Image'\n\t| 'List'\n\t| 'Note'\n\t| 'Badge'\n\t| 'Link'\n\t| 'Button'\n\t| 'Suggestions'\n\t| 'Divider';\n\n/** What a replacement for one kind of part receives. */\nexport interface PartProps {\n\tpart: WidgetPart;\n\t/** The part's children, already drawn (containers only). */\n\tchildren?: ReactNode;\n\t/** Send words as the reader's next message (Button, Suggestions). */\n\tonAsk?: ((text: string) => void) | undefined;\n}\n\nexport interface WidgetViewProps {\n\twidget: Widget;\n\t/** Called with a Button's label or a tapped suggestion: send it as the next message. */\n\tonAsk?: (text: string) => void;\n\t/** Your own component for any kind of part, in place of the default. */\n\tparts?: Partial<Record<WidgetKind, (props: PartProps) => ReactNode>>;\n\t/** ISO currency code for charts and numbers marked as money. Default \"USD\". */\n\tcurrency?: string;\n\t/** Locale for numbers. Default: the reader's. */\n\tlocale?: string;\n\t/** Whether a link or picture address may be opened. Default: https:// only. */\n\tallowUrl?: (url: string, use: 'link' | 'image') => boolean;\n\tclassName?: string;\n}\n\nexport interface ReplyViewProps extends Omit<WidgetViewProps, 'widget' | 'className'> {\n\t/** The reply's words, as `text` events or `done.reply` give them. */\n\ttext: string;\n\t/** The reply's widgets, as `widget` events or `done.widgets` give them. */\n\twidgets?: readonly Widget[] | undefined;\n\t/** How to draw the words. Default: paragraphs. Pass your markdown renderer here. */\n\trenderText?: (text: string) => ReactNode;\n\tclassName?: string;\n}\n\nconst str = (v: unknown): string => (typeof v === 'string' || typeof v === 'number' ? String(v) : '');\nconst list = <T = unknown,>(v: unknown): T[] => (Array.isArray(v) ? (v as T[]) : []);\nconst TONES = new Set(['high', 'medium', 'low', 'good', 'info']);\nconst toneOf = (v: unknown): string => (typeof v === 'string' && TONES.has(v) ? v : 'info');\nconst httpsOnly = (url: string) => /^https:\\/\\//i.test(url);\n\n/** A widget that throws while drawing is left out, never a crash of the screen. */\nclass Boundary extends Component<{ children: ReactNode }, { failed: boolean }> {\n\toverride state = { failed: false };\n\tstatic getDerivedStateFromError() {\n\t\treturn { failed: true };\n\t}\n\toverride render() {\n\t\treturn this.state.failed ? null : this.props.children;\n\t}\n}\n\ninterface Ctx {\n\tbyId: Map<string, WidgetPart>;\n\tseen: Set<string>;\n\tprops: WidgetViewProps;\n\tmoney: (n: number) => string;\n\tnumber: (n: number) => string;\n\turl: (v: unknown, use: 'link' | 'image') => string | undefined;\n}\n\nfunction Chart({ part, ctx }: { part: WidgetPart; ctx: Ctx }) {\n\tconst series = list<{ name?: unknown; points?: unknown }>(part.series)\n\t\t.map((s) => ({\n\t\t\tname: str(s?.name),\n\t\t\tpoints: list<{ x?: unknown; y?: unknown }>(s?.points).filter((p) => typeof p?.y === 'number' && Number.isFinite(p.y)),\n\t\t}))\n\t\t.filter((s) => s.points.length > 0);\n\tif (series.length === 0) return null;\n\tconst xs = series[0]!.points.map((p) => str(p.x));\n\tconst ref = part.reference as { y?: unknown; label?: unknown } | undefined;\n\tconst refY = typeof ref?.y === 'number' && Number.isFinite(ref.y) ? ref.y : undefined;\n\tconst ys = [...series.flatMap((s) => s.points.map((p) => p.y as number)), ...(refY === undefined ? [] : [refY])];\n\t// Zero sits between the extremes, so a negative value draws below the zero\n\t// line instead of collapsing onto it and reading as 0.\n\tconst lo = Math.min(...ys, 0);\n\tconst span = Math.max(...ys, 0) - lo || 1;\n\tconst W = 320;\n\tconst H = 140;\n\tconst step = W / Math.max(xs.length, 1);\n\tconst fmt = (n: number) => (part.unit === 'currency' ? ctx.money(n) : part.unit === 'percent' ? `${ctx.number(n)}%` : ctx.number(n));\n\tconst yOf = (y: number) => H - ((y - lo) / span) * (H - 18);\n\tconst zero = yOf(0);\n\tconst labelled = series.length === 1 && xs.length <= 6;\n\treturn (\n\t\t<figure className=\"an-w-chart\">\n\t\t\t{str(part.title) && <figcaption>{str(part.title)}</figcaption>}\n\t\t\t<svg viewBox={`0 0 ${W} ${H + 18}`} role=\"img\" aria-label={str(part.title) || 'Chart'}>\n\t\t\t\t{series.map((s, si) =>\n\t\t\t\t\tpart.type === 'bar' ? (\n\t\t\t\t\t\ts.points.map((p, i) => {\n\t\t\t\t\t\t\tconst bw = (step * 0.7) / series.length;\n\t\t\t\t\t\t\tconst x = i * step + step * 0.15 + si * bw;\n\t\t\t\t\t\t\tconst y = yOf(p.y as number);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<g key={`${si}-${i}`}>\n\t\t\t\t\t\t\t\t\t<rect className={`an-w-s${si % 4}`} x={x} y={Math.min(y, zero)} width={bw} height={Math.abs(zero - y)} rx={2}>\n\t\t\t\t\t\t\t\t\t\t<title>{`${str(p.x)}: ${fmt(p.y as number)}`}</title>\n\t\t\t\t\t\t\t\t\t</rect>\n\t\t\t\t\t\t\t\t\t{labelled && (\n\t\t\t\t\t\t\t\t\t\t<text x={x + bw / 2} y={Math.min(y, zero) - 4} textAnchor=\"middle\">\n\t\t\t\t\t\t\t\t\t\t\t{fmt(p.y as number)}\n\t\t\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<g key={si}>\n\t\t\t\t\t\t\t<polyline\n\t\t\t\t\t\t\t\tclassName={`an-w-line an-w-s${si % 4}${part.type === 'area' ? ' is-area' : ''}`}\n\t\t\t\t\t\t\t\tpoints={s.points.map((p, i) => `${i * step + step / 2},${yOf(p.y as number)}`).join(' ')}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{s.points.map((p, i) => (\n\t\t\t\t\t\t\t\t<g key={i}>\n\t\t\t\t\t\t\t\t\t<circle className={`an-w-s${si % 4}`} cx={i * step + step / 2} cy={yOf(p.y as number)} r={3}>\n\t\t\t\t\t\t\t\t\t\t<title>{`${str(p.x)}: ${fmt(p.y as number)}`}</title>\n\t\t\t\t\t\t\t\t\t</circle>\n\t\t\t\t\t\t\t\t\t{labelled && (\n\t\t\t\t\t\t\t\t\t\t<text x={i * step + step / 2} y={yOf(p.y as number) - 7} textAnchor=\"middle\">\n\t\t\t\t\t\t\t\t\t\t\t{fmt(p.y as number)}\n\t\t\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</g>\n\t\t\t\t\t),\n\t\t\t\t)}\n\t\t\t\t{lo < 0 && <line x1={0} x2={W} y1={zero} y2={zero} stroke=\"currentColor\" strokeOpacity={0.4} />}\n\t\t\t\t{refY !== undefined && (\n\t\t\t\t\t<g className=\"an-w-ref\">\n\t\t\t\t\t\t<line x1={0} x2={W} y1={yOf(refY)} y2={yOf(refY)} />\n\t\t\t\t\t\t{str(ref?.label) && (\n\t\t\t\t\t\t\t<text x={W} y={yOf(refY) - 4} textAnchor=\"end\">\n\t\t\t\t\t\t\t\t{str(ref?.label)}\n\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</g>\n\t\t\t\t)}\n\t\t\t\t{xs.map((x, i) => (\n\t\t\t\t\t<text key={i} x={i * step + step / 2} y={H + 14} textAnchor=\"middle\">\n\t\t\t\t\t\t{x}\n\t\t\t\t\t</text>\n\t\t\t\t))}\n\t\t\t</svg>\n\t\t\t{series.length > 1 && (\n\t\t\t\t<div className=\"an-w-legend\">\n\t\t\t\t\t{series.map((s, si) => (\n\t\t\t\t\t\t<span key={si}>\n\t\t\t\t\t\t\t<i className={`an-w-s${si % 4}`} />\n\t\t\t\t\t\t\t{s.name}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</figure>\n\t);\n}\n\n/** The default look of one part. `kids` is its children, already drawn. */\nfunction defaultPart(part: WidgetPart, kids: ReactNode, ctx: Ctx): ReactNode {\n\tconst onAsk = ctx.props.onAsk;\n\tswitch (part.component) {\n\t\tcase 'Column':\n\t\t\treturn <div className={`an-w-col an-w-gap-${['small', 'large'].includes(str(part.gap)) ? str(part.gap) : 'medium'}`}>{kids}</div>;\n\t\tcase 'Row':\n\t\t\treturn <div className={`an-w-row${part.scroll === true ? ' is-scroll' : ''}`}>{kids}</div>;\n\t\tcase 'Card': {\n\t\t\tconst image = ctx.url(part.image, 'image');\n\t\t\tconst href = ctx.url(part.href, 'link');\n\t\t\tconst body = (\n\t\t\t\t<div className=\"an-w-card\">\n\t\t\t\t\t{image && <img src={image} alt={str(part.imageAlt)} referrerPolicy=\"no-referrer\" loading=\"lazy\" />}\n\t\t\t\t\t<div className=\"an-w-card-body\">{kids}</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t\treturn href ? (\n\t\t\t\t<a className=\"an-w-card-link\" href={href} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t{body}\n\t\t\t\t</a>\n\t\t\t) : (\n\t\t\t\tbody\n\t\t\t);\n\t\t}\n\t\tcase 'Text': {\n\t\t\tif (!str(part.text)) return null;\n\t\t\tconst v = ['title', 'heading', 'caption'].includes(str(part.variant)) ? str(part.variant) : 'body';\n\t\t\treturn <p className={`an-w-text is-${v}`}>{str(part.text)}</p>;\n\t\t}\n\t\tcase 'Stat':\n\t\t\tif (!str(part.value)) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-stat\">\n\t\t\t\t\t<strong>{str(part.value)}</strong>\n\t\t\t\t\t{str(part.label) && <span>{str(part.label)}</span>}\n\t\t\t\t\t{str(part.caption) && <small>{str(part.caption)}</small>}\n\t\t\t\t</div>\n\t\t\t);\n\t\tcase 'KeyValue': {\n\t\t\tconst rows = list<{ label?: unknown; value?: unknown; emphasis?: unknown }>(part.rows).filter((r) => str(r?.label) || str(r?.value));\n\t\t\tif (rows.length === 0) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-kv\">\n\t\t\t\t\t{str(part.title) && <div className=\"an-w-title\">{str(part.title)}</div>}\n\t\t\t\t\t<dl>\n\t\t\t\t\t\t{rows.map((r, i) => (\n\t\t\t\t\t\t\t<div key={i} className={r?.emphasis ? 'is-total' : undefined}>\n\t\t\t\t\t\t\t\t<dt>{str(r?.label)}</dt>\n\t\t\t\t\t\t\t\t<dd>{str(r?.value)}</dd>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</dl>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\tcase 'Table': {\n\t\t\tconst cols = list(part.columns).map(str);\n\t\t\tconst rows = list(part.rows).filter(Array.isArray) as unknown[][];\n\t\t\tif (cols.length === 0 && rows.length === 0) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-table\">\n\t\t\t\t\t{str(part.title) && <div className=\"an-w-title\">{str(part.title)}</div>}\n\t\t\t\t\t<table>\n\t\t\t\t\t\t{cols.length > 0 && (\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t{cols.map((c, j) => (\n\t\t\t\t\t\t\t\t\t\t<th key={j}>{c}</th>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t{rows.map((r, i) => (\n\t\t\t\t\t\t\t\t<tr key={i}>\n\t\t\t\t\t\t\t\t\t{r.map((c, j) => (\n\t\t\t\t\t\t\t\t\t\t<td key={j} className={typeof c === 'number' ? 'is-num' : undefined}>\n\t\t\t\t\t\t\t\t\t\t\t{typeof c === 'number' ? ctx.number(c) : str(c)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\tcase 'Chart':\n\t\t\treturn <Chart part={part} ctx={ctx} />;\n\t\tcase 'Image': {\n\t\t\tconst url = ctx.url(part.url, 'image');\n\t\t\treturn url ? (\n\t\t\t\t<figure className=\"an-w-image\">\n\t\t\t\t\t<img src={url} alt={str(part.alt)} referrerPolicy=\"no-referrer\" loading=\"lazy\" />\n\t\t\t\t\t{str(part.caption) && <figcaption>{str(part.caption)}</figcaption>}\n\t\t\t\t</figure>\n\t\t\t) : null;\n\t\t}\n\t\tcase 'List': {\n\t\t\tconst items = list<{ title?: unknown; detail?: unknown; meta?: unknown; tone?: unknown }>(part.items).filter((it) => str(it?.title));\n\t\t\tif (items.length === 0) return null;\n\t\t\tconst Tag = part.ordered === true ? 'ol' : 'ul';\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-list\">\n\t\t\t\t\t{str(part.title) && <div className=\"an-w-title\">{str(part.title)}</div>}\n\t\t\t\t\t<Tag>\n\t\t\t\t\t\t{items.map((it, i) => (\n\t\t\t\t\t\t\t<li key={i}>\n\t\t\t\t\t\t\t\t<i className={`an-w-dot is-${toneOf(it?.tone)}`} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<strong>{str(it?.title)}</strong>\n\t\t\t\t\t\t\t\t\t{str(it?.detail) && <span>{str(it?.detail)}</span>}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{str(it?.meta) && <small>{str(it?.meta)}</small>}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Tag>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\tcase 'Note':\n\t\t\tif (!str(part.text)) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-note\">\n\t\t\t\t\t{str(part.title) && <strong>{str(part.title)}</strong>}\n\t\t\t\t\t<span>{str(part.text)}</span>\n\t\t\t\t</div>\n\t\t\t);\n\t\tcase 'Badge':\n\t\t\treturn str(part.text) ? <span className={`an-w-badge is-${toneOf(part.tone)}`}>{str(part.text)}</span> : null;\n\t\tcase 'Link': {\n\t\t\tconst url = ctx.url(part.url, 'link');\n\t\t\treturn url && str(part.label) ? (\n\t\t\t\t<a className=\"an-w-link\" href={url} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t{str(part.label)}\n\t\t\t\t</a>\n\t\t\t) : null;\n\t\t}\n\t\tcase 'Button':\n\t\t\tif (!str(part.label)) return null;\n\t\t\treturn (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={`an-w-button is-${part.variant === 'secondary' ? 'secondary' : 'primary'}`}\n\t\t\t\t\tdisabled={!onAsk}\n\t\t\t\t\tonClick={() => onAsk?.(str(part.label))}\n\t\t\t\t>\n\t\t\t\t\t{str(part.label)}\n\t\t\t\t</button>\n\t\t\t);\n\t\tcase 'Suggestions': {\n\t\t\tconst options = list(part.options).map(str).filter(Boolean);\n\t\t\tif (options.length === 0) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-suggest\">\n\t\t\t\t\t{options.map((o, i) => (\n\t\t\t\t\t\t<button key={i} type=\"button\" disabled={!onAsk} onClick={() => onAsk?.(o)}>\n\t\t\t\t\t\t\t{o}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\tcase 'Divider':\n\t\t\treturn <hr className=\"an-w-divider\" />;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\nconst CONTAINERS = new Set(['Column', 'Row', 'Card']);\n\n// A plain function, not a component: the set of parts already drawn lives for\n// one render of the widget. As a component, React's development mode would draw\n// each part twice and find every one \"already drawn\" on its second pass.\nfunction draw(id: string, ctx: Ctx): ReactNode {\n\tconst part = ctx.byId.get(id);\n\t// A part listed twice, or a loop of containers, is drawn once.\n\tif (!part || ctx.seen.has(id)) return null;\n\tctx.seen.add(id);\n\tconst kids = CONTAINERS.has(part.component)\n\t\t? list(part.children)\n\t\t\t\t.filter((k): k is string => typeof k === 'string')\n\t\t\t\t.map((k) => <Fragment key={k}>{draw(k, ctx)}</Fragment>)\n\t\t: undefined;\n\tconst own = ctx.props.parts?.[part.component as WidgetKind];\n\treturn own ? own({ part, children: kids, onAsk: ctx.props.onAsk }) : defaultPart(part, kids, ctx);\n}\n\n/** One widget, drawn from its root part. Draws nothing when there is no root yet. */\nexport function WidgetView(props: WidgetViewProps) {\n\tconst { widget, currency = 'USD', locale, allowUrl } = props;\n\tconst byId = new Map<string, WidgetPart>();\n\tfor (const p of Array.isArray(widget?.components) ? widget.components : []) {\n\t\tif (p && typeof p === 'object' && typeof p.id === 'string' && typeof p.component === 'string' && !byId.has(p.id)) byId.set(p.id, p);\n\t}\n\tif (!byId.has('root')) return null;\n\tlet moneyFormat: Intl.NumberFormat;\n\ttry {\n\t\tmoneyFormat = new Intl.NumberFormat(locale, { style: 'currency', currency, maximumFractionDigits: 0 });\n\t} catch {\n\t\tmoneyFormat = new Intl.NumberFormat(locale, { maximumFractionDigits: 0 });\n\t}\n\tconst numberFormat = new Intl.NumberFormat(locale);\n\tconst ctx: Ctx = {\n\t\tbyId,\n\t\tseen: new Set(),\n\t\tprops,\n\t\tmoney: (n) => moneyFormat.format(n),\n\t\tnumber: (n) => numberFormat.format(n),\n\t\turl: (v, use) => (typeof v === 'string' && httpsOnly(v) && (allowUrl ? allowUrl(v, use) : true) ? v : undefined),\n\t};\n\treturn (\n\t\t<Boundary>\n\t\t\t<div className={`an-w${props.className ? ` ${props.className}` : ''}`} data-surface={widget.surfaceId}>\n\t\t\t\t{draw('root', ctx)}\n\t\t\t</div>\n\t\t</Boundary>\n\t);\n}\n\nfunction Paragraphs({ text }: { text: string }) {\n\treturn (\n\t\t<>\n\t\t\t{text\n\t\t\t\t.trim()\n\t\t\t\t.split(/\\n{2,}/)\n\t\t\t\t.map((p, i) => (\n\t\t\t\t\t<p key={i} className=\"an-reply-text\">\n\t\t\t\t\t\t{p.split('\\n').map((line, j) => (\n\t\t\t\t\t\t\t<Fragment key={j}>\n\t\t\t\t\t\t\t\t{j > 0 && <br />}\n\t\t\t\t\t\t\t\t{line}\n\t\t\t\t\t\t\t</Fragment>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</p>\n\t\t\t\t))}\n\t\t</>\n\t);\n}\n\n/** A whole reply: its words, with each widget drawn where it sits. */\nexport function ReplyView({ text, widgets, renderText, className, ...widgetProps }: ReplyViewProps) {\n\treturn (\n\t\t<div className={`an-reply${className ? ` ${className}` : ''}`}>\n\t\t\t{placeWidgets(text, widgets ?? []).map((piece, i) =>\n\t\t\t\tpiece.kind === 'text' ? (\n\t\t\t\t\t<Fragment key={`t${i}`}>{renderText ? renderText(piece.text) : <Paragraphs text={piece.text} />}</Fragment>\n\t\t\t\t) : (\n\t\t\t\t\t<WidgetView key={piece.widget.surfaceId} widget={piece.widget} {...widgetProps} />\n\t\t\t\t),\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"]}
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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","sourcesContent":["// Ready-made React views for the widgets an agent draws in its replies.\n//\n// import { ReplyView } from '@cerebro-labs/agentnava-sdk/react'\n// import '@cerebro-labs/agentnava-sdk/react/styles.css'\n//\n// <ReplyView text={reply} widgets={widgets} onAsk={send} />\n//\n// React is optional for the SDK: only this entry needs it, and the rest of the\n// package never imports it. Every kind of part has a default look (styles.css,\n// themed through CSS variables), and any kind can be swapped for your own\n// component with `parts`.\n//\n// A widget is written by the model, so it is drawn defensively: a kind this\n// does not know, or a part missing a field, is skipped; each part is drawn\n// once, even if two containers name it; links and pictures open only over\n// https:// (narrow it further with `allowUrl`); and a widget that throws while\n// drawing is left out rather than breaking the screen around it.\n\nimport { Component, Fragment, type ReactNode } from 'react';\nimport type { Widget, WidgetPart } from './types.ts';\nimport { placeWidgets } from './widgets.ts';\n\nexport { placeWidgets, type ReplyPiece } from './widgets.ts';\n\n/** Every kind of part an agent may draw. */\nexport type WidgetKind =\n\t| 'Column'\n\t| 'Row'\n\t| 'Card'\n\t| 'Text'\n\t| 'Stat'\n\t| 'KeyValue'\n\t| 'Table'\n\t| 'Chart'\n\t| 'Image'\n\t| 'List'\n\t| 'Note'\n\t| 'Badge'\n\t| 'Link'\n\t| 'Button'\n\t| 'Suggestions'\n\t| 'Divider';\n\n/** What a replacement for one kind of part receives. */\nexport interface PartProps {\n\tpart: WidgetPart;\n\t/** The part's children, already drawn (containers only). */\n\tchildren?: ReactNode;\n\t/** Send words as the reader's next message (Button, Suggestions). */\n\tonAsk?: ((text: string) => void) | undefined;\n}\n\nexport interface WidgetViewProps {\n\twidget: Widget;\n\t/** Called with a Button's label or a tapped suggestion: send it as the next message. */\n\tonAsk?: (text: string) => void;\n\t/** Your own component for any kind of part, in place of the default. */\n\tparts?: Partial<Record<WidgetKind, (props: PartProps) => ReactNode>>;\n\t/** ISO currency code for charts and numbers marked as money. Default \"USD\". */\n\tcurrency?: string;\n\t/** Locale for numbers. Default: the reader's. */\n\tlocale?: string;\n\t/** Whether a link or picture address may be opened. Default: https:// only. */\n\tallowUrl?: (url: string, use: 'link' | 'image') => boolean;\n\tclassName?: string;\n}\n\nexport interface ReplyViewProps extends Omit<WidgetViewProps, 'widget' | 'className'> {\n\t/** The reply's words, as `text` events or `done.reply` give them. */\n\ttext: string;\n\t/** The reply's widgets, as `widget` events or `done.widgets` give them. */\n\twidgets?: readonly Widget[] | undefined;\n\t/** How to draw the words. Default: paragraphs. Pass your markdown renderer here. */\n\trenderText?: (text: string) => ReactNode;\n\tclassName?: string;\n}\n\nconst str = (v: unknown): string => (typeof v === 'string' || typeof v === 'number' ? String(v) : '');\nconst list = <T = unknown,>(v: unknown): T[] => (Array.isArray(v) ? (v as T[]) : []);\nconst TONES = new Set(['high', 'medium', 'low', 'good', 'info']);\nconst toneOf = (v: unknown): string => (typeof v === 'string' && TONES.has(v) ? v : 'info');\nconst httpsOnly = (url: string) => /^https:\\/\\//i.test(url);\n\n/** A widget that throws while drawing is left out, never a crash of the screen. */\nclass Boundary extends Component<{ children: ReactNode }, { failed: boolean }> {\n\toverride state = { failed: false };\n\tstatic getDerivedStateFromError() {\n\t\treturn { failed: true };\n\t}\n\toverride render() {\n\t\treturn this.state.failed ? null : this.props.children;\n\t}\n}\n\ninterface Ctx {\n\tbyId: Map<string, WidgetPart>;\n\tseen: Set<string>;\n\tprops: WidgetViewProps;\n\tmoney: (n: number) => string;\n\tnumber: (n: number) => string;\n\turl: (v: unknown, use: 'link' | 'image') => string | undefined;\n}\n\nfunction Chart({ part, ctx }: { part: WidgetPart; ctx: Ctx }) {\n\tconst series = list<{ name?: unknown; points?: unknown }>(part.series)\n\t\t.map((s) => ({\n\t\t\tname: str(s?.name),\n\t\t\tpoints: list<{ x?: unknown; y?: unknown }>(s?.points).filter((p) => typeof p?.y === 'number' && Number.isFinite(p.y)),\n\t\t}))\n\t\t.filter((s) => s.points.length > 0);\n\tif (series.length === 0) return null;\n\tconst xs = series[0]!.points.map((p) => str(p.x));\n\tconst ref = part.reference as { y?: unknown; label?: unknown } | undefined;\n\tconst refY = typeof ref?.y === 'number' && Number.isFinite(ref.y) ? ref.y : undefined;\n\tconst ys = [...series.flatMap((s) => s.points.map((p) => p.y as number)), ...(refY === undefined ? [] : [refY])];\n\t// Zero sits between the extremes, so a negative value draws below the zero\n\t// line instead of collapsing onto it and reading as 0.\n\tconst lo = Math.min(...ys, 0);\n\tconst span = Math.max(...ys, 0) - lo || 1;\n\tconst W = 320;\n\tconst H = 140;\n\tconst step = W / Math.max(xs.length, 1);\n\tconst fmt = (n: number) => (part.unit === 'currency' ? ctx.money(n) : part.unit === 'percent' ? `${ctx.number(n)}%` : ctx.number(n));\n\tconst yOf = (y: number) => H - ((y - lo) / span) * (H - 18);\n\tconst zero = yOf(0);\n\tconst labelled = series.length === 1 && xs.length <= 6;\n\treturn (\n\t\t<figure className=\"an-w-chart\">\n\t\t\t{str(part.title) && <figcaption>{str(part.title)}</figcaption>}\n\t\t\t<svg viewBox={`0 0 ${W} ${H + 18}`} role=\"img\" aria-label={str(part.title) || 'Chart'}>\n\t\t\t\t{series.map((s, si) =>\n\t\t\t\t\tpart.type === 'bar' ? (\n\t\t\t\t\t\ts.points.map((p, i) => {\n\t\t\t\t\t\t\tconst bw = (step * 0.7) / series.length;\n\t\t\t\t\t\t\tconst x = i * step + step * 0.15 + si * bw;\n\t\t\t\t\t\t\tconst y = yOf(p.y as number);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<g key={`${si}-${i}`}>\n\t\t\t\t\t\t\t\t\t<rect className={`an-w-s${si % 4}`} x={x} y={Math.min(y, zero)} width={bw} height={Math.abs(zero - y)} rx={2}>\n\t\t\t\t\t\t\t\t\t\t<title>{`${str(p.x)}: ${fmt(p.y as number)}`}</title>\n\t\t\t\t\t\t\t\t\t</rect>\n\t\t\t\t\t\t\t\t\t{labelled && (\n\t\t\t\t\t\t\t\t\t\t<text x={x + bw / 2} y={Math.min(y, zero) - 4} textAnchor=\"middle\">\n\t\t\t\t\t\t\t\t\t\t\t{fmt(p.y as number)}\n\t\t\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<g key={si}>\n\t\t\t\t\t\t\t<polyline\n\t\t\t\t\t\t\t\tclassName={`an-w-line an-w-s${si % 4}${part.type === 'area' ? ' is-area' : ''}`}\n\t\t\t\t\t\t\t\tpoints={s.points.map((p, i) => `${i * step + step / 2},${yOf(p.y as number)}`).join(' ')}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{s.points.map((p, i) => (\n\t\t\t\t\t\t\t\t<g key={i}>\n\t\t\t\t\t\t\t\t\t<circle className={`an-w-s${si % 4}`} cx={i * step + step / 2} cy={yOf(p.y as number)} r={3}>\n\t\t\t\t\t\t\t\t\t\t<title>{`${str(p.x)}: ${fmt(p.y as number)}`}</title>\n\t\t\t\t\t\t\t\t\t</circle>\n\t\t\t\t\t\t\t\t\t{labelled && (\n\t\t\t\t\t\t\t\t\t\t<text x={i * step + step / 2} y={yOf(p.y as number) - 7} textAnchor=\"middle\">\n\t\t\t\t\t\t\t\t\t\t\t{fmt(p.y as number)}\n\t\t\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</g>\n\t\t\t\t\t),\n\t\t\t\t)}\n\t\t\t\t{lo < 0 && <line x1={0} x2={W} y1={zero} y2={zero} stroke=\"currentColor\" strokeOpacity={0.4} />}\n\t\t\t\t{refY !== undefined && (\n\t\t\t\t\t<g className=\"an-w-ref\">\n\t\t\t\t\t\t<line x1={0} x2={W} y1={yOf(refY)} y2={yOf(refY)} />\n\t\t\t\t\t\t{str(ref?.label) && (\n\t\t\t\t\t\t\t<text x={W} y={yOf(refY) - 4} textAnchor=\"end\">\n\t\t\t\t\t\t\t\t{str(ref?.label)}\n\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</g>\n\t\t\t\t)}\n\t\t\t\t{xs.map((x, i) => (\n\t\t\t\t\t<text key={i} x={i * step + step / 2} y={H + 14} textAnchor=\"middle\">\n\t\t\t\t\t\t{x}\n\t\t\t\t\t</text>\n\t\t\t\t))}\n\t\t\t</svg>\n\t\t\t{series.length > 1 && (\n\t\t\t\t<div className=\"an-w-legend\">\n\t\t\t\t\t{series.map((s, si) => (\n\t\t\t\t\t\t<span key={si}>\n\t\t\t\t\t\t\t<i className={`an-w-s${si % 4}`} />\n\t\t\t\t\t\t\t{s.name}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</figure>\n\t);\n}\n\n/** The default look of one part. `kids` is its children, already drawn. */\nfunction defaultPart(part: WidgetPart, kids: ReactNode, ctx: Ctx): ReactNode {\n\tconst onAsk = ctx.props.onAsk;\n\tswitch (part.component) {\n\t\tcase 'Column':\n\t\t\treturn <div className={`an-w-col an-w-gap-${['small', 'large'].includes(str(part.gap)) ? str(part.gap) : 'medium'}`}>{kids}</div>;\n\t\tcase 'Row':\n\t\t\treturn <div className={`an-w-row${part.scroll === true ? ' is-scroll' : ''}`}>{kids}</div>;\n\t\tcase 'Card': {\n\t\t\tconst image = ctx.url(part.image, 'image');\n\t\t\tconst href = ctx.url(part.href, 'link');\n\t\t\tconst actionHref = ctx.url(part.actionHref, 'link');\n\t\t\tconst actionLabel = str(part.actionLabel);\n\t\t\tif (actionHref && actionLabel) {\n\t\t\t\t// The card's one button (\"Add to cart\") is a link beside the card's\n\t\t\t\t// own link, never inside it.\n\t\t\t\tconst inner = (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{image && <img src={image} alt={str(part.imageAlt)} referrerPolicy=\"no-referrer\" loading=\"lazy\" />}\n\t\t\t\t\t\t<div className=\"an-w-card-body\">{kids}</div>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t\treturn (\n\t\t\t\t\t<div className=\"an-w-card has-action\">\n\t\t\t\t\t\t{href ? (\n\t\t\t\t\t\t\t<a className=\"an-w-card-main\" href={href} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t\t\t\t{inner}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className=\"an-w-card-main\">{inner}</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<a className=\"an-w-card-action\" href={actionHref} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t\t\t{actionLabel}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst body = (\n\t\t\t\t<div className=\"an-w-card\">\n\t\t\t\t\t{image && <img src={image} alt={str(part.imageAlt)} referrerPolicy=\"no-referrer\" loading=\"lazy\" />}\n\t\t\t\t\t<div className=\"an-w-card-body\">{kids}</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t\treturn href ? (\n\t\t\t\t<a className=\"an-w-card-link\" href={href} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t{body}\n\t\t\t\t</a>\n\t\t\t) : (\n\t\t\t\tbody\n\t\t\t);\n\t\t}\n\t\tcase 'Text': {\n\t\t\tif (!str(part.text)) return null;\n\t\t\tconst v = ['title', 'heading', 'caption'].includes(str(part.variant)) ? str(part.variant) : 'body';\n\t\t\treturn <p className={`an-w-text is-${v}`}>{str(part.text)}</p>;\n\t\t}\n\t\tcase 'Stat':\n\t\t\tif (!str(part.value)) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-stat\">\n\t\t\t\t\t<strong>{str(part.value)}</strong>\n\t\t\t\t\t{str(part.label) && <span>{str(part.label)}</span>}\n\t\t\t\t\t{str(part.caption) && <small>{str(part.caption)}</small>}\n\t\t\t\t</div>\n\t\t\t);\n\t\tcase 'KeyValue': {\n\t\t\tconst rows = list<{ label?: unknown; value?: unknown; emphasis?: unknown }>(part.rows).filter((r) => str(r?.label) || str(r?.value));\n\t\t\tif (rows.length === 0) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-kv\">\n\t\t\t\t\t{str(part.title) && <div className=\"an-w-title\">{str(part.title)}</div>}\n\t\t\t\t\t<dl>\n\t\t\t\t\t\t{rows.map((r, i) => (\n\t\t\t\t\t\t\t<div key={i} className={r?.emphasis ? 'is-total' : undefined}>\n\t\t\t\t\t\t\t\t<dt>{str(r?.label)}</dt>\n\t\t\t\t\t\t\t\t<dd>{str(r?.value)}</dd>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</dl>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\tcase 'Table': {\n\t\t\tconst cols = list(part.columns).map(str);\n\t\t\tconst rows = list(part.rows).filter(Array.isArray) as unknown[][];\n\t\t\tif (cols.length === 0 && rows.length === 0) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-table\">\n\t\t\t\t\t{str(part.title) && <div className=\"an-w-title\">{str(part.title)}</div>}\n\t\t\t\t\t<table>\n\t\t\t\t\t\t{cols.length > 0 && (\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t{cols.map((c, j) => (\n\t\t\t\t\t\t\t\t\t\t<th key={j}>{c}</th>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t{rows.map((r, i) => (\n\t\t\t\t\t\t\t\t<tr key={i}>\n\t\t\t\t\t\t\t\t\t{r.map((c, j) => (\n\t\t\t\t\t\t\t\t\t\t<td key={j} className={typeof c === 'number' ? 'is-num' : undefined}>\n\t\t\t\t\t\t\t\t\t\t\t{typeof c === 'number' ? ctx.number(c) : str(c)}\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\tcase 'Chart':\n\t\t\treturn <Chart part={part} ctx={ctx} />;\n\t\tcase 'Image': {\n\t\t\tconst url = ctx.url(part.url, 'image');\n\t\t\treturn url ? (\n\t\t\t\t<figure className=\"an-w-image\">\n\t\t\t\t\t<img src={url} alt={str(part.alt)} referrerPolicy=\"no-referrer\" loading=\"lazy\" />\n\t\t\t\t\t{str(part.caption) && <figcaption>{str(part.caption)}</figcaption>}\n\t\t\t\t</figure>\n\t\t\t) : null;\n\t\t}\n\t\tcase 'List': {\n\t\t\tconst items = list<{ title?: unknown; detail?: unknown; meta?: unknown; tone?: unknown }>(part.items).filter((it) => str(it?.title));\n\t\t\tif (items.length === 0) return null;\n\t\t\tconst Tag = part.ordered === true ? 'ol' : 'ul';\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-list\">\n\t\t\t\t\t{str(part.title) && <div className=\"an-w-title\">{str(part.title)}</div>}\n\t\t\t\t\t<Tag>\n\t\t\t\t\t\t{items.map((it, i) => (\n\t\t\t\t\t\t\t<li key={i}>\n\t\t\t\t\t\t\t\t<i className={`an-w-dot is-${toneOf(it?.tone)}`} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<strong>{str(it?.title)}</strong>\n\t\t\t\t\t\t\t\t\t{str(it?.detail) && <span>{str(it?.detail)}</span>}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{str(it?.meta) && <small>{str(it?.meta)}</small>}\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Tag>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\tcase 'Note':\n\t\t\tif (!str(part.text)) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-note\">\n\t\t\t\t\t{str(part.title) && <strong>{str(part.title)}</strong>}\n\t\t\t\t\t<span>{str(part.text)}</span>\n\t\t\t\t</div>\n\t\t\t);\n\t\tcase 'Badge':\n\t\t\treturn str(part.text) ? <span className={`an-w-badge is-${toneOf(part.tone)}`}>{str(part.text)}</span> : null;\n\t\tcase 'Link': {\n\t\t\tconst url = ctx.url(part.url, 'link');\n\t\t\treturn url && str(part.label) ? (\n\t\t\t\t<a className=\"an-w-link\" href={url} target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t{str(part.label)}\n\t\t\t\t</a>\n\t\t\t) : null;\n\t\t}\n\t\tcase 'Button':\n\t\t\tif (!str(part.label)) return null;\n\t\t\treturn (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName={`an-w-button is-${part.variant === 'secondary' ? 'secondary' : 'primary'}`}\n\t\t\t\t\tdisabled={!onAsk}\n\t\t\t\t\tonClick={() => onAsk?.(str(part.label))}\n\t\t\t\t>\n\t\t\t\t\t{str(part.label)}\n\t\t\t\t</button>\n\t\t\t);\n\t\tcase 'Suggestions': {\n\t\t\tconst options = list(part.options).map(str).filter(Boolean);\n\t\t\tif (options.length === 0) return null;\n\t\t\treturn (\n\t\t\t\t<div className=\"an-w-suggest\">\n\t\t\t\t\t{options.map((o, i) => (\n\t\t\t\t\t\t<button key={i} type=\"button\" disabled={!onAsk} onClick={() => onAsk?.(o)}>\n\t\t\t\t\t\t\t{o}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t\tcase 'Divider':\n\t\t\treturn <hr className=\"an-w-divider\" />;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\nconst CONTAINERS = new Set(['Column', 'Row', 'Card']);\n\n// A plain function, not a component: the set of parts already drawn lives for\n// one render of the widget. As a component, React's development mode would draw\n// each part twice and find every one \"already drawn\" on its second pass.\nfunction draw(id: string, ctx: Ctx): ReactNode {\n\tconst part = ctx.byId.get(id);\n\t// A part listed twice, or a loop of containers, is drawn once.\n\tif (!part || ctx.seen.has(id)) return null;\n\tctx.seen.add(id);\n\tconst kids = CONTAINERS.has(part.component)\n\t\t? list(part.children)\n\t\t\t\t.filter((k): k is string => typeof k === 'string')\n\t\t\t\t.map((k) => <Fragment key={k}>{draw(k, ctx)}</Fragment>)\n\t\t: undefined;\n\tconst own = ctx.props.parts?.[part.component as WidgetKind];\n\treturn own ? own({ part, children: kids, onAsk: ctx.props.onAsk }) : defaultPart(part, kids, ctx);\n}\n\n/** One widget, drawn from its root part. Draws nothing when there is no root yet. */\nexport function WidgetView(props: WidgetViewProps) {\n\tconst { widget, currency = 'USD', locale, allowUrl } = props;\n\tconst byId = new Map<string, WidgetPart>();\n\tfor (const p of Array.isArray(widget?.components) ? widget.components : []) {\n\t\tif (p && typeof p === 'object' && typeof p.id === 'string' && typeof p.component === 'string' && !byId.has(p.id)) byId.set(p.id, p);\n\t}\n\tif (!byId.has('root')) return null;\n\tlet moneyFormat: Intl.NumberFormat;\n\ttry {\n\t\tmoneyFormat = new Intl.NumberFormat(locale, { style: 'currency', currency, maximumFractionDigits: 0 });\n\t} catch {\n\t\tmoneyFormat = new Intl.NumberFormat(locale, { maximumFractionDigits: 0 });\n\t}\n\tconst numberFormat = new Intl.NumberFormat(locale);\n\tconst ctx: Ctx = {\n\t\tbyId,\n\t\tseen: new Set(),\n\t\tprops,\n\t\tmoney: (n) => moneyFormat.format(n),\n\t\tnumber: (n) => numberFormat.format(n),\n\t\turl: (v, use) => (typeof v === 'string' && httpsOnly(v) && (allowUrl ? allowUrl(v, use) : true) ? v : undefined),\n\t};\n\treturn (\n\t\t<Boundary>\n\t\t\t<div className={`an-w${props.className ? ` ${props.className}` : ''}`} data-surface={widget.surfaceId}>\n\t\t\t\t{draw('root', ctx)}\n\t\t\t</div>\n\t\t</Boundary>\n\t);\n}\n\nfunction Paragraphs({ text }: { text: string }) {\n\treturn (\n\t\t<>\n\t\t\t{text\n\t\t\t\t.trim()\n\t\t\t\t.split(/\\n{2,}/)\n\t\t\t\t.map((p, i) => (\n\t\t\t\t\t<p key={i} className=\"an-reply-text\">\n\t\t\t\t\t\t{p.split('\\n').map((line, j) => (\n\t\t\t\t\t\t\t<Fragment key={j}>\n\t\t\t\t\t\t\t\t{j > 0 && <br />}\n\t\t\t\t\t\t\t\t{line}\n\t\t\t\t\t\t\t</Fragment>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</p>\n\t\t\t\t))}\n\t\t</>\n\t);\n}\n\n/** A whole reply: its words, with each widget drawn where it sits. */\nexport function ReplyView({ text, widgets, renderText, className, ...widgetProps }: ReplyViewProps) {\n\treturn (\n\t\t<div className={`an-reply${className ? ` ${className}` : ''}`}>\n\t\t\t{placeWidgets(text, widgets ?? []).map((piece, i) =>\n\t\t\t\tpiece.kind === 'text' ? (\n\t\t\t\t\t<Fragment key={`t${i}`}>{renderText ? renderText(piece.text) : <Paragraphs text={piece.text} />}</Fragment>\n\t\t\t\t) : (\n\t\t\t\t\t<WidgetView key={piece.widget.surfaceId} widget={piece.widget} {...widgetProps} />\n\t\t\t\t),\n\t\t\t)}\n\t\t</div>\n\t);\n}\n"]}
package/secret.d.ts CHANGED
@@ -41,5 +41,11 @@ export declare class Secret {
41
41
  /** Replace the value. The name and scope do not move: rotating a key must
42
42
  * not silently become a different secret. */
43
43
  update(value: string, description?: string): Promise<Secret>;
44
+ /** The only hosts a tool may send this key to, replacing the list. The one
45
+ * deliberate way to send a key to a second host: saving a tool never adds
46
+ * one. `[]` unpins it, so the next tool saved with it pins its own host. */
47
+ setAllowedHosts(hosts: string[]): Promise<Secret>;
48
+ /** The hosts a tool may send it to, as last read. */
49
+ get allowedHosts(): string[] | undefined;
44
50
  delete(): Promise<void>;
45
51
  }
package/secret.js CHANGED
@@ -62,6 +62,21 @@ export class Secret {
62
62
  this.snapshot = res.secret ?? res;
63
63
  return this;
64
64
  }
65
+ /** The only hosts a tool may send this key to, replacing the list. The one
66
+ * deliberate way to send a key to a second host: saving a tool never adds
67
+ * one. `[]` unpins it, so the next tool saved with it pins its own host. */
68
+ async setAllowedHosts(hosts) {
69
+ const res = await this.#http.put(`/v1/secrets/${encodeURIComponent(this.id)}/allowed-hosts`, {
70
+ allowedHosts: hosts,
71
+ });
72
+ if (res.secret)
73
+ this.snapshot = res.secret;
74
+ return this;
75
+ }
76
+ /** The hosts a tool may send it to, as last read. */
77
+ get allowedHosts() {
78
+ return this.snapshot?.allowedHosts;
79
+ }
65
80
  async delete() {
66
81
  await this.#http.delete(`/v1/secrets/${encodeURIComponent(this.id)}`);
67
82
  }
package/secret.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"secret.js","sourceRoot":"","sources":["../src/secret.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAKnD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,MAAM;IACT,EAAE,CAAS;IACX,KAAK,CAAO;IACb,QAAQ,CAAc;IAE9B,YAAY,IAAU,EAAE,EAAU,EAAE,QAAqB;QACxD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACxC,CAAC;IAED,iEAAiE;IACjE,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;IAC5B,CAAC;IAED,8EAA8E;IAC9E,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC/B,CAAC;IAED,0DAA0D;IAC1D,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,wEAAwE;IACxE,IAAI,SAAS;QACZ,OAAO,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;IACjC,CAAC;IAED;;;;;oBAKgB;IAChB,KAAK,CAAC,GAAG;QACR,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAC/B,eAAe,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAC5C,CAAC;QACF,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,OAAO,IAAI,CAAC;IACb,CAAC;IAED;kDAC8C;IAC9C,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,WAAoB;QAC/C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CACjC,eAAe,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAC5C,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAC5D,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC;QAClC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,KAAK,CAAC,MAAM;QACX,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;CACD","sourcesContent":["// A secret: a value your agents use and never see.\n\nimport type { Http } from './http.ts';\nimport type { SecretMeta } from './types.ts';\n\n/**\n * A stored value you hold and act on.\n *\n * A CLASS, for the same reason `Account` is: everything else in this SDK is\n * a thing you hold, and a secret was the odd one out, a bare record with an id\n * you carried around as a string.\n *\n * ```ts\n * const key = await ws.secrets.create({ name: 'APOLLO_API_KEY', value, endUserId });\n * await key.update('rotated-value');\n * await key.delete();\n * ```\n *\n * NOTHING READS THE VALUE BACK, including you. There is no `value` here and no\n * method that returns one. That is deliberate rather than an omission: a value\n * you can read is a value that ends up in a log. The agent substitutes it on\n * the server at the moment a call goes out.\n */\nexport class Secret {\n\treadonly id: string;\n\treadonly #http: Http;\n\tprivate snapshot?: SecretMeta;\n\n\tconstructor(http: Http, id: string, snapshot?: SecretMeta) {\n\t\tthis.#http = http;\n\t\tthis.id = id;\n\t\tif (snapshot) this.snapshot = snapshot;\n\t}\n\n\t/** The name an agent references it by, as `{{secrets.NAME}}`. */\n\tget name(): string | undefined {\n\t\treturn this.snapshot?.name;\n\t}\n\n\t/** The agent this is scoped to, or null when the whole workspace reads it. */\n\tget agentId(): string | null | undefined {\n\t\treturn this.snapshot?.agentId;\n\t}\n\n\t/** The last-known record. Values are never part of it. */\n\tget data(): SecretMeta | undefined {\n\t\treturn this.snapshot;\n\t}\n\n\t/** The end user this belongs to, or null when it is the workspace's. */\n\tget endUserId(): string | null | undefined {\n\t\treturn this.snapshot?.endUserId;\n\t}\n\n\t/** Read it back: name, scope, owner, timestamps. Never the value.\n\t *\n\t * `ws.secret(id)` builds a handle that knows only its id, and until this\n\t * existed there was no way for it to learn anything else. Attaching a secret\n\t * needs its NAME, so a handle that could not answer that could not be\n\t * attached. */\n\tasync get(): Promise<SecretMeta> {\n\t\tconst res = await this.#http.get<{ secret?: SecretMeta } & SecretMeta>(\n\t\t\t`/v1/secrets/${encodeURIComponent(this.id)}`,\n\t\t);\n\t\tconst meta = res.secret ?? res;\n\t\tthis.snapshot = meta;\n\t\treturn meta;\n\t}\n\n\t/** Replace the value. The name and scope do not move: rotating a key must\n\t * not silently become a different secret. */\n\tasync update(value: string, description?: string): Promise<Secret> {\n\t\tconst res = await this.#http.patch<{ secret?: SecretMeta } & SecretMeta>(\n\t\t\t`/v1/secrets/${encodeURIComponent(this.id)}`,\n\t\t\t{ value, ...(description !== undefined && { description }) },\n\t\t);\n\t\tthis.snapshot = res.secret ?? res;\n\t\treturn this;\n\t}\n\n\tasync delete(): Promise<void> {\n\t\tawait this.#http.delete(`/v1/secrets/${encodeURIComponent(this.id)}`);\n\t}\n}\n"]}
1
+ {"version":3,"file":"secret.js","sourceRoot":"","sources":["../src/secret.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAKnD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,MAAM;IACT,EAAE,CAAS;IACX,KAAK,CAAO;IACb,QAAQ,CAAc;IAE9B,YAAY,IAAU,EAAE,EAAU,EAAE,QAAqB;QACxD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACxC,CAAC;IAED,iEAAiE;IACjE,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;IAC5B,CAAC;IAED,8EAA8E;IAC9E,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC/B,CAAC;IAED,0DAA0D;IAC1D,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,wEAAwE;IACxE,IAAI,SAAS;QACZ,OAAO,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;IACjC,CAAC;IAED;;;;;oBAKgB;IAChB,KAAK,CAAC,GAAG;QACR,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAC/B,eAAe,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAC5C,CAAC;QACF,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,OAAO,IAAI,CAAC;IACb,CAAC;IAED;kDAC8C;IAC9C,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,WAAoB;QAC/C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CACjC,eAAe,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAC5C,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAC5D,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC;QAClC,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;iFAE6E;IAC7E,KAAK,CAAC,eAAe,CAAC,KAAe;QACpC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAA0B,eAAe,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE;YACrH,YAAY,EAAE,KAAK;SACnB,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,MAAM;YAAE,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC;QAC3C,OAAO,IAAI,CAAC;IACb,CAAC;IAED,qDAAqD;IACrD,IAAI,YAAY;QACf,OAAO,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,MAAM;QACX,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;CACD","sourcesContent":["// A secret: a value your agents use and never see.\n\nimport type { Http } from './http.ts';\nimport type { SecretMeta } from './types.ts';\n\n/**\n * A stored value you hold and act on.\n *\n * A CLASS, for the same reason `Account` is: everything else in this SDK is\n * a thing you hold, and a secret was the odd one out, a bare record with an id\n * you carried around as a string.\n *\n * ```ts\n * const key = await ws.secrets.create({ name: 'APOLLO_API_KEY', value, endUserId });\n * await key.update('rotated-value');\n * await key.delete();\n * ```\n *\n * NOTHING READS THE VALUE BACK, including you. There is no `value` here and no\n * method that returns one. That is deliberate rather than an omission: a value\n * you can read is a value that ends up in a log. The agent substitutes it on\n * the server at the moment a call goes out.\n */\nexport class Secret {\n\treadonly id: string;\n\treadonly #http: Http;\n\tprivate snapshot?: SecretMeta;\n\n\tconstructor(http: Http, id: string, snapshot?: SecretMeta) {\n\t\tthis.#http = http;\n\t\tthis.id = id;\n\t\tif (snapshot) this.snapshot = snapshot;\n\t}\n\n\t/** The name an agent references it by, as `{{secrets.NAME}}`. */\n\tget name(): string | undefined {\n\t\treturn this.snapshot?.name;\n\t}\n\n\t/** The agent this is scoped to, or null when the whole workspace reads it. */\n\tget agentId(): string | null | undefined {\n\t\treturn this.snapshot?.agentId;\n\t}\n\n\t/** The last-known record. Values are never part of it. */\n\tget data(): SecretMeta | undefined {\n\t\treturn this.snapshot;\n\t}\n\n\t/** The end user this belongs to, or null when it is the workspace's. */\n\tget endUserId(): string | null | undefined {\n\t\treturn this.snapshot?.endUserId;\n\t}\n\n\t/** Read it back: name, scope, owner, timestamps. Never the value.\n\t *\n\t * `ws.secret(id)` builds a handle that knows only its id, and until this\n\t * existed there was no way for it to learn anything else. Attaching a secret\n\t * needs its NAME, so a handle that could not answer that could not be\n\t * attached. */\n\tasync get(): Promise<SecretMeta> {\n\t\tconst res = await this.#http.get<{ secret?: SecretMeta } & SecretMeta>(\n\t\t\t`/v1/secrets/${encodeURIComponent(this.id)}`,\n\t\t);\n\t\tconst meta = res.secret ?? res;\n\t\tthis.snapshot = meta;\n\t\treturn meta;\n\t}\n\n\t/** Replace the value. The name and scope do not move: rotating a key must\n\t * not silently become a different secret. */\n\tasync update(value: string, description?: string): Promise<Secret> {\n\t\tconst res = await this.#http.patch<{ secret?: SecretMeta } & SecretMeta>(\n\t\t\t`/v1/secrets/${encodeURIComponent(this.id)}`,\n\t\t\t{ value, ...(description !== undefined && { description }) },\n\t\t);\n\t\tthis.snapshot = res.secret ?? res;\n\t\treturn this;\n\t}\n\n\t/** The only hosts a tool may send this key to, replacing the list. The one\n\t * deliberate way to send a key to a second host: saving a tool never adds\n\t * one. `[]` unpins it, so the next tool saved with it pins its own host. */\n\tasync setAllowedHosts(hosts: string[]): Promise<Secret> {\n\t\tconst res = await this.#http.put<{ secret?: SecretMeta }>(`/v1/secrets/${encodeURIComponent(this.id)}/allowed-hosts`, {\n\t\t\tallowedHosts: hosts,\n\t\t});\n\t\tif (res.secret) this.snapshot = res.secret;\n\t\treturn this;\n\t}\n\n\t/** The hosts a tool may send it to, as last read. */\n\tget allowedHosts(): string[] | undefined {\n\t\treturn this.snapshot?.allowedHosts;\n\t}\n\n\tasync delete(): Promise<void> {\n\t\tawait this.#http.delete(`/v1/secrets/${encodeURIComponent(this.id)}`);\n\t}\n}\n"]}
package/turn.js CHANGED
@@ -216,6 +216,12 @@ function translate(wire) {
216
216
  // A file the agent wrote in the conversation's drive. Its path is what
217
217
  // conversation.readFile() takes.
218
218
  return typeof wire.path === 'string' && wire.path ? { type: 'file', path: wire.path } : undefined;
219
+ case 'credential_needed':
220
+ // Only the reasons this version knows: a newer API's others are
221
+ // dropped rather than mislabelled.
222
+ return typeof wire.name === 'string' && wire.name && (wire.reason === 'missing' || wire.reason === 'expired')
223
+ ? { type: 'credential_needed', name: wire.name, reason: wire.reason }
224
+ : undefined;
219
225
  case 'error':
220
226
  return {
221
227
  type: 'error',
package/turn.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"turn.js","sourceRoot":"","sources":["../src/turn.ts"],"names":[],"mappings":"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","sourcesContent":["// One turn: `Promise<string> & AsyncIterable<TurnEvent>`.\n//\n// A caller who wants the answer writes `await conversation.ask('...')`. A caller\n// who wants to render it as it arrives writes `for await (const e of\n// conversation.ask('...'))`. One method, two shapes, because making the caller\n// choose `ask` or `askStream` up front means changing the call site later just\n// to show a spinner.\n//\n// THE MESSAGE IS SENT WHEN ask() IS CALLED, not when the result is awaited or\n// iterated. A lazy promise would mean `const t = ask(...)` did nothing and\n// `await t` twice asked twice; sending eagerly makes `ask` the verb it reads as,\n// and calling it twice is then obviously two questions.\n//\n// Awaiting AND iterating the same turn throws rather than replaying. The events\n// are a live stream over a socket, not a stored list, so a second consumer would\n// silently receive nothing at all, which is far worse than an error.\n\nimport { AgentNavaError } from './errors.ts';\nimport type { Step, TurnEvent, Widget } from './types.ts';\n\n/** What `conversation.ask()` returns. */\nexport type Turn = Promise<string> & AsyncIterable<TurnEvent>;\n\n/** Parse an SSE body into the events the API sends.\n *\n * Frames are `data: {json}` separated by blank lines. Anything else on the wire\n * (comments, retry directives, a stray blank) is ignored rather than treated as\n * an error: a proxy is allowed to insert keep-alive comments and a stream that\n * died because of one would be maddening to debug.\n *\n * `turnId` is the turn the API named in its X-Turn-ID header. It becomes the\n * first event, `start`, yielded inside the same cleanup as the rest, so a caller\n * who stops right there still releases the connection. */\nexport async function* parseSSE(body: ReadableStream<Uint8Array>, turnId?: string | null): AsyncGenerator<TurnEvent> {\n\tconst reader = body.getReader();\n\tconst decoder = new TextDecoder();\n\tlet buffer = '';\n\tlet completed = false;\n\tlet assembled = '';\n\tlet finalReply: string | undefined;\n\tlet finalWidgets: Widget[] | undefined;\n\tlet terminal = false;\n\tconst steps = new Map<string, Step>();\n\tconst eventsForLine = (line: string): TurnEvent[] => {\n\t\tconst wire = parseLine(line);\n\t\tif (!wire) return [];\n\t\t// Text being final does not prove the turn completed. Persistence or the\n\t\t// observer can still fail before the runtime's terminal done marker.\n\t\tif (wire.type === 'message-end') {\n\t\t\tfinalReply = typeof wire.final === 'string' ? wire.final : '';\n\t\t\tconst widgets = Array.isArray(wire.widgets) ? wire.widgets.flatMap((w) => widgetOf(w) ?? []) : [];\n\t\t\tfinalWidgets = widgets.length > 0 ? widgets : undefined;\n\t\t\treturn [];\n\t\t}\n\t\tif (wire.type === 'done') {\n\t\t\tterminal = true;\n\t\t\treturn [{ type: 'done', reply: finalReply ?? assembled, ...(finalWidgets && { widgets: finalWidgets }) }];\n\t\t}\n\t\tconst event = translate(wire);\n\t\tif (!event) return [];\n\t\tif (event.type === 'text') assembled += event.text;\n\t\tif (event.type === 'reset') assembled = event.text;\n\t\tif (event.type === 'error') terminal = true;\n\t\tconst progress = event.type === 'tool' ? trackStep(steps, wire) : undefined;\n\t\treturn progress ? [event, progress] : [event];\n\t};\n\ttry {\n\t\tif (turnId) yield { type: 'start', turnId };\n\t\twhile (true) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tif (done) {\n\t\t\t\tcompleted = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbuffer += decoder.decode(value, { stream: true });\n\t\t\t// Split on newlines, keeping the last partial line in the buffer. A\n\t\t\t// frame can be split across two network reads at any byte.\n\t\t\tlet nl = buffer.indexOf('\\n');\n\t\t\twhile (nl !== -1) {\n\t\t\t\tconst line = buffer.slice(0, nl).replace(/\\r$/, '');\n\t\t\t\tbuffer = buffer.slice(nl + 1);\n\t\t\t\tfor (const event of eventsForLine(line)) yield event;\n\t\t\t\tif (terminal) return;\n\t\t\t\tnl = buffer.indexOf('\\n');\n\t\t\t}\n\t\t}\n\t\t// A final frame with no trailing newline still counts.\n\t\tfor (const event of eventsForLine(buffer.replace(/\\r$/, ''))) yield event;\n\t\tif (!terminal) yield { type: 'error', message: 'The response stream ended before the turn finished.', retryable: false };\n\t} catch (error) {\n\t\t// Explicit cancellation keeps its AbortError identity. A lost transport\n\t\t// is an interrupted observer, never evidence that asking again is safe.\n\t\tif (error instanceof Error && error.name === 'AbortError') throw error;\n\t\tyield { type: 'error', message: `The response stream was interrupted: ${error instanceof Error ? error.message : String(error)}`, retryable: false };\n\t} finally {\n\t\t// A final reply, a wire error, or a caller's early break can stop before\n\t\t// EOF. Releasing the lock alone leaves the HTTP body and abort listener\n\t\t// alive; cancel unread data before releasing ownership of the reader.\n\t\ttry {\n\t\t\t// Cleanup can be slow or never settle. Initiate it before releasing\n\t\t\t// ownership, but do not delay the reply/error or iterator return.\n\t\t\tif (!completed) void reader.cancel().catch(() => {});\n\t\t} catch {\n\t\t\t// Cleanup must not replace the reply or the original stream/wire error.\n\t\t} finally {\n\t\t\treader.releaseLock();\n\t\t}\n\t}\n}\n\n/** One frame as it arrives on the wire, before translation. */\ninterface WireEvent {\n\ttype: string;\n\tdelta?: string;\n\tfinal?: string;\n\ttoolId?: string;\n\tname?: string;\n\t/** What a person sees for the tool call (\"Searching the web: <query>\"). */\n\tlabel?: string;\n\tkind?: string;\n\t/** False for a call that is not a step a person should see. */\n\tstep?: boolean;\n\tok?: boolean;\n\tmessage?: string;\n\tretryable?: boolean;\n\tpath?: string;\n\t/** A widget drawn inside the reply (`widget`), or the final list (`message-end`). */\n\twidget?: unknown;\n\twidgets?: unknown[];\n\t/** A guardrail that fired (`guardrail`). */\n\tstage?: string;\n\trule?: string;\n\ttool?: string;\n\taction?: string;\n\t/** The words left standing (`message-reset`). */\n\ttext?: string;\n}\n\n/** A widget off the wire, or undefined for anything that is not one. */\nfunction widgetOf(raw: unknown): Widget | undefined {\n\tconst w = raw as Partial<Widget> | null;\n\tif (!w || typeof w.surfaceId !== 'string' || !Array.isArray(w.components)) return undefined;\n\treturn {\n\t\tsurfaceId: w.surfaceId,\n\t\tat: typeof w.at === 'number' && w.at >= 0 ? w.at : 0,\n\t\tcomponents: w.components,\n\t\tclosed: w.closed !== false,\n\t};\n}\n\nconst STEP_KINDS = new Set<Step['kind']>(['read', 'write', 'edit', 'search', 'shell', 'web', 'data', 'task', 'plan', 'other']);\n\n/**\n * Update the turn's steps from one tool event, and return the whole list when\n * it changed.\n *\n * The steps are the ones the portal's Working card shows: one per tool call a\n * person should see, in the order they started, in the words the API put on\n * the call. The API's labels come from the same mapping the portal uses\n * (packages/backend-contract/src/tool-steps.ts), so a developer's own app and\n * the portal list the same steps in the same words.\n *\n * Built from tool events on every runtime. The runtime's own `progress`\n * snapshot, which only some runtimes send, is not used, so a turn never\n * reports two different lists.\n *\n * An API from before labels sends none. A tool's identifier is not something\n * to show a person, so such a turn has no steps rather than raw names.\n */\nfunction trackStep(steps: Map<string, Step>, wire: WireEvent): TurnEvent | undefined {\n\tif (wire.step === false || !wire.label || !wire.toolId) return undefined;\n\tconst id = wire.toolId;\n\tconst known = steps.get(id);\n\tif (wire.type === 'tool-start' && known) return undefined;\n\t// A kind this version does not know yet still gets a step, as 'other'.\n\tconst kind = STEP_KINDS.has(wire.kind as Step['kind']) ? (wire.kind as Step['kind']) : 'other';\n\tconst status: Step['status'] = wire.type === 'tool-start' ? 'active' : wire.ok === false ? 'error' : 'done';\n\tsteps.set(id, known ? { ...known, status } : { id, label: wire.label, kind, status });\n\t// Copies, so a caller who keeps one list and edits it cannot change the next.\n\treturn { type: 'progress', steps: [...steps.values()].map((step) => ({ ...step })) };\n}\n\n/**\n * The API's event vocabulary, as the SDK's.\n *\n * The wire says `message-delta` / `message-end` / `tool-start` / `tool-end`, and\n * design/sdk-design.md says `text` / `done` / `tool`. Both are right for their\n * own audience: the wire shape is what apps/web's chat renders and has rendered\n * for a long time, and the SDK shape is what reads well at a call site\n * (`if (e.type === 'text')`).\n *\n * So this translates, which is the same job the SDK already does for drive\n * entries and connection rows. It is NOT a rename waiting to happen: changing\n * the wire would break a working chat UI to save a switch statement.\n *\n * Returns undefined for a frame with nothing to report, including an event type\n * this version does not know. A new event must never break an old client.\n * Steps (`progress`) are built beside this, from the tool events (trackStep).\n */\nfunction translate(wire: WireEvent): TurnEvent | undefined {\n\tswitch (wire.type) {\n\t\tcase 'message-delta':\n\t\t\t// A FRAGMENT. Append, do not assemble.\n\t\t\treturn typeof wire.delta === 'string' && wire.delta.length > 0\n\t\t\t\t? { type: 'text', text: wire.delta }\n\t\t\t\t: undefined;\n\t\tcase 'tool-start':\n\t\t\treturn { type: 'tool', name: wire.name ?? 'tool', state: 'start', ...(wire.label && { label: wire.label }) };\n\t\tcase 'tool-end':\n\t\t\treturn {\n\t\t\t\ttype: 'tool',\n\t\t\t\tname: wire.name ?? 'tool',\n\t\t\t\tstate: 'end',\n\t\t\t\t...(wire.label && { label: wire.label }),\n\t\t\t\t...(wire.ok !== undefined && { ok: wire.ok }),\n\t\t\t};\n\t\tcase 'widget': {\n\t\t\tconst widget = widgetOf(wire.widget);\n\t\t\treturn widget ? { type: 'widget', widget } : undefined;\n\t\t}\n\t\tcase 'guardrail':\n\t\t\t// Only the stages this version knows: a newer API's others are dropped\n\t\t\t// rather than mislabelled.\n\t\t\tif (wire.stage === 'message' && typeof wire.rule === 'string') return { type: 'guardrail', stage: 'message', rule: wire.rule, action: 'declined' };\n\t\t\tif (wire.stage === 'reply' && typeof wire.rule === 'string') return { type: 'guardrail', stage: 'reply', rule: wire.rule, action: 'replaced' };\n\t\t\tif (wire.stage === 'tool' && typeof wire.tool === 'string') return { type: 'guardrail', stage: 'tool', tool: wire.tool, action: 'blocked' };\n\t\t\treturn undefined;\n\t\tcase 'message-reset':\n\t\t\t// The words shown so far are replaced, often by nothing.\n\t\t\treturn { type: 'reset', text: typeof wire.text === 'string' ? wire.text : '' };\n\t\tcase 'file':\n\t\t\t// A file the agent wrote in the conversation's drive. Its path is what\n\t\t\t// conversation.readFile() takes.\n\t\t\treturn typeof wire.path === 'string' && wire.path ? { type: 'file', path: wire.path } : undefined;\n\t\tcase 'error':\n\t\t\treturn {\n\t\t\t\ttype: 'error',\n\t\t\t\tmessage: wire.message ?? 'the turn failed',\n\t\t\t\tretryable: wire.retryable === true,\n\t\t\t};\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction parseLine(line: string): WireEvent | undefined {\n\tif (!line.startsWith('data:')) return undefined;\n\tconst payload = line.slice(5).trim();\n\tif (!payload || payload === '[DONE]') return undefined;\n\ttry {\n\t\tconst parsed = JSON.parse(payload) as WireEvent | null;\n\t\treturn parsed && typeof parsed.type === 'string' ? parsed : undefined;\n\t} catch {\n\t\t// A frame we cannot parse is dropped rather than thrown. A malformed frame\n\t\t// must not break a stream that is otherwise fine.\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Build the dual-shaped result.\n *\n * `response` is already in flight when this is called: the caller passes the\n * running request, so the turn is sent whether or not anyone ever consumes it.\n *\n * A THENABLE, not a Promise subclass, and that was measured rather than assumed.\n * A subclass whose base promise never settles deadlocks, because `await` can\n * settle against the base's own state instead of the overridden `then`. A\n * subclass whose base resolves immediately fixes the deadlock and passes\n * `instanceof Promise`, but then anything reading the promise's INTERNAL state\n * sees \"resolved\" for a turn whose `then` rejects, which is a lie that tooling\n * believes. A thenable is honest: `await`, `Promise.all` and `.then/.catch/\n * .finally` are all defined in terms of `then` and all work, and anything that\n * demands a real Promise says so out loud instead of reporting a wrong answer.\n */\nclass TurnImpl implements AsyncIterable<TurnEvent> {\n\tprivate consumed?: 'awaited' | 'iterated';\n\tprivate settled?: Promise<string>;\n\n\tconstructor(private readonly response: Promise<Response>, private readonly recoveryMessage = '') {\n\t\t// ask() starts eagerly, while consuming its thenable may happen later.\n\t\t// Observe early rejection now; keep the ORIGINAL promise so a later\n\t\t// await/iteration still receives that same error.\n\t\tvoid response.catch(() => {});\n\t}\n\n\t/**\n\t * Record how this turn is being consumed, and refuse a second, different way.\n\t *\n\t * AWAITING TWICE IS ALLOWED, deliberately. A promise handing the same value to\n\t * two awaits is exactly what a promise is, and `drain()` memoises so the second\n\t * await costs nothing. Refusing it would break `Promise.all([turn, turn])` and\n\t * every library that attaches a `.catch()` and then awaits the same value.\n\t *\n\t * ITERATING TWICE IS NOT, and neither is mixing the two. The events are a live\n\t * stream over a socket, not a stored list: a second iterator would receive\n\t * nothing at all and report an empty turn, which is worse than an error.\n\t */\n\tprivate claim(how: 'awaited' | 'iterated'): void {\n\t\tif (how === 'awaited' && this.consumed === 'awaited') return;\n\t\tif (this.consumed) {\n\t\t\tthrow new AgentNavaError({\n\t\t\t\tmessage:\n\t\t\t\t\tthis.consumed === how\n\t\t\t\t\t\t? `This turn was already ${how}. Call ask() again to ask again; a turn is a live stream, not a replayable list.`\n\t\t\t\t\t\t: `This turn was already ${this.consumed} and cannot also be ${how}. Pick one: await it for the reply, or iterate it for the events. Call ask() again to ask again.`,\n\t\t\t\tcode: 'turn_already_consumed',\n\t\t\t\tstatus: 400,\n\t\t\t});\n\t\t}\n\t\tthis.consumed = how;\n\t}\n\n\tprivate async open(): Promise<{ body: ReadableStream<Uint8Array>; turnId: string | null }> {\n\t\tconst res = await this.response;\n\t\tif (!res.body) {\n\t\t\tthrow new AgentNavaError({\n\t\t\t\tmessage: `The turn response had no body to stream. ${this.recoveryMessage}`.trim(),\n\t\t\t\tcode: 'bad_response',\n\t\t\t\tstatus: res.status,\n\t\t\t});\n\t\t}\n\t\treturn { body: res.body, turnId: res.headers.get('x-turn-id') };\n\t}\n\n\t/** Drain the stream and resolve to the final reply. */\n\tprivate async settle(): Promise<string> {\n\t\t// parseSSE withholds the final answer until wire done confirms completion.\n\t\t// EOF is an interruption even if some or all of the reply already arrived.\n\t\tfor await (const event of parseSSE((await this.open()).body)) {\n\t\t\tif (event.type === 'done') return event.reply;\n\t\t\tif (event.type === 'error') {\n\t\t\t\t// Awaiting is the shape that throws. Iterating gets the error as an\n\t\t\t\t// event and the loop ends, because a for-await that throws mid-render\n\t\t\t\t// leaves the UI half-painted.\n\t\t\t\tthrow new AgentNavaError({\n\t\t\t\t\tmessage: `${event.message} ${this.recoveryMessage}`.trim(),\n\t\t\t\t\tcode: 'turn_failed',\n\t\t\t\t\tstatus: event.retryable ? 503 : 400,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tthrow new AgentNavaError({ message: `The response stream ended before the turn finished. ${this.recoveryMessage}`.trim(), code: 'turn_failed', status: 400 });\n\t}\n\n\tprivate drain(): Promise<string> {\n\t\t// claim() runs HERE rather than inside settle(), because settle() runs only\n\t\t// once: a second await would skip the check entirely, and awaiting a turn\n\t\t// that was already iterated would quietly return an empty string instead of\n\t\t// saying what went wrong.\n\t\t//\n\t\t// REJECT, never throw. `then` must return a promise; a synchronous throw out\n\t\t// of it escapes the promise chain, so a caller writing\n\t\t// `turn.then(a, b).catch(c)` would get an exception past their own .catch.\n\t\ttry {\n\t\t\tthis.claim('awaited');\n\t\t} catch (err) {\n\t\t\treturn Promise.reject(err);\n\t\t}\n\t\t// Started once. `await` calls `then`, and so does Promise.all, and so does\n\t\t// anything that duck-types a thenable; all of them share one drain.\n\t\tthis.settled ??= this.settle();\n\t\treturn this.settled;\n\t}\n\n\tthen<A = string, B = never>(\n\t\tonOk?: ((value: string) => A | PromiseLike<A>) | null,\n\t\tonErr?: ((reason: unknown) => B | PromiseLike<B>) | null,\n\t): Promise<A | B> {\n\t\treturn this.drain().then(onOk, onErr);\n\t}\n\n\tcatch<B = never>(onErr?: ((reason: unknown) => B | PromiseLike<B>) | null): Promise<string | B> {\n\t\treturn this.drain().catch(onErr);\n\t}\n\n\tfinally(onDone?: (() => void) | null): Promise<string> {\n\t\treturn this.drain().finally(onDone);\n\t}\n\n\tasync *[Symbol.asyncIterator](): AsyncGenerator<TurnEvent> {\n\t\tthis.claim('iterated');\n\t\tconst { body, turnId } = await this.open();\n\t\tfor await (const event of parseSSE(body, turnId)) {\n\t\t\tyield event.type === 'error' && this.recoveryMessage\n\t\t\t\t? { ...event, message: `${event.message} ${this.recoveryMessage}` }\n\t\t\t\t: event;\n\t\t}\n\t}\n}\n\nexport function makeTurn(response: Promise<Response>, recoveryMessage = ''): Turn {\n\treturn new TurnImpl(response, recoveryMessage) as unknown as Turn;\n}\n"]}
1
+ {"version":3,"file":"turn.js","sourceRoot":"","sources":["../src/turn.ts"],"names":[],"mappings":"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","sourcesContent":["// One turn: `Promise<string> & AsyncIterable<TurnEvent>`.\n//\n// A caller who wants the answer writes `await conversation.ask('...')`. A caller\n// who wants to render it as it arrives writes `for await (const e of\n// conversation.ask('...'))`. One method, two shapes, because making the caller\n// choose `ask` or `askStream` up front means changing the call site later just\n// to show a spinner.\n//\n// THE MESSAGE IS SENT WHEN ask() IS CALLED, not when the result is awaited or\n// iterated. A lazy promise would mean `const t = ask(...)` did nothing and\n// `await t` twice asked twice; sending eagerly makes `ask` the verb it reads as,\n// and calling it twice is then obviously two questions.\n//\n// Awaiting AND iterating the same turn throws rather than replaying. The events\n// are a live stream over a socket, not a stored list, so a second consumer would\n// silently receive nothing at all, which is far worse than an error.\n\nimport { AgentNavaError } from './errors.ts';\nimport type { Step, TurnEvent, Widget } from './types.ts';\n\n/** What `conversation.ask()` returns. */\nexport type Turn = Promise<string> & AsyncIterable<TurnEvent>;\n\n/** Parse an SSE body into the events the API sends.\n *\n * Frames are `data: {json}` separated by blank lines. Anything else on the wire\n * (comments, retry directives, a stray blank) is ignored rather than treated as\n * an error: a proxy is allowed to insert keep-alive comments and a stream that\n * died because of one would be maddening to debug.\n *\n * `turnId` is the turn the API named in its X-Turn-ID header. It becomes the\n * first event, `start`, yielded inside the same cleanup as the rest, so a caller\n * who stops right there still releases the connection. */\nexport async function* parseSSE(body: ReadableStream<Uint8Array>, turnId?: string | null): AsyncGenerator<TurnEvent> {\n\tconst reader = body.getReader();\n\tconst decoder = new TextDecoder();\n\tlet buffer = '';\n\tlet completed = false;\n\tlet assembled = '';\n\tlet finalReply: string | undefined;\n\tlet finalWidgets: Widget[] | undefined;\n\tlet terminal = false;\n\tconst steps = new Map<string, Step>();\n\tconst eventsForLine = (line: string): TurnEvent[] => {\n\t\tconst wire = parseLine(line);\n\t\tif (!wire) return [];\n\t\t// Text being final does not prove the turn completed. Persistence or the\n\t\t// observer can still fail before the runtime's terminal done marker.\n\t\tif (wire.type === 'message-end') {\n\t\t\tfinalReply = typeof wire.final === 'string' ? wire.final : '';\n\t\t\tconst widgets = Array.isArray(wire.widgets) ? wire.widgets.flatMap((w) => widgetOf(w) ?? []) : [];\n\t\t\tfinalWidgets = widgets.length > 0 ? widgets : undefined;\n\t\t\treturn [];\n\t\t}\n\t\tif (wire.type === 'done') {\n\t\t\tterminal = true;\n\t\t\treturn [{ type: 'done', reply: finalReply ?? assembled, ...(finalWidgets && { widgets: finalWidgets }) }];\n\t\t}\n\t\tconst event = translate(wire);\n\t\tif (!event) return [];\n\t\tif (event.type === 'text') assembled += event.text;\n\t\tif (event.type === 'reset') assembled = event.text;\n\t\tif (event.type === 'error') terminal = true;\n\t\tconst progress = event.type === 'tool' ? trackStep(steps, wire) : undefined;\n\t\treturn progress ? [event, progress] : [event];\n\t};\n\ttry {\n\t\tif (turnId) yield { type: 'start', turnId };\n\t\twhile (true) {\n\t\t\tconst { done, value } = await reader.read();\n\t\t\tif (done) {\n\t\t\t\tcompleted = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbuffer += decoder.decode(value, { stream: true });\n\t\t\t// Split on newlines, keeping the last partial line in the buffer. A\n\t\t\t// frame can be split across two network reads at any byte.\n\t\t\tlet nl = buffer.indexOf('\\n');\n\t\t\twhile (nl !== -1) {\n\t\t\t\tconst line = buffer.slice(0, nl).replace(/\\r$/, '');\n\t\t\t\tbuffer = buffer.slice(nl + 1);\n\t\t\t\tfor (const event of eventsForLine(line)) yield event;\n\t\t\t\tif (terminal) return;\n\t\t\t\tnl = buffer.indexOf('\\n');\n\t\t\t}\n\t\t}\n\t\t// A final frame with no trailing newline still counts.\n\t\tfor (const event of eventsForLine(buffer.replace(/\\r$/, ''))) yield event;\n\t\tif (!terminal) yield { type: 'error', message: 'The response stream ended before the turn finished.', retryable: false };\n\t} catch (error) {\n\t\t// Explicit cancellation keeps its AbortError identity. A lost transport\n\t\t// is an interrupted observer, never evidence that asking again is safe.\n\t\tif (error instanceof Error && error.name === 'AbortError') throw error;\n\t\tyield { type: 'error', message: `The response stream was interrupted: ${error instanceof Error ? error.message : String(error)}`, retryable: false };\n\t} finally {\n\t\t// A final reply, a wire error, or a caller's early break can stop before\n\t\t// EOF. Releasing the lock alone leaves the HTTP body and abort listener\n\t\t// alive; cancel unread data before releasing ownership of the reader.\n\t\ttry {\n\t\t\t// Cleanup can be slow or never settle. Initiate it before releasing\n\t\t\t// ownership, but do not delay the reply/error or iterator return.\n\t\t\tif (!completed) void reader.cancel().catch(() => {});\n\t\t} catch {\n\t\t\t// Cleanup must not replace the reply or the original stream/wire error.\n\t\t} finally {\n\t\t\treader.releaseLock();\n\t\t}\n\t}\n}\n\n/** One frame as it arrives on the wire, before translation. */\ninterface WireEvent {\n\ttype: string;\n\tdelta?: string;\n\tfinal?: string;\n\ttoolId?: string;\n\tname?: string;\n\t/** What a person sees for the tool call (\"Searching the web: <query>\"). */\n\tlabel?: string;\n\tkind?: string;\n\t/** False for a call that is not a step a person should see. */\n\tstep?: boolean;\n\tok?: boolean;\n\tmessage?: string;\n\tretryable?: boolean;\n\tpath?: string;\n\t/** A widget drawn inside the reply (`widget`), or the final list (`message-end`). */\n\twidget?: unknown;\n\twidgets?: unknown[];\n\t/** A guardrail that fired (`guardrail`). */\n\tstage?: string;\n\trule?: string;\n\ttool?: string;\n\taction?: string;\n\t/** The words left standing (`message-reset`). */\n\ttext?: string;\n\t/** Why a secret is needed (`credential_needed`). */\n\treason?: string;\n}\n\n/** A widget off the wire, or undefined for anything that is not one. */\nfunction widgetOf(raw: unknown): Widget | undefined {\n\tconst w = raw as Partial<Widget> | null;\n\tif (!w || typeof w.surfaceId !== 'string' || !Array.isArray(w.components)) return undefined;\n\treturn {\n\t\tsurfaceId: w.surfaceId,\n\t\tat: typeof w.at === 'number' && w.at >= 0 ? w.at : 0,\n\t\tcomponents: w.components,\n\t\tclosed: w.closed !== false,\n\t};\n}\n\nconst STEP_KINDS = new Set<Step['kind']>(['read', 'write', 'edit', 'search', 'shell', 'web', 'data', 'task', 'plan', 'other']);\n\n/**\n * Update the turn's steps from one tool event, and return the whole list when\n * it changed.\n *\n * The steps are the ones the portal's Working card shows: one per tool call a\n * person should see, in the order they started, in the words the API put on\n * the call. The API's labels come from the same mapping the portal uses\n * (packages/backend-contract/src/tool-steps.ts), so a developer's own app and\n * the portal list the same steps in the same words.\n *\n * Built from tool events on every runtime. The runtime's own `progress`\n * snapshot, which only some runtimes send, is not used, so a turn never\n * reports two different lists.\n *\n * An API from before labels sends none. A tool's identifier is not something\n * to show a person, so such a turn has no steps rather than raw names.\n */\nfunction trackStep(steps: Map<string, Step>, wire: WireEvent): TurnEvent | undefined {\n\tif (wire.step === false || !wire.label || !wire.toolId) return undefined;\n\tconst id = wire.toolId;\n\tconst known = steps.get(id);\n\tif (wire.type === 'tool-start' && known) return undefined;\n\t// A kind this version does not know yet still gets a step, as 'other'.\n\tconst kind = STEP_KINDS.has(wire.kind as Step['kind']) ? (wire.kind as Step['kind']) : 'other';\n\tconst status: Step['status'] = wire.type === 'tool-start' ? 'active' : wire.ok === false ? 'error' : 'done';\n\tsteps.set(id, known ? { ...known, status } : { id, label: wire.label, kind, status });\n\t// Copies, so a caller who keeps one list and edits it cannot change the next.\n\treturn { type: 'progress', steps: [...steps.values()].map((step) => ({ ...step })) };\n}\n\n/**\n * The API's event vocabulary, as the SDK's.\n *\n * The wire says `message-delta` / `message-end` / `tool-start` / `tool-end`, and\n * design/sdk-design.md says `text` / `done` / `tool`. Both are right for their\n * own audience: the wire shape is what apps/web's chat renders and has rendered\n * for a long time, and the SDK shape is what reads well at a call site\n * (`if (e.type === 'text')`).\n *\n * So this translates, which is the same job the SDK already does for drive\n * entries and connection rows. It is NOT a rename waiting to happen: changing\n * the wire would break a working chat UI to save a switch statement.\n *\n * Returns undefined for a frame with nothing to report, including an event type\n * this version does not know. A new event must never break an old client.\n * Steps (`progress`) are built beside this, from the tool events (trackStep).\n */\nfunction translate(wire: WireEvent): TurnEvent | undefined {\n\tswitch (wire.type) {\n\t\tcase 'message-delta':\n\t\t\t// A FRAGMENT. Append, do not assemble.\n\t\t\treturn typeof wire.delta === 'string' && wire.delta.length > 0\n\t\t\t\t? { type: 'text', text: wire.delta }\n\t\t\t\t: undefined;\n\t\tcase 'tool-start':\n\t\t\treturn { type: 'tool', name: wire.name ?? 'tool', state: 'start', ...(wire.label && { label: wire.label }) };\n\t\tcase 'tool-end':\n\t\t\treturn {\n\t\t\t\ttype: 'tool',\n\t\t\t\tname: wire.name ?? 'tool',\n\t\t\t\tstate: 'end',\n\t\t\t\t...(wire.label && { label: wire.label }),\n\t\t\t\t...(wire.ok !== undefined && { ok: wire.ok }),\n\t\t\t};\n\t\tcase 'widget': {\n\t\t\tconst widget = widgetOf(wire.widget);\n\t\t\treturn widget ? { type: 'widget', widget } : undefined;\n\t\t}\n\t\tcase 'guardrail':\n\t\t\t// Only the stages this version knows: a newer API's others are dropped\n\t\t\t// rather than mislabelled.\n\t\t\tif (wire.stage === 'message' && typeof wire.rule === 'string') return { type: 'guardrail', stage: 'message', rule: wire.rule, action: 'declined' };\n\t\t\tif (wire.stage === 'reply' && typeof wire.rule === 'string') return { type: 'guardrail', stage: 'reply', rule: wire.rule, action: 'replaced' };\n\t\t\tif (wire.stage === 'tool' && typeof wire.tool === 'string') return { type: 'guardrail', stage: 'tool', tool: wire.tool, action: 'blocked' };\n\t\t\treturn undefined;\n\t\tcase 'message-reset':\n\t\t\t// The words shown so far are replaced, often by nothing.\n\t\t\treturn { type: 'reset', text: typeof wire.text === 'string' ? wire.text : '' };\n\t\tcase 'file':\n\t\t\t// A file the agent wrote in the conversation's drive. Its path is what\n\t\t\t// conversation.readFile() takes.\n\t\t\treturn typeof wire.path === 'string' && wire.path ? { type: 'file', path: wire.path } : undefined;\n\t\tcase 'credential_needed':\n\t\t\t// Only the reasons this version knows: a newer API's others are\n\t\t\t// dropped rather than mislabelled.\n\t\t\treturn typeof wire.name === 'string' && wire.name && (wire.reason === 'missing' || wire.reason === 'expired')\n\t\t\t\t? { type: 'credential_needed', name: wire.name, reason: wire.reason }\n\t\t\t\t: undefined;\n\t\tcase 'error':\n\t\t\treturn {\n\t\t\t\ttype: 'error',\n\t\t\t\tmessage: wire.message ?? 'the turn failed',\n\t\t\t\tretryable: wire.retryable === true,\n\t\t\t};\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction parseLine(line: string): WireEvent | undefined {\n\tif (!line.startsWith('data:')) return undefined;\n\tconst payload = line.slice(5).trim();\n\tif (!payload || payload === '[DONE]') return undefined;\n\ttry {\n\t\tconst parsed = JSON.parse(payload) as WireEvent | null;\n\t\treturn parsed && typeof parsed.type === 'string' ? parsed : undefined;\n\t} catch {\n\t\t// A frame we cannot parse is dropped rather than thrown. A malformed frame\n\t\t// must not break a stream that is otherwise fine.\n\t\treturn undefined;\n\t}\n}\n\n/**\n * Build the dual-shaped result.\n *\n * `response` is already in flight when this is called: the caller passes the\n * running request, so the turn is sent whether or not anyone ever consumes it.\n *\n * A THENABLE, not a Promise subclass, and that was measured rather than assumed.\n * A subclass whose base promise never settles deadlocks, because `await` can\n * settle against the base's own state instead of the overridden `then`. A\n * subclass whose base resolves immediately fixes the deadlock and passes\n * `instanceof Promise`, but then anything reading the promise's INTERNAL state\n * sees \"resolved\" for a turn whose `then` rejects, which is a lie that tooling\n * believes. A thenable is honest: `await`, `Promise.all` and `.then/.catch/\n * .finally` are all defined in terms of `then` and all work, and anything that\n * demands a real Promise says so out loud instead of reporting a wrong answer.\n */\nclass TurnImpl implements AsyncIterable<TurnEvent> {\n\tprivate consumed?: 'awaited' | 'iterated';\n\tprivate settled?: Promise<string>;\n\n\tconstructor(private readonly response: Promise<Response>, private readonly recoveryMessage = '') {\n\t\t// ask() starts eagerly, while consuming its thenable may happen later.\n\t\t// Observe early rejection now; keep the ORIGINAL promise so a later\n\t\t// await/iteration still receives that same error.\n\t\tvoid response.catch(() => {});\n\t}\n\n\t/**\n\t * Record how this turn is being consumed, and refuse a second, different way.\n\t *\n\t * AWAITING TWICE IS ALLOWED, deliberately. A promise handing the same value to\n\t * two awaits is exactly what a promise is, and `drain()` memoises so the second\n\t * await costs nothing. Refusing it would break `Promise.all([turn, turn])` and\n\t * every library that attaches a `.catch()` and then awaits the same value.\n\t *\n\t * ITERATING TWICE IS NOT, and neither is mixing the two. The events are a live\n\t * stream over a socket, not a stored list: a second iterator would receive\n\t * nothing at all and report an empty turn, which is worse than an error.\n\t */\n\tprivate claim(how: 'awaited' | 'iterated'): void {\n\t\tif (how === 'awaited' && this.consumed === 'awaited') return;\n\t\tif (this.consumed) {\n\t\t\tthrow new AgentNavaError({\n\t\t\t\tmessage:\n\t\t\t\t\tthis.consumed === how\n\t\t\t\t\t\t? `This turn was already ${how}. Call ask() again to ask again; a turn is a live stream, not a replayable list.`\n\t\t\t\t\t\t: `This turn was already ${this.consumed} and cannot also be ${how}. Pick one: await it for the reply, or iterate it for the events. Call ask() again to ask again.`,\n\t\t\t\tcode: 'turn_already_consumed',\n\t\t\t\tstatus: 400,\n\t\t\t});\n\t\t}\n\t\tthis.consumed = how;\n\t}\n\n\tprivate async open(): Promise<{ body: ReadableStream<Uint8Array>; turnId: string | null }> {\n\t\tconst res = await this.response;\n\t\tif (!res.body) {\n\t\t\tthrow new AgentNavaError({\n\t\t\t\tmessage: `The turn response had no body to stream. ${this.recoveryMessage}`.trim(),\n\t\t\t\tcode: 'bad_response',\n\t\t\t\tstatus: res.status,\n\t\t\t});\n\t\t}\n\t\treturn { body: res.body, turnId: res.headers.get('x-turn-id') };\n\t}\n\n\t/** Drain the stream and resolve to the final reply. */\n\tprivate async settle(): Promise<string> {\n\t\t// parseSSE withholds the final answer until wire done confirms completion.\n\t\t// EOF is an interruption even if some or all of the reply already arrived.\n\t\tfor await (const event of parseSSE((await this.open()).body)) {\n\t\t\tif (event.type === 'done') return event.reply;\n\t\t\tif (event.type === 'error') {\n\t\t\t\t// Awaiting is the shape that throws. Iterating gets the error as an\n\t\t\t\t// event and the loop ends, because a for-await that throws mid-render\n\t\t\t\t// leaves the UI half-painted.\n\t\t\t\tthrow new AgentNavaError({\n\t\t\t\t\tmessage: `${event.message} ${this.recoveryMessage}`.trim(),\n\t\t\t\t\tcode: 'turn_failed',\n\t\t\t\t\tstatus: event.retryable ? 503 : 400,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tthrow new AgentNavaError({ message: `The response stream ended before the turn finished. ${this.recoveryMessage}`.trim(), code: 'turn_failed', status: 400 });\n\t}\n\n\tprivate drain(): Promise<string> {\n\t\t// claim() runs HERE rather than inside settle(), because settle() runs only\n\t\t// once: a second await would skip the check entirely, and awaiting a turn\n\t\t// that was already iterated would quietly return an empty string instead of\n\t\t// saying what went wrong.\n\t\t//\n\t\t// REJECT, never throw. `then` must return a promise; a synchronous throw out\n\t\t// of it escapes the promise chain, so a caller writing\n\t\t// `turn.then(a, b).catch(c)` would get an exception past their own .catch.\n\t\ttry {\n\t\t\tthis.claim('awaited');\n\t\t} catch (err) {\n\t\t\treturn Promise.reject(err);\n\t\t}\n\t\t// Started once. `await` calls `then`, and so does Promise.all, and so does\n\t\t// anything that duck-types a thenable; all of them share one drain.\n\t\tthis.settled ??= this.settle();\n\t\treturn this.settled;\n\t}\n\n\tthen<A = string, B = never>(\n\t\tonOk?: ((value: string) => A | PromiseLike<A>) | null,\n\t\tonErr?: ((reason: unknown) => B | PromiseLike<B>) | null,\n\t): Promise<A | B> {\n\t\treturn this.drain().then(onOk, onErr);\n\t}\n\n\tcatch<B = never>(onErr?: ((reason: unknown) => B | PromiseLike<B>) | null): Promise<string | B> {\n\t\treturn this.drain().catch(onErr);\n\t}\n\n\tfinally(onDone?: (() => void) | null): Promise<string> {\n\t\treturn this.drain().finally(onDone);\n\t}\n\n\tasync *[Symbol.asyncIterator](): AsyncGenerator<TurnEvent> {\n\t\tthis.claim('iterated');\n\t\tconst { body, turnId } = await this.open();\n\t\tfor await (const event of parseSSE(body, turnId)) {\n\t\t\tyield event.type === 'error' && this.recoveryMessage\n\t\t\t\t? { ...event, message: `${event.message} ${this.recoveryMessage}` }\n\t\t\t\t: event;\n\t\t}\n\t}\n}\n\nexport function makeTurn(response: Promise<Response>, recoveryMessage = ''): Turn {\n\treturn new TurnImpl(response, recoveryMessage) as unknown as Turn;\n}\n"]}
package/types.d.ts CHANGED
@@ -191,11 +191,14 @@ export type AgentConnection = {
191
191
  /** An account id in this workspace whose app is `app`. */
192
192
  account: string;
193
193
  endUser?: never;
194
+ /** Which of the app's own tools the agent may use; absent for the app's default. */
195
+ tools?: string[];
194
196
  } | {
195
197
  name: string;
196
198
  app: AppId;
197
199
  endUser: true;
198
200
  account?: never;
201
+ tools?: string[];
199
202
  };
200
203
  /** What an agent NEEDS, not the stored value. `Secret` is the value. */
201
204
  export interface SecretRequirement {
@@ -227,6 +230,40 @@ export interface HttpToolParam {
227
230
  properties?: Record<string, HttpToolParam>;
228
231
  items?: HttpToolParam;
229
232
  additionalProperties?: boolean;
233
+ /**
234
+ * A regular expression the whole value must match (strings only). Checked
235
+ * before the call; a value that does not match is refused, so what a person
236
+ * typed cannot change the request it is written into. Patterns that repeat a
237
+ * repeating group, like `(a+)+`, are refused when saved.
238
+ *
239
+ * ```ts
240
+ * order_number: { type: 'string', required: true, pattern: '[0-9]{1,10}' }
241
+ * ```
242
+ */
243
+ pattern?: string;
244
+ /** The longest value accepted (strings only). 2000 when a pattern is set
245
+ * and this is not. */
246
+ maxLength?: number;
247
+ }
248
+ /** One check on an HTTP tool's answer: the value at `field` (a dotted path,
249
+ * numbers for list positions) must equal `equals`, which may use
250
+ * `{{params.NAME}}`. */
251
+ export interface HttpToolMatch {
252
+ field: string;
253
+ equals: string;
254
+ ignoreCase?: boolean;
255
+ }
256
+ /** Something the agent may ask the website page to do, such as add to cart.
257
+ * The page carries it out with `window.AgentNava.page.handle(name, fn)`, and
258
+ * what `fn` returns goes back to the agent. Only a website chat has a page; in
259
+ * any other conversation the agent is told it cannot. */
260
+ export interface PageAction {
261
+ /** Lowercase letters, digits and `_`; never one of the agent's HTTP tool names. */
262
+ name: string;
263
+ /** What it does and when the agent should use it. */
264
+ description: string;
265
+ /** What the agent fills in; the page's handler receives these as its argument. */
266
+ params?: Record<string, HttpToolParam>;
230
267
  }
231
268
  export interface HttpTool {
232
269
  name: string;
@@ -238,6 +275,46 @@ export interface HttpTool {
238
275
  params?: Record<string, HttpToolParam>;
239
276
  secrets?: string[];
240
277
  timeoutMs?: number;
278
+ /**
279
+ * Checks on the answer, all of which must pass. If any fails, or the call
280
+ * answers with an error or a body that is not JSON, the agent gets only
281
+ * `notFound`, never the answer. Use it for "show an order only when the
282
+ * number and the email both match":
283
+ *
284
+ * ```ts
285
+ * requireMatch: [
286
+ * { field: 'data.orders.nodes.0.name', equals: '#{{params.order_number}}' },
287
+ * { field: 'data.orders.nodes.0.email', equals: '{{params.email}}', ignoreCase: true },
288
+ * ],
289
+ * notFound: 'No order matches that number and email.',
290
+ * ```
291
+ */
292
+ requireMatch?: HttpToolMatch[];
293
+ /** What the agent gets when a check fails. Default: "Not found." */
294
+ notFound?: string;
295
+ /**
296
+ * Sign the request in with one of the agent's connections (its `name`)
297
+ * instead of a stored key. The connection's provider adds a current
298
+ * credential and keeps it fresh, so the credential never leaves it. The
299
+ * address must start with `https://` and a written-out host, and that host
300
+ * must be the connected account's own API; leave out `Authorization`.
301
+ *
302
+ * ```ts
303
+ * { name: 'look_up_order', method: 'POST', signInWith: 'shopify',
304
+ * url: 'https://my-store.myshopify.com/admin/api/2026-04/graphql.json', ... }
305
+ * ```
306
+ */
307
+ signInWith?: string;
308
+ /**
309
+ * Values the website page supplies for this visitor, used as
310
+ * `{{pageEncoded.NAME}}` in the address, `{{pageJson.NAME}}` in a JSON body,
311
+ * or `{{page.NAME}}` for a plain token (letters, digits, `- _ . ~` only).
312
+ * On the page, the chat script's public call sets them:
313
+ * `window.AgentNava.page.set('cart_id', value)`. They are kept per
314
+ * conversation and filled in at call time; the model sees one only if the
315
+ * API's answer repeats it, and logs redact them. Names: lowercase letters, digits, `_`.
316
+ */
317
+ pageValues?: string[];
241
318
  }
242
319
  /**
243
320
  * Guardrails: what the platform enforces on an agent, even when someone tries to
@@ -303,6 +380,8 @@ export interface AgentData {
303
380
  triggers: Trigger[];
304
381
  mcpServers: McpServer[];
305
382
  httpTools: HttpTool[];
383
+ /** Always a list, empty when the agent has none. */
384
+ pageActions: PageAction[];
306
385
  /** Workspace knowledge bases this agent reads, by key. Always present, empty
307
386
  * when none are attached, so a caller never has to distinguish "none" from
308
387
  * "an older server that did not send the field". */
@@ -361,6 +440,20 @@ export interface AgentStatus {
361
440
  name: string;
362
441
  }[];
363
442
  }
443
+ /**
444
+ * One of an app's own ready-made tools, as `ws.apps.tools(app)` lists it: what
445
+ * a connection's `tools` chooses from.
446
+ */
447
+ export interface AppTool {
448
+ /** What a connection's `tools` names: `SLACK_SEND_MESSAGE`. */
449
+ id: string;
450
+ /** The tool service's name for it: "Send message". */
451
+ name: string;
452
+ /** Its description's first sentence. */
453
+ summary: string;
454
+ /** It removes something (a message, a file, a record). */
455
+ deletes?: true;
456
+ }
364
457
  /**
365
458
  * One of an agent's connections as it stands right now: the account it names,
366
459
  * and whether that account works. What `agent.connections.list()` returns.
@@ -384,6 +477,8 @@ export interface ConnectionStatus {
384
477
  account?: AccountData;
385
478
  /** True when each person talking to the agent signs in with their own. */
386
479
  endUser?: true;
480
+ /** Which of the app's own tools the agent may use; absent for the app's default. */
481
+ tools?: string[];
387
482
  /** Whether the connection works now, as the API reports it. For an agent
388
483
  * creator's account it follows that account's status. */
389
484
  status: string;
@@ -600,6 +695,18 @@ export type TurnEvent =
600
695
  | {
601
696
  type: 'reset';
602
697
  text: string;
698
+ }
699
+ /** Sent at the start of a turn, once per name: a secret the agent declared
700
+ * for each conversation, and one of its tools uses, has no usable value
701
+ * here. `expired`: the value you pushed has run out. `missing`: none was
702
+ * given, or the stored secret attached under that name was deleted or no
703
+ * longer belongs to this person. The turn still runs; the tool says it
704
+ * cannot sign in. Push a fresh value (`ask(text, { secrets })`) and ask
705
+ * again. */
706
+ | {
707
+ type: 'credential_needed';
708
+ name: string;
709
+ reason: 'missing' | 'expired';
603
710
  } | {
604
711
  type: 'done';
605
712
  reply: string;
@@ -788,6 +895,8 @@ export interface AgentFields {
788
895
  triggers?: Trigger[];
789
896
  mcpServers?: McpServer[];
790
897
  httpTools?: HttpTool[];
898
+ /** Things the agent may ask the website page to do (see PageAction). */
899
+ pageActions?: PageAction[];
791
900
  }
792
901
  export interface ProjectFields {
793
902
  name?: string;
@@ -905,6 +1014,19 @@ export interface SecretMeta {
905
1014
  * it. A secret with one can only be attached to a conversation launched for
906
1015
  * that same person. */
907
1016
  endUserId?: string | null;
1017
+ /** The only hosts a tool may send this key to. Empty until the first tool
1018
+ * saved with it pins its own host; add one on purpose with
1019
+ * `secret.setAllowedHosts([...])`. */
1020
+ allowedHosts?: string[];
1021
+ /** Who created it and who last changed its value or hosts: a member's id,
1022
+ * `api_key:<id>`, or `system`. A tool save that pins its hosts is not a
1023
+ * change to it. Null on a secret from before these were kept. */
1024
+ createdBy?: string | null;
1025
+ updatedBy?: string | null;
1026
+ /** The same, in words: a member's first name or "API key <name>"; null
1027
+ * for our own system or someone no longer in the workspace. */
1028
+ createdByName?: string | null;
1029
+ updatedByName?: string | null;
908
1030
  createdAt?: string;
909
1031
  updatedAt?: string;
910
1032
  lastUsedAt?: string | null;
@@ -1012,6 +1134,15 @@ export type DatabaseTestResult = {
1012
1134
  message: string;
1013
1135
  };
1014
1136
  };
1137
+ /** An agent as its draft holds it, from `agent.draft()`. */
1138
+ export interface AgentDraft {
1139
+ /** An unpublished draft exists. */
1140
+ exists: boolean;
1141
+ /** The draft differs from the live version. */
1142
+ hasUnpublishedChanges: boolean;
1143
+ /** The configuration the draft holds, or the live one when there is no draft. */
1144
+ config: AgentFields;
1145
+ }
1015
1146
  /**
1016
1147
  * How an agent's website chat looks (the share link, and the chat the embed
1017
1148
  * script opens on a website). Every setting is optional; one left out keeps the
@@ -1034,4 +1165,17 @@ export interface WebsiteChatAppearance {
1034
1165
  /** Whether the embed script opens the chat when a page loads, on screens
1035
1166
  * wider than a phone. New agents start `open`; absent means closed. */
1036
1167
  opens?: 'open' | 'closed';
1168
+ /** Up to three short ways in (60 characters each), shown on the chat's
1169
+ * welcome card before a visitor's first message, such as "Book a visit".
1170
+ * A tap sends its words as the visitor's message. The Agent Builder writes
1171
+ * them from the agent's job; without them the card shows the greeting. */
1172
+ starters?: string[];
1173
+ /** `false` hides the "Made with AgentNava" link under the chat; the
1174
+ * "<name> is an AI assistant." notice always stays. Shown by default.
1175
+ * Hiding it needs a paid plan (Team and up): on a free plan the update is
1176
+ * refused with 403 `plan_required`. A workspace a partner app works in whose
1177
+ * marketplace forbids "powered by" marks (the Wix App Market) may hide it on
1178
+ * every plan. When a paid plan ends, the link shows again and this choice is
1179
+ * kept. */
1180
+ showMadeWith?: boolean;
1037
1181
  }