@hoangsonw/forge 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +919 -0
  3. package/bin/forge.js +30 -0
  4. package/dist/agents/architect.d.ts +20 -0
  5. package/dist/agents/architect.d.ts.map +1 -0
  6. package/dist/agents/architect.js +75 -0
  7. package/dist/agents/architect.js.map +1 -0
  8. package/dist/agents/base.d.ts +20 -0
  9. package/dist/agents/base.d.ts.map +1 -0
  10. package/dist/agents/base.js +3 -0
  11. package/dist/agents/base.js.map +1 -0
  12. package/dist/agents/debugger.d.ts +16 -0
  13. package/dist/agents/debugger.d.ts.map +1 -0
  14. package/dist/agents/debugger.js +93 -0
  15. package/dist/agents/debugger.js.map +1 -0
  16. package/dist/agents/executor.d.ts +48 -0
  17. package/dist/agents/executor.d.ts.map +1 -0
  18. package/dist/agents/executor.js +402 -0
  19. package/dist/agents/executor.js.map +1 -0
  20. package/dist/agents/memory.d.ts +8 -0
  21. package/dist/agents/memory.d.ts.map +1 -0
  22. package/dist/agents/memory.js +84 -0
  23. package/dist/agents/memory.js.map +1 -0
  24. package/dist/agents/planner.d.ts +5 -0
  25. package/dist/agents/planner.d.ts.map +1 -0
  26. package/dist/agents/planner.js +185 -0
  27. package/dist/agents/planner.js.map +1 -0
  28. package/dist/agents/registry.d.ts +6 -0
  29. package/dist/agents/registry.d.ts.map +1 -0
  30. package/dist/agents/registry.js +32 -0
  31. package/dist/agents/registry.js.map +1 -0
  32. package/dist/agents/reviewer.d.ts +18 -0
  33. package/dist/agents/reviewer.d.ts.map +1 -0
  34. package/dist/agents/reviewer.js +87 -0
  35. package/dist/agents/reviewer.js.map +1 -0
  36. package/dist/classifier/classifier.d.ts +9 -0
  37. package/dist/classifier/classifier.d.ts.map +1 -0
  38. package/dist/classifier/classifier.js +83 -0
  39. package/dist/classifier/classifier.js.map +1 -0
  40. package/dist/classifier/heuristics.d.ts +11 -0
  41. package/dist/classifier/heuristics.d.ts.map +1 -0
  42. package/dist/classifier/heuristics.js +112 -0
  43. package/dist/classifier/heuristics.js.map +1 -0
  44. package/dist/cli/animations.d.ts +27 -0
  45. package/dist/cli/animations.d.ts.map +1 -0
  46. package/dist/cli/animations.js +186 -0
  47. package/dist/cli/animations.js.map +1 -0
  48. package/dist/cli/banners.d.ts +47 -0
  49. package/dist/cli/banners.d.ts.map +1 -0
  50. package/dist/cli/banners.js +211 -0
  51. package/dist/cli/banners.js.map +1 -0
  52. package/dist/cli/bootstrap.d.ts +2 -0
  53. package/dist/cli/bootstrap.d.ts.map +1 -0
  54. package/dist/cli/bootstrap.js +21 -0
  55. package/dist/cli/bootstrap.js.map +1 -0
  56. package/dist/cli/commands/bundle.d.ts +3 -0
  57. package/dist/cli/commands/bundle.d.ts.map +1 -0
  58. package/dist/cli/commands/bundle.js +80 -0
  59. package/dist/cli/commands/bundle.js.map +1 -0
  60. package/dist/cli/commands/changelog.d.ts +3 -0
  61. package/dist/cli/commands/changelog.d.ts.map +1 -0
  62. package/dist/cli/commands/changelog.js +60 -0
  63. package/dist/cli/commands/changelog.js.map +1 -0
  64. package/dist/cli/commands/config.d.ts +3 -0
  65. package/dist/cli/commands/config.d.ts.map +1 -0
  66. package/dist/cli/commands/config.js +91 -0
  67. package/dist/cli/commands/config.js.map +1 -0
  68. package/dist/cli/commands/container.d.ts +3 -0
  69. package/dist/cli/commands/container.d.ts.map +1 -0
  70. package/dist/cli/commands/container.js +149 -0
  71. package/dist/cli/commands/container.js.map +1 -0
  72. package/dist/cli/commands/cost.d.ts +3 -0
  73. package/dist/cli/commands/cost.d.ts.map +1 -0
  74. package/dist/cli/commands/cost.js +38 -0
  75. package/dist/cli/commands/cost.js.map +1 -0
  76. package/dist/cli/commands/daemon.d.ts +3 -0
  77. package/dist/cli/commands/daemon.d.ts.map +1 -0
  78. package/dist/cli/commands/daemon.js +39 -0
  79. package/dist/cli/commands/daemon.js.map +1 -0
  80. package/dist/cli/commands/dev.d.ts +3 -0
  81. package/dist/cli/commands/dev.d.ts.map +1 -0
  82. package/dist/cli/commands/dev.js +73 -0
  83. package/dist/cli/commands/dev.js.map +1 -0
  84. package/dist/cli/commands/doctor.d.ts +3 -0
  85. package/dist/cli/commands/doctor.d.ts.map +1 -0
  86. package/dist/cli/commands/doctor.js +214 -0
  87. package/dist/cli/commands/doctor.js.map +1 -0
  88. package/dist/cli/commands/init.d.ts +3 -0
  89. package/dist/cli/commands/init.d.ts.map +1 -0
  90. package/dist/cli/commands/init.js +148 -0
  91. package/dist/cli/commands/init.js.map +1 -0
  92. package/dist/cli/commands/mcp.d.ts +3 -0
  93. package/dist/cli/commands/mcp.d.ts.map +1 -0
  94. package/dist/cli/commands/mcp.js +227 -0
  95. package/dist/cli/commands/mcp.js.map +1 -0
  96. package/dist/cli/commands/memory.d.ts +3 -0
  97. package/dist/cli/commands/memory.d.ts.map +1 -0
  98. package/dist/cli/commands/memory.js +101 -0
  99. package/dist/cli/commands/memory.js.map +1 -0
  100. package/dist/cli/commands/migrate.d.ts +3 -0
  101. package/dist/cli/commands/migrate.d.ts.map +1 -0
  102. package/dist/cli/commands/migrate.js +18 -0
  103. package/dist/cli/commands/migrate.js.map +1 -0
  104. package/dist/cli/commands/model.d.ts +3 -0
  105. package/dist/cli/commands/model.d.ts.map +1 -0
  106. package/dist/cli/commands/model.js +37 -0
  107. package/dist/cli/commands/model.js.map +1 -0
  108. package/dist/cli/commands/permissions.d.ts +3 -0
  109. package/dist/cli/commands/permissions.d.ts.map +1 -0
  110. package/dist/cli/commands/permissions.js +32 -0
  111. package/dist/cli/commands/permissions.js.map +1 -0
  112. package/dist/cli/commands/resume.d.ts +3 -0
  113. package/dist/cli/commands/resume.d.ts.map +1 -0
  114. package/dist/cli/commands/resume.js +90 -0
  115. package/dist/cli/commands/resume.js.map +1 -0
  116. package/dist/cli/commands/run.d.ts +5 -0
  117. package/dist/cli/commands/run.d.ts.map +1 -0
  118. package/dist/cli/commands/run.js +164 -0
  119. package/dist/cli/commands/run.js.map +1 -0
  120. package/dist/cli/commands/session.d.ts +3 -0
  121. package/dist/cli/commands/session.d.ts.map +1 -0
  122. package/dist/cli/commands/session.js +94 -0
  123. package/dist/cli/commands/session.js.map +1 -0
  124. package/dist/cli/commands/skills.d.ts +4 -0
  125. package/dist/cli/commands/skills.d.ts.map +1 -0
  126. package/dist/cli/commands/skills.js +176 -0
  127. package/dist/cli/commands/skills.js.map +1 -0
  128. package/dist/cli/commands/spec.d.ts +3 -0
  129. package/dist/cli/commands/spec.d.ts.map +1 -0
  130. package/dist/cli/commands/spec.js +58 -0
  131. package/dist/cli/commands/spec.js.map +1 -0
  132. package/dist/cli/commands/status.d.ts +3 -0
  133. package/dist/cli/commands/status.d.ts.map +1 -0
  134. package/dist/cli/commands/status.js +65 -0
  135. package/dist/cli/commands/status.js.map +1 -0
  136. package/dist/cli/commands/task.d.ts +3 -0
  137. package/dist/cli/commands/task.d.ts.map +1 -0
  138. package/dist/cli/commands/task.js +42 -0
  139. package/dist/cli/commands/task.js.map +1 -0
  140. package/dist/cli/commands/ui.d.ts +3 -0
  141. package/dist/cli/commands/ui.d.ts.map +1 -0
  142. package/dist/cli/commands/ui.js +28 -0
  143. package/dist/cli/commands/ui.js.map +1 -0
  144. package/dist/cli/commands/update.d.ts +3 -0
  145. package/dist/cli/commands/update.d.ts.map +1 -0
  146. package/dist/cli/commands/update.js +53 -0
  147. package/dist/cli/commands/update.js.map +1 -0
  148. package/dist/cli/commands/web.d.ts +3 -0
  149. package/dist/cli/commands/web.d.ts.map +1 -0
  150. package/dist/cli/commands/web.js +42 -0
  151. package/dist/cli/commands/web.js.map +1 -0
  152. package/dist/cli/help.d.ts +21 -0
  153. package/dist/cli/help.d.ts.map +1 -0
  154. package/dist/cli/help.js +216 -0
  155. package/dist/cli/help.js.map +1 -0
  156. package/dist/cli/index.d.ts +3 -0
  157. package/dist/cli/index.d.ts.map +1 -0
  158. package/dist/cli/index.js +154 -0
  159. package/dist/cli/index.js.map +1 -0
  160. package/dist/cli/repl-commands.d.ts +47 -0
  161. package/dist/cli/repl-commands.d.ts.map +1 -0
  162. package/dist/cli/repl-commands.js +508 -0
  163. package/dist/cli/repl-commands.js.map +1 -0
  164. package/dist/cli/repl-input.d.ts +87 -0
  165. package/dist/cli/repl-input.d.ts.map +1 -0
  166. package/dist/cli/repl-input.js +764 -0
  167. package/dist/cli/repl-input.js.map +1 -0
  168. package/dist/cli/repl.d.ts +5 -0
  169. package/dist/cli/repl.d.ts.map +1 -0
  170. package/dist/cli/repl.js +1046 -0
  171. package/dist/cli/repl.js.map +1 -0
  172. package/dist/cli/ui.d.ts +19 -0
  173. package/dist/cli/ui.d.ts.map +1 -0
  174. package/dist/cli/ui.js +106 -0
  175. package/dist/cli/ui.js.map +1 -0
  176. package/dist/config/loader.d.ts +11 -0
  177. package/dist/config/loader.d.ts.map +1 -0
  178. package/dist/config/loader.js +132 -0
  179. package/dist/config/loader.js.map +1 -0
  180. package/dist/config/paths.d.ts +35 -0
  181. package/dist/config/paths.d.ts.map +1 -0
  182. package/dist/config/paths.js +114 -0
  183. package/dist/config/paths.js.map +1 -0
  184. package/dist/config/schema.d.ts +372 -0
  185. package/dist/config/schema.d.ts.map +1 -0
  186. package/dist/config/schema.js +161 -0
  187. package/dist/config/schema.js.map +1 -0
  188. package/dist/config/xdg.d.ts +2 -0
  189. package/dist/config/xdg.d.ts.map +1 -0
  190. package/dist/config/xdg.js +55 -0
  191. package/dist/config/xdg.js.map +1 -0
  192. package/dist/core/continuity.d.ts +8 -0
  193. package/dist/core/continuity.d.ts.map +1 -0
  194. package/dist/core/continuity.js +36 -0
  195. package/dist/core/continuity.js.map +1 -0
  196. package/dist/core/conversation.d.ts +152 -0
  197. package/dist/core/conversation.d.ts.map +1 -0
  198. package/dist/core/conversation.js +435 -0
  199. package/dist/core/conversation.js.map +1 -0
  200. package/dist/core/estimation.d.ts +19 -0
  201. package/dist/core/estimation.d.ts.map +1 -0
  202. package/dist/core/estimation.js +53 -0
  203. package/dist/core/estimation.js.map +1 -0
  204. package/dist/core/fork.d.ts +7 -0
  205. package/dist/core/fork.d.ts.map +1 -0
  206. package/dist/core/fork.js +93 -0
  207. package/dist/core/fork.js.map +1 -0
  208. package/dist/core/interactive-host.d.ts +28 -0
  209. package/dist/core/interactive-host.d.ts.map +1 -0
  210. package/dist/core/interactive-host.js +19 -0
  211. package/dist/core/interactive-host.js.map +1 -0
  212. package/dist/core/loop-detection.d.ts +25 -0
  213. package/dist/core/loop-detection.d.ts.map +1 -0
  214. package/dist/core/loop-detection.js +37 -0
  215. package/dist/core/loop-detection.js.map +1 -0
  216. package/dist/core/loop.d.ts +15 -0
  217. package/dist/core/loop.d.ts.map +1 -0
  218. package/dist/core/loop.js +417 -0
  219. package/dist/core/loop.js.map +1 -0
  220. package/dist/core/mode-policy.d.ts +33 -0
  221. package/dist/core/mode-policy.d.ts.map +1 -0
  222. package/dist/core/mode-policy.js +62 -0
  223. package/dist/core/mode-policy.js.map +1 -0
  224. package/dist/core/orchestrator.d.ts +14 -0
  225. package/dist/core/orchestrator.d.ts.map +1 -0
  226. package/dist/core/orchestrator.js +69 -0
  227. package/dist/core/orchestrator.js.map +1 -0
  228. package/dist/core/plan-fixer.d.ts +16 -0
  229. package/dist/core/plan-fixer.d.ts.map +1 -0
  230. package/dist/core/plan-fixer.js +55 -0
  231. package/dist/core/plan-fixer.js.map +1 -0
  232. package/dist/core/signals.d.ts +5 -0
  233. package/dist/core/signals.d.ts.map +1 -0
  234. package/dist/core/signals.js +44 -0
  235. package/dist/core/signals.js.map +1 -0
  236. package/dist/core/spec.d.ts +8 -0
  237. package/dist/core/spec.d.ts.map +1 -0
  238. package/dist/core/spec.js +75 -0
  239. package/dist/core/spec.js.map +1 -0
  240. package/dist/core/validation.d.ts +21 -0
  241. package/dist/core/validation.d.ts.map +1 -0
  242. package/dist/core/validation.js +126 -0
  243. package/dist/core/validation.js.map +1 -0
  244. package/dist/daemon/control.d.ts +9 -0
  245. package/dist/daemon/control.d.ts.map +1 -0
  246. package/dist/daemon/control.js +88 -0
  247. package/dist/daemon/control.js.map +1 -0
  248. package/dist/daemon/server.d.ts +8 -0
  249. package/dist/daemon/server.d.ts.map +1 -0
  250. package/dist/daemon/server.js +129 -0
  251. package/dist/daemon/server.js.map +1 -0
  252. package/dist/daemon/updater.d.ts +21 -0
  253. package/dist/daemon/updater.d.ts.map +1 -0
  254. package/dist/daemon/updater.js +159 -0
  255. package/dist/daemon/updater.js.map +1 -0
  256. package/dist/keychain/index.d.ts +8 -0
  257. package/dist/keychain/index.d.ts.map +1 -0
  258. package/dist/keychain/index.js +243 -0
  259. package/dist/keychain/index.js.map +1 -0
  260. package/dist/keychain/windows.d.ts +5 -0
  261. package/dist/keychain/windows.d.ts.map +1 -0
  262. package/dist/keychain/windows.js +65 -0
  263. package/dist/keychain/windows.js.map +1 -0
  264. package/dist/logging/logger.d.ts +12 -0
  265. package/dist/logging/logger.d.ts.map +1 -0
  266. package/dist/logging/logger.js +127 -0
  267. package/dist/logging/logger.js.map +1 -0
  268. package/dist/logging/rotation.d.ts +9 -0
  269. package/dist/logging/rotation.d.ts.map +1 -0
  270. package/dist/logging/rotation.js +85 -0
  271. package/dist/logging/rotation.js.map +1 -0
  272. package/dist/logging/trace.d.ts +7 -0
  273. package/dist/logging/trace.d.ts.map +1 -0
  274. package/dist/logging/trace.js +50 -0
  275. package/dist/logging/trace.js.map +1 -0
  276. package/dist/mcp/client.d.ts +37 -0
  277. package/dist/mcp/client.d.ts.map +1 -0
  278. package/dist/mcp/client.js +111 -0
  279. package/dist/mcp/client.js.map +1 -0
  280. package/dist/mcp/http-transport.d.ts +30 -0
  281. package/dist/mcp/http-transport.d.ts.map +1 -0
  282. package/dist/mcp/http-transport.js +109 -0
  283. package/dist/mcp/http-transport.js.map +1 -0
  284. package/dist/mcp/oauth.d.ts +23 -0
  285. package/dist/mcp/oauth.d.ts.map +1 -0
  286. package/dist/mcp/oauth.js +235 -0
  287. package/dist/mcp/oauth.js.map +1 -0
  288. package/dist/mcp/registry.d.ts +5 -0
  289. package/dist/mcp/registry.d.ts.map +1 -0
  290. package/dist/mcp/registry.js +35 -0
  291. package/dist/mcp/registry.js.map +1 -0
  292. package/dist/memory/cold.d.ts +16 -0
  293. package/dist/memory/cold.d.ts.map +1 -0
  294. package/dist/memory/cold.js +244 -0
  295. package/dist/memory/cold.js.map +1 -0
  296. package/dist/memory/graph.d.ts +19 -0
  297. package/dist/memory/graph.d.ts.map +1 -0
  298. package/dist/memory/graph.js +102 -0
  299. package/dist/memory/graph.js.map +1 -0
  300. package/dist/memory/hot.d.ts +26 -0
  301. package/dist/memory/hot.d.ts.map +1 -0
  302. package/dist/memory/hot.js +58 -0
  303. package/dist/memory/hot.js.map +1 -0
  304. package/dist/memory/index.d.ts +7 -0
  305. package/dist/memory/index.d.ts.map +1 -0
  306. package/dist/memory/index.js +26 -0
  307. package/dist/memory/index.js.map +1 -0
  308. package/dist/memory/learning.d.ts +18 -0
  309. package/dist/memory/learning.d.ts.map +1 -0
  310. package/dist/memory/learning.js +83 -0
  311. package/dist/memory/learning.js.map +1 -0
  312. package/dist/memory/retrieval.d.ts +21 -0
  313. package/dist/memory/retrieval.d.ts.map +1 -0
  314. package/dist/memory/retrieval.js +114 -0
  315. package/dist/memory/retrieval.js.map +1 -0
  316. package/dist/memory/warm.d.ts +9 -0
  317. package/dist/memory/warm.d.ts.map +1 -0
  318. package/dist/memory/warm.js +150 -0
  319. package/dist/memory/warm.js.map +1 -0
  320. package/dist/migrations/runner.d.ts +18 -0
  321. package/dist/migrations/runner.d.ts.map +1 -0
  322. package/dist/migrations/runner.js +62 -0
  323. package/dist/migrations/runner.js.map +1 -0
  324. package/dist/models/adapter.d.ts +46 -0
  325. package/dist/models/adapter.d.ts.map +1 -0
  326. package/dist/models/adapter.js +85 -0
  327. package/dist/models/adapter.js.map +1 -0
  328. package/dist/models/anthropic.d.ts +17 -0
  329. package/dist/models/anthropic.d.ts.map +1 -0
  330. package/dist/models/anthropic.js +128 -0
  331. package/dist/models/anthropic.js.map +1 -0
  332. package/dist/models/cache.d.ts +5 -0
  333. package/dist/models/cache.d.ts.map +1 -0
  334. package/dist/models/cache.js +135 -0
  335. package/dist/models/cache.js.map +1 -0
  336. package/dist/models/circuit-breaker.d.ts +18 -0
  337. package/dist/models/circuit-breaker.d.ts.map +1 -0
  338. package/dist/models/circuit-breaker.js +63 -0
  339. package/dist/models/circuit-breaker.js.map +1 -0
  340. package/dist/models/cost.d.ts +13 -0
  341. package/dist/models/cost.d.ts.map +1 -0
  342. package/dist/models/cost.js +92 -0
  343. package/dist/models/cost.js.map +1 -0
  344. package/dist/models/llamacpp.d.ts +9 -0
  345. package/dist/models/llamacpp.d.ts.map +1 -0
  346. package/dist/models/llamacpp.js +15 -0
  347. package/dist/models/llamacpp.js.map +1 -0
  348. package/dist/models/lmstudio.d.ts +11 -0
  349. package/dist/models/lmstudio.d.ts.map +1 -0
  350. package/dist/models/lmstudio.js +18 -0
  351. package/dist/models/lmstudio.js.map +1 -0
  352. package/dist/models/local-catalog.d.ts +45 -0
  353. package/dist/models/local-catalog.d.ts.map +1 -0
  354. package/dist/models/local-catalog.js +314 -0
  355. package/dist/models/local-catalog.js.map +1 -0
  356. package/dist/models/ollama.d.ts +10 -0
  357. package/dist/models/ollama.d.ts.map +1 -0
  358. package/dist/models/ollama.js +98 -0
  359. package/dist/models/ollama.js.map +1 -0
  360. package/dist/models/openai.d.ts +16 -0
  361. package/dist/models/openai.d.ts.map +1 -0
  362. package/dist/models/openai.js +139 -0
  363. package/dist/models/openai.js.map +1 -0
  364. package/dist/models/provider.d.ts +7 -0
  365. package/dist/models/provider.d.ts.map +1 -0
  366. package/dist/models/provider.js +39 -0
  367. package/dist/models/provider.js.map +1 -0
  368. package/dist/models/rate-limit.d.ts +13 -0
  369. package/dist/models/rate-limit.d.ts.map +1 -0
  370. package/dist/models/rate-limit.js +37 -0
  371. package/dist/models/rate-limit.js.map +1 -0
  372. package/dist/models/registry.d.ts +2 -0
  373. package/dist/models/registry.d.ts.map +1 -0
  374. package/dist/models/registry.js +69 -0
  375. package/dist/models/registry.js.map +1 -0
  376. package/dist/models/router.d.ts +26 -0
  377. package/dist/models/router.d.ts.map +1 -0
  378. package/dist/models/router.js +185 -0
  379. package/dist/models/router.js.map +1 -0
  380. package/dist/models/vllm.d.ts +13 -0
  381. package/dist/models/vllm.d.ts.map +1 -0
  382. package/dist/models/vllm.js +19 -0
  383. package/dist/models/vllm.js.map +1 -0
  384. package/dist/notifications/manager.d.ts +5 -0
  385. package/dist/notifications/manager.d.ts.map +1 -0
  386. package/dist/notifications/manager.js +65 -0
  387. package/dist/notifications/manager.js.map +1 -0
  388. package/dist/permissions/manager.d.ts +15 -0
  389. package/dist/permissions/manager.d.ts.map +1 -0
  390. package/dist/permissions/manager.js +159 -0
  391. package/dist/permissions/manager.js.map +1 -0
  392. package/dist/permissions/risk.d.ts +13 -0
  393. package/dist/permissions/risk.d.ts.map +1 -0
  394. package/dist/permissions/risk.js +43 -0
  395. package/dist/permissions/risk.js.map +1 -0
  396. package/dist/persistence/compression.d.ts +9 -0
  397. package/dist/persistence/compression.d.ts.map +1 -0
  398. package/dist/persistence/compression.js +126 -0
  399. package/dist/persistence/compression.js.map +1 -0
  400. package/dist/persistence/conversation-store.d.ts +67 -0
  401. package/dist/persistence/conversation-store.d.ts.map +1 -0
  402. package/dist/persistence/conversation-store.js +370 -0
  403. package/dist/persistence/conversation-store.js.map +1 -0
  404. package/dist/persistence/events.d.ts +4 -0
  405. package/dist/persistence/events.d.ts.map +1 -0
  406. package/dist/persistence/events.js +50 -0
  407. package/dist/persistence/events.js.map +1 -0
  408. package/dist/persistence/index-db.d.ts +65 -0
  409. package/dist/persistence/index-db.d.ts.map +1 -0
  410. package/dist/persistence/index-db.js +280 -0
  411. package/dist/persistence/index-db.js.map +1 -0
  412. package/dist/persistence/jsonl.d.ts +8 -0
  413. package/dist/persistence/jsonl.d.ts.map +1 -0
  414. package/dist/persistence/jsonl.js +90 -0
  415. package/dist/persistence/jsonl.js.map +1 -0
  416. package/dist/persistence/sessions.d.ts +5 -0
  417. package/dist/persistence/sessions.d.ts.map +1 -0
  418. package/dist/persistence/sessions.js +54 -0
  419. package/dist/persistence/sessions.js.map +1 -0
  420. package/dist/persistence/tasks.d.ts +7 -0
  421. package/dist/persistence/tasks.d.ts.map +1 -0
  422. package/dist/persistence/tasks.js +162 -0
  423. package/dist/persistence/tasks.js.map +1 -0
  424. package/dist/prompts/assembler.d.ts +29 -0
  425. package/dist/prompts/assembler.d.ts.map +1 -0
  426. package/dist/prompts/assembler.js +136 -0
  427. package/dist/prompts/assembler.js.map +1 -0
  428. package/dist/prompts/layers.d.ts +6 -0
  429. package/dist/prompts/layers.d.ts.map +1 -0
  430. package/dist/prompts/layers.js +60 -0
  431. package/dist/prompts/layers.js.map +1 -0
  432. package/dist/release/download.d.ts +19 -0
  433. package/dist/release/download.d.ts.map +1 -0
  434. package/dist/release/download.js +187 -0
  435. package/dist/release/download.js.map +1 -0
  436. package/dist/release/verify.d.ts +34 -0
  437. package/dist/release/verify.d.ts.map +1 -0
  438. package/dist/release/verify.js +127 -0
  439. package/dist/release/verify.js.map +1 -0
  440. package/dist/sandbox/fs.d.ts +10 -0
  441. package/dist/sandbox/fs.d.ts.map +1 -0
  442. package/dist/sandbox/fs.js +114 -0
  443. package/dist/sandbox/fs.js.map +1 -0
  444. package/dist/sandbox/shell.d.ts +20 -0
  445. package/dist/sandbox/shell.d.ts.map +1 -0
  446. package/dist/sandbox/shell.js +131 -0
  447. package/dist/sandbox/shell.js.map +1 -0
  448. package/dist/scheduler/dag.d.ts +7 -0
  449. package/dist/scheduler/dag.d.ts.map +1 -0
  450. package/dist/scheduler/dag.js +72 -0
  451. package/dist/scheduler/dag.js.map +1 -0
  452. package/dist/scheduler/resource-manager.d.ts +25 -0
  453. package/dist/scheduler/resource-manager.d.ts.map +1 -0
  454. package/dist/scheduler/resource-manager.js +101 -0
  455. package/dist/scheduler/resource-manager.js.map +1 -0
  456. package/dist/security/injection.d.ts +14 -0
  457. package/dist/security/injection.d.ts.map +1 -0
  458. package/dist/security/injection.js +46 -0
  459. package/dist/security/injection.js.map +1 -0
  460. package/dist/security/redact.d.ts +10 -0
  461. package/dist/security/redact.d.ts.map +1 -0
  462. package/dist/security/redact.js +89 -0
  463. package/dist/security/redact.js.map +1 -0
  464. package/dist/skills/loader.d.ts +4 -0
  465. package/dist/skills/loader.d.ts.map +1 -0
  466. package/dist/skills/loader.js +142 -0
  467. package/dist/skills/loader.js.map +1 -0
  468. package/dist/skills/marketplace.d.ts +15 -0
  469. package/dist/skills/marketplace.d.ts.map +1 -0
  470. package/dist/skills/marketplace.js +132 -0
  471. package/dist/skills/marketplace.js.map +1 -0
  472. package/dist/tools/apply-patch.d.ts +20 -0
  473. package/dist/tools/apply-patch.d.ts.map +1 -0
  474. package/dist/tools/apply-patch.js +195 -0
  475. package/dist/tools/apply-patch.js.map +1 -0
  476. package/dist/tools/ask-user.d.ts +12 -0
  477. package/dist/tools/ask-user.d.ts.map +1 -0
  478. package/dist/tools/ask-user.js +86 -0
  479. package/dist/tools/ask-user.js.map +1 -0
  480. package/dist/tools/delete-file.d.ts +10 -0
  481. package/dist/tools/delete-file.d.ts.map +1 -0
  482. package/dist/tools/delete-file.js +94 -0
  483. package/dist/tools/delete-file.js.map +1 -0
  484. package/dist/tools/edit-file.d.ts +20 -0
  485. package/dist/tools/edit-file.d.ts.map +1 -0
  486. package/dist/tools/edit-file.js +128 -0
  487. package/dist/tools/edit-file.js.map +1 -0
  488. package/dist/tools/format.d.ts +5 -0
  489. package/dist/tools/format.d.ts.map +1 -0
  490. package/dist/tools/format.js +131 -0
  491. package/dist/tools/format.js.map +1 -0
  492. package/dist/tools/git.d.ts +24 -0
  493. package/dist/tools/git.d.ts.map +1 -0
  494. package/dist/tools/git.js +122 -0
  495. package/dist/tools/git.js.map +1 -0
  496. package/dist/tools/glob.d.ts +12 -0
  497. package/dist/tools/glob.d.ts.map +1 -0
  498. package/dist/tools/glob.js +55 -0
  499. package/dist/tools/glob.js.map +1 -0
  500. package/dist/tools/grep.d.ts +19 -0
  501. package/dist/tools/grep.d.ts.map +1 -0
  502. package/dist/tools/grep.js +97 -0
  503. package/dist/tools/grep.js.map +1 -0
  504. package/dist/tools/init.d.ts +3 -0
  505. package/dist/tools/init.d.ts.map +1 -0
  506. package/dist/tools/init.js +66 -0
  507. package/dist/tools/init.js.map +1 -0
  508. package/dist/tools/list-dir.d.ts +16 -0
  509. package/dist/tools/list-dir.d.ts.map +1 -0
  510. package/dist/tools/list-dir.js +107 -0
  511. package/dist/tools/list-dir.js.map +1 -0
  512. package/dist/tools/move-file.d.ts +13 -0
  513. package/dist/tools/move-file.d.ts.map +1 -0
  514. package/dist/tools/move-file.js +100 -0
  515. package/dist/tools/move-file.js.map +1 -0
  516. package/dist/tools/read-file.d.ts +14 -0
  517. package/dist/tools/read-file.d.ts.map +1 -0
  518. package/dist/tools/read-file.js +99 -0
  519. package/dist/tools/read-file.js.map +1 -0
  520. package/dist/tools/registry.d.ts +10 -0
  521. package/dist/tools/registry.d.ts.map +1 -0
  522. package/dist/tools/registry.js +30 -0
  523. package/dist/tools/registry.js.map +1 -0
  524. package/dist/tools/run-command.d.ts +17 -0
  525. package/dist/tools/run-command.d.ts.map +1 -0
  526. package/dist/tools/run-command.js +73 -0
  527. package/dist/tools/run-command.js.map +1 -0
  528. package/dist/tools/run-tests.d.ts +16 -0
  529. package/dist/tools/run-tests.d.ts.map +1 -0
  530. package/dist/tools/run-tests.js +140 -0
  531. package/dist/tools/run-tests.js.map +1 -0
  532. package/dist/tools/web-browse.d.ts +10 -0
  533. package/dist/tools/web-browse.d.ts.map +1 -0
  534. package/dist/tools/web-browse.js +45 -0
  535. package/dist/tools/web-browse.js.map +1 -0
  536. package/dist/tools/web-fetch.d.ts +11 -0
  537. package/dist/tools/web-fetch.d.ts.map +1 -0
  538. package/dist/tools/web-fetch.js +43 -0
  539. package/dist/tools/web-fetch.js.map +1 -0
  540. package/dist/tools/web-search.d.ts +12 -0
  541. package/dist/tools/web-search.d.ts.map +1 -0
  542. package/dist/tools/web-search.js +52 -0
  543. package/dist/tools/web-search.js.map +1 -0
  544. package/dist/tools/write-file.d.ts +13 -0
  545. package/dist/tools/write-file.d.ts.map +1 -0
  546. package/dist/tools/write-file.js +100 -0
  547. package/dist/tools/write-file.js.map +1 -0
  548. package/dist/types/errors.d.ts +14 -0
  549. package/dist/types/errors.d.ts.map +1 -0
  550. package/dist/types/errors.js +55 -0
  551. package/dist/types/errors.js.map +1 -0
  552. package/dist/types/index.d.ts +267 -0
  553. package/dist/types/index.d.ts.map +1 -0
  554. package/dist/types/index.js +38 -0
  555. package/dist/types/index.js.map +1 -0
  556. package/dist/ui/chat.d.ts +89 -0
  557. package/dist/ui/chat.d.ts.map +1 -0
  558. package/dist/ui/chat.js +311 -0
  559. package/dist/ui/chat.js.map +1 -0
  560. package/dist/ui/public/app.js +2113 -0
  561. package/dist/ui/public/index.html +78 -0
  562. package/dist/ui/public/styles.css +1703 -0
  563. package/dist/ui/server-errors.d.ts +24 -0
  564. package/dist/ui/server-errors.d.ts.map +1 -0
  565. package/dist/ui/server-errors.js +31 -0
  566. package/dist/ui/server-errors.js.map +1 -0
  567. package/dist/ui/server.d.ts +10 -0
  568. package/dist/ui/server.d.ts.map +1 -0
  569. package/dist/ui/server.js +815 -0
  570. package/dist/ui/server.js.map +1 -0
  571. package/dist/ui/task-runner.d.ts +71 -0
  572. package/dist/ui/task-runner.d.ts.map +1 -0
  573. package/dist/ui/task-runner.js +334 -0
  574. package/dist/ui/task-runner.js.map +1 -0
  575. package/dist/web/browse.d.ts +35 -0
  576. package/dist/web/browse.d.ts.map +1 -0
  577. package/dist/web/browse.js +166 -0
  578. package/dist/web/browse.js.map +1 -0
  579. package/dist/web/fetch.d.ts +18 -0
  580. package/dist/web/fetch.d.ts.map +1 -0
  581. package/dist/web/fetch.js +107 -0
  582. package/dist/web/fetch.js.map +1 -0
  583. package/dist/web/sanitize.d.ts +8 -0
  584. package/dist/web/sanitize.d.ts.map +1 -0
  585. package/dist/web/sanitize.js +58 -0
  586. package/dist/web/sanitize.js.map +1 -0
  587. package/dist/web/search.d.ts +12 -0
  588. package/dist/web/search.d.ts.map +1 -0
  589. package/dist/web/search.js +124 -0
  590. package/dist/web/search.js.map +1 -0
  591. package/install/install.ps1 +46 -0
  592. package/install/install.sh +72 -0
  593. package/package.json +89 -0
  594. package/scripts/bundle.js +26 -0
  595. package/scripts/copy-assets.js +33 -0
  596. package/scripts/link.sh +79 -0
  597. package/scripts/metrics.sh +33 -0
  598. package/scripts/postinstall.js +36 -0
@@ -0,0 +1,1703 @@
1
+ /* Forge dashboard — restrained palette, honest hierarchy, no gradient titles. */
2
+
3
+ :root {
4
+ --bg: #0a0b0d;
5
+ --bg-1: #0d0f12;
6
+ --bg-2: #111418;
7
+ --surface: #13171c;
8
+ --surface-hi: #181d23;
9
+ --border: #1d232a;
10
+ --border-hi: #272e36;
11
+ --fg: #e7eaee;
12
+ /* Aliases: keep older rules referencing --fg-0 / --fg-1 working.
13
+ --fg-0 is the brightest ("strong") text, --fg-1 is the default body
14
+ text, --fg-2 is dim/secondary. */
15
+ --fg-0: #ffffff;
16
+ --fg-1: #e7eaee;
17
+ --fg-2: #c1c7cf;
18
+ --muted: #7d8692;
19
+ --dim: #4b5460;
20
+ --accent: #14b8a6;
21
+ --accent-hi: #2dd4bf;
22
+ --accent-soft: rgba(20, 184, 166, 0.12);
23
+ --warn: #f59e0b;
24
+ --warn-soft: rgba(245, 158, 11, 0.12);
25
+ --err: #ef4444;
26
+ --err-soft: rgba(239, 68, 68, 0.12);
27
+ --ok: #22c55e;
28
+ --ok-soft: rgba(34, 197, 94, 0.12);
29
+ --radius: 8px;
30
+ --radius-lg: 12px;
31
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
32
+ --shadow-md: 0 6px 24px -8px rgba(0, 0, 0, 0.5);
33
+ --shadow-lg: 0 24px 48px -12px rgba(0, 0, 0, 0.55);
34
+ --tween: 0.18s cubic-bezier(0.4, 0, 0.2, 1);
35
+ --sidebar-w: 236px;
36
+ }
37
+
38
+ /* ---- Reset / base ---- */
39
+ *,
40
+ *::before,
41
+ *::after { box-sizing: border-box; }
42
+ *:focus { outline: none; }
43
+ *:focus-visible {
44
+ outline: 2px solid var(--accent);
45
+ outline-offset: 2px;
46
+ border-radius: 4px;
47
+ }
48
+
49
+ /* Make the `hidden` attribute actually hide — this is the default UA rule
50
+ that was being overridden when we set display:flex on .modal-overlay etc. */
51
+ [hidden] { display: none !important; }
52
+
53
+ html, body {
54
+ margin: 0;
55
+ padding: 0;
56
+ min-height: 100vh;
57
+ background: var(--bg);
58
+ color: var(--fg);
59
+ font-family: 'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif;
60
+ font-size: 14px;
61
+ line-height: 1.5;
62
+ -webkit-font-smoothing: antialiased;
63
+ -moz-osx-font-smoothing: grayscale;
64
+ overflow-x: hidden;
65
+ }
66
+
67
+ code, pre, .mono {
68
+ font-family: 'JetBrains Mono', ui-monospace, 'Menlo', monospace;
69
+ font-feature-settings: 'ss01', 'ss02';
70
+ }
71
+
72
+ /* ---- Sidebar ---- */
73
+ .sidebar {
74
+ position: fixed;
75
+ top: 0;
76
+ left: 0;
77
+ bottom: 0;
78
+ width: var(--sidebar-w);
79
+ background: var(--bg-1);
80
+ border-right: 1px solid var(--border);
81
+ display: flex;
82
+ flex-direction: column;
83
+ z-index: 20;
84
+ overflow-y: auto;
85
+ }
86
+ .sidebar::-webkit-scrollbar { width: 6px; }
87
+ .sidebar::-webkit-scrollbar-thumb { background: var(--border-hi); border-radius: 3px; }
88
+
89
+ .sidebar-brand {
90
+ display: flex;
91
+ align-items: center;
92
+ gap: 10px;
93
+ padding: 18px 18px 20px;
94
+ }
95
+
96
+ .sidebar-brand .brand-mark {
97
+ width: 28px;
98
+ height: 28px;
99
+ border-radius: 7px;
100
+ background: linear-gradient(140deg, var(--accent), #0891b2);
101
+ color: #03100e;
102
+ display: grid;
103
+ place-items: center;
104
+ font-weight: 800;
105
+ font-size: 16px;
106
+ box-shadow: 0 0 0 1px rgba(20, 184, 166, 0.25);
107
+ }
108
+
109
+ .sidebar-brand .brand-name {
110
+ font-size: 13px;
111
+ font-weight: 700;
112
+ letter-spacing: 0.12em;
113
+ color: var(--fg);
114
+ }
115
+ .sidebar-brand .brand-sub {
116
+ font-size: 10.5px;
117
+ letter-spacing: 0.06em;
118
+ color: var(--muted);
119
+ margin-top: 1px;
120
+ }
121
+
122
+ .side-nav {
123
+ flex: 1;
124
+ padding: 6px 10px 16px;
125
+ display: flex;
126
+ flex-direction: column;
127
+ gap: 14px;
128
+ }
129
+
130
+ .nav-group-title {
131
+ color: var(--dim);
132
+ font-size: 10px;
133
+ letter-spacing: 0.14em;
134
+ text-transform: uppercase;
135
+ font-weight: 600;
136
+ padding: 6px 10px 6px;
137
+ }
138
+
139
+ .nav-item {
140
+ display: flex;
141
+ align-items: center;
142
+ gap: 10px;
143
+ width: 100%;
144
+ padding: 7px 10px;
145
+ border: 1px solid transparent;
146
+ border-radius: 6px;
147
+ background: transparent;
148
+ color: var(--fg-2);
149
+ font-family: inherit;
150
+ font-size: 13px;
151
+ font-weight: 500;
152
+ cursor: pointer;
153
+ transition: background var(--tween), color var(--tween), border-color var(--tween);
154
+ text-align: left;
155
+ margin-bottom: 1px;
156
+ }
157
+
158
+ .nav-item .nav-icon {
159
+ width: 16px;
160
+ height: 16px;
161
+ display: grid;
162
+ place-items: center;
163
+ color: var(--muted);
164
+ flex-shrink: 0;
165
+ }
166
+ .nav-item .nav-icon svg {
167
+ width: 16px;
168
+ height: 16px;
169
+ stroke-width: 1.6;
170
+ }
171
+
172
+ .nav-item kbd {
173
+ margin-left: auto;
174
+ opacity: 0.5;
175
+ font-size: 10px;
176
+ }
177
+
178
+ .nav-item:hover {
179
+ background: var(--surface);
180
+ color: var(--fg);
181
+ }
182
+ .nav-item:hover .nav-icon { color: var(--fg); }
183
+
184
+ .nav-item.active {
185
+ background: var(--surface);
186
+ color: var(--fg);
187
+ border-color: var(--border-hi);
188
+ }
189
+ .nav-item.active .nav-icon { color: var(--accent); }
190
+
191
+ .badge-live {
192
+ margin-left: auto;
193
+ font-size: 10px;
194
+ font-weight: 700;
195
+ padding: 1px 7px;
196
+ border-radius: 999px;
197
+ background: var(--accent-soft);
198
+ color: var(--accent);
199
+ border: 1px solid rgba(20, 184, 166, 0.25);
200
+ }
201
+
202
+ .sidebar-footer {
203
+ padding: 12px 16px 16px;
204
+ border-top: 1px solid var(--border);
205
+ font-size: 11px;
206
+ color: var(--muted);
207
+ }
208
+ .sidebar-footer .status-row {
209
+ display: flex;
210
+ align-items: center;
211
+ gap: 8px;
212
+ font-size: 11.5px;
213
+ color: var(--fg-2);
214
+ }
215
+ .sidebar-footer .dot {
216
+ width: 7px;
217
+ height: 7px;
218
+ border-radius: 50%;
219
+ background: var(--ok);
220
+ box-shadow: 0 0 8px var(--ok);
221
+ }
222
+ .sidebar-footer .dot.off { background: var(--err); box-shadow: none; }
223
+ .sidebar-footer .hint {
224
+ color: var(--dim);
225
+ margin-top: 6px;
226
+ font-size: 10.5px;
227
+ }
228
+
229
+ /* ---- Content ---- */
230
+ /* Content fills the full viewport width minus the sidebar. Inner sections
231
+ get their own sensible max-widths where necessary (hero, prose). */
232
+ .content {
233
+ margin-left: var(--sidebar-w);
234
+ padding: 32px 44px 80px;
235
+ animation: fade-in var(--tween);
236
+ }
237
+
238
+ .content-inner {
239
+ margin: 0 auto;
240
+ width: 100%;
241
+ max-width: 1680px;
242
+ }
243
+
244
+ @keyframes fade-in {
245
+ from { opacity: 0; transform: translateY(4px); }
246
+ to { opacity: 1; transform: translateY(0); }
247
+ }
248
+
249
+ /* ---------- Mobile navigation ---------- */
250
+
251
+ .nav-toggle {
252
+ position: fixed;
253
+ top: 12px;
254
+ left: 12px;
255
+ z-index: 80;
256
+ width: 44px;
257
+ height: 44px;
258
+ border: 1px solid var(--border);
259
+ background: var(--bg-1);
260
+ border-radius: 10px;
261
+ display: none;
262
+ flex-direction: column;
263
+ align-items: center;
264
+ justify-content: center;
265
+ gap: 4px;
266
+ cursor: pointer;
267
+ padding: 0;
268
+ transition: background 0.1s ease, transform 0.15s ease;
269
+ }
270
+ .nav-toggle:hover { background: var(--bg-2); }
271
+ .nav-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
272
+ .nav-toggle-bar {
273
+ width: 20px;
274
+ height: 2px;
275
+ background: var(--fg);
276
+ border-radius: 2px;
277
+ transition: transform 0.18s ease, opacity 0.15s ease;
278
+ }
279
+ .nav-toggle[aria-expanded="true"] .nav-toggle-bar:nth-child(1) { transform: translateY(6px) rotate(45deg); }
280
+ .nav-toggle[aria-expanded="true"] .nav-toggle-bar:nth-child(2) { opacity: 0; }
281
+ .nav-toggle[aria-expanded="true"] .nav-toggle-bar:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }
282
+
283
+ .nav-backdrop {
284
+ position: fixed;
285
+ inset: 0;
286
+ background: rgba(6, 8, 10, 0.55);
287
+ backdrop-filter: blur(2px);
288
+ z-index: 60;
289
+ opacity: 0;
290
+ transition: opacity 0.18s ease;
291
+ pointer-events: none;
292
+ }
293
+ .nav-backdrop.visible { opacity: 1; pointer-events: auto; }
294
+
295
+ @media (max-width: 920px) {
296
+ .nav-toggle { display: flex; }
297
+ .sidebar {
298
+ transform: translateX(-100%);
299
+ transition: transform 0.22s cubic-bezier(0.2, 0.8, 0.2, 1);
300
+ z-index: 70;
301
+ width: min(84vw, 320px);
302
+ box-shadow: 4px 0 22px rgba(0, 0, 0, 0.35);
303
+ }
304
+ .sidebar.open { transform: translateX(0); }
305
+ .content { margin-left: 0; padding: 64px 16px 48px; }
306
+ .content-inner { max-width: 100%; }
307
+ .page-header { flex-direction: column; align-items: flex-start; gap: 10px; }
308
+ }
309
+
310
+ /* Prevent horizontal scroll from any stray overflow. Forced here so every
311
+ view inherits the boundary. */
312
+ html, body { overflow-x: hidden; }
313
+ .content, .content-inner { min-width: 0; }
314
+ .table-wrap { max-width: 100%; overflow-x: auto; }
315
+
316
+ .page-header {
317
+ display: flex;
318
+ align-items: flex-end;
319
+ justify-content: space-between;
320
+ gap: 20px;
321
+ margin-bottom: 28px;
322
+ }
323
+
324
+ .page-title {
325
+ font-size: 20px;
326
+ font-weight: 600;
327
+ margin: 0;
328
+ color: var(--fg);
329
+ letter-spacing: -0.01em;
330
+ }
331
+
332
+ .page-subtitle {
333
+ color: var(--muted);
334
+ font-size: 12.5px;
335
+ margin-top: 4px;
336
+ }
337
+
338
+ .page-actions { display: flex; gap: 8px; }
339
+
340
+ /* ---- Hero prompt (dashboard) ---- */
341
+ .hero {
342
+ padding: 56px 40px 44px;
343
+ margin-bottom: 24px;
344
+ border-radius: var(--radius-lg);
345
+ background:
346
+ radial-gradient(ellipse 60% 70% at 50% -10%, rgba(20, 184, 166, 0.08), transparent 65%),
347
+ radial-gradient(ellipse 40% 50% at 85% 110%, rgba(167, 139, 250, 0.06), transparent 60%),
348
+ var(--bg-1);
349
+ border: 1px solid var(--border);
350
+ text-align: center;
351
+ position: relative;
352
+ overflow: hidden;
353
+ }
354
+
355
+ .hero::before {
356
+ content: '';
357
+ position: absolute;
358
+ top: -1px;
359
+ left: 20%;
360
+ right: 20%;
361
+ height: 1px;
362
+ background: linear-gradient(90deg, transparent, var(--accent), transparent);
363
+ opacity: 0.4;
364
+ }
365
+
366
+ .hero h1 {
367
+ margin: 0 0 10px;
368
+ font-size: 28px;
369
+ font-weight: 600;
370
+ color: var(--fg);
371
+ letter-spacing: -0.015em;
372
+ line-height: 1.2;
373
+ }
374
+
375
+ .hero .hero-sub {
376
+ color: var(--muted);
377
+ font-size: 14px;
378
+ margin-bottom: 28px;
379
+ }
380
+
381
+ .hero-input-wrap {
382
+ max-width: 720px;
383
+ margin: 0 auto;
384
+ position: relative;
385
+ }
386
+
387
+ .hero-input {
388
+ width: 100%;
389
+ background: var(--surface);
390
+ border: 1px solid var(--border-hi);
391
+ border-radius: 12px;
392
+ color: var(--fg);
393
+ font-family: inherit;
394
+ font-size: 15.5px;
395
+ padding: 18px 68px 18px 22px;
396
+ transition: border-color var(--tween), box-shadow var(--tween);
397
+ box-shadow: var(--shadow-md);
398
+ }
399
+
400
+ .hero-input:focus {
401
+ border-color: var(--accent);
402
+ box-shadow: 0 0 0 3px var(--accent-soft), var(--shadow-md);
403
+ }
404
+
405
+ .hero-submit {
406
+ position: absolute;
407
+ right: 8px;
408
+ top: 50%;
409
+ transform: translateY(-50%);
410
+ width: 44px;
411
+ height: 44px;
412
+ border-radius: 9px;
413
+ border: none;
414
+ background: var(--accent);
415
+ color: #022;
416
+ cursor: pointer;
417
+ display: grid;
418
+ place-items: center;
419
+ transition: background var(--tween);
420
+ }
421
+ .hero-submit:hover { background: var(--accent-hi); }
422
+ .hero-submit svg { width: 18px; height: 18px; }
423
+
424
+ .hero-hint {
425
+ color: var(--muted);
426
+ font-size: 11.5px;
427
+ margin-top: 18px;
428
+ }
429
+ .hero-hint kbd { margin: 0 2px; }
430
+
431
+ .hero-chips {
432
+ display: flex;
433
+ flex-wrap: wrap;
434
+ gap: 8px;
435
+ justify-content: center;
436
+ max-width: 720px;
437
+ margin: 20px auto 0;
438
+ }
439
+
440
+ .chip {
441
+ padding: 7px 14px;
442
+ border-radius: 999px;
443
+ background: var(--surface);
444
+ border: 1px solid var(--border);
445
+ color: var(--fg-2);
446
+ font-size: 12px;
447
+ cursor: pointer;
448
+ transition: all var(--tween);
449
+ font-family: inherit;
450
+ }
451
+ .chip:hover {
452
+ background: var(--surface-hi);
453
+ border-color: var(--accent);
454
+ color: var(--accent);
455
+ }
456
+ .chip .chip-icon {
457
+ display: inline-block;
458
+ width: 14px;
459
+ height: 14px;
460
+ vertical-align: middle;
461
+ margin-right: 5px;
462
+ color: var(--muted);
463
+ }
464
+ .chip:hover .chip-icon { color: var(--accent); }
465
+
466
+ /* ---- Stats ---- */
467
+ .stats {
468
+ display: grid;
469
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
470
+ gap: 14px;
471
+ margin-bottom: 24px;
472
+ }
473
+
474
+ .stat {
475
+ background: var(--surface);
476
+ border: 1px solid var(--border);
477
+ border-radius: var(--radius);
478
+ padding: 16px;
479
+ transition: border-color var(--tween);
480
+ }
481
+ .stat:hover { border-color: var(--border-hi); }
482
+
483
+ .stat .label {
484
+ color: var(--muted);
485
+ font-size: 11px;
486
+ font-weight: 500;
487
+ text-transform: uppercase;
488
+ letter-spacing: 0.06em;
489
+ }
490
+
491
+ .stat .value {
492
+ margin-top: 6px;
493
+ font-size: 22px;
494
+ font-weight: 600;
495
+ color: var(--fg);
496
+ font-variant-numeric: tabular-nums;
497
+ letter-spacing: -0.01em;
498
+ }
499
+
500
+ .stat .sub {
501
+ color: var(--muted);
502
+ font-size: 11.5px;
503
+ margin-top: 4px;
504
+ }
505
+
506
+ /* ---- Section ---- */
507
+ .section {
508
+ background: var(--surface);
509
+ border: 1px solid var(--border);
510
+ border-radius: var(--radius-lg);
511
+ margin-bottom: 18px;
512
+ overflow: hidden;
513
+ }
514
+
515
+ .section-head {
516
+ display: flex;
517
+ align-items: center;
518
+ justify-content: space-between;
519
+ padding: 14px 18px;
520
+ border-bottom: 1px solid var(--border);
521
+ }
522
+
523
+ .section-head h2 {
524
+ margin: 0;
525
+ font-size: 12px;
526
+ font-weight: 600;
527
+ color: var(--fg);
528
+ letter-spacing: 0.01em;
529
+ display: flex;
530
+ align-items: center;
531
+ gap: 8px;
532
+ }
533
+
534
+ .section-head .section-meta {
535
+ color: var(--muted);
536
+ font-size: 11.5px;
537
+ }
538
+
539
+ .section-body { padding: 4px 0; }
540
+ .section-body-padded { padding: 16px 18px; }
541
+
542
+ /* ---- Rows (compact list) ---- */
543
+ .row {
544
+ display: flex;
545
+ align-items: center;
546
+ gap: 14px;
547
+ padding: 11px 18px;
548
+ border-bottom: 1px solid var(--border);
549
+ transition: background var(--tween);
550
+ }
551
+ .row:last-child { border-bottom: none; }
552
+ .row:hover { background: var(--surface-hi); }
553
+
554
+ .row-main { flex: 1; min-width: 0; }
555
+ .row-main .title {
556
+ font-weight: 500;
557
+ color: var(--fg);
558
+ font-size: 13px;
559
+ white-space: nowrap;
560
+ overflow: hidden;
561
+ text-overflow: ellipsis;
562
+ }
563
+ .row-main .sub {
564
+ color: var(--muted);
565
+ font-size: 11.5px;
566
+ margin-top: 2px;
567
+ display: flex;
568
+ gap: 10px;
569
+ flex-wrap: wrap;
570
+ }
571
+
572
+ /* ---- Table ---- */
573
+ .table {
574
+ width: 100%;
575
+ border-collapse: collapse;
576
+ font-size: 13px;
577
+ }
578
+ .table th, .table td {
579
+ text-align: left;
580
+ padding: 10px 18px;
581
+ border-bottom: 1px solid var(--border);
582
+ }
583
+ .table tr:last-child td { border-bottom: none; }
584
+ .table tbody tr { transition: background var(--tween); }
585
+ .table tbody tr:hover { background: var(--surface-hi); cursor: default; }
586
+ .table th {
587
+ color: var(--muted);
588
+ font-weight: 600;
589
+ font-size: 10.5px;
590
+ text-transform: uppercase;
591
+ letter-spacing: 0.08em;
592
+ background: var(--bg-2);
593
+ }
594
+
595
+ /* ---- Badges ---- */
596
+ .badge {
597
+ display: inline-flex;
598
+ align-items: center;
599
+ gap: 6px;
600
+ padding: 2px 8px;
601
+ border-radius: 999px;
602
+ font-size: 10.5px;
603
+ font-weight: 600;
604
+ letter-spacing: 0.04em;
605
+ text-transform: lowercase;
606
+ border: 1px solid transparent;
607
+ }
608
+ .badge::before {
609
+ content: '';
610
+ width: 6px;
611
+ height: 6px;
612
+ border-radius: 50%;
613
+ background: currentColor;
614
+ opacity: 0.8;
615
+ }
616
+ .badge-running { color: var(--accent); background: var(--accent-soft); }
617
+ .badge-running::before { animation: pulse 1.6s ease-in-out infinite; }
618
+ .badge-awaiting { color: var(--warn); background: var(--warn-soft); }
619
+ .badge-completed, .badge-done { color: var(--ok); background: var(--ok-soft); }
620
+ .badge-failed { color: var(--err); background: var(--err-soft); }
621
+ .badge-cancelled, .badge-draft { color: var(--muted); background: rgba(125, 134, 146, 0.1); }
622
+ .badge-planned, .badge-scheduled, .badge-approved, .badge-verifying { color: var(--warn); background: var(--warn-soft); }
623
+ .badge-blocked { color: var(--err); background: var(--err-soft); }
624
+
625
+ @keyframes pulse {
626
+ 0%, 100% { opacity: 0.8; }
627
+ 50% { opacity: 1; transform: scale(1.2); }
628
+ }
629
+
630
+ /* ---- Pill (provider status) ---- */
631
+ .pill {
632
+ display: inline-flex;
633
+ align-items: center;
634
+ gap: 6px;
635
+ padding: 3px 9px;
636
+ border-radius: 999px;
637
+ font-size: 11px;
638
+ font-weight: 500;
639
+ background: var(--surface);
640
+ border: 1px solid var(--border);
641
+ color: var(--fg-2);
642
+ }
643
+ .pill .dot {
644
+ width: 6px;
645
+ height: 6px;
646
+ border-radius: 50%;
647
+ background: var(--muted);
648
+ }
649
+ .pill.ok { color: var(--ok); border-color: rgba(34, 197, 94, 0.25); }
650
+ .pill.ok .dot { background: var(--ok); box-shadow: 0 0 6px var(--ok); }
651
+ .pill.down .dot { background: var(--err); }
652
+ .pill.warn { color: var(--warn); border-color: rgba(245, 158, 11, 0.25); }
653
+ .pill.warn .dot { background: var(--warn); }
654
+
655
+ /* ---- Buttons ---- */
656
+ .btn {
657
+ padding: 8px 14px;
658
+ border-radius: 7px;
659
+ font-family: inherit;
660
+ font-size: 12.5px;
661
+ font-weight: 500;
662
+ cursor: pointer;
663
+ border: 1px solid transparent;
664
+ transition: background var(--tween), color var(--tween), border-color var(--tween);
665
+ display: inline-flex;
666
+ align-items: center;
667
+ gap: 7px;
668
+ line-height: 1;
669
+ }
670
+ .btn:disabled { opacity: 0.5; cursor: not-allowed; }
671
+
672
+ .btn-primary {
673
+ background: var(--accent);
674
+ color: #03100e;
675
+ font-weight: 600;
676
+ }
677
+ .btn-primary:hover { background: var(--accent-hi); }
678
+
679
+ .btn-secondary {
680
+ background: var(--surface);
681
+ color: var(--fg);
682
+ border-color: var(--border-hi);
683
+ }
684
+ .btn-secondary:hover { background: var(--surface-hi); border-color: var(--accent); }
685
+
686
+ .btn-ghost {
687
+ background: transparent;
688
+ color: var(--muted);
689
+ border-color: var(--border);
690
+ }
691
+ .btn-ghost:hover { color: var(--fg); border-color: var(--border-hi); background: var(--surface); }
692
+
693
+ .btn-danger {
694
+ background: var(--err-soft);
695
+ color: var(--err);
696
+ border-color: rgba(239, 68, 68, 0.3);
697
+ }
698
+ .btn-danger:hover { background: rgba(239, 68, 68, 0.2); }
699
+
700
+ .btn-sm { padding: 5px 10px; font-size: 11.5px; }
701
+
702
+ /* ---- Form controls ---- */
703
+ .form-row { margin-bottom: 14px; }
704
+ .form-row label {
705
+ display: block;
706
+ color: var(--fg-2);
707
+ font-size: 12px;
708
+ font-weight: 500;
709
+ margin-bottom: 6px;
710
+ }
711
+
712
+ input[type="text"], input[type="search"], input[type="url"], input[type="password"], textarea, select {
713
+ background: var(--bg-1);
714
+ color: var(--fg);
715
+ border: 1px solid var(--border);
716
+ padding: 9px 13px;
717
+ border-radius: 7px;
718
+ font-family: inherit;
719
+ font-size: 13px;
720
+ width: 100%;
721
+ transition: border-color var(--tween), box-shadow var(--tween);
722
+ }
723
+ input:focus, textarea:focus, select:focus {
724
+ border-color: var(--accent);
725
+ box-shadow: 0 0 0 3px var(--accent-soft);
726
+ }
727
+ textarea {
728
+ font-family: 'JetBrains Mono', monospace;
729
+ min-height: 110px;
730
+ resize: vertical;
731
+ line-height: 1.5;
732
+ }
733
+
734
+ .checkbox-row {
735
+ display: flex;
736
+ align-items: center;
737
+ gap: 8px;
738
+ padding: 7px 11px;
739
+ border: 1px solid var(--border);
740
+ border-radius: 6px;
741
+ background: var(--surface);
742
+ cursor: pointer;
743
+ font-size: 12.5px;
744
+ color: var(--fg-2);
745
+ transition: all var(--tween);
746
+ user-select: none;
747
+ }
748
+ .checkbox-row:hover { border-color: var(--border-hi); color: var(--fg); }
749
+ .checkbox-row input { accent-color: var(--accent); cursor: pointer; }
750
+ .checkbox-row:has(input:checked) {
751
+ border-color: var(--accent);
752
+ color: var(--accent);
753
+ background: var(--accent-soft);
754
+ }
755
+
756
+ .grid-checkboxes {
757
+ display: grid;
758
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
759
+ gap: 6px;
760
+ }
761
+
762
+ /* ---- Log stream ---- */
763
+ .log-stream {
764
+ background: #07090c;
765
+ border: 1px solid var(--border);
766
+ border-radius: var(--radius);
767
+ padding: 14px 16px;
768
+ max-height: 420px;
769
+ overflow-y: auto;
770
+ font-family: 'JetBrains Mono', monospace;
771
+ font-size: 12px;
772
+ color: var(--fg-2);
773
+ scrollbar-width: thin;
774
+ scrollbar-color: var(--border-hi) transparent;
775
+ }
776
+ .log-stream::-webkit-scrollbar { width: 6px; }
777
+ .log-stream::-webkit-scrollbar-thumb { background: var(--border-hi); border-radius: 3px; }
778
+
779
+ .log-line {
780
+ padding: 2px 0;
781
+ animation: fade-in 0.15s ease-out;
782
+ white-space: pre-wrap;
783
+ word-break: break-word;
784
+ }
785
+ .log-line time {
786
+ color: var(--dim);
787
+ margin-right: 10px;
788
+ font-size: 10.5px;
789
+ }
790
+ .log-line .log-type { color: var(--accent); font-weight: 600; }
791
+ .log-line.warning { color: var(--warn); }
792
+ .log-line.error { color: var(--err); }
793
+ .log-line.critical { color: var(--err); font-weight: 700; }
794
+
795
+ /* ---- Plan viewer ---- */
796
+ .plan-viewer { display: flex; flex-direction: column; gap: 8px; padding: 16px 18px; }
797
+ .plan-step {
798
+ display: flex;
799
+ gap: 12px;
800
+ padding: 12px 14px;
801
+ border: 1px solid var(--border);
802
+ border-radius: 8px;
803
+ background: var(--bg-1);
804
+ }
805
+ .plan-step:hover { border-color: var(--border-hi); }
806
+ .plan-step-num {
807
+ flex-shrink: 0;
808
+ width: 22px;
809
+ height: 22px;
810
+ border-radius: 5px;
811
+ background: var(--accent-soft);
812
+ color: var(--accent);
813
+ font-weight: 600;
814
+ font-size: 11px;
815
+ display: grid;
816
+ place-items: center;
817
+ font-family: 'JetBrains Mono', monospace;
818
+ }
819
+ .plan-step-body { flex: 1; min-width: 0; }
820
+ .plan-step-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 3px; }
821
+ .plan-step-type {
822
+ font-size: 10.5px;
823
+ letter-spacing: 0.03em;
824
+ font-weight: 600;
825
+ color: var(--accent);
826
+ }
827
+ .plan-step-desc { color: var(--fg); font-size: 12.5px; line-height: 1.5; }
828
+ .plan-step-meta { color: var(--muted); font-size: 11px; margin-top: 5px; display: flex; gap: 12px; flex-wrap: wrap; }
829
+
830
+ /* ---- Modal + palette (click-outside + esc + X) ---- */
831
+ .overlay {
832
+ position: fixed;
833
+ inset: 0;
834
+ background: rgba(4, 6, 9, 0.7);
835
+ backdrop-filter: blur(4px);
836
+ -webkit-backdrop-filter: blur(4px);
837
+ z-index: 100;
838
+ display: flex;
839
+ align-items: flex-start;
840
+ justify-content: center;
841
+ padding-top: 15vh;
842
+ animation: fade-in 0.15s ease-out;
843
+ }
844
+
845
+ .modal {
846
+ width: 100%;
847
+ max-width: 520px;
848
+ background: var(--surface);
849
+ border: 1px solid var(--border-hi);
850
+ border-radius: var(--radius-lg);
851
+ box-shadow: var(--shadow-lg);
852
+ overflow: hidden;
853
+ animation: modal-in 0.18s cubic-bezier(0.4, 0, 0.2, 1);
854
+ position: relative;
855
+ }
856
+
857
+ @keyframes modal-in {
858
+ from { opacity: 0; transform: translateY(-12px) scale(0.99); }
859
+ to { opacity: 1; transform: translateY(0) scale(1); }
860
+ }
861
+
862
+ .modal-head {
863
+ display: flex;
864
+ align-items: center;
865
+ justify-content: space-between;
866
+ padding: 16px 20px 12px;
867
+ border-bottom: 1px solid var(--border);
868
+ }
869
+
870
+ .modal-title { font-size: 14px; font-weight: 600; color: var(--fg); }
871
+
872
+ .modal-close {
873
+ width: 28px;
874
+ height: 28px;
875
+ border-radius: 6px;
876
+ border: none;
877
+ background: transparent;
878
+ color: var(--muted);
879
+ cursor: pointer;
880
+ display: grid;
881
+ place-items: center;
882
+ transition: background var(--tween), color var(--tween);
883
+ }
884
+ .modal-close:hover { background: var(--surface-hi); color: var(--fg); }
885
+ .modal-close svg { width: 14px; height: 14px; }
886
+
887
+ .modal-body { padding: 18px 20px; }
888
+ .modal-foot {
889
+ padding: 12px 20px 16px;
890
+ border-top: 1px solid var(--border);
891
+ display: flex;
892
+ justify-content: flex-end;
893
+ gap: 8px;
894
+ }
895
+
896
+ /* Palette: same overlay shell, bigger input */
897
+ .palette-input {
898
+ width: 100%;
899
+ background: transparent;
900
+ border: none;
901
+ color: var(--fg);
902
+ font-size: 16px;
903
+ padding: 18px 20px;
904
+ outline: none;
905
+ }
906
+ .palette-hint {
907
+ color: var(--muted);
908
+ font-size: 11.5px;
909
+ padding: 10px 20px;
910
+ border-top: 1px solid var(--border);
911
+ display: flex;
912
+ gap: 14px;
913
+ align-items: center;
914
+ }
915
+
916
+ /* ---- Toast ---- */
917
+ .toast-host {
918
+ position: fixed;
919
+ right: 18px;
920
+ bottom: 18px;
921
+ display: flex;
922
+ flex-direction: column;
923
+ gap: 8px;
924
+ z-index: 150;
925
+ pointer-events: none;
926
+ }
927
+
928
+ .toast {
929
+ pointer-events: auto;
930
+ padding: 10px 16px;
931
+ border-radius: 7px;
932
+ background: var(--surface);
933
+ border: 1px solid var(--border-hi);
934
+ border-left: 3px solid var(--accent);
935
+ color: var(--fg);
936
+ font-size: 12.5px;
937
+ box-shadow: var(--shadow-md);
938
+ animation: toast-in 0.18s ease-out both, toast-out 0.2s ease-in 3.8s both;
939
+ max-width: 320px;
940
+ }
941
+ .toast-ok { border-left-color: var(--ok); }
942
+ .toast-warn { border-left-color: var(--warn); }
943
+ .toast-err { border-left-color: var(--err); }
944
+
945
+ @keyframes toast-in {
946
+ from { opacity: 0; transform: translateY(8px); }
947
+ to { opacity: 1; transform: translateY(0); }
948
+ }
949
+ @keyframes toast-out {
950
+ from { opacity: 1; }
951
+ to { opacity: 0; }
952
+ }
953
+
954
+ /* ---- Loading skeletons ---- */
955
+ .skeleton-list {
956
+ padding: 8px 18px;
957
+ display: flex;
958
+ flex-direction: column;
959
+ gap: 10px;
960
+ }
961
+ .skeleton {
962
+ height: 14px;
963
+ border-radius: 4px;
964
+ background: linear-gradient(90deg, var(--surface) 0%, var(--surface-hi) 50%, var(--surface) 100%);
965
+ background-size: 200% 100%;
966
+ animation: shimmer 1.4s ease-in-out infinite;
967
+ }
968
+ .skeleton.w-50 { width: 50%; }
969
+ .skeleton.w-70 { width: 70%; }
970
+ .skeleton.w-90 { width: 90%; }
971
+ @keyframes shimmer {
972
+ 0% { background-position: 200% 0; }
973
+ 100% { background-position: -200% 0; }
974
+ }
975
+
976
+ /* ---- Empty state ---- */
977
+ .empty {
978
+ padding: 48px 24px;
979
+ text-align: center;
980
+ color: var(--muted);
981
+ font-size: 13px;
982
+ }
983
+ .empty-title {
984
+ color: var(--fg);
985
+ font-size: 14px;
986
+ font-weight: 600;
987
+ margin-bottom: 6px;
988
+ }
989
+
990
+ /* ---- Generic ---- */
991
+ code {
992
+ background: var(--bg-2);
993
+ color: var(--accent-hi);
994
+ padding: 1px 6px;
995
+ border-radius: 4px;
996
+ font-size: 11.5px;
997
+ border: 1px solid var(--border);
998
+ }
999
+
1000
+ kbd {
1001
+ background: var(--bg-1);
1002
+ border: 1px solid var(--border);
1003
+ border-bottom-width: 2px;
1004
+ border-radius: 4px;
1005
+ padding: 1px 6px;
1006
+ font-size: 10.5px;
1007
+ color: var(--muted);
1008
+ font-family: 'JetBrains Mono', monospace;
1009
+ }
1010
+
1011
+ .divider { height: 1px; margin: 20px 0; background: var(--border); }
1012
+
1013
+ .grid-2 {
1014
+ display: grid;
1015
+ grid-template-columns: 1.6fr 1fr;
1016
+ gap: 16px;
1017
+ }
1018
+ @media (max-width: 1100px) { .grid-2 { grid-template-columns: 1fr; } }
1019
+
1020
+ .grid-3 {
1021
+ display: grid;
1022
+ grid-template-columns: repeat(3, 1fr);
1023
+ gap: 16px;
1024
+ }
1025
+ @media (max-width: 1200px) { .grid-3 { grid-template-columns: 1fr 1fr; } }
1026
+ @media (max-width: 760px) { .grid-3 { grid-template-columns: 1fr; } }
1027
+
1028
+ /* Monaco editor mount point */
1029
+ .monaco-host {
1030
+ width: 100%;
1031
+ height: 520px;
1032
+ border: 1px solid var(--border);
1033
+ border-radius: 8px;
1034
+ overflow: hidden;
1035
+ background: #1e1e1e;
1036
+ }
1037
+
1038
+ /* Command palette list */
1039
+ .palette-list {
1040
+ max-height: 360px;
1041
+ overflow-y: auto;
1042
+ padding: 6px 0;
1043
+ scrollbar-width: thin;
1044
+ scrollbar-color: var(--border-hi) transparent;
1045
+ }
1046
+ .palette-list::-webkit-scrollbar { width: 6px; }
1047
+ .palette-list::-webkit-scrollbar-thumb { background: var(--border-hi); border-radius: 3px; }
1048
+
1049
+ .palette-item {
1050
+ display: flex;
1051
+ align-items: center;
1052
+ gap: 12px;
1053
+ padding: 9px 20px;
1054
+ cursor: pointer;
1055
+ color: var(--fg-2);
1056
+ font-size: 13px;
1057
+ border-left: 2px solid transparent;
1058
+ transition: background var(--tween);
1059
+ }
1060
+ .palette-item:hover,
1061
+ .palette-item.active {
1062
+ background: var(--surface-hi);
1063
+ color: var(--fg);
1064
+ border-left-color: var(--accent);
1065
+ }
1066
+ .palette-item .palette-icon {
1067
+ width: 16px;
1068
+ height: 16px;
1069
+ color: var(--muted);
1070
+ flex-shrink: 0;
1071
+ }
1072
+ .palette-item.active .palette-icon,
1073
+ .palette-item:hover .palette-icon { color: var(--accent); }
1074
+ .palette-item .palette-label { flex: 1; }
1075
+ .palette-item .palette-kbd {
1076
+ font-size: 10.5px;
1077
+ color: var(--dim);
1078
+ font-family: 'JetBrains Mono', monospace;
1079
+ }
1080
+ .palette-item .palette-group {
1081
+ font-size: 10px;
1082
+ color: var(--dim);
1083
+ text-transform: uppercase;
1084
+ letter-spacing: 0.1em;
1085
+ margin-left: auto;
1086
+ }
1087
+ .palette-empty {
1088
+ padding: 14px 20px;
1089
+ color: var(--muted);
1090
+ font-size: 12.5px;
1091
+ text-align: center;
1092
+ }
1093
+
1094
+ /* JSON viewer */
1095
+ .json-view {
1096
+ font-family: 'JetBrains Mono', monospace;
1097
+ font-size: 12px;
1098
+ background: var(--bg-1);
1099
+ border: 1px solid var(--border);
1100
+ border-radius: 7px;
1101
+ padding: 14px;
1102
+ white-space: pre;
1103
+ overflow-x: auto;
1104
+ color: var(--fg-2);
1105
+ margin: 0;
1106
+ }
1107
+ .json-key { color: var(--accent-hi); }
1108
+ .json-string { color: #a7d3ff; }
1109
+ .json-number { color: var(--warn); }
1110
+ .json-boolean { color: #f0abfc; }
1111
+ .json-null { color: var(--muted); }
1112
+
1113
+ .table-wrap { overflow-x: auto; }
1114
+
1115
+ /* ---------- Chat (multi-turn) ---------- */
1116
+
1117
+ .chat-shell {
1118
+ display: grid;
1119
+ grid-template-columns: 280px 1fr;
1120
+ gap: 0;
1121
+ height: calc(100vh - 80px);
1122
+ min-height: 560px;
1123
+ background: var(--bg-1);
1124
+ border: 1px solid var(--border);
1125
+ border-radius: 12px;
1126
+ overflow: hidden;
1127
+ }
1128
+
1129
+ .chat-sidebar {
1130
+ border-right: 1px solid var(--border);
1131
+ background: var(--bg-0);
1132
+ display: flex;
1133
+ flex-direction: column;
1134
+ min-height: 0;
1135
+ }
1136
+ .chat-sidebar-head {
1137
+ padding: 14px;
1138
+ border-bottom: 1px solid var(--border);
1139
+ }
1140
+ .chat-new-btn {
1141
+ width: 100%;
1142
+ background: var(--accent);
1143
+ color: #031615;
1144
+ border: none;
1145
+ border-radius: 8px;
1146
+ padding: 10px 12px;
1147
+ font-weight: 600;
1148
+ font-size: 13.5px;
1149
+ display: inline-flex;
1150
+ align-items: center;
1151
+ gap: 8px;
1152
+ cursor: pointer;
1153
+ transition: filter 0.12s ease;
1154
+ }
1155
+ .chat-new-btn:hover { filter: brightness(1.08); }
1156
+ .chat-new-btn svg { width: 16px; height: 16px; }
1157
+
1158
+ .chat-list {
1159
+ flex: 1;
1160
+ overflow-y: auto;
1161
+ padding: 6px;
1162
+ display: flex;
1163
+ flex-direction: column;
1164
+ gap: 2px;
1165
+ }
1166
+ .chat-list-item {
1167
+ background: transparent;
1168
+ border: none;
1169
+ border-radius: 7px;
1170
+ padding: 10px 12px;
1171
+ text-align: left;
1172
+ cursor: pointer;
1173
+ color: var(--fg-2);
1174
+ transition: background 0.1s ease;
1175
+ display: flex;
1176
+ flex-direction: column;
1177
+ gap: 3px;
1178
+ }
1179
+ .chat-list-item:hover { background: var(--bg-2); }
1180
+ .chat-list-item.active { background: rgba(20, 184, 166, 0.12); color: var(--fg-0); }
1181
+ .chat-list-item.active .chat-list-title { color: var(--accent-hi); }
1182
+ .chat-list-title {
1183
+ font-size: 13.5px;
1184
+ font-weight: 600;
1185
+ white-space: nowrap;
1186
+ overflow: hidden;
1187
+ text-overflow: ellipsis;
1188
+ }
1189
+ .chat-list-meta {
1190
+ font-size: 11.5px;
1191
+ color: var(--muted);
1192
+ display: flex;
1193
+ gap: 5px;
1194
+ }
1195
+ .chat-list-empty {
1196
+ padding: 14px;
1197
+ color: var(--muted);
1198
+ font-size: 12.5px;
1199
+ text-align: center;
1200
+ }
1201
+
1202
+ .chat-main {
1203
+ display: flex;
1204
+ flex-direction: column;
1205
+ min-height: 0;
1206
+ background: var(--bg-0);
1207
+ }
1208
+
1209
+ .chat-empty {
1210
+ flex: 1;
1211
+ display: flex;
1212
+ flex-direction: column;
1213
+ align-items: center;
1214
+ justify-content: center;
1215
+ gap: 14px;
1216
+ padding: 32px;
1217
+ }
1218
+ .chat-empty-icon {
1219
+ width: 56px; height: 56px;
1220
+ background: rgba(20, 184, 166, 0.1);
1221
+ color: var(--accent-hi);
1222
+ border-radius: 14px;
1223
+ display: inline-flex;
1224
+ align-items: center;
1225
+ justify-content: center;
1226
+ }
1227
+ .chat-empty-icon svg { width: 28px; height: 28px; }
1228
+ .chat-empty-title { font-size: 18px; font-weight: 600; color: var(--fg-0); }
1229
+ .chat-empty-sub { color: var(--muted); font-size: 13.5px; max-width: 440px; text-align: center; }
1230
+ .chat-empty-cta {
1231
+ margin-top: 6px;
1232
+ background: var(--accent);
1233
+ color: #031615;
1234
+ border: none;
1235
+ border-radius: 8px;
1236
+ padding: 10px 16px;
1237
+ font-weight: 600;
1238
+ font-size: 13.5px;
1239
+ display: inline-flex;
1240
+ align-items: center;
1241
+ gap: 8px;
1242
+ cursor: pointer;
1243
+ }
1244
+ .chat-empty-cta svg { width: 16px; height: 16px; }
1245
+
1246
+ .chat-header {
1247
+ display: flex;
1248
+ align-items: center;
1249
+ justify-content: space-between;
1250
+ gap: 16px;
1251
+ padding: 14px 20px;
1252
+ border-bottom: 1px solid var(--border);
1253
+ background: var(--bg-1);
1254
+ }
1255
+ .chat-header-title {
1256
+ font-weight: 600;
1257
+ font-size: 14.5px;
1258
+ color: var(--fg-0);
1259
+ white-space: nowrap;
1260
+ overflow: hidden;
1261
+ text-overflow: ellipsis;
1262
+ max-width: 640px;
1263
+ }
1264
+ .chat-header-meta { display: flex; gap: 8px; align-items: center; }
1265
+ .chat-header-del {
1266
+ background: transparent;
1267
+ border: 1px solid var(--border);
1268
+ color: var(--muted);
1269
+ border-radius: 6px;
1270
+ padding: 5px 8px;
1271
+ cursor: pointer;
1272
+ }
1273
+ .chat-header-del:hover { color: var(--err); border-color: var(--err); }
1274
+ .chat-header-del svg { width: 14px; height: 14px; display: block; }
1275
+
1276
+ .chat-turns {
1277
+ flex: 1;
1278
+ overflow-y: auto;
1279
+ padding: 20px;
1280
+ display: flex;
1281
+ flex-direction: column;
1282
+ gap: 18px;
1283
+ }
1284
+
1285
+ .chat-turn {
1286
+ display: flex;
1287
+ flex-direction: column;
1288
+ gap: 10px;
1289
+ }
1290
+ .chat-msg {
1291
+ display: flex;
1292
+ gap: 10px;
1293
+ align-items: flex-start;
1294
+ }
1295
+ .chat-msg-user { justify-content: flex-end; }
1296
+ .chat-msg-user .chat-avatar { order: 2; }
1297
+ .chat-msg-user .chat-bubble { background: var(--accent); color: #031615; }
1298
+
1299
+ .chat-avatar {
1300
+ width: 30px; height: 30px;
1301
+ border-radius: 8px;
1302
+ background: var(--bg-2);
1303
+ color: var(--fg-2);
1304
+ display: inline-flex;
1305
+ align-items: center;
1306
+ justify-content: center;
1307
+ flex-shrink: 0;
1308
+ }
1309
+ .chat-avatar svg { width: 16px; height: 16px; }
1310
+ .chat-avatar.agent { background: rgba(167, 139, 250, 0.14); color: #c4b5fd; }
1311
+
1312
+ .chat-bubble {
1313
+ background: var(--bg-1);
1314
+ border: 1px solid var(--border);
1315
+ border-radius: 10px;
1316
+ padding: 10px 14px;
1317
+ max-width: min(780px, 74%);
1318
+ font-size: 13.5px;
1319
+ line-height: 1.5;
1320
+ color: var(--fg-1);
1321
+ white-space: pre-wrap;
1322
+ word-break: break-word;
1323
+ }
1324
+ .chat-msg-user .chat-bubble { border: none; white-space: pre-wrap; }
1325
+
1326
+ .chat-bubble-head {
1327
+ display: flex;
1328
+ gap: 8px;
1329
+ align-items: center;
1330
+ margin-bottom: 6px;
1331
+ flex-wrap: wrap;
1332
+ }
1333
+ .chat-meta { color: var(--muted); font-size: 11.5px; }
1334
+ .chat-summary { color: var(--fg-1); }
1335
+ .chat-thinking {
1336
+ color: var(--muted);
1337
+ font-style: italic;
1338
+ animation: chat-pulse 1.6s ease-in-out infinite;
1339
+ }
1340
+ @keyframes chat-pulse {
1341
+ 0%, 100% { opacity: 0.55; }
1342
+ 50% { opacity: 1; }
1343
+ }
1344
+
1345
+ .chat-files {
1346
+ margin-top: 10px;
1347
+ display: flex;
1348
+ flex-wrap: wrap;
1349
+ gap: 6px;
1350
+ }
1351
+ .chat-file {
1352
+ background: var(--bg-2);
1353
+ color: var(--fg-2);
1354
+ border: 1px solid var(--border);
1355
+ border-radius: 5px;
1356
+ padding: 3px 8px;
1357
+ font-family: 'JetBrains Mono', monospace;
1358
+ font-size: 11.5px;
1359
+ }
1360
+ .chat-file-more { color: var(--muted); font-size: 11.5px; align-self: center; }
1361
+
1362
+ .chat-running {
1363
+ display: inline-flex;
1364
+ align-items: center;
1365
+ gap: 8px;
1366
+ color: var(--accent-hi);
1367
+ font-size: 13px;
1368
+ padding: 6px 12px;
1369
+ border: 1px dashed var(--border);
1370
+ border-radius: 8px;
1371
+ width: fit-content;
1372
+ animation: chat-pulse 1.6s ease-in-out infinite;
1373
+ }
1374
+ .chat-running svg { width: 14px; height: 14px; }
1375
+
1376
+ .chat-composer {
1377
+ border-top: 1px solid var(--border);
1378
+ background: var(--bg-1);
1379
+ padding: 14px 20px;
1380
+ }
1381
+ .chat-composer-inner {
1382
+ background: var(--bg-0);
1383
+ border: 1px solid var(--border);
1384
+ border-radius: 10px;
1385
+ padding: 10px 12px;
1386
+ transition: border-color 0.12s ease;
1387
+ }
1388
+ .chat-composer-inner:focus-within { border-color: var(--accent); }
1389
+ .chat-composer textarea {
1390
+ width: 100%;
1391
+ background: transparent;
1392
+ border: none;
1393
+ outline: none;
1394
+ color: var(--fg-0);
1395
+ font-family: inherit;
1396
+ font-size: 14px;
1397
+ resize: none;
1398
+ min-height: 22px;
1399
+ line-height: 1.45;
1400
+ }
1401
+ .chat-composer-bar {
1402
+ margin-top: 8px;
1403
+ display: flex;
1404
+ gap: 10px;
1405
+ align-items: center;
1406
+ }
1407
+ .chat-mode-select {
1408
+ background: var(--bg-2);
1409
+ border: 1px solid var(--border);
1410
+ color: var(--fg-1);
1411
+ border-radius: 6px;
1412
+ padding: 4px 8px;
1413
+ font-size: 12px;
1414
+ cursor: pointer;
1415
+ }
1416
+ .chat-auto {
1417
+ color: var(--muted);
1418
+ font-size: 12px;
1419
+ display: inline-flex;
1420
+ gap: 5px;
1421
+ align-items: center;
1422
+ cursor: pointer;
1423
+ }
1424
+ .chat-send {
1425
+ margin-left: auto;
1426
+ background: var(--accent);
1427
+ color: #031615;
1428
+ border: none;
1429
+ border-radius: 7px;
1430
+ padding: 7px 14px;
1431
+ font-weight: 600;
1432
+ font-size: 13px;
1433
+ display: inline-flex;
1434
+ align-items: center;
1435
+ gap: 6px;
1436
+ cursor: pointer;
1437
+ }
1438
+ .chat-send:disabled { opacity: 0.5; cursor: not-allowed; }
1439
+ .chat-send svg { width: 14px; height: 14px; }
1440
+
1441
+ /* generic chips reused by chat */
1442
+ .chip {
1443
+ display: inline-flex;
1444
+ align-items: center;
1445
+ padding: 2px 8px;
1446
+ border-radius: 999px;
1447
+ font-size: 11.5px;
1448
+ font-weight: 500;
1449
+ border: 1px solid var(--border);
1450
+ }
1451
+ .chip-ok { background: rgba(34, 197, 94, 0.12); color: #86efac; border-color: transparent; }
1452
+ .chip-warn { background: rgba(251, 191, 36, 0.14); color: #fcd34d; border-color: transparent; }
1453
+ .chip-err { background: rgba(239, 68, 68, 0.14); color: #fca5a5; border-color: transparent; }
1454
+ .chip-neutral { background: var(--bg-2); color: var(--fg-2); }
1455
+
1456
+ @media (max-width: 900px) {
1457
+ .chat-shell { grid-template-columns: 1fr; height: calc(100vh - 100px); }
1458
+ .chat-sidebar { display: none; }
1459
+ }
1460
+
1461
+ /* ---------- Shortcut overlay ---------- */
1462
+ .shortcut-overlay {
1463
+ position: fixed;
1464
+ inset: 0;
1465
+ background: rgba(6, 8, 10, 0.62);
1466
+ backdrop-filter: blur(3px);
1467
+ display: flex;
1468
+ align-items: center;
1469
+ justify-content: center;
1470
+ z-index: 100;
1471
+ animation: shortcut-fade 0.15s ease;
1472
+ }
1473
+ @keyframes shortcut-fade { from { opacity: 0; } to { opacity: 1; } }
1474
+ .shortcut-card {
1475
+ background: var(--bg-1);
1476
+ border: 1px solid var(--border);
1477
+ border-radius: 12px;
1478
+ min-width: 420px;
1479
+ max-width: 560px;
1480
+ padding: 16px 20px 18px;
1481
+ box-shadow: 0 24px 60px rgba(0, 0, 0, 0.4);
1482
+ }
1483
+ .shortcut-head {
1484
+ display: flex;
1485
+ align-items: center;
1486
+ justify-content: space-between;
1487
+ margin-bottom: 12px;
1488
+ font-weight: 600;
1489
+ color: var(--fg-0);
1490
+ }
1491
+ .shortcut-close {
1492
+ background: transparent;
1493
+ border: none;
1494
+ color: var(--muted);
1495
+ cursor: pointer;
1496
+ }
1497
+ .shortcut-close:hover { color: var(--fg-0); }
1498
+ .shortcut-close svg { width: 16px; height: 16px; }
1499
+ .shortcut-table { width: 100%; border-collapse: collapse; }
1500
+ .shortcut-table td { padding: 5px 0; font-size: 13px; color: var(--fg-2); }
1501
+ .shortcut-table td:first-child { width: 40%; }
1502
+ .shortcut-table kbd {
1503
+ background: var(--bg-0);
1504
+ border: 1px solid var(--border);
1505
+ border-bottom-width: 2px;
1506
+ border-radius: 4px;
1507
+ padding: 1px 7px;
1508
+ font-family: 'JetBrains Mono', monospace;
1509
+ font-size: 11.5px;
1510
+ color: var(--fg-0);
1511
+ }
1512
+
1513
+ /* Source badges on chat/repl conversations */
1514
+ .chat-src {
1515
+ display: inline-block;
1516
+ padding: 1px 6px;
1517
+ margin-right: 8px;
1518
+ border-radius: 4px;
1519
+ font-size: 10px;
1520
+ font-weight: 700;
1521
+ letter-spacing: 0.04em;
1522
+ vertical-align: middle;
1523
+ }
1524
+ .chat-src-repl {
1525
+ background: rgba(20, 184, 166, 0.18);
1526
+ color: #5eead4;
1527
+ }
1528
+ .chat-src-chat {
1529
+ background: rgba(167, 139, 250, 0.18);
1530
+ color: #c4b5fd;
1531
+ }
1532
+
1533
+ /* Failure + retry styling for chat turns */
1534
+ .chat-failure {
1535
+ border-left: 3px solid var(--err);
1536
+ padding: 6px 10px;
1537
+ background: rgba(239, 68, 68, 0.06);
1538
+ border-radius: 4px;
1539
+ margin-top: 4px;
1540
+ }
1541
+ .chat-failure-title {
1542
+ font-weight: 600;
1543
+ color: #fca5a5;
1544
+ font-size: 12px;
1545
+ text-transform: uppercase;
1546
+ letter-spacing: 0.05em;
1547
+ margin-bottom: 4px;
1548
+ }
1549
+ .chat-failure-body {
1550
+ color: var(--fg-1);
1551
+ white-space: pre-wrap;
1552
+ word-break: break-word;
1553
+ font-size: 13px;
1554
+ line-height: 1.45;
1555
+ }
1556
+ .chat-retry {
1557
+ margin-top: 8px;
1558
+ background: transparent;
1559
+ border: 1px solid var(--border);
1560
+ color: var(--fg-1);
1561
+ border-radius: 6px;
1562
+ padding: 4px 10px;
1563
+ display: inline-flex;
1564
+ align-items: center;
1565
+ gap: 6px;
1566
+ font-size: 12px;
1567
+ cursor: pointer;
1568
+ transition: background 0.1s ease;
1569
+ }
1570
+ .chat-retry:hover { background: var(--bg-2); color: var(--fg-0); }
1571
+ .chat-retry svg { width: 12px; height: 12px; }
1572
+
1573
+ /* ---------- Mobile: tighten dimensions + fix overflows across views ---------- */
1574
+
1575
+ /* ============================================================
1576
+ Mobile responsive rules.
1577
+
1578
+ Key invariants enforced here so children never exceed the viewport:
1579
+ - Grid children use `min-width: 0` so wide tables don't balloon the cell.
1580
+ - Sections and tables cap at `100%` and route overflow into a scroll
1581
+ container (`.table-wrap`), not the card/grid/viewport.
1582
+ - Hero submit button preserves its base `top: 50%; translateY(-50%)`
1583
+ centering; only size/right tweak per breakpoint.
1584
+ ============================================================ */
1585
+
1586
+ @media (max-width: 920px) {
1587
+ .hero {
1588
+ padding: 36px 18px 28px;
1589
+ border-radius: 12px;
1590
+ }
1591
+ .hero h1 { font-size: 22px; }
1592
+ .hero .hero-sub { font-size: 13px; margin-bottom: 18px; }
1593
+ .hero-input { font-size: 14.5px; padding: 14px 54px 14px 14px; }
1594
+ /* Keep the button vertically centred: don't touch `top` / `transform`. */
1595
+ .hero-submit { width: 38px; height: 38px; right: 6px; }
1596
+ .hero-submit svg { width: 16px; height: 16px; }
1597
+ .hero-chips { gap: 6px; }
1598
+
1599
+ /* Grids: every child must allow shrinking below its intrinsic width,
1600
+ otherwise a wide table inside forces the grid cell out of the viewport
1601
+ and the whole row drifts right. `min-width: 0` is the canonical fix. */
1602
+ .grid-2, .grid-3 { grid-template-columns: 1fr !important; }
1603
+ .grid-2 > *, .grid-3 > * { min-width: 0; }
1604
+
1605
+ /* Stat/card grids collapse to a single column. */
1606
+ .stat-grid,
1607
+ .card-grid { grid-template-columns: 1fr !important; }
1608
+ .stat-grid > *, .card-grid > * { min-width: 0; }
1609
+
1610
+ /* Sections: cap at container width, allow horizontal scroll to live in
1611
+ the `.table-wrap` below rather than bleeding the whole card. */
1612
+ .section,
1613
+ .section-body,
1614
+ .section-body-padded {
1615
+ max-width: 100%;
1616
+ min-width: 0;
1617
+ box-sizing: border-box;
1618
+ }
1619
+
1620
+ /* Tables: the wrap scrolls horizontally; the table itself doesn't grow
1621
+ the viewport. No forced min-width — let columns be natural so short
1622
+ tables don't force a scrollbar at all. */
1623
+ .table-wrap {
1624
+ max-width: 100%;
1625
+ overflow-x: auto;
1626
+ -webkit-overflow-scrolling: touch;
1627
+ }
1628
+ /* Default: cells stay on one line so identifiers, statuses, dates render
1629
+ cleanly. Opt specific long-form columns INTO wrapping via `.col-wrap`. */
1630
+ table th, table td { white-space: nowrap; }
1631
+ table td.col-wrap, table th.col-wrap {
1632
+ white-space: normal;
1633
+ word-break: break-word;
1634
+ min-width: 160px;
1635
+ max-width: 380px;
1636
+ }
1637
+
1638
+ /* Forms and inputs: fill width, don't overflow. */
1639
+ input, textarea, select, .monaco-host {
1640
+ max-width: 100%;
1641
+ box-sizing: border-box;
1642
+ }
1643
+ .monaco-host { height: min(60vh, 500px); }
1644
+
1645
+ /* Long ID strings, file paths, code — let pre wrap so it doesn't force
1646
+ a horizontal scrollbar at the page level. */
1647
+ pre, code { white-space: pre-wrap; word-break: break-word; }
1648
+ .json-view { white-space: pre-wrap; word-break: break-word; }
1649
+
1650
+ /* ...BUT: `<code>` elements rendered inside a table cell are atomic
1651
+ identifiers (task ids, model ids, file paths) — they must stay on a
1652
+ single line. The .table-wrap's horizontal scroll handles the overflow.
1653
+ Without this override the `code`-wrapping rule above causes IDs to
1654
+ break character-by-character into ugly vertical strips. */
1655
+ table td code, table th code {
1656
+ white-space: nowrap;
1657
+ word-break: keep-all;
1658
+ overflow-wrap: normal;
1659
+ }
1660
+
1661
+ /* Command palette fits the screen. */
1662
+ .palette-card { width: min(94vw, 620px); }
1663
+
1664
+ /* Chip rows wrap so they don't spill. */
1665
+ .hero-chips, .chips, .chat-list-meta, .chat-header-meta { flex-wrap: wrap; }
1666
+ }
1667
+
1668
+ @media (max-width: 520px) {
1669
+ .content { padding-left: 12px; padding-right: 12px; }
1670
+ .hero { padding: 28px 14px 22px; }
1671
+ .hero h1 { font-size: 20px; }
1672
+ .hero-input { font-size: 14px; padding: 13px 48px 13px 14px; }
1673
+ .hero-submit { width: 34px; height: 34px; right: 6px; }
1674
+ /* Hamburger slightly smaller + inset */
1675
+ .nav-toggle { width: 40px; height: 40px; top: 10px; left: 10px; }
1676
+ }
1677
+
1678
+ /* ---------- Sortable tables ---------- */
1679
+ .table-wrap table.sortable th.sort-head {
1680
+ cursor: pointer;
1681
+ user-select: none;
1682
+ position: relative;
1683
+ padding-right: 20px;
1684
+ transition: color 0.12s ease;
1685
+ }
1686
+ .table-wrap table.sortable th.sort-head:hover { color: var(--fg); }
1687
+ .table-wrap table.sortable th.sort-head:focus-visible {
1688
+ outline: 2px solid var(--accent);
1689
+ outline-offset: -2px;
1690
+ }
1691
+ .table-wrap table.sortable th.sort-head::after {
1692
+ content: '↕';
1693
+ position: absolute;
1694
+ right: 6px;
1695
+ top: 50%;
1696
+ transform: translateY(-50%);
1697
+ opacity: 0.25;
1698
+ font-size: 10px;
1699
+ transition: opacity 0.12s ease;
1700
+ }
1701
+ .table-wrap table.sortable th.sort-head:hover::after { opacity: 0.6; }
1702
+ .table-wrap table.sortable th.sorted-asc::after { content: '↑'; opacity: 1; color: var(--accent); }
1703
+ .table-wrap table.sortable th.sorted-desc::after { content: '↓'; opacity: 1; color: var(--accent); }