u1s1-cli 1.14.6 → 1.15.1

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 (44) hide show
  1. package/dist/agent-setup.d.ts +7 -0
  2. package/dist/agent-setup.js +14 -0
  3. package/dist/agents/agent-config.d.ts +83 -0
  4. package/dist/agents/agent-config.js +154 -0
  5. package/dist/agents/claude.d.ts +113 -0
  6. package/dist/agents/claude.js +411 -0
  7. package/dist/agents/codex.d.ts +111 -0
  8. package/dist/agents/codex.js +392 -0
  9. package/dist/agents/launch.d.ts +109 -0
  10. package/dist/agents/launch.js +444 -0
  11. package/dist/agents/pi.d.ts +9 -0
  12. package/dist/agents/pi.js +562 -0
  13. package/dist/agents/prefs.d.ts +35 -0
  14. package/dist/agents/prefs.js +96 -0
  15. package/dist/agents/runtime.d.ts +354 -0
  16. package/dist/agents/runtime.js +884 -0
  17. package/dist/agents/status.d.ts +20 -0
  18. package/dist/agents/status.js +241 -0
  19. package/dist/config-command.d.ts +18 -0
  20. package/dist/config-command.js +335 -0
  21. package/dist/config.d.ts +17 -0
  22. package/dist/config.js +35 -1
  23. package/dist/device-auth.d.ts +37 -1
  24. package/dist/device-auth.js +43 -8
  25. package/dist/embed.d.ts +13 -0
  26. package/dist/embed.js +15 -0
  27. package/dist/index.js +22 -556
  28. package/dist/launcher.d.ts +48 -0
  29. package/dist/launcher.js +235 -0
  30. package/dist/mcp-server.d.ts +105 -0
  31. package/dist/mcp-server.js +449 -0
  32. package/dist/pi-ui-text.d.ts +57 -0
  33. package/dist/pi-ui-text.js +148 -0
  34. package/dist/usage.js +2 -2
  35. package/package.json +1 -1
  36. package/scripts/p0-claude-code/README.md +39 -0
  37. package/scripts/p0-claude-code/launch-claude.ts +94 -0
  38. package/scripts/p0-claude-code/replay.ts +74 -0
  39. package/scripts/p0-claude-code/seed-local.mjs +145 -0
  40. package/scripts/p0-claude-code/tap.mjs +105 -0
  41. package/scripts/patch-pi.js +76 -55
  42. package/scripts/pi-patch-report.mjs +224 -0
  43. package/scripts/pi-upgrade.mjs +829 -0
  44. package/scripts/render-regression.mjs +67 -5
@@ -6,13 +6,15 @@
6
6
  * 1. 内置工具行(bash)没被任何东西覆盖成 0 行——有调用、有结果就必须有可见行
7
7
  * 2. 思考块未隐藏时必须出现在助手消息里(没有被补丁吞掉)
8
8
  * 3. Windows ConPTY 的 autowrap 保护、补丁文案跟 U1S1_LANG 切中英
9
+ * 4. 进程内扩展的界面文案(registerUiText:斜杠命令补全描述、思考中提示)跟 U1S1_LANG 切中英、补全里没有 /bug
9
10
  * pi 升级后补丁没跟上、或又有人把工具行/思考块藏起来时,这里直接失败,挡在发布前。
10
11
  *
11
12
  * 运行:node scripts/render-regression.mjs(prepublishOnly 会自动跑)
12
13
  */
13
14
 
14
15
  import { Container, TuiMainScreen } from "@earendil-works/pi-tui";
15
- import { existsSync, readFileSync } from "node:fs";
16
+ import { existsSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
17
+ import { tmpdir } from "node:os";
16
18
  import { join, dirname } from "node:path";
17
19
  import { fileURLToPath, pathToFileURL } from "node:url";
18
20
 
@@ -125,7 +127,6 @@ const deletionFrame = terminal.writes.join("");
125
127
  checkTrue("Windows 删除行绘制关闭并恢复 autowrap", deletionFrame.includes("\x1b[?2026h\x1b[?7l") && deletionFrame.includes("\x1b[?7h\x1b[?2026l"));
126
128
 
127
129
  // ---- 4. 补丁文案跟 U1S1_LANG 走:en(国际站)不能漏出中文,其余保持中文 ----
128
- // 斜杠命令描述在模块加载时求值,换语言要带 query 重新 import 一份新实例;
129
130
  // /hotkeys 表格是 handleHotkeysCommand 里现拼的模板串,从源码抠出来用桩变量求值。
130
131
  const CJK = /[\u4e00-\u9fff\u3000-\u303f\uff00-\uffef]/;
131
132
  const prevLang = process.env.U1S1_LANG;
@@ -148,12 +149,72 @@ function renderErrorMessage() {
148
149
  c.addChild(new AssistantMessageComponent({ role: "assistant", content: [], stopReason: "error" }, true, undefined, "", 1, []));
149
150
  return stripAnsi(c.render(80).join("\n"));
150
151
  }
152
+ // 斜杠命令补全描述和「思考中」提示不再是补丁,由 pi.ts 进程内扩展调用的 registerUiText 实现
153
+ // (src/pi-ui-text.ts,需先 build):用 pi 真实的补全 provider 和助手消息组件,套上扩展 session_start 时装的东西再看结果。
154
+ const uiTextDist = join(dirname(dirname(fileURLToPath(import.meta.url))), "dist", "pi-ui-text.js");
155
+ if (!existsSync(uiTextDist)) throw new Error(`找不到 ${uiTextDist},先运行 pnpm --filter u1s1-cli build`);
156
+ const { registerUiText } = await import(pathToFileURL(uiTextDist).href);
157
+ const { BUILTIN_SLASH_COMMANDS } = await import(pathToFileURL(join(piRoot, "dist/core/slash-commands.js")).href);
158
+ const { CombinedAutocompleteProvider } = await import("@earendil-works/pi-tui");
159
+ const { DefaultResourceLoader } = await import(pathToFileURL(join(piRoot, "dist/core/resource-loader.js")).href);
160
+ const { SettingsManager } = await import(pathToFileURL(join(piRoot, "dist/core/settings-manager.js")).href);
161
+ // 按用户带 --no-extensions 的方式让 Pi 真实加载进程内扩展(和 pi.ts 一样经 extensionFactories 传入),
162
+ // 拿它注册的 session_start:以前是补丁,不受这个参数影响,现在也必须照样生效
163
+ const loaderDir = mkdtempSync(join(tmpdir(), "u1s1-render-regression-"));
164
+ async function loadUiTextSessionStart() {
165
+ const loader = new DefaultResourceLoader({
166
+ cwd: loaderDir,
167
+ agentDir: loaderDir,
168
+ settingsManager: SettingsManager.create(loaderDir, loaderDir),
169
+ extensionFactories: [{ name: "u1s1", factory: (pi) => registerUiText(pi) }],
170
+ noExtensions: true,
171
+ noSkills: true,
172
+ noPromptTemplates: true,
173
+ noThemes: true,
174
+ noContextFiles: true,
175
+ });
176
+ await loader.reload();
177
+ const inline = loader.getExtensions().extensions.find((e) => e.path === "<inline:u1s1>");
178
+ checkTrue("--no-extensions 下 Pi 仍加载进程内扩展 u1s1", inline !== undefined);
179
+ return inline?.handlers.get("session_start")?.[0];
180
+ }
181
+ async function renderSlashAndWorking() {
182
+ const sessionStart = await loadUiTextSessionStart();
183
+ const ui = { working: undefined, hidden: undefined, wrap: (p) => p };
184
+ sessionStart?.(
185
+ { type: "session_start", reason: "startup" },
186
+ {
187
+ mode: "tui",
188
+ hasUI: true,
189
+ ui: {
190
+ setWorkingMessage: (m) => (ui.working = m),
191
+ setHiddenThinkingLabel: (l) => (ui.hidden = l),
192
+ addAutocompleteProvider: (f) => (ui.wrap = f),
193
+ },
194
+ },
195
+ );
196
+ const commands = BUILTIN_SLASH_COMMANDS.map((c) => ({ name: c.name, description: c.description, ...(c.argumentHint && { argumentHint: c.argumentHint }) }));
197
+ const provider = ui.wrap(new CombinedAutocompleteProvider(commands, process.cwd()));
198
+ const { items } = await provider.getSuggestions(["/"], 0, 1, { signal: new AbortController().signal });
199
+ const c = new Container();
200
+ c.addChild(new AssistantMessageComponent(thinkingMsg, true, undefined, ui.hidden, 1, []));
201
+ return {
202
+ slashText: items.map((i) => `/${i.value} ${i.description ?? ""}`).join("\n"),
203
+ hasBug: items.some((i) => i.value === "bug"),
204
+ working: ui.working,
205
+ hiddenText: stripAnsi(c.render(80).join("\n")),
206
+ };
207
+ }
151
208
  try {
152
209
  for (const lang of ["zh", "en"]) {
153
210
  process.env.U1S1_LANG = lang;
154
- const slashUrl = pathToFileURL(join(piRoot, "dist/core/slash-commands.js")).href + `?lang=${lang}`;
155
- const { BUILTIN_SLASH_COMMANDS } = await import(slashUrl);
156
- const slashText = BUILTIN_SLASH_COMMANDS.map((c) => `/${c.name} ${c.description}`).join("\n");
211
+ const { slashText, hasBug, working, hiddenText } = await renderSlashAndWorking();
212
+ checkTrue(`U1S1_LANG=${lang} 斜杠命令补全里没有 /bug`, !hasBug && slashText.includes("/settings "));
213
+ if (lang === "en") {
214
+ checkTrue("U1S1_LANG=en 工作提示与隐藏思考标签为英文", working === "Working" && hiddenText.includes("Thinking...") && !hiddenText.includes("思考中"));
215
+ } else {
216
+ checkTrue("U1S1_LANG=zh 工作提示与隐藏思考标签为中文", working === "思考中…" && hiddenText.includes("思考中…") && !hiddenText.includes("Thinking..."));
217
+ }
157
218
  const hotkeysText = renderHotkeys();
158
219
  const hintText = stripAnsi(rawKeyHint("esc", "cancel") + rawKeyHint("enter", "select"));
159
220
  const errorText = renderErrorMessage();
@@ -172,6 +233,7 @@ try {
172
233
  } finally {
173
234
  if (prevLang === undefined) delete process.env.U1S1_LANG;
174
235
  else process.env.U1S1_LANG = prevLang;
236
+ rmSync(loaderDir, { recursive: true, force: true });
175
237
  }
176
238
 
177
239
  if (failed > 0) {