@alliance-droid/status-feedback-system 2.3.2 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,273 +1,275 @@
1
- # @alliance-droid/status-feedback-system
2
-
3
- Drop-in system status pages and user feedback components for SvelteKit apps.
4
-
5
- This is the **client package** — UI components that talk to a [status-feedback-admin](https://alliance.ghe.com/alliance/status-feedback-admin) backend via API. The admin app handles data storage, API key management, and the admin dashboard.
6
-
7
- ## Architecture
8
-
9
- ```
10
- ┌─────────────────────────┐ ┌──────────────────────────┐
11
- │ Your SvelteKit App │ │ status-feedback-admin │
12
- │ │ │ │
13
- │ ┌───────────────────┐ │ API │ ┌────────────────────┐ │
14
- │ │ StatusPage │──┼───────┼──│ /api/status │ │
15
- │ │ FeedbackButton │ │ │ │ /api/feedback │ │
16
- │ │ DevFeedback │ │ │ │ /api/incidents │ │
17
- │ │ FeedbackBoard │ │ │ │ /api/board │ │
18
- │ └───────────────────┘ │ │ └────────────────────┘ │
19
- │ │ │ │ │
20
- │ npm package │ │ MSSQL + Azure Blob │
21
- └─────────────────────────┘ └──────────────────────────┘
22
- ```
23
-
24
- ## Setup
25
-
26
- ### 1. Deploy the admin backend
27
-
28
- The admin app ([status-feedback-admin](https://alliance.ghe.com/alliance/status-feedback-admin)) provides the API, database, and admin dashboard. Deploy it first.
29
-
30
- Required env vars on the admin app:
31
- ```bash
32
- MSSQL_CONNECTION_STRING=Server=...;Initial Catalog=StatusFeedback;...
33
- SESSION_SECRET=your-secret
34
-
35
- # Optional — stores screenshots in Azure Blob Storage instead of base64 in DB
36
- AZURE_FEEDBACK_BLOB_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...
37
- AZURE_FEEDBACK_BLOB_CONTAINER=screenshots
38
- ```
39
-
40
- ### 2. Create a project and get an API key
41
-
42
- Log into the admin dashboard, create a project, and copy its API key (prefixed `sf_`).
43
-
44
- ### 3. Install the client package
45
-
46
- ```bash
47
- npm install @alliance-droid/status-feedback-system
48
- ```
49
-
50
- **Peer dependencies:** `svelte ^5.0.0`, `@alliance-droid/svelte-component-library >=1.0.0`
51
-
52
- ## Components
53
-
54
- ### StatusPage
55
-
56
- Full status page with systems, incidents, and uptime history bars. Supports **self-fetching** (provide `apiUrl` + `apiKey`) or **pass-through** (provide data directly).
57
-
58
- ```svelte
59
- <script>
60
- import { StatusPage } from '@alliance-droid/status-feedback-system';
61
- </script>
62
-
63
- <!-- Self-fetching mode -->
64
- <StatusPage
65
- projectName="My App"
66
- apiUrl="https://status-admin.example.com"
67
- apiKey="sf_abc123..."
68
- />
69
-
70
- <!-- Pass-through mode -->
71
- <StatusPage
72
- projectName="My App"
73
- systems={data.systems}
74
- incidents={data.incidents}
75
- statusHistory={data.statusHistory}
76
- showUptime={true}
77
- />
78
- ```
79
-
80
- | Prop | Type | Default | Description |
81
- |------|------|---------|-------------|
82
- | `projectName` | `string` | required | Display name in the header |
83
- | `apiUrl` | `string` | — | Admin backend URL (self-fetching mode) |
84
- | `apiKey` | `string` | — | Project API key (self-fetching mode) |
85
- | `systems` | `System[]` | — | Pass-through: system data |
86
- | `incidents` | `Incident[]` | — | Pass-through: incident data |
87
- | `statusHistory` | `Record<string, StatusHistoryEntry[]>` | — | Pass-through: uptime data |
88
- | `showUptime` | `boolean` | `true` | Show 90-day uptime bars |
89
-
90
- ### StatusBanner
91
-
92
- Compact inline status indicator — good for footers or nav bars.
93
-
94
- ```svelte
95
- <StatusBanner
96
- apiUrl="https://status-admin.example.com"
97
- apiKey="sf_abc123..."
98
- statusUrl="/status"
99
- />
100
- ```
101
-
102
- | Prop | Type | Default | Description |
103
- |------|------|---------|-------------|
104
- | `systems` | `System[]` | — | Pass-through mode |
105
- | `apiUrl` | `string` | — | Self-fetching mode |
106
- | `apiKey` | `string` | — | Self-fetching mode |
107
- | `statusUrl` | `string` | — | Links to full status page (renders as `<a>`) |
108
-
109
- ### FeedbackButton
110
-
111
- Floating action button with an embedded feedback form. Fixed position, bottom corner.
112
-
113
- ```svelte
114
- <FeedbackButton
115
- apiKey="sf_abc123..."
116
- apiUrl="https://status-admin.example.com"
117
- position="bottom-right"
118
- categories={['Bug', 'Feature Request', 'General']}
119
- userEmail={currentUser?.email}
120
- />
121
- ```
122
-
123
- | Prop | Type | Default | Description |
124
- |------|------|---------|-------------|
125
- | `apiUrl` | `string` | required | Admin backend URL |
126
- | `apiKey` | `string` | required | Project API key |
127
- | `categories` | `string[]` | `['Bug', 'Feature Request', 'General']` | Category options |
128
- | `userEmail` | `string` | — | Pre-fill email field |
129
- | `position` | `'bottom-right' \| 'bottom-left'` | `'bottom-right'` | Button position |
130
-
131
- ### FeedbackForm
132
-
133
- Standalone feedback form — embed it wherever you need it.
134
-
135
- ```svelte
136
- <FeedbackForm
137
- apiKey="sf_abc123..."
138
- apiUrl="https://status-admin.example.com"
139
- categories={['Bug', 'Feature Request']}
140
- userEmail={currentUser?.email}
141
- onSuccess={() => toast('Thanks!')}
142
- onError={(msg) => toast(msg, 'error')}
143
- />
144
- ```
145
-
146
- | Prop | Type | Default | Description |
147
- |------|------|---------|-------------|
148
- | `apiUrl` | `string` | required | Admin backend URL |
149
- | `apiKey` | `string` | required | Project API key |
150
- | `categories` | `string[]` | `['Bug', 'Feature Request', 'General']` | Category options |
151
- | `userEmail` | `string` | — | Pre-fill email field |
152
- | `onSuccess` | `() => void` | — | Called after successful submission |
153
- | `onError` | `(error: string) => void` | — | Called on submission error |
154
-
155
- ### FeedbackBoard
156
-
157
- Public feedback board with voting, category filtering, and admin responses.
158
-
159
- ```svelte
160
- <FeedbackBoard
161
- apiUrl="https://status-admin.example.com"
162
- apiKey="sf_abc123..."
163
- title="Feature Requests"
164
- showSubmit={true}
165
- submitCategories={['Bug', 'Feature Request', 'Improvement']}
166
- categoryConfig={{
167
- Bug: { icon: 'fa-solid fa-bug', label: 'Bugs', description: 'Something broken' },
168
- 'Feature Request': { icon: 'fa-solid fa-lightbulb', label: 'Ideas' },
169
- }}
170
- />
171
- ```
172
-
173
- | Prop | Type | Default | Description |
174
- |------|------|---------|-------------|
175
- | `apiUrl` | `string` | required | Admin backend URL |
176
- | `apiKey` | `string` | required | Project API key |
177
- | `title` | `string` | `'Feedback Board'` | Header title |
178
- | `showSubmit` | `boolean` | `true` | Show inline submit form |
179
- | `submitCategories` | `string[]` | `[]` | Category options for submit form |
180
- | `categoryConfig` | `Record<string, { label?, icon?, description? }>` | `{}` | Customize sidebar categories |
181
-
182
- ### DevFeedback
183
-
184
- Developer feedback overlay for staging/preview environments. Activated via **Ctrl+right-click** anywhere on the page.
185
-
186
- Auto-captures: screenshots (via html2canvas), console errors, viewport size, current route, clicked element selector, and deployment context (Vercel env vars).
187
-
188
- ```svelte
189
- <script>
190
- import { DevFeedback } from '@alliance-droid/status-feedback-system';
191
- </script>
192
-
193
- <!-- In your root +layout.svelte -->
194
- <DevFeedback
195
- apiUrl="https://status-admin.example.com"
196
- apiKey="sf_abc123..."
197
- boardUrl="/feedback"
198
- userEmail={data.user?.email}
199
- />
200
- ```
201
-
202
- | Prop | Type | Default | Description |
203
- |------|------|---------|-------------|
204
- | `apiUrl` | `string` | required | Admin backend URL |
205
- | `apiKey` | `string` | required | Project API key |
206
- | `enabled` | `boolean` | auto-detect | Override environment detection |
207
- | `boardUrl` | `string` | — | URL for "View Open Issues" link. Hidden if omitted. |
208
- | `userEmail` | `string` | — | Pre-fill email field (e.g. from logged-in user's session) |
209
- | `maxConsoleErrors` | `number` | `20` | Max console errors to capture |
210
- | `showOnboarding` | `boolean` | `true` | Show "Ctrl+right-click" toast on first visit |
211
-
212
- **Environment auto-detection:** Enabled on `localhost`, `127.0.0.1`, `*.local`, and Vercel preview deployments. Disabled in Vercel production. Override with the `enabled` prop or `PUBLIC_FEEDBACK_ENABLED` env var.
213
-
214
- **Screenshot storage:** If the admin backend has `AZURE_FEEDBACK_BLOB_CONNECTION_STRING` configured, screenshots are uploaded to Azure Blob Storage. Otherwise they're stored as base64 in the database.
215
-
216
- ## API Client
217
-
218
- All components use a shared API client. You can also use it directly:
219
-
220
- ```typescript
221
- import { createStatusClient } from '@alliance-droid/status-feedback-system';
222
-
223
- const client = createStatusClient({
224
- apiUrl: 'https://status-admin.example.com',
225
- apiKey: 'sf_abc123...',
226
- fetch: event.fetch, // Optional: pass SvelteKit's fetch for SSR
227
- });
228
-
229
- const { systems, overallStatus } = await client.getStatus();
230
- const { incidents } = await client.getIncidents({ limit: 5, includeResolved: true });
231
- const { history } = await client.getUptime({ days: 90 });
232
- const feedback = await client.submitFeedback({ message: 'Great product!' });
233
- const { items, total, categories } = await client.getBoard({ sort: 'votes', status: 'open' });
234
- ```
235
-
236
- ## Shared Components
237
-
238
- Lower-level building blocks used by StatusPage — exported for custom layouts:
239
-
240
- ```typescript
241
- import {
242
- StatusIndicator, // Status dot + label (operational/degraded/outage/maintenance)
243
- UptimeBar, // 90-day uptime bar chart
244
- IncidentTimeline, // Chronological incident updates
245
- SystemCard, // Single system status card with uptime bar
246
- } from '@alliance-droid/status-feedback-system';
247
- ```
248
-
249
- ## All Exports
250
-
251
- ```typescript
252
- // Components
253
- import {
254
- StatusPage, StatusBanner, FeedbackForm, FeedbackButton,
255
- FeedbackBoard, DevFeedback,
256
- StatusIndicator, UptimeBar, IncidentTimeline, SystemCard,
257
- } from '@alliance-droid/status-feedback-system';
258
-
259
- // API Client
260
- import { createStatusClient } from '@alliance-droid/status-feedback-system';
261
- import type { StatusClient, StatusClientConfig } from '@alliance-droid/status-feedback-system';
262
-
263
- // Types
264
- import type {
265
- System, Incident, IncidentUpdate, Feedback, FeedbackResponse,
266
- SystemStatus, IncidentStatus, IncidentSeverity, FeedbackStatus,
267
- StatusData, IncidentData, UptimeData, BoardData, BoardItem,
268
- } from '@alliance-droid/status-feedback-system';
269
- ```
270
-
271
- ## License
272
-
273
- Copyright © 2026 Alliance Technical Group. All rights reserved.
1
+ # @alliance-droid/status-feedback-system
2
+
3
+ Drop-in system status pages and user feedback components for SvelteKit apps.
4
+
5
+ This is the **client package** — UI components that talk to a [status-feedback-admin](https://alliance.ghe.com/alliance/status-feedback-admin) backend via API. The admin app handles data storage, API key management, and the admin dashboard.
6
+
7
+ ## Architecture
8
+
9
+ ```
10
+ ┌─────────────────────────┐ ┌──────────────────────────┐
11
+ │ Your SvelteKit App │ │ status-feedback-admin │
12
+ │ │ │ │
13
+ │ ┌───────────────────┐ │ API │ ┌────────────────────┐ │
14
+ │ │ StatusPage │──┼───────┼──│ /api/status │ │
15
+ │ │ FeedbackButton │ │ │ │ /api/feedback │ │
16
+ │ │ DevFeedback │ │ │ │ /api/incidents │ │
17
+ │ │ FeedbackBoard │ │ │ │ /api/board │ │
18
+ │ └───────────────────┘ │ │ └────────────────────┘ │
19
+ │ │ │ │ │
20
+ │ npm package │ │ MSSQL + Azure Blob │
21
+ └─────────────────────────┘ └──────────────────────────┘
22
+ ```
23
+
24
+ ## Setup
25
+
26
+ ### 1. Deploy the admin backend
27
+
28
+ The admin app ([status-feedback-admin](https://alliance.ghe.com/alliance/status-feedback-admin)) provides the API, database, and admin dashboard. Deploy it first.
29
+
30
+ Required env vars on the admin app:
31
+ ```bash
32
+ MSSQL_CONNECTION_STRING=Server=...;Initial Catalog=StatusFeedback;...
33
+ SESSION_SECRET=your-secret
34
+
35
+ # Optional — stores screenshots in Azure Blob Storage instead of base64 in DB
36
+ AZURE_FEEDBACK_BLOB_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...
37
+ AZURE_FEEDBACK_BLOB_CONTAINER=screenshots
38
+ ```
39
+
40
+ ### 2. Create a project and get an API key
41
+
42
+ Log into the admin dashboard, create a project, and copy its API key (prefixed `sf_`).
43
+
44
+ ### 3. Install the client package
45
+
46
+ ```bash
47
+ npm install @alliance-droid/status-feedback-system
48
+ ```
49
+
50
+ **Peer dependencies:** `svelte ^5.0.0`, `@alliance-droid/svelte-component-library >=1.0.0`
51
+
52
+ ## Components
53
+
54
+ ### StatusPage
55
+
56
+ Full status page with systems, incidents, and uptime history bars. Supports **self-fetching** (provide `apiUrl` + `apiKey`) or **pass-through** (provide data directly).
57
+
58
+ ```svelte
59
+ <script>
60
+ import { StatusPage } from '@alliance-droid/status-feedback-system';
61
+ </script>
62
+
63
+ <!-- Self-fetching mode -->
64
+ <StatusPage
65
+ projectName="My App"
66
+ apiUrl="https://status-admin.example.com"
67
+ apiKey="sf_abc123..."
68
+ />
69
+
70
+ <!-- Pass-through mode -->
71
+ <StatusPage
72
+ projectName="My App"
73
+ systems={data.systems}
74
+ incidents={data.incidents}
75
+ statusHistory={data.statusHistory}
76
+ showUptime={true}
77
+ />
78
+ ```
79
+
80
+ | Prop | Type | Default | Description |
81
+ |------|------|---------|-------------|
82
+ | `projectName` | `string` | required | Display name in the header |
83
+ | `apiUrl` | `string` | — | Admin backend URL (self-fetching mode) |
84
+ | `apiKey` | `string` | — | Project API key (self-fetching mode) |
85
+ | `systems` | `System[]` | — | Pass-through: system data |
86
+ | `incidents` | `Incident[]` | — | Pass-through: incident data |
87
+ | `statusHistory` | `Record<string, StatusHistoryEntry[]>` | — | Pass-through: uptime data |
88
+ | `showUptime` | `boolean` | `true` | Show 90-day uptime bars |
89
+
90
+ ### StatusBanner
91
+
92
+ Compact inline status indicator — good for footers or nav bars.
93
+
94
+ ```svelte
95
+ <StatusBanner
96
+ apiUrl="https://status-admin.example.com"
97
+ apiKey="sf_abc123..."
98
+ statusUrl="/status"
99
+ />
100
+ ```
101
+
102
+ | Prop | Type | Default | Description |
103
+ |------|------|---------|-------------|
104
+ | `systems` | `System[]` | — | Pass-through mode |
105
+ | `apiUrl` | `string` | — | Self-fetching mode |
106
+ | `apiKey` | `string` | — | Self-fetching mode |
107
+ | `statusUrl` | `string` | — | Links to full status page (renders as `<a>`) |
108
+
109
+ ### FeedbackButton
110
+
111
+ Floating action button with an embedded feedback form. Fixed position, bottom corner.
112
+
113
+ ```svelte
114
+ <FeedbackButton
115
+ apiKey="sf_abc123..."
116
+ apiUrl="https://status-admin.example.com"
117
+ position="bottom-right"
118
+ categories={['Bug', 'Feature Request', 'General']}
119
+ userEmail={currentUser?.email}
120
+ />
121
+ ```
122
+
123
+ | Prop | Type | Default | Description |
124
+ |------|------|---------|-------------|
125
+ | `apiUrl` | `string` | required | Admin backend URL |
126
+ | `apiKey` | `string` | required | Project API key |
127
+ | `categories` | `string[]` | `['Bug', 'Feature Request', 'General']` | Category options |
128
+ | `userEmail` | `string` | — | Pre-fill email field |
129
+ | `position` | `'bottom-right' \| 'bottom-left'` | `'bottom-right'` | Button position |
130
+
131
+ ### FeedbackForm
132
+
133
+ Standalone feedback form — embed it wherever you need it.
134
+
135
+ ```svelte
136
+ <FeedbackForm
137
+ apiKey="sf_abc123..."
138
+ apiUrl="https://status-admin.example.com"
139
+ categories={['Bug', 'Feature Request']}
140
+ userEmail={currentUser?.email}
141
+ onSuccess={() => toast('Thanks!')}
142
+ onError={(msg) => toast(msg, 'error')}
143
+ />
144
+ ```
145
+
146
+ | Prop | Type | Default | Description |
147
+ |------|------|---------|-------------|
148
+ | `apiUrl` | `string` | required | Admin backend URL |
149
+ | `apiKey` | `string` | required | Project API key |
150
+ | `categories` | `string[]` | `['Bug', 'Feature Request', 'General']` | Category options |
151
+ | `userEmail` | `string` | — | Pre-fill email field |
152
+ | `onSuccess` | `() => void` | — | Called after successful submission |
153
+ | `onError` | `(error: string) => void` | — | Called on submission error |
154
+
155
+ ### FeedbackBoard
156
+
157
+ Public feedback board with voting, category filtering, and admin responses.
158
+
159
+ ```svelte
160
+ <FeedbackBoard
161
+ apiUrl="https://status-admin.example.com"
162
+ apiKey="sf_abc123..."
163
+ title="Feature Requests"
164
+ showSubmit={true}
165
+ submitCategories={['Bug', 'Feature Request', 'Improvement']}
166
+ categoryConfig={{
167
+ Bug: { icon: 'fa-solid fa-bug', label: 'Bugs', description: 'Something broken' },
168
+ 'Feature Request': { icon: 'fa-solid fa-lightbulb', label: 'Ideas' },
169
+ }}
170
+ />
171
+ ```
172
+
173
+ | Prop | Type | Default | Description |
174
+ |------|------|---------|-------------|
175
+ | `apiUrl` | `string` | required | Admin backend URL |
176
+ | `apiKey` | `string` | required | Project API key |
177
+ | `title` | `string` | `'Feedback Board'` | Header title |
178
+ | `showSubmit` | `boolean` | `true` | Show inline submit form |
179
+ | `submitCategories` | `string[]` | `[]` | Category options for submit form |
180
+ | `categoryConfig` | `Record<string, { label?, icon?, description? }>` | `{}` | Customize sidebar categories |
181
+
182
+ ### DevFeedback
183
+
184
+ Feedback overlay for authorized users. Activated via **Ctrl+right-click** (Cmd+right-click on macOS) anywhere on the page.
185
+
186
+ Auto-captures: screenshots (via html2canvas), console errors, viewport size, current route, clicked element selector, and deployment context (Vercel env vars).
187
+
188
+ **Gating:** the widget shows only when `enabled` is `true` **and** `userEmail` is non-empty. `enabled` is the single gate — wire it to your own rule, typically a role/permission check. There is no environment auto-detection. See [docs/role-based-access.md](docs/role-based-access.md) for the recommended role-based setup and the pitfalls.
189
+
190
+ ```svelte
191
+ <script>
192
+ import { DevFeedback } from '@alliance-droid/status-feedback-system';
193
+ </script>
194
+
195
+ <!-- In your root +layout.svelte -->
196
+ <DevFeedback
197
+ apiUrl="https://status-admin.example.com"
198
+ apiKey="sf_abc123..."
199
+ boardUrl="/feedback"
200
+ userEmail={user?.email ?? ''}
201
+ enabled={userCanGiveFeedback}
202
+ />
203
+ ```
204
+
205
+ | Prop | Type | Default | Description |
206
+ |------|------|---------|-------------|
207
+ | `apiUrl` | `string` | required | Admin backend URL |
208
+ | `apiKey` | `string` | required | Project API key |
209
+ | `enabled` | `boolean` | required | The only gate — wire to your role/permission check |
210
+ | `userEmail` | `string` | required | Signed-in user's email. Empty string ⇒ renders nothing (anonymous feedback unsupported) |
211
+ | `boardUrl` | `string` | — | URL for "View Open Issues" link. Hidden if omitted. |
212
+ | `maxConsoleErrors` | `number` | `20` | Max console errors to capture |
213
+ | `showOnboarding` | `boolean` | `true` | Show "Ctrl+right-click" toast on first visit |
214
+ | `renderTokenEndpoint` | `string` | `/svc/internal/issue-render-token` | App endpoint that mints render tokens for screenshot capture |
215
+
216
+ **Screenshot storage:** If the admin backend has `AZURE_FEEDBACK_BLOB_CONNECTION_STRING` configured, screenshots are uploaded to Azure Blob Storage. Otherwise they're stored as base64 in the database.
217
+
218
+ ## API Client
219
+
220
+ All components use a shared API client. You can also use it directly:
221
+
222
+ ```typescript
223
+ import { createStatusClient } from '@alliance-droid/status-feedback-system';
224
+
225
+ const client = createStatusClient({
226
+ apiUrl: 'https://status-admin.example.com',
227
+ apiKey: 'sf_abc123...',
228
+ fetch: event.fetch, // Optional: pass SvelteKit's fetch for SSR
229
+ });
230
+
231
+ const { systems, overallStatus } = await client.getStatus();
232
+ const { incidents } = await client.getIncidents({ limit: 5, includeResolved: true });
233
+ const { history } = await client.getUptime({ days: 90 });
234
+ const feedback = await client.submitFeedback({ message: 'Great product!' });
235
+ const { items, total, categories } = await client.getBoard({ sort: 'votes', status: 'open' });
236
+ ```
237
+
238
+ ## Shared Components
239
+
240
+ Lower-level building blocks used by StatusPage — exported for custom layouts:
241
+
242
+ ```typescript
243
+ import {
244
+ StatusIndicator, // Status dot + label (operational/degraded/outage/maintenance)
245
+ UptimeBar, // 90-day uptime bar chart
246
+ IncidentTimeline, // Chronological incident updates
247
+ SystemCard, // Single system status card with uptime bar
248
+ } from '@alliance-droid/status-feedback-system';
249
+ ```
250
+
251
+ ## All Exports
252
+
253
+ ```typescript
254
+ // Components
255
+ import {
256
+ StatusPage, StatusBanner, FeedbackForm, FeedbackButton,
257
+ FeedbackBoard, DevFeedback,
258
+ StatusIndicator, UptimeBar, IncidentTimeline, SystemCard,
259
+ } from '@alliance-droid/status-feedback-system';
260
+
261
+ // API Client
262
+ import { createStatusClient } from '@alliance-droid/status-feedback-system';
263
+ import type { StatusClient, StatusClientConfig } from '@alliance-droid/status-feedback-system';
264
+
265
+ // Types
266
+ import type {
267
+ System, Incident, IncidentUpdate, Feedback, FeedbackResponse,
268
+ SystemStatus, IncidentStatus, IncidentSeverity, FeedbackStatus,
269
+ StatusData, IncidentData, UptimeData, BoardData, BoardItem,
270
+ } from '@alliance-droid/status-feedback-system';
271
+ ```
272
+
273
+ ## License
274
+
275
+ Copyright © 2026 Alliance Technical Group. All rights reserved.
package/dist/api.d.ts CHANGED
@@ -11,7 +11,7 @@
11
11
  *
12
12
  * const { systems, incidents } = await client.getStatus();
13
13
  */
14
- import type { System, Incident, StatusHistoryEntry, Feedback, FeedbackResponse } from './types.js';
14
+ import type { System, Incident, StatusHistoryEntry, Feedback, FeedbackResponse, PublicStatus } from './types.js';
15
15
  export interface StatusClientConfig {
16
16
  /** Base URL of the status-feedback-admin app */
17
17
  apiUrl: string;
@@ -41,6 +41,8 @@ export interface BoardItem {
41
41
  message: string;
42
42
  email: string | null;
43
43
  status: string;
44
+ /** Coarse public bucket for display (server projection of the internal status). */
45
+ publicStatus: PublicStatus;
44
46
  votes: number;
45
47
  adminResponse: string | null;
46
48
  responseCount: number;