@chrysb/alphaclaw 0.8.1 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/README.md +32 -24
  2. package/bin/alphaclaw.js +13 -2
  3. package/lib/public/css/tailwind.generated.css +1 -0
  4. package/lib/public/css/tailwind.input.css +3 -0
  5. package/lib/public/css/theme.css +28 -0
  6. package/lib/public/css/vendor/xterm.css +218 -0
  7. package/lib/public/dist/app.bundle.js +10514 -0
  8. package/lib/public/dist/chunks/addon-fit-W4YZGRNV.js +1 -0
  9. package/lib/public/dist/chunks/chunk-72ZECFVW.js +1 -0
  10. package/lib/public/dist/chunks/xterm-KOX4YMOF.js +9 -0
  11. package/lib/public/js/app.js +4 -4
  12. package/lib/public/js/components/action-button.js +8 -8
  13. package/lib/public/js/components/add-channel-menu.js +2 -2
  14. package/lib/public/js/components/agent-send-modal.js +6 -6
  15. package/lib/public/js/components/agents-tab/agent-bindings-section/channel-item-trailing.js +7 -7
  16. package/lib/public/js/components/agents-tab/agent-bindings-section/index.js +3 -3
  17. package/lib/public/js/components/agents-tab/agent-bindings-section/use-agent-bindings.js +1 -1
  18. package/lib/public/js/components/agents-tab/agent-bindings-section/use-channel-items.js +4 -4
  19. package/lib/public/js/components/agents-tab/agent-detail-panel.js +5 -5
  20. package/lib/public/js/components/agents-tab/agent-identity-section.js +18 -18
  21. package/lib/public/js/components/agents-tab/agent-overview/index.js +2 -2
  22. package/lib/public/js/components/agents-tab/agent-overview/manage-card.js +2 -2
  23. package/lib/public/js/components/agents-tab/agent-overview/model-card.js +8 -8
  24. package/lib/public/js/components/agents-tab/agent-overview/tools-card.js +5 -5
  25. package/lib/public/js/components/agents-tab/agent-overview/use-model-card.js +1 -1
  26. package/lib/public/js/components/agents-tab/agent-overview/use-workspace-card.js +1 -1
  27. package/lib/public/js/components/agents-tab/agent-overview/workspace-card.js +4 -4
  28. package/lib/public/js/components/agents-tab/agent-pairing-section.js +4 -4
  29. package/lib/public/js/components/agents-tab/agent-tools/index.js +5 -5
  30. package/lib/public/js/components/agents-tab/agent-tools/use-agent-tools.js +1 -1
  31. package/lib/public/js/components/agents-tab/create-agent-modal.js +13 -13
  32. package/lib/public/js/components/agents-tab/create-channel-modal.js +34 -34
  33. package/lib/public/js/components/agents-tab/delete-agent-dialog.js +3 -3
  34. package/lib/public/js/components/agents-tab/edit-agent-modal.js +9 -9
  35. package/lib/public/js/components/agents-tab/index.js +3 -3
  36. package/lib/public/js/components/agents-tab/use-agents.js +1 -1
  37. package/lib/public/js/components/badge.js +6 -6
  38. package/lib/public/js/components/channel-account-status-badge.js +2 -2
  39. package/lib/public/js/components/channel-operations-panel.js +2 -2
  40. package/lib/public/js/components/channels.js +9 -9
  41. package/lib/public/js/components/confirm-dialog.js +5 -5
  42. package/lib/public/js/components/credentials-modal.js +22 -22
  43. package/lib/public/js/components/cron-tab/cron-calendar.js +6 -6
  44. package/lib/public/js/components/cron-tab/cron-insights-panel.js +10 -10
  45. package/lib/public/js/components/cron-tab/cron-job-detail.js +4 -4
  46. package/lib/public/js/components/cron-tab/cron-job-list.js +4 -4
  47. package/lib/public/js/components/cron-tab/cron-job-settings-card.js +15 -15
  48. package/lib/public/js/components/cron-tab/cron-job-trends-panel.js +5 -5
  49. package/lib/public/js/components/cron-tab/cron-job-usage.js +16 -16
  50. package/lib/public/js/components/cron-tab/cron-overview.js +10 -10
  51. package/lib/public/js/components/cron-tab/cron-prompt-editor.js +3 -3
  52. package/lib/public/js/components/cron-tab/cron-run-history-panel.js +39 -39
  53. package/lib/public/js/components/cron-tab/cron-runs-trend-card.js +4 -4
  54. package/lib/public/js/components/cron-tab/index.js +5 -5
  55. package/lib/public/js/components/cron-tab/use-cron-tab.js +1 -1
  56. package/lib/public/js/components/device-pairings.js +12 -12
  57. package/lib/public/js/components/doctor/findings-list.js +22 -22
  58. package/lib/public/js/components/doctor/fix-card-modal.js +2 -2
  59. package/lib/public/js/components/doctor/general-warning.js +5 -5
  60. package/lib/public/js/components/doctor/index.js +26 -26
  61. package/lib/public/js/components/doctor/summary-cards.js +5 -5
  62. package/lib/public/js/components/envars.js +16 -16
  63. package/lib/public/js/components/features.js +4 -4
  64. package/lib/public/js/components/file-tree.js +4 -4
  65. package/lib/public/js/components/file-viewer/diff-viewer.js +2 -2
  66. package/lib/public/js/components/file-viewer/editor-surface.js +2 -2
  67. package/lib/public/js/components/file-viewer/frontmatter-panel.js +2 -2
  68. package/lib/public/js/components/file-viewer/index.js +3 -3
  69. package/lib/public/js/components/file-viewer/markdown-split-view.js +2 -2
  70. package/lib/public/js/components/file-viewer/media-preview.js +2 -2
  71. package/lib/public/js/components/file-viewer/scroll-sync.js +1 -1
  72. package/lib/public/js/components/file-viewer/sqlite-viewer.js +2 -2
  73. package/lib/public/js/components/file-viewer/status-banners.js +2 -2
  74. package/lib/public/js/components/file-viewer/toolbar.js +2 -2
  75. package/lib/public/js/components/file-viewer/use-editor-line-number-sync.js +1 -1
  76. package/lib/public/js/components/file-viewer/use-editor-selection-restore.js +1 -1
  77. package/lib/public/js/components/file-viewer/use-file-diff.js +1 -1
  78. package/lib/public/js/components/file-viewer/use-file-loader.js +1 -1
  79. package/lib/public/js/components/file-viewer/use-file-viewer-draft-sync.js +1 -1
  80. package/lib/public/js/components/file-viewer/use-file-viewer-hotkeys.js +1 -1
  81. package/lib/public/js/components/file-viewer/use-file-viewer.js +2 -2
  82. package/lib/public/js/components/gateway.js +12 -12
  83. package/lib/public/js/components/general/index.js +7 -7
  84. package/lib/public/js/components/general/use-general-tab.js +1 -1
  85. package/lib/public/js/components/global-restart-banner.js +2 -2
  86. package/lib/public/js/components/google/account-row.js +7 -7
  87. package/lib/public/js/components/google/add-account-modal.js +8 -8
  88. package/lib/public/js/components/google/gmail-setup-wizard.js +24 -24
  89. package/lib/public/js/components/google/gmail-watch-toggle.js +5 -5
  90. package/lib/public/js/components/google/index.js +6 -6
  91. package/lib/public/js/components/google/use-gmail-watch.js +1 -1
  92. package/lib/public/js/components/google/use-google-accounts.js +1 -1
  93. package/lib/public/js/components/icons.js +2 -2
  94. package/lib/public/js/components/info-tooltip.js +3 -3
  95. package/lib/public/js/components/loading-spinner.js +2 -2
  96. package/lib/public/js/components/modal-shell.js +5 -5
  97. package/lib/public/js/components/models-tab/index.js +11 -11
  98. package/lib/public/js/components/models-tab/model-picker.js +9 -9
  99. package/lib/public/js/components/models-tab/provider-auth-card.js +12 -12
  100. package/lib/public/js/components/models-tab/use-models.js +1 -1
  101. package/lib/public/js/components/models.js +18 -18
  102. package/lib/public/js/components/nodes-tab/browser-attach/index.js +5 -5
  103. package/lib/public/js/components/nodes-tab/connected-nodes/index.js +32 -32
  104. package/lib/public/js/components/nodes-tab/connected-nodes/use-connected-nodes-card.js +18 -3
  105. package/lib/public/js/components/nodes-tab/exec-allowlist/index.js +10 -10
  106. package/lib/public/js/components/nodes-tab/exec-allowlist/use-exec-allowlist.js +1 -1
  107. package/lib/public/js/components/nodes-tab/exec-config/index.js +13 -13
  108. package/lib/public/js/components/nodes-tab/exec-config/use-exec-config.js +1 -1
  109. package/lib/public/js/components/nodes-tab/index.js +2 -2
  110. package/lib/public/js/components/nodes-tab/setup-wizard/index.js +14 -14
  111. package/lib/public/js/components/nodes-tab/setup-wizard/use-setup-wizard.js +1 -1
  112. package/lib/public/js/components/nodes-tab/use-nodes-tab.js +1 -1
  113. package/lib/public/js/components/onboarding/use-welcome-codex.js +1 -1
  114. package/lib/public/js/components/onboarding/use-welcome-pairing.js +1 -1
  115. package/lib/public/js/components/onboarding/use-welcome-storage.js +1 -1
  116. package/lib/public/js/components/onboarding/welcome-config.js +3 -3
  117. package/lib/public/js/components/onboarding/welcome-form-step.js +34 -34
  118. package/lib/public/js/components/onboarding/welcome-header.js +2 -2
  119. package/lib/public/js/components/onboarding/welcome-import-step.js +22 -22
  120. package/lib/public/js/components/onboarding/welcome-pairing-step.js +15 -15
  121. package/lib/public/js/components/onboarding/welcome-placeholder-review-step.js +7 -7
  122. package/lib/public/js/components/onboarding/welcome-pre-step.js +9 -9
  123. package/lib/public/js/components/onboarding/welcome-secret-review-step.js +15 -15
  124. package/lib/public/js/components/onboarding/welcome-setup-step.js +8 -8
  125. package/lib/public/js/components/overflow-menu.js +3 -3
  126. package/lib/public/js/components/page-header.js +2 -2
  127. package/lib/public/js/components/pairings.js +14 -14
  128. package/lib/public/js/components/pane-shell.js +2 -2
  129. package/lib/public/js/components/pill-tabs.js +4 -4
  130. package/lib/public/js/components/pop-actions.js +3 -3
  131. package/lib/public/js/components/providers.js +17 -17
  132. package/lib/public/js/components/routes/agents-route.js +2 -2
  133. package/lib/public/js/components/routes/browse-route.js +2 -2
  134. package/lib/public/js/components/routes/cron-route.js +2 -2
  135. package/lib/public/js/components/routes/doctor-route.js +2 -2
  136. package/lib/public/js/components/routes/envars-route.js +2 -2
  137. package/lib/public/js/components/routes/general-route.js +2 -2
  138. package/lib/public/js/components/routes/models-route.js +2 -2
  139. package/lib/public/js/components/routes/nodes-route.js +2 -2
  140. package/lib/public/js/components/routes/providers-route.js +2 -2
  141. package/lib/public/js/components/routes/route-redirect.js +2 -2
  142. package/lib/public/js/components/routes/telegram-route.js +2 -2
  143. package/lib/public/js/components/routes/usage-route.js +2 -2
  144. package/lib/public/js/components/routes/watchdog-route.js +2 -2
  145. package/lib/public/js/components/routes/webhooks-route.js +2 -2
  146. package/lib/public/js/components/scope-picker.js +9 -9
  147. package/lib/public/js/components/secret-input.js +5 -5
  148. package/lib/public/js/components/segmented-control.js +2 -2
  149. package/lib/public/js/components/session-select-field.js +7 -7
  150. package/lib/public/js/components/sidebar-git-panel.js +3 -3
  151. package/lib/public/js/components/sidebar.js +3 -3
  152. package/lib/public/js/components/summary-stat-card.js +3 -3
  153. package/lib/public/js/components/telegram-workspace/index.js +10 -10
  154. package/lib/public/js/components/telegram-workspace/manage.js +36 -36
  155. package/lib/public/js/components/telegram-workspace/onboarding.js +73 -73
  156. package/lib/public/js/components/toast.js +8 -8
  157. package/lib/public/js/components/toggle-switch.js +2 -2
  158. package/lib/public/js/components/tooltip.js +5 -5
  159. package/lib/public/js/components/update-action-button.js +2 -2
  160. package/lib/public/js/components/update-modal.js +9 -9
  161. package/lib/public/js/components/usage-tab/constants.js +2 -2
  162. package/lib/public/js/components/usage-tab/index.js +3 -3
  163. package/lib/public/js/components/usage-tab/overview-section.js +15 -15
  164. package/lib/public/js/components/usage-tab/sessions-section.js +19 -19
  165. package/lib/public/js/components/usage-tab/use-usage-tab.js +2 -2
  166. package/lib/public/js/components/watchdog-tab/console/index.js +22 -8
  167. package/lib/public/js/components/watchdog-tab/console/use-console.js +28 -2
  168. package/lib/public/js/components/watchdog-tab/helpers.js +35 -6
  169. package/lib/public/js/components/watchdog-tab/incidents/index.js +6 -6
  170. package/lib/public/js/components/watchdog-tab/incidents/use-incidents.js +1 -1
  171. package/lib/public/js/components/watchdog-tab/index.js +4 -2
  172. package/lib/public/js/components/watchdog-tab/resource-bar.js +5 -5
  173. package/lib/public/js/components/watchdog-tab/resources/index.js +14 -3
  174. package/lib/public/js/components/watchdog-tab/resources/use-resources.js +1 -1
  175. package/lib/public/js/components/watchdog-tab/settings/index.js +97 -30
  176. package/lib/public/js/components/watchdog-tab/settings/use-settings.js +1 -1
  177. package/lib/public/js/components/watchdog-tab/terminal/index.js +3 -3
  178. package/lib/public/js/components/watchdog-tab/terminal/use-terminal.js +41 -5
  179. package/lib/public/js/components/watchdog-tab/use-watchdog-tab.js +2 -0
  180. package/lib/public/js/components/webhooks/create-webhook-modal/index.js +17 -17
  181. package/lib/public/js/components/webhooks/helpers.js +3 -3
  182. package/lib/public/js/components/webhooks/index.js +4 -4
  183. package/lib/public/js/components/webhooks/request-history/index.js +14 -14
  184. package/lib/public/js/components/webhooks/request-history/use-request-history.js +1 -1
  185. package/lib/public/js/components/webhooks/webhook-detail/index.js +41 -41
  186. package/lib/public/js/components/webhooks/webhook-detail/use-webhook-detail.js +1 -1
  187. package/lib/public/js/components/webhooks/webhook-list/index.js +11 -11
  188. package/lib/public/js/components/webhooks/webhook-list/use-webhook-list.js +1 -1
  189. package/lib/public/js/components/welcome/index.js +3 -3
  190. package/lib/public/js/components/welcome/use-welcome.js +10 -10
  191. package/lib/public/js/hooks/use-app-shell-controller.js +1 -1
  192. package/lib/public/js/hooks/use-app-shell-ui.js +1 -1
  193. package/lib/public/js/hooks/use-browse-navigation.js +1 -1
  194. package/lib/public/js/hooks/use-cached-fetch.js +1 -1
  195. package/lib/public/js/hooks/use-destination-session-selection.js +1 -1
  196. package/lib/public/js/hooks/use-hash-location.js +1 -1
  197. package/lib/public/js/hooks/useAgentSessions.js +1 -1
  198. package/lib/public/js/hooks/usePolling.js +1 -1
  199. package/lib/public/js/tailwind-config.js +39 -0
  200. package/lib/public/login.html +3 -18
  201. package/lib/public/setup.html +2 -18
  202. package/lib/server/init/register-server-routes.js +2 -0
  203. package/lib/server/routes/nodes.js +10 -2
  204. package/lib/server/routes/pairings.js +5 -1
  205. package/lib/server/routes/system.js +5 -0
  206. package/lib/server/routes/watchdog.js +15 -0
  207. package/lib/server/watchdog.js +137 -51
  208. package/lib/server.js +2 -0
  209. package/package.json +14 -3
@@ -1,6 +1,6 @@
1
- import { h } from "https://esm.sh/preact";
2
- import { useState } from "https://esm.sh/preact/hooks";
3
- import htm from "https://esm.sh/htm";
1
+ import { h } from "preact";
2
+ import { useState } from "preact/hooks";
3
+ import htm from "htm";
4
4
  import { ActionButton } from "../action-button.js";
5
5
  import { LoadingSpinner } from "../loading-spinner.js";
6
6
  import { buildApprovedImportSecrets } from "./welcome-secret-review-utils.js";
@@ -100,11 +100,11 @@ const CategoryCard = ({ category, data }) => {
100
100
  >
101
101
  <div class="flex items-center gap-2">
102
102
  <span class="text-sm">${category.icon}</span>
103
- <span class="text-xs font-medium text-gray-200"
103
+ <span class="text-xs font-medium text-body"
104
104
  >${category.label}</span
105
105
  >
106
106
  <span
107
- class="text-xs px-1.5 py-0.5 rounded-full bg-cyan-900/40 text-cyan-300"
107
+ class="text-xs px-1.5 py-0.5 rounded-full bg-status-info-bg text-status-info"
108
108
  >${count}</span
109
109
  >
110
110
  </div>
@@ -112,13 +112,13 @@ const CategoryCard = ({ category, data }) => {
112
112
  ${warningCount > 0
113
113
  ? html`
114
114
  <span
115
- class="text-xs px-1.5 py-0.5 rounded-full bg-yellow-900/30 text-yellow-300"
115
+ class="text-xs px-1.5 py-0.5 rounded-full bg-status-warning-bg text-status-warning"
116
116
  >
117
117
  ⚠ ${warningCount}
118
118
  </span>
119
119
  `
120
120
  : null}
121
- <span class="text-xs text-gray-500">${expanded ? "▲" : "▼"}</span>
121
+ <span class="text-xs text-fg-muted">${expanded ? "▲" : "▼"}</span>
122
122
  </div>
123
123
  </button>
124
124
  ${expanded &&
@@ -128,7 +128,7 @@ const CategoryCard = ({ category, data }) => {
128
128
  ${items.map(
129
129
  (item) => html`
130
130
  <div
131
- class="text-xs font-mono bg-black/20 rounded px-2 py-1 text-gray-500"
131
+ class="text-xs font-mono bg-field rounded px-2 py-1 text-fg-muted"
132
132
  >
133
133
  ${item}
134
134
  </div>
@@ -138,7 +138,7 @@ const CategoryCard = ({ category, data }) => {
138
138
  ? warningItems.map(
139
139
  (warning) => html`
140
140
  <div
141
- class="text-xs font-mono bg-black/20 rounded px-2 py-1 text-yellow-300"
141
+ class="text-xs font-mono bg-field rounded px-2 py-1 text-status-warning"
142
142
  >
143
143
  ${warning.actualPath}
144
144
  </div>
@@ -163,7 +163,7 @@ export const WelcomeImportStep = ({
163
163
  return html`
164
164
  <div class="flex flex-col items-center justify-center py-8 gap-3">
165
165
  <${LoadingSpinner} />
166
- <p class="text-sm text-gray-400">Scanning repository...</p>
166
+ <p class="text-sm text-fg-muted">Scanning repository...</p>
167
167
  </div>
168
168
  `;
169
169
  }
@@ -172,7 +172,7 @@ export const WelcomeImportStep = ({
172
172
  return html`
173
173
  <div class="space-y-3">
174
174
  <div
175
- class="bg-red-900/30 border border-red-800 rounded-xl p-3 text-red-300 text-sm"
175
+ class="bg-status-error-bg border border-status-error-border rounded-xl p-3 text-status-error text-sm"
176
176
  >
177
177
  ${error}
178
178
  </div>
@@ -194,8 +194,8 @@ export const WelcomeImportStep = ({
194
194
  return html`
195
195
  <div class="space-y-3">
196
196
  <div>
197
- <h2 class="text-sm font-medium text-gray-200">Import Summary</h2>
198
- <p class="text-xs text-gray-500">
197
+ <h2 class="text-sm font-medium text-body">Import Summary</h2>
198
+ <p class="text-xs text-fg-muted">
199
199
  ${scanResult.hasOpenclawSetup
200
200
  ? "Found an existing OpenClaw setup"
201
201
  : "No OpenClaw config detected — we'll set up fresh after import"}
@@ -217,7 +217,7 @@ export const WelcomeImportStep = ({
217
217
  ${scanResult.credentials?.found &&
218
218
  html`
219
219
  <div
220
- class="bg-yellow-900/20 border border-yellow-800/50 rounded-lg p-3 text-xs text-yellow-300"
220
+ class="bg-status-warning-bg border border-status-warning-border rounded-lg p-3 text-xs text-status-warning"
221
221
  >
222
222
  Deployment-specific files found (credentials, device identity) — these
223
223
  will not be imported.
@@ -226,7 +226,7 @@ export const WelcomeImportStep = ({
226
226
  ${hasConflicts &&
227
227
  html`
228
228
  <div
229
- class="bg-yellow-900/20 border border-yellow-800/50 rounded-lg p-3 text-xs text-yellow-300"
229
+ class="bg-status-warning-bg border border-status-warning-border rounded-lg p-3 text-xs text-status-warning"
230
230
  >
231
231
  AlphaClaw-managed files detected
232
232
  (${(scanResult.managedConflicts.files || []).join(", ")}). These will
@@ -236,7 +236,7 @@ export const WelcomeImportStep = ({
236
236
  ${scanResult.managedEnvConflicts?.found
237
237
  ? html`
238
238
  <div
239
- class="bg-yellow-900/20 border border-yellow-800/50 rounded-lg p-3 text-xs text-yellow-300"
239
+ class="bg-status-warning-bg border border-status-warning-border rounded-lg p-3 text-xs text-status-warning"
240
240
  >
241
241
  AlphaClaw controls deployment tokens and env vars
242
242
  (${(scanResult.managedEnvConflicts.vars || []).join(", ")}).
@@ -248,14 +248,14 @@ export const WelcomeImportStep = ({
248
248
  ${scanResult.webhooks?.warningCount > 0
249
249
  ? html`
250
250
  <div
251
- class="bg-yellow-900/20 border border-yellow-800/50 rounded-lg p-3 text-xs text-yellow-300"
251
+ class="bg-status-warning-bg border border-status-warning-border rounded-lg p-3 text-xs text-status-warning"
252
252
  >
253
253
  AlphaClaw expects hook transforms at
254
- <code class="text-xs bg-black/30 px-1 rounded"
254
+ <code class="text-xs bg-field px-1 rounded"
255
255
  >hooks/transforms/name/name-transform.mjs</code
256
256
  >. We found some that do not match and will try to patch them
257
257
  during import. The originals will be backed up under
258
- <code class="text-xs bg-black/30 px-1 rounded"
258
+ <code class="text-xs bg-field px-1 rounded"
259
259
  >hooks/transforms/_backup</code
260
260
  >.
261
261
  </div>
@@ -264,13 +264,13 @@ export const WelcomeImportStep = ({
264
264
  ${secretCount > 0 &&
265
265
  html`
266
266
  <div
267
- class="bg-cyan-900/20 border border-cyan-800/50 rounded-lg p-3 flex items-center justify-between"
267
+ class="bg-status-info-bg border border-status-info-border rounded-lg p-3 flex items-center justify-between"
268
268
  >
269
269
  <div>
270
- <span class="text-xs text-cyan-300 font-medium">
270
+ <span class="text-xs text-status-info font-medium">
271
271
  ${`${secretCount} possible secret${secretCount === 1 ? "" : "s"} detected`}
272
272
  </span>
273
- <p class="text-xs text-gray-500 mt-0.5">
273
+ <p class="text-xs text-fg-muted mt-0.5">
274
274
  Review and extract to environment variables
275
275
  </p>
276
276
  </div>
@@ -1,6 +1,6 @@
1
- import { h } from "https://esm.sh/preact";
2
- import { useState } from "https://esm.sh/preact/hooks";
3
- import htm from "https://esm.sh/htm";
1
+ import { h } from "preact";
2
+ import { useState } from "preact/hooks";
3
+ import htm from "htm";
4
4
  import { Badge } from "../badge.js";
5
5
 
6
6
  const html = htm.bind(h);
@@ -38,18 +38,18 @@ const PairingRow = ({ pairing, onApprove, onReject }) => {
38
38
  };
39
39
 
40
40
  return html`
41
- <div class="bg-black/30 rounded-lg p-3 mb-2">
41
+ <div class="bg-field rounded-lg p-3 mb-2">
42
42
  <div class="flex items-center justify-between gap-2 mb-2">
43
43
  <div class="font-medium text-sm">
44
44
  ${pairing.code || pairing.id || "Pending request"}
45
45
  </div>
46
46
  <span
47
- class="text-[11px] px-2 py-0.5 rounded-full border border-border text-gray-400"
47
+ class="text-[11px] px-2 py-0.5 rounded-full border border-border text-fg-muted"
48
48
  >
49
49
  Request
50
50
  </span>
51
51
  </div>
52
- <p class="text-xs text-gray-500 mb-3">
52
+ <p class="text-xs text-fg-muted mb-3">
53
53
  Approve to connect this account and finish setup.
54
54
  </p>
55
55
  <div class="flex gap-2">
@@ -99,7 +99,7 @@ export const WelcomePairingStep = ({
99
99
  if (!channel) {
100
100
  return html`
101
101
  <div
102
- class="bg-red-900/30 border border-red-800 rounded-xl p-3 text-red-300 text-sm"
102
+ class="bg-status-error-bg border border-status-error-border rounded-xl p-3 text-status-error text-sm"
103
103
  >
104
104
  Missing channel configuration. Go back and add a Telegram or Discord bot
105
105
  token.
@@ -112,14 +112,14 @@ export const WelcomePairingStep = ({
112
112
  <div class="min-h-[300px] pb-6 px-6 flex flex-col">
113
113
  <div class="flex-1 flex items-center justify-center text-center">
114
114
  <div class="space-y-3 max-w-xl mx-auto">
115
- <p class="text-sm font-medium text-green-300 mb-12">
115
+ <p class="text-sm font-medium text-status-success mb-12">
116
116
  🎉 Setup complete
117
117
  </p>
118
- <p class="text-xs text-gray-300">
119
- Your ${channelMeta.label} channel is connected. You can switch to
120
- ${channelMeta.label} and start using your agent now.
118
+ <p class="text-xs text-body">
119
+ Your ${channelMeta.label} channel is connected. You can switch
120
+ to ${channelMeta.label} and start using your agent now.
121
121
  </p>
122
- <p class="text-xs text-gray-500 font-normal opacity-85">
122
+ <p class="text-xs text-fg-muted font-normal opacity-85">
123
123
  Continue to the dashboard to explore extras like Google Workspace
124
124
  and additional integrations.
125
125
  </p>
@@ -175,10 +175,10 @@ export const WelcomePairingStep = ({
175
175
  class="w-8 h-8 mx-auto rounded-md"
176
176
  />`
177
177
  : null}
178
- <p class="text-gray-300 text-sm">
178
+ <p class="text-body text-sm">
179
179
  Send a message to your ${channelMeta.label} bot
180
180
  </p>
181
- <p class="text-gray-600 text-xs">
181
+ <p class="text-fg-dim text-xs">
182
182
  The pairing request will appear here in 5-10 seconds
183
183
  </p>
184
184
  </div>
@@ -188,7 +188,7 @@ export const WelcomePairingStep = ({
188
188
  ${
189
189
  error
190
190
  ? html`<div
191
- class="bg-red-900/30 border border-red-800 rounded-xl p-3 text-red-300 text-sm"
191
+ class="bg-status-error-bg border border-status-error-border rounded-xl p-3 text-status-error text-sm"
192
192
  >
193
193
  ${error}
194
194
  </div>`
@@ -1,6 +1,6 @@
1
- import { h } from "https://esm.sh/preact";
2
- import { useMemo } from "https://esm.sh/preact/hooks";
3
- import htm from "https://esm.sh/htm";
1
+ import { h } from "preact";
2
+ import { useMemo } from "preact/hooks";
3
+ import htm from "htm";
4
4
  import { ActionButton } from "../action-button.js";
5
5
  import { SecretInput } from "../secret-input.js";
6
6
 
@@ -18,7 +18,7 @@ const PlaceholderRow = ({ item, value, onInput }) => {
18
18
  <div class="min-w-0">
19
19
  <div class="flex items-center gap-2 flex-wrap">
20
20
  <code
21
- class="text-xs text-gray-200 bg-black/30 px-1.5 py-0.5 rounded"
21
+ class="text-xs text-body bg-field px-1.5 py-0.5 rounded"
22
22
  >${item.key}</code
23
23
  >
24
24
  </div>
@@ -28,7 +28,7 @@ const PlaceholderRow = ({ item, value, onInput }) => {
28
28
  value=${value}
29
29
  onInput=${(event) => onInput(event.target.value)}
30
30
  placeholder="Enter value"
31
- inputClass="w-full bg-black/30 border border-border rounded-lg px-3 py-2 text-xs text-gray-200 outline-none focus:border-gray-500 font-mono"
31
+ inputClass="w-full bg-field border border-border rounded-lg px-3 py-2 text-xs text-body outline-none focus:border-fg-muted font-mono"
32
32
  />
33
33
  </div>
34
34
  `;
@@ -57,7 +57,7 @@ export const WelcomePlaceholderReviewStep = ({
57
57
  return html`
58
58
  <div class="space-y-3">
59
59
  <div>
60
- <h2 class="text-sm font-medium text-gray-200">Add Missing Env Vars</h2>
60
+ <h2 class="text-sm font-medium text-body">Add Missing Env Vars</h2>
61
61
  </div>
62
62
 
63
63
  <div class="space-y-2 max-h-80 overflow-y-auto">
@@ -76,7 +76,7 @@ export const WelcomePlaceholderReviewStep = ({
76
76
  </div>
77
77
 
78
78
  <div
79
- class="bg-yellow-900/20 border border-yellow-800/50 rounded-lg p-3 text-xs text-yellow-300"
79
+ class="bg-status-warning-bg border border-status-warning-border rounded-lg p-3 text-xs text-status-warning"
80
80
  >
81
81
  ${unresolvedCount > 0
82
82
  ? `${unresolvedCount} detected env var${unresolvedCount === 1 ? "" : "s"} need values. You can continue without them, but the gateway might fail to start.`
@@ -1,5 +1,5 @@
1
- import { h } from "https://esm.sh/preact";
2
- import htm from "https://esm.sh/htm";
1
+ import { h } from "preact";
2
+ import htm from "htm";
3
3
  import { kGithubFlowFresh, kGithubFlowImport } from "./welcome-config.js";
4
4
 
5
5
  const html = htm.bind(h);
@@ -13,7 +13,7 @@ export const WelcomePreStep = ({ onSelectFlow }) => {
13
13
  class="w-full flex items-center gap-4 text-left p-4 rounded-xl ac-path-card"
14
14
  >
15
15
  <div
16
- class="ac-path-icon flex-shrink-0 w-10 h-10 flex items-center justify-center bg-black/30 rounded-lg border border-border text-gray-300"
16
+ class="ac-path-icon flex-shrink-0 w-10 h-10 flex items-center justify-center bg-field rounded-lg border border-border text-body"
17
17
  >
18
18
  <svg
19
19
  xmlns="http://www.w3.org/2000/svg"
@@ -28,12 +28,12 @@ export const WelcomePreStep = ({ onSelectFlow }) => {
28
28
  </div>
29
29
  <div>
30
30
  <div
31
- class="ac-path-title text-sm font-medium text-gray-200 mb-0.5 transition-colors duration-150"
31
+ class="ac-path-title text-sm font-medium text-body mb-0.5 transition-colors duration-150"
32
32
  >
33
33
  Start fresh
34
34
  </div>
35
35
  <div
36
- class="ac-path-desc text-xs text-gray-500 transition-colors duration-150"
36
+ class="ac-path-desc text-xs text-fg-muted transition-colors duration-150"
37
37
  >
38
38
  Create a new repository and set up your agent from scratch.
39
39
  </div>
@@ -46,7 +46,7 @@ export const WelcomePreStep = ({ onSelectFlow }) => {
46
46
  class="w-full flex items-center gap-4 text-left p-4 rounded-xl ac-path-card"
47
47
  >
48
48
  <div
49
- class="ac-path-icon flex-shrink-0 w-10 h-10 flex items-center justify-center bg-black/30 rounded-lg border border-border text-gray-300"
49
+ class="ac-path-icon flex-shrink-0 w-10 h-10 flex items-center justify-center bg-field rounded-lg border border-border text-body"
50
50
  >
51
51
  <svg
52
52
  xmlns="http://www.w3.org/2000/svg"
@@ -66,16 +66,16 @@ export const WelcomePreStep = ({ onSelectFlow }) => {
66
66
  <div class="flex-1 min-w-0">
67
67
  <div class="flex items-center gap-2 mb-0.5">
68
68
  <div
69
- class="ac-path-title text-sm font-medium text-gray-200 transition-colors duration-150"
69
+ class="ac-path-title text-sm font-medium text-body transition-colors duration-150"
70
70
  >
71
71
  Import existing setup
72
72
  </div>
73
- <span class="shrink-0 ml-1 text-[11px] text-yellow-300">
73
+ <span class="shrink-0 ml-1 text-[11px] text-status-warning">
74
74
  Experimental
75
75
  </span>
76
76
  </div>
77
77
  <div
78
- class="ac-path-desc text-xs text-gray-500 transition-colors duration-150"
78
+ class="ac-path-desc text-xs text-fg-muted transition-colors duration-150"
79
79
  >
80
80
  Connect an existing repository that already has an OpenClaw setup.
81
81
  </div>
@@ -1,6 +1,6 @@
1
- import { h } from "https://esm.sh/preact";
2
- import { useState, useCallback } from "https://esm.sh/preact/hooks";
3
- import htm from "https://esm.sh/htm";
1
+ import { h } from "preact";
2
+ import { useState, useCallback } from "preact/hooks";
3
+ import htm from "htm";
4
4
  import { ActionButton } from "../action-button.js";
5
5
  import { LoadingSpinner } from "../loading-spinner.js";
6
6
  import { buildApprovedImportSecrets } from "./welcome-secret-review-utils.js";
@@ -11,7 +11,7 @@ const SecretRow = ({ secret, selected, onToggle, envVarName, onEnvVarChange }) =
11
11
  html`
12
12
  <div
13
13
  class="border border-border rounded-lg p-3 space-y-2 ${selected
14
- ? "bg-cyan-900/10 border-cyan-800/40"
14
+ ? "bg-status-info-bg border-status-info-border"
15
15
  : ""}"
16
16
  >
17
17
  <div class="flex items-start gap-2">
@@ -23,20 +23,20 @@ const SecretRow = ({ secret, selected, onToggle, envVarName, onEnvVarChange }) =
23
23
  />
24
24
  <div class="flex-1 min-w-0">
25
25
  <div class="flex items-center gap-2 flex-wrap">
26
- <span class="text-xs font-mono text-gray-300 truncate"
26
+ <span class="text-xs font-mono text-body truncate"
27
27
  >${secret.maskedValue}</span
28
28
  >
29
29
  ${secret.confidence === "high"
30
30
  ? html`<span
31
- class="text-xs px-1.5 py-0.5 rounded-full bg-red-900/40 text-red-300"
31
+ class="text-xs px-1.5 py-0.5 rounded-full bg-status-error-bg text-status-error"
32
32
  >high confidence</span
33
33
  >`
34
34
  : html`<span
35
- class="text-xs px-1.5 py-0.5 rounded-full bg-yellow-900/40 text-yellow-300"
35
+ class="text-xs px-1.5 py-0.5 rounded-full bg-status-warning-bg text-status-warning"
36
36
  >possible</span
37
37
  >`}
38
38
  </div>
39
- <div class="text-xs text-gray-500 mt-1">
39
+ <div class="text-xs text-fg-muted mt-1">
40
40
  Found in${" "}
41
41
  <span class="font-mono">${secret.file || "config"}</span>
42
42
  ${secret.configPath
@@ -45,7 +45,7 @@ const SecretRow = ({ secret, selected, onToggle, envVarName, onEnvVarChange }) =
45
45
  </div>
46
46
  ${secret.duplicateIn &&
47
47
  html`
48
- <div class="text-xs text-yellow-400 mt-1">
48
+ <div class="text-xs text-status-warning-muted mt-1">
49
49
  Also found in${" "}<span class="font-mono"
50
50
  >${secret.duplicateIn}</span
51
51
  >
@@ -56,12 +56,12 @@ const SecretRow = ({ secret, selected, onToggle, envVarName, onEnvVarChange }) =
56
56
  ${selected &&
57
57
  html`
58
58
  <div class="pl-6">
59
- <label class="text-xs text-gray-500">Extract as env var:</label>
59
+ <label class="text-xs text-fg-muted">Extract as env var:</label>
60
60
  <input
61
61
  type="text"
62
62
  value=${envVarName}
63
63
  onInput=${(e) => onEnvVarChange(e.target.value)}
64
- class="w-full mt-1 bg-black/30 border border-border rounded-lg px-3 py-1.5 text-xs text-gray-200 outline-none focus:border-gray-500 font-mono"
64
+ class="w-full mt-1 bg-field border border-border rounded-lg px-3 py-1.5 text-xs text-body outline-none focus:border-fg-muted font-mono"
65
65
  />
66
66
  </div>
67
67
  `}
@@ -134,7 +134,7 @@ export const WelcomeSecretReviewStep = ({
134
134
  return html`
135
135
  <div class="flex flex-col items-center justify-center py-8 gap-3">
136
136
  <${LoadingSpinner} />
137
- <p class="text-sm text-gray-400">Applying import...</p>
137
+ <p class="text-sm text-fg-muted">Applying import...</p>
138
138
  </div>
139
139
  `;
140
140
  }
@@ -142,8 +142,8 @@ export const WelcomeSecretReviewStep = ({
142
142
  return html`
143
143
  <div class="space-y-3">
144
144
  <div>
145
- <h2 class="text-sm font-medium text-gray-200">Review Secrets</h2>
146
- <p class="text-xs text-gray-500">
145
+ <h2 class="text-sm font-medium text-body">Review Secrets</h2>
146
+ <p class="text-xs text-fg-muted">
147
147
  Select secrets to extract into environment variables. Inline values in
148
148
  config will be replaced with ${"`"}${"${"}ENV_VAR_NAME${"}"}${"`"} references.
149
149
  </p>
@@ -152,7 +152,7 @@ export const WelcomeSecretReviewStep = ({
152
152
  ${error &&
153
153
  html`
154
154
  <div
155
- class="bg-red-900/30 border border-red-800 rounded-xl p-3 text-red-300 text-sm"
155
+ class="bg-status-error-bg border border-status-error-border rounded-xl p-3 text-status-error text-sm"
156
156
  >
157
157
  ${error}
158
158
  </div>
@@ -1,6 +1,6 @@
1
- import { h } from "https://esm.sh/preact";
2
- import { useEffect, useState } from "https://esm.sh/preact/hooks";
3
- import htm from "https://esm.sh/htm";
1
+ import { h } from "preact";
2
+ import { useEffect, useState } from "preact/hooks";
3
+ import htm from "htm";
4
4
  import { LoadingSpinner } from "../loading-spinner.js";
5
5
 
6
6
  const html = htm.bind(h);
@@ -46,10 +46,10 @@ export const WelcomeSetupStep = ({ error, loading, onRetry, onBack }) => {
46
46
  return html`
47
47
  <div class="py-4 flex flex-col items-center text-center gap-3">
48
48
  <h3 class="text-lg font-semibold text-white">Setup failed</h3>
49
- <p class="text-sm text-gray-500">Fix the values and try again.</p>
49
+ <p class="text-sm text-fg-muted">Fix the values and try again.</p>
50
50
  </div>
51
51
  <div
52
- class="bg-red-900/30 border border-red-800 rounded-xl p-3 text-red-300 text-sm"
52
+ class="bg-status-error-bg border border-status-error-border rounded-xl p-3 text-status-error text-sm"
53
53
  >
54
54
  ${error}
55
55
  </div>
@@ -87,12 +87,12 @@ export const WelcomeSetupStep = ({ error, loading, onRetry, onBack }) => {
87
87
  <h3 class="text-lg font-semibold text-white">
88
88
  Initializing OpenClaw...
89
89
  </h3>
90
- <p class="text-sm text-gray-500">This could take 10-15 seconds</p>
90
+ <p class="text-sm text-fg-muted">This could take 10-15 seconds</p>
91
91
  </div>
92
92
  <div
93
- class="absolute bottom-3 left-3 right-3 bg-black/20 border border-border rounded-lg px-3 py-2 text-xs text-gray-500"
93
+ class="absolute bottom-3 left-3 right-3 bg-field border border-border rounded-lg px-3 py-2 text-xs text-fg-muted"
94
94
  >
95
- <span class="text-gray-400">${currentTip.label}: </span>
95
+ <span class="text-fg-muted">${currentTip.label}: </span>
96
96
  ${currentTip.text}
97
97
  </div>
98
98
  </div>
@@ -1,6 +1,6 @@
1
- import { h } from "https://esm.sh/preact";
2
- import { useEffect, useRef } from "https://esm.sh/preact/hooks";
3
- import htm from "https://esm.sh/htm";
1
+ import { h } from "preact";
2
+ import { useEffect, useRef } from "preact/hooks";
3
+ import htm from "htm";
4
4
 
5
5
  const html = htm.bind(h);
6
6
 
@@ -1,5 +1,5 @@
1
- import { h } from "https://esm.sh/preact";
2
- import htm from "https://esm.sh/htm";
1
+ import { h } from "preact";
2
+ import htm from "htm";
3
3
 
4
4
  const html = htm.bind(h);
5
5
 
@@ -1,6 +1,6 @@
1
- import { h } from 'https://esm.sh/preact';
2
- import { useState } from 'https://esm.sh/preact/hooks';
3
- import htm from 'https://esm.sh/htm';
1
+ import { h } from 'preact';
2
+ import { useState } from 'preact/hooks';
3
+ import htm from 'htm';
4
4
  import { ActionButton } from './action-button.js';
5
5
  const html = htm.bind(h);
6
6
 
@@ -27,22 +27,22 @@ export const PairingRow = ({ p, onApprove, onReject }) => {
27
27
 
28
28
  if (busy === "approve") {
29
29
  return html`
30
- <div class="bg-black/30 rounded-lg p-3 mb-2 flex items-center gap-2">
31
- <span class="text-green-400 text-sm">Approved</span>
32
- <span class="text-gray-500 text-xs">${label}${accountSuffix} · ${p.code || p.id || '?'}</span>
30
+ <div class="bg-field rounded-lg p-3 mb-2 flex items-center gap-2">
31
+ <span class="text-status-success text-sm">Approved</span>
32
+ <span class="text-fg-muted text-xs">${label}${accountSuffix} · ${p.code || p.id || '?'}</span>
33
33
  </div>`;
34
34
  }
35
35
  if (busy === "reject") {
36
36
  return html`
37
- <div class="bg-black/30 rounded-lg p-3 mb-2 flex items-center gap-2">
38
- <span class="text-gray-400 text-sm">Rejected</span>
39
- <span class="text-gray-500 text-xs">${label}${accountSuffix} · ${p.code || p.id || '?'}</span>
37
+ <div class="bg-field rounded-lg p-3 mb-2 flex items-center gap-2">
38
+ <span class="text-fg-muted text-sm">Rejected</span>
39
+ <span class="text-fg-muted text-xs">${label}${accountSuffix} · ${p.code || p.id || '?'}</span>
40
40
  </div>`;
41
41
  }
42
42
 
43
43
  return html`
44
- <div class="bg-black/30 rounded-lg p-3 mb-2">
45
- <div class="font-medium text-sm mb-2">${label}${accountSuffix} · <code class="text-gray-400">${p.code || p.id || '?'}</code></div>
44
+ <div class="bg-field rounded-lg p-3 mb-2">
45
+ <div class="font-medium text-sm mb-2">${label}${accountSuffix} · <code class="text-fg-muted">${p.code || p.id || '?'}</code></div>
46
46
  <div class="flex gap-2">
47
47
  <${ActionButton}
48
48
  onClick=${() => handle("approve")}
@@ -104,12 +104,12 @@ export function Pairings({
104
104
  </div>`
105
105
  : statusRefreshing
106
106
  ? html`<div class="text-center py-4 space-y-2">
107
- <p class="text-gray-300 text-sm">Updating pairing status...</p>
107
+ <p class="text-body text-sm">Updating pairing status...</p>
108
108
  </div>`
109
109
  : html`<div class="text-center py-4 space-y-2">
110
110
  <div class="text-3xl">💬</div>
111
- <p class="text-gray-300 text-sm">Send a message to your bot on ${channelList}</p>
112
- <p class="text-gray-600 text-xs">The pairing request will appear here — it may take a few moments</p>
111
+ <p class="text-body text-sm">Send a message to your bot on ${channelList}</p>
112
+ <p class="text-fg-dim text-xs">The pairing request will appear here — it may take a few moments</p>
113
113
  </div>`}
114
114
  </div>`;
115
115
  }
@@ -1,5 +1,5 @@
1
- import { h } from "https://esm.sh/preact";
2
- import htm from "https://esm.sh/htm";
1
+ import { h } from "preact";
2
+ import htm from "htm";
3
3
 
4
4
  const html = htm.bind(h);
5
5
 
@@ -1,14 +1,14 @@
1
- import { h } from "https://esm.sh/preact";
2
- import htm from "https://esm.sh/htm";
1
+ import { h } from "preact";
2
+ import htm from "htm";
3
3
 
4
4
  const html = htm.bind(h);
5
5
 
6
6
  const kPillBaseClassName =
7
7
  "inline-flex items-center rounded-full border px-3 py-1.5 text-xs font-medium transition-colors";
8
8
  const kPillActiveClassName =
9
- "border-cyan-500/40 bg-cyan-500/10 text-cyan-200 shadow-[0_0_0_1px_rgba(34,211,238,0.08)]";
9
+ "border-cyan-500/40 bg-cyan-500/10 text-status-info shadow-[0_0_0_1px_rgba(34,211,238,0.08)]";
10
10
  const kPillInactiveClassName =
11
- "border-border bg-black/20 text-gray-500 hover:border-gray-500 hover:text-gray-300";
11
+ "border-border bg-field text-fg-muted hover:border-fg-muted hover:text-body";
12
12
 
13
13
  export const PillTabs = ({
14
14
  tabs = [],
@@ -1,6 +1,6 @@
1
- import { h } from "https://esm.sh/preact";
2
- import { useState, useEffect, useRef } from "https://esm.sh/preact/hooks";
3
- import htm from "https://esm.sh/htm";
1
+ import { h } from "preact";
2
+ import { useState, useEffect, useRef } from "preact/hooks";
3
+ import htm from "htm";
4
4
 
5
5
  const html = htm.bind(h);
6
6