@monoes/monomindcli 2.10.5 → 2.10.7
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/.claude/helpers/handlers/gates-handler.cjs +47 -14
- package/.claude/settings.json +1 -1
- package/.claude/skills/mastermind/SKILL.md +15 -0
- package/.claude/skills/mastermind/references/antigravity-tools.md +62 -0
- package/.claude/skills/mastermind/references/claude-code-tools.md +52 -0
- package/.claude/skills/mastermind/references/codex-tools.md +66 -0
- package/.claude/skills/mastermind/references/copilot-tools.md +51 -0
- package/.claude/skills/mastermind/references/gemini-tools.md +65 -0
- package/.claude/skills/mastermind/references/pi-tools.md +30 -0
- package/.claude/skills/mastermind-createorg/SKILL.md +11 -3
- package/.claude/skills/mastermind-debug/SKILL.md +274 -0
- package/.claude/skills/mastermind-execute/SKILL.md +99 -0
- package/.claude/skills/mastermind-memory/SKILL.md +316 -0
- package/.claude/skills/mastermind-org/SKILL.md +13 -0
- package/.claude/skills/mastermind-plan/SKILL.md +212 -0
- package/.claude/skills/mastermind-research/SKILL.md +163 -0
- package/.claude/skills/mastermind-review/SKILL.md +228 -0
- package/.claude/skills/monodesign/scripts/detector/engines/browser/drivers.mjs +33 -0
- package/dist/src/commands/agent-exec.d.ts.map +1 -1
- package/dist/src/commands/agent-exec.js +52 -13
- package/dist/src/commands/agent-exec.js.map +1 -1
- package/dist/src/commands/doctor-project-checks.d.ts.map +1 -1
- package/dist/src/commands/doctor-project-checks.js.map +1 -1
- package/dist/src/commands/org-observe.d.ts.map +1 -1
- package/dist/src/commands/org-observe.js +34 -8
- package/dist/src/commands/org-observe.js.map +1 -1
- package/dist/src/commands/org.d.ts.map +1 -1
- package/dist/src/commands/org.js +11 -5
- package/dist/src/commands/org.js.map +1 -1
- package/dist/src/commands/security-scan.d.ts +64 -1
- package/dist/src/commands/security-scan.d.ts.map +1 -1
- package/dist/src/commands/security-scan.js +75 -2
- package/dist/src/commands/security-scan.js.map +1 -1
- package/dist/src/init/mcp-generator.d.ts.map +1 -1
- package/dist/src/init/mcp-generator.js.map +1 -1
- package/dist/src/orgrt/agent-exec.d.ts +1 -1
- package/dist/src/orgrt/agent-exec.d.ts.map +1 -1
- package/dist/src/orgrt/agent-exec.js +64 -6
- package/dist/src/orgrt/agent-exec.js.map +1 -1
- package/dist/src/orgrt/kimicode-runner.d.ts.map +1 -1
- package/dist/src/orgrt/kimicode-runner.js.map +1 -1
- package/dist/src/orgrt/org-design-skill.d.ts +9 -0
- package/dist/src/orgrt/org-design-skill.d.ts.map +1 -0
- package/dist/src/orgrt/org-design-skill.js +61 -0
- package/dist/src/orgrt/org-design-skill.js.map +1 -0
- package/dist/src/orgrt/role-skills/account-strategist.md +26 -0
- package/dist/src/orgrt/role-skills/accounts-payable.md +26 -0
- package/dist/src/orgrt/role-skills/adaptive-coordinator.md +26 -0
- package/dist/src/orgrt/role-skills/adaptive-coordinator2.md +25 -0
- package/dist/src/orgrt/role-skills/ai-citation.md +25 -0
- package/dist/src/orgrt/role-skills/ai-engineer.md +28 -0
- package/dist/src/orgrt/role-skills/analytics-reporter.md +27 -0
- package/dist/src/orgrt/role-skills/api-tester.md +27 -0
- package/dist/src/orgrt/role-skills/automation-governance.md +26 -0
- package/dist/src/orgrt/role-skills/backend-dev.md +27 -0
- package/dist/src/orgrt/role-skills/benchmarker.md +28 -0
- package/dist/src/orgrt/role-skills/blockchain-auditor.md +27 -0
- package/dist/src/orgrt/role-skills/byzantine-coord.md +25 -0
- package/dist/src/orgrt/role-skills/case-analyst.md +25 -0
- package/dist/src/orgrt/role-skills/cicd-engineer.md +28 -0
- package/dist/src/orgrt/role-skills/cloud-architect.md +25 -0
- package/dist/src/orgrt/role-skills/code-review-swarm.md +26 -0
- package/dist/src/orgrt/role-skills/coder.md +27 -0
- package/dist/src/orgrt/role-skills/collective-coord.md +25 -0
- package/dist/src/orgrt/role-skills/compliance-auditor.md +27 -0
- package/dist/src/orgrt/role-skills/consensus-coordinator.md +25 -0
- package/dist/src/orgrt/role-skills/content-creator.md +25 -0
- package/dist/src/orgrt/role-skills/cro-specialist.md +26 -0
- package/dist/src/orgrt/role-skills/data-consolidator.md +27 -0
- package/dist/src/orgrt/role-skills/data-engineer.md +27 -0
- package/dist/src/orgrt/role-skills/database-optimizer.md +25 -0
- package/dist/src/orgrt/role-skills/deal-strategist.md +26 -0
- package/dist/src/orgrt/role-skills/defender.md +25 -0
- package/dist/src/orgrt/role-skills/devops-automator.md +25 -0
- package/dist/src/orgrt/role-skills/discovery-coach.md +26 -0
- package/dist/src/orgrt/role-skills/email-marketing.md +27 -0
- package/dist/src/orgrt/role-skills/embedded-firmware.md +25 -0
- package/dist/src/orgrt/role-skills/evidence-collector.md +27 -0
- package/dist/src/orgrt/role-skills/experiment-tracker.md +28 -0
- package/dist/src/orgrt/role-skills/feedback-synthesizer.md +26 -0
- package/dist/src/orgrt/role-skills/finance-tracker.md +26 -0
- package/dist/src/orgrt/role-skills/frontend-developer.md +25 -0
- package/dist/src/orgrt/role-skills/game-audio-engineer.md +26 -0
- package/dist/src/orgrt/role-skills/game-designer.md +26 -0
- package/dist/src/orgrt/role-skills/hierarchical-coord.md +26 -0
- package/dist/src/orgrt/role-skills/incident-commander.md +26 -0
- package/dist/src/orgrt/role-skills/infrastructure.md +25 -0
- package/dist/src/orgrt/role-skills/input-validator.md +27 -0
- package/dist/src/orgrt/role-skills/ios-developer.md +25 -0
- package/dist/src/orgrt/role-skills/issue-tracker.md +26 -0
- package/dist/src/orgrt/role-skills/judge.md +25 -0
- package/dist/src/orgrt/role-skills/launch-strategist.md +25 -0
- package/dist/src/orgrt/role-skills/legal-compliance.md +25 -0
- package/dist/src/orgrt/role-skills/level-designer.md +26 -0
- package/dist/src/orgrt/role-skills/load-balancer.md +28 -0
- package/dist/src/orgrt/role-skills/mcp-builder.md +27 -0
- package/dist/src/orgrt/role-skills/memory-coordinator.md +28 -0
- package/dist/src/orgrt/role-skills/mesh-coordinator.md +26 -0
- package/dist/src/orgrt/role-skills/ml-developer.md +28 -0
- package/dist/src/orgrt/role-skills/mobile-app-builder.md +25 -0
- package/dist/src/orgrt/role-skills/mobile-dev.md +25 -0
- package/dist/src/orgrt/role-skills/model-qa.md +28 -0
- package/dist/src/orgrt/role-skills/narrative-designer.md +26 -0
- package/dist/src/orgrt/role-skills/outbound-strategist.md +26 -0
- package/dist/src/orgrt/role-skills/path-validator.md +27 -0
- package/dist/src/orgrt/role-skills/payment-agent.md +26 -0
- package/dist/src/orgrt/role-skills/perf-analyzer.md +28 -0
- package/dist/src/orgrt/role-skills/pipeline-analyst.md +26 -0
- package/dist/src/orgrt/role-skills/planner.md +27 -0
- package/dist/src/orgrt/role-skills/pr-manager.md +26 -0
- package/dist/src/orgrt/role-skills/pricing-strategist.md +25 -0
- package/dist/src/orgrt/role-skills/product-manager.md +26 -0
- package/dist/src/orgrt/role-skills/production-validator.md +27 -0
- package/dist/src/orgrt/role-skills/project-shepherd.md +25 -0
- package/dist/src/orgrt/role-skills/proposal-strategist.md +26 -0
- package/dist/src/orgrt/role-skills/prosecutor.md +25 -0
- package/dist/src/orgrt/role-skills/queen-coordinator.md +25 -0
- package/dist/src/orgrt/role-skills/quorum-manager.md +25 -0
- package/dist/src/orgrt/role-skills/raft-manager.md +25 -0
- package/dist/src/orgrt/role-skills/reality-checker.md +27 -0
- package/dist/src/orgrt/role-skills/recruitment.md +25 -0
- package/dist/src/orgrt/role-skills/release-manager.md +26 -0
- package/dist/src/orgrt/role-skills/repo-architect.md +25 -0
- package/dist/src/orgrt/role-skills/researcher.md +27 -0
- package/dist/src/orgrt/role-skills/resource-allocator.md +28 -0
- package/dist/src/orgrt/role-skills/reviewer.md +27 -0
- package/dist/src/orgrt/role-skills/safe-executor.md +27 -0
- package/dist/src/orgrt/role-skills/sales-coach.md +26 -0
- package/dist/src/orgrt/role-skills/sales-engineer.md +26 -0
- package/dist/src/orgrt/role-skills/scout-explorer.md +25 -0
- package/dist/src/orgrt/role-skills/security-architect.md +27 -0
- package/dist/src/orgrt/role-skills/security-auditor.md +27 -0
- package/dist/src/orgrt/role-skills/senior-developer.md +27 -0
- package/dist/src/orgrt/role-skills/senior-pm.md +25 -0
- package/dist/src/orgrt/role-skills/seo-specialist.md +25 -0
- package/dist/src/orgrt/role-skills/social-media.md +25 -0
- package/dist/src/orgrt/role-skills/solidity-engineer.md +28 -0
- package/dist/src/orgrt/role-skills/sprint-prioritizer.md +26 -0
- package/dist/src/orgrt/role-skills/sre.md +26 -0
- package/dist/src/orgrt/role-skills/studio-operations.md +25 -0
- package/dist/src/orgrt/role-skills/studio-producer.md +25 -0
- package/dist/src/orgrt/role-skills/support-responder.md +25 -0
- package/dist/src/orgrt/role-skills/system-architect.md +27 -0
- package/dist/src/orgrt/role-skills/task-orchestrator.md +28 -0
- package/dist/src/orgrt/role-skills/technical-artist.md +26 -0
- package/dist/src/orgrt/role-skills/technical-writer.md +27 -0
- package/dist/src/orgrt/role-skills/tester.md +27 -0
- package/dist/src/orgrt/role-skills/threat-detection.md +27 -0
- package/dist/src/orgrt/role-skills/trend-researcher.md +28 -0
- package/dist/src/orgrt/role-skills/trial-director.md +25 -0
- package/dist/src/orgrt/role-skills/unity-architect.md +26 -0
- package/dist/src/orgrt/role-skills/visionos-engineer.md +25 -0
- package/dist/src/orgrt/role-skills/worker-specialist.md +25 -0
- package/dist/src/orgrt/role-skills/workflow-architect.md +25 -0
- package/dist/src/orgrt/role-skills/workflow-automation.md +26 -0
- package/dist/src/orgrt/role-skills/zk-steward.md +27 -0
- package/dist/src/orgrt/role-skills.d.ts +9 -0
- package/dist/src/orgrt/role-skills.d.ts.map +1 -0
- package/dist/src/orgrt/role-skills.js +52 -0
- package/dist/src/orgrt/role-skills.js.map +1 -0
- package/dist/src/orgrt/runner-registry.d.ts.map +1 -1
- package/dist/src/orgrt/runner-registry.js +7 -3
- package/dist/src/orgrt/runner-registry.js.map +1 -1
- package/dist/src/orgrt/session.d.ts +16 -2
- package/dist/src/orgrt/session.d.ts.map +1 -1
- package/dist/src/orgrt/session.js +36 -3
- package/dist/src/orgrt/session.js.map +1 -1
- package/dist/src/orgrt/types.d.ts +12 -0
- package/dist/src/orgrt/types.d.ts.map +1 -1
- package/dist/src/orgrt/types.js +15 -0
- package/dist/src/orgrt/types.js.map +1 -1
- package/dist/src/ui/dashboard.html +15 -225
- package/dist/src/ui/routes-monoes.mjs +6 -2
- package/dist/src/ui/routes-org.mjs +1 -68
- package/dist/src/ui/server.mjs +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -2094,29 +2094,18 @@ select.pb-cfg-inp { padding: 4px 7px; cursor: pointer; }
|
|
|
2094
2094
|
<div id="org-detail-tabs">
|
|
2095
2095
|
<button class="odt-btn active" data-tab="chart" onclick="v2SwitchOrgTab('chart')">Chart</button>
|
|
2096
2096
|
<button class="odt-btn" data-tab="chat" onclick="v2SwitchOrgTab('chat')">Chat</button>
|
|
2097
|
-
<button class="odt-btn" data-tab="agents-full" onclick="v2SwitchOrgTab('agents-full')">Agents</button>
|
|
2098
|
-
<button class="odt-btn" data-tab="activity" onclick="v2SwitchOrgTab('activity')">Activity</button>
|
|
2099
2097
|
<div class="odt-tab-sep" title="Secondary tabs"></div>
|
|
2100
|
-
<button class="odt-btn secondary" data-tab="skills" onclick="v2SwitchOrgTab('skills')">Skills</button>
|
|
2101
|
-
|
|
2102
|
-
<button class="odt-btn secondary" data-tab="costs" onclick="v2SwitchOrgTab('costs')">Costs</button>
|
|
2103
2098
|
<button class="odt-btn secondary" data-tab="config" onclick="v2SwitchOrgTab('config')">Config</button>
|
|
2104
2099
|
<button class="odt-btn secondary" data-tab="files" onclick="v2SwitchOrgTab('files')">Files</button>
|
|
2105
2100
|
<button class="odt-btn secondary" data-tab="approvals" onclick="v2SwitchOrgTab('approvals')">Approvals</button>
|
|
2106
|
-
<button class="odt-btn secondary" data-tab="budgets" onclick="v2SwitchOrgTab('budgets')">Budgets</button>
|
|
2107
2101
|
<button class="odt-btn secondary" data-tab="decisions" onclick="v2SwitchOrgTab('decisions')">Decisions</button>
|
|
2108
2102
|
</div>
|
|
2109
2103
|
<div id="org-detail-body">
|
|
2110
2104
|
<div class="odt-pane active" id="odt-chart"></div>
|
|
2111
|
-
<div class="odt-pane" id="odt-agents-full"></div>
|
|
2112
|
-
<div class="odt-pane" id="odt-activity"></div>
|
|
2113
2105
|
<div class="odt-pane" id="odt-chat" style="flex-direction:column;height:100%;overflow:hidden;"></div>
|
|
2114
|
-
<div class="odt-pane" id="odt-skills"></div>
|
|
2115
|
-
<div class="odt-pane" id="odt-costs"></div>
|
|
2116
2106
|
<div class="odt-pane" id="odt-config" style="overflow-y:auto"></div>
|
|
2117
2107
|
<div class="odt-pane" id="odt-files" style="overflow-y:auto"></div>
|
|
2118
2108
|
<div class="odt-pane" id="odt-approvals"></div>
|
|
2119
|
-
<div class="odt-pane" id="odt-budgets"></div>
|
|
2120
2109
|
<div class="odt-pane" id="odt-decisions"></div>
|
|
2121
2110
|
</div>
|
|
2122
2111
|
</div>
|
|
@@ -2751,7 +2740,7 @@ async function toggleMonoesConnection() {
|
|
|
2751
2740
|
if (error || !authorizeUrl) { alert(`Could not start monoes.me connection: ${error || 'unknown error'}`); return; }
|
|
2752
2741
|
const popup = window.open(authorizeUrl, 'monoes-connect', 'width=520,height=680');
|
|
2753
2742
|
const poll = setInterval(async () => {
|
|
2754
|
-
if (popup
|
|
2743
|
+
if (popup?.closed) {
|
|
2755
2744
|
clearInterval(poll);
|
|
2756
2745
|
await refreshMonoesStatus();
|
|
2757
2746
|
}
|
|
@@ -2761,6 +2750,9 @@ async function toggleMonoesConnection() {
|
|
|
2761
2750
|
}
|
|
2762
2751
|
}
|
|
2763
2752
|
|
|
2753
|
+
// The sidebar button invokes this from inline HTML, which Biome cannot trace.
|
|
2754
|
+
window.toggleMonoesConnection = toggleMonoesConnection;
|
|
2755
|
+
|
|
2764
2756
|
// ── project switching ──────────────────────────────────────
|
|
2765
2757
|
function _showNavProjectCtx(path) {
|
|
2766
2758
|
const projName = baseName(path);
|
|
@@ -5841,21 +5833,19 @@ async function v2SelectOrg(name) {
|
|
|
5841
5833
|
_v2OrgData._activity = Array.isArray(actR) ? actR : [];
|
|
5842
5834
|
_v2OrgData._health = healthR;
|
|
5843
5835
|
// Fetch supplemental data for new tabs in parallel
|
|
5844
|
-
const [agentsR,
|
|
5836
|
+
const [agentsR, membersR, issuesR] = await Promise.all([
|
|
5845
5837
|
fetch(`/api/org/${_enc}/agents${DIR ? `?dir=${encodeURIComponent(DIR)}` : ''}`).then(r=>r.ok?r.json():[]).catch(()=>[]),
|
|
5846
|
-
fetch(`/api/org/${_enc}/budgets${DIR ? `?dir=${encodeURIComponent(DIR)}` : ''}`).then(r=>r.ok?r.json():null).catch(()=>null),
|
|
5847
5838
|
fetch(`/api/org/${_enc}/members${DIR ? `?dir=${encodeURIComponent(DIR)}` : ''}`).then(r=>r.ok?r.json():[]).catch(()=>[]),
|
|
5848
5839
|
fetch(`/api/org/${_enc}/issues${DIR ? `?dir=${encodeURIComponent(DIR)}` : ''}`).then(r=>r.ok?r.json():[]).catch(()=>[]),
|
|
5849
5840
|
]);
|
|
5850
5841
|
if (_v2SelOrg !== requested || DIR !== requestedDir) return;
|
|
5851
5842
|
_v2OrgData._agents = Array.isArray(agentsR) ? agentsR : (agentsR?.agents || []);
|
|
5852
|
-
_v2OrgData._budgets = budgetsR;
|
|
5853
5843
|
_v2OrgData._members = Array.isArray(membersR) ? membersR : (membersR?.members || []);
|
|
5854
5844
|
_v2OrgData._joinRequests = (membersR?.join_requests) || [];
|
|
5855
5845
|
_v2OrgData._issues = Array.isArray(issuesR) ? issuesR : (issuesR?.issues || []);
|
|
5856
5846
|
} catch (_) {
|
|
5857
5847
|
if (_v2SelOrg !== requested || DIR !== requestedDir) return;
|
|
5858
|
-
_v2OrgData = { ...listOrg, communication: [], _activity: [], _health: null, _agents: [],
|
|
5848
|
+
_v2OrgData = { ...listOrg, communication: [], _activity: [], _health: null, _agents: [], _members: [], _issues: [] };
|
|
5859
5849
|
}
|
|
5860
5850
|
|
|
5861
5851
|
v2UpdateOrgHeader(listOrg, _v2OrgData);
|
|
@@ -5913,11 +5903,9 @@ function v2RenderOrgTab(tab) {
|
|
|
5913
5903
|
}
|
|
5914
5904
|
if (tab === 'chart') v2RenderOrgChart();
|
|
5915
5905
|
else if (tab === 'roles') v2RenderOrgRoles();
|
|
5916
|
-
else if (tab === 'activity') v2RenderOrgActivity();
|
|
5917
5906
|
else if (tab === 'health') v2RenderOrgHealth();
|
|
5918
5907
|
else if (tab === 'heartbeats') v2RenderOrgHeartbeats();
|
|
5919
5908
|
else if (tab === 'tasks') v2RenderOrgTasks();
|
|
5920
|
-
else if (tab === 'costs') v2RenderOrgCosts();
|
|
5921
5909
|
else if (tab === 'members') v2RenderOrgMembers();
|
|
5922
5910
|
else if (tab === 'goals') v2RenderOrgGoals();
|
|
5923
5911
|
else if (tab === 'board') v2RenderOrgBoard();
|
|
@@ -5927,15 +5915,12 @@ function v2RenderOrgTab(tab) {
|
|
|
5927
5915
|
else if (tab === 'settings') v2RenderOrgSettings();
|
|
5928
5916
|
else if (tab === 'routines') v2RenderOrgRoutines();
|
|
5929
5917
|
else if (tab === 'myissues') v2RenderOrgMyIssues();
|
|
5930
|
-
else if (tab === 'budgets') v2RenderOrgBudgets();
|
|
5931
5918
|
else if (tab === 'decisions') v2RenderOrgDecisions();
|
|
5932
5919
|
else if (tab === 'plugins') v2RenderOrgPlugins();
|
|
5933
5920
|
else if (tab === 'charts') v2RenderOrgCharts();
|
|
5934
5921
|
else if (tab === 'projects') v2RenderOrgProjects();
|
|
5935
|
-
else if (tab === 'skills') v2RenderOrgSkills();
|
|
5936
5922
|
else if (tab === 'workspaces') v2RenderOrgWorkspaces();
|
|
5937
5923
|
else if (tab === 'invites') v2RenderOrgInvites();
|
|
5938
|
-
else if (tab === 'agents-full') v2RenderOrgAgentsFull();
|
|
5939
5924
|
else if (tab === 'environments') v2RenderOrgEnvironments();
|
|
5940
5925
|
else if (tab === 'access') v2RenderOrgAccess();
|
|
5941
5926
|
else if (tab === 'issues-full') v2RenderOrgIssuesFull();
|
|
@@ -6801,16 +6786,12 @@ function v2RenderAgentDrawer(data) {
|
|
|
6801
6786
|
if (cap.termination) chars.push(['Done when', cap.termination]);
|
|
6802
6787
|
if (cap.version) chars.push(['Version', cap.version]);
|
|
6803
6788
|
|
|
6804
|
-
const skills = [];
|
|
6805
|
-
(Array.isArray(role.skills) ? role.skills : []).forEach(s => { if (s && !skills.includes(s)) skills.push(s); });
|
|
6806
|
-
(Array.isArray(cap.expertise) ? cap.expertise : []).forEach(s => { if (s && !skills.includes(s)) skills.push(s); });
|
|
6807
6789
|
const taskTypes = Array.isArray(cap.task_types) ? cap.task_types : [];
|
|
6808
6790
|
const resps = Array.isArray(role.responsibilities) ? role.responsibilities : [];
|
|
6809
6791
|
|
|
6810
6792
|
let html = '';
|
|
6811
6793
|
if (def.description) html += `<div class="oad-desc">${esc(def.description)}</div>`;
|
|
6812
6794
|
if (chars.length) html += `<div class="oad-sec"><div class="oad-sec-h">Characteristics</div><div class="oad-chars">${chars.map(([k, v]) => `<div class="oad-char"><span class="oad-char-k">${esc(k)}</span><span class="oad-char-v">${esc(v)}</span></div>`).join('')}</div></div>`;
|
|
6813
|
-
if (skills.length) html += `<div class="oad-sec"><div class="oad-sec-h">Skills & expertise</div><div class="oad-chips">${skills.map(s => `<span class="oad-chip">${esc(s)}</span>`).join('')}</div></div>`;
|
|
6814
6795
|
if (resps.length) html += `<div class="oad-sec"><div class="oad-sec-h">Responsibilities</div><ul class="oad-list">${resps.map(s => `<li>${esc(s)}</li>`).join('')}</ul></div>`;
|
|
6815
6796
|
if (taskTypes.length) html += `<div class="oad-sec"><div class="oad-sec-h">Task types</div><div class="oad-chips">${taskTypes.map(s => `<span class="oad-chip alt">${esc(s)}</span>`).join('')}</div></div>`;
|
|
6816
6797
|
if (def.found && def.document) {
|
|
@@ -6927,36 +6908,6 @@ function fmtOrgEvDetail(ev) {
|
|
|
6927
6908
|
return ev.role||ev.result||ev.msg||ev.message||ev.progress||ev.agent||ev.status||'';
|
|
6928
6909
|
}
|
|
6929
6910
|
|
|
6930
|
-
function v2RenderOrgActivity() {
|
|
6931
|
-
if (!_v2SelOrg) return;
|
|
6932
|
-
const activity = _v2OrgData?._activity || [];
|
|
6933
|
-
const orgEvents = _v2OrgEventLog[_v2SelOrg] || [];
|
|
6934
|
-
const _actSeen = new Set();
|
|
6935
|
-
const events = [...activity, ...orgEvents]
|
|
6936
|
-
.filter(e => { const k=`${e.ts||''}|${e.type||''}|${e.runId||e.session||''}|${e.from||e.role||e.agent||''}|${(e.result||e.msg||e.message||e.summary||'').slice(0,20)}`; return _actSeen.has(k)?false:(_actSeen.add(k),true); })
|
|
6937
|
-
.sort((a,b) => (b.ts||0)-(a.ts||0)).slice(0,80);
|
|
6938
|
-
const pane = document.getElementById('odt-activity');
|
|
6939
|
-
if (!pane) return;
|
|
6940
|
-
const fmtOrgEvType = t => {
|
|
6941
|
-
const m={
|
|
6942
|
-
'org:start':'start','org:stop':'stop','org:complete':'done','org:create':'create',
|
|
6943
|
-
'org:heartbeat':'hb','org:agent:online':'agent-on','org:comms':'comms',
|
|
6944
|
-
'org:checkpoint':'checkpoint','run:cycle:complete':'cycle','run:complete':'run-done',
|
|
6945
|
-
'org:error':'error','org:agent:offline':'agent-off',
|
|
6946
|
-
};
|
|
6947
|
-
return m[t]||(t||'').replace(/^(?:org|run):/,'');
|
|
6948
|
-
};
|
|
6949
|
-
if (!events.length) {
|
|
6950
|
-
pane.innerHTML = '<div class="empty">No activity recorded</div>';
|
|
6951
|
-
return;
|
|
6952
|
-
}
|
|
6953
|
-
pane.innerHTML = `<div class="act-v2-list">${events.map(ev => {
|
|
6954
|
-
const t = ev.ts ? new Date(ev.ts).toLocaleTimeString('en',{hour12:false,hour:'2-digit',minute:'2-digit',second:'2-digit'}) : '';
|
|
6955
|
-
const detail = fmtOrgEvDetail(ev) || ev.role || ev.agent || '';
|
|
6956
|
-
return `<div class="av2-row"><span class="av2-time">${esc(t)}</span><span class="av2-type">${esc(fmtOrgEvType(ev.type))}</span><span class="av2-msg">${esc(detail)}</span></div>`;
|
|
6957
|
-
}).join('')}</div>`;
|
|
6958
|
-
}
|
|
6959
|
-
|
|
6960
6911
|
// ── org health ──────────────────────────────
|
|
6961
6912
|
function v2RenderOrgHealth() {
|
|
6962
6913
|
if (!_v2SelOrg) return;
|
|
@@ -7037,45 +6988,6 @@ function v2RenderOrgTasks() {
|
|
|
7037
6988
|
</div>`).join('');
|
|
7038
6989
|
}
|
|
7039
6990
|
|
|
7040
|
-
// ── org costs tab ──────────────────────────────────────────
|
|
7041
|
-
function v2RenderOrgCosts() {
|
|
7042
|
-
if (!_v2SelOrg) return;
|
|
7043
|
-
const pane = document.getElementById('odt-costs');
|
|
7044
|
-
if (!pane) return;
|
|
7045
|
-
// Primary source: per-agent cost rollup from the org budgets endpoint (already loaded)
|
|
7046
|
-
const b = _v2OrgData?._budgets;
|
|
7047
|
-
let rows = (b && Array.isArray(b.agents)) ? b.agents.map(a => ({
|
|
7048
|
-
label: a.title || a.id || '—',
|
|
7049
|
-
cost: Number(a.total_cost_usd ?? a.cost ?? 0),
|
|
7050
|
-
tin: Number(a.tokens_in ?? a.tokensIn ?? 0),
|
|
7051
|
-
tout: Number(a.tokens_out ?? a.tokensOut ?? 0),
|
|
7052
|
-
})) : [];
|
|
7053
|
-
// Fallback to legacy _v2OrgData.costs if ever present
|
|
7054
|
-
if (!rows.length && _v2OrgData?.costs) {
|
|
7055
|
-
const c = _v2OrgData.costs;
|
|
7056
|
-
rows = Array.isArray(c)
|
|
7057
|
-
? c.map(r => ({ label: r.label ?? r.name ?? '—', cost: Number(r.value ?? r.cost ?? 0), tin: 0, tout: 0 }))
|
|
7058
|
-
: Object.entries(c).map(([k, v]) => ({ label: k, cost: Number(v) || 0, tin: 0, tout: 0 }));
|
|
7059
|
-
}
|
|
7060
|
-
if (!rows.length) { pane.innerHTML = '<div class="empty" style="text-align:center;padding:24px 16px"><div style="font-size:13px;color:var(--text-lo);margin-bottom:6px">No cost data tracked yet</div><div style="font-size:11px;color:var(--text-lo);opacity:0.7">Agents must emit <code>agent:usage</code> events to populate this tab</div></div>'; return; }
|
|
7061
|
-
const cur = (b?.currency) || 'USD';
|
|
7062
|
-
const period = (b?.period) || '';
|
|
7063
|
-
const total = rows.reduce((s, r) => s + r.cost, 0);
|
|
7064
|
-
const totIn = rows.reduce((s, r) => s + r.tin, 0), totOut = rows.reduce((s, r) => s + r.tout, 0);
|
|
7065
|
-
rows.sort((a, c) => c.cost - a.cost);
|
|
7066
|
-
pane.innerHTML = `<div class="m-group-title">Cost Breakdown${period ? ` · ${esc(period)}` : ''}</div>
|
|
7067
|
-
<div style="display:flex;justify-content:space-between;align-items:baseline;padding:8px 0 10px;border-bottom:1px solid var(--border);margin-bottom:6px">
|
|
7068
|
-
<span style="color:var(--text-lo);font-size:11px">Total (${esc(cur)})</span>
|
|
7069
|
-
<span style="color:var(--accent);font-family:var(--mono);font-size:15px;font-weight:600">$${total.toFixed(4)}</span>
|
|
7070
|
-
</div>` +
|
|
7071
|
-
rows.map(r => `<div style="display:flex;justify-content:space-between;align-items:baseline;gap:10px;padding:6px 0;border-bottom:1px solid var(--border);font-size:12px">
|
|
7072
|
-
<span style="color:var(--text-hi);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">${esc(String(r.label))}</span>
|
|
7073
|
-
<span style="color:var(--text-lo);font-family:var(--mono);font-size:10px;white-space:nowrap">${(r.tin + r.tout).toLocaleString()} tok</span>
|
|
7074
|
-
<span style="color:var(--accent);font-family:var(--mono);white-space:nowrap">$${r.cost.toFixed(4)}</span>
|
|
7075
|
-
</div>`).join('') +
|
|
7076
|
-
`<div style="color:var(--text-lo);font-size:10px;margin-top:10px">${totIn.toLocaleString()} in · ${totOut.toLocaleString()} out · sourced from org budgets</div>`;
|
|
7077
|
-
}
|
|
7078
|
-
|
|
7079
6991
|
// ── org members tab ────────────────────────────────────────
|
|
7080
6992
|
function v2RenderOrgMembers() {
|
|
7081
6993
|
if (!_v2SelOrg) return;
|
|
@@ -7427,54 +7339,6 @@ async function v2RenderOrgMyIssues() {
|
|
|
7427
7339
|
} catch (e) { el.innerHTML = `<div class="empty">Failed: ${esc(e.message)}</div>`; }
|
|
7428
7340
|
}
|
|
7429
7341
|
|
|
7430
|
-
// ── BUDGETS ────────────────────────────────────────────────
|
|
7431
|
-
function v2RenderOrgBudgets() {
|
|
7432
|
-
const el = document.getElementById('odt-budgets');
|
|
7433
|
-
if (!el || !_v2OrgData) return;
|
|
7434
|
-
const b = _v2OrgData._budgets || _v2OrgData.budgets || {};
|
|
7435
|
-
// Server returns { org_budget: {limit_tokens, limit_usd}, agents: [{id, title, tokens_in, tokens_out, total_cost_usd}] }
|
|
7436
|
-
const orgBudget = b.org_budget || {};
|
|
7437
|
-
const tokenLimit = orgBudget.limit_tokens || b.tokenLimit || null;
|
|
7438
|
-
const usdLimit = orgBudget.limit_usd || b.usdLimit || null;
|
|
7439
|
-
// Per-agent data comes from the budgets endpoint (has cost); fall back to agents roster
|
|
7440
|
-
const budgetAgents = Array.isArray(b.agents) && b.agents.length ? b.agents : [];
|
|
7441
|
-
const usedTokens = budgetAgents.reduce((s, a) => s + (a.tokens_in || 0) + (a.tokens_out || 0), 0);
|
|
7442
|
-
const usedUsd = budgetAgents.reduce((s, a) => s + (a.total_cost_usd || 0), 0);
|
|
7443
|
-
|
|
7444
|
-
function fillBar(used, limit) {
|
|
7445
|
-
if (!limit) return '';
|
|
7446
|
-
const pct = Math.min(100, Math.round((used / limit) * 100));
|
|
7447
|
-
const col = pct >= 90 ? 'var(--red)' : pct >= 70 ? 'oklch(70% 0.18 60)' : 'var(--accent)';
|
|
7448
|
-
const filled = Math.round(pct / 5);
|
|
7449
|
-
return `<div style="font-family:var(--mono);font-size:11px;color:${col}">${'█'.repeat(filled)}${'░'.repeat(20 - filled)} ${pct}%</div>`;
|
|
7450
|
-
}
|
|
7451
|
-
|
|
7452
|
-
let html = '';
|
|
7453
|
-
if (tokenLimit != null || usedTokens > 0) {
|
|
7454
|
-
html += `<div class="m-group-title">Tokens</div>${fillBar(usedTokens, tokenLimit)}<div style="font-size:12px;color:var(--text-lo);margin:4px 0 14px">${usedTokens.toLocaleString()} / ${tokenLimit ? tokenLimit.toLocaleString() : '∞'}</div>`;
|
|
7455
|
-
}
|
|
7456
|
-
if (usdLimit != null || usedUsd > 0) {
|
|
7457
|
-
html += `<div class="m-group-title">USD Budget</div>${fillBar(usedUsd, usdLimit)}<div style="font-size:12px;color:var(--text-lo);margin:4px 0 14px">$${usedUsd.toFixed(4)} / ${usdLimit ? `$${Number(usdLimit).toFixed(2)}` : '∞'}</div>`;
|
|
7458
|
-
}
|
|
7459
|
-
if (budgetAgents.length) {
|
|
7460
|
-
html += '<div class="m-group-title" style="margin-bottom:6px">Per Agent</div>' +
|
|
7461
|
-
`<table style="width:100%;border-collapse:collapse;font-size:12px"><thead><tr style="color:var(--text-xs);text-align:left"><th style="padding:4px 8px">Agent</th><th>Tokens In</th><th>Tokens Out</th><th>Cost</th></tr></thead><tbody>` +
|
|
7462
|
-
budgetAgents.slice(0, 20).map(a => {
|
|
7463
|
-
const tIn = a.tokens_in || 0, tOut = a.tokens_out || 0;
|
|
7464
|
-
const cost = a.total_cost_usd || 0;
|
|
7465
|
-
const limit = a.limit_usd || orgBudget.limit_usd || 0;
|
|
7466
|
-
const over = limit && cost > limit;
|
|
7467
|
-
return `<tr style="border-top:1px solid var(--border)${over ? ';color:var(--red)' : ''}">
|
|
7468
|
-
<td style="padding:4px 8px;font-family:var(--mono);font-size:11px;color:${over ? 'var(--red)' : 'var(--text-hi)'}">${esc((a.title || a.id || '—').toString().slice(0, 14))}</td>
|
|
7469
|
-
<td style="padding:4px 8px;color:var(--text-lo)">${tIn.toLocaleString()}</td>
|
|
7470
|
-
<td style="padding:4px 8px;color:var(--text-lo)">${tOut.toLocaleString()}</td>
|
|
7471
|
-
<td style="padding:4px 8px;color:var(--accent)">$${cost.toFixed(4)}${over ? ' ⚠' : ''}</td>
|
|
7472
|
-
</tr>`;
|
|
7473
|
-
}).join('') + '</tbody></table>';
|
|
7474
|
-
}
|
|
7475
|
-
el.innerHTML = html || '<div class="empty">No budget data</div>';
|
|
7476
|
-
}
|
|
7477
|
-
|
|
7478
7342
|
// ── PLUGINS ────────────────────────────────────────────────
|
|
7479
7343
|
async function v2RenderOrgPlugins() {
|
|
7480
7344
|
const el = document.getElementById('odt-plugins');
|
|
@@ -7590,41 +7454,6 @@ async function v2RenderOrgProjects() {
|
|
|
7590
7454
|
} catch (e) { el.innerHTML = `<div class="empty">Failed: ${esc(e.message)}</div>`; }
|
|
7591
7455
|
}
|
|
7592
7456
|
|
|
7593
|
-
// ── SKILLS ─────────────────────────────────────────────────
|
|
7594
|
-
async function v2RenderOrgSkills() {
|
|
7595
|
-
const el = document.getElementById('odt-skills');
|
|
7596
|
-
if (!el || !_v2OrgData) return;
|
|
7597
|
-
const roles = Array.isArray(_v2OrgData.roles) ? _v2OrgData.roles : [];
|
|
7598
|
-
if (!roles.length) { el.innerHTML = '<div class="empty">No roles defined</div>'; return; }
|
|
7599
|
-
el.innerHTML = '<div class="empty">Loading skills…</div>';
|
|
7600
|
-
const org = _v2SelOrg, dirq = DIR ? `?dir=${encodeURIComponent(DIR)}` : '';
|
|
7601
|
-
// Enrich each role with expertise + task types from its agent definition (same source as the detail drawer)
|
|
7602
|
-
const enriched = await Promise.all(roles.map(async r => {
|
|
7603
|
-
const expertise = Array.isArray(r.skills) ? r.skills.slice() : [];
|
|
7604
|
-
let taskTypes = [];
|
|
7605
|
-
try {
|
|
7606
|
-
const j = await fetch(`/api/org/${encodeURIComponent(org)}/agent/${encodeURIComponent(r.id)}${dirq}`).then(x => x.ok ? x.json() : null);
|
|
7607
|
-
const cap = j?.definition?.capability;
|
|
7608
|
-
if (cap) {
|
|
7609
|
-
(cap.expertise || []).forEach(s => { if (s && !expertise.includes(s)) expertise.push(s); });
|
|
7610
|
-
taskTypes = cap.task_types || [];
|
|
7611
|
-
}
|
|
7612
|
-
} catch (_) {}
|
|
7613
|
-
return { name: r.name || r.title || r.id, type: r.type || r.agent_type || '', expertise, taskTypes };
|
|
7614
|
-
}));
|
|
7615
|
-
if (_v2SelOrg !== org) return; // org switched while fetching
|
|
7616
|
-
el.innerHTML = enriched.map(e => `<div style="padding:10px 0;border-bottom:1px solid var(--border)">
|
|
7617
|
-
<div style="display:flex;align-items:baseline;gap:8px;margin-bottom:6px">
|
|
7618
|
-
<span style="font-size:13px;font-weight:600;color:var(--text-hi)">${esc(e.name)}</span>
|
|
7619
|
-
${e.type ? `<span style="font-size:10px;color:var(--text-lo)">${esc(e.type)}</span>` : ''}
|
|
7620
|
-
</div>
|
|
7621
|
-
${e.expertise.length
|
|
7622
|
-
? `<div style="display:flex;flex-wrap:wrap;gap:5px;${e.taskTypes.length ? 'margin-bottom:6px' : ''}">${e.expertise.map(s => `<span class="oad-chip">${esc(s)}</span>`).join('')}</div>`
|
|
7623
|
-
: '<div style="font-size:11px;color:var(--text-lo)">No skills listed</div>'}
|
|
7624
|
-
${e.taskTypes.length ? `<div style="display:flex;flex-wrap:wrap;gap:5px">${e.taskTypes.map(s => `<span class="oad-chip alt">${esc(s)}</span>`).join('')}</div>` : ''}
|
|
7625
|
-
</div>`).join('');
|
|
7626
|
-
}
|
|
7627
|
-
|
|
7628
7457
|
// ── ORG CHAT ───────────────────────────────────────────────
|
|
7629
7458
|
let _odtChatSessions = [];
|
|
7630
7459
|
let _odtChatCurrentId = null;
|
|
@@ -9105,28 +8934,6 @@ async function v2RenderOrgInvites() {
|
|
|
9105
8934
|
} catch (e) { el.innerHTML = `<div class="empty">Failed: ${esc(e.message)}</div>`; }
|
|
9106
8935
|
}
|
|
9107
8936
|
|
|
9108
|
-
// ── AGENTS (FULL) ──────────────────────────────────────────
|
|
9109
|
-
function v2RenderOrgAgentsFull() {
|
|
9110
|
-
const el = document.getElementById('odt-agents-full');
|
|
9111
|
-
if (!el || !_v2OrgData) return;
|
|
9112
|
-
const agents = _v2OrgData._agents || [];
|
|
9113
|
-
if (!agents.length) { el.innerHTML = '<div class="empty">No agents found</div>'; return; }
|
|
9114
|
-
el.innerHTML = `<table style="width:100%;border-collapse:collapse;font-size:12px">
|
|
9115
|
-
<thead><tr style="color:var(--text-xs);text-align:left">
|
|
9116
|
-
<th style="padding:5px 8px">ID</th><th>Type</th><th>Adapter</th><th>Status</th><th>Heartbeat</th><th>Tokens In</th><th>Tokens Out</th>
|
|
9117
|
-
</tr></thead>
|
|
9118
|
-
<tbody>${agents.map(a => `<tr style="border-top:1px solid var(--border)">
|
|
9119
|
-
<td style="padding:5px 8px;color:var(--text-hi);font-family:var(--mono);font-size:11px">${esc((a.id||'—').toString().slice(0,12))}</td>
|
|
9120
|
-
<td style="padding:5px 8px;color:var(--text-hi)">${esc(a.adapterType||a.type||a.title||'—')}</td>
|
|
9121
|
-
<td style="padding:5px 8px;color:var(--text-lo)">${esc(a.adapterModel||a.adapter||'—')}</td>
|
|
9122
|
-
<td style="padding:5px 8px"><span class="ss-pill ${(a.status==='running'||a.running)?'on':''}">${esc(a.status||'idle')}</span></td>
|
|
9123
|
-
<td style="padding:5px 8px;color:var(--text-lo)">${a.lastHeartbeat ? relTime(a.lastHeartbeat) : '—'}</td>
|
|
9124
|
-
<td style="padding:5px 8px;color:var(--text-lo)">${(a.tokensIn ?? a.tokens_in) != null ? Number(a.tokensIn ?? a.tokens_in).toLocaleString() : '—'}</td>
|
|
9125
|
-
<td style="padding:5px 8px;color:var(--text-lo)">${(a.tokensOut ?? a.tokens_out) != null ? Number(a.tokensOut ?? a.tokens_out).toLocaleString() : '—'}</td>
|
|
9126
|
-
</tr>`).join('')}</tbody>
|
|
9127
|
-
</table>`;
|
|
9128
|
-
}
|
|
9129
|
-
|
|
9130
8937
|
// ── ENVIRONMENTS ───────────────────────────────────────────
|
|
9131
8938
|
async function v2RenderOrgEnvironments() {
|
|
9132
8939
|
const el = document.getElementById('odt-environments');
|
|
@@ -9417,7 +9224,6 @@ function _filterOrgList(q) {
|
|
|
9417
9224
|
if (!_v2OrgEventLog[n]) _v2OrgEventLog[n] = [];
|
|
9418
9225
|
_v2OrgEventLog[n].push(ev);
|
|
9419
9226
|
if (_v2OrgEventLog[n].length > 50) _v2OrgEventLog[n].shift();
|
|
9420
|
-
if (n === _v2SelOrg && _v2OrgTab === 'activity') v2RenderOrgActivity();
|
|
9421
9227
|
// Update in-memory agent status so Live tab running-agents section reflects reality.
|
|
9422
9228
|
// org:agent:online → mark that agent running; org:complete/run:complete → reset all to idle.
|
|
9423
9229
|
if (n === _v2SelOrg && _v2OrgData && Array.isArray(_v2OrgData._agents)) {
|
|
@@ -9431,8 +9237,7 @@ function _filterOrgList(q) {
|
|
|
9431
9237
|
} else if (ev.type === 'org:complete' || ev.type === 'run:complete') {
|
|
9432
9238
|
_v2OrgData._agents.forEach(a => { a.status = 'idle'; });
|
|
9433
9239
|
}
|
|
9434
|
-
if (_v2OrgTab === '
|
|
9435
|
-
else if (_v2OrgTab === 'live' && (ev.type === 'org:agent:online' || ev.type === 'org:agent:offline' || ev.type === 'org:complete' || ev.type === 'run:complete')) v2RenderOrgLive();
|
|
9240
|
+
if (_v2OrgTab === 'live' && (ev.type === 'org:agent:online' || ev.type === 'org:agent:offline' || ev.type === 'org:complete' || ev.type === 'run:complete')) v2RenderOrgLive();
|
|
9436
9241
|
else if (_v2OrgTab === 'heartbeats' && (ev.type === 'org:agent:online' || ev.type === 'org:agent:offline' || ev.type === 'org:complete' || ev.type === 'run:complete')) v2RenderOrgHeartbeats();
|
|
9437
9242
|
else if (_v2OrgTab === 'members' && (ev.type === 'org:agent:online' || ev.type === 'org:agent:offline' || ev.type === 'org:complete' || ev.type === 'run:complete')) v2RenderOrgMembers();
|
|
9438
9243
|
else if (_v2OrgTab === 'roles' && (ev.type === 'org:agent:online' || ev.type === 'org:agent:offline' || ev.type === 'org:complete' || ev.type === 'run:complete')) v2RenderOrgRoles();
|
|
@@ -9505,14 +9310,6 @@ function _filterOrgList(q) {
|
|
|
9505
9310
|
.then(d => { if (d && _v2OrgData && _v2SelOrg === n && d.tasks !== undefined) { _v2OrgData.tasks = d.tasks; v2RenderOrgTasks(); } })
|
|
9506
9311
|
.catch(() => { v2RenderOrgTasks(); });
|
|
9507
9312
|
}
|
|
9508
|
-
if (_v2OrgTab === 'budgets' || _v2OrgTab === 'costs') {
|
|
9509
|
-
// Re-fetch budgets after run events so token/cost counters stay current
|
|
9510
|
-
const _bEnc = encodeURIComponent(_v2SelOrg);
|
|
9511
|
-
fetch(`/api/org/${_bEnc}/budgets${DIR ? `?dir=${encodeURIComponent(DIR)}` : ''}`)
|
|
9512
|
-
.then(r => r.ok ? r.json() : null)
|
|
9513
|
-
.then(b => { if (b && _v2OrgData && _v2SelOrg === n) { _v2OrgData._budgets = b; _v2OrgTab === 'budgets' ? v2RenderOrgBudgets() : v2RenderOrgCosts(); } })
|
|
9514
|
-
.catch(() => { _v2OrgTab === 'budgets' ? v2RenderOrgBudgets() : v2RenderOrgCosts(); });
|
|
9515
|
-
}
|
|
9516
9313
|
if (_v2OrgTab === 'board' || _v2OrgTab === 'issues-full') {
|
|
9517
9314
|
// Re-fetch issues after run events so board/issues-full reflect current state
|
|
9518
9315
|
const _iEnc = encodeURIComponent(_v2SelOrg);
|
|
@@ -9533,14 +9330,14 @@ function _filterOrgList(q) {
|
|
|
9533
9330
|
// Re-load chat run list after run events so cycleCount/eventCount in dropdown reflect disk state
|
|
9534
9331
|
_odtLoadChatSessions().catch(() => {});
|
|
9535
9332
|
}
|
|
9536
|
-
if (_v2OrgTab === '
|
|
9333
|
+
if (_v2OrgTab === 'heartbeats') {
|
|
9537
9334
|
// Re-fetch agents after run events to get fresh tokensIn/tokensOut/lastHeartbeat
|
|
9538
|
-
// Heartbeats tab derives from _v2OrgData._agents
|
|
9335
|
+
// Heartbeats tab derives from _v2OrgData._agents.
|
|
9539
9336
|
const _agEnc = encodeURIComponent(_v2SelOrg);
|
|
9540
9337
|
fetch(`/api/org/${_agEnc}/agents${DIR ? `?dir=${encodeURIComponent(DIR)}` : ''}`)
|
|
9541
9338
|
.then(r => r.ok ? r.json() : null)
|
|
9542
|
-
.then(d => { if (d && _v2OrgData && _v2SelOrg === n) { _v2OrgData._agents = Array.isArray(d) ? d : (d?.agents || []);
|
|
9543
|
-
.catch(() => {
|
|
9339
|
+
.then(d => { if (d && _v2OrgData && _v2SelOrg === n) { _v2OrgData._agents = Array.isArray(d) ? d : (d?.agents || []); v2RenderOrgHeartbeats(); } })
|
|
9340
|
+
.catch(() => { v2RenderOrgHeartbeats(); });
|
|
9544
9341
|
}
|
|
9545
9342
|
if (_v2OrgTab === 'myissues') {
|
|
9546
9343
|
// Re-render myissues after run events — it fetches its own data on every render
|
|
@@ -9558,16 +9355,9 @@ function _filterOrgList(q) {
|
|
|
9558
9355
|
}
|
|
9559
9356
|
}, 400);
|
|
9560
9357
|
}
|
|
9561
|
-
// run:cycle:complete: lightweight re-fetch for
|
|
9562
|
-
// — cycles fire frequently and only affect
|
|
9358
|
+
// run:cycle:complete: lightweight re-fetch for tasks without renderOrgs()
|
|
9359
|
+
// — cycles fire frequently and only affect task state, not org-list status.
|
|
9563
9360
|
if (ev.type === 'run:cycle:complete' && _v2SelOrg === n && _v2OrgData) {
|
|
9564
|
-
if (_v2OrgTab === 'budgets' || _v2OrgTab === 'costs') {
|
|
9565
|
-
const _bcEnc = encodeURIComponent(_v2SelOrg);
|
|
9566
|
-
fetch(`/api/org/${_bcEnc}/budgets${DIR ? `?dir=${encodeURIComponent(DIR)}` : ''}`)
|
|
9567
|
-
.then(r => r.ok ? r.json() : null)
|
|
9568
|
-
.then(b => { if (b && _v2OrgData && _v2SelOrg === n) { _v2OrgData._budgets = b; _v2OrgTab === 'budgets' ? v2RenderOrgBudgets() : v2RenderOrgCosts(); } })
|
|
9569
|
-
.catch(() => { _v2OrgTab === 'budgets' ? v2RenderOrgBudgets() : v2RenderOrgCosts(); });
|
|
9570
|
-
}
|
|
9571
9361
|
if (_v2OrgTab === 'tasks') {
|
|
9572
9362
|
const _tcEnc = encodeURIComponent(_v2SelOrg);
|
|
9573
9363
|
fetch(`/api/org/${_tcEnc}${DIR ? `?dir=${encodeURIComponent(DIR)}` : ''}`)
|
|
@@ -9827,8 +9617,8 @@ function cmdSearch(q) {
|
|
|
9827
9617
|
|
|
9828
9618
|
// TABS group — only if org room is open
|
|
9829
9619
|
const orgTabs = (_v2SelOrg && currentView === 'orgs') ? [
|
|
9830
|
-
'chart','roles','
|
|
9831
|
-
'goals','board','live','approvals','secrets','settings','routines','myissues','
|
|
9620
|
+
'chart','roles','health','heartbeats','tasks','members',
|
|
9621
|
+
'goals','board','live','approvals','secrets','settings','routines','myissues','plugins'
|
|
9832
9622
|
].filter(t => !lq || t.includes(lq))
|
|
9833
9623
|
.map(t => ({ label: `Org Tab: ${t}`, tab: t })) : [];
|
|
9834
9624
|
|
|
@@ -209,7 +209,9 @@ export async function handleMonoesRoutes(req, res, url, corsOrigin, ctx) {
|
|
|
209
209
|
};
|
|
210
210
|
|
|
211
211
|
if (!code || !pending) {
|
|
212
|
-
closeTab(
|
|
212
|
+
closeTab(
|
|
213
|
+
'Connection failed — the request was invalid or expired. You can close this tab and try again.',
|
|
214
|
+
);
|
|
213
215
|
return true;
|
|
214
216
|
}
|
|
215
217
|
_pendingStates.delete(state);
|
|
@@ -258,7 +260,9 @@ export async function handleMonoesRoutes(req, res, url, corsOrigin, ctx) {
|
|
|
258
260
|
// explicit connect/disconnect actions.
|
|
259
261
|
if (req.method === 'GET' && url === '/api/monoes/status') {
|
|
260
262
|
const beforeConn = readMonoesConnection(MONOMIND_HOME);
|
|
261
|
-
const validToken = /* value */ beforeConn?.accessToken
|
|
263
|
+
const validToken = /* value */ beforeConn?.accessToken
|
|
264
|
+
? await getValidMonoesToken(MONOMIND_HOME)
|
|
265
|
+
: null;
|
|
262
266
|
const afterConn = readMonoesConnection(MONOMIND_HOME);
|
|
263
267
|
if (validToken !== (beforeConn?.accessToken || null)) {
|
|
264
268
|
_syncMonoesMcpEntry(path.resolve(projectDir || process.cwd()), validToken);
|
|
@@ -663,74 +663,8 @@ export async function handleOrgRoutes(req, res, url, corsOrigin, ctx) {
|
|
|
663
663
|
return true;
|
|
664
664
|
}
|
|
665
665
|
|
|
666
|
-
// GET /api/org/:name/skills — list skills from .claude/skills/ mapped to org roles
|
|
667
|
-
if (req.method === 'GET' && /^\/api\/org\/[a-z0-9][a-z0-9_-]{0,63}\/skills$/i.test(url)) {
|
|
668
|
-
try {
|
|
669
|
-
const parts = url.split('/');
|
|
670
|
-
const orgName = decodeURIComponent(parts[3]);
|
|
671
|
-
if (orgName.length > 64 || !/^[a-z0-9][a-z0-9_-]*$/i.test(orgName)) {
|
|
672
|
-
res.writeHead(400);
|
|
673
|
-
res.end('{}');
|
|
674
|
-
return true;
|
|
675
|
-
}
|
|
676
|
-
const _skillsQs = new URL(req.url, 'http://localhost').searchParams;
|
|
677
|
-
const d = path.resolve(_skillsQs.get('dir') || ctx.projectDir || process.cwd());
|
|
678
|
-
const skillsDir = path.join(d, '.claude', 'skills');
|
|
679
|
-
const orgFile = path.join(d, '.monomind', 'orgs', `${orgName}.json`);
|
|
680
|
-
|
|
681
|
-
// Scan skills directory
|
|
682
|
-
const skills = [];
|
|
683
|
-
if (fs.existsSync(skillsDir)) {
|
|
684
|
-
const scanDir = (dir, prefix) => {
|
|
685
|
-
try {
|
|
686
|
-
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
687
|
-
if (entry.isDirectory()) {
|
|
688
|
-
scanDir(path.join(dir, entry.name), `${entry.name}:`);
|
|
689
|
-
} else if (entry.name.endsWith('.md') && !entry.name.startsWith('_')) {
|
|
690
|
-
const slug = entry.name.replace(/\.md$/, '');
|
|
691
|
-
const content = fs.readFileSync(path.join(dir, entry.name), 'utf8').slice(0, 500);
|
|
692
|
-
const typeMatch = content.match(/^type:\s*(.+)$/m);
|
|
693
|
-
const modeMatch = content.match(/^default_mode:\s*(.+)$/m);
|
|
694
|
-
const descMatch = content.match(/^description:\s*(.+)$/m);
|
|
695
|
-
skills.push({
|
|
696
|
-
name: `${prefix}${slug}`,
|
|
697
|
-
slug,
|
|
698
|
-
type: typeMatch ? typeMatch[1].trim() : 'skill',
|
|
699
|
-
default_mode: modeMatch ? modeMatch[1].trim() : 'auto',
|
|
700
|
-
description: descMatch ? descMatch[1].trim() : '',
|
|
701
|
-
});
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
} catch (_) {}
|
|
705
|
-
};
|
|
706
|
-
scanDir(skillsDir, '');
|
|
707
|
-
}
|
|
708
|
-
|
|
709
|
-
// Map skills enabled per role from org config
|
|
710
|
-
const roleSkillMap = {};
|
|
711
|
-
if (fs.existsSync(orgFile)) {
|
|
712
|
-
try {
|
|
713
|
-
const config = JSON.parse(fs.readFileSync(orgFile, 'utf8'));
|
|
714
|
-
for (const role of config.roles || []) {
|
|
715
|
-
roleSkillMap[role.id] = role.skills || [];
|
|
716
|
-
}
|
|
717
|
-
} catch (_) {}
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
res.writeHead(200, {
|
|
721
|
-
'Content-Type': 'application/json',
|
|
722
|
-
...(corsOrigin ? { 'Access-Control-Allow-Origin': corsOrigin } : {}),
|
|
723
|
-
});
|
|
724
|
-
res.end(JSON.stringify({ skills, role_skill_map: roleSkillMap }));
|
|
725
|
-
} catch (_) {
|
|
726
|
-
res.writeHead(500);
|
|
727
|
-
res.end('{}');
|
|
728
|
-
}
|
|
729
|
-
return true;
|
|
730
|
-
}
|
|
731
|
-
|
|
732
666
|
// GET /api/org/:name/agent/:roleId — full agent detail: org role + .claude/agents definition
|
|
733
|
-
// (characteristics,
|
|
667
|
+
// (characteristics, responsibilities, instructions document)
|
|
734
668
|
if (
|
|
735
669
|
req.method === 'GET' &&
|
|
736
670
|
/^\/api\/org\/[a-z0-9][a-z0-9_-]{0,63}\/agent\/[a-z0-9][a-z0-9_-]{0,63}$/i.test(url)
|
|
@@ -1457,7 +1391,6 @@ export async function handleOrgRoutes(req, res, url, corsOrigin, ctx) {
|
|
|
1457
1391
|
lastHeartbeat: s.last_heartbeat || s.lastHeartbeat || null,
|
|
1458
1392
|
tokensIn: s.tokens_in || 0,
|
|
1459
1393
|
tokensOut: s.tokens_out || 0,
|
|
1460
|
-
skills: r.skills || [],
|
|
1461
1394
|
};
|
|
1462
1395
|
});
|
|
1463
1396
|
res.writeHead(200, {
|
package/dist/src/ui/server.mjs
CHANGED
|
@@ -18,8 +18,8 @@ import {
|
|
|
18
18
|
collectSystem,
|
|
19
19
|
collectTokens,
|
|
20
20
|
} from './collector.mjs';
|
|
21
|
-
import { handleMonographRoutes } from './routes-monograph.mjs';
|
|
22
21
|
import { handleMonoesRoutes } from './routes-monoes.mjs';
|
|
22
|
+
import { handleMonographRoutes } from './routes-monograph.mjs';
|
|
23
23
|
import { handleOrgRoutes } from './routes-org.mjs';
|
|
24
24
|
import {
|
|
25
25
|
addMmClient,
|