pikibun 0.24.0 → 0.25.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/dist/chunks/{chunk-XNVA5UWA.js → chunk-3IXKVGAD.js} +1 -1
- package/dist/chunks/{cli-L6ODIDYQ.js → cli-COW3WXMB.js} +1 -1
- package/dist/cli.js +3 -3
- package/dist/web/app.eb3752a36c.js +14 -0
- package/dist/web/app.eb3752a36c.js.br +0 -0
- package/dist/web/app.eb3752a36c.js.gz +0 -0
- package/dist/web/assets/src/assets/logo.5872d6d67c.png +0 -0
- package/dist/web/browser.6333ad295d/runtime.js +2 -0
- package/dist/web/browser.6333ad295d/runtime.js.br +0 -0
- package/dist/web/browser.6333ad295d/runtime.js.gz +0 -0
- package/dist/web/host.19652b6282.js +80 -0
- package/dist/web/host.19652b6282.js.br +0 -0
- package/dist/web/host.19652b6282.js.gz +0 -0
- package/dist/web/index.html +3 -3
- package/dist/web/index.html.br +0 -0
- package/dist/web/index.html.gz +0 -0
- package/dist/web/{nsh.89070fe10a.js → nsh.6b31ba26e0.js} +1 -1
- package/dist/web/nsh.6b31ba26e0.js.br +0 -0
- package/dist/web/nsh.6b31ba26e0.js.gz +0 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/dist/web/app.1d48db9d4c.js +0 -12
- package/dist/web/app.1d48db9d4c.js.br +0 -0
- package/dist/web/app.1d48db9d4c.js.gz +0 -0
- package/dist/web/browser.991ab24c49/runtime.js +0 -2
- package/dist/web/browser.991ab24c49/runtime.js.br +0 -0
- package/dist/web/browser.991ab24c49/runtime.js.gz +0 -0
- package/dist/web/host.a102cc9754.js +0 -38
- package/dist/web/host.a102cc9754.js.br +0 -0
- package/dist/web/host.a102cc9754.js.gz +0 -0
- package/dist/web/nsh.89070fe10a.js.br +0 -0
- package/dist/web/nsh.89070fe10a.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/LICENSES.txt +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/LICENSES.txt.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/LICENSES.txt.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/animation.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/animation.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/animation.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/bootstrap.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/buffer.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/buffer.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/buffer.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/canvas.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/canvas.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/canvas.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/components.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/components.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/components.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/dom.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/dom.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/dom.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/environment.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/environment.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/environment.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/gesture.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/gesture.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/gesture.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/host.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/host.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/host.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/hot.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/hot.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/hot.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/keymap.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/keymap.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/keymap.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/list.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/list.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/list.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/loader.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/modules.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/modules.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/modules.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/navigation.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/navigation.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/navigation.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/path.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/path.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/path.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/reactive.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/reactive.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/reactive.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/realm.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/resource.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/resource.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/resource.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/scope.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/scope.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/scope.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/standard.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/standard.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/standard.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/testing.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/testing.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/testing.js.gz +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/values.js +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/values.js.br +0 -0
- /package/dist/web/{browser.991ab24c49 → browser.6333ad295d}/values.js.gz +0 -0
|
@@ -3135,7 +3135,7 @@ ${clone.branch}`, { repository: repository.fullName, branch: clone.branch });
|
|
|
3135
3135
|
}
|
|
3136
3136
|
|
|
3137
3137
|
// ../shared/src/version.ts
|
|
3138
|
-
var buildVersion = true ? "0.
|
|
3138
|
+
var buildVersion = true ? "0.25.0" : void 0;
|
|
3139
3139
|
var CONNECTOR_VERSION_HEADER = "x-pikibun-version";
|
|
3140
3140
|
function validVersion(value) {
|
|
3141
3141
|
return value && /^[0-9A-Za-z][0-9A-Za-z .+_-]{0,63}$/.test(value) ? value : void 0;
|
package/dist/cli.js
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
defaultStateDir,
|
|
8
8
|
loadInstalled,
|
|
9
9
|
parseExtensionSource
|
|
10
|
-
} from "./chunks/chunk-
|
|
10
|
+
} from "./chunks/chunk-3IXKVGAD.js";
|
|
11
11
|
|
|
12
12
|
// ../../apps/runner/src/cache-cli.ts
|
|
13
13
|
import { join, relative, resolve } from "node:path";
|
|
@@ -171,7 +171,7 @@ function print(loaded) {
|
|
|
171
171
|
// package.json
|
|
172
172
|
var package_default = {
|
|
173
173
|
name: "pikibun",
|
|
174
|
-
version: "0.
|
|
174
|
+
version: "0.25.0",
|
|
175
175
|
description: "Connect your Linux or WSL2 Pi host to a Pikibun workspace, or run Pikibun on your own computer.",
|
|
176
176
|
license: "MIT",
|
|
177
177
|
homepage: "https://pikibun.com",
|
|
@@ -223,7 +223,7 @@ Options:
|
|
|
223
223
|
Run "pikibun connect --help" or "pikibun serve --help" for their options.
|
|
224
224
|
`;
|
|
225
225
|
var [command, ...args] = process.argv.slice(2);
|
|
226
|
-
var serveMain = async (args2) => (await import("./chunks/cli-
|
|
226
|
+
var serveMain = async (args2) => (await import("./chunks/cli-COW3WXMB.js")).serveMain(args2);
|
|
227
227
|
var run = command === "connect" ? connectMain : command === "cache" ? cacheMain : command === "extensions" ? extensionsMain : command === "serve" ? serveMain : void 0;
|
|
228
228
|
if (run) {
|
|
229
229
|
run(args).catch((error) => {
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import{Canvas as e,Clipboard as t,Path2D as n,Storage as r,cleanup as i,colorScheme as a,computed as o,context as s,effect as c,host as l,keyboardFrame as u,lifecycle as d,mount as f,openUrl as p,platform as m,safeArea as h,setColorScheme as g,signal as _,untracked as v,windowSize as y}from"nsh";import{append as b,bindProp as x,component as S,cond as C,each as w,element as T,insert as E,list as D,merge as O,prop as k,ref as A,text as j}from"nsh:rt";import{AlertDialog as ee,Button as M,Dialog as N,Menu as P,MenuItem as F,NavPage as I,NavStack as te,Sheet as ne,Switch as re,TextView as ie,Tooltip as ae,createNavStack as L}from"nsh/base";var R=class extends Error{status;code;constructor(e,t,n){super(n),this.status=e,this.code=t,this.name=`ApiError`}};const z={400:`Bad Request`,401:`Unauthorized`,403:`Forbidden`,404:`Not Found`,405:`Method Not Allowed`,408:`Request Timeout`,409:`Conflict`,413:`Payload Too Large`,429:`Too Many Requests`,500:`Internal Server Error`,502:`Bad Gateway`,503:`Service Unavailable`,504:`Gateway Timeout`,520:`Unknown Error`,521:`Web Server Is Down`,522:`Connection Timed Out`,523:`Origin Is Unreachable`,524:`A Timeout Occurred`},oe=e=>e.replace(/<\/?[a-z!][^>]*>/gi,` `),se=e=>e.replace(/ /g,` `).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`).replace(/&/g,`&`);function B(e){let t=e=>/<[a-z!/]/i.test(e),n=e=>{let n=se(e);return t(n)?oe(n.replace(/<(script|style)\b[\s\S]*?<\/\1>/gi,` `)):n},r=e;if(t(e)){let t=t=>{let r=RegExp(`<${t}\\b[^>]*>([\\s\\S]*?)</${t}>`,`i`).exec(e)?.[1];return r!==void 0&&n(r).trim()?r:void 0};r=t(`title`)??t(`h1`)??e}let i=n(r).replace(/[<>]/g,``);return i=i.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g,``).replace(/\s+/g,` `).trim(),i.length>200?`${i.slice(0,199)}…`:i}function ce(e){if(typeof e==`string`)return B(e);if(!e||typeof e!=`object`||Array.isArray(e))return``;let t=e;for(let e of[`message`,`detail`,`error_description`,`title`,`reason`]){let n=t[e];if(typeof n==`string`&&n.trim())return B(n)}return``}function le(e,t){let n=e.status,r=e.statusText||z[n]||``,i=t&&t.toLowerCase()!==r.toLowerCase()&&t!==String(n)?`: "${t}"`:``,a=`HTTP ${n}${r?` ${r}`:``}${i}`;return n===429?new R(429,`RATE_LIMITED`,`Pikibun is over its request limit right now (${a}). Try again later.`):n===408||n===504||n===522||n===524?new R(n,`UPSTREAM_TIMEOUT`,`The proxy in front of Pikibun stopped waiting for the server (${a}). The request took too long, but the server may have accepted it and still be working on it: check the result before retrying.`):n===502||n===503||n===520||n===521||n===523?new R(n,`BACKEND_UNAVAILABLE`,`The proxy in front of Pikibun got no valid answer from the server (${a}). The server may have restarted, crashed or taken too long while handling this request; if it changes something, check the result before retrying.`):e.ok?new R(n,`BACKEND_UNAVAILABLE`,`The Pikibun API answered with something other than JSON (${a}). Try again later.`):new R(n,`REQUEST_FAILED`,`The request failed before reaching Pikibun's API (${a}).`)}async function ue(e){if(!(e.headers.get(`content-type`)??``).includes(`application/json`))throw le(e,B(await e.text().catch(()=>``)));if(e.ok)try{return await e.json()}catch(t){throw t instanceof Error&&t.name===`AbortError`?t:new R(e.status,`BACKEND_UNAVAILABLE`,`The Pikibun API's answer arrived incomplete or garbled (HTTP ${e.status}). The connection may have dropped; if the request changes something, check the result before retrying.`)}let t=await e.text().catch(()=>``),n;try{n=JSON.parse(t)}catch{throw le(e,B(t))}let r=n&&typeof n==`object`?n:{},i=r.error,a=typeof i==`string`?i:i&&typeof i==`object`&&typeof i.message==`string`?i.message:void 0,o=i&&typeof i==`object`&&typeof i.code==`string`?i.code:typeof r.code==`string`?r.code:void 0;throw a?new R(e.status,o??`REQUEST_FAILED`,a):le(e,ce(n))}function de(e){let t=e.baseUrl??``,n=(t,n)=>(e.fetch??globalThis.fetch)(t,n);return async function(r,i={}){let a=i.method??`GET`,o={...i.headers,Accept:`application/json`},s={method:a,headers:o,signal:i.signal};if(e.auth===`cookie`)s.credentials=`same-origin`,a!==`GET`&&(o[`x-csrf-token`]=(await ue(await n(`${t}/api/auth/csrf`,{credentials:`same-origin`,signal:i.signal}))).csrfToken);else{s.credentials=`omit`;let t=e.auth();t&&(o.Authorization=`Bearer ${t}`)}i.body!==void 0&&(o[`Content-Type`]=`application/json`,s.body=JSON.stringify(i.body));let c=await n(`${t}${r}`,s);if(!(c.status===204&&c.ok))return await ue(c)}}function fe(e){return e instanceof R?e.message:e instanceof TypeError?`Could not reach Pikibun. Check your connection and try again.`:e instanceof Error?e.message:`Something went wrong. Please try again.`}const V=e=>encodeURIComponent(e),pe=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`],me={off:`Off`,minimal:`Minimal`,low:`Low`,medium:`Medium`,high:`High`,xhigh:`Extra high`,max:`Max`},he={read:{label:`Read only`,hint:`Inspect files; edits, commands and commits ask the session owner first`},approval:{label:`Ask before acting`,hint:`Edits are automatic; commands, commits, GitHub comments and merges need approval`},auto:{label:`Auto-approve`,hint:`Commands, commits, pushes, GitHub comments, issues and merges run immediately as the owner, without asking`}};function ge(e){return e?.capabilities.automaticGitHub===!0}function _e(e,t){let n=ge(e)?` GitHub comments and new issues are posted, and pull requests merged, as you without asking too: the agent can merge any pull request of this workspace's github.com repositories that GitHub lets you merge, into its base branch. Branch protection and required checks on GitHub still apply.`:` GitHub comments and merges still need approval.`;return(t?`Commands, commits and pushes the agent writes will run immediately on ${e.name}, an UNSANDBOXED host: commands run directly on the owner's machine with their full user permissions and network access, and no resource limits. Tools outside the agent won't ask either.`:`Commands, commits and pushes the agent writes will run immediately as you, without asking, as will tools outside the agent and commands on a host without resource limits.`)+n+ve(e)}function ve(e){return e.capabilities.hostCommands?e.hostCommandAccess===`auto`?` Its owner granted you automatic host commands, so host commands, such as its extensions' tools, also run OUTSIDE the sandbox on ${e.name} without asking, with access to the owner's host files, credentials and network.`:e.hostCommandAccess===`owner`||!e.capabilities.hostGrants?` On your own host, host commands, such as its extensions' tools, also run OUTSIDE the sandbox without asking, with access to your host files, credentials and network. On someone else's host they still need their approval.`:` On your own host, or one whose owner granted you automatic host commands, host commands, such as its extensions' tools, also run OUTSIDE the sandbox without asking, with access to that host's files, credentials and network. Elsewhere they still need approval.`:``}const ye=e=>`${e.provider}\n${e.modelId}`;function be(e,t){return t&&e?.models.find(e=>e.provider===t.provider&&e.modelId===t.modelId)}function xe(e){let t=e?.thinkingLevels??[];return t.some(e=>e!==`off`)?t:[]}function Se(e,t){if(!t||!e?.length||e.includes(t))return t;let n=pe.indexOf(t);return e.filter(e=>pe.indexOf(e)<=n).sort((e,t)=>pe.indexOf(t)-pe.indexOf(e))[0]??(e.includes(`off`)?`off`:e[0])}function Ce(e,t){let n=e?.thinkingLevels;if(e&&n?.length)return t&&n.includes(t)?t:e.thinkingLevel&&n.includes(e.thinkingLevel)?e.thinkingLevel:Se(n,t)}function we(e,t){return{...e,model:{provider:t.provider,modelId:t.modelId},thinkingLevel:t.thinkingLevel??Se(t.thinkingLevels,e.thinkingLevel)}}function Te(e,t,n){let r=e?.capabilities.chatOptions?be(e,t.model??n):void 0;if(!e||!r)return;let i=Ce(r,t.thinkingLevel??(t.model?void 0:n?.thinkingLevel));return{connectorId:e.id,provider:r.provider,modelId:r.modelId,...i?{thinkingLevel:i}:{}}}function Ee(e){if(e)try{let t=JSON.parse(e);if(!t||typeof t.connectorId!=`string`||typeof t.provider!=`string`||typeof t.modelId!=`string`)return;let n=pe.includes(t.thinkingLevel)?t.thinkingLevel:void 0;return{connectorId:t.connectorId,provider:t.provider,modelId:t.modelId,...n?{thinkingLevel:n}:{}}}catch{return}}function De(e,t,n,r=()=>!0){let i=t&&be(e,t),a=i&&r(i)?i:be(e,n);if(!a)return{access:`auto`};let o=a.thinkingLevels?.length?Ce(a,t?.thinkingLevel):a.thinkingLevel;return{model:{provider:a.provider,modelId:a.modelId},thinkingLevel:o,access:`auto`}}function Oe(e,t){let n=!e.entries?.some(e=>e.role===`user`),r=e.access??(t&&n?`auto`:`approval`);return{model:e.agent&&{provider:e.agent.provider,modelId:e.agent.modelId},thinkingLevel:e.agent?.thinkingLevel,access:r===`auto`&&!t?`approval`:r}}function ke(e,t,n){if(!(n!==`submit`||e||t.access===`approval`))return`Still checking this session's host, so "${he[t.access].label}" can't be applied yet. Try again in a moment.`}function Ae(e,t){if(e?.capabilities.chatOptions){if(!e.models.length)return`${e.name} offers no models right now.`;if(t.model&&!be(e,t.model))return`${e.name} no longer offers ${t.model.modelId}. Choose another model.`}}function je(e,t,n){if(!e?.capabilities.chatOptions)return;let r=be(e,t.model),i={};r&&(i.model={provider:r.provider,modelId:r.modelId});let a=Ce(r,t.thinkingLevel);return a&&(i.thinkingLevel=a),n===`submit`&&(i.access=t.access),n===`submit`&&t.access===`auto`&&ge(e)&&(i.autoMerge=!0),i}const Me=`pikibun.autoApproveConfirmed`;function Ne(e,t){return e?.autoMerge===!0&&!t}const Pe=/^([a-z_]+)\(\{.*\}\)$/s,Fe=/^ {0,3}(`{3,}|~{3,})(.*)$/s;function Ie(e){let t=[],n=``;for(let r of e.split(`
|
|
2
|
+
`)){let e=Fe.exec(r);if(n){e&&e[1][0]===n[0]&&e[1].length>=n.length&&!e[2].trim()&&(n=``),t.push({line:r});continue}if(e&&!(e[1][0]==="`"&&e[2].includes("`"))){n=e[1],t.push({line:r});continue}let i=Pe.exec(r);t.push(i?{line:r,tool:i[1]}:{line:r})}return t}function Le(e){let t=[],n=[];for(let{line:r,tool:i}of Ie(e))i===void 0?t.push(r):n.push({name:i,line:r});return{prose:t.join(`
|
|
3
|
+
`),calls:n}}const Re={size:50,max:200},ze=Object.keys({entries:e=>e.id,approvals:e=>e.id,conversations:e=>e.id,queue:e=>e.submissionId}),Be=[`entries`,`approvals`,`conversations`],Ve={items:2e5},He=/^[0-9a-f]{32}$/;function Ue(e){return typeof e==`string`&&He.test(e)}function We(e){let{entries:t,approvals:n,conversations:r,queue:i,...a}=e;return{fields:a,lists:{entries:t,approvals:n,conversations:r,queue:i}}}function Ge(e,t){if(!Array.isArray(t)||t.length>Ve.items)throw Error(`Invalid list patch`);let n=[],r=0;for(let i of t){if(typeof i==`number`){if(!Number.isSafeInteger(i)||i===0||r+Math.abs(i)>e.length)throw Error(`Invalid list patch`);if(i>0)for(let t=r+i;r<t;r++)n.push(e[r]);else r-=i}else if(i&&typeof i==`object`&&!Array.isArray(i))n.push(i);else throw Error(`Invalid list patch`);if(n.length>Ve.items)throw Error(`Invalid list patch`)}return n}function Ke(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return!Ue(t.base)||!Ue(t.revision)?!1:t.base===t.revision?t.view===void 0&&t.lists===void 0:!!t.view&&typeof t.view==`object`&&!Array.isArray(t.view)&&!!t.lists&&typeof t.lists==`object`&&!Array.isArray(t.lists)}function qe(e,t){if(!Ke(t))throw Error(`Invalid view patch`);if(t.base===t.revision)return e;let n=t.lists,r=t.view;if(ze.some(e=>Object.hasOwn(r,e))||Object.keys(n).some(e=>!ze.includes(e)))throw Error(`Invalid view patch`);let i=We(e),a={...r};for(let e of ze)n[e]!==void 0&&(a[e]=Ge(i.lists[e]??[],n[e]));if(Be.some(e=>!Array.isArray(a[e])))throw Error(`Invalid view patch`);return a}function Je(e,t){return(e?.entries??[]).filter(e=>e.conversationId===t)}function Ye(e,t,n){let r=/* @__PURE__ */ new Map;for(let i of n.conversations??[]){let a=i.olderEntries??0;if(a<=0||!i.previousEntryId)continue;let o=Je(t,i.id),s=Je(n,i.id)[0]?.id,c=o.findIndex(e=>e.id===s),l=c<0?o:o.slice(0,c),u=[...e.get(i.id)??[],...l];!u.length||u.length>a||u.at(-1).id!==i.previousEntryId||r.set(i.id,u)}return r}function Xe(e,t){if(!t.size)return e;let n=[],r=/* @__PURE__ */ new Set;for(let i of e.entries){let e=i.conversationId,a=e===void 0?void 0:t.get(e);e!==void 0&&a&&!r.has(e)&&(n.push(...a),r.add(e)),n.push(i)}return{...e,entries:n,conversations:e.conversations.map(e=>{let n=t.get(e.id);if(!n)return e;let{olderEntries:r,previousEntryId:i,...a}=e,o=(e.olderEntries??0)-n.length;return o>0?{...a,olderEntries:o}:a})}}function Ze(e,t,n){return t.get(n)?.[0]?.id??Je(e,n)[0]?.id}const Qe=[`queued`,`admitting`,`running`],$e={activeReopenMs:1e3,idleReopenMs:1e4,firstBackoffMs:2e3,maxBackoffMs:6e4,accessCheckMs:3e4};function et(e,t,n){let r=new AbortController,i=`/api/sessions/${V(e)}`,a=null,o=()=>{},s=0,c=!1,l=!1,u=!1,d,f=!1,p=null,m,h=/* @__PURE__ */ new Map,g=/* @__PURE__ */ new Map,_=()=>!f&&!r.signal.aborted;function v(e,n){h=Ye(h,p,e),p=e,m=typeof n==`string`?n:void 0,c=e.busy||(e.queue??[]).some(e=>Qe.includes(e.status))||e.repositories?.status===`preparing`,t.view(Xe(e,h)),t.error(``)}async function y(e){let a=p,o=(a?.conversations?.find(t=>t.id===e)?.olderEntries??0)-(h.get(e)?.length??0),s=a&&Ze(a,h,e);if(!_()||!a||o<=0||!s)return;let c=`conversation=${encodeURIComponent(e)}&before=${encodeURIComponent(s)}&limit=${Re.size}`;try{let a=await n.api(`${i}/entries?${c}`,{signal:r.signal});if(!_()||!p||Ze(p,h,e)!==s||!Array.isArray(a?.entries))return;let o=h.get(e)??[],l=new Map(h);l.set(e,[...a.entries,...o]),h=l,t.view(Xe(p,h))}catch(e){_()&&t.error(fe(e))}}function b(){a?.close(),a=null}function x(){f=!0,p=null,m=void 0,h=/* @__PURE__ */ new Map,b(),o(),t.session(null),t.view(null),t.status(`offline`)}async function S(e){if(!_())return;if(u){d=d===!0||e;return}u=!0;let a=!0;try{let o=await n.api(i,{signal:r.signal});if(a=!1,!_()||(t.session(o.session),!e))return;let s=await n.api(`${i}/view`,{signal:r.signal});_()&&v(s.view,s.revision)}catch(e){if(!_())return;t.error(fe(e)),a&&e instanceof R&&[401,403,404].includes(e.status)&&x()}finally{if(u=!1,d!==void 0&&_()){let e=d;d=void 0,S(e)}}}function C(e){if(o(),!_()||n.hidden())return;let t=setTimeout(w,e);o=()=>clearTimeout(t)}function w(){if(o(),!_()||n.hidden()||a)return;let e=n.openEvents(`${i}/events?since=${m??``}`);a=e;let r=!1,u=(e,n)=>{r=!0,s=0,t.status(`online`),v(e,n)};e.addEventListener(`view`,t=>{if(a!==e||!_())return;let n;try{n=JSON.parse(String(t.data))}catch{return}n?.view&&u(n.view,n.revision)}),e.addEventListener(`patch`,t=>{if(a!==e||!_())return;let n;try{n=JSON.parse(String(t.data))?.patch}catch{return}if(!Ke(n)||!p||n.base!==m){m=void 0;return}let r;try{r=qe(p,n)}catch{m=void 0;return}u(r,n.revision)}),e.addEventListener(`error`,()=>{if(a!==e||(b(),!_()))return;let n=l;if(l=!1,r)return C(c||n?$e.activeReopenMs:$e.idleReopenMs);s++,t.status(`reconnecting`),S(!0),C(Math.min($e.maxBackoffMs,$e.firstBackoffMs*2**(s-1)))})}let T=n.onVisibilityChange(()=>{_()&&(n.hidden()?(o(),b()):(S(!1),w()))}),E=setInterval(()=>{n.hidden()||S(!1)},$e.accessCheckMs);return S(!0).then(w),{refresh(){S(!1),a?l=!0:w()},loadOlder(e){let t=g.get(e);return t||(t=y(e).finally(()=>g.delete(e)),g.set(e,t)),t},stop(){r.abort(),b(),o(),clearInterval(E),T()}}}const tt={token_limit:`Pi's summary of the conversation hit its token limit, so the context could not be compacted.`,tool_call:`Pi's summarizer tried to call a tool instead of writing a summary, so the context could not be compacted.`,no_text:`Pi's summarizer wrote no summary, so the context could not be compacted.`,aborted:`Compacting the conversation's context was aborted.`};function nt(e,t={}){let n=tt[e]??`The conversation's context could not be compacted.`;return t.advice===!1?n:e===`aborted`?`${n} Send the message again to retry.`:`${n} Retrying at the same reasoning level will fail the same way: send the next message with a lower reasoning level, or continue in a new session. The host's owner or an admin can also raise this model's reserve tokens under Settings → Hosts → the host → Compaction (Pi's compaction.reserveTokens).`}const rt=/^\d{1,15}:\d{1,15}$/;function it(e){if(rt.test(e.id)){if(e.role===`user`)return{entryId:e.id,before:!0};if(!(e.role!==`assistant`||Le(e.text).calls.length>0))return{entryId:e.id,before:!1}}}function at(e){return e.rewindable===!0}const ot=/^\[image [^\s\]]+\]$/;function st(e){return e.text.split(`
|
|
4
|
+
`).filter(e=>!ot.test(e)).join(`
|
|
5
|
+
`).trim()}function ct(e,t){return t.trim()?e.trim()?`${e}\n\n${t}`:t:e}function lt(e){return e.role===`assistant`?Le(e.text).prose.trim():e.text}function ut(e){return e.connectorOwnerId!==e.ownerId}function dt(e,t,n=!1){return e.kind===`host.bash`||e.kind===`extension.tool`||(e.kind===`bash`||e.kind===`program`)&&(t.hostEnvironment===!0||n&&ut(t))}function ft(e,t,n=!1){return e.kind===`bash`||e.kind===`program`?!n&&!dt(e,t,n):e.kind===`git.push`||e.kind===`github.comment`||e.kind===`github.issue`}function pt(e,t){return e.kind===`host.bash`||e.kind===`extension.tool`||(e.kind===`bash`||e.kind===`program`)&&t.hostEnvironment===!0}function mt(e,t,n,r){return t.ownerId===r&&e.requestedBy!==t.ownerId&&t.requesterAutoApprove===!0&&(n===void 0||n.capabilities.requesterAutoApprove===!0)&&ft(e.operation,t,e.unbounded===!0)}function ht(e,t,n){return e.connectorOwnerId!==void 0&&e.connectorOwnerId===n||t?.hostCommandAccess!==void 0}function gt(e,t){return e.kind===`extension.tool`||e.kind===`host.bash`&&t?.capabilities?.hostOwnerDecides===!0}function _t(e,t,n,r,i){let a=t.connectorOwnerId!==void 0&&t.connectorOwnerId===r;return i&&ht(t,n,r)||a&>(e,n)}function vt(e,t){return gt(e,t)?`Waiting for the host's owner, or a member granted host commands with approve access to this session`:`Waiting for the host's owner or a member granted host commands, either with approve access to this session`}function yt(e){return e.source===`piki:tunnel`&&e.tool===`tunnel`?`This puts the session's web server online at a public address: the server runs in the session's sandbox, and cloudflared, on the session's host, publishes it from the host's network through a Cloudflare tunnel that anyone with the address can open. Only the host's owner, or a member granted host commands, can approve it.`:`${e.tool} comes from the extension ${e.source}. It runs on the session's host, in its connector, as the host's OS user, with access to their files, credentials and network, outside the sandbox. Only the host's owner, or a member granted host commands, can approve it.`}function bt(e){try{return JSON.stringify(JSON.parse(e.arguments),null,2)}catch{return e.arguments}}function xt(e){return e.kind===`extension.tool`?`Ran without a decision: its workspace runs this extension's tools automatically on this host, or the owner's auto-approve access ran it`:`Ran under the owner's auto-approve access, without a per-command decision`}const St={queued:`Waiting its turn`,authorizing:`Checking access`,waiting:`Waiting for another session's fetch`,connecting:`Connecting to the Git host`,enumerating:`Enumerating objects`,counting:`Counting objects`,compressing:`Compressing objects`,receiving:`Receiving objects`,resolving:`Resolving deltas`,verifying:`Verifying history`,checking:`Checking files`,"checking-out":`Checking out`,done:`Ready`};function Ct(e){return Object.hasOwn(St,e)?St[e]:`Preparing`}function wt(e){return typeof e==`number`&&Number.isSafeInteger(e)&&e>=0}function Tt(e){if(!wt(e))return``;let t=[`B`,`KiB`,`MiB`,`GiB`,`TiB`],n=e,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r++;return`${r&&n<10?n.toFixed(1):Math.round(n)} ${t[r]}`}function Et(e){return e.phase===`done`?100:typeof e.percent==`number`&&Number.isFinite(e.percent)?Math.min(100,Math.max(0,Math.round(e.percent))):void 0}function Dt(e){let t=[Ct(e.phase)],n=Et(e);return n!==void 0&&e.phase!==`done`&&t.push(`${n}%`),wt(e.done)&&wt(e.total)&&e.total>0?t.push(`${e.done.toLocaleString(`en-US`)} of ${e.total.toLocaleString(`en-US`)}`):wt(e.done)&&e.done>0&&t.push(e.done.toLocaleString(`en-US`)),wt(e.bytes)&&e.bytes>0&&t.push(Tt(e.bytes)),t.join(` · `)}function Ot(e){return e?.repositories?.status===`preparing`}const kt={working:{tone:`running`,label:`In progress`},waiting:{tone:`warning`,label:`Needs approval`},failed:{tone:`danger`,label:`Failed`},done:{tone:`success`,label:`Done`},idle:{tone:`neutral`,label:`Idle`}};function At(e,t=e.activity){return e.status===`archived`?{tone:`neutral`,label:`Archived`}:e.status===`provisioning`?{tone:`running`,label:`Starting`}:e.status===`error`?{tone:`danger`,label:`Not started`}:e.nextScheduledAt&&t!==`working`&&t!==`waiting`&&t!==`failed`?{tone:`info`,label:`Scheduled`,icon:`clock`}:t&&Object.hasOwn(kt,t)?kt[t]:{tone:`success`}}var jt=class{dispatch;#e=``;#t=``;#n=[];#r=!1;constructor(e){this.dispatch=e}push(e){for(this.#r&&e.startsWith(`
|
|
6
|
+
`)&&(e=e.slice(1)),this.#r=!1,this.#e+=e;;){let e=this.#e.search(/\r\n|\r|\n/);if(e<0)break;let t=this.#e.startsWith(`\r
|
|
7
|
+
`,e)?2:1;t===1&&this.#e[e]===`\r`&&e===this.#e.length-1&&(this.#r=!0),this.#i(this.#e.slice(0,e)),this.#e=this.#e.slice(e+t)}}#i(e){if(e===``){this.#n.length&&this.dispatch(this.#t||`message`,this.#n.join(`
|
|
8
|
+
`)),this.#t=``,this.#n=[];return}if(e.startsWith(`:`))return;let t=e.indexOf(`:`),n=t<0?e:e.slice(0,t),r=t<0?``:e.slice(t+1);r.startsWith(` `)&&(r=r.slice(1)),n===`event`?this.#t=r:n===`data`&&this.#n.push(r)}};function Mt(e){let t=/* @__PURE__ */ new Map,n=new AbortController,r=!1,i=(e,n)=>{if(!r)for(let r of t.get(e)??[])r(n===void 0?{}:{data:n})};return(async()=>{let t=await e.fetch(e.url,{headers:{Accept:`text/event-stream`,...e.headers},signal:n.signal,credentials:`omit`});if(!t.ok||!t.body){await t.body?.cancel().catch(()=>{});return}let a=t.body.getReader(),o=new TextDecoder,s=new jt(i);for(;;){let e=await a.read();if(e.done||r)break;s.push(o.decode(e.value,{stream:!0}))}r?await a.cancel().catch(()=>{}):s.push(o.decode())})().catch(()=>{}).then(()=>i(`error`)),{addEventListener(e,n){t.set(e,[...t.get(e)??[],n])},close(){r=!0,n.abort()}}}function Nt(e){return{id:e.userId,githubLogin:e.githubLogin,role:e.role}}function Pt(e){return e.githubLogin||e.id}function Ft(e){return e.githubLogin?`${e.githubLogin}(${e.id})`:e.id}function It(e){let t=new Map(e.map(e=>[e.id,e]));return e=>t.get(e)??{id:e}}const Lt=[`owner`,`admin`,`collaborator`,`member`],Rt=[`owner`,`admin`];function zt(e,t,n){return e===t||n!==void 0&&Rt.includes(n)}function Bt(e){return Lt.includes(e??`member`)}const H=`[redacted]`,Vt=/^[A-Za-z0-9._~+/=:@%^!#,-]+$/,Ht=/^(?:\$\{?[A-Za-z_]|\{\{|\{%|%\(|<[^<>]*>$|\*+$|x{3,}$|\.{3}$|\u2026$|your[_-]|(?:null|none|nil|undefined|true|false|empty)$)/i;function Ut(e,t){return!!e&&!e.includes(`[redacted]`)&&!Ht.test(e)&&(!t.command||Vt.test(e))}function Wt(e){return e.length>=6&&(/^\d+$/.test(e)||/\d/.test(e)&&/[A-Za-z]/.test(e)||/[!@#%^*~]/.test(e)||/^[0-9a-f]{16,}$/i.test(e))}const Gt=/* @__PURE__ */ new Set(/* @__PURE__ */ `string.text.number.integer.float.double.boolean.bytes.buffer.object.unknown.never.char.varchar.null.none.undefined.true.false.enabled.disabled.required.optional.invalid.valid.incorrect.correct.wrong.missing.empty.blank.expired.hidden.masked.redacted.sensitive.case-sensitive.stored.saved.encrypted.hashed.salted.protected.changed.reset.needed.necessary.mandatory.unset.weak.strong.long.short.ready.same.different.given.provided.supplied.generated.random.unique.default.allowed.accepted.rejected.denied.locked.unlocked.visible.shown.cleared.removed.deleted.updated.unchanged.secure.insecure.safe.unsafe.known.special.important.plain.plaintext.ciphertext.encoded.decoded.password.passwords.passwd.passphrase.pass.secret.token.value.values.credential.credentials.hash.input.data.body.form.user.args.params.options.config.field.entry.item.result.response.request.payload.answer.prompt.match`.split(`.`));function Kt(e){return/^[A-Za-z][A-Za-z-]{3,63}$/.test(e)&&!/^[a-z]+[A-Z]|^[A-Z][a-z]+[A-Z]/.test(e)&&!Gt.has(e.toLowerCase())}function qt(e,t){let n=t;for(;e[n]===` `||e[n]===` `;)n++;let r=e[n]??``;return r===`
|
|
9
|
+
`||r===`\r`?``:r}const Jt=/-----BEGIN ((?:[A-Z0-9]{1,16} ){0,4})PRIVATE KEY( BLOCK)?-----/g,Yt=/(?:Proc-Type|DEK-Info|Version|Comment|Hash|Charset): [^\r\n\\]{0,256}/y,Xt=/^(?:\r?\n|\\r\\n|\\n)/,Zt=/(?:\r?\n|\\r\\n|\\n)[ \t]*$/;function Qt(e){if(!e.includes(`PRIVATE KEY`))return e;let t=``,n=0;Jt.lastIndex=0;for(let r=Jt.exec(e);r;r=Jt.exec(e)){let i=r.index+r[0].length,a=`-----END ${r[1]}PRIVATE KEY${r[2]??``}-----`,o=Math.min(e.length,i+65536),s=i,c=0,l=!0,u=!1;for(;s<o;){if(e.startsWith(a,s)){u=!0;break}let t=e[s];if(t===`
|
|
10
|
+
`||t===`\r`)s++,l=!0;else if(t===`\\`&&(e[s+1]===`n`||e[s+1]===`r`))s+=2,l=!0;else if((t===` `||t===` `)&&l)s++;else if(l&&(Yt.lastIndex=s,Yt.test(e)))s=Yt.lastIndex,l=!1;else if(/[A-Za-z0-9+/=]/.test(t))s++,c++,l=!1;else break}if(c&&(u||c>=16)){let r=e.slice(i,s);t+=e.slice(n,i)+(Xt.exec(r)?.[0]??``)+H+(Zt.exec(r)?.[0]??``),n=s}Jt.lastIndex=u?s+a.length:Math.max(s,i)}return t+e.slice(n)}const $t=String.raw`pass(?:word|wd|phrase)|secret|token|api[_-]?key|(?:access|secret|private|auth|account|encryption|signing|master|session)[_-]?key`,en=/pass|secret|token|key/i,tn=String.raw`"((?:[^"\\\n\x60$]|\\[^\n]){1,8192})"|'([^'\n]{1,8192})'|\\"((?:[^"\\\n\x60$]|\\[^"\n]){1,8192})\\"`,nn=String.raw`([^\s'"\x60,;&|<>(){}\[\]$\\=][^\s'"\x60,;&|<>(){}\[\]$\\]{0,1023})`,rn=new RegExp(String.raw`(${$t})((?:\\?["'])?)([ \t]{0,16}(?::=|=>|[:=])[ \t]{0,16}|[ \t]{1,16}(?:is|was)[ \t]{1,16})(?:${tn}|${nn})`,`gi`),an=/^[ \t]+(?:is|was)[ \t]+$/i;function on(e,t){return e.replace(rn,(n,r,i,a,o,s,c,l,u)=>{let d=o??s??c??l??``,f=``;if(l===void 0){if(/^\s|\s$/.test(d))return n}else{/[^.]\.$/.test(d)&&(d=d.slice(0,-1),f=`.`);let t=qt(e,u+n.length);if(a===`=`){if(/[),}\]]/.test(t)?!Wt(d):/^\d{1,5}$/.test(d))return n}else{let e=an.test(a);if(!e&&/[;,)}\]|<>({[=?:&]/.test(t))return n;let i=f!==``||t===``||(e?/[.!?,;)"']/.test(t):t===`#`);if(!Wt(d)&&!(/^pass/i.test(r)&&i&&Kt(d)))return n}}if(!Ut(d,t))return n;let p=o===void 0?s===void 0?c===void 0?H+f:`\\"${H}\\"`:`'${H}'`:`"${H}"`;return r+i+a+p})}const sn=new RegExp(String.raw`(--(?:[A-Za-z0-9]{1,32}-){0,4}(?:pass(?:word|wd|phrase)|secret|token|api-?key|(?:access|secret|private|auth)-key))([ \t]{1,16})(?:"([^"\\\n\x60$]{1,1024})"|'([^'\n]{1,1024})'|([^\s'"\x60,;&|<>(){}\[\]$\\-][^\s'"\x60,;&|<>(){}\[\]$\\]{0,1023}))`,`gi`);function cn(e,t){return e.includes(`--`)?e.replace(sn,(e,n,r,i,a,o)=>Ut(i??a??o??``,t)?n+r+(i===void 0?a===void 0?H:`'${H}'`:`"${H}"`):e):e}const ln=/(\bcurl\b[^\n]{0,2048}?[ \t])(-u|--user)([ \t]{1,16}|=)(["']?)([^\s:'"\x60;&|<>(){}$\\]{1,256}):([^\s'"\x60;&|<>(){}$\\]{1,1024})\4(?![^\s])/g,un=/\b(machine[ \t\r\n]{1,64}[^\s]{1,253}[ \t\r\n]{1,64}(?:login[ \t\r\n]{1,64}[^\s]{1,253}[ \t\r\n]{1,64})?password[ \t\r\n]{1,64})([^\s]{1,1024})/g,dn=/\b((?:proxy-)?authorization["']?[ \t]{0,16}[:=][ \t]{0,16}["']?(?:bearer|basic|token|bot|digest|negotiate|apikey|sso-key)[ \t]{1,16})([A-Za-z0-9._~+/=:-]{1,4096})/gi,fn=/\b(bearer[ \t]{1,16})([A-Za-z0-9._~+/-]{16,4096}=*)(?![A-Za-z0-9._~+/=-])/gi,pn=/\b([a-z][a-z0-9+.-]{1,30}:\/\/[^\s:/@?#'"<>[\]]{0,256}:)([^\s@/?#'"<>[\]]{1,1024})(?=@)/gi;function mn(e,t){let n=e;return n.includes(`curl`)&&(n=n.replace(ln,(e,n,r,i,a,o,s)=>/^\d+$/.test(o)&&/^\d+$/.test(s)||!Ut(s,t)?e:`${n}${r}${i}${a}${o}:${H}${a}`)),n.includes(`machine`)&&(n=n.replace(un,(e,n,r)=>Ut(r,t)?n+H:e)),/bearer|authorization|basic|token|digest|negotiate|apikey|sso-key|bot/i.test(n)&&(n=n.replace(dn,(e,n,r)=>Ut(r,t)?n+H:e),n=n.replace(fn,(e,n,r)=>/\d/.test(r)&&Ut(r,t)?n+H:e)),n.includes(`://`)&&(n=n.replace(pn,(e,n,r)=>Ut(r,t)?n+H:e)),n}const hn=[{pattern:/(?<![A-Za-z0-9_])(gh[pousr]_)([A-Za-z0-9]{36,251})(?![A-Za-z0-9_])/g},{pattern:/(?<![A-Za-z0-9_])(github_pat_)([A-Za-z0-9_]{22,255})(?![A-Za-z0-9_])/g},{pattern:/(?<![A-Za-z0-9_.-])(gl(?:pat|dt|rt|ptt|cbt|imt|soat|agent|oas|ffct|ft)-)([A-Za-z0-9_.-]{20,255})/g},{pattern:/(?<![A-Za-z0-9_-])(xox[abposr]-)([A-Za-z0-9-]{10,255})/g},{pattern:/(?<![A-Za-z0-9_-])(xapp-)([A-Za-z0-9-]{10,255})/g},{pattern:/(https:\/\/hooks\.slack\.com\/(?:services|workflows|triggers)\/)([A-Za-z0-9/_-]{16,255})/g},{pattern:/(https:\/\/(?:ptb\.|canary\.)?discord(?:app)?\.com\/api\/webhooks\/[0-9]{1,30}\/)([A-Za-z0-9_-]{20,255})/g},{pattern:/(?<![A-Za-z0-9])(AKIA|ASIA|ABIA|ACCA)([A-Z0-9]{16})(?![A-Za-z0-9])/g},{pattern:/(?<![A-Za-z0-9_-])(sk-(?:proj-|ant-(?:api|admin)[0-9]{2}-|svcacct-|admin-)?)([A-Za-z0-9_-]{20,255})/g,digit:!0},{pattern:/(?<![A-Za-z0-9_-])(AIza)([0-9A-Za-z_-]{35})(?![A-Za-z0-9_-])/g},{pattern:/(?<![A-Za-z0-9_-])(GOCSPX-)([A-Za-z0-9_-]{28})(?![A-Za-z0-9_-])/g},{pattern:/(?<![A-Za-z0-9_])((?:sk|rk)_(?:live|test)_)([A-Za-z0-9]{10,255})/g},{pattern:/(?<![A-Za-z0-9_])(whsec_)([A-Za-z0-9+/=]{20,255})/g},{pattern:/(?<![A-Za-z0-9_])(npm_)([A-Za-z0-9]{36})(?![A-Za-z0-9])/g},{pattern:/(?<![A-Za-z0-9_-])(pypi-)([A-Za-z0-9_-]{50,255})/g},{pattern:/(?<![A-Za-z0-9_])(hf_)([A-Za-z0-9]{30,255})/g},{pattern:/(?<![A-Za-z0-9_.-])(SG\.)([A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43})(?![A-Za-z0-9_-])/g},{pattern:/(?<![A-Za-z0-9_])(shp(?:at|ca|pa|ss)_)([a-fA-F0-9]{32})(?![A-Za-z0-9])/g},{pattern:/(?<![A-Za-z0-9_])(do[opr]_v1_)([a-f0-9]{64})(?![A-Za-z0-9])/g},{pattern:/(?<![A-Za-z0-9_.-])(hv[sb]\.)([A-Za-z0-9_-]{24,255})/g},{pattern:/(?<![A-Za-z0-9_.-])(dp\.(?:pt|st|sa|ct|scim|audit)\.)([A-Za-z0-9]{40,255})/g},{pattern:/(?<![A-Za-z0-9_])(lin_api_)([A-Za-z0-9]{40})(?![A-Za-z0-9])/g}],gn=/gh[pousr]_|github_pat_|gl[a-z]{1,5}-|xox[abposr]-|xapp-|hooks\.slack\.com|discord(?:app)?\.com|A(?:KIA|SIA|BIA|CCA)|sk-|AIza|GOCSPX-|[sr]k_(?:live|test)_|whsec_|npm_|pypi-|hf_|SG\.|shp(?:at|ca|pa|ss)_|do[opr]_v1_|hv[sb]\.|dp\.|lin_api_/,_n=/(?<![A-Za-z0-9_-])eyJ[A-Za-z0-9_-]{8,1024}\.eyJ[A-Za-z0-9_-]{8,8192}\.[A-Za-z0-9_-]{8,1024}(?![A-Za-z0-9_-])/g,vn=/(#\/shared\/)([A-Za-z0-9_-]{43})(?![A-Za-z0-9_-])/g;function yn(e){let t=e;if(gn.test(t))for(let{pattern:e,digit:n}of hn)t=t.replace(e,(e,t,r)=>n&&!/\d/.test(r)?e:t+H);return t.includes(`eyJ`)&&(t=t.replace(_n,H)),t.includes(`#/shared/`)&&(t=t.replace(vn,`$1${H}`)),t}function bn(e,t={}){if(typeof e!=`string`||!e)return e;let n=t.command?e:Qt(e);return n=mn(n,t),en.test(n)&&(n=cn(on(n,t),t)),yn(n)}function xn(e){return JSON.stringify(e??``).includes(H)}Object.freeze([`goto`,`click`,`type`,`press`,`select`,`hover`,`scroll`,`wait`,`evaluate`,`screenshot`,`back`,`forward`,`reload`]),Object.freeze([`Enter`,`Tab`,`Escape`,`Backspace`,`Delete`,`Space`,`ArrowUp`,`ArrowDown`,`ArrowLeft`,`ArrowRight`,`Home`,`End`,`PageUp`,`PageDown`]),Object.freeze({actions:50,url:4096,selector:1024,text:4096,expression:4096,timeoutSeconds:{min:1,max:120,default:30},serveSeconds:{min:1,max:600,default:60},waitMs:6e4,viewport:{minWidth:200,maxWidth:3840,minHeight:200,maxHeight:2160,width:1280,height:800}}),Object.freeze([`auto`,`path`,`download`,`off`]),Object.freeze({source:`auto`}),Object.freeze([`ready`,`missing`,`downloading`,`failed`,`off`,`unsupported`]),Object.freeze({executable:4096,text:1024}),Object.freeze([`on-host`,`sandbox`,`off`,`missing`,`downloading`,`failed`]);const Sn=Object.freeze({"on-host":`The browser runs only in a session's sandbox, and this session runs on its host itself.`,sandbox:`This host's sandbox can't run the browser yet: it runs in the Linux sandbox only.`,off:`This host's owner turned the browser off for its sessions.`,missing:`This host has no Chromium for the browser. Its owner can find one installed there, give its path or download one, under Settings → Hosts → the host → Extensions.`,downloading:`This host is downloading Chromium for the browser: the tool is offered once it is ready, within a few minutes.`,failed:`This host couldn't download Chromium for the browser. It tries again later; its owner can see why, or set one up another way, under Settings → Hosts → the host → Extensions.`});function Cn(e){return Sn[e]??`This session can't use the browser on its host.`}const wn={draft:`Draft`,open:`Open`,failing:`CI failed`,changes_requested:`Changes requested`,merged:`Merged`,closed:`Closed`},Tn={draft:`neutral`,open:`success`,failing:`danger`,changes_requested:`danger`,merged:`merged`,closed:`neutral`},En=typeof d==`function`?d:()=>`active`,Dn=/* @__PURE__ */ new Map,On=/* @__PURE__ */ new Map,kn=/* @__PURE__ */ new Map;function An(){Dn.clear(),On.clear(),kn.clear()}function jn(e,t){t?Dn.set(e,t):Dn.delete(e)}function Mn(e){return Dn.get(e)??``}function Nn(e,t){Dn.get(e)===t&&Dn.delete(e);for(let n of On.get(e)??[])n(t)}function Pn(e,t){if(!t.trim())return;let n=e=>ct(e,t),r=kn.get(e);if(r?.size)for(let e of r)e(n);else jn(e,n(Mn(e)))}function Fn(e){let t=_(Mn(e)),n=e=>t.update(t=>t===e?``:t),r=e=>t.update(e),a=On.get(e)??/* @__PURE__ */ new Set;a.add(n),On.set(e,a);let o=kn.get(e)??/* @__PURE__ */ new Set;return o.add(r),kn.set(e,o),i(()=>{a.delete(n),a.size||On.delete(e),o.delete(r),o.size||kn.delete(e)}),c(()=>jn(e,t())),t}const In=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`;function Ln(e){let t=``,n=0,r=0;for(let i of e){for(r=r<<8|i,n+=8;n>=6;)n-=6,t+=In[r>>n&63];r&=(1<<n)-1}return n>0&&(t+=In[r<<6-n&63]),t}function Rn(e){let t=new Uint8Array(e);return crypto.getRandomValues(t),Ln(t)}async function zn(){let e=Rn(32);return{verifier:e,challenge:Ln(new Uint8Array(await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(e)))),state:Rn(24)}}const Bn=[`localhost`,`127.0.0.1`],Vn=m.os===`web`;function Hn(e){let t=e.trim().replace(/\/+$/,``);if(!t)return{error:`Enter the server address, e.g. https://pikibun.com.`};/^[a-z][a-z0-9+.-]*:\/\//i.test(t)||(t=`https://${t}`);let n=/^(https?):\/\/(\[[0-9a-f:.]+\]|[a-z0-9.-]+)(:\d{1,5})?$/i.exec(t);if(!n)return{error:`Enter only the server address (scheme and host), without a path.`};let r=n[1].toLowerCase(),i=n[2].toLowerCase(),a=`${r}://${i}${n[3]??``}`;return r===`https`||Bn.includes(i)?{origin:a}:{error:`Use https://, or http:// only for localhost or 127.0.0.1.`}}const Un=e=>e.replace(/^https:\/\//,``)||`this server`,Wn={invite_required:`This server takes new accounts only through a workspace's invite link. Open the link in a browser to create your account, then sign in here.`,signup_closed:`This server doesn't take new accounts. Ask its operator to add you.`,too_many_pending:`The workspace that invited you has too many people waiting to join. Ask an owner or admin.`},Gn=`pikibun.token`,Kn=`pikibun.tokenExpires`,qn=`pikibun.origin`,Jn=_({status:`loading`}),Yn=Jn,Xn=e=>e.status===`signedIn`?`${e.origin} ${e.user.id}`:null;function Zn(e){let t=Xn(v(Jn));t!==null&&t!==Xn(e)&&An(),Jn.set(e)}function U(){let e=Yn();if(e.status!==`signedIn`)throw Error(`This screen needs a signed-in user.`);return e}let Qn=null;const $n=`Your sign-in expired or was revoked. Sign in again to continue.`;async function er(){await Promise.all([r.removeItem(Gn),r.removeItem(Kn)])}function tr(e){if(Qn!==e)return;Qn=null,er();let t=Yn();t.status===`signedIn`&&t.token===e&&Zn({status:`signedOut`,origin:t.origin,notice:$n})}function nr(e,t){return async function(n,r){try{return await e(n,r)}catch(e){throw e instanceof R&&e.status===401&&tr(t),e}}}async function rr(){try{let e=await fetch(`/api/health`,{credentials:`same-origin`});return new URL(e.url).origin}catch{return``}}const ir=()=>de({baseUrl:``,auth:`cookie`});async function ar(e,t,n,i){let a=nr(de({baseUrl:e,auth:()=>t}),t);Qn=t;let o=i;try{o??=(await a(`/api/me`)).user}catch(e){throw Qn===t&&(Qn=null),e}await Promise.all([r.setItem(Gn,t),r.setItem(qn,e),n?r.setItem(Kn,n):r.removeItem(Kn)]),Zn({status:`signedIn`,origin:e,token:t,expiresAt:n,user:o,api:a})}async function or(){let e=await rr(),t=ir();try{let{user:n}=await t(`/api/me`);return Qn=null,Zn({status:`signedIn`,origin:e,token:null,expiresAt:null,user:n,api:nr(t,null)}),!0}catch(t){return t instanceof R&&t.status===401?(Zn({status:`signedOut`,origin:e}),!1):(Zn({status:`unreachable`,origin:e,error:fe(t)}),!1)}}async function sr(){if(Zn({status:`loading`}),Vn){await or();return}let[e,t,n]=await Promise.all([r.getItem(qn),r.getItem(Gn),r.getItem(Kn)]),i=e??`https://pikibun.com`;if(!t)return Zn({status:`signedOut`,origin:i});try{await ar(i,t,n)}catch(e){e instanceof R&&e.status===401?(await er(),Zn({status:`signedOut`,origin:i,notice:$n})):Zn({status:`unreachable`,origin:i,error:fe(e)})}}async function cr(e){return de({baseUrl:e,auth:()=>null})(`/api/health`)}async function lr(e){if((await cr(e)).githubConfigured===!1)throw Error(`GitHub sign-in is not configured on this server. The operator needs to configure the GitHub OAuth app and the server's GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET and VAULT_KEY settings.`);let{verifier:t,challenge:n,state:r}=await zn();return{url:`${e}/api/auth/native/start?challenge=${n}&state=${r}&callback=page`,isCallback:t=>ur(e,t),async finish(n){if(!ur(e,n))throw Error(`The sign-in ended somewhere unexpected. Try again.`);let i=new URL(n).searchParams;if(i.get(`state`)!==r)throw Error(`The sign-in response did not match this attempt. Try again.`);let a=i.get(`error`);if(a)throw Error(Wn[a]??`GitHub sign-in did not complete: ${a.slice(0,300)}`);let o=i.get(`code`);if(!o)throw Error(`The server did not return a sign-in code. Try again.`);let s=await de({baseUrl:e,auth:()=>null})(`/api/auth/native/token`,{method:`POST`,body:{code:o,verifier:t,deviceName:`Pikibun NSH (${m.os})`}});await ar(e,s.token,s.expiresAt,s.user)}}}function ur(e,t){try{let n=new URL(t);return n.origin===new URL(e).origin&&n.pathname===`/api/auth/native/done`}catch{return!1}}async function dr(e,t){await ar(e,t.trim(),null)}async function fr(e,t){let n=await fetch(`/api/auth/password/login`,{method:`POST`,credentials:`same-origin`,headers:{Accept:`application/json`,"Content-Type":`application/json`},body:JSON.stringify({username:e,password:t})});if(!n.ok){let e=`Sign-in failed (HTTP ${n.status}).`;try{let t=await n.json();e=typeof t.error==`string`?t.error:t.error?.message??e}catch{}throw Error(e)}if(!await or())throw Error(`Signed in, but the server did not keep the session. Check that cookies are allowed.`)}const pr=or;async function mr(){let e=Yn();if(e.status!==`signedIn`&&e.status!==`unreachable`)return;let t=e.origin,n,i=null;if(e.status===`signedIn`)Qn=null,i=t=>e.api(`/api/auth/logout`,{method:`POST`,signal:t});else if(!Vn){let e=await r.getItem(Gn);e&&(i=n=>de({baseUrl:t,auth:()=>e})(`/api/auth/logout`,{method:`POST`,signal:n}))}if(i){let e=new AbortController,t=setTimeout(()=>e.abort(),1e4);try{await i(e.signal)}catch(t){t instanceof R&&t.status===401||(n=`Signed out on this device, but the server could not revoke the sign-in (${e.signal.aborted?`it didn't answer`:fe(t)}). Revoke it under Settings › Profile on the web.`)}finally{clearTimeout(t)}}await er(),Zn({status:`signedOut`,origin:t,notice:n})}const hr=()=>v(En)===`background`;function gr(e,t){let n=_(null),r=_(!1),i=_(``),a=_(0),o;c(()=>{let s=e();a();let c=typeof t==`function`?t():t,{api:l}=v(U),u=new AbortController;if(o!==s&&(o=s,n.set(null)),i.set(``),!s)return r.set(!1),()=>u.abort();r.set(!0);let d=!1,f=async()=>{if(!d){d=!0;try{let e=await l(s,{signal:u.signal});u.signal.aborted||(n.set(e),i.set(``))}catch(e){u.signal.aborted||i.set(fe(e))}finally{d=!1,u.signal.aborted||r.set(!1)}}};if(f(),!c)return()=>u.abort();let p=setInterval(()=>{hr()||f()},c);return()=>{u.abort(),clearInterval(p)}});let s=v(En)!==`background`;return c(()=>{let e=En()!==`background`;e&&!s&&t&&a.update(e=>e+1),s=e}),{data:n,loading:r,error:i,refresh:()=>a.update(e=>e+1)}}function W(){let e=_(!1),t=_(``),n=_(``),r=!1;return{busy:e,error:t,notice:n,async run(i,a=``){if(r)return!1;r=!0,e.set(!0),t.set(``),n.set(``);try{return await i(),n.set(a),!0}catch(e){return t.set(fe(e)),!1}finally{r=!1,e.set(!1)}},clear(){t.set(``),n.set(``)}}}const _r=`pikibun.lastChat`,vr=s(null);function yr(){let e=_(null),t=()=>!1,n=gr(()=>`/api/sessions`,()=>t()?1e4:3e4),i=gr(()=>`/api/workspaces`),a=o(()=>[...n.data()?.sessions??[]].sort((e,t)=>t.createdAt.localeCompare(e.createdAt)));t=o(()=>e()?.activity===`working`||a().some(e=>e.status!==`archived`&&e.activity===`working`));let s=_(``),c=_(void 0),l=_(!1);return r.getItem(_r).then(e=>{c()||c.set(Ee(e))},()=>void 0),r.getItem(Me).then(e=>{e===`1`&&l.set(!0)},()=>void 0),{sessions:a,sessionsLoading:()=>n.loading()&&!n.data(),sessionsReloading:n.loading,sessionsError:n.error,refreshSessions:n.refresh,workspaces:()=>i.data()?.workspaces??[],workspacesLoading:()=>i.loading()&&!i.data(),workspacesError:i.error,refreshWorkspaces:i.refresh,lastWorkspaceId:s,setLastWorkspaceId:e=>s.set(e),lastChat:c,rememberChat(e,t,n){let i=Te(e,t,n);i&&(c.set(i),r.setItem(_r,JSON.stringify(i)).catch(()=>void 0))},autoApproveConfirmed:l,rememberAutoApproveConfirmed(){l.set(!0),r.setItem(Me,`1`).catch(()=>void 0)},liveActivity:e,setLiveActivity:t=>e.set(t)}}function br(){let e=vr();if(!e)throw Error(`useAppData must be used inside the signed-in shell`);return e}function xr(e){if(e)try{return decodeURIComponent(e)}catch{return}}function Sr(e){let[t,n,r]=e.replace(/^#\/?/,``).split(`/`).filter(Boolean);if(t===`s`&&xr(n))return{name:`session`,sessionId:xr(n)};if(t===`shared`&&xr(n))return{name:`shared`,token:xr(n)};if(t===`join`&&xr(n))return{name:`join`,token:xr(n)};if(t===`w`&&xr(n)&&r===`new`)return{name:`new`,workspaceId:xr(n)};if(t===`settings`){let e=xr(n),t=xr(r);return{name:`settings`,...e?{section:e}:{},...t?{id:t}:{}}}return{name:`home`}}function Cr(e){switch(e.name){case`home`:return`#/`;case`session`:return`#/s/${encodeURIComponent(e.sessionId)}`;case`new`:return`#/w/${encodeURIComponent(e.workspaceId)}/new`;case`settings`:return`#/settings${e.section?`/${encodeURIComponent(e.section)}`:``}${e.section&&e.id?`/${encodeURIComponent(e.id)}`:``}`;case`shared`:return`#/shared/${encodeURIComponent(e.token)}`;case`join`:return`#/join/${encodeURIComponent(e.token)}`}}const wr=()=>m.os===`web`&&l.available(),Tr=_({name:`home`});function Er(){wr()&&(l.call(`page.route`).then(e=>Tr.set(Sr(e??``)),()=>void 0),l.on(`page.route`,e=>Tr.set(Sr(e??``))))}function Dr(e){wr()&&l.call(`page.setRoute`,{hash:Cr(e)}).catch(()=>void 0)}function Or(e){return wr()?(l.call(`page.open`,{path:e}).catch(()=>void 0),!0):!1}const kr={scheme:`light`,background:`#ffffff`,sidebar:`#f7f7f8`,surface:`#ffffff`,surfaceRaised:`#f4f4f6`,hover:`#ededf0`,border:`#e7e7eb`,borderStrong:`#d2d2d9`,text:`#111114`,muted:`#61616b`,faint:`#9a9aa4`,primary:`#18181b`,onPrimary:`#ffffff`,accent:`#6d4fe0`,accentSoft:`#f0ebff`,onAccent:`#ffffff`,selection:`#e9e9ee`,userBubble:`#f1f1f4`,onUserBubble:`#111114`,code:`#f6f6f8`,backdrop:`#0000004d`,tones:{neutral:{text:`#52525b`,background:`#f1f1f4`,border:`#e4e4e8`},info:{text:`#1d4ed8`,background:`#eef3ff`,border:`#d3e0fd`},success:{text:`#15803d`,background:`#ecf8f0`,border:`#c9ecd5`},warning:{text:`#a15c07`,background:`#fdf6e7`,border:`#f6e2b6`},danger:{text:`#c0262d`,background:`#fdf0f0`,border:`#f6d2d2`},running:{text:`#6d4fe0`,background:`#f3efff`,border:`#e1d8fd`}}},Ar={scheme:`dark`,background:`#111113`,sidebar:`#0b0b0d`,surface:`#18181b`,surfaceRaised:`#1f1f23`,hover:`#232328`,border:`#26262b`,borderStrong:`#36363d`,text:`#ececef`,muted:`#a1a1ab`,faint:`#6c6c76`,primary:`#ececef`,onPrimary:`#111113`,accent:`#a48bff`,accentSoft:`#251f3d`,onAccent:`#111113`,selection:`#232329`,userBubble:`#232328`,onUserBubble:`#ececef`,code:`#17171a`,backdrop:`#00000099`,tones:{neutral:{text:`#c4c4cc`,background:`#232328`,border:`#2e2e34`},info:{text:`#93b4fb`,background:`#151d30`,border:`#22304f`},success:{text:`#7ad79a`,background:`#11231a`,border:`#1b3a27`},warning:{text:`#f2be63`,background:`#2a210f`,border:`#44351a`},danger:{text:`#f69a9a`,background:`#2c1416`,border:`#4a2124`},running:{text:`#b9a6ff`,background:`#1f1933`,border:`#332a55`}}},G=()=>a()===`dark`?Ar:kr,jr=`monospace`,K={caption:12,small:13,body:14,reading:15,title:15,heading:22},q={small:6,medium:8,large:12,xlarge:16,pill:999},J=(e,t,n)=>`M${e+n} ${t}a${n} ${n} 0 1 1 ${-2*n} 0a${n} ${n} 0 1 1 ${2*n} 0`,Mr=(e,t,n,r,i)=>`M${e+i} ${t}h${n-2*i}a${i} ${i} 0 0 1 ${i} ${i}v${r-2*i}a${i} ${i} 0 0 1 ${-i} ${i}h${-(n-2*i)}a${i} ${i} 0 0 1 ${-i} ${-i}v${-(r-2*i)}a${i} ${i} 0 0 1 ${i} ${-i}z`,Nr=`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,Pr={plus:`M5 12h14M12 5v14`,search:`${J(11,11,8)}M21 21l-4.3-4.3`,settings:`M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z${J(12,12,3)}`,"chevron-left":`M15 18l-6-6 6-6`,"chevron-right":`M9 18l6-6-6-6`,"chevron-down":`M6 9l6 6 6-6`,"chevron-up":`M18 15l-6-6-6 6`,"arrow-up":`M5 12l7-7 7 7M12 19V5`,"shield-check":`${Nr}M9 12l2 2 4-4`,"shield-alert":`${Nr}M12 8v4M12 16h.01`,copy:`${Mr(8,8,14,14,2)}M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,"panel-right":`${Mr(3,3,18,18,2)}M15 3v18`,"panel-left":`${Mr(3,3,18,18,2)}M9 3v18`,info:`${J(12,12,10)}M12 16v-4M12 8h.01`,terminal:`M4 17l6-6-6-6M12 19h8`,monitor:`${Mr(2,3,20,14,2)}M8 21h8M12 17v4`,sparkles:`M9.94 15.5A2 2 0 0 0 8.5 14.06l-6.13-1.58a.5.5 0 0 1 0-.96L8.5 9.94A2 2 0 0 0 9.94 8.5l1.58-6.14a.5.5 0 0 1 .96 0L14.06 8.5A2 2 0 0 0 15.5 9.94l6.14 1.58a.5.5 0 0 1 0 .96L15.5 14.06a2 2 0 0 0-1.44 1.44l-1.58 6.14a.5.5 0 0 1-.96 0zM20 3v4M22 5h-4`,zap:`M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z`,eye:`M2.06 12.35a1 1 0 0 1 0-.7 10.75 10.75 0 0 1 19.88 0 1 1 0 0 1 0 .7 10.75 10.75 0 0 1-19.88 0${J(12,12,3)}`,alert:`M21.73 18l-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3M12 9v4M12 17h.01`,users:`M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2${J(9,7,4)}M22 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75`,user:`M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2${J(12,7,4)}`,lock:`${Mr(3,11,18,11,2)}M7 11V7a5 5 0 0 1 10 0v4`,archive:`${Mr(2,3,20,5,1)}M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8M10 12h4`,more:`${J(12,12,1)}${J(19,12,1)}${J(5,12,1)}`,check:`M20 6L9 17l-5-5`,x:`M18 6L6 18M6 6l12 12`,clock:`${J(12,12,10)}M12 6v6l4 2`,"pull-request":`${J(18,18,3)}${J(6,6,3)}M13 6h3a2 2 0 0 1 2 2v7M6 9v12`,branch:`M6 3v12${J(18,6,3)}${J(6,18,3)}M18 9a9 9 0 0 1-9 9`,message:`M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z`,"message-question":`M7.9 20A9 9 0 1 0 4 16.1L2 22zM9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3M12 17h.01`,"log-out":`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4M16 17l5-5-5-5M21 12H9`,contrast:`${J(12,12,10)}M12 18a6 6 0 0 0 0-12z`,hash:`M4 9h16M4 15h16M10 3L8 21M16 3l-2 18`,refresh:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8M21 3v5h-5M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16M8 16H3v5`,file:`M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7zM14 2v4a2 2 0 0 0 2 2h4M10 9H8M16 13H8M16 17H8`,"external-link":`M15 3h6v6M10 14L21 3M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`,compose:`M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7M18.38 2.62a1 1 0 0 1 3 3l-9.01 9.02a2 2 0 0 1-.86.5l-2.87.84a.5.5 0 0 1-.62-.62l.84-2.87a2 2 0 0 1 .5-.86z`,list:`M3 12h.01M3 18h.01M3 6h.01M8 12h13M8 18h13M8 6h13`,github:`M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.4 5.4 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4M9 18c-4.51 2-5-2-7-2`,globe:`${J(12,12,10)}M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20M2 12h20`,folder:`M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2z`,history:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8M3 3v5h5M12 7v5l4 2`,undo:`M9 14L4 9l5-5M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5 5.5 5.5 0 0 1-5.5 5.5H11`,"git-fork":`${J(12,18,3)}${J(6,6,3)}${J(18,6,3)}M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9M12 12v3`,link:`M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71`,server:`${Mr(2,2,20,8,2)}${Mr(2,14,20,8,2)}M6 6h.01M6 18h.01`},Fr={stop:Mr(5,5,14,14,3),dot:J(12,12,5)},Ir=/* @__PURE__ */ new Map;function Lr(e){let t=Ir.get(e);return t||(t=new n(Pr[e]??Fr[e]),Ir.set(e,t)),t}function Y(t){let n=()=>t.size??16;return S(e,{accessible:!1,get style(){return{width:n(),height:n(),flexShrink:0,...t.style}},draw:(e,n)=>{let r=t.color??G().muted,i=Math.min(n.width,n.height)/24;e.scale(i,i),t.name in Fr?(e.fillStyle=r,e.fill(Lr(t.name))):(e.strokeStyle=r,e.lineWidth=t.strokeWidth??2,e.lineCap=`round`,e.lineJoin=`round`,e.stroke(Lr(t.name)))}})}var Rr={url:`asset:/src/assets/logo.png`,size:{width:96,height:96}};function X(e){let t=()=>{let t=G();switch(e.variant){case`primary`:return{background:t.primary,text:t.onPrimary,border:t.primary,hover:t.primary};case`accent`:return{background:t.accent,text:t.onAccent,border:t.accent,hover:t.accent};case`danger`:return{background:t.tones.danger.background,text:t.tones.danger.text,border:t.tones.danger.border,hover:t.tones.danger.border};case`ghost`:return{background:`transparent`,text:t.text,border:`transparent`,hover:t.hover};default:return{background:t.surface,text:t.text,border:t.borderStrong,hover:t.hover}}},n=()=>e.small?28:e.large?42:34;return S(M,{get testID(){return e.testID},get accessibilityLabel(){return e.label},get disabled(){return e.disabled||e.busy},get onPress(){return e.onPress},get style(){return{flexDirection:`row`,alignItems:`center`,justifyContent:`center`,gap:6,height:n(),alignSelf:e.block?`stretch`:`auto`,borderRadius:e.small?q.small:q.medium,borderWidth:1,borderColor:t().border,backgroundColor:t().background,paddingHorizontal:e.small?10:14}},get hoverStyle(){return{backgroundColor:t().hover,opacity:e.variant===`primary`||e.variant===`accent`?.9:1}},activeStyle:{opacity:.75},disabledStyle:{opacity:.4},get children(){return[(n=>C(n,()=>(n=>S(Y,{get name(){return n()===`loader`?`refresh`:n()},get size(){return e.small?14:16},get color(){return t().text}}))(n)))(()=>e.busy?`loader`:e.icon),(()=>{let n=T(`text`);return x(n,`style`,()=>({color:t().text,fontSize:e.small?K.small:K.body,fontWeight:`600`,numberOfLines:1})),E(n,()=>e.busy?`${e.label}…`:e.label),n})()]}})}function zr(e){let t=()=>e.tone?G().tones[e.tone].text:e.active?G().text:G().muted;return S(M,{get testID(){return e.testID},get accessibilityLabel(){return e.label},get disabled(){return e.disabled},get onPress(){return e.onPress},hitSlop:6,get tooltip(){return S(ae,{get style(){return{backgroundColor:G().primary,borderRadius:q.small,paddingHorizontal:8,paddingVertical:4}},get children(){return(()=>{let t=T(`text`);return x(t,`style`,()=>({fontSize:K.caption,color:G().onPrimary})),E(t,()=>e.label),t})()}})},get style(){return{flexDirection:`row`,alignItems:`center`,justifyContent:`center`,gap:4,minWidth:e.size??32,height:e.size??32,paddingHorizontal:6,borderRadius:q.medium,backgroundColor:e.active?G().selection:`transparent`}},get hoverStyle(){return{backgroundColor:G().hover}},activeStyle:{opacity:.6},disabledStyle:{opacity:.35},get children(){return[S(Y,{get name(){return e.icon},size:18,get color(){return t()}}),C(()=>(e.badge??0)>0,()=>(()=>{let t=T(`view`);x(t,`style`,()=>({minWidth:18,height:18,borderRadius:9,paddingHorizontal:5,alignItems:`center`,justifyContent:`center`,backgroundColor:G().tones.warning.text}));let n=T(`text`);return x(n,`style`,()=>({fontSize:11,fontWeight:`700`,color:G().scheme===`dark`?`#111113`:`#ffffff`})),E(n,()=>String(e.badge??0)),b(t,n),t})())]}})}function Br(e){let t=()=>G().tones[e.tone??`neutral`];return(()=>{let n=T(`view`);x(n,`testID`,()=>e.testID),x(n,`style`,()=>({flexDirection:`row`,alignItems:`center`,gap:5,borderRadius:q.pill,paddingHorizontal:8,height:22,backgroundColor:t().background}));let r=T(`text`);return x(r,`style`,()=>({fontSize:K.caption,fontWeight:`600`,color:t().text,numberOfLines:1})),E(r,()=>e.children),b(n,r),E(n,[C(()=>e.dot,()=>(()=>{let e=T(`view`);return x(e,`style`,()=>({width:6,height:6,borderRadius:3,backgroundColor:t().text})),e})()),(e=>C(e,()=>(e=>S(Y,{get name(){return e()},size:12,get color(){return t().text}}))(e)))(()=>e.icon)],r),n})()}const Vr={neutral:`info`,info:`info`,success:`check`,warning:`alert`,danger:`alert`,running:`sparkles`};function Z(e){let t=()=>G().tones[e.tone??`neutral`];return(()=>{let n=T(`view`);x(n,`testID`,()=>e.testID),k(n,`role`,`alert`),x(n,`style`,()=>({flexDirection:`row`,gap:10,borderRadius:q.large,borderWidth:1,padding:12,borderColor:t().border,backgroundColor:t().background}));let r=T(`view`);return k(r,`style`,{flex:1,gap:4}),E(r,[C(()=>e.title,()=>(()=>{let n=T(`text`);return x(n,`style`,()=>({fontSize:K.body,fontWeight:`600`,color:t().text})),E(n,()=>e.title),n})()),C(()=>e.children,()=>(()=>{let t=T(`text`);return x(t,`style`,()=>({fontSize:K.small,lineHeight:19,color:G().text})),E(t,()=>e.children),t})()),C(()=>e.actions,()=>(()=>{let t=T(`view`);return k(t,`style`,{flexDirection:`row`,flexWrap:`wrap`,gap:8,paddingTop:4}),E(t,()=>e.actions),t})())]),b(n,r),E(n,S(Y,{get name(){return e.icon??Vr[e.tone??`neutral`]},size:16,get color(){return t().text},style:{marginTop:2}}),r),n})()}function Hr(e){return(()=>{let t=T(`view`);return x(t,`testID`,()=>e.testID),x(t,`style`,()=>({gap:10,borderRadius:q.large,borderWidth:1,padding:14,borderColor:G().border,backgroundColor:G().surface,...e.style})),E(t,()=>e.children),t})()}function Ur(e){let t=()=>e.tone?G().tones[e.tone].text:G().muted;return S(M,{get testID(){return e.testID},get accessibilityLabel(){return e.label},get disabled(){return e.disabled},onPress:()=>e.onPress?.(),get style(){return{flexDirection:`row`,alignItems:`center`,gap:6,borderRadius:q.medium,paddingHorizontal:8,height:28,flexShrink:1,maxWidth:240,borderWidth:+!!e.bordered,borderColor:G().border,backgroundColor:e.bordered?G().surface:`transparent`}},get hoverStyle(){return{backgroundColor:G().hover}},activeStyle:{opacity:.7},disabledStyle:{opacity:.6},get children(){return[(e=>C(e,()=>(e=>S(Y,{get name(){return e()},size:14,get color(){return t()}}))(e)))(()=>e.icon),(()=>{let n=T(`text`);return x(n,`style`,()=>({fontSize:K.small,fontWeight:`500`,color:t(),numberOfLines:1,flexShrink:1})),E(n,()=>e.label),n})(),C(()=>!e.disabled,()=>S(Y,{name:`chevron-down`,size:12,get color(){return G().faint}}))]}})}function Wr(e){return(()=>{let t=T(`view`);k(t,`style`,{flex:1,alignItems:`center`,justifyContent:`center`,gap:10,padding:32});let n=T(`text`);return x(n,`style`,()=>({fontSize:16,fontWeight:`600`,textAlign:`center`,color:G().text})),E(n,()=>e.title),b(t,n),E(t,(e=>C(e,()=>(e=>(()=>{let t=T(`view`);return x(t,`style`,()=>({width:44,height:44,borderRadius:22,alignItems:`center`,justifyContent:`center`,backgroundColor:G().surfaceRaised,marginBottom:4})),E(t,S(Y,{get name(){return e()},size:20,get color(){return G().muted}})),t})())(e)))(()=>e.icon),n),E(t,[C(()=>e.children,()=>(()=>{let t=T(`text`);return x(t,`style`,()=>({fontSize:K.body,lineHeight:20,textAlign:`center`,maxWidth:420,color:G().muted})),E(t,()=>e.children),t})()),()=>e.action]),t})()}function Gr(e){return(()=>{let t=T(`view`);k(t,`style`,{flex:1,alignItems:`center`,justifyContent:`center`,padding:32});let n=T(`text`);return x(n,`style`,()=>({fontSize:K.body,color:G().muted})),E(n,()=>e.label??`Loading…`),b(t,n),t})()}function Kr(e){return[C(()=>e.error,()=>(()=>{let t=T(`text`);return k(t,`role`,`alert`),x(t,`style`,()=>({fontSize:K.small,lineHeight:18,color:G().tones.danger.text})),E(t,()=>e.error),t})()),C(()=>!e.error&&e.notice,()=>(()=>{let t=T(`text`);return x(t,`style`,()=>({fontSize:K.small,lineHeight:18,color:G().tones.success.text})),E(t,()=>e.notice),t})())]}function Q(e){return(()=>{let t=T(`text`);return x(t,`testID`,()=>e.testID),x(t,`style`,()=>({fontSize:K.small,lineHeight:18,textAlign:e.center?`center`:`auto`,color:e.tone?G().tones[e.tone].text:G().muted})),E(t,()=>e.children),t})()}function qr(e){return(()=>{let t=T(`text`);return x(t,`testID`,()=>e.testID),x(t,`style`,()=>({fontSize:K.caption,fontWeight:`600`,color:G().faint,numberOfLines:1})),E(t,()=>e.children),t})()}function Jr(e){return(()=>{let t=T(`view`);return x(t,`testID`,()=>e.testID),k(t,`role`,`tablist`),x(t,`style`,()=>({flexDirection:`row`,alignSelf:`flex-start`,gap:2,padding:2,borderRadius:q.medium,backgroundColor:G().surfaceRaised})),E(t,w(()=>e.options,t=>S(M,{role:`tab`,get selected(){return e.value===t().value},onPress:()=>e.onChange(t().value),get style(){return{flexDirection:`row`,alignItems:`center`,gap:6,paddingHorizontal:10,height:26,borderRadius:q.small,backgroundColor:e.value===t().value?G().surface:`transparent`,borderWidth:1,borderColor:e.value===t().value?G().border:`transparent`}},hoverStyle:{opacity:.85},get children(){return[(n=>C(n,()=>(n=>S(Y,{get name(){return n()},size:13,get color(){return e.value===t().value?G().text:G().muted}}))(n)))(()=>t().icon),(()=>{let n=T(`text`);return x(n,`style`,()=>({fontSize:K.small,fontWeight:`500`,color:e.value===t().value?G().text:G().muted})),E(n,()=>t().label),n})()]}}),e=>e.value)),t})()}function Yr(e){return(()=>{let t=T(`view`);k(t,`style`,{flexDirection:`row`,alignItems:`center`,gap:10,flex:1});let n=T(`view`);k(n,`style`,{flex:1,gap:1});let r=T(`text`);x(r,`style`,()=>({fontSize:K.body,color:e.option.destructive?G().tones.danger.text:G().text,numberOfLines:1})),E(r,()=>e.option.label),b(n,r),E(n,C(()=>e.option.hint,()=>(()=>{let t=T(`text`);return x(t,`style`,()=>({fontSize:K.caption,lineHeight:16,color:G().muted,numberOfLines:4})),E(t,()=>e.option.hint),t})()));let i=T(`view`);return k(i,`style`,{width:16}),E(i,C(()=>e.selected,()=>S(Y,{name:`check`,size:16,get color(){return G().accent}}))),b(t,n),b(t,i),E(t,(e=>C(e,()=>(e=>S(Y,{get name(){return e()},size:16,get color(){return G().muted}}))(e)))(()=>e.option.icon),n),t})()}function Xr(e){return S(P,{get trigger(){return e.trigger},get placement(){return e.placement??`top`},offset:6,get backdropStyle(){return{backgroundColor:G().backdrop}},get popupStyle(){return{minWidth:260,maxWidth:420,padding:4,gap:1,borderRadius:q.large,borderWidth:1,borderColor:G().border,backgroundColor:G().surface,boxShadow:`0 8px 24px rgba(0, 0, 0, 0.18)`}},get children(){return[(()=>{let t=T(`view`);return x(t,`testID`,()=>e.testID),k(t,`style`,{paddingHorizontal:10,paddingTop:6,paddingBottom:4}),E(t,S(qr,{get children(){return e.title}})),t})(),(()=>{let t=T(`scroll`);return k(t,`style`,{flexShrink:1,maxHeight:360}),k(t,`contentStyle`,{gap:1}),E(t,w(()=>e.options,t=>S(F,{get accessibilityLabel(){return t().label},onSelect:()=>e.onSelect(t().value),get style(){return{flexDirection:`row`,alignItems:`center`,paddingHorizontal:10,paddingVertical:8,borderRadius:q.medium}},get hoverStyle(){return{backgroundColor:G().hover}},get focusStyle(){return{backgroundColor:G().hover}},get activeStyle(){return{backgroundColor:G().selection}},get children(){return S(Yr,{get option(){return t()},get selected(){return e.value===t().value}})}}),`index`)),t})()]}})}async function Zr(e){return(await ee.show({title:e.title,description:e.message,actions:[{id:`cancel`,label:`Cancel`,role:`cancel`},{id:`confirm`,label:e.confirmLabel,role:e.destructive?`destructive`:`default`}]})).action===`confirm`}function $(e){return(()=>{let t=T(`view`);k(t,`style`,{gap:3});let n=T(`text`);return x(n,`style`,()=>({fontSize:K.caption,color:G().muted})),E(n,()=>e.label),b(t,n),E(t,()=>e.children),t})()}function Qr(e){return(()=>{let t=T(`view`);k(t,`selectable`,!0);let n=T(`text`);return x(n,`testID`,()=>e.testID),x(n,`style`,()=>({fontSize:K.body,color:G().text})),E(n,()=>e.children),b(t,n),t})()}function $r(e){let t=()=>e.size??24;return(()=>{let n=T(`view`);x(n,`style`,()=>({width:t(),height:t(),borderRadius:t()/2,alignItems:`center`,justifyContent:`center`,backgroundColor:G().accentSoft}));let r=T(`text`);return x(r,`style`,()=>({fontSize:t()*.46,fontWeight:`700`,color:G().accent})),E(r,()=>(Array.from(e.name.trim())[0]??`?`).toUpperCase()),b(n,r),n})()}function ei(e){let t=()=>e.size??22;return(()=>{let e=T(`image`);return k(e,`src`,Rr),k(e,`accessibilityLabel`,`Pikibun`),x(e,`style`,()=>({width:t(),height:t(),borderRadius:t()*.28})),e})()}function ti(e){return(()=>{let e=T(`view`);return k(e,`testID`,`join-workspace`),x(e,`style`,()=>({flex:1,backgroundColor:G().background})),E(e,S(Wr,{title:`Not here yet`,get children(){return`Invite links are still being moved to this app.`}})),e})()}const ni={read:`eye`,approval:`shield-check`,auto:`zap`};function ri(e){return async(t,n)=>{let r=await Zr({title:`Auto-approve commands?`,message:_e(t,n),confirmLabel:`Enable auto-approve`,destructive:!0});return r&&ge(t)&&e.rememberAutoApproveConfirmed(),r}}function ii(e){let t=()=>e.host?be(e.host,e.value.model):void 0,n=()=>xe(t()),r=()=>Ce(t(),e.value.thinkingLevel),i=ri(e.data);async function a(t){(t!==`auto`||e.value.access===`auto`||!e.host||await i(e.host,e.unsandboxed))&&e.onChange({...e.value,access:t})}let o=()=>e.owner?[`read`,`approval`,`auto`]:[`read`,`approval`];return(i=>C(i,()=>(i=>C(()=>i().capabilities.chatOptions,()=>[C(()=>i().models.length>0,()=>S(Xr,{title:`Model`,get value(){return e.value.model&&t()?ye(e.value.model):void 0},get trigger(){return S(Ur,{testID:`chat-model`,icon:`sparkles`,get label(){return t()?.name??`Model`}})},get options(){return i().models.map(e=>({value:ye(e),label:e.name,hint:e.provider}))},onSelect:t=>{let n=i().models.find(e=>ye(e)===t);n&&e.onChange(we(e.value,n))}}),()=>S(Ur,{testID:`chat-model`,icon:`sparkles`,get label(){return t()?.name??`Model`},disabled:!0})),C(()=>n().length>0,()=>S(Xr,{title:`Reasoning`,get value(){return r()},get trigger(){return S(Ur,{testID:`chat-reasoning`,icon:`zap`,get label(){return r()&&n().includes(r())?me[r()]:`Default`}})},get options(){return n().map(e=>({value:e,label:me[e]}))},onSelect:t=>e.onChange({...e.value,thinkingLevel:t})})),C(()=>e.showAccess,()=>S(Xr,{title:`Access`,get value(){return e.value.access},get trigger(){return S(Ur,{testID:`chat-access`,get icon(){return ni[e.value.access]},get tone(){return e.value.access===`auto`?`danger`:void 0},get label(){return he[e.value.access].label}})},get options(){return o().map(e=>({value:e,label:he[e].label,hint:he[e].hint,destructive:e===`auto`,icon:ni[e]}))},onSelect:e=>void a(e)}))],()=>(()=>{let e=T(`text`);return x(e,`style`,()=>({fontSize:K.caption,color:G().muted,paddingHorizontal:8})),E(e,`Update the host's connector (npx pikibun@latest connect) to choose model, reasoning and access`),e})()))(i)))(()=>e.host)}function ai(e){let t=_(!1),n=()=>!e.disabled&&!e.busy&&(e.ready??e.value.trim()!==``);return(()=>{let r=T(`view`);k(r,`style`,{gap:6});let i=T(`view`);x(i,`style`,()=>({borderWidth:1,borderRadius:q.xlarge,paddingTop:4,paddingBottom:6,paddingHorizontal:6,borderColor:t()?G().borderStrong:G().border,backgroundColor:G().surface,boxShadow:G().scheme===`dark`?`none`:`0 2px 10px rgba(0, 0, 0, 0.05)`}));let a=T(`input`);x(a,`testID`,()=>e.testID??`composer-input`),x(a,`value`,()=>e.value),k(a,`onChange`,t=>e.onChange(t.value)),k(a,`multiline`,!0),x(a,`readonly`,()=>e.busy||e.disabled),x(a,`placeholder`,()=>e.placeholder),x(a,`accessibilityLabel`,()=>e.placeholder),k(a,`onFocus`,()=>t.set(!0)),k(a,`onBlur`,()=>t.set(!1)),x(a,`style`,()=>({fontSize:K.reading,lineHeight:22,minHeight:e.minHeight??44,maxHeight:220,paddingHorizontal:8,paddingTop:8,paddingBottom:4,color:G().text,placeholderColor:G().faint}));let o=T(`view`);k(o,`style`,{flexDirection:`row`,alignItems:`flex-end`,gap:4});let s=T(`view`);return k(s,`style`,{flex:1,flexDirection:`row`,flexWrap:`wrap`,alignItems:`center`,gap:2}),E(s,()=>e.tools),b(o,s),E(o,[C(()=>e.onStop,()=>S(M,{testID:`composer-stop`,get accessibilityLabel(){return e.stopping?`Stopping...`:`Stop`},get disabled(){return e.stopping},onPress:()=>e.onStop?.(),get style(){return{width:32,height:32,borderRadius:16,alignItems:`center`,justifyContent:`center`,borderWidth:1,borderColor:G().borderStrong}},get hoverStyle(){return{backgroundColor:G().hover}},activeStyle:{opacity:.7},disabledStyle:{opacity:.35},get children(){return S(Y,{name:`stop`,size:14,get color(){return G().text}})}})),S(M,{get testID(){return e.sendTestID??`composer-send`},get accessibilityLabel(){return e.busy?`Sending...`:e.sendLabel},get disabled(){return!n()},get onPress(){return e.onSubmit},get style(){return{flexDirection:`row`,gap:6,minWidth:32,height:32,borderRadius:16,paddingHorizontal:e.sendText?12:0,alignItems:`center`,justifyContent:`center`,backgroundColor:n()?G().primary:G().surfaceRaised}},hoverStyle:{opacity:.85},activeStyle:{opacity:.7},get children(){return[(t=>C(t,()=>(t=>(()=>{let r=T(`text`);return x(r,`style`,()=>({fontSize:K.small,fontWeight:`600`,color:n()?G().onPrimary:G().faint})),E(r,()=>e.busy?`${t()}…`:t()),r})())(t)))(()=>e.sendText),S(Y,{name:`arrow-up`,size:16,strokeWidth:2.5,get color(){return n()?G().onPrimary:G().faint}})]}})]),b(i,a),b(i,o),b(r,i),E(r,C(()=>e.hint,()=>(()=>{let t=T(`text`);return x(t,`style`,()=>({fontSize:K.caption,color:G().faint,paddingHorizontal:10})),E(t,()=>e.hint),t})())),r})()}function oi(e){if(e<1e3)return`${Math.round(e)} ms`;let t=Math.round(e/100);if(t<100)return`${(t/10).toFixed(1)} s`;let n=Math.round(e/1e3);return n<60?`${n} s`:n%60?`${Math.floor(n/60)} min ${n%60} s`:`${n/60} min`}const si=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],ci=e=>String(e).padStart(2,`0`);function li(e){return`${e.getDate()} ${si[e.getMonth()]} ${e.getFullYear()}`}function ui(e){let t=new Date(e);return Number.isNaN(t.getTime())?e:`${li(t)}, ${ci(t.getHours())}:${ci(t.getMinutes())}`}function di({provider:e,modelId:t,status:n}){let r=e??`the provider`;return n===401||n===403?`The host's Pi credentials for ${r} were rejected. The host owner should check Pi's login or API key, then restart the connector.`:n===429?`Rate limited by ${r}. Try again shortly.`:n!==void 0&&n>=500&&n<600?`${r} is unavailable. Try again shortly.`:`The request to ${[e,t].filter(Boolean).join(`/`)||`the model`} failed${n?` (HTTP ${n})`:``}`}const fi=()=>crypto.randomUUID();function pi(e,t){let n=e.trim().split(`
|
|
11
|
+
`)[0]?.trim()??``;return Array.from(n).slice(0,80).join(``).trim()||t}const mi=(e,t)=>e.provider===t.provider&&e.modelId===t.modelId;function hi(e){let t=br(),n=()=>t.workspaces().filter(e=>Bt(e.role)),r=_(e.workspaceId??``),i=()=>n().find(e=>e.id===(r()||t.lastWorkspaceId()))??n()[0],a=e=>S(Xr,{title:`Workspace`,get value(){return e.id},onSelect:e=>r.set(e),placement:`bottom`,get trigger(){return S(Ur,{testID:`new-workspace`,icon:`users`,get label(){return e.name},get disabled(){return n().length<2}})},get options(){return n().map(e=>({value:e.id,label:e.name,hint:e.role,icon:`users`}))}});return C(()=>!t.workspacesLoading(),()=>C(()=>!t.workspacesError(),()=>(n=>C(n,()=>(t=>w(()=>[t()],t=>S(gi,{get workspace(){return t()},get onStarted(){return e.onStarted},get home(){return e.home},get workspacePicker(){return a(t())}}),e=>e.id))(n),()=>C(()=>t.workspaces().length>0,()=>S(Wr,{icon:`eye`,title:`Viewer only`,get children(){return`You're a viewer in every workspace you belong to, so you can follow their shared sessions but not start one. Ask a workspace owner or admin for the member role.`}}),()=>S(Wr,{icon:`users`,title:`No workspace yet`,get children(){return`Create a workspace, add a repository and pair a host to start your first session.`}}))))(()=>i()),()=>(()=>{let e=T(`view`);return k(e,`style`,{padding:20}),E(e,S(Z,{tone:`danger`,title:`Unable to load workspaces`,get actions(){return S(X,{small:!0,label:`Retry`,get onPress(){return t.refreshWorkspaces}})},get children(){return t.workspacesError()}})),e})()),()=>S(Gr,{}))}function gi(e){let{user:t}=v(U),n=br(),r=ri(n),i=!1,a=`/api/workspaces/${V(e.workspace.id)}`,s=gr(()=>`${a}/models`),l=gr(()=>`${a}/connectors`,1e4),u=gr(()=>`${a}/repositories`),d=_(``),f=_(``),p=_(`workspace`),m=_(``),h=W(),g=()=>s.data()?.models,y=()=>l.data()?.connectors,w=()=>u.data()?.repositories??null,D=()=>u.data()?.required??!0,O=o(()=>{let e=new Set((g()??[]).map(e=>e.connectorId));return(y()??[]).filter(t=>e.has(t.id)&&!t.revokedAt).sort((e,n)=>Number(n.ownerId===t.id)-Number(e.ownerId===t.id))}),A=()=>O().find(e=>e.id===d())??O().find(e=>e.id===n.lastChat()?.connectorId)??O().find(e=>e.online)??O()[0],ee=e=>{let t=A();return e&&t&&t.models.some(t=>mi(t,e))?g()?.find(n=>n.connectorId===t.id&&mi(n,e)):void 0},M=_(null),N=()=>{let e=A(),t=M();return e&&t?.key===e.id?t.value:De(e,n.lastChat(),e?.models.map(e=>ee(e)).find(Boolean),e=>!!ee(e))},P=()=>ee(N().model),F=()=>!!(A()&&A().ownerId!==t.id),I=()=>!!(P()&&A()?.models.some(e=>mi(e,P()))),te=()=>{let n=A();return!(!n?.online||n.revokedAt||!I()||n.ownerId!==t.id&&!n.workspaceIds.includes(e.workspace.id))},ne=()=>{let e=u.data();return e?e.sources??e.repositories.length:0},ie=()=>!(!w()||u.error()||u.loading()||!ne()&&D()),ae=()=>!F()||!!(A()&&m()===A().id),L=()=>!!(P()&&A()&&te()&&ie()&&ae()&&!h.busy());c(()=>{A()?.id,A()?.ownerId,w(),m.set(``)});async function R(){let t=A(),a=P();if(!L()||!a||!t||i)return;let o=f().trim(),s=je(t,N(),`submit`);Ne(s,n.autoApproveConfirmed())&&(i=!0,!await r(t,!!t.capabilities.unsandboxed).finally(()=>{i=!1}))?M.set({key:t.id,value:{...N(),access:`approval`}}):h.run(async()=>{let{api:r}=U(),i=(await r(`/api/sessions`,{method:`POST`,body:{workspaceId:e.workspace.id,modelId:a.id,title:pi(f(),a.name),visibility:p(),...F()?{trustedConnectorId:t.id}:{}}})).session.id;if(n.setLastWorkspaceId(e.workspace.id),n.rememberChat(t,N()),o)try{await r(`/api/sessions/${V(i)}/submit`,{method:`POST`,body:{content:o,requestId:fi(),...s?{options:s}:{}}})}catch{jn(i,o)}n.refreshSessions(),e.onStarted(i)})}let z=()=>s.loading()||l.loading(),oe=()=>S(X,{small:!0,label:`Refresh host status`,get onPress(){return l.refresh}}),se=e=>e.revokedAt?`Revoked`:e.online?e.capabilities.unsandboxed?`Unsandboxed`:e.capabilities.sandbox?`Online`:`Sandbox unverified`:`Offline`,B=()=>{if(u.error())return{tone:`warning`,title:`Unable to load sources`,text:u.error(),retry:u.refresh};if(w()&&!ne()&&D())return{tone:`warning`,title:`No sources in this workspace`,text:`Sessions need at least one source, such as a repository or a Notion page. Workspace owners and admins add them in workspace settings on the web.`};if(s.error())return{tone:`danger`,title:`Unable to load models`,text:s.error(),retry:s.refresh};if(l.error())return{tone:`warning`,title:`Unable to check host`,text:l.error(),refresh:!0};if(z()||!g()||!y())return null;if(!O().length)return{tone:`info`,title:`No host to chat with yet`,text:`Pair your own Pi to chat with its models, or ask a workspace member to share their host here.`};let e=A();return e?P()?I()?te()?F()?{tone:`warning`,title:`Hosted by ${e.ownerName}`,text:``,trust:e}:null:{tone:`warning`,title:`${e.name} is unavailable`,text:e.revokedAt?`This host was revoked.`:e.online?`This host isn't shared with this workspace.`:`It must reconnect before work can run.`,refresh:!0}:{tone:`warning`,title:`Model no longer offered`,text:`This model is no longer offered by ${e.name}. Ask the host owner to restore it; no substitute will be chosen.`,refresh:!0}:{tone:`warning`,title:`No model on ${e.name}`,text:`${e.name} offers no model you can use in this workspace.`,refresh:!0}:null},ce=()=>S(Xr,{title:`Host`,get value(){return A()?.id},onSelect:e=>d.set(e),placement:`bottom`,get trigger(){return S(Ur,{testID:`new-host`,icon:`monitor`,get label(){return A()?A().name:z()?`Loading…`:`No host`},get disabled(){return O().length<2||h.busy()},get tone(){return A()&&!A().online?`warning`:void 0}})},get options(){return O().map(e=>({value:e.id,label:e.name,icon:`monitor`,hint:`${e.ownerId===t.id?`Your host`:`${e.ownerName}'s host`} · ${se(e)}`}))}});return(()=>{let t=T(`scroll`);k(t,`style`,{flex:1}),x(t,`contentStyle`,()=>({flexGrow:1,justifyContent:e.home?`center`:`flex-start`,paddingHorizontal:20,paddingVertical:e.home?40:24}));let r=T(`view`);k(r,`style`,{gap:14,width:`100%`,maxWidth:720,alignSelf:`center`});let i=T(`view`);x(i,`style`,()=>({alignItems:e.home?`center`:`flex-start`,gap:12,paddingBottom:6}));let a=T(`text`);k(a,`role`,`header`),x(a,`style`,()=>({fontSize:e.home?26:22,fontWeight:`600`,color:G().text,textAlign:e.home?`center`:`auto`}));let o=j(`What should we work on?`);b(a,o),b(i,a),E(i,C(()=>e.home,()=>S(ei,{size:40})),a);let s=T(`view`);k(s,`style`,{flexDirection:`row`,flexWrap:`wrap`,alignItems:`center`,gap:10,paddingHorizontal:4});let c=T(`text`);return x(c,`style`,()=>({flex:1,minWidth:220,fontSize:K.caption,lineHeight:17,color:G().muted})),E(c,()=>p()===`workspace`?`Workspace members can view prompts, output, tool results, and repository content shown in the transcript. Collaborators can also message it, and the workspace's owner and admins manage it; approving tool calls needs an explicit grant.`:`Workspace membership alone does not give access to a private session: only the workspace's owner and admins, who manage every session, and people you give a session role open it.`),b(s,c),E(s,S(Jr,{testID:`new-visibility`,get value(){return p()},onChange:e=>p.set(e),options:[{value:`workspace`,label:`Workspace`,icon:`users`},{value:`private`,label:`Private`,icon:`lock`}]}),c),b(r,i),b(r,s),E(r,S(ai,{testID:`new-message`,sendTestID:`new-start`,get value(){return f()},onChange:e=>f.set(e),onSubmit:()=>void R(),get busy(){return h.busy()},get ready(){return L()},minHeight:88,sendText:`Start session`,sendLabel:`Start session`,get placeholder(){return`Describe a task for ${e.workspace.name}, or start without one`},hint:``,get tools(){return[()=>e.workspacePicker,()=>ce(),S(ii,{get host(){return A()},get value(){return N()},onChange:e=>{let t=A();t&&M.set({key:t.id,value:e})},owner:!0,showAccess:!0,get unsandboxed(){return!!A()?.capabilities.unsandboxed},data:n})]}}),s),E(r,[(e=>C(e,()=>(e=>S(Z,{get tone(){return e().tone},get title(){return e().title},get actions(){return e().retry?S(X,{small:!0,label:`Retry`,get onPress(){return e().retry}}):e().refresh?oe():void 0},get children(){return(t=>C(t,()=>(e=>S(re,{testID:`new-trust`,get checked(){return m()===e().id},get disabled(){return h.busy()},onChange:t=>m.set(t.checked?e().id:``),style:{flexDirection:`row`,alignItems:`flex-start`,gap:10},trackClass:`w-10 h-6 rounded-full bg-muted checked:bg-primary`,thumbClass:`w-5 h-5 m-0.5 rounded-full bg-background checked:translate-x-4`,get children(){return(()=>{let t=T(`text`);return x(t,`style`,()=>({flex:1,fontSize:K.small,lineHeight:19,color:G().text})),E(t,()=>`I trust ${e().ownerName}'s host (${e().name}) to process this session's prompts and repository files, including private repository snapshots; its operator can read them. Repository access uses my GitHub identity, not the host owner's or a workspace admin's. I remain the session owner.`),t})()}}))(t),()=>e().text))(()=>e().trust)}}))(e)))(()=>B()),C(()=>A()?.capabilities.unsandboxed,()=>S(Z,{tone:`danger`,title:`Unsandboxed host`,get children(){return`Agent work runs directly on the owner's machine without isolation: approved commands and commits run as their user, with access to their files, credentials and network, and no resource limits.`}})),C(()=>A()&&P(),()=>S(Q,{get children(){return`${se(A())} · ${A().name} · ${P()?.name??``} · ${F()?`Hosted by ${A().ownerName}`:`Your host`}, ${A().workspaceIds.includes(e.workspace.id)?`shared with this workspace`:`private`}${w()?.length?` · ${w().length===1?`1 repository`:`${w().length} repositories`}`:``}`}})),S(Kr,{get error(){return h.error()}}),C(()=>h.busy(),()=>S(Q,{get children(){return`Resolving repository commits and downloading snapshots to the Pi host's private session cache. The agent starts once every repository is ready.`}}))]),b(t,r),t})()}function _i(e){let t=_(``),n=W();function r(){let r=t().trim();r&&!n.busy()&&n.run(async()=>{let t=await U().api(`/api/sessions/${V(r)}`);e.onOpen(t.session.id)})}return(()=>{let e=T(`scroll`);k(e,`style`,{flex:1}),k(e,`contentStyle`,{gap:12,padding:20,width:`100%`,maxWidth:560,alignSelf:`center`});let i=T(`input`);return k(i,`testID`,`open-session-id`),x(i,`value`,()=>t()),k(i,`onChange`,e=>t.set(e.value)),k(i,`autoFocus`,!0),k(i,`autoCapitalize`,`none`),k(i,`autoCorrect`,!1),k(i,`returnKeyType`,`go`),k(i,`onSubmit`,r),k(i,`accessibilityLabel`,`Session ID`),x(i,`style`,()=>({borderWidth:1,borderRadius:10,paddingHorizontal:12,paddingVertical:10,fontSize:16,backgroundColor:G().surface,borderColor:G().border,color:G().text})),b(e,i),E(e,S(Q,{get children(){return`Session ID — ask the session owner for its ID`}}),i),E(e,[S(Kr,{get error(){return n.error()}}),S(X,{testID:`open-session-submit`,variant:`primary`,get label(){return n.busy()?`Checking access...`:`Open session`},get disabled(){return n.busy()||!t().trim()},onPress:r})]),e})()}const vi=m.desktop||m.os===`web`,yi=()=>({backgroundColor:G().background});function bi(e){return vi?{style:yi(),header:S(Si,{get title(){return e.title},get subtitle(){return e.subtitle},get onBack(){return e.onBack},get actions(){return e.actions},get leading(){return e.leading}})}:{style:yi(),headerLeft:e.leading,headerRight:e.actions}}function xi(e){return S(M,{testID:`header-back`,get accessibilityLabel(){return e.label??`Back`},get onPress(){return e.onPress},hitSlop:8,get style(){return{flexDirection:`row`,alignItems:`center`,gap:2,paddingLeft:4,paddingRight:8,height:32,borderRadius:q.medium}},get hoverStyle(){return{backgroundColor:G().hover}},activeStyle:{opacity:.6},get children(){return[S(Y,{name:`chevron-left`,size:18,get color(){return G().muted}}),(()=>{let t=T(`text`);return x(t,`style`,()=>({fontSize:K.body,color:G().muted})),E(t,()=>e.label??`Back`),t})()]}})}function Si(e){return(()=>{let t=T(`view`);x(t,`testID`,()=>e.testID),k(t,`desktop`,{windowDrag:!0}),x(t,`style`,()=>({flexDirection:`row`,alignItems:`center`,gap:8,height:52,paddingHorizontal:12,borderBottomWidth:1,borderColor:G().border,backgroundColor:G().background}));let n=T(`view`);x(n,`style`,()=>({flex:1,gap:1,paddingLeft:e.onBack||e.leading?0:4}));let r=T(`text`);return k(r,`role`,`header`),x(r,`style`,()=>({numberOfLines:1,fontSize:K.title,fontWeight:`600`,color:G().text})),E(r,()=>e.title),b(n,r),E(n,C(()=>e.subtitle,()=>(()=>{let t=T(`text`);return x(t,`style`,()=>({numberOfLines:1,fontSize:K.caption,color:G().muted})),E(t,()=>e.subtitle),t})())),b(t,n),E(t,[C(()=>e.onBack,()=>S(xi,{onPress:()=>e.onBack?.()})),()=>e.leading],n),E(t,()=>e.actions),t})()}function Ci(e){let t=gr(()=>{let t=e();return t?`/api/workspaces/${V(t)}/members`:null});return o(()=>{let{user:e}=U(),n=(t.data()?.members??[]).map(Nt);return n.some(t=>t.id===e.id)||n.push({id:e.id,githubLogin:e.githubLogin}),{person:It(n)}})}const wi=s(null);function Ti(){let e=wi();return(t,n)=>{let{user:r}=U();return n&&t===r.id?`you`:e?Pt(e().person(t)):t===r.id?Pt({id:t,githubLogin:r.githubLogin}):Pt({id:t})}}function Ei(e){return`${e.number===void 0?`PR`:`PR #${e.number}`}${e.state?` ${wn[e.state]}`:``}`}function Di(e,t=Date.now()){let n=new Date(e).getTime();if(Number.isNaN(n))return``;let r=Math.floor((t-n)/6e4);if(r<1)return`now`;if(r<60)return`${r}m`;if(r<1440)return`${Math.floor(r/60)}h`;if(r<10080)return`${Math.floor(r/1440)}d`;let i=new Date(n);return`${i.getDate()} ${[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`][i.getMonth()]}`}function Oi(e){let{user:t}=v(U),n=br(),r=_(``),i=_(!1),a=()=>n.sessions().filter(e=>e.status===`archived`).length,s=o(()=>{let e=r().trim().toLowerCase(),t=/* @__PURE__ */ new Map;for(let r of n.sessions()){if(r.status===`archived`&&!i()||e&&!r.title.toLowerCase().includes(e))continue;let n=t.get(r.workspaceId);n?n.push(r):t.set(r.workspaceId,[r])}let a=n.workspaces().map(e=>e.id),o=e=>{let t=a.indexOf(e);return t<0?a.length:t};return[...t.entries()].sort(([e],[t])=>o(e)-o(t)).flatMap(([e,t])=>[{kind:`workspace`,key:`workspace:${e}`,title:n.workspaces().find(t=>t.id===e)?.name??`Other workspace`},...t.map(e=>({kind:`session`,key:e.id,session:e}))])}),c=_(!1);function l(){c.set(!0),n.refreshSessions(),n.refreshWorkspaces()}let u=()=>c()&&n.sessionsReloading(),d=()=>e.compact?8:12;return C(()=>!n.sessionsLoading(),()=>S(D,{get each(){return s()},keyExtractor:e=>e.key,testID:`session-list`,style:{flex:1},get refreshing(){return u()},onRefresh:l,contentStyle:{paddingBottom:12},header:()=>(()=>{let t=T(`view`);x(t,`style`,()=>({gap:8,paddingHorizontal:d(),paddingTop:e.compact?4:12,paddingBottom:4}));let i=T(`view`);x(i,`style`,()=>({flexDirection:`row`,alignItems:`center`,gap:8,borderRadius:q.medium,paddingHorizontal:10,height:e.compact?32:38,backgroundColor:e.compact?G().surfaceRaised:G().surface,borderWidth:+!e.compact,borderColor:G().border}));let a=T(`input`);return x(a,`value`,()=>r()),k(a,`onChange`,e=>r.set(e.value)),k(a,`placeholder`,`Search sessions`),k(a,`accessibilityLabel`,`Search sessions by title`),k(a,`autoCorrect`,!1),k(a,`autoCapitalize`,`none`),k(a,`testID`,`session-search`),x(a,`style`,()=>({flex:1,fontSize:e.compact?K.small:K.reading,color:G().text,placeholderColor:G().faint})),b(i,a),E(i,S(Y,{name:`search`,size:14,get color(){return G().faint}}),a),b(t,i),E(t,C(()=>n.sessionsError(),()=>S(Z,{tone:`danger`,title:`Could not load sessions`,get actions(){return S(X,{small:!0,label:`Try again`,get onPress(){return n.refreshSessions}})},get children(){return n.sessionsError()}}))),t})(),footer:()=>C(()=>a()>0,()=>(()=>{let e=T(`view`);return x(e,`style`,()=>({paddingHorizontal:d(),paddingTop:12})),E(e,S(M,{testID:`toggle-archived`,get accessibilityLabel(){return i()?`Hide archived`:`Show archived (${a()})`},onPress:()=>i.update(e=>!e),get style(){return{flexDirection:`row`,alignItems:`center`,gap:8,paddingHorizontal:8,height:30,borderRadius:q.medium}},get hoverStyle(){return{backgroundColor:G().hover}},activeStyle:{opacity:.6},get children(){return[S(Y,{name:`archive`,size:14,get color(){return G().faint}}),(()=>{let e=T(`text`);return x(e,`style`,()=>({fontSize:K.small,color:G().muted})),E(e,()=>i()?`Hide archived`:`Show archived (${a()})`),e})()]}})),e})()),empty:()=>C(()=>n.sessions().length>0,()=>S(Wr,{icon:`search`,get title(){return!r().trim()&&!i()?`All sessions are archived`:`No matching sessions`}}),()=>S(Wr,{icon:`message`,title:`No sessions yet`,get action(){return S(X,{label:`New session`,icon:`plus`,variant:`primary`,get onPress(){return e.onNew}})},get children(){return`Start one to put an agent to work on your workspace's repositories.`}})),get children(){return n=>(r=>C(r,()=>(n=>S(Ai,{get item(){return n()},get userId(){return t.id},get selected(){return n().id===e.selectedId},get onOpen(){return e.onOpen},get compact(){return e.compact}}))(r),()=>(()=>{let e=T(`view`);return x(e,`style`,()=>({paddingHorizontal:d()+8,paddingTop:14,paddingBottom:4})),E(e,S(qr,{get children(){return n().kind===`workspace`?n().title:``}})),e})()))(()=>n().kind===`session`?n().session:null)}}),()=>S(Gr,{}))}function ki(e){return(()=>{let t=T(`view`);return x(t,`testID`,()=>e.testID),x(t,`accessibilityLabel`,()=>e.label),k(t,`style`,{width:16,height:18,alignItems:`center`,justifyContent:`center`}),E(t,C(()=>e.scheduled,()=>S(Y,{name:`clock`,size:13,get color(){return G().tones[e.tone].text}}),()=>(()=>{let t=T(`view`);return x(t,`style`,()=>({width:8,height:8,borderRadius:4,backgroundColor:e.attention?G().tones[e.tone].text:`transparent`,borderWidth:e.attention?0:1.5,borderColor:G().faint})),t})())),t})()}function Ai(e){let t=br(),n=Ti(),r=()=>{let n=t.liveActivity();return At(e.item,n?.sessionId===e.item.id?n.activity:void 0)},i=()=>!!r().label&&![`success`,`neutral`].includes(r().tone),a=()=>e.item.ownerId===e.userId,o=()=>{let t=e.item.pullRequest,n=t?.state&&Tn[t.state];return n&&n!==`neutral`?G().tones[n===`merged`?`running`:n].text:G().muted},s=()=>a()?``:n(e.item.ownerId),c=()=>i()||!!e.item.pullRequest||!!s()||e.item.visibility===`private`;return(()=>{let t=T(`view`);return x(t,`style`,()=>({paddingHorizontal:e.compact?8:12})),E(t,S(M,{get testID(){return`session-row-${e.item.id}`},get selected(){return e.selected},get accessibilityLabel(){return e.item.title},onPress:()=>e.onOpen(e.item.id),get style(){return{flexDirection:`row`,alignItems:`flex-start`,gap:8,paddingHorizontal:8,paddingVertical:e.compact?7:10,borderRadius:q.medium,backgroundColor:e.selected?G().selection:`transparent`}},get activeStyle(){return{backgroundColor:G().selection}},get hoverStyle(){return{backgroundColor:e.selected?G().selection:G().hover}},get children(){return[S(ki,{get tone(){return r().tone},get scheduled(){return r().icon===`clock`},get label(){return r().label},get attention(){return i()||r().tone===`running`},get testID(){return r().icon===`clock`?`session-scheduled-${e.item.id}`:void 0}}),(()=>{let t=T(`view`);k(t,`style`,{flex:1,gap:2});let n=T(`view`);k(n,`style`,{flexDirection:`row`,alignItems:`center`,gap:8});let a=T(`text`);x(a,`style`,()=>({flex:1,numberOfLines:1,fontSize:e.compact?K.body:K.reading,fontWeight:e.selected?`600`:`500`,color:G().text})),E(a,()=>e.item.title);let l=T(`text`);return x(l,`style`,()=>({fontSize:K.caption,color:G().faint})),E(l,()=>Di(e.item.createdAt)),b(n,a),b(n,l),b(t,n),E(t,C(()=>c(),()=>(()=>{let t=T(`text`);return x(t,`style`,()=>({numberOfLines:1,fontSize:K.caption,color:G().muted})),E(t,[C(()=>i(),()=>(()=>{let t=T(`text`);return x(t,`testID`,()=>`session-status-${e.item.id}`),x(t,`style`,()=>({fontWeight:`600`,color:G().tones[r().tone].text})),E(t,()=>r().label),t})()),(t=>C(t,()=>(t=>[C(()=>i(),()=>(()=>{let e=T(`text`);return E(e,` · `),e})()),(()=>{let n=T(`text`);return x(n,`testID`,()=>`session-pull-${e.item.id}`),x(n,`style`,()=>({color:o()})),E(n,()=>Ei(t())),n})()])(t)))(()=>e.item.pullRequest),C(()=>s(),()=>(()=>{let t=T(`text`);return E(t,()=>`${i()||e.item.pullRequest?` · `:``}${s()}`),t})()),C(()=>e.item.visibility===`private`,()=>(()=>{let t=T(`text`);return E(t,()=>`${i()||e.item.pullRequest||s()?` · `:``}Private`),t})())]),t})())),t})()]}})),t})()}const ji={pending:`warning`,approved:`info`,executing:`running`,executed:`success`,denied:`neutral`,interrupted:`warning`,failed:`danger`},Mi={tool:`A tool this agent doesn't include`,write:`A change in a Read-only message`,"unbounded-shell":`No resource limits: this host has none set up for commands. The command still runs in the sandbox, offline and for at most the host's command time limit, but with no cap on CPU, memory, processes or disk.`,audience:`Sharing another session: this session's readers would see what the agent reads from a session they can't open themselves.`},Ni=[`bash`,`git`,`node`,`python`,`rust`,`go`,`dotnet`,`browser`,`make`,`git_commit`,`git_push`,`github_comment`,`github_merge`,`github_issue`,`host_bash`,`git_repin`],Pi={merge:`Merge commit`,squash:`Squash and merge`,rebase:`Rebase and merge`};function Fi(e){return(()=>{let t=T(`view`);k(t,`selectable`,!0),x(t,`style`,()=>({borderRadius:q.medium,borderWidth:1,borderColor:G().border,padding:10,backgroundColor:G().code}));let n=T(`text`);return x(n,`testID`,()=>e.testID),x(n,`style`,()=>({fontFamily:jr,fontSize:12,lineHeight:18,color:G().text})),E(n,()=>e.children),b(t,n),t})()}function Ii(e){switch(e.kind){case`program`:return{icon:`terminal`,title:`Run ${e.tool}`};case`bash`:return{icon:`terminal`,title:`Run a command`};case`host.bash`:return{icon:`monitor`,title:`Run a command on the host`};case`git.commit`:return{icon:`branch`,title:`Commit`};case`git.push`:return{icon:`branch`,title:e.tag===void 0?e.pullRequest?`Push and open a pull request`:`Push`:`Push a tag`};case`github.merge`:return{icon:`pull-request`,title:`Merge a pull request`};case`github.issue`:return{icon:`pull-request`,title:`Open an issue`};case`github.comment`:return{icon:`pull-request`,title:`Comment on GitHub`};case`permission`:return{icon:`shield-check`,title:`Permission for ${e.tool}`};case`extension.tool`:return{icon:`zap`,title:`Extension tool · ${e.tool}`};case`git.repin`:return{icon:`branch`,title:`Repin a repository`};default:return{icon:`shield-check`,title:e.kind}}}function Li(e){switch(e.kind){case`program`:case`bash`:return e.command;case`host.bash`:return`${e.command}\n\n# Time limit: ${e.timeoutSeconds} seconds`;case`git.commit`:return e.message;default:return null}}function Ri(e){return(()=>{let t=T(`view`);k(t,`style`,{flexDirection:`row`,gap:8});let n=T(`text`);x(n,`style`,()=>({width:96,fontSize:13,color:G().muted})),E(n,()=>e.label);let r=T(`view`);k(r,`selectable`,!0),k(r,`style`,{flex:1});let i=T(`text`);return x(i,`style`,()=>({fontFamily:jr,fontSize:13,color:G().text})),E(i,()=>e.children),b(r,i),b(t,n),b(t,r),t})()}function zi(){return(()=>{let e=T(`text`);k(e,`testID`,`approval-secret-note`),x(e,`style`,()=>({fontSize:13,lineHeight:18,color:G().text}));let t=j(`Something that looks like a secret is shown as `),n=j(`. Allowing or approving this uses the real value, so make sure it belongs here.`);return b(e,t),b(e,n),E(e,H,n),e})()}function Bi(e){return[(()=>{let t=T(`text`);x(t,`style`,()=>({fontSize:14,lineHeight:20,color:G().text}));let n=T(`text`);k(n,`style`,{fontFamily:jr}),E(n,()=>e.request.tool);let r=j(` `);return b(t,n),b(t,r),E(t,()=>e.pending?`needs the session owner's permission for:`:`asked the session owner's permission for:`),t})(),w(()=>e.request.needs,e=>(()=>{let t=T(`text`);x(t,`style`,()=>({fontSize:13,color:G().text}));let n=j(`• `);return b(t,n),E(t,()=>Mi[e()]),t})()),(e=>C(e,()=>(e=>S(Fi,{get children(){return e()}}))(e)))(()=>e.request.target),C(()=>e.pending&&xn(e.request.target),()=>S(zi,{})),C(()=>e.pending&&Ni.includes(e.request.tool),()=>S(Q,{get children(){return`Allowing it doesn't run anything yet: the operation still gets its own approval, unless the message auto-approves.`}}))]}function Vi(e){return(()=>{let t=T(`view`);return k(t,`style`,{gap:4}),E(t,[S(Ri,{label:`Repository`,get children(){return e.operation.repository}}),C(()=>e.operation.tag!==void 0,()=>S(Ri,{label:`New tag`,get children(){return e.operation.tag??``}})),S(Ri,{get label(){return e.operation.tag===void 0?`Branch`:`On branch (not moved)`},get children(){return e.operation.branch}}),S(Ri,{label:`Commit`,get children(){return e.operation.commit.slice(0,12)}}),(e=>C(e,()=>(e=>S(Ri,{label:`Pull request`,get children(){return`${e().title} → ${e().base??`default branch`}`}}))(e)))(()=>e.operation.pullRequest)]),t})()}function Hi(e){let t=()=>`https://github.com/${e.operation.repository}/pull/${e.operation.pull}`;return(()=>{let n=T(`view`);k(n,`style`,{gap:4});let r=T(`view`);k(r,`style`,{flexDirection:`row`,gap:8});let i=T(`text`);x(i,`style`,()=>({width:96,fontSize:13,color:G().muted}));let a=j(`Pull request`);b(i,a);let o=T(`text`);k(o,`role`,`link`),k(o,`onPress`,()=>void p(t()).catch(()=>void 0)),x(o,`style`,()=>({fontFamily:jr,fontSize:13,textDecorationLine:`underline`,color:G().tones.info.text}));let s=j(`#`);return b(o,s),E(o,()=>e.operation.repository,s),E(o,()=>e.operation.pull),b(r,i),b(r,o),b(n,r),E(n,[S(Ri,{label:`Head commit`,get children(){return e.operation.sha.slice(0,12)}}),S(Ri,{label:`Method`,get children(){return Pi[e.operation.method]}})]),n})()}function Ui(e){try{let t=JSON.parse(e??`null`);return typeof t?.sessionId==`string`&&/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/.test(t.sessionId)?t.sessionId:null}catch{return null}}function Wi(e){let t=Ti(),n=()=>e.approval.operation,r=()=>{let n=e.approval,r=(e,n)=>` · Allowed by ${t(e)} ${n===`session`?`for the rest of the session`:`for this call`}`;return n.operation.kind===`permission`&&n.status===`approved`&&n.decidedBy?r(n.decidedBy,n.scope):`${n.permission?r(n.permission.decidedBy,n.permission.scope):``}${n.decidedBy?` · Decision by ${t(n.decidedBy)}`:``}`},i=()=>n().kind===`git.repin`&&e.approval.status===`executed`?Ui(e.approval.result):null,a=()=>e.approval.status===`pending`,o=_(!1),s=()=>Li(n());return S(Hr,{get testID(){return`approval-${e.approval.id}`},get style(){return a()?{borderColor:G().tones.warning.border,gap:12}:void 0},get children(){return[(()=>{let t=T(`view`);k(t,`style`,{flexDirection:`row`,flexWrap:`wrap`,alignItems:`center`,gap:8});let r=T(`view`);x(r,`style`,()=>({width:26,height:26,borderRadius:13,alignItems:`center`,justifyContent:`center`,backgroundColor:a()?G().tones.warning.background:G().surfaceRaised})),E(r,S(Y,{get name(){return Ii(n()).icon},size:14,get color(){return a()?G().tones.warning.text:G().muted}}));let i=T(`text`);x(i,`style`,()=>({flexShrink:1,fontSize:K.reading,fontWeight:`600`,color:G().text})),E(i,()=>Ii(n()).title);let o=T(`view`);return k(o,`style`,{flex:1}),b(t,r),b(t,i),b(t,o),E(t,[C(()=>e.approval.unbounded,()=>S(Br,{tone:`warning`,get children(){return`No resource limits`}})),C(()=>xn(n()),()=>S(Br,{tone:`warning`,get children(){return`Secret hidden`}})),C(()=>e.approval.automatic,()=>S(Br,{tone:`warning`,get children(){return`Auto-approved`}})),S(Br,{get tone(){return ji[e.approval.status]},get dot(){return e.approval.status===`executing`||a()},get children(){return a()?`Needs approval`:e.approval.status}})]),t})(),(t=>C(t,()=>(t=>S(Bi,{get request(){return t()},get pending(){return e.approval.status===`pending`}}))(t),()=>[(e=>C(e,()=>(e=>S(Z,{tone:`danger`,title:`Runs outside the sandbox`,get children(){return`This command runs as the host's OS user with access to their files, credentials and network, without CPU, memory or disk quotas. It runs in this session's files, which the agent can change, so builds, package scripts and Git hooks or settings there can run the agent's code on the host too. Only the host owner can approve it. The time limit is ${e().timeoutSeconds} seconds.`}}))(e)))(()=>n().kind===`host.bash`?n():null),(e=>C(e,()=>(e=>S(Z,{title:`Creates a new private session`,get children(){return`Resolves ${e().repository} at ${e().ref}. Other repository pins stay unchanged. This session's files, commits and conversation stay here; they are not copied. Only the session owner can approve.`}}))(e)))(()=>n().kind===`git.repin`?n():null),(e=>C(e,()=>(e=>S(Z,{tone:`danger`,title:`Runs on the host, outside the sandbox`,get children(){return yt(e())}}))(e)))(()=>n().kind===`extension.tool`?n():null),(e=>C(e,()=>(e=>S(Vi,{get operation(){return e()}}))(e)))(()=>n().kind===`git.push`?n():null),(e=>C(e,()=>(e=>S(Hi,{get operation(){return e()}}))(e)))(()=>n().kind===`github.merge`?n():null),C(()=>s()!==null,()=>[S(Fi,{testID:`approval-command`,get children(){return s()??``}}),S(M,{get accessibilityLabel(){return o()?`Hide the exact operation`:`Show the exact operation`},onPress:()=>o.update(e=>!e),style:{flexDirection:`row`,alignItems:`center`,gap:4,alignSelf:`flex-start`,paddingVertical:2},activeStyle:{opacity:.6},get children(){return[S(Y,{get name(){return o()?`chevron-up`:`chevron-down`},size:12,get color(){return G().muted}}),(()=>{let e=T(`text`);return x(e,`style`,()=>({fontSize:K.caption,color:G().muted})),E(e,()=>o()?`Hide the exact operation`:`Show the exact operation`),e})()]}}),C(()=>o(),()=>S(Fi,{testID:`approval-operation`,get children(){return JSON.stringify(n(),null,2)}}))],()=>S(Fi,{testID:`approval-operation`,get children(){return(()=>{let e=n();return e.kind===`extension.tool`?bt(e):JSON.stringify(e,null,2)})()}})),C(()=>e.approval.status===`pending`&&xn(n()),()=>S(zi,{}))]))(()=>n().kind===`permission`?n():null),S(Q,{get children(){return`Requested by ${t(e.approval.requestedBy)} · ${ui(e.approval.createdAt)}${e.approval.automatic?` · ${xt(n())}`:r()}`}}),(e=>C(e,()=>(e=>S(Fi,{testID:`approval-result`,get children(){return e()}}))(e)))(()=>e.approval.result),(t=>C(t,()=>(t=>(()=>{let n=T(`view`);return k(n,`style`,{flexDirection:`row`}),E(n,S(X,{testID:`approval-open-repin`,small:!0,label:`Open repinned session`,onPress:()=>e.onOpenSession?.(t())})),n})())(t)))(()=>e.onOpenSession&&i()),()=>e.children]}})}function Gi(e){let t=W(),n=()=>void t.run(async()=>{await U().api(`/api/sessions/${V(e.sessionId)}/restart`,{method:`POST`}),e.onRestarted()});return C(()=>e.preparation.status===`failed`,()=>[S(Z,{tone:`danger`,title:`Repositories could not be prepared`,get actions(){return C(()=>e.canRestart,()=>S(X,{small:!0,get label(){return t.busy()?`Restarting...`:`Restart session`},get disabled(){return t.busy()},onPress:n}))},get children(){return`${e.preparation.error??`The host could not prepare this session's repositories.`} ${e.canRestart?`Fix the cause on the host, then restart the session. Queued messages run once the repositories are ready.`:`The session owner can restart the session once the cause is fixed.`}`}}),S(Kr,{get error(){return t.error()}})],()=>S(Hr,{testID:`repository-preparation`,get children(){return[(()=>{let e=T(`text`);k(e,`role`,`header`),x(e,`style`,()=>({fontSize:14,fontWeight:`700`,color:G().text}));let t=j(`Preparing repositories…`);return b(e,t),e})(),w(()=>e.preparation.items,e=>(()=>{let t=T(`view`);k(t,`style`,{gap:6});let n=T(`view`);k(n,`style`,{flexDirection:`row`,flexWrap:`wrap`,alignItems:`baseline`,columnGap:8,rowGap:2});let r=T(`text`);x(r,`style`,()=>({numberOfLines:1,flexShrink:1,fontFamily:jr,fontSize:13,color:G().text})),E(r,()=>e().path),b(n,r),E(n,S(Q,{get children(){return Dt(e())}}));let i=T(`view`);k(i,`role`,`progressbar`),x(i,`accessibilityLabel`,()=>`${e().path}: ${Dt(e())}`),x(i,`style`,()=>({height:6,borderRadius:3,overflow:`hidden`,backgroundColor:G().code}));let a=T(`view`);return x(a,`style`,()=>({height:`100%`,borderRadius:3,width:`${Et(e())??30}%`,backgroundColor:G().tones.running.text})),b(i,a),b(t,n),b(t,i),t})(),e=>e.path),S(Q,{get children(){return`The first session on a host clones each repository with its full history; later sessions fetch only what changed. Messages sent now run when this is done.`}})]}}))}function Ki(e){if(!Array.isArray(e)||!e.length)return``;let t=e.filter(e=>e.status!==`executed`).map(t=>e.length>1?`${t.tool}: ${t.status}`:t.status);return` · Auto-approved${e.some(e=>e.unbounded)?` · No resource limits`:``}${t.map(e=>` · ${e}`).join(``)}`}const qi={read:`file`,write:`compose`,edit:`compose`,ls:`folder`,find:`search`,grep:`search`,source_read:`file`,browser:`globe`,git:`branch`,git_commit:`branch`,git_push:`branch`,git_repin:`branch`,github_comment:`pull-request`,github_merge:`pull-request`,github_issue:`pull-request`,github_read:`pull-request`,schedule:`clock`,sessions:`list`,tunnel:`link`},Ji=e=>qi[e]??`terminal`;function Yi(e){let t=e.indexOf(`(`);try{let n=JSON.parse(e.slice(t+1,-1));if(typeof n.program==`string`&&Array.isArray(n.args))return[n.program,...n.args.map(e=>/^[\w./:=@%+-]+$/.test(String(e))?String(e):JSON.stringify(String(e)))].join(` `).replace(/\s+/g,` `);for(let e of[`command`,`cmd`,`path`,`file`,`url`,`query`,`pattern`,`action`,`repository`])if(typeof n[e]==`string`&&n[e])return n[e].replace(/\s+/g,` `).trim();let r=Object.values(n).find(e=>typeof e==`string`&&e);return typeof r==`string`?r.replace(/\s+/g,` `).trim():``}catch{return``}}function Xi(e,t,n){let r=e.actorId?n(e.actorId,!0):``,{prose:i,calls:a}=e.role===`assistant`?Le(e.text):{prose:e.text,calls:[]},o=Ki(e.autoApproved),s=a.length>1?`${a[0].name} +${a.length-1}`:a[0]?.name??``;if(e.kind===`workspace.run-stopped`||e.kind===`workspace.run-crashed`||e.kind===`workspace.run-refused`)return{kind:`stopped`,text:e.kind===`workspace.run-stopped`?`Stopped${r?` by ${r}`:``}`:e.text};if(a.length&&!i.trim()||e.role===`system`||e.role===`toolResult`){let t=e.role===`toolResult`,n=t&&e.durationMs!==void 0?oi(e.durationMs):``,i=e.text.trim().split(`
|
|
12
|
+
`)[0]??``;return{kind:`tool`,result:t,trimmed:e.trimmed,text:a.length?a.map(e=>e.line).join(`
|
|
13
|
+
`):e.text,icon:a.length?Ji(a[0].name):t?`file`:`info`,name:a.length?s:t?`Output`:`System`,summary:a.length?Yi(a[0].line):i,meta:[n,r&&r!==`you`?r:``].filter(Boolean).join(` · `)+o}}if(e.error)return e.error.compaction?{kind:`error`,title:`Context compaction failed`,text:nt(e.error.compaction),by:r}:{kind:`error`,title:`Model request failed`,text:di(e.error),by:r};if(e.role===`user`)return{kind:`user`,text:e.text,meta:r&&e.actorId!==t?r:``};let c=e.durationMs!==void 0&&e.durationMs>=1e3?oi(e.durationMs):``;return{kind:`assistant`,prose:i,tool:a.length?{icon:Ji(a[0].name),name:s,summary:Yi(a[0].line),meta:o.replace(/^ · /,``),text:a.map(e=>e.line).join(`
|
|
14
|
+
`)}:null,meta:[r&&r!==`you`?`by ${r}`:``,c].filter(Boolean).join(` · `)}}function Zi(e){return(()=>{let t=T(`view`);return k(t,`style`,{gap:6}),E(t,[S(M,{get accessibilityLabel(){return`${e.name} ${e.summary}${e.meta?` · ${e.meta}`:``}`},get onPress(){return e.onToggle},get style(){return{flexDirection:`row`,alignItems:`center`,gap:8,alignSelf:`flex-start`,maxWidth:`100%`,paddingHorizontal:8,height:28,marginLeft:-8,borderRadius:q.medium}},get hoverStyle(){return{backgroundColor:G().hover}},activeStyle:{opacity:.6},get children(){return[S(Y,{get name(){return e.icon},size:14,get color(){return G().faint}}),(()=>{let t=T(`text`);return x(t,`style`,()=>({fontSize:K.small,fontWeight:`600`,color:G().muted})),E(t,()=>e.name),t})(),C(()=>e.summary,()=>(()=>{let t=T(`text`);return x(t,`style`,()=>({flexShrink:1,numberOfLines:1,fontFamily:jr,fontSize:12,color:G().faint})),E(t,()=>e.summary),t})()),C(()=>e.meta,()=>(()=>{let t=T(`text`);return x(t,`style`,()=>({fontSize:K.caption,color:G().faint,numberOfLines:1})),E(t,()=>e.meta),t})()),S(Y,{get name(){return e.open?`chevron-up`:`chevron-down`},size:12,get color(){return G().faint}})]}}),C(()=>e.open,()=>[(()=>{let t=T(`view`);k(t,`selectable`,!0),x(t,`style`,()=>({borderRadius:q.medium,borderWidth:1,borderColor:G().border,backgroundColor:G().code,padding:10}));let n=T(`text`);return x(n,`style`,()=>({fontFamily:jr,fontSize:12,lineHeight:18,color:G().text})),E(n,()=>e.text),b(t,n),t})(),(e=>C(e,()=>(e=>(()=>{let t=T(`text`);return x(t,`style`,()=>({fontSize:K.caption,color:G().muted})),E(t,()=>`Brief tool output · ${e().lines===1?`1 line`:`${e().lines} lines`}, ${e().chars} characters in full. The session's owner can show full tool output in the session's details.`),t})())(e)))(()=>e.trimmed)])]),t})()}function Qi(e){let t=()=>!!e.onActions&<(e.entry)!==``;return C(()=>e.meta||t(),()=>(()=>{let n=T(`view`);return x(n,`style`,()=>({flexDirection:`row`,alignItems:`center`,gap:6,justifyContent:e.end?`flex-end`:`flex-start`})),E(n,[C(()=>e.meta,()=>(()=>{let t=T(`text`);return x(t,`style`,()=>({fontSize:K.caption,color:G().faint})),E(t,()=>e.meta),t})()),C(()=>t(),()=>S(M,{accessibilityLabel:`Message actions`,hitSlop:10,onPress:()=>e.onActions?.(e.entry),get style(){return{width:24,height:22,alignItems:`center`,justifyContent:`center`,borderRadius:q.small,opacity:m.desktop||m.os===`web`?.55:1}},get hoverStyle(){return{backgroundColor:G().hover,opacity:1}},activeStyle:{opacity:.5},get children(){return S(Y,{name:`more`,size:14,get color(){return G().muted}})}}))]),n})())}function $i(e){let t=Ti(),n=o(()=>Xi(e.entry,e.userId,t)),r=()=>e.expanded(e.entry.id),i=()=>e.toggle(e.entry.id),a=()=>n().kind===`tool`?4:18;return(()=>{let t=T(`view`);return x(t,`style`,()=>({gap:6,paddingBottom:a()})),E(t,[(e=>C(e,()=>(e=>(()=>{let t=T(`view`);k(t,`style`,{flexDirection:`row`,alignItems:`center`,gap:10,paddingVertical:4});let n=T(`view`);x(n,`style`,()=>({flex:1,height:1,backgroundColor:G().border}));let r=T(`text`);x(r,`style`,()=>({flexShrink:1,textAlign:`center`,fontSize:K.caption,color:G().muted})),E(r,()=>e().text);let i=T(`view`);return x(i,`style`,()=>({flex:1,height:1,backgroundColor:G().border})),b(t,n),b(t,r),b(t,i),t})())(e)))(()=>n().kind===`stopped`?n():null),(e=>C(e,()=>(e=>S(Zi,{get icon(){return e().icon},get name(){return e().name},get summary(){return e().summary},get meta(){return e().meta},get text(){return e().text},get trimmed(){return e().trimmed},get result(){return e().result},get open(){return r()},onToggle:i}))(e)))(()=>n().kind===`tool`?n():null),(e=>C(e,()=>(e=>[S(Z,{tone:`danger`,get title(){return e().title},get children(){return e().text}}),C(()=>e().by,()=>(()=>{let t=T(`text`);x(t,`style`,()=>({fontSize:K.caption,color:G().muted}));let n=j(`by `);return b(t,n),E(t,()=>e().by),t})())])(e)))(()=>n().kind===`error`?n():null),(t=>C(t,()=>(t=>(()=>{let n=T(`view`);k(n,`style`,{alignItems:`flex-end`,gap:4});let r=T(`view`);k(r,`selectable`,!0),x(r,`style`,()=>({borderRadius:18,borderBottomRightRadius:6,paddingHorizontal:14,paddingVertical:9,maxWidth:`85%`,backgroundColor:G().userBubble}));let i=T(`text`);return x(i,`style`,()=>({fontSize:K.reading,lineHeight:22,color:G().onUserBubble})),E(i,()=>t().text),b(r,i),b(n,r),E(n,C(()=>t().meta,()=>(()=>{let e=T(`text`);return x(e,`style`,()=>({fontSize:K.caption,fontWeight:`600`,color:G().muted,paddingHorizontal:4})),E(e,()=>t().meta),e})()),r),E(n,S(Qi,{get entry(){return e.entry},meta:``,get onActions(){return e.onActions},end:!0})),n})())(t)))(()=>n().kind===`user`?n():null),(t=>C(t,()=>(t=>[C(()=>t().prose.trim(),()=>S(ie,{get markdown(){return t().prose},selectable:!0,options:{streaming:!0}})),(t=>C(t,()=>(t=>S(Zi,{get icon(){return t().icon},get name(){return t().name},get summary(){return t().summary},get meta(){return t().meta},get text(){return t().text},get trimmed(){return e.entry.trimmed},get open(){return r()},onToggle:i}))(t)))(()=>t().tool),S(Qi,{get entry(){return e.entry},get meta(){return t().meta},get onActions(){return e.onActions}})])(t)))(()=>n().kind===`assistant`?n():null)]),t})()}function ea(e){let t=_(null),n=_(null),r=_(``),a=_(`connecting`),o=_(0),s=()=>{},l=async e=>{},u=/* @__PURE__ */ new Set;return c(()=>{En();for(let e of[...u])e()}),c(()=>{o();let{api:c,origin:d,token:f}=v(U);a.set(`connecting`);let p=et(e,{session:e=>t.set(e),view:e=>n.set(e),error:e=>r.set(e),status:e=>a.set(e)},{api:c,openEvents:e=>Mt({fetch:(e,t)=>fetch(e,f?t:{...t,credentials:`same-origin`}),url:`${d&&f?d:``}${e}`,headers:f?{Authorization:`Bearer ${f}`}:{}}),hidden:hr,onVisibilityChange(e){return u.add(e),()=>u.delete(e)}});s=p.refresh,l=p.loadOlder,i(()=>{p.stop(),s=()=>{},l=async()=>{}})}),{session:t,view:n,error:r,status:a,refresh:()=>s(),loadOlder:e=>l(e),reconnect:()=>o.update(e=>e+1)}}function ta(e){return(()=>{let t=T(`scroll`);return x(t,`testID`,()=>e.testID),k(t,`style`,{flex:1}),k(t,`contentStyle`,{gap:12,padding:16}),E(t,()=>e.children),t})()}function na(e){return S(Wr,{icon:`clock`,title:`Coming to this app`,get children(){return`${e.what} isn't in this app yet.`}})}function ra(e){return S(ta,{testID:`panel-browser`,get children(){return S(na,{what:`The Browser tab`})}})}function ia(e){return S(ta,{testID:`panel-connections`,get children(){return S(na,{what:`The Connections tab`})}})}function aa(e){return S(ta,{testID:`panel-files`,get children(){return S(na,{what:`The Files tab`})}})}function oa(e){let{user:n}=v(U),r=br(),i=Ti(),a=W(),o=gr(()=>{let t=e.session();return t?.connectorId?`/api/workspaces/${V(t.workspaceId)}/connectors`:null}),s=()=>o.data()?.connectors.find(t=>t.id===e.session()?.connectorId),c=()=>r.workspaces().find(t=>t.id===e.session()?.workspaceId),l=()=>{let t=e.session();return t?At(t,e.view()?.activity):null},u=()=>{let t=e.session();return s()?.ownerName??(t?.connectorOwnerId?i(t.connectorOwnerId):`unknown`)};return S(ta,{testID:`panel-overview`,get children(){return(r=>C(r,()=>(r=>[S(Hr,{get children(){return[(()=>{let e=T(`view`);k(e,`style`,{flexDirection:`row`,alignItems:`center`,gap:8});let t=T(`text`);return x(t,`style`,()=>({flex:1,fontSize:16,fontWeight:`600`,color:G().text})),E(t,()=>r().title),b(e,t),E(e,C(()=>l()?.label,()=>S(Br,{get tone(){return l().tone},dot:!0,get children(){return l().label}}))),e})(),S($,{label:`Workspace`,get children(){return S(Qr,{get children(){return c()?.name??r().workspaceId}})}}),S($,{label:`Owner`,get children(){return S(Qr,{get children(){return i(r().ownerId,!0)}})}}),S($,{label:`Host`,get children(){return S(Qr,{testID:`session-people`,get children(){return r().connectorId?`${s()?.name??`Pinned host`}, hosted by ${u()}${r().connectorOwnerId===n.id?` (you)`:``}${s()&&!s().online?` · offline`:``}`:`Operator-managed session`}})}}),S($,{label:`Visibility`,get children(){return S(Qr,{get children(){return`${r().visibility===`workspace`?`Workspace members can view it`:`Private: only people given a role, and the workspace's owner and admins`}${r().linkShared?` · A share link is on`:``}`}})}}),C(()=>r().hostUnsandboxed,()=>S(Q,{tone:`danger`,get children(){return`This session's host runs without a sandbox.`}})),S($,{label:`Started`,get children(){return S(Qr,{get children(){return ui(r().createdAt)}})}})]}}),S(Hr,{get children(){return[S($,{label:`Session ID`,get children(){return(()=>{let n=T(`view`);k(n,`style`,{flexDirection:`row`,flexWrap:`wrap`,alignItems:`center`,gap:8});let r=T(`view`);k(r,`selectable`,!0),k(r,`style`,{flexShrink:1});let i=T(`text`);return x(i,`style`,()=>({fontFamily:`monospace`,fontSize:K.small,color:G().text})),E(i,()=>e.sessionId),b(r,i),b(n,r),E(n,S(X,{small:!0,variant:`ghost`,icon:`copy`,label:`Copy`,onPress:()=>void a.run(()=>t.writeText(e.sessionId),`Session ID copied`)})),n})()}}),S(Q,{get children(){return`Open it on another device with Open a session by ID.`}})]}}),S(Kr,{get error(){return a.error()},get notice(){return a.notice()}})])(r),()=>S(Q,{get children(){return`Loading…`}})))(()=>e.session())}})}function sa(e){return S(ta,{testID:`panel-schedules`,get children(){return S(na,{what:`The Schedules tab`})}})}function ca(e){return S(ta,{testID:`panel-sharing`,get children(){return S(na,{what:`The Sharing tab`})}})}const la=[{id:`overview`,label:`Overview`,Component:oa},{id:`files`,label:`Files`,Component:aa},{id:`browser`,label:`Browser`,Component:ra},{id:`connections`,label:`Connections`,Component:ia},{id:`schedules`,label:`Schedules`,Component:sa},{id:`sharing`,label:`Sharing`,Component:ca}];function ua(e){let t=_(la[0].id),n=()=>y().width>=700;return S(ne,{get open(){return e.open},get side(){return n()?`right`:`bottom`},closeOnSwipe:!0,onOpenChange:t=>{t.open||e.onClose()},get backdropStyle(){return{backgroundColor:G().backdrop}},get popupStyle(){return n()?{width:480,maxWidth:`100%`,height:`100%`,backgroundColor:G().background,borderLeftWidth:1,borderColor:G().border}:{height:`92%`,borderTopLeftRadius:q.xlarge,borderTopRightRadius:q.xlarge,backgroundColor:G().background}},get children(){return(()=>{let n=T(`view`);k(n,`testID`,`session-panel`),k(n,`style`,{flex:1});let r=T(`view`);x(r,`style`,()=>({gap:10,paddingHorizontal:16,paddingTop:12,paddingBottom:10,borderBottomWidth:1,borderColor:G().border}));let i=T(`view`);k(i,`style`,{flexDirection:`row`,alignItems:`center`});let a=T(`text`);x(a,`style`,()=>({flex:1,fontSize:16,fontWeight:`600`,color:G().text}));let o=j(`Session details`);b(a,o),b(i,a),E(i,S(X,{small:!0,variant:`ghost`,label:`Done`,get onPress(){return e.onClose}}));let s=T(`scroll`);return k(s,`horizontal`,!0),k(s,`scrollbar`,!1),E(s,S(Jr,{testID:`session-panel-tabs`,get value(){return t()},onChange:e=>t.set(e),get options(){return la.map(e=>({value:e.id,label:e.label}))}})),b(r,i),b(r,s),b(n,r),E(n,w(()=>[t()],t=>{let n=la.find(e=>e.id===t()).Component;return S(n,{get sessionId(){return e.sessionId},get session(){return e.session},get view(){return e.view},get refresh(){return e.refresh},get go(){return e.go}})},e=>e)),n})()}})}function da(e){let{user:n}=v(U),r=br(),a=ea(e.id),s=_(!1),l=_(!1),u=()=>a.session()?.permissions??[],d=()=>a.session()?.status===`archived`,f=()=>d()||a.session()?.frozen===!0,p=()=>u().includes(`approve`)&&!f(),m=()=>a.session()?.ownerId===n.id,h=gr(()=>{let e=a.session();return e?.connectorId?`/api/workspaces/${V(e.workspaceId)}/connectors`:null},1e4),g=()=>h.data()?.connectors.find(e=>e.id===a.session()?.connectorId),y;c(()=>{let e=g()?.online;y===!1&&e&&a.refresh(),y=e});let D=W(),O=W(),A=()=>a.session()??r.sessions().find(t=>t.id===e.id),j=Ci(()=>A()?.workspaceId??null),ee=()=>A()?.title??`Session`,M=()=>{let e=A();return e?r.workspaces().find(t=>t.id===e.workspaceId):void 0},N=()=>{let e=a.session();return!!(e&&zt(n.id,e.ownerId,M()?.role))},P=()=>a.view()?.approvals??[],F=o(()=>P().filter(e=>e.status===`pending`)),te=()=>f()?void 0:a.view()?.extensions?.unavailable?.find(e=>e.source===`piki:browser`&&[`missing`,`failed`,`downloading`].includes(e.reason)),ne=_(!1);c(()=>{let t=a.view()?.activity;r.setLiveActivity(t?{sessionId:e.id,activity:t}:null)}),i(()=>{r.setLiveActivity(null),r.refreshSessions()});function re(e){let t=a.session()??{};if(f())return!1;if(dt(e.operation,t,e.unbounded))return _t(e.operation,t,g(),n.id,u().includes(`approve`));let r=e.operation.kind===`permission`||e.operation.kind===`git.repin`;return p()&&(!r||m())}async function ie(t,n,r,i=!1){if(!re(t)||O.busy()||!t.reviewHash||t.status!==`pending`)return;let o=t.operation.kind===`permission`?n===`deny`?`Not allowed`:r===`session`?`Allowed for the rest of the session`:`Allowed for this call`:i?`Approved. ${(e=>Pt(j().person(e)))(t.requestedBy)}'s requests here now run without asking; stop it under Approvals.`:n===`approve`?`Approval decision recorded`:`Operation denied`;await O.run(async()=>{await U().api(`/api/sessions/${V(e.id)}/approvals/${V(t.id)}`,{method:`POST`,body:{decision:n,reviewHash:t.reviewHash,...r?{scope:r}:{},...i?{alwaysApprove:!0}:{}}}),a.refresh()},o)}function ae(){D.run(async()=>{await U().api(`/api/sessions/${V(e.id)}/unarchive`,{method:`POST`}),a.refresh(),r.refreshSessions()},`Session unarchived`)}let L=()=>void D.run(()=>t.writeText(e.id),`Session ID copied`),R=()=>!a.view()&&!(!a.session()||a.session().status!==`error`&&a.session().status!==`provisioning`),z=()=>{if(d())return{text:`Archived`,dot:!1};if(R())return a.session()?.status===`error`?{tone:`danger`,text:`Not started`,dot:!0}:{tone:`running`,text:`Starting`,dot:!0};if(!a.view()&&a.error())return{tone:`warning`,text:`Unavailable`,dot:!0};switch(a.status()){case`online`:return{tone:`success`,text:`Live`,dot:!0};case`reconnecting`:return{tone:`warning`,text:`Reconnecting`,dot:!0};case`offline`:return{tone:`danger`,text:`Disconnected`,dot:!0};default:return{text:`Connecting`,dot:!0}}},oe=()=>(()=>{let t=T(`view`);return k(t,`style`,{flexDirection:`row`,alignItems:`center`,gap:2}),E(t,[C(()=>!e.page,()=>(()=>{let e=T(`view`);return k(e,`style`,{paddingRight:6}),E(e,S(Br,{testID:`session-connection`,get tone(){return z().tone},get dot(){return z().dot},get children(){return z().text}})),e})()),S(zr,{testID:`session-approvals`,icon:`shield-check`,get label(){return F().length?`Approvals, ${F().length} pending`:`Approvals`},get badge(){return F().length},get tone(){return F().length?`warning`:void 0},onPress:()=>s.set(!0),get disabled(){return!a.view()}}),S(zr,{testID:`session-copy-id`,icon:`copy`,label:`Copy session ID`,onPress:L}),S(zr,{testID:`session-details`,icon:`panel-right`,label:`Session details`,onPress:()=>l.set(!0),get active(){return l()}})]),t})(),se=()=>{let e=a.session(),t=[M()?.name,g()?`${g().name}${g().online?``:` (offline)`}`:void 0];return e&&t.push(e.visibility===`workspace`?`Workspace-visible`:`Private`,...e.linkShared?[`Link shared`]:[]),t.filter(Boolean).join(` · `)},B=e=>{let t=()=>e().operation.kind===`permission`,r=()=>pt(e().operation,a.session()??{}),i=()=>dt(e().operation,a.session()??{},e().unbounded),o=()=>t()||e().operation.kind===`git.repin`,s=()=>O.busy()||!e().reviewHash,c=()=>{let t=a.session();return!!(t&&mt(e(),t,g(),n.id))};return S(Wi,{get approval(){return e()},get children(){return C(()=>re(e()),()=>[C(()=>!e().reviewHash,()=>S(Z,{tone:`warning`,title:`No verified review commitment`,get actions(){return S(X,{small:!0,label:`Refresh approval`,get disabled(){return O.busy()},get onPress(){return a.refresh}})},get children(){return`Refresh before deciding; the server must bind the displayed operation and requester.`}})),C(()=>t(),()=>(()=>{let t=T(`view`);return k(t,`style`,{flexDirection:`row`,flexWrap:`wrap`,gap:8}),E(t,[S(X,{variant:`primary`,icon:`check`,label:`Allow once`,get disabled(){return s()},onPress:()=>void ie(e(),`approve`,`call`)}),C(()=>e().operation.kind!==`permission`||e().operation.tool!==`host_bash`,()=>S(X,{label:`Allow for this session`,get disabled(){return s()},onPress:()=>void ie(e(),`approve`,`session`)})),S(X,{icon:`x`,label:`Deny`,get disabled(){return s()},onPress:()=>void ie(e(),`deny`)})]),t})(),()=>[(()=>{let t=T(`view`);return k(t,`style`,{flexDirection:`row`,flexWrap:`wrap`,gap:8}),E(t,[S(X,{testID:`approval-approve`,variant:`primary`,icon:`check`,label:`Approve`,get disabled(){return s()},onPress:()=>void ie(e(),`approve`)}),C(()=>c(),()=>S(X,{testID:`approval-always`,get label(){return`Always approve ${Pt(j().person(e().requestedBy))}`},get disabled(){return s()},onPress:()=>void ie(e(),`approve`,void 0,!0)})),S(X,{testID:`approval-deny`,icon:`x`,label:`Deny`,get disabled(){return s()},onPress:()=>void ie(e(),`deny`)})]),t})(),S(Q,{testID:`approval-hint`,get children(){return`Runs as ${r()?`the host OS user (outside the sandbox)`:a.view()?.owner.displayName??``} · each approval covers one exact operation and its arguments`}})])],()=>S(Q,{get children(){return i()?vt(e().operation,g()):o()?`Waiting for the session owner`:`Waiting for an authorized approver`}}))}})},ce=(()=>{let t=T(`view`);return k(t,`style`,{gap:10,paddingTop:4}),E(t,[(t=>C(t,()=>(t=>S(Gi,{get sessionId(){return e.id},get preparation(){return t()},get canRestart(){return m()&&!d()&&u().includes(`manage`)},onRestarted:()=>{a.refresh(),r.refreshSessions()}}))(t)))(()=>a.view()?.repositories),(e=>C(e,()=>(e=>S(Z,{get tone(){return e().reason===`downloading`?`info`:`warning`},get title(){return e().reason===`downloading`?`The browser isn't ready yet`:`No browser on this host`},get actions(){return S(X,{small:!0,label:`Dismiss`,onPress:()=>ne.set(!0)})},get children(){return`The workspace has the browser tool on, but this session can't use it. ${Cn(e().reason)}`}}))(e)))(()=>te()&&u().includes(`write`)&&!ne()?te():null),C(()=>a.session()?.hostUnsandboxed&&(u().includes(`write`)||p()),()=>C(()=>a.session()?.hostEnvironment,()=>S(Z,{tone:`danger`,title:`Runs on the host`,get children(){return`This session runs directly on its host, without the sandbox. Approved commands and commits execute on the host owner's machine with their full user permissions, network access and no resource limits; only the host owner, or members they granted host commands, decide them.`}}),()=>S(Z,{tone:`danger`,title:`Unsandboxed host`,get children(){return`This session's host runs without a sandbox. Approved commands and commits execute directly on the host owner's machine with their full user permissions, network access and no resource limits.`}})))]),t})(),le=C(()=>F().length>0||O.error()||O.notice(),()=>(()=>{let e=T(`scroll`);return k(e,`testID`,`approval-dock`),k(e,`style`,{flexShrink:1,maxHeight:`55%`}),k(e,`contentStyle`,{gap:10,paddingHorizontal:16,paddingTop:10,width:`100%`,maxWidth:800,alignSelf:`center`}),E(e,[w(()=>F(),e=>B(e),e=>e.id),S(Kr,{get error(){return O.error()},get notice(){return O.notice()}})]),e})()),ue=S(wi.Provider,{value:j,get children(){return(()=>{let t=T(`view`);return x(t,`style`,()=>({flex:1,backgroundColor:G().background})),E(t,[C(()=>!e.page,()=>S(Si,{get title(){return ee()},get subtitle(){return se()},get actions(){return oe()},testID:`session-header`})),C(()=>e.page&&a.session(),()=>(()=>{let e=T(`view`);x(e,`style`,()=>({flexDirection:`row`,alignItems:`center`,gap:8,paddingHorizontal:16,paddingVertical:6,borderBottomWidth:1,borderColor:G().border}));let t=T(`text`);return x(t,`style`,()=>({flex:1,numberOfLines:1,fontSize:K.caption,color:G().muted})),E(t,()=>se()),b(e,t),E(e,S(Br,{testID:`session-connection`,get tone(){return z().tone},get dot(){return z().dot},get children(){return z().text}}),t),e})()),C(()=>d()||a.error()&&!R()||D.error()||D.notice(),()=>(()=>{let e=T(`view`);return k(e,`style`,{gap:8,paddingHorizontal:16,paddingTop:10,width:`100%`,maxWidth:800,alignSelf:`center`}),E(e,[C(()=>d(),()=>S(Z,{title:`Archived`,get actions(){return C(()=>N(),()=>S(X,{small:!0,label:`Unarchive`,get disabled(){return D.busy()},onPress:ae}))},get children(){return`This session is read-only. ${N()?`Unarchive it to continue the work.`:`Only its owner, or the workspace's owner or an admin, can unarchive it.`}`}})),C(()=>a.error()&&!R(),()=>S(Z,{tone:`danger`,get title(){return a.session()?`Live updates interrupted`:`Unable to open session`},get actions(){return S(X,{small:!0,label:`Reconnect and check access`,get onPress(){return a.reconnect}})},get children(){return a.error()}})),S(Kr,{get error(){return D.error()},get notice(){return D.notice()}})]),e})()),C(()=>a.view()&&a.session(),()=>S(pa,{get id(){return e.id},live:a,host:g,pinned:ce,dock:le,openSession:t=>{r.refreshSessions(),e.openSession(t)}}),()=>C(()=>a.error(),()=>(t=>C(t,()=>(t=>S(ma,{get id(){return e.id},get session(){return t()},get error(){return a.error()},recovered:()=>{a.reconnect(),r.refreshSessions()}}))(t),()=>(()=>{let e=T(`view`);return k(e,`style`,{flex:1}),e})()))(()=>a.session()),()=>S(Gr,{}))),S(ua,{get open(){return l()},onClose:()=>l.set(!1),get sessionId(){return e.id},get session(){return a.session},get view(){return a.view},get refresh(){return a.refresh},go:t=>{l.set(!1),e.go(t)}}),S(fa,{get open(){return s()},get approvals(){return P()},get olderApprovals(){return a.view()?.olderApprovals},onClose:()=>s.set(!1),onOpenSession:t=>{s.set(!1),r.refreshSessions(),e.openSession(t)},get session(){return a.session()},get onChanged(){return a.refresh}})]),t})()}});return e.page?S(I,{get title(){return ee()},get style(){return yi()},get headerRight(){return vi?void 0:oe()},get header(){return vi?S(Si,{get title(){return ee()},get onBack(){return e.onBack},get actions(){return oe()},testID:`session-header`}):void 0},get children(){return ue}}):ue}function fa(e){let{user:t}=v(U),n=Ti(),r=W(),i=()=>e.session?.autoApprovedRequesters??[];function a(t){let i=e.session;i&&!r.busy()&&r.run(async()=>{await U().api(`/api/sessions/${V(i.id)}/auto-approved-requesters/${V(t)}`,{method:`DELETE`}),e.onChanged()},`${n(t)}'s requests ask again.`)}let o=()=>[...e.approvals].sort((e,t)=>Number(t.status===`pending`)-Number(e.status===`pending`));return S(ne,{get open(){return e.open},get side(){return y().width>=700?`right`:`bottom`},closeOnSwipe:!0,onOpenChange:t=>{t.open||e.onClose()},get backdropStyle(){return{backgroundColor:G().backdrop}},get popupStyle(){return y().width>=700?{width:480,maxWidth:`100%`,height:`100%`,backgroundColor:G().background,borderLeftWidth:1,borderColor:G().border}:{height:`90%`,borderTopLeftRadius:q.xlarge,borderTopRightRadius:q.xlarge,backgroundColor:G().background}},get children(){return(()=>{let s=T(`view`);k(s,`testID`,`approvals-sheet`),k(s,`style`,{flex:1});let c=T(`view`);x(c,`style`,()=>({flexDirection:`row`,alignItems:`center`,gap:8,paddingHorizontal:16,minHeight:52,borderBottomWidth:1,borderColor:G().border}));let l=T(`text`);x(l,`style`,()=>({flex:1,fontSize:16,fontWeight:`600`,color:G().text}));let u=j(`Approvals`);b(l,u),b(c,l),E(c,S(X,{small:!0,variant:`ghost`,label:`Done`,get onPress(){return e.onClose}}));let d=T(`scroll`);return k(d,`style`,{flex:1}),k(d,`contentStyle`,{gap:12,padding:16}),E(d,[C(()=>e.session&&i().length>0,()=>[S(Z,{title:`Auto-approved requesters`,get children(){return`Requests from ${i().map(e=>n(e)).join(`, `)} run without asking.`}}),C(()=>e.session?.ownerId===t.id,()=>(()=>{let e=T(`view`);return k(e,`style`,{flexDirection:`row`,flexWrap:`wrap`,gap:8}),E(e,w(()=>i(),e=>S(X,{small:!0,get label(){return`Stop for ${n(e())}`},get disabled(){return r.busy()},onPress:()=>a(e())}))),e})()),S(Kr,{get error(){return r.error()},get notice(){return r.notice()}})]),S(Q,{get children(){return`Commands that ran under auto-approve are marked on their tool calls in the conversation.`}}),C(()=>o().length>0,()=>w(()=>o(),t=>S(Wi,{get approval(){return t()},get onOpenSession(){return e.onOpenSession}}),e=>e.id),()=>S(Wr,{title:`No approvals yet`,get children(){return`Commands, commits and pushes that need a decision appear here.`}})),C(()=>(e.olderApprovals??0)>0,()=>S(Q,{get children(){return`${e.olderApprovals} older approvals are on the web app's session page.`}}))]),b(s,c),b(s,d),s})()}})}function pa(e){let{user:n}=v(U),r=br(),i=ri(r),a=()=>e.live.session(),s=()=>e.live.view(),l=()=>a().ownerId===n.id,d=_(v(()=>Oe(s(),l()))),f=_(`write`),p=Fn(e.id),g=_(``),y=_(!1),O=null,j=!1,N=W(),P=W(),F=W(),I=_(null),te=_(),ne=_(/* @__PURE__ */ new Set),re=()=>a().permissions??[],ie=()=>re().includes(`write`),ae=()=>re().includes(`ask`),L=()=>f()===`ask`&&!ae()?`write`:f(),R=()=>a().status===`archived`||a().frozen===!0,z=()=>!R()&&(L()===`write`?ie():ae()),oe=()=>!!(a().hostUnsandboxed||e.host()?.capabilities.unsandboxed),se=()=>s().queue??[],B=o(()=>se().filter(e=>Qe.includes(e.status))),ce=()=>se().filter(e=>!Qe.includes(e.status)).slice(-5).reverse(),le=()=>!!s().stoppable&&a().status!==`archived`&&ie()&&B().length>0,ue=()=>se().some(e=>e.status===`stopping`),de=o(()=>s().conversations.filter(e=>e.mode===`ask`&&(!e.actorId||e.actorId===n.id))),fe=e=>L()===`ask`?e?.mode===`ask`&&(!e.actorId||e.actorId===n.id)&&(!g()||e.id===g()):e?.mode!==`ask`,pe=o(()=>{let e=s().conversations;return s().entries.filter(t=>t.role===`system`&&!t.text.trim()?!1:fe(e.find(e=>e.id===t.conversationId)))}),me=()=>s().conversations.filter(e=>(e.olderEntries??0)>0&&fe(e)),he=()=>me().reduce((e,t)=>e+(t.olderEntries??0),0),ge=_(!1);function _e(){!ge()&&me().length&&(ge.set(!0),Promise.all(me().map(t=>e.live.loadOlder(t.id))).finally(()=>ge.set(!1)))}c(()=>{L(),g(),te()?.scrollToEnd({animated:!1})});async function ve(){let t=p();if(!z()||!t.trim()||N.busy()||j)return;let n=e.host(),a=L()===`ask`?`ask`:`submit`,o=je(n,d(),a),c=ke(n,d(),a)??Ae(n,d());if(!c&&n&&Ne(o,r.autoApproveConfirmed())&&(j=!0,!await i(n,oe()).finally(()=>{j=!1}))){d.update(e=>({...e,access:`approval`}));return}I.set(null);let l=t,u=`${a}:${JSON.stringify(o??null)}:${l}`;O?.key!==u&&(O={key:u,id:fi()});let f=O.id;N.run(async()=>{if(c)throw Error(c);let t=await U().api(`/api/sessions/${V(e.id)}/${a}`,{method:`POST`,body:{content:l,requestId:f,...o?{options:o}:{}}});I.set(t),o&&r.rememberChat(n,d(),s().agent),a===`ask`&&g.set(t.conversationId),Nn(e.id,l),O=null,e.live.refresh(),te()?.scrollToEnd({animated:!0})})}function ye(){le()&&!P.busy()&&P.run(async()=>{await U().api(`/api/sessions/${V(e.id)}/stop`,{method:`POST`,body:{}}),e.live.refresh()})}let be=()=>s().busy||B().length>0;async function xe(e){let n=at(s())&&L()===`write`&&!R()?it(e):void 0,r=[{id:`copy`,label:`Copy message`},...n&&ie()?[{id:`revert`,label:n.before?`Go back to before this message`:`Go back to this reply`,role:`destructive`}]:[],...n&&l()?[{id:`fork`,label:`Fork a new session from here`}]:[]],i=(await ee.show({title:`Message`,presentation:`actionSheet`,actions:[...r,{id:`cancel`,label:`Cancel`,role:`cancel`}]})).action;i===`copy`?F.run(()=>t.writeText(lt(e)),`Message copied`):!n||i!==`revert`&&i!==`fork`||(i===`revert`?await Se(e,n.entryId,n.before):await Ce(e,n.entryId,n.before))}async function Se(t,n,r){be()?F.run(async()=>{throw Error(`Stop the session's work to go back to an earlier message.`)}):await Zr({title:r?`Go back to before this message?`:`Go back to this reply?`,message:`${r?`This message and everything after it leave`:`Everything after this reply leaves`} the shared conversation, for everyone, and the agent continues from there.${r?` The message goes back into your chat box, below anything typed there, to edit and send again.`:``} Only the conversation goes back: files, commits and pushes stay as they are.`,confirmLabel:`Go back`,destructive:!0})&&F.run(async()=>{await U().api(`/api/sessions/${V(e.id)}/revert`,{method:`POST`,body:{entryId:n}}),r&&Pn(e.id,st(t)),e.live.refresh()})}async function Ce(t,n,r){await Zr({title:`Fork a new session from here?`,message:`A new session of yours starts on the same host and model with this conversation up to ${r?`just before this message, which goes into its chat box`:`this reply`}. This session stays as it is. Like every new session, the fork's worktree starts empty: its agent clones the workspace's repositories again.`,confirmLabel:`Fork session`})&&F.run(async()=>{let i=await U().api(`/api/sessions/${V(e.id)}/fork`,{method:`POST`,body:{entryId:n}});r&&jn(i.session.id,st(t)),e.openSession(i.session.id)})}let we=()=>!!p().trim()&&bn(p())!==p(),Te=()=>{let e=B().length>0?` · ${B().length} queued`:``;return Ot(s())?`Preparing repositories…${e}`:ue()?`Stopping…${e}`:s().busy?`${s().activity===`waiting`?`Waiting for a decision`:`Working`}…${e}`:B().length?`${B().length} queued`:`Idle`},Ee=Ti(),De=()=>de().findIndex(e=>e.id===g()),Me=()=>a().status===`archived`?`Read-only · this session is archived`:a().frozen?`Read-only · this session pinned its repositories when it started`:z()?L()===`ask`?`Read-only · anyone who can view this session can see side asks`:`Runs as ${s().owner.displayName}${s().owner.id===n.id?` (you)`:``}`:ae()?`Read-only · switch to Side ask to ask questions`:`Read-only · submitting needs write permission`,Pe=()=>m.desktop?12:Math.max(u().height,h().bottom,12),Fe=()=>be()||B().length>0||y(),Ie=()=>ue()||s().busy&&s().activity===`waiting`?`warning`:`running`;return[S(D,{get each(){return pe()},keyExtractor:e=>e.id,ref(e){A(te,e,`list`)},style:{flex:1},contentStyle:{paddingHorizontal:20,paddingTop:20,paddingBottom:8},maintainVisibleContentPosition:{autoscrollToBottomThreshold:80},testID:`transcript`,get accessibilityLabel(){return L()===`ask`?`Side ask history`:`Shared session history`},header:()=>C(()=>he()>0,()=>(()=>{let e=T(`view`);return k(e,`style`,{alignItems:`center`,paddingBottom:16}),E(e,S(X,{small:!0,variant:`ghost`,icon:`chevron-up`,get busy(){return ge()},onPress:_e,get label(){return`Show earlier messages (${he()})`},testID:`load-earlier`})),e})()),empty:()=>S(Wr,{get icon(){return L()===`ask`?`message-question`:`message`},get title(){return L()===`ask`?`A question on the side`:`The conversation begins here`},get children(){return L()===`ask`?`Ask about the work without changing it. Only you, and people who can view this session, see side asks.`:`Messages, the agent's replies and its tool calls appear here.`}}),footer:()=>(()=>{let t=T(`view`);return k(t,`style`,{width:`100%`,maxWidth:760,alignSelf:`center`}),E(t,()=>e.pinned),t})(),get children(){return e=>(()=>{let t=T(`view`);return k(t,`style`,{width:`100%`,maxWidth:760,alignSelf:`center`}),E(t,S($i,{get entry(){return e()},get userId(){return n.id},expanded:e=>ne().has(e),onActions:e=>void xe(e),toggle:e=>ne.update(t=>{let n=new Set(t);return n.delete(e)||n.add(e),n})})),t})()}}),()=>e.dock,(()=>{let t=T(`view`);x(t,`style`,()=>({paddingHorizontal:16,paddingTop:8,paddingBottom:Pe(),backgroundColor:G().background}));let n=T(`view`);return k(n,`style`,{gap:6,width:`100%`,maxWidth:800,alignSelf:`center`}),E(n,[C(()=>Fe(),()=>S(M,{testID:`queue-line`,get accessibilityLabel(){return`${Te()}, ${y()?`hide details`:`show details`}`},onPress:()=>y.update(e=>!e),get style(){return{flexDirection:`row`,alignItems:`center`,gap:8,alignSelf:`flex-start`,paddingHorizontal:8,height:26,borderRadius:q.pill,backgroundColor:G().tones[Ie()].background}},hoverStyle:{opacity:.85},get children(){return[(()=>{let e=T(`view`);return x(e,`style`,()=>({width:6,height:6,borderRadius:3,backgroundColor:G().tones[Ie()].text})),e})(),(()=>{let e=T(`text`);return x(e,`style`,()=>({fontSize:K.caption,fontWeight:`600`,color:G().tones[Ie()].text})),E(e,()=>Te()),e})(),S(Y,{get name(){return y()?`chevron-up`:`chevron-down`},size:12,get color(){return G().tones[Ie()].text}})]}})),C(()=>y(),()=>(()=>{let t=T(`view`);x(t,`style`,()=>({gap:6,padding:12,borderRadius:q.large,borderWidth:1,borderColor:G().border,backgroundColor:G().surface}));let n=T(`view`);return k(n,`style`,{flexDirection:`row`}),E(n,S(X,{small:!0,icon:`refresh`,label:`Refresh queue`,get onPress(){return e.live.refresh}})),b(t,n),E(t,[S(Q,{get children(){return`Submissions and side asks share one queue; permissions are checked again before work runs. You can leave this screen: accepted work continues while the host is online and authorized.`}}),C(()=>e.live.error(),()=>S(Q,{get children(){return`This is the last received queue view; live host status is not confirmed.`}})),(e=>C(e,()=>(e=>S(Q,{get children(){return`Last receipt ${e().submissionId} · ${e().status}${e().queuePosition===void 0?``:` · queue position ${e().queuePosition}`}`}}))(e)))(()=>I()),w(()=>B(),(e,t)=>S(Q,{get children(){return`${t()+1}. ${e().mode===`ask`?`Read-only side ask`:`Shared submission`} · ${e().status} · by ${Ee(e().actorId,!0)}`}}),e=>e.submissionId),w(()=>ce(),e=>S(Q,{get children(){return`${e().status} · ${e().mode===`ask`?`Side ask`:`Shared submission`} · by ${Ee(e().actorId,!0)}`}}),e=>e.submissionId)],n),t})()),S(ai,{get value(){return p()},onChange:e=>p.set(e),onSubmit:()=>void ve(),get busy(){return N.busy()},get disabled(){return!z()},get onStop(){return le()?ye:void 0},get stopping(){return P.busy()},get placeholder(){return z()?L()===`ask`?`Ask a side question without changing anything`:`Message the agent`:`Read-only`},get sendLabel(){return L()===`ask`?`Send side ask`:`Submit to session`},get hint(){return Me()},get tools(){return C(()=>ae()||z(),()=>[C(()=>ae(),()=>S(Xr,{title:`Send as`,get value(){return L()},onSelect:e=>f.set(e),get trigger(){return S(Ur,{testID:`composer-mode`,get icon(){return L()===`ask`?`message-question`:`users`},get label(){return L()===`ask`?`Side ask`:`Shared`}})},options:[{value:`write`,label:`Shared`,icon:`users`,hint:`Goes into the shared conversation; the agent can change the work`},{value:`ask`,label:`Side ask`,icon:`message-question`,hint:`A question on the side that doesn't change the work`}]})),C(()=>L()===`ask`&&de().length>0,()=>S(Xr,{title:`Side conversation`,get value(){return g()},onSelect:e=>g.set(e),get trigger(){return S(Ur,{get label(){return De()<0?`All my side asks`:`Side ask ${De()+1}`}})},get options(){return[{value:``,label:`All my side asks`},...de().map((e,t)=>({value:e.id,label:`Side ask ${t+1}`,hint:e.id.slice(0,8)}))]}})),C(()=>z(),()=>S(ii,{get host(){return e.host()},get value(){return d()},onChange:e=>d.set(e),get owner(){return l()},get showAccess(){return L()===`write`},get unsandboxed(){return oe()},data:r}))])}}),C(()=>we(),()=>S(Q,{testID:`draft-secret`,tone:`warning`,get children(){return`This message looks like it holds a secret. Everyone, you included, sees it as ${H} in the transcript, but the agent and its host receive it as typed.`}})),S(Kr,{get error(){return N.error()||P.error()||F.error()},get notice(){return F.notice()}})]),b(t,n),t})()]}function ma(e){let{user:t}=v(U),n=Fn(e.id),r=null,i=W(),a=()=>e.session.status===`error`||e.session.status===`provisioning`,o=()=>a()&&e.session.ownerId===t.id&&!!e.session.permissions?.includes(`manage`),s=()=>!!e.session.permissions?.includes(`write`);function c(){let t=n();r?.content!==t&&(r={content:t,id:fi()});let a=r.id;i.run(async()=>{let{api:n}=U();await n(`/api/sessions/${V(e.id)}/restart`,{method:`POST`});try{await n(`/api/sessions/${V(e.id)}/submit`,{method:`POST`,body:{content:t,requestId:a}})}catch(n){throw jn(e.id,t),e.recovered(),n}r=null,Nn(e.id,t),e.recovered()})}let l=()=>e.session.status===`error`?`This session didn't start`:e.session.status===`provisioning`?`This session is still starting`:`This session can't be reached`,d=()=>o()?`Send a message to start it again on its host. Your message runs once it's ready.`:a()?`Only the session owner can start it again.`:s()?`Messages can be sent once the host is back online.`:`The conversation appears once the host is back online.`;return[(()=>{let t=T(`scroll`);return k(t,`style`,{flex:1}),k(t,`contentStyle`,{flexGrow:1}),E(t,[S(Wr,{get icon(){return e.session.status===`error`?`alert`:e.session.status===`provisioning`?`clock`:`monitor`},get title(){return l()},get children(){return d()}}),C(()=>a()&&e.error,()=>S(Q,{center:!0,get children(){return e.error}}))]),t})(),(()=>{let e=T(`view`);return x(e,`style`,()=>({gap:8,paddingHorizontal:16,paddingTop:8,paddingBottom:m.desktop?12:Math.max(u().height,h().bottom,12),width:`100%`,maxWidth:800,alignSelf:`center`})),E(e,[S(ai,{get value(){return n()},onChange:e=>n.set(e),onSubmit:c,get busy(){return i.busy()},get disabled(){return!o()},get placeholder(){return o()?`Message the agent to start the session again`:`Message the agent`},get sendLabel(){return o()?`Restart and send`:`Sending is unavailable`},get hint(){return i.busy()?`Starting the session and preparing repositories...`:o()?`Restarts the session, then sends`:a()?`Only the owner can restart this session`:s()?`Waiting for the host`:`Read-only — submitting needs write permission`}}),S(Kr,{get error(){return i.error()}})]),e})()]}function ha(e){return(()=>{let e=T(`view`);return k(e,`testID`,`shared-session`),x(e,`style`,()=>({flex:1,paddingTop:h().top,backgroundColor:G().background})),E(e,S(Wr,{title:`Not here yet`,get children(){return`Shared sessions are still being moved to this app.`}})),e})()}const ga=()=>({borderWidth:1,borderRadius:q.medium,paddingHorizontal:12,height:40,fontSize:K.reading,backgroundColor:G().surface,borderColor:G().borderStrong,color:G().text,placeholderColor:G().faint});function _a(){let e=()=>Yn(),t=()=>{let t=e();return t.status===`signedOut`||t.status===`unreachable`?t.origin:``},n=W();return(()=>{let r=T(`view`);return x(r,`style`,()=>({flex:1,backgroundColor:G().background,paddingTop:h().top,paddingBottom:h().bottom})),E(r,(e=>C(e,()=>(e=>(()=>{let r=T(`view`);k(r,`style`,{flex:1,justifyContent:`center`,gap:16,padding:24,width:`100%`,maxWidth:480,alignSelf:`center`});let i=T(`text`);x(i,`style`,()=>({fontSize:26,fontWeight:`700`,color:G().text}));let a=j(`Can't reach Pikibun`);return b(i,a),b(r,i),E(r,S(ei,{size:44}),i),E(r,[S(Z,{tone:`warning`,get title(){return Un(t())},get children(){return e().error}}),S(X,{variant:`primary`,label:`Try again`,get disabled(){return n.busy()},onPress:()=>void sr()}),S(X,{variant:`ghost`,get label(){return n.busy()?`Signing out…`:`Sign out`},get disabled(){return n.busy()},onPress:()=>void n.run(mr)})]),r})())(e),()=>S(va,{})))(()=>e().status===`unreachable`?e():null)),r})()}function va(){let e=v(()=>{let e=Yn();return e.status===`signedOut`?e.origin:``}),t=_(e),n=_(!1),r=_(!1),i=_(``),a=_(``),o=_(``),s=W(),l=_(null),u=_(null),d=()=>Hn(t()),f=()=>{if(Vn)return e;let t=d();return`origin`in t?t.origin:null};c(()=>{let e=f();l.set(null),e!==null&&(Vn?fetch(`/api/health`).then(e=>e.json()):cr(e)).then(t=>{v(f)===e&&l.set(t)},()=>void 0)});let m=()=>{let e=Yn();return e.status===`signedOut`?e.notice:void 0};function h(){let e=f();e!==null&&s.run(async()=>{Vn?Or(`/api/auth/github`)||await p(`${e}/api/auth/github`):u.set(await lr(e))})}function g(e){let t=u();t&&t.isCallback(e)&&(u.set(null),s.run(()=>t.finish(e)))}return(()=>{let e=T(`scroll`);k(e,`style`,{flex:1}),k(e,`contentStyle`,{flexGrow:1,justifyContent:`center`,gap:14,padding:24,width:`100%`,maxWidth:420,alignSelf:`center`});let c=T(`view`);k(c,`style`,{gap:10,alignItems:`center`,paddingBottom:8});let p=T(`text`);x(p,`style`,()=>({fontSize:26,fontWeight:`700`,color:G().text,textAlign:`center`}));let _=j(`Sign in to Pikibun`);b(p,_);let v=T(`text`);x(v,`style`,()=>({fontSize:K.reading,lineHeight:22,color:G().muted,textAlign:`center`}));let y=j(`Run Pi agents on your own machines, and work on them together with your team.`);return b(v,y),b(c,p),b(c,v),E(c,S(ei,{size:56}),p),b(e,c),E(e,[(e=>C(e,()=>(e=>S(Z,{tone:`warning`,get children(){return e()}}))(e)))(()=>m()),(e=>C(e,()=>(e=>S(Z,{tone:`danger`,title:`Sign-in problem`,get children(){return e()}}))(e)))(()=>s.error()),C(()=>!Vn,()=>(()=>{let e=T(`view`);return k(e,`style`,{gap:6}),E(e,[S(Q,{get children(){return`Server`}}),C(()=>n(),()=>[(()=>{let e=T(`input`);return k(e,`testID`,`server-input`),x(e,`value`,()=>t()),k(e,`onChange`,e=>t.set(e.value)),k(e,`autoCapitalize`,`none`),k(e,`autoCorrect`,!1),k(e,`keyboardType`,`url`),k(e,`placeholder`,`https://pikibun.com`),k(e,`accessibilityLabel`,`Server address`),x(e,`style`,()=>ga()),e})(),(e=>C(e,()=>(e=>S(Q,{tone:`danger`,get children(){return e()}}))(e)))(()=>`error`in d()?d().error:null),S(Q,{get children(){return`For a self-hosted Pikibun, enter its address.`}})],()=>(()=>{let e=T(`view`);k(e,`style`,{flexDirection:`row`,alignItems:`center`,gap:8});let r=T(`text`);return x(r,`style`,()=>({flexShrink:1,numberOfLines:1,fontSize:16,fontWeight:`600`,color:G().text})),E(r,()=>f()?Un(f()):t()),b(e,r),E(e,S(X,{testID:`server-change`,small:!0,variant:`ghost`,label:`Change`,onPress:()=>n.set(!0)})),e})())]),e})()),S(X,{testID:`github-sign-in`,variant:`primary`,large:!0,block:!0,icon:`github`,label:`Continue with GitHub`,get busy(){return s.busy()&&!r()},get disabled(){return f()===null||s.busy()||l()?.githubConfigured===!1},onPress:h}),C(()=>Vn,()=>S(X,{testID:`browser-session-check`,block:!0,label:`I've signed in`,get disabled(){return s.busy()},onPress:()=>void s.run(async()=>{if(!await pr())throw Error(`This browser isn't signed in to Pikibun yet.`)})})),C(()=>Vn&&l()?.passwordAuth,()=>(()=>{let e=T(`view`);x(e,`style`,()=>({gap:8,borderTopWidth:1,paddingTop:12,borderColor:G().border}));let t=T(`input`);k(t,`testID`,`password-username`),x(t,`value`,()=>a()),k(t,`onChange`,e=>a.set(e.value)),k(t,`autoCapitalize`,`none`),k(t,`autoCorrect`,!1),k(t,`autoComplete`,`username`),k(t,`placeholder`,`Username`),k(t,`accessibilityLabel`,`Username`),x(t,`style`,()=>ga());let n=T(`input`);return k(n,`testID`,`password-password`),x(n,`value`,()=>o()),k(n,`onChange`,e=>o.set(e.value)),k(n,`masked`,!0),k(n,`autoComplete`,`current-password`),k(n,`placeholder`,`Password`),k(n,`accessibilityLabel`,`Password`),x(n,`style`,()=>ga()),k(n,`onSubmit`,()=>void s.run(()=>fr(a(),o()))),b(e,t),b(e,n),E(e,S(Q,{get children(){return`Or sign in with a username and password`}}),t),E(e,S(X,{testID:`password-sign-in`,block:!0,label:`Sign in`,get disabled(){return s.busy()||!a().trim()||!o()},onPress:()=>void s.run(()=>fr(a(),o()))})),e})()),S(Q,{center:!0,get children(){return`Model credentials stay on your host. GitHub tokens stay on the server, or go only to your own hosts when you push with your account.`}}),C(()=>!Vn&&l()?.testMode,()=>(()=>{let e=T(`view`);x(e,`style`,()=>({gap:8,borderTopWidth:1,paddingTop:12,borderColor:G().border}));let t=T(`view`);return k(t,`style`,{flexDirection:`row`}),E(t,S(X,{testID:`developer-toggle`,small:!0,variant:`ghost`,get icon(){return r()?`chevron-down`:`chevron-right`},label:`Developer sign-in`,onPress:()=>r.update(e=>!e)})),b(e,t),E(e,C(()=>r(),()=>[S(Q,{get children(){return`This server runs in test mode. Sign in with a token from its POST /api/auth/test.`}}),(()=>{let e=T(`input`);return k(e,`testID`,`developer-token`),x(e,`value`,()=>i()),k(e,`onChange`,e=>i.set(e.value)),k(e,`autoCapitalize`,`none`),k(e,`autoCorrect`,!1),k(e,`masked`,!0),k(e,`autoComplete`,`off`),k(e,`placeholder`,`Test-mode token`),k(e,`accessibilityLabel`,`Test-mode token`),x(e,`style`,()=>ga()),e})(),S(X,{testID:`developer-sign-in`,label:`Sign in with token`,icon:`lock`,get busy(){return s.busy()&&r()},get disabled(){return f()===null||!i().trim()||s.busy()},onPress:()=>void s.run(async()=>{try{await dr(f(),i())}catch(e){throw Error(`Developer sign-in failed: ${fe(e)}`)}})})])),e})()),S(Q,{center:!0,get children(){return Vn?`On the web this app uses the server's own browser sign-in.`:`Your sign-in is kept in this app's storage on this device (NSH has no Keychain or Keystore storage yet).`}}),S(N,{get open(){return u()!==null},onOpenChange:e=>{e.open||u.set(null)},get style(){return{flex:1,backgroundColor:G().background}},presentation:`pageSheet`,get children(){return(()=>{let e=T(`view`);k(e,`style`,{flex:1});let t=T(`view`);x(t,`style`,()=>({flexDirection:`row`,alignItems:`center`,gap:8,paddingHorizontal:16,minHeight:52,borderBottomWidth:1,borderColor:G().border}));let n=T(`text`);x(n,`style`,()=>({flex:1,fontSize:16,fontWeight:`600`,color:G().text}));let r=j(`Sign in with GitHub`);return b(n,r),b(t,n),E(t,S(X,{small:!0,variant:`ghost`,label:`Cancel`,onPress:()=>u.set(null)})),b(e,t),E(e,(e=>C(e,()=>(e=>(()=>{let t=T(`webview`);return x(t,`src`,()=>e().url),k(t,`style`,{flex:1}),k(t,`onNavigationStateChange`,e=>g(e.url)),t})())(e)))(()=>u())),e})()}})]),e})()}function ya(e){return(()=>{let t=T(`scroll`);return x(t,`testID`,()=>e.testID),k(t,`style`,{flex:1}),k(t,`contentStyle`,{gap:10,paddingHorizontal:24,paddingVertical:20,width:`100%`,maxWidth:680,alignSelf:`center`}),E(t,()=>e.children),t})()}function ba(e){return S(Wr,{icon:`clock`,title:`Coming to this app`,get children(){return`${e.what} isn't in this app yet.`}})}function xa(e){return(()=>{let t=T(`text`);return k(t,`role`,`header`),x(t,`style`,()=>({fontSize:13,fontWeight:`600`,marginTop:12,marginBottom:-2,color:G().muted})),E(t,()=>e.children),t})()}function Sa(e){let n=W(),r=()=>U().user;async function i(){let{origin:e}=U();await Zr({title:`Sign out?`,message:`This device signs out of ${Un(e)} and forgets its sign-in.`,confirmLabel:`Sign out`,destructive:!0})&&await mr()}return S(ya,{get children(){return[S(xa,{get children(){return`Account`}}),S(Hr,{get children(){return[S($,{label:`Name`,get children(){return S(Qr,{get children(){return r().displayName}})}}),(e=>C(e,()=>(e=>S($,{label:`GitHub`,get children(){return S(Qr,{get children(){return`@${e()}`}})}}))(e)))(()=>r().githubLogin),S($,{label:`User ID`,get children(){return(()=>{let e=T(`view`);return k(e,`style`,{flexDirection:`row`,flexWrap:`wrap`,alignItems:`center`,gap:8}),E(e,[S(Qr,{testID:`settings-user-id`,get children(){return Ft(r())}}),S(X,{small:!0,variant:`ghost`,icon:`copy`,label:`Copy`,onPress:()=>void n.run(()=>t.writeText(r().id),`User ID copied`)})]),e})()}}),S(Q,{get children(){return`Workspace owners add you with your user ID.`}})]}}),S(xa,{get children(){return`Server`}}),S(Hr,{get children(){return[S($,{label:`Address`,get children(){return S(Qr,{get children(){return U().origin||`This server`}})}}),S($,{label:`Status`,get children(){return S(Qr,{get children(){return U().expiresAt?`Signed in until ${ui(U().expiresAt)}`:`Signed in`}})}}),S(Q,{get children(){return Vn?`Signed in with this browser's session.`:`This device's sign-in. Review and revoke signed-in apps under Profile.`}})]}}),S(xa,{get children(){return`App`}}),S(Hr,{get children(){return[S($,{label:`Version`,get children(){return S(Qr,{get children(){return`Pikibun 0.1.0`}})}}),S($,{label:`Platform`,get children(){return S(Qr,{get children(){return`${m.os} ${m.version} · ${m.desktop?`desktop`:m.idiom}`}})}})]}}),S(Kr,{get error(){return n.error()},get notice(){return n.notice()}}),S(X,{testID:`sign-out`,variant:`danger`,block:!0,icon:`log-out`,label:`Sign out`,onPress:()=>void i()})]}})}const Ca=`pikibun.appearance`;async function wa(){let e=await r.getItem(Ca).catch(()=>null);(e===`light`||e===`dark`)&&g(e)}function Ta(e){let t=_(`system`);r.getItem(Ca).then(e=>{(e===`light`||e===`dark`)&&t.set(e)},()=>void 0);function n(e){t.set(e),g(e),(e===`system`?r.removeItem(Ca):r.setItem(Ca,e)).catch(()=>void 0)}return S(ya,{testID:`settings-appearance`,get children(){return[S(xa,{get children(){return`Appearance`}}),S(Hr,{get children(){return[S(Jr,{testID:`appearance-scheme`,get value(){return t()},onChange:n,options:[{value:`system`,label:`System`},{value:`light`,label:`Light`},{value:`dark`,label:`Dark`}]}),S(Q,{get children(){return`On this device. System follows its light or dark appearance.`}})]}})]}})}function Ea(e){return S(ya,{testID:`settings-admin`,get children(){return S(ba,{what:`Administration`})}})}function Da(e){return S(ya,{testID:`settings-hosts`,get children(){return S(ba,{what:`Host settings`})}})}function Oa(e){return S(ya,{testID:`settings-workspaces`,get children(){return S(ba,{what:`Workspace settings`})}})}const ka=[{id:`profile`,label:`Profile`,icon:`user`,Component:Sa},{id:`workspaces`,label:`Workspaces`,icon:`users`,Component:Oa},{id:`hosts`,label:`Hosts`,icon:`monitor`,Component:Da},{id:`appearance`,label:`Appearance`,icon:`contrast`,Component:Ta},{id:`admin`,label:`Administration`,icon:`shield-check`,admin:!0,Component:Ea}];function Aa(){let e=!!U().user.instanceAdmin;return ka.filter(t=>!t.admin||e)}function ja(e){let t=Aa();return t.find(t=>t.id===e)??t[0]}function Ma(e){return(()=>{let t=T(`view`);return k(t,`testID`,`settings-sections`),k(t,`style`,{gap:2,padding:8}),E(t,w(()=>Aa(),t=>S(M,{get testID(){return`settings-section-${t().id}`},get selected(){return e.selected===t().id},onPress:()=>e.onOpen(t().id),get style(){return{flexDirection:`row`,alignItems:`center`,gap:10,paddingHorizontal:10,height:e.selected===void 0?44:34,borderRadius:q.medium,backgroundColor:e.selected===t().id?G().selection:`transparent`}},get activeStyle(){return{backgroundColor:G().selection}},get hoverStyle(){return{backgroundColor:e.selected===t().id?G().selection:G().hover}},get children(){return[S(Y,{get name(){return t().icon},size:16,get color(){return e.selected===t().id?G().text:G().muted}}),(()=>{let n=T(`text`);return x(n,`style`,()=>({flex:1,fontSize:e.selected===void 0?K.reading:K.body,fontWeight:`500`,color:G().text})),E(n,()=>t().label),n})(),C(()=>e.selected===void 0,()=>S(Y,{name:`chevron-right`,size:16,get color(){return G().faint}}))]}}),e=>e.id)),t})()}function Na(){Er(),wa(),sr();let e=()=>Yn().status===`signedIn`,t=()=>{let e=Tr();return e.name===`shared`?e.token:null};return(()=>{let n=T(`view`);return x(n,`style`,()=>({flex:1,backgroundColor:G().background})),E(n,(t=>C(t,()=>(e=>w(()=>[e()],e=>S(ha,{get token(){return e()}}),e=>e))(t),()=>C(()=>Yn().status!==`loading`,()=>C(()=>e(),()=>S(Pa,{}),()=>S(_a,{})),()=>S(Gr,{}))))(()=>t())),n})()}function Pa(){let e=yr(),t=L([{name:`sessions`}]),n=0,r=o(()=>{let e=y().width;return e>0&&(n=e),n}),i=()=>r()>=700,a=_(null),s=_(void 0),l=_(0),u=_({});function d(e){i()?(a.set(e),t.popToRoot()):t.push({name:`session`,id:e})}function f(e){i()?(t.popToRoot(),a.set(e)):t.replace({name:`session`,id:e})}function p(e){i()?(t.popToRoot(),s.set(e),a.set(null),l.update(e=>e+1)):t.push({name:`new`,...e?{workspaceId:e}:{}})}function m(e,n){let r=v(t.routes).at(-1);i()?(u.set({...e?{section:e}:{},...n?{id:n}:{}}),r?.name!==`settings`&&t.push({name:`settings`})):e?(r?.name!==`settings`&&t.push({name:`settings`}),t.push({name:`settings-section`,section:e,...n?{id:n}:{}})):t.push({name:`settings`})}function h(e){switch(e.name){case`home`:t.popToRoot();break;case`session`:t.popToRoot(),d(e.sessionId);break;case`new`:t.popToRoot(),p(e.workspaceId);break;case`settings`:t.popToRoot(),m(e.section,e.id);break;case`join`:t.popToRoot(),t.push({name:`join`,token:e.token})}}c(()=>{let e=Tr();v(()=>h(e))}),c(()=>{let e=t.routes().at(-1),n=a(),r=u();v(()=>{if(e)switch(e.name){case`session`:return Dr({name:`session`,sessionId:e.id});case`sessions`:return Dr(n&&i()?{name:`session`,sessionId:n}:{name:`home`});case`new`:return Dr(e.workspaceId?{name:`new`,workspaceId:e.workspaceId}:{name:`home`});case`settings`:return Dr(i()?{name:`settings`,...r}:{name:`settings`});case`settings-section`:return Dr({name:`settings`,section:e.section,...e.id?{id:e.id}:{}});case`join`:return Dr({name:`join`,token:e.token});default:return Dr({name:`home`})}})}),c(()=>{let e=i();v(()=>{let n=t.routes()[t.routes().length-1];if(!e&&a()){let e=a();a.set(null),t.push({name:`session`,id:e})}else e&&n?.name===`session`?(t.popToRoot(),a.set(n.id)):e&&n?.name===`new`&&(t.popToRoot(),s.set(n.workspaceId),a.set(null))})});let g=()=>t.pop(),D=()=>(()=>{let e=T(`view`);return k(e,`style`,{flexDirection:`row`,alignItems:`center`,gap:2}),E(e,[S(zr,{testID:`open-by-id`,icon:`hash`,label:`Open a session by ID`,onPress:()=>t.push({name:`open`})}),S(zr,{testID:`new-session`,icon:`compose`,label:`New session`,onPress:()=>p(),active:!0})]),e})(),A=()=>S(zr,{testID:`open-settings`,icon:`settings`,label:`Settings`,onPress:()=>m()});return S(vr.Provider,{value:e,get children(){return S(te,{state:t,style:{flex:1},testID:`nav`,get children(){return e=>{switch(e.name){case`sessions`:return C(()=>i(),()=>S(I,{title:`Pikibun`,headerVisible:!1,get header(){return vi?T(`view`):void 0},get style(){return yi()},get children(){return(()=>{let e=T(`view`);k(e,`style`,{flex:1,flexDirection:`row`});let n=T(`view`);return x(n,`style`,()=>({flex:1,backgroundColor:G().background})),E(n,C(()=>a(),()=>w(()=>a()?[a()]:[],e=>S(da,{get id(){return e()},page:!1,openSession:d,go:h}),e=>e),()=>w(()=>[l()],()=>S(hi,{home:!0,get workspaceId(){return v(s)},onStarted:f}),e=>String(e)))),b(e,n),E(e,S(Ia,{get selectedId(){return a()},get home(){return!a()},onOpen:d,onNew:()=>p(),onOpenById:()=>t.push({name:`open`}),onSettings:()=>m()}),n),e})()}}),()=>S(I,O({title:`Sessions`},bi({title:`Sessions`,leading:vi?S(ei,{size:22}):A(),actions:vi?[()=>D(),()=>A()]:D()}),{get children(){return S(Oi,{onOpen:d,onNew:()=>p()})}})));case`session`:return S(da,{get id(){return e.id},page:!0,openSession:d,onBack:g,go:h});case`new`:return S(I,O({title:`New session`},bi({title:`New session`,onBack:g}),{get children(){return S(hi,{get workspaceId(){return e.workspaceId},onStarted:f})}}));case`open`:return S(I,O({title:`Open a session`},bi({title:`Open a session`,onBack:g}),{get children(){return S(_i,{onOpen:f})}}));case`settings`:return S(I,O({title:`Settings`},bi({title:`Settings`,onBack:g}),{get children(){return S(La,{get section(){return u().section},get id(){return u().id},get wide(){return i()},onOpen:e=>m(e),go:h})}}));case`settings-section`:{let t=ja(e.section);return S(I,O({get title(){return t.label}},bi({title:t.label,onBack:g}),{get children(){return S(t.Component,{get id(){return e.id},go:h})}}))}case`join`:return S(I,O({title:`Join a workspace`},bi({title:`Join a workspace`,onBack:g}),{get children(){return S(ti,{get token(){return e.token},onDone:()=>t.popToRoot()})}}))}}}})}})}function Fa(e){return S(M,{get testID(){return e.testID},get accessibilityLabel(){return e.label},get selected(){return e.active},get onPress(){return e.onPress},get style(){return{flexDirection:`row`,alignItems:`center`,gap:10,paddingHorizontal:10,height:34,borderRadius:q.medium,backgroundColor:e.active?G().selection:`transparent`}},get hoverStyle(){return{backgroundColor:e.active?G().selection:G().hover}},activeStyle:{opacity:.7},get children(){return[S(Y,{get name(){return e.icon},size:16,get color(){return G().text}}),(()=>{let t=T(`text`);return x(t,`style`,()=>({flex:1,fontSize:K.body,fontWeight:`500`,color:G().text})),E(t,()=>e.label),t})()]}})}function Ia(e){let t=()=>U().user;return(()=>{let n=T(`view`);k(n,`testID`,`sidebar`),x(n,`style`,()=>({width:280,paddingTop:h().top,backgroundColor:G().sidebar,borderRightWidth:1,borderColor:G().border}));let r=T(`view`);k(r,`desktop`,{windowDrag:!0}),k(r,`style`,{flexDirection:`row`,alignItems:`center`,gap:8,height:52,paddingLeft:16,paddingRight:8});let i=T(`text`);x(i,`style`,()=>({flex:1,fontSize:K.title,fontWeight:`700`,color:G().text}));let a=j(`Pikibun`);b(i,a),b(r,i),E(r,S(ei,{size:22}),i),E(r,S(zr,{testID:`open-by-id`,icon:`hash`,label:`Open a session by ID`,get onPress(){return e.onOpenById}}));let o=T(`view`);k(o,`style`,{paddingHorizontal:8,paddingBottom:8}),E(o,S(Fa,{testID:`new-session`,icon:`compose`,label:`New session`,get active(){return e.home},get onPress(){return e.onNew}}));let s=T(`view`);return x(s,`style`,()=>({borderTopWidth:1,borderColor:G().border,padding:8,paddingBottom:Math.max(8,h().bottom)})),E(s,S(M,{testID:`open-settings`,accessibilityLabel:`Settings`,get onPress(){return e.onSettings},get style(){return{flexDirection:`row`,alignItems:`center`,gap:10,paddingHorizontal:8,height:42,borderRadius:q.medium}},get hoverStyle(){return{backgroundColor:G().hover}},activeStyle:{opacity:.7},get children(){return[S($r,{get name(){return t().displayName||t().githubLogin||`?`},size:26}),(()=>{let e=T(`view`);k(e,`style`,{flex:1,gap:1});let n=T(`text`);return x(n,`style`,()=>({fontSize:K.body,fontWeight:`500`,color:G().text,numberOfLines:1})),E(n,()=>t().displayName||t().githubLogin),b(e,n),E(e,(e=>C(e,()=>(e=>(()=>{let t=T(`text`);return x(t,`style`,()=>({fontSize:K.caption,color:G().muted,numberOfLines:1})),E(t,()=>`@${e()}`),t})())(e)))(()=>t().githubLogin)),e})(),S(Y,{name:`settings`,size:16,get color(){return G().muted}})]}})),b(n,r),b(n,o),b(n,s),E(n,S(Oi,{compact:!0,get selectedId(){return e.selectedId},get onOpen(){return e.onOpen},get onNew(){return e.onNew}}),s),n})()}function La(e){let t=()=>ja(e.section);return C(()=>e.wide,()=>(()=>{let n=T(`view`);k(n,`style`,{flex:1,flexDirection:`row`});let r=T(`view`);x(r,`style`,()=>({width:240,borderRightWidth:1,borderColor:G().border,backgroundColor:G().sidebar})),E(r,S(Ma,{get selected(){return t().id},get onOpen(){return e.onOpen}}));let i=T(`view`);return k(i,`style`,{flex:1}),E(i,w(()=>[`${t().id}\u0000${e.id??``}`],()=>{let n=v(t);return S(n.Component,{get id(){return v(()=>e.id)},get go(){return e.go}})},e=>e)),b(n,r),b(n,i),n})(),()=>S(Ma,{get onOpen(){return e.onOpen}}))}f(Na);
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e,t,n){let r=String(e);if(t&&(r+=`\n//# sourceURL=${t}`),n){let e=new TextEncoder().encode(n),t=``;for(let n=0;n<e.length;n+=32768)t+=String.fromCharCode(...e.subarray(n,n+32768));r+=`\n//# sourceMappingURL=data:application/json;base64,${btoa(t)}`}return URL.createObjectURL(new Blob([r],{type:`text/javascript`}))}export function createBrowserHost(t){let n,r=!1;return{bind(e){return Object.fromEntries(Object.entries(e).map(([t,r])=>[t,typeof r==`function`&&t!==`nsh_browser_trace`?(...t)=>{let i=n;return i?.values?i.values.boundary(()=>r(...t),()=>e.nsh_browser_trace()):r(...t)}:r]))},imports:{value:(...e)=>{if(!n)throw Error(`the browser host was not initialized`);return n.imports.value(...e)}},async run(e,{appId:i=``,capabilities:a=``,imports:o={},chunks:s={},nativeExports:c={}}={},l=[]){if(n?.stopping)throw Error(`cannot start an app during disposal`);let[u,ee]=t.reset(),d,f=!0,p,m,h,g,_,v,y,b=[],x=[...l],S=()=>f,C=(e,n)=>{if(!S())throw Error(`the app was disposed`);return d.boundary(()=>d.with([n],([n])=>d.result(t.wasm.nsh_browser_call(e,n))),d.trace)},w=()=>{S()&&t.requestPump()},T=e=>{try{t.showError(e?.stack??String(e))}catch{console.error(e)}},E=[],D=n={values:null,imports:null,hot:null,importModule:null,stopping:!1,stop(){if(!f||D.stopping)return;D.stopping=!0,y?.(Error(`the app was disposed`)),y=null;let e=[];for(let t of E)try{t()}catch(t){e.push(t)}f=!1,d?.dispose(),v?.remove();for(let e of x)URL.revokeObjectURL(e);for(let t of e)T(t)}};try{v=document.createElement(`iframe`),v.hidden=!0,v.setAttribute(`aria-hidden`,`true`),t.container.append(v);let l=v.contentWindow,f;try{f=l.document}catch{if(r)throw Error(`this page has an opaque origin and runs one app; reload it to run another`);r=!0,v.remove(),v=null,l=window,f=document}if(v){let e=f.createElement(`base`);e.href=document.baseURI,f.head.append(e)}let __nshEarlyMap=null;if(v){__nshEarlyMap=Object.assign({},o);let X0=new URL(e,document.baseURI),Z0=X0.protocol==="blob:"?new URL(document.baseURI):X0;Z0===X0&&(__nshEarlyMap[new URL("bundle.js",X0).href]=X0.href);for(let[k0,u0]of Object.entries(s))__nshEarlyMap[new URL(k0,Z0).href]=new URL(u0,document.baseURI).href;for(let[k0,n0]of Object.entries(c)){let K0=JSON.stringify(k0),L0=["const host=globalThis.__nsh_browser_realm.modules;"],W0=[];n0.forEach((m0,j0)=>{let N0=JSON.stringify(m0);L0.push("let l"+j0+"=host.get("+K0+")["+N0+"];export{l"+j0+" as "+N0+"};"),W0.push("l"+j0+"=host.get("+K0+")["+N0+"];")}),W0.length&&L0.push("globalThis.__nsh_browser_realm.watch(()=>{"+W0.join("")+"});");let B0=URL.createObjectURL(new Blob([L0.join("\n")],{type:"text/javascript"}));x.push(B0),__nshEarlyMap[k0]=B0}let Q0=f.createElement("script");Q0.type="importmap",Q0.textContent=JSON.stringify({imports:__nshEarlyMap}),f.head.append(Q0)}let O=await new Promise((e,t)=>{y=t,Object.defineProperty(l,"__nsh_browser_bootstrap",{value:e,configurable:!0});let n=f.createElement(`script`);n.type=`module`,n.src=new URL(`./bootstrap.js`,import.meta.url).href,n.onerror=()=>t(Error(`could not load the browser facade`)),f.head.append(n)});if(!S())throw Error(`the app was disposed`);y=null,delete l.__nsh_browser_bootstrap;let{Values:k,createReactive:A,createModules:te,createDom:ne,createComponents:re,createGestures:ie,createCanvas:ae,createAnimation:oe,createNavigation:j,createKeymap:M,createEnvironment:N,createHost:P,createStandard:F,createResource:I,createLists:L,configureAPIs:R,createHot:z}=O;d=new k,d.trace=()=>t.wasm.nsh_browser_trace(),d.report=T,n.values=d,n.imports=d.imports(()=>t.wasm.memory),t.wasm.nsh_browser_initialize();let B=A(C,S,d),V=ne(C,d,B,S,w),H=D.hot=z(B,T);V.setHot(H);let U=N(B,C,V);V.setPlatform(U.api.platform);let W=ie(C,d,B,V,S,w);V.setTouches(W),V.rt.setup=U.setup,V.rt.font=(e,t)=>C(404,[e,t]),E.push(()=>V.dispose(),()=>p?.dispose(),()=>_?.dispose(),()=>h?.dispose(),()=>t.wasm.nsh_stop(),()=>t.wasm.nsh_browser_dispose()),C(400,[(e,t)=>{if(S())switch(e){case`hostEvent`:_?.event(...t);break;case`hostReply`:_?.reply(...t);break;case`bindList`:g?.bind(...t);break;case`event`:V.event(...t);break;case`reply`:p?.reply(...t);break;case`component`:m.component(...t);break;case`children`:m.children(...t);break;case`render`:m.render(...t);break;case`unrender`:m.unrender(...t);break;case`environment`:U.update(t[0]);break;case`tokens`:U.changedTokens();break;case`animationsFinished`:h?.finished(t[0]);break;case`registry`:p?.refresh();for(let e of b)e();break;default:throw Error(`browser host event is not implemented: ${e}`)}}]),C(401,[i,a]),t.begin(u,e=>{t.withStrings([e],(e,n)=>t.wasm.nsh_environment(e,n));let n=t.wasm.nsh_browser_start(u,ee,+!!t.dark,devicePixelRatio||1);if(n===-2)throw Error(`browser engine startup failed`);return n},!0),O.installTesting(l,C,{active:S,wake:w,network:!!t.testing}),g=L(C,d,B,V,S,w),V.rt.list=g.render,m=re(C,d,B,V),p=te(C,d,S,w,m.make);for(let e of Object.keys(c))p.exports.has(e)||p.exports.set(e,Object.create(null));V.setMeasure(e=>p.measure(e)),h=oe(C,S,w,U);let G=p.exports.get(`nsh`)??{},se=ae(C,B,V,S,w);Object.assign(G,h.api,se,{PanResponder:W.PanResponder}),Object.assign(G,B,U.api,{List:g.render,mount:V.mount,resource:I(C,B,S,w),keymap:M(C,B,V,U.api.platform,w,H)}),_=P(C,B,V,U,S,G.host),G.host=_.host,R(G,p,V,S,U);let K=p.exports.get(`nsh/base`);K&&Object.assign(K,j(B,V,U,h.api));let q=new Map([...p.exports,...F(C,S)]),J=q.get(`nsh/mobile`)??{};J.isAvailable=!1,q.set(`nsh/mobile`,J),q.set(`nsh/android`,{...J,isAvailable:!1}),q.set(`nsh/ios`,{...J,isAvailable:!1}),q.set(`nsh`,G),q.set(`nsh:rt`,V.rt),q.set(`nsh:hot`,{get hot(){return Object.hasOwn(l,`__nsh_hot`)||Object.defineProperty(l,"__nsh_hot",{value:H.hot,configurable:!0}),H.hot}}),q.set(`nsh/device`,Object.fromEntries([`windowSize`,`colorScheme`,`setColorScheme`,`fontScale`,`pixelRatio`,`locale`,`platform`].map(e=>[e,G[e]]))),q.set(`nsh/accessibility`,{reduceMotion:G.reduceMotion,screenReaderEnabled:G.screenReaderEnabled}),q.set(`nsh/host`,{host:G.host}),q.set(`nsh/native`,{nativeComponent:G.nativeComponent,nativeModule:G.nativeModule}),q.set(`nsh/keymap`,{keymap:G.keymap}),q.set(`nsh/animated`,h.api),q.set(`nsh/gesture`,{PanResponder:W.PanResponder});let Y={...o},X=new URL(e,document.baseURI),Z=X.protocol===`blob:`?new URL(document.baseURI):X;Z===X&&(Y[new URL(`bundle.js`,X).href]=X.href);for(let[e,t]of Object.entries(s))Y[new URL(e,Z).href]=new URL(t,document.baseURI).href;for(let[e,t]of q){let n=Object.keys(t),r=(c[e]??[]).filter(e=>!Object.hasOwn(t,e)),i=n.map((t,n)=>t==="default"?`export default host.get(${JSON.stringify(e)})["default"];`:`const e${n}=host.get(${JSON.stringify(e)})[${JSON.stringify(t)}];export{e${n} as ${JSON.stringify(t)}};`),a=r.map((t,n)=>(i.push(`let l${n}=host.get(${JSON.stringify(e)})[${JSON.stringify(t)}];export{l${n} as ${JSON.stringify(t)}};`),`l${n}=host.get(${JSON.stringify(e)})[${JSON.stringify(t)}];`));a.length&&i.push(`globalThis.__nsh_browser_realm.watch(()=>{${a.join(``)}});`);let o=`const host=globalThis.__nsh_browser_realm.modules;\n${i.join(`
|
|
2
|
+
`)}`,s=URL.createObjectURL(new Blob([o],{type:`text/javascript`}));x.push(s),Y[e]=s}if(!__nshEarlyMap){let Q=f.createElement(`script`);Q.type=`importmap`,Q.textContent=JSON.stringify({imports:Y}),f.head.append(Q);}let ce=new Promise((e,n)=>{y=n,Object.defineProperty(l,"__nsh_browser_realm",{value:Object.freeze({entry:X.href,base:Z.href,modules:q,watch:e=>{b.push(e)},setImporter:e=>{D.importModule=e},live:S,prepareChunk:e=>t.options.prepareChunk?.(e),ready:e,failed:n})})}),$=f.createElement(`script`);if($.type=`module`,$.src=new URL(`./realm.js`,import.meta.url).href,$.onerror=()=>y?.(Error(`could not load the app realm`)),f.head.append($),await ce,!S())throw Error(`the app was disposed`);y=null,t.startedApp(),w()}catch(e){throw S()&&(T(e),t.hostEvents=null),D.stop(),n===D&&(n=null),e}},runSource(t,{name:n=``,sourceMap:r=``,...i}={}){let a=e(t,n,r);return this.run(a,i,[a])},async hotUpdate(r,i,a){let o=n;if(!o?.hot?.started||!o.importModule||o.stopping)return!1;let s=e(r,i,a);try{return await o.hot.apply(()=>o.importModule(s))&&n===o&&!o.stopping}finally{URL.revokeObjectURL(s),n===o&&!o.stopping&&t.requestPump()}},stop(){let e=n;e?.stop(),n===e&&(n=null)}}}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// The page's host (nsh.json `web.host`), on the web only: the address the client is opened at and where it goes. Links
|
|
2
|
+
// into the app keep the routes the web app had, in the fragment (#/s/<id>, #/settings/hosts, #/shared/<token>,
|
|
3
|
+
// #/join/<token>), so a share or invite token never reaches the server; sign-in goes to the server's own pages.
|
|
4
|
+
// Native Shell copies this module as it is into the site (host.<digest>.js) and runs createHost before the app starts.
|
|
5
|
+
|
|
6
|
+
const page = typeof location !== "undefined" && typeof history !== "undefined";
|
|
7
|
+
|
|
8
|
+
/** The fragment, or "" where there is no page (nsh test runs this module headless too). */
|
|
9
|
+
const route = () => (page ? location.hash : "");
|
|
10
|
+
|
|
11
|
+
/** The address the app last showed: where it is now. */
|
|
12
|
+
let shown = null;
|
|
13
|
+
/** How many of Native Shell's pages were open over the first, as the history entry the page is on says. */
|
|
14
|
+
const depthOf = state => (typeof state?.nsh === "number" ? state.nsh : 0);
|
|
15
|
+
let depth = 0;
|
|
16
|
+
/** When Back or Forward moved between Native Shell's pages, until its hashchange comes (0: none pending). */
|
|
17
|
+
let traversedAt = 0;
|
|
18
|
+
|
|
19
|
+
const functions = new Map([
|
|
20
|
+
["page.route", () => route()],
|
|
21
|
+
// Shows the app's route in the address bar without a history entry of its own: Native Shell keeps the entries of
|
|
22
|
+
// its pages and dialogs, whose state stays as it is.
|
|
23
|
+
["page.setRoute", args => {
|
|
24
|
+
const hash = typeof args?.hash === "string" && /^#\/[^\s]*$/.test(args.hash) ? args.hash : "#/";
|
|
25
|
+
shown = hash;
|
|
26
|
+
// Marks the entry as one the app has been on (Native Shell's entries copy the state of the one they're pushed from),
|
|
27
|
+
// so Back to it later isn't mistaken for a link just followed.
|
|
28
|
+
if (page && (location.hash !== hash || !history.state?.pikibun)) history.replaceState({ ...(history.state ?? {}), pikibun: true }, "", hash);
|
|
29
|
+
return null;
|
|
30
|
+
}],
|
|
31
|
+
// Only this server's own pages (/api/auth/github, say), never another site's.
|
|
32
|
+
["page.open", args => {
|
|
33
|
+
const path = args?.path;
|
|
34
|
+
if (typeof path !== "string" || !path.startsWith("/") || path.startsWith("//") || path.includes("\\")) throw new Error("Only this server's own paths open.");
|
|
35
|
+
if (page) location.assign(path);
|
|
36
|
+
return null;
|
|
37
|
+
}],
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
export async function createHost(player) {
|
|
41
|
+
if (page && typeof addEventListener === "function") {
|
|
42
|
+
// Native Shell pushes and pops its pages' history entries on its own time, after the app has shown the new page's
|
|
43
|
+
// address, so an entry can hold another page's address. Back or Forward to an entry of another of its pages (from
|
|
44
|
+
// the app's Back or the browser's) is Native Shell's to follow: the entry gets the app's address back rather than
|
|
45
|
+
// being taken as a link, which reopened the page just left (Settings, Back, Settings again), and the app then shows
|
|
46
|
+
// where it went. Anything else goes where the entry points, as it always did: a link followed or an address typed
|
|
47
|
+
// (a new entry, without state), and Back or Forward between entries of the same page (two addresses typed one after
|
|
48
|
+
// the other). The depth of the page an entry is of is followed through Native Shell's own calls.
|
|
49
|
+
depth = depthOf(history.state);
|
|
50
|
+
for (const name of ["pushState", "replaceState"]) {
|
|
51
|
+
const original = history[name].bind(history);
|
|
52
|
+
history[name] = (state, unused, url) => {
|
|
53
|
+
original(state, unused, url);
|
|
54
|
+
depth = depthOf(state);
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
addEventListener("popstate", event => {
|
|
58
|
+
const left = depth;
|
|
59
|
+
depth = depthOf(event.state);
|
|
60
|
+
const known = Boolean(event.state?.pikibun || event.state?.nshSession);
|
|
61
|
+
const between = known && depth !== left;
|
|
62
|
+
// A move that leaves the address as it is has no hashchange to come: the mark lapses rather than swallow a link.
|
|
63
|
+
traversedAt = between ? Date.now() : 0;
|
|
64
|
+
if (between && shown && location.hash !== shown) history.replaceState(history.state, "", shown);
|
|
65
|
+
});
|
|
66
|
+
addEventListener("hashchange", () => {
|
|
67
|
+
const traversed = traversedAt && Date.now() - traversedAt < 1000;
|
|
68
|
+
traversedAt = 0;
|
|
69
|
+
if (traversed) return;
|
|
70
|
+
player.hostEvent("page.route", route());
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
call(name, args) {
|
|
75
|
+
const fn = functions.get(name);
|
|
76
|
+
if (!fn) throw new Error(`No host function ${name}.`);
|
|
77
|
+
return fn(args);
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
Binary file
|
|
Binary file
|
package/dist/web/index.html
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
<link rel="manifest" href="manifest.webmanifest">
|
|
11
11
|
<link rel="icon" type="image/png" sizes="32x32" href="icons/32.caf706bbd1.png">
|
|
12
12
|
<link rel="apple-touch-icon" href="icons/180.c8c643a608.png">
|
|
13
|
-
<script>const fetches = new Map(["nsh.5be0579ad8.wasm","app.
|
|
13
|
+
<script>const fetches = new Map(["nsh.5be0579ad8.wasm","app.eb3752a36c.js"].map((url) => { const response = fetch(url); response.catch(() => {}); return [url, response]; }));</script>
|
|
14
14
|
<style>
|
|
15
15
|
html, body { margin: 0; height: 100%; overflow: hidden; }
|
|
16
16
|
html, body { background: #ffffff; color: #1c1c1e; }
|
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
// root. The page's host (`app.host`, nsh.json `web.host`) answers the
|
|
45
45
|
// app's `nsh/host` calls: its `createHost(player)` runs once the player
|
|
46
46
|
// exists, before the app starts, so no call comes earlier.
|
|
47
|
-
import { createPlayer } from "./nsh.
|
|
47
|
+
import { createPlayer } from "./nsh.6b31ba26e0.js";
|
|
48
48
|
|
|
49
|
-
const app = {"id":"com.pikibun.app","wasm":"nsh.5be0579ad8.wasm","code":"app.
|
|
49
|
+
const app = {"id":"com.pikibun.app","wasm":"nsh.5be0579ad8.wasm","code":"app.eb3752a36c.js","capabilities":"{\"network\":{\"hosts\":[\"*\"],\"http\":[]},\"process\":{\"execute\":[],\"exit\":false,\"env\":[]},\"fs\":{\"read\":[],\"write\":[]},\"webview\":{\"hosts\":[\"*\"]},\"statusBar\":true,\"clipboard\":true,\"picker\":true,\"host\":[\"page.*\"],\"openUrl\":true}","rust":false,"assets":{"src/assets/logo.png":"assets/src/assets/logo.5872d6d67c.png"},"data":{"syntaxes":"nsh-syntaxes.ea0da56d04.bin","math":"nsh-math.cc869361ca.bin"},"fonts":[],"chunkFonts":{},"chunks":{},"sides":{"nsh_feature_math":{"url":"nsh-math.7ad3060fbc.wasm","needs":[],"gate":"nsh_feature_math","onDemand":true}},"chunkSides":{},"nativeExports":{"nsh":["Canvas","Clipboard","Path2D","Storage","cleanup","colorScheme","computed","context","effect","host","keyboardFrame","lifecycle","mount","openUrl","platform","safeArea","setColorScheme","signal","untracked","windowSize"],"nsh/base":["AlertDialog","Button","Dialog","Menu","MenuItem","NavPage","NavStack","Sheet","Switch","TextView","Tooltip","createNavStack"],"nsh:rt":["append","bindProp","component","cond","each","element","insert","list","merge","prop","ref","text"]},"entryChunks":[],"host":"host.19652b6282.js"};
|
|
50
50
|
const status = document.getElementById("status");
|
|
51
51
|
const fonts = new Map();
|
|
52
52
|
let player;
|
package/dist/web/index.html.br
CHANGED
|
Binary file
|
package/dist/web/index.html.gz
CHANGED
|
Binary file
|