@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.
- package/Dockerfile +31 -29
- package/bin/krate-demo.mjs +0 -0
- package/bin/krate-server.mjs +0 -0
- package/dist/krate-controller-ui.json +808 -10
- package/dist/krate-lifecycle.json +1 -1
- package/dist/krate-runtime-snapshot.json +223 -53
- package/dist/krate-summary.json +40 -3
- package/docs/agents/gaps-agent-mux-to-krate-crds.md +298 -0
- package/docs/architecture-v2.md +431 -0
- package/docs/openapi.yaml +1275 -0
- package/docs/requirements-v2.md +238 -0
- package/docs/sdk-api-reference.md +782 -0
- package/docs/system-spec-v2.md +352 -0
- package/docs/todos.md +4 -0
- package/docs/web-console-spec.md +433 -0
- package/package.json +1 -1
- package/scripts/validate-ui.mjs +305 -207
- package/src/agent-adapter-controller.js +169 -0
- package/src/agent-approval-controller.js +47 -0
- package/src/agent-dispatch-controller.js +130 -7
- package/src/agent-gateway-config-controller.js +147 -0
- package/src/agent-memory-controller.js +357 -0
- package/src/agent-memory-import.js +327 -0
- package/src/agent-memory-query.js +292 -0
- package/src/agent-memory-repository-source-controller.js +255 -0
- package/src/agent-mux-client.js +1 -1
- package/src/agent-permission-review.js +102 -14
- package/src/agent-project-controller.js +117 -0
- package/src/agent-provider-config-controller.js +150 -0
- package/src/agent-secret-config-grant-controller.js +282 -0
- package/src/agent-session-transcript-controller.js +189 -0
- package/src/agent-stack-controller.js +52 -1
- package/src/agent-subagent-controller.js +160 -0
- package/src/agent-transport-binding-controller.js +121 -0
- package/src/agent-trigger-controller.js +273 -0
- package/src/agent-workspace-controller.js +702 -0
- package/src/agent-writeback-controller.js +302 -0
- package/src/api-controller.js +338 -3
- package/src/async-controller.js +207 -0
- package/src/audit-controller.js +191 -0
- package/src/auth.js +48 -6
- package/src/controller-client.js +112 -38
- package/src/controller-ui.js +96 -16
- package/src/data-plane.js +3 -2
- package/src/event-bus.js +61 -0
- package/src/external/conflict-controller.js +225 -0
- package/src/external/github/auth.js +96 -0
- package/src/external/github/cicd.js +180 -0
- package/src/external/github/git-forge.js +240 -0
- package/src/external/github/index.js +144 -0
- package/src/external/github/issue-tracking.js +163 -0
- package/src/external/provider-adapter.js +161 -0
- package/src/external/provider-resource-factory.js +161 -0
- package/src/external/sync-controller.js +235 -0
- package/src/external/webhook-controller.js +144 -0
- package/src/external/write-controller.js +283 -0
- package/src/gitea-backend.js +36 -0
- package/src/gitea-service.js +173 -0
- package/src/http-server.js +226 -0
- package/src/index.js +27 -0
- package/src/kubernetes-controller-async.js +531 -0
- package/src/kubernetes-controller.js +156 -84
- package/src/notification-controller.js +178 -0
- package/src/org-scoping.js +5 -0
- package/src/resource-model.js +26 -8
- package/src/runner-controller.js +272 -0
- package/src/snapshot-cache.js +157 -0
- package/tests/agent-adapter-controller.test.js +361 -0
- package/tests/agent-dispatch-controller.test.js +139 -0
- package/tests/agent-gateway-config-controller.test.js +386 -0
- package/tests/agent-memory-controller.test.js +308 -0
- package/tests/agent-memory-import-snapshot.test.js +477 -0
- package/tests/agent-memory-query.test.js +404 -0
- package/tests/agent-memory-repository-source.test.js +514 -0
- package/tests/agent-permission-review-v2.test.js +317 -0
- package/tests/agent-project-controller.test.js +302 -0
- package/tests/agent-provider-config-controller.test.js +376 -0
- package/tests/agent-resources.test.js +35 -19
- package/tests/agent-secret-config-grant.test.js +231 -0
- package/tests/agent-session-transcript-controller.test.js +499 -0
- package/tests/agent-subagent-controller.test.js +201 -0
- package/tests/agent-transport-binding-controller.test.js +294 -0
- package/tests/agent-trigger-routes.test.js +190 -0
- package/tests/agent-trigger-sources.test.js +245 -0
- package/tests/agent-workspace-controller.test.js +181 -0
- package/tests/agent-writeback.test.js +292 -0
- package/tests/approval-persistence.test.js +171 -0
- package/tests/async-controller.test.js +252 -0
- package/tests/audit-controller.test.js +227 -0
- package/tests/codespace-controller.test.js +318 -0
- package/tests/controller-client.test.js +133 -0
- package/tests/deployment.test.js +43 -29
- package/tests/e2e/lifecycle.test.js +5 -2
- package/tests/event-bus-integration.test.js +190 -0
- package/tests/external-github-forge.test.js +560 -0
- package/tests/external-github-issues-cicd.test.js +520 -0
- package/tests/external-integration.test.js +470 -0
- package/tests/external-persistence.test.js +340 -0
- package/tests/external-provider-adapter.test.js +365 -0
- package/tests/external-resource-model.test.js +215 -0
- package/tests/external-webhook-sync.test.js +287 -0
- package/tests/external-write-conflict.test.js +353 -0
- package/tests/gitea-service.test.js +253 -0
- package/tests/health-check-real.test.js +165 -0
- package/tests/integration/full-flow.test.js +266 -0
- package/tests/krate.test.js +58 -6
- package/tests/memory-search-wiring.test.js +270 -0
- package/tests/notification-controller.test.js +196 -0
- package/tests/notification-integration.test.js +179 -0
- package/tests/org-scoping.test.js +687 -0
- package/tests/runner-controller.test.js +327 -0
- package/tests/runner-integration.test.js +231 -0
- package/tests/session-cookie-hmac.test.js +151 -0
- package/tests/snapshot-performance.test.js +315 -0
- package/tests/sse-events.test.js +107 -0
- package/tests/webhook-trigger.test.js +198 -0
- package/tests/workspace-volumes.test.js +312 -0
- 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.
|
|
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",
|