titan-agent 6.1.0-beta.22 → 6.1.0-beta.23

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 (138) hide show
  1. package/dist/gateway/routes/commandPost.js +4 -1
  2. package/dist/gateway/routes/commandPost.js.map +1 -1
  3. package/dist/gateway/server.js +37 -2
  4. package/dist/gateway/server.js.map +1 -1
  5. package/dist/utils/constants.js +1 -1
  6. package/dist/utils/constants.js.map +1 -1
  7. package/package.json +1 -1
  8. package/ui/dist/assets/{AuditPanel-Cwi1NfQ-.js → AuditPanel-fuVYr1ze.js} +1 -1
  9. package/ui/dist/assets/{AutonomyPanel-CUyK91fk.js → AutonomyPanel-Cd3J9vjV.js} +1 -1
  10. package/ui/dist/assets/{AutopilotPanel-Can4ieEH.js → AutopilotPanel-B1ydG4ZO.js} +1 -1
  11. package/ui/dist/assets/{AutoresearchPanel-fYniSa3o.js → AutoresearchPanel-BwD0k5hr.js} +1 -1
  12. package/ui/dist/assets/{BackupPanel-uOUEOBBG.js → BackupPanel-D8p_ks_9.js} +1 -1
  13. package/ui/dist/assets/{BrowserPanel-Bc2X9Gip.js → BrowserPanel-DK-uUv4N.js} +1 -1
  14. package/ui/dist/assets/{CPActivity-p-0W1sc5.js → CPActivity-l_0ci8mz.js} +1 -1
  15. package/ui/dist/assets/{CPAgentDetail-Bp0SsSpb.js → CPAgentDetail-D3MN13sr.js} +1 -1
  16. package/ui/dist/assets/{CPAgents-DeYTS1Kl.js → CPAgents-D4vB52w0.js} +1 -1
  17. package/ui/dist/assets/{CPApprovals-mcsqaOp8.js → CPApprovals-DknYomBW.js} +1 -1
  18. package/ui/dist/assets/{CPCosts-mLf5vE1I.js → CPCosts-Da5HmXBe.js} +1 -1
  19. package/ui/dist/assets/{CPDashboard-DrVlNNeH.js → CPDashboard-g3LJyyf5.js} +1 -1
  20. package/ui/dist/assets/{CPFiles-pYdkGggi.js → CPFiles-CwK6Tunk.js} +1 -1
  21. package/ui/dist/assets/{CPGoals-iTWzur4k.js → CPGoals-9Vse1GdM.js} +1 -1
  22. package/ui/dist/assets/{CPInbox-z2cLQl99.js → CPInbox-CtNKrbZy.js} +1 -1
  23. package/ui/dist/assets/{CPIssueDetail-VKDHHZaL.js → CPIssueDetail-CC-wNs5i.js} +1 -1
  24. package/ui/dist/assets/{CPIssues-CojqjJQy.js → CPIssues-BehPpRGt.js} +1 -1
  25. package/ui/dist/assets/{CPLayout-BCHLsagy.js → CPLayout-C_sHRpvI.js} +3 -3
  26. package/ui/dist/assets/{CPOrg-Clhde162.js → CPOrg-DuHClpYT.js} +1 -1
  27. package/ui/dist/assets/{CPRuns-B190oAXH.js → CPRuns-06OM7XQu.js} +1 -1
  28. package/ui/dist/assets/{CPSocial-6nDnEtXt.js → CPSocial-D-I_BxUB.js} +1 -1
  29. package/ui/dist/assets/{ChannelsPanel-k0L4pSqU.js → ChannelsPanel-MCIFg3pb.js} +1 -1
  30. package/ui/dist/assets/{CheckpointsPanel-C4rMUDcc.js → CheckpointsPanel-u56TteqI.js} +1 -1
  31. package/ui/dist/assets/{CommandPostHub-BM5nuwxE.js → CommandPostHub-CFdGjKpQ.js} +3 -3
  32. package/ui/dist/assets/{CronPanel-BIwdwAs_.js → CronPanel-DWykq9gO.js} +1 -1
  33. package/ui/dist/assets/{DataTable-Dubw4qB0.js → DataTable-v7j4Zbsi.js} +1 -1
  34. package/ui/dist/assets/{DreamPanel-X66UFZdq.js → DreamPanel-S-zDBnnJ.js} +1 -1
  35. package/ui/dist/assets/{EmptyState-BIV9ioLR.js → EmptyState-CKr5w_yj.js} +1 -1
  36. package/ui/dist/assets/{EvalHarnessPanel-BUc6JPFo.js → EvalHarnessPanel-m9YrP78Q.js} +1 -1
  37. package/ui/dist/assets/{EvalPanel-Wejdcu9z.js → EvalPanel-DrhMAi7H.js} +1 -1
  38. package/ui/dist/assets/{FileViewer-2E97wiCj.js → FileViewer-n4yZ4_Ai.js} +1 -1
  39. package/ui/dist/assets/{FilesPanel-Dk6hBL5I.js → FilesPanel-BxS_O0eO.js} +1 -1
  40. package/ui/dist/assets/{FleetPanel-CNVk9o9b.js → FleetPanel-jWXWydYm.js} +1 -1
  41. package/ui/dist/assets/{HomelabPanel-CmLZsw8L.js → HomelabPanel-Cs5lkri9.js} +1 -1
  42. package/ui/dist/assets/InfraView-CFYSKWGv.js +2 -0
  43. package/ui/dist/assets/{InlineEditableField-YvyDNM0_.js → InlineEditableField-B9kISJg0.js} +1 -1
  44. package/ui/dist/assets/{Input-CJtP7u1f.js → Input-D6dTV0Q_.js} +1 -1
  45. package/ui/dist/assets/{IntegrationsPanel-DOjEFJ4_.js → IntegrationsPanel-CxlOwMoh.js} +1 -1
  46. package/ui/dist/assets/IntelligenceView-D8Qf1Xua.js +2 -0
  47. package/ui/dist/assets/{LearningPanel-DCv-0pXx.js → LearningPanel-D6mQkh27.js} +1 -1
  48. package/ui/dist/assets/{LogsPanel-DTl9FO_X.js → LogsPanel-DXxfoHie.js} +1 -1
  49. package/ui/dist/assets/{McpPanel-CVD_Cf9L.js → McpPanel-Cjbiw_vP.js} +1 -1
  50. package/ui/dist/assets/{MemoryGraphPanel-BmnRYfCE.js → MemoryGraphPanel-BlDhM2k_.js} +1 -1
  51. package/ui/dist/assets/{MemoryWikiPanel-BqR_5mnO.js → MemoryWikiPanel-CYl3zHmU.js} +1 -1
  52. package/ui/dist/assets/{MeshPanel-Ddokx0l1.js → MeshPanel-DBeGiQD0.js} +1 -1
  53. package/ui/dist/assets/{MissionCanvas-BeYgEOKd.js → MissionCanvas--Sx00EAz.js} +1 -1
  54. package/ui/dist/assets/{MissionChat-BBTvUrvO.js → MissionChat-B0K3W7x4.js} +1 -1
  55. package/ui/dist/assets/{MissionLibrary-P0W4ju5m.js → MissionLibrary-CcpTdqgd.js} +1 -1
  56. package/ui/dist/assets/{MissionStart-BDOg9wCm.js → MissionStart-BiTgbTmX.js} +1 -1
  57. package/ui/dist/assets/{Modal-wmwGzuuF.js → Modal-CH-RjqAK.js} +1 -1
  58. package/ui/dist/assets/{NvidiaPanel-zKchzsUQ.js → NvidiaPanel-CW1O5jDi.js} +1 -1
  59. package/ui/dist/assets/{OrganismPanel-B10s6OHj.js → OrganismPanel-BWej5mWY.js} +1 -1
  60. package/ui/dist/assets/{OverviewPanel-BSeq_oDL.js → OverviewPanel-_LyECbq4.js} +1 -1
  61. package/ui/dist/assets/{PageHeader-ypkKM-Md.js → PageHeader-m0UzGwbS.js} +1 -1
  62. package/ui/dist/assets/{PersonaProfilesPanel-Dz4gUhAN.js → PersonaProfilesPanel-C3v7s66x.js} +1 -1
  63. package/ui/dist/assets/{PersonasPanel-CagZxS-f.js → PersonasPanel-DQ6KH0Ie.js} +1 -1
  64. package/ui/dist/assets/{RecipesPanel-Dx2i-5vk.js → RecipesPanel-5IT0qxEv.js} +1 -1
  65. package/ui/dist/assets/{SecurityPanel-CGcrES1w.js → SecurityPanel-TnZkhGC_.js} +1 -1
  66. package/ui/dist/assets/{SelfImprovePanel-CBUap5A8.js → SelfImprovePanel-377M77Ju.js} +1 -1
  67. package/ui/dist/assets/{SelfProposalsPanel-DhVHhtgs.js → SelfProposalsPanel-CpVkA_Gg.js} +1 -1
  68. package/ui/dist/assets/{SessionsPanel-BCfaa7XH.js → SessionsPanel-CX1c0As_.js} +1 -1
  69. package/ui/dist/assets/{SessionsTab-BaNqT7vK.js → SessionsTab-BYjg5rPW.js} +1 -1
  70. package/ui/dist/assets/{SettingsPanel-DOY_Q3d1.js → SettingsPanel-oJri5Xgc.js} +1 -1
  71. package/ui/dist/assets/{SettingsView-DoUbiqLu.js → SettingsView-C4xFdDmX.js} +2 -2
  72. package/ui/dist/assets/{SkeletonLoader-C9IEBzUV.js → SkeletonLoader-BsGWCoJP.js} +1 -1
  73. package/ui/dist/assets/{SkillsPanel-BLbZVfpT.js → SkillsPanel-CfuK-jza.js} +1 -1
  74. package/ui/dist/assets/{SomaView-COOI_bzj.js → SomaView-JQrgH0Xy.js} +1 -1
  75. package/ui/dist/assets/{StatCard-SFfg43na.js → StatCard-CF0-s2ii.js} +1 -1
  76. package/ui/dist/assets/{StatusBadge-FHXxkh_l.js → StatusBadge-eudTdD3y.js} +1 -1
  77. package/ui/dist/assets/{Tabs-CnrILkx_.js → Tabs-ByEQcvdF.js} +1 -1
  78. package/ui/dist/assets/{TeamsPanel-BayUJbAC.js → TeamsPanel-QOHr86Ji.js} +1 -1
  79. package/ui/dist/assets/{TelemetryPanel-DIjceFyl.js → TelemetryPanel-DQbY1sKi.js} +1 -1
  80. package/ui/dist/assets/{TitanCanvas-ChpAQiru.js → TitanCanvas-Dg-rpxGb.js} +26 -26
  81. package/ui/dist/assets/ToolsView-cp6pQK-Z.js +2 -0
  82. package/ui/dist/assets/{Tooltip-VEi18o-V.js → Tooltip-CeLeHLYy.js} +1 -1
  83. package/ui/dist/assets/{TraceViewer-CJKkW164.js → TraceViewer-4smUzD8C.js} +1 -1
  84. package/ui/dist/assets/{TrainingPanel-Dvne58z3.js → TrainingPanel-BkwO2jp8.js} +1 -1
  85. package/ui/dist/assets/VoiceOverlay-CnzoHMwh.js +27 -0
  86. package/ui/dist/assets/{VramPanel-COtj3Kiv.js → VramPanel-B-d2oB0k.js} +1 -1
  87. package/ui/dist/assets/{WatchView-CAQBZY1u.js → WatchView-1EK4Ra0x.js} +1 -1
  88. package/ui/dist/assets/{WorkTab-kObqMYZQ.js → WorkTab-C8i-_I5b.js} +1 -1
  89. package/ui/dist/assets/{WorkflowsPanel-_dWtF5va.js → WorkflowsPanel-bwTGQD-G.js} +1 -1
  90. package/ui/dist/assets/{arrow-left-DX6vHmxL.js → arrow-left-D1drWY4X.js} +1 -1
  91. package/ui/dist/assets/{briefcase-BJVFBlMI.js → briefcase-w3_Ver1p.js} +1 -1
  92. package/ui/dist/assets/{chart-column-su7tPuks.js → chart-column-C_LIPDI2.js} +1 -1
  93. package/ui/dist/assets/{check-lbekWaYK.js → check-nDpe7lmA.js} +1 -1
  94. package/ui/dist/assets/{chevron-down-CQWyEJHg.js → chevron-down-Cx7po_MF.js} +1 -1
  95. package/ui/dist/assets/{chevron-right-Dkw8qoiM.js → chevron-right-CeBUUvs9.js} +1 -1
  96. package/ui/dist/assets/{chevron-up-DKOmBkUi.js → chevron-up-DWdqygHP.js} +1 -1
  97. package/ui/dist/assets/{circle-check-big-k3p85RVj.js → circle-check-big-DIoQE6AJ.js} +1 -1
  98. package/ui/dist/assets/{clock-UpzfZk7K.js → clock-DccF1BgP.js} +1 -1
  99. package/ui/dist/assets/{dollar-sign-HXJtsVW9.js → dollar-sign-DZiuU1DB.js} +1 -1
  100. package/ui/dist/assets/{download-BrssZyC8.js → download-CU4g72Jx.js} +1 -1
  101. package/ui/dist/assets/{external-link-BgT5r7pq.js → external-link-FMjxfN4J.js} +1 -1
  102. package/ui/dist/assets/{folder-L5Vkb8PU.js → folder-CESt5ZP9.js} +1 -1
  103. package/ui/dist/assets/{funnel-BSG05QQ5.js → funnel-BojzibK1.js} +1 -1
  104. package/ui/dist/assets/{git-branch-CWrSukqK.js → git-branch-B_FAVVkB.js} +1 -1
  105. package/ui/dist/assets/{index-PDRuOqpU.js → index-BlBwt5bA.js} +2 -2
  106. package/ui/dist/assets/index-CVD3Q-nL.css +1 -0
  107. package/ui/dist/assets/{layers-C6q6PODo.js → layers-D9n_KH7m.js} +1 -1
  108. package/ui/dist/assets/{legacy-BuSD64nh.js → legacy-KiOClwKH.js} +1 -1
  109. package/ui/dist/assets/{lightbulb-C6rGS0e9.js → lightbulb-wBLO01WD.js} +1 -1
  110. package/ui/dist/assets/{list-todo-CAWfDglO.js → list-todo-CLOas3TL.js} +1 -1
  111. package/ui/dist/assets/{missions-BZ-Ugi68.js → missions-BHuCWnmF.js} +1 -1
  112. package/ui/dist/assets/{network-C7vpKIGR.js → network-R2rhdpLp.js} +1 -1
  113. package/ui/dist/assets/{pause-BS5O2bH2.js → pause-CwRsS-nN.js} +1 -1
  114. package/ui/dist/assets/{play-DTMg3Iqs.js → play-DPq1CRxi.js} +1 -1
  115. package/ui/dist/assets/{plug-BhrD7aye.js → plug-CvZuseTz.js} +1 -1
  116. package/ui/dist/assets/{plus-U08SPH5P.js → plus-X0s1BBeV.js} +1 -1
  117. package/ui/dist/assets/{proxy-CgL4993R.js → proxy-wiBex1mH.js} +1 -1
  118. package/ui/dist/assets/{refresh-cw-DPPX-TtZ.js → refresh-cw-Dw-xt-8N.js} +1 -1
  119. package/ui/dist/assets/{rotate-ccw-BA2oRbnD.js → rotate-ccw-C-ZlTw41.js} +1 -1
  120. package/ui/dist/assets/{save-DRG4yEnn.js → save-vfHyz_iR.js} +1 -1
  121. package/ui/dist/assets/{search-BUxR7Xr7.js → search-D51wZ86O.js} +1 -1
  122. package/ui/dist/assets/{send-CBnkJhTr.js → send-vbRU6VDp.js} +1 -1
  123. package/ui/dist/assets/{shield-check-JIQWTH1q.js → shield-check-BU0XgiiB.js} +1 -1
  124. package/ui/dist/assets/{target-DAYmCNyc.js → target-IhIvO0yh.js} +1 -1
  125. package/ui/dist/assets/{terminal-D7qBXHKK.js → terminal-CbZlMKy6.js} +1 -1
  126. package/ui/dist/assets/{toggle-right--2fCSwSJ.js → toggle-right-BilvTuN8.js} +1 -1
  127. package/ui/dist/assets/{trash-2-KE2CkHiF.js → trash-2-DJa-b1yv.js} +1 -1
  128. package/ui/dist/assets/{trending-up-BSTNXrnP.js → trending-up-C4TTMFfy.js} +1 -1
  129. package/ui/dist/assets/{trophy-DTxelnBg.js → trophy-CTHJcLgb.js} +1 -1
  130. package/ui/dist/assets/{users-BRcQmW7-.js → users-BqW-QV33.js} +1 -1
  131. package/ui/dist/assets/{wrench-UfGiI4Vf.js → wrench-DTyjGmFV.js} +1 -1
  132. package/ui/dist/index.html +2 -2
  133. package/ui/dist/sw.js +1 -1
  134. package/ui/dist/assets/InfraView-14vwBFn7.js +0 -2
  135. package/ui/dist/assets/IntelligenceView-CXflMUb3.js +0 -2
  136. package/ui/dist/assets/ToolsView-CSCp4L9v.js +0 -2
  137. package/ui/dist/assets/VoiceOverlay-B_g12iXa.js +0 -27
  138. package/ui/dist/assets/index-Cb5bSxRB.css +0 -1
@@ -178,7 +178,10 @@ function createCommandPostRouter() {
178
178
  res.json(getBudgetPolicies());
179
179
  });
180
180
  router.get("/budgets/reservations", (_req, res) => {
181
- res.json([]);
181
+ res.status(501).json({
182
+ error: "not_implemented",
183
+ message: "Listing budget reservations is not yet supported by the storage layer. Reservations are persisted (saveBudgetReservation) and can be fetched by id (getBudgetReservation) but not enumerated. Track this in v6.2."
184
+ });
182
185
  });
183
186
  router.post("/budgets", (req, res) => {
184
187
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/gateway/routes/commandPost.ts"],"sourcesContent":["/**\n * Command Post Router\n *\n * Extracted from gateway/server.ts v5.4.5 → v5.5.0.\n * Consolidates all /api/command-post/* routes for agent governance.\n */\n\nimport { Router, type Request, type Response } from 'express';\nimport logger from '../../utils/logger.js';\nimport { setupSSEFlush } from '../../utils/sseFlush.js';\n\n// Command Post core\nimport {\n getDashboard as getCPDashboard,\n getRegisteredAgents,\n reportHeartbeat,\n removeAgent,\n checkoutTask,\n checkinTask,\n getActiveCheckouts,\n getBudgetPolicies,\n createBudgetPolicy,\n updateBudgetPolicy,\n deleteBudgetPolicy,\n getActivity,\n getGoalTree,\n getAncestryChain,\n validateGoalAncestry,\n validateGoalParentAssignment,\n sweepExpiredCheckoutsManual,\n getStaleAgents,\n enforceBudgetForAgent,\n getBudgetPolicyForAgent,\n createIssue,\n updateIssue,\n getIssue,\n listIssues,\n searchIssues,\n checkoutIssue,\n deleteIssue,\n addIssueComment,\n getIssueComments,\n createApproval,\n approveApproval,\n rejectApproval,\n listApprovals,\n getApproval,\n replyToApproval,\n snoozeApproval,\n unsnoozeApproval,\n batchApprove,\n batchReject,\n getAgentMessages,\n markAgentMessageRead,\n startRun,\n endRun,\n listRuns,\n getOrgTree,\n updateRegisteredAgent,\n} from '../../agent/commandPost.js';\n\n// Agent wakeup\nimport {\n getAgentInbox,\n queueWakeup,\n getWakeupRequest,\n cancelWakeup,\n drainPendingResults,\n} from '../../agent/agentWakeup.js';\n\n// Daemon events (for SSE)\nimport { titanEvents } from '../../agent/daemon.js';\n\n// Goals\nimport { createGoal } from '../../agent/goals.js';\n\nconst COMPONENT = 'CommandPostRouter';\n\nexport function createCommandPostRouter(): Router {\n const router = Router();\n\n // ── Dashboard ─────────────────────────────────────────────\n router.get('/dashboard', async (_req, res) => {\n const dashboard = getCPDashboard();\n try {\n const { listCompanies, getActiveRunners } = await import('../../agent/company.js');\n const companies = listCompanies();\n const runners = getActiveRunners();\n (dashboard as Record<string, unknown>).companies = companies.map(c => ({\n ...c,\n runnerActive: runners.includes(c.id),\n }));\n } catch { (dashboard as Record<string, unknown>).companies = []; }\n res.json(dashboard);\n });\n\n // ── Agents ──────────────────────────────────────────────────\n router.get('/agents', (_req, res) => {\n res.json(getRegisteredAgents());\n });\n\n router.post('/agents/:id/heartbeat', (req, res) => {\n const ok = reportHeartbeat(req.params.id);\n res.json({ success: ok });\n });\n\n router.post('/agents/:id/fire', async (req, res) => {\n try {\n const { fireHeartbeat } = await import('../../agent/heartbeatScheduler.js');\n await fireHeartbeat(req.params.id);\n res.json({ success: true });\n } catch (err) {\n res.status(500).json({ success: false, error: (err as Error).message });\n }\n });\n\n router.delete('/agents/:id', (req, res) => {\n const ok = removeAgent(req.params.id);\n if (!ok) { res.status(400).json({ error: 'Cannot remove agent (not found or is the primary agent)' }); return; }\n res.json({ success: true });\n });\n\n router.patch('/agents/:id', async (req, res) => {\n const { reportsTo, role, title, name, status, model } = req.body;\n const updated = updateRegisteredAgent(req.params.id, { reportsTo, role, title, name, model });\n if (!updated) { res.status(404).json({ error: 'Agent not found' }); return; }\n if (status && typeof status === 'string') {\n try {\n const { updateAgentStatus } = await import('../../agent/commandPost.js');\n updateAgentStatus(req.params.id, status as 'active' | 'idle' | 'paused' | 'error' | 'stopped');\n } catch { /* ok */ }\n }\n res.json(updated);\n });\n\n router.patch('/agents/:id/identity', async (req, res) => {\n const { voiceId, personaId, systemPromptOverride, memoryNamespace, characterSummary, model } = req.body || {};\n const coerce = (v: unknown): string | null | undefined => {\n if (v === null) return null;\n if (typeof v === 'string') return v;\n if (v === undefined) return undefined;\n res.status(400).json({ error: `Invalid identity field: expected string or null, got ${typeof v}` });\n return undefined;\n };\n if (res.headersSent) return;\n const { updateAgentIdentity } = await import('../../agent/commandPost.js');\n const updated = updateAgentIdentity(req.params.id, {\n voiceId: coerce(voiceId),\n personaId: coerce(personaId),\n systemPromptOverride: coerce(systemPromptOverride),\n memoryNamespace: coerce(memoryNamespace),\n characterSummary: coerce(characterSummary),\n model: coerce(model),\n });\n if (res.headersSent) return;\n if (!updated) { res.status(404).json({ error: 'Agent not found' }); return; }\n res.json(updated);\n });\n\n router.get('/agents/stale', (_req, res) => {\n const stale = getStaleAgents();\n res.json({ stale, total: stale.length });\n });\n\n // ── Tasks (checkout/checkin) ────────────────────────────────\n router.post('/tasks/:goalId/:subtaskId/checkout', (req, res) => {\n const agentId = (req.body as { agentId?: string }).agentId || 'manual';\n const lock = checkoutTask(req.params.goalId, req.params.subtaskId, agentId);\n if (!lock) { res.status(409).json({ error: 'Task already checked out by another agent' }); return; }\n res.json(lock);\n });\n\n router.post('/tasks/:goalId/:subtaskId/checkin', (req, res) => {\n const runId = (req.body as { runId?: string }).runId || '';\n const ok = checkinTask(req.params.subtaskId, runId);\n if (!ok) { res.status(404).json({ error: 'No matching checkout found' }); return; }\n res.json({ success: true });\n });\n\n // ── Checkouts ───────────────────────────────────────────────\n router.get('/checkouts', (_req, res) => {\n res.json(getActiveCheckouts());\n });\n\n router.post('/checkouts/sweep', (_req, res) => {\n const result = sweepExpiredCheckoutsManual();\n res.json(result);\n });\n\n router.get('/checkouts/expired', (_req, res) => {\n const result = sweepExpiredCheckoutsManual();\n res.json({ expired: result.swept, details: result.details });\n });\n\n // ── Budgets ─────────────────────────────────────────────────\n router.get('/budgets', (_req, res) => {\n res.json(getBudgetPolicies());\n });\n\n router.get('/budgets/reservations', (_req, res) => {\n res.json([]);\n });\n\n router.post('/budgets', (req, res) => {\n try {\n const body = req.body as {\n name: string;\n scope: { type: 'agent' | 'goal' | 'global'; targetId?: string };\n period: 'daily' | 'weekly' | 'monthly';\n limitUsd: number;\n warningThresholdPercent?: number;\n action?: 'warn' | 'pause' | 'stop';\n enabled?: boolean;\n };\n const policy = createBudgetPolicy({\n name: body.name,\n scope: body.scope,\n period: body.period,\n limitUsd: body.limitUsd,\n warningThresholdPercent: body.warningThresholdPercent ?? 80,\n action: body.action ?? 'pause',\n enabled: body.enabled ?? true,\n });\n res.status(201).json(policy);\n } catch (err) {\n res.status(400).json({ error: (err as Error).message });\n }\n });\n\n router.put('/budgets/:id', (req, res) => {\n const updated = updateBudgetPolicy(req.params.id, req.body as Record<string, unknown>);\n if (!updated) { res.status(404).json({ error: 'Budget policy not found' }); return; }\n res.json(updated);\n });\n\n router.delete('/budgets/:id', (req, res) => {\n const ok = deleteBudgetPolicy(req.params.id);\n if (!ok) { res.status(404).json({ error: 'Budget policy not found' }); return; }\n res.json({ success: true });\n });\n\n router.post('/budgets/:agentId/enforce', (req, res) => {\n const result = enforceBudgetForAgent(req.params.agentId);\n if (!result.budgetOk) {\n res.status(403).json({ budgetOk: false, policies: result.policies, message: 'Budget exceeded — agent paused' });\n return;\n }\n res.json({ budgetOk: true, policies: result.policies });\n });\n\n router.get('/budgets/agent/:agentId', (req, res) => {\n const budgetInfo = getBudgetPolicyForAgent(req.params.agentId);\n res.json(budgetInfo);\n });\n\n // ── Activity ──────────────────────────────────────────────\n router.get('/activity', (req, res) => {\n const limit = parseInt(req.query.limit as string) || 50;\n const type = req.query.type as string | undefined;\n res.json(getActivity({ limit, type }));\n });\n\n // ── Audit ───────────────────────────────────────────────────\n router.get('/audit', async (req, res) => {\n try {\n const { queryAudit } = await import('../../agent/auditStore.js');\n const query = {\n agentId: req.query.agentId as string | undefined,\n sessionId: req.query.sessionId as string | undefined,\n type: req.query.type as string | undefined,\n toolName: req.query.toolName as string | undefined,\n from: req.query.from as string | undefined,\n to: req.query.to as string | undefined,\n limit: req.query.limit ? parseInt(req.query.limit as string) : 100,\n };\n res.json(queryAudit(query));\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n router.get('/audit/costs', async (req, res) => {\n try {\n const { getAgentCostSummary, getDailyCostBreakdown } = await import('../../agent/auditStore.js');\n const groupBy = req.query.groupBy as string || 'agent';\n if (groupBy === 'day') {\n const days = req.query.days ? parseInt(req.query.days as string) : 30;\n res.json(getDailyCostBreakdown(days));\n } else {\n const agentId = req.query.agentId as string | undefined;\n res.json(getAgentCostSummary(agentId));\n }\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Goals ───────────────────────────────────────────────────\n router.post('/goals', (req, res) => {\n const { title, description, subtasks, priority, tags, force } = req.body;\n if (!title) { res.status(400).json({ error: 'title is required' }); return; }\n try {\n const goal = createGoal({\n title,\n description: description || '',\n subtasks: subtasks || [],\n priority,\n tags,\n force: !!force,\n });\n res.status(201).json({ goal });\n } catch (err) {\n res.status(429).json({ error: (err as Error).message });\n }\n });\n\n router.get('/goals/tree', (_req, res) => {\n res.json(getGoalTree());\n });\n\n router.get('/goals/:id/ancestry', (req, res) => {\n const chain = getAncestryChain(req.params.id);\n if (chain.length === 0) { res.status(404).json({ error: 'Goal not found' }); return; }\n res.json(chain);\n });\n\n router.post('/goals/:id/validate', (req, res) => {\n const { parentGoalId } = req.body as { parentGoalId?: string | null };\n if (parentGoalId !== undefined) {\n const result = validateGoalParentAssignment(req.params.id, parentGoalId || null);\n if (!result.valid) {\n res.status(422).json({ valid: false, errors: result.errors });\n return;\n }\n res.json({ valid: true });\n } else {\n const result = validateGoalAncestry(req.params.id);\n if (!result.valid) {\n res.status(422).json({ valid: false, errors: result.errors });\n return;\n }\n res.json({ valid: true });\n }\n });\n\n // ── Conflict Resolution ─────────────────────────────────────\n router.post('/conflicts/propose', async (req, res) => {\n try {\n const { conflictResolver } = await import('../../agent/conflictResolver.js');\n const { entities, type, description, metadata } = req.body;\n if (!entities || !Array.isArray(entities) || entities.length === 0) {\n res.status(400).json({ error: 'entities array is required' }); return;\n }\n if (!type || !['file', 'goal', 'resource', 'agent', 'config', 'other'].includes(type)) {\n res.status(400).json({ error: 'valid type is required (file, goal, resource, agent, config, other)' }); return;\n }\n if (!description || typeof description !== 'string') {\n res.status(400).json({ error: 'description string is required' }); return;\n }\n const proposal = await conflictResolver.generateProposal({ entities, type, description, metadata: metadata || {} });\n res.json(proposal);\n } catch (error) {\n logger.error(COMPONENT, 'Conflict proposal generation error:', error);\n res.status(500).json({ error: 'Failed to generate conflict resolution proposal' });\n }\n });\n\n router.post('/conflicts/propose/formatted', async (req, res) => {\n try {\n const { conflictResolver } = await import('../../agent/conflictResolver.js');\n const { entities, type, description, metadata } = req.body;\n if (!entities || !Array.isArray(entities) || entities.length === 0) {\n res.status(400).json({ error: 'entities array is required' }); return;\n }\n if (!type || !['file', 'goal', 'resource', 'agent', 'config', 'other'].includes(type)) {\n res.status(400).json({ error: 'valid type is required (file, goal, resource, agent, config, other)' }); return;\n }\n if (!description || typeof description !== 'string') {\n res.status(400).json({ error: 'description string is required' }); return;\n }\n const proposal = await conflictResolver.generateProposal({ entities, type, description, metadata: metadata || {} });\n const formatted = conflictResolver.formatProposal(proposal);\n res.type('text/plain').send(formatted);\n } catch (error) {\n logger.error(COMPONENT, 'Conflict proposal formatting error:', error);\n res.status(500).json({ error: 'Failed to format conflict resolution proposal' });\n }\n });\n\n router.get('/conflicts/types', (_req, res) => {\n res.json({\n types: [\n { id: 'file', name: 'File Conflict', description: 'Merge conflicts, version conflicts' },\n { id: 'goal', name: 'Goal Conflict', description: 'Competing or conflicting goals' },\n { id: 'resource', name: 'Resource Conflict', description: 'Resource contention (GPU, memory, etc.)' },\n { id: 'agent', name: 'Agent Conflict', description: 'Agent coordination conflicts' },\n { id: 'config', name: 'Configuration Conflict', description: 'Conflicting configuration values' },\n { id: 'other', name: 'Other', description: 'Unclassified conflict type' }\n ]\n });\n });\n\n // ── SSE Stream ────────────────────────────────────────────\n const CP_SSE_EVENTS = [\n 'commandpost:activity', 'commandpost:task:checkout', 'commandpost:task:checkin',\n 'commandpost:task:expired', 'commandpost:budget:warning', 'commandpost:budget:exceeded',\n 'commandpost:agent:heartbeat', 'commandpost:agent:status',\n ];\n\n router.get('/stream', (req, res) => {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n const sseWrite = setupSSEFlush(res);\n\n const onEvent = (event: string, data: unknown) => {\n try { sseWrite(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`); } catch { /* client gone */ }\n };\n\n const listeners = new Map<string, (data: unknown) => void>();\n for (const evt of CP_SSE_EVENTS) {\n const handler = (data: unknown) => onEvent(evt, data);\n listeners.set(evt, handler);\n titanEvents.on(evt, handler);\n }\n\n const keepalive = setInterval(() => {\n try { sseWrite(': keepalive\\n\\n'); } catch { /* client gone */ }\n }, 15_000);\n\n req.on('close', () => {\n clearInterval(keepalive);\n for (const [evt, handler] of listeners) {\n titanEvents.removeListener(evt, handler);\n }\n });\n });\n\n // ── Org Chart ───────────────────────────────────────────────\n router.get('/org', async (_req, res) => {\n const org = getOrgTree();\n try {\n const { listCompanies } = await import('../../agent/company.js');\n const companies = listCompanies();\n const companyNodes = companies.map(c => ({\n id: c.id,\n name: c.name,\n role: 'Company',\n title: c.description,\n status: c.status,\n model: '',\n reports: c.agents.map(a => ({\n id: a.id,\n name: a.name,\n role: a.role,\n title: a.template,\n status: a.status,\n model: '',\n reports: [],\n })),\n }));\n if (Array.isArray(org)) {\n org.push(...companyNodes);\n } else if (org && typeof org === 'object') {\n (org as Record<string, unknown>).companies = companyNodes;\n }\n } catch { /* non-critical */ }\n res.json(org);\n });\n\n // ── Issues ──────────────────────────────────────────────────\n router.get('/issues', (req, res) => {\n const filters = {\n status: req.query.status as string | undefined,\n assigneeAgentId: req.query.assignee as string | undefined,\n goalId: req.query.goalId as string | undefined,\n };\n res.json(listIssues(filters));\n });\n\n router.get('/issues/search', (req, res) => {\n const q = req.query.q as string | undefined;\n if (!q || q.trim().length < 2) {\n res.status(400).json({ error: 'Query must be at least 2 characters' }); return;\n }\n res.json(searchIssues(q));\n });\n\n router.post('/issues', (req, res) => {\n const { title, description, priority, assigneeAgentId, goalId, parentId } = req.body;\n if (!title) { res.status(400).json({ error: 'title is required' }); return; }\n const issue = createIssue({ title, description, priority, assigneeAgentId, goalId, parentId, createdByUser: 'board' });\n res.status(201).json(issue);\n });\n\n router.get('/issues/:id/context', (req, res) => {\n const issue = getIssue(req.params.id);\n if (!issue) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.json({ ancestry: issue.goalId || '', issue });\n });\n\n router.get('/issues/:id', (req, res) => {\n const issue = getIssue(req.params.id);\n if (!issue) { res.status(404).json({ error: 'Issue not found' }); return; }\n const issueComments = getIssueComments(req.params.id);\n res.json({ ...issue, comments: issueComments });\n });\n\n router.get('/issues/:id/comments', (req, res) => {\n const issue = getIssue(req.params.id);\n if (!issue) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.json(getIssueComments(req.params.id));\n });\n\n router.patch('/issues/:id', (req, res) => {\n const { title, description, status, priority, assigneeAgentId, goalId } = req.body;\n const updated = updateIssue(req.params.id, { title, description, status, priority, assigneeAgentId, goalId });\n if (!updated) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.json(updated);\n });\n\n router.delete('/issues/:id', (req, res) => {\n const ok = deleteIssue(req.params.id);\n if (!ok) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.json({ success: true });\n });\n\n router.post('/issues/:id/checkout', (req, res) => {\n const { agentId } = req.body;\n if (!agentId) { res.status(400).json({ error: 'agentId is required' }); return; }\n const result = checkoutIssue(req.params.id, agentId);\n if (!result) { res.status(409).json({ error: 'Issue already checked out by another agent' }); return; }\n res.json(result);\n });\n\n router.post('/issues/:id/comments', (req, res) => {\n const { body: commentBody, agentId } = req.body;\n if (!commentBody) { res.status(400).json({ error: 'body is required' }); return; }\n const comment = addIssueComment(req.params.id, commentBody, { agentId, user: agentId ? undefined : 'board' });\n if (!comment) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.status(201).json(comment);\n });\n\n // ── Approvals ─────────────────────────────────────────────\n router.get('/approvals', (req, res) => {\n const status = req.query.status as string | undefined;\n res.json(listApprovals(status));\n });\n\n router.post('/approvals', (req, res) => {\n const { type, requestedBy, payload, linkedIssueIds } = req.body;\n if (!type) { res.status(400).json({ error: 'type is required' }); return; }\n const approval = createApproval({ type, requestedBy: requestedBy || 'board', payload: payload || {}, linkedIssueIds });\n res.status(201).json(approval);\n });\n\n router.post('/approvals/:id/approve', async (req, res) => {\n const { decidedBy, note } = req.body;\n const result = await approveApproval(req.params.id, decidedBy || 'board', note);\n if (!result) { res.status(404).json({ error: 'Approval not found or already decided' }); return; }\n res.json(result);\n });\n\n router.post('/approvals/:id/reject', (req, res) => {\n const { decidedBy, note } = req.body;\n const result = rejectApproval(req.params.id, decidedBy || 'board', note);\n if (!result) { res.status(404).json({ error: 'Approval not found or already decided' }); return; }\n res.json(result);\n });\n\n router.post('/approvals/:id/reply', (req, res) => {\n const { author, body } = req.body;\n if (!body || typeof body !== 'string') { res.status(400).json({ error: 'body is required' }); return; }\n const result = replyToApproval(req.params.id, author || 'user', body);\n if (!result) { res.status(404).json({ error: 'Approval not found' }); return; }\n res.json(result);\n });\n\n router.post('/approvals/:id/snooze', (req, res) => {\n const { until } = req.body;\n if (!until) { res.status(400).json({ error: 'until timestamp is required' }); return; }\n const result = snoozeApproval(req.params.id, until);\n if (!result) { res.status(404).json({ error: 'Approval not found or not pending' }); return; }\n res.json(result);\n });\n\n router.post('/approvals/:id/unsnooze', (req, res) => {\n const result = unsnoozeApproval(req.params.id);\n if (!result) { res.status(404).json({ error: 'Approval not found' }); return; }\n res.json(result);\n });\n\n router.get('/approvals/:id/thread', (req, res) => {\n const approval = listApprovals().find(a => a.id === req.params.id);\n if (!approval) { res.status(404).json({ error: 'Approval not found' }); return; }\n res.json({ approvalId: approval.id, thread: approval.thread || [] });\n });\n\n router.post('/approvals/batch', async (req, res) => {\n const { ids, action, decidedBy, note } = req.body;\n if (!Array.isArray(ids) || ids.length === 0) { res.status(400).json({ error: 'ids array required' }); return; }\n if (action === 'approve') {\n const result = await batchApprove(ids, decidedBy || 'board', note);\n res.json(result);\n } else if (action === 'reject') {\n const result = batchReject(ids, decidedBy || 'board', note);\n res.json(result);\n } else {\n res.status(400).json({ error: 'action must be approve or reject' });\n }\n });\n\n router.post('/approvals/sweep', async (_req, res) => {\n const { sweepStaleApprovalsManual } = await import('../../agent/commandPost.js');\n const result = sweepStaleApprovalsManual();\n res.json(result);\n });\n\n // ── Agent Messages ──────────────────────────────────────────\n router.get('/agent-messages', (req, res) => {\n const agentId = req.query.agentId as string | undefined;\n const userId = req.query.userId as string | undefined;\n const unreadOnly = req.query.unread === 'true';\n res.json(getAgentMessages(agentId, userId, unreadOnly));\n });\n\n router.post('/agent-messages/:id/read', (req, res) => {\n const ok = markAgentMessageRead(req.params.id);\n if (!ok) { res.status(404).json({ error: 'Message not found' }); return; }\n res.json({ read: true });\n });\n\n // ── Debates ─────────────────────────────────────────────────\n router.post('/debates', async (req, res) => {\n try {\n const { question, participants, rounds, resolution, judgeModel } = req.body || {};\n if (!question || !Array.isArray(participants) || participants.length < 2) {\n res.status(400).json({ error: 'question + 2-5 participants required' }); return;\n }\n const { runDebate } = await import('../../skills/builtin/agent_debate.js');\n const result = await runDebate({\n question: String(question),\n participants,\n rounds: Math.max(1, Math.min(4, Number(rounds) || 2)),\n resolution: (resolution === 'vote' || resolution === 'synthesize' || resolution === 'judge') ? resolution : 'judge',\n judgeModel: judgeModel ? String(judgeModel) : undefined,\n });\n res.json({ ok: true, id: result.id, winner: result.winner });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n router.get('/debates', async (req, res) => {\n const limit = parseInt(req.query.limit as string) || 50;\n const { listDebates } = await import('../../skills/builtin/agent_debate.js');\n res.json({ items: listDebates(limit) });\n });\n\n router.get('/debates/:id', async (req, res) => {\n const { getDebate } = await import('../../skills/builtin/agent_debate.js');\n const debate = getDebate(req.params.id);\n if (!debate) { res.status(404).json({ error: 'Debate not found' }); return; }\n res.json(debate);\n });\n\n // ── Runs ────────────────────────────────────────────────────\n router.get('/runs', (req, res) => {\n const agentId = req.query.agentId as string | undefined;\n const limit = parseInt(req.query.limit as string) || 50;\n res.json(listRuns(agentId, limit));\n });\n\n router.post('/runs/:id/retry', async (req, res) => {\n const allRuns = listRuns(undefined, 500);\n const run = allRuns.find(r => r.id === req.params.id);\n if (!run) { res.status(404).json({ error: 'Run not found' }); return; }\n const agent = getRegisteredAgents().find(a => a.id === run.agentId);\n if (!agent) { res.status(404).json({ error: 'Agent not found' }); return; }\n\n let task = `Retry failed run (${run.id})`;\n if (run.error) task += `: ${run.error}`;\n let issueDesc = task;\n if (run.issueId) {\n const originalIssue = getIssue(run.issueId);\n if (originalIssue) {\n task = `Retry: ${originalIssue.title}`;\n issueDesc = `${originalIssue.description || ''}\\n\\nRetrying after failure: ${run.error || 'unknown error'}`;\n }\n }\n\n const issue = createIssue({ title: task, description: issueDesc, priority: 'high', assigneeAgentId: agent.id, createdByUser: 'board' });\n const newRun = startRun(agent.id, 'manual', issue.id);\n queueWakeup({ issueId: issue.id, issueIdentifier: issue.identifier, agentId: agent.id, agentName: agent.name, parentSessionId: null, task, templateName: agent.role || 'default' });\n res.json({ retried: true, runId: newRun.id, issueId: issue.id });\n });\n\n // ── Wakeup System ───────────────────────────────────────────\n router.get('/agents/:agentId/inbox', (req, res) => {\n const items = getAgentInbox(req.params.agentId);\n res.json({ items, total: items.length });\n });\n\n router.post('/wakeup', (req, res) => {\n const { issueId, agentId, agentName, task, templateName } = req.body;\n if (!issueId || !agentId || !task) {\n res.status(400).json({ error: 'issueId, agentId, and task are required' }); return;\n }\n const wakeup = queueWakeup({ issueId, issueIdentifier: issueId, agentId, agentName: agentName || 'Agent', parentSessionId: null, task, templateName: templateName || '' });\n res.json({ wakeupRequestId: wakeup.id, status: wakeup.status });\n });\n\n router.get('/wakeup/:requestId', (req, res) => {\n const request = getWakeupRequest(req.params.requestId);\n if (!request) { res.status(404).json({ error: 'Wakeup request not found' }); return; }\n res.json(request);\n });\n\n router.delete('/wakeup/:requestId', (req, res) => {\n const cancelled = cancelWakeup(req.params.requestId);\n if (!cancelled) { res.status(409).json({ error: 'Request already running or completed' }); return; }\n res.json({ cancelled: true });\n });\n\n router.get('/sessions/:sessionId/pending-results', (req, res) => {\n const results = drainPendingResults(req.params.sessionId);\n res.json({ results, count: results.length });\n });\n\n return router;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/gateway/routes/commandPost.ts"],"sourcesContent":["/**\n * Command Post Router\n *\n * Extracted from gateway/server.ts v5.4.5 → v5.5.0.\n * Consolidates all /api/command-post/* routes for agent governance.\n */\n\nimport { Router, type Request, type Response } from 'express';\nimport logger from '../../utils/logger.js';\nimport { setupSSEFlush } from '../../utils/sseFlush.js';\n\n// Command Post core\nimport {\n getDashboard as getCPDashboard,\n getRegisteredAgents,\n reportHeartbeat,\n removeAgent,\n checkoutTask,\n checkinTask,\n getActiveCheckouts,\n getBudgetPolicies,\n createBudgetPolicy,\n updateBudgetPolicy,\n deleteBudgetPolicy,\n getActivity,\n getGoalTree,\n getAncestryChain,\n validateGoalAncestry,\n validateGoalParentAssignment,\n sweepExpiredCheckoutsManual,\n getStaleAgents,\n enforceBudgetForAgent,\n getBudgetPolicyForAgent,\n createIssue,\n updateIssue,\n getIssue,\n listIssues,\n searchIssues,\n checkoutIssue,\n deleteIssue,\n addIssueComment,\n getIssueComments,\n createApproval,\n approveApproval,\n rejectApproval,\n listApprovals,\n getApproval,\n replyToApproval,\n snoozeApproval,\n unsnoozeApproval,\n batchApprove,\n batchReject,\n getAgentMessages,\n markAgentMessageRead,\n startRun,\n endRun,\n listRuns,\n getOrgTree,\n updateRegisteredAgent,\n} from '../../agent/commandPost.js';\n\n// Agent wakeup\nimport {\n getAgentInbox,\n queueWakeup,\n getWakeupRequest,\n cancelWakeup,\n drainPendingResults,\n} from '../../agent/agentWakeup.js';\n\n// Daemon events (for SSE)\nimport { titanEvents } from '../../agent/daemon.js';\n\n// Goals\nimport { createGoal } from '../../agent/goals.js';\n\nconst COMPONENT = 'CommandPostRouter';\n\nexport function createCommandPostRouter(): Router {\n const router = Router();\n\n // ── Dashboard ─────────────────────────────────────────────\n router.get('/dashboard', async (_req, res) => {\n const dashboard = getCPDashboard();\n try {\n const { listCompanies, getActiveRunners } = await import('../../agent/company.js');\n const companies = listCompanies();\n const runners = getActiveRunners();\n (dashboard as Record<string, unknown>).companies = companies.map(c => ({\n ...c,\n runnerActive: runners.includes(c.id),\n }));\n } catch { (dashboard as Record<string, unknown>).companies = []; }\n res.json(dashboard);\n });\n\n // ── Agents ──────────────────────────────────────────────────\n router.get('/agents', (_req, res) => {\n res.json(getRegisteredAgents());\n });\n\n router.post('/agents/:id/heartbeat', (req, res) => {\n const ok = reportHeartbeat(req.params.id);\n res.json({ success: ok });\n });\n\n router.post('/agents/:id/fire', async (req, res) => {\n try {\n const { fireHeartbeat } = await import('../../agent/heartbeatScheduler.js');\n await fireHeartbeat(req.params.id);\n res.json({ success: true });\n } catch (err) {\n res.status(500).json({ success: false, error: (err as Error).message });\n }\n });\n\n router.delete('/agents/:id', (req, res) => {\n const ok = removeAgent(req.params.id);\n if (!ok) { res.status(400).json({ error: 'Cannot remove agent (not found or is the primary agent)' }); return; }\n res.json({ success: true });\n });\n\n router.patch('/agents/:id', async (req, res) => {\n const { reportsTo, role, title, name, status, model } = req.body;\n const updated = updateRegisteredAgent(req.params.id, { reportsTo, role, title, name, model });\n if (!updated) { res.status(404).json({ error: 'Agent not found' }); return; }\n if (status && typeof status === 'string') {\n try {\n const { updateAgentStatus } = await import('../../agent/commandPost.js');\n updateAgentStatus(req.params.id, status as 'active' | 'idle' | 'paused' | 'error' | 'stopped');\n } catch { /* ok */ }\n }\n res.json(updated);\n });\n\n router.patch('/agents/:id/identity', async (req, res) => {\n const { voiceId, personaId, systemPromptOverride, memoryNamespace, characterSummary, model } = req.body || {};\n const coerce = (v: unknown): string | null | undefined => {\n if (v === null) return null;\n if (typeof v === 'string') return v;\n if (v === undefined) return undefined;\n res.status(400).json({ error: `Invalid identity field: expected string or null, got ${typeof v}` });\n return undefined;\n };\n if (res.headersSent) return;\n const { updateAgentIdentity } = await import('../../agent/commandPost.js');\n const updated = updateAgentIdentity(req.params.id, {\n voiceId: coerce(voiceId),\n personaId: coerce(personaId),\n systemPromptOverride: coerce(systemPromptOverride),\n memoryNamespace: coerce(memoryNamespace),\n characterSummary: coerce(characterSummary),\n model: coerce(model),\n });\n if (res.headersSent) return;\n if (!updated) { res.status(404).json({ error: 'Agent not found' }); return; }\n res.json(updated);\n });\n\n router.get('/agents/stale', (_req, res) => {\n const stale = getStaleAgents();\n res.json({ stale, total: stale.length });\n });\n\n // ── Tasks (checkout/checkin) ────────────────────────────────\n router.post('/tasks/:goalId/:subtaskId/checkout', (req, res) => {\n const agentId = (req.body as { agentId?: string }).agentId || 'manual';\n const lock = checkoutTask(req.params.goalId, req.params.subtaskId, agentId);\n if (!lock) { res.status(409).json({ error: 'Task already checked out by another agent' }); return; }\n res.json(lock);\n });\n\n router.post('/tasks/:goalId/:subtaskId/checkin', (req, res) => {\n const runId = (req.body as { runId?: string }).runId || '';\n const ok = checkinTask(req.params.subtaskId, runId);\n if (!ok) { res.status(404).json({ error: 'No matching checkout found' }); return; }\n res.json({ success: true });\n });\n\n // ── Checkouts ───────────────────────────────────────────────\n router.get('/checkouts', (_req, res) => {\n res.json(getActiveCheckouts());\n });\n\n router.post('/checkouts/sweep', (_req, res) => {\n const result = sweepExpiredCheckoutsManual();\n res.json(result);\n });\n\n router.get('/checkouts/expired', (_req, res) => {\n const result = sweepExpiredCheckoutsManual();\n res.json({ expired: result.swept, details: result.details });\n });\n\n // ── Budgets ─────────────────────────────────────────────────\n router.get('/budgets', (_req, res) => {\n res.json(getBudgetPolicies());\n });\n\n router.get('/budgets/reservations', (_req, res) => {\n // v6.1.0-beta.23 — was `res.json([])`, which Tony's mock-data audit\n // (2026-05-17) flagged as a quiet lie: the storage interface only\n // exposes `saveBudgetReservation` / `getBudgetReservation(id)` —\n // there's no `listBudgetReservations()` query, so the endpoint\n // can't know whether there are zero reservations or just no way to\n // ask. Returning [] told callers \"definitely no reservations\"\n // which is wrong. 501 Not Implemented with a clear message is the\n // honest answer until storage gains a list query.\n res.status(501).json({\n error: 'not_implemented',\n message: 'Listing budget reservations is not yet supported by the storage layer. Reservations are persisted (saveBudgetReservation) and can be fetched by id (getBudgetReservation) but not enumerated. Track this in v6.2.',\n });\n });\n\n router.post('/budgets', (req, res) => {\n try {\n const body = req.body as {\n name: string;\n scope: { type: 'agent' | 'goal' | 'global'; targetId?: string };\n period: 'daily' | 'weekly' | 'monthly';\n limitUsd: number;\n warningThresholdPercent?: number;\n action?: 'warn' | 'pause' | 'stop';\n enabled?: boolean;\n };\n const policy = createBudgetPolicy({\n name: body.name,\n scope: body.scope,\n period: body.period,\n limitUsd: body.limitUsd,\n warningThresholdPercent: body.warningThresholdPercent ?? 80,\n action: body.action ?? 'pause',\n enabled: body.enabled ?? true,\n });\n res.status(201).json(policy);\n } catch (err) {\n res.status(400).json({ error: (err as Error).message });\n }\n });\n\n router.put('/budgets/:id', (req, res) => {\n const updated = updateBudgetPolicy(req.params.id, req.body as Record<string, unknown>);\n if (!updated) { res.status(404).json({ error: 'Budget policy not found' }); return; }\n res.json(updated);\n });\n\n router.delete('/budgets/:id', (req, res) => {\n const ok = deleteBudgetPolicy(req.params.id);\n if (!ok) { res.status(404).json({ error: 'Budget policy not found' }); return; }\n res.json({ success: true });\n });\n\n router.post('/budgets/:agentId/enforce', (req, res) => {\n const result = enforceBudgetForAgent(req.params.agentId);\n if (!result.budgetOk) {\n res.status(403).json({ budgetOk: false, policies: result.policies, message: 'Budget exceeded — agent paused' });\n return;\n }\n res.json({ budgetOk: true, policies: result.policies });\n });\n\n router.get('/budgets/agent/:agentId', (req, res) => {\n const budgetInfo = getBudgetPolicyForAgent(req.params.agentId);\n res.json(budgetInfo);\n });\n\n // ── Activity ──────────────────────────────────────────────\n router.get('/activity', (req, res) => {\n const limit = parseInt(req.query.limit as string) || 50;\n const type = req.query.type as string | undefined;\n res.json(getActivity({ limit, type }));\n });\n\n // ── Audit ───────────────────────────────────────────────────\n router.get('/audit', async (req, res) => {\n try {\n const { queryAudit } = await import('../../agent/auditStore.js');\n const query = {\n agentId: req.query.agentId as string | undefined,\n sessionId: req.query.sessionId as string | undefined,\n type: req.query.type as string | undefined,\n toolName: req.query.toolName as string | undefined,\n from: req.query.from as string | undefined,\n to: req.query.to as string | undefined,\n limit: req.query.limit ? parseInt(req.query.limit as string) : 100,\n };\n res.json(queryAudit(query));\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n router.get('/audit/costs', async (req, res) => {\n try {\n const { getAgentCostSummary, getDailyCostBreakdown } = await import('../../agent/auditStore.js');\n const groupBy = req.query.groupBy as string || 'agent';\n if (groupBy === 'day') {\n const days = req.query.days ? parseInt(req.query.days as string) : 30;\n res.json(getDailyCostBreakdown(days));\n } else {\n const agentId = req.query.agentId as string | undefined;\n res.json(getAgentCostSummary(agentId));\n }\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n // ── Goals ───────────────────────────────────────────────────\n router.post('/goals', (req, res) => {\n const { title, description, subtasks, priority, tags, force } = req.body;\n if (!title) { res.status(400).json({ error: 'title is required' }); return; }\n try {\n const goal = createGoal({\n title,\n description: description || '',\n subtasks: subtasks || [],\n priority,\n tags,\n force: !!force,\n });\n res.status(201).json({ goal });\n } catch (err) {\n res.status(429).json({ error: (err as Error).message });\n }\n });\n\n router.get('/goals/tree', (_req, res) => {\n res.json(getGoalTree());\n });\n\n router.get('/goals/:id/ancestry', (req, res) => {\n const chain = getAncestryChain(req.params.id);\n if (chain.length === 0) { res.status(404).json({ error: 'Goal not found' }); return; }\n res.json(chain);\n });\n\n router.post('/goals/:id/validate', (req, res) => {\n const { parentGoalId } = req.body as { parentGoalId?: string | null };\n if (parentGoalId !== undefined) {\n const result = validateGoalParentAssignment(req.params.id, parentGoalId || null);\n if (!result.valid) {\n res.status(422).json({ valid: false, errors: result.errors });\n return;\n }\n res.json({ valid: true });\n } else {\n const result = validateGoalAncestry(req.params.id);\n if (!result.valid) {\n res.status(422).json({ valid: false, errors: result.errors });\n return;\n }\n res.json({ valid: true });\n }\n });\n\n // ── Conflict Resolution ─────────────────────────────────────\n router.post('/conflicts/propose', async (req, res) => {\n try {\n const { conflictResolver } = await import('../../agent/conflictResolver.js');\n const { entities, type, description, metadata } = req.body;\n if (!entities || !Array.isArray(entities) || entities.length === 0) {\n res.status(400).json({ error: 'entities array is required' }); return;\n }\n if (!type || !['file', 'goal', 'resource', 'agent', 'config', 'other'].includes(type)) {\n res.status(400).json({ error: 'valid type is required (file, goal, resource, agent, config, other)' }); return;\n }\n if (!description || typeof description !== 'string') {\n res.status(400).json({ error: 'description string is required' }); return;\n }\n const proposal = await conflictResolver.generateProposal({ entities, type, description, metadata: metadata || {} });\n res.json(proposal);\n } catch (error) {\n logger.error(COMPONENT, 'Conflict proposal generation error:', error);\n res.status(500).json({ error: 'Failed to generate conflict resolution proposal' });\n }\n });\n\n router.post('/conflicts/propose/formatted', async (req, res) => {\n try {\n const { conflictResolver } = await import('../../agent/conflictResolver.js');\n const { entities, type, description, metadata } = req.body;\n if (!entities || !Array.isArray(entities) || entities.length === 0) {\n res.status(400).json({ error: 'entities array is required' }); return;\n }\n if (!type || !['file', 'goal', 'resource', 'agent', 'config', 'other'].includes(type)) {\n res.status(400).json({ error: 'valid type is required (file, goal, resource, agent, config, other)' }); return;\n }\n if (!description || typeof description !== 'string') {\n res.status(400).json({ error: 'description string is required' }); return;\n }\n const proposal = await conflictResolver.generateProposal({ entities, type, description, metadata: metadata || {} });\n const formatted = conflictResolver.formatProposal(proposal);\n res.type('text/plain').send(formatted);\n } catch (error) {\n logger.error(COMPONENT, 'Conflict proposal formatting error:', error);\n res.status(500).json({ error: 'Failed to format conflict resolution proposal' });\n }\n });\n\n router.get('/conflicts/types', (_req, res) => {\n res.json({\n types: [\n { id: 'file', name: 'File Conflict', description: 'Merge conflicts, version conflicts' },\n { id: 'goal', name: 'Goal Conflict', description: 'Competing or conflicting goals' },\n { id: 'resource', name: 'Resource Conflict', description: 'Resource contention (GPU, memory, etc.)' },\n { id: 'agent', name: 'Agent Conflict', description: 'Agent coordination conflicts' },\n { id: 'config', name: 'Configuration Conflict', description: 'Conflicting configuration values' },\n { id: 'other', name: 'Other', description: 'Unclassified conflict type' }\n ]\n });\n });\n\n // ── SSE Stream ────────────────────────────────────────────\n const CP_SSE_EVENTS = [\n 'commandpost:activity', 'commandpost:task:checkout', 'commandpost:task:checkin',\n 'commandpost:task:expired', 'commandpost:budget:warning', 'commandpost:budget:exceeded',\n 'commandpost:agent:heartbeat', 'commandpost:agent:status',\n ];\n\n router.get('/stream', (req, res) => {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n const sseWrite = setupSSEFlush(res);\n\n const onEvent = (event: string, data: unknown) => {\n try { sseWrite(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`); } catch { /* client gone */ }\n };\n\n const listeners = new Map<string, (data: unknown) => void>();\n for (const evt of CP_SSE_EVENTS) {\n const handler = (data: unknown) => onEvent(evt, data);\n listeners.set(evt, handler);\n titanEvents.on(evt, handler);\n }\n\n const keepalive = setInterval(() => {\n try { sseWrite(': keepalive\\n\\n'); } catch { /* client gone */ }\n }, 15_000);\n\n req.on('close', () => {\n clearInterval(keepalive);\n for (const [evt, handler] of listeners) {\n titanEvents.removeListener(evt, handler);\n }\n });\n });\n\n // ── Org Chart ───────────────────────────────────────────────\n router.get('/org', async (_req, res) => {\n const org = getOrgTree();\n try {\n const { listCompanies } = await import('../../agent/company.js');\n const companies = listCompanies();\n const companyNodes = companies.map(c => ({\n id: c.id,\n name: c.name,\n role: 'Company',\n title: c.description,\n status: c.status,\n model: '',\n reports: c.agents.map(a => ({\n id: a.id,\n name: a.name,\n role: a.role,\n title: a.template,\n status: a.status,\n model: '',\n reports: [],\n })),\n }));\n if (Array.isArray(org)) {\n org.push(...companyNodes);\n } else if (org && typeof org === 'object') {\n (org as Record<string, unknown>).companies = companyNodes;\n }\n } catch { /* non-critical */ }\n res.json(org);\n });\n\n // ── Issues ──────────────────────────────────────────────────\n router.get('/issues', (req, res) => {\n const filters = {\n status: req.query.status as string | undefined,\n assigneeAgentId: req.query.assignee as string | undefined,\n goalId: req.query.goalId as string | undefined,\n };\n res.json(listIssues(filters));\n });\n\n router.get('/issues/search', (req, res) => {\n const q = req.query.q as string | undefined;\n if (!q || q.trim().length < 2) {\n res.status(400).json({ error: 'Query must be at least 2 characters' }); return;\n }\n res.json(searchIssues(q));\n });\n\n router.post('/issues', (req, res) => {\n const { title, description, priority, assigneeAgentId, goalId, parentId } = req.body;\n if (!title) { res.status(400).json({ error: 'title is required' }); return; }\n const issue = createIssue({ title, description, priority, assigneeAgentId, goalId, parentId, createdByUser: 'board' });\n res.status(201).json(issue);\n });\n\n router.get('/issues/:id/context', (req, res) => {\n const issue = getIssue(req.params.id);\n if (!issue) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.json({ ancestry: issue.goalId || '', issue });\n });\n\n router.get('/issues/:id', (req, res) => {\n const issue = getIssue(req.params.id);\n if (!issue) { res.status(404).json({ error: 'Issue not found' }); return; }\n const issueComments = getIssueComments(req.params.id);\n res.json({ ...issue, comments: issueComments });\n });\n\n router.get('/issues/:id/comments', (req, res) => {\n const issue = getIssue(req.params.id);\n if (!issue) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.json(getIssueComments(req.params.id));\n });\n\n router.patch('/issues/:id', (req, res) => {\n const { title, description, status, priority, assigneeAgentId, goalId } = req.body;\n const updated = updateIssue(req.params.id, { title, description, status, priority, assigneeAgentId, goalId });\n if (!updated) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.json(updated);\n });\n\n router.delete('/issues/:id', (req, res) => {\n const ok = deleteIssue(req.params.id);\n if (!ok) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.json({ success: true });\n });\n\n router.post('/issues/:id/checkout', (req, res) => {\n const { agentId } = req.body;\n if (!agentId) { res.status(400).json({ error: 'agentId is required' }); return; }\n const result = checkoutIssue(req.params.id, agentId);\n if (!result) { res.status(409).json({ error: 'Issue already checked out by another agent' }); return; }\n res.json(result);\n });\n\n router.post('/issues/:id/comments', (req, res) => {\n const { body: commentBody, agentId } = req.body;\n if (!commentBody) { res.status(400).json({ error: 'body is required' }); return; }\n const comment = addIssueComment(req.params.id, commentBody, { agentId, user: agentId ? undefined : 'board' });\n if (!comment) { res.status(404).json({ error: 'Issue not found' }); return; }\n res.status(201).json(comment);\n });\n\n // ── Approvals ─────────────────────────────────────────────\n router.get('/approvals', (req, res) => {\n const status = req.query.status as string | undefined;\n res.json(listApprovals(status));\n });\n\n router.post('/approvals', (req, res) => {\n const { type, requestedBy, payload, linkedIssueIds } = req.body;\n if (!type) { res.status(400).json({ error: 'type is required' }); return; }\n const approval = createApproval({ type, requestedBy: requestedBy || 'board', payload: payload || {}, linkedIssueIds });\n res.status(201).json(approval);\n });\n\n router.post('/approvals/:id/approve', async (req, res) => {\n const { decidedBy, note } = req.body;\n const result = await approveApproval(req.params.id, decidedBy || 'board', note);\n if (!result) { res.status(404).json({ error: 'Approval not found or already decided' }); return; }\n res.json(result);\n });\n\n router.post('/approvals/:id/reject', (req, res) => {\n const { decidedBy, note } = req.body;\n const result = rejectApproval(req.params.id, decidedBy || 'board', note);\n if (!result) { res.status(404).json({ error: 'Approval not found or already decided' }); return; }\n res.json(result);\n });\n\n router.post('/approvals/:id/reply', (req, res) => {\n const { author, body } = req.body;\n if (!body || typeof body !== 'string') { res.status(400).json({ error: 'body is required' }); return; }\n const result = replyToApproval(req.params.id, author || 'user', body);\n if (!result) { res.status(404).json({ error: 'Approval not found' }); return; }\n res.json(result);\n });\n\n router.post('/approvals/:id/snooze', (req, res) => {\n const { until } = req.body;\n if (!until) { res.status(400).json({ error: 'until timestamp is required' }); return; }\n const result = snoozeApproval(req.params.id, until);\n if (!result) { res.status(404).json({ error: 'Approval not found or not pending' }); return; }\n res.json(result);\n });\n\n router.post('/approvals/:id/unsnooze', (req, res) => {\n const result = unsnoozeApproval(req.params.id);\n if (!result) { res.status(404).json({ error: 'Approval not found' }); return; }\n res.json(result);\n });\n\n router.get('/approvals/:id/thread', (req, res) => {\n const approval = listApprovals().find(a => a.id === req.params.id);\n if (!approval) { res.status(404).json({ error: 'Approval not found' }); return; }\n res.json({ approvalId: approval.id, thread: approval.thread || [] });\n });\n\n router.post('/approvals/batch', async (req, res) => {\n const { ids, action, decidedBy, note } = req.body;\n if (!Array.isArray(ids) || ids.length === 0) { res.status(400).json({ error: 'ids array required' }); return; }\n if (action === 'approve') {\n const result = await batchApprove(ids, decidedBy || 'board', note);\n res.json(result);\n } else if (action === 'reject') {\n const result = batchReject(ids, decidedBy || 'board', note);\n res.json(result);\n } else {\n res.status(400).json({ error: 'action must be approve or reject' });\n }\n });\n\n router.post('/approvals/sweep', async (_req, res) => {\n const { sweepStaleApprovalsManual } = await import('../../agent/commandPost.js');\n const result = sweepStaleApprovalsManual();\n res.json(result);\n });\n\n // ── Agent Messages ──────────────────────────────────────────\n router.get('/agent-messages', (req, res) => {\n const agentId = req.query.agentId as string | undefined;\n const userId = req.query.userId as string | undefined;\n const unreadOnly = req.query.unread === 'true';\n res.json(getAgentMessages(agentId, userId, unreadOnly));\n });\n\n router.post('/agent-messages/:id/read', (req, res) => {\n const ok = markAgentMessageRead(req.params.id);\n if (!ok) { res.status(404).json({ error: 'Message not found' }); return; }\n res.json({ read: true });\n });\n\n // ── Debates ─────────────────────────────────────────────────\n router.post('/debates', async (req, res) => {\n try {\n const { question, participants, rounds, resolution, judgeModel } = req.body || {};\n if (!question || !Array.isArray(participants) || participants.length < 2) {\n res.status(400).json({ error: 'question + 2-5 participants required' }); return;\n }\n const { runDebate } = await import('../../skills/builtin/agent_debate.js');\n const result = await runDebate({\n question: String(question),\n participants,\n rounds: Math.max(1, Math.min(4, Number(rounds) || 2)),\n resolution: (resolution === 'vote' || resolution === 'synthesize' || resolution === 'judge') ? resolution : 'judge',\n judgeModel: judgeModel ? String(judgeModel) : undefined,\n });\n res.json({ ok: true, id: result.id, winner: result.winner });\n } catch (err) {\n res.status(500).json({ error: (err as Error).message });\n }\n });\n\n router.get('/debates', async (req, res) => {\n const limit = parseInt(req.query.limit as string) || 50;\n const { listDebates } = await import('../../skills/builtin/agent_debate.js');\n res.json({ items: listDebates(limit) });\n });\n\n router.get('/debates/:id', async (req, res) => {\n const { getDebate } = await import('../../skills/builtin/agent_debate.js');\n const debate = getDebate(req.params.id);\n if (!debate) { res.status(404).json({ error: 'Debate not found' }); return; }\n res.json(debate);\n });\n\n // ── Runs ────────────────────────────────────────────────────\n router.get('/runs', (req, res) => {\n const agentId = req.query.agentId as string | undefined;\n const limit = parseInt(req.query.limit as string) || 50;\n res.json(listRuns(agentId, limit));\n });\n\n router.post('/runs/:id/retry', async (req, res) => {\n const allRuns = listRuns(undefined, 500);\n const run = allRuns.find(r => r.id === req.params.id);\n if (!run) { res.status(404).json({ error: 'Run not found' }); return; }\n const agent = getRegisteredAgents().find(a => a.id === run.agentId);\n if (!agent) { res.status(404).json({ error: 'Agent not found' }); return; }\n\n let task = `Retry failed run (${run.id})`;\n if (run.error) task += `: ${run.error}`;\n let issueDesc = task;\n if (run.issueId) {\n const originalIssue = getIssue(run.issueId);\n if (originalIssue) {\n task = `Retry: ${originalIssue.title}`;\n issueDesc = `${originalIssue.description || ''}\\n\\nRetrying after failure: ${run.error || 'unknown error'}`;\n }\n }\n\n const issue = createIssue({ title: task, description: issueDesc, priority: 'high', assigneeAgentId: agent.id, createdByUser: 'board' });\n const newRun = startRun(agent.id, 'manual', issue.id);\n queueWakeup({ issueId: issue.id, issueIdentifier: issue.identifier, agentId: agent.id, agentName: agent.name, parentSessionId: null, task, templateName: agent.role || 'default' });\n res.json({ retried: true, runId: newRun.id, issueId: issue.id });\n });\n\n // ── Wakeup System ───────────────────────────────────────────\n router.get('/agents/:agentId/inbox', (req, res) => {\n const items = getAgentInbox(req.params.agentId);\n res.json({ items, total: items.length });\n });\n\n router.post('/wakeup', (req, res) => {\n const { issueId, agentId, agentName, task, templateName } = req.body;\n if (!issueId || !agentId || !task) {\n res.status(400).json({ error: 'issueId, agentId, and task are required' }); return;\n }\n const wakeup = queueWakeup({ issueId, issueIdentifier: issueId, agentId, agentName: agentName || 'Agent', parentSessionId: null, task, templateName: templateName || '' });\n res.json({ wakeupRequestId: wakeup.id, status: wakeup.status });\n });\n\n router.get('/wakeup/:requestId', (req, res) => {\n const request = getWakeupRequest(req.params.requestId);\n if (!request) { res.status(404).json({ error: 'Wakeup request not found' }); return; }\n res.json(request);\n });\n\n router.delete('/wakeup/:requestId', (req, res) => {\n const cancelled = cancelWakeup(req.params.requestId);\n if (!cancelled) { res.status(409).json({ error: 'Request already running or completed' }); return; }\n res.json({ cancelled: true });\n });\n\n router.get('/sessions/:sessionId/pending-results', (req, res) => {\n const results = drainPendingResults(req.params.sessionId);\n res.json({ results, count: results.length });\n });\n\n return router;\n}\n"],"mappings":"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","names":[]}
@@ -6,7 +6,8 @@ import { createServer as createHttpsServer } from "https";
6
6
  import net from "net";
7
7
  import { join, dirname } from "path";
8
8
  import { fileURLToPath } from "url";
9
- import { homedir, hostname as osHostname, cpus, loadavg } from "os";
9
+ import { homedir, hostname as osHostname, cpus, loadavg, totalmem, freemem } from "os";
10
+ import { statfs } from "fs/promises";
10
11
  import { randomBytes, timingSafeEqual } from "crypto";
11
12
  import { exec, spawn } from "child_process";
12
13
  import fs from "fs";
@@ -1632,13 +1633,31 @@ async function startGateway(options) {
1632
1633
  res.status(500).json({ error: "gift_unavailable", message: err.message });
1633
1634
  }
1634
1635
  });
1635
- app.get("/api/stats", (_req, res) => {
1636
+ app.get("/api/stats", async (_req, res) => {
1636
1637
  const usage = getUsageStats();
1637
1638
  const cfg = loadConfig();
1638
1639
  const activeModel = cfg.agent.model || "";
1639
1640
  const mem = process.memoryUsage();
1640
1641
  const activeAgents = listAgents().filter((a) => a.status === "running").length;
1641
1642
  const activeSessions = listSessions().length;
1643
+ const cpuPercent = Math.round(getCpuLoad() * 1e3) / 10;
1644
+ const totalMem = totalmem();
1645
+ const freeMem = freemem();
1646
+ const usedMem = totalMem - freeMem;
1647
+ const hostMemPercent = totalMem > 0 ? Math.round(usedMem / totalMem * 1e3) / 10 : 0;
1648
+ let diskTotalBytes = 0;
1649
+ let diskFreeBytes = 0;
1650
+ let diskPercent = 0;
1651
+ let diskError = null;
1652
+ try {
1653
+ const s = await statfs(TITAN_HOME);
1654
+ diskTotalBytes = s.blocks * s.bsize;
1655
+ diskFreeBytes = s.bavail * s.bsize;
1656
+ const usedDisk = diskTotalBytes - diskFreeBytes;
1657
+ diskPercent = diskTotalBytes > 0 ? Math.round(usedDisk / diskTotalBytes * 1e3) / 10 : 0;
1658
+ } catch (err) {
1659
+ diskError = err.message;
1660
+ }
1642
1661
  res.json({
1643
1662
  ...usage,
1644
1663
  version: TITAN_VERSION,
@@ -1653,6 +1672,22 @@ async function startGateway(options) {
1653
1672
  external: mem.external,
1654
1673
  arrayBuffers: mem.arrayBuffers
1655
1674
  },
1675
+ host: {
1676
+ cpuPercent,
1677
+ cores: cpus().length || 1,
1678
+ loadAvg1: loadavg()[0] ?? 0,
1679
+ loadAvg5: loadavg()[1] ?? 0,
1680
+ loadAvg15: loadavg()[2] ?? 0,
1681
+ memTotalBytes: totalMem,
1682
+ memFreeBytes: freeMem,
1683
+ memUsedBytes: usedMem,
1684
+ memPercent: hostMemPercent,
1685
+ diskTotalBytes,
1686
+ diskFreeBytes,
1687
+ diskUsedBytes: diskTotalBytes - diskFreeBytes,
1688
+ diskPercent,
1689
+ diskError
1690
+ },
1656
1691
  health: {
1657
1692
  ollamaHealthy: healthState.ollamaHealthy,
1658
1693
  ttsHealthy: healthState.ttsHealthy,