@qt4798/pi-web 0.17.0 → 0.17.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +22 -22
- package/.next/build-manifest.json +3 -3
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +5 -5
- package/.next/required-server-files.js +1 -1
- package/.next/required-server-files.json +1 -1
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +4 -5
- package/.next/server/app/_not-found.segments/_full.segment.rsc +4 -5
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +4 -5
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -4
- package/.next/server/app/api/app-update/route.js +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +6 -7
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +6 -7
- package/.next/server/app/index.segments/_full.segment.rsc +6 -7
- package/.next/server/app/index.segments/_tree.segment.rsc +3 -4
- package/.next/server/app/page.js +3 -3
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +22 -22
- package/.next/server/chunks/4253.js +1 -1
- package/.next/server/chunks/6429.js +1 -1
- package/.next/server/chunks/7915.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/app/{layout-8def4e2d1e761159.js → layout-344bb26f147e8fc7.js} +1 -1
- package/.next/static/chunks/app/{page-a580932c40c3cd1f.js → page-a5bd25a6c7117c16.js} +3 -3
- package/.next/static/chunks/{webpack-5b085ae581af4587.js → webpack-6a622f7fe45a5a31.js} +1 -1
- package/.next/static/css/{93fb21dec5e72367.css → 2f46e0db0d4a3aed.css} +1 -1
- package/.next/static/css/683b2ca13a4576ae.css +1 -0
- package/.next/trace +8 -9
- package/.next/trace-build +1 -1
- package/package.json +10 -7
- package/.next/static/css/1e6342ca3186c2ef.css +0 -1
- package/.next/static/css/fcd139415428d9a1.css +0 -1
- /package/.next/static/{oDQqLMJRH8ZLoY87E7Kt9 → ttjXA0WqHPS9c_XTNNfP0}/_buildManifest.js +0 -0
- /package/.next/static/{oDQqLMJRH8ZLoY87E7Kt9 → ttjXA0WqHPS9c_XTNNfP0}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/page"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"27123":{"*":{"id":"81921","name":"*","chunks":[],"async":false}},"39247":{"*":{"id":"55100","name":"*","chunks":[],"async":false}},"55600":{"*":{"id":"65594","name":"*","chunks":[],"async":false}},"57121":{"*":{"id":"35421","name":"*","chunks":[],"async":false}},"61304":{"*":{"id":"60440","name":"*","chunks":[],"async":false}},"64777":{"*":{"id":"82265","name":"*","chunks":[],"async":false}},"74581":{"*":{"id":"61335","name":"*","chunks":[],"async":false}},"78616":{"*":{"id":"84342","name":"*","chunks":[],"async":false}},"86343":{"*":{"id":"67809","name":"*","chunks":[],"async":false}},"86869":{"*":{"id":"74661","name":"*","chunks":[],"async":false}},"90484":{"*":{"id":"70664","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/client/components/builtin/global-error.js":{"id":27123,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/esm/client/components/builtin/global-error.js":{"id":27123,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/client/components/client-page.js":{"id":61304,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/esm/client/components/client-page.js":{"id":61304,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/client/components/client-segment.js":{"id":78616,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/esm/client/components/client-segment.js":{"id":78616,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js":{"id":64777,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js":{"id":64777,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/client/components/layout-router.js":{"id":57121,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/esm/client/components/layout-router.js":{"id":57121,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/client/components/render-from-template-context.js":{"id":74581,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":74581,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/lib/framework/boundary-components.js":{"id":90484,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/esm/lib/framework/boundary-components.js":{"id":90484,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/lib/metadata/generate/icon-mark.js":{"id":86869,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js":{"id":86869,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/components/ErrorBoundary.tsx":{"id":86343,"name":"*","chunks":["7177","static/chunks/app/layout-
|
|
1
|
+
globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/page"]={"moduleLoading":{"prefix":"/_next/"},"ssrModuleMapping":{"27123":{"*":{"id":"81921","name":"*","chunks":[],"async":false}},"39247":{"*":{"id":"55100","name":"*","chunks":[],"async":false}},"55600":{"*":{"id":"65594","name":"*","chunks":[],"async":false}},"57121":{"*":{"id":"35421","name":"*","chunks":[],"async":false}},"61304":{"*":{"id":"60440","name":"*","chunks":[],"async":false}},"64777":{"*":{"id":"82265","name":"*","chunks":[],"async":false}},"74581":{"*":{"id":"61335","name":"*","chunks":[],"async":false}},"78616":{"*":{"id":"84342","name":"*","chunks":[],"async":false}},"86343":{"*":{"id":"67809","name":"*","chunks":[],"async":false}},"86869":{"*":{"id":"74661","name":"*","chunks":[],"async":false}},"90484":{"*":{"id":"70664","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/client/components/builtin/global-error.js":{"id":27123,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/esm/client/components/builtin/global-error.js":{"id":27123,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/client/components/client-page.js":{"id":61304,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/esm/client/components/client-page.js":{"id":61304,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/client/components/client-segment.js":{"id":78616,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/esm/client/components/client-segment.js":{"id":78616,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js":{"id":64777,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js":{"id":64777,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/client/components/layout-router.js":{"id":57121,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/esm/client/components/layout-router.js":{"id":57121,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/client/components/render-from-template-context.js":{"id":74581,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":74581,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/lib/framework/boundary-components.js":{"id":90484,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/esm/lib/framework/boundary-components.js":{"id":90484,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/lib/metadata/generate/icon-mark.js":{"id":86869,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js":{"id":86869,"name":"*","chunks":[],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/components/ErrorBoundary.tsx":{"id":86343,"name":"*","chunks":["7177","static/chunks/app/layout-344bb26f147e8fc7.js"],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/katex/dist/katex.min.css":{"id":84559,"name":"*","chunks":["7177","static/chunks/app/layout-344bb26f147e8fc7.js"],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/app/globals.css":{"id":66872,"name":"*","chunks":["7177","static/chunks/app/layout-344bb26f147e8fc7.js"],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/@fontsource/ia-writer-quattro/index.css":{"id":26408,"name":"*","chunks":["7177","static/chunks/app/layout-344bb26f147e8fc7.js"],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/@fontsource/ia-writer-quattro/400-italic.css":{"id":8057,"name":"*","chunks":["7177","static/chunks/app/layout-344bb26f147e8fc7.js"],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/@fontsource/ia-writer-quattro/700.css":{"id":35279,"name":"*","chunks":["7177","static/chunks/app/layout-344bb26f147e8fc7.js"],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/@fontsource/ia-writer-quattro/700-italic.css":{"id":48276,"name":"*","chunks":["7177","static/chunks/app/layout-344bb26f147e8fc7.js"],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/node_modules/@fontsource/lilex/index.css":{"id":12043,"name":"*","chunks":["7177","static/chunks/app/layout-344bb26f147e8fc7.js"],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/components/AppShell.tsx":{"id":55600,"name":"*","chunks":["7330","static/chunks/d3ac728e-7964f816a1ca64e5.js","9786","static/chunks/9786-a857d8cac4c6f124.js","8974","static/chunks/app/page-a5bd25a6c7117c16.js"],"async":false},"/Volumes/1T 原装/项目研发/pi-web-QT/hooks/useI18n.tsx":{"id":39247,"name":"*","chunks":["7330","static/chunks/d3ac728e-7964f816a1ca64e5.js","9786","static/chunks/9786-a857d8cac4c6f124.js","8974","static/chunks/app/page-a5bd25a6c7117c16.js"],"async":false}},"entryCSSFiles":{"/Volumes/1T 原装/项目研发/pi-web-QT/":[],"/Volumes/1T 原装/项目研发/pi-web-QT/app/layout":[{"inlined":false,"path":"static/css/2f46e0db0d4a3aed.css"},{"inlined":false,"path":"static/css/683b2ca13a4576ae.css"}],"/Volumes/1T 原装/项目研发/pi-web-QT/app/page":[]},"rscModuleMapping":{"8057":{"*":{"id":"17","name":"*","chunks":[],"async":false}},"12043":{"*":{"id":"47561","name":"*","chunks":[],"async":false}},"26408":{"*":{"id":"77222","name":"*","chunks":[],"async":false}},"27123":{"*":{"id":"95547","name":"*","chunks":[],"async":false}},"35279":{"*":{"id":"10289","name":"*","chunks":[],"async":false}},"39247":{"*":{"id":"73884","name":"*","chunks":[],"async":false}},"48276":{"*":{"id":"64388","name":"*","chunks":[],"async":false}},"55600":{"*":{"id":"35790","name":"*","chunks":[],"async":false}},"57121":{"*":{"id":"98099","name":"*","chunks":[],"async":false}},"61304":{"*":{"id":"15098","name":"*","chunks":[],"async":false}},"64777":{"*":{"id":"33859","name":"*","chunks":[],"async":false}},"66872":{"*":{"id":"82704","name":"*","chunks":[],"async":false}},"74581":{"*":{"id":"16237","name":"*","chunks":[],"async":false}},"78616":{"*":{"id":"47644","name":"*","chunks":[],"async":false}},"84559":{"*":{"id":"25319","name":"*","chunks":[],"async":false}},"86343":{"*":{"id":"24387","name":"*","chunks":[],"async":false}},"86869":{"*":{"id":"36675","name":"*","chunks":[],"async":false}},"90484":{"*":{"id":"98562","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}};
|
|
@@ -34,64 +34,64 @@
|
|
|
34
34
|
"/icon.ico/route": "app/icon.ico/route.js",
|
|
35
35
|
"/icon.png/route": "app/icon.png/route.js",
|
|
36
36
|
"/icon.svg/route": "app/icon.svg/route.js",
|
|
37
|
+
"/api/agent/[id]/bash-output/route": "app/api/agent/[id]/bash-output/route.js",
|
|
37
38
|
"/api/agent/running/route": "app/api/agent/running/route.js",
|
|
39
|
+
"/api/agent/[id]/events/route": "app/api/agent/[id]/events/route.js",
|
|
38
40
|
"/api/agent/running/events/route": "app/api/agent/running/events/route.js",
|
|
39
|
-
"/api/agent/[id]/bash-output/route": "app/api/agent/[id]/bash-output/route.js",
|
|
40
41
|
"/api/app-update/route": "app/api/app-update/route.js",
|
|
42
|
+
"/api/auth/api-key/[provider]/route": "app/api/auth/api-key/[provider]/route.js",
|
|
41
43
|
"/api/auth/combined/route": "app/api/auth/combined/route.js",
|
|
42
|
-
"/api/agent/[id]/events/route": "app/api/agent/[id]/events/route.js",
|
|
43
44
|
"/api/auth/logout/[provider]/route": "app/api/auth/logout/[provider]/route.js",
|
|
44
45
|
"/api/auth/providers/route": "app/api/auth/providers/route.js",
|
|
45
|
-
"/api/auth/
|
|
46
|
+
"/api/auth/login/[provider]/route": "app/api/auth/login/[provider]/route.js",
|
|
46
47
|
"/api/backup/export/route": "app/api/backup/export/route.js",
|
|
48
|
+
"/api/deepseek/balance/route": "app/api/deepseek/balance/route.js",
|
|
47
49
|
"/api/events/route": "app/api/events/route.js",
|
|
50
|
+
"/api/backup/import/route": "app/api/backup/import/route.js",
|
|
48
51
|
"/api/features/route": "app/api/features/route.js",
|
|
49
|
-
"/api/deepseek/balance/route": "app/api/deepseek/balance/route.js",
|
|
50
|
-
"/api/git/push/route": "app/api/git/push/route.js",
|
|
51
52
|
"/api/git/diff/route": "app/api/git/diff/route.js",
|
|
52
|
-
"/api/
|
|
53
|
-
"/api/backup/import/route": "app/api/backup/import/route.js",
|
|
53
|
+
"/api/git/push/route": "app/api/git/push/route.js",
|
|
54
54
|
"/api/git/status/route": "app/api/git/status/route.js",
|
|
55
55
|
"/api/git/stash/route": "app/api/git/stash/route.js",
|
|
56
|
-
"/api/mcp/restart/route": "app/api/mcp/restart/route.js",
|
|
57
56
|
"/api/logs/route": "app/api/logs/route.js",
|
|
57
|
+
"/api/mcp/restart/route": "app/api/mcp/restart/route.js",
|
|
58
58
|
"/api/mcp/route": "app/api/mcp/route.js",
|
|
59
59
|
"/api/models-config/catalog/route": "app/api/models-config/catalog/route.js",
|
|
60
|
-
"/api/models-config/route": "app/api/models-config/route.js",
|
|
61
|
-
"/api/models-config/discover/route": "app/api/models-config/discover/route.js",
|
|
62
|
-
"/api/models-config/test/route": "app/api/models-config/test/route.js",
|
|
63
60
|
"/api/models-config/builtin/route": "app/api/models-config/builtin/route.js",
|
|
64
|
-
"/api/
|
|
61
|
+
"/api/models-config/test/route": "app/api/models-config/test/route.js",
|
|
62
|
+
"/api/models-config/discover/route": "app/api/models-config/discover/route.js",
|
|
63
|
+
"/api/models-config/route": "app/api/models-config/route.js",
|
|
65
64
|
"/api/plugins/check/route": "app/api/plugins/check/route.js",
|
|
65
|
+
"/api/modes/route": "app/api/modes/route.js",
|
|
66
66
|
"/api/models/route": "app/api/models/route.js",
|
|
67
67
|
"/api/project-aliases/route": "app/api/project-aliases/route.js",
|
|
68
68
|
"/api/project-state/route": "app/api/project-state/route.js",
|
|
69
|
-
"/api/projects/visibility/route": "app/api/projects/visibility/route.js",
|
|
70
69
|
"/api/project-trust/route": "app/api/project-trust/route.js",
|
|
70
|
+
"/api/projects/visibility/route": "app/api/projects/visibility/route.js",
|
|
71
71
|
"/api/proxy/route": "app/api/proxy/route.js",
|
|
72
72
|
"/api/proxy/test/route": "app/api/proxy/test/route.js",
|
|
73
73
|
"/api/sessions/route": "app/api/sessions/route.js",
|
|
74
74
|
"/api/sessions/search/route": "app/api/sessions/search/route.js",
|
|
75
|
-
"/api/
|
|
76
|
-
"/api/settings/title-model/route": "app/api/settings/title-model/route.js",
|
|
75
|
+
"/api/plugins/route": "app/api/plugins/route.js",
|
|
77
76
|
"/api/sessions/[id]/export/route": "app/api/sessions/[id]/export/route.js",
|
|
77
|
+
"/api/settings/title-model/route": "app/api/settings/title-model/route.js",
|
|
78
|
+
"/api/skills/check/route": "app/api/skills/check/route.js",
|
|
78
79
|
"/api/skills/install/route": "app/api/skills/install/route.js",
|
|
79
80
|
"/api/skills/route": "app/api/skills/route.js",
|
|
80
|
-
"/api/plugins/route": "app/api/plugins/route.js",
|
|
81
|
-
"/api/snippets/route": "app/api/snippets/route.js",
|
|
82
|
-
"/api/skills/update/route": "app/api/skills/update/route.js",
|
|
83
81
|
"/api/snippets/[id]/route": "app/api/snippets/[id]/route.js",
|
|
84
|
-
"/api/
|
|
82
|
+
"/api/snippets/route": "app/api/snippets/route.js",
|
|
85
83
|
"/api/subagents/[id]/route": "app/api/subagents/[id]/route.js",
|
|
84
|
+
"/api/skills/search/route": "app/api/skills/search/route.js",
|
|
85
|
+
"/api/skills/update/route": "app/api/skills/update/route.js",
|
|
86
86
|
"/api/subagents/settings/route": "app/api/subagents/settings/route.js",
|
|
87
87
|
"/api/tasks/[id]/changed-files/route": "app/api/tasks/[id]/changed-files/route.js",
|
|
88
|
-
"/api/tasks/events/route": "app/api/tasks/events/route.js",
|
|
89
88
|
"/api/subagents/profiles/route": "app/api/subagents/profiles/route.js",
|
|
89
|
+
"/api/tasks/events/route": "app/api/tasks/events/route.js",
|
|
90
90
|
"/api/terminal/route": "app/api/terminal/route.js",
|
|
91
91
|
"/api/terminal/[id]/events/route": "app/api/terminal/[id]/events/route.js",
|
|
92
92
|
"/api/terminal/[id]/route": "app/api/terminal/[id]/route.js",
|
|
93
93
|
"/api/tools/settings/route": "app/api/tools/settings/route.js",
|
|
94
94
|
"/api/vision-config/route": "app/api/vision-config/route.js",
|
|
95
|
-
"/
|
|
96
|
-
"/
|
|
95
|
+
"/api/usage/route": "app/api/usage/route.js",
|
|
96
|
+
"/page": "app/page.js"
|
|
97
97
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
exports.id=4253,exports.ids=[4253],exports.modules={4658:(a,b,c)=>{},5564:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{wQ:()=>g}),c(73024),c(76760);var e=c(75430);c(61446);var f=a([e]);e=(f.then?(await f)():f)[0];let h=new Set(["bash","powershell"]);function g(a,b,c=process.platform){return function(a,b){let c=b?"powershell":"bash",d=[];for(let b of a){let a=h.has(b)?c:b;d.includes(a)||d.push(a)}return d}(a,function(a,b=process.platform){return"win32"===b&&a?.includes("powershell")===!0&&!a.includes("bash")}(b,c))}d()}catch(a){d(a)}})},7535:(a,b,c)=>{"use strict";c.d(b,{z:()=>f});var d=c(76760),e=c.n(d);function f(a,b=process.platform){if(!a)return a;let c="win32"===b?e().win32:e().posix,d=c.normalize(a),g=c.parse(d).root.length,h=d.length;for(;h>g&&d[h-1]===c.sep;)h--;let i=d.slice(0,h);return"win32"===b?i.toLowerCase():i}},7561:(a,b,c)=>{"use strict";c.d(b,{$:()=>f});var d=c(76760),e=c.n(d);function f(a,b=process.platform){let c="win32"===b?e().win32.normalize(a):e().posix.normalize(a);return"win32"===b?c.toLowerCase():c}},8084:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{J8:()=>k,U6:()=>m,Vj:()=>l,o2:()=>j});var e=c(28802),f=c(75430),g=c(41035),h=c(16983),i=a([e,f,g]);[e,f,g]=i.then?(await i)():i;let n="pi-web-subagents",o=`<inline:${n}>`,p=new Set(g.st),q="pi-subagents";function j(a){return{kind:"pi-web-subagent",sessionId:a.sessionId,profile:a.profile,description:a.description,status:a.status,runInBackground:a.runInBackground,createdAt:a.createdAt,...a.completedAt?{completedAt:a.completedAt}:{},...a.error?{error:a.error}:{}}}function k(a){return"starting"===a.status||"running"===a.status?`Subagent ${a.sessionId} is ${a.status}.`:"completed"===a.status?a.result?.trim()||"Subagent completed without text output.":"aborted"===a.status?`Subagent ${a.sessionId} was stopped.`:"interrupted"===a.status?`Subagent ${a.sessionId} was interrupted before completion.`:`Subagent ${a.sessionId} failed: ${a.error??"Unknown error"}`}function l(a,b,c=()=>!0){return{name:n,hidden:!0,factory:d=>{let g;if(!c())return;let i=b().filter(a=>a.enabled),l=i.map(a=>a.name),m=l.length>0?l.join(", "):"none";d.registerTool((0,f.defineTool)({name:"Agent",label:"Agent",description:`Delegate a focused task to a configured subagent. Each subagent runs as a full, inspectable Pi session. Use background mode for independent work and foreground mode when the result is needed immediately.
|
|
2
2
|
|
|
3
3
|
Available agent types:
|
|
4
|
-
${(g=i.filter(a=>a.enabled),0===g.length?"No subagent profiles are currently enabled.":g.map(a=>{let b=[`Tools: ${a.tools.length>0?a.tools.join(", "):"none"}`];return a.model&&b.push(`Model: ${a.model}`),`- ${a.name}: ${a.description} (${b.join("; ")})`}).join("\n"))}`,promptSnippet:"Delegate a focused task to an inspectable subagent session",promptGuidelines:["Use Agent for a focused task that benefits from an isolated context.","Use multiple background Agent calls in the same response for independent parallel work.","Do not duplicate work already delegated to a running subagent."],executionMode:"parallel",parameters:e.Type.Object({subagent_type:e.Type.Optional(e.Type.String({description:`Configured agent profile. Available types: ${m}. Default: general-purpose.`})),prompt:e.Type.String({description:"The complete task for the subagent."}),input_files:e.Type.Optional(e.Type.Array(e.Type.String(),{description:"UTF-8 text files under the session cwd to include with the task.",maxItems:h.Wv})),description:e.Type.String({description:"Short activity label shown in the UI."}),run_in_background:e.Type.Optional(e.Type.Boolean({description:"Return immediately and notify this session when complete."})),model:e.Type.Optional(e.Type.String({description:"Optional provider/modelId override."})),thinking:e.Type.Optional(e.Type.String({description:"Optional thinking level override."})),max_turns:e.Type.Optional(e.Type.Number({description:"Optional positive agent turn limit."})),inherit_context:e.Type.Optional(e.Type.Boolean({description:"Include the parent session's active conversation context."}))}),async execute(b,c,d,e,f){try{let g=await a.start({parentContext:f,parentToolCallId:b,profile:c.subagent_type??"general-purpose",task:c.prompt,...c.input_files?{inputFiles:c.input_files}:{},description:c.description,...void 0!==c.run_in_background?{runInBackground:c.run_in_background}:{},...c.model?{model:c.model}:{},...c.thinking?{thinking:c.thinking}:{},...c.max_turns?{maxTurns:c.max_turns}:{},...void 0!==c.inherit_context?{inheritContext:c.inherit_context}:{},signal:d,onUpdate:a=>e?.({content:[{type:"text",text:`${a.profile}: ${a.description} (${a.status})`}],details:j(a)})});if(g.run.runInBackground)return g.completion.then(b=>a.notifyParent(b)).catch(a=>{console.error("[pi-web] failed to deliver subagent completion:",a instanceof Error?a.message:a)}),{content:[{type:"text",text:`Subagent started in background. Session ID: ${g.run.sessionId}. You will be notified when it completes.`}],details:j(g.run)};let h=await g.completion;return{content:[{type:"text",text:k(h)}],details:j(h),..."failed"===h.status?{isError:!0}:{}}}catch(a){return{content:[{type:"text",text:a instanceof Error?a.message:String(a)}],details:void 0,isError:!0}}}})),d.registerTool((0,f.defineTool)({name:"get_subagent_result",label:"Get agent result",description:"Check an inspectable subagent session and retrieve its latest result.",parameters:e.Type.Object({agent_id:e.Type.String({description:"Subagent session ID."}),wait:e.Type.Optional(e.Type.Boolean({description:"Wait until the subagent finishes."}))}),async execute(b,c,d){let e=await a.get(c.agent_id);if(!e)return{content:[{type:"text",text:`Subagent not found: ${c.agent_id}`}],details:void 0,isError:!0};for(;c.wait&&("starting"===e.status||"running"===e.status);)if(await new Promise((a,b)=>{let c=()=>{clearTimeout(e),b(Error("Result wait aborted"))},e=setTimeout(()=>{d?.removeEventListener("abort",c),a()},500);d?.aborted?c():d?.addEventListener("abort",c,{once:!0})}),!(e=await a.get(c.agent_id)))return{content:[{type:"text",text:`Subagent not found: ${c.agent_id}`}],details:void 0,isError:!0};return{content:[{type:"text",text:k(e)}],details:j(e),..."failed"===e.status?{isError:!0}:{}}}})),d.registerTool((0,f.defineTool)({name:"steer_subagent",label:"Steer agent",description:"Send a steering message to a currently running subagent session.",parameters:e.Type.Object({agent_id:e.Type.String({description:"Subagent session ID."}),message:e.Type.String({description:"Instruction to inject after the current tool execution."})}),async execute(b,c){try{return await a.steer(c.agent_id,c.message),{content:[{type:"text",text:`Steering message sent to ${c.agent_id}.`}],details:void 0}}catch(a){return{content:[{type:"text",text:a instanceof Error?a.message:String(a)}],details:void 0,isError:!0}}}}))}}}function m(a){let b=a.extensions.find(a=>a.path===o);if(!b?.tools.has("Agent"))return a;let c=new Set(a.extensions.filter(a=>a.path!==o).filter(a=>{let b=(a.sourceInfo?.source??"").replace(/^npm:/,"").split("@")[0],c=a.path.replaceAll("\\","/").split("/");return b===q||c.some(a=>a===q)}).filter(a=>[...p].some(b=>a.tools.has(b))).map(a=>a.path));return 0===c.size?a:{...a,extensions:a.extensions.filter(a=>!c.has(a.path)),errors:a.errors.filter(a=>!c.has(a.path)&&(a.path!==o||![...c].some(b=>[...p].some(c=>a.error===`Tool "${c}" conflicts with ${b}`))))}}d()}catch(a){d(a)}})},12144:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{OF:()=>L});var e=c(75430),f=c(29862),g=c(55511),h=c(29021),i=c(33873),j=c(18437),k=c(17114),l=c(65869),m=c(96515),n=c(15253),o=c(69453),p=c(8084),q=c(41035);c(54035);var r=c(12559),s=c(84851),t=c(70274),u=c(5564),v=c(81186),w=c(61577),x=c(44290),y=c(30116),z=c(97563),A=c(57856),B=c(29040),C=c(91099),D=c(12394),E=a([e,f,m,n,o,p,q,s,t,u,v,x,B,D]);[e,f,m,n,o,p,q,s,t,u,v,x,B,D]=E.then?(await E)():E;let M=new Set(["agent_start","message_start","message_update","message_end","agent_end","entry_appended","session_info_changed","queue_update","prompt_done","agent_settled","auto_compaction_end","compaction_end"]),N=function(a=process.env.PI_WEB_IDLE_TIMEOUT_MS){let b=(a??"").trim();if(""===b)return 6e5;let c=Number(b);return Number.isFinite(c)&&!(c<0)&&Number.isInteger(c)?c:(console.warn(`[pi-web] invalid PI_WEB_IDLE_TIMEOUT_MS "${a}", falling back to 600000ms`),6e5)}(),O=new Set(["fork","clone"]),P=new Set(["get_state","abort","steer","follow_up_draft"]),Q=["read","bash","powershell","edit","write","grep","find","ls"];class R extends e.Theme{constructor(){super({muted:"",text:"",thinkingXhigh:"",searchMatchText:""},{selectedBg:""},"truecolor")}fg(...[,a]){return a}bg(...[,a]){return a}bold(a){return a}italic(a){return a}underline(a){return a}inverse(a){return a}strikethrough(a){return a}getFgAnsi(){return""}getBgAnsi(){return""}getThinkingBorderColor(){return a=>a}getBashModeBorderColor(){return a=>a}}let S=new R,T=new f.KeybindingsManager(f.TUI_KEYBINDINGS);function F(a,b){if(0===b.length)return[];let c=new Set(Q),d=(0,u.wQ)(b,a.settingsManager.getDefaultTools()),e=a.getAllTools().map(a=>a.name).filter(a=>!c.has(a));return[...new Set([...d,...e])]}class U{constructor(a,b){this.inner=a,this.cwd=b,this.listeners=[],this.pendingUiResponses=new Map,this.pendingUiRequests=new Map,this.activeCustomUis=new Map,this.extensionUiAbortController=new AbortController,this.extensionStatuses=new Map,this.extensionWidgets=new Map,this.promptRunning=!1,this.promptPhase=null,this.extensionsBound=!1,this.extensionBindingPromise=null,this.extensionBindingError=null,this.forceEmptySystemPrompt=!1,this.exactSystemPrompt=null,this.pendingPromptCount=0,this.activeMutatingCommands=0,this.agentRunNeedsCompletion=!1,this.promptAdmissionTail=Promise.resolve(),this.sessionReplacement=null,this.forceShutdownOnIdle=!1,this.unsubscribe=null,this.idleTimer=null,this.subscriberCount=0,this.disposeGraceTimer=null,this.lastActivityAt=Date.now(),this.queueMirror=[],this.queueRecovery=[],this.pendingQueueHints={steer:[],followUp:[]},this.queueMutationTail=Promise.resolve(),this.onDestroyCallback=null,this.shutdownPromise=null,this.sessionShutdownEmitted=!1,this._alive=!0,this.approvalPolicy=(0,y.ni)((0,x.lN)().permissionRules),this.approvalMode=(0,x.lN)().toolApprovalMode,this.pendingApprovals=new Map,this.approvalSeq=0,this.approvalHookInstalled=!1,this.goalEngine=new C.aA,this.goalTokensAccounted=0,this.goalToolCallsAccounted=0,this.goalContinuationInFlight=!1,this.wrapperChatOnly=!1,this.wrapperSuppressNotifications=!1;const c=(0,x.lN)(a.sessionId);if(this.approvalMode=c.toolApprovalMode,this.approvalPolicy=(0,y.ni)(c.permissionRules),a.sessionFile){const b=(0,C.bo)(a.sessionFile);"idle"!==b.status&&this.goalEngine.hydrate(b)}}get sessionId(){return this.inner.sessionId}get sessionFile(){return this.inner.sessionFile??""}isAlive(){return this._alive}async waitUntilReady(){}isShuttingDown(){return null!==this.shutdownPromise}whenShutdown(){return this.shutdownPromise}isRunning(){return this._alive&&(this.promptRunning||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)}runtimeSnapshot(){let a=this.inner.isStreaming,b=this.promptRunning,c=this.inner.isCompacting,d=this.inner.isBashRunning;return{id:this.sessionId,running:this.isRunning(),isStreaming:a,isPromptRunning:b,isCompacting:c,isBashRunning:d,phase:d?"running_command":this.promptPhase??(a||b||c?"waiting_model":null)}}setChatOnly(a){this.wrapperChatOnly=a}setSuppressCompletionNotifications(a){this.wrapperSuppressNotifications=a}isChatOnly(){return this.wrapperChatOnly}hasSuppressedCompletionNotifications(){return this.wrapperSuppressNotifications}start(){this.installApprovalHook(),this.goalEngine.setOnChanged(a=>{this.sessionFile&&(0,C.eG)(this.sessionFile,a),this.emit({type:"goal_state_changed",goalState:a}),J("goal_state_changed",this.sessionId,{type:"goal_state_changed",goalState:a})}),this.goalEngine.isRunning()&&this.scheduleGoalKick(),this.unsubscribe=this.inner.subscribe(a=>{("agent_end"===a.type||"message_end"===a.type||"entry_appended"===a.type||"session_info_changed"===a.type)&&(0,o.mD)(),("agent_end"===a.type||"agent_settled"===a.type||"auto_compaction_end"===a.type||"compaction_end"===a.type)&&this.resetIdleTimer(),"agent_start"===a.type&&(this.goalEngine.onAgentStart(),this.agentRunNeedsCompletion=!0),"agent_settled"===a.type&&(this.handleGoalSettled(),this.notifyAgentRunCompleteIfIdle()),"queue_update"===a.type&&this.reconcileQueue(a.steering,a.followUp),M.has(a.type)&&J(a.type,this.sessionId,a),this.emit(a),H()}),this.resetIdleTimer()}loadQueueRecovery(){if(!this.sessionFile)return;let a=this.inner.getSteeringMessages(),b=this.inner.getFollowUpMessages();if(a.length||b.length){this.queueRecovery=[],this.reconcileQueue([...a],[...b]);return}this.queueRecovery=(0,k.ov)(this.sessionFile)}getGoalState(){return this.goalEngine.getState()}handleGoalSettled(){if(!this.goalEngine.isRunning())return void this.goalEngine.disarmContinuation();let a=this.inner.getLastAssistantText()??"",b=0,c=0;try{let a=this.inner.sessionManager.getEntries(),d=function(a){let b=0;for(let c of a){let a=c?.message;if(!a||"assistant"!==a.role)continue;let d=a.usage;d&&(b+=(d.input??0)+(d.output??0)+(d.cacheRead??0)+(d.cacheWrite??0))}return b}(a);b=Math.max(0,d-this.goalTokensAccounted),this.goalTokensAccounted=d;let e=function(a){let b=0;for(let c of a){let a=c?.message;if(!a||"assistant"!==a.role)continue;let d=a.content;if(Array.isArray(d))for(let a of d)a&&"object"==typeof a&&"toolCall"===a.type&&(b+=1)}return b}(a);c=Math.max(0,e-this.goalToolCallsAccounted),this.goalToolCallsAccounted=e}catch{}let{verdict:d}=this.goalEngine.settleTurn(a,b,c);"continue"!==d.action?this.goalEngine.disarmContinuation():this.scheduleGoalKick()}scheduleGoalKick(){if(this.goalEngine.isRunning()&&!this.goalContinuationInFlight){if(this.goalEngine.isContinuationArmed()){this.goalEngine.disarmContinuation(),this.driveGoalContinuation();return}this.inner.isStreaming||this.promptRunning||this.inner.pendingMessageCount>0||this.driveGoalContinuation()}}driveGoalContinuation(){this.goalEngine.isRunning()&&!this.goalContinuationInFlight&&(this.goalContinuationInFlight=!0,this.inner.followUp(C.LF).catch(()=>{}).finally(()=>{this.goalContinuationInFlight=!1}))}handleGoalStartCommand(a,b){let c=this.goalEngine.start(a,b);return this.goalTokensAccounted=0,this.goalToolCallsAccounted=0,c}handleGoalStopCommand(){return this.goalEngine.stop(),this.goalTokensAccounted=0,this.goalEngine.getState()}setApprovalMode(a){this.approvalMode=a}setApprovalPolicy(a){this.approvalPolicy=a}installApprovalHook(){if(this.approvalHookInstalled||!this.inner.agent?.beforeToolCall)return;this.approvalHookInstalled=!0;let a=this.inner.agent.beforeToolCall;this.inner.agent.beforeToolCall=async b=>{let c=b.toolCall?.name??"",d=b.args,e=(0,y.LD)(this.approvalPolicy,c,{mode:this.approvalMode,readOnly:z.MJ.has(c.toLowerCase()),args:d});if("deny"===e)return{block:!0,reason:`Denied by policy rule: ${c} is not permitted.`};if("ask"===e){let a=await this.askForApproval(c,d);if(!a.approve)return{block:!0,reason:a.reason||`Rejected by user: ${c}`}}return a?a(b):void 0}}askForApproval(a,b){return new Promise(c=>{let d=`approval-${++this.approvalSeq}`,e=setTimeout(()=>{this.pendingApprovals.delete(d),this.emit({type:"tool_approval_resolved",id:d,approve:!1,reason:`Approval request timed out after 120s: ${a}`}),c({approve:!1,reason:`Approval request timed out after 120s: ${a}`})},12e4);this.pendingApprovals.set(d,{resolve:c,timer:e,toolName:a}),this.emit({type:"tool_approval_request",id:d,toolName:a,args:function(a){if(null===a||"object"!=typeof a)return a;let b={};for(let[c,d]of Object.entries(a))if(null!=d&&"content"!==c&&"data"!==c&&"newString"!==c&&"oldString"!==c){if("string"==typeof d){b[c]=d.length>200?`${d.slice(0,200)}…`:d;continue}if("number"==typeof d||"boolean"==typeof d){b[c]=d;continue}b[c]=Array.isArray(d)?`[array:${d.length}]`:"[object]"}return b}(b)})})}resolveApproval(a,b,c){let d=this.pendingApprovals.get(a);return!!d&&(this.pendingApprovals.delete(a),clearTimeout(d.timer),d.resolve({approve:b,reason:c}),!0)}rejectAllApprovals(a){for(let[b,c]of this.pendingApprovals)this.pendingApprovals.delete(b),clearTimeout(c.timer),c.resolve({approve:!1,reason:a})}getPendingApprovals(){return Array.from(this.pendingApprovals.entries()).map(([a,b])=>({id:a,toolName:b.toolName}))}pendingRecoveryView(){return this.queueRecovery.map(({id:a,kind:b,text:c,images:d,queuedAt:e})=>({id:a,kind:b,text:c,hasImages:!!d?.length,queuedAt:e}))}persistQueue(){if(!this.sessionFile)return;let a=[...this.queueRecovery,...this.queueMirror];a.length?(0,k.pj)(this.sessionFile,a):(0,k.wx)(this.sessionFile)}hintQueueImages(a,b){this.pendingQueueHints[a].push(b?.length?b:[])}reconcileQueue(a,b){let c=(a,b)=>{if(!b)return this.queueMirror.filter(b=>b.kind===a);let c=new Set;return b.map(b=>{let d=this.queueMirror.find(d=>d.kind===a&&d.text===b&&!c.has(d));if(d)return c.add(d),d;let e=(0,k.Gc)(a,b,this.pendingQueueHints[a].shift());return c.add(e),e})};this.queueMirror=[...c("steer",a),...c("followUp",b)],this.persistQueue()}async requeueEntry(a){let b=(0,j.kc)(a.images);if(b)throw Error(b);this.hintQueueImages(a.kind,a.images),"steer"===a.kind?await this.inner.steer(a.text,a.images):await this.inner.followUp(a.text,a.images)}ensureMirrored(a){this.queueMirror.find(b=>b.kind===a.kind&&b.text===a.text)||(this.queueMirror.push({...a}),this.pendingQueueHints[a.kind].pop())}async replaceLiveQueue(a,b){for(let b of(this.inner.clearQueue(),this.pendingQueueHints={steer:[],followUp:[]},a))await this.requeueEntry(b);for(let a of b)await this.requeueEntry(a);let c={steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]};return this.reconcileQueue(c.steering,c.followUp),c}async withQueueMutation(a){let b,c=this.queueMutationTail;this.queueMutationTail=new Promise(a=>{b=a}),await c;try{return await a()}finally{b()}}async mutateLiveQueue(a,b){return this.withQueueMutation(async()=>{let c=this.queueMirror.filter(a=>"steer"===a.kind),d=this.queueMirror.filter(a=>"followUp"===a.kind),e=b("steer"===a?c:d),f=await this.replaceLiveQueue(c,d);return{value:e,queues:f}})}validateQueueEntries(a){for(let b of a){if("steer"!==b.kind&&"followUp"!==b.kind||"string"!=typeof b.text)continue;let a=(0,j.kc)(b.images);if(a)throw Error(a)}}runAgentContinue(){if(this.inner.isStreaming||this.inner.isBashRunning||this.promptRunning)return;let a=[...this.queueMirror];0!==a.length&&(this.queueMirror=[],this.persistQueue(),this.promptRunning=!0,this.promptPhase="waiting_model",this.bootstrapQueuedRun(a))}async bootstrapQueuedRun(a){for(let b of(this.inner.clearQueue(),this.pendingQueueHints={steer:[],followUp:[]},a))try{await this.inner.prompt(b.text,b.images?.length?{images:b.images}:void 0)}catch(a){this.promptRunning=!1,this.promptPhase=null,this.resetIdleTimer(),(0,o.mD)(),this.emit({type:"prompt_error",errorMessage:a instanceof Error?a.message:String(a)}),this.emit({type:"prompt_done"});return}this.promptRunning=!1,this.promptPhase=null,this.resetIdleTimer(),this.emit({type:"prompt_done"})}setForceEmptySystemPrompt(a){this.forceEmptySystemPrompt=a,this.applyForcedEmptySystemPrompt()}setExactSystemPrompt(a){this.exactSystemPrompt=a,this.applyExactSystemPrompt()}beginExtensionBinding(a={}){this.ensureExtensionsBound(a).catch(a=>{console.error("[pi-web] failed to dispatch session_start to extensions:",a instanceof Error?a.message:a)})}ensureExtensionsBound(a={}){return(a.forceEmptySystemPrompt&&(this.forceEmptySystemPrompt=!0),this.extensionsBound)?(this.applyExactSystemPrompt(),Promise.resolve()):(this.extensionBindingPromise||(this.extensionBindingError=null,this.extensionBindingPromise=(async()=>{if(!this._alive)return;let a=this.createExtensionUiContext();if("function"==typeof this.inner.bindExtensions){let b=this.inner.bindExtensions;await b.call(this.inner,{uiContext:a,mode:"rpc",commandContextActions:this.createExtensionCommandContextActions(),shutdownHandler:()=>this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",notifyType:"warning",message:"Extension requested shutdown, but shutdown is not supported in pi-web."}),onError:a=>this.emit({type:"extension_error",extensionPath:a.extensionPath,event:a.event,error:a.error})})}else this.inner.extensionRunner.setUIContext?.(a,"rpc");this.extensionsBound=!0,this.applyExactSystemPrompt(),console.log(`[pi-web] session_start dispatched to extensions for session ${this.inner.sessionId}`)})().catch(a=>{throw this.extensionBindingError=a,a})),this.extensionBindingPromise)}static{this.EXTENSION_BIND_TIMEOUT_MS=15e3}async waitForExtensionsBound(){let a=this.extensionBindingPromise;if(a)try{let b=new Promise((b,c)=>{let d=setTimeout(()=>c(Error("Extension binding timed out; continuing without waiting")),U.EXTENSION_BIND_TIMEOUT_MS);a.finally(()=>clearTimeout(d))});await Promise.race([a,b])}catch{}this.extensionBindingError&&console.warn("[pi-web] extension binding failed, continuing:",this.extensionBindingError)}shouldWaitForExtensions(a){return"prompt"===a||"steer"===a||"follow_up"===a||"get_commands"===a}applyForcedEmptySystemPrompt(){this.inner.agent.state&&(this.forceEmptySystemPrompt?this.inner.agent.state.systemPrompt="":null!==this.exactSystemPrompt&&(this.inner.agent.state.systemPrompt=this.exactSystemPrompt))}applyExactSystemPrompt(){!this.forceEmptySystemPrompt&&null!==this.exactSystemPrompt&&this.inner.agent.state&&(this.inner.agent.state.systemPrompt=this.exactSystemPrompt)}emit(a){for(let b of this.listeners)try{b(a)}catch(a){console.error(`[pi-web] session ${this.sessionId} event listener threw:`,a instanceof Error?a.message:a)}}setActiveToolSelection(a){this.inner.setActiveToolsByName(F(this.inner,a)),this.applyExactSystemPrompt()}async acquirePromptAdmission(){let a,b=this.promptAdmissionTail;return this.promptAdmissionTail=new Promise(b=>{a=b}),await b,a}notifyAgentRunCompleteIfIdle(){if(!(!this.agentRunNeedsCompletion||this.isRunning())&&(this.agentRunNeedsCompletion=!1,!this.wrapperSuppressNotifications))try{this.onAgentRunComplete?.(this.sessionId)}catch(a){console.error("[pi-web] completion listener failed:",a instanceof Error?a.message:a)}}resetIdleTimer(){this.idleTimer&&clearTimeout(this.idleTimer),this._alive&&0!==N&&(this.isRunning()||(this.forceShutdownOnIdle=!1),this.idleTimer=setTimeout(()=>{!this.forceShutdownOnIdle&&(this.isRunning()||(0,r.Vj)({sessionId:this.sessionId,sessionFile:this.sessionFile||void 0}))?this.resetIdleTimer():this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down idle session:",a instanceof Error?a.message:a)})},N))}touch(){this.lastActivityAt=Date.now(),this.cancelPendingDispose()}hasSubscribers(){return this.subscriberCount>0}get activityTimestamp(){return this.lastActivityAt}cancelPendingDispose(){this.disposeGraceTimer&&(clearTimeout(this.disposeGraceTimer),this.disposeGraceTimer=null)}scheduleDisposeIfIdle(){this.cancelPendingDispose(),!(this.subscriberCount>0||this.isRunning())&&this._alive&&(this.disposeGraceTimer=setTimeout(()=>{this.disposeGraceTimer=null,!(this.subscriberCount>0||this.isRunning())&&this._alive&&this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down unwatched session:",a instanceof Error?a.message:a)})},6e4))}persistSessionFileIfMissing(){let a=this.inner.sessionManager,b=a.getSessionFile();if(!b||(0,h.existsSync)(b))return;let c=a.getHeader();if(!c)return;let d=[c,...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";try{(0,h.writeFileSync)(b,d,{encoding:"utf8",flag:"wx"})}catch(c){if("EEXIST"===c.code||(0,h.existsSync)(b)){a.flushed=!0,(0,o.O8)(this.inner.sessionId,b);return}throw c}a.flushed=!0,(0,o.O8)(this.inner.sessionId,b)}onEvent(a){for(let b of(this.listeners.push(a),this.subscriberCount+=1,this.cancelPendingDispose(),this.pendingUiRequests.values()))a(b);return()=>{let b=this.listeners.indexOf(a);-1!==b&&this.listeners.splice(b,1),this.subscriberCount>0&&(this.subscriberCount-=1),this.scheduleDisposeIfIdle()}}onDestroy(a){this.onDestroyCallback=a}async withSessionReplacement(a,b){if(this.sessionReplacement)throw Error("Session is already being copied");this.sessionReplacement=a;try{return await b()}finally{this._alive&&(this.sessionReplacement=null)}}isSessionRunningForReplacement(){return this.inner.isBashRunning||this.inner.isStreaming||this.inner.isCompacting||this.pendingPromptCount>0}async shutdownAfterSessionReplacement(a){try{await this.shutdown()}catch(b){console.error(`[pi-web] ${a} succeeded, but source session shutdown failed:`,b instanceof Error?b.message:b)}}async send(a){if(!this._alive)throw Error("Session is shutting down");this.touch(),this.resetIdleTimer();let b=a.type;if("prompt"===b||"steer"===b||"follow_up"===b||"requeue_at"===b){let b=(0,j.kc)(a.images);if(b)throw Error(b)}let c=P.has(b);if(this.sessionReplacement&&!c)throw Error("Session is being copied to a new session");if(O.has(b)&&this.activeMutatingCommands>0)throw Error(`Cannot ${b} while another session command is running`);this.shouldWaitForExtensions(b)&&await this.waitForExtensionsBound();let d=!c;d&&(this.activeMutatingCommands+=1);try{if("get_state"!==b&&this.resetIdleTimer(),this.shouldWaitForExtensions(b)&&await this.waitForExtensionsBound(),this.sessionReplacement&&!c)throw Error("Session is being copied to a new session");if("prompt"===b||"steer"===b||"follow_up"===b){let b=(0,j.kc)(a.images);if(b)throw Error(b)}switch(b){case"prompt":{let b=await this.acquirePromptAdmission();try{let b,c,d;if(this.inner.isBashRunning)throw Error("Cannot send a prompt while a shell command is running");this.extensionUiAbortController.signal.aborted&&(this.extensionUiAbortController=new AbortController);let e=a.images,f=a.streamingBehavior;f&&this.inner.isStreaming&&this.hintQueueImages("followUp"===f?"followUp":"steer",e);let g=!1,h=!1,i=!1,j=new Promise((a,d)=>{b=()=>{g=!0,this.agentRunNeedsCompletion=!0,h||(h=!0,a())},c=a=>{h||(h=!0,d(a))}}),k=()=>{i||(i=!0,this.pendingPromptCount=Math.max(0,this.pendingPromptCount-1),this.resetIdleTimer(),this.notifyAgentRunCompleteIfIdle())};this.pendingPromptCount+=1,this.promptRunning=!0,this.promptPhase=String(a.message??"").trimStart().startsWith("/")?"running_command":"waiting_model",H();try{d=this.inner.prompt(a.message,{...e?.length?{images:e}:{},...f?{streamingBehavior:f}:{},source:"rpc",preflightResult:a=>{a&&(this.applyExactSystemPrompt(),b())}})}catch(a){throw k(),a}return d.then(()=>{b(),k(),this.promptRunning=!1,this.promptPhase=null,f||this.emit({type:"prompt_done"}),H()},a=>{c(a),k(),this.promptRunning=!1,this.promptPhase=null,(0,o.mD)(),g&&(this.emit({type:"prompt_error",errorMessage:a instanceof Error?a.message:String(a)}),f||this.emit({type:"prompt_done"})),H()}).catch(a=>{console.error("[pi-web] prompt completion handler failed:",a instanceof Error?a.message:a)}),await j,null}finally{b()}}case"abort":this.forceShutdownOnIdle=!0,this.extensionUiAbortController.abort(new DOMException("Extension UI cancelled by Stop","AbortError")),this.extensionUiAbortController=new AbortController;try{await this.inner.abort()}finally{this.resetIdleTimer(),this.isRunning()||(this.forceShutdownOnIdle=!1)}return null;case"get_state":{let a=this.inner.model,b=this.inner.getContextUsage();return{sessionId:this.inner.sessionId,sessionFile:this.inner.sessionFile??"",isStreaming:this.inner.isStreaming,isPromptRunning:this.promptRunning,isBashRunning:this.inner.isBashRunning,isCompacting:this.inner.isCompacting,phase:this.runtimeSnapshot().phase,model:a?{id:a.id,provider:a.provider}:void 0,messageCount:0,pendingMessageCount:this.inner.pendingMessageCount,queuedMessages:{steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]},pendingRecovery:this.pendingRecoveryView(),contextUsage:b?{percent:b.percent,contextWindow:b.contextWindow,tokens:b.tokens}:null,systemPrompt:this.inner.agent.state?.systemPrompt??"",thinkingLevel:this.inner.agent.state?.thinkingLevel??"off",extensionStatuses:this.getExtensionStatuses(),extensionWidgets:this.getExtensionWidgets(),goalState:this.goalEngine.getState()}}case"goal_start":{let b=String(a.goalText??"").trim();if(!b)throw Error("goal_start requires a non-empty goalText");let c=a.tokenBudget,d="number"==typeof c&&Number.isFinite(c)&&c>0?Math.floor(c):null,e=this.handleGoalStartCommand(b,d);return this.scheduleGoalKick(),{goalState:e}}case"goal_pause":try{this.inner.clearQueue(),this.queueMirror=[],this.persistQueue()}catch{}return{goalState:this.goalEngine.pause()};case"goal_resume":{let a=this.goalEngine.resume();return"running"===a.status&&(this.goalEngine.armContinuation(),this.scheduleGoalKick()),{goalState:a}}case"goal_stop":try{this.inner.clearQueue(),this.queueMirror=[],this.persistQueue()}catch{}return{goalState:this.handleGoalStopCommand()};case"goal_edit":{let b=String(a.goalText??"").trim();if(!b)throw Error("goal_edit requires a non-empty goalText");let c=this.goalEngine.edit(b);return"running"===c.status&&this.scheduleGoalKick(),{goalState:c}}case"get_goal_state":return{goalState:this.goalEngine.getState()};case"set_model":{let{provider:b,modelId:c}=a,d=this.inner.modelRuntime.getModel(b,c);if(!d)try{await this.inner.modelRuntime.refresh({allowNetwork:!1}),d=this.inner.modelRuntime.getModel(b,c)}catch{d=void 0}if(!d)throw Error(`Model not found: ${b}/${c}`);return await this.inner.setModel(d),(0,l.k)(),(0,o.mD)(),{id:d.id,provider:d.provider}}case"fork":{let b=a.entryId,c=this.inner.sessionManager,d=this.inner.sessionFile;if(!c.isPersisted())return{cancelled:!0};if(!d)throw Error("Persisted session is missing a session file");if(!c.getEntry(b))throw Error("Invalid entry ID for forking");let f=c.getSessionDir(),g=e.SessionManager.open(d,f).createBranchedSession(b);if(!g)throw Error("Failed to create forked session");let h=e.SessionManager.open(g,f).getSessionId();return(0,o.O8)(h,g),(0,o.mD)(),{cancelled:!1,newSessionId:h}}case"clone":{if(this.isSessionRunningForReplacement())throw Error("Cannot clone while the session is running");let b=this.inner.sessionManager,c=this.inner.sessionFile,d="string"==typeof a.leafId?a.leafId:b.getLeafId(),f=d&&b.getBranch(d).some(a=>"message"===a.type&&"assistant"===a.message.role);if(!b.isPersisted()||!d||!f||!c||!(0,h.existsSync)(c))return{cancelled:!0};return this.withSessionReplacement("clone",async()=>{let a=b.getSessionDir(),f=e.SessionManager.open(c,a).createBranchedSession(d);if(!f||!(0,h.existsSync)(f))throw Error("Failed to clone current session branch");let g=e.SessionManager.open(f,a).getSessionId();return(0,o.O8)(g,f),(0,o.mD)(),await this.shutdownAfterSessionReplacement("clone"),{cancelled:!1,newSessionId:g}})}case"navigate_tree":return{cancelled:(await this.inner.navigateTree(a.targetId,{})).cancelled};case"set_thinking_level":{let b=a.level;return this.inner.setThinkingLevel(b),"xhigh"===b&&this.inner.model?.compat?.thinkingFormat==="deepseek"&&this.inner.agent?.state&&(this.inner.agent.state.thinkingLevel="xhigh"),(0,o.mD)(),null}case"compact":try{return await this.inner.compact(a.customInstructions)}finally{(0,o.mD)()}case"set_session_name":{let b=a.name?.trim();if(!b)throw Error("Session name cannot be empty");return this.inner.setSessionName(b),(0,o.mD)(),null}case"get_session_stats":return{...this.inner.getSessionStats(),sessionName:this.inner.sessionManager.getSessionName()};case"get_last_assistant_text":return{text:this.inner.getLastAssistantText()??""};case"clear_queue":return this.withQueueMutation(async()=>(this.queueMirror=[],this.pendingQueueHints={steer:[],followUp:[]},this.persistQueue(),this.inner.clearQueue()));case"move_queue":{let b=a.kind,c=Number(a.fromIndex),d=Number(a.toIndex);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c)||!Number.isInteger(d))throw Error("move_queue requires a queue kind and integer indexes");let{queues:e}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length||d<0||d>=a.length)throw Error("move_queue index out of range");let[b]=a.splice(c,1);a.splice(d,0,b)});return e}case"recall_queue_item":{let b=a.kind,c=Number(a.index);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c))throw Error("recall_queue_item requires a queue kind and integer index");let{value:d,queues:e}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length)throw Error("recall_queue_item index out of range");let[b]=a.splice(c,1);return b});return{entry:{text:d.text,images:d.images??[]},...e}}case"requeue_at":{let b=a.kind,c=Number(a.index),d=a.text;if("steer"!==b&&"followUp"!==b||!Number.isInteger(c)||!d?.trim())throw Error("requeue_at requires a queue kind, integer index, and text");let e=a.images,{queues:f}=await this.mutateLiveQueue(b,a=>{if(c<0||c>a.length)throw Error("requeue_at index out of range");a.splice(c,0,(0,k.Gc)(b,d,e))});return f}case"remove_queue_item":{let b=a.kind,c=Number(a.index);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c))throw Error("remove_queue_item requires a queue kind and integer index");let{queues:d}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length)throw Error("remove_queue_item index out of range");a.splice(c,1)});return d}case"resolve_recovery":return this.withQueueMutation(async()=>{let b=new Set(a.keep??[]),c=new Set(a.discard??[]),d=!0===a.continueRun,e=0;for(let a of this.queueRecovery)b.has(a.id)&&(await this.requeueEntry(a),this.ensureMirrored(a),e+=1);return this.queueRecovery=this.queueRecovery.filter(a=>!b.has(a.id)&&!c.has(a.id)),this.persistQueue(),d&&e>0&&this.runAgentContinue(),{remaining:this.pendingRecoveryView(),kept:e}});case"export_queue":return{live:this.queueMirror.map(a=>({...a})),recovery:this.queueRecovery.map(a=>({...a}))};case"import_queue":return this.withQueueMutation(async()=>{let b=a.entries;if(!Array.isArray(b))throw Error("import_queue requires entries[]");this.validateQueueEntries(b);let c=0;for(let a of b){if("steer"!==a.kind&&"followUp"!==a.kind||"string"!=typeof a.text)continue;let b=(0,k.Gc)(a.kind,a.text,a.images);await this.requeueEntry(b),this.ensureMirrored(b),c+=1}return this.persistQueue(),{imported:c,steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]}});case"stage_recovery":return this.withQueueMutation(async()=>{let b=a.entries;if(!Array.isArray(b))throw Error("stage_recovery requires entries[]");this.validateQueueEntries(b);let c=0;for(let a of b)("steer"===a.kind||"followUp"===a.kind)&&"string"==typeof a.text&&(this.queueRecovery.push((0,k.Gc)(a.kind,a.text,a.images)),c+=1);return this.persistQueue(),{staged:c,pendingRecovery:this.pendingRecoveryView()}});case"steer":{let b=a.images;this.hintQueueImages("steer",b),this.promptPhase="waiting_model",H();try{await this.inner.steer(a.message,b?.length?b:void 0)}finally{this.promptPhase=null,H()}return null}case"follow_up":{let b=a.images;this.hintQueueImages("followUp",b),this.promptPhase="waiting_model",H();try{await this.inner.followUp(a.message,b?.length?b:void 0)}finally{this.promptPhase=null,H()}return null}case"get_tools":{let a=this.inner.getAllTools(),b=new Set(this.inner.getActiveToolNames());return a.map(a=>({...a,active:b.has(a.name)}))}case"get_commands":{let a=[];for(let b of this.inner.extensionRunner.getRegisteredCommands())a.push({name:b.invocationName,description:b.description,source:"extension",sourceInfo:b.sourceInfo});for(let b of this.inner.promptTemplates)a.push({name:b.name,description:b.description,source:"prompt",sourceInfo:b.sourceInfo});for(let b of this.inner.resourceLoader.getSkills().skills)a.push({name:`skill:${b.name}`,description:b.description,source:"skill",sourceInfo:b.sourceInfo});return{commands:a}}case"set_tools":{let b=a.toolNames;return this.setActiveToolSelection(b),null}case"reload":{let a=this.inner.getActiveToolNames();return await this.waitForExtensionsBound(),this.extensionStatuses.clear(),this.extensionWidgets.clear(),this.syncProjectTrust(),await this.inner.reload(),this.inner.setActiveToolsByName(F(this.inner,a)),"function"!=typeof this.inner.bindExtensions&&this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc"),this.applyForcedEmptySystemPrompt(),{success:!0}}case"abort_compaction":return this.inner.abortCompaction(),null;case"resolve_approval":return{resolved:this.resolveApproval(a.id,!!a.approve,a.reason)};case"set_approval_mode":{let b=a.mode;if("ask"!==b&&"auto"!==b&&"yolo"!==b)throw Error(`Invalid approval mode: ${String(b)}`);return this.setApprovalMode(b),null}case"set_approval_policy":{let b=a.policy;return this.setApprovalPolicy((0,y.ni)(b)),null}case"get_approval_state":return{mode:this.approvalMode,pending:this.getPendingApprovals()};case"extension_ui_response":return this.resolveExtensionUiResponse(a),null;case"extension_ui_input":return this.handleExtensionUiInput(a.id,a.data),null;case"bash":{if(this.promptRunning||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)throw Error("Cannot run a shell command while the session is busy");let b=this.inner.settingsManager?.getShellPath?.(),c=(0,v.J1)("string"==typeof b&&b?{shellPath:b}:{}),d=this.inner.executeBash(a.command,void 0,{excludeFromContext:a.excludeFromContext,operations:c});try{let a=await d;return this.persistSessionFileIfMissing(),a}finally{this.resetIdleTimer(),(0,o.mD)()}}case"abort_bash":return this.forceShutdownOnIdle=!0,this.inner.abortBash(),H(),null;default:throw Error(`Unsupported command: ${b}`)}}finally{d&&(this.activeMutatingCommands=Math.max(0,this.activeMutatingCommands-1))}}destroy(){if(!this._alive)return;for(let a of(this._alive=!1,this.idleTimer&&clearTimeout(this.idleTimer),this.cancelPendingDispose(),this.inner.isBashRunning&&this.inner.abortBash(),this.unsubscribe?.(),this.sessionFile&&this.goalEngine.hasActiveGoal()&&(0,C.eG)(this.sessionFile,this.goalEngine.getState()),this.pendingUiResponses.values()))a.cancel();for(let a of Array.from(this.activeCustomUis.keys()))this.closeCustomUi(a,void 0);this.pendingUiResponses.clear(),this.pendingUiRequests.clear(),this.rejectAllApprovals("Session closed while approval was pending");let a=()=>{try{this.inner.dispose()}finally{try{this.onDestroyCallback?.()}finally{H()}}};if(this.sessionShutdownEmitted)return void a();this.sessionShutdownEmitted=!0;let b=this.inner.extensionRunner?.emit;"function"!=typeof b?a():Promise.resolve().then(()=>b.call(this.inner.extensionRunner,{type:"session_shutdown",reason:"quit"})).catch(a=>{console.error("[pi-web] session_shutdown before dispose failed:",a instanceof Error?a.message:a)}).finally(a)}async shutdown(){return this.shutdownPromise?this.shutdownPromise:this._alive?(this.shutdownPromise=(async()=>{try{try{await this.waitForExtensionsBound()}catch(a){console.error("[pi-web] extension binding failed before session shutdown:",a instanceof Error?a.message:a)}this.sessionShutdownEmitted||(this.sessionShutdownEmitted=!0,await this.inner.extensionRunner.emit?.({type:"session_shutdown",reason:"quit"}))}finally{this.destroy()}})(),this.shutdownPromise):void 0}resolveExtensionUiResponse(a){let b=this.pendingUiResponses.get(a.id);b&&b.resolve(a)}getExtensionStatuses(){return Array.from(this.extensionStatuses,([a,b])=>({key:a,text:b}))}getExtensionWidgets(){return Array.from(this.extensionWidgets.values())}getCustomUiWidth(a){if(!a||"object"!=typeof a)return A.p1;let b=a.overlayOptions,c="function"==typeof b?b():b;if(!c||"object"!=typeof c)return A.p1;let d=c.width;return"number"==typeof d&&Number.isFinite(d)?Math.max(40,Math.min(140,Math.round(d))):A.p1}emitCustomUiRender(a,b){let c;try{c=b.component.render(b.width)}catch(a){c=[`Extension custom UI render failed: ${a instanceof Error?a.message:String(a)}`]}let d={type:"extension_ui_request",id:a,method:"custom",lines:c};this.pendingUiRequests.set(a,d),this.emit(d)}closeCustomUi(a,b){let c=this.activeCustomUis.get(a);if(c&&!c.settled){c.settled=!0,this.activeCustomUis.delete(a),this.pendingUiRequests.delete(a);try{c.component.dispose?.()}catch{}this.emit({type:"extension_ui_request",id:a,method:"custom",lines:[],closed:!0}),c.resolve(b)}}handleExtensionUiInput(a,b){let c=this.activeCustomUis.get(a);if(c&&"string"==typeof b)try{c.component.handleInput?.(b),this.activeCustomUis.has(a)&&this.emitCustomUiRender(a,c)}catch(b){this.closeCustomUi(a,void 0),this.emit({type:"extension_error",extensionPath:`custom-ui:${a}`,event:"custom_ui_input",error:b instanceof Error?b.message:String(b)})}}requestExtensionCustomUi(a,b){if("function"!=typeof a)return Promise.resolve(void 0);let c=this.extensionUiAbortController.signal;if(c.aborted)return Promise.reject(c.reason);let d=(0,g.randomUUID)(),e=this.getCustomUiWidth(b);return new Promise((b,f)=>{let g=!1,h=(0,A.TQ)(()=>{let a=this.activeCustomUis.get(d);a&&this.emitCustomUiRender(d,a)},e),i=a=>{g||(g=!0,c.removeEventListener("abort",k),c.aborted?f(c.reason):b(a))},j=a=>{this.activeCustomUis.has(d)?this.closeCustomUi(d,a):i(a)},k=()=>j(void 0);c.addEventListener("abort",k,{once:!0}),Promise.resolve().then(()=>g?void 0:a(h,S,T,j)).then(a=>{if(g){try{a?.dispose?.()}catch{}return}if(!a||"object"!=typeof a||"function"!=typeof a.render)return void i(void 0);let b={component:a,width:e,resolve:a=>i(a),settled:!1};this.activeCustomUis.set(d,b),this.emitCustomUiRender(d,b)}).catch(a=>{g||(this.emit({type:"extension_error",extensionPath:`custom-ui:${d}`,event:"custom_ui",error:a instanceof Error?a.message:String(a)}),i(void 0))})})}requestExtensionUi(a,b,c,d,e){if(e?.aborted)return Promise.resolve(b);let f=this.extensionUiAbortController.signal;if(f.aborted)return Promise.reject(f.reason);let h=e?AbortSignal.any([e,f]):f,i=(0,g.randomUUID)(),j={type:"extension_ui_request",id:i,...a,...d?{timeout:d,expiresAt:Date.now()+d}:{}};return new Promise((a,e)=>{let g,k=!1,l=()=>{g&&clearTimeout(g),h.removeEventListener("abort",n),this.pendingUiRequests.delete(i),this.pendingUiResponses.delete(i),this.emit({type:"extension_ui_closed",id:i})},m=b=>{k||(k=!0,l(),f.aborted?e(f.reason):a(b))},n=()=>m(b);d&&(g=setTimeout(()=>m(b),d)),h.addEventListener("abort",n,{once:!0}),this.pendingUiRequests.set(i,j),this.pendingUiResponses.set(i,{resolve:a=>m(c(a)),cancel:()=>m(b)}),this.emit(j)})}createExtensionUiContext(){return{select:(a,b,c)=>this.requestExtensionUi({method:"select",title:a,options:b,...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),confirm:(a,b,c)=>this.requestExtensionUi({method:"confirm",title:a,message:b,...c?.timeout?{timeout:c.timeout}:{}},!1,a=>"confirmed"in a&&a.confirmed,c?.timeout,c?.signal),input:(a,b,c)=>this.requestExtensionUi({method:"input",title:a,...void 0!==b?{placeholder:b}:{},...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),editor:(a,b,c)=>this.requestExtensionUi({method:"editor",title:a,...void 0!==b?{prefill:b}:{},...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),notify:(a,b)=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",message:a,notifyType:b})},onTerminalInput:()=>()=>{},setStatus:(a,b)=>{void 0===b?this.extensionStatuses.delete(a):this.extensionStatuses.set(a,b),this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setStatus",statusKey:a,statusText:b})},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:(a,b,c)=>{(void 0===b||Array.isArray(b))&&(void 0===b?this.extensionWidgets.delete(a):this.extensionWidgets.set(a,{key:a,lines:b,placement:c?.placement??"aboveEditor"}),this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:b,widgetPlacement:c?.placement}))},setFooter:()=>{},setHeader:()=>{},setTitle:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setTitle",title:a})},custom:(a,b)=>this.requestExtensionCustomUi(a,b),pasteToEditor:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"set_editor_text",text:a})},setEditorText:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"set_editor_text",text:a})},getEditorText:()=>"",addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>void 0,get theme(){return S},getAllThemes:()=>[],getTheme:()=>void 0,setTheme:()=>({success:!1,error:"Theme switching is not supported in pi-web extension UI yet"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}}}syncProjectTrust(){this.inner.settingsManager.setProjectTrusted((0,n.Y1)(this.cwd,(0,e.getAgentDir)()).trusted)}createExtensionCommandContextActions(){return{waitForIdle:async()=>{let a=this.inner.agent;await a.waitForIdle?.()},newSession:async()=>({cancelled:!0}),fork:async()=>({cancelled:!0}),navigateTree:async(a,b)=>({cancelled:(await this.inner.navigateTree(a,{summarize:b?.summarize})).cancelled}),switchSession:async()=>({cancelled:!0}),reload:async()=>{this.extensionStatuses.clear(),this.extensionWidgets.clear(),this.syncProjectTrust(),await this.inner.reload({beforeSessionStart:()=>{this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc")}}),this.applyExactSystemPrompt()}}}}function G(){if(!globalThis.__piSessions){globalThis.__piSessions=new Map;let a=()=>Promise.allSettled(Array.from(globalThis.__piSessions?.values()??[],a=>a.shutdown()));process.once("exit",()=>globalThis.__piSessions?.forEach(a=>a.destroy())),process.once("SIGINT",()=>{a().finally(()=>process.exit(130))}),process.once("SIGTERM",()=>{a().finally(()=>process.exit(143))})}return globalThis.__piSessions}let V="";function H(){let a=globalThis.__piRunningListeners;if(!a||0===a.size){V="";return}let b=function(){let a=[];for(let[b,c]of G()){if(!c.isAlive())continue;let d=c.runtimeSnapshot();d.running&&a.push({...d,id:d.id||b})}return a}(),c=JSON.stringify(b);if(c!==V)for(let d of(V=c,a))try{d(b)}catch{}}let W=(0,s.s)({getSession:a=>G().get(a),registerSession:(a,b)=>{let c,d,e;c=new U(a,a.sessionManager.getCwd()),b?.chatOnly?c.setForceEmptySystemPrompt(!0):b?.exactSystemPrompt&&c.setExactSystemPrompt(b.exactSystemPrompt),c.setChatOnly(!!b?.chatOnly),c.setSuppressCompletionNotifications(!0),c.start(),d=a.sessionId,e=G(),c.onDestroy(()=>e.delete(d)),e.set(d,c)},reopenSession:async(a,b)=>(await L(a,b,void 0)).session,resolveSessionPath:o.os,invalidateSessionList:o.mD,notifyRunningChange:H,isBuiltInSubagentsEnabled:t.N});!function(){try{let a=(0,t.M6)();if((0,h.existsSync)(a))return;(0,h.mkdirSync)(a.slice(0,a.lastIndexOf("/")),{recursive:!0}),(0,h.writeFileSync)(a,JSON.stringify({builtInEnabled:!0},null,2)+"\n")}catch(a){console.warn("[pi-web] failed to seed agents/settings.json:",a instanceof Error?a.message:a)}}();let X=new Map;function I(a){let b=globalThis.__piSessionBusListeners;if(b&&0!==b.size)for(let c of b)try{c(a)}catch{}}function J(a,b,c){let d=globalThis.__piSessionBusListeners;if(!d||0===d.size)return;if("message_update"!==a)return void I({type:a,sessionId:b,payload:c});let e=X.get(b),f={type:a,sessionId:b,payload:c};e?(clearTimeout(e.timer),e.event=f):X.set(b,{event:f,timer:setTimeout(()=>{let a=X.get(b);a&&(X.delete(b),I(a.event))},80)})}function K(a,b){let c=Date.now(),{provider:d,modelId:e,sessionId:f}=b,g=a.result.bind(a);a.result=async()=>{let a,b,h,i,j,k=await g();return a=Date.now()-c,b="error"===k.stopReason||"aborted"===k.stopReason,h=k.errorMessage?.trim(),j=(i=h?.match(/\bHTTP\s+(\d{3})\b|\bstatus(?:\s+code)?\s*[:=]?\s*(\d{3})\b/))?Number(i[1]??i[2]):void 0,(0,B.wF)({level:b?"error":"info",source:"model-call",provider:d,model:e,sessionId:f,...void 0!==j?{statusCode:j}:{},message:b?`模型调用失败 ${d}/${e}${h?`:${h}`:""}`:`模型调用成功 ${d}/${e}`,details:b?void 0:`耗时 ${a}ms`}),k};let h=a[Symbol.asyncIterator].bind(a);return a[Symbol.asyncIterator]=()=>{let a=h();return{next:()=>a.next().catch(a=>{throw(0,B.wF)({level:"error",source:"model-call",provider:d,model:e,sessionId:f,message:`模型调用传输错误 ${d}/${e}:${a instanceof Error?a.message:String(a)}`}),a})}},a}async function L(a,b,d,f={}){let g,j,k,r,{toolNames:s,initialModel:u,thinkingLevel:v,allowInitialModelFallback:x}=f,y=G(),z=(globalThis.__piStartLocks||(globalThis.__piStartLocks=new Map),globalThis.__piStartLocks),A=y.get(a);if(A?.isAlive()&&!A.isShuttingDown())return{session:A,realSessionId:a,created:!1};if(A){let a=A.whenShutdown();a&&await Promise.race([a,new Promise(a=>setTimeout(a,1e4))])}let B=z.get(a);if(B)return B;if(b)g=e.SessionManager.open(b,void 0);else{if(!d)throw Error("cwd is required for a new session");g=e.SessionManager.create(d,void 0)}let C=g.getCwd(),E=b?(0,q.ph)(g.getEntries()):null,H=(globalThis.__piStartingSessionCwds||(globalThis.__piStartingSessionCwds=new Map),k=globalThis.__piStartingSessionCwds,r=function(a){let b=(0,i.resolve)(a);try{return(0,h.realpathSync)(b)}catch{return b}}(C),k.set(r,(k.get(r)??0)+1),()=>{let a=(k.get(r)??1)-1;a>0?k.set(r,a):k.delete(r)}),I=new AbortController,J=setTimeout(()=>I.abort(),25e3),M=!1,N=!1,O=()=>{N||(N=!0,H())},P=(async()=>{let b,d=E?.tools??s??[],f=0===d.length;f||(0,e.initTheme)();let h=(0,e.getAgentDir)(),i=E?.tools;E||void 0===s||(i=0===d.length?[]:void 0);let j=E?void 0:(0,n.Fk)(C,h),k=await (0,e.createAgentSessionServices)({cwd:C,agentDir:h,modelRuntimeSignal:I.signal,resourceLoaderOptions:E?{noExtensions:!0,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,appendSystemPrompt:E.appendSystemPrompt}:{extensionFactories:[(0,p.Vj)(W.extensionRuntime,()=>(0,q.IR)(C),t.N)],extensionsOverride:a=>(0,p.U6)(a)},...j?{resourceLoaderReloadOptions:j}:{}}),{createAsyncBashTools:r}=await Promise.resolve().then(c.bind(c,12394)),z=new D.B,A=r(z),B=await (0,m.py)(k.modelRuntime,k.settingsManager.getEnabledModels(),{signal:I.signal}),H=u&&(!x||B.visible.some(a=>a.provider===u.provider&&a.id===u.modelId))?u:void 0,J=k.settingsManager.getDefaultProvider(),L=k.settingsManager.getDefaultModel(),N=g.getBranch().some(a=>"message"===a.type)?{scopedModels:[...B.scopedModels]}:(0,m.IR)(B,{...H?{requestedModel:H}:{},...J&&L?{defaultModel:{provider:J,modelId:L}}:{},...v?{thinkingLevel:v}:{}}),O=!1,P=(0,e.createAgentSessionFromServices)({services:k,sessionManager:g,...N.model?{model:N.model}:{},...N.thinkingLevel?{thinkingLevel:N.thinkingLevel}:{},...N.scopedModels.length>0?{scopedModels:N.scopedModels}:{},...void 0!==i?{tools:i}:{},customTools:A}),{session:Q}=await Promise.race([P,new Promise((a,c)=>{b=setTimeout(()=>{O=!0,I.abort(),c(Error("Session startup timed out while binding extensions/resources (40s)"))},4e4)})]);clearTimeout(b),P.then(({session:a})=>{if(O)try{a.dispose()}catch{}},()=>{});let R=z.cleanup.bind(z);try{let b=Q.agent,c=b.streamFunction;if(b.streamFunction=(b,d,e)=>{let f=c(b,d,e);return f instanceof Promise?f.then(c=>K(c,{provider:b.provider,modelId:b.id,sessionId:a})):K(f,{provider:b.provider,modelId:b.id,sessionId:a})},(await (0,w.o)(k.settingsManager,{...u?{model:u}:{},...v?{thinkingLevel:v}:{}},{...Q.model?{model:{provider:Q.model.provider,modelId:Q.model.id}}:{},thinkingLevel:Q.agent.state?.thinkingLevel??"off",supportsThinking:Q.supportsThinking()})).modelDefaultChanged&&(0,l.k)(),!E&&s&&s.length>0&&Q.setActiveToolsByName(F(Q,s)),M){try{Q.dispose()}catch{}try{R()}catch{}throw Error("Session startup abandoned after hard timeout")}let d=new U(Q,C);d.setChatOnly(f),d.setSuppressCompletionNotifications(void 0!==E),s?.length===0||E?.tools.length===0?d.setForceEmptySystemPrompt(!0):E&&E.appendSystemPrompt.length>0&&d.setExactSystemPrompt(E.appendSystemPrompt[0]),d.start(),d.loadQueueRecovery();let e=Q.sessionId,g=Q.sessionFile;return g&&(0,o.O8)(e,g),d.persistSessionFileIfMissing(),d.onDestroy(()=>{R(),y.get(e)===d&&y.delete(e)}),y.set(e,d),d.beginExtensionBinding({forceEmptySystemPrompt:s?.length===0}),!function(){let a=G();if(a.size<=12)return;let b=Array.from(a.entries()).filter(([,a])=>a.isAlive()&&!a.isRunning()&&!a.hasSubscribers()).sort((a,b)=>a[1].activityTimestamp-b[1].activityTimestamp),c=a.size-12;for(let[d,e]of b){if(c<=0)break;a.has(d)&&(console.log(`[pi-web] evicting idle unwatched session ${d} (registry cap 12)`),e.shutdown().catch(a=>{console.error(`[pi-web] failed to evict session ${d}:`,a instanceof Error?a.message:a)}),c-=1)}}(),{session:d,realSessionId:e,created:!0}}catch(a){try{Q.dispose()}catch{}try{R()}catch{}throw a}})().finally(()=>{clearTimeout(J),clearTimeout(j),z.delete(a),O()}),Q=Promise.race([P,new Promise((b,c)=>{j=setTimeout(()=>{M=!0,I.abort(),z.delete(a),O(),c(Error("Session startup timed out after 60s (extension/resource binding may be hung); the start lock was released — retry the request to start over."))},6e4)})]);return P.then(()=>{},()=>{}),z.set(a,Q),Q}d()}catch(a){d(a)}})},12394:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{B:()=>p,createAsyncBashTools:()=>n});var e=c(31421),f=c(81186),g=c(75430),h=c(45399),i=a([f,g]);[f,g]=i.then?(await i)():i;class o{append(a){for(this.totalBytes+=a.length,this.tail.push(a),this.tailBytes+=a.length;this.tailBytes>258048&&this.tail.length>1;){let a=this.tail.shift();this.tailBytes-=a.length}if(this.headBytes<4096){let b=4096-this.headBytes;a.length<=b?(this.head.push(a),this.headBytes+=a.length):(this.head.push(a.subarray(0,b)),this.headBytes=4096)}}get hasOmission(){return this.totalBytes>this.headBytes+this.tailBytes}get omittedBytes(){return Math.max(0,this.totalBytes-this.headBytes-this.tailBytes)}toSnapshot(){if(!this.hasOmission)return Buffer.concat(this.tail).toString("utf-8");let a=[...this.head];return a.push(Buffer.from(`
|
|
4
|
+
${(g=i.filter(a=>a.enabled),0===g.length?"No subagent profiles are currently enabled.":g.map(a=>{let b=[`Tools: ${a.tools.length>0?a.tools.join(", "):"none"}`];return a.model&&b.push(`Model: ${a.model}`),`- ${a.name}: ${a.description} (${b.join("; ")})`}).join("\n"))}`,promptSnippet:"Delegate a focused task to an inspectable subagent session",promptGuidelines:["Use Agent for a focused task that benefits from an isolated context.","Use multiple background Agent calls in the same response for independent parallel work.","Do not duplicate work already delegated to a running subagent."],executionMode:"parallel",parameters:e.Type.Object({subagent_type:e.Type.Optional(e.Type.String({description:`Configured agent profile. Available types: ${m}. Default: general-purpose.`})),prompt:e.Type.String({description:"The complete task for the subagent."}),input_files:e.Type.Optional(e.Type.Array(e.Type.String(),{description:"UTF-8 text files under the session cwd to include with the task.",maxItems:h.Wv})),description:e.Type.String({description:"Short activity label shown in the UI."}),run_in_background:e.Type.Optional(e.Type.Boolean({description:"Return immediately and notify this session when complete."})),model:e.Type.Optional(e.Type.String({description:"Optional provider/modelId override."})),thinking:e.Type.Optional(e.Type.String({description:"Optional thinking level override."})),max_turns:e.Type.Optional(e.Type.Number({description:"Optional positive agent turn limit."})),inherit_context:e.Type.Optional(e.Type.Boolean({description:"Include the parent session's active conversation context."}))}),async execute(b,c,d,e,f){try{let g=await a.start({parentContext:f,parentToolCallId:b,profile:c.subagent_type??"general-purpose",task:c.prompt,...c.input_files?{inputFiles:c.input_files}:{},description:c.description,...void 0!==c.run_in_background?{runInBackground:c.run_in_background}:{},...c.model?{model:c.model}:{},...c.thinking?{thinking:c.thinking}:{},...c.max_turns?{maxTurns:c.max_turns}:{},...void 0!==c.inherit_context?{inheritContext:c.inherit_context}:{},signal:d,onUpdate:a=>e?.({content:[{type:"text",text:`${a.profile}: ${a.description} (${a.status})`}],details:j(a)})});if(g.run.runInBackground)return g.completion.then(b=>a.notifyParent(b)).catch(a=>{console.error("[pi-web] failed to deliver subagent completion:",a instanceof Error?a.message:a)}),{content:[{type:"text",text:`Subagent started in background. Session ID: ${g.run.sessionId}. You will be notified when it completes.`}],details:j(g.run)};let h=await g.completion;return{content:[{type:"text",text:k(h)}],details:j(h),..."failed"===h.status?{isError:!0}:{}}}catch(a){return{content:[{type:"text",text:a instanceof Error?a.message:String(a)}],details:void 0,isError:!0}}}})),d.registerTool((0,f.defineTool)({name:"get_subagent_result",label:"Get agent result",description:"Check an inspectable subagent session and retrieve its latest result.",parameters:e.Type.Object({agent_id:e.Type.String({description:"Subagent session ID."}),wait:e.Type.Optional(e.Type.Boolean({description:"Wait until the subagent finishes."}))}),async execute(b,c,d){let e=await a.get(c.agent_id);if(!e)return{content:[{type:"text",text:`Subagent not found: ${c.agent_id}`}],details:void 0,isError:!0};for(;c.wait&&("starting"===e.status||"running"===e.status);)if(await new Promise((a,b)=>{let c=()=>{clearTimeout(e),b(Error("Result wait aborted"))},e=setTimeout(()=>{d?.removeEventListener("abort",c),a()},500);d?.aborted?c():d?.addEventListener("abort",c,{once:!0})}),!(e=await a.get(c.agent_id)))return{content:[{type:"text",text:`Subagent not found: ${c.agent_id}`}],details:void 0,isError:!0};return{content:[{type:"text",text:k(e)}],details:j(e),..."failed"===e.status?{isError:!0}:{}}}})),d.registerTool((0,f.defineTool)({name:"steer_subagent",label:"Steer agent",description:"Send a steering message to a currently running subagent session.",parameters:e.Type.Object({agent_id:e.Type.String({description:"Subagent session ID."}),message:e.Type.String({description:"Instruction to inject after the current tool execution."})}),async execute(b,c){try{return await a.steer(c.agent_id,c.message),{content:[{type:"text",text:`Steering message sent to ${c.agent_id}.`}],details:void 0}}catch(a){return{content:[{type:"text",text:a instanceof Error?a.message:String(a)}],details:void 0,isError:!0}}}}))}}}function m(a){let b=a.extensions.find(a=>a.path===o);if(!b?.tools.has("Agent"))return a;let c=new Set(a.extensions.filter(a=>a.path!==o).filter(a=>{let b=(a.sourceInfo?.source??"").replace(/^npm:/,"").split("@")[0],c=a.path.replaceAll("\\","/").split("/");return b===q||c.some(a=>a===q)}).filter(a=>[...p].some(b=>a.tools.has(b))).map(a=>a.path));return 0===c.size?a:{...a,extensions:a.extensions.filter(a=>!c.has(a.path)),errors:a.errors.filter(a=>!c.has(a.path)&&(a.path!==o||![...c].some(b=>[...p].some(c=>a.error===`Tool "${c}" conflicts with ${b}`))))}}d()}catch(a){d(a)}})},12144:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{OF:()=>L});var e=c(75430),f=c(29862),g=c(55511),h=c(29021),i=c(33873),j=c(18437),k=c(17114),l=c(65869),m=c(96515),n=c(15253),o=c(69453),p=c(8084),q=c(41035);c(54035);var r=c(12559),s=c(84851),t=c(70274),u=c(5564),v=c(81186),w=c(61577),x=c(44290),y=c(30116),z=c(97563),A=c(57856),B=c(29040),C=c(91099),D=c(12394),E=a([e,f,m,n,o,p,q,s,t,u,v,x,B,D]);[e,f,m,n,o,p,q,s,t,u,v,x,B,D]=E.then?(await E)():E;let M=new Set(["agent_start","message_start","message_update","message_end","agent_end","entry_appended","session_info_changed","queue_update","prompt_done","agent_settled","auto_compaction_end","compaction_end"]),N=function(a=process.env.PI_WEB_IDLE_TIMEOUT_MS){let b=(a??"").trim();if(""===b)return 6e5;let c=Number(b);return!Number.isFinite(c)||c<0||!Number.isInteger(c)||c>0x7fffffff?(console.warn(`[pi-web] invalid PI_WEB_IDLE_TIMEOUT_MS "${a}", falling back to 600000ms`),6e5):c}(),O=new Set(["fork","clone"]),P=new Set(["get_state","abort","steer","follow_up_draft"]),Q=["read","bash","powershell","edit","write","grep","find","ls"];class R extends e.Theme{constructor(){super({muted:"",text:"",thinkingXhigh:"",searchMatchText:""},{selectedBg:""},"truecolor")}fg(...[,a]){return a}bg(...[,a]){return a}bold(a){return a}italic(a){return a}underline(a){return a}inverse(a){return a}strikethrough(a){return a}getFgAnsi(){return""}getBgAnsi(){return""}getThinkingBorderColor(){return a=>a}getBashModeBorderColor(){return a=>a}}let S=new R,T=new f.KeybindingsManager(f.TUI_KEYBINDINGS);function F(a,b){if(0===b.length)return[];let c=new Set(Q),d=(0,u.wQ)(b,a.settingsManager.getDefaultTools()),e=a.getAllTools().map(a=>a.name).filter(a=>!c.has(a));return[...new Set([...d,...e])]}class U{constructor(a,b=""){this.inner=a,this.listeners=[],this.pendingUiResponses=new Map,this.pendingUiRequests=new Map,this.activeCustomUis=new Map,this.extensionUiAbortController=new AbortController,this.extensionStatuses=new Map,this.extensionWidgets=new Map,this.promptRunning=!1,this.promptPhase=null,this.extensionsBound=!1,this.extensionBindingPromise=null,this.extensionBindingError=null,this.forceEmptySystemPrompt=!1,this.exactSystemPrompt=null,this.pendingPromptCount=0,this.activeMutatingCommands=0,this.agentRunNeedsCompletion=!1,this.promptAdmissionTail=Promise.resolve(),this.sessionReplacement=null,this.forceShutdownOnIdle=!1,this.unsubscribe=null,this.idleTimer=null,this.subscriberCount=0,this.disposeGraceTimer=null,this.lastActivityAt=Date.now(),this.queueMirror=[],this.queueRecovery=[],this.pendingQueueHints={steer:[],followUp:[]},this.queueMutationTail=Promise.resolve(),this.onDestroyCallback=null,this.shutdownPromise=null,this.sessionShutdownEmitted=!1,this._alive=!0,this.approvalPolicy=(0,y.ni)((0,x.lN)().permissionRules),this.approvalMode=(0,x.lN)().toolApprovalMode,this.pendingApprovals=new Map,this.approvalSeq=0,this.approvalHookInstalled=!1,this.goalEngine=new C.aA,this.goalTokensAccounted=0,this.goalToolCallsAccounted=0,this.goalContinuationInFlight=!1,this.wrapperChatOnly=!1,this.wrapperSuppressNotifications=!1,this.cwd="string"==typeof b?b:"";const c="string"==typeof b?{}:b;c.onAgentRunComplete&&(this.onAgentRunComplete=c.onAgentRunComplete),c.suppressCompletionNotifications&&this.setSuppressCompletionNotifications(!0),c.chatOnly&&this.setChatOnly(!0),c.exactSystemPrompt&&(this.exactSystemPrompt=c.exactSystemPrompt(),this.installExactSystemPromptContinuation(),this.applyExactSystemPrompt());const d=(0,x.lN)(a.sessionId);if(this.approvalMode=d.toolApprovalMode,this.approvalPolicy=(0,y.ni)(d.permissionRules),a.sessionFile){const b=(0,C.bo)(a.sessionFile);"idle"!==b.status&&this.goalEngine.hydrate(b)}}get sessionId(){return this.inner.sessionId}get sessionFile(){return this.inner.sessionFile??""}isAlive(){return this._alive}async waitUntilReady(){}isShuttingDown(){return null!==this.shutdownPromise}whenShutdown(){return this.shutdownPromise}isRunning(){return this._alive&&(this.pendingPromptCount>0||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)}runtimeSnapshot(){let a=this.inner.isStreaming,b=this.promptRunning,c=this.inner.isCompacting,d=this.inner.isBashRunning;return{id:this.sessionId,running:this.isRunning(),isStreaming:a,isPromptRunning:b,isCompacting:c,isBashRunning:d,phase:d?"running_command":this.promptPhase??(a||b||c?"waiting_model":null)}}setChatOnly(a){this.wrapperChatOnly=a}setSuppressCompletionNotifications(a){this.wrapperSuppressNotifications=a}isChatOnly(){return this.wrapperChatOnly}hasSuppressedCompletionNotifications(){return this.wrapperSuppressNotifications}start(){this.installApprovalHook(),this.goalEngine.setOnChanged(a=>{this.sessionFile&&(0,C.eG)(this.sessionFile,a),this.emit({type:"goal_state_changed",goalState:a}),J("goal_state_changed",this.sessionId,{type:"goal_state_changed",goalState:a})}),this.goalEngine.isRunning()&&this.scheduleGoalKick(),this.unsubscribe=this.inner.subscribe(a=>{("agent_end"===a.type||"message_end"===a.type||"entry_appended"===a.type||"session_info_changed"===a.type)&&(0,o.mD)(),("agent_end"===a.type||"agent_settled"===a.type||"auto_compaction_end"===a.type||"compaction_end"===a.type)&&this.resetIdleTimer(),"agent_start"===a.type&&(this.goalEngine.onAgentStart(),this.agentRunNeedsCompletion=!0),"agent_settled"===a.type&&(this.handleGoalSettled(),this.notifyAgentRunCompleteIfIdle()),"queue_update"===a.type&&this.reconcileQueue(a.steering,a.followUp),M.has(a.type)&&J(a.type,this.sessionId,a),this.emit(a),H()}),this.resetIdleTimer()}loadQueueRecovery(){if(!this.sessionFile)return;let a=this.inner.getSteeringMessages(),b=this.inner.getFollowUpMessages();if(a.length||b.length){this.queueRecovery=[],this.reconcileQueue([...a],[...b]);return}this.queueRecovery=(0,k.ov)(this.sessionFile)}getGoalState(){return this.goalEngine.getState()}handleGoalSettled(){if(!this.goalEngine.isRunning())return void this.goalEngine.disarmContinuation();let a=this.inner.getLastAssistantText()??"",b=0,c=0;try{let a=this.inner.sessionManager.getEntries(),d=function(a){let b=0;for(let c of a){let a=c?.message;if(!a||"assistant"!==a.role)continue;let d=a.usage;d&&(b+=(d.input??0)+(d.output??0)+(d.cacheRead??0)+(d.cacheWrite??0))}return b}(a);b=Math.max(0,d-this.goalTokensAccounted),this.goalTokensAccounted=d;let e=function(a){let b=0;for(let c of a){let a=c?.message;if(!a||"assistant"!==a.role)continue;let d=a.content;if(Array.isArray(d))for(let a of d)a&&"object"==typeof a&&"toolCall"===a.type&&(b+=1)}return b}(a);c=Math.max(0,e-this.goalToolCallsAccounted),this.goalToolCallsAccounted=e}catch{}let{verdict:d}=this.goalEngine.settleTurn(a,b,c);"continue"!==d.action?this.goalEngine.disarmContinuation():this.scheduleGoalKick()}scheduleGoalKick(){if(this.goalEngine.isRunning()&&!this.goalContinuationInFlight){if(this.goalEngine.isContinuationArmed()){this.goalEngine.disarmContinuation(),this.driveGoalContinuation();return}this.inner.isStreaming||this.promptRunning||this.inner.pendingMessageCount>0||this.driveGoalContinuation()}}driveGoalContinuation(){this.goalEngine.isRunning()&&!this.goalContinuationInFlight&&(this.goalContinuationInFlight=!0,this.inner.followUp(C.LF).catch(()=>{}).finally(()=>{this.goalContinuationInFlight=!1}))}handleGoalStartCommand(a,b){let c=this.goalEngine.start(a,b);return this.goalTokensAccounted=0,this.goalToolCallsAccounted=0,c}handleGoalStopCommand(){return this.goalEngine.stop(),this.goalTokensAccounted=0,this.goalEngine.getState()}setApprovalMode(a){this.approvalMode=a}setApprovalPolicy(a){this.approvalPolicy=a}installApprovalHook(){if(this.approvalHookInstalled||!this.inner.agent?.beforeToolCall)return;this.approvalHookInstalled=!0;let a=this.inner.agent.beforeToolCall;this.inner.agent.beforeToolCall=async b=>{let c=b.toolCall?.name??"",d=b.args,e=(0,y.LD)(this.approvalPolicy,c,{mode:this.approvalMode,readOnly:z.MJ.has(c.toLowerCase()),args:d});if("deny"===e)return{block:!0,reason:`Denied by policy rule: ${c} is not permitted.`};if("ask"===e){let a=await this.askForApproval(c,d);if(!a.approve)return{block:!0,reason:a.reason||`Rejected by user: ${c}`}}return a?a(b):void 0}}askForApproval(a,b){return new Promise(c=>{let d=`approval-${++this.approvalSeq}`,e=setTimeout(()=>{this.pendingApprovals.delete(d),this.emit({type:"tool_approval_resolved",id:d,approve:!1,reason:`Approval request timed out after 120s: ${a}`}),c({approve:!1,reason:`Approval request timed out after 120s: ${a}`})},12e4);this.pendingApprovals.set(d,{resolve:c,timer:e,toolName:a}),this.emit({type:"tool_approval_request",id:d,toolName:a,args:function(a){if(null===a||"object"!=typeof a)return a;let b={};for(let[c,d]of Object.entries(a))if(null!=d&&"content"!==c&&"data"!==c&&"newString"!==c&&"oldString"!==c){if("string"==typeof d){b[c]=d.length>200?`${d.slice(0,200)}…`:d;continue}if("number"==typeof d||"boolean"==typeof d){b[c]=d;continue}b[c]=Array.isArray(d)?`[array:${d.length}]`:"[object]"}return b}(b)})})}resolveApproval(a,b,c){let d=this.pendingApprovals.get(a);return!!d&&(this.pendingApprovals.delete(a),clearTimeout(d.timer),d.resolve({approve:b,reason:c}),!0)}rejectAllApprovals(a){for(let[b,c]of this.pendingApprovals)this.pendingApprovals.delete(b),clearTimeout(c.timer),c.resolve({approve:!1,reason:a})}getPendingApprovals(){return Array.from(this.pendingApprovals.entries()).map(([a,b])=>({id:a,toolName:b.toolName}))}pendingRecoveryView(){return this.queueRecovery.map(({id:a,kind:b,text:c,images:d,queuedAt:e})=>({id:a,kind:b,text:c,hasImages:!!d?.length,queuedAt:e}))}persistQueue(){if(!this.sessionFile)return;let a=[...this.queueRecovery,...this.queueMirror];a.length?(0,k.pj)(this.sessionFile,a):(0,k.wx)(this.sessionFile)}hintQueueImages(a,b){this.pendingQueueHints[a].push(b?.length?b:[])}reconcileQueue(a,b){let c=(a,b)=>{if(!b)return this.queueMirror.filter(b=>b.kind===a);let c=new Set;return b.map(b=>{let d=this.queueMirror.find(d=>d.kind===a&&d.text===b&&!c.has(d));if(d)return c.add(d),d;let e=(0,k.Gc)(a,b,this.pendingQueueHints[a].shift());return c.add(e),e})};this.queueMirror=[...c("steer",a),...c("followUp",b)],this.persistQueue()}async requeueEntry(a){let b=(0,j.kc)(a.images);if(b)throw Error(b);this.hintQueueImages(a.kind,a.images),"steer"===a.kind?await this.inner.steer(a.text,a.images):await this.inner.followUp(a.text,a.images)}ensureMirrored(a){this.queueMirror.find(b=>b.kind===a.kind&&b.text===a.text)||(this.queueMirror.push({...a}),this.pendingQueueHints[a.kind].pop())}async replaceLiveQueue(a,b){for(let b of(this.inner.clearQueue(),this.pendingQueueHints={steer:[],followUp:[]},a))await this.requeueEntry(b);for(let a of b)await this.requeueEntry(a);let c={steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]};return this.reconcileQueue(c.steering,c.followUp),c}async withQueueMutation(a){let b,c=this.queueMutationTail;this.queueMutationTail=new Promise(a=>{b=a}),await c;try{return await a()}finally{b()}}async mutateLiveQueue(a,b){return this.withQueueMutation(async()=>{let c=this.queueMirror.filter(a=>"steer"===a.kind),d=this.queueMirror.filter(a=>"followUp"===a.kind),e=b("steer"===a?c:d),f=await this.replaceLiveQueue(c,d);return{value:e,queues:f}})}validateQueueEntries(a){for(let b of a){if("steer"!==b.kind&&"followUp"!==b.kind||"string"!=typeof b.text)continue;let a=(0,j.kc)(b.images);if(a)throw Error(a)}}runAgentContinue(){if(this.inner.isStreaming||this.inner.isBashRunning||this.promptRunning)return;let a=[...this.queueMirror];0!==a.length&&(this.queueMirror=[],this.persistQueue(),this.promptRunning=!0,this.promptPhase="waiting_model",this.bootstrapQueuedRun(a))}async bootstrapQueuedRun(a){for(let b of(this.inner.clearQueue(),this.pendingQueueHints={steer:[],followUp:[]},a))try{await this.inner.prompt(b.text,b.images?.length?{images:b.images}:void 0)}catch(a){this.promptRunning=!1,this.promptPhase=null,this.resetIdleTimer(),(0,o.mD)(),this.emit({type:"prompt_error",errorMessage:a instanceof Error?a.message:String(a)}),this.emit({type:"prompt_done"});return}this.promptRunning=!1,this.promptPhase=null,this.resetIdleTimer(),this.emit({type:"prompt_done"})}setForceEmptySystemPrompt(a){this.forceEmptySystemPrompt=a,this.applyForcedEmptySystemPrompt()}setExactSystemPrompt(a){this.exactSystemPrompt=a,this.applyExactSystemPrompt()}beginExtensionBinding(a={}){this.ensureExtensionsBound(a).catch(a=>{console.error("[pi-web] failed to dispatch session_start to extensions:",a instanceof Error?a.message:a)})}ensureExtensionsBound(a={}){return(a.forceEmptySystemPrompt&&(this.forceEmptySystemPrompt=!0),this.extensionsBound)?(this.applyExactSystemPrompt(),Promise.resolve()):(this.extensionBindingPromise||(this.extensionBindingError=null,this.extensionBindingPromise=(async()=>{if(!this._alive)return;let a=this.createExtensionUiContext();if("function"==typeof this.inner.bindExtensions){let b=this.inner.bindExtensions;await b.call(this.inner,{uiContext:a,mode:"rpc",commandContextActions:this.createExtensionCommandContextActions(),shutdownHandler:()=>this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",notifyType:"warning",message:"Extension requested shutdown, but shutdown is not supported in pi-web."}),onError:a=>this.emit({type:"extension_error",extensionPath:a.extensionPath,event:a.event,error:a.error})})}else this.inner.extensionRunner.setUIContext?.(a,"rpc");this.extensionsBound=!0,this.applyExactSystemPrompt(),console.log(`[pi-web] session_start dispatched to extensions for session ${this.inner.sessionId}`)})().catch(a=>{throw this.extensionBindingError=a,a})),this.extensionBindingPromise)}static{this.EXTENSION_BIND_TIMEOUT_MS=15e3}async waitForExtensionsBound(){let a=this.extensionBindingPromise;if(a)try{let b=new Promise((b,c)=>{let d=setTimeout(()=>c(Error("Extension binding timed out; continuing without waiting")),U.EXTENSION_BIND_TIMEOUT_MS);a.finally(()=>clearTimeout(d))});await Promise.race([a,b])}catch{}this.extensionBindingError&&console.warn("[pi-web] extension binding failed, continuing:",this.extensionBindingError)}shouldWaitForExtensions(a){return"prompt"===a||"steer"===a||"follow_up"===a||"get_commands"===a||"get_state"===a}applyForcedEmptySystemPrompt(){this.inner.agent.state&&(this.forceEmptySystemPrompt?this.inner.agent.state.systemPrompt="":null!==this.exactSystemPrompt&&(this.inner.agent.state.systemPrompt=this.exactSystemPrompt))}applyExactSystemPrompt(){!this.forceEmptySystemPrompt&&null!==this.exactSystemPrompt&&this.inner.agent.state&&(this.inner.agent.state.systemPrompt=this.exactSystemPrompt)}emit(a){for(let b of this.listeners)try{b(a)}catch(a){console.error(`[pi-web] session ${this.sessionId} event listener threw:`,a instanceof Error?a.message:a)}}installExactSystemPromptContinuation(){if(!this.exactSystemPrompt)return;let a=this.inner.agent,b=a.prepareNextTurnWithContext;a.prepareNextTurnWithContext=async(a,c)=>{let d=await b?.(a,c);return{...d,context:{...d?.context??a.context,systemPrompt:this.exactSystemPrompt}}}}setActiveToolSelection(a){this.inner.setActiveToolsByName(F(this.inner,a)),this.applyExactSystemPrompt()}async acquirePromptAdmission(){let a,b=this.promptAdmissionTail;return this.promptAdmissionTail=new Promise(b=>{a=b}),await b,a}notifyAgentRunCompleteIfIdle(){if(!(!this.agentRunNeedsCompletion||this.isRunning())&&(this.agentRunNeedsCompletion=!1,!this.wrapperSuppressNotifications))try{this.onAgentRunComplete?.(this.sessionId)}catch(a){console.error("[pi-web] completion listener failed:",a instanceof Error?a.message:a)}}resetIdleTimer(){this.idleTimer&&clearTimeout(this.idleTimer),this._alive&&0!==N&&(this.isRunning()||(this.forceShutdownOnIdle=!1),this.idleTimer=setTimeout(()=>{!this.forceShutdownOnIdle&&(this.isRunning()||(0,r.Vj)({sessionId:this.sessionId,sessionFile:this.sessionFile||void 0}))?this.resetIdleTimer():this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down idle session:",a instanceof Error?a.message:a)})},N))}touch(){this.lastActivityAt=Date.now(),this.cancelPendingDispose()}hasSubscribers(){return this.subscriberCount>0}get activityTimestamp(){return this.lastActivityAt}cancelPendingDispose(){this.disposeGraceTimer&&(clearTimeout(this.disposeGraceTimer),this.disposeGraceTimer=null)}scheduleDisposeIfIdle(){this.cancelPendingDispose(),!(this.subscriberCount>0||this.isRunning())&&this._alive&&(this.disposeGraceTimer=setTimeout(()=>{this.disposeGraceTimer=null,!(this.subscriberCount>0||this.isRunning())&&this._alive&&this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down unwatched session:",a instanceof Error?a.message:a)})},6e4))}persistSessionFileIfMissing(){let a=this.inner.sessionManager,b=a.getSessionFile();if(!b||(0,h.existsSync)(b))return;let c=a.getHeader();if(!c)return;let d=[c,...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";try{(0,h.writeFileSync)(b,d,{encoding:"utf8",flag:"wx"})}catch(c){if("EEXIST"===c.code||(0,h.existsSync)(b)){a.flushed=!0,(0,o.O8)(this.inner.sessionId,b);return}throw c}a.flushed=!0,(0,o.O8)(this.inner.sessionId,b)}onEvent(a){for(let b of(this.listeners.push(a),this.subscriberCount+=1,this.cancelPendingDispose(),this.pendingUiRequests.values()))a(b);return()=>{let b=this.listeners.indexOf(a);-1!==b&&this.listeners.splice(b,1),this.subscriberCount>0&&(this.subscriberCount-=1),this.scheduleDisposeIfIdle()}}onDestroy(a){this.onDestroyCallback=a}async withSessionReplacement(a,b){if(this.sessionReplacement)throw Error("Session is already being copied");this.sessionReplacement=a;try{return await b()}finally{this._alive&&(this.sessionReplacement=null)}}isSessionRunningForReplacement(){return this.inner.isBashRunning||this.inner.isStreaming||this.inner.isCompacting||this.pendingPromptCount>0}async shutdownAfterSessionReplacement(a){try{await this.shutdown()}catch(b){console.error(`[pi-web] ${a} succeeded, but source session shutdown failed:`,b instanceof Error?b.message:b)}}async send(a){if(!this._alive)throw Error("Session is shutting down");this.touch(),this.resetIdleTimer();let b=a.type;if("prompt"===b||"steer"===b||"follow_up"===b||"requeue_at"===b){let b=(0,j.kc)(a.images);if(b)throw Error(b)}let c=P.has(b);if(this.sessionReplacement&&!c)throw Error("Session is being copied to a new session");if(O.has(b)&&this.activeMutatingCommands>0)throw Error(`Cannot ${b} while another session command is running`);this.shouldWaitForExtensions(b)&&await this.waitForExtensionsBound();let d=!c;d&&(this.activeMutatingCommands+=1);try{if("get_state"!==b&&this.resetIdleTimer(),this.shouldWaitForExtensions(b)&&await this.waitForExtensionsBound(),this.sessionReplacement&&!c)throw Error("Session is being copied to a new session");if("prompt"===b||"steer"===b||"follow_up"===b){let b=(0,j.kc)(a.images);if(b)throw Error(b)}switch(b){case"prompt":{let b=await this.acquirePromptAdmission();try{let b,c,d;if(this.inner.isBashRunning)throw Error("Cannot send a prompt while a shell command is running");this.extensionUiAbortController.signal.aborted&&(this.extensionUiAbortController=new AbortController);let e=a.images,f=a.streamingBehavior;f&&this.inner.isStreaming&&this.hintQueueImages("followUp"===f?"followUp":"steer",e);let g=!1,h=!1,i=!1,j=new Promise((a,d)=>{b=()=>{g=!0,this.agentRunNeedsCompletion=!0,h||(h=!0,a())},c=a=>{h||(h=!0,d(a))}}),k=()=>{i||(i=!0,this.pendingPromptCount=Math.max(0,this.pendingPromptCount-1),this.resetIdleTimer(),this.notifyAgentRunCompleteIfIdle())};this.pendingPromptCount+=1,this.promptRunning=!0,this.promptPhase=String(a.message??"").trimStart().startsWith("/")?"running_command":"waiting_model",H();try{d=this.inner.prompt(a.message,{...e?.length?{images:e}:{},...f?{streamingBehavior:f}:{},source:"rpc",preflightResult:a=>{a&&(this.applyExactSystemPrompt(),b())}})}catch(a){throw k(),a}return d.then(()=>{b(),k(),this.promptRunning=!1,this.promptPhase=null,f||this.emit({type:"prompt_done"}),H()},a=>{c(a),k(),this.promptRunning=!1,this.promptPhase=null,(0,o.mD)(),g&&(this.emit({type:"prompt_error",errorMessage:a instanceof Error?a.message:String(a)}),f||this.emit({type:"prompt_done"})),H()}).catch(a=>{console.error("[pi-web] prompt completion handler failed:",a instanceof Error?a.message:a)}),await j,null}finally{b()}}case"abort":this.forceShutdownOnIdle=!0,this.extensionUiAbortController.abort(new DOMException("Extension UI cancelled by Stop","AbortError"));try{await this.inner.abort()}finally{this.resetIdleTimer(),this.isRunning()||(this.forceShutdownOnIdle=!1)}return null;case"get_state":{let a=this.inner.model,b=this.inner.getContextUsage();return{sessionId:this.inner.sessionId,sessionFile:this.inner.sessionFile??"",isStreaming:this.inner.isStreaming,isPromptRunning:this.pendingPromptCount>0,isBashRunning:this.inner.isBashRunning,isCompacting:this.inner.isCompacting,phase:this.runtimeSnapshot().phase,model:a?{id:a.id,provider:a.provider}:void 0,messageCount:0,pendingMessageCount:this.inner.pendingMessageCount,queuedMessages:{steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]},pendingRecovery:this.pendingRecoveryView(),contextUsage:b?{percent:b.percent,contextWindow:b.contextWindow,tokens:b.tokens}:null,systemPrompt:this.inner.agent.state?.systemPrompt??"",thinkingLevel:this.inner.agent.state?.thinkingLevel??"off",extensionStatuses:this.getExtensionStatuses(),extensionWidgets:this.getExtensionWidgets(),goalState:this.goalEngine.getState()}}case"goal_start":{let b=String(a.goalText??"").trim();if(!b)throw Error("goal_start requires a non-empty goalText");let c=a.tokenBudget,d="number"==typeof c&&Number.isFinite(c)&&c>0?Math.floor(c):null,e=this.handleGoalStartCommand(b,d);return this.scheduleGoalKick(),{goalState:e}}case"goal_pause":try{this.inner.clearQueue(),this.queueMirror=[],this.persistQueue()}catch{}return{goalState:this.goalEngine.pause()};case"goal_resume":{let a=this.goalEngine.resume();return"running"===a.status&&(this.goalEngine.armContinuation(),this.scheduleGoalKick()),{goalState:a}}case"goal_stop":try{this.inner.clearQueue(),this.queueMirror=[],this.persistQueue()}catch{}return{goalState:this.handleGoalStopCommand()};case"goal_edit":{let b=String(a.goalText??"").trim();if(!b)throw Error("goal_edit requires a non-empty goalText");let c=this.goalEngine.edit(b);return"running"===c.status&&this.scheduleGoalKick(),{goalState:c}}case"get_goal_state":return{goalState:this.goalEngine.getState()};case"set_model":{let{provider:b,modelId:c}=a,d=this.inner.modelRuntime.getModel(b,c);if(!d)try{await this.inner.modelRuntime.refresh({allowNetwork:!1}),d=this.inner.modelRuntime.getModel(b,c)}catch{d=void 0}if(!d)throw Error(`Model not found: ${b}/${c}`);return await this.inner.setModel(d),(0,l.k)(),(0,o.mD)(),{id:d.id,provider:d.provider}}case"fork":{let b=a.entryId,c=this.inner.sessionManager,d=this.inner.sessionFile;if(!c.isPersisted())return{cancelled:!0};if(!d)throw Error("Persisted session is missing a session file");if(!c.getEntry(b))throw Error("Invalid entry ID for forking");let f=c.getSessionDir(),g=e.SessionManager.open(d,f).createBranchedSession(b);if(!g)throw Error("Failed to create forked session");let h=e.SessionManager.open(g,f).getSessionId();return(0,o.O8)(h,g),(0,o.mD)(),{cancelled:!1,newSessionId:h}}case"clone":{if(this.isSessionRunningForReplacement())throw Error("Cannot clone while the session is running");let b=this.inner.sessionManager,c=this.inner.sessionFile,d="string"==typeof a.leafId?a.leafId:b.getLeafId(),f=d&&b.getBranch(d).some(a=>"message"===a.type&&"assistant"===a.message.role);if(!b.isPersisted()||!d||!f||!c||!(0,h.existsSync)(c))return{cancelled:!0};return this.withSessionReplacement("clone",async()=>{let a=b.getSessionDir(),f=e.SessionManager.open(c,a).createBranchedSession(d);if(!f||!(0,h.existsSync)(f))throw Error("Failed to clone current session branch");let g=e.SessionManager.open(f,a).getSessionId();return(0,o.O8)(g,f),(0,o.mD)(),await this.shutdownAfterSessionReplacement("clone"),{cancelled:!1,newSessionId:g}})}case"navigate_tree":return{cancelled:(await this.inner.navigateTree(a.targetId,{})).cancelled};case"set_thinking_level":{let b=a.level;return this.inner.setThinkingLevel(b),"xhigh"===b&&this.inner.model?.compat?.thinkingFormat==="deepseek"&&this.inner.agent?.state&&(this.inner.agent.state.thinkingLevel="xhigh"),(0,o.mD)(),null}case"compact":try{return await this.inner.compact(a.customInstructions)}finally{(0,o.mD)()}case"set_session_name":{let b=a.name?.trim();if(!b)throw Error("Session name cannot be empty");return this.inner.setSessionName(b),(0,o.mD)(),null}case"get_session_stats":return{...this.inner.getSessionStats(),sessionName:this.inner.sessionManager.getSessionName()};case"get_last_assistant_text":return{text:this.inner.getLastAssistantText()??""};case"clear_queue":return this.withQueueMutation(async()=>(this.queueMirror=[],this.pendingQueueHints={steer:[],followUp:[]},this.persistQueue(),this.inner.clearQueue()));case"move_queue":{let b=a.kind,c=Number(a.fromIndex),d=Number(a.toIndex);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c)||!Number.isInteger(d))throw Error("move_queue requires a queue kind and integer indexes");let{queues:e}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length||d<0||d>=a.length)throw Error("move_queue index out of range");let[b]=a.splice(c,1);a.splice(d,0,b)});return e}case"recall_queue_item":{let b=a.kind,c=Number(a.index);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c))throw Error("recall_queue_item requires a queue kind and integer index");let{value:d,queues:e}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length)throw Error("recall_queue_item index out of range");let[b]=a.splice(c,1);return b});return{entry:{text:d.text,images:d.images??[]},...e}}case"requeue_at":{let b=a.kind,c=Number(a.index),d=a.text;if("steer"!==b&&"followUp"!==b||!Number.isInteger(c)||!d?.trim())throw Error("requeue_at requires a queue kind, integer index, and text");let e=a.images,{queues:f}=await this.mutateLiveQueue(b,a=>{if(c<0||c>a.length)throw Error("requeue_at index out of range");a.splice(c,0,(0,k.Gc)(b,d,e))});return f}case"remove_queue_item":{let b=a.kind,c=Number(a.index);if("steer"!==b&&"followUp"!==b||!Number.isInteger(c))throw Error("remove_queue_item requires a queue kind and integer index");let{queues:d}=await this.mutateLiveQueue(b,a=>{if(c<0||c>=a.length)throw Error("remove_queue_item index out of range");a.splice(c,1)});return d}case"resolve_recovery":return this.withQueueMutation(async()=>{let b=new Set(a.keep??[]),c=new Set(a.discard??[]),d=!0===a.continueRun,e=0;for(let a of this.queueRecovery)b.has(a.id)&&(await this.requeueEntry(a),this.ensureMirrored(a),e+=1);return this.queueRecovery=this.queueRecovery.filter(a=>!b.has(a.id)&&!c.has(a.id)),this.persistQueue(),d&&e>0&&this.runAgentContinue(),{remaining:this.pendingRecoveryView(),kept:e}});case"export_queue":return{live:this.queueMirror.map(a=>({...a})),recovery:this.queueRecovery.map(a=>({...a}))};case"import_queue":return this.withQueueMutation(async()=>{let b=a.entries;if(!Array.isArray(b))throw Error("import_queue requires entries[]");this.validateQueueEntries(b);let c=0;for(let a of b){if("steer"!==a.kind&&"followUp"!==a.kind||"string"!=typeof a.text)continue;let b=(0,k.Gc)(a.kind,a.text,a.images);await this.requeueEntry(b),this.ensureMirrored(b),c+=1}return this.persistQueue(),{imported:c,steering:[...this.inner.getSteeringMessages()],followUp:[...this.inner.getFollowUpMessages()]}});case"stage_recovery":return this.withQueueMutation(async()=>{let b=a.entries;if(!Array.isArray(b))throw Error("stage_recovery requires entries[]");this.validateQueueEntries(b);let c=0;for(let a of b)("steer"===a.kind||"followUp"===a.kind)&&"string"==typeof a.text&&(this.queueRecovery.push((0,k.Gc)(a.kind,a.text,a.images)),c+=1);return this.persistQueue(),{staged:c,pendingRecovery:this.pendingRecoveryView()}});case"steer":{let b=a.images;this.hintQueueImages("steer",b),this.promptPhase="waiting_model",H();try{await this.inner.steer(a.message,b?.length?b:void 0)}finally{this.promptPhase=null,H()}return null}case"follow_up":{let b=a.images;this.hintQueueImages("followUp",b),this.promptPhase="waiting_model",H();try{await this.inner.followUp(a.message,b?.length?b:void 0)}finally{this.promptPhase=null,H()}return null}case"get_tools":{let a=this.inner.getAllTools(),b=new Set(this.inner.getActiveToolNames());return a.map(a=>({...a,active:b.has(a.name)}))}case"get_commands":{let a=[];for(let b of this.inner.extensionRunner.getRegisteredCommands())a.push({name:b.invocationName,description:b.description,source:"extension",sourceInfo:b.sourceInfo});for(let b of this.inner.promptTemplates)a.push({name:b.name,description:b.description,source:"prompt",sourceInfo:b.sourceInfo});for(let b of this.inner.resourceLoader.getSkills().skills)a.push({name:`skill:${b.name}`,description:b.description,source:"skill",sourceInfo:b.sourceInfo});return{commands:a}}case"set_tools":{let b=a.toolNames;return this.setActiveToolSelection(b),null}case"reload":{let a=this.inner.getActiveToolNames();return await this.waitForExtensionsBound(),this.extensionStatuses.clear(),this.extensionWidgets.clear(),this.syncProjectTrust(),await this.inner.reload(),this.inner.setActiveToolsByName(F(this.inner,a)),"function"!=typeof this.inner.bindExtensions&&this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc"),this.applyForcedEmptySystemPrompt(),{success:!0}}case"abort_compaction":return this.inner.abortCompaction(),null;case"resolve_approval":return{resolved:this.resolveApproval(a.id,!!a.approve,a.reason)};case"set_approval_mode":{let b=a.mode;if("ask"!==b&&"auto"!==b&&"yolo"!==b)throw Error(`Invalid approval mode: ${String(b)}`);return this.setApprovalMode(b),null}case"set_approval_policy":{let b=a.policy;return this.setApprovalPolicy((0,y.ni)(b)),null}case"get_approval_state":return{mode:this.approvalMode,pending:this.getPendingApprovals()};case"extension_ui_response":return this.resolveExtensionUiResponse(a),null;case"extension_ui_input":return this.handleExtensionUiInput(a.id,a.data),null;case"bash":{if(this.promptRunning||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)throw Error("Cannot run a shell command while the session is busy");let b=this.inner.settingsManager?.getShellPath?.(),c=(0,v.J1)("string"==typeof b&&b?{shellPath:b}:{}),d=this.inner.executeBash(a.command,void 0,{excludeFromContext:a.excludeFromContext,operations:c});try{let a=await d;return this.persistSessionFileIfMissing(),a}finally{this.resetIdleTimer(),(0,o.mD)()}}case"abort_bash":return this.forceShutdownOnIdle=!0,this.inner.abortBash(),H(),null;default:throw Error(`Unsupported command: ${b}`)}}finally{d&&(this.activeMutatingCommands=Math.max(0,this.activeMutatingCommands-1))}}destroy(){if(!this._alive)return;for(let a of(this._alive=!1,this.idleTimer&&clearTimeout(this.idleTimer),this.cancelPendingDispose(),this.inner.isBashRunning&&this.inner.abortBash(),this.unsubscribe?.(),this.sessionFile&&this.goalEngine.hasActiveGoal()&&(0,C.eG)(this.sessionFile,this.goalEngine.getState()),this.pendingUiResponses.values()))a.cancel();for(let a of Array.from(this.activeCustomUis.keys()))this.closeCustomUi(a,void 0);this.pendingUiResponses.clear(),this.pendingUiRequests.clear(),this.rejectAllApprovals("Session closed while approval was pending");let a=()=>{try{this.inner.dispose()}finally{try{this.onDestroyCallback?.()}finally{H()}}};if(this.sessionShutdownEmitted)return void a();this.sessionShutdownEmitted=!0;let b=this.inner.extensionRunner?.emit;"function"!=typeof b?a():Promise.resolve().then(()=>b.call(this.inner.extensionRunner,{type:"session_shutdown",reason:"quit"})).catch(a=>{console.error("[pi-web] session_shutdown before dispose failed:",a instanceof Error?a.message:a)}).finally(a)}async shutdown(){return this.shutdownPromise?this.shutdownPromise:this._alive?(this.shutdownPromise=(async()=>{try{try{await this.waitForExtensionsBound()}catch(a){console.error("[pi-web] extension binding failed before session shutdown:",a instanceof Error?a.message:a)}this.sessionShutdownEmitted||(this.sessionShutdownEmitted=!0,await this.inner.extensionRunner.emit?.({type:"session_shutdown",reason:"quit"}))}finally{this.destroy()}})(),this.shutdownPromise):void 0}resolveExtensionUiResponse(a){let b=this.pendingUiResponses.get(a.id);b&&b.resolve(a)}getExtensionStatuses(){return Array.from(this.extensionStatuses,([a,b])=>({key:a,text:b}))}getExtensionWidgets(){return Array.from(this.extensionWidgets.values())}getCustomUiWidth(a){if(!a||"object"!=typeof a)return A.p1;let b=a.overlayOptions,c="function"==typeof b?b():b;if(!c||"object"!=typeof c)return A.p1;let d=c.width;return"number"==typeof d&&Number.isFinite(d)?Math.max(40,Math.min(140,Math.round(d))):A.p1}emitCustomUiRender(a,b){let c;try{c=b.component.render(b.width)}catch(a){c=[`Extension custom UI render failed: ${a instanceof Error?a.message:String(a)}`]}let d={type:"extension_ui_request",id:a,method:"custom",lines:c};this.pendingUiRequests.set(a,d),this.emit(d)}closeCustomUi(a,b){let c=this.activeCustomUis.get(a);if(c&&!c.settled){c.settled=!0,this.activeCustomUis.delete(a),this.pendingUiRequests.delete(a);try{c.component.dispose?.()}catch{}this.emit({type:"extension_ui_request",id:a,method:"custom",lines:[],closed:!0}),c.resolve(b)}}handleExtensionUiInput(a,b){let c=this.activeCustomUis.get(a);if(c&&"string"==typeof b)try{c.component.handleInput?.(b),this.activeCustomUis.has(a)&&this.emitCustomUiRender(a,c)}catch(b){this.closeCustomUi(a,void 0),this.emit({type:"extension_error",extensionPath:`custom-ui:${a}`,event:"custom_ui_input",error:b instanceof Error?b.message:String(b)})}}requestExtensionCustomUi(a,b){if("function"!=typeof a)return Promise.resolve(void 0);let c=this.extensionUiAbortController.signal;if(c.aborted)return Promise.reject(c.reason);let d=(0,g.randomUUID)(),e=this.getCustomUiWidth(b);return new Promise((b,f)=>{let g=!1,h=(0,A.TQ)(()=>{let a=this.activeCustomUis.get(d);a&&this.emitCustomUiRender(d,a)},e),i=a=>{g||(g=!0,c.removeEventListener("abort",k),c.aborted?f(c.reason):b(a))},j=a=>{this.activeCustomUis.has(d)?this.closeCustomUi(d,a):i(a)},k=()=>j(void 0);c.addEventListener("abort",k,{once:!0}),Promise.resolve().then(()=>g?void 0:a(h,S,T,j)).then(a=>{if(g){try{a?.dispose?.()}catch{}return}if(!a||"object"!=typeof a||"function"!=typeof a.render)return void i(void 0);let b={component:a,width:e,resolve:a=>i(a),settled:!1};this.activeCustomUis.set(d,b),this.emitCustomUiRender(d,b)}).catch(a=>{g||(this.emit({type:"extension_error",extensionPath:`custom-ui:${d}`,event:"custom_ui",error:a instanceof Error?a.message:String(a)}),i(void 0))})})}requestExtensionUi(a,b,c,d,e){if(e?.aborted)return Promise.resolve(b);let f=this.extensionUiAbortController.signal;if(f.aborted)return Promise.reject(f.reason);let h=e?AbortSignal.any([e,f]):f,i=(0,g.randomUUID)(),j={type:"extension_ui_request",id:i,...a,...d?{timeout:d,expiresAt:Date.now()+d}:{}};return new Promise((a,e)=>{let g,k=!1,l=()=>{g&&clearTimeout(g),h.removeEventListener("abort",n),this.pendingUiRequests.delete(i),this.pendingUiResponses.delete(i),this.emit({type:"extension_ui_closed",id:i})},m=b=>{k||(k=!0,l(),f.aborted?e(f.reason):a(b))},n=()=>m(b);d&&(g=setTimeout(()=>m(b),d)),h.addEventListener("abort",n,{once:!0}),this.pendingUiRequests.set(i,j),this.pendingUiResponses.set(i,{resolve:a=>m(c(a)),cancel:()=>m(b)}),this.emit(j)})}createExtensionUiContext(){return{select:(a,b,c)=>this.requestExtensionUi({method:"select",title:a,options:b,...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),confirm:(a,b,c)=>this.requestExtensionUi({method:"confirm",title:a,message:b,...c?.timeout?{timeout:c.timeout}:{}},!1,a=>"confirmed"in a&&a.confirmed,c?.timeout,c?.signal),input:(a,b,c)=>this.requestExtensionUi({method:"input",title:a,...void 0!==b?{placeholder:b}:{},...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),editor:(a,b,c)=>this.requestExtensionUi({method:"editor",title:a,...void 0!==b?{prefill:b}:{},...c?.timeout?{timeout:c.timeout}:{}},void 0,a=>"value"in a?a.value:void 0,c?.timeout,c?.signal),notify:(a,b)=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"notify",message:a,notifyType:b})},onTerminalInput:()=>()=>{},setStatus:(a,b)=>{void 0===b?this.extensionStatuses.delete(a):this.extensionStatuses.set(a,b),this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setStatus",statusKey:a,statusText:b})},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:(a,b,c)=>{(void 0===b||Array.isArray(b))&&(void 0===b?this.extensionWidgets.delete(a):this.extensionWidgets.set(a,{key:a,lines:b,placement:c?.placement??"aboveEditor"}),this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:b,widgetPlacement:c?.placement}))},setFooter:()=>{},setHeader:()=>{},setTitle:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"setTitle",title:a})},custom:(a,b)=>this.requestExtensionCustomUi(a,b),pasteToEditor:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"set_editor_text",text:a})},setEditorText:a=>{this.emit({type:"extension_ui_request",id:(0,g.randomUUID)(),method:"set_editor_text",text:a})},getEditorText:()=>"",addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>void 0,get theme(){return S},getAllThemes:()=>[],getTheme:()=>void 0,setTheme:()=>({success:!1,error:"Theme switching is not supported in pi-web extension UI yet"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}}}syncProjectTrust(){this.inner.settingsManager.setProjectTrusted((0,n.Y1)(this.cwd,(0,e.getAgentDir)()).trusted)}createExtensionCommandContextActions(){return{waitForIdle:async()=>{let a=this.inner.agent;await a.waitForIdle?.()},newSession:async()=>({cancelled:!0}),fork:async()=>({cancelled:!0}),navigateTree:async(a,b)=>({cancelled:(await this.inner.navigateTree(a,{summarize:b?.summarize})).cancelled}),switchSession:async()=>({cancelled:!0}),reload:async()=>{this.extensionStatuses.clear(),this.extensionWidgets.clear(),this.syncProjectTrust(),await this.inner.reload({beforeSessionStart:()=>{this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc")}}),this.applyExactSystemPrompt()}}}}function G(){if(!globalThis.__piSessions){globalThis.__piSessions=new Map;let a=()=>Promise.allSettled(Array.from(globalThis.__piSessions?.values()??[],a=>a.shutdown()));process.once("exit",()=>globalThis.__piSessions?.forEach(a=>a.destroy())),process.once("SIGINT",()=>{a().finally(()=>process.exit(130))}),process.once("SIGTERM",()=>{a().finally(()=>process.exit(143))})}return globalThis.__piSessions}let V="";function H(){let a=globalThis.__piRunningListeners;if(!a||0===a.size){V="";return}let b=function(){let a=[];for(let[b,c]of G()){if(!c.isAlive())continue;let d=c.runtimeSnapshot();d.running&&a.push({...d,id:d.id||b})}return a}(),c=JSON.stringify(b);if(c!==V)for(let d of(V=c,a))try{d(b)}catch{}}let W=(0,s.s)({getSession:a=>G().get(a),registerSession:(a,b)=>{let c,d,e;c=new U(a,a.sessionManager.getCwd()),b?.chatOnly?c.setForceEmptySystemPrompt(!0):b?.exactSystemPrompt&&c.setExactSystemPrompt(b.exactSystemPrompt),c.setChatOnly(!!b?.chatOnly),c.setSuppressCompletionNotifications(!0),c.start(),d=a.sessionId,e=G(),c.onDestroy(()=>e.delete(d)),e.set(d,c)},reopenSession:async(a,b)=>(await L(a,b,void 0)).session,resolveSessionPath:o.os,invalidateSessionList:o.mD,notifyRunningChange:H,isBuiltInSubagentsEnabled:t.N});!function(){try{let a=(0,t.M6)();if((0,h.existsSync)(a))return;(0,h.mkdirSync)(a.slice(0,a.lastIndexOf("/")),{recursive:!0}),(0,h.writeFileSync)(a,JSON.stringify({builtInEnabled:!0},null,2)+"\n")}catch(a){console.warn("[pi-web] failed to seed agents/settings.json:",a instanceof Error?a.message:a)}}();let X=new Map;function I(a){let b=globalThis.__piSessionBusListeners;if(b&&0!==b.size)for(let c of b)try{c(a)}catch{}}function J(a,b,c){let d=globalThis.__piSessionBusListeners;if(!d||0===d.size)return;if("message_update"!==a)return void I({type:a,sessionId:b,payload:c});let e=X.get(b),f={type:a,sessionId:b,payload:c};e?(clearTimeout(e.timer),e.event=f):X.set(b,{event:f,timer:setTimeout(()=>{let a=X.get(b);a&&(X.delete(b),I(a.event))},80)})}function K(a,b){let c=Date.now(),{provider:d,modelId:e,sessionId:f}=b,g=a.result.bind(a);a.result=async()=>{let a,b,h,i,j,k=await g();return a=Date.now()-c,b="error"===k.stopReason||"aborted"===k.stopReason,h=k.errorMessage?.trim(),j=(i=h?.match(/\bHTTP\s+(\d{3})\b|\bstatus(?:\s+code)?\s*[:=]?\s*(\d{3})\b/))?Number(i[1]??i[2]):void 0,(0,B.wF)({level:b?"error":"info",source:"model-call",provider:d,model:e,sessionId:f,...void 0!==j?{statusCode:j}:{},message:b?`模型调用失败 ${d}/${e}${h?`:${h}`:""}`:`模型调用成功 ${d}/${e}`,details:b?void 0:`耗时 ${a}ms`}),k};let h=a[Symbol.asyncIterator].bind(a);return a[Symbol.asyncIterator]=()=>{let a=h();return{next:()=>a.next().catch(a=>{throw(0,B.wF)({level:"error",source:"model-call",provider:d,model:e,sessionId:f,message:`模型调用传输错误 ${d}/${e}:${a instanceof Error?a.message:String(a)}`}),a})}},a}async function L(a,b,d,f={}){let g,j,k,r,{toolNames:s,initialModel:u,thinkingLevel:v,allowInitialModelFallback:x}=f,y=G(),z=(globalThis.__piStartLocks||(globalThis.__piStartLocks=new Map),globalThis.__piStartLocks),A=y.get(a);if(A?.isAlive()&&!A.isShuttingDown())return{session:A,realSessionId:a,created:!1};if(A){let a=A.whenShutdown();a&&await Promise.race([a,new Promise(a=>setTimeout(a,1e4))])}let B=z.get(a);if(B)return B;if(b)g=e.SessionManager.open(b,void 0);else{if(!d)throw Error("cwd is required for a new session");g=e.SessionManager.create(d,void 0)}let C=g.getCwd(),E=b?(0,q.ph)(g.getEntries()):null,H=(globalThis.__piStartingSessionCwds||(globalThis.__piStartingSessionCwds=new Map),k=globalThis.__piStartingSessionCwds,r=function(a){let b=(0,i.resolve)(a);try{return(0,h.realpathSync)(b)}catch{return b}}(C),k.set(r,(k.get(r)??0)+1),()=>{let a=(k.get(r)??1)-1;a>0?k.set(r,a):k.delete(r)}),I=new AbortController,J=setTimeout(()=>I.abort(),25e3),M=!1,N=!1,O=()=>{N||(N=!0,H())},P=(async()=>{let b,d=E?.tools??s??[],f=0===d.length;f||(0,e.initTheme)();let h=(0,e.getAgentDir)(),i=E?.tools;E||void 0===s||(i=0===d.length?[]:void 0);let j=E?void 0:(0,n.Fk)(C,h),k=await (0,e.createAgentSessionServices)({cwd:C,agentDir:h,modelRuntimeSignal:I.signal,resourceLoaderOptions:E?{noExtensions:!0,noSkills:!0,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,appendSystemPrompt:E.appendSystemPrompt}:{extensionFactories:[(0,p.Vj)(W.extensionRuntime,()=>(0,q.IR)(C),t.N)],extensionsOverride:a=>(0,p.U6)(a)},...j?{resourceLoaderReloadOptions:j}:{}}),{createAsyncBashTools:r}=await Promise.resolve().then(c.bind(c,12394)),z=new D.B,A=r(z),B=await (0,m.py)(k.modelRuntime,k.settingsManager.getEnabledModels(),{signal:I.signal}),H=u&&(!x||B.visible.some(a=>a.provider===u.provider&&a.id===u.modelId))?u:void 0,J=k.settingsManager.getDefaultProvider(),L=k.settingsManager.getDefaultModel(),N=g.getBranch().some(a=>"message"===a.type)?{scopedModels:[...B.scopedModels]}:(0,m.IR)(B,{...H?{requestedModel:H}:{},...J&&L?{defaultModel:{provider:J,modelId:L}}:{},...v?{thinkingLevel:v}:{}}),O=!1,P=(0,e.createAgentSessionFromServices)({services:k,sessionManager:g,...N.model?{model:N.model}:{},...N.thinkingLevel?{thinkingLevel:N.thinkingLevel}:{},...N.scopedModels.length>0?{scopedModels:N.scopedModels}:{},...void 0!==i?{tools:i}:{},customTools:A}),{session:Q}=await Promise.race([P,new Promise((a,c)=>{b=setTimeout(()=>{O=!0,I.abort(),c(Error("Session startup timed out while binding extensions/resources (40s)"))},4e4)})]);clearTimeout(b),P.then(({session:a})=>{if(O)try{a.dispose()}catch{}},()=>{});let R=z.cleanup.bind(z);try{let b=Q.agent,c=b.streamFunction;if(b.streamFunction=(b,d,e)=>{let f=c(b,d,e);return f instanceof Promise?f.then(c=>K(c,{provider:b.provider,modelId:b.id,sessionId:a})):K(f,{provider:b.provider,modelId:b.id,sessionId:a})},(await (0,w.o)(k.settingsManager,{...u?{model:u}:{},...v?{thinkingLevel:v}:{}},{...Q.model?{model:{provider:Q.model.provider,modelId:Q.model.id}}:{},thinkingLevel:Q.agent.state?.thinkingLevel??"off",supportsThinking:Q.supportsThinking()})).modelDefaultChanged&&(0,l.k)(),!E&&s&&s.length>0&&Q.setActiveToolsByName(F(Q,s)),M){try{Q.dispose()}catch{}try{R()}catch{}throw Error("Session startup abandoned after hard timeout")}let d=new U(Q,C);d.setChatOnly(f),d.setSuppressCompletionNotifications(void 0!==E),s?.length===0||E?.tools.length===0?d.setForceEmptySystemPrompt(!0):E&&E.appendSystemPrompt.length>0&&d.setExactSystemPrompt(E.appendSystemPrompt[0]),d.start(),d.loadQueueRecovery();let e=Q.sessionId,g=Q.sessionFile;return g&&(0,o.O8)(e,g),d.persistSessionFileIfMissing(),d.onDestroy(()=>{R(),y.get(e)===d&&y.delete(e)}),y.set(e,d),d.beginExtensionBinding({forceEmptySystemPrompt:s?.length===0}),!function(){let a=G();if(a.size<=12)return;let b=Array.from(a.entries()).filter(([,a])=>a.isAlive()&&!a.isRunning()&&!a.hasSubscribers()).sort((a,b)=>a[1].activityTimestamp-b[1].activityTimestamp),c=a.size-12;for(let[d,e]of b){if(c<=0)break;a.has(d)&&(console.log(`[pi-web] evicting idle unwatched session ${d} (registry cap 12)`),e.shutdown().catch(a=>{console.error(`[pi-web] failed to evict session ${d}:`,a instanceof Error?a.message:a)}),c-=1)}}(),{session:d,realSessionId:e,created:!0}}catch(a){try{Q.dispose()}catch{}try{R()}catch{}throw a}})().finally(()=>{clearTimeout(J),clearTimeout(j),z.delete(a),O()}),Q=Promise.race([P,new Promise((b,c)=>{j=setTimeout(()=>{M=!0,I.abort(),z.delete(a),O(),c(Error("Session startup timed out after 60s (extension/resource binding may be hung); the start lock was released — retry the request to start over."))},6e4)})]);return P.then(()=>{},()=>{}),z.set(a,Q),Q}d()}catch(a){d(a)}})},12394:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{B:()=>p,createAsyncBashTools:()=>n});var e=c(31421),f=c(81186),g=c(75430),h=c(45399),i=a([f,g]);[f,g]=i.then?(await i)():i;class o{append(a){for(this.totalBytes+=a.length,this.tail.push(a),this.tailBytes+=a.length;this.tailBytes>258048&&this.tail.length>1;){let a=this.tail.shift();this.tailBytes-=a.length}if(this.headBytes<4096){let b=4096-this.headBytes;a.length<=b?(this.head.push(a),this.headBytes+=a.length):(this.head.push(a.subarray(0,b)),this.headBytes=4096)}}get hasOmission(){return this.totalBytes>this.headBytes+this.tailBytes}get omittedBytes(){return Math.max(0,this.totalBytes-this.headBytes-this.tailBytes)}toSnapshot(){if(!this.hasOmission)return Buffer.concat(this.tail).toString("utf-8");let a=[...this.head];return a.push(Buffer.from(`
|
|
5
5
|
... ${this.omittedBytes} bytes omitted ...
|
|
6
6
|
|
|
7
7
|
`)),a.push(...this.tail),Buffer.concat(a).toString("utf-8")}reset(){this.head=[],this.tail=[],this.headBytes=0,this.tailBytes=0,this.totalBytes=0}constructor(){this.head=[],this.tail=[],this.headBytes=0,this.tailBytes=0,this.totalBytes=0}}function j(a){if("win32"===process.platform)try{(0,e.spawn)("taskkill",["/F","/T","/PID",String(a)],{stdio:"ignore",detached:!0,windowsHide:!0})}catch{}else try{process.kill(-a,"SIGKILL")}catch{try{process.kill(a,"SIGKILL")}catch{}}}class p{spawn(a,b,c){let d,f=this.nextId++,h=(0,g.getShellConfig)(),i="stdin"===h.commandTransport,j=i?h.args:[...h.args,a],k=(0,e.spawn)(h.shell,j,{cwd:b,detached:"win32"!==process.platform,env:{...c,NO_COLOR:"1",TERM:"dumb"},stdio:["pipe","pipe","pipe"],windowsHide:!0});k.stdin?.on("error",()=>{}),i&&k.stdin?.end(a);let l=new Promise(a=>{d=a}),m={id:f,child:k,command:a,cwd:b,startedAt:Date.now(),buffer:new o,deltaBuffer:new o,exitCode:null,exited:!1,settled:l},n=a=>{m.buffer.append(a),m.deltaBuffer.append(a)};return k.stdout?.on("data",n),k.stderr?.on("data",n),k.once("exit",a=>{m.exited=!0,m.exitCode=a}),k.once("close",()=>d()),k.once("error",a=>{m.exited=!0;let b=Buffer.from(`
|