titan-agent 6.1.0-beta.25 → 6.1.0-beta.27

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 (169) hide show
  1. package/dist/agent/selfKnowledge.js +251 -0
  2. package/dist/agent/selfKnowledge.js.map +1 -0
  3. package/dist/cli/index.js +3 -2
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/config/config.js +14 -0
  6. package/dist/config/config.js.map +1 -1
  7. package/dist/config/schema.js +2 -0
  8. package/dist/config/schema.js.map +1 -1
  9. package/dist/gateway/routes/files.js +18 -0
  10. package/dist/gateway/routes/files.js.map +1 -1
  11. package/dist/gateway/routes/mesh.js +13 -0
  12. package/dist/gateway/routes/mesh.js.map +1 -1
  13. package/dist/gateway/routes/systemRouter.js +24 -8
  14. package/dist/gateway/routes/systemRouter.js.map +1 -1
  15. package/dist/providers/anthropic.js +1 -0
  16. package/dist/providers/anthropic.js.map +1 -1
  17. package/dist/skills/builtin/fb_autopilot.js +71 -76
  18. package/dist/skills/builtin/fb_autopilot.js.map +1 -1
  19. package/dist/skills/builtin/fb_truth_verifier.js +78 -0
  20. package/dist/skills/builtin/fb_truth_verifier.js.map +1 -0
  21. package/dist/utils/constants.js +1 -1
  22. package/dist/utils/constants.js.map +1 -1
  23. package/package.json +1 -1
  24. package/ui/dist/assets/{AuditPanel-DRj8BP7X.js → AuditPanel-C03TpJa3.js} +2 -2
  25. package/ui/dist/assets/{AutonomyPanel-ZLBKe_Qy.js → AutonomyPanel-BYhDnIx8.js} +1 -1
  26. package/ui/dist/assets/{AutopilotPanel-CtINRHag.js → AutopilotPanel-zacnILiA.js} +1 -1
  27. package/ui/dist/assets/{AutoresearchPanel-ChXmUWSz.js → AutoresearchPanel-BhyOcN-E.js} +1 -1
  28. package/ui/dist/assets/{BackupPanel-CkVbuBOc.js → BackupPanel-BEfUHVnL.js} +1 -1
  29. package/ui/dist/assets/{BrowserPanel-D88oDLAF.js → BrowserPanel-q4neRHt_.js} +2 -2
  30. package/ui/dist/assets/{CPActivity-0Bv74tMp.js → CPActivity-CVuqyd14.js} +1 -1
  31. package/ui/dist/assets/{CPAgentDetail-sZL2TmzK.js → CPAgentDetail-BvUER8-i.js} +1 -1
  32. package/ui/dist/assets/{CPAgents-CG9U3h7e.js → CPAgents-BcSS4QKG.js} +1 -1
  33. package/ui/dist/assets/{CPApprovals-UnUJVMFA.js → CPApprovals-D2ItAS-v.js} +1 -1
  34. package/ui/dist/assets/CPCosts-NToxNRpD.js +1 -0
  35. package/ui/dist/assets/{CPDashboard-BC5D9uaX.js → CPDashboard-DbOCa5tn.js} +1 -1
  36. package/ui/dist/assets/{CPFiles-C4g0ahtz.js → CPFiles-HzwGP7eq.js} +1 -1
  37. package/ui/dist/assets/{CPGoals-Nxc5mW7k.js → CPGoals-CByywV0l.js} +1 -1
  38. package/ui/dist/assets/{CPInbox-CxtugUns.js → CPInbox-DQhdrxRM.js} +2 -2
  39. package/ui/dist/assets/{CPIssueDetail-CZ5zmOft.js → CPIssueDetail-BvlVQ9Gl.js} +1 -1
  40. package/ui/dist/assets/{CPIssues-zN719_j3.js → CPIssues-CCnGDfQV.js} +1 -1
  41. package/ui/dist/assets/CPLayout-BgHjPWK2.js +2 -0
  42. package/ui/dist/assets/{CPOrg-BjTG301u.js → CPOrg-ihnxgWJ4.js} +1 -1
  43. package/ui/dist/assets/{CPRuns-DB0YTwI8.js → CPRuns-DwkBGdls.js} +1 -1
  44. package/ui/dist/assets/{CPSocial-DnLHi0Qk.js → CPSocial-qoPKTX61.js} +3 -3
  45. package/ui/dist/assets/{CPVoice-CDiOMxD6.js → CPVoice-BqSJ_inl.js} +1 -1
  46. package/ui/dist/assets/{ChannelsPanel-DdCnzbJP.js → ChannelsPanel-BHlUSl20.js} +1 -1
  47. package/ui/dist/assets/{CheckpointsPanel-Czn3x3Tp.js → CheckpointsPanel-CUoD7KHY.js} +1 -1
  48. package/ui/dist/assets/{CommandPostHub-COmXFAL5.js → CommandPostHub-BCbS1xCl.js} +4 -4
  49. package/ui/dist/assets/{CronPanel-D6lrCbky.js → CronPanel-BVTaZTS3.js} +1 -1
  50. package/ui/dist/assets/{DataTable-B_IdMID_.js → DataTable-DfTteT5j.js} +1 -1
  51. package/ui/dist/assets/DreamPanel-CBiQHa-D.js +15 -0
  52. package/ui/dist/assets/{EmptyState-CF_iYUEK.js → EmptyState-DRt4-zwv.js} +1 -1
  53. package/ui/dist/assets/{EvalHarnessPanel-BNGsxuo1.js → EvalHarnessPanel-DJIVPqWo.js} +2 -2
  54. package/ui/dist/assets/{EvalPanel-COwaQilw.js → EvalPanel-BmP0e0x4.js} +1 -1
  55. package/ui/dist/assets/{FileViewer-Nf1-zqmz.js → FileViewer-DhulLiBR.js} +1 -1
  56. package/ui/dist/assets/{FilesPanel-DXcDWois.js → FilesPanel-BUECv82L.js} +1 -1
  57. package/ui/dist/assets/{FleetPanel-DQ855fUg.js → FleetPanel-t1NVQT-M.js} +1 -1
  58. package/ui/dist/assets/{HomelabPanel-CE7dzRiK.js → HomelabPanel-D-pcmEpl.js} +1 -1
  59. package/ui/dist/assets/InfraView-DbvE7iSD.js +2 -0
  60. package/ui/dist/assets/{InlineEditableField-CHM9rbRj.js → InlineEditableField-CMnk2oAj.js} +1 -1
  61. package/ui/dist/assets/{Input-DbEXRDPj.js → Input-BHtYNaP2.js} +1 -1
  62. package/ui/dist/assets/{IntegrationsPanel-C-d-RLNn.js → IntegrationsPanel-C51rgu8M.js} +1 -1
  63. package/ui/dist/assets/IntelligenceView-Aq1Mp-Hw.js +2 -0
  64. package/ui/dist/assets/{LearningPanel-BWUuVb1Y.js → LearningPanel-Ci3xtDsj.js} +1 -1
  65. package/ui/dist/assets/{LogsPanel-DY1r9kS8.js → LogsPanel-CK2SIB3m.js} +1 -1
  66. package/ui/dist/assets/{McpPanel-C4kuZO8W.js → McpPanel-DZWkwAz_.js} +1 -1
  67. package/ui/dist/assets/{MemoryGraphPanel-Bl8serF8.js → MemoryGraphPanel-CoE8uyiR.js} +1 -1
  68. package/ui/dist/assets/{MemoryWikiPanel-zs2tuobJ.js → MemoryWikiPanel-DXp7t6A1.js} +1 -1
  69. package/ui/dist/assets/{MeshPanel-pjSWpVaQ.js → MeshPanel-CJLHNwgA.js} +1 -1
  70. package/ui/dist/assets/{MissionCanvas-DZ19L37E.js → MissionCanvas-BMzJJo16.js} +1 -1
  71. package/ui/dist/assets/{MissionChat-D9SNv-ci.js → MissionChat-yVlJKubD.js} +1 -1
  72. package/ui/dist/assets/{MissionLibrary-QZ_3ak1w.js → MissionLibrary-nv6eIrNU.js} +1 -1
  73. package/ui/dist/assets/MissionStart-D2bbqMrT.js +1 -0
  74. package/ui/dist/assets/{Modal-CDRATPRb.js → Modal-rowyYPuH.js} +1 -1
  75. package/ui/dist/assets/{NvidiaPanel-DWIcKFTQ.js → NvidiaPanel-e5pHuY4P.js} +1 -1
  76. package/ui/dist/assets/{OrganismPanel-Cr_mFsIN.js → OrganismPanel-P2O3Fm3c.js} +1 -1
  77. package/ui/dist/assets/OverviewPanel-B669q2Ow.js +1 -0
  78. package/ui/dist/assets/{PageHeader-gO-bR9OS.js → PageHeader-o-eBmtEV.js} +1 -1
  79. package/ui/dist/assets/{PersonaProfilesPanel-vRZNq6LI.js → PersonaProfilesPanel-4TqQK_X4.js} +1 -1
  80. package/ui/dist/assets/{PersonasPanel-CXLJNGcG.js → PersonasPanel-Caejb0UH.js} +1 -1
  81. package/ui/dist/assets/{RecipesPanel-zrCayW_P.js → RecipesPanel-O4nVaS8i.js} +1 -1
  82. package/ui/dist/assets/{SecurityPanel-B05Uiah7.js → SecurityPanel-6QnHZZqz.js} +1 -1
  83. package/ui/dist/assets/{SelfImprovePanel-BsrxzLii.js → SelfImprovePanel-BJVUbZW4.js} +1 -1
  84. package/ui/dist/assets/{SelfProposalsPanel-BPRCwQ-T.js → SelfProposalsPanel-CQGWP6ow.js} +1 -1
  85. package/ui/dist/assets/{SessionsPanel-DzsiOGFa.js → SessionsPanel-BeEOjdZf.js} +1 -1
  86. package/ui/dist/assets/{SessionsTab-CXqbywW6.js → SessionsTab-CueVjeNR.js} +1 -1
  87. package/ui/dist/assets/{SettingsPanel-DDsy0Lg0.js → SettingsPanel-CZswktFN.js} +1 -1
  88. package/ui/dist/assets/SettingsView-CFfdaYFl.js +2 -0
  89. package/ui/dist/assets/{SkeletonLoader-BafXZ_pT.js → SkeletonLoader-ClmUf9Dw.js} +1 -1
  90. package/ui/dist/assets/{SkillsPanel-CBokPThJ.js → SkillsPanel-BdUPV6uO.js} +1 -1
  91. package/ui/dist/assets/{SomaView-BSHXNmj4.js → SomaView-DaVBbeOx.js} +1 -1
  92. package/ui/dist/assets/{StatCard-bqROi-Rh.js → StatCard-Bd3mtyRe.js} +1 -1
  93. package/ui/dist/assets/{StatusBadge-YHPBF2s-.js → StatusBadge-aSKWYkIJ.js} +1 -1
  94. package/ui/dist/assets/{Tabs-R4lH4BzA.js → Tabs-BLXhcehr.js} +1 -1
  95. package/ui/dist/assets/{TeamsPanel-Bnfl-CUH.js → TeamsPanel-DFtLuPTY.js} +1 -1
  96. package/ui/dist/assets/{TelemetryPanel-CXI9G0O-.js → TelemetryPanel-DN8keARN.js} +1 -1
  97. package/ui/dist/assets/{TitanCanvas-CBW3pvr9.js → TitanCanvas-Ds0GoyxS.js} +4 -4
  98. package/ui/dist/assets/{ToolsView-C81vU08V.js → ToolsView-BYdd3Wh-.js} +2 -2
  99. package/ui/dist/assets/{Tooltip-CfMj1ag0.js → Tooltip-DiyE6JpR.js} +1 -1
  100. package/ui/dist/assets/{TraceViewer-BWjQx8cX.js → TraceViewer-DfA2pqJS.js} +1 -1
  101. package/ui/dist/assets/{TrainingPanel-5jcBMJ4g.js → TrainingPanel-Dgy-kufx.js} +1 -1
  102. package/ui/dist/assets/{VoiceOverlay-DTdI_cx0.js → VoiceOverlay-CZLStzNf.js} +1 -1
  103. package/ui/dist/assets/{VramPanel-DcezorAc.js → VramPanel-CKrvEXdg.js} +1 -1
  104. package/ui/dist/assets/{WatchView-IIOFNNhA.js → WatchView-D_3dOCcO.js} +1 -1
  105. package/ui/dist/assets/{WorkTab-BDAp0liv.js → WorkTab-D9i-AHKw.js} +1 -1
  106. package/ui/dist/assets/{WorkflowsPanel-DvkKD7Gl.js → WorkflowsPanel-CgBLjLsu.js} +1 -1
  107. package/ui/dist/assets/{archive-BwnE6YXw.js → archive-bAD4GiIr.js} +1 -1
  108. package/ui/dist/assets/{arrow-left-yhbL_8bJ.js → arrow-left-CFEVjZig.js} +1 -1
  109. package/ui/dist/assets/{book-open-D_dm6ck9.js → book-open-B4e2Onfw.js} +1 -1
  110. package/ui/dist/assets/{bot-DJr_bqVn.js → bot--qrTevJU.js} +1 -1
  111. package/ui/dist/assets/{chart-column-C7hqa-Z_.js → chart-column-QM6U2nO9.js} +1 -1
  112. package/ui/dist/assets/{check-C-RMe_NZ.js → check-CCWElmTK.js} +1 -1
  113. package/ui/dist/assets/{chevron-right-DCcuf5Uz.js → chevron-right-DreIedML.js} +1 -1
  114. package/ui/dist/assets/{chevron-up-BbFVaxso.js → chevron-up-C0poc_Ty.js} +1 -1
  115. package/ui/dist/assets/{circle-check-big-B3fLxJBo.js → circle-check-big-CaHML51r.js} +1 -1
  116. package/ui/dist/assets/{circle-stop-ibgcGVe7.js → circle-stop-DoFkbbBw.js} +1 -1
  117. package/ui/dist/assets/{clock-NgoBK2QL.js → clock-CrdmAL5a.js} +1 -1
  118. package/ui/dist/assets/{dollar-sign-CSDPyHuO.js → dollar-sign-D7usG6E-.js} +1 -1
  119. package/ui/dist/assets/{download-Sd62lme-.js → download-CbNWpvdm.js} +1 -1
  120. package/ui/dist/assets/{external-link-BqmG9Q9n.js → external-link-CZhn5Bko.js} +1 -1
  121. package/ui/dist/assets/{file-text-CYejAiNP.js → file-text-CHa_fSw0.js} +1 -1
  122. package/ui/dist/assets/{flask-conical-hMb4NjDi.js → flask-conical-CRKjOa4h.js} +1 -1
  123. package/ui/dist/assets/{folder-BfwIroVP.js → folder-CYWe_whM.js} +1 -1
  124. package/ui/dist/assets/{funnel-CFxzfLug.js → funnel-BaJja5_Q.js} +1 -1
  125. package/ui/dist/assets/{git-branch-CAUUGDq5.js → git-branch-BvuvKXhb.js} +1 -1
  126. package/ui/dist/assets/index-DQu5WP-K.css +1 -0
  127. package/ui/dist/assets/index-IOF6dmzW.js +337 -0
  128. package/ui/dist/assets/{layers-CxiG9985.js → layers-D_aUEQY1.js} +1 -1
  129. package/ui/dist/assets/{legacy-Bw7e_FLE.js → legacy-D6UG4sMu.js} +1 -1
  130. package/ui/dist/assets/{lightbulb-CQVMeQgx.js → lightbulb-DEgDCMQ-.js} +1 -1
  131. package/ui/dist/assets/{list-todo-cp1zgIB7.js → list-todo-Dci_zgIa.js} +1 -1
  132. package/ui/dist/assets/{message-square-B2iiKJ2Y.js → message-square-CdhpQvvc.js} +1 -1
  133. package/ui/dist/assets/{mic-BajmUqKL.js → mic-BXvCWNCZ.js} +1 -1
  134. package/ui/dist/assets/{missions-542UgCDE.js → missions-B-qSsdoD.js} +1 -1
  135. package/ui/dist/assets/{network-C0dvvIgD.js → network-DAKV88Q0.js} +1 -1
  136. package/ui/dist/assets/{pause-CJwW9IkQ.js → pause-CoD7HAPx.js} +1 -1
  137. package/ui/dist/assets/{pencil-DmCQts-w.js → pencil-AjmwjKY6.js} +1 -1
  138. package/ui/dist/assets/{play-C0JD0BwX.js → play-DU3ppRmg.js} +1 -1
  139. package/ui/dist/assets/{plug-Ca_BGiru.js → plug-DEUDS9zV.js} +1 -1
  140. package/ui/dist/assets/{plus-B-MJtSOy.js → plus-CMMP62Fk.js} +1 -1
  141. package/ui/dist/assets/{proxy-CXF88dd3.js → proxy-DOEcpEr3.js} +1 -1
  142. package/ui/dist/assets/{radio-CF2Bjtld.js → radio-CflqZjrI.js} +1 -1
  143. package/ui/dist/assets/{refresh-cw-C8D4alb_.js → refresh-cw-DoAedOdz.js} +1 -1
  144. package/ui/dist/assets/{rotate-ccw-018f_kIl.js → rotate-ccw-Dcv4FV3K.js} +1 -1
  145. package/ui/dist/assets/{save-B6-TSxbs.js → save-B3mWLJaI.js} +1 -1
  146. package/ui/dist/assets/{search-A5dUqxsJ.js → search-j18D4PDo.js} +1 -1
  147. package/ui/dist/assets/{send-D6vWrB_L.js → send-Cpl6Zy7O.js} +1 -1
  148. package/ui/dist/assets/{server-CXcqQEZy.js → server-CLB6k1ix.js} +1 -1
  149. package/ui/dist/assets/{shield-check-BHrbxZYQ.js → shield-check-CAsek5XL.js} +1 -1
  150. package/ui/dist/assets/{terminal-DEMHEd9H.js → terminal-CScZoWbR.js} +1 -1
  151. package/ui/dist/assets/{test-tube-PPEm85Ky.js → test-tube-Dpq4qqFo.js} +1 -1
  152. package/ui/dist/assets/{toggle-right-wYZjzYQU.js → toggle-right-BnaaPoH_.js} +1 -1
  153. package/ui/dist/assets/{trash-2-o6k5uOmh.js → trash-2-DXfQWc0z.js} +1 -1
  154. package/ui/dist/assets/{trending-up-DBfQYpq2.js → trending-up-CpMyetOt.js} +1 -1
  155. package/ui/dist/assets/{trophy-D07gdeTf.js → trophy-Dxklz8w4.js} +1 -1
  156. package/ui/dist/assets/{volume-2-CFn1OG7u.js → volume-2-BzTq3iUG.js} +1 -1
  157. package/ui/dist/assets/{wifi-off-KaIs619z.js → wifi-off-DbVVRgCX.js} +1 -1
  158. package/ui/dist/index.html +2 -2
  159. package/ui/dist/sw.js +1 -1
  160. package/ui/dist/assets/CPCosts-lZ1Dm3lk.js +0 -1
  161. package/ui/dist/assets/CPLayout-LoFN9UdG.js +0 -2
  162. package/ui/dist/assets/DreamPanel-ZUvLh8Y6.js +0 -15
  163. package/ui/dist/assets/InfraView-Cwl6E_h9.js +0 -2
  164. package/ui/dist/assets/IntelligenceView-sfQVlfBV.js +0 -2
  165. package/ui/dist/assets/MissionStart-OpfD5otN.js +0 -1
  166. package/ui/dist/assets/OverviewPanel-DCH53z1E.js +0 -1
  167. package/ui/dist/assets/SettingsView-DSElhmt0.js +0 -2
  168. package/ui/dist/assets/index-CRXGEBlP.js +0 -322
  169. package/ui/dist/assets/index-CoDvqC1m.css +0 -1
@@ -0,0 +1,251 @@
1
+ #!/usr/bin/env node
2
+ import { execSync } from "child_process";
3
+ import { existsSync, readFileSync, readdirSync } from "fs";
4
+ import { statfs } from "fs/promises";
5
+ import { cpus, freemem, loadavg, totalmem } from "os";
6
+ import { join } from "path";
7
+ import { loadConfig } from "../config/config.js";
8
+ import { getSkills } from "../skills/registry.js";
9
+ import { getRegisteredTools } from "./toolRunner.js";
10
+ import { getActivitySummary, readActivityEvents } from "../telemetry/activityLog.js";
11
+ import { TELEMETRY_EVENTS_PATH, TITAN_HOME, TITAN_LOGS_DIR, TITAN_VERSION } from "../utils/constants.js";
12
+ const FB_STATE_PATH = join(TITAN_HOME, "fb-autopilot-state.json");
13
+ const SOMA_DRIVE_STATE_PATH = join(TITAN_HOME, "soma-drive-state.json");
14
+ const DRIVE_STATE_PATH = join(TITAN_HOME, "drive-state.json");
15
+ const RESTART_HISTORY_PATH = join(TITAN_HOME, "restart-history.jsonl");
16
+ const CHANGELOG_PATH = join(process.cwd(), "CHANGELOG.md");
17
+ const CACHE_MS = 6e4;
18
+ let cachedAt = 0;
19
+ let cachedSnapshot = null;
20
+ async function getSelfKnowledge() {
21
+ const now = Date.now();
22
+ if (cachedSnapshot && now - cachedAt < CACHE_MS) {
23
+ return cachedSnapshot;
24
+ }
25
+ const config = loadConfig();
26
+ const activity = getActivitySummary(24);
27
+ const events24h = readActivityEvents().filter((e) => e.t >= now - 24 * 60 * 60 * 1e3);
28
+ const snapshot = {
29
+ version: TITAN_VERSION,
30
+ uptimeSeconds: Math.round(process.uptime()),
31
+ npmDownloads: await getNpmDownloads(),
32
+ skillCount: getSkills().length,
33
+ toolCount: getRegisteredTools().length,
34
+ recentCommitMessages: getRecentCommitMessages(),
35
+ recentReleaseNotes: getRecentReleaseNotes(),
36
+ activityLast24h: {
37
+ toolCalls: activity.toolCalls,
38
+ missionsCompleted: countMissionCompletions(events24h, activity.goalsCompleted),
39
+ postsToFb: countRecentFacebookPosts(now),
40
+ ssePushes: events24h.filter((e) => e.event === "sse_push").length
41
+ },
42
+ drives: readDrives(),
43
+ errorsLast24h: countErrorsLast24h(now, events24h),
44
+ currentModel: config.agent?.model || "",
45
+ hostMetrics: await getHostMetrics()
46
+ };
47
+ cachedAt = now;
48
+ cachedSnapshot = snapshot;
49
+ return snapshot;
50
+ }
51
+ async function getNpmDownloads() {
52
+ let downloads = 25e3;
53
+ try {
54
+ const res = await fetch("https://api.npmjs.org/downloads/point/last-month/titan-agent", {
55
+ signal: AbortSignal.timeout(3e3)
56
+ });
57
+ if (res.ok) {
58
+ const data = await res.json();
59
+ if (typeof data.downloads === "number" && Number.isFinite(data.downloads)) {
60
+ downloads = data.downloads;
61
+ }
62
+ }
63
+ } catch {
64
+ }
65
+ return downloads;
66
+ }
67
+ function getRecentCommitMessages() {
68
+ try {
69
+ const out = execSync("git log --oneline -5 --no-decorate", {
70
+ cwd: process.cwd(),
71
+ encoding: "utf-8",
72
+ stdio: ["ignore", "pipe", "ignore"],
73
+ timeout: 3e3
74
+ });
75
+ return out.split("\n").map((line) => line.trim()).filter(Boolean).slice(0, 5);
76
+ } catch {
77
+ return [];
78
+ }
79
+ }
80
+ function getRecentReleaseNotes() {
81
+ try {
82
+ if (!existsSync(CHANGELOG_PATH)) return [];
83
+ const text = readFileSync(CHANGELOG_PATH, "utf-8");
84
+ const matches = [...text.matchAll(/^## (v\d.+)$/gm)];
85
+ return matches.map((m) => m[1].trim()).filter(Boolean).slice(0, 3);
86
+ } catch {
87
+ return [];
88
+ }
89
+ }
90
+ function countMissionCompletions(events24h, goalCompletions) {
91
+ const explicit = events24h.filter(
92
+ (e) => e.event === "mission_complete" || e.event === "mission_completed" || e.event === "goal_complete" || e.event === "goal_completed"
93
+ ).length;
94
+ return Math.max(explicit, goalCompletions);
95
+ }
96
+ function countRecentFacebookPosts(now) {
97
+ try {
98
+ if (!existsSync(FB_STATE_PATH)) return 0;
99
+ const state = JSON.parse(readFileSync(FB_STATE_PATH, "utf-8"));
100
+ const cutoff = now - 24 * 60 * 60 * 1e3;
101
+ return (state.postHistory || []).filter((post) => {
102
+ if (!post.date) return false;
103
+ const t = new Date(post.date).getTime();
104
+ return Number.isFinite(t) && t > cutoff;
105
+ }).length;
106
+ } catch {
107
+ return 0;
108
+ }
109
+ }
110
+ function readDrives() {
111
+ for (const path of [SOMA_DRIVE_STATE_PATH, DRIVE_STATE_PATH]) {
112
+ try {
113
+ if (!existsSync(path)) continue;
114
+ const parsed = JSON.parse(readFileSync(path, "utf-8"));
115
+ const normalized = normalizeDrives(parsed);
116
+ if (normalized) return normalized;
117
+ } catch {
118
+ }
119
+ }
120
+ return null;
121
+ }
122
+ function normalizeDrives(value) {
123
+ if (!value || typeof value !== "object") return null;
124
+ const record = value;
125
+ const direct = readDriveLevels(record);
126
+ if (direct) return direct;
127
+ const latest = record.latest;
128
+ if (latest && typeof latest === "object") {
129
+ const latestRecord = latest;
130
+ const latestDirect = readDriveLevels(latestRecord);
131
+ if (latestDirect) return latestDirect;
132
+ const drives = latestRecord.drives;
133
+ if (Array.isArray(drives)) {
134
+ const out = {};
135
+ for (const drive of drives) {
136
+ if (!drive || typeof drive !== "object") continue;
137
+ const d = drive;
138
+ const id = d.id;
139
+ const satisfaction = d.satisfaction;
140
+ if (isDriveKey(id) && typeof satisfaction === "number" && Number.isFinite(satisfaction)) {
141
+ out[id] = satisfaction;
142
+ }
143
+ }
144
+ return isCompleteDriveLevels(out) ? out : null;
145
+ }
146
+ }
147
+ const history = record.history;
148
+ if (Array.isArray(history) && history.length > 0) {
149
+ const last = history[history.length - 1];
150
+ const satisfactions = last?.satisfactions;
151
+ if (satisfactions && typeof satisfactions === "object") {
152
+ return readDriveLevels(satisfactions);
153
+ }
154
+ }
155
+ return null;
156
+ }
157
+ function readDriveLevels(record) {
158
+ const out = {};
159
+ for (const key of ["purpose", "hunger", "curiosity", "safety", "social"]) {
160
+ const value = record[key];
161
+ if (typeof value !== "number" || !Number.isFinite(value)) return null;
162
+ out[key] = value;
163
+ }
164
+ return out;
165
+ }
166
+ function isDriveKey(value) {
167
+ return value === "purpose" || value === "hunger" || value === "curiosity" || value === "safety" || value === "social";
168
+ }
169
+ function isCompleteDriveLevels(value) {
170
+ return ["purpose", "hunger", "curiosity", "safety", "social"].every(
171
+ (key) => typeof value[key] === "number"
172
+ );
173
+ }
174
+ function countErrorsLast24h(now, events24h) {
175
+ let count = events24h.filter((e) => e.event === "error_recovery" || e.event === "error").length;
176
+ count += countTelemetryErrorsLast24h(now);
177
+ count += countRestartsLast24h(now);
178
+ try {
179
+ if (!existsSync(TITAN_LOGS_DIR)) return count;
180
+ const cutoff = now - 24 * 60 * 60 * 1e3;
181
+ for (const file of readdirSync(TITAN_LOGS_DIR)) {
182
+ if (!file.endsWith(".log")) continue;
183
+ const text = readFileSync(join(TITAN_LOGS_DIR, file), "utf-8");
184
+ for (const line of text.split("\n")) {
185
+ if (!/\sERROR\s+\[/.test(line)) continue;
186
+ const ts = line.match(/^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/)?.[1];
187
+ if (!ts) {
188
+ count++;
189
+ continue;
190
+ }
191
+ const t = new Date(ts.replace(" ", "T")).getTime();
192
+ if (Number.isFinite(t) && t >= cutoff) count++;
193
+ }
194
+ }
195
+ } catch {
196
+ }
197
+ return count;
198
+ }
199
+ function countTelemetryErrorsLast24h(now) {
200
+ return readJsonLines(TELEMETRY_EVENTS_PATH).filter((entry) => {
201
+ const level = typeof entry.level === "string" ? entry.level.toLowerCase() : "";
202
+ if (level !== "error") return false;
203
+ return timestampInLast24h(entry, now);
204
+ }).length;
205
+ }
206
+ function countRestartsLast24h(now) {
207
+ return readJsonLines(RESTART_HISTORY_PATH).filter((entry) => timestampInLast24h(entry, now)).length;
208
+ }
209
+ function readJsonLines(path) {
210
+ try {
211
+ if (!existsSync(path)) return [];
212
+ return readFileSync(path, "utf-8").split("\n").map((line) => line.trim()).filter(Boolean).flatMap((line) => {
213
+ try {
214
+ const parsed = JSON.parse(line);
215
+ return parsed && typeof parsed === "object" ? [parsed] : [];
216
+ } catch {
217
+ return [];
218
+ }
219
+ });
220
+ } catch {
221
+ return [];
222
+ }
223
+ }
224
+ function timestampInLast24h(entry, now) {
225
+ const raw = entry.t ?? entry.time ?? entry.timestamp ?? entry.ts ?? entry.createdAt;
226
+ const millis = typeof raw === "number" ? raw : typeof raw === "string" ? new Date(raw).getTime() : NaN;
227
+ return Number.isFinite(millis) && millis >= now - 24 * 60 * 60 * 1e3;
228
+ }
229
+ async function getHostMetrics() {
230
+ const avg = loadavg()[0] || 0;
231
+ const cores = cpus().length || 1;
232
+ const cpuPercent = Math.round(Math.min(1, avg / cores) * 1e3) / 10;
233
+ const totalMem = totalmem();
234
+ const usedMem = totalMem - freemem();
235
+ const memPercent = totalMem > 0 ? Math.round(usedMem / totalMem * 1e3) / 10 : 0;
236
+ let diskPercent = 0;
237
+ try {
238
+ const s = await statfs(TITAN_HOME);
239
+ const diskTotalBytes = s.blocks * s.bsize;
240
+ const diskFreeBytes = s.bavail * s.bsize;
241
+ const usedDisk = diskTotalBytes - diskFreeBytes;
242
+ diskPercent = diskTotalBytes > 0 ? Math.round(usedDisk / diskTotalBytes * 1e3) / 10 : 0;
243
+ } catch {
244
+ diskPercent = 0;
245
+ }
246
+ return { cpuPercent, memPercent, diskPercent };
247
+ }
248
+ export {
249
+ getSelfKnowledge
250
+ };
251
+ //# sourceMappingURL=selfKnowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/agent/selfKnowledge.ts"],"sourcesContent":["/**\n * TITAN Self-Knowledge\n *\n * Pure measured facts the social autopilot is allowed to cite. This module\n * must never call an LLM; it only reads local state, config, telemetry, and\n * low-cost host metrics.\n */\nimport { execSync } from 'child_process';\nimport { existsSync, readFileSync, readdirSync } from 'fs';\nimport { statfs } from 'fs/promises';\nimport { cpus, freemem, loadavg, totalmem } from 'os';\nimport { join } from 'path';\nimport { loadConfig } from '../config/config.js';\nimport { getSkills } from '../skills/registry.js';\nimport { getRegisteredTools } from './toolRunner.js';\nimport { getActivitySummary, readActivityEvents } from '../telemetry/activityLog.js';\nimport { TELEMETRY_EVENTS_PATH, TITAN_HOME, TITAN_LOGS_DIR, TITAN_VERSION } from '../utils/constants.js';\n\nconst FB_STATE_PATH = join(TITAN_HOME, 'fb-autopilot-state.json');\nconst SOMA_DRIVE_STATE_PATH = join(TITAN_HOME, 'soma-drive-state.json');\nconst DRIVE_STATE_PATH = join(TITAN_HOME, 'drive-state.json');\nconst RESTART_HISTORY_PATH = join(TITAN_HOME, 'restart-history.jsonl');\nconst CHANGELOG_PATH = join(process.cwd(), 'CHANGELOG.md');\nconst CACHE_MS = 60_000;\n\ninterface DriveLevels {\n purpose: number;\n hunger: number;\n curiosity: number;\n safety: number;\n social: number;\n}\n\nexport interface SelfKnowledge {\n version: string;\n uptimeSeconds: number;\n npmDownloads: number;\n skillCount: number;\n toolCount: number;\n recentCommitMessages: string[];\n recentReleaseNotes: string[];\n activityLast24h: {\n toolCalls: number;\n missionsCompleted: number;\n postsToFb: number;\n ssePushes: number;\n };\n drives: DriveLevels | null;\n errorsLast24h: number;\n currentModel: string;\n hostMetrics: {\n cpuPercent: number;\n memPercent: number;\n diskPercent: number;\n };\n}\n\nlet cachedAt = 0;\nlet cachedSnapshot: SelfKnowledge | null = null;\n\n/** Return a 60s-cached factual snapshot of TITAN's current state. */\nexport async function getSelfKnowledge(): Promise<SelfKnowledge> {\n const now = Date.now();\n if (cachedSnapshot && now - cachedAt < CACHE_MS) {\n return cachedSnapshot;\n }\n\n const config = loadConfig();\n const activity = getActivitySummary(24);\n const events24h = readActivityEvents().filter(e => e.t >= now - 24 * 60 * 60 * 1000);\n const snapshot: SelfKnowledge = {\n version: TITAN_VERSION,\n uptimeSeconds: Math.round(process.uptime()),\n npmDownloads: await getNpmDownloads(),\n skillCount: getSkills().length,\n toolCount: getRegisteredTools().length,\n recentCommitMessages: getRecentCommitMessages(),\n recentReleaseNotes: getRecentReleaseNotes(),\n activityLast24h: {\n toolCalls: activity.toolCalls,\n missionsCompleted: countMissionCompletions(events24h, activity.goalsCompleted),\n postsToFb: countRecentFacebookPosts(now),\n ssePushes: events24h.filter(e => (e.event as string) === 'sse_push').length,\n },\n drives: readDrives(),\n errorsLast24h: countErrorsLast24h(now, events24h),\n currentModel: config.agent?.model || '',\n hostMetrics: await getHostMetrics(),\n };\n\n cachedAt = now;\n cachedSnapshot = snapshot;\n return snapshot;\n}\n\nasync function getNpmDownloads(): Promise<number> {\n let downloads = 25000;\n try {\n const res = await fetch('https://api.npmjs.org/downloads/point/last-month/titan-agent', {\n signal: AbortSignal.timeout(3000),\n });\n if (res.ok) {\n const data = await res.json() as { downloads?: number };\n if (typeof data.downloads === 'number' && Number.isFinite(data.downloads)) {\n downloads = data.downloads;\n }\n }\n } catch {\n /* non-critical: use known conservative fallback */\n }\n return downloads;\n}\n\nfunction getRecentCommitMessages(): string[] {\n try {\n const out = execSync('git log --oneline -5 --no-decorate', {\n cwd: process.cwd(),\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: 3000,\n });\n return out.split('\\n').map(line => line.trim()).filter(Boolean).slice(0, 5);\n } catch {\n return [];\n }\n}\n\nfunction getRecentReleaseNotes(): string[] {\n try {\n if (!existsSync(CHANGELOG_PATH)) return [];\n const text = readFileSync(CHANGELOG_PATH, 'utf-8');\n const matches = [...text.matchAll(/^## (v\\d.+)$/gm)];\n return matches.map(m => m[1].trim()).filter(Boolean).slice(0, 3);\n } catch {\n return [];\n }\n}\n\nfunction countMissionCompletions(events24h: Array<{ event: string }>, goalCompletions: number): number {\n const explicit = events24h.filter(e =>\n e.event === 'mission_complete' ||\n e.event === 'mission_completed' ||\n e.event === 'goal_complete' ||\n e.event === 'goal_completed'\n ).length;\n return Math.max(explicit, goalCompletions);\n}\n\nfunction countRecentFacebookPosts(now: number): number {\n try {\n if (!existsSync(FB_STATE_PATH)) return 0;\n const state = JSON.parse(readFileSync(FB_STATE_PATH, 'utf-8')) as {\n postHistory?: Array<{ date?: string }>;\n };\n const cutoff = now - 24 * 60 * 60 * 1000;\n return (state.postHistory || []).filter(post => {\n if (!post.date) return false;\n const t = new Date(post.date).getTime();\n return Number.isFinite(t) && t > cutoff;\n }).length;\n } catch {\n return 0;\n }\n}\n\nfunction readDrives(): DriveLevels | null {\n for (const path of [SOMA_DRIVE_STATE_PATH, DRIVE_STATE_PATH]) {\n try {\n if (!existsSync(path)) continue;\n const parsed = JSON.parse(readFileSync(path, 'utf-8')) as unknown;\n const normalized = normalizeDrives(parsed);\n if (normalized) return normalized;\n } catch {\n /* try the next state file */\n }\n }\n return null;\n}\n\nfunction normalizeDrives(value: unknown): DriveLevels | null {\n if (!value || typeof value !== 'object') return null;\n const record = value as Record<string, unknown>;\n const direct = readDriveLevels(record);\n if (direct) return direct;\n\n const latest = record.latest;\n if (latest && typeof latest === 'object') {\n const latestRecord = latest as Record<string, unknown>;\n const latestDirect = readDriveLevels(latestRecord);\n if (latestDirect) return latestDirect;\n const drives = latestRecord.drives;\n if (Array.isArray(drives)) {\n const out: Partial<DriveLevels> = {};\n for (const drive of drives) {\n if (!drive || typeof drive !== 'object') continue;\n const d = drive as Record<string, unknown>;\n const id = d.id;\n const satisfaction = d.satisfaction;\n if (isDriveKey(id) && typeof satisfaction === 'number' && Number.isFinite(satisfaction)) {\n out[id] = satisfaction;\n }\n }\n return isCompleteDriveLevels(out) ? out : null;\n }\n }\n\n const history = record.history;\n if (Array.isArray(history) && history.length > 0) {\n const last = history[history.length - 1] as Record<string, unknown> | undefined;\n const satisfactions = last?.satisfactions;\n if (satisfactions && typeof satisfactions === 'object') {\n return readDriveLevels(satisfactions as Record<string, unknown>);\n }\n }\n\n return null;\n}\n\nfunction readDriveLevels(record: Record<string, unknown>): DriveLevels | null {\n const out: Partial<DriveLevels> = {};\n for (const key of ['purpose', 'hunger', 'curiosity', 'safety', 'social'] as const) {\n const value = record[key];\n if (typeof value !== 'number' || !Number.isFinite(value)) return null;\n out[key] = value;\n }\n return out as DriveLevels;\n}\n\nfunction isDriveKey(value: unknown): value is keyof DriveLevels {\n return value === 'purpose' || value === 'hunger' || value === 'curiosity' || value === 'safety' || value === 'social';\n}\n\nfunction isCompleteDriveLevels(value: Partial<DriveLevels>): value is DriveLevels {\n return ['purpose', 'hunger', 'curiosity', 'safety', 'social'].every(key =>\n typeof value[key as keyof DriveLevels] === 'number',\n );\n}\n\nfunction countErrorsLast24h(now: number, events24h: Array<{ event: string }>): number {\n let count = events24h.filter(e => e.event === 'error_recovery' || e.event === 'error').length;\n count += countTelemetryErrorsLast24h(now);\n count += countRestartsLast24h(now);\n try {\n if (!existsSync(TITAN_LOGS_DIR)) return count;\n const cutoff = now - 24 * 60 * 60 * 1000;\n for (const file of readdirSync(TITAN_LOGS_DIR)) {\n if (!file.endsWith('.log')) continue;\n const text = readFileSync(join(TITAN_LOGS_DIR, file), 'utf-8');\n for (const line of text.split('\\n')) {\n if (!/\\sERROR\\s+\\[/.test(line)) continue;\n const ts = line.match(/^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})/)?.[1];\n if (!ts) {\n count++;\n continue;\n }\n const t = new Date(ts.replace(' ', 'T')).getTime();\n if (Number.isFinite(t) && t >= cutoff) count++;\n }\n }\n } catch {\n /* logs are best-effort */\n }\n return count;\n}\n\nfunction countTelemetryErrorsLast24h(now: number): number {\n return readJsonLines(TELEMETRY_EVENTS_PATH).filter(entry => {\n const level = typeof entry.level === 'string' ? entry.level.toLowerCase() : '';\n if (level !== 'error') return false;\n return timestampInLast24h(entry, now);\n }).length;\n}\n\nfunction countRestartsLast24h(now: number): number {\n return readJsonLines(RESTART_HISTORY_PATH).filter(entry => timestampInLast24h(entry, now)).length;\n}\n\nfunction readJsonLines(path: string): Array<Record<string, unknown>> {\n try {\n if (!existsSync(path)) return [];\n return readFileSync(path, 'utf-8')\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean)\n .flatMap(line => {\n try {\n const parsed = JSON.parse(line) as unknown;\n return parsed && typeof parsed === 'object'\n ? [parsed as Record<string, unknown>]\n : [];\n } catch {\n return [];\n }\n });\n } catch {\n return [];\n }\n}\n\nfunction timestampInLast24h(entry: Record<string, unknown>, now: number): boolean {\n const raw = entry.t ?? entry.time ?? entry.timestamp ?? entry.ts ?? entry.createdAt;\n const millis = typeof raw === 'number' ? raw : typeof raw === 'string' ? new Date(raw).getTime() : NaN;\n return Number.isFinite(millis) && millis >= now - 24 * 60 * 60 * 1000;\n}\n\nasync function getHostMetrics(): Promise<SelfKnowledge['hostMetrics']> {\n const avg = loadavg()[0] || 0;\n const cores = cpus().length || 1;\n const cpuPercent = Math.round(Math.min(1, avg / cores) * 1000) / 10;\n const totalMem = totalmem();\n const usedMem = totalMem - freemem();\n const memPercent = totalMem > 0 ? Math.round((usedMem / totalMem) * 1000) / 10 : 0;\n\n let diskPercent = 0;\n try {\n const s = await statfs(TITAN_HOME);\n const diskTotalBytes = s.blocks * s.bsize;\n const diskFreeBytes = s.bavail * s.bsize;\n const usedDisk = diskTotalBytes - diskFreeBytes;\n diskPercent = diskTotalBytes > 0\n ? Math.round((usedDisk / diskTotalBytes) * 1000) / 10\n : 0;\n } catch {\n diskPercent = 0;\n }\n\n return { cpuPercent, memPercent, diskPercent };\n}\n"],"mappings":"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","names":[]}
package/dist/cli/index.js CHANGED
@@ -60,8 +60,9 @@ program.command("agent").description("Send a message directly to the TITAN agent
60
60
  `));
61
61
  console.error(" Run setup:");
62
62
  console.error(chalk.cyan(" titan onboard\n"));
63
- console.error(" Or set an environment variable:");
64
- console.error(chalk.cyan(' export ANTHROPIC_API_KEY="sk-ant-..."\n'));
63
+ console.error(" Or configure a provider/model:");
64
+ console.error(chalk.cyan(" ollama pull qwen2.5-coder:7b"));
65
+ console.error(chalk.cyan(" titan config --set agent.model=ollama/qwen2.5-coder:7b\n"));
65
66
  process.exit(1);
66
67
  }
67
68
  initMemory();