@askrjs/cli 0.0.2 → 0.0.4

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 (310) hide show
  1. package/README.md +46 -7
  2. package/dist/add.d.ts +16 -0
  3. package/dist/add.js +558 -1
  4. package/dist/cli.d.ts +5 -0
  5. package/dist/cli.js +43 -16
  6. package/dist/create.d.ts +5 -0
  7. package/dist/create.js +104 -26
  8. package/dist/directory-swap-DWoHtx7C.js +35 -0
  9. package/dist/discovery-Difb7Y4G.js +323 -0
  10. package/dist/generate.d.ts +5 -0
  11. package/dist/generate.js +461 -0
  12. package/dist/is-direct-execution-Cdlr-ZUl.js +0 -2
  13. package/dist/openapi.d.ts +25 -0
  14. package/dist/openapi.js +49 -16
  15. package/dist/planner-VAj7qlxr.js +285 -0
  16. package/dist/range-YUs9eimn.js +125 -0
  17. package/dist/registry-CyrRHRG5.js +209 -0
  18. package/dist/skills/askr-dashboard-charts/SKILL.md +61 -44
  19. package/dist/skills/askr-dashboard-charts/agents/openai.yaml +2 -2
  20. package/dist/skills/askr-ssr-ssg/SKILL.md +3 -1
  21. package/dist/{skills-Bh0mEhIx.js → skills-B7CbWur9.js} +89 -26
  22. package/dist/skills.d.ts +18 -0
  23. package/dist/skills.js +1 -1
  24. package/dist/specification-DXnDOC-0.js +49 -0
  25. package/dist/ssg-config.d.ts +41 -0
  26. package/dist/ssg-config.js +1 -0
  27. package/dist/ssg.d.ts +61 -0
  28. package/dist/ssg.js +360 -24
  29. package/dist/templates/full-stack/AGENTS.md +0 -1
  30. package/dist/templates/full-stack/README.md +0 -1
  31. package/dist/templates/full-stack/index.html +0 -1
  32. package/dist/templates/full-stack/package.json +5 -3
  33. package/dist/templates/full-stack/server.ts +5 -9
  34. package/dist/templates/full-stack/src/action-authorizations.ts +2 -2
  35. package/dist/templates/full-stack/src/actions/create-message.ts +5 -5
  36. package/dist/templates/full-stack/src/i18n.ts +4 -4
  37. package/dist/templates/full-stack/src/main.tsx +4 -5
  38. package/dist/templates/full-stack/src/pages/home.tsx +5 -5
  39. package/dist/templates/full-stack/src/pages/layout.tsx +15 -5
  40. package/dist/templates/full-stack/src/pages/not-found.tsx +5 -2
  41. package/dist/templates/full-stack/src/routes.tsx +11 -12
  42. package/dist/templates/full-stack/src/schemas.ts +1 -2
  43. package/dist/templates/full-stack/src/server/action-registry.ts +5 -10
  44. package/dist/templates/full-stack/src/server/actions/create-message.ts +4 -4
  45. package/dist/templates/full-stack/src/server/app.ts +67 -57
  46. package/dist/templates/full-stack/src/server/dependencies.ts +10 -10
  47. package/dist/templates/full-stack/src/server/entry-server.ts +3 -3
  48. package/dist/templates/full-stack/src/telemetry.ts +1 -2
  49. package/dist/templates/full-stack/tests/actions/create-message.test.ts +7 -8
  50. package/dist/templates/full-stack/tsconfig.json +1 -2
  51. package/dist/templates/full-stack/vite.config.ts +5 -6
  52. package/dist/templates/spa/AGENTS.md +1 -1
  53. package/dist/templates/spa/package.json +3 -4
  54. package/dist/templates/spa/src/adapters/operations-client.ts +7 -2
  55. package/dist/templates/spa/src/pages/app/_routes.tsx +2 -0
  56. package/dist/templates/spa/src/pages/app/admin-home.tsx +21 -3
  57. package/dist/templates/spa/src/pages/public/_routes.tsx +2 -0
  58. package/dist/templates/spa/src/styles.css +1 -1
  59. package/dist/templates/spa/tsconfig.json +2 -1
  60. package/dist/templates/spa/vitest.config.ts +0 -4
  61. package/dist/templates/ssg/README.md +1 -1
  62. package/dist/templates/ssg/package.json +1 -1
  63. package/dist/templates/ssg/ssg.config.ts +7 -0
  64. package/dist/templates/ssg/tests/ssg-config.test.ts +5 -3
  65. package/dist/templates/ssg/tsconfig.json +2 -1
  66. package/dist/templates/ssg/vitest.config.ts +0 -4
  67. package/dist/templates/ssr/package.json +2 -2
  68. package/dist/templates/ssr/server.ts +4 -10
  69. package/dist/templates/ssr/src/entry-server.tsx +6 -4
  70. package/dist/templates/startkit/package.json +2 -2
  71. package/dist/templates/startkit/src/lib/mock-data.ts +17 -39
  72. package/dist/templates/startkit/tsconfig.json +2 -1
  73. package/dist/update.d.ts +41 -0
  74. package/dist/update.js +282 -2
  75. package/dist/writer-D8qe_7ud.js +226 -0
  76. package/package.json +23 -22
  77. package/dist/add-DqhqRzBQ.js +0 -555
  78. package/dist/add-DqhqRzBQ.js.map +0 -1
  79. package/dist/cli.js.map +0 -1
  80. package/dist/create.js.map +0 -1
  81. package/dist/is-direct-execution-Cdlr-ZUl.js.map +0 -1
  82. package/dist/openapi.js.map +0 -1
  83. package/dist/skills-Bh0mEhIx.js.map +0 -1
  84. package/dist/ssg.js.map +0 -1
  85. package/dist/templates/full-stack/src/vite-server.d.ts +0 -6
  86. package/dist/templates/spa/src/styles.d.ts +0 -1
  87. package/dist/templates/ssg/src/vite-env.d.ts +0 -5
  88. package/dist/templates/ssr/src/vite-server.d.ts +0 -7
  89. package/dist/templates/startkit/src/vite-env.d.ts +0 -5
  90. package/dist/update-DyW1na5V.js +0 -1140
  91. package/dist/update-DyW1na5V.js.map +0 -1
  92. package/skills/askr-accessibility/SKILL.md +0 -68
  93. package/skills/askr-accessibility/agents/openai.yaml +0 -4
  94. package/skills/askr-agent-execution/SKILL.md +0 -85
  95. package/skills/askr-agent-execution/agents/openai.yaml +0 -4
  96. package/skills/askr-agent-workflows/SKILL.md +0 -57
  97. package/skills/askr-agent-workflows/agents/openai.yaml +0 -4
  98. package/skills/askr-api-integration/SKILL.md +0 -79
  99. package/skills/askr-api-integration/agents/openai.yaml +0 -4
  100. package/skills/askr-app-builder/SKILL.md +0 -99
  101. package/skills/askr-app-builder/agents/openai.yaml +0 -4
  102. package/skills/askr-auth-access/SKILL.md +0 -74
  103. package/skills/askr-auth-access/agents/openai.yaml +0 -4
  104. package/skills/askr-cli-vite/SKILL.md +0 -76
  105. package/skills/askr-cli-vite/agents/openai.yaml +0 -4
  106. package/skills/askr-dashboard-charts/SKILL.md +0 -82
  107. package/skills/askr-dashboard-charts/agents/openai.yaml +0 -4
  108. package/skills/askr-design-system/SKILL.md +0 -86
  109. package/skills/askr-design-system/agents/openai.yaml +0 -4
  110. package/skills/askr-env-config/SKILL.md +0 -74
  111. package/skills/askr-env-config/agents/openai.yaml +0 -4
  112. package/skills/askr-error-loading-empty/SKILL.md +0 -89
  113. package/skills/askr-error-loading-empty/agents/openai.yaml +0 -4
  114. package/skills/askr-file-upload-artifacts/SKILL.md +0 -77
  115. package/skills/askr-file-upload-artifacts/agents/openai.yaml +0 -4
  116. package/skills/askr-forms-tables-crud/SKILL.md +0 -98
  117. package/skills/askr-forms-tables-crud/agents/openai.yaml +0 -4
  118. package/skills/askr-mental-model/SKILL.md +0 -109
  119. package/skills/askr-mental-model/agents/openai.yaml +0 -4
  120. package/skills/askr-migration-react/SKILL.md +0 -81
  121. package/skills/askr-migration-react/agents/openai.yaml +0 -4
  122. package/skills/askr-observability-debugging/SKILL.md +0 -83
  123. package/skills/askr-observability-debugging/agents/openai.yaml +0 -4
  124. package/skills/askr-project-structure/SKILL.md +0 -79
  125. package/skills/askr-project-structure/agents/openai.yaml +0 -4
  126. package/skills/askr-query-mutation/SKILL.md +0 -115
  127. package/skills/askr-query-mutation/agents/openai.yaml +0 -4
  128. package/skills/askr-realtime-streaming/SKILL.md +0 -76
  129. package/skills/askr-realtime-streaming/agents/openai.yaml +0 -4
  130. package/skills/askr-resources-data/SKILL.md +0 -100
  131. package/skills/askr-resources-data/agents/openai.yaml +0 -4
  132. package/skills/askr-routing-layouts/SKILL.md +0 -107
  133. package/skills/askr-routing-layouts/agents/openai.yaml +0 -4
  134. package/skills/askr-runtime-reactivity/SKILL.md +0 -92
  135. package/skills/askr-runtime-reactivity/agents/openai.yaml +0 -4
  136. package/skills/askr-ssr-ssg/SKILL.md +0 -76
  137. package/skills/askr-ssr-ssg/agents/openai.yaml +0 -4
  138. package/skills/askr-testing-determinism/SKILL.md +0 -75
  139. package/skills/askr-testing-determinism/agents/openai.yaml +0 -4
  140. package/skills/askr-theming/SKILL.md +0 -86
  141. package/skills/askr-theming/agents/openai.yaml +0 -4
  142. package/skills/askr-ui-composition/SKILL.md +0 -92
  143. package/skills/askr-ui-composition/agents/openai.yaml +0 -4
  144. package/templates/full-stack/AGENTS.md +0 -12
  145. package/templates/full-stack/README.md +0 -18
  146. package/templates/full-stack/gitignore.template +0 -4
  147. package/templates/full-stack/index.html +0 -14
  148. package/templates/full-stack/package.json +0 -37
  149. package/templates/full-stack/server.ts +0 -13
  150. package/templates/full-stack/src/action-authorizations.ts +0 -10
  151. package/templates/full-stack/src/actions/create-message.ts +0 -10
  152. package/templates/full-stack/src/i18n.ts +0 -8
  153. package/templates/full-stack/src/main.tsx +0 -12
  154. package/templates/full-stack/src/pages/home.tsx +0 -25
  155. package/templates/full-stack/src/pages/layout.tsx +0 -33
  156. package/templates/full-stack/src/pages/not-found.tsx +0 -4
  157. package/templates/full-stack/src/routes.tsx +0 -20
  158. package/templates/full-stack/src/schemas.ts +0 -11
  159. package/templates/full-stack/src/server/action-registry.ts +0 -12
  160. package/templates/full-stack/src/server/actions/create-message.ts +0 -14
  161. package/templates/full-stack/src/server/app.ts +0 -66
  162. package/templates/full-stack/src/server/dependencies.ts +0 -55
  163. package/templates/full-stack/src/server/entry-server.ts +0 -8
  164. package/templates/full-stack/src/telemetry.ts +0 -4
  165. package/templates/full-stack/src/vite-server.d.ts +0 -6
  166. package/templates/full-stack/tests/actions/create-message.test.ts +0 -13
  167. package/templates/full-stack/tsconfig.json +0 -16
  168. package/templates/full-stack/vite.config.ts +0 -11
  169. package/templates/spa/AGENTS.md +0 -60
  170. package/templates/spa/README.md +0 -96
  171. package/templates/spa/gitignore.template +0 -16
  172. package/templates/spa/index.html +0 -13
  173. package/templates/spa/package.json +0 -35
  174. package/templates/spa/src/adapters/operations-client.ts +0 -90
  175. package/templates/spa/src/components/shared/metric-card.tsx +0 -27
  176. package/templates/spa/src/components/shared/status-badge.tsx +0 -24
  177. package/templates/spa/src/features/operations/operations.query.ts +0 -9
  178. package/templates/spa/src/main.tsx +0 -10
  179. package/templates/spa/src/pages/_layout.tsx +0 -9
  180. package/templates/spa/src/pages/_routes.tsx +0 -27
  181. package/templates/spa/src/pages/app/_layout.tsx +0 -94
  182. package/templates/spa/src/pages/app/_routes.tsx +0 -10
  183. package/templates/spa/src/pages/app/admin-home.tsx +0 -152
  184. package/templates/spa/src/pages/app/agent-runs.tsx +0 -93
  185. package/templates/spa/src/pages/app/settings.tsx +0 -91
  186. package/templates/spa/src/pages/auth/_layout.tsx +0 -38
  187. package/templates/spa/src/pages/auth/_routes.tsx +0 -6
  188. package/templates/spa/src/pages/auth/login.tsx +0 -63
  189. package/templates/spa/src/pages/not-found.tsx +0 -22
  190. package/templates/spa/src/pages/public/_layout.tsx +0 -47
  191. package/templates/spa/src/pages/public/_routes.tsx +0 -6
  192. package/templates/spa/src/pages/public/home.tsx +0 -143
  193. package/templates/spa/src/shared/format.ts +0 -12
  194. package/templates/spa/src/shared/navigation.ts +0 -15
  195. package/templates/spa/src/styles/components.css +0 -49
  196. package/templates/spa/src/styles/layout.css +0 -192
  197. package/templates/spa/src/styles/reset.css +0 -44
  198. package/templates/spa/src/styles/theme.css +0 -57
  199. package/templates/spa/src/styles/tokens.css +0 -20
  200. package/templates/spa/src/styles.css +0 -7
  201. package/templates/spa/src/styles.d.ts +0 -1
  202. package/templates/spa/tests/app.test.tsx +0 -37
  203. package/templates/spa/tests/components/shared.test.tsx +0 -12
  204. package/templates/spa/tests/resources.test.ts +0 -22
  205. package/templates/spa/tsconfig.json +0 -20
  206. package/templates/spa/tsconfig.node.json +0 -10
  207. package/templates/spa/vite.config.ts +0 -24
  208. package/templates/spa/vitest.config.ts +0 -17
  209. package/templates/ssg/AGENTS.md +0 -55
  210. package/templates/ssg/README.md +0 -39
  211. package/templates/ssg/gitignore.template +0 -17
  212. package/templates/ssg/index.html +0 -13
  213. package/templates/ssg/package.json +0 -35
  214. package/templates/ssg/src/app.tsx +0 -14
  215. package/templates/ssg/src/components/badge.tsx +0 -3
  216. package/templates/ssg/src/components/counter.tsx +0 -30
  217. package/templates/ssg/src/components/site-shell.tsx +0 -111
  218. package/templates/ssg/src/jsx.d.ts +0 -23
  219. package/templates/ssg/src/main.tsx +0 -8
  220. package/templates/ssg/src/pages/about.tsx +0 -82
  221. package/templates/ssg/src/pages/content.tsx +0 -63
  222. package/templates/ssg/src/pages/example.tsx +0 -97
  223. package/templates/ssg/src/pages/home.tsx +0 -51
  224. package/templates/ssg/src/resources/user.ts +0 -15
  225. package/templates/ssg/src/routes.tsx +0 -15
  226. package/templates/ssg/src/styles.css +0 -89
  227. package/templates/ssg/src/vite-env.d.ts +0 -5
  228. package/templates/ssg/ssg.config.ts +0 -34
  229. package/templates/ssg/tests/app.test.tsx +0 -19
  230. package/templates/ssg/tests/components/counter.test.tsx +0 -18
  231. package/templates/ssg/tests/resources.test.ts +0 -11
  232. package/templates/ssg/tests/ssg-config.test.ts +0 -11
  233. package/templates/ssg/tsconfig.json +0 -20
  234. package/templates/ssg/tsconfig.node.json +0 -10
  235. package/templates/ssg/vite.config.ts +0 -24
  236. package/templates/ssg/vitest.config.ts +0 -17
  237. package/templates/ssr/AGENTS.md +0 -28
  238. package/templates/ssr/README.md +0 -38
  239. package/templates/ssr/gitignore.template +0 -16
  240. package/templates/ssr/index.html +0 -13
  241. package/templates/ssr/package.json +0 -34
  242. package/templates/ssr/server.ts +0 -16
  243. package/templates/ssr/src/app.tsx +0 -21
  244. package/templates/ssr/src/components/counter.tsx +0 -26
  245. package/templates/ssr/src/entry-server.tsx +0 -10
  246. package/templates/ssr/src/main.tsx +0 -11
  247. package/templates/ssr/src/pages/about.tsx +0 -75
  248. package/templates/ssr/src/pages/example.tsx +0 -113
  249. package/templates/ssr/src/pages/home.tsx +0 -56
  250. package/templates/ssr/src/resources/user.ts +0 -15
  251. package/templates/ssr/src/routes.tsx +0 -13
  252. package/templates/ssr/src/styles.css +0 -148
  253. package/templates/ssr/src/vite-server.d.ts +0 -7
  254. package/templates/ssr/tests/app.test.tsx +0 -24
  255. package/templates/ssr/tests/components/counter.test.tsx +0 -13
  256. package/templates/ssr/tests/resources.test.ts +0 -11
  257. package/templates/ssr/tsconfig.json +0 -22
  258. package/templates/ssr/tsconfig.node.json +0 -10
  259. package/templates/ssr/tsconfig.server.json +0 -15
  260. package/templates/ssr/vite.config.ts +0 -25
  261. package/templates/ssr/vitest.config.ts +0 -13
  262. package/templates/startkit/AGENTS.md +0 -77
  263. package/templates/startkit/README.md +0 -192
  264. package/templates/startkit/gitignore.template +0 -16
  265. package/templates/startkit/index.html +0 -13
  266. package/templates/startkit/package.json +0 -35
  267. package/templates/startkit/src/components/app-header.tsx +0 -93
  268. package/templates/startkit/src/components/app-sidebar.tsx +0 -95
  269. package/templates/startkit/src/components/data-table.tsx +0 -80
  270. package/templates/startkit/src/components/empty-state.tsx +0 -13
  271. package/templates/startkit/src/components/page-header.tsx +0 -23
  272. package/templates/startkit/src/components/stat-card.tsx +0 -24
  273. package/templates/startkit/src/features/accounts/account-filters.tsx +0 -61
  274. package/templates/startkit/src/features/accounts/account-table.tsx +0 -79
  275. package/templates/startkit/src/lib/format.ts +0 -31
  276. package/templates/startkit/src/lib/mock-data.ts +0 -441
  277. package/templates/startkit/src/lib/routes.ts +0 -116
  278. package/templates/startkit/src/main.tsx +0 -12
  279. package/templates/startkit/src/pages/_layout.tsx +0 -56
  280. package/templates/startkit/src/pages/auth/_layout.tsx +0 -7
  281. package/templates/startkit/src/pages/auth/login.tsx +0 -129
  282. package/templates/startkit/src/pages/home.tsx +0 -83
  283. package/templates/startkit/src/pages/not-found.tsx +0 -24
  284. package/templates/startkit/src/pages/workspace/_layout.tsx +0 -17
  285. package/templates/startkit/src/pages/workspace/accounts/index.tsx +0 -217
  286. package/templates/startkit/src/pages/workspace/dashboard.tsx +0 -118
  287. package/templates/startkit/src/pages/workspace/settings.tsx +0 -218
  288. package/templates/startkit/src/router.tsx +0 -7
  289. package/templates/startkit/src/routes/auth-config.ts +0 -38
  290. package/templates/startkit/src/routes/auth.ts +0 -8
  291. package/templates/startkit/src/routes/index.ts +0 -28
  292. package/templates/startkit/src/routes/public.ts +0 -8
  293. package/templates/startkit/src/routes/workspace/accounts.ts +0 -8
  294. package/templates/startkit/src/routes/workspace/index.ts +0 -14
  295. package/templates/startkit/src/styles/components.css +0 -396
  296. package/templates/startkit/src/styles/layout.css +0 -192
  297. package/templates/startkit/src/styles/reset.css +0 -38
  298. package/templates/startkit/src/styles/theme.css +0 -76
  299. package/templates/startkit/src/styles/tokens.css +0 -67
  300. package/templates/startkit/src/styles.css +0 -7
  301. package/templates/startkit/src/toast.ts +0 -55
  302. package/templates/startkit/src/utils/join-classes.ts +0 -4
  303. package/templates/startkit/src/vite-env.d.ts +0 -5
  304. package/templates/startkit/tests/app.test.tsx +0 -32
  305. package/templates/startkit/tests/preferences.test.ts +0 -43
  306. package/templates/startkit/tests/resources.test.ts +0 -82
  307. package/templates/startkit/tsconfig.json +0 -20
  308. package/templates/startkit/tsconfig.node.json +0 -10
  309. package/templates/startkit/vite.config.ts +0 -32
  310. package/templates/startkit/vitest.config.ts +0 -13
@@ -1,35 +0,0 @@
1
- {
2
- "name": "{{appName}}",
3
- "version": "0.1.0",
4
- "type": "module",
5
- "scripts": {
6
- "clean": "npx rimraf node_modules dist",
7
- "dev": "vp dev",
8
- "build": "vp build",
9
- "preview": "vp preview",
10
- "test": "vp test run",
11
- "typecheck": "tsc --noEmit",
12
- "lint": "vp lint .",
13
- "lint:fix": "npm run lint -- --fix",
14
- "fmt": "vp fmt .",
15
- "check": "npm run lint && npm run typecheck && npm test && npm run build"
16
- },
17
- "dependencies": {
18
- "@askrjs/askr": ">=0.0.53 <0.1.0",
19
- "@askrjs/charts": ">=0.0.3 <0.1.0",
20
- "@askrjs/logos": ">=0.0.3 <0.1.0",
21
- "@askrjs/lucide": ">=0.0.3 <0.1.0",
22
- "@askrjs/themes": ">=0.0.12 <0.1.0",
23
- "@askrjs/ui": ">=0.0.13 <0.1.0"
24
- },
25
- "devDependencies": {
26
- "@askrjs/vite": ">=0.0.6 <0.1.0",
27
- "@types/node": "^26.0.0",
28
- "jsdom": "^29.1.1",
29
- "typescript": "^6.0.3",
30
- "vite-plus": "^0.2.4"
31
- },
32
- "engines": {
33
- "node": "^20.19.0 || >=22.12.0"
34
- }
35
- }
@@ -1,90 +0,0 @@
1
- import type { RunStatus } from '../components/shared/status-badge';
2
-
3
- export type OperationRun = {
4
- id: string;
5
- title: string;
6
- status: RunStatus;
7
- owner: string;
8
- updatedAt: string;
9
- };
10
-
11
- export type OperationsSnapshot = {
12
- version: number;
13
- consistency: 'fresh' | 'pending-write' | 'stale';
14
- lastEventId: string;
15
- metrics: Array<{ label: string; value: string; trend: string }>;
16
- throughput: Array<{ label: string; value: number }>;
17
- lag: Array<{ label: string; value: number }>;
18
- runs: OperationRun[];
19
- };
20
-
21
- export async function getOperationsSnapshot({
22
- signal,
23
- }: {
24
- signal: AbortSignal;
25
- }): Promise<OperationsSnapshot> {
26
- await delay(220, signal);
27
-
28
- return {
29
- version: 42,
30
- consistency: 'fresh',
31
- lastEventId: 'evt_18442',
32
- metrics: [
33
- { label: 'Active runs', value: '12', trend: '+3 today' },
34
- { label: 'Pending approvals', value: '3', trend: '2 urgent' },
35
- { label: 'Projection lag', value: '1.2s', trend: 'healthy' },
36
- ],
37
- throughput: [
38
- { label: 'Research', value: 18 },
39
- { label: 'Review', value: 11 },
40
- { label: 'Deploy', value: 7 },
41
- { label: 'Audit', value: 9 },
42
- ],
43
- lag: [
44
- { label: '10:00', value: 4 },
45
- { label: '10:10', value: 3 },
46
- { label: '10:20', value: 2 },
47
- { label: '10:30', value: 1 },
48
- { label: '10:40', value: 2 },
49
- { label: '10:50', value: 1 },
50
- ],
51
- runs: [
52
- {
53
- id: 'run_4812',
54
- title: 'Summarize renewal risk',
55
- status: 'running',
56
- owner: 'Revenue ops',
57
- updatedAt: '2026-05-22T09:52:00.000Z',
58
- },
59
- {
60
- id: 'run_4811',
61
- title: 'Approve workspace migration',
62
- status: 'requires-action',
63
- owner: 'Platform',
64
- updatedAt: '2026-05-22T09:40:00.000Z',
65
- },
66
- {
67
- id: 'run_4810',
68
- title: 'Reconcile audit events',
69
- status: 'succeeded',
70
- owner: 'Security',
71
- updatedAt: '2026-05-22T09:25:00.000Z',
72
- },
73
- ],
74
- };
75
- }
76
-
77
- function delay(ms: number, signal: AbortSignal): Promise<void> {
78
- return new Promise((resolve, reject) => {
79
- const timeout = globalThis.setTimeout(resolve, ms);
80
-
81
- signal.addEventListener(
82
- 'abort',
83
- () => {
84
- globalThis.clearTimeout(timeout);
85
- reject(new DOMException('Operation aborted', 'AbortError'));
86
- },
87
- { once: true }
88
- );
89
- });
90
- }
@@ -1,27 +0,0 @@
1
- import {
2
- Card,
3
- CardDescription,
4
- CardHeader,
5
- CardTitle,
6
- } from '@askrjs/themes/components';
7
- import { Inline } from '@askrjs/themes/components';
8
-
9
- export type MetricCardProps = {
10
- label: string;
11
- value: string;
12
- trend: string;
13
- };
14
-
15
- export default function MetricCard({ label, value, trend }: MetricCardProps) {
16
- return (
17
- <Card class="metric-card">
18
- <CardHeader>
19
- <Inline justify="between" align="center" gap="3">
20
- <CardDescription>{label}</CardDescription>
21
- <span class="metric-trend">{trend}</span>
22
- </Inline>
23
- <CardTitle>{value}</CardTitle>
24
- </CardHeader>
25
- </Card>
26
- );
27
- }
@@ -1,24 +0,0 @@
1
- import { Badge } from '@askrjs/themes/components';
2
-
3
- export type RunStatus =
4
- | 'queued'
5
- | 'running'
6
- | 'requires-action'
7
- | 'succeeded'
8
- | 'failed';
9
-
10
- export type StatusBadgeProps = {
11
- status: RunStatus;
12
- };
13
-
14
- const labels: Record<RunStatus, string> = {
15
- queued: 'queued',
16
- running: 'running',
17
- 'requires-action': 'needs review',
18
- succeeded: 'succeeded',
19
- failed: 'failed',
20
- };
21
-
22
- export default function StatusBadge({ status }: StatusBadgeProps) {
23
- return <Badge data-status={status}>{labels[status]}</Badge>;
24
- }
@@ -1,9 +0,0 @@
1
- import { getOperationsSnapshot } from '../../adapters/operations-client';
2
-
3
- export function loadOperations({
4
- signal = new AbortController().signal,
5
- }: {
6
- signal?: AbortSignal;
7
- }) {
8
- return getOperationsSnapshot({ signal });
9
- }
@@ -1,10 +0,0 @@
1
- import { createSPA } from '@askrjs/askr/boot';
2
- import { getManifest } from '@askrjs/askr/router';
3
-
4
- import './styles.css';
5
- import './pages/_routes';
6
-
7
- await createSPA({
8
- root: document.getElementById('app')!,
9
- manifest: getManifest(),
10
- });
@@ -1,9 +0,0 @@
1
- import { ThemeScope } from '@askrjs/themes/theme';
2
-
3
- export default function RootLayout({ children }: { children?: unknown }) {
4
- return (
5
- <ThemeScope defaultTheme="tabby">
6
- <div class="app-root">{children}</div>
7
- </ThemeScope>
8
- );
9
- }
@@ -1,27 +0,0 @@
1
- import { fallback, group, registerRoutes } from '@askrjs/askr/router';
2
- import RootLayout from './_layout';
3
- import AuthLayout from './auth/_layout';
4
- import { registerAuthRoutes } from './auth/_routes';
5
- import { registerAppRoutes } from './app/_routes';
6
- import AppLayout from './app/_layout';
7
- import NotFoundPage from './not-found';
8
- import { registerPublicRoutes } from './public/_routes';
9
- import PublicLayout from './public/_layout';
10
-
11
- registerRoutes(() => {
12
- group({ layout: RootLayout }, () => {
13
- group({ layout: PublicLayout }, () => {
14
- registerPublicRoutes();
15
- });
16
-
17
- group({ layout: AuthLayout }, () => {
18
- registerAuthRoutes();
19
- });
20
-
21
- group({ layout: AppLayout }, () => {
22
- registerAppRoutes();
23
- });
24
-
25
- fallback(NotFoundPage);
26
- });
27
- });
@@ -1,94 +0,0 @@
1
- import {
2
- BotIcon,
3
- HomeIcon,
4
- LogOutIcon,
5
- MoonIcon,
6
- SettingsIcon,
7
- SunIcon,
8
- } from '@askrjs/lucide';
9
- import { Link, navigate } from '@askrjs/askr/router';
10
- import { Button } from '@askrjs/themes/components';
11
- import { Container, Inline, Stack } from '@askrjs/themes/components';
12
- import { Header, Shell, ShellMain, ShellNav } from '@askrjs/themes/components';
13
- import {
14
- NavBrand,
15
- NavGroup,
16
- NavLink,
17
- Sidebar,
18
- } from '@askrjs/themes/components';
19
- import { Badge } from '@askrjs/themes/components';
20
- import { ThemeToggle } from '@askrjs/themes/theme';
21
- import { appNavItems } from '../../shared/navigation';
22
-
23
- const icons = {
24
- home: <HomeIcon size={16} aria-hidden="true" />,
25
- agents: <BotIcon size={16} aria-hidden="true" />,
26
- settings: <SettingsIcon size={16} aria-hidden="true" />,
27
- };
28
-
29
- export default function AppLayout({ children }: { children?: unknown }) {
30
- return (
31
- <Shell variant="sidebar" class="app-shell">
32
- <ShellNav>
33
- <Sidebar
34
- aria-label="Workspace navigation"
35
- breakpoint="md"
36
- collapsible="icon"
37
- >
38
- <NavBrand>
39
- <Link href="/app" class="brand-link">
40
- <span class="brand-mark">A</span>
41
- <strong>{'{{appName}}'}</strong>
42
- </Link>
43
- </NavBrand>
44
- <NavGroup label="Workspace">
45
- {appNavItems.map((item) => (
46
- <NavLink href={item.href} match={item.match}>
47
- <Inline as="span" gap="2" align="center">
48
- {icons[item.icon]}
49
- <span>{item.label}</span>
50
- </Inline>
51
- </NavLink>
52
- ))}
53
- </NavGroup>
54
- <NavGroup label="Session" align="end">
55
- <NavLink href="/" match="exact">
56
- <Inline as="span" gap="2" align="center">
57
- <LogOutIcon size={16} aria-hidden="true" />
58
- <span>Sign out</span>
59
- </Inline>
60
- </NavLink>
61
- </NavGroup>
62
- </Sidebar>
63
- </ShellNav>
64
- <ShellMain>
65
- <Header position="sticky" class="app-header">
66
- <Container size="full">
67
- <Inline justify="between" align="center" gap="3" wrap="wrap">
68
- <Stack gap="none">
69
- <span class="eyebrow">Operations console</span>
70
- <strong>Agent workflow control plane</strong>
71
- </Stack>
72
- <Inline gap="2" align="center" wrap="wrap">
73
- <Badge>event stream healthy</Badge>
74
- <ThemeToggle
75
- variant="ghost"
76
- size="icon"
77
- aria-label="Toggle color theme"
78
- lightIcon={<SunIcon size={18} aria-hidden="true" />}
79
- darkIcon={<MoonIcon size={18} aria-hidden="true" />}
80
- />
81
- <Button variant="secondary" onPress={() => navigate('/')}>
82
- Public site
83
- </Button>
84
- </Inline>
85
- </Inline>
86
- </Container>
87
- </Header>
88
- <Container size="full" class="app-main">
89
- {children}
90
- </Container>
91
- </ShellMain>
92
- </Shell>
93
- );
94
- }
@@ -1,10 +0,0 @@
1
- import { route } from '@askrjs/askr/router';
2
- import AgentRunsPage from './agent-runs';
3
- import AdminHomePage from './admin-home';
4
- import SettingsPage from './settings';
5
-
6
- export function registerAppRoutes(): void {
7
- route('/app', AdminHomePage);
8
- route('/app/agents', AgentRunsPage);
9
- route('/app/settings', SettingsPage);
10
- }
@@ -1,152 +0,0 @@
1
- import { resource } from '@askrjs/askr/resources';
2
- import { BarChart, Sparkline } from '@askrjs/charts/components';
3
- import { AlertCircleIcon, RefreshCwIcon } from '@askrjs/lucide';
4
- import { Button } from '@askrjs/themes/components';
5
- import {
6
- Alert,
7
- Badge,
8
- Card,
9
- CardContent,
10
- CardDescription,
11
- CardHeader,
12
- CardTitle,
13
- Skeleton,
14
- } from '@askrjs/themes/components';
15
- import { Block, Inline, Section, Stack } from '@askrjs/themes/components';
16
- import { EmptyState } from '@askrjs/themes/components';
17
- import MetricCard from '../../components/shared/metric-card';
18
- import StatusBadge from '../../components/shared/status-badge';
19
- import { loadOperations } from '../../features/operations/operations.query';
20
- import { formatRelativeTime } from '../../shared/format';
21
-
22
- export default function AdminHomePage() {
23
- const operations = resource(({ signal }) => loadOperations({ signal }), []);
24
- const snapshot = operations.value;
25
-
26
- if (operations.error && !snapshot) {
27
- return (
28
- <Section>
29
- <EmptyState
30
- icon={<AlertCircleIcon size={24} aria-hidden="true" />}
31
- title="Operations could not load"
32
- description="The dashboard keeps failures recoverable. Retry the owning resource instead of hiding the error in a toast."
33
- actions={<Button onPress={() => operations.refresh()}>Retry</Button>}
34
- />
35
- </Section>
36
- );
37
- }
38
-
39
- return (
40
- <Stack gap="5">
41
- <section class="page-heading">
42
- <Stack gap="2">
43
- <Badge>projection v{snapshot?.version ?? '...'}</Badge>
44
- <h1>Workspace home</h1>
45
- <p class="lead">
46
- A consistency-aware dashboard for agent runs, queue health, and
47
- event-sourced read models.
48
- </p>
49
- </Stack>
50
- <Inline gap="2" align="center">
51
- {operations.pending && snapshot ? <Badge>refreshing</Badge> : null}
52
- <Button variant="secondary" onPress={() => operations.refresh()}>
53
- <RefreshCwIcon size={14} aria-hidden="true" /> Refresh
54
- </Button>
55
- </Inline>
56
- </section>
57
-
58
- {operations.pending && !snapshot ? (
59
- <Block gap="md">
60
- <Skeleton style="height: 8rem" />
61
- <Skeleton style="height: 8rem" />
62
- <Skeleton style="height: 8rem" />
63
- </Block>
64
- ) : null}
65
-
66
- {snapshot ? (
67
- <>
68
- <Block gap="md" class="metric-grid">
69
- {snapshot.metrics.map((metric) => (
70
- <MetricCard
71
- label={metric.label}
72
- value={metric.value}
73
- trend={metric.trend}
74
- />
75
- ))}
76
- </Block>
77
-
78
- <Block gap="md" align="stretch" class="chart-grid">
79
- <Card>
80
- <CardHeader>
81
- <CardTitle>Run throughput</CardTitle>
82
- <CardDescription>
83
- Accepted commands by work type.
84
- </CardDescription>
85
- </CardHeader>
86
- <CardContent>
87
- <BarChart label="Run throughput" data={snapshot.throughput} />
88
- </CardContent>
89
- </Card>
90
- <Card>
91
- <CardHeader>
92
- <CardTitle>Projection lag</CardTitle>
93
- <CardDescription>
94
- Lower is better; stale states stay visible.
95
- </CardDescription>
96
- </CardHeader>
97
- <CardContent>
98
- <Sparkline label="Projection lag" data={snapshot.lag} />
99
- </CardContent>
100
- </Card>
101
- </Block>
102
-
103
- {snapshot.consistency !== 'fresh' ? (
104
- <Alert variant="warning">
105
- Read models are {snapshot.consistency}. Last processed event is{' '}
106
- {snapshot.lastEventId}.
107
- </Alert>
108
- ) : null}
109
-
110
- <Card>
111
- <CardHeader>
112
- <CardTitle>Recent agent runs</CardTitle>
113
- <CardDescription>
114
- Run state is modeled as product state, not a single loading
115
- boolean.
116
- </CardDescription>
117
- </CardHeader>
118
- <CardContent>
119
- <div class="run-table-wrap">
120
- <table class="run-table">
121
- <thead>
122
- <tr>
123
- <th>Run</th>
124
- <th>Status</th>
125
- <th>Owner</th>
126
- <th>Updated</th>
127
- </tr>
128
- </thead>
129
- <tbody>
130
- {snapshot.runs.map((run) => (
131
- <tr>
132
- <td>
133
- <strong>{run.title}</strong>
134
- <span>{run.id}</span>
135
- </td>
136
- <td>
137
- <StatusBadge status={run.status} />
138
- </td>
139
- <td>{run.owner}</td>
140
- <td>{formatRelativeTime(run.updatedAt)}</td>
141
- </tr>
142
- ))}
143
- </tbody>
144
- </table>
145
- </div>
146
- </CardContent>
147
- </Card>
148
- </>
149
- ) : null}
150
- </Stack>
151
- );
152
- }
@@ -1,93 +0,0 @@
1
- import {
2
- BotIcon,
3
- CheckCircle2Icon,
4
- Clock3Icon,
5
- ShieldAlertIcon,
6
- } from '@askrjs/lucide';
7
- import {
8
- Badge,
9
- Card,
10
- CardContent,
11
- CardDescription,
12
- CardHeader,
13
- CardTitle,
14
- } from '@askrjs/themes/components';
15
- import { Block, Inline, Stack } from '@askrjs/themes/components';
16
- import StatusBadge, {
17
- type RunStatus,
18
- } from '../../components/shared/status-badge';
19
-
20
- const runs: Array<{
21
- title: string;
22
- status: RunStatus;
23
- event: string;
24
- description: string;
25
- }> = [
26
- {
27
- title: 'Reconcile billing projection',
28
- status: 'running',
29
- event: 'tool call: compare-ledger',
30
- description:
31
- 'Streaming events are appended to the timeline and reconciled by event id.',
32
- },
33
- {
34
- title: 'Approve enterprise workspace',
35
- status: 'requires-action',
36
- event: 'approval requested',
37
- description:
38
- 'Human gates are explicit product states, not hidden inside generated text.',
39
- },
40
- {
41
- title: 'Refresh onboarding cohort',
42
- status: 'succeeded',
43
- event: 'projection caught up',
44
- description:
45
- 'The read model confirms the command reached the user-visible view.',
46
- },
47
- ];
48
-
49
- export default function AgentRunsPage() {
50
- return (
51
- <Stack gap="5">
52
- <section class="page-heading">
53
- <Stack gap="2">
54
- <Badge>agent workflows</Badge>
55
- <h1>Agent runs</h1>
56
- <p class="lead">
57
- Timelines make queued, running, approval, failure, and projection
58
- catch-up states easy to inspect.
59
- </p>
60
- </Stack>
61
- </section>
62
-
63
- <Block gap="md" class="agent-grid">
64
- {runs.map((run) => (
65
- <Card>
66
- <CardHeader>
67
- <Inline justify="between" align="start" gap="3">
68
- <span class="card-icon">
69
- {run.status === 'succeeded' ? (
70
- <CheckCircle2Icon size={18} aria-hidden="true" />
71
- ) : run.status === 'requires-action' ? (
72
- <ShieldAlertIcon size={18} aria-hidden="true" />
73
- ) : (
74
- <BotIcon size={18} aria-hidden="true" />
75
- )}
76
- </span>
77
- <StatusBadge status={run.status} />
78
- </Inline>
79
- <CardTitle>{run.title}</CardTitle>
80
- <CardDescription>{run.description}</CardDescription>
81
- </CardHeader>
82
- <CardContent>
83
- <Inline gap="2" align="center">
84
- <Clock3Icon size={14} aria-hidden="true" />
85
- <span>{run.event}</span>
86
- </Inline>
87
- </CardContent>
88
- </Card>
89
- ))}
90
- </Block>
91
- </Stack>
92
- );
93
- }
@@ -1,91 +0,0 @@
1
- import { state } from '@askrjs/askr';
2
- import { Input } from '@askrjs/ui';
3
- import {
4
- Button,
5
- Field,
6
- FieldHint,
7
- InputGroup,
8
- InputGroupText,
9
- } from '@askrjs/themes/components';
10
- import {
11
- Badge,
12
- Card,
13
- CardContent,
14
- CardDescription,
15
- CardHeader,
16
- CardTitle,
17
- } from '@askrjs/themes/components';
18
- import { Block, Stack } from '@askrjs/themes/components';
19
-
20
- export default function SettingsPage() {
21
- const [endpoint, setEndpoint] = state(
22
- 'https://api.example.test'
23
- ) as unknown as [
24
- ReturnType<typeof state<string>>,
25
- ReturnType<typeof state<string>>['set'],
26
- ];
27
-
28
- return (
29
- <Stack gap="5">
30
- <section class="page-heading">
31
- <Stack gap="2">
32
- <Badge>environment</Badge>
33
- <h1>Settings</h1>
34
- <p class="lead">
35
- Configuration stays in shared boundaries and adapters receive it
36
- through one clear path.
37
- </p>
38
- </Stack>
39
- </section>
40
-
41
- <Block gap="md" align="start" class="settings-grid">
42
- <Card>
43
- <CardHeader>
44
- <CardTitle>API adapter</CardTitle>
45
- <CardDescription>
46
- Keep generated clients and transport concerns out of route
47
- components.
48
- </CardDescription>
49
- </CardHeader>
50
- <CardContent>
51
- <Field>
52
- <label htmlFor="api-endpoint">Base URL</label>
53
- <InputGroup>
54
- <InputGroupText>URL</InputGroupText>
55
- <Input
56
- id="api-endpoint"
57
- value={endpoint()}
58
- onInput={(event: Event) =>
59
- setEndpoint((event.currentTarget as HTMLInputElement).value)
60
- }
61
- />
62
- </InputGroup>
63
- <FieldHint>
64
- Demo-only value. Real apps should validate public config at
65
- startup.
66
- </FieldHint>
67
- </Field>
68
- </CardContent>
69
- </Card>
70
-
71
- <Card>
72
- <CardHeader>
73
- <CardTitle>Consistency policy</CardTitle>
74
- <CardDescription>
75
- Event-sourced apps should expose lag, retries, and stale states
76
- directly.
77
- </CardDescription>
78
- </CardHeader>
79
- <CardContent>
80
- <Stack gap="3">
81
- <Badge>pending-write copy enabled</Badge>
82
- <Badge>projection lag visible</Badge>
83
- <Badge>manual refresh available</Badge>
84
- <Button variant="secondary">Save settings</Button>
85
- </Stack>
86
- </CardContent>
87
- </Card>
88
- </Block>
89
- </Stack>
90
- );
91
- }