titan-agent 5.2.1 → 5.3.1

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 (118) hide show
  1. package/README.md +33 -3
  2. package/dist/agent/agent.js +33 -4
  3. package/dist/agent/agent.js.map +1 -1
  4. package/dist/agent/subAgent.js +1 -1
  5. package/dist/agent/subAgent.js.map +1 -1
  6. package/dist/config/schema.js +10 -0
  7. package/dist/config/schema.js.map +1 -1
  8. package/dist/eval/harness.js +49 -0
  9. package/dist/eval/harness.js.map +1 -1
  10. package/dist/eval/parity.js +148 -0
  11. package/dist/eval/parity.js.map +1 -0
  12. package/dist/eval/record.js +115 -0
  13. package/dist/eval/record.js.map +1 -0
  14. package/dist/gateway/metrics.js +26 -3
  15. package/dist/gateway/metrics.js.map +1 -1
  16. package/dist/gateway/server.js +58 -6
  17. package/dist/gateway/server.js.map +1 -1
  18. package/dist/utils/constants.js +1 -1
  19. package/dist/utils/constants.js.map +1 -1
  20. package/dist/utils/safety.js +31 -1
  21. package/dist/utils/safety.js.map +1 -1
  22. package/package.json +5 -1
  23. package/scripts/eval-gate.sh +189 -0
  24. package/scripts/eval-record.ts +133 -0
  25. package/ui/dist/assets/{AuditPanel-DLy0WJQZ.js → AuditPanel-CM6Wg9hO.js} +1 -1
  26. package/ui/dist/assets/{AutonomyPanel-DjFAQGns.js → AutonomyPanel-CESx3ANg.js} +1 -1
  27. package/ui/dist/assets/{AutopilotPanel-nBluaHA4.js → AutopilotPanel-DtEet1hJ.js} +1 -1
  28. package/ui/dist/assets/{AutoresearchPanel-BDy8y_Cs.js → AutoresearchPanel-DR47NqT5.js} +1 -1
  29. package/ui/dist/assets/{BackupPanel-B_Fv2pJA.js → BackupPanel-BGP8p3l3.js} +1 -1
  30. package/ui/dist/assets/{BrowserPanel-DOCT3-Rq.js → BrowserPanel-C15x9bLn.js} +1 -1
  31. package/ui/dist/assets/{CPAgents-CpkHf0b8.js → CPAgents-DYUtPzSq.js} +1 -1
  32. package/ui/dist/assets/{CPDashboard-CnMd6qNK.js → CPDashboard-Bf0-SyCh.js} +1 -1
  33. package/ui/dist/assets/{CPFiles-BDRjJpYl.js → CPFiles-CxgxjQcO.js} +1 -1
  34. package/ui/dist/assets/{CPGoals-2DrwHk62.js → CPGoals-BsmCMTvT.js} +1 -1
  35. package/ui/dist/assets/{CPInbox-C6l2o4FD.js → CPInbox-tMSbmQ9H.js} +1 -1
  36. package/ui/dist/assets/{CPSocial-Cea6NptR.js → CPSocial-nb-j7sOE.js} +1 -1
  37. package/ui/dist/assets/{ChannelsPanel-5EhhyXeg.js → ChannelsPanel-DP5C2OKd.js} +1 -1
  38. package/ui/dist/assets/{CheckpointsPanel-BVt2oEUe.js → CheckpointsPanel-DlranVLZ.js} +1 -1
  39. package/ui/dist/assets/{CommandPostHub-PXKE62DN.js → CommandPostHub-BgxIa4Ev.js} +3 -3
  40. package/ui/dist/assets/{CronPanel-lAsoKavq.js → CronPanel-LoT5yKwJ.js} +1 -1
  41. package/ui/dist/assets/{DaemonPanel-xt08Rs10.js → DaemonPanel-DBGMqaE_.js} +1 -1
  42. package/ui/dist/assets/{DataTable-BHOu7fZP.js → DataTable-B2Ma8hfi.js} +1 -1
  43. package/ui/dist/assets/{EmptyState-Dk7BBthD.js → EmptyState-CcKyk5Yn.js} +1 -1
  44. package/ui/dist/assets/EvalHarnessPanel-BqtMc1ZM.js +2 -0
  45. package/ui/dist/assets/{EvalPanel-D9rDf1bk.js → EvalPanel-Bc33j0pN.js} +1 -1
  46. package/ui/dist/assets/{FilesPanel-CNrDLmix.js → FilesPanel-3QKvrWPo.js} +1 -1
  47. package/ui/dist/assets/{FleetPanel-DP_ji0AE.js → FleetPanel-CSsXuQYj.js} +1 -1
  48. package/ui/dist/assets/{HomelabPanel-B4bCsrBw.js → HomelabPanel-DhrjTX9m.js} +1 -1
  49. package/ui/dist/assets/{InfraView-C5OYx_9s.js → InfraView-CR6HyrL6.js} +2 -2
  50. package/ui/dist/assets/{InlineEditableField-DyBCbIoN.js → InlineEditableField-CnvF-yFR.js} +1 -1
  51. package/ui/dist/assets/{Input-DWnbv1Yh.js → Input-GTHp2Rkr.js} +1 -1
  52. package/ui/dist/assets/{IntegrationsPanel-DsB6hjvE.js → IntegrationsPanel-CymCRE3T.js} +1 -1
  53. package/ui/dist/assets/{IntelligenceView-PIFGvIg_.js → IntelligenceView-C1IHxJRC.js} +2 -2
  54. package/ui/dist/assets/{LearningPanel-D_S4HFX5.js → LearningPanel-DOCES3lH.js} +1 -1
  55. package/ui/dist/assets/{LogsPanel-BnWNREPX.js → LogsPanel-BLnAqEaZ.js} +1 -1
  56. package/ui/dist/assets/{McpPanel-CIMxZ2Am.js → McpPanel-ChUzmr3z.js} +1 -1
  57. package/ui/dist/assets/{MemoryGraphPanel-DD7x4rrm.js → MemoryGraphPanel-Bzvjmzvk.js} +1 -1
  58. package/ui/dist/assets/{MemoryWikiPanel-BPPVAH0b.js → MemoryWikiPanel-Dwk3Aqwd.js} +1 -1
  59. package/ui/dist/assets/{MeshPanel-CiuwR3oV.js → MeshPanel-C3LJSlht.js} +1 -1
  60. package/ui/dist/assets/{NvidiaPanel-DVntoRrH.js → NvidiaPanel-CeZK_-CV.js} +1 -1
  61. package/ui/dist/assets/{OrganismPanel-pqIKtHrW.js → OrganismPanel-BB6YOiQV.js} +1 -1
  62. package/ui/dist/assets/OverviewPanel-BmtBhQnv.js +1 -0
  63. package/ui/dist/assets/{PageHeader-CF75km05.js → PageHeader-BimceqQo.js} +1 -1
  64. package/ui/dist/assets/{PaperclipPanel-CwN5-cKg.js → PaperclipPanel-C-brgwA3.js} +1 -1
  65. package/ui/dist/assets/{PersonasPanel-ClC_TTGX.js → PersonasPanel-L1j78p6H.js} +1 -1
  66. package/ui/dist/assets/{RecipesPanel-Di2l-eOe.js → RecipesPanel-34lCfynJ.js} +1 -1
  67. package/ui/dist/assets/{SecurityPanel-DjC4pXGM.js → SecurityPanel-CBTPWLj6.js} +1 -1
  68. package/ui/dist/assets/{SelfImprovePanel-CNpCp5N4.js → SelfImprovePanel-BrPbFHhG.js} +1 -1
  69. package/ui/dist/assets/{SelfProposalsPanel-BJL6Fjxo.js → SelfProposalsPanel-lNmiDThB.js} +1 -1
  70. package/ui/dist/assets/{SessionsPanel-EAGKDQp0.js → SessionsPanel-DAEYIn83.js} +1 -1
  71. package/ui/dist/assets/{SessionsTab-tc0njI15.js → SessionsTab-JQbltWww.js} +1 -1
  72. package/ui/dist/assets/{SettingsPanel-BdSGImIa.js → SettingsPanel-CzRROAYQ.js} +1 -1
  73. package/ui/dist/assets/{SettingsView-DQB64bjy.js → SettingsView-CN7ii2uw.js} +2 -2
  74. package/ui/dist/assets/{SkeletonLoader-P8SFCyGi.js → SkeletonLoader-atQtpcF5.js} +1 -1
  75. package/ui/dist/assets/{SkillsPanel-lDMl_8da.js → SkillsPanel-DlFs2ih7.js} +1 -1
  76. package/ui/dist/assets/{SomaView-BG7YvBu2.js → SomaView-Ba642Oqb.js} +1 -1
  77. package/ui/dist/assets/{StatCard-Cv2u-yqA.js → StatCard-DciE_Iqc.js} +1 -1
  78. package/ui/dist/assets/{StatusBadge-JJeoEdCm.js → StatusBadge-BtfSPoW2.js} +1 -1
  79. package/ui/dist/assets/{TeamsPanel-D-iCyyYd.js → TeamsPanel-DKQ5z2Qe.js} +1 -1
  80. package/ui/dist/assets/{TelemetryPanel-DHNFyCwn.js → TelemetryPanel-B6KAc55Q.js} +1 -1
  81. package/ui/dist/assets/{TitanCanvas-BhurNMK3.js → TitanCanvas-C-s0A-lv.js} +3 -3
  82. package/ui/dist/assets/ToolsView-Dei0KMP0.js +2 -0
  83. package/ui/dist/assets/{Tooltip-D4IeQDJL.js → Tooltip-70UK0E2I.js} +1 -1
  84. package/ui/dist/assets/{TraceViewer-CMd-Wi0z.js → TraceViewer-BniolyBx.js} +1 -1
  85. package/ui/dist/assets/{TrainingPanel-CLtiBq2h.js → TrainingPanel-Bz4CTPGW.js} +1 -1
  86. package/ui/dist/assets/{VoiceOverlay-BXPVdnJc.js → VoiceOverlay-CmNCrLcd.js} +1 -1
  87. package/ui/dist/assets/{VramPanel-DjuwGUzA.js → VramPanel-Xh_OtRDR.js} +1 -1
  88. package/ui/dist/assets/{WatchView-B7sDnMpl.js → WatchView-C-sGFpVy.js} +1 -1
  89. package/ui/dist/assets/{WorkTab-B5nQ4Y7A.js → WorkTab-BjLNmgIK.js} +1 -1
  90. package/ui/dist/assets/{WorkflowsPanel-2z0TeXyR.js → WorkflowsPanel-CvgQU1xI.js} +1 -1
  91. package/ui/dist/assets/{arrow-left-BKOkzkae.js → arrow-left-DwqHtJiU.js} +1 -1
  92. package/ui/dist/assets/{chart-column-D39PCk17.js → chart-column-BtNO6sRy.js} +1 -1
  93. package/ui/dist/assets/{circle-check-big-CMz0QouP.js → circle-check-big-DZRE_MbN.js} +1 -1
  94. package/ui/dist/assets/{dollar-sign-Bu8fZOQl.js → dollar-sign-aVG3a5eL.js} +1 -1
  95. package/ui/dist/assets/{download-vvx6zJ-U.js → download-BxiWJU4G.js} +1 -1
  96. package/ui/dist/assets/{eye-off-BPXFIzlW.js → eye-off-CkgfFYhm.js} +1 -1
  97. package/ui/dist/assets/{funnel-Bqns-i8I.js → funnel-PkLdxKyC.js} +1 -1
  98. package/ui/dist/assets/{git-branch-CdmeqL8d.js → git-branch-BM-Gw95X.js} +1 -1
  99. package/ui/dist/assets/{index-C6oarzis.js → index-CahJbWSR.js} +2 -2
  100. package/ui/dist/assets/index-D0RJ8701.css +1 -0
  101. package/ui/dist/assets/layers-BuGf4FIJ.js +6 -0
  102. package/ui/dist/assets/{legacy-DFIaZTiF.js → legacy-CR6o4t-y.js} +1 -1
  103. package/ui/dist/assets/{lightbulb-DOL6Q-iP.js → lightbulb-n8gc_XAL.js} +1 -1
  104. package/ui/dist/assets/{pause-B0XymOnS.js → pause-DCV52koX.js} +1 -1
  105. package/ui/dist/assets/{play-Dwp2l5HG.js → play-CcJ9BnCh.js} +1 -1
  106. package/ui/dist/assets/{plug-DRlTjWqQ.js → plug-CfWBXfCl.js} +1 -1
  107. package/ui/dist/assets/{proxy-sXxWK7WF.js → proxy-CzZDfLmm.js} +1 -1
  108. package/ui/dist/assets/{square-yh0jffQZ.js → square-DJpUhlxi.js} +1 -1
  109. package/ui/dist/assets/{target-GxtNG2RW.js → target-DWcmM_9m.js} +1 -1
  110. package/ui/dist/assets/{toggle-right-CYQd_Ux1.js → toggle-right-YusFQ69L.js} +1 -1
  111. package/ui/dist/assets/{trash-2-B4jp_pAQ.js → trash-2-CK7yQ55V.js} +1 -1
  112. package/ui/dist/assets/{trending-up-B26tNhFP.js → trending-up-DGjFyubC.js} +1 -1
  113. package/ui/dist/assets/{trophy-Bf3ZeSeb.js → trophy-uQv_NgDB.js} +1 -1
  114. package/ui/dist/index.html +2 -2
  115. package/ui/dist/assets/EvalHarnessPanel-CJv8CUDy.js +0 -1
  116. package/ui/dist/assets/OverviewPanel-gqYRhmpF.js +0 -6
  117. package/ui/dist/assets/ToolsView-C8sWxLny.js +0 -2
  118. package/ui/dist/assets/index-DsFoD9SP.css +0 -1
@@ -45,7 +45,7 @@ import { TITAN_VERSION, TITAN_NAME, TITAN_LOGS_DIR, TITAN_HOME } from "../utils/
45
45
  import { collectSystemProfile, recordStartupAnalytics, startHeartbeatAnalytics } from "../analytics/collector.js";
46
46
  import { getUpdateInfo } from "../utils/updater.js";
47
47
  import { getMissionControlHTML } from "./dashboard.js";
48
- import { serializePrometheus, getMetricsSummary, titanRequestsTotal, titanRequestDuration, titanErrorsTotal, titanActiveSessions, titanToolCallsTotal, titanTokensTotal, titanModelRequestsTotal, recordEvalSuiteResult } from "./metrics.js";
48
+ import { serializePrometheus, getMetricsSummary, titanRequestsTotal, titanRequestDuration, titanErrorsTotal, titanActiveSessions, titanToolCallsTotal, titanTokensTotal, titanModelRequestsTotal, recordEvalSuiteResult, recordEvalTimeout, recordEvalError } from "./metrics.js";
49
49
  import { initSlashCommands, handleSlashCommand } from "./slashCommands.js";
50
50
  import { initMcpServers, listMcpServers, addMcpServer, removeMcpServer, setMcpServerEnabled, getMcpStatus, BUILTIN_PRESETS } from "../mcp/registry.js";
51
51
  import { connectMcpServer, testMcpServer } from "../mcp/client.js";
@@ -2266,8 +2266,20 @@ ${msg.content}
2266
2266
  }
2267
2267
  });
2268
2268
  app.post("/api/eval/run", async (req, res) => {
2269
+ const requestedSuite = req.body?.suite ?? "";
2270
+ const timeoutMs = (() => {
2271
+ const raw = req.query?.timeoutMs;
2272
+ if (typeof raw !== "string") return 6e5;
2273
+ const n = Number(raw);
2274
+ if (!Number.isFinite(n) || n <= 0) return 6e5;
2275
+ return Math.max(1e4, Math.min(36e5, Math.round(n)));
2276
+ })();
2277
+ if (requestedSuite) {
2278
+ res.setHeader("X-Eval-Suite", requestedSuite);
2279
+ }
2280
+ const tStart = Date.now();
2281
+ logger.info(COMPONENT, `/api/eval/run START suite=${requestedSuite || "(none)"} timeoutMs=${timeoutMs}`);
2269
2282
  try {
2270
- const { suite } = req.body;
2271
2283
  const {
2272
2284
  runEvalSuite,
2273
2285
  WIDGET_CREATION_SUITE,
@@ -2315,6 +2327,7 @@ _____widget
2315
2327
  };
2316
2328
  };
2317
2329
  let cases;
2330
+ const suite = requestedSuite;
2318
2331
  switch (suite) {
2319
2332
  case "widget-creation":
2320
2333
  cases = WIDGET_CREATION_SUITE;
@@ -2350,18 +2363,57 @@ _____widget
2350
2363
  cases = CONTENT_SUITE;
2351
2364
  break;
2352
2365
  default:
2353
- res.status(400).json({ error: `Unknown suite: ${suite}. Choose: widget-creation, safety, tool-routing, gate-format, pipeline, adversarial, tool-routing-v2, session, widget-v2, gate-format-v2, content.` });
2366
+ res.status(404).json({
2367
+ error: `Unknown suite: ${suite || "(empty)"}. Choose: widget-creation, safety, tool-routing, gate-format, pipeline, adversarial, tool-routing-v2, session, widget-v2, gate-format-v2, content.`
2368
+ });
2354
2369
  return;
2355
2370
  }
2356
- const result = await runEvalSuite(suite, cases, agentCall);
2371
+ const TIMEOUT = /* @__PURE__ */ Symbol("eval-timeout");
2372
+ const result = await Promise.race([
2373
+ runEvalSuite(suite, cases, agentCall),
2374
+ new Promise((resolve2) => {
2375
+ setTimeout(() => resolve2(TIMEOUT), timeoutMs);
2376
+ })
2377
+ ]);
2378
+ if (result === TIMEOUT) {
2379
+ const elapsed2 = Date.now() - tStart;
2380
+ logger.warn(COMPONENT, `/api/eval/run TIMEOUT suite=${suite} elapsedMs=${elapsed2} timeoutMs=${timeoutMs}`);
2381
+ try {
2382
+ recordEvalTimeout(suite);
2383
+ } catch {
2384
+ }
2385
+ res.status(504).json({
2386
+ suite,
2387
+ passed: 0,
2388
+ total: 0,
2389
+ results: [],
2390
+ timedOut: true,
2391
+ timeoutMs,
2392
+ elapsedMs: elapsed2,
2393
+ error: `Eval suite '${suite}' timed out after ${timeoutMs}ms`
2394
+ });
2395
+ return;
2396
+ }
2357
2397
  try {
2358
2398
  recordEvalSuiteResult(suite, result.passed, result.total);
2359
2399
  } catch {
2360
2400
  }
2401
+ const elapsed = Date.now() - tStart;
2402
+ logger.info(COMPONENT, `/api/eval/run DONE suite=${suite} passed=${result.passed}/${result.total} elapsedMs=${elapsed}`);
2361
2403
  res.json(result);
2362
2404
  } catch (e) {
2363
- logger.error(COMPONENT, `Endpoint error: ${e.message}`);
2364
- res.status(500).json({ error: "Something went wrong on our end. Please try again in a moment." });
2405
+ const err = e;
2406
+ const elapsed = Date.now() - tStart;
2407
+ logger.warn(COMPONENT, `/api/eval/run ERROR suite=${requestedSuite || "(none)"} elapsedMs=${elapsed} message=${err.message}`);
2408
+ try {
2409
+ recordEvalError(requestedSuite || "unknown", err.name || "unknown");
2410
+ } catch {
2411
+ }
2412
+ res.status(500).json({
2413
+ suite: requestedSuite || void 0,
2414
+ error: err.message || "Eval run failed",
2415
+ errorClass: err.name || "Error"
2416
+ });
2365
2417
  }
2366
2418
  });
2367
2419
  app.get("/api/eval/suites", async (_req, res) => {