4runr-os 1.0.97 → 1.0.99

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 (58) hide show
  1. package/dist/ui/v3/collectors/resources.d.ts +3 -3
  2. package/dist/ui/v3/collectors/resources.d.ts.map +1 -1
  3. package/dist/ui/v3/collectors/resources.js +13 -4
  4. package/dist/ui/v3/collectors/resources.js.map +1 -1
  5. package/dist/ui/v3/commands/commandEngine.d.ts +75 -0
  6. package/dist/ui/v3/commands/commandEngine.d.ts.map +1 -0
  7. package/dist/ui/v3/commands/commandEngine.js +292 -0
  8. package/dist/ui/v3/commands/commandEngine.js.map +1 -0
  9. package/dist/ui/v3/commands/router.js +3 -3
  10. package/dist/ui/v3/commands/router.js.map +1 -1
  11. package/dist/ui/v3/state/assertUiState.d.ts +27 -0
  12. package/dist/ui/v3/state/assertUiState.d.ts.map +1 -0
  13. package/dist/ui/v3/state/assertUiState.js +85 -0
  14. package/dist/ui/v3/state/assertUiState.js.map +1 -0
  15. package/dist/ui/v3/state/defaultState.d.ts +9 -2
  16. package/dist/ui/v3/state/defaultState.d.ts.map +1 -1
  17. package/dist/ui/v3/state/defaultState.js +15 -3
  18. package/dist/ui/v3/state/defaultState.js.map +1 -1
  19. package/dist/ui/v3/state/uiState.d.ts +13 -3
  20. package/dist/ui/v3/state/uiState.d.ts.map +1 -1
  21. package/dist/ui/v3/state/uiState.js +6 -1
  22. package/dist/ui/v3/state/uiState.js.map +1 -1
  23. package/dist/ui/v3/state/uiStateBuilder.d.ts +6 -1
  24. package/dist/ui/v3/state/uiStateBuilder.d.ts.map +1 -1
  25. package/dist/ui/v3/state/uiStateBuilder.js +18 -3
  26. package/dist/ui/v3/state/uiStateBuilder.js.map +1 -1
  27. package/dist/ui/v3/state/uiStateTypes.d.ts +52 -0
  28. package/dist/ui/v3/state/uiStateTypes.d.ts.map +1 -0
  29. package/dist/ui/v3/state/uiStateTypes.js +8 -0
  30. package/dist/ui/v3/state/uiStateTypes.js.map +1 -0
  31. package/dist/ui/v3/state/value.d.ts +40 -12
  32. package/dist/ui/v3/state/value.d.ts.map +1 -1
  33. package/dist/ui/v3/state/value.js +39 -6
  34. package/dist/ui/v3/state/value.js.map +1 -1
  35. package/dist/ui/v3/ui/panels/AssetsPanel.d.ts +16 -0
  36. package/dist/ui/v3/ui/panels/AssetsPanel.d.ts.map +1 -0
  37. package/dist/ui/v3/ui/panels/AssetsPanel.js +29 -0
  38. package/dist/ui/v3/ui/panels/AssetsPanel.js.map +1 -0
  39. package/dist/ui/v3/ui/panels/CapabilitiesPanel.d.ts +16 -0
  40. package/dist/ui/v3/ui/panels/CapabilitiesPanel.d.ts.map +1 -0
  41. package/dist/ui/v3/ui/panels/CapabilitiesPanel.js +27 -0
  42. package/dist/ui/v3/ui/panels/CapabilitiesPanel.js.map +1 -0
  43. package/dist/ui/v3/ui/panels/NetworkPanel.d.ts +16 -0
  44. package/dist/ui/v3/ui/panels/NetworkPanel.d.ts.map +1 -0
  45. package/dist/ui/v3/ui/panels/NetworkPanel.js +24 -0
  46. package/dist/ui/v3/ui/panels/NetworkPanel.js.map +1 -0
  47. package/dist/ui/v3/ui/panels/PosturePanel.d.ts +16 -0
  48. package/dist/ui/v3/ui/panels/PosturePanel.d.ts.map +1 -0
  49. package/dist/ui/v3/ui/panels/PosturePanel.js +24 -0
  50. package/dist/ui/v3/ui/panels/PosturePanel.js.map +1 -0
  51. package/dist/ui/v3/ui/panels/ResourcesPanel.d.ts +6 -3
  52. package/dist/ui/v3/ui/panels/ResourcesPanel.d.ts.map +1 -1
  53. package/dist/ui/v3/ui/panels/ResourcesPanel.js +25 -29
  54. package/dist/ui/v3/ui/panels/ResourcesPanel.js.map +1 -1
  55. package/dist/ui/v3/ui/phase1Runtime.d.ts.map +1 -1
  56. package/dist/ui/v3/ui/phase1Runtime.js +186 -32
  57. package/dist/ui/v3/ui/phase1Runtime.js.map +1 -1
  58. package/package.json +1 -1
@@ -13,11 +13,11 @@
13
13
  * - Uses Node APIs/libs only (no shell commands)
14
14
  */
15
15
  import type { Value } from '../state/value.js';
16
- import type { ResourcesData } from '../state/resourcesData.js';
16
+ import type { ResourcesState } from '../state/uiStateTypes.js';
17
17
  /**
18
18
  * Collect system resources
19
19
  *
20
- * Returns Value<ResourcesData> - either AVAILABLE with data or UNAVAILABLE with reason
20
+ * Returns Value<ResourcesState> - either AVAILABLE with data or UNAVAILABLE with reason
21
21
  */
22
- export declare function collectResources(): Promise<Value<ResourcesData>>;
22
+ export declare function collectResources(): Promise<Value<ResourcesState>>;
23
23
  //# sourceMappingURL=resources.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../../src/ui/v3/collectors/resources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAI/D;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CA0HtE"}
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../../src/ui/v3/collectors/resources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAc/D;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CA0HvE"}
@@ -16,10 +16,19 @@ import si from 'systeminformation';
16
16
  import os from 'os';
17
17
  import { available, unavailable } from '../state/value.js';
18
18
  const COLLECTOR_TIMEOUT = 1500; // ms
19
+ /**
20
+ * Format uptime seconds to HH:MM:SS string
21
+ */
22
+ function formatUptime(seconds) {
23
+ const hours = Math.floor(seconds / 3600);
24
+ const minutes = Math.floor((seconds % 3600) / 60);
25
+ const secs = Math.floor(seconds % 60);
26
+ return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
27
+ }
19
28
  /**
20
29
  * Collect system resources
21
30
  *
22
- * Returns Value<ResourcesData> - either AVAILABLE with data or UNAVAILABLE with reason
31
+ * Returns Value<ResourcesState> - either AVAILABLE with data or UNAVAILABLE with reason
23
32
  */
24
33
  export async function collectResources() {
25
34
  // Wrap in timeout
@@ -96,14 +105,14 @@ export async function collectResources() {
96
105
  return unavailable('Uptime unavailable', 'Ensure Node.js os module is functional');
97
106
  }
98
107
  // All metrics collected successfully
108
+ // Format uptime as HH:MM:SS string
99
109
  const data = {
100
- cpuPercent,
101
- load1,
110
+ cpuPct: cpuPercent,
102
111
  ramUsedMB,
103
112
  ramTotalMB,
104
113
  diskUsedGB,
105
114
  diskTotalGB,
106
- uptimeSeconds,
115
+ uptime: formatUptime(uptimeSeconds),
107
116
  };
108
117
  return available(data);
109
118
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../../src/ui/v3/collectors/resources.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../../src/ui/v3/collectors/resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Section 3: Command Engine (UI-Agnostic)
3
+ *
4
+ * Pure command engine that sits between command line and UI state.
5
+ *
6
+ * Rules:
7
+ * - Does not know about blessed
8
+ * - Does not render UI
9
+ * - Does not contain business logic
10
+ * - Only parses input, executes commands, and emits structured results
11
+ * - UI layer consumes results and mutates UiState
12
+ *
13
+ * Architectural Rule (Non-Negotiable):
14
+ * - UI-agnostic
15
+ * - Side-effect free
16
+ * - Deterministic
17
+ */
18
+ import type { OpEvent } from '../core/opEvent.js';
19
+ /**
20
+ * Parsed command structure
21
+ */
22
+ export interface ParsedCommand {
23
+ name: string;
24
+ args: string[];
25
+ raw: string;
26
+ }
27
+ /**
28
+ * Command execution context (lightweight, no UI objects)
29
+ */
30
+ export interface CommandContext {
31
+ }
32
+ /**
33
+ * UI actions that the UI layer interprets
34
+ */
35
+ export declare enum UiAction {
36
+ EXIT = "EXIT",
37
+ CLEAR_FEED = "CLEAR_FEED",
38
+ HOME = "HOME"
39
+ }
40
+ /**
41
+ * Command execution result
42
+ */
43
+ export interface CommandResult {
44
+ events: OpEvent[];
45
+ action?: UiAction;
46
+ }
47
+ /**
48
+ * Parse command line input
49
+ *
50
+ * Responsibilities:
51
+ * - Trim leading/trailing whitespace
52
+ * - Support quoted arguments: "quoted value" and 'quoted value'
53
+ * - Preserve spaces inside quotes
54
+ * - Split unquoted tokens on whitespace
55
+ *
56
+ * Rules:
57
+ * - Empty input → return { name: "", args: [], raw }
58
+ * - Parsing never throws
59
+ * - Parsing never emits UI output
60
+ */
61
+ export declare function parse(line: string): ParsedCommand;
62
+ /**
63
+ * Execute a parsed command
64
+ *
65
+ * Responsibilities:
66
+ * - Route to a command handler
67
+ * - Return a CommandResult object
68
+ * - Never mutate UI directly
69
+ *
70
+ * Rules:
71
+ * - Never emits UI output directly
72
+ * - Only side effects via returned data
73
+ */
74
+ export declare function execute(parsed: ParsedCommand, ctx: CommandContext): CommandResult;
75
+ //# sourceMappingURL=commandEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commandEngine.d.ts","sourceRoot":"","sources":["../../../../src/ui/v3/commands/commandEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;CAG9B;AAED;;GAEG;AACH,oBAAY,QAAQ;IAClB,IAAI,SAAS;IACb,UAAU,eAAe;IACzB,IAAI,SAAS;CACd;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CA8EjD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,cAAc,GAAG,aAAa,CA4BjF"}
@@ -0,0 +1,292 @@
1
+ /**
2
+ * Section 3: Command Engine (UI-Agnostic)
3
+ *
4
+ * Pure command engine that sits between command line and UI state.
5
+ *
6
+ * Rules:
7
+ * - Does not know about blessed
8
+ * - Does not render UI
9
+ * - Does not contain business logic
10
+ * - Only parses input, executes commands, and emits structured results
11
+ * - UI layer consumes results and mutates UiState
12
+ *
13
+ * Architectural Rule (Non-Negotiable):
14
+ * - UI-agnostic
15
+ * - Side-effect free
16
+ * - Deterministic
17
+ */
18
+ /**
19
+ * UI actions that the UI layer interprets
20
+ */
21
+ export var UiAction;
22
+ (function (UiAction) {
23
+ UiAction["EXIT"] = "EXIT";
24
+ UiAction["CLEAR_FEED"] = "CLEAR_FEED";
25
+ UiAction["HOME"] = "HOME";
26
+ })(UiAction || (UiAction = {}));
27
+ /**
28
+ * Parse command line input
29
+ *
30
+ * Responsibilities:
31
+ * - Trim leading/trailing whitespace
32
+ * - Support quoted arguments: "quoted value" and 'quoted value'
33
+ * - Preserve spaces inside quotes
34
+ * - Split unquoted tokens on whitespace
35
+ *
36
+ * Rules:
37
+ * - Empty input → return { name: "", args: [], raw }
38
+ * - Parsing never throws
39
+ * - Parsing never emits UI output
40
+ */
41
+ export function parse(line) {
42
+ const raw = line;
43
+ const trimmed = line.trim();
44
+ // Empty input
45
+ if (!trimmed) {
46
+ return { name: '', args: [], raw };
47
+ }
48
+ // Remove prompt if present
49
+ const withoutPrompt = trimmed.replace(/^4runr>\s*/, '').trim();
50
+ if (!withoutPrompt) {
51
+ return { name: '', args: [], raw };
52
+ }
53
+ // Parse with quoted argument support
54
+ const tokens = [];
55
+ let current = '';
56
+ let inDoubleQuote = false;
57
+ let inSingleQuote = false;
58
+ for (let i = 0; i < withoutPrompt.length; i++) {
59
+ const char = withoutPrompt[i];
60
+ if (char === '"' && !inSingleQuote) {
61
+ if (inDoubleQuote) {
62
+ // End of double-quoted string
63
+ tokens.push(current);
64
+ current = '';
65
+ inDoubleQuote = false;
66
+ }
67
+ else {
68
+ // Start of double-quoted string
69
+ if (current.trim()) {
70
+ tokens.push(current.trim());
71
+ current = '';
72
+ }
73
+ inDoubleQuote = true;
74
+ }
75
+ }
76
+ else if (char === "'" && !inDoubleQuote) {
77
+ if (inSingleQuote) {
78
+ // End of single-quoted string
79
+ tokens.push(current);
80
+ current = '';
81
+ inSingleQuote = false;
82
+ }
83
+ else {
84
+ // Start of single-quoted string
85
+ if (current.trim()) {
86
+ tokens.push(current.trim());
87
+ current = '';
88
+ }
89
+ inSingleQuote = true;
90
+ }
91
+ }
92
+ else if ((char === ' ' || char === '\t') && !inDoubleQuote && !inSingleQuote) {
93
+ // Whitespace outside quotes - split token
94
+ if (current.trim()) {
95
+ tokens.push(current.trim());
96
+ current = '';
97
+ }
98
+ }
99
+ else {
100
+ // Regular character - add to current token
101
+ current += char;
102
+ }
103
+ }
104
+ // Add final token if any
105
+ if (current.trim() || inDoubleQuote || inSingleQuote) {
106
+ tokens.push(current.trim());
107
+ }
108
+ if (tokens.length === 0) {
109
+ return { name: '', args: [], raw };
110
+ }
111
+ const name = tokens[0].toLowerCase();
112
+ const args = tokens.slice(1);
113
+ return { name, args, raw };
114
+ }
115
+ /**
116
+ * Execute a parsed command
117
+ *
118
+ * Responsibilities:
119
+ * - Route to a command handler
120
+ * - Return a CommandResult object
121
+ * - Never mutate UI directly
122
+ *
123
+ * Rules:
124
+ * - Never emits UI output directly
125
+ * - Only side effects via returned data
126
+ */
127
+ export function execute(parsed, ctx) {
128
+ // Empty command
129
+ if (!parsed.name) {
130
+ return { events: [] };
131
+ }
132
+ // Route to command handler
133
+ const handler = commands[parsed.name];
134
+ if (!handler) {
135
+ // Unknown command
136
+ return handleUnknown(parsed.name);
137
+ }
138
+ try {
139
+ return handler(ctx, parsed.args);
140
+ }
141
+ catch (error) {
142
+ // Handler error - emit error event
143
+ const errorMsg = error instanceof Error ? error.message : String(error);
144
+ return {
145
+ events: [{
146
+ id: `err-${Date.now()}`,
147
+ ts: Date.now(),
148
+ tag: 'ERR',
149
+ msg: `Command error: ${errorMsg.substring(0, 50)}`,
150
+ }],
151
+ };
152
+ }
153
+ }
154
+ /**
155
+ * Sanitize user input for display in error messages
156
+ */
157
+ function sanitizeUserInput(input, maxLength = 50) {
158
+ // Remove control characters and newlines
159
+ let sanitized = input.replace(/[\x00-\x1F\x7F-\x9F\n\r\t]/g, '');
160
+ // Truncate to max length
161
+ if (sanitized.length > maxLength) {
162
+ sanitized = sanitized.substring(0, maxLength) + '...';
163
+ }
164
+ return sanitized;
165
+ }
166
+ /**
167
+ * Handle unknown command
168
+ *
169
+ * Rules:
170
+ * - Emit exactly one event
171
+ * - <command> must be capped (reuse Section 2.5 echo cap)
172
+ * - No stack traces
173
+ * - No extra lines
174
+ * - No duplicate emissions
175
+ */
176
+ function handleUnknown(cmd) {
177
+ const sanitizedCmd = sanitizeUserInput(cmd, 50);
178
+ return {
179
+ events: [{
180
+ id: `err-${Date.now()}`,
181
+ ts: Date.now(),
182
+ tag: 'ERR',
183
+ msg: `UNKNOWN COMMAND: ${sanitizedCmd} (try: help)`,
184
+ }],
185
+ };
186
+ }
187
+ /**
188
+ * Command registration map
189
+ *
190
+ * Explicit command map - no dynamic loading, no reflection, no plugin system
191
+ */
192
+ const commands = {
193
+ help: handleHelp,
194
+ clear: handleClear,
195
+ home: handleHome,
196
+ exit: handleExit,
197
+ };
198
+ /**
199
+ * Handle help command
200
+ *
201
+ * Emits help text to Operations Feed
202
+ * Text must be static and explicit (no dynamic introspection)
203
+ */
204
+ function handleHelp(ctx, args) {
205
+ return {
206
+ events: [
207
+ {
208
+ id: `help-1-${Date.now()}`,
209
+ ts: Date.now(),
210
+ tag: 'SYS',
211
+ msg: 'AVAILABLE COMMANDS:',
212
+ },
213
+ {
214
+ id: `help-2-${Date.now()}`,
215
+ ts: Date.now(),
216
+ tag: 'SYS',
217
+ msg: ' help',
218
+ },
219
+ {
220
+ id: `help-3-${Date.now()}`,
221
+ ts: Date.now(),
222
+ tag: 'SYS',
223
+ msg: ' clear',
224
+ },
225
+ {
226
+ id: `help-4-${Date.now()}`,
227
+ ts: Date.now(),
228
+ tag: 'SYS',
229
+ msg: ' home',
230
+ },
231
+ {
232
+ id: `help-5-${Date.now()}`,
233
+ ts: Date.now(),
234
+ tag: 'SYS',
235
+ msg: ' exit',
236
+ },
237
+ ],
238
+ };
239
+ }
240
+ /**
241
+ * Handle clear command
242
+ *
243
+ * Does not clear screen
244
+ * Does not reset panels
245
+ * Emits no output events
246
+ * Returns action: CLEAR_FEED
247
+ */
248
+ function handleClear(ctx, args) {
249
+ return {
250
+ events: [], // No output events
251
+ action: UiAction.CLEAR_FEED,
252
+ };
253
+ }
254
+ /**
255
+ * Handle home command
256
+ *
257
+ * Emits a short status line
258
+ * Returns action: HOME
259
+ */
260
+ function handleHome(ctx, args) {
261
+ return {
262
+ events: [
263
+ {
264
+ id: `home-${Date.now()}`,
265
+ ts: Date.now(),
266
+ tag: 'SYS',
267
+ msg: 'HOME VIEW',
268
+ },
269
+ ],
270
+ action: UiAction.HOME,
271
+ };
272
+ }
273
+ /**
274
+ * Handle exit command
275
+ *
276
+ * Emits optional confirmation event (optional but consistent)
277
+ * Returns action: EXIT
278
+ */
279
+ function handleExit(ctx, args) {
280
+ return {
281
+ events: [
282
+ {
283
+ id: `exit-${Date.now()}`,
284
+ ts: Date.now(),
285
+ tag: 'SYS',
286
+ msg: 'Exiting...',
287
+ },
288
+ ],
289
+ action: UiAction.EXIT,
290
+ };
291
+ }
292
+ //# sourceMappingURL=commandEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commandEngine.js","sourceRoot":"","sources":["../../../../src/ui/v3/commands/commandEngine.ts"],"names":[],"mappings":"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"}
@@ -75,11 +75,11 @@ function handleStatus() {
75
75
  eventBus.emitTag('SYS', '=== UI STATE SUMMARY ===');
76
76
  // Resources status
77
77
  if (isAvailable(state.resources)) {
78
- const r = state.resources.data;
79
- eventBus.emitTag('SYS', `RESOURCES: CPU ${r.cpuPercent.toFixed(1)}% | RAM ${r.ramUsedMB}/${r.ramTotalMB}MB | Disk ${r.diskUsedGB}/${r.diskTotalGB}GB`);
78
+ const r = state.resources.value;
79
+ eventBus.emitTag('SYS', `RESOURCES: CPU ${r.cpuPct.toFixed(1)}% | RAM ${r.ramUsedMB}/${r.ramTotalMB}MB | Disk ${r.diskUsedGB}/${r.diskTotalGB}GB`);
80
80
  }
81
81
  else {
82
- eventBus.emitTag('SYS', `RESOURCES: ${state.resources.status} - ${state.resources.reason || 'Unknown'}`);
82
+ eventBus.emitTag('SYS', `RESOURCES: ${state.resources.availability} - ${state.resources.reason || 'Unknown'}`);
83
83
  }
84
84
  eventBus.emitTag('SYS', '=== END STATE SUMMARY ===');
85
85
  return noOpResult();
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../src/ui/v3/commands/router.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,IAAc;IACtD,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAEzC,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,UAAU,EAAE,CAAC;QAEtB,KAAK,OAAO;YACV,OAAO,WAAW,EAAE,CAAC;QAEvB,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,UAAU,EAAE,CAAC;QAEtB,KAAK,MAAM;YACT,OAAO,UAAU,EAAE,CAAC;QAEtB,KAAK,QAAQ;YACX,OAAO,YAAY,EAAE,CAAC;QAExB,KAAK,UAAU;YACb,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;QAE9B;YACE,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU;IACjB,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,qDAAqD,CAAC,CAAC;IAC/E,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW;IAClB,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IACxC,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,UAAU;IACjB,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU;IACjB,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAC5C,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY;IACnB,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAE7B,sBAAsB;IACtB,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,0BAA0B,CAAC,CAAC;IAEpD,mBAAmB;IACnB,IAAI,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;QAC/B,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,UAAU,aAAa,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;IACzJ,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,cAAc,KAAK,CAAC,SAAS,CAAC,MAAM,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;IAC3G,CAAC;IAEC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC;IACvD,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,IAAc;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,OAAO,CAAC;IAE/C,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAC3C,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;QACnD,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;IACjD,CAAC;SAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,kEAAkE,CAAC;QACtG,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,yDAAyD,CAAC;QAC7F,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,8DAA8D,CAAC;QAClG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAClC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAClC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;SAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,wBAAwB;QACxB,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QACzC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,kCAAkC,CAAC,CAAC;QAC9E,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QACzC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,8BAA8B,CAAC,CAAC;QAC1E,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,0BAA0B,IAAI,+BAA+B,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,iBAAiB,CAAC,KAAa,EAAE,YAAoB,EAAE;IAC9D,yCAAyC;IACzC,IAAI,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;IAEjE,yBAAyB;IACzB,IAAI,SAAS,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QACjC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;IACxD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,0DAA0D;IAC1D,MAAM,YAAY,GAAG,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAChD,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,oBAAoB,YAAY,cAAc,CAAC,CAAC;IACxE,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../../src/ui/v3/commands/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Section 4: UiState Validation (Runtime Contract)
3
+ *
4
+ * Catches illegal state mutations at runtime.
5
+ * Provides immediate, deterministic failure (no silent broken UI).
6
+ *
7
+ * Validation rules:
8
+ * - State must be an object
9
+ * - Must include all keys exactly
10
+ * - For each key:
11
+ * - Must have availability in allowed set
12
+ * - If AVAILABLE → must have value
13
+ * - If UNAVAILABLE/UNKNOWN → must not have value
14
+ */
15
+ import type { UiState } from './uiState.js';
16
+ /**
17
+ * Assert that state is a valid UiState
18
+ *
19
+ * Throws concise errors like:
20
+ * - UISTATE_INVALID: assets missing
21
+ * - UISTATE_INVALID: resources AVAILABLE missing value
22
+ *
23
+ * No stack dumps into the Operations Feed (this is internal).
24
+ * If you surface it, wrap it as a single [ERR] event with capped details.
25
+ */
26
+ export declare function assertUiState(state: any): asserts state is UiState;
27
+ //# sourceMappingURL=assertUiState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertUiState.d.ts","sourceRoot":"","sources":["../../../../src/ui/v3/state/assertUiState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAgD5C;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAuBlE"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Section 4: UiState Validation (Runtime Contract)
3
+ *
4
+ * Catches illegal state mutations at runtime.
5
+ * Provides immediate, deterministic failure (no silent broken UI).
6
+ *
7
+ * Validation rules:
8
+ * - State must be an object
9
+ * - Must include all keys exactly
10
+ * - For each key:
11
+ * - Must have availability in allowed set
12
+ * - If AVAILABLE → must have value
13
+ * - If UNAVAILABLE/UNKNOWN → must not have value
14
+ */
15
+ const REQUIRED_KEYS = [
16
+ 'posture',
17
+ 'resources',
18
+ 'assets',
19
+ 'network',
20
+ 'capabilities',
21
+ 'statusStrip',
22
+ ];
23
+ const VALID_AVAILABILITY = ["AVAILABLE", "UNAVAILABLE", "UNKNOWN"];
24
+ /**
25
+ * Assert that a value has valid structure
26
+ */
27
+ function assertValue(key, value) {
28
+ if (!value || typeof value !== 'object') {
29
+ throw new Error(`UISTATE_INVALID: ${key} is not an object`);
30
+ }
31
+ if (!('availability' in value)) {
32
+ throw new Error(`UISTATE_INVALID: ${key} missing availability`);
33
+ }
34
+ const availability = value.availability;
35
+ if (!VALID_AVAILABILITY.includes(availability)) {
36
+ throw new Error(`UISTATE_INVALID: ${key} has invalid availability: ${availability}`);
37
+ }
38
+ if (availability === "AVAILABLE") {
39
+ if (!('value' in value)) {
40
+ throw new Error(`UISTATE_INVALID: ${key} AVAILABLE missing value`);
41
+ }
42
+ // AVAILABLE must not have reason/nextAction (they're for UNAVAILABLE/UNKNOWN)
43
+ if ('reason' in value || 'nextAction' in value) {
44
+ throw new Error(`UISTATE_INVALID: ${key} AVAILABLE should not have reason/nextAction`);
45
+ }
46
+ }
47
+ else {
48
+ // UNAVAILABLE or UNKNOWN must not have value
49
+ if ('value' in value) {
50
+ throw new Error(`UISTATE_INVALID: ${key} ${availability} should not have value`);
51
+ }
52
+ }
53
+ }
54
+ /**
55
+ * Assert that state is a valid UiState
56
+ *
57
+ * Throws concise errors like:
58
+ * - UISTATE_INVALID: assets missing
59
+ * - UISTATE_INVALID: resources AVAILABLE missing value
60
+ *
61
+ * No stack dumps into the Operations Feed (this is internal).
62
+ * If you surface it, wrap it as a single [ERR] event with capped details.
63
+ */
64
+ export function assertUiState(state) {
65
+ if (!state || typeof state !== 'object') {
66
+ throw new Error('UISTATE_INVALID: state is not an object');
67
+ }
68
+ // Check all required keys are present
69
+ for (const key of REQUIRED_KEYS) {
70
+ if (!(key in state)) {
71
+ throw new Error(`UISTATE_INVALID: ${key} missing`);
72
+ }
73
+ }
74
+ // Check no extra keys (strict contract)
75
+ const stateKeys = Object.keys(state);
76
+ const extraKeys = stateKeys.filter(k => !REQUIRED_KEYS.includes(k));
77
+ if (extraKeys.length > 0) {
78
+ throw new Error(`UISTATE_INVALID: extra keys found: ${extraKeys.join(', ')}`);
79
+ }
80
+ // Validate each key's value structure
81
+ for (const key of REQUIRED_KEYS) {
82
+ assertValue(key, state[key]);
83
+ }
84
+ }
85
+ //# sourceMappingURL=assertUiState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertUiState.js","sourceRoot":"","sources":["../../../../src/ui/v3/state/assertUiState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,MAAM,aAAa,GAAsB;IACvC,SAAS;IACT,WAAW;IACX,QAAQ;IACR,SAAS;IACT,cAAc;IACd,aAAa;CACd,CAAC;AAEF,MAAM,kBAAkB,GAAmB,CAAC,WAAW,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;AAEnF;;GAEG;AACH,SAAS,WAAW,CAAI,GAAW,EAAE,KAAU;IAC7C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,mBAAmB,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,CAAC,cAAc,IAAI,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,uBAAuB,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;IACxC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,8BAA8B,YAAY,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,IAAI,YAAY,KAAK,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,0BAA0B,CAAC,CAAC;QACrE,CAAC;QACD,8EAA8E;QAC9E,IAAI,QAAQ,IAAI,KAAK,IAAI,YAAY,IAAI,KAAK,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,8CAA8C,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,6CAA6C;QAC7C,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,IAAI,YAAY,wBAAwB,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,KAAU;IACtC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,sCAAsC;IACtC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,UAAU,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAkB,CAAC,CAAC,CAAC;IACrF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,sCAAsC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,sCAAsC;IACtC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
@@ -1,8 +1,15 @@
1
1
  /**
2
- * Default UiState (Phase 4)
2
+ * Section 4: Default UiState (Cold Boot State)
3
3
  *
4
4
  * Initial state before collectors run.
5
- * All fields start as UNAVAILABLE.
5
+ * All fields start as UNAVAILABLE with:
6
+ * - reason stating why
7
+ * - nextAction telling operator what to do next
8
+ *
9
+ * Hard requirements:
10
+ * - No key may be AVAILABLE in the default state
11
+ * - No key may be missing
12
+ * - All panels must have meaningful reason + nextAction (do not leave empty)
6
13
  */
7
14
  import type { UiState } from './uiState.js';
8
15
  export declare const defaultUiState: UiState;
@@ -1 +1 @@
1
- {"version":3,"file":"defaultState.d.ts","sourceRoot":"","sources":["../../../../src/ui/v3/state/defaultState.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,eAAO,MAAM,cAAc,EAAE,OAK5B,CAAC"}
1
+ {"version":3,"file":"defaultState.d.ts","sourceRoot":"","sources":["../../../../src/ui/v3/state/defaultState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,eAAO,MAAM,cAAc,EAAE,OAyB5B,CAAC"}