@useorgx/openclaw-plugin 0.7.4 → 0.7.5
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/dashboard/dist/assets/{DHoYGJ9i.js → 77gGFBt6.js} +1 -1
- package/dashboard/dist/assets/77gGFBt6.js.br +0 -0
- package/dashboard/dist/assets/77gGFBt6.js.gz +0 -0
- package/dashboard/dist/assets/BBpTN_SR.js +1 -0
- package/dashboard/dist/assets/BBpTN_SR.js.br +0 -0
- package/dashboard/dist/assets/BBpTN_SR.js.gz +0 -0
- package/dashboard/dist/assets/BVShoyjA.js +1 -0
- package/dashboard/dist/assets/BVShoyjA.js.br +0 -0
- package/dashboard/dist/assets/BVShoyjA.js.gz +0 -0
- package/dashboard/dist/assets/{E8q3xNGK.js → BgcAY5rE.js} +1 -1
- package/dashboard/dist/assets/BgcAY5rE.js.br +0 -0
- package/dashboard/dist/assets/BgcAY5rE.js.gz +0 -0
- package/dashboard/dist/assets/{BdusVDcP.js → C-PAoJF-.js} +1 -1
- package/dashboard/dist/assets/C-PAoJF-.js.br +0 -0
- package/dashboard/dist/assets/C-PAoJF-.js.gz +0 -0
- package/dashboard/dist/assets/C0nA-iUG.js +1 -0
- package/dashboard/dist/assets/C0nA-iUG.js.br +0 -0
- package/dashboard/dist/assets/C0nA-iUG.js.gz +0 -0
- package/dashboard/dist/assets/C6GO-FKy.js +1 -0
- package/dashboard/dist/assets/C6GO-FKy.js.br +0 -0
- package/dashboard/dist/assets/C6GO-FKy.js.gz +0 -0
- package/dashboard/dist/assets/CFwPph5U.js +1 -0
- package/dashboard/dist/assets/CFwPph5U.js.br +0 -0
- package/dashboard/dist/assets/CFwPph5U.js.gz +0 -0
- package/dashboard/dist/assets/CPjsbbgZ.js +212 -0
- package/dashboard/dist/assets/CPjsbbgZ.js.br +0 -0
- package/dashboard/dist/assets/CPjsbbgZ.js.gz +0 -0
- package/dashboard/dist/assets/{Dlz0Cm_E.js → CSr2ZnTV.js} +1 -1
- package/dashboard/dist/assets/CSr2ZnTV.js.br +0 -0
- package/dashboard/dist/assets/CSr2ZnTV.js.gz +0 -0
- package/dashboard/dist/assets/CgQDT6yL.js +1 -0
- package/dashboard/dist/assets/CgQDT6yL.js.br +0 -0
- package/dashboard/dist/assets/CgQDT6yL.js.gz +0 -0
- package/dashboard/dist/assets/{CYchPSem.js → CnitK1MX.js} +1 -1
- package/dashboard/dist/assets/CnitK1MX.js.br +0 -0
- package/dashboard/dist/assets/CnitK1MX.js.gz +0 -0
- package/dashboard/dist/assets/{B1mDqDdy.js → D7DHFX0D.js} +1 -1
- package/dashboard/dist/assets/D7DHFX0D.js.br +0 -0
- package/dashboard/dist/assets/D7DHFX0D.js.gz +0 -0
- package/dashboard/dist/assets/DEip7uko.js +1 -0
- package/dashboard/dist/assets/DEip7uko.js.br +0 -0
- package/dashboard/dist/assets/DEip7uko.js.gz +0 -0
- package/dashboard/dist/assets/DHUSLc01.css +1 -0
- package/dashboard/dist/assets/DHUSLc01.css.br +0 -0
- package/dashboard/dist/assets/DHUSLc01.css.gz +0 -0
- package/dashboard/dist/assets/{DUaqjbT7.js → DOFL9l8s.js} +1 -1
- package/dashboard/dist/assets/DOFL9l8s.js.br +0 -0
- package/dashboard/dist/assets/DOFL9l8s.js.gz +0 -0
- package/dashboard/dist/assets/{BXapfumA.js → DpuQm1oF.js} +1 -1
- package/dashboard/dist/assets/DpuQm1oF.js.br +0 -0
- package/dashboard/dist/assets/DpuQm1oF.js.gz +0 -0
- package/dashboard/dist/assets/{BwkNYH6r.js → DxKG5zy8.js} +2 -2
- package/dashboard/dist/assets/DxKG5zy8.js.br +0 -0
- package/dashboard/dist/assets/DxKG5zy8.js.gz +0 -0
- package/dashboard/dist/assets/tcEHYcbW.js +1 -0
- package/dashboard/dist/assets/tcEHYcbW.js.br +0 -0
- package/dashboard/dist/assets/tcEHYcbW.js.gz +0 -0
- package/dashboard/dist/index.html +2 -2
- package/dashboard/dist/index.html.br +0 -0
- package/dashboard/dist/index.html.gz +0 -0
- package/dist/http/index.js +1 -0
- package/dist/http/routes/live-legacy.js +89 -3
- package/dist/http/routes/live-misc.d.ts +1 -0
- package/dist/http/routes/live-misc.js +76 -0
- package/dist/http/routes/mission-control-read.d.ts +4 -0
- package/dist/http/routes/mission-control-read.js +8 -0
- package/dist/http/routes/usage.js +15 -3
- package/dist/json-utils.js +5 -1
- package/package.json +6 -1
- package/dashboard/dist/assets/B1mDqDdy.js.br +0 -0
- package/dashboard/dist/assets/B1mDqDdy.js.gz +0 -0
- package/dashboard/dist/assets/BDMstdfu.js +0 -1
- package/dashboard/dist/assets/BDMstdfu.js.br +0 -0
- package/dashboard/dist/assets/BDMstdfu.js.gz +0 -0
- package/dashboard/dist/assets/BXapfumA.js.br +0 -0
- package/dashboard/dist/assets/BXapfumA.js.gz +0 -0
- package/dashboard/dist/assets/BZZKPNDb.css +0 -1
- package/dashboard/dist/assets/BZZKPNDb.css.br +0 -0
- package/dashboard/dist/assets/BZZKPNDb.css.gz +0 -0
- package/dashboard/dist/assets/BdusVDcP.js.br +0 -0
- package/dashboard/dist/assets/BdusVDcP.js.gz +0 -0
- package/dashboard/dist/assets/BwkNYH6r.js.br +0 -0
- package/dashboard/dist/assets/BwkNYH6r.js.gz +0 -0
- package/dashboard/dist/assets/CRhvoVeH.js +0 -1
- package/dashboard/dist/assets/CRhvoVeH.js.br +0 -0
- package/dashboard/dist/assets/CRhvoVeH.js.gz +0 -0
- package/dashboard/dist/assets/CYchPSem.js.br +0 -0
- package/dashboard/dist/assets/CYchPSem.js.gz +0 -0
- package/dashboard/dist/assets/Cn07669c.js +0 -212
- package/dashboard/dist/assets/Cn07669c.js.br +0 -0
- package/dashboard/dist/assets/Cn07669c.js.gz +0 -0
- package/dashboard/dist/assets/DBG89Wsz.js +0 -1
- package/dashboard/dist/assets/DBG89Wsz.js.br +0 -0
- package/dashboard/dist/assets/DBG89Wsz.js.gz +0 -0
- package/dashboard/dist/assets/DHoYGJ9i.js.br +0 -0
- package/dashboard/dist/assets/DHoYGJ9i.js.gz +0 -0
- package/dashboard/dist/assets/DHtZPEKd.js +0 -1
- package/dashboard/dist/assets/DHtZPEKd.js.br +0 -0
- package/dashboard/dist/assets/DHtZPEKd.js.gz +0 -0
- package/dashboard/dist/assets/DUaqjbT7.js.br +0 -0
- package/dashboard/dist/assets/DUaqjbT7.js.gz +0 -0
- package/dashboard/dist/assets/Dlz0Cm_E.js.br +0 -0
- package/dashboard/dist/assets/Dlz0Cm_E.js.gz +0 -0
- package/dashboard/dist/assets/E8q3xNGK.js.br +0 -0
- package/dashboard/dist/assets/E8q3xNGK.js.gz +0 -0
- package/dashboard/dist/assets/VH0fzk6I.js +0 -1
- package/dashboard/dist/assets/VH0fzk6I.js.br +0 -0
- package/dashboard/dist/assets/VH0fzk6I.js.gz +0 -0
- package/dashboard/dist/assets/bxgRC96y.js +0 -1
- package/dashboard/dist/assets/bxgRC96y.js.br +0 -0
- package/dashboard/dist/assets/bxgRC96y.js.gz +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { resolveWorkspaceScope, workspaceScopeFromHeaders, } from "../helpers/workspace-scope.js";
|
|
2
|
+
import { summarizeTaskStatuses } from "../../reporting/rollups.js";
|
|
2
3
|
function asRecord(input) {
|
|
3
4
|
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
4
5
|
return null;
|
|
@@ -423,4 +424,79 @@ export function registerLiveMiscRoutes(router, deps) {
|
|
|
423
424
|
}
|
|
424
425
|
router.add("GET", "handoffs", async ({ res }) => renderHandoffs(res), "Get handoffs");
|
|
425
426
|
router.add("HEAD", "handoffs", async ({ res }) => renderHandoffs(res), "Get handoffs (HEAD)");
|
|
427
|
+
router.add("GET", "live/initiatives/summary", async ({ query, res, req }) => {
|
|
428
|
+
try {
|
|
429
|
+
const scope = resolveWorkspaceScope(query, workspaceScopeFromHeaders(req?.headers), { allowProjectScope: false });
|
|
430
|
+
if (scope.error) {
|
|
431
|
+
deps.sendJson(res, 400, { error: scope.error });
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
const workspaceId = scope.workspaceId;
|
|
435
|
+
const projectInitiatives = await resolveProjectInitiativeSet(workspaceId);
|
|
436
|
+
// Load initiatives
|
|
437
|
+
const local = deps.toLocalLiveInitiatives(await deps.loadLocalOpenClawSnapshot(240));
|
|
438
|
+
let initiatives = local.initiatives;
|
|
439
|
+
if (projectInitiatives) {
|
|
440
|
+
initiatives = initiatives.filter((item) => projectInitiatives.has(item.id));
|
|
441
|
+
}
|
|
442
|
+
const perInitiative = [];
|
|
443
|
+
let totalTasks = 0;
|
|
444
|
+
let doneTasks = 0;
|
|
445
|
+
let blockedCount = 0;
|
|
446
|
+
let activeCount = 0;
|
|
447
|
+
let totalActiveAgents = 0;
|
|
448
|
+
for (const initiative of initiatives) {
|
|
449
|
+
totalActiveAgents += initiative.activeAgents;
|
|
450
|
+
// Try to get task statuses from graph
|
|
451
|
+
let taskStatuses = [];
|
|
452
|
+
if (deps.buildMissionControlGraph) {
|
|
453
|
+
try {
|
|
454
|
+
const graphRaw = await deps.buildMissionControlGraph(initiative.id);
|
|
455
|
+
const graph = asRecord(graphRaw);
|
|
456
|
+
const nodes = Array.isArray(graph?.nodes) ? graph.nodes : [];
|
|
457
|
+
for (const nodeEntry of nodes) {
|
|
458
|
+
const node = asRecord(nodeEntry);
|
|
459
|
+
if (!node)
|
|
460
|
+
continue;
|
|
461
|
+
const type = pickStringFromRecord(node, ["type"]);
|
|
462
|
+
if (type !== "task")
|
|
463
|
+
continue;
|
|
464
|
+
const status = pickStringFromRecord(node, ["status"]) ?? "todo";
|
|
465
|
+
taskStatuses.push(status);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
catch {
|
|
469
|
+
// Graph unavailable — fall back to empty counts
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
const counts = summarizeTaskStatuses(taskStatuses);
|
|
473
|
+
const progressPct = counts.total > 0 ? Math.round((counts.done / counts.total) * 100) : 0;
|
|
474
|
+
perInitiative.push({
|
|
475
|
+
id: initiative.id,
|
|
476
|
+
taskCounts: counts,
|
|
477
|
+
progressPct,
|
|
478
|
+
});
|
|
479
|
+
totalTasks += counts.total;
|
|
480
|
+
doneTasks += counts.done;
|
|
481
|
+
blockedCount += counts.blocked;
|
|
482
|
+
activeCount += counts.active;
|
|
483
|
+
}
|
|
484
|
+
const completionPercent = totalTasks > 0 ? Math.round((doneTasks / totalTasks) * 100) : 0;
|
|
485
|
+
deps.sendJson(res, 200, {
|
|
486
|
+
initiatives: perInitiative,
|
|
487
|
+
aggregate: {
|
|
488
|
+
totalTasks,
|
|
489
|
+
doneTasks,
|
|
490
|
+
blockedCount,
|
|
491
|
+
activeAgents: totalActiveAgents,
|
|
492
|
+
completionPercent,
|
|
493
|
+
},
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
catch (err) {
|
|
497
|
+
deps.sendJson(res, 500, {
|
|
498
|
+
error: deps.safeErrorMessage(err),
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
}, "Get live initiatives summary");
|
|
426
502
|
}
|
|
@@ -41,6 +41,10 @@ type NextUpQueueItem = {
|
|
|
41
41
|
pinnedRank?: number | null;
|
|
42
42
|
compositeScore?: number;
|
|
43
43
|
scoringTier?: "urgent" | "ready" | "waiting" | "deferred";
|
|
44
|
+
objectiveScore?: number;
|
|
45
|
+
roiPerToken?: number;
|
|
46
|
+
expectedTokens?: number;
|
|
47
|
+
expectedValueUsd?: number;
|
|
44
48
|
updatedAt?: string | null;
|
|
45
49
|
};
|
|
46
50
|
type SliceRunnerAgent = {
|
|
@@ -572,6 +572,10 @@ function normalizeQueueItems(input) {
|
|
|
572
572
|
asString(record.scoringTier ?? record.scoring_tier) === "deferred"
|
|
573
573
|
? asString(record.scoringTier ?? record.scoring_tier)
|
|
574
574
|
: undefined,
|
|
575
|
+
objectiveScore: asNumber(record.objectiveScore ?? record.objective_score) ?? undefined,
|
|
576
|
+
roiPerToken: asNumber(record.roiPerToken ?? record.roi_per_token) ?? undefined,
|
|
577
|
+
expectedTokens: asNumber(record.expectedTokens ?? record.expected_tokens) ?? undefined,
|
|
578
|
+
expectedValueUsd: asNumber(record.expectedValueUsd ?? record.expected_value_usd) ?? undefined,
|
|
575
579
|
updatedAt: asString(record.updatedAt) ?? asString(record.updated_at) ?? null,
|
|
576
580
|
});
|
|
577
581
|
}
|
|
@@ -772,6 +776,10 @@ function mapCanonicalSlicesToQueueItems(input) {
|
|
|
772
776
|
isPinned: typeof manualRank === "number",
|
|
773
777
|
pinnedRank: manualRank,
|
|
774
778
|
compositeScore: asNumber(iwmt?.mixScore ?? objective?.objectiveScore),
|
|
779
|
+
objectiveScore: asNumber(objective?.objectiveScore) ?? undefined,
|
|
780
|
+
roiPerToken: asNumber(iwmt?.roiPerToken) ?? undefined,
|
|
781
|
+
expectedTokens: asNumber(iwmt?.expectedTokens) ?? undefined,
|
|
782
|
+
expectedValueUsd: asNumber(iwmt?.expectedValueUsd) ?? undefined,
|
|
775
783
|
updatedAt: asString(record.updatedAt) ?? asString(record.updated_at) ?? null,
|
|
776
784
|
});
|
|
777
785
|
}
|
|
@@ -277,6 +277,8 @@ function collectLocalActivities(deps, input) {
|
|
|
277
277
|
}
|
|
278
278
|
return merged;
|
|
279
279
|
}
|
|
280
|
+
let usageSummaryCache = null;
|
|
281
|
+
const USAGE_SUMMARY_CACHE_TTL_MS = 30_000;
|
|
280
282
|
async function resolveUsageSummary(deps) {
|
|
281
283
|
try {
|
|
282
284
|
const summary = await deps.client.getUsageControlPlaneSummary();
|
|
@@ -311,9 +313,19 @@ async function resolveUsageSummary(deps) {
|
|
|
311
313
|
};
|
|
312
314
|
}
|
|
313
315
|
}
|
|
316
|
+
async function resolveUsageSummaryCached(deps) {
|
|
317
|
+
const now = Date.now();
|
|
318
|
+
if (usageSummaryCache &&
|
|
319
|
+
now - usageSummaryCache.fetchedAtMs <= USAGE_SUMMARY_CACHE_TTL_MS) {
|
|
320
|
+
return usageSummaryCache.result;
|
|
321
|
+
}
|
|
322
|
+
const result = await resolveUsageSummary(deps);
|
|
323
|
+
usageSummaryCache = { fetchedAtMs: now, result };
|
|
324
|
+
return result;
|
|
325
|
+
}
|
|
314
326
|
export function registerUsageRoutes(router, deps) {
|
|
315
327
|
router.add("GET", "usage/control-plane/summary", async ({ res }) => {
|
|
316
|
-
const resolved = await
|
|
328
|
+
const resolved = await resolveUsageSummaryCached(deps);
|
|
317
329
|
deps.sendJson(res, 200, {
|
|
318
330
|
...resolved.summary,
|
|
319
331
|
source: resolved.source,
|
|
@@ -321,7 +333,7 @@ export function registerUsageRoutes(router, deps) {
|
|
|
321
333
|
});
|
|
322
334
|
}, "Usage control-plane summary");
|
|
323
335
|
router.add("GET", "usage/unified", async ({ res }) => {
|
|
324
|
-
const resolved = await
|
|
336
|
+
const resolved = await resolveUsageSummaryCached(deps);
|
|
325
337
|
deps.sendJson(res, 200, {
|
|
326
338
|
generatedAt: resolved.summary.generatedAt,
|
|
327
339
|
period: resolved.summary.period,
|
|
@@ -338,7 +350,7 @@ export function registerUsageRoutes(router, deps) {
|
|
|
338
350
|
});
|
|
339
351
|
}, "Usage unified summary");
|
|
340
352
|
router.add("GET", "usage/forecast", async ({ res }) => {
|
|
341
|
-
const resolved = await
|
|
353
|
+
const resolved = await resolveUsageSummaryCached(deps);
|
|
342
354
|
deps.sendJson(res, 200, {
|
|
343
355
|
generatedAt: resolved.summary.generatedAt,
|
|
344
356
|
period: resolved.summary.period,
|
package/dist/json-utils.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@useorgx/openclaw-plugin",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.5",
|
|
4
4
|
"description": "OrgX plugin for OpenClaw — agent orchestration, quality gates, model routing, and live dashboard",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -65,6 +65,11 @@
|
|
|
65
65
|
"build:dashboard": "npm run install:dashboard && npm --prefix dashboard run build",
|
|
66
66
|
"build:core": "rm -rf dist && tsc && node ./scripts/copy-manifest.mjs",
|
|
67
67
|
"build": "npm run build:dashboard && npm run build:core",
|
|
68
|
+
"deploy": "./scripts/deploy-local.sh",
|
|
69
|
+
"deploy:local": "./scripts/deploy-local.sh --local",
|
|
70
|
+
"deploy:patch": "./scripts/deploy-local.sh patch",
|
|
71
|
+
"deploy:minor": "./scripts/deploy-local.sh minor",
|
|
72
|
+
"deploy:major": "./scripts/deploy-local.sh major",
|
|
68
73
|
"cleanup:runtime": "node ./dist/runtime-cleanup.js",
|
|
69
74
|
"clean": "rm -rf dist",
|
|
70
75
|
"pack": "npm run build && mkdir -p artifacts && npm pack --pack-destination artifacts",
|
|
Binary file
|
|
Binary file
|