@miller-tech/uap 1.5.4 → 1.5.6
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/dist/.tsbuildinfo +1 -0
- package/dist/bin/cli.js +6 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/llama-server-optimize.js +0 -0
- package/dist/bin/policy.js +0 -0
- package/dist/bin/tool-calls.js +0 -0
- package/dist/cli/dashboard.d.ts +1 -0
- package/dist/cli/dashboard.d.ts.map +1 -1
- package/dist/cli/dashboard.js.map +1 -1
- package/dist/memory/active-context.d.ts +65 -0
- package/dist/memory/active-context.d.ts.map +1 -0
- package/dist/memory/active-context.js +126 -0
- package/dist/memory/active-context.js.map +1 -0
- package/dist/memory/dedup-detector.d.ts +57 -0
- package/dist/memory/dedup-detector.d.ts.map +1 -0
- package/dist/memory/dedup-detector.js +107 -0
- package/dist/memory/dedup-detector.js.map +1 -0
- package/dist/memory/dedup-memory.d.ts +89 -0
- package/dist/memory/dedup-memory.d.ts.map +1 -0
- package/dist/memory/dedup-memory.js +173 -0
- package/dist/memory/dedup-memory.js.map +1 -0
- package/dist/memory/merge-claude-md.d.ts +45 -0
- package/dist/memory/merge-claude-md.d.ts.map +1 -0
- package/dist/memory/merge-claude-md.js +118 -0
- package/dist/memory/merge-claude-md.js.map +1 -0
- package/dist/memory/patterns.d.ts +37 -0
- package/dist/memory/patterns.d.ts.map +1 -0
- package/dist/memory/patterns.js +81 -0
- package/dist/memory/patterns.js.map +1 -0
- package/dist/memory/semantic-edge-graph.d.ts +86 -0
- package/dist/memory/semantic-edge-graph.d.ts.map +1 -0
- package/dist/memory/semantic-edge-graph.js +168 -0
- package/dist/memory/semantic-edge-graph.js.map +1 -0
- package/dist/memory/semantic-retrieval.d.ts +70 -0
- package/dist/memory/semantic-retrieval.d.ts.map +1 -0
- package/dist/memory/semantic-retrieval.js +112 -0
- package/dist/memory/semantic-retrieval.js.map +1 -0
- package/dist/memory/smart-consolidator.d.ts +53 -0
- package/dist/memory/smart-consolidator.d.ts.map +1 -0
- package/dist/memory/smart-consolidator.js +144 -0
- package/dist/memory/smart-consolidator.js.map +1 -0
- package/dist/memory/view-memory.d.ts +80 -0
- package/dist/memory/view-memory.d.ts.map +1 -0
- package/dist/memory/view-memory.js +130 -0
- package/dist/memory/view-memory.js.map +1 -0
- package/dist/memory/wrapped-memory.d.ts +77 -0
- package/dist/memory/wrapped-memory.d.ts.map +1 -0
- package/dist/memory/wrapped-memory.js +127 -0
- package/dist/memory/wrapped-memory.js.map +1 -0
- package/dist/telemetry/session-telemetry.d.ts +5 -0
- package/dist/telemetry/session-telemetry.d.ts.map +1 -1
- package/dist/telemetry/session-telemetry.js +243 -0
- package/dist/telemetry/session-telemetry.js.map +1 -1
- package/dist/utils/adaptive-cache.d.ts +67 -0
- package/dist/utils/adaptive-cache.d.ts.map +1 -0
- package/dist/utils/adaptive-cache.js +149 -0
- package/dist/utils/adaptive-cache.js.map +1 -0
- package/dist/utils/concurrency.d.ts +33 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +88 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/file-discovery.d.ts +38 -0
- package/dist/utils/file-discovery.d.ts.map +1 -0
- package/dist/utils/file-discovery.js +100 -0
- package/dist/utils/file-discovery.js.map +1 -0
- package/dist/utils/performance-monitor.d.ts +52 -0
- package/dist/utils/performance-monitor.d.ts.map +1 -0
- package/dist/utils/performance-monitor.js +103 -0
- package/dist/utils/performance-monitor.js.map +1 -0
- package/package.json +5 -3
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wrapped Memory Module for UAP
|
|
3
|
+
*
|
|
4
|
+
* Provides a wrapper interface for memory storage with additional utilities.
|
|
5
|
+
*/
|
|
6
|
+
const DEFAULT_CONFIG = {
|
|
7
|
+
autoId: true,
|
|
8
|
+
idPrefix: 'mem-',
|
|
9
|
+
defaultType: 'general',
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Wrapped Memory
|
|
13
|
+
* A wrapper around memory storage with convenience methods
|
|
14
|
+
*/
|
|
15
|
+
export class WrappedMemory {
|
|
16
|
+
config;
|
|
17
|
+
storage = new Map();
|
|
18
|
+
constructor(config = {}) {
|
|
19
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Add a memory entry
|
|
23
|
+
*/
|
|
24
|
+
add(entry) {
|
|
25
|
+
const id = entry.id ||
|
|
26
|
+
(this.config.autoId
|
|
27
|
+
? `${this.config.idPrefix}${Date.now()}-${Math.random().toString(36).slice(2, 9)}`
|
|
28
|
+
: `${this.config.idPrefix}${Date.now()}-${Math.random().toString(36).slice(2, 9)}`);
|
|
29
|
+
const fullEntry = {
|
|
30
|
+
...entry,
|
|
31
|
+
id,
|
|
32
|
+
timestamp: entry.timestamp || new Date().toISOString(),
|
|
33
|
+
};
|
|
34
|
+
this.storage.set(id, fullEntry);
|
|
35
|
+
return id;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get a memory entry by ID
|
|
39
|
+
*/
|
|
40
|
+
get(id) {
|
|
41
|
+
return this.storage.get(id) || null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Update a memory entry
|
|
45
|
+
*/
|
|
46
|
+
update(id, content, type, importance) {
|
|
47
|
+
const existing = this.storage.get(id);
|
|
48
|
+
if (!existing)
|
|
49
|
+
return false;
|
|
50
|
+
const updated = {
|
|
51
|
+
...existing,
|
|
52
|
+
content,
|
|
53
|
+
type: type || existing.type,
|
|
54
|
+
importance: importance ?? existing.importance,
|
|
55
|
+
timestamp: new Date().toISOString(),
|
|
56
|
+
};
|
|
57
|
+
this.storage.set(id, updated);
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Delete a memory entry
|
|
62
|
+
*/
|
|
63
|
+
delete(id) {
|
|
64
|
+
return this.storage.delete(id);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get all entries
|
|
68
|
+
*/
|
|
69
|
+
getAll() {
|
|
70
|
+
return Array.from(this.storage.values());
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Query entries by type
|
|
74
|
+
*/
|
|
75
|
+
getByType(type) {
|
|
76
|
+
return this.getAll().filter((e) => e.type === type);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Search content
|
|
80
|
+
*/
|
|
81
|
+
search(query, limit = 10) {
|
|
82
|
+
const lowerQuery = query.toLowerCase();
|
|
83
|
+
return this.getAll()
|
|
84
|
+
.filter((e) => e.content.toLowerCase().includes(lowerQuery))
|
|
85
|
+
.slice(0, limit);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get entries by date range
|
|
89
|
+
*/
|
|
90
|
+
getByDateRange(start, end, limit) {
|
|
91
|
+
return this.getAll()
|
|
92
|
+
.filter((e) => {
|
|
93
|
+
const ts = new Date(e.timestamp);
|
|
94
|
+
return ts >= start && ts <= end;
|
|
95
|
+
})
|
|
96
|
+
.slice(0, limit);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Count entries
|
|
100
|
+
*/
|
|
101
|
+
count() {
|
|
102
|
+
return this.storage.size;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Clear all entries
|
|
106
|
+
*/
|
|
107
|
+
clear() {
|
|
108
|
+
this.storage.clear();
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Export all data as JSON
|
|
112
|
+
*/
|
|
113
|
+
export() {
|
|
114
|
+
return JSON.stringify(Array.from(this.storage.values()), null, 2);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Import data from JSON
|
|
118
|
+
*/
|
|
119
|
+
import(data) {
|
|
120
|
+
const entries = JSON.parse(data);
|
|
121
|
+
this.storage.clear();
|
|
122
|
+
for (const entry of entries) {
|
|
123
|
+
this.storage.set(entry.id, entry);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=wrapped-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrapped-memory.js","sourceRoot":"","sources":["../../src/memory/wrapped-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,5 +52,10 @@ export declare function backupFile(filePath: string, projectRoot?: string): stri
|
|
|
52
52
|
export declare function backupDirectory(dirPath: string, projectRoot?: string): Promise<number>;
|
|
53
53
|
export declare function showActivePolicies(): void;
|
|
54
54
|
export declare function resetStats(): void;
|
|
55
|
+
export declare function startDashboard(intervalMs?: number, showWorkGraph?: boolean): void;
|
|
56
|
+
export declare function stopDashboard(): void;
|
|
57
|
+
export declare function dashboardPause(): void;
|
|
58
|
+
export declare function dashboardResume(): void;
|
|
59
|
+
export declare function showDashboardSnapshot(showWorkGraph?: boolean): void;
|
|
55
60
|
export {};
|
|
56
61
|
//# sourceMappingURL=session-telemetry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-telemetry.d.ts","sourceRoot":"","sources":["../../src/telemetry/session-telemetry.ts"],"names":[],"mappings":"AAiFA,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"session-telemetry.d.ts","sourceRoot":"","sources":["../../src/telemetry/session-telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -58,6 +58,8 @@ function getStats() {
|
|
|
58
58
|
costs: [],
|
|
59
59
|
totalCostUsd: 0,
|
|
60
60
|
estimatedCostWithoutUap: 0,
|
|
61
|
+
maxEntries: 100, // LRU eviction limit
|
|
62
|
+
lastCleanup: Date.now(),
|
|
61
63
|
};
|
|
62
64
|
}
|
|
63
65
|
return _stats;
|
|
@@ -807,4 +809,245 @@ export function showActivePolicies() {
|
|
|
807
809
|
export function resetStats() {
|
|
808
810
|
_stats = null;
|
|
809
811
|
}
|
|
812
|
+
// ─── Memory Management & LRU Eviction ───
|
|
813
|
+
function trimMapLRU(map, maxSize) {
|
|
814
|
+
if (map.size <= maxSize)
|
|
815
|
+
return;
|
|
816
|
+
const entries = [...map.entries()];
|
|
817
|
+
// Sort by last access time (add lastAccessed property to your types)
|
|
818
|
+
entries.sort((a, b) => {
|
|
819
|
+
const aLastAccessed = a[1].lastAccessed || 0;
|
|
820
|
+
const bLastAccessed = b[1].lastAccessed || 0;
|
|
821
|
+
return aLastAccessed - bLastAccessed;
|
|
822
|
+
});
|
|
823
|
+
// Remove oldest half
|
|
824
|
+
const toRemove = Math.floor(entries.length / 2);
|
|
825
|
+
for (let i = 0; i < toRemove; i++) {
|
|
826
|
+
map.delete(entries[i][0]);
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
function cleanupCompletedItems() {
|
|
830
|
+
const s = getStats();
|
|
831
|
+
const oneHourAgo = Date.now() - 3600000;
|
|
832
|
+
// Remove completed agents older than 1 hour
|
|
833
|
+
for (const [id, agent] of s.agents) {
|
|
834
|
+
if (agent.status === 'done' && agent.endTime && agent.endTime < oneHourAgo) {
|
|
835
|
+
s.agents.delete(id);
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
// Remove completed tasks older than 1 hour
|
|
839
|
+
for (const [id, task] of s.tasks) {
|
|
840
|
+
if ((task.status === 'done' || task.status === 'failed') &&
|
|
841
|
+
task.endTime &&
|
|
842
|
+
task.endTime < oneHourAgo) {
|
|
843
|
+
s.tasks.delete(id);
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
// Trim Maps to max size using LRU
|
|
847
|
+
trimMapLRU(s.agents, Math.floor(s.maxEntries * 0.5));
|
|
848
|
+
trimMapLRU(s.tasks, Math.floor(s.maxEntries * 0.3));
|
|
849
|
+
trimMapLRU(s.skills, Math.floor(s.maxEntries * 0.1));
|
|
850
|
+
trimMapLRU(s.patterns, Math.floor(s.maxEntries * 0.1));
|
|
851
|
+
s.lastCleanup = Date.now();
|
|
852
|
+
}
|
|
853
|
+
function scheduleCleanup() {
|
|
854
|
+
const s = getStats();
|
|
855
|
+
// Run cleanup every 5 minutes or when memory pressure detected
|
|
856
|
+
if (Date.now() - s.lastCleanup > 300000) {
|
|
857
|
+
cleanupCompletedItems();
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
let dashboardState = null;
|
|
861
|
+
let dashboardInterval = null;
|
|
862
|
+
const DASHBOARD_CONFIG = {
|
|
863
|
+
BASE_INTERVAL: 2000,
|
|
864
|
+
IDLE_THRESHOLD: 3,
|
|
865
|
+
MAX_IDLE_INTERVAL: 30000,
|
|
866
|
+
ACTIVITY_THRESHOLD: 2, // Consider active if >2 agents/tasks working
|
|
867
|
+
};
|
|
868
|
+
function generateDashboardHash(s) {
|
|
869
|
+
const activeAgents = [...s.agents.values()].filter((a) => a.status === 'working').length;
|
|
870
|
+
const activeTasks = [...s.tasks.values()].filter((t) => t.status === 'in_progress').length;
|
|
871
|
+
return `${s.sessionId}-${activeAgents}-${activeTasks}-${Date.now() % 1000}`;
|
|
872
|
+
}
|
|
873
|
+
function shouldUpdateDashboard(s) {
|
|
874
|
+
const activeAgents = [...s.agents.values()].filter((a) => a.status === 'working').length;
|
|
875
|
+
const activeTasks = [...s.tasks.values()].filter((t) => t.status === 'in_progress').length;
|
|
876
|
+
return activeAgents > 0 || activeTasks > 0 || s.errors > 0;
|
|
877
|
+
}
|
|
878
|
+
export function startDashboard(intervalMs = 2000, showWorkGraph = false) {
|
|
879
|
+
if (dashboardInterval) {
|
|
880
|
+
console.log(`${DIM}[DASHBOARD]${RESET} Already running`);
|
|
881
|
+
return;
|
|
882
|
+
}
|
|
883
|
+
const s = getStats();
|
|
884
|
+
const initialHash = generateDashboardHash(s);
|
|
885
|
+
dashboardState = {
|
|
886
|
+
lastDataHash: initialHash,
|
|
887
|
+
consecutiveEmptyUpdates: 0,
|
|
888
|
+
idleTimeout: null,
|
|
889
|
+
showWorkGraph,
|
|
890
|
+
};
|
|
891
|
+
console.log(`${GREEN}[DASHBOARD]${RESET} ${DIM}Starting adaptive dashboard (base: ${intervalMs}ms)${RESET}${showWorkGraph ? ` ${DIM}(with work graph)${RESET}` : ''}`);
|
|
892
|
+
const updateDashboard = () => {
|
|
893
|
+
if (!dashboardState)
|
|
894
|
+
return;
|
|
895
|
+
const currentHash = generateDashboardHash(s);
|
|
896
|
+
const shouldUpdate = currentHash !== dashboardState.lastDataHash || shouldUpdateDashboard(s);
|
|
897
|
+
if (shouldUpdate) {
|
|
898
|
+
renderDashboard(s, intervalMs);
|
|
899
|
+
dashboardState.lastDataHash = currentHash;
|
|
900
|
+
dashboardState.consecutiveEmptyUpdates = 0;
|
|
901
|
+
// Reset idle timeout on activity
|
|
902
|
+
if (dashboardState.idleTimeout) {
|
|
903
|
+
clearTimeout(dashboardState.idleTimeout);
|
|
904
|
+
dashboardState.idleTimeout = null;
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
else {
|
|
908
|
+
dashboardState.consecutiveEmptyUpdates++;
|
|
909
|
+
// Extend interval on idle: 2s → 4s → 8s → max 30s
|
|
910
|
+
if (dashboardState.consecutiveEmptyUpdates >= DASHBOARD_CONFIG.IDLE_THRESHOLD) {
|
|
911
|
+
const newInterval = Math.min(intervalMs *
|
|
912
|
+
Math.pow(2, dashboardState.consecutiveEmptyUpdates - DASHBOARD_CONFIG.IDLE_THRESHOLD), DASHBOARD_CONFIG.MAX_IDLE_INTERVAL);
|
|
913
|
+
console.log(`${DIM}[DASHBOARD]${RESET} ${DIM}Idle detected, extending interval to ${newInterval}ms${RESET}`);
|
|
914
|
+
// Schedule next check with extended interval
|
|
915
|
+
dashboardState.idleTimeout = setTimeout(() => {
|
|
916
|
+
if (dashboardState?.idleTimeout) {
|
|
917
|
+
clearTimeout(dashboardState.idleTimeout);
|
|
918
|
+
dashboardState.idleTimeout = null;
|
|
919
|
+
}
|
|
920
|
+
updateDashboard();
|
|
921
|
+
}, newInterval);
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
};
|
|
925
|
+
renderDashboard(s, intervalMs);
|
|
926
|
+
dashboardInterval = setInterval(() => {
|
|
927
|
+
scheduleCleanup();
|
|
928
|
+
updateDashboard();
|
|
929
|
+
}, intervalMs);
|
|
930
|
+
}
|
|
931
|
+
function renderDashboard(s, currentInterval) {
|
|
932
|
+
const w = 80;
|
|
933
|
+
const line = BOX.h.repeat(w);
|
|
934
|
+
console.log(`\n${CYAN}${BOX.tl}${line}${BOX.tr}${RESET}`);
|
|
935
|
+
console.log(boxLine(`${BOLD}${WHITE}${BG_CYAN} UAP LIVE DASHBOARD ${RESET} ${DIM}Session ${s.sessionId}${RESET} ${DIM}${new Date().toLocaleTimeString()}${RESET}${currentInterval > DASHBOARD_CONFIG.BASE_INTERVAL ? ` (${currentInterval}ms)` : ''}`, w));
|
|
936
|
+
console.log(`${CYAN}${BOX.bl}${line}${BOX.br}${RESET}`);
|
|
937
|
+
const activeAgents = [...s.agents.values()].filter((a) => a.status === 'working');
|
|
938
|
+
const activeTasks = [...s.tasks.values()].filter((t) => t.status === 'in_progress');
|
|
939
|
+
const activeSkillNames = [...s.skills.values()].filter((sk) => sk.active).map((sk) => sk.name);
|
|
940
|
+
const activePatternNames = [...s.patterns.values()].filter((p) => p.active).map((p) => p.name);
|
|
941
|
+
const queuedDeploys = [...s.deploys.values()].filter((a) => a.status === 'queued' || a.status === 'batched');
|
|
942
|
+
console.log(` ${DIM}Duration:${RESET} ${elapsed()} ${DIM}Tokens:${RESET} ${BLUE}${formatTokens(s.tokensUsed)}${RESET}${s.tokensSaved > 0 ? ` ${GREEN}(-${formatTokens(s.tokensSaved)})${RESET}` : ''}${s.totalCostUsd > 0 ? ` ${DIM}($${s.totalCostUsd.toFixed(3)})${RESET}` : ''}`);
|
|
943
|
+
console.log(` ${DIM}Agents:${RESET} ${activeAgents.length} working${activeAgents.length > 0 ? ` (${activeAgents.map((a) => a.name).join(', ')})` : ''}`);
|
|
944
|
+
console.log(` ${DIM}Tasks:${RESET} ${activeTasks.length} in progress${activeTasks.length > 0 ? ` (${activeTasks.map((t) => truncate(t.title, 25)).join(', ')})` : ''}`);
|
|
945
|
+
if (queuedDeploys.length > 0) {
|
|
946
|
+
console.log(` ${YELLOW}[DEPLOY]${RESET} ${queuedDeploys.length} queued${queuedDeploys.length > 1 ? '+' : ''}`);
|
|
947
|
+
}
|
|
948
|
+
if (activeSkillNames.length > 0) {
|
|
949
|
+
console.log(` ${GREEN}[SKILLS]${RESET} ${activeSkillNames.slice(0, 3).join(', ')}${activeSkillNames.length > 3 ? ` +${activeSkillNames.length - 3}` : ''}`);
|
|
950
|
+
}
|
|
951
|
+
if (activePatternNames.length > 0) {
|
|
952
|
+
console.log(` ${BLUE}[PATTERNS]${RESET} ${activePatternNames.slice(0, 3).join(', ')}${activePatternNames.length > 3 ? ` +${activePatternNames.length - 3}` : ''}`);
|
|
953
|
+
}
|
|
954
|
+
if (s.errors > 0) {
|
|
955
|
+
console.log(` ${RED}[ERRORS]${RESET} ${s.errors} total`);
|
|
956
|
+
}
|
|
957
|
+
if (dashboardState?.showWorkGraph && s.tasks.size > 0) {
|
|
958
|
+
workGraph();
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
export function stopDashboard() {
|
|
962
|
+
if (!dashboardInterval) {
|
|
963
|
+
console.log(`${DIM}[DASHBOARD]${RESET} Not running`);
|
|
964
|
+
return;
|
|
965
|
+
}
|
|
966
|
+
clearInterval(dashboardInterval);
|
|
967
|
+
dashboardInterval = null;
|
|
968
|
+
console.log(`${GREEN}[DASHBOARD]${RESET} ${DIM}Stopped${RESET}`);
|
|
969
|
+
}
|
|
970
|
+
export function dashboardPause() {
|
|
971
|
+
if (!dashboardInterval) {
|
|
972
|
+
console.log(`${DIM}[DASHBOARD]${RESET} Not running`);
|
|
973
|
+
return;
|
|
974
|
+
}
|
|
975
|
+
clearInterval(dashboardInterval);
|
|
976
|
+
dashboardInterval = null;
|
|
977
|
+
console.log(`${YELLOW}[DASHBOARD]${RESET} ${DIM}Paused${RESET}`);
|
|
978
|
+
}
|
|
979
|
+
export function dashboardResume() {
|
|
980
|
+
if (dashboardInterval) {
|
|
981
|
+
console.log(`${DIM}[DASHBOARD]${RESET} Already running`);
|
|
982
|
+
return;
|
|
983
|
+
}
|
|
984
|
+
const s = getStats();
|
|
985
|
+
console.log(`${GREEN}[DASHBOARD]${RESET} ${DIM}Resumed${RESET}`);
|
|
986
|
+
dashboardInterval = setInterval(() => {
|
|
987
|
+
const w = 80;
|
|
988
|
+
const line = BOX.h.repeat(w);
|
|
989
|
+
console.log(`\n${CYAN}${BOX.tl}${line}${BOX.tr}${RESET}`);
|
|
990
|
+
console.log(boxLine(`${BOLD}${WHITE}${BG_CYAN} UAP LIVE DASHBOARD ${RESET} ${DIM}Session ${s.sessionId}${RESET} ${DIM}${new Date().toLocaleTimeString()}${RESET}`, w));
|
|
991
|
+
console.log(`${CYAN}${BOX.bl}${line}${BOX.br}${RESET}`);
|
|
992
|
+
const activeAgents = [...s.agents.values()].filter((a) => a.status === 'working');
|
|
993
|
+
const activeTasks = [...s.tasks.values()].filter((t) => t.status === 'in_progress');
|
|
994
|
+
const activeSkillNames = [...s.skills.values()].filter((sk) => sk.active).map((sk) => sk.name);
|
|
995
|
+
const activePatternNames = [...s.patterns.values()].filter((p) => p.active).map((p) => p.name);
|
|
996
|
+
const queuedDeploys = [...s.deploys.values()].filter((a) => a.status === 'queued' || a.status === 'batched');
|
|
997
|
+
console.log(` ${DIM}Duration:${RESET} ${elapsed()} ${DIM}Tokens:${RESET} ${BLUE}${formatTokens(s.tokensUsed)}${RESET}${s.tokensSaved > 0 ? ` ${GREEN}(-${formatTokens(s.tokensSaved)})${RESET}` : ''}${s.totalCostUsd > 0 ? ` ${DIM}($${s.totalCostUsd.toFixed(3)})${RESET}` : ''}`);
|
|
998
|
+
console.log(` ${DIM}Agents:${RESET} ${activeAgents.length} working${activeAgents.length > 0 ? ` (${activeAgents.map((a) => a.name).join(', ')})` : ''}`);
|
|
999
|
+
console.log(` ${DIM}Tasks:${RESET} ${activeTasks.length} in progress${activeTasks.length > 0 ? ` (${activeTasks.map((t) => truncate(t.title, 25)).join(', ')})` : ''}`);
|
|
1000
|
+
if (queuedDeploys.length > 0) {
|
|
1001
|
+
console.log(` ${YELLOW}[DEPLOY]${RESET} ${queuedDeploys.length} queued${queuedDeploys.length > 1 ? '+' : ''}`);
|
|
1002
|
+
}
|
|
1003
|
+
if (activeSkillNames.length > 0) {
|
|
1004
|
+
console.log(` ${GREEN}[SKILLS]${RESET} ${activeSkillNames.slice(0, 3).join(', ')}${activeSkillNames.length > 3 ? ` +${activeSkillNames.length - 3}` : ''}`);
|
|
1005
|
+
}
|
|
1006
|
+
if (activePatternNames.length > 0) {
|
|
1007
|
+
console.log(` ${BLUE}[PATTERNS]${RESET} ${activePatternNames.slice(0, 3).join(', ')}${activePatternNames.length > 3 ? ` +${activePatternNames.length - 3}` : ''}`);
|
|
1008
|
+
}
|
|
1009
|
+
if (s.errors > 0) {
|
|
1010
|
+
console.log(` ${RED}[ERRORS]${RESET} ${s.errors} total`);
|
|
1011
|
+
}
|
|
1012
|
+
}, 2000);
|
|
1013
|
+
}
|
|
1014
|
+
export function showDashboardSnapshot(showWorkGraph = false) {
|
|
1015
|
+
const s = getStats();
|
|
1016
|
+
const w = 80;
|
|
1017
|
+
const line = BOX.h.repeat(w);
|
|
1018
|
+
console.log(`\n${CYAN}${BOX.tl}${line}${BOX.tr}${RESET}`);
|
|
1019
|
+
console.log(boxLine(`${BOLD}${WHITE}${BG_CYAN} UAP DASHBOARD ${RESET} ${DIM}Session ${s.sessionId}${RESET} ${DIM}${new Date().toLocaleTimeString()}${RESET}`, w));
|
|
1020
|
+
console.log(`${CYAN}${BOX.bl}${line}${BOX.br}${RESET}`);
|
|
1021
|
+
const activeAgents = [...s.agents.values()].filter((a) => a.status === 'working');
|
|
1022
|
+
const activeTasks = [...s.tasks.values()].filter((t) => t.status === 'in_progress');
|
|
1023
|
+
const doneTasks = [...s.tasks.values()].filter((t) => t.status === 'done');
|
|
1024
|
+
const activeSkillNames = [...s.skills.values()].filter((sk) => sk.active).map((sk) => sk.name);
|
|
1025
|
+
const activePatternNames = [...s.patterns.values()].filter((p) => p.active).map((p) => p.name);
|
|
1026
|
+
const queuedDeploys = [...s.deploys.values()].filter((a) => a.status === 'queued' || a.status === 'batched');
|
|
1027
|
+
const executingDeploys = [...s.deploys.values()].filter((a) => a.status === 'executing');
|
|
1028
|
+
console.log(` ${DIM}Duration:${RESET} ${elapsed()} ${DIM}Tokens:${RESET} ${BLUE}${formatTokens(s.tokensUsed)}${RESET}${s.tokensSaved > 0 ? ` ${GREEN}(-${formatTokens(s.tokensSaved)})${RESET}` : ''}${s.totalCostUsd > 0 ? ` ${DIM}($${s.totalCostUsd.toFixed(3)})${RESET}` : ''}`);
|
|
1029
|
+
console.log(` ${DIM}Agents:${RESET} ${s.agents.size} total (${activeAgents.length} working, ${[...s.agents.values()].filter((a) => a.status === 'done').length} done)`);
|
|
1030
|
+
console.log(` ${DIM}Tasks:${RESET} ${doneTasks.length}/${s.tasks.size} done${activeTasks.length > 0 ? ` (${activeTasks.length} in progress)` : ''}`);
|
|
1031
|
+
if (queuedDeploys.length > 0) {
|
|
1032
|
+
console.log(` ${YELLOW}[DEPLOY]${RESET} ${queuedDeploys.length} queued${queuedDeploys.length > 1 ? '+' : ''}${executingDeploys.length > 0 ? ` ${CYAN}${executingDeploys.length} executing${RESET}` : ''}`);
|
|
1033
|
+
}
|
|
1034
|
+
if (activeSkillNames.length > 0) {
|
|
1035
|
+
console.log(` ${GREEN}[SKILLS]${RESET} ${activeSkillNames.slice(0, 5).join(', ')}${activeSkillNames.length > 5 ? ` +${activeSkillNames.length - 5}` : ''}`);
|
|
1036
|
+
}
|
|
1037
|
+
if (activePatternNames.length > 0) {
|
|
1038
|
+
console.log(` ${BLUE}[PATTERNS]${RESET} ${activePatternNames.slice(0, 5).join(', ')}${activePatternNames.length > 5 ? ` +${activePatternNames.length - 5}` : ''}`);
|
|
1039
|
+
}
|
|
1040
|
+
if (s.memoryHits > 0 || s.memoryMisses > 0) {
|
|
1041
|
+
console.log(` ${MAGENTA}[MEMORY]${RESET} ${s.memoryHits} hits / ${s.memoryMisses} misses`);
|
|
1042
|
+
}
|
|
1043
|
+
if (s.policyChecks > 0) {
|
|
1044
|
+
console.log(` ${s.policyBlocks > 0 ? RED : GREEN}[POLICY]${RESET} ${s.policyChecks} checks${s.policyBlocks > 0 ? ` (${s.policyBlocks} blocked)` : ''}`);
|
|
1045
|
+
}
|
|
1046
|
+
if (s.errors > 0) {
|
|
1047
|
+
console.log(` ${RED}[ERRORS]${RESET} ${s.errors} total`);
|
|
1048
|
+
}
|
|
1049
|
+
if (showWorkGraph && s.tasks.size > 0) {
|
|
1050
|
+
workGraph();
|
|
1051
|
+
}
|
|
1052
|
+
}
|
|
810
1053
|
//# sourceMappingURL=session-telemetry.js.map
|