@monoes/monomindcli 2.16.12 → 2.16.14

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 (386) hide show
  1. package/.claude/agents/core/coder.md +1 -1
  2. package/.claude/agents/engineering/engineering-devops-automator.md +1 -1
  3. package/.claude/agents/github/repo-architect.md +1 -1
  4. package/.claude/agents/testing/production-validator.md +1 -1
  5. package/.claude/agents/testing/testing-tool-evaluator.md +1 -1
  6. package/.claude/commands/github/pr-manager.md +1 -1
  7. package/.claude/helpers/pick-rank.cjs +34 -4
  8. package/.claude/skills/monolean-audit/SKILL.md +1 -1
  9. package/README.md +1 -1
  10. package/dist/src/commands/cleanup-data.d.ts +30 -0
  11. package/dist/src/commands/cleanup-data.d.ts.map +1 -0
  12. package/dist/src/commands/cleanup-data.js +138 -0
  13. package/dist/src/commands/cleanup-data.js.map +1 -0
  14. package/dist/src/commands/cleanup-scratch.d.ts +43 -0
  15. package/dist/src/commands/cleanup-scratch.d.ts.map +1 -0
  16. package/dist/src/commands/cleanup-scratch.js +125 -0
  17. package/dist/src/commands/cleanup-scratch.js.map +1 -0
  18. package/dist/src/commands/cleanup.d.ts +2 -39
  19. package/dist/src/commands/cleanup.d.ts.map +1 -1
  20. package/dist/src/commands/cleanup.js +5 -247
  21. package/dist/src/commands/cleanup.js.map +1 -1
  22. package/dist/src/commands/doctor-gitignore-checks.d.ts +10 -0
  23. package/dist/src/commands/doctor-gitignore-checks.d.ts.map +1 -0
  24. package/dist/src/commands/doctor-gitignore-checks.js +141 -0
  25. package/dist/src/commands/doctor-gitignore-checks.js.map +1 -0
  26. package/dist/src/commands/doctor-helpers-checks.d.ts +10 -0
  27. package/dist/src/commands/doctor-helpers-checks.d.ts.map +1 -0
  28. package/dist/src/commands/doctor-helpers-checks.js +292 -0
  29. package/dist/src/commands/doctor-helpers-checks.js.map +1 -0
  30. package/dist/src/commands/doctor-memory-checks.d.ts +47 -0
  31. package/dist/src/commands/doctor-memory-checks.d.ts.map +1 -0
  32. package/dist/src/commands/doctor-memory-checks.js +298 -0
  33. package/dist/src/commands/doctor-memory-checks.js.map +1 -0
  34. package/dist/src/commands/doctor-monograph-checks.d.ts +9 -0
  35. package/dist/src/commands/doctor-monograph-checks.d.ts.map +1 -0
  36. package/dist/src/commands/doctor-monograph-checks.js +331 -0
  37. package/dist/src/commands/doctor-monograph-checks.js.map +1 -0
  38. package/dist/src/commands/doctor-project-checks.d.ts +7 -66
  39. package/dist/src/commands/doctor-project-checks.d.ts.map +1 -1
  40. package/dist/src/commands/doctor-project-checks.js +10 -1331
  41. package/dist/src/commands/doctor-project-checks.js.map +1 -1
  42. package/dist/src/commands/doctor-routing-checks.d.ts +10 -0
  43. package/dist/src/commands/doctor-routing-checks.d.ts.map +1 -0
  44. package/dist/src/commands/doctor-routing-checks.js +194 -0
  45. package/dist/src/commands/doctor-routing-checks.js.map +1 -0
  46. package/dist/src/commands/doctor-worker-checks.d.ts +17 -0
  47. package/dist/src/commands/doctor-worker-checks.d.ts.map +1 -0
  48. package/dist/src/commands/doctor-worker-checks.js +122 -0
  49. package/dist/src/commands/doctor-worker-checks.js.map +1 -0
  50. package/dist/src/commands/hooks-routing-commands.js +1 -1
  51. package/dist/src/commands/hooks-routing-commands.js.map +1 -1
  52. package/dist/src/commands/init.d.ts.map +1 -1
  53. package/dist/src/commands/init.js +6 -15
  54. package/dist/src/commands/init.js.map +1 -1
  55. package/dist/src/commands/org-control.d.ts +117 -0
  56. package/dist/src/commands/org-control.d.ts.map +1 -0
  57. package/dist/src/commands/org-control.js +274 -0
  58. package/dist/src/commands/org-control.js.map +1 -0
  59. package/dist/src/commands/org-lifecycle.d.ts +7 -0
  60. package/dist/src/commands/org-lifecycle.d.ts.map +1 -0
  61. package/dist/src/commands/org-lifecycle.js +298 -0
  62. package/dist/src/commands/org-lifecycle.js.map +1 -0
  63. package/dist/src/commands/org-manage.d.ts +7 -0
  64. package/dist/src/commands/org-manage.d.ts.map +1 -0
  65. package/dist/src/commands/org-manage.js +357 -0
  66. package/dist/src/commands/org-manage.js.map +1 -0
  67. package/dist/src/commands/org-memory-command.d.ts +3 -0
  68. package/dist/src/commands/org-memory-command.d.ts.map +1 -0
  69. package/dist/src/commands/org-memory-command.js +178 -0
  70. package/dist/src/commands/org-memory-command.js.map +1 -0
  71. package/dist/src/commands/org-observe-approvals.d.ts +8 -0
  72. package/dist/src/commands/org-observe-approvals.d.ts.map +1 -0
  73. package/dist/src/commands/org-observe-approvals.js +211 -0
  74. package/dist/src/commands/org-observe-approvals.js.map +1 -0
  75. package/dist/src/commands/org-observe-checkpoint.d.ts +26 -0
  76. package/dist/src/commands/org-observe-checkpoint.d.ts.map +1 -0
  77. package/dist/src/commands/org-observe-checkpoint.js +180 -0
  78. package/dist/src/commands/org-observe-checkpoint.js.map +1 -0
  79. package/dist/src/commands/org-observe-config.d.ts +8 -0
  80. package/dist/src/commands/org-observe-config.d.ts.map +1 -0
  81. package/dist/src/commands/org-observe-config.js +160 -0
  82. package/dist/src/commands/org-observe-config.js.map +1 -0
  83. package/dist/src/commands/org-observe-gates.d.ts +4 -0
  84. package/dist/src/commands/org-observe-gates.d.ts.map +1 -0
  85. package/dist/src/commands/org-observe-gates.js +182 -0
  86. package/dist/src/commands/org-observe-gates.js.map +1 -0
  87. package/dist/src/commands/org-observe-inbox.d.ts +18 -0
  88. package/dist/src/commands/org-observe-inbox.d.ts.map +1 -0
  89. package/dist/src/commands/org-observe-inbox.js +154 -0
  90. package/dist/src/commands/org-observe-inbox.js.map +1 -0
  91. package/dist/src/commands/org-observe-logs.d.ts +31 -0
  92. package/dist/src/commands/org-observe-logs.d.ts.map +1 -0
  93. package/dist/src/commands/org-observe-logs.js +272 -0
  94. package/dist/src/commands/org-observe-logs.js.map +1 -0
  95. package/dist/src/commands/org-observe-questions.d.ts +8 -0
  96. package/dist/src/commands/org-observe-questions.d.ts.map +1 -0
  97. package/dist/src/commands/org-observe-questions.js +201 -0
  98. package/dist/src/commands/org-observe-questions.js.map +1 -0
  99. package/dist/src/commands/org-observe-report.d.ts +8 -0
  100. package/dist/src/commands/org-observe-report.d.ts.map +1 -0
  101. package/dist/src/commands/org-observe-report.js +366 -0
  102. package/dist/src/commands/org-observe-report.js.map +1 -0
  103. package/dist/src/commands/org-observe-shared.d.ts +20 -0
  104. package/dist/src/commands/org-observe-shared.d.ts.map +1 -0
  105. package/dist/src/commands/org-observe-shared.js +55 -0
  106. package/dist/src/commands/org-observe-shared.js.map +1 -0
  107. package/dist/src/commands/org-observe.d.ts +9 -101
  108. package/dist/src/commands/org-observe.d.ts.map +1 -1
  109. package/dist/src/commands/org-observe.js +12 -1675
  110. package/dist/src/commands/org-observe.js.map +1 -1
  111. package/dist/src/commands/org-poll.d.ts +57 -0
  112. package/dist/src/commands/org-poll.d.ts.map +1 -0
  113. package/dist/src/commands/org-poll.js +194 -0
  114. package/dist/src/commands/org-poll.js.map +1 -0
  115. package/dist/src/commands/org-run.d.ts +3 -0
  116. package/dist/src/commands/org-run.d.ts.map +1 -0
  117. package/dist/src/commands/org-run.js +449 -0
  118. package/dist/src/commands/org-run.js.map +1 -0
  119. package/dist/src/commands/org-serve.d.ts +19 -0
  120. package/dist/src/commands/org-serve.d.ts.map +1 -0
  121. package/dist/src/commands/org-serve.js +395 -0
  122. package/dist/src/commands/org-serve.js.map +1 -0
  123. package/dist/src/commands/org-subcommands-config.d.ts +8 -0
  124. package/dist/src/commands/org-subcommands-config.d.ts.map +1 -0
  125. package/dist/src/commands/org-subcommands-config.js +93 -0
  126. package/dist/src/commands/org-subcommands-config.js.map +1 -0
  127. package/dist/src/commands/org-subcommands-hil.d.ts +11 -0
  128. package/dist/src/commands/org-subcommands-hil.d.ts.map +1 -0
  129. package/dist/src/commands/org-subcommands-hil.js +216 -0
  130. package/dist/src/commands/org-subcommands-hil.js.map +1 -0
  131. package/dist/src/commands/org-subcommands-observe.d.ts +12 -0
  132. package/dist/src/commands/org-subcommands-observe.d.ts.map +1 -0
  133. package/dist/src/commands/org-subcommands-observe.js +249 -0
  134. package/dist/src/commands/org-subcommands-observe.js.map +1 -0
  135. package/dist/src/commands/org-subcommands-runtime.d.ts +12 -0
  136. package/dist/src/commands/org-subcommands-runtime.d.ts.map +1 -0
  137. package/dist/src/commands/org-subcommands-runtime.js +163 -0
  138. package/dist/src/commands/org-subcommands-runtime.js.map +1 -0
  139. package/dist/src/commands/org.d.ts +3 -151
  140. package/dist/src/commands/org.d.ts.map +1 -1
  141. package/dist/src/commands/org.js +43 -2735
  142. package/dist/src/commands/org.js.map +1 -1
  143. package/dist/src/index.js +2 -2
  144. package/dist/src/index.js.map +1 -1
  145. package/dist/src/init/never-commit.d.ts +3 -3
  146. package/dist/src/init/types.d.ts +1 -1
  147. package/dist/src/init/types.js +1 -1
  148. package/dist/src/knowledge/document-store.js +1 -1
  149. package/dist/src/knowledge/document-store.js.map +1 -1
  150. package/dist/src/mcp-tools/hooks-edit-command.d.ts +10 -0
  151. package/dist/src/mcp-tools/hooks-edit-command.d.ts.map +1 -0
  152. package/dist/src/mcp-tools/hooks-edit-command.js +247 -0
  153. package/dist/src/mcp-tools/hooks-edit-command.js.map +1 -0
  154. package/dist/src/mcp-tools/hooks-learning.d.ts +9 -0
  155. package/dist/src/mcp-tools/hooks-learning.d.ts.map +1 -0
  156. package/dist/src/mcp-tools/hooks-learning.js +408 -0
  157. package/dist/src/mcp-tools/hooks-learning.js.map +1 -0
  158. package/dist/src/mcp-tools/hooks-metrics-list.d.ts +8 -0
  159. package/dist/src/mcp-tools/hooks-metrics-list.d.ts.map +1 -0
  160. package/dist/src/mcp-tools/hooks-metrics-list.js +205 -0
  161. package/dist/src/mcp-tools/hooks-metrics-list.js.map +1 -0
  162. package/dist/src/mcp-tools/hooks-route.d.ts +12 -0
  163. package/dist/src/mcp-tools/hooks-route.d.ts.map +1 -0
  164. package/dist/src/mcp-tools/hooks-route.js +251 -0
  165. package/dist/src/mcp-tools/hooks-route.js.map +1 -0
  166. package/dist/src/mcp-tools/hooks-routing.d.ts +6 -27
  167. package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -1
  168. package/dist/src/mcp-tools/hooks-routing.js +6 -1727
  169. package/dist/src/mcp-tools/hooks-routing.js.map +1 -1
  170. package/dist/src/mcp-tools/hooks-session.d.ts +9 -0
  171. package/dist/src/mcp-tools/hooks-session.d.ts.map +1 -0
  172. package/dist/src/mcp-tools/hooks-session.js +243 -0
  173. package/dist/src/mcp-tools/hooks-session.js.map +1 -0
  174. package/dist/src/mcp-tools/hooks-task.d.ts +17 -0
  175. package/dist/src/mcp-tools/hooks-task.d.ts.map +1 -0
  176. package/dist/src/mcp-tools/hooks-task.js +427 -0
  177. package/dist/src/mcp-tools/hooks-task.js.map +1 -0
  178. package/dist/src/mcp-tools/hooks-tools.d.ts +2 -1
  179. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  180. package/dist/src/mcp-tools/hooks-tools.js +2 -1
  181. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  182. package/dist/src/mcp-tools/memory-tools.js +1 -1
  183. package/dist/src/mcp-tools/memory-tools.js.map +1 -1
  184. package/dist/src/memory/bm25-index.d.ts +2 -2
  185. package/dist/src/memory/bm25-index.js +2 -2
  186. package/dist/src/memory/embedding-operations.js +2 -2
  187. package/dist/src/memory/embedding-operations.js.map +1 -1
  188. package/dist/src/memory/entity-name-key.d.ts +1 -1
  189. package/dist/src/memory/entity-name-key.js +1 -1
  190. package/dist/src/memory/hnsw-operations.d.ts +1 -1
  191. package/dist/src/memory/hnsw-operations.js +1 -1
  192. package/dist/src/memory/memory-bridge-backend.d.ts +43 -0
  193. package/dist/src/memory/memory-bridge-backend.d.ts.map +1 -0
  194. package/dist/src/memory/memory-bridge-backend.js +363 -0
  195. package/dist/src/memory/memory-bridge-backend.js.map +1 -0
  196. package/dist/src/memory/memory-bridge-core.d.ts +42 -0
  197. package/dist/src/memory/memory-bridge-core.d.ts.map +1 -0
  198. package/dist/src/memory/memory-bridge-core.js +126 -0
  199. package/dist/src/memory/memory-bridge-core.js.map +1 -0
  200. package/dist/src/memory/memory-bridge-entries.d.ts +131 -0
  201. package/dist/src/memory/memory-bridge-entries.d.ts.map +1 -0
  202. package/dist/src/memory/memory-bridge-entries.js +227 -0
  203. package/dist/src/memory/memory-bridge-entries.js.map +1 -0
  204. package/dist/src/memory/memory-bridge-feedback.d.ts +60 -0
  205. package/dist/src/memory/memory-bridge-feedback.d.ts.map +1 -0
  206. package/dist/src/memory/memory-bridge-feedback.js +118 -0
  207. package/dist/src/memory/memory-bridge-feedback.js.map +1 -0
  208. package/dist/src/memory/memory-bridge-paths.d.ts +123 -0
  209. package/dist/src/memory/memory-bridge-paths.d.ts.map +1 -0
  210. package/dist/src/memory/memory-bridge-paths.js +335 -0
  211. package/dist/src/memory/memory-bridge-paths.js.map +1 -0
  212. package/dist/src/memory/memory-bridge-search.d.ts +48 -0
  213. package/dist/src/memory/memory-bridge-search.d.ts.map +1 -0
  214. package/dist/src/memory/memory-bridge-search.js +383 -0
  215. package/dist/src/memory/memory-bridge-search.js.map +1 -0
  216. package/dist/src/memory/memory-bridge-sessions.d.ts +38 -0
  217. package/dist/src/memory/memory-bridge-sessions.d.ts.map +1 -0
  218. package/dist/src/memory/memory-bridge-sessions.js +109 -0
  219. package/dist/src/memory/memory-bridge-sessions.js.map +1 -0
  220. package/dist/src/memory/memory-bridge-store.d.ts +58 -0
  221. package/dist/src/memory/memory-bridge-store.d.ts.map +1 -0
  222. package/dist/src/memory/memory-bridge-store.js +201 -0
  223. package/dist/src/memory/memory-bridge-store.js.map +1 -0
  224. package/dist/src/memory/memory-bridge.d.ts +10 -438
  225. package/dist/src/memory/memory-bridge.d.ts.map +1 -1
  226. package/dist/src/memory/memory-bridge.js +14 -1787
  227. package/dist/src/memory/memory-bridge.js.map +1 -1
  228. package/dist/src/memory/memory-kg-claims.d.ts +52 -0
  229. package/dist/src/memory/memory-kg-claims.d.ts.map +1 -0
  230. package/dist/src/memory/memory-kg-claims.js +99 -0
  231. package/dist/src/memory/memory-kg-claims.js.map +1 -0
  232. package/dist/src/memory/memory-kg-index.d.ts +86 -0
  233. package/dist/src/memory/memory-kg-index.d.ts.map +1 -0
  234. package/dist/src/memory/memory-kg-index.js +256 -0
  235. package/dist/src/memory/memory-kg-index.js.map +1 -0
  236. package/dist/src/memory/memory-kg-ingest.d.ts +44 -0
  237. package/dist/src/memory/memory-kg-ingest.d.ts.map +1 -0
  238. package/dist/src/memory/memory-kg-ingest.js +361 -0
  239. package/dist/src/memory/memory-kg-ingest.js.map +1 -0
  240. package/dist/src/memory/memory-kg-model.d.ts +168 -0
  241. package/dist/src/memory/memory-kg-model.d.ts.map +1 -0
  242. package/dist/src/memory/memory-kg-model.js +158 -0
  243. package/dist/src/memory/memory-kg-model.js.map +1 -0
  244. package/dist/src/memory/memory-kg-names.d.ts +64 -0
  245. package/dist/src/memory/memory-kg-names.d.ts.map +1 -0
  246. package/dist/src/memory/memory-kg-names.js +187 -0
  247. package/dist/src/memory/memory-kg-names.js.map +1 -0
  248. package/dist/src/memory/memory-kg-promote.d.ts +79 -0
  249. package/dist/src/memory/memory-kg-promote.d.ts.map +1 -0
  250. package/dist/src/memory/memory-kg-promote.js +248 -0
  251. package/dist/src/memory/memory-kg-promote.js.map +1 -0
  252. package/dist/src/memory/memory-kg-rebuild.d.ts +77 -0
  253. package/dist/src/memory/memory-kg-rebuild.d.ts.map +1 -0
  254. package/dist/src/memory/memory-kg-rebuild.js +299 -0
  255. package/dist/src/memory/memory-kg-rebuild.js.map +1 -0
  256. package/dist/src/memory/memory-kg-rollback.d.ts +47 -0
  257. package/dist/src/memory/memory-kg-rollback.d.ts.map +1 -0
  258. package/dist/src/memory/memory-kg-rollback.js +193 -0
  259. package/dist/src/memory/memory-kg-rollback.js.map +1 -0
  260. package/dist/src/memory/memory-kg-rules.d.ts +64 -0
  261. package/dist/src/memory/memory-kg-rules.d.ts.map +1 -0
  262. package/dist/src/memory/memory-kg-rules.js +251 -0
  263. package/dist/src/memory/memory-kg-rules.js.map +1 -0
  264. package/dist/src/memory/memory-kg-scan.d.ts +118 -0
  265. package/dist/src/memory/memory-kg-scan.d.ts.map +1 -0
  266. package/dist/src/memory/memory-kg-scan.js +209 -0
  267. package/dist/src/memory/memory-kg-scan.js.map +1 -0
  268. package/dist/src/memory/memory-kg-search.d.ts +80 -0
  269. package/dist/src/memory/memory-kg-search.d.ts.map +1 -0
  270. package/dist/src/memory/memory-kg-search.js +239 -0
  271. package/dist/src/memory/memory-kg-search.js.map +1 -0
  272. package/dist/src/memory/memory-kg.d.ts +19 -547
  273. package/dist/src/memory/memory-kg.d.ts.map +1 -1
  274. package/dist/src/memory/memory-kg.js +10 -2389
  275. package/dist/src/memory/memory-kg.js.map +1 -1
  276. package/dist/src/orgrt/daemon-types.d.ts +196 -0
  277. package/dist/src/orgrt/daemon-types.d.ts.map +1 -0
  278. package/dist/src/orgrt/daemon-types.js +38 -0
  279. package/dist/src/orgrt/daemon-types.js.map +1 -0
  280. package/dist/src/orgrt/daemon.d.ts +70 -300
  281. package/dist/src/orgrt/daemon.d.ts.map +1 -1
  282. package/dist/src/orgrt/daemon.js +41 -2536
  283. package/dist/src/orgrt/daemon.js.map +1 -1
  284. package/dist/src/orgrt/idle-watchdog.d.ts +39 -0
  285. package/dist/src/orgrt/idle-watchdog.d.ts.map +1 -0
  286. package/dist/src/orgrt/idle-watchdog.js +289 -0
  287. package/dist/src/orgrt/idle-watchdog.js.map +1 -0
  288. package/dist/src/orgrt/org-reload.d.ts +7 -0
  289. package/dist/src/orgrt/org-reload.d.ts.map +1 -0
  290. package/dist/src/orgrt/org-reload.js +111 -0
  291. package/dist/src/orgrt/org-reload.js.map +1 -0
  292. package/dist/src/orgrt/org-start-steps.d.ts +21 -0
  293. package/dist/src/orgrt/org-start-steps.d.ts.map +1 -0
  294. package/dist/src/orgrt/org-start-steps.js +305 -0
  295. package/dist/src/orgrt/org-start-steps.js.map +1 -0
  296. package/dist/src/orgrt/org-start.d.ts +7 -0
  297. package/dist/src/orgrt/org-start.d.ts.map +1 -0
  298. package/dist/src/orgrt/org-start.js +435 -0
  299. package/dist/src/orgrt/org-start.js.map +1 -0
  300. package/dist/src/orgrt/org-state-file.d.ts +8 -0
  301. package/dist/src/orgrt/org-state-file.d.ts.map +1 -0
  302. package/dist/src/orgrt/org-state-file.js +116 -0
  303. package/dist/src/orgrt/org-state-file.js.map +1 -0
  304. package/dist/src/orgrt/org-stop.d.ts +6 -0
  305. package/dist/src/orgrt/org-stop.d.ts.map +1 -0
  306. package/dist/src/orgrt/org-stop.js +332 -0
  307. package/dist/src/orgrt/org-stop.js.map +1 -0
  308. package/dist/src/orgrt/org-tools.d.ts +11 -0
  309. package/dist/src/orgrt/org-tools.d.ts.map +1 -0
  310. package/dist/src/orgrt/org-tools.js +305 -0
  311. package/dist/src/orgrt/org-tools.js.map +1 -0
  312. package/dist/src/orgrt/role-incarnation.d.ts +18 -0
  313. package/dist/src/orgrt/role-incarnation.d.ts.map +1 -0
  314. package/dist/src/orgrt/role-incarnation.js +374 -0
  315. package/dist/src/orgrt/role-incarnation.js.map +1 -0
  316. package/dist/src/orgrt/role-respawn.d.ts +7 -0
  317. package/dist/src/orgrt/role-respawn.d.ts.map +1 -0
  318. package/dist/src/orgrt/role-respawn.js +318 -0
  319. package/dist/src/orgrt/role-respawn.js.map +1 -0
  320. package/dist/src/orgrt/role-session-opts.d.ts +389 -0
  321. package/dist/src/orgrt/role-session-opts.d.ts.map +1 -0
  322. package/dist/src/orgrt/role-session-opts.js +289 -0
  323. package/dist/src/orgrt/role-session-opts.js.map +1 -0
  324. package/dist/src/orgrt/runner-resolve.d.ts +43 -0
  325. package/dist/src/orgrt/runner-resolve.d.ts.map +1 -0
  326. package/dist/src/orgrt/runner-resolve.js +77 -0
  327. package/dist/src/orgrt/runner-resolve.js.map +1 -0
  328. package/dist/src/orgrt/session-gate.d.ts +34 -0
  329. package/dist/src/orgrt/session-gate.d.ts.map +1 -0
  330. package/dist/src/orgrt/session-gate.js +74 -0
  331. package/dist/src/orgrt/session-gate.js.map +1 -0
  332. package/dist/src/orgrt/session-prompt.d.ts +31 -0
  333. package/dist/src/orgrt/session-prompt.d.ts.map +1 -0
  334. package/dist/src/orgrt/session-prompt.js +115 -0
  335. package/dist/src/orgrt/session-prompt.js.map +1 -0
  336. package/dist/src/orgrt/session-run.d.ts +18 -0
  337. package/dist/src/orgrt/session-run.d.ts.map +1 -0
  338. package/dist/src/orgrt/session-run.js +429 -0
  339. package/dist/src/orgrt/session-run.js.map +1 -0
  340. package/dist/src/orgrt/session-stream.d.ts +21 -0
  341. package/dist/src/orgrt/session-stream.d.ts.map +1 -0
  342. package/dist/src/orgrt/session-stream.js +173 -0
  343. package/dist/src/orgrt/session-stream.js.map +1 -0
  344. package/dist/src/orgrt/session-types.d.ts +219 -0
  345. package/dist/src/orgrt/session-types.d.ts.map +1 -0
  346. package/dist/src/orgrt/session-types.js +2 -0
  347. package/dist/src/orgrt/session-types.js.map +1 -0
  348. package/dist/src/orgrt/session-usage.d.ts +29 -0
  349. package/dist/src/orgrt/session-usage.d.ts.map +1 -0
  350. package/dist/src/orgrt/session-usage.js +64 -0
  351. package/dist/src/orgrt/session-usage.js.map +1 -0
  352. package/dist/src/orgrt/session.d.ts +5 -281
  353. package/dist/src/orgrt/session.d.ts.map +1 -1
  354. package/dist/src/orgrt/session.js +8 -1117
  355. package/dist/src/orgrt/session.js.map +1 -1
  356. package/dist/src/ui/org-hil.mjs +1 -1
  357. package/dist/src/ui/routes-org-agents.mjs +318 -0
  358. package/dist/src/ui/routes-org-approvals.mjs +133 -0
  359. package/dist/src/ui/routes-org-config.mjs +459 -0
  360. package/dist/src/ui/routes-org-control.mjs +300 -0
  361. package/dist/src/ui/routes-org-files.mjs +172 -0
  362. package/dist/src/ui/routes-org-helpers.mjs +84 -0
  363. package/dist/src/ui/routes-org-knowledge.mjs +262 -0
  364. package/dist/src/ui/routes-org-lifecycle.mjs +224 -0
  365. package/dist/src/ui/routes-org-live.mjs +278 -0
  366. package/dist/src/ui/routes-org-mastermind.mjs +346 -0
  367. package/dist/src/ui/routes-org-planning.mjs +398 -0
  368. package/dist/src/ui/routes-org-runs.mjs +430 -0
  369. package/dist/src/ui/routes-org-status.mjs +342 -0
  370. package/dist/src/ui/routes-org-workflows.mjs +212 -0
  371. package/dist/src/ui/routes-org.mjs +26 -3847
  372. package/dist/src/ui/server.mjs +1 -1
  373. package/dist/src/utils/native-error.d.ts +1 -1
  374. package/dist/src/utils/native-error.js +1 -1
  375. package/dist/src/utils/paths.d.ts +2 -1
  376. package/dist/src/utils/paths.d.ts.map +1 -1
  377. package/dist/src/utils/paths.js +2 -1
  378. package/dist/src/utils/paths.js.map +1 -1
  379. package/dist/tsconfig.tsbuildinfo +1 -1
  380. package/org-skills/adversarial-reviewer/SKILL.md +1 -1
  381. package/org-skills/board-deck-builder/SKILL.md +1 -1
  382. package/org-skills/code-reviewer/SKILL.md +1 -1
  383. package/org-skills/debugging-wizard/SKILL.md +1 -1
  384. package/org-skills/scientific-thinking-literature-review/SKILL.md +1 -1
  385. package/org-skills/scientific-thinking-scholar-evaluation/SKILL.md +1 -1
  386. package/package.json +5 -5
@@ -0,0 +1,459 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { approvalsOrEmpty } from './routes-org-helpers.mjs';
4
+
5
+ // Org dashboard routes: org list, import, create, config and activity.
6
+ // Registered, in order, by handleOrgRoutes in routes-org.mjs.
7
+ export async function handleOrgConfigRoutes(req, res, url, corsOrigin, ctx) {
8
+ // ------------------------------------------------- Org management
9
+ // GET /api/orgs — list all saved org configs
10
+ if (req.method === 'GET' && url === '/api/orgs') {
11
+ try {
12
+ const _orgsQs = new URL(req.url, 'http://localhost').searchParams;
13
+ const _orgsExplicitDir = _orgsQs.get('dir');
14
+ const _orgsServerRoot = path.resolve(_orgsExplicitDir || ctx.projectDir || process.cwd());
15
+ // Collect project dirs to search: explicit dir + known-projects (like sessions API)
16
+ const _orgsProjDirs = new Set([_orgsServerRoot]);
17
+ if (!_orgsExplicitDir) {
18
+ try {
19
+ const _knownOrgsFile = path.join(_orgsServerRoot, 'data', 'known-projects.json');
20
+ if (fs.existsSync(_knownOrgsFile)) {
21
+ JSON.parse(fs.readFileSync(_knownOrgsFile, 'utf8')).forEach((p) =>
22
+ _orgsProjDirs.add(p),
23
+ );
24
+ }
25
+ } catch (_) {}
26
+ }
27
+ const _sidecarSuffixRe =
28
+ /-(approvals|state|activity|goals|routines|projects|members|issues|workspaces|worktrees|environments|plugins|adapters|bootstrap|threads|budgets|project-workspaces|approval-comments|secrets|join-requests|skills)\.json$/;
29
+ const _orgsSeen = new Set();
30
+ const orgs = [];
31
+ for (const _opd of _orgsProjDirs) {
32
+ const orgsDir = path.join(_opd, '.monomind', 'orgs');
33
+ if (!fs.existsSync(orgsDir)) continue;
34
+ const files = fs
35
+ .readdirSync(orgsDir)
36
+ .filter((f) => f.endsWith('.json') && !_sidecarSuffixRe.test(f));
37
+ for (const f of files) {
38
+ try {
39
+ const cfg = JSON.parse(fs.readFileSync(path.join(orgsDir, f), 'utf8'));
40
+ const _lOrgName = cfg.name || '';
41
+ if (!_lOrgName || _orgsSeen.has(_lOrgName)) continue;
42
+ _orgsSeen.add(_lOrgName);
43
+ const _rs = ctx._readRunState(_lOrgName, _opd);
44
+ const _ttl = Math.max((_rs?.checkpointInterval || 600000) * 2, 7200000);
45
+ const running =
46
+ (_rs?.status === 'running' && Date.now() - (_rs?.lastEventAt || 0) < _ttl) ||
47
+ ctx.activeOrgRuns.has(_lOrgName);
48
+ orgs.push({
49
+ name: cfg.name,
50
+ goal: cfg.goal,
51
+ roles: Array.isArray(cfg.roles) ? cfg.roles : [],
52
+ topology: cfg.topology,
53
+ created_at: cfg.created_at,
54
+ running,
55
+ status: cfg.status,
56
+ projectDir: _opd,
57
+ lastEventAt: _rs?.lastEventAt || null,
58
+ loop: cfg.loop
59
+ ? {
60
+ poll_interval_minutes: cfg.loop.poll_interval_minutes,
61
+ last_run: cfg.loop.last_run,
62
+ next_run: cfg.loop.next_run,
63
+ }
64
+ : undefined,
65
+ });
66
+ } catch (_) {}
67
+ }
68
+ }
69
+ res.writeHead(200, {
70
+ 'Content-Type': 'application/json',
71
+ ...(corsOrigin ? { 'Access-Control-Allow-Origin': corsOrigin } : {}),
72
+ });
73
+ res.end(JSON.stringify(orgs));
74
+ } catch (_) {
75
+ res.writeHead(500);
76
+ res.end('[]');
77
+ }
78
+ return true;
79
+ }
80
+
81
+ // POST /api/orgs/:name/import — import an org config by name (orgs.html upload flow)
82
+ if (req.method === 'POST' && /^\/api\/orgs\/[a-z0-9][a-z0-9_-]{0,63}\/import$/i.test(url)) {
83
+ let body = '';
84
+ req.on('data', (c) => {
85
+ body += c;
86
+ if (body.length > 2e6) req.destroy();
87
+ });
88
+ req.on('end', () => {
89
+ try {
90
+ const urlParts = url.split('/');
91
+ const orgName = decodeURIComponent(urlParts[3]);
92
+ if (orgName.length > 64 || !/^[a-z0-9][a-z0-9_-]*$/i.test(orgName)) {
93
+ res.writeHead(400, { 'Content-Type': 'application/json' });
94
+ res.end(JSON.stringify({ error: 'Invalid org name' }));
95
+ return;
96
+ }
97
+ const cfg = JSON.parse(body);
98
+ const _importQs = new URL(req.url, 'http://localhost').searchParams;
99
+ const dir = path.resolve(_importQs.get('dir') || ctx.projectDir || process.cwd());
100
+ const orgsDir = path.join(dir, '.monomind', 'orgs');
101
+ fs.mkdirSync(orgsDir, { recursive: true });
102
+ const destFile = path.join(orgsDir, `${orgName}.json`);
103
+ fs.writeFileSync(destFile, JSON.stringify({ ...cfg, name: orgName }, null, 2), 'utf8');
104
+ res.writeHead(200, {
105
+ 'Content-Type': 'application/json',
106
+ ...(corsOrigin ? { 'Access-Control-Allow-Origin': corsOrigin } : {}),
107
+ });
108
+ res.end(JSON.stringify({ ok: true, name: orgName, file: destFile }));
109
+ } catch (e) {
110
+ res.writeHead(400, { 'Content-Type': 'application/json' });
111
+ res.end(JSON.stringify({ error: e.message }));
112
+ }
113
+ });
114
+ return true;
115
+ }
116
+
117
+ // POST /api/orgs — import / create org from JSON body
118
+ if (req.method === 'POST' && url === '/api/orgs') {
119
+ let body = '';
120
+ req.on('data', (c) => {
121
+ body += c;
122
+ if (body.length > 2e6) req.destroy();
123
+ });
124
+ req.on('end', () => {
125
+ try {
126
+ const cfg = JSON.parse(body);
127
+ const qs = new URL(req.url, 'http://localhost').searchParams;
128
+ const dir = qs.get('dir') || cfg.dir || ctx.projectDir || process.cwd();
129
+ const name = (cfg.name || '')
130
+ .toLowerCase()
131
+ .replace(/[^a-z0-9_-]/g, '-')
132
+ .replace(/^-+|-+$/g, '')
133
+ .slice(0, 64);
134
+ if (!name) {
135
+ res.writeHead(400, { 'Content-Type': 'application/json' });
136
+ res.end(JSON.stringify({ error: 'Invalid org name' }));
137
+ return;
138
+ }
139
+ const orgsDir = path.join(path.resolve(dir), '.monomind', 'orgs');
140
+ fs.mkdirSync(orgsDir, { recursive: true });
141
+ const destFile = path.join(orgsDir, `${name}.json`);
142
+ const cleanCfg = Object.fromEntries(
143
+ Object.entries({ ...cfg, name }).filter(([k]) => !k.startsWith('_')),
144
+ );
145
+ fs.writeFileSync(destFile, JSON.stringify(cleanCfg, null, 2), 'utf8');
146
+ res.writeHead(200, {
147
+ 'Content-Type': 'application/json',
148
+ ...(corsOrigin ? { 'Access-Control-Allow-Origin': corsOrigin } : {}),
149
+ });
150
+ res.end(JSON.stringify({ ok: true, name, file: destFile }));
151
+ } catch (e) {
152
+ res.writeHead(400, { 'Content-Type': 'application/json' });
153
+ res.end(JSON.stringify({ error: e.message }));
154
+ }
155
+ });
156
+ return true;
157
+ }
158
+
159
+ // GET /api/orgs/:name — get specific org config (exact path: /api/orgs/<slug>)
160
+ if (req.method === 'GET' && /^\/api\/orgs\/[a-z0-9][a-z0-9_-]{0,63}$/i.test(url)) {
161
+ try {
162
+ const orgName = decodeURIComponent(url.slice('/api/orgs/'.length));
163
+ if (orgName.length > 64 || !/^[a-z0-9][a-z0-9_-]*$/i.test(orgName)) {
164
+ res.writeHead(400);
165
+ res.end('Invalid org name');
166
+ return true;
167
+ }
168
+ const _orgsOneQs = new URL(req.url, 'http://localhost').searchParams;
169
+ const _orgsOneRoot = path.resolve(_orgsOneQs.get('dir') || ctx.projectDir || process.cwd());
170
+ const _orgsOneProjDir = ctx._resolveOrgProjectDir(orgName, _orgsOneRoot) || _orgsOneRoot;
171
+ const f = path.join(_orgsOneProjDir, '.monomind', 'orgs', `${orgName}.json`);
172
+ if (!fs.existsSync(f)) {
173
+ res.writeHead(404);
174
+ res.end('{"error":"not found"}');
175
+ return true;
176
+ }
177
+ res.writeHead(200, {
178
+ 'Content-Type': 'application/json',
179
+ ...(corsOrigin ? { 'Access-Control-Allow-Origin': corsOrigin } : {}),
180
+ });
181
+ res.end(fs.readFileSync(f, 'utf8'));
182
+ } catch (_) {
183
+ res.writeHead(500);
184
+ res.end('{}');
185
+ }
186
+ return true;
187
+ }
188
+
189
+ // GET /api/org/:name — ORG ROOM: rich org data (config + state + tasks + routines + goals)
190
+ if (req.method === 'GET' && /^\/api\/org\/[a-z0-9][a-z0-9_-]{0,63}$/i.test(url)) {
191
+ try {
192
+ const orgName = decodeURIComponent(url.slice('/api/org/'.length));
193
+ if (orgName.length > 64 || !/^[a-z0-9][a-z0-9_-]*$/i.test(orgName)) {
194
+ res.writeHead(400);
195
+ res.end('Invalid org name');
196
+ return true;
197
+ }
198
+ const _orgQs = new URL(req.url, 'http://localhost').searchParams;
199
+ const _orgServerRoot = path.resolve(_orgQs.get('dir') || ctx.projectDir || process.cwd());
200
+ // Resolve which project dir actually has this org's config
201
+ const d = ctx._resolveOrgProjectDir(orgName, _orgServerRoot) || _orgServerRoot;
202
+ const orgsDir = path.join(d, '.monomind', 'orgs');
203
+
204
+ const readJsonSafe = (f) => {
205
+ try {
206
+ return JSON.parse(fs.readFileSync(f, 'utf8'));
207
+ } catch (_) {
208
+ return null;
209
+ }
210
+ };
211
+
212
+ const configFile = path.join(orgsDir, `${orgName}.json`);
213
+ if (!fs.existsSync(configFile)) {
214
+ res.writeHead(404);
215
+ res.end('{"error":"org not found"}');
216
+ return true;
217
+ }
218
+ const config = readJsonSafe(configFile);
219
+
220
+ const state = readJsonSafe(path.join(orgsDir, `${orgName}-state.json`)) || { agents: {} };
221
+ const goalsData = readJsonSafe(path.join(orgsDir, `${orgName}-goals.json`)) || { goals: [] };
222
+ const routinesData = readJsonSafe(path.join(orgsDir, `${orgName}-routines.json`)) || {
223
+ routines: [],
224
+ };
225
+ const approvalsData = { approvals: approvalsOrEmpty(orgsDir, orgName) };
226
+
227
+ // Check running status: stop file absence AND (in-memory ctx.activeOrgRuns OR state-file agents OR active loop file)
228
+ // Path must match what `org run`'s poll loop and `org serve`'s pollStopfiles()
229
+ // actually watch (.monomind/orgs/<name>/stop) — see the POST .../stop handler below.
230
+ const stopFile = path.join(orgsDir, orgName, 'stop');
231
+ const _loopsDir = path.join(d, '.monomind', 'loops');
232
+ const _loopRunning = (() => {
233
+ try {
234
+ if (!fs.existsSync(_loopsDir)) return false;
235
+ // Get the org's state file mtime to correlate with loop activity
236
+ const orgStateMtime = (() => {
237
+ try {
238
+ return fs.statSync(path.join(orgsDir, `${orgName}-state.json`)).mtimeMs;
239
+ } catch {
240
+ return 0;
241
+ }
242
+ })();
243
+ // Also check org's most recent run file mtime
244
+ const orgRunsDir = path.join(
245
+ ctx._getGitMonomindDir(d) || path.join(d, '.monomind'),
246
+ 'orgs',
247
+ orgName,
248
+ 'runs',
249
+ );
250
+ const orgLastRunMtime = (() => {
251
+ try {
252
+ if (!fs.existsSync(orgRunsDir)) return 0;
253
+ const runFiles = fs
254
+ .readdirSync(orgRunsDir)
255
+ .filter((f) => f.endsWith('.jsonl') && !f.startsWith('._'));
256
+ if (!runFiles.length) return 0;
257
+ return Math.max(
258
+ ...runFiles.map((f) => {
259
+ try {
260
+ return fs.statSync(path.join(orgRunsDir, f)).mtimeMs;
261
+ } catch {
262
+ return 0;
263
+ }
264
+ }),
265
+ );
266
+ } catch {
267
+ return 0;
268
+ }
269
+ })();
270
+ const orgLastActivity = Math.max(orgStateMtime, orgLastRunMtime);
271
+ return fs.readdirSync(_loopsDir).some((f) => {
272
+ if (!f.endsWith('.json') || f.endsWith('.stop')) return false;
273
+ try {
274
+ const lp = JSON.parse(fs.readFileSync(path.join(_loopsDir, f), 'utf8'));
275
+ if (!lp.command?.includes('runorg')) return false;
276
+ if (!['running', 'paused'].includes(lp.status)) return false;
277
+ // Primary match: explicit orgName field (written by runorg command since v1.14.2)
278
+ if (lp.orgName === orgName) return true;
279
+ // Fallback: org name in prompt (early loop files that preserved --org flag)
280
+ if ((lp.prompt || '').includes(orgName)) return true;
281
+ // Heuristic: if loop's lastRunAt is within 3x wait interval of org's last activity
282
+ const waitMs = (lp.wait || 60) * 3 * 1000;
283
+ return (
284
+ orgLastActivity > 0 && Math.abs(orgLastActivity - (lp.lastRunAt || 0)) < waitMs
285
+ );
286
+ } catch {
287
+ return false;
288
+ }
289
+ });
290
+ } catch {
291
+ return false;
292
+ }
293
+ })();
294
+ const _runstateData = ctx._readRunState(orgName, d);
295
+ const _runstateTtl = Math.max((_runstateData?.checkpointInterval || 600000) * 2, 7200000);
296
+ const _runstateAlive =
297
+ _runstateData?.status === 'running' &&
298
+ Date.now() - (_runstateData?.lastEventAt || 0) < _runstateTtl;
299
+ const running =
300
+ !fs.existsSync(stopFile) &&
301
+ (_runstateAlive || ctx.activeOrgRuns.has(orgName) || _loopRunning);
302
+
303
+ // Read real tasks from the task store and group by status column
304
+ const taskStoreData = readJsonSafe(path.join(d, '.monomind', 'tasks', 'store.json'));
305
+ const allTasks = taskStoreData ? Object.values(taskStoreData.tasks || {}) : [];
306
+ const tasks = {
307
+ todo: allTasks
308
+ .filter((t) => t.status === 'pending')
309
+ .map((t) => ({
310
+ id: t.taskId,
311
+ description: t.description,
312
+ status: 'todo',
313
+ ts: t.createdAt,
314
+ })),
315
+ doing: allTasks
316
+ .filter((t) => t.status === 'in_progress')
317
+ .map((t) => ({
318
+ id: t.taskId,
319
+ description: t.description,
320
+ status: 'doing',
321
+ ts: t.startedAt || t.createdAt,
322
+ })),
323
+ done: allTasks
324
+ .filter(
325
+ (t) => t.status === 'completed' || t.status === 'failed' || t.status === 'cancelled',
326
+ )
327
+ .map((t) => ({
328
+ id: t.taskId,
329
+ description: t.description,
330
+ status: t.status,
331
+ ts: t.completedAt || t.createdAt,
332
+ })),
333
+ };
334
+
335
+ const result = {
336
+ config,
337
+ state,
338
+ goals: goalsData.goals,
339
+ routines: routinesData.routines,
340
+ approvals: approvalsData.approvals,
341
+ running,
342
+ tasks,
343
+ runId: _runstateData?.runId || null,
344
+ lastEventAt: _runstateData?.lastEventAt || null,
345
+ agentStates: _runstateData?.agentStates || {},
346
+ };
347
+
348
+ res.writeHead(200, {
349
+ 'Content-Type': 'application/json',
350
+ ...(corsOrigin ? { 'Access-Control-Allow-Origin': corsOrigin } : {}),
351
+ });
352
+ res.end(JSON.stringify(result));
353
+ } catch (_) {
354
+ res.writeHead(500);
355
+ res.end('{}');
356
+ }
357
+ return true;
358
+ }
359
+
360
+ // GET /api/org/:name/activity — recent org events from mastermind-events.jsonl
361
+ if (req.method === 'GET' && /^\/api\/org\/[a-z0-9][a-z0-9_-]{0,63}\/activity$/i.test(url)) {
362
+ try {
363
+ const parts = url.split('/');
364
+ const orgName = decodeURIComponent(parts[3]);
365
+ if (orgName.length > 64 || !/^[a-z0-9][a-z0-9_-]*$/i.test(orgName)) {
366
+ res.writeHead(400);
367
+ res.end('[]');
368
+ return true;
369
+ }
370
+ const _actQs = new URL(req.url, 'http://localhost').searchParams;
371
+ const _actServerRoot = path.resolve(_actQs.get('dir') || ctx.projectDir || process.cwd());
372
+ const d = ctx._resolveOrgProjectDir(orgName, _actServerRoot) || _actServerRoot;
373
+ const orgsDir = path.join(d, '.monomind', 'orgs');
374
+ const readJ = (f) => {
375
+ try {
376
+ return JSON.parse(fs.readFileSync(f, 'utf8'));
377
+ } catch (_) {
378
+ return null;
379
+ }
380
+ };
381
+ const events = [];
382
+
383
+ // 1) Global mastermind events that EXPLICITLY belong to this org (strict — no untagged leak)
384
+ const eventsFile = path.join(d, 'data', 'mastermind-events.jsonl');
385
+ if (fs.existsSync(eventsFile)) {
386
+ const lines = fs.readFileSync(eventsFile, 'utf8').split('\n').filter(Boolean);
387
+ for (const l of lines.slice(-1000)) {
388
+ try {
389
+ const e = JSON.parse(l);
390
+ if (e && e.org === orgName) events.push(e);
391
+ } catch (_) {}
392
+ }
393
+ }
394
+
395
+ // 2) Synthesize an org-scoped timeline from this org's own records (real data, distinct per org)
396
+ const cfg = readJ(path.join(orgsDir, `${orgName}.json`));
397
+ if (cfg) {
398
+ const createdMs = cfg.created_at ? Date.parse(cfg.created_at) : null;
399
+ if (createdMs)
400
+ events.push({
401
+ type: 'org:create',
402
+ ts: createdMs,
403
+ msg: String(cfg.goal || 'Org created').slice(0, 80),
404
+ });
405
+ // Roles are defined atomically at org creation — there is no per-role
406
+ // timestamp in the config, so every role:defined event uses the org's
407
+ // real created_at instead of a fabricated per-index offset.
408
+ (cfg.roles || []).forEach((r) => {
409
+ events.push({
410
+ type: 'role:defined',
411
+ ts: createdMs,
412
+ role: r.title || r.id,
413
+ msg: r.agent_type || '',
414
+ });
415
+ });
416
+ }
417
+ const goals = readJ(path.join(orgsDir, `${orgName}-goals.json`));
418
+ (goals?.goals || []).forEach((g) =>
419
+ events.push({
420
+ type: 'goal',
421
+ ts: Date.parse(g.created_at || g.updated_at || '') || null,
422
+ role: g.status || '',
423
+ msg: String(g.text || g.title || g.goal || '').slice(0, 80),
424
+ }),
425
+ );
426
+ approvalsOrEmpty(orgsDir, orgName).forEach((a) => {
427
+ events.push({
428
+ type: 'approval',
429
+ ts: a.ts,
430
+ role: a.roleId || '',
431
+ msg: `${a.action} — ${a.status}`.slice(0, 80),
432
+ });
433
+ });
434
+ const state = readJ(path.join(orgsDir, `${orgName}-state.json`));
435
+ if (state?.agents) {
436
+ for (const [aid, a] of Object.entries(state.agents)) {
437
+ const raw = a.lastHeartbeat || a.last_seen || a.updated_at || null;
438
+ const ts = typeof raw === 'number' ? raw : raw ? Date.parse(raw) : null;
439
+ events.push({ type: 'org:heartbeat', ts, agent: aid, msg: a.status || '' });
440
+ }
441
+ }
442
+
443
+ const out = events
444
+ .filter((e) => e?.ts)
445
+ .sort((a, b) => b.ts - a.ts)
446
+ .slice(0, 100);
447
+ res.writeHead(200, {
448
+ 'Content-Type': 'application/json',
449
+ ...(corsOrigin ? { 'Access-Control-Allow-Origin': corsOrigin } : {}),
450
+ });
451
+ res.end(JSON.stringify(out));
452
+ } catch (_) {
453
+ res.writeHead(500);
454
+ res.end('[]');
455
+ }
456
+ return true;
457
+ }
458
+ return false;
459
+ }