@rexvane/piweb 0.3.11 → 0.3.12

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.
Files changed (170) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +6 -5
  3. package/.next/build-manifest.json +6 -6
  4. package/.next/prerender-manifest.json +7 -7
  5. package/.next/react-loadable-manifest.json +6 -6
  6. package/.next/routes-manifest.json +6 -0
  7. package/.next/server/app/_global-error/page.js +2 -2
  8. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/_global-error.html +1 -1
  10. package/.next/server/app/_global-error.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/server/app/_not-found/page.js +1 -1
  15. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/.next/server/app/_not-found.html +1 -1
  17. package/.next/server/app/_not-found.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  21. package/.next/server/app/api/agent/[id]/events/route.js +2 -2
  22. package/.next/server/app/api/agent/[id]/route.js +1 -1
  23. package/.next/server/app/api/agent/[id]/tree/route.js +1 -1
  24. package/.next/server/app/api/agent/new/route.js +1 -1
  25. package/.next/server/app/api/config/route.js +1 -1
  26. package/.next/server/app/api/files/route.js +1 -1
  27. package/.next/server/app/api/git/route.js +2 -2
  28. package/.next/server/app/api/growth/route.js +1 -1
  29. package/.next/server/app/api/health/route.js +1 -1
  30. package/.next/server/app/api/models/route.js +1 -1
  31. package/.next/server/app/api/pi-settings/route.js +1 -1
  32. package/.next/server/app/api/plugins/route.js +1 -1
  33. package/.next/server/app/api/prompts/route.js +1 -0
  34. package/.next/server/app/api/prompts/route.js.nft.json +1 -0
  35. package/.next/server/app/api/prompts/route_client-reference-manifest.js +1 -0
  36. package/.next/server/app/api/security/route.js +1 -1
  37. package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
  38. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  39. package/.next/server/app/api/sessions/route.js +1 -1
  40. package/.next/server/app/api/skills/route.js +2 -2
  41. package/.next/server/app/api/update/route.js +2 -2
  42. package/.next/server/app/api/version/route.js +1 -1
  43. package/.next/server/app/api/web-auth/route.js +1 -1
  44. package/.next/server/app/api/workspaces/route.js +1 -1
  45. package/.next/server/app/icon.svg/route.js +1 -1
  46. package/.next/server/app/index.html +1 -1
  47. package/.next/server/app/index.rsc +3 -3
  48. package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
  49. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  50. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  51. package/.next/server/app/login/page.js +1 -1
  52. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  53. package/.next/server/app/login.html +1 -1
  54. package/.next/server/app/login.rsc +2 -2
  55. package/.next/server/app/login.segments/_full.segment.rsc +2 -2
  56. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  57. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  58. package/.next/server/app/page.js +1 -1
  59. package/.next/server/app/page_client-reference-manifest.js +1 -1
  60. package/.next/server/app-paths-manifest.json +6 -5
  61. package/.next/server/chunks/496.js +1 -1
  62. package/.next/server/chunks/686.js +1 -1
  63. package/.next/server/middleware-build-manifest.js +1 -1
  64. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  65. package/.next/server/pages/404.html +1 -1
  66. package/.next/server/pages/500.html +1 -1
  67. package/.next/server/server-reference-manifest.json +1 -1
  68. package/.next/static/2kt2UiWjv_viXpNlfjvBT/_buildManifest.js +1 -0
  69. package/.next/static/chunks/2155.2f27fe7098987699.js +1 -0
  70. package/.next/static/chunks/2608.ec8ff1f5767c9056.js +1 -0
  71. package/.next/static/chunks/2716.a9e808190a4e2424.js +1 -0
  72. package/.next/static/chunks/{794-d1a40dcf24d651d9.js → 3794-3679f1c05160977c.js} +1 -1
  73. package/.next/static/chunks/4127.dff5c3b33c6bfd1b.js +1 -0
  74. package/.next/static/chunks/4673.d3d0a7f2599080fb.js +1 -0
  75. package/.next/static/chunks/4686-5bbee099126af797.js +1 -0
  76. package/.next/static/chunks/4bd1b696-93bf506b236d6248.js +1 -0
  77. package/.next/static/chunks/app/_global-error/page-961c055baebb3872.js +1 -0
  78. package/.next/static/chunks/app/_not-found/page-2d40d1d7d916666a.js +1 -0
  79. package/.next/static/chunks/app/api/agent/[id]/events/route-961c055baebb3872.js +1 -0
  80. package/.next/static/chunks/app/api/agent/[id]/route-961c055baebb3872.js +1 -0
  81. package/.next/static/chunks/app/api/agent/[id]/tree/route-961c055baebb3872.js +1 -0
  82. package/.next/static/chunks/app/api/agent/new/route-961c055baebb3872.js +1 -0
  83. package/.next/static/chunks/app/api/config/route-961c055baebb3872.js +1 -0
  84. package/.next/static/chunks/app/api/files/route-961c055baebb3872.js +1 -0
  85. package/.next/static/chunks/app/api/git/route-961c055baebb3872.js +1 -0
  86. package/.next/static/chunks/app/api/growth/route-961c055baebb3872.js +1 -0
  87. package/.next/static/chunks/app/api/health/route-961c055baebb3872.js +1 -0
  88. package/.next/static/chunks/app/api/models/route-961c055baebb3872.js +1 -0
  89. package/.next/static/chunks/app/api/pi-settings/route-961c055baebb3872.js +1 -0
  90. package/.next/static/chunks/app/api/plugins/route-961c055baebb3872.js +1 -0
  91. package/.next/static/chunks/app/api/prompts/route-961c055baebb3872.js +1 -0
  92. package/.next/static/chunks/app/api/security/route-961c055baebb3872.js +1 -0
  93. package/.next/static/chunks/app/api/sessions/[id]/export/route-961c055baebb3872.js +1 -0
  94. package/.next/static/chunks/app/api/sessions/[id]/route-961c055baebb3872.js +1 -0
  95. package/.next/static/chunks/app/api/sessions/route-961c055baebb3872.js +1 -0
  96. package/.next/static/chunks/app/api/skills/route-961c055baebb3872.js +1 -0
  97. package/.next/static/chunks/app/api/update/route-961c055baebb3872.js +1 -0
  98. package/.next/static/chunks/app/api/version/route-961c055baebb3872.js +1 -0
  99. package/.next/static/chunks/app/api/web-auth/route-961c055baebb3872.js +1 -0
  100. package/.next/static/chunks/app/api/workspaces/route-961c055baebb3872.js +1 -0
  101. package/.next/static/chunks/app/layout-50d06e2078d6ce76.js +1 -0
  102. package/.next/static/chunks/app/login/page-52ef4841cbd199a8.js +1 -0
  103. package/.next/static/chunks/app/page-00c8ebf40ec5eaca.js +1 -0
  104. package/.next/static/chunks/framework-c4e651fe89edfa91.js +1 -0
  105. package/.next/static/chunks/{main-a315d7c58b599962.js → main-6159b22a8cb0b7c5.js} +2 -2
  106. package/.next/static/chunks/main-app-e9b53f0e1c6591b2.js +1 -0
  107. package/.next/static/chunks/next/dist/client/components/builtin/app-error-961c055baebb3872.js +1 -0
  108. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-961c055baebb3872.js +1 -0
  109. package/.next/static/chunks/next/dist/client/components/builtin/global-error-a7e260f8cc2582d7.js +1 -0
  110. package/.next/static/chunks/next/dist/client/components/builtin/not-found-961c055baebb3872.js +1 -0
  111. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-961c055baebb3872.js +1 -0
  112. package/.next/static/chunks/webpack-05a9e85529a18b93.js +1 -0
  113. package/.next/types/app/api/prompts/route.ts +353 -0
  114. package/.next/types/routes.d.ts +2 -1
  115. package/.next/types/validator.ts +9 -0
  116. package/package.json +1 -1
  117. package/src/app/api/prompts/route.ts +51 -0
  118. package/src/components/AppShell.tsx +42 -19
  119. package/src/components/ChatWindow.tsx +20 -35
  120. package/src/components/PromptPanel.tsx +257 -0
  121. package/src/components/SettingsPanel.tsx +59 -56
  122. package/src/i18n.tsx +38 -4
  123. package/src/lib/agent-manager.ts +35 -8
  124. package/src/lib/clipboard.ts +27 -0
  125. package/src/lib/command-validation.ts +1 -0
  126. package/src/lib/prompt-sources.ts +201 -0
  127. package/src/lib/types.ts +1 -0
  128. package/.next/static/222KLUIvefiGf7M0Ov-Qz/_buildManifest.js +0 -1
  129. package/.next/static/chunks/127.c31e688e156605e3.js +0 -1
  130. package/.next/static/chunks/155.a3c40ae481da1358.js +0 -1
  131. package/.next/static/chunks/4bd1b696-92152b0f5947070d.js +0 -1
  132. package/.next/static/chunks/608.5b8aae42a9998ee7.js +0 -1
  133. package/.next/static/chunks/673.93445c8600bc1dd9.js +0 -1
  134. package/.next/static/chunks/686-9f15e4e370d26815.js +0 -1
  135. package/.next/static/chunks/716.5266fe10b5578591.js +0 -1
  136. package/.next/static/chunks/app/_global-error/page-1dac1b3ca8adb975.js +0 -1
  137. package/.next/static/chunks/app/_not-found/page-9de30f6f614fce02.js +0 -1
  138. package/.next/static/chunks/app/api/agent/[id]/events/route-1dac1b3ca8adb975.js +0 -1
  139. package/.next/static/chunks/app/api/agent/[id]/route-1dac1b3ca8adb975.js +0 -1
  140. package/.next/static/chunks/app/api/agent/[id]/tree/route-1dac1b3ca8adb975.js +0 -1
  141. package/.next/static/chunks/app/api/agent/new/route-1dac1b3ca8adb975.js +0 -1
  142. package/.next/static/chunks/app/api/config/route-1dac1b3ca8adb975.js +0 -1
  143. package/.next/static/chunks/app/api/files/route-1dac1b3ca8adb975.js +0 -1
  144. package/.next/static/chunks/app/api/git/route-1dac1b3ca8adb975.js +0 -1
  145. package/.next/static/chunks/app/api/growth/route-1dac1b3ca8adb975.js +0 -1
  146. package/.next/static/chunks/app/api/health/route-1dac1b3ca8adb975.js +0 -1
  147. package/.next/static/chunks/app/api/models/route-1dac1b3ca8adb975.js +0 -1
  148. package/.next/static/chunks/app/api/pi-settings/route-1dac1b3ca8adb975.js +0 -1
  149. package/.next/static/chunks/app/api/plugins/route-1dac1b3ca8adb975.js +0 -1
  150. package/.next/static/chunks/app/api/security/route-1dac1b3ca8adb975.js +0 -1
  151. package/.next/static/chunks/app/api/sessions/[id]/export/route-1dac1b3ca8adb975.js +0 -1
  152. package/.next/static/chunks/app/api/sessions/[id]/route-1dac1b3ca8adb975.js +0 -1
  153. package/.next/static/chunks/app/api/sessions/route-1dac1b3ca8adb975.js +0 -1
  154. package/.next/static/chunks/app/api/skills/route-1dac1b3ca8adb975.js +0 -1
  155. package/.next/static/chunks/app/api/update/route-1dac1b3ca8adb975.js +0 -1
  156. package/.next/static/chunks/app/api/version/route-1dac1b3ca8adb975.js +0 -1
  157. package/.next/static/chunks/app/api/web-auth/route-1dac1b3ca8adb975.js +0 -1
  158. package/.next/static/chunks/app/api/workspaces/route-1dac1b3ca8adb975.js +0 -1
  159. package/.next/static/chunks/app/layout-eb62bcd99abe79f9.js +0 -1
  160. package/.next/static/chunks/app/login/page-d2308b48d013d1a6.js +0 -1
  161. package/.next/static/chunks/app/page-708cd3ee4cfe8af5.js +0 -1
  162. package/.next/static/chunks/framework-0f597d6e68ffafed.js +0 -1
  163. package/.next/static/chunks/main-app-1a92e20ec190a32b.js +0 -1
  164. package/.next/static/chunks/next/dist/client/components/builtin/app-error-1dac1b3ca8adb975.js +0 -1
  165. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-1dac1b3ca8adb975.js +0 -1
  166. package/.next/static/chunks/next/dist/client/components/builtin/global-error-7bb5c4afcbc1772b.js +0 -1
  167. package/.next/static/chunks/next/dist/client/components/builtin/not-found-1dac1b3ca8adb975.js +0 -1
  168. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-1dac1b3ca8adb975.js +0 -1
  169. package/.next/static/chunks/webpack-9d84b382d4dec27a.js +0 -1
  170. /package/.next/static/{222KLUIvefiGf7M0Ov-Qz → 2kt2UiWjv_viXpNlfjvBT}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7358],{848:(e,s,n)=>{Promise.resolve().then(n.t.bind(n,7123,23)),Promise.resolve().then(n.t.bind(n,1304,23)),Promise.resolve().then(n.t.bind(n,8616,23)),Promise.resolve().then(n.t.bind(n,4777,23)),Promise.resolve().then(n.t.bind(n,7121,23)),Promise.resolve().then(n.t.bind(n,4581,23)),Promise.resolve().then(n.t.bind(n,484,23)),Promise.resolve().then(n.bind(n,6869))},5703:()=>{}},e=>{var s=s=>e(e.s=s);e.O(0,[8441,3794],()=>(s(3861),s(848))),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7822,7851,8091,8167,8651,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7822,7851,8091,8167,8651,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9337],{5904:(e,s,_)=>{Promise.resolve().then(_.t.bind(_,7123,23))}},e=>{e.O(0,[8441,3794,7358],()=>e(e.s=5904)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7822,7851,8091,8167,8651,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7822,7851,8091,8167,8651,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (()=>{"use strict";var e,t,r,o,n,a,i,l,c,u={},s={};function f(e){var t=s[e];if(void 0!==t)return t.exports;var r=s[e]={exports:{}},o=!0;try{u[e].call(r.exports,r,r.exports,f),o=!1}finally{o&&delete s[e]}return r.exports}f.m=u,e=[],f.O=(t,r,o,n)=>{if(r){n=n||0;for(var a=e.length;a>0&&e[a-1][2]>n;a--)e[a]=e[a-1];e[a]=[r,o,n];return}for(var i=1/0,a=0;a<e.length;a++){for(var[r,o,n]=e[a],l=!0,c=0;c<r.length;c++)(!1&n||i>=n)&&Object.keys(f.O).every(e=>f.O[e](r[c]))?r.splice(c--,1):(l=!1,n<i&&(i=n));if(l){e.splice(a--,1);var u=o();void 0!==u&&(t=u)}}return t},f.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return f.d(t,{a:t}),t},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,o){if(1&o&&(e=this(e)),8&o||"object"==typeof e&&e&&(4&o&&e.__esModule||16&o&&"function"==typeof e.then))return e;var n=Object.create(null);f.r(n);var a={};t=t||[null,r({}),r([]),r(r)];for(var i=2&o&&e;"object"==typeof i&&!~t.indexOf(i);i=r(i))Object.getOwnPropertyNames(i).forEach(t=>a[t]=()=>e[t]);return a.default=()=>e,f.d(n,a),n},f.d=(e,t)=>{for(var r in t)f.o(t,r)&&!f.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce((t,r)=>(f.f[r](e,t),t),[])),f.u=e=>"static/chunks/"+e+"."+({618:"ee5d5bf1c647e483",2155:"2f27fe7098987699",2608:"ec8ff1f5767c9056",2716:"a9e808190a4e2424",4127:"dff5c3b33c6bfd1b",4673:"d3d0a7f2599080fb"})[e]+".js",f.miniCssF=e=>"static/css/"+({7250:"08815507594e8b8d",8114:"2959bd6b626b7ffe"})[e]+".css",f.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),f.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o={},f.l=(e,t,r,n)=>{if(o[e])return void o[e].push(t);if(void 0!==r)for(var a,i,l=document.getElementsByTagName("script"),c=0;c<l.length;c++){var u=l[c];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")=="_N_E:"+r){a=u;break}}a||(i=!0,(a=document.createElement("script")).charset="utf-8",a.timeout=120,f.nc&&a.setAttribute("nonce",f.nc),a.setAttribute("data-webpack","_N_E:"+r),a.src=f.tu(e)),o[e]=[t];var s=(t,r)=>{a.onerror=a.onload=null,clearTimeout(d);var n=o[e];if(delete o[e],a.parentNode&&a.parentNode.removeChild(a),n&&n.forEach(e=>e(r)),t)return t(r)},d=setTimeout(s.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=s.bind(null,a.onerror),a.onload=s.bind(null,a.onload),i&&document.head.appendChild(a)},f.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.tt=()=>(void 0===n&&(n={createScriptURL:e=>e},"u">typeof trustedTypes&&trustedTypes.createPolicy&&(n=trustedTypes.createPolicy("nextjs#bundler",n))),n),f.tu=e=>f.tt().createScriptURL(e),f.p="/_next/",a={8068:0},f.f.miniCss=(e,t)=>{if(a[e])t.push(a[e]);else 0!==a[e]&&({7250:1,8114:1})[e]&&t.push(a[e]=new Promise((t,r)=>{var o=f.miniCssF(e),n=f.p+o;if(((e,t)=>{for(var r=document.getElementsByTagName("link"),o=0;o<r.length;o++){var n=r[o],a=n.getAttribute("data-href")||n.getAttribute("href");if("stylesheet"===n.rel&&(a===e||a===t))return n}for(var i=document.getElementsByTagName("style"),o=0;o<i.length;o++){var n=i[o],a=n.getAttribute("data-href");if(a===e||a===t)return n}})(o,n))return t();((e,t,r,o)=>{var n=document.createElement("link");n.rel="stylesheet",n.type="text/css",n.onerror=n.onload=a=>{if(n.onerror=n.onload=null,"load"===a.type)r();else{var i=a&&("load"===a.type?"missing":a.type),l=a&&a.target&&a.target.href||t,c=Error("Loading CSS chunk "+e+" failed.\n("+l+")");c.code="CSS_CHUNK_LOAD_FAILED",c.type=i,c.request=l,n.parentNode.removeChild(n),o(c)}},n.href=t;if("function"==typeof _N_E_STYLE_LOAD){var a=n.href,i=n.onload,l=n.onerror;_N_E_STYLE_LOAD(0===a.indexOf(window.location.origin)?new URL(a).pathname:a).then(function(){i&&i.call(n,{type:"load"})},function(){l&&l.call(n,{})})}else document.head.appendChild(n)})(e,n,t,r)}).then(()=>{a[e]=0},t=>{throw delete a[e],t}))},i={8068:0,5483:0,7086:0,3334:0},f.f.j=(e,t)=>{var r=f.o(i,e)?i[e]:void 0;if(0!==r)if(r)t.push(r[2]);else if(/^(3334|5483|7086|7250|8068|8114)$/.test(e))i[e]=0;else{var o=new Promise((t,o)=>r=i[e]=[t,o]);t.push(r[2]=o);var n=f.p+f.u(e),a=Error();f.l(n,t=>{if(f.o(i,e)&&(0!==(r=i[e])&&(i[e]=void 0),r)){var o=t&&("load"===t.type?"missing":t.type),n=t&&t.target&&t.target.src;a.message="Loading chunk "+e+" failed.\n("+o+": "+n+")",a.name="ChunkLoadError",a.type=o,a.request=n,r[1](a)}},"chunk-"+e,e)}},f.O.j=e=>0===i[e],l=(e,t)=>{var r,o,[n,a,l]=t,c=0;if(n.some(e=>0!==i[e])){for(r in a)f.o(a,r)&&(f.m[r]=a[r]);if(l)var u=l(f)}for(e&&e(t);c<n.length;c++)o=n[c],f.o(i,o)&&i[o]&&i[o][0](),i[o]=0;return f.O(u)},(c=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(l.bind(null,0)),c.push=l.bind(null,c.push.bind(c))})();
@@ -0,0 +1,353 @@
1
+ // File: /home/runner/work/PiWeb/PiWeb/src/app/api/prompts/route.ts
2
+ import * as entry from '../../../../../src/app/api/prompts/route.js'
3
+ import type { NextRequest } from 'next/server.js'
4
+
5
+ import type { InstantConfigForTypeCheckInternal, Prefetch } from 'next/dist/build/segment-config/app/app-segment-config.js'
6
+
7
+ type TEntry = typeof import('../../../../../src/app/api/prompts/route.js')
8
+
9
+ type SegmentParams<T extends Object = any> = T extends Record<string, any>
10
+ ? { [K in keyof T]: T[K] extends string ? string | string[] | undefined : never }
11
+ : T
12
+
13
+ // Check that the entry is a valid entry
14
+ checkFields<Diff<{
15
+ GET?: Function
16
+ HEAD?: Function
17
+ OPTIONS?: Function
18
+ POST?: Function
19
+ PUT?: Function
20
+ DELETE?: Function
21
+ PATCH?: Function
22
+ config?: {}
23
+ generateStaticParams?: Function
24
+ instant?: InstantConfigForTypeCheckInternal
25
+ prefetch?: Prefetch
26
+ unstable_dynamicStaleTime?: number
27
+ revalidate?: RevalidateRange<TEntry> | false
28
+ dynamic?: 'auto' | 'force-dynamic' | 'error' | 'force-static'
29
+ dynamicParams?: boolean
30
+ fetchCache?: 'auto' | 'force-no-store' | 'only-no-store' | 'default-no-store' | 'default-cache' | 'only-cache' | 'force-cache'
31
+ /** @deprecated The `preferredRegion` config is deprecated. Remove this export. */
32
+ preferredRegion?: 'auto' | 'global' | 'home' | string | string[]
33
+ runtime?: 'nodejs' | 'experimental-edge' | 'edge'
34
+ maxDuration?: number
35
+
36
+ }, TEntry, ''>>()
37
+
38
+ type RouteContext = { params: Promise<SegmentParams> }
39
+ // Check the prop type of the entry function
40
+ if ('GET' in entry) {
41
+ checkFields<
42
+ Diff<
43
+ ParamCheck<Request | NextRequest>,
44
+ {
45
+ __tag__: 'GET'
46
+ __param_position__: 'first'
47
+ __param_type__: FirstArg<MaybeField<TEntry, 'GET'>>
48
+ },
49
+ 'GET'
50
+ >
51
+ >()
52
+ checkFields<
53
+ Diff<
54
+ ParamCheck<RouteContext>,
55
+ {
56
+ __tag__: 'GET'
57
+ __param_position__: 'second'
58
+ __param_type__: SecondArg<MaybeField<TEntry, 'GET'>>
59
+ },
60
+ 'GET'
61
+ >
62
+ >()
63
+
64
+ checkFields<
65
+ Diff<
66
+ {
67
+ __tag__: 'GET',
68
+ __return_type__: Response | void | never | Promise<Response | void | never>
69
+ },
70
+ {
71
+ __tag__: 'GET',
72
+ __return_type__: ReturnType<MaybeField<TEntry, 'GET'>>
73
+ },
74
+ 'GET'
75
+ >
76
+ >()
77
+ }
78
+ // Check the prop type of the entry function
79
+ if ('HEAD' in entry) {
80
+ checkFields<
81
+ Diff<
82
+ ParamCheck<Request | NextRequest>,
83
+ {
84
+ __tag__: 'HEAD'
85
+ __param_position__: 'first'
86
+ __param_type__: FirstArg<MaybeField<TEntry, 'HEAD'>>
87
+ },
88
+ 'HEAD'
89
+ >
90
+ >()
91
+ checkFields<
92
+ Diff<
93
+ ParamCheck<RouteContext>,
94
+ {
95
+ __tag__: 'HEAD'
96
+ __param_position__: 'second'
97
+ __param_type__: SecondArg<MaybeField<TEntry, 'HEAD'>>
98
+ },
99
+ 'HEAD'
100
+ >
101
+ >()
102
+
103
+ checkFields<
104
+ Diff<
105
+ {
106
+ __tag__: 'HEAD',
107
+ __return_type__: Response | void | never | Promise<Response | void | never>
108
+ },
109
+ {
110
+ __tag__: 'HEAD',
111
+ __return_type__: ReturnType<MaybeField<TEntry, 'HEAD'>>
112
+ },
113
+ 'HEAD'
114
+ >
115
+ >()
116
+ }
117
+ // Check the prop type of the entry function
118
+ if ('OPTIONS' in entry) {
119
+ checkFields<
120
+ Diff<
121
+ ParamCheck<Request | NextRequest>,
122
+ {
123
+ __tag__: 'OPTIONS'
124
+ __param_position__: 'first'
125
+ __param_type__: FirstArg<MaybeField<TEntry, 'OPTIONS'>>
126
+ },
127
+ 'OPTIONS'
128
+ >
129
+ >()
130
+ checkFields<
131
+ Diff<
132
+ ParamCheck<RouteContext>,
133
+ {
134
+ __tag__: 'OPTIONS'
135
+ __param_position__: 'second'
136
+ __param_type__: SecondArg<MaybeField<TEntry, 'OPTIONS'>>
137
+ },
138
+ 'OPTIONS'
139
+ >
140
+ >()
141
+
142
+ checkFields<
143
+ Diff<
144
+ {
145
+ __tag__: 'OPTIONS',
146
+ __return_type__: Response | void | never | Promise<Response | void | never>
147
+ },
148
+ {
149
+ __tag__: 'OPTIONS',
150
+ __return_type__: ReturnType<MaybeField<TEntry, 'OPTIONS'>>
151
+ },
152
+ 'OPTIONS'
153
+ >
154
+ >()
155
+ }
156
+ // Check the prop type of the entry function
157
+ if ('POST' in entry) {
158
+ checkFields<
159
+ Diff<
160
+ ParamCheck<Request | NextRequest>,
161
+ {
162
+ __tag__: 'POST'
163
+ __param_position__: 'first'
164
+ __param_type__: FirstArg<MaybeField<TEntry, 'POST'>>
165
+ },
166
+ 'POST'
167
+ >
168
+ >()
169
+ checkFields<
170
+ Diff<
171
+ ParamCheck<RouteContext>,
172
+ {
173
+ __tag__: 'POST'
174
+ __param_position__: 'second'
175
+ __param_type__: SecondArg<MaybeField<TEntry, 'POST'>>
176
+ },
177
+ 'POST'
178
+ >
179
+ >()
180
+
181
+ checkFields<
182
+ Diff<
183
+ {
184
+ __tag__: 'POST',
185
+ __return_type__: Response | void | never | Promise<Response | void | never>
186
+ },
187
+ {
188
+ __tag__: 'POST',
189
+ __return_type__: ReturnType<MaybeField<TEntry, 'POST'>>
190
+ },
191
+ 'POST'
192
+ >
193
+ >()
194
+ }
195
+ // Check the prop type of the entry function
196
+ if ('PUT' in entry) {
197
+ checkFields<
198
+ Diff<
199
+ ParamCheck<Request | NextRequest>,
200
+ {
201
+ __tag__: 'PUT'
202
+ __param_position__: 'first'
203
+ __param_type__: FirstArg<MaybeField<TEntry, 'PUT'>>
204
+ },
205
+ 'PUT'
206
+ >
207
+ >()
208
+ checkFields<
209
+ Diff<
210
+ ParamCheck<RouteContext>,
211
+ {
212
+ __tag__: 'PUT'
213
+ __param_position__: 'second'
214
+ __param_type__: SecondArg<MaybeField<TEntry, 'PUT'>>
215
+ },
216
+ 'PUT'
217
+ >
218
+ >()
219
+
220
+ checkFields<
221
+ Diff<
222
+ {
223
+ __tag__: 'PUT',
224
+ __return_type__: Response | void | never | Promise<Response | void | never>
225
+ },
226
+ {
227
+ __tag__: 'PUT',
228
+ __return_type__: ReturnType<MaybeField<TEntry, 'PUT'>>
229
+ },
230
+ 'PUT'
231
+ >
232
+ >()
233
+ }
234
+ // Check the prop type of the entry function
235
+ if ('DELETE' in entry) {
236
+ checkFields<
237
+ Diff<
238
+ ParamCheck<Request | NextRequest>,
239
+ {
240
+ __tag__: 'DELETE'
241
+ __param_position__: 'first'
242
+ __param_type__: FirstArg<MaybeField<TEntry, 'DELETE'>>
243
+ },
244
+ 'DELETE'
245
+ >
246
+ >()
247
+ checkFields<
248
+ Diff<
249
+ ParamCheck<RouteContext>,
250
+ {
251
+ __tag__: 'DELETE'
252
+ __param_position__: 'second'
253
+ __param_type__: SecondArg<MaybeField<TEntry, 'DELETE'>>
254
+ },
255
+ 'DELETE'
256
+ >
257
+ >()
258
+
259
+ checkFields<
260
+ Diff<
261
+ {
262
+ __tag__: 'DELETE',
263
+ __return_type__: Response | void | never | Promise<Response | void | never>
264
+ },
265
+ {
266
+ __tag__: 'DELETE',
267
+ __return_type__: ReturnType<MaybeField<TEntry, 'DELETE'>>
268
+ },
269
+ 'DELETE'
270
+ >
271
+ >()
272
+ }
273
+ // Check the prop type of the entry function
274
+ if ('PATCH' in entry) {
275
+ checkFields<
276
+ Diff<
277
+ ParamCheck<Request | NextRequest>,
278
+ {
279
+ __tag__: 'PATCH'
280
+ __param_position__: 'first'
281
+ __param_type__: FirstArg<MaybeField<TEntry, 'PATCH'>>
282
+ },
283
+ 'PATCH'
284
+ >
285
+ >()
286
+ checkFields<
287
+ Diff<
288
+ ParamCheck<RouteContext>,
289
+ {
290
+ __tag__: 'PATCH'
291
+ __param_position__: 'second'
292
+ __param_type__: SecondArg<MaybeField<TEntry, 'PATCH'>>
293
+ },
294
+ 'PATCH'
295
+ >
296
+ >()
297
+
298
+ checkFields<
299
+ Diff<
300
+ {
301
+ __tag__: 'PATCH',
302
+ __return_type__: Response | void | never | Promise<Response | void | never>
303
+ },
304
+ {
305
+ __tag__: 'PATCH',
306
+ __return_type__: ReturnType<MaybeField<TEntry, 'PATCH'>>
307
+ },
308
+ 'PATCH'
309
+ >
310
+ >()
311
+ }
312
+
313
+ // Check the arguments and return type of the generateStaticParams function
314
+ if ('generateStaticParams' in entry) {
315
+ checkFields<Diff<{ params: SegmentParams }, FirstArg<MaybeField<TEntry, 'generateStaticParams'>>, 'generateStaticParams'>>()
316
+ checkFields<Diff<{ __tag__: 'generateStaticParams', __return_type__: any[] | Promise<any[]> }, { __tag__: 'generateStaticParams', __return_type__: ReturnType<MaybeField<TEntry, 'generateStaticParams'>> }>>()
317
+ }
318
+
319
+ export interface PageProps {
320
+ params?: Promise<SegmentParams>
321
+ searchParams?: Promise<any>
322
+ }
323
+ export interface LayoutProps {
324
+ children?: React.ReactNode
325
+
326
+ params?: Promise<SegmentParams>
327
+ }
328
+
329
+ // =============
330
+ // Utility types
331
+ type RevalidateRange<T> = T extends { revalidate: any } ? NonNegative<T['revalidate']> : never
332
+
333
+ // If T is unknown or any, it will be an empty {} type. Otherwise, it will be the same as Omit<T, keyof Base>.
334
+ type OmitWithTag<T, K extends keyof any, _M> = Omit<T, K>
335
+ type Diff<Base, T extends Base, Message extends string = ''> = 0 extends (1 & T) ? {} : OmitWithTag<T, keyof Base, Message>
336
+
337
+ type FirstArg<T extends Function> = T extends (...args: [infer T, any]) => any ? unknown extends T ? any : T : never
338
+ type SecondArg<T extends Function> = T extends (...args: [any, infer T]) => any ? unknown extends T ? any : T : never
339
+ type MaybeField<T, K extends string> = T extends { [k in K]: infer G } ? G extends Function ? G : never : never
340
+
341
+ type ParamCheck<T> = {
342
+ __tag__: string
343
+ __param_position__: string
344
+ __param_type__: T
345
+ }
346
+
347
+ function checkFields<_ extends { [k in keyof any]: never }>() {}
348
+
349
+ // https://github.com/sindresorhus/type-fest
350
+ type Numeric = number | bigint
351
+ type Zero = 0 | 0n
352
+ type Negative<T extends Numeric> = T extends Zero ? never : `${T}` extends `-${string}` ? T : never
353
+ type NonNegative<T extends Numeric> = T extends Zero ? T : Negative<T> extends never ? T : '__invalid_negative_number__'
@@ -2,7 +2,7 @@
2
2
  // Do not edit this file manually
3
3
 
4
4
  type AppRoutes = "/" | "/login"
5
- type AppRouteHandlerRoutes = "/api/agent/[id]" | "/api/agent/[id]/events" | "/api/agent/[id]/tree" | "/api/agent/new" | "/api/config" | "/api/files" | "/api/git" | "/api/growth" | "/api/health" | "/api/models" | "/api/pi-settings" | "/api/plugins" | "/api/security" | "/api/sessions" | "/api/sessions/[id]" | "/api/sessions/[id]/export" | "/api/skills" | "/api/update" | "/api/version" | "/api/web-auth" | "/api/workspaces"
5
+ type AppRouteHandlerRoutes = "/api/agent/[id]" | "/api/agent/[id]/events" | "/api/agent/[id]/tree" | "/api/agent/new" | "/api/config" | "/api/files" | "/api/git" | "/api/growth" | "/api/health" | "/api/models" | "/api/pi-settings" | "/api/plugins" | "/api/prompts" | "/api/security" | "/api/sessions" | "/api/sessions/[id]" | "/api/sessions/[id]/export" | "/api/skills" | "/api/update" | "/api/version" | "/api/web-auth" | "/api/workspaces"
6
6
  type PageRoutes = never
7
7
  type LayoutRoutes = "/"
8
8
  type RedirectRoutes = never
@@ -24,6 +24,7 @@ interface ParamMap {
24
24
  "/api/models": {}
25
25
  "/api/pi-settings": {}
26
26
  "/api/plugins": {}
27
+ "/api/prompts": {}
27
28
  "/api/security": {}
28
29
  "/api/sessions": {}
29
30
  "/api/sessions/[id]": { "id": string; }
@@ -173,6 +173,15 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
173
173
  type __Unused = __Check
174
174
  }
175
175
 
176
+ // Validate ../../src/app/api/prompts/route.ts
177
+ {
178
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/prompts">> = Specific
179
+ const handler = {} as typeof import("../../src/app/api/prompts/route.js")
180
+ type __Check = __IsExpected<typeof handler>
181
+ // @ts-ignore
182
+ type __Unused = __Check
183
+ }
184
+
176
185
  // Validate ../../src/app/api/security/route.ts
177
186
  {
178
187
  type __IsExpected<Specific extends RouteHandlerConfig<"/api/security">> = Specific
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rexvane/piweb",
3
- "version": "0.3.11",
3
+ "version": "0.3.12",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "Modern web UI for the pi coding agent, driven by the official pi SDK without modifying pi",
@@ -0,0 +1,51 @@
1
+ import { NextResponse } from "next/server";
2
+ import { listPromptSources, readPromptSource } from "@/lib/prompt-sources";
3
+ import { getManaged } from "@/lib/agent-manager";
4
+ import { BoundaryError, resolveSessionPath, resolveWorkspacePath } from "@/lib/path-security";
5
+
6
+ export const dynamic = "force-dynamic";
7
+
8
+ /**
9
+ * 提示词来源面板的数据口:
10
+ * - GET ?cwd=<工作区>&session=<会话 id>:列出所有提示词来源;会话已热时附带"组装后的系统提示词"与工具定义
11
+ * - POST { action: "read", filePath }:按需读取单个来源的内容
12
+ * 只读,不改动任何提示词内容。
13
+ */
14
+ async function hotSession(cwd: string, sessionId: string | null) {
15
+ if (!sessionId) return null;
16
+ try {
17
+ // sessionId 是客户端已有的 base64url 编码 id(与 /api/agent/<id> 同一套),不要再编码一次
18
+ const sessionPath = await resolveSessionPath(sessionId, { allowPending: true });
19
+ const managed = getManaged(sessionPath);
20
+ return managed.session ?? null;
21
+ } catch {
22
+ // 会话路径不合法或已消失:退化为"只列文件来源",不因此让整个面板失败
23
+ return null;
24
+ }
25
+ }
26
+
27
+ export async function GET(req: Request) {
28
+ try {
29
+ const url = new URL(req.url);
30
+ const cwd = await resolveWorkspacePath(url.searchParams.get("cwd") || process.cwd());
31
+ const sessionId = url.searchParams.get("session");
32
+ const data = await listPromptSources({ cwd, session: await hotSession(cwd, sessionId) });
33
+ return NextResponse.json({ success: true, data });
34
+ } catch (err) {
35
+ const message = err instanceof Error ? err.message : String(err);
36
+ return NextResponse.json({ success: false, error: message }, { status: err instanceof BoundaryError ? 400 : 500 });
37
+ }
38
+ }
39
+
40
+ export async function POST(req: Request) {
41
+ try {
42
+ const body = (await req.json()) as { action?: string; filePath?: string; cwd?: string };
43
+ if (body.action !== "read") return NextResponse.json({ success: false, error: "unknown action" }, { status: 400 });
44
+ if (!body.filePath) return NextResponse.json({ success: false, error: "missing filePath" }, { status: 400 });
45
+ const cwd = await resolveWorkspacePath(body.cwd || process.cwd());
46
+ return NextResponse.json({ success: true, data: { content: await readPromptSource(body.filePath, cwd) } });
47
+ } catch (err) {
48
+ const message = err instanceof Error ? err.message : "request failed";
49
+ return NextResponse.json({ success: false, error: message }, { status: err instanceof BoundaryError ? 400 : 500 });
50
+ }
51
+ }
@@ -11,6 +11,7 @@ import { ChatWindow, SessionStatsBar } from "@/components/ChatWindow";
11
11
  import { ExtensionDialogHost, ExtensionNotices } from "@/components/ExtensionUI";
12
12
  import dynamic from "next/dynamic";
13
13
  import { SessionSidebar } from "@/components/SessionSidebar";
14
+ import { PromptPanel } from "@/components/PromptPanel";
14
15
 
15
16
  // 首屏不需要的重组件按需加载(设置面板含供应商配置与代码高亮,轨迹/文件只在打开时才用)
16
17
  const SettingsPanel = dynamic(() => import("@/components/SettingsPanel").then((m) => m.SettingsPanel), { ssr: false });
@@ -23,6 +24,7 @@ const ProjectPanel = dynamic(() => import("@/components/ProjectPanel").then((m)
23
24
  const FileViewer = dynamic(() => import("@/components/FileViewer").then((m) => m.FileViewer), { ssr: false });
24
25
  const GitPanel = dynamic(() => import("@/components/GitPanel").then((m) => m.GitPanel), { ssr: false });
25
26
  import {
27
+ IconAgentPresetOutline16,
26
28
  IconCheckOutline14,
27
29
  IconChevronDown14,
28
30
  IconFolderClose16,
@@ -137,6 +139,8 @@ export function AppShell() {
137
139
  const [settingsOpen, setSettingsOpen] = useState(false);
138
140
  const [selected, setSelected] = useState<TrajEntry | null>(null);
139
141
  const [gitDetailsOpen, setGitDetailsOpen] = useState(false);
142
+ /** 提示词来源面板(右侧详情列) */
143
+ const [promptsOpen, setPromptsOpen] = useState(false);
140
144
  const [heroCwd, setHeroCwd] = useState("");
141
145
  const [heroModel, setHeroModel] = useState<{ provider: string; id: string } | null>(null);
142
146
  const [heroThinking, setHeroThinking] = useState("");
@@ -200,6 +204,7 @@ export function AppShell() {
200
204
  useEffect(() => {
201
205
  setSelected(null);
202
206
  setGitDetailsOpen(false);
207
+ setPromptsOpen(false);
203
208
  }, [currentPath]);
204
209
 
205
210
  // 已知工作区列表(给 Hero 建议);启动不预选任何工作区,
@@ -345,28 +350,22 @@ export function AppShell() {
345
350
  );
346
351
 
347
352
  /**
348
- * 原地编辑用户消息后重新发送:服务端在同一会话文件内回到该消息(navigateTree),
349
- * 再用新文本重新提问——被编辑消息之后的分支作废,模型从这里重新回答。
350
- * 旧的插话(steering)撤回/编辑/发送不变。
353
+ * 原地编辑用户消息后重新发送:服务端先停在跑的回合(用户改口即表示不要这一轮),
354
+ * 再在同一会话文件内回到该消息之前(navigateTree),用新文本重新提问——
355
+ * 被编辑消息之后的分支作废,模型从这里重新回答。旧的插话(steering)撤回/编辑/发送不变。
351
356
  */
352
357
  const doEditMessage = useCallback(
353
358
  async (entryId: string, text: string) => {
354
359
  if (!currentId) return;
355
- if (isStreaming) {
356
- setError(t.editWhileRunning);
360
+ const done = await sendCommand({ cmd: "editAndResend", entryId, text });
361
+ if (!done?.success) {
362
+ setError(done?.error ?? t.editMessageFailed);
357
363
  return;
358
364
  }
359
- const moved = await sendCommand({ cmd: "navigate", entryId });
360
- if (!moved?.success || moved.data?.cancelled) {
361
- setError(moved?.error ?? t.editMessageFailed);
362
- return;
363
- }
364
- // 被编辑消息之后的尾部要立刻从视图里消失,再发新提问
365
+ // 被编辑消息之后的尾部要从视图里消失(服务端已切断该分支)
365
366
  resync();
366
- const sent = await sendCommand({ cmd: "prompt", text });
367
- if (!sent?.success) setError(sent?.error ?? t.editMessageFailed);
368
367
  },
369
- [currentId, isStreaming, resync, sendCommand, setError, t.editMessageFailed, t.editWhileRunning],
368
+ [currentId, resync, sendCommand, setError, t.editMessageFailed],
370
369
  );
371
370
 
372
371
  const doArchiveSession = useCallback(
@@ -605,7 +604,7 @@ export function AppShell() {
605
604
 
606
605
  // 三栏网格
607
606
  const gridCols = isNarrow ? "minmax(0,1fr)" : `${sidebarCollapsed ? SIDEBAR_COLLAPSED : sidebarWidth}px ${projectOpen ? `${projectWidth}px` : "0px"} minmax(0,1fr) ${
608
- selected || gitDetailsOpen ? `${detailsWidth}px` : "0px"
607
+ selected || gitDetailsOpen || promptsOpen ? `${detailsWidth}px` : "0px"
609
608
  }`;
610
609
  const projectColumn = projectOpen && (
611
610
  <div
@@ -777,6 +776,22 @@ export function AppShell() {
777
776
  >
778
777
  <IconFolderOpenOutline16 size={15} />
779
778
  </button>
779
+ {/* 提示词来源:系统提示词 / 记忆 / 技能 / 模板 / 工具提示词集中列出,点开即看 */}
780
+ <button
781
+ type="button"
782
+ className="icon-btn"
783
+ style={{ width: 30, height: 30, background: promptsOpen ? "var(--dsw-active)" : undefined }}
784
+ title={t.promptPanel}
785
+ aria-label={t.promptPanel}
786
+ data-testid="prompt-panel-toggle"
787
+ onClick={() => {
788
+ setPromptsOpen((open) => !open);
789
+ setSelected(null);
790
+ setGitDetailsOpen(false);
791
+ }}
792
+ >
793
+ <IconAgentPresetOutline16 size={15} />
794
+ </button>
780
795
  </div>
781
796
  {projectTrust?.required && !projectTrust.trusted && (
782
797
  <div className="mt-2 flex flex-wrap items-center gap-2 rounded-xl px-3 py-2" style={{ fontSize: 12.5, background: "var(--dsw-hover)", border: "0.5px solid var(--dsw-border-l2)" }} role="status">
@@ -887,8 +902,8 @@ export function AppShell() {
887
902
  )}
888
903
  </div>
889
904
 
890
- {/* 轨迹或 Git 详情栏 */}
891
- {(selected || gitDetailsOpen) && (
905
+ {/* 提示词来源 / 轨迹 / Git 详情栏 */}
906
+ {(selected || gitDetailsOpen || promptsOpen) && (
892
907
  <div
893
908
  className="flex min-h-0 flex-col overflow-hidden"
894
909
  style={isNarrow ? {
@@ -901,7 +916,15 @@ export function AppShell() {
901
916
  } : { background: "var(--dsw-sidebar-fill)", borderLeft: "0.5px solid var(--dsw-border-l2)" }}
902
917
  >
903
918
  <div className="min-h-0 flex-1">
904
- {selected ? (
919
+ {promptsOpen ? (
920
+ <PromptPanel
921
+ cwd={panelCwd}
922
+ sessionId={currentId}
923
+ refreshKey={currentId}
924
+ onOpenContent={(path, content) => viewer.openStatic(path, content)}
925
+ onClose={() => setPromptsOpen(false)}
926
+ />
927
+ ) : selected ? (
905
928
  <TrajInspector entry={selected} onClose={() => setSelected(null)} />
906
929
  ) : (
907
930
  <GitPanel cwd={panelCwd} refreshKey={panelRefreshKey} onClose={() => setGitDetailsOpen(false)} onAskCommit={() => insertIntoComposer(t.gitAskCommitPrompt)} onOpenFile={openInEditor} />
@@ -918,7 +941,7 @@ export function AppShell() {
918
941
  onPointerDown={onDrag("sidebar")}
919
942
  />
920
943
  )}
921
- {!isNarrow && (selected || gitDetailsOpen) && (
944
+ {!isNarrow && (selected || gitDetailsOpen || promptsOpen) && (
922
945
  <div
923
946
  className="fixed top-0 h-full w-2 cursor-col-resize"
924
947
  style={{ left: `calc(100vw - ${detailsWidth}px - 4px)`, zIndex: 40 }}