pikibun 0.22.0 → 0.24.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.
Files changed (115) hide show
  1. package/README.md +2 -8
  2. package/dist/chunks/{chunk-KOZ2NZL7.js → chunk-XNVA5UWA.js} +7328 -1796
  3. package/dist/chunks/{cli-OGQRYOKN.js → cli-L6ODIDYQ.js} +13272 -13060
  4. package/dist/cli.js +10 -9
  5. package/dist/migrations/postgres/0044_host_browser.sql +6 -0
  6. package/dist/migrations/postgres/0045_connector_version.sql +6 -0
  7. package/dist/migrations/postgres/0046_session_tunnels.sql +12 -0
  8. package/dist/migrations/postgres/0047_native_page_callback.sql +4 -0
  9. package/dist/migrations/sqlite/0051_host_browser.sql +4 -0
  10. package/dist/migrations/sqlite/0052_connector_version.sql +4 -0
  11. package/dist/migrations/sqlite/0053_session_tunnels.sql +10 -0
  12. package/dist/migrations/sqlite/0054_native_page_callback.sql +4 -0
  13. package/dist/web/app.1d48db9d4c.js +12 -0
  14. package/dist/web/app.1d48db9d4c.js.br +0 -0
  15. package/dist/web/app.1d48db9d4c.js.gz +0 -0
  16. package/dist/web/browser.991ab24c49/LICENSES.txt +83 -0
  17. package/dist/web/browser.991ab24c49/LICENSES.txt.br +0 -0
  18. package/dist/web/browser.991ab24c49/LICENSES.txt.gz +0 -0
  19. package/dist/web/browser.991ab24c49/animation.js +1 -0
  20. package/dist/web/browser.991ab24c49/animation.js.br +0 -0
  21. package/dist/web/browser.991ab24c49/animation.js.gz +0 -0
  22. package/dist/web/browser.991ab24c49/bootstrap.js +1 -0
  23. package/dist/web/browser.991ab24c49/buffer.js +1 -0
  24. package/dist/web/browser.991ab24c49/buffer.js.br +0 -0
  25. package/dist/web/browser.991ab24c49/buffer.js.gz +0 -0
  26. package/dist/web/browser.991ab24c49/canvas.js +1 -0
  27. package/dist/web/browser.991ab24c49/canvas.js.br +0 -0
  28. package/dist/web/browser.991ab24c49/canvas.js.gz +0 -0
  29. package/dist/web/browser.991ab24c49/components.js +1 -0
  30. package/dist/web/browser.991ab24c49/components.js.br +0 -0
  31. package/dist/web/browser.991ab24c49/components.js.gz +0 -0
  32. package/dist/web/browser.991ab24c49/dom.js +1 -0
  33. package/dist/web/browser.991ab24c49/dom.js.br +0 -0
  34. package/dist/web/browser.991ab24c49/dom.js.gz +0 -0
  35. package/dist/web/browser.991ab24c49/environment.js +1 -0
  36. package/dist/web/browser.991ab24c49/environment.js.br +0 -0
  37. package/dist/web/browser.991ab24c49/environment.js.gz +0 -0
  38. package/dist/web/browser.991ab24c49/gesture.js +1 -0
  39. package/dist/web/browser.991ab24c49/gesture.js.br +0 -0
  40. package/dist/web/browser.991ab24c49/gesture.js.gz +0 -0
  41. package/dist/web/browser.991ab24c49/host.js +1 -0
  42. package/dist/web/browser.991ab24c49/host.js.br +0 -0
  43. package/dist/web/browser.991ab24c49/host.js.gz +0 -0
  44. package/dist/web/browser.991ab24c49/hot.js +1 -0
  45. package/dist/web/browser.991ab24c49/hot.js.br +0 -0
  46. package/dist/web/browser.991ab24c49/hot.js.gz +0 -0
  47. package/dist/web/browser.991ab24c49/keymap.js +1 -0
  48. package/dist/web/browser.991ab24c49/keymap.js.br +0 -0
  49. package/dist/web/browser.991ab24c49/keymap.js.gz +0 -0
  50. package/dist/web/browser.991ab24c49/list.js +1 -0
  51. package/dist/web/browser.991ab24c49/list.js.br +0 -0
  52. package/dist/web/browser.991ab24c49/list.js.gz +0 -0
  53. package/dist/web/browser.991ab24c49/loader.js +1 -0
  54. package/dist/web/browser.991ab24c49/modules.js +1 -0
  55. package/dist/web/browser.991ab24c49/modules.js.br +0 -0
  56. package/dist/web/browser.991ab24c49/modules.js.gz +0 -0
  57. package/dist/web/browser.991ab24c49/navigation.js +1 -0
  58. package/dist/web/browser.991ab24c49/navigation.js.br +0 -0
  59. package/dist/web/browser.991ab24c49/navigation.js.gz +0 -0
  60. package/dist/web/browser.991ab24c49/path.js +1 -0
  61. package/dist/web/browser.991ab24c49/path.js.br +0 -0
  62. package/dist/web/browser.991ab24c49/path.js.gz +0 -0
  63. package/dist/web/browser.991ab24c49/reactive.js +1 -0
  64. package/dist/web/browser.991ab24c49/reactive.js.br +0 -0
  65. package/dist/web/browser.991ab24c49/reactive.js.gz +0 -0
  66. package/dist/web/browser.991ab24c49/realm.js +1 -0
  67. package/dist/web/browser.991ab24c49/resource.js +1 -0
  68. package/dist/web/browser.991ab24c49/resource.js.br +0 -0
  69. package/dist/web/browser.991ab24c49/resource.js.gz +0 -0
  70. package/dist/web/browser.991ab24c49/runtime.js +2 -0
  71. package/dist/web/browser.991ab24c49/runtime.js.br +0 -0
  72. package/dist/web/browser.991ab24c49/runtime.js.gz +0 -0
  73. package/dist/web/browser.991ab24c49/scope.js +1 -0
  74. package/dist/web/browser.991ab24c49/scope.js.br +0 -0
  75. package/dist/web/browser.991ab24c49/scope.js.gz +0 -0
  76. package/dist/web/browser.991ab24c49/standard.js +1 -0
  77. package/dist/web/browser.991ab24c49/standard.js.br +0 -0
  78. package/dist/web/browser.991ab24c49/standard.js.gz +0 -0
  79. package/dist/web/browser.991ab24c49/testing.js +1 -0
  80. package/dist/web/browser.991ab24c49/testing.js.br +0 -0
  81. package/dist/web/browser.991ab24c49/testing.js.gz +0 -0
  82. package/dist/web/browser.991ab24c49/values.js +1 -0
  83. package/dist/web/browser.991ab24c49/values.js.br +0 -0
  84. package/dist/web/browser.991ab24c49/values.js.gz +0 -0
  85. package/dist/web/host.a102cc9754.js +38 -0
  86. package/dist/web/host.a102cc9754.js.br +0 -0
  87. package/dist/web/host.a102cc9754.js.gz +0 -0
  88. package/dist/web/icons/180.c8c643a608.png +0 -0
  89. package/dist/web/icons/192.c099d3e1ed.png +0 -0
  90. package/dist/web/icons/32.caf706bbd1.png +0 -0
  91. package/dist/web/icons/512.e2c2dd9ba7.png +0 -0
  92. package/dist/web/index.html +129 -14
  93. package/dist/web/index.html.br +0 -0
  94. package/dist/web/index.html.gz +0 -0
  95. package/dist/web/manifest.webmanifest +22 -0
  96. package/dist/web/nsh-math.7ad3060fbc.wasm +0 -0
  97. package/dist/web/nsh-math.7ad3060fbc.wasm.br +0 -0
  98. package/dist/web/nsh-math.7ad3060fbc.wasm.gz +0 -0
  99. package/dist/web/nsh-math.cc869361ca.bin +0 -0
  100. package/dist/web/nsh-syntaxes.ea0da56d04.bin +0 -0
  101. package/dist/web/nsh-syntaxes.ea0da56d04.bin.br +0 -0
  102. package/dist/web/nsh-syntaxes.ea0da56d04.bin.gz +0 -0
  103. package/dist/web/nsh.5be0579ad8.wasm +0 -0
  104. package/dist/web/nsh.5be0579ad8.wasm.br +0 -0
  105. package/dist/web/nsh.5be0579ad8.wasm.gz +0 -0
  106. package/dist/web/nsh.89070fe10a.js +259 -0
  107. package/dist/web/nsh.89070fe10a.js.br +0 -0
  108. package/dist/web/nsh.89070fe10a.js.gz +0 -0
  109. package/npm-shrinkwrap.json +251 -220
  110. package/package.json +8 -7
  111. package/dist/web/assets/index-BdJ_-50H.js +0 -62
  112. package/dist/web/assets/index-ClW_3YVo.js +0 -5
  113. package/dist/web/assets/index-DR-JFaOB.css +0 -1
  114. package/dist/web/favicon.svg +0 -1
  115. package/dist/web/sw.js +0 -61
package/dist/cli.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  defaultStateDir,
8
8
  loadInstalled,
9
9
  parseExtensionSource
10
- } from "./chunks/chunk-KOZ2NZL7.js";
10
+ } from "./chunks/chunk-XNVA5UWA.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.22.0",
174
+ version: "0.24.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",
@@ -187,14 +187,15 @@ var package_default = {
187
187
  prepublishOnly: "node scripts/shrinkwrap.mjs --check && pnpm run build"
188
188
  },
189
189
  dependencies: {
190
- "@earendil-works/chord": "1.4.0",
191
- "@earendil-works/pi-ai": "1.4.0",
192
- "@earendil-works/pi-codemode": "1.4.0",
193
- "@earendil-works/pi-coding-agent": "1.4.0",
194
- "@earendil-works/pi-durable": "1.4.0",
190
+ "@earendil-works/chord": "1.5.0",
191
+ "@earendil-works/pi-ai": "1.5.0",
192
+ "@earendil-works/pi-codemode": "1.5.0",
193
+ "@earendil-works/pi-coding-agent": "1.5.0",
194
+ "@earendil-works/pi-durable": "1.5.0",
195
+ "@earendil-works/pi-schema": "1.5.0",
195
196
  "@hono/node-server": "1.19.11",
196
197
  hono: "4.12.8",
197
- ws: "8.22.0",
198
+ ws: "8.21.0",
198
199
  zod: "4.3.6"
199
200
  },
200
201
  optionalDependencies: {
@@ -222,7 +223,7 @@ Options:
222
223
  Run "pikibun connect --help" or "pikibun serve --help" for their options.
223
224
  `;
224
225
  var [command, ...args] = process.argv.slice(2);
225
- var serveMain = async (args2) => (await import("./chunks/cli-OGQRYOKN.js")).serveMain(args2);
226
+ var serveMain = async (args2) => (await import("./chunks/cli-L6ODIDYQ.js")).serveMain(args2);
226
227
  var run = command === "connect" ? connectMain : command === "cache" ? cacheMain : command === "extensions" ? extensionsMain : command === "serve" ? serveMain : void 0;
227
228
  if (run) {
228
229
  run(args).catch((error) => {
@@ -0,0 +1,6 @@
1
+ -- Postgres translation of sqlite/0051_host_browser.sql.
2
+
3
+ -- Where the browser tool's Chromium comes from on a host (HostConfig.browser in packages/shared/src/host-config.ts, and
4
+ -- HostBrowserConfig in packages/shared/src/browser.ts): found on the host, at a path its owner gives, downloaded by its
5
+ -- connector, or none, as JSON. '{"source":"auto"}' looks for one.
6
+ ALTER TABLE connector_configs ADD COLUMN browser_json TEXT NOT NULL DEFAULT '{"source":"auto"}';
@@ -0,0 +1,6 @@
1
+ -- Postgres translation of sqlite/0052_connector_version.sql.
2
+
3
+ -- The version a host's connector reported when it last connected (the x-pikibun-version header of its manifest, see
4
+ -- packages/shared/src/version.ts), which the host's page shows. NULL for connectors that report none: those from before
5
+ -- they did, and development builds.
6
+ ALTER TABLE connectors ADD COLUMN connector_version TEXT;
@@ -0,0 +1,12 @@
1
+ -- Postgres translation of sqlite/0053_session_tunnels.sql.
2
+
3
+ -- Session services and tunnels (piki:tunnel; docs/design/tunnel.md).
4
+ -- The longest a session service runs on a host (HostConfig.serviceLifetimeSeconds in packages/shared/src/host-config.ts),
5
+ -- 4 hours by default, and where its cloudflared comes from (HostConfig.tunnel, HostTunnelConfig in
6
+ -- packages/shared/src/tunnel.ts), as JSON: '{"source":"auto"}' looks for one.
7
+ ALTER TABLE connector_configs ADD COLUMN service_lifetime_seconds INTEGER NOT NULL DEFAULT 14400;
8
+ ALTER TABLE connector_configs ADD COLUMN tunnel_json TEXT NOT NULL DEFAULT '{"source":"auto"}';
9
+ -- A session that is online through its tunnel, as its host last reported it (SessionRecord.tunnel): its address, and
10
+ -- when its service lifetime ends, after which the session list no longer shows it whatever its host said. Display state.
11
+ ALTER TABLE sessions ADD COLUMN tunnel_url TEXT;
12
+ ALTER TABLE sessions ADD COLUMN tunnel_expires_at TEXT;
@@ -0,0 +1,4 @@
1
+ -- Where a native sign-in hands its result back (auth.ts): NULL, the app's own pikibun://auth, as before; 'page', the
2
+ -- server's /api/auth/native/done page, which an app signing in through its own web view watches for (the client on
3
+ -- Native Shell, whose web views navigate only to http and https and which has no URL schemes).
4
+ ALTER TABLE oauth_states ADD COLUMN native_callback TEXT CHECK (native_callback IS NULL OR native_callback = 'page');
@@ -0,0 +1,4 @@
1
+ -- Where the browser tool's Chromium comes from on a host (HostConfig.browser in packages/shared/src/host-config.ts, and
2
+ -- HostBrowserConfig in packages/shared/src/browser.ts): found on the host, at a path its owner gives, downloaded by its
3
+ -- connector, or none, as JSON. '{"source":"auto"}' looks for one.
4
+ ALTER TABLE connector_configs ADD COLUMN browser_json TEXT NOT NULL DEFAULT '{"source":"auto"}';
@@ -0,0 +1,4 @@
1
+ -- The version a host's connector reported when it last connected (the x-pikibun-version header of its manifest, see
2
+ -- packages/shared/src/version.ts), which the host's page shows. NULL for connectors that report none: those from before
3
+ -- they did, and development builds.
4
+ ALTER TABLE connectors ADD COLUMN connector_version TEXT;
@@ -0,0 +1,10 @@
1
+ -- Session services and tunnels (piki:tunnel; docs/design/tunnel.md).
2
+ -- The longest a session service runs on a host (HostConfig.serviceLifetimeSeconds in packages/shared/src/host-config.ts),
3
+ -- 4 hours by default, and where its cloudflared comes from (HostConfig.tunnel, HostTunnelConfig in
4
+ -- packages/shared/src/tunnel.ts), as JSON: '{"source":"auto"}' looks for one.
5
+ ALTER TABLE connector_configs ADD COLUMN service_lifetime_seconds INTEGER NOT NULL DEFAULT 14400;
6
+ ALTER TABLE connector_configs ADD COLUMN tunnel_json TEXT NOT NULL DEFAULT '{"source":"auto"}';
7
+ -- A session that is online through its tunnel, as its host last reported it (SessionRecord.tunnel): its address, and
8
+ -- when its service lifetime ends, after which the session list no longer shows it whatever its host said. Display state.
9
+ ALTER TABLE sessions ADD COLUMN tunnel_url TEXT;
10
+ ALTER TABLE sessions ADD COLUMN tunnel_expires_at TEXT;
@@ -0,0 +1,4 @@
1
+ -- Where a native sign-in hands its result back (auth.ts): NULL, the app's own pikibun://auth, as before; 'page', the
2
+ -- server's /api/auth/native/done page, which an app signing in through its own web view watches for (the client on
3
+ -- Native Shell, whose web views navigate only to http and https and which has no URL schemes).
4
+ ALTER TABLE oauth_states ADD COLUMN native_callback TEXT CHECK (native_callback IS NULL OR native_callback = 'page');
@@ -0,0 +1,12 @@
1
+ import{Clipboard as e,Storage as t,cleanup as n,colorScheme as r,computed as i,context as a,effect as o,host as s,keyboardFrame as c,lifecycle as l,mount as u,openUrl as d,platform as f,safeArea as p,setColorScheme as m,signal as h,untracked as g,windowSize as _}from"nsh";import{append as v,bindProp as y,component as b,cond as x,each as S,element as C,insert as w,list as T,merge as E,prop as D,ref as O,text as k}from"nsh:rt";import{AlertDialog as ee,Button as A,Dialog as j,NavPage as M,NavStack as N,Sheet as P,Switch as te,TextView as F,createNavStack as ne}from"nsh/base";var I=class extends Error{status;code;constructor(e,t,n){super(n),this.status=e,this.code=t,this.name=`ApiError`}};const re={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`},L=e=>e.replace(/<\/?[a-z!][^>]*>/gi,` `),ie=e=>e.replace(/&nbsp;/g,` `).replace(/&lt;/g,`<`).replace(/&gt;/g,`>`).replace(/&quot;/g,`"`).replace(/&#39;/g,`'`).replace(/&amp;/g,`&`);function R(e){let t=e=>/<[a-z!/]/i.test(e),n=e=>{let n=ie(e);return t(n)?L(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 ae(e){if(typeof e==`string`)return R(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 R(n)}return``}function z(e,t){let n=e.status,r=e.statusText||re[n]||``,i=t&&t.toLowerCase()!==r.toLowerCase()&&t!==String(n)?`: "${t}"`:``,a=`HTTP ${n}${r?` ${r}`:``}${i}`;return n===429?new I(429,`RATE_LIMITED`,`Pikibun is over its request limit right now (${a}). Try again later.`):n===408||n===504||n===522||n===524?new I(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 I(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 I(n,`BACKEND_UNAVAILABLE`,`The Pikibun API answered with something other than JSON (${a}). Try again later.`):new I(n,`REQUEST_FAILED`,`The request failed before reaching Pikibun's API (${a}).`)}async function oe(e){if(!(e.headers.get(`content-type`)??``).includes(`application/json`))throw z(e,R(await e.text().catch(()=>``)));if(e.ok)try{return await e.json()}catch(t){throw t instanceof Error&&t.name===`AbortError`?t:new I(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 z(e,R(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 I(e.status,o??`REQUEST_FAILED`,a):z(e,ae(n))}function B(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 oe(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 oe(c)}}function V(e){return e instanceof I?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 H=e=>encodeURIComponent(e),se=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`],ce={off:`Off`,minimal:`Minimal`,low:`Low`,medium:`Medium`,high:`High`,xhigh:`Extra high`,max:`Max`},le={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 ue(e){return e?.capabilities.automaticGitHub===!0}function de(e,t){let n=ue(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+fe(e)}function fe(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 pe=e=>`${e.provider}\n${e.modelId}`;function me(e,t){return t&&e?.models.find(e=>e.provider===t.provider&&e.modelId===t.modelId)}function he(e){let t=e?.thinkingLevels??[];return t.some(e=>e!==`off`)?t:[]}function ge(e,t){if(!t||!e?.length||e.includes(t))return t;let n=se.indexOf(t);return e.filter(e=>se.indexOf(e)<=n).sort((e,t)=>se.indexOf(t)-se.indexOf(e))[0]??(e.includes(`off`)?`off`:e[0])}function _e(e,t){let n=e?.thinkingLevels;if(e&&n?.length)return t&&n.includes(t)?t:e.thinkingLevel&&n.includes(e.thinkingLevel)?e.thinkingLevel:ge(n,t)}function ve(e,t){return{...e,model:{provider:t.provider,modelId:t.modelId},thinkingLevel:t.thinkingLevel??ge(t.thinkingLevels,e.thinkingLevel)}}function ye(e,t,n){let r=e?.capabilities.chatOptions?me(e,t.model??n):void 0;if(!e||!r)return;let i=_e(r,t.thinkingLevel??(t.model?void 0:n?.thinkingLevel));return{connectorId:e.id,provider:r.provider,modelId:r.modelId,...i?{thinkingLevel:i}:{}}}function be(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=se.includes(t.thinkingLevel)?t.thinkingLevel:void 0;return{connectorId:t.connectorId,provider:t.provider,modelId:t.modelId,...n?{thinkingLevel:n}:{}}}catch{return}}function xe(e,t,n,r=()=>!0){let i=t&&me(e,t),a=i&&r(i)?i:me(e,n);if(!a)return{access:`auto`};let o=a.thinkingLevels?.length?_e(a,t?.thinkingLevel):a.thinkingLevel;return{model:{provider:a.provider,modelId:a.modelId},thinkingLevel:o,access:`auto`}}function Se(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 Ce(e,t,n){if(!(n!==`submit`||e||t.access===`approval`))return`Still checking this session's host, so "${le[t.access].label}" can't be applied yet. Try again in a moment.`}function we(e,t){if(e?.capabilities.chatOptions){if(!e.models.length)return`${e.name} offers no models right now.`;if(t.model&&!me(e,t.model))return`${e.name} no longer offers ${t.model.modelId}. Choose another model.`}}function Te(e,t,n){if(!e?.capabilities.chatOptions)return;let r=me(e,t.model),i={};r&&(i.model={provider:r.provider,modelId:r.modelId});let a=_e(r,t.thinkingLevel);return a&&(i.thinkingLevel=a),n===`submit`&&(i.access=t.access),n===`submit`&&t.access===`auto`&&ue(e)&&(i.autoMerge=!0),i}const Ee=`pikibun.autoApproveConfirmed`;function De(e,t){return e?.autoMerge===!0&&!t}const Oe=/^([a-z_]+)\(\{.*\}\)$/s,ke=/^ {0,3}(`{3,}|~{3,})(.*)$/s;function Ae(e){let t=[],n=``;for(let r of e.split(`
2
+ `)){let e=ke.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=Oe.exec(r);t.push(i?{line:r,tool:i[1]}:{line:r})}return t}function je(e){let t=[],n=[];for(let{line:r,tool:i}of Ae(e))i===void 0?t.push(r):n.push({name:i,line:r});return{prose:t.join(`
3
+ `),calls:n}}const Me={size:50,max:200},Ne=Object.keys({entries:e=>e.id,approvals:e=>e.id,conversations:e=>e.id,queue:e=>e.submissionId}),Pe=[`entries`,`approvals`,`conversations`],Fe={items:2e5},Ie=/^[0-9a-f]{32}$/;function Le(e){return typeof e==`string`&&Ie.test(e)}function Re(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 ze(e,t){if(!Array.isArray(t)||t.length>Fe.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>Fe.items)throw Error(`Invalid list patch`)}return n}function Be(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return!Le(t.base)||!Le(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 Ve(e,t){if(!Be(t))throw Error(`Invalid view patch`);if(t.base===t.revision)return e;let n=t.lists,r=t.view;if(Ne.some(e=>Object.hasOwn(r,e))||Object.keys(n).some(e=>!Ne.includes(e)))throw Error(`Invalid view patch`);let i=Re(e),a={...r};for(let e of Ne)n[e]!==void 0&&(a[e]=ze(i.lists[e]??[],n[e]));if(Pe.some(e=>!Array.isArray(a[e])))throw Error(`Invalid view patch`);return a}function He(e,t){return(e?.entries??[]).filter(e=>e.conversationId===t)}function Ue(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=He(t,i.id),s=He(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 We(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 Ge(e,t,n){return t.get(n)?.[0]?.id??He(e,n)[0]?.id}const Ke=[`queued`,`admitting`,`running`],qe={activeReopenMs:1e3,idleReopenMs:1e4,firstBackoffMs:2e3,maxBackoffMs:6e4,accessCheckMs:3e4};function Je(e,t,n){let r=new AbortController,i=`/api/sessions/${H(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=Ue(h,p,e),p=e,m=typeof n==`string`?n:void 0,c=e.busy||(e.queue??[]).some(e=>Ke.includes(e.status))||e.repositories?.status===`preparing`,t.view(We(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&&Ge(a,h,e);if(!_()||!a||o<=0||!s)return;let c=`conversation=${encodeURIComponent(e)}&before=${encodeURIComponent(s)}&limit=${Me.size}`;try{let a=await n.api(`${i}/entries?${c}`,{signal:r.signal});if(!_()||!p||Ge(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(We(p,h))}catch(e){_()&&t.error(V(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(V(e)),a&&e instanceof I&&[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(!Be(n)||!p||n.base!==m){m=void 0;return}let r;try{r=Ve(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?qe.activeReopenMs:qe.idleReopenMs);s++,t.status(`reconnecting`),S(!0),C(Math.min(qe.maxBackoffMs,qe.firstBackoffMs*2**(s-1)))})}let T=n.onVisibilityChange(()=>{_()&&(n.hidden()?(o(),b()):(S(!1),w()))}),E=setInterval(()=>{n.hidden()||S(!1)},qe.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 Ye={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 Xe(e,t={}){let n=Ye[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 Ze=/^\d{1,15}:\d{1,15}$/;function Qe(e){if(Ze.test(e.id)){if(e.role===`user`)return{entryId:e.id,before:!0};if(!(e.role!==`assistant`||je(e.text).calls.length>0))return{entryId:e.id,before:!1}}}function $e(e){return e.rewindable===!0}const et=/^\[image [^\s\]]+\]$/;function tt(e){return e.text.split(`
4
+ `).filter(e=>!et.test(e)).join(`
5
+ `).trim()}function nt(e,t){return t.trim()?e.trim()?`${e}\n\n${t}`:t:e}function rt(e){return e.role===`assistant`?je(e.text).prose.trim():e.text}function it(e){return e.connectorOwnerId!==e.ownerId}function at(e,t,n=!1){return e.kind===`host.bash`||e.kind===`extension.tool`||(e.kind===`bash`||e.kind===`program`)&&(t.hostEnvironment===!0||n&&it(t))}function ot(e,t,n=!1){return e.kind===`bash`||e.kind===`program`?!n&&!at(e,t,n):e.kind===`git.push`||e.kind===`github.comment`||e.kind===`github.issue`}function st(e,t){return e.kind===`host.bash`||e.kind===`extension.tool`||(e.kind===`bash`||e.kind===`program`)&&t.hostEnvironment===!0}function ct(e,t,n,r){return t.ownerId===r&&e.requestedBy!==t.ownerId&&t.requesterAutoApprove===!0&&(n===void 0||n.capabilities.requesterAutoApprove===!0)&&ot(e.operation,t,e.unbounded===!0)}function lt(e,t,n){return e.connectorOwnerId!==void 0&&e.connectorOwnerId===n||t?.hostCommandAccess!==void 0}function ut(e,t){return e.kind===`extension.tool`||e.kind===`host.bash`&&t?.capabilities?.hostOwnerDecides===!0}function dt(e,t,n,r,i){let a=t.connectorOwnerId!==void 0&&t.connectorOwnerId===r;return i&&lt(t,n,r)||a&&ut(e,n)}function ft(e,t){return ut(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 pt(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 mt(e){try{return JSON.stringify(JSON.parse(e.arguments),null,2)}catch{return e.arguments}}function ht(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 gt={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 _t(e){return Object.hasOwn(gt,e)?gt[e]:`Preparing`}function vt(e){return typeof e==`number`&&Number.isSafeInteger(e)&&e>=0}function yt(e){if(!vt(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 bt(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 xt(e){let t=[_t(e.phase)],n=bt(e);return n!==void 0&&e.phase!==`done`&&t.push(`${n}%`),vt(e.done)&&vt(e.total)&&e.total>0?t.push(`${e.done.toLocaleString(`en-US`)} of ${e.total.toLocaleString(`en-US`)}`):vt(e.done)&&e.done>0&&t.push(e.done.toLocaleString(`en-US`)),vt(e.bytes)&&e.bytes>0&&t.push(yt(e.bytes)),t.join(` · `)}function St(e){return e?.repositories?.status===`preparing`}const Ct={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 wt(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(Ct,t)?Ct[t]:{tone:`success`}}var Tt=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 Et(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 Tt(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 Dt(e){return{id:e.userId,githubLogin:e.githubLogin,role:e.role}}function Ot(e){return e.githubLogin||e.id}function kt(e){return e.githubLogin?`${e.githubLogin}(${e.id})`:e.id}function At(e){let t=new Map(e.map(e=>[e.id,e]));return e=>t.get(e)??{id:e}}const jt=[`owner`,`admin`,`collaborator`,`member`],Mt=[`owner`,`admin`];function Nt(e,t,n){return e===t||n!==void 0&&Mt.includes(n)}function Pt(e){return jt.includes(e??`member`)}const U=`[redacted]`,Ft=/^[A-Za-z0-9._~+/=:@%^!#,-]+$/,It=/^(?:\$\{?[A-Za-z_]|\{\{|\{%|%\(|<[^<>]*>$|\*+$|x{3,}$|\.{3}$|\u2026$|your[_-]|(?:null|none|nil|undefined|true|false|empty)$)/i;function Lt(e,t){return!!e&&!e.includes(`[redacted]`)&&!It.test(e)&&(!t.command||Ft.test(e))}function Rt(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 zt=/* @__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 Bt(e){return/^[A-Za-z][A-Za-z-]{3,63}$/.test(e)&&!/^[a-z]+[A-Z]|^[A-Z][a-z]+[A-Z]/.test(e)&&!zt.has(e.toLowerCase())}function Vt(e,t){let n=t;for(;e[n]===` `||e[n]===` `;)n++;let r=e[n]??``;return r===`
9
+ `||r===`\r`?``:r}const Ht=/-----BEGIN ((?:[A-Z0-9]{1,16} ){0,4})PRIVATE KEY( BLOCK)?-----/g,Ut=/(?:Proc-Type|DEK-Info|Version|Comment|Hash|Charset): [^\r\n\\]{0,256}/y,Wt=/^(?:\r?\n|\\r\\n|\\n)/,Gt=/(?:\r?\n|\\r\\n|\\n)[ \t]*$/;function Kt(e){if(!e.includes(`PRIVATE KEY`))return e;let t=``,n=0;Ht.lastIndex=0;for(let r=Ht.exec(e);r;r=Ht.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&&(Ut.lastIndex=s,Ut.test(e)))s=Ut.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)+(Wt.exec(r)?.[0]??``)+U+(Gt.exec(r)?.[0]??``),n=s}Ht.lastIndex=u?s+a.length:Math.max(s,i)}return t+e.slice(n)}const qt=String.raw`pass(?:word|wd|phrase)|secret|token|api[_-]?key|(?:access|secret|private|auth|account|encryption|signing|master|session)[_-]?key`,Jt=/pass|secret|token|key/i,Yt=String.raw`"((?:[^"\\\n\x60$]|\\[^\n]){1,8192})"|'([^'\n]{1,8192})'|\\"((?:[^"\\\n\x60$]|\\[^"\n]){1,8192})\\"`,Xt=String.raw`([^\s'"\x60,;&|<>(){}\[\]$\\=][^\s'"\x60,;&|<>(){}\[\]$\\]{0,1023})`,Zt=new RegExp(String.raw`(${qt})((?:\\?["'])?)([ \t]{0,16}(?::=|=>|[:=])[ \t]{0,16}|[ \t]{1,16}(?:is|was)[ \t]{1,16})(?:${Yt}|${Xt})`,`gi`),Qt=/^[ \t]+(?:is|was)[ \t]+$/i;function $t(e,t){return e.replace(Zt,(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=Vt(e,u+n.length);if(a===`=`){if(/[),}\]]/.test(t)?!Rt(d):/^\d{1,5}$/.test(d))return n}else{let e=Qt.test(a);if(!e&&/[;,)}\]|<>({[=?:&]/.test(t))return n;let i=f!==``||t===``||(e?/[.!?,;)"']/.test(t):t===`#`);if(!Rt(d)&&!(/^pass/i.test(r)&&i&&Bt(d)))return n}}if(!Lt(d,t))return n;let p=o===void 0?s===void 0?c===void 0?U+f:`\\"${U}\\"`:`'${U}'`:`"${U}"`;return r+i+a+p})}const en=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 tn(e,t){return e.includes(`--`)?e.replace(en,(e,n,r,i,a,o)=>Lt(i??a??o??``,t)?n+r+(i===void 0?a===void 0?U:`'${U}'`:`"${U}"`):e):e}const nn=/(\bcurl\b[^\n]{0,2048}?[ \t])(-u|--user)([ \t]{1,16}|=)(["']?)([^\s:'"\x60;&|<>(){}$\\]{1,256}):([^\s'"\x60;&|<>(){}$\\]{1,1024})\4(?![^\s])/g,rn=/\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,an=/\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,on=/\b(bearer[ \t]{1,16})([A-Za-z0-9._~+/-]{16,4096}=*)(?![A-Za-z0-9._~+/=-])/gi,sn=/\b([a-z][a-z0-9+.-]{1,30}:\/\/[^\s:/@?#'"<>[\]]{0,256}:)([^\s@/?#'"<>[\]]{1,1024})(?=@)/gi;function cn(e,t){let n=e;return n.includes(`curl`)&&(n=n.replace(nn,(e,n,r,i,a,o,s)=>/^\d+$/.test(o)&&/^\d+$/.test(s)||!Lt(s,t)?e:`${n}${r}${i}${a}${o}:${U}${a}`)),n.includes(`machine`)&&(n=n.replace(rn,(e,n,r)=>Lt(r,t)?n+U:e)),/bearer|authorization|basic|token|digest|negotiate|apikey|sso-key|bot/i.test(n)&&(n=n.replace(an,(e,n,r)=>Lt(r,t)?n+U:e),n=n.replace(on,(e,n,r)=>/\d/.test(r)&&Lt(r,t)?n+U:e)),n.includes(`://`)&&(n=n.replace(sn,(e,n,r)=>Lt(r,t)?n+U:e)),n}const ln=[{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}],un=/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_/,dn=/(?<![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,fn=/(#\/shared\/)([A-Za-z0-9_-]{43})(?![A-Za-z0-9_-])/g;function pn(e){let t=e;if(un.test(t))for(let{pattern:e,digit:n}of ln)t=t.replace(e,(e,t,r)=>n&&!/\d/.test(r)?e:t+U);return t.includes(`eyJ`)&&(t=t.replace(dn,U)),t.includes(`#/shared/`)&&(t=t.replace(fn,`$1${U}`)),t}function mn(e,t={}){if(typeof e!=`string`||!e)return e;let n=t.command?e:Kt(e);return n=cn(n,t),Jt.test(n)&&(n=tn($t(n,t),t)),pn(n)}function hn(e){return JSON.stringify(e??``).includes(U)}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 gn=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 _n(e){return gn[e]??`This session can't use the browser on its host.`}const vn={draft:`Draft`,open:`Open`,failing:`CI failed`,changes_requested:`Changes requested`,merged:`Merged`,closed:`Closed`},yn={draft:`neutral`,open:`success`,failing:`danger`,changes_requested:`danger`,merged:`merged`,closed:`neutral`},bn=typeof l==`function`?l:()=>`active`,xn=/* @__PURE__ */ new Map,Sn=/* @__PURE__ */ new Map,Cn=/* @__PURE__ */ new Map;function wn(){xn.clear(),Sn.clear(),Cn.clear()}function Tn(e,t){t?xn.set(e,t):xn.delete(e)}function En(e){return xn.get(e)??``}function Dn(e,t){xn.get(e)===t&&xn.delete(e);for(let n of Sn.get(e)??[])n(t)}function On(e,t){if(!t.trim())return;let n=e=>nt(e,t),r=Cn.get(e);if(r?.size)for(let e of r)e(n);else Tn(e,n(En(e)))}function kn(e){let t=h(En(e)),r=e=>t.update(t=>t===e?``:t),i=e=>t.update(e),a=Sn.get(e)??/* @__PURE__ */ new Set;a.add(r),Sn.set(e,a);let s=Cn.get(e)??/* @__PURE__ */ new Set;return s.add(i),Cn.set(e,s),n(()=>{a.delete(r),a.size||Sn.delete(e),s.delete(i),s.size||Cn.delete(e)}),o(()=>Tn(e,t())),t}const An=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`;function jn(e){let t=``,n=0,r=0;for(let i of e){for(r=r<<8|i,n+=8;n>=6;)n-=6,t+=An[r>>n&63];r&=(1<<n)-1}return n>0&&(t+=An[r<<6-n&63]),t}function Mn(e){let t=new Uint8Array(e);return crypto.getRandomValues(t),jn(t)}async function Nn(){let e=Mn(32);return{verifier:e,challenge:jn(new Uint8Array(await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(e)))),state:Mn(24)}}const Pn=[`localhost`,`127.0.0.1`],W=f.os===`web`;function Fn(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`||Pn.includes(i)?{origin:a}:{error:`Use https://, or http:// only for localhost or 127.0.0.1.`}}const In=e=>e.replace(/^https:\/\//,``)||`this server`,Ln={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.`},Rn=`pikibun.token`,zn=`pikibun.tokenExpires`,Bn=`pikibun.origin`,Vn=h({status:`loading`}),Hn=Vn,Un=e=>e.status===`signedIn`?`${e.origin} ${e.user.id}`:null;function G(e){let t=Un(g(Vn));t!==null&&t!==Un(e)&&wn(),Vn.set(e)}function K(){let e=Hn();if(e.status!==`signedIn`)throw Error(`This screen needs a signed-in user.`);return e}let Wn=null;const Gn=`Your sign-in expired or was revoked. Sign in again to continue.`;async function Kn(){await Promise.all([t.removeItem(Rn),t.removeItem(zn)])}function qn(e){if(Wn!==e)return;Wn=null,Kn();let t=Hn();t.status===`signedIn`&&t.token===e&&G({status:`signedOut`,origin:t.origin,notice:Gn})}function Jn(e,t){return async function(n,r){try{return await e(n,r)}catch(e){throw e instanceof I&&e.status===401&&qn(t),e}}}async function Yn(){try{let e=await fetch(`/api/health`,{credentials:`same-origin`});return new URL(e.url).origin}catch{return``}}const Xn=()=>B({baseUrl:``,auth:`cookie`});async function Zn(e,n,r,i){let a=Jn(B({baseUrl:e,auth:()=>n}),n);Wn=n;let o=i;try{o??=(await a(`/api/me`)).user}catch(e){throw Wn===n&&(Wn=null),e}await Promise.all([t.setItem(Rn,n),t.setItem(Bn,e),r?t.setItem(zn,r):t.removeItem(zn)]),G({status:`signedIn`,origin:e,token:n,expiresAt:r,user:o,api:a})}async function Qn(){let e=await Yn(),t=Xn();try{let{user:n}=await t(`/api/me`);return Wn=null,G({status:`signedIn`,origin:e,token:null,expiresAt:null,user:n,api:Jn(t,null)}),!0}catch(t){return t instanceof I&&t.status===401?(G({status:`signedOut`,origin:e}),!1):(G({status:`unreachable`,origin:e,error:V(t)}),!1)}}async function $n(){if(G({status:`loading`}),W){await Qn();return}let[e,n,r]=await Promise.all([t.getItem(Bn),t.getItem(Rn),t.getItem(zn)]),i=e??`https://pikibun.com`;if(!n)return G({status:`signedOut`,origin:i});try{await Zn(i,n,r)}catch(e){e instanceof I&&e.status===401?(await Kn(),G({status:`signedOut`,origin:i,notice:Gn})):G({status:`unreachable`,origin:i,error:V(e)})}}async function er(e){return B({baseUrl:e,auth:()=>null})(`/api/health`)}async function tr(e){if((await er(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 Nn();return{url:`${e}/api/auth/native/start?challenge=${n}&state=${r}&callback=page`,isCallback:t=>nr(e,t),async finish(n){if(!nr(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(Ln[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 B({baseUrl:e,auth:()=>null})(`/api/auth/native/token`,{method:`POST`,body:{code:o,verifier:t,deviceName:`Pikibun NSH (${f.os})`}});await Zn(e,s.token,s.expiresAt,s.user)}}}function nr(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 rr(e,t){await Zn(e,t.trim(),null)}async function ir(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 Qn())throw Error(`Signed in, but the server did not keep the session. Check that cookies are allowed.`)}const ar=Qn;async function or(){let e=Hn();if(e.status!==`signedIn`&&e.status!==`unreachable`)return;let n=e.origin,r,i=null;if(e.status===`signedIn`)Wn=null,i=t=>e.api(`/api/auth/logout`,{method:`POST`,signal:t});else if(!W){let e=await t.getItem(Rn);e&&(i=t=>B({baseUrl:n,auth:()=>e})(`/api/auth/logout`,{method:`POST`,signal:t}))}if(i){let e=new AbortController,t=setTimeout(()=>e.abort(),1e4);try{await i(e.signal)}catch(t){t instanceof I&&t.status===401||(r=`Signed out on this device, but the server could not revoke the sign-in (${e.signal.aborted?`it didn't answer`:V(t)}). Revoke it under Settings › Profile on the web.`)}finally{clearTimeout(t)}}await Kn(),G({status:`signedOut`,origin:n,notice:r})}const sr=()=>g(bn)===`background`;function cr(e,t){let n=h(null),r=h(!1),i=h(``),a=h(0),s;o(()=>{let o=e();a();let c=typeof t==`function`?t():t,{api:l}=g(K),u=new AbortController;if(s!==o&&(s=o,n.set(null)),i.set(``),!o)return r.set(!1),()=>u.abort();r.set(!0);let d=!1,f=async()=>{if(!d){d=!0;try{let e=await l(o,{signal:u.signal});u.signal.aborted||(n.set(e),i.set(``))}catch(e){u.signal.aborted||i.set(V(e))}finally{d=!1,u.signal.aborted||r.set(!1)}}};if(f(),!c)return()=>u.abort();let p=setInterval(()=>{sr()||f()},c);return()=>{u.abort(),clearInterval(p)}});let c=g(bn)!==`background`;return o(()=>{let e=bn()!==`background`;e&&!c&&t&&a.update(e=>e+1),c=e}),{data:n,loading:r,error:i,refresh:()=>a.update(e=>e+1)}}function q(){let e=h(!1),t=h(``),n=h(``),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(V(e)),!1}finally{r=!1,e.set(!1)}},clear(){t.set(``),n.set(``)}}}const lr=`pikibun.lastChat`,ur=a(null);function dr(){let e=h(null),n=()=>!1,r=cr(()=>`/api/sessions`,()=>n()?1e4:3e4),a=cr(()=>`/api/workspaces`),o=i(()=>[...r.data()?.sessions??[]].sort((e,t)=>t.createdAt.localeCompare(e.createdAt)));n=i(()=>e()?.activity===`working`||o().some(e=>e.status!==`archived`&&e.activity===`working`));let s=h(``),c=h(void 0),l=h(!1);return t.getItem(lr).then(e=>{c()||c.set(be(e))},()=>void 0),t.getItem(Ee).then(e=>{e===`1`&&l.set(!0)},()=>void 0),{sessions:o,sessionsLoading:()=>r.loading()&&!r.data(),sessionsReloading:r.loading,sessionsError:r.error,refreshSessions:r.refresh,workspaces:()=>a.data()?.workspaces??[],workspacesLoading:()=>a.loading()&&!a.data(),workspacesError:a.error,refreshWorkspaces:a.refresh,lastWorkspaceId:s,setLastWorkspaceId:e=>s.set(e),lastChat:c,rememberChat(e,n,r){let i=ye(e,n,r);i&&(c.set(i),t.setItem(lr,JSON.stringify(i)).catch(()=>void 0))},autoApproveConfirmed:l,rememberAutoApproveConfirmed(){l.set(!0),t.setItem(Ee,`1`).catch(()=>void 0)},liveActivity:e,setLiveActivity:t=>e.set(t)}}function fr(){let e=ur();if(!e)throw Error(`useAppData must be used inside the signed-in shell`);return e}function J(e){if(e)try{return decodeURIComponent(e)}catch{return}}function pr(e){let[t,n,r]=e.replace(/^#\/?/,``).split(`/`).filter(Boolean);if(t===`s`&&J(n))return{name:`session`,sessionId:J(n)};if(t===`shared`&&J(n))return{name:`shared`,token:J(n)};if(t===`join`&&J(n))return{name:`join`,token:J(n)};if(t===`w`&&J(n)&&r===`new`)return{name:`new`,workspaceId:J(n)};if(t===`settings`){let e=J(n),t=J(r);return{name:`settings`,...e?{section:e}:{},...t?{id:t}:{}}}return{name:`home`}}function mr(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 hr=()=>f.os===`web`&&s.available(),gr=h({name:`home`});function _r(){hr()&&(s.call(`page.route`).then(e=>gr.set(pr(e??``)),()=>void 0),s.on(`page.route`,e=>gr.set(pr(e??``))))}function vr(e){hr()&&s.call(`page.setRoute`,{hash:mr(e)}).catch(()=>void 0)}function yr(e){return hr()?(s.call(`page.open`,{path:e}).catch(()=>void 0),!0):!1}const br={scheme:`light`,background:`#f6f6f7`,surface:`#ffffff`,surfaceRaised:`#efeff1`,border:`#dcdce0`,text:`#18181b`,muted:`#6b6b74`,primary:`#18181b`,onPrimary:`#ffffff`,selection:`#e4e4e8`,userBubble:`#e9e9ec`,onUserBubble:`#18181b`,code:`#f0f0f2`,backdrop:`#00000066`,tones:{neutral:{text:`#52525b`,background:`#ececef`},info:{text:`#1d4ed8`,background:`#e0e9fd`},success:{text:`#15803d`,background:`#dcf3e3`},warning:{text:`#a15c07`,background:`#fcf0d4`},danger:{text:`#b91c1c`,background:`#fbe1e1`},running:{text:`#6d28d9`,background:`#ece4fc`}}},xr={scheme:`dark`,background:`#0b0b0c`,surface:`#161618`,surfaceRaised:`#202023`,border:`#2e2e33`,text:`#f4f4f5`,muted:`#a1a1aa`,primary:`#f4f4f5`,onPrimary:`#18181b`,selection:`#26262b`,userBubble:`#26262b`,onUserBubble:`#f4f4f5`,code:`#1e1e22`,backdrop:`#00000099`,tones:{neutral:{text:`#d4d4d8`,background:`#27272a`},info:{text:`#93b4fb`,background:`#16233f`},success:{text:`#7ad79a`,background:`#11291a`},warning:{text:`#f5c062`,background:`#33260b`},danger:{text:`#f79a9a`,background:`#3a1414`},running:{text:`#c4a8fb`,background:`#25183f`}}},Y=()=>r()===`dark`?xr:br,Sr=`monospace`;function X(e){let t=()=>{let t=Y();switch(e.variant){case`primary`:return{background:t.primary,text:t.onPrimary,border:t.primary};case`danger`:return{background:t.tones.danger.background,text:t.tones.danger.text,border:t.tones.danger.background};case`ghost`:return{background:`transparent`,text:t.text,border:`transparent`};default:return{background:t.surface,text:t.text,border:t.border}}};return b(A,{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,borderRadius:e.small?8:12,borderWidth:1,borderColor:t().border,backgroundColor:t().background,paddingHorizontal:e.small?10:16,paddingVertical:e.small?6:12}},activeStyle:{opacity:.7},disabledStyle:{opacity:.4},get children(){return(()=>{let n=C(`text`);return y(n,`style`,()=>({color:t().text,fontSize:e.small?13:16,fontWeight:`600`})),w(n,[()=>e.busy?`… `:e.icon?`${e.icon} `:``,()=>e.label]),n})()}})}function Cr(e){return b(A,{get testID(){return e.testID},get accessibilityLabel(){return e.label},get disabled(){return e.disabled},get onPress(){return e.onPress},hitSlop:8,style:{flexDirection:`row`,alignItems:`center`,gap:4,paddingHorizontal:8,paddingVertical:6,borderRadius:8},activeStyle:{opacity:.6},disabledStyle:{opacity:.35},get children(){return[(()=>{let t=C(`text`);return y(t,`style`,()=>({fontSize:18,color:Y().text})),w(t,()=>e.icon),t})(),x(()=>(e.badge??0)>0,()=>(()=>{let t=C(`view`);y(t,`style`,()=>({minWidth:18,height:18,borderRadius:9,paddingHorizontal:5,alignItems:`center`,justifyContent:`center`,backgroundColor:Y().tones.warning.text}));let n=C(`text`);return y(n,`style`,()=>({fontSize:11,fontWeight:`700`,color:Y().onPrimary})),w(n,()=>String(e.badge??0)),v(t,n),t})())]}})}function wr(e){let t=()=>Y().tones[e.tone??`neutral`];return(()=>{let n=C(`view`);y(n,`style`,()=>({flexDirection:`row`,alignItems:`center`,gap:5,borderRadius:999,paddingHorizontal:8,paddingVertical:3,backgroundColor:t().background}));let r=C(`text`);return y(r,`style`,()=>({fontSize:12,fontWeight:`600`,color:t().text})),w(r,()=>e.children),v(n,r),w(n,x(()=>e.dot,()=>(()=>{let e=C(`view`);return y(e,`style`,()=>({width:6,height:6,borderRadius:3,backgroundColor:t().text})),e})()),r),n})()}function Z(e){let t=()=>Y().tones[e.tone??`neutral`];return(()=>{let n=C(`view`);y(n,`testID`,()=>e.testID),D(n,`role`,`alert`),y(n,`style`,()=>({gap:6,borderRadius:12,padding:12,backgroundColor:t().background}));let r=C(`text`);return y(r,`style`,()=>({fontSize:14,lineHeight:20,color:Y().text})),w(r,()=>e.children),v(n,r),w(n,x(()=>e.title,()=>(()=>{let n=C(`text`);return y(n,`style`,()=>({fontSize:15,fontWeight:`700`,color:t().text})),w(n,()=>e.title),n})()),r),w(n,x(()=>e.actions,()=>(()=>{let t=C(`view`);return D(t,`style`,{flexDirection:`row`,flexWrap:`wrap`,gap:8}),w(t,()=>e.actions),t})())),n})()}function Tr(e){return(()=>{let t=C(`view`);return y(t,`testID`,()=>e.testID),y(t,`style`,()=>({gap:8,borderRadius:14,borderWidth:1,padding:14,borderColor:Y().border,backgroundColor:Y().surface})),w(t,()=>e.children),t})()}function Er(e){let t=()=>e.tone?Y().tones[e.tone].text:Y().text;return b(A,{get testID(){return e.testID},get accessibilityLabel(){return e.label},get disabled(){return e.disabled},get onPress(){return e.onPress},get style(){return{flexDirection:`row`,alignItems:`center`,gap:6,borderRadius:999,borderWidth:1,paddingHorizontal:10,paddingVertical:6,borderColor:Y().border,backgroundColor:Y().surface}},activeStyle:{opacity:.7},disabledStyle:{opacity:.5},get children(){return[(()=>{let n=C(`text`);return y(n,`style`,()=>({fontSize:13,fontWeight:`600`,color:t()})),w(n,[()=>e.icon?`${e.icon} `:``,()=>e.label]),n})(),x(()=>!e.disabled,()=>(()=>{let e=C(`text`);y(e,`style`,()=>({fontSize:11,color:Y().muted}));let t=k(`▾`);return v(e,t),e})())]}})}function Q(e){return(()=>{let t=C(`view`);D(t,`style`,{flex:1,alignItems:`center`,justifyContent:`center`,gap:10,padding:32});let n=C(`text`);return y(n,`style`,()=>({fontSize:18,fontWeight:`700`,textAlign:`center`,color:Y().text})),w(n,()=>e.title),v(t,n),w(t,[x(()=>e.children,()=>(()=>{let t=C(`text`);return y(t,`style`,()=>({fontSize:15,lineHeight:21,textAlign:`center`,color:Y().muted})),w(t,()=>e.children),t})()),()=>e.action]),t})()}function Dr(e){return(()=>{let t=C(`view`);D(t,`style`,{flex:1,alignItems:`center`,justifyContent:`center`,padding:32});let n=C(`text`);return y(n,`style`,()=>({fontSize:15,color:Y().muted})),w(n,()=>e.label??`Loading…`),v(t,n),t})()}function Or(e){return[x(()=>e.error,()=>(()=>{let t=C(`text`);return D(t,`role`,`alert`),y(t,`style`,()=>({fontSize:13,lineHeight:18,color:Y().tones.danger.text})),w(t,()=>e.error),t})()),x(()=>!e.error&&e.notice,()=>(()=>{let t=C(`text`);return y(t,`style`,()=>({fontSize:13,lineHeight:18,color:Y().tones.success.text})),w(t,()=>e.notice),t})())]}function $(e){return(()=>{let t=C(`text`);return y(t,`testID`,()=>e.testID),y(t,`style`,()=>({fontSize:13,lineHeight:18,textAlign:e.center?`center`:`auto`,color:e.tone?Y().tones[e.tone].text:Y().muted})),w(t,()=>e.children),t})()}function kr(e){return(()=>{let t=C(`view`);return y(t,`testID`,()=>e.testID),D(t,`role`,`tablist`),y(t,`style`,()=>({flexDirection:`row`,alignSelf:`flex-start`,borderWidth:1,borderRadius:999,overflow:`hidden`,borderColor:Y().border})),w(t,S(()=>e.options,t=>b(A,{role:`tab`,get selected(){return e.value===t().value},onPress:()=>e.onChange(t().value),get style(){return{paddingHorizontal:14,paddingVertical:7,backgroundColor:e.value===t().value?Y().selection:`transparent`}},get children(){return(()=>{let n=C(`text`);return y(n,`style`,()=>({fontSize:13,fontWeight:`600`,color:e.value===t().value?Y().text:Y().muted})),w(n,()=>t().label),n})()}}),e=>e.value)),t})()}function Ar(e){return b(P,{get open(){return e.open},side:`bottom`,closeOnSwipe:!0,onOpenChange:t=>{t.open||e.onClose()},get backdropStyle(){return{backgroundColor:Y().backdrop}},get popupStyle(){return{backgroundColor:Y().background,borderTopLeftRadius:16,borderTopRightRadius:16,maxHeight:`80%`,paddingBottom:24}},get children(){return(()=>{let t=C(`view`);y(t,`testID`,()=>e.testID),D(t,`style`,{gap:4,padding:16});let n=C(`view`);D(n,`style`,{flexDirection:`row`,alignItems:`center`});let r=C(`text`);y(r,`style`,()=>({flex:1,fontSize:17,fontWeight:`700`,color:Y().text})),w(r,()=>e.title),v(n,r),w(n,b(X,{small:!0,variant:`ghost`,label:`Done`,get onPress(){return e.onClose}}));let i=C(`scroll`);return D(i,`style`,{flexShrink:1}),w(i,S(()=>e.options,t=>b(A,{role:`menuitem`,get selected(){return e.value===t().value},get accessibilityLabel(){return t().label},onPress:()=>{e.onClose(),e.onSelect(t().value)},style:{flexDirection:`row`,alignItems:`center`,gap:10,paddingVertical:12,paddingHorizontal:8,borderRadius:10},get activeStyle(){return{backgroundColor:Y().selection}},get children(){return[(()=>{let e=C(`view`);D(e,`style`,{flex:1,gap:2});let n=C(`text`);return y(n,`style`,()=>({fontSize:16,color:t().destructive?Y().tones.danger.text:Y().text})),w(n,()=>t().label),v(e,n),w(e,x(()=>t().hint,()=>(()=>{let e=C(`text`);return y(e,`style`,()=>({fontSize:13,color:Y().muted})),w(e,()=>t().hint),e})())),e})(),(()=>{let n=C(`text`);return y(n,`style`,()=>({fontSize:16,color:Y().text})),w(n,()=>e.value===t().value?`✓`:``),n})()]}}),`index`)),v(t,n),v(t,i),t})()}})}async function jr(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 Mr(e){return(()=>{let t=C(`view`);D(t,`style`,{gap:2});let n=C(`text`);return y(n,`style`,()=>({fontSize:13,color:Y().muted})),w(n,()=>e.label),v(t,n),w(t,()=>e.children),t})()}function Nr(e){return(()=>{let t=C(`view`);D(t,`selectable`,!0);let n=C(`text`);return y(n,`testID`,()=>e.testID),y(n,`style`,()=>({fontSize:16,color:Y().text})),w(n,()=>e.children),v(t,n),t})()}function Pr(e){return(()=>{let e=C(`view`);return D(e,`testID`,`join-workspace`),y(e,`style`,()=>({flex:1,backgroundColor:Y().background})),w(e,b(Q,{title:`Not here yet`,get children(){return`Invite links are still being moved to this app.`}})),e})()}const Fr={read:`👁`,approval:`🛡`,auto:`⚠`};function Ir(e){return async(t,n)=>{let r=await jr({title:`Auto-approve commands?`,message:de(t,n),confirmLabel:`Enable auto-approve`,destructive:!0});return r&&ue(t)&&e.rememberAutoApproveConfirmed(),r}}function Lr(e){let t=h(null),n=()=>t.set(null),r=()=>e.host?me(e.host,e.value.model):void 0,i=()=>he(r()),a=()=>_e(r(),e.value.thinkingLevel),o=Ir(e.data);async function s(t){(t!==`auto`||e.value.access===`auto`||!e.host||await o(e.host,e.unsandboxed))&&e.onChange({...e.value,access:t})}let c=()=>e.owner?[`read`,`approval`,`auto`]:[`read`,`approval`];return(o=>x(o,()=>(o=>x(()=>o().capabilities.chatOptions,()=>[b(Er,{testID:`chat-model`,icon:`◆`,get label(){return r()?.name??`Model`},get disabled(){return!o().models.length},onPress:()=>t.set(`model`)}),x(()=>i().length>0,()=>b(Er,{testID:`chat-reasoning`,icon:`✦`,get label(){return a()&&i().includes(a())?ce[a()]:`Default`},onPress:()=>t.set(`level`)})),x(()=>e.showAccess,()=>b(Er,{testID:`chat-access`,get icon(){return Fr[e.value.access]},get tone(){return e.value.access===`auto`?`danger`:void 0},get label(){return le[e.value.access].label},onPress:()=>t.set(`access`)})),b(Ar,{get open(){return t()===`model`},title:`Model`,onClose:n,get value(){return e.value.model&&r()?pe(e.value.model):void 0},get options(){return o().models.map(e=>({value:pe(e),label:e.name,hint:e.provider}))},onSelect:t=>{let n=o().models.find(e=>pe(e)===t);n&&e.onChange(ve(e.value,n))}}),b(Ar,{get open(){return t()===`level`},title:`Reasoning`,onClose:n,get value(){return a()},get options(){return i().map(e=>({value:e,label:ce[e]}))},onSelect:t=>e.onChange({...e.value,thinkingLevel:t})}),b(Ar,{get open(){return t()===`access`},title:`Access`,onClose:n,get value(){return e.value.access},get options(){return c().map(e=>({value:e,label:le[e].label,hint:le[e].hint,destructive:e===`auto`}))},onSelect:e=>void s(e)})],()=>(()=>{let e=C(`text`);return y(e,`style`,()=>({fontSize:13,color:Y().muted})),w(e,`Update the host's connector (npx pikibun@latest connect) to choose model, reasoning and access`),e})()))(o)))(()=>e.host)}function Rr(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 zr=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],Br=e=>String(e).padStart(2,`0`);function Vr(e){return`${e.getDate()} ${zr[e.getMonth()]} ${e.getFullYear()}`}function Hr(e,t=Date.now()){let n=new Date(e).getTime();if(Number.isNaN(n))return``;let r=Math.floor((t-n)/6e4);return r<1?`just now`:r<60?`${r} min ago`:r<1440?`${Math.floor(r/60)} h ago`:r<10080?`${Math.floor(r/1440)} d ago`:Vr(new Date(n))}function Ur(e){let t=new Date(e);return Number.isNaN(t.getTime())?e:`${Vr(t)}, ${Br(t.getHours())}:${Br(t.getMinutes())}`}function Wr({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 Gr=()=>crypto.randomUUID();function Kr(e,t){let n=e.trim().split(`
11
+ `)[0]?.trim()??``;return Array.from(n).slice(0,80).join(``).trim()||t}const qr=(e,t)=>e.provider===t.provider&&e.modelId===t.modelId;function Jr(e){let t=fr(),n=()=>t.workspaces().filter(e=>Pt(e.role)),r=h(e.workspaceId??``),i=h(!1),a=()=>n().find(e=>e.id===(r()||t.lastWorkspaceId()))??n()[0];return x(()=>!t.workspacesLoading(),()=>x(()=>!t.workspacesError(),()=>(a=>x(a,()=>(t=>[(()=>{let e=C(`view`);return y(e,`style`,()=>({flexDirection:`row`,alignItems:`center`,gap:8,paddingHorizontal:20,paddingVertical:10,borderBottomWidth:1,borderColor:Y().border})),w(e,[b($,{get children(){return`Workspace`}}),b(Er,{testID:`new-workspace`,icon:`👥`,get label(){return t().name},get disabled(){return n().length<2},onPress:()=>i.set(!0)})]),e})(),S(()=>[t()],t=>b(Yr,{get workspace(){return t()},get onStarted(){return e.onStarted}}),e=>e.id),b(Ar,{get open(){return i()},title:`Workspace`,get value(){return t().id},onClose:()=>i.set(!1),onSelect:e=>r.set(e),get options(){return n().map(e=>({value:e.id,label:e.name,hint:e.role}))}})])(a),()=>x(()=>t.workspaces().length>0,()=>b(Q,{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.`}}),()=>b(Q,{title:`No workspace yet`,get children(){return`Create a workspace on the web, add a repository and pair a host to start your first session.`}}))))(()=>a()),()=>(()=>{let e=C(`view`);return D(e,`style`,{padding:20}),w(e,b(Z,{tone:`danger`,title:`Unable to load workspaces`,get actions(){return b(X,{small:!0,label:`Retry`,get onPress(){return t.refreshWorkspaces}})},get children(){return t.workspacesError()}})),e})()),()=>b(Dr,{}))}function Yr(e){let{user:t}=g(K),n=fr(),r=Ir(n),a=!1,s=`/api/workspaces/${H(e.workspace.id)}`,c=cr(()=>`${s}/models`),l=cr(()=>`${s}/connectors`,1e4),u=cr(()=>`${s}/repositories`),d=h(``),f=h(!1),p=h(``),m=h(`workspace`),_=h(``),S=q(),T=()=>c.data()?.models,E=()=>l.data()?.connectors,O=()=>u.data()?.repositories??null,ee=()=>u.data()?.required??!0,A=i(()=>{let e=new Set((T()??[]).map(e=>e.connectorId));return(E()??[]).filter(t=>e.has(t.id)&&!t.revokedAt).sort((e,n)=>Number(n.ownerId===t.id)-Number(e.ownerId===t.id))}),j=()=>A().find(e=>e.id===d())??A().find(e=>e.id===n.lastChat()?.connectorId)??A().find(e=>e.online)??A()[0],M=e=>{let t=j();return e&&t&&t.models.some(t=>qr(t,e))?T()?.find(n=>n.connectorId===t.id&&qr(n,e)):void 0},N=h(null),P=()=>{let e=j(),t=N();return e&&t?.key===e.id?t.value:xe(e,n.lastChat(),e?.models.map(e=>M(e)).find(Boolean),e=>!!M(e))},F=()=>M(P().model),ne=()=>!!(j()&&j().ownerId!==t.id),I=()=>!!(F()&&j()?.models.some(e=>qr(e,F()))),re=()=>{let n=j();return!(!n?.online||n.revokedAt||!I()||n.ownerId!==t.id&&!n.workspaceIds.includes(e.workspace.id))},L=()=>{let e=u.data();return e?e.sources??e.repositories.length:0},ie=()=>!(!O()||u.error()||u.loading()||!L()&&ee()),R=()=>!ne()||!!(j()&&_()===j().id),ae=()=>!!(F()&&j()&&re()&&ie()&&R()&&!S.busy());o(()=>{j()?.id,j()?.ownerId,O(),_.set(``)});async function z(){let t=j(),i=F();if(!ae()||!i||!t||a)return;let o=p().trim(),s=Te(t,P(),`submit`);De(s,n.autoApproveConfirmed())&&(a=!0,!await r(t,!!t.capabilities.unsandboxed).finally(()=>{a=!1}))?N.set({key:t.id,value:{...P(),access:`approval`}}):S.run(async()=>{let{api:r}=K(),a=(await r(`/api/sessions`,{method:`POST`,body:{workspaceId:e.workspace.id,modelId:i.id,title:Kr(p(),i.name),visibility:m(),...ne()?{trustedConnectorId:t.id}:{}}})).session.id;if(n.setLastWorkspaceId(e.workspace.id),n.rememberChat(t,P()),o)try{await r(`/api/sessions/${H(a)}/submit`,{method:`POST`,body:{content:o,requestId:Gr(),...s?{options:s}:{}}})}catch{Tn(a,o)}n.refreshSessions(),e.onStarted(a)})}let oe=()=>c.loading()||l.loading(),B=()=>b(X,{small:!0,label:`Refresh host status`,get onPress(){return l.refresh}}),V=e=>e.revokedAt?`Revoked`:e.online?e.capabilities.unsandboxed?`Unsandboxed`:e.capabilities.sandbox?`Online`:`Sandbox unverified`:`Offline`,se=()=>{if(u.error())return{tone:`warning`,title:`Unable to load sources`,text:u.error(),retry:u.refresh};if(O()&&!L()&&ee())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(c.error())return{tone:`danger`,title:`Unable to load models`,text:c.error(),retry:c.refresh};if(l.error())return{tone:`warning`,title:`Unable to check host`,text:l.error(),refresh:!0};if(oe()||!T()||!E())return null;if(!A().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=j();return e?F()?I()?re()?ne()?{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};return(()=>{let r=C(`scroll`);D(r,`style`,{flex:1}),D(r,`contentStyle`,{gap:12,padding:20,width:`100%`,maxWidth:680,alignSelf:`center`});let i=C(`text`);y(i,`style`,()=>({fontSize:24,fontWeight:`700`,color:Y().text}));let a=k(`What should we work on?`);v(i,a);let o=C(`input`);D(o,`testID`,`new-message`),y(o,`value`,()=>p()),D(o,`onChange`,e=>p.set(e.value)),D(o,`multiline`,!0),y(o,`readonly`,()=>S.busy()),D(o,`placeholder`,`Describe the task (optional)`),D(o,`accessibilityLabel`,`First message`),y(o,`style`,()=>({borderWidth:1,borderRadius:12,paddingHorizontal:12,paddingTop:10,paddingBottom:10,fontSize:16,minHeight:96,backgroundColor:Y().surface,borderColor:Y().border,color:Y().text,placeholderColor:Y().muted}));let s=C(`view`);return D(s,`style`,{flexDirection:`row`,flexWrap:`wrap`,alignItems:`center`,gap:8}),w(s,[b(Er,{testID:`new-host`,icon:`🖥`,get label(){return j()?j().name:oe()?`Loading...`:`No host`},get disabled(){return A().length<2||S.busy()},onPress:()=>f.set(!0)}),b(Lr,{get host(){return j()},get value(){return P()},onChange:e=>{let t=j();t&&N.set({key:t.id,value:e})},owner:!0,showAccess:!0,get unsandboxed(){return!!j()?.capabilities.unsandboxed},data:n})]),v(r,i),v(r,o),v(r,s),w(r,[b(kr,{testID:`new-visibility`,get value(){return m()},onChange:e=>m.set(e),options:[{value:`workspace`,label:`Workspace`},{value:`private`,label:`Private`}]}),b($,{get children(){return m()===`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.`}}),(e=>x(e,()=>(e=>b(Z,{get tone(){return e().tone},get title(){return e().title},get actions(){return e().retry?b(X,{small:!0,label:`Retry`,get onPress(){return e().retry}}):e().refresh?B():void 0},get children(){return(t=>x(t,()=>(e=>b(te,{testID:`new-trust`,get checked(){return _()===e().id},get disabled(){return S.busy()},onChange:t=>_.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=C(`text`);return y(t,`style`,()=>({flex:1,fontSize:14,lineHeight:20,color:Y().text})),w(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)))(()=>se()),x(()=>j()?.capabilities.unsandboxed,()=>b(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.`}})),x(()=>j()&&F(),()=>b($,{get children(){return`${V(j())} · ${j().name} · ${F()?.name??``} · ${ne()?`Hosted by ${j().ownerName}`:`Your host`}, ${j().workspaceIds.includes(e.workspace.id)?`shared with this workspace`:`private`}${O()?.length?` · ${O().length===1?`1 repository`:`${O().length} repositories`}`:``}`}})),b(Or,{get error(){return S.error()}}),b(X,{testID:`new-start`,variant:`primary`,icon:`↑`,label:`Start session`,get busy(){return S.busy()},get disabled(){return!ae()},onPress:()=>void z()}),x(()=>S.busy(),()=>b($,{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(Ar,{get open(){return f()},title:`Host`,get value(){return j()?.id},onClose:()=>f.set(!1),onSelect:e=>d.set(e),get options(){return A().map(e=>({value:e.id,label:e.name,hint:`${e.ownerId===t.id?`Your host`:`${e.ownerName}'s host`} · ${V(e)}`}))}})]),r})()}function Xr(e){let t=h(``),n=q();function r(){let r=t().trim();r&&!n.busy()&&n.run(async()=>{let t=await K().api(`/api/sessions/${H(r)}`);e.onOpen(t.session.id)})}return(()=>{let e=C(`scroll`);D(e,`style`,{flex:1}),D(e,`contentStyle`,{gap:12,padding:20,width:`100%`,maxWidth:560,alignSelf:`center`});let i=C(`input`);return D(i,`testID`,`open-session-id`),y(i,`value`,()=>t()),D(i,`onChange`,e=>t.set(e.value)),D(i,`autoFocus`,!0),D(i,`autoCapitalize`,`none`),D(i,`autoCorrect`,!1),D(i,`returnKeyType`,`go`),D(i,`onSubmit`,r),D(i,`accessibilityLabel`,`Session ID`),y(i,`style`,()=>({borderWidth:1,borderRadius:10,paddingHorizontal:12,paddingVertical:10,fontSize:16,backgroundColor:Y().surface,borderColor:Y().border,color:Y().text})),v(e,i),w(e,b($,{get children(){return`Session ID — ask the session owner for its ID`}}),i),w(e,[b(Or,{get error(){return n.error()}}),b(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 Zr=f.desktop||f.os===`web`;function Qr(e){return Zr?{header:b($r,{get title(){return e.title},get onBack(){return e.onBack},get actions(){return e.actions},get leading(){return e.leading}})}:{headerLeft:e.leading,headerRight:e.actions}}function $r(e){return(()=>{let t=C(`view`);D(t,`desktop`,{windowDrag:!0}),y(t,`style`,()=>({flexDirection:`row`,alignItems:`center`,gap:8,minHeight:52,paddingHorizontal:12,borderBottomWidth:1,borderColor:Y().border,backgroundColor:Y().surface}));let n=C(`text`);return D(n,`role`,`header`),y(n,`style`,()=>({flex:1,numberOfLines:1,fontSize:17,fontWeight:`700`,color:Y().text})),w(n,()=>e.title),v(t,n),w(t,[x(()=>e.onBack,()=>b(A,{testID:`header-back`,accessibilityLabel:`Back`,onPress:()=>e.onBack?.(),hitSlop:8,style:{paddingHorizontal:6,paddingVertical:6,borderRadius:8},activeStyle:{opacity:.6},get children(){return(()=>{let e=C(`text`);y(e,`style`,()=>({fontSize:17,color:Y().text}));let t=k(`‹ Back`);return v(e,t),e})()}})),()=>e.leading],n),w(t,()=>e.actions),t})()}function ei(e){return`${e.number===void 0?`PR`:`PR #${e.number}`}${e.state?` ${vn[e.state]}`:``}`}function ti(e){let{user:t}=g(K),n=fr(),r=h(``),a=h(!1),o=()=>n.sessions().filter(e=>e.status===`archived`).length,s=i(()=>{let e=r().trim().toLowerCase(),t=/* @__PURE__ */ new Map;for(let r of n.sessions()){if(r.status===`archived`&&!a()||e&&!r.title.toLowerCase().includes(e))continue;let n=t.get(r.workspaceId);n?n.push(r):t.set(r.workspaceId,[r])}let i=n.workspaces().map(e=>e.id),o=e=>{let t=i.indexOf(e);return t<0?i.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=h(!1);function l(){c.set(!0),n.refreshSessions(),n.refreshWorkspaces()}let u=()=>c()&&n.sessionsReloading();return x(()=>!n.sessionsLoading(),()=>b(T,{get each(){return s()},keyExtractor:e=>e.key,testID:`session-list`,style:{flex:1},get refreshing(){return u()},onRefresh:l,header:()=>(()=>{let e=C(`view`);D(e,`style`,{gap:8,padding:16,paddingBottom:4});let t=C(`input`);return y(t,`value`,()=>r()),D(t,`onChange`,e=>r.set(e.value)),D(t,`placeholder`,`Search sessions`),D(t,`accessibilityLabel`,`Search sessions by title`),D(t,`autoCorrect`,!1),D(t,`autoCapitalize`,`none`),D(t,`testID`,`session-search`),y(t,`style`,()=>({borderWidth:1,borderRadius:10,paddingHorizontal:12,paddingVertical:9,fontSize:16,borderColor:Y().border,backgroundColor:Y().surface,color:Y().text,placeholderColor:Y().muted})),v(e,t),w(e,[x(()=>o()>0,()=>(()=>{let e=C(`view`);return D(e,`style`,{flexDirection:`row`}),w(e,b(X,{small:!0,variant:`ghost`,icon:`🗄`,get label(){return a()?`Hide archived`:`Show archived (${o()})`},onPress:()=>a.update(e=>!e)})),e})()),x(()=>n.sessionsError(),()=>b(Z,{tone:`danger`,title:`Could not load sessions`,get actions(){return b(X,{small:!0,label:`Try again`,get onPress(){return n.refreshSessions}})},get children(){return n.sessionsError()}}))]),e})(),empty:()=>x(()=>n.sessions().length>0,()=>b(Q,{get title(){return!r().trim()&&!a()?`All sessions are archived`:`No matching sessions`}}),()=>b(Q,{title:`No sessions yet`,get action(){return b(X,{label:`Start a session`,icon:`+`,get onPress(){return e.onNew}})}})),get children(){return n=>(r=>x(r,()=>(n=>b(ni,{get item(){return n()},get userId(){return t.id},get selected(){return n().id===e.selectedId},get onOpen(){return e.onOpen}}))(r),()=>(()=>{let e=C(`text`);return y(e,`style`,()=>({numberOfLines:1,fontSize:13,fontWeight:`600`,textTransform:`uppercase`,paddingHorizontal:16,paddingTop:16,paddingBottom:6,color:Y().muted})),w(e,()=>n().kind===`workspace`?n().title:``),e})()))(()=>n().kind===`session`?n().session:null)}}),()=>b(Dr,{}))}function ni(e){let t=fr(),n=()=>{let n=t.liveActivity();return wt(e.item,n?.sessionId===e.item.id?n.activity:void 0)},r=()=>e.item.ownerId===e.userId,i=()=>!r()&&!!e.item.permissions?.includes(`read`)&&(e.item.permissions??[]).every(e=>e===`read`),a=()=>{let t=e.item.pullRequest,n=t?.state&&yn[t.state];return n&&n!==`neutral`?Y().tones[n===`merged`?`running`:n].text:Y().muted};return b(A,{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:`center`,gap:12,paddingHorizontal:16,paddingVertical:12,borderBottomWidth:1,borderColor:Y().border,backgroundColor:e.selected?Y().selection:Y().surface}},get activeStyle(){return{backgroundColor:Y().selection}},get hoverStyle(){return{backgroundColor:Y().surfaceRaised}},get children(){return[x(()=>n().icon===`clock`,()=>(()=>{let t=C(`text`);y(t,`testID`,()=>`session-scheduled-${e.item.id}`),y(t,`style`,()=>({width:12,fontSize:11,color:Y().tones[n().tone].text}));let r=k(`◷`);return v(t,r),t})(),()=>(()=>{let t=C(`view`);return y(t,`accessibilityLabel`,()=>n().label?void 0:e.item.status),y(t,`style`,()=>({width:8,height:8,borderRadius:4,backgroundColor:Y().tones[n().tone].text})),t})()),(()=>{let t=C(`view`);D(t,`style`,{flex:1,gap:2});let o=C(`text`);y(o,`style`,()=>({numberOfLines:1,fontSize:16,fontWeight:`500`,color:Y().text})),w(o,()=>e.item.title);let s=C(`text`);y(s,`style`,()=>({numberOfLines:1,fontSize:13,color:Y().muted}));let c=C(`text`);return w(c,()=>`${r()?`Yours`:i()?`Viewer`:`Shared`} · ${e.item.visibility===`workspace`?`Workspace-visible`:`Private`} · ${Hr(e.item.createdAt)}`),v(s,c),w(s,[x(()=>n().label,()=>[(()=>{let t=C(`text`);return y(t,`testID`,()=>`session-status-${e.item.id}`),y(t,`style`,()=>({fontWeight:`600`,color:Y().tones[n().tone].text})),w(t,()=>n().label),t})(),(()=>{let e=C(`text`);return w(e,` · `),e})()]),(t=>x(t,()=>(t=>[(()=>{let n=C(`text`);return y(n,`testID`,()=>`session-pull-${e.item.id}`),y(n,`style`,()=>({color:a()})),w(n,()=>ei(t())),n})(),(()=>{let e=C(`text`);return w(e,` · `),e})()])(t)))(()=>e.item.pullRequest)],c),v(t,o),v(t,s),t})(),(()=>{let e=C(`text`);y(e,`style`,()=>({fontSize:16,color:Y().muted}));let t=k(`›`);return v(e,t),e})()]}})}function ri(e){let t=cr(()=>{let t=e();return t?`/api/workspaces/${H(t)}/members`:null});return i(()=>{let{user:e}=K(),n=(t.data()?.members??[]).map(Dt);return n.some(t=>t.id===e.id)||n.push({id:e.id,githubLogin:e.githubLogin}),{person:At(n)}})}const ii=a(null);function ai(){let e=ii();return(t,n)=>{let{user:r}=K();return n&&t===r.id?`you`:e?Ot(e().person(t)):t===r.id?Ot({id:t,githubLogin:r.githubLogin}):Ot({id:t})}}const oi={pending:`warning`,approved:`info`,executing:`running`,executed:`success`,denied:`neutral`,interrupted:`warning`,failed:`danger`},si={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.`},ci=[`bash`,`git`,`node`,`python`,`rust`,`go`,`dotnet`,`browser`,`make`,`git_commit`,`git_push`,`github_comment`,`github_merge`,`github_issue`,`host_bash`,`git_repin`],li={merge:`Merge commit`,squash:`Squash and merge`,rebase:`Rebase and merge`};function ui(e){return(()=>{let t=C(`view`);D(t,`selectable`,!0),y(t,`style`,()=>({borderRadius:8,padding:10,backgroundColor:Y().code}));let n=C(`text`);return y(n,`testID`,()=>e.testID),y(n,`style`,()=>({fontFamily:Sr,fontSize:12,lineHeight:17,color:Y().text})),w(n,()=>e.children),v(t,n),t})()}function di(e){return(()=>{let t=C(`view`);D(t,`style`,{flexDirection:`row`,gap:8});let n=C(`text`);y(n,`style`,()=>({width:96,fontSize:13,color:Y().muted})),w(n,()=>e.label);let r=C(`view`);D(r,`selectable`,!0),D(r,`style`,{flex:1});let i=C(`text`);return y(i,`style`,()=>({fontFamily:Sr,fontSize:13,color:Y().text})),w(i,()=>e.children),v(r,i),v(t,n),v(t,r),t})()}function fi(){return(()=>{let e=C(`text`);D(e,`testID`,`approval-secret-note`),y(e,`style`,()=>({fontSize:13,lineHeight:18,color:Y().text}));let t=k(`Something that looks like a secret is shown as `),n=k(`. Allowing or approving this uses the real value, so make sure it belongs here.`);return v(e,t),v(e,n),w(e,U,n),e})()}function pi(e){return[(()=>{let t=C(`text`);y(t,`style`,()=>({fontSize:14,lineHeight:20,color:Y().text}));let n=C(`text`);D(n,`style`,{fontFamily:Sr}),w(n,()=>e.request.tool);let r=k(` `);return v(t,n),v(t,r),w(t,()=>e.pending?`needs the session owner's permission for:`:`asked the session owner's permission for:`),t})(),S(()=>e.request.needs,e=>(()=>{let t=C(`text`);y(t,`style`,()=>({fontSize:13,color:Y().text}));let n=k(`• `);return v(t,n),w(t,()=>si[e()]),t})()),(e=>x(e,()=>(e=>b(ui,{get children(){return e()}}))(e)))(()=>e.request.target),x(()=>e.pending&&hn(e.request.target),()=>b(fi,{})),x(()=>e.pending&&ci.includes(e.request.tool),()=>b($,{get children(){return`Allowing it doesn't run anything yet: the operation still gets its own approval, unless the message auto-approves.`}}))]}function mi(e){return(()=>{let t=C(`view`);return D(t,`style`,{gap:4}),w(t,[b(di,{label:`Repository`,get children(){return e.operation.repository}}),x(()=>e.operation.tag!==void 0,()=>b(di,{label:`New tag`,get children(){return e.operation.tag??``}})),b(di,{get label(){return e.operation.tag===void 0?`Branch`:`On branch (not moved)`},get children(){return e.operation.branch}}),b(di,{label:`Commit`,get children(){return e.operation.commit.slice(0,12)}}),(e=>x(e,()=>(e=>b(di,{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=C(`view`);D(n,`style`,{gap:4});let r=C(`view`);D(r,`style`,{flexDirection:`row`,gap:8});let i=C(`text`);y(i,`style`,()=>({width:96,fontSize:13,color:Y().muted}));let a=k(`Pull request`);v(i,a);let o=C(`text`);D(o,`role`,`link`),D(o,`onPress`,()=>void d(t()).catch(()=>void 0)),y(o,`style`,()=>({fontFamily:Sr,fontSize:13,textDecorationLine:`underline`,color:Y().tones.info.text}));let s=k(`#`);return v(o,s),w(o,()=>e.operation.repository,s),w(o,()=>e.operation.pull),v(r,i),v(r,o),v(n,r),w(n,[b(di,{label:`Head commit`,get children(){return e.operation.sha.slice(0,12)}}),b(di,{label:`Method`,get children(){return li[e.operation.method]}})]),n})()}function gi(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 _i(e){let t=ai(),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=()=>{let e=n();return e.kind===`permission`?`Permission`:e.kind===`extension.tool`?`Extension tool · ${e.tool}`:e.kind},a=()=>n().kind===`git.repin`&&e.approval.status===`executed`?gi(e.approval.result):null;return b(Tr,{get testID(){return`approval-${e.approval.id}`},get children(){return[(()=>{let t=C(`view`);D(t,`style`,{flexDirection:`row`,flexWrap:`wrap`,alignItems:`center`,gap:6});let r=C(`text`);y(r,`style`,()=>({fontSize:14,fontWeight:`700`,color:Y().text})),w(r,()=>i());let a=C(`view`);return D(a,`style`,{flex:1}),v(t,r),v(t,a),w(t,[x(()=>e.approval.unbounded,()=>b(wr,{tone:`warning`,get children(){return`No resource limits`}})),x(()=>hn(n()),()=>b(wr,{tone:`warning`,get children(){return`Secret hidden`}})),x(()=>e.approval.automatic,()=>b(wr,{tone:`warning`,get children(){return`Auto-approved`}})),b(wr,{get tone(){return oi[e.approval.status]},get dot(){return e.approval.status===`executing`},get children(){return e.approval.status}})]),t})(),(t=>x(t,()=>(t=>b(pi,{get request(){return t()},get pending(){return e.approval.status===`pending`}}))(t),()=>[(e=>x(e,()=>(e=>b(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=>x(e,()=>(e=>b(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=>x(e,()=>(e=>b(Z,{tone:`danger`,title:`Runs on the host, outside the sandbox`,get children(){return pt(e())}}))(e)))(()=>n().kind===`extension.tool`?n():null),(e=>x(e,()=>(e=>b(mi,{get operation(){return e()}}))(e)))(()=>n().kind===`git.push`?n():null),(e=>x(e,()=>(e=>b(hi,{get operation(){return e()}}))(e)))(()=>n().kind===`github.merge`?n():null),b(ui,{testID:`approval-operation`,get children(){return(()=>{let e=n();return e.kind===`extension.tool`?mt(e):JSON.stringify(e,null,2)})()}}),x(()=>e.approval.status===`pending`&&hn(n()),()=>b(fi,{}))]))(()=>n().kind===`permission`?n():null),b($,{get children(){return`Requested by ${t(e.approval.requestedBy)} · ${Ur(e.approval.createdAt)}${e.approval.automatic?` · ${ht(n())}`:r()}`}}),(e=>x(e,()=>(e=>b(ui,{testID:`approval-result`,get children(){return e()}}))(e)))(()=>e.approval.result),(t=>x(t,()=>(t=>(()=>{let n=C(`view`);return D(n,`style`,{flexDirection:`row`}),w(n,b(X,{testID:`approval-open-repin`,small:!0,label:`Open repinned session`,onPress:()=>e.onOpenSession?.(t())})),n})())(t)))(()=>e.onOpenSession&&a()),()=>e.children]}})}function vi(e){let t=()=>!e.disabled&&!e.busy&&e.value.trim()!==``;return(()=>{let n=C(`view`);D(n,`style`,{gap:8});let r=C(`view`);y(r,`style`,()=>({flexDirection:`row`,alignItems:`flex-end`,gap:8,borderWidth:1,borderRadius:20,paddingLeft:14,paddingRight:6,paddingVertical:6,borderColor:Y().border,backgroundColor:Y().surface}));let i=C(`input`);return D(i,`testID`,`composer-input`),y(i,`value`,()=>e.value),D(i,`onChange`,t=>e.onChange(t.value)),D(i,`multiline`,!0),y(i,`readonly`,()=>e.busy||e.disabled),y(i,`placeholder`,()=>e.placeholder),y(i,`accessibilityLabel`,()=>e.placeholder),y(i,`style`,()=>({flex:1,fontSize:16,lineHeight:21,maxHeight:160,paddingTop:6,paddingBottom:6,color:Y().text,placeholderColor:Y().muted})),v(r,i),w(r,[x(()=>e.onStop,()=>b(A,{testID:`composer-stop`,get accessibilityLabel(){return e.stopping?`Stopping...`:`Stop`},get disabled(){return e.stopping},onPress:()=>e.onStop?.(),get style(){return{width:34,height:34,borderRadius:17,alignItems:`center`,justifyContent:`center`,borderWidth:1,borderColor:Y().border}},activeStyle:{opacity:.7},disabledStyle:{opacity:.35},get children(){return(()=>{let e=C(`text`);y(e,`style`,()=>({fontSize:14,color:Y().text}));let t=k(`■`);return v(e,t),e})()}})),b(A,{testID:`composer-send`,get accessibilityLabel(){return e.busy?`Sending...`:e.sendLabel},get disabled(){return!t()},get onPress(){return e.onSubmit},get style(){return{width:34,height:34,borderRadius:17,alignItems:`center`,justifyContent:`center`,backgroundColor:Y().primary}},activeStyle:{opacity:.7},disabledStyle:{opacity:.35},get children(){return(()=>{let t=C(`text`);return y(t,`style`,()=>({fontSize:18,fontWeight:`700`,color:Y().onPrimary})),w(t,()=>e.busy?`…`:`↑`),t})()}})]),v(n,r),w(n,[x(()=>e.tools,()=>(()=>{let t=C(`view`);return D(t,`style`,{flexDirection:`row`,flexWrap:`wrap`,alignItems:`center`,gap:8}),w(t,()=>e.tools),t})()),b($,{get children(){return e.hint}})]),n})()}function yi(e){let t=q(),n=()=>void t.run(async()=>{await K().api(`/api/sessions/${H(e.sessionId)}/restart`,{method:`POST`}),e.onRestarted()});return x(()=>e.preparation.status===`failed`,()=>[b(Z,{tone:`danger`,title:`Repositories could not be prepared`,get actions(){return x(()=>e.canRestart,()=>b(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.`}`}}),b(Or,{get error(){return t.error()}})],()=>b(Tr,{testID:`repository-preparation`,get children(){return[(()=>{let e=C(`text`);D(e,`role`,`header`),y(e,`style`,()=>({fontSize:14,fontWeight:`700`,color:Y().text}));let t=k(`Preparing repositories…`);return v(e,t),e})(),S(()=>e.preparation.items,e=>(()=>{let t=C(`view`);D(t,`style`,{gap:6});let n=C(`view`);D(n,`style`,{flexDirection:`row`,flexWrap:`wrap`,alignItems:`baseline`,columnGap:8,rowGap:2});let r=C(`text`);y(r,`style`,()=>({numberOfLines:1,flexShrink:1,fontFamily:Sr,fontSize:13,color:Y().text})),w(r,()=>e().path),v(n,r),w(n,b($,{get children(){return xt(e())}}));let i=C(`view`);D(i,`role`,`progressbar`),y(i,`accessibilityLabel`,()=>`${e().path}: ${xt(e())}`),y(i,`style`,()=>({height:6,borderRadius:3,overflow:`hidden`,backgroundColor:Y().code}));let a=C(`view`);return y(a,`style`,()=>({height:`100%`,borderRadius:3,width:`${bt(e())??30}%`,backgroundColor:Y().tones.running.text})),v(i,a),v(t,n),v(t,i),t})(),e=>e.path),b($,{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 bi(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(``)}`}function xi(e,t,n){let r=e.actorId?n(e.actorId,!0):``,{prose:i,calls:a}=e.role===`assistant`?je(e.text):{prose:e.text,calls:[]},o=a.length>0?`Tool · ${a[0].name}`:``,s=bi(e.autoApproved);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(o&&!i.trim()||e.role===`system`||e.role===`toolResult`){let t=o||(e.role===`toolResult`?`Tool result`:`System`),n=e.role===`toolResult`&&e.durationMs!==void 0?` · ${Rr(e.durationMs)}`:``,i=e.trimmed&&e.role===`toolResult`&&e.text.trim()?` · ${e.text}`:``;return{kind:`tool`,label:`${t}${n}${r?` · ${r}`:``}${s}${i}`,text:e.text,trimmed:e.trimmed}}if(e.error)return e.error.compaction?{kind:`error`,title:`Context compaction failed`,text:Xe(e.error.compaction),by:r}:{kind:`error`,title:`Model request failed`,text:Wr(e.error),by:r};if(e.role===`user`)return{kind:`user`,text:e.text,meta:r&&e.actorId!==t?`by ${r}`:``};let c=e.durationMs===void 0?``:Rr(e.durationMs);return{kind:`assistant`,prose:i,tool:o?{label:`${o}${s}`,text:a.map(e=>e.line).join(`
12
+ `)}:null,meta:[r&&`by ${r}`,c].filter(Boolean).join(` · `)}}function Si(e){return(()=>{let t=C(`view`);return y(t,`style`,()=>({borderRadius:10,borderWidth:1,overflow:`hidden`,borderColor:Y().border,backgroundColor:Y().surface})),w(t,[b(A,{get accessibilityLabel(){return e.label},get onPress(){return e.onToggle},style:{flexDirection:`row`,alignItems:`center`,gap:8,paddingHorizontal:10,paddingVertical:8},activeStyle:{opacity:.6},get children(){return[(()=>{let e=C(`text`);y(e,`style`,()=>({fontSize:13,color:Y().muted}));let t=k(`⚙`);return v(e,t),e})(),(()=>{let t=C(`text`);return y(t,`style`,()=>({flex:1,numberOfLines:2,fontSize:13,color:Y().muted})),w(t,()=>e.label),t})(),(()=>{let t=C(`text`);return y(t,`style`,()=>({fontSize:13,color:Y().muted})),w(t,()=>e.open?`▾`:`▸`),t})()]}}),x(()=>e.open,()=>[(()=>{let t=C(`view`);D(t,`selectable`,!0),y(t,`style`,()=>({borderTopWidth:1,borderColor:Y().border,padding:10}));let n=C(`text`);return y(n,`style`,()=>({fontFamily:Sr,fontSize:12,lineHeight:17,color:Y().text})),w(n,()=>e.text),v(t,n),t})(),(e=>x(e,()=>(e=>(()=>{let t=C(`text`);return y(t,`style`,()=>({fontSize:12,padding:10,color:Y().muted})),w(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 web app's session details.`),t})())(e)))(()=>e.trimmed)])]),t})()}function Ci(e){let t=()=>!!e.onActions&&rt(e.entry)!==``;return x(()=>e.meta||t(),()=>(()=>{let n=C(`view`);return y(n,`style`,()=>({flexDirection:`row`,alignItems:`center`,gap:10,justifyContent:e.end?`flex-end`:`flex-start`})),w(n,[x(()=>e.meta,()=>(()=>{let t=C(`text`);return y(t,`style`,()=>({fontSize:12,color:Y().muted})),w(t,()=>e.meta),t})()),x(()=>t(),()=>b(A,{accessibilityLabel:`Message actions`,hitSlop:10,onPress:()=>e.onActions?.(e.entry),activeStyle:{opacity:.5},get children(){return(()=>{let e=C(`text`);y(e,`style`,()=>({fontSize:16,color:Y().muted}));let t=k(`⋯`);return v(e,t),e})()}}))]),n})())}function wi(e){let t=ai(),n=i(()=>xi(e.entry,e.userId,t)),r=()=>e.expanded(e.entry.id);return(()=>{let t=C(`view`);return D(t,`style`,{gap:6,paddingBottom:14}),w(t,[(e=>x(e,()=>(e=>(()=>{let t=C(`view`);D(t,`style`,{flexDirection:`row`,alignItems:`center`,gap:10});let n=C(`view`);y(n,`style`,()=>({flex:1,height:1,backgroundColor:Y().border}));let r=C(`text`);y(r,`style`,()=>({flexShrink:1,textAlign:`center`,fontSize:12,color:Y().muted})),w(r,()=>e().text);let i=C(`view`);return y(i,`style`,()=>({flex:1,height:1,backgroundColor:Y().border})),v(t,n),v(t,r),v(t,i),t})())(e)))(()=>n().kind===`stopped`?n():null),(t=>x(t,()=>(t=>b(Si,{get label(){return t().label},get text(){return t().text},get trimmed(){return t().trimmed},get open(){return r()},onToggle:()=>e.toggle(e.entry.id)}))(t)))(()=>n().kind===`tool`?n():null),(e=>x(e,()=>(e=>[b(Z,{tone:`danger`,get title(){return e().title},get children(){return e().text}}),x(()=>e().by,()=>(()=>{let t=C(`text`);y(t,`style`,()=>({fontSize:12,color:Y().muted}));let n=k(`by `);return v(t,n),w(t,()=>e().by),t})())])(e)))(()=>n().kind===`error`?n():null),(t=>x(t,()=>(t=>(()=>{let n=C(`view`);D(n,`style`,{alignItems:`flex-end`,gap:6});let r=C(`view`);D(r,`selectable`,!0),y(r,`style`,()=>({borderRadius:16,paddingHorizontal:14,paddingVertical:9,maxWidth:`88%`,backgroundColor:Y().userBubble}));let i=C(`text`);return y(i,`style`,()=>({fontSize:16,lineHeight:22,color:Y().onUserBubble})),w(i,()=>t().text),v(r,i),v(n,r),w(n,b(Ci,{get entry(){return e.entry},get meta(){return t().meta},get onActions(){return e.onActions},end:!0})),n})())(t)))(()=>n().kind===`user`?n():null),(t=>x(t,()=>(t=>[x(()=>t().prose.trim(),()=>b(F,{get markdown(){return t().prose},selectable:!0,options:{streaming:!0}})),(t=>x(t,()=>(t=>b(Si,{get label(){return t().label},get text(){return t().text},get trimmed(){return e.entry.trimmed},get open(){return r()},onToggle:()=>e.toggle(e.entry.id)}))(t)))(()=>t().tool),b(Ci,{get entry(){return e.entry},get meta(){return t().meta},get onActions(){return e.onActions}})])(t)))(()=>n().kind===`assistant`?n():null)]),t})()}function Ti(e){let t=h(null),r=h(null),i=h(``),a=h(`connecting`),s=h(0),c=()=>{},l=async e=>{},u=/* @__PURE__ */ new Set;return o(()=>{bn();for(let e of[...u])e()}),o(()=>{s();let{api:o,origin:d,token:f}=g(K);a.set(`connecting`);let p=Je(e,{session:e=>t.set(e),view:e=>r.set(e),error:e=>i.set(e),status:e=>a.set(e)},{api:o,openEvents:e=>Et({fetch:(e,t)=>fetch(e,f?t:{...t,credentials:`same-origin`}),url:`${d&&f?d:``}${e}`,headers:f?{Authorization:`Bearer ${f}`}:{}}),hidden:sr,onVisibilityChange(e){return u.add(e),()=>u.delete(e)}});c=p.refresh,l=p.loadOlder,n(()=>{p.stop(),c=()=>{},l=async()=>{}})}),{session:t,view:r,error:i,status:a,refresh:()=>c(),loadOlder:e=>l(e),reconnect:()=>s.update(e=>e+1)}}function Ei(e){return(()=>{let t=C(`scroll`);return y(t,`testID`,()=>e.testID),D(t,`style`,{flex:1}),D(t,`contentStyle`,{gap:12,padding:16}),w(t,()=>e.children),t})()}function Di(e){return b(Q,{title:`Not here yet`,get children(){return`${e.what} is still being moved to this app.`}})}function Oi(e){return b(Ei,{testID:`panel-browser`,get children(){return b(Di,{what:`The Browser tab`})}})}function ki(e){return b(Ei,{testID:`panel-connections`,get children(){return b(Di,{what:`The Connections tab`})}})}function Ai(e){return b(Ei,{testID:`panel-files`,get children(){return b(Di,{what:`The Files tab`})}})}function ji(e){return b(Ei,{testID:`panel-overview`,get children(){return b(Di,{what:`The session's details`})}})}function Mi(e){return b(Ei,{testID:`panel-schedules`,get children(){return b(Di,{what:`The Schedules tab`})}})}function Ni(e){return b(Ei,{testID:`panel-sharing`,get children(){return b(Di,{what:`The Sharing tab`})}})}const Pi=[{id:`overview`,label:`Overview`,Component:ji},{id:`files`,label:`Files`,Component:Ai},{id:`browser`,label:`Browser`,Component:Oi},{id:`connections`,label:`Connections`,Component:ki},{id:`schedules`,label:`Schedules`,Component:Mi},{id:`sharing`,label:`Sharing`,Component:Ni}];function Fi(e){let t=h(Pi[0].id);return b(P,{get open(){return e.open},get side(){return f.desktop?`right`:`bottom`},closeOnSwipe:!0,onOpenChange:t=>{t.open||e.onClose()},get backdropStyle(){return{backgroundColor:Y().backdrop}},get popupStyle(){return f.desktop?{width:520,maxWidth:`100%`,height:`100%`,backgroundColor:Y().background}:{height:`92%`,borderTopLeftRadius:16,borderTopRightRadius:16,backgroundColor:Y().background}},get children(){return(()=>{let n=C(`view`);D(n,`testID`,`session-panel`),D(n,`style`,{flex:1});let r=C(`view`);y(r,`style`,()=>({gap:8,paddingHorizontal:16,paddingVertical:10,borderBottomWidth:1,borderColor:Y().border,backgroundColor:Y().surface}));let i=C(`view`);D(i,`style`,{flexDirection:`row`,alignItems:`center`});let a=C(`text`);y(a,`style`,()=>({flex:1,fontSize:17,fontWeight:`700`,color:Y().text}));let o=k(`Session`);v(a,o),v(i,a),w(i,b(X,{small:!0,variant:`ghost`,label:`Done`,get onPress(){return e.onClose}}));let s=C(`scroll`);return D(s,`horizontal`,!0),D(s,`scrollbar`,!1),w(s,b(kr,{testID:`session-panel-tabs`,get value(){return t()},onChange:e=>t.set(e),get options(){return Pi.map(e=>({value:e.id,label:e.label}))}})),v(r,i),v(r,s),v(n,r),w(n,S(()=>[t()],t=>{let n=Pi.find(e=>e.id===t()).Component;return b(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 Ii(t){let{user:r}=g(K),a=fr(),s=Ti(t.id),c=h(!1),l=h(!1),u=()=>s.session()?.permissions??[],d=()=>s.session()?.status===`archived`,f=()=>d()||s.session()?.frozen===!0,p=()=>u().includes(`approve`)&&!f(),m=()=>s.session()?.ownerId===r.id,_=cr(()=>{let e=s.session();return e?.connectorId?`/api/workspaces/${H(e.workspaceId)}/connectors`:null},1e4),T=()=>_.data()?.connectors.find(e=>e.id===s.session()?.connectorId),E;o(()=>{let e=T()?.online;E===!1&&e&&s.refresh(),E=e});let O=q(),k=q(),ee=()=>s.session()??a.sessions().find(e=>e.id===t.id),A=ri(()=>ee()?.workspaceId??null),j=()=>ee()?.title??`Session`,N=()=>{let e=ee();return e?a.workspaces().find(t=>t.id===e.workspaceId):void 0},P=()=>{let e=s.session();return!!(e&&Nt(r.id,e.ownerId,N()?.role))},te=()=>s.view()?.approvals??[],F=i(()=>te().filter(e=>e.status===`pending`)),ne=()=>f()?void 0:s.view()?.extensions?.unavailable?.find(e=>e.source===`piki:browser`&&[`missing`,`failed`,`downloading`].includes(e.reason)),I=h(!1);o(()=>{let e=s.view()?.activity;a.setLiveActivity(e?{sessionId:t.id,activity:e}:null)}),n(()=>{a.setLiveActivity(null),a.refreshSessions()});function re(e){let t=s.session()??{};if(f())return!1;if(at(e.operation,t,e.unbounded))return dt(e.operation,t,T(),r.id,u().includes(`approve`));let n=e.operation.kind===`permission`||e.operation.kind===`git.repin`;return p()&&(!n||m())}async function L(e,n,r,i=!1){if(!re(e)||k.busy()||!e.reviewHash||e.status!==`pending`)return;let a=e.operation.kind===`permission`?n===`deny`?`Not allowed`:r===`session`?`Allowed for the rest of the session`:`Allowed for this call`:i?`Approved. ${(e=>Ot(A().person(e)))(e.requestedBy)}'s requests here now run without asking; stop it under Approvals.`:n===`approve`?`Approval decision recorded`:`Operation denied`;await k.run(async()=>{await K().api(`/api/sessions/${H(t.id)}/approvals/${H(e.id)}`,{method:`POST`,body:{decision:n,reviewHash:e.reviewHash,...r?{scope:r}:{},...i?{alwaysApprove:!0}:{}}}),s.refresh()},a)}function ie(){O.run(async()=>{await K().api(`/api/sessions/${H(t.id)}/unarchive`,{method:`POST`}),s.refresh(),a.refreshSessions()},`Session unarchived`)}let R=()=>void O.run(()=>e.writeText(t.id),`Session ID copied`),ae=()=>!s.view()&&!(!s.session()||s.session().status!==`error`&&s.session().status!==`provisioning`),z=()=>{if(d())return{text:`Archived`,dot:!1};if(ae())return s.session()?.status===`error`?{tone:`danger`,text:`Not started`,dot:!0}:{tone:`running`,text:`Starting`,dot:!0};if(!s.view()&&s.error())return{tone:`warning`,text:`Unavailable`,dot:!0};switch(s.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 e=C(`view`);return D(e,`style`,{flexDirection:`row`,alignItems:`center`,gap:4}),w(e,[b(Cr,{testID:`session-approvals`,icon:`🛡`,get label(){return F().length?`Approvals, ${F().length} pending`:`Approvals`},get badge(){return F().length},onPress:()=>c.set(!0),get disabled(){return!s.view()}}),b(Cr,{testID:`session-copy-id`,icon:`⧉`,label:`Copy session ID`,onPress:R}),b(Cr,{testID:`session-details`,icon:`ⓘ`,label:`Session details`,onPress:()=>l.set(!0)})]),e})(),B=e=>{let t=()=>e().operation.kind===`permission`,n=()=>st(e().operation,s.session()??{}),i=()=>at(e().operation,s.session()??{},e().unbounded),a=()=>t()||e().operation.kind===`git.repin`,o=()=>k.busy()||!e().reviewHash,c=()=>{let t=s.session();return!!(t&&ct(e(),t,T(),r.id))};return b(_i,{get approval(){return e()},get children(){return x(()=>re(e()),()=>[x(()=>!e().reviewHash,()=>b(Z,{tone:`warning`,title:`No verified review commitment`,get actions(){return b(X,{small:!0,label:`Refresh approval`,get disabled(){return k.busy()},get onPress(){return s.refresh}})},get children(){return`Refresh before deciding; the server must bind the displayed operation and requester.`}})),x(()=>t(),()=>(()=>{let t=C(`view`);return D(t,`style`,{flexDirection:`row`,flexWrap:`wrap`,gap:8}),w(t,[b(X,{small:!0,variant:`primary`,label:`Allow once`,get disabled(){return o()},onPress:()=>void L(e(),`approve`,`call`)}),x(()=>e().operation.kind!==`permission`||e().operation.tool!==`host_bash`,()=>b(X,{small:!0,label:`Allow for this session`,get disabled(){return o()},onPress:()=>void L(e(),`approve`,`session`)})),b(X,{small:!0,label:`Deny`,get disabled(){return o()},onPress:()=>void L(e(),`deny`)})]),t})(),()=>[(()=>{let t=C(`view`);return D(t,`style`,{flexDirection:`row`,flexWrap:`wrap`,gap:8}),w(t,[b(X,{testID:`approval-approve`,small:!0,variant:`primary`,label:`Approve`,get disabled(){return o()},onPress:()=>void L(e(),`approve`)}),x(()=>c(),()=>b(X,{testID:`approval-always`,small:!0,get label(){return`Always approve ${Ot(A().person(e().requestedBy))}`},get disabled(){return o()},onPress:()=>void L(e(),`approve`,void 0,!0)})),b(X,{testID:`approval-deny`,small:!0,label:`Deny`,get disabled(){return o()},onPress:()=>void L(e(),`deny`)})]),t})(),b($,{testID:`approval-hint`,get children(){return`Runs as ${n()?`the host OS user (outside the sandbox)`:s.view()?.owner.displayName??``} · each approval covers one exact operation and its arguments`}})])],()=>b($,{get children(){return i()?ft(e().operation,T()):a()?`Waiting for the session owner`:`Waiting for an authorized approver`}}))}})},V=(()=>{let e=C(`view`);return D(e,`style`,{gap:10,paddingTop:4}),w(e,[(e=>x(e,()=>(e=>b(yi,{get sessionId(){return t.id},get preparation(){return e()},get canRestart(){return m()&&!d()&&u().includes(`manage`)},onRestarted:()=>{s.refresh(),a.refreshSessions()}}))(e)))(()=>s.view()?.repositories),(e=>x(e,()=>(e=>b(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 b(X,{small:!0,label:`Dismiss`,onPress:()=>I.set(!0)})},get children(){return`The workspace has the browser tool on, but this session can't use it. ${_n(e().reason)}`}}))(e)))(()=>ne()&&u().includes(`write`)&&!I()?ne():null),x(()=>s.session()?.hostUnsandboxed&&(u().includes(`write`)||p()),()=>x(()=>s.session()?.hostEnvironment,()=>b(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.`}}),()=>b(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.`}}))),S(()=>F(),e=>B(e),e=>e.id),b(Or,{get error(){return k.error()},get notice(){return k.notice()}})]),e})(),se=b(ii.Provider,{value:A,get children(){return(()=>{let e=C(`view`);return y(e,`style`,()=>({flex:1,backgroundColor:Y().background})),w(e,[x(()=>!t.page,()=>(()=>{let e=C(`view`);y(e,`style`,()=>({flexDirection:`row`,alignItems:`center`,gap:8,paddingHorizontal:16,paddingVertical:8,minHeight:52,borderBottomWidth:1,borderColor:Y().border,backgroundColor:Y().surface}));let t=C(`text`);return y(t,`style`,()=>({flex:1,numberOfLines:1,fontSize:17,fontWeight:`700`,color:Y().text})),w(t,()=>j()),v(e,t),w(e,()=>oe()),e})()),(e=>x(e,()=>(e=>(()=>{let t=C(`view`);return y(t,`style`,()=>({flexDirection:`row`,flexWrap:`wrap`,alignItems:`center`,gap:6,paddingHorizontal:16,paddingVertical:8,borderBottomWidth:1,borderColor:Y().border})),w(t,[(e=>x(e,()=>(e=>b($,{get children(){return e()}}))(e)))(()=>N()?.name),b(wr,{get tone(){return z().tone},get dot(){return z().dot},get children(){return z().text}}),b(wr,{get children(){return e().visibility===`workspace`?`Workspace-visible`:`Private`}}),x(()=>e().linkShared,()=>b(wr,{tone:`info`,get children(){return`Link shared`}})),x(()=>T()&&!T().online,()=>b(wr,{tone:`warning`,dot:!0,get children(){return`Host offline`}})),b(Li,{get session(){return e()},get host(){return T()}})]),t})())(e)))(()=>s.session()),x(()=>d()||s.error()&&!ae()||O.error()||O.notice(),()=>(()=>{let e=C(`view`);return D(e,`style`,{gap:8,paddingHorizontal:16,paddingTop:8}),w(e,[x(()=>d(),()=>b(Z,{title:`Archived`,get actions(){return x(()=>P(),()=>b(X,{small:!0,label:`Unarchive`,get disabled(){return O.busy()},onPress:ie}))},get children(){return`This session is read-only. ${P()?`Unarchive it to continue the work.`:`Only its owner, or the workspace's owner or an admin, can unarchive it.`}`}})),x(()=>s.error()&&!ae(),()=>b(Z,{tone:`danger`,get title(){return s.session()?`Live updates interrupted`:`Unable to open session`},get actions(){return b(X,{small:!0,label:`Reconnect and check access`,get onPress(){return s.reconnect}})},get children(){return s.error()}})),b(Or,{get error(){return O.error()},get notice(){return O.notice()}})]),e})()),x(()=>s.view()&&s.session(),()=>b(zi,{get id(){return t.id},live:s,host:T,pinned:V,openSession:e=>{a.refreshSessions(),t.openSession(e)}}),()=>x(()=>s.error(),()=>(e=>x(e,()=>(e=>b(Bi,{get id(){return t.id},get session(){return e()},get error(){return s.error()},recovered:()=>{s.reconnect(),a.refreshSessions()}}))(e),()=>(()=>{let e=C(`view`);return D(e,`style`,{flex:1}),e})()))(()=>s.session()),()=>b(Dr,{}))),b(Fi,{get open(){return l()},onClose:()=>l.set(!1),get sessionId(){return t.id},get session(){return s.session},get view(){return s.view},get refresh(){return s.refresh},go:e=>{l.set(!1),t.go(e)}}),b(Ri,{get open(){return c()},get approvals(){return te()},get olderApprovals(){return s.view()?.olderApprovals},onClose:()=>c.set(!1),onOpenSession:e=>{c.set(!1),a.refreshSessions(),t.openSession(e)},get session(){return s.session()},get onChanged(){return s.refresh}})]),e})()}});return t.page?b(M,{get title(){return j()},get headerRight(){return Zr?void 0:oe()},get header(){return Zr?b($r,{get title(){return j()},get onBack(){return t.onBack},get actions(){return oe()}}):void 0},get children(){return se}}):se}function Li(e){let{user:t}=g(K),n=ai(),r=()=>e.host?.ownerName??(e.session.connectorOwnerId?n(e.session.connectorOwnerId):`unknown`);return(()=>{let i=C(`text`);return D(i,`testID`,`session-people`),y(i,`style`,()=>({width:`100%`,numberOfLines:2,fontSize:13,lineHeight:18,color:Y().muted})),w(i,()=>`Owned by ${n(e.session.ownerId,!0)}${e.session.connectorId?` · ${e.host?.name??`Pinned host`}, hosted by ${r()}${e.session.connectorOwnerId===t.id?` (you)`:``}`:` · Operator-managed session`}`),i})()}function Ri(e){let{user:t}=g(K),n=ai(),r=q(),i=()=>e.session?.autoApprovedRequesters??[];function a(t){let i=e.session;i&&!r.busy()&&r.run(async()=>{await K().api(`/api/sessions/${H(i.id)}/auto-approved-requesters/${H(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 b(P,{get open(){return e.open},get side(){return f.desktop?`right`:`bottom`},closeOnSwipe:!0,onOpenChange:t=>{t.open||e.onClose()},get backdropStyle(){return{backgroundColor:Y().backdrop}},get popupStyle(){return f.desktop?{width:480,maxWidth:`100%`,height:`100%`,backgroundColor:Y().background}:{height:`90%`,borderTopLeftRadius:16,borderTopRightRadius:16,backgroundColor:Y().background}},get children(){return(()=>{let s=C(`view`);D(s,`testID`,`approvals-sheet`),D(s,`style`,{flex:1});let c=C(`view`);y(c,`style`,()=>({flexDirection:`row`,alignItems:`center`,gap:8,paddingHorizontal:16,paddingVertical:8,minHeight:52,borderBottomWidth:1,borderColor:Y().border,backgroundColor:Y().surface}));let l=C(`text`);y(l,`style`,()=>({flex:1,fontSize:17,fontWeight:`700`,color:Y().text}));let u=k(`Approvals`);v(l,u),v(c,l),w(c,b(X,{small:!0,variant:`ghost`,label:`Done`,get onPress(){return e.onClose}}));let d=C(`scroll`);return D(d,`style`,{flex:1}),D(d,`contentStyle`,{gap:12,padding:16}),w(d,[x(()=>e.session&&i().length>0,()=>[b(Z,{title:`Auto-approved requesters`,get children(){return`Requests from ${i().map(e=>n(e)).join(`, `)} run without asking.`}}),x(()=>e.session?.ownerId===t.id,()=>(()=>{let e=C(`view`);return D(e,`style`,{flexDirection:`row`,flexWrap:`wrap`,gap:8}),w(e,S(()=>i(),e=>b(X,{small:!0,get label(){return`Stop for ${n(e())}`},get disabled(){return r.busy()},onPress:()=>a(e())}))),e})()),b(Or,{get error(){return r.error()},get notice(){return r.notice()}})]),b($,{get children(){return`Commands that ran under auto-approve are marked on their tool calls in the conversation.`}}),x(()=>o().length>0,()=>S(()=>o(),t=>b(_i,{get approval(){return t()},get onOpenSession(){return e.onOpenSession}}),e=>e.id),()=>b(Q,{title:`No approvals yet`,get children(){return`Commands, commits and pushes that need a decision appear here.`}})),x(()=>(e.olderApprovals??0)>0,()=>b($,{get children(){return`${e.olderApprovals} older approvals are on the web app's session page.`}}))]),v(s,c),v(s,d),s})()}})}function zi(t){let{user:n}=g(K),r=fr(),a=Ir(r),s=()=>t.live.session(),l=()=>t.live.view(),u=()=>s().ownerId===n.id,d=h(g(()=>Se(l(),u()))),m=h(`write`),_=kn(t.id),E=h(``),k=h(!1),A=h(!1),j=null,M=!1,N=q(),P=q(),te=q(),F=h(null),ne=h(),I=h(/* @__PURE__ */ new Set),re=()=>s().permissions??[],L=()=>re().includes(`write`),ie=()=>re().includes(`ask`),R=()=>m()===`ask`&&!ie()?`write`:m(),ae=()=>s().status===`archived`||s().frozen===!0,z=()=>!ae()&&(R()===`write`?L():ie()),oe=()=>!!(s().hostUnsandboxed||t.host()?.capabilities.unsandboxed),B=()=>l().queue??[],V=i(()=>B().filter(e=>Ke.includes(e.status))),se=()=>B().filter(e=>!Ke.includes(e.status)).slice(-5).reverse(),ce=()=>!!l().stoppable&&s().status!==`archived`&&L()&&V().length>0,le=()=>B().some(e=>e.status===`stopping`),ue=i(()=>l().conversations.filter(e=>e.mode===`ask`&&(!e.actorId||e.actorId===n.id))),de=e=>R()===`ask`?e?.mode===`ask`&&(!e.actorId||e.actorId===n.id)&&(!E()||e.id===E()):e?.mode!==`ask`,fe=i(()=>{let e=l().conversations;return l().entries.filter(t=>t.role===`system`&&!t.text.trim()?!1:de(e.find(e=>e.id===t.conversationId)))}),pe=()=>l().conversations.filter(e=>(e.olderEntries??0)>0&&de(e)),me=()=>pe().reduce((e,t)=>e+(t.olderEntries??0),0),he=h(!1);function ge(){!he()&&pe().length&&(he.set(!0),Promise.all(pe().map(e=>t.live.loadOlder(e.id))).finally(()=>he.set(!1)))}o(()=>{R(),E(),ne()?.scrollToEnd({animated:!1})});async function _e(){let e=_();if(!z()||!e.trim()||N.busy()||M)return;let n=t.host(),i=R()===`ask`?`ask`:`submit`,o=Te(n,d(),i),s=Ce(n,d(),i)??we(n,d());if(!s&&n&&De(o,r.autoApproveConfirmed())&&(M=!0,!await a(n,oe()).finally(()=>{M=!1}))){d.update(e=>({...e,access:`approval`}));return}F.set(null);let c=e,u=`${i}:${JSON.stringify(o??null)}:${c}`;j?.key!==u&&(j={key:u,id:Gr()});let f=j.id;N.run(async()=>{if(s)throw Error(s);let e=await K().api(`/api/sessions/${H(t.id)}/${i}`,{method:`POST`,body:{content:c,requestId:f,...o?{options:o}:{}}});F.set(e),o&&r.rememberChat(n,d(),l().agent),i===`ask`&&E.set(e.conversationId),Dn(t.id,c),j=null,t.live.refresh(),ne()?.scrollToEnd({animated:!0})})}function ve(){ce()&&!P.busy()&&P.run(async()=>{await K().api(`/api/sessions/${H(t.id)}/stop`,{method:`POST`,body:{}}),t.live.refresh()})}let ye=()=>l().busy||V().length>0;async function be(t){let n=$e(l())&&R()===`write`&&!ae()?Qe(t):void 0,r=[{id:`copy`,label:`Copy message`},...n&&L()?[{id:`revert`,label:n.before?`Go back to before this message`:`Go back to this reply`,role:`destructive`}]:[],...n&&u()?[{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`?te.run(()=>e.writeText(rt(t)),`Message copied`):!n||i!==`revert`&&i!==`fork`||(i===`revert`?await xe(t,n.entryId,n.before):await Ee(t,n.entryId,n.before))}async function xe(e,n,r){ye()?te.run(async()=>{throw Error(`Stop the session's work to go back to an earlier message.`)}):await jr({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})&&te.run(async()=>{await K().api(`/api/sessions/${H(t.id)}/revert`,{method:`POST`,body:{entryId:n}}),r&&On(t.id,tt(e)),t.live.refresh()})}async function Ee(e,n,r){await jr({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`})&&te.run(async()=>{let i=await K().api(`/api/sessions/${H(t.id)}/fork`,{method:`POST`,body:{entryId:n}});r&&Tn(i.session.id,tt(e)),t.openSession(i.session.id)})}let Oe=()=>!!_().trim()&&mn(_())!==_(),ke=()=>{let e=V().length>0?` · ${V().length} queued`:``;return St(l())?`Preparing repositories...${e}`:le()?`Stopping...${e}`:l().busy?`${l().activity===`waiting`?`Waiting for a decision`:`Working`}...${e}`:V().length?`${V().length} queued`:`Idle`},Ae=ai(),je=()=>ue().findIndex(e=>e.id===E()),Me=()=>s().status===`archived`?`Read-only · this session is archived`:s().frozen?`Read-only · this session pinned its repositories when it started`:z()?R()===`ask`?`Read-only · anyone who can view this session can see side asks`:`Runs as ${l().owner.displayName}${l().owner.id===n.id?` (you)`:``}`:ie()?`Read-only · switch to Side ask to ask questions`:`Read-only · submitting needs write permission`,Ne=()=>f.desktop?8:Math.max(c().height,p().bottom,8);return[b(T,{get each(){return fe()},keyExtractor:e=>e.id,ref(e){O(ne,e,`list`)},style:{flex:1},contentStyle:{padding:16},maintainVisibleContentPosition:{autoscrollToBottomThreshold:80},testID:`transcript`,get accessibilityLabel(){return R()===`ask`?`Side ask history`:`Shared session history`},header:()=>x(()=>me()>0,()=>(()=>{let e=C(`view`);return D(e,`style`,{alignItems:`center`,paddingBottom:12}),w(e,b(X,{small:!0,variant:`ghost`,icon:`↑`,get busy(){return he()},onPress:ge,get label(){return`Show earlier messages (${me()})`},testID:`load-earlier`})),e})()),empty:()=>b(Q,{get title(){return R()===`ask`?`A question on the side`:`The conversation begins here`},get children(){return R()===`ask`?`Ask about the work without changing it`:`Committed messages and tool results will appear here`}}),footer:()=>t.pinned,get children(){return e=>b(wi,{get entry(){return e()},get userId(){return n.id},expanded:e=>I().has(e),onActions:e=>void be(e),toggle:e=>I.update(t=>{let n=new Set(t);return n.delete(e)||n.add(e),n})})}}),(()=>{let e=C(`view`);y(e,`style`,()=>({gap:8,paddingHorizontal:12,paddingTop:8,paddingBottom:Ne(),borderTopWidth:1,borderColor:Y().border,backgroundColor:Y().background}));let n=C(`view`);return D(n,`testID`,`queue-line`),D(n,`role`,`button`),D(n,`onPress`,()=>A.update(e=>!e)),D(n,`style`,{flexDirection:`row`,justifyContent:`space-between`,paddingHorizontal:4}),w(n,[b($,{get children(){return ke()}}),b($,{get children(){return A()?`Hide`:`Details`}})]),v(e,n),w(e,[x(()=>A(),()=>(()=>{let e=C(`view`);D(e,`style`,{gap:6,paddingHorizontal:4});let n=C(`view`);return D(n,`style`,{flexDirection:`row`}),w(n,b(X,{small:!0,icon:`↻`,label:`Refresh queue`,get onPress(){return t.live.refresh}})),v(e,n),w(e,[b($,{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.`}}),x(()=>t.live.error(),()=>b($,{get children(){return`This is the last received queue view; live host status is not confirmed.`}})),(e=>x(e,()=>(e=>b($,{get children(){return`Last receipt ${e().submissionId} · ${e().status}${e().queuePosition===void 0?``:` · queue position ${e().queuePosition}`}`}}))(e)))(()=>F()),S(()=>V(),(e,t)=>b($,{get children(){return`${t()+1}. ${e().mode===`ask`?`Read-only side ask`:`Shared submission`} · ${e().status} · by ${Ae(e().actorId,!0)}`}}),e=>e.submissionId),S(()=>se(),e=>b($,{get children(){return`${e().status} · ${e().mode===`ask`?`Side ask`:`Shared submission`} · by ${Ae(e().actorId,!0)}`}}),e=>e.submissionId)],n),e})()),b(vi,{get value(){return _()},onChange:e=>_.set(e),onSubmit:()=>void _e(),get busy(){return N.busy()},get disabled(){return!z()},get onStop(){return ce()?ve:void 0},get stopping(){return P.busy()},get placeholder(){return z()?R()===`ask`?`Ask without changing anything`:`Message the agent`:`Read-only`},get sendLabel(){return R()===`ask`?`Send side ask`:`Submit to session`},get hint(){return Me()},get tools(){return x(()=>ie()||z(),()=>[x(()=>ie(),()=>b(kr,{testID:`composer-mode`,get value(){return R()},onChange:e=>m.set(e),options:[{value:`write`,label:`Shared`},{value:`ask`,label:`Side ask`}]})),x(()=>R()===`ask`&&ue().length>0,()=>b(Er,{get label(){return je()<0?`All my side asks`:`Side ask ${je()+1}`},onPress:()=>k.set(!0)})),x(()=>z(),()=>b(Lr,{get host(){return t.host()},get value(){return d()},onChange:e=>d.set(e),get owner(){return u()},get showAccess(){return R()===`write`},get unsandboxed(){return oe()},data:r}))])}}),x(()=>Oe(),()=>b($,{testID:`draft-secret`,get children(){return`This message looks like it holds a secret. Everyone, you included, sees it as ${U} in the transcript, but the agent and its host receive it as typed.`}})),b(Or,{get error(){return N.error()||P.error()||te.error()},get notice(){return te.notice()}})]),e})(),b(Ar,{get open(){return k()},title:`Side conversation`,get value(){return E()},onClose:()=>k.set(!1),onSelect:e=>E.set(e),get options(){return[{value:``,label:`All my side asks`},...ue().map((e,t)=>({value:e.id,label:`Side ask ${t+1}`,hint:e.id.slice(0,8)}))]}})]}function Bi(e){let{user:t}=g(K),n=kn(e.id),r=null,i=q(),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 l(){let t=n();r?.content!==t&&(r={content:t,id:Gr()});let a=r.id;i.run(async()=>{let{api:n}=K();await n(`/api/sessions/${H(e.id)}/restart`,{method:`POST`});try{await n(`/api/sessions/${H(e.id)}/submit`,{method:`POST`,body:{content:t,requestId:a}})}catch(n){throw Tn(e.id,t),e.recovered(),n}r=null,Dn(e.id,t),e.recovered()})}let u=()=>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=C(`scroll`);return D(t,`style`,{flex:1}),D(t,`contentStyle`,{flexGrow:1}),w(t,[b(Q,{get title(){return u()},get children(){return d()}}),x(()=>a()&&e.error,()=>b($,{center:!0,get children(){return e.error}}))]),t})(),(()=>{let e=C(`view`);return y(e,`style`,()=>({gap:8,paddingHorizontal:12,paddingTop:8,paddingBottom:f.desktop?8:Math.max(c().height,p().bottom,8),borderTopWidth:1,borderColor:Y().border})),w(e,[b(vi,{get value(){return n()},onChange:e=>n.set(e),onSubmit:l,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`}}),b(Or,{get error(){return i.error()}})]),e})()]}function Vi(e){return(()=>{let e=C(`view`);return D(e,`testID`,`shared-session`),y(e,`style`,()=>({flex:1,paddingTop:p().top,backgroundColor:Y().background})),w(e,b(Q,{title:`Not here yet`,get children(){return`Shared sessions are still being moved to this app.`}})),e})()}const Hi=()=>({borderWidth:1,borderRadius:10,paddingHorizontal:12,paddingVertical:10,fontSize:16,backgroundColor:Y().surface,borderColor:Y().border,color:Y().text,placeholderColor:Y().muted});function Ui(){let e=()=>Hn(),t=()=>{let t=e();return t.status===`signedOut`||t.status===`unreachable`?t.origin:``},n=q();return(()=>{let r=C(`view`);return y(r,`style`,()=>({flex:1,backgroundColor:Y().background,paddingTop:p().top,paddingBottom:p().bottom})),w(r,(e=>x(e,()=>(e=>(()=>{let r=C(`view`);D(r,`style`,{flex:1,justifyContent:`center`,gap:16,padding:24,width:`100%`,maxWidth:480,alignSelf:`center`});let i=C(`text`);y(i,`style`,()=>({fontSize:32,fontWeight:`800`,color:Y().text}));let a=k(`Can't reach Pikibun`);return v(i,a),v(r,i),w(r,[b(Z,{tone:`warning`,get title(){return In(t())},get children(){return e().error}}),b(X,{variant:`primary`,label:`Try again`,get disabled(){return n.busy()},onPress:()=>void $n()}),b(X,{variant:`ghost`,get label(){return n.busy()?`Signing out…`:`Sign out`},get disabled(){return n.busy()},onPress:()=>void n.run(or)})]),r})())(e),()=>b(Wi,{})))(()=>e().status===`unreachable`?e():null)),r})()}function Wi(){let e=g(()=>{let e=Hn();return e.status===`signedOut`?e.origin:``}),t=h(e),n=h(!1),r=h(!1),i=h(``),a=h(``),s=h(``),c=q(),l=h(null),u=h(null),f=()=>Fn(t()),p=()=>{if(W)return e;let t=f();return`origin`in t?t.origin:null};o(()=>{let e=p();l.set(null),e!==null&&(W?fetch(`/api/health`).then(e=>e.json()):er(e)).then(t=>{g(p)===e&&l.set(t)},()=>void 0)});let m=()=>{let e=Hn();return e.status===`signedOut`?e.notice:void 0};function _(){let e=p();e!==null&&c.run(async()=>{W?yr(`/api/auth/github`)||await d(`${e}/api/auth/github`):u.set(await tr(e))})}function S(e){let t=u();t&&t.isCallback(e)&&(u.set(null),c.run(()=>t.finish(e)))}return(()=>{let e=C(`scroll`);D(e,`style`,{flex:1}),D(e,`contentStyle`,{flexGrow:1,justifyContent:`center`,gap:16,padding:24,width:`100%`,maxWidth:480,alignSelf:`center`});let o=C(`view`);D(o,`style`,{gap:8});let d=C(`text`);y(d,`style`,()=>({fontSize:32,fontWeight:`800`,color:Y().text}));let h=k(`Pikibun`);v(d,h);let g=C(`text`);y(g,`style`,()=>({fontSize:16,lineHeight:22,color:Y().muted}));let T=k(`Run Pi agents on your own machine, and work on them together with your team.`);return v(g,T),v(o,d),v(o,g),v(e,o),w(e,[(e=>x(e,()=>(e=>b(Z,{tone:`warning`,get children(){return e()}}))(e)))(()=>m()),(e=>x(e,()=>(e=>b(Z,{tone:`danger`,title:`Sign-in problem`,get children(){return e()}}))(e)))(()=>c.error()),x(()=>!W,()=>(()=>{let e=C(`view`);return D(e,`style`,{gap:6}),w(e,[b($,{get children(){return`Server`}}),x(()=>n(),()=>[(()=>{let e=C(`input`);return D(e,`testID`,`server-input`),y(e,`value`,()=>t()),D(e,`onChange`,e=>t.set(e.value)),D(e,`autoCapitalize`,`none`),D(e,`autoCorrect`,!1),D(e,`keyboardType`,`url`),D(e,`placeholder`,`https://pikibun.com`),D(e,`accessibilityLabel`,`Server address`),y(e,`style`,()=>Hi()),e})(),(e=>x(e,()=>(e=>b($,{tone:`danger`,get children(){return e()}}))(e)))(()=>`error`in f()?f().error:null),b($,{get children(){return`For a self-hosted Pikibun, enter its address.`}})],()=>(()=>{let e=C(`view`);D(e,`style`,{flexDirection:`row`,alignItems:`center`,gap:8});let r=C(`text`);return y(r,`style`,()=>({flexShrink:1,numberOfLines:1,fontSize:16,fontWeight:`600`,color:Y().text})),w(r,()=>p()?In(p()):t()),v(e,r),w(e,b(X,{testID:`server-change`,small:!0,variant:`ghost`,label:`Change`,onPress:()=>n.set(!0)})),e})())]),e})()),b(X,{testID:`github-sign-in`,variant:`primary`,icon:`⌥`,label:`Continue with GitHub`,get busy(){return c.busy()&&!r()},get disabled(){return p()===null||c.busy()||l()?.githubConfigured===!1},onPress:_}),x(()=>W,()=>b(X,{testID:`browser-session-check`,label:`I've signed in`,get disabled(){return c.busy()},onPress:()=>void c.run(async()=>{if(!await ar())throw Error(`This browser isn't signed in to Pikibun yet.`)})})),x(()=>W&&l()?.passwordAuth,()=>(()=>{let e=C(`view`);y(e,`style`,()=>({gap:8,borderTopWidth:1,paddingTop:12,borderColor:Y().border}));let t=C(`input`);D(t,`testID`,`password-username`),y(t,`value`,()=>a()),D(t,`onChange`,e=>a.set(e.value)),D(t,`autoCapitalize`,`none`),D(t,`autoCorrect`,!1),D(t,`autoComplete`,`username`),D(t,`placeholder`,`Username`),D(t,`accessibilityLabel`,`Username`),y(t,`style`,()=>Hi());let n=C(`input`);return D(n,`testID`,`password-password`),y(n,`value`,()=>s()),D(n,`onChange`,e=>s.set(e.value)),D(n,`masked`,!0),D(n,`autoComplete`,`current-password`),D(n,`placeholder`,`Password`),D(n,`accessibilityLabel`,`Password`),y(n,`style`,()=>Hi()),D(n,`onSubmit`,()=>void c.run(()=>ir(a(),s()))),v(e,t),v(e,n),w(e,b($,{get children(){return`Or sign in with a username and password`}}),t),w(e,b(X,{testID:`password-sign-in`,label:`Sign in`,get disabled(){return c.busy()||!a().trim()||!s()},onPress:()=>void c.run(()=>ir(a(),s()))})),e})()),b($,{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.`}}),x(()=>!W&&l()?.testMode,()=>(()=>{let e=C(`view`);y(e,`style`,()=>({gap:8,borderTopWidth:1,paddingTop:12,borderColor:Y().border}));let t=C(`view`);return D(t,`style`,{flexDirection:`row`}),w(t,b(X,{testID:`developer-toggle`,small:!0,variant:`ghost`,get icon(){return r()?`▾`:`▸`},label:`Developer sign-in`,onPress:()=>r.update(e=>!e)})),v(e,t),w(e,x(()=>r(),()=>[b($,{get children(){return`This server runs in test mode. Sign in with a token from its POST /api/auth/test.`}}),(()=>{let e=C(`input`);return D(e,`testID`,`developer-token`),y(e,`value`,()=>i()),D(e,`onChange`,e=>i.set(e.value)),D(e,`autoCapitalize`,`none`),D(e,`autoCorrect`,!1),D(e,`masked`,!0),D(e,`autoComplete`,`off`),D(e,`placeholder`,`Test-mode token`),D(e,`accessibilityLabel`,`Test-mode token`),y(e,`style`,()=>Hi()),e})(),b(X,{testID:`developer-sign-in`,label:`Sign in with token`,icon:`⚿`,get busy(){return c.busy()&&r()},get disabled(){return p()===null||!i().trim()||c.busy()},onPress:()=>void c.run(async()=>{try{await rr(p(),i())}catch(e){throw Error(`Developer sign-in failed: ${V(e)}`)}})})])),e})()),b($,{center:!0,get children(){return W?`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).`}}),b(j,{get open(){return u()!==null},onOpenChange:e=>{e.open||u.set(null)},get style(){return{flex:1,backgroundColor:Y().background}},presentation:`pageSheet`,get children(){return(()=>{let e=C(`view`);D(e,`style`,{flex:1});let t=C(`view`);y(t,`style`,()=>({flexDirection:`row`,alignItems:`center`,gap:8,paddingHorizontal:16,paddingVertical:8,minHeight:52,borderBottomWidth:1,borderColor:Y().border,backgroundColor:Y().surface}));let n=C(`text`);y(n,`style`,()=>({flex:1,fontSize:17,fontWeight:`700`,color:Y().text}));let r=k(`Sign in with GitHub`);return v(n,r),v(t,n),w(t,b(X,{small:!0,variant:`ghost`,label:`Cancel`,onPress:()=>u.set(null)})),v(e,t),w(e,(e=>x(e,()=>(e=>(()=>{let t=C(`webview`);return y(t,`src`,()=>e().url),D(t,`style`,{flex:1}),D(t,`onNavigationStateChange`,e=>S(e.url)),t})())(e)))(()=>u())),e})()}})]),e})()}function Gi(e){return(()=>{let t=C(`scroll`);return y(t,`testID`,()=>e.testID),D(t,`style`,{flex:1}),D(t,`contentStyle`,{gap:10,padding:20,width:`100%`,maxWidth:720,alignSelf:`center`}),w(t,()=>e.children),t})()}function Ki(e){return b(Q,{title:`Not here yet`,get children(){return`${e.what} is still being moved to this app.`}})}function qi(e){return(()=>{let t=C(`text`);return y(t,`style`,()=>({fontSize:13,fontWeight:`600`,textTransform:`uppercase`,marginTop:8,color:Y().muted})),w(t,()=>e.children),t})()}function Ji(t){let n=q(),r=()=>K().user;async function i(){let{origin:e}=K();await jr({title:`Sign out?`,message:`This device signs out of ${In(e)} and forgets its sign-in.`,confirmLabel:`Sign out`,destructive:!0})&&await or()}return b(Gi,{get children(){return[b(qi,{get children(){return`Account`}}),b(Tr,{get children(){return[b(Mr,{label:`Name`,get children(){return b(Nr,{get children(){return r().displayName}})}}),(e=>x(e,()=>(e=>b(Mr,{label:`GitHub`,get children(){return b(Nr,{get children(){return`@${e()}`}})}}))(e)))(()=>r().githubLogin),b(Mr,{label:`User ID`,get children(){return(()=>{let t=C(`view`);return D(t,`style`,{flexDirection:`row`,flexWrap:`wrap`,alignItems:`center`,gap:8}),w(t,[b(Nr,{testID:`settings-user-id`,get children(){return kt(r())}}),b(X,{small:!0,variant:`ghost`,icon:`⧉`,label:`Copy`,onPress:()=>void n.run(()=>e.writeText(r().id),`User ID copied`)})]),t})()}}),b($,{get children(){return`Workspace owners add you with your user ID.`}})]}}),b(qi,{get children(){return`Server`}}),b(Tr,{get children(){return[b(Mr,{label:`Address`,get children(){return b(Nr,{get children(){return K().origin||`This server`}})}}),b(Mr,{label:`Status`,get children(){return b(Nr,{get children(){return K().expiresAt?`Signed in until ${Ur(K().expiresAt)}`:`Signed in`}})}}),b($,{get children(){return W?`Signed in with this browser's session.`:`This device's sign-in. Review and revoke signed-in apps under Profile.`}})]}}),b(qi,{get children(){return`App`}}),b(Tr,{get children(){return[b(Mr,{label:`Version`,get children(){return b(Nr,{get children(){return`Pikibun 0.1.0`}})}}),b(Mr,{label:`Platform`,get children(){return b(Nr,{get children(){return`${f.os} ${f.version} · ${f.desktop?`desktop`:f.idiom}`}})}})]}}),b(Or,{get error(){return n.error()},get notice(){return n.notice()}}),b(X,{testID:`sign-out`,variant:`danger`,icon:`⏻`,label:`Sign out`,onPress:()=>void i()})]}})}const Yi=`pikibun.appearance`;async function Xi(){let e=await t.getItem(Yi).catch(()=>null);(e===`light`||e===`dark`)&&m(e)}function Zi(e){let n=h(`system`);t.getItem(Yi).then(e=>{(e===`light`||e===`dark`)&&n.set(e)},()=>void 0);function r(e){n.set(e),m(e),(e===`system`?t.removeItem(Yi):t.setItem(Yi,e)).catch(()=>void 0)}return b(Gi,{testID:`settings-appearance`,get children(){return[b(qi,{get children(){return`Appearance`}}),b(Tr,{get children(){return[b(kr,{testID:`appearance-scheme`,get value(){return n()},onChange:r,options:[{value:`system`,label:`System`},{value:`light`,label:`Light`},{value:`dark`,label:`Dark`}]}),b($,{get children(){return`On this device. System follows its light or dark appearance.`}})]}})]}})}function Qi(e){return b(Gi,{testID:`settings-admin`,get children(){return b(Ki,{what:`Administration`})}})}function $i(e){return b(Gi,{testID:`settings-hosts`,get children(){return b(Ki,{what:`Host settings`})}})}function ea(e){return b(Gi,{testID:`settings-workspaces`,get children(){return b(Ki,{what:`Workspace settings`})}})}const ta=[{id:`profile`,label:`Profile`,icon:`◉`,Component:Ji},{id:`workspaces`,label:`Workspaces`,icon:`👥`,Component:ea},{id:`hosts`,label:`Hosts`,icon:`🖥`,Component:$i},{id:`appearance`,label:`Appearance`,icon:`◐`,Component:Zi},{id:`admin`,label:`Administration`,icon:`🛡`,admin:!0,Component:Qi}];function na(){let e=!!K().user.instanceAdmin;return ta.filter(t=>!t.admin||e)}function ra(e){let t=na();return t.find(t=>t.id===e)??t[0]}function ia(e){return(()=>{let t=C(`view`);return D(t,`testID`,`settings-sections`),D(t,`style`,{paddingVertical:8}),w(t,S(()=>na(),t=>b(A,{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:12,paddingHorizontal:16,paddingVertical:12,backgroundColor:e.selected===t().id?Y().selection:`transparent`}},get activeStyle(){return{backgroundColor:Y().selection}},get hoverStyle(){return{backgroundColor:Y().surfaceRaised}},get children(){return[(()=>{let e=C(`text`);return y(e,`style`,()=>({width:22,fontSize:16,color:Y().muted})),w(e,()=>t().icon),e})(),(()=>{let e=C(`text`);return y(e,`style`,()=>({flex:1,fontSize:16,color:Y().text})),w(e,()=>t().label),e})(),(()=>{let e=C(`text`);y(e,`style`,()=>({fontSize:16,color:Y().muted}));let t=k(`›`);return v(e,t),e})()]}}),e=>e.id)),t})()}function aa(){_r(),Xi(),$n();let e=()=>Hn().status===`signedIn`,t=()=>{let e=gr();return e.name===`shared`?e.token:null};return(()=>{let n=C(`view`);return y(n,`style`,()=>({flex:1,backgroundColor:Y().background})),w(n,(t=>x(t,()=>(e=>S(()=>[e()],e=>b(Vi,{get token(){return e()}}),e=>e))(t),()=>x(()=>Hn().status!==`loading`,()=>x(()=>e(),()=>b(oa,{}),()=>b(Ui,{})),()=>b(Dr,{}))))(()=>t())),n})()}function oa(){let e=dr(),t=ne([{name:`sessions`}]),n=0,r=i(()=>{let e=_().width;return e>0&&(n=e),n}),a=()=>r()>=700,s=h(null);function c(e){a()?(s.set(e),t.popToRoot()):t.push({name:`session`,id:e})}function l(e){a()?(t.popToRoot(),s.set(e)):t.replace({name:`session`,id:e})}function u(e,n){let r=g(t.routes).at(-1);if(a()){let i={name:`settings`,...e?{section:e}:{},...n?{id:n}:{}};r?.name===`settings`?t.replace(i):t.push(i)}else e?(r?.name!==`settings`&&t.push({name:`settings`}),t.push({name:`settings-section`,section:e,...n?{id:n}:{}})):t.push({name:`settings`})}function d(e){switch(e.name){case`home`:t.popToRoot();break;case`session`:t.popToRoot(),c(e.sessionId);break;case`new`:t.popToRoot(),t.push({name:`new`,workspaceId:e.workspaceId});break;case`settings`:t.popToRoot(),u(e.section,e.id);break;case`join`:t.popToRoot(),t.push({name:`join`,token:e.token})}}o(()=>{let e=gr();g(()=>d(e))}),o(()=>{let e=t.routes().at(-1),n=s();g(()=>{if(e)switch(e.name){case`session`:return vr({name:`session`,sessionId:e.id});case`sessions`:return vr(n&&a()?{name:`session`,sessionId:n}:{name:`home`});case`new`:return vr(e.workspaceId?{name:`new`,workspaceId:e.workspaceId}:{name:`home`});case`settings`:case`settings-section`:return vr({name:`settings`,...e.section?{section:e.section}:{},...e.id?{id:e.id}:{}});case`join`:return vr({name:`join`,token:e.token});default:return vr({name:`home`})}})}),o(()=>{let e=a();g(()=>{let n=t.routes()[t.routes().length-1];if(!e&&s()){let e=s();s.set(null),t.push({name:`session`,id:e})}else e&&n?.name===`session`&&(t.popToRoot(),s.set(n.id))})});let f=()=>t.pop(),p=()=>(()=>{let e=C(`view`);return D(e,`style`,{flexDirection:`row`,alignItems:`center`,gap:4}),w(e,[b(Cr,{testID:`open-by-id`,icon:`⇥`,label:`Open a session by ID`,onPress:()=>t.push({name:`open`})}),b(Cr,{testID:`new-session`,icon:`+`,label:`New session`,onPress:()=>t.push({name:`new`})})]),e})(),m=()=>b(Cr,{testID:`open-settings`,icon:`⚙`,label:`Settings`,onPress:()=>u()});return b(ur.Provider,{value:e,get children(){return b(N,{state:t,style:{flex:1},testID:`nav`,get children(){return e=>{switch(e.name){case`sessions`:return b(M,E({title:`Sessions`},Qr({title:`Pikibun`,leading:m(),actions:p()}),{get children(){return x(()=>a(),()=>(()=>{let e=C(`view`);D(e,`style`,{flex:1,flexDirection:`row`});let n=C(`view`);y(n,`style`,()=>({width:340,borderRightWidth:1,borderColor:Y().border})),w(n,b(ti,{get selectedId(){return s()},onOpen:c,onNew:()=>t.push({name:`new`})}));let r=C(`view`);return D(r,`style`,{flex:1}),w(r,x(()=>s(),()=>S(()=>s()?[s()]:[],e=>b(Ii,{get id(){return e()},page:!1,openSession:c,go:d}),e=>e),()=>b(Q,{title:`No session open`,get children(){return`Choose a session from the list, or start a new one.`}}))),v(e,n),v(e,r),e})(),()=>b(ti,{onOpen:c,onNew:()=>t.push({name:`new`})}))}}));case`session`:return b(Ii,{get id(){return e.id},page:!0,openSession:c,onBack:f,go:d});case`new`:return b(M,E({title:`New session`},Qr({title:`New session`,onBack:f}),{get children(){return b(Jr,{get workspaceId(){return e.workspaceId},onStarted:l})}}));case`open`:return b(M,E({title:`Open a session`},Qr({title:`Open a session`,onBack:f}),{get children(){return b(Xr,{onOpen:l})}}));case`settings`:return b(M,E({title:`Settings`},Qr({title:`Settings`,onBack:f}),{get children(){return b(sa,{get section(){return e.section},get id(){return e.id},get wide(){return a()},onOpen:e=>u(e),go:d})}}));case`settings-section`:{let t=ra(e.section);return b(M,E({get title(){return t.label}},Qr({title:t.label,onBack:f}),{get children(){return b(t.Component,{get id(){return e.id},go:d})}}))}case`join`:return b(M,E({title:`Join a workspace`},Qr({title:`Join a workspace`,onBack:f}),{get children(){return b(Pr,{get token(){return e.token},onDone:()=>t.popToRoot()})}}))}}}})}})}function sa(e){let t=()=>ra(e.section);return x(()=>e.wide,()=>(()=>{let n=C(`view`);D(n,`style`,{flex:1,flexDirection:`row`});let r=C(`view`);y(r,`style`,()=>({width:260,borderRightWidth:1,borderColor:Y().border})),w(r,b(ia,{get selected(){return t().id},get onOpen(){return e.onOpen}}));let i=C(`view`);return D(i,`style`,{flex:1}),w(i,S(()=>[`${t().id}\u0000${e.id??``}`],()=>{let n=g(t);return b(n.Component,{get id(){return g(()=>e.id)},get go(){return e.go}})},e=>e)),v(n,r),v(n,i),n})(),()=>b(ia,{get onOpen(){return e.onOpen}}))}u(aa);
Binary file
Binary file
@@ -0,0 +1,83 @@
1
+ base64-js 1.5.1
2
+ The MIT License (MIT)
3
+
4
+ Copyright (c) 2014 Jameson Little
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ THE SOFTWARE.
23
+
24
+
25
+ ieee754 1.2.1
26
+ Copyright 2008 Fair Oaks Labs, Inc.
27
+
28
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
29
+
30
+ 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
31
+
32
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
33
+
34
+ 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
35
+
36
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37
+
38
+
39
+ buffer 6.0.3
40
+ The MIT License (MIT)
41
+
42
+ Copyright (c) Feross Aboukhadijeh, and other contributors.
43
+
44
+ Permission is hereby granted, free of charge, to any person obtaining a copy
45
+ of this software and associated documentation files (the "Software"), to deal
46
+ in the Software without restriction, including without limitation the rights
47
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
48
+ copies of the Software, and to permit persons to whom the Software is
49
+ furnished to do so, subject to the following conditions:
50
+
51
+ The above copyright notice and this permission notice shall be included in
52
+ all copies or substantial portions of the Software.
53
+
54
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
55
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
56
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
57
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
58
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
59
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
60
+ THE SOFTWARE.
61
+
62
+
63
+ path-browserify 1.0.1
64
+ MIT License
65
+
66
+ Copyright (c) 2013 James Halliday
67
+
68
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
69
+ this software and associated documentation files (the "Software"), to deal in
70
+ the Software without restriction, including without limitation the rights to
71
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
72
+ the Software, and to permit persons to whom the Software is furnished to do so,
73
+ subject to the following conditions:
74
+
75
+ The above copyright notice and this permission notice shall be included in all
76
+ copies or substantial portions of the Software.
77
+
78
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
79
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
80
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
81
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
82
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
83
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1 @@
1
+ export function createAnimation(e,t,n,r){let i=new WeakMap,a=new WeakMap,o=new Map,s=new Map,c=2,l=2,u=2,d=e=>{let t=e===`node`?c:e===`animation`?l:u;if(t>=4294967294)throw RangeError(`animation IDs exhausted`);return e===`node`?c+=2:e===`animation`?l+=2:u+=2,t},f=(r,i)=>{if(!t())throw Error(`the app was disposed`);let a=e(r,i);return n(),a},p=(...e)=>f(500,[e]),m=new FinalizationRegistry(({id:e,key:n})=>{n&&!o.get(n)?.deref()&&o.delete(n),t()&&p(6,e)}),h=new FinalizationRegistry(e=>{t()&&p(11,e)}),g=e=>{let t=i.get(e);if(!t)throw TypeError(`not an animated value`);return t.id};function _(e,t,n){let r=d(`node`),a=r;if(n){let e=[];for(let[t,n]of o)n.deref()?e.push(t):o.delete(t);if(a=f(507,[[n[0],r,...n.slice(1)],e]),a!==r)return o.get(a).deref()}let s=Object.create(e);return i.set(s,{id:a,inputs:t}),Object.defineProperty(s,"__av",{value:a}),m.register(s,{id:a,key:n?a:void 0}),n&&o.set(a,new WeakRef(s)),s}function v(){return _(v.prototype,[])}function y(e=0){let t=_(y.prototype,[]);return p(0,g(t),Number(e)),t}Object.setPrototypeOf(y.prototype,v.prototype);let b=(e,t)=>_(v.prototype,t,e),x=(e,t,n)=>b([2,e,t,n],[t,n].filter(e=>i.has(e)));Object.assign(v.prototype,{interpolate(e){let t=e.extrapolate??`clamp`;return b([1,g(this),e.inputRange,e.outputRange,e.extrapolateLeft??t,e.extrapolateRight??t,e.easing],[this])},diffClamp(e,t,n){return b([7,g(this),e,t,!!n?.snap],[this])},add(e){return x(`add`,this,e)},sub(e){return x(`sub`,this,e)},mul(e){return x(`mul`,this,e)},div(e){return x(`div`,this,e)},mod(e){return x(`mod`,this,e)}});let S=e=>{try{return e()}catch(e){return Promise.reject(e)}},C=(e,t=!1,n,r)=>{let i=d(`animation`),a,o=new Promise(e=>{a=e});s.set(i,{resolve:a,read:t,callback:n,composite:r&&new WeakRef(r)});try{e(i)}catch(e){return s.delete(i),Promise.reject(e)}return o},w=(e,t)=>C(n=>p(4,g(e),n,t));Object.assign(y.prototype,{set(e){p(3,g(this),e)},stop(){return S(()=>(p(5,g(this)),this.getValue().then(e=>({value:e}))))},getValue(){return C(e=>p(15,g(this),e),!0)},setOffset(e){p(12,g(this),e)},flattenOffset(){p(13,g(this))},extractOffset(){p(14,g(this))},timing(e,t){return w(this,{...t,type:`timing`,to:e})},spring(e,t){return w(this,{...t,type:`spring`,to:e})},decay(e){return w(this,{...e,type:`decay`})},keyframes(e,t){return S(()=>O.keyframes(this,{...t,keyframes:e}).start())}});function T(e,t){let n=d(`composite`),r={key:n,spec:e,inputs:t,running:0},i={start(t){try{this.stop()}catch(e){return Promise.reject(e)}return C(t=>{r.running=t,p(8,t,n,e)},!1,typeof t==`function`?t:void 0,i)},stop(){r.running&&p(9,r.running)},reset(){p(10,n)}};return a.set(i,r),h.register(i,n),i}let E=(e,t,n={})=>{let{toValue:r,...i}=n;return T({...i,type:e,node:g(t),...r===void 0?{}:{to:r}},[t])},D=(e,t,n={})=>{let r=(Array.isArray(t)?t:[]).map(e=>a.get(e)).filter(Boolean);return T({type:e,children:r.map(e=>e.spec),...n},r.flatMap(e=>e.inputs))},O={timing:(e,t)=>E(`timing`,e,t),spring:(e,t)=>E(`spring`,e,t),decay:(e,t)=>E(`decay`,e,t),sequence:e=>D(`sequence`,e),parallel:(e,t)=>D(`parallel`,e,{stopTogether:t?.stopTogether??!0}),delay:e=>T({type:`delay`,ms:e},[]),stagger(e,t,n){return D(`parallel`,(Array.isArray(t)?t:[]).map((r,i)=>D(`sequence`,[this.delay(Number(e)*f(506,[n,i,t.length])),r])),{stopTogether:!0})},loop(e,t){let n=a.get(e);if(!n)throw TypeError(`loop: an animation`);return T({type:`loop`,child:n.spec,iterations:t?.iterations??-1,reset:t?.resetBeforeIteration??!0},n.inputs)},keyframes(e,t){return T({...t,type:`keyframes`,node:g(e)},[e])},add:(e,t)=>x(`add`,e,t),subtract:(e,t)=>x(`sub`,e,t),multiply:(e,t)=>x(`mul`,e,t),divide:(e,t)=>x(`div`,e,t),modulo:(e,t)=>x(`mod`,e,t),diffClamp:(e,t,n,r)=>v.prototype.diffClamp.call(e,t,n,r),sampleSpring:(e={},t)=>f(502,[{...e,type:`spring`,to:e.toValue},e.from,t]),sampleDecay:(e={},t)=>f(502,[{...e,type:`decay`,to:e.toValue},e.from,t])},k=f(501,[]),A=k.motions,j=(e,t)=>Array.isArray(e)&&t===`out`?[1-e[2],1-e[3],1-e[0],1-e[1]]:e&&typeof e==`object`&&!Array.isArray(e)?{...e,mode:t}:t===`out`&&e===`easeIn`?`easeOut`:t===`out`&&e===`easeOut`?`easeIn`:e,M={linear:`linear`,ease:`ease`,bezier:(...e)=>e.slice(0,4),steps:(e,t)=>({steps:e,...t===void 0?{}:{position:t}}),in:e=>j(e,`in`),out:e=>j(e,`out`),inOut:e=>j(e,`inOut`),sample:(e,t)=>f(503,[e,Number(t)])};for(let[e,t,n]of k.curves)M[e]=t===null?{curve:e,mode:`in`}:(t=n)=>({curve:e,param:t,mode:`in`});let N=[`opacity`,`translateX`,`translateY`,`rotate`,`rotateX`,`rotateY`,`scale`,`scaleX`,`scaleY`],P=e=>e===`opacity`||e.startsWith(`scale`)?1:0;function F(e={}){let t=e.enter===void 0?[]:f(504,[e.enter]),n=Object.fromEntries(N.map((n,r)=>[n,y(t[r]??e.initial?.[n]??P(n))])),i=N.slice(1,6).map(e=>({[e]:n[e]}));return i.push({scaleX:n.scale.mul(n.scaleX)},{scaleY:n.scale.mul(n.scaleY)}),Object.assign(n,{transform:i,style:{opacity:n.opacity,transform:i},animation(e,t){let i=r.api.reduceMotion()&&!t?.ignoreReduceMotion&&!e?.ignoreReduceMotion,a=typeof e==`string`?A[e]:e,o=t&&typeof t==`object`&&a?{...a,...t}:e;return T({type:`motion`,nodes:N.map(e=>g(n[e])),motion:o,reduced:i},N.map(e=>n[e]))},play(e,t){return S(()=>this.animation(e,t).start())},stop(){for(let e of N)p(5,g(n[e]))},reset(){for(let e of N)n[e].set(P(e))}}),e.enter!==void 0&&n.play(e.enter,e),n}let I=new Set,L={Types:Object.fromEntries(k.types.map(e=>[e,e])),Properties:Object.fromEntries(k.properties.map(e=>[e,e])),Presets:k.presets,create(e,t=`easeInEaseOut`,n=`opacity`){return{duration:e,create:{type:t,property:n},update:{type:t},delete:{type:t,property:n}}},configureNext(e,n){if(f(505,[e]),typeof n==`function`){let r=setTimeout(()=>{I.delete(r),t()&&n()},e?.duration);I.add(r)}}};for(let e of[`easeInEaseOut`,`linear`,`spring`])L[e]=t=>L.configureNext(k.presets[e],t);return{api:{AnimatedNode:v,AnimatedValue:y,createAnimatedValue:y,Animated:O,Easing:M,createMotion:F,motions:A,LayoutAnimation:L},finished(e){let t;for(let[n,r,i]of e){let e=s.get(n);if(!e)continue;s.delete(n);let o=a.get(e.composite?.deref());o?.running===n&&(o.running=0);try{e.callback?.({finished:r})}catch(e){t??=e}finally{e.resolve(e.read?i??0:{finished:r})}}if(t)throw t},dispose(){for(let e of I)clearTimeout(e);I.clear();for(let e of s.values())e.resolve(e.read?0:{finished:!1});s.clear(),o.clear()}}}
@@ -0,0 +1 @@
1
+ import*as e from"./scope.js";globalThis.__nsh_browser_bootstrap(e);