@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.
- package/CHANGELOG.md +34 -7
- package/README.md +2 -0
- package/dist/index.js +134 -34
- package/dist/public/assets/Dashboard-eGkW6-ZH.js +1 -0
- package/dist/public/assets/EditorTabClose-ftyAn3hj.js +1 -0
- package/dist/public/assets/LazyTerminal-C0RZlCLg.js +2 -0
- package/dist/public/assets/{ModelRefcount-sJruf69B.js → ModelRefcount-D-jr9qZk.js} +1 -1
- package/dist/public/assets/{PaneEditorBody-CbwKaj3E.js → PaneEditorBody-DcKD_h3y.js} +37 -37
- package/dist/public/assets/SettingsDialog-DnKM8XfN.js +1 -0
- package/dist/public/assets/{Terminal-CN5FGN0_.js → Terminal-caEYfoyF.js} +2 -2
- package/dist/public/assets/Workspace-CLlQSOdM.js +7 -0
- package/dist/public/assets/api-B3lAdmrV.js +73 -0
- package/dist/public/assets/{buffer-store-CiF8VU5A.js → buffer-store-CcaCClCj.js} +3 -3
- package/dist/public/assets/{context-menu-Bitp8sY-.js → context-menu-B72__pRf.js} +1 -1
- package/dist/public/assets/{cssMode-cJJRRtLZ.js → cssMode-C2T_OhZu.js} +1 -1
- package/dist/public/assets/editor-sync-BFRyMqUU.js +1 -0
- package/dist/public/assets/hotkeys-aKIAG8uQ.js +1 -0
- package/dist/public/assets/{htmlMode-Caw-2LOw.js → htmlMode-D7FIn_wE.js} +1 -1
- package/dist/public/assets/index-BKVDB6Tt.css +2 -0
- package/dist/public/assets/index-XKVW8P77.js +10 -0
- package/dist/public/assets/{jsonMode-CijUS1dz.js → jsonMode-Cm_XrMpQ.js} +1 -1
- package/dist/public/assets/preview-kind-CT1bv1az.js +1 -0
- package/dist/public/assets/{session-seed-B2YmPsU-.js → session-seed-DAf7EH_e.js} +1 -1
- package/dist/public/assets/ssh-mode-B0WDpTq0.js +1 -0
- package/dist/public/assets/{tsMode-_wbIu1Es.js → tsMode-CLCblX8J.js} +1 -1
- package/dist/public/index.html +5 -5
- package/package.json +1 -1
- package/dist/public/assets/Dashboard-Sq34AFXs.js +0 -1
- package/dist/public/assets/EditorTabClose-C5BL8wr0.js +0 -1
- package/dist/public/assets/LazyTerminal-CeLHCKsO.js +0 -2
- package/dist/public/assets/SettingsDialog-BuTx8DF2.js +0 -1
- package/dist/public/assets/Workspace-NHcfAFZP.js +0 -7
- package/dist/public/assets/api-CZDct42i.js +0 -73
- package/dist/public/assets/debounce-B9DrqirV.js +0 -1
- package/dist/public/assets/editor-sync-f1V6Wuxn.js +0 -1
- package/dist/public/assets/editor-tabs-3ilPGolh.js +0 -1
- package/dist/public/assets/index-CRUVuFoo.css +0 -2
- package/dist/public/assets/index-iPj6x3rM.js +0 -10
- package/dist/public/assets/profile-store-D2pB4wB-.js +0 -1
- 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.
|
|
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
|
-
-
|
|
15
|
-
-
|
|
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
|
-
###
|
|
40
|
+
### Removed
|
|
18
41
|
|
|
19
|
-
-
|
|
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
|
-
###
|
|
44
|
+
### Fixed
|
|
22
45
|
|
|
23
|
-
-
|
|
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
|
|
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.
|
|
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
|
-
`
|
|
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
|
-
`
|
|
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
|
-
|
|
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:
|
|
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 —
|
|
19126
|
-
*
|
|
19127
|
-
*
|
|
19128
|
-
*
|
|
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
|
|
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 =
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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 =
|
|
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
|
-
|
|
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.
|
|
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 ${
|
|
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
|
|
21813
|
+
targetPath,
|
|
21714
21814
|
detach: false,
|
|
21715
21815
|
relaunch: false,
|
|
21716
21816
|
logger
|
|
21717
21817
|
});
|
|
21718
|
-
logger.info(`Puddle ${update.version} installed at ${
|
|
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-
|
|
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};
|