assets/mcp-cards/agent-card-v8.html.txt
Rama main · réplica de lectura del repositorio original.
<!doctype html>
<html lang="en">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Chickpea Agent card</title>
<style>/*
* Framework-free MCP App styles.
*/
@layer base {
:root {
color-scheme: light dark;
--background: var(
--color-background-primary,
light-dark(rgb(255 255 255), rgb(24 24 24))
);
--foreground: var(
--color-text-primary,
light-dark(rgb(26 28 31), rgb(255 255 255))
);
--card: color-mix(in oklab, var(--foreground) 5%, var(--background));
--card-foreground: var(--color-text-primary, var(--foreground));
--primary: var(
--color-text-info,
light-dark(rgb(51 156 255), rgb(131 195 255))
);
--primary-foreground: var(
--color-text-inverse,
light-dark(rgb(255 255 255), rgb(13 13 13))
);
--secondary: var(
--color-background-secondary,
light-dark(rgb(255 255 255 / 96%), rgb(54 54 54 / 96%))
);
--secondary-foreground: var(--color-text-primary, var(--foreground));
--muted: color-mix(in srgb, var(--foreground) 10%, transparent);
--muted-foreground: var(
--color-text-secondary,
light-dark(rgb(26 28 31 / 49.4%), rgb(255 255 255 / 49.8%))
);
--accent: var(
--color-background-info,
light-dark(rgb(229 242 255), rgb(13 39 63))
);
--accent-foreground: var(--color-text-info, var(--primary));
--destructive: var(
--color-text-warning,
light-dark(rgb(226 85 7), rgb(255 133 73))
);
--border: var(
--color-border-secondary,
light-dark(rgb(26 28 31 / 8%), rgb(255 255 255 / 8.2%))
);
--input: var(
--color-border-primary,
light-dark(rgb(26 28 31 / 11.8%), rgb(255 255 255 / 12%))
);
--ring: var(--color-ring-primary, var(--primary));
--font-size-base: var(--font-text-md-size, 14px);
--radius: var(--border-radius-lg, 12.5px);
}
:root[data-theme="light"] {
color-scheme: light;
}
:root[data-theme="dark"] {
color-scheme: dark;
}
body {
margin: 0;
color: var(--foreground);
background: var(--background);
font-size: max(11px, var(--font-size-base));
font-weight: var(--font-weight-normal, 430);
line-height: 1.5;
}
/* MCP sandboxes can force their own font on body, so restore the host font below it. */
body,
body > * {
font-family: var(
--font-sans,
-apple-system,
system-ui,
"Segoe UI",
sans-serif
);
}
h1,
h2,
h3,
p {
margin-block: 0;
}
h1,
h2,
h3 {
font-weight: var(--font-weight-medium, 500);
line-height: 1.25;
}
h1 {
font-size: calc(var(--font-size-base) * 1.7142857143);
}
h2 {
font-size: calc(var(--font-size-base) * 1.4285714286);
}
h3 {
font-size: calc(var(--font-size-base) * 1.2857142857);
}
}
@layer components {
.cursor-interaction {
cursor: var(--cursor-interaction, pointer);
}
.card {
min-width: 0;
padding: 12px;
overflow-wrap: break-word;
border-radius: calc(var(--radius) * 1.6);
corner-shape: superellipse(1.5);
color: var(--card-foreground);
background: var(--card);
}
.btn,
.form-check-input,
.form-control,
.form-select {
box-sizing: border-box;
font: inherit;
}
.btn {
appearance: button;
display: inline-flex;
inline-size: fit-content;
max-inline-size: 100%;
min-height: 28px;
align-items: center;
justify-content: center;
gap: 4px;
margin: 0;
padding: 0 8px;
border: 1px solid var(--input);
border-radius: var(--radius);
corner-shape: superellipse(1.5);
color: var(--secondary-foreground);
background: var(--secondary);
cursor: var(--cursor-interaction, pointer);
text-align: center;
text-decoration: none;
white-space: nowrap;
user-select: none;
}
.btn:not(:disabled):hover {
background: color-mix(in srgb, var(--foreground) 6%, var(--secondary));
}
.btn-primary {
border-color: transparent;
color: var(--primary-foreground);
background: var(--foreground);
background-clip: padding-box;
}
.btn-primary:not(:disabled):hover {
background: color-mix(in srgb, var(--foreground) 80%, transparent);
background-clip: padding-box;
}
.btn-ghost {
border-color: transparent;
color: var(--muted-foreground);
background: transparent;
}
.btn-ghost:not(:disabled):hover {
color: var(--foreground);
background: color-mix(in srgb, var(--foreground) 6%, var(--secondary));
}
.btn:not(.btn-primary):is([aria-pressed="true"], [aria-selected="true"]) {
border-color: var(--primary);
color: var(--primary-foreground);
background: var(--primary);
}
.btn:focus-visible {
outline: 2px solid var(--ring);
outline-offset: 2px;
}
.btn:disabled,
.form-check-input:disabled,
.form-control:disabled,
.form-select:disabled {
cursor: not-allowed;
opacity: 0.4;
}
.form-label {
display: block;
margin-bottom: 6px;
color: var(--foreground);
}
.form-control,
.form-select {
display: block;
width: 100%;
min-height: 28px;
padding: 0 8px;
outline: none;
border: 1px solid var(--input);
border-radius: var(--radius);
corner-shape: superellipse(1.5);
color: var(--foreground);
background: var(--secondary);
}
.form-control::placeholder {
color: var(--muted-foreground);
}
.form-select {
appearance: none;
padding-right: 32px;
background-image:
linear-gradient(45deg, transparent 50%, var(--muted-foreground) 50%),
linear-gradient(135deg, var(--muted-foreground) 50%, transparent 50%);
background-position:
calc(100% - 14px) 50%,
calc(100% - 10px) 50%;
background-repeat: no-repeat;
background-size: 4px 4px;
cursor: var(--cursor-interaction, pointer);
}
.form-select:not(:disabled):hover {
background-color: color-mix(
in srgb,
var(--foreground) 6%,
var(--secondary)
);
}
textarea.form-control {
min-height: 72px;
padding: 8px 10px;
resize: vertical;
}
.form-control:focus-visible,
.form-select:focus-visible {
border-color: var(--ring);
box-shadow: inset 0 0 0 1px var(--ring);
}
.form-check {
display: flex;
min-height: 20px;
align-items: center;
gap: 8px;
}
.form-check-input {
appearance: none;
display: grid;
width: 16px;
height: 16px;
flex: 0 0 auto;
place-items: center;
margin: 0;
border: 1px solid var(--input);
border-radius: 5px;
corner-shape: superellipse(1.5);
color: var(--primary-foreground);
background: var(--secondary);
cursor: var(--cursor-interaction, pointer);
}
.form-check-input:checked {
border-color: var(--primary);
background: var(--primary);
}
.form-check-input:checked::after {
width: 7px;
height: 4px;
border-bottom: 2px solid currentColor;
border-left: 2px solid currentColor;
content: "";
transform: translateY(-1px) rotate(-45deg);
}
.form-check-input:focus-visible {
outline: 2px solid var(--ring);
outline-offset: 2px;
}
.form-check-label {
color: var(--foreground);
}
svg.lucide {
display: block;
width: 16px;
height: 16px;
flex: none;
stroke-width: 1.6;
}
.text-small {
font-size: max(11px, calc(var(--font-size-base) - 2px));
}
.text-muted {
color: var(--muted-foreground);
}
.text-destructive {
color: var(--destructive);
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
}
/*
* The Agent card in ChatGPT's own look: its type, colors and black primary
* buttons, from the host's style variables. Chickpea shows only in the avatar
* and the quote accent. Without host variables the colors fall back to the
* mockup's palette, and without a host theme to light.
*/
:root:not([data-theme]) {
color-scheme: light;
}
:root {
--cp-bg: var(--color-background-primary, light-dark(#ffffff, #181818));
--cp-fg: var(--color-text-primary, light-dark(#0d0d0d, #ededed));
/* Secondary text stays at AA contrast; the host's tertiary text does not. */
--cp-muted: var(--color-text-secondary, light-dark(#5d5d5d, #cdcdcd));
--cp-line: var(--color-border-primary, light-dark(#e5e5e5, rgb(255 255 255 / 20%)));
--cp-soft: light-dark(#f7f7f7, rgb(255 255 255 / 6%));
--cp-ok: light-dark(#1a7f37, #40c977);
--cp-warn: light-dark(#a15c00, #f0a050);
--cp-danger: #c62828;
--cp-danger-hover: #a31f1f;
--cp-accent: #e8901a;
--cp-size: var(--font-text-md-size, 14px);
}
html,
body {
background: var(--cp-bg);
color: var(--cp-fg);
}
body {
font-size: var(--cp-size);
line-height: 1.45;
}
.cp-card {
display: flex;
flex-direction: column;
gap: 0;
padding: 16px;
overflow-wrap: anywhere;
}
.cp-hdr {
display: flex;
gap: 12px;
align-items: center;
}
.cp-avatar {
flex: none;
display: block;
}
.cp-avatar svg,
.cp-avatar img {
display: block;
width: 100%;
height: 100%;
}
/* Slack's rounded square, cropped as Admin and the setup page crop it. */
.cp-avatar img {
object-fit: cover;
}
.cp-avatar-lg {
width: 44px;
height: 44px;
}
.cp-avatar-lg img {
border-radius: 12px;
}
.cp-avatar-sm {
width: 26px;
height: 26px;
}
.cp-avatar-sm img {
border-radius: 7px;
}
/* On an alert card, an Agent's picture keeps the alert art's red. */
.cp-avatar-alert img {
outline: 2px solid var(--cp-danger);
outline-offset: 1px;
}
.cp-heading {
min-width: 0;
}
.cp-title {
margin: 0;
font-size: calc(var(--cp-size) * 1.143);
font-weight: 600;
line-height: 1.25;
}
/* Focus lands here after a redraw only so the keyboard stays on the card. */
.cp-title:focus {
outline: none;
}
.cp-sub {
margin: 2px 0 0;
color: var(--cp-muted);
font-size: calc(var(--cp-size) * 0.93);
}
.cp-ok {
color: var(--cp-ok);
}
.cp-warn {
color: var(--cp-warn);
}
.cp-text {
margin: 12px 0 0;
white-space: pre-line;
}
.cp-sect {
margin: 14px 0 6px;
color: var(--cp-muted);
font-size: calc(var(--cp-size) * 0.79);
font-weight: 600;
letter-spacing: 0.05em;
text-transform: uppercase;
}
.cp-sect + .cp-text {
margin-top: 0;
}
.cp-quote {
margin: 6px 0;
padding: 2px 0 2px 10px;
border-left: 3px solid var(--cp-accent);
white-space: pre-line;
}
.cp-note {
margin: 6px 0 0;
color: var(--cp-muted);
font-size: calc(var(--cp-size) * 0.93);
}
.cp-note.cp-warn {
color: var(--cp-warn);
}
.cp-thread {
display: flex;
flex-direction: column;
gap: 9px;
margin: 12px 0 0;
padding: 10px 12px;
border: 1px solid var(--cp-line);
border-radius: 12px;
background: var(--cp-soft);
}
.cp-msg {
display: grid;
grid-template-columns: 26px 1fr;
gap: 8px;
font-size: calc(var(--cp-size) * 0.964);
}
/*
* A host may pass an example's line breaks as they are; they show as written.
* A long one shows its start and an ellipsis: the tool's result holds it whole.
*/
.cp-said {
display: -webkit-box;
overflow: hidden;
-webkit-box-orient: vertical;
white-space: pre-line;
overflow-wrap: anywhere;
}
.cp-clamp-2 {
-webkit-line-clamp: 2;
}
.cp-clamp-5 {
-webkit-line-clamp: 5;
}
.cp-init {
display: grid;
width: 26px;
height: 26px;
place-items: center;
border-radius: 7px;
background: #4a6cc4;
color: #ffffff;
font-size: calc(var(--cp-size) * 0.86);
font-weight: 600;
}
.cp-line {
margin: 10px 0 0;
color: var(--cp-muted);
font-size: calc(var(--cp-size) * 0.964);
}
.cp-line b {
color: var(--cp-fg);
font-weight: 500;
}
.cp-chip {
display: inline-flex;
padding: 0 9px;
border: 1px solid var(--cp-line);
border-radius: 999px;
background: var(--cp-soft);
color: var(--cp-fg);
font-size: calc(var(--cp-size) * 0.9);
}
.cp-foot {
margin: 14px 0 0;
color: var(--cp-muted);
font-size: calc(var(--cp-size) * 0.93);
}
.cp-steps {
display: flex;
flex-direction: column;
gap: 7px;
margin: 12px 0 0;
padding: 0;
list-style: none;
font-size: calc(var(--cp-size) * 0.964);
}
.cp-steps li {
display: flex;
gap: 8px;
align-items: center;
}
.cp-ic {
display: inline-grid;
flex: none;
width: 18px;
height: 18px;
box-sizing: border-box;
place-items: center;
border-radius: 50%;
font-size: 11px;
}
.cp-ic-done {
background: color-mix(in srgb, var(--cp-ok) 14%, transparent);
color: var(--cp-ok);
}
.cp-ic-now {
border: 2px solid var(--cp-accent);
border-right-color: transparent;
animation: cp-spin 0.9s linear infinite;
}
.cp-ic-todo {
border: 1.5px solid var(--cp-line);
}
.cp-ic-failed {
background: color-mix(in srgb, var(--cp-danger) 14%, transparent);
color: light-dark(var(--cp-danger), #ff8a80);
font-weight: 700;
}
@keyframes cp-spin {
to {
transform: rotate(360deg);
}
}
@media (prefers-reduced-motion: reduce) {
.cp-ic-now {
animation: none;
}
}
.cp-acts {
display: flex;
flex-wrap: wrap;
gap: 8px;
align-items: center;
margin-top: 14px;
}
.cp-card .btn {
min-height: 34px;
padding: 0 14px;
border-radius: 999px;
font-size: calc(var(--cp-size) * 0.964);
font-weight: 600;
}
.cp-btn-primary {
border-color: transparent;
color: var(--color-text-inverse, light-dark(#ffffff, #0d0d0d));
background: var(--cp-fg);
}
.cp-btn-primary:not(:disabled):hover {
background: color-mix(in srgb, var(--cp-fg) 82%, var(--cp-bg));
}
.cp-btn-danger {
border-color: transparent;
color: #ffffff;
background: var(--cp-danger);
}
.cp-btn-danger:not(:disabled):hover {
background: var(--cp-danger-hover);
}
.cp-btn-secondary {
border-color: var(--cp-line);
color: var(--cp-fg);
background: var(--cp-bg);
}
.cp-card .btn:focus-visible {
outline: 2px solid var(--color-ring-primary, light-dark(#0169cc, #ffffff));
outline-offset: 2px;
}
.cp-acts[hidden],
.cp-error[hidden] {
display: none;
}
.cp-error {
margin: 10px 0 0;
color: light-dark(#b42318, #ff8a80);
font-size: calc(var(--cp-size) * 0.93);
}
.cp-rows {
display: flex;
flex-direction: column;
container-type: inline-size;
margin: 12px 0 0;
padding: 0;
border: 1px solid var(--cp-line);
border-radius: 14px;
list-style: none;
}
.cp-row {
display: grid;
grid-template-columns: 22px minmax(0, 1fr) auto;
gap: 10px;
align-items: center;
padding: 10px 12px;
border-top: 1px solid var(--cp-line);
font-size: calc(var(--cp-size) * 0.964);
}
.cp-row:first-child {
border-top: 0;
}
/* A narrow card puts a row's link under its words instead of squeezing them. */
@container (max-width: 520px) {
.cp-row:has(> .cp-link-go) {
grid-template-columns: 22px minmax(0, 1fr);
row-gap: 2px;
}
.cp-row > .cp-link-go {
grid-column: 2;
justify-self: start;
white-space: normal;
text-align: start;
}
}
.cp-row-detail {
color: var(--cp-muted);
font-size: calc(var(--cp-size) * 0.893);
white-space: pre-line;
}
.cp-row-detail.cp-warn {
color: var(--cp-warn);
}
.cp-tile {
display: grid;
width: 22px;
height: 22px;
place-items: center;
border-radius: 6px;
background: var(--cp-fg);
color: var(--cp-bg);
font-size: calc(var(--cp-size) * 0.86);
font-weight: 700;
}
.cp-ic-warning {
background: color-mix(in srgb, var(--cp-warn) 16%, transparent);
color: var(--cp-warn);
font-weight: 700;
}
.cp-ic-unknown {
border: 1.5px solid var(--cp-line);
color: var(--cp-muted);
font-weight: 700;
}
.cp-card .btn-sm {
min-height: 30px;
padding: 0 12px;
font-size: calc(var(--cp-size) * 0.893);
white-space: nowrap;
}
.cp-link {
padding: 4px 0;
border: 0;
background: none;
color: var(--cp-fg);
font: inherit;
font-size: calc(var(--cp-size) * 0.93);
font-weight: 600;
white-space: nowrap;
cursor: var(--cursor-interaction, pointer);
}
.cp-link-go::after {
content: " →" / "";
}
.cp-link:not(:disabled):hover {
text-decoration: underline;
}
.cp-link:disabled {
color: var(--cp-muted);
}
.cp-link:focus-visible {
border-radius: 4px;
outline: 2px solid var(--color-ring-primary, light-dark(#0169cc, #ffffff));
outline-offset: 2px;
}
/* Two answers side by side where there is room, one above the other on a phone. */
.cp-panes {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr));
gap: 10px;
margin: 10px 0 0;
}
.cp-pane {
min-width: 0;
padding: 10px 12px;
border: 1px solid var(--cp-line);
border-radius: 12px;
font-size: calc(var(--cp-size) * 0.964);
}
.cp-pane-label {
margin: 0 0 4px;
color: var(--cp-muted);
font-size: calc(var(--cp-size) * 0.79);
font-weight: 600;
letter-spacing: 0.05em;
text-transform: uppercase;
}
.cp-pane-text {
white-space: pre-line;
overflow-wrap: anywhere;
}
</style></head>
<body><div id="card"></div><script>"use strict";(()=>{var ze="2026-01-26";var L=class{constructor(n){this.appInfo=n;window.addEventListener("message",t=>{t.source===window.parent&&this.#a(t.data)}),this.on("ui/notifications/host-context-changed",t=>{let r=t,{styles:s,...a}=this.hostContext??{},i=r.theme!==void 0&&r.theme!==a.theme&&!r.styles;this.hostContext={...a,...s&&!i?{styles:s}:{},...r}})}appInfo;#s=1;#e=new Map;#t=new Map;hostContext;hostCapabilities;on(n,t){this.#t.set(n,[...this.#t.get(n)??[],t])}async connect(){let n=await this.#n("ui/initialize",{appInfo:this.appInfo,appCapabilities:{availableDisplayModes:["inline"]},protocolVersion:ze});this.hostContext=n?.hostContext,this.hostCapabilities=n?.hostCapabilities,this.#r("ui/notifications/initialized",{}),new ResizeObserver(()=>this.#r("ui/notifications/size-changed",{height:Math.ceil(document.body.getBoundingClientRect().height)})).observe(document.body)}async callTool(n,t,r){return await this.#n("tools/call",{name:n,arguments:t},r)}async sendMessage(n){let t=this.hostCapabilities?.experimental?.["openai/message"]?.draft!==void 0,r=n.draft!==void 0&&t?n.draft:n.sent;X(await this.#n("ui/message",{role:"user",content:[{type:"text",text:r}],...r===n.draft?{_meta:{"openai/message":{target:"active",send:!1}}}:{}}))}async updateModelContext(n){X(await this.#n("ui/update-model-context",{content:[{type:"text",text:n}]}))}async openLink(n){if(window.openai?.openExternal)try{await window.openai.openExternal({href:n,redirectUrl:!1});return}catch{}X(await this.#n("ui/open-link",{url:n}))}#r(n,t){window.parent.postMessage({jsonrpc:"2.0",method:n,params:t},"*")}#n(n,t,r){let s=this.#s++;return new Promise((a,i)=>{let d=setTimeout(()=>{r?this.#e.set(s,{resolve:r,reject:()=>{}}):this.#e.delete(s),i(new Error(`${n} timed out`))},6e4);this.#e.set(s,{resolve:c=>{clearTimeout(d),a(c)},reject:c=>{clearTimeout(d),i(c)}}),window.parent.postMessage({jsonrpc:"2.0",id:s,method:n,params:t},"*")})}#a(n){if(!(!n||n.jsonrpc!=="2.0")){if(n.method===void 0){let t=typeof n.id=="number"?this.#e.get(n.id):void 0;if(!t)return;this.#e.delete(n.id),n.error?t.reject(n.error):t.resolve(n.result);return}for(let t of this.#t.get(n.method)??[])t(n.params);n.id!==void 0&&window.parent.postMessage({jsonrpc:"2.0",id:n.id,result:{}},"*")}}};function X(e){if(e?.isError===!0)throw new Error("The host refused it")}function We(e){document.documentElement.setAttribute("data-theme",e),document.documentElement.style.colorScheme=e}function Ge(e){for(let[n,t]of Object.entries(e))t!==void 0&&document.documentElement.style.setProperty(n,t)}var oe=[];function Y(e){e?.theme&&We(e.theme);let n=e?.["openai/interactionCursor"],t={...e?.styles?.variables,"--cursor-interaction":typeof n=="string"&&/^[a-z-]+$/.test(n)?n:void 0};for(let r of oe)t[r]===void 0&&document.documentElement.style.removeProperty(r);Ge(t),oe=Object.keys(t).filter(r=>t[r]!==void 0)}function I(e=0){return Math.min(2e3*2**e,16e3)}var o=(e,n=[])=>({state:e,effects:n}),g=(e,n=[])=>({state:{view:e,busy:!1},effects:n}),y=(e,n)=>({type:"call",call:{tool:e,args:n}}),h=(e,n)=>({...e,effects:[{type:"context",text:n},...e.effects]});function ue(e){return(n,t)=>{let r=e(n,t.type==="result"||t.type==="reply"?{...t,result:Je(t.result)}:t),s=r.state.view===n.view?n.seq:n.seq+1;return{state:{...r.state,seq:s},effects:r.effects.map(a=>a.type==="call"?{...a,call:{...a.call,seq:s}}:a)}}}function T(e,n){return n.seq!==e.seq}function Je(e){let n=e._meta?.["chickpea/held"],t=e.structuredContent;if(!f(n)||!f(t))return e;let r=typeof n.confirmToken=="string"?n.confirmToken:void 0,s=typeof n.undoToken=="string"?n.undoToken:void 0;return{...e,structuredContent:{...t,...s?{undoToken:s}:{},...r&&f(t.confirmation)?{confirmation:{...t.confirmation,confirmToken:r}}:{}}}}var b="That did not work. Try again.",B="Chickpea could not be reached. Try again.",D={kind:"notice",title:"Nothing to show here."};function k(e){return typeof e=="string"&&URL.parse(e)?.protocol==="https:"?e:void 0}var de=60;function x(e,n){let t=e.length>de?`${e.slice(0,de-1)}\u2026`:e;return`the Agent ${JSON.stringify(t)}${n?` (@${n})`:""}`}function le(e,n){return typeof n!="object"||n===null||Array.isArray(n)?e:{...e,_meta:{...n,...e._meta}}}var ce=200;function C(e){let n=e.replace(/\s+/g," ").trim();return n.length>ce?`${n.slice(0,ce-1)}\u2026`:n}function pe(e,n){if(n.length===0)return`Try it: message @${e} in Slack.`;let t=n.length<=2?n.join(" or "):`${n.slice(0,-1).join(", ")} or ${n.at(-1)}`;return`Try it: mention @${e} in ${t}.`}function f(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function _(e){if(!e.isError)return;let n=f(e.structuredContent)?e.structuredContent.error:void 0;return f(n)&&typeof n.message=="string"?n.message:b}function U(e){let n=f(e.structuredContent)?e.structuredContent.error:void 0;return e.isError&&f(n)&&typeof n.code=="string"?n.code:void 0}function ge(e){return e===void 0||f(e)&&typeof e.label=="string"&&(typeof e.url=="string"||typeof e.tool=="string"&&f(e.arguments))}function fe(e){return e.tool==="reconnect_service"||e.tool==="connect_model_provider"||e.tool==="connect_service"&&!("custom"in e.arguments)}function me(e){let n=e._meta?.["chickpea/tool"];return typeof n=="string"?n:void 0}function ke(e){return n=>{try{return e(n)}catch{return{busy:n.busy,error:n.error,avatar:"none",title:D.title,blocks:[],buttons:[]}}}}var ye=(e,n,t)=>`<svg viewBox="0 0 44 44" aria-hidden="true" focusable="false"><rect width="44" height="44" rx="12" fill="${e}"/><path d="M22 6c-9 0-14 8-14 18v14h28V24C36 14 31 6 22 6z" fill="${n}"/><path d="M22 12c-6 0-9.5 6-9.5 13.5S16 38 22 38s9.5-5 9.5-12.5S28 12 22 12z" fill="${t}"/><circle cx="18.5" cy="26" r="1.3" fill="#3a2a1e"/><circle cx="25.5" cy="26" r="1.3" fill="#3a2a1e"/><path d="M20.5 30.2q1.5 1.2 3 0" stroke="#3a2a1e" stroke-width="1.1" fill="none" stroke-linecap="round"/></svg>`,Xe={agent:ye("#3a2a1e","#E8901A","#f3d9b1"),alert:ye("#2a1f2e","#c2453a","#f1d3b8")},Ye={done:"done",now:"in progress",todo:"to do",failed:"failed"},he={done:{glyph:"\u2713",words:"done"},now:{glyph:"",words:"in progress"},failed:{glyph:"!",words:"needs attention"},warning:{glyph:"!",words:"warning"},unknown:{glyph:"?",words:"unknown"}};function u(e,n,t){let r=document.createElement(e);return n&&(r.className=n),t!==void 0&&(r.textContent=t),r}var be=new Set;function we(e,n,t){let r=u("span",`cp-avatar cp-avatar-${n}`),s=()=>{r.innerHTML=Xe[e]};if(!t||be.has(t))return s(),r;e==="alert"&&r.classList.add("cp-avatar-alert");let a=u("img");return a.alt="",a.decoding="async",a.addEventListener("error",()=>{be.add(t),s()},{once:!0}),a.src=t,r.append(a),r}function Qe(e){let n=u("p","cp-sub");for(let t of e)n.append(t.tone?u("span",`cp-${t.tone}`,t.text):t.text);return n}function Ze(e,n,t){switch(e.kind){case"text":return u("p","cp-text",e.text);case"quote":return u("blockquote","cp-quote",e.text);case"section":return u("h3","cp-sect",e.label);case"note":return u("p",`cp-note${e.tone?` cp-${e.tone}`:""}`,e.text);case"exchange":{let r=(c,m,l)=>{let p=u("div");return p.append(u("span","sr-only",`${c}: `),u("div",`cp-said cp-clamp-${l}`,m)),p},s=u("span","cp-init","Y");s.setAttribute("aria-hidden","true");let a=u("div","cp-msg");a.append(s,r("You",e.ask,2));let i=u("div","cp-msg");i.append(we(n,"sm",t),r(e.agent,e.answer,5));let d=u("div","cp-thread");return d.append(a,i),d}case"line":{let r=u("p","cp-line");for(let s of e.parts)r.append("chip"in s?u("span","cp-chip",s.chip):s.strong?u("b",void 0,s.text):s.text);return r}case"steps":{let r=u("ul","cp-steps");for(let{label:s,state:a}of e.steps){let i=u("li"),d=u("span",`cp-ic cp-ic-${a}`,a==="done"?"\u2713":a==="failed"?"!":"");d.setAttribute("aria-hidden","true"),i.append(d,s,u("span","sr-only",` (${Ye[a]})`)),r.append(i)}return r}case"rows":{let r=u("ul","cp-rows");return r.append(...e.rows.map(en)),r}case"panes":{let r=u("div","cp-panes");for(let{label:s,text:a}of e.panes){let i=u("section","cp-pane");i.append(u("h3","cp-pane-label",s),u("div","cp-pane-text",a)),r.append(i)}return r}}}function en(e){let n=u("li","cp-row");if(e.icon==="tile"){let s=u("span","cp-tile",e.tile??"");s.setAttribute("aria-hidden","true"),n.append(s)}else{let s=he[e.icon],a=u("span",`cp-ic cp-ic-${e.icon}`,s.glyph);a.setAttribute("aria-hidden","true"),n.append(a)}let t=u("div","cp-row-body"),r=u("div","cp-row-title",e.title);if(e.icon!=="tile"&&r.append(u("span","sr-only",` (${he[e.icon].words})`)),t.append(r),e.detail&&t.append(u("div",`cp-row-detail${e.tone?` cp-${e.tone}`:""}`,e.detail)),n.append(t),e.control){let{label:s,action:a,style:i}=e.control;n.append(xe(s,a,i==="link"?"cp-link cp-link-go":i==="toggle"?"cp-link":`btn btn-sm cp-btn-${i}`))}return n}function xe(e,n,t){let r=u("button",`${t} cursor-interaction`,e);return r.type="button",r.dataset.action=n,r}function Ae(e,n){let t=u("p","sr-only");t.setAttribute("aria-live","polite");let r=u("main","cp-card"),s=u("div","cp-content"),a=u("div","cp-acts"),i=u("p","cp-error");i.setAttribute("role","alert"),r.append(s,a,i),e.replaceChildren(t,r),r.addEventListener("click",l=>{let p=l.target?.closest("button[data-action]");p instanceof HTMLButtonElement&&!p.disabled&&n(p.dataset.action)});let d="",c="",m=new Map;return{render(l){let p=JSON.stringify(l);if(p===d)return;d=p;let A=r.contains(document.activeElement),v=l.announce??l.title;t.textContent!==v&&(t.textContent=v);let N=u("header","cp-hdr"),se=l.avatar==="none"?"agent":l.avatar,{avatarUrl:G}=l;l.avatar!=="none"&&N.append(we(l.avatar,"lg",G));let J=u("div","cp-heading"),R=u("h2","cp-title");if(R.tabIndex=-1,l.done){let w=u("span","cp-ok","\u2713 ");w.setAttribute("aria-hidden","true"),R.append(w)}R.append(l.title),J.append(R),l.subtitle&&J.append(Qe(l.subtitle)),N.append(J);let V=new Map,Ke=l.blocks.map(w=>{let O=JSON.stringify([w,se,G]),ie=!V.has(O)&&m.get(O)||Ze(w,se,G);return V.has(O)||V.set(O,ie),ie});m=V,s.replaceChildren(N,...Ke,...l.foot?[u("p","cp-foot",l.foot)]:[]);let ae=JSON.stringify(l.buttons);ae!==c&&(c=ae,a.replaceChildren(...l.buttons.map(w=>xe(w.label,w.action,`btn cp-btn-${w.tone}`)))),a.hidden=l.buttons.length===0;for(let w of r.querySelectorAll("button"))w.disabled=l.busy,w.toggleAttribute("aria-busy",l.busy);i.textContent=l.error??"",i.hidden=!l.error,A&&!r.contains(document.activeElement)&&R.focus({preventScroll:!0})}}}var nn=1e3;function _e(e,n){let t=new L({name:e,version:String(8)}),r=tn(),s=r?{view:r.view,busy:!1,seq:r.seq}:n.initial,a,i=0,d=Ae(document.getElementById("card"),p=>c({type:"press",action:p,now:Date.now()}));function c(p){let A=n.step(s,p),v=A.state.view!==s.view;s=A.state,v&&rn(s),d.render(n.present(s));for(let N of A.effects)m(N)}function m(p){switch(p.type){case"call":{let A=v=>c({type:"reply",call:p.call,result:v,now:Date.now()});t.callTool(p.call.tool,p.call.args,A).then(A,()=>c({type:"unreachable",call:p.call,now:Date.now()}));return}case"timer":clearTimeout(a),a=setTimeout(()=>c({type:"tick",now:Date.now()}),p.inMs);return;case"message":t.sendMessage(p).catch(()=>c({type:"refused",effect:p,now:Date.now()}));return;case"open":t.openLink(p.url).catch(()=>c({type:"refused",effect:p,now:Date.now()}));return;case"context":t.updateModelContext(p.text).catch(()=>{});return}}function l(){let p=Date.now();p-i<nn||s.view.kind==="waiting"||(i=p,c({type:"reread",now:p}))}t.on("ui/notifications/tool-result",p=>{r||s.view.kind!=="waiting"||(c({type:"result",result:le(p,window.openai?.toolResponseMetadata),now:Date.now()}),l())}),t.on("ui/notifications/tool-cancelled",()=>c({type:"no_result",now:Date.now()})),t.on("ui/notifications/host-context-changed",()=>Y(t.hostContext)),window.addEventListener("focus",l),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&l()}),d.render(n.present(s)),t.connect().then(()=>{Y(t.hostContext),r&&l()},()=>c({type:"no_result",now:Date.now()}))}function tn(){let n=window.openai?.widgetState?.privateContent?.card,t=n?.view;return n?.version===8&&t&&typeof t.kind=="string"?{view:t,seq:n.seq??0}:void 0}function rn({view:e,seq:n}){if(e.kind==="waiting")return;let t={version:8,view:e,seq:n};Promise.resolve(window.openai?.setWidgetState?.({privateContent:{card:t}})).catch(()=>{})}function F(e){let n=e.flatMap(({name:r})=>r?[`#${r.replace(/^#/,"")}`]:[]),t=e.length-n.length;return t===0?n:[...n,t===1?"a private Channel":`${t} private Channels`]}function Ce(e,n){let t=e.quotedWhole?"":` (${on(e.words)})`;if(e.kind==="section")return`${e.action==="adds"?`Adds a new section, ${n(e.heading)}${e.quote?`: ${n(e.quote)}`:""}`:`Removes the section ${n(e.heading)}`}${t}`;let r=sn[e.action],s=an(e.place,n);return`${s?`${s}, ${r}`:`${r[0].toUpperCase()}${r.slice(1)}`}: ${n(e.quote)}${t}`}var sn={adds:"adds",removes:"removes",changes:"changes wording to"};function an(e,n){switch(e.kind){case"heading":return`Under ${n(e.heading)}`;case"start":return"At the start";case"end":return"At the end";case"none":return}}function on(e){return e<10?`${e} ${e===1?"word":"words"}`:`about ${(e<1e3?Math.round(e/10)*10:Math.round(e/100)*100).toLocaleString("en-US")} words`}var $=3*6e4,dn=5e3,cn=6e4,un=60*6e4;function ee(e,n){return ne({kind:"first_answer",tested:e,key:`try:${e.agentId}:${n}`,keyedAt:n,startedAt:n,stage:{kind:"asking"}})}function ne(e){return{state:{view:e,busy:!0},effects:[y("try_agent_once",{agentId:e.tested.agentId,idempotencyKey:e.key})]}}function q(e){return y("get_test_run",{runToken:e})}function ve(e,n){switch(n.type){case"press":return e.busy?o(e):ln(e,n.action,n.now);case"reply":return T(e,n.call)?o(e):gn(e,n.call.tool,n.result,n.now);case"unreachable":return T(e,n.call)?o(e):xn(e,n.call.tool,n.now);case"refused":return pn(e,n.effect);case"tick":return An(e,n.now);case"reread":return e.busy?o(e):_n(e);default:return o(e)}}function ln(e,n,t){let{view:r}=e,{stage:s,tested:a}=r;switch(n){case"try_once":return s.kind==="lost"||s.kind==="stopped"&&(s.then==="again"||s.then==="fix"&&s.acted!==void 0)?t-r.keyedAt<un-$-6e4?ne({...r,startedAt:t,stage:{kind:"asking"}}):ee(a,t):o(e);case"try_fix":{let i=s.kind==="stopped"?s.fix:void 0;return s.kind!=="stopped"||!i?o(e):"url"in i?g({...r,stage:{...s,acted:{kind:"page",url:i.url}}},[{type:"open",url:i.url}]):fe(i)?{state:{view:{...r,stage:{...s,fixing:!0}},busy:!0},effects:[y(i.tool,i.arguments)]}:g({...r,stage:{...s,acted:{kind:"chat"}}},[Te(r,i)])}case"open_slack":return a.slackUrl?o(e,[{type:"open",url:a.slackUrl}]):o(e);case"change_something":return s.kind==="answered"?o(e,[{type:"message",draft:`Change ${a.name}: `,sent:`Change ${a.name}: `}]):o(e);default:return o(e)}}function Te(e,n){return{type:"message",sent:`${n.label} for ${e.tested.name}.`}}function pn(e,n){let{view:t}=e,{stage:r,tested:s}=t;if(r.kind==="stopped"&&r.acted&&(r.acted.kind==="page"?n.type==="open"&&n.url===r.acted.url:n.type==="message")){let{acted:i,...d}=r;return o({view:{...t,stage:d},busy:!1,error:b})}return(n.type==="open"?n.url===s.slackUrl&&(r.kind==="answered"||r.kind==="stopped"||r.kind==="slow"):r.kind==="answered")?o({...e,error:b}):o(e)}function gn(e,n,t,r){let{view:s}=e,{stage:a}=s;return n==="try_agent_once"&&a.kind==="asking"?fn(s,a,t,r):n==="get_test_run"&&(a.kind==="running"||a.kind==="slow")?kn(e,t,r):a.kind==="stopped"&&a.fixing?wn(s,a,t):o({...e,busy:!1})}function fn(e,n,t,r){let s=U(t);if(t.isError&&s===void 0)return $e(e,n,r);if(s==="in_progress"){let i=n.heldSince??r;return r-i>=cn?K(e,_(t)??b,"again"):mn(e,i)}if(s!==void 0)return hn(e,s,t);let a=Ne(t.structuredContent);return a?Z(n.heldSince===void 0?e:{...e,startedAt:r},a,r):K(e,Re(e),"slack")}function mn(e,n){return{state:{view:{...e,stage:{kind:"asking",heldSince:n,retry:!0}},busy:!0},effects:[{type:"timer",inMs:dn}]}}function $e(e,n,t){if(t-e.startedAt>=$)return M(e,void 0);let r=(n.failures??0)+1;return{state:{view:{...e,stage:{...n,failures:r,retry:!0}},busy:!0},effects:[{type:"timer",inMs:I(r-1)}]}}function kn(e,n,t){let{view:r}=e,{stage:s}=r;if(U(n)==="not_found")return H(r,{kind:"stopped",problem:_(n),then:"slack"},j(r,"but its answer is no longer there"));let i=n.isError?void 0:Ne(n.structuredContent);return s.kind==="slow"?i&&i.status!=="running"?Z(r,i,t):o({...e,busy:!1}):s.kind!=="running"?o({...e,busy:!1}):i?Z(r,i,t):Ee(r,s,t)}function Ee(e,n,t){if(t-e.startedAt>=$)return M(e,n.runToken);let r=(n.failures??0)+1;return{state:{view:{...e,stage:{...n,failures:r,retry:!0}},busy:!0},effects:[{type:"timer",inMs:I(r-1)}]}}function Z(e,n,t){switch(n.status){case"answered":return H(e,{kind:"answered",ask:n.ask,reply:n.reply??"",read:n.read??[]},j(e,"and it answered its first question there"));case"failed":return H(e,{kind:"stopped",problem:n.problem??Cn(e),then:"slack"},j(e,"but it did not finish answering"));case"running":{if(t-e.startedAt>=$)return M(e,n.runToken);let r={kind:"running",runToken:n.runToken,ask:n.ask};return{state:{view:e.stage.kind==="running"&&e.stage.runToken===n.runToken&&!e.stage.retry&&!e.stage.failures?e:{...e,stage:r},busy:!0},effects:[q(n.runToken)]}}}}function M(e,n){return H(e,{kind:"slow",...n?{runToken:n}:{}},j(e,"but its answer did not come back in time"))}function H(e,n,t){return h(g({...e,stage:n}),t)}function j(e,n){return`The person ran ${x(e.tested.name,e.tested.handle)} once from the card, ${n}.`}var yn=new Set(["needs_setup","not_testable","model_unavailable","not_allowed","usage_limit","not_found","temporarily_unavailable","test_run_unavailable"]);function hn(e,n,t){if(!yn.has(n))return K(e,Re(e),"slack");let r=f(t.structuredContent)?t.structuredContent.error:void 0,s=f(r)?bn(r.fix):void 0,a=s?"fix":f(r)&&r.retryable===!0?"again":"slack";return K(e,_(t)??b,a,s)}function bn(e){if(!(!ge(e)||e===void 0))return"url"in e&&k(e.url)===void 0?void 0:e}function K(e,n,t,r){return h(g({...e,stage:{kind:"stopped",problem:n,then:t,...r?{fix:r}:{}}}),`The person pressed "See its first answer" for ${x(e.tested.name,e.tested.handle)} on the card, but the test run did not start.`)}function wn(e,n,t){let{fixing:r,...s}=n,a=_(t),i=t.structuredContent,d=!a&&f(i)&&f(i.setup)?i.setup:void 0,c=k(d?.url);if(!c||!n.fix){let m=f(i)&&typeof i.summary=="string"?i.summary:void 0;return o({view:{...e,stage:s},busy:!1,error:a??m??b})}return typeof d?.setupToken!="string"?g({...e,stage:{...s,acted:{kind:"chat"}}},[Te(e,n.fix)]):h(g({...e,stage:{...s,acted:{kind:"page",url:c}}},[{type:"open",url:c}]),`The person opened Chickpea's page to ${C(n.fix.label)} for ${x(e.tested.name,e.tested.handle)} from the card. They can try it again once they finish there.`)}function xn(e,n,t){let{view:r}=e,{stage:s}=r;if(n==="try_agent_once"&&s.kind==="asking")return $e(r,s,t);if(n==="get_test_run"&&s.kind==="running")return Ee(r,s,t);if(s.kind==="stopped"&&s.fixing){let{fixing:a,...i}=s;return o({view:{...r,stage:i},busy:!1,error:B})}return o({...e,busy:!1})}function An(e,n){let{view:t}=e,{stage:r}=t;if(!e.busy||!("retry"in r)||!r.retry)return o(e);if(r.kind==="asking"){let{retry:i,...d}=r;return r.heldSince===void 0&&n-t.startedAt>=$?M(t,void 0):ne({...t,stage:d})}if(n-t.startedAt>=$)return M(t,r.runToken);let{retry:s,...a}=r;return{state:{view:{...t,stage:a},busy:!0},effects:[q(r.runToken)]}}function _n(e){let{view:n}=e,{stage:t}=n;switch(t.kind){case"asking":return g({...n,stage:{kind:"lost"}});case"running":{let{retry:r,failures:s,...a}=t;return{state:{view:{...n,stage:a},busy:!0},effects:[q(t.runToken)]}}case"slow":return t.runToken?{state:{view:n,busy:!0},effects:[q(t.runToken)]}:o(e);default:return o(e)}}function Ne(e){if(!(!f(e)||typeof e.runToken!="string"||typeof e.ask!="string")&&!(e.status!=="running"&&e.status!=="answered"&&e.status!=="failed"))return{status:e.status,runToken:e.runToken,ask:e.ask,...typeof e.reply=="string"?{reply:e.reply}:{},...Array.isArray(e.read)?{read:e.read.filter(n=>typeof n=="string")}:{},...typeof e.problem=="string"?{problem:e.problem}:{}}}function Re(e){return`The test run didn't start. Ask ${e.tested.name} in Slack instead.`}function Cn(e){return`The test run didn't finish. Ask ${e.tested.name} in Slack instead.`}var Q="A test run: it makes only read requests and sends nothing to Slack.",Sn="A test run: it made only read requests and sent nothing to Slack.";function Ie(e){let{tested:n,stage:t}=e,r=`${n.name}'s first answer`,s={avatar:"agent",avatarUrl:n.avatarUrl,title:r},a=n.slackUrl?[{label:"Open in Slack",action:"open_slack",tone:"primary"}]:[];switch(t.kind){case"asking":{let i=t.heldSince===void 0?`Asking ${n.name} its first question`:"Waiting for another test run in this workspace to finish";return{...s,announce:`${r}. ${i}.`,subtitle:[{text:Q}],blocks:[{kind:"steps",steps:[{label:i,state:"now"}]}],buttons:[]}}case"running":return{...s,announce:`${r}. ${n.name} is answering.`,subtitle:[{text:Q}],blocks:[Se(t.ask),{kind:"steps",steps:[{label:`${n.name} is answering`,state:"now"}]}],buttons:[]};case"answered":{let i=$n(n,t.ask),d=En(t.reply).trim()||"It gave no answer.";return{...s,announce:`${r}. It answered.`,subtitle:[{text:Sn}],blocks:[Se(t.ask),{kind:"panes",panes:[...i?[{label:"What we promised",text:i}]:[],{label:"What it answered",text:d}]},...t.read.length?[{kind:"note",text:`It read ${Nn(t.read)}.`}]:[]],buttons:[...a,{label:"Change something",action:"change_something",tone:"secondary"}]}}case"stopped":return{...s,announce:`${r}. ${t.problem}`,blocks:[{kind:"text",text:t.problem},...t.acted?[{kind:"note",text:vn[t.acted.kind]}]:[]],buttons:Tn(t,a)};case"slow":{let i=`Its answer is taking longer than it should. Ask ${n.name} in Slack instead.`;return{...s,announce:`${r}. ${i}`,blocks:[{kind:"text",text:i}],buttons:a}}case"lost":{let i="This card closed before the test run answered.";return{...s,announce:`${r}. ${i}`,subtitle:[{text:Q}],blocks:[{kind:"text",text:i}],buttons:[{label:"See its first answer",action:"try_once",tone:"primary"}]}}}}var vn={page:"Finish on the Chickpea page that opened, then try again.",chat:"Finish it in the chat, then try again."};function Tn(e,n){let t={label:"Try again",action:"try_once",tone:"primary"},r=a=>e.fix?[{label:e.fix.label,action:"try_fix",tone:a}]:[],s=n.map(a=>({...a,tone:"secondary"}));switch(e.then){case"again":return[t,...s];case"fix":return e.acted?[t,...r("secondary")]:[...r("primary"),...s];case"slack":return n}}function Se(e){return{kind:"note",text:`First question: \u201C${e}\u201D`}}function $n(e,n){let{promised:t}=e,r=s=>s.replace(/\s+/g," ").trim();return t&&r(t.ask)===r(n)?t.answer:void 0}function En(e){let n=[],t=r=>`\0${n.push(r)-1}\0`;return e.replace(/\u0000/g,"").replace(/^[ \t]*```[^\n]*\n([\s\S]*?)^[ \t]*```[ \t]*$\n?/gm,(r,s)=>t(s)).replace(/^[ \t]*```.*$\n?/gm,"").replace(/`([^`\n]+)`/g,(r,s)=>t(s)).replace(/!?\[([^\]\n]*)\]\([^)\n]*\)/g,"$1").replace(/^[ \t]*\|?(?:[ \t]*:?-+:?[ \t]*\|)+(?:[ \t]*:?-+:?[ \t]*)?$\n?/gm,"").replace(/^[ \t]*\|(.*)\|[ \t]*$/gm,(r,s)=>s.split("|").map(a=>a.trim()).join(" \xB7 ")).replace(/^[ \t]*([-*_])(?:[ \t]*\1){2,}[ \t]*$\n?/gm,"").replace(/^[ \t]*(?:>[ \t]?)+/gm,"").replace(/^#{1,6}[ \t]+/gm,"").replace(/^([ \t]*)[-*+][ \t]+/gm,"$1\u2022 ").replace(/(\*\*|__|~~)(?=\S)([^\n]*?\S)\1/g,"$2").replace(/(^|[^\w*])\*(?=[^\s*])([^*\n]*?[^\s*])\*(?![\w*])/gm,"$1$2").replace(/(^|[^\w_])_(?=[^\s_])([^_\n]*?[^\s_])_(?![\w_])/gm,"$1$2").replace(/\u0000(\d+)\u0000/g,(r,s)=>n[Number(s)]??"")}function Nn(e){return e.length<=2?e.join(" and "):`${e.slice(0,-1).join(", ")} and ${e.at(-1)}`}var In=new Set(["get_creation_status","get_agent"]),Me={view:{kind:"waiting"},busy:!1,seq:0},Pe=ue(Un);function Un(e,n){let{view:t}=e;if(t.kind==="first_answer"&&n.type!=="result")return ve({...e,view:t},n);switch(n.type){case"result":return Fn(n.result,n.now);case"press":return e.busy?o(e):Mn(e,n.action,n.now);case"reply":return T(e,n.call)&&!Vn(e,n.call)?o(e):On(e,n.call,n.result,n.now);case"unreachable":return T(e,n.call)?o(e):In.has(n.call.tool)?e.view.kind!=="creating"?o(e):te({...e.view,failures:(e.view.failures??0)+1},n.now):o({view:e.view.kind==="starting"?e.view.from:e.view,busy:!1,error:B});case"refused":return o({...e,error:b});case"no_result":return e.view.kind==="waiting"?g(D):o(e);case"tick":return e.busy?o(e):Bn(e,n.now);case"reread":return e.busy?o(e):Oe(e,n.now)}}function Fn(e,n){let t=_(e);if(t)return g({kind:"notice",title:t});let r=e.structuredContent;if(Hn(r))return g({kind:"proposal",proposal:r});if(jn(r))return g({kind:"change",preview:r});if(S(r)){let s=me(e);return s==="create_agent"&&r.status==="done"&&r.agent?Ve(r,{answersIn:[],needs:[]},n):E(r,n,{saved:s==="update_agent",undone:s==="undo_change"})}return g(D)}function E(e,n,t={}){switch(e.status){case"needs_confirmation":return e.confirmation?W(e.confirmation,n)?g(P):g({kind:"confirm",confirmation:e.confirmation,...e.agent?{agent:e.agent,avatarUrl:k(e.agent.avatarUrl),adminUrl:k(e.agent.links?.admin)}:{}},[Le(e.confirmation,n)]):g({kind:"notice",title:e.summary});case"done":{let{agent:r}=e;return g({kind:"done",summary:e.summary,...r?{agent:{agentId:r.agentId,name:r.name,handle:r.handle},avatarUrl:k(r.avatarUrl),status:r.status,channels:F(r.channels??[]),slackUrl:k(r.links?.slack)}:{},undoToken:t.undone?void 0:e.undoToken,version:e.version,...t.saved?{saved:!0}:{}})}default:return g({kind:"notice",title:e.summary})}}function Ve(e,n,t){let r=e.agent;return g({kind:"creating",agentId:r.agentId,agent:{name:r.name,handle:r.handle},avatarUrl:k(r.avatarUrl)??n.avatarUrl,workspaceName:n.workspaceName,answersIn:n.answersIn,needs:n.needs,adminUrl:k(r.links?.admin),startedAt:t,...n.byPress?{byPress:!0}:{},...n.promised?{promised:n.promised}:{}},[y("get_creation_status",{agentId:r.agentId})])}function Mn(e,n,t){let{view:r}=e,s=a=>o({view:r,busy:!0},[a]);switch(n){case"create":return r.kind==="proposal"?Ue(r,r.proposal.create.arguments):o(e);case"create_anyway":return r.kind==="similar"?Ue(r,{...r.create,createEvenIfSimilar:!0,idempotencyKey:`${r.create.idempotencyKey}:anyway`}):o(e);case"change_something":{let a=r.kind==="proposal"?r.proposal.proposal.name:r.kind==="similar"?r.name:void 0;return a?o(e,[{type:"message",draft:`Change ${a}: `,sent:`Change ${a}: `}]):o(e)}case"save":return r.kind==="change"&&!r.stale?s(y("update_agent",r.preview.save.arguments)):o(e);case"cancel":return r.kind==="change"?h(g({kind:"notice",title:"Not saved",body:"Nothing changed."}),`The person cancelled this change to ${x(r.preview.agent.name)} on the card. Nothing was saved.`):o(e);case"confirm":return r.kind!=="confirm"||!r.confirmation.confirmToken?o(e):W(r.confirmation,t)?g(P):s(y("confirm_change",{confirmToken:r.confirmation.confirmToken}));case"keep":return r.kind!=="confirm"||!r.confirmation.confirmToken?o(e):s(y("decline_change",{confirmToken:r.confirmation.confirmToken}));case"undo":return r.kind==="done"&&r.undoToken?s(y("undo_change",{undoToken:r.undoToken,idempotencyKey:`undo:${r.undoToken}`})):o(e);case"open_slack":{let a=qn(r);return a?o(e,[{type:"open",url:a}]):o(e)}case"open_admin":{let a=r.kind==="ready"||r.kind==="creating"||r.kind==="confirm"&&De(r)?r.adminUrl:void 0;return a?o(e,[{type:"open",url:a}]):o(e)}case"next_step":{let a=r.kind==="ready"?r.needs[0]:void 0;return a&&r.kind==="ready"?o(e,[{type:"message",sent:`Connect ${a.name} to ${r.agent.name}.`}]):o(e)}case"check_again":return Oe(e,t);case"try_once":return r.kind==="ready"&&He(r)?ee(Pn(r),t):o(e);case"try_fix":return o(e)}}function Pn(e){return{agentId:e.agentId,name:e.agent.name,handle:e.agent.handle,avatarUrl:e.avatarUrl,slackUrl:k(e.status.slackUrl),promised:e.promised}}function Vn(e,n){let{view:t}=e;if(e.busy||n.tool!=="create_agent")return!1;let r=n.args.idempotencyKey;return t.kind==="proposal"?r===t.proposal.create.arguments.idempotencyKey:t.kind==="similar"&&r===`${t.create.idempotencyKey}:anyway`}function Ue(e,n){return{state:{view:{kind:"starting",from:e},busy:!0},effects:[y("create_agent",n)]}}function On(e,n,t,r){let{view:s}=e,a=_(t),i=U(t),d=t.structuredContent;switch(n.tool){case"create_agent":{let c=s.kind==="starting"?s.from:s.kind==="proposal"||s.kind==="similar"?s:void 0;if(a||!S(d))return o({view:c??s,busy:!1,error:a??b});let m=c?.kind==="proposal"?c.proposal.proposal:void 0;if(d.status==="done"&&d.agent){let{name:l,handle:p}=d.agent;return h(Ve(d,{answersIn:F(m?.answersIn??[]),needs:m?.needs??[],workspaceName:m?.workspaceName,avatarUrl:re(c),byPress:!0,promised:Fe(c)},r),`The person created ${x(l,p)} from the card. It is joining Slack now.`)}if(d.status==="similar_agent_exists"&&c){let l=c.kind==="proposal"?c.proposal.create.arguments:c.create,p=Fe(c);return h(g({kind:"similar",summary:d.summary,create:l,name:l.name,avatarUrl:re(c),...p?{promised:p}:{}}),`The person pressed Create in Slack on the card, but nothing was created: ${C(d.summary)}`)}return E(d,r)}case"get_creation_status":return i==="not_found"?z(e,"unavailable"):Ln(e,a?void 0:d,r);case"update_agent":{if(a||!S(d))return s.kind==="change"&&i==="changed_since_read"?o({view:{...s,stale:!0},busy:!1,error:a}):o({view:s,busy:!1,error:a??b});let c=s.kind==="change"?s.preview.agent.name:d.agent?.name,m=c===void 0?"the Agent":x(c);return h(E(d,r,{saved:!0}),d.status==="needs_confirmation"?`The person pressed Save on the card for ${m}. Nothing has changed yet: it waits for their confirmation on the card.`:c===void 0?`The person saved the change from the card. ${C(d.summary)}`:`The person saved the change to ${m} from the card.`)}case"confirm_change":return i==="confirmation_expired"?g(P):a||!S(d)?i==="temporarily_unavailable"||!a?o({view:s,busy:!1,error:a??b}):h(g({kind:"notice",title:"Nothing changed",body:a}),`The person confirmed on the card, but nothing changed: ${a}`):h(E(d,r),`The person confirmed on the card. ${C(d.summary)}`);case"decline_change":{if(!(a?i==="not_found":S(d)))return o({view:s,busy:!1,error:a??b});let m=s.kind==="confirm"?s.confirmation.ask.keep:"Keep it";return!a&&S(d)&&d.status==="done"?h(E(d,r),`On the card, the person pressed "${m}", but the change was already made. ${C(d.summary)}`):h(g(Dn),`On the card, the person pressed "${m}", so nothing changed. Make this change only if they ask for it again.`)}case"undo_change":return a||!S(d)?o({view:(i==="nothing_to_undo"||i==="changed_since_read")&&s.kind==="done"?{...s,undoToken:void 0}:s,busy:!1,error:a??b}):h(E(d,r,{undone:!0}),d.status==="needs_confirmation"?"The person pressed Undo on the card. Nothing has changed yet: it waits for their confirmation on the card.":`The person undid the change${s.kind==="done"&&s.agent?` to ${x(s.agent.name)}`:""} from the card.`);case"get_agent":{if(e.busy)return o(e);if(i==="not_found")return z(e,"unavailable");let c=a?void 0:d;return typeof c?.version!="string"?o(e):c.status==="archived"?z(e,"archived"):s.kind==="change"&&c.version!==s.preview.save.arguments.version?o({...e,view:{...s,stale:!0}}):s.kind==="done"&&s.undoToken&&c.version!==s.version?o({...e,view:{...s,undoToken:void 0}}):o(e)}default:return o({...e,busy:!1})}}function z(e,n){let{view:t}=e,r=t.kind==="creating"||t.kind==="ready"||t.kind==="done"?t.agent:t.kind==="change"?t.preview.agent:void 0;if(!r)return o(e);let s=t.kind==="change"?k(t.preview.agent.avatarUrl):"avatarUrl"in t?t.avatarUrl:void 0;return g({kind:"gone",agent:{name:r.name,handle:r.handle},why:n,avatarUrl:s})}function Ln(e,n,t){let{view:r}=e;if(r.kind!=="creating"&&r.kind!=="ready")return o(e);if(!n||typeof n.stage!="string")return r.kind==="creating"?te({...r,failures:(r.failures??0)+1},t):o(e);if(n.agent?.status==="archived")return z(e,"archived");let s=k(n.agent?.avatarUrl)??r.avatarUrl;if(!(n.stage==="needs_attention"||n.stage!=="joining"&&n.channels!=="joining")){let{failures:c,...m}=r.kind==="creating"?r:{...r,kind:"creating",startedAt:t};return te({...m,avatarUrl:s,status:n},t)}let i=g({kind:"ready",agentId:r.agentId,agent:r.agent,avatarUrl:s,answersIn:r.answersIn,needs:r.needs,adminUrl:r.adminUrl,status:n,...r.promised?{promised:r.promised}:{}});if(r.kind!=="creating"||!r.byPress)return i;let d=x(r.agent.name,r.agent.handle);return h(i,n.stage==="needs_attention"?`The person created ${d} from the card, but it needs attention in Slack: ${n.problem??"Slack has not finished setting it up."}`:`The person created ${d} from the card. It is ready in Slack${n.stage==="said_hello"?" and said hello to them there":""}.`)}function te(e,n){return n-e.startedAt>=12e4?g({...e,slow:!0}):g(e,[{type:"timer",inMs:I(e.failures)}])}function Bn(e,n){let{view:t}=e;return t.kind==="creating"&&!t.slow?o(e,[y("get_creation_status",{agentId:t.agentId})]):t.kind==="confirm"&&W(t.confirmation,n)?g(P):o(e)}function Oe(e,n){let{view:t}=e;switch(t.kind){case"starting":return g(t.from);case"creating":{let{slow:r,failures:s,...a}=t;return o({...e,view:{...a,startedAt:n}},[y("get_creation_status",{agentId:t.agentId})])}case"ready":return o(e,[y("get_creation_status",{agentId:t.agentId})]);case"change":return o(e,[y("get_agent",{agentId:t.preview.save.arguments.agentId})]);case"done":return t.agent?o(e,[y("get_agent",{agentId:t.agent.agentId})]):o(e);case"confirm":return W(t.confirmation,n)?g(P):o(e,[Le(t.confirmation,n)]);default:return o(e)}}var P={kind:"notice",title:"This confirmation expired",body:"Nothing changed. Ask again for a fresh one."},Dn={kind:"notice",title:"Kept as it is",body:"Nothing changed."};function Le(e,n){return{type:"timer",inMs:Math.max(0,Date.parse(e.expiresAt)-n)}}function W(e,n){let t=Date.parse(e.expiresAt);return Number.isFinite(t)&&n>=t}function qn(e){if(e.kind==="ready")return k(e.status.slackUrl);if(e.kind==="creating")return k(e.status?.slackUrl);if(e.kind==="done")return e.slackUrl}function re(e){return e?.kind==="proposal"?k(e.proposal.proposal.avatarUrl):e?.avatarUrl}function Fe(e){return e?.kind==="proposal"?Be(e.proposal.proposal):e?.promised}function Be({sampleExchange:e}){let{ask:n,answer:t}=f(e)?e:{};return typeof n=="string"&&n.trim()&&typeof t=="string"&&t.trim()?{ask:n,answer:t}:void 0}function De(e){return e.confirmation.inAdmin===!0&&e.adminUrl!==void 0}function Hn(e){return f(e)&&f(e.proposal)&&f(e.create)&&f(e.create.arguments)}function jn(e){return f(e)&&Array.isArray(e.changes)&&f(e.save)&&f(e.save.arguments)}function S(e){return f(e)&&typeof e.status=="string"&&typeof e.summary=="string"}var Kn={name:"Name",description:"Description",handle:"Slack handle",instructions:"Instructions",on:"On or off",model:"Model",effort:"Effort",imageModel:"Image model",whoCanEdit:"Who can edit"},zn={creator_and_admins:"Its creator and workspace admins",all_workspace_members:"Anyone in the workspace"},qe=ke(Wn);function Wn(e){let n={busy:e.busy,error:e.error},{view:t}=e;switch(t.kind){case"waiting":return{...n,avatar:"none",title:"Loading\u2026",blocks:[],buttons:[]};case"proposal":return{...n,...Jn(t.proposal)};case"similar":return{...n,avatar:"agent",avatarUrl:t.avatarUrl,title:"An Agent like this already exists",blocks:[{kind:"text",text:t.summary}],buttons:[{label:"Create it anyway",action:"create_anyway",tone:"primary"},{label:"Change something",action:"change_something",tone:"secondary"}]};case"starting":return{...n,...Xn(t.from)};case"creating":return{...n,...Yn(t)};case"ready":return{...n,...Qn(t)};case"change":return{...n,...nt(t.preview,t.stale===!0)};case"done":return{...n,...et(t)};case"confirm":return{...n,...Gn(t)};case"gone":return{...n,avatar:"agent",avatarUrl:t.avatarUrl,title:t.why==="archived"?`${t.agent.name} is archived`:`${t.agent.name} is no longer available`,blocks:[{kind:"text",text:t.why==="archived"?"It no longer answers in Slack.":"It was deleted, or you can no longer manage it."}],buttons:[]};case"notice":return{...n,avatar:"none",title:t.title,blocks:t.body?[{kind:"text",text:t.body}]:[],buttons:[]};case"first_answer":return{...n,...Ie(t)}}}function Gn(e){let{ask:n,confirmToken:t,inAdmin:r}=e.confirmation,s={avatar:e.agent?"alert":"none",avatarUrl:e.avatarUrl,title:n.question};return t?{...s,blocks:[{kind:"text",text:n.consequence}],buttons:[{label:n.confirm,action:"confirm",tone:"danger"},{label:n.keep,action:"keep",tone:"secondary"}]}:{...s,blocks:[{kind:"text",text:n.consequence},{kind:"note",text:r?"Confirm this in Admin.":"Ask again in a new chat to confirm it."}],buttons:De(e)?[{label:"Open in Admin",action:"open_admin",tone:"secondary"}]:[]}}function Jn({proposal:e,issues:n}){let t=Be(e),r=je(["your DMs",...F(e.answersIn)]);return{avatar:"agent",avatarUrl:k(e.avatarUrl),title:e.name,subtitle:[{text:`@${e.handle}`},...e.handleAvailable===!1?[{text:" \xB7 "},{text:"handle is taken",tone:"warn"}]:[]],blocks:[t?{kind:"exchange",ask:t.ask.trim(),answer:t.answer.trim(),agent:e.name}:{kind:"text",text:e.job},{kind:"line",parts:[{text:"Answers in "},{text:r,strong:!0},{text:`. Anyone in ${e.workspaceName?.trim()||"your Slack workspace"} can message it.`}]},...e.needs.length?[{kind:"line",parts:[{text:"Needs "},...e.needs.flatMap(({name:s})=>[{chip:s},{text:" "}]),{text:"\xB7 you sign in after it's created"}]}]:[],...n.map(s=>({kind:"note",text:s,tone:"warn"}))],buttons:[{label:"Create in Slack",action:"create",tone:"primary"},{label:"Change something",action:"change_something",tone:"secondary"}]}}function Xn(e){let n=e.kind==="proposal"?e.proposal.proposal:void 0,t=n?.handle??(e.kind==="similar"?e.create.handle:void 0),r=F(n?.answersIn??[]);return{avatar:"agent",avatarUrl:re(e),title:n?.name??(e.kind==="similar"?e.name:""),subtitle:[{text:n?.workspaceName?`Setting up in ${n.workspaceName}'s Slack\u2026`:"Setting up in Slack\u2026"}],blocks:[{kind:"steps",steps:[{label:"Creating it in Chickpea",state:"now"},{label:t?`Joining Slack as @${t}`:"Joining Slack",state:"todo"},{label:"Saying hello to you",state:"todo"},...r.length?[{label:`Joining ${r.join(", ")}`,state:"todo"}]:[]]}],buttons:[]}}function Yn(e){let n=e.status?.stage??"joining",t=e.status?.channels??"none",r=n!=="joining";return{avatar:"agent",avatarUrl:e.avatarUrl,title:e.agent.name,subtitle:[{text:e.workspaceName?`Setting up in ${e.workspaceName}'s Slack\u2026`:"Setting up in Slack\u2026"}],blocks:[{kind:"steps",steps:[{label:"Created in Chickpea",state:"done"},{label:e.agent.handle?`Joining Slack as @${e.agent.handle}`:"Joining Slack",state:r?"done":"now"},...n==="ready"?[]:[{label:"Saying hello to you",state:r?"done":"todo"}],...t==="none"?[]:[{label:e.answersIn.length?`Joining ${e.answersIn.join(", ")}`:"Joining its Channels",state:t==="joined"?"done":t==="needs_attention"?"failed":r?"now":"todo"}]]},...e.slow?[{kind:"note",text:"This is taking longer than usual. It keeps going, and the card checks again when you come back."}]:[]],buttons:e.slow?[{label:"Check again",action:"check_again",tone:"secondary"}]:[]}}function Qn(e){let{status:n,agent:t}=e,r=t.handle?`@${t.handle}`:t.name;if(n.stage==="needs_attention")return{avatar:"alert",avatarUrl:e.avatarUrl,title:`${t.name} needs attention in Slack`,blocks:[{kind:"text",text:n.problem??"Slack has not finished setting it up."}],buttons:[...e.adminUrl?[{label:"Open in Admin",action:"open_admin",tone:"primary"}]:[],...k(n.slackUrl)?[{label:"Open in Slack",action:"open_slack",tone:"secondary"}]:[]]};let s=e.answersIn.length?`your DMs and ${je(e.answersIn)}`:"your DMs";return{avatar:"agent",avatarUrl:e.avatarUrl,title:n.stage==="said_hello"?`${r} said hello to you in Slack`:`${t.name} is ready in Slack`,subtitle:[{text:`${t.name} is ready \xB7 answers in ${s}`}],blocks:[...n.hello?[{kind:"quote",text:n.hello}]:[],...n.channels==="needs_attention"?[{kind:"note",text:"It could not join one of its Channels yet.",tone:"warn"}]:[]],buttons:[...k(n.slackUrl)?[{label:"Open in Slack",action:"open_slack",tone:"primary"}]:[],...Zn(e)]}}function Zn(e){let n=e.needs[0];return n?[{label:`Connect ${n.name}`,action:"next_step",tone:"secondary"}]:He(e)?[{label:"See its first answer",action:"try_once",tone:"secondary"}]:[]}function He(e){return e.needs.length===0&&e.status.stage!=="needs_attention"&&e.status.agent?.hasFirstAsk===!0}function et(e){let n=e.status==="off"?"It won't answer in Slack until it's turned back on.":e.saved&&e.agent?.handle&&e.status!=="archived"?pe(e.agent.handle,e.channels??[]):void 0;return{avatar:"agent",avatarUrl:e.avatarUrl,title:e.summary.replace(/\.$/,""),done:!0,...n?{subtitle:[{text:n}]}:{},blocks:[],buttons:[...e.undoToken?[{label:"Undo",action:"undo",tone:"secondary"}]:[],...e.slackUrl?[{label:"Open in Slack",action:"open_slack",tone:"secondary"}]:[]]}}function nt(e,n){let t=e.changes.length;return{avatar:"agent",avatarUrl:k(e.agent.avatarUrl),title:`Change ${e.agent.name}`,subtitle:[{text:`${t} ${t===1?"change":"changes"} \xB7 nothing is saved until you press Save`}],blocks:[...e.changes.flatMap(r=>[{kind:"section",label:Kn[r.field]},...tt(r)]),...n?[{kind:"note",text:"It changed since this preview. Ask again for a fresh one.",tone:"warn"}]:[]],buttons:[...n?[]:[{label:"Save",action:"save",tone:"primary"}],{label:"Cancel",action:"cancel",tone:"secondary"}]}}function tt(e){if(e.field==="instructions")return e.quotes.length?e.quotes.map(t=>({kind:"quote",text:Ce(t,r=>`\u201C${r}\u201D`)})):[{kind:"text",text:"Only spacing or line breaks change."}];if(e.field==="on")return[{kind:"text",text:e.after?"Turns it back on.":"Turns it off."}];let n=t=>t==null||t===""?rt[e.field]??"Not set":e.field==="handle"?`@${t}`:e.field==="whoCanEdit"?zn[String(t)]??String(t):String(t);return[{kind:"text",text:n(e.after)},...e.before===void 0?[]:[{kind:"note",text:`Was: ${n(e.before)}`}]]}var rt={model:"The workspace default",imageModel:"The workspace default",effort:"The model's standard effort"};function je(e){return e.length<=2?e.join(" and "):`${e.slice(0,-1).join(", ")} and ${e.at(-1)}`}_e("chickpea-agent-card",{initial:Me,step:Pe,present:qe});})();
</script></body>
</html>