@miller-tech/uap 1.0.0 → 1.2.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.
Files changed (122) hide show
  1. package/dist/benchmarks/benchmark.d.ts +8 -8
  2. package/dist/benchmarks/improved-benchmark.d.ts.map +1 -1
  3. package/dist/benchmarks/improved-benchmark.js +10 -23
  4. package/dist/benchmarks/improved-benchmark.js.map +1 -1
  5. package/dist/benchmarks/model-integration.d.ts.map +1 -1
  6. package/dist/benchmarks/model-integration.js +22 -23
  7. package/dist/benchmarks/model-integration.js.map +1 -1
  8. package/dist/bin/policy.js +67 -11
  9. package/dist/bin/policy.js.map +1 -1
  10. package/dist/cli/dashboard.d.ts +2 -1
  11. package/dist/cli/dashboard.d.ts.map +1 -1
  12. package/dist/cli/dashboard.js +399 -10
  13. package/dist/cli/dashboard.js.map +1 -1
  14. package/dist/cli/model.js +12 -12
  15. package/dist/cli/model.js.map +1 -1
  16. package/dist/cli/setup-wizard.d.ts.map +1 -1
  17. package/dist/cli/setup-wizard.js +24 -0
  18. package/dist/cli/setup-wizard.js.map +1 -1
  19. package/dist/coordination/deploy-batcher.d.ts +1 -0
  20. package/dist/coordination/deploy-batcher.d.ts.map +1 -1
  21. package/dist/coordination/deploy-batcher.js +24 -25
  22. package/dist/coordination/deploy-batcher.js.map +1 -1
  23. package/dist/dashboard/data-service.d.ts +94 -0
  24. package/dist/dashboard/data-service.d.ts.map +1 -0
  25. package/dist/dashboard/data-service.js +286 -0
  26. package/dist/dashboard/data-service.js.map +1 -0
  27. package/dist/dashboard/index.d.ts +5 -0
  28. package/dist/dashboard/index.d.ts.map +1 -0
  29. package/dist/dashboard/index.js +3 -0
  30. package/dist/dashboard/index.js.map +1 -0
  31. package/dist/dashboard/server.d.ts +15 -0
  32. package/dist/dashboard/server.d.ts.map +1 -0
  33. package/dist/dashboard/server.js +158 -0
  34. package/dist/dashboard/server.js.map +1 -0
  35. package/dist/mcp-router/session-stats.d.ts +9 -0
  36. package/dist/mcp-router/session-stats.d.ts.map +1 -1
  37. package/dist/mcp-router/session-stats.js +19 -3
  38. package/dist/mcp-router/session-stats.js.map +1 -1
  39. package/dist/memory/adaptive-context.d.ts +1 -0
  40. package/dist/memory/adaptive-context.d.ts.map +1 -1
  41. package/dist/memory/adaptive-context.js +4 -0
  42. package/dist/memory/adaptive-context.js.map +1 -1
  43. package/dist/memory/embeddings.d.ts.map +1 -1
  44. package/dist/memory/embeddings.js +4 -4
  45. package/dist/memory/embeddings.js.map +1 -1
  46. package/dist/memory/model-router.d.ts +1 -1
  47. package/dist/memory/model-router.d.ts.map +1 -1
  48. package/dist/memory/model-router.js +52 -1
  49. package/dist/memory/model-router.js.map +1 -1
  50. package/dist/memory/predictive-memory.d.ts.map +1 -1
  51. package/dist/memory/predictive-memory.js +4 -3
  52. package/dist/memory/predictive-memory.js.map +1 -1
  53. package/dist/models/analytics.d.ts +93 -0
  54. package/dist/models/analytics.d.ts.map +1 -0
  55. package/dist/models/analytics.js +205 -0
  56. package/dist/models/analytics.js.map +1 -0
  57. package/dist/models/execution-profiles.d.ts +6 -0
  58. package/dist/models/execution-profiles.d.ts.map +1 -1
  59. package/dist/models/execution-profiles.js +15 -0
  60. package/dist/models/execution-profiles.js.map +1 -1
  61. package/dist/models/executor.d.ts.map +1 -1
  62. package/dist/models/executor.js +51 -17
  63. package/dist/models/executor.js.map +1 -1
  64. package/dist/models/index.d.ts +2 -0
  65. package/dist/models/index.d.ts.map +1 -1
  66. package/dist/models/index.js +2 -0
  67. package/dist/models/index.js.map +1 -1
  68. package/dist/models/router.d.ts +8 -0
  69. package/dist/models/router.d.ts.map +1 -1
  70. package/dist/models/router.js +39 -18
  71. package/dist/models/router.js.map +1 -1
  72. package/dist/models/types.d.ts +26 -0
  73. package/dist/models/types.d.ts.map +1 -1
  74. package/dist/models/types.js +39 -0
  75. package/dist/models/types.js.map +1 -1
  76. package/dist/models/unified-router.d.ts.map +1 -1
  77. package/dist/models/unified-router.js +4 -0
  78. package/dist/models/unified-router.js.map +1 -1
  79. package/dist/policies/database-manager.d.ts +1 -0
  80. package/dist/policies/database-manager.d.ts.map +1 -1
  81. package/dist/policies/database-manager.js +14 -2
  82. package/dist/policies/database-manager.js.map +1 -1
  83. package/dist/policies/policy-gate.d.ts +2 -2
  84. package/dist/policies/policy-gate.d.ts.map +1 -1
  85. package/dist/policies/policy-gate.js +6 -4
  86. package/dist/policies/policy-gate.js.map +1 -1
  87. package/dist/policies/policy-memory.d.ts +3 -0
  88. package/dist/policies/policy-memory.d.ts.map +1 -1
  89. package/dist/policies/policy-memory.js +11 -0
  90. package/dist/policies/policy-memory.js.map +1 -1
  91. package/dist/policies/schemas/policy.d.ts +3 -0
  92. package/dist/policies/schemas/policy.d.ts.map +1 -1
  93. package/dist/policies/schemas/policy.js +1 -0
  94. package/dist/policies/schemas/policy.js.map +1 -1
  95. package/dist/tasks/coordination.d.ts +18 -0
  96. package/dist/tasks/coordination.d.ts.map +1 -1
  97. package/dist/tasks/coordination.js +59 -1
  98. package/dist/tasks/coordination.js.map +1 -1
  99. package/dist/tasks/event-bus.d.ts +91 -0
  100. package/dist/tasks/event-bus.d.ts.map +1 -0
  101. package/dist/tasks/event-bus.js +123 -0
  102. package/dist/tasks/event-bus.js.map +1 -0
  103. package/dist/tasks/service.d.ts +5 -0
  104. package/dist/tasks/service.d.ts.map +1 -1
  105. package/dist/tasks/service.js +59 -0
  106. package/dist/tasks/service.js.map +1 -1
  107. package/dist/telemetry/session-telemetry.d.ts.map +1 -1
  108. package/dist/telemetry/session-telemetry.js +3 -0
  109. package/dist/telemetry/session-telemetry.js.map +1 -1
  110. package/dist/utils/concurrency-pool.d.ts +51 -0
  111. package/dist/utils/concurrency-pool.d.ts.map +1 -0
  112. package/dist/utils/concurrency-pool.js +80 -0
  113. package/dist/utils/concurrency-pool.js.map +1 -0
  114. package/dist/utils/system-resources.d.ts +47 -0
  115. package/dist/utils/system-resources.d.ts.map +1 -0
  116. package/dist/utils/system-resources.js +92 -0
  117. package/dist/utils/system-resources.js.map +1 -0
  118. package/docs/BENCHMARK_GAPS_AND_PLAN.md +146 -0
  119. package/docs/PARALLELISM_GAPS_AND_OPTIONS.md +422 -0
  120. package/docs/UAP_OPTIMIZATION_PLAN.md +638 -0
  121. package/package.json +4 -1
  122. package/templates/hooks/session-start.sh +8 -1
@@ -0,0 +1,286 @@
1
+ /**
2
+ * Dashboard Data Service
3
+ *
4
+ * Extracts structured data from all UAP subsystems for consumption
5
+ * by both the CLI dashboard and the web overlay.
6
+ */
7
+ import { existsSync, readFileSync, statSync } from 'fs';
8
+ import { join } from 'path';
9
+ import { execSync } from 'child_process';
10
+ import Database from 'better-sqlite3';
11
+ import { globalSessionStats } from '../mcp-router/session-stats.js';
12
+ // ── Data Gathering ──
13
+ export async function getDashboardData() {
14
+ const cwd = process.cwd();
15
+ return {
16
+ timestamp: new Date().toISOString(),
17
+ system: getSystemData(cwd),
18
+ policies: getPolicyData(cwd),
19
+ auditTrail: getAuditData(cwd),
20
+ memory: getMemoryData(cwd),
21
+ models: getModelData(cwd),
22
+ tasks: getTaskData(cwd),
23
+ coordination: getCoordData(cwd),
24
+ };
25
+ }
26
+ function getSystemData(cwd) {
27
+ let version = '?';
28
+ try {
29
+ const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf-8'));
30
+ version = pkg.version || '?';
31
+ }
32
+ catch {
33
+ /* ignore */
34
+ }
35
+ let branch = '?';
36
+ let dirty = 0;
37
+ try {
38
+ branch = execSync('git branch --show-current', {
39
+ encoding: 'utf-8',
40
+ cwd,
41
+ stdio: ['pipe', 'pipe', 'pipe'],
42
+ }).trim();
43
+ dirty = execSync('git status --porcelain', {
44
+ encoding: 'utf-8',
45
+ cwd,
46
+ stdio: ['pipe', 'pipe', 'pipe'],
47
+ })
48
+ .trim()
49
+ .split('\n')
50
+ .filter(Boolean).length;
51
+ }
52
+ catch {
53
+ /* ignore */
54
+ }
55
+ return { version, branch, dirty };
56
+ }
57
+ function getPolicyData(cwd) {
58
+ const dbPath = join(cwd, 'agents', 'data', 'memory', 'policies.db');
59
+ if (!existsSync(dbPath))
60
+ return [];
61
+ try {
62
+ const db = new Database(dbPath, { readonly: true });
63
+ const rows = db
64
+ .prepare('SELECT * FROM policies WHERE isActive = 1 ORDER BY priority DESC')
65
+ .all();
66
+ db.close();
67
+ return rows.map((r) => ({
68
+ id: r.id,
69
+ name: r.name,
70
+ category: r.category,
71
+ level: r.level,
72
+ enforcementStage: r.enforcementStage || 'pre-exec',
73
+ isActive: r.isActive === 1,
74
+ tags: typeof r.tags === 'string' ? JSON.parse(r.tags) : r.tags || [],
75
+ priority: r.priority,
76
+ }));
77
+ }
78
+ catch {
79
+ return [];
80
+ }
81
+ }
82
+ function getAuditData(cwd) {
83
+ const dbPath = join(cwd, 'agents', 'data', 'memory', 'policies.db');
84
+ if (!existsSync(dbPath))
85
+ return [];
86
+ try {
87
+ const db = new Database(dbPath, { readonly: true });
88
+ const hasTable = db
89
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='policy_executions'")
90
+ .all();
91
+ if (hasTable.length === 0) {
92
+ db.close();
93
+ return [];
94
+ }
95
+ const rows = db
96
+ .prepare('SELECT * FROM policy_executions ORDER BY executedAt DESC LIMIT 20')
97
+ .all();
98
+ db.close();
99
+ return rows.map((r) => ({
100
+ policyId: r.policyId,
101
+ operation: r.operation,
102
+ allowed: r.allowed === 1,
103
+ reason: r.reason || '',
104
+ executedAt: r.executedAt,
105
+ taskId: r.taskId,
106
+ }));
107
+ }
108
+ catch {
109
+ return [];
110
+ }
111
+ }
112
+ function getMemoryData(cwd) {
113
+ const memDbPath = join(cwd, 'agents/data/memory/short_term.db');
114
+ let l1Entries = 0;
115
+ let l1SizeKB = 0;
116
+ let l2Entries = 0;
117
+ let l4Entities = 0;
118
+ let l4Relationships = 0;
119
+ if (existsSync(memDbPath)) {
120
+ try {
121
+ l1SizeKB = Math.round(statSync(memDbPath).size / 1024);
122
+ const db = new Database(memDbPath, { readonly: true });
123
+ const hasMem = db
124
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='memories'")
125
+ .all();
126
+ if (hasMem.length > 0) {
127
+ l1Entries = db.prepare('SELECT COUNT(*) as c FROM memories').get().c;
128
+ }
129
+ const hasSess = db
130
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='session_memories'")
131
+ .all();
132
+ if (hasSess.length > 0) {
133
+ l2Entries = db.prepare('SELECT COUNT(*) as c FROM session_memories').get().c;
134
+ }
135
+ const hasEnt = db
136
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='entities'")
137
+ .all();
138
+ if (hasEnt.length > 0) {
139
+ l4Entities = db.prepare('SELECT COUNT(*) as c FROM entities').get().c;
140
+ }
141
+ const hasRel = db
142
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='relationships'")
143
+ .all();
144
+ if (hasRel.length > 0) {
145
+ l4Relationships = db.prepare('SELECT COUNT(*) as c FROM relationships').get().c;
146
+ }
147
+ db.close();
148
+ }
149
+ catch {
150
+ /* ignore */
151
+ }
152
+ }
153
+ let l3Status = 'Stopped';
154
+ let l3Uptime = '';
155
+ try {
156
+ const out = execSync('docker ps --filter name=qdrant --format "{{.Status}}"', {
157
+ encoding: 'utf-8',
158
+ stdio: ['pipe', 'pipe', 'pipe'],
159
+ }).trim();
160
+ if (out) {
161
+ l3Status = 'Running';
162
+ l3Uptime = out;
163
+ }
164
+ }
165
+ catch {
166
+ /* ignore */
167
+ }
168
+ const stats = globalSessionStats.getSummary();
169
+ return {
170
+ l1: { entries: l1Entries, sizeKB: l1SizeKB },
171
+ l2: { entries: l2Entries },
172
+ l3: { status: l3Status, uptime: l3Uptime },
173
+ l4: { entities: l4Entities, relationships: l4Relationships },
174
+ compression: {
175
+ rawBytes: stats.totalRawBytes,
176
+ contextBytes: stats.totalContextBytes,
177
+ savingsPercent: stats.savingsPercent,
178
+ totalCalls: stats.totalCalls,
179
+ },
180
+ };
181
+ }
182
+ function getModelData(cwd) {
183
+ const configPath = join(cwd, '.uap.json');
184
+ let roles = { planner: 'opus-4.6', executor: 'qwen35', reviewer: 'opus-4.6', fallback: 'qwen35' };
185
+ let strategy = 'balanced';
186
+ if (existsSync(configPath)) {
187
+ try {
188
+ const raw = JSON.parse(readFileSync(configPath, 'utf-8'));
189
+ if (raw.multiModel?.roles) {
190
+ roles = { ...roles, ...raw.multiModel.roles };
191
+ }
192
+ if (raw.multiModel?.routingStrategy) {
193
+ strategy = raw.multiModel.routingStrategy;
194
+ }
195
+ }
196
+ catch {
197
+ /* ignore */
198
+ }
199
+ }
200
+ // Session usage from analytics DB
201
+ const analyticsDbPath = join(cwd, 'agents', 'data', 'memory', 'model_analytics.db');
202
+ let sessionUsage = [];
203
+ let totalCost = 0;
204
+ if (existsSync(analyticsDbPath)) {
205
+ try {
206
+ const db = new Database(analyticsDbPath, { readonly: true });
207
+ const rows = db
208
+ .prepare(`
209
+ SELECT modelId, COUNT(*) as taskCount, SUM(tokensIn) as totalTokensIn,
210
+ SUM(tokensOut) as totalTokensOut, SUM(cost) as totalCost,
211
+ CAST(SUM(success) AS REAL) / COUNT(*) as successRate
212
+ FROM task_outcomes GROUP BY modelId ORDER BY taskCount DESC
213
+ `)
214
+ .all();
215
+ sessionUsage = rows.map((r) => ({
216
+ modelId: r.modelId,
217
+ taskCount: r.taskCount,
218
+ totalTokensIn: r.totalTokensIn,
219
+ totalTokensOut: r.totalTokensOut,
220
+ totalCost: r.totalCost,
221
+ successRate: r.successRate,
222
+ }));
223
+ const costRow = db.prepare('SELECT SUM(cost) as total FROM task_outcomes').get();
224
+ totalCost = costRow?.total || 0;
225
+ db.close();
226
+ }
227
+ catch {
228
+ /* ignore */
229
+ }
230
+ }
231
+ return { roles, strategy, sessionUsage, totalCost };
232
+ }
233
+ function getTaskData(cwd) {
234
+ const taskDbPath = join(cwd, '.uap/tasks/tasks.db');
235
+ const result = { total: 0, done: 0, inProgress: 0, blocked: 0, open: 0 };
236
+ if (existsSync(taskDbPath)) {
237
+ try {
238
+ const db = new Database(taskDbPath, { readonly: true });
239
+ result.total = db.prepare('SELECT COUNT(*) as c FROM tasks').get().c;
240
+ result.done = db
241
+ .prepare("SELECT COUNT(*) as c FROM tasks WHERE status='done' OR status='wont_do'")
242
+ .get().c;
243
+ result.inProgress = db.prepare("SELECT COUNT(*) as c FROM tasks WHERE status='in_progress'").get().c;
244
+ result.blocked = db.prepare("SELECT COUNT(*) as c FROM tasks WHERE status='blocked'").get().c;
245
+ result.open = db.prepare("SELECT COUNT(*) as c FROM tasks WHERE status='open'").get().c;
246
+ db.close();
247
+ }
248
+ catch {
249
+ /* ignore */
250
+ }
251
+ }
252
+ return result;
253
+ }
254
+ function getCoordData(cwd) {
255
+ const coordDbPath = join(cwd, 'agents/data/coordination/coordination.db');
256
+ const result = { activeAgents: 0, activeClaims: 0, pendingDeploys: 0 };
257
+ if (existsSync(coordDbPath)) {
258
+ try {
259
+ const db = new Database(coordDbPath, { readonly: true });
260
+ const hasAgents = db
261
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='agent_registry'")
262
+ .all();
263
+ if (hasAgents.length > 0) {
264
+ result.activeAgents = db.prepare("SELECT COUNT(*) as c FROM agent_registry WHERE status='active'").get().c;
265
+ }
266
+ const hasClaims = db
267
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='work_claims'")
268
+ .all();
269
+ if (hasClaims.length > 0) {
270
+ result.activeClaims = db.prepare("SELECT COUNT(*) as c FROM work_claims WHERE status='active'").get().c;
271
+ }
272
+ const hasDQ = db
273
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='deploy_queue'")
274
+ .all();
275
+ if (hasDQ.length > 0) {
276
+ result.pendingDeploys = db.prepare("SELECT COUNT(*) as c FROM deploy_queue WHERE status='pending'").get().c;
277
+ }
278
+ db.close();
279
+ }
280
+ catch {
281
+ /* ignore */
282
+ }
283
+ }
284
+ return result;
285
+ }
286
+ //# sourceMappingURL=data-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-service.js","sourceRoot":"","sources":["../../src/dashboard/data-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { getDashboardData } from './data-service.js';
2
+ export type { DashboardData, PolicyData, MemoryData, ModelData, TaskData, CoordData, SystemData, AuditEntry, } from './data-service.js';
3
+ export { startDashboardServer } from './server.js';
4
+ export type { DashboardServerOptions } from './server.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dashboard/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EACV,aAAa,EACb,UAAU,EACV,UAAU,EACV,SAAS,EACT,QAAQ,EACR,SAAS,EACT,UAAU,EACV,UAAU,GACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { getDashboardData } from './data-service.js';
2
+ export { startDashboardServer } from './server.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dashboard/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAWrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Dashboard Server
3
+ *
4
+ * Lightweight HTTP + WebSocket server for the web overlay.
5
+ * Serves JSON data from getDashboardData() and pushes real-time updates.
6
+ */
7
+ export interface DashboardServerOptions {
8
+ port?: number;
9
+ host?: string;
10
+ updateIntervalMs?: number;
11
+ }
12
+ export declare function startDashboardServer(options?: DashboardServerOptions): {
13
+ close: () => void;
14
+ };
15
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,sBAA2B,GAAG;IAAE,KAAK,EAAE,MAAM,IAAI,CAAA;CAAE,CAgJhG"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Dashboard Server
3
+ *
4
+ * Lightweight HTTP + WebSocket server for the web overlay.
5
+ * Serves JSON data from getDashboardData() and pushes real-time updates.
6
+ */
7
+ import { createServer } from 'http';
8
+ import { WebSocketServer, WebSocket } from 'ws';
9
+ import { readFileSync, existsSync } from 'fs';
10
+ import { join } from 'path';
11
+ import { getDashboardData } from './data-service.js';
12
+ import { getPolicyMemoryManager } from '../policies/policy-memory.js';
13
+ const DASHBOARD_HTML_PATH = join(import.meta.dirname || '.', '../../web/dashboard.html');
14
+ export function startDashboardServer(options = {}) {
15
+ const port = options.port || 3847;
16
+ const host = options.host || 'localhost';
17
+ const updateInterval = options.updateIntervalMs || 2000;
18
+ const server = createServer(async (req, res) => {
19
+ const url = req.url || '/';
20
+ // CORS headers
21
+ res.setHeader('Access-Control-Allow-Origin', '*');
22
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
23
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
24
+ if (req.method === 'OPTIONS') {
25
+ res.writeHead(204);
26
+ res.end();
27
+ return;
28
+ }
29
+ try {
30
+ // API: Get dashboard data
31
+ if (url === '/api/dashboard') {
32
+ const data = await getDashboardData();
33
+ res.writeHead(200, { 'Content-Type': 'application/json' });
34
+ res.end(JSON.stringify(data));
35
+ return;
36
+ }
37
+ // API: Toggle policy
38
+ if (url.startsWith('/api/policy/') && url.endsWith('/toggle') && req.method === 'POST') {
39
+ const id = url.split('/')[3];
40
+ const memory = getPolicyMemoryManager();
41
+ const policy = await memory.getPolicy(id);
42
+ if (!policy) {
43
+ res.writeHead(404, { 'Content-Type': 'application/json' });
44
+ res.end(JSON.stringify({ error: 'Policy not found' }));
45
+ return;
46
+ }
47
+ await memory.togglePolicy(id, !policy.isActive);
48
+ res.writeHead(200, { 'Content-Type': 'application/json' });
49
+ res.end(JSON.stringify({ id, isActive: !policy.isActive }));
50
+ return;
51
+ }
52
+ // API: Set policy stage
53
+ if (url.startsWith('/api/policy/') && url.endsWith('/stage') && req.method === 'POST') {
54
+ const id = url.split('/')[3];
55
+ const body = await readBody(req);
56
+ const { stage } = JSON.parse(body);
57
+ const validStages = ['pre-exec', 'post-exec', 'review', 'always'];
58
+ if (!validStages.includes(stage)) {
59
+ res.writeHead(400, { 'Content-Type': 'application/json' });
60
+ res.end(JSON.stringify({ error: `Invalid stage. Must be: ${validStages.join(', ')}` }));
61
+ return;
62
+ }
63
+ const memory = getPolicyMemoryManager();
64
+ await memory.setEnforcementStage(id, stage);
65
+ res.writeHead(200, { 'Content-Type': 'application/json' });
66
+ res.end(JSON.stringify({ id, enforcementStage: stage }));
67
+ return;
68
+ }
69
+ // API: Set policy level
70
+ if (url.startsWith('/api/policy/') && url.endsWith('/level') && req.method === 'POST') {
71
+ const id = url.split('/')[3];
72
+ const body = await readBody(req);
73
+ const { level } = JSON.parse(body);
74
+ const validLevels = ['REQUIRED', 'RECOMMENDED', 'OPTIONAL'];
75
+ if (!validLevels.includes(level)) {
76
+ res.writeHead(400, { 'Content-Type': 'application/json' });
77
+ res.end(JSON.stringify({ error: `Invalid level. Must be: ${validLevels.join(', ')}` }));
78
+ return;
79
+ }
80
+ const memory = getPolicyMemoryManager();
81
+ await memory.setLevel(id, level);
82
+ res.writeHead(200, { 'Content-Type': 'application/json' });
83
+ res.end(JSON.stringify({ id, level }));
84
+ return;
85
+ }
86
+ // Serve HTML dashboard
87
+ if (url === '/' || url === '/index.html') {
88
+ if (existsSync(DASHBOARD_HTML_PATH)) {
89
+ const html = readFileSync(DASHBOARD_HTML_PATH, 'utf-8');
90
+ res.writeHead(200, { 'Content-Type': 'text/html' });
91
+ res.end(html);
92
+ }
93
+ else {
94
+ res.writeHead(200, { 'Content-Type': 'text/html' });
95
+ res.end('<html><body><h1>UAP Dashboard</h1><p>web/dashboard.html not found. Run from project root.</p></body></html>');
96
+ }
97
+ return;
98
+ }
99
+ // 404
100
+ res.writeHead(404, { 'Content-Type': 'application/json' });
101
+ res.end(JSON.stringify({ error: 'Not found' }));
102
+ }
103
+ catch (error) {
104
+ res.writeHead(500, { 'Content-Type': 'application/json' });
105
+ res.end(JSON.stringify({ error: error instanceof Error ? error.message : 'Internal error' }));
106
+ }
107
+ });
108
+ // WebSocket server for real-time updates
109
+ const wss = new WebSocketServer({ server });
110
+ const pushInterval = setInterval(async () => {
111
+ if (wss.clients.size === 0)
112
+ return;
113
+ try {
114
+ const data = await getDashboardData();
115
+ const payload = JSON.stringify(data);
116
+ for (const client of wss.clients) {
117
+ if (client.readyState === WebSocket.OPEN) {
118
+ client.send(payload);
119
+ }
120
+ }
121
+ }
122
+ catch {
123
+ /* ignore push errors */
124
+ }
125
+ }, updateInterval);
126
+ wss.on('connection', async (ws) => {
127
+ // Send initial state immediately
128
+ try {
129
+ const data = await getDashboardData();
130
+ ws.send(JSON.stringify(data));
131
+ }
132
+ catch {
133
+ /* ignore */
134
+ }
135
+ });
136
+ server.listen(port, host, () => {
137
+ console.log(`UAP Dashboard server running at http://${host}:${port}`);
138
+ console.log(`WebSocket available at ws://${host}:${port}`);
139
+ });
140
+ return {
141
+ close: () => {
142
+ clearInterval(pushInterval);
143
+ wss.close();
144
+ server.close();
145
+ },
146
+ };
147
+ }
148
+ function readBody(req) {
149
+ return new Promise((resolve, reject) => {
150
+ let body = '';
151
+ req.on('data', (chunk) => {
152
+ body += chunk;
153
+ });
154
+ req.on('end', () => resolve(body));
155
+ req.on('error', reject);
156
+ });
157
+ }
158
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"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"}
@@ -23,11 +23,20 @@ export interface StatsSummary {
23
23
  totalRawBytes: number;
24
24
  savingsRatio: number;
25
25
  savingsPercent: string;
26
+ modelTokenBudget: number;
27
+ modelTokensConsumed: number;
28
+ compressionEvents: number;
26
29
  byTool: ToolBreakdown[];
27
30
  }
28
31
  export declare class SessionStats {
29
32
  private startTime;
30
33
  private calls;
34
+ private _modelTokenBudget;
35
+ private _modelTokensConsumed;
36
+ private _compressionEvents;
37
+ setModelTokenBudget(budget: number): void;
38
+ addModelTokensConsumed(tokens: number): void;
39
+ recordCompressionEvent(): void;
31
40
  record(tool: string, rawBytes: number, contextBytes: number): void;
32
41
  getSummary(): StatsSummary;
33
42
  reset(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"session-stats.d.ts","sourceRoot":"","sources":["../../src/mcp-router/session-stats.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,KAAK,CAAwB;IAErC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IASlE,UAAU,IAAI,YAAY;IAiC1B,KAAK,IAAI,IAAI;IAKb,QAAQ,IAAI,aAAa,CAAC,cAAc,CAAC;CAG1C;AAED,eAAO,MAAM,kBAAkB,cAAqB,CAAC"}
1
+ {"version":3,"file":"session-stats.d.ts","sourceRoot":"","sources":["../../src/mcp-router/session-stats.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,kBAAkB,CAAK;IAE/B,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIzC,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI5C,sBAAsB,IAAI,IAAI;IAI9B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IASlE,UAAU,IAAI,YAAY;IAmC1B,KAAK,IAAI,IAAI;IAQb,QAAQ,IAAI,aAAa,CAAC,cAAc,CAAC;CAG1C;AAED,eAAO,MAAM,kBAAkB,cAAqB,CAAC"}
@@ -7,6 +7,18 @@
7
7
  export class SessionStats {
8
8
  startTime = Date.now();
9
9
  calls = [];
10
+ _modelTokenBudget = 0;
11
+ _modelTokensConsumed = 0;
12
+ _compressionEvents = 0;
13
+ setModelTokenBudget(budget) {
14
+ this._modelTokenBudget = budget;
15
+ }
16
+ addModelTokensConsumed(tokens) {
17
+ this._modelTokensConsumed += tokens;
18
+ }
19
+ recordCompressionEvent() {
20
+ this._compressionEvents++;
21
+ }
10
22
  record(tool, rawBytes, contextBytes) {
11
23
  this.calls.push({
12
24
  tool,
@@ -19,9 +31,7 @@ export class SessionStats {
19
31
  const totalRawBytes = this.calls.reduce((s, c) => s + c.rawBytes, 0);
20
32
  const totalContextBytes = this.calls.reduce((s, c) => s + c.contextBytes, 0);
21
33
  const savingsRatio = totalContextBytes > 0 ? totalRawBytes / totalContextBytes : 1;
22
- const savingsPercent = totalRawBytes > 0
23
- ? `${Math.round((1 - totalContextBytes / totalRawBytes) * 100)}%`
24
- : '0%';
34
+ const savingsPercent = totalRawBytes > 0 ? `${Math.round((1 - totalContextBytes / totalRawBytes) * 100)}%` : '0%';
25
35
  // Aggregate by tool
26
36
  const toolMap = new Map();
27
37
  for (const call of this.calls) {
@@ -41,12 +51,18 @@ export class SessionStats {
41
51
  totalRawBytes,
42
52
  savingsRatio: Math.round(savingsRatio * 10) / 10,
43
53
  savingsPercent,
54
+ modelTokenBudget: this._modelTokenBudget,
55
+ modelTokensConsumed: this._modelTokensConsumed,
56
+ compressionEvents: this._compressionEvents,
44
57
  byTool,
45
58
  };
46
59
  }
47
60
  reset() {
48
61
  this.startTime = Date.now();
49
62
  this.calls = [];
63
+ this._modelTokenBudget = 0;
64
+ this._modelTokensConsumed = 0;
65
+ this._compressionEvents = 0;
50
66
  }
51
67
  getCalls() {
52
68
  return this.calls;
@@ -1 +1 @@
1
- {"version":3,"file":"session-stats.js","sourceRoot":"","sources":["../../src/mcp-router/session-stats.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA0BH,MAAM,OAAO,YAAY;IACf,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,GAAqB,EAAE,CAAC;IAErC,MAAM,CAAC,IAAY,EAAE,QAAgB,EAAE,YAAoB;QACzD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACd,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,QAAQ;YACR,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IAED,UAAU;QACR,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACrE,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QAC7E,MAAM,YAAY,GAAG,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,MAAM,cAAc,GAAG,aAAa,GAAG,CAAC;YACtC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,iBAAiB,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,GAAG;YACjE,CAAC,CAAC,IAAI,CAAC;QAET,oBAAoB;QACpB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqE,CAAC;QAC7F,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YACtF,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,QAAQ,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC;YAC3C,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;aACzC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;aAC1C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;QAEnD,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS;YACrC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YAC7B,iBAAiB;YACjB,aAAa;YACb,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,GAAG,EAAE;YAChD,cAAc;YACd,MAAM;SACP,CAAC;IACJ,CAAC;IAED,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"session-stats.js","sourceRoot":"","sources":["../../src/mcp-router/session-stats.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,7 @@ export interface TaskMetadata {
39
39
  category?: string;
40
40
  historical_uap_benefit?: number;
41
41
  cacheKey?: string;
42
+ modelContextBudget?: number;
42
43
  }
43
44
  export interface HistoricalData {
44
45
  taskType: string;
@@ -1 +1 @@
1
- {"version":3,"file":"adaptive-context.d.ts","sourceRoot":"","sources":["../../src/memory/adaptive-context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adaptive-context.d.ts","sourceRoot":"","sources":["../../src/memory/adaptive-context.ts"],"names":[],"mappings":"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"}
@@ -895,6 +895,10 @@ export function decideContextLevel(instruction, metadata = {}) {
895
895
  if (timeoutSec < 120) {
896
896
  const cappedSections = [];
897
897
  let tokenBudget = TIME_CRITICAL_MAX_TOKENS;
898
+ // Respect model context budget if provided
899
+ if (metadata?.modelContextBudget && metadata.modelContextBudget < tokenBudget) {
900
+ tokenBudget = metadata.modelContextBudget;
901
+ }
898
902
  for (const section of relevantSections) {
899
903
  const sectionTokens = CONTEXT_SECTIONS[section]?.tokens || 0;
900
904
  if (tokenBudget - sectionTokens >= 0) {