agent-insight 0.3.0-beta → 0.3.1-beta

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 (665) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +1 -0
  3. package/.next/standalone/.next/build-manifest.json +2 -2
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/routes-manifest.json +6 -0
  6. package/.next/standalone/.next/server/app/(main)/accessconfig/channels/page_client-reference-manifest.js +1 -1
  7. package/.next/standalone/.next/server/app/(main)/accessconfig/health/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/(main)/accessconfig/install/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/(main)/accessconfig/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/(main)/accessconfig/webhooks/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/(main)/agents/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/(main)/dashboard/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/(main)/dataset/[id]/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/.next/server/app/(main)/dataset/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(main)/eval/page.js.nft.json +1 -1
  16. package/.next/standalone/.next/server/app/(main)/eval/page_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/(main)/eval/run/[runId]/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/(main)/eval/trajectory/[taskId]/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/(main)/eval/trajectory/[taskId]/trace/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/(main)/eval/trajectory/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/(main)/evaluation/[id]/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/(main)/fault/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/(main)/memory/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/(main)/metrics/evaluators/[id]/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/(main)/metrics/page_client-reference-manifest.js +1 -1
  26. package/.next/standalone/.next/server/app/(main)/modelconfig/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/(main)/modelconfig/registry/page.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/(main)/modelconfig/registry/page_client-reference-manifest.js +1 -1
  29. package/.next/standalone/.next/server/app/(main)/modelconfig/web-search/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/(main)/optapi/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/(main)/quality/page.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/(main)/quality/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/(main)/security/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/(main)/skill-eval/grayscale/page_client-reference-manifest.js +1 -1
  35. package/.next/standalone/.next/server/app/(main)/skill-eval/page_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/(main)/skill-eval/trigger/[skillName]/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/(main)/skill-generator/page_client-reference-manifest.js +1 -1
  38. package/.next/standalone/.next/server/app/(main)/skill-history/page.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/(main)/skill-history/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/(main)/skill-opt/[name]/[version]/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/(main)/skill-opt/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/(main)/skill-release/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/(main)/skills/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/(main)/skills/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/(main)/trace/page.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/(main)/trace/page_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  48. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  49. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  50. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  51. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  52. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  53. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  54. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  56. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  57. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  58. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  59. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  60. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  61. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  62. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  63. package/.next/standalone/.next/server/app/accessconfig/channels.html +1 -1
  64. package/.next/standalone/.next/server/app/accessconfig/channels.rsc +2 -2
  65. package/.next/standalone/.next/server/app/accessconfig/channels.segments/!KG1haW4p/accessconfig/channels/__PAGE__.segment.rsc +1 -1
  66. package/.next/standalone/.next/server/app/accessconfig/channels.segments/!KG1haW4p/accessconfig/channels.segment.rsc +1 -1
  67. package/.next/standalone/.next/server/app/accessconfig/channels.segments/!KG1haW4p/accessconfig.segment.rsc +1 -1
  68. package/.next/standalone/.next/server/app/accessconfig/channels.segments/!KG1haW4p.segment.rsc +1 -1
  69. package/.next/standalone/.next/server/app/accessconfig/channels.segments/_full.segment.rsc +2 -2
  70. package/.next/standalone/.next/server/app/accessconfig/channels.segments/_head.segment.rsc +1 -1
  71. package/.next/standalone/.next/server/app/accessconfig/channels.segments/_index.segment.rsc +2 -2
  72. package/.next/standalone/.next/server/app/accessconfig/channels.segments/_tree.segment.rsc +2 -2
  73. package/.next/standalone/.next/server/app/accessconfig/health.html +1 -1
  74. package/.next/standalone/.next/server/app/accessconfig/health.rsc +2 -2
  75. package/.next/standalone/.next/server/app/accessconfig/health.segments/!KG1haW4p/accessconfig/health/__PAGE__.segment.rsc +1 -1
  76. package/.next/standalone/.next/server/app/accessconfig/health.segments/!KG1haW4p/accessconfig/health.segment.rsc +1 -1
  77. package/.next/standalone/.next/server/app/accessconfig/health.segments/!KG1haW4p/accessconfig.segment.rsc +1 -1
  78. package/.next/standalone/.next/server/app/accessconfig/health.segments/!KG1haW4p.segment.rsc +1 -1
  79. package/.next/standalone/.next/server/app/accessconfig/health.segments/_full.segment.rsc +2 -2
  80. package/.next/standalone/.next/server/app/accessconfig/health.segments/_head.segment.rsc +1 -1
  81. package/.next/standalone/.next/server/app/accessconfig/health.segments/_index.segment.rsc +2 -2
  82. package/.next/standalone/.next/server/app/accessconfig/health.segments/_tree.segment.rsc +2 -2
  83. package/.next/standalone/.next/server/app/accessconfig/install.html +1 -1
  84. package/.next/standalone/.next/server/app/accessconfig/install.rsc +3 -3
  85. package/.next/standalone/.next/server/app/accessconfig/install.segments/!KG1haW4p/accessconfig/install/__PAGE__.segment.rsc +2 -2
  86. package/.next/standalone/.next/server/app/accessconfig/install.segments/!KG1haW4p/accessconfig/install.segment.rsc +1 -1
  87. package/.next/standalone/.next/server/app/accessconfig/install.segments/!KG1haW4p/accessconfig.segment.rsc +1 -1
  88. package/.next/standalone/.next/server/app/accessconfig/install.segments/!KG1haW4p.segment.rsc +1 -1
  89. package/.next/standalone/.next/server/app/accessconfig/install.segments/_full.segment.rsc +3 -3
  90. package/.next/standalone/.next/server/app/accessconfig/install.segments/_head.segment.rsc +1 -1
  91. package/.next/standalone/.next/server/app/accessconfig/install.segments/_index.segment.rsc +2 -2
  92. package/.next/standalone/.next/server/app/accessconfig/install.segments/_tree.segment.rsc +2 -2
  93. package/.next/standalone/.next/server/app/accessconfig/webhooks.html +1 -1
  94. package/.next/standalone/.next/server/app/accessconfig/webhooks.rsc +2 -2
  95. package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/!KG1haW4p/accessconfig/webhooks/__PAGE__.segment.rsc +1 -1
  96. package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/!KG1haW4p/accessconfig/webhooks.segment.rsc +1 -1
  97. package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/!KG1haW4p/accessconfig.segment.rsc +1 -1
  98. package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/!KG1haW4p.segment.rsc +1 -1
  99. package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/_full.segment.rsc +2 -2
  100. package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/_head.segment.rsc +1 -1
  101. package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/_index.segment.rsc +2 -2
  102. package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/_tree.segment.rsc +2 -2
  103. package/.next/standalone/.next/server/app/accessconfig.html +1 -1
  104. package/.next/standalone/.next/server/app/accessconfig.rsc +2 -2
  105. package/.next/standalone/.next/server/app/accessconfig.segments/!KG1haW4p/accessconfig/__PAGE__.segment.rsc +1 -1
  106. package/.next/standalone/.next/server/app/accessconfig.segments/!KG1haW4p/accessconfig.segment.rsc +1 -1
  107. package/.next/standalone/.next/server/app/accessconfig.segments/!KG1haW4p.segment.rsc +1 -1
  108. package/.next/standalone/.next/server/app/accessconfig.segments/_full.segment.rsc +2 -2
  109. package/.next/standalone/.next/server/app/accessconfig.segments/_head.segment.rsc +1 -1
  110. package/.next/standalone/.next/server/app/accessconfig.segments/_index.segment.rsc +2 -2
  111. package/.next/standalone/.next/server/app/accessconfig.segments/_tree.segment.rsc +2 -2
  112. package/.next/standalone/.next/server/app/agents.html +1 -1
  113. package/.next/standalone/.next/server/app/agents.rsc +3 -3
  114. package/.next/standalone/.next/server/app/agents.segments/!KG1haW4p/agents/__PAGE__.segment.rsc +2 -2
  115. package/.next/standalone/.next/server/app/agents.segments/!KG1haW4p/agents.segment.rsc +1 -1
  116. package/.next/standalone/.next/server/app/agents.segments/!KG1haW4p.segment.rsc +1 -1
  117. package/.next/standalone/.next/server/app/agents.segments/_full.segment.rsc +3 -3
  118. package/.next/standalone/.next/server/app/agents.segments/_head.segment.rsc +1 -1
  119. package/.next/standalone/.next/server/app/agents.segments/_index.segment.rsc +2 -2
  120. package/.next/standalone/.next/server/app/agents.segments/_tree.segment.rsc +2 -2
  121. package/.next/standalone/.next/server/app/api/agent/run/route.js +5 -5
  122. package/.next/standalone/.next/server/app/api/agent/run/route.js.nft.json +1 -1
  123. package/.next/standalone/.next/server/app/api/agent/stream/route.js +3 -3
  124. package/.next/standalone/.next/server/app/api/agent/stream/route.js.nft.json +1 -1
  125. package/.next/standalone/.next/server/app/api/debug/batch-tasks/[taskId]/route.js +5 -5
  126. package/.next/standalone/.next/server/app/api/debug/batch-tasks/[taskId]/route.js.nft.json +1 -1
  127. package/.next/standalone/.next/server/app/api/debug/execute/route.js +5 -5
  128. package/.next/standalone/.next/server/app/api/debug/execute/route.js.nft.json +1 -1
  129. package/.next/standalone/.next/server/app/api/debug/grayscale-tasks/[taskId]/route.js +11 -11
  130. package/.next/standalone/.next/server/app/api/debug/grayscale-tasks/[taskId]/route.js.nft.json +1 -1
  131. package/.next/standalone/.next/server/app/api/eval/config/backfill-routing/route.js +4 -4
  132. package/.next/standalone/.next/server/app/api/eval/config/backfill-routing/route.js.nft.json +1 -1
  133. package/.next/standalone/.next/server/app/api/eval/config/route.js +6 -6
  134. package/.next/standalone/.next/server/app/api/eval/config/route.js.nft.json +1 -1
  135. package/.next/standalone/.next/server/app/api/eval/rejudge/route.js +6 -6
  136. package/.next/standalone/.next/server/app/api/eval/rejudge/route.js.nft.json +1 -1
  137. package/.next/standalone/.next/server/app/api/eval/terminate-all/route.js +6 -6
  138. package/.next/standalone/.next/server/app/api/eval/terminate-all/route.js.nft.json +1 -1
  139. package/.next/standalone/.next/server/app/api/eval/trajectory/run/route.js +9 -9
  140. package/.next/standalone/.next/server/app/api/eval/trajectory/run/route.js.nft.json +1 -1
  141. package/.next/standalone/.next/server/app/api/evaluation/[id]/route.js +2 -2
  142. package/.next/standalone/.next/server/app/api/fault/diagnosis/stream/route.js +5 -5
  143. package/.next/standalone/.next/server/app/api/fault/diagnosis/stream/route.js.nft.json +1 -1
  144. package/.next/standalone/.next/server/app/api/ingest/opencode/session-complete/route.js +5 -5
  145. package/.next/standalone/.next/server/app/api/ingest/opencode/session-complete/route.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/app/api/ingest/otel/v1/traces/route.js +1 -1
  147. package/.next/standalone/.next/server/app/api/ingest/otel/v1/traces/route.js.nft.json +1 -1
  148. package/.next/standalone/.next/server/app/api/ingest/proxy/[taskId]/end/route.js +5 -5
  149. package/.next/standalone/.next/server/app/api/ingest/proxy/[taskId]/end/route.js.nft.json +1 -1
  150. package/.next/standalone/.next/server/app/api/ingest/setup/hermes-plugin/route/app-paths-manifest.json +3 -0
  151. package/.next/standalone/.next/server/app/api/ingest/setup/hermes-plugin/route/build-manifest.json +11 -0
  152. package/.next/standalone/.next/server/app/api/ingest/setup/hermes-plugin/route/server-reference-manifest.json +4 -0
  153. package/.next/standalone/.next/server/app/api/ingest/setup/hermes-plugin/route.js +7 -0
  154. package/.next/standalone/.next/server/app/api/ingest/setup/hermes-plugin/route.js.map +5 -0
  155. package/.next/standalone/.next/server/app/api/ingest/setup/hermes-plugin/route.js.nft.json +1 -0
  156. package/.next/standalone/.next/server/app/api/ingest/setup/hermes-plugin/route_client-reference-manifest.js +2 -0
  157. package/.next/standalone/.next/server/app/api/ingest/upload/route.js +7 -7
  158. package/.next/standalone/.next/server/app/api/ingest/upload/route.js.nft.json +1 -1
  159. package/.next/standalone/.next/server/app/api/observe/data/route.js +4 -4
  160. package/.next/standalone/.next/server/app/api/observe/data/route.js.nft.json +1 -1
  161. package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/agent-debug/route.js +5 -5
  162. package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/agent-debug/route.js.nft.json +1 -1
  163. package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/agent-debug/skills-analysis/route.js +9 -9
  164. package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/agent-debug/skills-analysis/route.js.nft.json +1 -1
  165. package/.next/standalone/.next/server/app/api/observe/task-stats/route.js +3 -3
  166. package/.next/standalone/.next/server/app/api/observe/task-stats/route.js.nft.json +1 -1
  167. package/.next/standalone/.next/server/app/api/quality/agents/route.js +4 -4
  168. package/.next/standalone/.next/server/app/api/quality/agents/route.js.nft.json +1 -1
  169. package/.next/standalone/.next/server/app/api/quality/executions/route.js +4 -4
  170. package/.next/standalone/.next/server/app/api/quality/executions/route.js.nft.json +1 -1
  171. package/.next/standalone/.next/server/app/api/skill-eval/trigger/[skillName]/draft/route.js.nft.json +1 -1
  172. package/.next/standalone/.next/server/app/api/skill-eval/trigger/[skillName]/run/route.js +1 -1
  173. package/.next/standalone/.next/server/app/api/skill-eval/trigger/[skillName]/run/route.js.nft.json +1 -1
  174. package/.next/standalone/.next/server/app/api/skill-generator/attachments/route.js.nft.json +1 -1
  175. package/.next/standalone/.next/server/app/api/skill-generator/chat/route.js +5 -5
  176. package/.next/standalone/.next/server/app/api/skill-generator/chat/route.js.nft.json +1 -1
  177. package/.next/standalone/.next/server/app/api/skill-generator/files/content/route.js +3 -3
  178. package/.next/standalone/.next/server/app/api/skill-generator/files/content/route.js.nft.json +1 -1
  179. package/.next/standalone/.next/server/app/api/skill-generator/files/download/route.js +5 -5
  180. package/.next/standalone/.next/server/app/api/skill-generator/files/download/route.js.nft.json +1 -1
  181. package/.next/standalone/.next/server/app/api/skill-generator/files/info/route.js +3 -3
  182. package/.next/standalone/.next/server/app/api/skill-generator/files/info/route.js.nft.json +1 -1
  183. package/.next/standalone/.next/server/app/api/skill-generator/files/list/route.js +3 -3
  184. package/.next/standalone/.next/server/app/api/skill-generator/files/list/route.js.nft.json +1 -1
  185. package/.next/standalone/.next/server/app/api/skill-opt/chat/route.js +4 -4
  186. package/.next/standalone/.next/server/app/api/skill-opt/chat/route.js.nft.json +1 -1
  187. package/.next/standalone/.next/server/app/api/skills/[id]/benchmark-generate/route.js +5 -5
  188. package/.next/standalone/.next/server/app/api/skills/[id]/benchmark-generate/route.js.nft.json +1 -1
  189. package/.next/standalone/.next/server/app/api/skills/[id]/runs/route.js +3 -3
  190. package/.next/standalone/.next/server/app/api/skills/[id]/runs/route.js.nft.json +1 -1
  191. package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/evaluate/route.js +2 -2
  192. package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/evaluation-summary/route.js +2 -2
  193. package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/files/[...path]/route.js.nft.json +1 -1
  194. package/.next/standalone/.next/server/app/api/skills/logs/route.js +4 -4
  195. package/.next/standalone/.next/server/app/api/skills/logs/route.js.nft.json +1 -1
  196. package/.next/standalone/.next/server/app/api/user-evaluators/route.js.nft.json +1 -1
  197. package/.next/standalone/.next/server/app/dashboard.html +1 -1
  198. package/.next/standalone/.next/server/app/dashboard.rsc +3 -3
  199. package/.next/standalone/.next/server/app/dashboard.segments/!KG1haW4p/dashboard/__PAGE__.segment.rsc +2 -2
  200. package/.next/standalone/.next/server/app/dashboard.segments/!KG1haW4p/dashboard.segment.rsc +1 -1
  201. package/.next/standalone/.next/server/app/dashboard.segments/!KG1haW4p.segment.rsc +1 -1
  202. package/.next/standalone/.next/server/app/dashboard.segments/_full.segment.rsc +3 -3
  203. package/.next/standalone/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
  204. package/.next/standalone/.next/server/app/dashboard.segments/_index.segment.rsc +2 -2
  205. package/.next/standalone/.next/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  206. package/.next/standalone/.next/server/app/dataset.html +1 -1
  207. package/.next/standalone/.next/server/app/dataset.rsc +3 -3
  208. package/.next/standalone/.next/server/app/dataset.segments/!KG1haW4p/dataset/__PAGE__.segment.rsc +2 -2
  209. package/.next/standalone/.next/server/app/dataset.segments/!KG1haW4p/dataset.segment.rsc +1 -1
  210. package/.next/standalone/.next/server/app/dataset.segments/!KG1haW4p.segment.rsc +1 -1
  211. package/.next/standalone/.next/server/app/dataset.segments/_full.segment.rsc +3 -3
  212. package/.next/standalone/.next/server/app/dataset.segments/_head.segment.rsc +1 -1
  213. package/.next/standalone/.next/server/app/dataset.segments/_index.segment.rsc +2 -2
  214. package/.next/standalone/.next/server/app/dataset.segments/_tree.segment.rsc +2 -2
  215. package/.next/standalone/.next/server/app/eval/trajectory.html +1 -1
  216. package/.next/standalone/.next/server/app/eval/trajectory.rsc +3 -3
  217. package/.next/standalone/.next/server/app/eval/trajectory.segments/!KG1haW4p/eval/trajectory/__PAGE__.segment.rsc +2 -2
  218. package/.next/standalone/.next/server/app/eval/trajectory.segments/!KG1haW4p/eval/trajectory.segment.rsc +1 -1
  219. package/.next/standalone/.next/server/app/eval/trajectory.segments/!KG1haW4p/eval.segment.rsc +1 -1
  220. package/.next/standalone/.next/server/app/eval/trajectory.segments/!KG1haW4p.segment.rsc +1 -1
  221. package/.next/standalone/.next/server/app/eval/trajectory.segments/_full.segment.rsc +3 -3
  222. package/.next/standalone/.next/server/app/eval/trajectory.segments/_head.segment.rsc +1 -1
  223. package/.next/standalone/.next/server/app/eval/trajectory.segments/_index.segment.rsc +2 -2
  224. package/.next/standalone/.next/server/app/eval/trajectory.segments/_tree.segment.rsc +2 -2
  225. package/.next/standalone/.next/server/app/eval.html +1 -1
  226. package/.next/standalone/.next/server/app/eval.rsc +3 -3
  227. package/.next/standalone/.next/server/app/eval.segments/!KG1haW4p/eval/__PAGE__.segment.rsc +2 -2
  228. package/.next/standalone/.next/server/app/eval.segments/!KG1haW4p/eval.segment.rsc +1 -1
  229. package/.next/standalone/.next/server/app/eval.segments/!KG1haW4p.segment.rsc +1 -1
  230. package/.next/standalone/.next/server/app/eval.segments/_full.segment.rsc +3 -3
  231. package/.next/standalone/.next/server/app/eval.segments/_head.segment.rsc +1 -1
  232. package/.next/standalone/.next/server/app/eval.segments/_index.segment.rsc +2 -2
  233. package/.next/standalone/.next/server/app/eval.segments/_tree.segment.rsc +2 -2
  234. package/.next/standalone/.next/server/app/fault.html +1 -1
  235. package/.next/standalone/.next/server/app/fault.rsc +3 -3
  236. package/.next/standalone/.next/server/app/fault.segments/!KG1haW4p/fault/__PAGE__.segment.rsc +2 -2
  237. package/.next/standalone/.next/server/app/fault.segments/!KG1haW4p/fault.segment.rsc +1 -1
  238. package/.next/standalone/.next/server/app/fault.segments/!KG1haW4p.segment.rsc +1 -1
  239. package/.next/standalone/.next/server/app/fault.segments/_full.segment.rsc +3 -3
  240. package/.next/standalone/.next/server/app/fault.segments/_head.segment.rsc +1 -1
  241. package/.next/standalone/.next/server/app/fault.segments/_index.segment.rsc +2 -2
  242. package/.next/standalone/.next/server/app/fault.segments/_tree.segment.rsc +2 -2
  243. package/.next/standalone/.next/server/app/index.html +1 -1
  244. package/.next/standalone/.next/server/app/index.rsc +2 -2
  245. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  246. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  247. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  248. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  249. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  250. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  251. package/.next/standalone/.next/server/app/login.html +1 -1
  252. package/.next/standalone/.next/server/app/login.rsc +2 -2
  253. package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +2 -2
  254. package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
  255. package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +2 -2
  256. package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  257. package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  258. package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +1 -1
  259. package/.next/standalone/.next/server/app/memory.html +1 -1
  260. package/.next/standalone/.next/server/app/memory.rsc +2 -2
  261. package/.next/standalone/.next/server/app/memory.segments/!KG1haW4p/memory/__PAGE__.segment.rsc +1 -1
  262. package/.next/standalone/.next/server/app/memory.segments/!KG1haW4p/memory.segment.rsc +1 -1
  263. package/.next/standalone/.next/server/app/memory.segments/!KG1haW4p.segment.rsc +1 -1
  264. package/.next/standalone/.next/server/app/memory.segments/_full.segment.rsc +2 -2
  265. package/.next/standalone/.next/server/app/memory.segments/_head.segment.rsc +1 -1
  266. package/.next/standalone/.next/server/app/memory.segments/_index.segment.rsc +2 -2
  267. package/.next/standalone/.next/server/app/memory.segments/_tree.segment.rsc +2 -2
  268. package/.next/standalone/.next/server/app/metrics.html +1 -1
  269. package/.next/standalone/.next/server/app/metrics.rsc +3 -3
  270. package/.next/standalone/.next/server/app/metrics.segments/!KG1haW4p/metrics/__PAGE__.segment.rsc +2 -2
  271. package/.next/standalone/.next/server/app/metrics.segments/!KG1haW4p/metrics.segment.rsc +1 -1
  272. package/.next/standalone/.next/server/app/metrics.segments/!KG1haW4p.segment.rsc +1 -1
  273. package/.next/standalone/.next/server/app/metrics.segments/_full.segment.rsc +3 -3
  274. package/.next/standalone/.next/server/app/metrics.segments/_head.segment.rsc +1 -1
  275. package/.next/standalone/.next/server/app/metrics.segments/_index.segment.rsc +2 -2
  276. package/.next/standalone/.next/server/app/metrics.segments/_tree.segment.rsc +2 -2
  277. package/.next/standalone/.next/server/app/modelconfig/registry.html +1 -1
  278. package/.next/standalone/.next/server/app/modelconfig/registry.rsc +3 -3
  279. package/.next/standalone/.next/server/app/modelconfig/registry.segments/!KG1haW4p/modelconfig/registry/__PAGE__.segment.rsc +2 -2
  280. package/.next/standalone/.next/server/app/modelconfig/registry.segments/!KG1haW4p/modelconfig/registry.segment.rsc +1 -1
  281. package/.next/standalone/.next/server/app/modelconfig/registry.segments/!KG1haW4p/modelconfig.segment.rsc +1 -1
  282. package/.next/standalone/.next/server/app/modelconfig/registry.segments/!KG1haW4p.segment.rsc +1 -1
  283. package/.next/standalone/.next/server/app/modelconfig/registry.segments/_full.segment.rsc +3 -3
  284. package/.next/standalone/.next/server/app/modelconfig/registry.segments/_head.segment.rsc +1 -1
  285. package/.next/standalone/.next/server/app/modelconfig/registry.segments/_index.segment.rsc +2 -2
  286. package/.next/standalone/.next/server/app/modelconfig/registry.segments/_tree.segment.rsc +2 -2
  287. package/.next/standalone/.next/server/app/modelconfig/web-search.html +1 -1
  288. package/.next/standalone/.next/server/app/modelconfig/web-search.rsc +3 -3
  289. package/.next/standalone/.next/server/app/modelconfig/web-search.segments/!KG1haW4p/modelconfig/web-search/__PAGE__.segment.rsc +2 -2
  290. package/.next/standalone/.next/server/app/modelconfig/web-search.segments/!KG1haW4p/modelconfig/web-search.segment.rsc +1 -1
  291. package/.next/standalone/.next/server/app/modelconfig/web-search.segments/!KG1haW4p/modelconfig.segment.rsc +1 -1
  292. package/.next/standalone/.next/server/app/modelconfig/web-search.segments/!KG1haW4p.segment.rsc +1 -1
  293. package/.next/standalone/.next/server/app/modelconfig/web-search.segments/_full.segment.rsc +3 -3
  294. package/.next/standalone/.next/server/app/modelconfig/web-search.segments/_head.segment.rsc +1 -1
  295. package/.next/standalone/.next/server/app/modelconfig/web-search.segments/_index.segment.rsc +2 -2
  296. package/.next/standalone/.next/server/app/modelconfig/web-search.segments/_tree.segment.rsc +2 -2
  297. package/.next/standalone/.next/server/app/modelconfig.html +1 -1
  298. package/.next/standalone/.next/server/app/modelconfig.rsc +2 -2
  299. package/.next/standalone/.next/server/app/modelconfig.segments/!KG1haW4p/modelconfig/__PAGE__.segment.rsc +1 -1
  300. package/.next/standalone/.next/server/app/modelconfig.segments/!KG1haW4p/modelconfig.segment.rsc +1 -1
  301. package/.next/standalone/.next/server/app/modelconfig.segments/!KG1haW4p.segment.rsc +1 -1
  302. package/.next/standalone/.next/server/app/modelconfig.segments/_full.segment.rsc +2 -2
  303. package/.next/standalone/.next/server/app/modelconfig.segments/_head.segment.rsc +1 -1
  304. package/.next/standalone/.next/server/app/modelconfig.segments/_index.segment.rsc +2 -2
  305. package/.next/standalone/.next/server/app/modelconfig.segments/_tree.segment.rsc +2 -2
  306. package/.next/standalone/.next/server/app/optapi.html +1 -1
  307. package/.next/standalone/.next/server/app/optapi.rsc +2 -2
  308. package/.next/standalone/.next/server/app/optapi.segments/!KG1haW4p/optapi/__PAGE__.segment.rsc +1 -1
  309. package/.next/standalone/.next/server/app/optapi.segments/!KG1haW4p/optapi.segment.rsc +1 -1
  310. package/.next/standalone/.next/server/app/optapi.segments/!KG1haW4p.segment.rsc +1 -1
  311. package/.next/standalone/.next/server/app/optapi.segments/_full.segment.rsc +2 -2
  312. package/.next/standalone/.next/server/app/optapi.segments/_head.segment.rsc +1 -1
  313. package/.next/standalone/.next/server/app/optapi.segments/_index.segment.rsc +2 -2
  314. package/.next/standalone/.next/server/app/optapi.segments/_tree.segment.rsc +2 -2
  315. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  316. package/.next/standalone/.next/server/app/quality.html +1 -1
  317. package/.next/standalone/.next/server/app/quality.rsc +3 -3
  318. package/.next/standalone/.next/server/app/quality.segments/!KG1haW4p/quality/__PAGE__.segment.rsc +2 -2
  319. package/.next/standalone/.next/server/app/quality.segments/!KG1haW4p/quality.segment.rsc +1 -1
  320. package/.next/standalone/.next/server/app/quality.segments/!KG1haW4p.segment.rsc +1 -1
  321. package/.next/standalone/.next/server/app/quality.segments/_full.segment.rsc +3 -3
  322. package/.next/standalone/.next/server/app/quality.segments/_head.segment.rsc +1 -1
  323. package/.next/standalone/.next/server/app/quality.segments/_index.segment.rsc +2 -2
  324. package/.next/standalone/.next/server/app/quality.segments/_tree.segment.rsc +2 -2
  325. package/.next/standalone/.next/server/app/security.html +1 -1
  326. package/.next/standalone/.next/server/app/security.rsc +2 -2
  327. package/.next/standalone/.next/server/app/security.segments/!KG1haW4p/security/__PAGE__.segment.rsc +1 -1
  328. package/.next/standalone/.next/server/app/security.segments/!KG1haW4p/security.segment.rsc +1 -1
  329. package/.next/standalone/.next/server/app/security.segments/!KG1haW4p.segment.rsc +1 -1
  330. package/.next/standalone/.next/server/app/security.segments/_full.segment.rsc +2 -2
  331. package/.next/standalone/.next/server/app/security.segments/_head.segment.rsc +1 -1
  332. package/.next/standalone/.next/server/app/security.segments/_index.segment.rsc +2 -2
  333. package/.next/standalone/.next/server/app/security.segments/_tree.segment.rsc +2 -2
  334. package/.next/standalone/.next/server/app/skill-detail/page_client-reference-manifest.js +1 -1
  335. package/.next/standalone/.next/server/app/skill-detail.html +1 -1
  336. package/.next/standalone/.next/server/app/skill-detail.rsc +2 -2
  337. package/.next/standalone/.next/server/app/skill-detail.segments/_full.segment.rsc +2 -2
  338. package/.next/standalone/.next/server/app/skill-detail.segments/_head.segment.rsc +1 -1
  339. package/.next/standalone/.next/server/app/skill-detail.segments/_index.segment.rsc +2 -2
  340. package/.next/standalone/.next/server/app/skill-detail.segments/_tree.segment.rsc +2 -2
  341. package/.next/standalone/.next/server/app/skill-detail.segments/skill-detail/__PAGE__.segment.rsc +1 -1
  342. package/.next/standalone/.next/server/app/skill-detail.segments/skill-detail.segment.rsc +1 -1
  343. package/.next/standalone/.next/server/app/skill-eval/grayscale.html +2 -2
  344. package/.next/standalone/.next/server/app/skill-eval/grayscale.rsc +5 -5
  345. package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/!KG1haW4p/skill-eval/grayscale/__PAGE__.segment.rsc +2 -2
  346. package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/!KG1haW4p/skill-eval/grayscale.segment.rsc +1 -1
  347. package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/!KG1haW4p/skill-eval.segment.rsc +1 -1
  348. package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/!KG1haW4p.segment.rsc +1 -1
  349. package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/_full.segment.rsc +5 -5
  350. package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/_head.segment.rsc +1 -1
  351. package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/_index.segment.rsc +2 -2
  352. package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/_tree.segment.rsc +2 -2
  353. package/.next/standalone/.next/server/app/skill-eval.html +1 -1
  354. package/.next/standalone/.next/server/app/skill-eval.rsc +5 -5
  355. package/.next/standalone/.next/server/app/skill-eval.segments/!KG1haW4p/skill-eval/__PAGE__.segment.rsc +3 -3
  356. package/.next/standalone/.next/server/app/skill-eval.segments/!KG1haW4p/skill-eval.segment.rsc +1 -1
  357. package/.next/standalone/.next/server/app/skill-eval.segments/!KG1haW4p.segment.rsc +1 -1
  358. package/.next/standalone/.next/server/app/skill-eval.segments/_full.segment.rsc +5 -5
  359. package/.next/standalone/.next/server/app/skill-eval.segments/_head.segment.rsc +1 -1
  360. package/.next/standalone/.next/server/app/skill-eval.segments/_index.segment.rsc +2 -2
  361. package/.next/standalone/.next/server/app/skill-eval.segments/_tree.segment.rsc +3 -3
  362. package/.next/standalone/.next/server/app/skill-generator.html +1 -1
  363. package/.next/standalone/.next/server/app/skill-generator.rsc +3 -3
  364. package/.next/standalone/.next/server/app/skill-generator.segments/!KG1haW4p/skill-generator/__PAGE__.segment.rsc +2 -2
  365. package/.next/standalone/.next/server/app/skill-generator.segments/!KG1haW4p/skill-generator.segment.rsc +1 -1
  366. package/.next/standalone/.next/server/app/skill-generator.segments/!KG1haW4p.segment.rsc +1 -1
  367. package/.next/standalone/.next/server/app/skill-generator.segments/_full.segment.rsc +3 -3
  368. package/.next/standalone/.next/server/app/skill-generator.segments/_head.segment.rsc +1 -1
  369. package/.next/standalone/.next/server/app/skill-generator.segments/_index.segment.rsc +2 -2
  370. package/.next/standalone/.next/server/app/skill-generator.segments/_tree.segment.rsc +2 -2
  371. package/.next/standalone/.next/server/app/skill-history.html +1 -1
  372. package/.next/standalone/.next/server/app/skill-history.rsc +3 -3
  373. package/.next/standalone/.next/server/app/skill-history.segments/!KG1haW4p/skill-history/__PAGE__.segment.rsc +2 -2
  374. package/.next/standalone/.next/server/app/skill-history.segments/!KG1haW4p/skill-history.segment.rsc +1 -1
  375. package/.next/standalone/.next/server/app/skill-history.segments/!KG1haW4p.segment.rsc +1 -1
  376. package/.next/standalone/.next/server/app/skill-history.segments/_full.segment.rsc +3 -3
  377. package/.next/standalone/.next/server/app/skill-history.segments/_head.segment.rsc +1 -1
  378. package/.next/standalone/.next/server/app/skill-history.segments/_index.segment.rsc +2 -2
  379. package/.next/standalone/.next/server/app/skill-history.segments/_tree.segment.rsc +2 -2
  380. package/.next/standalone/.next/server/app/skill-opt.html +1 -1
  381. package/.next/standalone/.next/server/app/skill-opt.rsc +3 -3
  382. package/.next/standalone/.next/server/app/skill-opt.segments/!KG1haW4p/skill-opt/__PAGE__.segment.rsc +2 -2
  383. package/.next/standalone/.next/server/app/skill-opt.segments/!KG1haW4p/skill-opt.segment.rsc +1 -1
  384. package/.next/standalone/.next/server/app/skill-opt.segments/!KG1haW4p.segment.rsc +1 -1
  385. package/.next/standalone/.next/server/app/skill-opt.segments/_full.segment.rsc +3 -3
  386. package/.next/standalone/.next/server/app/skill-opt.segments/_head.segment.rsc +1 -1
  387. package/.next/standalone/.next/server/app/skill-opt.segments/_index.segment.rsc +2 -2
  388. package/.next/standalone/.next/server/app/skill-opt.segments/_tree.segment.rsc +2 -2
  389. package/.next/standalone/.next/server/app/skill-release.html +1 -1
  390. package/.next/standalone/.next/server/app/skill-release.rsc +2 -2
  391. package/.next/standalone/.next/server/app/skill-release.segments/!KG1haW4p/skill-release/__PAGE__.segment.rsc +1 -1
  392. package/.next/standalone/.next/server/app/skill-release.segments/!KG1haW4p/skill-release.segment.rsc +1 -1
  393. package/.next/standalone/.next/server/app/skill-release.segments/!KG1haW4p.segment.rsc +1 -1
  394. package/.next/standalone/.next/server/app/skill-release.segments/_full.segment.rsc +2 -2
  395. package/.next/standalone/.next/server/app/skill-release.segments/_head.segment.rsc +1 -1
  396. package/.next/standalone/.next/server/app/skill-release.segments/_index.segment.rsc +2 -2
  397. package/.next/standalone/.next/server/app/skill-release.segments/_tree.segment.rsc +2 -2
  398. package/.next/standalone/.next/server/app/skills.html +1 -1
  399. package/.next/standalone/.next/server/app/skills.rsc +4 -4
  400. package/.next/standalone/.next/server/app/skills.segments/!KG1haW4p/skills/__PAGE__.segment.rsc +3 -3
  401. package/.next/standalone/.next/server/app/skills.segments/!KG1haW4p/skills.segment.rsc +1 -1
  402. package/.next/standalone/.next/server/app/skills.segments/!KG1haW4p.segment.rsc +1 -1
  403. package/.next/standalone/.next/server/app/skills.segments/_full.segment.rsc +4 -4
  404. package/.next/standalone/.next/server/app/skills.segments/_head.segment.rsc +1 -1
  405. package/.next/standalone/.next/server/app/skills.segments/_index.segment.rsc +2 -2
  406. package/.next/standalone/.next/server/app/skills.segments/_tree.segment.rsc +3 -3
  407. package/.next/standalone/.next/server/app/trace.html +1 -1
  408. package/.next/standalone/.next/server/app/trace.rsc +3 -3
  409. package/.next/standalone/.next/server/app/trace.segments/!KG1haW4p/trace/__PAGE__.segment.rsc +2 -2
  410. package/.next/standalone/.next/server/app/trace.segments/!KG1haW4p/trace.segment.rsc +1 -1
  411. package/.next/standalone/.next/server/app/trace.segments/!KG1haW4p.segment.rsc +1 -1
  412. package/.next/standalone/.next/server/app/trace.segments/_full.segment.rsc +3 -3
  413. package/.next/standalone/.next/server/app/trace.segments/_head.segment.rsc +1 -1
  414. package/.next/standalone/.next/server/app/trace.segments/_index.segment.rsc +2 -2
  415. package/.next/standalone/.next/server/app/trace.segments/_tree.segment.rsc +2 -2
  416. package/.next/standalone/.next/server/app-paths-manifest.json +1 -0
  417. package/.next/standalone/.next/server/chunks/[root-of-the-server]__040b569f._.js +3 -0
  418. package/.next/standalone/.next/server/chunks/[root-of-the-server]__045587bf._.js +6 -0
  419. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__bfd5933a._.js → [root-of-the-server]__0b0ca028._.js} +1 -1
  420. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e81c059._.js +1 -1
  421. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1e033f42._.js +1 -1
  422. package/.next/standalone/.next/server/chunks/[root-of-the-server]__35b27244._.js +3 -0
  423. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__b88f14c0._.js → [root-of-the-server]__363f8caf._.js} +2 -2
  424. package/.next/standalone/.next/server/chunks/[root-of-the-server]__45f15a40._.js +3 -0
  425. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5c5398f8._.js +3 -0
  426. package/.next/standalone/.next/server/chunks/[root-of-the-server]__677bd848._.js +21 -21
  427. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__d436a672._.js → [root-of-the-server]__6de56d9f._.js} +1 -1
  428. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b57a53c2._.js +3 -0
  429. package/.next/standalone/.next/server/chunks/[root-of-the-server]__b9ea78fe._.js +3 -0
  430. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__7c29779d._.js → [root-of-the-server]__c5028c19._.js} +1 -1
  431. package/.next/standalone/.next/server/chunks/[root-of-the-server]__ca706dfb._.js +1 -1
  432. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__67e8aa0f._.js → [root-of-the-server]__cc29b58c._.js} +1 -1
  433. package/.next/standalone/.next/server/chunks/[root-of-the-server]__cc3948c5._.js +1 -1
  434. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e8b45be8._.js +1 -1
  435. package/.next/standalone/.next/server/chunks/[root-of-the-server]__eb171d10._.js +2 -2
  436. package/.next/standalone/.next/server/chunks/[root-of-the-server]__fef5bbd7._.js +1 -1
  437. package/.next/standalone/.next/server/chunks/_19441465._.js +370 -0
  438. package/.next/standalone/.next/server/chunks/{_1715c14d._.js → _1bd51141._.js} +1 -1
  439. package/.next/standalone/.next/server/chunks/_5041b697._.js +14 -14
  440. package/.next/standalone/.next/server/chunks/_73cb0d03._.js +1 -1
  441. package/.next/standalone/.next/server/chunks/_a0c6d359._.js +7 -7
  442. package/.next/standalone/.next/server/chunks/_b8c4ce57._.js +3 -0
  443. package/.next/standalone/.next/server/chunks/_c14dfae2._.js +1 -1
  444. package/.next/standalone/.next/server/chunks/_e0991a0e._.js +1 -1
  445. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_ingest_setup_hermes-plugin_route_actions_212af014.js +3 -0
  446. package/.next/standalone/.next/server/chunks/node_modules_3239b80e._.js +1 -1
  447. package/.next/standalone/.next/server/chunks/node_modules_@langchain_core_dist_051f8412._.js +1 -1
  448. package/.next/standalone/.next/server/chunks/node_modules_@langchain_core_dist_0cad7765._.js +1 -1
  449. package/.next/standalone/.next/server/chunks/node_modules_@langchain_core_dist_8e3308fa._.js +1 -1
  450. package/.next/standalone/.next/server/chunks/node_modules_@langchain_langgraph_dist_index_23ed4b74.js +25 -25
  451. package/.next/standalone/.next/server/chunks/node_modules_d933a926._.js +1 -1
  452. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_23ab65eb.js +39 -51
  453. package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_c4a195e5.js +1 -1
  454. package/.next/standalone/.next/server/chunks/node_modules_undici_206d7c0f._.js +15 -15
  455. package/.next/standalone/.next/server/chunks/src_34fb142e._.js +15 -15
  456. package/.next/standalone/.next/server/chunks/src_lib_1466262d._.js +1 -1
  457. package/.next/standalone/.next/server/chunks/src_lib_5d86eca7._.js +1 -1
  458. package/.next/standalone/.next/server/chunks/src_lib_7bae418f._.js +6 -0
  459. package/.next/standalone/.next/server/chunks/{src_lib_ac48c2f3._.js → src_lib_beee2d37._.js} +6 -6
  460. package/.next/standalone/.next/server/chunks/src_lib_c6d9db51._.js +3 -0
  461. package/.next/standalone/.next/server/chunks/{src_lib_3205a4fa._.js → src_lib_e361eb76._.js} +6 -6
  462. package/.next/standalone/.next/server/chunks/src_lib_engine_evaluation_d6ad3d54._.js +6 -6
  463. package/.next/standalone/.next/server/chunks/src_lib_engine_evaluation_evaluator-execution-recorder_ts_d7fedcdd._.js +1 -1
  464. package/.next/standalone/.next/server/chunks/src_lib_engine_general-agent_970b1dfe._.js +3 -3
  465. package/.next/standalone/.next/server/chunks/src_lib_engine_skill-issues_static-evaluator_5e9f2d8a._.js +12 -7
  466. package/.next/standalone/.next/server/chunks/src_lib_ingest_1accb82d._.js +1 -1
  467. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__dfea64df._.js +3 -0
  468. package/.next/standalone/.next/server/chunks/ssr/_0141e5c7._.js +3 -0
  469. package/.next/standalone/.next/server/chunks/ssr/_10e7e5d6._.js +3 -0
  470. package/.next/standalone/.next/server/chunks/ssr/{_633b8c91._.js → _231821bd._.js} +2 -2
  471. package/.next/standalone/.next/server/chunks/ssr/_23385550._.js +1 -1
  472. package/.next/standalone/.next/server/chunks/ssr/_338db557._.js +1 -5
  473. package/.next/standalone/.next/server/chunks/ssr/_37d91d48._.js +3 -0
  474. package/.next/standalone/.next/server/chunks/ssr/_4796bd79._.js +1 -1
  475. package/.next/standalone/.next/server/chunks/ssr/_5e0dfc4e._.js +1 -1
  476. package/.next/standalone/.next/server/chunks/ssr/_5ea9f29c._.js +1 -1
  477. package/.next/standalone/.next/server/chunks/ssr/_ad052dd8._.js +3 -0
  478. package/.next/standalone/.next/server/chunks/ssr/_c16d64b3._.js +1 -1
  479. package/.next/standalone/.next/server/chunks/ssr/_cebf2190._.js +1 -1
  480. package/.next/standalone/.next/server/chunks/ssr/_cfe5178e._.js +1 -1
  481. package/.next/standalone/.next/server/chunks/ssr/_d4828542._.js +3 -0
  482. package/.next/standalone/.next/server/chunks/ssr/_d710ba85._.js +1 -5
  483. package/.next/standalone/.next/server/chunks/ssr/node_modules_05c89d2c._.js +3 -0
  484. package/.next/standalone/.next/server/chunks/ssr/node_modules_0b1debc8._.js +17 -0
  485. package/.next/standalone/.next/server/chunks/ssr/node_modules_118dfa2f._.js +26 -0
  486. package/.next/standalone/.next/server/chunks/ssr/node_modules_241c62ac._.js +31 -0
  487. package/.next/standalone/.next/server/chunks/ssr/node_modules_264cd040._.js +11 -0
  488. package/.next/standalone/.next/server/chunks/ssr/node_modules_3ae4ac61._.js +3 -0
  489. package/.next/standalone/.next/server/chunks/ssr/node_modules_42146d1f._.js +3 -0
  490. package/.next/standalone/.next/server/chunks/ssr/node_modules_4eadc088._.js +3 -0
  491. package/.next/standalone/.next/server/chunks/ssr/node_modules_564ffb11._.js +3 -0
  492. package/.next/standalone/.next/server/chunks/ssr/node_modules_5d8dc663._.js +3 -0
  493. package/.next/standalone/.next/server/chunks/ssr/node_modules_653b0c30._.js +3 -0
  494. package/.next/standalone/.next/server/chunks/ssr/node_modules_77281965._.js +3 -0
  495. package/.next/standalone/.next/server/chunks/ssr/node_modules_77b8869b._.js +17 -0
  496. package/.next/standalone/.next/server/chunks/ssr/node_modules_7a0d9afc._.js +3 -0
  497. package/.next/standalone/.next/server/chunks/ssr/node_modules_7f5b5ff9._.js +45 -0
  498. package/.next/standalone/.next/server/chunks/ssr/node_modules_7f7e9f17._.js +3 -0
  499. package/.next/standalone/.next/server/chunks/ssr/node_modules_7fe3c357._.js +3 -0
  500. package/.next/standalone/.next/server/chunks/ssr/node_modules_803c6412._.js +3 -0
  501. package/.next/standalone/.next/server/chunks/ssr/node_modules_8108cb01._.js +3 -0
  502. package/.next/standalone/.next/server/chunks/ssr/node_modules_831dfa9a._.js +17 -0
  503. package/.next/standalone/.next/server/chunks/ssr/node_modules_971a1a98._.js +3 -0
  504. package/.next/standalone/.next/server/chunks/ssr/node_modules_9d323b89._.js +3 -0
  505. package/.next/standalone/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_db228c3c._.js → node_modules_@mermaid-js_parser_dist_16c88699._.js} +2 -2
  506. package/.next/standalone/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_22ce2656._.js → node_modules_@mermaid-js_parser_dist_21851c70._.js} +2 -2
  507. package/.next/standalone/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_544082c1._.js → node_modules_@mermaid-js_parser_dist_31b46481._.js} +2 -2
  508. package/.next/standalone/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_c48c72e0._.js → node_modules_@mermaid-js_parser_dist_32bdec7b._.js} +2 -2
  509. package/.next/standalone/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_ddbd29b7._.js → node_modules_@mermaid-js_parser_dist_66f35908._.js} +2 -2
  510. package/.next/standalone/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_c8a78e27._.js → node_modules_@mermaid-js_parser_dist_94ecdc22._.js} +2 -2
  511. package/.next/standalone/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_4f77a544._.js → node_modules_@mermaid-js_parser_dist_b85775a0._.js} +2 -2
  512. package/.next/standalone/.next/server/chunks/ssr/{node_modules_@mermaid-js_parser_dist_3ab41ad8._.js → node_modules_@mermaid-js_parser_dist_c8728ae8._.js} +2 -2
  513. package/.next/standalone/.next/server/chunks/ssr/node_modules_@radix-ui_react-popper_dist_index_mjs_0d6fc757._.js +1 -1
  514. package/.next/standalone/.next/server/chunks/ssr/node_modules_a22450a1._.js +17 -0
  515. package/.next/standalone/.next/server/chunks/ssr/node_modules_ab0108ca._.js +3 -0
  516. package/.next/standalone/.next/server/chunks/ssr/node_modules_cad8d256._.js +3 -0
  517. package/.next/standalone/.next/server/chunks/ssr/node_modules_d40eabb5._.js +3 -0
  518. package/.next/standalone/.next/server/chunks/ssr/node_modules_f89ffeff._.js +17 -0
  519. package/.next/standalone/.next/server/chunks/ssr/{node_modules_2a7c4de9._.js → node_modules_fca55bff._.js} +2 -2
  520. package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-5ZQYHXKU_mjs_9293a43d._.js +2 -2
  521. package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-CSCIHK7Q_mjs_5da5edc3._.js +2 -2
  522. package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_mermaid_core_mjs_a11916de._.js +1 -1
  523. package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_skill-eval_page_tsx_d6828614._.js +1 -1
  524. package/.next/standalone/.next/server/chunks/ssr/src_components_evaluation_index_ts_95565210._.js +1 -1
  525. package/.next/standalone/.next/server/chunks/ssr/src_components_ui_select_tsx_4c0f64d8._.js +1 -1
  526. package/.next/standalone/.next/server/pages/404.html +1 -1
  527. package/.next/standalone/.next/server/pages/500.html +2 -2
  528. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  529. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  530. package/.next/standalone/.next/static/chunks/{8b7ff3e53c4bbf8b.js → 0c7b05946b227f5a.js} +1 -5
  531. package/.next/standalone/.next/static/chunks/130e114057a9ebcd.js +1 -0
  532. package/.next/standalone/.next/static/chunks/14befe775870fecd.js +1 -0
  533. package/.next/standalone/.next/static/chunks/25ad82636e5b58a3.js +2 -0
  534. package/.next/{static/chunks/9b3f944a84387392.js → standalone/.next/static/chunks/3336df3d1032eecc.js} +1 -1
  535. package/.next/standalone/.next/static/chunks/43df5d7cd8ec46ff.js +1 -0
  536. package/.next/standalone/.next/static/chunks/463b43ecde7acc6b.js +1 -0
  537. package/.next/standalone/.next/static/chunks/{e5a2f98833719cb8.css → 5163848f38ac1cf6.css} +1 -1
  538. package/.next/standalone/.next/static/chunks/{30396061c28bf72c.js → 53af8dcc7be02445.js} +1 -1
  539. package/.next/standalone/.next/static/chunks/5e43a260c9f4f214.js +1 -0
  540. package/.next/{static/chunks/853a1f6bf3b6d443.js → standalone/.next/static/chunks/623f3222303930bb.js} +1 -1
  541. package/.next/{static/chunks/5407d16db75c16c3.js → standalone/.next/static/chunks/669150ee69928668.js} +1 -1
  542. package/.next/standalone/.next/static/chunks/6dbed19ae114b533.js +1 -0
  543. package/.next/standalone/.next/static/chunks/{9bdf47a06c8d728a.js → 72fce1376de53ff1.js} +1 -5
  544. package/.next/standalone/.next/static/chunks/7aff5373689149f6.css +1 -0
  545. package/.next/standalone/.next/static/chunks/{2f80f58326d89fa4.js → 7b15bab143d8c60f.js} +1 -1
  546. package/.next/{static/chunks/7ac51daef174f857.js → standalone/.next/static/chunks/83910a2aebec21cd.js} +1 -1
  547. package/.next/{static/chunks/4e25ec4dd6ef0459.js → standalone/.next/static/chunks/aab0b35af6737aed.js} +1 -1
  548. package/.next/standalone/.next/static/chunks/{7ac51daef174f857.js → ac4d824ecef761ad.js} +1 -1
  549. package/.next/standalone/.next/static/chunks/c44ecbd264254739.js +1 -0
  550. package/.next/standalone/.next/static/chunks/d04e17c648ef7960.js +4 -0
  551. package/.next/standalone/.next/static/chunks/e03cb31f10551f0b.js +119 -0
  552. package/.next/standalone/.next/static/chunks/e1ca3a6b74761a34.js +1 -0
  553. package/.next/standalone/.next/static/chunks/e4c086f27bba33f9.js +1 -0
  554. package/.next/standalone/.next/static/chunks/e623d8fba24bdb29.js +1 -0
  555. package/.next/standalone/.next/static/chunks/f4436f20374d2dbb.js +1 -0
  556. package/.next/standalone/package.json +1 -1
  557. package/.next/standalone/scripts/hermes_agent_insight_plugin.py +882 -0
  558. package/.next/static/chunks/{8b7ff3e53c4bbf8b.js → 0c7b05946b227f5a.js} +1 -5
  559. package/.next/static/chunks/130e114057a9ebcd.js +1 -0
  560. package/.next/static/chunks/14befe775870fecd.js +1 -0
  561. package/.next/static/chunks/25ad82636e5b58a3.js +2 -0
  562. package/.next/{standalone/.next/static/chunks/9b3f944a84387392.js → static/chunks/3336df3d1032eecc.js} +1 -1
  563. package/.next/static/chunks/43df5d7cd8ec46ff.js +1 -0
  564. package/.next/static/chunks/463b43ecde7acc6b.js +1 -0
  565. package/.next/static/chunks/{e5a2f98833719cb8.css → 5163848f38ac1cf6.css} +1 -1
  566. package/.next/static/chunks/{30396061c28bf72c.js → 53af8dcc7be02445.js} +1 -1
  567. package/.next/static/chunks/5e43a260c9f4f214.js +1 -0
  568. package/.next/{standalone/.next/static/chunks/853a1f6bf3b6d443.js → static/chunks/623f3222303930bb.js} +1 -1
  569. package/.next/{standalone/.next/static/chunks/5407d16db75c16c3.js → static/chunks/669150ee69928668.js} +1 -1
  570. package/.next/static/chunks/6dbed19ae114b533.js +1 -0
  571. package/.next/static/chunks/{9bdf47a06c8d728a.js → 72fce1376de53ff1.js} +1 -5
  572. package/.next/static/chunks/7aff5373689149f6.css +1 -0
  573. package/.next/static/chunks/{2f80f58326d89fa4.js → 7b15bab143d8c60f.js} +1 -1
  574. package/.next/{standalone/.next/static/chunks/82647ed55d4480ce.js → static/chunks/83910a2aebec21cd.js} +1 -1
  575. package/.next/{standalone/.next/static/chunks/4e25ec4dd6ef0459.js → static/chunks/aab0b35af6737aed.js} +1 -1
  576. package/.next/static/chunks/ac4d824ecef761ad.js +1 -0
  577. package/.next/static/chunks/c44ecbd264254739.js +1 -0
  578. package/.next/static/chunks/d04e17c648ef7960.js +4 -0
  579. package/.next/static/chunks/e03cb31f10551f0b.js +119 -0
  580. package/.next/static/chunks/e1ca3a6b74761a34.js +1 -0
  581. package/.next/static/chunks/e4c086f27bba33f9.js +1 -0
  582. package/.next/static/chunks/e623d8fba24bdb29.js +1 -0
  583. package/.next/static/chunks/f4436f20374d2dbb.js +1 -0
  584. package/package.json +1 -1
  585. package/scripts/hermes_agent_insight_plugin.py +882 -0
  586. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00c0800e._.js +0 -3
  587. package/.next/standalone/.next/server/chunks/[root-of-the-server]__2e16866c._.js +0 -6
  588. package/.next/standalone/.next/server/chunks/[root-of-the-server]__52e5e5b6._.js +0 -3
  589. package/.next/standalone/.next/server/chunks/[root-of-the-server]__5782a103._.js +0 -3
  590. package/.next/standalone/.next/server/chunks/[root-of-the-server]__e80a8314._.js +0 -3
  591. package/.next/standalone/.next/server/chunks/[root-of-the-server]__f7423c32._.js +0 -3
  592. package/.next/standalone/.next/server/chunks/_7ecc72d5._.js +0 -370
  593. package/.next/standalone/.next/server/chunks/_fbb1d006._.js +0 -3
  594. package/.next/standalone/.next/server/chunks/src_lib_68596f16._.js +0 -6
  595. package/.next/standalone/.next/server/chunks/src_lib_69eb724e._.js +0 -3
  596. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__afc1fc82._.js +0 -3
  597. package/.next/standalone/.next/server/chunks/ssr/_1409f211._.js +0 -7
  598. package/.next/standalone/.next/server/chunks/ssr/_53a193b7._.js +0 -3
  599. package/.next/standalone/.next/server/chunks/ssr/_8e246656._.js +0 -7
  600. package/.next/standalone/.next/server/chunks/ssr/_c5121a52._.js +0 -3
  601. package/.next/standalone/.next/server/chunks/ssr/_ddf088e7._.js +0 -3
  602. package/.next/standalone/.next/server/chunks/ssr/_ff4f28a3._.js +0 -7
  603. package/.next/standalone/.next/server/chunks/ssr/node_modules_03a4e1e8._.js +0 -3
  604. package/.next/standalone/.next/server/chunks/ssr/node_modules_107e06c2._.js +0 -3
  605. package/.next/standalone/.next/server/chunks/ssr/node_modules_1478fd1a._.js +0 -3
  606. package/.next/standalone/.next/server/chunks/ssr/node_modules_28567d0f._.js +0 -3
  607. package/.next/standalone/.next/server/chunks/ssr/node_modules_2b979638._.js +0 -3
  608. package/.next/standalone/.next/server/chunks/ssr/node_modules_2be5a018._.js +0 -3
  609. package/.next/standalone/.next/server/chunks/ssr/node_modules_302487e0._.js +0 -3
  610. package/.next/standalone/.next/server/chunks/ssr/node_modules_327acc03._.js +0 -26
  611. package/.next/standalone/.next/server/chunks/ssr/node_modules_39d86cba._.js +0 -17
  612. package/.next/standalone/.next/server/chunks/ssr/node_modules_3c01063a._.js +0 -3
  613. package/.next/standalone/.next/server/chunks/ssr/node_modules_3e9eb0ee._.js +0 -11
  614. package/.next/standalone/.next/server/chunks/ssr/node_modules_3f93cf58._.js +0 -45
  615. package/.next/standalone/.next/server/chunks/ssr/node_modules_4327b3e7._.js +0 -3
  616. package/.next/standalone/.next/server/chunks/ssr/node_modules_4bea67c9._.js +0 -3
  617. package/.next/standalone/.next/server/chunks/ssr/node_modules_561578ad._.js +0 -3
  618. package/.next/standalone/.next/server/chunks/ssr/node_modules_5997198a._.js +0 -31
  619. package/.next/standalone/.next/server/chunks/ssr/node_modules_64378d98._.js +0 -17
  620. package/.next/standalone/.next/server/chunks/ssr/node_modules_6e79a594._.js +0 -3
  621. package/.next/standalone/.next/server/chunks/ssr/node_modules_7cccaf98._.js +0 -3
  622. package/.next/standalone/.next/server/chunks/ssr/node_modules_8ac545aa._.js +0 -17
  623. package/.next/standalone/.next/server/chunks/ssr/node_modules_9bf47e56._.js +0 -3
  624. package/.next/standalone/.next/server/chunks/ssr/node_modules_9f38447b._.js +0 -3
  625. package/.next/standalone/.next/server/chunks/ssr/node_modules_@mermaid-js_parser_dist_b213ca58._.js +0 -3
  626. package/.next/standalone/.next/server/chunks/ssr/node_modules_cdddc2e8._.js +0 -17
  627. package/.next/standalone/.next/server/chunks/ssr/node_modules_e51942b7._.js +0 -3
  628. package/.next/standalone/.next/server/chunks/ssr/node_modules_f9ad22f8._.js +0 -17
  629. package/.next/standalone/.next/static/chunks/01874bd5a7fda069.js +0 -5
  630. package/.next/standalone/.next/static/chunks/05f725ad2bd51889.js +0 -5
  631. package/.next/standalone/.next/static/chunks/28c31d9589800fe1.js +0 -1
  632. package/.next/standalone/.next/static/chunks/41708ee675c0cc34.js +0 -1
  633. package/.next/standalone/.next/static/chunks/8481480a23164da3.js +0 -1
  634. package/.next/standalone/.next/static/chunks/8552cadf84c26cfe.js +0 -4
  635. package/.next/standalone/.next/static/chunks/8dc215cff38e080b.js +0 -5
  636. package/.next/standalone/.next/static/chunks/a5d8acb3d2573b32.js +0 -1
  637. package/.next/standalone/.next/static/chunks/a7e72ad6eda9aad1.js +0 -5
  638. package/.next/standalone/.next/static/chunks/bb69bd8f3fb2597f.js +0 -1
  639. package/.next/standalone/.next/static/chunks/c356ee0aa836b01c.js +0 -2
  640. package/.next/standalone/.next/static/chunks/c7b67d9c0be1999f.js +0 -1
  641. package/.next/standalone/.next/static/chunks/cdad5bb63a64bc1a.js +0 -119
  642. package/.next/standalone/.next/static/chunks/e0b132c675c3513e.js +0 -1
  643. package/.next/standalone/.next/static/chunks/e6562c7e7bb67446.css +0 -1
  644. package/.next/static/chunks/01874bd5a7fda069.js +0 -5
  645. package/.next/static/chunks/05f725ad2bd51889.js +0 -5
  646. package/.next/static/chunks/28c31d9589800fe1.js +0 -1
  647. package/.next/static/chunks/41708ee675c0cc34.js +0 -1
  648. package/.next/static/chunks/82647ed55d4480ce.js +0 -1
  649. package/.next/static/chunks/8481480a23164da3.js +0 -1
  650. package/.next/static/chunks/8552cadf84c26cfe.js +0 -4
  651. package/.next/static/chunks/8dc215cff38e080b.js +0 -5
  652. package/.next/static/chunks/a5d8acb3d2573b32.js +0 -1
  653. package/.next/static/chunks/a7e72ad6eda9aad1.js +0 -5
  654. package/.next/static/chunks/bb69bd8f3fb2597f.js +0 -1
  655. package/.next/static/chunks/c356ee0aa836b01c.js +0 -2
  656. package/.next/static/chunks/c7b67d9c0be1999f.js +0 -1
  657. package/.next/static/chunks/cdad5bb63a64bc1a.js +0 -119
  658. package/.next/static/chunks/e0b132c675c3513e.js +0 -1
  659. package/.next/static/chunks/e6562c7e7bb67446.css +0 -1
  660. /package/.next/standalone/.next/static/{1I9NXkgb5T_a680craVmT → XvmH6p-x60yNMPW2ZorCE}/_buildManifest.js +0 -0
  661. /package/.next/standalone/.next/static/{1I9NXkgb5T_a680craVmT → XvmH6p-x60yNMPW2ZorCE}/_clientMiddlewareManifest.json +0 -0
  662. /package/.next/standalone/.next/static/{1I9NXkgb5T_a680craVmT → XvmH6p-x60yNMPW2ZorCE}/_ssgManifest.js +0 -0
  663. /package/.next/static/{1I9NXkgb5T_a680craVmT → XvmH6p-x60yNMPW2ZorCE}/_buildManifest.js +0 -0
  664. /package/.next/static/{1I9NXkgb5T_a680craVmT → XvmH6p-x60yNMPW2ZorCE}/_clientMiddlewareManifest.json +0 -0
  665. /package/.next/static/{1I9NXkgb5T_a680craVmT → XvmH6p-x60yNMPW2ZorCE}/_ssgManifest.js +0 -0
@@ -0,0 +1,882 @@
1
+ from __future__ import annotations
2
+
3
+ import atexit
4
+ import hashlib
5
+ import json
6
+ import os
7
+ import queue
8
+ import threading
9
+ import time
10
+ import urllib.error
11
+ import urllib.request
12
+ from pathlib import Path
13
+ from typing import Any, Dict, Iterable, Optional
14
+
15
+
16
+ PLUGIN_VERSION = "0.2.0"
17
+ DEFAULT_MAX_CONTENT_CHARS = 200_000
18
+ DEFAULT_LOG_MAX_BYTES = 2 * 1024 * 1024
19
+
20
+
21
+ def _now_ns() -> int:
22
+ return time.time_ns()
23
+
24
+
25
+ def _seconds_to_ns(value: Any) -> Optional[int]:
26
+ try:
27
+ return int(float(value) * 1_000_000_000)
28
+ except (TypeError, ValueError):
29
+ return None
30
+
31
+
32
+ def _stable_hex(value: str, length: int) -> str:
33
+ return hashlib.sha256(value.encode("utf-8", errors="replace")).hexdigest()[:length]
34
+
35
+
36
+ def _json_text(value: Any) -> str:
37
+ if value is None:
38
+ return ""
39
+ if isinstance(value, str):
40
+ return value
41
+ if isinstance(value, bytes):
42
+ return value.decode("utf-8", errors="replace")
43
+ try:
44
+ return json.dumps(value, ensure_ascii=False, default=str, separators=(",", ":"))
45
+ except Exception:
46
+ return str(value)
47
+
48
+
49
+ def _limited_text(value: Any, max_chars: int) -> tuple[str, bool, int]:
50
+ text = _json_text(value)
51
+ original_chars = len(text)
52
+ if max_chars > 0 and original_chars > max_chars:
53
+ return text[:max_chars], True, original_chars
54
+ return text, False, original_chars
55
+
56
+
57
+ def _get(value: Any, key: str, default: Any = None) -> Any:
58
+ if isinstance(value, dict):
59
+ return value.get(key, default)
60
+ return getattr(value, key, default)
61
+
62
+
63
+ def _first(*values: Any) -> Any:
64
+ for value in values:
65
+ if value is not None and value != "":
66
+ return value
67
+ return None
68
+
69
+
70
+ def _content_text(value: Any) -> str:
71
+ if value is None:
72
+ return ""
73
+ if isinstance(value, (str, bytes)):
74
+ return _json_text(value)
75
+ if isinstance(value, list):
76
+ return "\n".join(part for part in (_content_text(item) for item in value) if part)
77
+ if isinstance(value, dict):
78
+ for key in ("text", "output_text", "content", "parts"):
79
+ text = _content_text(value.get(key))
80
+ if text:
81
+ return text
82
+ if value.get("type") in ("text", "output_text"):
83
+ return _json_text(value.get("value"))
84
+ return ""
85
+ for key in ("text", "output_text", "content"):
86
+ text = _content_text(_get(value, key))
87
+ if text:
88
+ return text
89
+ return ""
90
+
91
+
92
+ def _message_content(message: Any) -> str:
93
+ if isinstance(message, (str, bytes, list)):
94
+ return _content_text(message)
95
+ return _content_text(_get(message, "content"))
96
+
97
+
98
+ def _response_text(kwargs: Dict[str, Any]) -> str:
99
+ assistant_message = kwargs.get("assistant_message")
100
+ text = _message_content(assistant_message)
101
+ if text:
102
+ return text
103
+
104
+ response = kwargs.get("response")
105
+ text = _message_content(_get(response, "assistant_message"))
106
+ if text:
107
+ return text
108
+
109
+ choices = _get(response, "choices", []) or []
110
+ for choice in choices:
111
+ text = _message_content(_first(_get(choice, "message"), _get(choice, "delta"), choice))
112
+ if text:
113
+ return text
114
+
115
+ text = _content_text(_get(response, "output"))
116
+ if text:
117
+ return text
118
+
119
+ for candidate in _get(response, "candidates", []) or []:
120
+ text = _content_text(_first(_get(candidate, "content"), _get(candidate, "output"), candidate))
121
+ if text:
122
+ return text
123
+
124
+ return _content_text(_first(
125
+ kwargs.get("response_content"),
126
+ kwargs.get("assistant_response"),
127
+ _get(response, "output_text"),
128
+ ))
129
+
130
+
131
+ def _read_dotenv(path: Path) -> Dict[str, str]:
132
+ result: Dict[str, str] = {}
133
+ try:
134
+ for raw_line in path.read_text(encoding="utf-8").splitlines():
135
+ line = raw_line.strip()
136
+ if not line or line.startswith("#") or "=" not in line:
137
+ continue
138
+ key, value = line.split("=", 1)
139
+ result[key.strip()] = value.strip().strip('"').strip("'")
140
+ except OSError:
141
+ pass
142
+ return result
143
+
144
+
145
+ def _load_config() -> Dict[str, Any]:
146
+ plugin_dir = Path(__file__).resolve().parent
147
+ config: Dict[str, Any] = {}
148
+ try:
149
+ loaded = json.loads((plugin_dir / "config.json").read_text(encoding="utf-8-sig"))
150
+ if isinstance(loaded, dict):
151
+ config.update(loaded)
152
+ except (OSError, ValueError):
153
+ pass
154
+
155
+ env_file = _read_dotenv(Path.home() / ".agent-insight" / ".env")
156
+ host = _first(
157
+ os.getenv("AGENT_INSIGHT_HOST"),
158
+ env_file.get("AGENT_INSIGHT_HOST"),
159
+ config.get("host"),
160
+ )
161
+ normalized_host = str(host).rstrip("/") if host else ""
162
+ if normalized_host and not normalized_host.startswith(("http://", "https://")):
163
+ normalized_host = f"http://{normalized_host}"
164
+ endpoint = _first(
165
+ os.getenv("AGENT_INSIGHT_OTLP_ENDPOINT"),
166
+ config.get("endpoint"),
167
+ f"{normalized_host}/api/ingest/otel/v1/traces" if normalized_host else None,
168
+ )
169
+ if endpoint and not str(endpoint).startswith(("http://", "https://")):
170
+ endpoint = f"http://{str(endpoint).lstrip('/')}"
171
+ api_key = _first(
172
+ os.getenv("AGENT_INSIGHT_API_KEY"),
173
+ env_file.get("AGENT_INSIGHT_API_KEY"),
174
+ config.get("api_key"),
175
+ )
176
+ config["endpoint"] = endpoint or ""
177
+ config["api_key"] = api_key or ""
178
+ config.setdefault("service_name", "hermes")
179
+ config.setdefault("max_content_chars", DEFAULT_MAX_CONTENT_CHARS)
180
+ config.setdefault("timeout_seconds", 10)
181
+ config.setdefault("spool_dir", str(Path.home() / ".agent-insight" / "data" / "hermes-otel-spool"))
182
+ config.setdefault("log_file", str(Path.home() / ".agent-insight" / "logs" / "hermes-plugin.log"))
183
+ config.setdefault("retry_base_seconds", 1)
184
+ config.setdefault("retry_max_seconds", 60)
185
+ return config
186
+
187
+
188
+ def _otel_value(value: Any) -> Dict[str, Any]:
189
+ if isinstance(value, bool):
190
+ return {"boolValue": value}
191
+ if isinstance(value, int):
192
+ return {"intValue": str(value)}
193
+ if isinstance(value, float):
194
+ return {"doubleValue": value}
195
+ return {"stringValue": _json_text(value)}
196
+
197
+
198
+ def _attributes(values: Dict[str, Any]) -> list[Dict[str, Any]]:
199
+ return [
200
+ {"key": key, "value": _otel_value(value)}
201
+ for key, value in values.items()
202
+ if value is not None and value != ""
203
+ ]
204
+
205
+
206
+ class _FileLogger:
207
+ def __init__(self, path: str, max_bytes: int = DEFAULT_LOG_MAX_BYTES) -> None:
208
+ self.path = Path(path).expanduser()
209
+ self.max_bytes = max_bytes
210
+ self.lock = threading.Lock()
211
+
212
+ def write(self, level: str, message: str) -> None:
213
+ try:
214
+ with self.lock:
215
+ self.path.parent.mkdir(parents=True, exist_ok=True, mode=0o700)
216
+ if self.path.exists() and self.path.stat().st_size >= self.max_bytes:
217
+ rotated = self.path.with_suffix(self.path.suffix + ".1")
218
+ try:
219
+ rotated.unlink(missing_ok=True)
220
+ self.path.replace(rotated)
221
+ except OSError:
222
+ pass
223
+ timestamp = time.strftime("%Y-%m-%dT%H:%M:%S%z")
224
+ with self.path.open("a", encoding="utf-8") as handle:
225
+ handle.write(f"{timestamp} {level.upper()} {message}\n")
226
+ try:
227
+ self.path.chmod(0o600)
228
+ except OSError:
229
+ pass
230
+ except OSError:
231
+ pass
232
+
233
+
234
+ class _SnapshotExporter:
235
+ def __init__(self, config: Dict[str, Any]) -> None:
236
+ self.endpoint = str(config.get("endpoint") or "")
237
+ self.api_key = str(config.get("api_key") or "")
238
+ self.service_name = str(config.get("service_name") or "hermes")
239
+ self.timeout = float(config.get("timeout_seconds") or 10)
240
+ self.retry_base = max(0.1, float(config.get("retry_base_seconds") or 1))
241
+ self.retry_max = max(self.retry_base, float(config.get("retry_max_seconds") or 60))
242
+ self.spool_dir = Path(str(config.get("spool_dir") or (Path.home() / ".agent-insight" / "data" / "hermes-otel-spool"))).expanduser()
243
+ self.spool_dir.mkdir(parents=True, exist_ok=True, mode=0o700)
244
+ self.logger = _FileLogger(str(config.get("log_file") or (Path.home() / ".agent-insight" / "logs" / "hermes-plugin.log")))
245
+ self._queue: queue.PriorityQueue[tuple[float, int, Optional[Path]]] = queue.PriorityQueue()
246
+ self._lock = threading.Lock()
247
+ self._scheduled: set[Path] = set()
248
+ self._attempts: Dict[Path, int] = {}
249
+ self._sequence = 0
250
+ self._stopping = False
251
+ for path in self.spool_dir.glob("*.json"):
252
+ self._schedule(path)
253
+ self._worker = threading.Thread(target=self._run, name="agent-insight-hermes-exporter", daemon=True)
254
+ self._worker.start()
255
+ self.logger.write("info", f"exporter started spool={self.spool_dir} endpoint_configured={bool(self.endpoint)}")
256
+
257
+ def submit(self, root_id: str, payload: Dict[str, Any]) -> None:
258
+ path = self.spool_dir / f"{_stable_hex(root_id, 32)}.json"
259
+ data = json.dumps(payload, ensure_ascii=False, separators=(",", ":")).encode("utf-8")
260
+ temp_path = path.with_name(f".{path.name}.{threading.get_ident()}.tmp")
261
+ try:
262
+ temp_path.write_bytes(data)
263
+ try:
264
+ temp_path.chmod(0o600)
265
+ except OSError:
266
+ pass
267
+ os.replace(temp_path, path)
268
+ self._schedule(path)
269
+ except OSError as error:
270
+ self.logger.write("error", f"spool write failed type={type(error).__name__}")
271
+ try:
272
+ temp_path.unlink(missing_ok=True)
273
+ except OSError:
274
+ pass
275
+
276
+ def _schedule(self, path: Path, due: Optional[float] = None) -> None:
277
+ with self._lock:
278
+ if self._stopping or path in self._scheduled:
279
+ return
280
+ self._scheduled.add(path)
281
+ self._sequence += 1
282
+ self._queue.put((due if due is not None else time.monotonic(), self._sequence, path))
283
+
284
+ def flush(self, timeout: float = 3.0) -> None:
285
+ deadline = time.monotonic() + timeout
286
+ while self._queue.unfinished_tasks and time.monotonic() < deadline:
287
+ time.sleep(0.02)
288
+
289
+ def close(self) -> None:
290
+ self.flush()
291
+ with self._lock:
292
+ self._stopping = True
293
+ self._sequence += 1
294
+ self._queue.put((time.monotonic(), self._sequence, None))
295
+
296
+ def _run(self) -> None:
297
+ while True:
298
+ due, sequence, path = self._queue.get()
299
+ needs_task_done = True
300
+ try:
301
+ if path is None:
302
+ return
303
+ delay = due - time.monotonic()
304
+ if delay > 0:
305
+ self._queue.task_done()
306
+ needs_task_done = False
307
+ self._queue.put((due, sequence, path))
308
+ time.sleep(min(delay, 0.25))
309
+ continue
310
+ with self._lock:
311
+ self._scheduled.discard(path)
312
+ self._send_path(path)
313
+ finally:
314
+ if needs_task_done:
315
+ self._queue.task_done()
316
+
317
+ def _send_path(self, path: Path) -> None:
318
+ try:
319
+ data = path.read_bytes()
320
+ json.loads(data.decode("utf-8"))
321
+ except (OSError, ValueError, UnicodeError) as error:
322
+ self.logger.write("error", f"spool read failed file={path.name} type={type(error).__name__}")
323
+ return
324
+
325
+ success, retryable, detail = self._send(data)
326
+ if success:
327
+ self._attempts.pop(path, None)
328
+ self.logger.write("info", f"export success file={path.name} bytes={len(data)} detail={detail}")
329
+ try:
330
+ if path.read_bytes() == data:
331
+ path.unlink(missing_ok=True)
332
+ else:
333
+ self._schedule(path)
334
+ except OSError as error:
335
+ self.logger.write("warning", f"spool cleanup failed file={path.name} type={type(error).__name__}")
336
+ return
337
+
338
+ if retryable:
339
+ attempt = self._attempts.get(path, 0) + 1
340
+ self._attempts[path] = attempt
341
+ delay = min(self.retry_max, self.retry_base * (2 ** min(attempt - 1, 8)))
342
+ self.logger.write("warning", f"export retry file={path.name} attempt={attempt} delay={delay:.1f}s detail={detail}")
343
+ self._schedule(path, time.monotonic() + delay)
344
+ else:
345
+ self.logger.write("error", f"export paused file={path.name} detail={detail}")
346
+
347
+ def _send(self, data: bytes) -> tuple[bool, bool, str]:
348
+ if not self.endpoint:
349
+ return False, False, "endpoint_not_configured"
350
+ headers = {"Content-Type": "application/json"}
351
+ if self.api_key:
352
+ headers["x-witty-api-key"] = self.api_key
353
+ request = urllib.request.Request(
354
+ self.endpoint,
355
+ data=data,
356
+ headers=headers,
357
+ method="POST",
358
+ )
359
+ try:
360
+ with urllib.request.urlopen(request, timeout=self.timeout) as response:
361
+ response.read()
362
+ status = int(getattr(response, "status", 200) or 200)
363
+ return 200 <= status < 300, status in (408, 429) or status >= 500, f"http_{status}"
364
+ except urllib.error.HTTPError as error:
365
+ status = int(error.code or 0)
366
+ return False, status in (408, 429) or status >= 500, f"http_{status}"
367
+ except (OSError, urllib.error.URLError) as error:
368
+ return False, True, type(error).__name__
369
+
370
+
371
+ class _Collector:
372
+ def __init__(self, config: Optional[Dict[str, Any]] = None) -> None:
373
+ self.config = config or _load_config()
374
+ self.max_chars = int(self.config.get("max_content_chars") or DEFAULT_MAX_CONTENT_CHARS)
375
+ self.exporter = _SnapshotExporter(self.config)
376
+ self.lock = threading.RLock()
377
+ self.sessions: Dict[str, Dict[str, Any]] = {}
378
+ self.turns: Dict[tuple[str, str], Dict[str, Any]] = {}
379
+ self.current_turn: Dict[str, str] = {}
380
+ self.api_spans: Dict[str, Dict[str, Any]] = {}
381
+ self.tool_spans: Dict[str, Dict[str, Any]] = {}
382
+ self.subagents: Dict[str, Dict[str, Any]] = {}
383
+ self.completed_by_root: Dict[str, Dict[str, Dict[str, Any]]] = {}
384
+ self.ended_roots: set[str] = set()
385
+
386
+ def close(self) -> None:
387
+ self.exporter.close()
388
+
389
+ def _session_id(self, kwargs: Dict[str, Any]) -> str:
390
+ return str(_first(kwargs.get("session_id"), kwargs.get("child_session_id"), "unknown"))
391
+
392
+ def _root_id(self, session_id: str) -> str:
393
+ return str(self.sessions.get(session_id, {}).get("root_session_id") or session_id)
394
+
395
+ def _trace_id(self, root_session_id: str) -> str:
396
+ return _stable_hex(f"agent-insight:hermes:trace:{root_session_id}", 32)
397
+
398
+ def _span_id(self, *parts: Any) -> str:
399
+ return _stable_hex("agent-insight:hermes:span:" + ":".join(map(str, parts)), 16)
400
+
401
+ def _base_attributes(self, session_id: str, model: Any = None) -> Dict[str, Any]:
402
+ state = self.sessions.get(session_id, {})
403
+ root_id = self._root_id(session_id)
404
+ return {
405
+ "service.name": self.config.get("service_name", "hermes"),
406
+ "agent.insight.framework": "hermes",
407
+ "session.id": root_id,
408
+ "hermes.session_id": session_id,
409
+ "hermes.root_session_id": root_id,
410
+ "hermes.parent_session_id": state.get("parent_session_id"),
411
+ "hermes.subagent.id": state.get("subagent_id"),
412
+ "hermes.subagent.parent_id": state.get("parent_subagent_id"),
413
+ "hermes.agent.role": state.get("role") or "root",
414
+ "hermes.agent.name": state.get("role") or "hermes",
415
+ "llm.model_name": model,
416
+ "agent.insight.plugin.version": PLUGIN_VERSION,
417
+ }
418
+
419
+ def _new_span(
420
+ self,
421
+ name: str,
422
+ session_id: str,
423
+ span_id: str,
424
+ parent_span_id: Optional[str],
425
+ attributes: Dict[str, Any],
426
+ start_ns: Optional[int] = None,
427
+ ) -> Dict[str, Any]:
428
+ root_id = self._root_id(session_id)
429
+ return {
430
+ "traceId": self._trace_id(root_id),
431
+ "spanId": span_id,
432
+ "parentSpanId": parent_span_id or "",
433
+ "name": name,
434
+ "kind": 1,
435
+ "startTimeUnixNano": str(start_ns or _now_ns()),
436
+ "endTimeUnixNano": str(start_ns or _now_ns()),
437
+ "attributes": _attributes(attributes),
438
+ "status": {"code": 1},
439
+ }
440
+
441
+ def _finish_span(self, span: Dict[str, Any], attributes: Dict[str, Any], end_ns: Optional[int] = None) -> None:
442
+ merged: Dict[str, Any] = {}
443
+ for item in span.get("attributes", []):
444
+ key = item.get("key")
445
+ value = item.get("value", {})
446
+ if key:
447
+ merged[key] = next(iter(value.values()), "")
448
+ merged.update(attributes)
449
+ span["attributes"] = _attributes(merged)
450
+ span["endTimeUnixNano"] = str(end_ns or _now_ns())
451
+
452
+ def _complete(self, session_id: str, span: Dict[str, Any]) -> None:
453
+ root_id = self._root_id(session_id)
454
+ spans = self.completed_by_root.setdefault(root_id, {})
455
+ spans[str(span["spanId"])] = span
456
+ self.exporter.submit(root_id, self._payload(root_id, spans.values()))
457
+
458
+ def _payload(self, root_id: str, spans: Iterable[Dict[str, Any]]) -> Dict[str, Any]:
459
+ resource_attrs = {
460
+ "service.name": self.config.get("service_name", "hermes"),
461
+ "agent.insight.framework": "hermes",
462
+ "session.id": root_id,
463
+ "service.instance.id": root_id,
464
+ }
465
+ return {
466
+ "resourceSpans": [
467
+ {
468
+ "resource": {"attributes": _attributes(resource_attrs)},
469
+ "scopeSpans": [
470
+ {
471
+ "scope": {"name": "agent-insight-hermes", "version": PLUGIN_VERSION},
472
+ "spans": sorted(spans, key=lambda item: int(item["startTimeUnixNano"])),
473
+ }
474
+ ],
475
+ }
476
+ ]
477
+ }
478
+
479
+ def _cleanup_root(self, root_id: str) -> None:
480
+ session_ids = {
481
+ sid for sid in self.sessions
482
+ if sid == root_id or self._root_id(sid) == root_id
483
+ }
484
+ span_count = len(self.completed_by_root.get(root_id, {}))
485
+ self.completed_by_root.pop(root_id, None)
486
+ self.ended_roots.discard(root_id)
487
+ for sid in session_ids:
488
+ self.sessions.pop(sid, None)
489
+ self.current_turn.pop(sid, None)
490
+ self.turns = {key: value for key, value in self.turns.items() if key[0] not in session_ids}
491
+ self.api_spans = {
492
+ key: value for key, value in self.api_spans.items()
493
+ if value.get("session_id") not in session_ids
494
+ }
495
+ self.tool_spans = {
496
+ key: value for key, value in self.tool_spans.items()
497
+ if value.get("session_id") not in session_ids
498
+ }
499
+ self.subagents = {
500
+ key: value for key, value in self.subagents.items()
501
+ if key not in session_ids and value.get("parent_session_id") not in session_ids
502
+ }
503
+ self.exporter.logger.write(
504
+ "info",
505
+ f"root state cleaned root={root_id} sessions={len(session_ids)} spans={span_count}",
506
+ )
507
+
508
+ def _maybe_cleanup_root(self, root_id: str) -> bool:
509
+ if root_id not in self.ended_roots:
510
+ return False
511
+ active_children = [
512
+ child_session_id for child_session_id in self.subagents
513
+ if self._root_id(child_session_id) == root_id
514
+ ]
515
+ if active_children:
516
+ self.exporter.logger.write(
517
+ "info",
518
+ f"root cleanup deferred root={root_id} active_subagents={len(active_children)}",
519
+ )
520
+ return False
521
+ self._cleanup_root(root_id)
522
+ return True
523
+
524
+ def pre_llm_call(self, **kwargs: Any) -> None:
525
+ with self.lock:
526
+ session_id = self._session_id(kwargs)
527
+ turn_id = str(_first(kwargs.get("turn_id"), kwargs.get("task_id"), _now_ns()))
528
+ model = kwargs.get("model")
529
+ self.current_turn[session_id] = turn_id
530
+ session_state = self.sessions.setdefault(
531
+ session_id,
532
+ {"root_session_id": session_id, "role": "root"},
533
+ )
534
+ parent_span_id = session_state.get("container_span_id")
535
+ agent_span = None
536
+ if session_state.get("role") == "root":
537
+ agent_span = self._new_span(
538
+ "agent",
539
+ session_id,
540
+ self._span_id(session_id, turn_id, "agent"),
541
+ None,
542
+ {
543
+ **self._base_attributes(session_id, model),
544
+ "openinference.span.kind": "AGENT",
545
+ "input.value": kwargs.get("user_message"),
546
+ "llm.input.value": kwargs.get("user_message"),
547
+ },
548
+ )
549
+ parent_span_id = agent_span["spanId"]
550
+ llm_span = self._new_span(
551
+ f"llm.{model or 'unknown'}",
552
+ session_id,
553
+ self._span_id(session_id, turn_id, "llm"),
554
+ parent_span_id,
555
+ {
556
+ **self._base_attributes(session_id, model),
557
+ "openinference.span.kind": "LLM",
558
+ "input.value": kwargs.get("user_message"),
559
+ "llm.input.value": kwargs.get("user_message"),
560
+ "llm.input_messages": kwargs.get("conversation_history"),
561
+ },
562
+ )
563
+ self.turns[(session_id, turn_id)] = {
564
+ "agent": agent_span,
565
+ "llm": llm_span,
566
+ "model": model,
567
+ }
568
+
569
+ def pre_api_request(self, **kwargs: Any) -> None:
570
+ with self.lock:
571
+ session_id = self._session_id(kwargs)
572
+ turn_id = str(_first(kwargs.get("turn_id"), self.current_turn.get(session_id), "unknown"))
573
+ request_id = str(_first(kwargs.get("api_request_id"), f"{session_id}:{turn_id}:{kwargs.get('api_call_count', 0)}"))
574
+ turn = self.turns.get((session_id, turn_id), {})
575
+ model = kwargs.get("model") or turn.get("model")
576
+ self.api_spans[request_id] = {
577
+ "session_id": session_id,
578
+ "span": self._new_span(
579
+ f"api.{model or 'unknown'}",
580
+ session_id,
581
+ self._span_id(session_id, request_id, "api"),
582
+ _get(turn.get("llm"), "spanId"),
583
+ {
584
+ **self._base_attributes(session_id, model),
585
+ "openinference.span.kind": "LLM",
586
+ "gen_ai.operation.name": "chat",
587
+ "gen_ai.request.model": model,
588
+ "llm.input_messages": kwargs.get("request_messages"),
589
+ "input.value": kwargs.get("request_messages"),
590
+ "hermes.api_request_id": request_id,
591
+ "hermes.provider": kwargs.get("provider"),
592
+ },
593
+ ),
594
+ }
595
+
596
+ def post_api_request(self, **kwargs: Any) -> None:
597
+ with self.lock:
598
+ request_id = str(_first(kwargs.get("api_request_id"), ""))
599
+ state = self.api_spans.pop(request_id, None)
600
+ if not state:
601
+ return
602
+ session_id = state["session_id"]
603
+ output, truncated, original_chars = _limited_text(_response_text(kwargs), self.max_chars)
604
+ usage = kwargs.get("usage") or {}
605
+ self._finish_span(
606
+ state["span"],
607
+ {
608
+ "output.value": output,
609
+ "llm.output.content": output,
610
+ "llm.response.output_chars": original_chars,
611
+ "agent.insight.content.truncated": truncated,
612
+ "llm.token_count.prompt": _first(_get(usage, "prompt_tokens"), _get(usage, "input_tokens")),
613
+ "llm.token_count.completion": _first(_get(usage, "completion_tokens"), _get(usage, "output_tokens")),
614
+ "llm.token_count.total": _get(usage, "total_tokens"),
615
+ "gen_ai.response.finish_reasons": kwargs.get("finish_reason"),
616
+ "llm.response.finish_reason": kwargs.get("finish_reason"),
617
+ },
618
+ )
619
+ self._complete(session_id, state["span"])
620
+
621
+ def api_request_error(self, **kwargs: Any) -> None:
622
+ with self.lock:
623
+ request_id = str(_first(kwargs.get("api_request_id"), ""))
624
+ state = self.api_spans.pop(request_id, None)
625
+ if state:
626
+ session_id = state["session_id"]
627
+ span = state["span"]
628
+ else:
629
+ session_id = self._session_id(kwargs)
630
+ turn_id = str(_first(kwargs.get("turn_id"), self.current_turn.get(session_id), "unknown"))
631
+ model = kwargs.get("model")
632
+ turn = self.turns.get((session_id, turn_id), {})
633
+ span = self._new_span(
634
+ f"api.{model or turn.get('model') or 'unknown'}",
635
+ session_id,
636
+ self._span_id(session_id, request_id or _now_ns(), "api-error"),
637
+ _get(turn.get("llm"), "spanId"),
638
+ {
639
+ **self._base_attributes(session_id, model or turn.get("model")),
640
+ "openinference.span.kind": "LLM",
641
+ "gen_ai.operation.name": "chat",
642
+ "input.value": kwargs.get("request"),
643
+ "hermes.api_request_id": request_id,
644
+ },
645
+ start_ns=_seconds_to_ns(kwargs.get("started_at")),
646
+ )
647
+ error = kwargs.get("error") or {}
648
+ error_type = _first(_get(error, "type"), kwargs.get("reason"), "api_request_error")
649
+ error_message = _first(_get(error, "message"), kwargs.get("reason"), "Hermes API request failed")
650
+ self._finish_span(
651
+ span,
652
+ {
653
+ "error.type": error_type,
654
+ "error.message": error_message,
655
+ "http.response.status_code": kwargs.get("status_code"),
656
+ "hermes.retry_count": kwargs.get("retry_count"),
657
+ "hermes.max_retries": kwargs.get("max_retries"),
658
+ "hermes.retryable": kwargs.get("retryable"),
659
+ "hermes.api_error.reason": kwargs.get("reason"),
660
+ "hermes.api_duration": kwargs.get("api_duration"),
661
+ "llm.response.finish_reason": "error",
662
+ },
663
+ end_ns=_seconds_to_ns(kwargs.get("ended_at")),
664
+ )
665
+ span["status"] = {"code": 2, "message": str(error_message)}
666
+ self._complete(session_id, span)
667
+
668
+ def pre_tool_call(self, **kwargs: Any) -> None:
669
+ with self.lock:
670
+ tool_name = str(_first(kwargs.get("tool_name"), "unknown"))
671
+ if tool_name == "delegate_task":
672
+ return
673
+ session_id = self._session_id(kwargs)
674
+ turn_id = str(_first(kwargs.get("turn_id"), self.current_turn.get(session_id), "unknown"))
675
+ tool_call_id = str(_first(kwargs.get("tool_call_id"), f"{session_id}:{turn_id}:{tool_name}:{_now_ns()}"))
676
+ turn = self.turns.get((session_id, turn_id), {})
677
+ attributes = {
678
+ **self._base_attributes(session_id, turn.get("model")),
679
+ "openinference.span.kind": "TOOL",
680
+ "tool.name": tool_name,
681
+ "tool.call.id": tool_call_id,
682
+ "tool.input": kwargs.get("args"),
683
+ "input.value": kwargs.get("args"),
684
+ }
685
+ if tool_name == "skill_view":
686
+ attributes["hermes.skill.name"] = _first(
687
+ _get(kwargs.get("args"), "name"),
688
+ _get(kwargs.get("args"), "skill"),
689
+ _get(kwargs.get("args"), "skill_name"),
690
+ )
691
+ self.tool_spans[tool_call_id] = {
692
+ "session_id": session_id,
693
+ "span": self._new_span(
694
+ f"tool.{tool_name}",
695
+ session_id,
696
+ self._span_id(session_id, tool_call_id, "tool"),
697
+ _get(turn.get("llm"), "spanId"),
698
+ attributes,
699
+ ),
700
+ }
701
+
702
+ def post_tool_call(self, **kwargs: Any) -> None:
703
+ with self.lock:
704
+ tool_name = str(_first(kwargs.get("tool_name"), "unknown"))
705
+ if tool_name == "delegate_task":
706
+ return
707
+ tool_call_id = str(_first(kwargs.get("tool_call_id"), ""))
708
+ state = self.tool_spans.pop(tool_call_id, None)
709
+ if not state:
710
+ return
711
+ output, truncated, original_chars = _limited_text(kwargs.get("result"), self.max_chars)
712
+ self._finish_span(
713
+ state["span"],
714
+ {
715
+ "tool.output": output,
716
+ "output.value": output,
717
+ "tool.output.original_chars": original_chars,
718
+ "agent.insight.content.truncated": truncated,
719
+ "tool.status": kwargs.get("status"),
720
+ "error.message": kwargs.get("error"),
721
+ },
722
+ )
723
+ self._complete(state["session_id"], state["span"])
724
+
725
+ def post_llm_call(self, **kwargs: Any) -> None:
726
+ with self.lock:
727
+ session_id = self._session_id(kwargs)
728
+ turn_id = str(_first(kwargs.get("turn_id"), self.current_turn.get(session_id), "unknown"))
729
+ turn = self.turns.get((session_id, turn_id))
730
+ if not turn:
731
+ return
732
+ output, truncated, original_chars = _limited_text(kwargs.get("assistant_response"), self.max_chars)
733
+ attrs = {
734
+ "output.value": output,
735
+ "llm.output.content": output,
736
+ "llm.response.output_chars": original_chars,
737
+ "agent.insight.content.truncated": truncated,
738
+ }
739
+ self._finish_span(turn["llm"], attrs)
740
+ self._complete(session_id, turn["llm"])
741
+ if turn.get("agent"):
742
+ self._finish_span(turn["agent"], attrs)
743
+ self._complete(session_id, turn["agent"])
744
+
745
+ def subagent_start(self, **kwargs: Any) -> None:
746
+ with self.lock:
747
+ parent_session_id = str(_first(kwargs.get("parent_session_id"), "unknown"))
748
+ child_session_id = str(_first(kwargs.get("child_session_id"), "unknown"))
749
+ parent_turn_id = str(_first(kwargs.get("parent_turn_id"), self.current_turn.get(parent_session_id), "unknown"))
750
+ root_id = self._root_id(parent_session_id)
751
+ role = str(_first(kwargs.get("child_role"), "subagent"))
752
+ goal = kwargs.get("child_goal")
753
+ self.sessions[child_session_id] = {
754
+ "root_session_id": root_id,
755
+ "parent_session_id": parent_session_id,
756
+ "subagent_id": kwargs.get("child_subagent_id"),
757
+ "parent_subagent_id": kwargs.get("parent_subagent_id"),
758
+ "role": role,
759
+ }
760
+ parent_turn = self.turns.get((parent_session_id, parent_turn_id), {})
761
+ task_span = self._new_span(
762
+ "tool.task",
763
+ parent_session_id,
764
+ self._span_id(parent_session_id, child_session_id, "task"),
765
+ _get(parent_turn.get("llm"), "spanId"),
766
+ {
767
+ **self._base_attributes(parent_session_id, parent_turn.get("model")),
768
+ "openinference.span.kind": "TOOL",
769
+ "tool.name": "task",
770
+ "tool.call.id": self._span_id(parent_session_id, child_session_id, "task-call"),
771
+ "tool.input": {
772
+ "subagent_type": role,
773
+ "description": goal,
774
+ "session_id": child_session_id,
775
+ },
776
+ "input.value": {
777
+ "subagent_type": role,
778
+ "description": goal,
779
+ "session_id": child_session_id,
780
+ },
781
+ "hermes.child_session_id": child_session_id,
782
+ },
783
+ )
784
+ child_agent_span = self._new_span(
785
+ f"agent.subagent.{role}",
786
+ child_session_id,
787
+ self._span_id(child_session_id, "subagent-agent"),
788
+ task_span["spanId"],
789
+ {
790
+ **self._base_attributes(child_session_id),
791
+ "openinference.span.kind": "AGENT",
792
+ "input.value": goal,
793
+ "llm.input.value": goal,
794
+ },
795
+ )
796
+ self.sessions[child_session_id]["container_span_id"] = child_agent_span["spanId"]
797
+ self.subagents[child_session_id] = {
798
+ "parent_session_id": parent_session_id,
799
+ "task_span": task_span,
800
+ "agent_span": child_agent_span,
801
+ }
802
+
803
+ def subagent_stop(self, **kwargs: Any) -> None:
804
+ with self.lock:
805
+ child_session_id = str(_first(kwargs.get("child_session_id"), ""))
806
+ root_id = self._root_id(child_session_id)
807
+ state = self.subagents.pop(child_session_id, None)
808
+ if not state:
809
+ return
810
+ summary, truncated, original_chars = _limited_text(kwargs.get("child_summary"), self.max_chars)
811
+ attrs = {
812
+ "output.value": summary,
813
+ "llm.output.content": summary,
814
+ "llm.response.output_chars": original_chars,
815
+ "agent.insight.content.truncated": truncated,
816
+ "hermes.subagent.status": kwargs.get("child_status"),
817
+ }
818
+ self._finish_span(state["agent_span"], attrs)
819
+ self._complete(child_session_id, state["agent_span"])
820
+ self._finish_span(
821
+ state["task_span"],
822
+ {
823
+ "tool.output": {
824
+ "session_id": child_session_id,
825
+ "result": summary,
826
+ "status": kwargs.get("child_status"),
827
+ },
828
+ "output.value": {
829
+ "session_id": child_session_id,
830
+ "result": summary,
831
+ "status": kwargs.get("child_status"),
832
+ },
833
+ },
834
+ )
835
+ self._complete(state["parent_session_id"], state["task_span"])
836
+ self._maybe_cleanup_root(root_id)
837
+
838
+ def on_session_end(self, **kwargs: Any) -> None:
839
+ with self.lock:
840
+ session_id = self._session_id(kwargs)
841
+ root_id = self._root_id(session_id)
842
+ is_root_session = session_id == root_id
843
+ if is_root_session:
844
+ self.ended_roots.add(root_id)
845
+ self.exporter.flush()
846
+ with self.lock:
847
+ if is_root_session:
848
+ self._maybe_cleanup_root(root_id)
849
+ else:
850
+ self.exporter.logger.write(
851
+ "info",
852
+ f"child session ended session={session_id} root={root_id}; root state retained",
853
+ )
854
+
855
+
856
+ _collector: Optional[_Collector] = None
857
+
858
+
859
+ def register(ctx: Any) -> None:
860
+ global _collector
861
+ _collector = _Collector()
862
+ for hook_name in (
863
+ "pre_llm_call",
864
+ "pre_api_request",
865
+ "post_api_request",
866
+ "api_request_error",
867
+ "pre_tool_call",
868
+ "post_tool_call",
869
+ "post_llm_call",
870
+ "subagent_start",
871
+ "subagent_stop",
872
+ "on_session_end",
873
+ ):
874
+ ctx.register_hook(hook_name, getattr(_collector, hook_name))
875
+
876
+
877
+ def _close() -> None:
878
+ if _collector is not None:
879
+ _collector.close()
880
+
881
+
882
+ atexit.register(_close)