agent-state-machine 2.1.6 → 2.1.8
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/package.json +1 -1
- package/vercel-server/public/remote/assets/index-Cunx4VJE.js +143 -0
- package/vercel-server/public/remote/assets/index-D02x57pS.css +1 -0
- package/vercel-server/public/remote/index.html +2 -2
- package/vercel-server/ui/src/components/ContentCard.jsx +345 -79
- package/vercel-server/public/remote/assets/index-DiKoT5IY.js +0 -139
- package/vercel-server/public/remote/assets/index-dzq5qHNh.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.fixed{position:fixed}.relative{position:relative}.inset-x-0{left:0;right:0}.top-0{top:0}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-8{margin-top:2rem}.flex{display:flex}.inline-flex{display:inline-flex}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-20{height:5rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-\[100dvh\]{height:100dvh}.h-\[40vh\]{height:40vh}.h-full{height:100%}.min-h-\[50vh\]{min-height:50vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-20{width:5rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0px}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-\[300px\]{max-width:300px}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(3rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-balance{text-wrap:balance}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-\[20px\]{border-radius:20px}.rounded-\[24px\]{border-radius:24px}.rounded-\[28px\]{border-radius:28px}.rounded-\[32px\]{border-radius:32px}.rounded-full{border-radius:9999px}.border{border-width:1px}.border-2{border-width:2px}.border-t{border-top-width:1px}.border-accent{border-color:var(--accent)}.border-black{--tw-border-opacity: 1;border-color:rgb(0 0 0 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-white\/10{border-color:#ffffff1a}.border-white\/20{border-color:#fff3}.border-white\/5{border-color:#ffffff0d}.bg-accent{background-color:var(--accent)}.bg-bg{background-color:var(--bg)}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/\[0\.03\]{background-color:#00000008}.bg-fg{background-color:var(--fg)}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/10{background-color:#ffffff1a}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--tw-gradient-stops))}.from-bg{--tw-gradient-from: var(--bg) var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-bg{--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--bg) var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-transparent{--tw-gradient-to: transparent var(--tw-gradient-to-position)}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-12{padding-left:3rem;padding-right:3rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-10{padding-top:2.5rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-6xl{font-size:3.75rem;line-height:1}.text-\[10px\]{font-size:10px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-light{font-weight:300}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-\[0\.12em\]{letter-spacing:.12em}.tracking-\[0\.2em\]{letter-spacing:.2em}.tracking-\[0\.35em\]{letter-spacing:.35em}.tracking-\[0\.4em\]{letter-spacing:.4em}.tracking-\[0\.5em\]{letter-spacing:.5em}.tracking-tight{letter-spacing:-.025em}.tracking-tighter{letter-spacing:-.05em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-accent{color:var(--accent)}.text-bg{color:var(--bg)}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-fg{color:var(--fg)}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-subtle{color:var(--subtle)}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-60{opacity:.6}.opacity-80{opacity:.8}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_15px_rgba\(34\,197\,94\,0\.6\)\]{--tw-shadow: 0 0 15px rgba(34,197,94,.6);--tw-shadow-colored: 0 0 15px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_10px_30px_rgba\(0\,122\,255\,0\.25\)\]{--tw-shadow: 0 10px 30px rgba(0,122,255,.25);--tw-shadow-colored: 0 10px 30px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-3xl{--tw-backdrop-blur: blur(64px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}:root{--bg: #ffffff;--fg: #1d1d1f;--subtle: #86868b;--border: rgba(0, 0, 0, .06);--accent: #007aff}.dark{--bg: #000000;--fg: #f5f5f7;--subtle: #86868b;--border: rgba(255, 255, 255, .1);--accent: #0a84ff}body{background-color:var(--bg);color:var(--fg);font-family:Inter,sans-serif;transition:background-color .4s ease,color .4s ease;overflow:hidden;margin:0;height:100vh;height:100dvh;width:100vw}.custom-scroll::-webkit-scrollbar{width:4px}.custom-scroll::-webkit-scrollbar-track{background:transparent}.custom-scroll::-webkit-scrollbar-thumb{background:var(--subtle);border-radius:4px;opacity:.2}.markdown-body pre{background:#7f7f7f0d;padding:1.5rem;border-radius:12px;overflow-x:auto;font-size:.85rem;line-height:1.6}.content-width{width:100%;max-width:900px;margin:0 auto}.main-container{height:100vh;width:100vw;display:flex;flex-direction:column}.main-stage{flex:1;position:relative;z-index:10;padding-top:calc(80px + env(safe-area-inset-top))}.jumper-input{background:transparent;border:none;color:inherit;font-family:inherit;font-weight:700;text-align:center;width:2.2rem;outline:none;padding:0;margin:0;font-size:inherit}.jumper-input::-webkit-inner-spin-button,.jumper-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.nav-footer{height:80px;display:flex;align-items:center;justify-content:center;z-index:50}.footer-control{display:flex;align-items:center;gap:1.5rem;padding:.5rem 1.2rem;background:#7f7f7f0d;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);border-radius:99px;border:1px solid var(--border)}.tooltip{position:relative}.tooltip:after{content:attr(data-tooltip);position:absolute;bottom:-2.2rem;left:50%;transform:translate(-50%) translateY(4px);background:var(--fg);color:var(--bg);padding:.35rem .55rem;border-radius:999px;font-size:10px;font-weight:700;letter-spacing:.18em;text-transform:uppercase;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .12s ease,transform .12s ease;box-shadow:0 12px 30px #00000026;z-index:40}.tooltip:hover:after,.tooltip:focus-visible:after{opacity:1;transform:translate(-50%) translateY(0)}.placeholder\:opacity-20::-moz-placeholder{opacity:.2}.placeholder\:opacity-20::placeholder{opacity:.2}.hover\:scale-105:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-\[1\.02\]:hover{--tw-scale-x: 1.02;--tw-scale-y: 1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-border:hover{border-color:var(--border)}.hover\:border-white\/20:hover{border-color:#fff3}.hover\:bg-black\/5:hover{background-color:#0000000d}.hover\:bg-black\/\[0\.03\]:hover{background-color:#00000008}.hover\:bg-white\/20:hover{background-color:#fff3}.hover\:text-accent:hover{color:var(--accent)}.hover\:opacity-100:hover{opacity:1}.focus\:border-accent:focus{border-color:var(--accent)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-4:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.active\:scale-95:active{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:opacity-0:disabled{opacity:0}.disabled\:opacity-30:disabled{opacity:.3}.group[open] .group-open\:rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:text-accent{color:var(--accent)}.group:hover .group-hover\:opacity-40{opacity:.4}.group:hover .group-hover\:opacity-50{opacity:.5}.dark\:border-white:is(.dark *){--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.dark\:bg-black:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.dark\:bg-white:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.dark\:bg-white\/\[0\.03\]:is(.dark *){background-color:#ffffff08}.dark\:text-black:is(.dark *){--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.dark\:text-white:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\:hover\:bg-white\/10:hover:is(.dark *){background-color:#ffffff1a}.dark\:hover\:bg-white\/\[0\.03\]:hover:is(.dark *){background-color:#ffffff08}@media (min-width: 640px){.sm\:text-7xl{font-size:4.5rem;line-height:1}}@media (min-width: 768px){.md\:text-8xl{font-size:6rem;line-height:1}}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&_\*\]\:text-inherit *{color:inherit}.\[\&_a\]\:underline a{text-decoration-line:underline}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/remote/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/remote/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/remote/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2) format("woff2-variations");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/remote/assets/inter-greek-wght-normal-CkhJZR-_.woff2) format("woff2-variations");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/remote/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/remote/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/remote/assets/inter-latin-wght-normal-Dx4kXJAl.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(data:font/woff2;base64,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) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/remote/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/remote/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2) format("woff2-variations");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/remote/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/remote/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/remote/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
|
6
6
|
<title>{{WORKFLOW_NAME}}</title>
|
|
7
|
-
<script type="module" crossorigin src="/remote/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/remote/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/remote/assets/index-Cunx4VJE.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/remote/assets/index-D02x57pS.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
|
@@ -1,73 +1,307 @@
|
|
|
1
1
|
import CopyButton from "./CopyButton.jsx";
|
|
2
|
+
import { Bot, ChevronRight } from "lucide-react";
|
|
3
|
+
|
|
4
|
+
function AgentStartedIcon({ className = "" }) {
|
|
5
|
+
return (
|
|
6
|
+
<div
|
|
7
|
+
className={`mx-auto w-14 h-14 rounded-full border border-black dark:border-white flex items-center justify-center ${className}`}
|
|
8
|
+
aria-hidden="true"
|
|
9
|
+
>
|
|
10
|
+
<Bot className="w-7 h-7" />
|
|
11
|
+
</div>
|
|
12
|
+
);
|
|
13
|
+
}
|
|
2
14
|
|
|
3
15
|
export default function ContentCard({ item }) {
|
|
4
16
|
if (!item) return null;
|
|
5
|
-
|
|
17
|
+
|
|
18
|
+
const time = new Date(item.timestamp).toLocaleTimeString([], {
|
|
19
|
+
hour: "2-digit",
|
|
20
|
+
minute: "2-digit",
|
|
21
|
+
second: "2-digit",
|
|
22
|
+
});
|
|
23
|
+
|
|
6
24
|
const eventLabel = item.event ? item.event.replace(/_/g, " ") : "EVENT";
|
|
7
25
|
|
|
26
|
+
const formatKey = (key) =>
|
|
27
|
+
key.replace(/_/g, " ").replace(/([a-z0-9])([A-Z])/g, "$1 $2");
|
|
28
|
+
|
|
29
|
+
const tryParseJson = (raw) => {
|
|
30
|
+
try {
|
|
31
|
+
return JSON.parse(raw);
|
|
32
|
+
} catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const extractJsonFromString = (value) => {
|
|
38
|
+
const trimmed = value.trim();
|
|
39
|
+
const direct = tryParseJson(trimmed);
|
|
40
|
+
if (direct !== null) return direct;
|
|
41
|
+
|
|
42
|
+
const fenceRegex = /```(?:json)?\s*([\s\S]*?)\s*```/gi;
|
|
43
|
+
let match = fenceRegex.exec(trimmed);
|
|
44
|
+
|
|
45
|
+
while (match) {
|
|
46
|
+
const candidate = match[1].trim();
|
|
47
|
+
const parsed = tryParseJson(candidate);
|
|
48
|
+
if (parsed !== null) return parsed;
|
|
49
|
+
match = fenceRegex.exec(trimmed);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return null;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const estimateTokensFromText = (text) => {
|
|
56
|
+
const s = String(text ?? "").trim();
|
|
57
|
+
if (!s) return 0;
|
|
58
|
+
// Heuristic: ~1 token per ~4 characters (good-enough UI estimate).
|
|
59
|
+
return Math.max(1, Math.round(s.length / 4));
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const formatTokenCount = (count) => {
|
|
63
|
+
if (!count) return "0 tokens";
|
|
64
|
+
if (count >= 1_000_000) {
|
|
65
|
+
const v = (count / 1_000_000).toFixed(1).replace(/\.0$/, "");
|
|
66
|
+
return `${v}M tokens`;
|
|
67
|
+
}
|
|
68
|
+
if (count >= 10_000) {
|
|
69
|
+
return `${Math.round(count / 1000)}k tokens`;
|
|
70
|
+
}
|
|
71
|
+
if (count >= 1000) {
|
|
72
|
+
const v = (count / 1000).toFixed(1).replace(/\.0$/, "");
|
|
73
|
+
return `${v}k tokens`;
|
|
74
|
+
}
|
|
75
|
+
return `${count} tokens`;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const extractContextFromPrompt = (promptText) => {
|
|
79
|
+
if (typeof promptText !== "string" || !promptText.trim()) {
|
|
80
|
+
return { cleanedPrompt: "", contextTitle: null, contextData: null, contextRaw: "" };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Matches:
|
|
84
|
+
// "Context\n\n```json\n{...}\n```"
|
|
85
|
+
// "# Current Context\n\n```json\n{...}\n```"
|
|
86
|
+
// "## Context\n```json\n{...}\n```"
|
|
87
|
+
const re =
|
|
88
|
+
/(^|\n)(?:#+\s*)?(Current\s+)?Context\s*\n+```json\s*([\s\S]*?)\s*```/i;
|
|
89
|
+
|
|
90
|
+
const match = re.exec(promptText);
|
|
91
|
+
if (!match) {
|
|
92
|
+
return { cleanedPrompt: promptText, contextTitle: null, contextData: null, contextRaw: "" };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const contextTitle = match[2] ? "Current Context" : "Context";
|
|
96
|
+
const contextRaw = (match[3] || "").trim();
|
|
97
|
+
const parsed = tryParseJson(contextRaw);
|
|
98
|
+
|
|
99
|
+
const before = promptText.slice(0, match.index);
|
|
100
|
+
const after = promptText.slice(match.index + match[0].length);
|
|
101
|
+
|
|
102
|
+
const cleanedPrompt = `${before}\n\n${after}`.replace(/\n{3,}/g, "\n\n").trim();
|
|
103
|
+
|
|
104
|
+
return {
|
|
105
|
+
cleanedPrompt,
|
|
106
|
+
contextTitle,
|
|
107
|
+
contextData: parsed ?? contextRaw,
|
|
108
|
+
contextRaw,
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
const MonoBlock = ({ children }) => (
|
|
113
|
+
<pre className="text-sm font-mono leading-relaxed overflow-auto p-6 rounded-[24px] border border-black bg-black text-white dark:border-white dark:bg-white dark:text-black">
|
|
114
|
+
{children}
|
|
115
|
+
</pre>
|
|
116
|
+
);
|
|
117
|
+
|
|
8
118
|
const renderValue = (value) => {
|
|
9
119
|
if (value === null || value === undefined) {
|
|
10
|
-
return <span className="
|
|
120
|
+
return <span className="italic">—</span>;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (typeof value === "boolean") {
|
|
124
|
+
const base =
|
|
125
|
+
"inline-flex items-center rounded-full px-3 py-1 text-xs font-semibold tracking-[0.2em] uppercase border";
|
|
126
|
+
return value ? (
|
|
127
|
+
<span className={`${base} bg-black text-white border-black dark:bg-white dark:text-black dark:border-white`}>
|
|
128
|
+
Yes
|
|
129
|
+
</span>
|
|
130
|
+
) : (
|
|
131
|
+
<span className={`${base} bg-white text-black border-black dark:bg-black dark:text-white dark:border-white`}>
|
|
132
|
+
No
|
|
133
|
+
</span>
|
|
134
|
+
);
|
|
11
135
|
}
|
|
136
|
+
|
|
12
137
|
if (typeof value === "string") {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
try {
|
|
17
|
-
const parsed = JSON.parse(trimmed);
|
|
18
|
-
return (
|
|
19
|
-
<pre className="text-sm font-mono opacity-80 leading-relaxed custom-scroll overflow-auto bg-black/[0.015] dark:bg-white/[0.015] p-6 rounded-[24px] border border-border">
|
|
20
|
-
{JSON.stringify(parsed, null, 2)}
|
|
21
|
-
</pre>
|
|
22
|
-
);
|
|
23
|
-
} catch (error) {
|
|
24
|
-
return <span className="text-2xl font-semibold whitespace-pre-wrap break-words">{value}</span>;
|
|
25
|
-
}
|
|
138
|
+
const parsedJson = extractJsonFromString(value);
|
|
139
|
+
if (parsedJson !== null) {
|
|
140
|
+
return <MonoBlock>{JSON.stringify(parsedJson, null, 2)}</MonoBlock>;
|
|
26
141
|
}
|
|
142
|
+
|
|
27
143
|
if (value.length > 140 || value.includes("\n")) {
|
|
28
|
-
return
|
|
29
|
-
<pre className="text-sm font-mono opacity-80 leading-relaxed custom-scroll overflow-auto bg-black/[0.015] dark:bg-white/[0.015] p-6 rounded-[24px] border border-border">
|
|
30
|
-
{value}
|
|
31
|
-
</pre>
|
|
32
|
-
);
|
|
144
|
+
return <MonoBlock>{value}</MonoBlock>;
|
|
33
145
|
}
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
if (typeof value === "object") {
|
|
146
|
+
|
|
37
147
|
return (
|
|
38
|
-
<
|
|
39
|
-
{
|
|
40
|
-
</
|
|
148
|
+
<span className="text-2xl font-semibold whitespace-pre-wrap break-words">
|
|
149
|
+
{value}
|
|
150
|
+
</span>
|
|
41
151
|
);
|
|
42
152
|
}
|
|
153
|
+
|
|
154
|
+
if (typeof value === "object") {
|
|
155
|
+
return <MonoBlock>{JSON.stringify(value, null, 2)}</MonoBlock>;
|
|
156
|
+
}
|
|
157
|
+
|
|
43
158
|
return <span className="text-2xl font-semibold">{String(value)}</span>;
|
|
44
159
|
};
|
|
45
160
|
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
161
|
+
const MAX_STRUCT_DEPTH = 6;
|
|
162
|
+
|
|
163
|
+
function renderArray(items, depth) {
|
|
164
|
+
if (!items.length) return <span className="italic">—</span>;
|
|
165
|
+
|
|
166
|
+
const isSimple = items.every(
|
|
167
|
+
(entry) => entry === null || ["string", "number", "boolean"].includes(typeof entry)
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
const isObjectList = items.every(
|
|
171
|
+
(entry) => entry && typeof entry === "object" && !Array.isArray(entry)
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
const isSimpleObjectList =
|
|
175
|
+
isObjectList &&
|
|
176
|
+
items.every((entry) =>
|
|
177
|
+
Object.values(entry).every(
|
|
178
|
+
(val) => val === null || ["string", "number", "boolean"].includes(typeof val)
|
|
179
|
+
)
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
if (isSimple) {
|
|
183
|
+
return (
|
|
184
|
+
<div className="space-y-2">
|
|
185
|
+
{items.map((entry, index) => (
|
|
186
|
+
<div key={`item-${index}`} className="text-base">
|
|
187
|
+
{renderValue(entry)}
|
|
188
|
+
</div>
|
|
189
|
+
))}
|
|
54
190
|
</div>
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (isSimpleObjectList) {
|
|
195
|
+
return (
|
|
196
|
+
<div className="space-y-4">
|
|
197
|
+
{items.map((entry, index) => (
|
|
198
|
+
<div
|
|
199
|
+
key={`item-${index}`}
|
|
200
|
+
className="rounded-[20px] border border-black p-4 dark:border-white"
|
|
201
|
+
>
|
|
202
|
+
{renderKeyValueGrid(Object.entries(entry), depth)}
|
|
203
|
+
</div>
|
|
204
|
+
))}
|
|
205
|
+
</div>
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
return (
|
|
210
|
+
<div className="space-y-6">
|
|
211
|
+
{items.map((entry, index) => (
|
|
212
|
+
<div
|
|
213
|
+
key={`item-${index}`}
|
|
214
|
+
className="space-y-4 rounded-[24px] border border-black p-5 dark:border-white"
|
|
215
|
+
>
|
|
216
|
+
<div className="text-[10px] font-bold tracking-[0.35em] uppercase">
|
|
217
|
+
Item {index + 1}
|
|
218
|
+
</div>
|
|
219
|
+
{renderStructured(entry, depth + 1)}
|
|
220
|
+
</div>
|
|
221
|
+
))}
|
|
222
|
+
</div>
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function renderObject(obj, depth) {
|
|
227
|
+
const entries = Object.entries(obj);
|
|
228
|
+
if (!entries.length) return <span className="italic">—</span>;
|
|
229
|
+
if (depth >= MAX_STRUCT_DEPTH) return renderValue(obj);
|
|
230
|
+
return renderKeyValueGrid(entries, depth);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function renderStructured(value, depth = 0) {
|
|
234
|
+
if (value === null || value === undefined) return renderValue(value);
|
|
235
|
+
|
|
236
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
237
|
+
return renderValue(value);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (Array.isArray(value)) return renderArray(value, depth);
|
|
241
|
+
if (typeof value === "object") return renderObject(value, depth);
|
|
242
|
+
|
|
243
|
+
return renderValue(value);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function renderKeyValueGrid(entries, depth = 0) {
|
|
247
|
+
return (
|
|
248
|
+
<div className="space-y-8">
|
|
249
|
+
{entries.map(([key, value]) => (
|
|
250
|
+
<div key={key} className="space-y-2">
|
|
251
|
+
<div className="text-[10px] font-bold tracking-[0.35em] uppercase">
|
|
252
|
+
{formatKey(key)}
|
|
253
|
+
</div>
|
|
254
|
+
<div className="text-base">{renderStructured(value, depth + 1)}</div>
|
|
255
|
+
</div>
|
|
256
|
+
))}
|
|
257
|
+
</div>
|
|
258
|
+
);
|
|
259
|
+
}
|
|
58
260
|
|
|
59
261
|
let content = null;
|
|
60
262
|
|
|
61
263
|
if (item.event === "AGENT_STARTED") {
|
|
264
|
+
const { cleanedPrompt, contextTitle, contextData, contextRaw } = extractContextFromPrompt(
|
|
265
|
+
item.prompt || ""
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
const contextTokenCount = estimateTokensFromText(contextRaw || "");
|
|
269
|
+
const contextMeta = contextRaw ? `~${formatTokenCount(contextTokenCount)}` : "";
|
|
270
|
+
|
|
62
271
|
content = (
|
|
63
|
-
<div className="space-y-12 py-
|
|
64
|
-
<div className="space-y-
|
|
65
|
-
<
|
|
66
|
-
<
|
|
67
|
-
|
|
272
|
+
<div className="space-y-12 py-4">
|
|
273
|
+
<div className="space-y-4 text-center">
|
|
274
|
+
<AgentStartedIcon />
|
|
275
|
+
<div className="space-y-2">
|
|
276
|
+
<h2 className="text-4xl font-black tracking-tight">{item.agent}</h2>
|
|
277
|
+
<div className="text-xs font-mono">{time}</div>
|
|
278
|
+
</div>
|
|
68
279
|
</div>
|
|
69
|
-
|
|
70
|
-
|
|
280
|
+
|
|
281
|
+
{contextTitle && contextData !== null && (
|
|
282
|
+
<details className="group rounded-[24px] border border-black dark:border-white">
|
|
283
|
+
<summary className="cursor-pointer select-none px-6 py-5 flex items-center justify-between gap-6 [&::-webkit-details-marker]:hidden">
|
|
284
|
+
<div className="flex items-center gap-3">
|
|
285
|
+
<ChevronRight className="w-4 h-4 transition-transform group-open:rotate-90" />
|
|
286
|
+
<div className="text-sm font-semibold tracking-[0.12em] uppercase">
|
|
287
|
+
{contextTitle}
|
|
288
|
+
</div>
|
|
289
|
+
</div>
|
|
290
|
+
{contextMeta ? <div className="text-xs font-mono">{contextMeta}</div> : null}
|
|
291
|
+
</summary>
|
|
292
|
+
|
|
293
|
+
<div className="border-t border-black dark:border-white p-6">
|
|
294
|
+
{typeof contextData === "string" ? (
|
|
295
|
+
<MonoBlock>{contextData}</MonoBlock>
|
|
296
|
+
) : (
|
|
297
|
+
renderStructured(contextData)
|
|
298
|
+
)}
|
|
299
|
+
</div>
|
|
300
|
+
</details>
|
|
301
|
+
)}
|
|
302
|
+
|
|
303
|
+
<div className="markdown-body leading-relaxed text-xl font-light whitespace-pre-wrap [&_*]:text-inherit [&_a]:underline">
|
|
304
|
+
{cleanedPrompt}
|
|
71
305
|
</div>
|
|
72
306
|
</div>
|
|
73
307
|
);
|
|
@@ -75,83 +309,115 @@ export default function ContentCard({ item }) {
|
|
|
75
309
|
const step = item.event.replace("WORKFLOW_", "");
|
|
76
310
|
content = (
|
|
77
311
|
<div className="min-h-[50vh] flex flex-col items-center justify-center text-center space-y-8 py-20">
|
|
78
|
-
<div className="text-[10px] font-bold tracking-[0.5em] uppercase
|
|
79
|
-
|
|
80
|
-
|
|
312
|
+
<div className="text-[10px] font-bold tracking-[0.5em] uppercase">
|
|
313
|
+
Lifecycle status
|
|
314
|
+
</div>
|
|
315
|
+
|
|
316
|
+
<div className="w-full max-w-5xl rounded-[28px] border border-black p-10 dark:border-white">
|
|
317
|
+
<h2 className="text-6xl sm:text-7xl md:text-8xl font-black tracking-tighter leading-none uppercase">
|
|
318
|
+
{step}
|
|
319
|
+
</h2>
|
|
320
|
+
|
|
321
|
+
{item.error && (
|
|
322
|
+
<pre className="mt-8 text-xs font-mono whitespace-pre-wrap rounded-[24px] border border-black p-6 bg-black text-white dark:border-white dark:bg-white dark:text-black">
|
|
323
|
+
{item.error}
|
|
324
|
+
</pre>
|
|
325
|
+
)}
|
|
326
|
+
</div>
|
|
81
327
|
</div>
|
|
82
328
|
);
|
|
83
329
|
} else if (item.event === "PROMPT_REQUESTED" || item.event === "INTERACTION_REQUESTED") {
|
|
84
330
|
const details = [
|
|
85
331
|
["slug", item.slug],
|
|
86
332
|
["targetKey", item.targetKey],
|
|
87
|
-
["type", item.type]
|
|
333
|
+
["type", item.type],
|
|
88
334
|
].filter((entry) => entry[1] !== undefined);
|
|
89
335
|
|
|
90
336
|
content = (
|
|
91
|
-
<div className="space-y-10 py-
|
|
92
|
-
<div className="
|
|
93
|
-
|
|
94
|
-
<div className="text-xs font-mono opacity-20">{time}</div>
|
|
95
|
-
</div>
|
|
337
|
+
<div className="space-y-10 py-4">
|
|
338
|
+
<div className="text-xs font-mono">{time}</div>
|
|
339
|
+
|
|
96
340
|
<div className="text-4xl font-bold tracking-tight text-balance leading-tight">
|
|
97
341
|
{item.question || item.prompt || "Prompt"}
|
|
98
342
|
</div>
|
|
343
|
+
|
|
99
344
|
{item.prompt && item.question && item.prompt !== item.question && (
|
|
100
|
-
<div className="text-lg font-medium
|
|
101
|
-
)}
|
|
102
|
-
{details.length > 0 && (
|
|
103
|
-
<div className="pt-4">
|
|
104
|
-
{renderKeyValueGrid(details)}
|
|
105
|
-
</div>
|
|
345
|
+
<div className="text-lg font-medium whitespace-pre-wrap">{item.prompt}</div>
|
|
106
346
|
)}
|
|
347
|
+
|
|
348
|
+
{details.length > 0 && <div className="pt-4">{renderKeyValueGrid(details)}</div>}
|
|
107
349
|
</div>
|
|
108
350
|
);
|
|
109
351
|
} else if (item.event === "PROMPT_ANSWERED" || item.event === "INTERACTION_SUBMITTED") {
|
|
110
352
|
const responseValue = item.answer !== undefined ? item.answer : item.response;
|
|
353
|
+
|
|
111
354
|
const details = [
|
|
112
355
|
["slug", item.slug],
|
|
113
|
-
["targetKey", item.targetKey]
|
|
356
|
+
["targetKey", item.targetKey],
|
|
114
357
|
].filter((entry) => entry[1] !== undefined);
|
|
115
358
|
|
|
116
359
|
content = (
|
|
117
|
-
<div className="space-y-10 py-
|
|
118
|
-
<div className="
|
|
119
|
-
|
|
120
|
-
<div className="text-xs font-mono opacity-20">{time}</div>
|
|
121
|
-
</div>
|
|
360
|
+
<div className="space-y-10 py-4">
|
|
361
|
+
<div className="text-xs font-mono">{time}</div>
|
|
362
|
+
|
|
122
363
|
<div className="text-4xl font-bold tracking-tight text-balance leading-tight">
|
|
123
364
|
{renderValue(responseValue)}
|
|
124
365
|
</div>
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
366
|
+
|
|
367
|
+
{details.length > 0 && <div className="pt-4">{renderKeyValueGrid(details)}</div>}
|
|
368
|
+
</div>
|
|
369
|
+
);
|
|
370
|
+
} else if (item.event === "AGENT_COMPLETED") {
|
|
371
|
+
const details = [
|
|
372
|
+
["agent", item.agent],
|
|
373
|
+
["attempts", item.attempts],
|
|
374
|
+
].filter((entry) => entry[1] !== undefined);
|
|
375
|
+
|
|
376
|
+
content = (
|
|
377
|
+
<div className="space-y-12 py-4">
|
|
378
|
+
{item.output !== undefined && (
|
|
379
|
+
<div className="space-y-8">
|
|
380
|
+
<div className="rounded-[28px] border border-black px-6 py-5 dark:border-white">
|
|
381
|
+
<div className="flex flex-wrap items-center justify-between gap-3">
|
|
382
|
+
<div className="text-3xl font-black tracking-tight">
|
|
383
|
+
{item.agent ? `Output from ${item.agent}` : "Agent output"}
|
|
384
|
+
</div>
|
|
385
|
+
<div className="text-xs font-mono">{time}</div>
|
|
386
|
+
</div>
|
|
387
|
+
<div className="mt-2 text-sm">
|
|
388
|
+
This is what the previous agent run produced.
|
|
389
|
+
</div>
|
|
390
|
+
</div>
|
|
391
|
+
|
|
392
|
+
{renderStructured(item.output)}
|
|
128
393
|
</div>
|
|
129
394
|
)}
|
|
395
|
+
|
|
396
|
+
{details.length > 0 && <div className="pt-4">{renderKeyValueGrid(details)}</div>}
|
|
130
397
|
</div>
|
|
131
398
|
);
|
|
132
399
|
} else {
|
|
133
|
-
const entries = Object.entries(item).filter(
|
|
400
|
+
const entries = Object.entries(item).filter(
|
|
401
|
+
([key]) => key !== "event" && key !== "timestamp"
|
|
402
|
+
);
|
|
403
|
+
|
|
134
404
|
const fallbackEntries = entries.length > 0 ? entries : [["event", item.event || "Event"]];
|
|
135
405
|
|
|
136
406
|
content = (
|
|
137
|
-
<div className="space-y-12 py-
|
|
138
|
-
<div className="
|
|
139
|
-
<div className="text-xs font-bold tracking-[0.4em] uppercase opacity-40">{eventLabel}</div>
|
|
140
|
-
<div className="flex items-center gap-6">
|
|
141
|
-
<span className="text-xs font-mono opacity-20">{time}</span>
|
|
142
|
-
<CopyButton text={item} />
|
|
143
|
-
</div>
|
|
144
|
-
</div>
|
|
407
|
+
<div className="space-y-12 py-4">
|
|
408
|
+
<div className="text-xs font-mono">{time}</div>
|
|
145
409
|
{renderKeyValueGrid(fallbackEntries)}
|
|
146
410
|
</div>
|
|
147
411
|
);
|
|
148
412
|
}
|
|
149
413
|
|
|
150
414
|
return (
|
|
151
|
-
<div className="w-full h-full flex flex-col overflow-y-auto custom-scroll px-12">
|
|
415
|
+
<div className="w-full h-full flex flex-col overflow-y-auto custom-scroll px-12 bg-white text-black dark:bg-black dark:text-white">
|
|
152
416
|
<div className="content-width flex-1">
|
|
153
417
|
<div className="flex items-center justify-between pt-10">
|
|
154
|
-
<div className="text-[10px] font-bold tracking-[0.4em] uppercase
|
|
418
|
+
<div className="text-[10px] font-bold tracking-[0.4em] uppercase">
|
|
419
|
+
{eventLabel}
|
|
420
|
+
</div>
|
|
155
421
|
<CopyButton text={item} />
|
|
156
422
|
</div>
|
|
157
423
|
{content}
|