@ahpd/web 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +204 -2
  3. package/dist/app/ahpw.svg +8 -0
  4. package/dist/app/assets/ActionList-Bawu-Lja.css +1 -0
  5. package/dist/app/assets/ActionList-DZ9lLGRe.js +1 -0
  6. package/dist/app/assets/ActivityBarItem-Cyes10aK.css +1 -0
  7. package/dist/app/assets/ActivityBarItem-DVzJQ1uh.js +1 -0
  8. package/dist/app/assets/Alert-CHZkhmDE.js +1 -0
  9. package/dist/app/assets/Alert-D6FTUHBY.css +1 -0
  10. package/dist/app/assets/Audio-C0yEXr8X.js +1 -0
  11. package/dist/app/assets/Audio-DZmBckTU.css +1 -0
  12. package/dist/app/assets/Badge-BDEW5PFb.js +1 -0
  13. package/dist/app/assets/Badge-B_GtDNjv.css +1 -0
  14. package/dist/app/assets/BarChart-29IHwYQG.css +1 -0
  15. package/dist/app/assets/BarChart-BX8Dbz7S.js +1 -0
  16. package/dist/app/assets/BarLayout-CkfGX1E0.js +1 -0
  17. package/dist/app/assets/Button-CRZ1_3KW.css +1 -0
  18. package/dist/app/assets/Button-_R1oktDz.js +1 -0
  19. package/dist/app/assets/ButtonBar-CpWwS0s7.js +1 -0
  20. package/dist/app/assets/ButtonBar-DfHeNg1i.css +1 -0
  21. package/dist/app/assets/Card-BAqJm0ZO.js +1 -0
  22. package/dist/app/assets/Card-BZxOMaUR.css +1 -0
  23. package/dist/app/assets/CheckBox-Br18O83H.css +1 -0
  24. package/dist/app/assets/CheckBox-Dkn59EbO.js +1 -0
  25. package/dist/app/assets/ChoicePicker-BX-KNSVk.css +1 -0
  26. package/dist/app/assets/ChoicePicker-Cg4Cj6B2.js +1 -0
  27. package/dist/app/assets/Column-BQyN2Mnc.js +1 -0
  28. package/dist/app/assets/Column-Df5lN6aE.css +1 -0
  29. package/dist/app/assets/Composer-C54KOyHb.js +2 -0
  30. package/dist/app/assets/ContextMenu-D3PBPRRl.js +1 -0
  31. package/dist/app/assets/DataTable-D5MTEmlc.css +1 -0
  32. package/dist/app/assets/DataTable-DsRcsDHs.js +1 -0
  33. package/dist/app/assets/DateTimeInput-Ccmu6vbY.js +1 -0
  34. package/dist/app/assets/DateTimeInput-x1XGuNl0.css +1 -0
  35. package/dist/app/assets/DetailHeader-D4ulpmi_.css +1 -0
  36. package/dist/app/assets/DetailHeader-DvDOX8aJ.js +1 -0
  37. package/dist/app/assets/DetailList-BeikDUyt.css +1 -0
  38. package/dist/app/assets/DetailList-Yalgw0YM.js +1 -0
  39. package/dist/app/assets/Details-Bgo6JIBm.js +1 -0
  40. package/dist/app/assets/DiffPage-BFnOf1p9.js +1 -0
  41. package/dist/app/assets/Divider-Bp3vn6nH.js +1 -0
  42. package/dist/app/assets/Divider-MNeVl6_n.css +1 -0
  43. package/dist/app/assets/Divisor-D4gUgDSw.css +1 -0
  44. package/dist/app/assets/Divisor-hrrJK3bw.js +1 -0
  45. package/dist/app/assets/Donut-BJmeC9Mu.js +1 -0
  46. package/dist/app/assets/Donut-BwdpL6WL.css +1 -0
  47. package/dist/app/assets/Edit-DuGIlEIV.js +1 -0
  48. package/dist/app/assets/Explorer-BkMOyBlc.js +1 -0
  49. package/dist/app/assets/Explorer-CjLkoKLM.js +1 -0
  50. package/dist/app/assets/Explorer-CwDdWpNn.js +1 -0
  51. package/dist/app/assets/Explorer-DXZ2epSi.js +1 -0
  52. package/dist/app/assets/ExplorerList-Cecr_ZQS.js +1 -0
  53. package/dist/app/assets/Field-CJtqXD7H.js +1 -0
  54. package/dist/app/assets/Field-DpS1bv_y.css +1 -0
  55. package/dist/app/assets/FieldGroup-2u9EmHRU.js +1 -0
  56. package/dist/app/assets/FieldGroup-B_DfbBby.css +1 -0
  57. package/dist/app/assets/FilePage-Bo_9WZiQ.js +1 -0
  58. package/dist/app/assets/Filter-C9Z9GcBH.js +1 -0
  59. package/dist/app/assets/FloatingLayout-8Wke63p3.js +1 -0
  60. package/dist/app/assets/Form-BKda3NBV.css +1 -0
  61. package/dist/app/assets/Form-D7L1aboH.js +1 -0
  62. package/dist/app/assets/FormActions-DK5QnUct.css +1 -0
  63. package/dist/app/assets/FormActions-DTJXRhkf.js +1 -0
  64. package/dist/app/assets/FormSection-BmWfSm92.js +1 -0
  65. package/dist/app/assets/FormSection-DSe5kU1s.css +1 -0
  66. package/dist/app/assets/Grid-BSSvEO5L.css +1 -0
  67. package/dist/app/assets/Grid-BmJ1BSH9.js +1 -0
  68. package/dist/app/assets/Icon-BFMW_Ijn.css +1 -0
  69. package/dist/app/assets/Icon-CIQ7doud.js +1 -0
  70. package/dist/app/assets/Image-dnPnniEL.css +1 -0
  71. package/dist/app/assets/Image-krGhoZYB.js +1 -0
  72. package/dist/app/assets/Info-1oWO89--.js +1 -0
  73. package/dist/app/assets/InlineLayout-Cnpt0vI0.js +1 -0
  74. package/dist/app/assets/LineChart-DnF4pqRu.css +1 -0
  75. package/dist/app/assets/LineChart-DxnWTKNr.js +1 -0
  76. package/dist/app/assets/Link-Bmovln50.css +1 -0
  77. package/dist/app/assets/Link-DbBfZpn0.js +1 -0
  78. package/dist/app/assets/List-BCNZ5z-i.css +1 -0
  79. package/dist/app/assets/List-BqbZ9K9S.js +1 -0
  80. package/dist/app/assets/LocaleToggle-BVab8iNa.css +1 -0
  81. package/dist/app/assets/LocaleToggle-CBvJEvFm.js +1 -0
  82. package/dist/app/assets/LogPage-DXOU5UzZ.js +1 -0
  83. package/dist/app/assets/LoginForm-BJhoxJyJ.css +1 -0
  84. package/dist/app/assets/LoginForm-C7ZmFVLz.js +1 -0
  85. package/dist/app/assets/Markdown-BaxWPZc1.js +4 -0
  86. package/dist/app/assets/Markdown-D4ts0B_q.css +1 -0
  87. package/dist/app/assets/MarkdownPage-8oL61A0c.js +1 -0
  88. package/dist/app/assets/Modal-BPnVnP2R.js +1 -0
  89. package/dist/app/assets/MountTitle-DXPuKAFo.js +1 -0
  90. package/dist/app/assets/New-DHihaOkV.js +3 -0
  91. package/dist/app/assets/Page-BkOqYXfd.js +1 -0
  92. package/dist/app/assets/Page-D7hXrdQj.js +2 -0
  93. package/dist/app/assets/Page-DOVek_br.js +1 -0
  94. package/dist/app/assets/Pagination-CmWBkMlC.js +1 -0
  95. package/dist/app/assets/Palette-CEQLzNFd.js +1 -0
  96. package/dist/app/assets/PortaLock-BME0nNtM.css +1 -0
  97. package/dist/app/assets/PortaLock-CC2pIbs8.js +2 -0
  98. package/dist/app/assets/RailLayout-MV_LU2y0.js +1 -0
  99. package/dist/app/assets/Row-BpA7AC-I.js +1 -0
  100. package/dist/app/assets/Row-DtfZU_4a.css +1 -0
  101. package/dist/app/assets/ScenaProvider-6A3TJumQ.js +1 -0
  102. package/dist/app/assets/SchemaForm-B_SWmx0L.css +1 -0
  103. package/dist/app/assets/SchemaForm-D6mGj6Xh.js +1 -0
  104. package/dist/app/assets/Settings-wnbeCcl1.js +1 -0
  105. package/dist/app/assets/SigillumGate-BVebugTV.js +1 -0
  106. package/dist/app/assets/SingleLayout-BNVy245Q.js +1 -0
  107. package/dist/app/assets/Slider-0-pV25N6.css +1 -0
  108. package/dist/app/assets/Slider-BW21RHZe.js +1 -0
  109. package/dist/app/assets/SpatialLayout-Bm8uhLD2.js +1 -0
  110. package/dist/app/assets/SpatialLayout-DzIS1m9Q.css +1 -0
  111. package/dist/app/assets/Spinner-B-iOhBZq.js +1 -0
  112. package/dist/app/assets/Spinner-B56wMtzv.css +1 -0
  113. package/dist/app/assets/SplitLayout-BuZpjDyP.js +1 -0
  114. package/dist/app/assets/Splitter-M7YGn5I8.js +1 -0
  115. package/dist/app/assets/StackLayout-CbP6W0Er.js +1 -0
  116. package/dist/app/assets/StatusDot-BwqhMthP.js +1 -0
  117. package/dist/app/assets/StatusDot-DzzNqTRg.css +1 -0
  118. package/dist/app/assets/TabLayout-AUuJvVjp.js +1 -0
  119. package/dist/app/assets/TabPanelLayout-BDz30u7O.js +1 -0
  120. package/dist/app/assets/Tabs-BYb2LuJK.css +1 -0
  121. package/dist/app/assets/Tabs-uqIKAux6.js +1 -0
  122. package/dist/app/assets/TerminalPage-BrP-ENHg.css +1 -0
  123. package/dist/app/assets/TerminalPage-DbF4N79y.js +18 -0
  124. package/dist/app/assets/Text-D2KlerVw.css +1 -0
  125. package/dist/app/assets/Text-MPtQvYE-.js +1 -0
  126. package/dist/app/assets/TextField-DnSHrmJM.js +1 -0
  127. package/dist/app/assets/ThemeModeToggle-B0EIvYRF.js +1 -0
  128. package/dist/app/assets/ThemeModeToggle-D_xGqGsG.css +1 -0
  129. package/dist/app/assets/ThemePicker-BxbcsOmU.css +1 -0
  130. package/dist/app/assets/ThemePicker-DHw8lqsi.js +1 -0
  131. package/dist/app/assets/Video-5WNSpY2W.js +1 -0
  132. package/dist/app/assets/Video-Dj-rxrve.css +1 -0
  133. package/dist/app/assets/_field-parts-BuPjFCuf.js +1 -0
  134. package/dist/app/assets/_field-parts-CfQcSJYh.css +1 -0
  135. package/dist/app/assets/_field-parts-DannIEUW.css +1 -0
  136. package/dist/app/assets/_utils-DZVsX11M.js +1 -0
  137. package/dist/app/assets/actions-DTKyI167.js +1 -0
  138. package/dist/app/assets/channel-BScxZDq2.js +1 -0
  139. package/dist/app/assets/colors-BieSUSt7.js +1 -0
  140. package/dist/app/assets/data-BvTv-4oH.js +2 -0
  141. package/dist/app/assets/diff-eyYjrmkY.js +3 -0
  142. package/dist/app/assets/emojis-XibTG-gy.js +1 -0
  143. package/dist/app/assets/index-Cu7ySznN.js +15 -0
  144. package/dist/app/assets/index-DgTMhxdP.css +1 -0
  145. package/dist/app/assets/jsx-runtime-BguD1OXD.js +1 -0
  146. package/dist/app/assets/link-DK7OzQXZ.js +1 -0
  147. package/dist/app/assets/mount-context-DZgEFVFG.js +1 -0
  148. package/dist/app/assets/preload-helper-BaNbYf_w.js +1 -0
  149. package/dist/app/assets/react-CybPckBe.js +1 -0
  150. package/dist/app/assets/sigillum-Bev0l9LS.js +1 -0
  151. package/dist/app/assets/styles-yrzHRgom.js +1 -0
  152. package/dist/app/assets/surface-presentation-CT86pw6J.js +1 -0
  153. package/dist/app/assets/terminal-BSweq0Uj.js +1 -0
  154. package/dist/app/assets/text-DJDdwKmv.js +1 -0
  155. package/dist/app/assets/turn-BoF7W1h6.js +3 -0
  156. package/dist/app/assets/useI18n-BTsfCYkN.js +1 -0
  157. package/dist/app/assets/useStore-BQkzWMs-.js +2 -0
  158. package/dist/app/assets/useStoreLabel-CK2AU1rh.js +1 -0
  159. package/dist/app/assets/words-BMjqrsOT.js +1 -0
  160. package/dist/app/assets/words-CrqnRMW4.js +1 -0
  161. package/dist/app/index.html +50 -0
  162. package/dist/cli/main.js +21 -0
  163. package/dist/cli/main.js.map +1 -0
  164. package/dist/cli/proxy.js +101 -0
  165. package/dist/cli/proxy.js.map +1 -0
  166. package/dist/cli/serve.js +207 -0
  167. package/dist/cli/serve.js.map +1 -0
  168. package/dist/cli/server.js +32 -0
  169. package/dist/cli/server.js.map +1 -0
  170. package/dist/plugin/index.d.ts +6 -0
  171. package/dist/plugin/index.js +12 -0
  172. package/dist/plugin/index.js.map +1 -0
  173. package/dist/plugin/static.d.ts +9 -0
  174. package/dist/plugin/static.js +77 -0
  175. package/dist/plugin/static.js.map +1 -0
  176. package/package.json +85 -4
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Luiz Fernando Softov <lfs@softov.dev>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,205 @@
1
- # Temporary Holding Version
1
+ # @ahpd/web
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ [![CI](https://github.com/softov/ahpw/actions/workflows/ci.yml/badge.svg)](https://github.com/softov/ahpw/actions/workflows/ci.yml)
4
+ [![@ahpd/web](https://img.shields.io/npm/v/%40ahpd%2Fweb?label=%40ahpd%2Fweb)](https://www.npmjs.com/package/@ahpd/web)
5
+ ![license MIT](https://img.shields.io/badge/license-MIT-blue)
6
+ ![node >=22](https://img.shields.io/badge/node-%3E%3D22-5fa04e)
7
+ ![Agent Host Protocol 1.0.0](https://img.shields.io/badge/AHP-1.0.0-0b7285)
8
+
9
+ A web UI for an [Agent Host Protocol](https://microsoft.github.io/agent-host-protocol/) server.
10
+
11
+ Run it inside [ahpd](https://github.com/softov/ahpd) as a plugin, or on its own with `ahpw serve` in front of any AHP server.
12
+
13
+ What you get:
14
+
15
+ - **Sessions**, the list, each chat, new sessions and what they changed.
16
+ - **Composer**, supports `@attachments`, `/skills` and `/commands`.
17
+ - **Automations** for running tasks and scripts automatically based on session events.
18
+ - **Terminals** and a log in a bottom panel.
19
+ - **Host Information**, shows details about the server and its environment.
20
+ - **Agents**, the ones the host offers: their models, customizations and sign-in, and a new session with one.
21
+ - **Settings**, configure the host server and its plugins.
22
+ - **Administration screens** for every ahpd command (ahpd only). They are built from the daemon's `/api/cli-manifest`, so a new command shows up here with no change to this package.
23
+
24
+ <picture>
25
+ <source media="(prefers-color-scheme: light)" srcset="docs/media/shot-01-light.jpeg">
26
+ <img src="docs/media/shot-01-dark.jpeg" alt="ahpw with the session list, a running session, its details and changes, and a terminal in the bottom panel">
27
+ </picture>
28
+
29
+ Two sessions side by side:
30
+
31
+ ![ahpw with two running sessions open side by side](docs/media/shot-02-dark.jpeg)
32
+
33
+ ---
34
+
35
+ ## Run it in ahpd
36
+
37
+ Install the plugin:
38
+
39
+ ```sh
40
+ ahpd plugin install @ahpd/web
41
+ ```
42
+
43
+ That installs it where the daemon looks for plugins and adds it to `plugins` in the configuration file.
44
+ > **Note:** A plugin installed with `npm i -g` is not seen.
45
+
46
+ Turn on the API on the daemon's own port:
47
+
48
+ ```json
49
+ {
50
+ "http": true,
51
+ "plugins": ["@ahpd/web"]
52
+ }
53
+ ```
54
+
55
+ Then open `http://127.0.0.1:9187/plugins/ahpd-web/`.
56
+
57
+ Keep `http.port` unset. On another port the API is on another origin, and the page cannot reach it.
58
+
59
+ ---
60
+
61
+ ## Run it on its own
62
+
63
+ ```sh
64
+ npm i -g @ahpd/web
65
+ # --connect {HOST_URL} --token-file {PATH_TO_TOKEN}
66
+ ahpw serve --connect ws://127.0.0.1:9187 --token-file ~/.config/ahpd/token
67
+ ```
68
+
69
+ Or without installing it:
70
+
71
+ ```sh
72
+ npx @ahpd/web serve --connect ws://127.0.0.1:9187 --token-file ~/.config/ahpd/token
73
+ ```
74
+
75
+ Then open `http://127.0.0.1:5190/`.
76
+
77
+ - **With a token**, the server adds it to the socket. The page asks for nothing, and the browser never sees the token.
78
+ - **Without one**, the page asks for a token, as it does in ahpd.
79
+ - The administration screens need ahpd's `/api`, so they are not here.
80
+
81
+ ### Options
82
+
83
+ | Option | What it does |
84
+ | --- | --- |
85
+ | `--connect URL` | The server's socket: `ws://`, `wss://`, `http://`, `https://` or `HOST:PORT` |
86
+ | `--token SECRET` | The token to add to the socket |
87
+ | `--token-file PATH` | Read the token from a file |
88
+ | `--host ADDR` | Bind here, default `127.0.0.1` |
89
+ | `--port N` | Listen here, default `5190` |
90
+ | `--open` | Open the page in a browser |
91
+
92
+ A `tkn=` in the `--connect` URL counts as the token.
93
+
94
+ ### Config file and environment
95
+
96
+ Every option can go in `~/.config/ahpw/config.json`, without the dashes:
97
+
98
+ ```json
99
+ {
100
+ "connect": "ws://127.0.0.1:9187",
101
+ "tokenFile": "~/.config/ahpd/token"
102
+ }
103
+ ```
104
+
105
+ With no `connect` anywhere, `ahpw serve` reads the environment:
106
+
107
+ 1. `AHPD_URL`, else `AHPD_HOST`, for the server
108
+ 2. the `tkn=` in that URL, else `AHPD_TOKEN`, for the token
109
+
110
+ ```sh
111
+ AHPD_URL="ws://127.0.0.1:9187/?tkn=$(cat ~/.config/ahpd/token)" ahpw serve
112
+ ```
113
+
114
+ A flag beats the file, and the file beats the environment.
115
+
116
+ ### Security
117
+
118
+ - The server binds `127.0.0.1` by default. Anyone who reaches it uses the AHP server with your token, so it warns when `--host` opens it up.
119
+ - It takes a socket only from a page it served, at an IP address or `localhost`.
120
+ - It warns when the token goes in cleartext (`ws://`) to another machine.
121
+
122
+ ---
123
+
124
+ ## Sign-in
125
+
126
+ Without a token from `ahpw serve`, sign in with one the server accepts: the deployment's token, or a person's token.
127
+
128
+ Each ahpd command checks its own grants. A token that may not run one gets ahpd's refusal.
129
+
130
+ The socket carries the token as `?tkn=`, because a browser cannot set a header on a WebSocket.
131
+
132
+ ---
133
+
134
+ ## Develop
135
+
136
+ ahpw speaks the protocol through [`@microsoft/agent-host-protocol`](https://github.com/microsoft/agent-host-protocol), the spec and its TypeScript SDK.
137
+
138
+ ```sh
139
+ pnpm install
140
+ pnpm dev
141
+ ```
142
+
143
+ `pnpm dev` serves on `http://127.0.0.1:5180`. It proxies `/api` and the socket (at `/ahp`) to `AHPD_URL`, default `http://127.0.0.1:9187`. The daemon needs `"http": true`.
144
+
145
+ To try a local build in ahpd:
146
+
147
+ ```sh
148
+ pnpm build
149
+ ahpd run --plugin /path/to/ahpd-web
150
+ ```
151
+
152
+ | Script | What it does |
153
+ | --- | --- |
154
+ | `pnpm dev` | Vite, with `/api` and the socket proxied to a daemon |
155
+ | `pnpm build` | The page into `dist/app`, the plugin into `dist/plugin`, the CLI into `dist/cli` |
156
+ | `pnpm typecheck` | Every TypeScript project |
157
+ | `pnpm test` | The unit tests, for the page, the plugin and the CLI |
158
+
159
+ ---
160
+
161
+ ## Release
162
+
163
+ CI runs on every push to `main`: typecheck, tests, build, and the packed package installed and served once.
164
+
165
+ A `v*` tag releases. It must match `version` in `package.json`:
166
+
167
+ ```sh
168
+ git tag v0.1.0 && git push origin v0.1.0
169
+ ```
170
+
171
+ The release workflow runs the same checks and stages `@ahpd/web` on npm with provenance. Nothing is installable until it is approved on the package's npm page.
172
+
173
+ npm sets a trusted publisher on a package that exists, so the first version is published once by hand with `pnpm build && npm publish --access public`, and the trusted publisher (`softov/ahpw`, `release.yml`) is added after it.
174
+
175
+ ---
176
+
177
+ ## Layout
178
+
179
+ | Path | What it is |
180
+ | --- | --- |
181
+ | `plugin/` | The ahpd plugin: one route serving `dist/app` |
182
+ | `cli/` | `ahpw serve`: the same route on its own server, and the socket proxy |
183
+ | `src/connection/` | The AHP connection, the socket address, the protocol versions offered |
184
+ | `src/sessions/` | The sessions list, a new session, a session's chat and details |
185
+ | `src/agents/` | The agents the server offers |
186
+ | `src/changes/` | What a session changed |
187
+ | `src/files/` | File, Markdown and diff viewers |
188
+ | `src/terminals/` | The server's terminals |
189
+ | `src/log/` | The log page |
190
+ | `src/panel/` | The bottom panel |
191
+ | `src/automations/` | The automations list and an automation's page |
192
+ | `src/commands/` | The command list, the command page, the result view |
193
+ | `src/manifest/` | The manifest's types, commands to forms and requests |
194
+ | `src/host/` | The host's settings |
195
+ | `src/notify/` | Toasts, confirm dialogs, browser notifications |
196
+ | `src/view/` | The palette, layouts and key bindings |
197
+ | `src/explorer/` | The list the sidebar sections share |
198
+ | `src/AhpwMark.tsx` | The logo, on the sign-in page and while loading |
199
+ | `src/token-provider.ts` | Sign-in with a token |
200
+
201
+ ---
202
+
203
+ ## License
204
+
205
+ MIT © Softov
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
2
+ <title>ahpw</title>
3
+ <rect width="64" height="64" rx="14" fill="#1f1f1f"/>
4
+ <rect x="26" y="43" width="12" height="4.4" fill="#356b5e"/>
5
+ <path d="M5.38 18 L14.62 18 L20.88 37.34 L16.38 52 Z" fill="#356b5e"/>
6
+ <path d="M58.62 18 L49.38 18 L43.12 37.34 L47.62 52 Z" fill="#356b5e"/>
7
+ <path d="M29.84 8 L34.16 8 L47.62 52 L38.4 52 L32 31.06 L25.6 52 L16.38 52 Z" fill="#62c9b0"/>
8
+ </svg>
@@ -0,0 +1 @@
1
+ :root{--oo-action-list-min-width:240px;--oo-action-list-max-width:none;--oo-action-list-max-height:360px}.oo-action-list{min-width:var(--oo-action-list-min-width);max-width:var(--oo-action-list-max-width);max-height:var(--oo-action-list-max-height);background:var(--oo-color-surface);border:1px solid var(--oo-color-border);border-radius:var(--oo-radius-md,8px);box-shadow:var(--oo-shadow-lg,0 12px 28px #00000042);color:inherit;font-size:var(--oo-font-size-sm);flex-direction:column;display:flex;position:relative;overflow:hidden}.oo-action-list__pending{z-index:2;font-size:10px;font-family:var(--oo-font-mono);color:var(--oo-color-muted);background:var(--oo-color-surface);border:1px solid var(--oo-color-border);opacity:.9;pointer-events:none;border-radius:999px;padding:1px 6px;animation:1s ease-in-out infinite oo-action-list-pulse;position:absolute;top:4px;right:8px}@keyframes oo-action-list-pulse{0%,to{opacity:.45}50%{opacity:.95}}.oo-action-list__custom-header{padding:var(--oo-spacing-xs) var(--oo-spacing-sm);border-bottom:1px solid var(--oo-color-border);flex:none}.oo-action-list__back{align-items:center;gap:var(--oo-spacing-xs);padding:var(--oo-spacing-xs) var(--oo-spacing-sm);border:none;border-bottom:1px solid var(--oo-color-border);color:var(--oo-color-muted);font:inherit;cursor:pointer;text-align:left;background:0 0;flex:none;display:flex}.oo-action-list__back:hover{background:var(--oo-color-active);color:inherit}.oo-action-list__body{flex:auto;min-height:0;display:flex}.oo-action-list__items{flex:auto;min-width:0;overflow-y:auto}.oo-action-list__detail{min-width:0;padding:var(--oo-spacing-sm);border-left:1px solid var(--oo-color-border);background:var(--oo-color-canvas);flex:0 0 40%;overflow:auto}.oo-action-list__header{padding:var(--oo-spacing-sm);border-bottom:1px solid var(--oo-color-border);background:var(--oo-color-canvas);flex:none}.oo-action-list__group-label{padding:var(--oo-spacing-xs) var(--oo-spacing-sm) 2px;color:var(--oo-color-muted);text-transform:uppercase;letter-spacing:.06em;font-size:10px;font-weight:700}.oo-action-list__divider{background:var(--oo-color-border);height:1px}.oo-action-list__row{align-items:center;gap:var(--oo-spacing-sm);padding:6px var(--oo-spacing-sm);width:100%;color:inherit;text-align:left;cursor:pointer;font:inherit;background:0 0;border:none;display:flex}.oo-action-list__row:hover,.oo-action-list__row[data-selected=true]{color:var(--oo-color-text);background:var(--oo-color-hover)}.oo-action-list__row[data-disabled=true]{cursor:default;opacity:.55}.oo-action-list__row[data-selected=true] .oo-action-list__title{color:var(--oo-color-accent);font-weight:700}.oo-action-list .oo-icon{width:16px;height:16px;color:rgb(var(--oo-color,var(--oo-color-muted)));font-size:14px;display:inline-flex}[data-cmd-group=danger] .oo-icon{--oo-color:var(--oo-color-red)}[data-cmd-group=create] .oo-icon{--oo-color:var(--oo-color-green)}[data-cmd-group=open] .oo-icon{--oo-color:var(--oo-color-blue)}[data-cmd-group=config] .oo-icon{--oo-color:var(--oo-color-violet)}.oo-action-list__title{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;font-weight:500;overflow:hidden}.oo-action-list__description{text-overflow:ellipsis;white-space:nowrap;text-align:right;max-width:50%;color:var(--oo-color-muted);font-size:var(--oo-font-size-xs);flex:none;overflow:hidden}.oo-action-list__text{flex-direction:column;flex:auto;gap:1px;min-width:0;display:flex}.oo-action-list__subtitle{text-overflow:ellipsis;white-space:nowrap;color:var(--oo-color-muted);font-size:var(--oo-font-size-xs);line-height:1.2;overflow:hidden}.oo-action-list__row:hover .oo-action-list__subtitle,.oo-action-list__row[data-selected=true] .oo-action-list__subtitle{color:var(--oo-color-text)}.oo-action-list__shortcut{font-family:var(--oo-font-mono);font-size:var(--oo-font-size-xs);color:var(--oo-color-muted);background:var(--oo-color-canvas);border:1px solid var(--oo-color-border);border-radius:3px;flex:none;padding:0 4px}.oo-action-list__row[data-selected=true] .oo-action-list__shortcut,.oo-action-list__row:hover .oo-action-list__shortcut{background:var(--oo-color-active);color:var(--oo-color-surface)}.oo-action-list__check{color:var(--oo-color-accent);flex:none;font-size:11px}.oo-action-list__empty,.oo-action-list__loading,.oo-action-list__error{padding:var(--oo-spacing-md) var(--oo-spacing-sm);color:var(--oo-color-muted);text-align:center;font-size:var(--oo-font-size-xs)}.oo-action-list__footer{padding:4px var(--oo-spacing-sm);border-top:1px solid var(--oo-color-border);color:var(--oo-color-muted);font-size:10px;font-family:var(--oo-font-mono);-webkit-user-select:none;user-select:none;flex:none}
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{t}from"./react-CybPckBe.js";import{r as n}from"./colors-BieSUSt7.js";import{n as r}from"./ScenaProvider-6A3TJumQ.js";var i=t(),a=e();function o(e,t){return typeof t!=`number`||Number.isNaN(t)?e.length:Math.max(0,Math.min(e.length,Math.floor(t)))}function s(e,t=[`/`,`@`],n){if(!e)return null;let r=o(e,n),i=-1;if(r<e.length&&!/\s/.test(e[r]??``))i=r;else if(r>0&&!/\s/.test(e[r-1]??``))i=r-1;else return null;let a=i;for(;a>0&&!/\s/.test(e[a-1]??``);)--a;let s=i+1;for(;s<e.length&&!/\s/.test(e[s]??``);)s+=1;let c=e.slice(a,s),l=t.find(e=>c.startsWith(e));return l?{token:c,prefix:l,query:c.slice(l.length),start:a,end:s}:null}function c(e,t,n,r=[`/`,`@`]){let i=s(e,r,t);if(!i)return{next:e,caret:o(e,t)};let a=e.slice(0,i.start),c=`${a}${n}${e.slice(i.end)}`;return n===``&&(c=c.replace(/[ \t]+$/g,``)),{next:c,caret:Math.min(a.length+n.length,c.length)}}function l(e,t,n,r=[`/`,`@`]){let i=s(e,r,t);if(i)return{next:`${e.slice(0,i.start)}${n}${e.slice(i.end)}`,caret:i.start+n.length};let a=`${e}${e.length>0&&!/\s$/.test(e)?` `:``}${n}`;return{next:a,caret:a.length}}function u(e,t){if(!t)return e;let n=Array.isArray(t)?t:[t],r=e.toLowerCase();for(let t of n){let n=t.replace(/^[/@]/,``);if(r.startsWith(n.toLowerCase()))return e.slice(n.length).replace(/^[=\s]+/,``)}return e}function d(e,t){if(!t)return!0;let n=Array.isArray(t)?t:[t],r=e.toLowerCase();return n.some(e=>r.startsWith(e.toLowerCase()))}function f(e){if(e)return Array.isArray(e)?e[0]:e}var p=180;function m({spec:e,hostCtx:t,onBack:o,dataContext:s,manageKeys:c=!0,ref:l}){let u=r(),[d,m]=(0,i.useState)(0),[h,g]=(0,i.useState)({kind:`loading`}),[_,v]=(0,i.useState)(!1),y=(0,i.useRef)(h);y.current=h;let b=(0,i.useRef)(null),x=(0,i.useMemo)(()=>({scena:u,store:u.store,surfaces:u.surfaces,commands:u.commands,events:u.events,source:`menu`,dataContext:s}),[u,s]),S=(0,i.useCallback)(e=>e.map(e=>{let t=typeof e.title==`function`?e.title(x):e.title,n=typeof e.description==`function`?e.description(x):e.description,r=e.active?!!e.active(x):void 0,i=e.disabled?!!e.disabled(x):void 0;return{key:`cmd:${e.id}`,title:t,description:n,icon:e.icon,color:e.color,shortcut:f(e.shortcut),keys:f(e.keys),category:e.category,active:r,disabled:i,invoke:t=>{let n=f(e.shortcut);n&&t.replaceActiveToken(n),u.commands.execute(e.id,void 0,{source:`menu`,dataContext:s,host:t})}}}),[u,x,s]),C=(0,i.useCallback)(e=>e.map((e,t)=>{if(`commandId`in e){let n=u.commands.get(e.commandId);if(!n)return{key:`cmd:${e.commandId}:${t}`,title:`[${e.commandId}]`,disabled:!0,invoke:()=>void 0};let r=S([n])[0],i=e.args;return{...r,key:`cmd:${e.commandId}:${t}`,invoke:e=>{u.commands.execute(n.id,i,{source:`menu`,dataContext:s,host:e})}}}return{key:`act:${t}:${e.title}`,title:e.title,description:e.description,icon:e.icon,color:e.color,shortcut:e.shortcut,keys:e.keys,group:e.group,active:e.active,disabled:e.disabled,invoke:e.onSelect}}),[u,S,s]);(0,i.useEffect)(()=>{let n=!1,r=e.extraItems?C(e.extraItems):[];if(e.items)return v(!1),g({kind:`ready`,rows:[...r,...C(e.items)]}),()=>{n=!0};if(e.query){v(!1);let t=e.query.slot,i=e.query.q,a=()=>{let e=u.commands.list({slot:t,q:i,enabled:!0});n||g({kind:`ready`,rows:[...r,...S(e)]})};a();let o=!1;function s(){o||n||(o=!0,requestAnimationFrame(()=>{o=!1,n||a()}))}let c=u.events.on(`scena:registry:changed`,e=>{let t=e.registry;(t===`commands`||t===`components`)&&s()}),l=u.events.on(`scena:store:changed`,()=>{s()});return()=>{n=!0,c.dispose(),l.dispose()}}if(e.provider){let i=e.provider,a=()=>{if(n)return;let e;try{e=i(t)}catch(e){g({kind:`error`,message:e instanceof Error?e.message:String(e)}),v(!1);return}e instanceof Promise?e.then(e=>{n||(g({kind:`ready`,rows:[...r,...C(e)]}),v(!1))}).catch(e=>{n||(g({kind:`error`,message:e instanceof Error?e.message:String(e)}),v(!1))}):(g({kind:`ready`,rows:[...r,...C(e)]}),v(!1))},o=null,s=()=>{n||(v(!0),o&&clearTimeout(o),o=setTimeout(a,p))};y.current.kind===`ready`?s():(g({kind:`loading`}),a());let c=u.events.on(`scena:store:changed`,()=>s());return()=>{n=!0,o&&clearTimeout(o),c.dispose()}}return v(!1),g({kind:`ready`,rows:r}),()=>{n=!0}},[e,t,C,S,u]);let w=(0,i.useMemo)(()=>h.kind===`ready`?h.rows.filter(e=>!e.disabled):[],[h]);(0,i.useEffect)(()=>{m(0)},[w.length]),(0,i.useEffect)(()=>{let e=b.current;if(!e)return;let t=e.querySelector(`[data-selected="true"]`);t&&t.scrollIntoView({block:`nearest`})},[d]);let T=w[d],E=(0,i.useMemo)(()=>{if(h.kind!==`ready`)return[];let t=e.groupOrder??[],n=new Map,r=[];for(let e of h.rows){let t=e.category??e.group??``;n.has(t)||(n.set(t,[]),r.includes(t)||r.push(t)),n.get(t).push(e)}return[...t.filter(e=>n.has(e)),...r.filter(e=>!t.includes(e))].map(e=>({label:e===``?null:e,rows:n.get(e)}))},[h,e.groupOrder]),D=(0,i.useCallback)(e=>{if(w.length===0&&e.key!==`Escape`&&e.key!==`ArrowLeft`)return!1;if(e.key===`ArrowDown`)return e.preventDefault(),m(e=>(e+1)%w.length),!0;if(e.key===`ArrowUp`)return e.preventDefault(),m(e=>(e-1+w.length)%w.length),!0;if(e.key===`Enter`||e.key===`Tab`){e.preventDefault();let n=w[d];return n&&n.invoke(t),!0}return e.key===`Escape`?(e.preventDefault(),t.closeMenu(),!0):e.key===`ArrowLeft`&&o?(e.preventDefault(),o(),!0):!1},[w,d,t,o]);(0,i.useEffect)(()=>{if(!c)return;function e(e){let t={key:e.key,preventDefault:()=>e.preventDefault()};D(t)}return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[D,c]),(0,i.useImperativeHandle)(l,()=>({handleKey:e=>D(e)}),[D]);let O=-1,k=e.rich===!0;function A(e){let r=!e.disabled;r&&(O+=1);let i=r&&O===d,o=O,s=e.color?{"--oo-color":n(e.color)}:void 0;return(0,a.jsxs)(`button`,{className:`oo-action-list__row`,type:`button`,disabled:e.disabled,"data-cmd-group":e.group,"data-cmd-category":e.category,"data-color":e.color,"data-active":e.active?`true`:void 0,"data-disabled":e.disabled?`true`:void 0,"data-selected":i?`true`:void 0,style:s,onMouseEnter:()=>{r&&m(o)},onClick:()=>{r&&e.invoke(t)},children:[(0,a.jsx)(`span`,{className:`oo-icon`,children:e.icon??`·`}),k?(0,a.jsxs)(`span`,{className:`oo-action-list__text`,children:[(0,a.jsx)(`span`,{className:`oo-action-list__title`,children:e.title}),e.description?(0,a.jsx)(`span`,{className:`oo-action-list__subtitle`,children:e.description}):null]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(`span`,{className:`oo-action-list__title`,children:e.title}),e.description?(0,a.jsx)(`span`,{className:`oo-action-list__description`,children:e.description}):null]}),e.active?(0,a.jsx)(`span`,{className:`oo-action-list__check`,children:`✓`}):null,e.shortcut?(0,a.jsx)(`kbd`,{className:`oo-action-list__shortcut`,children:e.shortcut}):null,e.keys?(0,a.jsx)(`kbd`,{className:`oo-action-list__shortcut`,children:e.keys}):null]},e.key)}function j(){return h.kind===`loading`?(0,a.jsx)(`div`,{className:`oo-action-list__loading`,children:`Loading…`}):h.kind===`error`?(0,a.jsx)(`div`,{className:`oo-action-list__error`,children:h.message}):E.length===0||h.rows.length===0?(0,a.jsx)(`div`,{className:`oo-action-list__empty`,children:`No matches`}):(0,a.jsx)(a.Fragment,{children:E.map((e,t)=>(0,a.jsxs)(`div`,{children:[t>0?(0,a.jsx)(`div`,{className:`oo-action-list__divider`}):null,e.label?(0,a.jsx)(`div`,{className:`oo-action-list__group-label`,children:e.label}):null,e.rows.map(A)]},e.label??`__g${t}`))})}let M=e.layout??`list`,N=M===`header-list`&&e.header,P=M===`info-list`&&e.detail;return(0,a.jsxs)(`div`,{className:`oo-action-list`,"data-layout":M,children:[_?(0,a.jsx)(`div`,{className:`oo-action-list__pending`,"aria-hidden":!0,children:`searching…`}):null,o?(0,a.jsxs)(`button`,{type:`button`,className:`oo-action-list__back`,onClick:o,children:[`← `,e.title??`Back`]}):null,e.customHeader?(0,a.jsx)(`div`,{className:`oo-action-list__custom-header`,children:e.customHeader(t)}):null,N?(0,a.jsx)(`div`,{className:`oo-action-list__header`,children:e.header(t)}):null,(0,a.jsxs)(`div`,{className:`oo-action-list__body`,children:[(0,a.jsx)(`div`,{className:`oo-action-list__items`,ref:b,children:j()}),P?(0,a.jsx)(`div`,{className:`oo-action-list__detail`,children:e.detail(t,T)}):null]}),e.footerHints?(0,a.jsxs)(`div`,{className:`oo-action-list__footer`,children:[`↑↓ navigate · ↵ select`,o?` · ← back`:``,` · ⎋ close`]}):null]})}export{l as a,s as i,f as n,u as o,c as r,d as s,m as t};
@@ -0,0 +1 @@
1
+ .oo-activity-item{width:var(--oo-activity-item-size,44px);height:var(--oo-activity-item-size,44px);border:none;background:var(--oo-activitybar-bg,transparent);color:var(--oo-activitybar-fg);font:inherit;font-size:var(--oo-activity-item-icon-size,18px);cursor:pointer;-webkit-user-select:none;user-select:none;border-inline-start:2px solid #0000;border-radius:0;flex:none;justify-content:center;align-items:center;padding:0;line-height:1;display:flex;position:relative}.oo-activity-item:hover{color:var(--oo-activitybar-fg-hover);background:var(--oo-activitybar-bg-hover)}.oo-activity-item:focus-visible{outline:2px solid var(--oo-color-accent);outline-offset:-2px}.oo-activity-item[data-active=true]{color:var(--oo-activitybar-fg-active);background:var(--oo-activitybar-bg-active);border-inline-start-color:var(--oo-color-accent)}.oo-activity-item[data-pos=bottom]{margin-block-start:auto}.oo-activity-item__badge{border-radius:var(--oo-radius-full);text-align:center;font-variant-numeric:tabular-nums;background:var(--oo-color-accent);min-width:15px;color:var(--oo-color-canvas);padding:0 3px;font-size:10px;line-height:15px;position:absolute;inset-block-end:3px;inset-inline-end:3px}.oo-activity-item__badge[data-tone=info]{background:var(--oo-color-info);color:var(--oo-color-inverse)}.oo-activity-item__badge[data-tone=danger]{background:var(--oo-color-danger);color:var(--oo-color-inverse)}.oo-activity-item__badge[data-tone=warning]{background:var(--oo-color-warning);color:var(--oo-color-inverse)}.oo-activity-item__badge[data-tone=success]{background:var(--oo-color-success);color:var(--oo-color-inverse)}.oo-activity-item__badge[data-tone=muted]{background:var(--oo-color-muted);color:var(--oo-color-inverse)}.oo-activity-item__badge--second{box-shadow:0 0 0 2px var(--oo-activitybar-bg,var(--oo-color-canvas));inset-block:3px auto}
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{t}from"./useStore-BQkzWMs-.js";import{n}from"./ScenaProvider-6A3TJumQ.js";var r=e(),i=`$/layout/surfaces/sidebar:left/section`;function a(e){return e!==void 0&&e!==``&&Number(e)!==0}function o(e){return typeof e==`number`&&e>99?`99+`:e}function s({icon:e,label:s,section:c,sectionPath:l=i,pos:u,badge:d,badgeTone:f=`accent`,badgeLabel:p,secondBadge:m,secondBadgeTone:h=`accent`,secondBadgeLabel:g,command:_,args:v,onClick:y,className:b,style:x}){let S=n(),C=t(l),w=c!==void 0&&C===c,T=a(d),E=a(m),D=[...T?[p?`${d} ${p}`:`${d}`]:[],...E?[g?`${m} ${g}`:`${m}`]:[]],O=s??c??``,k=D.length===0?s:`${O}: ${D.join(`, `)}`;function A(){if(y){y();return}_&&S.commands.execute(_,v),c&&S.commands.execute(`sidebar.activate`,{...v,section:c})}return(0,r.jsxs)(`button`,{type:`button`,className:[`oo-activity-item`,b].filter(Boolean).join(` `),style:x,"data-active":w,"data-pos":u,title:k,"aria-label":k,"aria-current":w?`true`:void 0,onClick:A,children:[(0,r.jsx)(`span`,{className:`oo-activity-item__icon`,"aria-hidden":`true`,children:e??`·`}),T?(0,r.jsx)(`span`,{className:`oo-activity-item__badge`,"data-tone":f,"aria-hidden":`true`,children:o(d)}):null,E?(0,r.jsx)(`span`,{className:`oo-activity-item__badge oo-activity-item__badge--second`,"data-tone":h,"aria-hidden":`true`,children:o(m)}):null]})}export{s as ActivityBarItem,s as default};
@@ -0,0 +1 @@
1
+ import{r as e,t}from"./jsx-runtime-BguD1OXD.js";import{r as n}from"./Icon-CIQ7doud.js";var r=t(),i=e({Alert:()=>o}),a={info:`ℹ`,success:`✓`,warning:`⚠`,danger:`✕`};function o({tone:e=`info`,title:t,children:i,message:o,icon:s,onClose:c,style:l,className:u}){let d=i??o;return(0,r.jsxs)(`div`,{className:[`oo-alert`,u].filter(Boolean).join(` `),"data-tone":e,role:`status`,style:l,children:[(0,r.jsx)(`span`,{className:`oo-alert__icon`,"aria-hidden":!0,children:s??a[e]}),(0,r.jsxs)(`div`,{className:`oo-alert__body`,children:[t?(0,r.jsx)(`strong`,{className:`oo-alert__title`,children:t}):null,d?(0,r.jsx)(`span`,{className:`oo-alert__message`,children:d}):null]}),c?(0,r.jsx)(`button`,{type:`button`,className:`oo-alert__close`,onClick:c,"aria-label":`Dismiss`,children:n.closePanel}):null]})}export{i as n,o as t};
@@ -0,0 +1 @@
1
+ .oo-alert{--oo-alert-rgb:var(--oo-rgb-blue);--oo-alert-color:rgb(var(--oo-alert-rgb));--oo-alert-spacing:var(--oo-spacing-sm);--oo-alert-background:rgb(var(--oo-alert-rgb) / .1);--oo-alert-border:rgb(var(--oo-alert-rgb) / .25);align-items:flex-start;gap:var(--oo-alert-spacing);padding:var(--oo-alert-spacing);border-radius:var(--oo-radius-md,8px);font-size:var(--oo-font-size-sm);background:var(--oo-alert-background);color:var(--oo-alert-color);border:1px solid var(--oo-alert-border);line-height:1.5;display:flex}.oo-alert[data-tone=info]{--oo-alert-rgb:var(--oo-rgb-blue)}.oo-alert[data-tone=success]{--oo-alert-rgb:var(--oo-rgb-green)}.oo-alert[data-tone=warning]{--oo-alert-rgb:var(--oo-rgb-amber)}.oo-alert[data-tone=danger]{--oo-alert-rgb:var(--oo-rgb-red)}.oo-alert__icon{flex:none;margin-top:2px}.oo-alert__body{min-width:0;color:inherit;flex-direction:column;flex:auto;gap:2px;display:flex}.oo-alert__title{color:rgb(var(--oo-alert-rgb))}.oo-alert__close{color:inherit;cursor:pointer;font:inherit;opacity:.7;background:0 0;border:none;padding:0 4px;line-height:1}.oo-alert__close:hover{opacity:1}
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";var t=e();function n({url:e,description:n,controls:r=!0,autoPlay:i,loop:a,style:o,src:s}){let c=e??s;return c?(0,t.jsxs)(`div`,{className:`oo-audio-wrapper`,style:o,children:[n?(0,t.jsx)(`div`,{className:`oo-audio__description`,children:n}):null,(0,t.jsx)(`audio`,{className:`oo-audio`,src:c,controls:r,autoPlay:i,loop:a})]}):null}export{n as Audio};
@@ -0,0 +1 @@
1
+ .oo-audio{display:block}
@@ -0,0 +1 @@
1
+ import{r as e,t}from"./jsx-runtime-BguD1OXD.js";import{r as n}from"./colors-BieSUSt7.js";var r=t(),i=e({Badge:()=>a});function a({children:e,text:t,label:i,tone:a,variant:o,color:s,outline:c,style:l,className:u}){let d=s?{"--oo-color":n(s),...l}:l??{};return(0,r.jsx)(`span`,{className:[`oo-badge`,u].filter(Boolean).join(` `),"data-tone":a,"data-variant":a??o,"data-outline":c?`true`:void 0,style:d,children:i??t??e})}export{i as n,a as t};
@@ -0,0 +1 @@
1
+ .oo-badge{--oo-badge-gap:4px;--oo-badge-padding-y:2px;--oo-badge-padding-x:8px;--oo-badge-font-size:var(--oo-font-size-xs);--oo-badge-font-family:var(--oo-mono);--oo-badge-font-weight:500;--oo-badge-line-height:1.4;--oo-badge-rgb:var(--oo-badge-color,var(--oo-rgb-muted));--oo-badge-background:rgb(var(--oo-badge-rgb,var(--oo-rgb-muted)) / .15);--oo-badge-color:rgb(var(--oo-badge-rgb,var(--oo-rgb-muted)));align-items:center;gap:var(--oo-badge-gap);padding:var(--oo-badge-padding-y) var(--oo-badge-padding-x);font-size:var(--oo-badge-font-size);font-family:var(--oo-badge-font-family);font-weight:var(--oo-badge-font-weight);line-height:var(--oo-badge-line-height);background:var(--oo-badge-background);color:var(--oo-badge-color);white-space:nowrap;border-radius:9999px;display:inline-flex}.oo-badge[data-variant=default]{--oo-badge-rgb:var(--oo-rgb-muted)}.oo-badge[data-variant=success]{--oo-badge-rgb:var(--oo-rgb-green)}.oo-badge[data-variant=warning]{--oo-badge-rgb:var(--oo-rgb-amber)}.oo-badge[data-variant=danger]{--oo-badge-rgb:var(--oo-rgb-red)}.oo-badge[data-variant=info]{--oo-badge-rgb:var(--oo-rgb-blue)}.oo-badge[data-outline=true]{border:1px solid rgb(var(--oo-badge-color,var(--oo-rgb-muted)) / .5);background:0 0}
@@ -0,0 +1 @@
1
+ .oo-barchart{flex-direction:column;gap:4px;width:100%;display:flex}.oo-barchart__track{align-items:flex-end;gap:2px;width:100%;display:flex}.oo-barchart__bar{border-radius:2px 2px 0 0;flex:1;min-width:2px}.oo-barchart__bar--stacked{flex-direction:column-reverse;display:flex;overflow:hidden}.oo-barchart__bar--grouped{align-items:flex-end;gap:1px;height:100%;display:flex}.oo-barchart__bar--grouped .oo-barchart__seg{border-radius:2px 2px 0 0;flex:1}.oo-barchart__seg{width:100%}.oo-barchart__labels{gap:2px;display:flex}.oo-barchart__label{font-size:var(--oo-font-size-xs);color:var(--oo-color-muted);text-align:center;text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.oo-barchart--empty{font-size:var(--oo-font-size-xs);color:var(--oo-color-muted);font-style:italic}
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";var t=e(),n=`var(--oo-color-accent)`;function r(e,t){return e.segments&&e.segments.length>0?e.segments:[{value:e.value??0,color:t}]}function i(e){return e.reduce((e,t)=>e+t.value,0)}function a({bars:e,height:a=64,mode:o=`stacked`,showLabels:s,emptyLabel:c,color:l=n,style:u}){if(e??=[],e.length===0)return(0,t.jsx)(`div`,{className:`oo-barchart oo-barchart--empty`,style:u,children:c??`No data`});let d=Math.max(1,...e.map(e=>{let t=r(e,l);return o===`grouped`?Math.max(0,...t.map(e=>e.value)):i(t)}));return(0,t.jsxs)(`div`,{className:`oo-barchart`,style:u,children:[(0,t.jsx)(`div`,{className:`oo-barchart__track`,style:{height:a},children:e.map(e=>{let n=r(e,l),a=i(n),s=e.title??`${e.label??e.key}: ${a}`;return o===`grouped`?(0,t.jsx)(`div`,{className:`oo-barchart__bar oo-barchart__bar--grouped`,title:s,children:n.map((e,n)=>(0,t.jsx)(`div`,{className:`oo-barchart__seg`,title:e.label,style:{height:`${e.value/d*100}%`,background:e.color,opacity:e.value===0?.25:1}},n))},e.key):(0,t.jsx)(`div`,{className:`oo-barchart__bar oo-barchart__bar--stacked`,title:s,style:{height:`${a/d*100}%`,opacity:a===0?.25:1},children:n.map((e,n)=>(0,t.jsx)(`div`,{className:`oo-barchart__seg`,title:e.label,style:{height:a>0?`${e.value/a*100}%`:`0%`,background:e.color}},n))},e.key)})}),s?(0,t.jsx)(`div`,{className:`oo-barchart__labels`,children:e.map(e=>(0,t.jsx)(`div`,{className:`oo-barchart__label`,children:e.label??e.key},e.key))}):null]})}export{a as BarChart};
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";var t=e();function n(e){return e===`left`||e===`center`||e===`right`}function r(e){let t=e.component.slot;return n(t)?t:`center`}function i({mounts:e,renderMount:n}){let i=[],a=[],o=[];for(let t of e)(r(t)===`left`?i:r(t)===`right`?o:a).push(t);return(0,t.jsxs)(`div`,{className:`oo-layout oo-layout--bar`,children:[(0,t.jsx)(`div`,{className:`oo-bar__slot oo-bar__slot--left`,children:i.map(e=>(0,t.jsx)(`div`,{className:`oo-bar__item`,children:n(e)},e.key))}),(0,t.jsx)(`div`,{className:`oo-bar__slot oo-bar__slot--center`,children:a.map(e=>(0,t.jsx)(`div`,{className:`oo-bar__item`,children:n(e)},e.key))}),(0,t.jsx)(`div`,{className:`oo-bar__slot oo-bar__slot--right`,children:o.map(e=>(0,t.jsx)(`div`,{className:`oo-bar__item`,children:n(e)},e.key))})]})}export{i as BarLayout};
@@ -0,0 +1 @@
1
+ .oo-btn{appearance:none;justify-content:center;align-items:center;gap:var(--oo-spacing-xs);display:inline-flex}
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{a as t,o as n,t as r}from"./styles-yrzHRgom.js";import{r as i}from"./_utils-DZVsX11M.js";var a=e();function o({type:e=`button`,title:o,label:s,variant:c=`default`,disabled:l,onClick:u,weight:d,size:f=`sm`,style:p,children:m,rounded:h=`sm`}){let g={"--button-padding-y":`var(${n(f)})`,"--button-padding-x":`var(${n(f)})`,"--button-font-size":`var(${t(f)})`,"--button-border-radius":`var(${n(h??f)})`,...i(d),...p};return(0,a.jsx)(`button`,{type:e??`button`,disabled:l,onClick:()=>{u?.()},"data-variant":c,className:r(`oo-btn`,{variant:c}),style:g,title:o,children:s??m??`Button`})}export{o as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{t}from"./useStore-BQkzWMs-.js";import{n}from"./ScenaProvider-6A3TJumQ.js";var r=e();function i({icon:e,label:i,value:a,valuePath:o,command:s,args:c,onClick:l,tone:u=`default`,active:d,disabled:f,title:p,className:m,style:h}){let g=n(),_=t(o),v=o?_:a;if(e===void 0&&i===void 0&&v===void 0)return null;let y=p??i??s;function b(){if(!f){if(l){l();return}s&&g.commands.execute(s,c)}}let x=!f&&(l!==void 0||s!==void 0);return(0,r.jsxs)(`button`,{type:`button`,className:[`oo-button-bar`,m].filter(Boolean).join(` `),style:h,"data-tone":u,"data-active":d??void 0,"data-interactive":x,disabled:f,title:y,"aria-label":y,"aria-pressed":d,onClick:b,children:[e===void 0?null:(0,r.jsx)(`span`,{className:`oo-button-bar__icon`,"aria-hidden":`true`,children:e}),i===void 0?null:(0,r.jsx)(`span`,{className:`oo-button-bar__label`,children:i}),v===void 0?null:(0,r.jsx)(`span`,{className:`oo-button-bar__value`,children:v})]})}export{i as ButtonBar,i as default};
@@ -0,0 +1 @@
1
+ .oo-button-bar{align-items:center;gap:var(--oo-spacing-xs);height:var(--oo-button-bar-height,22px);padding:0 var(--oo-spacing-sm);border-radius:var(--oo-radius-sm);color:inherit;font:inherit;font-size:var(--oo-font-size-xs);white-space:nowrap;cursor:default;background:0 0;border:none;line-height:1;display:inline-flex}.oo-button-bar[data-interactive=true]{cursor:pointer}.oo-button-bar[data-interactive=true]:hover{background:var(--oo-color-hover)}.oo-button-bar[data-interactive=true]:active{background:var(--oo-color-active)}.oo-button-bar:focus-visible{outline:1px solid var(--oo-color-accent);outline-offset:-1px}.oo-button-bar[disabled]{opacity:.5;cursor:default}.oo-button-bar[data-active=true]{background:var(--oo-color-active);color:var(--oo-color-accent)}.oo-button-bar[data-tone=accent]{color:var(--oo-color-accent)}.oo-button-bar[data-tone=danger]{color:var(--oo-color-danger)}.oo-button-bar[data-tone=warning]{color:var(--oo-color-warning)}.oo-button-bar[data-tone=success]{color:var(--oo-color-success)}.oo-button-bar[data-tone=muted]{color:var(--oo-color-muted)}.oo-button-bar__value{font-weight:600}[data-surface-role=bar] .oo-button-bar{height:var(--oo-button-bar-height-sm,20px);color:var(--oo-color-muted)}[data-surface-role=bar] .oo-button-bar[data-interactive=true]:hover{color:var(--oo-color-text)}
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{r as t}from"./_utils-DZVsX11M.js";var n=e();function r({title:e,subtitle:r,child:i,children:a,weight:o,style:s}){let c=i??a,l={...t(o),...s};return(0,n.jsxs)(`div`,{className:`oo-card`,style:l,children:[e?(0,n.jsx)(`div`,{className:`oo-card__title`,children:e}):null,r?(0,n.jsx)(`div`,{className:`oo-card__subtitle`,children:r}):null,c]})}export{r as Card};
@@ -0,0 +1 @@
1
+ .oo-card{border:1px solid var(--oo-color-border);border-radius:var(--oo-radius-sm);padding:var(--oo-spacing-md);background:var(--oo-card-bg)}.oo-card__title{margin-bottom:var(--oo-spacing-xs);font-weight:600}.oo-card__subtitle{color:var(--oo-color-muted);font-size:var(--oo-font-size-xs);margin-bottom:var(--oo-spacing-sm)}
@@ -0,0 +1 @@
1
+ .oo-checkbox-field{gap:var(--oo-spacing-xs);flex-direction:column;align-items:flex-start;display:flex}.oo-checkbox{align-items:center;gap:var(--oo-spacing-xs);cursor:pointer;display:inline-flex}.oo-checkbox[data-disabled=true]{cursor:not-allowed;opacity:.5}
@@ -0,0 +1 @@
1
+ import{r as e,t}from"./jsx-runtime-BguD1OXD.js";import{t as n}from"./react-CybPckBe.js";import{o as r}from"./mount-context-DZgEFVFG.js";import{r as i}from"./_utils-DZVsX11M.js";import{i as a,n as o,t as s}from"./_field-parts-BuPjFCuf.js";var c=n(),l=t(),u=e({CheckBox:()=>d});function d({value:e,defaultValue:t,label:n,disabled:u,checks:d,weight:f,hint:p,error:m,required:h,onChange:g}){let _=r(`value`),[v,y]=(0,c.useState)(e??t??!1);(0,c.useEffect)(()=>{e!==void 0&&y(t=>t===e?t:e)},[e]);function b(e){let t=e.currentTarget.checked;y(t),_(t),g?.(t)}return(0,l.jsxs)(`div`,{className:`oo-checkbox-field`,style:i(f),children:[(0,l.jsxs)(`label`,{className:`oo-checkbox`,"data-disabled":u?`true`:`false`,children:[(0,l.jsx)(`input`,{type:`checkbox`,checked:v,disabled:u,onChange:b}),n?(0,l.jsxs)(`span`,{children:[n,h?(0,l.jsx)(`span`,{className:`oo-field__required`,children:`*`}):null]}):null]}),(0,l.jsx)(o,{text:p}),(0,l.jsx)(s,{text:m}),(0,l.jsx)(a,{checks:d})]})}export{u as n,d as t};
@@ -0,0 +1 @@
1
+ .oo-select{width:100%}.oo-radios{gap:var(--oo-spacing-xs);flex-direction:column;display:flex}.oo-radio{align-items:center;gap:var(--oo-spacing-xs);cursor:pointer;display:inline-flex}
@@ -0,0 +1 @@
1
+ import{r as e,t}from"./jsx-runtime-BguD1OXD.js";import{t as n}from"./react-CybPckBe.js";import{o as r}from"./mount-context-DZgEFVFG.js";import{r as i}from"./_utils-DZVsX11M.js";import{i as a,n as o,r as s,t as c}from"./_field-parts-BuPjFCuf.js";var l=n(),u=t(),d=e({ChoicePicker:()=>p});function f(e){return typeof e==`string`?{label:e,value:e}:e}function p({value:e,defaultValue:t,options:n=[],label:d,disabled:p,variant:m=`select`,displayStyle:h,filterable:g,weight:_,checks:v,hint:y,error:b,required:x,typeTag:S,onChange:C}){let w=r(`value`),T=n.map(f),[E,D]=(0,l.useState)(e??t??T[0]?.value??``),[O,k]=(0,l.useState)(``);(0,l.useEffect)(()=>{e!==void 0&&D(t=>t===e?t:e)},[e]);function A(e){D(e),w(e),C?.(e)}function j(e){A(e.currentTarget.value)}let M=g&&O?T.filter(e=>e.label.toLowerCase().includes(O.toLowerCase())):T;return(0,u.jsxs)(`label`,{className:`oo-field`,style:i(_),children:[(0,u.jsx)(s,{label:d,required:x,typeTag:S}),(0,u.jsx)(o,{text:y}),g?(0,u.jsx)(`div`,{className:`oo-control`,children:(0,u.jsx)(`input`,{className:`oo-input`,type:`search`,placeholder:`Filter…`,value:O,onChange:e=>k(e.currentTarget.value),disabled:p})}):null,m===`radio`?(0,u.jsx)(`div`,{className:`oo-radios`,children:M.map(e=>(0,u.jsxs)(`label`,{className:`oo-radio`,children:[(0,u.jsx)(`input`,{type:`radio`,value:e.value,checked:E===e.value,disabled:p||e.disabled,onChange:()=>A(e.value)}),(0,u.jsx)(`span`,{children:e.label})]},e.value))}):(0,u.jsx)(`select`,{className:`oo-select`,value:E,disabled:p,onChange:j,children:M.map(e=>(0,u.jsx)(`option`,{value:e.value,disabled:e.disabled,children:e.label},e.value))}),(0,u.jsx)(c,{text:b}),(0,u.jsx)(a,{checks:v})]})}export{d as n,p as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{n as t,r as n,t as r}from"./_utils-DZVsX11M.js";var i=e();function a({children:e,justify:a=`start`,align:o=`stretch`,weight:s,gap:c,style:l}){let u={justifyContent:t(a),alignItems:r(o),...c===void 0?null:{gap:c},...n(s),...l};return(0,i.jsx)(`div`,{className:`oo-col`,style:u,children:e})}export{a as Column};
@@ -0,0 +1 @@
1
+ .oo-col{gap:var(--oo-column-gap,var(--oo-spacing-md));flex-direction:column;min-width:0;display:flex}
@@ -0,0 +1,2 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{t}from"./react-CybPckBe.js";import{t as n,u as r}from"./useStore-BQkzWMs-.js";import{n as i}from"./ScenaProvider-6A3TJumQ.js";import{t as a}from"./Button-_R1oktDz.js";import{g as o,w as s}from"./data-BvTv-4oH.js";import{i as c,n as l}from"./words-CrqnRMW4.js";import{t as u}from"./emojis-XibTG-gy.js";import{a as ee,i as d,n as f,o as te,r as p,s as m,t as h}from"./ActionList-DZ9lLGRe.js";import{A as g,C as _,D as v,E as y,M as b,O as x,S,T as C,_ as w,b as T,k as E,v as D,w as ne,x as O,y as re}from"./index-Cu7ySznN.js";var k=e(),A=t(),j=[`/`,`@`];function ie(e){let{input:t,setInput:n,caretIndex:r,panelDataContext:a,slashSlot:o=`chat:input/`,mentionSlot:s=`chat:input@`,mentionProvider:c,prefixes:l=j,onCaretChange:u}=e,g=i(),[_,v]=(0,A.useState)([]),y=(0,A.useRef)(_);y.current=_;let b=(0,A.useRef)(null),x=(0,A.useMemo)(()=>d(t,l,r),[t,l,r]),S=x!==null,C=(0,A.useCallback)(e=>x?.prefix===`@`?c?{provider:c,footerHints:!0,rich:!0}:{query:{slot:s,q:e},footerHints:!0,rich:!0}:{query:{slot:o,q:e},footerHints:!0,rich:!0},[x?.prefix,c,s,o]);(0,A.useEffect)(()=>{if(!x){y.current.length>0&&v([]);return}let e=y.current[y.current.length-1];if(y.current.length<=1){v([{spec:C(x.query)}]);return}let t=e&&`spec`in e?e.spec:void 0;if(t?.sentinel&&!m(x.token,t.sentinel)){v([{spec:C(x.query)}]);return}t?.query&&v(e=>{let n=e.slice(0,-1);return n.push({spec:{...t,query:{...t.query,q:x.query}}}),n})},[x,C]);let w=(0,A.useMemo)(()=>{let e=_[_.length-1];return e&&`spec`in e?e.spec.sentinel:void 0},[_]),T=(0,A.useMemo)(()=>te(x?.query??``,w),[x,w]),E=(0,A.useMemo)(()=>({pushList:e=>v(t=>[...t,{spec:e}]),replaceList:e=>v(t=>{let n=t.slice(0,-1);return n.push({spec:e}),n}),openInline:e=>v(t=>[...t,{component:(0,k.jsx)(M,{name:e})}]),openPopover:()=>void 0,back:()=>v(e=>e.length>1?e.slice(0,-1):e),closeMenu:()=>{v([]);let e=p(t,r,``,l);n(e.next),u?.(e.caret)},keepOpen:()=>void 0,insertAtCursor:e=>{let i=p(t,r,e,l);n(i.next),u?.(i.caret)},replaceActiveToken:e=>{let i=p(t,r,e,l);n(i.next),u?.(i.caret)},query:T}),[t,r,l,n,T,u]),D=_[_.length-1],ne=(0,A.useCallback)(()=>v(e=>e.slice(0,-1)),[]),O=_.length>1?ne:void 0,re=(0,A.useCallback)(e=>{if(!S)return!1;if(e.key===`Escape`)return e.preventDefault(),E.closeMenu(),!0;if(e.key===`ArrowLeft`&&O){let t=e.target;if(t.selectionStart===t.selectionEnd&&x&&t.selectionStart===x.start+x.prefix.length)return e.preventDefault(),O(),!0}return e.key===`ArrowDown`||e.key===`ArrowUp`||e.key===`Enter`||e.key===`Tab`?b.current?.handleKey(e)??!1:!1},[S,E,O,x]),ie=(0,A.useCallback)(e=>{let i=g.commands.get(e);if(!i)return null;let s=f(i.shortcut),c=null;if(s){let{next:e,caret:i}=ee(t,r,s,l);c=i,n(e),v([{spec:{query:{slot:o,q:s.replace(/^[/@]/,``)},footerHints:!0,rich:!0}}])}return g.commands.execute(e,void 0,{source:`menu`,dataContext:a,host:E}),c},[g,a,t,r,l,E,n,o]),N=(0,A.useCallback)(()=>E.closeMenu(),[E]);return{menuVisible:S,activeSentinel:w,pickerNode:D?`component`in D?D.component:(0,k.jsx)(h,{ref:b,spec:D.spec,hostCtx:E,onBack:O,dataContext:a,manageKeys:!1}):null,handleMenuKeyDown:re,openCommand:ie,closeMenu:N}}function M({name:e}){return(0,k.jsxs)(`div`,{style:{padding:12},children:[`[component: `,e,`]`]})}var N=u.caretDown;function P({label:e,title:t,onOpen:n,on:r}){return(0,k.jsxs)(`button`,{type:`button`,className:`web-chip`,"data-on":r===!0?`true`:`false`,title:t,disabled:n===void 0,onClick:n,...n===void 0?{}:{"aria-haspopup":`menu`},children:[e,n===void 0?null:(0,k.jsx)(`span`,{"aria-hidden":`true`,children:N})]})}function F({label:e,title:t,value:n,options:r,onChange:i}){let a=r.find(e=>e.value===n)?.label??n;return(0,k.jsxs)(`span`,{className:`web-chip web-chip--choice`,title:t??e,children:[`${e}: ${a===``?`default`:a}`,(0,k.jsx)(`span`,{"aria-hidden":`true`,children:N}),(0,k.jsx)(`select`,{"aria-label":e,value:n,onChange:e=>i(e.currentTarget.value),children:r.map(e=>(0,k.jsx)(`option`,{value:e.value,children:e.label},e.value))})]})}function I({label:e,title:t,value:n,onChange:r}){return(0,k.jsx)(`button`,{type:`button`,className:`web-chip`,"data-on":n?`true`:`false`,"aria-pressed":n,title:t??e,onClick:()=>r(!n),children:e})}function L({label:e,title:t,value:n,placeholder:r,onChange:i,width:a}){return(0,k.jsxs)(`span`,{className:`web-chip web-chip--text`,title:t??e,children:[e,(0,k.jsx)(`input`,{"aria-label":e,value:n,placeholder:r??``,style:{width:a??110},onChange:e=>i(e.currentTarget.value)})]})}var ae=`$/ahp/composerFocus`,R=e=>typeof e==`object`&&e?e:{},z=e=>typeof e==`string`&&e!==``?e:void 0;function oe(e){let t=R(e).items;return(Array.isArray(t)?t:[]).map(e=>{let t=R(e),n=R(R(t.attachment)._meta),r=z(t.insertText)??``;return{insert:r,label:z(n.command)??r,detail:z(n.description),hint:z(n.argumentHint)}}).filter(e=>e.insert!==``)}function se(e,t,n){return r(...n.map(n=>e.commands.register({id:`ahp.composer.host.${t}.${n.insert}`,title:n.hint===void 0?n.label:`${n.label} ${n.hint}`,...n.detail===void 0?{}:{description:n.detail},category:`Agent`,shortcut:n.label.startsWith(`/`)?n.label:`/${n.label}`,slots:[w],when:`${ae} == "${t}"`,run:e=>e.host?.replaceActiveToken(`${n.insert} `)})))}var ce=0,B=260,le=[`/`,`@`],ue=800;function de(e){e!==null&&(e.style.height=`auto`,e.style.height=`${Math.min(e.scrollHeight,B)}px`)}function fe(e,t,n){return{text:e,origin:{kind:`user`},...t===void 0?{}:{model:{id:t}},...n.length===0?{}:{attachments:E(e,n)}}}var pe=(0,A.memo)(function({chatUri:e,activeId:t,activeStart:r,queued:ee,steering:d,draft:f,lastModel:te,config:p,summary:m,send:h}){let E=i(),j=(n(`$/ahp/agents`)??[]).find(e=>e.provider===m.provider),M=(0,A.useMemo)(()=>re(e),[e]),[N]=(0,A.useState)(()=>`composer-${++ce}`),F=m.workingDirectories?.[0],[I,L]=(0,A.useState)(()=>f?.text??``),[R,z]=(0,A.useState)(null),[B,pe]=(0,A.useState)(()=>f?.model?.id??te),[V,H]=(0,A.useState)(()=>f?.attachments??[]),U=(0,A.useRef)(null),W=t===void 0?void 0:{id:t,startedAt:r??``},me=ee??[];(0,A.useEffect)(()=>de(U.current),[I]);let G=(0,A.useRef)(!1);(0,A.useEffect)(()=>{if(!G.current)return;let t=window.setTimeout(()=>{let t=I.trim()===``&&V.length===0?void 0:fe(I,B,V);o(e,{type:`chat/draftChanged`,draft:t})},ue);return()=>window.clearTimeout(t)},[I,B,V,e]);let K=(0,A.useCallback)(e=>{z(e),requestAnimationFrame(()=>{let t=U.current;t!==null&&(t.focus(),t.setSelectionRange(e,e))})},[]),q=(0,A.useCallback)(e=>{G.current=!0,H(t=>t.some(t=>x(t,e))?t:[...t,e])},[]),he=(0,A.useRef)(null),ge=(0,A.useCallback)(async e=>{let t=await v(Array.from(e??[]));for(let e of t.attached)q(e);t.refused.length>0&&b(`Not attached`,{description:`Over 5 MB or unreadable: ${t.refused.join(`, `)}`})},[q]),J=(0,A.useRef)(I);J.current=I;let Y=(0,A.useRef)(R);Y.current=R;let _e=(0,A.useCallback)(async()=>{let t=J.current;try{return(await s(`completions`,{kind:`userMessage`,channel:e,text:t,offset:Y.current??t.length})).items.map(e=>{let t=y(e.attachment,F);return{title:e.insertText.replace(/^@/,``),...t===void 0?{}:{description:t},onSelect:t=>{t.replaceActiveToken(`${e.insertText} `),q(g(e.attachment,e.insertText))}}})}catch{return[]}},[e,F,q]),[ve,ye]=(0,A.useState)([]);(0,A.useEffect)(()=>{let t=!0;return s(`completions`,{kind:`userMessage`,channel:e,text:`/`,offset:1}).then(e=>{t&&ye(oe(e))}).catch(()=>{t&&ye([])}),()=>{t=!1}},[e]),(0,A.useEffect)(()=>{let e=se(E,N,ve);return()=>e.dispose()},[E,N,ve]);let X=ie({input:I,setInput:L,caretIndex:R,panelDataContext:M,slashSlot:w,prefixes:le,mentionProvider:_e,onCaretChange:K}),Z=(0,A.useMemo)(()=>Object.entries(p?.schema.properties??{}).filter(([,e])=>e.sessionMutable===!0&&e.readOnly!==!0).map(([e,t])=>({key:e,schema:t,value:p?.values[e]})),[p]),Q=(0,A.useCallback)(()=>{if(t===void 0)return;let e=Date.parse(r??``);h({type:`chat/turnCancelled`,turnId:t,duration:Number.isNaN(e)?0:Math.max(0,Date.now()-e)})},[t,r,h]),be=(0,A.useMemo)(()=>(j?.models??[]).map(e=>({id:e.id,name:e.name})),[j]),$=(0,A.useRef)(null);$.current={models:()=>be,model:()=>B,setModel:e=>{G.current=!0,pe(e)},options:()=>Z,setOption:(e,t)=>{o(m.resource,{type:`session/configChanged`,config:{[e]:t}})},running:()=>W!==void 0,stop:Q,session:()=>m.resource,attach:q,type:e=>{let t=Y.current??J.current.length,n=J.current.slice(0,t),r=e===`/`||n===``||/\s$/.test(n)?``:` `,i=e===`/`&&n.trim()===``?`/${J.current.slice(t)}`:`${n}${r}${e}${J.current.slice(t)}`,a=e===`/`&&n.trim()===``?1:n.length+r.length+1;G.current=!0,L(i),K(a)},upload:()=>he.current?.click()},(0,A.useEffect)(()=>D(M,{models:()=>$.current?.models()??[],model:()=>$.current?.model(),setModel:e=>$.current?.setModel(e),options:()=>$.current?.options()??[],setOption:(e,t)=>$.current?.setOption(e,t),running:()=>$.current?.running()??!1,stop:()=>$.current?.stop(),session:()=>$.current?.session()??``,attach:e=>$.current?.attach(e),type:e=>$.current?.type(e),upload:()=>$.current?.upload()}),[M]);let xe=Z.map(e=>e.key).join(`
2
+ `);(0,A.useEffect)(()=>{let e=_(E,Z);return()=>e.dispose()},[E,xe]);function Se(e){let t=X.openCommand(e);K(t??U.current?.value.length??I.length)}function Ce(){L(``),H([]),G.current=!1,o(e,{type:`chat/draftChanged`,draft:void 0})}function we(e){let t=I.trim();if(t===``)return;let n=fe(t,B,V);h(W===void 0?{type:`chat/turnStarted`,turnId:c(),startedAt:new Date().toISOString(),message:n}:e===`steer`?{type:`chat/pendingMessageSet`,kind:`steering`,id:c(),message:n}:{type:`chat/pendingMessageSet`,kind:`queued`,id:c(),message:n}),Ce()}let Te=be.find(e=>e.id===B)?.name??B;return(0,k.jsxs)(`div`,{className:`web-composer`,children:[X.pickerNode===null?null:(0,k.jsx)(`div`,{className:`web-composer__picker`,children:X.pickerNode}),d===void 0&&me.length===0?null:(0,k.jsxs)(`ul`,{className:`web-composer__queue`,children:[d===void 0?null:(0,k.jsxs)(`li`,{children:[(0,k.jsx)(`span`,{className:`web-chip`,"data-on":`true`,children:`Steering`}),(0,k.jsx)(`span`,{className:`web-composer__queued`,children:d.message.text}),(0,k.jsx)(a,{label:`Remove`,size:`sm`,onClick:()=>h({type:`chat/pendingMessageRemoved`,kind:`steering`,id:d.id})})]}),me.map((e,t)=>(0,k.jsxs)(`li`,{children:[(0,k.jsxs)(`span`,{className:`web-chip`,children:[`Next `,t+1]}),(0,k.jsx)(`span`,{className:`web-composer__queued`,children:e.message.text}),(0,k.jsx)(a,{label:`Remove`,size:`sm`,onClick:()=>h({type:`chat/pendingMessageRemoved`,kind:`queued`,id:e.id})})]},e.id))]}),(0,k.jsxs)(`div`,{className:`web-composer__box`,children:[V.length===0?null:(0,k.jsx)(`div`,{className:`web-composer__attached`,children:V.map((e,t)=>(0,k.jsxs)(`span`,{className:`web-attachment`,title:y(e,F)??C(e),children:[(0,k.jsx)(`span`,{className:`web-attachment__icon`,"aria-hidden":`true`,children:ne(e)}),(0,k.jsx)(`span`,{className:`web-attachment__label`,children:C(e)}),(0,k.jsx)(`button`,{type:`button`,className:`web-attachment__remove`,"aria-label":`Remove ${C(e)}`,onClick:()=>{G.current=!0,H(e=>e.filter((e,n)=>n!==t))},children:u.close})]},`${C(e)}-${t}`))}),(0,k.jsx)(`div`,{className:`web-composer__bar`,children:(0,k.jsx)(`textarea`,{ref:U,className:`web-composer__text`,rows:1,value:I,"aria-label":`Message`,placeholder:W===void 0?`Message the agent, / for commands, @ to refer to a file`:`Queue a message for after this turn, or steer it`,onChange:e=>{G.current=!0,L(e.currentTarget.value),z(e.currentTarget.selectionStart)},onFocus:()=>E.store.set(ae,N),onKeyUp:e=>z(e.currentTarget.selectionStart),onClick:e=>z(e.currentTarget.selectionStart),onKeyDown:e=>{if(!X.handleMenuKeyDown(e)){if(e.key===`Escape`&&W!==void 0){e.preventDefault(),Q();return}e.key===`Enter`&&!e.shiftKey&&!e.nativeEvent.isComposing&&(e.preventDefault(),we(e.altKey?`steer`:`send`))}}})}),(0,k.jsxs)(`div`,{className:`web-composer__foot`,children:[(0,k.jsx)(`button`,{type:`button`,className:`web-composer__add`,"aria-label":`Add context`,title:`Add context`,onClick:()=>Se(`ahp.composer.attach`),children:`+`}),(0,k.jsx)(`input`,{ref:he,type:`file`,multiple:!0,hidden:!0,onChange:e=>{ge(e.currentTarget.files),e.currentTarget.value=``}}),(0,k.jsxs)(`div`,{className:`web-composer__chips`,children:[F===void 0?null:(0,k.jsx)(P,{label:`${u.folder} ${l(F)}`,title:`The folder this session works in`}),(0,k.jsx)(P,{label:`${u.agents} ${j?.displayName??m.provider}`,title:j?.description??`The agent running this session`}),be.length===0?null:(0,k.jsx)(P,{label:`Model: ${Te??`default`}`,title:`The model the next message goes to`,onOpen:()=>Se(`ahp.composer.model`)}),Z.map(e=>(0,k.jsx)(P,{label:`${e.schema.title||e.key}: ${O(e)}`,title:e.schema.description??e.schema.title,...e.schema.type===`boolean`?{on:(e.value??e.schema.default)===!0}:{},...S(e.schema)?{onOpen:()=>Se(T(e.key))}:{}},e.key))]}),W===void 0?null:(0,k.jsx)(a,{label:`Stop`,size:`sm`,onClick:Q}),W===void 0?null:(0,k.jsx)(a,{label:`Steer`,size:`sm`,disabled:I.trim()===``,onClick:()=>we(`steer`)}),(0,k.jsx)(`span`,{title:W===void 0?`Enter sends, Shift+Enter breaks the line`:`Enter queues, Alt+Enter steers, Esc stops`,children:(0,k.jsx)(a,{label:W===void 0?`Send`:`Queue`,variant:`primary`,size:`sm`,disabled:I.trim()===``,onClick:()=>we(`send`)})})]})]})]})});export{L as a,P as i,de as n,I as o,F as r,pe as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{t}from"./react-CybPckBe.js";import{n}from"./ScenaProvider-6A3TJumQ.js";import{t as r}from"./ActionList-DZ9lLGRe.js";var i=e(),a=t();function o({x:e,y:t,onClose:n,closeOnOutsideClick:r=!0,closeOnEscape:o=!0,className:s,style:c,children:l}){let u=(0,a.useRef)(null),[d,f]=(0,a.useState)({left:e,top:t});return(0,a.useLayoutEffect)(()=>{let n=u.current;if(!n)return;let r=()=>{let r=n.getBoundingClientRect(),i=Math.max(4,window.innerWidth-r.width-4),a=Math.max(4,window.innerHeight-r.height-4),o=Math.max(4,Math.min(e,i)),s=Math.max(4,Math.min(t,a));f(e=>e.left===o&&e.top===s?e:{left:o,top:s})};r(),window.addEventListener(`resize`,r);let i=typeof ResizeObserver>`u`?null:new ResizeObserver(r);return i?.observe(n),()=>{window.removeEventListener(`resize`,r),i?.disconnect()}},[e,t]),(0,a.useEffect)(()=>{if(!r||!n)return;let e=!0;function t(t){e&&u.current&&(u.current.contains(t.target)||n?.())}let i=setTimeout(()=>{e&&document.addEventListener(`mousedown`,t)},0);return()=>{e=!1,clearTimeout(i),document.removeEventListener(`mousedown`,t)}},[r,n]),(0,a.useEffect)(()=>{if(!o||!n)return;function e(e){e.key===`Escape`&&n?.()}return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[o,n]),(0,i.jsx)(`div`,{ref:u,className:[`oo-popup`,s].filter(Boolean).join(` `),style:{position:`fixed`,left:d.left,top:d.top,zIndex:9999,maxHeight:`calc(100vh - 8px)`,overflowY:`auto`,...c},onMouseDown:e=>e.stopPropagation(),children:l})}function s({spec:e,x:t,y:s,onClose:u,context:d,dataContext:f,inline:p}){let m=n(),[h,g]=(0,a.useState)(()=>p?[{component:p.component}]:[{spec:e}]),_=(0,a.useRef)(h);_.current=h;let v=(0,a.useRef)(!1);if(d&&!v.current){for(let[e,t]of Object.entries(d)){let n=e.startsWith(`$/`)?e:c(f,e);m.store.set(n,t)}v.current=!0}let y=(0,a.useMemo)(()=>({pushList:e=>g(t=>[...t,{spec:e}]),replaceList:e=>g(t=>{let n=t.slice(0,-1);return n.push({spec:e}),n}),openInline:(e,t)=>{g(n=>[...n,{component:(0,i.jsx)(l,{name:e,props:t})}])},openPopover:()=>{},back:()=>g(e=>e.length>1?e.slice(0,-1):e),closeMenu:u,keepOpen:()=>void 0,insertAtCursor:()=>void 0,replaceActiveToken:()=>void 0,query:``}),[u]),b=h[h.length-1],x=h.length>1?y.back:void 0;return(0,i.jsx)(o,{x:t,y:s,onClose:u,children:`component`in b?b.component:(0,i.jsx)(r,{spec:b.spec,hostCtx:y,onBack:x,dataContext:f})})}function c(e,t){return t.startsWith(`$/`)?t:e?`${e.endsWith(`/`)?e.slice(0,-1):e}${t.startsWith(`/`)?t:`/${t}`}`:t.startsWith(`/`)?`$${t}`:`$/${t}`}function l({name:e,props:t}){return(0,i.jsxs)(`div`,{style:{padding:12},children:[`[component: `,e,`]`]})}export{s as t};
@@ -0,0 +1 @@
1
+ .oo-listable{-webkit-user-select:none;user-select:none;min-height:0;font-size:var(--oo-font-size-sm);color:inherit;outline:none;flex-direction:column;display:flex;container:oo-listable/inline-size}.oo-listable:focus-visible{outline:1px solid var(--oo-color-accent);outline-offset:-1px}.oo-listable__header{padding:var(--oo-spacing-sm);border-bottom:1px solid var(--oo-color-border);justify-content:space-between;align-items:center;gap:var(--oo-spacing-sm);flex:none;display:flex}.oo-listable__title{font-size:var(--oo-font-size-xs);text-transform:uppercase;letter-spacing:.06em;color:var(--oo-color-muted);margin:0;font-weight:700}.oo-listable__rows{flex:auto;min-height:0;overflow:auto}.oo-listable[data-mode=table] .oo-listable__rows{grid-template-columns:var(--oo-listable-template);grid-auto-rows:max-content;align-content:start;display:grid}.oo-listable__empty{color:var(--oo-color-muted);font-size:var(--oo-font-size-xs);padding:var(--oo-spacing-md);flex:auto;justify-content:center;align-items:center;display:flex}.oo-listable__head-row{grid-template-columns:subgrid;z-index:1;background:var(--oo-color-canvas);border-bottom:1px solid var(--oo-color-border);grid-column:1/-1;display:grid;position:sticky;top:0}.oo-listable__head-cell{font-size:var(--oo-font-size-xs);text-transform:uppercase;letter-spacing:.05em;color:var(--oo-color-muted);white-space:nowrap;text-overflow:ellipsis;cursor:default;align-items:center;gap:4px;padding:6px 8px;font-weight:600;display:flex;overflow:hidden}.oo-listable__head-cell[data-align=right]{justify-content:flex-end}.oo-listable__head-cell[data-sortable=true]{cursor:pointer}.oo-listable__head-cell[data-sortable=true]:hover,.oo-listable__head-cell[data-sorted]{color:inherit}.oo-listable__head-label{text-overflow:ellipsis;overflow:hidden}.oo-listable__sort-arrow{font-size:9px;line-height:1}.oo-listable__row{grid-template-columns:subgrid;border-bottom:1px solid var(--oo-color-border);cursor:default;grid-column:1/-1;align-items:stretch;display:grid}.oo-listable__cell{font-size:var(--oo-font-size-sm);white-space:nowrap;text-overflow:ellipsis;align-items:center;padding:6px 8px;display:flex;overflow:hidden}.oo-listable__cell[data-align=right]{justify-content:flex-end}.oo-listable__stack{cursor:default;flex-direction:row;flex-grow:0;justify-content:space-between;align-items:start;gap:6px;padding:6px 12px;display:flex}.oo-listable__item:nth-child(2n){background:#00000005}.oo-listable__item:hover{color:var(--oo-color-text);background:var(--oo-color-hover)}.oo-listable__item[data-selected=true]{color:var(--oo-color-text);background:var(--oo-color-hover);box-shadow:inset 2px 0 0 var(--oo-color-accent)}.oo-listable__list-cell{align-items:baseline;gap:6px;min-width:0;display:flex}.oo-listable__list-label{min-width:64px;color:var(--oo-color-muted);text-transform:uppercase;letter-spacing:.04em;flex:none;font-size:10px}.oo-listable__list-value{min-width:0;font-size:var(--oo-font-size-sm);color:inherit;text-overflow:ellipsis;white-space:nowrap;flex:auto;overflow:hidden}.oo-listable[data-mode=table] .oo-listable__rows{transition:grid-template-columns .16s}.oo-listable__cell,.oo-listable__head-cell{transition:color .14s,background-color .14s,opacity .14s}html.oo-resizing .oo-listable[data-mode=table] .oo-listable__rows{transition:none}@media (prefers-reduced-motion:reduce){.oo-listable[data-mode=table] .oo-listable__rows,.oo-listable__cell,.oo-listable__head-cell{transition:none}}
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{t}from"./react-CybPckBe.js";import{t as n}from"./ContextMenu-D3PBPRRl.js";var r=t(),i=e();function a(e,t){if(typeof e==`object`&&e)return e[t]}function o(e,t,n){let r=a(e,n),i=a(t,n);return r==null&&i==null?0:r==null?-1:i==null?1:typeof r==`number`&&typeof i==`number`?r-i:String(r).localeCompare(String(i))}function s(e,t,n){if(!n)return e;let r=t.find(e=>e.key===n.key);if(!r||!r.sortable)return e;let i=typeof r.sortable==`function`?r.sortable:(e,t)=>o(e,t,r.key),a=n.direction===`asc`?1:-1;return[...e].sort((e,t)=>a*i(e,t))}var c=480;function l({items:e,columns:t,getKey:a,title:o,toolbar:l,selectedKey:d,onSelect:f,onActivate:p,initialSort:m,sort:h,onSortChange:g,tableBreakpoint:_=c,renderListRow:v,getRowStyle:y,contextMenuSlot:b,contextFor:x,contextDataContext:S,onRowDragStart:C,emptyState:w,className:T,style:E,manageKeys:D=!1}){let O=(0,r.useRef)(null),[k,A]=(0,r.useState)(0),[j,M]=(0,r.useState)(m??null);(0,r.useEffect)(()=>{let e=O.current;if(!e)return;let t=new ResizeObserver(([e])=>{e&&A(e.contentRect.width)});return t.observe(e),()=>t.disconnect()},[]);let N=k>=_,P=h!==void 0,F=P?h:j,I=(0,r.useMemo)(()=>t.filter(e=>!e.hidden&&(N||e.mode!==`table`)&&(e.showAt==null||k>=e.showAt)),[t,N,k]),L=(0,r.useMemo)(()=>({tableMode:N,containerWidth:k}),[N,k]),R=(0,r.useMemo)(()=>I.map(e=>typeof e.width==`function`?e.width(L):e.width).map(e=>e??`minmax(0, 1fr)`).join(` `),[I,L]),z=(0,r.useMemo)(()=>s(e,t,F??null),[e,t,F]);function B(e){if(!e.sortable)return;let t=F,n=!t||t.key!==e.key?{key:e.key,direction:`asc`}:t.direction===`asc`?{key:e.key,direction:`desc`}:null;P?g?.(n):M(n)}(0,r.useEffect)(()=>{if(!d||!O.current)return;let e=O.current.querySelector(`[data-key="${u(d)}"]`);e&&e.scrollIntoView({block:`nearest`})},[d]);let V=d?z.findIndex(e=>a(e)===d):-1;function H(e){if(z.length===0)return;let t=V>=0?V:0;switch(e.key){case`ArrowDown`:{e.preventDefault();let n=z[Math.min(z.length-1,t+1)];n&&f?.(n);return}case`ArrowUp`:{e.preventDefault();let n=z[Math.max(0,t-1)];n&&f?.(n);return}case`Enter`:case` `:{e.preventDefault();let n=z[t];n&&p?.(n);return}}}let[U,W]=(0,r.useState)(null);function G(e,t){b&&(e.preventDefault(),e.stopPropagation(),W({x:e.clientX,y:e.clientY,item:t}))}function K(e,t){let n=e.cellProps?.(t,L),r=e.style===void 0&&n?.style===void 0?void 0:{...e.style,...n?.style};return(0,i.jsx)(`div`,{role:`cell`,className:n?.className===void 0?`oo-listable__cell`:`oo-listable__cell ${n.className}`,"data-align":e.align??`left`,title:e.titleProps?.(t,L).title,style:r,children:J(e,t)},e.key)}function q(e){let t=F?.key===e.key,n=e.titleProps?.(void 0,L);return(0,i.jsx)(`div`,{role:`columnheader`,className:n?.className===void 0?`oo-listable__head-cell`:`oo-listable__head-cell ${n.className}`,"data-align":e.align??`left`,"data-sortable":e.sortable?`true`:void 0,"data-sorted":t?F.direction:void 0,title:e.sortable&&typeof e.label==`string`?`Sort by ${e.label}`:void 0,onClick:e.sortable?()=>B(e):void 0,style:n?.style,children:n?.hidden===!0?null:(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(`span`,{className:`oo-listable__head-label`,children:e.label}),t?(0,i.jsx)(`span`,{className:`oo-listable__sort-arrow`,"aria-hidden":`true`,children:F.direction===`asc`?`▲`:`▼`}):null]})},e.key)}function J(e,t){return e.visible&&!e.visible(t)?null:e.render(t,L)}function Y(e){let t=a(e);return(0,i.jsx)(`div`,{role:`row`,"data-key":t,"data-selected":t===d?`true`:void 0,className:`oo-listable__item oo-listable__row`,draggable:C?!0:void 0,onDragStart:C?t=>C(t,e):void 0,onClick:()=>{f?.(e)},onDoubleClick:()=>p?.(e),onContextMenu:t=>G(t,e),style:{cursor:f?`pointer`:void 0},children:I.map(t=>K(t,e))},t)}function X(e){let t=a(e),n=t===d,r=y?y(e,L):void 0;return(0,i.jsx)(`div`,{role:`row`,"data-key":t,"data-selected":n?`true`:void 0,className:`oo-listable__item oo-listable__stack`,draggable:C?!0:void 0,onDragStart:C?t=>C(t,e):void 0,onClick:()=>f?.(e),onDoubleClick:()=>p?.(e),onContextMenu:t=>G(t,e),style:{cursor:f?`pointer`:void 0,...r},children:v?v(e):I.map(t=>{let n=J(t,e);if(n==null)return null;let r=t.cellProps?.(e,L);return(0,i.jsx)(`div`,{className:r?.className===void 0?`oo-listable__list-cell`:`oo-listable__list-cell ${r.className}`,title:t.titleProps?.(e,L).title,style:t.style===void 0&&r?.style===void 0?void 0:{...t.style,...r?.style},children:(0,i.jsx)(`span`,{className:`oo-listable__list-value`,children:n})},t.key)})},t)}return(0,i.jsxs)(`div`,{ref:O,role:`table`,tabIndex:0,className:[`oo-listable`,T].filter(Boolean).join(` `),"data-mode":N?`table`:`list`,style:E,onKeyDown:D?H:void 0,children:[o||l?(0,i.jsxs)(`header`,{className:`oo-listable__header`,children:[o?(0,i.jsx)(`h2`,{className:`oo-listable__title`,children:o}):null,l]}):null,z.length===0?(0,i.jsx)(`div`,{className:`oo-listable__empty`,children:w??`Empty`}):(0,i.jsxs)(`div`,{className:`oo-listable__rows`,role:`rowgroup`,style:N?{"--oo-listable-template":R}:void 0,children:[N?(0,i.jsx)(`div`,{role:`row`,className:`oo-listable__head-row`,children:I.map(e=>q(e))}):null,z.map(e=>N?Y(e):X(e))]}),U&&b?(0,i.jsx)(n,{x:U.x,y:U.y,onClose:()=>W(null),spec:{query:{slot:b},footerHints:!0},context:x?x(U.item):void 0,dataContext:S}):null]})}function u(e){return e.replace(/(["\\\]])/g,`\\$1`)}function d(e){return e==null?``:typeof e==`object`?JSON.stringify(e):String(e)}function f({columns:e,rows:t,rowKey:n=`id`,caption:r,selectedKey:a,onSelect:o,onActivate:s,emptyState:c}){let u=e.map(e=>({key:e.key,label:e.label??e.key,width:e.width,align:e.align,sortable:!0,render:t=>d(t[e.key])}));return(0,i.jsx)(l,{items:t,columns:u,getKey:e=>String(e[n]??``),title:r,selectedKey:a,onSelect:o,onActivate:s,emptyState:c})}export{f as DataTable};
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{t}from"./react-CybPckBe.js";import{o as n}from"./mount-context-DZgEFVFG.js";import{r}from"./_utils-DZVsX11M.js";import{i,n as a,r as o,t as s}from"./_field-parts-BuPjFCuf.js";/* empty css */var c=t(),l=e();function u(e){return e.mode===`date`?`date`:e.mode===`time`?`time`:e.mode===`datetime`||e.enableDate&&e.enableTime?`datetime-local`:e.enableTime?`time`:e.enableDate?`date`:`datetime-local`}function d({value:e,defaultValue:t,mode:d,enableDate:f,enableTime:p,min:m,max:h,label:g,disabled:_,weight:v,checks:y,hint:b,error:x,required:S,typeTag:C,onChange:w}){let T=n(`value`),[E,D]=(0,c.useState)(e??t??``);(0,c.useEffect)(()=>{e!==void 0&&D(t=>t===e?t:e)},[e]);function O(e){let t=e.currentTarget.value;D(t),T(t),w?.(t)}return(0,l.jsxs)(`label`,{className:`oo-field`,style:r(v),children:[(0,l.jsx)(o,{label:g,required:S,typeTag:C}),(0,l.jsx)(a,{text:b}),(0,l.jsx)(`div`,{className:`oo-control`,children:(0,l.jsx)(`input`,{className:`oo-input`,type:u({mode:d,enableDate:f,enableTime:p}),value:E,min:m,max:h,disabled:_,onChange:O})}),(0,l.jsx)(s,{text:x}),(0,l.jsx)(i,{checks:y})]})}export{d as DateTimeInput};
@@ -0,0 +1 @@
1
+ .oo-avatar{-webkit-user-select:none;user-select:none;color:#fff;text-transform:uppercase;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-weight:600;line-height:1;display:inline-flex;overflow:hidden}.oo-avatar__img{object-fit:cover;width:100%;height:100%}.oo-detail-header{align-items:flex-start;gap:var(--oo-spacing-md);padding:var(--oo-spacing-md);display:flex}.oo-detail-header__body{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.oo-detail-header__titleline{align-items:center;gap:var(--oo-spacing-sm);display:flex}.oo-detail-header__title{font-size:var(--oo-font-size-lg);color:var(--oo-color-text);font-weight:600}.oo-detail-header__subtitle{font-size:var(--oo-font-size-sm);color:var(--oo-color-muted)}.oo-detail-header__meta{gap:var(--oo-spacing-md);flex-wrap:wrap;margin-top:4px;display:flex}.oo-detail-header__meta-item{flex-direction:row;gap:2px;display:flex}.oo-detail-header__meta-label{font-size:var(--oo-font-size-xs);text-transform:uppercase;letter-spacing:.05em;color:var(--oo-color-muted)}.oo-detail-header__meta-value{font-size:var(--oo-font-size-xs);color:var(--oo-color-text)}.oo-detail-header__actions{gap:var(--oo-spacing-sm);align-items:center;display:flex}
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{t}from"./Badge-BDEW5PFb.js";import{t as n}from"./Icon-CIQ7doud.js";var r=e(),i=[`#3b82f6`,`#8b5cf6`,`#ec4899`,`#f59e0b`,`#10b981`,`#06b6d4`,`#f97316`,`#84cc16`],a={sm:24,md:32,lg:40,xl:56};function o(e){if(!e)return i[0];let t=0;for(let n=0;n<e.length;n++)t=e.charCodeAt(n)+((t<<5)-t);return i[Math.abs(t)%i.length]}function s(e){if(!e)return`??`;let t=e.trim().split(/\s+/);return t.length===1?(t[0]?.slice(0,2)??`??`).toUpperCase():((t[0]?.[0]??``)+(t[1]?.[0]??``)).toUpperCase()}function c({name:e,icon:t,imgSrc:c,size:l=`md`,color:u,className:d,style:f}){let p=typeof l==`number`?l:a[l],m=u??(e?o(e):i[0]),h={width:p,height:p,background:c?void 0:m,...f},g=[`oo-avatar`,d].filter(Boolean).join(` `);return c?(0,r.jsx)(`span`,{className:g,style:h,"aria-label":e,children:(0,r.jsx)(`img`,{src:c,alt:e??``,className:`oo-avatar__img`})}):t===void 0?(0,r.jsx)(`span`,{className:g,style:{...h,fontSize:Math.round(p*.4)},"aria-label":e,children:s(e??``)}):(0,r.jsx)(`span`,{className:g,style:h,"aria-label":e,children:(0,r.jsx)(n,{name:t,size:Math.round(p*.6),color:`#fff`})})}function l({title:e,subtitle:n,avatarName:i,avatarSrc:a,avatarColor:o,status:s,meta:l,actions:u,style:d}){return(0,r.jsxs)(`header`,{className:`oo-detail-header`,style:d,children:[i||a?(0,r.jsx)(c,{name:i,imgSrc:a,color:o,size:56}):null,(0,r.jsxs)(`div`,{className:`oo-detail-header__body`,children:[(0,r.jsxs)(`div`,{className:`oo-detail-header__titleline`,children:[(0,r.jsx)(`span`,{className:`oo-detail-header__title`,children:e}),s?(0,r.jsx)(t,{tone:s.tone,label:s.label}):null]}),n?(0,r.jsx)(`div`,{className:`oo-detail-header__subtitle`,children:n}):null,l&&l.length>0?(0,r.jsx)(`div`,{className:`oo-detail-header__meta`,children:l.map((e,t)=>(0,r.jsxs)(`span`,{className:`oo-detail-header__meta-item`,children:[(0,r.jsx)(`span`,{className:`oo-detail-header__meta-label`,children:e.label}),(0,r.jsx)(`span`,{className:`oo-detail-header__meta-value`,children:e.value})]},t))}):null]}),u?(0,r.jsx)(`div`,{className:`oo-detail-header__actions`,children:u}):null]})}export{l as DetailHeader};
@@ -0,0 +1 @@
1
+ .oo-detail-list{gap:var(--oo-spacing-md);margin:0;display:grid}.oo-detail-list__item{flex-direction:column;gap:2px;min-width:0;display:flex}.oo-detail-list__item--span{grid-column:1/-1}.oo-detail-list__label{font-size:var(--oo-font-size-xs);text-transform:uppercase;letter-spacing:.05em;color:var(--oo-color-muted)}.oo-detail-list__value{font-size:var(--oo-font-size-sm);color:var(--oo-color-text);overflow-wrap:anywhere;margin:0}
@@ -0,0 +1 @@
1
+ import{r as e,t}from"./jsx-runtime-BguD1OXD.js";var n=t(),r=e({DetailList:()=>i});function i({items:e,columns:t,style:r}){let i=t?`repeat(${t}, minmax(0, 1fr))`:`repeat(auto-fill, minmax(160px, 1fr))`;return(0,n.jsx)(`dl`,{className:`oo-detail-list`,style:{gridTemplateColumns:i,...r},children:e.map((e,t)=>(0,n.jsxs)(`div`,{className:`oo-detail-list__item${e.span?` oo-detail-list__item--span`:``}`,children:[(0,n.jsx)(`dt`,{className:`oo-detail-list__label`,children:e.label}),(0,n.jsx)(`dd`,{className:`oo-detail-list__value`,children:e.value})]},t))})}export{r as n,i as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{t}from"./react-CybPckBe.js";import{t as n}from"./useStore-BQkzWMs-.js";import{V as r,c as i,q as a}from"./data-BvTv-4oH.js";import{n as o,t as s}from"./words-CrqnRMW4.js";import{g as c}from"./index-Cu7ySznN.js";import{a as l,i as u,r as d}from"./turn-BoF7W1h6.js";import{t as f}from"./channel-BScxZDq2.js";var p=t(),m=e();function h(){let e=n(c),t=n(i)?.find(t=>t.resource===e),h=f(t===void 0?void 0:e,a),g=f(h.state?.defaultChat??t?.defaultChat,r),_=g.state?.turns,v=(0,p.useMemo)(()=>u(_??[]),[_]);if(t===void 0)return(0,m.jsx)(`p`,{className:`web-note web-details__empty`,children:`Open a session to see its details.`});let y=t.workingDirectories?.[0],b=t.changes,x=t.origin,S=h.state?.activeClients.length??0,C=[[`Session`,t.title===``?`Untitled`:t.title],[`Agent`,t.provider]];return v.models.length>0&&C.push([`Model`,v.models.join(`, `)]),y!==void 0&&C.push([`Folder`,(0,m.jsx)(`code`,{children:o(y)},`f`)]),t.project!==void 0&&C.push([`Project`,t.project.displayName]),C.push([`Started`,l(t.createdAt)],[`Changed`,l(t.modifiedAt)]),v.turns>0&&(C.push([`Turns`,`${v.turns}${g.state?.turnsNextCursor===void 0?``:`+`}`]),C.push([`Working`,s(v.working)]),C.push([`Tokens`,`\u{2191}${d(v.input)} \u{2193}${d(v.output)}`]),v.tools>0&&C.push([`Tool calls`,String(v.tools)])),b!==void 0&&(b.additions!==void 0||b.deletions!==void 0)&&C.push([`Changes`,(0,m.jsxs)(`span`,{children:[(0,m.jsxs)(`span`,{className:`web-diff--add`,children:[`+`,b.additions??0]}),` `,(0,m.jsxs)(`span`,{className:`web-diff--remove`,children:[`-`,b.deletions??0]}),b.files===void 0?``:` in ${b.files} files`]},`c`)]),x!==void 0&&String(x.kind)===`automation`&&C.push([`From`,`An automation run`]),S>0&&C.push([`Watching`,String(S)]),(0,m.jsx)(`dl`,{className:`web-details`,children:C.map(([e,t])=>(0,m.jsxs)(`div`,{children:[(0,m.jsx)(`dt`,{children:e}),(0,m.jsx)(`dd`,{children:t})]},e))})}export{h as default};
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{t}from"./react-CybPckBe.js";import{n}from"./ScenaProvider-6A3TJumQ.js";import{t as r}from"./Button-_R1oktDz.js";import{b as i}from"./data-BvTv-4oH.js";import{n as a}from"./words-CrqnRMW4.js";import{t as o}from"./Spinner-B-iOhBZq.js";import{t as s}from"./Alert-CHZkhmDE.js";import{n as c,r as l,t as u}from"./diff-eyYjrmkY.js";var d=t(),f=e(),p=async e=>e===void 0?``:(await i(e)).text;function m({file:e,before:t,after:i}){let m=n(),[h,g]=(0,d.useState)(null);(0,d.useEffect)(()=>{let e=!0;return g(null),Promise.all([p(t),p(i)]).then(([t,n])=>{e&&g({before:t,after:n})}).catch(t=>{e&&g({error:t instanceof Error?t.message:String(t)})}),()=>{e=!1}},[t,i]);let _=(0,d.useMemo)(()=>h===null||`error`in h||h.before===null||h.after===null?[]:c(h.before,h.after),[h]),v=e===void 0?``:a(e),y=u(_),b=(0,f.jsxs)(`div`,{className:`web-file__head`,children:[(0,f.jsx)(`code`,{children:v}),h!==null&&!(`error`in h)?(0,f.jsxs)(`span`,{children:[(0,f.jsxs)(`span`,{className:`web-diff--add`,children:[`+`,y.added]}),` `,(0,f.jsxs)(`span`,{className:`web-diff--remove`,children:[`-`,y.removed]}),t===void 0?` · new file`:i===void 0?` · deleted`:``]}):null,e===void 0||i===void 0?null:(0,f.jsx)(r,{label:`Open file`,size:`sm`,onClick:()=>void m.commands.execute(`ahp.openFile`,{uri:e})})]});return h===null?(0,f.jsxs)(`div`,{className:`web-file`,children:[b,(0,f.jsx)(o,{label:`Reading both sides`})]}):`error`in h?(0,f.jsxs)(`div`,{className:`web-file`,children:[b,(0,f.jsx)(s,{tone:`danger`,title:`Not readable`,message:h.error})]}):h.before===null||h.after===null?(0,f.jsxs)(`div`,{className:`web-file`,children:[b,(0,f.jsx)(`p`,{className:`web-note`,children:`This file is not text.`})]}):_.length===0?(0,f.jsxs)(`div`,{className:`web-file`,children:[b,(0,f.jsx)(`p`,{className:`web-note`,children:`No changes.`})]}):(0,f.jsxs)(`div`,{className:`web-file`,children:[b,(0,f.jsx)(`div`,{className:`web-file__body`,children:(0,f.jsx)(`table`,{className:`web-code web-diff`,children:(0,f.jsx)(`tbody`,{children:_.map((e,t)=>[(0,f.jsx)(`tr`,{className:`web-diff__hunk`,children:(0,f.jsx)(`td`,{colSpan:3,children:l(e)})},`h${t}`),...e.lines.map((e,n)=>(0,f.jsxs)(`tr`,{"data-kind":e.kind,children:[(0,f.jsx)(`td`,{className:`web-code__number`,children:e.before??``}),(0,f.jsx)(`td`,{className:`web-code__number`,children:e.after??``}),(0,f.jsxs)(`td`,{className:`web-code__text`,children:[e.kind===`add`?`+`:e.kind===`del`?`-`:` `,e.text]})]},`${t}:${n}`))])})})})]})}export{m as default};
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{t}from"./styles-yrzHRgom.js";import{r as n}from"./_utils-DZVsX11M.js";var r=e();function i({axis:e,orientation:i,weight:a,thickness:o}){let s=e??i??`horizontal`,c=o===void 0?void 0:s===`horizontal`?{height:o}:{width:o},l=n(a),u=Object.keys(l).length>0,d=c||u?{...c,...l}:void 0;return(0,r.jsx)(`div`,{role:`separator`,className:t(`oo-divider`,{variant:s}),style:d})}export{i as Divider};
@@ -0,0 +1 @@
1
+ .oo-divider{background:var(--oo-color-border);flex:none}.oo-divider--horizontal{width:100%;height:1px}.oo-divider--vertical{width:1px;height:100%}
@@ -0,0 +1 @@
1
+ .oo-divisor{background:var(--oo-color-border);-webkit-user-select:none;user-select:none;touch-action:none;z-index:5;flex:none;height:100%;position:relative}.oo-divisor:before,.oo-divisor:after{content:"";position:absolute}.oo-divisor:after{background:var(--oo-color-accent);opacity:0;transition:opacity .12s}.oo-divisor:hover:after{opacity:.55}.oo-divisor:active:after{opacity:1}@media (prefers-reduced-motion:reduce){.oo-divisor:after{transition:none}}.oo-divisor__row{cursor:ew-resize;width:1px}.oo-divisor__row:before{inset:0 calc(-1 * var(--oo-divisor-grip,4px))}.oo-divisor__row:after{top:0;bottom:0;left:calc((1px - var(--oo-resize-line,3px)) / 2);width:var(--oo-resize-line,3px)}.oo-divisor__col{cursor:ns-resize;height:1px}.oo-divisor__col:before{inset:calc(-1 * var(--oo-divisor-grip,4px)) 0}.oo-divisor__col:after{left:0;right:0;top:calc((1px - var(--oo-resize-line,3px)) / 2);height:var(--oo-resize-line,3px)}
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{t}from"./react-CybPckBe.js";var n=t(),r=e();function i({id:e,direction:t,containerRef:i,min:o=.01,max:s=.99,disabled:c=!1,onCommit:l}){let u=(0,n.useRef)(!1),d=(0,n.useRef)(null),f=(0,n.useRef)(null);function p(){f.current!==null&&(l(f.current,e),f.current=null),d.current=null}function m(e){e.preventDefault(),e.currentTarget.setPointerCapture(e.pointerId),u.current=!0}function h(e){if(!u.current||!i.current)return;let n=i.current.getBoundingClientRect(),r=t===`row`?(e.clientX-n.left)/Math.max(1,n.width):(e.clientY-n.top)/Math.max(1,n.height);f.current=a(r,o,s),d.current===null&&(d.current=requestAnimationFrame(p))}function g(e){d.current!==null&&(cancelAnimationFrame(d.current),p()),e.currentTarget.releasePointerCapture(e.pointerId),u.current=!1}return(0,r.jsx)(`div`,{className:`oo-divisor oo-divisor__${t}`,"data-divisor-id":e,"aria-disabled":c||void 0,"aria-direction":t,"aria-valuemax":s,"aria-valuemin":o,"aria-valuenow":f.current??void 0,onPointerDown:m,onPointerMove:h,onPointerUp:g,onMouseDown:e=>e.preventDefault()})}function a(e,t,n){return Math.max(t,Math.min(n,e))}export{i as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";var t=e();function n({slices:e,size:n=96,thickness:r=12,centerLabel:i,style:a}){e??=[];let o=e.reduce((e,t)=>e+t.value,0)||1,s=(n-r)/2,c=2*Math.PI*s,l=n/2,u=0;return(0,t.jsxs)(`div`,{className:`oo-donut`,style:{width:n,height:n,...a},children:[(0,t.jsx)(`svg`,{width:n,height:n,viewBox:`0 0 ${n} ${n}`,children:(0,t.jsxs)(`g`,{transform:`rotate(-90 ${l} ${l})`,children:[(0,t.jsx)(`circle`,{cx:l,cy:l,r:s,fill:`none`,stroke:`var(--oo-color-border)`,strokeWidth:r}),e.map((e,n)=>{let i=e.value/o,a=i*c,d=(0,t.jsx)(`circle`,{cx:l,cy:l,r:s,fill:`none`,stroke:e.color,strokeWidth:r,strokeDasharray:`${a} ${c-a}`,strokeDashoffset:-u*c,children:e.label?(0,t.jsx)(`title`,{children:`${e.label}: ${e.value}`}):null},n);return u+=i,d})]})}),i?(0,t.jsx)(`div`,{className:`oo-donut__center`,children:i}):null]})}export{n as Donut};
@@ -0,0 +1 @@
1
+ .oo-donut{flex:none;display:inline-flex;position:relative}.oo-donut__center{font-size:var(--oo-font-size-sm);color:var(--oo-color-text);justify-content:center;align-items:center;font-weight:600;display:flex;position:absolute;inset:0}
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{t}from"./react-CybPckBe.js";import{t as n}from"./useStore-BQkzWMs-.js";import{n as r}from"./ScenaProvider-6A3TJumQ.js";import{t as i}from"./Button-_R1oktDz.js";import{G as a,d as o,g as s,i as c,n as l}from"./data-BvTv-4oH.js";import{i as u,n as d}from"./words-CrqnRMW4.js";import{t as f}from"./Spinner-B-iOhBZq.js";import{t as p}from"./Alert-CHZkhmDE.js";import{t as m}from"./Text-MPtQvYE-.js";import{a as h,i as g,o as _,r as v}from"./index-Cu7ySznN.js";import{t as y}from"./channel-BScxZDq2.js";var b=t(),x=e(),S=[{label:`By hand only`,expression:``},{label:`Every 10 minutes`,expression:`*/10 * * * *`},{label:`Every hour`,expression:`0 * * * *`},{label:`Every 6 hours`,expression:`0 */6 * * *`},{label:`Every day at 09:00`,expression:`0 9 * * *`},{label:`Weekdays at 09:00`,expression:`0 9 * * 1-5`},{label:`Every Monday at 05:00`,expression:`0 5 * * 1`}];function C({label:e,hint:t,children:n}){return(0,x.jsxs)(`label`,{className:`web-form__field`,children:[(0,x.jsx)(`span`,{className:`web-input__label`,children:e}),n,t===void 0?null:(0,x.jsx)(`span`,{className:`web-input__hint`,children:t})]})}function w({resource:e}){let t=r(),{state:w,error:T}=y(o,a),E=n(`$/ahp/agents`)??[],D=n(l),O=n(c),k=e===void 0?void 0:w?.entries.find(t=>t.resource===e),[A,j]=(0,b.useState)(null);if(T!==null)return(0,x.jsx)(p,{tone:`danger`,title:`No automations`,message:T});if(w===void 0)return(0,x.jsx)(f,{label:`Reading the automations`});if(e!==void 0&&k===void 0)return(0,x.jsx)(p,{tone:`warning`,message:`This automation is gone.`});if(e===void 0&&D?.create===void 0)return(0,x.jsx)(p,{tone:`warning`,message:`This host does not let clients create automations.`});let M=A??h(k,{...E[0]===void 0?{}:{provider:E[0].provider},...O==null?{}:{folder:d(O)}}),N=e=>j({...M,...e}),P=E.find(e=>e.provider===M.provider),F=_(M),I=D?.schedules?.minIntervalMinutes,L=S.find(e=>e.expression===M.expression.trim());return(0,x.jsxs)(`div`,{className:`web-page web-form`,children:[(0,x.jsx)(m,{variant:`h2`,text:k===void 0?`New automation`:`Edit ${k.definition.title||`automation`}`}),(0,x.jsx)(C,{label:`Title`,children:(0,x.jsx)(`input`,{className:`web-field`,value:M.title,onChange:e=>N({title:e.target.value})})}),(0,x.jsx)(C,{label:`Message`,hint:`What the agent is told each time it runs.`,children:(0,x.jsx)(`textarea`,{className:`web-field web-form__message`,rows:5,value:M.message,onChange:e=>N({message:e.target.value})})}),(0,x.jsxs)(`div`,{className:`web-form__row`,children:[(0,x.jsx)(C,{label:`Agent`,children:(0,x.jsxs)(`select`,{className:`web-field`,value:M.provider,onChange:e=>N({provider:e.target.value,model:``}),children:[(0,x.jsx)(`option`,{value:``,children:`The host default`}),E.map(e=>(0,x.jsx)(`option`,{value:e.provider,children:e.displayName},e.provider))]})}),(0,x.jsx)(C,{label:`Model`,children:(0,x.jsxs)(`select`,{className:`web-field`,value:M.model,onChange:e=>N({model:e.target.value}),children:[(0,x.jsx)(`option`,{value:``,children:`The agent default`}),(P?.models??[]).map(e=>(0,x.jsx)(`option`,{value:e.id,children:e.name},e.id))]})})]}),(0,x.jsx)(C,{label:`Folder`,hint:`A folder on the daemon's machine.`,children:(0,x.jsx)(`input`,{className:`web-field`,value:M.folder,onChange:e=>N({folder:e.target.value})})}),(0,x.jsxs)(`div`,{className:`web-form__row`,children:[(0,x.jsx)(C,{label:`Schedule`,children:(0,x.jsxs)(`select`,{className:`web-field`,value:L?.expression??`custom`,onChange:e=>{e.target.value!==`custom`&&N({expression:e.target.value})},children:[S.map(e=>(0,x.jsx)(`option`,{value:e.expression,children:e.label},e.label)),(0,x.jsx)(`option`,{value:`custom`,children:`Custom`})]})}),(0,x.jsx)(C,{label:`Cron expression`,hint:`${M.expression.trim()===``?`Runs only when started by hand.`:v(M.expression)}${I===void 0?``:` At most every ${I} minutes.`}`,children:(0,x.jsx)(`input`,{className:`web-field`,value:M.expression,placeholder:`minute hour day month weekday`,onChange:e=>N({expression:e.target.value})})})]}),M.expression.trim()===``?null:(0,x.jsxs)(`div`,{className:`web-form__row`,children:[(0,x.jsx)(C,{label:`Time zone`,children:(0,x.jsx)(`input`,{className:`web-field`,value:M.timeZone,onChange:e=>N({timeZone:e.target.value})})}),(0,x.jsx)(C,{label:`Missed runs`,hint:`What happens to a run due while the daemon was down.`,children:(0,x.jsxs)(`select`,{className:`web-field`,value:M.misfire,onChange:e=>N({misfire:e.target.value===`runOnce`?`runOnce`:`skip`}),children:[(0,x.jsx)(`option`,{value:`skip`,children:`Skip them`}),(0,x.jsx)(`option`,{value:`runOnce`,children:`Run once when back`})]})})]}),(0,x.jsxs)(`div`,{className:`web-form__row`,children:[(0,x.jsx)(C,{label:`Turn off after runs`,hint:`Empty keeps it on.`,children:(0,x.jsx)(`input`,{className:`web-field`,inputMode:`numeric`,value:M.afterRuns,onChange:e=>N({afterRuns:e.target.value})})}),(0,x.jsx)(C,{label:`Turn off after`,hint:`Empty keeps it on.`,children:(0,x.jsx)(`input`,{className:`web-field`,type:`date`,value:M.afterDate,onChange:e=>N({afterDate:e.target.value})})})]}),(0,x.jsxs)(`label`,{className:`web-input__row`,children:[(0,x.jsx)(`input`,{type:`checkbox`,checked:M.enabled,onChange:e=>N({enabled:e.target.checked})}),(0,x.jsx)(`span`,{children:`On`})]}),F===void 0?null:(0,x.jsx)(`p`,{className:`web-note`,children:F}),(0,x.jsxs)(`div`,{className:`web-page__actions`,children:[(0,x.jsx)(i,{label:k===void 0?`Create`:`Save`,variant:`primary`,disabled:F!==void 0,onClick:()=>{if(F!==void 0)return;let e=g(M,k?.definition);if(k===void 0){let n=`ahp-automation:/${u()}`;s(o,{type:`automation/createRequested`,resource:n,definition:e}),t.surfaces.close(`automation:new`),t.commands.execute(`ahp.openAutomation`,{resource:n})}else s(o,{type:`automation/updateRequested`,resource:k.resource,changes:e}),t.surfaces.close(`automation:edit:${k.resource}`),t.commands.execute(`ahp.openAutomation`,{resource:k.resource})}}),(0,x.jsx)(i,{label:`Cancel`,onClick:()=>t.surfaces.close(k===void 0?`automation:new`:`automation:edit:${k.resource}`)})]})]})}export{w as default};
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{t}from"./react-CybPckBe.js";import{t as n}from"./useStore-BQkzWMs-.js";import{n as r}from"./ScenaProvider-6A3TJumQ.js";import{C as i,F as a,L as o,R as s,c,g as l,r as u,w as d,z as f}from"./data-BvTv-4oH.js";import{n as p}from"./words-CrqnRMW4.js";import{t as m}from"./emojis-XibTG-gy.js";import{t as h}from"./Spinner-B-iOhBZq.js";import{t as g}from"./Alert-CHZkhmDE.js";import{N as _,g as v,j as y}from"./index-Cu7ySznN.js";import{t as b}from"./ExplorerList-Cecr_ZQS.js";var x=t(),S=[{id:`none`,label:`No groups`},{id:`folder`,label:`Group by folder`},{id:`status`,label:`Group by status`},{id:`agent`,label:`Group by agent`}],C=[{key:`input`,label:`Needs you`},{key:`running`,label:`Running`},{key:`error`,label:`Failed`},{key:`unread`,label:`Unread`},{key:`idle`,label:`Idle`},{key:`archived`,label:`Archived`}];function w(e){if(s(e.status))return C[5];let t=o(e.status);return t===`idle`&&!f(e.status)?C[3]:C.find(e=>e.key===t)}function T(e,t,n){switch(t){case`none`:return;case`status`:return w(e);case`agent`:return{key:e.provider,label:n(e.provider)};case`folder`:{let t=e.workingDirectories?.[0];return t===void 0?{key:``,label:`No folder`}:{key:t,label:p(t)}}}}function E(e,t,n){if(n===`none`)return[...e];let r=new Map;n===`status`&&C.forEach((e,t)=>r.set(e.key,t));for(let n of e){let e=t(n)?.key??``;r.has(e)||r.set(e,r.size+C.length)}return e.map((e,n)=>({item:e,index:n,rank:r.get(t(e)?.key??``)})).sort((e,t)=>e.rank-t.rank||e.index-t.index).map(e=>e.item)}var D=e(),O=`ahpd-web.session-grouping`;function k(){try{let e=localStorage.getItem(O);return S.some(t=>t.id===e)?e:`none`}catch{return`none`}}function A(e){try{localStorage.setItem(O,e)}catch{}}var j=new Intl.DateTimeFormat(void 0,{hour:`2-digit`,minute:`2-digit`}),M=new Intl.DateTimeFormat(void 0,{month:`short`,day:`numeric`});function N(e,t=new Date){let n=new Date(e);return Number.isNaN(n.getTime())?``:(n.toDateString()===t.toDateString()?j:M).format(n)}var P={input:`attention`,running:`working`,error:`failed`,idle:`quiet`},F=e=>p(e).replace(/\/+$/,``).split(`/`).pop()??e;function I(e,t){let n=f(e.status),r=s(e.status),i=t=>l(e.resource,t);return[{title:`Open`,onSelect:e=>{e.closeMenu(),t()}},{title:`Rename`,onSelect:t=>{t.closeMenu();let n=window.prompt(`Rename the session`,e.title)?.trim();n!==void 0&&n!==``&&n!==e.title&&i({type:`session/titleChanged`,title:n})}},{title:n?`Mark as unread`:`Mark as read`,onSelect:e=>{e.closeMenu(),i({type:`session/isReadChanged`,isRead:!n})}},{title:r?`Unarchive`:`Archive`,onSelect:e=>{e.closeMenu(),i({type:`session/isArchivedChanged`,isArchived:!r})}},{title:`Copy link`,group:`more`,onSelect:t=>{t.closeMenu(),navigator.clipboard?.writeText(e.resource).catch(()=>void 0)}},{title:`Delete`,group:`more`,color:`red`,onSelect:t=>{t.closeMenu(),_({title:`Delete "${e.title||`Untitled`}"?`,body:`Its history goes with it.`,confirmLabel:`Delete`,tone:`danger`}).then(t=>{t&&d(`disposeSession`,{channel:e.resource}).catch(e=>y(`The session could not be deleted`,e))})}}]}function L(){let e=r(),t=n(u),l=n(c),d=n(`$/ahp/agents`)??[],p=n(v),[_,y]=(0,x.useState)(!1),[C,w]=(0,x.useState)(k),O=e=>{w(e),A(e)},[j,M]=(0,x.useState)(!1),L=t=>void e.commands.execute(`ahp.openSession`,{resource:t}),R=(0,x.useMemo)(()=>{let e=e=>d.find(t=>t.provider===e)?.displayName??e;return E((l??[]).filter(e=>_||!s(e.status)),t=>T(t,C,e),C).map(t=>{let n=o(t.status),r=n===`idle`&&!f(t.status),i=e(t.provider),c=T(t,C,e),l=t.workingDirectories?.[0],u=[i,l===void 0?void 0:F(l)].filter(e=>e!==void 0).join(` · `),d=t.changes,p=n===`idle`?d!==void 0&&(d.additions??0)+(d.deletions??0)>0?(0,D.jsxs)(D.Fragment,{children:[(0,D.jsxs)(`span`,{className:`web-diff--add`,children:[`+`,d.additions??0]}),` `,(0,D.jsxs)(`span`,{className:`web-diff--remove`,children:[`-`,d.deletions??0]}),d.files===void 0?``:` \u{00B7} ${d.files} files`]}):void 0:`${a[n]}${t.activity===void 0||t.activity===``?``:` \u{00B7} ${t.activity}`}`;return{key:t.resource,dot:s(t.status)?`off`:r?`fresh`:P[n],dotLabel:s(t.status)?`Archived`:r?`Unread`:a[n],title:t.title===``?`Untitled`:t.title,time:N(t.modifiedAt),lines:p===void 0?[u]:[u,p],menu:I(t,()=>L(t.resource)),strong:r,...c===void 0?{}:{group:c}}})},[l,d,_,C]),z=()=>{M(!0),i().catch(()=>void 0).finally(()=>M(!1))},B=t?.status===`failed`?(0,D.jsx)(g,{tone:`danger`,title:`Not connected`,message:t.error??`The daemon refused the connection.`}):t?.status!==`connected`&&l===void 0?(0,D.jsx)(h,{label:`Connecting to the daemon`}):R.length===0?(0,D.jsx)(`p`,{className:`web-note`,children:_?`No sessions.`:`No sessions yet.`}):null;return(0,D.jsx)(b,{title:`Sessions`,actions:[{icon:`+`,label:`New session`,run:()=>void e.commands.execute(`ahp.newSession`)},{icon:m.reload,label:j?`Reloading`:`Reload`,run:z,busy:j},{icon:m.archived,label:_?`Hide archived`:`Show archived`,run:()=>y(!_),on:_},{icon:m.group,label:`Group sessions`,on:C!==`none`,menu:S.map(e=>({title:e.label,...e.id===C?{description:`Current`}:{},onSelect:t=>{t.closeMenu(),O(e.id)}}))}],rows:R,selected:p??null,onOpen:L,notice:B,filterLabel:`Filter sessions`})}export{L as default};
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{t}from"./react-CybPckBe.js";import{t as n}from"./useStore-BQkzWMs-.js";import{n as r}from"./ScenaProvider-6A3TJumQ.js";import{t as i}from"./Button-_R1oktDz.js";import{J as a,S as o,c as s,g as c,q as l,w as u}from"./data-BvTv-4oH.js";import{a as d,n as f}from"./words-CrqnRMW4.js";import{t as p}from"./emojis-XibTG-gy.js";import{t as m}from"./Spinner-B-iOhBZq.js";import{t as h}from"./Alert-CHZkhmDE.js";import{N as g,g as _,n as v,t as y}from"./index-Cu7ySznN.js";import{t as b}from"./ExplorerList-Cecr_ZQS.js";import{t as x}from"./channel-BScxZDq2.js";var S=t();function C(e){return(e??[]).filter(e=>!e.uriTemplate.includes(`{`)).map(e=>({label:e.label,uri:e.uriTemplate,kind:String(e.changeKind),...e.description===void 0?{}:{description:e.description},review:e.capabilities?.review!==void 0}))}var w=e=>e.find(e=>e.kind===`session`)??e[0];function T(e){let{before:t,after:n,diff:r}=e.edit,i=n?.uri??t?.uri??e.id,a=f(i),o=a.lastIndexOf(`/`);return{id:e.id,file:i,name:o<0?a:a.slice(o+1),dir:o<0?``:a.slice(0,o),status:t===void 0?`added`:n===void 0?`deleted`:`modified`,...r?.added===void 0?{}:{added:r.added},...r?.removed===void 0?{}:{removed:r.removed},reviewed:e.reviewed===!0,...t?.content.uri===void 0?{}:{before:t.content.uri},...n?.content.uri===void 0?{}:{after:n.content.uri}}}function E(e,t){if(t===null)return e;let n=f(t).replace(/\/+$/,``);return e===n?`.`:e.startsWith(`${n}/`)?e.slice(n.length+1):e}var D=e(),O={added:`ok`,modified:`fresh`,deleted:`failed`},k={added:`Added`,modified:`Changed`,deleted:`Deleted`},A=(e,t)=>e.scopes.map(String).includes(t);function j(){let e=r(),t=n(_),f=n(s)?.find(e=>e.resource===t),j=x(t,l),M=(0,S.useMemo)(()=>C(j.state?.changesets),[j.state?.changesets]),[N,P]=(0,S.useState)(void 0),F=M.find(e=>e.uri===N)??w(M),I=x(F?.uri,a),[L,R]=(0,S.useState)(null),z=f?.workingDirectories?.[0]??null;(0,S.useEffect)(()=>R(null),[F?.uri]);let B=async(t,n)=>{if(F===void 0)return;let r=d(t.confirmation);(r===``||await g({title:r,confirmLabel:t.label}))&&(R(null),u(`invokeChangesetOperation`,{channel:F.uri,operationId:t.id,...n===void 0?{}:{target:{kind:`resource`,resource:n.file}}}).then(t=>{let n=t;n?.message!==void 0&&R({tone:`info`,text:d(n.message)}),n?.followUp?.external===void 0?n?.followUp?.content!==void 0&&e.commands.execute(`ahp.openFile`,{uri:n.followUp.content.uri}):window.open(n.followUp.external,`_blank`,`noopener`)}).catch(e=>R({tone:`danger`,text:e instanceof Error?e.message:String(e)})))},V=t=>void e.commands.execute(`ahp.openDiff`,{file:t.file,...t.before===void 0?{}:{before:t.before},...t.after===void 0?{}:{after:t.after}}),H=(0,S.useMemo)(()=>(I.state?.files??[]).map(T),[I.state?.files]),U=I.state?.operations??[],W=(0,S.useMemo)(()=>H.map(t=>{let n=[{title:`Open change`,onSelect:e=>{e.closeMenu(),V(t)}}];t.status!==`deleted`&&(n.push({title:`Open file`,onSelect:n=>{n.closeMenu(),e.commands.execute(`ahp.openFile`,{uri:t.file})}}),n.push(...y(e,t.file,v(e,t.file)[0]?.component??null))),F?.review===!0&&n.push({title:t.reviewed?`Mark as not reviewed`:`Mark as reviewed`,onSelect:e=>{e.closeMenu(),F!==void 0&&c(F.uri,{type:`changeset/filesReviewChanged`,files:[t.id],reviewed:!t.reviewed})}});for(let e of U.filter(e=>A(e,`resource`)))n.push({title:e.label,group:`file`,...e.description===void 0?{}:{description:e.description},onSelect:n=>{n.closeMenu(),B(e,t)}});let r=t.added===void 0&&t.removed===void 0?k[t.status]:(0,D.jsxs)(D.Fragment,{children:[k[t.status],` `,(0,D.jsxs)(`span`,{className:`web-diff--add`,children:[`+`,t.added??0]}),` `,(0,D.jsxs)(`span`,{className:`web-diff--remove`,children:[`-`,t.removed??0]})]});return{key:t.id,dot:t.reviewed?`off`:O[t.status],dotLabel:t.reviewed?`${k[t.status]}, reviewed`:k[t.status],title:t.name,lines:[E(t.dir,z),r],menu:n,strong:!t.reviewed}}),[H,U,F?.uri,F?.review,z]),G=String(I.state?.status??``),K=U.filter(e=>A(e,`changeset`)),q=(0,D.jsxs)(D.Fragment,{children:[t===void 0?(0,D.jsx)(`p`,{className:`web-note web-explorer__empty`,children:`Open a session to see what it changed.`}):null,t!==void 0&&j.state!==void 0&&M.length===0?(0,D.jsx)(`p`,{className:`web-note web-explorer__empty`,children:`This session tracks no changes.`}):null,M.length>1?(0,D.jsx)(`select`,{className:`web-explorer__filter web-changes__scope`,"aria-label":`Which changes`,value:F?.uri??``,onChange:e=>P(e.target.value),children:M.map(e=>(0,D.jsx)(`option`,{value:e.uri,children:e.label},e.uri))}):null,K.length===0?null:(0,D.jsx)(`div`,{className:`web-changes__ops`,children:K.map(e=>(0,D.jsx)(i,{label:String(e.status)===`running`?`${e.label}\u{2026}`:e.label,size:`sm`,disabled:String(e.status)===`running`,onClick:()=>void B(e)},e.id))}),L===null?null:(0,D.jsx)(h,{tone:L.tone,message:L.text}),I.error===null?null:(0,D.jsx)(h,{tone:`danger`,title:`Changes not readable`,message:I.error}),I.state?.error===void 0?null:(0,D.jsx)(h,{tone:`danger`,message:I.state.error.message}),F!==void 0&&(I.state===void 0||G===`computing`)&&I.error===null?(0,D.jsx)(m,{label:`Working out the changes`}):null,I.state!==void 0&&G!==`computing`&&H.length===0?(0,D.jsx)(`p`,{className:`web-note web-explorer__empty`,children:`No changes.`}):null]});return(0,D.jsx)(b,{title:f===void 0?`Changes`:`Changes \u{00B7} ${f.title||`Untitled`}`,actions:F===void 0?[]:[{icon:p.reload,label:`Reload`,run:()=>void o(F.uri)}],rows:W,selected:null,onOpen:e=>{let t=H.find(t=>t.id===e);t!==void 0&&V(t)},notice:q,filterLabel:`Filter files`})}export{j as default};
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{t}from"./react-CybPckBe.js";import{t as n}from"./useStore-BQkzWMs-.js";import{n as r}from"./ScenaProvider-6A3TJumQ.js";import{G as i,S as a,d as o,n as s}from"./data-BvTv-4oH.js";import{t as c}from"./emojis-XibTG-gy.js";import{t as l}from"./Spinner-B-iOhBZq.js";import{t as u}from"./Alert-CHZkhmDE.js";import{c as d,d as f,f as p,j as m,l as h,p as g,s as _}from"./index-Cu7ySznN.js";import{t as v}from"./ExplorerList-Cecr_ZQS.js";import{t as y}from"./channel-BScxZDq2.js";import{i as b,n as x}from"./actions-DTKyI167.js";var S=t(),C=e(),w={running:`working`,failed:`failed`,on:`ok`,off:`off`},T={running:`Running`,failed:`Last run failed`,on:`On`,off:`Off`},E={pending:`waiting`,running:`running`,completed:`done`,failed:`failed`,cancelled:`stopped`},D=new Intl.DateTimeFormat(void 0,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`}),O=e=>{if(e===void 0)return``;let t=new Date(e);return Number.isNaN(t.getTime())?``:D.format(t)},k=e=>m(`The automation could not run`,e);function A(){let e=r(),{state:t,error:m}=y(o,i),D=n(s),A=n(g),j=t=>void e.commands.execute(`ahp.openAutomation`,{resource:t}),M=t=>void e.commands.execute(`ahp.editAutomation`,{resource:t}),N=(0,S.useMemo)(()=>[...t?.entries??[]].sort((e,t)=>f(e).localeCompare(f(t))).map(e=>{let t=h(e),n=d(e)[0],r=n===void 0?void 0:_(n),i=e.definition.session.provider,a=e.runCount??e.runs.length;return{key:e.resource,dot:w[t],dotLabel:T[t],title:f(e),...e.nextRunAt===void 0||!e.definition.enabled?{}:{time:O(e.nextRunAt)},lines:[[p(e),i].filter(e=>e!==void 0).join(` · `),r===void 0?`Never run`:`${a} ${a===1?`run`:`runs`} \u{00B7} last ${E[r.status]??r.status} ${O(r.at)}`],menu:x(e,()=>j(e.resource),()=>M(e.resource)),...e.operations.map(String).includes(`run`)?{action:{icon:c.run,label:`Run now`,run:()=>void b(e).catch(k)}}:{}}}),[t]),P=m===null?t===void 0?(0,C.jsx)(l,{label:`Reading the automations`}):N.length===0?(0,C.jsx)(`p`,{className:`web-note web-explorer__empty`,children:`No automations yet.`}):null:(0,C.jsx)(u,{tone:`danger`,title:`No automations`,message:m});return(0,C.jsx)(v,{title:`Automations`,actions:[...D?.create===void 0?[]:[{icon:`+`,label:`New automation`,run:()=>void e.commands.execute(`ahp.newAutomation`)}],{icon:c.reload,label:`Reload`,run:()=>void a(o)}],rows:N,selected:A??null,onOpen:j,notice:P,filterLabel:`Filter automations`})}export{A as default};
@@ -0,0 +1 @@
1
+ import{t as e}from"./jsx-runtime-BguD1OXD.js";import{t}from"./react-CybPckBe.js";import{t as n}from"./useStore-BQkzWMs-.js";import{n as r}from"./ScenaProvider-6A3TJumQ.js";import"./data-BvTv-4oH.js";import{h as i}from"./index-Cu7ySznN.js";import{t as a}from"./ExplorerList-Cecr_ZQS.js";import{a as o,i as s}from"./words-BMjqrsOT.js";var c=t(),l=e();function u(){let e=r(),t=n(`$/ahp/agents`)??[],u=n(`$/ahp/sessions`)??[],d=n(i),f=t=>void e.commands.execute(`ahp.openAgent`,{provider:t}),p=t=>void e.commands.execute(`ahp.newSession`,{provider:t}),m=(0,c.useMemo)(()=>t.map(e=>{let t=u.filter(t=>t.provider===e.provider).length,n=o(e).some(e=>e.required);return{key:e.provider,dot:`ok`,dotLabel:`Offered`,title:e.displayName,lines:[[s(e),t===1?`1 session`:`${t} sessions`,n?`needs sign-in`:void 0].filter(e=>e!==void 0).join(` · `),...e.description===``?[]:[e.description]],menu:[{title:`Open`,onSelect:t=>{t.closeMenu(),f(e.provider)}},{title:`New session`,onSelect:t=>{t.closeMenu(),p(e.provider)}}]}}),[t,u]);return(0,l.jsx)(a,{title:`Agents`,actions:[],rows:m,selected:d??null,onOpen:f,notice:m.length===0?(0,l.jsx)(`p`,{className:`web-note web-explorer__empty`,children:`This daemon offers no agent.`}):null,filterLabel:`Filter agents`})}export{u as default};