@puddle-code/cli 0.0.20 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +34 -7
  2. package/README.md +2 -0
  3. package/dist/index.js +134 -34
  4. package/dist/public/assets/Dashboard-eGkW6-ZH.js +1 -0
  5. package/dist/public/assets/EditorTabClose-ftyAn3hj.js +1 -0
  6. package/dist/public/assets/LazyTerminal-C0RZlCLg.js +2 -0
  7. package/dist/public/assets/{ModelRefcount-sJruf69B.js → ModelRefcount-D-jr9qZk.js} +1 -1
  8. package/dist/public/assets/{PaneEditorBody-CbwKaj3E.js → PaneEditorBody-DcKD_h3y.js} +37 -37
  9. package/dist/public/assets/SettingsDialog-DnKM8XfN.js +1 -0
  10. package/dist/public/assets/{Terminal-CN5FGN0_.js → Terminal-caEYfoyF.js} +2 -2
  11. package/dist/public/assets/Workspace-CLlQSOdM.js +7 -0
  12. package/dist/public/assets/api-B3lAdmrV.js +73 -0
  13. package/dist/public/assets/{buffer-store-CiF8VU5A.js → buffer-store-CcaCClCj.js} +3 -3
  14. package/dist/public/assets/{context-menu-Bitp8sY-.js → context-menu-B72__pRf.js} +1 -1
  15. package/dist/public/assets/{cssMode-cJJRRtLZ.js → cssMode-C2T_OhZu.js} +1 -1
  16. package/dist/public/assets/editor-sync-BFRyMqUU.js +1 -0
  17. package/dist/public/assets/hotkeys-aKIAG8uQ.js +1 -0
  18. package/dist/public/assets/{htmlMode-Caw-2LOw.js → htmlMode-D7FIn_wE.js} +1 -1
  19. package/dist/public/assets/index-BKVDB6Tt.css +2 -0
  20. package/dist/public/assets/index-XKVW8P77.js +10 -0
  21. package/dist/public/assets/{jsonMode-CijUS1dz.js → jsonMode-Cm_XrMpQ.js} +1 -1
  22. package/dist/public/assets/preview-kind-CT1bv1az.js +1 -0
  23. package/dist/public/assets/{session-seed-B2YmPsU-.js → session-seed-DAf7EH_e.js} +1 -1
  24. package/dist/public/assets/ssh-mode-B0WDpTq0.js +1 -0
  25. package/dist/public/assets/{tsMode-_wbIu1Es.js → tsMode-CLCblX8J.js} +1 -1
  26. package/dist/public/index.html +5 -5
  27. package/package.json +1 -1
  28. package/dist/public/assets/Dashboard-Sq34AFXs.js +0 -1
  29. package/dist/public/assets/EditorTabClose-C5BL8wr0.js +0 -1
  30. package/dist/public/assets/LazyTerminal-CeLHCKsO.js +0 -2
  31. package/dist/public/assets/SettingsDialog-BuTx8DF2.js +0 -1
  32. package/dist/public/assets/Workspace-NHcfAFZP.js +0 -7
  33. package/dist/public/assets/api-CZDct42i.js +0 -73
  34. package/dist/public/assets/debounce-B9DrqirV.js +0 -1
  35. package/dist/public/assets/editor-sync-f1V6Wuxn.js +0 -1
  36. package/dist/public/assets/editor-tabs-3ilPGolh.js +0 -1
  37. package/dist/public/assets/index-CRUVuFoo.css +0 -2
  38. package/dist/public/assets/index-iPj6x3rM.js +0 -10
  39. package/dist/public/assets/profile-store-D2pB4wB-.js +0 -1
  40. package/dist/public/assets/ssh-mode-CAA0-mpZ.js +0 -1
package/CHANGELOG.md CHANGED
@@ -7,17 +7,44 @@ Past releases: see docs/changelogs/.
7
7
 
8
8
  # Changelog
9
9
 
10
- ## [0.0.20] — 2026-08-03
10
+ ## [0.0.22] — 2026-08-03
11
+
12
+ ### Added
13
+
14
+ - Sidebar project names (expanded header and collapsed rail label) right-click into a menu that starts a new agent or terminal in that project, and drag to reorder projects — persisting the same `projectOrder` the homescreen cards drag; while a name drags, the session lists collapse so only the names reposition.
15
+ - The collapsed rail's project label shows the full project name in a tooltip.
16
+ - Project-based layout (Settings → Appearance, default off; protocol 11.2): the centre editor persists one layout per profile **and project** — switching projects swaps in that project's own tiling tree and restores its active session — while the sidebar keeps every project name but lists only the current project's sessions. Toggling converts the snapshot once: on splits the shared tree into per-project slices (each keeping its structure with only that project's tabs), off unions the slices back side by side with tabs deduplicated.
17
+ - The desktop app gets its own default hotkey set where native gestures are more intuitive: ⌘W closes the current tab (the shell's Close Window moves to ⌘⇧W), ⌘B toggles the left sidebar, ⌘T opens a new agent. Web defaults are unchanged, and per-profile custom bindings still apply in both shells.
18
+ - Projects carry a customisable ≤5-character abbreviation (protocol 12.1) — the collapsed sidebar rail's label. Set it at creation (prefilled from the name), edit it with the name in the homescreen card's Edit dialogue, or single-click the active project's label in the sidebar to edit in place: the abbreviation on the collapsed rail, the full name on the expanded header. Clicking any other project still navigates.
19
+ - Single-clicking the already-selected file in the file tree starts an inline rename (Finder-style, after a beat so double-click still opens); F2 keeps working.
20
+ - Sessions archive by drag: drop a session — a sidebar row, a rail dot, or a centre terminal tab chip — onto the sidebar's Archived header, or onto the new archive icon at the collapsed rail's foot (clicking it expands the sidebar). The header appears during a drag even when nothing is archived yet.
21
+ - Saved layouts (protocol 12.2): a top-bar **Layouts** popover (between Settings and the Scratchpad, ⌥⌘L) saves and loads named snapshots of the tiling layout. The head shows the live layout — the saved name it derives from (`ui_state.layout_ref`) or "Unnamed layout", plus an honest Saved / Unsaved changes state that ignores tab focus — with Save (overwrite in place) and Save as new; the list below is the whole profile's saved catalogue (project rows labelled with their project's name), with inline rename, delete, and load, and an inline confirm before a load discards unsaved changes — computed against exactly the state the load replaces. Under project-based layout every project keeps its own current layout (each with its own name and saved/unsaved status): loading another project's layout lands in that project's slice and leaves the visible one untouched. Loading works from the dashboard too — the popover writes the persisted layout state directly and the next workspace open restores it. Layouts are profile- or project-scoped per the project-based-layout setting at save time; loading across scopes flips the setting with the union/shard conversion suppressed, and a shard never overwrites a stored per-project slice (existing slices win; shards fill only the gaps), so nothing is erased. New endpoint group `GET/POST/PATCH/DELETE /api/layouts` + `layouts` table (migration 019).
22
+ - The Layouts list filters by project (chips: Profile-wide plus one per project owning a layout, narrowing only), and an unnamed live layout can be saved into an existing compatible saved layout — adopting its name — behind an inline overwrite confirm.
23
+ - Tooltips on the top bar's Scratchpad and Profile buttons (Settings already had one; the new Layouts button ships with one).
24
+ - The parent-directory browse tree is now the full file tree (protocol 12.3): right-clicking above the worktree offers New File/Folder, Rename, Delete, cut/copy/paste, drag-move, drag-in upload, and Download, because the fs mutation and upload routes accept the same `?root=` override the read routes already took. Git decorations and "Open Terminal in Directory" stay worktree-only (both are worktree-scoped on the daemon), and against a daemon older than 12.3 the tree goes read-only rather than resolving those paths against the wrong directory. The browse tree also highlights the row of the active external editor tab, and the header's Refresh · Collapse Folders now drive it.
25
+ - The new agent / new terminal dialogue can retarget its project: the project name in the description is a dim inline dropdown (seeded from the current project, or the one whose sidebar header was right-clicked), and switching it re-seeds the branch fields against the new repository. With one project it stays plain text.
11
26
 
12
27
  ### Changed
13
28
 
14
- - Place Settings Sync export above import, keeping the one-click export-and-copy flow ahead of the paste target it produces.
15
- - Session rows and tabs show one glyph, not two: the agent's brand mark (or a terminal glyph) drawn in the status colour, replacing the separate coloured dot beside it. The collapsed session rail keeps the dotthere is no mark beside it to deduplicate. The sidebar's account line drops its agent mark too, now that the row already leads with one.
29
+ - Markdown and HTML previews follow the editor font size setting (HTML as a zero-specificity default the document's own styles override).
30
+ - A dirty editor tab's dot now sits after the filename the chip widens for it up to its cap, past which the name truncates instead of overlaying the title; it hides on hover where the close × appears.
31
+ - New sessions default to working directly on the base branch in its shared directory, for agents and terminals alike; separate branch/directory remain one toggle away and per-profile seeds still override.
32
+ - "Sync locally" is enabled by default (every group) for profiles with no stored entry; the toggle still turns it off.
33
+ - The Density setting does something: compact (the default) tightens vertical spacing in both sidebars — session rows, rail dots, file-tree rows — and the collapsed rail's session glyphs grew to fill their containers; comfortable keeps the previous roomier spacing.
34
+ - Numeric settings inputs commit on blur or Enter instead of every keystroke, so a font size can be cleared and retyped without applying mid-edit; empty or invalid input reverts.
35
+ - Rename gestures settled: files rename on a second single click within ~1.5 s (Finder-style; double-click still pins), while FOLDERS and the sidebar's project name/abbreviation rename on a plain double-click — folder single clicks always toggle, and a label's first click navigates as usual.
36
+ - The new-project "browse…" picker treats the path input as its single source of truth: navigating writes the browsed directory into the field (the picker's own path line is gone), and "choose" fills the project name from the directory's basename and closes the picker.
37
+ - The "All projects in the sidebar" setting became "Project-based layout" (its inverse; a stored choice migrates). The sidebar's Archived disclosure now follows the same scoping: every project's archived sessions in the default profile-based layout, only the current project's under project-based layout.
38
+ - Protocol major bumped to 12.0 (no schema change beyond 11.2's additive keys, on purpose): every connected daemon auto-upgrades at the next `puddle launch` handshake, so all deployments parse the project-based-layout snapshot keys instead of merely round-tripping them, and none linger on early 11.x.
16
39
 
17
- ### Fixed
40
+ ### Removed
18
41
 
19
- - Show Codex's observed idle composer and Claude's first completed prompt as waiting-for-input green instead of leaving their status running amber.
42
+ - The "browser-reserved" warnings in Settings → Hotkeys (the ⌘W/⌘T/… flagging and the intro's caveat): any combo is bindable without commentary; the conflict warning between two app shortcuts remains.
20
43
 
21
- ### Removed
44
+ ### Fixed
22
45
 
23
- - Status animations, and the **Reduced motion** setting with them. The running ripple and the waiting pulse are gone: the indicator's colour already carried the state and the motion only repeated it, at the cost of compositor frames after every status change on every visible session. With nothing left animating there is nothing for reduced motion to reduce, so the Appearance toggle has gone too — an existing value in local storage is simply ignored, and an imported settings payload carrying it is skipped.
46
+ - Clicking anywhere on the browse tree's path line walks up a directory, instead of only the small corner icon; the line ends where the return-to-worktree button begins.
47
+ - Rebinding a shortcut is reflected in the copy that names it: the top bar's command field, an empty pane's palette button, the empty session list and empty dashboard all show the live command-palette binding instead of a hard-coded ⌘K, and the two draft-save prompts show the live Save binding instead of ⌘S.
48
+ - A file tab's hover controls no longer square off its top-right corner — their background carries the chip's own rounding.
49
+ - `~` paths autocomplete properly everywhere (project picker, account import path, any directory field): the daemon's tilde expansion dropped the trailing slash, so `~/` completed home's own name inside its parent instead of listing home, and any deeper `~/…/` prefix suggested nothing.
50
+ - Optional form fields no longer sit empty and get silently reinterpreted on submit: the profile-creation branch prefix, the new-session base branch, and the tab-title template are prefilled with the default they would have become (clearing the profile branch prefix now honestly means no prefix). Placeholders that lied were corrected — the settings branch prefix says "no prefix", the host display name shows the real hostname fallback, the editor SSH-host field shows the tunnelled host already in effect — and clearing a numeric host setting no longer PATCHes a rejected 0. The settings "Repositories" tab is now "Projects" (old #settings/repositories links still resolve).
package/README.md CHANGED
@@ -58,6 +58,8 @@ curl -fsSL https://github.com/PerceptronV/puddle-code/releases/latest/download/i
58
58
 
59
59
  The same cockpit also ships as a standalone desktop app — identical UI and engine, plus a File → "Connect to SSH Host…" menu for remote hosts. Grab the dmg (macOS arm64) or AppImage (Linux x64) from the Releases page.
60
60
 
61
+ On macOS, an installed Puddle CLI can install or update the desktop app directly: quit Puddle, then run `puddle upgrade desktop`. A fresh install goes to `/Applications` when writable, otherwise `~/Applications`.
62
+
61
63
  The macOS downloads are **not code-signed** (an open-source project without Apple Developer Program fees), so Gatekeeper will refuse the first launch. Either allow it once — open the app, let macOS block it, then System Settings → Privacy & Security → **Open Anyway** — or clear the download quarantine in a terminal:
62
64
 
63
65
  ```sh
package/dist/index.js CHANGED
@@ -3930,7 +3930,7 @@ daemon restart if needed \u2014 keeping the old UI port so open tabs survive.
3930
3930
  list shows running cockpits; kill stops one \u2014 sessions keep running on the
3931
3931
  host either way. upgrade with no subject updates the CLI itself through npm;
3932
3932
  'daemon' updates puddled (on this machine, or on a user@host) and 'desktop'
3933
- updates the app bundle.`;
3933
+ installs or updates the macOS app bundle (Linux AppImages update in-app).`;
3934
3934
  function parseArgs(argv) {
3935
3935
  const [cmd, ...rest] = argv;
3936
3936
  if (cmd === void 0 || cmd === "help" || cmd === "--help" || cmd === "-h")
@@ -4147,15 +4147,15 @@ function argvFor(command) {
4147
4147
  init_attach();
4148
4148
  import { spawn as spawn7 } from "node:child_process";
4149
4149
  import { existsSync as existsSync3 } from "node:fs";
4150
- import { dirname as dirname6, join as join9 } from "node:path";
4150
+ import { dirname as dirname7, join as join9 } from "node:path";
4151
4151
  import { fileURLToPath as fileURLToPath3 } from "node:url";
4152
4152
 
4153
4153
  // src/lib/desktop-update.ts
4154
4154
  import { createHash } from "node:crypto";
4155
4155
  import { spawn } from "node:child_process";
4156
- import { createReadStream, createWriteStream } from "node:fs";
4157
- import { chmod, mkdir, readdir, rm, writeFile } from "node:fs/promises";
4158
- import { join as join3 } from "node:path";
4156
+ import { constants, createReadStream, createWriteStream } from "node:fs";
4157
+ import { access, chmod, mkdir, readdir, rm, writeFile } from "node:fs/promises";
4158
+ import { dirname as dirname2, join as join3 } from "node:path";
4159
4159
  import { Readable } from "node:stream";
4160
4160
  import { pipeline } from "node:stream/promises";
4161
4161
 
@@ -4184,7 +4184,7 @@ import { readFileSync } from "node:fs";
4184
4184
  import { dirname, join as join2 } from "node:path";
4185
4185
  import { fileURLToPath } from "node:url";
4186
4186
  function cliVersion() {
4187
- if (true) return "0.0.20";
4187
+ if (true) return "0.0.22";
4188
4188
  const here = dirname(fileURLToPath(import.meta.url));
4189
4189
  for (const candidate of [
4190
4190
  join2(here, "..", "..", "package.json"),
@@ -4351,9 +4351,15 @@ function swapScript(staged, opts) {
4351
4351
  `# puddle desktop update ${staged.version} \u2014 swap once the app exits`,
4352
4352
  ...wait,
4353
4353
  `target=${q(opts.targetPath)}`,
4354
+ `target_dir=${q(dirname2(opts.targetPath))}`,
4354
4355
  `staged=${q(staged.stagedPath)}`,
4356
+ `mkdir -p "$target_dir" || exit 1`,
4355
4357
  `rm -rf "$target.old"`,
4356
- `mv "$target" "$target.old" || exit 1`,
4358
+ `had_old=0`,
4359
+ `if [ -e "$target" ]; then`,
4360
+ ` mv "$target" "$target.old" || exit 1`,
4361
+ ` had_old=1`,
4362
+ `fi`,
4357
4363
  `if mv "$staged" "$target" 2>/dev/null || /usr/bin/ditto "$staged" "$target"; then`,
4358
4364
  // Defence in depth: the normal path never quarantines (node's fetch is
4359
4365
  // not a quarantine-opted-in app, and ditto only propagates what the
@@ -4363,7 +4369,8 @@ function swapScript(staged, opts) {
4363
4369
  ` rm -rf "$target.old" ${q(staged.dir)}`,
4364
4370
  ...opts.relaunch ? [` open "$target"`] : [],
4365
4371
  `else`,
4366
- ` mv "$target.old" "$target"`,
4372
+ ` rm -rf "$target"`,
4373
+ ` [ "$had_old" -eq 0 ] || mv "$target.old" "$target"`,
4367
4374
  ` exit 1`,
4368
4375
  `fi`,
4369
4376
  ``
@@ -4381,11 +4388,16 @@ function swapScript(staged, opts) {
4381
4388
  ``
4382
4389
  ].join("\n");
4383
4390
  }
4384
- async function findInstalledDesktopApp() {
4385
- if (process.platform !== "darwin") return null;
4391
+ async function findInstalledDesktopApp(opts = {}) {
4392
+ if ((opts.platform ?? process.platform) !== "darwin") return null;
4386
4393
  const { readFile } = await import("node:fs/promises");
4387
4394
  const { homedir: homedir2 } = await import("node:os");
4388
- for (const appPath of ["/Applications/Puddle.app", join3(homedir2(), "Applications/Puddle.app")]) {
4395
+ const systemApplications = opts.systemApplicationsDir ?? "/Applications";
4396
+ const home = opts.homeDir ?? homedir2();
4397
+ for (const appPath of [
4398
+ join3(systemApplications, "Puddle.app"),
4399
+ join3(home, "Applications", "Puddle.app")
4400
+ ]) {
4389
4401
  try {
4390
4402
  const plist = await readFile(join3(appPath, "Contents/Info.plist"), "utf8");
4391
4403
  const match = /<key>CFBundleShortVersionString<\/key>\s*<string>([^<]+)<\/string>/.exec(
@@ -4397,6 +4409,23 @@ async function findInstalledDesktopApp() {
4397
4409
  }
4398
4410
  return null;
4399
4411
  }
4412
+ async function desktopAppInstallPath(opts = {}) {
4413
+ if ((opts.platform ?? process.platform) !== "darwin") return null;
4414
+ const { homedir: homedir2 } = await import("node:os");
4415
+ const systemApplications = opts.systemApplicationsDir ?? "/Applications";
4416
+ const canWrite = opts.canWrite ?? (async (path) => {
4417
+ try {
4418
+ await access(path, constants.W_OK);
4419
+ return true;
4420
+ } catch {
4421
+ return false;
4422
+ }
4423
+ });
4424
+ if (await canWrite(systemApplications)) return join3(systemApplications, "Puddle.app");
4425
+ const userApplications = join3(opts.homeDir ?? homedir2(), "Applications");
4426
+ await mkdir(userApplications, { recursive: true });
4427
+ return join3(userApplications, "Puddle.app");
4428
+ }
4400
4429
  function isDesktopAppRunning(appPath) {
4401
4430
  return new Promise((resolve3) => {
4402
4431
  const child = spawn("/usr/bin/pgrep", ["-f", `${appPath}/Contents/MacOS/`], {
@@ -4440,7 +4469,7 @@ function openBrowser(url2, platform = process.platform) {
4440
4469
  import { join as join6 } from "node:path";
4441
4470
 
4442
4471
  // ../shared/src/protocol.ts
4443
- var PROTOCOL_VERSION = { major: 11, minor: 1 };
4472
+ var PROTOCOL_VERSION = { major: 12, minor: 3 };
4444
4473
 
4445
4474
  // ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
4446
4475
  var external_exports = {};
@@ -19122,10 +19151,10 @@ var profileSettingsSchema = external_exports.looseObject({
19122
19151
  projectOrder: external_exports.array(external_exports.string()).optional(),
19123
19152
  /**
19124
19153
  * Seed defaults for the new-session modal, per kind (SPEC §11). An absent
19125
- * key falls back to the built-ins — agents branch off the base in their own
19126
- * directory; terminals share the base branch's directory. `baseBranch`
19127
- * absent or empty means the repository's default base branch. The modal
19128
- * still enforces that a separate branch always gets its own directory.
19154
+ * key falls back to the built-ins — since 2026-08-03 both kinds share the
19155
+ * base branch's directory. `baseBranch` absent or empty means the
19156
+ * repository's default base branch. The modal still enforces that a
19157
+ * separate branch always gets its own directory.
19129
19158
  */
19130
19159
  sessionDefaults: sessionDefaultsSchema.optional(),
19131
19160
  /**
@@ -19444,11 +19473,13 @@ var archiveRequestSchema = external_exports.object({
19444
19473
  });
19445
19474
 
19446
19475
  // ../shared/src/api/projects.ts
19476
+ var projectAbbrev = external_exports.string().min(1).max(5);
19447
19477
  var projectSchema = external_exports.object({
19448
19478
  id: projectId,
19449
19479
  profile_id: profileId,
19450
19480
  repo_id: rowId,
19451
19481
  name: external_exports.string(),
19482
+ abbrev: projectAbbrev.nullable().default(null),
19452
19483
  /**
19453
19484
  * Hidden from the homescreen but never deleted — every session, worktree, and
19454
19485
  * bit of data is retained, and un-archiving restores it all (SPEC §11).
@@ -19461,10 +19492,12 @@ var projectSchema = external_exports.object({
19461
19492
  var createProjectRequestSchema = external_exports.object({
19462
19493
  profile_id: profileId,
19463
19494
  repo_id: rowId,
19464
- name: external_exports.string().min(1).max(100)
19495
+ name: external_exports.string().min(1).max(100),
19496
+ abbrev: projectAbbrev.optional()
19465
19497
  });
19466
19498
  var patchProjectRequestSchema = external_exports.object({
19467
19499
  name: external_exports.string().min(1).max(100).optional(),
19500
+ abbrev: projectAbbrev.optional(),
19468
19501
  archived: external_exports.boolean().optional()
19469
19502
  });
19470
19503
  var projectDetailSchema = external_exports.object({
@@ -19550,6 +19583,16 @@ var layoutNodeSchema = external_exports.lazy(
19550
19583
  })
19551
19584
  ])
19552
19585
  );
19586
+ var projectLayoutSchema = external_exports.looseObject({
19587
+ layout_tree: layoutNodeSchema.nullable().default(null),
19588
+ active_session: sessionId.nullable().default(null),
19589
+ /**
19590
+ * The saved layout (12.2, `/api/layouts` row id) this slice was last loaded
19591
+ * from or saved as — the popover shows the layout as named while it matches
19592
+ * and "unsaved changes" once the tree drifts. Null: an unnamed layout.
19593
+ */
19594
+ layout_ref: rowId.nullable().default(null)
19595
+ });
19553
19596
  var uiStateSnapshotSchema = external_exports.looseObject({
19554
19597
  session_tabs: external_exports.array(sessionId).default([]),
19555
19598
  active_session: sessionId.nullable().default(null),
@@ -19590,7 +19633,28 @@ var uiStateSnapshotSchema = external_exports.looseObject({
19590
19633
  * open and where. Null on legacy snapshots — the web rebuilds an equivalent
19591
19634
  * tree from `editor_tabs`/`session_tabs`/`layout` on first load.
19592
19635
  */
19593
- layout_tree: layoutNodeSchema.nullable().default(null)
19636
+ layout_tree: layoutNodeSchema.nullable().default(null),
19637
+ /**
19638
+ * Which keying the snapshot's layouts were last maintained under (11.2,
19639
+ * SPEC §11): absent or `profile` means the top-level `layout_tree`/
19640
+ * `active_session` are live; `project` means `project_layouts` is. The web
19641
+ * transitions between the two when the client's project-based layout
19642
+ * setting flips (split on the way in, union on the way out) and stamps the
19643
+ * mode it left the snapshot in, so a snapshot toggled elsewhere converts
19644
+ * exactly once.
19645
+ */
19646
+ layout_mode: external_exports.enum(["profile", "project"]).optional(),
19647
+ /**
19648
+ * Per-project layouts (11.2, SPEC §11), live only while `layout_mode` is
19649
+ * `project`: project id → that project's tiling tree and bound session.
19650
+ */
19651
+ project_layouts: external_exports.record(external_exports.string(), projectLayoutSchema).default({}),
19652
+ /**
19653
+ * The saved layout (12.2) the top-level profile-wide layout was last loaded
19654
+ * from or saved as, live only while `layout_mode` is absent or `profile` —
19655
+ * the per-project counterpart lives on each `project_layouts` slice.
19656
+ */
19657
+ layout_ref: rowId.nullable().default(null)
19594
19658
  });
19595
19659
  var putUiStateRequestSchema = external_exports.object({
19596
19660
  ui_state: uiStateSnapshotSchema
@@ -19600,6 +19664,34 @@ var uiStateResponseSchema = external_exports.object({
19600
19664
  updated_at: isoTimestamp
19601
19665
  });
19602
19666
 
19667
+ // ../shared/src/api/layouts.ts
19668
+ var layoutScopeSchema = external_exports.enum(["project", "profile"]);
19669
+ var savedLayoutSchema = external_exports.object({
19670
+ id: rowId,
19671
+ profile_id: profileId,
19672
+ scope: layoutScopeSchema,
19673
+ /** Set iff `scope === 'project'` — the project the layout was saved in. */
19674
+ project_id: projectId.nullable(),
19675
+ name: external_exports.string(),
19676
+ layout_tree: layoutNodeSchema.nullable(),
19677
+ active_session: sessionId.nullable(),
19678
+ created_at: isoTimestamp,
19679
+ updated_at: isoTimestamp
19680
+ });
19681
+ var createLayoutRequestSchema = external_exports.object({
19682
+ profile_id: profileId,
19683
+ scope: layoutScopeSchema,
19684
+ project_id: projectId.optional(),
19685
+ name: external_exports.string().min(1).max(200),
19686
+ layout_tree: layoutNodeSchema.nullable(),
19687
+ active_session: sessionId.nullable().optional()
19688
+ });
19689
+ var patchLayoutRequestSchema = external_exports.object({
19690
+ name: external_exports.string().min(1).max(200).optional(),
19691
+ layout_tree: layoutNodeSchema.nullable().optional(),
19692
+ active_session: sessionId.nullable().optional()
19693
+ });
19694
+
19603
19695
  // ../shared/src/api/worktrees.ts
19604
19696
  var pasteImageMimeSchema = external_exports.enum(["image/png", "image/jpeg", "image/gif", "image/webp"]);
19605
19697
  var pasteImageRequestSchema = external_exports.object({
@@ -19949,7 +20041,7 @@ async function waitForToken(transport, timeoutMs) {
19949
20041
 
19950
20042
  // src/lib/bootstrap.ts
19951
20043
  import { existsSync, readFileSync as readFileSync2 } from "node:fs";
19952
- import { dirname as dirname2, join as join4, resolve } from "node:path";
20044
+ import { dirname as dirname3, join as join4, resolve } from "node:path";
19953
20045
  import { fileURLToPath as fileURLToPath2 } from "node:url";
19954
20046
  init_types();
19955
20047
  async function installedVersion(transport) {
@@ -20019,7 +20111,7 @@ function lastLines(text, count = 3) {
20019
20111
  return text.trim().split("\n").slice(-count).join("\n");
20020
20112
  }
20021
20113
  function readInstallScript() {
20022
- const here = dirname2(fileURLToPath2(import.meta.url));
20114
+ const here = dirname3(fileURLToPath2(import.meta.url));
20023
20115
  const candidates = [
20024
20116
  join4(here, "install.sh"),
20025
20117
  // dist/index.js → dist/install.sh
@@ -20183,7 +20275,7 @@ function isLocalOrigin(origin) {
20183
20275
 
20184
20276
  // src/lib/serve/local-sync.ts
20185
20277
  import { mkdirSync, readFileSync as readFileSync3, renameSync, writeFileSync } from "node:fs";
20186
- import { dirname as dirname3 } from "node:path";
20278
+ import { dirname as dirname4 } from "node:path";
20187
20279
  var MAX_BODY_BYTES = 5 * 1024 * 1024;
20188
20280
  function readStore(file2) {
20189
20281
  try {
@@ -20196,7 +20288,7 @@ function readStore(file2) {
20196
20288
  return { version: 1, profiles: {} };
20197
20289
  }
20198
20290
  function writeStore(file2, store) {
20199
- mkdirSync(dirname3(file2), { recursive: true });
20291
+ mkdirSync(dirname4(file2), { recursive: true });
20200
20292
  const tmp = `${file2}.tmp-${process.pid}`;
20201
20293
  writeFileSync(tmp, JSON.stringify(store, null, 2) + "\n");
20202
20294
  renameSync(tmp, file2);
@@ -20734,7 +20826,7 @@ async function openTunnel(ssh, remotePort, opts = {}) {
20734
20826
  // src/lib/transport/local.ts
20735
20827
  import { spawn as spawn4 } from "node:child_process";
20736
20828
  import { copyFileSync, mkdirSync as mkdirSync2, readFileSync as readFileSync4 } from "node:fs";
20737
- import { dirname as dirname4 } from "node:path";
20829
+ import { dirname as dirname5 } from "node:path";
20738
20830
  var LocalTransport = class {
20739
20831
  kind = "local";
20740
20832
  label = "this machine";
@@ -20775,7 +20867,7 @@ var LocalTransport = class {
20775
20867
  }
20776
20868
  copyTo(localPath, destPath) {
20777
20869
  const dest = expandHome(destPath);
20778
- mkdirSync2(dirname4(dest), { recursive: true });
20870
+ mkdirSync2(dirname5(dest), { recursive: true });
20779
20871
  copyFileSync(localPath, dest);
20780
20872
  return Promise.resolve();
20781
20873
  }
@@ -21188,7 +21280,7 @@ async function upgradeDaemon(transport, opts = {}) {
21188
21280
  // src/cli/detach.ts
21189
21281
  import { spawn as spawn6 } from "node:child_process";
21190
21282
  import { closeSync, mkdirSync as mkdirSync5, openSync, readFileSync as readFileSync6 } from "node:fs";
21191
- import { dirname as dirname5 } from "node:path";
21283
+ import { dirname as dirname6 } from "node:path";
21192
21284
  init_types();
21193
21285
  var COCKPIT_CHILD_ENV = "PUDDLE_COCKPIT_CHILD";
21194
21286
  var READY_TIMEOUT_MS = 3e5;
@@ -21229,7 +21321,7 @@ async function launchDetached(opts) {
21229
21321
  }
21230
21322
  if (target !== "local") await new SshTransport(target).open();
21231
21323
  const logFile = cockpitLogPath(target);
21232
- mkdirSync5(dirname5(logFile), { recursive: true });
21324
+ mkdirSync5(dirname6(logFile), { recursive: true });
21233
21325
  const fd = openSync(logFile, "w");
21234
21326
  const argv = opts.argv ?? process.argv.slice(2);
21235
21327
  const child = spawn6(process.execPath, [process.argv[1] ?? "", ...argv], {
@@ -21294,7 +21386,7 @@ async function followStartup(target, childPid, logFile) {
21294
21386
  }
21295
21387
  function spawnDetachedRefresh(target, argv) {
21296
21388
  const logFile = cockpitLogPath(target);
21297
- mkdirSync5(dirname5(logFile), { recursive: true });
21389
+ mkdirSync5(dirname6(logFile), { recursive: true });
21298
21390
  const fd = openSync(logFile, "a");
21299
21391
  const env = { ...process.env };
21300
21392
  delete env[COCKPIT_CHILD_ENV];
@@ -21351,7 +21443,7 @@ function timestampedLogger() {
21351
21443
 
21352
21444
  // src/cli/run.ts
21353
21445
  function assetsDir() {
21354
- const here = dirname6(fileURLToPath3(import.meta.url));
21446
+ const here = dirname7(fileURLToPath3(import.meta.url));
21355
21447
  for (const candidate of [join9(here, "public"), join9(here, "..", "..", "dist", "public")]) {
21356
21448
  if (existsSync3(join9(candidate, "index.html"))) return candidate;
21357
21449
  }
@@ -21689,33 +21781,41 @@ function upgradeCli(logger) {
21689
21781
  }
21690
21782
  async function upgradeDesktop(logger) {
21691
21783
  const installed = await findInstalledDesktopApp();
21692
- if (installed === null) {
21784
+ const targetPath = installed?.appPath ?? await desktopAppInstallPath();
21785
+ if (targetPath === null) {
21693
21786
  throw new CliError(
21694
21787
  "not_installed",
21695
21788
  "no Puddle.app in /Applications or ~/Applications",
21696
21789
  process.platform === "linux" ? "AppImages carry no fixed path \u2014 update from the app itself (its banner knows $APPIMAGE)" : void 0
21697
21790
  );
21698
21791
  }
21699
- if (await isDesktopAppRunning(installed.appPath)) {
21792
+ if (installed !== null && await isDesktopAppRunning(installed.appPath)) {
21700
21793
  throw new CliError(
21701
21794
  "already_running",
21702
21795
  "Puddle is running \u2014 use its update banner, or quit it and rerun"
21703
21796
  );
21704
21797
  }
21705
- const update = await checkForDesktopUpdate(installed.version);
21798
+ const update = await checkForDesktopUpdate(installed?.version ?? "0.0.0");
21706
21799
  if (update === null) {
21800
+ if (installed === null) {
21801
+ throw new CliError(
21802
+ "not_installed",
21803
+ "no Puddle desktop release is available for this macOS architecture"
21804
+ );
21805
+ }
21707
21806
  logger.info(`Puddle ${installed.version} is already the latest release`);
21708
21807
  return 0;
21709
21808
  }
21710
- logger.info(`Puddle ${installed.version} \u2192 ${update.version}`);
21809
+ if (installed === null) logger.info(`installing Puddle ${update.version}`);
21810
+ else logger.info(`Puddle ${installed.version} \u2192 ${update.version}`);
21711
21811
  const staged = await stageDesktopUpdate(update, { logger });
21712
21812
  await applyDesktopUpdate(staged, {
21713
- targetPath: installed.appPath,
21813
+ targetPath,
21714
21814
  detach: false,
21715
21815
  relaunch: false,
21716
21816
  logger
21717
21817
  });
21718
- logger.info(`Puddle ${update.version} installed at ${installed.appPath}`);
21818
+ logger.info(`Puddle ${update.version} installed at ${targetPath}`);
21719
21819
  return 0;
21720
21820
  }
21721
21821
  async function runCockpit(command, target, terminal) {
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{t as n}from"./jsx-runtime-ffCh33zF.js";import{f as r,g as i}from"./hotkeys-aKIAG8uQ.js";import{a}from"./api-B3lAdmrV.js";import{a as o,g as s,i as c,n as l,o as u,t as d}from"./dialog-B43iKmfK.js";import{H as f,K as p,U as m,Y as h,a as g,at as _,ct as v,et as y,o as b,r as x,st as S,t as C}from"./LazyTerminal-C0RZlCLg.js";import{t as w}from"./utils-B6KiDbIe.js";import{A as T,O as E,c as D,j as O,k,n as A,r as j,t as M}from"./context-menu-B72__pRf.js";import{r as N}from"./dist-i-QevsUb.js";import{$ as P,Mt as F,nt as I,pt as L,rt as R,tt as z,yt as B}from"./index-XKVW8P77.js";var V=e(t(),1),H=n(),U=!1;function W(){let[e,t]=(0,V.useState)(U),[n,r]=(0,V.useState)(null);(0,V.useEffect)(()=>{if(!e)return;let t=!1;return R.spawnShell(a).then(e=>{t||r(e)}),()=>{t=!0}},[e]);let i=()=>{U=!1,t(!1),r(null)};return{open:e,term:n,toggle:()=>{e?(n&&R.killShell(a,n),i()):(U=!0,t(!0))},onExit:i}}function G({term:e,onExit:t}){return(0,H.jsx)(`div`,{className:`h-72 shrink-0 pb-6`,children:(0,H.jsx)(`div`,{className:`mx-auto size-full max-w-4xl px-6`,children:e!==null&&(0,H.jsx)(C,{stream:`home`,term:e,onExit:t})})})}var K=[{status:`running`,colour:`bg-running`},{status:`waiting_input`,colour:`bg-waiting`},{status:`interrupted`,colour:`bg-interrupted`}];function q({projectId:e}){let t=_(e),n=(0,V.useMemo)(()=>{let e=new Map;for(let n of t.data??[])e.set(n.status,(e.get(n.status)??0)+1);return e},[t.data]),r=(t.data??[]).filter(e=>e.status!==`archived`).length;return(0,H.jsxs)(`div`,{className:`flex items-center gap-3 text-2xs text-fg-muted tabular-nums`,children:[(0,H.jsxs)(`span`,{children:[r,` session`,r===1?``:`s`]}),K.map(({status:e,colour:t})=>{let r=n.get(e)??0;return r===0?null:(0,H.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,H.jsx)(`span`,{className:`size-1.5 rounded-full ${t}`}),r,` `,e.replace(`_`,` `)]},e)})]})}function J({icon:e,label:t,onClick:n}){return(0,H.jsx)(`button`,{type:`button`,"aria-label":t,title:t,onClick:e=>{e.preventDefault(),e.stopPropagation(),n()},className:`flex items-center rounded-md p-1.5 text-fg-muted transition-colors hover:bg-ground hover:text-fg`,children:(0,H.jsx)(e,{className:`size-4`})})}function Y({project:e,repoPath:t,draggable:n,dragging:r,onDragStart:i,onDragEnd:a,onDragOver:f}){let p=m(),[h,_]=(0,V.useState)(!1),[y,b]=(0,V.useState)(e.name),[C,E]=(0,V.useState)(I(e)),k=t=>p.mutate({id:e.id,archived:t},{onError:e=>x(e)}),N=()=>{b(e.name),E(I(e)),_(!0)},P=()=>{let t=y.trim(),n=z(C);if(!t){_(!1);return}let r={...t===e.name?{}:{name:t},...n&&n!==I(e)?{abbrev:n}:{}};if(Object.keys(r).length===0){_(!1);return}p.mutate({id:e.id,...r},{onSuccess:()=>_(!1),onError:e=>x(e)})};return(0,H.jsxs)(H.Fragment,{children:[(0,H.jsxs)(M,{children:[(0,H.jsx)(D,{asChild:!0,children:(0,H.jsxs)(`div`,{draggable:n,onDragStart:i,onDragEnd:a,onDragOver:f,className:w(`group relative transition-opacity`,r&&`opacity-50`),children:[(0,H.jsxs)(F,{draggable:!1,to:`/project/${e.id}`,className:`block rounded-lg bg-surface p-4 transition-colors hover:bg-elevated`,children:[(0,H.jsx)(`h2`,{className:`truncate pr-16 text-base font-semibold text-fg group-hover:text-accent`,children:e.name}),(0,H.jsx)(`p`,{className:`mt-1 truncate font-mono text-2xs text-fg-muted`,children:t??`…`}),(0,H.jsx)(`div`,{className:`mt-3`,children:(0,H.jsx)(q,{projectId:e.id})})]}),(0,H.jsx)(`div`,{className:`absolute right-2 top-2 hidden gap-0.5 group-hover:flex has-[[data-state=open]]:flex pointer-coarse:flex`,children:e.archived?(0,H.jsx)(J,{icon:O,label:`Reopen project`,onClick:()=>k(!1)}):(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(J,{icon:g,label:`Edit project`,onClick:N}),(0,H.jsx)(J,{icon:T,label:`Archive project`,onClick:()=>k(!0)})]})})]})}),(0,H.jsx)(A,{children:e.archived?(0,H.jsxs)(j,{onSelect:()=>k(!1),children:[(0,H.jsx)(O,{}),` Reopen`]}):(0,H.jsxs)(H.Fragment,{children:[(0,H.jsxs)(j,{onSelect:N,children:[(0,H.jsx)(g,{}),` Edit`]}),(0,H.jsxs)(j,{onSelect:()=>k(!0),children:[(0,H.jsx)(T,{}),` Archive`]})]})})]}),(0,H.jsx)(d,{open:h,onOpenChange:_,children:(0,H.jsxs)(l,{children:[(0,H.jsx)(o,{children:(0,H.jsx)(u,{children:`Edit project`})}),(0,H.jsxs)(`form`,{className:`flex flex-col gap-3`,onSubmit:e=>{e.preventDefault(),P()},children:[(0,H.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,H.jsx)(S,{htmlFor:`project-name-${e.id}`,children:`Name`}),(0,H.jsx)(v,{id:`project-name-${e.id}`,value:y,onChange:e=>b(e.target.value),autoFocus:!0})]}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,H.jsx)(S,{htmlFor:`project-abbrev-${e.id}`,children:`Abbreviation`}),(0,H.jsx)(v,{id:`project-abbrev-${e.id}`,maxLength:5,value:C,onChange:e=>E(z(e.target.value)),className:`w-24 font-mono uppercase`}),(0,H.jsxs)(`p`,{className:`text-2xs text-fg-muted`,children:[`Up to `,5,` characters — the label on the collapsed sidebar rail.`]})]}),(0,H.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,H.jsx)(S,{className:`text-fg-muted`,children:`Path`}),(0,H.jsx)(`p`,{className:`truncate font-mono text-2xs text-fg-muted`,children:t??`…`})]}),(0,H.jsxs)(c,{children:[(0,H.jsx)(s,{type:`button`,variant:`ghost`,onClick:()=>_(!1),children:`Cancel`}),(0,H.jsx)(s,{type:`submit`,disabled:!y.trim()||p.isPending,children:`Save`})]})]})]})})]})}function X({icon:e,label:t,hint:n,onClick:r}){return(0,H.jsxs)(`button`,{type:`button`,onClick:r,className:`group flex flex-col rounded-lg bg-surface p-4 text-left transition-colors hover:bg-elevated`,children:[(0,H.jsxs)(`h2`,{className:`flex items-center gap-2 truncate text-base font-semibold text-fg group-hover:text-accent`,children:[(0,H.jsx)(e,{className:`size-4 shrink-0`}),t]}),(0,H.jsx)(`p`,{className:`mt-1 truncate text-2xs text-fg-muted`,children:n})]})}function Z(){let e=i(),t=h(e??void 0),n=y(),a=p(e??void 0),o=f(e??``),[s,c]=(0,V.useState)(!1),[l,u]=(0,V.useState)(null),[d,m]=(0,V.useState)(!1),g=W(),_=r(`palette.toggle`),v=e=>n.data?.find(t=>t.id===e)?.path,x=t.data??[],S=a.data?.projectOrder??[],C=E(x.filter(e=>!e.archived),S),D=x.filter(e=>e.archived),O=(e,t)=>{e!==t&&o.mutate({projectOrder:k(C.map(e=>e.id),e,t)})};return(0,H.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,H.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:(0,H.jsxs)(`div`,{className:`mx-auto max-w-4xl p-6`,children:[x.length===0&&(0,H.jsxs)(`div`,{className:`mb-8 mt-16 flex flex-col items-center gap-3 text-center`,children:[(0,H.jsx)(b,{className:`size-8 text-fg-muted`}),(0,H.jsxs)(`p`,{className:`text-sm text-fg-secondary`,children:[`No projects yet — open one below, or press `,_,`.`]})]}),(0,H.jsxs)(`div`,{className:`grid auto-rows-fr grid-cols-1 gap-3 sm:grid-cols-2`,children:[C.map(e=>(0,H.jsx)(Y,{project:e,repoPath:v(e.repo_id),draggable:!0,dragging:l===e.id,onDragStart:()=>u(e.id),onDragEnd:()=>u(null),onDragOver:t=>{t.preventDefault(),l&&l!==e.id&&O(l,e.id)}},e.id)),(0,H.jsx)(X,{icon:B,label:`Open project`,hint:`Point at a repository on this host`,onClick:()=>c(!0)}),(0,H.jsx)(X,{icon:L,label:g.open?`Close terminal`:`Open terminal`,hint:g.open?`End the shell below`:`A shell at ~ for cloning repositories`,onClick:g.toggle})]}),D.length>0&&(0,H.jsxs)(`div`,{className:`mt-6`,children:[(0,H.jsxs)(`button`,{type:`button`,onClick:()=>m(e=>!e),className:`flex items-center gap-1.5 px-1 py-1.5 text-2xs uppercase tracking-wide text-fg-muted transition-colors hover:text-fg`,children:[(0,H.jsx)(N,{className:w(`size-3 transition-transform`,d&&`rotate-90`)}),(0,H.jsx)(T,{className:`size-3`}),(0,H.jsx)(`span`,{children:`Archived`}),(0,H.jsx)(`span`,{className:`tabular-nums`,children:D.length})]}),d&&(0,H.jsx)(`div`,{className:`mt-2 grid grid-cols-1 gap-3 sm:grid-cols-2`,children:D.map(e=>(0,H.jsx)(Y,{project:e,repoPath:v(e.repo_id),draggable:!1,dragging:!1,onDragStart:()=>{},onDragEnd:()=>{},onDragOver:()=>{}},e.id))})]})]})}),g.open&&(0,H.jsx)(G,{term:g.term,onExit:g.onExit}),e!==null&&(0,H.jsx)(P,{profileId:e,open:s,onOpenChange:c})]})}export{Z as Dashboard};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{t as n}from"./jsx-runtime-ffCh33zF.js";import{a as r,g as i,h as a,i as o,n as s,o as c,r as l,t as u}from"./dialog-B43iKmfK.js";import{t as d}from"./createLucideIcon-DyMAgLa3.js";import{l as f,r as p,t as m}from"./buffer-store-CcaCClCj.js";import{s as h,t as g}from"./editor-sync-BFRyMqUU.js";var _=d(`circle`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}]]),v=e(t(),1),y=n();function b(e,t,n){let r=m(e,t,n);return(0,v.useSyncExternalStore)((0,v.useCallback)(e=>f(r,e),[r]),()=>p(r))}function x({session:e,path:t,kind:n,root:r}){return b(e,t,r)&&n!==`commit`?(0,y.jsx)(_,{"aria-hidden":!0,className:`size-2 shrink-0 fill-current text-fg-muted group-hover:hidden`}):null}function S({session:e,path:t,kind:n,root:d,label:f,onClose:p}){let m=b(e,t,d)&&n!==`commit`,[_,x]=(0,v.useState)(!1),S=()=>m?x(!0):p();return(0,y.jsxs)(y.Fragment,{children:[(0,y.jsx)(`button`,{onClick:e=>{e.stopPropagation(),S()},className:`hidden size-4 items-center justify-center rounded-sm text-fg-muted transition-colors hover:text-fg group-hover:flex pointer-coarse:flex`,"aria-label":`Close ${f}`,children:(0,y.jsx)(a,{className:`size-3`})}),(0,y.jsx)(u,{open:_,onOpenChange:e=>!e&&x(!1),children:(0,y.jsxs)(s,{children:[(0,y.jsxs)(r,{children:[(0,y.jsxs)(c,{children:[`Discard changes to `,f,`?`]}),(0,y.jsx)(l,{children:`This file has unsaved changes. Closing the tab will discard them.`})]}),(0,y.jsxs)(o,{children:[(0,y.jsx)(i,{variant:`ghost`,onClick:()=>x(!1),children:`Keep editing`}),(0,y.jsx)(i,{variant:`danger`,onClick:()=>{h(e,t,d),g(e,t,d),x(!1),p()},children:`Discard`})]})]})})]})}export{x as EditorDirtyDot,S as EditorTabClose};
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Terminal-caEYfoyF.js","assets/rolldown-runtime-QTnfLwEv.js","assets/react-CZI7_Jkm.js","assets/jsx-runtime-ffCh33zF.js","assets/api-B3lAdmrV.js","assets/utils-B6KiDbIe.js","assets/index-XKVW8P77.js","assets/hotkeys-aKIAG8uQ.js","assets/preload-helper-Czpn1I53.js","assets/dialog-B43iKmfK.js","assets/createLucideIcon-DyMAgLa3.js","assets/index-BKVDB6Tt.css","assets/ssh-mode-B0WDpTq0.js","assets/Terminal-BrP-ENHg.css"])))=>i.map(i=>d[i]);
2
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{n,t as r}from"./jsx-runtime-ffCh33zF.js";import{S as i,_ as a,v as o,y as s}from"./hotkeys-aKIAG8uQ.js";import{t as c}from"./preload-helper-Czpn1I53.js";import{S as l,n as u}from"./api-B3lAdmrV.js";import{A as d,C as f,O as p,w as m,x as h}from"./dialog-B43iKmfK.js";import{t as g}from"./utils-B6KiDbIe.js";import{t as _}from"./createLucideIcon-DyMAgLa3.js";var v=e(t(),1),y=[`top`,`right`,`bottom`,`left`],b=Math.min,x=Math.max,S=Math.round,C=Math.floor,w=e=>({x:e,y:e}),T={left:`right`,right:`left`,bottom:`top`,top:`bottom`};function E(e,t,n){return x(e,b(t,n))}function D(e,t){return typeof e==`function`?e(t):e}function O(e){return e.split(`-`)[0]}function k(e){return e.split(`-`)[1]}function A(e){return e===`x`?`y`:`x`}function j(e){return e===`y`?`height`:`width`}function M(e){let t=e[0];return t===`t`||t===`b`?`y`:`x`}function N(e){return A(M(e))}function P(e,t,n){n===void 0&&(n=!1);let r=k(e),i=N(e),a=j(i),o=i===`x`?r===(n?`end`:`start`)?`right`:`left`:r===`start`?`bottom`:`top`;return t.reference[a]>t.floating[a]&&(o=B(o)),[o,B(o)]}function F(e){let t=B(e);return[I(e),t,I(t)]}function I(e){return e.includes(`start`)?e.replace(`start`,`end`):e.replace(`end`,`start`)}var L=[`left`,`right`],R=[`right`,`left`],z=[`top`,`bottom`],ee=[`bottom`,`top`];function te(e,t,n){switch(e){case`top`:case`bottom`:return n?t?R:L:t?L:R;case`left`:case`right`:return t?z:ee;default:return[]}}function ne(e,t,n,r){let i=k(e),a=te(O(e),n===`start`,r);return i&&(a=a.map(e=>e+`-`+i),t&&(a=a.concat(a.map(I)))),a}function B(e){let t=O(e);return T[t]+e.slice(t.length)}function re(e){return{top:e.top??0,right:e.right??0,bottom:e.bottom??0,left:e.left??0}}function ie(e){return typeof e==`number`?{top:e,right:e,bottom:e,left:e}:re(e)}function V(e){let{x:t,y:n,width:r,height:i}=e;return{width:r,height:i,top:n,left:t,right:t+r,bottom:n+i,x:t,y:n}}function ae(e,t,n){let{reference:r,floating:i}=e,a=M(t),o=N(t),s=j(o),c=O(t),l=a===`y`,u=r.x+r.width/2-i.width/2,d=r.y+r.height/2-i.height/2,f=r[s]/2-i[s]/2,p;switch(c){case`top`:p={x:u,y:r.y-i.height};break;case`bottom`:p={x:u,y:r.y+r.height};break;case`right`:p={x:r.x+r.width,y:d};break;case`left`:p={x:r.x-i.width,y:d};break;default:p={x:r.x,y:r.y}}let m=k(t);return m&&(p[o]+=f*(m===`end`?1:-1)*(n&&l?-1:1)),p}async function oe(e,t){t===void 0&&(t={});let{x:n,y:r,platform:i,rects:a,elements:o,strategy:s}=e,{boundary:c=`clippingAncestors`,rootBoundary:l=`viewport`,elementContext:u=`floating`,altBoundary:d=!1,padding:f=0}=D(t,e),p=ie(f),m=o[d?u===`floating`?`reference`:`floating`:u],h=V(await i.getClippingRect({element:await(i.isElement==null?void 0:i.isElement(m))??!0?m:m.contextElement||await(i.getDocumentElement==null?void 0:i.getDocumentElement(o.floating)),boundary:c,rootBoundary:l,strategy:s})),g=u===`floating`?{x:n,y:r,width:a.floating.width,height:a.floating.height}:a.reference,_=await(i.getOffsetParent==null?void 0:i.getOffsetParent(o.floating)),v=await(i.isElement==null?void 0:i.isElement(_))&&await(i.getScale==null?void 0:i.getScale(_))||{x:1,y:1},y=V(i.convertOffsetParentRelativeRectToViewportRelativeRect?await i.convertOffsetParentRelativeRectToViewportRelativeRect({elements:o,rect:g,offsetParent:_,strategy:s}):g);return{top:(h.top-y.top+p.top)/v.y,bottom:(y.bottom-h.bottom+p.bottom)/v.y,left:(h.left-y.left+p.left)/v.x,right:(y.right-h.right+p.right)/v.x}}var se=50,ce=async(e,t,n)=>{let{placement:r=`bottom`,strategy:i=`absolute`,middleware:a=[],platform:o}=n,s=o.detectOverflow?o:{...o,detectOverflow:oe},c=await(o.isRTL==null?void 0:o.isRTL(t)),l=await o.getElementRects({reference:e,floating:t,strategy:i}),{x:u,y:d}=ae(l,r,c),f=r,p=0,m={};for(let n=0;n<a.length;n++){let h=a[n];if(!h)continue;let{name:g,fn:_}=h,{x:v,y,data:b,reset:x}=await _({x:u,y:d,initialPlacement:r,placement:f,strategy:i,middlewareData:m,rects:l,platform:s,elements:{reference:e,floating:t}});u=v??u,d=y??d,m[g]={...m[g],...b},x&&p<se&&(p++,typeof x==`object`&&(x.placement&&(f=x.placement),x.rects&&(l=x.rects===!0?await o.getElementRects({reference:e,floating:t,strategy:i}):x.rects),{x:u,y:d}=ae(l,f,c)),n=-1)}return{x:u,y:d,placement:f,strategy:i,middlewareData:m}},le=e=>({name:`arrow`,options:e,async fn(t){let{x:n,y:r,placement:i,rects:a,platform:o,elements:s,middlewareData:c}=t,{element:l,padding:u=0}=D(e,t)||{};if(l==null)return{};let d=ie(u),f={x:n,y:r},p=N(i),m=j(p),h=await o.getDimensions(l),g=p===`y`,_=g?`top`:`left`,v=g?`bottom`:`right`,y=g?`clientHeight`:`clientWidth`,x=a.reference[m]+a.reference[p]-f[p]-a.floating[m],S=f[p]-a.reference[p],C=await(o.getOffsetParent==null?void 0:o.getOffsetParent(l)),w=C?C[y]:0;(!w||!await(o.isElement==null?void 0:o.isElement(C)))&&(w=s.floating[y]||a.floating[m]);let T=x/2-S/2,O=w/2-h[m]/2-1,A=b(d[_],O),M=b(d[v],O),P=w-h[m]-M,F=w/2-h[m]/2+T,I=E(A,F,P),L=!c.arrow&&k(i)!=null&&F!==I&&a.reference[m]/2-(F<A?A:M)-h[m]/2<0,R=L?F<A?F-A:F-P:0;return{[p]:f[p]+R,data:{[p]:I,centerOffset:F-I-R,...L&&{alignmentOffset:R}},reset:L}}}),ue=function(e){return e===void 0&&(e={}),{name:`flip`,options:e,async fn(t){var n;let{placement:r,middlewareData:i,rects:a,initialPlacement:o,platform:s,elements:c}=t,{mainAxis:l=!0,crossAxis:u=!0,fallbackPlacements:d,fallbackStrategy:f=`bestFit`,fallbackAxisSideDirection:p=`none`,flipAlignment:m=!0,...h}=D(e,t);if((n=i.arrow)!=null&&n.alignmentOffset)return{};let g=O(r),_=M(o),v=O(o)===o,y=await(s.isRTL==null?void 0:s.isRTL(c.floating)),b=d||(v||!m?[B(o)]:F(o)),x=p!==`none`;!d&&x&&b.push(...ne(o,m,p,y));let S=[o,...b],C=await s.detectOverflow(t,h),w=[],T=i.flip?.overflows||[];if(l&&w.push(C[g]),u){let e=P(r,a,y);w.push(C[e[0]],C[e[1]])}if(T=[...T,{placement:r,overflows:w}],!w.every(e=>e<=0)){let e=(i.flip?.index||0)+1,t=S[e];if(t&&(!(u===`alignment`&&_!==M(t))||T.every(e=>M(e.placement)!==_||e.overflows[0]>0)))return{data:{index:e,overflows:T},reset:{placement:t}};let n=T.filter(e=>e.overflows[0]<=0).sort((e,t)=>e.overflows[1]-t.overflows[1])[0]?.placement;if(!n)switch(f){case`bestFit`:{let e=T.filter(e=>{if(x){let t=M(e.placement);return t===_||t===`y`}return!0}).map(e=>[e.placement,e.overflows.filter(e=>e>0).reduce((e,t)=>e+t,0)]).sort((e,t)=>e[1]-t[1])[0]?.[0];e&&(n=e);break}case`initialPlacement`:n=o;break}if(r!==n)return{reset:{placement:n}}}return{}}}};function de(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function fe(e){return y.some(t=>e[t]>=0)}var pe=function(e){return e===void 0&&(e={}),{name:`hide`,options:e,async fn(t){let{rects:n,platform:r}=t,{strategy:i=`referenceHidden`,...a}=D(e,t);switch(i){case`referenceHidden`:{let e=de(await r.detectOverflow(t,{...a,elementContext:`reference`}),n.reference);return{data:{referenceHiddenOffsets:e,referenceHidden:fe(e)}}}case`escaped`:{let e=de(await r.detectOverflow(t,{...a,altBoundary:!0}),n.floating);return{data:{escapedOffsets:e,escaped:fe(e)}}}default:return{}}}}},me=new Set([`left`,`top`]);async function he(e,t){let{placement:n,platform:r,elements:i}=e,a=await(r.isRTL==null?void 0:r.isRTL(i.floating)),o=O(n),s=k(n),c=M(n)===`y`,l=me.has(o)?-1:1,u=a&&c?-1:1,d=D(t,e),{mainAxis:f,crossAxis:p,alignmentAxis:m}=typeof d==`number`?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:d.mainAxis||0,crossAxis:d.crossAxis||0,alignmentAxis:d.alignmentAxis};return s&&typeof m==`number`&&(p=s===`end`?m*-1:m),c?{x:p*u,y:f*l}:{x:f*l,y:p*u}}var ge=function(e){return e===void 0&&(e=0),{name:`offset`,options:e,async fn(t){var n;let{x:r,y:i,placement:a,middlewareData:o}=t,s=await he(t,e);return a===o.offset?.placement&&(n=o.arrow)!=null&&n.alignmentOffset?{}:{x:r+s.x,y:i+s.y,data:{...s,placement:a}}}}},_e=function(e){return e===void 0&&(e={}),{name:`shift`,options:e,async fn(t){let{x:n,y:r,placement:i,platform:a}=t,{mainAxis:o=!0,crossAxis:s=!1,limiter:c={fn:e=>{let{x:t,y:n}=e;return{x:t,y:n}}},...l}=D(e,t),u={x:n,y:r},d=await a.detectOverflow(t,l),f=M(i),p=A(f),m=u[p],h=u[f],g=(e,t)=>E(t+d[e===`y`?`top`:`left`],t,t-d[e===`y`?`bottom`:`right`]);o&&(m=g(p,m)),s&&(h=g(f,h));let _=c.fn({...t,[p]:m,[f]:h});return{..._,data:{x:_.x-n,y:_.y-r,enabled:{[p]:o,[f]:s}}}}}},ve=function(e){return e===void 0&&(e={}),{options:e,fn(t){let{x:n,y:r,placement:i,rects:a,middlewareData:o}=t,{offset:s=0,mainAxis:c=!0,crossAxis:l=!0}=D(e,t),u={x:n,y:r},d=M(i),f=A(d),p=u[f],m=u[d],h=D(s,t),g=typeof h==`number`?{mainAxis:h,crossAxis:0}:{mainAxis:h.mainAxis??0,crossAxis:h.crossAxis??0};if(c){let e=f===`y`?`height`:`width`,t=a.reference[f]-a.floating[e]+g.mainAxis,n=a.reference[f]+a.reference[e]-g.mainAxis;p<t?p=t:p>n&&(p=n)}if(l){let e=f===`y`?`width`:`height`,t=me.has(O(i)),n=a.reference[d]-a.floating[e]+(t&&o.offset?.[d]||0)+(t?0:g.crossAxis),r=a.reference[d]+a.reference[e]+(t?0:o.offset?.[d]||0)-(t?g.crossAxis:0);m<n?m=n:m>r&&(m=r)}return{[f]:p,[d]:m}}}},ye=function(e){return e===void 0&&(e={}),{name:`size`,options:e,async fn(t){let{placement:n,rects:r,platform:i,elements:a}=t,{apply:o=()=>{},...s}=D(e,t),c=await i.detectOverflow(t,s),l=O(n),u=k(n),d=M(n)===`y`,{width:f,height:p}=r.floating,m,h;l===`top`||l===`bottom`?(m=l,h=u===(await(i.isRTL==null?void 0:i.isRTL(a.floating))?`start`:`end`)?`left`:`right`):(h=l,m=u===`end`?`top`:`bottom`);let g=p-c.top-c.bottom,_=f-c.left-c.right,v=b(p-c[m],g),y=b(f-c[h],_),S=t.middlewareData.shift,C=!S,w=v,T=y;S!=null&&S.enabled.x&&(T=_),S!=null&&S.enabled.y&&(w=g),C&&!u&&(d?T=f-2*x(c.left,c.right):w=p-2*x(c.top,c.bottom)),await o({...t,availableWidth:T,availableHeight:w});let E=await i.getDimensions(a.floating);return f!==E.width||p!==E.height?{reset:{rects:!0}}:{}}}};function be(){return typeof window<`u`}function H(e){return xe(e)?(e.nodeName||``).toLowerCase():`#document`}function U(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function W(e){return((xe(e)?e.ownerDocument:e.document)||window.document)?.documentElement}function xe(e){return be()?e instanceof Node||e instanceof U(e).Node:!1}function G(e){return be()?e instanceof Element||e instanceof U(e).Element:!1}function K(e){return be()?e instanceof HTMLElement||e instanceof U(e).HTMLElement:!1}function Se(e){return!be()||typeof ShadowRoot>`u`?!1:e instanceof ShadowRoot||e instanceof U(e).ShadowRoot}function Ce(e){let{overflow:t,overflowX:n,overflowY:r,display:i}=J(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&i!==`inline`&&i!==`contents`}function we(e){return/^(table|td|th)$/.test(H(e))}function Te(e){try{if(e.matches(`:popover-open`))return!0}catch{}try{return e.matches(`:modal`)}catch{return!1}}var Ee=/transform|translate|scale|rotate|perspective|filter/,De=/paint|layout|strict|content/,q=e=>!!e&&e!==`none`,Oe;function ke(e){let t=G(e)?J(e):e;return q(t.transform)||q(t.translate)||q(t.scale)||q(t.rotate)||q(t.perspective)||!je()&&(q(t.backdropFilter)||q(t.filter))||Ee.test(t.willChange||``)||De.test(t.contain||``)}function Ae(e){let t=Y(e);for(;K(t)&&!Me(t);){if(ke(t))return t;if(Te(t))return null;t=Y(t)}return null}function je(){return Oe??=typeof CSS<`u`&&CSS.supports&&CSS.supports(`-webkit-backdrop-filter`,`none`),Oe}function Me(e){return/^(html|body|#document)$/.test(H(e))}function J(e){return U(e).getComputedStyle(e)}function Ne(e){return G(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function Y(e){if(H(e)===`html`)return e;let t=e.assignedSlot||e.parentNode||Se(e)&&e.host||W(e);return Se(t)?t.host:t}function Pe(e){let t=Y(e);return Me(t)?(e.ownerDocument||e).body:K(t)&&Ce(t)?t:Pe(t)}function Fe(e,t,n){t===void 0&&(t=[]),n===void 0&&(n=!0);let r=Pe(e),i=r===e.ownerDocument?.body,a=U(r);if(i){let e=Ie(a);return t.concat(a,a.visualViewport||[],Ce(r)?r:[],e&&n?Fe(e):[])}else return t.concat(r,Fe(r,[],n))}function Ie(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function Le(e){let t=J(e),n=parseFloat(t.width)||0,r=parseFloat(t.height)||0,i=K(e),a=i?e.offsetWidth:n,o=i?e.offsetHeight:r,s=S(n)!==a||S(r)!==o;return s&&(n=a,r=o),{width:n,height:r,$:s}}function Re(e){return G(e)?e:e.contextElement}function X(e){let t=Re(e);if(!K(t))return w(1);let n=t.getBoundingClientRect(),{width:r,height:i,$:a}=Le(t),o=(a?S(n.width):n.width)/r,s=(a?S(n.height):n.height)/i;return(!o||!Number.isFinite(o))&&(o=1),(!s||!Number.isFinite(s))&&(s=1),{x:o,y:s}}var ze=w(0);function Be(e){let t=U(e);return!je()||!t.visualViewport?ze:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function Ve(e,t,n){return t===void 0&&(t=!1),!!n&&t&&n===U(e)}function Z(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);let i=e.getBoundingClientRect(),a=Re(e),o=w(1);t&&(r?G(r)&&(o=X(r)):o=X(e));let s=Ve(a,n,r)?Be(a):w(0),c=(i.left+s.x)/o.x,l=(i.top+s.y)/o.y,u=i.width/o.x,d=i.height/o.y;if(a&&r){let e=U(a),t=G(r)?U(r):r,n=e,i=Ie(n);for(;i&&t!==n;){let e=X(i),t=i.getBoundingClientRect(),r=J(i),a=t.left+(i.clientLeft+parseFloat(r.paddingLeft))*e.x,o=t.top+(i.clientTop+parseFloat(r.paddingTop))*e.y;c*=e.x,l*=e.y,u*=e.x,d*=e.y,c+=a,l+=o,n=U(i),i=Ie(n)}}return V({width:u,height:d,x:c,y:l})}function He(e,t){let n=Ne(e).scrollLeft;return t?t.left+n:Z(W(e)).left+n}function Ue(e,t){let n=e.getBoundingClientRect();return{x:n.left+t.scrollLeft-He(e,n),y:n.top+t.scrollTop}}function We(e){let{elements:t,rect:n,offsetParent:r,strategy:i}=e,a=i===`fixed`,o=W(r),s=t?Te(t.floating):!1;if(r===o||s&&a)return n;let c={scrollLeft:0,scrollTop:0},l=w(1),u=w(0),d=K(r);if((d||!a)&&((H(r)!==`body`||Ce(o))&&(c=Ne(r)),d)){let e=Z(r);l=X(r),u.x=e.x+r.clientLeft,u.y=e.y+r.clientTop}let f=o&&!d&&!a?Ue(o,c):w(0);return{width:n.width*l.x,height:n.height*l.y,x:n.x*l.x-c.scrollLeft*l.x+u.x+f.x,y:n.y*l.y-c.scrollTop*l.y+u.y+f.y}}function Ge(e){return e.getClientRects?Array.from(e.getClientRects()):[]}function Ke(e){let t=Ne(e),n=e.ownerDocument.body,r=x(e.scrollWidth,e.clientWidth,n.scrollWidth,n.clientWidth),i=x(e.scrollHeight,e.clientHeight,n.scrollHeight,n.clientHeight),a=-t.scrollLeft+He(e),o=-t.scrollTop;return J(n).direction===`rtl`&&(a+=x(e.clientWidth,n.clientWidth)-r),{width:r,height:i,x:a,y:o}}var qe=25;function Je(e,t,n){n===void 0&&(n=`viewport`);let r=n===`layoutViewport`,i=U(e),a=W(e),o=i.visualViewport,s=a.clientWidth,c=a.clientHeight,l=0,u=0;if(o){let e=!je()||t===`fixed`;r?e||(l=-o.offsetLeft,u=-o.offsetTop):(s=o.width,c=o.height,e&&(l=o.offsetLeft,u=o.offsetTop))}if(He(a)<=0){let e=a.ownerDocument,t=e.body,n=getComputedStyle(t),r=e.compatMode===`CSS1Compat`&&parseFloat(n.marginLeft)+parseFloat(n.marginRight)||0,i=Math.abs(a.clientWidth-t.clientWidth-r),o=getComputedStyle(a).scrollbarGutter===`stable both-edges`?i/2:i;o<=qe&&(s-=o)}return{width:s,height:c,x:l,y:u}}function Ye(e,t){let n=Z(e,!0,t===`fixed`),r=n.top+e.clientTop,i=n.left+e.clientLeft,a=X(e);return{width:e.clientWidth*a.x,height:e.clientHeight*a.y,x:i*a.x,y:r*a.y}}function Xe(e,t,n){let r;if(t===`viewport`||t===`layoutViewport`)r=Je(e,n,t);else if(t===`document`)r=Ke(W(e));else if(G(t))r=Ye(t,n);else{let n=Be(e);r={x:t.x-n.x,y:t.y-n.y,width:t.width,height:t.height}}return V(r)}function Ze(e,t){let n=t.get(e);if(n)return n;let r=Fe(e,[],!1).filter(e=>G(e)&&H(e)!==`body`),i=null,a=J(e).position===`fixed`,o=a?Y(e):e;for(;G(o)&&!Me(o);){let e=J(o),t=ke(o),n=i?i.position:a?`fixed`:``;!t&&(n===`fixed`||n===`absolute`&&e.position===`static`)?r=r.filter(e=>e!==o):i=e,o=Y(o)}return t.set(e,r),r}function Qe(e){let{element:t,boundary:n,rootBoundary:r,strategy:i}=e,a=[...n===`clippingAncestors`?Te(t)?[]:Ze(t,this._c):[].concat(n),r],o=Xe(t,a[0],i),s=o.top,c=o.right,l=o.bottom,u=o.left;for(let e=1;e<a.length;e++){let n=Xe(t,a[e],i);s=x(n.top,s),c=b(n.right,c),l=b(n.bottom,l),u=x(n.left,u)}return{width:c-u,height:l-s,x:u,y:s}}function $e(e){let{width:t,height:n}=Le(e);return{width:t,height:n}}function et(e,t,n){let r=K(t),i=W(t),a=n===`fixed`,o=Z(e,!0,a,t),s={scrollLeft:0,scrollTop:0},c=w(0);if((r||!a)&&((H(t)!==`body`||Ce(i))&&(s=Ne(t)),r)){let e=Z(t,!0,a,t);c.x=e.x+t.clientLeft,c.y=e.y+t.clientTop}!r&&i&&(c.x=He(i));let l=i&&!r&&!a?Ue(i,s):w(0);return{x:o.left+s.scrollLeft-c.x-l.x,y:o.top+s.scrollTop-c.y-l.y,width:o.width,height:o.height}}function tt(e){return J(e).position===`static`}function nt(e,t){if(!K(e)||J(e).position===`fixed`)return null;if(t)return t(e);let n=e.offsetParent;return W(e)===n&&(n=n.ownerDocument.body),n}function rt(e,t){let n=U(e);if(Te(e))return n;if(!K(e)){let t=Y(e);for(;t&&!Me(t);){if(G(t)&&!tt(t))return t;t=Y(t)}return n}let r=nt(e,t);for(;r&&we(r)&&tt(r);)r=nt(r,t);return r&&Me(r)&&tt(r)&&!ke(r)?n:r||Ae(e)||n}var it=async function(e){let t=this.getOffsetParent||rt,n=this.getDimensions,r=await n(e.floating);return{reference:et(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:r.width,height:r.height}}};function at(e){return J(e).direction===`rtl`}var ot={convertOffsetParentRelativeRectToViewportRelativeRect:We,getDocumentElement:W,getClippingRect:Qe,getOffsetParent:rt,getElementRects:it,getClientRects:Ge,getDimensions:$e,getScale:X,isElement:G,isRTL:at};function st(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function ct(e,t,n){let r=null,i,a=W(e);function o(){var e;clearTimeout(i),(e=r)==null||e.disconnect(),r=null}function s(n,c){n===void 0&&(n=!1),c===void 0&&(c=1),o();let l=e.getBoundingClientRect(),{left:u,top:d,width:f,height:p}=l;if(n||t(),!f||!p)return;let m=C(d),h=C(a.clientWidth-(u+f)),g=C(a.clientHeight-(d+p)),_=C(u),v={rootMargin:-m+`px `+-h+`px `+-g+`px `+-_+`px`,threshold:x(0,b(1,c))||1},y=!0;function S(t){let n=t[0].intersectionRatio;if(!st(l,e.getBoundingClientRect()))return s();if(n!==c){if(!y)return s();n?s(!1,n):i=setTimeout(()=>{s(!1,1e-7)},1e3)}y=!1}try{r=new IntersectionObserver(S,{...v,root:a.ownerDocument})}catch{r=new IntersectionObserver(S,v)}r.observe(e)}let c=U(e),l=()=>s(n);return c.addEventListener(`resize`,l),s(!0),()=>{c.removeEventListener(`resize`,l),o()}}function lt(e,t,n,r){r===void 0&&(r={});let{ancestorScroll:i=!0,ancestorResize:a=!0,elementResize:o=typeof ResizeObserver==`function`,layoutShift:s=typeof IntersectionObserver==`function`,animationFrame:c=!1}=r,l=Re(e),u=i||a?[...l?Fe(l):[],...t?Fe(t):[]]:[];u.forEach(e=>{i&&e.addEventListener(`scroll`,n),a&&e.addEventListener(`resize`,n)});let d=l&&s?ct(l,n,a):null,f=-1,p=null;o&&(p=new ResizeObserver(e=>{let[r]=e;r&&r.target===l&&p&&t&&(p.unobserve(t),cancelAnimationFrame(f),f=requestAnimationFrame(()=>{var e;(e=p)==null||e.observe(t)})),n()}),l&&!c&&p.observe(l),t&&p.observe(t));let m,h=c?Z(e):null;c&&g();function g(){let t=Z(e);h&&!st(h,t)&&n(),h=t,m=requestAnimationFrame(g)}return n(),()=>{var e;u.forEach(e=>{i&&e.removeEventListener(`scroll`,n),a&&e.removeEventListener(`resize`,n)}),d?.(),(e=p)==null||e.disconnect(),p=null,c&&cancelAnimationFrame(m)}}var ut=ge,dt=_e,ft=ue,pt=ye,mt=pe,ht=le,gt=ve,_t=(e,t,n)=>{let r=new Map,i=n??{},a={...ot,...i.platform,_c:r};return ce(e,t,{...i,platform:a})},vt=e(n(),1),yt=typeof document<`u`?v.useLayoutEffect:function(){};function bt(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e==`function`&&e.toString()===t.toString())return!0;let n,r,i;if(e&&t&&typeof e==`object`){if(Array.isArray(e)){if(n=e.length,n!==t.length)return!1;for(r=n;r--!==0;)if(!bt(e[r],t[r]))return!1;return!0}if(i=Object.keys(e),n=i.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!{}.hasOwnProperty.call(t,i[r]))return!1;for(r=n;r--!==0;){let n=i[r];if(!(n===`_owner`&&e.$$typeof)&&!bt(e[n],t[n]))return!1}return!0}return e!==e&&t!==t}function xt(e){return typeof window>`u`?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function St(e,t){let n=xt(e);return Math.round(t*n)/n}function Ct(e){let t=v.useRef(e);return yt(()=>{t.current=e}),t}function wt(e){e===void 0&&(e={});let{placement:t=`bottom`,strategy:n=`absolute`,middleware:r=[],platform:i,elements:{reference:a,floating:o}={},transform:s=!0,whileElementsMounted:c,open:l}=e,[u,d]=v.useState({x:0,y:0,strategy:n,placement:t,middlewareData:{},isPositioned:!1}),[f,p]=v.useState(r);bt(f,r)||p(r);let[m,h]=v.useState(null),[g,_]=v.useState(null),y=v.useCallback(e=>{e!==C.current&&(C.current=e,h(e))},[]),b=v.useCallback(e=>{e!==w.current&&(w.current=e,_(e))},[]),x=a||m,S=o||g,C=v.useRef(null),w=v.useRef(null),T=v.useRef(u),E=c!=null,D=Ct(c),O=Ct(i),k=Ct(l),A=v.useCallback(()=>{if(!C.current||!w.current)return;let e={placement:t,strategy:n,middleware:f};O.current&&(e.platform=O.current),_t(C.current,w.current,e).then(e=>{let t={...e,isPositioned:k.current!==!1};j.current&&!bt(T.current,t)&&(T.current=t,vt.flushSync(()=>{d(t)}))})},[f,t,n,O,k]);yt(()=>{l===!1&&T.current.isPositioned&&(T.current.isPositioned=!1,d(e=>({...e,isPositioned:!1})))},[l]);let j=v.useRef(!1);yt(()=>(j.current=!0,()=>{j.current=!1}),[]),yt(()=>{if(x&&(C.current=x),S&&(w.current=S),x&&S){if(D.current)return D.current(x,S,A);A()}},[x,S,A,D,E]);let M=v.useMemo(()=>({reference:C,floating:w,setReference:y,setFloating:b}),[y,b]),N=v.useMemo(()=>({reference:x,floating:S}),[x,S]),P=v.useMemo(()=>{let e={position:n,left:0,top:0};if(!N.floating)return e;let t=St(N.floating,u.x),r=St(N.floating,u.y);return s?{...e,transform:`translate(`+t+`px, `+r+`px)`,...xt(N.floating)>=1.5&&{willChange:`transform`}}:{position:n,left:t,top:r}},[n,s,N.floating,u.x,u.y]);return v.useMemo(()=>({...u,update:A,refs:M,elements:N,floatingStyles:P}),[u,A,M,N,P])}var Tt=e=>{function t(e){return{}.hasOwnProperty.call(e,`current`)}return{name:`arrow`,options:e,fn(n){let{element:r,padding:i}=typeof e==`function`?e(n):e;return r&&t(r)?r.current==null?{}:ht({element:r.current,padding:i}).fn(n):r?ht({element:r,padding:i}).fn(n):{}}}},Et=(e,t)=>{let n=ut(e);return{name:n.name,fn:n.fn,options:[e,t]}},Dt=(e,t)=>{let n=dt(e);return{name:n.name,fn:n.fn,options:[e,t]}},Ot=(e,t)=>({fn:gt(e).fn,options:[e,t]}),kt=(e,t)=>{let n=ft(e);return{name:n.name,fn:n.fn,options:[e,t]}},At=(e,t)=>{let n=pt(e);return{name:n.name,fn:n.fn,options:[e,t]}},jt=(e,t)=>{let n=mt(e);return{name:n.name,fn:n.fn,options:[e,t]}},Mt=(e,t)=>{let n=Tt(e);return{name:n.name,fn:n.fn,options:[e,t]}},Q=r(),Nt=`Arrow`,Pt=v.forwardRef((e,t)=>{let{children:n,width:r=10,height:i=5,...a}=e;return(0,Q.jsx)(m.svg,{...a,ref:t,width:r,height:i,viewBox:`0 0 30 10`,preserveAspectRatio:`none`,children:e.asChild?n:(0,Q.jsx)(`polygon`,{points:`0,0 30,0 15,10`})})});Pt.displayName=Nt;var Ft=Pt;function It(e){let[t,n]=v.useState(void 0);return h(()=>{if(e){n({width:e.offsetWidth,height:e.offsetHeight});let t=new ResizeObserver(t=>{if(!Array.isArray(t)||!t.length)return;let r=t[0],i,a;if(`borderBoxSize`in r){let e=r.borderBoxSize,t=Array.isArray(e)?e[0]:e;i=t.inlineSize,a=t.blockSize}else i=e.offsetWidth,a=e.offsetHeight;n({width:i,height:a})});return t.observe(e,{box:`border-box`}),()=>t.unobserve(e)}else n(void 0)},[e]),t}var Lt=`Popper`,[Rt,zt]=p(Lt),[Bt,Vt]=Rt(Lt),Ht=e=>{let{__scopePopper:t,children:n}=e,[r,i]=v.useState(null),[a,o]=v.useState(void 0);return(0,Q.jsx)(Bt,{scope:t,anchor:r,onAnchorChange:i,placementState:a,setPlacementState:o,children:n})};Ht.displayName=Lt;var Ut=`PopperAnchor`,Wt=v.forwardRef((e,t)=>{let{__scopePopper:n,virtualRef:r,...i}=e,a=Vt(Ut,n),o=v.useRef(null),s=a.onAnchorChange,c=d(t,v.useCallback(e=>{o.current=e,e&&s(e)},[s])),l=v.useRef(null);v.useEffect(()=>{if(!r)return;let e=l.current;l.current=r.current,e!==l.current&&s(l.current)});let u=a.placementState&&en(a.placementState),f=u?.[0],p=u?.[1];return r?null:(0,Q.jsx)(m.div,{"data-radix-popper-side":f,"data-radix-popper-align":p,...i,ref:c})});Wt.displayName=Ut;var Gt=`PopperContent`,[Kt,qt]=Rt(Gt),Jt=v.forwardRef((e,t)=>{let{__scopePopper:n,side:r=`bottom`,sideOffset:i=0,align:a=`center`,alignOffset:o=0,arrowPadding:s=0,avoidCollisions:c=!0,collisionBoundary:l=[],collisionPadding:u=0,sticky:p=`partial`,hideWhenDetached:g=!1,updatePositionStrategy:_=`optimized`,onPlaced:y,...b}=e,x=Vt(Gt,n),[S,C]=v.useState(null),w=d(t,C),[T,E]=v.useState(null),D=It(T),O=D?.width??0,k=D?.height??0,A=r+(a===`center`?``:`-`+a),j=typeof u==`number`?u:{top:0,right:0,bottom:0,left:0,...u},M=Array.isArray(l)?l:[l],N=M.length>0,P={padding:j,boundary:M.filter(Qt),altBoundary:N},{refs:F,floatingStyles:I,placement:L,isPositioned:R,middlewareData:z}=wt({strategy:`fixed`,placement:A,whileElementsMounted:(...e)=>lt(...e,{animationFrame:_===`always`}),elements:{reference:x.anchor},middleware:[Et({mainAxis:i+k,alignmentAxis:o}),c&&Dt({mainAxis:!0,crossAxis:!1,limiter:p===`partial`?Ot():void 0,...P}),c&&kt({...P}),At({...P,apply:({elements:e,rects:t,availableWidth:n,availableHeight:r})=>{let{width:i,height:a}=t.reference,o=e.floating.style;o.setProperty(`--radix-popper-available-width`,`${n}px`),o.setProperty(`--radix-popper-available-height`,`${r}px`),o.setProperty(`--radix-popper-anchor-width`,`${i}px`),o.setProperty(`--radix-popper-anchor-height`,`${a}px`)}}),T&&Mt({element:T,padding:s}),$t({arrowWidth:O,arrowHeight:k}),g&&jt({strategy:`referenceHidden`,...P,boundary:N?P.boundary:void 0})]}),ee=x.setPlacementState;h(()=>(ee(L),()=>{ee(void 0)}),[L,ee]);let[te,ne]=en(L),B=f(y);h(()=>{R&&B?.()},[R,B]);let re=z.arrow?.x,ie=z.arrow?.y,V=z.arrow?.centerOffset!==0,[ae,oe]=v.useState();return h(()=>{S&&oe(window.getComputedStyle(S).zIndex)},[S]),(0,Q.jsx)(`div`,{ref:F.setFloating,"data-radix-popper-content-wrapper":``,style:{...I,transform:R?I.transform:`translate(0, -200%)`,minWidth:`max-content`,zIndex:ae,"--radix-popper-transform-origin":[z.transformOrigin?.x,z.transformOrigin?.y].join(` `),...z.hide?.referenceHidden&&{visibility:`hidden`,pointerEvents:`none`}},dir:e.dir,children:(0,Q.jsx)(Kt,{scope:n,placedSide:te,placedAlign:ne,onArrowChange:E,arrowX:re,arrowY:ie,shouldHideArrow:V,children:(0,Q.jsx)(m.div,{"data-side":te,"data-align":ne,...b,ref:w,style:{...b.style,animation:R?void 0:`none`}})})})});Jt.displayName=Gt;var Yt=`PopperArrow`,Xt={top:`bottom`,right:`left`,bottom:`top`,left:`right`},Zt=v.forwardRef(function(e,t){let{__scopePopper:n,...r}=e,i=qt(Yt,n),a=Xt[i.placedSide];return(0,Q.jsx)(`span`,{ref:i.onArrowChange,style:{position:`absolute`,left:i.arrowX,top:i.arrowY,[a]:0,transformOrigin:{top:``,right:`0 0`,bottom:`center 0`,left:`100% 0`}[i.placedSide],transform:{top:`translateY(100%)`,right:`translateY(50%) rotate(90deg) translateX(-50%)`,bottom:`rotate(180deg)`,left:`translateY(50%) rotate(-90deg) translateX(50%)`}[i.placedSide],visibility:i.shouldHideArrow?`hidden`:void 0},children:(0,Q.jsx)(Ft,{...r,ref:t,style:{...r.style,display:`block`}})})});Zt.displayName=Yt;function Qt(e){return e!==null}var $t=e=>({name:`transformOrigin`,options:e,fn(t){let{placement:n,rects:r,middlewareData:i}=t,a=i.arrow?.centerOffset!==0,o=a?0:e.arrowWidth,s=a?0:e.arrowHeight,[c,l]=en(n),u={start:`0%`,center:`50%`,end:`100%`}[l],d=(i.arrow?.x??0)+o/2,f=(i.arrow?.y??0)+s/2,p=``,m=``;return c===`bottom`?(p=a?u:`${d}px`,m=`${-s}px`):c===`top`?(p=a?u:`${d}px`,m=`${r.floating.height+s}px`):c===`right`?(p=`${-s}px`,m=a?u:`${f}px`):c===`left`&&(p=`${r.floating.width+s}px`,m=a?u:`${f}px`),{data:{x:p,y:m}}}});function en(e){let[t,n=`center`]=e.split(`-`);return[t,n]}var tn=Ht,nn=Wt,rn=Jt,an=Zt,on=`rounded-md bg-border/50 text-sm text-fg placeholder:text-fg-muted transition-colors hover:bg-border/80 focus:bg-border/80 disabled:cursor-not-allowed disabled:opacity-50`,sn=`relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm text-fg outline-none transition-colors`,cn=`data-[highlighted]:bg-action data-[highlighted]:text-action-ink data-[disabled]:pointer-events-none data-[disabled]:opacity-50`,ln=`data-[selected=true]:bg-action data-[selected=true]:text-action-ink data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50`;function un({className:e,type:t,...n}){return(0,Q.jsx)(`input`,{type:t,className:g(`flex h-8 w-full px-2.5`,on,e),...n})}function dn({className:e,...t}){return(0,Q.jsx)(`textarea`,{className:g(`flex min-h-16 w-full px-2.5 py-2`,on,e),...t})}var fn=`Label`,pn=v.forwardRef((e,t)=>(0,Q.jsx)(m.label,{...e,ref:t,onMouseDown:t=>{t.target.closest(`button, input, select, textarea`)||(e.onMouseDown?.(t),!t.defaultPrevented&&t.detail>1&&t.preventDefault())}}));pn.displayName=fn;var mn=pn;function hn({className:e,...t}){return(0,Q.jsx)(mn,{className:g(`text-xs font-medium text-fg-secondary peer-disabled:cursor-not-allowed peer-disabled:opacity-50`,e),...t})}function gn(){return s({queryKey:[`profiles`],queryFn:()=>u(`GET`,`/api/profiles`)})}function _n(e){return s({queryKey:[`profile-settings`,e],queryFn:()=>u(`GET`,`/api/profiles/${e}/settings`),enabled:e!==void 0})}function vn(e){return s({queryKey:[`accounts`,e],queryFn:()=>u(`GET`,`/api/accounts?profile=${e}`),enabled:e!==void 0})}function yn(e){return s({queryKey:[`account-usage`,e],queryFn:()=>u(`GET`,`/api/accounts/${e}/usage`),enabled:e!==void 0,staleTime:15e3})}function bn(){return s({queryKey:[`repos`],queryFn:()=>u(`GET`,`/api/repos`)})}function xn(e,t=!0){return s({queryKey:[`projects`,e??`all`],queryFn:()=>u(`GET`,e===void 0?`/api/projects`:`/api/projects?profile=${e}`),enabled:t})}function Sn(e){return s({queryKey:[`project`,e],queryFn:()=>u(`GET`,`/api/projects/${e}`),enabled:e!==void 0})}function Cn(e){return s({queryKey:[`sessions`,e],queryFn:()=>u(`GET`,`/api/sessions?project=${e}`),enabled:e!==void 0})}var wn={queryKey:[`sessions`,`all`],queryFn:()=>u(`GET`,`/api/sessions`)};function Tn(e=!0){return s({...wn,enabled:e})}function En(e){return e.fetchQuery(wn)}function Dn(){return s({queryKey:[`config`],queryFn:()=>u(`GET`,`/api/config`)})}function On(e){return s({queryKey:[`repo-branches`,e],queryFn:()=>u(`GET`,`/api/repos/${e}/branches`),enabled:e!==void 0,staleTime:3e4})}function kn(e){return s({queryKey:[`repo-worktrees`,e],queryFn:()=>u(`GET`,`/api/repos/${e}/worktrees`),enabled:e!==void 0,staleTime:1e4})}function An(e,t){let n=i();return o({mutationFn:t=>u(`DELETE`,`/api/repos/${e}/worktrees?path=${encodeURIComponent(t)}`),onSuccess:r=>{n.setQueryData([`repo-worktrees`,e],r),n.invalidateQueries({queryKey:[`project`,t]})}})}function jn(e,t){let n=i();return o({mutationFn:({name:t,confirm:n})=>{let r=new URLSearchParams({name:t});return n&&r.set(`confirm`,`1`),u(`DELETE`,`/api/repos/${e}/branches?${r.toString()}`)},onSuccess:r=>{n.setQueryData([`repo-worktrees`,e],r),n.invalidateQueries({queryKey:[`project`,t]})}})}function Mn(e){return s({queryKey:[`fs-dirs`,e],queryFn:()=>u(`GET`,`/api/fs/dirs?prefix=${encodeURIComponent(e)}`),enabled:e.startsWith(`/`)||e.startsWith(`~`),placeholderData:e=>e,staleTime:1e4})}function Nn(){return s({queryKey:[`version`],queryFn:()=>u(`GET`,`/api/version`),staleTime:1/0})}function Pn(){return s({queryKey:[`host`],queryFn:()=>u(`GET`,`/api/host`),staleTime:1/0})}function Fn(e){return e?e.displayName||e.hostname:void 0}function In(){return s({queryKey:[`agents`],queryFn:()=>u(`GET`,`/api/agents`),staleTime:3e4,refetchOnWindowFocus:!0})}function Ln(){let e=i();return o({mutationFn:e=>u(`POST`,`/api/profiles`,e),onSuccess:()=>void e.invalidateQueries({queryKey:[`profiles`]})})}function Rn(e){let t=i();return o({mutationFn:t=>u(`PATCH`,`/api/profiles/${e}/settings`,t),onSuccess:n=>t.setQueryData([`profile-settings`,e],n)})}function zn(){let e=i();return o({mutationFn:({id:e,...t})=>u(`PATCH`,`/api/profiles/${e}`,t),onSuccess:()=>void e.invalidateQueries({queryKey:[`profiles`]})})}function Bn(){let e=i();return o({mutationFn:({id:e,...t})=>u(`PATCH`,`/api/accounts/${e}`,t),onSuccess:t=>{e.invalidateQueries({queryKey:[`accounts`,t.profile_id]}),e.invalidateQueries({queryKey:[`account-usage`,t.id]})}})}function Vn(){let e=i();return o({mutationFn:e=>u(`DELETE`,`/api/profiles/${e}`),onSuccess:()=>e.clear()})}function Hn(){let e=i();return o({mutationFn:e=>u(`DELETE`,`/api/accounts/${e}`),onSuccess:()=>void e.invalidateQueries({queryKey:[`accounts`]})})}function Un(){let e=i();return o({mutationFn:e=>u(`POST`,`/api/accounts`,e),onSuccess:t=>void e.invalidateQueries({queryKey:[`accounts`,t.profile_id]})})}function Wn(){return o({mutationFn:e=>u(`POST`,`/api/accounts/${e}/login`)})}function Gn(){let e=i();return o({mutationFn:e=>u(`POST`,`/api/repos`,e),onSuccess:()=>void e.invalidateQueries({queryKey:[`repos`]})})}function Kn(){let e=i();return o({mutationFn:({id:e,...t})=>u(`PATCH`,`/api/repos/${e}`,t),onSuccess:()=>void e.invalidateQueries({queryKey:[`repos`]})})}function qn(){let e=i();return o({mutationFn:e=>u(`POST`,`/api/repos/${e}/fetch`),onSuccess:()=>void e.invalidateQueries({queryKey:[`repos`]})})}function Jn(){let e=i();return o({mutationFn:e=>u(`POST`,`/api/projects`,e),onSuccess:()=>void e.invalidateQueries({queryKey:[`projects`]})})}function Yn(){let e=i();return o({mutationFn:({id:e,...t})=>u(`PATCH`,`/api/projects/${e}`,t),onSuccess:()=>void e.invalidateQueries({queryKey:[`projects`]})})}function Xn(e,t){return s({queryKey:[`scratchpad`,e,t??`none`],queryFn:()=>u(`GET`,`/api/scratchpad?profile=${e}${t?`&project=${t}`:``}`),enabled:e!==void 0})}function Zn(){let e=i();return o({mutationFn:e=>u(`POST`,`/api/scratchpad`,e),onSuccess:()=>void e.invalidateQueries({queryKey:[`scratchpad`]})})}function Qn(){let e=i();return o({mutationFn:({id:e,...t})=>u(`PATCH`,`/api/scratchpad/${e}`,t),onSuccess:()=>void e.invalidateQueries({queryKey:[`scratchpad`]})})}function $n(){let e=i();return o({mutationFn:e=>u(`DELETE`,`/api/scratchpad/${e}`),onSuccess:()=>void e.invalidateQueries({queryKey:[`scratchpad`]})})}function er(e,t){return s({queryKey:[`layouts`,e,t??`none`],queryFn:()=>u(`GET`,`/api/layouts?profile=${e}${t?`&project=${t}`:``}`),enabled:e!==void 0})}function tr(){let e=i();return o({mutationFn:e=>u(`POST`,`/api/layouts`,e),onSuccess:()=>void e.invalidateQueries({queryKey:[`layouts`]})})}function nr(){let e=i();return o({mutationFn:({id:e,...t})=>u(`PATCH`,`/api/layouts/${e}`,t),onSuccess:()=>void e.invalidateQueries({queryKey:[`layouts`]})})}function rr(){let e=i();return o({mutationFn:e=>u(`DELETE`,`/api/layouts/${e}`),onSuccess:()=>void e.invalidateQueries({queryKey:[`layouts`]})})}function $(e,t){e.invalidateQueries({queryKey:[`sessions`]}),e.invalidateQueries({queryKey:[`project`,t.project_id]})}function ir(){let e=i();return o({mutationFn:e=>u(`POST`,`/api/sessions`,e),onSuccess:t=>$(e,t)})}function ar(e){let t=i();return o({mutationFn:t=>u(`POST`,`/api/sessions/${t}/${e}`),onSuccess:e=>$(t,e)})}function or(){let e=i();return o({mutationFn:({sessionId:e,accountId:t})=>u(`POST`,`/api/sessions/${e}/migrate`,{account_id:t}),onSuccess:t=>$(e,t)})}function sr(){let e=i();return o({mutationFn:({sessionId:e,accountId:t})=>u(`POST`,`/api/sessions/${e}/handoff`,{account_id:t}),onSuccess:(t,{sessionId:n})=>{$(e,t),e.invalidateQueries({queryKey:[`session`,n]})}})}function cr(){let e=i();return o({mutationFn:e=>u(`POST`,`/api/sessions/${e}/archive`),onSuccess:t=>$(e,t)})}function lr(){let e=i();return o({mutationFn:e=>u(`POST`,`/api/sessions/${e}/unarchive`),onSuccess:t=>$(e,t)})}function ur(){let e=i();return o({mutationFn:({sessionId:e,title:t})=>u(`PATCH`,`/api/sessions/${e}`,{title:t}),onSuccess:t=>$(e,t)})}function dr(){let e=i();return o({mutationFn:e=>u(`PATCH`,`/api/config`,e),onSuccess:(t,n)=>{e.setQueryData([`config`],t),`displayName`in n&&e.invalidateQueries({queryKey:[`host`]})}})}async function fr(e){try{return await u(`GET`,`/api/profiles/${e}/state`)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`no_state`)return null;throw e}}function pr(e,t){return u(`PUT`,`/api/profiles/${e}/state`,{ui_state:t})}function mr(e,t){return s({queryKey:[`ports`,e],queryFn:()=>u(`GET`,`/api/sessions/${e}/ports`),enabled:e!==void 0&&t,refetchInterval:a(5e3),refetchIntervalInBackground:!1})}function hr(e,t){return s({queryKey:[`session-env`,e],queryFn:()=>u(`GET`,`/api/sessions/${e}/env`),enabled:e!==void 0&&t,refetchInterval:a(5e3),refetchIntervalInBackground:!1})}function gr(){let e=i();return o({mutationFn:e=>u(`DELETE`,`/api/sessions/${e}/env`),onSuccess:(t,n)=>{e.setQueryData([`session-env`,n],{vars:[]})}})}var _r=_(`folder-git-2`,[[`path`,{d:`M18 19a5 5 0 0 1-5-5v8`,key:`sz5oeg`}],[`path`,{d:`M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v5`,key:`1w6njk`}],[`circle`,{cx:`13`,cy:`12`,r:`2`,key:`1j92g6`}],[`circle`,{cx:`20`,cy:`19`,r:`2`,key:`1obnsp`}]]),vr=_(`pencil`,[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}],[`path`,{d:`m15 5 4 4`,key:`1mk7zo`}]]);function yr({id:e,value:t,onValueChange:n,onChoose:r,hints:i,placeholder:a,className:o,hintsClassName:s,autoFocus:c}){let[l,u]=(0,v.useState)(!1),[d,f]=(0,v.useState)(0),p=e=>{n(e.value),r?.(e),u(!1)};return(0,Q.jsxs)(`div`,{className:`relative`,children:[(0,Q.jsx)(un,{id:e,value:t,onChange:e=>{n(e.target.value),u(!0),f(0)},onFocus:()=>u(!0),onBlur:()=>u(!1),onKeyDown:e=>{if(!(!l||i.length===0))if(e.key===`ArrowDown`)e.preventDefault(),f(e=>(e+1)%i.length);else if(e.key===`ArrowUp`)e.preventDefault(),f(e=>(e-1+i.length)%i.length);else if(e.key===`Enter`||e.key===`Tab`){let t=i[d]??i[0];t&&(e.preventDefault(),p(t))}else e.key===`Escape`&&(e.stopPropagation(),u(!1))},placeholder:a,className:o,autoComplete:`off`,spellCheck:!1,autoFocus:c}),l&&i.length>0&&(0,Q.jsx)(`ul`,{className:g(`absolute top-full z-10 mt-1 max-h-56 overflow-y-auto rounded-md bg-elevated p-1 shadow-xl`,s??`w-full`),children:i.map((e,t)=>(0,Q.jsx)(`li`,{children:(0,Q.jsxs)(`button`,{type:`button`,onMouseDown:t=>{t.preventDefault(),p(e)},onMouseEnter:()=>f(t),className:g(`relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm text-fg outline-none transition-colors`,`data-[selected=true]:bg-action data-[selected=true]:text-action-ink data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50`,`w-full font-mono text-xs`),"data-selected":t===d,children:[(0,Q.jsx)(`span`,{className:`truncate`,children:e.label??e.value}),e.badge&&(0,Q.jsx)(`span`,{className:`ml-auto shrink-0 text-2xs opacity-70`,children:e.badge})]})},e.value))})]})}function br(e){l.error(xr(e),{id:`err:${xr(e)}`})}function xr(e){return e instanceof Error&&e.message.trim()!==``?e.message:typeof e==`string`&&e.trim()!==``?e:`Something went wrong`}var Sr=(0,v.lazy)(()=>c(()=>import(`./Terminal-caEYfoyF.js`).then(e=>({default:e.Terminal})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13]))),Cr=null;async function wr(){Cr=(await c(()=>import(`./Terminal-caEYfoyF.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13]))).Terminal}function Tr(e){return Cr?(0,Q.jsx)(Cr,{...e}):(0,Q.jsx)(v.Suspense,{fallback:(0,Q.jsx)(`div`,{className:`size-full bg-ground`}),children:(0,Q.jsx)(Sr,{...e})})}export{kn as $,$n as A,nr as B,Zn as C,jn as D,Hn as E,er as F,Qn as G,Rn as H,Wn as I,Sn as J,_n as K,or as L,qn as M,sr as N,rr as O,Pn as P,On as Q,Bn as R,Gn as S,Nn as T,Yn as U,zn as V,Kn as W,An as X,xn as Y,ur as Z,Dn as _,tn as _t,vr as a,Cn as at,Ln as b,fr as c,un as ct,yn as d,ln as dt,bn as et,vn as f,cn as ft,gr as g,rn as gt,cr as h,an as ht,yr as i,mr as it,Mn as j,Vn as k,Fn as l,dn as lt,Tn as m,nn as mt,wr as n,ar as nt,_r as o,lr as ot,In as p,sn as pt,gn as q,br as r,hr as rt,En as s,hn as st,Tr as t,Xn as tt,pr as u,on as ut,Un as v,zt as vt,ir as w,Jn as x,tr as y,It as yt,dr as z};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{a as n,s as r,t as i}from"./buffer-store-CiF8VU5A.js";var a=e(t(),1);function o({buffers:e}){let t=(0,a.useRef)(new Set);return(0,a.useEffect)(()=>{let a=new Set(e.map(e=>i(e.session,e.path,e.root))),o=t.current;for(let e of a)o.has(e)||(r(e),o.add(e));for(let e of[...o])a.has(e)||(n(e),o.delete(e))},[e]),(0,a.useEffect)(()=>()=>{for(let e of t.current)n(e);t.current.clear()},[]),null}export{o as ModelRefcount};
1
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{t}from"./react-CZI7_Jkm.js";import{a as n,s as r,t as i}from"./buffer-store-CcaCClCj.js";var a=e(t(),1);function o({buffers:e}){let t=(0,a.useRef)(new Set);return(0,a.useEffect)(()=>{let a=new Set(e.map(e=>i(e.session,e.path,e.root))),o=t.current;for(let e of a)o.has(e)||(r(e),o.add(e));for(let e of[...o])a.has(e)||(n(e),o.delete(e))},[e]),(0,a.useEffect)(()=>()=>{for(let e of t.current)n(e);t.current.clear()},[]),null}export{o as ModelRefcount};