dsh-home-hosted 0.2.2 → 0.3.2

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/README.md CHANGED
@@ -1,8 +1,13 @@
1
- # dsh-home-hosted
1
+ <div align="center">
2
2
 
3
- **Manage [home-hosted](https://github.com/NamesMT/home-hosted) — its boot entry, its panel and its servers — from inside DeepSeek Harness.**
3
+ # 📌 dsh-home-hosted
4
4
 
5
- **Your `dsh` web server, up after every reboot.** home-hosted starts it at boot and keeps it alive: restarting the panel no longer cuts a prompt mid-flight.
5
+ **Your whole home stack, up after every reboot — your `dsh` web server included.**
6
+
7
+ A [DeepSeek Harness](https://github.com/deepseek-ai/dsh) plugin for
8
+ [home-hosted](https://github.com/NamesMT/home-hosted), the panel that supervises your services.
9
+ Declare the servers once; this page manages the panel, the boot entry and the entries.
10
+ <sub>Nothing is installed or started until you say so.</sub>
6
11
 
7
12
  [![npm](https://img.shields.io/npm/v/dsh-home-hosted?label=npm&color=blue)](https://www.npmjs.com/package/dsh-home-hosted)
8
13
  [![CI](https://github.com/NamesMT/dsh-home-hosted/actions/workflows/ci.yml/badge.svg)](https://github.com/NamesMT/dsh-home-hosted/actions/workflows/ci.yml)
@@ -10,27 +15,72 @@
10
15
  [![node](https://img.shields.io/badge/node-%3E%3D24-339933?logo=node.js&logoColor=white)](https://nodejs.org)
11
16
  [![dsh](https://img.shields.io/badge/dsh-%3E%3D0.1.7--rc.2-5b21b6)](https://github.com/deepseek-ai/dsh)
12
17
 
18
+ [🚀 Quick start](#-quick-start) · [🎛️ What the plugin does](#-what-the-plugin-does) · [🤖 Agent tools](#-agent-tools) · [🧩 Depth](#-depth)
19
+
20
+ </div>
21
+
22
+ <div align="center">
23
+
13
24
  ![The plugin's page: Detailed and Compact styles, under Settings → Home Hosted](https://raw.githubusercontent.com/NamesMT/dsh-home-hosted/main/assets/settings.gif)
14
25
 
15
- ## Install
26
+ <sub>The Detailed style, then the same sections in Compact — both switchable from the page header.</sub>
27
+
28
+ </div>
29
+
30
+ ---
31
+
32
+ ## 🚀 Quick start
16
33
 
17
34
  ```sh
18
35
  dsh plugin --profile web add dsh-home-hosted
19
36
  ```
20
37
 
21
- Then open **Settings → Home Hosted** and turn on **Manage dsh** — with the panel's autostart enabled, that is what brings `dsh` back after a reboot. Nothing is installed or started until you say so; the page defaults to a **Detailed** style, with a Compact one beside the title.
38
+ Open **Settings → Home Hosted**, turn on **Manage dsh**, and enable autostart.
39
+ <sub>Reboot once; `dsh` comes back without you touching anything.</sub>
40
+
41
+ ## 🤔 Why
42
+
43
+ A panel restart shouldn't kill a prompt mid-flight, and a reboot shouldn't cost you an SSH session.
44
+
45
+ ```text
46
+ reboot
47
+ │
48
+ ▼
49
+ OS boot entry ──▶ home-hosted panel ──▶ ┌─────────────┐
50
+ systemd · │ │ dsh web ✓ │
51
+ launchd · │ └─────────────┘
52
+ XDG · Run key │
53
+ ├────────▶ ┌─────────────┐
54
+ │ │ docker │
55
+ │ │ compose │
56
+ │ └─────────────┘
57
+ │
58
+ └────────▶ ┌─────────────┐
59
+ │ postgres │
60
+ │ :5432 │
61
+ └─────────────┘
62
+ ```
63
+
64
+ **`dsh` is one entry in the panel, not the whole product.** The panel is the supervisor: it starts
65
+ each entry, watches it, restarts what dies and reclaims its port. Add your compose stack, your
66
+ database, your bot — manage them from the page, or hand the entry ids to an agent.
67
+
68
+ A plugin cannot run at boot, so this one writes the OS entry while dsh runs and the OS takes over.
69
+ One managed entry (`dsh`) is kept alive under home-hosted's nanny, so a panel restart leaves it
70
+ running.
71
+
72
+ ## 🎛️ What the plugin does
22
73
 
23
74
  | | |
24
75
  |---|---|
25
- | 🖥️ **`dsh`, up at boot** | home-hosted starts your `dsh` entry after every reboot, so the web UI is there without you touching anything. |
26
- | 🚀 **Boot autostart** | Installs, verifies and removes the OS entry that starts the panel — systemd, launchd, XDG or the Windows Run key. Opt in per machine. |
27
- | 🛡️ **Survives a panel restart** | The managed entry runs under home-hosted's nanny, so a panel restart leaves it running. |
76
+ | 🚀 **Boot autostart** | Installs, verifies and removes the OS entry. Opt in per machine. |
77
+ | 🛡️ **Survives a panel restart** | The managed entry runs under home-hosted's nanny, so restarting the panel leaves it running. |
28
78
  | 📦 **Ships its own panel** | The pinned `home-hosted` is a dependency, so boot runs the version this plugin is tested against. |
29
79
  | 🖥️ **Server control** | Add, edit, start, stop and restart entries — written through the panel's API, so nothing restarts behind your back. |
30
- | 🧭 **A sign-in page that helps** | dsh's 401 points at the panel log holding the tokenised URL, instead of leaving you to find it. |
31
- | 🤖 **Agent tools** | On by default: the agent can inspect state, manage servers, install autostart and switch the panel's UI. |
80
+ | 🧭 **Token warnings that mean something** | A missing or refused API token is called out on the page, with one click to mint a working one. |
81
+ | 🤖 **Agent tools** | On by default, session permissions still gate every write. |
32
82
 
33
- ## Agent tools
83
+ ## 🤖 Agent tools
34
84
 
35
85
  | Tool | Does |
36
86
  |---|---|
@@ -42,6 +92,9 @@ Then open **Settings → Home Hosted** and turn on **Manage dsh** — with the p
42
92
  | `home_hosted_ui_manage` | `status` · `update` · `revert` · `switch` the panel's own UI |
43
93
 
44
94
  A tool that changes something asks for approval **only** when the session is not already Full access.
95
+ <sub>A refused token is re-enrolled on the spot and the tool retries — see **automatic regeneration** below.</sub>
96
+
97
+ ## 🧩 Depth
45
98
 
46
99
  <details>
47
100
  <summary><b>Boot autostart, per platform</b></summary>
@@ -52,26 +105,56 @@ A tool that changes something asks for approval **only** when the session is not
52
105
  | macOS | `launchd-agent`, `launchd-daemon` | login, or boot with the daemon (one-time `sudo`) |
53
106
  | Windows | Run key, Task Scheduler | login |
54
107
 
55
- A plugin cannot act at boot: it installs and re-syncs the entry while dsh runs, and the OS takes over from there. When the process cannot elevate, the page prints the exact commands to run instead — including the `launchd-daemon` that starts a Mac **before** login.
108
+ When the process cannot elevate, the page prints the exact commands instead — including the
109
+ `launchd-daemon` that starts a Mac **before** login.
56
110
 
57
111
  </details>
58
112
 
59
113
  <details>
60
114
  <summary><b>Which home-hosted runs</b></summary>
61
115
 
62
- The pinned dependency by default. The page can switch to a global install, or install the pinned range globally for you. Boot entries run a small stable launcher the plugin writes, so a `node_modules` path that moves never breaks boot.
116
+ The pinned dependency by default; the page can switch to a global install, or install the pinned
117
+ range globally for you. Boot entries run a small stable launcher the plugin writes, so a
118
+ `node_modules` path that moves never breaks boot.
119
+
120
+ </details>
121
+
122
+ <details>
123
+ <summary><b>dsh from a local clone</b></summary>
124
+
125
+ A `dsh` you cloned and built yourself is supported: the managed entry starts a stable launcher that
126
+ re-finds your build at boot, so a rebuild, a moved checkout or a fresh profile does not strand it.
127
+ <sub>Falls back to whatever `dsh` is on PATH, and fails with the reason when it finds neither.</sub>
63
128
 
64
129
  </details>
65
130
 
66
131
  <details>
67
132
  <summary><b>Managed entry and port policy</b></summary>
68
133
 
69
- One entry (`dsh`) is managed from the page with a single toggle: the panel keeps it alive, restarts it and reclaims its port. A detached restart is recognised on macOS and Linux (`follow`); Windows cannot prove identity through a `.cmd` shim, so it uses `onPortConflict: kill` — which needs home-hosted 0.6.0 or newer, and the plugin refuses that write against an older panel rather than producing a config it cannot parse.
134
+ One entry (`dsh`), one toggle: the panel keeps it alive, restarts it and reclaims its port. A
135
+ detached restart is recognised on macOS and Linux (`follow`); Windows cannot prove identity through
136
+ a `.cmd` shim, so it uses `onPortConflict: kill` — needing home-hosted 0.6.0+, and the plugin
137
+ refuses that write against an older panel rather than producing a config it cannot parse.
70
138
 
71
139
  </details>
72
140
 
73
141
  <details>
74
- <summary><b>Configuration</b></summary>
142
+ <summary><b>API tokens and automatic regeneration</b></summary>
143
+
144
+ The plugin needs its own home-hosted API token to read and write the panel. home-hosted keeps only
145
+ the token's hash, so a token it did not mint can never be recovered — `<stateDir>/panel-token` is
146
+ `0600`, never rendered or logged, and **Regenerate token** enrols a new one that replaces it.
147
+
148
+ A missing or refused token is called out on the page with that button, including when the panel is
149
+ not answering at all — a token problem is often *why* it cannot be reached.
150
+ **Regenerate token automatically** (Agent tools section, on by default) does the same thing when a
151
+ panel call is refused: the tool re-enrols and retries once instead of failing. Turn it off to be
152
+ asked instead of having a working token silently replaced.
153
+
154
+ </details>
155
+
156
+ <details>
157
+ <summary><b>Operator config</b></summary>
75
158
 
76
159
  The Cordis row config is for operator overrides only:
77
160
 
@@ -84,7 +167,7 @@ The Cordis row config is for operator overrides only:
84
167
  defaultEntryId: dsh
85
168
  ```
86
169
 
87
- Everything a person toggles lives in `<stateDir>/settings.json`. The panel API token it mints is kept `0600` there, and is never rendered or logged.
170
+ Everything a person toggles lives in `<stateDir>/settings.json`.
88
171
 
89
172
  </details>
90
173
 
@@ -96,8 +179,14 @@ pnpm install
96
179
  pnpm typecheck && pnpm test && pnpm build
97
180
  ```
98
181
 
99
- Node 24+, pnpm, 360 tests. Same four commands CI runs.
182
+ Node 24+, pnpm. The same commands CI runs.
100
183
 
101
184
  </details>
102
185
 
186
+ ---
187
+
188
+ <div align="center">
189
+
103
190
  MIT · [npm](https://www.npmjs.com/package/dsh-home-hosted) · [releases](https://github.com/NamesMT/dsh-home-hosted/releases) · [issues](https://github.com/NamesMT/dsh-home-hosted/issues) · built on [home-hosted](https://github.com/NamesMT/home-hosted)
191
+
192
+ </div>
package/docs/DESIGN.md CHANGED
@@ -19,6 +19,12 @@ choice, and the page shows both candidates with their versions and can install
19
19
  the pinned range globally. An operator's `homeHostedCommand` in the plugin row
20
20
  always wins — that is an instruction, not a preference.
21
21
 
22
+ The range is stated twice and both must agree: `dependencies['home-hosted']` in
23
+ `package.json` (what gets installed) and `EXPECTED_RANGE` in
24
+ `src/home-hosted/resolve.ts` (what the page offers to install globally and warns
25
+ about when a global copy is older). Bumping one alone makes the page recommend a
26
+ range the plugin is not actually built against.
27
+
22
28
  That copy resolves to a pnpm path carrying a version and a peer hash
23
29
  (`…/.pnpm/home-hosted@0.6.1_zod@4.6.5/node_modules/home-hosted/…`), which moves
24
30
  on the next install and disappears when the profile is rebuilt. A boot entry
@@ -164,6 +170,54 @@ one, passes it to `home-hosted set-token` through `HHOSTED_TOKEN` (the CLI print
164
170
  nothing), and keeps it 0600 in its own state directory. It is never rendered,
165
171
  logged, or embedded in a unit file.
166
172
 
173
+ Three facts about that CLI are load-bearing, and were read out of its source
174
+ rather than guessed from `--help`: `set-token` replaces whatever hash is there
175
+ (so `--clear` is not needed to overwrite, and is not used — see below),
176
+ `HHOSTED_TOKEN` is the non-interactive input, and every command peels
177
+ `--home <dir>` off before any state module is imported and turns it into
178
+ `HHOSTED_HOME` — which is what makes the secrets file, `run.json` and the servers
179
+ config live under the directory this plugin passes, so the plugin and the CLI
180
+ always agree on where state is.
181
+
182
+ The token state the page shows is measured, not assumed. When the panel answers,
183
+ the plugin proves its token with a non-mutating `listServers()`: a refusal is
184
+ `stale` and the write path drops to the config file, while a panel that never
185
+ answered leaves the state `unknown` — a timeout is not a refusal, and
186
+ `tokenVerified` records whether a proof actually happened.
187
+
188
+ A refused token, or a hash this plugin never had, is replaced by
189
+ `panel.reclaimToken`: one `set-token` write with a freshly minted token in
190
+ `HHOSTED_TOKEN`, proved against the panel before the refreshed status is
191
+ returned. It is one write and not a `--clear`-then-set pair, because `set-token`
192
+ replaces whatever hash is there (probed against the real CLI) and clearing first
193
+ would leave a window in which the panel has no token at all. Every token
194
+ operation on one state directory is serialised; two concurrent mints used to
195
+ leave the stored plaintext and the panel's hash disagreeing, and nothing could
196
+ ever recover. A failed write replaced nothing, so the previously stored token is
197
+ kept — it may still be the panel's.
198
+
199
+ Only a panel that was never started is refused: a missing or refused token is
200
+ itself a common reason the panel cannot be reached, so requiring it to answer
201
+ would make the repair impossible in exactly the case it exists for. A panel that
202
+ is up but silent gets the token enrolled without a proof, and the page says so
203
+ rather than claiming a verification it did not take.
204
+
205
+ ## A managed entry that was deleted
206
+
207
+ `manageDsh` with an `autostart` intent is the whole instruction: it says this
208
+ plugin manages the harness entry. If someone deletes that entry — from the panel,
209
+ a tool call, or a hand edit — the page would otherwise show a managed entry that
210
+ is missing with no way to act on it. So the status read puts it back, and startup
211
+ `reconcile()` does the same for a deletion that happened while the plugin was
212
+ not running. A paused intent (`autostart: false`) is a deliberate stop and is
213
+ left alone, and `entries.apply` records `manageDsh` from the intent rather than
214
+ forcing it on, so applying a paused intent cannot leave the toggle stuck.
215
+
216
+ Recovery runs from a read, which the page polls, so it is throttled
217
+ (`ENTRY_RECOVERY_INTERVAL_MS`) and claims its attempt before its first await:
218
+ a panel that refuses the create must not be hit once per poll, and two status
219
+ calls racing each other must not both create the same entry.
220
+
167
221
  ## Privilege
168
222
 
169
223
  Boot scope needs privilege somewhere on every platform: a system unit, or
package/lib/client.js CHANGED
@@ -1,10 +1,10 @@
1
1
  window.__ModuleLoader__.load({ id: "dsh-home-hosted", factory: (require) => {
2
2
  var module = { exports: {} }; var exports = module.exports;
3
- "use strict";var se=Object.defineProperty;var bt=Object.getOwnPropertyDescriptor;var vt=Object.getOwnPropertyNames;var yt=Object.prototype.hasOwnProperty;var xt=(e,t)=>{for(var n in t)se(e,n,{get:t[n],enumerable:!0})},wt=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of vt(t))!yt.call(e,o)&&o!==n&&se(e,o,{get:()=>t[o],enumerable:!(a=bt(t,o))||a.enumerable});return e};var St=e=>wt(se({},"__esModule",{value:!0}),e);var Gt={};xt(Gt,{apply:()=>zt,inject:()=>jt});module.exports=St(Gt);var ee="homeHosted",le={tab:"Home Hosted",loading:"Loading\u2026",refresh:"Refresh",retry:"Retry",errorTitle:"Error",statusUnavailable:"The panel did not answer.",yes:"Yes",no:"No",copy:"Copy",copied:"Copied",details:"Details",uiStyleLabel:"Page style",uiStyleDetailed:"Detailed",uiStyleCompact:"Compact",sigPanel:"Panel",sigAutostart:"Autostart",sigEntry:"{id} entry",stateAnswering:"answering",stateNotAnswering:"not answering",stateManaged:"managed",stateNotManaged:"not managed",panelTitle:"Panel",panelCopy:"Which copy runs the panel",panelCopyHint:"The pinned copy ships with this plugin; the global one is on PATH.",optionsPreferPinned:"Pinned dependency",optionsPreferGlobal:"Global install",optionsRecommended:"recommended",optionsConfigOverride:"The plugin row sets homeHostedCommand, and that always wins.",optionsInstallLabel:"Install a global copy",optionsInstallHint:"No global install was found. Install the pinned range, then choose it above:",optionsInstall:"Install globally",panelHome:"$HHOSTED_HOME",panelUrl:"URL",panelVersion:"Version",panelPid:"PID",panelWriteVia:"Writes via",panelToken:"API token",panelCliSource:"CLI",panelCliPath:"CLI path",panelCliConfig:"configured command",panelCliDependency:"pinned dependency",panelCliPathSource:"global install (PATH)",panelCliMissing:"not found",panelCliNotPinned:"This host resolved a global home-hosted instead of the pinned copy ({range}).",panelCliUnsupported:"This home-hosted is older than the oldest release the plugin supports.",panelCliLauncherFailed:"The boot launcher did not answer, so a boot entry may fail to start the panel.",panelPort:"Panel port",panelPortHint:"Only changeable while the panel is stopped.",panelPortFree:"Leave empty to use the port in the config.",panelPortInvalid:"Enter a port between 1 and 65535.",panelStart:"Start the panel",panelReplace:"Replace with {copy}",panelCopyPinned:"pinned dependency",panelCopyGlobal:"global install",panelTakeoverTitle:"Replace the running panel?",panelTakeoverBody:"This stops the panel and every server it supervises \u2014 this session included, so the page disconnects. It needs the {id} entry adopted with autostart on.",confirmCancel:"Cancel",confirmReplace:"Replace",writeViaApi:"authenticated API",writeViaFile:"config file",writeViaNone:"unavailable",tokenEnrolled:"enrolled",tokenPresent:"present",tokenAbsent:"absent",tokenUnknown:"unknown",bootTitle:"Autostart",bootEnabled:"Enable autostart",bootUninstall:"Uninstall",bootSwitchMode:"Switch autostart",bootRecheck:"Re-check",bootMechanism:"Mechanism",bootMechanismAuto:"Automatic",bootState:"State",bootStateNotInstalled:"not installed",bootStateInstalledDisabled:"installed, off",bootStateEnabledRunning:"enabled, running",bootStateEnabledFailing:"enabled, failing",bootStateUnsupported:"unsupported",bootBootCapable:"Starts before login",bootPrivileged:"This process can install it",bootUnitPath:"Unit path",bootCommandsLabel:"Install by hand",bootCommandsExplain:"This process cannot elevate. Run these commands to install autostart:",bootRequestedNotInstalled:"Autostart is requested, but no boot entry is installed.",bootActionInstall:"install",bootActionUninstall:"uninstall",bootAttemptFailed:"{action} failed",bootAttemptSucceeded:"{action} succeeded \u2014 {detail}",bootAttemptNoDetail:"The host did not explain the refusal.",bootAttemptCommands:"Run these yourself:",entriesTitle:"Managed entry",entriesManage:"Manage {id}",entriesManageNote:"Hands {id} to home-hosted: boot autostart, panel control, port reclaim.",entriesManageWinWarning:"On Windows, `{id}` is managed via the `kill` onPortConflict policy, so when it is restarted detached by another plugin it may briefly fail to boot while home-hosted reclaims the process and port.",entriesEmpty:"{id} is not managed yet.",entriesExists:"exists",entriesMissing:"missing",entriesManaged:"managed",entriesUnmanaged:"unmanaged",entriesDrift:"drift",entriesNotRunning:"not running",agentTitle:"Agent tools",agentCount:"{enabled} of {total} on",agentMaster:"Let the agent use these tools",agentApproval:"Tools that change something ask for approval first.",agentApprovalBadge:"approval",agentToolStatus:"Status",agentToolServersList:"List servers",agentToolServersLifecycle:"Start, stop, restart",agentToolServersEdit:"Create, update, delete",agentToolAutostartManage:"Manage boot autostart",agentToolUiManage:"Manage Panel UI",agentToolDescStatus:"Read the panel, the CLI copy in use and the managed entry. Nothing changes.",agentToolDescServersList:"List the servers the panel supervises, with status, port and URL.",agentToolDescServersLifecycle:"Start, stop and restart supervised servers.",agentToolDescServersEdit:"Create, update and delete the panel's server entries.",agentToolDescAutostartManage:"Install or remove the boot entry that starts the panel.",agentToolDescUiManage:"Inspect, update, revert or switch the panel's own UI build.",serversTitle:"Servers",serversCount:"{running} of {total} running",serversHintPanel:"Entries are managed in the home-hosted panel:",serversHintNoPanel:"Entries cannot be managed right now: the panel is not running.",serversEmpty:"The panel reports no servers.",serversPid:"PID",serversUrl:"URL",serversCommand:"Command",serversArgs:"Args",serversCwd:"Working dir",serversPort:"Port",serversOnPortConflict:"On port conflict",serversAutostart:"Autostart",serversPersistent:"Persistent",serversPersistentHint:"Run by home-hosted's own nanny, so stopping or restarting the panel leaves it alive.",serversHealth:"Health",serversRestartPolicy:"Restart",serversConfiguration:"Configuration",serversRawConfig:"Raw config",serversDisabled:"disabled",serversEnabled:"enabled",serversHealthHttp:"HTTP {status} on {path}",serversHealthHttpBelow:"HTTP <{status} on {path}",serversHealthHttpProbe:"HTTP probe on {path}",serversHealthPort:"port {port}",serversHealthProbe:"port probe",serversHealthEvery:"every {seconds}",serversRestartSummary:"{retries} retries \xB7 {base} \u2192 \xD7{factor}",serversStart:"Start",serversStop:"Stop",serversRestart:"Restart"},fe={tab:"Home Hosted",loading:"\u52A0\u8F7D\u4E2D\u2026",refresh:"\u5237\u65B0",retry:"\u91CD\u8BD5",errorTitle:"\u9519\u8BEF",statusUnavailable:"\u9762\u677F\u6CA1\u6709\u54CD\u5E94\u3002",yes:"\u662F",no:"\u5426",copy:"\u590D\u5236",copied:"\u5DF2\u590D\u5236",details:"\u8BE6\u60C5",uiStyleLabel:"\u9875\u9762\u6837\u5F0F",uiStyleDetailed:"\u8BE6\u7EC6",uiStyleCompact:"\u7D27\u51D1",sigPanel:"\u9762\u677F",sigAutostart:"\u5F00\u673A\u81EA\u542F",sigEntry:"{id} \u6761\u76EE",stateAnswering:"\u54CD\u5E94\u4E2D",stateNotAnswering:"\u672A\u54CD\u5E94",stateManaged:"\u5DF2\u63A5\u7BA1",stateNotManaged:"\u672A\u63A5\u7BA1",panelTitle:"\u9762\u677F",panelCopy:"\u7531\u54EA\u4E2A\u526F\u672C\u8FD0\u884C\u9762\u677F",panelCopyHint:"\u56FA\u5B9A\u526F\u672C\u968F\u63D2\u4EF6\u4E00\u8D77\u5B89\u88C5\uFF1B\u5168\u5C40\u526F\u672C\u6765\u81EA PATH\u3002",optionsPreferPinned:"\u56FA\u5B9A\u4F9D\u8D56",optionsPreferGlobal:"\u5168\u5C40\u5B89\u88C5",optionsRecommended:"\u63A8\u8350",optionsConfigOverride:"\u63D2\u4EF6\u884C\u4E2D\u7684 homeHostedCommand \u4F18\u5148\u7EA7\u6700\u9AD8\uFF0C\u59CB\u7EC8\u751F\u6548\u3002",optionsInstallLabel:"\u5B89\u88C5\u5168\u5C40\u526F\u672C",optionsInstallHint:"\u672A\u627E\u5230\u5168\u5C40\u5B89\u88C5\u3002\u5B89\u88C5\u56FA\u5B9A\u7248\u672C\u8303\u56F4\u540E\uFF0C\u5728\u4E0A\u65B9\u9009\u62E9\u5B83\uFF1A",optionsInstall:"\u5168\u5C40\u5B89\u88C5",panelHome:"$HHOSTED_HOME",panelUrl:"URL",panelVersion:"\u7248\u672C",panelPid:"PID",panelWriteVia:"\u5199\u5165\u65B9\u5F0F",panelToken:"API \u4EE4\u724C",panelCliSource:"CLI",panelCliPath:"CLI \u8DEF\u5F84",panelCliConfig:"\u914D\u7F6E\u7684\u547D\u4EE4",panelCliDependency:"\u56FA\u5B9A\u7684\u4F9D\u8D56\u7248\u672C",panelCliPathSource:"\u5168\u5C40\u5B89\u88C5\uFF08PATH\uFF09",panelCliMissing:"\u672A\u627E\u5230",panelCliNotPinned:"\u6B64\u5BBF\u4E3B\u89E3\u6790\u5230\u7684\u662F\u5168\u5C40 home-hosted\uFF0C\u800C\u4E0D\u662F\u56FA\u5B9A\u526F\u672C\uFF08{range}\uFF09\u3002",panelCliUnsupported:"\u6B64 home-hosted \u65E9\u4E8E\u63D2\u4EF6\u652F\u6301\u7684\u6700\u8001\u7248\u672C\u3002",panelCliLauncherFailed:"\u5F00\u673A\u542F\u52A8\u5668\u6CA1\u6709\u5E94\u7B54\uFF0C\u5F00\u673A\u9879\u53EF\u80FD\u65E0\u6CD5\u542F\u52A8\u9762\u677F\u3002",panelPort:"\u9762\u677F\u7AEF\u53E3",panelPortHint:"\u4EC5\u5728\u9762\u677F\u505C\u6B62\u65F6\u53EF\u4FEE\u6539\u3002",panelPortFree:"\u7559\u7A7A\u5219\u4F7F\u7528\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684\u7AEF\u53E3\u3002",panelPortInvalid:"\u8BF7\u8F93\u5165 1 \u5230 65535 \u4E4B\u95F4\u7684\u7AEF\u53E3\u3002",panelStart:"\u542F\u52A8\u9762\u677F",panelReplace:"\u66FF\u6362\u4E3A{copy}",panelCopyPinned:"\u56FA\u5B9A\u4F9D\u8D56",panelCopyGlobal:"\u5168\u5C40\u5B89\u88C5",panelTakeoverTitle:"\u66FF\u6362\u6B63\u5728\u8FD0\u884C\u7684\u9762\u677F\uFF1F",panelTakeoverBody:"\u8FD9\u4F1A\u505C\u6B62\u9762\u677F\u4EE5\u53CA\u5B83\u76D1\u7BA1\u7684\u6240\u6709\u670D\u52A1\u5668\u2014\u2014\u5305\u62EC\u672C\u4F1A\u8BDD\uFF0C\u56E0\u6B64\u672C\u9875\u9762\u4F1A\u65AD\u5F00\u8FDE\u63A5\u3002\u4EC5\u5F53 {id} \u6761\u76EE\u5DF2\u88AB\u63A5\u7BA1\u4E14\u542F\u7528\u81EA\u542F\u65F6\u624D\u53EF\u7528\u3002",confirmCancel:"\u53D6\u6D88",confirmReplace:"\u66FF\u6362",writeViaApi:"\u5DF2\u8BA4\u8BC1 API",writeViaFile:"\u914D\u7F6E\u6587\u4EF6",writeViaNone:"\u4E0D\u53EF\u7528",tokenEnrolled:"\u5DF2\u767B\u8BB0",tokenPresent:"\u5DF2\u5B58\u5728",tokenAbsent:"\u4E0D\u5B58\u5728",tokenUnknown:"\u672A\u77E5",bootTitle:"\u5F00\u673A\u81EA\u542F",bootEnabled:"\u542F\u7528\u5F00\u673A\u81EA\u542F",bootUninstall:"\u5378\u8F7D",bootSwitchMode:"\u5207\u6362\u81EA\u542F\u673A\u5236",bootRecheck:"\u91CD\u65B0\u68C0\u67E5",bootMechanism:"\u673A\u5236",bootMechanismAuto:"\u81EA\u52A8",bootState:"\u72B6\u6001",bootStateNotInstalled:"\u672A\u5B89\u88C5",bootStateInstalledDisabled:"\u5DF2\u5B89\u88C5\uFF0C\u672A\u542F\u7528",bootStateEnabledRunning:"\u5DF2\u542F\u7528\uFF0C\u8FD0\u884C\u4E2D",bootStateEnabledFailing:"\u5DF2\u542F\u7528\uFF0C\u542F\u52A8\u5931\u8D25",bootStateUnsupported:"\u4E0D\u652F\u6301",bootBootCapable:"\u767B\u5F55\u524D\u542F\u52A8",bootPrivileged:"\u672C\u8FDB\u7A0B\u53EF\u5B89\u88C5",bootUnitPath:"\u5355\u5143\u6587\u4EF6\u8DEF\u5F84",bootCommandsLabel:"\u624B\u52A8\u5B89\u88C5",bootCommandsExplain:"\u672C\u8FDB\u7A0B\u65E0\u6CD5\u63D0\u6743\u3002\u8BF7\u81EA\u884C\u6267\u884C\u4EE5\u4E0B\u547D\u4EE4\u6765\u5B89\u88C5\u81EA\u542F\uFF1A",bootRequestedNotInstalled:"\u5DF2\u8BF7\u6C42\u5F00\u673A\u81EA\u542F\uFF0C\u4F46\u5C1A\u672A\u5B89\u88C5\u4EFB\u4F55\u5F00\u673A\u9879\u3002",bootActionInstall:"\u5B89\u88C5",bootActionUninstall:"\u5378\u8F7D",bootAttemptFailed:"{action}\u5931\u8D25",bootAttemptSucceeded:"{action}\u6210\u529F \u2014 {detail}",bootAttemptNoDetail:"\u5BBF\u4E3B\u6CA1\u6709\u8BF4\u660E\u5931\u8D25\u539F\u56E0\u3002",bootAttemptCommands:"\u4F60\u53EF\u4EE5\u81EA\u884C\u8FD0\u884C\u4EE5\u4E0B\u547D\u4EE4\uFF1A",entriesTitle:"\u53D7\u7BA1\u6761\u76EE",entriesManage:"\u63A5\u7BA1 {id}",entriesManageNote:"\u628A {id} \u4EA4\u7ED9 home-hosted\uFF1A\u5F00\u673A\u81EA\u542F\u3001\u9762\u677F\u63A7\u5236\u3001\u7AEF\u53E3\u56DE\u6536\u3002",entriesManageWinWarning:"\u5728 Windows \u4E0A\uFF0C`{id}` \u901A\u8FC7 `kill` \u7AEF\u53E3\u51B2\u7A81\u7B56\u7565\u7BA1\u7406\uFF1B\u5F53\u5B83\u88AB\u5176\u4ED6\u63D2\u4EF6\u4EE5\u5206\u79BB\u65B9\u5F0F\u91CD\u542F\u65F6\uFF0Chome-hosted \u56DE\u6536\u8FDB\u7A0B\u4E0E\u7AEF\u53E3\u671F\u95F4\u53EF\u80FD\u77ED\u6682\u65E0\u6CD5\u542F\u52A8\u3002",entriesEmpty:"\u5C1A\u672A\u63A5\u7BA1 {id}\u3002",entriesExists:"\u5B58\u5728",entriesMissing:"\u7F3A\u5931",entriesManaged:"\u5DF2\u63A5\u7BA1",entriesUnmanaged:"\u672A\u63A5\u7BA1",entriesDrift:"\u6F02\u79FB",entriesNotRunning:"\u672A\u8FD0\u884C",agentTitle:"Agent \u5DE5\u5177",agentCount:"\u5DF2\u5F00\u542F {enabled}/{total}",agentMaster:"\u5141\u8BB8 Agent \u8C03\u7528\u8FD9\u4E9B\u5DE5\u5177",agentApproval:"\u4F1A\u6539\u53D8\u72B6\u6001\u7684\u5DE5\u5177\u5728\u8FD0\u884C\u524D\u4F1A\u8BF7\u6C42\u6279\u51C6\u3002",agentApprovalBadge:"\u9700\u6279\u51C6",agentToolStatus:"\u67E5\u770B\u72B6\u6001",agentToolServersList:"\u5217\u51FA\u670D\u52A1\u5668",agentToolServersLifecycle:"\u542F\u52A8\u3001\u505C\u6B62\u3001\u91CD\u542F",agentToolServersEdit:"\u521B\u5EFA\u3001\u66F4\u65B0\u3001\u5220\u9664",agentToolAutostartManage:"\u7BA1\u7406\u5F00\u673A\u81EA\u542F",agentToolUiManage:"\u7BA1\u7406\u9762\u677F UI",agentToolDescStatus:"\u8BFB\u53D6\u9762\u677F\u3001\u6B63\u5728\u4F7F\u7528\u7684 CLI \u526F\u672C\u548C\u53D7\u7BA1\u6761\u76EE\u3002\u4E0D\u6539\u53D8\u4EFB\u4F55\u72B6\u6001\u3002",agentToolDescServersList:"\u5217\u51FA\u9762\u677F\u76D1\u7BA1\u7684\u670D\u52A1\u5668\u53CA\u5176\u72B6\u6001\u3001\u7AEF\u53E3\u548C URL\u3002",agentToolDescServersLifecycle:"\u542F\u52A8\u3001\u505C\u6B62\u548C\u91CD\u542F\u53D7\u76D1\u7BA1\u7684\u670D\u52A1\u5668\u3002",agentToolDescServersEdit:"\u521B\u5EFA\u3001\u66F4\u65B0\u548C\u5220\u9664\u9762\u677F\u7684\u670D\u52A1\u5668\u6761\u76EE\u3002",agentToolDescAutostartManage:"\u5B89\u88C5\u6216\u79FB\u9664\u542F\u52A8\u9762\u677F\u7684\u5F00\u673A\u9879\u3002",agentToolDescUiManage:"\u67E5\u770B\u3001\u66F4\u65B0\u3001\u56DE\u9000\u6216\u5207\u6362\u9762\u677F\u81EA\u8EAB\u7684 UI \u6784\u5EFA\u3002",serversTitle:"\u670D\u52A1\u5668",serversCount:"{total} \u4E2A\u4E2D {running} \u4E2A\u8FD0\u884C\u4E2D",serversHintPanel:"\u5728 home-hosted \u9762\u677F\u4E2D\u7BA1\u7406\u6761\u76EE\uFF1A",serversHintNoPanel:"\u5F53\u524D\u65E0\u6CD5\u7BA1\u7406\u6761\u76EE\uFF1A\u9762\u677F\u6CA1\u6709\u8FD0\u884C\u3002",serversEmpty:"\u9762\u677F\u672A\u62A5\u544A\u4EFB\u4F55\u670D\u52A1\u5668\u3002",serversPid:"PID",serversUrl:"URL",serversCommand:"\u547D\u4EE4",serversArgs:"\u53C2\u6570",serversCwd:"\u5DE5\u4F5C\u76EE\u5F55",serversPort:"\u7AEF\u53E3",serversOnPortConflict:"\u7AEF\u53E3\u51B2\u7A81\u65F6",serversAutostart:"\u81EA\u542F",serversPersistent:"\u6301\u4E45\u5316",serversPersistentHint:"\u7531 home-hosted \u81EA\u5E26\u7684 nanny \u6258\u7BA1\uFF0C\u505C\u6B62\u6216\u91CD\u542F\u9762\u677F\u4E0D\u4F1A\u505C\u6B62\u5B83\u3002",serversHealth:"\u5065\u5EB7\u68C0\u67E5",serversRestartPolicy:"\u91CD\u542F",serversConfiguration:"\u914D\u7F6E",serversRawConfig:"\u539F\u59CB\u914D\u7F6E",serversDisabled:"\u5DF2\u505C\u7528",serversEnabled:"\u5DF2\u542F\u7528",serversHealthHttp:"HTTP {status} \u4E8E {path}",serversHealthHttpBelow:"HTTP <{status} \u4E8E {path}",serversHealthHttpProbe:"HTTP \u63A2\u6D4B {path}",serversHealthPort:"\u7AEF\u53E3 {port}",serversHealthProbe:"\u7AEF\u53E3\u63A2\u6D4B",serversHealthEvery:"\u6BCF {seconds}",serversRestartSummary:"{retries} \u6B21\u91CD\u8BD5 \xB7 {base} \u2192 \xD7{factor}",serversStart:"\u542F\u52A8",serversStop:"\u505C\u6B62",serversRestart:"\u91CD\u542F"};function kt(e,t){return t===void 0?e:e.replace(/\{(\w+)\}/g,(n,a)=>Object.prototype.hasOwnProperty.call(t,a)?String(t[a]):n)}var be=(e,t)=>kt(le[e]??e,t);function ve(e){if(e!==void 0)try{let t=e.bind(ee);if(typeof t=="function")return t}catch{}return be}function ye(e,t=be){return e===void 0?t:(n,a)=>{let o;try{o=e(n,a)}catch{o=void 0}return o===void 0||o.length===0||o===n?t(n,a):o}}var F=require("react");var B=require("react");var xe="/home-hosted";var j=["status","servers_list","servers_lifecycle","servers_edit","autostart_manage","ui_manage"],we=["servers_lifecycle","servers_edit","autostart_manage","ui_manage"],Ct=2,Yt={version:Ct,autostart:{enabled:!1,mechanism:"auto"},manageDsh:!1,entries:[],agentTools:{enabled:!0,allow:[...j]},panel:{port:null},authNotice:!0,uiStyle:"detailed",cli:{prefer:"pinned"}};var Tt="/api";function I(e,t,n){return{ok:!1,error:n===void 0?{code:e,message:t}:{code:e,message:t,detail:n}}}function ce(e){return typeof e=="object"&&e!==null}function Pt(e){return e instanceof Error?e.message:String(e)}function Nt(e){if(!ce(e))return I("bad-response","The panel returned a non-object response");if(typeof e.v=="number"&&e.v!==1)return I("version-mismatch",`Response protocol v${e.v} does not match the expected v${1}`);let t=e.result;if(!ce(t))return I("bad-response","The panel returned no result");if(t.ok===!0)return"value"in t?{ok:!0,value:t.value}:I("bad-response","A successful response carried no value");if(t.ok===!1){let n=t.error;return ce(n)&&typeof n.message=="string"?I(typeof n.code=="string"?n.code:"error",n.message,n.detail):I("error","The panel reported a failure without a message")}return I("bad-response","The panel returned an unrecognised result")}async function k(e,t,n={}){let a=n.fetch??globalThis.fetch;if(typeof a!="function")return I("no-fetch","No fetch implementation is available");let o={v:1,endpoint:e,payload:t},r;try{r=await a(`${Tt}${xe}`,{method:"POST",credentials:"same-origin",headers:{"content-type":"application/json"},body:JSON.stringify(o)})}catch(i){return I("network",Pt(i))}if(!r.ok){let i=r.statusText.length>0?` ${r.statusText}`:"";return I("http",`HTTP ${r.status}${i}`)}let l;try{l=await r.json()}catch{return I("bad-json","The panel returned invalid JSON")}return Nt(l)}function Se(e,t={}){return k("settings.update",{patch:e},t)}var Et=5e3;function ke(e=Et){let[t,n]=(0,B.useState)(null),[a,o]=(0,B.useState)(null),[r,l]=(0,B.useState)(!0),i=(0,B.useRef)(!0),s=(0,B.useCallback)(async()=>{let h=await k("status",{});i.current&&(h.ok?(n(h.value),o(null)):o(h.error),l(!1))},[]);return(0,B.useEffect)(()=>{i.current=!0,s();let h=setInterval(()=>{s()},e);return()=>{i.current=!1,clearInterval(h)}},[s,e]),{data:t,error:a,loading:r,refresh:s}}var m=require("react/jsx-runtime");function O({size:e=14,children:t}){return(0,m.jsx)("svg",{width:e,height:e,viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:1.4,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",children:t})}function Ce(e){return(0,m.jsxs)(O,{...e,children:[(0,m.jsx)("rect",{x:"2.2",y:"3",width:"11.6",height:"7.6",rx:"1.6"}),(0,m.jsx)("path",{d:"M6.6 13.4h2.8M8 10.6v2.8"})]})}function Te(e){return(0,m.jsxs)(O,{...e,children:[(0,m.jsx)("path",{d:"M8 2.4v5.2"}),(0,m.jsx)("path",{d:"M11.6 4.4a5 5 0 1 1-7.2 0"})]})}function Pe(e){return(0,m.jsxs)(O,{...e,children:[(0,m.jsx)("rect",{x:"2.2",y:"2.8",width:"11.6",height:"10.4",rx:"1.6"}),(0,m.jsx)("path",{d:"M5.2 6.9l1.8 1.8-1.8 1.8M8.7 10.5h2.2"})]})}function Ne(e){return(0,m.jsxs)(O,{...e,children:[(0,m.jsx)("path",{d:"M2.4 5.4h11.2M2.4 10.6h11.2"}),(0,m.jsx)("circle",{cx:"6",cy:"5.4",r:"1.6",fill:"currentColor",stroke:"none"}),(0,m.jsx)("circle",{cx:"10.4",cy:"10.6",r:"1.6",fill:"currentColor",stroke:"none"})]})}function Ee(e){return(0,m.jsxs)(O,{...e,children:[(0,m.jsx)("path",{d:"M8 2.3l5.4 2.9L8 8.1 2.6 5.2z"}),(0,m.jsx)("path",{d:"M2.6 8.6l5.4 2.9 5.4-2.9"}),(0,m.jsx)("path",{d:"M2.6 11.4l5.4 2.9 5.4-2.9"})]})}function Re(e){return(0,m.jsxs)(O,{...e,children:[(0,m.jsx)("path",{d:"M13.4 9.4A5.5 5.5 0 1 1 12.2 4.4"}),(0,m.jsx)("path",{d:"M12.8 1.7v2.9h-2.9"})]})}function Ae(e){return(0,m.jsx)(O,{...e,children:(0,m.jsx)("path",{d:"M6.2 3.8L10.4 8l-4.2 4.2"})})}function He(e){return(0,m.jsxs)(O,{...e,children:[(0,m.jsx)("path",{d:"M6.6 3.4H3.4v9.2h9.2V9.4"}),(0,m.jsx)("path",{d:"M9.4 3.4h3.2v3.2M12.6 3.4L7.8 8.2"})]})}function te(e){return(0,m.jsxs)(O,{...e,children:[(0,m.jsx)("path",{d:"M8 2.6l5.7 10.2H2.3z"}),(0,m.jsx)("path",{d:"M8 6.4v3.1M8 11.5h.01"})]})}function Me(e){return(0,m.jsx)(O,{...e,children:(0,m.jsx)("path",{d:"M3 8.4l3.3 3.3L13 5"})})}var L="\u2014";function v(e){if(e==null)return L;let t=String(e);return t.length>0?t:L}function Ie(e){return e.length>0?e.join(", "):L}function he(e){return we.includes(e)}var pe={status:"agentToolStatus",servers_list:"agentToolServersList",servers_lifecycle:"agentToolServersLifecycle",servers_edit:"agentToolServersEdit",autostart_manage:"agentToolAutostartManage",ui_manage:"agentToolUiManage"},Le={status:"agentToolDescStatus",servers_list:"agentToolDescServersList",servers_lifecycle:"agentToolDescServersLifecycle",servers_edit:"agentToolDescServersEdit",autostart_manage:"agentToolDescAutostartManage",ui_manage:"agentToolDescUiManage"},Be={api:"writeViaApi",file:"writeViaFile",none:"writeViaNone"},Oe={enrolled:"tokenEnrolled",present:"tokenPresent",absent:"tokenAbsent",unknown:"tokenUnknown"},ne={"not-installed":"bootStateNotInstalled","installed-disabled":"bootStateInstalledDisabled","enabled-running":"bootStateEnabledRunning","enabled-failing":"bootStateEnabledFailing",unsupported:"bootStateUnsupported"},_e={config:"panelCliConfig",dependency:"panelCliDependency",path:"panelCliPathSource",none:"panelCliMissing"};function oe(e,t=52){if(e.length<=t)return e;let n=e.includes("\\")?"\\":"/",a=e.split(/[\\/]/).filter(i=>i.length>0);if(a.length<4)return e;let o=/^[A-Za-z]:$/.test(a[0]??"")?3:2;if(a.length<=o)return e;let l=`${/^[\\/]/.test(e)?n:""}${a.slice(0,o).join(n)}${n}\u2026${n}${a.slice(-2).join(n)}`;return l.length<e.length?l:e}function Ue(e){let t=n=>e.source===n&&e.path!==null?{source:n,path:e.path,version:e.version}:null;return{dependency:e.dependency??t("dependency"),global:e.global??t("path")}}function De(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Rt(e,t){if(Object.is(e,t))return!0;try{return JSON.stringify(e)===JSON.stringify(t)}catch{return!1}}function Fe(e,t){let n={};for(let a of Object.keys(t)){let o=e[a],r=t[a];if(De(o)&&De(r)){let l=Fe(o,r);Object.keys(l).length>0&&(n[a]=l)}else Rt(o,r)||(n[a]=r)}return n}function Ve(e,t){return Fe(e,t)}function $e(e,t,n){let a=new Set(e);return n?a.add(t):a.delete(t),j.filter(o=>a.has(o))}var ze=require("react");async function je(e){try{if(typeof navigator<"u"&&navigator.clipboard!==void 0)return await navigator.clipboard.writeText(e),!0}catch{}return!1}var c=require("react/jsx-runtime");function At(...e){return e.filter(t=>typeof t=="string"&&t.length>0).join(" ")}function _({icon:e,title:t,action:n,children:a}){return(0,c.jsxs)("section",{className:"hh-section",children:[(0,c.jsxs)("header",{className:"hh-section-head",children:[e===void 0?null:(0,c.jsx)("span",{className:"hh-section-icon",children:e}),(0,c.jsx)("h3",{className:"hh-section-title",children:t}),(0,c.jsx)("span",{className:"hh-section-rule","aria-hidden":"true"}),n===void 0?null:(0,c.jsx)("span",{className:"hh-section-action",children:n})]}),(0,c.jsx)("div",{className:"hh-section-body",children:a})]})}function b({label:e,children:t}){return(0,c.jsxs)("div",{className:"hh-spec",children:[(0,c.jsx)("span",{className:"hh-spec-label",children:e}),(0,c.jsx)("span",{className:"hh-spec-value",children:t})]})}function U({children:e}){return(0,c.jsx)("code",{className:"hh-code",children:e})}function y({children:e}){return typeof e=="string"&&e.length===0?null:(0,c.jsx)("p",{className:"hh-hint",children:e})}function E({tone:e,children:t}){return(0,c.jsx)("span",{className:"hh-chip","data-tone":e??"idle",children:t})}function z({href:e,children:t}){return(0,c.jsxs)("a",{className:"hh-link",href:e,target:"_blank",rel:"noreferrer noopener",children:[t??e,(0,c.jsx)("span",{className:"hh-link-icon","aria-hidden":"true",children:(0,c.jsx)(He,{size:11})})]})}function D({label:e,open:t=!1,children:n}){return(0,c.jsxs)("details",{className:"hh-details",open:t||void 0,children:[(0,c.jsxs)("summary",{className:"hh-summary",children:[(0,c.jsx)("span",{className:"hh-chevron","aria-hidden":"true",children:(0,c.jsx)(Ae,{size:12})}),e]}),(0,c.jsx)("div",{className:"hh-details-body",children:n})]})}function G({tone:e="bad",icon:t=!0,title:n,children:a}){return(0,c.jsxs)("div",{className:"hh-note","data-tone":e,role:e==="bad"?"alert":"note",children:[t?(0,c.jsx)("span",{className:"hh-note-icon","aria-hidden":"true",children:(0,c.jsx)(te,{size:13})}):null,(0,c.jsxs)("div",{className:"hh-note-body",children:[n===void 0?null:(0,c.jsx)("span",{className:"hh-note-title",children:n}),typeof a=="string"?(0,c.jsx)("p",{children:a}):a]})]})}function Ge({title:e,detail:t}){return(0,c.jsxs)("div",{className:"hh-note",role:"alert",children:[(0,c.jsx)("span",{className:"hh-note-icon","aria-hidden":"true",children:(0,c.jsx)(te,{size:13})}),(0,c.jsxs)("div",{className:"hh-note-body",children:[(0,c.jsx)("strong",{children:e}),t.length>0?(0,c.jsx)("p",{children:t}):null]})]})}function Z({error:e,title:t}){return e===null?null:(0,c.jsxs)("div",{className:"hh-note",role:"alert",children:[(0,c.jsx)("span",{className:"hh-note-icon","aria-hidden":"true",children:(0,c.jsx)(te,{size:13})}),(0,c.jsxs)("div",{className:"hh-note-body",children:[(0,c.jsx)("strong",{children:t}),(0,c.jsxs)("p",{children:[(0,c.jsx)("code",{children:e.code})," \u2014 ",e.message]})]})]})}function Ht(){return(0,c.jsx)("span",{className:"hh-spinner","aria-hidden":"true"})}function T({children:e,onClick:t,disabled:n,busy:a,variant:o="default",icon:r,title:l}){let i=n===!0||a===!0;return(0,c.jsxs)("button",{type:"button",className:At("hh-btn",o!=="default"&&`hh-btn-${o}`),onClick:t,disabled:i,title:l,children:[a===!0?(0,c.jsx)(Ht,{}):r,e]})}function ae({label:e,checked:t,disabled:n,onChange:a}){return(0,c.jsxs)("button",{type:"button",role:"switch",className:"hh-switch","aria-checked":t,disabled:n,onClick:()=>a(!t),children:[(0,c.jsx)("span",{className:"hh-switch-track","aria-hidden":"true",children:(0,c.jsx)("span",{className:"hh-switch-knob"})}),(0,c.jsx)("span",{className:"hh-check-label",children:e})]})}function Ke({label:e,checked:t,disabled:n,onChange:a}){return(0,c.jsxs)("label",{className:"hh-check",children:[(0,c.jsx)("input",{type:"checkbox",checked:t,disabled:n,onChange:o=>a(o.target.checked)}),(0,c.jsx)("span",{className:"hh-check-label",children:e})]})}function re({value:e,options:t,disabled:n,label:a,onChange:o}){return(0,c.jsx)("select",{className:"hh-select",value:e,disabled:n,"aria-label":a,onChange:r=>o(r.target.value),children:t.map(r=>(0,c.jsx)("option",{value:r.value,children:r.label},r.value))})}function ue({label:e,meta:t,path:n,hint:a,checked:o,disabled:r,onChange:l}){return(0,c.jsxs)("label",{className:"hh-choice-option","data-disabled":r===!0,children:[(0,c.jsx)("input",{type:"radio",checked:o,disabled:r,onChange:()=>l()}),(0,c.jsxs)("span",{className:"hh-choice-label",children:[(0,c.jsx)("span",{children:e}),a]}),t===void 0?null:(0,c.jsx)("span",{className:"hh-choice-meta",children:t}),n===void 0?null:(0,c.jsx)("span",{className:"hh-choice-path",title:n,children:oe(n)})]})}function We({children:e}){return(0,c.jsxs)(E,{tone:"accent",children:[(0,c.jsx)(Me,{size:10}),e]})}function Q({text:e,copyLabel:t,copiedLabel:n}){let[a,o]=(0,ze.useState)(!1);return(0,c.jsxs)("div",{className:"hh-code-box",children:[(0,c.jsx)("textarea",{className:"hh-code-text",readOnly:!0,value:e,rows:Math.min(e.split(`
4
- `).length,4)}),(0,c.jsx)("div",{className:"hh-btn-row",children:(0,c.jsx)(T,{variant:"ghost",onClick:()=>{je(e).then(o)},children:a?n:t})})]})}var x=require("react/jsx-runtime");function Ye({t:e,status:t,updateSettings:n,uiStyle:a}){let o=t.settings.agentTools,r=o.allow??[],l=j.filter(s=>r.includes(s)).length,i=(s,h)=>{n(u=>({...u,agentTools:{...u.agentTools,allow:$e(u.agentTools.allow??[],s,h)}}))};return(0,x.jsxs)(_,{icon:(0,x.jsx)(Ne,{}),title:e("agentTitle"),action:(0,x.jsx)(E,{children:e("agentCount",{enabled:l,total:j.length})}),children:[(0,x.jsx)(ae,{label:e("agentMaster"),checked:o.enabled,onChange:s=>n(h=>({...h,agentTools:{...h.agentTools,enabled:s}}))}),(0,x.jsx)(y,{children:e("agentApproval")}),a==="detailed"?(0,x.jsx)("div",{className:"hh-tool-cards",children:j.map(s=>(0,x.jsxs)("label",{className:"hh-tool-card",children:[(0,x.jsx)("input",{type:"checkbox",checked:r.includes(s),disabled:!o.enabled,onChange:h=>i(s,h.target.checked)}),(0,x.jsxs)("span",{className:"hh-tool-card-body",children:[(0,x.jsxs)("span",{className:"hh-tool-card-head",children:[(0,x.jsx)("span",{className:"hh-tool-card-name",children:e(pe[s])}),he(s)?(0,x.jsx)(E,{tone:"warn",children:e("agentApprovalBadge")}):null]}),(0,x.jsx)("span",{className:"hh-tool-card-desc",children:e(Le[s])})]})]},s))}):(0,x.jsx)("div",{className:"hh-tools",children:j.map(s=>(0,x.jsx)(Ke,{label:(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)("span",{className:"hh-check-text",children:e(pe[s])}),he(s)?(0,x.jsx)(E,{tone:"warn",children:e("agentApprovalBadge")}):null]}),checked:r.includes(s),disabled:!o.enabled,onChange:h=>i(s,h)},s))})]})}var tt=require("react");function qe(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function Je(e){if(typeof e!="object"||e===null)return null;let t=e.result;if(typeof t!="object"||t===null)return null;let{ok:n,detail:a,commands:o}=t;return n!==!1?null:{detail:typeof a=="string"?a:"",commands:qe(o)}}function Xe(e){return e===void 0?null:{ok:e.ok===!0,action:e.action==="uninstall"?"uninstall":"install",detail:typeof e.detail=="string"?e.detail:"",commands:qe(e.commands)}}var Mt=["enabled-running","enabled-failing","installed-disabled"];function Ze(e,t){let n=e.filter(r=>r.available).map(r=>r.mechanism),a=n.filter(r=>r!=="unsupported"),o=["auto",...a.length>0?a:n];return o.includes(t)||o.push(t),o}function Qe(e,t){return e!==null&&e!==t}function et(e,t){return e===null||e.ok?!1:e.action==="install"?Mt.includes(t):t==="not-installed"}var f=require("react/jsx-runtime");function nt({t:e,status:t,run:n,updateSettings:a,busy:o,uiStyle:r}){let l=t.boot,i=t.settings.autostart,s=l.candidates??[],h=l.commands??[],[u,R]=(0,tt.useState)(null),N=o==="boot.install"||o==="boot.uninstall",K=Ze(s,i.mechanism).map(S=>({value:S,label:S==="auto"?e("bootMechanismAuto"):S})),W=Qe(l.mechanism,i.mechanism),A=l.mechanism!==null,w=S=>e(S==="install"?"bootActionInstall":"bootActionUninstall"),M=async S=>{let X=await n(`boot.${S}`,async()=>S==="install"?k("boot.install",i.mechanism==="auto"?{}:{mechanism:i.mechanism}):k("boot.uninstall",{}));if(!X.ok){R(null);return}let ie=Je(X.value);R(ie===null?null:{ok:!1,action:S,detail:ie.detail,commands:ie.commands})},H=Xe(i.lastAttempt),Y=et(H,l.state),C=u??(Y?null:H);return(0,f.jsxs)(_,{icon:(0,f.jsx)(Te,{}),title:e("bootTitle"),action:(0,f.jsx)(re,{value:i.mechanism,options:K,label:e("bootMechanism"),disabled:o==="settings"||N,onChange:S=>a(X=>({...X,autostart:{...X.autostart,mechanism:S}}))}),children:[(0,f.jsxs)("div",{className:"hh-btn-row",children:[(0,f.jsx)(T,{variant:A?"default":"primary",disabled:i.mechanism==="unsupported",busy:o==="boot.install",onClick:()=>{M("install")},children:e(W?"bootSwitchMode":"bootEnabled")}),(0,f.jsx)(T,{disabled:!A,busy:o==="boot.uninstall",onClick:()=>{M("uninstall")},children:e("bootUninstall")}),(0,f.jsx)(T,{variant:"ghost",busy:o==="boot.verify",onClick:()=>{n("boot.verify",()=>k("boot.verify",{}))},children:e("bootRecheck")})]}),i.enabled&&l.state==="not-installed"?(0,f.jsx)(G,{tone:"warn",children:e("bootRequestedNotInstalled")}):null,C!==null&&!C.ok?(0,f.jsxs)("div",{className:"hh-section-body",children:[(0,f.jsx)(Ge,{title:e("bootAttemptFailed",{action:w(C.action)}),detail:C.detail.length>0?C.detail:e("bootAttemptNoDetail")}),C.commands.length>0?(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(y,{children:e("bootAttemptCommands")}),(0,f.jsx)(Q,{text:C.commands.join(`
5
- `),copyLabel:e("copy"),copiedLabel:e("copied")})]}):null]}):null,C!==null&&C.ok?(0,f.jsx)(y,{children:e("bootAttemptSucceeded",{action:w(C.action),detail:C.detail})}):null,h.length>0?(0,f.jsxs)(D,{label:e("bootCommandsLabel"),open:r==="detailed",children:[(0,f.jsx)(y,{children:e("bootCommandsExplain")}),(0,f.jsx)(Q,{text:h.join(`
6
- `),copyLabel:e("copy"),copiedLabel:e("copied")})]}):null,(0,f.jsxs)(D,{label:e("details"),open:r==="detailed",children:[(0,f.jsx)(b,{label:e("bootState"),children:e(ne[l.state]??"bootStateUnsupported")}),(0,f.jsx)(b,{label:e("bootBootCapable"),children:l.bootCapable?e("yes"):e("no")}),(0,f.jsx)(b,{label:e("bootPrivileged"),children:l.privileged?e("yes"):e("no")}),(0,f.jsx)(b,{label:e("bootUnitPath"),children:(0,f.jsx)(U,{children:v(l.unitPath)})}),l.detail.length>0?(0,f.jsx)(y,{children:l.detail}):null]})]})}var P=require("react/jsx-runtime");function It(e){return e.defaultEntryId??"dsh"}function ot({t:e,status:t,run:n,busy:a}){let o=t.entries??[],r=t.settings.manageDsh===!0,l=t.boot.platform==="win32",i=It(t),s=h=>{if(h){let u={id:i,autostart:!0};n("entries.apply",()=>k("entries.apply",{intents:[u]}))}else n("entries.remove",()=>k("entries.remove",{id:i}))};return(0,P.jsxs)(_,{icon:(0,P.jsx)(Pe,{}),title:e("entriesTitle"),children:[(0,P.jsx)(ae,{label:e("entriesManage",{id:i}),checked:r,disabled:a!==null,onChange:s}),(0,P.jsx)(y,{children:e("entriesManageNote",{id:i})}),l?(0,P.jsx)(G,{tone:"warn",children:e("entriesManageWinWarning",{id:i})}):null,o.length===0?(0,P.jsx)(y,{children:e("entriesEmpty",{id:i})}):(0,P.jsx)("div",{className:"hh-list",children:o.map(h=>{let u=h.live;return(0,P.jsxs)("div",{className:"hh-item",children:[(0,P.jsxs)("span",{className:"hh-item-main",children:[(0,P.jsx)("span",{className:"hh-item-name",children:h.intent.id}),(0,P.jsx)(E,{tone:h.exists?"ok":"bad",children:h.exists?e("entriesExists"):e("entriesMissing")}),(0,P.jsx)(E,{children:h.managed?e("entriesManaged"):e("entriesUnmanaged")}),h.drift.length>0?(0,P.jsx)(E,{tone:"warn",children:`${e("entriesDrift")} ${Ie(h.drift)}`}):null]}),(0,P.jsx)("span",{className:"hh-item-spacer"}),(0,P.jsx)("span",{className:"hh-item-meta",children:u===null?e("entriesNotRunning"):`${v(u.status)}${u.pid===null?"":` \xB7 pid ${u.pid}`}`})]},h.intent.id)})})]})}var q=require("react");var p=require("react/jsx-runtime");function Lt({value:e,label:t,hint:n,invalidLabel:a,placeholder:o,disabled:r,onChange:l}){let[i,s]=(0,q.useState)(e===null?"":String(e));(0,q.useEffect)(()=>{s(e===null?"":String(e))},[e]);let h=i.trim()===""?null:Number(i),u=h!==null&&(!Number.isInteger(h)||h<1||h>65535),R=()=>{if(u){s(e===null?"":String(e));return}h!==e&&l(h)};return(0,p.jsxs)("div",{className:"hh-field-block",children:[(0,p.jsxs)("div",{className:"hh-field",children:[(0,p.jsx)("label",{className:"hh-field-label",htmlFor:"hh-panel-port",children:t}),(0,p.jsx)("input",{id:"hh-panel-port",className:"hh-input",type:"number",value:i,placeholder:o,disabled:r,onChange:N=>s(N.target.value),onBlur:R,onKeyDown:N=>{N.key==="Enter"&&R()}})]}),(0,p.jsx)(y,{children:u?a:n})]})}function at({t:e,status:t,run:n,updateSettings:a,busy:o,uiStyle:r}){let l=t.panel,i=t.cli,s=i?.prefer??t.settings.cli?.prefer??"pinned",[h,u]=(0,q.useState)(!1),[R,N]=(0,q.useState)(null),$=i?.version??null,K=$!==null&&l.version!==null,W=l.reachable&&K&&$!==l.version,{dependency:A,global:w}=i===void 0?{dependency:null,global:null}:Ue(i),M=i===void 0?[]:[`pnpm add -g home-hosted@${i.expectedRange}`,`npm install -g home-hosted@${i.expectedRange}`],H=C=>{a(S=>({...S,cli:{...S.cli,prefer:C}}))},Y=async()=>{let C=await n("cli.installGlobal",()=>k("cli.installGlobal",{}));if(!C.ok)return;let S=C.value;N(typeof S?.output=="string"?S.output:null)};return(0,p.jsxs)(_,{icon:(0,p.jsx)(Ce,{}),title:e("panelTitle"),children:[i===void 0?null:(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)("div",{className:"hh-choice",role:"radiogroup","aria-label":e("panelCopy"),children:[(0,p.jsx)(ue,{label:e("optionsPreferPinned"),hint:(0,p.jsx)(We,{children:e("optionsRecommended")}),meta:A===null?void 0:v(A.version),path:A?.path??void 0,checked:s==="pinned",disabled:A===null||o==="settings",onChange:()=>H("pinned")}),(0,p.jsx)(ue,{label:e("optionsPreferGlobal"),meta:w===null?void 0:v(w.version),path:w?.path??void 0,checked:s==="global",disabled:w===null||o==="settings",onChange:()=>H("global")})]}),(0,p.jsx)(y,{children:e("panelCopyHint")}),i.source==="config"?(0,p.jsx)(y,{children:e("optionsConfigOverride")}):null,i.source==="path"&&s!=="global"?(0,p.jsx)(y,{children:e("panelCliNotPinned",{range:i.expectedRange})}):null,i.supported?null:(0,p.jsx)(G,{tone:"warn",children:e("panelCliUnsupported")}),i.launcherPath!=null&&i.launcherVersion==null?(0,p.jsx)(G,{tone:"warn",children:e("panelCliLauncherFailed")}):null]}),(0,p.jsx)(Lt,{value:t.settings.panel?.port??null,label:e("panelPort"),hint:l.reachable?e("panelPortHint"):e("panelPortFree"),invalidLabel:e("panelPortInvalid"),placeholder:l.configPort==null?void 0:String(l.configPort),disabled:l.reachable||o!==null,onChange:C=>a(S=>({...S,panel:{...S.panel,port:C}}))}),(0,p.jsxs)("div",{className:"hh-btn-row",children:[l.reachable?null:(0,p.jsx)(T,{variant:"primary",busy:o==="panel.start",onClick:()=>{n("panel.start",()=>k("panel.start",{}))},children:e("panelStart")}),W&&!h?(0,p.jsx)(T,{variant:"primary",onClick:()=>u(!0),children:e("panelReplace",{copy:e(s==="global"?"panelCopyGlobal":"panelCopyPinned")})}):null]}),W&&h?(0,p.jsx)("div",{className:"hh-note",role:"alertdialog","aria-label":e("panelTakeoverTitle"),children:(0,p.jsxs)("div",{className:"hh-note-body",children:[(0,p.jsx)("strong",{children:e("panelTakeoverTitle")}),(0,p.jsx)("p",{children:e("panelTakeoverBody",{id:t.defaultEntryId??"dsh"})}),(0,p.jsxs)("div",{className:"hh-note-actions",children:[(0,p.jsx)(T,{onClick:()=>u(!1),children:e("confirmCancel")}),(0,p.jsx)(T,{variant:"danger",busy:o==="panel.takeover",onClick:()=>{u(!1),n("panel.takeover",()=>k("panel.takeover",{}))},children:e("confirmReplace")})]})]})}):null,i!==void 0&&w===null?(0,p.jsxs)(D,{label:e("optionsInstallLabel"),open:r==="detailed",children:[(0,p.jsx)(y,{children:e("optionsInstallHint")}),(0,p.jsx)(Q,{text:M.join(`
7
- `),copyLabel:e("copy"),copiedLabel:e("copied")}),(0,p.jsx)("div",{className:"hh-btn-row",children:(0,p.jsx)(T,{busy:o==="cli.installGlobal",onClick:()=>{Y()},children:e("optionsInstall")})}),R===null?null:(0,p.jsx)("pre",{className:"hh-output",children:R})]}):null,(0,p.jsxs)(D,{label:e("details"),open:r==="detailed",children:[(0,p.jsx)(b,{label:e("panelHome"),children:(0,p.jsx)(U,{children:l.home})}),(0,p.jsx)(b,{label:e("panelUrl"),children:l.url===null?v(l.url):(0,p.jsx)(z,{href:l.url,children:l.url})}),(0,p.jsx)(b,{label:e("panelVersion"),children:v(l.version)}),(0,p.jsx)(b,{label:e("panelPid"),children:v(l.pid)}),(0,p.jsx)(b,{label:e("panelWriteVia"),children:e(Be[l.writeVia]??"writeViaNone")}),(0,p.jsx)(b,{label:e("panelToken"),children:e(Oe[l.token]??"tokenUnknown")}),i===void 0?null:(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(b,{label:e("panelCliSource"),children:`${e(_e[i.source]??"panelCliMissing")} \xB7 ${v(i.version)}`}),(0,p.jsx)(b,{label:e("panelCliPath"),children:(0,p.jsx)(U,{children:v(i.path)})})]}),l.detail.length>0?(0,p.jsx)(y,{children:l.detail}):null]})]})}var Bt=5e3;function ge(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function J(e,t){let n=e[t];return typeof n=="number"&&Number.isFinite(n)?n:null}function rt(e,t){let n=e[t];return typeof n=="string"&&n.length>0?n:null}function it(e){let t=e/1e3;return`${Number.isInteger(t)?t:t.toFixed(1)}s`}function st(e,t,n){if(!ge(e))return L;if(e.enabled!==!0)return n("serversDisabled");let a=rt(e,"mode"),o=ge(e.http)?e.http:null,r;if(a==="http"||a===null&&o!==null){let i=(o===null?null:rt(o,"path"))??"/",s=o===null?null:J(o,"expectStatus"),h=o===null?null:J(o,"expectStatusBelow");r=s!==null?n("serversHealthHttp",{status:s,path:i}):h!==null?n("serversHealthHttpBelow",{status:h,path:i}):n("serversHealthHttpProbe",{path:i})}else t!==null?r=n("serversHealthPort",{port:t}):r=n("serversHealthProbe");let l=J(e,"intervalMs");return l!==null&&l!==Bt?`${r} \xB7 ${n("serversHealthEvery",{seconds:it(l)})}`:r}function lt(e,t){if(!ge(e))return L;if(e.enabled===!1)return t("serversDisabled");let n=J(e,"maxRetries"),a=J(e,"baseDelayMs"),o=J(e,"factor");return n===null||a===null||o===null?t("serversEnabled"):t("serversRestartSummary",{retries:n,base:it(a),factor:o})}var Ot={"not-installed":"idle","installed-disabled":"warn","enabled-running":"ok","enabled-failing":"bad",unsupported:"idle"};function _t(...e){return e.filter(t=>t!==null&&t.length>0).join(" \xB7 ")}function Ut(e,t){let{panel:n}=e;return n.reachable?{key:"panel",tone:"ok",name:t("sigPanel"),state:t("stateAnswering"),meta:v(n.version),href:n.url}:{key:"panel",tone:e.lastError===null?"idle":"bad",name:t("sigPanel"),state:t("stateNotAnswering"),meta:n.home,href:null}}function Dt(e,t){let{boot:n}=e,o=e.settings.autostart.enabled&&n.state==="not-installed"?"warn":Ot[n.state]??"idle",r=n.mechanism??(e.settings.autostart.mechanism==="auto"?null:e.settings.autostart.mechanism);return{key:"autostart",tone:o,name:t("sigAutostart"),state:t(ne[n.state]??"bootStateUnsupported"),meta:r??"",href:null}}function Ft(e,t){let n=e.entries??[],a=t("sigEntry",{id:e.defaultEntryId??"dsh"}),o=e.settings.manageDsh===!0,r=n.filter(h=>!h.exists).length,l=n.filter(h=>h.drift.length>0).length,i=n.find(h=>h.live!==null)?.live??null;return{key:"entry",tone:o?r>0?"bad":l>0?"warn":i!==null?"ok":"warn":"idle",name:a,state:t(o?"stateManaged":"stateNotManaged"),meta:i===null?t("entriesNotRunning"):_t(v(i.status),i.pid===null?null:`pid ${i.pid}`),href:null}}function ct(e,t){return[Ut(e,t),Dt(e,t),Ft(e,t)]}function dt(e,t){let n=e.filter(a=>a.status==="running").length;return t("serversCount",{running:n,total:e.length})}var d=require("react/jsx-runtime");function ht({t:e,server:t,run:n,busy:a,offline:o}){let r=t.status==="running";return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(T,{variant:"ghost",disabled:o||r,busy:a===`servers.start:${t.id}`,onClick:()=>{n(`servers.start:${t.id}`,()=>k("servers.start",{id:t.id}))},children:e("serversStart")}),(0,d.jsx)(T,{variant:"ghost",disabled:o||!r,busy:a===`servers.stop:${t.id}`,onClick:()=>{n(`servers.stop:${t.id}`,()=>k("servers.stop",{id:t.id}))},children:e("serversStop")}),(0,d.jsx)(T,{variant:"ghost",disabled:o||!r,busy:a===`servers.restart:${t.id}`,onClick:()=>{n(`servers.restart:${t.id}`,()=>k("servers.restart",{id:t.id}))},children:e("serversRestart")})]})}function Vt({text:e}){return e.length===0?(0,d.jsx)(d.Fragment,{children:L}):(0,d.jsx)("span",{className:"hh-nowrap",title:e,children:(0,d.jsx)(U,{children:e})})}function pt({t:e,status:t,run:n,busy:a,uiStyle:o}){let r=t.servers??[],l=!t.panel.reachable||a!==null,i=new Map((t.entries??[]).map(s=>[s.intent.id,s.intent]));return(0,d.jsxs)(_,{icon:(0,d.jsx)(Ee,{}),title:e("serversTitle"),action:(0,d.jsx)(E,{children:dt(r,e)}),children:[(0,d.jsx)(y,{children:t.panel.url===null?e("serversHintNoPanel"):(0,d.jsxs)(d.Fragment,{children:[`${e("serversHintPanel")} `,(0,d.jsx)(z,{href:t.panel.url,children:t.panel.url})]})}),r.length===0?(0,d.jsx)(y,{children:e("serversEmpty")}):(0,d.jsx)("div",{className:o==="detailed"?"hh-cards":"hh-list",children:r.map(s=>{let h=s.status==="running",u=s.config;if(o==="detailed"){let R=(u.args??[]).join(" "),N=u.cwd??"",$=i.get(s.id)?.persistent;return(0,d.jsxs)("article",{className:"hh-card",children:[(0,d.jsxs)("div",{className:"hh-card-head",children:[(0,d.jsx)("span",{className:"hh-item-name",children:s.id}),(0,d.jsx)(E,{tone:h?"ok":"idle",children:v(s.status)}),$===!0?(0,d.jsx)("span",{title:e("serversPersistentHint"),children:(0,d.jsx)(E,{tone:"accent",children:e("serversPersistent")})}):null,(0,d.jsx)("span",{className:"hh-item-spacer"}),(0,d.jsx)("span",{className:"hh-item-actions",children:(0,d.jsx)(ht,{t:e,server:s,run:n,busy:a,offline:l})})]}),(0,d.jsxs)("div",{className:"hh-card-facts",children:[(0,d.jsx)(b,{label:e("serversUrl"),children:s.url===null?v(s.url):(0,d.jsx)(z,{href:s.url,children:s.url})}),(0,d.jsx)(b,{label:e("serversPid"),children:v(s.pid)}),(0,d.jsx)(b,{label:e("serversPort"),children:v(u.port)}),(0,d.jsx)(b,{label:e("serversAutostart"),children:u.autostart===void 0?L:u.autostart?e("yes"):e("no")})]}),(0,d.jsxs)(D,{label:e("serversConfiguration"),children:[(0,d.jsx)(b,{label:e("serversCommand"),children:u.command===void 0||u.command.length===0?L:(0,d.jsx)("span",{className:"hh-nowrap",title:u.command,children:(0,d.jsx)(U,{children:u.command})})}),(0,d.jsx)(b,{label:e("serversArgs"),children:(0,d.jsx)(Vt,{text:R})}),(0,d.jsx)(b,{label:e("serversCwd"),children:N.length===0?L:(0,d.jsx)("span",{className:"hh-nowrap",title:N,children:(0,d.jsx)(U,{children:oe(N)})})}),(0,d.jsx)(b,{label:e("serversOnPortConflict"),children:v(u.onPortConflict)}),(0,d.jsx)(b,{label:e("serversHealth"),children:st(u.health,u.port??null,e)}),(0,d.jsx)(b,{label:e("serversRestartPolicy"),children:lt(u.restart,e)})]}),(0,d.jsx)(D,{label:e("serversRawConfig"),children:(0,d.jsx)("pre",{className:"hh-output",children:JSON.stringify(u,null,2)})})]},s.id)}return(0,d.jsxs)("div",{className:"hh-item",children:[(0,d.jsxs)("span",{className:"hh-item-main",children:[(0,d.jsx)("span",{className:"hh-item-name",children:s.id}),(0,d.jsx)(E,{tone:h?"ok":"idle",children:v(s.status)}),s.url===null?null:(0,d.jsx)(z,{href:s.url,children:s.url})]}),(0,d.jsx)("span",{className:"hh-item-spacer"}),s.pid===null?null:(0,d.jsx)("span",{className:"hh-item-meta",children:`${e("serversPid")} ${s.pid}`}),(0,d.jsx)("span",{className:"hh-item-actions",children:(0,d.jsx)(ht,{t:e,server:s,run:n,busy:a,offline:l})})]},s.id)})})]})}var me=`
3
+ "use strict";var ce=Object.defineProperty;var yt=Object.getOwnPropertyDescriptor;var xt=Object.getOwnPropertyNames;var wt=Object.prototype.hasOwnProperty;var St=(e,t)=>{for(var n in t)ce(e,n,{get:t[n],enumerable:!0})},kt=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of xt(t))!wt.call(e,o)&&o!==n&&ce(e,o,{get:()=>t[o],enumerable:!(a=yt(t,o))||a.enumerable});return e};var Tt=e=>kt(ce({},"__esModule",{value:!0}),e);var Jt={};St(Jt,{apply:()=>qt,inject:()=>Yt});module.exports=Tt(Jt);var ae="homeHosted",de={tab:"Home Hosted",loading:"Loading\u2026",refresh:"Refresh",retry:"Retry",errorTitle:"Error",statusUnavailable:"The panel did not answer.",yes:"Yes",no:"No",copy:"Copy",copied:"Copied",details:"Details",uiStyleLabel:"Page style",uiStyleDetailed:"Detailed",uiStyleCompact:"Compact",sigPanel:"Panel",sigAutostart:"Autostart",sigEntry:"{id} entry",stateAnswering:"answering",stateNotAnswering:"not answering",stateManaged:"managed",stateNotManaged:"not managed",panelTitle:"Panel",panelCopy:"Which copy runs the panel",panelCopyHint:"The pinned copy ships with this plugin; the global one is on PATH.",optionsPreferPinned:"Pinned dependency",optionsPreferGlobal:"Global install",optionsRecommended:"recommended",optionsConfigOverride:"The plugin row sets homeHostedCommand, and that always wins.",optionsInstallLabel:"Install a global copy",optionsInstallHint:"No global install was found. Install the pinned range, then choose it above:",optionsInstall:"Install globally",panelHome:"$HHOSTED_HOME",panelUrl:"URL",panelVersion:"Version",panelPid:"PID",panelWriteVia:"Writes via",panelToken:"API token",panelCliSource:"CLI",panelCliPath:"CLI path",panelCliConfig:"configured command",panelCliDependency:"pinned dependency",panelCliPathSource:"global install (PATH)",panelCliMissing:"not found",panelCliNotPinned:"This host resolved a global home-hosted instead of the pinned copy ({range}).",panelCliUnsupported:"This home-hosted is older than the oldest release the plugin supports.",panelCliLauncherFailed:"The boot launcher did not answer, so a boot entry may fail to start the panel.",panelPort:"Panel port",panelPortHint:"Only changeable while the panel is stopped.",panelPortFree:"Leave empty to use the port in the config.",panelPortInvalid:"Enter a port between 1 and 65535.",panelStart:"Start the panel",panelReplace:"Replace with {copy}",panelCopyPinned:"pinned dependency",panelCopyGlobal:"global install",panelTakeoverTitle:"Replace the running panel?",panelTakeoverBody:"This stops the panel and every server it supervises \u2014 this session included, so the page disconnects. It needs the {id} entry adopted with autostart on.",confirmCancel:"Cancel",confirmReplace:"Replace",writeViaApi:"authenticated API",writeViaFile:"config file",writeViaNone:"unavailable",tokenEnrolled:"enrolled",tokenPresent:"present",tokenAbsent:"absent",tokenStale:"stale",tokenUnknown:"unknown",panelTokenWarningTitle:"The panel API token is missing or refused",panelTokenWarnAbsent:"This plugin has no API token for the panel, so it cannot read or write the panel; regenerate one.",panelTokenWarnPresent:"home-hosted holds an API token this plugin does not have, so the plugin cannot authenticate; regenerate one to replace it.",panelTokenWarnStale:"The panel refused this plugin's API token; regenerate it.",panelTokenWarnUnreachable:"The plugin could not reach the panel to check its API token, so it cannot read or write the panel; the panel may need starting.",panelTokenWarnPanelDown:"The panel is not answering right now, so it may need starting too.",panelTokenRegenerate:"Regenerate token",panelTokenRegenerated:"A fresh API token was enrolled for the panel.",panelTokenRegenerateFailed:"The token was not replaced: {message}",bootTitle:"Autostart",bootEnabled:"Enable autostart",bootUninstall:"Uninstall",bootSwitchMode:"Switch autostart",bootRecheck:"Re-check",bootMechanism:"Mechanism",bootMechanismAuto:"Automatic",bootState:"State",bootStateNotInstalled:"not installed",bootStateInstalledDisabled:"installed, off",bootStateEnabledRunning:"enabled, running",bootStateEnabledFailing:"enabled, failing",bootStateUnsupported:"unsupported",bootBootCapable:"Starts before login",bootPrivileged:"This process can install it",bootUnitPath:"Unit path",bootCommandsLabel:"Install by hand",bootCommandsExplain:"This process cannot elevate. Run these commands to install autostart:",bootRequestedNotInstalled:"Autostart is requested, but no boot entry is installed.",bootActionInstall:"install",bootActionUninstall:"uninstall",bootAttemptFailed:"{action} failed",bootAttemptSucceeded:"{action} succeeded \u2014 {detail}",bootAttemptNoDetail:"The host did not explain the refusal.",bootAttemptCommands:"Run these yourself:",entriesTitle:"Managed entry",entriesManage:"Manage {id}",entriesManageNote:"Hands {id} to home-hosted: boot autostart, panel control, port reclaim.",entriesManageWinWarning:"On Windows, `{id}` is managed via the `kill` onPortConflict policy, so when it is restarted detached by another plugin it may briefly fail to boot while home-hosted reclaims the process and port.",entriesEmpty:"{id} is not managed yet.",entriesExists:"exists",entriesMissing:"missing",entriesManaged:"managed",entriesUnmanaged:"unmanaged",entriesDrift:"drift",entriesNotRunning:"not running",agentTitle:"Agent tools",agentCount:"{enabled} of {total} on",agentMaster:"Let the agent use these tools",agentApproval:"Tools that change something ask for approval first.",agentApprovalBadge:"approval",reclaimAutoLabel:"Regenerate token automatically",reclaimAutoHint:"A tool call that finds a refused token re-enrols one and retries instead of failing.",agentToolStatus:"Status",agentToolServersList:"List servers",agentToolServersLifecycle:"Start, stop, restart",agentToolServersEdit:"Create, update, delete",agentToolAutostartManage:"Manage boot autostart",agentToolUiManage:"Manage Panel UI",agentToolDescStatus:"Read the panel, the CLI copy in use and the managed entry. Nothing changes.",agentToolDescServersList:"List the servers the panel supervises, with status, port and URL.",agentToolDescServersLifecycle:"Start, stop and restart supervised servers.",agentToolDescServersEdit:"Create, update and delete the panel's server entries.",agentToolDescAutostartManage:"Install or remove the boot entry that starts the panel.",agentToolDescUiManage:"Inspect, update, revert or switch the panel's own UI build.",serversTitle:"Servers",serversCount:"{running} of {total} running",serversHintPanel:"Entries are managed in the home-hosted panel:",serversHintNoPanel:"Entries cannot be managed right now: the panel is not running.",serversEmpty:"The panel reports no servers.",serversPid:"PID",serversUrl:"URL",serversCommand:"Command",serversArgs:"Args",serversCwd:"Working dir",serversPort:"Port",serversOnPortConflict:"On port conflict",serversAutostart:"Autostart",serversPersistent:"Persistent",serversPersistentHint:"Run by home-hosted's own nanny, so stopping or restarting the panel leaves it alive.",serversHealth:"Health",serversRestartPolicy:"Restart",serversConfiguration:"Configuration",serversRawConfig:"Raw config",serversDisabled:"disabled",serversEnabled:"enabled",serversHealthHttp:"HTTP {status} on {path}",serversHealthHttpBelow:"HTTP <{status} on {path}",serversHealthHttpProbe:"HTTP probe on {path}",serversHealthPort:"port {port}",serversHealthProbe:"port probe",serversHealthEvery:"every {seconds}",serversRestartSummary:"{retries} retries \xB7 {base} \u2192 \xD7{factor}",serversStart:"Start",serversStop:"Stop",serversRestart:"Restart"},ve={tab:"Home Hosted",loading:"\u52A0\u8F7D\u4E2D\u2026",refresh:"\u5237\u65B0",retry:"\u91CD\u8BD5",errorTitle:"\u9519\u8BEF",statusUnavailable:"\u9762\u677F\u6CA1\u6709\u54CD\u5E94\u3002",yes:"\u662F",no:"\u5426",copy:"\u590D\u5236",copied:"\u5DF2\u590D\u5236",details:"\u8BE6\u60C5",uiStyleLabel:"\u9875\u9762\u6837\u5F0F",uiStyleDetailed:"\u8BE6\u7EC6",uiStyleCompact:"\u7D27\u51D1",sigPanel:"\u9762\u677F",sigAutostart:"\u5F00\u673A\u81EA\u542F",sigEntry:"{id} \u6761\u76EE",stateAnswering:"\u54CD\u5E94\u4E2D",stateNotAnswering:"\u672A\u54CD\u5E94",stateManaged:"\u5DF2\u63A5\u7BA1",stateNotManaged:"\u672A\u63A5\u7BA1",panelTitle:"\u9762\u677F",panelCopy:"\u7531\u54EA\u4E2A\u526F\u672C\u8FD0\u884C\u9762\u677F",panelCopyHint:"\u56FA\u5B9A\u526F\u672C\u968F\u63D2\u4EF6\u4E00\u8D77\u5B89\u88C5\uFF1B\u5168\u5C40\u526F\u672C\u6765\u81EA PATH\u3002",optionsPreferPinned:"\u56FA\u5B9A\u4F9D\u8D56",optionsPreferGlobal:"\u5168\u5C40\u5B89\u88C5",optionsRecommended:"\u63A8\u8350",optionsConfigOverride:"\u63D2\u4EF6\u884C\u4E2D\u7684 homeHostedCommand \u4F18\u5148\u7EA7\u6700\u9AD8\uFF0C\u59CB\u7EC8\u751F\u6548\u3002",optionsInstallLabel:"\u5B89\u88C5\u5168\u5C40\u526F\u672C",optionsInstallHint:"\u672A\u627E\u5230\u5168\u5C40\u5B89\u88C5\u3002\u5B89\u88C5\u56FA\u5B9A\u7248\u672C\u8303\u56F4\u540E\uFF0C\u5728\u4E0A\u65B9\u9009\u62E9\u5B83\uFF1A",optionsInstall:"\u5168\u5C40\u5B89\u88C5",panelHome:"$HHOSTED_HOME",panelUrl:"URL",panelVersion:"\u7248\u672C",panelPid:"PID",panelWriteVia:"\u5199\u5165\u65B9\u5F0F",panelToken:"API \u4EE4\u724C",panelCliSource:"CLI",panelCliPath:"CLI \u8DEF\u5F84",panelCliConfig:"\u914D\u7F6E\u7684\u547D\u4EE4",panelCliDependency:"\u56FA\u5B9A\u7684\u4F9D\u8D56\u7248\u672C",panelCliPathSource:"\u5168\u5C40\u5B89\u88C5\uFF08PATH\uFF09",panelCliMissing:"\u672A\u627E\u5230",panelCliNotPinned:"\u6B64\u5BBF\u4E3B\u89E3\u6790\u5230\u7684\u662F\u5168\u5C40 home-hosted\uFF0C\u800C\u4E0D\u662F\u56FA\u5B9A\u526F\u672C\uFF08{range}\uFF09\u3002",panelCliUnsupported:"\u6B64 home-hosted \u65E9\u4E8E\u63D2\u4EF6\u652F\u6301\u7684\u6700\u8001\u7248\u672C\u3002",panelCliLauncherFailed:"\u5F00\u673A\u542F\u52A8\u5668\u6CA1\u6709\u5E94\u7B54\uFF0C\u5F00\u673A\u9879\u53EF\u80FD\u65E0\u6CD5\u542F\u52A8\u9762\u677F\u3002",panelPort:"\u9762\u677F\u7AEF\u53E3",panelPortHint:"\u4EC5\u5728\u9762\u677F\u505C\u6B62\u65F6\u53EF\u4FEE\u6539\u3002",panelPortFree:"\u7559\u7A7A\u5219\u4F7F\u7528\u914D\u7F6E\u6587\u4EF6\u4E2D\u7684\u7AEF\u53E3\u3002",panelPortInvalid:"\u8BF7\u8F93\u5165 1 \u5230 65535 \u4E4B\u95F4\u7684\u7AEF\u53E3\u3002",panelStart:"\u542F\u52A8\u9762\u677F",panelReplace:"\u66FF\u6362\u4E3A{copy}",panelCopyPinned:"\u56FA\u5B9A\u4F9D\u8D56",panelCopyGlobal:"\u5168\u5C40\u5B89\u88C5",panelTakeoverTitle:"\u66FF\u6362\u6B63\u5728\u8FD0\u884C\u7684\u9762\u677F\uFF1F",panelTakeoverBody:"\u8FD9\u4F1A\u505C\u6B62\u9762\u677F\u4EE5\u53CA\u5B83\u76D1\u7BA1\u7684\u6240\u6709\u670D\u52A1\u5668\u2014\u2014\u5305\u62EC\u672C\u4F1A\u8BDD\uFF0C\u56E0\u6B64\u672C\u9875\u9762\u4F1A\u65AD\u5F00\u8FDE\u63A5\u3002\u4EC5\u5F53 {id} \u6761\u76EE\u5DF2\u88AB\u63A5\u7BA1\u4E14\u542F\u7528\u81EA\u542F\u65F6\u624D\u53EF\u7528\u3002",confirmCancel:"\u53D6\u6D88",confirmReplace:"\u66FF\u6362",writeViaApi:"\u5DF2\u8BA4\u8BC1 API",writeViaFile:"\u914D\u7F6E\u6587\u4EF6",writeViaNone:"\u4E0D\u53EF\u7528",tokenEnrolled:"\u5DF2\u767B\u8BB0",tokenPresent:"\u5DF2\u5B58\u5728",tokenAbsent:"\u4E0D\u5B58\u5728",tokenStale:"\u5DF2\u5931\u6548",tokenUnknown:"\u672A\u77E5",panelTokenWarningTitle:"\u9762\u677F API \u4EE4\u724C\u7F3A\u5931\u6216\u5DF2\u88AB\u62D2\u7EDD",panelTokenWarnAbsent:"\u672C\u63D2\u4EF6\u6CA1\u6709\u6B64\u9762\u677F\u7684 API \u4EE4\u724C\uFF0C\u65E0\u6CD5\u8BFB\u53D6\u6216\u5199\u5165\u9762\u677F\uFF1B\u8BF7\u91CD\u65B0\u751F\u6210\u4E00\u4E2A\u3002",panelTokenWarnPresent:"home-hosted \u6301\u6709\u4E00\u4E2A\u672C\u63D2\u4EF6\u6CA1\u6709\u7684 API \u4EE4\u724C\uFF0C\u63D2\u4EF6\u65E0\u6CD5\u901A\u8FC7\u8BA4\u8BC1\uFF1B\u8BF7\u91CD\u65B0\u751F\u6210\u4E00\u4E2A\u4EE5\u66FF\u6362\u5B83\u3002",panelTokenWarnStale:"\u9762\u677F\u62D2\u7EDD\u4E86\u672C\u63D2\u4EF6\u7684 API \u4EE4\u724C\uFF1B\u8BF7\u91CD\u65B0\u751F\u6210\u3002",panelTokenWarnUnreachable:"\u672C\u63D2\u4EF6\u65E0\u6CD5\u8BBF\u95EE\u9762\u677F\u4EE5\u68C0\u67E5\u5176 API \u4EE4\u724C\uFF0C\u56E0\u6B64\u65E0\u6CD5\u8BFB\u53D6\u6216\u5199\u5165\u9762\u677F\uFF1B\u9762\u677F\u53EF\u80FD\u8FD8\u9700\u8981\u5148\u542F\u52A8\u3002",panelTokenWarnPanelDown:"\u9762\u677F\u5F53\u524D\u6CA1\u6709\u54CD\u5E94\uFF0C\u53EF\u80FD\u8FD8\u9700\u8981\u5148\u542F\u52A8\u9762\u677F\u3002",panelTokenRegenerate:"\u91CD\u65B0\u751F\u6210\u4EE4\u724C",panelTokenRegenerated:"\u5DF2\u4E3A\u9762\u677F\u767B\u8BB0\u65B0\u4EE4\u724C\u3002",panelTokenRegenerateFailed:"\u4EE4\u724C\u672A\u66FF\u6362\uFF1A{message}",bootTitle:"\u5F00\u673A\u81EA\u542F",bootEnabled:"\u542F\u7528\u5F00\u673A\u81EA\u542F",bootUninstall:"\u5378\u8F7D",bootSwitchMode:"\u5207\u6362\u81EA\u542F\u673A\u5236",bootRecheck:"\u91CD\u65B0\u68C0\u67E5",bootMechanism:"\u673A\u5236",bootMechanismAuto:"\u81EA\u52A8",bootState:"\u72B6\u6001",bootStateNotInstalled:"\u672A\u5B89\u88C5",bootStateInstalledDisabled:"\u5DF2\u5B89\u88C5\uFF0C\u672A\u542F\u7528",bootStateEnabledRunning:"\u5DF2\u542F\u7528\uFF0C\u8FD0\u884C\u4E2D",bootStateEnabledFailing:"\u5DF2\u542F\u7528\uFF0C\u542F\u52A8\u5931\u8D25",bootStateUnsupported:"\u4E0D\u652F\u6301",bootBootCapable:"\u767B\u5F55\u524D\u542F\u52A8",bootPrivileged:"\u672C\u8FDB\u7A0B\u53EF\u5B89\u88C5",bootUnitPath:"\u5355\u5143\u6587\u4EF6\u8DEF\u5F84",bootCommandsLabel:"\u624B\u52A8\u5B89\u88C5",bootCommandsExplain:"\u672C\u8FDB\u7A0B\u65E0\u6CD5\u63D0\u6743\u3002\u8BF7\u81EA\u884C\u6267\u884C\u4EE5\u4E0B\u547D\u4EE4\u6765\u5B89\u88C5\u81EA\u542F\uFF1A",bootRequestedNotInstalled:"\u5DF2\u8BF7\u6C42\u5F00\u673A\u81EA\u542F\uFF0C\u4F46\u5C1A\u672A\u5B89\u88C5\u4EFB\u4F55\u5F00\u673A\u9879\u3002",bootActionInstall:"\u5B89\u88C5",bootActionUninstall:"\u5378\u8F7D",bootAttemptFailed:"{action}\u5931\u8D25",bootAttemptSucceeded:"{action}\u6210\u529F \u2014 {detail}",bootAttemptNoDetail:"\u5BBF\u4E3B\u6CA1\u6709\u8BF4\u660E\u5931\u8D25\u539F\u56E0\u3002",bootAttemptCommands:"\u4F60\u53EF\u4EE5\u81EA\u884C\u8FD0\u884C\u4EE5\u4E0B\u547D\u4EE4\uFF1A",entriesTitle:"\u53D7\u7BA1\u6761\u76EE",entriesManage:"\u63A5\u7BA1 {id}",entriesManageNote:"\u628A {id} \u4EA4\u7ED9 home-hosted\uFF1A\u5F00\u673A\u81EA\u542F\u3001\u9762\u677F\u63A7\u5236\u3001\u7AEF\u53E3\u56DE\u6536\u3002",entriesManageWinWarning:"\u5728 Windows \u4E0A\uFF0C`{id}` \u901A\u8FC7 `kill` \u7AEF\u53E3\u51B2\u7A81\u7B56\u7565\u7BA1\u7406\uFF1B\u5F53\u5B83\u88AB\u5176\u4ED6\u63D2\u4EF6\u4EE5\u5206\u79BB\u65B9\u5F0F\u91CD\u542F\u65F6\uFF0Chome-hosted \u56DE\u6536\u8FDB\u7A0B\u4E0E\u7AEF\u53E3\u671F\u95F4\u53EF\u80FD\u77ED\u6682\u65E0\u6CD5\u542F\u52A8\u3002",entriesEmpty:"\u5C1A\u672A\u63A5\u7BA1 {id}\u3002",entriesExists:"\u5B58\u5728",entriesMissing:"\u7F3A\u5931",entriesManaged:"\u5DF2\u63A5\u7BA1",entriesUnmanaged:"\u672A\u63A5\u7BA1",entriesDrift:"\u6F02\u79FB",entriesNotRunning:"\u672A\u8FD0\u884C",agentTitle:"Agent \u5DE5\u5177",agentCount:"\u5DF2\u5F00\u542F {enabled}/{total}",agentMaster:"\u5141\u8BB8 Agent \u8C03\u7528\u8FD9\u4E9B\u5DE5\u5177",agentApproval:"\u4F1A\u6539\u53D8\u72B6\u6001\u7684\u5DE5\u5177\u5728\u8FD0\u884C\u524D\u4F1A\u8BF7\u6C42\u6279\u51C6\u3002",agentApprovalBadge:"\u9700\u6279\u51C6",reclaimAutoLabel:"\u88AB\u62D2\u7EDD\u65F6\u81EA\u52A8\u91CD\u65B0\u751F\u6210\u4EE4\u724C",reclaimAutoHint:"\u5DE5\u5177\u8C03\u7528\u9047\u5230\u88AB\u62D2\u7EDD\u7684\u4EE4\u724C\u65F6\u4F1A\u91CD\u65B0\u767B\u8BB0\u5E76\u91CD\u8BD5\uFF0C\u800C\u4E0D\u662F\u76F4\u63A5\u5931\u8D25\u3002",agentToolStatus:"\u67E5\u770B\u72B6\u6001",agentToolServersList:"\u5217\u51FA\u670D\u52A1\u5668",agentToolServersLifecycle:"\u542F\u52A8\u3001\u505C\u6B62\u3001\u91CD\u542F",agentToolServersEdit:"\u521B\u5EFA\u3001\u66F4\u65B0\u3001\u5220\u9664",agentToolAutostartManage:"\u7BA1\u7406\u5F00\u673A\u81EA\u542F",agentToolUiManage:"\u7BA1\u7406\u9762\u677F UI",agentToolDescStatus:"\u8BFB\u53D6\u9762\u677F\u3001\u6B63\u5728\u4F7F\u7528\u7684 CLI \u526F\u672C\u548C\u53D7\u7BA1\u6761\u76EE\u3002\u4E0D\u6539\u53D8\u4EFB\u4F55\u72B6\u6001\u3002",agentToolDescServersList:"\u5217\u51FA\u9762\u677F\u76D1\u7BA1\u7684\u670D\u52A1\u5668\u53CA\u5176\u72B6\u6001\u3001\u7AEF\u53E3\u548C URL\u3002",agentToolDescServersLifecycle:"\u542F\u52A8\u3001\u505C\u6B62\u548C\u91CD\u542F\u53D7\u76D1\u7BA1\u7684\u670D\u52A1\u5668\u3002",agentToolDescServersEdit:"\u521B\u5EFA\u3001\u66F4\u65B0\u548C\u5220\u9664\u9762\u677F\u7684\u670D\u52A1\u5668\u6761\u76EE\u3002",agentToolDescAutostartManage:"\u5B89\u88C5\u6216\u79FB\u9664\u542F\u52A8\u9762\u677F\u7684\u5F00\u673A\u9879\u3002",agentToolDescUiManage:"\u67E5\u770B\u3001\u66F4\u65B0\u3001\u56DE\u9000\u6216\u5207\u6362\u9762\u677F\u81EA\u8EAB\u7684 UI \u6784\u5EFA\u3002",serversTitle:"\u670D\u52A1\u5668",serversCount:"{total} \u4E2A\u4E2D {running} \u4E2A\u8FD0\u884C\u4E2D",serversHintPanel:"\u5728 home-hosted \u9762\u677F\u4E2D\u7BA1\u7406\u6761\u76EE\uFF1A",serversHintNoPanel:"\u5F53\u524D\u65E0\u6CD5\u7BA1\u7406\u6761\u76EE\uFF1A\u9762\u677F\u6CA1\u6709\u8FD0\u884C\u3002",serversEmpty:"\u9762\u677F\u672A\u62A5\u544A\u4EFB\u4F55\u670D\u52A1\u5668\u3002",serversPid:"PID",serversUrl:"URL",serversCommand:"\u547D\u4EE4",serversArgs:"\u53C2\u6570",serversCwd:"\u5DE5\u4F5C\u76EE\u5F55",serversPort:"\u7AEF\u53E3",serversOnPortConflict:"\u7AEF\u53E3\u51B2\u7A81\u65F6",serversAutostart:"\u81EA\u542F",serversPersistent:"\u6301\u4E45\u5316",serversPersistentHint:"\u7531 home-hosted \u81EA\u5E26\u7684 nanny \u6258\u7BA1\uFF0C\u505C\u6B62\u6216\u91CD\u542F\u9762\u677F\u4E0D\u4F1A\u505C\u6B62\u5B83\u3002",serversHealth:"\u5065\u5EB7\u68C0\u67E5",serversRestartPolicy:"\u91CD\u542F",serversConfiguration:"\u914D\u7F6E",serversRawConfig:"\u539F\u59CB\u914D\u7F6E",serversDisabled:"\u5DF2\u505C\u7528",serversEnabled:"\u5DF2\u542F\u7528",serversHealthHttp:"HTTP {status} \u4E8E {path}",serversHealthHttpBelow:"HTTP <{status} \u4E8E {path}",serversHealthHttpProbe:"HTTP \u63A2\u6D4B {path}",serversHealthPort:"\u7AEF\u53E3 {port}",serversHealthProbe:"\u7AEF\u53E3\u63A2\u6D4B",serversHealthEvery:"\u6BCF {seconds}",serversRestartSummary:"{retries} \u6B21\u91CD\u8BD5 \xB7 {base} \u2192 \xD7{factor}",serversStart:"\u542F\u52A8",serversStop:"\u505C\u6B62",serversRestart:"\u91CD\u542F"};function Ct(e,t){return t===void 0?e:e.replace(/\{(\w+)\}/g,(n,a)=>Object.prototype.hasOwnProperty.call(t,a)?String(t[a]):n)}var ye=(e,t)=>Ct(de[e]??e,t);function xe(e){if(e!==void 0)try{let t=e.bind(ae);if(typeof t=="function")return t}catch{}return ye}function we(e,t=ye){return e===void 0?t:(n,a)=>{let o;try{o=e(n,a)}catch{o=void 0}return o===void 0||o.length===0||o===n?t(n,a):o}}var V=require("react");var O=require("react");var Se="/home-hosted";var G=["status","servers_list","servers_lifecycle","servers_edit","autostart_manage","ui_manage"],ke=["servers_lifecycle","servers_edit","autostart_manage","ui_manage"],Pt=2,Qt={version:Pt,autostart:{enabled:!1,mechanism:"auto"},manageDsh:!1,entries:[],agentTools:{enabled:!0,allow:[...G]},panel:{port:null},authNotice:!0,reclaimToken:!0,uiStyle:"detailed",cli:{prefer:"pinned"}};var Nt="/api";function M(e,t,n){return{ok:!1,error:n===void 0?{code:e,message:t}:{code:e,message:t,detail:n}}}function he(e){return typeof e=="object"&&e!==null}function Et(e){return e instanceof Error?e.message:String(e)}function Rt(e){if(!he(e))return M("bad-response","The panel returned a non-object response");if(typeof e.v=="number"&&e.v!==1)return M("version-mismatch",`Response protocol v${e.v} does not match the expected v${1}`);let t=e.result;if(!he(t))return M("bad-response","The panel returned no result");if(t.ok===!0)return"value"in t?{ok:!0,value:t.value}:M("bad-response","A successful response carried no value");if(t.ok===!1){let n=t.error;return he(n)&&typeof n.message=="string"?M(typeof n.code=="string"?n.code:"error",n.message,n.detail):M("error","The panel reported a failure without a message")}return M("bad-response","The panel returned an unrecognised result")}async function w(e,t,n={}){let a=n.fetch??globalThis.fetch;if(typeof a!="function")return M("no-fetch","No fetch implementation is available");let o={v:1,endpoint:e,payload:t},r;try{r=await a(`${Nt}${Se}`,{method:"POST",credentials:"same-origin",headers:{"content-type":"application/json"},body:JSON.stringify(o)})}catch(s){return M("network",Et(s))}if(!r.ok){let s=r.statusText.length>0?` ${r.statusText}`:"";return M("http",`HTTP ${r.status}${s}`)}let i;try{i=await r.json()}catch{return M("bad-json","The panel returned invalid JSON")}return Rt(i)}function Te(e,t={}){return w("settings.update",{patch:e},t)}var At=5e3;function Ce(e=At){let[t,n]=(0,O.useState)(null),[a,o]=(0,O.useState)(null),[r,i]=(0,O.useState)(!0),s=(0,O.useRef)(!0),p=(0,O.useCallback)(async()=>{let c=await w("status",{});s.current&&(c.ok?(n(c.value),o(null)):o(c.error),i(!1))},[]);return(0,O.useEffect)(()=>{s.current=!0,p();let c=setInterval(()=>{p()},e);return()=>{s.current=!1,clearInterval(c)}},[p,e]),{data:t,error:a,loading:r,refresh:p}}var m=require("react/jsx-runtime");function _({size:e=14,children:t}){return(0,m.jsx)("svg",{width:e,height:e,viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:1.4,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",children:t})}function Pe(e){return(0,m.jsxs)(_,{...e,children:[(0,m.jsx)("rect",{x:"2.2",y:"3",width:"11.6",height:"7.6",rx:"1.6"}),(0,m.jsx)("path",{d:"M6.6 13.4h2.8M8 10.6v2.8"})]})}function Ne(e){return(0,m.jsxs)(_,{...e,children:[(0,m.jsx)("path",{d:"M8 2.4v5.2"}),(0,m.jsx)("path",{d:"M11.6 4.4a5 5 0 1 1-7.2 0"})]})}function Ee(e){return(0,m.jsxs)(_,{...e,children:[(0,m.jsx)("rect",{x:"2.2",y:"2.8",width:"11.6",height:"10.4",rx:"1.6"}),(0,m.jsx)("path",{d:"M5.2 6.9l1.8 1.8-1.8 1.8M8.7 10.5h2.2"})]})}function Re(e){return(0,m.jsxs)(_,{...e,children:[(0,m.jsx)("path",{d:"M2.4 5.4h11.2M2.4 10.6h11.2"}),(0,m.jsx)("circle",{cx:"6",cy:"5.4",r:"1.6",fill:"currentColor",stroke:"none"}),(0,m.jsx)("circle",{cx:"10.4",cy:"10.6",r:"1.6",fill:"currentColor",stroke:"none"})]})}function Ae(e){return(0,m.jsxs)(_,{...e,children:[(0,m.jsx)("path",{d:"M8 2.3l5.4 2.9L8 8.1 2.6 5.2z"}),(0,m.jsx)("path",{d:"M2.6 8.6l5.4 2.9 5.4-2.9"}),(0,m.jsx)("path",{d:"M2.6 11.4l5.4 2.9 5.4-2.9"})]})}function He(e){return(0,m.jsxs)(_,{...e,children:[(0,m.jsx)("path",{d:"M13.4 9.4A5.5 5.5 0 1 1 12.2 4.4"}),(0,m.jsx)("path",{d:"M12.8 1.7v2.9h-2.9"})]})}function Ie(e){return(0,m.jsx)(_,{...e,children:(0,m.jsx)("path",{d:"M6.2 3.8L10.4 8l-4.2 4.2"})})}function Me(e){return(0,m.jsxs)(_,{...e,children:[(0,m.jsx)("path",{d:"M6.6 3.4H3.4v9.2h9.2V9.4"}),(0,m.jsx)("path",{d:"M9.4 3.4h3.2v3.2M12.6 3.4L7.8 8.2"})]})}function re(e){return(0,m.jsxs)(_,{...e,children:[(0,m.jsx)("path",{d:"M8 2.6l5.7 10.2H2.3z"}),(0,m.jsx)("path",{d:"M8 6.4v3.1M8 11.5h.01"})]})}function Le(e){return(0,m.jsx)(_,{...e,children:(0,m.jsx)("path",{d:"M3 8.4l3.3 3.3L13 5"})})}var L="\u2014";function x(e){if(e==null)return L;let t=String(e);return t.length>0?t:L}function Be(e){return e.length>0?e.join(", "):L}function ue(e){return ke.includes(e)}var ge={status:"agentToolStatus",servers_list:"agentToolServersList",servers_lifecycle:"agentToolServersLifecycle",servers_edit:"agentToolServersEdit",autostart_manage:"agentToolAutostartManage",ui_manage:"agentToolUiManage"},Oe={status:"agentToolDescStatus",servers_list:"agentToolDescServersList",servers_lifecycle:"agentToolDescServersLifecycle",servers_edit:"agentToolDescServersEdit",autostart_manage:"agentToolDescAutostartManage",ui_manage:"agentToolDescUiManage"},_e={api:"writeViaApi",file:"writeViaFile",none:"writeViaNone"},Ue={enrolled:"tokenEnrolled",present:"tokenPresent",absent:"tokenAbsent",stale:"tokenStale",unknown:"tokenUnknown"},ie={"not-installed":"bootStateNotInstalled","installed-disabled":"bootStateInstalledDisabled","enabled-running":"bootStateEnabledRunning","enabled-failing":"bootStateEnabledFailing",unsupported:"bootStateUnsupported"},De={config:"panelCliConfig",dependency:"panelCliDependency",path:"panelCliPathSource",none:"panelCliMissing"};function se(e,t=52){if(e.length<=t)return e;let n=e.includes("\\")?"\\":"/",a=e.split(/[\\/]/).filter(s=>s.length>0);if(a.length<4)return e;let o=/^[A-Za-z]:$/.test(a[0]??"")?3:2;if(a.length<=o)return e;let i=`${/^[\\/]/.test(e)?n:""}${a.slice(0,o).join(n)}${n}\u2026${n}${a.slice(-2).join(n)}`;return i.length<e.length?i:e}function Fe(e){let t=n=>e.source===n&&e.path!==null?{source:n,path:e.path,version:e.version}:null;return{dependency:e.dependency??t("dependency"),global:e.global??t("path")}}function Ve(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ht(e,t){if(Object.is(e,t))return!0;try{return JSON.stringify(e)===JSON.stringify(t)}catch{return!1}}function $e(e,t){let n={};for(let a of Object.keys(t)){let o=e[a],r=t[a];if(Ve(o)&&Ve(r)){let i=$e(o,r);Object.keys(i).length>0&&(n[a]=i)}else Ht(o,r)||(n[a]=r)}return n}function je(e,t){return $e(e,t)}function ze(e,t,n){let a=new Set(e);return n?a.add(t):a.delete(t),G.filter(o=>a.has(o))}var We=require("react");async function Ge(e){try{if(typeof navigator<"u"&&navigator.clipboard!==void 0)return await navigator.clipboard.writeText(e),!0}catch{}return!1}var l=require("react/jsx-runtime");function It(...e){return e.filter(t=>typeof t=="string"&&t.length>0).join(" ")}function U({icon:e,title:t,action:n,children:a}){return(0,l.jsxs)("section",{className:"hh-section",children:[(0,l.jsxs)("header",{className:"hh-section-head",children:[e===void 0?null:(0,l.jsx)("span",{className:"hh-section-icon",children:e}),(0,l.jsx)("h3",{className:"hh-section-title",children:t}),(0,l.jsx)("span",{className:"hh-section-rule","aria-hidden":"true"}),n===void 0?null:(0,l.jsx)("span",{className:"hh-section-action",children:n})]}),(0,l.jsx)("div",{className:"hh-section-body",children:a})]})}function b({label:e,children:t}){return(0,l.jsxs)("div",{className:"hh-spec",children:[(0,l.jsx)("span",{className:"hh-spec-label",children:e}),(0,l.jsx)("span",{className:"hh-spec-value",children:t})]})}function D({children:e}){return(0,l.jsx)("code",{className:"hh-code",children:e})}function y({children:e}){return typeof e=="string"&&e.length===0?null:(0,l.jsx)("p",{className:"hh-hint",children:e})}function R({tone:e,children:t}){return(0,l.jsx)("span",{className:"hh-chip","data-tone":e??"idle",children:t})}function W({href:e,children:t}){return(0,l.jsxs)("a",{className:"hh-link",href:e,target:"_blank",rel:"noreferrer noopener",children:[t??e,(0,l.jsx)("span",{className:"hh-link-icon","aria-hidden":"true",children:(0,l.jsx)(Me,{size:11})})]})}function F({label:e,open:t=!1,children:n}){return(0,l.jsxs)("details",{className:"hh-details",open:t||void 0,children:[(0,l.jsxs)("summary",{className:"hh-summary",children:[(0,l.jsx)("span",{className:"hh-chevron","aria-hidden":"true",children:(0,l.jsx)(Ie,{size:12})}),e]}),(0,l.jsx)("div",{className:"hh-details-body",children:n})]})}function K({tone:e="bad",icon:t=!0,title:n,children:a}){return(0,l.jsxs)("div",{className:"hh-note","data-tone":e,role:e==="bad"?"alert":"note",children:[t?(0,l.jsx)("span",{className:"hh-note-icon","aria-hidden":"true",children:(0,l.jsx)(re,{size:13})}):null,(0,l.jsxs)("div",{className:"hh-note-body",children:[n===void 0?null:(0,l.jsx)("span",{className:"hh-note-title",children:n}),typeof a=="string"?(0,l.jsx)("p",{children:a}):a]})]})}function Ke({title:e,detail:t}){return(0,l.jsxs)("div",{className:"hh-note",role:"alert",children:[(0,l.jsx)("span",{className:"hh-note-icon","aria-hidden":"true",children:(0,l.jsx)(re,{size:13})}),(0,l.jsxs)("div",{className:"hh-note-body",children:[(0,l.jsx)("strong",{children:e}),t.length>0?(0,l.jsx)("p",{children:t}):null]})]})}function te({error:e,title:t}){return e===null?null:(0,l.jsxs)("div",{className:"hh-note",role:"alert",children:[(0,l.jsx)("span",{className:"hh-note-icon","aria-hidden":"true",children:(0,l.jsx)(re,{size:13})}),(0,l.jsxs)("div",{className:"hh-note-body",children:[(0,l.jsx)("strong",{children:t}),(0,l.jsxs)("p",{children:[(0,l.jsx)("code",{children:e.code})," \u2014 ",e.message]})]})]})}function Mt(){return(0,l.jsx)("span",{className:"hh-spinner","aria-hidden":"true"})}function S({children:e,onClick:t,disabled:n,busy:a,variant:o="default",icon:r,title:i}){let s=n===!0||a===!0;return(0,l.jsxs)("button",{type:"button",className:It("hh-btn",o!=="default"&&`hh-btn-${o}`),onClick:t,disabled:s,title:i,children:[a===!0?(0,l.jsx)(Mt,{}):r,e]})}function ne({label:e,checked:t,disabled:n,onChange:a}){return(0,l.jsxs)("button",{type:"button",role:"switch",className:"hh-switch","aria-checked":t,disabled:n,onClick:()=>a(!t),children:[(0,l.jsx)("span",{className:"hh-switch-track","aria-hidden":"true",children:(0,l.jsx)("span",{className:"hh-switch-knob"})}),(0,l.jsx)("span",{className:"hh-check-label",children:e})]})}function Ye({label:e,checked:t,disabled:n,onChange:a}){return(0,l.jsxs)("label",{className:"hh-check",children:[(0,l.jsx)("input",{type:"checkbox",checked:t,disabled:n,onChange:o=>a(o.target.checked)}),(0,l.jsx)("span",{className:"hh-check-label",children:e})]})}function le({value:e,options:t,disabled:n,label:a,onChange:o}){return(0,l.jsx)("select",{className:"hh-select",value:e,disabled:n,"aria-label":a,onChange:r=>o(r.target.value),children:t.map(r=>(0,l.jsx)("option",{value:r.value,children:r.label},r.value))})}function me({label:e,meta:t,path:n,hint:a,checked:o,disabled:r,onChange:i}){return(0,l.jsxs)("label",{className:"hh-choice-option","data-disabled":r===!0,children:[(0,l.jsx)("input",{type:"radio",checked:o,disabled:r,onChange:()=>i()}),(0,l.jsxs)("span",{className:"hh-choice-label",children:[(0,l.jsx)("span",{children:e}),a]}),t===void 0?null:(0,l.jsx)("span",{className:"hh-choice-meta",children:t}),n===void 0?null:(0,l.jsx)("span",{className:"hh-choice-path",title:n,children:se(n)})]})}function qe({children:e}){return(0,l.jsxs)(R,{tone:"accent",children:[(0,l.jsx)(Le,{size:10}),e]})}function oe({text:e,copyLabel:t,copiedLabel:n}){let[a,o]=(0,We.useState)(!1);return(0,l.jsxs)("div",{className:"hh-code-box",children:[(0,l.jsx)("textarea",{className:"hh-code-text",readOnly:!0,value:e,rows:Math.min(e.split(`
4
+ `).length,4)}),(0,l.jsx)("div",{className:"hh-btn-row",children:(0,l.jsx)(S,{variant:"ghost",onClick:()=>{Ge(e).then(o)},children:a?n:t})})]})}var v=require("react/jsx-runtime");function Je({t:e,status:t,updateSettings:n,busy:a,uiStyle:o}){let r=t.settings.agentTools,i=r.allow??[],s=G.filter(c=>i.includes(c)).length,p=(c,u)=>{n(k=>({...k,agentTools:{...k.agentTools,allow:ze(k.agentTools.allow??[],c,u)}}))};return(0,v.jsxs)(U,{icon:(0,v.jsx)(Re,{}),title:e("agentTitle"),action:(0,v.jsx)(R,{children:e("agentCount",{enabled:s,total:G.length})}),children:[(0,v.jsx)(ne,{label:e("agentMaster"),checked:r.enabled,onChange:c=>n(u=>({...u,agentTools:{...u.agentTools,enabled:c}}))}),(0,v.jsxs)("div",{className:"hh-field-block",children:[(0,v.jsx)(ne,{label:e("reclaimAutoLabel"),checked:t.settings.reclaimToken!==!1,disabled:a==="settings",onChange:c=>n(u=>({...u,reclaimToken:c}))}),(0,v.jsx)(y,{children:e("reclaimAutoHint")})]}),(0,v.jsx)(y,{children:e("agentApproval")}),o==="detailed"?(0,v.jsx)("div",{className:"hh-tool-cards",children:G.map(c=>(0,v.jsxs)("label",{className:"hh-tool-card",children:[(0,v.jsx)("input",{type:"checkbox",checked:i.includes(c),disabled:!r.enabled,onChange:u=>p(c,u.target.checked)}),(0,v.jsxs)("span",{className:"hh-tool-card-body",children:[(0,v.jsxs)("span",{className:"hh-tool-card-head",children:[(0,v.jsx)("span",{className:"hh-tool-card-name",children:e(ge[c])}),ue(c)?(0,v.jsx)(R,{tone:"warn",children:e("agentApprovalBadge")}):null]}),(0,v.jsx)("span",{className:"hh-tool-card-desc",children:e(Oe[c])})]})]},c))}):(0,v.jsx)("div",{className:"hh-tools",children:G.map(c=>(0,v.jsx)(Ye,{label:(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)("span",{className:"hh-check-text",children:e(ge[c])}),ue(c)?(0,v.jsx)(R,{tone:"warn",children:e("agentApprovalBadge")}):null]}),checked:i.includes(c),disabled:!r.enabled,onChange:u=>p(c,u)},c))})]})}var ot=require("react");function Xe(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}function Ze(e){if(typeof e!="object"||e===null)return null;let t=e.result;if(typeof t!="object"||t===null)return null;let{ok:n,detail:a,commands:o}=t;return n!==!1?null:{detail:typeof a=="string"?a:"",commands:Xe(o)}}function Qe(e){return e===void 0?null:{ok:e.ok===!0,action:e.action==="uninstall"?"uninstall":"install",detail:typeof e.detail=="string"?e.detail:"",commands:Xe(e.commands)}}var Lt=["enabled-running","enabled-failing","installed-disabled"];function et(e,t){let n=e.filter(r=>r.available).map(r=>r.mechanism),a=n.filter(r=>r!=="unsupported"),o=["auto",...a.length>0?a:n];return o.includes(t)||o.push(t),o}function tt(e,t){return e!==null&&e!==t}function nt(e,t){return e===null||e.ok?!1:e.action==="install"?Lt.includes(t):t==="not-installed"}var f=require("react/jsx-runtime");function at({t:e,status:t,run:n,updateSettings:a,busy:o,uiStyle:r}){let i=t.boot,s=t.settings.autostart,p=i.candidates??[],c=i.commands??[],[u,k]=(0,ot.useState)(null),P=o==="boot.install"||o==="boot.uninstall",J=et(p,s.mechanism).map(E=>({value:E,label:E==="auto"?e("bootMechanismAuto"):E})),X=tt(i.mechanism,s.mechanism),I=i.mechanism!==null,C=E=>e(E==="install"?"bootActionInstall":"bootActionUninstall"),H=async E=>{let Y=await n(`boot.${E}`,async()=>E==="install"?w("boot.install",s.mechanism==="auto"?{}:{mechanism:s.mechanism}):w("boot.uninstall",{}));if(!Y.ok){k(null);return}let ee=Ze(Y.value);k(ee===null?null:{ok:!1,action:E,detail:ee.detail,commands:ee.commands})},N=Qe(s.lastAttempt),B=nt(N,i.state),A=u??(B?null:N);return(0,f.jsxs)(U,{icon:(0,f.jsx)(Ne,{}),title:e("bootTitle"),action:(0,f.jsx)(le,{value:s.mechanism,options:J,label:e("bootMechanism"),disabled:o==="settings"||P,onChange:E=>a(Y=>({...Y,autostart:{...Y.autostart,mechanism:E}}))}),children:[(0,f.jsxs)("div",{className:"hh-btn-row",children:[(0,f.jsx)(S,{variant:I?"default":"primary",disabled:s.mechanism==="unsupported",busy:o==="boot.install",onClick:()=>{H("install")},children:e(X?"bootSwitchMode":"bootEnabled")}),(0,f.jsx)(S,{disabled:!I,busy:o==="boot.uninstall",onClick:()=>{H("uninstall")},children:e("bootUninstall")}),(0,f.jsx)(S,{variant:"ghost",busy:o==="boot.verify",onClick:()=>{n("boot.verify",()=>w("boot.verify",{}))},children:e("bootRecheck")})]}),s.enabled&&i.state==="not-installed"?(0,f.jsx)(K,{tone:"warn",children:e("bootRequestedNotInstalled")}):null,A!==null&&!A.ok?(0,f.jsxs)("div",{className:"hh-section-body",children:[(0,f.jsx)(Ke,{title:e("bootAttemptFailed",{action:C(A.action)}),detail:A.detail.length>0?A.detail:e("bootAttemptNoDetail")}),A.commands.length>0?(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(y,{children:e("bootAttemptCommands")}),(0,f.jsx)(oe,{text:A.commands.join(`
5
+ `),copyLabel:e("copy"),copiedLabel:e("copied")})]}):null]}):null,A!==null&&A.ok?(0,f.jsx)(y,{children:e("bootAttemptSucceeded",{action:C(A.action),detail:A.detail})}):null,c.length>0?(0,f.jsxs)(F,{label:e("bootCommandsLabel"),open:r==="detailed",children:[(0,f.jsx)(y,{children:e("bootCommandsExplain")}),(0,f.jsx)(oe,{text:c.join(`
6
+ `),copyLabel:e("copy"),copiedLabel:e("copied")})]}):null,(0,f.jsxs)(F,{label:e("details"),open:r==="detailed",children:[(0,f.jsx)(b,{label:e("bootState"),children:e(ie[i.state]??"bootStateUnsupported")}),(0,f.jsx)(b,{label:e("bootBootCapable"),children:i.bootCapable?e("yes"):e("no")}),(0,f.jsx)(b,{label:e("bootPrivileged"),children:i.privileged?e("yes"):e("no")}),(0,f.jsx)(b,{label:e("bootUnitPath"),children:(0,f.jsx)(D,{children:x(i.unitPath)})}),i.detail.length>0?(0,f.jsx)(y,{children:i.detail}):null]})]})}var T=require("react/jsx-runtime");function Bt(e){return e.defaultEntryId??"dsh"}function rt({t:e,status:t,run:n,busy:a}){let o=t.entries??[],r=t.settings.manageDsh===!0,i=t.boot.platform==="win32",s=Bt(t),p=c=>{if(c){let u={id:s,autostart:!0};n("entries.apply",()=>w("entries.apply",{intents:[u]}))}else n("entries.remove",()=>w("entries.remove",{id:s}))};return(0,T.jsxs)(U,{icon:(0,T.jsx)(Ee,{}),title:e("entriesTitle"),children:[(0,T.jsx)(ne,{label:e("entriesManage",{id:s}),checked:r,disabled:a!==null,onChange:p}),(0,T.jsx)(y,{children:e("entriesManageNote",{id:s})}),i?(0,T.jsx)(K,{tone:"warn",children:e("entriesManageWinWarning",{id:s})}):null,o.length===0?(0,T.jsx)(y,{children:e("entriesEmpty",{id:s})}):(0,T.jsx)("div",{className:"hh-list",children:o.map(c=>{let u=c.live;return(0,T.jsxs)("div",{className:"hh-item",children:[(0,T.jsxs)("span",{className:"hh-item-main",children:[(0,T.jsx)("span",{className:"hh-item-name",children:c.intent.id}),(0,T.jsx)(R,{tone:c.exists?"ok":"bad",children:c.exists?e("entriesExists"):e("entriesMissing")}),(0,T.jsx)(R,{children:c.managed?e("entriesManaged"):e("entriesUnmanaged")}),c.drift.length>0?(0,T.jsx)(R,{tone:"warn",children:`${e("entriesDrift")} ${Be(c.drift)}`}):null]}),(0,T.jsx)("span",{className:"hh-item-spacer"}),(0,T.jsx)("span",{className:"hh-item-meta",children:u===null?e("entriesNotRunning"):`${x(u.status)}${u.pid===null?"":` \xB7 pid ${u.pid}`}`})]},c.intent.id)})})]})}var q=require("react");var d=require("react/jsx-runtime"),Ot={absent:"panelTokenWarnAbsent",present:"panelTokenWarnPresent",stale:"panelTokenWarnStale"};function _t(e){if(e.token!=="enrolled")return e.token!=="unknown"?Ot[e.token]:e.url===null?void 0:"panelTokenWarnUnreachable"}function Ut(e,t){if(!e.ok)return t("panelTokenRegenerateFailed",{message:e.error.message});let n=e.value?.panel;return n!==void 0&&n.detail.length>0?n.detail:t("panelTokenRegenerated")}function Dt({value:e,label:t,hint:n,invalidLabel:a,placeholder:o,disabled:r,onChange:i}){let[s,p]=(0,q.useState)(e===null?"":String(e));(0,q.useEffect)(()=>{p(e===null?"":String(e))},[e]);let c=s.trim()===""?null:Number(s),u=c!==null&&(!Number.isInteger(c)||c<1||c>65535),k=()=>{if(u){p(e===null?"":String(e));return}c!==e&&i(c)};return(0,d.jsxs)("div",{className:"hh-field-block",children:[(0,d.jsxs)("div",{className:"hh-field",children:[(0,d.jsx)("label",{className:"hh-field-label",htmlFor:"hh-panel-port",children:t}),(0,d.jsx)("input",{id:"hh-panel-port",className:"hh-input",type:"number",value:s,placeholder:o,disabled:r,onChange:P=>p(P.target.value),onBlur:k,onKeyDown:P=>{P.key==="Enter"&&k()}})]}),(0,d.jsx)(y,{children:u?a:n})]})}function it({t:e,status:t,run:n,updateSettings:a,busy:o,uiStyle:r}){let i=t.panel,s=t.cli,p=s?.prefer??t.settings.cli?.prefer??"pinned",[c,u]=(0,q.useState)(!1),[k,P]=(0,q.useState)(null),[j,J]=(0,q.useState)(null),X=_t(i),I=s?.version??null,C=I!==null&&i.version!==null,H=i.reachable&&C&&I!==i.version,{dependency:N,global:B}=s===void 0?{dependency:null,global:null}:Fe(s),A=s===void 0?[]:[`pnpm add -g home-hosted@${s.expectedRange}`,`npm install -g home-hosted@${s.expectedRange}`],E=Z=>{a(z=>({...z,cli:{...z.cli,prefer:Z}}))},Y=async()=>{let Z=await n("cli.installGlobal",()=>w("cli.installGlobal",{}));if(!Z.ok)return;let z=Z.value;P(typeof z?.output=="string"?z.output:null)},ee=async()=>{J(Ut(await n("panel.reclaimToken",()=>w("panel.reclaimToken",{})),e))};return(0,d.jsxs)(U,{icon:(0,d.jsx)(Pe,{}),title:e("panelTitle"),children:[X===void 0?null:(0,d.jsxs)(K,{tone:"warn",title:e("panelTokenWarningTitle"),children:[(0,d.jsx)("p",{children:e(X)}),i.reachable||i.token==="unknown"?null:(0,d.jsx)("p",{children:e("panelTokenWarnPanelDown")}),(0,d.jsx)("div",{className:"hh-note-actions",children:(0,d.jsx)(S,{variant:"primary",busy:o==="panel.reclaimToken",onClick:()=>{ee()},children:e("panelTokenRegenerate")})})]}),j===null?null:(0,d.jsx)(y,{children:j}),s===void 0?null:(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("div",{className:"hh-choice",role:"radiogroup","aria-label":e("panelCopy"),children:[(0,d.jsx)(me,{label:e("optionsPreferPinned"),hint:(0,d.jsx)(qe,{children:e("optionsRecommended")}),meta:N===null?void 0:x(N.version),path:N?.path??void 0,checked:p==="pinned",disabled:N===null||o==="settings",onChange:()=>E("pinned")}),(0,d.jsx)(me,{label:e("optionsPreferGlobal"),meta:B===null?void 0:x(B.version),path:B?.path??void 0,checked:p==="global",disabled:B===null||o==="settings",onChange:()=>E("global")})]}),(0,d.jsx)(y,{children:e("panelCopyHint")}),s.source==="config"?(0,d.jsx)(y,{children:e("optionsConfigOverride")}):null,s.source==="path"&&p!=="global"?(0,d.jsx)(y,{children:e("panelCliNotPinned",{range:s.expectedRange})}):null,s.supported?null:(0,d.jsx)(K,{tone:"warn",children:e("panelCliUnsupported")}),s.launcherPath!=null&&s.launcherVersion==null?(0,d.jsx)(K,{tone:"warn",children:e("panelCliLauncherFailed")}):null]}),(0,d.jsx)(Dt,{value:t.settings.panel?.port??null,label:e("panelPort"),hint:i.reachable?e("panelPortHint"):e("panelPortFree"),invalidLabel:e("panelPortInvalid"),placeholder:i.configPort==null?void 0:String(i.configPort),disabled:i.reachable||o!==null,onChange:Z=>a(z=>({...z,panel:{...z.panel,port:Z}}))}),(0,d.jsxs)("div",{className:"hh-btn-row",children:[i.reachable?null:(0,d.jsx)(S,{variant:"primary",busy:o==="panel.start",onClick:()=>{n("panel.start",()=>w("panel.start",{}))},children:e("panelStart")}),H&&!c?(0,d.jsx)(S,{variant:"primary",onClick:()=>u(!0),children:e("panelReplace",{copy:e(p==="global"?"panelCopyGlobal":"panelCopyPinned")})}):null]}),H&&c?(0,d.jsx)("div",{className:"hh-note",role:"alertdialog","aria-label":e("panelTakeoverTitle"),children:(0,d.jsxs)("div",{className:"hh-note-body",children:[(0,d.jsx)("strong",{children:e("panelTakeoverTitle")}),(0,d.jsx)("p",{children:e("panelTakeoverBody",{id:t.defaultEntryId??"dsh"})}),(0,d.jsxs)("div",{className:"hh-note-actions",children:[(0,d.jsx)(S,{onClick:()=>u(!1),children:e("confirmCancel")}),(0,d.jsx)(S,{variant:"danger",busy:o==="panel.takeover",onClick:()=>{u(!1),n("panel.takeover",()=>w("panel.takeover",{}))},children:e("confirmReplace")})]})]})}):null,s!==void 0&&B===null?(0,d.jsxs)(F,{label:e("optionsInstallLabel"),open:r==="detailed",children:[(0,d.jsx)(y,{children:e("optionsInstallHint")}),(0,d.jsx)(oe,{text:A.join(`
7
+ `),copyLabel:e("copy"),copiedLabel:e("copied")}),(0,d.jsx)("div",{className:"hh-btn-row",children:(0,d.jsx)(S,{busy:o==="cli.installGlobal",onClick:()=>{Y()},children:e("optionsInstall")})}),k===null?null:(0,d.jsx)("pre",{className:"hh-output",children:k})]}):null,(0,d.jsxs)(F,{label:e("details"),open:r==="detailed",children:[(0,d.jsx)(b,{label:e("panelHome"),children:(0,d.jsx)(D,{children:i.home})}),(0,d.jsx)(b,{label:e("panelUrl"),children:i.url===null?x(i.url):(0,d.jsx)(W,{href:i.url,children:i.url})}),(0,d.jsx)(b,{label:e("panelVersion"),children:x(i.version)}),(0,d.jsx)(b,{label:e("panelPid"),children:x(i.pid)}),(0,d.jsx)(b,{label:e("panelWriteVia"),children:e(_e[i.writeVia]??"writeViaNone")}),(0,d.jsx)(b,{label:e("panelToken"),children:e(Ue[i.token]??"tokenUnknown")}),s===void 0?null:(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(b,{label:e("panelCliSource"),children:`${e(De[s.source]??"panelCliMissing")} \xB7 ${x(s.version)}`}),(0,d.jsx)(b,{label:e("panelCliPath"),children:(0,d.jsx)(D,{children:x(s.path)})})]}),i.detail.length>0?(0,d.jsx)(y,{children:i.detail}):null]})]})}var Ft=5e3;function fe(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Q(e,t){let n=e[t];return typeof n=="number"&&Number.isFinite(n)?n:null}function st(e,t){let n=e[t];return typeof n=="string"&&n.length>0?n:null}function lt(e){let t=e/1e3;return`${Number.isInteger(t)?t:t.toFixed(1)}s`}function ct(e,t,n){if(!fe(e))return L;if(e.enabled!==!0)return n("serversDisabled");let a=st(e,"mode"),o=fe(e.http)?e.http:null,r;if(a==="http"||a===null&&o!==null){let s=(o===null?null:st(o,"path"))??"/",p=o===null?null:Q(o,"expectStatus"),c=o===null?null:Q(o,"expectStatusBelow");r=p!==null?n("serversHealthHttp",{status:p,path:s}):c!==null?n("serversHealthHttpBelow",{status:c,path:s}):n("serversHealthHttpProbe",{path:s})}else t!==null?r=n("serversHealthPort",{port:t}):r=n("serversHealthProbe");let i=Q(e,"intervalMs");return i!==null&&i!==Ft?`${r} \xB7 ${n("serversHealthEvery",{seconds:lt(i)})}`:r}function dt(e,t){if(!fe(e))return L;if(e.enabled===!1)return t("serversDisabled");let n=Q(e,"maxRetries"),a=Q(e,"baseDelayMs"),o=Q(e,"factor");return n===null||a===null||o===null?t("serversEnabled"):t("serversRestartSummary",{retries:n,base:lt(a),factor:o})}var Vt={"not-installed":"idle","installed-disabled":"warn","enabled-running":"ok","enabled-failing":"bad",unsupported:"idle"};function $t(...e){return e.filter(t=>t!==null&&t.length>0).join(" \xB7 ")}function jt(e,t){let{panel:n}=e;return n.reachable?{key:"panel",tone:"ok",name:t("sigPanel"),state:t("stateAnswering"),meta:x(n.version),href:n.url}:{key:"panel",tone:e.lastError===null?"idle":"bad",name:t("sigPanel"),state:t("stateNotAnswering"),meta:n.home,href:null}}function zt(e,t){let{boot:n}=e,o=e.settings.autostart.enabled&&n.state==="not-installed"?"warn":Vt[n.state]??"idle",r=n.mechanism??(e.settings.autostart.mechanism==="auto"?null:e.settings.autostart.mechanism);return{key:"autostart",tone:o,name:t("sigAutostart"),state:t(ie[n.state]??"bootStateUnsupported"),meta:r??"",href:null}}function Gt(e,t){let n=e.entries??[],a=t("sigEntry",{id:e.defaultEntryId??"dsh"}),o=e.settings.manageDsh===!0,r=n.filter(c=>!c.exists).length,i=n.filter(c=>c.drift.length>0).length,s=n.find(c=>c.live!==null)?.live??null;return{key:"entry",tone:o?r>0?"bad":i>0?"warn":s!==null?"ok":"warn":"idle",name:a,state:t(o?"stateManaged":"stateNotManaged"),meta:s===null?t("entriesNotRunning"):$t(x(s.status),s.pid===null?null:`pid ${s.pid}`),href:null}}function ht(e,t){return[jt(e,t),zt(e,t),Gt(e,t)]}function pt(e,t){let n=e.filter(a=>a.status==="running").length;return t("serversCount",{running:n,total:e.length})}var h=require("react/jsx-runtime");function ut({t:e,server:t,run:n,busy:a,offline:o}){let r=t.status==="running";return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(S,{variant:"ghost",disabled:o||r,busy:a===`servers.start:${t.id}`,onClick:()=>{n(`servers.start:${t.id}`,()=>w("servers.start",{id:t.id}))},children:e("serversStart")}),(0,h.jsx)(S,{variant:"ghost",disabled:o||!r,busy:a===`servers.stop:${t.id}`,onClick:()=>{n(`servers.stop:${t.id}`,()=>w("servers.stop",{id:t.id}))},children:e("serversStop")}),(0,h.jsx)(S,{variant:"ghost",disabled:o||!r,busy:a===`servers.restart:${t.id}`,onClick:()=>{n(`servers.restart:${t.id}`,()=>w("servers.restart",{id:t.id}))},children:e("serversRestart")})]})}function Wt({text:e}){return e.length===0?(0,h.jsx)(h.Fragment,{children:L}):(0,h.jsx)("span",{className:"hh-nowrap",title:e,children:(0,h.jsx)(D,{children:e})})}function gt({t:e,status:t,run:n,busy:a,uiStyle:o}){let r=t.servers??[],i=!t.panel.reachable||a!==null,s=new Map((t.entries??[]).map(p=>[p.intent.id,p.intent]));return(0,h.jsxs)(U,{icon:(0,h.jsx)(Ae,{}),title:e("serversTitle"),action:(0,h.jsx)(R,{children:pt(r,e)}),children:[(0,h.jsx)(y,{children:t.panel.url===null?e("serversHintNoPanel"):(0,h.jsxs)(h.Fragment,{children:[`${e("serversHintPanel")} `,(0,h.jsx)(W,{href:t.panel.url,children:t.panel.url})]})}),r.length===0?(0,h.jsx)(y,{children:e("serversEmpty")}):(0,h.jsx)("div",{className:o==="detailed"?"hh-cards":"hh-list",children:r.map(p=>{let c=p.status==="running",u=p.config;if(o==="detailed"){let k=(u.args??[]).join(" "),P=u.cwd??"",j=s.get(p.id)?.persistent;return(0,h.jsxs)("article",{className:"hh-card",children:[(0,h.jsxs)("div",{className:"hh-card-head",children:[(0,h.jsx)("span",{className:"hh-item-name",children:p.id}),(0,h.jsx)(R,{tone:c?"ok":"idle",children:x(p.status)}),j===!0?(0,h.jsx)("span",{title:e("serversPersistentHint"),children:(0,h.jsx)(R,{tone:"accent",children:e("serversPersistent")})}):null,(0,h.jsx)("span",{className:"hh-item-spacer"}),(0,h.jsx)("span",{className:"hh-item-actions",children:(0,h.jsx)(ut,{t:e,server:p,run:n,busy:a,offline:i})})]}),(0,h.jsxs)("div",{className:"hh-card-facts",children:[(0,h.jsx)(b,{label:e("serversUrl"),children:p.url===null?x(p.url):(0,h.jsx)(W,{href:p.url,children:p.url})}),(0,h.jsx)(b,{label:e("serversPid"),children:x(p.pid)}),(0,h.jsx)(b,{label:e("serversPort"),children:x(u.port)}),(0,h.jsx)(b,{label:e("serversAutostart"),children:u.autostart===void 0?L:u.autostart?e("yes"):e("no")})]}),(0,h.jsxs)(F,{label:e("serversConfiguration"),children:[(0,h.jsx)(b,{label:e("serversCommand"),children:u.command===void 0||u.command.length===0?L:(0,h.jsx)("span",{className:"hh-nowrap",title:u.command,children:(0,h.jsx)(D,{children:u.command})})}),(0,h.jsx)(b,{label:e("serversArgs"),children:(0,h.jsx)(Wt,{text:k})}),(0,h.jsx)(b,{label:e("serversCwd"),children:P.length===0?L:(0,h.jsx)("span",{className:"hh-nowrap",title:P,children:(0,h.jsx)(D,{children:se(P)})})}),(0,h.jsx)(b,{label:e("serversOnPortConflict"),children:x(u.onPortConflict)}),(0,h.jsx)(b,{label:e("serversHealth"),children:ct(u.health,u.port??null,e)}),(0,h.jsx)(b,{label:e("serversRestartPolicy"),children:dt(u.restart,e)})]}),(0,h.jsx)(F,{label:e("serversRawConfig"),children:(0,h.jsx)("pre",{className:"hh-output",children:JSON.stringify(u,null,2)})})]},p.id)}return(0,h.jsxs)("div",{className:"hh-item",children:[(0,h.jsxs)("span",{className:"hh-item-main",children:[(0,h.jsx)("span",{className:"hh-item-name",children:p.id}),(0,h.jsx)(R,{tone:c?"ok":"idle",children:x(p.status)}),p.url===null?null:(0,h.jsx)(W,{href:p.url,children:p.url})]}),(0,h.jsx)("span",{className:"hh-item-spacer"}),p.pid===null?null:(0,h.jsx)("span",{className:"hh-item-meta",children:`${e("serversPid")} ${p.pid}`}),(0,h.jsx)("span",{className:"hh-item-actions",children:(0,h.jsx)(ut,{t:e,server:p,run:n,busy:a,offline:i})})]},p.id)})})]})}var be=`
8
8
  .hh-root {
9
9
  --hh-line: var(--dsw-alias-border-l2, rgba(128, 128, 128, 0.25));
10
10
  --hh-line-soft: var(--dsw-alias-border-l1, rgba(128, 128, 128, 0.15));
@@ -758,6 +758,6 @@ var module = { exports: {} }; var exports = module.exports;
758
758
  .hh-tool-cards { grid-template-columns: minmax(0, 1fr); }
759
759
  .hh-card-facts { grid-template-columns: minmax(0, 1fr); }
760
760
  }
761
- `;var g=require("react/jsx-runtime");function $t({signal:e}){return(0,g.jsxs)("div",{className:"hh-signal","data-tone":e.tone,children:[(0,g.jsx)("span",{className:"hh-signal-dot","aria-hidden":"true"}),(0,g.jsx)("span",{className:"hh-signal-name",children:e.name}),(0,g.jsx)("span",{className:"hh-signal-state",children:e.state}),e.meta.length===0&&e.href===null?null:(0,g.jsxs)("span",{className:"hh-signal-meta",children:[e.meta,e.href===null?null:(0,g.jsxs)(g.Fragment,{children:[e.meta.length===0?null:" \xB7 ",(0,g.jsx)(z,{href:e.href,children:e.href})]})]})]})}function ut(e){let t=ye(e.t),{data:n,error:a,loading:o,refresh:r}=ke(),[l,i]=(0,F.useState)(null),[s,h]=(0,F.useState)(null),u=(0,F.useCallback)((w,M)=>(h(w),i(null),(async()=>{try{let H=await M();return H.ok||i(H.error),H}catch(H){let Y={code:"client",message:H instanceof Error?H.message:String(H)};return i(Y),{ok:!1,error:Y}}finally{h(null),await r()}})()),[r]),R=(0,F.useCallback)(w=>{if(n===null)return;let M=Ve(n.settings,w(n.settings));Object.keys(M).length!==0&&u("settings",()=>Se(M))},[n,u]),N=n?.settings.uiStyle??"detailed",[$,K]=(0,F.useState)(N);(0,F.useEffect)(()=>{K(N)},[N]);let W=w=>{K(w),R(M=>({...M,uiStyle:w}))};if(n===null)return(0,g.jsxs)("div",{className:"hh-root",children:[(0,g.jsx)("style",{children:me}),o?(0,g.jsx)(y,{children:t("loading")}):(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(Z,{error:a??{code:"status",message:t("statusUnavailable")},title:t("errorTitle")}),(0,g.jsx)("div",{className:"hh-btn-row",children:(0,g.jsx)(T,{onClick:()=>{r()},children:t("retry")})})]})]});let A={t,status:n,run:u,updateSettings:R,busy:s,uiStyle:$};return(0,g.jsxs)("div",{className:"hh-root",children:[(0,g.jsx)("style",{children:me}),(0,g.jsxs)("header",{className:"hh-head",children:[(0,g.jsx)("h2",{className:"hh-title",children:t("tab")}),(0,g.jsx)("span",{className:"hh-head-spacer"}),(0,g.jsx)(re,{value:$,label:t("uiStyleLabel"),disabled:s==="settings",options:[{value:"detailed",label:t("uiStyleDetailed")},{value:"compact",label:t("uiStyleCompact")}],onChange:w=>W(w)}),(0,g.jsx)(T,{variant:"ghost",icon:(0,g.jsx)(Re,{size:13}),busy:s==="status.refresh",onClick:()=>{u("status.refresh",()=>k("status",{refresh:!0}))},children:t("refresh")})]}),(0,g.jsx)("div",{className:"hh-signals","data-busy":s!==null,children:ct(n,t).map(w=>(0,g.jsx)($t,{signal:w},w.key))}),n.lastError===null?null:(0,g.jsx)(Z,{error:{code:"panel",message:n.lastError},title:t("errorTitle")}),(0,g.jsx)(Z,{error:a,title:t("errorTitle")}),(0,g.jsx)(Z,{error:l,title:t("errorTitle")}),(0,g.jsx)(at,{...A}),(0,g.jsx)(nt,{...A}),(0,g.jsx)(ot,{...A}),(0,g.jsx)(Ye,{...A}),(0,g.jsx)(pt,{...A})]})}var jt=["slots","locale"],gt="[dsh-home-hosted]";function V(e,t){t===void 0?console.warn(`${gt} ${e}`):console.warn(`${gt} ${e}`,t)}function mt(e,t){try{let n=e.get?.(t);if(n!=null)return n}catch{}try{let n=e[t];if(n!=null)return n}catch{}}function ft(e,t,n){if(typeof e.effect=="function")try{e.effect(t,n);return}catch(a){V(`registering the effect "${n}" failed`,a);return}try{t()}catch(a){V(`the effect "${n}" failed`,a)}}function zt(e){try{let t=mt(e,"locale"),n=ve(t);t===void 0?V("the locale service is unavailable; the page keeps its bundled English copy"):ft(e,()=>{let o=[];try{o.push(t.register(ee,{en:le,zh:fe}))}catch(r){V("registering the dictionaries failed",r)}return()=>{for(let r of o)try{r()}catch(l){V("disposing a dictionary failed",l)}}},"dsh-home-hosted: dictionaries");let a=mt(e,"slots");if(a===void 0){V("the slots service is unavailable; the settings section was not registered");return}ft(e,()=>{try{return a.inject("settings.section",()=>{try{return a.register({name:"settings.section",id:"home-hosted",order:60,label:()=>n("tab"),locale:ee,inject:()=>({t:n})},ut)}catch(o){return V("registering the settings section failed",o),()=>{}}})}catch(o){return V("injecting into settings.section failed",o),()=>{}}},"dsh-home-hosted: settings section")}catch(t){V("client bootstrap failed",t)}}
761
+ `;var g=require("react/jsx-runtime");function Kt({signal:e}){return(0,g.jsxs)("div",{className:"hh-signal","data-tone":e.tone,children:[(0,g.jsx)("span",{className:"hh-signal-dot","aria-hidden":"true"}),(0,g.jsx)("span",{className:"hh-signal-name",children:e.name}),(0,g.jsx)("span",{className:"hh-signal-state",children:e.state}),e.meta.length===0&&e.href===null?null:(0,g.jsxs)("span",{className:"hh-signal-meta",children:[e.meta,e.href===null?null:(0,g.jsxs)(g.Fragment,{children:[e.meta.length===0?null:" \xB7 ",(0,g.jsx)(W,{href:e.href,children:e.href})]})]})]})}function mt(e){let t=we(e.t),{data:n,error:a,loading:o,refresh:r}=Ce(),[i,s]=(0,V.useState)(null),[p,c]=(0,V.useState)(null),u=(0,V.useCallback)((C,H)=>(c(C),s(null),(async()=>{try{let N=await H();return N.ok||s(N.error),N}catch(N){let B={code:"client",message:N instanceof Error?N.message:String(N)};return s(B),{ok:!1,error:B}}finally{c(null),await r()}})()),[r]),k=(0,V.useCallback)(C=>{if(n===null)return;let H=je(n.settings,C(n.settings));Object.keys(H).length!==0&&u("settings",()=>Te(H))},[n,u]),P=n?.settings.uiStyle??"detailed",[j,J]=(0,V.useState)(P);(0,V.useEffect)(()=>{J(P)},[P]);let X=C=>{J(C),k(H=>({...H,uiStyle:C}))};if(n===null)return(0,g.jsxs)("div",{className:"hh-root",children:[(0,g.jsx)("style",{children:be}),o?(0,g.jsx)(y,{children:t("loading")}):(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(te,{error:a??{code:"status",message:t("statusUnavailable")},title:t("errorTitle")}),(0,g.jsx)("div",{className:"hh-btn-row",children:(0,g.jsx)(S,{onClick:()=>{r()},children:t("retry")})})]})]});let I={t,status:n,run:u,updateSettings:k,busy:p,uiStyle:j};return(0,g.jsxs)("div",{className:"hh-root",children:[(0,g.jsx)("style",{children:be}),(0,g.jsxs)("header",{className:"hh-head",children:[(0,g.jsx)("h2",{className:"hh-title",children:t("tab")}),(0,g.jsx)("span",{className:"hh-head-spacer"}),(0,g.jsx)(le,{value:j,label:t("uiStyleLabel"),disabled:p==="settings",options:[{value:"detailed",label:t("uiStyleDetailed")},{value:"compact",label:t("uiStyleCompact")}],onChange:C=>X(C)}),(0,g.jsx)(S,{variant:"ghost",icon:(0,g.jsx)(He,{size:13}),busy:p==="status.refresh",onClick:()=>{u("status.refresh",()=>w("status",{refresh:!0}))},children:t("refresh")})]}),(0,g.jsx)("div",{className:"hh-signals","data-busy":p!==null,children:ht(n,t).map(C=>(0,g.jsx)(Kt,{signal:C},C.key))}),n.lastError===null?null:(0,g.jsx)(te,{error:{code:"panel",message:n.lastError},title:t("errorTitle")}),(0,g.jsx)(te,{error:a,title:t("errorTitle")}),(0,g.jsx)(te,{error:i,title:t("errorTitle")}),(0,g.jsx)(it,{...I}),(0,g.jsx)(at,{...I}),(0,g.jsx)(rt,{...I}),(0,g.jsx)(Je,{...I}),(0,g.jsx)(gt,{...I})]})}var Yt=["slots","locale"],ft="[dsh-home-hosted]";function $(e,t){t===void 0?console.warn(`${ft} ${e}`):console.warn(`${ft} ${e}`,t)}function bt(e,t){try{let n=e.get?.(t);if(n!=null)return n}catch{}try{let n=e[t];if(n!=null)return n}catch{}}function vt(e,t,n){if(typeof e.effect=="function")try{e.effect(t,n);return}catch(a){$(`registering the effect "${n}" failed`,a);return}try{t()}catch(a){$(`the effect "${n}" failed`,a)}}function qt(e){try{let t=bt(e,"locale"),n=xe(t);t===void 0?$("the locale service is unavailable; the page keeps its bundled English copy"):vt(e,()=>{let o=[];try{o.push(t.register(ae,{en:de,zh:ve}))}catch(r){$("registering the dictionaries failed",r)}return()=>{for(let r of o)try{r()}catch(i){$("disposing a dictionary failed",i)}}},"dsh-home-hosted: dictionaries");let a=bt(e,"slots");if(a===void 0){$("the slots service is unavailable; the settings section was not registered");return}vt(e,()=>{try{return a.inject("settings.section",()=>{try{return a.register({name:"settings.section",id:"home-hosted",order:60,label:()=>n("tab"),locale:ae,inject:()=>({t:n})},mt)}catch(o){return $("registering the settings section failed",o),()=>{}}})}catch(o){return $("injecting into settings.section failed",o),()=>{}}},"dsh-home-hosted: settings section")}catch(t){$("client bootstrap failed",t)}}
762
762
 
763
763
  return module.exports; } });