agent-insight 0.5.1 → 0.5.3
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/.env.example +6 -0
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +10 -0
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +51 -3
- package/.next/standalone/.next/routes-manifest.json +66 -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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(main)/fault/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/infra/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/infra/source/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(main)/infra/sources/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.js.nft.json +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.js.nft.json +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.js.nft.json +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/(main)/version-analysis/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/(main)/version-analysis/page/build-manifest.json +17 -0
- package/.next/standalone/.next/server/app/(main)/version-analysis/page/next-font-manifest.json +6 -0
- package/.next/standalone/.next/server/app/(main)/version-analysis/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/(main)/version-analysis/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/(main)/version-analysis/page.js +17 -0
- package/.next/standalone/.next/server/app/(main)/version-analysis/page.js.map +5 -0
- package/.next/standalone/.next/server/app/(main)/version-analysis/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/(main)/version-analysis/page_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/(main)/version-management/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/(main)/version-management/page/build-manifest.json +17 -0
- package/.next/standalone/.next/server/app/(main)/version-management/page/next-font-manifest.json +6 -0
- package/.next/standalone/.next/server/app/(main)/version-management/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/(main)/version-management/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/(main)/version-management/page.js +17 -0
- package/.next/standalone/.next/server/app/(main)/version-management/page.js.map +5 -0
- package/.next/standalone/.next/server/app/(main)/version-management/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/(main)/version-management/page_client-reference-manifest.js +2 -0
- 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 +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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 +5 -5
- package/.next/standalone/.next/server/app/accessconfig/channels.segments/!KG1haW4p/accessconfig/channels/__PAGE__.segment.rsc +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/accessconfig/channels.segments/_full.segment.rsc +5 -5
- 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 +3 -3
- 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 +5 -5
- package/.next/standalone/.next/server/app/accessconfig/health.segments/!KG1haW4p/accessconfig/health/__PAGE__.segment.rsc +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/accessconfig/health.segments/_full.segment.rsc +5 -5
- 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 +3 -3
- package/.next/standalone/.next/server/app/accessconfig/health.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/accessconfig/install.html +2 -2
- package/.next/standalone/.next/server/app/accessconfig/install.rsc +5 -5
- 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 +2 -2
- package/.next/standalone/.next/server/app/accessconfig/install.segments/_full.segment.rsc +5 -5
- 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 +3 -3
- 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 +5 -5
- package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/!KG1haW4p/accessconfig/webhooks/__PAGE__.segment.rsc +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/accessconfig/webhooks.segments/_full.segment.rsc +5 -5
- 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 +3 -3
- 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 +4 -4
- 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 +2 -2
- package/.next/standalone/.next/server/app/accessconfig.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/accessconfig.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/accessconfig.segments/_index.segment.rsc +3 -3
- 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 +5 -5
- 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 +2 -2
- package/.next/standalone/.next/server/app/agents.segments/_full.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/agents.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/agents.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/agents.segments/_tree.segment.rsc +2 -2
- 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.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent-datasets/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent-datasets/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agents/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agents/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/apikey/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/organization/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/dashboard/stats/route.js.nft.json +1 -1
- 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/batch-tasks/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/debug/execute/[jobId]/route.js.nft.json +1 -1
- 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 +10 -10
- package/.next/standalone/.next/server/app/api/debug/grayscale-tasks/[taskId]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/debug/grayscale-tasks/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/debug/history/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/debug/history/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/eval/config/backfill-routing/route.js +6 -6
- 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/create/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/eval/config/reparse/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/config/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/eval/evaluation/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/settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/eval/settings/test/route.js.nft.json +1 -1
- 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/results/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/eval/trajectory/results/route.js +5 -5
- package/.next/standalone/.next/server/app/api/eval/trajectory/results/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/eval/trajectory/run/route.js +13 -13
- package/.next/standalone/.next/server/app/api/eval/trajectory/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/eval/trajectory/runs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/evaluation/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/evaluation/cancel/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/fault/diagnosis/session/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/fault/diagnosis/stream/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/fleet/agent/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/fleet/agent/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/fleet/agent/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/fleet/agent/route.js +8 -0
- package/.next/standalone/.next/server/app/api/fleet/agent/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/fleet/agent/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/fleet/agent/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/fleet/breakdowns/route.js +1 -1
- package/.next/standalone/.next/server/app/api/fleet/breakdowns/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/fleet/trends/route.js +2 -2
- package/.next/standalone/.next/server/app/api/fleet/trends/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/guide/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ingest/opencode/session-complete/route.js +3 -3
- 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/logs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ingest/otel/v1/metrics/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ingest/otel/v1/traces/route.js +5 -5
- 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]/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ingest/proxy/[taskId]/end/route.js +9 -9
- 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/proxy/[taskId]/start/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ingest/setup/opencode-offline-fix/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/ingest/setup/opencode-offline-fix/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/ingest/setup/opencode-offline-fix/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/ingest/setup/opencode-offline-fix/route.js +7 -0
- package/.next/standalone/.next/server/app/api/ingest/setup/opencode-offline-fix/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/ingest/setup/opencode-offline-fix/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/ingest/setup/opencode-offline-fix/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/ingest/sync/manifest/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ingest/sync/opencode/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ingest/upload/route.js +8 -8
- package/.next/standalone/.next/server/app/api/ingest/upload/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/modelconfig/pricing/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/modelconfig/pricing/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/modelconfig/pricing/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/modelconfig/pricing/route.js +8 -0
- package/.next/standalone/.next/server/app/api/modelconfig/pricing/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/modelconfig/pricing/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/modelconfig/pricing/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/observe/data/route.js +3 -3
- 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.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/agent-debug/skills-analysis/route.js +13 -13
- 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/executions/[executionId]/analyze-match/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/infra/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/tags/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/tags/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/tags/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/tags/route.js +8 -0
- package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/tags/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/tags/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/observe/executions/[executionId]/tags/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/observe/infra/history/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/observe/infra/poll/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/observe/infra/sources/derive/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/observe/infra/sources/overview/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/observe/infra/sources/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/observe/infra/sources/sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/observe/infra/sources/test/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/observe/session/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/observe/version-analysis/compare/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/observe/version-analysis/compare/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/observe/version-analysis/compare/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/observe/version-analysis/compare/route.js +8 -0
- package/.next/standalone/.next/server/app/api/observe/version-analysis/compare/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/observe/version-analysis/compare/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/observe/version-analysis/compare/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/observe/version-analysis/tags/[tagId]/traces/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/observe/version-analysis/tags/[tagId]/traces/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/observe/version-analysis/tags/[tagId]/traces/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/observe/version-analysis/tags/[tagId]/traces/route.js +8 -0
- package/.next/standalone/.next/server/app/api/observe/version-analysis/tags/[tagId]/traces/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/observe/version-analysis/tags/[tagId]/traces/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/observe/version-analysis/tags/[tagId]/traces/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/public/otel/v1/traces/route.js +5 -5
- package/.next/standalone/.next/server/app/api/public/otel/v1/traces/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/quality/agents/route.js +7 -7
- package/.next/standalone/.next/server/app/api/quality/agents/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/quality/backfill/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/quality/executions/route.js +7 -7
- package/.next/standalone/.next/server/app/api/quality/executions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/quality/report/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]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-eval/trigger/[skillName]/run/[runId]/cancel/route.js.nft.json +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-eval/trigger/[skillName]/runs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-eval/trigger/[skillName]/upload/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.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-generator/download/[sessionId]/route.js.nft.json +1 -1
- 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.nft.json +1 -1
- 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.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-generator/sessions/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-generator/sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-opt/chat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-opt/plan/items/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-opt/plan/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-opt/sessions/[id]/iterations/[draftNumber]/apply/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-opt/sessions/[id]/iterations/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-opt/sessions/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skill-opt/sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/activate/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/benchmark-generate/route.js +7 -7
- 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 +2 -2
- 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]/toggle/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/download/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/evaluate/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/evaluation-summary/route.js.nft.json +1 -1
- 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/[id]/versions/[version]/parse-flow/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/versions/[version]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/[id]/versions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/automation/import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/automation/push/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/by-name/[name]/analysis-diagnosis/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/by-name/[name]/optimization-points/resolve/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/by-name/[name]/optimization-points/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/by-name/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/logs/route.js +6 -6
- package/.next/standalone/.next/server/app/api/skills/logs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/publish/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/sync-enterprise/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/upload/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tags/[id]/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/tags/[id]/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/tags/[id]/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/tags/[id]/route.js +8 -0
- package/.next/standalone/.next/server/app/api/tags/[id]/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/tags/[id]/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/tags/[id]/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/tags/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/tags/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/tags/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/tags/route.js +8 -0
- package/.next/standalone/.next/server/app/api/tags/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/tags/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/tags/route_client-reference-manifest.js +2 -0
- 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 +5 -5
- 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 +2 -2
- package/.next/standalone/.next/server/app/dashboard.segments/_full.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard.segments/_index.segment.rsc +3 -3
- 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 +5 -5
- 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 +2 -2
- package/.next/standalone/.next/server/app/dataset.segments/_full.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/dataset.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dataset.segments/_index.segment.rsc +3 -3
- 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 +5 -5
- 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 +2 -2
- package/.next/standalone/.next/server/app/eval/trajectory.segments/_full.segment.rsc +5 -5
- 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 +3 -3
- 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 +5 -5
- 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 +2 -2
- package/.next/standalone/.next/server/app/eval.segments/_full.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/eval.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/eval.segments/_index.segment.rsc +3 -3
- 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 +5 -5
- 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 +2 -2
- package/.next/standalone/.next/server/app/fault.segments/_full.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/fault.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/fault.segments/_index.segment.rsc +3 -3
- 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 +3 -3
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/infra/sources.html +1 -1
- package/.next/standalone/.next/server/app/infra/sources.rsc +5 -5
- package/.next/standalone/.next/server/app/infra/sources.segments/!KG1haW4p/infra/sources/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/infra/sources.segments/!KG1haW4p/infra/sources.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/infra/sources.segments/!KG1haW4p/infra.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/infra/sources.segments/!KG1haW4p.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/infra/sources.segments/_full.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/infra/sources.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/infra/sources.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/infra/sources.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/infra.html +1 -1
- package/.next/standalone/.next/server/app/infra.rsc +5 -5
- package/.next/standalone/.next/server/app/infra.segments/!KG1haW4p/infra/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/infra.segments/!KG1haW4p/infra.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/infra.segments/!KG1haW4p.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/infra.segments/_full.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/infra.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/infra.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/infra.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 +4 -4
- package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +3 -3
- 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 +2 -2
- 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 +5 -5
- package/.next/standalone/.next/server/app/memory.segments/!KG1haW4p/memory/__PAGE__.segment.rsc +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/memory.segments/_full.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/memory.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/memory.segments/_index.segment.rsc +3 -3
- 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 +5 -5
- 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 +2 -2
- package/.next/standalone/.next/server/app/metrics.segments/_full.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/metrics.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/metrics.segments/_index.segment.rsc +3 -3
- 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 +5 -5
- 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 +2 -2
- package/.next/standalone/.next/server/app/modelconfig/registry.segments/_full.segment.rsc +5 -5
- 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 +3 -3
- 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 +5 -5
- 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 +2 -2
- package/.next/standalone/.next/server/app/modelconfig/web-search.segments/_full.segment.rsc +5 -5
- 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 +3 -3
- 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 +4 -4
- 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 +2 -2
- package/.next/standalone/.next/server/app/modelconfig.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/modelconfig.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/modelconfig.segments/_index.segment.rsc +3 -3
- 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 +5 -5
- package/.next/standalone/.next/server/app/optapi.segments/!KG1haW4p/optapi/__PAGE__.segment.rsc +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/optapi.segments/_full.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/optapi.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/optapi.segments/_index.segment.rsc +3 -3
- 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 +5 -5
- 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 +2 -2
- package/.next/standalone/.next/server/app/quality.segments/_full.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/quality.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/quality.segments/_index.segment.rsc +3 -3
- 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 +5 -5
- package/.next/standalone/.next/server/app/security.segments/!KG1haW4p/security/__PAGE__.segment.rsc +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/security.segments/_full.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/security.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/security.segments/_index.segment.rsc +3 -3
- 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 +4 -4
- package/.next/standalone/.next/server/app/skill-detail.segments/_full.segment.rsc +4 -4
- 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 +3 -3
- 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 +2 -2
- 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 +6 -6
- 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 +2 -2
- package/.next/standalone/.next/server/app/skill-eval/grayscale.segments/_full.segment.rsc +6 -6
- 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 +3 -3
- 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 +6 -6
- package/.next/standalone/.next/server/app/skill-eval.segments/!KG1haW4p/skill-eval/__PAGE__.segment.rsc +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/skill-eval.segments/_full.segment.rsc +6 -6
- 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 +3 -3
- package/.next/standalone/.next/server/app/skill-eval.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/skill-generator.html +1 -1
- package/.next/standalone/.next/server/app/skill-generator.rsc +5 -5
- 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 +2 -2
- package/.next/standalone/.next/server/app/skill-generator.segments/_full.segment.rsc +5 -5
- 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 +3 -3
- 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 +6 -6
- 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 +2 -2
- package/.next/standalone/.next/server/app/skill-history.segments/_full.segment.rsc +6 -6
- 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 +3 -3
- 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 +5 -5
- 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 +2 -2
- package/.next/standalone/.next/server/app/skill-opt.segments/_full.segment.rsc +5 -5
- 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 +3 -3
- 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 +5 -5
- package/.next/standalone/.next/server/app/skill-release.segments/!KG1haW4p/skill-release/__PAGE__.segment.rsc +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/skill-release.segments/_full.segment.rsc +5 -5
- 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 +3 -3
- 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 +5 -5
- package/.next/standalone/.next/server/app/skills.segments/!KG1haW4p/skills/__PAGE__.segment.rsc +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/skills.segments/_full.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/skills.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skills.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/skills.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/trace.html +1 -1
- package/.next/standalone/.next/server/app/trace.rsc +7 -7
- 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 +2 -2
- package/.next/standalone/.next/server/app/trace.segments/_full.segment.rsc +7 -7
- package/.next/standalone/.next/server/app/trace.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/trace.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/trace.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/version-analysis.html +1 -0
- package/.next/standalone/.next/server/app/version-analysis.meta +16 -0
- package/.next/standalone/.next/server/app/version-analysis.rsc +23 -0
- package/.next/standalone/.next/server/app/version-analysis.segments/!KG1haW4p/version-analysis/__PAGE__.segment.rsc +9 -0
- package/.next/standalone/.next/server/app/version-analysis.segments/!KG1haW4p/version-analysis.segment.rsc +4 -0
- package/.next/standalone/.next/server/app/version-analysis.segments/!KG1haW4p.segment.rsc +7 -0
- package/.next/standalone/.next/server/app/version-analysis.segments/_full.segment.rsc +23 -0
- package/.next/standalone/.next/server/app/version-analysis.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/version-analysis.segments/_index.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/version-analysis.segments/_tree.segment.rsc +2 -0
- package/.next/standalone/.next/server/app/version-management.html +1 -0
- package/.next/standalone/.next/server/app/version-management.meta +16 -0
- package/.next/standalone/.next/server/app/version-management.rsc +22 -0
- package/.next/standalone/.next/server/app/version-management.segments/!KG1haW4p/version-management/__PAGE__.segment.rsc +9 -0
- package/.next/standalone/.next/server/app/version-management.segments/!KG1haW4p/version-management.segment.rsc +4 -0
- package/.next/standalone/.next/server/app/version-management.segments/!KG1haW4p.segment.rsc +7 -0
- package/.next/standalone/.next/server/app/version-management.segments/_full.segment.rsc +22 -0
- package/.next/standalone/.next/server/app/version-management.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/version-management.segments/_index.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/version-management.segments/_tree.segment.rsc +2 -0
- package/.next/standalone/.next/server/app-paths-manifest.json +10 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__096d00c3._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__28078c4e._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__4509f30c._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__51f686fd._.js +22 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5386e9b4._.js +22 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__5cb21a03._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__6fe0c73e._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__88e070f0._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8b872712._.js +22 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__98ce63c7._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__9f6a4627._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c875b500._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c8b9af98._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__cfcf074d._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__d754b2c2._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e60b9568._.js +22 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e8b9c639._.js +22 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__edc6a75f._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__f30eea21._.js +3 -0
- package/.next/standalone/.next/server/chunks/_05c80664._.js +1 -1
- package/.next/standalone/.next/server/chunks/_1c2f3589._.js +1 -1
- package/.next/standalone/.next/server/chunks/{_1a32fa23._.js → _5090183e._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{_e84c3e5f._.js → _6a203624._.js} +1 -1
- package/.next/standalone/.next/server/chunks/{_a0074544._.js → _70b9b972._.js} +1 -1
- package/.next/standalone/.next/server/chunks/_78c6471e._.js +1 -1
- package/.next/standalone/.next/server/chunks/{_547fcde4._.js → _d02fac80._.js} +2 -2
- package/.next/standalone/.next/server/chunks/_d043f698._.js +1 -1
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_fleet_agent_route_actions_b98e2c99.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_modelconfig_pricing_route_actions_bca6856d.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_tags_[id]_route_actions_a6f8b324.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_tags_route_actions_caf13f5f.js +3 -0
- package/.next/standalone/.next/server/chunks/bec2d_app_api_observe_version-analysis_tags_[tagId]_traces_route_actions_ff37f2d3.js +3 -0
- package/.next/standalone/.next/server/chunks/ce889_server_app_api_ingest_setup_opencode-offline-fix_route_actions_13b9e7e1.js +3 -0
- package/.next/standalone/.next/server/chunks/ce889_server_app_api_observe_executions_[executionId]_tags_route_actions_08aa41a4.js +3 -0
- package/.next/standalone/.next/server/chunks/ce889_server_app_api_observe_version-analysis_compare_route_actions_b48ab573.js +3 -0
- 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/src_lib_266d6cf4._.js +51 -0
- package/.next/standalone/.next/server/chunks/src_lib_5d95b500._.js +3 -0
- package/.next/standalone/.next/server/chunks/src_lib_67530201._.js +51 -0
- package/.next/standalone/.next/server/chunks/src_lib_9513f84d._.js +48 -0
- package/.next/standalone/.next/server/chunks/src_lib_9d09752c._.js +1 -1
- package/.next/standalone/.next/server/chunks/src_lib_a03a423b._.js +48 -0
- package/.next/standalone/.next/server/chunks/src_lib_a2a34aa6._.js +1 -1
- package/.next/standalone/.next/server/chunks/{src_lib_4751db31._.js → src_lib_dc72b90b._.js} +1 -1
- package/.next/standalone/.next/server/chunks/src_lib_ea85a447._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0eb5d21d._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__143c2f65._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__85e7edfe._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__c9cf8076._.js → [root-of-the-server]__90686664._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__96628a39._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__c69baa4a._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_051b1443._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0ae78458._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_400d0da3._.js → _1278164d._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_15e714f2._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_2f20fbfc._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_4e720925._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_5aa55aa6._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_8b68f69f._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_8d4b753e._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_976dfbab._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/_aab048d0._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_be1ffbbf._.js +12 -0
- package/.next/standalone/.next/server/chunks/ssr/_c815e0e7._.js +4 -0
- package/.next/standalone/.next/server/chunks/ssr/_e4c81263._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{_a3d5f9bc._.js → _e5ee8977._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_f634ea15._.js +12 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_(main)_version-analysis_page_actions_479d49a7.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_(main)_version-management_page_actions_aea5ae93.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_a443e166._.js → node_modules_3b1fd8eb._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/node_modules_7680a21d._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_bda25b86._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_bfffaa78._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_2e7afafc._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_cd0b182b._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_accessconfig_install_page_tsx_6f4ef3fc._.js +3 -3
- package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_dashboard_page_tsx_7eac7774._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_modelconfig_registry_page_tsx_1ead2fd4._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_quality_page_tsx_26bb8e80._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_trace_page_tsx_41e7865d._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_version-analysis_page_tsx_63ae8791._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_app_(main)_version-management_page_tsx_87fe0372._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/src_components_ui_select_tsx_4c0f64d8._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_lib_client_locale-context_tsx_7184d9aa._.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/0257c68e82e9f2b0.js +1 -0
- package/.next/standalone/.next/static/chunks/{8754e0cf40813330.js → 06ac4297aa02f40a.js} +1 -1
- package/.next/standalone/.next/static/chunks/0fe047909a490ef0.js +1 -0
- package/.next/standalone/.next/static/chunks/151b95e65092aa16.js +1 -0
- package/.next/standalone/.next/static/chunks/1624a1adcb73d784.js +1 -0
- package/.next/standalone/.next/static/chunks/1cb2cee6b2f89fb7.js +1 -0
- package/.next/standalone/.next/static/chunks/1f173de64ad85757.js +10 -0
- package/.next/standalone/.next/static/chunks/{4dcd21eef469e66b.js → 2064add303799ffc.js} +1 -1
- package/.next/standalone/.next/static/chunks/25a9b2907e03a172.css +1 -0
- package/.next/standalone/.next/static/chunks/2fb55cc737806639.js +1 -0
- package/.next/standalone/.next/static/chunks/30a686796d86273c.js +1 -0
- package/.next/standalone/.next/static/chunks/3184105f3d2b47a1.js +10 -0
- package/.next/standalone/.next/static/chunks/379315313d164a57.js +1 -0
- package/.next/standalone/.next/static/chunks/39157b51ed6489eb.js +1 -0
- package/.next/standalone/.next/static/chunks/{dc22f906bd43e9a3.js → 46308ae9f83ac112.js} +3 -3
- package/.next/standalone/.next/static/chunks/4b72abe72a9b6cd9.js +6 -0
- package/.next/standalone/.next/static/chunks/54538e1a80e53392.js +1 -0
- package/.next/standalone/.next/static/chunks/599fdc4cf6eb9e95.js +1 -0
- package/.next/standalone/.next/static/chunks/63220d0acc5073cc.js +1 -0
- package/.next/standalone/.next/static/chunks/6da1d3424f804755.js +1 -0
- package/.next/standalone/.next/static/chunks/6e6f2418240877c6.js +1 -0
- package/.next/standalone/.next/static/chunks/8668d6f4c34d1e67.js +3 -0
- package/.next/standalone/.next/static/chunks/946d260668afc16b.js +1 -0
- package/.next/standalone/.next/static/chunks/97822ca2c186f93d.js +1 -0
- package/.next/{static/chunks/96c7e2e47438553a.js → standalone/.next/static/chunks/98588c35b1e00bea.js} +1 -1
- package/.next/standalone/.next/static/chunks/a99fb4f44f9a41f3.js +1 -0
- package/.next/standalone/.next/static/chunks/b223106f6c610a67.js +1 -0
- package/.next/standalone/.next/static/chunks/b5e671771efd9e7d.js +1 -0
- package/.next/standalone/.next/static/chunks/cc9a7b6a8edabe81.js +1 -0
- package/.next/standalone/.next/static/chunks/cfb3924a60d22c64.js +1 -0
- package/.next/standalone/.next/static/chunks/d15d7f6146b85000.js +1 -0
- package/.next/standalone/.next/static/chunks/dee90c3e29cd39bb.js +1 -0
- package/.next/standalone/.next/static/chunks/{bf909bd0ff1898e4.js → f6954ae67d81050e.js} +1 -1
- package/.next/standalone/.next/static/chunks/fc7f5db841a7032a.js +1 -0
- package/.next/standalone/Evaluation_and_Research/agent_evaluator_research_qna_2.md +1312 -0
- package/.next/standalone/Evaluation_and_Research/agent_evaluator_research_qna_3.md +712 -0
- package/.next/standalone/Evaluation_and_Research/agent_evaluator_research_qna_4.md +1228 -0
- package/.next/standalone/docker-compose.amd64.yml +1 -1
- package/.next/standalone/node_modules/.prisma/client/edge.js +26 -3
- package/.next/standalone/node_modules/.prisma/client/index-browser.js +23 -0
- package/.next/standalone/node_modules/.prisma/client/index.js +26 -3
- package/.next/standalone/node_modules/.prisma/client/package.json +1 -1
- package/.next/standalone/node_modules/.prisma/client/schema.prisma +39 -0
- package/.next/standalone/node_modules/.prisma/client/wasm.js +23 -0
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/prisma/schema.prisma +38 -0
- package/.next/standalone/scripts/opencode-offline-fix.ps1 +93 -0
- package/.next/standalone/scripts/opencode_tui_plugin.tsx +23 -1
- package/.next/static/chunks/0257c68e82e9f2b0.js +1 -0
- package/.next/static/chunks/{8754e0cf40813330.js → 06ac4297aa02f40a.js} +1 -1
- package/.next/static/chunks/0fe047909a490ef0.js +1 -0
- package/.next/static/chunks/151b95e65092aa16.js +1 -0
- package/.next/static/chunks/1624a1adcb73d784.js +1 -0
- package/.next/static/chunks/1cb2cee6b2f89fb7.js +1 -0
- package/.next/static/chunks/1f173de64ad85757.js +10 -0
- package/.next/static/chunks/{4dcd21eef469e66b.js → 2064add303799ffc.js} +1 -1
- package/.next/static/chunks/25a9b2907e03a172.css +1 -0
- package/.next/static/chunks/2fb55cc737806639.js +1 -0
- package/.next/static/chunks/30a686796d86273c.js +1 -0
- package/.next/static/chunks/3184105f3d2b47a1.js +10 -0
- package/.next/static/chunks/379315313d164a57.js +1 -0
- package/.next/static/chunks/39157b51ed6489eb.js +1 -0
- package/.next/static/chunks/{dc22f906bd43e9a3.js → 46308ae9f83ac112.js} +3 -3
- package/.next/static/chunks/4b72abe72a9b6cd9.js +6 -0
- package/.next/static/chunks/54538e1a80e53392.js +1 -0
- package/.next/static/chunks/599fdc4cf6eb9e95.js +1 -0
- package/.next/static/chunks/63220d0acc5073cc.js +1 -0
- package/.next/static/chunks/6da1d3424f804755.js +1 -0
- package/.next/static/chunks/6e6f2418240877c6.js +1 -0
- package/.next/static/chunks/8668d6f4c34d1e67.js +3 -0
- package/.next/static/chunks/946d260668afc16b.js +1 -0
- package/.next/static/chunks/97822ca2c186f93d.js +1 -0
- package/.next/{standalone/.next/static/chunks/96c7e2e47438553a.js → static/chunks/98588c35b1e00bea.js} +1 -1
- package/.next/static/chunks/a99fb4f44f9a41f3.js +1 -0
- package/.next/static/chunks/b223106f6c610a67.js +1 -0
- package/.next/static/chunks/b5e671771efd9e7d.js +1 -0
- package/.next/static/chunks/cc9a7b6a8edabe81.js +1 -0
- package/.next/static/chunks/cfb3924a60d22c64.js +1 -0
- package/.next/static/chunks/d15d7f6146b85000.js +1 -0
- package/.next/static/chunks/dee90c3e29cd39bb.js +1 -0
- package/.next/static/chunks/{bf909bd0ff1898e4.js → f6954ae67d81050e.js} +1 -1
- package/.next/static/chunks/fc7f5db841a7032a.js +1 -0
- package/package.json +1 -1
- package/prisma/schema.prisma +38 -0
- package/scripts/opencode-offline-fix.ps1 +93 -0
- package/scripts/opencode_tui_plugin.tsx +23 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2574e6ed._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__2710fb53._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8cc92af1._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__9d2e5f60._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__bd3dc3ab._.js +0 -3
- package/.next/standalone/.next/server/chunks/src_lib_6cb48964._.js +0 -32
- package/.next/standalone/.next/server/chunks/src_lib_a3155704._.js +0 -3
- package/.next/standalone/.next/server/chunks/src_lib_baaf83ef._.js +0 -29
- package/.next/standalone/.next/server/chunks/src_lib_bf0ee699._.js +0 -32
- package/.next/standalone/.next/server/chunks/src_lib_dbf3c792._.js +0 -29
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__2ec2bb09._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__3cb83dc3._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__fc94ba06._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0141e5c7._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_0acdaaae._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_231821bd._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_5d1f8671._.js +0 -12
- package/.next/standalone/.next/server/chunks/ssr/_8bba8b8d._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_96725836._.js +0 -12
- package/.next/standalone/.next/server/chunks/ssr/_b08dc931._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/_c4db9cec._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_8bfa35b3._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_30858f09._.js +0 -3
- package/.next/standalone/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_f1e06ad8._.js +0 -3
- package/.next/standalone/.next/static/chunks/0b6bd84bf10579a4.js +0 -10
- package/.next/standalone/.next/static/chunks/0bca64d67dceae3f.js +0 -1
- package/.next/standalone/.next/static/chunks/16047b19dda5c90d.js +0 -10
- package/.next/standalone/.next/static/chunks/3a0f454536f3ebc8.js +0 -1
- package/.next/standalone/.next/static/chunks/3d19f62114122bd3.js +0 -1
- package/.next/standalone/.next/static/chunks/3d6127f72467176d.js +0 -1
- package/.next/standalone/.next/static/chunks/44545e70bb7a33b8.js +0 -1
- package/.next/standalone/.next/static/chunks/4e52a5c5e332595a.js +0 -1
- package/.next/standalone/.next/static/chunks/6238734a2f04b1f9.js +0 -1
- package/.next/standalone/.next/static/chunks/66b23011cd8544ad.js +0 -1
- package/.next/standalone/.next/static/chunks/7a758615e3d35d6d.js +0 -1
- package/.next/standalone/.next/static/chunks/7a7dc24eed0484dc.js +0 -1
- package/.next/standalone/.next/static/chunks/7d4fa817c5229801.js +0 -1
- package/.next/standalone/.next/static/chunks/8f18a711543d804a.js +0 -1
- package/.next/standalone/.next/static/chunks/9155a6c07dc0502d.js +0 -6
- package/.next/standalone/.next/static/chunks/94fdb955b1dc512a.js +0 -1
- package/.next/standalone/.next/static/chunks/97b8d7ea5d04e2a2.js +0 -1
- package/.next/standalone/.next/static/chunks/a31bf4e176b5e90c.js +0 -3
- package/.next/standalone/.next/static/chunks/b9597989b5b0abd3.js +0 -1
- package/.next/standalone/.next/static/chunks/d170174df1128338.js +0 -1
- package/.next/standalone/.next/static/chunks/d91c2c0bbe0b59ab.js +0 -1
- package/.next/standalone/.next/static/chunks/e159d293fc72e91b.css +0 -1
- package/.next/standalone/.next/static/chunks/e45a4e085c7ce03c.js +0 -1
- package/.next/standalone/.next/static/chunks/ffd21617593aaafd.js +0 -1
- package/.next/standalone/scripts/activate_telemetry.sh +0 -202
- package/.next/standalone/scripts/insight-paths.js +0 -33
- package/.next/standalone/scripts/opencode_otel_schema.ts +0 -73
- package/.next/standalone/scripts/opencode_plugin.ts +0 -1063
- package/.next/static/chunks/0b6bd84bf10579a4.js +0 -10
- package/.next/static/chunks/0bca64d67dceae3f.js +0 -1
- package/.next/static/chunks/16047b19dda5c90d.js +0 -10
- package/.next/static/chunks/3a0f454536f3ebc8.js +0 -1
- package/.next/static/chunks/3d19f62114122bd3.js +0 -1
- package/.next/static/chunks/3d6127f72467176d.js +0 -1
- package/.next/static/chunks/44545e70bb7a33b8.js +0 -1
- package/.next/static/chunks/4e52a5c5e332595a.js +0 -1
- package/.next/static/chunks/6238734a2f04b1f9.js +0 -1
- package/.next/static/chunks/66b23011cd8544ad.js +0 -1
- package/.next/static/chunks/7a758615e3d35d6d.js +0 -1
- package/.next/static/chunks/7a7dc24eed0484dc.js +0 -1
- package/.next/static/chunks/7d4fa817c5229801.js +0 -1
- package/.next/static/chunks/8f18a711543d804a.js +0 -1
- package/.next/static/chunks/9155a6c07dc0502d.js +0 -6
- package/.next/static/chunks/94fdb955b1dc512a.js +0 -1
- package/.next/static/chunks/97b8d7ea5d04e2a2.js +0 -1
- package/.next/static/chunks/a31bf4e176b5e90c.js +0 -3
- package/.next/static/chunks/b9597989b5b0abd3.js +0 -1
- package/.next/static/chunks/d170174df1128338.js +0 -1
- package/.next/static/chunks/d91c2c0bbe0b59ab.js +0 -1
- package/.next/static/chunks/e159d293fc72e91b.css +0 -1
- package/.next/static/chunks/e45a4e085c7ce03c.js +0 -1
- package/.next/static/chunks/ffd21617593aaafd.js +0 -1
- package/scripts/activate_telemetry.sh +0 -202
- package/scripts/insight-paths.js +0 -33
- package/scripts/opencode_otel_schema.ts +0 -73
- package/scripts/opencode_plugin.ts +0 -1063
- /package/.next/standalone/.next/static/{xzZesDmllz08gJIxUNkXr → VeFGnFbPjqrwSXp9h5AgX}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{xzZesDmllz08gJIxUNkXr → VeFGnFbPjqrwSXp9h5AgX}/_clientMiddlewareManifest.json +0 -0
- /package/.next/standalone/.next/static/{xzZesDmllz08gJIxUNkXr → VeFGnFbPjqrwSXp9h5AgX}/_ssgManifest.js +0 -0
- /package/.next/static/{xzZesDmllz08gJIxUNkXr → VeFGnFbPjqrwSXp9h5AgX}/_buildManifest.js +0 -0
- /package/.next/static/{xzZesDmllz08gJIxUNkXr → VeFGnFbPjqrwSXp9h5AgX}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{xzZesDmllz08gJIxUNkXr → VeFGnFbPjqrwSXp9h5AgX}/_ssgManifest.js +0 -0
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[901411,e=>{"use strict";var n=e.i(747909),t=e.i(174017),i=e.i(996250),o=e.i(759756),s=e.i(561916),_=e.i(174677),r=e.i(869741),E=e.i(316795),a=e.i(487718),l=e.i(995169),I=e.i(47587),N=e.i(666012),T=e.i(570101),S=e.i(626937),c=e.i(10372),h=e.i(193695);e.i(52474);var d=e.i(600220),O=e.i(89171);function $(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\$/g,"\\$").replace(/`/g,"\\`")}function u(e){return e.replace(/`/g,"``").replace(/"/g,'`"').replace(/\$/g,"`$")}async function g(e){let n,t,i=e.headers.get("x-forwarded-host")||e.headers.get("host")||"127.0.0.1:3000",o=e.headers.get("x-forwarded-proto")||"https",s=new URL(e.url),_=process.env.NEXT_PUBLIC_URL_PREFIX||"",r=`${o}://${i}${_}`,E=s.searchParams.get("key")||s.searchParams.get("apiKey")||"",a=s.searchParams.get("yes")??s.searchParams.get("y")??s.searchParams.get("noninteractive"),l=null!==a&&!["0","false","no"].includes(a.trim().toLowerCase()),I=(s.searchParams.get("frameworks")||s.searchParams.get("framework")||"opencode").trim()||"opencode",N=s.searchParams.get("nokey")??s.searchParams.get("no-key"),T=null!==N&&!["0","false","no"].includes(N.trim().toLowerCase());if("windows"==(n=e.headers.get("user-agent")||"",(t=e.headers.get("x-platform")||"")?"windows"===t.toLowerCase()?"windows":"unix":n.toLowerCase().includes("windows")?"windows":"unix")){let e=function(e,n,t,i=!1,o="opencode",s=!1){return["# =============================================================================\n# Agent-insight One-Click Setup (PowerShell)\n# =============================================================================\n",'$AGENT_INSIGHT_HOST = "'+u(e)+'"','$AGENT_INSIGHT_BASE_URL = "'+u(n)+'"','$AGENT_INSIGHT_SETUP_API_KEY = "'+u(t)+'"','\n# ── 非交互模式(?yes=1 / ?nokey=1,或 env):全程无提示,默认只装 opencode ──────\n# iex (irm "<host>/api/ingest/setup?yes=1&nokey=1")\n# 或 env: $env:AGENT_INSIGHT_NONINTERACTIVE=1; $env:AGENT_INSIGHT_NO_KEY=1',"$NONINTERACTIVE = $"+(i?"true":"false"),'$NONINTERACTIVE_FRAMEWORKS = "'+u(o||"opencode")+'"',"$FORCE_NO_KEY = $"+(s?"true":"false"),'if ($env:AGENT_INSIGHT_NONINTERACTIVE -eq "1" -or $env:AGENT_INSIGHT_NONINTERACTIVE -eq "true") { $NONINTERACTIVE = $true }\nif ($env:AGENT_INSIGHT_NO_KEY -eq "1" -or $env:AGENT_INSIGHT_NO_KEY -eq "true") { $FORCE_NO_KEY = $true }\nif ($NONINTERACTIVE) { Write-Host "🤖 非交互模式:跳过所有提示,安装框架 = $NONINTERACTIVE_FRAMEWORKS" }\n\nWrite-Host "🚀 Fetching Agent-insight telemetry components from $AGENT_INSIGHT_BASE_URL..."\n\n# 0. Check Node.js version\n$nodeCmd = Get-Command node -ErrorAction SilentlyContinue\nif (-not $nodeCmd) {\n Write-Host "❌ Error: Node.js is not installed." -ForegroundColor Red\n Write-Host " Agent-insight requires Node.js 20 or higher."\n Write-Host " Please install Node.js: https://nodejs.org/"\n exit 1\n}\n\n$nodeVersion = (node -v 2>$null) -replace "^v", ""\n$nodeMajor = $nodeVersion.Split(".")[0]\nif ([int]$nodeMajor -lt 20) {\n Write-Host "❌ Error: Node.js version $nodeVersion is not supported." -ForegroundColor Red\n Write-Host " Agent-insight requires Node.js 20 or higher."\n Write-Host " Please upgrade your Node.js version: https://nodejs.org/"\n exit 1\n}\nWrite-Host "✅ Node.js version: $nodeVersion"\n\n# 1. Setup Directories\n$homeDir = $env:USERPROFILE\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.agent-insight" | Out-Null\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.agent-insight\\logs" | Out-Null\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.opencode\\skills" | Out-Null\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.claude\\projects" | Out-Null\nNew-Item -ItemType Directory -Force -Path ".opencode\\skills" | Out-Null\nWrite-Host "📂 Created necessary directories"\n\n# 2. Framework Selection(非交互模式跳过 inquirer,用默认 $NONINTERACTIVE_FRAMEWORKS)\nWrite-Host ""\n\nif ($NONINTERACTIVE) {\n $SELECTED_FRAMEWORKS = $NONINTERACTIVE_FRAMEWORKS\n} else {\n\n$SELECTOR_SCRIPT = "$homeDir\\.agent-insight\\framework_selector.mjs"\n$SELECTOR_RESULT = "$homeDir\\.agent-insight\\.selector_result"\n\n# Install inquirer and tsx if not already installed\nSet-Location "$homeDir\\.agent-insight"\nif (-not (Test-Path "package.json")) {\n \'{"name": "agent-insight-setup", "version": "1.0.0", "type": "module", "dependencies": {}}\' | Out-File -FilePath "package.json" -Encoding utf8\n}\nif (-not (Test-Path "node_modules\\inquirer") -or -not (Test-Path "node_modules\\tsx")) {\n Write-Host "📦 Installing dependencies for interactive selection..."\n npm install inquirer tsx --save 2>$null\n}\n\n$selectorContent = @\'\nimport inquirer from \'inquirer\';\nimport fs from \'fs\';\n\nconst frameworks = [\n { name: \'OpenCode\', value: \'opencode\' },\n { name: \'Claude Code\', value: \'claude\' },\n { name: \'Hermes\', value: \'hermes\' },\n { name: \'JiuwenSwarm\', value: \'jiuwen\' }\n];\n\nasync function select() {\n console.log(\'\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'╔══════════════════════════════════════════════════════════╗\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'║ ║\');\n console.log(\'\\x1b[1m\\x1b[36m%s\\x1b[0m\', \'║ ✨ Agent-insight ✨ ║\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'║ ║\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'╚══════════════════════════════════════════════════════════╝\');\n console.log(\'\');\n console.log(\'\\x1b[90m%s\\x1b[0m\', \' 提示: ↑↓ 移动 | 空格 选择 | a 全选 | i 反选 | Enter 确认\');\n console.log(\'\');\n\n const answers = await inquirer.prompt([\n {\n type: \'checkbox\',\n name: \'frameworks\',\n message: \'集成到:\',\n choices: frameworks,\n default: [\'opencode\'],\n pageSize: 10,\n loop: false\n }\n ]);\n\n const selected = answers.frameworks;\n \n if (selected.length > 0) {\n console.log(\'\');\n console.log(\'\\x1b[32m%s\\x1b[0m\', \'✅ 将安装以下组件:\');\n selected.forEach(fw => {\n const name = frameworks.find(f => f.value === fw)?.name || fw;\n console.log(\'\\x1b[32m%s\\x1b[0m\', \' • \' + name);\n });\n console.log(\'\');\n } else {\n console.log(\'\');\n console.log(\'\\x1b[33m%s\\x1b[0m\', \'⚠️ 未选择任何组件,将不进行安装。\');\n console.log(\'\');\n }\n\n const resultFile = process.env.SELECTOR_RESULT_FILE || process.env.USERPROFILE + \'\\\\.agent-insight\\\\.selector_result\';\n fs.writeFileSync(resultFile, selected.join(\',\'));\n}\n\nselect().catch(err => {\n console.error(\'Error:\', err);\n process.exit(1);\n});\n\'@\n\nSet-Content -Path $SELECTOR_SCRIPT -Value $selectorContent -Encoding UTF8\n\n# Run the selector interactively\n$env:SELECTOR_RESULT_FILE = $SELECTOR_RESULT\nSet-Location "$homeDir\\.agent-insight"\nnpx -y tsx $SELECTOR_SCRIPT\n\n# Read the selection result from file\nif (Test-Path $SELECTOR_RESULT) {\n $SELECTED_FRAMEWORKS = Get-Content $SELECTOR_RESULT\n Remove-Item $SELECTOR_RESULT -Force\n} else {\n $SELECTED_FRAMEWORKS = ""\n}\n} # end: 交互 vs 非交互 框架选择\n\n# Set installation flags based on selection\n$INSTALL_OPENCODE = $false\n$INSTALL_CLAUDE = $false\n$INSTALL_HERMES = $false\n$INSTALL_JIUWEN = $false\n\nif ($SELECTED_FRAMEWORKS -match "opencode") {\n $INSTALL_OPENCODE = $true\n}\nif ($SELECTED_FRAMEWORKS -match "claude") {\n $INSTALL_CLAUDE = $true\n}\nif ($SELECTED_FRAMEWORKS -match "hermes") {\n $INSTALL_HERMES = $true\n}\nif ($SELECTED_FRAMEWORKS -match "jiuwen") {\n $INSTALL_JIUWEN = $true\n}\n\n# Exit if nothing selected\nif (-not $INSTALL_OPENCODE -and -not $INSTALL_CLAUDE -and -not $INSTALL_HERMES -and -not $INSTALL_JIUWEN) {\n Write-Host "⚠️ 未选择任何框架组件,将跳过插件安装。"\n Write-Host " 继续执行配置步骤..."\n Write-Host ""\n}\n\n# 3. Download Components\nif ($INSTALL_OPENCODE) {\n Write-Host "⏬ Downloading OpenCode Plugin..."\n $opencodeConfigDir = Join-Path $homeDir ".config\\opencode"\n New-Item -ItemType Directory -Path (Join-Path $opencodeConfigDir "plugins") -Force | Out-Null\n Remove-Item -Path (Join-Path $opencodeConfigDir "plugins\\Skill-Insight.ts") -Force -ErrorAction SilentlyContinue\n Remove-Item -Path (Join-Path $opencodeConfigDir "plugins\\Witty-Skill-Insight.ts") -Force -ErrorAction SilentlyContinue\n Remove-Item -Path (Join-Path $homeDir ".opencode\\plugins\\Skill-Insight.ts") -Force -ErrorAction SilentlyContinue\n Remove-Item -Path (Join-Path $homeDir ".opencode\\plugins\\Witty-Skill-Insight.ts") -Force -ErrorAction SilentlyContinue\n Invoke-WebRequest -Uri "$AGENT_INSIGHT_BASE_URL/api/setup/opencode" -OutFile (Join-Path $opencodeConfigDir "plugins\\Witty-Skill-Insight.ts")\n Write-Host "⏬ Downloading OpenCode Uploader..."\n Invoke-WebRequest -Uri "$AGENT_INSIGHT_BASE_URL/api/setup/opencode-uploader" -OutFile (Join-Path $homeDir ".agent-insight\\opencode_uploader_client.js")\n Write-Host "⏬ Downloading OpenCode TUI Plugin..."\n $tuiPluginPath = (Join-Path $opencodeConfigDir "plugins\\Witty-Skill-Insight.tui.tsx")\n Invoke-WebRequest -Uri "$AGENT_INSIGHT_BASE_URL/api/setup/opencode-tui" -OutFile $tuiPluginPath\n $tuiConfigFile = (Join-Path $opencodeConfigDir "tui.json")\n try {\n $data = @{}\n if (Test-Path $tuiConfigFile) {\n $raw = Get-Content $tuiConfigFile -Raw\n if ($raw -and $raw.Trim()) { $data = $raw | ConvertFrom-Json }\n }\n if (-not $data.plugin) { $data | Add-Member -MemberType NoteProperty -Name plugin -Value @() -Force }\n if ($data.plugin -notcontains $tuiPluginPath) { $data.plugin += $tuiPluginPath }\n $data | ConvertTo-Json -Depth 10 | Set-Content -Path $tuiConfigFile -Encoding UTF8\n } catch {\n Write-Host "⚠️ Failed to patch tui.json for TUI plugin."\n }\n}\n\nif ($INSTALL_CLAUDE) {\n Write-Host "🛰️ Claude Code will use official OpenTelemetry logs; no session-file watcher is required."\n}\n\nif ($INSTALL_HERMES) {\n Write-Host "Installing Agent Insight Hermes plugin..."\n $hermesHome = if ($env:HERMES_HOME) { $env:HERMES_HOME } else { Join-Path $homeDir ".hermes" }\n $hermesPluginDir = Join-Path $hermesHome "plugins\\agent_insight_hermes"\n New-Item -ItemType Directory -Path $hermesPluginDir -Force | Out-Null\n Invoke-WebRequest -Uri "$AGENT_INSIGHT_BASE_URL/api/setup/hermes-plugin" -OutFile (Join-Path $hermesPluginDir "__init__.py")\n @("name: agent_insight_hermes", "version: 0.2.0", "description: Agent Insight telemetry for Hermes", "provides_hooks:", " - pre_llm_call", " - post_llm_call", " - pre_api_request", " - post_api_request", " - api_request_error", " - pre_tool_call", " - post_tool_call", " - subagent_start", " - subagent_stop", " - on_session_end") | Set-Content -Path (Join-Path $hermesPluginDir "plugin.yaml") -Encoding UTF8\n $hermesCmd = Get-Command hermes -ErrorAction SilentlyContinue\n if ($hermesCmd) {\n & $hermesCmd.Source plugins enable agent_insight_hermes\n } else {\n Write-Host "Warning: hermes command not found. The plugin files were installed; enable agent_insight_hermes after installing Hermes."\n }\n}\n\nif ($INSTALL_JIUWEN) {\n Write-Host "⏬ Installing Agent-insight JiuwenSwarm extension..."\n $jwHome = if ($env:JIUWENSWARM_DATA_DIR) { $env:JIUWENSWARM_DATA_DIR } else { Join-Path $homeDir ".jiuwenswarm" }\n $jwExtDir = Join-Path $jwHome "extensions\\agent-insight-observability"\n New-Item -ItemType Directory -Path $jwExtDir -Force | Out-Null\n New-Item -ItemType Directory -Path (Join-Path $jwHome "config") -Force | Out-Null\n Invoke-WebRequest -Uri "$AGENT_INSIGHT_BASE_URL/api/setup/jiuwen-extension" -OutFile (Join-Path $jwExtDir "extension.py")\n @(\'id: agent-insight-observability\', \'name: agent-insight-observability\', \'version: 0.1.0\', \'description: Zero-code observability onboarding for JiuwenSwarm via agent-core OTLP.\', \'author: agent-insight\', \'min_jiuwenswarm_version: "0.2.0"\', \'dependencies: {}\', \'config_schema:\', \' type: object\') | Set-Content -Path (Join-Path $jwExtDir "extension.yaml") -Encoding UTF8\n Write-Host "✅ JiuwenSwarm extension installed at $jwExtDir"\n}\n\n# 4. Configure ~/.agent-insight/.env\n$AGENT_INSIGHT_CONFIG_FILE = "$homeDir\\.agent-insight\\.env"\n$EXISTING_KEY = ""\n$EXISTING_HOST = ""\n$EXISTING_SHOW_TASK_STATS = ""\n$EXISTING_UPLOAD_SINCE_MS = ""\nif (Test-Path $AGENT_INSIGHT_CONFIG_FILE) {\n $content = Get-Content $AGENT_INSIGHT_CONFIG_FILE\n $keyLine = $content | Select-String \'^AGENT_INSIGHT_API_KEY=\' | Select-Object -First 1\n $hostLine = $content | Select-String \'^AGENT_INSIGHT_HOST=\' | Select-Object -First 1\n $showLine = $content | Select-String \'^AGENT_INSIGHT_SHOW_TASK_STATS=\' | Select-Object -First 1\n $sinceLine = $content | Select-String \'^AGENT_INSIGHT_OPENCODE_UPLOAD_SINCE_MS=\' | Select-Object -First 1\n if ($keyLine) {\n $EXISTING_KEY = $keyLine.Line.Substring(\'AGENT_INSIGHT_API_KEY=\'.Length)\n }\n if ($hostLine) {\n $EXISTING_HOST = $hostLine.Line.Substring(\'AGENT_INSIGHT_HOST=\'.Length)\n }\n if ($showLine) {\n $EXISTING_SHOW_TASK_STATS = $showLine.Line.Substring(\'AGENT_INSIGHT_SHOW_TASK_STATS=\'.Length)\n }\n if ($sinceLine) {\n $EXISTING_UPLOAD_SINCE_MS = $sinceLine.Line.Substring(\'AGENT_INSIGHT_OPENCODE_UPLOAD_SINCE_MS=\'.Length)\n }\n}\n\n# -- API Key Logic --\n$FINAL_KEY = if ($AGENT_INSIGHT_SETUP_API_KEY) { $AGENT_INSIGHT_SETUP_API_KEY } else { $EXISTING_KEY }\nif ($FORCE_NO_KEY) {\n $FINAL_KEY = ""\n Write-Host "🔑 --no-key:强制无 key(清空本机已有 key),数据归到服务端 AGENT_INSIGHT_DEFAULT_INGEST_USER 指定的共享账号。"\n} elseif ($NONINTERACTIVE) {\n if ($FINAL_KEY) { Write-Host "🔑 Using API Key (from setup URL / existing config)." }\n else { Write-Host "🔑 非交互模式且未提供 API Key —— 以「无 key」方式上报,数据归到服务端 AGENT_INSIGHT_DEFAULT_INGEST_USER 指定的共享账号。" }\n} elseif ($AGENT_INSIGHT_SETUP_API_KEY) {\n Write-Host "🔑 Using API Key from setup URL."\n} elseif ($EXISTING_KEY) {\n Write-Host "🔑 Found existing API Key."\n $USE_EXISTING = Read-Host "👉 Use existing key? (y/N, Default: y)"\n if ($USE_EXISTING -match \'^[Nn]$\') {\n $FINAL_KEY = Read-Host "👉 Please enter your NEW API Key"\n }\n} else {\n Write-Host "🔑 AGENT_INSIGHT_API_KEY is not set."\n $FINAL_KEY = Read-Host "👉 Please enter your API Key"\n}\n\n# -- Host Logic --\n$FINAL_HOST = $AGENT_INSIGHT_HOST\nif (-not $NONINTERACTIVE -and $EXISTING_HOST -and ($EXISTING_HOST -ne $AGENT_INSIGHT_HOST)) {\n Write-Host "🌐 Current Host in config: $EXISTING_HOST"\n Write-Host "🌐 New Host detected: $AGENT_INSIGHT_HOST"\n $CHANGE_HOST = Read-Host "👉 Change to new Host? (y/N, Default: y)"\n if ($CHANGE_HOST -match \'^[Nn]$\') {\n $FINAL_HOST = $EXISTING_HOST\n }\n} elseif (-not $EXISTING_HOST) {\n $FINAL_HOST = $AGENT_INSIGHT_HOST\n}\n\n$FINAL_SHOW_TASK_STATS = $EXISTING_SHOW_TASK_STATS\nif (-not $FINAL_SHOW_TASK_STATS) {\n $FINAL_SHOW_TASK_STATS = "true"\n}\n\nif (-not $FINAL_KEY) {\n if ($NONINTERACTIVE -or $FORCE_NO_KEY) {\n Write-Host "ℹ️ 未配置 API Key:以「无 key」方式上报,数据归到服务端默认共享账号(需服务端已配 AGENT_INSIGHT_DEFAULT_INGEST_USER)。"\n } else {\n Write-Host "⚠️ Warning: No API Key provided. Telemetry upload will fail until you set it in $AGENT_INSIGHT_CONFIG_FILE"\n }\n}\n\n# -- Per-account isolation: namespace opencode spool/checkpoint by API-key hash --\n$CLIENT_KEY_HASH = ([System.BitConverter]::ToString(([System.Security.Cryptography.SHA256]::Create()).ComputeHash([System.Text.Encoding]::UTF8.GetBytes([string]$FINAL_KEY))) -replace \'-\',\'\').ToLower().Substring(0,16)\n$NOW_MS = [string][long]([DateTimeOffset]::UtcNow.ToUnixTimeMilliseconds())\nif ($EXISTING_UPLOAD_SINCE_MS -and ($FINAL_KEY -eq $EXISTING_KEY)) { $UPLOAD_SINCE_MS = $EXISTING_UPLOAD_SINCE_MS } else { $UPLOAD_SINCE_MS = $NOW_MS }\n\nWrite-Host "⚙️ Updating configuration..."\nNew-Item -ItemType File -Path $AGENT_INSIGHT_CONFIG_FILE -Force | Out-Null\nCopy-Item $AGENT_INSIGHT_CONFIG_FILE "$AGENT_INSIGHT_CONFIG_FILE.bak"\n$content = Get-Content "$AGENT_INSIGHT_CONFIG_FILE.bak"\n$content | Where-Object { $_ -notmatch \'^AGENT_INSIGHT_HOST=\' -and $_ -notmatch \'^AGENT_INSIGHT_API_KEY=\' -and $_ -notmatch \'^AGENT_INSIGHT_SHOW_TASK_STATS=\' -and $_ -notmatch \'^AGENT_INSIGHT_RETENTION_DAYS=\' -and $_ -notmatch \'^AGENT_INSIGHT_OPENCODE_OTEL_ENABLE=\' -and $_ -notmatch \'^AGENT_INSIGHT_OPENCODE_SPOOL_DIR=\' -and $_ -notmatch \'^AGENT_INSIGHT_OPENCODE_UPLOADER=\' -and $_ -notmatch \'^AGENT_INSIGHT_CLAUDE_OTEL_SPOOL_DIR=\' -and $_ -notmatch \'^AGENT_INSIGHT_CLAUDE_OTEL_RAW_API_BODIES=\' -and $_ -notmatch \'^AGENT_INSIGHT_MAX_TOOL_IO=\' -and $_ -notmatch \'^AGENT_INSIGHT_MAX_EVENT_STRING=\' -and $_ -notmatch \'^AGENT_INSIGHT_OPENCODE_UPLOAD_COOLDOWN_MS=\' -and $_ -notmatch \'^AGENT_INSIGHT_CLIENT_KEY_HASH=\' -and $_ -notmatch \'^AGENT_INSIGHT_OPENCODE_CHECKPOINT=\' -and $_ -notmatch \'^AGENT_INSIGHT_OPENCODE_UPLOAD_SINCE_MS=\' } | Set-Content $AGENT_INSIGHT_CONFIG_FILE\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_HOST=$FINAL_HOST"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_API_KEY=$FINAL_KEY"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_SHOW_TASK_STATS=$FINAL_SHOW_TASK_STATS"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_RETENTION_DAYS=10"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_OPENCODE_OTEL_ENABLE=true"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_CLIENT_KEY_HASH=$CLIENT_KEY_HASH"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_OPENCODE_SPOOL_DIR=$homeDir\\.agent-insight\\otel_data\\opencode\\$CLIENT_KEY_HASH"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_OPENCODE_CHECKPOINT=$homeDir\\.agent-insight\\opencode_uploader_checkpoint_$CLIENT_KEY_HASH.json"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_OPENCODE_UPLOAD_SINCE_MS=$UPLOAD_SINCE_MS"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_OPENCODE_UPLOADER=$homeDir\\.agent-insight\\opencode_uploader_client.js"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_CLAUDE_OTEL_SPOOL_DIR=$homeDir\\.agent-insight\\otel_data\\claude"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_CLAUDE_OTEL_RAW_API_BODIES=file:$homeDir\\.agent-insight\\claude_raw_bodies"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_MAX_TOOL_IO=4000"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_MAX_EVENT_STRING=20000"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_OPENCODE_UPLOAD_COOLDOWN_MS=15000"\nRemove-Item "$AGENT_INSIGHT_CONFIG_FILE.bak" -Force\n\n# 6.4 Configure Agent Insight Hermes plugin\nif ($INSTALL_HERMES) {\n $hermesHome = if ($env:HERMES_HOME) { $env:HERMES_HOME } else { Join-Path $homeDir ".hermes" }\n $hermesPluginDir = Join-Path $hermesHome "plugins\\agent_insight_hermes"\n New-Item -ItemType Directory -Path $hermesPluginDir -Force | Out-Null\n $hermesConfig = @{ host = $FINAL_HOST.TrimEnd("/"); api_key = $FINAL_KEY; service_name = "hermes"; max_content_chars = 200000; spool_dir = (Join-Path $skillInsightDir "data\\hermes-otel-spool"); log_file = (Join-Path $skillInsightDir "logs\\hermes-plugin.log") } | ConvertTo-Json\n Set-Content -Path (Join-Path $hermesPluginDir "config.json") -Value $hermesConfig -Encoding UTF8\n Write-Host "Agent Insight Hermes config written to $hermesPluginDir\\config.json"\n}\n\n# 6.45 Configure JiuwenSwarm telemetry (workspace config\\.env, read by the extension)\nif ($INSTALL_JIUWEN) {\n $jwHome = if ($env:JIUWENSWARM_DATA_DIR) { $env:JIUWENSWARM_DATA_DIR } else { Join-Path $homeDir ".jiuwenswarm" }\n $jwEnv = Join-Path $jwHome "config\\.env"\n $jwExtParent = Join-Path $jwHome "extensions"\n $jwOtlpEndpoint = $FINAL_HOST.TrimEnd("/") + "/api/ingest/otel/v1/traces"\n New-Item -ItemType Directory -Path (Join-Path $jwHome "config") -Force | Out-Null\n New-Item -ItemType File -Path $jwEnv -Force | Out-Null\n $jwPrev = Get-Content $jwEnv\n $prevExtLine = $jwPrev | Select-String \'^EXTENSION_DIRS=\' | Select-Object -First 1\n # 去掉历史值可能带的成对引号(模板默认 EXTENSION_DIRS=""),否则拼出 "";<dir> 会破坏 dotenv 解析\n $prevExtDirs = if ($prevExtLine) { $prevExtLine.Line.Substring(\'EXTENSION_DIRS=\'.Length).Trim(\'"\').Trim("\'") } else { "jiuwenswarm/extensions" }\n if (-not $prevExtDirs) { $prevExtDirs = "jiuwenswarm/extensions" }\n if ($prevExtDirs.Split(";") -notcontains $jwExtParent) { $newExtDirs = "$prevExtDirs;$jwExtParent" } else { $newExtDirs = $prevExtDirs }\n $jwPrev | Where-Object { $_ -notmatch \'^OTEL_ENABLED=\' -and $_ -notmatch \'^AGENT_INSIGHT_OTLP_ENDPOINT=\' -and $_ -notmatch \'^AGENT_INSIGHT_API_KEY=\' -and $_ -notmatch \'^EXTENSION_DIRS=\' } | Set-Content $jwEnv\n Add-Content $jwEnv "OTEL_ENABLED=true"\n Add-Content $jwEnv "AGENT_INSIGHT_OTLP_ENDPOINT=$jwOtlpEndpoint"\n Add-Content $jwEnv "AGENT_INSIGHT_API_KEY=$FINAL_KEY"\n Add-Content $jwEnv "EXTENSION_DIRS=$newExtDirs"\n Write-Host "✅ JiuwenSwarm telemetry configured -> $jwOtlpEndpoint (service=jiuwenswarm)"\n}\nWrite-Host "✅ Configuration updated at $AGENT_INSIGHT_CONFIG_FILE"\n\n# 6.5 Configure Claude Code official OTel logs\nif ($INSTALL_CLAUDE) {\n $claudeOtelScript = @\'\nfunction Invoke-SkillInsightClaude {\n $envFile = Join-Path $env:USERPROFILE ".agent-insight\\.env"\n if (Test-Path $envFile) {\n Get-Content $envFile | ForEach-Object {\n if ($_ -match "^([^#=]+)=(.*)$") { [Environment]::SetEnvironmentVariable($matches[1], $matches[2], "Process") }\n }\n }\n $siHost = if ($env:AGENT_INSIGHT_HOST) { $env:AGENT_INSIGHT_HOST } else { "127.0.0.1:3000" }\n if ($siHost -notmatch "^https?://") { $siHost = "http://$siHost" }\n $siHost = $siHost.TrimEnd("/")\n $env:CLAUDE_CODE_ENABLE_TELEMETRY = "1"\n $env:OTEL_LOGS_EXPORTER = "otlp"\n if (-not $env:OTEL_METRICS_EXPORTER) { $env:OTEL_METRICS_EXPORTER = "none" }\n $env:OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = "http/json"\n $env:OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = "$siHost/api/ingest/otel/v1/logs"\n $env:OTEL_EXPORTER_OTLP_HEADERS = "x-witty-api-key=$($env:AGENT_INSIGHT_API_KEY)"\n $env:OTEL_LOG_USER_PROMPTS = "1"\n $env:OTEL_LOG_TOOL_DETAILS = "1"\n $env:OTEL_LOG_TOOL_CONTENT = "1"\n $rawBodyDir = Join-Path $env:USERPROFILE ".agent-insight\\claude_raw_bodies"\n New-Item -ItemType Directory -Path $rawBodyDir -Force | Out-Null\n if (-not $env:AGENT_INSIGHT_CLAUDE_OTEL_RAW_API_BODIES) { $env:AGENT_INSIGHT_CLAUDE_OTEL_RAW_API_BODIES = "file:$rawBodyDir" }\n $env:OTEL_LOG_RAW_API_BODIES = $env:AGENT_INSIGHT_CLAUDE_OTEL_RAW_API_BODIES\n $cmd = Get-Command claude -CommandType Application -ErrorAction SilentlyContinue\n if (-not $cmd) { throw "claude executable not found in PATH" }\n & $cmd.Source @args\n}\nSet-Alias claude Invoke-SkillInsightClaude\n\'@\n $claudeOtelPath = "$homeDir\\.agent-insight\\claude_otel_env.ps1"\n Set-Content -Path $claudeOtelPath -Value $claudeOtelScript -Encoding UTF8\n $profileDir = Split-Path $PROFILE -Parent\n if ($profileDir) { New-Item -ItemType Directory -Path $profileDir -Force | Out-Null }\n $profileText = if (Test-Path $PROFILE) { Get-Content $PROFILE -Raw } else { "" }\n if (-not ($profileText.Contains(".agent-insight\\claude_otel_env.ps1") -or $profileText.Contains(".agent-insight/claude_otel_env.ps1"))) {\n Add-Content -Path $PROFILE -Value ""\n Add-Content -Path $PROFILE -Value "# Skill-Insight Claude Code OTel"\n Add-Content -Path $PROFILE -Value ". `"$claudeOtelPath`""\n }\n Write-Host "✅ Claude Code OTel env installed at $claudeOtelPath"\n Write-Host " Restart PowerShell or run: . `"$claudeOtelPath`""\n Get-Process | Where-Object { $_.CommandLine -like "*claude_watcher_client.ts*" } | Stop-Process -Force -ErrorAction SilentlyContinue\n Remove-Item "$homeDir\\.agent-insight\\claude_watcher_client.ts", "$homeDir\\.agent-insight\\start_claude_watcher.ps1", "$homeDir\\.agent-insight\\stop_claude_watcher.ps1", "$homeDir\\.agent-insight\\claude_watcher.pid" -Force -ErrorAction SilentlyContinue\n Write-Host "🧹 Removed legacy Claude session-file watcher if it was installed."\n}\n\n# 7. Create Watcher Startup/Stop Scripts\n$NEEDS_WATCHER_SCRIPTS = $false\nif ($INSTALL_OPENCODE) {\n $NEEDS_WATCHER_SCRIPTS = $true\n}\n\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "📝 Creating watcher management scripts..."\n\n if ($INSTALL_OPENCODE) {\n $startScript = @\'\nGet-Process | Where-Object { $_.CommandLine -like "*opencode_uploader_client.js*" } | Stop-Process -Force -ErrorAction SilentlyContinue\nGet-Process | Where-Object { $_.CommandLine -like "*skill-insight-opencode-uploader-loop*" } | Stop-Process -Force -ErrorAction SilentlyContinue\nNew-Item -ItemType Directory -Path "$env:USERPROFILE\\.agent-insight\\logs" -Force | Out-Null\n$intervalSec = if ($env:AGENT_INSIGHT_OPENCODE_UPLOADER_INTERVAL_SEC) { $env:AGENT_INSIGHT_OPENCODE_UPLOADER_INTERVAL_SEC } else { "300" }\n$logFile = "$env:USERPROFILE\\.agent-insight\\logs\\opencode_uploader.log"\n$uploaderPath = "$env:USERPROFILE\\.agent-insight\\opencode_uploader_client.js"\n$runtime = if (Get-Command node -ErrorAction SilentlyContinue) { "node" } elseif (Get-Command bun -ErrorAction SilentlyContinue) { "bun" } else { $null }\nif (-not $runtime) {\n Add-Content $logFile "[$(Get-Date)] Skipped: node/bun not installed"\n return\n}\n# Sentinel marker in script body so it can be matched by CommandLine search.\n$loopBody = @"\n# skill-insight-opencode-uploader-loop\nwhile (`$true) {\n & `"$runtime`" `"$uploaderPath`" *>> `"$logFile`"\n Start-Sleep -Seconds $intervalSec\n}\n"@\n$proc = Start-Process -FilePath "powershell" -ArgumentList "-NoProfile", "-Command", $loopBody -PassThru -WindowStyle Hidden\nSet-Content "$env:USERPROFILE\\.agent-insight\\opencode_uploader.pid" $proc.Id\nWrite-Host "OpenCode uploader daemon started with PID $($proc.Id) (interval=${intervalSec}s)"\n\'@\n Set-Content -Path "$homeDir\\.agent-insight\\start_opencode_uploader.ps1" -Value $startScript -Encoding UTF8\n\n $stopScript = @\'\nGet-Process | Where-Object { $_.CommandLine -like "*skill-insight-opencode-uploader-loop*" } | Stop-Process -Force -ErrorAction SilentlyContinue\nGet-Process | Where-Object { $_.CommandLine -like "*opencode_uploader_client.js*" } | Stop-Process -Force -ErrorAction SilentlyContinue\nRemove-Item "$env:USERPROFILE\\.agent-insight\\opencode_uploader.pid" -Force -ErrorAction SilentlyContinue\nWrite-Host "OpenCode uploader daemon stopped"\n\'@\n Set-Content -Path "$homeDir\\.agent-insight\\stop_opencode_uploader.ps1" -Value $stopScript -Encoding UTF8\n }\n\n $combinedStart = \'Write-Host "Starting Agent-Insight watchers..."\'\n if ($INSTALL_OPENCODE) { $combinedStart += [char]10 + "& `"$homeDir\\.agent-insight\\start_opencode_uploader.ps1`"" }\n $combinedStart += [char]10 + \'Write-Host "All watchers started!"\'\n Set-Content -Path "$homeDir\\.agent-insight\\start_watchers.ps1" -Value $combinedStart -Encoding UTF8\n\n $combinedStop = \'Write-Host "Stopping Agent-Insight watchers..."\'\n if ($INSTALL_OPENCODE) { $combinedStop += [char]10 + "& `"$homeDir\\.agent-insight\\stop_opencode_uploader.ps1`"" }\n $combinedStop += [char]10 + \'Write-Host "All watchers stopped!"\'\n Set-Content -Path "$homeDir\\.agent-insight\\stop_watchers.ps1" -Value $combinedStop -Encoding UTF8\n}\n\n# 8. Start Watchers Now\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "🚀 Starting telemetry watchers..."\n if (Get-Command npx -ErrorAction SilentlyContinue) {\n & "$homeDir\\.agent-insight\\start_watchers.ps1"\n } else {\n Write-Host "⚠️ Node.js (npx) not found. Skipping watcher startup."\n }\n}\n\n# 10. Final Summary\nWrite-Host ""\nWrite-Host "🌟 Agent-Insight Telemetry: READY"\nWrite-Host "------------------------------------------------"\nWrite-Host "Installed Components:"\nif ($INSTALL_OPENCODE) { Write-Host " ✅ OpenCode Plugin: $opencodeConfigDir\\plugins\\Witty-Skill-Insight.ts" }\nif ($INSTALL_OPENCODE) { Write-Host " ✅ OpenCode Uploader Daemon: ~/.agent-insight/opencode_uploader_client.js (5-min poll)" }\nif ($INSTALL_CLAUDE) { Write-Host " ✅ Claude Code OTel: ~/.agent-insight/claude_otel_env.ps1" }\nif ($INSTALL_HERMES) { $summaryHermesHome = if ($env:HERMES_HOME) { $env:HERMES_HOME } else { Join-Path $homeDir ".hermes" }; Write-Host " ✅ Agent Insight Hermes Plugin: $summaryHermesHome\\plugins\\agent_insight_hermes\\config.json" }\nif ($INSTALL_JIUWEN) { $summaryJwHome = if ($env:JIUWENSWARM_DATA_DIR) { $env:JIUWENSWARM_DATA_DIR } else { Join-Path $homeDir ".jiuwenswarm" }; Write-Host " ✅ JiuwenSwarm Extension: $summaryJwHome\\extensions\\agent-insight-observability (telemetry in config\\.env)" }\n\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "Watcher Management:"\n Write-Host " Start all: ~/.agent-insight/start_watchers.ps1"\n Write-Host " Stop all: ~/.agent-insight/stop_watchers.ps1"\n Write-Host " Logs: ~/.agent-insight/logs/"\n}\n\nWrite-Host ""\nWrite-Host "Usage:"\nif ($INSTALL_OPENCODE) { Write-Host " 1. Run: opencode run \'hello\'" }\nif ($INSTALL_CLAUDE) { Write-Host " 2. Restart PowerShell, then run: claude" }\nif ($INSTALL_HERMES) { Write-Host " 3. Restart Hermes or start a new Hermes conversation" }\nWrite-Host "------------------------------------------------"'].join("\n")}(r,r,E,l,I,T);return new O.NextResponse(e,{headers:{"Content-Type":"text/plain; charset=utf-8"}})}{let e=function(e,n,t,i=!1,o="opencode",s=!1){return["#!/bin/bash\n# =============================================================================\n# Agent-insight One-Click Setup\n# =============================================================================\n",'AGENT_INSIGHT_HOST="'+$(e)+'"','AGENT_INSIGHT_BASE_URL="'+$(n)+'"','AGENT_INSIGHT_SETUP_API_KEY="'+$(t)+'"','OPENCODE_CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/opencode"\n\n# ── 非交互模式(-y / --yes):全程无提示,默认只装 opencode ─────────────────────\n# curl -sSf "<host>/api/ingest/setup" | bash -s -- -y\n# URL 直接带: curl -sSf "<host>/api/ingest/setup?yes=1" | bash\n# env: curl -sSf "<host>/api/ingest/setup" | AGENT_INSIGHT_NONINTERACTIVE=1 bash\n# 指定框架: ... | bash -s -- -y --frameworks=opencode,claude\n# 强制无 key: ... ?yes=1&nokey=1 或 bash -s -- -y --no-key(清空本机已有 key,切共享账号)',"NONINTERACTIVE="+(i?"true":"false"),'NONINTERACTIVE_FRAMEWORKS="'+$(o||"opencode")+'"',"FORCE_NO_KEY="+(s?"true":"false"),'for arg in "$@"; do\n case "$arg" in\n -y|--yes|--non-interactive|--noninteractive) NONINTERACTIVE=true ;;\n --no-key|--nokey) FORCE_NO_KEY=true ;;\n --frameworks=*) NONINTERACTIVE=true; NONINTERACTIVE_FRAMEWORKS="${arg#*=}" ;;\n esac\ndone\nif [ "${AGENT_INSIGHT_NONINTERACTIVE:-}" = "1" ] || [ "${AGENT_INSIGHT_NONINTERACTIVE:-}" = "true" ]; then NONINTERACTIVE=true; fi\nif [ "$NONINTERACTIVE" = "true" ]; then echo "🤖 非交互模式:跳过所有提示,安装框架 = $NONINTERACTIVE_FRAMEWORKS"; fi\n\necho "🚀 Fetching Agent-insight telemetry components from $AGENT_INSIGHT_BASE_URL..."\n\n# 0. Check Node.js version\nif ! command -v node &> /dev/null; then\n echo "❌ Error: Node.js is not installed."\n echo " Agent-insight requires Node.js 20 or higher."\n echo " Please install Node.js: https://nodejs.org/"\n exit 1\nfi\n\nNODE_VERSION=$(node -v 2>/dev/null | sed "s/v//")\nNODE_MAJOR=$(echo "$NODE_VERSION" | cut -d. -f1)\nif [ "$NODE_MAJOR" -lt 20 ]; then\n echo "❌ Error: Node.js version $NODE_VERSION is not supported."\n echo " Agent-insight requires Node.js 20 or higher."\n echo " Please upgrade your Node.js version: https://nodejs.org/"\n exit 1\nfi\necho "✅ Node.js version: $NODE_VERSION"\n\n# 1. Setup Directories\nmkdir -p "$HOME/.agent-insight"\nmkdir -p "$HOME/.agent-insight/logs"\nmkdir -p "$OPENCODE_CONFIG_DIR/plugins"\nmkdir -p "$HOME/.opencode/skills"\nmkdir -p "$HOME/.claude/projects"\nmkdir -p ".opencode/skills"\nmkdir -p "$HOME/.agent-insight/example"\necho "📂 Created necessary directories"\n\n# 1b. Download built-in example messages log (for the bundled "messages 日志分析" dataset / demo traces)\nif curl -sSf "$AGENT_INSIGHT_BASE_URL/api/setup/example-messages" -o "$HOME/.agent-insight/example/messages"; then\n echo "📄 Example log ready at $HOME/.agent-insight/example/messages"\nelse\n echo "⚠️ Skipped example messages log download (non-fatal)"\nfi\n\n# 2. Framework Selection(非交互模式跳过 inquirer,直接用 $NONINTERACTIVE_FRAMEWORKS)\necho ""\n\nif [ "$NONINTERACTIVE" = "true" ]; then\n SELECTED_FRAMEWORKS="$NONINTERACTIVE_FRAMEWORKS"\nelse\n\nSELECTOR_SCRIPT="$HOME/.agent-insight/framework_selector.mjs"\nSELECTOR_RESULT="$HOME/.agent-insight/.selector_result"\n\n# Install inquirer and tsx if not already installed\ncd "$HOME/.agent-insight"\nif [ ! -f "package.json" ]; then\n echo \'{"name": "agent-insight-setup", "version": "1.0.0", "type": "module", "dependencies": {}}\' > package.json\nfi\nif [ ! -d "node_modules/inquirer" ] || [ ! -d "node_modules/tsx" ]; then\n echo "📦 Installing dependencies for interactive selection..."\n npm install inquirer tsx --save 2>/dev/null\nfi\n\ncat > "$SELECTOR_SCRIPT" << \'SELECTOR_EOF\'\nimport inquirer from \'inquirer\';\nimport fs from \'fs\';\n\nconst frameworks = [\n { name: \'OpenCode\', value: \'opencode\' },\n { name: \'Claude Code\', value: \'claude\' },\n { name: \'Hermes\', value: \'hermes\' },\n { name: \'JiuwenSwarm\', value: \'jiuwen\' }\n];\n\nasync function select() {\n console.log(\'\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'╔══════════════════════════════════════════════════════════╗\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'║ ║\');\n console.log(\'\\x1b[1m\\x1b[36m%s\\x1b[0m\', \'║ ✨ Agent-insight ✨ ║\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'║ ║\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'╚══════════════════════════════════════════════════════════╝\');\n console.log(\'\');\n console.log(\'\\x1b[90m%s\\x1b[0m\', \' 提示: ↑↓ 移动 | 空格 选择 | a 全选 | i 反选 | Enter 确认\');\n console.log(\'\');\n\n const answers = await inquirer.prompt([\n {\n type: \'checkbox\',\n name: \'frameworks\',\n message: \'集成到:\',\n choices: frameworks,\n default: [\'opencode\'],\n pageSize: 10,\n loop: false\n }\n ]);\n\n const selected = answers.frameworks;\n \n if (selected.length > 0) {\n console.log(\'\');\n console.log(\'\\x1b[32m%s\\x1b[0m\', \'✅ 将安装以下组件:\');\n selected.forEach(fw => {\n const name = frameworks.find(f => f.value === fw)?.name || fw;\n console.log(\'\\x1b[32m%s\\x1b[0m\', \' • \' + name);\n });\n console.log(\'\');\n } else {\n console.log(\'\');\n console.log(\'\\x1b[33m%s\\x1b[0m\', \'⚠️ 未选择任何组件,将不进行安装。\');\n console.log(\'\');\n }\n\n const resultFile = process.env.SELECTOR_RESULT_FILE || process.env.HOME + \'/.agent-insight/.selector_result\';\n fs.writeFileSync(resultFile, selected.join(\',\'));\n}\n\nselect().catch(err => {\n console.error(\'Error:\', err);\n process.exit(1);\n});\nSELECTOR_EOF\n\n# Run the selector interactively from /dev/tty\nexport SELECTOR_RESULT_FILE="$SELECTOR_RESULT"\ncd "$HOME/.agent-insight" && npx -y tsx "$SELECTOR_SCRIPT" < /dev/tty\n\n# Read the selection result from file\nif [ -f "$SELECTOR_RESULT" ]; then\n SELECTED_FRAMEWORKS=$(cat "$SELECTOR_RESULT")\n rm -f "$SELECTOR_RESULT"\nelse\n SELECTED_FRAMEWORKS=""\nfi\nfi # end: 交互 vs 非交互 框架选择\n\n# Set installation flags based on selection\nINSTALL_OPENCODE=false\nINSTALL_CLAUDE=false\nINSTALL_HERMES=false\nINSTALL_JIUWEN=false\n\nif [[ "$SELECTED_FRAMEWORKS" == *"opencode"* ]]; then\n INSTALL_OPENCODE=true\nfi\nif [[ "$SELECTED_FRAMEWORKS" == *"claude"* ]]; then\n INSTALL_CLAUDE=true\nfi\nif [[ "$SELECTED_FRAMEWORKS" == *"hermes"* ]]; then\n INSTALL_HERMES=true\nfi\nif [[ "$SELECTED_FRAMEWORKS" == *"jiuwen"* ]]; then\n INSTALL_JIUWEN=true\nfi\n\n# Exit if nothing selected\nif [ "$INSTALL_OPENCODE" = "false" ] && [ "$INSTALL_CLAUDE" = "false" ] && [ "$INSTALL_HERMES" = "false" ] && [ "$INSTALL_JIUWEN" = "false" ]; then\n echo "⚠️ 未选择任何框架组件,将跳过插件安装。"\n echo " 继续执行配置步骤..."\n echo ""\nfi\n\n# 3. Download Components\nif [ "$INSTALL_OPENCODE" = "true" ]; then\n echo "⏬ Downloading OpenCode Plugin..."\n rm -f "$OPENCODE_CONFIG_DIR/plugins/Skill-Insight.ts" "$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.ts" 2>/dev/null || true\n rm -f "$HOME/.opencode/plugins/Skill-Insight.ts" "$HOME/.opencode/plugins/Witty-Skill-Insight.ts" 2>/dev/null || true\n curl -sSf "$AGENT_INSIGHT_BASE_URL/api/setup/opencode" -o "$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.ts"\n echo "⏬ Downloading OpenCode Uploader..."\n curl -sSf "$AGENT_INSIGHT_BASE_URL/api/setup/opencode-uploader" -o "$HOME/.agent-insight/opencode_uploader_client.js"\n echo "⏬ Installing OpenCode commands..."\n mkdir -p "$OPENCODE_CONFIG_DIR/commands"\n curl -sSf "$AGENT_INSIGHT_BASE_URL/api/setup/opencode-commands/si-optimizer" -o "$OPENCODE_CONFIG_DIR/commands/si-optimizer.md"\n echo "⏬ Downloading OpenCode TUI Plugin..."\n curl -sSf "$AGENT_INSIGHT_BASE_URL/api/setup/opencode-tui" -o "$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.tui.tsx"\n export TUI_PLUGIN_PATH="$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.tui.tsx"\n export TUI_CONFIG_FILE="$OPENCODE_CONFIG_DIR/tui.json"\n if command -v node &> /dev/null; then\n node - <<\'NODE\'\nconst fs = require("fs");\nconst path = require("path");\nconst file = process.env.TUI_CONFIG_FILE;\nconst pluginPath = process.env.TUI_PLUGIN_PATH;\nlet data = {};\ntry {\n if (fs.existsSync(file)) {\n const text = fs.readFileSync(file, "utf8");\n data = text && text.trim() ? JSON.parse(text) : {};\n }\n} catch {}\nif (!data || typeof data !== "object") data = {};\nconst list = Array.isArray(data.plugin) ? data.plugin.slice() : [];\nif (pluginPath && !list.includes(pluginPath)) list.push(pluginPath);\ndata.plugin = list;\nfs.mkdirSync(path.dirname(file), { recursive: true });\nfs.writeFileSync(file, JSON.stringify(data, null, 2));\nNODE\n else\n echo "⚠️ node not found; skip TUI plugin config patch."\n fi\nfi\n\nif [ "$INSTALL_CLAUDE" = "true" ]; then\n echo "🛰️ Claude Code will use official OpenTelemetry logs; no session-file watcher is required."\nfi\n\nif [ "$INSTALL_HERMES" = "true" ]; then\n echo "Installing Agent Insight Hermes plugin..."\n HERMES_HOME="${HERMES_HOME:-$HOME/.hermes}"\n HERMES_PLUGIN_DIR="$HERMES_HOME/plugins/agent_insight_hermes"\n mkdir -p "$HERMES_PLUGIN_DIR"\n curl -sSf "$AGENT_INSIGHT_BASE_URL/api/setup/hermes-plugin" -o "$HERMES_PLUGIN_DIR/__init__.py"\n cat > "$HERMES_PLUGIN_DIR/plugin.yaml" <<\'HERMES_PLUGIN_EOF\'\nname: agent_insight_hermes\nversion: 0.2.0\ndescription: Agent Insight telemetry for Hermes\nprovides_hooks:\n - pre_llm_call\n - post_llm_call\n - pre_api_request\n - post_api_request\n - api_request_error\n - pre_tool_call\n - post_tool_call\n - subagent_start\n - subagent_stop\n - on_session_end\nHERMES_PLUGIN_EOF\n if command -v hermes >/dev/null 2>&1; then\n hermes plugins enable agent_insight_hermes || echo "Warning: enable the plugin manually with: hermes plugins enable agent_insight_hermes"\n else\n echo "Warning: hermes command not found. The plugin files were installed; enable agent_insight_hermes after installing Hermes."\n fi\nfi\n\nif [ "$INSTALL_JIUWEN" = "true" ]; then\n echo "⏬ Installing Agent-insight JiuwenSwarm extension..."\n JW_HOME="${JIUWENSWARM_DATA_DIR:-$HOME/.jiuwenswarm}"\n JW_EXT_DIR="$JW_HOME/extensions/agent-insight-observability"\n mkdir -p "$JW_EXT_DIR" "$JW_HOME/config"\n curl -sSf "$AGENT_INSIGHT_BASE_URL/api/setup/jiuwen-extension" -o "$JW_EXT_DIR/extension.py"\n cat > "$JW_EXT_DIR/extension.yaml" <<\'JIUWEN_EXT_EOF\'\nid: agent-insight-observability\nname: agent-insight-observability\nversion: 0.1.0\ndescription: Zero-code observability onboarding for JiuwenSwarm via agent-core OTLP.\nauthor: agent-insight\nmin_jiuwenswarm_version: "0.2.0"\ndependencies: {}\nconfig_schema:\n type: object\nJIUWEN_EXT_EOF\n echo "✅ JiuwenSwarm extension installed at $JW_EXT_DIR"\nfi\n\n# 4. Configure ~/.agent-insight/.env\nAGENT_INSIGHT_CONFIG_FILE="$HOME/.agent-insight/.env"\nEXISTING_KEY=""\nEXISTING_HOST=""\nEXISTING_SHOW_TASK_STATS=""\nif [ -f "$AGENT_INSIGHT_CONFIG_FILE" ]; then\n EXISTING_KEY=$(grep \'^AGENT_INSIGHT_API_KEY=\' "$AGENT_INSIGHT_CONFIG_FILE" | head -n 1 | cut -d\'=\' -f2-)\n EXISTING_HOST=$(grep \'^AGENT_INSIGHT_HOST=\' "$AGENT_INSIGHT_CONFIG_FILE" | head -n 1 | cut -d\'=\' -f2-)\n EXISTING_SHOW_TASK_STATS=$(grep \'^AGENT_INSIGHT_SHOW_TASK_STATS=\' "$AGENT_INSIGHT_CONFIG_FILE" | head -n 1 | cut -d\'=\' -f2-)\n EXISTING_UPLOAD_SINCE_MS=$(grep \'^AGENT_INSIGHT_OPENCODE_UPLOAD_SINCE_MS=\' "$AGENT_INSIGHT_CONFIG_FILE" | head -n 1 | cut -d\'=\' -f2-)\nfi\n\n# -- API Key Logic --\nFINAL_KEY="${AGENT_INSIGHT_SETUP_API_KEY:-$EXISTING_KEY}"\nif [ "$FORCE_NO_KEY" = "true" ]; then\n FINAL_KEY=""\n echo "🔑 --no-key:强制无 key(清空本机已有 key),数据归到服务端 AGENT_INSIGHT_DEFAULT_INGEST_USER 指定的共享账号。"\nelif [ "$NONINTERACTIVE" = "true" ]; then\n if [ -n "$FINAL_KEY" ]; then\n echo "🔑 Using API Key (from setup URL / existing config)."\n else\n echo "🔑 非交互模式且未提供 API Key —— 以「无 key」方式上报,数据归到服务端 AGENT_INSIGHT_DEFAULT_INGEST_USER 指定的共享账号。"\n fi\nelif [ -n "$AGENT_INSIGHT_SETUP_API_KEY" ]; then\n echo "🔑 Using API Key from setup URL."\nelif [ -n "$EXISTING_KEY" ]; then\n echo "🔑 Found existing API Key."\n read -p "👉 Use existing key? (y/N, Default: y): " USE_EXISTING < /dev/tty\n if [[ "$USE_EXISTING" =~ ^[Nn]$ ]]; then\n read -p "👉 Please enter your NEW API Key: " FINAL_KEY < /dev/tty\n fi\nelse\n echo "🔑 AGENT_INSIGHT_API_KEY is not set."\n read -p "👉 Please enter your API Key: " FINAL_KEY < /dev/tty\nfi\n\n# -- Host Logic --\nFINAL_HOST="$AGENT_INSIGHT_HOST"\nif [ "$NONINTERACTIVE" != "true" ] && [ -n "$EXISTING_HOST" ] && [ "$EXISTING_HOST" != "$AGENT_INSIGHT_HOST" ]; then\n echo "🌐 Current Host in config: $EXISTING_HOST"\n echo "🌐 New Host detected: $AGENT_INSIGHT_HOST"\n read -p "👉 Change to new Host? (y/N, Default: y): " CHANGE_HOST < /dev/tty\n if [[ "$CHANGE_HOST" =~ ^[Nn]$ ]]; then\n FINAL_HOST="$EXISTING_HOST"\n fi\nelif [ -z "$EXISTING_HOST" ]; then\n FINAL_HOST="$AGENT_INSIGHT_HOST"\nfi\n\nFINAL_SHOW_TASK_STATS="$EXISTING_SHOW_TASK_STATS"\nif [ -z "$FINAL_SHOW_TASK_STATS" ]; then\n FINAL_SHOW_TASK_STATS="true"\nfi\n\nif [ -z "$FINAL_KEY" ]; then\n if [ "$NONINTERACTIVE" = "true" ] || [ "$FORCE_NO_KEY" = "true" ]; then\n echo "ℹ️ 未配置 API Key:以「无 key」方式上报,数据归到服务端默认共享账号(需服务端已配 AGENT_INSIGHT_DEFAULT_INGEST_USER)。"\n else\n echo "⚠️ Warning: No API Key provided. Telemetry upload will fail until you set it in $AGENT_INSIGHT_CONFIG_FILE"\n fi\nfi\n\n# -- Per-account isolation: hash the API key so opencode spool/checkpoint are\n# namespaced per account. Switching accounts on the same machine no longer\n# replays another account\'s history under the current key.\nCLIENT_KEY_HASH=$(printf \'%s\' "$FINAL_KEY" | { shasum -a 256 2>/dev/null || sha256sum; } | cut -c1-16)\nNOW_MS=$(node -e \'process.stdout.write(String(Date.now()))\' 2>/dev/null || echo $(( $(date +%s) * 1000 )))\n# Keep an existing baseline when re-installing the SAME key; reset to now for a\n# new/changed key so only traces produced after THIS install are uploaded.\nif [ -n "$EXISTING_UPLOAD_SINCE_MS" ] && [ "$FINAL_KEY" = "$EXISTING_KEY" ]; then\n UPLOAD_SINCE_MS="$EXISTING_UPLOAD_SINCE_MS"\nelse\n UPLOAD_SINCE_MS="$NOW_MS"\nfi\n\necho "⚙️ Updating configuration..."\ntouch "$AGENT_INSIGHT_CONFIG_FILE"\ncp "$AGENT_INSIGHT_CONFIG_FILE" "${AGENT_INSIGHT_CONFIG_FILE}.bak"\ngrep -v "^AGENT_INSIGHT_HOST=" "${AGENT_INSIGHT_CONFIG_FILE}.bak" | grep -v "^AGENT_INSIGHT_API_KEY=" | grep -v "^AGENT_INSIGHT_SHOW_TASK_STATS=" | grep -v "^AGENT_INSIGHT_RETENTION_DAYS=" | grep -v "^AGENT_INSIGHT_OPENCODE_OTEL_ENABLE=" | grep -v "^AGENT_INSIGHT_OPENCODE_SPOOL_DIR=" | grep -v "^AGENT_INSIGHT_OPENCODE_UPLOADER=" | grep -v "^AGENT_INSIGHT_CLAUDE_OTEL_SPOOL_DIR=" | grep -v "^AGENT_INSIGHT_CLAUDE_OTEL_RAW_API_BODIES=" | grep -v "^AGENT_INSIGHT_MAX_TOOL_IO=" | grep -v "^AGENT_INSIGHT_MAX_EVENT_STRING=" | grep -v "^AGENT_INSIGHT_OPENCODE_UPLOAD_COOLDOWN_MS=" | grep -v "^AGENT_INSIGHT_CLIENT_KEY_HASH=" | grep -v "^AGENT_INSIGHT_OPENCODE_CHECKPOINT=" | grep -v "^AGENT_INSIGHT_OPENCODE_UPLOAD_SINCE_MS=" > "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_HOST=$FINAL_HOST" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_API_KEY=$FINAL_KEY" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_SHOW_TASK_STATS=$FINAL_SHOW_TASK_STATS" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_RETENTION_DAYS=10" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_OPENCODE_OTEL_ENABLE=true" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_CLIENT_KEY_HASH=$CLIENT_KEY_HASH" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_OPENCODE_SPOOL_DIR=$HOME/.agent-insight/otel_data/opencode/$CLIENT_KEY_HASH" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_OPENCODE_CHECKPOINT=$HOME/.agent-insight/opencode_uploader_checkpoint_$CLIENT_KEY_HASH.json" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_OPENCODE_UPLOAD_SINCE_MS=$UPLOAD_SINCE_MS" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_OPENCODE_UPLOADER=$HOME/.agent-insight/opencode_uploader_client.js" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_CLAUDE_OTEL_SPOOL_DIR=$HOME/.agent-insight/otel_data/claude" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_CLAUDE_OTEL_RAW_API_BODIES=file:$HOME/.agent-insight/claude_raw_bodies" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_MAX_TOOL_IO=4000" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_MAX_EVENT_STRING=20000" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_OPENCODE_UPLOAD_COOLDOWN_MS=15000" >> "$AGENT_INSIGHT_CONFIG_FILE"\nrm "${AGENT_INSIGHT_CONFIG_FILE}.bak"\necho "✅ Configuration updated at $AGENT_INSIGHT_CONFIG_FILE"\n\n# 6.4 Configure Agent Insight Hermes plugin\nif [ "$INSTALL_HERMES" = "true" ]; then\n HERMES_HOME="${HERMES_HOME:-$HOME/.hermes}"\n HERMES_PLUGIN_DIR="$HERMES_HOME/plugins/agent_insight_hermes"\n mkdir -p "$HERMES_PLUGIN_DIR"\n cat > "$HERMES_PLUGIN_DIR/config.json" <<HERMES_CONFIG_EOF\n{\n "host": "${FINAL_HOST%/}",\n "api_key": "$FINAL_KEY",\n "service_name": "hermes",\n "max_content_chars": 200000,\n "spool_dir": "$HOME/.agent-insight/data/hermes-otel-spool",\n "log_file": "$HOME/.agent-insight/logs/hermes-plugin.log"\n}\nHERMES_CONFIG_EOF\n echo "Agent Insight Hermes config written to $HERMES_PLUGIN_DIR/config.json"\nfi\n\n# 6.45 Configure JiuwenSwarm telemetry (workspace config/.env, read by the extension)\nif [ "$INSTALL_JIUWEN" = "true" ]; then\n JW_HOME="${JIUWENSWARM_DATA_DIR:-$HOME/.jiuwenswarm}"\n JW_ENV="$JW_HOME/config/.env"\n JW_EXT_PARENT="$JW_HOME/extensions"\n JW_OTLP_ENDPOINT="${FINAL_HOST%/}/api/ingest/otel/v1/traces"\n mkdir -p "$JW_HOME/config"\n touch "$JW_ENV"\n cp "$JW_ENV" "${JW_ENV}.bak"\n # EXTENSION_DIRS: 保留既有(默认 jiuwenswarm/extensions) + 追加我们的目录(去重)\n PREV_EXT_DIRS=$(grep \'^EXTENSION_DIRS=\' "${JW_ENV}.bak" | head -n 1 | cut -d\'=\' -f2-)\n # 去掉历史值可能带的成对双引号:jiuwenswarm 模板默认 EXTENSION_DIRS="",\n # 直接拼接会写出 "";<dir>,python-dotenv 无法解析整行而丢弃 → 扩展目录失效。\n PREV_EXT_DIRS="${PREV_EXT_DIRS#\\"}"; PREV_EXT_DIRS="${PREV_EXT_DIRS%\\"}"\n if [ -z "$PREV_EXT_DIRS" ]; then PREV_EXT_DIRS="jiuwenswarm/extensions"; fi\n case ";$PREV_EXT_DIRS;" in\n *";$JW_EXT_PARENT;"*) NEW_EXT_DIRS="$PREV_EXT_DIRS" ;;\n *) NEW_EXT_DIRS="$PREV_EXT_DIRS;$JW_EXT_PARENT" ;;\n esac\n grep -v \'^OTEL_ENABLED=\' "${JW_ENV}.bak" | grep -v \'^AGENT_INSIGHT_OTLP_ENDPOINT=\' | grep -v \'^AGENT_INSIGHT_API_KEY=\' | grep -v \'^EXTENSION_DIRS=\' > "$JW_ENV"\n echo "OTEL_ENABLED=true" >> "$JW_ENV"\n echo "AGENT_INSIGHT_OTLP_ENDPOINT=$JW_OTLP_ENDPOINT" >> "$JW_ENV"\n echo "AGENT_INSIGHT_API_KEY=$FINAL_KEY" >> "$JW_ENV"\n echo "EXTENSION_DIRS=$NEW_EXT_DIRS" >> "$JW_ENV"\n rm -f "${JW_ENV}.bak"\n echo "✅ JiuwenSwarm telemetry configured -> $JW_OTLP_ENDPOINT (service=jiuwenswarm)"\n echo " 重启 JiuwenSwarm(agentserver)后,agent/LLM/tool trace 自动上报。"\nfi\n\n# 6.5 Configure Claude Code official OTel logs\nif [ "$INSTALL_CLAUDE" = "true" ]; then\n cat > "$HOME/.agent-insight/claude_otel_env.sh" << \'CLAUDE_OTEL_EOF\'\n# Agent-Insight Claude Code OpenTelemetry integration\nunalias claude 2>/dev/null || true\n\n_skill_insight_claude_load_env() {\n if [ -f "$HOME/.agent-insight/.env" ]; then\n set -a\n . "$HOME/.agent-insight/.env"\n set +a\n fi\n}\n\nclaude() {\n _skill_insight_claude_load_env\n local _si_host="${AGENT_INSIGHT_HOST:-127.0.0.1:3000}"\n case "$_si_host" in http://*|https://*) ;; *) _si_host="http://$_si_host" ;; esac\n _si_host="${_si_host%/}"\n mkdir -p "$HOME/.agent-insight/claude_raw_bodies" 2>/dev/null || true\n env \\\n CLAUDE_CODE_ENABLE_TELEMETRY=1 \\\n OTEL_LOGS_EXPORTER=otlp \\\n OTEL_METRICS_EXPORTER="${OTEL_METRICS_EXPORTER:-none}" \\\n OTEL_EXPORTER_OTLP_LOGS_PROTOCOL=http/json \\\n OTEL_EXPORTER_OTLP_LOGS_ENDPOINT="$_si_host/api/ingest/otel/v1/logs" \\\n OTEL_EXPORTER_OTLP_HEADERS="x-witty-api-key=${AGENT_INSIGHT_API_KEY:-}" \\\n OTEL_LOG_USER_PROMPTS=1 \\\n OTEL_LOG_TOOL_DETAILS=1 \\\n OTEL_LOG_TOOL_CONTENT=1 \\\n OTEL_LOG_RAW_API_BODIES="${AGENT_INSIGHT_CLAUDE_OTEL_RAW_API_BODIES:-file:$HOME/.agent-insight/claude_raw_bodies}" \\\n claude "$@"\n}\nCLAUDE_OTEL_EOF\n SHELL_RC="$HOME/.zshrc"\n [ -f "$HOME/.bashrc" ] && SHELL_RC="$HOME/.bashrc"\n if [ -f "$SHELL_RC" ] && ! grep -q "\\.agent-insight/claude_otel_env\\.sh" "$SHELL_RC"; then\n echo "" >> "$SHELL_RC"\n echo "# Agent-Insight Claude Code OTel" >> "$SHELL_RC"\n echo "source \\"$HOME/.agent-insight/claude_otel_env.sh\\"" >> "$SHELL_RC"\n fi\n echo "✅ Claude Code OTel env installed at $HOME/.agent-insight/claude_otel_env.sh"\n echo " Restart your terminal or run: source $HOME/.agent-insight/claude_otel_env.sh"\n pkill -f "claude_watcher_client.ts" 2>/dev/null || true\n rm -f "$HOME/.agent-insight/claude_watcher_client.ts" "$HOME/.agent-insight/start_claude_watcher.sh" "$HOME/.agent-insight/stop_claude_watcher.sh" "$HOME/.agent-insight/claude_watcher.pid"\n echo "🧹 Removed legacy Claude session-file watcher if it was installed."\nfi\n\n# 7. Create Watcher Startup/Stop Scripts\nNEEDS_WATCHER_SCRIPTS=false\nif [ "$INSTALL_OPENCODE" = "true" ]; then\n NEEDS_WATCHER_SCRIPTS=true\nfi\n\nif [ "$NEEDS_WATCHER_SCRIPTS" = "true" ]; then\n echo ""\n echo "📝 Creating watcher management scripts..."\n\n if [ "$INSTALL_OPENCODE" = "true" ]; then\n cat > "$HOME/.agent-insight/start_opencode_uploader.sh" << \'OPENCODE_UP_EOF\'\n#!/bin/bash\n# Kill any previous instance (the sentinel string lets pkill -f find the loop).\npkill -f "skill-insight-opencode-uploader-loop" 2>/dev/null\npkill -f "opencode_uploader_client.js" 2>/dev/null\nmkdir -p "$HOME/.agent-insight/logs"\nINTERVAL_SEC="${AGENT_INSIGHT_OPENCODE_UPLOADER_INTERVAL_SEC:-300}"\nLOG_FILE="$HOME/.agent-insight/logs/opencode_uploader.log"\nif command -v node >/dev/null 2>&1; then\n RUNTIME=node\nelif command -v bun >/dev/null 2>&1; then\n RUNTIME=bun\nelse\n echo "[$(date)] Skipped: node/bun not installed" >> "$LOG_FILE"\n exit 0\nfi\n# Loop body has a sentinel comment so `pkill -f skill-insight-opencode-uploader-loop` matches.\nnohup bash -c "\n# skill-insight-opencode-uploader-loop\nwhile true; do\n \\"$RUNTIME\\" \\"$HOME/.agent-insight/opencode_uploader_client.js\\" >> \\"$LOG_FILE\\" 2>&1\n sleep \\"$INTERVAL_SEC\\"\ndone" > /dev/null 2>&1 &\necho $! > "$HOME/.agent-insight/opencode_uploader.pid"\necho "OpenCode uploader daemon started with PID $(cat $HOME/.agent-insight/opencode_uploader.pid) (interval=${INTERVAL_SEC}s)"\nOPENCODE_UP_EOF\n chmod +x "$HOME/.agent-insight/start_opencode_uploader.sh"\n\n cat > "$HOME/.agent-insight/stop_opencode_uploader.sh" << \'STOP_OPENCODE_UP_EOF\'\n#!/bin/bash\npkill -f "skill-insight-opencode-uploader-loop" 2>/dev/null\npkill -f "opencode_uploader_client.js" 2>/dev/null\nPID_FILE="$HOME/.agent-insight/opencode_uploader.pid"\nif [ -f "$PID_FILE" ]; then kill "$(cat $PID_FILE)" 2>/dev/null; rm -f "$PID_FILE"; fi\necho "OpenCode uploader daemon stopped"\nSTOP_OPENCODE_UP_EOF\n chmod +x "$HOME/.agent-insight/stop_opencode_uploader.sh"\n fi\n\n cat > "$HOME/.agent-insight/start_watchers.sh" << \'WATCHER_HEADER\'\n#!/bin/bash\necho "Starting Agent-Insight watchers..."\nWATCHER_HEADER\n if [ "$INSTALL_OPENCODE" = "true" ]; then echo \'"$HOME/.agent-insight/start_opencode_uploader.sh"\' >> "$HOME/.agent-insight/start_watchers.sh"; fi\n echo \'echo "All watchers started!"\' >> "$HOME/.agent-insight/start_watchers.sh"\n chmod +x "$HOME/.agent-insight/start_watchers.sh"\n\n cat > "$HOME/.agent-insight/stop_watchers.sh" << \'STOP_HEADER\'\n#!/bin/bash\necho "Stopping Agent-Insight watchers..."\nSTOP_HEADER\n if [ "$INSTALL_OPENCODE" = "true" ]; then echo \'"$HOME/.agent-insight/stop_opencode_uploader.sh"\' >> "$HOME/.agent-insight/stop_watchers.sh"; fi\n echo \'echo "All watchers stopped!"\' >> "$HOME/.agent-insight/stop_watchers.sh"\n chmod +x "$HOME/.agent-insight/stop_watchers.sh"\nfi\n\n# 8. Start Watchers Now\nif [ "$NEEDS_WATCHER_SCRIPTS" = "true" ]; then\n echo ""\n echo "🚀 Starting telemetry watchers..."\n if command -v npx &> /dev/null; then\n "$HOME/.agent-insight/start_watchers.sh"\n else\n echo "⚠️ Node.js (npx) not found. Skipping watcher startup."\n fi\nfi\n\n# 10. Final Summary\necho ""\necho "🌟 Agent-Insight Telemetry: READY"\necho "------------------------------------------------"\necho "Installed Components:"\nif [ "$INSTALL_OPENCODE" = "true" ]; then echo " ✅ OpenCode Plugin: $OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.ts"; fi\nif [ "$INSTALL_OPENCODE" = "true" ]; then echo " ✅ OpenCode Command: ~/.config/opencode/commands/si-optimizer.md"; fi\nif [ "$INSTALL_OPENCODE" = "true" ]; then echo " ✅ OpenCode Uploader Daemon: ~/.agent-insight/opencode_uploader_client.js (5-min poll)"; fi\nif [ "$INSTALL_CLAUDE" = "true" ]; then echo " ✅ Claude Code OTel: ~/.agent-insight/claude_otel_env.sh"; fi\nif [ "$INSTALL_HERMES" = "true" ]; then echo " ✅ Agent Insight Hermes Plugin: ${HERMES_HOME:-$HOME/.hermes}/plugins/agent_insight_hermes/config.json"; fi\nif [ "$INSTALL_JIUWEN" = "true" ]; then echo " ✅ JiuwenSwarm Extension: ${JIUWENSWARM_DATA_DIR:-$HOME/.jiuwenswarm}/extensions/agent-insight-observability (telemetry in config/.env)"; fi\n\nif [ "$NEEDS_WATCHER_SCRIPTS" = "true" ]; then\n echo ""\n echo "Watcher Management:"\n echo " Start all: ~/.agent-insight/start_watchers.sh"\n echo " Stop all: ~/.agent-insight/stop_watchers.sh"\n echo " Logs: ~/.agent-insight/logs/"\nfi\n\necho ""\necho "Usage:"\nif [ "$INSTALL_OPENCODE" = "true" ]; then echo " 1. Run: opencode run \'hello\'"; fi\nif [ "$INSTALL_CLAUDE" = "true" ]; then echo " 2. Restart terminal, then run: claude"; fi\nif [ "$INSTALL_HERMES" = "true" ]; then echo " 3. Restart Hermes or start a new Hermes conversation"; fi\necho "------------------------------------------------"'].join("\n")}(r,r,E,l,I,T);return new O.NextResponse(e,{headers:{"Content-Type":"text/x-shellscript"}})}}e.s(["GET",()=>g],640112);var A=e.i(640112);let p=new n.AppRouteRouteModule({definition:{kind:t.RouteKind.APP_ROUTE,page:"/api/ingest/setup/route",pathname:"/api/ingest/setup",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/ingest/setup/route.ts",nextConfigOutput:"standalone",userland:A}),{workAsyncStorage:m,workUnitAsyncStorage:H,serverHooks:L}=p;function G(){return(0,i.patchFetch)({workAsyncStorage:m,workUnitAsyncStorage:H})}async function C(e,n,i){p.isDev&&(0,o.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let O="/api/ingest/setup/route";O=O.replace(/\/index$/,"")||"/";let $=await p.prepare(e,n,{srcPage:O,multiZoneDraftMode:!1});if(!$)return n.statusCode=400,n.end("Bad Request"),null==i.waitUntil||i.waitUntil.call(i,Promise.resolve()),null;let{buildId:u,params:g,nextConfig:A,parsedUrl:m,isDraftMode:H,prerenderManifest:L,routerServerContext:G,isOnDemandRevalidate:C,revalidateOnlyGenerated:R,resolvedPathname:f,clientReferenceManifest:P,serverActionsManifest:D}=$,F=(0,r.normalizeAppPath)(O),w=!!(L.dynamicRoutes[F]||L.routes[f]),v=async()=>((null==G?void 0:G.render404)?await G.render404(e,n,m,!1):n.end("This page could not be found"),null);if(w&&!H){let e=!!L.routes[f],n=L.dynamicRoutes[F];if(n&&!1===n.fallback&&!e){if(A.experimental.adapterPath)return await v();throw new h.NoFallbackError}}let y=null;!w||p.isDev||H||(y="/index"===(y=f)?"/":y);let W=!0===p.isDev||!w,U=w&&!W;D&&P&&(0,_.setManifestsSingleton)({page:O,clientReferenceManifest:P,serverActionsManifest:D});let M=e.method||"GET",x=(0,s.getTracer)(),b=x.getActiveScopeSpan(),k={params:g,prerenderManifest:L,renderOpts:{experimental:{authInterrupts:!!A.experimental.authInterrupts},cacheComponents:!!A.cacheComponents,supportsDynamicResponse:W,incrementalCache:(0,o.getRequestMeta)(e,"incrementalCache"),cacheLifeProfiles:A.cacheLife,waitUntil:i.waitUntil,onClose:e=>{n.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(n,t,i,o)=>p.onRequestError(e,n,i,o,G)},sharedContext:{buildId:u}},K=new E.NodeNextRequest(e),j=new E.NodeNextResponse(n),J=a.NextRequestAdapter.fromNodeNextRequest(K,(0,a.signalFromNodeResponse)(n));try{let _=async e=>p.handle(J,k).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":n.statusCode,"next.rsc":!1});let t=x.getRootSpanAttributes();if(!t)return;if(t.get("next.span_type")!==l.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${t.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let i=t.get("next.route");if(i){let n=`${M} ${i}`;e.setAttributes({"next.route":i,"http.route":i,"next.span_name":n}),e.updateName(n)}else e.updateName(`${M} ${O}`)}),r=!!(0,o.getRequestMeta)(e,"minimalMode"),E=async o=>{var s,E;let a=async({previousCacheEntry:t})=>{try{if(!r&&C&&R&&!t)return n.statusCode=404,n.setHeader("x-nextjs-cache","REVALIDATED"),n.end("This page could not be found"),null;let s=await _(o);e.fetchMetrics=k.renderOpts.fetchMetrics;let E=k.renderOpts.pendingWaitUntil;E&&i.waitUntil&&(i.waitUntil(E),E=void 0);let a=k.renderOpts.collectedTags;if(!w)return await (0,N.sendResponse)(K,j,s,k.renderOpts.pendingWaitUntil),null;{let e=await s.blob(),n=(0,T.toNodeOutgoingHttpHeaders)(s.headers);a&&(n[c.NEXT_CACHE_TAGS_HEADER]=a),!n["content-type"]&&e.type&&(n["content-type"]=e.type);let t=void 0!==k.renderOpts.collectedRevalidate&&!(k.renderOpts.collectedRevalidate>=c.INFINITE_CACHE)&&k.renderOpts.collectedRevalidate,i=void 0===k.renderOpts.collectedExpire||k.renderOpts.collectedExpire>=c.INFINITE_CACHE?void 0:k.renderOpts.collectedExpire;return{value:{kind:d.CachedRouteKind.APP_ROUTE,status:s.status,body:Buffer.from(await e.arrayBuffer()),headers:n},cacheControl:{revalidate:t,expire:i}}}}catch(n){throw(null==t?void 0:t.isStale)&&await p.onRequestError(e,n,{routerKind:"App Router",routePath:O,routeType:"route",revalidateReason:(0,I.getRevalidateReason)({isStaticGeneration:U,isOnDemandRevalidate:C})},!1,G),n}},l=await p.handleResponse({req:e,nextConfig:A,cacheKey:y,routeKind:t.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:L,isRoutePPREnabled:!1,isOnDemandRevalidate:C,revalidateOnlyGenerated:R,responseGenerator:a,waitUntil:i.waitUntil,isMinimalMode:r});if(!w)return null;if((null==l||null==(s=l.value)?void 0:s.kind)!==d.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==l||null==(E=l.value)?void 0:E.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});r||n.setHeader("x-nextjs-cache",C?"REVALIDATED":l.isMiss?"MISS":l.isStale?"STALE":"HIT"),H&&n.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let h=(0,T.fromNodeOutgoingHttpHeaders)(l.value.headers);return r&&w||h.delete(c.NEXT_CACHE_TAGS_HEADER),!l.cacheControl||n.getHeader("Cache-Control")||h.get("Cache-Control")||h.set("Cache-Control",(0,S.getCacheControlHeader)(l.cacheControl)),await (0,N.sendResponse)(K,j,new Response(l.value.body,{headers:h,status:l.value.status||200})),null};b?await E(b):await x.withPropagatedContext(e.headers,()=>x.trace(l.BaseServerSpan.handleRequest,{spanName:`${M} ${O}`,kind:s.SpanKind.SERVER,attributes:{"http.method":M,"http.target":e.url}},E))}catch(n){if(n instanceof h.NoFallbackError||await p.onRequestError(e,n,{routerKind:"App Router",routePath:F,routeType:"route",revalidateReason:(0,I.getRevalidateReason)({isStaticGeneration:U,isOnDemandRevalidate:C})},!1,G),w)throw n;return await (0,N.sendResponse)(K,j,new Response(null,{status:500})),null}}e.s(["handler",()=>C,"patchFetch",()=>G,"routeModule",()=>p,"serverHooks",()=>L,"workAsyncStorage",()=>m,"workUnitAsyncStorage",()=>H],901411)}];
|
|
1
|
+
module.exports=[901411,e=>{"use strict";var n=e.i(747909),t=e.i(174017),i=e.i(996250),o=e.i(759756),s=e.i(561916),_=e.i(174677),r=e.i(869741),E=e.i(316795),a=e.i(487718),l=e.i(995169),I=e.i(47587),N=e.i(666012),T=e.i(570101),S=e.i(626937),c=e.i(10372),h=e.i(193695);e.i(52474);var d=e.i(600220),O=e.i(89171);function u(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\$/g,"\\$").replace(/`/g,"\\`")}function $(e){return e.replace(/`/g,"``").replace(/"/g,'`"').replace(/\$/g,"`$")}async function g(e){let n,t,i=e.headers.get("x-forwarded-host")||e.headers.get("host")||"127.0.0.1:3000",o=e.headers.get("x-forwarded-proto")||"https",s=new URL(e.url),_=process.env.NEXT_PUBLIC_URL_PREFIX||"",r=`${o}://${i}${_}`,E=s.searchParams.get("key")||s.searchParams.get("apiKey")||"",a=s.searchParams.get("yes")??s.searchParams.get("y")??s.searchParams.get("noninteractive"),l=null!==a&&!["0","false","no"].includes(a.trim().toLowerCase()),I=(s.searchParams.get("frameworks")||s.searchParams.get("framework")||"opencode").trim()||"opencode",N=s.searchParams.get("nokey")??s.searchParams.get("no-key"),T=null!==N&&!["0","false","no"].includes(N.trim().toLowerCase());if("windows"==(n=e.headers.get("user-agent")||"",(t=e.headers.get("x-platform")||"")?"windows"===t.toLowerCase()?"windows":"unix":n.toLowerCase().includes("windows")?"windows":"unix")){let e=function(e,n,t,i=!1,o="opencode",s=!1){return["# =============================================================================\n# Agent-insight One-Click Setup (PowerShell)\n# =============================================================================\n",'$AGENT_INSIGHT_HOST = "'+$(e)+'"','$AGENT_INSIGHT_BASE_URL = "'+$(n)+'"','$AGENT_INSIGHT_SETUP_API_KEY = "'+$(t)+'"','\n# ── 非交互模式(?yes=1 / ?nokey=1,或 env):全程无提示,默认只装 opencode ──────\n# iex (irm "<host>/api/ingest/setup?yes=1&nokey=1")\n# 或 env: $env:AGENT_INSIGHT_NONINTERACTIVE=1; $env:AGENT_INSIGHT_NO_KEY=1',"$NONINTERACTIVE = $"+(i?"true":"false"),'$NONINTERACTIVE_FRAMEWORKS = "'+$(o||"opencode")+'"',"$FORCE_NO_KEY = $"+(s?"true":"false"),'if ($env:AGENT_INSIGHT_NONINTERACTIVE -eq "1" -or $env:AGENT_INSIGHT_NONINTERACTIVE -eq "true") { $NONINTERACTIVE = $true }\nif ($env:AGENT_INSIGHT_NO_KEY -eq "1" -or $env:AGENT_INSIGHT_NO_KEY -eq "true") { $FORCE_NO_KEY = $true }\nif ($NONINTERACTIVE) { Write-Host "🤖 非交互模式:跳过所有提示,安装框架 = $NONINTERACTIVE_FRAMEWORKS" }\n\nWrite-Host "🚀 Fetching Agent-insight telemetry components from $AGENT_INSIGHT_BASE_URL..."\n\n# 0. Check Node.js version\n$nodeCmd = Get-Command node -ErrorAction SilentlyContinue\nif (-not $nodeCmd) {\n Write-Host "❌ Error: Node.js is not installed." -ForegroundColor Red\n Write-Host " Agent-insight requires Node.js 20 or higher."\n Write-Host " Please install Node.js: https://nodejs.org/"\n exit 1\n}\n\n$nodeVersion = (node -v 2>$null) -replace "^v", ""\n$nodeMajor = $nodeVersion.Split(".")[0]\nif ([int]$nodeMajor -lt 20) {\n Write-Host "❌ Error: Node.js version $nodeVersion is not supported." -ForegroundColor Red\n Write-Host " Agent-insight requires Node.js 20 or higher."\n Write-Host " Please upgrade your Node.js version: https://nodejs.org/"\n exit 1\n}\nWrite-Host "✅ Node.js version: $nodeVersion"\n\n# 1. Setup Directories\n$homeDir = $env:USERPROFILE\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.agent-insight" | Out-Null\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.agent-insight\\logs" | Out-Null\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.opencode\\skills" | Out-Null\nNew-Item -ItemType Directory -Force -Path "$homeDir\\.claude\\projects" | Out-Null\nNew-Item -ItemType Directory -Force -Path ".opencode\\skills" | Out-Null\nWrite-Host "📂 Created necessary directories"\n\n# 2. Framework Selection(非交互模式跳过 inquirer,用默认 $NONINTERACTIVE_FRAMEWORKS)\nWrite-Host ""\n\nif ($NONINTERACTIVE) {\n $SELECTED_FRAMEWORKS = $NONINTERACTIVE_FRAMEWORKS\n} else {\n\n$SELECTOR_SCRIPT = "$homeDir\\.agent-insight\\framework_selector.mjs"\n$SELECTOR_RESULT = "$homeDir\\.agent-insight\\.selector_result"\n\n# Install inquirer and tsx if not already installed\nSet-Location "$homeDir\\.agent-insight"\nif (-not (Test-Path "package.json")) {\n \'{"name": "agent-insight-setup", "version": "1.0.0", "type": "module", "dependencies": {}}\' | Out-File -FilePath "package.json" -Encoding utf8\n}\nif (-not (Test-Path "node_modules\\inquirer") -or -not (Test-Path "node_modules\\tsx")) {\n Write-Host "📦 Installing dependencies for interactive selection..."\n npm install inquirer tsx --save 2>$null\n}\n\n$selectorContent = @\'\nimport inquirer from \'inquirer\';\nimport fs from \'fs\';\n\nconst frameworks = [\n { name: \'OpenCode\', value: \'opencode\' },\n { name: \'Claude Code\', value: \'claude\' },\n { name: \'Hermes\', value: \'hermes\' },\n { name: \'JiuwenSwarm\', value: \'jiuwen\' }\n];\n\nasync function select() {\n console.log(\'\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'╔══════════════════════════════════════════════════════════╗\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'║ ║\');\n console.log(\'\\x1b[1m\\x1b[36m%s\\x1b[0m\', \'║ ✨ Agent-insight ✨ ║\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'║ ║\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'╚══════════════════════════════════════════════════════════╝\');\n console.log(\'\');\n console.log(\'\\x1b[90m%s\\x1b[0m\', \' 提示: ↑↓ 移动 | 空格 选择 | a 全选 | i 反选 | Enter 确认\');\n console.log(\'\');\n\n const answers = await inquirer.prompt([\n {\n type: \'checkbox\',\n name: \'frameworks\',\n message: \'集成到:\',\n choices: frameworks,\n default: [\'opencode\'],\n pageSize: 10,\n loop: false\n }\n ]);\n\n const selected = answers.frameworks;\n \n if (selected.length > 0) {\n console.log(\'\');\n console.log(\'\\x1b[32m%s\\x1b[0m\', \'✅ 将安装以下组件:\');\n selected.forEach(fw => {\n const name = frameworks.find(f => f.value === fw)?.name || fw;\n console.log(\'\\x1b[32m%s\\x1b[0m\', \' • \' + name);\n });\n console.log(\'\');\n } else {\n console.log(\'\');\n console.log(\'\\x1b[33m%s\\x1b[0m\', \'⚠️ 未选择任何组件,将不进行安装。\');\n console.log(\'\');\n }\n\n const resultFile = process.env.SELECTOR_RESULT_FILE || process.env.USERPROFILE + \'\\\\.agent-insight\\\\.selector_result\';\n fs.writeFileSync(resultFile, selected.join(\',\'));\n}\n\nselect().catch(err => {\n console.error(\'Error:\', err);\n process.exit(1);\n});\n\'@\n\nSet-Content -Path $SELECTOR_SCRIPT -Value $selectorContent -Encoding UTF8\n\n# Run the selector interactively\n$env:SELECTOR_RESULT_FILE = $SELECTOR_RESULT\nSet-Location "$homeDir\\.agent-insight"\nnpx -y tsx $SELECTOR_SCRIPT\n\n# Read the selection result from file\nif (Test-Path $SELECTOR_RESULT) {\n $SELECTED_FRAMEWORKS = Get-Content $SELECTOR_RESULT\n Remove-Item $SELECTOR_RESULT -Force\n} else {\n $SELECTED_FRAMEWORKS = ""\n}\n} # end: 交互 vs 非交互 框架选择\n\n# Set installation flags based on selection\n$INSTALL_OPENCODE = $false\n$INSTALL_CLAUDE = $false\n$INSTALL_HERMES = $false\n$INSTALL_JIUWEN = $false\n\nif ($SELECTED_FRAMEWORKS -match "opencode") {\n $INSTALL_OPENCODE = $true\n}\nif ($SELECTED_FRAMEWORKS -match "claude") {\n $INSTALL_CLAUDE = $true\n}\nif ($SELECTED_FRAMEWORKS -match "hermes") {\n $INSTALL_HERMES = $true\n}\nif ($SELECTED_FRAMEWORKS -match "jiuwen") {\n $INSTALL_JIUWEN = $true\n}\n\n# Exit if nothing selected\nif (-not $INSTALL_OPENCODE -and -not $INSTALL_CLAUDE -and -not $INSTALL_HERMES -and -not $INSTALL_JIUWEN) {\n Write-Host "⚠️ 未选择任何框架组件,将跳过插件安装。"\n Write-Host " 继续执行配置步骤..."\n Write-Host ""\n}\n\n# 3. Download Components\nif ($INSTALL_OPENCODE) {\n Write-Host "⏬ Downloading OpenCode Plugin..."\n $opencodeConfigDir = Join-Path $homeDir ".config\\opencode"\n New-Item -ItemType Directory -Path (Join-Path $opencodeConfigDir "plugins") -Force | Out-Null\n Remove-Item -Path (Join-Path $opencodeConfigDir "plugins\\Skill-Insight.ts") -Force -ErrorAction SilentlyContinue\n Remove-Item -Path (Join-Path $opencodeConfigDir "plugins\\Witty-Skill-Insight.ts") -Force -ErrorAction SilentlyContinue\n Remove-Item -Path (Join-Path $homeDir ".opencode\\plugins\\Skill-Insight.ts") -Force -ErrorAction SilentlyContinue\n Remove-Item -Path (Join-Path $homeDir ".opencode\\plugins\\Witty-Skill-Insight.ts") -Force -ErrorAction SilentlyContinue\n Remove-Item -Path (Join-Path $opencodeConfigDir "plugins\\Witty-Skill-Insight.tui.tsx") -Force -ErrorAction SilentlyContinue\n Remove-Item -Path (Join-Path $homeDir ".opencode\\plugins\\Witty-Skill-Insight.tui.tsx") -Force -ErrorAction SilentlyContinue\n Invoke-WebRequest -Uri "$AGENT_INSIGHT_BASE_URL/api/setup/opencode" -OutFile (Join-Path $opencodeConfigDir "plugins\\Witty-Skill-Insight.ts")\n Write-Host "⏬ Downloading OpenCode Uploader..."\n Invoke-WebRequest -Uri "$AGENT_INSIGHT_BASE_URL/api/setup/opencode-uploader" -OutFile (Join-Path $homeDir ".agent-insight\\opencode_uploader_client.js")\n # TUI 插件是终端(TUI)专用统计页脚,依赖 solid-js/@opentui/solid;\n # 非交互(desktop/headless/共享账户)用不到,历史上会因缺依赖拖垮 opencode 启动 → 跳过\n if ($NONINTERACTIVE) {\n Write-Host "⏭️ 非交互模式:跳过 TUI 统计插件(仅终端 TUI 需要)。"\n } else {\n Write-Host "⏬ Downloading OpenCode TUI Plugin..."\n $tuiPluginPath = (Join-Path $opencodeConfigDir "plugins\\Witty-Skill-Insight.tui.tsx")\n Invoke-WebRequest -Uri "$AGENT_INSIGHT_BASE_URL/api/setup/opencode-tui" -OutFile $tuiPluginPath\n $tuiConfigFile = (Join-Path $opencodeConfigDir "tui.json")\n try {\n $data = @{}\n if (Test-Path $tuiConfigFile) {\n $raw = Get-Content $tuiConfigFile -Raw\n if ($raw -and $raw.Trim()) { $data = $raw | ConvertFrom-Json }\n }\n if (-not $data.plugin) { $data | Add-Member -MemberType NoteProperty -Name plugin -Value @() -Force }\n if ($data.plugin -notcontains $tuiPluginPath) { $data.plugin += $tuiPluginPath }\n $data | ConvertTo-Json -Depth 10 | Set-Content -Path $tuiConfigFile -Encoding UTF8\n } catch {\n Write-Host "⚠️ Failed to patch tui.json for TUI plugin."\n }\n }\n}\n\nif ($INSTALL_CLAUDE) {\n Write-Host "🛰️ Claude Code will use official OpenTelemetry logs; no session-file watcher is required."\n}\n\nif ($INSTALL_HERMES) {\n Write-Host "Installing Agent Insight Hermes plugin..."\n $hermesHome = if ($env:HERMES_HOME) { $env:HERMES_HOME } else { Join-Path $homeDir ".hermes" }\n $hermesPluginDir = Join-Path $hermesHome "plugins\\agent_insight_hermes"\n New-Item -ItemType Directory -Path $hermesPluginDir -Force | Out-Null\n Invoke-WebRequest -Uri "$AGENT_INSIGHT_BASE_URL/api/setup/hermes-plugin" -OutFile (Join-Path $hermesPluginDir "__init__.py")\n @("name: agent_insight_hermes", "version: 0.2.0", "description: Agent Insight telemetry for Hermes", "provides_hooks:", " - pre_llm_call", " - post_llm_call", " - pre_api_request", " - post_api_request", " - api_request_error", " - pre_tool_call", " - post_tool_call", " - subagent_start", " - subagent_stop", " - on_session_end") | Set-Content -Path (Join-Path $hermesPluginDir "plugin.yaml") -Encoding UTF8\n $hermesCmd = Get-Command hermes -ErrorAction SilentlyContinue\n if ($hermesCmd) {\n & $hermesCmd.Source plugins enable agent_insight_hermes\n } else {\n Write-Host "Warning: hermes command not found. The plugin files were installed; enable agent_insight_hermes after installing Hermes."\n }\n}\n\nif ($INSTALL_JIUWEN) {\n Write-Host "⏬ Installing Agent-insight JiuwenSwarm extension..."\n $jwHome = if ($env:JIUWENSWARM_DATA_DIR) { $env:JIUWENSWARM_DATA_DIR } else { Join-Path $homeDir ".jiuwenswarm" }\n $jwExtDir = Join-Path $jwHome "extensions\\agent-insight-observability"\n New-Item -ItemType Directory -Path $jwExtDir -Force | Out-Null\n New-Item -ItemType Directory -Path (Join-Path $jwHome "config") -Force | Out-Null\n Invoke-WebRequest -Uri "$AGENT_INSIGHT_BASE_URL/api/setup/jiuwen-extension" -OutFile (Join-Path $jwExtDir "extension.py")\n @(\'id: agent-insight-observability\', \'name: agent-insight-observability\', \'version: 0.1.0\', \'description: Zero-code observability onboarding for JiuwenSwarm via agent-core OTLP.\', \'author: agent-insight\', \'min_jiuwenswarm_version: "0.2.0"\', \'dependencies: {}\', \'config_schema:\', \' type: object\') | Set-Content -Path (Join-Path $jwExtDir "extension.yaml") -Encoding UTF8\n Write-Host "✅ JiuwenSwarm extension installed at $jwExtDir"\n}\n\n# 4. Configure ~/.agent-insight/.env\n$AGENT_INSIGHT_CONFIG_FILE = "$homeDir\\.agent-insight\\.env"\n$EXISTING_KEY = ""\n$EXISTING_HOST = ""\n$EXISTING_SHOW_TASK_STATS = ""\n$EXISTING_UPLOAD_SINCE_MS = ""\nif (Test-Path $AGENT_INSIGHT_CONFIG_FILE) {\n $content = Get-Content $AGENT_INSIGHT_CONFIG_FILE\n $keyLine = $content | Select-String \'^AGENT_INSIGHT_API_KEY=\' | Select-Object -First 1\n $hostLine = $content | Select-String \'^AGENT_INSIGHT_HOST=\' | Select-Object -First 1\n $showLine = $content | Select-String \'^AGENT_INSIGHT_SHOW_TASK_STATS=\' | Select-Object -First 1\n $sinceLine = $content | Select-String \'^AGENT_INSIGHT_OPENCODE_UPLOAD_SINCE_MS=\' | Select-Object -First 1\n if ($keyLine) {\n $EXISTING_KEY = $keyLine.Line.Substring(\'AGENT_INSIGHT_API_KEY=\'.Length)\n }\n if ($hostLine) {\n $EXISTING_HOST = $hostLine.Line.Substring(\'AGENT_INSIGHT_HOST=\'.Length)\n }\n if ($showLine) {\n $EXISTING_SHOW_TASK_STATS = $showLine.Line.Substring(\'AGENT_INSIGHT_SHOW_TASK_STATS=\'.Length)\n }\n if ($sinceLine) {\n $EXISTING_UPLOAD_SINCE_MS = $sinceLine.Line.Substring(\'AGENT_INSIGHT_OPENCODE_UPLOAD_SINCE_MS=\'.Length)\n }\n}\n\n# -- API Key Logic --\n$FINAL_KEY = if ($AGENT_INSIGHT_SETUP_API_KEY) { $AGENT_INSIGHT_SETUP_API_KEY } else { $EXISTING_KEY }\nif ($FORCE_NO_KEY) {\n $FINAL_KEY = ""\n Write-Host "🔑 --no-key:强制无 key(清空本机已有 key),数据归到服务端 AGENT_INSIGHT_DEFAULT_INGEST_USER 指定的共享账号。"\n} elseif ($NONINTERACTIVE) {\n if ($FINAL_KEY) { Write-Host "🔑 Using API Key (from setup URL / existing config)." }\n else { Write-Host "🔑 非交互模式且未提供 API Key —— 以「无 key」方式上报,数据归到服务端 AGENT_INSIGHT_DEFAULT_INGEST_USER 指定的共享账号。" }\n} elseif ($AGENT_INSIGHT_SETUP_API_KEY) {\n Write-Host "🔑 Using API Key from setup URL."\n} elseif ($EXISTING_KEY) {\n Write-Host "🔑 Found existing API Key."\n $USE_EXISTING = Read-Host "👉 Use existing key? (y/N, Default: y)"\n if ($USE_EXISTING -match \'^[Nn]$\') {\n $FINAL_KEY = Read-Host "👉 Please enter your NEW API Key"\n }\n} else {\n Write-Host "🔑 AGENT_INSIGHT_API_KEY is not set."\n $FINAL_KEY = Read-Host "👉 Please enter your API Key"\n}\n\n# -- Host Logic --\n$FINAL_HOST = $AGENT_INSIGHT_HOST\nif (-not $NONINTERACTIVE -and $EXISTING_HOST -and ($EXISTING_HOST -ne $AGENT_INSIGHT_HOST)) {\n Write-Host "🌐 Current Host in config: $EXISTING_HOST"\n Write-Host "🌐 New Host detected: $AGENT_INSIGHT_HOST"\n $CHANGE_HOST = Read-Host "👉 Change to new Host? (y/N, Default: y)"\n if ($CHANGE_HOST -match \'^[Nn]$\') {\n $FINAL_HOST = $EXISTING_HOST\n }\n} elseif (-not $EXISTING_HOST) {\n $FINAL_HOST = $AGENT_INSIGHT_HOST\n}\n\n$FINAL_SHOW_TASK_STATS = $EXISTING_SHOW_TASK_STATS\nif (-not $FINAL_SHOW_TASK_STATS) {\n $FINAL_SHOW_TASK_STATS = "true"\n}\n\nif (-not $FINAL_KEY) {\n if ($NONINTERACTIVE -or $FORCE_NO_KEY) {\n Write-Host "ℹ️ 未配置 API Key:以「无 key」方式上报,数据归到服务端默认共享账号(需服务端已配 AGENT_INSIGHT_DEFAULT_INGEST_USER)。"\n } else {\n Write-Host "⚠️ Warning: No API Key provided. Telemetry upload will fail until you set it in $AGENT_INSIGHT_CONFIG_FILE"\n }\n}\n\n# -- Per-account isolation: namespace opencode spool/checkpoint by API-key hash --\n$CLIENT_KEY_HASH = ([System.BitConverter]::ToString(([System.Security.Cryptography.SHA256]::Create()).ComputeHash([System.Text.Encoding]::UTF8.GetBytes([string]$FINAL_KEY))) -replace \'-\',\'\').ToLower().Substring(0,16)\n$NOW_MS = [string][long]([DateTimeOffset]::UtcNow.ToUnixTimeMilliseconds())\nif ($EXISTING_UPLOAD_SINCE_MS -and ($FINAL_KEY -eq $EXISTING_KEY)) { $UPLOAD_SINCE_MS = $EXISTING_UPLOAD_SINCE_MS } else { $UPLOAD_SINCE_MS = $NOW_MS }\n\nWrite-Host "⚙️ Updating configuration..."\nNew-Item -ItemType File -Path $AGENT_INSIGHT_CONFIG_FILE -Force | Out-Null\nCopy-Item $AGENT_INSIGHT_CONFIG_FILE "$AGENT_INSIGHT_CONFIG_FILE.bak"\n$content = Get-Content "$AGENT_INSIGHT_CONFIG_FILE.bak"\n$content | Where-Object { $_ -notmatch \'^AGENT_INSIGHT_HOST=\' -and $_ -notmatch \'^AGENT_INSIGHT_API_KEY=\' -and $_ -notmatch \'^AGENT_INSIGHT_SHOW_TASK_STATS=\' -and $_ -notmatch \'^AGENT_INSIGHT_RETENTION_DAYS=\' -and $_ -notmatch \'^AGENT_INSIGHT_OPENCODE_OTEL_ENABLE=\' -and $_ -notmatch \'^AGENT_INSIGHT_OPENCODE_SPOOL_DIR=\' -and $_ -notmatch \'^AGENT_INSIGHT_OPENCODE_UPLOADER=\' -and $_ -notmatch \'^AGENT_INSIGHT_CLAUDE_OTEL_SPOOL_DIR=\' -and $_ -notmatch \'^AGENT_INSIGHT_CLAUDE_OTEL_RAW_API_BODIES=\' -and $_ -notmatch \'^AGENT_INSIGHT_MAX_TOOL_IO=\' -and $_ -notmatch \'^AGENT_INSIGHT_MAX_EVENT_STRING=\' -and $_ -notmatch \'^AGENT_INSIGHT_OPENCODE_UPLOAD_COOLDOWN_MS=\' -and $_ -notmatch \'^AGENT_INSIGHT_CLIENT_KEY_HASH=\' -and $_ -notmatch \'^AGENT_INSIGHT_OPENCODE_CHECKPOINT=\' -and $_ -notmatch \'^AGENT_INSIGHT_OPENCODE_UPLOAD_SINCE_MS=\' } | Set-Content $AGENT_INSIGHT_CONFIG_FILE\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_HOST=$FINAL_HOST"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_API_KEY=$FINAL_KEY"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_SHOW_TASK_STATS=$FINAL_SHOW_TASK_STATS"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_RETENTION_DAYS=10"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_OPENCODE_OTEL_ENABLE=true"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_CLIENT_KEY_HASH=$CLIENT_KEY_HASH"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_OPENCODE_SPOOL_DIR=$homeDir\\.agent-insight\\otel_data\\opencode\\$CLIENT_KEY_HASH"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_OPENCODE_CHECKPOINT=$homeDir\\.agent-insight\\opencode_uploader_checkpoint_$CLIENT_KEY_HASH.json"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_OPENCODE_UPLOAD_SINCE_MS=$UPLOAD_SINCE_MS"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_OPENCODE_UPLOADER=$homeDir\\.agent-insight\\opencode_uploader_client.js"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_CLAUDE_OTEL_SPOOL_DIR=$homeDir\\.agent-insight\\otel_data\\claude"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_CLAUDE_OTEL_RAW_API_BODIES=file:$homeDir\\.agent-insight\\claude_raw_bodies"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_MAX_TOOL_IO=4000"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_MAX_EVENT_STRING=20000"\nAdd-Content $AGENT_INSIGHT_CONFIG_FILE "AGENT_INSIGHT_OPENCODE_UPLOAD_COOLDOWN_MS=15000"\nRemove-Item "$AGENT_INSIGHT_CONFIG_FILE.bak" -Force\n\n# 6.4 Configure Agent Insight Hermes plugin\nif ($INSTALL_HERMES) {\n $hermesHome = if ($env:HERMES_HOME) { $env:HERMES_HOME } else { Join-Path $homeDir ".hermes" }\n $hermesPluginDir = Join-Path $hermesHome "plugins\\agent_insight_hermes"\n New-Item -ItemType Directory -Path $hermesPluginDir -Force | Out-Null\n $hermesConfig = @{ host = $FINAL_HOST.TrimEnd("/"); api_key = $FINAL_KEY; service_name = "hermes"; max_content_chars = 200000; spool_dir = (Join-Path $skillInsightDir "data\\hermes-otel-spool"); log_file = (Join-Path $skillInsightDir "logs\\hermes-plugin.log") } | ConvertTo-Json\n Set-Content -Path (Join-Path $hermesPluginDir "config.json") -Value $hermesConfig -Encoding UTF8\n Write-Host "Agent Insight Hermes config written to $hermesPluginDir\\config.json"\n}\n\n# 6.45 Configure JiuwenSwarm telemetry (workspace config\\.env, read by the extension)\nif ($INSTALL_JIUWEN) {\n $jwHome = if ($env:JIUWENSWARM_DATA_DIR) { $env:JIUWENSWARM_DATA_DIR } else { Join-Path $homeDir ".jiuwenswarm" }\n $jwEnv = Join-Path $jwHome "config\\.env"\n $jwExtParent = Join-Path $jwHome "extensions"\n $jwOtlpEndpoint = $FINAL_HOST.TrimEnd("/") + "/api/ingest/otel/v1/traces"\n New-Item -ItemType Directory -Path (Join-Path $jwHome "config") -Force | Out-Null\n New-Item -ItemType File -Path $jwEnv -Force | Out-Null\n $jwPrev = Get-Content $jwEnv\n $prevExtLine = $jwPrev | Select-String \'^EXTENSION_DIRS=\' | Select-Object -First 1\n # 去掉历史值可能带的成对引号(模板默认 EXTENSION_DIRS=""),否则拼出 "";<dir> 会破坏 dotenv 解析\n $prevExtDirs = if ($prevExtLine) { $prevExtLine.Line.Substring(\'EXTENSION_DIRS=\'.Length).Trim(\'"\').Trim("\'") } else { "jiuwenswarm/extensions" }\n if (-not $prevExtDirs) { $prevExtDirs = "jiuwenswarm/extensions" }\n if ($prevExtDirs.Split(";") -notcontains $jwExtParent) { $newExtDirs = "$prevExtDirs;$jwExtParent" } else { $newExtDirs = $prevExtDirs }\n $jwPrev | Where-Object { $_ -notmatch \'^OTEL_ENABLED=\' -and $_ -notmatch \'^AGENT_INSIGHT_OTLP_ENDPOINT=\' -and $_ -notmatch \'^AGENT_INSIGHT_API_KEY=\' -and $_ -notmatch \'^EXTENSION_DIRS=\' } | Set-Content $jwEnv\n Add-Content $jwEnv "OTEL_ENABLED=true"\n Add-Content $jwEnv "AGENT_INSIGHT_OTLP_ENDPOINT=$jwOtlpEndpoint"\n Add-Content $jwEnv "AGENT_INSIGHT_API_KEY=$FINAL_KEY"\n Add-Content $jwEnv "EXTENSION_DIRS=$newExtDirs"\n Write-Host "✅ JiuwenSwarm telemetry configured -> $jwOtlpEndpoint (service=jiuwenswarm)"\n}\nWrite-Host "✅ Configuration updated at $AGENT_INSIGHT_CONFIG_FILE"\n\n# 6.5 Configure Claude Code official OTel logs\nif ($INSTALL_CLAUDE) {\n $claudeOtelScript = @\'\nfunction Invoke-SkillInsightClaude {\n $envFile = Join-Path $env:USERPROFILE ".agent-insight\\.env"\n if (Test-Path $envFile) {\n Get-Content $envFile | ForEach-Object {\n if ($_ -match "^([^#=]+)=(.*)$") { [Environment]::SetEnvironmentVariable($matches[1], $matches[2], "Process") }\n }\n }\n $siHost = if ($env:AGENT_INSIGHT_HOST) { $env:AGENT_INSIGHT_HOST } else { "127.0.0.1:3000" }\n if ($siHost -notmatch "^https?://") { $siHost = "http://$siHost" }\n $siHost = $siHost.TrimEnd("/")\n $env:CLAUDE_CODE_ENABLE_TELEMETRY = "1"\n $env:OTEL_LOGS_EXPORTER = "otlp"\n if (-not $env:OTEL_METRICS_EXPORTER) { $env:OTEL_METRICS_EXPORTER = "none" }\n $env:OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = "http/json"\n $env:OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = "$siHost/api/ingest/otel/v1/logs"\n $env:OTEL_EXPORTER_OTLP_HEADERS = "x-witty-api-key=$($env:AGENT_INSIGHT_API_KEY)"\n $env:OTEL_LOG_USER_PROMPTS = "1"\n $env:OTEL_LOG_TOOL_DETAILS = "1"\n $env:OTEL_LOG_TOOL_CONTENT = "1"\n $rawBodyDir = Join-Path $env:USERPROFILE ".agent-insight\\claude_raw_bodies"\n New-Item -ItemType Directory -Path $rawBodyDir -Force | Out-Null\n if (-not $env:AGENT_INSIGHT_CLAUDE_OTEL_RAW_API_BODIES) { $env:AGENT_INSIGHT_CLAUDE_OTEL_RAW_API_BODIES = "file:$rawBodyDir" }\n $env:OTEL_LOG_RAW_API_BODIES = $env:AGENT_INSIGHT_CLAUDE_OTEL_RAW_API_BODIES\n $cmd = Get-Command claude -CommandType Application -ErrorAction SilentlyContinue\n if (-not $cmd) { throw "claude executable not found in PATH" }\n & $cmd.Source @args\n}\nSet-Alias claude Invoke-SkillInsightClaude\n\'@\n $claudeOtelPath = "$homeDir\\.agent-insight\\claude_otel_env.ps1"\n Set-Content -Path $claudeOtelPath -Value $claudeOtelScript -Encoding UTF8\n $profileDir = Split-Path $PROFILE -Parent\n if ($profileDir) { New-Item -ItemType Directory -Path $profileDir -Force | Out-Null }\n $profileText = if (Test-Path $PROFILE) { Get-Content $PROFILE -Raw } else { "" }\n if (-not ($profileText.Contains(".agent-insight\\claude_otel_env.ps1") -or $profileText.Contains(".agent-insight/claude_otel_env.ps1"))) {\n Add-Content -Path $PROFILE -Value ""\n Add-Content -Path $PROFILE -Value "# Skill-Insight Claude Code OTel"\n Add-Content -Path $PROFILE -Value ". `"$claudeOtelPath`""\n }\n Write-Host "✅ Claude Code OTel env installed at $claudeOtelPath"\n Write-Host " Restart PowerShell or run: . `"$claudeOtelPath`""\n Get-Process | Where-Object { $_.CommandLine -like "*claude_watcher_client.ts*" } | Stop-Process -Force -ErrorAction SilentlyContinue\n Remove-Item "$homeDir\\.agent-insight\\claude_watcher_client.ts", "$homeDir\\.agent-insight\\start_claude_watcher.ps1", "$homeDir\\.agent-insight\\stop_claude_watcher.ps1", "$homeDir\\.agent-insight\\claude_watcher.pid" -Force -ErrorAction SilentlyContinue\n Write-Host "🧹 Removed legacy Claude session-file watcher if it was installed."\n}\n\n# 7. Create Watcher Startup/Stop Scripts\n$NEEDS_WATCHER_SCRIPTS = $false\nif ($INSTALL_OPENCODE) {\n $NEEDS_WATCHER_SCRIPTS = $true\n}\n\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "📝 Creating watcher management scripts..."\n\n if ($INSTALL_OPENCODE) {\n $startScript = @\'\nGet-Process | Where-Object { $_.CommandLine -like "*opencode_uploader_client.js*" } | Stop-Process -Force -ErrorAction SilentlyContinue\nGet-Process | Where-Object { $_.CommandLine -like "*skill-insight-opencode-uploader-loop*" } | Stop-Process -Force -ErrorAction SilentlyContinue\nNew-Item -ItemType Directory -Path "$env:USERPROFILE\\.agent-insight\\logs" -Force | Out-Null\n$intervalSec = if ($env:AGENT_INSIGHT_OPENCODE_UPLOADER_INTERVAL_SEC) { $env:AGENT_INSIGHT_OPENCODE_UPLOADER_INTERVAL_SEC } else { "300" }\n$logFile = "$env:USERPROFILE\\.agent-insight\\logs\\opencode_uploader.log"\n$uploaderPath = "$env:USERPROFILE\\.agent-insight\\opencode_uploader_client.js"\n$runtime = if (Get-Command node -ErrorAction SilentlyContinue) { "node" } elseif (Get-Command bun -ErrorAction SilentlyContinue) { "bun" } else { $null }\nif (-not $runtime) {\n Add-Content $logFile "[$(Get-Date)] Skipped: node/bun not installed"\n return\n}\n# Sentinel marker in script body so it can be matched by CommandLine search.\n$loopBody = @"\n# skill-insight-opencode-uploader-loop\nwhile (`$true) {\n & `"$runtime`" `"$uploaderPath`" *>> `"$logFile`"\n Start-Sleep -Seconds $intervalSec\n}\n"@\n$proc = Start-Process -FilePath "powershell" -ArgumentList "-NoProfile", "-Command", $loopBody -PassThru -WindowStyle Hidden\nSet-Content "$env:USERPROFILE\\.agent-insight\\opencode_uploader.pid" $proc.Id\nWrite-Host "OpenCode uploader daemon started with PID $($proc.Id) (interval=${intervalSec}s)"\n\'@\n Set-Content -Path "$homeDir\\.agent-insight\\start_opencode_uploader.ps1" -Value $startScript -Encoding UTF8\n\n $stopScript = @\'\nGet-Process | Where-Object { $_.CommandLine -like "*skill-insight-opencode-uploader-loop*" } | Stop-Process -Force -ErrorAction SilentlyContinue\nGet-Process | Where-Object { $_.CommandLine -like "*opencode_uploader_client.js*" } | Stop-Process -Force -ErrorAction SilentlyContinue\nRemove-Item "$env:USERPROFILE\\.agent-insight\\opencode_uploader.pid" -Force -ErrorAction SilentlyContinue\nWrite-Host "OpenCode uploader daemon stopped"\n\'@\n Set-Content -Path "$homeDir\\.agent-insight\\stop_opencode_uploader.ps1" -Value $stopScript -Encoding UTF8\n }\n\n $combinedStart = \'Write-Host "Starting Agent-Insight watchers..."\'\n if ($INSTALL_OPENCODE) { $combinedStart += [char]10 + "& `"$homeDir\\.agent-insight\\start_opencode_uploader.ps1`"" }\n $combinedStart += [char]10 + \'Write-Host "All watchers started!"\'\n Set-Content -Path "$homeDir\\.agent-insight\\start_watchers.ps1" -Value $combinedStart -Encoding UTF8\n\n $combinedStop = \'Write-Host "Stopping Agent-Insight watchers..."\'\n if ($INSTALL_OPENCODE) { $combinedStop += [char]10 + "& `"$homeDir\\.agent-insight\\stop_opencode_uploader.ps1`"" }\n $combinedStop += [char]10 + \'Write-Host "All watchers stopped!"\'\n Set-Content -Path "$homeDir\\.agent-insight\\stop_watchers.ps1" -Value $combinedStop -Encoding UTF8\n}\n\n# 8. Start Watchers Now\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "🚀 Starting telemetry watchers..."\n if (Get-Command npx -ErrorAction SilentlyContinue) {\n & "$homeDir\\.agent-insight\\start_watchers.ps1"\n } else {\n Write-Host "⚠️ Node.js (npx) not found. Skipping watcher startup."\n }\n}\n\n# 10. Final Summary\nWrite-Host ""\nWrite-Host "🌟 Agent-Insight Telemetry: READY"\nWrite-Host "------------------------------------------------"\nWrite-Host "Installed Components:"\nif ($INSTALL_OPENCODE) { Write-Host " ✅ OpenCode Plugin: $opencodeConfigDir\\plugins\\Witty-Skill-Insight.ts" }\nif ($INSTALL_OPENCODE) { Write-Host " ✅ OpenCode Uploader Daemon: ~/.agent-insight/opencode_uploader_client.js (5-min poll)" }\nif ($INSTALL_CLAUDE) { Write-Host " ✅ Claude Code OTel: ~/.agent-insight/claude_otel_env.ps1" }\nif ($INSTALL_HERMES) { $summaryHermesHome = if ($env:HERMES_HOME) { $env:HERMES_HOME } else { Join-Path $homeDir ".hermes" }; Write-Host " ✅ Agent Insight Hermes Plugin: $summaryHermesHome\\plugins\\agent_insight_hermes\\config.json" }\nif ($INSTALL_JIUWEN) { $summaryJwHome = if ($env:JIUWENSWARM_DATA_DIR) { $env:JIUWENSWARM_DATA_DIR } else { Join-Path $homeDir ".jiuwenswarm" }; Write-Host " ✅ JiuwenSwarm Extension: $summaryJwHome\\extensions\\agent-insight-observability (telemetry in config\\.env)" }\n\nif ($NEEDS_WATCHER_SCRIPTS) {\n Write-Host ""\n Write-Host "Watcher Management:"\n Write-Host " Start all: ~/.agent-insight/start_watchers.ps1"\n Write-Host " Stop all: ~/.agent-insight/stop_watchers.ps1"\n Write-Host " Logs: ~/.agent-insight/logs/"\n}\n\nWrite-Host ""\nWrite-Host "Usage:"\nif ($INSTALL_OPENCODE) { Write-Host " 1. Run: opencode run \'hello\'" }\nif ($INSTALL_CLAUDE) { Write-Host " 2. Restart PowerShell, then run: claude" }\nif ($INSTALL_HERMES) { Write-Host " 3. Restart Hermes or start a new Hermes conversation" }\nWrite-Host "------------------------------------------------"'].join("\n")}(r,r,E,l,I,T);return new O.NextResponse(e,{headers:{"Content-Type":"text/plain; charset=utf-8"}})}{let e=function(e,n,t,i=!1,o="opencode",s=!1){return["#!/bin/bash\n# =============================================================================\n# Agent-insight One-Click Setup\n# =============================================================================\n",'AGENT_INSIGHT_HOST="'+u(e)+'"','AGENT_INSIGHT_BASE_URL="'+u(n)+'"','AGENT_INSIGHT_SETUP_API_KEY="'+u(t)+'"','OPENCODE_CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/opencode"\n\n# ── 非交互模式(-y / --yes):全程无提示,默认只装 opencode ─────────────────────\n# curl -sSf "<host>/api/ingest/setup" | bash -s -- -y\n# URL 直接带: curl -sSf "<host>/api/ingest/setup?yes=1" | bash\n# env: curl -sSf "<host>/api/ingest/setup" | AGENT_INSIGHT_NONINTERACTIVE=1 bash\n# 指定框架: ... | bash -s -- -y --frameworks=opencode,claude\n# 强制无 key: ... ?yes=1&nokey=1 或 bash -s -- -y --no-key(清空本机已有 key,切共享账号)',"NONINTERACTIVE="+(i?"true":"false"),'NONINTERACTIVE_FRAMEWORKS="'+u(o||"opencode")+'"',"FORCE_NO_KEY="+(s?"true":"false"),'for arg in "$@"; do\n case "$arg" in\n -y|--yes|--non-interactive|--noninteractive) NONINTERACTIVE=true ;;\n --no-key|--nokey) FORCE_NO_KEY=true ;;\n --frameworks=*) NONINTERACTIVE=true; NONINTERACTIVE_FRAMEWORKS="${arg#*=}" ;;\n esac\ndone\nif [ "${AGENT_INSIGHT_NONINTERACTIVE:-}" = "1" ] || [ "${AGENT_INSIGHT_NONINTERACTIVE:-}" = "true" ]; then NONINTERACTIVE=true; fi\nif [ "$NONINTERACTIVE" = "true" ]; then echo "🤖 非交互模式:跳过所有提示,安装框架 = $NONINTERACTIVE_FRAMEWORKS"; fi\n\necho "🚀 Fetching Agent-insight telemetry components from $AGENT_INSIGHT_BASE_URL..."\n\n# 0. Check Node.js version\nif ! command -v node &> /dev/null; then\n echo "❌ Error: Node.js is not installed."\n echo " Agent-insight requires Node.js 20 or higher."\n echo " Please install Node.js: https://nodejs.org/"\n exit 1\nfi\n\nNODE_VERSION=$(node -v 2>/dev/null | sed "s/v//")\nNODE_MAJOR=$(echo "$NODE_VERSION" | cut -d. -f1)\nif [ "$NODE_MAJOR" -lt 20 ]; then\n echo "❌ Error: Node.js version $NODE_VERSION is not supported."\n echo " Agent-insight requires Node.js 20 or higher."\n echo " Please upgrade your Node.js version: https://nodejs.org/"\n exit 1\nfi\necho "✅ Node.js version: $NODE_VERSION"\n\n# 1. Setup Directories\nmkdir -p "$HOME/.agent-insight"\nmkdir -p "$HOME/.agent-insight/logs"\nmkdir -p "$OPENCODE_CONFIG_DIR/plugins"\nmkdir -p "$HOME/.opencode/skills"\nmkdir -p "$HOME/.claude/projects"\nmkdir -p ".opencode/skills"\nmkdir -p "$HOME/.agent-insight/example"\necho "📂 Created necessary directories"\n\n# 1b. Download built-in example messages log (for the bundled "messages 日志分析" dataset / demo traces)\nif curl -sSf "$AGENT_INSIGHT_BASE_URL/api/setup/example-messages" -o "$HOME/.agent-insight/example/messages"; then\n echo "📄 Example log ready at $HOME/.agent-insight/example/messages"\nelse\n echo "⚠️ Skipped example messages log download (non-fatal)"\nfi\n\n# 2. Framework Selection(非交互模式跳过 inquirer,直接用 $NONINTERACTIVE_FRAMEWORKS)\necho ""\n\nif [ "$NONINTERACTIVE" = "true" ]; then\n SELECTED_FRAMEWORKS="$NONINTERACTIVE_FRAMEWORKS"\nelse\n\nSELECTOR_SCRIPT="$HOME/.agent-insight/framework_selector.mjs"\nSELECTOR_RESULT="$HOME/.agent-insight/.selector_result"\n\n# Install inquirer and tsx if not already installed\ncd "$HOME/.agent-insight"\nif [ ! -f "package.json" ]; then\n echo \'{"name": "agent-insight-setup", "version": "1.0.0", "type": "module", "dependencies": {}}\' > package.json\nfi\nif [ ! -d "node_modules/inquirer" ] || [ ! -d "node_modules/tsx" ]; then\n echo "📦 Installing dependencies for interactive selection..."\n npm install inquirer tsx --save 2>/dev/null\nfi\n\ncat > "$SELECTOR_SCRIPT" << \'SELECTOR_EOF\'\nimport inquirer from \'inquirer\';\nimport fs from \'fs\';\n\nconst frameworks = [\n { name: \'OpenCode\', value: \'opencode\' },\n { name: \'Claude Code\', value: \'claude\' },\n { name: \'Hermes\', value: \'hermes\' },\n { name: \'JiuwenSwarm\', value: \'jiuwen\' }\n];\n\nasync function select() {\n console.log(\'\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'╔══════════════════════════════════════════════════════════╗\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'║ ║\');\n console.log(\'\\x1b[1m\\x1b[36m%s\\x1b[0m\', \'║ ✨ Agent-insight ✨ ║\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'║ ║\');\n console.log(\'\\x1b[36m%s\\x1b[0m\', \'╚══════════════════════════════════════════════════════════╝\');\n console.log(\'\');\n console.log(\'\\x1b[90m%s\\x1b[0m\', \' 提示: ↑↓ 移动 | 空格 选择 | a 全选 | i 反选 | Enter 确认\');\n console.log(\'\');\n\n const answers = await inquirer.prompt([\n {\n type: \'checkbox\',\n name: \'frameworks\',\n message: \'集成到:\',\n choices: frameworks,\n default: [\'opencode\'],\n pageSize: 10,\n loop: false\n }\n ]);\n\n const selected = answers.frameworks;\n \n if (selected.length > 0) {\n console.log(\'\');\n console.log(\'\\x1b[32m%s\\x1b[0m\', \'✅ 将安装以下组件:\');\n selected.forEach(fw => {\n const name = frameworks.find(f => f.value === fw)?.name || fw;\n console.log(\'\\x1b[32m%s\\x1b[0m\', \' • \' + name);\n });\n console.log(\'\');\n } else {\n console.log(\'\');\n console.log(\'\\x1b[33m%s\\x1b[0m\', \'⚠️ 未选择任何组件,将不进行安装。\');\n console.log(\'\');\n }\n\n const resultFile = process.env.SELECTOR_RESULT_FILE || process.env.HOME + \'/.agent-insight/.selector_result\';\n fs.writeFileSync(resultFile, selected.join(\',\'));\n}\n\nselect().catch(err => {\n console.error(\'Error:\', err);\n process.exit(1);\n});\nSELECTOR_EOF\n\n# Run the selector interactively from /dev/tty\nexport SELECTOR_RESULT_FILE="$SELECTOR_RESULT"\ncd "$HOME/.agent-insight" && npx -y tsx "$SELECTOR_SCRIPT" < /dev/tty\n\n# Read the selection result from file\nif [ -f "$SELECTOR_RESULT" ]; then\n SELECTED_FRAMEWORKS=$(cat "$SELECTOR_RESULT")\n rm -f "$SELECTOR_RESULT"\nelse\n SELECTED_FRAMEWORKS=""\nfi\nfi # end: 交互 vs 非交互 框架选择\n\n# Set installation flags based on selection\nINSTALL_OPENCODE=false\nINSTALL_CLAUDE=false\nINSTALL_HERMES=false\nINSTALL_JIUWEN=false\n\nif [[ "$SELECTED_FRAMEWORKS" == *"opencode"* ]]; then\n INSTALL_OPENCODE=true\nfi\nif [[ "$SELECTED_FRAMEWORKS" == *"claude"* ]]; then\n INSTALL_CLAUDE=true\nfi\nif [[ "$SELECTED_FRAMEWORKS" == *"hermes"* ]]; then\n INSTALL_HERMES=true\nfi\nif [[ "$SELECTED_FRAMEWORKS" == *"jiuwen"* ]]; then\n INSTALL_JIUWEN=true\nfi\n\n# Exit if nothing selected\nif [ "$INSTALL_OPENCODE" = "false" ] && [ "$INSTALL_CLAUDE" = "false" ] && [ "$INSTALL_HERMES" = "false" ] && [ "$INSTALL_JIUWEN" = "false" ]; then\n echo "⚠️ 未选择任何框架组件,将跳过插件安装。"\n echo " 继续执行配置步骤..."\n echo ""\nfi\n\n# 3. Download Components\nif [ "$INSTALL_OPENCODE" = "true" ]; then\n echo "⏬ Downloading OpenCode Plugin..."\n rm -f "$OPENCODE_CONFIG_DIR/plugins/Skill-Insight.ts" "$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.ts" "$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.tui.tsx" 2>/dev/null || true\n rm -f "$HOME/.opencode/plugins/Skill-Insight.ts" "$HOME/.opencode/plugins/Witty-Skill-Insight.ts" "$HOME/.opencode/plugins/Witty-Skill-Insight.tui.tsx" 2>/dev/null || true\n curl -sSf "$AGENT_INSIGHT_BASE_URL/api/setup/opencode" -o "$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.ts"\n echo "⏬ Downloading OpenCode Uploader..."\n curl -sSf "$AGENT_INSIGHT_BASE_URL/api/setup/opencode-uploader" -o "$HOME/.agent-insight/opencode_uploader_client.js"\n echo "⏬ Installing OpenCode commands..."\n mkdir -p "$OPENCODE_CONFIG_DIR/commands"\n curl -sSf "$AGENT_INSIGHT_BASE_URL/api/setup/opencode-commands/si-optimizer" -o "$OPENCODE_CONFIG_DIR/commands/si-optimizer.md"\n # TUI 插件是终端(TUI)专用的统计页脚,依赖 solid-js/@opentui/solid;\n # 非交互(desktop/headless/共享账户)场景用不到,历史上还会因缺依赖拖垮 opencode 启动 → 跳过\n if [ "$NONINTERACTIVE" = "true" ]; then\n echo "⏭️ 非交互模式:跳过 TUI 统计插件(仅终端 TUI 需要)。"\n else\n echo "⏬ Downloading OpenCode TUI Plugin..."\n curl -sSf "$AGENT_INSIGHT_BASE_URL/api/setup/opencode-tui" -o "$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.tui.tsx"\n export TUI_PLUGIN_PATH="$OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.tui.tsx"\n export TUI_CONFIG_FILE="$OPENCODE_CONFIG_DIR/tui.json"\n if command -v node &> /dev/null; then\n node - <<\'NODE\'\nconst fs = require("fs");\nconst path = require("path");\nconst file = process.env.TUI_CONFIG_FILE;\nconst pluginPath = process.env.TUI_PLUGIN_PATH;\nlet data = {};\ntry {\n if (fs.existsSync(file)) {\n const text = fs.readFileSync(file, "utf8");\n data = text && text.trim() ? JSON.parse(text) : {};\n }\n} catch {}\nif (!data || typeof data !== "object") data = {};\nconst list = Array.isArray(data.plugin) ? data.plugin.slice() : [];\nif (pluginPath && !list.includes(pluginPath)) list.push(pluginPath);\ndata.plugin = list;\nfs.mkdirSync(path.dirname(file), { recursive: true });\nfs.writeFileSync(file, JSON.stringify(data, null, 2));\nNODE\n else\n echo "⚠️ node not found; skip TUI plugin config patch."\n fi\n fi\nfi\n\nif [ "$INSTALL_CLAUDE" = "true" ]; then\n echo "🛰️ Claude Code will use official OpenTelemetry logs; no session-file watcher is required."\nfi\n\nif [ "$INSTALL_HERMES" = "true" ]; then\n echo "Installing Agent Insight Hermes plugin..."\n HERMES_HOME="${HERMES_HOME:-$HOME/.hermes}"\n HERMES_PLUGIN_DIR="$HERMES_HOME/plugins/agent_insight_hermes"\n mkdir -p "$HERMES_PLUGIN_DIR"\n curl -sSf "$AGENT_INSIGHT_BASE_URL/api/setup/hermes-plugin" -o "$HERMES_PLUGIN_DIR/__init__.py"\n cat > "$HERMES_PLUGIN_DIR/plugin.yaml" <<\'HERMES_PLUGIN_EOF\'\nname: agent_insight_hermes\nversion: 0.2.0\ndescription: Agent Insight telemetry for Hermes\nprovides_hooks:\n - pre_llm_call\n - post_llm_call\n - pre_api_request\n - post_api_request\n - api_request_error\n - pre_tool_call\n - post_tool_call\n - subagent_start\n - subagent_stop\n - on_session_end\nHERMES_PLUGIN_EOF\n if command -v hermes >/dev/null 2>&1; then\n hermes plugins enable agent_insight_hermes || echo "Warning: enable the plugin manually with: hermes plugins enable agent_insight_hermes"\n else\n echo "Warning: hermes command not found. The plugin files were installed; enable agent_insight_hermes after installing Hermes."\n fi\nfi\n\nif [ "$INSTALL_JIUWEN" = "true" ]; then\n echo "⏬ Installing Agent-insight JiuwenSwarm extension..."\n JW_HOME="${JIUWENSWARM_DATA_DIR:-$HOME/.jiuwenswarm}"\n JW_EXT_DIR="$JW_HOME/extensions/agent-insight-observability"\n mkdir -p "$JW_EXT_DIR" "$JW_HOME/config"\n curl -sSf "$AGENT_INSIGHT_BASE_URL/api/setup/jiuwen-extension" -o "$JW_EXT_DIR/extension.py"\n cat > "$JW_EXT_DIR/extension.yaml" <<\'JIUWEN_EXT_EOF\'\nid: agent-insight-observability\nname: agent-insight-observability\nversion: 0.1.0\ndescription: Zero-code observability onboarding for JiuwenSwarm via agent-core OTLP.\nauthor: agent-insight\nmin_jiuwenswarm_version: "0.2.0"\ndependencies: {}\nconfig_schema:\n type: object\nJIUWEN_EXT_EOF\n echo "✅ JiuwenSwarm extension installed at $JW_EXT_DIR"\nfi\n\n# 4. Configure ~/.agent-insight/.env\nAGENT_INSIGHT_CONFIG_FILE="$HOME/.agent-insight/.env"\nEXISTING_KEY=""\nEXISTING_HOST=""\nEXISTING_SHOW_TASK_STATS=""\nif [ -f "$AGENT_INSIGHT_CONFIG_FILE" ]; then\n EXISTING_KEY=$(grep \'^AGENT_INSIGHT_API_KEY=\' "$AGENT_INSIGHT_CONFIG_FILE" | head -n 1 | cut -d\'=\' -f2-)\n EXISTING_HOST=$(grep \'^AGENT_INSIGHT_HOST=\' "$AGENT_INSIGHT_CONFIG_FILE" | head -n 1 | cut -d\'=\' -f2-)\n EXISTING_SHOW_TASK_STATS=$(grep \'^AGENT_INSIGHT_SHOW_TASK_STATS=\' "$AGENT_INSIGHT_CONFIG_FILE" | head -n 1 | cut -d\'=\' -f2-)\n EXISTING_UPLOAD_SINCE_MS=$(grep \'^AGENT_INSIGHT_OPENCODE_UPLOAD_SINCE_MS=\' "$AGENT_INSIGHT_CONFIG_FILE" | head -n 1 | cut -d\'=\' -f2-)\nfi\n\n# -- API Key Logic --\nFINAL_KEY="${AGENT_INSIGHT_SETUP_API_KEY:-$EXISTING_KEY}"\nif [ "$FORCE_NO_KEY" = "true" ]; then\n FINAL_KEY=""\n echo "🔑 --no-key:强制无 key(清空本机已有 key),数据归到服务端 AGENT_INSIGHT_DEFAULT_INGEST_USER 指定的共享账号。"\nelif [ "$NONINTERACTIVE" = "true" ]; then\n if [ -n "$FINAL_KEY" ]; then\n echo "🔑 Using API Key (from setup URL / existing config)."\n else\n echo "🔑 非交互模式且未提供 API Key —— 以「无 key」方式上报,数据归到服务端 AGENT_INSIGHT_DEFAULT_INGEST_USER 指定的共享账号。"\n fi\nelif [ -n "$AGENT_INSIGHT_SETUP_API_KEY" ]; then\n echo "🔑 Using API Key from setup URL."\nelif [ -n "$EXISTING_KEY" ]; then\n echo "🔑 Found existing API Key."\n read -p "👉 Use existing key? (y/N, Default: y): " USE_EXISTING < /dev/tty\n if [[ "$USE_EXISTING" =~ ^[Nn]$ ]]; then\n read -p "👉 Please enter your NEW API Key: " FINAL_KEY < /dev/tty\n fi\nelse\n echo "🔑 AGENT_INSIGHT_API_KEY is not set."\n read -p "👉 Please enter your API Key: " FINAL_KEY < /dev/tty\nfi\n\n# -- Host Logic --\nFINAL_HOST="$AGENT_INSIGHT_HOST"\nif [ "$NONINTERACTIVE" != "true" ] && [ -n "$EXISTING_HOST" ] && [ "$EXISTING_HOST" != "$AGENT_INSIGHT_HOST" ]; then\n echo "🌐 Current Host in config: $EXISTING_HOST"\n echo "🌐 New Host detected: $AGENT_INSIGHT_HOST"\n read -p "👉 Change to new Host? (y/N, Default: y): " CHANGE_HOST < /dev/tty\n if [[ "$CHANGE_HOST" =~ ^[Nn]$ ]]; then\n FINAL_HOST="$EXISTING_HOST"\n fi\nelif [ -z "$EXISTING_HOST" ]; then\n FINAL_HOST="$AGENT_INSIGHT_HOST"\nfi\n\nFINAL_SHOW_TASK_STATS="$EXISTING_SHOW_TASK_STATS"\nif [ -z "$FINAL_SHOW_TASK_STATS" ]; then\n FINAL_SHOW_TASK_STATS="true"\nfi\n\nif [ -z "$FINAL_KEY" ]; then\n if [ "$NONINTERACTIVE" = "true" ] || [ "$FORCE_NO_KEY" = "true" ]; then\n echo "ℹ️ 未配置 API Key:以「无 key」方式上报,数据归到服务端默认共享账号(需服务端已配 AGENT_INSIGHT_DEFAULT_INGEST_USER)。"\n else\n echo "⚠️ Warning: No API Key provided. Telemetry upload will fail until you set it in $AGENT_INSIGHT_CONFIG_FILE"\n fi\nfi\n\n# -- Per-account isolation: hash the API key so opencode spool/checkpoint are\n# namespaced per account. Switching accounts on the same machine no longer\n# replays another account\'s history under the current key.\nCLIENT_KEY_HASH=$(printf \'%s\' "$FINAL_KEY" | { shasum -a 256 2>/dev/null || sha256sum; } | cut -c1-16)\nNOW_MS=$(node -e \'process.stdout.write(String(Date.now()))\' 2>/dev/null || echo $(( $(date +%s) * 1000 )))\n# Keep an existing baseline when re-installing the SAME key; reset to now for a\n# new/changed key so only traces produced after THIS install are uploaded.\nif [ -n "$EXISTING_UPLOAD_SINCE_MS" ] && [ "$FINAL_KEY" = "$EXISTING_KEY" ]; then\n UPLOAD_SINCE_MS="$EXISTING_UPLOAD_SINCE_MS"\nelse\n UPLOAD_SINCE_MS="$NOW_MS"\nfi\n\necho "⚙️ Updating configuration..."\ntouch "$AGENT_INSIGHT_CONFIG_FILE"\ncp "$AGENT_INSIGHT_CONFIG_FILE" "${AGENT_INSIGHT_CONFIG_FILE}.bak"\ngrep -v "^AGENT_INSIGHT_HOST=" "${AGENT_INSIGHT_CONFIG_FILE}.bak" | grep -v "^AGENT_INSIGHT_API_KEY=" | grep -v "^AGENT_INSIGHT_SHOW_TASK_STATS=" | grep -v "^AGENT_INSIGHT_RETENTION_DAYS=" | grep -v "^AGENT_INSIGHT_OPENCODE_OTEL_ENABLE=" | grep -v "^AGENT_INSIGHT_OPENCODE_SPOOL_DIR=" | grep -v "^AGENT_INSIGHT_OPENCODE_UPLOADER=" | grep -v "^AGENT_INSIGHT_CLAUDE_OTEL_SPOOL_DIR=" | grep -v "^AGENT_INSIGHT_CLAUDE_OTEL_RAW_API_BODIES=" | grep -v "^AGENT_INSIGHT_MAX_TOOL_IO=" | grep -v "^AGENT_INSIGHT_MAX_EVENT_STRING=" | grep -v "^AGENT_INSIGHT_OPENCODE_UPLOAD_COOLDOWN_MS=" | grep -v "^AGENT_INSIGHT_CLIENT_KEY_HASH=" | grep -v "^AGENT_INSIGHT_OPENCODE_CHECKPOINT=" | grep -v "^AGENT_INSIGHT_OPENCODE_UPLOAD_SINCE_MS=" > "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_HOST=$FINAL_HOST" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_API_KEY=$FINAL_KEY" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_SHOW_TASK_STATS=$FINAL_SHOW_TASK_STATS" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_RETENTION_DAYS=10" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_OPENCODE_OTEL_ENABLE=true" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_CLIENT_KEY_HASH=$CLIENT_KEY_HASH" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_OPENCODE_SPOOL_DIR=$HOME/.agent-insight/otel_data/opencode/$CLIENT_KEY_HASH" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_OPENCODE_CHECKPOINT=$HOME/.agent-insight/opencode_uploader_checkpoint_$CLIENT_KEY_HASH.json" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_OPENCODE_UPLOAD_SINCE_MS=$UPLOAD_SINCE_MS" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_OPENCODE_UPLOADER=$HOME/.agent-insight/opencode_uploader_client.js" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_CLAUDE_OTEL_SPOOL_DIR=$HOME/.agent-insight/otel_data/claude" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_CLAUDE_OTEL_RAW_API_BODIES=file:$HOME/.agent-insight/claude_raw_bodies" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_MAX_TOOL_IO=4000" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_MAX_EVENT_STRING=20000" >> "$AGENT_INSIGHT_CONFIG_FILE"\necho "AGENT_INSIGHT_OPENCODE_UPLOAD_COOLDOWN_MS=15000" >> "$AGENT_INSIGHT_CONFIG_FILE"\nrm "${AGENT_INSIGHT_CONFIG_FILE}.bak"\necho "✅ Configuration updated at $AGENT_INSIGHT_CONFIG_FILE"\n\n# 6.4 Configure Agent Insight Hermes plugin\nif [ "$INSTALL_HERMES" = "true" ]; then\n HERMES_HOME="${HERMES_HOME:-$HOME/.hermes}"\n HERMES_PLUGIN_DIR="$HERMES_HOME/plugins/agent_insight_hermes"\n mkdir -p "$HERMES_PLUGIN_DIR"\n cat > "$HERMES_PLUGIN_DIR/config.json" <<HERMES_CONFIG_EOF\n{\n "host": "${FINAL_HOST%/}",\n "api_key": "$FINAL_KEY",\n "service_name": "hermes",\n "max_content_chars": 200000,\n "spool_dir": "$HOME/.agent-insight/data/hermes-otel-spool",\n "log_file": "$HOME/.agent-insight/logs/hermes-plugin.log"\n}\nHERMES_CONFIG_EOF\n echo "Agent Insight Hermes config written to $HERMES_PLUGIN_DIR/config.json"\nfi\n\n# 6.45 Configure JiuwenSwarm telemetry (workspace config/.env, read by the extension)\nif [ "$INSTALL_JIUWEN" = "true" ]; then\n JW_HOME="${JIUWENSWARM_DATA_DIR:-$HOME/.jiuwenswarm}"\n JW_ENV="$JW_HOME/config/.env"\n JW_EXT_PARENT="$JW_HOME/extensions"\n JW_OTLP_ENDPOINT="${FINAL_HOST%/}/api/ingest/otel/v1/traces"\n mkdir -p "$JW_HOME/config"\n touch "$JW_ENV"\n cp "$JW_ENV" "${JW_ENV}.bak"\n # EXTENSION_DIRS: 保留既有(默认 jiuwenswarm/extensions) + 追加我们的目录(去重)\n PREV_EXT_DIRS=$(grep \'^EXTENSION_DIRS=\' "${JW_ENV}.bak" | head -n 1 | cut -d\'=\' -f2-)\n # 去掉历史值可能带的成对双引号:jiuwenswarm 模板默认 EXTENSION_DIRS="",\n # 直接拼接会写出 "";<dir>,python-dotenv 无法解析整行而丢弃 → 扩展目录失效。\n PREV_EXT_DIRS="${PREV_EXT_DIRS#\\"}"; PREV_EXT_DIRS="${PREV_EXT_DIRS%\\"}"\n if [ -z "$PREV_EXT_DIRS" ]; then PREV_EXT_DIRS="jiuwenswarm/extensions"; fi\n case ";$PREV_EXT_DIRS;" in\n *";$JW_EXT_PARENT;"*) NEW_EXT_DIRS="$PREV_EXT_DIRS" ;;\n *) NEW_EXT_DIRS="$PREV_EXT_DIRS;$JW_EXT_PARENT" ;;\n esac\n grep -v \'^OTEL_ENABLED=\' "${JW_ENV}.bak" | grep -v \'^AGENT_INSIGHT_OTLP_ENDPOINT=\' | grep -v \'^AGENT_INSIGHT_API_KEY=\' | grep -v \'^EXTENSION_DIRS=\' > "$JW_ENV"\n echo "OTEL_ENABLED=true" >> "$JW_ENV"\n echo "AGENT_INSIGHT_OTLP_ENDPOINT=$JW_OTLP_ENDPOINT" >> "$JW_ENV"\n echo "AGENT_INSIGHT_API_KEY=$FINAL_KEY" >> "$JW_ENV"\n echo "EXTENSION_DIRS=$NEW_EXT_DIRS" >> "$JW_ENV"\n rm -f "${JW_ENV}.bak"\n echo "✅ JiuwenSwarm telemetry configured -> $JW_OTLP_ENDPOINT (service=jiuwenswarm)"\n echo " 重启 JiuwenSwarm(agentserver)后,agent/LLM/tool trace 自动上报。"\nfi\n\n# 6.5 Configure Claude Code official OTel logs\nif [ "$INSTALL_CLAUDE" = "true" ]; then\n cat > "$HOME/.agent-insight/claude_otel_env.sh" << \'CLAUDE_OTEL_EOF\'\n# Agent-Insight Claude Code OpenTelemetry integration\nunalias claude 2>/dev/null || true\n\n_skill_insight_claude_load_env() {\n if [ -f "$HOME/.agent-insight/.env" ]; then\n set -a\n . "$HOME/.agent-insight/.env"\n set +a\n fi\n}\n\nclaude() {\n _skill_insight_claude_load_env\n local _si_host="${AGENT_INSIGHT_HOST:-127.0.0.1:3000}"\n case "$_si_host" in http://*|https://*) ;; *) _si_host="http://$_si_host" ;; esac\n _si_host="${_si_host%/}"\n mkdir -p "$HOME/.agent-insight/claude_raw_bodies" 2>/dev/null || true\n env \\\n CLAUDE_CODE_ENABLE_TELEMETRY=1 \\\n OTEL_LOGS_EXPORTER=otlp \\\n OTEL_METRICS_EXPORTER="${OTEL_METRICS_EXPORTER:-none}" \\\n OTEL_EXPORTER_OTLP_LOGS_PROTOCOL=http/json \\\n OTEL_EXPORTER_OTLP_LOGS_ENDPOINT="$_si_host/api/ingest/otel/v1/logs" \\\n OTEL_EXPORTER_OTLP_HEADERS="x-witty-api-key=${AGENT_INSIGHT_API_KEY:-}" \\\n OTEL_LOG_USER_PROMPTS=1 \\\n OTEL_LOG_TOOL_DETAILS=1 \\\n OTEL_LOG_TOOL_CONTENT=1 \\\n OTEL_LOG_RAW_API_BODIES="${AGENT_INSIGHT_CLAUDE_OTEL_RAW_API_BODIES:-file:$HOME/.agent-insight/claude_raw_bodies}" \\\n claude "$@"\n}\nCLAUDE_OTEL_EOF\n SHELL_RC="$HOME/.zshrc"\n [ -f "$HOME/.bashrc" ] && SHELL_RC="$HOME/.bashrc"\n if [ -f "$SHELL_RC" ] && ! grep -q "\\.agent-insight/claude_otel_env\\.sh" "$SHELL_RC"; then\n echo "" >> "$SHELL_RC"\n echo "# Agent-Insight Claude Code OTel" >> "$SHELL_RC"\n echo "source \\"$HOME/.agent-insight/claude_otel_env.sh\\"" >> "$SHELL_RC"\n fi\n echo "✅ Claude Code OTel env installed at $HOME/.agent-insight/claude_otel_env.sh"\n echo " Restart your terminal or run: source $HOME/.agent-insight/claude_otel_env.sh"\n pkill -f "claude_watcher_client.ts" 2>/dev/null || true\n rm -f "$HOME/.agent-insight/claude_watcher_client.ts" "$HOME/.agent-insight/start_claude_watcher.sh" "$HOME/.agent-insight/stop_claude_watcher.sh" "$HOME/.agent-insight/claude_watcher.pid"\n echo "🧹 Removed legacy Claude session-file watcher if it was installed."\nfi\n\n# 7. Create Watcher Startup/Stop Scripts\nNEEDS_WATCHER_SCRIPTS=false\nif [ "$INSTALL_OPENCODE" = "true" ]; then\n NEEDS_WATCHER_SCRIPTS=true\nfi\n\nif [ "$NEEDS_WATCHER_SCRIPTS" = "true" ]; then\n echo ""\n echo "📝 Creating watcher management scripts..."\n\n if [ "$INSTALL_OPENCODE" = "true" ]; then\n cat > "$HOME/.agent-insight/start_opencode_uploader.sh" << \'OPENCODE_UP_EOF\'\n#!/bin/bash\n# Kill any previous instance (the sentinel string lets pkill -f find the loop).\npkill -f "skill-insight-opencode-uploader-loop" 2>/dev/null\npkill -f "opencode_uploader_client.js" 2>/dev/null\nmkdir -p "$HOME/.agent-insight/logs"\nINTERVAL_SEC="${AGENT_INSIGHT_OPENCODE_UPLOADER_INTERVAL_SEC:-300}"\nLOG_FILE="$HOME/.agent-insight/logs/opencode_uploader.log"\nif command -v node >/dev/null 2>&1; then\n RUNTIME=node\nelif command -v bun >/dev/null 2>&1; then\n RUNTIME=bun\nelse\n echo "[$(date)] Skipped: node/bun not installed" >> "$LOG_FILE"\n exit 0\nfi\n# Loop body has a sentinel comment so `pkill -f skill-insight-opencode-uploader-loop` matches.\nnohup bash -c "\n# skill-insight-opencode-uploader-loop\nwhile true; do\n \\"$RUNTIME\\" \\"$HOME/.agent-insight/opencode_uploader_client.js\\" >> \\"$LOG_FILE\\" 2>&1\n sleep \\"$INTERVAL_SEC\\"\ndone" > /dev/null 2>&1 &\necho $! > "$HOME/.agent-insight/opencode_uploader.pid"\necho "OpenCode uploader daemon started with PID $(cat $HOME/.agent-insight/opencode_uploader.pid) (interval=${INTERVAL_SEC}s)"\nOPENCODE_UP_EOF\n chmod +x "$HOME/.agent-insight/start_opencode_uploader.sh"\n\n cat > "$HOME/.agent-insight/stop_opencode_uploader.sh" << \'STOP_OPENCODE_UP_EOF\'\n#!/bin/bash\npkill -f "skill-insight-opencode-uploader-loop" 2>/dev/null\npkill -f "opencode_uploader_client.js" 2>/dev/null\nPID_FILE="$HOME/.agent-insight/opencode_uploader.pid"\nif [ -f "$PID_FILE" ]; then kill "$(cat $PID_FILE)" 2>/dev/null; rm -f "$PID_FILE"; fi\necho "OpenCode uploader daemon stopped"\nSTOP_OPENCODE_UP_EOF\n chmod +x "$HOME/.agent-insight/stop_opencode_uploader.sh"\n fi\n\n cat > "$HOME/.agent-insight/start_watchers.sh" << \'WATCHER_HEADER\'\n#!/bin/bash\necho "Starting Agent-Insight watchers..."\nWATCHER_HEADER\n if [ "$INSTALL_OPENCODE" = "true" ]; then echo \'"$HOME/.agent-insight/start_opencode_uploader.sh"\' >> "$HOME/.agent-insight/start_watchers.sh"; fi\n echo \'echo "All watchers started!"\' >> "$HOME/.agent-insight/start_watchers.sh"\n chmod +x "$HOME/.agent-insight/start_watchers.sh"\n\n cat > "$HOME/.agent-insight/stop_watchers.sh" << \'STOP_HEADER\'\n#!/bin/bash\necho "Stopping Agent-Insight watchers..."\nSTOP_HEADER\n if [ "$INSTALL_OPENCODE" = "true" ]; then echo \'"$HOME/.agent-insight/stop_opencode_uploader.sh"\' >> "$HOME/.agent-insight/stop_watchers.sh"; fi\n echo \'echo "All watchers stopped!"\' >> "$HOME/.agent-insight/stop_watchers.sh"\n chmod +x "$HOME/.agent-insight/stop_watchers.sh"\nfi\n\n# 8. Start Watchers Now\nif [ "$NEEDS_WATCHER_SCRIPTS" = "true" ]; then\n echo ""\n echo "🚀 Starting telemetry watchers..."\n if command -v npx &> /dev/null; then\n "$HOME/.agent-insight/start_watchers.sh"\n else\n echo "⚠️ Node.js (npx) not found. Skipping watcher startup."\n fi\nfi\n\n# 10. Final Summary\necho ""\necho "🌟 Agent-Insight Telemetry: READY"\necho "------------------------------------------------"\necho "Installed Components:"\nif [ "$INSTALL_OPENCODE" = "true" ]; then echo " ✅ OpenCode Plugin: $OPENCODE_CONFIG_DIR/plugins/Witty-Skill-Insight.ts"; fi\nif [ "$INSTALL_OPENCODE" = "true" ]; then echo " ✅ OpenCode Command: ~/.config/opencode/commands/si-optimizer.md"; fi\nif [ "$INSTALL_OPENCODE" = "true" ]; then echo " ✅ OpenCode Uploader Daemon: ~/.agent-insight/opencode_uploader_client.js (5-min poll)"; fi\nif [ "$INSTALL_CLAUDE" = "true" ]; then echo " ✅ Claude Code OTel: ~/.agent-insight/claude_otel_env.sh"; fi\nif [ "$INSTALL_HERMES" = "true" ]; then echo " ✅ Agent Insight Hermes Plugin: ${HERMES_HOME:-$HOME/.hermes}/plugins/agent_insight_hermes/config.json"; fi\nif [ "$INSTALL_JIUWEN" = "true" ]; then echo " ✅ JiuwenSwarm Extension: ${JIUWENSWARM_DATA_DIR:-$HOME/.jiuwenswarm}/extensions/agent-insight-observability (telemetry in config/.env)"; fi\n\nif [ "$NEEDS_WATCHER_SCRIPTS" = "true" ]; then\n echo ""\n echo "Watcher Management:"\n echo " Start all: ~/.agent-insight/start_watchers.sh"\n echo " Stop all: ~/.agent-insight/stop_watchers.sh"\n echo " Logs: ~/.agent-insight/logs/"\nfi\n\necho ""\necho "Usage:"\nif [ "$INSTALL_OPENCODE" = "true" ]; then echo " 1. Run: opencode run \'hello\'"; fi\nif [ "$INSTALL_CLAUDE" = "true" ]; then echo " 2. Restart terminal, then run: claude"; fi\nif [ "$INSTALL_HERMES" = "true" ]; then echo " 3. Restart Hermes or start a new Hermes conversation"; fi\necho "------------------------------------------------"'].join("\n")}(r,r,E,l,I,T);return new O.NextResponse(e,{headers:{"Content-Type":"text/x-shellscript"}})}}e.s(["GET",()=>g],640112);var A=e.i(640112);let p=new n.AppRouteRouteModule({definition:{kind:t.RouteKind.APP_ROUTE,page:"/api/ingest/setup/route",pathname:"/api/ingest/setup",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/ingest/setup/route.ts",nextConfigOutput:"standalone",userland:A}),{workAsyncStorage:m,workUnitAsyncStorage:H,serverHooks:L}=p;function C(){return(0,i.patchFetch)({workAsyncStorage:m,workUnitAsyncStorage:H})}async function G(e,n,i){p.isDev&&(0,o.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let O="/api/ingest/setup/route";O=O.replace(/\/index$/,"")||"/";let u=await p.prepare(e,n,{srcPage:O,multiZoneDraftMode:!1});if(!u)return n.statusCode=400,n.end("Bad Request"),null==i.waitUntil||i.waitUntil.call(i,Promise.resolve()),null;let{buildId:$,params:g,nextConfig:A,parsedUrl:m,isDraftMode:H,prerenderManifest:L,routerServerContext:C,isOnDemandRevalidate:G,revalidateOnlyGenerated:R,resolvedPathname:f,clientReferenceManifest:P,serverActionsManifest:D}=u,F=(0,r.normalizeAppPath)(O),w=!!(L.dynamicRoutes[F]||L.routes[f]),v=async()=>((null==C?void 0:C.render404)?await C.render404(e,n,m,!1):n.end("This page could not be found"),null);if(w&&!H){let e=!!L.routes[f],n=L.dynamicRoutes[F];if(n&&!1===n.fallback&&!e){if(A.experimental.adapterPath)return await v();throw new h.NoFallbackError}}let y=null;!w||p.isDev||H||(y="/index"===(y=f)?"/":y);let W=!0===p.isDev||!w,U=w&&!W;D&&P&&(0,_.setManifestsSingleton)({page:O,clientReferenceManifest:P,serverActionsManifest:D});let M=e.method||"GET",x=(0,s.getTracer)(),b=x.getActiveScopeSpan(),k={params:g,prerenderManifest:L,renderOpts:{experimental:{authInterrupts:!!A.experimental.authInterrupts},cacheComponents:!!A.cacheComponents,supportsDynamicResponse:W,incrementalCache:(0,o.getRequestMeta)(e,"incrementalCache"),cacheLifeProfiles:A.cacheLife,waitUntil:i.waitUntil,onClose:e=>{n.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(n,t,i,o)=>p.onRequestError(e,n,i,o,C)},sharedContext:{buildId:$}},K=new E.NodeNextRequest(e),j=new E.NodeNextResponse(n),J=a.NextRequestAdapter.fromNodeNextRequest(K,(0,a.signalFromNodeResponse)(n));try{let _=async e=>p.handle(J,k).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":n.statusCode,"next.rsc":!1});let t=x.getRootSpanAttributes();if(!t)return;if(t.get("next.span_type")!==l.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${t.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let i=t.get("next.route");if(i){let n=`${M} ${i}`;e.setAttributes({"next.route":i,"http.route":i,"next.span_name":n}),e.updateName(n)}else e.updateName(`${M} ${O}`)}),r=!!(0,o.getRequestMeta)(e,"minimalMode"),E=async o=>{var s,E;let a=async({previousCacheEntry:t})=>{try{if(!r&&G&&R&&!t)return n.statusCode=404,n.setHeader("x-nextjs-cache","REVALIDATED"),n.end("This page could not be found"),null;let s=await _(o);e.fetchMetrics=k.renderOpts.fetchMetrics;let E=k.renderOpts.pendingWaitUntil;E&&i.waitUntil&&(i.waitUntil(E),E=void 0);let a=k.renderOpts.collectedTags;if(!w)return await (0,N.sendResponse)(K,j,s,k.renderOpts.pendingWaitUntil),null;{let e=await s.blob(),n=(0,T.toNodeOutgoingHttpHeaders)(s.headers);a&&(n[c.NEXT_CACHE_TAGS_HEADER]=a),!n["content-type"]&&e.type&&(n["content-type"]=e.type);let t=void 0!==k.renderOpts.collectedRevalidate&&!(k.renderOpts.collectedRevalidate>=c.INFINITE_CACHE)&&k.renderOpts.collectedRevalidate,i=void 0===k.renderOpts.collectedExpire||k.renderOpts.collectedExpire>=c.INFINITE_CACHE?void 0:k.renderOpts.collectedExpire;return{value:{kind:d.CachedRouteKind.APP_ROUTE,status:s.status,body:Buffer.from(await e.arrayBuffer()),headers:n},cacheControl:{revalidate:t,expire:i}}}}catch(n){throw(null==t?void 0:t.isStale)&&await p.onRequestError(e,n,{routerKind:"App Router",routePath:O,routeType:"route",revalidateReason:(0,I.getRevalidateReason)({isStaticGeneration:U,isOnDemandRevalidate:G})},!1,C),n}},l=await p.handleResponse({req:e,nextConfig:A,cacheKey:y,routeKind:t.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:L,isRoutePPREnabled:!1,isOnDemandRevalidate:G,revalidateOnlyGenerated:R,responseGenerator:a,waitUntil:i.waitUntil,isMinimalMode:r});if(!w)return null;if((null==l||null==(s=l.value)?void 0:s.kind)!==d.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==l||null==(E=l.value)?void 0:E.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});r||n.setHeader("x-nextjs-cache",G?"REVALIDATED":l.isMiss?"MISS":l.isStale?"STALE":"HIT"),H&&n.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let h=(0,T.fromNodeOutgoingHttpHeaders)(l.value.headers);return r&&w||h.delete(c.NEXT_CACHE_TAGS_HEADER),!l.cacheControl||n.getHeader("Cache-Control")||h.get("Cache-Control")||h.set("Cache-Control",(0,S.getCacheControlHeader)(l.cacheControl)),await (0,N.sendResponse)(K,j,new Response(l.value.body,{headers:h,status:l.value.status||200})),null};b?await E(b):await x.withPropagatedContext(e.headers,()=>x.trace(l.BaseServerSpan.handleRequest,{spanName:`${M} ${O}`,kind:s.SpanKind.SERVER,attributes:{"http.method":M,"http.target":e.url}},E))}catch(n){if(n instanceof h.NoFallbackError||await p.onRequestError(e,n,{routerKind:"App Router",routePath:F,routeType:"route",revalidateReason:(0,I.getRevalidateReason)({isStaticGeneration:U,isOnDemandRevalidate:G})},!1,C),w)throw n;return await (0,N.sendResponse)(K,j,new Response(null,{status:500})),null}}e.s(["handler",()=>G,"patchFetch",()=>C,"routeModule",()=>p,"serverHooks",()=>L,"workAsyncStorage",()=>m,"workUnitAsyncStorage",()=>H],901411)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=node_modules_next_dist_esm_build_templates_app-route_c4a195e5.js.map
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module.exports=[844466,e=>{e.v({_readme:"内置模型单价默认值(USD / 百万 token)。作为兜底;自定义单价(custom-models.json / 「模型注册→模型单价」界面)按前缀覆盖此处。键为模型名前缀(最长前缀优先匹配)。",_source:"官方定价页核对于 2026-07:Anthropic(platform.claude.com/docs pricing) / DeepSeek(api-docs.deepseek.com) / OpenAI(developers.openai.com) / Google Gemini(ai.google.dev) / MiniMax(minimaxi.com)。价格会变,请以官方为准、必要时在界面覆盖。","claude-opus-4-8":{inputTokenPrice:5,outputTokenPrice:25,cacheReadInputTokenPrice:.5,cacheCreationInputTokenPrice:6.25,contextWindow:1e6},"claude-opus-4-7":{inputTokenPrice:5,outputTokenPrice:25,cacheReadInputTokenPrice:.5,cacheCreationInputTokenPrice:6.25,contextWindow:1e6},"claude-opus-4-6":{inputTokenPrice:5,outputTokenPrice:25,cacheReadInputTokenPrice:.5,cacheCreationInputTokenPrice:6.25,contextWindow:1e6},"claude-opus-4-5":{inputTokenPrice:5,outputTokenPrice:25,cacheReadInputTokenPrice:.5,cacheCreationInputTokenPrice:6.25,contextWindow:2e5},"claude-sonnet-5":{inputTokenPrice:2,outputTokenPrice:10,cacheReadInputTokenPrice:.2,cacheCreationInputTokenPrice:2.5,contextWindow:1e6},"claude-sonnet-4-5":{inputTokenPrice:3,outputTokenPrice:15,cacheReadInputTokenPrice:.3,cacheCreationInputTokenPrice:3.75,contextWindow:2e5},"claude-haiku-4-5":{inputTokenPrice:1,outputTokenPrice:5,cacheReadInputTokenPrice:.1,cacheCreationInputTokenPrice:1.25,contextWindow:2e5},"claude-fable-5":{inputTokenPrice:10,outputTokenPrice:50,cacheReadInputTokenPrice:1,cacheCreationInputTokenPrice:12.5,contextWindow:2e5},"deepseek-v4-flash":{inputTokenPrice:.14,outputTokenPrice:.28,cacheReadInputTokenPrice:.0028,contextWindow:128e3},"deepseek-v4-pro":{inputTokenPrice:.435,outputTokenPrice:.87,cacheReadInputTokenPrice:.003625,contextWindow:128e3},"deepseek-reasoner":{inputTokenPrice:.14,outputTokenPrice:.28,cacheReadInputTokenPrice:.0028,contextWindow:128e3},"deepseek-chat":{inputTokenPrice:.14,outputTokenPrice:.28,cacheReadInputTokenPrice:.0028,contextWindow:128e3},"gpt-4.1-mini":{inputTokenPrice:.4,outputTokenPrice:1.6,cacheReadInputTokenPrice:.1,contextWindow:1e6},"gpt-4.1":{inputTokenPrice:2,outputTokenPrice:8,cacheReadInputTokenPrice:.5,contextWindow:1e6},"gpt-4o":{inputTokenPrice:2.5,outputTokenPrice:10,cacheReadInputTokenPrice:1.25,contextWindow:128e3},"gemini-2.5-pro":{inputTokenPrice:1.25,outputTokenPrice:10,cacheReadInputTokenPrice:.125,contextWindow:1e6},"gemini-2.5-flash":{inputTokenPrice:.3,outputTokenPrice:2.5,cacheReadInputTokenPrice:.03,contextWindow:1e6},"minimax-m2":{inputTokenPrice:.3,outputTokenPrice:1.2,cacheReadInputTokenPrice:.03,contextWindow:2e5}})},137165,e=>{"use strict";var t=e.i(522734),n=e.i(814747),i=e.i(844466);let r={},a={};for(let[e,t]of Object.entries(i.default))if(!e.startsWith("_")){if("number"==typeof t.inputTokenPrice&&"number"==typeof t.outputTokenPrice){let n={inputTokenPrice:t.inputTokenPrice,outputTokenPrice:t.outputTokenPrice};"number"==typeof t.cacheReadInputTokenPrice&&(n.cacheReadInputTokenPrice=t.cacheReadInputTokenPrice),"number"==typeof t.cacheCreationInputTokenPrice&&(n.cacheCreationInputTokenPrice=t.cacheCreationInputTokenPrice),r[e]=n}"number"==typeof t.contextWindow&&(a[e]=t.contextWindow)}let o=n.default.join(process.cwd(),"custom-models.json"),s={},u={},c=-1;function l(){try{let e=t.default.statSync(o).mtimeMs;if(e===c)return{pricing:s,contextWindows:u};let n=JSON.parse(t.default.readFileSync(o,"utf-8")),i={},r={};for(let[e,t]of Object.entries(n))e.startsWith("_")||("number"==typeof t.inputTokenPrice&&"number"==typeof t.outputTokenPrice&&(i[e]=t),"number"==typeof t.contextWindow&&(r[e]=t.contextWindow));s=i,u=r,c=e}catch(e){e instanceof SyntaxError&&console.warn("[model-config] Failed to parse custom-models.json:",e.message),s={},u={},c=-1}return{pricing:s,contextWindows:u}}function d(e,t){if(t[e])return t[e];for(let[n,i]of Object.entries(t).sort((e,t)=>t[0].length-e[0].length))if(e.startsWith(n))return i;return null}function m(e){let{pricing:t}=l(),n=d(e,t);if(n)return{pricing:n,source:"custom"};let i=d(e,r);return i?{pricing:i,source:"default"}:null}function p(e){let{contextWindows:t}=l(),n=d(e,t);if(null!=n)return{contextWindow:n,source:"custom"};let i=d(e,a);return null!=i?{contextWindow:i,source:"default"}:null}function f(e,t,n,i,r){let a=n.cacheReadInputTokenPrice??.1*n.inputTokenPrice,o=n.cacheCreationInputTokenPrice??1.25*n.inputTokenPrice;return(e*n.inputTokenPrice+(i??0)*a+(r??0)*o+t*n.outputTokenPrice)/1e6}function g(){return l()}function h(e){let n={_readme:"模型单价(USD / 百万 token)。由「模型注册 → 模型单价」界面维护;缺该文件时相应模型成本按 0 计并在仪表盘告警。"};for(let[t,i]of Object.entries(e)){if(!t||t.startsWith("_"))continue;let e={inputTokenPrice:i.inputTokenPrice,outputTokenPrice:i.outputTokenPrice};null!=i.cacheReadInputTokenPrice&&(e.cacheReadInputTokenPrice=i.cacheReadInputTokenPrice),null!=i.cacheCreationInputTokenPrice&&(e.cacheCreationInputTokenPrice=i.cacheCreationInputTokenPrice),null!=i.contextWindow&&(e.contextWindow=i.contextWindow),n[t]=e}t.default.writeFileSync(o,JSON.stringify(n,null,2)+"\n","utf-8"),c=-1}e.s(["BUILTIN_CONTEXT_WINDOWS",0,a,"BUILTIN_MODEL_PRICING",0,r,"DEFAULT_CACHE_CREATION_RATIO",0,1.25,"DEFAULT_CACHE_READ_RATIO",0,.1,"calculateCost",()=>f,"getCustomModels",()=>g,"getModelContextWindow",()=>p,"getModelPricing",()=>m,"writeCustomModels",()=>h])},119586,e=>{"use strict";let t=new Set(["skill-generator-agent","fault-diagnosis-agent","skill-optimizer-chat","trace-quality-evaluator","task-completion-evaluator","skill-trigger-analyzer","skill-suggestion-advisor","grayscale-skill-agent","grayscale-baseline-agent"]);function n(e){return!!e&&t.has(e.trim())}e.s(["SYSTEM_AGENT_NAME_SET",0,t,"isInternalSystemAgentTrace",()=>n])},68987,e=>{"use strict";function t(e){if(null==e)return null;if("number"==typeof e&&Number.isFinite(e))return e;if("string"==typeof e){let t=e.trim();if(!t)return null;if(/^\d+$/.test(t)){let e=Number(t);return Number.isFinite(e)?e:null}let n=Date.parse(t);return Number.isFinite(n)?n:null}return null}function n(e){let n=0,i=0,r="",a="",o="",s=0,u=0,c=0,l=0,d=0,m=0,p=0,f=0,g=0,h=Number.MAX_SAFE_INTEGER,T=0;for(let i of e||[]){if(!i)continue;let e=i.role,k="assistant"===e||"subagent"===e;if("assistant"===e){let e="string"==typeof i.content?i.content:"";e&&e.trim()&&(a=e),"string"==typeof i.model&&i.model?r=i.model:"string"==typeof i.modelID&&i.modelID&&(r=i.modelID)}i.agent&&"string"==typeof i.agent&&!o&&(o=i.agent);let _=t(i.timeInfo?.created),w=t(i.timeInfo?.completed),y=t(i.timestamp);if(_&&(h=Math.min(h,_),T=Math.max(T,_)),w&&(T=Math.max(T,w)),y&&(h=Math.min(h,y),T=Math.max(T,y)),!k)continue;m++;let I=i.usage;if(I){let e=function(e){let t=Number(e?.input_tokens??e?.input??0)||0,n=Number(e?.output_tokens??e?.output??0)||0,i=Number(e?.cache?.read??e?.cache_read_input_tokens??0)||0,r=Number(e?.cache?.write??e?.cache_creation_input_tokens??0)||0,a=Number(e?.reasoning??e?.reasoning_tokens??e?.completion_tokens_details?.reasoning_tokens??0)||0,o=e?.reasoning!==void 0&&a>0&&n<a?n+a:n;return{total:e?.total!==void 0?Number(e.total)||0:t+o+i+r,input:t,output:o,cacheRead:i,cacheWrite:r,reasoning:a,maxSingleCallTokens:t+o+i+r}}(I);n+=e.total,s+=e.input,u+=e.output,c+=e.cacheRead,l+=e.cacheWrite,d+=e.reasoning,e.maxSingleCallTokens>g&&(g=e.maxSingleCallTokens)}if(Array.isArray(i.tool_calls))for(let e of(p+=i.tool_calls.length,i.tool_calls))(e?.state==="error"||e?.state==="failed")&&f++}return h!==Number.MAX_SAFE_INTEGER&&T>h&&(i=T-h),{model:r||void 0,agentName:o||void 0,final_result:a||void 0,tokens:Math.round(n),latency:i/1e3,input_tokens:Math.round(s),output_tokens:Math.round(u),tool_call_count:p,tool_call_error_count:f,llm_call_count:m,cache_read_input_tokens:Math.round(c),cache_creation_input_tokens:Math.round(l),max_single_call_tokens:Math.round(g),reasoning_tokens:Math.round(d)}}e.s(["deriveOpencodeExecutionFields",()=>n])},596767,e=>{"use strict";var t=e.i(286372);function n(e,i="zh"){let r=function(e){if(!Array.isArray(e))return[];let t=[];for(let n of e)if(n){if(Array.isArray(n.requestMessages)||n.responseMessage){for(let e of n.requestMessages||[])e&&t.push(e);n.responseMessage&&t.push(n.responseMessage);continue}t.push(n)}return t}(e),a=[],u=e=>{a.push({...e,stepIndex:a.length+1})},d=r.find(e=>e?.role==="user"&&String(e.content||"").trim());d&&u({id:"input:root",name:"zh"===i?"用户输入":"User input",meta:d.usage?.input?`req ${d.usage.input} tok`:l(String(d.content||""),110),kind:"user",status:"ok",depth:0,interactionIndex:r.indexOf(d),startedAt:s(d.timeInfo?.created)??s(d.timestamp),completedAt:s(d.timeInfo?.completed),rawText:String(d.content||""),rawInput:String(d.content||"")});let m=(0,t.buildAgentCallTree)(r);return m&&(0,t.walkTree)(m,e=>{let t=e.events.find(e=>"user"===e.kind),n=[...e.events].reverse().find(e=>"llm"===e.kind),a=t&&(t.summary||t.interaction?.content)||void 0,s=n&&(n.interaction?.content||n.summary)||void 0;u({id:`agent:${e.id}`,name:0===e.depth?"zh"===i?"控制器路由":"Controller routing":"zh"===i?"子任务执行":"Subtask execution",meta:o(e,i),kind:"agent",status:"ok",depth:e.depth,startedAt:e.startedAt,completedAt:e.endedAt,rawText:[e.agentName,e.subagentType,o(e,i)].filter(Boolean).join(" "),rawInput:a,rawOutput:s}),e.events.forEach((t,n)=>{let a,o,s=function(e,t){var n,i,r;let a="zh"===t;if("user"===e.kind)return{name:a?"用户输入":"User input",meta:e.usage?.input?`req ${e.usage.input} tok`:l(e.summary||"",96)};if("llm"===e.kind){let t;return{name:a?"模型调用":"Model call",meta:[(t=[(n=e).name,n.interaction?.providerID,n.interaction?.modelID,n.summary].filter(Boolean).join(" ").toLowerCase()).includes("openai")||t.includes("gpt")||t.includes("chat.completions")?"OpenAI":t.includes("deepseek")?"DeepSeek":t.includes("anthropic")||t.includes("claude")?"Anthropic":"LLM Provider",e.usage?.input?`req ${e.usage.input} tok`:"",e.usage?.output?`out ${e.usage.output} tok`:""].filter(Boolean).join(" · ")||l(e.summary||"assistant response",96)}}if("skill"===e.kind){let t=e.args?.name||e.args?.skill||e.name||"skill";return{name:a?"执行 Skill":"Run skill",meta:`skill ${t}`}}if("task"===e.kind){let t=e.args?.subagent_type||e.args?.subagentType||"subagent";return{name:a?"调度子任务":"Dispatch subtask",meta:`spawn ${t}`}}return{name:a?"工具调用":"Tool call",meta:(i=e.name||"tool",r=e.args,"bash"===i?`bash ${l(r?.command||"",72)}`:"read"===i?`read ${r?.path||r?.file_path||""}`.trim():"write"===i?`write ${r?.path||r?.file_path||""}`.trim():"glob"===i?`glob ${r?.pattern||""}`.trim():"grep"===i?`grep ${r?.pattern||""}`.trim():`${i}${r?` ${l(c(r,90),90)}`:""}`)}}(t,i),d=t.completedAt||t.startedAt?"ok":"skipped";if("user"===t.kind)a=t.summary||t.interaction?.content||"";else if("llm"===t.kind){let n=t.interactionIndex??-1,s=new Set(e.interactionIndices.filter(e=>e<n)),u=[];for(let t of e.systemPrompts||[])t.text?.trim()&&u.push(`[System]
|
|
2
|
+
${l(t.text,1500)}`);for(let e of Array.from(s).sort((e,t)=>e-t)){let t=r[e];if(!t||"system"===t.role)continue;let n="string"==typeof t.content?t.content:c(t.content,2e3);n.trim()&&("user"===t.role||"opencode"===t.role?u.push(`[User]
|
|
3
|
+
${l(n,2e3)}`):("assistant"===t.role||"subagent"===t.role)&&u.push(`[Assistant]
|
|
4
|
+
${l(n,2e3)}`))}a=u.length>0?u.join("\n\n---\n\n"):void 0;let d=function(e,t){if(!Array.isArray(e)||0===e.length)return"";let n=e.map(e=>e?.function?.name||e?.name||"tool").slice(0,3),i=e.length>n.length?", ...":"";return"zh"===t?`${e.length} 个工具调用: ${n.join(", ")}${i}`:`${e.length} tool call${e.length>1?"s":""}: ${n.join(", ")}${i}`}(t.interaction?.tool_calls,i);o=[t.interaction?.content,d].filter(Boolean).join("\n")||t.summary||""}else("tool"===t.kind||"skill"===t.kind||"task"===t.kind)&&(void 0!==t.args&&(a=c(t.args,2e3)),("tool"===t.kind||"skill"===t.kind)&&void 0!==t.output&&null!==t.output&&(o=c(t.output,2e3)));u({id:`event:${e.id}:${n}`,name:s.name,meta:s.meta,kind:t.kind,status:d,depth:e.depth+1,interactionIndex:t.interactionIndex,eventIndex:n,toolCallId:t._toolCallId,startedAt:t.startedAt,completedAt:t.completedAt,rawText:[s.name,s.meta,t.name,t.summary,c(t.args,500),c(t.output,500)].filter(Boolean).join(" "),rawInput:a||void 0,rawOutput:o||void 0})})}),0===a.length&&u({id:"system:missing-trace",name:"zh"===i?"链路详情缺失":"Trace unavailable",meta:"zh"===i?"未找到可还原的 interactions。":"No interactions were available.",kind:"system",status:"skipped",depth:0,rawText:""}),a}function i(e,t,n="zh"){return Array.isArray(e)&&0!==e.length?e.map(e=>{if(e.trace_anchor?.step_id&&t.some(t=>t.id===e.trace_anchor?.step_id))return e;let i=function(e,t,n="zh"){if(!t.length)return null;let i=String(e.anchor_step_id||e.trace_anchor?.step_id||"").trim();if(i){let e=t.find(e=>e.id===i);if(e)return a(e,"step_id",.98,"zh"===n?"LLM 返回了候选步骤 ID,且后端校验存在":"The model returned a valid step id")}let r=/推理判断|时间窗口匹配/i.test(e.step||"")?null:String(e.step||"").match(/第\s*(\d+)\s*步/i);if(r){let e=Number(r[1]),i=t.find(t=>t.stepIndex===e);if(i)return a(i,"step_index",.9,"zh"===n?"来自故障记录的步骤编号":"Matched by failure step index")}let o=function(e,t,n){let i=c(e,2e3),r=i.match(/(?:tool_call_id|toolCallId|call_)[\"':\s-]*([A-Za-z0-9_.:-]{6,})/)?.[1];if(r){let e=t.find(e=>e.toolCallId===r);if(e)return a(e,"tool_call_id",.99,"zh"===n?"根据 tool_call_id 精确匹配":"Matched exactly by tool_call_id")}let o=i.match(/(?:interaction_index|interactionIndex)[\"':\s-]*(\d+)/)?.[1];if(o){let e=Number(o),i=t.find(t=>t.interactionIndex===e);if(i)return a(i,"interaction_index",.94,"zh"===n?"根据 interaction_index 精确匹配":"Matched by interaction_index")}return null}(e,t,n);if(o)return o;let s=u([e.failure_type,e.description,e.context,e.recovery,e.step].filter(Boolean).join(" ")),l=t.map(e=>{let t=0,n=u(e.rawText||`${e.name} ${e.meta}`);for(let e of Array.from(new Set(s.split(/[^a-z0-9_\-.]+/i).map(e=>e.trim().toLowerCase()).filter(e=>e.length>=3))).slice(0,12))n.includes(e)&&(t+=e.length>4?2:1);return/401|authentication|unauthori[sz]ed|api[_\s-]?key|认证|鉴权|权限/.test(s)&&"llm"===e.kind&&(t+=8),/tool|工具|bash|command|exit code|stderr|非零/.test(s)&&"tool"===e.kind&&(t+=7),/skill|技能|SKILL\.md/i.test(s)&&"skill"===e.kind&&(t+=7),/timeout|超时|卡住/.test(s)&&(t+=3),{step:e,score:t}}).sort((e,t)=>t.score-e.score);if(l[0]?.score>0){let e=l[0].score>=7?"type_rule":"text_match",t=l[0].score>=7?.78:.58;return a(l[0].step,e,t,l[0].score>=7?"zh"===n?"根据错误内容和节点类型匹配":"Matched by error content and step type":"zh"===n?"根据错误上下文文本匹配":"Matched by error context text")}let d=[...t].reverse().find(e=>"llm"===e.kind||"tool"===e.kind||"skill"===e.kind)||[...t].reverse().find(e=>"skipped"!==e.status);return d?a(d,"fallback",.35,"zh"===n?"未找到精确锚点,回退到最后一个已执行关键节点":"Fell back to the latest meaningful executed step"):null}(e,t,n);return i?{...e,trace_anchor:i}:e}):e}function r(e){return[`- step_id: ${e.id}`,` step_index: ${e.stepIndex}`,` name: ${e.name}`,` kind: ${e.kind}`,` meta: ${e.meta||"-"}`,null!=e.interactionIndex?` interaction_index: ${e.interactionIndex}`:"",e.toolCallId?` tool_call_id: ${e.toolCallId}`:"",null!=e.startedAt?` started_at: ${e.startedAt}`:"",null!=e.completedAt?` completed_at: ${e.completedAt}`:"",e.rawText?` evidence_text: ${l(e.rawText,220)}`:""].filter(Boolean).join("\n")}function a(e,t,n,i){return{step_id:e.id,step_index:e.stepIndex,display_name:e.name,kind:e.kind,interaction_index:e.interactionIndex,event_index:e.eventIndex,tool_call_id:e.toolCallId,started_at:e.startedAt,completed_at:e.completedAt,match_method:t,confidence:n,evidence:i}}function o(e,t){let n=[];e.agentName&&n.push(e.agentName),e.subagentType&&n.push(`type ${e.subagentType}`);let i=[e.stats.llmCalls?`${e.stats.llmCalls} LLM`:"",e.stats.toolCalls?`${e.stats.toolCalls} tool`:"",e.stats.skillCalls?`${e.stats.skillCalls} skill`:"",e.stats.taskCalls?`${e.stats.taskCalls} task`:""].filter(Boolean).join(" · ");return i&&n.push(i),n.join(" · ")||("zh"===t?"执行 Agent":"Agent")}function s(e){if(null!=e){if("number"==typeof e&&Number.isFinite(e))return e>0&&e<1e10?1e3*e:e;if("string"==typeof e){let t=e.trim();if(!t)return;if(/^\d+(\.\d+)?$/.test(t)){let e=Number(t);if(!Number.isFinite(e))return;return e>0&&e<1e10?1e3*e:e}let n=Date.parse(t);return Number.isFinite(n)?n:void 0}}}function u(e){return e.toLowerCase().replace(/\s+/g," ").trim()}function c(e,t=300){if(null==e)return"";if("string"==typeof e)return l(e,t);try{return l(JSON.stringify(e),t)}catch{return l(String(e),t)}}function l(e,t){let n=String(e||"");return n.length>t?`${n.slice(0,t)}...`:n}e.s(["attachFailureAnchors",()=>i,"buildFaultPathSteps",()=>n,"formatFaultPathStepForPrompt",()=>r])},837926,e=>{"use strict";let t=["evaluator","checker","judge","locator","assessor","grader","评估器"],n=["你是「轨迹评估器」的总协调者","你是「Agent 任务完成度」评估器","trace-quality-evaluator","task-completion-evaluator","reference_trajectory","actual_trace","key_point_findings","key-points-checker","detect_redundancy_and_loops","已写入 final_result.json"],i=new Set(["trace-quality-evaluator","task-completion-evaluator"]);function r(e){let n=String(e||"").trim().toLowerCase();return!!n&&(!!i.has(n)||t.some(e=>n.includes(e)))}function a(e){return!!e&&(!![e.agentName,e.agent,...Array.isArray(e.agents)?e.agents:[]].some(e=>r(e))||!!e&&[e.query,e.final_result,e.label].some(e=>{let t=String(e||"");return!!t&&n.some(e=>t.includes(e))}))}function o(e){return e?String([e.agentName,e.agent,...Array.isArray(e.agents)?e.agents:[]].find(e=>{let t=String(e||"").trim();return t&&!r(t)})||"").trim():""}e.s(["getPrimaryExecutionAgentName",()=>o,"isEvaluatorAgentName",()=>r,"isEvaluatorTraceRecord",()=>a])},243080,e=>{"use strict";var t=e.i(837926);function n(e){return"string"==typeof e?e.trim():""}function i(e,t){let i=[],r=new Set,a=n(t),o=(e,t)=>{let a=n(e);if(!a)return;let o=`${t}:${a}`;r.has(o)||(r.add(o),i.push({name:a,agentType:t}))};for(let t of(a&&o(a,"main"),e||[])){if(!t||"object"!=typeof t)continue;let e=n(t.role).toLowerCase(),i=n(t.subagent_name),r=n(t.agent);if(i){o(i,"subagent");continue}("subagent"===e||"opencode"===e)&&r&&r!==a?o(r,"subagent"):!a&&r&&o(r,"main")}return i}function r(e){return i(e).map(e=>e.name)}function a(e,n){let r=i(e,n),a=r.find(e=>"main"===e.agentType&&!(0,t.isEvaluatorAgentName)(e.name));return a?a.name:r.find(e=>!(0,t.isEvaluatorAgentName)(e.name))?.name||""}e.s(["extractObservedAgentNames",()=>r,"extractObservedAgentRegistrations",()=>i,"getPrimaryObservedAgentName",()=>a])},384660,e=>{"use strict";function t(e){return"routing"===e||"outcome"===e||"combined"===e?e:"combined"}function n(e,n){let i=t(e);return"combined"===i||i===n}function i(e,n){let i=t(e);return"any"===n?"combined"===i?1:2:i===n?3:2*("combined"===i)}function r(e){return Array.isArray(e)?e.map(e=>{if("string"==typeof e){let t=e.trim();return t?{skill:t,version:null}:null}if(!e||"object"!=typeof e)return null;let t="skill"in e?e.skill:null,n="string"==typeof t?t.trim():"";if(!n)return null;let i="version"in e?e.version:null,r=null;if("number"==typeof i&&Number.isInteger(i)&&i>=0)r=i;else if("string"==typeof i&&i.trim()){let e=parseInt(i,10);r=Number.isNaN(e)||e<0?null:e}return{skill:n,version:r}}).filter(e=>!!e):[]}e.s(["configSupportsDatasetType",()=>n,"getDatasetTypePriority",()=>i,"normalizeConfigDatasetType",()=>t,"normalizeExpectedSkills",()=>r])},262197,e=>{"use strict";function t(e){return"string"!=typeof e?null:e.trim()||null}function n(e){return"string"!=typeof e?"":e.trim()}function i(e){if("number"==typeof e&&Number.isInteger(e)&&e>=0)return e;if("string"==typeof e&&e.trim()){let t=parseInt(e,10);if(!Number.isNaN(t)&&t>=0)return t}return null}function r(e,i="Skill benchmark"){var a,o;let s;return t(e.query)||(a=e.skill,o=e.skillVersion,(s=n(a))?null!=o?`${s} (v${o})`:s:null)||i}e.s(["getConfigSubjectLabel",()=>r,"normalizeConfigQuery",()=>t,"normalizeConfigSkillName",()=>n,"normalizeOptionalSkillVersion",()=>i])},274149,e=>e.a(async(t,n)=>{try{e.i(889228);var i=e.i(88045),r=e.i(637351),a=e.i(106411),o=t([a]);[a]=o.then?(await o)():o;let d=new Map;function s(e){return e.trim().toLowerCase().replace(/[`"'“”‘’]/g,"").replace(/[.,,。!?!?;;::、·…()[\]{}<>]/g," ").replace(/\s+/g," ").trim()}function u(e){return s(e).replace(/\s/g,"")}async function c(e,t){let n=e.trim();if(!n)return null;let o=`${t||"__global__"}::${n}`;if(d.has(o))return d.get(o);let u=(async()=>{let e=await (0,a.getActiveConfig)(t);if(!e)throw Error("No active model configuration for routing signature extraction");let{customFetch:o}=(0,r.getProxyConfig)(),u=new i.OpenAI({apiKey:e.apiKey||"no-api-key-required",baseURL:e.baseUrl||"https://api.deepseek.com",fetch:o}),c=`
|
|
5
|
+
You are extracting a routing signature for skill benchmark matching.
|
|
6
|
+
|
|
7
|
+
Given one user query, produce a compact semantic signature that captures the query's routing intent rather than the full scenario wording.
|
|
8
|
+
|
|
9
|
+
User Query:
|
|
10
|
+
"""
|
|
11
|
+
${n}
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
Return ONLY JSON in this format:
|
|
15
|
+
{
|
|
16
|
+
"intent": "one concise canonical intent sentence in the same language as the query",
|
|
17
|
+
"anchors": [
|
|
18
|
+
"short technical phrase 1",
|
|
19
|
+
"short technical phrase 2"
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
Rules:
|
|
24
|
+
- The intent must summarize the core task the agent is being asked to do.
|
|
25
|
+
- Anchors must be short reusable semantic phrases, not full sentences.
|
|
26
|
+
- Keep 4-8 anchors.
|
|
27
|
+
- Preserve domain terms, repo terms, tool names, protocol names, object names, and constraints that affect routing.
|
|
28
|
+
- Remove storytelling details, hostnames, dates, and incidental wording unless they are essential to routing.
|
|
29
|
+
- The output language must match the query language.
|
|
30
|
+
`.trim(),l=await u.chat.completions.create({messages:[{role:"user",content:c}],model:e.model||"deepseek-chat",temperature:.1}),d=l.choices[0]?.message?.content;if(!d)throw Error("No content returned for routing signature extraction");let m=function(e){let t=e.trim(),n=t.match(/```(?:json)?\s*([\s\S]*?)\s*```/i);if(n)t=n[1];else{let e=t.indexOf("{"),n=t.lastIndexOf("}");-1!==e&&-1!==n&&n>=e&&(t=t.slice(e,n+1))}let i=JSON.parse(t),r="string"==typeof i.intent?i.intent.trim():"",a=Array.isArray(i.anchors)?i.anchors.filter(e=>"string"==typeof e).map(e=>e.trim()):[];return{intent:r,anchors:(function(e){let t=new Set,n=[];for(let i of e){let e=s(i);!e||t.has(e)||(t.add(e),n.push(i.trim()))}return n})(a).slice(0,8)}}(d);if(!m.intent||0===m.anchors.length)throw Error("Routing signature extraction returned empty intent or anchors");return m})().finally(()=>{d.delete(o)});return d.set(o,u),u}function l(e,t){let n=u(e),i=u(t.intent),r=t.anchors.filter(e=>{let t=u(e);return!!t&&n.includes(t)});return{intentMatched:!!(n&&i&&(n===i||n.includes(i)||i.includes(n))),matchedAnchors:r,anchorCoverage:t.anchors.length>0?r.length/t.anchors.length:0}}e.s(["deriveRoutingSignature",()=>c,"matchQueryToStoredRoutingSignature",()=>l]),n()}catch(e){n(e)}},!1),190753,e=>{"use strict";e.s(["VLLM_COUNTERS",0,["vllm:prompt_tokens_total","vllm:generation_tokens_total","vllm:num_preemptions_total","vllm:prefix_cache_queries_total","vllm:prefix_cache_hits_total","vllm:estimated_flops_per_gpu_total","vllm:estimated_read_bytes_per_gpu_total","vllm:estimated_write_bytes_per_gpu_total"],"VLLM_GAUGES",0,["vllm:num_requests_running","vllm:num_requests_waiting","vllm:kv_cache_usage_perc"],"VLLM_HISTOGRAMS",0,["vllm:time_to_first_token_seconds","vllm:inter_token_latency_seconds","vllm:request_time_per_output_token_seconds","vllm:e2e_request_latency_seconds","vllm:request_queue_time_seconds","vllm:request_prefill_time_seconds","vllm:request_inference_time_seconds"],"VLLM_WAITING_BY_REASON",0,"vllm:num_requests_waiting_by_reason"])},667531,e=>{"use strict";var t=e.i(190753);let n=new Set(t.VLLM_GAUGES),i=new Set(t.VLLM_COUNTERS);function r(e){let t=new Map,n=[];for(let i of e.split("\n")){let e=i.trim();if(!e)continue;if(e.startsWith("#")){let n=e.match(/^#\s+(HELP|TYPE)\s+(\S+)\s+(.*)$/);if(!n)continue;let[,i,r,a]=n,o=t.get(r)??{type:"untyped",help:""};"TYPE"===i?o.type=a.trim():o.help=a.trim(),t.set(r,o);continue}let r=e.match(/^([^{\s]+)(\{[^}]*\})?\s+(.+)$/);if(!r)continue;let[,a,o,s]=r,u=Number.parseFloat(s.trim().split(/\s+/)[0]),c={};if(o)for(let e of o.slice(1,-1).split(/,(?=(?:[^"]*"[^"]*")*[^"]*$)/)){let t=e.match(/^\s*([^=]+)="(.*)"\s*$/);t&&(c[t[1]]=t[2])}n.push({name:a,labels:c,value:u})}return{families:t,samples:n}}function a(e,r={}){let{source:o="vllm-pull",target:s="",tsMs:u=Date.now()}=r,c=new Map,l=e=>{let t=c.get(e);return t||(t={gauges:{},counters:{},histograms:{},waitingByReason:{}},c.set(e,t)),t};for(let r of e.samples){let e=r.labels.model_name;if(!e)continue;let a=l(e),o=e=>a.histograms[e]??={buckets:[],sum:0,count:0};if(n.has(r.name))a.gauges[r.name]=r.value;else if(i.has(r.name))a.counters[r.name]=r.value;else if(r.name===t.VLLM_WAITING_BY_REASON)a.waitingByReason[r.labels.reason]=r.value;else for(let e of t.VLLM_HISTOGRAMS)if(r.name===`${e}_bucket`){var d;o(e).buckets.push({le:(d=r.labels.le,/^[+]?inf(inity)?$/i.test(d.trim())?1/0:Number.parseFloat(d)),count:r.value})}else r.name===`${e}_sum`?o(e).sum=r.value:r.name===`${e}_count`&&(o(e).count=r.value)}return[...c.entries()].map(([e,t])=>{for(let e of Object.values(t.histograms))e.buckets.sort((e,t)=>e.le-t.le);return{tsMs:u,source:o,target:s,model:e,...t}})}function o(e,t){if(!e||!e.count)return null;let n=t*e.count,i=0,r=0;for(let t of e.buckets){if(t.count>=n){if(t.le===1/0)return i;let e=(n-r)/(t.count-r||1);return i+(t.le-i)*e}i=t.le,r=t.count}return i}function s(e){return e&&e.count?e.sum/e.count:null}e.s(["histAvg",()=>s,"histQuantile",()=>o,"normalizeByModel",()=>a,"parsePromText",()=>r])},68683,e=>{"use strict";var t=e.i(667531);function n(e){let t=new URL(e);return`${t.protocol}//${t.host}`}function i(e){let t=new URL(e);return t.username="",t.password="",t.search="",t.hash="",t.pathname.endsWith("/metrics")||(t.pathname=t.pathname.replace(/\/+$/,"")+"/metrics"),t.toString()}async function r(e,a={}){let{timeoutMs:o=8e3,tsMs:s=Date.now(),fetchImpl:u=fetch}=a,c=i(e),l=await u(c,{signal:AbortSignal.timeout(o)});if(!l.ok)throw Error(`scrape ${c} failed: HTTP ${l.status}`);let d=await l.text();return(0,t.normalizeByModel)((0,t.parsePromText)(d),{source:"vllm-pull",target:n(e),tsMs:s})}e.s(["metricsUrl",()=>i,"normalizeEndpoint",()=>n,"scrapeVllmTargetModels",()=>r])},75539,e=>e.a(async(t,n)=>{try{var i=e.i(854763),r=t([i]);[i]=r.then?(await r)():r;class P extends Error{status;constructor(e,t){super(t),this.status=e}}let b=new Set(["version","business"]),S="#6366f1",R=null;function a(){return!process.env.DB_HOST}function o(){if(!a())throw new P(501,"trace tags are not available for this database adapter")}function s(e){let t=String(e||"").trim();if(!t)throw new P(400,"user is required");return t}function u(e){let t=String(e||"").trim();if(!t)throw new P(400,"tag name is required");if(t.length>80)throw new P(400,"tag name is too long");return t}function c(e){let t=String(e||"").trim();if(!b.has(t))throw new P(400,"tag kind must be version or business");return t}function l(e){let t=String(e||"").trim();return t?t.slice(0,300):null}function d(e){let t=String(e||"").trim();return/^#[0-9a-fA-F]{6}$/.test(t)?t.toLowerCase():S}function m(e){return Array.isArray(e)?Array.from(new Set(e.map(e=>String(e||"").trim()).filter(Boolean))):[]}function p(e){return{id:e.id,name:e.name,description:e.description??null,kind:"business"===e.kind?"business":"version",color:e.color||S,createdBy:e.createdBy??null,createdAt:e.createdAt instanceof Date?e.createdAt.toISOString():String(e.createdAt||""),usageCount:e._count?.executionTags??e.usageCount??0}}async function f(){a()&&(R||(R=(async()=>{await i.prismaRaw.$executeRawUnsafe("PRAGMA foreign_keys = ON"),await i.prismaRaw.$executeRawUnsafe(`CREATE TABLE IF NOT EXISTS "Tag" (
|
|
31
|
+
"id" TEXT NOT NULL PRIMARY KEY,
|
|
32
|
+
"name" TEXT NOT NULL,
|
|
33
|
+
"description" TEXT,
|
|
34
|
+
"kind" TEXT NOT NULL,
|
|
35
|
+
"color" TEXT NOT NULL,
|
|
36
|
+
"createdBy" TEXT,
|
|
37
|
+
"user" TEXT,
|
|
38
|
+
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
39
|
+
"updatedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
40
|
+
)`),await i.prismaRaw.$executeRawUnsafe(`CREATE TABLE IF NOT EXISTS "ExecutionTag" (
|
|
41
|
+
"id" TEXT NOT NULL PRIMARY KEY,
|
|
42
|
+
"executionId" TEXT NOT NULL,
|
|
43
|
+
"tagId" TEXT NOT NULL,
|
|
44
|
+
"user" TEXT,
|
|
45
|
+
"createdBy" TEXT,
|
|
46
|
+
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
47
|
+
CONSTRAINT "ExecutionTag_executionId_fkey" FOREIGN KEY ("executionId") REFERENCES "Execution" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
|
|
48
|
+
CONSTRAINT "ExecutionTag_tagId_fkey" FOREIGN KEY ("tagId") REFERENCES "Tag" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
|
49
|
+
)`),await i.prismaRaw.$executeRawUnsafe('CREATE UNIQUE INDEX IF NOT EXISTS "Tag_user_kind_name_key" ON "Tag"("user", "kind", "name")'),await i.prismaRaw.$executeRawUnsafe('CREATE INDEX IF NOT EXISTS "Tag_user_kind_createdAt_idx" ON "Tag"("user", "kind", "createdAt")'),await i.prismaRaw.$executeRawUnsafe('CREATE UNIQUE INDEX IF NOT EXISTS "ExecutionTag_executionId_tagId_key" ON "ExecutionTag"("executionId", "tagId")'),await i.prismaRaw.$executeRawUnsafe('CREATE INDEX IF NOT EXISTS "ExecutionTag_tagId_createdAt_idx" ON "ExecutionTag"("tagId", "createdAt")'),await i.prismaRaw.$executeRawUnsafe('CREATE INDEX IF NOT EXISTS "ExecutionTag_executionId_idx" ON "ExecutionTag"("executionId")'),await i.prismaRaw.$executeRawUnsafe('CREATE INDEX IF NOT EXISTS "ExecutionTag_user_tagId_idx" ON "ExecutionTag"("user", "tagId")')})().catch(e=>{throw R=null,e})),await R)}async function g(e,t){o(),await f();let n=s(e),r=t?c(t):void 0;return(await i.prismaRaw.tag.findMany({where:{user:n,...r?{kind:r}:{}},orderBy:[{kind:"asc"},{name:"asc"}],include:{_count:{select:{executionTags:!0}}}})).map(p)}async function h(e,t){o(),await f();let n=s(e);try{let e=await i.prismaRaw.tag.create({data:{name:u(t.name),description:l(t.description),kind:c(t.kind),color:d(t.color),user:n,createdBy:n},include:{_count:{select:{executionTags:!0}}}});return p(e)}catch(e){if(e?.code==="P2002")throw new P(409,"tag name already exists");throw e}}async function T(e,t,n){o(),await f();let r=s(e);if(!await i.prismaRaw.tag.findFirst({where:{id:t,user:r}}))throw new P(404,"tag not found");let a={};"name"in n&&(a.name=u(n.name)),"description"in n&&(a.description=l(n.description)),"kind"in n&&(a.kind=c(n.kind)),"color"in n&&(a.color=d(n.color));try{let e=await i.prismaRaw.tag.update({where:{id:t},data:a,include:{_count:{select:{executionTags:!0}}}});return p(e)}catch(e){if(e?.code==="P2002")throw new P(409,"tag name already exists");throw e}}async function k(e,t){o(),await f();let n=s(e);if(!await i.prismaRaw.tag.findFirst({where:{id:t,user:n},select:{id:!0}}))throw new P(404,"tag not found");await i.prismaRaw.tag.delete({where:{id:t}})}async function _(e,t){let n=s(t),r=String(e||"").trim();if(!r)throw new P(400,"execution id is required");let a=await i.prismaRaw.execution.findFirst({where:{user:n,OR:[{id:r},{taskId:r}]},select:{id:!0,user:!0}});if(!a)throw new P(404,"execution not found");return a}async function w(e,t){if(0===t.length)return[];let n=await i.prismaRaw.tag.findMany({where:{user:e,id:{in:t},kind:{in:["version","business"]}},select:{id:!0}});if(n.length!==t.length)throw new P(400,"one or more tags are invalid");return n}async function y(e,t){o(),await f();let n=s(t),r=await _(e,n);return(await i.prismaRaw.executionTag.findMany({where:{executionId:r.id,user:n},include:{tag:!0},orderBy:{createdAt:"asc"}})).map(e=>p({...e.tag,usageCount:0}))}async function I(e,t,n){o(),await f();let r=s(t),a=await _(e,r),u=m(n);return await w(r,u),await i.prismaRaw.$transaction(async e=>{await e.executionTag.deleteMany({where:{executionId:a.id,user:r}}),u.length>0&&await e.executionTag.createMany({data:u.map(e=>({executionId:a.id,tagId:e,user:r,createdBy:r}))})}),y(a.id,r)}async function x(e,t,n){o(),await f();let r=s(t),a=await _(e,r),u=m(n);if(await w(r,u),u.length>0){let e=await i.prismaRaw.executionTag.findMany({where:{executionId:a.id,tagId:{in:u}},select:{tagId:!0}}),t=new Set(e.map(e=>e.tagId)),n=u.filter(e=>!t.has(e)).map(e=>({executionId:a.id,tagId:e,user:r,createdBy:r}));n.length>0&&await i.prismaRaw.executionTag.createMany({data:n})}return y(a.id,r)}async function E(e,t,n){o(),await f();let r=s(t),a=await _(e,r),u=String(n||"").trim();if(!u)throw new P(400,"tagId is required");return await i.prismaRaw.executionTag.deleteMany({where:{executionId:a.id,tagId:u,user:r}}),y(a.id,r)}async function A(e,t){if(!a()||0===e.length||!t)return new Map;await f();let n=s(t),r=await i.prismaRaw.executionTag.findMany({where:{executionId:{in:e},user:n},include:{tag:!0},orderBy:{createdAt:"asc"}}),o=new Map;for(let e of r){let t=o.get(e.executionId)??[];t.push(p({...e.tag,usageCount:0})),o.set(e.executionId,t)}return o}async function N(e,t){if(!a())return null;await f();let n=s(e),r=m(t);if(0===r.length)return null;let o=await i.prismaRaw.executionTag.findMany({where:{user:n,tagId:{in:r},tag:{user:n,kind:"business"}},select:{executionId:!0}});return Array.from(new Set(o.map(e=>e.executionId)))}e.s(["TraceTagError",()=>P,"addExecutionTraceTags",()=>x,"createTraceTag",()=>h,"deleteTraceTag",()=>k,"ensureTraceTagTables",()=>f,"findExecutionIdsByBusinessTags",()=>N,"getExecutionTraceTags",()=>y,"getTraceTagsByExecutionIds",()=>A,"listTraceTags",()=>g,"removeExecutionTraceTag",()=>E,"replaceExecutionTraceTags",()=>I,"updateTraceTag",()=>T]),n()}catch(e){n(e)}},!1)];
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=src_lib_266d6cf4._.js.map
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[997215,e=>{"use strict";function t(e){if(null==e)return"";if("string"==typeof e)return e;if("number"==typeof e||"boolean"==typeof e)return String(e);if(Array.isArray(e))return e.map(function e(t){if(null==t)return"";if("string"==typeof t)return t;if("number"==typeof t||"boolean"==typeof t)return String(t);if(Array.isArray(t))return t.map(e).filter(Boolean).join("");if("object"==typeof t){if("string"==typeof t.text)return t.text;if("string"==typeof t.content)return t.content;if(Array.isArray(t.content))return e(t.content)}return""}).filter(Boolean).join("");if("object"==typeof e){if("string"==typeof e.text)return e.text;if("string"==typeof e.content)return e.content;if(Array.isArray(e.content))return t(e.content)}return""}function n(e){if(!e||!Object.prototype.hasOwnProperty.call(e,"content")||"string"==typeof e.content)return e;let n={...e};return void 0===n.content_blocks&&null!=n.content&&(n.content_blocks=n.content),n.content=t(n.content),n}function o(e){if(!e||"object"!=typeof e)return e;let t=n({...e});return t.message&&"object"==typeof t.message&&(t.message=n({...t.message})),t.responseMessage&&"object"==typeof t.responseMessage&&(t.responseMessage=n({...t.responseMessage})),Array.isArray(t.requestMessages)&&(t.requestMessages=t.requestMessages.map(e=>e&&"object"==typeof e?n({...e}):e)),t}function i(e){return Array.isArray(e)?e.map(o):[]}e.s(["normalizeClaudeCodeInteractionsForStorage",()=>i,"stringifyClaudeContent",()=>t])},286372,e=>{"use strict";var t=e.i(997215);function n(e){if(!e||0===e.length)return null;let n=0,c=()=>`n${++n}`,l=e.find(e=>e.agent)?.agent||"Agent",p=i({id:c(),agentName:l,subagentType:null,sessionId:"TOP",parentId:null,depth:0}),d=[],f=new Map;f.set("TOP",p);let m=new Map;for(let n=0;n<e.length;n++){var k,g,T,h;let P,y=e[n];if("system"===y.role){let e={text:(0,t.stringifyClaudeContent)(y.content),sha256:y.system_prompt_sha256,length:y.system_prompt_length,modelID:y.system_prompt_modelID,providerID:y.system_prompt_providerID};if(!e.text)continue;let n=y.subagent_session_id;if(n)if(f.has(n)){let t=f.get(n);t.systemPrompts||(t.systemPrompts=[]),t.systemPrompts.some(t=>e.sha256&&t.sha256===e.sha256||!e.sha256&&t.text===e.text)||t.systemPrompts.push(e)}else m.has(n)||m.set(n,[]),m.get(n).push(e);else p.systemPrompts||(p.systemPrompts=[]),p.systemPrompts.some(t=>e.sha256&&t.sha256===e.sha256||!e.sha256&&t.text===e.text)||p.systemPrompts.push(e);continue}let I="subagent"===y.role&&!!y.subagent_session_id,b=I?y.subagent_session_id:"TOP",x=y.agent||(I?y.subagent_name||"Subagent":l);if(I){let e=function(e){let t=(e.subagent_name||e.agent||"").trim();if(!t)return null;let n=t.match(/^([A-Za-z][\w-]*)/);return n?n[1].toLowerCase():t.toLowerCase()}(y),t=function(e,t){let n=d.findIndex(n=>n.expectedSessionId===e&&(!t||n.subagentType===t));if(n>=0)return d.splice(n,1)[0];if(!t)return;let o=d.findIndex(e=>!e.expectedSessionId&&e.subagentType===t);return o>=0?d.splice(o,1)[0]:void 0}(b,e);if(t){let n=t.parentNode;for(let o of(P=i({id:c(),agentName:x,subagentType:t.subagentType||e,sessionId:b,parentId:n.id,depth:n.depth+1}),t.parallelCount>1&&(P.parallelCallCount=t.parallelCount),n.children.push(P),f.set(b,P),t.spawnEvents))o.spawnedChildId=P.id;null==t.startedAt||P.startedAt||(P.startedAt=t.startedAt),function(e,t){let n=m.get(t);if(n&&n.length){for(let t of(e.systemPrompts||(e.systemPrompts=[]),n))e.systemPrompts.some(e=>t.sha256&&e.sha256===t.sha256||!t.sha256&&e.text===t.text)||e.systemPrompts.push(t);m.delete(t)}}(P,b)}else P=f.get(b)}else P=f.get(b)||p;if(P||(P=p),function(e){if("user"!==e.role&&"opencode"!==e.role&&"subagent"!==e.role||(0,t.stringifyClaudeContent)(e.content).trim())return!1;let n=e.parts;return!!Array.isArray(n)&&0!==n.length&&n.every(e=>"compaction"===(e?.type||"").toLowerCase())}(y))continue;let C=s(y),_=u(y)??C;null!=C&&(!P.startedAt||C<P.startedAt)&&(P.startedAt=C),null!=_&&(!P.endedAt||_>P.endedAt)&&(P.endedAt=_);let A=y.usage;if(A&&(P.stats.inputTokens+=A.input||0,P.stats.outputTokens+=A.output||0,P.stats.cacheReadTokens+=A.cache?.read||0,P.stats.cacheWriteTokens+=A.cache?.write||0,P.stats.reasoningTokens+=A.reasoning||0,P.stats.totalTokens+=A.total||0),"compaction"===(k=y).mode&&!0===k.summary){let e={interactionIndex:n,summaryText:a(y.parts,"text"),reasoningText:a(y.parts,"reasoning")||void 0,modelID:y.modelID,providerID:y.providerID,startedAt:C,completedAt:_,usage:y.usage};P.compactions||(P.compactions=[]),P.compactions.push(e);continue}for(let e of(P.interactionIndices.push(n),P.stats.interactions++,"Agent"===P.agentName&&x&&(P.agentName=x),function(e,n){let o=[],i=s(e),c=u(e),l=(0,t.stringifyClaudeContent)(e.content),p=function(e){let t=[],n=new Map;for(let o of e){let e=function(e){let t=e.id;if("string"==typeof t&&t.trim())return`id:${t.trim()}`;let n=e.function?.name||e.name||"unknown",o=e.function?.arguments??e.arguments??"";return`sig:${n}:${function(e){if(null==e)return"";if("string"==typeof e)return e;try{return JSON.stringify(e)}catch{return String(e)}}(o)}`}(o),i=n.get(e);null==i?(n.set(e,t.length),t.push(o)):t[i]=function(e,t){let n={...e,...t};return void 0!==e.output&&void 0===t.output&&(n.output=e.output),void 0!==e.result&&void 0===t.result&&(n.result=e.result),e.timing&&!t.timing&&(n.timing=e.timing),n}(t[i],o)}return t}(e.tool_calls||[]);"user"===e.role&&l.trim()&&o.push({kind:"user",interaction:e,interactionIndex:n,startedAt:i,completedAt:c,summary:l});let d="assistant"===e.role||"subagent"===e.role||"opencode"===e.role,f=l.trim()?l:a(e.parts,"reasoning");if(0===p.length)return d&&f.trim()&&o.push({kind:"llm",interaction:e,interactionIndex:n,startedAt:i,completedAt:c,summary:f,usage:e.usage}),o;for(let t of(d&&o.push({kind:"llm",interaction:e,interactionIndex:n,startedAt:i,completedAt:c,summary:f,usage:e.usage}),p)){let s,u=t.function?.name||t.name||"unknown",a=t.function?.arguments??t.arguments;if("string"==typeof a)try{s=JSON.parse(a)}catch{s=a}else s=a;let c=u.toLowerCase(),l={kind:"task"===c?"task":"skill"===c||"load_skill"===c||"skill_view"===c||"skill_tool"===c?"skill":"tool",name:u,args:s,output:t.output??t.result,toolCallId:t.id,toolStatus:t.state,interaction:e,interactionIndex:n,startedAt:r(t.timing?.started_at)??i,completedAt:r(t.timing?.completed_at),summary:function(e,t){if(!t||"object"!=typeof t)return e;if("task"===e){let e=t.description||t.subagent_type||"",n=t.subagent_type?`[${t.subagent_type}]`:"";return`task ${n} ${e}`.trim()}return"skill"===e?`skill: ${t.name||""}`:"bash"===e?`bash: ${(t.command||"").slice(0,80)}`:"read"===e?`read: ${t.path||t.file_path||""}`:"write"===e?`write: ${t.path||t.file_path||""}`:"glob"===e?`glob: ${t.pattern||""}`:e}(u,s)};l._toolCallId=t.id,l.splitParallelTask=!!t.trace_split_parallel_task,o.push(l)}return o}(y,n)))if(P.events.push(e),"llm"===e.kind)P.stats.llmCalls++;else if("skill"===e.kind)P.stats.skillCalls++;else if("task"===e.kind){P.stats.taskCalls++;let t=e.args?.subagent_type||e.args?.subagentType;t&&(g=P,T=n,d.push({parentNode:g,subagentType:t,expectedSessionId:o((h=e).args)??o(h.output),startedAt:e.startedAt,spawnEvents:[e],parallelCount:1,parentInteractionIndex:T}))}else"tool"===e.kind&&P.stats.toolCalls++}return function e(t){if(Number.isFinite(t.startedAt)&&Number.isFinite(t.endedAt)){let e=t.endedAt-t.startedAt;t.stats.durationMs=e>=0?e:void 0}for(let n of t.children)e(n)}(p),p}function o(e,t=0){if(null!=e&&!(t>3)){if("string"==typeof e){let n=e.trim();if(!n)return;if(n.startsWith("{")||n.startsWith("["))try{let e=JSON.parse(n),i=o(e,t+1);if(i)return i}catch{}let i=n.match(/\b(?:session_id|sessionId|subagent_session_id|subagentSessionId)\s*[:=]\s*([A-Za-z0-9_.:-]+)/);return i?.[1]}if(Array.isArray(e)){for(let n of e){let e=o(n,t+1);if(e)return e}return}if("object"==typeof e){let n=e.session_id??e.sessionId??e.subagent_session_id??e.subagentSessionId;if("string"==typeof n&&n.trim())return n.trim();for(let n of Object.values(e)){let e=o(n,t+1);if(e)return e}}}}function i(e){return{...e,events:[],children:[],startedAt:void 0,endedAt:void 0,stats:{interactions:0,llmCalls:0,toolCalls:0,skillCalls:0,taskCalls:0,inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,reasoningTokens:0,totalTokens:0,durationMs:void 0},interactionIndices:[]}}function r(e){if(null!=e){if("number"==typeof e&&Number.isFinite(e))return e>0&&e<1e10?1e3*e:e;if("string"==typeof e){let t=e.trim();if(!t)return;if(/^\d+(\.\d+)?$/.test(t)){let e=Number(t);if(!Number.isFinite(e))return;return e>0&&e<1e10?1e3*e:e}let n=Date.parse(t);return Number.isFinite(n)?n:void 0}}}function s(e){return r(e.timeInfo?.created)??r(e.timestamp)}function u(e){return r(e.timeInfo?.completed)}function a(e,t){if(!Array.isArray(e)||0===e.length)return"";let n=[];for(let o of e){if((o?.type||"").toLowerCase()!==t)continue;let e="string"==typeof o?.text?o.text:"";e&&n.push(e)}return n.join("")}e.s(["buildAgentCallTree",()=>n,"walkTree",()=>function e(t,n){for(let o of(n(t),t.children))e(o,n)}])},844466,e=>{e.v({_readme:"内置模型单价默认值(USD / 百万 token)。作为兜底;自定义单价(custom-models.json / 「模型注册→模型单价」界面)按前缀覆盖此处。键为模型名前缀(最长前缀优先匹配)。",_source:"官方定价页核对于 2026-07:Anthropic(platform.claude.com/docs pricing) / DeepSeek(api-docs.deepseek.com) / OpenAI(developers.openai.com) / Google Gemini(ai.google.dev) / MiniMax(minimaxi.com)。价格会变,请以官方为准、必要时在界面覆盖。","claude-opus-4-8":{inputTokenPrice:5,outputTokenPrice:25,cacheReadInputTokenPrice:.5,cacheCreationInputTokenPrice:6.25,contextWindow:1e6},"claude-opus-4-7":{inputTokenPrice:5,outputTokenPrice:25,cacheReadInputTokenPrice:.5,cacheCreationInputTokenPrice:6.25,contextWindow:1e6},"claude-opus-4-6":{inputTokenPrice:5,outputTokenPrice:25,cacheReadInputTokenPrice:.5,cacheCreationInputTokenPrice:6.25,contextWindow:1e6},"claude-opus-4-5":{inputTokenPrice:5,outputTokenPrice:25,cacheReadInputTokenPrice:.5,cacheCreationInputTokenPrice:6.25,contextWindow:2e5},"claude-sonnet-5":{inputTokenPrice:2,outputTokenPrice:10,cacheReadInputTokenPrice:.2,cacheCreationInputTokenPrice:2.5,contextWindow:1e6},"claude-sonnet-4-5":{inputTokenPrice:3,outputTokenPrice:15,cacheReadInputTokenPrice:.3,cacheCreationInputTokenPrice:3.75,contextWindow:2e5},"claude-haiku-4-5":{inputTokenPrice:1,outputTokenPrice:5,cacheReadInputTokenPrice:.1,cacheCreationInputTokenPrice:1.25,contextWindow:2e5},"claude-fable-5":{inputTokenPrice:10,outputTokenPrice:50,cacheReadInputTokenPrice:1,cacheCreationInputTokenPrice:12.5,contextWindow:2e5},"deepseek-v4-flash":{inputTokenPrice:.14,outputTokenPrice:.28,cacheReadInputTokenPrice:.0028,contextWindow:128e3},"deepseek-v4-pro":{inputTokenPrice:.435,outputTokenPrice:.87,cacheReadInputTokenPrice:.003625,contextWindow:128e3},"deepseek-reasoner":{inputTokenPrice:.14,outputTokenPrice:.28,cacheReadInputTokenPrice:.0028,contextWindow:128e3},"deepseek-chat":{inputTokenPrice:.14,outputTokenPrice:.28,cacheReadInputTokenPrice:.0028,contextWindow:128e3},"gpt-4.1-mini":{inputTokenPrice:.4,outputTokenPrice:1.6,cacheReadInputTokenPrice:.1,contextWindow:1e6},"gpt-4.1":{inputTokenPrice:2,outputTokenPrice:8,cacheReadInputTokenPrice:.5,contextWindow:1e6},"gpt-4o":{inputTokenPrice:2.5,outputTokenPrice:10,cacheReadInputTokenPrice:1.25,contextWindow:128e3},"gemini-2.5-pro":{inputTokenPrice:1.25,outputTokenPrice:10,cacheReadInputTokenPrice:.125,contextWindow:1e6},"gemini-2.5-flash":{inputTokenPrice:.3,outputTokenPrice:2.5,cacheReadInputTokenPrice:.03,contextWindow:1e6},"minimax-m2":{inputTokenPrice:.3,outputTokenPrice:1.2,cacheReadInputTokenPrice:.03,contextWindow:2e5}})},137165,e=>{"use strict";var t=e.i(522734),n=e.i(814747),o=e.i(844466);let i={},r={};for(let[e,t]of Object.entries(o.default))if(!e.startsWith("_")){if("number"==typeof t.inputTokenPrice&&"number"==typeof t.outputTokenPrice){let n={inputTokenPrice:t.inputTokenPrice,outputTokenPrice:t.outputTokenPrice};"number"==typeof t.cacheReadInputTokenPrice&&(n.cacheReadInputTokenPrice=t.cacheReadInputTokenPrice),"number"==typeof t.cacheCreationInputTokenPrice&&(n.cacheCreationInputTokenPrice=t.cacheCreationInputTokenPrice),i[e]=n}"number"==typeof t.contextWindow&&(r[e]=t.contextWindow)}let s=n.default.join(process.cwd(),"custom-models.json"),u={},a={},c=-1;function l(){try{let e=t.default.statSync(s).mtimeMs;if(e===c)return{pricing:u,contextWindows:a};let n=JSON.parse(t.default.readFileSync(s,"utf-8")),o={},i={};for(let[e,t]of Object.entries(n))e.startsWith("_")||("number"==typeof t.inputTokenPrice&&"number"==typeof t.outputTokenPrice&&(o[e]=t),"number"==typeof t.contextWindow&&(i[e]=t.contextWindow));u=o,a=i,c=e}catch(e){e instanceof SyntaxError&&console.warn("[model-config] Failed to parse custom-models.json:",e.message),u={},a={},c=-1}return{pricing:u,contextWindows:a}}function p(e,t){if(t[e])return t[e];for(let[n,o]of Object.entries(t).sort((e,t)=>t[0].length-e[0].length))if(e.startsWith(n))return o;return null}function d(e){let{pricing:t}=l(),n=p(e,t);if(n)return{pricing:n,source:"custom"};let o=p(e,i);return o?{pricing:o,source:"default"}:null}function f(e){let{contextWindows:t}=l(),n=p(e,t);if(null!=n)return{contextWindow:n,source:"custom"};let o=p(e,r);return null!=o?{contextWindow:o,source:"default"}:null}function m(e,t,n,o,i){let r=n.cacheReadInputTokenPrice??.1*n.inputTokenPrice,s=n.cacheCreationInputTokenPrice??1.25*n.inputTokenPrice;return(e*n.inputTokenPrice+(o??0)*r+(i??0)*s+t*n.outputTokenPrice)/1e6}function k(){return l()}function g(e){let n={_readme:"模型单价(USD / 百万 token)。由「模型注册 → 模型单价」界面维护;缺该文件时相应模型成本按 0 计并在仪表盘告警。"};for(let[t,o]of Object.entries(e)){if(!t||t.startsWith("_"))continue;let e={inputTokenPrice:o.inputTokenPrice,outputTokenPrice:o.outputTokenPrice};null!=o.cacheReadInputTokenPrice&&(e.cacheReadInputTokenPrice=o.cacheReadInputTokenPrice),null!=o.cacheCreationInputTokenPrice&&(e.cacheCreationInputTokenPrice=o.cacheCreationInputTokenPrice),null!=o.contextWindow&&(e.contextWindow=o.contextWindow),n[t]=e}t.default.writeFileSync(s,JSON.stringify(n,null,2)+"\n","utf-8"),c=-1}e.s(["BUILTIN_CONTEXT_WINDOWS",0,r,"BUILTIN_MODEL_PRICING",0,i,"DEFAULT_CACHE_CREATION_RATIO",0,1.25,"DEFAULT_CACHE_READ_RATIO",0,.1,"calculateCost",()=>m,"getCustomModels",()=>k,"getModelContextWindow",()=>f,"getModelPricing",()=>d,"writeCustomModels",()=>g])}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=src_lib_5d95b500._.js.map
|