@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,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 { EditorSurface } from "./editor-surface.js";
4
4
 
5
5
  const html = htm.bind(h);
@@ -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,4 +1,4 @@
1
- import { useRef } from "https://esm.sh/preact/hooks";
1
+ import { useRef } from "preact/hooks";
2
2
 
3
3
  export const getScrollRatio = (element) => {
4
4
  if (!element) return 0;
@@ -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 { LoadingSpinner } from "../loading-spinner.js";
4
4
 
5
5
  const html = htm.bind(h);
@@ -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 { ActionButton } from "../action-button.js";
4
4
  import { LockLineIcon } from "../icons.js";
5
5
 
@@ -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 { ActionButton } from "../action-button.js";
4
4
  import { SegmentedControl } from "../segmented-control.js";
5
5
  import { DeleteBinLineIcon, RestartLineIcon, SaveFillIcon } from "../icons.js";
@@ -1,4 +1,4 @@
1
- import { useCallback, useEffect } from "https://esm.sh/preact/hooks";
1
+ import { useCallback, useEffect } from "preact/hooks";
2
2
 
3
3
  export const useEditorLineNumberSync = ({
4
4
  enabled = false,
@@ -1,4 +1,4 @@
1
- import { useEffect, useRef } from "https://esm.sh/preact/hooks";
1
+ import { useEffect, useRef } from "preact/hooks";
2
2
  import { readStoredEditorSelection } from "./storage.js";
3
3
  import { clampSelectionIndex } from "./utils.js";
4
4
  import { getScrollRatio } from "./scroll-sync.js";
@@ -1,4 +1,4 @@
1
- import { useEffect, useState } from "https://esm.sh/preact/hooks";
1
+ import { useEffect, useState } from "preact/hooks";
2
2
  import { fetchBrowseFileDiff } from "../../lib/api.js";
3
3
 
4
4
  export const useFileDiff = ({
@@ -1,4 +1,4 @@
1
- import { useEffect, useRef } from "https://esm.sh/preact/hooks";
1
+ import { useEffect, useRef } from "preact/hooks";
2
2
  import { fetchBrowseSqliteTable, fetchFileContent } from "../../lib/api.js";
3
3
  import {
4
4
  clearStoredFileDraft,
@@ -1,4 +1,4 @@
1
- import { useEffect } from "https://esm.sh/preact/hooks";
1
+ import { useEffect } from "preact/hooks";
2
2
  import {
3
3
  clearStoredFileDraft,
4
4
  updateDraftIndex,
@@ -1,4 +1,4 @@
1
- import { useEffect } from "https://esm.sh/preact/hooks";
1
+ import { useEffect } from "preact/hooks";
2
2
 
3
3
  export const useFileViewerHotkeys = ({
4
4
  canEditFile,
@@ -1,5 +1,5 @@
1
- import { useCallback, useEffect, useMemo, useRef, useState } from "https://esm.sh/preact/hooks";
2
- import { marked } from "https://esm.sh/marked";
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from "preact/hooks";
2
+ import { marked } from "marked";
3
3
  import { deleteBrowseFile, restoreBrowseFile, saveFileContent } from "../../lib/api.js";
4
4
  import {
5
5
  getFileSyntaxKind,
@@ -1,6 +1,6 @@
1
- import { h } from "https://esm.sh/preact";
2
- import { useEffect, useMemo, useState } from "https://esm.sh/preact/hooks";
3
- import htm from "https://esm.sh/htm";
1
+ import { h } from "preact";
2
+ import { useEffect, useMemo, useState } from "preact/hooks";
3
+ import htm from "htm";
4
4
  import { fetchOpenclawVersion, updateOpenclaw } from "../lib/api.js";
5
5
  import { UpdateActionButton } from "./update-action-button.js";
6
6
  import { ConfirmDialog } from "./confirm-dialog.js";
@@ -200,15 +200,15 @@ const VersionRow = ({
200
200
  return html`
201
201
  <div class="flex items-center justify-between gap-3">
202
202
  <div class="min-w-0">
203
- <p class="text-xs text-gray-300 truncate">
204
- <span class="text-gray-500">${label}</span>${" "}${version
203
+ <p class="text-xs text-body truncate">
204
+ <span class="text-fg-muted">${label}</span>${" "}${version
205
205
  ? `${version}`
206
206
  : "..."}
207
207
  </p>
208
208
  ${error &&
209
209
  effectiveHasUpdate &&
210
210
  html`<div
211
- class="mt-1 text-xs text-red-300 bg-red-900/30 border border-red-800 rounded-lg px-2 py-1"
211
+ class="mt-1 text-xs text-status-error bg-status-error-bg border border-status-error-border rounded-lg px-2 py-1"
212
212
  >
213
213
  ${error}
214
214
  </div>`}
@@ -222,7 +222,7 @@ const VersionRow = ({
222
222
  target="_blank"
223
223
  rel="noreferrer"
224
224
  onclick=${() => setHasViewedChangelog(true)}
225
- class="hidden md:inline text-xs text-gray-500 hover:text-gray-300 transition-colors"
225
+ class="hidden md:inline text-xs text-fg-muted hover:text-body transition-colors"
226
226
  >View changelog</a
227
227
  >
228
228
  `}
@@ -264,7 +264,7 @@ const VersionRow = ({
264
264
  target="_blank"
265
265
  rel="noreferrer"
266
266
  onclick=${() => setHasViewedChangelog(true)}
267
- class="inline-flex items-center justify-center flex-1 h-9 text-xs rounded-lg border border-border text-gray-400 hover:text-gray-200 hover:border-gray-500 transition-colors"
267
+ class="inline-flex items-center justify-center flex-1 h-9 text-xs rounded-lg border border-border text-fg-muted hover:text-body hover:border-fg-muted transition-colors"
268
268
  >View changelog</a
269
269
  >
270
270
  <${UpdateActionButton}
@@ -353,14 +353,14 @@ export const Gateway = ({
353
353
  <div class="min-w-0 flex items-center gap-2 text-sm">
354
354
  <span class=${dotClass}></span>
355
355
  <span class="font-semibold">Gateway:</span>
356
- <span class="text-gray-400"
356
+ <span class="text-fg-muted"
357
357
  >${restarting ? "restarting..." : status || "checking..."}</span
358
358
  >
359
359
  </div>
360
360
  <div class="flex items-center gap-3 shrink-0">
361
361
  ${!restarting && isRunning
362
362
  ? html`
363
- <span class="text-xs text-gray-500 whitespace-nowrap"
363
+ <span class="text-xs text-fg-muted whitespace-nowrap"
364
364
  >Uptime: ${formatDuration(liveUptimeMs)}</span
365
365
  >
366
366
  `
@@ -389,7 +389,7 @@ export const Gateway = ({
389
389
  : `w-2 h-2 rounded-full ${watchdogDotClass}`}
390
390
  ></span>
391
391
  <span class="font-semibold">Watchdog:</span>
392
- <span class="text-gray-400">${watchdogLabel}</span>
392
+ <span class="text-fg-muted">${watchdogLabel}</span>
393
393
  </button>
394
394
  `
395
395
  : html`
@@ -400,7 +400,7 @@ export const Gateway = ({
400
400
  : `w-2 h-2 rounded-full ${watchdogDotClass}`}
401
401
  ></span>
402
402
  <span class="font-semibold">Watchdog:</span>
403
- <span class="text-gray-400">${watchdogLabel}</span>
403
+ <span class="text-fg-muted">${watchdogLabel}</span>
404
404
  </div>
405
405
  `}
406
406
  ${onRepair
@@ -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 { Gateway } from "../gateway.js";
4
4
  import { Channels } from "../channels.js";
5
5
  import { ChannelOperationsPanel } from "../channel-operations-panel.js";
@@ -97,7 +97,7 @@ export const GeneralTab = ({
97
97
  <div class="flex items-center justify-between gap-3">
98
98
  <div class="flex items-center gap-2 min-w-0">
99
99
  <svg
100
- class="w-4 h-4 text-gray-400"
100
+ class="w-4 h-4 text-fg-muted"
101
101
  viewBox="0 0 16 16"
102
102
  fill="currentColor"
103
103
  >
@@ -108,19 +108,19 @@ export const GeneralTab = ({
108
108
  <a
109
109
  href="https://github.com/${state.repo}"
110
110
  target="_blank"
111
- class="text-sm text-gray-400 hover:text-gray-200 transition-colors truncate"
111
+ class="text-sm text-fg-muted hover:text-body transition-colors truncate"
112
112
  >${state.repo}</a
113
113
  >
114
114
  </div>
115
115
  <div class="flex items-center gap-2 shrink-0">
116
- <span class="text-xs text-gray-400">Auto-sync</span>
116
+ <span class="text-xs text-fg-muted">Auto-sync</span>
117
117
  <div class="relative">
118
118
  <select
119
119
  value=${state.syncCronChoice}
120
120
  onchange=${(event) =>
121
121
  actions.handleSyncCronChoiceChange(event.target.value)}
122
122
  disabled=${state.savingSyncCron}
123
- class="appearance-none bg-black/30 border border-border rounded-lg pl-2.5 pr-9 py-1.5 text-xs text-gray-300 ${state.savingSyncCron
123
+ class="appearance-none bg-field border border-border rounded-lg pl-2.5 pr-9 py-1.5 text-xs text-body ${state.savingSyncCron
124
124
  ? "opacity-50 cursor-not-allowed"
125
125
  : ""}"
126
126
  title=${state.syncCron?.installed === false
@@ -133,7 +133,7 @@ export const GeneralTab = ({
133
133
  <option value="0 0 * * *">Daily</option>
134
134
  </select>
135
135
  <${ChevronDownIcon}
136
- className="pointer-events-none absolute right-2.5 top-1/2 -translate-y-1/2 text-gray-500"
136
+ className="pointer-events-none absolute right-2.5 top-1/2 -translate-y-1/2 text-fg-muted"
137
137
  />
138
138
  </div>
139
139
  </div>
@@ -1,4 +1,4 @@
1
- import { useEffect, useRef, useState } from "https://esm.sh/preact/hooks";
1
+ import { useEffect, useRef, useState } from "preact/hooks";
2
2
  import {
3
3
  approveDevice,
4
4
  approvePairing,
@@ -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 { UpdateActionButton } from "./update-action-button.js";
4
4
  import { CloseIcon } from "./icons.js";
5
5
 
@@ -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 { Badge } from "../badge.js";
4
4
  import { ScopePicker } from "../scope-picker.js";
5
5
  import { GmailWatchToggle } from "./gmail-watch-toggle.js";
@@ -32,11 +32,11 @@ export const GoogleAccountRow = ({
32
32
  }) => {
33
33
  const scopesChanged = !scopeListsEqual(scopes, savedScopes);
34
34
  return html`
35
- <div class="border border-border rounded-lg bg-black/20 overflow-visible">
35
+ <div class="border border-border rounded-lg bg-field overflow-visible">
36
36
  <button
37
37
  type="button"
38
38
  onclick=${() => onToggleExpanded?.(account.id)}
39
- class="w-full text-left px-3 py-2.5 flex items-center justify-between hover:bg-black/20"
39
+ class="w-full text-left px-3 py-2.5 flex items-center justify-between hover:bg-field"
40
40
  >
41
41
  <div class="min-w-0">
42
42
  <div class="text-sm font-medium truncate">${account.email}</div>
@@ -46,14 +46,14 @@ export const GoogleAccountRow = ({
46
46
  <${Badge} tone=${account.authenticated ? "success" : "warning"}>
47
47
  ${account.authenticated ? "Connected" : "Awaiting sign-in"}
48
48
  </${Badge}>
49
- <span class="text-xs text-gray-500">${expanded ? "▾" : "▸"}</span>
49
+ <span class="text-xs text-fg-muted">${expanded ? "▾" : "▸"}</span>
50
50
  </div>
51
51
  </button>
52
52
  ${expanded
53
53
  ? html`
54
54
  <div class="px-3 pb-3 space-y-3 border-t border-border">
55
55
  <div class="flex justify-between items-center pt-3">
56
- <span class="text-sm text-gray-400">Select permissions</span>
56
+ <span class="text-sm text-fg-muted">Select permissions</span>
57
57
  ${account.authenticated
58
58
  ? html`<button
59
59
  type="button"
@@ -76,7 +76,7 @@ export const GoogleAccountRow = ({
76
76
  <div class="-mx-3 mt-4 mb-2 border-y border-border">
77
77
  <div class="px-3 py-3 space-y-2">
78
78
  <div class="flex justify-between items-center gap-2">
79
- <span class="text-sm text-gray-400">Incoming events</span>
79
+ <span class="text-sm text-fg-muted">Incoming events</span>
80
80
  <button
81
81
  type="button"
82
82
  onclick=${() => onOpenGmailSetup?.(account.id)}
@@ -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 { ActionButton } from "../action-button.js";
5
5
  import { ModalShell } from "../modal-shell.js";
6
6
  import { PageHeader } from "../page-header.js";
@@ -55,16 +55,16 @@ export const AddGoogleAccountModal = ({
55
55
  class="h-8 w-8 inline-flex items-center justify-center rounded-lg ac-btn-secondary"
56
56
  aria-label="Close modal"
57
57
  >
58
- <${CloseIcon} className="w-3.5 h-3.5 text-gray-300" />
58
+ <${CloseIcon} className="w-3.5 h-3.5 text-body" />
59
59
  </button>
60
60
  `}
61
61
  />
62
62
  <div class="space-y-3">
63
63
  <div>
64
- <label class="text-sm text-gray-400 block mb-1"
64
+ <label class="text-sm text-fg-muted block mb-1"
65
65
  >Email (Google account to authorize)</label
66
66
  >
67
- <p class="text-xs text-gray-500 mb-2">
67
+ <p class="text-xs text-fg-muted mb-2">
68
68
  This adds another account to the same company workspace. Only one company workspace is supported.
69
69
  </p>
70
70
  <input
@@ -72,10 +72,10 @@ export const AddGoogleAccountModal = ({
72
72
  value=${email}
73
73
  onInput=${(e) => setEmail(e.target.value)}
74
74
  placeholder="you@company.com"
75
- class="w-full bg-black/40 border border-border rounded-lg px-3 py-2 text-sm focus:outline-none focus:border-gray-500"
75
+ class="w-full bg-field border border-border rounded-lg px-3 py-2 text-sm focus:outline-none focus:border-fg-muted"
76
76
  />
77
77
  </div>
78
- ${error ? html`<div class="text-red-400 text-xs">${error}</div>` : null}
78
+ ${error ? html`<div class="text-status-error-muted text-xs">${error}</div>` : null}
79
79
  </div>
80
80
  <div class="pt-2">
81
81
  <${ActionButton}
@@ -1,11 +1,11 @@
1
- import { h } from "https://esm.sh/preact";
1
+ import { h } from "preact";
2
2
  import {
3
3
  useCallback,
4
4
  useEffect,
5
5
  useMemo,
6
6
  useState,
7
- } from "https://esm.sh/preact/hooks";
8
- import htm from "https://esm.sh/htm";
7
+ } from "preact/hooks";
8
+ import htm from "htm";
9
9
  import { ModalShell } from "../modal-shell.js";
10
10
  import { PageHeader } from "../page-header.js";
11
11
  import { CloseIcon } from "../icons.js";
@@ -58,9 +58,9 @@ const kTutorialStepTitles = kSetupStepTitles.slice(0, 3);
58
58
  const kNoSessionSelectedValue = kNoDestinationSessionValue;
59
59
 
60
60
  const renderCommandBlock = (command = "", onCopy = () => {}) => html`
61
- <div class="rounded-lg border border-border bg-black/30 p-3">
61
+ <div class="rounded-lg border border-border bg-field p-3">
62
62
  <pre
63
- class="pt-1 pl-2 text-[11px] leading-5 whitespace-pre-wrap break-all font-mono text-gray-300"
63
+ class="pt-1 pl-2 text-[11px] leading-5 whitespace-pre-wrap break-all font-mono text-body"
64
64
  >
65
65
  ${command}</pre
66
66
  >
@@ -240,9 +240,9 @@ export const GmailSetupWizard = ({
240
240
  class="absolute top-6 right-6 h-8 w-8 inline-flex items-center justify-center rounded-lg ac-btn-secondary"
241
241
  aria-label="Close modal"
242
242
  >
243
- <${CloseIcon} className="w-3.5 h-3.5 text-gray-300" />
243
+ <${CloseIcon} className="w-3.5 h-3.5 text-body" />
244
244
  </button>
245
- <div class="text-xs text-gray-500">Gmail Pub / Sub Setup</div>
245
+ <div class="text-xs text-fg-muted">Gmail Pub / Sub Setup</div>
246
246
  <div class="flex items-center gap-1">
247
247
  ${stepTitles.map(
248
248
  (title, idx) => html`
@@ -258,19 +258,19 @@ export const GmailSetupWizard = ({
258
258
  title=${`Step ${step + 1} of ${totalSteps}: ${stepTitles[step]}`}
259
259
  actions=${null}
260
260
  />
261
- ${localError ? html`<div class="text-xs text-red-400">${localError}</div>` : null}
261
+ ${localError ? html`<div class="text-xs text-status-error-muted">${localError}</div>` : null}
262
262
  ${
263
263
  needsProjectId
264
264
  ? html`
265
265
  <div
266
- class="rounded-lg border border-border bg-black/20 p-3 space-y-2"
266
+ class="rounded-lg border border-border bg-field p-3 space-y-2"
267
267
  >
268
268
  <div class="text-sm">
269
269
  ${editingProjectId
270
270
  ? "Change project ID"
271
271
  : "Project ID required"}
272
272
  </div>
273
- <div class="text-xs text-gray-500">
273
+ <div class="text-xs text-fg-muted">
274
274
  Find it in the${" "}
275
275
  <a
276
276
  href="https://console.cloud.google.com/home/dashboard"
@@ -285,7 +285,7 @@ export const GmailSetupWizard = ({
285
285
  type="text"
286
286
  value=${projectIdInput}
287
287
  oninput=${(event) => setProjectIdInput(event.target.value)}
288
- class="w-full bg-black/30 border border-border rounded-lg px-2.5 py-2 text-xs font-mono focus:border-gray-500 focus:outline-none"
288
+ class="w-full bg-field border border-border rounded-lg px-2.5 py-2 text-xs font-mono focus:border-fg-muted focus:outline-none"
289
289
  placeholder="my-gcp-project"
290
290
  />
291
291
  </div>
@@ -296,10 +296,10 @@ export const GmailSetupWizard = ({
296
296
  !needsProjectId && step === 0
297
297
  ? html`
298
298
  <div class="space-y-1">
299
- <div class="text-xs text-gray-500">
299
+ <div class="text-xs text-fg-muted">
300
300
  Using project <code>${detectedProjectId}</code>.
301
301
  </div>
302
- <div class="text-xs text-gray-500">
302
+ <div class="text-xs text-fg-muted">
303
303
  If <code>gcloud</code> is not installed on your computer,
304
304
  follow the official install guide:${" "}
305
305
  <a
@@ -351,7 +351,7 @@ export const GmailSetupWizard = ({
351
351
  handleCopy(commands?.createSubscription || ""),
352
352
  )}
353
353
  <div
354
- class="rounded-lg border border-border bg-black/20 p-3 space-y-2"
354
+ class="rounded-lg border border-border bg-field p-3 space-y-2"
355
355
  >
356
356
  <${SessionSelectField}
357
357
  label="Deliver to"
@@ -370,10 +370,10 @@ export const GmailSetupWizard = ({
370
370
  helperText=${hasExistingWebhookSetup
371
371
  ? "This Gmail webhook has already been created. To edit delivery routing, ask your agent."
372
372
  : null}
373
- selectClassName="w-full bg-black/30 border border-border rounded-lg px-2.5 py-2 text-xs font-mono focus:border-gray-500 focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed"
374
- helperClassName="text-xs text-gray-500"
375
- statusClassName="text-[11px] text-gray-500"
376
- errorClassName="text-[11px] text-red-400"
373
+ selectClassName="w-full bg-field border border-border rounded-lg px-2.5 py-2 text-xs font-mono focus:border-fg-muted focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed"
374
+ helperClassName="text-xs text-fg-muted"
375
+ statusClassName="text-[11px] text-fg-muted"
376
+ errorClassName="text-[11px] text-status-error-muted"
377
377
  />
378
378
  </div>
379
379
  `
@@ -383,16 +383,16 @@ export const GmailSetupWizard = ({
383
383
  !hasExistingWebhookSetup && step === 4
384
384
  ? html`
385
385
  <div
386
- class="rounded-lg border border-border bg-black/20 p-3 space-y-3"
386
+ class="rounded-lg border border-border bg-field p-3 space-y-3"
387
387
  >
388
388
  <div class="pt-1 space-y-1">
389
389
  <div class="text-sm">Continue with your agent</div>
390
- <div class="text-xs text-gray-500">
390
+ <div class="text-xs text-fg-muted">
391
391
  Tell your OpenClaw agent about what you want to build with
392
392
  incoming email to continue the setup.
393
393
  </div>
394
394
  <div class="pt-2 space-y-2">
395
- <div class="text-[11px] text-gray-500">
395
+ <div class="text-[11px] text-fg-muted">
396
396
  Send this to session
397
397
  </div>
398
398
  <div class="flex items-center gap-2">
@@ -409,7 +409,7 @@ export const GmailSetupWizard = ({
409
409
  disabled=${loadingAgentSessions ||
410
410
  sendingToAgent ||
411
411
  agentMessageSent}
412
- class="flex-1 min-w-0 bg-black/30 border border-border rounded-lg px-2.5 py-2 text-xs font-mono focus:border-gray-500 focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed"
412
+ class="flex-1 min-w-0 bg-field border border-border rounded-lg px-2.5 py-2 text-xs font-mono focus:border-fg-muted focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed"
413
413
  >
414
414
  ${!selectedSessionKey
415
415
  ? html`<option value=${kNoSessionSelectedValue}>
@@ -436,12 +436,12 @@ export const GmailSetupWizard = ({
436
436
  />
437
437
  </div>
438
438
  ${loadingAgentSessions
439
- ? html`<div class="text-[11px] text-gray-500">
439
+ ? html`<div class="text-[11px] text-fg-muted">
440
440
  Loading sessions...
441
441
  </div>`
442
442
  : null}
443
443
  ${agentSessionsError
444
- ? html`<div class="text-[11px] text-red-400">
444
+ ? html`<div class="text-[11px] text-status-error-muted">
445
445
  ${agentSessionsError}
446
446
  </div>`
447
447
  : null}
@@ -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 { Badge } from "../badge.js";
4
4
  import { ToggleSwitch } from "../toggle-switch.js";
5
5
  import { InfoTooltip } from "../info-tooltip.js";
@@ -32,8 +32,8 @@ export const GmailWatchToggle = ({
32
32
  : false;
33
33
  if (!hasGmailReadScope) {
34
34
  return html`
35
- <div class="bg-black/30 rounded-lg px-3 py-2">
36
- <div class="text-xs text-gray-500">
35
+ <div class="bg-field rounded-lg px-3 py-2">
36
+ <div class="text-xs text-fg-muted">
37
37
  Gmail watch requires <code>gmail:read</code>. Add it in permissions
38
38
  above, then update permissions.
39
39
  </div>
@@ -45,7 +45,7 @@ export const GmailWatchToggle = ({
45
45
  const enabled = Boolean(watchStatus?.enabled);
46
46
  return html`
47
47
  <div
48
- class="flex items-center justify-between bg-black/30 border border-transparent rounded-lg px-3 py-2 cursor-pointer hover:bg-black/40 hover:border-white/20 transition-colors"
48
+ class="flex items-center justify-between bg-field border border-transparent rounded-lg px-3 py-2 cursor-pointer hover:bg-field hover:border-white/20 transition-colors"
49
49
  role="button"
50
50
  tabindex="0"
51
51
  onClick=${() => onOpenWebhook?.()}
@@ -1,11 +1,11 @@
1
- import { h } from "https://esm.sh/preact";
1
+ import { h } from "preact";
2
2
  import {
3
3
  useCallback,
4
4
  useEffect,
5
5
  useMemo,
6
6
  useState,
7
- } from "https://esm.sh/preact/hooks";
8
- import htm from "https://esm.sh/htm";
7
+ } from "preact/hooks";
8
+ import htm from "htm";
9
9
  import {
10
10
  checkGoogleApis,
11
11
  disconnectGoogle,
@@ -415,7 +415,7 @@ export const Google = ({
415
415
 
416
416
  const renderEmptyState = () => html`
417
417
  <div class="text-center space-y-2 pt-3">
418
- <div class="rounded-lg border border-border bg-black/20 px-3 py-5">
418
+ <div class="rounded-lg border border-border bg-field px-3 py-5">
419
419
  <div class="flex flex-col items-center justify-center gap-3">
420
420
  <img
421
421
  src=${kGoogleIconPath}
@@ -424,7 +424,7 @@ export const Google = ({
424
424
  loading="lazy"
425
425
  decoding="async"
426
426
  />
427
- <p class="text-xs text-gray-500">
427
+ <p class="text-xs text-fg-muted">
428
428
  Connect Gmail, Calendar, Contacts, Drive, Sheets, Tasks, Docs, and
429
429
  Meet.
430
430
  </p>
@@ -489,7 +489,7 @@ export const Google = ({
489
489
  : null}
490
490
  </div>
491
491
  ${loading
492
- ? html`<div class="text-gray-500 text-sm text-center py-2">
492
+ ? html`<div class="text-fg-muted text-sm text-center py-2">
493
493
  Loading...
494
494
  </div>`
495
495
  : accounts.length
@@ -1,4 +1,4 @@
1
- import { useCallback, useEffect, useMemo, useState } from "https://esm.sh/preact/hooks";
1
+ import { useCallback, useEffect, useMemo, useState } from "preact/hooks";
2
2
  import {
3
3
  fetchGmailConfig,
4
4
  renewGmailWatch,
@@ -1,4 +1,4 @@
1
- import { useCallback, useEffect, useMemo, useRef } from "https://esm.sh/preact/hooks";
1
+ import { useCallback, useEffect, useMemo, useRef } from "preact/hooks";
2
2
  import { fetchGoogleAccounts } from "../../lib/api.js";
3
3
  import { useCachedFetch } from "../../hooks/use-cached-fetch.js";
4
4
 
@@ -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,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 { Tooltip } from "./tooltip.js";
4
4
 
5
5
  const html = htm.bind(h);
@@ -7,7 +7,7 @@ const html = htm.bind(h);
7
7
  export const InfoTooltip = ({ text = "", widthClass = "w-64" }) => html`
8
8
  <${Tooltip} text=${text} widthClass=${widthClass}>
9
9
  <span
10
- class="inline-flex h-4 w-4 items-center justify-center rounded-full border border-gray-500 text-[10px] text-gray-400 cursor-default select-none"
10
+ class="inline-flex h-4 w-4 items-center justify-center rounded-full border border-fg-muted text-[10px] text-fg-muted cursor-default select-none"
11
11
  aria-label=${text}
12
12
  >?</span
13
13
  >
@@ -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,7 +1,7 @@
1
- import { h } from "https://esm.sh/preact";
2
- import { useEffect } from "https://esm.sh/preact/hooks";
3
- import { createPortal } from "https://esm.sh/preact/compat";
4
- import htm from "https://esm.sh/htm";
1
+ import { h } from "preact";
2
+ import { useEffect } from "preact/hooks";
3
+ import { createPortal } from "preact/compat";
4
+ import htm from "htm";
5
5
 
6
6
  const html = htm.bind(h);
7
7
 
@@ -29,7 +29,7 @@ export const ModalShell = ({
29
29
  return createPortal(
30
30
  html`
31
31
  <div
32
- class="fixed inset-0 bg-black/70 flex items-center justify-center p-4 z-50"
32
+ class="fixed inset-0 bg-overlay flex items-center justify-center p-4 z-50"
33
33
  onclick=${(event) => {
34
34
  if (closeOnOverlayClick && event.target === event.currentTarget) onClose?.();
35
35
  }}