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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +1 -0
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/routes-manifest.json +6 -0
- package/.next/standalone/.next/server/app/(main)/accessconfig/channels/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/accessconfig/health/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/accessconfig/install/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/accessconfig/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/accessconfig/webhooks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/agents/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/dashboard/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/dataset/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/dataset/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/eval/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(main)/eval/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/eval/run/[runId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/eval/trajectory/[taskId]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/eval/trajectory/[taskId]/trace/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/eval/trajectory/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/evaluation/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/fault/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/memory/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/metrics/evaluators/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/metrics/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/modelconfig/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/modelconfig/registry/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(main)/modelconfig/registry/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/modelconfig/web-search/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/optapi/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/quality/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(main)/quality/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/security/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/skill-eval/grayscale/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/skill-eval/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/skill-eval/trigger/[skillName]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/skill-generator/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/skill-history/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(main)/skill-history/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/skill-opt/[name]/[version]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/skill-opt/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/skill-release/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/skills/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(main)/skills/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/trace/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(main)/trace/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +2 -2
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig/channels.html +1 -1
- package/.next/standalone/.next/server/app/accessconfig/channels.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig/channels.segments/!KG1haW4p/accessconfig/channels/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/channels.segments/!KG1haW4p/accessconfig/channels.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/channels.segments/!KG1haW4p/accessconfig.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/channels.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/channels.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig/channels.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/channels.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig/channels.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig/health.html +1 -1
- package/.next/standalone/.next/server/app/accessconfig/health.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig/health.segments/!KG1haW4p/accessconfig/health/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/health.segments/!KG1haW4p/accessconfig/health.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/health.segments/!KG1haW4p/accessconfig.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/health.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/health.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig/health.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/health.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig/health.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig/install.html +1 -1
- package/.next/standalone/.next/server/app/accessconfig/install.rsc +3 -3
- package/.next/standalone/.next/server/app/accessconfig/install.segments/!KG1haW4p/accessconfig/install/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig/install.segments/!KG1haW4p/accessconfig/install.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/install.segments/!KG1haW4p/accessconfig.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/install.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/install.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/accessconfig/install.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/install.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig/install.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig/webhooks.html +1 -1
- package/.next/standalone/.next/server/app/accessconfig/webhooks.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/!KG1haW4p/accessconfig/webhooks/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/!KG1haW4p/accessconfig/webhooks.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/!KG1haW4p/accessconfig.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig.html +1 -1
- package/.next/standalone/.next/server/app/accessconfig.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig.segments/!KG1haW4p/accessconfig/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig.segments/!KG1haW4p/accessconfig.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/agents.html +1 -1
- package/.next/standalone/.next/server/app/agents.rsc +3 -3
- package/.next/standalone/.next/server/app/agents.segments/!KG1haW4p/agents/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/agents.segments/!KG1haW4p/agents.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/agents.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/agents.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/agents.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/agents.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/agents.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/agent/run/route.js +5 -5
- package/.next/standalone/.next/server/app/api/agent/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent/stream/route.js +3 -3
- package/.next/standalone/.next/server/app/api/agent/stream/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/debug/batch-tasks/[taskId]/route.js +5 -5
- package/.next/standalone/.next/server/app/api/debug/batch-tasks/[taskId]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/debug/execute/route.js +5 -5
- package/.next/standalone/.next/server/app/api/debug/execute/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/debug/grayscale-tasks/[taskId]/route.js +11 -11
- package/.next/standalone/.next/server/app/api/debug/grayscale-tasks/[taskId]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/eval/config/backfill-routing/route.js +4 -4
- package/.next/standalone/.next/server/app/api/eval/config/backfill-routing/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/eval/config/route.js +6 -6
- package/.next/standalone/.next/server/app/api/eval/config/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/eval/rejudge/route.js +6 -6
- package/.next/standalone/.next/server/app/api/eval/rejudge/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/eval/terminate-all/route.js +6 -6
- package/.next/standalone/.next/server/app/api/eval/terminate-all/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/eval/trajectory/run/route.js +9 -9
- package/.next/standalone/.next/server/app/api/eval/trajectory/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/evaluation/[id]/route.js +2 -2
- package/.next/standalone/.next/server/app/api/fault/diagnosis/stream/route.js +5 -5
- package/.next/standalone/.next/server/app/api/fault/diagnosis/stream/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ingest/opencode/session-complete/route.js +5 -5
- package/.next/standalone/.next/server/app/api/ingest/opencode/session-complete/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ingest/otel/v1/traces/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ingest/otel/v1/traces/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ingest/proxy/[taskId]/end/route.js +5 -5
- package/.next/standalone/.next/server/app/api/ingest/proxy/[taskId]/end/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ingest/setup/hermes-plugin/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/ingest/setup/hermes-plugin/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/ingest/setup/hermes-plugin/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/ingest/setup/hermes-plugin/route.js +7 -0
- package/.next/standalone/.next/server/app/api/ingest/setup/hermes-plugin/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/ingest/setup/hermes-plugin/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/ingest/setup/hermes-plugin/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/ingest/upload/route.js +7 -7
- package/.next/standalone/.next/server/app/api/ingest/upload/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/observe/data/route.js +4 -4
- package/.next/standalone/.next/server/app/api/observe/data/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/agent-debug/route.js +5 -5
- package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/agent-debug/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/agent-debug/skills-analysis/route.js +9 -9
- package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/agent-debug/skills-analysis/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/observe/task-stats/route.js +3 -3
- package/.next/standalone/.next/server/app/api/observe/task-stats/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/quality/agents/route.js +4 -4
- package/.next/standalone/.next/server/app/api/quality/agents/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/quality/executions/route.js +4 -4
- package/.next/standalone/.next/server/app/api/quality/executions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-eval/trigger/[skillName]/draft/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-eval/trigger/[skillName]/run/route.js +1 -1
- package/.next/standalone/.next/server/app/api/skill-eval/trigger/[skillName]/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-generator/attachments/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-generator/chat/route.js +5 -5
- package/.next/standalone/.next/server/app/api/skill-generator/chat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-generator/files/content/route.js +3 -3
- package/.next/standalone/.next/server/app/api/skill-generator/files/content/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-generator/files/download/route.js +5 -5
- package/.next/standalone/.next/server/app/api/skill-generator/files/download/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-generator/files/info/route.js +3 -3
- package/.next/standalone/.next/server/app/api/skill-generator/files/info/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-generator/files/list/route.js +3 -3
- package/.next/standalone/.next/server/app/api/skill-generator/files/list/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-opt/chat/route.js +4 -4
- package/.next/standalone/.next/server/app/api/skill-opt/chat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/benchmark-generate/route.js +5 -5
- package/.next/standalone/.next/server/app/api/skills/[id]/benchmark-generate/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/runs/route.js +3 -3
- package/.next/standalone/.next/server/app/api/skills/[id]/runs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/evaluate/route.js +2 -2
- package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/evaluation-summary/route.js +2 -2
- package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/files/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/logs/route.js +4 -4
- package/.next/standalone/.next/server/app/api/skills/logs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/user-evaluators/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/dashboard.html +1 -1
- package/.next/standalone/.next/server/app/dashboard.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard.segments/!KG1haW4p/dashboard/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard.segments/!KG1haW4p/dashboard.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dataset.html +1 -1
- package/.next/standalone/.next/server/app/dataset.rsc +3 -3
- package/.next/standalone/.next/server/app/dataset.segments/!KG1haW4p/dataset/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dataset.segments/!KG1haW4p/dataset.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dataset.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dataset.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dataset.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dataset.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dataset.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/eval/trajectory.html +1 -1
- package/.next/standalone/.next/server/app/eval/trajectory.rsc +3 -3
- package/.next/standalone/.next/server/app/eval/trajectory.segments/!KG1haW4p/eval/trajectory/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/eval/trajectory.segments/!KG1haW4p/eval/trajectory.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/eval/trajectory.segments/!KG1haW4p/eval.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/eval/trajectory.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/eval/trajectory.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/eval/trajectory.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/eval/trajectory.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/eval/trajectory.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/eval.html +1 -1
- package/.next/standalone/.next/server/app/eval.rsc +3 -3
- package/.next/standalone/.next/server/app/eval.segments/!KG1haW4p/eval/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/eval.segments/!KG1haW4p/eval.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/eval.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/eval.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/eval.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/eval.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/eval.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/fault.html +1 -1
- package/.next/standalone/.next/server/app/fault.rsc +3 -3
- package/.next/standalone/.next/server/app/fault.segments/!KG1haW4p/fault/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/fault.segments/!KG1haW4p/fault.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/fault.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/fault.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/fault.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/fault.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/fault.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login.html +1 -1
- package/.next/standalone/.next/server/app/login.rsc +2 -2
- package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/memory.html +1 -1
- package/.next/standalone/.next/server/app/memory.rsc +2 -2
- package/.next/standalone/.next/server/app/memory.segments/!KG1haW4p/memory/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/memory.segments/!KG1haW4p/memory.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/memory.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/memory.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/memory.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/memory.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/memory.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/metrics.html +1 -1
- package/.next/standalone/.next/server/app/metrics.rsc +3 -3
- package/.next/standalone/.next/server/app/metrics.segments/!KG1haW4p/metrics/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/metrics.segments/!KG1haW4p/metrics.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/metrics.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/metrics.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/metrics.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/metrics.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/metrics.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/modelconfig/registry.html +1 -1
- package/.next/standalone/.next/server/app/modelconfig/registry.rsc +3 -3
- package/.next/standalone/.next/server/app/modelconfig/registry.segments/!KG1haW4p/modelconfig/registry/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/modelconfig/registry.segments/!KG1haW4p/modelconfig/registry.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/modelconfig/registry.segments/!KG1haW4p/modelconfig.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/modelconfig/registry.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/modelconfig/registry.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/modelconfig/registry.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/modelconfig/registry.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/modelconfig/registry.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/modelconfig/web-search.html +1 -1
- package/.next/standalone/.next/server/app/modelconfig/web-search.rsc +3 -3
- package/.next/standalone/.next/server/app/modelconfig/web-search.segments/!KG1haW4p/modelconfig/web-search/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/modelconfig/web-search.segments/!KG1haW4p/modelconfig/web-search.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/modelconfig/web-search.segments/!KG1haW4p/modelconfig.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/modelconfig/web-search.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/modelconfig/web-search.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/modelconfig/web-search.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/modelconfig/web-search.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/modelconfig/web-search.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/modelconfig.html +1 -1
- package/.next/standalone/.next/server/app/modelconfig.rsc +2 -2
- package/.next/standalone/.next/server/app/modelconfig.segments/!KG1haW4p/modelconfig/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/modelconfig.segments/!KG1haW4p/modelconfig.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/modelconfig.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/modelconfig.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/modelconfig.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/modelconfig.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/modelconfig.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/optapi.html +1 -1
- package/.next/standalone/.next/server/app/optapi.rsc +2 -2
- package/.next/standalone/.next/server/app/optapi.segments/!KG1haW4p/optapi/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/optapi.segments/!KG1haW4p/optapi.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/optapi.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/optapi.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/optapi.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/optapi.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/optapi.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/quality.html +1 -1
- package/.next/standalone/.next/server/app/quality.rsc +3 -3
- package/.next/standalone/.next/server/app/quality.segments/!KG1haW4p/quality/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/quality.segments/!KG1haW4p/quality.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/quality.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/quality.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/quality.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/quality.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/quality.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/security.html +1 -1
- package/.next/standalone/.next/server/app/security.rsc +2 -2
- package/.next/standalone/.next/server/app/security.segments/!KG1haW4p/security/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/security.segments/!KG1haW4p/security.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/security.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/security.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/security.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/security.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/security.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-detail/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/skill-detail.html +1 -1
- package/.next/standalone/.next/server/app/skill-detail.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-detail.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-detail.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-detail.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-detail.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-detail.segments/skill-detail/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-detail.segments/skill-detail.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-eval/grayscale.html +2 -2
- package/.next/standalone/.next/server/app/skill-eval/grayscale.rsc +5 -5
- package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/!KG1haW4p/skill-eval/grayscale/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/!KG1haW4p/skill-eval/grayscale.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/!KG1haW4p/skill-eval.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/_full.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-eval.html +1 -1
- package/.next/standalone/.next/server/app/skill-eval.rsc +5 -5
- package/.next/standalone/.next/server/app/skill-eval.segments/!KG1haW4p/skill-eval/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/skill-eval.segments/!KG1haW4p/skill-eval.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-eval.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-eval.segments/_full.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/skill-eval.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-eval.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-eval.segments/_tree.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/skill-generator.html +1 -1
- package/.next/standalone/.next/server/app/skill-generator.rsc +3 -3
- package/.next/standalone/.next/server/app/skill-generator.segments/!KG1haW4p/skill-generator/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-generator.segments/!KG1haW4p/skill-generator.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-generator.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-generator.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/skill-generator.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-generator.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-generator.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-history.html +1 -1
- package/.next/standalone/.next/server/app/skill-history.rsc +3 -3
- package/.next/standalone/.next/server/app/skill-history.segments/!KG1haW4p/skill-history/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-history.segments/!KG1haW4p/skill-history.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-history.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-history.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/skill-history.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-history.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-history.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-opt.html +1 -1
- package/.next/standalone/.next/server/app/skill-opt.rsc +3 -3
- package/.next/standalone/.next/server/app/skill-opt.segments/!KG1haW4p/skill-opt/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-opt.segments/!KG1haW4p/skill-opt.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-opt.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-opt.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/skill-opt.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-opt.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-opt.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-release.html +1 -1
- package/.next/standalone/.next/server/app/skill-release.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-release.segments/!KG1haW4p/skill-release/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-release.segments/!KG1haW4p/skill-release.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-release.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-release.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-release.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skill-release.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-release.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skills.html +1 -1
- package/.next/standalone/.next/server/app/skills.rsc +4 -4
- package/.next/standalone/.next/server/app/skills.segments/!KG1haW4p/skills/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/skills.segments/!KG1haW4p/skills.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skills.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skills.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/skills.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skills.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skills.segments/_tree.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/trace.html +1 -1
- package/.next/standalone/.next/server/app/trace.rsc +3 -3
- package/.next/standalone/.next/server/app/trace.segments/!KG1haW4p/trace/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/trace.segments/!KG1haW4p/trace.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/trace.segments/!KG1haW4p.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/trace.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/trace.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/trace.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/trace.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app-paths-manifest.json +1 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__040b569f._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__045587bf._.js +6 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__bfd5933a._.js → [root-of-the-server]__0b0ca028._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e81c059._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1e033f42._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__35b27244._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__b88f14c0._.js → [root-of-the-server]__363f8caf._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__45f15a40._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5c5398f8._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__677bd848._.js +21 -21
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__d436a672._.js → [root-of-the-server]__6de56d9f._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__b57a53c2._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__b9ea78fe._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__7c29779d._.js → [root-of-the-server]__c5028c19._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ca706dfb._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__67e8aa0f._.js → [root-of-the-server]__cc29b58c._.js} +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__cc3948c5._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e8b45be8._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__eb171d10._.js +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__fef5bbd7._.js +1 -1
- package/.next/standalone/.next/server/chunks/_19441465._.js +370 -0
- package/.next/standalone/.next/server/chunks/{_1715c14d._.js → _1bd51141._.js} +1 -1
- package/.next/standalone/.next/server/chunks/_5041b697._.js +14 -14
- package/.next/standalone/.next/server/chunks/_73cb0d03._.js +1 -1
- package/.next/standalone/.next/server/chunks/_a0c6d359._.js +7 -7
- package/.next/standalone/.next/server/chunks/_b8c4ce57._.js +3 -0
- package/.next/standalone/.next/server/chunks/_c14dfae2._.js +1 -1
- package/.next/standalone/.next/server/chunks/_e0991a0e._.js +1 -1
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_ingest_setup_hermes-plugin_route_actions_212af014.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_3239b80e._.js +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_@langchain_core_dist_051f8412._.js +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_@langchain_core_dist_0cad7765._.js +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_@langchain_core_dist_8e3308fa._.js +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_@langchain_langgraph_dist_index_23ed4b74.js +25 -25
- package/.next/standalone/.next/server/chunks/node_modules_d933a926._.js +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_23ab65eb.js +39 -51
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_c4a195e5.js +1 -1
- package/.next/standalone/.next/server/chunks/node_modules_undici_206d7c0f._.js +15 -15
- package/.next/standalone/.next/server/chunks/src_34fb142e._.js +15 -15
- package/.next/standalone/.next/server/chunks/src_lib_1466262d._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_lib_5d86eca7._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_lib_7bae418f._.js +6 -0
- package/.next/standalone/.next/server/chunks/{src_lib_ac48c2f3._.js → src_lib_beee2d37._.js} +6 -6
- package/.next/standalone/.next/server/chunks/src_lib_c6d9db51._.js +3 -0
- package/.next/standalone/.next/server/chunks/{src_lib_3205a4fa._.js → src_lib_e361eb76._.js} +6 -6
- package/.next/standalone/.next/server/chunks/src_lib_engine_evaluation_d6ad3d54._.js +6 -6
- package/.next/standalone/.next/server/chunks/src_lib_engine_evaluation_evaluator-execution-recorder_ts_d7fedcdd._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_lib_engine_general-agent_970b1dfe._.js +3 -3
- package/.next/standalone/.next/server/chunks/src_lib_engine_skill-issues_static-evaluator_5e9f2d8a._.js +12 -7
- package/.next/standalone/.next/server/chunks/src_lib_ingest_1accb82d._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__dfea64df._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0141e5c7._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_10e7e5d6._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_633b8c91._.js → _231821bd._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_23385550._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_338db557._.js +1 -5
- package/.next/standalone/.next/server/chunks/ssr/_37d91d48._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_4796bd79._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_5e0dfc4e._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_5ea9f29c._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_ad052dd8._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_c16d64b3._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_cebf2190._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_cfe5178e._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_d4828542._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_d710ba85._.js +1 -5
- package/.next/standalone/.next/server/chunks/ssr/node_modules_05c89d2c._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_0b1debc8._.js +17 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_118dfa2f._.js +26 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_241c62ac._.js +31 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_264cd040._.js +11 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_3ae4ac61._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_42146d1f._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_4eadc088._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_564ffb11._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_5d8dc663._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_653b0c30._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_77281965._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_77b8869b._.js +17 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_7a0d9afc._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_7f5b5ff9._.js +45 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_7f7e9f17._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_7fe3c357._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_803c6412._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_8108cb01._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_831dfa9a._.js +17 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_971a1a98._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_9d323b89._.js +3 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/.next/standalone/.next/server/chunks/ssr/node_modules_@radix-ui_react-popper_dist_index_mjs_0d6fc757._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_a22450a1._.js +17 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_ab0108ca._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_cad8d256._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_d40eabb5._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_f89ffeff._.js +17 -0
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_2a7c4de9._.js → node_modules_fca55bff._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-5ZQYHXKU_mjs_9293a43d._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_chunks_mermaid_core_chunk-CSCIHK7Q_mjs_5da5edc3._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/node_modules_mermaid_dist_mermaid_core_mjs_a11916de._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_skill-eval_page_tsx_d6828614._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_components_evaluation_index_ts_95565210._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_components_ui_select_tsx_4c0f64d8._.js +1 -1
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +2 -2
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/{8b7ff3e53c4bbf8b.js → 0c7b05946b227f5a.js} +1 -5
- package/.next/standalone/.next/static/chunks/130e114057a9ebcd.js +1 -0
- package/.next/standalone/.next/static/chunks/14befe775870fecd.js +1 -0
- package/.next/standalone/.next/static/chunks/25ad82636e5b58a3.js +2 -0
- package/.next/{static/chunks/9b3f944a84387392.js → standalone/.next/static/chunks/3336df3d1032eecc.js} +1 -1
- package/.next/standalone/.next/static/chunks/43df5d7cd8ec46ff.js +1 -0
- package/.next/standalone/.next/static/chunks/463b43ecde7acc6b.js +1 -0
- package/.next/standalone/.next/static/chunks/{e5a2f98833719cb8.css → 5163848f38ac1cf6.css} +1 -1
- package/.next/standalone/.next/static/chunks/{30396061c28bf72c.js → 53af8dcc7be02445.js} +1 -1
- package/.next/standalone/.next/static/chunks/5e43a260c9f4f214.js +1 -0
- package/.next/{static/chunks/853a1f6bf3b6d443.js → standalone/.next/static/chunks/623f3222303930bb.js} +1 -1
- package/.next/{static/chunks/5407d16db75c16c3.js → standalone/.next/static/chunks/669150ee69928668.js} +1 -1
- package/.next/standalone/.next/static/chunks/6dbed19ae114b533.js +1 -0
- package/.next/standalone/.next/static/chunks/{9bdf47a06c8d728a.js → 72fce1376de53ff1.js} +1 -5
- package/.next/standalone/.next/static/chunks/7aff5373689149f6.css +1 -0
- package/.next/standalone/.next/static/chunks/{2f80f58326d89fa4.js → 7b15bab143d8c60f.js} +1 -1
- package/.next/{static/chunks/7ac51daef174f857.js → standalone/.next/static/chunks/83910a2aebec21cd.js} +1 -1
- package/.next/{static/chunks/4e25ec4dd6ef0459.js → standalone/.next/static/chunks/aab0b35af6737aed.js} +1 -1
- package/.next/standalone/.next/static/chunks/{7ac51daef174f857.js → ac4d824ecef761ad.js} +1 -1
- package/.next/standalone/.next/static/chunks/c44ecbd264254739.js +1 -0
- package/.next/standalone/.next/static/chunks/d04e17c648ef7960.js +4 -0
- package/.next/standalone/.next/static/chunks/e03cb31f10551f0b.js +119 -0
- package/.next/standalone/.next/static/chunks/e1ca3a6b74761a34.js +1 -0
- package/.next/standalone/.next/static/chunks/e4c086f27bba33f9.js +1 -0
- package/.next/standalone/.next/static/chunks/e623d8fba24bdb29.js +1 -0
- package/.next/standalone/.next/static/chunks/f4436f20374d2dbb.js +1 -0
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/scripts/hermes_agent_insight_plugin.py +882 -0
- package/.next/static/chunks/{8b7ff3e53c4bbf8b.js → 0c7b05946b227f5a.js} +1 -5
- package/.next/static/chunks/130e114057a9ebcd.js +1 -0
- package/.next/static/chunks/14befe775870fecd.js +1 -0
- package/.next/static/chunks/25ad82636e5b58a3.js +2 -0
- package/.next/{standalone/.next/static/chunks/9b3f944a84387392.js → static/chunks/3336df3d1032eecc.js} +1 -1
- package/.next/static/chunks/43df5d7cd8ec46ff.js +1 -0
- package/.next/static/chunks/463b43ecde7acc6b.js +1 -0
- package/.next/static/chunks/{e5a2f98833719cb8.css → 5163848f38ac1cf6.css} +1 -1
- package/.next/static/chunks/{30396061c28bf72c.js → 53af8dcc7be02445.js} +1 -1
- package/.next/static/chunks/5e43a260c9f4f214.js +1 -0
- package/.next/{standalone/.next/static/chunks/853a1f6bf3b6d443.js → static/chunks/623f3222303930bb.js} +1 -1
- package/.next/{standalone/.next/static/chunks/5407d16db75c16c3.js → static/chunks/669150ee69928668.js} +1 -1
- package/.next/static/chunks/6dbed19ae114b533.js +1 -0
- package/.next/static/chunks/{9bdf47a06c8d728a.js → 72fce1376de53ff1.js} +1 -5
- package/.next/static/chunks/7aff5373689149f6.css +1 -0
- package/.next/static/chunks/{2f80f58326d89fa4.js → 7b15bab143d8c60f.js} +1 -1
- package/.next/{standalone/.next/static/chunks/82647ed55d4480ce.js → static/chunks/83910a2aebec21cd.js} +1 -1
- package/.next/{standalone/.next/static/chunks/4e25ec4dd6ef0459.js → static/chunks/aab0b35af6737aed.js} +1 -1
- package/.next/static/chunks/ac4d824ecef761ad.js +1 -0
- package/.next/static/chunks/c44ecbd264254739.js +1 -0
- package/.next/static/chunks/d04e17c648ef7960.js +4 -0
- package/.next/static/chunks/e03cb31f10551f0b.js +119 -0
- package/.next/static/chunks/e1ca3a6b74761a34.js +1 -0
- package/.next/static/chunks/e4c086f27bba33f9.js +1 -0
- package/.next/static/chunks/e623d8fba24bdb29.js +1 -0
- package/.next/static/chunks/f4436f20374d2dbb.js +1 -0
- package/package.json +1 -1
- package/scripts/hermes_agent_insight_plugin.py +882 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__00c0800e._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2e16866c._.js +0 -6
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__52e5e5b6._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5782a103._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e80a8314._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__f7423c32._.js +0 -3
- package/.next/standalone/.next/server/chunks/_7ecc72d5._.js +0 -370
- package/.next/standalone/.next/server/chunks/_fbb1d006._.js +0 -3
- package/.next/standalone/.next/server/chunks/src_lib_68596f16._.js +0 -6
- package/.next/standalone/.next/server/chunks/src_lib_69eb724e._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__afc1fc82._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_1409f211._.js +0 -7
- package/.next/standalone/.next/server/chunks/ssr/_53a193b7._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_8e246656._.js +0 -7
- package/.next/standalone/.next/server/chunks/ssr/_c5121a52._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_ddf088e7._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_ff4f28a3._.js +0 -7
- package/.next/standalone/.next/server/chunks/ssr/node_modules_03a4e1e8._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_107e06c2._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_1478fd1a._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_28567d0f._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_2b979638._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_2be5a018._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_302487e0._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_327acc03._.js +0 -26
- package/.next/standalone/.next/server/chunks/ssr/node_modules_39d86cba._.js +0 -17
- package/.next/standalone/.next/server/chunks/ssr/node_modules_3c01063a._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_3e9eb0ee._.js +0 -11
- package/.next/standalone/.next/server/chunks/ssr/node_modules_3f93cf58._.js +0 -45
- package/.next/standalone/.next/server/chunks/ssr/node_modules_4327b3e7._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_4bea67c9._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_561578ad._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_5997198a._.js +0 -31
- package/.next/standalone/.next/server/chunks/ssr/node_modules_64378d98._.js +0 -17
- package/.next/standalone/.next/server/chunks/ssr/node_modules_6e79a594._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_7cccaf98._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_8ac545aa._.js +0 -17
- package/.next/standalone/.next/server/chunks/ssr/node_modules_9bf47e56._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_9f38447b._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_@mermaid-js_parser_dist_b213ca58._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_cdddc2e8._.js +0 -17
- package/.next/standalone/.next/server/chunks/ssr/node_modules_e51942b7._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_f9ad22f8._.js +0 -17
- package/.next/standalone/.next/static/chunks/01874bd5a7fda069.js +0 -5
- package/.next/standalone/.next/static/chunks/05f725ad2bd51889.js +0 -5
- package/.next/standalone/.next/static/chunks/28c31d9589800fe1.js +0 -1
- package/.next/standalone/.next/static/chunks/41708ee675c0cc34.js +0 -1
- package/.next/standalone/.next/static/chunks/8481480a23164da3.js +0 -1
- package/.next/standalone/.next/static/chunks/8552cadf84c26cfe.js +0 -4
- package/.next/standalone/.next/static/chunks/8dc215cff38e080b.js +0 -5
- package/.next/standalone/.next/static/chunks/a5d8acb3d2573b32.js +0 -1
- package/.next/standalone/.next/static/chunks/a7e72ad6eda9aad1.js +0 -5
- package/.next/standalone/.next/static/chunks/bb69bd8f3fb2597f.js +0 -1
- package/.next/standalone/.next/static/chunks/c356ee0aa836b01c.js +0 -2
- package/.next/standalone/.next/static/chunks/c7b67d9c0be1999f.js +0 -1
- package/.next/standalone/.next/static/chunks/cdad5bb63a64bc1a.js +0 -119
- package/.next/standalone/.next/static/chunks/e0b132c675c3513e.js +0 -1
- package/.next/standalone/.next/static/chunks/e6562c7e7bb67446.css +0 -1
- package/.next/static/chunks/01874bd5a7fda069.js +0 -5
- package/.next/static/chunks/05f725ad2bd51889.js +0 -5
- package/.next/static/chunks/28c31d9589800fe1.js +0 -1
- package/.next/static/chunks/41708ee675c0cc34.js +0 -1
- package/.next/static/chunks/82647ed55d4480ce.js +0 -1
- package/.next/static/chunks/8481480a23164da3.js +0 -1
- package/.next/static/chunks/8552cadf84c26cfe.js +0 -4
- package/.next/static/chunks/8dc215cff38e080b.js +0 -5
- package/.next/static/chunks/a5d8acb3d2573b32.js +0 -1
- package/.next/static/chunks/a7e72ad6eda9aad1.js +0 -5
- package/.next/static/chunks/bb69bd8f3fb2597f.js +0 -1
- package/.next/static/chunks/c356ee0aa836b01c.js +0 -2
- package/.next/static/chunks/c7b67d9c0be1999f.js +0 -1
- package/.next/static/chunks/cdad5bb63a64bc1a.js +0 -119
- package/.next/static/chunks/e0b132c675c3513e.js +0 -1
- package/.next/static/chunks/e6562c7e7bb67446.css +0 -1
- /package/.next/standalone/.next/static/{1I9NXkgb5T_a680craVmT → XvmH6p-x60yNMPW2ZorCE}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{1I9NXkgb5T_a680craVmT → XvmH6p-x60yNMPW2ZorCE}/_clientMiddlewareManifest.json +0 -0
- /package/.next/standalone/.next/static/{1I9NXkgb5T_a680craVmT → XvmH6p-x60yNMPW2ZorCE}/_ssgManifest.js +0 -0
- /package/.next/static/{1I9NXkgb5T_a680craVmT → XvmH6p-x60yNMPW2ZorCE}/_buildManifest.js +0 -0
- /package/.next/static/{1I9NXkgb5T_a680craVmT → XvmH6p-x60yNMPW2ZorCE}/_clientMiddlewareManifest.json +0 -0
- /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)
|