@volter/teams 0.1.20 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volter/teams",
3
- "version": "0.1.20",
3
+ "version": "0.1.22",
4
4
  "type": "module",
5
5
  "description": "Volter Teams, the neutral team plane: machine identity and daemon core, the local door and server link, admission from machine grants, product doors, and the Teams server's neutral routes (company RFC 0008).",
6
6
  "license": "MIT",
package/viewer/index.html CHANGED
@@ -7,13 +7,14 @@
7
7
  <title>Viewer</title>
8
8
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@xterm/xterm@5.5.0/css/xterm.css">
9
9
  <style>
10
- :root { color-scheme: dark; --bg: #0b0d10; --panel: #13161b; --line: #262b33; --text: #e6e8eb; --muted: #8b939e; --accent: #7aa2f7; }
10
+ /* The page's scheme is the host's when it sets one (`--scui-color-scheme` through the theme door), else dark. */
11
+ :root { --scui-color-scheme: dark; color-scheme: var(--scui-color-scheme); --bg: #0b0d10; --panel: #13161b; --line: #262b33; --text: #e6e8eb; --muted: #8b939e; --accent: #7aa2f7; }
11
12
  * { box-sizing: border-box; }
12
13
  html, body { height: 100%; margin: 0; background: var(--bg); color: var(--text); font: 13px/1.4 ui-sans-serif, system-ui, -apple-system, sans-serif; }
13
14
  body { display: flex; flex-direction: column; }
14
- header { display: flex; align-items: center; gap: 8px; padding: 6px 10px; border-bottom: 1px solid var(--line); background: var(--panel); min-height: 32px; }
15
- header .target { font-family: ui-monospace, Menlo, monospace; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
16
- header .scope { margin-left: auto; font-size: 11px; padding: 1px 6px; border: 1px solid var(--line); border-radius: 4px; color: var(--muted); }
15
+ body > header { display: flex; align-items: center; gap: 8px; padding: 6px 10px; border-bottom: 1px solid var(--line); background: var(--panel); min-height: 32px; }
16
+ body > header .target { font-family: ui-monospace, Menlo, monospace; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
17
+ body > header .scope { margin-left: auto; font-size: 11px; padding: 1px 6px; border: 1px solid var(--line); border-radius: 4px; color: var(--muted); }
17
18
  #status { padding: 4px 10px; color: var(--muted); font-size: 12px; border-bottom: 1px solid var(--line); }
18
19
  #status:empty { display: none; }
19
20
  main { flex: 1; min-height: 0; display: flex; }
@@ -34,11 +35,14 @@
34
35
  button.action:disabled { opacity: .5; cursor: default; }
35
36
  label.action input { display: none; }
36
37
  /* supercode-ui follows this page's dark scheme; its composer spans the page instead of its 420px default. */
37
- #session { flex: 1; min-width: 0; min-height: 0; display: flex; --scui-color-scheme: dark; }
38
+ #session { flex: 1; min-width: 0; min-height: 0; display: flex; }
38
39
  #session .session-view { flex: 1; min-width: 0; display: flex; flex-direction: column; }
39
40
  #session .session-view > section { flex: 1; min-height: 0; overflow: auto; }
40
41
  #session .session-composer { border-top: 1px solid var(--line); padding: 8px; --scui-width: 100%; --scui-height: auto; }
41
42
  #session .session-composer > * { flex: 1; min-width: 0; }
43
+ /* The host's header carries the session's details when it hides this one. */
44
+ #session.header-hidden .scui-team-transcript > header { display: none; }
45
+ body:has(#session:not([hidden])) { background: var(--scui-bg, var(--volter-surface-page, var(--bg))); color: var(--scui-fg, var(--text)); }
42
46
  [hidden] { display: none !important; }
43
47
  </style>
44
48
  </head>
@@ -50,23 +50,25 @@ function normalizedSession(descriptor, messages) {
50
50
  }
51
51
 
52
52
  /**
53
- * Mount one session into `element`. `update({ descriptor, messages, live, status, error, canSend, sending })` renders
54
- * the session (messages are the captured normalized values, oldest first); `onSend(text)` is called with a turn the
53
+ * Mount one session into `element`. `update({ descriptor, messages, members, machines, live, status, error, sending })`
54
+ * renders the session (messages are the captured normalized values, oldest first; members and machines name its owner
55
+ * and machines); `control` (the token's scope) shows the composer; `onSend(text)` is called with a turn the
55
56
  * member typed, and resolves once it was delivered or refused.
56
57
  */
57
- export function mountSessionView(element, { onSend }) {
58
- let current = { descriptor: null, messages: [], live: false, status: 'loading', error: null, canSend: false, sending: false };
58
+ export function mountSessionView(element, { onSend, control = false }) {
59
+ // One badge, following the token's scope: fixed when mounted (the team view reads its labels once).
60
+ const labels = { readOnly: control ? 'Control' : 'Read-only' };
61
+ let current = { descriptor: null, messages: [], members: [], machines: [], live: false, status: 'loading', error: null, canSend: control, sending: false };
59
62
  const adapter = {
60
63
  onIntent: async (intent) => { if (intent?.action === 'send' && intent.text?.trim()) await onSend(intent.text.trim()); },
61
64
  copyText: (text) => globalThis.navigator?.clipboard?.writeText(text),
62
65
  };
63
66
  const draw = () => {
64
- const { descriptor, messages, live, status, error, canSend, sending } = current;
67
+ const { descriptor, messages, members, machines, live, status, error, canSend, sending } = current;
65
68
  const transcript = descriptor ? withPeople(projectSubagentTranscript(normalizedSession(descriptor, messages), { prefix: descriptor.id, maxEntries: 500 }), messages) : [];
66
69
  const composerState = normalizeUiState({ ...EMPTY_UI_STATE, startup: 'ready', harness: descriptor?.harness ?? '', canSend: canSend && !sending, busy: sending, transcript });
67
70
  render(h('div', { class: 'session-view' },
68
- // The header says what this viewer may do: type into the session (a control token) or only read it.
69
- h(TeamTranscript, { session: descriptor, transcript, live, status, error, adapter, labels: { readOnly: canSend ? 'Control' : 'Read-only' } }),
71
+ h(TeamTranscript, { session: descriptor, transcript, members, machines, live, status, error, adapter, labels }),
70
72
  canSend ? h('div', { class: 'session-composer scui-root' }, h(Composer, { state: composerState, adapter })) : null,
71
73
  ), element);
72
74
  };
@@ -36,4 +36,4 @@ ${c.truncatedMarker}`:""]})]})})]}):null]});else if(e.role==="request")h=l(ri,{e
36
36
  `).map(u=>`+ ${u}`)].join(`
37
37
  `);let i=/\*\*\* Begin Patch[\s\S]*?\*\*\* End Patch/.exec(n??"")?.[0];return i||(/^(?:diff --git|@@ |--- |\+\+\+ )/m.test(t??"")?t:"")}function Tl(e){let t=/^Script (?:completed|failed)\r?\nWall time ([0-9.]+) seconds\r?\nOutput:\r?\n([\s\S]*)$/.exec(e??"");if(!t)try{let r=JSON.parse(e??""),s=A(r);return{preview:typeof r=="string"?r:ce(s,["output","message","text","summary","result"])||e||"",value:s,durationMs:null}}catch{return{preview:e??"",value:null,durationMs:null}}let n=Number(t[1])*1e3;try{let r=A(JSON.parse(t[2]));return{preview:typeof r?.output=="string"?r.output:t[2],value:r,durationMs:Number.isFinite(n)?n:null}}catch{return{preview:t[2],value:null,durationMs:Number.isFinite(n)?n:null}}}function Dl(e,t,n){let r=e.toLocaleLowerCase();return t==="error"?n.preview:/^(?:agent|task)$|spawn.?agent/.test(r)&&n.preview?"Agent is working in the background.":/send.?message|followup.?task/.test(r)&&n.preview?/resumed from transcript|resumedAgentId/i.test(n.preview)?"Agent resumed in the background.":"Message delivered.":n.preview}function Il(e){let t="",n="",r=!1;for(let s of e){if(r){r=!1,t+=n?" ":s;continue}if(s==="\\"){r=!0,t+=n?" ":s;continue}if(n){s===n&&(n=""),t+=" ";continue}if(s==='"'||s==="'"||s==="`"){n=s,t+=" ";continue}t+=s}return/(?:^|[;&|]\s*)(?:(?:npm|pnpm|yarn|bun)\s+(?:run\s+)?(?:test|typecheck|lint|build)|cargo\s+(?:test|clippy|build|check|fmt)|npx\s+(?:vitest|tsc|eslint|playwright)|pytest\b|go\s+test\b)/i.test(t)}function Ml(e,t){let n=e.toLocaleLowerCase();return/write_stdin|^wait$/.test(n)?"command":/update.?plan|todo|checklist|taskcreate|taskupdate|create.?goal|update.?goal/.test(n)?"plan":/search.?replace|edit|write|patch|replace|create_file|apply_patch/.test(n)?"edit":/read|view|open_file|list_dir/.test(n)?"read":/web.?search|web.?fetch|fetch.?url/.test(n)?"web":/search|find|grep|glob|toolsearch/.test(n)?"search":/browser|web|fetch|url/.test(n)?"web":/agent|subagent|send.?message|delegate|followup.?task|taskstop|taskoutput|^task$/.test(n)?"agent":/test|typecheck|lint|build/.test(n)?"test":/terminal|bash|shell|command|exec|write_stdin|^wait$/.test(n)?Il(t)?"test":"command":"other"}function Fl(e,t,n,r){let s=e==="pending"?0:e==="error"?2:1;if(r.length>1)return[`Running ${r.length} actions`,`Ran ${r.length} actions`,`${r.length} actions failed`][s];let a=n.toLocaleLowerCase();return/send.?message|followup.?task/.test(a)?["Messaging agent","Messaged agent","Agent message failed"][s]:/taskstop|interrupt.?agent|kill_command_or_subagent/.test(a)?["Stopping agent","Stopped agent","Stop failed"][s]:/list.?agents|taskoutput|wait.?agent/.test(a)?["Checking agents","Checked agents","Agent check failed"][s]:/get_command_or_subagent_output|write_stdin|^wait$/.test(a)?["Waiting for","Checked","Check failed"][s]:/web.?search/.test(a)?["Searching web","Searched web","Web search failed"][s]:/web.?fetch|fetch.?url/.test(a)?["Fetching page","Fetched page","Page fetch failed"][s]:/^skill$|use.?skill|load.?skill/.test(a)?["Loading skill","Loaded skill","Skill load failed"][s]:/taskcreate/.test(a)?["Adding task","Added task","Task creation failed"][s]:/taskupdate/.test(a)?["Updating task","Updated task","Task update failed"][s]:/create.?goal/.test(a)?["Creating goal","Created goal","Goal creation failed"][s]:/update.?goal/.test(a)?["Updating goal","Updated goal","Goal update failed"][s]:{read:["Reading","Read","Read failed"],search:["Searching","Searched","Search failed"],edit:["Editing","Edited","Edit failed"],command:["Running command","Ran command","Command failed"],test:["Running tests","Ran tests","Tests failed"],web:["Browsing","Browsed","Browser action failed"],agent:["Starting agent","Started agent","Agent failed"],plan:["Updating plan","Updated plan","Plan update failed"]}[t]?.[s]??(e==="error"?`${n} failed`:n.replaceAll(/[_-]+/g," "))}function Zr(e){let t=kl(e),n=t.args,r=Tl(e.resultText),s=vl(t.source,["patch"])||t.source,a=ce(n,["command","cmd"])||Ye(t.callSource,["command","cmd"]),i=Ml(t.name,a||t.source||e.arguments||""),u=ce(n,["file_path","target_file","target_directory","path"])||Ye(t.callSource,["file_path","target_file","target_directory","path"])||wl(s),o=ce(n,["query","pattern"])||Ye(t.callSource,["query","pattern","q"]),c=ce(n,["url"])||Ye(t.callSource,["url","ref_id"]),f=ce(n,["subject","description","summary","task","objective","prompt"])||Ye(t.callSource,["subject","description","summary","task","objective","prompt"]),h=i==="agent"?ce(A(r.value),["command","name"])||ce(n,["target","task_name","taskId","task_id","agentId","agent_id","resume","team_name"])||Ye(t.callSource,["target","task_name","taskId","task_id","agentId","agent_id","resume","team_name"]):"",d=/^skill$|use.?skill|load.?skill/i.test(t.name)?ce(n,["skill","name"])||Ye(t.callSource,["skill","name"]):"",m=/get_command_or_subagent_output|kill_command_or_subagent/i.test(t.name)?"background task":/write_stdin|^wait$/i.test(t.name)?"background command":"",p=i==="agent"?Nl(t.name,r.preview):Al(n),g=ce(n,["taskId","task_id"]),b=i==="plan"?p.length?`${p.length} ${p.length===1?"item":"items"}`:g?`task ${g}`:"":"",x=u||a||o||c||f||h||d||m||b||(t.tools.length>1?`${t.tools.length} coordinated actions`:Kl(e.arguments)),y=i==="edit"?El(n,r.preview,s):i==="agent"?Dl(t.name,e.status??"completed",r):r.preview,v=A(e.resultContent),k=A(e.metadata),C=A(v?.metadata);return{name:_(t.name,120),action:_(Fl(e.status??"completed",i,t.name,t.tools),120),category:i,detail:Cl(i),target:_(x,300),command:_(a,xe),path:_(u,xe),query:_(o,xe),url:_(c,xe),subject:_(f,xe),preview:_(y,Ci),fields:Sl(n),items:p,tools:t.tools,exitCode:Mt([r.value,v,C,k],["exit_code","exitCode","pi_bash_exit_code"]),durationMs:Mt([r.value,v,C,k],["duration_ms","durationMs","elapsed_ms","elapsedMs","totalDurationMs"])??r.durationMs,additions:Mt([v,C,k],["additions","lines_added"]),deletions:Mt([v,C,k],["deletions","lines_removed"]),matches:Mt([v,C,k],["matches","match_count","result_count"])}}function Rl(e,t){let n=Zr(t),r=A(e);if(!r)return n;let s=Array.isArray(r.fields)?r.fields.flatMap(u=>{let o=A(u);return o&&typeof o.label=="string"&&typeof o.value=="string"?[{label:_(o.label,80),value:_(o.value,xe)}]:[]}).slice(0,wi):n.fields,a=Array.isArray(r.items)?r.items.flatMap(u=>{let o=A(u);return o&&typeof o.label=="string"?[{label:_(o.label,300),status:_(o.status,40)}]:[]}).slice(0,12):n.items,i=Array.isArray(r.tools)?r.tools.filter(u=>typeof u=="string").map(u=>_(u,120)).slice(0,8):n.tools;return{name:_(r.name,120)||n.name,action:_(r.action,120)||n.action,category:ol.has(r.category)?r.category:n.category,detail:cl.has(r.detail)?r.detail:n.detail,target:_(r.target,300)||n.target,command:_(r.command,xe)||n.command,path:_(r.path,xe)||n.path,query:_(r.query,xe)||n.query,url:_(r.url,xe)||n.url,subject:_(r.subject,xe)||n.subject,preview:_(r.preview,Ci)||n.preview,fields:s,items:a,tools:i,exitCode:Se(r.exitCode)??n.exitCode,durationMs:Se(r.durationMs)??n.durationMs,additions:Se(r.additions)??n.additions,deletions:Se(r.deletions)??n.deletions,matches:Se(r.matches)??n.matches}}var Gr=4e3;function Ll(e){let t=e.role==="opaque",n;if(t&&typeof e.raw=="string")n=e.raw;else try{n=JSON.stringify(e,null,2)??""}catch{n="[unserializable entry payload]"}let r=t&&typeof e.kind=="string"?e.kind:typeof e.role=="string"?e.role:"";return{id:e.id,role:"opaque",kind:_(r,120)||"unknown",text:typeof e.text=="string"?_(e.text,Gr):"",ts:Se(e.ts),truncated:e.truncated===!0||n.length>Gr,raw:_(n,Gr)}}function Ni(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let r=A(n);if(!r||typeof r.id!="string")continue;if(typeof r.text!="string"||!sl.has(r.role)){t.push(Ll(r));continue}let s={id:r.id,role:r.role,text:r.text,ts:Se(r.ts),truncated:r.truncated===!0,...Number.isSafeInteger(r.messageIndex)&&r.messageIndex>0?{messageIndex:r.messageIndex}:{}};for(let u of["key","label","arguments","resultText","code"])typeof r[u]=="string"&&(s[u]=r[u]);["pending","completed","error"].includes(r.status)&&(s.status=r.status);let a=A(r.actor);a&&(typeof a.name=="string"||typeof a.image=="string")&&(s.actor={...typeof a.name=="string"&&a.name.trim()?{name:a.name.trim().slice(0,80)}:{},...typeof a.image=="string"&&/^https:\/\//.test(a.image)&&a.image.length<=2e3?{image:a.image}:{}}),r.role==="tool"&&(s.presentation=Rl(r.presentation,s)),typeof r.streaming=="boolean"&&(s.streaming=r.streaming),Array.isArray(r.context)&&(s.context=r.context.flatMap(u=>{let o=A(u);return o&&typeof o.label=="string"&&typeof o.detail=="string"?[{...typeof o.id=="string"?{id:o.id}:{},...typeof o.kind=="string"?{kind:o.kind}:{},label:o.label,detail:o.detail}]:[]})),Array.isArray(r.images)&&(s.images=r.images.flatMap(u=>{let o=A(u);return o&&typeof o.label=="string"?[{...typeof o.id=="string"?{id:o.id}:{},label:o.label,...typeof o.url=="string"?{url:o.url}:{},...typeof o.reference=="string"&&o.reference.length<=4e3?{reference:o.reference}:{},...typeof o.mediaType=="string"&&o.mediaType.startsWith("image/")&&o.mediaType.length<=100?{mediaType:o.mediaType}:{},...Number.isSafeInteger(o.byteSize)&&o.byteSize>=0?{byteSize:o.byteSize}:{}}]:[]}).slice(0,4));let i=A(r.request);i&&typeof i.requestKind=="string"&&typeof i.payloadText=="string"&&(s.request={requestId:i.requestId,requestKind:i.requestKind,payloadText:i.payloadText,options:Array.isArray(i.options)?i.options.flatMap(u=>{let o=A(u);return o&&typeof o.optionId=="string"&&typeof o.name=="string"?[{optionId:o.optionId,name:o.name,kind:ne(o.kind,"other")}]:[]}):[],cancellable:i.cancellable===!0,status:i.status==="responded"?"responded":"pending",resolution:A(i.resolution)}),t.push(s)}return t}function Ei(e){let t=A(e);return t?{kind:["local-user","foreign","unknown"].includes(t.kind)?t.kind:"unknown",label:typeof t.label=="string"&&t.label?_(t.label,200):null,origin:typeof t.origin=="string"&&t.origin?_(t.origin,100):null}:{kind:"local-user",label:null,origin:null}}function Ti(e,t=""){let n=A(e);return n&&["repo","none","channel"].includes(n.kind)?{kind:n.kind,value:n.kind==="none"?null:typeof n.value=="string"&&n.value?_(n.value,500):null}:t?{kind:"repo",value:_(t,500)}:{kind:"none",value:null}}function Jr(e){let t=A(e);return!t||typeof t.canonicalHarness!="string"||!t.canonicalHarness?null:{canonicalHarness:_(t.canonicalHarness,100),canonicalKey:typeof t.canonicalKey=="string"&&t.canonicalKey?_(t.canonicalKey,300):null,bounded:t.bounded===!0,truncated:t.truncated===!0,origin:typeof t.origin=="string"&&t.origin?_(t.origin,200):null}}function Pl(e){let t=A(e);if(!t)return null;let n=typeof t.surface=="string"&&t.surface?_(t.surface,100):null;return{surface:n,canTakeOver:t.canTakeOver===!0&&n!==null&&n!=="supercode"}}var Ol=["human","channel","cron","heartbeat","webhook","parent","api","unknown"];function vi(e){let t=A(e);if(!t)return null;let n=t.kind==="manual"?"human":t.kind;return{kind:Ol.includes(n)?n:"unknown",label:typeof t.label=="string"&&t.label?_(t.label,200):null,surface:typeof t.surface=="string"&&t.surface?_(t.surface,300):null}}function _i(e){let t=A(e);return!t||typeof t.state!="string"||!t.state?null:{state:_(t.state,100),platform:typeof t.platform=="string"&&t.platform?_(t.platform,100):null,error:typeof t.error=="string"&&t.error?_(t.error,500):null}}function xi(e){let t=A(e);if(!t||typeof t.groupKey!="string"||!t.groupKey)return null;let n=Number.isSafeInteger(t.runs)&&t.runs>0?t.runs:1;return{groupKey:_(t.groupKey,300),runs:n,lastStatus:["ok","failed","mixed"].includes(t.lastStatus)?t.lastStatus:null}}function Di(e){return Array.isArray(e)?e.flatMap(t=>{let n=A(t);return!n||typeof n.key!="string"||typeof n.harness!="string"?[]:[{key:n.key,harness:n.harness,name:ne(n.name),cwd:ne(n.cwd),title:ne(n.title),preview:ne(n.preview),age:ne(n.age),previewUpdatedAt:Se(n.previewUpdatedAt),updatedAt:Se(n.updatedAt),messages:Se(n.messages),active:n.active===!0,writable:n.writable===!0,live:n.live===!0,runtimeStatus:n.runtimeStatus==="running"||n.runtimeStatus==="busy"||n.runtimeStatus==="idle"?n.runtimeStatus:null,...Number.isSafeInteger(n.subagentCount)&&n.subagentCount>0?{subagentCount:n.subagentCount}:{},activity:Vl[n.activity]!==void 0?n.activity:void 0,...n.participant!==void 0?{participant:Ei(n.participant)}:{},workspaceRef:Ti(n.workspaceRef,ne(n.cwd)),...Jr(n.mirror)?{mirror:Jr(n.mirror)}:{},...vi(n.trigger)?{trigger:vi(n.trigger)}:{},...xi(n.recurring)?{recurring:xi(n.recurring)}:{},..._i(n.crossSurface)?{crossSurface:_i(n.crossSurface)}:{}}]}):[]}function Bl(e){let t=A(e);return!t||typeof t.parentKey!="string"||!t.parentKey?null:{parentKey:t.parentKey,parentTitle:_(ne(t.parentTitle),500),status:["loading","ready","error"].includes(t.status)?t.status:"loading",items:Di(t.items).slice(0,100),selectedKey:typeof t.selectedKey=="string"&&t.selectedKey?t.selectedKey:null,transcript:Ni(t.transcript).slice(-120),error:typeof t.error=="string"?_(t.error):null}}function ki(e){let t=A(e);return!t||typeof t.harness!="string"?null:{key:ne(t.key),harness:t.harness,name:ne(t.name),cwd:ne(t.cwd),title:ne(t.title)}}function ql(e){let t=A(e);return t?{source:["codex-update-plan","claude-tasks","opencode-todos"].includes(t.source)?t.source:"none",items:Array.isArray(t.items)?t.items.flatMap(n=>{let r=A(n);return!r||typeof r.id!="string"||typeof r.title!="string"?[]:[{id:r.id,title:r.title,status:["pending","in_progress","completed","cancelled","unknown"].includes(r.status)?r.status:"unknown",...typeof r.nativeStatus=="string"?{nativeStatus:r.nativeStatus}:{},...Array.isArray(r.blockedBy)?{blockedBy:r.blockedBy.filter(s=>typeof s=="string")}:{}}]}):[],residueCount:Qe(t.residueCount),observedAt:Se(t.observedAt)}:{...vn.taskPlan,items:[]}}function zl(e){let t=A(e);return t?{fidelity:bi.has(t.fidelity)?t.fidelity:null,residue:Array.isArray(t.residue)?t.residue.filter(n=>typeof n=="string"):[],residueCount:Qe(t.residueCount),parseErrors:Qe(t.parseErrors),rawRecords:Qe(t.rawRecords),subagents:Array.isArray(t.subagents)?t.subagents.flatMap(n=>{let r=A(n);return!r||typeof r.id!="string"||typeof r.source!="string"?[]:[{id:r.id,source:r.source,model:typeof r.model=="string"?r.model:null,messages:Qe(r.messages),fidelity:bi.has(r.fidelity)?r.fidelity:"semantic"}]}):[]}:{...vn.semantics,residue:[],subagents:[]}}function Hl(e){let t=A(e);return!t||typeof t.program!="string"||!t.program.trim()||!Array.isArray(t.arguments)||!t.arguments.every(n=>typeof n=="string")||typeof t.cwd!="string"?null:{program:t.program,arguments:[...t.arguments],cwd:t.cwd}}function $l(e){let t=A(e);return!t||typeof t.targetHarness!="string"||!["byte_lossless","value_lossless","semantic"].includes(t.fidelity)||typeof t.path!="string"||!t.path.trim()||!Number.isInteger(t.files)||t.files<1||!Number.isInteger(t.residueCount)||t.residueCount<0?null:{targetHarness:t.targetHarness,fidelity:t.fidelity,path:t.path,files:t.files,residueCount:t.residueCount}}function jl(e){let t=A(e);return!t||typeof t.sourceTokens!="number"||!Number.isFinite(t.sourceTokens)||typeof t.reducedTokens!="number"||!Number.isFinite(t.reducedTokens)||t.sourceTokens<=t.reducedTokens||t.reducedTokens<0||typeof t.ratio!="number"||!Number.isFinite(t.ratio)||t.ratio<=1||typeof t.sidecarId!="string"||!t.sidecarId.trim()||t.verified!==!0||t.reversible!==!0||typeof t.targetHarness!="string"||!t.targetHarness.trim()?null:{sourceTokens:t.sourceTokens,reducedTokens:t.reducedTokens,ratio:t.ratio,sidecarId:t.sidecarId,verified:!0,reversible:!0,targetHarness:t.targetHarness}}function Ul(e){let t=A(e);if(t?.schema!=="supercode.harness-interop-settings.v1"||typeof t.harness!="string"||typeof t.revision!="string"||!Array.isArray(t.controls)||!Array.isArray(t.advisories))return null;let n=t.controls.slice(0,20).flatMap(s=>{let a=A(s);return!a||typeof a.key!="string"||typeof a.label!="string"?[]:[{key:_(a.key,200),nativeKey:_(a.native_key??a.nativeKey,200),label:_(a.label,300),description:_(a.description),scope:["user","project","managed","command_line"].includes(a.scope)?a.scope:"user",sourcePath:_(a.source_path??a.sourcePath,4e3),configuredValue:typeof(a.configured_value??a.configuredValue)=="string"?_(a.configured_value??a.configuredValue,500):null,effectiveValue:typeof(a.effective_value??a.effectiveValue)=="string"?_(a.effective_value??a.effectiveValue,500):null,effectiveKnown:(a.effective_known??a.effectiveKnown)===!0,effectiveNote:_(a.effective_note??a.effectiveNote),choices:Array.isArray(a.choices)?a.choices.slice(0,20).flatMap(i=>{let u=A(i);return u&&typeof u.value=="string"&&typeof u.label=="string"?[{value:_(u.value,500),label:_(u.label,300),description:_(u.description),...typeof u.risk=="string"?{risk:_(u.risk)}:{}}]:[]}):[],writable:a.writable===!0,resettable:a.resettable===!0,requiresRestart:(a.requires_restart??a.requiresRestart)===!0}]}),r=t.advisories.slice(0,20).flatMap(s=>{let a=A(s),i=A(a?.recommendation),u=A(i?.change);return!a||!i||!u||typeof a.code!="string"||typeof a.title!="string"||typeof a.setting!="string"||typeof u.key!="string"?[]:[{code:_(a.code,200),severity:["info","warning","error"].includes(a.severity)?a.severity:"warning",title:_(a.title,500),message:_(a.message),setting:_(a.setting,200),recommendation:{label:_(i.label,500),description:_(i.description),consequence:_(i.consequence),change:{key:_(u.key,200),value:typeof u.value=="string"?_(u.value,500):null},command:_(i.command,4e3)}}]});return{schema:"supercode.harness-interop-settings.v1",harness:t.harness,revision:_(t.revision,500),controls:n,advisories:r}}function Xr(e){let t=A(e)??{},n=A(t.pill),r=A(t.history),s=A(t.attachError),a=t.canResume===!0,i=Array.isArray(t.continuationModes)?[...new Set(t.continuationModes.filter(u=>u==="headless"||u==="terminal"))]:a?["headless"]:[];return{pill:{tone:["live","warn","dead"].includes(n?.tone)?n.tone:"off",label:ne(n?.label,"connecting\u2026")},startup:ul.has(t.startup)?t.startup:"connecting",transcript:Ni(t.transcript),busy:t.busy===!0,operation:typeof t.operation=="string"?t.operation:null,needsInput:t.needsInput===!0,harness:ne(t.harness),mode:al.has(t.mode)?t.mode:"none",strategy:il.has(t.strategy)?t.strategy:null,canSend:t.canSend===!0,canSteer:t.canSteer===!0,canResume:a,supportsResume:t.supportsResume===!0,continuationModes:i,canBranch:t.canBranch===!0,supportsBranch:t.supportsBranch===!0,canAttach:t.canAttach===!0,supportsAttach:t.supportsAttach===!0,canDetach:t.canDetach===!0,canOpenTerminal:t.canOpenTerminal===!0,canExport:t.canExport===!0,canReduce:t.canReduce===!0,canInterrupt:t.canInterrupt===!0,canRespond:t.canRespond===!0,canConfigureSettings:t.canConfigureSettings===!0,messaging:t.messaging==="live_peer"?"live_peer":null,workspace:ne(t.workspace),workspaceRef:Ti(t.workspaceRef,ne(t.workspace)),participant:Ei(t.participant),mirror:Jr(t.mirror),holder:Pl(t.holder),taskPlan:ql(t.taskPlan),semantics:zl(t.semantics),terminalHandoff:Hl(t.terminalHandoff),exportBackTarget:typeof t.exportBackTarget=="string"?t.exportBackTarget:null,exportReceipt:$l(t.exportReceipt),reductionReceipt:jl(t.reductionReceipt),interopSettings:Ul(t.interopSettings),interopSettingsError:typeof t.interopSettingsError=="string"?_(t.interopSettingsError):null,harnessAuthentication:pl(t.harnessAuthentication),error:typeof t.error=="string"?t.error:null,recoverable:t.recoverable===!0,harnesses:Array.isArray(t.harnesses)?t.harnesses.flatMap(u=>{let o=A(u);if(!o||typeof o.id!="string")return[];let c=o.startable===!0,f=Array.isArray(o.launchModes)?[...new Set(o.launchModes.filter(m=>m==="headless"||m==="terminal"))]:c?["headless"]:[],h=f.includes(o.preferredLaunchMode)?o.preferredLaunchMode:f.includes("terminal")?"terminal":f[0]??null,d=A(o.capabilities);return[{id:o.id,label:ne(o.label,Wl(o.id)),installed:o.installed===!0,startable:c,reason:typeof o.reason=="string"?_(o.reason):null,auth:["ready","configured","required","unknown"].includes(o.auth)?o.auth:"unknown",runtime:["ready","degraded","unavailable"].includes(o.runtime)?o.runtime:c?"ready":"unavailable",protocol:_(o.protocol,100),repair:typeof o.repair=="string"?_(o.repair,4e3):null,capabilities:{start:d?.start===!0,resume:d?.resume===!0,attach:d?.attach===!0,send:d?.send===!0,interrupt:d?.interrupt===!0,steer:d?.steer===!0,respond:d?.respond===!0},launchModes:f,preferredLaunchMode:h}]}):[],history:{sessionLimit:Qe(r?.sessionLimit),hasMoreSessions:r?.hasMoreSessions===!0,transcriptLimit:Qe(r?.transcriptLimit,120),hasEarlier:r?.hasEarlier===!0},savedDraft:ne(t.savedDraft),attention:Array.isArray(t.attention)?t.attention.flatMap(u=>{let o=A(u);return o&&typeof o.key=="string"&&["unseen","finished","failed"].includes(o.kind)?[{key:o.key,kind:o.kind,...typeof o.preview=="string"?{preview:o.preview}:{},...Number.isSafeInteger(o.afterMessages)&&o.afterMessages>=0?{afterMessages:o.afterMessages}:{},...Number.isSafeInteger(o.unreadCount)&&o.unreadCount>0?{unreadCount:o.unreadCount}:{}}]:[]}):[],sessions:Di(t.sessions),subagentInspector:Bl(t.subagentInspector),attached:ki(t.attached),owned:ki(t.owned),attachError:s&&typeof s.key=="string"&&typeof s.message=="string"?{key:s.key,message:s.message}:null,agentPackage:gl(t.agentPackage),contributions:ml(t.contributions),agentPackageError:typeof t.agentPackageError=="string"?_(t.agentPackageError):null,agentPackageCapabilityState:bl(t.agentPackageCapabilityState),agentPackageCapabilityError:typeof t.agentPackageCapabilityError=="string"?_(t.agentPackageCapabilityError):null}}function Wl(e){return rl[e]??e}var Vl=Object.freeze({"needs-input":70,failed:60,working:50,unseen:40,finished:30,running:20,recent:10,idle:0});function Kl(e){if(!e)return"";try{let t=JSON.parse(e);for(let n of["file_path","target_file","path","command","cmd","query","pattern","url"])if(typeof t?.[n]=="string")return t[n]}catch{return e.length>120?`${e.slice(0,117)}\u2026`:e}return""}var vm=Ae();var Gm=Ae(),Jm=Ae(),Zm=Ae();var Xm=nt(null);function Ft(e){if(typeof e=="string")return e;if(!Array.isArray(e))return"";let t=[];for(let n of e)typeof n=="string"?t.push(n):n&&typeof n=="object"&&(typeof n.text=="string"?t.push(n.text):typeof n.content=="string"&&t.push(n.content));return t.join(`
38
38
  `)}function td(e){return Array.isArray(e)?e.flatMap(t=>{if(!t||typeof t!="object")return[];let n=typeof t.image_url=="string"?t.image_url:typeof t.image_url?.url=="string"?t.image_url.url:null;return n&&(n.startsWith("data:image/")||n.startsWith("https://")||n.startsWith("http://"))?[n]:[]}):[]}function Mi(e){let t=e.trim();return/(^|\n)\s*(error|failed|failure|exception|denied)\b/i.test(t)||/"(?:is_?error|error)"\s*:\s*(?:true|"[^"\n]+")/i.test(t)||/\b(?:exit(?:ed)?|status)\s+(?:with\s+)?(?:code\s+)?[1-9]\d*\b/i.test(t)?"error":"completed"}var nd=new Set(["file","edited_text_file","nested_memory"]);function rd(e){return e?e.promptSource==="system"||e.isMeta==="true"||e.isCompactSummary==="true"||e.origin==="task-notification"||e.commandMode==="task-notification"||nd.has(e.attachmentType):!1}var sd=["<command-name>","<command-message>","<local-command-stdout>"];function ad(e,t){let n=t??Ft(e.content).trim();return e.role==="system"?!0:e.role!=="user"?!1:rd(e.metadata)||/^(# )?(?:AGENTS|CLAUDE)\.md instructions for .+\n\n<INSTRUCTIONS>/.test(n)||/^<recommended_plugins>[\s\S]*<\/(?:recommended_plugins)>\s*(?:# )?(?:AGENTS|CLAUDE)\.md instructions for .+\n\n<INSTRUCTIONS>/.test(n)||n.startsWith("<environment_context>")||n.startsWith("<user_info>")||n.startsWith("<system-reminder>")||sd.some(r=>n.startsWith(r))||e.metadata?.context==="true"}function id(e,t){let n=t??Ft(e.content).trim();if(e.role!=="user")return n;let r=n.match(/^<user_query>\s*([\s\S]*)\s*<\/user_query>(?=\s*(?:<supercode_context>|$))/);return r?r[1].trim():n}function Fi(e){return Array.isArray(e)?e.filter(t=>t&&typeof t.label=="string"&&typeof t.detail=="string").slice(0,32).map(t=>({...typeof t.id=="string"&&t.id?{id:t.id.slice(0,2e3)}:{},...typeof t.kind=="string"&&t.kind?{kind:t.kind.slice(0,100)}:{},label:t.label.slice(0,200),detail:t.detail.slice(0,2e4)})):[]}function ud(e,t){if(e?.role!=="user")return[];let r=(t??Ft(e.content).trim()).match(/^<user_query>\s*[\s\S]*?\s*<\/user_query>\s*<supercode_context>\s*([\s\S]*?)\s*<\/supercode_context>\s*$/);if(r)try{return Fi(JSON.parse(r[1]))}catch{return[]}if(typeof e.metadata?.context=="string")try{return Fi(JSON.parse(e.metadata.context))}catch{return[]}return[]}function od(e){let t=new Map;for(let n of e)n.role==="tool"&&n.tool_call_id&&t.set(n.tool_call_id,n);return t}function cd(e){let t=typeof e=="string"?e:JSON.stringify(e??null);return t.length<=512?t:`${t.slice(0,256)}:${t.length}:${t.slice(-256)}`}function Yr(e,t,...n){let r=n.map(cd).join(""),s=3735928559^r.length,a=1103547991^r.length;for(let i=0;i<r.length;i+=1){let u=r.charCodeAt(i);s=Math.imul(s^u,2654435761),a=Math.imul(a^u,1597334677)}return s=Math.imul(s^s>>>16,2246822507)^Math.imul(a^a>>>13,3266489909),a=Math.imul(a^a>>>16,2246822507)^Math.imul(s^s>>>13,3266489909),`${e}:${t}:${(s>>>0).toString(36)}${(a>>>0).toString(36)}`}function Ri(e,t,n){let r=t.metadata??{},s=["id","uuid","message_id","messageId","event_id","eventId","timestamp"].map(i=>r[i]).find(i=>typeof i=="string"&&i),a=(t.tool_calls??[]).map(i=>i.id).join(",");return Yr(e,"message",t.role,s??"",t.tool_call_id??"",a,n)}function Li(e,t={}){let n=t.prefix??e.session_id??"session",r=e.messages??[],s=od(r),a=new Set,i=[];for(let[u,o]of r.entries()){let c=Ft(o.content).trim(),f=id(o,c);if(o.role!=="tool"&&(f||o.content!==void 0)){let h=ud(o,c),d=td(o.content).map((m,p)=>({id:`${Ri(n,o,c)}:image:${p}`,label:`Image ${p+1}`,url:m}));i.push({id:Ri(n,o,c),kind:"message",messageIndex:u+1,role:o.role,text:f,content:o.content,metadata:{...o.metadata??{}},visibility:ad(o,c)?"context":"conversation",...h.length>0?{context:h}:{},...d.length>0?{images:d}:{}})}for(let[h,d]of(o.tool_calls??[]).entries()){let m=s.get(d.id);m&&a.add(d.id);let p=Ft(m?.content).trim();i.push({id:Yr(n,"tool",d.id||`${u}:${h}`),kind:"tool",messageIndex:u+1,callId:d.id,name:d.function?.name??null,arguments:d.function?.arguments??null,resultText:p,resultContent:m?.content,status:m?Mi(p):"pending",metadata:{...o.metadata??{},...m?.metadata??{}}})}o.role==="tool"&&!a.has(o.tool_call_id??"")&&(f||o.name||o.content!==void 0)&&i.push({id:Yr(n,"tool-result",o.tool_call_id??"",o.metadata?.timestamp??"",f),kind:"tool",messageIndex:u+1,callId:o.tool_call_id??null,name:o.name??null,arguments:null,resultText:f,resultContent:o.content,status:Mi(f),metadata:{...o.metadata??{}}})}return i}var ld=120,dd=16e3;var rg=Object.freeze({"needs-input":4,failed:3,working:2,running:1,recent:1,idle:0});function Bi(e,t={}){return yd(Li(e,{prefix:t.prefix??e?.session_id??"subagent"}),t,null)}function fd(e){if(typeof e=="string")return e;try{return JSON.stringify(e,null,2)}catch{return String(e??"")}}function es(e){return Array.isArray(e)?e.map(es):e!==null&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([t,n])=>[t,es(n)])):e}function Qr(e,t){return Number.isInteger(e)&&e>0?e:t}function et(e,t){let n=typeof e=="string"?e:"";if(n.length<=t)return{text:n,truncated:!1};let r=t,s=n.charCodeAt(r-1),a=n.charCodeAt(r);return s>=55296&&s<=56319&&a>=56320&&a<=57343&&(r-=1),{text:`${n.slice(0,r)}\u2026`,truncated:!0}}function Pi(e){if(!e||typeof e!="object"||Array.isArray(e))return null;for(let t of["timestamp","ts","time","created_at","createdAt","date"]){let n=e[t];if(typeof n!="string"||n==="")continue;if(/^\d+$/.test(n)){let s=Number(n);if(Number.isFinite(s)&&s>0)return s<1e11?s*1e3:s;continue}let r=Date.parse(n);if(Number.isFinite(r))return r}return null}function hd(e){if(!Array.isArray(e))return;let t=e.flatMap(n=>n&&typeof n=="object"&&typeof n.label=="string"&&typeof n.detail=="string"?[{...typeof n.id=="string"?{id:n.id}:{},...typeof n.kind=="string"?{kind:n.kind}:{},label:n.label,detail:n.detail}]:[]);return t.length?t:void 0}function pd(e){if(!e.startsWith("data:image/"))return{};let t=e.slice(5,256),n=t.indexOf(",");if(n<0)return{};let r=t.slice(0,n),s=r.split(";",1)[0].toLowerCase();if(!s.startsWith("image/"))return{};if(!r.toLowerCase().endsWith(";base64"))return{mediaType:s};let a=e.length-5-n-1,i=e.endsWith("==")?2:e.endsWith("=")?1:0;return{mediaType:s,byteSize:Math.max(0,Math.floor(a*3/4)-i)}}function md(e,t,n){return JSON.stringify([e,typeof t.id=="string"?t.id:null,n])}function gd(e,t,n){if(!Array.isArray(e))return;let r=e.flatMap((s,a)=>{if(!s||typeof s!="object"||typeof s.label!="string")return[];let i=typeof s.url=="string"?s.url:null,u=i!==null&&!i.endsWith(`
39
- \u2026`),o=u?pd(i):{},c=u&&(!i.startsWith("data:image/")||i.length<=256e3)?i:null,f=null;return u&&i.startsWith("data:image/")&&!c&&n&&Number.isSafeInteger(o.byteSize)&&(f=md(t,s,a),n.set(f,{...typeof s.id=="string"?{id:s.id}:{},label:s.label,url:i,...o})),[{...typeof s.id=="string"?{id:s.id}:{},label:s.label,...o,...c?{url:c}:{},...f?{reference:f}:{}}]}).slice(0,4);return r.length?r:void 0}function bd(e){let t=Array.isArray(e.options)?e.options.map(r=>r?.name).filter(Boolean).join(" / "):"",n=e.resolution?.name?` \u2192 ${e.resolution.name}`:"";return t?`${e.requestKind}: ${t}${n}`:`${e.requestKind??"request"}${n}`}function Oi(e,t,n){if(!e||typeof e!="object"||typeof e.id!="string")return null;if(e.kind==="message"){if(e.visibility==="context")return null;let r=et(e.text,t),s=hd(e.context),a=gd(e.images,e.id,n);return{id:e.id,...typeof e.key=="string"&&e.key!==e.id?{key:e.key}:{},role:e.role,...Number.isSafeInteger(e.messageIndex)&&e.messageIndex>0?{messageIndex:e.messageIndex}:{},text:r.text,ts:Pi(e.metadata),truncated:r.truncated,...s?{context:s}:{},...a?{images:a}:{}}}if(e.kind==="tool"){let r=et((e.arguments??"").trim(),t),s=et((e.resultText??"").trim(),t),a={id:e.id,...typeof e.key=="string"&&e.key!==e.id?{key:e.key}:{},role:"tool",...Number.isSafeInteger(e.messageIndex)&&e.messageIndex>0?{messageIndex:e.messageIndex}:{},text:"",ts:Pi(e.metadata),truncated:r.truncated||s.truncated,label:e.name??"tool",arguments:r.text,resultText:s.text,status:e.status};return a.presentation=Zr({...a,arguments:(e.arguments??"").trim(),resultText:(e.resultText??"").trim(),resultContent:e.resultContent,metadata:e.metadata}),a}if(e.kind==="reasoning"){let r=et(e.text,t);return{id:e.id,...typeof e.key=="string"&&e.key!==e.id?{key:e.key}:{},role:"reasoning",text:r.text,ts:null,truncated:r.truncated,streaming:e.streaming===!0}}if(e.kind==="request"){let r=et(bd(e),t),s=et(fd(e.payload),t);return{id:e.id,role:"request",text:r.text,ts:null,truncated:r.truncated||s.truncated,request:{requestId:es(e.requestId),requestKind:e.requestKind,payloadText:s.text,options:Array.isArray(e.options)?e.options.map(a=>({...a})):[],cancellable:e.cancellable===!0,status:e.status,resolution:e.resolution?{...e.resolution}:null}}}if(e.kind==="notice"){let r=et(e.text||e.code,t);return{id:e.id,role:"notice",text:r.text,ts:null,truncated:r.truncated,code:e.code}}return null}function yd(e,t,n){if(!Array.isArray(e))return[];let r=Qr(t.maxEntries,ld),s=Qr(t.maxEntryChars,dd),a=Qr(t.maxScanEntries,r*4),i=[],u=e.length-1,o=0;for(;u>=0&&i.length<r&&o<a;u-=1,o+=1){let c=Oi(e[u],s,n);c&&i.push(c)}if(i.at(-1)?.role!=="user")for(;u>=0&&o<a;u-=1,o+=1){let c=Oi(e[u],s,n);if(c?.role==="user"){i.length===r?i[i.length-1]=c:i.push(c);break}}return i.reverse(),i}var vd=(e="")=>`https://brand.volter.ai/runner/svg?seed=${encodeURIComponent(e)}&size=36&radius=18`;function _d(e,t){let n=new Map;for(let r of t){if(r?.role!=="user")continue;let s=Date.parse(r.metadata?.timestamp??"");Number.isFinite(s)&&n.set(s,r.metadata)}return e.map(r=>{if(r.role!=="user")return r;let s=n.get(r.ts)??{},a=s.source_name||null;return{...r,actor:{name:a??"Someone",image:vd(a?s.source_principal_id||a:"")}}})}var xd={"claude-code":"claude_code",codex:"codex",gemini:"gemini",goose:"goose",grok:"grok",opencode:"opencode",pi:"pi"};function kd(e,t){return{source:xd[e.harness]??"native",session_id:e.id,model:null,cwd:null,system_prompt:null,agent_id:null,parent_tool_use_id:null,lineage:{},trigger:"human",surface:null,messages:t}}function lg(e,{onSend:t}){let n={descriptor:null,messages:[],live:!1,status:"loading",error:null,canSend:!1,sending:!1},r={onIntent:async a=>{a?.action==="send"&&a.text?.trim()&&await t(a.text.trim())},copyText:a=>globalThis.navigator?.clipboard?.writeText(a)},s=()=>{let{descriptor:a,messages:i,live:u,status:o,error:c,canSend:f,sending:h}=n,d=a?_d(Bi(kd(a,i),{prefix:a.id,maxEntries:500}),i):[],m=Xr({...vn,startup:"ready",harness:a?.harness??"",canSend:f&&!h,busy:h,transcript:d});Wt(tt("div",{class:"session-view"},tt(fi,{session:a,transcript:d,live:u,status:o,error:c,adapter:r}),f?tt("div",{class:"session-composer scui-root"},tt(It,{state:m,adapter:r})):null),e)};return s(),{update(a){n={...n,...a},s()},unmount(){Wt(null,e)}}}export{lg as mountSessionView};
39
+ \u2026`),o=u?pd(i):{},c=u&&(!i.startsWith("data:image/")||i.length<=256e3)?i:null,f=null;return u&&i.startsWith("data:image/")&&!c&&n&&Number.isSafeInteger(o.byteSize)&&(f=md(t,s,a),n.set(f,{...typeof s.id=="string"?{id:s.id}:{},label:s.label,url:i,...o})),[{...typeof s.id=="string"?{id:s.id}:{},label:s.label,...o,...c?{url:c}:{},...f?{reference:f}:{}}]}).slice(0,4);return r.length?r:void 0}function bd(e){let t=Array.isArray(e.options)?e.options.map(r=>r?.name).filter(Boolean).join(" / "):"",n=e.resolution?.name?` \u2192 ${e.resolution.name}`:"";return t?`${e.requestKind}: ${t}${n}`:`${e.requestKind??"request"}${n}`}function Oi(e,t,n){if(!e||typeof e!="object"||typeof e.id!="string")return null;if(e.kind==="message"){if(e.visibility==="context")return null;let r=et(e.text,t),s=hd(e.context),a=gd(e.images,e.id,n);return{id:e.id,...typeof e.key=="string"&&e.key!==e.id?{key:e.key}:{},role:e.role,...Number.isSafeInteger(e.messageIndex)&&e.messageIndex>0?{messageIndex:e.messageIndex}:{},text:r.text,ts:Pi(e.metadata),truncated:r.truncated,...s?{context:s}:{},...a?{images:a}:{}}}if(e.kind==="tool"){let r=et((e.arguments??"").trim(),t),s=et((e.resultText??"").trim(),t),a={id:e.id,...typeof e.key=="string"&&e.key!==e.id?{key:e.key}:{},role:"tool",...Number.isSafeInteger(e.messageIndex)&&e.messageIndex>0?{messageIndex:e.messageIndex}:{},text:"",ts:Pi(e.metadata),truncated:r.truncated||s.truncated,label:e.name??"tool",arguments:r.text,resultText:s.text,status:e.status};return a.presentation=Zr({...a,arguments:(e.arguments??"").trim(),resultText:(e.resultText??"").trim(),resultContent:e.resultContent,metadata:e.metadata}),a}if(e.kind==="reasoning"){let r=et(e.text,t);return{id:e.id,...typeof e.key=="string"&&e.key!==e.id?{key:e.key}:{},role:"reasoning",text:r.text,ts:null,truncated:r.truncated,streaming:e.streaming===!0}}if(e.kind==="request"){let r=et(bd(e),t),s=et(fd(e.payload),t);return{id:e.id,role:"request",text:r.text,ts:null,truncated:r.truncated||s.truncated,request:{requestId:es(e.requestId),requestKind:e.requestKind,payloadText:s.text,options:Array.isArray(e.options)?e.options.map(a=>({...a})):[],cancellable:e.cancellable===!0,status:e.status,resolution:e.resolution?{...e.resolution}:null}}}if(e.kind==="notice"){let r=et(e.text||e.code,t);return{id:e.id,role:"notice",text:r.text,ts:null,truncated:r.truncated,code:e.code}}return null}function yd(e,t,n){if(!Array.isArray(e))return[];let r=Qr(t.maxEntries,ld),s=Qr(t.maxEntryChars,dd),a=Qr(t.maxScanEntries,r*4),i=[],u=e.length-1,o=0;for(;u>=0&&i.length<r&&o<a;u-=1,o+=1){let c=Oi(e[u],s,n);c&&i.push(c)}if(i.at(-1)?.role!=="user")for(;u>=0&&o<a;u-=1,o+=1){let c=Oi(e[u],s,n);if(c?.role==="user"){i.length===r?i[i.length-1]=c:i.push(c);break}}return i.reverse(),i}var vd=(e="")=>`https://brand.volter.ai/runner/svg?seed=${encodeURIComponent(e)}&size=36&radius=18`;function _d(e,t){let n=new Map;for(let r of t){if(r?.role!=="user")continue;let s=Date.parse(r.metadata?.timestamp??"");Number.isFinite(s)&&n.set(s,r.metadata)}return e.map(r=>{if(r.role!=="user")return r;let s=n.get(r.ts)??{},a=s.source_name||null;return{...r,actor:{name:a??"Someone in the session",image:vd(a?s.source_principal_id||a:"")}}})}var xd={"claude-code":"claude_code",codex:"codex",gemini:"gemini",goose:"goose",grok:"grok",opencode:"opencode",pi:"pi"};function kd(e,t){return{source:xd[e.harness]??"native",session_id:e.id,model:null,cwd:null,system_prompt:null,agent_id:null,parent_tool_use_id:null,lineage:{},trigger:"human",surface:null,messages:t}}function lg(e,{onSend:t,control:n=!1}){let r={readOnly:n?"Control":"Read-only"},s={descriptor:null,messages:[],members:[],machines:[],live:!1,status:"loading",error:null,canSend:n,sending:!1},a={onIntent:async u=>{u?.action==="send"&&u.text?.trim()&&await t(u.text.trim())},copyText:u=>globalThis.navigator?.clipboard?.writeText(u)},i=()=>{let{descriptor:u,messages:o,members:c,machines:f,live:h,status:d,error:m,canSend:p,sending:g}=s,b=u?_d(Bi(kd(u,o),{prefix:u.id,maxEntries:500}),o):[],x=Xr({...vn,startup:"ready",harness:u?.harness??"",canSend:p&&!g,busy:g,transcript:b});Wt(tt("div",{class:"session-view"},tt(fi,{session:u,transcript:b,members:c,machines:f,live:h,status:d,error:m,adapter:a,labels:r}),p?tt("div",{class:"session-composer scui-root"},tt(It,{state:x,adapter:a})):null),e)};return i(),{update(u){s={...s,...u},i()},unmount(){Wt(null,e)}}}export{lg as mountSessionView};
package/viewer/viewer.mjs CHANGED
@@ -10,13 +10,32 @@ const $ = (id) => document.getElementById(id);
10
10
  const decoder = new TextDecoder();
11
11
  const status = (text) => { $('status').textContent = text; };
12
12
 
13
- let token = new URLSearchParams(location.hash.slice(1)).get('token');
13
+ const fragment = new URLSearchParams(location.hash.slice(1));
14
+ let token = fragment.get('token');
14
15
  history.replaceState(null, '', location.pathname);
15
16
  let waiting = null;
16
17
 
17
18
  const embedded = window.parent !== window;
18
19
  const ask = (type) => { if (embedded) window.parent.postMessage({ type }, '*'); };
20
+ // The host's style, as supercode-ui is themed: its `--volter-*` brand tokens and `--scui-*` component tokens, set on
21
+ // the session's root (every component reads them from an ancestor). Nothing else is taken from the host.
22
+ function applyTheme(properties) {
23
+ if (!properties || typeof properties !== 'object') return;
24
+ for (const [name, value] of Object.entries(properties)) {
25
+ if (!/^--(volter|scui)-[a-z0-9-]+$/.test(name) || typeof value !== 'string' || value.length > 400) continue;
26
+ // on the page (its background) and on the session root (which sets its own scheme default)
27
+ for (const element of [document.documentElement, $('session')]) element.style.setProperty(name, value);
28
+ }
29
+ }
30
+ // The session header is the host's to show: framed, it is hidden unless the host asks for it (the host's own header
31
+ // carries the session's details, which this page posts to it as `viewer-session`).
32
+ function showHeader(shown) { $('session').classList.toggle('header-hidden', !shown); }
33
+ try { applyTheme(JSON.parse(atob((fragment.get('theme') ?? '').replaceAll('-', '+').replaceAll('_', '/')) || 'null')); } catch { /* no theme */ }
34
+ showHeader(fragment.has('header') ? fragment.get('header') !== 'hidden' : !embedded);
35
+
19
36
  window.addEventListener('message', (event) => {
37
+ if (event.data?.type === 'viewer-theme') { applyTheme(event.data.properties); return; }
38
+ if (event.data?.type === 'viewer-header') { showHeader(!event.data.hidden); return; }
20
39
  if (event.data?.type !== 'delegated-token' || typeof event.data.token !== 'string') return;
21
40
  token = event.data.token;
22
41
  if (waiting) { const resume = waiting; waiting = null; resume(); }
@@ -42,8 +61,8 @@ async function main() {
42
61
  const claims = claimsOf(token);
43
62
  // A session token (a Room's session-backed Conversation) names one team session, not a surface.
44
63
  if (claims.session?.id) {
45
- $('target').textContent = `session · ${claims.session.id}`;
46
- $('scope').textContent = claims.scope === 'control' ? 'control' : 'view only';
64
+ // The session view's own header names the session and carries the one scope badge.
65
+ document.querySelector('body > header').hidden = true;
47
66
  await showSession(claims.session, claims.scope === 'control');
48
67
  ask('viewer-ready');
49
68
  return;
@@ -73,6 +92,7 @@ async function showSession(session, control) {
73
92
  const element = $('session');
74
93
  element.hidden = false;
75
94
  const view = mountSessionView(element, {
95
+ control,
76
96
  onSend: async (text) => {
77
97
  view.update({ sending: true });
78
98
  try {
@@ -84,9 +104,19 @@ async function showSession(session, control) {
84
104
  } catch (error) { status(`Not delivered: ${error.message}`); } finally { view.update({ sending: false }); }
85
105
  },
86
106
  });
87
- view.update({ canSend: control });
88
107
  const headers = async () => ({ Authorization: `Bearer ${await freshToken()}` });
89
- const apply = (body) => view.update({ descriptor: body.descriptor, messages: body.messages.map((message) => message.value), status: 'ready', error: null });
108
+ const HARNESSES = { 'claude-code': 'Claude Code', codex: 'Codex', gemini: 'Gemini CLI', goose: 'Goose', opencode: 'OpenCode', pi: 'Pi', grok: 'Grok' };
109
+ const apply = (body) => {
110
+ view.update({ descriptor: body.descriptor, messages: body.messages.map((message) => message.value), members: body.names?.members ?? [], machines: body.names?.machines ?? [], status: 'ready', error: null });
111
+ // What the host's own header shows about this session: who owns it, what runs it, where, and what this viewer may do.
112
+ const descriptor = body.descriptor ?? {};
113
+ const owner = (body.names?.members ?? []).find((member) => member.principal?.id === descriptor.user?.principal_id)?.principal?.display_name ?? descriptor.user?.reported_user ?? null;
114
+ if (embedded) window.parent.postMessage({ type: 'viewer-session', session: {
115
+ id: descriptor.id ?? session.id, title: descriptor.title ?? null, harness: descriptor.harness ?? null, harnessLabel: HARNESSES[descriptor.harness] ?? descriptor.harness ?? null,
116
+ owner, machines: (descriptor.machine_ids ?? []).map((id) => (body.names?.machines ?? []).find((machine) => machine.id === id)?.name ?? id),
117
+ scope: control ? 'control' : 'view', working: body.working ?? null,
118
+ } }, '*');
119
+ };
90
120
  let reading = null;
91
121
  const read = () => (reading ??= (async () => {
92
122
  try {