@baique/pi-web-sky 0.1.60 → 0.1.61
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 +6 -6
- package/.next/build-manifest.json +2 -2
- 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 +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/agent/running/route.js +1 -1
- package/.next/server/app/api/app-update/route.js +1 -1
- package/.next/server/app/api/sessions/route.js +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +4 -4
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/page.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +6 -6
- package/.next/server/chunks/1937.js +1 -1
- package/.next/server/chunks/402.js +8 -8
- package/.next/server/chunks/542.js +1 -1
- package/.next/server/chunks/6429.js +1 -1
- package/.next/server/chunks/6525.js +4 -4
- package/.next/server/chunks/6583.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/static/chunks/app/{layout-772dd85585321723.js → layout-58dd6111497e161d.js} +1 -1
- package/.next/static/chunks/app/{page-c0fcc5519c551d52.js → page-9bbf25bd34fa91f1.js} +2 -2
- package/.next/trace +7 -7
- package/.next/trace-build +1 -1
- package/lib/board-types.ts +6 -0
- package/lib/rpc-manager.title.test.mjs +128 -0
- package/lib/rpc-manager.ts +25 -0
- package/lib/session-index-scanner.test.mjs +25 -0
- package/lib/session-index-scanner.ts +9 -0
- package/lib/session-list-signal.test.mjs +50 -0
- package/lib/session-list-signal.ts +32 -0
- package/lib/session-reader.ts +5 -6
- package/lib/task-store.ts +5 -3
- package/package.json +1 -1
- /package/.next/static/{8BGmvqU4qqWNmMv2mieIS → ImiqQqbpF4KxeBm1KeB5N}/_buildManifest.js +0 -0
- /package/.next/static/{8BGmvqU4qqWNmMv2mieIS → ImiqQqbpF4KxeBm1KeB5N}/_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}},"57121":{"*":{"id":"35421","name":"*","chunks":[],"async":false}},"57788":{"*":{"id":"19102","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}},"86869":{"*":{"id":"74661","name":"*","chunks":[],"async":false}},"90484":{"*":{"id":"70664","name":"*","chunks":[],"async":false}},"97290":{"*":{"id":"49850","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/Users/baique/work/pi-web-sky/node_modules/next/dist/client/components/builtin/global-error.js":{"id":27123,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/esm/client/components/builtin/global-error.js":{"id":27123,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/client/components/client-page.js":{"id":61304,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/esm/client/components/client-page.js":{"id":61304,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/client/components/client-segment.js":{"id":78616,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/esm/client/components/client-segment.js":{"id":78616,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js":{"id":64777,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js":{"id":64777,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/client/components/layout-router.js":{"id":57121,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/esm/client/components/layout-router.js":{"id":57121,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/client/components/render-from-template-context.js":{"id":74581,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":74581,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/lib/framework/boundary-components.js":{"id":90484,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/esm/lib/framework/boundary-components.js":{"id":90484,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/lib/metadata/generate/icon-mark.js":{"id":86869,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js":{"id":86869,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/components/PwaRegistration.tsx":{"id":57788,"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}},"57121":{"*":{"id":"35421","name":"*","chunks":[],"async":false}},"57788":{"*":{"id":"19102","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}},"86869":{"*":{"id":"74661","name":"*","chunks":[],"async":false}},"90484":{"*":{"id":"70664","name":"*","chunks":[],"async":false}},"97290":{"*":{"id":"49850","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/Users/baique/work/pi-web-sky/node_modules/next/dist/client/components/builtin/global-error.js":{"id":27123,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/esm/client/components/builtin/global-error.js":{"id":27123,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/client/components/client-page.js":{"id":61304,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/esm/client/components/client-page.js":{"id":61304,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/client/components/client-segment.js":{"id":78616,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/esm/client/components/client-segment.js":{"id":78616,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/client/components/http-access-fallback/error-boundary.js":{"id":64777,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/esm/client/components/http-access-fallback/error-boundary.js":{"id":64777,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/client/components/layout-router.js":{"id":57121,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/esm/client/components/layout-router.js":{"id":57121,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/client/components/render-from-template-context.js":{"id":74581,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":74581,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/lib/framework/boundary-components.js":{"id":90484,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/esm/lib/framework/boundary-components.js":{"id":90484,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/lib/metadata/generate/icon-mark.js":{"id":86869,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/dist/esm/lib/metadata/generate/icon-mark.js":{"id":86869,"name":"*","chunks":[],"async":false},"/Users/baique/work/pi-web-sky/components/PwaRegistration.tsx":{"id":57788,"name":"*","chunks":["7177","static/chunks/app/layout-58dd6111497e161d.js"],"async":false},"/Users/baique/work/pi-web-sky/node_modules/next/font/google/target.css?{\"path\":\"app/layout.tsx\",\"import\":\"Noto_Sans_Mono\",\"arguments\":[{\"subsets\":[\"latin\",\"cyrillic\"],\"variable\":\"--font-noto-mono\",\"display\":\"swap\"}],\"variableName\":\"notoSansMono\"}":{"id":83683,"name":"*","chunks":["7177","static/chunks/app/layout-58dd6111497e161d.js"],"async":false},"/Users/baique/work/pi-web-sky/node_modules/katex/dist/katex.min.css":{"id":84559,"name":"*","chunks":["7177","static/chunks/app/layout-58dd6111497e161d.js"],"async":false},"/Users/baique/work/pi-web-sky/app/globals.css":{"id":66872,"name":"*","chunks":["7177","static/chunks/app/layout-58dd6111497e161d.js"],"async":false},"/Users/baique/work/pi-web-sky/app/settings.css":{"id":39979,"name":"*","chunks":["7177","static/chunks/app/layout-58dd6111497e161d.js"],"async":false},"/Users/baique/work/pi-web-sky/components/AppShell.tsx":{"id":97290,"name":"*","chunks":["7330","static/chunks/d3ac728e-7964f816a1ca64e5.js","5362","static/chunks/5362-7d57fb3b2e15c9a1.js","8974","static/chunks/app/page-9bbf25bd34fa91f1.js"],"async":false},"/Users/baique/work/pi-web-sky/hooks/useI18n.tsx":{"id":39247,"name":"*","chunks":["7330","static/chunks/d3ac728e-7964f816a1ca64e5.js","5362","static/chunks/5362-7d57fb3b2e15c9a1.js","8974","static/chunks/app/page-9bbf25bd34fa91f1.js"],"async":false}},"entryCSSFiles":{"/Users/baique/work/pi-web-sky/":[],"/Users/baique/work/pi-web-sky/app/layout":[{"inlined":false,"path":"static/css/88714c00e109ce28.css"},{"inlined":false,"path":"static/css/21bd3ff21f2866ac.css"},{"inlined":false,"path":"static/css/bb9361c7f832a89d.css"}],"/Users/baique/work/pi-web-sky/app/page":[{"inlined":false,"path":"static/css/46396d55066d14af.css"}]},"rscModuleMapping":{"27123":{"*":{"id":"95547","name":"*","chunks":[],"async":false}},"39247":{"*":{"id":"73884","name":"*","chunks":[],"async":false}},"39979":{"*":{"id":"77261","name":"*","chunks":[],"async":false}},"57121":{"*":{"id":"98099","name":"*","chunks":[],"async":false}},"57788":{"*":{"id":"81276","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}},"86869":{"*":{"id":"36675","name":"*","chunks":[],"async":false}},"90484":{"*":{"id":"98562","name":"*","chunks":[],"async":false}},"97290":{"*":{"id":"35790","name":"*","chunks":[],"async":false}}},"edgeRscModuleMapping":{}};
|
|
@@ -26,16 +26,16 @@
|
|
|
26
26
|
"/api/agent/running/route": "app/api/agent/running/route.js",
|
|
27
27
|
"/api/auth/all-providers/route": "app/api/auth/all-providers/route.js",
|
|
28
28
|
"/api/agent/[id]/events/route": "app/api/agent/[id]/events/route.js",
|
|
29
|
+
"/api/auth/api-key/[provider]/route": "app/api/auth/api-key/[provider]/route.js",
|
|
29
30
|
"/api/app-update/route": "app/api/app-update/route.js",
|
|
30
|
-
"/api/auth/logout/[provider]/route": "app/api/auth/logout/[provider]/route.js",
|
|
31
31
|
"/api/agent/new/route": "app/api/agent/new/route.js",
|
|
32
|
-
"/api/auth/
|
|
32
|
+
"/api/auth/logout/[provider]/route": "app/api/auth/logout/[provider]/route.js",
|
|
33
33
|
"/api/auth/providers/route": "app/api/auth/providers/route.js",
|
|
34
34
|
"/api/auth/login/[provider]/route": "app/api/auth/login/[provider]/route.js",
|
|
35
35
|
"/api/board-assets/[...path]/route": "app/api/board-assets/[...path]/route.js",
|
|
36
36
|
"/api/board-assets/route": "app/api/board-assets/route.js",
|
|
37
|
-
"/api/boards/[id]/add-session/route": "app/api/boards/[id]/add-session/route.js",
|
|
38
37
|
"/api/boards/[id]/reconcile/route": "app/api/boards/[id]/reconcile/route.js",
|
|
38
|
+
"/api/boards/[id]/add-session/route": "app/api/boards/[id]/add-session/route.js",
|
|
39
39
|
"/api/boards/[id]/route": "app/api/boards/[id]/route.js",
|
|
40
40
|
"/api/boards/reorder/route": "app/api/boards/reorder/route.js",
|
|
41
41
|
"/api/boards/route": "app/api/boards/route.js",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"/api/project-trust/route": "app/api/project-trust/route.js",
|
|
48
48
|
"/api/search/route": "app/api/search/route.js",
|
|
49
49
|
"/api/mcp/route": "app/api/mcp/route.js",
|
|
50
|
+
"/api/quota/route": "app/api/quota/route.js",
|
|
50
51
|
"/api/plugins/route": "app/api/plugins/route.js",
|
|
51
52
|
"/api/sessions/[id]/export/route": "app/api/sessions/[id]/export/route.js",
|
|
52
53
|
"/api/sessions/route": "app/api/sessions/route.js",
|
|
@@ -54,10 +55,9 @@
|
|
|
54
55
|
"/api/skills/check/route": "app/api/skills/check/route.js",
|
|
55
56
|
"/api/skills/install/route": "app/api/skills/install/route.js",
|
|
56
57
|
"/api/skills/route": "app/api/skills/route.js",
|
|
57
|
-
"/api/quota/route": "app/api/quota/route.js",
|
|
58
58
|
"/api/skills/update/route": "app/api/skills/update/route.js",
|
|
59
|
-
"/api/skills/search/route": "app/api/skills/search/route.js",
|
|
60
59
|
"/api/subagents/[id]/route": "app/api/subagents/[id]/route.js",
|
|
60
|
+
"/api/skills/search/route": "app/api/skills/search/route.js",
|
|
61
61
|
"/api/subagents/settings/route": "app/api/subagents/settings/route.js",
|
|
62
62
|
"/api/subagents/profiles/route": "app/api/subagents/profiles/route.js",
|
|
63
63
|
"/api/task-card-questions/[id]/answer/route": "app/api/task-card-questions/[id]/answer/route.js",
|
|
@@ -69,8 +69,8 @@
|
|
|
69
69
|
"/api/task-cards/route": "app/api/task-cards/route.js",
|
|
70
70
|
"/api/tasks/reorder/route": "app/api/tasks/reorder/route.js",
|
|
71
71
|
"/api/tasks/route": "app/api/tasks/route.js",
|
|
72
|
-
"/api/terminal/[id]/events/route": "app/api/terminal/[id]/events/route.js",
|
|
73
72
|
"/api/terminal/[id]/route": "app/api/terminal/[id]/route.js",
|
|
73
|
+
"/api/terminal/[id]/events/route": "app/api/terminal/[id]/events/route.js",
|
|
74
74
|
"/api/terminal/route": "app/api/terminal/route.js",
|
|
75
75
|
"/api/yjs-version/route": "app/api/yjs-version/route.js",
|
|
76
76
|
"/page": "app/page.js"
|
|
@@ -24,4 +24,4 @@
|
|
|
24
24
|
first_message = COALESCE(session_meta.first_message, excluded.first_message),
|
|
25
25
|
parent_id = excluded.parent_id,
|
|
26
26
|
created = excluded.created,
|
|
27
|
-
modified = excluded.modified`).run(a,b.taskId??null,Date.now(),b.path,b.cwd,b.projectKey,b.title??null,b.firstMessage??null,b.parentId??null,Date.now(),Date.now()),j()}async function o(a){if((0,e.Lf)().prepare("SELECT 1 FROM session_meta WHERE session_id = ?").get(a))return!0;let{resolveSessionPath:b,resolveSessionIdByPath:d}=await Promise.resolve().then(c.bind(c,69453)),i=await b(a);if(!i)return console.error(`[pi-web] 会话行补建失败:找不到会话文件 session=${a}`),!1;let j=(0,g.GL)(i);if(!j)return console.error(`[pi-web] 会话行补建失败:会话文件无有效 header session=${a} path=${i}`),!1;let k=await (0,h.KI)(j.cwd),l=j.parentSessionPath?await d(j.parentSessionPath)??void 0:void 0;return n(a,{path:i,cwd:j.cwd,projectKey:(0,f.z)(k?.projectRoot??j.cwd),parentId:l,firstMessage:j.firstMessage||void 0}),!0}async function p(a,b){let c=(0,e.Lf)();if(!(0,e.Lf)().prepare("SELECT id, project_key AS projectKey, name, created, updated, pinned, sort_order AS sortOrder FROM tasks WHERE id = ?").get(b)||!await o(a))return!1;if(function(a,b){let c=new Map,d=new Map;for(let a of(0,e.Lf)().prepare("SELECT session_id, parent_id, task_id FROM session_meta").all())c.set(a.session_id,a.parent_id),d.set(a.session_id,a.task_id);let f=new Set([a]),g=c.get(a)??null;for(;g&&!f.has(g);){f.add(g);let a=d.get(g)??null;if(null!==a&&a!==b)return!0;g=c.get(g)??null}return!1}(a,b))return console.error(`[pi-web] 归属被拒绝:祖先属于其它任务 session=${a} task=${b}`),!1;let d=Date.now();c.exec("BEGIN");try{c.prepare("UPDATE session_meta SET task_id = ?, updated = ? WHERE session_id = ?").run(b,d,a),c.prepare("UPDATE tasks SET updated = ? WHERE id = ?").run(d,b),c.exec("COMMIT")}catch(a){throw c.exec("ROLLBACK"),a}return j(),!0}async function q(a,b){await o(a)&&((0,e.Lf)().prepare("UPDATE session_meta SET title = ?, updated = ? WHERE session_id = ?").run(b,Date.now(),a),j())}function r(a,b=Date.now()){(0,e.Lf)().prepare("UPDATE session_meta SET modified = ? WHERE session_id = ?").run(b,a),j()}function s(a,b){let c=b.lastReply.trim();if(!c)return void r(a,b.at);let d=c.length>4e3?c.slice(0,4e3):c;(0,e.Lf)().prepare("UPDATE session_meta SET last_reply = ?, modified = ? WHERE session_id = ?").run(d,b.at,a),j()}function t(a,b){let c=b.trim();c
|
|
27
|
+
modified = excluded.modified`).run(a,b.taskId??null,Date.now(),b.path,b.cwd,b.projectKey,b.title??null,b.firstMessage??null,b.parentId??null,Date.now(),Date.now()),j()}async function o(a){if((0,e.Lf)().prepare("SELECT 1 FROM session_meta WHERE session_id = ?").get(a))return!0;let{resolveSessionPath:b,resolveSessionIdByPath:d}=await Promise.resolve().then(c.bind(c,69453)),i=await b(a);if(!i)return console.error(`[pi-web] 会话行补建失败:找不到会话文件 session=${a}`),!1;let j=(0,g.GL)(i);if(!j)return console.error(`[pi-web] 会话行补建失败:会话文件无有效 header session=${a} path=${i}`),!1;let k=await (0,h.KI)(j.cwd),l=j.parentSessionPath?await d(j.parentSessionPath)??void 0:void 0;return n(a,{path:i,cwd:j.cwd,projectKey:(0,f.z)(k?.projectRoot??j.cwd),parentId:l,firstMessage:j.firstMessage||void 0}),!0}async function p(a,b){let c=(0,e.Lf)();if(!(0,e.Lf)().prepare("SELECT id, project_key AS projectKey, name, created, updated, pinned, sort_order AS sortOrder FROM tasks WHERE id = ?").get(b)||!await o(a))return!1;if(function(a,b){let c=new Map,d=new Map;for(let a of(0,e.Lf)().prepare("SELECT session_id, parent_id, task_id FROM session_meta").all())c.set(a.session_id,a.parent_id),d.set(a.session_id,a.task_id);let f=new Set([a]),g=c.get(a)??null;for(;g&&!f.has(g);){f.add(g);let a=d.get(g)??null;if(null!==a&&a!==b)return!0;g=c.get(g)??null}return!1}(a,b))return console.error(`[pi-web] 归属被拒绝:祖先属于其它任务 session=${a} task=${b}`),!1;let d=Date.now();c.exec("BEGIN");try{c.prepare("UPDATE session_meta SET task_id = ?, updated = ? WHERE session_id = ?").run(b,d,a),c.prepare("UPDATE tasks SET updated = ? WHERE id = ?").run(d,b),c.exec("COMMIT")}catch(a){throw c.exec("ROLLBACK"),a}return j(),!0}async function q(a,b){await o(a)&&((0,e.Lf)().prepare("UPDATE session_meta SET title = ?, updated = ? WHERE session_id = ?").run(b,Date.now(),a),j())}function r(a,b=Date.now()){(0,e.Lf)().prepare("UPDATE session_meta SET modified = ? WHERE session_id = ?").run(b,a),j()}function s(a,b){let c=b.lastReply.trim();if(!c)return void r(a,b.at);let d=c.length>4e3?c.slice(0,4e3):c;(0,e.Lf)().prepare("UPDATE session_meta SET last_reply = ?, modified = ? WHERE session_id = ?").run(d,b.at,a),j()}function t(a,b){let c=b.trim();if(!c)return;let d=(0,e.Lf)().prepare("UPDATE session_meta SET first_message = ? WHERE session_id = ? AND (first_message IS NULL OR first_message = '')").run(c,a);Number(d.changes)>0&&j()}g=(i.then?(await i)():i)[0],d()}catch(a){d(a)}})},69453:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{O8:()=>u,mD:()=>o,resolveSessionIdByPath:()=>t,resolveSessionPath:()=>s});var e=c(75430),f=c(29021),g=c(79748),h=c(33873),i=c(90596);c(7535);var j=c(7561);c(88002);var k=c(9210),l=c(84377),m=c(16525),n=a([e,k,m]);function o(){(0,l.o)()}function p(){return globalThis.__piSessionPathCache||(globalThis.__piSessionPathCache=new Map),globalThis.__piSessionPathCache}function q(){return globalThis.__piPathToSessionIdCache||(globalThis.__piPathToSessionIdCache=new Map),globalThis.__piPathToSessionIdCache}async function r(a){let b,c=(0,h.join)((0,e.getAgentDir)(),"sessions");if(!a||!(0,f.existsSync)(c))return null;let d=`_${a}.jsonl`;try{b=await (0,g.readdir)(c,{withFileTypes:!0})}catch{return null}for(let e of b){let b;if(!e.isDirectory()&&!e.isSymbolicLink())continue;let i=(0,h.join)(c,e.name);try{b=await (0,g.readdir)(i)}catch{continue}let j=b.find(a=>a.endsWith(d));if(!j)continue;let k=(0,h.join)(i,j);try{if(function(a){let b=(0,f.openSync)(a,"r");try{let a=[],c=0,d=!1;for(;c<65536&&!d;){let e=Buffer.allocUnsafe(Math.min(4096,65536-c)),g=(0,f.readSync)(b,e,0,e.length,c);if(0===g)break;let h=e.subarray(0,g),i=h.indexOf(10);a.push(-1===i?h:h.subarray(0,i)),c+=g,d=-1!==i}if(!d&&c>=65536)return null;let e=Buffer.concat(a).toString("utf8").trimEnd();if(!e)return null;try{let a=JSON.parse(e);return"session"===a.type?a:null}catch{return null}}finally{(0,f.closeSync)(b)}}(k)?.id===a)return k}catch{}}return null}async function s(a){let b=p().get(a);if(b)return b;try{let b=(0,i.Lf)().prepare("SELECT path FROM session_meta WHERE session_id = ?").get(a);if(b?.path&&(0,f.existsSync)(b.path))return u(a,b.path),b.path}catch{}let c=await r(a);return c?(u(a,c),c):null}async function t(a){let b=(0,j.$)(a),c=q().get(b);if(c)return c;try{let c=(0,i.Lf)(),d=c.prepare("SELECT session_id, path FROM session_meta WHERE path = ?").get(a);if(d?.path)return u(d.session_id,d.path),d.session_id;let e=(0,h.basename)(a);if(e){for(let a of c.prepare("SELECT session_id, path FROM session_meta WHERE path LIKE ?").all(`%${e}`))if(a.path&&(0,j.$)(a.path)===b)return u(a.session_id,a.path),a.session_id}}catch{}}function u(a,b){let c=(0,h.normalize)(b),d=(0,j.$)(c),e=p(),f=q(),g=e.get(a),i=g?(0,j.$)(g):void 0,k=f.get(d),l=k?e.get(k):void 0;i&&i!==d&&f.get(i)===a&&f.delete(i),k&&k!==a&&l&&(0,j.$)(l)===d&&e.delete(k),e.set(a,c),f.set(d,a)}[e,k,m]=n.then?(await n)():n,d()}catch(a){d(a)}})},75384:(a,b,c)=>{c.d(b,{v$:()=>f}),c(55511);var d=c(90596);let e="__running__";function f(a){if(a===e)return{id:e,projectKey:"",name:"running",isSystem:!0,taskId:null,sortOrder:0,created:0,updated:0};let b=(0,d.Lf)().prepare("SELECT id, project_key AS projectKey, name, is_system AS isSystem, task_id AS taskId, sort_order AS sortOrder, created, updated FROM boards WHERE id = ?").get(a);return b?{id:b.id,projectKey:b.projectKey,name:b.name,isSystem:1===b.isSystem,taskId:b.taskId,sortOrder:b.sortOrder,created:b.created,updated:b.updated}:void 0}c(48817)},85158:(a,b,c)=>{c.d(b,{U4:()=>j,dp:()=>f,oT:()=>k,zZ:()=>g});var d=c(55511),e=c(90596);let f=3e4;function g(){return globalThis.__piWebInstanceId||(globalThis.__piWebInstanceId=(0,d.randomUUID)()),globalThis.__piWebInstanceId}function h(){return Date.now()}function i(){return(0,e.Lf)().prepare("SELECT id, instance_id, registered_at, heartbeat FROM scheduler_leader WHERE id = 1").get()}function j(a){let b=(0,e.Lf)(),c=h(),d=i();return d?d.instance_id===a?Number(b.prepare("UPDATE scheduler_leader SET heartbeat = ? WHERE id = 1 AND instance_id = ?").run(c,a).changes)>0:!(h()-d.heartbeat<f)&&Number(b.prepare("UPDATE scheduler_leader SET instance_id = ?, registered_at = ?, heartbeat = ? WHERE id = 1 AND instance_id = ? AND heartbeat = ?").run(a,c,c,d.instance_id,d.heartbeat).changes)>0:Number(b.prepare("INSERT INTO scheduler_leader (id, instance_id, registered_at, heartbeat) VALUES (1, ?, ?, ?)").run(a,c,c).changes)>0}function k(){let a=i();return!!a&&a.instance_id===g()&&h()-a.heartbeat<f}}};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
"use strict";exports.id=402,exports.ids=[402],exports.modules={9202:(a,b,c)=>{c.d(b,{Ql:()=>i,Y0:()=>e,aO:()=>k,cn:()=>f,mU:()=>l,sT:()=>d,xw:()=>n});let d="pi-todo.state",e="todo",f=["pending","in_progress","completed"];function g(a){return"string"==typeof a&&f.includes(a)}function h(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function i(a){return a.some(a=>"completed"!==a.status)}function j(a,b){let c=a.trim();if(0===c.length)throw Error(`${b} cannot be empty or whitespace-only`);return c}function k(a){if(!h(a)||!Array.isArray(a.todos))return null;let b=[];for(let c of a.todos)h(c)&&"number"==typeof c.id&&Number.isFinite(c.id)&&"string"==typeof c.content&&0!==c.content.length&&g(c.status)&&b.push({id:c.id,content:c.content,status:c.status});let c=b.reduce((a,b)=>Math.max(a,b.id),0);return{todos:b,nextId:"number"==typeof a.nextId&&a.nextId>c?a.nextId:c+1}}function l(a){let b="completed"===a.status?"x":"in_progress"===a.status?"~":" ";return`[${b}] #${a.id}: ${a.content}`}function m(a,b){if(0===b.length)throw Error("update requires at least status or text parameter");let c=new Set;for(let d of b){if(c.has(d.id))throw Error(`duplicate id ${d.id} in updates`);if(c.add(d.id),void 0===d.status&&void 0===d.text)throw Error(`update item for id ${d.id} has neither status nor text`);if(void 0!==d.status&&!g(d.status))throw Error(`status only accepts ${f.join(" / ")}`);if(void 0!==d.text&&j(d.text,`update item id ${d.id}: text`),!a.todos.some(a=>a.id===d.id))throw Error(`Todo #${d.id} not found`)}return{snapshot:{todos:a.todos.map(a=>{let c=b.find(b=>b.id===a.id);return c?{...a,...void 0!==c.status?{status:c.status}:{},...void 0!==c.text?{content:c.text.trim()}:{}}:a}),nextId:a.nextId},resultText:`Updated ${b.length} todo(s)`}}function n(a,b){switch(a.action){case"list":var c;return{action:"list",snapshot:b,resultText:(c=b.todos).length>0?c.map(l).join("\n"):"No todos"};case"add":{if(void 0!==a.text&&void 0!==a.texts)throw Error('add only accepts texts array; do not also pass singular "text"');if(void 0!==a.text)throw Error('add needs texts (array). You passed singular "text" — that field is for update. Correct: {"action":"add","texts":["<your text>"]}');let{snapshot:c,resultText:d}=function(a,b){if(0===b.length)throw Error('add requires texts parameter (non-empty array). Correct: {"action":"add","texts":["..."]}');let c=b.map(a=>j(a,"texts item")),d=a.nextId,e=c.map((a,b)=>({id:d+b,content:a,status:"pending"})),f=d+e.length;return{snapshot:{todos:[...a.todos,...e],nextId:f},resultText:`Added ${e.length} todos (#${d}-#${f-1})`}}(b,a.texts??[]);return{action:"add",snapshot:c,resultText:d}}case"update":{if(void 0!==a.updates&&a.updates.length>0){let{snapshot:c,resultText:d}=m(b,a.updates);return{action:"update",snapshot:c,resultText:d}}if(void 0===a.id)throw Error('update requires id parameter. Correct: {"action":"update","id":1,"status":"in_progress"}');let{snapshot:c,resultText:d}=m(b,[{id:a.id,...void 0!==a.status?{status:a.status}:{},...void 0!==a.text?{text:a.text}:{}}]);return{action:"update",snapshot:c,resultText:d}}case"delete":{if(void 0===a.ids||0===a.ids.length){if(void 0!==a.id)throw Error('delete needs ids (array). You passed singular "id". Correct: {"action":"delete","ids":[1]}');throw Error('delete requires ids parameter (non-empty array). Correct: {"action":"delete","ids":[1]}')}let{snapshot:c,resultText:d}=function(a,b){if(0===b.length)throw Error('delete requires ids parameter (non-empty array). Correct: {"action":"delete","ids":[1]}');for(let c of b)if(!a.todos.some(a=>a.id===c))throw Error(`Todo #${c} not found`);let c=new Set(b);return{snapshot:{todos:a.todos.filter(a=>!c.has(a.id)),nextId:a.nextId},resultText:`Deleted ${b.length} todo(s)`}}(b,a.ids);return{action:"delete",snapshot:c,resultText:d}}default:throw Error(`Unknown action: ${String(a.action)}`)}}},12039:(a,b,c)=>{function d(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function e(a){return function(a,b={}){if("assistant"!==a.role)return a;let c=a.content;if(!Array.isArray(c))return a;let e=c.map(a=>(function(a,b={}){if(!d(a)||"toolCall"!==a.type)return null;let c={type:"toolCall",toolCallId:"string"==typeof a.toolCallId?a.toolCallId:"string"==typeof a.id?a.id:"",toolName:"string"==typeof a.toolName?a.toolName:"string"==typeof a.name?a.name:"",input:"object"!=typeof a.input||null===a.input||Array.isArray(a.input)?"object"!=typeof a.arguments||null===a.arguments||Array.isArray(a.arguments)?{}:a.arguments:a.input},e=b.includeStreamingRawInput?function(a){if("string"==typeof a.rawInput)return a.rawInput;if("string"==typeof a.partialJson)return a.partialJson;if("string"==typeof a.partialArgs)return a.partialArgs;let b=d(a.customInput)?a.customInput:null,c=b&&"string"==typeof b.property?b.property:null,e=d(a.arguments)?a.arguments:null;return c&&e&&"string"==typeof e[c]?e[c]:void 0}(a):void 0;return void 0===e?c:{...c,rawInput:e}})(a,b)??a);return{...a,content:e}}(a)}c.d(b,{B:()=>e})},24923:(a,b,c)=>{c.d(b,{IL:()=>u,KI:()=>o,P9:()=>q,Rl:()=>l,l:()=>t,xw:()=>s});var d=c(79646),e=c(29021),f=c(33873),g=c(28354),h=c(25252),i=c(58864);let j=(0,g.promisify)(d.execFile);function k(){globalThis.__piProjectCache?.clear()}async function l(a){return(0,e.existsSync)(a)?a:(await o(a)).projectRoot||a}async function m(a,b){let{stdout:c}=await j("git",["-C",a,...b],{timeout:1e4,maxBuffer:1048576,env:{...process.env,LC_ALL:"C"}});return c.trim()}function n(a){try{return(0,e.realpathSync)(a)}catch{return a}}async function o(a){let b,c=(globalThis.__piProjectCache||(globalThis.__piProjectCache=new Map),globalThis.__piProjectCache),d=c.get(a);if(d&&d.expiresAt>Date.now())return d.info;try{if(!(0,e.existsSync)(a))return b=function(a){let b=(0,f.dirname)(a);if(!b.endsWith("-worktrees"))return null;let c=b.slice(0,-10);return c&&(0,e.existsSync)((0,f.join)(c,".git"))?{projectRoot:n(c),branch:(0,f.basename)(a),isWorktree:!0,isTopLevel:!0}:null}(a)??{projectRoot:a,branch:null,isWorktree:!1,isTopLevel:!1},c.set(a,{info:b,expiresAt:Date.now()+6e4}),b;let[d,g,h,j]=(await m(a,["rev-parse","--path-format=absolute","--git-common-dir","--git-dir","--show-toplevel","--abbrev-ref","HEAD"])).split("\n").map(a=>a.trim()),[k,l,o]=[d,g,h].map(i.gB),p=n(a),q=(0,i.Eb)(o,p),r=!(0,i.Eb)(l,k)&&q,s=r?(0,f.dirname)(k):o;b={projectRoot:q?n(s):a,branch:j&&"HEAD"!==j?j:null,isWorktree:r,isTopLevel:q}}catch{b={projectRoot:a,branch:null,isWorktree:!1,isTopLevel:!1}}return c.set(a,{info:b,expiresAt:Date.now()+6e4}),b}async function p(a){let b=await m(a,["rev-parse","--path-format=absolute","--git-common-dir"]);return n((0,f.dirname)((0,i.gB)(b)))}async function q(a){let b=await m(a,["worktree","list","--porcelain"]),c=[],d=null,f=()=>{d?.path&&!d.prunable&&(0,e.existsSync)(d.path)&&c.push({path:d.path,branch:d.branch??null,isMain:0===c.length}),d=null};for(let a of b.split("\n"))a.startsWith("worktree ")?(f(),d={path:(0,i.gB)(a.slice(9).trim())}):a.startsWith("branch ")&&d?d.branch=a.slice(7).trim().replace(/^refs\/heads\//,""):a.startsWith("prunable")&&d?d.prunable=!0:""===a.trim()&&f();return f(),c}function r(a,b){return a.find(a=>(0,i.Eb)(a.path,b))}function s(a,b){return r(a,n(b))?.path??null}async function t(a,b){let c=b.trim();if(!c)throw Error("Branch name is required");let d=c.replace(/[\/\\:*?"<>|\s]+/g,"-").replace(/^-+|-+$/g,"");if(!d)throw Error(`Invalid branch name: ${b}`);let g=await p(a),i=`${(0,f.resolve)(g)}-worktrees`,j=(0,f.join)(i,d);if((0,e.existsSync)(j))throw Error(`Directory already exists: ${j}`);(0,e.mkdirSync)(i,{recursive:!0});let l=!1;try{await m(g,["rev-parse","--verify","--quiet",`refs/heads/${c}`]),l=!0}catch{l=!1}try{l?await m(g,["worktree","add","--",j,c]):await m(g,["worktree","add","-b",c,"--",j])}catch(a){throw Error(v(a))}return(0,h.wz)(j),k(),{path:j,branch:c}}async function u(a,b,c=!1){let d=r(await q(a),b);if(!d)throw Error(`Not a worktree of this repository: ${b}`);if(d.isMain)throw Error("Cannot remove the main worktree");try{await m(a,["worktree","remove",...c?["--force"]:[],d.path])}catch(a){throw Error(v(a))}k()}function v(a){let b=a.stderr;return"string"==typeof b&&b.trim()?b.trim():a instanceof Error?a.message:String(a)}},25252:(a,b,c)=>{c.d(b,{HM:()=>f,Nw:()=>e,wz:()=>g});var d=c(58864);function e(a){return(0,d.W3)(a)}function f(){return globalThis.__piAdditionalAllowedRoots||(globalThis.__piAdditionalAllowedRoots=new Set),globalThis.__piAdditionalAllowedRoots}function g(a){if(!a)return;let b=e(a);f().add(b),globalThis.__piAllowedRootsCache?.roots.add(b)}},27631:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{GL:()=>m,Jp:()=>r,M_:()=>p,XK:()=>s,pu:()=>o});var e=c(29021),f=c(79748),g=c(33873),h=c(75430),i=a([h]);h=(i.then?(await i)():i)[0];let s=300;function j(a){if(!a.trim())return null;try{return JSON.parse(a)}catch{return null}}function k(a){let b=a.content;return"string"==typeof b?b:Array.isArray(b)?b.filter(a=>a&&"text"===a.type&&"string"==typeof a.text).map(a=>a.text).join(" "):""}function l(a,b){let c;try{c=(0,e.openSync)(a,"r")}catch{return null}try{let a=Math.min(4096,b),d="",f=null,g="";for(;;){let h=Buffer.alloc(a);(0,e.readSync)(c,h,0,a,0);let i=h.toString("utf8"),l=i.lastIndexOf("\n"),m=-1===l?i.length:l+1;for(let a of(d+=i.slice(0,m)).split("\n")){let b=j(a);if(b){if(!f){if("session"!==b.type)return null;f=b;continue}if("message"===b.type&&b.message?.role==="user"){let a=k(b.message).trim();if(a){g=a.slice(0,s);break}}}}if(!f)return null;if(g||a>=49152||a>=b||(a=Math.min(2*a,49152,b))<=0)break}return{header:f,firstMessage:g}}catch(b){return console.warn(`[pi-web] 会话头部读取失败 path=${a}:`,b instanceof Error?b.message:String(b)),null}finally{try{(0,e.closeSync)(c)}catch{}}}function m(a){let b;try{b=(0,e.statSync)(a)}catch{return null}if(!b.isFile()||0===b.size)return null;let c=l(a,b.size);if(!c)return null;let{header:d,firstMessage:f}=c,g="string"==typeof d.id?d.id:"";if(!g)return null;let h=new Date("string"==typeof d.timestamp?d.timestamp:"");return Number.isNaN(h.getTime())&&h.setTime(b.mtime.getTime()),{path:a,id:g,cwd:"string"==typeof d.cwd?d.cwd:"",created:h,firstMessage:f||"",parentSessionPath:"string"==typeof d.parentSession?d.parentSession:void 0}}function n(a,b){let c,d={name:void 0,lastReply:""};if(b<=0)return d;try{c=(0,e.openSync)(a,"r")}catch{return null}try{let a=b;for(let b=0;b<256&&a>0;b++){let b=Math.max(0,a-65536),f=a-b,g=Buffer.alloc(f);(0,e.readSync)(c,g,0,f,b);let h=g.toString("utf8").split("\n");for(let a=h.length-1;a>=1;a--){if(void 0!==d.name&&d.lastReply)continue;let b=j(h[a]);if(b){if(void 0===d.name&&"session_info"===b.type&&"string"==typeof b.name){let a=b.name.trim();a&&(d.name=a)}else if(!d.lastReply&&"message"===b.type&&b.message?.role==="assistant"){let a=k(b.message).trim();a&&(d.lastReply=a)}if(void 0!==d.name&&d.lastReply)break}}a=b}return d}catch(b){return console.warn(`[pi-web] 会话尾部读取失败 path=${a}:`,b instanceof Error?b.message:String(b)),null}finally{try{(0,e.closeSync)(c)}catch{}}}function o(a){try{let b=(0,e.statSync)(a);if(!b.isFile()||0===b.size)return null;return n(a,b.size)}catch{return null}}function p(a){let b;try{b=(0,e.statSync)(a)}catch{return null}if(!b.isFile()||0===b.size)return null;let c=l(a,b.size);if(!c)return null;let{header:d,firstMessage:f}=c,g="string"==typeof d.id?d.id:"";if(!g)return null;let h=new Date("string"==typeof d.timestamp?d.timestamp:"");Number.isNaN(h.getTime())&&h.setTime(b.mtime.getTime());let i=n(a,b.size)??{name:void 0,lastReply:""};return{path:a,id:g,cwd:"string"==typeof d.cwd?d.cwd:"",name:i.name,created:h,modified:b.mtime,firstMessage:f||"(no messages)",lastReply:i.lastReply,parentSessionPath:"string"==typeof d.parentSession?d.parentSession:void 0}}async function q(a,b,c){let d;try{d=await (0,f.readdir)(a,{withFileTypes:!0})}catch{return}for(let f of d){let d;if(f.name.startsWith("."))continue;let h=(0,g.join)(a,f.name);if(f.isDirectory()){b<6&&await q(h,b+1,c);continue}if(f.name.endsWith(".jsonl")){try{d=(0,e.statSync)(h)}catch{continue}d.isFile()&&0!==d.size&&c.push({path:h,id:function(a){let b=a.slice(0,-6).split("_");if(b.length<2)return"";let c=b[b.length-1];return/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(c)&&!/^[0-9]+$/.test(c)?c:""}(f.name),modified:d.mtime})}}}async function r(a){let b,c=a??(0,g.join)((0,h.getAgentDir)(),"sessions");try{b=(await (0,f.readdir)(c,{withFileTypes:!0})).filter(a=>a.isDirectory()||a.isSymbolicLink()).map(a=>(0,g.join)(c,a.name))}catch{return[]}let d=[];for(let a of b)await q(a,1,d);return d.sort((a,b)=>b.modified.getTime()-a.modified.getTime()),d}d()}catch(a){d(a)}})},40402:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{B6:()=>L,BR:()=>F,DK:()=>H,G7:()=>x,Hh:()=>I,O5:()=>w,O8:()=>E,Uv:()=>J,ZN:()=>t,b4:()=>P,eP:()=>G,loadAllSessionIndex:()=>u,mD:()=>y,o0:()=>Q,resolveSessionIdByPath:()=>D,resolveSessionPath:()=>C,zH:()=>v});var e=c(75430),f=c(29021),g=c(79748),h=c(33873),i=c(9202),j=c(66737),k=c(12039),l=c(74244),m=c(45902),n=c(24923),o=c(27631),p=c(41306),q=a([e,o,p]);[e,o,p]=q.then?(await q)():q;let R="session_id, path, cwd, title, first_message, parent_id, created, modified, pinned, last_reply";function r(a){return{path:a.path??"",id:a.session_id,cwd:a.cwd??"",name:a.title??void 0,created:new Date(a.created??0).toISOString(),modified:new Date(a.modified??0).toISOString(),messageCount:0,firstMessage:a.first_message??"(no messages)",lastReply:a.last_reply??"",parentSessionId:a.parent_id??void 0,pinned:!!a.pinned}}async function s(a){let b;if(0===a.length)return[];try{b=(0,j.Lf)().prepare(`SELECT ${R}
|
|
2
|
-
FROM session_meta WHERE session_id IN (${a.map(()=>"?").join(",")})`).all(...a)}catch{return[]}let c=new Map(b.map(a=>[a.session_id,a])),d=[];for(let b of a){let a=c.get(b);a&&d.push(
|
|
1
|
+
"use strict";exports.id=402,exports.ids=[402],exports.modules={9202:(a,b,c)=>{c.d(b,{Ql:()=>i,Y0:()=>e,aO:()=>k,cn:()=>f,mU:()=>l,sT:()=>d,xw:()=>n});let d="pi-todo.state",e="todo",f=["pending","in_progress","completed"];function g(a){return"string"==typeof a&&f.includes(a)}function h(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function i(a){return a.some(a=>"completed"!==a.status)}function j(a,b){let c=a.trim();if(0===c.length)throw Error(`${b} cannot be empty or whitespace-only`);return c}function k(a){if(!h(a)||!Array.isArray(a.todos))return null;let b=[];for(let c of a.todos)h(c)&&"number"==typeof c.id&&Number.isFinite(c.id)&&"string"==typeof c.content&&0!==c.content.length&&g(c.status)&&b.push({id:c.id,content:c.content,status:c.status});let c=b.reduce((a,b)=>Math.max(a,b.id),0);return{todos:b,nextId:"number"==typeof a.nextId&&a.nextId>c?a.nextId:c+1}}function l(a){let b="completed"===a.status?"x":"in_progress"===a.status?"~":" ";return`[${b}] #${a.id}: ${a.content}`}function m(a,b){if(0===b.length)throw Error("update requires at least status or text parameter");let c=new Set;for(let d of b){if(c.has(d.id))throw Error(`duplicate id ${d.id} in updates`);if(c.add(d.id),void 0===d.status&&void 0===d.text)throw Error(`update item for id ${d.id} has neither status nor text`);if(void 0!==d.status&&!g(d.status))throw Error(`status only accepts ${f.join(" / ")}`);if(void 0!==d.text&&j(d.text,`update item id ${d.id}: text`),!a.todos.some(a=>a.id===d.id))throw Error(`Todo #${d.id} not found`)}return{snapshot:{todos:a.todos.map(a=>{let c=b.find(b=>b.id===a.id);return c?{...a,...void 0!==c.status?{status:c.status}:{},...void 0!==c.text?{content:c.text.trim()}:{}}:a}),nextId:a.nextId},resultText:`Updated ${b.length} todo(s)`}}function n(a,b){switch(a.action){case"list":var c;return{action:"list",snapshot:b,resultText:(c=b.todos).length>0?c.map(l).join("\n"):"No todos"};case"add":{if(void 0!==a.text&&void 0!==a.texts)throw Error('add only accepts texts array; do not also pass singular "text"');if(void 0!==a.text)throw Error('add needs texts (array). You passed singular "text" — that field is for update. Correct: {"action":"add","texts":["<your text>"]}');let{snapshot:c,resultText:d}=function(a,b){if(0===b.length)throw Error('add requires texts parameter (non-empty array). Correct: {"action":"add","texts":["..."]}');let c=b.map(a=>j(a,"texts item")),d=a.nextId,e=c.map((a,b)=>({id:d+b,content:a,status:"pending"})),f=d+e.length;return{snapshot:{todos:[...a.todos,...e],nextId:f},resultText:`Added ${e.length} todos (#${d}-#${f-1})`}}(b,a.texts??[]);return{action:"add",snapshot:c,resultText:d}}case"update":{if(void 0!==a.updates&&a.updates.length>0){let{snapshot:c,resultText:d}=m(b,a.updates);return{action:"update",snapshot:c,resultText:d}}if(void 0===a.id)throw Error('update requires id parameter. Correct: {"action":"update","id":1,"status":"in_progress"}');let{snapshot:c,resultText:d}=m(b,[{id:a.id,...void 0!==a.status?{status:a.status}:{},...void 0!==a.text?{text:a.text}:{}}]);return{action:"update",snapshot:c,resultText:d}}case"delete":{if(void 0===a.ids||0===a.ids.length){if(void 0!==a.id)throw Error('delete needs ids (array). You passed singular "id". Correct: {"action":"delete","ids":[1]}');throw Error('delete requires ids parameter (non-empty array). Correct: {"action":"delete","ids":[1]}')}let{snapshot:c,resultText:d}=function(a,b){if(0===b.length)throw Error('delete requires ids parameter (non-empty array). Correct: {"action":"delete","ids":[1]}');for(let c of b)if(!a.todos.some(a=>a.id===c))throw Error(`Todo #${c} not found`);let c=new Set(b);return{snapshot:{todos:a.todos.filter(a=>!c.has(a.id)),nextId:a.nextId},resultText:`Deleted ${b.length} todo(s)`}}(b,a.ids);return{action:"delete",snapshot:c,resultText:d}}default:throw Error(`Unknown action: ${String(a.action)}`)}}},12039:(a,b,c)=>{function d(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function e(a){return function(a,b={}){if("assistant"!==a.role)return a;let c=a.content;if(!Array.isArray(c))return a;let e=c.map(a=>(function(a,b={}){if(!d(a)||"toolCall"!==a.type)return null;let c={type:"toolCall",toolCallId:"string"==typeof a.toolCallId?a.toolCallId:"string"==typeof a.id?a.id:"",toolName:"string"==typeof a.toolName?a.toolName:"string"==typeof a.name?a.name:"",input:"object"!=typeof a.input||null===a.input||Array.isArray(a.input)?"object"!=typeof a.arguments||null===a.arguments||Array.isArray(a.arguments)?{}:a.arguments:a.input},e=b.includeStreamingRawInput?function(a){if("string"==typeof a.rawInput)return a.rawInput;if("string"==typeof a.partialJson)return a.partialJson;if("string"==typeof a.partialArgs)return a.partialArgs;let b=d(a.customInput)?a.customInput:null,c=b&&"string"==typeof b.property?b.property:null,e=d(a.arguments)?a.arguments:null;return c&&e&&"string"==typeof e[c]?e[c]:void 0}(a):void 0;return void 0===e?c:{...c,rawInput:e}})(a,b)??a);return{...a,content:e}}(a)}c.d(b,{B:()=>e})},24923:(a,b,c)=>{c.d(b,{IL:()=>u,KI:()=>o,P9:()=>q,Rl:()=>l,l:()=>t,xw:()=>s});var d=c(79646),e=c(29021),f=c(33873),g=c(28354),h=c(25252),i=c(58864);let j=(0,g.promisify)(d.execFile);function k(){globalThis.__piProjectCache?.clear()}async function l(a){return(0,e.existsSync)(a)?a:(await o(a)).projectRoot||a}async function m(a,b){let{stdout:c}=await j("git",["-C",a,...b],{timeout:1e4,maxBuffer:1048576,env:{...process.env,LC_ALL:"C"}});return c.trim()}function n(a){try{return(0,e.realpathSync)(a)}catch{return a}}async function o(a){let b,c=(globalThis.__piProjectCache||(globalThis.__piProjectCache=new Map),globalThis.__piProjectCache),d=c.get(a);if(d&&d.expiresAt>Date.now())return d.info;try{if(!(0,e.existsSync)(a))return b=function(a){let b=(0,f.dirname)(a);if(!b.endsWith("-worktrees"))return null;let c=b.slice(0,-10);return c&&(0,e.existsSync)((0,f.join)(c,".git"))?{projectRoot:n(c),branch:(0,f.basename)(a),isWorktree:!0,isTopLevel:!0}:null}(a)??{projectRoot:a,branch:null,isWorktree:!1,isTopLevel:!1},c.set(a,{info:b,expiresAt:Date.now()+6e4}),b;let[d,g,h,j]=(await m(a,["rev-parse","--path-format=absolute","--git-common-dir","--git-dir","--show-toplevel","--abbrev-ref","HEAD"])).split("\n").map(a=>a.trim()),[k,l,o]=[d,g,h].map(i.gB),p=n(a),q=(0,i.Eb)(o,p),r=!(0,i.Eb)(l,k)&&q,s=r?(0,f.dirname)(k):o;b={projectRoot:q?n(s):a,branch:j&&"HEAD"!==j?j:null,isWorktree:r,isTopLevel:q}}catch{b={projectRoot:a,branch:null,isWorktree:!1,isTopLevel:!1}}return c.set(a,{info:b,expiresAt:Date.now()+6e4}),b}async function p(a){let b=await m(a,["rev-parse","--path-format=absolute","--git-common-dir"]);return n((0,f.dirname)((0,i.gB)(b)))}async function q(a){let b=await m(a,["worktree","list","--porcelain"]),c=[],d=null,f=()=>{d?.path&&!d.prunable&&(0,e.existsSync)(d.path)&&c.push({path:d.path,branch:d.branch??null,isMain:0===c.length}),d=null};for(let a of b.split("\n"))a.startsWith("worktree ")?(f(),d={path:(0,i.gB)(a.slice(9).trim())}):a.startsWith("branch ")&&d?d.branch=a.slice(7).trim().replace(/^refs\/heads\//,""):a.startsWith("prunable")&&d?d.prunable=!0:""===a.trim()&&f();return f(),c}function r(a,b){return a.find(a=>(0,i.Eb)(a.path,b))}function s(a,b){return r(a,n(b))?.path??null}async function t(a,b){let c=b.trim();if(!c)throw Error("Branch name is required");let d=c.replace(/[\/\\:*?"<>|\s]+/g,"-").replace(/^-+|-+$/g,"");if(!d)throw Error(`Invalid branch name: ${b}`);let g=await p(a),i=`${(0,f.resolve)(g)}-worktrees`,j=(0,f.join)(i,d);if((0,e.existsSync)(j))throw Error(`Directory already exists: ${j}`);(0,e.mkdirSync)(i,{recursive:!0});let l=!1;try{await m(g,["rev-parse","--verify","--quiet",`refs/heads/${c}`]),l=!0}catch{l=!1}try{l?await m(g,["worktree","add","--",j,c]):await m(g,["worktree","add","-b",c,"--",j])}catch(a){throw Error(v(a))}return(0,h.wz)(j),k(),{path:j,branch:c}}async function u(a,b,c=!1){let d=r(await q(a),b);if(!d)throw Error(`Not a worktree of this repository: ${b}`);if(d.isMain)throw Error("Cannot remove the main worktree");try{await m(a,["worktree","remove",...c?["--force"]:[],d.path])}catch(a){throw Error(v(a))}k()}function v(a){let b=a.stderr;return"string"==typeof b&&b.trim()?b.trim():a instanceof Error?a.message:String(a)}},25252:(a,b,c)=>{c.d(b,{HM:()=>f,Nw:()=>e,wz:()=>g});var d=c(58864);function e(a){return(0,d.W3)(a)}function f(){return globalThis.__piAdditionalAllowedRoots||(globalThis.__piAdditionalAllowedRoots=new Set),globalThis.__piAdditionalAllowedRoots}function g(a){if(!a)return;let b=e(a);f().add(b),globalThis.__piAllowedRootsCache?.roots.add(b)}},27631:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{GL:()=>m,Jp:()=>r,M_:()=>p,XK:()=>s,pu:()=>o});var e=c(29021),f=c(79748),g=c(33873),h=c(75430),i=a([h]);h=(i.then?(await i)():i)[0];let s=300;function j(a){if(!a.trim())return null;try{return JSON.parse(a)}catch{return null}}function k(a){let b=a.content;return"string"==typeof b?b:Array.isArray(b)?b.filter(a=>a&&"text"===a.type&&"string"==typeof a.text).map(a=>a.text).join(" "):""}function l(a,b){let c;try{c=(0,e.openSync)(a,"r")}catch{return null}try{let a=Math.min(4096,b),d="",f=null,g="";for(;;){let h=Buffer.alloc(a);(0,e.readSync)(c,h,0,a,0);let i=h.toString("utf8"),l=i.lastIndexOf("\n"),m=-1===l?i.length:l+1;for(let a of(d+=i.slice(0,m)).split("\n")){let b=j(a);if(b){if(!f){if("session"!==b.type)return null;f=b;continue}if("message"===b.type&&b.message?.role==="user"){let a=k(b.message).trim();if(a){g=a.slice(0,s);break}}}}if(!f)return null;if(g||a>=49152||a>=b||(a=Math.min(2*a,49152,b))<=0)break}return{header:f,firstMessage:g}}catch(b){return console.warn(`[pi-web] 会话头部读取失败 path=${a}:`,b instanceof Error?b.message:String(b)),null}finally{try{(0,e.closeSync)(c)}catch{}}}function m(a){let b;try{b=(0,e.statSync)(a)}catch{return null}if(!b.isFile()||0===b.size)return null;let c=l(a,b.size);if(!c)return null;let{header:d,firstMessage:f}=c,g="string"==typeof d.id?d.id:"";if(!g)return null;let h=new Date("string"==typeof d.timestamp?d.timestamp:"");return Number.isNaN(h.getTime())&&h.setTime(b.mtime.getTime()),{path:a,id:g,cwd:"string"==typeof d.cwd?d.cwd:"",created:h,firstMessage:f||"",parentSessionPath:"string"==typeof d.parentSession?d.parentSession:void 0}}function n(a,b){let c,d={name:void 0,lastReply:""};if(b<=0)return d;try{c=(0,e.openSync)(a,"r")}catch{return null}try{let a=b;for(let b=0;b<256&&a>0;b++){let b=Math.max(0,a-65536),f=a-b,g=Buffer.alloc(f);(0,e.readSync)(c,g,0,f,b);let h=g.toString("utf8").split("\n");for(let a=h.length-1;a>=1;a--){if(void 0!==d.name&&d.lastReply)continue;let b=j(h[a]);if(b){if(void 0===d.name&&"session_info"===b.type&&"string"==typeof b.name){let a=b.name.trim();a&&(d.name=a)}else if(!d.lastReply&&"message"===b.type&&b.message?.role==="assistant"){let a=k(b.message).trim();a&&(d.lastReply=a)}if(void 0!==d.name&&d.lastReply)break}}a=b}return d}catch(b){return console.warn(`[pi-web] 会话尾部读取失败 path=${a}:`,b instanceof Error?b.message:String(b)),null}finally{try{(0,e.closeSync)(c)}catch{}}}function o(a){try{let b=(0,e.statSync)(a);if(!b.isFile()||0===b.size)return null;return n(a,b.size)}catch{return null}}function p(a){let b;try{b=(0,e.statSync)(a)}catch{return null}if(!b.isFile()||0===b.size)return null;let c=l(a,b.size);if(!c)return null;let{header:d,firstMessage:f}=c,g="string"==typeof d.id?d.id:"";if(!g)return null;let h=new Date("string"==typeof d.timestamp?d.timestamp:"");Number.isNaN(h.getTime())&&h.setTime(b.mtime.getTime());let i=n(a,b.size)??{name:void 0,lastReply:""};return{path:a,id:g,cwd:"string"==typeof d.cwd?d.cwd:"",name:i.name,created:h,modified:b.mtime,firstMessage:f||"(no messages)",lastReply:i.lastReply,parentSessionPath:"string"==typeof d.parentSession?d.parentSession:void 0}}async function q(a,b,c){let d;try{d=await (0,f.readdir)(a,{withFileTypes:!0})}catch{return}for(let f of d){let d;if(f.name.startsWith("."))continue;let h=(0,g.join)(a,f.name);if(f.isDirectory()){b<6&&await q(h,b+1,c);continue}if(f.name.endsWith(".jsonl")){try{d=(0,e.statSync)(h)}catch{continue}d.isFile()&&0!==d.size&&c.push({path:h,id:function(a){let b=a.slice(0,-6).split("_");if(b.length<2)return"";let c=b[b.length-1];return/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(c)&&!/^[0-9]+$/.test(c)?c:""}(f.name),modified:d.mtime})}}}async function r(a){let b,c=a??(0,g.join)((0,h.getAgentDir)(),"sessions");try{b=(await (0,f.readdir)(c,{withFileTypes:!0})).filter(a=>a.isDirectory()||a.isSymbolicLink()).map(a=>(0,g.join)(c,a.name))}catch{return[]}let d=[];for(let a of b)await q(a,1,d);return d.sort((a,b)=>b.modified.getTime()-a.modified.getTime()),d}d()}catch(a){d(a)}})},34062:(a,b,c)=>{function d(){globalThis.__piSessionListGeneration=(globalThis.__piSessionListGeneration??0)+1}function e(){return globalThis.__piSessionListGeneration??0}c.d(b,{B:()=>e,o:()=>d})},40402:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{B6:()=>M,BR:()=>G,DK:()=>I,G7:()=>y,Hh:()=>J,O5:()=>x,O8:()=>F,Uv:()=>K,ZN:()=>u,b4:()=>Q,eP:()=>H,loadAllSessionIndex:()=>v,mD:()=>z,o0:()=>R,resolveSessionIdByPath:()=>E,resolveSessionPath:()=>D,zH:()=>w});var e=c(75430),f=c(29021),g=c(79748),h=c(33873),i=c(9202),j=c(66737),k=c(12039),l=c(74244),m=c(45902),n=c(24923),o=c(27631),p=c(34062),q=c(41306),r=a([e,o,q]);[e,o,q]=r.then?(await r)():r;let S="session_id, path, cwd, title, first_message, parent_id, created, modified, pinned, last_reply";function s(a){return{path:a.path??"",id:a.session_id,cwd:a.cwd??"",name:a.title??void 0,created:new Date(a.created??0).toISOString(),modified:new Date(a.modified??0).toISOString(),messageCount:0,firstMessage:a.first_message??"(no messages)",lastReply:a.last_reply??"",parentSessionId:a.parent_id??void 0,pinned:!!a.pinned}}async function t(a){let b;if(0===a.length)return[];try{b=(0,j.Lf)().prepare(`SELECT ${S}
|
|
2
|
+
FROM session_meta WHERE session_id IN (${a.map(()=>"?").join(",")})`).all(...a)}catch{return[]}let c=new Map(b.map(a=>[a.session_id,a])),d=[];for(let b of a){let a=c.get(b);a&&d.push(s(a))}return d}async function u(a){let b;if(!a)return[];await (0,q.y$)();try{b=(0,j.Lf)().prepare(`SELECT ${S}
|
|
3
3
|
FROM session_meta
|
|
4
4
|
WHERE project_key = ? AND task_id IS NULL
|
|
5
|
-
ORDER BY pinned DESC, modified DESC`).all(a)}catch{return[]}return
|
|
5
|
+
ORDER BY pinned DESC, modified DESC`).all(a)}catch{return[]}return w(b.map(s))}async function v(){let a;await (0,q.y$)();try{a=(0,j.Lf)().prepare(`SELECT ${S}
|
|
6
6
|
FROM session_meta
|
|
7
|
-
ORDER BY modified DESC`).all()}catch{return[]}return
|
|
7
|
+
ORDER BY modified DESC`).all()}catch{return[]}return w(a.map(s))}async function w(a){let b=[...new Set(a.map(a=>a.cwd).filter(Boolean))],c=new Map;await Promise.all(b.map(async a=>{c.set(a,await (0,n.KI)(a))}));let d=new Set;try{let a=(0,j.Lf)().prepare("SELECT session_id FROM session_meta WHERE pinned = 1").all();d=new Set(a.map(a=>a.session_id))}catch{}return a.map(a=>{let b=a.cwd?c.get(a.cwd):void 0,e=b?.projectRoot??a.cwd;return{...a,projectRoot:e,projectKey:(0,l.z)(e),...b?.branch?{branch:b.branch}:{},...b?.isWorktree?{isWorktree:!0}:{},...b?.isWorktree&&b.branch?{worktreeBranch:b.branch}:{},...d.has(a.id)?{pinned:!0}:{}}})}function x(a,b){let c=new Map(b.map(a=>[a.id,a]));for(let b of a)c.set(b.id,b);return[...c.values()].sort((a,b)=>b.modified.localeCompare(a.modified))}async function y(a,b=0,d=5){let e,f,{listPinnedTaskSessionIds:g}=await Promise.all([c.e(6288),c.e(6583)]).then(c.bind(c,46583));try{await (0,q.y$)()}catch(a){console.error("[pi-web] 任务区索引就绪检查失败(接着查库;库不可用则降级为空页):",a instanceof Error?a.message:String(a))}try{e=(0,j.Lf)().prepare("SELECT session_id, parent_id, modified FROM session_meta WHERE task_id = ? ORDER BY modified DESC, rowid").all(a),f=g(a)}catch{return{sessions:[],rootTotal:0,sessionTotal:0,pinnedSessionIds:[]}}let h=new Set(e.map(a=>a.session_id)),i=new Map,k=new Map,l=[];for(let a of e)if(i.set(a.session_id,a.modified??0),a.parent_id&&h.has(a.parent_id)){let b=k.get(a.parent_id)??[];b.push(a.session_id),k.set(a.parent_id,b)}else l.push(a.session_id);let m=a=>{let b=[a],c=[a];for(;c.length;){let a=c.shift();for(let d of k.get(a)??[])b.push(d),c.push(d)}return b},n=(a,b)=>(i.get(b)??0)-(i.get(a)??0),o=new Set(f),p=l.filter(a=>!o.has(a)).sort(n),r=[...[...f].sort(n),...p.slice(b,b+d)],s=new Set;for(let a of r)for(let b of m(a))s.add(b);return{sessions:await w(await t([...s])),rootTotal:l.length,sessionTotal:e.length,pinnedSessionIds:f}}function z(){(0,p.o)()}function A(){return globalThis.__piSessionPathCache||(globalThis.__piSessionPathCache=new Map),globalThis.__piSessionPathCache}function B(){return globalThis.__piPathToSessionIdCache||(globalThis.__piPathToSessionIdCache=new Map),globalThis.__piPathToSessionIdCache}async function C(a){let b,c=(0,h.join)((0,e.getAgentDir)(),"sessions");if(!a||!(0,f.existsSync)(c))return null;let d=`_${a}.jsonl`;try{b=await (0,g.readdir)(c,{withFileTypes:!0})}catch{return null}for(let e of b){let b;if(!e.isDirectory()&&!e.isSymbolicLink())continue;let f=(0,h.join)(c,e.name);try{b=await (0,g.readdir)(f)}catch{continue}let i=b.find(a=>a.endsWith(d));if(!i)continue;let j=(0,h.join)(f,i);try{if(H(j)?.id===a)return j}catch{}}return null}async function D(a){let b=A().get(a);if(b)return b;try{let b=(0,j.Lf)().prepare("SELECT path FROM session_meta WHERE session_id = ?").get(a);if(b?.path&&(0,f.existsSync)(b.path))return F(a,b.path),b.path}catch{}let c=await C(a);return c?(F(a,c),c):null}async function E(a){let b=(0,m.$)(a),c=B().get(b);if(c)return c;try{let c=(0,j.Lf)(),d=c.prepare("SELECT session_id, path FROM session_meta WHERE path = ?").get(a);if(d?.path)return F(d.session_id,d.path),d.session_id;let e=(0,h.basename)(a);if(e){for(let a of c.prepare("SELECT session_id, path FROM session_meta WHERE path LIKE ?").all(`%${e}`))if(a.path&&(0,m.$)(a.path)===b)return F(a.session_id,a.path),a.session_id}}catch{}}function F(a,b){let c=(0,h.normalize)(b),d=(0,m.$)(c),e=A(),f=B(),g=e.get(a),i=g?(0,m.$)(g):void 0,j=f.get(d),k=j?e.get(j):void 0;i&&i!==d&&f.get(i)===a&&f.delete(i),j&&j!==a&&k&&(0,m.$)(k)===d&&e.delete(j),e.set(a,c),f.set(d,a)}function G(a){let b=A(),c=B(),d=b.get(a);b.delete(a);let e=d?(0,m.$)(d):void 0;e&&c.get(e)===a&&c.delete(e)}function H(a){let b=(0,f.openSync)(a,"r");try{let a=[],c=0,d=!1;for(;c<65536&&!d;){let e=Buffer.allocUnsafe(Math.min(4096,65536-c)),g=(0,f.readSync)(b,e,0,e.length,c);if(0===g)break;let h=e.subarray(0,g),i=h.indexOf(10);a.push(-1===i?h:h.subarray(0,i)),c+=g,d=-1!==i}if(!d&&c>=65536)return null;let e=Buffer.concat(a).toString("utf8").trimEnd();if(!e)return null;try{let a=JSON.parse(e);return"session"===a.type?a:null}catch{return null}}finally{(0,f.closeSync)(b)}}function I(a){return e.SessionManager.open(a).getEntries()}function J(a){let b=[];for(let c of a){if("custom"!==c.type||c.customType!==i.sT)continue;let a=(0,i.aO)(c.data);a&&(b=a.todos)}return b}function K(a,b,c={}){let{tail:d,excludeLeaf:f}=c,g=d&&d>0?L(a,b??null,d,f):a,h=new Map;for(let a of g)h.set(a.id,a);let i=(0,e.buildSessionContext)(g,b,h),j=(0,e.buildContextEntries)(g,b,h),l=[],m=[],n=[];for(let a of j){let b=function(a,b){switch(a.type){case"message":{let c=b.deferToolResultImages?function(a){if("toolResult"!==a.role)return a;let b=0,c=0,d=new Set,e=a.content.filter(a=>{let e=function(a){let b,c;if(!O(a)||"image"!==a.type||("string"==typeof a.data?(b=a.data,c="string"==typeof a.mimeType?a.mimeType:void 0):O(a.source)&&"base64"===a.source.type&&"string"==typeof a.source.data&&(b=a.source.data,c="string"==typeof a.source.media_type?a.source.media_type:void 0),!b))return null;let d=b.endsWith("==")?2:+!!b.endsWith("=");return{bytes:Math.max(0,Math.floor(3*b.length/4)-d),mime:c}}(a);return!e||(b+=1,c+=e.bytes,e.mime&&d.add(e.mime),!1)});if(0===b)return a;let f=d.size>0?`: ${[...d].join(", ")}`:"";return e.push({type:"text",text:`[${b} tool result image${1===b?"":"s"} omitted from initial history payload${f}, ~${c} bytes]`}),{...a,content:e}}((0,k.B)(a.message)):(0,k.B)(a.message);if(!b.deferThinking||"assistant"!==c.role)return c;let d=c.content;if(!Array.isArray(d))return c;return{...c,content:d.map(a=>"thinking"===a.type&&""!==a.thinking.trim()?{...a,thinking:"",deferred:!0}:a)}}case"compaction":return{role:"custom",customType:"compaction",content:a.summary,display:!0,details:{tokensBefore:a.tokensBefore,firstKeptEntryId:a.firstKeptEntryId},timestamp:N(a.timestamp)};case"branch_summary":if(!a.summary)return null;return{role:"user",content:`*The conversation briefly explored another branch and returned with this summary:*
|
|
8
8
|
|
|
9
|
-
${a.summary}`,timestamp:
|
|
9
|
+
${a.summary}`,timestamp:N(a.timestamp)};case"custom_message":return{role:"custom",customType:a.customType,content:a.content,display:a.display,details:a.details,timestamp:N(a.timestamp)};default:return null}}(a,c);b&&(l.push(b),m.push(a.id),n.push(a.parentId))}let o=J(L(a,b??null,a.length));return{messages:l,entryIds:m,parentIds:n,thinkingLevel:i.thinkingLevel,model:i.model,todos:o}}function L(a,b,c,d=!1){if(c<=0)return a;let e=new Map;for(let b of a)e.set(b.id,b);let f=b?e.get(b):a[a.length-1];if(d&&f?.parentId&&(f=e.get(f.parentId)),!f)return[];let g=[],h=f;for(;h&&g.length<c;)g.push(h),h=h.parentId?e.get(h.parentId):void 0;return g.reverse(),g}function M(a,b,c,d=!1){if(c<=0)return!1;let e=new Map;for(let b of a)e.set(b.id,b);let f=b?e.get(b):a[a.length-1];d&&f?.parentId&&(f=e.get(f.parentId));let g=0;for(;f;){if(++g>c)return!0;f=f.parentId?e.get(f.parentId):void 0}return!1}function N(a){let b=Date.parse(a);return Number.isNaN(b)?void 0:b}function O(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function P(a,b){return a.length>b?`${a.slice(0,b)}…`:a}function Q(a,b){let c=new Map;for(let b of a)c.set(b.id,b);let d=b?c.get(b):a[a.length-1];if(!d)return[];let e=[],f=d;for(;f;)e.push(f),f=f.parentId?c.get(f.parentId):void 0;e.reverse();let g=[],h=null;for(let a of e){if("message"!==a.type)continue;let b=a.message;if("user"===b.role)h={entryId:a.id,userText:function(a){if("string"==typeof a)return P(a.trim(),120);let b=a.filter(a=>"text"===a.type&&"string"==typeof a.text).map(a=>a.text).join("\n").trim();return b?P(b,120):a.length>0?"[attachment]":""}(b.content),assistantPreview:""},g.push(h);else if("assistant"===b.role&&h){let a=function(a){let b=a.filter(a=>"text"===a.type&&"string"==typeof a.text).map(a=>a.text).join("\n\n").trim();return b?P(b,140):""}(b.content);a&&(h.assistantPreview=a)}}return g}async function R(a){let b=[...new Set(a.filter(Boolean))];if(0===b.length)return[];let c=new Map;try{for(let a of(0,j.Lf)().prepare(`SELECT ${S} FROM session_meta WHERE session_id IN (${b.map(()=>"?").join(",")})`).all(...b))c.set(a.session_id,a)}catch{}let d=new Map,e=[];for(let a of b){let b=c.get(a);if(!b){e.push(a);continue}b.path&&F(a,b.path),d.set(a,s(b))}for(let a of e){let b=await D(a);if(!b)continue;let c=(0,o.M_)(b);if(!c)continue;F(a,c.path);let e=c.parentSessionPath?await E(c.parentSessionPath):void 0;d.set(a,{path:c.path,id:c.id,cwd:c.cwd,name:c.name,created:c.created.toISOString(),modified:c.modified.toISOString(),messageCount:0,firstMessage:c.firstMessage||"(no messages)",lastReply:c.lastReply||"",parentSessionId:e,transient:!1})}return w(b.map(a=>d.get(a)).filter(a=>!!a))}d()}catch(a){d(a)}})},41306:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Pv:()=>m,y$:()=>o});var e=c(29021),f=c(66737),g=c(74244),h=c(45902),i=c(27631),j=c(34062),k=c(24923),l=a([i]);async function m(a,b,c=null){let d=(0,i.GL)(a);if(!d)return;let e=await (0,k.KI)(d.cwd).then(a=>(0,g.z)(a?.projectRoot??d.cwd));(0,f.Lf)().prepare(`INSERT INTO session_meta
|
|
10
10
|
(session_id, task_id, updated, pinned, path, cwd, project_key, title, first_message, parent_id, created, modified)
|
|
11
11
|
VALUES (?, ?, ?, 0, ?, ?, ?, NULL, ?, ?, ?, ?)
|
|
12
12
|
ON CONFLICT(session_id) DO UPDATE SET
|
|
@@ -17,7 +17,7 @@ ${a.summary}`,timestamp:M(a.timestamp)};case"custom_message":return{role:"custom
|
|
|
17
17
|
first_message = COALESCE(session_meta.first_message, excluded.first_message),
|
|
18
18
|
parent_id = excluded.parent_id,
|
|
19
19
|
created = excluded.created,
|
|
20
|
-
modified = excluded.modified`).run(d.id,c,Date.now(),a,d.cwd,e,d.firstMessage||null,b,d.created.getTime(),Date.now())}async function
|
|
20
|
+
modified = excluded.modified`).run(d.id,c,Date.now(),a,d.cwd,e,d.firstMessage||null,b,d.created.getTime(),Date.now()),(0,j.o)()}async function n(a){let b=await (0,i.Jp)(a),c=(0,f.Lf)(),d=c.prepare("SELECT session_id, modified, updated, path, parent_id, first_message FROM session_meta").all(),l=new Map(d.map(a=>[a.session_id,a])),m=new Map(d.filter(a=>a.path).map(a=>[(0,h.$)(a.path),a.session_id])),n=new Map,o=new Set,p=(a,b,c)=>{let d=n.get(a);d&&d.file.modified.getTime()>=b.modified.getTime()||n.set(a,{file:b,head:c})};for(let a of b){let b=m.get((0,h.$)(a.path));if(void 0!==b){p(b,a);continue}let c=(0,i.GL)(a.path);if(c){p(c.id,a,c);continue}a.id&&l.has(a.id)&&o.add(a.id)}let q={scanned:n.size,inserted:0,updated:0,deleted:0},r=new Map;for(let[a,b]of n)r.set((0,h.$)(b.file.path),a);let s=new Map,t=c.prepare(`INSERT INTO session_meta
|
|
21
21
|
(session_id, task_id, updated, pinned, path, cwd, project_key, title, first_message, parent_id, created, modified)
|
|
22
22
|
VALUES (?, NULL, ?, 0, ?, ?, ?, NULL, ?, ?, ?, ?)
|
|
23
23
|
ON CONFLICT(session_id) DO UPDATE SET
|
|
@@ -33,8 +33,8 @@ ${a.summary}`,timestamp:M(a.timestamp)};case"custom_message":return{role:"custom
|
|
|
33
33
|
-- 链路刚写的「现在就活跃」拉回去(与 updateModifiedStmt 同一约定)。
|
|
34
34
|
modified = CASE
|
|
35
35
|
WHEN session_meta.modified IS NULL OR excluded.modified > session_meta.modified
|
|
36
|
-
THEN excluded.modified ELSE session_meta.modified END`),
|
|
36
|
+
THEN excluded.modified ELSE session_meta.modified END`),u=c.prepare("UPDATE session_meta SET modified = ? WHERE session_id = ? AND (modified IS NULL OR modified < ?)"),v=c.prepare("UPDATE session_meta SET parent_id = ? WHERE session_id = ?"),w=c.prepare("UPDATE session_meta SET first_message = ? WHERE session_id = ?"),x=c.prepare("DELETE FROM session_meta WHERE session_id = ?"),y=async(a,b,c)=>{let d=s.get(b.cwd);d||(d=(0,k.KI)(b.cwd).then(a=>(0,g.z)(a?.projectRoot??b.cwd)),s.set(b.cwd,d));let e=await d,f=b.parentSessionPath?r.get((0,h.$)(b.parentSessionPath))??null:null;t.run(c,Date.now(),a.path,b.cwd,e,b.firstMessage||null,f,b.created.getTime(),a.modified.getTime())},z=(a,b,c)=>{let d=(0,i.GL)(a.path);if(!d)return!1;let e=d.parentSessionPath?r.get((0,h.$)(d.parentSessionPath))??null:null;return e!==b.parent_id&&v.run(e,c),!!d.firstMessage&&d.firstMessage!==b.first_message&&(w.run(d.firstMessage,c),!0)};for(let[a,b]of n){let{file:c}=b;o.add(a);let d=l.get(a);if(void 0!==d&&d.path&&d.path===c.path)null===d.modified||c.modified.getTime()>d.modified?(z(c,d,a),u.run(c.modified.getTime(),a,c.modified.getTime()),q.updated+=1):!d.first_message&&z(c,d,a)&&(q.updated+=1);else{let d=b.head??(0,i.GL)(c.path);if(!d)continue;await y(c,d,a),q.inserted+=1}}let A=Date.now();for(let a of d)!(o.has(a.session_id)||a.path&&(0,e.existsSync)(a.path))&&(A-a.updated<6e4||(x.run(a.session_id),q.deleted+=1));let B=c.prepare(`UPDATE session_meta AS c
|
|
37
37
|
SET task_id = (SELECT p.task_id FROM session_meta AS p WHERE p.session_id = c.parent_id)
|
|
38
38
|
WHERE c.task_id IS NULL
|
|
39
39
|
AND c.parent_id IS NOT NULL
|
|
40
|
-
AND EXISTS (SELECT 1 FROM session_meta AS p WHERE p.session_id = c.parent_id AND p.task_id IS NOT NULL)`);for(let a=0;a<8;a+=1){let a=Number(
|
|
40
|
+
AND EXISTS (SELECT 1 FROM session_meta AS p WHERE p.session_id = c.parent_id AND p.task_id IS NOT NULL)`);for(let a=0;a<8;a+=1){let a=Number(B.run().changes);if(0===a)break;q.updated+=a}let C=c.prepare("SELECT session_id, path FROM session_meta WHERE last_reply IS NULL AND path IS NOT NULL").all();if(C.length>0){let a=c.prepare("UPDATE session_meta SET last_reply = ? WHERE session_id = ? AND last_reply IS NULL");for(let b of C){let c=(0,i.pu)(b.path);c&&(a.run(c.lastReply||"",b.session_id),q.updated+=1)}}return(q.inserted>0||q.updated>0||q.deleted>0)&&(0,j.o)(),q}async function o(a){let b=globalThis.__piSessionIndexScanner;if(!b?.firstScanDone){if(b?.firstScanPromise){if(await b.firstScanPromise,!globalThis.__piSessionIndexScanner?.firstScanDone)try{await n(a),globalThis.__piSessionIndexScanner&&(globalThis.__piSessionIndexScanner.firstScanDone=!0)}catch(a){console.error("[pi-web] session index ensure retry error:",a instanceof Error?a.message:String(a))}return}await n(a),globalThis.__piSessionIndexScanner={firstScanDone:!0}}}i=(l.then?(await l)():l)[0],d()}catch(a){d(a)}})},45902:(a,b,c)=>{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}},58864:(a,b,c)=>{c.d(b,{Eb:()=>j,W3:()=>h,gB:()=>g,uK:()=>f});var d=c(33873);let e=/^[a-zA-Z]:[\\/]/;function f(a){return e.test(a)||a.startsWith("\\\\")||a.startsWith("//")}function g(a){return a&&"win32"===process.platform?(0,d.normalize)(a):a}function h(a){return a.replace(/\\/g,"/")}function i(a){let b=(0,d.normalize)(g(a)),c=(0,d.parse)(b).root.length,e=b.length;for(;e>c&&b[e-1]===d.sep;)e--;return b.slice(0,e)}function j(a,b){if(a===b)return!0;if(!a||!b)return!1;let c=i(a),d=i(b);return"win32"===process.platform?c.toLowerCase()===d.toLowerCase():c===d}},74244:(a,b,c)=>{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}}};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
exports.id=542,exports.ids=[542],exports.modules={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(39065);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)}})},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}:{},...a.worktreePath?{worktreePath:a.worktreePath}:{},...a.worktreeBranch?{worktreeBranch:a.worktreeBranch}:{},...a.worktreeCleanupError?{worktreeCleanupError:a.worktreeCleanupError}:{}}}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."}),resume:e.Type.Optional(e.Type.String({description:"Existing subagent session ID to continue instead of creating a new session."})),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."})),isolation:e.Type.Optional(e.Type.String({description:"Run the subagent in an isolated git worktree."}))}),async execute(b,c,d,e,f){try{let g=c.resume?.trim(),h=g?await a.resume({parentContext:f,parentToolCallId:b,sessionId:g,task:c.prompt,description:c.description,...void 0!==c.run_in_background?{runInBackground:c.run_in_background}:{},signal:d,onUpdate:a=>e?.({content:[{type:"text",text:`${a.profile}: ${a.description} (${a.status})`}],details:j(a)})}):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}:{},..."worktree"===c.isolation?{isolation:"worktree"}:{},signal:d,onUpdate:a=>e?.({content:[{type:"text",text:`${a.profile}: ${a.description} (${a.status})`}],details:j(a)})});if(h.run.runInBackground)return h.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: ${h.run.sessionId}. You will be notified when it completes.`}],details:j(h.run)};let i=await h.completion;return{content:[{type:"text",text:k(i)}],details:j(i),..."failed"===i.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,{A4:()=>J,HG:()=>K,OF:()=>L});var e=c(75430),f=c(31239),g=c(29862),h=c(55511),i=c(29021),j=c(33873),k=c(18437),l=c(88250),m=c(96515),n=c(81186),o=c(87509),p=c(8084),q=c(41035),r=c(84851),s=c(70274),t=c(32302),u=c(69453),v=c(16525),w=c(99595),x=c(9210),y=c(7535),z=c(88002),A=c(65562),B=c(47128),C=c(15253),D=c(61577),E=c(57856),F=a([e,f,g,m,n,o,p,q,r,s,u,v,x,A,B,C]);[e,f,g,m,n,o,p,q,r,s,u,v,x,A,B,C]=F.then?(await F)():F;let M=new Set(["agent_end","agent_settled","auto_compaction_end","compaction_end"]),N=function(a=process.env.PI_WEB_IDLE_TIMEOUT_MS){if(void 0!==a&&""!==a.trim()){let b=Number(a);if(Number.isFinite(b)&&b>=0&&b<=0x7fffffff)return b;console.warn(`[pi-web] invalid PI_WEB_IDLE_TIMEOUT_MS "${a}", falling back to 10 minutes`)}return 6e5}(),O=["read","bash","edit","write","grep","find","ls"],P={accent:"",border:"",borderAccent:"",borderMuted:"",success:"",error:"",warning:"",muted:"",dim:"",text:"",thinkingText:"",scrollbarTrack:"",scrollbarThumb:"",searchMatchText:"",userMessageText:"",customMessageText:"",customMessageLabel:"",toolTitle:"",toolOutput:"",mdHeading:"",mdLink:"",mdLinkUrl:"",mdCode:"",mdCodeBlock:"",mdCodeBlockBorder:"",mdQuote:"",mdQuoteBorder:"",mdHr:"",mdListBullet:"",toolDiffAdded:"",toolDiffRemoved:"",toolDiffContext:"",syntaxComment:"",syntaxKeyword:"",syntaxFunction:"",syntaxVariable:"",syntaxString:"",syntaxNumber:"",syntaxType:"",syntaxOperator:"",syntaxPunctuation:"",thinkingOff:"",thinkingMinimal:"",thinkingLow:"",thinkingMedium:"",thinkingHigh:"",thinkingXhigh:"",thinkingMax:"",bashMode:""},Q={selectedBg:"",searchMatchBg:"",userMessageBg:"",customMessageBg:"",toolPendingBg:"",toolSuccessBg:"",toolErrorBg:""};class R extends e.Theme{constructor(){super(P,Q,"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 g.KeybindingsManager(g.TUI_KEYBINDINGS);function G(a,b){if(0===b.length)return[];let c=new Set(O),d=a.getAllTools().map(a=>a.name).filter(a=>!c.has(a));return[...new Set([...b,...d])]}class U{constructor(a,b={}){this.inner=a,this.listeners=[],this.pendingUiResponses=new Map,this.pendingUiRequests=new Map,this.activeCustomUis=new Map,this.extensionStatuses=new Map,this.extensionWidgets=new Map,this.activeExtensionWidgets=new Map,this.extensionWidgetGenerations=new Map,this.extensionWidgetsResetting=!1,this.pendingPromptCount=0,this.promptAdmissionTail=Promise.resolve(),this.extensionsBound=!1,this.extensionBindingPromise=null,this.extensionBindingError=null,this.forceEmptySystemPrompt=!1,this.unsubscribe=null,this.idleTimer=null,this.onDestroyCallback=null,this.shutdownPromise=null,this._alive=!0,this.lastAgentStart=0,this.activityTracker=(0,w.S)(),this.forcedPromptProjectionInstalled=!1,this.exactSystemPrompt=b.exactSystemPrompt,this.chatOnly=b.chatOnly??!1,this.installForcedPromptProjection()}hasPendingUiRequest(){return this.pendingUiRequests.size>0}lastAgentStartAt(){return this.lastAgentStart}get sessionId(){return this.inner.sessionId}get sessionFile(){return this.inner.sessionFile??""}get cwd(){return this.inner.sessionManager.getCwd()}get streamingMessage(){return this.inner.agent.state?.streamingMessage}get isStreaming(){return this.inner.isStreaming}isAlive(){return this._alive}isChatOnly(){return this.chatOnly}isRunning(){return this._alive&&(this.pendingPromptCount>0||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)}start(){this.unsubscribe=this.inner.subscribe(a=>{"agent_start"===a.type&&(this.lastAgentStart=Date.now()),"agent_end"===a.type&&(0,u.mD)(),M.has(a.type)&&this.resetIdleTimer();try{this.persistSessionActivity(a)}catch(b){console.error(`[pi-web] 会话活跃写库失败(${a.type}):`,b instanceof Error?b.message:String(b))}this.emit(a)}),this.resetIdleTimer()}persistSessionActivity(a){let b=this.activityTracker.handle(a);if(!b)return;let c=this.inner.sessionId;if(c){if("touch"===b.kind)return void(0,A.xE)(c);(0,A.YZ)(c,b),(0,A.HO)(c,function(a){for(let b of a){if(b?.type!=="message"||b.message?.role!=="user")continue;let a=(function(a){if("bashExecution"===a.message.role)return"";let b=a.message.content;return"string"==typeof b?b:b.map(a=>"text"===a.type?a.text:"").filter(Boolean).join(" ")})(b).trim();if(a)return a.slice(0,x.XK)}return""}(this.inner.sessionManager.getEntries()))}}setForceEmptySystemPrompt(a){this.forceEmptySystemPrompt=a,this.ensureForcedPromptProjection()}beginExtensionBinding(a={}){this.ensureExtensionsBound(a).catch(a=>{console.error("[pi-web] failed to dispatch session_start to extensions:",a instanceof Error?a.message:a)})}async waitUntilReady(){await this.waitForExtensionsBound()}installForcedPromptProjection(){if(this.forcedPromptProjectionInstalled)return;let a=this.inner.agent;if(!a)return;this.forcedPromptProjectionInstalled=!0;let b=a.transformContext;a.transformContext=async(a,c)=>{let d=b?await b(a,c):a,e=this.forceEmptySystemPrompt?"":this.exactSystemPrompt?.();if(void 0===e)return d;let g=(0,f.getCurrentSystemMessage)(d);return[{role:"system",content:e,...g?.toolsAdded?{toolsAdded:g.toolsAdded}:{},timestamp:g?.timestamp??Date.now()},...d.filter(a=>"system"!==a.role)]}}ensureForcedPromptProjection(){this.installForcedPromptProjection()}ensureExtensionsBound(a={}){return(a.forceEmptySystemPrompt&&(this.forceEmptySystemPrompt=!0),this.extensionsBound)?(this.ensureForcedPromptProjection(),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,h.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.ensureForcedPromptProjection(),console.log(`[pi-web] session_start dispatched to extensions for session ${this.inner.sessionId}`)})().catch(a=>{throw this.extensionBindingError=a,a})),this.extensionBindingPromise)}async waitForExtensionsBound(){try{this.extensionBindingPromise&&await this.extensionBindingPromise}catch(a){throw a instanceof Error?a:Error(String(a))}if(this.extensionBindingError)throw this.extensionBindingError instanceof Error?this.extensionBindingError:Error(String(this.extensionBindingError))}shouldWaitForExtensions(a){return"prompt"===a||"steer"===a||"follow_up"===a||"get_commands"===a||"get_state"===a}async withFinalRunningNotification(a){try{return await a()}finally{this.resetIdleTimer()}}emit(a){for(let b of this.listeners)try{b(a)}catch(b){console.error(`[pi-web] failed to deliver ${a.type} event:`,b instanceof Error?b.message:b)}}async acquirePromptAdmission(){let a,b=this.promptAdmissionTail;return this.promptAdmissionTail=new Promise(b=>{a=b}),await b,a}resetIdleTimer(){0!==N&&(this.idleTimer&&clearTimeout(this.idleTimer),this.idleTimer=setTimeout(()=>{this.isRunning()?this.resetIdleTimer():this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down idle session:",a instanceof Error?a.message:a)})},N))}onEvent(a){for(let b of(this.listeners.push(a),this.pendingUiRequests.values()))a(b);return()=>{let b=this.listeners.indexOf(a);-1!==b&&this.listeners.splice(b,1)}}onDestroy(a){this.onDestroyCallback=a}async send(a){this.resetIdleTimer();let b=a.type;if(this.shouldWaitForExtensions(b)&&await this.waitForExtensionsBound(),"prompt"===b||"steer"===b||"follow_up"===b){let b=(0,k.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");let e=a.images,f=a.streamingBehavior,g=!1,h=!1,i=!1,j=new Promise((a,d)=>{b=()=>{g=!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.pendingPromptCount+=1;try{d=this.inner.prompt(a.message,{...e?.length?{images:e}:{},...f?{streamingBehavior:f}:{},source:"rpc",preflightResult:a=>{a&&b()}})}catch(a){throw k(),a}return d.then(()=>{b(),k(),f||this.emit({type:"prompt_done"})},a=>{c(a),k(),(0,u.mD)(),g&&(this.emit({type:"prompt_error",errorMessage:a instanceof Error?a.message:String(a)}),f||this.emit({type:"prompt_done"}))}).catch(a=>{console.error("[pi-web] prompt completion handler failed:",a instanceof Error?a.message:a)}),await j,null}finally{b()}}case"abort":return await this.withFinalRunningNotification(()=>this.inner.abort()),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,autoCompactionEnabled:this.inner.autoCompactionEnabled,autoRetryEnabled:this.inner.autoRetryEnabled,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()]},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()}}case"set_model":{let{provider:b,modelId:c}=a,d=this.inner.modelRuntime.getModel(b,c);if(d||(await this.inner.modelRuntime.refresh({allowNetwork:!1}),d=this.inner.modelRuntime.getModel(b,c)),!d)throw Error(`Model not found: ${b}/${c}`);return await this.inner.setModel(d),(0,l.kn)(),(0,u.mD)(),{id:d.id,provider:d.provider}}case"fork_branch":{if(this.isRunning())throw Error("Cannot fork while the session is running");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),h=g.createBranchedSession(b);if(!h)throw Error("Failed to create forked session");if(!(0,i.existsSync)(h)){let a=[g.getHeader(),...g.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,i.writeFileSync)(h,a,{encoding:"utf8",flag:"wx"}),g.flushed=!0}let j=e.SessionManager.open(h,f).getSessionId();(0,u.O8)(j,h),(0,u.mD)();let k=c.getSessionId();return await (0,v.Pv)(h,k,(0,A.l6)(k)),{cancelled:!1,newSessionId:j}}case"fork":{let b;if(this.inner.isBashRunning)throw Error("Cannot fork while a shell command is running");let c=this.inner.sessionId,d=a.entryId,f=this.inner.sessionManager,g=this.inner.sessionFile;if(!f.isPersisted())return{cancelled:!0};if(!g)throw Error("Persisted session is missing a session file");let h=f.getEntry(d);if(!h)throw Error("Invalid entry ID for forking");let j=f.getSessionDir();if(h.parentId){let a=e.SessionManager.open(g,j),c=a.createBranchedSession(h.parentId);if(!c)throw Error("Failed to create forked session");if(b=c,!(0,i.existsSync)(b)){let c=[a.getHeader(),...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,i.writeFileSync)(b,c,{encoding:"utf8",flag:"wx"}),a.flushed=!0}}else{let a=e.SessionManager.create(f.getCwd(),j);a.newSession({parentSession:g}),a.getSessionFile()&&a._rewriteFile(),b=a.getSessionFile()}let k=e.SessionManager.open(b,j).getSessionId();(0,u.O8)(k,b),(0,u.mD)();let l=f.getCwd(),m=(0,A.l6)(c);await this.shutdown();try{let a=await (0,z.KI)(l??"");(0,A.YH)(k,{path:b,cwd:l??"",projectKey:(0,y.z)(a?.projectRoot??l??""),parentId:c,taskId:m})}catch(a){console.error(`[pi-web] fork 建行失败 session=${k}:`,a instanceof Error?a.message:String(a))}try{await (0,B.BC)(c)}catch(a){console.error(`[pi-web] fork 入板失败 source=${c}:`,a instanceof Error?a.message:String(a))}return{cancelled:!1,newSessionId:k}}case"navigate_tree":if(this.inner.isBashRunning)throw Error("Cannot navigate while a shell command is running");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,u.mD)(),null}case"compact":try{return await this.withFinalRunningNotification(()=>this.inner.compact(a.customInstructions))}finally{(0,u.mD)()}case"set_session_name":{let b=a.name?.trim();if(!b)throw Error("Session name cannot be empty");this.inner.setSessionName(b);try{await (0,A.Bm)(this.inner.sessionId,b)}catch(a){console.error("[pi-web] 会话标题写库失败:",a)}return(0,u.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"set_auto_compaction":return this.inner.setAutoCompactionEnabled(a.enabled),null;case"clear_queue":return this.inner.clearQueue();case"steer":{let b=a.images;return await this.inner.steer(a.message,b?.length?b:void 0),null}case"follow_up":{let b=a.images;return await this.inner.followUp(a.message,b?.length?b:void 0),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;if((0,q.ph)(this.inner.sessionManager.getEntries()))throw Error("Subagent tool selection is fixed by its profile");return this.setForceEmptySystemPrompt(0===b.length),this.inner.setActiveToolsByName(G(this.inner,b)),null}case"reload":return await this.waitForExtensionsBound(),this.extensionStatuses.clear(),this.resetExtensionWidgetsForReload(),this.syncProjectTrust(),await this.inner.reload(),"function"!=typeof this.inner.bindExtensions&&this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc"),(0,l.kn)(),{success:!0};case"abort_compaction":return this.inner.abortCompaction(),null;case"extension_ui_response":return this.resolveExtensionUiResponse(a),null;case"extension_ui_input":return this.handleExtensionUiInput(a.id,a.data),null;case"set_auto_retry":return this.inner.setAutoRetryEnabled(a.enabled),null;case"bash":{if(this.pendingPromptCount>0||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.executeBash(a.command,void 0,{excludeFromContext:a.excludeFromContext,operations:(0,n.J1)({shellPath:this.inner.settingsManager.getShellPath()})});try{return await b}finally{this.resetIdleTimer(),(0,u.mD)()}}case"abort_bash":return this.inner.abortBash(),null;default:throw Error(`Unsupported command: ${b}`)}}destroy(){if(this._alive){for(let a of(this._alive=!1,this.idleTimer&&clearTimeout(this.idleTimer),this.inner.isBashRunning&&this.inner.abortBash(),this.unsubscribe?.(),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.clearExtensionWidgets(!1);try{this.inner.dispose()}finally{this.onDestroyCallback?.()}}}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)}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())}nextExtensionWidgetGeneration(a){let b=(this.extensionWidgetGenerations.get(a)??0)+1;return this.extensionWidgetGenerations.set(a,b),b}disposeExtensionWidgetComponent(a){if(!a||"object"!=typeof a&&"function"!=typeof a)return;let b=a.dispose;if("function"==typeof b)try{b.call(a)}catch{}}emitExtensionWidgetClear(a){this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:void 0,widgetPlacement:void 0})}clearExtensionWidget(a,b=!0){let c=this.nextExtensionWidgetGeneration(a),d=this.activeExtensionWidgets.get(a);return this.activeExtensionWidgets.delete(a),this.extensionWidgets.delete(a),d&&this.disposeExtensionWidgetComponent(d.component),this.extensionWidgetGenerations.get(a)!==c||b&&this.emitExtensionWidgetClear(a),c}clearExtensionWidgets(a){for(let b of new Set([...this.extensionWidgets.keys(),...this.activeExtensionWidgets.keys()]))this.clearExtensionWidget(b,a)}resetExtensionWidgetsForReload(){this.extensionWidgetsResetting=!0;try{for(let a of[...this.activeExtensionWidgets.keys()])this.clearExtensionWidget(a);this.extensionWidgets.clear()}finally{this.extensionWidgetsResetting=!1}}emitExtensionWidgetError(a,b){this.emit({type:"extension_error",extensionPath:`extension-widget:${a}`,event:"setWidget",error:b instanceof Error?b.message:String(b)})}failExtensionWidget(a,b,c,d,e){if(this.extensionWidgetGenerations.get(a)!==b)return void this.disposeExtensionWidgetComponent(e);let f=this.activeExtensionWidgets.get(a),g=!d;f?.generation===b?(g=f.rendered||!f.clearEmitted,this.activeExtensionWidgets.delete(a),this.disposeExtensionWidgetComponent(f.component)):this.disposeExtensionWidgetComponent(e),this.extensionWidgetGenerations.get(a)!==b||(this.extensionWidgets.delete(a),g&&this.emitExtensionWidgetClear(a)),this.emitExtensionWidgetError(a,c)}renderExtensionWidget(a){let b;if(this.activeExtensionWidgets.get(a.key)!==a||this.extensionWidgetGenerations.get(a.key)!==a.generation)return;try{b=a.component.render(E.p1)}catch(b){this.failExtensionWidget(a.key,a.generation,b,a.clearEmitted);return}if(!Array.isArray(b)||!b.every(a=>"string"==typeof a))return void this.failExtensionWidget(a.key,a.generation,Error("Extension widget render must return string[]"),a.clearEmitted);if(this.activeExtensionWidgets.get(a.key)!==a||this.extensionWidgetGenerations.get(a.key)!==a.generation)return;let c=b;this.extensionWidgets.set(a.key,{key:a.key,lines:c,placement:a.placement}),a.rendered=!0,this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"setWidget",widgetKey:a.key,widgetLines:c,widgetPlacement:a.placement})}setExtensionWidgetFactory(a,b,c){let d,e=this.extensionWidgets.has(a)||this.activeExtensionWidgets.has(a),f=this.clearExtensionWidget(a,e);if(this.extensionWidgetGenerations.get(a)!==f)return;let g=(0,E.TQ)(()=>{let b=this.activeExtensionWidgets.get(a);b?.generation===f&&this.renderExtensionWidget(b)},E.p1);try{d=b(g,S)}catch(b){this.failExtensionWidget(a,f,b,e);return}if(this.extensionWidgetGenerations.get(a)!==f)return void this.disposeExtensionWidgetComponent(d);if(!d||"object"!=typeof d&&"function"!=typeof d||"function"!=typeof d.render)return void this.failExtensionWidget(a,f,Error("Extension widget factory must return a component with render(width)"),e,d);let h={key:a,component:d,placement:c?.placement??"aboveEditor",generation:f,clearEmitted:e,rendered:!1};this.activeExtensionWidgets.set(a,h),this.renderExtensionWidget(h)}getCustomUiWidth(a){if(!a||"object"!=typeof a)return E.p1;let b=a.overlayOptions,c="function"==typeof b?b():b;if(!c||"object"!=typeof c)return E.p1;let d=c.width;return"number"==typeof d&&Number.isFinite(d)?Math.max(40,Math.min(140,Math.round(d))):92}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=(0,h.randomUUID)(),d=this.getCustomUiWidth(b);return new Promise(b=>{let e=!1,f=(0,E.TQ)(()=>{let a=this.activeCustomUis.get(c);a&&this.emitCustomUiRender(c,a)},d),g=a=>{e||(e=!0,b(a))},h=a=>{this.activeCustomUis.has(c)?this.closeCustomUi(c,a):g(a)};Promise.resolve().then(()=>a(f,S,T,h)).then(a=>{if(e){try{a?.dispose?.()}catch{}return}if(!a||"object"!=typeof a||"function"!=typeof a.render)return void g(void 0);let b={component:a,width:d,resolve:a=>g(a),settled:!1};this.activeCustomUis.set(c,b),this.emitCustomUiRender(c,b)}).catch(a=>{e||(this.emit({type:"extension_error",extensionPath:`custom-ui:${c}`,event:"custom_ui",error:a instanceof Error?a.message:String(a)}),g(void 0))})})}requestExtensionUi(a,b,c,d,e){if(e?.aborted)return Promise.resolve(b);let f=(0,h.randomUUID)(),g={type:"extension_ui_request",id:f,...a,...d?{timeout:d,expiresAt:Date.now()+d}:{}};return new Promise(a=>{let h,i=()=>{h&&clearTimeout(h),e?.removeEventListener("abort",k),this.pendingUiRequests.delete(f),this.pendingUiResponses.delete(f)},j=b=>{i(),a(b)},k=()=>j(b);d&&(h=setTimeout(()=>j(b),d)),e?.addEventListener("abort",k,{once:!0}),this.pendingUiRequests.set(f,g),this.pendingUiResponses.set(f,{resolve:a=>j(c(a)),cancel:()=>j(b)}),this.emit(g)})}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,h.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,h.randomUUID)(),method:"setStatus",statusKey:a,statusText:b})},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:(a,b,c)=>{if(!this._alive||this.extensionWidgetsResetting)return;if("function"==typeof b)return void this.setExtensionWidgetFactory(a,b,c);if(void 0!==b&&!Array.isArray(b))return;if(void 0===b)return void this.clearExtensionWidget(a);let d=this.activeExtensionWidgets.has(a)?this.clearExtensionWidget(a):this.nextExtensionWidgetGeneration(a);this.extensionWidgetGenerations.get(a)===d&&(this.extensionWidgets.set(a,{key:a,lines:b,placement:c?.placement??"aboveEditor"}),this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:b,widgetPlacement:c?.placement}))},setFooter:()=>{},setHeader:()=>{},setTitle:a=>{this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"setTitle",title:a})},custom:(a,b)=>this.requestExtensionCustomUi(a,b),pasteToEditor:a=>{this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"set_editor_text",text:a})},setEditorText:a=>{this.emit({type:"extension_ui_request",id:(0,h.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:()=>{}}}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.resetExtensionWidgetsForReload(),this.syncProjectTrust(),await this.inner.reload({beforeSessionStart:()=>{this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc")}})}}}syncProjectTrust(){let a=(0,C.Y1)(this.cwd,(0,e.getAgentDir)());this.inner.settingsManager.setProjectTrusted(a.trusted)}}function H(){if(!globalThis.__piSessions){globalThis.__piSessions=new Map;let a=()=>globalThis.__piSessions?.forEach(a=>a.destroy());process.once("exit",a),process.once("SIGINT",a),process.once("SIGTERM",a)}return globalThis.__piSessions}async function I(a,b){let c=a.getSessionFile();if(!c||(0,i.existsSync)(c))return;let d=a.getHeader();if(!d)return;let e=[d,...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,i.writeFileSync)(c,e,{encoding:"utf8",flag:"wx"}),a.flushed=!0,(0,u.O8)(b,c);let f=a.getCwd();try{let a=await (0,z.KI)(f??"");(0,A.YH)(b,{path:c,cwd:f??"",projectKey:(0,y.z)(a?.projectRoot??f??"")})}catch(a){console.error(`[pi-web] 新会话建行失败 session=${b}:`,a instanceof Error?a.message:String(a))}}function J(a){return H().get(a)}function K(){let a=new Set;for(let[b,c]of H())c.isRunning()&&a.add(c.sessionId||b);return[...a]}async function L(a,b,c,d={}){let f,g,h,{toolNames:k,initialModel:r,thinkingLevel:v}=d,w=H(),x=(globalThis.__piStartLocks||(globalThis.__piStartLocks=new Map),globalThis.__piStartLocks),y=w.get(a);if(y?.isAlive())return{session:y,realSessionId:a};let z=x.get(a);if(z)return z;if(b)f=e.SessionManager.open(b,void 0);else{if(!c)throw Error("cwd is required for a new session");let b=a.length>0&&!a.startsWith("__");f=e.SessionManager.create(c,void 0,b?{id:a}:void 0),b&&await I(f,a)}let A=f.getCwd(),B=(globalThis.__piStartingSessionCwds||(globalThis.__piStartingSessionCwds=new Map),g=globalThis.__piStartingSessionCwds,h=function(a){let b=(0,j.resolve)(a);try{return(0,i.realpathSync)(b)}catch{return b}}(A),g.set(h,(g.get(h)??0)+1),()=>{let a=(g.get(h)??1)-1;a>0?g.set(h,a):g.delete(h)}),E=(async()=>{let a=b?(0,q.ph)(f.getEntries()):null,c=!!(a?.loadExtensions||a?.loadSkills),d=a?0===a.tools.length&&!c:k?.length===0;d||(0,e.initTheme)();let g=(0,e.getAgentDir)(),h=a?.tools;a||void 0===k||(h=0===k.length?[]:void 0);let i=(0,C.Fk)(A,g),j=e.SettingsManager.create(A,g),x=await (0,e.createAgentSessionServices)({cwd:A,agentDir:g,settingsManager:j,resourceLoaderOptions:a?{noExtensions:!a.loadExtensions,noSkills:!a.loadSkills,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,systemPrompt:" ",appendSystemPrompt:a.appendSystemPrompt}:d?t.M:{extensionFactories:[(0,n.eD)({cwd:A,settings:j}),(0,o.U)(),(0,p.Vj)(V.extensionRuntime,()=>(0,q.IR)(A),s.N)],extensionsOverride:a=>(0,n.Ds)((0,p.U6)(a))},...i?{resourceLoaderReloadOptions:i}:{}}),y=await (0,m.p)(x.modelRuntime,x.settingsManager.getEnabledModels()),z=x.settingsManager.getDefaultProvider(),B=x.settingsManager.getDefaultModel(),E=f.getBranch().some(a=>"message"===a.type)?{scopedModels:[...y.scopedModels]}:(0,m.I)(y,{...r?{requestedModel:r}:{},...z&&B?{defaultModel:{provider:z,modelId:B}}:{},...v?{thinkingLevel:v}:{}}),{session:F}=await (0,e.createAgentSessionFromServices)({services:x,sessionManager:f,...E.model?{model:E.model}:{},...E.thinkingLevel?{thinkingLevel:E.thinkingLevel}:{},...E.scopedModels.length>0?{scopedModels:E.scopedModels}:{},...void 0!==h?{tools:h}:{}});(await (0,D.o)(x.settingsManager,{...r?{model:r}:{},...v?{thinkingLevel:v}:{}},{...F.model?{model:{provider:F.model.provider,modelId:F.model.id}}:{},thinkingLevel:F.thinkingLevel,supportsThinking:F.supportsThinking()})).modelDefaultChanged&&(0,l.kn)(),k&&k.length>0&&F.setActiveToolsByName(G(F,k));let H=new U(F);k?.length===0&&H.setForceEmptySystemPrompt(!0),H.start();let I=F.sessionId,J=F.sessionFile;return J&&(0,u.O8)(I,J),H.onDestroy(()=>w.delete(I)),w.set(I,H),d||H.beginExtensionBinding({forceEmptySystemPrompt:k?.length===0}),{session:H,realSessionId:I}})().finally(()=>{x.delete(a),B()});return x.set(a,E),E}let V=(0,r.s)({getSession:a=>H().get(a),registerSession:(a,b)=>{let c=new U(a,{...b?.exactSystemPrompt!==void 0?{exactSystemPrompt:()=>b.exactSystemPrompt}:{},chatOnly:b?.chatOnly}),d=a.sessionId,e=a.sessionFile;e&&(0,u.O8)(d,e),c.onDestroy(()=>H().delete(d)),H().set(d,c),c.start(),c.isChatOnly()||c.beginExtensionBinding()},reopenSession:async(a,b)=>(await L(a,b,void 0)).session,resolveSessionPath:u.resolveSessionPath,invalidateSessionList:u.mD,isBuiltInSubagentsEnabled:s.N});d()}catch(a){d(a)}})},12817:a=>{"use strict";a.exports=function(a){if(null===a||"object"!=typeof a)return a;if(a instanceof Object)var c={__proto__:b(a)};else var c=Object.create(null);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c};var b=Object.getPrototypeOf||function(a){return a.__proto__}},12969:(a,b,c)=>{"use strict";c(55511),c(29021),c(33873)},13884:(a,b,c)=>{"use strict";let d=c(93329);a.exports={toPromise:function(a){return(...b)=>new Promise((c,d)=>{b.push((a,b)=>{a?d(a):c(b)}),a(...b)})},toSync:function(a){return(...b)=>{let c,d;if(b.push((a,b)=>{c=a,d=b}),a(...b),c)throw c;return d}},toSyncOptions:function(a){var b;let c;if((a={...a}).fs=(c={...b=a.fs||d},["mkdir","realpath","stat","rmdir","utimes"].forEach(a=>{c[a]=(...c)=>{let d,e=c.pop();try{d=b[`${a}Sync`](...c)}catch(a){return e(a)}e(null,d)}}),c),"number"==typeof a.retries&&a.retries>0||a.retries&&"number"==typeof a.retries.retries&&a.retries.retries>0)throw Object.assign(Error("Cannot use retries with the sync api"),{code:"ESYNC"});return a}}},14916:(a,b,c)=>{"use strict";c.d(b,{C1:()=>e,G1:()=>f,kU:()=>d});let d=["read","grep","find","ls"],e=["bash","read","edit","write","grep","find","ls"],f=["read","bash","edit","write","grep","find","ls"]},15253:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{Fk:()=>h,Y1:()=>g});var e=c(75430),f=a([e]);function g(a,b){if(!(a&&(0,e.hasTrustRequiringProjectResources)(a)))return{requiresTrust:!1,trusted:!0};let c=new e.ProjectTrustStore(b);return{requiresTrust:!0,trusted:!0===c.get(a)}}function h(a,b){if(!g(a,b).requiresTrust)return;let c=new e.ProjectTrustStore(b);return{resolveProjectTrust:async()=>!0===c.get(a)}}e=(f.then?(await f)():f)[0],d()}catch(a){d(a)}})},16176:a=>{"use strict";let b=Symbol();a.exports.probe=function(a,c,d){let e=c[b];if(e)return c.stat(a,(a,b)=>{if(a)return d(a);d(null,b.mtime,e)});let f=new Date(1e3*Math.ceil(Date.now()/1e3)+5);c.utimes(a,f,f,e=>{if(e)return d(e);c.stat(a,(a,e)=>{if(a)return d(a);let f=e.mtime.getTime()%1e3==0?"s":"ms";Object.defineProperty(c,b,{value:f}),d(null,e.mtime,f)})})},a.exports.getMtime=function(a){let b=Date.now();return"s"===a&&(b=1e3*Math.ceil(b/1e3)),new Date(b)}},16983:(a,b,c)=>{"use strict";c.d(b,{Wv:()=>h,jN:()=>j,vH:()=>i});var d=c(29021),e=c(33873),f=c(83739),g=c(15011);let h=8;function i(a,b){if(b.length>h)throw Error(`Agent input_files accepts at most ${h} files`);let c=(0,d.realpathSync)(a),i=new Set([c]),j=new TextDecoder("utf-8",{fatal:!0}),k=new Set,l=[],m=0;for(let h of b){let b,n;if(!h.trim())throw Error("Agent input_files paths must not be empty");try{b=(0,d.realpathSync)((0,e.resolve)(a,h))}catch{throw Error(`Agent input file does not exist: ${h}`)}if(!(0,f.o)(b,i))throw Error(`Agent input file is outside the session cwd: ${h}`);if(!(0,d.statSync)(b).isFile())throw Error(`Agent input path is not a file: ${h}`);if(k.has(b))continue;k.add(b);let o=(0,d.readFileSync)(b);if((m+=o.byteLength)>524288)throw Error("Agent input_files exceeds the 524288-byte total limit");try{n=j.decode(o)}catch{throw Error(`Agent input file is not valid UTF-8 text: ${h}`)}l.push({path:(0,g.W3)((0,e.relative)(c,b)),content:n})}return l}function j(a,b){if(0===b.length)return a;let c=b.map(a=>`<document path=${JSON.stringify(a.path)}>
|
|
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."}),resume:e.Type.Optional(e.Type.String({description:"Existing subagent session ID to continue instead of creating a new session."})),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."})),isolation:e.Type.Optional(e.Type.String({description:"Run the subagent in an isolated git worktree."}))}),async execute(b,c,d,e,f){try{let g=c.resume?.trim(),h=g?await a.resume({parentContext:f,parentToolCallId:b,sessionId:g,task:c.prompt,description:c.description,...void 0!==c.run_in_background?{runInBackground:c.run_in_background}:{},signal:d,onUpdate:a=>e?.({content:[{type:"text",text:`${a.profile}: ${a.description} (${a.status})`}],details:j(a)})}):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}:{},..."worktree"===c.isolation?{isolation:"worktree"}:{},signal:d,onUpdate:a=>e?.({content:[{type:"text",text:`${a.profile}: ${a.description} (${a.status})`}],details:j(a)})});if(h.run.runInBackground)return h.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: ${h.run.sessionId}. You will be notified when it completes.`}],details:j(h.run)};let i=await h.completion;return{content:[{type:"text",text:k(i)}],details:j(i),..."failed"===i.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,{A4:()=>J,HG:()=>L,OF:()=>M});var e=c(75430),f=c(31239),g=c(29862),h=c(55511),i=c(29021),j=c(33873),k=c(18437),l=c(88250),m=c(96515),n=c(81186),o=c(87509),p=c(8084),q=c(41035),r=c(84851),s=c(70274),t=c(32302),u=c(69453),v=c(16525),w=c(99595),x=c(9210),y=c(7535),z=c(88002),A=c(65562),B=c(47128),C=c(15253),D=c(61577),E=c(57856),F=a([e,f,g,m,n,o,p,q,r,s,u,v,x,A,B,C]);[e,f,g,m,n,o,p,q,r,s,u,v,x,A,B,C]=F.then?(await F)():F;let N=new Set(["agent_end","agent_settled","auto_compaction_end","compaction_end"]),O=function(a=process.env.PI_WEB_IDLE_TIMEOUT_MS){if(void 0!==a&&""!==a.trim()){let b=Number(a);if(Number.isFinite(b)&&b>=0&&b<=0x7fffffff)return b;console.warn(`[pi-web] invalid PI_WEB_IDLE_TIMEOUT_MS "${a}", falling back to 10 minutes`)}return 6e5}(),P=["read","bash","edit","write","grep","find","ls"],Q={accent:"",border:"",borderAccent:"",borderMuted:"",success:"",error:"",warning:"",muted:"",dim:"",text:"",thinkingText:"",scrollbarTrack:"",scrollbarThumb:"",searchMatchText:"",userMessageText:"",customMessageText:"",customMessageLabel:"",toolTitle:"",toolOutput:"",mdHeading:"",mdLink:"",mdLinkUrl:"",mdCode:"",mdCodeBlock:"",mdCodeBlockBorder:"",mdQuote:"",mdQuoteBorder:"",mdHr:"",mdListBullet:"",toolDiffAdded:"",toolDiffRemoved:"",toolDiffContext:"",syntaxComment:"",syntaxKeyword:"",syntaxFunction:"",syntaxVariable:"",syntaxString:"",syntaxNumber:"",syntaxType:"",syntaxOperator:"",syntaxPunctuation:"",thinkingOff:"",thinkingMinimal:"",thinkingLow:"",thinkingMedium:"",thinkingHigh:"",thinkingXhigh:"",thinkingMax:"",bashMode:""},R={selectedBg:"",searchMatchBg:"",userMessageBg:"",customMessageBg:"",toolPendingBg:"",toolSuccessBg:"",toolErrorBg:""};class S extends e.Theme{constructor(){super(Q,R,"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 T=new S,U=new g.KeybindingsManager(g.TUI_KEYBINDINGS);function G(a,b){if(0===b.length)return[];let c=new Set(P),d=a.getAllTools().map(a=>a.name).filter(a=>!c.has(a));return[...new Set([...b,...d])]}class V{constructor(a,b={}){this.inner=a,this.listeners=[],this.pendingUiResponses=new Map,this.pendingUiRequests=new Map,this.activeCustomUis=new Map,this.extensionStatuses=new Map,this.extensionWidgets=new Map,this.activeExtensionWidgets=new Map,this.extensionWidgetGenerations=new Map,this.extensionWidgetsResetting=!1,this.pendingPromptCount=0,this.promptAdmissionTail=Promise.resolve(),this.extensionsBound=!1,this.extensionBindingPromise=null,this.extensionBindingError=null,this.forceEmptySystemPrompt=!1,this.unsubscribe=null,this.idleTimer=null,this.onDestroyCallback=null,this.shutdownPromise=null,this._alive=!0,this.lastAgentStart=0,this.activityTracker=(0,w.S)(),this.forcedPromptProjectionInstalled=!1,this.exactSystemPrompt=b.exactSystemPrompt,this.chatOnly=b.chatOnly??!1,this.installForcedPromptProjection()}hasPendingUiRequest(){return this.pendingUiRequests.size>0}lastAgentStartAt(){return this.lastAgentStart}get sessionId(){return this.inner.sessionId}get sessionFile(){return this.inner.sessionFile??""}get cwd(){return this.inner.sessionManager.getCwd()}get streamingMessage(){return this.inner.agent.state?.streamingMessage}get isStreaming(){return this.inner.isStreaming}isAlive(){return this._alive}isChatOnly(){return this.chatOnly}isRunning(){return this._alive&&(this.pendingPromptCount>0||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning)}start(){this.unsubscribe=this.inner.subscribe(a=>{"agent_start"===a.type&&(this.lastAgentStart=Date.now()),"agent_end"===a.type&&(0,u.mD)(),N.has(a.type)&&this.resetIdleTimer();try{this.persistSessionActivity(a)}catch(b){console.error(`[pi-web] 会话活跃写库失败(${a.type}):`,b instanceof Error?b.message:String(b))}this.emit(a)}),this.resetIdleTimer()}persistSessionActivity(a){let b=this.activityTracker.handle(a);if(!b)return;let c=this.inner.sessionId;if(c){if("touch"===b.kind)return void(0,A.xE)(c);(0,A.YZ)(c,b),(0,A.HO)(c,K(this.inner.sessionManager.getEntries()))}}setForceEmptySystemPrompt(a){this.forceEmptySystemPrompt=a,this.ensureForcedPromptProjection()}beginExtensionBinding(a={}){this.ensureExtensionsBound(a).catch(a=>{console.error("[pi-web] failed to dispatch session_start to extensions:",a instanceof Error?a.message:a)})}async waitUntilReady(){await this.waitForExtensionsBound()}installForcedPromptProjection(){if(this.forcedPromptProjectionInstalled)return;let a=this.inner.agent;if(!a)return;this.forcedPromptProjectionInstalled=!0;let b=a.transformContext;a.transformContext=async(a,c)=>{let d=b?await b(a,c):a,e=this.forceEmptySystemPrompt?"":this.exactSystemPrompt?.();if(void 0===e)return d;let g=(0,f.getCurrentSystemMessage)(d);return[{role:"system",content:e,...g?.toolsAdded?{toolsAdded:g.toolsAdded}:{},timestamp:g?.timestamp??Date.now()},...d.filter(a=>"system"!==a.role)]}}ensureForcedPromptProjection(){this.installForcedPromptProjection()}ensureExtensionsBound(a={}){return(a.forceEmptySystemPrompt&&(this.forceEmptySystemPrompt=!0),this.extensionsBound)?(this.ensureForcedPromptProjection(),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,h.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.ensureForcedPromptProjection(),console.log(`[pi-web] session_start dispatched to extensions for session ${this.inner.sessionId}`)})().catch(a=>{throw this.extensionBindingError=a,a})),this.extensionBindingPromise)}async waitForExtensionsBound(){try{this.extensionBindingPromise&&await this.extensionBindingPromise}catch(a){throw a instanceof Error?a:Error(String(a))}if(this.extensionBindingError)throw this.extensionBindingError instanceof Error?this.extensionBindingError:Error(String(this.extensionBindingError))}shouldWaitForExtensions(a){return"prompt"===a||"steer"===a||"follow_up"===a||"get_commands"===a||"get_state"===a}async withFinalRunningNotification(a){try{return await a()}finally{this.resetIdleTimer()}}emit(a){for(let b of this.listeners)try{b(a)}catch(b){console.error(`[pi-web] failed to deliver ${a.type} event:`,b instanceof Error?b.message:b)}}async acquirePromptAdmission(){let a,b=this.promptAdmissionTail;return this.promptAdmissionTail=new Promise(b=>{a=b}),await b,a}resetIdleTimer(){0!==O&&(this.idleTimer&&clearTimeout(this.idleTimer),this.idleTimer=setTimeout(()=>{this.isRunning()?this.resetIdleTimer():this.shutdown().catch(a=>{console.error("[pi-web] failed to shut down idle session:",a instanceof Error?a.message:a)})},O))}onEvent(a){for(let b of(this.listeners.push(a),this.pendingUiRequests.values()))a(b);return()=>{let b=this.listeners.indexOf(a);-1!==b&&this.listeners.splice(b,1)}}onDestroy(a){this.onDestroyCallback=a}async send(a){this.resetIdleTimer();let b=a.type;if(this.shouldWaitForExtensions(b)&&await this.waitForExtensionsBound(),"prompt"===b||"steer"===b||"follow_up"===b){let b=(0,k.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");let e=a.images,f=a.streamingBehavior,g=!1,h=!1,i=!1,j=new Promise((a,d)=>{b=()=>{g=!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.pendingPromptCount+=1;try{d=this.inner.prompt(a.message,{...e?.length?{images:e}:{},...f?{streamingBehavior:f}:{},source:"rpc",preflightResult:a=>{a&&b()}})}catch(a){throw k(),a}d.then(()=>{b(),k(),f||this.emit({type:"prompt_done"})},a=>{c(a),k(),(0,u.mD)(),g&&(this.emit({type:"prompt_error",errorMessage:a instanceof Error?a.message:String(a)}),f||this.emit({type:"prompt_done"}))}).catch(a=>{console.error("[pi-web] prompt completion handler failed:",a instanceof Error?a.message:a)}),await j;let l="string"==typeof a.message?a.message.trim():"",m=this.inner.sessionId;if(l&&m&&!K(this.inner.sessionManager.getEntries()))try{(0,A.HO)(m,l.slice(0,x.XK))}catch(a){console.error(`[pi-web] 首条消息写库失败 session=${m}:`,a instanceof Error?a.message:String(a))}return null}finally{b()}}case"abort":return await this.withFinalRunningNotification(()=>this.inner.abort()),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,autoCompactionEnabled:this.inner.autoCompactionEnabled,autoRetryEnabled:this.inner.autoRetryEnabled,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()]},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()}}case"set_model":{let{provider:b,modelId:c}=a,d=this.inner.modelRuntime.getModel(b,c);if(d||(await this.inner.modelRuntime.refresh({allowNetwork:!1}),d=this.inner.modelRuntime.getModel(b,c)),!d)throw Error(`Model not found: ${b}/${c}`);return await this.inner.setModel(d),(0,l.kn)(),(0,u.mD)(),{id:d.id,provider:d.provider}}case"fork_branch":{if(this.isRunning())throw Error("Cannot fork while the session is running");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),h=g.createBranchedSession(b);if(!h)throw Error("Failed to create forked session");if(!(0,i.existsSync)(h)){let a=[g.getHeader(),...g.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,i.writeFileSync)(h,a,{encoding:"utf8",flag:"wx"}),g.flushed=!0}let j=e.SessionManager.open(h,f).getSessionId();(0,u.O8)(j,h),(0,u.mD)();let k=c.getSessionId();return await (0,v.Pv)(h,k,(0,A.l6)(k)),{cancelled:!1,newSessionId:j}}case"fork":{let b;if(this.inner.isBashRunning)throw Error("Cannot fork while a shell command is running");let c=this.inner.sessionId,d=a.entryId,f=this.inner.sessionManager,g=this.inner.sessionFile;if(!f.isPersisted())return{cancelled:!0};if(!g)throw Error("Persisted session is missing a session file");let h=f.getEntry(d);if(!h)throw Error("Invalid entry ID for forking");let j=f.getSessionDir();if(h.parentId){let a=e.SessionManager.open(g,j),c=a.createBranchedSession(h.parentId);if(!c)throw Error("Failed to create forked session");if(b=c,!(0,i.existsSync)(b)){let c=[a.getHeader(),...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,i.writeFileSync)(b,c,{encoding:"utf8",flag:"wx"}),a.flushed=!0}}else{let a=e.SessionManager.create(f.getCwd(),j);a.newSession({parentSession:g}),a.getSessionFile()&&a._rewriteFile(),b=a.getSessionFile()}let k=e.SessionManager.open(b,j).getSessionId();(0,u.O8)(k,b),(0,u.mD)();let l=f.getCwd(),m=(0,A.l6)(c);await this.shutdown();try{let a=await (0,z.KI)(l??"");(0,A.YH)(k,{path:b,cwd:l??"",projectKey:(0,y.z)(a?.projectRoot??l??""),parentId:c,taskId:m})}catch(a){console.error(`[pi-web] fork 建行失败 session=${k}:`,a instanceof Error?a.message:String(a))}try{await (0,B.BC)(c)}catch(a){console.error(`[pi-web] fork 入板失败 source=${c}:`,a instanceof Error?a.message:String(a))}return{cancelled:!1,newSessionId:k}}case"navigate_tree":if(this.inner.isBashRunning)throw Error("Cannot navigate while a shell command is running");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,u.mD)(),null}case"compact":try{return await this.withFinalRunningNotification(()=>this.inner.compact(a.customInstructions))}finally{(0,u.mD)()}case"set_session_name":{let b=a.name?.trim();if(!b)throw Error("Session name cannot be empty");this.inner.setSessionName(b);try{await (0,A.Bm)(this.inner.sessionId,b)}catch(a){console.error("[pi-web] 会话标题写库失败:",a)}return(0,u.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"set_auto_compaction":return this.inner.setAutoCompactionEnabled(a.enabled),null;case"clear_queue":return this.inner.clearQueue();case"steer":{let b=a.images;return await this.inner.steer(a.message,b?.length?b:void 0),null}case"follow_up":{let b=a.images;return await this.inner.followUp(a.message,b?.length?b:void 0),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;if((0,q.ph)(this.inner.sessionManager.getEntries()))throw Error("Subagent tool selection is fixed by its profile");return this.setForceEmptySystemPrompt(0===b.length),this.inner.setActiveToolsByName(G(this.inner,b)),null}case"reload":return await this.waitForExtensionsBound(),this.extensionStatuses.clear(),this.resetExtensionWidgetsForReload(),this.syncProjectTrust(),await this.inner.reload(),"function"!=typeof this.inner.bindExtensions&&this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc"),(0,l.kn)(),{success:!0};case"abort_compaction":return this.inner.abortCompaction(),null;case"extension_ui_response":return this.resolveExtensionUiResponse(a),null;case"extension_ui_input":return this.handleExtensionUiInput(a.id,a.data),null;case"set_auto_retry":return this.inner.setAutoRetryEnabled(a.enabled),null;case"bash":{if(this.pendingPromptCount>0||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.executeBash(a.command,void 0,{excludeFromContext:a.excludeFromContext,operations:(0,n.J1)({shellPath:this.inner.settingsManager.getShellPath()})});try{return await b}finally{this.resetIdleTimer(),(0,u.mD)()}}case"abort_bash":return this.inner.abortBash(),null;default:throw Error(`Unsupported command: ${b}`)}}destroy(){if(this._alive){for(let a of(this._alive=!1,this.idleTimer&&clearTimeout(this.idleTimer),this.inner.isBashRunning&&this.inner.abortBash(),this.unsubscribe?.(),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.clearExtensionWidgets(!1);try{this.inner.dispose()}finally{this.onDestroyCallback?.()}}}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)}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())}nextExtensionWidgetGeneration(a){let b=(this.extensionWidgetGenerations.get(a)??0)+1;return this.extensionWidgetGenerations.set(a,b),b}disposeExtensionWidgetComponent(a){if(!a||"object"!=typeof a&&"function"!=typeof a)return;let b=a.dispose;if("function"==typeof b)try{b.call(a)}catch{}}emitExtensionWidgetClear(a){this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:void 0,widgetPlacement:void 0})}clearExtensionWidget(a,b=!0){let c=this.nextExtensionWidgetGeneration(a),d=this.activeExtensionWidgets.get(a);return this.activeExtensionWidgets.delete(a),this.extensionWidgets.delete(a),d&&this.disposeExtensionWidgetComponent(d.component),this.extensionWidgetGenerations.get(a)!==c||b&&this.emitExtensionWidgetClear(a),c}clearExtensionWidgets(a){for(let b of new Set([...this.extensionWidgets.keys(),...this.activeExtensionWidgets.keys()]))this.clearExtensionWidget(b,a)}resetExtensionWidgetsForReload(){this.extensionWidgetsResetting=!0;try{for(let a of[...this.activeExtensionWidgets.keys()])this.clearExtensionWidget(a);this.extensionWidgets.clear()}finally{this.extensionWidgetsResetting=!1}}emitExtensionWidgetError(a,b){this.emit({type:"extension_error",extensionPath:`extension-widget:${a}`,event:"setWidget",error:b instanceof Error?b.message:String(b)})}failExtensionWidget(a,b,c,d,e){if(this.extensionWidgetGenerations.get(a)!==b)return void this.disposeExtensionWidgetComponent(e);let f=this.activeExtensionWidgets.get(a),g=!d;f?.generation===b?(g=f.rendered||!f.clearEmitted,this.activeExtensionWidgets.delete(a),this.disposeExtensionWidgetComponent(f.component)):this.disposeExtensionWidgetComponent(e),this.extensionWidgetGenerations.get(a)!==b||(this.extensionWidgets.delete(a),g&&this.emitExtensionWidgetClear(a)),this.emitExtensionWidgetError(a,c)}renderExtensionWidget(a){let b;if(this.activeExtensionWidgets.get(a.key)!==a||this.extensionWidgetGenerations.get(a.key)!==a.generation)return;try{b=a.component.render(E.p1)}catch(b){this.failExtensionWidget(a.key,a.generation,b,a.clearEmitted);return}if(!Array.isArray(b)||!b.every(a=>"string"==typeof a))return void this.failExtensionWidget(a.key,a.generation,Error("Extension widget render must return string[]"),a.clearEmitted);if(this.activeExtensionWidgets.get(a.key)!==a||this.extensionWidgetGenerations.get(a.key)!==a.generation)return;let c=b;this.extensionWidgets.set(a.key,{key:a.key,lines:c,placement:a.placement}),a.rendered=!0,this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"setWidget",widgetKey:a.key,widgetLines:c,widgetPlacement:a.placement})}setExtensionWidgetFactory(a,b,c){let d,e=this.extensionWidgets.has(a)||this.activeExtensionWidgets.has(a),f=this.clearExtensionWidget(a,e);if(this.extensionWidgetGenerations.get(a)!==f)return;let g=(0,E.TQ)(()=>{let b=this.activeExtensionWidgets.get(a);b?.generation===f&&this.renderExtensionWidget(b)},E.p1);try{d=b(g,T)}catch(b){this.failExtensionWidget(a,f,b,e);return}if(this.extensionWidgetGenerations.get(a)!==f)return void this.disposeExtensionWidgetComponent(d);if(!d||"object"!=typeof d&&"function"!=typeof d||"function"!=typeof d.render)return void this.failExtensionWidget(a,f,Error("Extension widget factory must return a component with render(width)"),e,d);let h={key:a,component:d,placement:c?.placement??"aboveEditor",generation:f,clearEmitted:e,rendered:!1};this.activeExtensionWidgets.set(a,h),this.renderExtensionWidget(h)}getCustomUiWidth(a){if(!a||"object"!=typeof a)return E.p1;let b=a.overlayOptions,c="function"==typeof b?b():b;if(!c||"object"!=typeof c)return E.p1;let d=c.width;return"number"==typeof d&&Number.isFinite(d)?Math.max(40,Math.min(140,Math.round(d))):92}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=(0,h.randomUUID)(),d=this.getCustomUiWidth(b);return new Promise(b=>{let e=!1,f=(0,E.TQ)(()=>{let a=this.activeCustomUis.get(c);a&&this.emitCustomUiRender(c,a)},d),g=a=>{e||(e=!0,b(a))},h=a=>{this.activeCustomUis.has(c)?this.closeCustomUi(c,a):g(a)};Promise.resolve().then(()=>a(f,T,U,h)).then(a=>{if(e){try{a?.dispose?.()}catch{}return}if(!a||"object"!=typeof a||"function"!=typeof a.render)return void g(void 0);let b={component:a,width:d,resolve:a=>g(a),settled:!1};this.activeCustomUis.set(c,b),this.emitCustomUiRender(c,b)}).catch(a=>{e||(this.emit({type:"extension_error",extensionPath:`custom-ui:${c}`,event:"custom_ui",error:a instanceof Error?a.message:String(a)}),g(void 0))})})}requestExtensionUi(a,b,c,d,e){if(e?.aborted)return Promise.resolve(b);let f=(0,h.randomUUID)(),g={type:"extension_ui_request",id:f,...a,...d?{timeout:d,expiresAt:Date.now()+d}:{}};return new Promise(a=>{let h,i=()=>{h&&clearTimeout(h),e?.removeEventListener("abort",k),this.pendingUiRequests.delete(f),this.pendingUiResponses.delete(f)},j=b=>{i(),a(b)},k=()=>j(b);d&&(h=setTimeout(()=>j(b),d)),e?.addEventListener("abort",k,{once:!0}),this.pendingUiRequests.set(f,g),this.pendingUiResponses.set(f,{resolve:a=>j(c(a)),cancel:()=>j(b)}),this.emit(g)})}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,h.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,h.randomUUID)(),method:"setStatus",statusKey:a,statusText:b})},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:(a,b,c)=>{if(!this._alive||this.extensionWidgetsResetting)return;if("function"==typeof b)return void this.setExtensionWidgetFactory(a,b,c);if(void 0!==b&&!Array.isArray(b))return;if(void 0===b)return void this.clearExtensionWidget(a);let d=this.activeExtensionWidgets.has(a)?this.clearExtensionWidget(a):this.nextExtensionWidgetGeneration(a);this.extensionWidgetGenerations.get(a)===d&&(this.extensionWidgets.set(a,{key:a,lines:b,placement:c?.placement??"aboveEditor"}),this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"setWidget",widgetKey:a,widgetLines:b,widgetPlacement:c?.placement}))},setFooter:()=>{},setHeader:()=>{},setTitle:a=>{this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"setTitle",title:a})},custom:(a,b)=>this.requestExtensionCustomUi(a,b),pasteToEditor:a=>{this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"set_editor_text",text:a})},setEditorText:a=>{this.emit({type:"extension_ui_request",id:(0,h.randomUUID)(),method:"set_editor_text",text:a})},getEditorText:()=>"",addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>void 0,get theme(){return T},getAllThemes:()=>[],getTheme:()=>void 0,setTheme:()=>({success:!1,error:"Theme switching is not supported in Pi Web extension UI yet"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}}}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.resetExtensionWidgetsForReload(),this.syncProjectTrust(),await this.inner.reload({beforeSessionStart:()=>{this.inner.extensionRunner.setUIContext?.(this.createExtensionUiContext(),"rpc")}})}}}syncProjectTrust(){let a=(0,C.Y1)(this.cwd,(0,e.getAgentDir)());this.inner.settingsManager.setProjectTrusted(a.trusted)}}function H(){if(!globalThis.__piSessions){globalThis.__piSessions=new Map;let a=()=>globalThis.__piSessions?.forEach(a=>a.destroy());process.once("exit",a),process.once("SIGINT",a),process.once("SIGTERM",a)}return globalThis.__piSessions}async function I(a,b){let c=a.getSessionFile();if(!c||(0,i.existsSync)(c))return;let d=a.getHeader();if(!d)return;let e=[d,...a.getEntries()].map(a=>JSON.stringify(a)).join("\n")+"\n";(0,i.writeFileSync)(c,e,{encoding:"utf8",flag:"wx"}),a.flushed=!0,(0,u.O8)(b,c);let f=a.getCwd();try{let a=await (0,z.KI)(f??"");(0,A.YH)(b,{path:c,cwd:f??"",projectKey:(0,y.z)(a?.projectRoot??f??"")})}catch(a){console.error(`[pi-web] 新会话建行失败 session=${b}:`,a instanceof Error?a.message:String(a))}}function J(a){return H().get(a)}function K(a){for(let b of a){if(b?.type!=="message"||b.message?.role!=="user")continue;let a=(function(a){if("bashExecution"===a.message.role)return"";let b=a.message.content;return"string"==typeof b?b:b.map(a=>"text"===a.type?a.text:"").filter(Boolean).join(" ")})(b).trim();if(a)return a.slice(0,x.XK)}return""}function L(){let a=new Set;for(let[b,c]of H())c.isRunning()&&a.add(c.sessionId||b);return[...a]}async function M(a,b,c,d={}){let f,g,h,{toolNames:k,initialModel:r,thinkingLevel:v}=d,w=H(),x=(globalThis.__piStartLocks||(globalThis.__piStartLocks=new Map),globalThis.__piStartLocks),y=w.get(a);if(y?.isAlive())return{session:y,realSessionId:a};let z=x.get(a);if(z)return z;if(b)f=e.SessionManager.open(b,void 0);else{if(!c)throw Error("cwd is required for a new session");let b=a.length>0&&!a.startsWith("__");f=e.SessionManager.create(c,void 0,b?{id:a}:void 0),b&&await I(f,a)}let A=f.getCwd(),B=(globalThis.__piStartingSessionCwds||(globalThis.__piStartingSessionCwds=new Map),g=globalThis.__piStartingSessionCwds,h=function(a){let b=(0,j.resolve)(a);try{return(0,i.realpathSync)(b)}catch{return b}}(A),g.set(h,(g.get(h)??0)+1),()=>{let a=(g.get(h)??1)-1;a>0?g.set(h,a):g.delete(h)}),E=(async()=>{let a=b?(0,q.ph)(f.getEntries()):null,c=!!(a?.loadExtensions||a?.loadSkills),d=a?0===a.tools.length&&!c:k?.length===0;d||(0,e.initTheme)();let g=(0,e.getAgentDir)(),h=a?.tools;a||void 0===k||(h=0===k.length?[]:void 0);let i=(0,C.Fk)(A,g),j=e.SettingsManager.create(A,g),x=await (0,e.createAgentSessionServices)({cwd:A,agentDir:g,settingsManager:j,resourceLoaderOptions:a?{noExtensions:!a.loadExtensions,noSkills:!a.loadSkills,noPromptTemplates:!0,noThemes:!0,noContextFiles:!0,systemPrompt:" ",appendSystemPrompt:a.appendSystemPrompt}:d?t.M:{extensionFactories:[(0,n.eD)({cwd:A,settings:j}),(0,o.U)(),(0,p.Vj)(W.extensionRuntime,()=>(0,q.IR)(A),s.N)],extensionsOverride:a=>(0,n.Ds)((0,p.U6)(a))},...i?{resourceLoaderReloadOptions:i}:{}}),y=await (0,m.p)(x.modelRuntime,x.settingsManager.getEnabledModels()),z=x.settingsManager.getDefaultProvider(),B=x.settingsManager.getDefaultModel(),E=f.getBranch().some(a=>"message"===a.type)?{scopedModels:[...y.scopedModels]}:(0,m.I)(y,{...r?{requestedModel:r}:{},...z&&B?{defaultModel:{provider:z,modelId:B}}:{},...v?{thinkingLevel:v}:{}}),{session:F}=await (0,e.createAgentSessionFromServices)({services:x,sessionManager:f,...E.model?{model:E.model}:{},...E.thinkingLevel?{thinkingLevel:E.thinkingLevel}:{},...E.scopedModels.length>0?{scopedModels:E.scopedModels}:{},...void 0!==h?{tools:h}:{}});(await (0,D.o)(x.settingsManager,{...r?{model:r}:{},...v?{thinkingLevel:v}:{}},{...F.model?{model:{provider:F.model.provider,modelId:F.model.id}}:{},thinkingLevel:F.thinkingLevel,supportsThinking:F.supportsThinking()})).modelDefaultChanged&&(0,l.kn)(),k&&k.length>0&&F.setActiveToolsByName(G(F,k));let H=new V(F);k?.length===0&&H.setForceEmptySystemPrompt(!0),H.start();let I=F.sessionId,J=F.sessionFile;return J&&(0,u.O8)(I,J),H.onDestroy(()=>w.delete(I)),w.set(I,H),d||H.beginExtensionBinding({forceEmptySystemPrompt:k?.length===0}),{session:H,realSessionId:I}})().finally(()=>{x.delete(a),B()});return x.set(a,E),E}let W=(0,r.s)({getSession:a=>H().get(a),registerSession:(a,b)=>{let c=new V(a,{...b?.exactSystemPrompt!==void 0?{exactSystemPrompt:()=>b.exactSystemPrompt}:{},chatOnly:b?.chatOnly}),d=a.sessionId,e=a.sessionFile;e&&(0,u.O8)(d,e),c.onDestroy(()=>H().delete(d)),H().set(d,c),c.start(),c.isChatOnly()||c.beginExtensionBinding()},reopenSession:async(a,b)=>(await M(a,b,void 0)).session,resolveSessionPath:u.resolveSessionPath,invalidateSessionList:u.mD,isBuiltInSubagentsEnabled:s.N});d()}catch(a){d(a)}})},12817:a=>{"use strict";a.exports=function(a){if(null===a||"object"!=typeof a)return a;if(a instanceof Object)var c={__proto__:b(a)};else var c=Object.create(null);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c};var b=Object.getPrototypeOf||function(a){return a.__proto__}},12969:(a,b,c)=>{"use strict";c(55511),c(29021),c(33873)},13884:(a,b,c)=>{"use strict";let d=c(93329);a.exports={toPromise:function(a){return(...b)=>new Promise((c,d)=>{b.push((a,b)=>{a?d(a):c(b)}),a(...b)})},toSync:function(a){return(...b)=>{let c,d;if(b.push((a,b)=>{c=a,d=b}),a(...b),c)throw c;return d}},toSyncOptions:function(a){var b;let c;if((a={...a}).fs=(c={...b=a.fs||d},["mkdir","realpath","stat","rmdir","utimes"].forEach(a=>{c[a]=(...c)=>{let d,e=c.pop();try{d=b[`${a}Sync`](...c)}catch(a){return e(a)}e(null,d)}}),c),"number"==typeof a.retries&&a.retries>0||a.retries&&"number"==typeof a.retries.retries&&a.retries.retries>0)throw Object.assign(Error("Cannot use retries with the sync api"),{code:"ESYNC"});return a}}},14916:(a,b,c)=>{"use strict";c.d(b,{C1:()=>e,G1:()=>f,kU:()=>d});let d=["read","grep","find","ls"],e=["bash","read","edit","write","grep","find","ls"],f=["read","bash","edit","write","grep","find","ls"]},15253:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{Fk:()=>h,Y1:()=>g});var e=c(75430),f=a([e]);function g(a,b){if(!(a&&(0,e.hasTrustRequiringProjectResources)(a)))return{requiresTrust:!1,trusted:!0};let c=new e.ProjectTrustStore(b);return{requiresTrust:!0,trusted:!0===c.get(a)}}function h(a,b){if(!g(a,b).requiresTrust)return;let c=new e.ProjectTrustStore(b);return{resolveProjectTrust:async()=>!0===c.get(a)}}e=(f.then?(await f)():f)[0],d()}catch(a){d(a)}})},16176:a=>{"use strict";let b=Symbol();a.exports.probe=function(a,c,d){let e=c[b];if(e)return c.stat(a,(a,b)=>{if(a)return d(a);d(null,b.mtime,e)});let f=new Date(1e3*Math.ceil(Date.now()/1e3)+5);c.utimes(a,f,f,e=>{if(e)return d(e);c.stat(a,(a,e)=>{if(a)return d(a);let f=e.mtime.getTime()%1e3==0?"s":"ms";Object.defineProperty(c,b,{value:f}),d(null,e.mtime,f)})})},a.exports.getMtime=function(a){let b=Date.now();return"s"===a&&(b=1e3*Math.ceil(b/1e3)),new Date(b)}},16983:(a,b,c)=>{"use strict";c.d(b,{Wv:()=>h,jN:()=>j,vH:()=>i});var d=c(29021),e=c(33873),f=c(83739),g=c(15011);let h=8;function i(a,b){if(b.length>h)throw Error(`Agent input_files accepts at most ${h} files`);let c=(0,d.realpathSync)(a),i=new Set([c]),j=new TextDecoder("utf-8",{fatal:!0}),k=new Set,l=[],m=0;for(let h of b){let b,n;if(!h.trim())throw Error("Agent input_files paths must not be empty");try{b=(0,d.realpathSync)((0,e.resolve)(a,h))}catch{throw Error(`Agent input file does not exist: ${h}`)}if(!(0,f.o)(b,i))throw Error(`Agent input file is outside the session cwd: ${h}`);if(!(0,d.statSync)(b).isFile())throw Error(`Agent input path is not a file: ${h}`);if(k.has(b))continue;k.add(b);let o=(0,d.readFileSync)(b);if((m+=o.byteLength)>524288)throw Error("Agent input_files exceeds the 524288-byte total limit");try{n=j.decode(o)}catch{throw Error(`Agent input file is not valid UTF-8 text: ${h}`)}l.push({path:(0,g.W3)((0,e.relative)(c,b)),content:n})}return l}function j(a,b){if(0===b.length)return a;let c=b.map(a=>`<document path=${JSON.stringify(a.path)}>
|
|
5
5
|
${a.content}
|
|
6
6
|
</document>`).join("\n\n");return`${a}
|
|
7
7
|
|