pi-web-ui 0.92.0 → 0.94.0

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 (57) hide show
  1. package/CHANGELOG.md +74 -2
  2. package/README.md +69 -14
  3. package/README.zh-CN.md +36 -10
  4. package/bin/pi-web-ui.mjs +18 -6
  5. package/dist/server/agent-service.js +577 -127
  6. package/dist/server/auth-cookie.js +26 -0
  7. package/dist/server/claim-files-tool.js +6 -7
  8. package/dist/server/client-state.js +125 -8
  9. package/dist/server/conversation-read-tool.js +2 -1
  10. package/dist/server/delegate-task.js +10 -3
  11. package/dist/server/dsh/dsh-agent-service.js +43 -1
  12. package/dist/server/files-service.js +79 -27
  13. package/dist/server/http-proxy.js +72 -0
  14. package/dist/server/index.js +84 -17
  15. package/dist/server/patch-node-pty.js +11 -0
  16. package/dist/server/plugins.js +1 -0
  17. package/dist/server/protocol-version.js +1 -1
  18. package/dist/server/read-tool.js +37 -3
  19. package/dist/server/resolve-global-sdk.js +72 -0
  20. package/dist/server/sdk-origin.js +64 -0
  21. package/dist/server/serialize.js +59 -21
  22. package/dist/server/settings-service.js +12 -1
  23. package/dist/server/skill-tool.js +2 -1
  24. package/dist/server/soft-cap.js +38 -4
  25. package/dist/server/subagents.js +30 -13
  26. package/dist/server/terminals.js +38 -18
  27. package/dist/server/themes.js +15 -0
  28. package/dist/server/tool-info.js +89 -0
  29. package/dist/server/tool-manager.js +107 -14
  30. package/package.json +2 -2
  31. package/plugins/catalog.json +10 -0
  32. package/themes/ayu-light.css +136 -0
  33. package/themes/catppuccin-latte.css +4 -0
  34. package/themes/catppuccin.css +4 -0
  35. package/themes/codex.css +136 -0
  36. package/themes/cyberpunk.css +4 -0
  37. package/themes/dazzle.css +4 -0
  38. package/themes/everforest-light.css +136 -0
  39. package/themes/geist.css +136 -0
  40. package/themes/gruvbox-light.css +136 -0
  41. package/themes/kanagawa-lotus.css +136 -0
  42. package/themes/md-preview.css +4 -0
  43. package/themes/mist.css +4 -0
  44. package/themes/nord.css +4 -0
  45. package/themes/one-dark.css +4 -0
  46. package/themes/paper.css +4 -0
  47. package/themes/rose-pine-dawn.css +136 -0
  48. package/themes/sakura.css +4 -0
  49. package/themes/solarized-light.css +4 -0
  50. package/themes/tokyo-night.css +4 -0
  51. package/themes/white.css +4 -0
  52. package/web/dist/assets/{TerminalPanel-RACpk6AX.js → TerminalPanel-B-CMQuzm.js} +1 -1
  53. package/web/dist/assets/index-18jK6al2.js +364 -0
  54. package/web/dist/assets/index-B3S9MxnN.css +1 -0
  55. package/web/dist/index.html +2 -2
  56. package/web/dist/assets/index-BgrnP9Jz.js +0 -364
  57. package/web/dist/assets/index-Cy8dSTZt.css +0 -1
package/bin/pi-web-ui.mjs CHANGED
@@ -55,6 +55,13 @@ import { fileURLToPath } from "node:url";
55
55
  const BIN_DIR = dirname(fileURLToPath(import.meta.url));
56
56
  /** <pkg>/dist/server/index.js — the actual server entry. */
57
57
  const SERVER_ENTRY = join(BIN_DIR, "..", "dist", "server", "index.js");
58
+ /** 可选的「优先用全局/祖先那份 pi SDK」解析钩子(issue #260,`PI_WEB_SDK=global` 才生效)。
59
+ * 必须早于任何 SDK 静态 import 加载 —— 所以每条启动路径都把它当 `--import` 传进去;
60
+ * 默认不启用时它自己什么都不做(见 server/resolve-global-sdk.ts)。 */
61
+ const SDK_HOOK = join(BIN_DIR, "..", "dist", "server", "resolve-global-sdk.js");
62
+ /** dist 可能是旧构建(没有这个钩子文件)—— 只有文件在才注入:`--import <missing>` 会让
63
+ * CLI/服务直接起不来,那比少个开关严重得多。 */
64
+ const HAS_SDK_HOOK = existsSync(SDK_HOOK);
58
65
  const NODE = process.execPath;
59
66
  let pkg = { version: "0.0.0" };
60
67
  try {
@@ -390,6 +397,7 @@ async function startForeground(opts) {
390
397
  if (opts.host) process.env.PI_WEB_HOST = opts.host;
391
398
  if (opts.agentDir) process.env.PI_CODING_AGENT_DIR = resolve(opts.agentDir);
392
399
  const url = `http://localhost:${effectivePort(opts)}`;
400
+ if (HAS_SDK_HOOK) await import(pathToFileURL(SDK_HOOK).href);
393
401
  await import(pathToFileURL(SERVER_ENTRY).href);
394
402
  if (!opts.noBrowser) openBrowserWhenUp(url);
395
403
  }
@@ -623,7 +631,7 @@ function buildWinShortcutPs1(env, cwd, taskName, url, logPath, pidPath) {
623
631
  " try { if ((Invoke-WebRequest -Uri $h -UseBasicParsing -TimeoutSec 2).StatusCode -eq 200) { Start-Process $u | Out-Null; break } } catch {}",
624
632
  " }",
625
633
  "} -ArgumentList $url",
626
- `& ${psQuote(node)} ${psQuote(SERVER_ENTRY)} *>> $log`,
634
+ `& ${psQuote(node)} ${HAS_SDK_HOOK ? `--import ${psQuote(SDK_HOOK)} ` : ""}${psQuote(SERVER_ENTRY)} *>> $log`,
627
635
  "Remove-Item $pidFile -ErrorAction SilentlyContinue",
628
636
  "",
629
637
  ].join("\r\n");
@@ -726,6 +734,7 @@ URL=${shQuote(url)}
726
734
  LOG=/tmp/pi-web-ui-shortcut.log
727
735
  NODE=${shQuote(node)}
728
736
  ENTRY=${shQuote(SERVER_ENTRY)}
737
+ SDK_HOOK_ARG=${HAS_SDK_HOOK ? `${shQuote("--import")} ${shQuote(SDK_HOOK)} ` : ""}
729
738
  ${exports}
730
739
 
731
740
  if launchctl print "gui/$(id -u)/$LABEL" >/dev/null 2>&1; then
@@ -734,7 +743,7 @@ elif [ -f "$PLIST" ]; then
734
743
  launchctl bootstrap "gui/$(id -u)" "$PLIST"
735
744
  else
736
745
  # 未安装服务:在本终端前台运行服务器(关闭窗口即停止)
737
- "$NODE" "$ENTRY" >>"$LOG" 2>&1 &
746
+ "$NODE" $SDK_HOOK_ARG"$ENTRY" >>"$LOG" 2>&1 &
738
747
  SERVER_PID=$!
739
748
  trap 'kill "$SERVER_PID" 2>/dev/null' EXIT
740
749
  fi
@@ -786,13 +795,14 @@ LOG=${shQuote(log)}
786
795
  URL=${shQuote(url)}
787
796
  NODE=${shQuote(node)}
788
797
  ENTRY=${shQuote(SERVER_ENTRY)}
798
+ SDK_HOOK_ARG=${HAS_SDK_HOOK ? `${shQuote("--import")} ${shQuote(SDK_HOOK)} ` : ""}
789
799
  UNIT=${shQuote(unitName)}.service
790
800
 
791
801
  if ! curl -sf "$URL/api/health" >/dev/null 2>&1; then
792
802
  systemctl start "$UNIT" 2>/dev/null || true
793
803
  if ! curl -sf "$URL/api/health" >/dev/null 2>&1; then
794
804
  mkdir -p "$(dirname "$LOG")"
795
- "$NODE" "$ENTRY" >>"$LOG" 2>&1 &
805
+ "$NODE" $SDK_HOOK_ARG"$ENTRY" >>"$LOG" 2>&1 &
796
806
  SERVER_PID=$!
797
807
  trap 'kill "$SERVER_PID" 2>/dev/null' EXIT
798
808
  fi
@@ -909,7 +919,7 @@ function buildWinStartPs1(env, cwd, logPath, pidPath) {
909
919
  `$PID | Out-File -Encoding ascii ${psQuote(pidPath)}`,
910
920
  "try {",
911
921
  " while ($true) {",
912
- ` & ${psQuote(realNode())} ${psQuote(SERVER_ENTRY)} *>> ${psQuote(logPath)}`,
922
+ ` & ${psQuote(realNode())} ${HAS_SDK_HOOK ? `--import ${psQuote(SDK_HOOK)} ` : ""}${psQuote(SERVER_ENTRY)} *>> ${psQuote(logPath)}`,
913
923
  " Start-Sleep 10",
914
924
  " }",
915
925
  "} finally {",
@@ -968,7 +978,9 @@ function buildPlist(label, cwd, env) {
968
978
  <key>ProgramArguments</key>
969
979
  <array>
970
980
  <string>${esc(NODE)}</string>
971
- <string>${esc(SERVER_ENTRY)}</string>
981
+ ${
982
+ HAS_SDK_HOOK ? ` <string>--import</string>\n <string>${esc(SDK_HOOK)}</string>\n` : ""
983
+ } <string>${esc(SERVER_ENTRY)}</string>
972
984
  </array>
973
985
 
974
986
  <key>RunAtLoad</key>
@@ -1030,7 +1042,7 @@ Type=simple
1030
1042
  User=${process.env.SUDO_USER ?? userInfo().username}
1031
1043
  WorkingDirectory=${systemdPath(cwd)}
1032
1044
  ${envLines}
1033
- ${capabilities}ExecStart=${JSON.stringify(NODE)} ${JSON.stringify(SERVER_ENTRY)}
1045
+ ${capabilities}ExecStart=${JSON.stringify(NODE)}${HAS_SDK_HOOK ? ` --import ${JSON.stringify(SDK_HOOK)}` : ""} ${JSON.stringify(SERVER_ENTRY)}
1034
1046
  Restart=always
1035
1047
  RestartSec=5
1036
1048