@huynle/hub 0.9.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +309 -0
- package/Dockerfile +5 -1
- package/README.md +153 -77
- package/package.json +7 -4
- package/packages/claude-code/package.json +1 -1
- package/packages/cli/dist/hub-cli.js +532 -261
- package/packages/cli/package.json +1 -1
- package/packages/cli/src/cli.ts +36 -1
- package/packages/cli/src/subscriptions.ts +49 -0
- package/packages/codex/package.json +1 -1
- package/packages/codex/src/sessions.ts +10 -6
- package/packages/codex/src/spoke.ts +2 -1
- package/packages/node/package.json +1 -1
- package/packages/preset/package.json +1 -1
- package/packages/protocol/package.json +1 -1
- package/packages/protocol/schema/app-delivery/v1.schema.json +7 -5
- package/packages/protocol/schema/app-front/v1.schema.json +410 -0
- package/packages/protocol/src/app-front.ts +293 -0
- package/packages/protocol/src/concierge.ts +10 -1
- package/packages/protocol/src/context-cards.ts +59 -0
- package/packages/protocol/src/credentials.ts +39 -2
- package/packages/protocol/src/index.ts +69 -11
- package/packages/runtime-openshell/package.json +1 -1
- package/packages/runtime-sdk/package.json +1 -1
- package/packages/sdk/package.json +1 -1
- package/packages/sdk/src/app-front.ts +524 -0
- package/packages/sdk/src/client.ts +37 -4
- package/packages/sdk/src/envelope.ts +9 -2
- package/packages/sdk/src/errors.ts +1 -0
- package/packages/sdk/src/index.ts +1 -0
- package/packages/sdk/src/types.ts +39 -1
- package/packages/spoke-sdk/package.json +1 -1
- package/packages/spoke-sdk/src/delivery.ts +17 -1
- package/packages/spoke-sdk/src/harness-spoke.ts +4 -3
- package/packages/voice-client/README.md +146 -0
- package/packages/voice-client/src/vad/LICENSE +21 -0
- package/src/central/agent/acting-routes.ts +17 -3
- package/src/central/agent/acting.ts +12 -3
- package/src/central/agent/actor.ts +6 -1
- package/src/central/agent/app-decisions.ts +146 -0
- package/src/central/agent/app-tokens.ts +9 -3
- package/src/central/agent/audit.ts +3 -0
- package/src/central/agent/connect-routes.ts +64 -0
- package/src/central/agent/connect.ts +868 -0
- package/src/central/agent/conversation.ts +625 -0
- package/src/central/agent/decisions.ts +71 -6
- package/src/central/agent/delivery.ts +3 -0
- package/src/central/agent/directory.ts +5 -0
- package/src/central/agent/errors.ts +2 -0
- package/src/central/agent/grant-requests.ts +46 -9
- package/src/central/agent/grants.ts +13 -2
- package/src/central/agent/message-limits.ts +2 -2
- package/src/central/agent/message-routes.ts +13 -4
- package/src/central/agent/read-routes.ts +16 -2
- package/src/central/agent/routes.ts +108 -6
- package/src/central/agent/speech-routes.ts +316 -0
- package/src/central/agent/subscription-routes.ts +174 -0
- package/src/central/agent/subscriptions.ts +980 -0
- package/src/central/agent/webhooks.ts +5 -2
- package/src/central/agent-data.ts +43 -1
- package/src/central/backend/memory-counters.ts +2 -2
- package/src/central/backend/types.ts +5 -2
- package/src/central/backend/valkey-counters.ts +5 -4
- package/src/central/client-address.ts +16 -0
- package/src/central/concierge/board-render.ts +52 -1
- package/src/central/concierge/board-routes.ts +25 -2
- package/src/central/concierge/board.ts +11 -1
- package/src/central/concierge/context.ts +29 -8
- package/src/central/concierge/grant-request.ts +216 -0
- package/src/central/concierge/prompt.ts +49 -2
- package/src/central/concierge/session-routes.ts +3 -0
- package/src/central/config.ts +88 -5
- package/src/central/context-cards/budget.ts +121 -0
- package/src/central/context-cards/changes.ts +29 -0
- package/src/central/context-cards/config.ts +145 -0
- package/src/central/context-cards/engine.ts +379 -0
- package/src/central/context-cards/inputs.ts +111 -0
- package/src/central/context-cards/pickup.ts +134 -0
- package/src/central/context-cards/registry.ts +89 -0
- package/src/central/context-cards/routes.ts +37 -0
- package/src/central/context-cards/service.ts +367 -0
- package/src/central/context-cards/store.ts +67 -0
- package/src/central/context-cards/types.ts +88 -0
- package/src/central/fetcher.ts +10 -2
- package/src/central/front-relays.ts +423 -0
- package/src/central/http.ts +517 -56
- package/src/central/human-activity.ts +453 -0
- package/src/central/llm/chat.ts +133 -0
- package/src/central/push-target.ts +11 -2
- package/src/central/registry.ts +162 -9
- package/src/central/speech/service.ts +9 -0
- package/src/central/spoke-ws.ts +13 -0
- package/src/central/store.ts +9 -12
- package/src/config.ts +30 -13
- package/src/index.ts +45 -43
- package/src/rpc.ts +33 -4
- package/src/spoke/concierge-agent.ts +1 -1
- package/src/spoke/conversation.ts +6 -75
- package/src/spoke/deliver.ts +18 -8
- package/src/spoke/hub-rpc.ts +7 -2
- package/src/spoke/hub-tool-subscriptions.ts +82 -0
- package/src/spoke/hub-tool-title.ts +89 -0
- package/src/spoke/hub-tool.ts +56 -18
- package/src/spoke/session-context.ts +10 -2
- package/src/spoke/spoke.ts +209 -238
- package/src/spoke/summary.ts +36 -1
- package/src/spoke/taskboard.ts +5 -6
- package/src/spoke/voice-front.ts +323 -30
- package/src/spoke/who-teams.ts +51 -2
- package/src/tui-messaging.ts +24 -10
- package/src/tui.ts +6 -6
- package/web/dist/assets/{ArtifactPage-BKISN-Qj.js → ArtifactPage-Bz992ZX6.js} +1 -1
- package/web/dist/assets/{ArtifactPane-CKOiAUNH.js → ArtifactPane-BJZNixJC.js} +1 -1
- package/web/dist/assets/ArtifactWorkbench-Dti3VP07.js +6 -0
- package/web/dist/assets/{Diagram-vdpmp3xu.css → Diagram-7y8kg3og.css} +1 -1
- package/web/dist/assets/Diagram-B4HdUxw0.js +1 -0
- package/web/dist/assets/{Library-CcjZXsfF.js → Library-CpzD2HDW.js} +2 -2
- package/web/dist/assets/Lightbox-BlbivCkd.js +1 -0
- package/web/dist/assets/MediaImage-Ch3ryIdR.js +4 -0
- package/web/dist/assets/ProfilesDestination-DlQeogea.js +1 -0
- package/web/dist/assets/{TeamsPage-CDyjrK-I.js → TeamsPage-4xdWCaI-.js} +1 -1
- package/web/dist/assets/{Watchtower-DYwoUWME.js → Watchtower-CpQdIRns.js} +2 -2
- package/web/dist/assets/{artifacts-DU9uRgs1.js → artifacts-But87Jfo.js} +1 -1
- package/web/dist/assets/index-BC0O1gfR.css +1 -0
- package/web/dist/assets/index-BS6lA6fN.js +33 -0
- package/web/dist/assets/{live-ycZ_aQZO.js → live-CVUFIdUX.js} +2 -2
- package/web/dist/assets/{pane-layout-0RrLHGDr.js → pane-layout-BW0RdX5a.js} +1 -1
- package/web/dist/assets/{renderer2d-BIwbgRoX.js → renderer2d-IaJiloPi.js} +1 -1
- package/web/dist/assets/{renderer3d-C1a7eYGQ.js → renderer3d-ZiD1uKGW.js} +1 -1
- package/web/dist/assets/{safe-area-DHhPy61Q.js → safe-area-C7IAlkgY.js} +1 -1
- package/web/dist/assets/{source-BWlvaODa.js → source-C-De8L3s.js} +1 -1
- package/web/dist/assets/toast-CXTwTvDw.js +9 -0
- package/web/dist/assets/vad-worklet-BfxJhrXy.js +27 -0
- package/web/dist/index.html +6 -6
- package/web/dist/assets/ArtifactWorkbench-d7R1o-rs.js +0 -6
- package/web/dist/assets/Diagram-azw2B_QH.js +0 -1
- package/web/dist/assets/Lightbox-Du56MXGX.js +0 -1
- package/web/dist/assets/MediaImage-Ds_JUx3a.js +0 -4
- package/web/dist/assets/ProfilesDestination-DdzbzmeK.js +0 -1
- package/web/dist/assets/index-C3ci5UtY.css +0 -1
- package/web/dist/assets/index-LNMZCqgE.js +0 -36
- package/web/dist/assets/toast-Cuu2K0hx.js +0 -1
- /package/{web/src/voice → packages/voice-client/src}/turn/LICENSE +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{E as e}from"./live-
|
|
1
|
+
import{E as e}from"./live-CVUFIdUX.js";var t=`watchtower.layout`,n=1e3,r=[`--accent`,`--blue`,`--violet`,`--orange`,`--ok`,`--warn`];function i(e,t=0){let n=110+26*Math.sqrt(Math.max(1,e))+7*Math.sqrt(Math.max(0,t)),r=Math.PI*(3-Math.sqrt(5));return Array.from({length:e},(t,i)=>{let a=e===1?0:1-i/(e-1)*2,o=Math.sqrt(1-a*a),s=i*r;return[l(Math.cos(s)*o*n),l(a*n*.55),l(Math.sin(s)*o*n)]})}function a(t){let n=new Set(t.nodes.map(e=>e.id)),a=i(t.groups.length,t.groups.reduce((e,t)=>e+t.sections.reduce((e,t)=>e+t.members.length,0),0));return t.groups.map((t,i)=>{let o=[];n.has(t.id)&&o.push(t.id);for(let e of t.sections)e.id!==void 0&&n.has(e.id)&&o.push(e.id),o.push(...e.members);let s=t.machine===void 0?r[i%r.length]:e[t.machine%e.length];return{id:t.id,label:t.label,color:s,center:a[i],members:o}})}function o(e){let t=new Map;for(let n of e.links)n.kind!==`structure`&&n.kind!==`policy`&&(t.set(n.source,(t.get(n.source)??0)+n.count),t.set(n.target,(t.get(n.target)??0)+n.count));return t}function s(e,t){let n=new Set,r=new Set(e.groups.map(e=>e.id));for(let t of e.nodes)(t.kind===`hub`||t.kind===`user`||t.kind===`app`||t.kind===`role`||r.has(t.id)||t.match)&&n.add(t.id);let i=o(e),a=e.nodes.filter(e=>!n.has(e.id)&&e.kind!==`role`);a.sort((e,t)=>(i.get(t.id)??0)-(i.get(e.id)??0)||(e.id<t.id?-1:+(e.id>t.id)));for(let e of a.slice(0,Math.max(0,t.max)))n.add(e.id);for(let e of t.extra??[])n.add(e);return n}var c=e=>e.kind===`role`&&e.vacant?`${e.label} · vacant`:e.label,l=e=>Math.round(e*10)/10,u=e=>typeof e==`number`&&Number.isFinite(e);function d(e){let t=new Map;if(!e)return t;let n;try{n=JSON.parse(e)}catch{return t}if(typeof n!=`object`||!n||Array.isArray(n))return t;let{v:r,p:i}=n;if(r!==1||typeof i!=`object`||!i||Array.isArray(i))return t;for(let[e,n]of Object.entries(i)){if(t.size>=1e3)break;if(!Array.isArray(n)||n.length!==3)continue;let[r,i,a]=n;u(r)&&u(i)&&u(a)&&t.set(e,[r,i,a])}return t}function f(e,t,r=n){let i={},a=0;for(let n of[e,t])for(let[e,t]of n){if(a>=r)break;e in i||!t.every(u)||(i[e]=[l(t[0]),l(t[1]),l(t[2])],a++)}return JSON.stringify({v:1,p:i})}function p(e,t){let n=2166136261;for(let t=0;t<e.length;t++)n=Math.imul(n^e.charCodeAt(t),16777619);let r=(n>>>0)%1e3/1e3,i=(Math.imul(n,2654435761)>>>0)%1e3/1e3,a=r*Math.PI*2,o=i*2-1,s=Math.sqrt(1-o*o),c=t*(.6+.4*r);return[Math.cos(a)*s*c,o*c,Math.sin(a)*s*c]}function m(e,t){let n=new Map,r=new Set,i=new Map;for(let t of a(e))for(let e of t.members)i.set(e,t);let o=new Map,s=new Map;for(let t of e.links)t.kind===`structure`&&(o.get(t.target)??o.set(t.target,[]).get(t.target)).push(t.source),(s.get(t.target)??s.set(t.target,[]).get(t.target)).push(t.source),(s.get(t.source)??s.set(t.source,[]).get(t.source)).push(t.target);n.set(`hub`,[0,0,0]);for(let r of e.nodes){if(r.id===`hub`)continue;let e=t.get(r.id);e&&n.set(r.id,e)}let c=new Set(e.groups.map(e=>e.id)),u=[...e.nodes.filter(e=>c.has(e.id)),...e.nodes.filter(e=>!c.has(e.id))];for(let e of u){if(n.has(e.id))continue;r.add(e.id);let t=[...o.get(e.id)??[],...s.get(e.id)??[]].find(e=>e!==`hub`&&n.has(e)),a=i.get(e.id),c=t===void 0?a?.center:n.get(t),u=p(e.id,t===void 0?a?24:40:14),d=c??[0,0,0];n.set(e.id,[l(d[0]+u[0]),l(d[1]+u[1]),l(d[2]+u[2])])}return{positions:n,fresh:r}}function h(e,t){let n=new Map,r=[],i=e=>r.some(t=>e.x<t.x+t.w&&t.x<e.x+e.w&&e.y<t.y+t.h&&t.y<e.y+e.h),a=[...e.filter(e=>e.pinned),...e.filter(e=>!e.pinned)];for(let e of a)for(let a of e.texts){let o=t(a,e),s={x:e.x-o/2,y:e.y,w:o,h:e.h};if(e.pinned||!i(s)){r.push(s),n.set(e.id,{text:a,box:s});break}}return n}var g=8,_=900;function v(e){let t={top:0,right:0,bottom:0,left:0},n=e.closest(`.wt-stage`);if(!n)return t;let r=e.getBoundingClientRect();if(!r.height)return t;let i=n.querySelector(`.wt-dock`)?.getBoundingClientRect(),a=n.querySelector(`.wt-chips`)?.getBoundingClientRect(),o=r.width>=_?n.querySelector(`.wt-pop-legend`)?.getBoundingClientRect():void 0,s=o&&o.width?Math.max(0,o.right-r.left+g):0,c=i&&i.height?Math.max(0,r.bottom-i.top+g):0,l=a&&a.height?Math.max(0,a.bottom-r.top+g):0;return{top:Math.min(l,r.height/3),right:0,bottom:Math.min(c,r.height/3),left:Math.min(s,r.width/3)}}export{c as a,a as c,s as i,m as l,t as n,d as o,o as r,h as s,v as t,f as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{A as e,U as t,V as n,W as r}from"./toast-CXTwTvDw.js";import{t as i}from"./artifacts-But87Jfo.js";var a=`/api/agent/artifacts`,o={workspace:``,type:``},s=e=>typeof e==`string`&&i.includes(e);function c(t){let n=typeof t==`string`?new URLSearchParams(t):t,r=n.get(`workspace`)??``,i=n.get(`type`)??``;return{workspace:r===`none`||e(`workspace`,r)?r:``,type:s(i)?i:``,...n.get(`origin`)===`preview`?{origin:`preview`}:{}}}function l(e){let t=new URLSearchParams;e.workspace&&t.set(`workspace`,e.workspace),e.type&&t.set(`type`,e.type),e.origin&&t.set(`origin`,e.origin);let n=t.toString();return n?`?${n}`:``}var u=e=>e.workspace&&e.workspace!==`none`?e.workspace:``,d=e=>`${u(e)}|${e.origin??``}`;function f(e,t){let n=new URLSearchParams({state:`active`,limit:`50`}),r=u(e);return r&&n.set(`workspace`,r),e.origin&&n.set(`origin`,e.origin),t&&n.set(`cursor`,t),`${a}?${n}`}var p=e=>typeof e==`string`&&e.length>0;function m(e){if(!e||typeof e!=`object`)return;let t=e;if(p(t.id)&&typeof t.title==`string`&&s(t.kind)&&typeof t.updatedAt==`number`)return{id:t.id,title:t.title,kind:t.kind,visibility:t.visibility===`workspace`?`workspace`:`private`,...p(t.workspaceID)?{workspaceID:t.workspaceID}:{},...p(t.description)?{description:t.description}:{},updatedAt:t.updatedAt,...t.origin===`preview`?{origin:`preview`,...typeof t.revision==`number`?{revision:t.revision}:{}}:{}}}function h(e){let t=e&&typeof e==`object`?e:{};return{items:Array.isArray(t.items)?t.items.flatMap(e=>m(e)??[]):[],...p(t.cursor)?{cursor:t.cursor}:{}}}function g(e,t){return e.filter(e=>e.origin===`preview`==(t.origin===`preview`)&&(t.type===``||e.kind===t.type)&&(t.workspace===``||(t.workspace===`none`?!e.workspaceID:e.workspaceID===t.workspace)))}function _(e){return e.status===422||e.code===`unsupported`?{kind:`unsupported`,text:`Artifacts aren't supported on this hub yet.`}:e.status===404?{kind:`unavailable`,text:`This hub doesn't have artifacts.`}:e.status===403||e.status===401?{kind:`forbidden`,text:`This device isn't allowed to read artifacts.`}:{kind:`error`,text:e.message?`Could not load artifacts: ${e.message}`:`Could not load artifacts (HTTP ${e.status}).`}}function v(e){let t=e&&typeof e==`object`?e:{};return{status:typeof t.status==`number`?t.status:0,...typeof t.code==`string`?{code:t.code}:{},message:typeof t.message==`string`?t.message:String(e)}}function y(e,t){return t?`None of the artifacts loaded so far match. Load more to keep looking.`:e.origin===`preview`?`No previews. HTML previews you open from a session stay here for a day after you last view them.`:e.workspace===``&&e.type===``?`No artifacts yet. Artifacts that your sessions create show up here.`:`No artifacts match these filters.`}var b=(e,t)=>t.get(e)??`Workspace ${e.slice(0,12)}…`,x=e=>`/artifacts/${encodeURIComponent(e)}`;function S(e,t){let n=o,r,i=0,a=[],s,c={status:`loading`},l=()=>c.status===`ready`?{status:`ready`,items:g(a,n),total:a.length,more:s!==void 0,loadingMore:c.loadingMore,...c.moreError?{moreError:c.moreError}:{}}:c,u=e=>{c=e,t(l())};function f(o){n=o;let f=d(o);if(f===r&&c.status===`ready`){t(l());return}r=f;let p=++i;a=[],s=void 0,u({status:`loading`}),e.list(o).then(e=>{p===i&&(a=[...e.items],s=e.cursor,u({status:`ready`,loadingMore:!1}))},e=>p===i&&u({status:`error`,error:_(v(e))}))}function p(){if(c.status!==`ready`||c.loadingMore||s===void 0)return;let t=i;u({status:`ready`,loadingMore:!0}),e.list(n,s).then(e=>{if(t!==i)return;let n=new Set(a.map(e=>e.id));a=[...a,...e.items.filter(e=>!n.has(e.id))],s=e.cursor,u({status:`ready`,loadingMore:!1})},e=>t===i&&u({status:`ready`,loadingMore:!1,moreError:_(v(e)).text}))}function m(){r=void 0,f(n)}async function h(n){if(!e.keep)return`Keep is not available here.`;try{await e.keep(n)}catch(e){return`Could not keep it: ${v(e).message}`}a=a.filter(e=>e.id!==n.id),c.status===`ready`&&t(l())}return{load:f,more:p,reload:m,view:l,keep:h}}var C={list:async(e,n)=>h(await t(f(e,n))),keep:async e=>void await r(`/api/agent/artifacts/${n(e.id)}/keep`,{expectedRevision:e.revision??0})};async function w(){try{return((await t(`/api/agent/workspaces?state=active&limit=200`)).items??[]).flatMap(e=>typeof e.id==`string`&&typeof e.title==`string`?[{id:e.id,title:e.title}]:[])}catch{return[]}}export{y as a,b as c,S as i,w as n,l as o,x as r,c as s,C as t};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{J as e}from"./ui-CFB4wQfF.js";var t=e=>String(e??``).normalize(`NFD`).replace(/\p{M}/gu,``).toLowerCase(),n=e=>`${e.providerID}/${e.modelID}`,r=class{models;constructor(e=[]){this.models=Array.isArray(e)?e.filter(e=>e&&typeof e.providerID==`string`&&typeof e.modelID==`string`):[]}groups(e=``){let n=t(e.trim()),r=new Map,i=this.models.some(e=>e.enabled!==!1);for(let e of this.models){if(i&&e.enabled===!1||n&&!t([e.name,e.modelID,e.providerID].join(` `)).includes(n))continue;let a=r.get(e.providerID)??[];a.push({...e,variants:[...e.variants??[]]}),r.set(e.providerID,a)}return[...r].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({providerID:e,items:t.sort((e,t)=>(e.name||e.modelID).localeCompare(t.name||t.modelID))}))}selection(e){if(!e)return;let t=this.models.find(t=>t.providerID===e.providerID&&t.modelID===e.modelID);return t?{...t,variants:[...t.variants??[]],stale:t.enabled===!1}:{...e,name:n(e),variants:e.variant?[e.variant]:[],stale:!0}}},i=e=>`${e}:reasoning`,a=(e,t)=>t===void 0?`${e}:text`:`${e}:text:${t}`,o=e=>`hubmsg:${e}`,s=1e3,c=(e,t)=>`activity:${e}:${t}`,l=(e,t)=>e.pos-t.pos||e.live-t.live,u=class{items=new Map;subagents=new Map;details=new Map;places=new Map;top=0;bottom=0;liveSeq=0;seenSeq=0;loaded=!1;snapshots=0;history=new Set;load(e,t={}){let n=(e??[]).filter(e=>e&&typeof e.key==`string`),r=n.filter(e=>typeof e.pos!=`number`&&!this.places.has(e.key));r.forEach((e,n)=>{this.places.set(e.key,{pos:t.older?this.bottom-r.length+n:this.top+1+n,live:0})});for(let e of n){typeof e.pos==`number`&&Number.isFinite(e.pos)&&this.places.set(e.key,{pos:e.pos,live:0});let t=this.places.get(e.key).pos;this.top=Math.max(this.top,t),this.bottom=Math.min(this.bottom,t),this.history.add(e.key)}for(let e of n){let t=this.liveTwin(e);t?(this.items.delete(t.key),this.places.delete(t.key),t.kind===`reasoning`?this.put({...e,text:e.text||t.text||``}):t.kind===`tool`?this.put({...d(t,[`summary`,`error`]),...e}):this.put(e)):this.put(e)}if(!t.older){this.loaded=!0;for(let[e,t]of this.places)t.live>0&&t.pos<this.top&&this.places.set(e,{...t,pos:this.top});for(let e of this.subagents.values())e.place&&e.place.pos<this.top&&(e.place={...e.place,pos:this.top})}}liveTwin(e){if(this.history.has(e.key)&&this.items.has(e.key))return;let t=typeof e.messageID==`string`?e.messageID:void 0,n=[];e.kind===`reasoning`&&t&&n.push(i(t)),e.kind===`assistant`&&t&&(typeof e.ordinal==`number`&&n.push(a(t,e.ordinal)),(e.ordinal===void 0||e.ordinal===0)&&n.push(a(t))),e.kind===`tool`&&typeof e.callID==`string`&&typeof e.sessionID==`string`&&n.push(c(e.sessionID,e.callID)),e.kind===`message`&&t&&n.push(o(t));for(let t of n){let n=t===e.key?void 0:this.items.get(t);if(n&&!this.history.has(t))return n}if(e.kind===`user`&&typeof e.text==`string`&&e.text){for(let t of this.items.values())if(t.kind===`user`&&!t.messageID&&!this.history.has(t.key)&&t.text===e.text)return t}}appendReasoning({sessionID:e,messageID:t,delta:n,at:r=Date.now()}){let a;for(let e of this.items.values())e.kind===`reasoning`&&e.messageID===t&&e.state===`running`&&(a=e);a??=this.items.get(i(t));let o=a?.key??i(t);this.upsert({key:o,kind:`reasoning`,messageID:t,...e?{sessionID:e}:{},text:`${a?.text??``}${n}`,state:`running`,at:a?.at??r})}appendText({sessionID:e,messageID:t,ordinal:n,delta:r,at:i=Date.now()}){let o=a(t,n),s=this.items.get(o);this.upsert({key:o,messageID:t,...e?{sessionID:e}:{},kind:`assistant`,text:`${s?.text??``}${r}`,live:!0,at:s?.at??i}),this.endReasoning(e)}liveTextKey(e){let t=a(e),n=-1;for(let r of this.items.values()){if(r.kind!==`assistant`||r.messageID!==e||this.history.has(r.key))continue;let i=r.key.startsWith(`${e}:text:`)?Number(r.key.slice(e.length+6)):NaN;Number.isInteger(i)&&i>n&&([t,n]=[r.key,i])}return t}activity(e,t){if(!t||typeof t.id!=`string`||t.kind===`thinking`)return;let n=c(e,t.id),r=this.items.get(n);this.upsert({key:n,sessionID:e,kind:`tool`,callID:t.id,...t.tool?{name:t.tool}:{},...t.summary?{summary:t.summary}:{},...t.error?{error:t.error}:{},...t.childSessionID?{childSessionID:t.childSessionID}:{},state:t.state,at:r?.at??t.at})}endReasoning(e,t=Date.now()){for(let n of this.items.values())n.kind===`reasoning`&&n.state===`running`&&(e===void 0||n.sessionID===e)&&this.upsert({key:n.key,kind:n.kind,state:`done`,completed:t})}upsert(e){e&&typeof e.key==`string`&&(this.places.has(e.key)||this.places.set(e.key,this.livePlace()),this.put(e))}livePlace(){return{pos:this.top,live:++this.liveSeq}}put(e){this.items.set(e.key,{...this.items.get(e.key)??{},...e})}hubMessage(e){if(e&&typeof e.key==`string`&&typeof e.messageID==`string`){for(let[t,n]of this.items)if(t!==e.key&&n.kind===`message`&&n.messageID===e.messageID&&this.history.has(t))return;if(!this.places.has(e.key)){if(typeof e.at==`number`&&Number.isFinite(e.at)){let t=e.at*s;this.places.set(e.key,{pos:t,live:0}),this.top=Math.max(this.top,t)}else this.places.set(e.key,this.livePlace())}this.put(e)}}fromHistory(e){return this.history.has(e)}forgetHistory(){for(let e of this.history)this.items.delete(e),this.places.delete(e);this.history.clear()}clear(){this.items.clear(),this.places.clear(),this.details.clear(),this.history.clear(),this.top=0,this.bottom=0,this.loaded=!1}get(e){return this.items.get(e)}status(e,t){let n=new Set,r=new Set([t]);for(let t=!0;t;){t=!1;for(let n of e??[])typeof n?.id==`string`&&typeof n.parentID==`string`&&r.has(n.parentID)&&!r.has(n.id)&&(r.add(n.id),t=!0)}let i=(e??[]).every(e=>e?.id===t||typeof e?.parentID!=`string`),a=this.snapshots>0&&this.loaded;e?.length&&this.snapshots++;for(let o of e??[]){let s=o?.id;if(!o||typeof s!=`string`||!s||s===t||!r.has(s)&&!(i&&(e??[])[0]?.id===t))continue;n.add(s);let c=typeof o.since==`number`?o.since:void 0,l=o.state===`idle`?`done`:o.state,u=this.subagents.get(s)??{id:s,seen:++this.seenSeq,...a&&l===`working`?{place:this.livePlace()}:{}};this.subagents.set(s,{...u,title:typeof o.title==`string`?o.title:void 0,state:l,since:c})}for(let e of this.subagents.values())!n.has(e.id)&&e.state===`working`&&(e.state=`done`)}detail(e,t){this.details.set(e,t)}rows(){let e=[],t=new Map;for(let n of this.items.values()){let r={...n,depth:0,...this.details.has(n.key)?{detail:this.details.get(n.key)}:{}};if(n.sessionID&&this.subagents.has(n.sessionID)){let e=t.get(n.sessionID)??[];e.push({...r,depth:1}),t.set(n.sessionID,e)}else e.push(r)}let n=e=>this.places.get(e)??{pos:this.top,live:2**53-1},r=(e,t)=>l(n(e.key),n(t.key)),i=e=>[{key:`sub:${e.id}`,kind:`subagent`,label:e.title||e.id,state:e.state,sessionID:e.id,depth:0},...(t.get(e.id)??[]).sort(r)],a=[],o=new Set;for(let t of e.sort(r)){let e=typeof t.childSessionID==`string`&&!o.has(t.childSessionID)?this.subagents.get(t.childSessionID):void 0;e&&o.add(e.id),a.push({place:n(t.key),rows:e?i(e):[t]})}let s=[...this.subagents.values()].filter(e=>!o.has(e.id));s.filter(e=>!e.place).sort((e,t)=>(e.since??1/0)-(t.since??1/0)||e.seen-t.seen).forEach((e,t)=>a.push({place:{pos:-1/0,live:t},rows:i(e)}));for(let e of s)e.place&&a.push({place:e.place,rows:i(e)});return a.sort((e,t)=>l(e.place,t.place)).flatMap(e=>e.rows)}};function d(e,t){return Object.fromEntries(t.filter(t=>e[t]!==void 0).map(t=>[t,e[t]]))}function f(e){let t=e&&typeof e==`object`?e:{},n=e=>typeof e==`string`&&e?e:void 0;return t.kind===`session`?n(t.name)?`@${t.name}`:String(t.sessionID??`?`):t.kind===`user`?`@me`:t.kind===`app`?`app ${n(t.label)??String(t.tokenID??`?`)}`:`?`}function ee(e,t){let n=t&&typeof t==`object`?t:void 0;if(!n||typeof n.id!=`string`||!n.id||typeof n.kind!=`string`||typeof n.to!=`string`)return;let r=t=>t?.kind===`session`&&t.sessionID===e,i=r(n.from)?`out`:r(n.recipient)?`in`:void 0;if(i)return{key:o(n.id),kind:`message`,messageID:n.id,sessionID:e,text:typeof n.text==`string`?n.text:``,...typeof n.at==`number`?{at:n.at}:{},direction:i,message:{kind:n.kind,from:f(n.from),to:n.to,...typeof n.replyTo==`string`?{replyTo:n.replyTo}:{}},recipient:f(n.recipient),...typeof n.state==`string`?{state:n.state}:{},...typeof n.delivery==`string`?{delivery:n.delivery}:{}}}var te=new Set([`open`,`answered`,`expired`,`closed`]),p=e=>!!e&&typeof e==`object`&&!Array.isArray(e);function ne(e){if(!p(e))return;let{id:t,question:n,options:r,state:i,about:a,at:o,from:s}=e;if(typeof t!=`string`||!t.startsWith(`dec_`)||typeof n!=`string`||!Array.isArray(r)||!Array.isArray(a)||typeof i!=`string`||!te.has(i)||typeof o!=`number`||!p(s))return;let c=r.filter(e=>p(e)&&typeof e.id==`string`&&typeof e.label==`string`),{as:l,...u}=e;return{...u,...l===`concierge`?{as:`concierge`}:{},options:c,about:a.filter(e=>typeof e==`string`)}}var re=(e,t)=>t.at-e.at||(e.id<t.id?1:-1);function m(e){return e.filter(e=>e.state===`open`).sort(re)}function h(e,t){return m([...e.filter(e=>e.id!==t.id),t])}function ie(e,t){return e.filter(e=>e.from.kind===`session`&&e.from.sessionID===t||e.about.includes(t))}var ae=new Set,g=(e,t=ae)=>e.as===`concierge`||e.from.kind===`session`&&t.has(e.from.sessionID)?`@@concierge`:f(e.from);function _(e){let t=e.answer;if(t?.answeredBy!==`app`)return;let n=t.appLabel?.trim()||t.app;return n?`the app “${n}”`:`an app`}var oe=60;function se(e,t){let n=_(t);if(!n||t.state!==`answered`||!e.some(e=>e.id===t.id&&e.state===`open`))return;let r=t.question.length>oe?`${t.question.slice(0,59)}…`:t.question,i=t.options.find(e=>e.id===t.answer?.option)?.label??t.answer?.option;return`“${r}” was answered by ${n}${i?` (${i})`:``}`}var ce=e=>e.tier===`tap`?`Answer here (tap): only a signed-in console can answer this one.`:``;function le(e,t){let n=e-t;if(n<0)return``;let r=Math.floor(n/1e3),i=Math.floor(r/86400),a=Math.floor(r%86400/3600),o=Math.floor(r%3600/60);return i?`${i}d ${a}h`:a?`${a}h ${o}m`:o?`${o}m ${r%60}s`:`${r}s`}function ue(e,t){if(e.deadline===void 0)return``;let n=le(e.deadline,t);if(!n)return`Past its deadline`;let r=e.onTimeout?e.options.find(t=>t.id===e.onTimeout)?.label:void 0;return`Deadline in ${n}${r?` · then ${r}`:``}`}function de(e,t,n){let r=n.trim();return e.options.length?t===void 0||!e.options.some(e=>e.id===t)?{ok:!1,problem:`Pick one of the options`}:{ok:!0,body:{option:t,...r?{text:r}:{}}}:r?{ok:!0,body:{text:r}}:{ok:!1,problem:`Type an answer`}}var fe=class{seq=0;settled=0;pending=new Map;begin(e=Date.now()){let t=++this.seq;return this.pending.set(t,{at:e,events:[]}),t}event(e,t=Date.now()){for(let[n,r]of this.pending)t-r.at>3e4?this.pending.delete(n):r.events.push(e)}settle(e,t){let n=this.pending.get(e)?.events;if(this.pending.delete(e),!(!n||e<this.settled))return this.settled=e,n.reduce((e,t)=>h(e,t),m(t))}fail(e){this.pending.delete(e)}},pe=`@@concierge`,v=/\nThe Concierge's note: ([\s\S]*)$/,me=/proposes to deny ([\s\S]*) in (?:@[\w-]+|ses_\w+)\.(?:\nThe Concierge's note: [\s\S]*)?$/,he=/^[\s\S]*? asks to approve( always(?: \(saves [\s\S]*?\))?)? ([\s\S]*)\. Outside its grant: ([\s\S]*)$/,ge=`a permission request (details unknown)`,y=e=>typeof e==`string`&&e?e:void 0;function b(e){let t=Array.isArray(e.resources)?e.resources.filter(e=>typeof e==`string`):void 0,n=y(e.action);if(n&&t)return e.summary===`${n}: ${t.join(`, `)}`||!e.summary.startsWith(`${n}: `)?{action:n,resources:t}:{action:n,resources:[e.summary.slice(n.length+2)]};let r=e.summary.indexOf(`: `);return r<0?{action:n??y(e.summary),resources:t??[]}:{action:n??e.summary.slice(0,r),resources:t??[e.summary.slice(r+2)]}}function _e(e){let t=e.indexOf(`: `);return t<0?{action:e,resources:[]}:{action:e.slice(0,t),resources:[e.slice(t+2)]}}function ve(e,t,n){if(e)return{...b(e),...t?.save?.length?{saves:[...t.save]}:{},source:`live`};if(t&&typeof t.action==`string`){let e=[...t.resources??[]],n=t.save?.length?[...t.save]:void 0,r=(e,t)=>typeof e==`number`&&e>t?e-t:void 0,i=r(t.resourcesTotal,e.length),a=r(t.savesTotal,n?.length??0),o=Array.isArray(t.cut)?t.cut.filter(e=>(e.field===`resources`||e.field===`save`)&&Number.isInteger(e.index)&&typeof e.length==`number`):[];return{action:t.action,resources:e,...n?{saves:n}:{},source:`request`,...i?{resourcesMore:i}:{},...a?{savesMore:a}:{},...o.length?{cut:o}:{},...t.truncated===!0?{incomplete:!0}:{}}}let r=n();return r?{...r,source:`text`}:void 0}var x=e=>e?{...e.action?{action:e.action}:{},resources:e.resources,...e.saves?{saves:e.saves}:{},source:e.source,...e.resourcesMore?{resourcesMore:e.resourcesMore}:{},...e.savesMore?{savesMore:e.savesMore}:{},...e.cut?{cut:e.cut}:{},...e.incomplete?{incomplete:e.incomplete}:{}}:{resources:[]};function S(e,t,n,r){if(r)for(let i of new Set(t.filter(e=>!!e))){let t=e.blockers(i).find(e=>e.kind===n&&e.id===r);if(t)return t}}var C=(e,t)=>({id:t,label:e.label(t)??t}),ye=e=>Array.isArray(e)?e.map(String).join(`, `):typeof e==`object`&&e?JSON.stringify(e):String(e);function be(e,t){let n=e.action;if(n?.kind===`permission`){let r=g(e),i=e.from.kind===`session`&&r===e.from.sessionID?t.label(e.from.sessionID)??r:r,a=he.exec(e.question),o=n.sessionID??n.rootID??e.about[0],s=ve(S(t,[n.sessionID,n.rootID,...e.about],`permission`,n.requestID),n.request,()=>a&&a[2]!==ge?_e(a[2]):void 0),c=y(n.reason)??a?.[3]?.trim(),l=e.recommendation?.why;return{kind:`permission`,requester:i,...o?{target:C(t,o)}:{},...x(s),always:n.always===!0||!!a?.[1],...n.requestID?{requestID:n.requestID}:{},...c?{outsideGrant:c}:{},...l?{purpose:{by:i,text:l}}:{}}}if(n?.kind===`act`&&n.target){let r=n.input??{},i=e.recommendation?.why??v.exec(e.question)?.[1]?.trim(),a={kind:`proposal`,verb:n.verb??`act`,target:C(t,n.target),always:!1,...i?{purpose:{by:pe,text:i}}:{}};switch(n.verb){case`deny`:{let i=y(r.requestID),o=S(t,[n.target],`permission`,i),s=me.exec(e.question)?.[1],c=ve(o,n.request,()=>s&&s!==`permission request ${i}`?_e(s):void 0);return{...a,...x(c),...i?{requestID:i}:{}}}case`prompt`:return{...a,resources:[],...y(r.text)?{text:y(r.text)}:{}};case`answer`:{let e=y(r.formID),i=S(t,[n.target],`form`,e),o=r.answer&&typeof r.answer==`object`&&!Array.isArray(r.answer)?Object.entries(r.answer).map(([e,t])=>({key:e,value:ye(t)})):void 0;return{...a,resources:[],...e?{formID:e}:{},...i?{form:i.summary}:{},...r.cancel===!0?{cancel:!0}:o?{answer:o}:{},...i?{source:`live`}:{}}}default:return{...a,resources:[]}}}if(n)return;let r=[...new Set(e.about)].flatMap(e=>t.blockers(e).filter(e=>e.kind===`permission`).map(t=>({s:e,b:t})));if(r.length!==1)return;let{s:i,b:a}=r[0],o=b(a);return{kind:`ask`,target:C(t,i),...o.action?{action:o.action}:{},resources:o.resources,always:!1,requestID:a.id,source:`live`}}function xe(e){if(e.action?.kind!==`act`)return e.question;let t=e.question.replace(v,``);return e.action.verb===`prompt`||e.action.verb===`answer`?t.split(`
|
|
2
|
+
`)[0]:t}var w=typeof Intl<`u`&&`Segmenter`in Intl?new Intl.Segmenter(void 0,{granularity:`grapheme`}):void 0;function Se(e){return w?Array.from(w.segment(e),e=>e.segment):Array.from(e)}function Ce(e,{chars:t=400,lines:n=8}={}){let r=e,i=!1,a=r.split(`
|
|
3
|
+
`);a.length>n&&(r=a.slice(0,n).join(`
|
|
4
|
+
`),i=!0);let o=Se(r);return o.length>t&&(r=o.slice(0,t).join(``),i=!0),{text:i?`${r}…`:r,cut:i}}var we=RegExp(`(\\u{1F3F4}[\\u{E0030}-\\u{E0039}\\u{E0061}-\\u{E007A}]{1,30}\\u{E007F})|[\\u0000-\\u0008\\u000B-\\u001F\\u007F-\\u009F\\u00AD\\u034F\\u061C\\u115F\\u1160\\u180E\\u200B\\u200C\\u200E\\u200F\\u2028-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\u3164\\uFEFF\\uFFA0\\uFFF9-\\uFFFB\\u{E0000}-\\u{E007F}]`,`gu`);function Te(e){return e.replace(we,(e,t)=>t||`⟨U+${e.codePointAt(0).toString(16).toUpperCase().padStart(4,`0`)}⟩`)}var Ee=/(?<![\w/.-])ses_[A-Za-z0-9]{1,64}(?![\w])/g,De=10,T=e=>e.length>12?`${e.slice(0,De)}…`:e,Oe=e=>e.replace(/[/\\]+$/,``).split(/[/\\]/).pop()||``;function ke(e,t,n=!1){if(n)return`the Concierge`;let r=t?.name?.trim().replace(/^@+/,``);if(r)return`@${r}`;let i=t?.title?.trim();if(i)return i;let a=t?.directory?Oe(t.directory):``;return a?`${a} · ${T(e)}`:T(e)}function E(e,t){return e.replace(Ee,e=>t(e))}function Ae(e,t){let n=e&&typeof e==`object`?e:{},r=e=>typeof e==`string`&&e?e:void 0;return n.kind===`session`?r(n.name)?`@${String(n.name).replace(/^@+/,``)}`:typeof n.sessionID==`string`?t(n.sessionID):`?`:n.kind===`user`?`@me`:n.kind===`app`?`app ${r(n.label)??String(n.tokenID??`?`)}`:`?`}function je(e,t,n=new Set){return g(e,n)===`@@concierge`?`@@concierge`:Ae(e.from,t)}var Me=e=>e.from.kind===`session`?e.from.sessionID:e.from.kind===`app`?e.from.tokenID:void 0;function Ne(e,t,n=new Set){let r=e.action;return r?.kind===`permission`&&r.request&&typeof r.request.action==`string`?`${je(e,t,n)} asks to approve ${r.request.action}${r.always?` always`:``}`:E(xe(e),t)}var Pe=[`approve`,`deny`,`answer`,`prompt`,`stop`,`roles`,`launch`],Fe=new Set([`active`,`expired`,`revoked`]),D=e=>!!e&&typeof e==`object`&&!Array.isArray(e),O=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`),k=[`sessions:read`,`sessions:manage`,`messages:send`,`messages:read`,`sessions:act`,`sessions:launch`,`events:subscribe`,`profiles:read`,`profiles:manage`,`profiles:assign`,`workspaces:read`,`workspaces:manage`,`artifacts:read`,`artifacts:write`,`artifacts:ai`,`teams:read`,`teams:manage`,`teams:submit`,`speech:use`,`conversation:read`,`conversation:write`,`decisions:answer`];function Ie(e){if(D(e)&&typeof e.id==`string`&&/^[0-9a-f]{16}$/.test(e.id)&&O(e.scopes))return{id:e.id,...typeof e.label==`string`?{label:e.label}:{},scopes:e.scopes.filter(e=>k.includes(e)),...typeof e.created==`number`?{created:e.created}:{}}}function Le(e){return(D(e)&&Array.isArray(e.tokens)?e.tokens:[]).map(Ie).filter(e=>!!e)}function Re(e,t){let n=e.trim();if(!n)return{ok:!1,error:`Give the token a label`};if(!t.length)return{ok:!1,error:`Pick at least one scope`};let r=t.find(e=>!k.includes(e));return r?{ok:!1,error:`Unknown scope: ${r}`}:{ok:!0,body:{label:n,scopes:[...new Set(t)]}}}var ze={"sessions:read":`Read your sessions and their activity`,"sessions:manage":`Name sessions and claim roles`,"messages:send":`Send messages and asks, reply and decline`,"messages:read":`Read messages to it`,"sessions:act":`Approve, deny, answer, prompt and stop sessions (only under a grant)`,"sessions:launch":`Launch sessions (only under a grant with verb launch for the repo)`,"events:subscribe":`Subscribe webhooks to events`,"profiles:read":`Read your shared agent profiles (instructions, skills, commands)`,"profiles:manage":`Create, revise and archive your agent profiles`,"profiles:assign":`Pin agent profiles to sessions (also needs a prompt grant on the session)`,"workspaces:read":`Read your workspaces, their members, supervision and boards`,"workspaces:manage":`Create, edit and archive workspaces; add members, supervise, start side chats`,"artifacts:read":`Read your artifacts and their revisions (including workspace-shared ones)`,"artifacts:write":`Create and revise artifacts, and accept AI edits the app requested`,"artifacts:ai":`Ask AI about artifacts and request edits or actions (run by sessions it may already use)`,"teams:read":`Read your teams, their roles, roster and intake`,"teams:manage":`Create, edit, publish, staff, pause and archive teams`,"teams:submit":`Submit work to a team's intake`,"speech:use":`Transcribe and speak with your speech provider and key (rate-limited; never your speech settings or keys)`,"conversation:read":`Follow the conversation of sessions it launched or holds a prompt grant for: replies as they stream, spoken sentences, status`,"conversation:write":`Talk with sessions it holds a prompt grant for: conversation mode, voice and typed turns (only under a prompt grant)`,"decisions:answer":`Answer the everyday (confirm-tier) Decisions of sessions it launched or holds an answer grant for; never taps, permissions, grant requests or “always”`},Be=e=>k.includes(e);function Ve(e){let t=D(e)?e.login:void 0;if(D(t)&&typeof t.userCode==`string`&&typeof t.clientName==`string`&&O(t.scopes)&&typeof t.created==`number`&&typeof t.expiresAt==`number`)return{userCode:t.userCode,clientName:t.clientName,scopes:t.scopes.filter(Be),created:t.created,expiresAt:t.expiresAt}}function He(e){return k.map(t=>{let n=e.scopes.includes(t);return{scope:t,label:ze[t],requested:n,checked:n}})}function Ue(e){if(!e.length)return{ok:!1,error:`Pick at least one scope`};let t=e.find(e=>!Be(e));return t?{ok:!1,error:`Unknown scope: ${t}`}:{ok:!0,body:{scopes:[...new Set(e)]}}}function We(e){if(!D(e))return;let{id:t,holder:n,scope:r,allow:i,permissions:a,allowAlways:o,maxActionsPerHour:s,created:c,expiresAt:l,state:u}=e;if(typeof t==`string`&&typeof n==`string`&&typeof u==`string`&&Fe.has(u)&&D(r)&&O(r.projects)&&O(i)&&D(a)&&O(a.allow)&&O(a.never)&&typeof o==`boolean`&&typeof s==`number`&&typeof c==`number`&&typeof l==`number`)return e}function Ge(e){return(D(e)&&Array.isArray(e.grants)?e.grants:[]).map(We).filter(e=>!!e)}function Ke(e,t){return e.state===`revoked`||e.revokedAt!==void 0?`revoked`:e.state===`expired`||t>=e.expiresAt?`expired`:`active`}var qe={active:`Active`,expired:`Expired`,revoked:`Revoked`};function A(e,t){if(e<=t)return``;let n=Math.ceil((e-t)/6e4),r=Math.floor(n/1440),i=Math.floor(n%1440/60),a=n%60;return r>=2?`${Math.round(n/1440)} d`:r===1?i?`1 d ${i} h`:`1 d`:i?a?`${i} h ${a} min`:`${i} h`:`${a} min`}function Je(e,t){let n=Ke(e,t);return{id:e.id,holder:e.holderSessionID?`${e.holder} (${e.holderSessionID})`:e.holder,state:n,stateLabel:qe[n],projects:e.scope.projects.join(`, `),verbs:e.allow.join(`, `),permit:e.permissions.allow.join(`, `),never:e.permissions.never.join(`, `),limits:[e.allowAlways?`may allow always`:``,`${e.maxActionsPerHour} actions an hour`].filter(Boolean).join(` · `),expiry:n===`active`?`Expires in ${A(e.expiresAt,t)}`:qe[n],editable:n===`active`}}function Ye(e){return{holder:e?.holder??``,projects:e?e.scope.projects.join(`
|
|
5
|
+
`):``,allow:e?[...e.allow]:[],permit:e?e.permissions.allow.join(`
|
|
6
|
+
`):``,never:e?e.permissions.never.join(`
|
|
7
|
+
`):``,expires:`8h`,maxActionsPerHour:String(e?.maxActionsPerHour??60),allowAlways:e?.allowAlways??!1}}var j=e=>e.split(`
|
|
8
|
+
`).map(e=>e.trim()).filter(Boolean),Xe=/^\d+(s|m|h|d)?$/,Ze=e=>/^([A-Za-z]:)?[\\/]/.test(e);function Qe(e){let t={},n=e.holder.trim();n||(t.holder=`Who holds it: @@orchestrator, @name, ses_… or app:<token id>`);let r=j(e.projects),i=r.find(e=>!Ze(e));r.length?i!==void 0&&(t.projects=`${i} is not an absolute directory`):t.projects=`At least one project directory`;let a=Pe.filter(t=>e.allow.includes(t));a.length||(t.allow=`Pick at least one action`);let o=e.expires.trim();Xe.test(o)||(t.expires=`A duration: seconds, or 30m, 8h, 2d`);let s=e.maxActionsPerHour.trim(),c=/^\d+$/.test(s)?Number(s):NaN;return c>=1&&c<=1e3||(t.maxActionsPerHour=`A whole number from 1 to 1000`),Object.keys(t).length?{ok:!1,errors:t}:{ok:!0,body:{holder:n,scope:{projects:r},allow:a,permissions:{allow:j(e.permit),never:j(e.never)},expires:o,maxActionsPerHour:c,allowAlways:e.allowAlways}}}function $e(e){if(/^permissions\.never/.test(e))return`never`;if(/^permissions/.test(e))return`permit`;if(/^scope/.test(e))return`projects`;if(/^allow\b/.test(e))return`allow`;if(/^expires/.test(e))return`expires`;if(/^maxActionsPerHour/.test(e))return`maxActionsPerHour`;if(/^allowAlways/.test(e))return`allowAlways`;if(/holder|^No app token|^No session|^No such session/i.test(e))return`holder`}function M(e){if(!D(e))return;let{seq:t,at:n,actor:r,verb:i,target:a,decision:o,outcome:s}=e;if(typeof t==`number`&&typeof n==`number`&&D(r)&&typeof r.kind==`string`&&typeof i==`string`&&D(a)&&typeof o==`string`&&typeof s==`string`)return e}function et(e){if(!D(e))return{entries:[]};let t=(Array.isArray(e.entries)?e.entries:[]).map(M).filter(e=>!!e);return typeof e.next==`number`?{entries:t,next:e.next}:{entries:t}}var tt={allow:`allowed`,needs_user:`needs you`,forbidden:`refused`,paused:`paused`,rate_limited:`rate limited`,busy:`hub busy`},nt={ok:`done`,failed:`failed`,gone:`already answered`,offline:`offline`,unsupported:`unsupported`,escalated:`sent to you`,refused:`refused`},rt=new Set([`forbidden`,`paused`,`rate_limited`,`busy`]),it=new Set([`failed`,`refused`,`offline`,`unsupported`]),N={"acting.pause":`turned agent actions off`,"acting.resume":`turned agent actions on`},at={approve:[`approved`,`approved $`],deny:[`denied`,`denied $`],answer:[`answered`,`answered $`],prompt:[`prompted a session`,`prompted $`],stop:[`stopped a session`,`stopped $`],propose:[`proposed an action`,`proposed an action for $`],msg:[`sent a message`,`messaged $`],roles:[`claimed a role`,`claimed a role for $`],"roles.release":[`released a role`,`released a role of $`],launch:[`launched a session`,`launched $`],"launch.stop":[`stopped a launch`,`stopped the launch of $`],"team.staff":[`staffed a team role`,`staffed a team role with $`],"team.unstaff":[`unstaffed a team role`,`unstaffed $ from a team role`],"team.denied":[`sent a message the team's rules refused`,`sent $ a message the team's rules refused`],"grant.request":[`asked for a grant`,`asked for a grant for $`],"grant.approve":[`approved a grant request`,`approved a grant request from $`],"grant.deny":[`denied a grant request`,`denied a grant request from $`],"decision.answer":[`answered a Decision`,`answered a Decision of $`]},ot={deny:[`proposed denying`,`proposed denying a request in`],answer:[`proposed answering`,`proposed answering a form in`],prompt:[`proposed prompting`,`proposed a prompt to`],stop:[`proposed stopping`,`proposed stopping`]},st=/^Decision dec_[A-Za-z0-9]{1,64}: (\w+)$/;function ct(e,t,n){let r=ot[st.exec(e??``)?.[1]??``],i=n?` in ${n}`:``;return t?`${r?r[0]:`proposed an action on`} ${t}${i}`:n?`${r?r[1]:`proposed an action for`} ${n}`:`proposed an action`}function lt(e,t,n,r){if(e===`propose`)return ct(r,t,n);let i=at[e];return i?t?`${i[0]} ${t}${n?` in ${n}`:``}`:n?i[1].replace(`$`,n):i[0]:[e.replace(/[._]+/g,` `).trim()||e,t,t&&n?`in ${n}`:n].filter(Boolean).join(` `)}var P=(e,t)=>e.as===`concierge`?`@@concierge`:e.actor.kind===`user`?`you`:t?Ae(e.actor,e=>t(e)??T(e)):f(e.actor);function ut(e,t){if(e.outcome!==`escalated`)return;let n=/\bDecision (dec_[A-Za-z0-9]{1,64})\b/.exec(e.reason??``)?.[1];for(let r of t)if(n?r.id===n:e.target.requestID&&r.action?.requestID===e.target.requestID)return r}function dt(e){if(e.state!==`answered`)return e.state;let t=e.answer?.option,n=e.options.find(e=>e.id===t)?.label??t,r=_(e);return`${n?`answered “${n}”`:`answered`}${r?` by ${r}`:``}`}var ft=`Shell, outside folders and tools always need the user's tap`,pt=`The Concierge never answers “always”: the user decides`,mt={approve:`Approved`,deny:`Denied`,answer:`Answered`,prompt:`Prompted`,stop:`Stopped`},F=e=>e.replace(/\binGrant\s*=\s*yes\b/gi,`inside your grant`).replace(/\binGrant\s*=\s*no\b/gi,`outside your grant`).replace(/\bauto\s*=\s*yes\b/gi,`approvable without you`).replace(/\bauto\s*=\s*no\b/gi,`needs your tap`).replace(/\bdec_[A-Za-z0-9]{1,64}\b/g,`a Decision`),ht=/[\u061c\u200b-\u200f\u2028-\u202e\u2060-\u206f\ufeff\u{E0000}-\u{E007F}]/gu,gt=300;function _t(e){let t=F(e).replace(ht,``).replace(/«/g,`‹`).replace(/»/g,`›`).replace(/[\u0000-\u001f\u007f-\u009f]/g,` `).replace(/\s+/g,` `).trim(),n=Array.from(t);return`«${n.length>gt?`${n.slice(0,299).join(``)}…`:t}»`}function vt(e){let t=e.reason??``;if(e.decision===`busy`)return`Refused: the hub was busy (its state did not answer in time); try again`;if(e.reason===`concierge inbound rule`)return`Refused: only you can message the Concierge`;if(e.actor.kind===`user`&&/^Decision dec_[A-Za-z0-9]{1,64} proposed by @@concierge$/.test(t))return`You said yes to the Concierge's proposal`;if(e.as!==`concierge`)return t;if(t===`concierge outbound rule`)return`Refused: the Concierge may message only you`;if(e.verb===`propose`)return`The Concierge proposed this for your answer`;if(t===ft)return`Needed your tap: shell commands, outside folders and tools always do`;if(t===pt)return`Needed your tap: the Concierge never answers “always”`;if(e.decision===`needs_user`)return t?`Needed you: ${F(t).replace(/ outside the grant\b/,` outside the Concierge's grant`)}`:`Needed you`;let n=mt[e.verb];return n&&e.decision===`allow`&&e.outcome===`ok`?`${n} by the Concierge inside your grant${t?`. Its note: ${_t(t)}`:``}`:F(t)}function yt(e,t,n){let r=e.target.requestID??e.target.formID,i=e.target.requestID?`a permission request`:e.target.formID?`a form`:void 0,a=e.target.sessionID,o=a?n?.(a)??T(a):``,s=N[e.verb]??lt(e.verb,i,o,e.reason),c=N[e.verb]?void 0:[r,r&&a?`in ${a}`:a].filter(Boolean).join(` `)||void 0,l=tt[e.decision]??e.decision,u=nt[e.outcome]??e.outcome,d=e.decision===`allow`&&e.outcome===`ok`,f=t&&t.state!==`open`?`${u} · ${dt(t)}`:void 0;return{seq:e.seq,at:e.at,who:P(e,n??(()=>void 0)),what:s,...c?{whatTitle:c}:{},result:d?`done`:f??(l===u?l:`${l} · ${u}`),tone:d||t?.state===`answered`?`ok`:rt.has(e.decision)||it.has(e.outcome)?`err`:`warn`,grant:e.grant?`grant`:``,...e.grant?{grantTitle:e.grant}:{},reason:vt(e)}}var bt={approve:`Approved`,deny:`Denied`,answer:`Answered`},xt=3,I=3,St=e=>e.replace(/[\\/]+$/,``).split(/[\\/]/).pop()||e;function Ct(e,t,n){let r=n?.(e);if(t.as===`concierge`||r?.holder===`@@concierge`)return`the Concierge's grant`;let i=r?.scope.projects.map(St)??[];if(!i.length)return`your grant`;let a=i.slice(0,I).join(`, `);return`your grant for ${i.length>I?`${a} and ${i.length-I} more`:a}`}function L(e,t,n){let r=bt[e.verb];if(!r||e.decision!==`allow`||e.outcome!==`ok`)return;let i=`${r} by ${P(e,t)}`;return e.grant?{text:`${i} · ${Ct(e.grant,e,n)}`,title:e.grant}:{text:i}}function R(e,t,n){return L(e,t,n)?.text}function wt(e,t){return[t,...e.filter(e=>e.seq!==t.seq)].sort((e,t)=>t.seq-e.seq).slice(0,100)}function Tt(e,t,n,r){for(let i of e){if(i.target.requestID!==t&&i.target.formID!==t)continue;let e=L(i,n,r);if(e)return e}}function Et(e,t,n,r,i,a,o){let s=[];for(let c of[...e].sort((e,t)=>t.at-e.at||t.seq-e.seq)){if(s.length>=xt)break;if(!c.target.sessionID||!t.has(c.target.sessionID)||n-c.at>6e5||r!==void 0&&c.at<r)continue;let e=L(c,a,o),l=c.target.requestID??c.target.formID??`seq-${c.seq}`;e&&!i?.has(l)&&!s.some(e=>e.key===l)&&s.push({key:l,...e,at:c.at})}return s}function Dt(e,t,n,r=6e4,i){for(let a of[...e].sort((e,t)=>t.at-e.at||t.seq-e.seq)){if(n-a.at>r)break;if(a.verb!==`deny`||!a.target.sessionID||!t.has(a.target.sessionID))continue;let e=R(a,void 0,i);if(e)return{key:a.target.requestID??a.target.formID??`seq-${a.seq}`,text:e}}}function Ot(e,t,n,r){let{since:i,until:a}=n,o;for(let n of e){if(n.verb!==`deny`||n.target.sessionID!==t||i!==void 0&&n.at<i||a!==void 0&&n.at>=a)continue;let e=R(n,void 0,r);e&&(!o||(i===void 0?n.at>o.e.at||n.at===o.e.at&&n.seq>o.e.seq:n.at<o.e.at||n.at===o.e.at&&n.seq<o.e.seq))&&(o={e:n,text:e})}return o&&{key:o.e.target.requestID??o.e.target.formID??`seq-${o.e.seq}`,text:o.text}}function kt(e,t){return e.filter(e=>e.denial===void 0||!t.has(e.denial))}function At(e){let t=e.enabled!==!1,n=e.hubEnabled!==!1;return{on:t,hubOn:n,note:n?t?``:`Agents cannot act for you (approve, deny, answer, prompt, stop, launch). Reading and messaging still work.`:`An admin turned agent actions off for the whole hub: no agent can approve, deny, answer, prompt, stop or launch until it is on again.`}}var jt=/^(.*?) asks to approve( always(?: \(saves .*?\))?)? (.*?)\. Outside its grant: (.*)$/s,Mt=`a permission request (details unknown)`;function Nt(e){if(e.action?.kind!==`permission`)return;let t={requester:g(e),always:e.action.always===!0,...e.action.requestID?{requestID:e.action.requestID}:{}},n=jt.exec(e.question);if(!n)return{...t,action:void 0,resources:[],reason:void 0};let r=n[3],i=r.indexOf(`: `),a=r!==Mt;return{...t,always:t.always||!!n[2],action:a?i<0?r:r.slice(0,i):void 0,resources:a&&i>=0?r.slice(i+2).split(`, `).filter(Boolean):[],reason:n[4].trim()||void 0}}function Pt(e,t){return!D(e)||typeof e.by!=`string`||e.recommends!==`approve`?``:`${t?E(e.by,t):e.by} recommends Approve${typeof e.why==`string`&&e.why?`: ${e.why}`:``}`}var z={clientID:/^hcl_[0-9a-f]{16}$/,clientSecret:/^hcs_[A-Za-z0-9_-]{43}$/,flow:/^hcf_[0-9a-f]{24}$/,code:/^hco_[A-Za-z0-9_-]{43}$/,access:/^hca_([0-9a-f]{16})_[A-Za-z0-9_-]{43}$/,refresh:/^hcr_([0-9a-f]{16})_[A-Za-z0-9_-]{43}$/,connectionID:/^[0-9a-f]{16}$/},Ft=[`hub`,`user`],It=2048,Lt=new Set([`127.0.0.1`,`[::1]`,`localhost`]);function Rt(e){if(typeof e!=`string`||e===``)return`a redirect URI is a non-empty string`;if(e.length>2048)return`a redirect URI is at most ${It} characters`;if(e.trim()!==e||/\s/.test(e))return`a redirect URI has no whitespace`;if(e.includes(`*`))return`a redirect URI has no wildcard`;let t;try{t=new URL(e)}catch{return`a redirect URI is an absolute URL`}if(t.protocol!==`https:`&&t.protocol!==`http:`)return`a redirect URI uses https (http only on a loopback host)`;if(t.protocol===`http:`&&!Lt.has(t.hostname))return`http is allowed only on a loopback host (127.0.0.1, [::1], localhost)`;if(t.username||t.password)return`a redirect URI has no user info`;if(e.includes(`#`))return`a redirect URI has no fragment`}var B=e=>!!e&&typeof e==`object`&&!Array.isArray(e),V=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`),zt=new Set([`sessions:act`,`sessions:launch`,`profiles:assign`,`conversation:write`,`decisions:answer`]),Bt=e=>ze[e]??e,Vt=/^\/connect\/consent\/(hcf_[0-9a-f]{24})$/;function Ht(e){return Vt.exec(e)?.[1]}function Ut(e){if(!B(e)||typeof e.id!=`string`||!z.flow.test(e.id))return;let{client:t,scopes:n,expiresAt:r,connection:i}=e;if(!B(t)||typeof t.id!=`string`||typeof t.name!=`string`||typeof t.redirectOrigin!=`string`||!V(n)||n.length===0||typeof r!=`number`)return;let a=B(i)&&typeof i.id==`string`&&V(i.scopes)?{id:i.id,scopes:[...i.scopes]}:void 0;return{id:e.id,client:{id:t.id,name:t.name,redirectOrigin:t.redirectOrigin},scopes:[...n],expiresAt:r,...a?{connection:a}:{}}}function Wt(e){return e.scopes.map(t=>({scope:t,label:Bt(t),act:zt.has(t),checked:!0,current:e.connection?.scopes.includes(t)??!1}))}function Gt(e,t){if(!t.length)return{ok:!1,error:`Tick at least one thing it may do, or deny`};let n=t.find(t=>!e.scopes.includes(t));return n===void 0?{ok:!0,body:{scopes:e.scopes.filter(e=>t.includes(e))}}:{ok:!1,error:`The app did not ask for ${n}`}}function Kt(e){if(!B(e)||typeof e.id!=`string`||!z.connectionID.test(e.id))return;let{clientID:t,clientName:n,scopes:r,created:i,lastUsed:a,refreshExpiresAt:o}=e;if(typeof t==`string`&&typeof n==`string`&&V(r)&&typeof i==`number`&&typeof o==`number`)return{id:e.id,clientID:t,clientName:n,scopes:[...r],created:i,...typeof a==`number`?{lastUsed:a}:{},refreshExpiresAt:o}}function qt(e){return(B(e)&&Array.isArray(e.connections)?e.connections:[]).map(Kt).filter(e=>!!e)}var Jt=(e,t)=>{let n=Math.max(0,Math.round((t-e)/1e3));return n<45?`just now`:n<3600?`${Math.round(n/60)}m ago`:n<86400?`${Math.round(n/3600)}h ago`:`${Math.round(n/86400)}d ago`};function Yt(e,t){let n=[`connected ${Jt(e.created,t)}`];return e.lastUsed!==void 0&&n.push(`last refreshed ${Jt(e.lastUsed,t)}`),{title:e.clientName,scopes:e.scopes.join(`, `)||`No scopes`,detail:n.join(` · `),holder:`app:${e.id}`}}function Xt(e){if(!B(e)||typeof e.id!=`string`||!z.clientID.test(e.id))return;let{name:t,redirectURIs:n,scopes:r,created:i,createdBy:a,audience:o,disabled:s}=e;if(typeof t==`string`&&V(n)&&V(r)&&typeof i==`number`&&typeof a==`string`&&Ft.includes(o))return{id:e.id,name:t,redirectURIs:[...n],scopes:[...r],created:i,createdBy:a,audience:o,...s===!0?{disabled:!0}:{}}}function Zt(e){return(B(e)&&Array.isArray(e.clients)?e.clients:[]).map(Xt).filter(e=>!!e)}function Qt(e){return{badge:e.audience===`hub`?`Hub-wide`:`Only you`,...e.disabled?{state:`Disabled`}:{},redirects:e.redirectURIs.join(`, `),scopes:e.scopes.join(`, `)}}function $t(e){let t=e.name.trim().replace(/\s+/g,` `);if(!t)return{ok:!1,field:`name`,error:`Give the app a name`};if(t.length>100)return{ok:!1,field:`name`,error:`A name is at most 100 characters`};let n=[...new Set(e.redirects.split(`
|
|
9
|
+
`).map(e=>e.trim()).filter(Boolean))];if(!n.length)return{ok:!1,field:`redirects`,error:`Add at least one redirect URI`};if(n.length>10)return{ok:!1,field:`redirects`,error:`At most 10 redirect URIs`};for(let e of n){let t=Rt(e);if(t)return{ok:!1,field:`redirects`,error:`${e}: ${t}`}}return e.scopes.length?{ok:!0,body:{name:t,redirectURIs:n,scopes:[...new Set(e.scopes)],...e.audience?{audience:e.audience}:{}}}:{ok:!1,field:`scopes`,error:`Pick at least one scope`}}var en=class extends Error{status;code;field;hint;details;constructor(e,t){super(t),this.status=e}},tn=class extends Error{cause;name=`NetworkError`;constructor(e){super(`Can't reach the hub: the connection dropped. Check your network and try again.`),this.cause=e}},nn;function rn(e){nn=e}async function H(e,{method:t=`GET`,json:n,body:r,headers:i={},signal:a,keepalive:o}={}){let s={method:t,credentials:`same-origin`,headers:{...i},signal:a,keepalive:o};n===void 0?r!==void 0&&(s.body=r):(s.headers[`content-type`]=`application/json`,s.body=JSON.stringify(n));let c;try{c=await fetch(e,s)}catch(e){throw e instanceof TypeError?new tn(e):e}if(!c.ok){let e=await c.json().catch(()=>({}));c.status===401&&nn?.();let t=e.error&&typeof e.error==`object`?e.error:e,n=typeof e.error==`string`?e.error:typeof t.message==`string`?t.message:``,r=new en(c.status,n||`HTTP ${c.status}`);throw typeof t.field==`string`&&(r.field=t.field),typeof t.code==`string`&&(r.code=t.code),typeof t.hint==`string`&&(r.hint=t.hint),e.error&&typeof e.error==`object`&&(r.details=t),r}return c}var an=async e=>(await H(e)).json(),on=async(e,t={})=>(await H(e,{method:`POST`,json:t})).json().catch(()=>({})),sn=encodeURIComponent,cn=e=>`/api/sessions/${sn(e)}`,ln=e=>e instanceof Error?e.message:String(e),un=e=>typeof e==`object`&&!!e&&!Array.isArray(e),dn=/^[A-Za-z0-9_.:@/+~-]{1,300}$/,fn=/[\p{Cc}\p{Cf}\u2028\u2029]/u,pn={workspace:`ws`,binding:`wsb`,member:`wsm`,assignment:`asg`,supervision:`sup`,checkpoint:`chk`,sideChat:`chat`,profile:`prof`,artifact:`art`,revision:`rev`,blob:`blob`,aiJob:`job`,team:`team`,staffing:`stf`,intake:`itk`},mn=/^[A-Za-z0-9]{16,32}$/;function hn(e,t){if(typeof t!=`string`)return!1;let n=`${pn[e]}_`;return t.startsWith(n)&&mn.test(t.slice(n.length))}var gn=/^[a-z0-9-]{2,40}$/,U=e=>typeof e==`string`&&gn.test(e),_n=(e,t=120)=>typeof e==`string`&&e.trim().length>0&&e.length<=t&&!fn.test(e),vn=4e3,yn=/[\u0000-\u0009\u000b-\u001f\u007f\u2028\u2029\u200b-\u200f\u202a-\u202e\u2066-\u2069]/,bn=(e,t=vn)=>typeof e==`string`&&e.length<=t&&!yn.test(e);function xn(e){if(e!==void 0){if(!Array.isArray(e)||e.length>32)return`tags must be a list of at most 32`;if(!e.every(U))return`each tag must be 2–40 lowercase letters, digits or dashes`;if(new Set(e).size!==e.length)return`tags must be unique`}}function Sn(e){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return`metadata must be an object`;let t=Object.entries(e);if(t.length>32)return`metadata has more than 32 keys`;for(let[e,n]of t){if(!U(e))return`metadata key ${JSON.stringify(String(e).slice(0,50))} must be a slug`;if(!_n(n,200))return`metadata.${e} must be 1–200 characters of text`}}var W=e=>e.signedIn,G=[{id:`sessions`,label:`All sessions`,icon:`home`,route:`/`,order:10,available:e=>W(e)?!0:`hidden`},{id:`concierge`,label:`Concierge`,icon:`spark`,route:`/concierge`,order:15,available:e=>W(e)&&e.concierge!==void 0&&e.concierge!==`disabled`?!0:`hidden`},{id:`artifacts`,label:`Artifacts`,icon:`file`,route:`/artifacts`,order:20,available:e=>W(e)?!0:`hidden`},{id:`teams`,label:`Teams`,icon:`team`,route:`/teams`,order:25,available:e=>W(e)?!0:`hidden`},{id:`watchtower`,label:`Watchtower`,icon:`watchtower`,route:`/watchtower`,order:30,available:e=>W(e)?!0:`hidden`},{id:`profiles`,label:`Agent profiles`,icon:`settings`,route:`/profiles`,order:40,available:e=>W(e)?!0:`hidden`}],Cn={"/birds-eye":`/watchtower`};function wn(e,t=``,n=``){for(let[r,i]of Object.entries(Cn))if(e===r||e.startsWith(`${r}/`))return`${i}${e.slice(r.length)}${t}${n}`}function Tn(e,t){try{return e.available(t)}catch{return`hidden`}}function En(e,t=G){return[...t].sort((e,t)=>e.order-t.order).flatMap(t=>{let n=Tn(t,e);return n===`hidden`?[]:[{dest:t,enabled:n===!0}]})}var Dn=(e,t)=>Tn(e,t)===!0?`ok`:`unavailable`;function On(e,t=G){for(let n of t)if(n.route!==`/`&&(e===n.route||e.startsWith(`${n.route}/`)))try{return{dest:n,rest:e.slice(n.route.length).split(`/`).filter(Boolean).map(decodeURIComponent)}}catch{return}}function kn(e,t=G){return e===`/`?t.find(e=>e.route===`/`)?.id:On(e,t)?.dest.id}function An(e){return e.supported?e.permission===`denied`?{state:`blocked`,message:`Notifications are blocked for this site. Allow them in the browser's site settings, then reload.`,action:`none`,warn:!0}:e.permission==="default"?{state:`off`,message:`Notifications are off on this device.`,action:`enable`,warn:!0}:!e.worker||!e.endpoint||!e.hubSubscribed?{state:`repair`,message:`Allowed, but this device is not subscribed on this hub, so nothing will arrive (this happens after the hub moves to a new address). Enable again to fix it.`,action:`enable`,warn:!0}:{state:`on`,message:`On for this device.`,action:`disable`,warn:!1}:{state:`unsupported`,message:`This browser can't get notifications here. On iPhone, add the app to the Home Screen first (iOS 16.4+); everywhere else the hub must be on https.`,action:`none`,warn:!0}}var jn=e=>e.supported&&e.permission===`granted`&&(!e.endpoint||!e.hubSubscribed);function Mn(e){if(e.subscriptions===0)return{ok:!1,text:`This device is not subscribed; enable notifications first`};if(e.sent>0)return{ok:!0,text:e.sent===1?`Test notification sent to this device`:`Test notification sent (${e.sent} subscriptions)`};let t=e.failed[0];return t?{ok:!1,text:`Test failed: ${t.host} ${t.status===void 0?`did not answer`:`answered ${t.status}`}`}:{ok:!1,text:`Test failed`}}var Nn=[1,2,5,10,15,30,60],K=[{title:`Needs you`,kinds:[{key:`question`,label:`Question`,description:`A session or subagent asks you something.`},{key:`permission`,label:`Needs permission`,description:`A tool call waits for your OK (answer from the notification).`},{key:`decision`,label:`Decision`,description:`A session asks you to decide (hub ask @me), with options and a recommendation.`},{key:`message`,label:`Message`,description:`Agent messaging needs you: a message to you, an unanswered ask, or sessions looping.`},{key:`concierge`,label:`Concierge`,description:`Your Concierge needs you or has news: its questions, permissions, decisions, messages and spoken replies.`}]},{title:`Session`,kinds:[{key:`done`,label:`All done`,description:`The session and all its subagents and scripts finished; nothing waits on you. Once per run.`},{key:`failed`,label:`Failed`,description:`The session's run failed (provider or tool error), with the reason.`},{key:`providerError`,label:`Model provider error`,description:`Quota, budget, auth or model-routing errors of the session or a subagent; once per run.`},{key:`turn`,label:`Turn finished`,description:`Every reply of the main session, also the short ones between subagents. Noisy.`},{key:`stopped`,label:`Stopped`,description:`A run stopped without you asking (OpenCode shut down, inactivity).`},{key:`retry`,label:`Retrying`,description:`The provider failed and OpenCode is retrying the request.`}]},{title:`Subagents`,kinds:[{key:`subagentDone`,label:`Subagent finished`,description:`Each subagent that finishes, by name.`},{key:`subagentFailed`,label:`Subagent failed`,description:`Each subagent that fails, with the reason.`}]},{title:`Scripts and tools`,kinds:[{key:`jobDone`,label:`Script finished`,description:`A background shell or terminal exited 0.`},{key:`jobFailed`,label:`Script failed`,description:`A background shell or terminal exited non-zero, was killed or timed out.`},{key:`longTool`,label:`Long tool finished`,description:`A tool call that ran 30 seconds or more ended.`}]},{title:`Voice`,kinds:[{key:`say`,label:`Spoken reply`,description:`Voice mode replies while no device shows the session.`},{key:`handoff`,label:`Hand-off`,description:`A session sent to this device from the terminal (ignores quiet hours).`}]},{title:`Activity digest`,kinds:[{key:`activity`,label:`Activity`,description:`One quiet, self-replacing summary per session: subagents, long tools, scripts, idle.`}]}],Pn=K.flatMap(e=>e.kinds);function Fn(e){let t=Pn.filter(t=>e[t.key]).map(e=>e.label);return t.length?`You'll get: ${t.join(`, `)}.`:`You'll get no notifications on this device.`}function In(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||`UTC`}catch{return`UTC`}}var q=[{id:`general`,label:`General`,description:`Account, theme, text size and the Hub app`},{id:`notifications`,label:`Notifications`,description:`This device's notifications, what to notify about, quiet hours`},{id:`voice`,label:`Voice & speech`,description:`Voice mode, mic sensitivity, speech-to-text and text-to-speech`},{id:`media`,label:`Media`,description:`Web images in replies: the sites whose images load at once`},{id:`machines`,label:`Machines & devices`,description:`Connected machines, approvals, signed-in browsers and apps`},{id:`agents`,label:`Agents & access`,description:`App tokens, acting switches, grants and agent activity`},{id:`concierge`,label:`Concierge`,description:`Your hub-managed assistant: machine, directory, model and its grant`},{id:`teams`,label:`Teams`,description:`Team isolation: what team members see`},{id:`admin`,label:`Admin`,description:`Users, all machines, approvals and the audit log`,admin:!0}],Ln=e=>q.filter(t=>e||!t.admin);function Rn(e){if(e!==`/settings`&&!e.startsWith(`/settings/`))return;let t=e.slice(10).split(`/`)[0]??``;if(!t)return{};try{return{section:decodeURIComponent(t)}}catch{return{section:t}}}function zn(e,t){return e===void 0?t.phone?`list`:`general`:Ln(t.admin).find(t=>t.id===e)?.id}var Bn={account:`general`,appearance:`general`,notifications:`notifications`,voice:`voice`,speech:`voice`,machines:`machines`,devices:`machines`,agents:`agents`,admin:`admin`,recording:`voice`,recordings:`voice`},Vn={recording:`recordings`};function Hn(e){return Vn[e]??e}function Un(e){let t=e.replace(/^#/,``);if(!t)return;let n=Bn[t];if(n)return`/settings/${n}#${Hn(t)}`;if(q.some(e=>e.id===t))return`/settings/${t}`}var Wn=[{id:`account`,section:`general`,label:`Account`,description:`Who you are signed in as; sign out of this device`,keywords:`sign out logout user email`},{id:`set-theme`,section:`general`,label:`Color theme`,description:`Light, dark or the system's theme`,keywords:`appearance light dark system mode`},{id:`set-text-size`,section:`general`,label:`Text size`,description:`How big text is on this device`,keywords:`appearance font scale zoom`},{id:`add-app`,section:`general`,label:`Add the Hub app`,description:`Link the Hub app on a phone or tablet with a QR code`,keywords:`mobile android ios install pair link`},{id:`notifications`,section:`notifications`,label:`Notifications on this device`,description:`Enable or turn off push notifications here; permission and subscription status`,keywords:`push enable subscribe permission service worker`},{id:`notify-test`,section:`notifications`,label:`Send test notification`,description:`Check that notifications reach this device`,keywords:`push try`},{id:`quiet-hours`,section:`notifications`,label:`Quiet hours`,description:`No notifications at night (hand-offs still come through)`,keywords:`do not disturb night sleep time`},{id:`set-voice-speed`,section:`voice`,label:`Voice speed`,description:`How fast replies are spoken`,keywords:`rate tts`},{id:`set-sensitivity`,section:`voice`,label:`Mic sensitivity`,description:`How sure Voice mode must be that you are speaking to it`,keywords:`microphone noise vad`},{id:`set-turn-detection`,section:`voice`,label:`Turn detection`,description:`When Voice mode decides you finished speaking: silence timers, or the Smart Turn audio model (experimental)`,keywords:`end of turn endpointing smart turn pause hold vad experimental`},{id:`set-voice-front`,section:`voice`,label:`Voice front`,description:`Voice mode's fast voice agent: it says what it understood, then relays to the session, which keeps its own agent. On by default; turn it off to talk to the session directly`,keywords:`front echo relay fast assistant agent off direct`},{id:`set-cues`,section:`voice`,label:`Progress cues`,description:`Tones and short acknowledgements while the agent works`,keywords:`sounds acknowledgement`},{id:`set-background`,section:`voice`,label:`Keep listening when the screen is off`,description:`Lock-screen controls and listening with the screen off`,keywords:`background lock screen`},{id:`set-recording`,section:`voice`,label:`Record voice conversations (developer)`,description:`Saves your voice segments, transcripts, replies, timing and Concierge actions on this hub, for 7 days; export or delete them`,keywords:`record debug developer training audio export delete`},{id:`recordings`,section:`voice`,label:`Your recordings`,description:`The voice conversations recorded on this hub: play a segment, export or delete them`,keywords:`recordings list play segment export zip delete storage usage`},{id:`speech`,section:`voice`,label:`Speech`,description:`Speech-to-text and text-to-speech provider, model, voice and API keys`,keywords:`stt tts transcription openrouter openai key`},{id:`media-allowlist`,section:`media`,label:`Web images`,description:`Sites whose images in replies load at once; images from other sites wait for a tap`,keywords:`allowlist allow remote image picture domain host site github load`},{id:`machines`,section:`machines`,label:`Machines`,description:`Computers running OpenCode connected to this hub; approve or revoke them`,keywords:`computer approve enrollment revoke opencode`},{id:`setup-machine`,section:`machines`,label:`Set up Hub on a machine`,description:`A one-line installer for macOS, Linux or Windows that connects a computer to this hub`,keywords:`setup install connect add new computer server laptop hubctl curl powershell windows linux macos enroll`},{id:`devices`,section:`machines`,label:`Devices`,description:`Browsers and the Hub app signed in to your account; revoke them`,keywords:`browser phone sessions revoke sign out`},{id:`agents`,section:`agents`,label:`Acting switch`,description:`Whether sessions and apps may act for you at all`,keywords:`pause kill switch acting`},{id:`app-tokens`,section:`agents`,label:`App tokens`,description:`Tokens for MCP gateways, CLIs and other apps, with their scopes`,keywords:`api key token scopes mcp cli`},{id:`grants`,section:`agents`,label:`Grants`,description:`What sessions and apps may approve, deny, answer, prompt or stop for you`,keywords:`permissions delegate allow`},{id:`agent-activity`,section:`agents`,label:`Agent activity`,description:`What agents did for you (the agent audit)`,keywords:`audit log history`},{id:`concierge`,section:`concierge`,label:`Concierge`,description:`Turn the Concierge on or off, pick its machine and directory, restart it`,keywords:`assistant butler watch sessions`},{id:`concierge-grant`,section:`concierge`,label:`Concierge grant`,description:`What the Concierge may do for you without asking; renew or remove it`,keywords:`permissions approve deny preset`},{id:`context-cards`,section:`concierge`,label:`Context cards`,description:`Short pick-up summaries of your sessions, written by a light model`,keywords:`summary pickup card model resume findability`},{id:`team-isolation`,section:`teams`,label:`Team isolation`,description:`Team members see only their teams' sessions, not your other sessions`,keywords:`teams privacy hide members`}],Gn=[{id:`admin`,section:`admin`,label:`Users`,description:`Everyone on this hub: roles, disable, remove`,keywords:`admin accounts people`},{id:`admin-machines`,section:`admin`,label:`All machines`,description:`Every machine connected to this hub, by owner`,keywords:`admin revoke`},{id:`admin-audit`,section:`admin`,label:`Audit log`,description:`Who changed what on this hub`,keywords:`admin history`}],Kn=(e,t)=>({id:`pref-${e.key}`,section:`notifications`,label:e.label,description:e.description,keywords:`notify ${t}`});function qn(e){return[...Wn,...K.flatMap(e=>e.kinds.map(t=>Kn(t,e.title))),...e?Gn:[]]}var Jn=e=>q.find(t=>t.id===e)?.label??e;function Yn(e,t){let n=e.trim().toLowerCase();if(!n)return[];let r=n.split(/\s+/),i=e=>{let t=e.label.toLowerCase();return t.startsWith(n)?0:t.includes(n)?1:r.every(e=>t.includes(e))?2:3};return t.filter(e=>{let t=`${e.label} ${e.description} ${e.keywords??``} ${Jn(e.section)}`.toLowerCase();return r.every(e=>t.includes(e))}).map((e,t)=>({e,i:t,r:i(e)})).sort((e,t)=>e.r-t.r||e.i-t.i).map(e=>e.e)}function Xn(e,t){let n=e.filter(e=>e.key in t);if(!n.length)return``;let r=n.filter(e=>t[e.key]);return r.length===n.length?`All on`:r.length?`${r.length} of ${n.length} on: ${r.map(e=>e.label).join(`, `)}`:`All off`}var Zn=e=>e&&e.startsWith(`/`)&&!e.startsWith(`//`)&&!e.includes(`\\`)?e:`/`;function Qn(e){let t=e.pathname,n=e.searchParams;if(t===`/pair`)return{name:`pair`,next:Zn(n.get(`next`)),error:n.get(`error`)??``};if(t===`/approve`)return{name:`approve`,code:n.get(`code`)??``};let r=Ht(t);if(r)return{name:`consent`,flow:r};if(t===`/new`)return{name:`new`,machine:n.get(`machine`)??void 0,dir:n.get(`dir`)??void 0,key:n.get(`key`)??void 0};if(t===`/panes`)return{name:`panes`};if(t===`/concierge`||t.startsWith(`/concierge/`))return{name:`concierge`};let i=Rn(t);if(i)return{name:`settings`,...i};let a=On(t);if(a)return{name:`feature`,id:a.dest.id,rest:a.rest};let o=/^\/s\/([^/]+)$/.exec(t);if(o)try{return{name:`session`,id:decodeURIComponent(o[1])}}catch{return{name:`home`}}return{name:`home`}}function J(){let e=(location.pathname===`/settings`?Un(location.hash):void 0)??wn(location.pathname,location.search,location.hash);return e&&history.replaceState(history.state,``,e),new URL(location.href)}var[$n,er]=e(J()),tr=$n,nr=()=>Qn($n()),Y=0;function X(e,{replace:t=!1}={}){let n=new URL(e,location.origin);n.pathname+n.search+n.hash!==location.pathname+location.search+location.hash&&(history[t?`replaceState`:`pushState`]({},``,n.pathname+n.search+n.hash),t||Y++),er(J())}function rr(e=`/`){Y>0?history.back():X(e)}window.addEventListener(`popstate`,()=>{Y=Math.max(0,Y-1),er(J())}),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[href]`);if(!t||t.target||t.hasAttribute(`download`)||e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let n=t.getAttribute(`href`)??``;!n.startsWith(`/`)||n.startsWith(`//`)||n.startsWith(`/auth/`)||n.startsWith(`/api/`)||(e.preventDefault(),X(n))});var Z=()=>new Set;function ir(e){Z=e}var ar=e=>Z().has(e),or=e=>Z().has(e)?`/concierge`:`/s/${encodeURIComponent(e)}`,[sr,Q]=e(),cr=sr,lr=0,$;function ur(e,t=``,n){let r=++lr;Q({id:r,text:e,kind:t,action:n}),clearTimeout($),$=setTimeout(()=>sr()?.id===r&&Q(void 0),n||t?8e3:4e3)}var dr=()=>Q(void 0);export{Zt as $,hn as A,je as At,H as B,_ as Bt,Fn as C,M as Ct,En as D,Ge as Dt,kn as E,We as Et,xn as F,Ce as Ft,cn as G,ie as Gt,ln as H,h as Ht,dn as I,be as It,Qt as J,r as Jt,rn as K,ne as Kt,un as L,Te as Lt,U as M,Ne as Mt,bn as N,E as Nt,Dn as O,Dt as Ot,Sn as P,ke as Pt,Xt as Q,en as R,fe as Rt,An as S,Le as St,G as T,Ve as Tt,an as U,le as Ut,sn as V,se as Vt,on as W,ue as Wt,Gt as X,ee as Xt,Yt as Y,u as Yt,Wt as Z,Nn as _,A as _t,ar as a,Et as at,Mn as b,kt as bt,nr as c,ut as ct,Xn as d,He as dt,Ut as et,zn as f,Ot as ft,Ln as g,Je as gt,qn as h,Qe as ht,rr as i,At as it,_n as j,Me as jt,vn as k,Pt as kt,or as l,yt as lt,Hn as m,Nt as mt,dr as n,k as nt,tr as o,Re as ot,Yn as p,Ye as pt,$t as q,ce as qt,ur as r,Pe as rt,X as s,wt as st,cr as t,qt as tt,ir as u,Ue as ut,K as v,$e as vt,jn as w,et as wt,In as x,Ie as xt,Pn as y,Tt as yt,tn as z,de as zt};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// AudioWorklet for conversation mode: batches 128-sample render quanta into ~20 ms mono frames and posts
|
|
2
|
+
// them to the page, where web/conversation-core.js runs the VAD. Loaded with audioWorklet.addModule().
|
|
3
|
+
class VadTap extends AudioWorkletProcessor {
|
|
4
|
+
constructor() {
|
|
5
|
+
super()
|
|
6
|
+
this.size = Math.max(128, Math.round(sampleRate * 0.02))
|
|
7
|
+
this.buffer = new Float32Array(this.size)
|
|
8
|
+
this.filled = 0
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
process(inputs) {
|
|
12
|
+
const channel = inputs[0]?.[0]
|
|
13
|
+
if (channel) {
|
|
14
|
+
for (let i = 0; i < channel.length; i++) {
|
|
15
|
+
this.buffer[this.filled++] = channel[i]
|
|
16
|
+
if (this.filled === this.size) {
|
|
17
|
+
this.port.postMessage(this.buffer, [this.buffer.buffer])
|
|
18
|
+
this.buffer = new Float32Array(this.size)
|
|
19
|
+
this.filled = 0
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return true
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
registerProcessor("vad-tap", VadTap)
|
package/web/dist/index.html
CHANGED
|
@@ -17,15 +17,15 @@
|
|
|
17
17
|
<link rel="icon" href="/icon.svg" type="image/svg+xml" />
|
|
18
18
|
<link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192" />
|
|
19
19
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
|
20
|
-
<script type="module" crossorigin src="/assets/index-
|
|
20
|
+
<script type="module" crossorigin src="/assets/index-BS6lA6fN.js"></script>
|
|
21
21
|
<link rel="modulepreload" crossorigin href="/assets/ui-CFB4wQfF.js">
|
|
22
|
-
<link rel="modulepreload" crossorigin href="/assets/toast-
|
|
23
|
-
<link rel="modulepreload" crossorigin href="/assets/pane-layout-
|
|
22
|
+
<link rel="modulepreload" crossorigin href="/assets/toast-CXTwTvDw.js">
|
|
23
|
+
<link rel="modulepreload" crossorigin href="/assets/pane-layout-BW0RdX5a.js">
|
|
24
24
|
<link rel="modulepreload" crossorigin href="/assets/plural-Bspvoqfq.js">
|
|
25
|
-
<link rel="modulepreload" crossorigin href="/assets/artifacts-
|
|
25
|
+
<link rel="modulepreload" crossorigin href="/assets/artifacts-But87Jfo.js">
|
|
26
26
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-BLdHbfdN.js">
|
|
27
|
-
<link rel="modulepreload" crossorigin href="/assets/MediaImage-
|
|
28
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
27
|
+
<link rel="modulepreload" crossorigin href="/assets/MediaImage-Ch3ryIdR.js">
|
|
28
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BC0O1gfR.css">
|
|
29
29
|
</head>
|
|
30
30
|
<body>
|
|
31
31
|
<div id="root"></div>
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{$ as e,A as t,B as n,C as r,E as i,F as a,G as o,I as s,J as c,N as l,O as u,P as d,Q as f,R as p,S as m,T as h,U as g,W as _,_ as v,a as y,b,et as x,g as S,i as C,k as w,r as T,tt as E,u as D,x as O,y as k}from"./ui-CFB4wQfF.js";import{B as A,H as j,L as M,U as N,V as P,j as F,k as I,z as L}from"./toast-Cuu2K0hx.js";import{n as R,o as z}from"./artifacts-DU9uRgs1.js";import{B as ee,F as B,G as te,H as V,I as ne,J as H,K as re,L as ie,M as ae,N as oe,P as se,Q as ce,R as le,U as ue,V as de,W as fe,X as pe,Y as U,Z as me,at as he,et as ge,j as _e,q as ve,st as ye,z as be}from"./index-LNMZCqgE.js";import{c as xe,i as Se,n as Ce,r as we,t as Te}from"./source-BWlvaODa.js";var Ee=`ai-actions`,De=16,Oe=[`ask`,`propose-edit`,`run-action`],ke=[`queued`,`running`,`succeeded`,`failed`,`cancelled`],Ae=[`starting`,`waiting`,`offline`,`ready`,`ended`,`failed`],je=/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/,W=e=>typeof e==`object`&&!!e&&!Array.isArray(e),G=e=>typeof e==`string`&&e.length>0,Me=e=>typeof e==`number`&&Number.isFinite(e),Ne=(e,t)=>typeof t==`string`&&e.includes(t),Pe=e=>e.replace(/\/+$/,``).split(`/`).pop()||e;function Fe(e){if(W(e)&&Ne(Ae,e.status)){if(e.kind===`session`&&G(e.address))return e;if(e.kind===`launch`&&G(e.machine)&&G(e.repo))return{harness:``,mode:`checkout`,...e}}}function Ie(e){if(!W(e)||!Ne([`pending`,`applied`,`conflict`],e.state)||!Array.isArray(e.files))return;let t=e.files.filter(e=>W(e)&&G(e.mediaType)&&Me(e.bytes)&&G(e.hash));return{state:e.state,files:t,...Array.isArray(e.keep)?{keep:e.keep.filter(G)}:{},...G(e.entry)?{entry:e.entry}:{},...G(e.appliedRevisionID)?{appliedRevisionID:e.appliedRevisionID}:{}}}function Le(e){if(!W(e)||!G(e.id)||!G(e.artifactID)||!G(e.baseRevisionID)||!Me(e.revision)||!Ne(ke,e.state)||!Ne(Oe,e.kind)||typeof e.instruction!=`string`||!G(e.by)||!Me(e.createdAt)||!Me(e.updatedAt))return;let t=Fe(e.handler);if(!t)return;let n=Ie(e.proposal),{proposal:r,...i}=e;return{...i,handler:t,...n?{proposal:n}:{},...typeof e.answer==`string`?{answer:e.answer}:{},...typeof e.error==`string`?{error:e.error}:{}}}function Re(e){let t=W(e)?e:{};return{items:Array.isArray(t.items)?t.items.flatMap(e=>Le(e)??[]):[],...G(t.cursor)?{cursor:t.cursor}:{}}}function ze(e){let t=e?.[Ee];return t?t.split(`,`).map(e=>e.trim()).filter(F).slice(0,De):[]}var Be=e=>e.state===`queued`||e.state===`running`;function Ve(e,t){return e.kind===`session`?e.address.startsWith(`@`)?e.address:t?.(e.sessionID??e.address)??(e.sessionID?t?.(e.address):void 0)??e.address:`New ${e.harness||`agent`} session on ${e.machine} · ${Pe(e.repo)}`}function He(e,t){let n=(e,t)=>({tone:e,active:!1,text:t});if(e.state===`failed`)return n(`failed`,`Failed: ${e.error||`no reason given`}`);if(e.state===`cancelled`)return n(`cancelled`,`Cancelled`);if(e.state===`succeeded`){if(e.kind!==`propose-edit`)return n(`done`,`Answered`);let t=e.proposal;return t?t.state===`applied`?n(`done`,`Edit accepted`):t.state===`conflict`?n(`failed`,`Not accepted: the artifact changed after this edit was proposed. Request it again on the latest revision.`):n(`done`,`Proposed an edit: review it below`):n(`done`,`Finished without a proposal`)}let r=e.handler,i=(e,t)=>({tone:e,active:!0,text:t});switch(r.status){case`offline`:return r.kind===`session`?i(`offline`,`Waiting: ${Ve(r,t)} is offline. The request is queued and is delivered when it reconnects.`):i(`offline`,`Waiting: ${r.machine} is offline. The request is queued until it's back.`);case`starting`:return i(`waiting`,r.kind===`session`?`Sending to ${Ve(r,t)}…`:`Starting a session on ${r.machine}…`);case`waiting`:return i(`waiting`,r.kind===`launch`?`Waiting for a session on ${r.machine}${r.reason?`: ${r.reason}`:``}`:`Waiting for ${Ve(r,t)}`);case`ready`:return e.state===`running`?i(`running`,`Working: ${Ve(r,t)} has the request.`):i(`waiting`,`Request delivered to ${Ve(r,t)}; waiting for it to pick it up.`);default:return i(`waiting`,`The handler ${r.status===`ended`?`ended`:`failed`}; the job finishes shortly.`)}}function Ue(e){return e===`user`?`You`:e.startsWith(`app:`)?`App ${e.slice(4)}`:`Session ${e}`}function We(e,t){let n=t.get(e);return n===void 0?`revision ${e.slice(-6)}`:`revision ${n}`}function Ge(e){let t=[],n=[];for(let r of e.sessions){if(r.archived)continue;let e=r.name?.replace(/^@+/,``)?`@${r.name.replace(/^@+/,``)}`:void 0,i=r.title||r.id,a=[r.machineName,r.harness].filter(Boolean).join(` · `),o=`${r.online?`●`:`○`} ${e?`${e} — ${i} · ${a}`:`${i} · ${a}`}${r.online?``:` (offline: queued until it reconnects)`}`,s={key:`session:${r.id}`,kind:`session`,label:o,display:e??i,online:r.online,handler:{session:r.id},search:[e,r.title,r.id,r.machineName,r.harness].filter(Boolean).join(` `).toLowerCase()};e?t.push({...s,sortName:e.toLowerCase()}):n.push(s)}t.sort((e,t)=>e.sortName<t.sortName?-1:+(e.sortName>t.sortName));let r=[...t.map(({sortName:e,...t})=>t),...n];for(let t of e.bindings){let n=e.machines.find(e=>e.id===t.machineID),i=n?.online??!1,a=`New session in ${t.label||Pe(t.repo)} on ${n?.name??t.machineID}`;r.push({key:`launch:${t.id}`,kind:`launch`,label:`${a}${i?``:` (machine offline: waits for it)`}`,display:a,online:i,handler:{launch:{machine:t.machineID,repo:t.repo}},search:[a,t.repo,t.machineID].join(` `).toLowerCase()})}return r}function Ke(e,t,n){let r=t.trim().toLowerCase();return r?e.filter(e=>e.key===n||e.search.includes(r)):[...e]}function qe(e){let t=new Map;for(let n of e)n.kind===`session`&&`session`in n.handler&&n.handler.session&&t.set(n.handler.session,n.display);return t}function Je(e){return e.kind===`session`?{session:e.sessionID??e.address}:{launch:{machine:e.machine,repo:e.repo,...e.harness?{harness:e.harness}:{},...e.model?{model:e.model}:{},...e.agent?{agent:e.agent}:{},mode:e.mode}}}function Ye(e){let t=e=>({ok:!1,problem:e});if(!e.handler)return t(`Choose who handles this request.`);let n=e.instruction.trim();if(e.kind===`run-action`){let r=e.actions??[];if(r.length===0)return t(`This artifact declares no AI actions.`);if(!e.action||!r.includes(e.action))return t(`Choose one of the artifact's actions.`);n||=`Run the ${e.action} action.`}if(!n)return t(e.kind===`ask`?`Write a question.`:`Describe the edit.`);if(n.length>R.aiInstructionChars)return t(`Keep it under ${R.aiInstructionChars.toLocaleString(`en-US`)} characters.`);if(je.test(n))return t(`Use plain text (no control characters).`);let r={kind:e.kind,baseRevisionID:e.baseRevisionID,instruction:n,handler:e.handler};return e.kind===`run-action`?{ok:!0,request:{kind:`run-action`,action:e.action,baseRevisionID:e.baseRevisionID,instruction:n,handler:e.handler}}:{ok:!0,request:e.kind===`propose-edit`?{...r,apply:`manual`}:r}}var Xe=4e6,Ze=3,Qe=e=>{let t=e.replace(/\r\n?/g,`
|
|
2
|
-
`).split(`
|
|
3
|
-
`);return t.length>1&&t[t.length-1]===``&&t.pop(),e===``?[]:t};function $e(e,t){let n=Qe(e),r=Qe(t),i=[{type:`meta`,text:`Too large to compare line by line.`}];if(n.length+r.length>1e4)return i;let a=0;for(;a<n.length&&a<r.length&&n[a]===r[a];)a++;let o=n.length,s=r.length;for(;o>a&&s>a&&n[o-1]===r[s-1];)o--,s--;let c=o-a,l=s-a;if((c+1)*(l+1)>Xe)return i;let u=l+1,d=new Uint32Array((c+1)*u);for(let e=c-1;e>=0;e--)for(let t=l-1;t>=0;t--)d[e*u+t]=n[a+e]===r[a+t]?d[(e+1)*u+t+1]+1:Math.max(d[(e+1)*u+t],d[e*u+t+1]);let f=[];for(let e=0;e<a;e++)f.push({type:`context`,text:n[e],oldNo:e+1,newNo:e+1});let p=0,m=0,h=[],g=[],_=()=>{f.push(...h,...g),h=[],g=[]};for(;p<c||m<l;)p<c&&m<l&&n[a+p]===r[a+m]?(_(),f.push({type:`context`,text:n[a+p],oldNo:a+p+1,newNo:a+m+1}),p++,m++):m<l&&(p===c||d[p*u+m+1]>=d[(p+1)*u+m])?(g.push({type:`add`,text:r[a+m],newNo:a+m+1}),m++):(h.push({type:`del`,text:n[a+p],oldNo:a+p+1}),p++);_();for(let e=0;e<n.length-o;e++)f.push({type:`context`,text:n[o+e],oldNo:o+e+1,newNo:s+e+1});let v=new Uint8Array(f.length);f.forEach((e,t)=>{if(e.type!==`context`)for(let e=Math.max(0,t-Ze);e<=Math.min(f.length-1,t+Ze);e++)v[e]=1});let y=[],b=0;for(;b<f.length;){if(!v[b]){b++;continue}let e=b;for(;e<f.length&&v[e];)e++;let t=f.slice(b,e),n=t.find(e=>e.oldNo!==void 0)?.oldNo??0,r=t.find(e=>e.newNo!==void 0)?.newNo??0,i=t.filter(e=>e.type!==`add`).length,a=t.filter(e=>e.type!==`del`).length;y.push({type:`hunk`,text:`@@ -${n},${i} +${r},${a} @@`});for(let e of t)y.push(e);b=e}return y}function et(e,t){if(!(t.files.some(e=>e.path!==void 0)||t.keep.length>0||e.some(e=>e.path!==void 0))){let n=e[0];return t.files.map(e=>({change:n?n.hash===e.hash?`unchanged`:`changed`:`added`,mediaType:e.mediaType,bytes:e.bytes,...n?{baseBytes:n.bytes}:{}}))}let n=new Map(e.map(e=>[e.path??``,e])),r=[],i=new Set;for(let e of t.files){let t=e.path??``;i.add(t);let a=n.get(t);r.push({path:t,change:a?a.hash===e.hash?`unchanged`:`changed`:`added`,mediaType:e.mediaType,bytes:e.bytes,...a?{baseBytes:a.bytes}:{}})}for(let e of t.keep){if(i.has(e))continue;i.add(e);let t=n.get(e);r.push({path:e,change:`kept`,mediaType:t?.mediaType??``,bytes:t?.bytes??0,...t?{baseBytes:t.bytes}:{}})}for(let t of e){let e=t.path??``;i.has(e)||r.push({path:e,change:`removed`,mediaType:t.mediaType,bytes:0,baseBytes:t.bytes})}return r}function K(e){let t=W(e)||e instanceof Error?e:{},n=Me(t.status)?t.status:0,r=typeof t.code==`string`?t.code:``,i=typeof t.message==`string`?t.message:String(e),a=W(t.details)?t.details:{};if(n===422||r===`unsupported`){let e=typeof a.feature==`string`?a.feature:``;return e===`artifactActions`?{kind:`unsupported`,text:`This artifact declares no AI actions.`}:!e||e===`artifacts`?{kind:`unsupported`,text:`AI requests aren't supported on this hub.`}:{kind:`unsupported`,text:`Not supported on this hub (${e}): ${i}`}}return n===404||r===`not_found`?{kind:`unavailable`,text:`AI requests aren't available for this artifact (it doesn't exist, or you can't see it).`}:n===401||n===403||r===`forbidden`?{kind:`forbidden`,text:`Not allowed: ${i}`}:n===409||r===`conflict`?{kind:`conflict`,text:i}:n===429||r===`rate_limited`?{kind:`rate_limited`,text:`Too many AI requests are running (on this artifact or for you). Wait for one to finish.`}:n===503||r===`offline`?{kind:`offline`,text:`Offline: ${i}`}:n===400||r===`invalid`?{kind:`invalid`,text:i}:{kind:`error`,text:i}}function tt(e){return e.proposal?.state===`conflict`?`stale-base`:`job-changed`}function nt(e){return Math.min(1e4,Math.round(1500*1.5**Math.max(0,e)))}var rt={set(e,t){let n=setTimeout(e,t);return()=>clearTimeout(n)}},it=()=>globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2)}`,at=e=>!(e&&typeof e==`object`&&typeof e.status==`number`);function ot(e){let{source:t,artifactID:n,onState:r}=e,i=e.timers??rt,a=e.key??it,o={status:`loading`,actions:[],revisionNumbers:new Map,jobs:[],more:!1,loadingMore:!1,handlers:[],sending:!1,pending:{},notices:{},reviews:{}},s,c,l=0,u=!1,d,f=e=>{u||(o={...o,...e},r(o))},p=e=>o.jobs.find(t=>t.id===e),m=e=>f({jobs:o.jobs.some(t=>t.id===e.id)?o.jobs.map(t=>t.id===e.id?e:t):[e,...o.jobs]}),h=(e,t)=>{let{[e]:n,...r}=o.notices;f({notices:t?{...r,[e]:t}:r})},g=(e,t)=>{let{[e]:n,...r}=o.pending;f({pending:t?{...r,[e]:t}:r})};async function _(){let[e,r]=await Promise.all([t.artifact(n),t.revisionNumbers(n).catch(()=>o.revisionNumbers)]);f({artifact:e,actions:ze(e.metadata),revisionNumbers:r})}function v(){c?.(),c=void 0,u||!o.jobs.some(Be)?l=0:c=i.set(()=>{c=void 0,x()},nt(l))}async function y(){f({status:`loading`});try{let[,e]=await Promise.all([_(),t.jobs(n)]);s=e.cursor,f({status:`ready`,jobs:e.items,more:!!e.cursor,error:void 0})}catch(e){f({status:`error`,error:K(e)});return}v(),await b()}async function b(){if(!u&&o.artifact)try{f({handlers:await t.handlers(o.artifact),handlersError:void 0})}catch(e){f({handlersError:K(e).text})}}async function x(){if(!(u||o.status!==`ready`)){try{let e=await t.jobs(n),r=new Map(o.jobs.map(e=>[e.id,e])),i=new Set(e.items.map(e=>e.id)),a=e.items.some(e=>r.get(e.id)?.revision!==e.revision),s=e.items.some(e=>!Be(e)&&r.get(e.id)&&Be(r.get(e.id)));f({jobs:[...e.items,...o.jobs.filter(e=>!i.has(e.id))]}),l=a?0:l+1,s&&await _().catch(()=>void 0)}catch{l++}v()}}async function S(){if(s&&!o.loadingMore){f({loadingMore:!0});try{let e=await t.jobs(n,s);s=e.cursor;let r=new Set(o.jobs.map(e=>e.id));f({jobs:[...o.jobs,...e.items.filter(e=>!r.has(e.id))],more:!!e.cursor,loadingMore:!1})}catch(e){f({loadingMore:!1,sendError:K(e)})}}}async function C(e){let r=JSON.stringify(e),i=d?.body===r?d.key:a();try{let r=await t.create(n,e,i);return d=void 0,m(r),f({sending:!1,sendError:void 0}),l=0,v(),r}catch(e){d=at(e)?{body:r,key:i}:void 0;let t=K(e);f({sending:!1,sendError:t}),t.kind===`conflict`&&await _().catch(()=>void 0);return}}async function w(e){return await T(e)!==void 0}async function T(e){if(o.sending||!o.artifact)return;if(e.baseRevisionID!==void 0&&e.baseRevisionID!==o.artifact.latestRevisionID){f({sendError:{kind:`conflict`,text:`The artifact changed since that view opened: the request was not sent.`}});return}let t=o.handlers.find(t=>t.key===e.handlerKey)?.handler,n=Ye({kind:e.kind,instruction:e.instruction,baseRevisionID:o.artifact.latestRevisionID,...t?{handler:t}:{},...e.action?{action:e.action}:{},actions:o.actions});if(!n.ok)f({sendError:{kind:`invalid`,text:n.problem}});else return f({sending:!0,sendError:void 0}),C(n.request)}async function E(e){try{let r=await t.job(n,e);return m(r),r}catch{return}}async function D(e){let r=p(e);if(!r||o.pending[e]||!Be(r))return!1;g(e,`cancel`);try{return m(await t.cancel(n,e,r.revision)),h(e,void 0),!0}catch(t){let n=K(t),r=n.kind===`conflict`?await E(e):void 0;return h(e,{kind:n.kind===`conflict`?`conflict`:`error`,text:r&&!Be(r)?`Not cancelled: it already ${r.state===`succeeded`?`finished`:r.state}.`:n.text}),!1}finally{g(e,void 0),v()}}async function O(e){let r=p(e);if(!r||o.pending[e]||r.kind!==`propose-edit`||r.state!==`succeeded`||r.proposal?.state!==`pending`)return!1;g(e,`apply`);try{let i=await t.apply(n,e,r.revision);m(i.job),await _().catch(()=>void 0);let a=i.revisionNumber??o.revisionNumbers.get(i.revisionID);return h(e,{kind:`info`,text:a===void 0?`Accepted as a new revision.`:`Accepted as revision ${a}.`}),!0}catch(t){let n=K(t);if(n.kind!==`conflict`)return h(e,{kind:`error`,text:n.text}),!1;let[r]=await Promise.all([E(e),_().catch(()=>void 0)]);if(r&&tt(r)===`stale-base`){let t=o.artifact?We(o.artifact.latestRevisionID,o.revisionNumbers):`a newer revision`;h(e,{kind:`conflict`,stale:!0,text:`Not accepted: the artifact changed since this edit was proposed (it is at ${t} now). Nothing was changed. Request the edit again on the latest revision.`})}else h(e,{kind:`conflict`,stale:!1,text:`This request changed since you read it. Review it again, then Accept.`});return!1}finally{g(e,void 0)}}async function k(e){let t=p(e);if(!t||o.pending[e]||o.sending||t.kind!==`propose-edit`)return!1;g(e,`rerequest`),f({sending:!0,sendError:void 0});try{await _();let n=!!await C({kind:`propose-edit`,baseRevisionID:o.artifact.latestRevisionID,instruction:t.instruction,handler:Je(t.handler),apply:`manual`});return n&&h(e,{kind:`info`,text:`Requested again on the latest revision.`}),n}catch(e){return f({sending:!1,sendError:K(e)}),!1}finally{g(e,void 0)}}async function A(e){let r=p(e);if(r?.proposal){f({reviews:{...o.reviews,[e]:{status:`loading`}}});try{let[i,a]=await Promise.all([t.proposal(n,e),t.revisionFiles(n,r.baseRevisionID)]),s=et(a,{files:i.files,keep:i.keep}),c=a.length<=1&&i.files.every(e=>e.path===void 0),l=i.files.map(e=>{let t=c?a[0]:a.find(t=>t.path===e.path),n=e.path===void 0?{}:{path:e.path};return e.omitted===`binary`?{...n,note:`Binary file: not compared.`}:e.omitted===`budget`||e.text===void 0?{...n,note:`Too large to show here.`}:t&&t.text===void 0?{...n,note:t.omitted===`binary`?`Replaces a binary file.`:`The current file is too large to compare.`}:t&&t.hash===e.hash?{...n,note:`Unchanged.`}:{...n,lines:$e(t?.text??``,e.text)}});f({reviews:{...o.reviews,[e]:{status:`ready`,changes:s,diffs:l,truncated:i.truncated}}})}catch(t){f({reviews:{...o.reviews,[e]:{status:`error`,text:K(t).text}}})}}}return{state:()=>o,load:y,refresh:x,more:S,request:w,requestJob:T,cancel:D,accept:O,rerequest:k,review:A,reloadHandlers:b,dispose(){c?.(),c=void 0,u=!0}}}var st={markdown:`Markdown`,code:`Code`,image:`Image`,table:`Table`,chart:`Chart`,dashboard:`Dashboard`,html:`HTML`,app:`App`,file:`File`};function ct(e){let t=[[]];for(let n of e)n.text.split(`
|
|
4
|
-
`).forEach((e,r)=>{r>0&&t.push([]),e&&t[t.length-1].push(n.kind?{text:e,kind:n.kind}:{text:e})});return t.length>1&&t[t.length-1].length===0&&t.pop(),t}var lt={ts:`TypeScript`,tsx:`TypeScript (TSX)`,js:`JavaScript`,jsx:`JavaScript (JSX)`,python:`Python`,go:`Go`,rust:`Rust`,bash:`Shell`,json:`JSON`,css:`CSS`,html:`HTML`,markdown:`Markdown`,yaml:`YAML`,toml:`TOML`,sql:`SQL`,java:`Java`,c:`C`,cpp:`C++`,ruby:`Ruby`,swift:`Swift`,kotlin:`Kotlin`,diff:`Diff`,csv:`CSV`};function ut(e,t){return{name:e?.path?.split(`/`).pop()||`Untitled`,language:t?lt[t]??t.toUpperCase():`Plain text`}}function dt(e,t){let n=[{label:`Type`,value:st[e.kind]??e.kind},{label:`Visibility`,value:e.visibility===`workspace`?`Workspace members`:`Private (only you)`}];e.workspaceID&&n.push({label:`Workspace`,value:t.workspaceName??e.workspaceID}),n.push({label:`Created by`,value:e.createdBySessionID?ne({kind:`session`,sessionID:e.createdBySessionID}):`You`}),n.push({label:`Created`,value:t.when(e.createdAt)},{label:`Updated`,value:t.when(e.updatedAt)}),e.state===`archived`&&n.push({label:`State`,value:`Archived (read only)`}),e.tags?.length&&n.push({label:`Tags`,value:e.tags.join(`, `)});let r=ze(e.metadata);r.length&&n.push({label:`AI actions`,value:r.join(`, `)});for(let[t,r]of Object.entries(e.metadata??{}))t!==`ai-actions`&&n.push({label:t,value:r});return n}var ft={ask:`ask`,edit:`propose-edit`,action:`run-action`};function pt(e,t){let n=/^\/([a-z]+)(?:\s+([\s\S]*))?$/.exec(e),r=n?ft[n[1]]:void 0;if(!n||!r)return{text:e};let i=n[2]??``;if(r!==`run-action`)return{kind:r,text:i};let a=/^(\S+)\s*([\s\S]*)$/.exec(i);return!a||!t.includes(a[1])?{text:e}:{kind:r,action:a[1],text:a[2]}}var mt=`hub.artifactAiHandler.v1`;function ht(e,t){try{e?.setItem(mt,t)}catch{}}function gt(e,t){let n=null;try{n=e?.getItem(`hub.artifactAiHandler.v1`)??null}catch{return}return n?t.find(e=>e.key===n):void 0}function _t(e){return[...e].reverse()}var vt=`hub.artifactAiPanel.v1`,q={min:280,max:640,default:380,share:.6};function yt(e,t){if(!Number.isFinite(e))return q.default;let n=Math.max(q.min,Math.min(q.max,Math.floor(t*q.share)));return Math.min(n,Math.max(q.min,Math.round(e)))}function bt(e){try{let t=JSON.parse(e?.getItem(`hub.artifactAiPanel.v1`)??`null`);if(!t||typeof t!=`object`)return{};let{open:n,width:r}=t;return{...typeof n==`boolean`?{open:n}:{},...typeof r==`number`&&Number.isFinite(r)?{width:r}:{}}}catch{return{}}}function xt(e,t){try{e?.setItem(vt,JSON.stringify(t))}catch{}}var St=w(`<input type=search class=aai-picker-search aria-label="Search handlers"placeholder=Find… title="Find a handler by @name, title or session ID">`),Ct=w(`<optgroup label="Your sessions">`),wt=w(`<optgroup label="New session in a workspace repo">`),Tt=w(`<span><select aria-label="Handled by"title="Who handles this request"><option value>`),Et=w(`<option>`),Dt=w(`<button type=button class=aai-recent>Use `);function Ot(){try{return window.localStorage}catch{return}}function kt(e){let[t,r]=c(``),i=()=>e.value?void 0:gt(Ot(),e.handlers),a=_(()=>Ke(e.handlers,t(),e.value)),u=()=>a().filter(e=>e.kind===`session`),d=()=>a().filter(e=>e.kind===`launch`),f=()=>!!t().trim()&&!a().some(t=>t.key!==e.value);return(()=>{var a=Tt(),c=a.firstChild,p=c.firstChild;return m(a,n(s,{get when(){return e.handlers.length>1},get children(){var n=St();return n.$$input=e=>r(e.currentTarget.value),n.addEventListener(`focus`,()=>e.onPick?.()),o(()=>n.value=t()),n}}),c),c.addEventListener(`change`,t=>e.onChange(t.currentTarget.value)),c.addEventListener(`focus`,()=>e.onPick?.()),m(p,()=>f()?`No handler matches the search`:`Choose a session…`),m(c,n(s,{get when(){return u().length},get children(){var t=Ct();return m(t,n(l,{get each(){return u()},children:t=>(()=>{var n=Et();return m(n,()=>t.label),o(()=>n.selected=t.key===e.value),o(()=>n.value=t.key),n})()})),t}}),null),m(c,n(s,{get when(){return d().length},get children(){var t=wt();return m(t,n(l,{get each(){return d()},children:t=>(()=>{var n=Et();return m(n,()=>t.label),o(()=>n.selected=t.key===e.value),o(()=>n.value=t.key),n})()})),t}}),null),m(a,n(s,{get when(){return i()},children:t=>(()=>{var n=Dt();return n.firstChild,n.$$click=()=>e.onChange(t().key),m(n,()=>t().display,null),o(e=>{var r=`Last used on this device: ${t().label}`,i=`Use ${t().display} (last used)`;return r!==e.e&&h(n,`title`,e.e=r),i!==e.t&&h(n,`aria-label`,e.t=i),e},{e:void 0,t:void 0}),n})()}),null),o(()=>b(a,`aai-picker ${e.class??``}`)),o(()=>c.value=e.value),a})()}O([`input`,`click`]);var At=`/api/agent/artifacts`,jt=50,Mt=262144,Nt=e=>e.startsWith(`text/`)||e===`application/json`||e===`image/svg+xml`,J=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Pt=e=>new M(502,`The hub answered an unexpected ${e}`);function Ft(e){let t=J(e)&&J(e.artifact)?e.artifact:e;if(!J(t)||typeof t.id!=`string`||typeof t.latestRevisionID!=`string`||typeof t.revision!=`number`)throw Pt(`artifact`);return{id:t.id,title:typeof t.title==`string`?t.title:``,kind:typeof t.kind==`string`?t.kind:`file`,state:typeof t.state==`string`?t.state:`active`,latestRevisionID:t.latestRevisionID,revision:t.revision,...typeof t.workspaceID==`string`?{workspaceID:t.workspaceID}:{},...J(t.metadata)?{metadata:t.metadata}:{}}}var It=e=>{let t=Le(J(e)?e.job:void 0);if(!t)throw Pt(`job`);return t},Lt=async(e,t,n={})=>(await L(e,{method:`POST`,json:t,headers:n})).json();async function Rt(){try{let e=await j(`/api/agent/who`),t=J(e)&&Array.isArray(e.sessions)?e.sessions:[];return new Map(t.flatMap(e=>J(e)&&typeof e.sessionID==`string`&&typeof e.name==`string`&&e.name?[[e.sessionID,e.name]]:[]))}catch{return new Map}}function zt(e){let t=e=>`${At}/${A(e)}/jobs`,n=(e,n,r=``)=>`${t(e)}/${A(n)}${r}`;return{artifact:async e=>Ft(await j(`${At}/${A(e)}`)),async revisionNumbers(e){let t=await j(`${At}/${A(e)}/revisions?limit=200`),n=J(t)&&Array.isArray(t.items)?t.items:[];return new Map(n.flatMap(e=>J(e)&&typeof e.id==`string`&&typeof e.number==`number`?[[e.id,e.number]]:[]))},jobs:async(e,n)=>Re(await j(`${t(e)}?limit=${jt}${n?`&cursor=${A(n)}`:``}`)),job:async(e,t)=>It(await j(n(e,t))),create:async(e,n,r)=>It(await Lt(t(e),n,{"idempotency-key":r})),cancel:async(e,t,r)=>It(await Lt(n(e,t,`/cancel`),{expectedRevision:r})),async apply(e,t,r){let i=await Lt(n(e,t,`/apply`),{expectedRevision:r}),a=J(i)&&J(i.revision)?i.revision:{};if(typeof a.id!=`string`)throw Pt(`revision`);return{job:It(i),revisionID:a.id,...typeof a.number==`number`?{revisionNumber:a.number}:{}}},proposal:async(e,t)=>{let r=await j(n(e,t,`/proposal`));if(!J(r)||!Array.isArray(r.files))throw Pt(`proposal`);return{...r,keep:Array.isArray(r.keep)?r.keep:[],truncated:r.truncated===!0}},async revisionFiles(e,t){let n=await j(`${At}/${A(e)}/revisions/${A(t)}`),r=J(n)&&J(n.revision)&&Array.isArray(n.revision.blobs)?n.revision.blobs:[],i=Mt,a=[];for(let n of r){if(!J(n)||typeof n.hash!=`string`||typeof n.mediaType!=`string`||typeof n.bytes!=`number`)continue;let r={...typeof n.path==`string`?{path:n.path}:{},hash:n.hash,mediaType:n.mediaType,bytes:n.bytes};Nt(n.mediaType)?n.bytes>i?a.push({...r,omitted:`budget`}):(i-=n.bytes,a.push({...r,text:await(await L(`${At}/${A(e)}/revisions/${A(t)}/blobs/${A(n.hash)}`)).text()})):a.push({...r,omitted:`binary`})}return a},async handlers(t){let[n,r]=await Promise.all([(async()=>{if(!t.workspaceID)return[];try{let e=await j(`/api/agent/workspaces/${A(t.workspaceID)}/bindings`);return(J(e)&&Array.isArray(e.bindings)?e.bindings:[]).flatMap(e=>J(e)&&typeof e.id==`string`&&typeof e.machineID==`string`&&typeof e.repo==`string`?[{id:e.id,machineID:e.machineID,repo:e.repo,...typeof e.label==`string`?{label:e.label}:{}}]:[])}catch{return[]}})(),Rt()]);return Ge({sessions:e.sessions().map(e=>r.get(e.id)?{...e,name:r.get(e.id)}:e),bindings:n,machines:e.machines()})}}}var Bt=w(`<span>an unknown revision`),Vt=w(`<button type=button class=aai-link>`),Ht=w(`<span>`),Ut=w(`<strong class=aai-older>You are viewing an older revision.`),Wt=w(`<p class=aai-sub>Requests use the latest revision (<!>).`),Gt=w(`<p class=aai-note role=status>Loading AI requests…`),Kt=w(`<button type=button class="btn small aai-older-btn">Load older requests`),qt=w(`<ol class=aai-jobs aria-label="AI request history">`),Jt=w(`<p class=aai-note>Could not list handlers: `),Yt=w(`<p class=aai-note role=status>`),Xt=w(`<div class=aai-confirm role=group aria-label="Confirm action"><p>Run <strong></strong> on <!>, handled by <strong></strong>? It gets a read-only copy of this revision; its answer shows here and nothing is changed.</p><div class=aai-actions><button type=button class="btn primary small">Confirm and run</button><button type=button class="btn small">Back`),Zt=w(`<select class=aai-action aria-label="Declared action"><option value>Choose an action…`),Qt=w(`<form class=aai-composer aria-label="New AI request"><div class=aai-box><div class=aai-box-top><div class=aai-seg role=radiogroup aria-label="Request type"></div></div><textarea class=aai-input rows=2></textarea><div class=aai-box-foot><span class=aai-hint>Ctrl+Enter</span><button type=submit class=aai-send><span class=aai-send-text>`),$t=w(`<section class=aai><header class=aai-head><span class=aai-mark aria-hidden=true></span><div class=aai-head-text><h2 class=aai-title>AI requests</h2></div></header><div class=aai-scroll>`),en=w(`<button type=button class="btn small">Retry`),tn=w(`<p class=aai-note> `),nn=w(`<kbd>/action `),rn=w(`<div class=aai-empty><p><strong>Ask about this artifact, or describe an edit.</strong></p><p>The session you choose gets a read-only copy. Nothing changes until you accept an edit.</p><p class=aai-tips>Tip: start with <kbd>/ask</kbd>, <kbd>/edit</kbd>.`),an=w(`<p class="aai-note err"role=alert>`),on=w(`<label class=aai-seg-item><input type=radio>`),sn=w(`<option>`),cn=w(`<span class=aai-dot aria-hidden=true>`),ln=w(`<div class=aai-answer>`),un=w(`<p class="aai-note warn"role=status>The artifact changed since this edit was proposed: accepting it will be refused. Request it again on the latest revision.`),dn=w(`<button type=button class="btn primary small">`),fn=w(`<button type=button class="btn small">Request again on the latest revision`),pn=w(`<button type=button class="btn small">`),mn=w(`<button type=button class="btn small">Continue in side chat`),hn=w(`<li class=aai-job><div class=aai-q><div class=aai-q-meta><span class=aai-badge></span><span class=aai-meta> · </span></div><p class=aai-instruction></p></div><div class=aai-a><p class="aai-meta aai-prov">On <!> · handled by </p><p role=status aria-live=polite></p><div class=aai-actions>`),gn=w(`<div class=aai-proposal>`),_n=w(`<button type=button class="btn small">Review proposed edit (<!> file<!>)`),vn=w(`<p class=aai-note role=status>Loading the proposal…`),yn=w(`<p class="aai-note err">Could not load the proposal: `),bn=w(`<ul class=aai-files aria-label="Proposed files">`),xn=w(`<p class=aai-note>Some files are too large to show here.`),Sn=w(`<li><span class=aai-file-change></span> <code>`),Cn=w(`<p class=aai-meta><code>`),wn=w(`<table class=diff><tbody>`),Tn=w(`<div class=aai-diff>`),En=w(`<p class=aai-note>`),Dn=w(`<tr><td class=ln></td><td class=ln></td><td class=code-line><span class=sign>`),On=w(`<p>`),kn={ask:`Ask`,"propose-edit":`Edit`,"run-action":`Action`},An={ask:`Ask a question (answer only)`,"propose-edit":`Propose an edit you review before it applies`,"run-action":`Run one of the artifact's declared actions`},jn=e=>e.kind===`ask`?`Question`:e.kind===`propose-edit`?`Edit`:`Action: ${e.action??`?`}`;function Mn(){return zt({sessions:()=>{let e=new Map;for(let t of he.machines??[])for(let n of t.processes)for(let t of n.sessions)e.set(t.id,n.harness||`opencode`);return ye().filter(e=>!e.hidden&&!e.archived).map(t=>({id:t.id,title:t.title,machineName:t.machineName,online:t.machineOnline,...e.get(t.id)?{harness:e.get(t.id)}:{}}))},machines:()=>(he.machines??[]).map(e=>({id:e.id,name:e.name,online:!!e.online}))})}function Nn(i){let[u,d]=c(),f=!i.controller,v=i.controller?.ai??ot({source:i.source??Mn(),artifactID:i.artifactID,onState:d});E(()=>f&&void v.load()),x(()=>f&&v.dispose());let y=()=>(f?u():i.controller.state())??v.state(),b=()=>y().revisionNumbers,S=()=>y().artifact?.latestRevisionID,[C,w]=c(`ask`),[D,O]=c(``),[k,A]=c(``),[j,M]=c(``),[N,P]=c(!1),F,I,L,R=_(()=>y().handlers.find(e=>e.key===k())),z=()=>C()===`ask`?`Ask`:C()===`propose-edit`?`Propose edit`:j()?`Run ${j()}…`:`Run action…`,ee=_(()=>_t(y().jobs));g(e(()=>[y().jobs.length,i.tailCount??0],()=>queueMicrotask(()=>L&&(L.scrollTop=L.scrollHeight))));async function B(){let e=k(),t=await v.request({kind:C(),instruction:D(),...e?{handlerKey:e}:{},...C()===`run-action`&&j()?{action:j()}:{}});P(!1),t&&(O(``),ht(Ot(),e))}function te(e){e?.preventDefault(),!y().sending&&(C()===`run-action`&&j()&&k()?(P(!0),queueMicrotask(()=>F?.focus())):B())}function V(e){let t=pt(e,y().actions);t.kind&&/\s$/.test(e)?(w(t.kind),t.action&&M(t.action),P(!1),O(t.text),I&&(I.value=t.text)):O(e)}async function ne(e){if(await v.accept(e.id)){let e=S();e&&i.onRevised?.(e)}}let H=(e,t=``)=>n(s,{when:e,get fallback(){return(()=>{var e=Bt(),n=e.firstChild;return m(e,t,n),e})()},children:e=>n(s,{get when(){return i.onShowRevision},get fallback(){return(()=>{var n=Ht();return m(n,()=>t+We(e(),b())),n})()},get children(){var n=Vt();return n.$$click=()=>i.onShowRevision?.(e()),m(n,()=>t+We(e(),b())),n}})});return(()=>{var e=$t(),c=e.firstChild,u=c.firstChild,d=u.nextSibling,f=d.firstChild,g=c.nextSibling;m(u,n(T,{name:`spark`})),m(d,n(s,{get when(){return y().status===`ready`},get children(){var e=Wt(),t=e.firstChild.nextSibling;return t.nextSibling,m(e,()=>H(S()),t),m(e,n(s,{get when(){return r(()=>!!(i.revisionID&&S()))()&&i.revisionID!==S()},get children(){return[` `,Ut()]}}),null),e}}),null),m(c,()=>i.headerActions,null);var _=L;return typeof _==`function`?t(_,g):L=g,m(g,n(p,{get children(){return[n(a,{get when(){return y().status===`loading`},get children(){return Gt()}}),n(a,{get when(){return r(()=>y().status===`error`)()&&y().error},children:e=>(()=>{var t=tn(),r=t.firstChild;return m(t,()=>e().text,r),m(t,n(s,{get when(){return e().kind===`error`||e().kind===`offline`},get children(){var e=en();return e.$$click=()=>void v.load(),e}}),null),o(n=>{var r=e().kind===`error`,i=e().kind===`error`?`alert`:`status`;return r!==n.e&&t.classList.toggle(`err`,n.e=r),i!==n.t&&h(t,`role`,n.t=i),n},{e:void 0,t:void 0}),t})()}),n(a,{get when(){return y().status===`ready`},get children(){return[n(s,{get when(){return y().more},get children(){var e=Kt();return e.$$click=()=>void v.more(),o(t=>{var n=y().loadingMore,r=y().loadingMore;return n!==t.e&&(e.disabled=t.e=n),r!==t.t&&h(e,`aria-busy`,t.t=r),t},{e:void 0,t:void 0}),e}}),n(s,{get when(){return y().jobs.length},get fallback(){return(()=>{var e=rn(),t=e.firstChild.nextSibling.nextSibling,r=t.firstChild.nextSibling.nextSibling.nextSibling.nextSibling;return m(t,n(s,{get when(){return y().actions.length},get children(){return[` `,`or `,(()=>{var e=nn();return e.firstChild,m(e,()=>y().actions[0],null),e})()]}}),r),e})()},get children(){var e=qt();return m(e,n(l,{get each(){return ee()},children:e=>n(Pn,{job:e,get state(){return y()},revisionRef:H,onCancel:()=>void v.cancel(e.id),onReview:()=>void v.review(e.id),onAccept:()=>void ne(e),onRerequest:()=>void v.rerequest(e.id),get onContinue(){return i.onContinueInSideChat}})})),e}})]}})]}}),null),m(g,()=>i.threadTail,null),m(e,n(s,{get when(){return y().status===`ready`},get children(){var e=Qt(),a=e.firstChild,c=a.firstChild,u=c.firstChild,d=c.nextSibling,f=d.nextSibling,p=f.firstChild,g=p.nextSibling,_=g.firstChild;e.addEventListener(`submit`,te),m(e,n(s,{get when(){return y().sendError},children:e=>(()=>{var t=an();return m(t,()=>e().text),t})()}),a),m(e,n(s,{get when(){return y().handlersError},get children(){var e=Jt();return e.firstChild,m(e,()=>y().handlersError,null),e}}),a),m(e,n(s,{get when(){return r(()=>!!R())()&&!R().online},get children(){var e=Yt();return m(e,()=>R().kind===`session`?`That session is offline: the request is queued and delivered when it reconnects.`:`That machine is offline: the new session starts when it's back.`),e}}),a),m(e,n(s,{get when(){return N()},get children(){var e=Xt(),n=e.firstChild,r=n.firstChild.nextSibling,i=r.nextSibling.nextSibling,a=i.nextSibling.nextSibling,s=n.nextSibling.firstChild,c=s.nextSibling;e.$$keydown=e=>{e.key===`Escape`&&(e.preventDefault(),P(!1),I?.focus())},m(r,j),m(n,()=>We(S()??``,b()),i),m(a,()=>R()?.display),s.$$click=()=>void B();var l=F;return typeof l==`function`?t(l,s):F=s,c.$$click=()=>{P(!1),I?.focus()},o(()=>s.disabled=y().sending),e}}),a),m(u,n(l,{each:[`ask`,`propose-edit`,`run-action`],children:e=>{let t=()=>e===`run-action`&&y().actions.length===0;return(()=>{var n=on(),r=n.firstChild;return r.addEventListener(`change`,()=>{w(e),P(!1)}),r.value=e,m(n,()=>kn[e],null),o(a=>{var o=C()===e,s=!!t(),c=t()?`This artifact declares no AI actions`:An[e],l=`aai-mode-${i.artifactID}`,u=t();return o!==a.e&&n.classList.toggle(`on`,a.e=o),s!==a.t&&n.classList.toggle(`disabled`,a.t=s),c!==a.a&&h(n,`title`,a.a=c),l!==a.o&&h(r,`name`,a.o=l),u!==a.i&&(r.disabled=a.i=u),a},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),o(()=>r.checked=C()===e),n})()}})),m(c,n(s,{get when(){return C()===`run-action`},get children(){var e=Zt();return e.firstChild,e.addEventListener(`change`,e=>(M(e.currentTarget.value),P(!1))),m(e,n(l,{get each(){return y().actions},children:e=>(()=>{var t=sn();return t.value=e,m(t,e),t})()}),null),o(()=>e.value=j()),e}}),null),d.$$keydown=e=>{e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&te(e)},d.$$input=e=>V(e.currentTarget.value);var x=I;return typeof x==`function`?t(x,d):I=d,m(f,n(kt,{get handlers(){return y().handlers},get value(){return k()},onPick:()=>void v.reloadHandlers(),onChange:e=>(A(e),P(!1))}),p),m(g,n(T,{name:`send`}),_),m(_,(()=>{var e=r(()=>!!y().sending);return()=>e()?`Sending…`:z()})()),o(e=>{var t=C()===`ask`?`Question`:C()===`propose-edit`?`Describe the edit`:`Notes for the action (optional)`,n=C()===`ask`?`Ask about this artifact…`:C()===`propose-edit`?`Describe the edit, e.g. Add a rollback section`:`Notes for the action (optional)`,r=y().sending||N(),i=y().sending,a=y().sending?`Sending…`:z(),o=`${z()} (Ctrl+Enter)`;return t!==e.e&&h(d,`aria-label`,e.e=t),n!==e.t&&h(d,`placeholder`,e.t=n),r!==e.a&&(g.disabled=e.a=r),i!==e.o&&h(g,`aria-busy`,e.o=i),a!==e.i&&h(g,`aria-label`,e.i=a),o!==e.n&&h(g,`title`,e.n=o),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0}),o(()=>d.value=D()),e}}),null),o(t=>{var n=`aai-h-${i.artifactID}`,r=`aai-h-${i.artifactID}`;return n!==t.e&&h(e,`aria-labelledby`,t.e=n),r!==t.t&&h(f,`id`,t.t=r),t},{e:void 0,t:void 0}),e})()}function Pn(e){let t=()=>e.job,i=_(()=>qe(e.state.handlers)),c=e=>i().get(e)??ye().find(t=>t.id===e)?.title,u=()=>He(t(),c),d=()=>e.state.pending[t().id],f=()=>e.state.notices[t().id],g=()=>e.state.reviews[t().id],v=()=>e.state.artifact?.latestRevisionID,y=()=>t().kind===`propose-edit`&&t().state===`succeeded`&&t().proposal?.state===`pending`,x=()=>y()&&v()!==void 0&&t().baseRevisionID!==v(),S=()=>t().kind===`propose-edit`&&(t().proposal?.state===`conflict`||x()||f()?.stale);return(()=>{var i=hn(),_=i.firstChild,v=_.firstChild,C=v.firstChild,w=C.nextSibling,T=w.firstChild,E=v.nextSibling,O=_.nextSibling,A=O.firstChild,j=A.firstChild.nextSibling;j.nextSibling;var M=A.nextSibling,N=M.nextSibling;return m(C,()=>jn(t())),m(w,()=>Ue(t().by),T),m(w,()=>D(t().createdAt),null),m(E,()=>t().instruction),m(A,()=>e.revisionRef(t().baseRevisionID),j),m(A,()=>Ve(t().handler,c),null),m(A,n(s,{get when(){return t().proposal?.appliedRevisionID},children:t=>[` · became `,r(()=>e.revisionRef(t()))]}),null),m(M,n(s,{get when(){return u().active},get children(){return cn()}}),null),m(M,()=>u().text,null),m(O,n(s,{get when(){return t().answer},get children(){var n=ln();return m(n,()=>t().answer),o(()=>h(n,`aria-label`,`Answer from ${Ve(t().handler,c)} on ${We(t().baseRevisionID,e.state.revisionNumbers)}`)),n}}),N),m(O,n(s,{get when(){return r(()=>!!(t().proposal&&t().proposal.state!==`applied`))()&&t().proposal},children:t=>(()=>{var i=gn();return m(i,n(s,{get when(){return g()},get fallback(){return(()=>{var n=_n(),i=n.firstChild.nextSibling,a=i.nextSibling.nextSibling;return a.nextSibling,k(n,`click`,e.onReview,!0),m(n,()=>t().files.length,i),m(n,()=>t().files.length===1?``:`s`,a),m(n,(()=>{var e=r(()=>!!t().keep?.length);return()=>e()?`, ${t().keep.length} kept`:``})(),a),n})()},children:e=>n(p,{get children(){return[n(a,{get when(){return e().status===`loading`},get children(){return vn()}}),n(a,{get when(){return r(()=>e().status===`error`)()&&e()},children:e=>(()=>{var t=yn();return t.firstChild,m(t,()=>e().text,null),t})()}),n(a,{get when(){return r(()=>e().status===`ready`)()&&e()},children:e=>{let t=()=>e();return[n(s,{get when(){return t().changes.some(e=>e.path!==void 0)},get children(){var e=bn();return m(e,n(l,{get each(){return t().changes},children:e=>(()=>{var t=Sn(),n=t.firstChild,r=n.nextSibling.nextSibling;return m(n,()=>e.change),m(r,()=>e.path),o(()=>b(t,`aai-file ${e.change}`)),t})()})),e}}),n(l,{get each(){return t().diffs},children:e=>(()=>{var t=Tn();return m(t,n(s,{get when(){return e.path},get children(){var t=Cn(),n=t.firstChild;return m(n,()=>e.path),t}}),null),m(t,n(s,{get when(){return e.lines},get fallback(){return(()=>{var t=En();return m(t,()=>e.note),t})()},get children(){var t=wn(),i=t.firstChild;return m(i,n(l,{get each(){return e.lines},children:e=>(()=>{var t=Dn(),n=t.firstChild,i=n.nextSibling,a=i.nextSibling,s=a.firstChild;return m(n,()=>e.oldNo??``),m(i,()=>e.newNo??``),m(s,(()=>{var t=r(()=>e.type===`add`);return()=>t()?`+`:e.type===`del`?`−`:` `})()),m(a,()=>e.text,null),o(()=>b(t,e.type)),t})()})),o(()=>h(t,`aria-label`,`Changes${e.path?` to ${e.path}`:``}`)),t}}),null),t})()}),n(s,{get when(){return t().truncated},get children(){return xn()}})]}})]}})})),i})()}),N),m(O,n(s,{get when(){return r(()=>!!x())()&&!f()},get children(){return un()}}),N),m(O,n(s,{get when(){return f()},children:e=>(()=>{var t=On();return m(t,()=>e().text),o(n=>{var r=`aai-note ${e().kind===`info`?`ok`:e().kind===`conflict`?`warn`:`err`}`,i=e().kind===`info`?`status`:`alert`;return r!==n.e&&b(t,n.e=r),i!==n.t&&h(t,`role`,n.t=i),n},{e:void 0,t:void 0}),t})()}),N),m(N,n(s,{get when(){return y()},get children(){var t=dn();return k(t,`click`,e.onAccept,!0),m(t,()=>d()===`apply`?`Accepting…`:`Accept as new revision`),o(e=>{var n=!!d(),r=d()===`apply`;return n!==e.e&&(t.disabled=e.e=n),r!==e.t&&h(t,`aria-busy`,e.t=r),e},{e:void 0,t:void 0}),t}}),null),m(N,n(s,{get when(){return S()},get children(){var t=fn();return k(t,`click`,e.onRerequest,!0),o(()=>t.disabled=!!d()||e.state.sending),t}}),null),m(N,n(s,{get when(){return Be(t())},get children(){var t=pn();return k(t,`click`,e.onCancel,!0),m(t,()=>d()===`cancel`?`Cancelling…`:`Cancel`),o(e=>{var n=!!d(),r=d()===`cancel`;return n!==e.e&&(t.disabled=e.e=n),r!==e.t&&h(t,`aria-busy`,e.t=r),e},{e:void 0,t:void 0}),t}}),null),m(N,n(s,{get when(){return r(()=>!!e.onContinue)()&&t().handler.sessionID},get children(){var n=mn();return n.$$click=()=>e.onContinue?.(t()),n}}),null),o(e=>{var n=t().id,r=t().state,a=`${jn(t())}: ${t().instruction}`,o=`aai-status ${u().tone}`;return n!==e.e&&h(i,`data-job`,e.e=n),r!==e.t&&h(i,`data-state`,e.t=r),a!==e.a&&h(i,`aria-label`,e.a=a),o!==e.o&&b(M,e.o=o),e},{e:void 0,t:void 0,a:void 0,o:void 0}),i})()}O([`click`,`keydown`,`input`]);var Y={rows:1e3,columns:50,cellChars:2e3};function Fn(e){let t=e.length>Y.columns,n=e.slice(0,Y.columns).map(e=>i(e)),r=[];function i(e){return typeof e==`string`&&e.length>Y.cellChars?(t=!0,e.slice(0,Y.cellChars)):e}return{add(e,a){return r.length>=Y.rows?(t=!0,!1):(r.push(n.map((t,n)=>i(n<e.length?e[n]:a))),!0)},done:()=>({columns:n,rows:r,truncated:t})}}function In(e){let t=[],n=[],r=``,i=!1,a=0,o=()=>{n.push(r),r=``,(n.length!==1||n[0]!==``)&&t.push(n),n=[]};for(;a<e.length&&t.length<=Y.rows+1;){let t=e[a];i?t===`"`?e[a+1]===`"`?(r+=`"`,a++):i=!1:r+=t:t===`"`&&r===``?i=!0:t===`,`?(n.push(r),r=``):t===`
|
|
5
|
-
`||t===`\r`?(t===`\r`&&e[a+1]===`
|
|
6
|
-
`&&a++,o()):r+=t,a++}(r!==``||n.length)&&o();let[s,...c]=t;if(!s)return{columns:[],rows:[],truncated:!1};let l=Fn(s);for(let e of c)if(!l.add(e,``))break;return l.done()}var Ln=e=>{if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null};function Rn(e){if(e==null)return null;if(typeof e==`string`||typeof e==`boolean`)return e;if(typeof e==`number`)return Number.isFinite(e)?e:null;try{return JSON.stringify(e)??null}catch{return null}}function zn(e){if(Ln(e)&&Array.isArray(e.columns)&&Array.isArray(e.rows)){let t=Fn(e.columns.map(String));for(let n of e.rows)if(!t.add(Array.isArray(n)?n.map(Rn):[],null))break;return t.done()}if(Array.isArray(e)){if(e.every(Ln)){let t=[],n=new Set;for(let r of e){for(let e of Object.keys(r))n.has(e)||(n.add(e),t.push(e));if(t.length>Y.columns)break}let r=Fn(t);for(let n of e)if(!r.add(t.slice(0,Y.columns).map(e=>Rn(Object.hasOwn(n,e)?n[e]:null)),null))break;return r.done()}if(e.length&&e.every(Array.isArray)){let[t,...n]=e,r=Fn(t.map(String));for(let e of n)if(!r.add(e.map(Rn),null))break;return r.done()}}}function Bn(e,t){if(t===``)return e;let n=e;for(let e of t.split(`.`))if(Array.isArray(n)){if(!/^\d{1,6}$/.test(e))return;let t=Number(e);if(t>=n.length)return;n=n[t]}else if(Ln(n)){if(e===`__proto__`||!Object.hasOwn(n,e))return;n=n[e]}else return;return n}function Vn(e){if(typeof e==`number`)return Number.isFinite(e)?e:void 0;if(typeof e!=`string`||e.trim()===``)return;let t=Number(e.trim());return Number.isFinite(t)?t:void 0}function Hn(e,t){switch(t){case`application/json`:try{return{ok:!0,format:`json`,value:JSON.parse(e)}}catch{return{ok:!1,error:`The JSON is not valid`}}case`text/csv`:return{ok:!0,format:`table`,value:In(e)};case`text/markdown`:case`text/plain`:return{ok:!0,format:`text`,value:e};default:return{ok:!1,error:`${t} isn't data`}}}function Un(e){if(e.ok){if(e.format===`table`)return e.value;if(e.format===`json`)return zn(e.value)}}var X={widgets:24,sources:8,refreshMinSeconds:30,refreshMaxSeconds:86400,defaultRefreshSeconds:300,staleFactor:2,concurrent:4,sourceBytes:524288,titleChars:120,markdownChars:2e4,chartSeries:4,chartPoints:500,tableRows:1e3,defaultTableRows:50},Wn=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Gn=(e,t,n)=>typeof e==`number`&&Number.isSafeInteger(e)&&e>=t&&e<=n,Kn=e=>typeof e==`string`&&e.length>=1&&e.length<=120,qn=/^(?!\/)(?!.*(?:^|\/)\.\.?(?:\/|$))[A-Za-z0-9._/-]{1,200}$/,Jn=/^[A-Za-z0-9_$ -]{1,64}$/,Yn=/^[A-Za-z0-9_-]{1,40}$/,Xn={dashboard:[`v`,`title`,`refreshSeconds`,`widgets`],binding:[`artifact`,`path`,`select`],metric:[`id`,`type`,`title`,`width`,`source`,`unit`,`precision`],table:[`id`,`type`,`title`,`width`,`source`,`columns`,`limit`],chart:[`id`,`type`,`title`,`width`,`source`,`chart`,`x`,`y`],markdown:[`id`,`type`,`title`,`width`,`text`,`source`],chartSpec:[`v`,`title`,`chart`,`x`,`y`,`data`]};function Zn(e,t,n){let r=Object.keys(e).find(e=>!t.includes(e));return r===void 0?void 0:`${n} has an unknown field ${JSON.stringify(r.slice(0,40))}`}var Qn=e=>`${e.artifact}|${e.path??``}`;function $n(e,t,n,r){if(!Wn(e))return void r.push(`${t}.source must be an object`);let i=Zn(e,Xn.binding,`${t}.source`);if(i)return void r.push(i);if(!I(`artifact`,e.artifact))return void r.push(`${t}.source.artifact must be an artifact ID`);if(n!==void 0&&e.artifact===n)return void r.push(`${t}: a dashboard can't bind to itself`);if(e.path!==void 0&&(typeof e.path!=`string`||!qn.test(e.path)))return void r.push(`${t}.source.path must be a relative file path`);if(e.select!==void 0&&(typeof e.select!=`string`||e.select.length>200||!e.select.split(`.`).every(e=>Jn.test(e))))r.push(`${t}.source.select must be a dot path like "0.count"`);else return{artifact:e.artifact,...e.path===void 0?{}:{path:e.path},...e.select===void 0?{}:{select:e.select}}}function er(e,t,n,r){let i=`widget ${t+1}`;if(!Wn(e))return void r.push(`${i} must be an object`);let a=e.type;if(a!==`metric`&&a!==`table`&&a!==`chart`&&a!==`markdown`)return void r.push(`${i}: type must be metric, table, chart or markdown`);let o=Zn(e,Xn[a],i);if(o)return void r.push(o);let s=r.length;(typeof e.id!=`string`||!Yn.test(e.id))&&r.push(`${i}: id must be 1–40 letters, digits, - or _`),e.title!==void 0&&(typeof e.title!=`string`||e.title.length>X.titleChars)&&r.push(`${i}: title must be at most ${X.titleChars} characters`),e.width!==void 0&&e.width!==1&&e.width!==2&&e.width!==3&&r.push(`${i}: width must be 1, 2 or 3`);let c={id:e.id,...e.title===void 0?{}:{title:e.title},width:e.width??1};if(a===`markdown`){e.text!==void 0&&e.source!==void 0?r.push(`${i}: a markdown widget has either text or a source`):e.text===void 0&&e.source===void 0&&r.push(`${i}: a markdown widget needs text or a source`),e.text!==void 0&&(typeof e.text!=`string`||e.text.length>X.markdownChars)&&r.push(`${i}: text must be at most ${X.markdownChars} characters`);let t=e.source===void 0?void 0:$n(e.source,i,n,r);return r.length>s?void 0:{...c,type:a,...e.text===void 0?{}:{text:e.text},...t?{source:t}:{}}}let l=$n(e.source,i,n,r);if(a===`metric`)return e.unit!==void 0&&(typeof e.unit!=`string`||e.unit.length>16)&&r.push(`${i}: unit must be at most 16 characters`),e.precision!==void 0&&!Gn(e.precision,0,6)&&r.push(`${i}: precision must be 0–6`),r.length>s||!l?void 0:{...c,type:a,source:l,...e.unit===void 0?{}:{unit:e.unit},...e.precision===void 0?{}:{precision:e.precision}};if(a===`table`)return e.columns!==void 0&&(!Array.isArray(e.columns)||e.columns.length>50||!e.columns.every(Kn))&&r.push(`${i}: columns must be at most 50 column names`),e.limit!==void 0&&!Gn(e.limit,1,X.tableRows)&&r.push(`${i}: limit must be 1–${X.tableRows}`),r.length>s||!l?void 0:{...c,type:a,source:l,...e.columns===void 0?{}:{columns:e.columns},limit:e.limit??X.defaultTableRows};let u=tr(e,i,r);if(!(r.length>s||!l||!u))return{...c,type:a,source:l,...u}}function tr(e,t,n){let r=n.length;return e.chart!==`line`&&e.chart!==`bar`&&n.push(`${t}: chart must be line or bar`),Kn(e.x)||n.push(`${t}: x must be a column name`),(!Array.isArray(e.y)||e.y.length<1||e.y.length>X.chartSeries||!e.y.every(Kn))&&n.push(`${t}: y must be 1–${X.chartSeries} column names`),n.length>r?void 0:{chart:e.chart,x:e.x,y:e.y}}function nr(e,t={}){if(!Wn(e))return{ok:!1,problems:[`A dashboard must be a JSON object`]};if(e.v!==1)return{ok:!1,problems:[`v must be 1 (this console reads dashboard schema v1)`]};let n=Zn(e,Xn.dashboard,`The dashboard`);if(n)return{ok:!1,problems:[n]};let r=[];if(e.title!==void 0&&(typeof e.title!=`string`||e.title.length>X.titleChars)&&r.push(`title must be at most ${X.titleChars} characters`),e.refreshSeconds!==void 0&&!Gn(e.refreshSeconds,X.refreshMinSeconds,X.refreshMaxSeconds)&&r.push(`refreshSeconds must be ${X.refreshMinSeconds}–${X.refreshMaxSeconds}`),!Array.isArray(e.widgets))return{ok:!1,problems:[...r,`widgets must be a list`]};if(e.widgets.length>X.widgets)return{ok:!1,problems:[`A dashboard has at most ${X.widgets} widgets`,...r]};let i=e.widgets.flatMap((e,n)=>er(e,n,t.selfID,r)??[]);return new Set(i.map(e=>e.id)).size!==i.length&&r.unshift(`widget ids must be unique`),new Set(i.flatMap(e=>e.source?[Qn(e.source)]:[])).size>X.sources&&r.unshift(`A dashboard reads at most ${X.sources} data sources (artifact + file)`),r.length?{ok:!1,problems:r}:{ok:!0,spec:{v:1,...e.title===void 0?{}:{title:e.title},refreshSeconds:e.refreshSeconds??X.defaultRefreshSeconds,widgets:i}}}function rr(e,t,n){let r=e.columns.indexOf(t);if(r<0)return{ok:!1,error:`No column "${t}"`};let i=n.map(t=>e.columns.indexOf(t)),a=n.find((e,t)=>i[t]<0);if(a!==void 0)return{ok:!1,error:`No column "${a}"`};let o=e.rows.slice(0,X.chartPoints);return{ok:!0,chart:{labels:o.map(e=>String(e[r]??``)),series:n.map((e,t)=>({name:e,values:o.map(e=>Vn(e[i[t]])??null)})),truncated:e.truncated||e.rows.length>o.length}}}function ir(e){if(!Wn(e))return{ok:!1,error:`A chart must be a JSON object`};if(e.v!==1)return{ok:!1,error:`v must be 1`};let t=Zn(e,Xn.chartSpec,`The chart`);if(t)return{ok:!1,error:t};let n=[],r=tr(e,`The chart`,n);if(!r)return{ok:!1,error:n[0]};if(e.title!==void 0&&(typeof e.title!=`string`||e.title.length>X.titleChars))return{ok:!1,error:`title is too long`};let i=zn(e.data);if(!i)return{ok:!1,error:`data must be a table (a list of objects, a list of lists or {columns, rows})`};let a=rr(i,r.x,r.y);return a.ok?{ok:!0,kind:r.chart,...e.title===void 0?{}:{title:e.title},chart:a.chart}:a}function ar(e){let t=e&&typeof e==`object`?e:{},n=typeof t.status==`number`?t.status:0;return t.name===`NetworkError`||n===503||t.code===`offline`?{kind:`offline`,text:`Can't reach the hub; showing the last data loaded.`}:n===404||t.code===`not_found`?{kind:`not_found`,text:`The source artifact doesn't exist or you can't see it.`}:n===401||n===403?{kind:`forbidden`,text:`This device isn't allowed to read the source artifact.`}:n===422||t.code===`unsupported`?{kind:`unsupported`,text:`Artifacts aren't supported on this hub.`}:t.name===`TooLargeError`||t.code===`too_large`?{kind:`too_large`,text:`The source file is larger than ${X.sourceBytes/1024} KiB.`}:{kind:`error`,text:`Could not read the source: ${typeof t.message==`string`&&t.message?t.message:`HTTP ${n}`}`}}function or(e){let t=new Map;for(let n of e.widgets)n.source&&!t.has(Qn(n.source))&&t.set(Qn(n.source),{artifact:n.source.artifact,...n.source.path?{path:n.source.path}:{}});return[...t.values()]}function sr(e,t,n){let r=or(e),i=new Map(r.map(e=>[Qn(e),{status:`loading`}])),a,o=!1,s=(e,t)=>{o||(i.set(e,t),n.onChange())},c=(e,t)=>{let r=i.get(e),a=n.now();s(e,r?.status===`ready`?{...r,error:t,failedAt:a}:{status:`error`,error:t,failedAt:a})};async function l(e){let r=Qn(e);try{let{data:i,revisionNumber:a}=await t.read(e);i.ok?s(r,{status:`ready`,data:i,revisionNumber:a,loadedAt:n.now()}):c(r,{kind:`invalid`,text:i.error})}catch(e){c(r,ar(e))}}function u(){if(o)return Promise.resolve();if(a)return a;let e=[...r];return a=Promise.all(Array.from({length:Math.min(X.concurrent,e.length)},async()=>{for(let t=e.shift();t;t=e.shift())await l(t)})).then(()=>{a=void 0}),a}return{refresh:u,bindings:()=>r,state:e=>i.get(e),get refreshing(){return a!==void 0},dispose(){o=!0}}}function cr(e){if(!e.ok||e.format===`text`)return;if(e.format===`json`)return e.value;let{columns:t,rows:n}=e.value;return n.map(e=>Object.fromEntries(t.map((t,n)=>[t,e[n]??null])))}function lr(e,t){return t===void 0?Un(e):zn(Bn(cr(e),t))}function ur(e,t){let n=Vn(e);if(n!==void 0)return t===void 0?String(Math.round(n*1e6)/1e6):n.toFixed(t);if(typeof e==`string`||typeof e==`boolean`)return String(e)}function dr(e,t){switch(e.type){case`markdown`:return t.ok&&t.format===`text`?{kind:`markdown`,text:t.value.slice(0,X.markdownChars)}:`This widget needs a Markdown or text source.`;case`metric`:{if(!t.ok||t.format===`text`)return`This widget needs JSON or CSV data.`;let n=ur(Bn(cr(t),e.source.select??``),e.precision);return n===void 0?`No single value at "${e.source.select??``}".`:{kind:`metric`,text:n,...e.unit?{unit:e.unit}:{}}}case`table`:{let n=lr(t,e.source.select);if(!n)return`This widget needs table data (CSV or a JSON list).`;let r=e.columns?e.columns.map(e=>n.columns.indexOf(e)).filter(e=>e>=0):n.columns.map((e,t)=>t);if(!r.length)return`None of the widget's columns are in the data.`;let i=n.rows.slice(0,e.limit).map(e=>r.map(t=>e[t]??null));return{kind:`table`,table:{columns:r.map(e=>n.columns[e]),rows:i,truncated:n.truncated||n.rows.length>i.length}}}case`chart`:{let n=lr(t,e.source.select);if(!n)return`This widget needs table data (CSV or a JSON list).`;let r=rr(n,e.x,e.y);return r.ok?{kind:`chart`,chart:r.chart,type:e.chart}:r.error}}}function fr(e,t,n,r){if(e.type===`markdown`&&e.text!==void 0)return{status:`ready`,stale:!1,content:{kind:`markdown`,text:e.text}};if(!t||t.status===`loading`)return{status:`loading`};if(t.status===`error`)return{status:`error`,text:t.error.text};let i=dr(e,t.data);return typeof i==`string`?{status:`error`,text:i}:{status:`ready`,stale:t.error!==void 0||n-t.loadedAt>X.staleFactor*r,updatedAt:t.loadedAt,revisionNumber:t.revisionNumber,...t.error?{error:t.error.text}:{},content:i}}var pr=w(`<a class="av-download btn small"rel=noopener> <span class=faint>(<!>)`),mr=w(`<div class=cv><div class=cv-head><span class=cv-name></span><span class=cv-lang></span><span class=cv-count> line</span></div><div class=cv-scroll tabindex=0 role=region><pre class=cv-code><code>`),hr=w(`<span class=cv-line><span class=cv-ln aria-hidden=true></span><span class=cv-tx>`),gr=w(`<span>`),_r=w(`<pre class=av-text>`),vr=w(`<div class=av-image-wrap><img class=av-image decoding=async referrerpolicy=no-referrer>`),yr=w(`<p class=av-note>Only part of the data is shown (limits: rows, columns or cell length).`),br=w(`<div class=av-table-wrap><table class=av-table><thead><tr></tr></thead><tbody>`),xr=w(`<th scope=col>`),Sr=w(`<tr>`),Cr=w(`<td>`),wr=w(`<figure class=av-chart><svg viewBox="0 0 600 240"role=img preserveAspectRatio=none><line class=av-axis></line><text class=av-tick text-anchor=end></text><text class=av-tick text-anchor=end></text></svg><figcaption class=av-legend><button type=button class="btn small">`),Tr=w(`<svg><text class=av-tick y=232 text-anchor=middle></svg>`,!1,!0,!1),Er=w(`<svg><rect class=av-bar></svg>`,!1,!0,!1),Dr=w(`<svg><polyline class=av-line fill=none stroke-width=2></svg>`,!1,!0,!1),Or=w(`<span><i></i> `),kr=w(`<div class=av-isolated role=note><p>This <!> artifact opens in the isolated viewer. It isn't shown inside the console, so its scripts and styles can't reach your hub session.`);function Ar(e){return e.path??`${e.mediaType} file`}var jr=e=>e<1024?`${e} B`:`${Math.ceil(e/1024)} KiB`;function Mr(e){return(()=>{var t=pr(),n=t.firstChild,r=n.nextSibling,i=r.firstChild.nextSibling;return i.nextSibling,m(t,()=>e.label??`Download ${Ar(e.file)}`,n),m(r,()=>jr(e.file.bytes),i),o(n=>{var r=ie(e.artifactID,e.revisionID,e.file.hash),i=e.file.path?.split(`/`).pop()??``;return r!==n.e&&h(t,`href`,n.e=r),i!==n.t&&h(t,`download`,n.t=i),n},{e:void 0,t:void 0}),t})()}function Nr(e){let[t,r]=c(!1),[a,l]=c(!1),u;x(()=>clearTimeout(u));let f=_(()=>ct(oe(e.lang,e.text))),p=()=>ut(e.file,e.lang),g=async()=>{await ae(e.text)&&(l(!0),clearTimeout(u),u=setTimeout(()=>l(!1),1500))};return(()=>{var c=mr(),l=c.firstChild,u=l.firstChild,_=u.nextSibling,v=_.nextSibling,y=v.firstChild,x=l.nextSibling,S=x.firstChild,w=S.firstChild;return m(l,n(T,{name:`code`}),u),m(u,()=>p().name),m(_,()=>p().language),m(v,()=>f().length,y),m(v,()=>f().length===1?``:`s`,null),m(l,n(C,{icon:`wrap`,get label(){return t()?`Scroll long lines`:`Wrap long lines`},get"aria-pressed"(){return t()},onClick:()=>r(!t())}),null),m(l,n(C,{get icon(){return a()?`check`:`copy`},get label(){return a()?`Copied`:`Copy code`},onClick:()=>void g()}),null),m(w,n(d,{get each(){return f()},children:(e,t)=>(()=>{var r=hr(),i=r.firstChild,a=i.nextSibling;return h(i,`data-n`,t+1),m(a,n(d,{get each(){return e()},children:e=>n(s,{get when(){return e().kind},get fallback(){return e().text},get children(){return(()=>{var t=gr();return m(t,()=>e().text),o(()=>b(t,`tok-${e().kind}`)),t})()}})})),r})()})),o(n=>{var r=!!t(),a=String(String(f().length).length),o=e.file?.path,s=`${p().name} source`,l=e.lang||void 0;return r!==n.e&&c.classList.toggle(`wrap`,n.e=r),a!==n.t&&i(c,`--cv-digits`,n.t=a),o!==n.a&&h(u,`title`,n.a=o),s!==n.o&&h(x,`aria-label`,n.o=s),l!==n.i&&h(S,`data-lang`,n.i=l),n},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),c})()}function Pr(e){return(()=>{var t=_r();return m(t,()=>e.text),t})()}function Fr(e){let t=_(t=>(t&&URL.revokeObjectURL(t),URL.createObjectURL(new Blob([e.bytes],{type:e.mediaType}))));return x(()=>URL.revokeObjectURL(t())),(()=>{var n=vr(),r=n.firstChild;return o(n=>{var i=t(),a=e.alt;return i!==n.e&&h(r,`src`,n.e=i),a!==n.t&&h(r,`alt`,n.t=a),n},{e:void 0,t:void 0}),n})()}var Ir=e=>e==null?``:String(e);function Lr(e){return(()=>{var t=br(),r=t.firstChild,i=r.firstChild,a=i.firstChild,c=i.nextSibling;return m(a,n(l,{get each(){return e.table.columns},children:e=>(()=>{var t=xr();return m(t,e),t})()})),m(c,n(d,{get each(){return e.table.rows},children:e=>(()=>{var t=Sr();return m(t,n(d,{get each(){return e()},children:e=>(()=>{var t=Cr();return m(t,()=>Ir(e())),o(()=>b(t,typeof e()==`number`?`num`:void 0)),t})()})),t})()})),m(t,n(s,{get when(){return e.table.truncated},get children(){return yr()}}),null),o(()=>h(r,`aria-label`,e.label)),t})()}var Rr=600,zr=240,Z={l:44,r:8,t:10,b:28},Br=[`var(--accent)`,`#c26b1a`,`#6b5bd6`,`#2f8f4e`];function Vr(e){let t=_(()=>e.chart.series.flatMap(e=>e.values.filter(e=>e!==null))),r=_(()=>Math.min(0,...t())),a=_(()=>{let e=Math.max(0,...t());return e===r()?r()+1:e}),u=e=>Z.t+(zr-Z.t-Z.b)*(1-(e-r())/(a()-r())),f=()=>Math.max(1,e.chart.labels.length),p=()=>(Rr-Z.l-Z.r)/f(),g=e=>Z.l+p()*e+p()/2,v=()=>Math.max(1,Math.ceil(f()/10)),y=()=>`${e.type===`bar`?`Bar`:`Line`} chart${e.title?` of ${e.title}`:``}: ${e.chart.series.map(e=>e.name).join(`, `)} by ${e.chart.labels.length} points`,[b,x]=c(!1),S=()=>({columns:[``,...e.chart.series.map(e=>e.name)],rows:e.chart.labels.map((t,n)=>[t,...e.chart.series.map(e=>e.values[n]??null)]),truncated:e.chart.truncated});return(()=>{var t=wr(),c=t.firstChild,f=c.firstChild,_=f.nextSibling,C=_.nextSibling,w=c.nextSibling,T=w.firstChild;return m(_,()=>Hr(a())),m(C,()=>Hr(r())),m(c,n(d,{get each(){return e.chart.labels},children:(e,t)=>n(s,{get when(){return t%v()===0},get children(){var n=Tr();return m(n,()=>e().slice(0,12)),o(()=>h(n,`x`,g(t))),n}})}),null),m(c,n(d,{get each(){return e.chart.series},children:(t,r)=>e.type===`bar`?n(d,{get each(){return t().values},children:(t,i)=>{let a=()=>p()*.8/e.chart.series.length;return n(s,{get when(){return t()!==null},get children(){var e=Er();return o(n=>{var o=Z.l+p()*i+p()*.1+a()*r,s=Math.min(u(t()),u(0)),c=Math.max(1,a()-1),l=Math.max(1,Math.abs(u(0)-u(t()))),d=Br[r%Br.length];return o!==n.e&&h(e,`x`,n.e=o),s!==n.t&&h(e,`y`,n.t=s),c!==n.a&&h(e,`width`,n.a=c),l!==n.o&&h(e,`height`,n.o=l),d!==n.i&&h(e,`fill`,n.i=d),n},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),e}})}}):(()=>{var e=Dr();return o(n=>{var i=Br[r%Br.length],a=t().values.flatMap((e,t)=>e===null?[]:[`${g(t)},${u(e)}`]).join(` `);return i!==n.e&&h(e,`stroke`,n.e=i),a!==n.t&&h(e,`points`,n.t=a),n},{e:void 0,t:void 0}),e})()}),null),m(w,n(l,{get each(){return e.chart.series},children:(e,t)=>(()=>{var n=Or(),r=n.firstChild;return r.nextSibling,m(n,()=>e.name,null),o(e=>i(r,`background`,Br[t()%Br.length])),n})()}),T),T.$$click=()=>x(!b()),m(T,()=>b()?`Hide data`:`Show data`),m(t,n(s,{get when(){return b()},get children(){return n(Lr,{get table(){return S()}})}}),null),o(e=>{var t=y(),n=Z.l,i=Rr-Z.r,o=u(0),s=u(0),l=Z.l-6,d=u(a())+4,p=Z.l-6,m=u(r())+4,g=b();return t!==e.e&&h(c,`aria-label`,e.e=t),n!==e.t&&h(f,`x1`,e.t=n),i!==e.a&&h(f,`x2`,e.a=i),o!==e.o&&h(f,`y1`,e.o=o),s!==e.i&&h(f,`y2`,e.i=s),l!==e.n&&h(_,`x`,e.n=l),d!==e.s&&h(_,`y`,e.s=d),p!==e.h&&h(C,`x`,e.h=p),m!==e.r&&h(C,`y`,e.r=m),g!==e.d&&h(T,`aria-expanded`,e.d=g),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0,d:void 0}),t})()}function Hr(e){let t=Math.abs(e);return t>=1e6?`${Math.round(e/1e5)/10}M`:t>=1e3?`${Math.round(e/100)/10}k`:String(Math.round(e*100)/100)}function Ur(e){return(()=>{var t=kr(),n=t.firstChild,r=n.firstChild.nextSibling;return r.nextSibling,m(n,()=>e.kind===`app`?`app`:`HTML`,r),m(t,()=>e.children,null),t})()}O([`click`]);var Wr=w(`<div class="av-note err"role=alert><p>This dashboard can't be shown:</p><ul>`),Gr=w(`<li>`),Kr=w(`<h2 class=dash-title>`),qr=w(`<section class=dash><div class=dash-bar><span class=faint>Refreshes every <!> while open · <!> of at most <!> sources</span><button type=button class="btn small dash-refresh">Refresh</button></div><div class=dash-grid>`),Jr=w(`<article><header class=dash-head><h3>`),Yr=w(`<span class=dash-stale>Stale · updated `),Xr=w(`<span class="dash-rev faint">rev `),Zr=w(`<p class=faint role=status>Loading…`),Qr=w(`<p class=dash-error>`),$r=w(`<small> `),ei=w(`<p class=dash-metric><span>`);function ti(e){let t=_(()=>{try{return nr(JSON.parse(e.text),{selfID:e.artifactID})}catch{return{ok:!1,problems:[`The dashboard is not valid JSON.`]}}});return n(s,{get when(){return r(()=>!!t().ok)()&&t()},keyed:!0,get fallback(){return(()=>{var e=Wr(),r=e.firstChild.nextSibling;return m(r,n(l,{get each(){return t().problems.slice(0,8)},children:e=>(()=>{var t=Gr();return m(t,e),t})()})),e})()},children:t=>n(ni,{get spec(){return t.spec},get source(){return e.source}})})}function ni(e){let[t,i]=c(0),[a,u]=c(Date.now()),[d,f]=c(!1),p=sr(e.spec,e.source,{now:Date.now,onChange:()=>i(e=>e+1)}),g=e.spec.refreshSeconds*1e3,_=async()=>{f(!0),await p.refresh(),u(Date.now()),f(!1)},v=()=>typeof document>`u`||document.visibilityState===`visible`;E(()=>{_();let e=setInterval(()=>v()&&void _(),g),t=setInterval(()=>u(Date.now()),15e3),n=()=>v()&&void _();document.addEventListener(`visibilitychange`,n),x(()=>{clearInterval(e),clearInterval(t),document.removeEventListener(`visibilitychange`,n),p.dispose()})});let y=e=>(t(),fr(e,e.source?p.state(Qn(e.source)):void 0,a(),g));return(()=>{var t=qr(),i=t.firstChild,c=i.firstChild,u=c.firstChild.nextSibling,f=u.nextSibling.nextSibling,g=f.nextSibling.nextSibling;g.nextSibling;var v=c.nextSibling,x=i.nextSibling;return m(i,n(s,{get when(){return e.spec.title},get children(){var t=Kr();return m(t,()=>e.spec.title),t}}),c),m(c,(()=>{var t=r(()=>e.spec.refreshSeconds<120);return()=>t()?`${e.spec.refreshSeconds} s`:`${Math.round(e.spec.refreshSeconds/60)} min`})(),u),m(c,()=>p.bindings().length,f),m(c,()=>X.sources,g),v.$$click=()=>void _(),m(x,n(l,{get each(){return e.spec.widgets},children:e=>(()=>{var t=Jr(),r=t.firstChild,i=r.firstChild;return m(i,()=>e.title??``),m(r,n(ri,{get view(){return y(e)},get now(){return a()}}),null),m(t,n(ii,{get view(){return y(e)},get title(){return e.title}}),null),o(n=>{var r=`dash-widget span-${e.width}`,i=e.id,a=e.title??e.id;return r!==n.e&&b(t,n.e=r),i!==n.t&&h(t,`data-widget`,n.t=i),a!==n.a&&h(t,`aria-label`,n.a=a),n},{e:void 0,t:void 0,a:void 0}),t})()})),o(n=>{var r=e.spec.title??`Dashboard`,i=d(),a=d();return r!==n.e&&h(t,`aria-label`,n.e=r),i!==n.t&&h(v,`aria-busy`,n.t=i),a!==n.a&&(v.disabled=n.a=a),n},{e:void 0,t:void 0,a:void 0}),t})()}function ri(e){let t=()=>e.view.status===`ready`?e.view:void 0;return n(s,{get when(){return r(()=>t()?.updatedAt!==void 0)()&&t()},children:t=>n(s,{get when(){return t().stale},get fallback(){return(()=>{var e=Xr();return e.firstChild,m(e,()=>t().revisionNumber,null),e})()},get children(){var n=Yr();return n.firstChild,m(n,()=>D(t().updatedAt,e.now),null),o(()=>h(n,`title`,t().error??`The data is older than two refresh intervals.`)),n}})})}function ii(e){return n(p,{get children(){return[n(a,{get when(){return e.view.status===`loading`},get children(){return Zr()}}),n(a,{get when(){return r(()=>e.view.status===`error`)()&&e.view},children:e=>(()=>{var t=Qr();return m(t,()=>e().text),t})()}),n(a,{get when(){return r(()=>e.view.status===`ready`)()&&e.view},children:t=>{let i=()=>t().content;return n(p,{get children(){return[n(a,{get when(){return r(()=>i().kind===`metric`)()&&i()},children:e=>(()=>{var t=ei(),r=t.firstChild;return m(r,()=>e().text),m(t,n(s,{get when(){return e().unit},get children(){var t=$r();return t.firstChild,m(t,()=>e().unit,null),t}}),null),t})()}),n(a,{get when(){return r(()=>i().kind===`table`)()&&i()},children:t=>n(Lr,{get table(){return t().table},get label(){return e.title}})}),n(a,{get when(){return r(()=>i().kind===`chart`)()&&i()},children:t=>n(Vr,{get chart(){return t().chart},get type(){return t().type},get title(){return e.title}})}),n(a,{get when(){return r(()=>i().kind===`markdown`)()&&i()},children:e=>n(_e,{get text(){return e().text}})})]}})}})]}})}O([`click`]);var ai=()=>new M(404,`No such artifact`),oi={async artifact(e){let t=V(await j(B(e)));if(!t)throw ai();return t},async revisions(e,t){return fe(await j(ve(e,t)))},async revision(e,t){let n=ue(await j(re(e,t)));if(!n)throw ai();return n},async bytes(e,t,n,r){return te(await L(ie(e,t,n.hash)),r)},async revise(e,t,n){let r=await L(`${B(e)}/revisions`,{method:`POST`,json:t,headers:{"idempotency-key":n}}),i=ue(await r.json());if(!i)throw new M(500,`The hub answered without a revision`);return i},async archive(e,t,n){let r=await L(`${B(e)}/${n?`archive`:`unarchive`}`,{method:`POST`,json:{expectedRevision:t}}),i=V(await r.json());if(!i)throw new M(500,`The hub answered without an artifact`);return i}},si=[`application/json`,`text/csv`,`text/markdown`,`text/plain`];function ci(e,t){return t===void 0?(e.entry===void 0?void 0:e.blobs.find(t=>t.path===e.entry))??e.blobs.find(e=>si.includes(e.mediaType))??e.blobs[0]:e.blobs.find(e=>e.path===t)}function li(e=oi){return{async read(t){let n=await e.artifact(t.artifact),r=await e.revision(n.id,n.latestRevisionID),i=ci(r,t.path);if(!i)return{data:{ok:!1,error:t.path?`The source has no file "${t.path}"`:`The source has no files`},revisionNumber:r.number};if(!si.includes(i.mediaType))return{data:{ok:!1,error:`A ${i.mediaType} file isn't data`},revisionNumber:r.number};let a=await e.bytes(n.id,r.id,i,X.sourceBytes);return{data:Hn(new TextDecoder().decode(a),i.mediaType),revisionNumber:r.number}}}}var ui=w(`<p class=faint>`),di=w(`<p class=faint>Nothing else in this workspace yet.`),fi=w(`<button type=button class="btn small">Load more`),pi=w(`<aside class=av-outputs><h2>More in </h2><ul></ul><a class=av-outputs-all>All in the library`),mi=w(`<li><a></a> <button type=button class="btn small">Pane</button><span class=faint> · `);function hi(e){let[t,i]=c({status:`loading`}),a=Se(e.source??Te,i),u={workspace:e.workspaceID,type:``};E(()=>a.load(u));let d=()=>{let n=t();return n.status===`ready`?n.items.filter(t=>t.id!==e.excludeID):[]};return(()=>{var i=pi(),c=i.firstChild;c.firstChild;var u=c.nextSibling,f=u.nextSibling;return m(c,()=>e.workspaceName,null),m(i,n(s,{get when(){return t().status===`error`},get children(){var e=ui();return m(e,()=>t().error.text),e}}),u),m(i,n(s,{get when(){return r(()=>t().status===`ready`)()&&!d().length},get children(){return di()}}),u),m(u,n(l,{get each(){return d()},children:e=>(()=>{var t=mi(),n=t.firstChild,r=n.nextSibling.nextSibling,i=r.nextSibling,a=i.firstChild;return m(n,()=>e.title||`Untitled`),r.$$click=()=>z(e.id),m(i,()=>st[e.kind],a),m(i,()=>D(e.updatedAt),null),o(t=>{var i=we(e.id),a=`Open ${e.title||`Untitled`} in a pane`;return i!==t.e&&h(n,`href`,t.e=i),a!==t.t&&h(r,`aria-label`,t.t=a),t},{e:void 0,t:void 0}),t})()})),m(i,n(s,{get when(){return r(()=>t().status===`ready`)()&&t().more},get children(){var e=fi();return e.$$click=()=>a.more(),e}}),f),o(t=>{var n=`More in ${e.workspaceName}`,r=`/artifacts?workspace=${encodeURIComponent(e.workspaceID)}`;return n!==t.e&&h(i,`aria-label`,t.e=n),r!==t.t&&h(f,`href`,t.t=r),t},{e:void 0,t:void 0}),i})()}O([`click`]);var gi=w(`<header class=av-bar><span class=av-bar-gap>`),_i=w(`<div><div class=av-empty><p class=muted role=status>Loading…`),vi=w(`<button type=button class="btn small">Retry`),yi=w(`<div><div class=av-empty><p class=av-note role=alert> `),bi=w(`<span class=av-chip>Archived`),xi=w(`<a class="icon-btn av-wide"rel=noopener aria-label=Download>`),Si=w(`<div class=av-old role=status><span>You're viewing revision <!>.</span><button type=button class="btn small">Back to latest`),Ci=w(`<span class=av-draft>You have an unsaved draft of this artifact<!>.`),wi=w(`<div class=av-status>`),Ti=w(`<p class=av-desc>`),Ei=w(`<div><header class=av-bar><span class=av-kind role=img></span><span class=av-bar-gap></span><div class=av-tools></div></header><div class=av-split><div class=av-stage><div class="av-card av-body">`),Di=w(`<span>`),Oi=w(`<div class=av-conflict role=alert><p>Someone changed this artifact since you opened it<!>. Your draft is kept; the latest revision is shown below. Save over it, or discard your draft.</p><button type=button class="btn small primary">Save over latest</button> <button type=button class="btn small">Discard draft`),ki=w(`<section class=av-latest aria-label="Latest revision"><p class=av-latest-head>Latest revision`),Ai=w(`<form class=av-edit><div class=av-edit-head><span class=av-edit-name>Editing </span><span class="faint av-wide">New revision on revision </span><span class=av-bar-gap></span><button type=button class="btn small"title="Close the editor; the draft stays on this device">Close</button><button type=button class="btn small">Discard</button><button type=submit class="btn small primary">Save</button></div><textarea>`),ji=w(`<p class="av-note err av-edit-err"role=alert>`),Mi=w(`<div class=av-files><h4>Files in revision </h4><ul>`),Ni=w(`<section class=av-details role=dialog aria-label=Details><div class=av-details-head><h3>Details</h3><button type=button class=icon-btn aria-label="Close details"title="Close details"></button></div><dl class=av-facts>`),Pi=w(`<dt>`),Fi=w(`<dd>`),Ii=w(`<li>`),Li=w(`<p class="av-note av-pad">This revision has no files.`),Ri=w(`<div class=av-download-card><p class=av-note>`),zi=w(`<p class="muted av-pad"role=status>Loading…`),Bi=w(`<article class=av-prose>`),Vi=w(`<div class=av-pad>`),Hi=w(`<p class="muted av-pad">Loading…`),Ui=w(`<p class="av-note av-pad"role=alert>`),Wi=w(`<p class="av-note err av-pad"role=alert>`),Gi=w(`<p class="av-note err av-pad">This file isn't a table (CSV or a JSON list).`),Ki=w(`<p class="av-note err av-pad">This chart can't be shown: `),qi=new Set([`markdown`,`text`,`code`,`table`,`chart`,`dashboard`]),Ji={markdown:`doc`,code:`code`,image:`image`,table:`table`,chart:`chart`,dashboard:`grid`,html:`app`,app:`app`,file:`file`};function Yi(){try{return window.localStorage}catch{return}}function Xi(){return`console-${[...crypto.getRandomValues(new Uint8Array(16))].map(e=>e.toString(16).padStart(2,`0`)).join(``)}`}function Zi(e){let t=e.source??oi,i=li(t),[l,u]=c(),[d,f]=c(),[g,S]=c([]),[w,D]=c(),[O,k]=c(),[A,j]=c(),[M,N]=c({status:`loading`}),[P,F]=c(),[I,L]=c(new Map),[R,z]=c(),[B,te]=c(0),[V,ne]=c(!1),[re,oe]=c(!1),[ce,ue]=c(!1),fe;x(()=>clearTimeout(fe));let pe=0,U=_(()=>{let e=l(),t=A();return e&&t?H(e.kind,t):void 0}),me=()=>g()[0]?.number,he=()=>A()!==void 0&&A().id===l()?.latestRevisionID,ge=()=>ne(!!Yi()?.getItem(be(e.id))),_e=()=>{let e=M();return e.status===`ready`?e.text:void 0};async function ve(n,r){let i=++pe;N({status:`loading`});try{let a=await t.revision(n.id,r);if(i!==pe)return;j(a),e.onRevision?.(a);let o=H(n.kind,a);if(!o.file||!qi.has(o.mode)&&o.mode!==`image`)return void N({status:`none`});let s=await t.bytes(n.id,a.id,o.file,o.mode===`image`?se.imageBytes:se.textBytes);if(i!==pe)return;N({status:`ready`,bytes:s,...o.mode===`image`?{}:{text:new TextDecoder().decode(s)}})}catch(e){i===pe&&N({status:`error`,error:de(e)})}}async function ye(e,n){try{let r=await t.revisions(e,n);S(e=>{let t=n?[...e,...r.items]:r.items,i=new Set;return t.filter(e=>!i.has(e.id)&&i.add(e.id))}),D(r.cursor)}catch{}}async function Se(){try{let n=await t.artifact(e.id);u(n),f(void 0),e.onArtifact?.(n),await Promise.all([ye(n.id),ve(n,O()??n.latestRevisionID)])}catch(e){f(de(e))}}E(()=>{ge(),Ce().then(e=>L(new Map(e.map(e=>[e.id,e.title])))),Se(),e.control?.({view:e=>we(e===l()?.latestRevisionID?void 0:e),reload:()=>{k(void 0),Se()}})});let we=e=>{k(e),F(void 0);let t=l();t&&ve(t,e??t.latestRevisionID)};function Te(){let e=l(),n=A(),r=U(),i=M();e&&n&&r?.file&&i.status===`ready`&&i.text!==void 0&&(F(void 0),z(le({artifactID:e.id,baseRevisionID:n.id,file:r.file,original:i.text},{revise:t.revise,storage:Yi(),newKey:Xi,onChange:()=>te(e=>e+1)})))}let Ee=()=>(B(),R()?.state());async function De(e=!1){let t=R();if(!t)return;if(e){let e=l()?.latestRevisionID;e&&t.rebase(e)}let n=await t.save();n?(z(void 0),k(void 0),await Se(),F({text:`Saved revision ${n.number}.`})):t.state().status===`conflict`&&(k(void 0),await Se()),ge()}let Oe=e=>{e&&R()?.discard(),z(void 0),ge()};async function ke(){let e=_e();e!==void 0&&await ae(e)&&(ue(!0),clearTimeout(fe),fe=setTimeout(()=>ue(!1),1500))}function Ae(){let e=l(),t=A(),n=U()?.file;if(!e||!t||!n)return;let r=document.createElement(`a`);r.href=ie(e.id,t.id,n.hash),r.download=n.path?.split(`/`).pop()??``,r.rel=`noopener`,document.body.append(r),r.click(),r.remove()}async function je(n){let r=l();if(r&&t.archive)try{let i=await t.archive(r.id,r.revision,n);u(i),e.onArtifact?.(i),F({text:n?`Archived: read only until you unarchive it.`:`Unarchived.`})}catch(e){F({text:de(e).text,error:!0}),Se()}}let W=e=>e.workspaceID?I().get(e.workspaceID)??xe(e.workspaceID,I()):`Private`,G=()=>{let e=l(),t=A(),n=M();return!!e&&!!t&&he()&&!R()&&n.status===`ready`&&n.text!==void 0&&ee(e,t)},Me=()=>{let e=l(),n=[{label:`Details`,run:()=>oe(!0)}];return _e()!==void 0&&n.push({label:`Copy contents`,run:()=>void ke()}),U()?.file&&n.push({label:`Download ${Ar(U().file)}`,run:Ae}),e&&t.archive&&n.push(`sep`,e.state===`archived`?{label:`Unarchive`,run:()=>void je(!1)}:{label:`Archive`,hint:`read only, reversible`,run:()=>void je(!0)}),n},Ne=()=>(()=>{var t=gi(),r=t.firstChild;return m(t,()=>e.lead,r),m(t,n(v,{get component(){return e.variant===`pane`?`h2`:`h1`},class:`av-title`,children:`Artifact`}),r),m(t,()=>e.trailing,null),t})();return n(p,{get children(){return[n(a,{get when(){return d()},children:t=>(()=>{var r=yi(),i=r.firstChild,a=i.firstChild,c=a.firstChild;return m(r,Ne,i),m(a,()=>t().text,c),m(a,n(s,{get when(){return t().kind===`offline`||t().kind===`error`},get children(){var e=vi();return e.$$click=()=>void Se(),e}}),null),o(()=>b(r,`av ${e.variant??`page`}`)),r})()}),n(a,{get when(){return!l()},get children(){var t=_i(),n=t.firstChild;return m(t,Ne,n),o(()=>b(t,`av ${e.variant??`page`}`)),t}}),n(a,{get when(){return l()},children:t=>(()=>{var a=Ei(),c=a.firstChild,l=c.firstChild,u=l.nextSibling,d=u.nextSibling,f=c.nextSibling,p=f.firstChild,_=p.firstChild;return m(c,()=>e.lead,l),m(l,n(T,{get name(){return Ji[t().kind]}})),m(c,n(v,{get component(){return e.variant===`pane`?`h2`:`h1`},class:`av-title`,get title(){return t().title||`Untitled`},get children(){return t().title||`Untitled`}}),u),m(c,n(Qi,{get revs(){return g()},get current(){return A()},get latestID(){return t().latestRevisionID},get more(){return w()!==void 0},onMore:()=>void ye(t().id,w()),onView:e=>we(e===t().latestRevisionID?void 0:e)}),u),m(c,n(s,{get when(){return t().state===`archived`},get children(){return bi()}}),u),m(d,n(s,{get when(){return _e()!==void 0},get children(){return n(C,{class:`av-wide`,get icon(){return ce()?`check`:`copy`},get label(){return ce()?`Copied`:`Copy`},onClick:()=>void ke()})}}),null),m(d,n(s,{get when(){return r(()=>!!A())()&&U()?.file},get children(){var e=xi();return m(e,n(T,{name:`download`})),o(n=>{var r=ie(t().id,A().id,U().file.hash),i=U().file.path?.split(`/`).pop()??``,a=`Download ${Ar(U().file)}`;return r!==n.e&&h(e,`href`,n.e=r),i!==n.t&&h(e,`download`,n.t=i),a!==n.a&&h(e,`title`,n.a=a),n},{e:void 0,t:void 0,a:void 0}),e}}),null),m(d,n(s,{get when(){return G()},get children(){return n(C,{icon:`edit`,label:`Edit`,onClick:Te})}}),null),m(d,()=>e.actions,null),m(d,n(y,{label:`Artifact actions`,items:Me}),null),m(d,()=>e.trailing,null),m(a,n(s,{get when(){return re()},get children(){return n($i,{get artifact(){return t()},get revision(){return A()},get plan(){return U()},get where(){return W(t())},onClose:()=>oe(!1)})}}),f),m(p,n(s,{get when(){return r(()=>!!A())()&&!he()},get children(){var e=Si(),t=e.firstChild,i=t.firstChild.nextSibling;i.nextSibling;var a=t.nextSibling;return m(e,n(T,{name:`info`}),t),m(t,()=>A().number,i),m(t,(()=>{var e=r(()=>!!me());return()=>e()?` of ${Math.max(me(),A().number)}`:``})(),i),a.$$click=()=>we(void 0),e}}),_),m(p,n(s,{get when(){return r(()=>!!V())()&&!R()||P()},get children(){var e=wi();return m(e,n(s,{get when(){return r(()=>!!V())()&&!R()},get children(){var e=Ci(),t=e.firstChild.nextSibling;return t.nextSibling,m(e,()=>G()?`; Edit to continue it`:``,t),e}}),null),m(e,n(s,{get when(){return P()},children:e=>(()=>{var t=Di();return m(t,()=>e().text),o(n=>{var r=e().error?`av-note err`:`av-saved`,i=e().error?`alert`:`status`;return r!==n.e&&b(t,n.e=r),i!==n.t&&h(t,`role`,n.t=i),n},{e:void 0,t:void 0}),t})()}),null),e}}),_),m(p,n(s,{get when(){return t().description},get children(){var e=Ti();return m(e,()=>t().description),e}}),_),m(_,n(s,{get when(){return r(()=>!!R())()&&Ee()},get fallback(){return n(ea,{get artifact(){return t()},get revision(){return A()},get plan(){return U()},get content(){return M()},get isolated(){return e.isolated},dash:i})},children:a=>(()=>{var c=Ai(),l=c.firstChild,u=l.firstChild;u.firstChild;var d=u.nextSibling;d.firstChild;var f=d.nextSibling.nextSibling,p=f.nextSibling,_=p.nextSibling,v=l.nextSibling;return c.addEventListener(`submit`,e=>{e.preventDefault(),De()}),m(l,n(T,{name:`edit`}),u),m(u,(()=>{var e=r(()=>!!U()?.file);return()=>e()?Ar(U().file):t().title})(),null),m(d,()=>g().find(e=>e.id===a().baseRevisionID)?.number??`?`,null),f.$$click=()=>Oe(!1),p.$$click=()=>Oe(!0),m(c,n(s,{get when(){return a().status===`conflict`},get children(){var e=Oi(),t=e.firstChild,n=t.firstChild.nextSibling;n.nextSibling;var r=t.nextSibling,i=r.nextSibling.nextSibling;return m(t,()=>a().restored?` (your draft was saved on an older revision)`:``,n),r.$$click=()=>void De(!0),i.$$click=()=>Oe(!0),e}}),v),m(c,n(s,{get when(){return r(()=>a().status===`error`)()&&a().error},children:e=>(()=>{var t=ji();return m(t,()=>e().text),t})()}),v),v.$$keydown=e=>{e.key===`s`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),De())},v.$$input=e=>R()?.setDraft(e.currentTarget.value),h(v,`spellcheck`,!1),m(c,n(s,{get when(){return a().status===`conflict`},get children(){var r=ki();return r.firstChild,m(r,n(ea,{get artifact(){return t()},get revision(){return A()},get plan(){return U()},get content(){return M()},get isolated(){return e.isolated},dash:i}),null),r}}),null),o(e=>{var n=a().status===`saving`||a().status===`conflict`,r=a().status===`saving`,i=`Edit ${t().title||`artifact`}`;return n!==e.e&&(_.disabled=e.e=n),r!==e.t&&h(_,`aria-busy`,e.t=r),i!==e.a&&h(v,`aria-label`,e.a=i),e},{e:void 0,t:void 0,a:void 0}),o(()=>v.value=a().draft),c})()})),m(f,()=>e.side,null),o(n=>{var r=`av ${e.variant??`page`}`,i=t().kind,o=st[t().kind],s=st[t().kind],c=R()?`edit`:U()?.mode;return r!==n.e&&b(a,n.e=r),i!==n.t&&h(a,`data-kind`,n.t=i),o!==n.a&&h(l,`aria-label`,n.a=o),s!==n.o&&h(l,`title`,n.o=s),c!==n.i&&h(_,`data-mode`,n.i=c),n},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),a})()})]}})}function Qi(e){let t=()=>[{section:`Versions`},...e.revs.map(t=>({label:`Revision ${t.number}${t.id===e.latestID?` (latest)`:``}`,hint:`${ne(t.author)} · ${D(t.createdAt)}`,checked:t.id===e.current?.id,run:()=>e.onView(t.id)})),...e.more?[`sep`,{label:`Older revisions…`,run:()=>e.onMore()}]:[]];return n(s,{get when(){return e.current},children:i=>n(y,{get label(){return`Version: revision ${i().number}${i().id===e.latestID?` (latest)`:``}. Show versions`},get class(){return`av-ver${i().id===e.latestID?``:` old`}`},align:`left`,get text(){return[`v`,r(()=>i().number),n(T,{name:`down`})]},items:t})})}function $i(e){let i,a,o=t=>{t.key===`Escape`&&!S(i)&&(t.preventDefault(),e.onClose())},c=t=>{!i.contains(t.target)&&!t.target.closest?.(`.menu`)&&e.onClose()};E(()=>{document.addEventListener(`keydown`,o),setTimeout(()=>document.addEventListener(`mousedown`,c),0),a.focus()}),x(()=>{document.removeEventListener(`keydown`,o),document.removeEventListener(`mousedown`,c)});let u=()=>dt(e.artifact,{...e.artifact.workspaceID?{workspaceName:e.where}:{},when:D});return(()=>{var o=Ni(),c=o.firstChild,d=c.firstChild.nextSibling,f=c.nextSibling,p=i;typeof p==`function`?t(p,o):i=o,d.$$click=()=>e.onClose();var h=a;return typeof h==`function`?t(h,d):a=d,m(d,n(T,{name:`close`})),m(o,n(s,{get when(){return e.artifact.description},get children(){var t=Ti();return m(t,()=>e.artifact.description),t}}),f),m(f,n(l,{get each(){return u()},children:e=>[(()=>{var t=Pi();return m(t,()=>e.label),t})(),(()=>{var t=Fi();return m(t,()=>e.value),t})()]})),m(o,n(s,{get when(){return r(()=>!!e.revision)()&&e.plan?.files.length},get children(){var t=Mi(),r=t.firstChild;r.firstChild;var i=r.nextSibling;return m(r,()=>e.revision.number,null),m(i,n(l,{get each(){return e.plan.files},children:t=>(()=>{var r=Ii();return m(r,n(Mr,{get artifactID(){return e.artifact.id},get revisionID(){return e.revision.id},file:t,get label(){return Ar(t)}})),r})()})),t}}),null),m(o,n(s,{get when(){return e.artifact.workspaceID},children:t=>n(hi,{get workspaceID(){return t()},get workspaceName(){return e.where},get excludeID(){return e.artifact.id}})}),null),o})()}function ea(e){let t=()=>e.content.status===`ready`?e.content.text??``:``,i=_(()=>e.plan?.mode===`table`&&e.plan.file?Un(Hn(t(),e.plan.file.mediaType)):void 0),o=_(()=>{if(e.plan?.mode===`chart`)try{return ir(JSON.parse(t()))}catch{return{ok:!1,error:`The chart is not valid JSON.`}}});return n(p,{get children(){return[n(a,{get when(){return!e.plan||!e.revision},get children(){return n(s,{get when(){return r(()=>e.content.status===`error`)()&&e.content},get fallback(){return Hi()},children:e=>(()=>{var t=Ui();return m(t,()=>e().error.text),t})()})}}),n(a,{get when(){return e.plan.mode===`isolated`},get children(){return n(s,{get when(){return e.isolated},get fallback(){return n(Ur,{get kind(){return e.artifact.kind}})},children:t=>n(s,{get when(){return e.revision?.id},keyed:!0,children:n=>t()(e.artifact,e.revision)})})}}),n(a,{get when(){return e.plan.mode===`empty`},get children(){return Li()}}),n(a,{get when(){return e.plan.mode===`download`},get children(){var t=Ri(),r=t.firstChild;return m(t,n(T,{name:`file`}),r),m(r,()=>e.plan.note),m(t,n(Mr,{get artifactID(){return e.artifact.id},get revisionID(){return e.revision.id},get file(){return e.plan.file}}),null),t}}),n(a,{get when(){return e.content.status===`loading`},get children(){return zi()}}),n(a,{get when(){return r(()=>e.content.status===`error`)()&&e.content},children:e=>(()=>{var t=Wi();return m(t,()=>e().error.text),t})()}),n(a,{get when(){return e.plan.mode===`markdown`},get children(){var e=Bi();return m(e,n(_e,{get text(){return t()}})),e}}),n(a,{get when(){return e.plan.mode===`text`},get children(){var e=Bi();return m(e,n(Pr,{get text(){return t()}})),e}}),n(a,{get when(){return e.plan.mode===`code`},get children(){return n(Nr,f({get lang(){return e.plan.lang??``},get text(){return t()}},()=>e.plan.file?{file:e.plan.file}:{}))}}),n(a,{get when(){return r(()=>e.plan.mode===`image`&&e.content.status===`ready`)()&&e.content},children:t=>n(Fr,{get bytes(){return t().bytes},get mediaType(){return e.plan.file.mediaType},get alt(){return e.artifact.title}})}),n(a,{get when(){return e.plan.mode===`table`},get children(){return n(s,{get when(){return i()},get fallback(){return Gi()},children:t=>n(Lr,{get table(){return t()},get label(){return e.artifact.title}})})}}),n(a,{get when(){return r(()=>e.plan.mode===`chart`)()&&o()},children:t=>n(s,{get when(){return r(()=>!!t().ok)()&&t()},get fallback(){return(()=>{var e=Ki();return e.firstChild,m(e,()=>t().error,null),e})()},children:t=>(()=>{var r=Vi();return m(r,n(Vr,{get chart(){return t().chart},get type(){return t().kind},get title(){return t().title??e.artifact.title}})),r})()})}),n(a,{get when(){return e.plan.mode===`dashboard`},get children(){var r=Vi();return m(r,n(ti,{get artifactID(){return e.artifact.id},get text(){return t()},get source(){return e.dash}})),r}})]}})}O([`click`,`input`,`keydown`]);var ta=w(`<section class=cmp-consent aria-label="Requests from this artifact">`),na=w(`<p role=status><span><span class=cmp-quote>“<!>”</span> `),ra=w(`<p class="cmp-note err"role=status>`),ia=w(`<select class=aai-action aria-label="Declared action"><option value>Choose an action…`),aa=w(`<p class=cmp-note role=status>`),oa=w(`<p class="cmp-note err"role=alert>`),sa=w(`<form class=cmp-card role=group aria-label="AI request from the artifact"><p class=cmp-card-head><span class=cmp-card-icon aria-hidden=true></span><span><strong></strong> <span class=faint>(<!>)</span> asks for AI help</span></p><blockquote class=cmp-instruction></blockquote><p class=cmp-note>Written by the artifact, not by you. Nothing is sent unless you send it. The handler you choose gets this text and a read-only copy of <!>; the artifact gets back only the answer, or that an edit awaits your review. Edits still need your Accept under AI requests.</p><div class=cmp-row><div class=aai-seg role=radiogroup aria-label="Request type"></div></div><div class=cmp-actions><button type=button class="btn small">Decline</button><button type=submit class="btn primary small">`),ca=w(`<label class=aai-seg-item><input type=radio>`),la=w(`<option>`),ua={ask:`Ask`,"propose-edit":`Edit`,"run-action":`Action`},da={ask:`Ask (answer only)`,"propose-edit":`Propose an edit (you review it)`,"run-action":`Run a declared action`},fa={sending:`Sending…`,running:`Sent: the answer goes back to the artifact when the handler finishes (see AI requests).`,answered:`Answered: the artifact received the answer.`,proposed:`Proposed: review and Accept it under AI requests; the artifact only knows an edit awaits review.`,declined:`Declined: the artifact was told no.`,revoked:`Withdrawn: this view of the artifact ended.`,conflict:`Not sent: the artifact changed since this view opened. Reload the artifact to ask again.`,failed:`Not completed: see AI requests for why.`,cancelled:`Cancelled.`};function pa(e){let t=e.handler;return t.session?ye().find(e=>e.id===t.session)?.machineOnline??!1:t.launch?.machine?(he.machines??[]).some(e=>e.id===t.launch.machine&&e.online):e.online}function ma(e){let t=()=>e.feed.requests().filter(e=>e.status===`awaiting`),i=()=>e.feed.requests().filter(e=>e.status!==`awaiting`).slice(-3);return n(s,{get when(){return t().length||i().length},get children(){var a=ta();return m(a,n(l,{get each(){return i()},children:e=>(()=>{var t=na(),i=t.firstChild,a=i.firstChild,s=a.firstChild.nextSibling;return s.nextSibling,a.nextSibling,m(t,n(T,{name:`app`}),i),m(a,(()=>{var t=r(()=>e.instruction.length>80);return()=>t()?`${e.instruction.slice(0,80)}…`:e.instruction})(),s),m(i,()=>fa[e.status],null),o(n=>{var r=`cmp-done ${e.status}`,i=e.status;return r!==n.e&&b(t,n.e=r),i!==n.t&&h(t,`data-status`,n.t=i),n},{e:void 0,t:void 0}),t})()}),null),m(a,n(l,{get each(){return t()},children:t=>n(ha,{request:t,get title(){return e.feed.title},get revName(){return e.feed.revName()},get state(){return e.state},onPick:()=>e.feed.reloadHandlers(),onApprove:n=>e.feed.approve(t.id,n),onDecline:()=>e.feed.decline(t.id)})}),null),a}})}function ha(e){let[t,i]=c(`ask`),[a,u]=c(``),[d,f]=c(``),[p,g]=c(!1),[v,y]=c(),b=()=>e.state()?.handlers??[],x=()=>e.state()?.actions??[],S=_(()=>b().find(e=>e.key===a())),C=()=>!!a()&&(t()!==`run-action`||!!d()),w=`cmp-kind-${e.request.id}`;async function E(n){if(n.preventDefault(),!C()||p())return;g(!0),y(void 0);let r=a(),i=await e.onApprove({kind:t(),handlerKey:r,...t()===`run-action`?{action:d()}:{}});g(!1),i?ht(Ot(),r):y(e.state()?.sendError?.text??`Not sent.`)}return(()=>{var c=sa(),g=c.firstChild,_=g.firstChild,y=_.nextSibling.firstChild,D=y.nextSibling.nextSibling,O=D.firstChild.nextSibling;O.nextSibling;var k=g.nextSibling,A=k.nextSibling,j=A.firstChild.nextSibling;j.nextSibling;var M=A.nextSibling,N=M.firstChild,P=M.nextSibling,F=P.firstChild,I=F.nextSibling;return c.addEventListener(`submit`,E),m(_,n(T,{name:`app`})),m(y,()=>e.title),m(D,()=>e.revName,O),m(k,()=>e.request.instruction),m(A,()=>e.revName,j),m(c,n(s,{get when(){return e.state()?.status===`error`},get children(){var t=ra();return m(t,()=>e.state()?.error?.text??`AI requests aren't available.`),t}}),M),m(N,n(l,{each:[`ask`,`propose-edit`,`run-action`],children:e=>{let n=()=>e===`run-action`&&!x().length;return(()=>{var r=ca(),a=r.firstChild;return a.addEventListener(`change`,()=>i(e)),h(a,`name`,w),a.value=e,m(r,()=>ua[e],null),o(i=>{var o=t()===e,s=!!n(),c=da[e],l=da[e],u=n();return o!==i.e&&r.classList.toggle(`on`,i.e=o),s!==i.t&&r.classList.toggle(`disabled`,i.t=s),c!==i.a&&h(r,`title`,i.a=c),l!==i.o&&h(a,`aria-label`,i.o=l),u!==i.i&&(a.disabled=i.i=u),i},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),o(()=>a.checked=t()===e),r})()}})),m(M,n(s,{get when(){return t()===`run-action`},get children(){var e=ia();return e.firstChild,e.addEventListener(`change`,e=>f(e.currentTarget.value)),m(e,n(l,{get each(){return x()},children:e=>(()=>{var t=la();return t.value=e,m(t,e),t})()}),null),o(()=>e.value=d()),e}}),null),m(c,n(kt,{get handlers(){return b()},get value(){return a()},get onPick(){return e.onPick},onChange:u}),P),m(c,n(s,{get when(){return r(()=>!!S())()&&!pa(S())},get children(){var e=aa();return m(e,()=>S().kind===`session`?`That session is offline: the request is queued and delivered when it reconnects.`:`That machine is offline: the new session starts when it's back.`),e}}),P),F.$$click=()=>e.onDecline(),m(I,()=>p()?`Sending…`:`Send request`),m(c,n(s,{get when(){return v()},get children(){var e=oa();return m(e,v),e}}),null),o(t=>{var n=p(),r=!C()||p()||e.state()?.status!==`ready`,i=p();return n!==t.e&&(F.disabled=t.e=n),r!==t.t&&(I.disabled=t.t=r),i!==t.a&&h(I,`aria-busy`,t.a=i),t},{e:void 0,t:void 0,a:void 0}),c})()}O([`click`]);var ga={waiting:2,answerChars:8e3},_a=class extends Error{code;constructor(e,t){super(t),this.code=e,this.name=`ConsentRefusal`}},va={denied:`The user declined this request`,revoked:`This view ended; the request was withdrawn`,conflict:`The artifact changed since this view opened; reload it to ask again`,cancelled:`The request was cancelled`,failed:`The AI request failed`,rate_limited:`At most ${ga.waiting} requests can wait for the user at once`},Q=e=>new _a(e,va[e]),ya=new Set([`succeeded`,`failed`,`cancelled`]);function ba(e){let t=e.now??Date.now,n=[],r=new Map,i=!1,a=0,o=()=>e.onChange(n),s=e=>n.find(t=>t.id===e),c=(e,t)=>{n=n.map(n=>n.id===e?{...n,...t}:n),o()},l=(e,t,n)=>{let i=r.get(e);r.delete(e),c(e,{status:t}),i&&(n instanceof _a?i.reject(n):i.resolve(n))},u=e=>e.status===`awaiting`||e.status===`sending`||e.status===`running`;function d(e){if(e.state===`cancelled`)return{status:`cancelled`,result:Q(`cancelled`)};if(e.state!==`succeeded`)return{status:`failed`,result:Q(`failed`)};if(e.kind===`propose-edit`)return{status:`proposed`,result:{status:`proposed`}};let t=e.answer??``,n=t.length>ga.answerChars;return{status:`answered`,result:{status:`answered`,answer:n?t.slice(0,ga.answerChars):t,...n?{truncated:!0}:{}}}}return{ask(s){if(i)return Promise.reject(Q(`revoked`));if(n.filter(e=>e.status===`awaiting`).length>=ga.waiting)return Promise.reject(Q(`rate_limited`));let c=`req_${++a}`;return new Promise((i,a)=>{r.set(c,{resolve:i,reject:a}),n=[...n,{id:c,instruction:s,revisionID:e.revisionID,status:`awaiting`,at:t()}],o()})},requests:()=>n,async approve(t,n){let r=s(t);if(i||!r||r.status!==`awaiting`||!n.handlerKey||n.kind===`run-action`&&(!n.action||!e.actions().includes(n.action))||n.kind!==`run-action`&&n.action!==void 0)return!1;if(e.latestRevisionID()!==e.revisionID)return l(t,`conflict`,Q(`conflict`)),!1;c(t,{status:`sending`,kind:n.kind});let a;try{a=await e.submit({kind:n.kind,instruction:r.instruction,handlerKey:n.handlerKey,...n.action?{action:n.action}:{},baseRevisionID:e.revisionID})}catch{a=void 0}if(s(t)?.status!==`sending`)return!1;if(!a)return l(t,`failed`,Q(`failed`)),!1;if(c(t,{status:`running`,jobID:a.id}),ya.has(a.state)){let e=d(a);l(t,e.status,e.result)}return!0},decline(e){s(e)?.status===`awaiting`&&l(e,`declined`,Q(`denied`))},jobs(e){if(!i)for(let t of n){if(t.status!==`running`||!t.jobID)continue;let n=e.find(e=>e.id===t.jobID);if(!n||!ya.has(n.state))continue;let r=d(n);l(t.id,r.status,r.result)}},revoke(){if(!i){i=!0;for(let e of n)u(e)&&l(e.id,`revoked`,Q(`revoked`))}}}}var xa=`hub.artifact-bridge`,Sa=[`resize`,`askAI`],$={messageChars:16384,instructionChars:2e3,idChars:64,ratePerSecond:10,burst:20,pendingAsks:2,minHeight:0,maxHeight:2e4,errorChars:200};function Ca(){let e=new Uint8Array(16);return globalThis.crypto.getRandomValues(e),Array.from(e,e=>e.toString(16).padStart(2,`0`)).join(``)}var wa=e=>typeof e==`object`&&!!e&&!Array.isArray(e)&&Object.getPrototypeOf(e)===Object.prototype,Ta=[`p`,`v`,`channel`,`type`],Ea={resize:[`height`],askAI:[`id`,`instruction`]},Da=/^[A-Za-z0-9_-]+$/,Oa=new Set([`denied`,`revoked`,`conflict`,`cancelled`,`rate_limited`,`unsupported`]);function ka(e,t){if(!wa(e))return{ok:!1,reason:`malformed`};let n;try{n=JSON.stringify(e).length}catch{return{ok:!1,reason:`malformed`}}if(n>$.messageChars)return{ok:!1,reason:`too_large`};if(e.p!==`hub.artifact-bridge`)return{ok:!1,reason:`protocol`};if(e.v!==1)return{ok:!1,reason:`version`};if(e.channel!==t)return{ok:!1,reason:`channel`};let r=e.type;if(r!==`resize`&&r!==`askAI`)return{ok:!1,reason:`type`};let i=new Set([...Ta,...Ea[r]]);if(Object.keys(e).some(e=>!i.has(e)))return{ok:!1,reason:`invalid`};if(r===`resize`){let t=e.height;return typeof t!=`number`||!Number.isFinite(t)||t<0?{ok:!1,reason:`invalid`}:{ok:!0,message:{type:r,height:t}}}let{id:a,instruction:o}=e;return typeof a!=`string`||a.length<1||a.length>$.idChars||!Da.test(a)||typeof o!=`string`||o.trim()===``||o.length>$.instructionChars?{ok:!1,reason:`invalid`}:{ok:!0,message:{type:r,id:a,instruction:o}}}function Aa(e){let t=e.now??Date.now,n=e.origins??[`null`],r=new Set,i=$.burst,a=t(),o=!0,s={p:xa,v:1,channel:e.channel},c=t=>{o&&e.post({...s,...t})},l=(e,t)=>c(t.ok?{type:`reply`,id:e,ok:!0,result:t.result}:{type:`reply`,id:e,ok:!1,error:{code:t.code,message:t.message.slice(0,$.errorChars)}}),u=t=>(e.onReject?.(t),!1),d=()=>{let e=t();return i=Math.min($.burst,i+(e-a)/1e3*$.ratePerSecond),a=e,i<1?!1:(--i,!0)},f=(t,n)=>{if(r.has(t))return l(t,{ok:!1,code:`invalid`,message:`That request ID is already in flight`});if(r.size>=$.pendingAsks)return l(t,{ok:!1,code:`rate_limited`,message:`At most ${$.pendingAsks} requests at once`});let i=e.onAskAI;if(!i)return l(t,{ok:!1,code:`unsupported`,message:`Ask AI isn't available for this artifact view`});r.add(t),Promise.resolve().then(()=>i(n)).then(e=>l(t,{ok:!0,result:e}),e=>{let n=e?.code;l(t,{ok:!1,code:typeof n==`string`&&Oa.has(n)?n:`failed`,message:e instanceof Error?e.message:`The request failed`})}).finally(()=>r.delete(t))};return{receive(t){if(!o)return!1;let r=e.source();if(r==null||t.source!==r)return u(`source`);if(!n.includes(t.origin))return u(`origin`);if(!d())return u(`rate`);let i=ka(t.data,e.channel);if(!i.ok)return u(i.reason);let a=i.message;return a.type===`resize`?e.onResize?.(Math.min($.maxHeight,Math.max($.minHeight,Math.ceil(a.height)))):f(a.id,a.instruction),!0},init(e){c({type:`init`,artifactID:e.artifactID,revisionID:e.revisionID,files:e.files.map(e=>({...e.path===void 0?{}:{path:e.path},mediaType:e.mediaType,bytes:e.bytes})),capabilities:[...Sa]})},dispose(){o=!1,r.clear()}}}var ja=`allow-scripts`,Ma=[`camera`,`microphone`,`geolocation`,`display-capture`,`clipboard-read`,`clipboard-write`,`fullscreen`,`payment`,`usb`,`serial`,`hid`,`midi`,`publickey-credentials-get`].map(e=>`${e} 'none'`).join(`; `),Na=`/artifact-host/v1/`,Pa=/^\/artifact-host\/v1\/[A-Za-z0-9._-]+\/[A-Za-z0-9._/-]*$/;function Fa(e){let t=e;if(t&&typeof t==`object`&&t.capability&&typeof t.capability.id==`string`&&typeof t.capability.expiresAt==`number`&&typeof t.base==`string`&&typeof t.url==`string`&&t.base.startsWith(Na)&&t.url.startsWith(t.base)&&Pa.test(t.url)&&Array.isArray(t.files))return{capability:t.capability,base:t.base,url:t.url,files:t.files.filter(e=>e&&typeof e.mediaType==`string`&&typeof e.bytes==`number`)}}function Ia(e,t){let n=t?.error?.message,r=typeof n==`string`?n:void 0;return e===0?{kind:`error`,message:`The hub can't be reached. Check your connection and try again.`}:e===404?{kind:`error`,message:`This artifact or revision isn't available to you.`}:e===422?{kind:`error`,message:`This hub can't run interactive artifacts.`,unsupported:!0}:e===429?{kind:`error`,message:r??`Too many artifact views are open. Close some and try again.`}:e===400?{kind:`error`,message:r??`This artifact can't run in the artifact host.`}:{kind:`error`,message:r??`The artifact view failed (${e}).`}}function La(e,t){let n=t.fetch??globalThis.fetch.bind(globalThis),r=e=>t.onState?.(e),i=encodeURIComponent,a=!1,o,s,c,l=e=>void s?.receive(e),u=()=>{let e=c;c=void 0,e&&n(`/api/agent/artifact-host/${i(e)}`,{method:`DELETE`,credentials:`same-origin`,keepalive:!0}).catch(()=>{})},d=()=>{s?.dispose(),s=void 0,window.removeEventListener(`message`,l),o?.remove(),o=void 0,u()};return r({kind:`loading`}),(async()=>{let f;try{f=await n(`/api/agent/artifacts/${i(t.artifactID)}/revisions/${i(t.revisionID)}/host`,{method:`POST`,credentials:`same-origin`,headers:{"content-type":`application/json`},body:JSON.stringify({ttlSeconds:t.ttlSeconds??1800})})}catch{a||r(Ia(0,void 0));return}let p=await f.json().catch(()=>void 0),m=f.status===201?Fa(p):void 0;if(a){m&&(c=m.capability.id,u());return}if(!m)return r(f.status===201?{kind:`error`,message:`The hub's answer wasn't an artifact view.`}:Ia(f.status,p));c=m.capability.id;let h=document.createElement(`iframe`);h.setAttribute(`sandbox`,ja),h.setAttribute(`credentialless`,``),h.setAttribute(`referrerpolicy`,`no-referrer`),h.setAttribute(`allow`,Ma),h.title=t.title,h.className=`artifact-host-frame`,o=h,s=Aa({channel:Ca(),source:()=>h.contentWindow,...t.origins?{origins:t.origins}:{},post:e=>h.contentWindow?.postMessage(e,`*`),onResize:e=>h.style.height=`${Math.max(120,Math.min($.maxHeight,e))}px`,...t.onAskAI?{onAskAI:t.onAskAI}:{},...t.onReject?{onReject:t.onReject}:{}});let g=0;h.addEventListener(`load`,()=>{g++,g===1?(s?.init({artifactID:t.artifactID,revisionID:t.revisionID,files:m.files}),r({kind:`ready`})):(d(),r({kind:`stopped`,message:`The artifact tried to navigate away, so it was stopped. Reload to run it again.`}))}),window.addEventListener(`message`,l),h.src=m.url,e.append(h)})(),{iframe:()=>o,dispose(){a=!0,d()}}}var Ra=w(`<p class=artifact-host-status role=status>Starting the artifact…`),za=w(`<section class=artifact-host><p class=artifact-host-note>Runs isolated: no access to your hub session, cookies or the network.</p><div class=artifact-host-box>`),Ba=w(`<button type=button class=artifact-host-retry>Reload`),Va=w(`<div class=artifact-host-status role=alert><p>`);function Ha(e){let[r,i]=c({kind:`loading`}),[a,l]=c(0),u,d,f=()=>{d?.dispose(),d=La(u,{artifactID:e.artifactID,revisionID:e.revisionID,title:e.title,onState:i,...e.onAskAI?{onAskAI:e.onAskAI}:{}})};E(f),x(()=>d?.dispose());let p=()=>{let e=r();return e.kind===`error`?{message:e.message,unsupported:e.unsupported===!0}:e.kind===`stopped`?{message:e.message,unsupported:!1}:void 0},g=()=>{l(a()+1),f()};return(()=>{var i=za(),c=i.firstChild.nextSibling;m(i,n(s,{get when(){return r().kind===`loading`},get children(){return Ra()}}),c),m(i,n(s,{get when(){return p()},keyed:!0,children:e=>(()=>{var t=Va(),r=t.firstChild;return m(r,()=>e.message),m(t,n(s,{get when(){return!e.unsupported},get children(){var e=Ba();return e.$$click=g,e}}),null),t})()}),c);var l=u;return typeof l==`function`?t(l,c):u=c,o(t=>{var n=`${e.title} (interactive, isolated)`,o=r().kind===`loading`,s=a();return n!==t.e&&h(i,`aria-label`,t.e=n),o!==t.t&&h(i,`aria-busy`,t.t=o),s!==t.a&&h(c,`data-attempt`,t.a=s),t},{e:void 0,t:void 0,a:void 0}),i})()}O([`click`]);var Ua=w(`<p class="cmp-disclose cmp-preview-note"><span>External resources are blocked in previews: scripts, styles, fonts and images from other sites don't load.`),Wa=w(`<div class=cmp-interactive><p class=cmp-disclose aria-label="What this artifact may do"><span><strong>Sandboxed.</strong> This artifact may: resize its frame; ask for AI help on <!> — each request waits for your consent in the AI panel, and you choose who handles it. It can't read your hub, sessions, cookies or other artifacts, or apply changes.`),Ga=w(`<li>`),Ka=w(`<details class="cmp-disclose cmp-preview-skipped"><summary></summary><ul>`),qa=()=>Object.assign(Error(`Ask AI isn't available for this artifact`),{code:`unsupported`});function Ja(e){let[t,i]=c([]),a=()=>e.state(),o=e.artifact.id,l=e.revision.id,u=ba({artifactID:o,revisionID:l,latestRevisionID:()=>a()?.artifact?.latestRevisionID,actions:()=>a()?.actions??[],submit:({kind:t,instruction:n,handlerKey:r,action:i,baseRevisionID:a})=>e.ai.requestJob({kind:t,instruction:n,handlerKey:r,...i?{action:i}:{},baseRevisionID:a}),onChange:i});g(()=>u.jobs(a()?.jobs??[]));let d=()=>We(l,a()?.revisionNumbers??new Map),f={title:e.artifact.title||`This artifact`,requests:t,revName:d,approve:(e,t)=>u.approve(e,t),decline:e=>u.decline(e),reloadHandlers:()=>void e.ai.reloadHandlers()};e.onConsent(f,!0),x(()=>{u.revoke(`closed`),e.onConsent(f,!1)});let p=e=>a()?.status===`error`?Promise.reject(qa()):u.ask(e);return(()=>{var t=Wa(),i=t.firstChild,a=i.firstChild,c=a.firstChild.nextSibling.nextSibling;return c.nextSibling,m(t,n(Ha,{artifactID:o,revisionID:l,get title(){return e.artifact.title||`Interactive artifact`},onAskAI:p}),i),m(i,n(T,{name:`lock`}),a),m(a,d,c),m(t,n(s,{get when(){return e.artifact.origin===`preview`},get children(){var e=Ua(),t=e.firstChild;return m(e,n(T,{name:`lock`}),t),e}}),null),m(t,n(s,{get when(){return r(()=>e.artifact.origin===`preview`)()&&ce(pe(o)?.skipped,pe(o)?.more)},children:e=>(()=>{var t=Ka(),r=t.firstChild,i=r.nextSibling;return m(r,()=>e().title),m(i,()=>e().items.map(e=>(()=>{var t=Ga();return m(t,e),t})()),null),m(i,n(s,{get when(){return e().more},get children(){var t=Ga();return m(t,()=>e().more),t}}),null),t})()}),null),t})()}var Ya=w(`<div class=awb-scrim aria-hidden=true>`),Xa=w(`<div class=awb-resize role=separator aria-orientation=vertical aria-label="Resize AI panel"tabindex=0>`),Za=w(`<div class=awb-grab aria-hidden=true>`),Qa=w(`<div class=awb-side>`),$a=w(`<button type=button class=icon-btn aria-label="Close AI panel"title="Close AI panel">`),eo=w(`<div>`),to=w(`<span class=awb-keep-err role=alert>`),no=w(`<button type=button class="btn small awb-refresh"title="Read the page and its files again and show the new revision">`),ro=w(`<button type=button class="btn small awb-keep"aria-label="Keep this preview as an artifact"title="Keep it as a normal artifact (previews expire a day after you last view them)">Keep`),io=w(`<span class=awb-badge aria-hidden=true>`),ao=w(`<button type=button class=awb-ai-toggle aria-label="AI panel"><span class=awb-ai-text>AI`),oo=720;function so(i){let[a,l]=c(),d=ot({source:Mn(),artifactID:i.id,onState:l});E(()=>void d.load()),x(()=>d.dispose());let[p,_]=c(),[v,y]=c(),[S,C]=c(),[w,D]=c(!1),[O,k]=c(),A=async()=>{let e=S();if(e&&!w()){D(!0),k(void 0);try{await N(`/api/agent/artifacts/${encodeURIComponent(e.id)}/keep`,{expectedRevision:e.revision});let{origin:t,...n}=e;C(n),R?.reload()}catch(e){k(`Could not keep it: ${P(e)}`)}finally{D(!1)}}},[j,M]=c(!1),[F,I]=c(),L=async()=>{let e=S()?.provenance;if(e?.path&&!j()){M(!0),I(void 0);try{await U({sessionID:e.sessionID,messageID:e.messageID,path:e.path}),R?.reload()}catch(e){I(me(e))}finally{M(!1)}}},R,z,ee=bt(Ot()),[B,te]=c(!1),[V,ne]=c(!1),[H,re]=c(ee.width??q.default),ie=()=>!B()&&xt(Ot(),{open:V(),width:H()}),ae=(e=!V())=>{ne(e),ie()};E(()=>{let e=!1,t=()=>{let t=z.clientWidth;if(!t)return;let n=B(),r=t<oo;(r!==n||!e)&&(te(r),ne(r?!1:bt(Ot()).open??!0)),e=!0,r||re(e=>yt(e,t))};t();let n=new ResizeObserver(t);n.observe(z),x(()=>n.disconnect())});let oe=()=>v()?.requests().filter(e=>e.status===`awaiting`).length??0;g(e(oe,(e,t)=>e>(t??0)&&ne(!0)));let se=()=>oe()+(a()?.jobs.filter(e=>Be(e)).length??0);function ce(e){if(e.button!==0)return;e.preventDefault();let t=e.currentTarget;t.setPointerCapture(e.pointerId);let n=z.getBoundingClientRect().right,r=z.clientWidth,i=e=>re(yt(n-e.clientX,r)),a=()=>{t.removeEventListener(`pointermove`,i),t.removeEventListener(`pointerup`,a),t.removeEventListener(`pointercancel`,a),z.classList.remove(`resizing`),ie()};z.classList.add(`resizing`),t.addEventListener(`pointermove`,i),t.addEventListener(`pointerup`,a),t.addEventListener(`pointercancel`,a)}function le(e){let t=z.clientWidth,n=e.shiftKey?64:24,r=e.key===`ArrowLeft`?H()+n:e.key===`ArrowRight`?H()-n:e.key===`Home`?q.min:e.key===`End`?q.max:void 0;r!==void 0&&(e.preventDefault(),re(yt(r,t)),ie())}let ue=[n(s,{get when(){return r(()=>!!B())()&&V()},get children(){var e=Ya();return e.$$click=()=>ae(!1),e}}),(()=>{var e=Qa();return e.$$keydown=e=>{e.key===`Escape`&&B()&&!e.defaultPrevented&&(e.preventDefault(),ae(!1))},m(e,n(s,{get when(){return!B()},get children(){var e=Xa();return e.$$keydown=le,e.$$pointerdown=ce,o(t=>{var n=q.min,r=q.max,i=H();return n!==t.e&&h(e,`aria-valuemin`,t.e=n),r!==t.t&&h(e,`aria-valuemax`,t.t=r),i!==t.a&&h(e,`aria-valuenow`,t.a=i),t},{e:void 0,t:void 0,a:void 0}),e}}),null),m(e,n(s,{get when(){return B()},get children(){return Za()}}),null),m(e,n(Nn,{get artifactID(){return i.id},controller:{ai:d,state:a},get revisionID(){return p()},onShowRevision:e=>R?.view(e),onRevised:()=>R?.reload(),onContinueInSideChat:e=>e.handler.sessionID&&ge(e.handler.sessionID),get headerActions(){return(()=>{var e=$a();return e.$$click=()=>ae(!1),m(e,n(T,{name:`close`})),e})()},get threadTail(){return n(s,{get when(){return v()},children:e=>n(ma,{get feed(){return e()},state:a})})},get tailCount(){return v()?.requests().length??0}}),null),o(t=>{var n=!!B(),r=!V(),i=B()?void 0:{width:`${H()}px`};return n!==t.e&&e.classList.toggle(`sheet`,t.e=n),r!==t.t&&(e.hidden=t.t=r),t.a=u(e,i,t.a),t},{e:void 0,t:void 0,a:void 0}),e})()];return(()=>{var e=eo(),c=z;return typeof c==`function`?t(c,e):z=e,m(e,n(Zi,f({get id(){return i.id},get variant(){return i.layout},control:e=>R=e,onRevision:e=>_(e.id),onArtifact:e=>{C(e),i.onArtifact?.(e)},isolated:(e,t)=>n(Ja,{artifact:e,revision:t,ai:d,state:a,onConsent:(e,t)=>y(n=>t?e:n===e?void 0:n)})},()=>i.lead?{lead:i.lead}:{},{get actions(){return[n(s,{get when(){return O()},get children(){var e=to();return m(e,O),e}}),n(s,{get when(){return F()},get children(){var e=to();return m(e,F),e}}),n(s,{get when(){return r(()=>S()?.origin===`preview`)()&&S()?.provenance?.path!==void 0},get children(){var e=no();return e.$$click=()=>void L(),m(e,()=>j()?`Refreshing…`:`Refresh`),o(t=>{var n=j(),r=j();return n!==t.e&&(e.disabled=t.e=n),r!==t.t&&h(e,`aria-busy`,t.t=r),t},{e:void 0,t:void 0}),e}}),n(s,{get when(){return S()?.origin===`preview`},get children(){var e=ro();return e.$$click=()=>void A(),o(()=>e.disabled=w()),e}}),r(()=>i.actions),(()=>{var e=ao(),t=e.firstChild;return e.$$click=()=>ae(),m(e,n(T,{name:`spark`}),t),m(e,n(s,{get when(){return se()},get children(){var e=io();return m(e,se),e}}),null),o(t=>{var n=V(),r=V()?`Hide the AI panel`:`Ask AI about this artifact`;return n!==t.e&&h(e,`aria-pressed`,t.e=n),r!==t.t&&h(e,`title`,t.t=r),t},{e:void 0,t:void 0}),e})()]}},()=>i.trailing?{trailing:i.trailing}:{},{side:ue}))),o(t=>{var n=`awb ${i.layout}`,r=!!B(),a=i.id;return n!==t.e&&b(e,t.e=n),r!==t.t&&e.classList.toggle(`narrow`,t.t=r),a!==t.a&&h(e,`data-artifact`,t.a=a),t},{e:void 0,t:void 0,a:void 0}),e})()}O([`click`,`keydown`,`pointerdown`]);export{so as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as e,B as t,C as n,F as r,G as i,I as a,J as o,R as s,S as c,T as l,U as u,W as d,et as f,k as p,tt as m,x as h}from"./ui-CFB4wQfF.js";import{_ as g,b as _,p as v,v as y,y as b}from"./MediaImage-Ds_JUx3a.js";import{$ as x,A as S,M as C}from"./index-LNMZCqgE.js";import w from"./Lightbox-Du56MXGX.js";var T={images:!1,links:!1,linkRel:`noopener noreferrer`,fontSize:14};function E(e){let t=e.timeoutMs??1e4,n=Math.max(1,e.concurrency??2),r=Math.max(1,e.cacheSize??64),i=e.setTimer??((e,t)=>setTimeout(e,t)),a=e.clearTimer??(e=>clearTimeout(e)),o=e.failureTtlMs??6e4,s=e.now??Date.now,c=new Map,l=new Map,u=[],d=[],f=1,p=(e,t,n)=>{for(c.delete(e),c.set(e,{result:t,expires:n});c.size>r;)c.delete(c.keys().next().value)},m=e=>{let t=c.get(e);if(t?.expires!==void 0&&s()>=t.expires)c.delete(e);else return t?.result},h=(e,t,{cacheable:n,replace:r})=>{let i=e.job;i&&(a(i.timer),e.job=void 0,r&&(e.worker.onmessage=null,e.worker.onerror=null,e.worker.terminate(),d.splice(d.indexOf(e),1)),n&&p(i.key,t,n===`briefly`?s()+o:void 0),l.delete(i.key),i.resolve(t),x())},g=(e,t)=>{if(typeof t.svg!=`string`)return{status:`error`,message:typeof t.error==`string`&&t.error?t.error:`the renderer returned no SVG`};let n=y(t.svg,e.palette);return _(n)?{status:`unsafe`}:{status:`ok`,svg:n}},b=()=>{let t={worker:e.spawn()};return t.worker.onmessage=e=>{let n=e.data,r=t.job;r&&n&&n.id===r.id&&h(t,g(r,n),{cacheable:!0,replace:!1})},t.worker.onerror=e=>h(t,{status:`error`,message:e?.message||`the diagram worker failed`},{cacheable:!1,replace:!0}),d.push(t),t};function x(){for(;u.length;){let e=d.find(e=>!e.job)??(d.length<n?b():void 0);if(!e)return;let r=u.shift(),a=f++,o=r.palette.font,s={...r,id:a,timer:void 0};e.job=s,s.timer=i(()=>h(e,{status:`error`,message:`timed out after ${t/1e3} s`},{cacheable:`briefly`,replace:!0}),t),e.worker.postMessage({id:a,source:r.source,options:o?{...T,fontFamily:o}:{...T}})}}return{render(e,t,n){let r=v(e,t),i=m(r);if(i)return p(r,i,c.get(r).expires),Promise.resolve(i);let a=l.get(r);if(a)return a;let o=new Promise(t=>u.push({key:r,source:e,palette:n,resolve:t}));return l.set(r,o),x(),o},cached(e,t){return m(v(e,t))}}}var D=p(`<p class=diagram-note>`),O=p(`<div class="code-block diagram-frame"><div class=code-head><span class=code-lang></span><button type=button class=code-btn>Diagram</button><button type=button class=code-btn>Source</button><button type=button class=code-btn>`),k=p(`<div class=diagram-block>`),A=p(`<button type=button class=code-btn>Download SVG`),j=p(`<pre class=code><code>`),M=p(`<p class=diagram-loading>Drawing diagram…`),N=p(`<button type=button class=diagram-open aria-label="Open the diagram full screen"title="Open full screen"><img alt=Diagram>`),P,F=()=>P??=E({spawn:()=>new Worker(new URL(`/assets/mermaid.worker-WDVRAh32.js`,``+import.meta.url),{type:`module`})}),I=matchMedia(`(prefers-color-scheme: dark)`),[L,R]=o(I.matches);I.addEventListener(`change`,e=>R(e.matches));var z=()=>x()===`system`?L()?`dark`:`light`:x(),B={bg:`--side`,fg:`--text`,muted:`--muted`,line:`--muted`,surface:`--raise`,"surface-alt":`--raise-2`,border:`--line-2`,accent:`--accent`,font:`--sans`,"font-mono":`--mono`};function V(){let e=getComputedStyle(document.documentElement),t={};for(let[n,r]of Object.entries(B)){let i=e.getPropertyValue(r).trim();i&&(t[n]=i)}return t}function H(e){let t=URL.createObjectURL(new Blob([e],{type:`image/svg+xml`})),n=document.createElement(`a`);n.href=t,n.download=`diagram.svg`,n.click(),setTimeout(()=>URL.revokeObjectURL(t),1e4)}function U(e){return[t(S,{get lang(){return e.lang},get text(){return e.text}}),(()=>{var t=D();return c(t,()=>e.note),t})()]}function W(p){let[h,_]=o(`diagram`),[v,y]=o(!1),[x,S]=o(),[T,E]=o(!1),[D,P]=o(!1),I=d(()=>b(p.text)),L=d(()=>(z(),V())),R,B;f(()=>clearTimeout(B)),m(()=>{let e=new IntersectionObserver(e=>y(e.some(e=>e.isIntersecting)),{rootMargin:`200px 0px`});e.observe(R),f(()=>e.disconnect())}),u(()=>{if(I()||!v())return;let e=p.text,t=L(),n=JSON.stringify(t),r=F().cached(e,n);if(r)return void S(r);let i=!0;f(()=>i=!1),F().render(e,n,t).then(e=>i&&S(e))});let W=()=>{let e=x();return e?.status===`ok`?e.svg:void 0};return(()=>{var o=k(),u=R;return typeof u==`function`?e(u,o):R=o,c(o,t(s,{get children(){return[t(r,{get when(){return I()},get children(){return t(U,{get lang(){return p.lang},get text(){return p.text},note:`Diagram too large to draw`})}}),t(r,{get when(){return n(()=>x()?.status===`error`)()&&x()},children:e=>t(U,{get lang(){return p.lang},get text(){return p.text},get note(){return`Couldn't draw this diagram: ${e().message}`}})}),t(r,{get when(){return x()?.status===`unsafe`},get children(){return t(U,{get lang(){return p.lang},get text(){return p.text},note:`Diagram not shown: the drawing had active content in it.`})}}),t(r,{when:!0,get children(){return[(()=>{var e=O(),n=e.firstChild,r=n.firstChild,o=r.nextSibling,s=o.nextSibling,u=s.nextSibling;return c(r,()=>p.lang||`mermaid`),o.$$click=()=>_(`diagram`),s.$$click=()=>_(`source`),u.$$click=async()=>{await C(p.text)&&(P(!0),clearTimeout(B),B=setTimeout(()=>P(!1),1500))},c(u,()=>D()?`Copied`:`Copy`),c(n,t(a,{get when(){return W()},children:e=>(()=>{var t=A();return t.$$click=()=>H(e()),t})()}),null),c(e,t(a,{get when(){return h()===`diagram`},get fallback(){return(()=>{var e=j(),t=e.firstChild;return c(t,()=>p.text),i(()=>l(e,`data-lang`,p.lang||void 0)),e})()},get children(){return t(a,{get when(){return W()},get fallback(){return M()},children:e=>(()=>{var t=N(),n=t.firstChild;return t.$$click=()=>E(!0),i(()=>l(n,`src`,g(e()))),t})()})}}),null),i(e=>{var t=h()===`diagram`,n=h()===`source`,r=D()?`Copied`:`Copy diagram source`;return t!==e.e&&l(o,`aria-pressed`,e.e=t),n!==e.t&&l(s,`aria-pressed`,e.t=n),r!==e.a&&l(u,`aria-label`,e.a=r),e},{e:void 0,t:void 0,a:void 0}),e})(),t(w,{get open(){return n(()=>!!T())()&&!!W()},get items(){return[{key:`diagram`,name:`Diagram`,mime:`image/svg+xml`,src:g(W()??``)}]},index:0,onClose:()=>E(!1)})]}})]}})),o})()}h([`click`]);export{W as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{$ as e,B as t,E as n,G as r,I as i,J as a,S as o,T as s,U as c,b as l,et as u,i as d,k as f,r as p,t as m,x as h}from"./ui-CFB4wQfF.js";import{i as g}from"./MediaImage-Ds_JUx3a.js";var _=f(`<div class=media-view-stage>`),v=f(`<span class="media-view-count muted small"> / `),y=f(`<div class=media-view-bar>`),b=f(`<p class=media-view-note>Couldn't load this image.`),x=f(`<p class=media-view-note>Loading…`),S=f(`<img decoding=async referrerpolicy=no-referrer>`),C=f(`<a class="btn small media-download"rel=noopener> Download`),w=6,T=(e,t,n)=>Math.min(n,Math.max(t,e));function E(f){let h=()=>f.items[T(f.index,0,Math.max(0,f.items.length-1))],E=()=>f.items.length>1,[D,O]=a(),[k,A]=a(!1),[j,M]=a(1),[N,P]=a({x:0,y:0}),F=()=>(M(1),P({x:0,y:0}));c(e([()=>f.open,()=>h()?.src],([e,t])=>{if(F(),A(!1),O(void 0),!e||!t)return;let n=!0;return g(t).then(e=>n&&O(e),()=>n&&A(!0)),()=>n=!1}));let I=e=>{E()&&f.onIndex?.((f.index+e+f.items.length)%f.items.length)};c(()=>{if(!f.open||!E())return;let e=e=>{e.key===`ArrowLeft`?I(-1):e.key===`ArrowRight`&&I(1)};window.addEventListener(`keydown`,e),u(()=>window.removeEventListener(`keydown`,e))});let L=new Map,R,z=()=>{let[e,t]=[...L.values()];return e&&t?Math.hypot(e.x-t.x,e.y-t.y):0},B=e=>{e.currentTarget.setPointerCapture?.(e.pointerId),L.set(e.pointerId,{x:e.clientX,y:e.clientY}),L.size===2&&(R={distance:z(),scale:j()})},V=e=>{let t=L.get(e.pointerId);t&&(L.set(e.pointerId,{x:e.clientX,y:e.clientY}),L.size===2&&R&&R.distance>0?M(T(R.scale*z()/R.distance,1,w)):L.size===1&&j()>1&&P(n=>({x:n.x+e.clientX-t.x,y:n.y+e.clientY-t.y})))},H=e=>{L.delete(e.pointerId),L.size<2&&(R=void 0),j()<=1&&F()};return t(m,{get open(){return f.open},get title(){return f.title??h()?.name??`Image`},class:`media-view`,get onClose(){return f.onClose},get children(){return[(()=>{var e=_();return e.addEventListener(`wheel`,e=>{e.preventDefault(),M(t=>T(t*Math.exp(-e.deltaY/300),1,w)),j()<=1&&F()}),e.$$dblclick=()=>j()>1?F():M(2.5),e.addEventListener(`pointercancel`,H),e.$$pointerup=H,e.$$pointermove=V,e.$$pointerdown=B,o(e,t(i,{get when(){return!k()},get fallback(){return b()},get children(){return t(i,{get when(){return D()},get fallback(){return x()},children:e=>(()=>{var t=S();return s(t,`draggable`,!1),r(r=>{var i=e(),a=h()?.mime===`image/svg+xml`?`fill`:void 0,o=h()?.name??`Image`,c=`translate(${N().x}px, ${N().y}px) scale(${j()})`;return i!==r.e&&s(t,`src`,r.e=i),a!==r.t&&l(t,r.t=a),o!==r.a&&s(t,`alt`,r.a=o),c!==r.o&&n(t,`transform`,r.o=c),r},{e:void 0,t:void 0,a:void 0,o:void 0}),t})()})}})),e})(),(()=>{var e=y();return o(e,t(i,{get when(){return E()},get children(){return[t(d,{icon:`back`,label:`Previous image`,onClick:()=>I(-1)}),(()=>{var e=v(),t=e.firstChild;return o(e,()=>f.index+1,t),o(e,()=>f.items.length,null),e})(),t(d,{icon:`chevron`,label:`Next image`,onClick:()=>I(1)})]}}),null),o(e,t(i,{get when(){return h()?.download},children:e=>(()=>{var n=C(),i=n.firstChild;return o(n,t(p,{name:`download`}),i),r(t=>{var r=e(),i=h()?.name.split(`/`).pop()||`image`;return r!==t.e&&s(n,`href`,t.e=r),i!==t.t&&s(n,`download`,t.t=i),t},{e:void 0,t:void 0}),n})()}),null),e})()]}})}h([`pointerdown`,`pointermove`,`pointerup`,`dblclick`]);export{E as default};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Lightbox-Du56MXGX.js","assets/ui-CFB4wQfF.js","assets/Lightbox-C8KNKwOA.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{A as e,B as t,C as n,F as r,G as i,I as a,J as o,L as s,N as c,O as l,R as u,S as d,T as f,U as p,Z as m,b as h,et as g,k as _,r as v,tt as ee,x as y}from"./ui-CFB4wQfF.js";import{t as b}from"./preload-helper-BLdHbfdN.js";var x=51200;function S(e){let t=e.toLowerCase();return t===`mermaid`||t===`mmd`}var C=/^(`{3,}|~{3,})\s*([^\s`]*)/,w=/^(`{3,}|~{3,})\s*$/,T=/^[\s>]*/,E=/^(?:[-*+]|\d{1,9}[.)])\s+/;function D(e){let t;for(let n of e.split(/\r\n?|\n/)){let e=n.replace(T,``);if(t){let n=w.exec(e);n&&n[1][0]===t[0]&&n[1].length>=t.length&&(t=void 0);continue}e=e.replace(E,``).replace(T,``);let r=C.exec(e);r&&(t=r[1])}return t!==void 0}function O(e){let t=[],n;for(let r of e.split(`
|
|
3
|
-
`)){if(n){let e=w.exec(r.trim()),i=!!e&&e[1][0]===n.marker[0]&&e[1].length>=n.marker.length;n.diagram||t.push(r),i&&(n=void 0);continue}let e=/^\s{0,3}(`{3,}|~{3,})\s*([^\s`]*)/.exec(r);e?(n={marker:e[1],diagram:S(e[2])},t.push(n.diagram?`a diagram`:r)):t.push(r)}return t.join(`
|
|
4
|
-
`)}function k(e){return e.length>51200||new TextEncoder().encode(e).length>x}var A=/<script|foreignObject|\son\w+=|javascript:|<a[\s>]|<image/i;function j(e){return A.test(e)}function M(e){let t=3735928559,n=1103547991;for(let r=0;r<e.length;r++){let i=e.charCodeAt(r);t=Math.imul(t^i,2654435761),n=Math.imul(n^i,1597334677)}return t=Math.imul(t^t>>>16,2246822507)^Math.imul(n^n>>>13,3266489909),n=Math.imul(n^n>>>16,2246822507)^Math.imul(t^t>>>13,3266489909),(4294967296*(2097151&n)+(t>>>0)).toString(36)}function N(e,t){return`${M(`${e}\u0000${t}`)}.${e.length.toString(36)}`}var te=/^[a-z][a-z0-9-]*$/,ne=/^[#\w\s,.()%'+-]*$/,P=/^(\s*<svg\b)([^>]*)>/;function F(e,t){let n=P.exec(e);if(!n)return e;let r=``;for(let[e,n]of Object.entries(t)){let t=n.replace(/"/g,`'`).trim();te.test(e)&&t&&ne.test(t)&&!/url\(|expression\(/i.test(t)&&(r+=`--pele-${e}:${t};`)}if(!r)return e;let i=n[2],a=/\sstyle="/.exec(i);return(a?`${n[1]}${i.slice(0,a.index+a[0].length)}${r}${i.slice(a.index+a[0].length)}>`:`${n[1]} style="${r}"${i}>`)+e.slice(n[0].length)}function I(e){return`data:image/svg+xml;charset=utf-8,${encodeURIComponent(e)}`}var L={maxBytes:8388608,maxPixels:4e7,maxSide:16384,chunkBytes:524288,perRow:8},R=[`image/png`,`image/jpeg`,`image/webp`,`image/gif`,`image/svg+xml`],re=/^f(0|[1-9]\d{0,2})$/,ie=/^t(0|[1-9]\d{0,3})\.(0|[1-9]\d{0,2})$/,ae=/^p:([A-Za-z0-9_-]+)$/;function oe(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function se(e){if(e.length%4!=1)try{let t=atob(e.replace(/-/g,`+`).replace(/_/g,`/`));return Uint8Array.from(t,e=>e.charCodeAt(0))}catch{return}}function ce(e){return`p:${oe(new TextEncoder().encode(e))}`}function le(e){if(typeof e!=`string`||e.length>5468)return;let t=re.exec(e);if(t)return{kind:`file`,index:Number(t[1])};let n=ie.exec(e);if(n)return{kind:`tool`,part:Number(n[1]),item:Number(n[2])};let r=ae.exec(e);if(!r)return;let i=se(r[1]);if(!i||i.length===0||i.length>4096)return;let a;try{a=new TextDecoder(`utf-8`,{fatal:!0}).decode(i)}catch{return}if(!(a.includes(`\0`)||ce(a)!==e))return{kind:`path`,path:a}}function ue(e,t){return e===void 0||!Number.isFinite(e)||e<=524288?`auto`:t?.saveData===!0||t?.type===`cellular`||de.has(t?.effectiveType??``)?`tap`:`auto`}var de=new Set([`2g`,`slow-2g`]),z=e=>typeof e==`number`&&e>524288,B={text:`Couldn't load it: try again`,retry:!0},V={text:`Not in this session's files`,retry:!1},H={offline:{text:`The machine is offline`,retry:!0},not_found:V,path:V,hidden:V,too_large:{text:`Too large to show`,retry:!1},dimensions:{text:`Too large to show`,retry:!1},type:{text:`Not an image`,retry:!1},unsupported:{text:`This machine's harness can't share images`,retry:!1},rate_limited:B,integrity:B,bad_answer:B,timeout:B,disabled:{text:`Web images are turned off on this hub`,retry:!1},refused:{text:`The site's address is not allowed`,retry:!1},not_image:{text:`Not an image`,retry:!1},upstream:{text:`The site did not answer`,retry:!0},bad_url:{text:`Not a web address the hub can fetch`,retry:!1}},fe={404:`not_found`,409:`offline`,413:`too_large`,415:`type`,422:`unsupported`};function U(e,t){let n=t?H[t]:void 0;if(n)return{...n};if(e===400)return{text:`Not an image of this session`,retry:!1};let r=fe[e];return{...r?H[r]:B}}function pe(e){return e<1024?`${Math.round(e)} B`:e<1048576?`${Math.round(e/1024)} KB`:`${Number((e/1048576).toFixed(1))} MB`}function me(e,t){return[e===`screenshot`?`Screenshot`:`Image`,...t===void 0?[]:[pe(t)],`Tap to load`].join(` · `)}function W(e,t){let n=e.href;if(n&&/^https?:/i.test(n))return{kind:`remote`,href:n};let r=e.src&&t?.length?t.find(t=>t.name===e.src):void 0;return r?{kind:`local`,image:r}:n?.startsWith(`/artifacts/`)?{kind:`artifact`,href:n}:{kind:`unsafe`}}function he(e,t){let n=[];if(!t?.length)return n;let r=e=>{for(let i of e)if(i.type===`image`){let e=W(i,t);e.kind===`local`&&!n.includes(e.image)&&n.push(e.image)}else`children`in i&&r(i.children)},i=e=>{for(let t of e)if(t.type===`paragraph`||t.type===`heading`)r(t.children);else if(t.type===`quote`)i(t.blocks);else if(t.type===`list`)for(let e of t.items)i(e.blocks);else if(t.type===`table`)for(let e of[t.head,...t.rows])for(let t of e)r(t)};return i(e),n}function G(e){let t=0,n=[],r=()=>{t++;let e=!1;return()=>{e||(e=!0,t--,n.shift()?.grant())}};return{acquire(i){return i?.aborted?Promise.reject(Error(`aborted`)):t<e?Promise.resolve(r()):new Promise((e,t)=>{let a={grant:()=>{i?.removeEventListener(`abort`,o),e(r())}},o=()=>{let e=n.indexOf(a);e>=0&&n.splice(e,1),t(Error(`aborted`))};i?.addEventListener(`abort`,o,{once:!0}),n.push(a)})},active:()=>t}}var K=class extends Error{reason;retryAfterMs;status;code;constructor(e,t,n=0,r){super(e.text),this.reason=e,this.retryAfterMs=t,this.status=n,this.code=r}},q=(e,t,n)=>new K(U(e,t),n,e,t);function ge(e={}){let t=e.fetch??((...e)=>fetch(...e)),n=e.objectURL??(e=>URL.createObjectURL(e)),r=e.revokeURL??(e=>URL.revokeObjectURL(e)),i=e.timeoutMs??7e4,a=e.maxBytes??L.maxBytes,o=e.keep??96,s=e.keepBytes??50331648,c=e.slots??G(e.limit??3),l=new Map,u=new Map,d=new Map;async function f(e){let r=await c.acquire(),o=new AbortController,s=!1,l=setTimeout(()=>(s=!0,o.abort()),i);try{let r;try{r=await t(e,{credentials:`same-origin`,referrerPolicy:`no-referrer`,signal:o.signal})}catch{throw q(s?504:0,s?`timeout`:void 0)}if(!r.ok){let e=await r.json().catch(()=>({})),t=typeof e.code==`string`?e.code:typeof e.error?.code==`string`?e.error.code:void 0,n=Number(r.headers.get(`retry-after`));throw q(r.status,t,Number.isFinite(n)&&n>0?Math.min(n,30)*1e3:void 0)}let i=(r.headers.get(`content-type`)??``).split(`;`)[0].trim().toLowerCase();if(!R.includes(i))throw await r.body?.cancel().catch(()=>{}),q(415,`type`);let c=Number(r.headers.get(`content-length`));if(Number.isFinite(c)&&c>a)throw await r.body?.cancel().catch(()=>{}),q(413,`too_large`);let l=[],u=0,d=r.body?.getReader(),f=new Promise((e,t)=>o.signal.addEventListener(`abort`,()=>t(Error(`aborted`)),{once:!0}));f.catch(()=>{});try{for(;d;){let{done:e,value:t}=await Promise.race([d.read(),f]);if(e)break;if(u+=t.byteLength,u>a)throw await d.cancel().catch(()=>{}),q(413,`too_large`);l.push(t)}}catch(e){throw d?.cancel().catch(()=>{}),e instanceof K?e:q(s?504:0,s?`timeout`:void 0)}return i===`image/svg+xml`?{url:I(new TextDecoder().decode(_e(l,u))),mime:i,bytes:u}:{url:n(new Blob(l,{type:i})),mime:i,bytes:u}}finally{clearTimeout(l),r()}}let p=0;function m(e){let t=l.get(e);t&&(l.delete(e),p-=t.bytes,t.url.startsWith(`blob:`)&&r(t.url))}function h(e,t){for(l.set(e,t),p+=t.bytes;l.size>1&&(l.size>o||p>s);)m(l.keys().next().value)}return{load(e){let t=l.get(e);if(t)return Promise.resolve(t);let n=u.get(e);if(n)return Promise.reject(n);let r=d.get(e);if(r)return r;let i=f(e).then(t=>(d.delete(e),h(e,t),t),t=>{d.delete(e);let n=t instanceof K?t:q(0);throw u.set(e,n),n});return d.set(e,i),i},forget(e){u.delete(e)},drop:m,cached:e=>l.get(e)?.url,inFlight:()=>c.active()}}function _e(e,t){let n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.byteLength;return n}var ve=_(`<button type=button class=media-tap><span>`),ye=_(`<span>`),be=_(`<button type=button class=media-retry>Retry`),xe=_(`<span class="file-chip media-failed"data-media-error> <span class=media-failed-name></span><span class=media-failed-reason>· `),Se=_(`<button type=button class=media-open><img loading=lazy decoding=async referrerpolicy=no-referrer>`,!0,!1,!1),Ce=_(`<button type=button class=media-more>+`),we=_(`<div class=media-strip role=group>`),Te=m(()=>b(()=>import(`./Lightbox-Du56MXGX.js`),__vite__mapDeps([0,1,2]))),J=G(2),Y=G(3),X=ge({slots:Y});function Ee(){let e=navigator.connection;return e?{type:e.type,effectiveType:e.effectiveType,saveData:e.saveData}:void 0}async function Z(e){return e.startsWith(`/`)?(await X.load(e)).url:e}function Q(s){let c=()=>s.image,[m,_]=o(ue(c().bytes,Ee())===`tap`?{at:`tap`}:{at:`waiting`}),[y,b]=o(!1),x,S=[],C,w=!1,T=()=>{for(let e of S)e();S=[]};g(()=>{C?.abort(),T()}),ee(()=>{if(typeof IntersectionObserver>`u`)return void b(!0);let e=new IntersectionObserver(e=>e.some(e=>e.isIntersecting)&&b(!0),{rootMargin:`300px 0px`});e.observe(x),g(()=>e.disconnect())});let E=(e,t)=>{if(T(),_({at:`failed`,reason:e}),e.retry&&!w&&c().src){w=!0;let e=c().src,n=setTimeout(()=>m().at===`failed`&&(X.forget(e),D()),t??1500);g(()=>clearTimeout(n))}};async function D(){let e=c().src;if(!e)return;C?.abort(),C=new AbortController;let t=C.signal;_({at:`waiting`});try{z(c().bytes)&&S.push(await J.acquire(t))}catch{return T()}try{let n=await Z(e);if(t.aborted)return T();_({at:`loading`,src:n})}catch(e){if(t.aborted)return;if(!(e instanceof K))return E(U(0));E(s.explain?s.explain(e.status,e.code):e.reason,e.retryAfterMs)}}p(()=>{y()&&m().at===`waiting`&&!C&&D()});let O=()=>{T();let e=m();e.at===`loading`&&_({at:`shown`,src:e.src})},k=!1,A=()=>{let e=c().src,t=m();e?.startsWith(`/`)&&t.at!==`failed`&&`src`in t&&t.src.startsWith(`blob:`)&&X.cached(e)!==t.src&&!k?(k=!0,C=void 0,D()):(e?.startsWith(`/`)&&`src`in t&&X.cached(e)===t.src&&X.drop(e),E(e?.startsWith(`/`)?U(415,`type`):U(0)))},j=()=>{let e=c().src;e&&X.forget(e),C=void 0,D()},M=()=>c().width&&c().height?c().width/c().height:void 0,N=()=>{let e=M();if(e)return{"aspect-ratio":`${c().width} / ${c().height}`,width:`min(100%, ${c().width}px, calc(var(--media-max-h, 220px) * ${e.toFixed(4)}))`}};return t(u,{get children(){return[t(r,{get when(){return n(()=>m().at===`failed`)()&&m()},children:e=>(()=>{var n=xe(),r=n.firstChild,o=r.nextSibling,s=o.nextSibling;return s.firstChild,d(n,t(v,{name:`file`}),r),d(o,()=>c().name),d(s,()=>e().reason.text,null),d(n,t(a,{get when(){return e().reason.retry},get children(){var e=be();return e.$$click=j,e}}),null),i(()=>f(n,`title`,`${c().name}: ${e().reason.text}`)),n})()}),t(r,{when:!0,get children(){var a=ye(),o=x;return typeof o==`function`?e(o,a):x=a,d(a,t(u,{get children(){return[t(r,{get when(){return m().at===`tap`},get children(){var e=ve(),n=e.firstChild;return e.$$click=()=>(_({at:`waiting`}),b(!0)),d(e,t(v,{name:`image`}),n),d(n,()=>me(c().tool?`screenshot`:`image`,c().bytes)),e}}),t(r,{get when(){return n(()=>m().at===`loading`||m().at===`shown`)()&&m()},children:e=>(()=>{var t=Se(),n=t.firstChild;return t.$$click=()=>s.onOpen?.(),n.addEventListener(`error`,A),n.addEventListener(`load`,O),f(n,`draggable`,!1),i(r=>{var i=`Open ${c().name}`,a=c().name,o=e().src,s=c().name;return i!==r.e&&f(t,`aria-label`,r.e=i),a!==r.t&&f(t,`title`,r.t=a),o!==r.a&&f(n,`src`,r.a=o),s!==r.o&&f(n,`alt`,r.o=s),r},{e:void 0,t:void 0,a:void 0,o:void 0}),t})()})]}})),i(e=>{var t=`media-box ${s.class??``}`,n=N(),r=c().ref,i=m().at;return t!==e.e&&h(a,e.e=t),e.t=l(a,n,e.t),r!==e.a&&f(a,`data-ref`,e.a=r),i!==e.o&&f(a,`data-state`,e.o=i),e},{e:void 0,t:void 0,a:void 0,o:void 0}),a}})]}})}function $(e){let[r,i]=o(),[c,l]=o(!1),u=()=>e.images.filter(e=>e.src),d=e=>{let t=u().findIndex(t=>t.key===e);t<0||(l(!0),i(t))};return[n(()=>e.children(d)),t(a,{get when(){return c()},get children(){return t(s,{get children(){return t(Te,{get open(){return r()!==void 0},get items(){return u()},get index(){return r()??0},onIndex:i,onClose:()=>i(void 0)})}})}})]}function De(e){let n=()=>e.max??8;return t($,{get images(){return e.images},children:r=>(()=>{var o=we();return d(o,t(c,{get each(){return e.images.slice(0,n())},children:e=>t(Q,{image:e,class:`media-thumb`,onOpen:()=>r(e.key)})}),null),d(o,t(a,{get when(){return e.images.length>n()},get children(){var t=Ce();return t.firstChild,t.$$click=()=>r(e.images[n()].key),d(t,()=>e.images.length-n(),null),t}}),null),i(()=>f(o,`aria-label`,e.label??`Images`)),o})()})}y([`click`]);export{I as _,Y as a,j as b,U as c,R as d,le as f,O as g,D as h,Z as i,he as l,S as m,Q as n,W as o,N as p,De as r,G as s,$ as t,L as u,F as v,k as y};
|