@a5c-ai/kradle 5.0.1-staging.3abdf9534c25

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 (295) hide show
  1. package/Dockerfile +31 -0
  2. package/README.md +187 -0
  3. package/bin/kradle-demo.mjs +23 -0
  4. package/bin/kradle-server.mjs +14 -0
  5. package/dist/kradle-controller-ui.json +3482 -0
  6. package/dist/kradle-lifecycle.json +201 -0
  7. package/dist/kradle-runtime-snapshot.json +3125 -0
  8. package/dist/kradle-summary.json +724 -0
  9. package/docs/README.md +61 -0
  10. package/docs/agents/README.md +83 -0
  11. package/docs/agents/acceptance-test-matrix.md +193 -0
  12. package/docs/agents/agent-mux-adapter-contract.md +167 -0
  13. package/docs/agents/agent-mux-source-map.md +310 -0
  14. package/docs/agents/agent-run-memory-import-spec.md +256 -0
  15. package/docs/agents/agent-stack-management-spec.md +421 -0
  16. package/docs/agents/api-contract-spec.md +309 -0
  17. package/docs/agents/artifacts-writeback-spec.md +145 -0
  18. package/docs/agents/chart-packaging-spec.md +128 -0
  19. package/docs/agents/ci-orchestration-spec.md +140 -0
  20. package/docs/agents/context-assembly-spec.md +219 -0
  21. package/docs/agents/controller-reconciliation-spec.md +255 -0
  22. package/docs/agents/crd-schema-spec.md +315 -0
  23. package/docs/agents/decision-log-open-questions.md +169 -0
  24. package/docs/agents/developer-implementation-checklist.md +329 -0
  25. package/docs/agents/dispatching-design.md +262 -0
  26. package/docs/agents/gaps-agent-mux-to-kradle-crds.md +298 -0
  27. package/docs/agents/glossary.md +66 -0
  28. package/docs/agents/implementation-blueprint.md +324 -0
  29. package/docs/agents/implementation-rollout-slices.md +251 -0
  30. package/docs/agents/memory-context-integration-spec.md +194 -0
  31. package/docs/agents/memory-ontology-schema-spec.md +253 -0
  32. package/docs/agents/memory-operations-runbook.md +121 -0
  33. package/docs/agents/mvp-vertical-slice-spec.md +146 -0
  34. package/docs/agents/observability-audit-spec.md +265 -0
  35. package/docs/agents/operator-runbook.md +174 -0
  36. package/docs/agents/org-memory-api-payload-examples.md +333 -0
  37. package/docs/agents/org-memory-controller-sequence-spec.md +181 -0
  38. package/docs/agents/org-memory-e2e-fixture-plan.md +161 -0
  39. package/docs/agents/org-memory-ui-implementation-map.md +114 -0
  40. package/docs/agents/org-memory-vertical-slice-spec.md +168 -0
  41. package/docs/agents/org-resource-model-delta-spec.md +111 -0
  42. package/docs/agents/org-route-resource-model-spec.md +183 -0
  43. package/docs/agents/org-scoping-namespace-spec.md +114 -0
  44. package/docs/agents/rbac-secrets-management-spec.md +406 -0
  45. package/docs/agents/repository-page-integration-spec.md +255 -0
  46. package/docs/agents/resource-contract-examples.md +808 -0
  47. package/docs/agents/resource-relationship-map.md +190 -0
  48. package/docs/agents/security-threat-model.md +188 -0
  49. package/docs/agents/shared-memory-company-brain-spec.md +358 -0
  50. package/docs/agents/storage-migration-spec.md +168 -0
  51. package/docs/agents/subagent-orchestration-spec.md +152 -0
  52. package/docs/agents/system-overview.md +88 -0
  53. package/docs/agents/tools-mcp-skills-spec.md +189 -0
  54. package/docs/agents/traceability-matrix.md +79 -0
  55. package/docs/agents/ui-flow-spec.md +211 -0
  56. package/docs/agents/ui-ux-system-spec.md +426 -0
  57. package/docs/agents/workspace-lifecycle-spec.md +166 -0
  58. package/docs/architecture-spec.md +78 -0
  59. package/docs/architecture-v2.md +2759 -0
  60. package/docs/components/control-plane.md +78 -0
  61. package/docs/components/data-plane.md +69 -0
  62. package/docs/components/hooks-events.md +67 -0
  63. package/docs/components/identity-rbac-policy.md +73 -0
  64. package/docs/components/kubevela-oam.md +70 -0
  65. package/docs/components/operations-publishing.md +81 -0
  66. package/docs/components/runners-ci.md +66 -0
  67. package/docs/components/web-ui.md +94 -0
  68. package/docs/crd-behaviors-and-relationships.md +3926 -0
  69. package/docs/external/README.md +47 -0
  70. package/docs/external/bidirectional-sync-design.md +134 -0
  71. package/docs/external/cicd-interface.md +64 -0
  72. package/docs/external/external-backend-controllers.md +170 -0
  73. package/docs/external/external-backend-crds.md +234 -0
  74. package/docs/external/external-backend-ui-spec.md +151 -0
  75. package/docs/external/external-backend-ux-flows.md +115 -0
  76. package/docs/external/external-object-mapping.md +125 -0
  77. package/docs/external/git-forge-interface.md +68 -0
  78. package/docs/external/github-integration-design.md +151 -0
  79. package/docs/external/issue-tracking-interface.md +66 -0
  80. package/docs/external/provider-capability-manifests.md +204 -0
  81. package/docs/external/provider-catalog.md +139 -0
  82. package/docs/external/provider-rollout-testing.md +78 -0
  83. package/docs/external/research-results.md +48 -0
  84. package/docs/external/security-auth-permissions.md +81 -0
  85. package/docs/external/sync-state-machines.md +108 -0
  86. package/docs/external/unified-external-backend-model.md +107 -0
  87. package/docs/external/user-facing-changes.md +67 -0
  88. package/docs/gaps.md +161 -0
  89. package/docs/install.md +94 -0
  90. package/docs/integration-and-design-decisions.md +1530 -0
  91. package/docs/kradle-design.md +334 -0
  92. package/docs/local-minikube.md +55 -0
  93. package/docs/ontology/README.md +32 -0
  94. package/docs/ontology/bounded-contexts.md +29 -0
  95. package/docs/ontology/events-and-hooks.md +32 -0
  96. package/docs/ontology/oam-kubevela.md +32 -0
  97. package/docs/ontology/operations-and-release.md +25 -0
  98. package/docs/ontology/personas-and-actors.md +32 -0
  99. package/docs/ontology/policies-and-invariants.md +33 -0
  100. package/docs/ontology/problem-space.md +30 -0
  101. package/docs/ontology/resource-contracts.md +40 -0
  102. package/docs/ontology/resource-taxonomy.md +42 -0
  103. package/docs/ontology/runners-and-ci.md +29 -0
  104. package/docs/ontology/solution-space.md +24 -0
  105. package/docs/ontology/storage-and-data-boundaries.md +29 -0
  106. package/docs/ontology/validation-matrix.md +24 -0
  107. package/docs/ontology/web-ui-excellent-flows.md +32 -0
  108. package/docs/ontology/workflows.md +39 -0
  109. package/docs/ontology/world.md +35 -0
  110. package/docs/openapi.yaml +1291 -0
  111. package/docs/product-requirements.md +62 -0
  112. package/docs/requirements-v2.md +235 -0
  113. package/docs/roadmap-mvp.md +87 -0
  114. package/docs/sdk-api-reference.md +1108 -0
  115. package/docs/system-requirements.md +90 -0
  116. package/docs/system-spec-v2.md +1230 -0
  117. package/docs/tests/README.md +53 -0
  118. package/docs/tests/agent-qa-plan.md +63 -0
  119. package/docs/tests/browser-ui-tests.md +62 -0
  120. package/docs/tests/ci-quality-gates.md +48 -0
  121. package/docs/tests/coverage-model.md +64 -0
  122. package/docs/tests/e2e-scenario-tests.md +53 -0
  123. package/docs/tests/fixtures-test-data.md +63 -0
  124. package/docs/tests/observability-reliability-tests.md +54 -0
  125. package/docs/tests/product-test-matrix.md +145 -0
  126. package/docs/tests/qa-adoption-roadmap.md +130 -0
  127. package/docs/tests/qa-automation-plan.md +101 -0
  128. package/docs/tests/security-compliance-tests.md +57 -0
  129. package/docs/tests/test-framework-tools.md +88 -0
  130. package/docs/tests/test-suite-layout.md +121 -0
  131. package/docs/tests/unit-integration-tests.md +48 -0
  132. package/docs/todo-kyverno +714 -0
  133. package/docs/todos.md +4 -0
  134. package/docs/user-stories.md +78 -0
  135. package/docs/web-console-spec.md +533 -0
  136. package/examples/minikube-demo.yaml +190 -0
  137. package/examples/oam-application.yaml +23 -0
  138. package/examples/policy-kyverno-pr-title.yaml +18 -0
  139. package/package.json +66 -0
  140. package/scripts/build.mjs +29 -0
  141. package/scripts/setup-minikube.mjs +65 -0
  142. package/scripts/smoke.mjs +37 -0
  143. package/scripts/validate-doc-coverage.mjs +152 -0
  144. package/scripts/validate-package.mjs +95 -0
  145. package/scripts/validate-ui.mjs +305 -0
  146. package/src/agent-adapter-controller.js +169 -0
  147. package/src/agent-approval-controller.js +170 -0
  148. package/src/agent-context-bundles.js +242 -0
  149. package/src/agent-dispatch-controller.js +549 -0
  150. package/src/agent-gateway-config-controller.js +147 -0
  151. package/src/agent-identity-migration.js +115 -0
  152. package/src/agent-memory-controller.js +357 -0
  153. package/src/agent-memory-import.js +327 -0
  154. package/src/agent-memory-query.js +292 -0
  155. package/src/agent-memory-repository-source-controller.js +255 -0
  156. package/src/agent-mux-client.js +589 -0
  157. package/src/agent-permission-review.js +250 -0
  158. package/src/agent-persona-controller.js +135 -0
  159. package/src/agent-project-controller.js +117 -0
  160. package/src/agent-prompt-composition.js +55 -0
  161. package/src/agent-provider-config-controller.js +151 -0
  162. package/src/agent-secret-config-grant-controller.js +282 -0
  163. package/src/agent-session-transcript-controller.js +189 -0
  164. package/src/agent-stack-controller.js +421 -0
  165. package/src/agent-subagent-controller.js +160 -0
  166. package/src/agent-transport-binding-controller.js +121 -0
  167. package/src/agent-trigger-controller.js +387 -0
  168. package/src/agent-workspace-controller.js +702 -0
  169. package/src/agent-writeback-controller.js +302 -0
  170. package/src/api-controller.js +621 -0
  171. package/src/argocd-gitops.js +43 -0
  172. package/src/artifact-registry-controller.js +542 -0
  173. package/src/assistant-runtime.js +284 -0
  174. package/src/async-controller.js +207 -0
  175. package/src/audit-controller.js +191 -0
  176. package/src/auth.js +310 -0
  177. package/src/component-catalog.js +41 -0
  178. package/src/control-plane.js +136 -0
  179. package/src/controller-client.js +112 -0
  180. package/src/controller-ui.js +620 -0
  181. package/src/data-plane.js +179 -0
  182. package/src/event-bus.js +397 -0
  183. package/src/external/conflict-controller.js +225 -0
  184. package/src/external/github/auth.js +96 -0
  185. package/src/external/github/cicd.js +180 -0
  186. package/src/external/github/git-forge.js +240 -0
  187. package/src/external/github/index.js +144 -0
  188. package/src/external/github/issue-tracking.js +163 -0
  189. package/src/external/provider-adapter.js +161 -0
  190. package/src/external/provider-resource-factory.js +221 -0
  191. package/src/external/sync-controller.js +235 -0
  192. package/src/external/webhook-controller.js +144 -0
  193. package/src/external/write-controller.js +283 -0
  194. package/src/gitea-backend.js +131 -0
  195. package/src/gitea-service.js +173 -0
  196. package/src/handoff.js +98 -0
  197. package/src/health-probes.js +134 -0
  198. package/src/hooks-events.js +63 -0
  199. package/src/hooks-lifecycle.js +117 -0
  200. package/src/http-server.js +409 -0
  201. package/src/identity-policy.js +86 -0
  202. package/src/index.js +71 -0
  203. package/src/jitsi-agent-bridge.js +141 -0
  204. package/src/jitsi-meeting-controller.js +291 -0
  205. package/src/jitsi-sync-controller.js +198 -0
  206. package/src/kradle-inference-service-controller.js +246 -0
  207. package/src/kubernetes-controller-async.js +531 -0
  208. package/src/kubernetes-controller.js +904 -0
  209. package/src/kubernetes-resource-gateway.js +48 -0
  210. package/src/model-route-controller.js +364 -0
  211. package/src/notification-controller.js +178 -0
  212. package/src/operations.js +112 -0
  213. package/src/org-scoping.js +5 -0
  214. package/src/resource-model.js +282 -0
  215. package/src/runner-controller.js +272 -0
  216. package/src/runners-ci.js +48 -0
  217. package/src/runtime.js +196 -0
  218. package/src/snapshot-cache.js +157 -0
  219. package/src/virtual-model-controller.js +538 -0
  220. package/src/virtual-model-hook-bridge.js +200 -0
  221. package/src/web-ui.js +40 -0
  222. package/tests/agent-adapter-controller.test.js +361 -0
  223. package/tests/agent-approval-controller.test.js +173 -0
  224. package/tests/agent-context-bundles.test.js +278 -0
  225. package/tests/agent-dispatch-controller.test.js +679 -0
  226. package/tests/agent-gateway-config-controller.test.js +386 -0
  227. package/tests/agent-identity-migration.test.js +87 -0
  228. package/tests/agent-memory-controller.test.js +461 -0
  229. package/tests/agent-memory-import-snapshot.test.js +477 -0
  230. package/tests/agent-memory-query.test.js +404 -0
  231. package/tests/agent-memory-repository-source.test.js +514 -0
  232. package/tests/agent-mux-client.test.js +389 -0
  233. package/tests/agent-mux-integration.test.js +971 -0
  234. package/tests/agent-permission-review-v2.test.js +317 -0
  235. package/tests/agent-permission-review.test.js +209 -0
  236. package/tests/agent-persona-controller.test.js +127 -0
  237. package/tests/agent-project-controller.test.js +302 -0
  238. package/tests/agent-prompt-composition.test.js +76 -0
  239. package/tests/agent-provider-config-controller.test.js +376 -0
  240. package/tests/agent-resources.test.js +303 -0
  241. package/tests/agent-secret-config-grant.test.js +231 -0
  242. package/tests/agent-session-transcript-controller.test.js +499 -0
  243. package/tests/agent-stack-controller.test.js +283 -0
  244. package/tests/agent-subagent-controller.test.js +201 -0
  245. package/tests/agent-transport-binding-controller.test.js +294 -0
  246. package/tests/agent-trigger-controller.test.js +271 -0
  247. package/tests/agent-trigger-routes.test.js +190 -0
  248. package/tests/agent-trigger-sources.test.js +245 -0
  249. package/tests/agent-workspace-controller.test.js +181 -0
  250. package/tests/agent-writeback.test.js +292 -0
  251. package/tests/approval-persistence.test.js +171 -0
  252. package/tests/artifact-registry.test.js +511 -0
  253. package/tests/assistant-runtime.test.js +506 -0
  254. package/tests/async-controller.test.js +252 -0
  255. package/tests/audit-controller.test.js +227 -0
  256. package/tests/codespace-controller.test.js +318 -0
  257. package/tests/controller-client.test.js +133 -0
  258. package/tests/deployment.test.js +527 -0
  259. package/tests/e2e/lifecycle.test.js +120 -0
  260. package/tests/event-bus-integration.test.js +355 -0
  261. package/tests/external-github-forge.test.js +560 -0
  262. package/tests/external-github-issues-cicd.test.js +520 -0
  263. package/tests/external-integration.test.js +470 -0
  264. package/tests/external-persistence.test.js +415 -0
  265. package/tests/external-provider-adapter.test.js +365 -0
  266. package/tests/external-resource-model.test.js +223 -0
  267. package/tests/external-webhook-sync.test.js +287 -0
  268. package/tests/external-write-conflict.test.js +353 -0
  269. package/tests/gitea-service.test.js +253 -0
  270. package/tests/health-check-real.test.js +165 -0
  271. package/tests/health-probes.test.js +90 -0
  272. package/tests/hooks-lifecycle.test.js +364 -0
  273. package/tests/integration/full-flow.test.js +266 -0
  274. package/tests/jitsi-agent-bridge.test.js +119 -0
  275. package/tests/jitsi-helm-integration.test.js +77 -0
  276. package/tests/jitsi-meeting-controller.test.js +170 -0
  277. package/tests/jitsi-resource-model.test.js +73 -0
  278. package/tests/jitsi-sync-controller.test.js +112 -0
  279. package/tests/kradle-inference-service.test.js +689 -0
  280. package/tests/kradle.test.js +779 -0
  281. package/tests/memory-search-wiring.test.js +270 -0
  282. package/tests/model-route-controller.test.js +733 -0
  283. package/tests/notification-controller.test.js +196 -0
  284. package/tests/notification-integration.test.js +179 -0
  285. package/tests/org-scoping.test.js +687 -0
  286. package/tests/runner-controller.test.js +327 -0
  287. package/tests/runner-integration.test.js +231 -0
  288. package/tests/session-cookie-hmac.test.js +151 -0
  289. package/tests/snapshot-performance.test.js +315 -0
  290. package/tests/sse-events.test.js +107 -0
  291. package/tests/virtual-model-controller.test.js +877 -0
  292. package/tests/virtual-model-hook-bridge.test.js +384 -0
  293. package/tests/webhook-trigger.test.js +198 -0
  294. package/tests/workspace-volumes.test.js +312 -0
  295. package/tests/writeback-persistence.test.js +207 -0
package/docs/todos.md ADDED
@@ -0,0 +1,4 @@
1
+ https://kradle-staging.a5c.ai/api/orgs/default/policy-reports shows: Kyverno CRDs are not installed or are not readable by the Kradle service account - helm should install everything needed.
2
+
3
+ ❯ refactor the C:\Users\tmusk\IdeaProjects\babysitter\packages\kradle\web to 3 packages , kradle\sdk, kradle\web and kradle\cli (web and cli
4
+ should depend on sdk), the sdk is the client sdk. the cli should have a command to run itself as an mcp server.
@@ -0,0 +1,78 @@
1
+ # User Stories
2
+
3
+ ## Developer stories
4
+
5
+ ### Open and review a PR
6
+
7
+ As a developer, I want to review a PR in a three-pane view with file tree, diff, conversation, inline comments, suggested edits, and CI status so that I can complete reviews quickly.
8
+
9
+ Acceptance criteria:
10
+
11
+ - Given I open a PR, when the page loads, then I see changed files, diff, discussion, reviewers, merge state, and related pipeline runs.
12
+ - Given I use keyboard shortcuts, when I press navigation keys, then I can move between files and comments without leaving the keyboard.
13
+ - Given I add a suggested edit, when I submit it, then the UI exposes the equivalent resource/YAML mutation.
14
+
15
+ ### Debug a failing run
16
+
17
+ As a developer, I want a live run view with step navigation, log streaming, failure copy, similar-run search, and rerun controls so that I can diagnose failures without switching tools.
18
+
19
+ Acceptance criteria:
20
+
21
+ - Given a job is running, when logs are emitted, then the UI streams them through SSE without polling.
22
+ - Given a step fails, when I click find similar runs, then Kradle queries pipelines by failure signature labels.
23
+ - Given I rerun from a step, when I submit, then Kradle creates a new `Pipeline` with `resumeFrom`.
24
+
25
+ ## Platform engineer stories
26
+
27
+ ### Configure a runner pool
28
+
29
+ As a platform engineer, I want a split form/YAML runner pool editor so that pool configuration is easy to edit and still GitOps-auditable.
30
+
31
+ Acceptance criteria:
32
+
33
+ - Given I edit image, resources, node selector, warm replicas, max replicas, trust tier, and cache backend, when fields change, then YAML updates live.
34
+ - Given I save, when the operation succeeds, then the same manifest can be copied as `kubectl apply`.
35
+ - Given I click save to repo, when configured, then Kradle opens a PR against the platform config repo.
36
+
37
+ ### Roll out PR policy safely
38
+
39
+ As a platform engineer, I want policy templates, CEL/raw modes, audit preview, and enforcement controls so that I can govern PRs without breaking teams unexpectedly.
40
+
41
+ Acceptance criteria:
42
+
43
+ - Given I select a policy template, when I preview it, then existing PRs that would violate the policy are listed.
44
+ - Given the policy is in audit mode, when a violating PR is created, then it is recorded but not blocked.
45
+ - Given I switch to enforce mode, when a violating PR is created, then admission blocks it with an actionable message.
46
+
47
+ ## Repo admin stories
48
+
49
+ ### Add and verify a webhook
50
+
51
+ As a repo admin, I want to create a webhook, send a test delivery, inspect failures, and replay deliveries so integrations are operationally transparent.
52
+
53
+ Acceptance criteria:
54
+
55
+ - Given I create a subscription, when I send a test delivery, then a `WebhookDelivery` resource appears within seconds.
56
+ - Given delivery fails, when I open the log, then I see request headers, body, response, latency, retries, and error details.
57
+ - Given I click replay, when secrets are current, then Kradle re-fires the event and records a new delivery attempt.
58
+
59
+ ## Team lead stories
60
+
61
+ ### Cross-repo triage
62
+
63
+ As a team lead, I want inbox filters and saved views stored as resources so that triage workflows can be versioned and shared.
64
+
65
+ Acceptance criteria:
66
+
67
+ - Given I create a filter for priority issues and PRs, when I save it, then Kradle stores a `Selector` or `View` resource.
68
+ - Given another user applies the resource, when they open the inbox, then they see the same triage view.
69
+ - Given the view is exported, when committed to Git, then it can be reviewed and applied like any other config.
70
+
71
+ ## Excellent-flow coverage
72
+
73
+ - Open and review a PR.
74
+ - Debug a failing run.
75
+ - Configure a runner pool.
76
+ - Add a webhook and verify it works.
77
+ - Write a PR policy with audit-to-enforce rollout.
78
+ - Cross-repo triage with saved filters.
@@ -0,0 +1,533 @@
1
+ # Kradle Web Console Specification
2
+
3
+ > Exhaustive reference for the Kradle web console.
4
+ > Source: `packages/kradle/web/`
5
+ > Framework: Next.js 16 + React 19 (App Router)
6
+
7
+ ---
8
+
9
+ ## 1. Page Inventory (57 pages)
10
+
11
+ ### 1.1 Top-Level Pages
12
+
13
+ | # | Route | File | Data Source | Purpose | Interactive Elements |
14
+ |---|-------|------|-------------|---------|---------------------|
15
+ | 1 | `/` | `page.jsx` | None | Landing/home page | Login CTA, org selector |
16
+ | 2 | `/login` | `login/page.jsx` | `listEnabledAuthProviders()` | Authentication login | Provider buttons (GitHub, SSO) |
17
+ | 3 | `/logout` | `logout/page.jsx` | None | Session logout | Auto-redirect to /login |
18
+ | 4 | `/orgs` | `orgs/page.jsx` | `fetchControllerUiModel()` | Organization list | Org cards, create org button |
19
+ | 5 | `/people` | `people/page.jsx` | `fetchControllerUiModel()` | People directory | User search, team filter |
20
+
21
+ ### 1.2 Organization Dashboard (5 pages)
22
+
23
+ | # | Route | File | Data Source | Purpose | Interactive Elements |
24
+ |---|-------|------|-------------|---------|---------------------|
25
+ | 6 | `/orgs/[org]` | `orgs/[org]/page.jsx` | `uiModel.views.dashboard` | Org dashboard overview | Cards (repos, PRs, issues, runs), activity feed, quick actions |
26
+ | 7 | `/orgs/[org]/profile` | `orgs/[org]/profile/page.jsx` | `uiModel.identity` | User profile | Edit display name, email; linked identities |
27
+ | 8 | `/orgs/[org]/people` | `orgs/[org]/people/page.jsx` | `uiModel.identity.users` | Org members | Invite button, team assignment, role toggle |
28
+ | 9 | `/orgs/[org]/inbox` | `orgs/[org]/inbox/page.jsx` | `notifications.listNotifications()` | Notification inbox | Mark as read, filter by type, clear all |
29
+ | 10 | `/orgs/[org]/insights` | `orgs/[org]/insights/page.jsx` | `uiModel.metrics` | Analytics and insights | Time range selector, metric cards |
30
+
31
+ ### 1.3 Ship (Repositories & Code) — 9 pages
32
+
33
+ | # | Route | File | Data Source | Purpose | Interactive Elements |
34
+ |---|-------|------|-------------|---------|---------------------|
35
+ | 11 | `/orgs/[org]/repositories` | `orgs/[org]/repositories/page.jsx` | `uiModel.views.dashboard.repositories` | Repository list | Create repo form, visibility filter, search |
36
+ | 12 | `/orgs/[org]/repositories/[repo]/code` | `repositories/[repo]/code/page.jsx` | `git-proxy` API | Code browser | File tree, branch selector, breadcrumb |
37
+ | 13 | `/orgs/[org]/repositories/[repo]/pull-requests` | `repositories/[repo]/pull-requests/page.jsx` | `uiModel resources PullRequest` | PR list | Status filter, create PR button |
38
+ | 14 | `/orgs/[org]/repositories/[repo]/issues` | `repositories/[repo]/issues/page.jsx` | `uiModel resources Issue` | Issue list | Label filter, assignee, new issue |
39
+ | 15 | `/orgs/[org]/repositories/[repo]/issues/[issue]` | `issues/[issue]/page.jsx` | Issue resource | Issue detail | Comment form, label editor, close/reopen |
40
+ | 16 | `/orgs/[org]/repositories/[repo]/hooks` | `repositories/[repo]/hooks/page.jsx` | `WebhookSubscription` | Webhook config | Add webhook form, delivery list, replay |
41
+ | 17 | `/orgs/[org]/repositories/[repo]/runs` | `repositories/[repo]/runs/page.jsx` | `AgentDispatchRun` filtered by repo | Repo agent runs | Run list, dispatch button, status filter |
42
+ | 18 | `/orgs/[org]/repositories/[repo]/settings` | `repositories/[repo]/settings/page.jsx` | Repository resource | Repo settings | Rename, visibility toggle, danger zone (delete) |
43
+ | 19 | `/orgs/[org]/runs` | `orgs/[org]/runs/page.jsx` | `uiModel.agents.runs` | All runs overview | Filter by stack, status, repository |
44
+
45
+ ### 1.4 Manage (Access & Policy) — 8 pages
46
+
47
+ | # | Route | File | Data Source | Purpose | Interactive Elements |
48
+ |---|-------|------|-------------|---------|---------------------|
49
+ | 20 | `/orgs/[org]/access/permissions` | `access/permissions/page.jsx` | `uiModel.identity.permissions` | Permission management | Grant/revoke, subject selector, permission level |
50
+ | 21 | `/orgs/[org]/access/ssh-keys` | `access/ssh-keys/page.jsx` | `uiModel.identity.sshKeys` | SSH key management | Add key form, revoke button, scope filter |
51
+ | 22 | `/orgs/[org]/access/branch-protection` | `access/branch-protection/page.jsx` | `BranchProtection` resources | Branch rules | Ref pattern input, toggle required reviews |
52
+ | 23 | `/orgs/[org]/settings` | `orgs/[org]/settings/page.jsx` | Organization resource | Org settings | Display name, slug, namespace info, danger zone |
53
+ | 24 | `/orgs/[org]/settings/secrets` | `settings/secrets/page.jsx` | `/api/orgs/:org/secrets` | Secret management | Add secret form, delete, grant management |
54
+ | 25 | `/orgs/[org]/hooks-events` | `orgs/[org]/hooks-events/page.jsx` | `WebhookSubscription + Delivery` | Webhook events | Subscription list, delivery inspector, replay |
55
+ | 26 | `/orgs/[org]/deployments` | `orgs/[org]/deployments/page.jsx` | `uiModel.delivery` | Deployments | Application list, release history, health |
56
+ | 27 | `/orgs/[org]/runners-ci` | `orgs/[org]/runners-ci/page.jsx` | `RunnerPool + Pipeline + Job` | Runner pools & CI | Pool editor, pipeline list, job detail |
57
+
58
+ ### 1.5 Agents — 24 pages
59
+
60
+ | # | Route | File | Data Source | Purpose | Interactive Elements |
61
+ |---|-------|------|-------------|---------|---------------------|
62
+ | 28 | `/orgs/[org]/agents` | `agents/page.jsx` | `uiModel.agents` | Agent overview | Stack count cards, active runs, pending approvals |
63
+ | 29 | `/orgs/[org]/agents/stacks` | `agents/stacks/page.jsx` | `uiModel.agents.stacks` | Stack list | Readiness indicators, create button |
64
+ | 30 | `/orgs/[org]/agents/stacks/new` | `agents/stacks/new/page.jsx` | `STACK_LAYERS, COMPOSITION_FACETS` | Create stack | Multi-step StackBuilder form |
65
+ | 31 | `/orgs/[org]/agents/stacks/[name]` | `agents/stacks/[name]/page.jsx` | AgentStack resource | Stack detail | Conditions list, capabilities graph, edit |
66
+ | 32 | `/orgs/[org]/agents/runs` | `agents/runs/page.jsx` | `uiModel.agents.runs` | Dispatch run list | Phase filter, repository filter, cost summary |
67
+ | 33 | `/orgs/[org]/agents/runs/[runId]` | `agents/runs/[runId]/page.jsx` | AgentDispatchRun + Attempt | Run detail | Attempt timeline, transcript, workspace link |
68
+ | 34 | `/orgs/[org]/agents/sessions` | `agents/sessions/page.jsx` | `uiModel.agents.sessions` | Session list | Active/completed filter, cost column |
69
+ | 35 | `/orgs/[org]/agents/sessions/[sessionId]` | `agents/sessions/[sessionId]/page.jsx` | AgentSession + Transcript | Session detail | SessionTabs: transcript, tools, cost, shell |
70
+ | 36 | `/orgs/[org]/agents/rules` | `agents/rules/page.jsx` | `uiModel.agents.rules` | Trigger rule list | Source type badges, enable/disable toggle |
71
+ | 37 | `/orgs/[org]/agents/rules/new` | `agents/rules/new/page.jsx` | Stack list for dropdown | Create trigger rule | TriggerRuleForm with source type selector |
72
+ | 38 | `/orgs/[org]/agents/rules/[ruleName]` | `agents/rules/[ruleName]/page.jsx` | AgentTriggerRule resource | Rule detail | Edit form, execution history |
73
+ | 39 | `/orgs/[org]/agents/approvals` | `agents/approvals/page.jsx` | `uiModel.agents.approvals` | Approval queue | Approve/Deny buttons, filter by action type |
74
+ | 40 | `/orgs/[org]/agents/workspaces` | `agents/workspaces/page.jsx` | `uiModel.agents.workspaces` | Workspace list | Phase badges, repository links |
75
+ | 41 | `/orgs/[org]/agents/workspaces/[workspaceId]` | `agents/workspaces/[workspaceId]/page.jsx` | KradleWorkspace resource | Workspace detail | Codespace launch, associations, run history |
76
+ | 42 | `/orgs/[org]/agents/settings` | `agents/settings/page.jsx` | Adapter + Provider + Gateway | Agent settings | Adapter config, provider forms, gateway URL |
77
+ | 43 | `/orgs/[org]/agents/projects` | `agents/projects/page.jsx` | `uiModel.agents.projects` | Project list | Create project, kanban toggle |
78
+ | 44 | `/orgs/[org]/agents/projects/[projectId]` | `agents/projects/[projectId]/page.jsx` | KradleProject resource | Project detail | Kanban board, issue list, settings |
79
+ | 45 | `/orgs/[org]/agents/projects/[projectId]/issues` | `projects/[projectId]/issues/page.jsx` | Issues filtered by project | Project issues | Filter, create issue |
80
+ | 46 | `/orgs/[org]/agents/projects/[projectId]/issues/[issue]` | `issues/[issue]/page.jsx` | Issue resource | Project issue detail | Comment, labels, assign |
81
+ | 47 | `/orgs/[org]/agents/memory` | `agents/memory/page.jsx` | `uiModel.agents.memoryRepositories` | Memory overview | Repository list, snapshot count |
82
+ | 48 | `/orgs/[org]/agents/memory/search` | `agents/memory/search/page.jsx` | Memory query API | Memory search | MemorySearchForm, results display |
83
+ | 49 | `/orgs/[org]/agents/memory/ontology` | `agents/memory/ontology/page.jsx` | AgentMemoryOntology | Ontology editor | MemoryOntologyEditor, node/edge kind editors |
84
+ | 50 | `/orgs/[org]/agents/memory/imports` | `agents/memory/imports/page.jsx` | `uiModel.agents.memoryImports` | Import list | Status badges, review button |
85
+ | 51 | `/orgs/[org]/agents/memory/imports/[importId]` | `agents/memory/imports/[importId]/page.jsx` | AgentRunMemoryImport | Import detail | MemoryImportReview, approve/reject |
86
+
87
+ ### 1.6 External — 4 pages
88
+
89
+ | # | Route | File | Data Source | Purpose | Interactive Elements |
90
+ |---|-------|------|-------------|---------|---------------------|
91
+ | 52 | `/orgs/[org]/external` | `orgs/[org]/external/page.jsx` | ExternalBackendProvider list | External overview | Provider cards, add button |
92
+ | 53 | `/orgs/[org]/external/providers/new` | `external/providers/new/page.jsx` | Provider type list | Add provider | ExternalProviderWizard (multi-step) |
93
+ | 54 | `/orgs/[org]/external/sync` | `external/sync/page.jsx` | ExternalSyncState | Sync dashboard | ExternalSyncDashboard, trigger sync |
94
+ | 55 | `/orgs/[org]/external/conflicts` | `external/conflicts/page.jsx` | ExternalSyncConflict list | Conflict list | ExternalConflictResolver, strategy selector |
95
+
96
+ ### 1.7 Observe & Tools — 4 pages
97
+
98
+ | # | Route | File | Data Source | Purpose | Interactive Elements |
99
+ |---|-------|------|-------------|---------|---------------------|
100
+ | 56 | `/orgs/[org]/api-docs` | `orgs/[org]/api-docs/page.jsx` | controllerEndpoints | API documentation | Endpoint list, try-it panel |
101
+ | 57 | `/orgs/[org]/controller-api` | `orgs/[org]/controller-api/page.jsx` | Full snapshot | Controller API explorer | ApiExplorer with request/response |
102
+ | 58 | `/orgs/[org]/advanced-plans` | `orgs/[org]/advanced-plans/page.jsx` | Resource YAML | Advanced plans | YAML editor, apply button |
103
+ | 59 | `/orgs/[org]/operations-install` | `orgs/[org]/operations-install/page.jsx` | uiModel.operations | Operations install guide | Copy commands, step indicators |
104
+
105
+ ---
106
+
107
+ ## 2. Component Library (56 components)
108
+
109
+ ### 2.1 Agent Components
110
+
111
+ | # | Component | File | Props | State | API Calls | Key Behavior |
112
+ |---|-----------|------|-------|-------|-----------|--------------|
113
+ | 1 | ApprovalActions | `approval-actions.jsx` | `{ approval, org, onDecide }` | — | POST approvals/:name/decide | Approve/Deny buttons with reason modal |
114
+ | 2 | ApprovalModeToggle | `approval-mode-toggle.jsx` | `{ stack, onToggle }` | `useState(mode)` | — | Toggle between yolo/prompt/deny |
115
+ | 3 | DispatchButton | `dispatch-button.jsx` | `{ stack, repo, org, onDispatch }` | `useState(loading)` | POST agents/dispatch | One-click dispatch with loading state |
116
+ | 4 | RunActions | `run-actions.jsx` | `{ run, org }` | — | — | Retry, cancel, view workspace links |
117
+ | 5 | RuleActions | `rule-actions.jsx` | `{ rule, org }` | — | — | Edit, disable, delete trigger rule |
118
+ | 6 | StackActions | `stack-actions.jsx` | `{ stack, org }` | — | — | Edit, dispatch, delete stack |
119
+ | 7 | StackBuilder | `stack-builder.jsx` | `{ org, layers, onSave }` | Multi-step form state | POST resources | Multi-step agent stack creation wizard |
120
+ | 8 | StackBuilderGraph | `stack-builder-graph.jsx` | `{ stack, capabilities }` | — | — | Visual capability graph |
121
+ | 9 | SessionCost | `session-cost.jsx` | `{ session, transcript }` | — | — | Token count and cost display |
122
+ | 10 | SessionShell | `session-shell.jsx` | `{ sessionId, org }` | SSE subscription | SSE stream | Terminal-style live session viewer |
123
+ | 11 | SessionTabs | `session-tabs.jsx` | `{ session, transcript }` | `useState(activeTab)` | — | Tabbed: Transcript, Tools, Cost, Shell |
124
+ | 12 | ToolInspector | `tool-inspector.jsx` | `{ mcpServers, toolProfiles }` | — | — | MCP tool listing with status |
125
+ | 13 | TriggerRuleForm | `trigger-rule-form.jsx` | `{ org, stacks, onSave }` | Form state | POST resources | Source type selector, cron/webhook/comment/label fields |
126
+
127
+ ### 2.2 Memory Components
128
+
129
+ | # | Component | File | Props | Key Behavior |
130
+ |---|-----------|------|-------|--------------|
131
+ | 14 | MemorySearchForm | `memory-search-form.jsx` | `{ org, onSearch }` | Mode selector (graph/grep/both), query input, kind filter, depth |
132
+ | 15 | MemoryOntologyEditor | `memory-ontology-editor.jsx` | `{ ontology, org }` | Node kind editor, edge kind editor, vocabulary |
133
+ | 16 | MemoryImportReview | `memory-import-review.jsx` | `{ importResource, org }` | Diff view, approve/reject buttons |
134
+
135
+ ### 2.3 External Components
136
+
137
+ | # | Component | File | Props | Key Behavior |
138
+ |---|-----------|------|-------|--------------|
139
+ | 17 | ExternalConflictResolver | `external-conflict-resolver.jsx` | `{ conflict, org }` | Side-by-side diff, strategy buttons |
140
+ | 18 | ExternalProviderList | `external-provider-list.jsx` | `{ providers }` | Cards with status indicators |
141
+ | 19 | ExternalProviderWizard | `external-provider-wizard.jsx` | `{ org, onComplete }` | Multi-step: type → credentials → scope → confirm |
142
+ | 20 | ExternalSyncDashboard | `external-sync-dashboard.jsx` | `{ syncStates, org }` | Status overview with metrics |
143
+
144
+ ### 2.4 Kanban Components
145
+
146
+ | # | Component | File | Props | Key Behavior |
147
+ |---|-----------|------|-------|--------------|
148
+ | 21 | KanbanCard | `kanban-card.jsx` | `{ item, onDragStart }` | Draggable card with issue/PR preview |
149
+ | 22 | KanbanColumn | `kanban-column.jsx` | `{ status, items, onDrop }` | Drop target column |
150
+ | 23 | KanbanEnhanced | `kanban-enhanced.jsx` | `{ project, issues }` | Full board with columns |
151
+ | 24 | KanbanFilters | `kanban-filters.jsx` | `{ onFilter }` | Label, assignee, repository filters |
152
+ | 25 | KanbanInteractive | `kanban-interactive.jsx` | `{ project, org }` | SSE-powered live kanban with drag-drop |
153
+
154
+ ### 2.5 Workspace Components
155
+
156
+ | # | Component | File | Props | Key Behavior |
157
+ |---|-----------|------|-------|--------------|
158
+ | 26 | WorkspacePanel | `workspace-panel.jsx` | `{ workspace }` | Overview: phase, repo, branch, PVC |
159
+ | 27 | WorkspaceCodespace | `workspace-codespace.jsx` | `{ workspace, org }` | Launch/stop codespace, URL display |
160
+ | 28 | WorkspaceAssociations | `workspace-associations.jsx` | `{ workspace }` | Add/remove run, user, session links |
161
+ | 29 | WorkspaceRunHistory | `workspace-run-history.jsx` | `{ workspace, runs }` | Active runs, historical runs table |
162
+
163
+ ### 2.6 Repository Components
164
+
165
+ | # | Component | File | Props | Key Behavior |
166
+ |---|-----------|------|-------|--------------|
167
+ | 30 | RepoCodeBrowser | `repo-code-browser.jsx` | `{ org, repo, branch }` | File tree + content viewer via git-proxy |
168
+ | 31 | RepoRuns | `repo-runs.jsx` | `{ runs, org }` | Filtered run list for a repository |
169
+ | 32 | PullRequestList | `pull-request-list.jsx` | `{ pullRequests, org }` | PR list with status indicators |
170
+ | 33 | IssueList | `issue-list.jsx` | `{ issues, org }` | Filterable issue list |
171
+ | 34 | IssueEditor | `issue-editor.jsx` | `{ issue, org }` | Rich issue create/edit form |
172
+ | 35 | WebhookManager | `webhook-manager.jsx` | `{ subscriptions, deliveries }` | CRUD webhooks, delivery inspector |
173
+
174
+ ### 2.7 Global Components
175
+
176
+ | # | Component | File | Props | Key Behavior |
177
+ |---|-----------|------|-------|--------------|
178
+ | 36 | CommandPalette | `command-palette.jsx` | `{ org }` | Cmd+K / Ctrl+K; full-text search, quick nav |
179
+ | 37 | KeyboardShortcuts | `keyboard-shortcuts.jsx` | — | ? overlay; nav shortcuts, action shortcuts |
180
+ | 38 | GlobalSearch | `global-search.jsx` | `{ org }` | Full-text search across all resources |
181
+ | 39 | NotificationBell | `notification-bell.jsx` | `{ org }` | Badge with unread count, dropdown panel |
182
+ | 40 | ActivityFeed | `activity-feed.jsx` | `{ org, events }` | Time-grouped activity entries |
183
+ | 41 | HealthMonitor | `health-monitor.jsx` | `{ connection }` | System component status indicators |
184
+ | 42 | LiveUpdates | `live-updates.jsx` | `{ org, onEvent }` | SSE connection, auto-reconnect |
185
+ | 43 | ThemeRuntime | `theme-runtime.jsx` | — | Dark/light toggle, system preference detection |
186
+ | 44 | KradleLoading | `kradle-loading.jsx` | `{ label? }` | Branded loading spinner |
187
+
188
+ ### 2.8 Settings Components
189
+
190
+ | # | Component | File | Props | Key Behavior |
191
+ |---|-----------|------|-------|--------------|
192
+ | 45 | AgentSettingsForm | `agent-settings-form.jsx` | `{ org }` | Combined adapters + providers + gateway form |
193
+ | 46 | SettingsAdapters | `settings-adapters.jsx` | `{ adapters, org }` | Adapter CRUD |
194
+ | 47 | SettingsProviders | `settings-providers.jsx` | `{ providers, org }` | Provider CRUD |
195
+ | 48 | SettingsGateway | `settings-gateway.jsx` | `{ gateway, org }` | Gateway URL + feature flags |
196
+ | 49 | AppSettings | `app-settings.jsx` | `{ org }` | App-level settings |
197
+ | 50 | SecretManager | `secret-manager.jsx` | `{ org }` | Secret CRUD with masked values |
198
+ | 51 | RunnerPoolManager | `runner-pool-manager.jsx` | `{ pools, org }` | Pool sizing with warm/max sliders |
199
+ | 52 | UserProfile | `user-profile.jsx` | `{ user, org }` | Profile display and edit |
200
+
201
+ ### 2.9 Utility Components
202
+
203
+ | # | Component | File | Props | Key Behavior |
204
+ |---|-----------|------|-------|--------------|
205
+ | 53 | ResourceActions | `resource-actions.jsx` | `{ resource, org }` | View/Edit/Delete menu |
206
+ | 54 | ResourceCrudActions | `resource-crud-actions.jsx` | `{ kind, org }` | Full CRUD buttons |
207
+ | 55 | CodeEditor | `code-editor.jsx` | `{ value, language, onChange }` | Syntax-highlighted editor |
208
+ | 56 | ApiExplorer | `api-explorer.jsx` | `{ endpoints }` | Interactive API testing |
209
+ | 57 | DeploymentPipeline | `deployment-pipeline.jsx` | `{ applications }` | Visual pipeline progress |
210
+
211
+ ---
212
+
213
+ ## 3. Data Flow Architecture
214
+
215
+ ### 3.1 Fetch Pipeline
216
+
217
+ ```
218
+ Page Component (Server Component)
219
+ → loadKradleUi() / fetchControllerUiModel({ baseUrl, org })
220
+ → HTTP GET /api/controller?org=<org>
221
+ → createKradleHttpHandler matches route
222
+ → createControllerUiModel(snapshot, { organization })
223
+ → Stale-while-revalidate cache (30s TTL)
224
+ → Pass data as props to Client Components
225
+ ```
226
+
227
+ ### 3.2 Controller UI Model Shape
228
+
229
+ `createControllerUiModel()` produces:
230
+
231
+ ```javascript
232
+ {
233
+ product: 'Kradle',
234
+ status: 'ready' | 'degraded',
235
+ namespace: 'kradle-org-acme',
236
+ platformNamespace: 'kradle-system',
237
+ org: { name, slug, displayName, namespace },
238
+ orgs: [...],
239
+ generatedAt: ISO timestamp,
240
+ controller: { mode, endpoints, architecture, storage, connection, apiService, commands },
241
+ metrics: { components, resources, events, users, teams, repositories, pullRequests, issues, projects, pipelines, ... },
242
+ components: [...runtimeComponents],
243
+ resources: [...KRADLE_RESOURCES mapped with items],
244
+ events: [...last 8 K8s events],
245
+ delivery: { applications, runtime, capabilityCatalog },
246
+ policyEngine: { mode, health, profiles, templates, bindings, violations },
247
+ agents: { stacks, runs, rules, sessions, workspaces, approvals, adapters, providers, projects, gateway, transcripts, memoryRepositories, memorySnapshots, memoryImports },
248
+ identity: { counts, providers, users, teams, invites, mappings, permissions, sshKeys, reconciliation },
249
+ validation: [...healthChecks],
250
+ views: { dashboard, pullRequestReview, failingRun, runnerPoolEditor, webhookInspector, triageView }
251
+ }
252
+ ```
253
+
254
+ ### 3.3 API Proxy Routes (Web)
255
+
256
+ | Route | Target | Method |
257
+ |-------|--------|--------|
258
+ | `/api/orgs` | Kradle API | GET |
259
+ | `/api/orgs/[org]/repositories` | Resource CRUD | GET/POST |
260
+ | `/api/auth/[provider]` | OAuth redirect | GET |
261
+ | `/api/auth/callback/[provider]` | OAuth callback | GET |
262
+ | `/api/auth/logout` | Session destruction | POST |
263
+ | `/api/auth/delegated` | Delegated identity | GET |
264
+ | `/api/atlas/search` | Atlas graph search | POST |
265
+ | `/api/git-proxy` | Gitea tree/blob proxy | POST |
266
+ | `/api/watch/[...resource]` | SSE watch endpoint | GET |
267
+
268
+ ---
269
+
270
+ ## 4. Navigation Architecture
271
+
272
+ ### 4.1 Navigation Groups
273
+
274
+ | Group | Icon | Pages | Section |
275
+ |-------|------|-------|---------|
276
+ | **Ship** | Code | Repositories, PRs, Issues, Code, Runs | Primary development |
277
+ | **Manage** | Settings | Permissions, SSH Keys, Branch Protection, Settings, Secrets, Deployments, Runners | Administration |
278
+ | **Agents** | Bot | Stacks, Runs, Sessions, Rules, Approvals, Workspaces, Projects, Memory | AI orchestration |
279
+ | **Observe** | Eye | Hooks & Events, Insights, Inbox, Health, API Docs | Monitoring |
280
+ | **External** | Link | Providers, Sync, Conflicts | Integration |
281
+
282
+ ### 4.2 Command Palette
283
+
284
+ - Trigger: `Cmd+K` (macOS) / `Ctrl+K` (Windows/Linux)
285
+ - Features: full-text search across resources, quick page navigation, recent items
286
+ - Implementation: `command-palette.jsx`
287
+
288
+ ### 4.3 Keyboard Shortcuts
289
+
290
+ - `?` — Show shortcut overlay
291
+ - `j/k` — Navigate items in lists
292
+ - `n` — New (context-dependent)
293
+ - `Escape` — Close modal/palette
294
+
295
+ ---
296
+
297
+ ## 5. Real-Time Updates
298
+
299
+ ### 5.1 LiveUpdates Component
300
+
301
+ ```jsx
302
+ // Connection lifecycle:
303
+ // 1. Connect to /api/orgs/:org/agents/events/stream
304
+ // 2. Receive {"type":"connected"} — mark as connected
305
+ // 3. Process {"type":"resource-change", kind, name, operation}
306
+ // 4. On disconnect: auto-reconnect with backoff
307
+ // 5. Receive {"type":"heartbeat"} every 30s — keepalive
308
+ ```
309
+
310
+ ### 5.2 SSE-Powered Components
311
+
312
+ | Component | SSE Usage |
313
+ |-----------|-----------|
314
+ | KanbanInteractive | Live card movement on issue/PR status changes |
315
+ | NotificationBell | Real-time unread count updates |
316
+ | ActivityFeed | New events prepended |
317
+ | SessionShell | Live transcript streaming |
318
+ | HealthMonitor | Connection status indicator |
319
+
320
+ ---
321
+
322
+ ## 6. Theme System
323
+
324
+ ### 6.1 Implementation
325
+
326
+ - CSS custom properties for all colors
327
+ - Two theme sets: `light` and `dark`
328
+ - Applied via `data-theme` attribute on `<html>`
329
+ - ThemeRuntime component manages state
330
+
331
+ ### 6.2 Persistence
332
+
333
+ ```javascript
334
+ // Read: localStorage.getItem('kradle-theme')
335
+ // Write: localStorage.setItem('kradle-theme', theme)
336
+ // Default: window.matchMedia('(prefers-color-scheme: dark)').matches
337
+ // Auto-update: mediaQuery.addEventListener('change', handler)
338
+ ```
339
+
340
+ ---
341
+
342
+ ## 7. Form Patterns
343
+
344
+ ### 7.1 Multi-Step Forms
345
+
346
+ | Form | Steps | Source |
347
+ |------|-------|--------|
348
+ | StackBuilder | Model → Provider → Transport → Tools → Skills → Review | `stack-builder.jsx` |
349
+ | ExternalProviderWizard | Type → Credentials → Scope → Confirm | `external-provider-wizard.jsx` |
350
+ | TriggerRuleForm | Source Type → Config → Stack Selection → Review | `trigger-rule-form.jsx` |
351
+
352
+ ### 7.2 Error Handling
353
+
354
+ - Inline field errors below inputs
355
+ - Toast notifications for operation failures (auto-dismiss)
356
+ - Error boundary component (`error.jsx`) for unhandled errors
357
+ - Form-level validation before submission
358
+
359
+ ### 7.3 Loading States
360
+
361
+ - `KradleLoading` spinner for full-page loads
362
+ - Disabled buttons with spinner during submission
363
+ - Skeleton loading for list views
364
+ - Optimistic updates on create/edit (revert on failure)
365
+
366
+ ---
367
+
368
+ ## 8. Authentication Flow (Web)
369
+
370
+ ### 8.1 Login Flow
371
+
372
+ ```
373
+ /login → Click provider → /api/auth/[provider]
374
+ → 302 to OAuth provider
375
+ → User authorizes
376
+ → /api/auth/callback/[provider]?code=...
377
+ → Exchange code → Create session cookie
378
+ → 302 to /orgs/[org]
379
+ ```
380
+
381
+ ### 8.2 Session Validation
382
+
383
+ - Cookie `kradle_session` sent on every request
384
+ - Web API routes verify via `parseSessionCookie()`
385
+ - Invalid sessions: redirect to `/login`
386
+ - Logout: clear cookie with `Max-Age=0`, redirect to `/login`
387
+
388
+ ---
389
+
390
+ ## 9. Error Page
391
+
392
+ Source: `packages/kradle/web/app/error.jsx`
393
+
394
+ - React Error Boundary component
395
+ - Displays error message and stack trace (dev mode)
396
+ - "Try Again" button to reset error state
397
+ - Falls back to minimal UI on catastrophic failure
398
+
399
+
400
+ ---
401
+
402
+ ## ML Navigation Group
403
+
404
+ ### Inference Service List
405
+
406
+ **Route:** `/orgs/{org}/inference/services`
407
+
408
+ **Components:**
409
+ - Service table: name, model format badge, inference protocol, phase badge (Pending/Ready/Failed), endpoint URL
410
+ - Create button opens an inline form
411
+
412
+ **Actions:** Create service, delete (confirmation dialog)
413
+
414
+ **Data source:** `GET /api/orgs/{org}/inference/services`
415
+
416
+ ### Inference Service Detail
417
+
418
+ **Route:** `/orgs/{org}/inference/services/{name}`
419
+
420
+ **Sections:**
421
+ - Spec viewer: predictor model config (modelFormat, storageUri, protocolVersion), resource limits/requests
422
+ - Status panel: phase, endpoint URL, conditions timeline, error message
423
+ - Test panel: send inference request (JSON input editor -> response panel), protocol selector (V1/V2)
424
+
425
+ **Data source:** `GET /api/orgs/{org}/inference/services/{name}`
426
+
427
+ ### Inference Test Panel
428
+
429
+ Embedded within service detail. Sends `POST /api/orgs/{org}/inference/services/{name}/infer`.
430
+
431
+ - Input: JSON editor with schema hint for the selected model format
432
+ - Output: formatted JSON response panel
433
+ - Protocol toggle: V1 / V2
434
+ - Response time display
435
+
436
+ ### Serving Runtime Manager
437
+
438
+ **Route:** `/orgs/{org}/inference/runtimes`
439
+
440
+ **Components:**
441
+ - Runtime table: name, supported model formats (comma-separated), container image
442
+ - Create runtime button and form
443
+
444
+ **Data source:** `GET /api/orgs/{org}/inference/runtimes`
445
+
446
+ ---
447
+
448
+ ## Artifacts Navigation Group
449
+
450
+ ### Registry List
451
+
452
+ **Route:** `/orgs/{org}/artifacts/registries`
453
+
454
+ **Components:**
455
+ - Registry cards: name, type badge (npm/pip/docker/generic), storage backend, feed count
456
+ - Create registry button and modal form
457
+
458
+ **Data source:** `GET /api/orgs/{org}/artifacts/registries`
459
+
460
+ ### Feed Browser
461
+
462
+ **Route:** `/orgs/{org}/artifacts/registries/{registry}/feeds`
463
+
464
+ **Components:**
465
+ - Feed list: name, visibility badge (public/private), version count, install command code snippet
466
+ - Create feed button, manage access policies button
467
+
468
+ **Data source:** `GET /api/orgs/{org}/artifacts/feeds`
469
+
470
+ ### Version Table
471
+
472
+ **Route:** `/orgs/{org}/artifacts/registries/{registry}/feeds/{feed}`
473
+
474
+ **Components:**
475
+ - Paginated version table: package name, version, size (human-readable), publishedBy, publishedAt, checksum (truncated SHA-256)
476
+ - Publish version button (file upload + metadata form)
477
+ - Download button per version
478
+
479
+ **Data source:** `GET /api/orgs/{org}/artifacts/feeds/{feed}/versions`
480
+
481
+ ### Access Policies
482
+
483
+ Embedded as a tab within feed detail.
484
+
485
+ - Table: subject, permission badge (read/write/admin), expiresAt
486
+ - Add policy form, revoke button per entry
487
+
488
+ ---
489
+
490
+ ## Assistant Navigation Group
491
+
492
+ ### Chat Interface
493
+
494
+ **Route:** `/orgs/{org}/assistant`
495
+
496
+ **Components:**
497
+ - Session sidebar: scrollable list of sessions (org:sessionId), new session button, session delete button
498
+ - Chat panel: message thread with user/assistant bubbles, SSE streaming renders chunks in real time
499
+ - Input bar: expandable textarea, send button, model selector dropdown
500
+
501
+ **Data source:**
502
+ - `POST /api/orgs/{org}/assistant/chat` (SSE stream)
503
+ - `GET /api/orgs/{org}/assistant/sessions` (session list)
504
+
505
+ ### Generation Form
506
+
507
+ **Route:** `/orgs/{org}/assistant/generate`
508
+
509
+ **Components:**
510
+ - Prompt textarea
511
+ - Optional JSON schema editor (collapsible)
512
+ - Generate button
513
+ - Response viewer: formatted JSON when schema provided, markdown otherwise
514
+
515
+ **Data source:** `POST /api/orgs/{org}/assistant/generate`
516
+
517
+ ### Session Sidebar
518
+
519
+ Embedded in the chat interface. Lists all sessions for the current org. Clicking a session loads its message history. Delete button calls `DELETE /api/orgs/{org}/assistant/sessions/{sessionId}` and clears the thread.
520
+
521
+ ---
522
+
523
+ ## Updated Navigation Structure
524
+
525
+ | Group | Routes |
526
+ |-------|--------|
527
+ | Repositories | `/repos`, `/repos/{name}/*` |
528
+ | Agents | `/agents`, `/agents/stacks`, `/agents/runs`, `/agents/memory` |
529
+ | **ML** | `/inference/services`, `/inference/runtimes` |
530
+ | **Artifacts** | `/artifacts/registries`, feeds, versions |
531
+ | **Assistant** | `/assistant`, `/assistant/generate` |
532
+ | Policy | `/policies`, `/policy-exceptions` |
533
+ | Settings | `/settings/*` |