@moondeck/station 0.0.1 → 1.0.1

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 (330) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +149 -2
  3. package/bin/uai-host.mjs +130 -0
  4. package/db/migrations/0000_host_tasks.sql +12 -0
  5. package/db/migrations/0001_host_ui.sql +11 -0
  6. package/db/migrations/0002_host_github_tokens.sql +8 -0
  7. package/db/migrations/0003_host_ssh_keys.sql +8 -0
  8. package/db/migrations/0004_host_owner_name.sql +1 -0
  9. package/db/migrations/0005_host_env_vars.sql +5 -0
  10. package/db/migrations/0006_host_project_env.sql +9 -0
  11. package/db/migrations/0007_host_github_token_kind.sql +7 -0
  12. package/db/migrations/0008_host_mcp_connections.sql +18 -0
  13. package/db/migrations/0009_host_agent_sessions.sql +15 -0
  14. package/db/migrations/0010_host_engine_accounts.sql +13 -0
  15. package/db/migrations/0011_codex_thread_id.sql +5 -0
  16. package/db/migrations/0012_agent_session_attach_key.sql +4 -0
  17. package/db/migrations/0013_github_credential_generations.sql +11 -0
  18. package/db/migrations/0014_host_inventory_event_index.sql +1 -0
  19. package/db/migrations/0015_host_settings.sql +9 -0
  20. package/db/migrations/0016_task_environment.sql +2 -0
  21. package/db/migrations/0017_engine_account_scope.sql +7 -0
  22. package/db/migrations/0018_engine_account_position.sql +3 -0
  23. package/db/migrations/0019_engine_account_store_ref.sql +3 -0
  24. package/db/migrations/0020_user_credential_store_ref.sql +6 -0
  25. package/db/migrations/0021_project_env_store_ref.sql +3 -0
  26. package/db/migrations/0022_task_project_ids.sql +5 -0
  27. package/db/migrations/0023_project_env_org.sql +4 -0
  28. package/db/migrations/0024_task_env_mode.sql +9 -0
  29. package/db/migrations/0025_project_env_authority.sql +147 -0
  30. package/db/migrations/0026_project_env_replica.sql +150 -0
  31. package/db/migrations/0027_cloud_credential_foundation.sql +51 -0
  32. package/db/migrations/0028_leased_engine_runtimes.sql +11 -0
  33. package/db/migrations/0029_task_shared_files_mode.sql +5 -0
  34. package/db/migrations/0030_credential_cleanup_restops.sql +12 -0
  35. package/db/migrations/0031_first_turn_receipts.sql +9 -0
  36. package/db/migrations/meta/_journal.json +230 -0
  37. package/db/schema.ts +871 -0
  38. package/images/standard/Dockerfile +347 -0
  39. package/images/standard/README.md +167 -0
  40. package/images/standard/container/code-server-settings.json +63 -0
  41. package/images/standard/container/corepack-version +1 -0
  42. package/images/standard/container/uai-init +704 -0
  43. package/images/standard/container/uai-materialize-runtimes +1527 -0
  44. package/images/standard/container/uai-task-forwarder.mjs +303 -0
  45. package/images/standard/tool-versions +2 -0
  46. package/lib/__fixtures__/skill-index/SKILL.md +10 -0
  47. package/lib/__fixtures__/skill-index/skills/accessibility-checklist.md +7 -0
  48. package/lib/__fixtures__/skill-index/skills/brand-voice.md +9 -0
  49. package/lib/__fixtures__/skill-index/skills/design-tokens.md +9 -0
  50. package/lib/agent-cli.ts +1507 -0
  51. package/lib/agent-errors.ts +22 -0
  52. package/lib/agent.ts +672 -0
  53. package/lib/agents/attach-compatibility.ts +51 -0
  54. package/lib/agents/claude.ts +918 -0
  55. package/lib/agents/codex-token-usage.fixture.json +130 -0
  56. package/lib/agents/codex.ts +1392 -0
  57. package/lib/agents/cursor-period-usage.ts +253 -0
  58. package/lib/agents/cursor.ts +562 -0
  59. package/lib/agents/dispatch.ts +78 -0
  60. package/lib/agents/durable-proc.ts +334 -0
  61. package/lib/agents/factory.ts +57 -0
  62. package/lib/agents/grok.ts +381 -0
  63. package/lib/agents/kimi.ts +329 -0
  64. package/lib/agents/machine-durable.ts +604 -0
  65. package/lib/agents/mock.ts +133 -0
  66. package/lib/agents/mode.ts +64 -0
  67. package/lib/agents/opencode.ts +508 -0
  68. package/lib/agents/output-source.ts +3 -0
  69. package/lib/agents/proc.ts +221 -0
  70. package/lib/agents/rate-limit.ts +337 -0
  71. package/lib/agents/registry.ts +182 -0
  72. package/lib/agents/session-state.ts +197 -0
  73. package/lib/agents/skill-index-preamble.fixture.ts +26 -0
  74. package/lib/agents/transport.ts +741 -0
  75. package/lib/agents/types.ts +254 -0
  76. package/lib/agents/uai.ts +106 -0
  77. package/lib/agents/usage.ts +44 -0
  78. package/lib/apple-one-off.ts +277 -0
  79. package/lib/apple-runtime-recycle.ts +237 -0
  80. package/lib/apple-uninstall-teardown.ts +224 -0
  81. package/lib/assignment-evidence.ts +94 -0
  82. package/lib/attachments.ts +48 -0
  83. package/lib/browser-testing.ts +1537 -0
  84. package/lib/capture-flow.ts +332 -0
  85. package/lib/cloud-credential-cleanup-adapter.ts +123 -0
  86. package/lib/cloud-credential-host.ts +512 -0
  87. package/lib/cloud-credential-leases.ts +2587 -0
  88. package/lib/cloud-credential-runtime.ts +1357 -0
  89. package/lib/cloud-state.ts +56 -0
  90. package/lib/codex-auth.ts +456 -0
  91. package/lib/command-db.ts +310 -0
  92. package/lib/compose-network-recovery.ts +283 -0
  93. package/lib/connection-secret-redaction.ts +25 -0
  94. package/lib/container-runtime.ts +1470 -0
  95. package/lib/credential-cleanup-inventory.ts +490 -0
  96. package/lib/credential-consumers/engine-anchor.ts +1880 -0
  97. package/lib/credential-consumers/engines.ts +797 -0
  98. package/lib/credential-consumers/files.ts +934 -0
  99. package/lib/credential-consumers/github.ts +702 -0
  100. package/lib/credential-consumers/mcp.ts +389 -0
  101. package/lib/credential-consumers/task-files.ts +127 -0
  102. package/lib/credential-consumers/task-secrets.ts +10 -0
  103. package/lib/credential-store-pickup.ts +149 -0
  104. package/lib/credential-store-scope.ts +112 -0
  105. package/lib/credential-store.ts +932 -0
  106. package/lib/credentials-activation-authority.ts +709 -0
  107. package/lib/credentials-purge.ts +1006 -0
  108. package/lib/custom-connection-capture.ts +395 -0
  109. package/lib/custom-connection-launch.ts +384 -0
  110. package/lib/custom-connection-runtime.ts +141 -0
  111. package/lib/db.ts +80 -0
  112. package/lib/disk-pressure.ts +42 -0
  113. package/lib/docker-exec.ts +156 -0
  114. package/lib/engine-accounts.ts +1970 -0
  115. package/lib/engine-connect.ts +321 -0
  116. package/lib/engine-credential-env.ts +52 -0
  117. package/lib/engine-login.ts +2933 -0
  118. package/lib/engines.ts +1342 -0
  119. package/lib/enrollment-state.ts +251 -0
  120. package/lib/env-file.ts +246 -0
  121. package/lib/env-schema.ts +937 -0
  122. package/lib/env.ts +195 -0
  123. package/lib/first-turn-receipts.ts +62 -0
  124. package/lib/fs-aliases.ts +49 -0
  125. package/lib/git-clone-credentials.ts +334 -0
  126. package/lib/git-diff.ts +530 -0
  127. package/lib/git-identity.ts +715 -0
  128. package/lib/github-git-auth.ts +207 -0
  129. package/lib/github-origin.ts +28 -0
  130. package/lib/github-tokens.ts +2439 -0
  131. package/lib/host-cloud-url.ts +62 -0
  132. package/lib/host-config.ts +279 -0
  133. package/lib/host-env.ts +424 -0
  134. package/lib/host-logs.ts +965 -0
  135. package/lib/internal-connections.ts +5 -0
  136. package/lib/keyed-promise-tail.ts +23 -0
  137. package/lib/launch-mode.ts +25 -0
  138. package/lib/lease.ts +239 -0
  139. package/lib/legacy-host.ts +769 -0
  140. package/lib/legacy-runtime-retirement.ts +424 -0
  141. package/lib/legacy-runtime-v1.fixture.ts +627 -0
  142. package/lib/machine-exec.ts +238 -0
  143. package/lib/machine-gateway-tunnel.ts +344 -0
  144. package/lib/machine-keys.ts +65 -0
  145. package/lib/machine-project-env-loader.ts +152 -0
  146. package/lib/machine-provider-aws.ts +923 -0
  147. package/lib/machine-provider-local.ts +338 -0
  148. package/lib/machine-provider.ts +90 -0
  149. package/lib/managed-activation-watcher.ts +72 -0
  150. package/lib/managed-install-owner-watcher.ts +55 -0
  151. package/lib/managed-operation-drain.ts +57 -0
  152. package/lib/managed-runtime.ts +4296 -0
  153. package/lib/managed-update-scheduler.ts +125 -0
  154. package/lib/mcp-capture.ts +865 -0
  155. package/lib/mcp-config-lock.ts +2 -0
  156. package/lib/mcp-connections.ts +959 -0
  157. package/lib/mcp-gateway.ts +2594 -0
  158. package/lib/obs.ts +512 -0
  159. package/lib/openrouter-budget.ts +247 -0
  160. package/lib/orchestrator.ts +11409 -0
  161. package/lib/person-capture.ts +327 -0
  162. package/lib/preview-ports.ts +85 -0
  163. package/lib/preview-sidecar.ts +331 -0
  164. package/lib/project-env-authority.ts +1319 -0
  165. package/lib/project-env-feature.ts +74 -0
  166. package/lib/project-env-legacy-tags.ts +130 -0
  167. package/lib/project-env-loader.ts +242 -0
  168. package/lib/project-env-replica.ts +2094 -0
  169. package/lib/project-env-schema-capture.ts +342 -0
  170. package/lib/project-env-staging.ts +148 -0
  171. package/lib/project-env-task-policy.ts +176 -0
  172. package/lib/project-env-task-replica.ts +1752 -0
  173. package/lib/release-feed.ts +61 -0
  174. package/lib/release-manifest.ts +710 -0
  175. package/lib/release-trust.ts +46 -0
  176. package/lib/repo-clone.ts +38 -0
  177. package/lib/routing/shadow.ts +261 -0
  178. package/lib/runner-boot.ts +10 -0
  179. package/lib/runtime-activation-tail.ts +279 -0
  180. package/lib/runtime-archive.ts +1216 -0
  181. package/lib/runtime-authority.ts +166 -0
  182. package/lib/runtime-guard.ts +36 -0
  183. package/lib/runtime-provider-state.ts +169 -0
  184. package/lib/runtime-reconnect.ts +86 -0
  185. package/lib/runtime-state.ts +1033 -0
  186. package/lib/safe-http.ts +364 -0
  187. package/lib/secrets-proxy/address.ts +95 -0
  188. package/lib/secrets-proxy/audit.ts +30 -0
  189. package/lib/secrets-proxy/ca-store.ts +200 -0
  190. package/lib/secrets-proxy/ca.ts +470 -0
  191. package/lib/secrets-proxy/container-steps.ts +138 -0
  192. package/lib/secrets-proxy/der.ts +273 -0
  193. package/lib/secrets-proxy/engine.ts +1633 -0
  194. package/lib/secrets-proxy/host.ts +93 -0
  195. package/lib/secrets-proxy/hostname.ts +57 -0
  196. package/lib/secrets-proxy/placeholders.ts +196 -0
  197. package/lib/secrets-proxy/policy.ts +150 -0
  198. package/lib/secrets-proxy/readiness.ts +148 -0
  199. package/lib/secrets-proxy/runtime.ts +582 -0
  200. package/lib/secrets-proxy/scrub.ts +559 -0
  201. package/lib/secrets-proxy/sidecar-view.ts +139 -0
  202. package/lib/secrets-proxy/task-scripts.ts +262 -0
  203. package/lib/secrets-proxy/task-trust.ts +605 -0
  204. package/lib/secrets-proxy/trust-watch.ts +80 -0
  205. package/lib/secrets.ts +71 -0
  206. package/lib/shared-files-s3.ts +976 -0
  207. package/lib/shared-files.ts +156 -0
  208. package/lib/sidecar-assign.ts +49 -0
  209. package/lib/sidecar-guard.ts +58 -0
  210. package/lib/sidecar-resume.ts +178 -0
  211. package/lib/sidecar.ts +69 -0
  212. package/lib/signin-box-credentials.ts +465 -0
  213. package/lib/signin-box.ts +114 -0
  214. package/lib/skill-index-example.fixture.ts +56 -0
  215. package/lib/skill-layout.ts +417 -0
  216. package/lib/skills.ts +489 -0
  217. package/lib/ssh.ts +401 -0
  218. package/lib/standard-image-cleanup.ts +117 -0
  219. package/lib/standard-image-pin.ts +207 -0
  220. package/lib/standard-image.ts +1697 -0
  221. package/lib/stopped-task-status-queue.ts +120 -0
  222. package/lib/task-container-cli.ts +269 -0
  223. package/lib/task-credential-cleanup.ts +752 -0
  224. package/lib/task-diff-sandbox.ts +464 -0
  225. package/lib/task-diff.ts +91 -0
  226. package/lib/task-env-forwarder.ts +228 -0
  227. package/lib/task-env-source.ts +249 -0
  228. package/lib/task-environment/anchor.ts +31 -0
  229. package/lib/task-environment/apple-container.ts +860 -0
  230. package/lib/task-environment/docker.ts +1344 -0
  231. package/lib/task-environment/index.ts +466 -0
  232. package/lib/task-environment/legacy-adoption.ts +467 -0
  233. package/lib/task-environment/machine-environment.ts +61 -0
  234. package/lib/task-environment/machine-task-up.ts +1227 -0
  235. package/lib/task-environment/machine.ts +974 -0
  236. package/lib/task-environment/registry.ts +59 -0
  237. package/lib/task-environment/self-identity.ts +20 -0
  238. package/lib/task-environment/self.ts +566 -0
  239. package/lib/task-environment/types.ts +642 -0
  240. package/lib/task-environment/workspace-files.ts +685 -0
  241. package/lib/task-environment/workspace-runtime.fixture.ts +50 -0
  242. package/lib/task-files-machine-retirement-outbox.ts +592 -0
  243. package/lib/task-files-machine-retirement.ts +116 -0
  244. package/lib/task-files-readiness.ts +127 -0
  245. package/lib/task-gateway-port.ts +22 -0
  246. package/lib/task-gateway-protocol.ts +190 -0
  247. package/lib/task-gateway-recovery.ts +47 -0
  248. package/lib/task-gateway-state.ts +512 -0
  249. package/lib/task-identity.ts +19 -0
  250. package/lib/task-inventory.ts +682 -0
  251. package/lib/task-machine-credentials-activation.ts +95 -0
  252. package/lib/task-machine-swap-safety.ts +729 -0
  253. package/lib/task-person-credentials.ts +76 -0
  254. package/lib/task-project-ops-host.ts +147 -0
  255. package/lib/task-project-ops.ts +1062 -0
  256. package/lib/task-secret-staging.ts +16 -0
  257. package/lib/task-status.ts +46 -0
  258. package/lib/task-token.ts +46 -0
  259. package/lib/token-broker-adopt.ts +344 -0
  260. package/lib/token-broker-lambda.ts +105 -0
  261. package/lib/token-broker-local.ts +392 -0
  262. package/lib/token-broker-revision.ts +310 -0
  263. package/lib/token-broker-ssm.ts +525 -0
  264. package/lib/token-broker.ts +218 -0
  265. package/lib/token-lanes/openai-oauth.ts +123 -0
  266. package/lib/token-lanes/registry.ts +45 -0
  267. package/lib/token-lanes/types.ts +163 -0
  268. package/lib/token-lanes/xai-oauth.ts +165 -0
  269. package/lib/transcript.ts +128 -0
  270. package/lib/tunnel-registry.ts +220 -0
  271. package/lib/tunnel-runtime.ts +235 -0
  272. package/lib/ulid.ts +16 -0
  273. package/lib/user-bus-env.ts +116 -0
  274. package/lib/user-credentials-store.ts +435 -0
  275. package/lib/vnode-pressure.ts +142 -0
  276. package/package.json +115 -8
  277. package/runner/runner.mjs +442 -0
  278. package/scripts/agent/_common.sh +633 -0
  279. package/scripts/agent/env-hook.sh +626 -0
  280. package/scripts/agent/moondeck-cli.sh +5 -0
  281. package/scripts/agent/task-down.sh +291 -0
  282. package/scripts/agent/task-status.sh +70 -0
  283. package/scripts/agent/task-up.sh +3761 -0
  284. package/scripts/agent/uai-env-exec.sh +26 -0
  285. package/scripts/install/darwin.ts +1048 -0
  286. package/scripts/install/linux.ts +958 -0
  287. package/scripts/install/types.ts +78 -0
  288. package/scripts/install/util.ts +254 -0
  289. package/scripts/install/win.ts +143 -0
  290. package/src/activation-respawn.ts +155 -0
  291. package/src/apple-tunnel-route.ts +104 -0
  292. package/src/bridge-diagnostics.ts +39 -0
  293. package/src/capture-wire.ts +102 -0
  294. package/src/cli.ts +2585 -0
  295. package/src/cloud-credentials.ts +2144 -0
  296. package/src/cloud-origins.ts +23 -0
  297. package/src/credential-location.ts +248 -0
  298. package/src/credential-wire-validation.ts +25 -0
  299. package/src/custom-connections.ts +237 -0
  300. package/src/engine-account-paths.ts +11 -0
  301. package/src/engine-models.ts +39 -0
  302. package/src/engine-usage.ts +104 -0
  303. package/src/enrollment-next-steps.ts +24 -0
  304. package/src/event-outbox.ts +185 -0
  305. package/src/index.ts +2907 -0
  306. package/src/load-env.ts +97 -0
  307. package/src/machine-tunnel-route.ts +156 -0
  308. package/src/main.ts +6363 -0
  309. package/src/never-proxied-domains.ts +31 -0
  310. package/src/outbound-frame.ts +31 -0
  311. package/src/paths.ts +81 -0
  312. package/src/project-env-latest.ts +130 -0
  313. package/src/project-env-policy.ts +396 -0
  314. package/src/project-env-wording.ts +53 -0
  315. package/src/protocol.ts +5550 -0
  316. package/src/runtime-bootstrap.ts +165 -0
  317. package/src/station-identity.ts +96 -0
  318. package/src/task-env-names.ts +28 -0
  319. package/src/task-secrets.ts +75 -0
  320. package/src/tunnel-dial.ts +102 -0
  321. package/src/ui/server.ts +852 -0
  322. package/src/ui/types.ts +173 -0
  323. package/src/workspace-path-policy.ts +41 -0
  324. package/ui/app.js +1102 -0
  325. package/ui/index.html +90 -0
  326. package/ui/style.css +685 -0
  327. package/ui/uai-favicon.svg +21 -0
  328. package/ui/uai-logo-black.svg +9 -0
  329. package/ui/uai-wheel.svg +9 -0
  330. package/bin/moondeck-station.mjs +0 -3
package/ui/style.css ADDED
@@ -0,0 +1,685 @@
1
+ /* Local host UI (ADR-028). Design tokens borrowed from the marketing site:
2
+ warm off-white, dark via prefers-color-scheme, system fonts, quiet UI. */
3
+
4
+ :root {
5
+ --bg: #fafaf9;
6
+ --fg: #18181b;
7
+ --fg-muted: #5f5f66;
8
+ --line: #e7e5e4;
9
+ --tint: #f4f4f2;
10
+ --accent: #18181b;
11
+ --accent-fg: #fafaf9;
12
+ --ok: #15803d;
13
+ --warn: #b45309;
14
+ --bad: #b91c1c;
15
+ --radius: 10px;
16
+ --maxw: 56rem;
17
+ --font: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto,
18
+ "Helvetica Neue", Arial, "Noto Sans", sans-serif;
19
+ --mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
20
+ }
21
+
22
+ @media (prefers-color-scheme: dark) {
23
+ :root {
24
+ --bg: #0e0e10;
25
+ --fg: #f5f5f4;
26
+ --fg-muted: #a1a1aa;
27
+ --line: #27272a;
28
+ --tint: #19191c;
29
+ --accent: #f5f5f4;
30
+ --accent-fg: #0e0e10;
31
+ --ok: #4ade80;
32
+ --warn: #fbbf24;
33
+ --bad: #f87171;
34
+ }
35
+ }
36
+
37
+ * {
38
+ box-sizing: border-box;
39
+ }
40
+
41
+ html {
42
+ color-scheme: light dark;
43
+ }
44
+
45
+ body {
46
+ margin: 0;
47
+ background: var(--bg);
48
+ color: var(--fg);
49
+ font-family: var(--font);
50
+ font-size: 15px;
51
+ line-height: 1.5;
52
+ -webkit-font-smoothing: antialiased;
53
+ }
54
+
55
+ main {
56
+ max-width: var(--maxw);
57
+ margin: 0 auto;
58
+ padding: clamp(1.25rem, 4vw, 3rem) clamp(1rem, 4vw, 2rem) 4rem;
59
+ }
60
+
61
+ code,
62
+ .mono {
63
+ font-family: var(--mono);
64
+ font-size: 0.92em;
65
+ }
66
+
67
+ /* --- header --------------------------------------------------------------- */
68
+
69
+ .topbar {
70
+ display: flex;
71
+ align-items: center;
72
+ justify-content: space-between;
73
+ gap: 1rem;
74
+ padding-bottom: 1.5rem;
75
+ margin-bottom: 0.5rem;
76
+ border-bottom: 1px solid var(--line);
77
+ flex-wrap: wrap;
78
+ }
79
+
80
+ .brand {
81
+ display: flex;
82
+ align-items: center;
83
+ gap: 0.75rem;
84
+ }
85
+
86
+ .logo {
87
+ height: 30px;
88
+ width: auto;
89
+ }
90
+
91
+ @media (prefers-color-scheme: dark) {
92
+ .logo {
93
+ filter: invert(1);
94
+ }
95
+ }
96
+
97
+ .host-name {
98
+ font-weight: 600;
99
+ font-size: 1.05rem;
100
+ }
101
+
102
+ .host-sub {
103
+ color: var(--fg-muted);
104
+ font-size: 0.82rem;
105
+ }
106
+
107
+ /* --- connection badge ----------------------------------------------------- */
108
+
109
+ .badge-wrap {
110
+ position: relative;
111
+ }
112
+
113
+ .badge {
114
+ display: inline-flex;
115
+ align-items: center;
116
+ gap: 0.5rem;
117
+ padding: 0.4rem 0.75rem;
118
+ border: 1px solid var(--line);
119
+ border-radius: 999px;
120
+ background: var(--tint);
121
+ color: var(--fg);
122
+ font: inherit;
123
+ font-size: 0.85rem;
124
+ cursor: pointer;
125
+ }
126
+
127
+ .dot {
128
+ width: 8px;
129
+ height: 8px;
130
+ border-radius: 999px;
131
+ background: var(--fg-muted);
132
+ }
133
+
134
+ .dot.ok {
135
+ background: var(--ok);
136
+ }
137
+ .dot.warn {
138
+ background: var(--warn);
139
+ }
140
+ .dot.bad {
141
+ background: var(--bad);
142
+ }
143
+
144
+ .badge-detail {
145
+ position: absolute;
146
+ right: 0;
147
+ top: calc(100% + 0.4rem);
148
+ z-index: 10;
149
+ min-width: 16rem;
150
+ padding: 0.75rem 0.9rem;
151
+ border: 1px solid var(--line);
152
+ border-radius: var(--radius);
153
+ background: var(--bg);
154
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
155
+ font-size: 0.85rem;
156
+ }
157
+
158
+ .badge-detail .row {
159
+ display: flex;
160
+ justify-content: space-between;
161
+ gap: 1rem;
162
+ }
163
+
164
+ .badge-detail .err {
165
+ margin-top: 0.4rem;
166
+ color: var(--bad);
167
+ word-break: break-word;
168
+ }
169
+
170
+ /* --- panels --------------------------------------------------------------- */
171
+
172
+ .panel {
173
+ margin-top: 2rem;
174
+ }
175
+
176
+ .panel h2 {
177
+ font-size: 0.78rem;
178
+ text-transform: uppercase;
179
+ letter-spacing: 0.06em;
180
+ color: var(--fg-muted);
181
+ font-weight: 600;
182
+ margin: 0 0 0.75rem;
183
+ }
184
+
185
+ .count {
186
+ color: var(--fg-muted);
187
+ font-weight: 400;
188
+ }
189
+
190
+ .empty {
191
+ color: var(--fg-muted);
192
+ font-size: 0.9rem;
193
+ margin: 0.25rem 0;
194
+ }
195
+
196
+ /* --- service key/value ---------------------------------------------------- */
197
+
198
+ .kv {
199
+ display: grid;
200
+ grid-template-columns: max-content 1fr;
201
+ gap: 0.35rem 1.25rem;
202
+ margin: 0;
203
+ }
204
+
205
+ .kv dt {
206
+ color: var(--fg-muted);
207
+ font-size: 0.85rem;
208
+ }
209
+
210
+ .kv dd {
211
+ margin: 0;
212
+ font-family: var(--mono);
213
+ font-size: 0.85rem;
214
+ word-break: break-all;
215
+ }
216
+
217
+ /* --- tasks ---------------------------------------------------------------- */
218
+
219
+ .task {
220
+ border: 1px solid var(--line);
221
+ border-radius: var(--radius);
222
+ margin-bottom: 0.6rem;
223
+ overflow: hidden;
224
+ }
225
+
226
+ .task-head {
227
+ display: flex;
228
+ align-items: center;
229
+ gap: 0.75rem;
230
+ padding: 0.7rem 0.9rem;
231
+ cursor: pointer;
232
+ }
233
+
234
+ .task-head:hover {
235
+ background: var(--tint);
236
+ }
237
+
238
+ .task-main {
239
+ flex: 1;
240
+ min-width: 0;
241
+ }
242
+
243
+ .task-title {
244
+ display: flex;
245
+ align-items: baseline;
246
+ gap: 0.5rem;
247
+ flex-wrap: wrap;
248
+ }
249
+
250
+ .task-owner {
251
+ font-weight: 600;
252
+ }
253
+
254
+ .slug {
255
+ display: inline-block;
256
+ font-family: var(--mono);
257
+ font-size: 0.78rem;
258
+ color: var(--fg-muted);
259
+ background: var(--tint);
260
+ border: 1px solid var(--line);
261
+ border-radius: 6px;
262
+ padding: 0 0.35rem;
263
+ margin-right: 0.25rem;
264
+ }
265
+
266
+ .task-meta {
267
+ color: var(--fg-muted);
268
+ font-size: 0.82rem;
269
+ margin-top: 0.2rem;
270
+ }
271
+
272
+ .task-status {
273
+ font-size: 0.78rem;
274
+ color: var(--fg-muted);
275
+ }
276
+
277
+ .task-id {
278
+ font-family: var(--mono);
279
+ font-size: 0.72rem;
280
+ color: var(--fg-muted);
281
+ }
282
+
283
+ .task-stop {
284
+ flex: none;
285
+ font-size: 0.85rem;
286
+ opacity: 0;
287
+ transition: opacity 0.12s ease;
288
+ }
289
+ /* Reveal Stop on row hover; keep it visible mid-action so it doesn't vanish. */
290
+ .task-head:hover .task-stop,
291
+ .task-stop:disabled {
292
+ opacity: 1;
293
+ }
294
+
295
+ .chev {
296
+ color: var(--fg-muted);
297
+ transition: transform 0.15s ease;
298
+ }
299
+
300
+ .task.open .chev {
301
+ transform: rotate(90deg);
302
+ }
303
+
304
+ .task-events {
305
+ border-top: 1px solid var(--line);
306
+ background: var(--tint);
307
+ padding: 0.5rem 0.9rem 0.7rem;
308
+ }
309
+
310
+ .task-events ol {
311
+ margin: 0;
312
+ padding-left: 1.1rem;
313
+ }
314
+
315
+ /* --- events --------------------------------------------------------------- */
316
+
317
+ .events {
318
+ list-style: none;
319
+ margin: 0;
320
+ padding: 0;
321
+ }
322
+
323
+ .events li:not(.empty) {
324
+ display: flex;
325
+ align-items: baseline;
326
+ gap: 0.75rem;
327
+ padding: 0.4rem 0;
328
+ border-bottom: 1px solid var(--line);
329
+ font-size: 0.88rem;
330
+ }
331
+
332
+ .ev-kind {
333
+ font-family: var(--mono);
334
+ font-size: 0.8rem;
335
+ }
336
+
337
+ .ev-kind.created {
338
+ color: var(--fg-muted);
339
+ }
340
+ .ev-kind.started {
341
+ color: var(--ok);
342
+ }
343
+ .ev-kind.ended {
344
+ color: var(--fg-muted);
345
+ }
346
+ .ev-kind.ship {
347
+ color: var(--warn);
348
+ }
349
+
350
+ .ev-time {
351
+ color: var(--fg-muted);
352
+ font-size: 0.8rem;
353
+ white-space: nowrap;
354
+ }
355
+
356
+ .ev-task {
357
+ font-family: var(--mono);
358
+ font-size: 0.78rem;
359
+ color: var(--fg-muted);
360
+ margin-left: auto;
361
+ }
362
+
363
+ /* --- engines --------------------------------------------------------------- */
364
+
365
+ .panel h2 .add-engine {
366
+ float: right;
367
+ text-transform: none;
368
+ letter-spacing: 0;
369
+ }
370
+
371
+ .engines {
372
+ display: flex;
373
+ flex-direction: column;
374
+ gap: 0.6rem;
375
+ }
376
+
377
+ .engine-card {
378
+ display: flex;
379
+ align-items: center;
380
+ flex-wrap: wrap;
381
+ gap: 0.75rem;
382
+ border: 1px solid var(--line);
383
+ border-radius: var(--radius);
384
+ padding: 0.6rem 0.9rem;
385
+ }
386
+
387
+ /* ADR-076: accounts sub-panel spans the full card width below the head/actions. */
388
+ .engine-accounts {
389
+ flex-basis: 100%;
390
+ border-top: 1px solid var(--line);
391
+ padding-top: 0.5rem;
392
+ display: flex;
393
+ flex-direction: column;
394
+ gap: 0.35rem;
395
+ }
396
+
397
+ .engine-account-row {
398
+ display: flex;
399
+ align-items: center;
400
+ justify-content: space-between;
401
+ gap: 0.75rem;
402
+ font-size: 0.88rem;
403
+ }
404
+
405
+ .engine-head {
406
+ display: flex;
407
+ align-items: center;
408
+ gap: 0.6rem;
409
+ flex: 1;
410
+ min-width: 0;
411
+ }
412
+
413
+ .engine-mono {
414
+ display: inline-flex;
415
+ align-items: center;
416
+ justify-content: center;
417
+ width: 28px;
418
+ height: 28px;
419
+ flex: none;
420
+ border-radius: 8px;
421
+ background: var(--accent);
422
+ color: var(--accent-fg);
423
+ font-weight: 600;
424
+ font-size: 0.9rem;
425
+ }
426
+
427
+ .engine-meta {
428
+ min-width: 0;
429
+ }
430
+
431
+ .engine-name {
432
+ font-weight: 600;
433
+ }
434
+
435
+ .engine-sub {
436
+ color: var(--fg-muted);
437
+ font-size: 0.82rem;
438
+ }
439
+
440
+ .engine-sub.ok {
441
+ color: var(--ok);
442
+ }
443
+
444
+ /* --- buttons --------------------------------------------------------------- */
445
+
446
+ .btn {
447
+ display: inline-flex;
448
+ align-items: center;
449
+ gap: 0.4rem;
450
+ padding: 0.45rem 0.9rem;
451
+ border: 1px solid var(--accent);
452
+ border-radius: 8px;
453
+ background: var(--accent);
454
+ color: var(--accent-fg);
455
+ font: inherit;
456
+ font-size: 0.88rem;
457
+ cursor: pointer;
458
+ }
459
+
460
+ .btn:disabled {
461
+ opacity: 0.6;
462
+ cursor: default;
463
+ }
464
+
465
+ .link-btn {
466
+ border: none;
467
+ background: none;
468
+ padding: 0;
469
+ color: var(--fg-muted);
470
+ font: inherit;
471
+ font-size: 0.85rem;
472
+ cursor: pointer;
473
+ text-decoration: none;
474
+ }
475
+
476
+ .link-btn:hover {
477
+ color: var(--fg);
478
+ text-decoration: underline;
479
+ }
480
+
481
+ .link-btn.danger:hover {
482
+ color: var(--bad);
483
+ }
484
+
485
+ /* --- modal ----------------------------------------------------------------- */
486
+
487
+ .modal-backdrop {
488
+ position: fixed;
489
+ inset: 0;
490
+ z-index: 50;
491
+ display: flex;
492
+ align-items: flex-start;
493
+ justify-content: center;
494
+ padding: 8vh 1rem 1rem;
495
+ background: rgba(0, 0, 0, 0.4);
496
+ }
497
+
498
+ .modal-backdrop[hidden] {
499
+ display: none;
500
+ }
501
+
502
+ .modal {
503
+ width: 100%;
504
+ max-width: 32rem;
505
+ background: var(--bg);
506
+ border: 1px solid var(--line);
507
+ border-radius: var(--radius);
508
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.28);
509
+ overflow: hidden;
510
+ }
511
+
512
+ .modal-head {
513
+ display: flex;
514
+ align-items: center;
515
+ justify-content: space-between;
516
+ gap: 1rem;
517
+ padding: 0.9rem 1.1rem;
518
+ border-bottom: 1px solid var(--line);
519
+ }
520
+
521
+ .modal-head h3 {
522
+ margin: 0;
523
+ font-size: 1rem;
524
+ }
525
+
526
+ .modal-close {
527
+ border: none;
528
+ background: none;
529
+ color: var(--fg-muted);
530
+ font-size: 1.4rem;
531
+ line-height: 1;
532
+ cursor: pointer;
533
+ }
534
+
535
+ .modal-close:hover {
536
+ color: var(--fg);
537
+ }
538
+
539
+ .modal-body {
540
+ padding: 1.1rem;
541
+ }
542
+
543
+ /* --- engine picker + setup ------------------------------------------------- */
544
+
545
+ .engine-picker {
546
+ display: flex;
547
+ flex-direction: column;
548
+ gap: 0.4rem;
549
+ }
550
+
551
+ .engine-pick {
552
+ display: flex;
553
+ align-items: center;
554
+ gap: 0.7rem;
555
+ width: 100%;
556
+ text-align: left;
557
+ padding: 0.6rem 0.75rem;
558
+ border: 1px solid var(--line);
559
+ border-radius: var(--radius);
560
+ background: var(--bg);
561
+ color: var(--fg);
562
+ font: inherit;
563
+ cursor: pointer;
564
+ }
565
+
566
+ .engine-pick:hover {
567
+ background: var(--tint);
568
+ }
569
+
570
+ .engine-pick .chev {
571
+ margin-left: auto;
572
+ }
573
+
574
+ .engine-setup {
575
+ display: flex;
576
+ flex-direction: column;
577
+ gap: 0.7rem;
578
+ }
579
+
580
+ .setup-note {
581
+ margin: 0;
582
+ color: var(--fg-muted);
583
+ font-size: 0.88rem;
584
+ }
585
+
586
+ .field {
587
+ display: flex;
588
+ }
589
+
590
+ .text-input {
591
+ width: 100%;
592
+ padding: 0.5rem 0.7rem;
593
+ border: 1px solid var(--line);
594
+ border-radius: 8px;
595
+ background: var(--bg);
596
+ color: var(--fg);
597
+ font: inherit;
598
+ font-family: var(--mono);
599
+ font-size: 0.88rem;
600
+ }
601
+
602
+ .text-input:focus {
603
+ outline: none;
604
+ border-color: var(--fg-muted);
605
+ }
606
+
607
+ /* Add-account token field: long secrets must be fully visible (no truncation)
608
+ and wrap so a bad paste is obvious before saving. */
609
+ textarea.token-area {
610
+ resize: vertical;
611
+ min-height: 3.2rem;
612
+ line-height: 1.35;
613
+ word-break: break-all;
614
+ white-space: pre-wrap;
615
+ }
616
+
617
+ /* Copyable command row (e.g. `claude setup-token`) + Copy button. */
618
+ .copy-row {
619
+ display: flex;
620
+ align-items: center;
621
+ gap: 0.6rem;
622
+ }
623
+
624
+ .copy-cmd {
625
+ flex: 1;
626
+ padding: 0.45rem 0.7rem;
627
+ border: 1px solid var(--line);
628
+ border-radius: 8px;
629
+ background: var(--bg);
630
+ color: var(--fg);
631
+ font-family: var(--mono);
632
+ font-size: 0.85rem;
633
+ word-break: break-all;
634
+ }
635
+
636
+ .setup-or {
637
+ margin-top: 0.4rem;
638
+ }
639
+
640
+ .setup-actions {
641
+ display: flex;
642
+ align-items: center;
643
+ gap: 1rem;
644
+ }
645
+
646
+ .setup-status {
647
+ font-size: 0.85rem;
648
+ color: var(--fg-muted);
649
+ min-height: 1.1rem;
650
+ }
651
+
652
+ .setup-status.err {
653
+ color: var(--bad);
654
+ }
655
+
656
+ .log {
657
+ margin: 0;
658
+ max-height: 14rem;
659
+ overflow: auto;
660
+ padding: 0.6rem 0.75rem;
661
+ border: 1px solid var(--line);
662
+ border-radius: 8px;
663
+ background: var(--tint);
664
+ color: var(--fg-muted);
665
+ font-family: var(--mono);
666
+ font-size: 0.78rem;
667
+ line-height: 1.45;
668
+ white-space: pre-wrap;
669
+ word-break: break-word;
670
+ }
671
+
672
+ .back {
673
+ margin-top: 0.3rem;
674
+ align-self: flex-start;
675
+ }
676
+
677
+ /* --- footer --------------------------------------------------------------- */
678
+
679
+ .foot {
680
+ margin-top: 3rem;
681
+ padding-top: 1rem;
682
+ border-top: 1px solid var(--line);
683
+ color: var(--fg-muted);
684
+ font-size: 0.78rem;
685
+ }
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 341.02 341.02">
3
+ <defs>
4
+ <style>
5
+ .cls-1 {
6
+ fill: #231f20;
7
+ }
8
+
9
+ .cls-2 {
10
+ fill: #fff;
11
+ }
12
+ </style>
13
+ </defs>
14
+ <g id="Layer_1-2" data-name="Layer 1">
15
+ <rect class="cls-1" x="0" width="341.02" height="341.02"/>
16
+ <g>
17
+ <path class="cls-2" d="M170.51,43.13c-70.35,0-127.37,57.03-127.37,127.37s57.03,127.37,127.37,127.37,127.37-57.03,127.37-127.37-57.03-127.37-127.37-127.37ZM170.51,269.54c-54.69,0-99.03-44.34-99.03-99.03s44.34-99.03,99.03-99.03,99.03,44.34,99.03,99.03-44.34,99.03-99.03,99.03Z"/>
18
+ <path class="cls-2" d="M170.59,99.55c-4.31,0-8.53.4-12.63,1.14l-53.93,95.15c3.15,8.33,7.81,15.91,13.65,22.41h105.8c5.74-6.39,10.34-13.82,13.48-21.98l-54.22-95.67c-3.96-.68-8.02-1.06-12.17-1.06ZM194.08,169.79c0,13.02-10.55,23.57-23.57,23.57s-23.57-10.55-23.57-23.57,10.55-23.57,23.57-23.57,23.57,10.55,23.57,23.57Z"/>
19
+ </g>
20
+ </g>
21
+ </svg>
@@ -0,0 +1,9 @@
1
+ <svg width="250" height="148" viewBox="0 0 250 148" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M100.415 69.076C100.415 93.25 81.6825 112.847 58.5752 112.847H41.8394C18.7322 112.847 0 93.25 0 69.076V3.38385e-07H29.2876V68.3921C29.2876 80.4791 38.6537 90.2775 50.2073 90.2775C61.761 90.2775 71.127 80.4791 71.127 68.3921V3.38385e-07H100.415V69.076Z" fill="black"/>
3
+ <path d="M112.847 64.6305C112.847 47.4219 126.762 33.4715 143.928 33.4715H156.36C173.525 33.4716 187.441 47.4219 187.441 64.6305V113.803H165.684V65.1174C165.684 56.5131 158.726 49.5379 150.144 49.5379C141.561 49.5379 134.603 56.5131 134.603 65.1174V113.803H112.847V64.6305Z" fill="black"/>
4
+ <path d="M197.96 38.2532H219.956V113.803H197.96V38.2532Z" fill="black"/>
5
+ <path d="M233.344 8.1288C233.344 3.63939 236.984 3.38385e-07 241.473 3.38385e-07C245.963 3.38385e-07 249.602 3.63939 249.602 8.1288V139.146C249.602 143.635 245.963 147.275 241.473 147.275C236.984 147.275 233.344 143.635 233.344 139.146V8.1288Z" fill="black"/>
6
+ <path d="M112.847 16.2576V5.81055e-06L245.777 0V16.2576L112.847 16.2576Z" fill="black"/>
7
+ <path d="M115.716 90.8513V74.5937L182.659 74.5937V90.8513H115.716Z" fill="black"/>
8
+ <path d="M2.86899 147.275L2.86899 131.017L249.602 131.017V147.275L2.86899 147.275Z" fill="black"/>
9
+ </svg>
@@ -0,0 +1,9 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- Uai "wheel" mark (brand 8a5db40). Dark fill on transparent bg so the
3
+ header's dark-mode `filter: invert(1)` renders it white on dark. -->
4
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 341.02 341.02">
5
+ <g fill="#231f20">
6
+ <path d="M170.51,43.13c-70.35,0-127.37,57.03-127.37,127.37s57.03,127.37,127.37,127.37,127.37-57.03,127.37-127.37-57.03-127.37-127.37-127.37ZM170.51,269.54c-54.69,0-99.03-44.34-99.03-99.03s44.34-99.03,99.03-99.03,99.03,44.34,99.03,99.03-44.34,99.03-99.03,99.03Z"/>
7
+ <path d="M170.59,99.55c-4.31,0-8.53.4-12.63,1.14l-53.93,95.15c3.15,8.33,7.81,15.91,13.65,22.41h105.8c5.74-6.39,10.34-13.82,13.48-21.98l-54.22-95.67c-3.96-.68-8.02-1.06-12.17-1.06ZM194.08,169.79c0,13.02-10.55,23.57-23.57,23.57s-23.57-10.55-23.57-23.57,10.55-23.57,23.57-23.57,23.57,10.55,23.57,23.57Z"/>
8
+ </g>
9
+ </svg>
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- console.error('Moondeck Station has not been released yet. See https://moondeck.io.');
3
- process.exit(1);