@witty-ai/skill-insight 0.5.0-beta → 0.6.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +5 -0
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +4 -0
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/routes-manifest.json +24 -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.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- 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 +1 -1
- 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 +1 -1
- package/.next/standalone/.next/server/app/api/config/route.js +3 -3
- package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/data/route.js +3 -3
- package/.next/standalone/.next/server/app/api/data/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/otel/v1/logs/route.js +3 -3
- package/.next/standalone/.next/server/app/api/otel/v1/logs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/otel/v1/traces/route.js +1 -1
- package/.next/standalone/.next/server/app/api/otel/v1/traces/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proxy/[taskId]/end/route.js +4 -4
- package/.next/standalone/.next/server/app/api/proxy/[taskId]/end/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/rejudge/route.js +3 -3
- package/.next/standalone/.next/server/app/api/rejudge/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/session/route.js +1 -1
- package/.next/standalone/.next/server/app/api/session/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/setup/opencode-commands/si-optimizer/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/setup/opencode-commands/si-optimizer/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/setup/opencode-commands/si-optimizer/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/setup/opencode-commands/si-optimizer/route.js +6 -0
- package/.next/standalone/.next/server/app/api/setup/opencode-commands/si-optimizer/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/setup/opencode-commands/si-optimizer/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/setup/opencode-commands/si-optimizer/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/setup/opencode-tui/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/setup/opencode-tui/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/setup/opencode-tui/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/setup/opencode-tui/route.js +6 -0
- package/.next/standalone/.next/server/app/api/setup/opencode-tui/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/setup/opencode-tui/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/setup/opencode-tui/route_client-reference-manifest.js +2 -0
- 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]/route.js +3 -2
- 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/automation/import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/logs/route.js +2 -2
- package/.next/standalone/.next/server/app/api/skills/logs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/skills/route.js +3 -2
- 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/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/skills/sync-enterprise/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/skills/sync-enterprise/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/skills/sync-enterprise/route.js +8 -0
- package/.next/standalone/.next/server/app/api/skills/sync-enterprise/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/skills/sync-enterprise/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/skills/sync-enterprise/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/task-stats/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/task-stats/route/build-manifest.json +11 -0
- package/.next/standalone/.next/server/app/api/task-stats/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/task-stats/route.js +11 -0
- package/.next/standalone/.next/server/app/api/task-stats/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/task-stats/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/task-stats/route_client-reference-manifest.js +2 -0
- package/.next/standalone/.next/server/app/api/upload/route.js +1 -1
- package/.next/standalone/.next/server/app/api/upload/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/details/page/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/server/app/details/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/details.html +1 -1
- package/.next/standalone/.next/server/app/details.rsc +2 -2
- package/.next/standalone/.next/server/app/details.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/details.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/details.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/details.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/details.segments/details/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/details.segments/details.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.html +1 -1
- package/.next/standalone/.next/server/app/login.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/skills.html +1 -1
- package/.next/standalone/.next/server/app/skills.rsc +1 -1
- package/.next/standalone/.next/server/app/skills.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skills.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skills.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skills.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skills.segments/skills/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/skills.segments/skills.segment.rsc +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +4 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__15dbd1f2._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__1ce5e3b8._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__53775b48._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__6923eecf._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__6d8053e2._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__8402dfd1._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__863cf6de._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__89404730._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__aa5c8858._.js +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__c20da96a._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__ddf63a21._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__f9e66e02._.js +3 -0
- package/.next/standalone/.next/server/chunks/_3e8b4d8c._.js +1 -1
- package/.next/standalone/.next/server/chunks/_41a98bd8._.js +1 -1
- package/.next/standalone/.next/server/chunks/_4c806e26._.js +3 -0
- package/.next/standalone/.next/server/chunks/_cd3d20ca._.js +1 -1
- package/.next/standalone/.next/server/chunks/_ddffef3e._.js +1 -1
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_setup_opencode-tui_route_actions_fc8ae29f.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_skills_sync-enterprise_route_actions_0ca45899.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_task-stats_route_actions_983505cd.js +3 -0
- package/.next/standalone/.next/server/chunks/ce889_server_app_api_setup_opencode-commands_si-optimizer_route_actions_fcde30ef.js +3 -0
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_c33286ed.js +47 -4
- package/.next/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_f42faeee.js +1 -1
- package/.next/standalone/.next/server/chunks/src_98433cb8._.js +175 -0
- package/.next/standalone/.next/server/chunks/src_lib_12408140._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_c8c8c083._.js +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_fd46f439._.js +2 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_dagre-d3-es_src_dagre_index_3582f3d0.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_lodash-es_a1341fea._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_lodash-es_e1de6ed8._.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/{01eddf501c574a44.js → 4ee8dc41c9f15b7b.js} +1 -1
- package/.next/standalone/.next/static/chunks/{737b8cff3c6a4e30.js → 9445b2873a413c58.js} +1 -1
- package/.next/standalone/.next/static/chunks/94dfb15df65ef720.js +2 -0
- package/.next/standalone/.next/static/chunks/9d1c5c3494fa53de.js +109 -0
- package/.next/standalone/.next/static/chunks/{e09d9ee16fe90255.js → cd0fde15dc0dfcca.js} +1 -1
- package/.next/standalone/.next/static/chunks/{ff6357067630b168.js → e13d208072a48316.js} +1 -1
- package/.next/standalone/node_modules/.prisma/client/edge.js +6 -3
- package/.next/standalone/node_modules/.prisma/client/index-browser.js +3 -0
- package/.next/standalone/node_modules/.prisma/client/index.js +6 -3
- package/.next/standalone/node_modules/.prisma/client/package.json +1 -1
- package/.next/standalone/node_modules/.prisma/client/schema.prisma +12 -9
- package/.next/standalone/node_modules/.prisma/client/wasm.js +3 -0
- package/.next/standalone/node_modules/adm-zip/util/constants.js +142 -0
- package/.next/standalone/node_modules/adm-zip/util/decoder.js +5 -0
- package/.next/standalone/node_modules/adm-zip/util/errors.js +63 -0
- package/.next/standalone/node_modules/adm-zip/util/fattr.js +76 -0
- package/.next/standalone/node_modules/adm-zip/util/index.js +5 -0
- package/.next/standalone/node_modules/adm-zip/util/utils.js +339 -0
- package/.next/standalone/package.json +6 -2
- package/.next/standalone/prisma/schema.prisma +3 -0
- package/.next/standalone/scripts/opencode_plugin.ts +23 -5
- package/.next/standalone/scripts/opencode_tui_plugin.tsx +308 -0
- package/.next/standalone/scripts/si-optimizer.md +5 -0
- package/.next/static/chunks/{01eddf501c574a44.js → 4ee8dc41c9f15b7b.js} +1 -1
- package/.next/static/chunks/{737b8cff3c6a4e30.js → 9445b2873a413c58.js} +1 -1
- package/.next/static/chunks/94dfb15df65ef720.js +2 -0
- package/.next/static/chunks/9d1c5c3494fa53de.js +109 -0
- package/.next/static/chunks/{e09d9ee16fe90255.js → cd0fde15dc0dfcca.js} +1 -1
- package/.next/static/chunks/{ff6357067630b168.js → e13d208072a48316.js} +1 -1
- package/package.json +6 -2
- package/prisma/schema.prisma +3 -0
- package/scripts/activate_telemetry.sh +44 -1
- package/scripts/opencode_plugin.ts +23 -5
- package/scripts/opencode_tui_plugin.tsx +308 -0
- package/scripts/si-optimizer.md +5 -0
- package/scripts/utils.js +0 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__e2f0baee._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__fc05579d._.js +0 -3
- package/.next/standalone/.next/server/chunks/src_497d2ad2._.js +0 -175
- package/.next/standalone/.next/static/chunks/4071dbec4cf7e72e.js +0 -109
- package/.next/standalone/.next/static/chunks/a87b5e84254095a5.js +0 -1
- package/.next/standalone/LICENSE +0 -21
- package/.next/standalone/bin/cli.js +0 -106
- package/.next/standalone/custom-models.example.json +0 -21
- package/.next/standalone/eslint.config.mjs +0 -18
- package/.next/standalone/features/feature-skill-used-jump-link/design/2026-03-18-skill-used-jump-link-design.md +0 -126
- package/.next/standalone/features/feature-skill-used-jump-link/feature.json +0 -32
- package/.next/standalone/features/feature-skill-used-jump-link/issue.md +0 -32
- package/.next/standalone/features/feature-skill-used-jump-link/plans/2026-03-18-skill-used-jump-link.md +0 -528
- package/.next/standalone/next.config.ts +0 -41
- package/.next/standalone/scripts/activate_telemetry.sh +0 -159
- package/.next/standalone/scripts/create_migration_package.sh +0 -124
- package/.next/standalone/scripts/fix_models.js +0 -66
- package/.next/standalone/scripts/init_opengauss.py +0 -284
- package/.next/standalone/scripts/install.js +0 -273
- package/.next/standalone/scripts/logs.js +0 -38
- package/.next/standalone/scripts/otel_data/logs.jsonl +0 -12
- package/.next/standalone/scripts/otel_data/metrics.jsonl +0 -21
- package/.next/standalone/scripts/otel_data/raw_requests.jsonl +0 -8
- package/.next/standalone/scripts/otel_data/raw_requests.jsonl.bak +0 -6
- package/.next/standalone/scripts/otel_receiver.py +0 -580
- package/.next/standalone/scripts/postinstall.js +0 -192
- package/.next/standalone/scripts/publish-npm.js +0 -401
- package/.next/standalone/scripts/restart.js +0 -26
- package/.next/standalone/scripts/restart.sh +0 -138
- package/.next/standalone/scripts/restart_dev.sh +0 -132
- package/.next/standalone/scripts/start.js +0 -291
- package/.next/standalone/scripts/status.js +0 -41
- package/.next/standalone/scripts/stop.js +0 -90
- package/.next/standalone/scripts/sync_skills.js +0 -216
- package/.next/standalone/scripts/utils.js +0 -235
- package/.next/standalone/tests/setup_skill_optimizer.sh +0 -118
- package/.next/standalone/tsconfig.json +0 -34
- package/.next/static/chunks/4071dbec4cf7e72e.js +0 -109
- package/.next/static/chunks/a87b5e84254095a5.js +0 -1
- /package/.next/standalone/.next/static/{H581Rok68JtPV4bAVVH3l → 0uvhCJooDO_gMNlKOaHwB}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{H581Rok68JtPV4bAVVH3l → 0uvhCJooDO_gMNlKOaHwB}/_clientMiddlewareManifest.json +0 -0
- /package/.next/standalone/.next/static/{H581Rok68JtPV4bAVVH3l → 0uvhCJooDO_gMNlKOaHwB}/_ssgManifest.js +0 -0
- /package/.next/static/{H581Rok68JtPV4bAVVH3l → 0uvhCJooDO_gMNlKOaHwB}/_buildManifest.js +0 -0
- /package/.next/static/{H581Rok68JtPV4bAVVH3l → 0uvhCJooDO_gMNlKOaHwB}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{H581Rok68JtPV4bAVVH3l → 0uvhCJooDO_gMNlKOaHwB}/_ssgManifest.js +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@witty-ai/skill-insight",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0-beta",
|
|
4
4
|
"description": "Agent Skill 评估与观测平台 — 量化评估 Skills 在 Agent 上的实际运行效果",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"private": false,
|
|
@@ -21,12 +21,14 @@
|
|
|
21
21
|
"dev": "next dev",
|
|
22
22
|
"build": "next build",
|
|
23
23
|
"start": "next start",
|
|
24
|
-
"lint": "eslint"
|
|
24
|
+
"lint": "eslint",
|
|
25
|
+
"test": "node --import tsx --test \"test/**/*.test.ts\""
|
|
25
26
|
},
|
|
26
27
|
"dependencies": {
|
|
27
28
|
"@prisma/client": "5.22.0",
|
|
28
29
|
"@types/archiver": "^7.0.0",
|
|
29
30
|
"@types/uuid": "^11.0.0",
|
|
31
|
+
"adm-zip": "^0.5.10",
|
|
30
32
|
"archiver": "7.0.1",
|
|
31
33
|
"chokidar": "^5.0.0",
|
|
32
34
|
"dotenv": "^17.3.1",
|
|
@@ -49,12 +51,14 @@
|
|
|
49
51
|
"xlsx": "^0.18.5"
|
|
50
52
|
},
|
|
51
53
|
"devDependencies": {
|
|
54
|
+
"@types/adm-zip": "^0.5.8",
|
|
52
55
|
"@types/node": "^20",
|
|
53
56
|
"@types/pg": "^8.18.0",
|
|
54
57
|
"@types/react": "^19",
|
|
55
58
|
"@types/react-dom": "^19",
|
|
56
59
|
"eslint": "^9",
|
|
57
60
|
"eslint-config-next": "16.1.4",
|
|
61
|
+
"tsx": "^4.20.5",
|
|
58
62
|
"typescript": "^5"
|
|
59
63
|
}
|
|
60
64
|
}
|
|
@@ -34,6 +34,8 @@ model SkillVersion {
|
|
|
34
34
|
id String @id @default(cuid())
|
|
35
35
|
skillId String
|
|
36
36
|
version Int
|
|
37
|
+
semanticVersion String? // 语义化版本号,用于企业同步
|
|
38
|
+
enterpriseSkillId Int? // 企业skill的id,用于删除同步
|
|
37
39
|
content String
|
|
38
40
|
assetPath String?
|
|
39
41
|
files String?
|
|
@@ -68,6 +70,7 @@ model Execution {
|
|
|
68
70
|
cacheReadInputTokens Int?
|
|
69
71
|
cacheCreationInputTokens Int?
|
|
70
72
|
maxSingleCallTokens Int?
|
|
73
|
+
reasoningTokens Int?
|
|
71
74
|
timestamp DateTime @default(now())
|
|
72
75
|
model String?
|
|
73
76
|
finalResult String?
|
|
@@ -399,9 +399,10 @@ export default async function WittySkillInsightPlugin(input) {
|
|
|
399
399
|
|
|
400
400
|
// logDebug(`Event: ${event.type}`);
|
|
401
401
|
|
|
402
|
-
|
|
402
|
+
try {
|
|
403
403
|
// Attempt to find session ID in various places
|
|
404
|
-
|
|
404
|
+
let sessionId = event.session_id || event.properties?.sessionID || event.payload?.session_id;
|
|
405
|
+
let eagerFlush = false;
|
|
405
406
|
|
|
406
407
|
// 1. Accumulate Message Metadata
|
|
407
408
|
if (event.type === 'message.created' || event.type === 'message.updated') {
|
|
@@ -416,11 +417,16 @@ export default async function WittySkillInsightPlugin(input) {
|
|
|
416
417
|
});
|
|
417
418
|
}
|
|
418
419
|
const entry = sessionStore.get(msgId);
|
|
420
|
+
if (!sessionId) sessionId = info.sessionID || info.sessionId || entry.info?.sessionID;
|
|
419
421
|
if (sessionId) entry.info.sessionID = sessionId;
|
|
420
422
|
// Merge info
|
|
421
423
|
Object.assign(entry.info, info);
|
|
422
424
|
if (info.tool_calls || info.toolCalls) entry.info.tool_calls = info.tool_calls || info.toolCalls;
|
|
423
425
|
if (info.function_call || info.functionCall) entry.info.function_call = info.function_call || info.functionCall;
|
|
426
|
+
|
|
427
|
+
if (entry.info?.role === 'assistant' && (entry.info.finish || entry.info.time?.completed != null)) {
|
|
428
|
+
eagerFlush = true;
|
|
429
|
+
}
|
|
424
430
|
}
|
|
425
431
|
}
|
|
426
432
|
|
|
@@ -441,6 +447,7 @@ export default async function WittySkillInsightPlugin(input) {
|
|
|
441
447
|
});
|
|
442
448
|
}
|
|
443
449
|
const entry = sessionStore.get(msgId);
|
|
450
|
+
if (!sessionId) sessionId = entry.info?.sessionID || part.sessionID || part.session_id;
|
|
444
451
|
if (!(entry.parts instanceof Map)) entry.parts = new Map(Array.isArray(entry.parts) ? entry.parts : []);
|
|
445
452
|
if (entry.toolParts && !(entry.toolParts instanceof Map)) entry.toolParts = new Map(Array.isArray(entry.toolParts) ? entry.toolParts : []);
|
|
446
453
|
|
|
@@ -566,6 +573,7 @@ export default async function WittySkillInsightPlugin(input) {
|
|
|
566
573
|
}
|
|
567
574
|
|
|
568
575
|
const entry = sessionStore.get(msgId);
|
|
576
|
+
if (!sessionId) sessionId = entry.info?.sessionID;
|
|
569
577
|
if (!(entry.parts instanceof Map)) entry.parts = new Map(Array.isArray(entry.parts) ? entry.parts : []);
|
|
570
578
|
|
|
571
579
|
const dedupeKey = `${msgId}:${partId}:${field}`;
|
|
@@ -606,7 +614,7 @@ export default async function WittySkillInsightPlugin(input) {
|
|
|
606
614
|
}
|
|
607
615
|
|
|
608
616
|
// 3. Upload on Session Idle
|
|
609
|
-
if (event.type === "session.idle") {
|
|
617
|
+
if (event.type === "session.idle" || eagerFlush) {
|
|
610
618
|
if (!sessionId || !sessionId.startsWith("ses")) return;
|
|
611
619
|
|
|
612
620
|
// Reload store from disk to pick up any data written by
|
|
@@ -688,6 +696,7 @@ export default async function WittySkillInsightPlugin(input) {
|
|
|
688
696
|
let totalOutputTokens = 0;
|
|
689
697
|
let totalCacheReadInputTokens = 0;
|
|
690
698
|
let totalCacheCreationInputTokens = 0;
|
|
699
|
+
let totalReasoningTokens = 0;
|
|
691
700
|
let llmCallCount = 0;
|
|
692
701
|
let toolCallCount = 0;
|
|
693
702
|
let toolCallErrorCount = 0;
|
|
@@ -717,11 +726,18 @@ export default async function WittySkillInsightPlugin(input) {
|
|
|
717
726
|
const cacheReadToks = Number(u.cache?.read || u.cache_read_input_tokens || 0);
|
|
718
727
|
const cacheCreateToks = Number(u.cache?.write || u.cache_creation_input_tokens || 0);
|
|
719
728
|
const inputToks = Number(u.input_tokens || u.input || 0); // base input only (excludes cache)
|
|
720
|
-
const
|
|
729
|
+
const rawOutputToks = Number(u.output_tokens || u.output || 0);
|
|
730
|
+
const reasoningToks = Number(u.reasoning || u.reasoning_tokens || u.completion_tokens_details?.reasoning_tokens || 0);
|
|
731
|
+
// OpenCode reports reasoning separately from output; DeepSeek API includes it in output.
|
|
732
|
+
// Normalize: output_tokens should always include reasoning tokens.
|
|
733
|
+
const outputToks = (u.reasoning !== undefined && reasoningToks > 0 && rawOutputToks < reasoningToks)
|
|
734
|
+
? rawOutputToks + reasoningToks
|
|
735
|
+
: rawOutputToks;
|
|
721
736
|
totalInputTokens += inputToks;
|
|
722
737
|
totalOutputTokens += outputToks;
|
|
723
738
|
totalCacheReadInputTokens += cacheReadToks;
|
|
724
739
|
totalCacheCreationInputTokens += cacheCreateToks;
|
|
740
|
+
totalReasoningTokens += reasoningToks;
|
|
725
741
|
const callTotal = inputToks + cacheReadToks + cacheCreateToks + outputToks;
|
|
726
742
|
if (callTotal > maxSingleCallTokens) maxSingleCallTokens = callTotal;
|
|
727
743
|
}
|
|
@@ -767,6 +783,7 @@ export default async function WittySkillInsightPlugin(input) {
|
|
|
767
783
|
cache_read_input_tokens: totalCacheReadInputTokens,
|
|
768
784
|
cache_creation_input_tokens: totalCacheCreationInputTokens,
|
|
769
785
|
max_single_call_tokens: maxSingleCallTokens,
|
|
786
|
+
reasoning_tokens: totalReasoningTokens,
|
|
770
787
|
final_result: lastAssistantContent,
|
|
771
788
|
interactions: messages.map(m => ({
|
|
772
789
|
role: m.role,
|
|
@@ -911,8 +928,9 @@ try {
|
|
|
911
928
|
}
|
|
912
929
|
} catch (err) {
|
|
913
930
|
logDebug(`Plugin Exception: ${err.message}`);
|
|
931
|
+
} finally {
|
|
932
|
+
saveStore();
|
|
914
933
|
}
|
|
915
|
-
saveStore();
|
|
916
934
|
}
|
|
917
935
|
};
|
|
918
936
|
}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
/** @jsxImportSource @opentui/solid */
|
|
3
|
+
import { Show, createEffect, createMemo, createSignal } from "solid-js"
|
|
4
|
+
import fs from "fs"
|
|
5
|
+
import os from "os"
|
|
6
|
+
import path from "path"
|
|
7
|
+
import { spawn } from "child_process"
|
|
8
|
+
|
|
9
|
+
function parseBool(input: unknown, defaultValue: boolean) {
|
|
10
|
+
if (input === undefined || input === null) return defaultValue
|
|
11
|
+
const value = String(input).trim().toLowerCase()
|
|
12
|
+
if (!value) return defaultValue
|
|
13
|
+
if (value === "1" || value === "true" || value === "yes" || value === "y" || value === "on") return true
|
|
14
|
+
if (value === "0" || value === "false" || value === "no" || value === "n" || value === "off") return false
|
|
15
|
+
return defaultValue
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function loadSkillInsightConfig() {
|
|
19
|
+
const config: Record<string, string> = {}
|
|
20
|
+
try {
|
|
21
|
+
const envPath = path.join(os.homedir(), ".skill-insight", ".env")
|
|
22
|
+
if (fs.existsSync(envPath)) {
|
|
23
|
+
const content = fs.readFileSync(envPath, "utf8")
|
|
24
|
+
for (const line of content.split("\n")) {
|
|
25
|
+
const match = line.match(/^\s*([\w_]+)\s*=\s*(.*)?\s*$/)
|
|
26
|
+
if (!match) continue
|
|
27
|
+
const key = match[1]
|
|
28
|
+
const raw = (match[2] || "").trim()
|
|
29
|
+
const value = raw.replace(/^['"](.*)['"]$/, "$1")
|
|
30
|
+
config[key] = value
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
} catch {}
|
|
34
|
+
|
|
35
|
+
const apiKey = config["SKILL_INSIGHT_API_KEY"] || process.env.SKILL_INSIGHT_API_KEY
|
|
36
|
+
const host = config["SKILL_INSIGHT_HOST"] || process.env.SKILL_INSIGHT_HOST
|
|
37
|
+
const showTaskStats = parseBool(
|
|
38
|
+
config["SKILL_INSIGHT_SHOW_TASK_STATS"] ?? process.env.SKILL_INSIGHT_SHOW_TASK_STATS,
|
|
39
|
+
true,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
return { apiKey, host, showTaskStats }
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function normalizeHost(host: string) {
|
|
46
|
+
const raw = host.trim()
|
|
47
|
+
if (!raw) return null
|
|
48
|
+
try {
|
|
49
|
+
const urlStr = raw.match(/^https?:\/\//) ? raw : `http://${raw}`
|
|
50
|
+
const u = new URL(urlStr)
|
|
51
|
+
return u
|
|
52
|
+
} catch {
|
|
53
|
+
return null
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function formatLatencySeconds(input: unknown) {
|
|
58
|
+
const n = typeof input === "number" ? input : Number(input)
|
|
59
|
+
if (!Number.isFinite(n) || n < 0) return "-"
|
|
60
|
+
if (n < 10) return `${n.toFixed(2)}s`
|
|
61
|
+
if (n < 60) return `${n.toFixed(1)}s`
|
|
62
|
+
return `${Math.round(n)}s`
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function formatNumber(input: unknown) {
|
|
66
|
+
const n = typeof input === "number" ? input : Number(input)
|
|
67
|
+
if (!Number.isFinite(n)) return "-"
|
|
68
|
+
return new Intl.NumberFormat("en-US").format(n)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async function sleep(ms: number) {
|
|
72
|
+
await new Promise((r) => setTimeout(r, ms))
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function fetchTaskStats(base: URL, taskId: string, apiKey?: string) {
|
|
76
|
+
const url = new URL("/api/task-stats", base)
|
|
77
|
+
url.searchParams.set("taskId", taskId)
|
|
78
|
+
url.searchParams.set("framework", "opencode")
|
|
79
|
+
const headers: Record<string, string> = {}
|
|
80
|
+
if (apiKey) headers["x-witty-api-key"] = apiKey
|
|
81
|
+
|
|
82
|
+
const res = await fetch(url, { headers })
|
|
83
|
+
if (!res.ok) return null
|
|
84
|
+
const json = (await res.json()) as any
|
|
85
|
+
if (!json || json.found !== true) return null
|
|
86
|
+
return json
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function buildDetailsUrl(base: URL, taskId: string) {
|
|
90
|
+
const u = new URL("/details", base)
|
|
91
|
+
u.searchParams.set("framework", "opencode")
|
|
92
|
+
u.searchParams.set("expandTaskId", taskId)
|
|
93
|
+
return u.toString()
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function openUrl(url: string) {
|
|
97
|
+
try {
|
|
98
|
+
if (process.platform === "darwin") {
|
|
99
|
+
spawn("open", [url], { stdio: "ignore", detached: true }).unref()
|
|
100
|
+
return true
|
|
101
|
+
}
|
|
102
|
+
if (process.platform === "win32") {
|
|
103
|
+
spawn("cmd", ["/c", "start", "", url], { stdio: "ignore", detached: true, windowsHide: true }).unref()
|
|
104
|
+
return true
|
|
105
|
+
}
|
|
106
|
+
spawn("xdg-open", [url], { stdio: "ignore", detached: true }).unref()
|
|
107
|
+
return true
|
|
108
|
+
} catch {
|
|
109
|
+
return false
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function formatStatsMessage(stats: any, detailsUrl: string) {
|
|
114
|
+
const latency = formatLatencySeconds(stats?.latency)
|
|
115
|
+
const tokens = formatNumber(stats?.tokens)
|
|
116
|
+
const inputTokens = formatNumber(stats?.input_tokens)
|
|
117
|
+
const outputTokens = formatNumber(stats?.output_tokens)
|
|
118
|
+
const toolCalls = formatNumber(stats?.tool_call_count)
|
|
119
|
+
const llmCalls = formatNumber(stats?.llm_call_count)
|
|
120
|
+
return [
|
|
121
|
+
`时延: ${latency}`,
|
|
122
|
+
`Token: ${tokens} (入: ${inputTokens}, 出: ${outputTokens})`,
|
|
123
|
+
`LLM: ${llmCalls} | 工具: ${toolCalls}`,
|
|
124
|
+
`详情: ${detailsUrl}`,
|
|
125
|
+
].join("\n")
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function StatsFooter(props: {
|
|
129
|
+
api: any
|
|
130
|
+
sessionId: string
|
|
131
|
+
getEntry: (sid: string) => any
|
|
132
|
+
ensure: (sid: string) => void
|
|
133
|
+
config: { host?: string; apiKey?: string }
|
|
134
|
+
}) {
|
|
135
|
+
const theme = () => props.api.theme.current
|
|
136
|
+
|
|
137
|
+
createEffect(() => {
|
|
138
|
+
if (!props.sessionId) return
|
|
139
|
+
props.ensure(props.sessionId)
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
const entry = createMemo(() => {
|
|
143
|
+
if (!props.sessionId) return null
|
|
144
|
+
return props.getEntry(props.sessionId)
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
const title = createMemo(() => {
|
|
148
|
+
return "Skill Insight"
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
return (
|
|
152
|
+
<box gap={1}>
|
|
153
|
+
<Show when={!props.config.host}>
|
|
154
|
+
<box
|
|
155
|
+
backgroundColor={theme().backgroundElement}
|
|
156
|
+
paddingTop={1}
|
|
157
|
+
paddingBottom={1}
|
|
158
|
+
paddingLeft={2}
|
|
159
|
+
paddingRight={2}
|
|
160
|
+
flexDirection="column"
|
|
161
|
+
gap={0}
|
|
162
|
+
>
|
|
163
|
+
<text fg={theme().text}>
|
|
164
|
+
<b>Skill Insight</b>
|
|
165
|
+
</text>
|
|
166
|
+
<text fg={theme().textMuted}>未配置 SKILL_INSIGHT_HOST</text>
|
|
167
|
+
<text fg={theme().textMuted}>请在 ~/.skill-insight/.env 设置 SKILL_INSIGHT_HOST</text>
|
|
168
|
+
</box>
|
|
169
|
+
</Show>
|
|
170
|
+
<Show when={entry()}>
|
|
171
|
+
{(x: any) => (
|
|
172
|
+
<box
|
|
173
|
+
backgroundColor={theme().backgroundElement}
|
|
174
|
+
paddingTop={1}
|
|
175
|
+
paddingBottom={1}
|
|
176
|
+
paddingLeft={2}
|
|
177
|
+
paddingRight={2}
|
|
178
|
+
flexDirection="column"
|
|
179
|
+
gap={0}
|
|
180
|
+
>
|
|
181
|
+
<box flexDirection="row" justifyContent="space-between">
|
|
182
|
+
<text fg={theme().text}>
|
|
183
|
+
<b>{title()}</b>
|
|
184
|
+
</text>
|
|
185
|
+
</box>
|
|
186
|
+
<Show when={x().state === "loading"}>
|
|
187
|
+
<text fg={theme().textMuted}>等待任务执行完毕</text>
|
|
188
|
+
</Show>
|
|
189
|
+
<Show when={x().state === "error"}>
|
|
190
|
+
<text fg={theme().textMuted}>统计暂不可用</text>
|
|
191
|
+
</Show>
|
|
192
|
+
<Show when={x().state === "ready"}>
|
|
193
|
+
<text fg={theme().textMuted}>时延: {formatLatencySeconds(x().stats?.latency)}</text>
|
|
194
|
+
<text fg={theme().textMuted}>
|
|
195
|
+
Token: {formatNumber(x().stats?.tokens)} (入: {formatNumber(x().stats?.input_tokens)}, 出:{" "}
|
|
196
|
+
{formatNumber(x().stats?.output_tokens)})
|
|
197
|
+
</text>
|
|
198
|
+
<text fg={theme().textMuted}>
|
|
199
|
+
LLM: {formatNumber(x().stats?.llm_call_count)} | 工具: {formatNumber(x().stats?.tool_call_count)}
|
|
200
|
+
</text>
|
|
201
|
+
<text
|
|
202
|
+
fg={theme().primary}
|
|
203
|
+
onMouseDown={() => {
|
|
204
|
+
const ok = openUrl(x().detailsUrl)
|
|
205
|
+
if (!ok) props.api.ui.toast({ message: "打开失败(可复制链接到浏览器)", variant: "error" })
|
|
206
|
+
}}
|
|
207
|
+
>
|
|
208
|
+
<b>查看详情 ↗</b> <span style={{ fg: theme().textMuted }}>(点击打开)</span>
|
|
209
|
+
</text>
|
|
210
|
+
</Show>
|
|
211
|
+
</box>
|
|
212
|
+
)}
|
|
213
|
+
</Show>
|
|
214
|
+
<Show when={!entry()}>
|
|
215
|
+
<text fg={theme().textMuted}>Skill Insight:暂无任务统计</text>
|
|
216
|
+
</Show>
|
|
217
|
+
</box>
|
|
218
|
+
)
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const tui = async (api: any) => {
|
|
222
|
+
const [entries, setEntries] = createSignal({})
|
|
223
|
+
|
|
224
|
+
const getEntry = (sid: string) => entries()[sid]
|
|
225
|
+
const setEntry = (sid: string, value: any) => {
|
|
226
|
+
const prev = entries()
|
|
227
|
+
setEntries({ ...prev, [sid]: value })
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const ensure = async (sessionId: string, opts?: { force?: boolean }) => {
|
|
231
|
+
const existing = getEntry(sessionId)
|
|
232
|
+
if (existing?.state === "loading") return
|
|
233
|
+
if (!opts?.force && existing?.state === "ready") return
|
|
234
|
+
|
|
235
|
+
const cfg = loadSkillInsightConfig()
|
|
236
|
+
if (!cfg.showTaskStats) return
|
|
237
|
+
if (!cfg.host) return
|
|
238
|
+
const base = normalizeHost(cfg.host)
|
|
239
|
+
if (!base) return
|
|
240
|
+
|
|
241
|
+
const detailsUrl = buildDetailsUrl(base, sessionId)
|
|
242
|
+
setEntry(sessionId, {
|
|
243
|
+
sessionId,
|
|
244
|
+
state: "loading",
|
|
245
|
+
detailsUrl,
|
|
246
|
+
updatedAt: Date.now(),
|
|
247
|
+
prevTimestamp: existing?.stats?.timestamp,
|
|
248
|
+
})
|
|
249
|
+
|
|
250
|
+
let stats: any = null
|
|
251
|
+
const maxAttempts = 8
|
|
252
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
253
|
+
stats = await fetchTaskStats(base, sessionId, cfg.apiKey)
|
|
254
|
+
if (stats) {
|
|
255
|
+
if (opts?.force && existing?.stats?.timestamp && stats.timestamp) {
|
|
256
|
+
const prevMs = Date.parse(existing.stats.timestamp)
|
|
257
|
+
const curMs = Date.parse(stats.timestamp)
|
|
258
|
+
if (Number.isFinite(prevMs) && Number.isFinite(curMs) && curMs <= prevMs) {
|
|
259
|
+
stats = null
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (stats) break
|
|
264
|
+
await sleep(i < 2 ? 800 : 1200)
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
if (!stats) {
|
|
268
|
+
setEntry(sessionId, { sessionId, state: "error", detailsUrl, updatedAt: Date.now() })
|
|
269
|
+
return
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
setEntry(sessionId, { sessionId, state: "ready", detailsUrl, stats, updatedAt: Date.now() })
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
api.slots.register({
|
|
276
|
+
order: 80,
|
|
277
|
+
slots: {
|
|
278
|
+
sidebar_content(_ctx: any, props: any) {
|
|
279
|
+
const cfg = loadSkillInsightConfig()
|
|
280
|
+
if (!cfg.showTaskStats) return null
|
|
281
|
+
const sid = props?.session_id
|
|
282
|
+
if (!sid || typeof sid !== "string") return null
|
|
283
|
+
return <StatsFooter api={api} sessionId={sid} getEntry={getEntry} ensure={ensure} config={cfg} />
|
|
284
|
+
},
|
|
285
|
+
},
|
|
286
|
+
})
|
|
287
|
+
|
|
288
|
+
api.event.on("session.idle", async (evt: any) => {
|
|
289
|
+
const sessionId =
|
|
290
|
+
evt?.properties?.sessionId ||
|
|
291
|
+
evt?.properties?.sessionID ||
|
|
292
|
+
evt?.properties?.session_id ||
|
|
293
|
+
evt?.session_id ||
|
|
294
|
+
evt?.payload?.session_id
|
|
295
|
+
|
|
296
|
+
if (!sessionId || typeof sessionId !== "string") return
|
|
297
|
+
if (!sessionId.startsWith("ses")) return
|
|
298
|
+
api.kv.set("skill_insight_latest_session_id", sessionId)
|
|
299
|
+
ensure(sessionId, { force: true })
|
|
300
|
+
})
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const plugin = {
|
|
304
|
+
id: "witty-skill-insight-task-stats",
|
|
305
|
+
tui,
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
export default plugin
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,9665,e=>{"use strict";var s=e.i(43476),t=e.i(18566),
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,9665,e=>{"use strict";var s=e.i(43476),t=e.i(18566),c=e.i(71645);function n({skillId:e,skillName:c,version:n,user:a}){let r=(0,t.useRouter)();return e||c?(0,s.jsxs)("span",{onClick:s=>{s.preventDefault();let t=new URLSearchParams;e?t.set("id",e):(t.set("name",c),a&&t.set("user",a)),null!=n&&t.set("version",String(n)),r.push(`/skills?${t.toString()}`)},style:{color:"#60a5fa",cursor:"pointer",textDecoration:"none",transition:"color 0.2s"},onMouseEnter:e=>{e.currentTarget.style.textDecoration="underline",e.currentTarget.style.color="#93c5fd"},onMouseLeave:e=>{e.currentTarget.style.textDecoration="none",e.currentTarget.style.color="#60a5fa"},children:[c,n?` (v${n})`:""]}):(0,s.jsx)("span",{style:{color:"#64748b"},children:"(None)"})}function a({skills:e,skill:t,skillId:a,skillIds:r,skillVersion:l,user:i}){return e?.length||t?e?.length?(0,s.jsx)(s.Fragment,{children:e.map((e,t)=>{let a=r?.[t]||null;return(0,s.jsxs)(c.default.Fragment,{children:[t>0&&(0,s.jsx)("span",{style:{color:"#e2e8f0"},children:", "}),(0,s.jsx)(n,{skillId:a,skillName:e,version:l,user:i})]},t)})}):(0,s.jsx)(n,{skillId:a,skillName:t,version:l,user:i}):(0,s.jsx)("span",{style:{color:"#64748b"},children:"(None)"})}e.s(["SkillLinks",()=>a])},95802,e=>{e.v(s=>Promise.all(["static/chunks/f7a6fed60fb079dd.js","static/chunks/5432ce4a494bc74d.js","static/chunks/b43afe7d924243d9.js","static/chunks/68e4bccbce97556a.js","static/chunks/21105f8885631d60.js","static/chunks/7a95be670a5c981c.js","static/chunks/aa21d65228612e46.js","static/chunks/07668c4577ece2d3.js","static/chunks/78fd227efc628935.js"].map(s=>e.l(s))).then(()=>s(76913)))},34486,e=>{e.v(s=>Promise.all(["static/chunks/6baf949fafec6be3.js","static/chunks/cd0fde15dc0dfcca.js","static/chunks/e13d208072a48316.js"].map(s=>e.l(s))).then(()=>s(13143)))},14524,e=>{e.v(s=>Promise.all(["static/chunks/fec58f85bfaa3c39.js"].map(s=>e.l(s))).then(()=>s(17847)))}]);
|