@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.
Files changed (111) hide show
  1. package/dashboard/dist/assets/{DHoYGJ9i.js → 77gGFBt6.js} +1 -1
  2. package/dashboard/dist/assets/77gGFBt6.js.br +0 -0
  3. package/dashboard/dist/assets/77gGFBt6.js.gz +0 -0
  4. package/dashboard/dist/assets/BBpTN_SR.js +1 -0
  5. package/dashboard/dist/assets/BBpTN_SR.js.br +0 -0
  6. package/dashboard/dist/assets/BBpTN_SR.js.gz +0 -0
  7. package/dashboard/dist/assets/BVShoyjA.js +1 -0
  8. package/dashboard/dist/assets/BVShoyjA.js.br +0 -0
  9. package/dashboard/dist/assets/BVShoyjA.js.gz +0 -0
  10. package/dashboard/dist/assets/{E8q3xNGK.js → BgcAY5rE.js} +1 -1
  11. package/dashboard/dist/assets/BgcAY5rE.js.br +0 -0
  12. package/dashboard/dist/assets/BgcAY5rE.js.gz +0 -0
  13. package/dashboard/dist/assets/{BdusVDcP.js → C-PAoJF-.js} +1 -1
  14. package/dashboard/dist/assets/C-PAoJF-.js.br +0 -0
  15. package/dashboard/dist/assets/C-PAoJF-.js.gz +0 -0
  16. package/dashboard/dist/assets/C0nA-iUG.js +1 -0
  17. package/dashboard/dist/assets/C0nA-iUG.js.br +0 -0
  18. package/dashboard/dist/assets/C0nA-iUG.js.gz +0 -0
  19. package/dashboard/dist/assets/C6GO-FKy.js +1 -0
  20. package/dashboard/dist/assets/C6GO-FKy.js.br +0 -0
  21. package/dashboard/dist/assets/C6GO-FKy.js.gz +0 -0
  22. package/dashboard/dist/assets/CFwPph5U.js +1 -0
  23. package/dashboard/dist/assets/CFwPph5U.js.br +0 -0
  24. package/dashboard/dist/assets/CFwPph5U.js.gz +0 -0
  25. package/dashboard/dist/assets/CPjsbbgZ.js +212 -0
  26. package/dashboard/dist/assets/CPjsbbgZ.js.br +0 -0
  27. package/dashboard/dist/assets/CPjsbbgZ.js.gz +0 -0
  28. package/dashboard/dist/assets/{Dlz0Cm_E.js → CSr2ZnTV.js} +1 -1
  29. package/dashboard/dist/assets/CSr2ZnTV.js.br +0 -0
  30. package/dashboard/dist/assets/CSr2ZnTV.js.gz +0 -0
  31. package/dashboard/dist/assets/CgQDT6yL.js +1 -0
  32. package/dashboard/dist/assets/CgQDT6yL.js.br +0 -0
  33. package/dashboard/dist/assets/CgQDT6yL.js.gz +0 -0
  34. package/dashboard/dist/assets/{CYchPSem.js → CnitK1MX.js} +1 -1
  35. package/dashboard/dist/assets/CnitK1MX.js.br +0 -0
  36. package/dashboard/dist/assets/CnitK1MX.js.gz +0 -0
  37. package/dashboard/dist/assets/{B1mDqDdy.js → D7DHFX0D.js} +1 -1
  38. package/dashboard/dist/assets/D7DHFX0D.js.br +0 -0
  39. package/dashboard/dist/assets/D7DHFX0D.js.gz +0 -0
  40. package/dashboard/dist/assets/DEip7uko.js +1 -0
  41. package/dashboard/dist/assets/DEip7uko.js.br +0 -0
  42. package/dashboard/dist/assets/DEip7uko.js.gz +0 -0
  43. package/dashboard/dist/assets/DHUSLc01.css +1 -0
  44. package/dashboard/dist/assets/DHUSLc01.css.br +0 -0
  45. package/dashboard/dist/assets/DHUSLc01.css.gz +0 -0
  46. package/dashboard/dist/assets/{DUaqjbT7.js → DOFL9l8s.js} +1 -1
  47. package/dashboard/dist/assets/DOFL9l8s.js.br +0 -0
  48. package/dashboard/dist/assets/DOFL9l8s.js.gz +0 -0
  49. package/dashboard/dist/assets/{BXapfumA.js → DpuQm1oF.js} +1 -1
  50. package/dashboard/dist/assets/DpuQm1oF.js.br +0 -0
  51. package/dashboard/dist/assets/DpuQm1oF.js.gz +0 -0
  52. package/dashboard/dist/assets/{BwkNYH6r.js → DxKG5zy8.js} +2 -2
  53. package/dashboard/dist/assets/DxKG5zy8.js.br +0 -0
  54. package/dashboard/dist/assets/DxKG5zy8.js.gz +0 -0
  55. package/dashboard/dist/assets/tcEHYcbW.js +1 -0
  56. package/dashboard/dist/assets/tcEHYcbW.js.br +0 -0
  57. package/dashboard/dist/assets/tcEHYcbW.js.gz +0 -0
  58. package/dashboard/dist/index.html +2 -2
  59. package/dashboard/dist/index.html.br +0 -0
  60. package/dashboard/dist/index.html.gz +0 -0
  61. package/dist/http/index.js +1 -0
  62. package/dist/http/routes/live-legacy.js +89 -3
  63. package/dist/http/routes/live-misc.d.ts +1 -0
  64. package/dist/http/routes/live-misc.js +76 -0
  65. package/dist/http/routes/mission-control-read.d.ts +4 -0
  66. package/dist/http/routes/mission-control-read.js +8 -0
  67. package/dist/http/routes/usage.js +15 -3
  68. package/dist/json-utils.js +5 -1
  69. package/package.json +6 -1
  70. package/dashboard/dist/assets/B1mDqDdy.js.br +0 -0
  71. package/dashboard/dist/assets/B1mDqDdy.js.gz +0 -0
  72. package/dashboard/dist/assets/BDMstdfu.js +0 -1
  73. package/dashboard/dist/assets/BDMstdfu.js.br +0 -0
  74. package/dashboard/dist/assets/BDMstdfu.js.gz +0 -0
  75. package/dashboard/dist/assets/BXapfumA.js.br +0 -0
  76. package/dashboard/dist/assets/BXapfumA.js.gz +0 -0
  77. package/dashboard/dist/assets/BZZKPNDb.css +0 -1
  78. package/dashboard/dist/assets/BZZKPNDb.css.br +0 -0
  79. package/dashboard/dist/assets/BZZKPNDb.css.gz +0 -0
  80. package/dashboard/dist/assets/BdusVDcP.js.br +0 -0
  81. package/dashboard/dist/assets/BdusVDcP.js.gz +0 -0
  82. package/dashboard/dist/assets/BwkNYH6r.js.br +0 -0
  83. package/dashboard/dist/assets/BwkNYH6r.js.gz +0 -0
  84. package/dashboard/dist/assets/CRhvoVeH.js +0 -1
  85. package/dashboard/dist/assets/CRhvoVeH.js.br +0 -0
  86. package/dashboard/dist/assets/CRhvoVeH.js.gz +0 -0
  87. package/dashboard/dist/assets/CYchPSem.js.br +0 -0
  88. package/dashboard/dist/assets/CYchPSem.js.gz +0 -0
  89. package/dashboard/dist/assets/Cn07669c.js +0 -212
  90. package/dashboard/dist/assets/Cn07669c.js.br +0 -0
  91. package/dashboard/dist/assets/Cn07669c.js.gz +0 -0
  92. package/dashboard/dist/assets/DBG89Wsz.js +0 -1
  93. package/dashboard/dist/assets/DBG89Wsz.js.br +0 -0
  94. package/dashboard/dist/assets/DBG89Wsz.js.gz +0 -0
  95. package/dashboard/dist/assets/DHoYGJ9i.js.br +0 -0
  96. package/dashboard/dist/assets/DHoYGJ9i.js.gz +0 -0
  97. package/dashboard/dist/assets/DHtZPEKd.js +0 -1
  98. package/dashboard/dist/assets/DHtZPEKd.js.br +0 -0
  99. package/dashboard/dist/assets/DHtZPEKd.js.gz +0 -0
  100. package/dashboard/dist/assets/DUaqjbT7.js.br +0 -0
  101. package/dashboard/dist/assets/DUaqjbT7.js.gz +0 -0
  102. package/dashboard/dist/assets/Dlz0Cm_E.js.br +0 -0
  103. package/dashboard/dist/assets/Dlz0Cm_E.js.gz +0 -0
  104. package/dashboard/dist/assets/E8q3xNGK.js.br +0 -0
  105. package/dashboard/dist/assets/E8q3xNGK.js.gz +0 -0
  106. package/dashboard/dist/assets/VH0fzk6I.js +0 -1
  107. package/dashboard/dist/assets/VH0fzk6I.js.br +0 -0
  108. package/dashboard/dist/assets/VH0fzk6I.js.gz +0 -0
  109. package/dashboard/dist/assets/bxgRC96y.js +0 -1
  110. package/dashboard/dist/assets/bxgRC96y.js.br +0 -0
  111. 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 resolveUsageSummary(deps);
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 resolveUsageSummary(deps);
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 resolveUsageSummary(deps);
353
+ const resolved = await resolveUsageSummaryCached(deps);
342
354
  deps.sendJson(res, 200, {
343
355
  generatedAt: resolved.summary.generatedAt,
344
356
  period: resolved.summary.period,
@@ -1,6 +1,10 @@
1
1
  export function parseJsonSafe(value) {
2
2
  try {
3
- return JSON.parse(value);
3
+ if (value.length === 0) {
4
+ return null;
5
+ }
6
+ const normalized = value.startsWith("\ufeff") ? value.slice(1) : value;
7
+ return JSON.parse(normalized);
4
8
  }
5
9
  catch {
6
10
  return null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useorgx/openclaw-plugin",
3
- "version": "0.7.4",
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",