Files
jontsai_command-center/public/js/store.js

88 lines
1.8 KiB
JavaScript
Raw Normal View History

/**
* Simple state store for Command Center
* Holds the current dashboard state and notifies subscribers of changes
*/
let state = {
vitals: null,
sessions: [],
tokenStats: null,
statusCounts: { all: 0, live: 0, recent: 0, idle: 0 },
capacity: null,
operators: { operators: [], roles: {} },
llmUsage: null,
cron: [],
memory: null,
cerebro: null,
subagents: [],
pagination: { page: 1, pageSize: 50, totalPages: 1 },
timestamp: null,
};
const subscribers = new Set();
/**
* Get the current state
* @returns {Object} Current state
*/
export function getState() {
return state;
}
/**
* Update the state with new data
* @param {Object} newState - New state data (partial or full)
*/
export function setState(newState) {
state = { ...state, ...newState, timestamp: Date.now() };
notifySubscribers();
}
/**
* Subscribe to state changes
* @param {Function} callback - Called when state changes
* @returns {Function} Unsubscribe function
*/
export function subscribe(callback) {
subscribers.add(callback);
return () => subscribers.delete(callback);
}
function notifySubscribers() {
for (const callback of subscribers) {
try {
callback(state);
} catch (err) {
console.error("[Store] Subscriber error:", err);
}
}
}
// Filter state
export const filters = {
session: { status: "all", channel: "all", kind: "all" },
cron: { status: "all", schedule: "all" },
memory: { type: "all", age: "all" },
};
export function setFilter(section, key, value) {
if (filters[section]) {
filters[section][key] = value;
notifySubscribers();
}
}
// Pagination state
export const pagination = {
page: 1,
pageSize: 20,
total: 0,
totalPages: 0,
hasNext: false,
hasPrev: false,
};
export function setPagination(newPagination) {
Object.assign(pagination, newPagination);
}