@a5c-ai/krate 5.0.1-staging.660d2b90f → 5.0.1-staging.69cb593ea

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 (118) hide show
  1. package/Dockerfile +31 -29
  2. package/bin/krate-demo.mjs +0 -0
  3. package/bin/krate-server.mjs +0 -0
  4. package/dist/krate-controller-ui.json +808 -10
  5. package/dist/krate-lifecycle.json +1 -1
  6. package/dist/krate-runtime-snapshot.json +223 -53
  7. package/dist/krate-summary.json +40 -3
  8. package/docs/agents/gaps-agent-mux-to-krate-crds.md +298 -0
  9. package/docs/architecture-v2.md +431 -0
  10. package/docs/openapi.yaml +1275 -0
  11. package/docs/requirements-v2.md +238 -0
  12. package/docs/sdk-api-reference.md +782 -0
  13. package/docs/system-spec-v2.md +352 -0
  14. package/docs/todos.md +4 -0
  15. package/docs/web-console-spec.md +433 -0
  16. package/package.json +1 -1
  17. package/scripts/validate-ui.mjs +305 -207
  18. package/src/agent-adapter-controller.js +169 -0
  19. package/src/agent-approval-controller.js +47 -0
  20. package/src/agent-dispatch-controller.js +130 -7
  21. package/src/agent-gateway-config-controller.js +147 -0
  22. package/src/agent-memory-controller.js +357 -0
  23. package/src/agent-memory-import.js +327 -0
  24. package/src/agent-memory-query.js +292 -0
  25. package/src/agent-memory-repository-source-controller.js +255 -0
  26. package/src/agent-mux-client.js +1 -1
  27. package/src/agent-permission-review.js +102 -14
  28. package/src/agent-project-controller.js +117 -0
  29. package/src/agent-provider-config-controller.js +150 -0
  30. package/src/agent-secret-config-grant-controller.js +282 -0
  31. package/src/agent-session-transcript-controller.js +189 -0
  32. package/src/agent-stack-controller.js +52 -1
  33. package/src/agent-subagent-controller.js +160 -0
  34. package/src/agent-transport-binding-controller.js +121 -0
  35. package/src/agent-trigger-controller.js +273 -0
  36. package/src/agent-workspace-controller.js +702 -0
  37. package/src/agent-writeback-controller.js +302 -0
  38. package/src/api-controller.js +338 -3
  39. package/src/async-controller.js +207 -0
  40. package/src/audit-controller.js +191 -0
  41. package/src/auth.js +48 -6
  42. package/src/controller-client.js +112 -38
  43. package/src/controller-ui.js +96 -16
  44. package/src/data-plane.js +3 -2
  45. package/src/event-bus.js +61 -0
  46. package/src/external/conflict-controller.js +225 -0
  47. package/src/external/github/auth.js +96 -0
  48. package/src/external/github/cicd.js +180 -0
  49. package/src/external/github/git-forge.js +240 -0
  50. package/src/external/github/index.js +144 -0
  51. package/src/external/github/issue-tracking.js +163 -0
  52. package/src/external/provider-adapter.js +161 -0
  53. package/src/external/provider-resource-factory.js +161 -0
  54. package/src/external/sync-controller.js +235 -0
  55. package/src/external/webhook-controller.js +144 -0
  56. package/src/external/write-controller.js +283 -0
  57. package/src/gitea-backend.js +36 -0
  58. package/src/gitea-service.js +173 -0
  59. package/src/http-server.js +226 -0
  60. package/src/index.js +27 -0
  61. package/src/kubernetes-controller-async.js +531 -0
  62. package/src/kubernetes-controller.js +156 -84
  63. package/src/notification-controller.js +178 -0
  64. package/src/org-scoping.js +5 -0
  65. package/src/resource-model.js +26 -8
  66. package/src/runner-controller.js +272 -0
  67. package/src/snapshot-cache.js +157 -0
  68. package/tests/agent-adapter-controller.test.js +361 -0
  69. package/tests/agent-dispatch-controller.test.js +139 -0
  70. package/tests/agent-gateway-config-controller.test.js +386 -0
  71. package/tests/agent-memory-controller.test.js +308 -0
  72. package/tests/agent-memory-import-snapshot.test.js +477 -0
  73. package/tests/agent-memory-query.test.js +404 -0
  74. package/tests/agent-memory-repository-source.test.js +514 -0
  75. package/tests/agent-permission-review-v2.test.js +317 -0
  76. package/tests/agent-project-controller.test.js +302 -0
  77. package/tests/agent-provider-config-controller.test.js +376 -0
  78. package/tests/agent-resources.test.js +35 -19
  79. package/tests/agent-secret-config-grant.test.js +231 -0
  80. package/tests/agent-session-transcript-controller.test.js +499 -0
  81. package/tests/agent-subagent-controller.test.js +201 -0
  82. package/tests/agent-transport-binding-controller.test.js +294 -0
  83. package/tests/agent-trigger-routes.test.js +190 -0
  84. package/tests/agent-trigger-sources.test.js +245 -0
  85. package/tests/agent-workspace-controller.test.js +181 -0
  86. package/tests/agent-writeback.test.js +292 -0
  87. package/tests/approval-persistence.test.js +171 -0
  88. package/tests/async-controller.test.js +252 -0
  89. package/tests/audit-controller.test.js +227 -0
  90. package/tests/codespace-controller.test.js +318 -0
  91. package/tests/controller-client.test.js +133 -0
  92. package/tests/deployment.test.js +43 -29
  93. package/tests/e2e/lifecycle.test.js +5 -2
  94. package/tests/event-bus-integration.test.js +190 -0
  95. package/tests/external-github-forge.test.js +560 -0
  96. package/tests/external-github-issues-cicd.test.js +520 -0
  97. package/tests/external-integration.test.js +470 -0
  98. package/tests/external-persistence.test.js +340 -0
  99. package/tests/external-provider-adapter.test.js +365 -0
  100. package/tests/external-resource-model.test.js +215 -0
  101. package/tests/external-webhook-sync.test.js +287 -0
  102. package/tests/external-write-conflict.test.js +353 -0
  103. package/tests/gitea-service.test.js +253 -0
  104. package/tests/health-check-real.test.js +165 -0
  105. package/tests/integration/full-flow.test.js +266 -0
  106. package/tests/krate.test.js +58 -6
  107. package/tests/memory-search-wiring.test.js +270 -0
  108. package/tests/notification-controller.test.js +196 -0
  109. package/tests/notification-integration.test.js +179 -0
  110. package/tests/org-scoping.test.js +687 -0
  111. package/tests/runner-controller.test.js +327 -0
  112. package/tests/runner-integration.test.js +231 -0
  113. package/tests/session-cookie-hmac.test.js +151 -0
  114. package/tests/snapshot-performance.test.js +315 -0
  115. package/tests/sse-events.test.js +107 -0
  116. package/tests/webhook-trigger.test.js +198 -0
  117. package/tests/workspace-volumes.test.js +312 -0
  118. package/tests/writeback-persistence.test.js +207 -0
@@ -0,0 +1,433 @@
1
+ # Krate Web Console Specification
2
+
3
+ > Derived from implementation. Source: `packages/krate/web/`
4
+
5
+ ## 1. Page Inventory
6
+
7
+ Framework: Next.js 16 + React 19 (App Router)
8
+ Base path: `packages/krate/web/app/`
9
+
10
+ ### Top-Level Pages
11
+
12
+ | Route | File | Purpose |
13
+ |-------|------|---------|
14
+ | `/` | `page.jsx` | Landing/home page |
15
+ | `/login` | `login/page.jsx` | Authentication login |
16
+ | `/logout` | `logout/page.jsx` | Session logout |
17
+ | `/orgs` | `orgs/page.jsx` | Organization list |
18
+ | `/people` | `people/page.jsx` | People directory |
19
+
20
+ ### Organization Dashboard
21
+
22
+ | Route | File | Purpose |
23
+ |-------|------|---------|
24
+ | `/orgs/[org]` | `orgs/[org]/page.jsx` | Org dashboard overview |
25
+ | `/orgs/[org]/profile` | `orgs/[org]/profile/page.jsx` | User profile |
26
+ | `/orgs/[org]/people` | `orgs/[org]/people/page.jsx` | Org members |
27
+ | `/orgs/[org]/inbox` | `orgs/[org]/inbox/page.jsx` | Notification inbox |
28
+ | `/orgs/[org]/insights` | `orgs/[org]/insights/page.jsx` | Analytics and insights |
29
+
30
+ ### Ship (Repositories & Code)
31
+
32
+ | Route | File | Purpose |
33
+ |-------|------|---------|
34
+ | `/orgs/[org]/repositories` | `orgs/[org]/repositories/page.jsx` | Repository list |
35
+ | `/orgs/[org]/repositories/[repo]/code` | `repositories/[repo]/code/page.jsx` | Code browser |
36
+ | `/orgs/[org]/repositories/[repo]/pull-requests` | `repositories/[repo]/pull-requests/page.jsx` | PR list |
37
+ | `/orgs/[org]/repositories/[repo]/issues` | `repositories/[repo]/issues/page.jsx` | Issue list |
38
+ | `/orgs/[org]/repositories/[repo]/issues/[issue]` | `repositories/[repo]/issues/[issue]/page.jsx` | Issue detail |
39
+ | `/orgs/[org]/repositories/[repo]/hooks` | `repositories/[repo]/hooks/page.jsx` | Webhook config |
40
+ | `/orgs/[org]/repositories/[repo]/runs` | `repositories/[repo]/runs/page.jsx` | Repo agent runs |
41
+ | `/orgs/[org]/repositories/[repo]/settings` | `repositories/[repo]/settings/page.jsx` | Repo settings |
42
+ | `/orgs/[org]/runs` | `orgs/[org]/runs/page.jsx` | All runs overview |
43
+
44
+ ### Manage (Access & Policy)
45
+
46
+ | Route | File | Purpose |
47
+ |-------|------|---------|
48
+ | `/orgs/[org]/access/permissions` | `access/permissions/page.jsx` | Permission management |
49
+ | `/orgs/[org]/access/ssh-keys` | `access/ssh-keys/page.jsx` | SSH key management |
50
+ | `/orgs/[org]/access/branch-protection` | `access/branch-protection/page.jsx` | Branch rules |
51
+ | `/orgs/[org]/settings` | `orgs/[org]/settings/page.jsx` | Org settings |
52
+ | `/orgs/[org]/settings/secrets` | `settings/secrets/page.jsx` | Secret management |
53
+ | `/orgs/[org]/hooks-events` | `orgs/[org]/hooks-events/page.jsx` | Webhook events |
54
+ | `/orgs/[org]/deployments` | `orgs/[org]/deployments/page.jsx` | Deployments |
55
+ | `/orgs/[org]/runners-ci` | `orgs/[org]/runners-ci/page.jsx` | Runner pools & CI |
56
+
57
+ ### Agents
58
+
59
+ | Route | File | Purpose |
60
+ |-------|------|---------|
61
+ | `/orgs/[org]/agents` | `agents/page.jsx` | Agent overview |
62
+ | `/orgs/[org]/agents/stacks` | `agents/stacks/page.jsx` | Stack list |
63
+ | `/orgs/[org]/agents/stacks/new` | `agents/stacks/new/page.jsx` | Create stack |
64
+ | `/orgs/[org]/agents/stacks/[name]` | `agents/stacks/[name]/page.jsx` | Stack detail |
65
+ | `/orgs/[org]/agents/runs` | `agents/runs/page.jsx` | Dispatch run list |
66
+ | `/orgs/[org]/agents/runs/[runId]` | `agents/runs/[runId]/page.jsx` | Run detail |
67
+ | `/orgs/[org]/agents/sessions` | `agents/sessions/page.jsx` | Session list |
68
+ | `/orgs/[org]/agents/sessions/[sessionId]` | `agents/sessions/[sessionId]/page.jsx` | Session detail |
69
+ | `/orgs/[org]/agents/rules` | `agents/rules/page.jsx` | Trigger rule list |
70
+ | `/orgs/[org]/agents/rules/new` | `agents/rules/new/page.jsx` | Create trigger rule |
71
+ | `/orgs/[org]/agents/rules/[ruleName]` | `agents/rules/[ruleName]/page.jsx` | Rule detail |
72
+ | `/orgs/[org]/agents/approvals` | `agents/approvals/page.jsx` | Approval queue |
73
+ | `/orgs/[org]/agents/workspaces` | `agents/workspaces/page.jsx` | Workspace list |
74
+ | `/orgs/[org]/agents/workspaces/[workspaceId]` | `agents/workspaces/[workspaceId]/page.jsx` | Workspace detail |
75
+ | `/orgs/[org]/agents/settings` | `agents/settings/page.jsx` | Agent settings |
76
+ | `/orgs/[org]/agents/projects` | `agents/projects/page.jsx` | Project list |
77
+ | `/orgs/[org]/agents/projects/[projectId]` | `agents/projects/[projectId]/page.jsx` | Project detail |
78
+ | `/orgs/[org]/agents/projects/[projectId]/issues` | `projects/[projectId]/issues/page.jsx` | Project issues |
79
+ | `/orgs/[org]/agents/projects/[projectId]/issues/[issue]` | `projects/[projectId]/issues/[issue]/page.jsx` | Project issue detail |
80
+ | `/orgs/[org]/agents/memory` | `agents/memory/page.jsx` | Memory overview |
81
+ | `/orgs/[org]/agents/memory/search` | `agents/memory/search/page.jsx` | Memory search |
82
+ | `/orgs/[org]/agents/memory/ontology` | `agents/memory/ontology/page.jsx` | Ontology editor |
83
+ | `/orgs/[org]/agents/memory/imports` | `agents/memory/imports/page.jsx` | Import list |
84
+ | `/orgs/[org]/agents/memory/imports/[importId]` | `agents/memory/imports/[importId]/page.jsx` | Import detail |
85
+
86
+ ### External
87
+
88
+ | Route | File | Purpose |
89
+ |-------|------|---------|
90
+ | `/orgs/[org]/external` | `orgs/[org]/external/page.jsx` | External overview |
91
+ | `/orgs/[org]/external/providers/new` | `external/providers/new/page.jsx` | Add provider |
92
+ | `/orgs/[org]/external/sync` | `external/sync/page.jsx` | Sync dashboard |
93
+ | `/orgs/[org]/external/conflicts` | `external/conflicts/page.jsx` | Conflict list |
94
+
95
+ ### Observe & Tools
96
+
97
+ | Route | File | Purpose |
98
+ |-------|------|---------|
99
+ | `/orgs/[org]/api-docs` | `orgs/[org]/api-docs/page.jsx` | API documentation |
100
+ | `/orgs/[org]/controller-api` | `orgs/[org]/controller-api/page.jsx` | Controller API explorer |
101
+ | `/orgs/[org]/advanced-plans` | `orgs/[org]/advanced-plans/page.jsx` | Advanced plans |
102
+ | `/orgs/[org]/operations-install` | `orgs/[org]/operations-install/page.jsx` | Operations install guide |
103
+
104
+ **Total: 57 pages**
105
+
106
+ ---
107
+
108
+ ## 2. Component Library
109
+
110
+ Source: `packages/krate/web/app/components/`
111
+
112
+ | Component | File | Purpose |
113
+ |-----------|------|---------|
114
+ | ActivityFeed | `activity-feed.jsx` | Real-time activity stream with time-grouped entries |
115
+ | AgentSettingsForm | `agent-settings-form.jsx` | Agent configuration form (adapters, providers, gateway) |
116
+ | ApiExplorer | `api-explorer.jsx` | Interactive API testing interface |
117
+ | AppSettings | `app-settings.jsx` | Application-level settings panel |
118
+ | ApprovalActions | `approval-actions.jsx` | Approve/deny action buttons for agent gates |
119
+ | ApprovalModeToggle | `approval-mode-toggle.jsx` | Toggle between approval modes |
120
+ | CodeEditor | `code-editor.jsx` | Syntax-highlighted code editor |
121
+ | CommandPalette | `command-palette.jsx` | Global command palette (Cmd+K) with search |
122
+ | DeploymentPipeline | `deployment-pipeline.jsx` | Visual pipeline progress display |
123
+ | DispatchButton | `dispatch-button.jsx` | One-click agent dispatch trigger |
124
+ | ExternalConflictResolver | `external-conflict-resolver.jsx` | Side-by-side conflict resolution UI |
125
+ | ExternalProviderList | `external-provider-list.jsx` | Provider listing with status indicators |
126
+ | ExternalProviderWizard | `external-provider-wizard.jsx` | Multi-step provider setup wizard |
127
+ | ExternalSyncDashboard | `external-sync-dashboard.jsx` | Sync status overview with metrics |
128
+ | GlobalSearch | `global-search.jsx` | Full-text search across all resources |
129
+ | HealthMonitor | `health-monitor.jsx` | System health indicators and status |
130
+ | IssueEditor | `issue-editor.jsx` | Rich issue create/edit form |
131
+ | IssueList | `issue-list.jsx` | Filterable issue list view |
132
+ | KanbanCard | `kanban-card.jsx` | Draggable card for kanban board |
133
+ | KanbanColumn | `kanban-column.jsx` | Drop target column for kanban |
134
+ | KanbanEnhanced | `kanban-enhanced.jsx` | Full kanban board with drag-drop |
135
+ | KanbanFilters | `kanban-filters.jsx` | Filter bar for kanban views |
136
+ | KanbanInteractive | `kanban-interactive.jsx` | Interactive kanban with real-time updates |
137
+ | KeyboardShortcuts | `keyboard-shortcuts.jsx` | Keyboard shortcut overlay/help |
138
+ | KrateLoading | `krate-loading.jsx` | Branded loading spinner |
139
+ | LiveUpdates | `live-updates.jsx` | SSE-powered live data refresh |
140
+ | MemoryImportReview | `memory-import-review.jsx` | Review and approve memory imports |
141
+ | MemoryOntologyEditor | `memory-ontology-editor.jsx` | Visual ontology editor |
142
+ | MemorySearchForm | `memory-search-form.jsx` | Graph/grep query builder |
143
+ | NotificationBell | `notification-bell.jsx` | Bell icon with unread count badge |
144
+ | PullRequestList | `pull-request-list.jsx` | PR list with status indicators |
145
+ | RepoCodeBrowser | `repo-code-browser.jsx` | File tree + content viewer |
146
+ | RepoRuns | `repo-runs.jsx` | Repository-scoped run list |
147
+ | ResourceActions | `resource-actions.jsx` | Edit/delete/view action menu |
148
+ | ResourceCrudActions | `resource-crud-actions.jsx` | Full CRUD operation buttons |
149
+ | RuleActions | `rule-actions.jsx` | Trigger rule action buttons |
150
+ | RunActions | `run-actions.jsx` | Dispatch run action buttons |
151
+ | RunnerPoolManager | `runner-pool-manager.jsx` | Pool sizing and configuration |
152
+ | SecretManager | `secret-manager.jsx` | Secret CRUD with masked values |
153
+ | SessionCost | `session-cost.jsx` | Token/cost display for sessions |
154
+ | SessionShell | `session-shell.jsx` | Terminal-style session viewer |
155
+ | SessionTabs | `session-tabs.jsx` | Tabbed session detail view |
156
+ | SettingsAdapters | `settings-adapters.jsx` | Adapter configuration panel |
157
+ | SettingsGateway | `settings-gateway.jsx` | Gateway configuration panel |
158
+ | SettingsProviders | `settings-providers.jsx` | Provider configuration panel |
159
+ | StackActions | `stack-actions.jsx` | Stack management action buttons |
160
+ | StackBuilder | `stack-builder.jsx` | Visual agent stack builder |
161
+ | StackBuilderGraph | `stack-builder-graph.jsx` | Graph visualization for stack composition |
162
+ | ThemeRuntime | `theme-runtime.jsx` | Dark/light theme toggle and persistence |
163
+ | ToolInspector | `tool-inspector.jsx` | MCP tool inspection panel |
164
+ | TriggerRuleForm | `trigger-rule-form.jsx` | Trigger rule creation/edit form |
165
+ | UserProfile | `user-profile.jsx` | User profile display and edit |
166
+ | WebhookManager | `webhook-manager.jsx` | Webhook subscription management |
167
+ | WorkspaceAssociations | `workspace-associations.jsx` | Work item link management |
168
+ | WorkspaceCodespace | `workspace-codespace.jsx` | Live codespace interface |
169
+ | WorkspacePanel | `workspace-panel.jsx` | Workspace overview panel |
170
+ | WorkspaceRunHistory | `workspace-run-history.jsx` | Historical runs for workspace |
171
+
172
+ **Total: 56 components**
173
+
174
+ ---
175
+
176
+ ## 3. Navigation Architecture
177
+
178
+ ### Navigation Groups
179
+
180
+ | Group | Icon | Pages |
181
+ |-------|------|-------|
182
+ | **Ship** | Code | Repositories, Pull Requests, Issues, Code |
183
+ | **Manage** | Settings | Permissions, SSH Keys, Branch Protection, Settings, Deployments, Runners |
184
+ | **Agents** | Bot | Stacks, Runs, Sessions, Rules, Approvals, Workspaces, Projects, Memory |
185
+ | **Observe** | Eye | Hooks & Events, Insights, Inbox, Health |
186
+ | **External** | Link | Providers, Sync, Conflicts |
187
+
188
+ ### Command Palette (Cmd+K)
189
+
190
+ Source: `command-palette.jsx`
191
+
192
+ - Global keyboard shortcut: `Cmd+K` (macOS) / `Ctrl+K` (Windows/Linux)
193
+ - Full-text search across all resources
194
+ - Quick navigation to any page
195
+ - Recent items history
196
+
197
+ ### Keyboard Shortcuts
198
+
199
+ Source: `keyboard-shortcuts.jsx`
200
+
201
+ - Navigation shortcuts for major sections
202
+ - Action shortcuts (new, edit, delete)
203
+ - Modal shortcuts (close, confirm)
204
+ - `?` to show shortcut overlay
205
+
206
+ ---
207
+
208
+ ## 4. UI Patterns
209
+
210
+ ### PageFrame Layout
211
+
212
+ Standard page layout with:
213
+ - Sidebar navigation (collapsible)
214
+ - Header with org selector, search, notification bell
215
+ - Main content area
216
+ - Breadcrumb navigation
217
+
218
+ ### EmptyState
219
+
220
+ Used when a resource list has no items:
221
+ - Illustration/icon
222
+ - Title and description
223
+ - Primary CTA button (e.g., "Create Stack")
224
+ - Secondary action link
225
+
226
+ ### StatusPill
227
+
228
+ Tone-based status indicators:
229
+
230
+ | Tone | Color | Used For |
231
+ |------|-------|----------|
232
+ | success | Green | Running, Healthy, Approved |
233
+ | warning | Amber | Pending, Degraded |
234
+ | error | Red | Failed, Denied, Conflict |
235
+ | info | Blue | In Progress, Syncing |
236
+ | neutral | Gray | Unknown, Inactive |
237
+
238
+ ### InlineCreateForm
239
+
240
+ Quick resource creation without navigating away:
241
+ - Collapsible form below list header
242
+ - Minimal required fields
243
+ - Auto-focus on first field
244
+ - Cancel/Create buttons
245
+
246
+ ### ResourceActions
247
+
248
+ Contextual action menu per resource:
249
+ - View (navigate to detail)
250
+ - Edit (inline or modal)
251
+ - Delete (with confirmation dialog)
252
+ - Custom actions per resource kind
253
+
254
+ ---
255
+
256
+ ## 5. Data Flow
257
+
258
+ ### Fetch Pipeline
259
+
260
+ ```
261
+ Page Component
262
+ → loadKrateUi() / fetchControllerUiModel()
263
+ → HTTP GET /api/controller?org=<org>
264
+ → createControllerUiModel(snapshot, { organization })
265
+ → Stale-while-revalidate cache (30s)
266
+ → Render with data
267
+ ```
268
+
269
+ Source: `packages/krate/core/src/controller-client.js`, `controller-ui.js`
270
+
271
+ ### Controller UI Model
272
+
273
+ `createControllerUiModel(snapshot, options)` produces:
274
+ - `orgs` — Organization list
275
+ - `repositories` — Repository list with stats
276
+ - `pullRequests` — Open PRs with review status
277
+ - `pipelines` — Recent pipeline runs
278
+ - `agents` — Stacks, runs, sessions
279
+ - `memory` — Memory repositories and queries
280
+
281
+ ### API Proxy Routes
282
+
283
+ Source: `packages/krate/web/app/api/`
284
+
285
+ | Route | Target |
286
+ |-------|--------|
287
+ | `/api/orgs` | Krate API `/api/orgs` |
288
+ | `/api/orgs/[org]/repositories` | Resource CRUD |
289
+ | `/api/auth/[provider]` | OAuth redirect |
290
+ | `/api/auth/callback/[provider]` | OAuth callback |
291
+ | `/api/auth/logout` | Session destruction |
292
+ | `/api/auth/delegated` | Delegated identity |
293
+ | `/api/atlas/search` | Atlas graph search |
294
+ | `/api/git-proxy` | Gitea tree/blob proxy |
295
+ | `/api/watch/[...resource]` | SSE watch endpoint |
296
+
297
+ ---
298
+
299
+ ## 6. Dark Mode
300
+
301
+ Source: `theme-runtime.jsx`
302
+
303
+ ### Implementation
304
+
305
+ - CSS custom properties (variables) for all colors
306
+ - Two theme sets: `light` and `dark`
307
+ - Applied via `data-theme` attribute on `<html>`
308
+
309
+ ### Persistence
310
+
311
+ - User preference stored in `localStorage` key `krate-theme`
312
+ - Initial value: system preference via `prefers-color-scheme` media query
313
+ - Toggle available in header/settings
314
+
315
+ ### System Preference Detection
316
+
317
+ ```javascript
318
+ window.matchMedia('(prefers-color-scheme: dark)').matches
319
+ ```
320
+
321
+ Listens for changes and auto-updates when no explicit preference set.
322
+
323
+ ---
324
+
325
+ ## 7. Authentication Flow
326
+
327
+ ### Login Flow
328
+
329
+ ```
330
+ User → /login page
331
+ → Select provider (GitHub / SSO)
332
+ → Redirect to /api/auth/[provider]
333
+ → OAuth authorization URL
334
+ → Provider callback → /api/auth/callback/[provider]
335
+ → Exchange code for profile
336
+ → Create session cookie (HMAC-signed)
337
+ → Redirect to /orgs/[org]
338
+ ```
339
+
340
+ ### Session Validation
341
+
342
+ - Cookie `krate_session` parsed on each request
343
+ - HMAC signature verified with `KRATE_SESSION_SECRET`
344
+ - Invalid/expired sessions redirect to `/login`
345
+
346
+ ### Protected Routes
347
+
348
+ All mutating operations check session validity. Read operations are generally unprotected for API simplicity (auth enforced at Krate API level).
349
+
350
+ ### Logout
351
+
352
+ ```
353
+ User → /logout
354
+ → /api/auth/logout
355
+ → Clear cookie (Max-Age=0)
356
+ → Redirect to /login
357
+ ```
358
+
359
+ ---
360
+
361
+ ## 8. Real-time Updates
362
+
363
+ ### SSE LiveUpdates Component
364
+
365
+ Source: `live-updates.jsx`
366
+
367
+ - Connects to `/api/orgs/:org/agents/events/stream`
368
+ - Receives JSON events via Server-Sent Events
369
+ - Auto-reconnects on disconnection
370
+ - Processes event types: `connected`, `heartbeat`, `resource-change`
371
+
372
+ ### Notification Bell
373
+
374
+ Source: `notification-bell.jsx`
375
+
376
+ - Badge showing unread notification count
377
+ - Dropdown panel with recent notifications
378
+ - Mark as read on click
379
+ - Links to relevant resource pages
380
+
381
+ ### Activity Feed
382
+
383
+ Source: `activity-feed.jsx`
384
+
385
+ - Time-grouped activity entries
386
+ - Resource change events (create, update, delete)
387
+ - Agent dispatch and completion events
388
+ - Filterable by resource kind
389
+
390
+ ### Health Monitor
391
+
392
+ Source: `health-monitor.jsx`
393
+
394
+ - System component status indicators
395
+ - MCP server health checks
396
+ - Kubernetes connection status
397
+ - SSE connection health
398
+
399
+ ---
400
+
401
+ ## 9. Form Patterns
402
+
403
+ ### Validation
404
+
405
+ - Required field indicators (asterisk)
406
+ - Format validation (email, URL, name patterns)
407
+ - Custom validators per resource kind
408
+ - Cross-field validation (e.g., date ranges)
409
+
410
+ ### Error Display
411
+
412
+ - Inline field errors below inputs
413
+ - Toast notifications for operation failures
414
+ - Error boundary component for unhandled errors (`error.jsx`)
415
+
416
+ ### Success Feedback
417
+
418
+ - Auto-dismiss success toast (3-5 seconds)
419
+ - Optimistic updates on create/edit
420
+ - Resource list auto-refresh after mutation
421
+
422
+ ### Loading States
423
+
424
+ - `KrateLoading` spinner component
425
+ - Skeleton loading for lists
426
+ - Disabled buttons during submission
427
+ - Progress indicators for long operations
428
+
429
+ ### Multi-Step Forms
430
+
431
+ - Stack builder (`stack-builder.jsx`) — multi-step agent configuration
432
+ - Provider wizard (`external-provider-wizard.jsx`) — guided provider setup
433
+ - Trigger rule form (`trigger-rule-form.jsx`) — conditional rule builder
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a5c-ai/krate",
3
- "version": "5.0.1-staging.660d2b90f",
3
+ "version": "5.0.1-staging.69cb593ea",
4
4
  "description": "a5c.ai Krate: Kubernetes-native forge runtime with Argo CD GitOps and Gitea-backed Git hosting.",
5
5
  "type": "module",
6
6
  "main": "./src/index.js",