@master.g/pi-wingman 0.0.3 → 0.0.4
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/README.md +3 -3
- package/hint.ts +14 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
| **advisor** | oh-my-pi advisor | 指定一个模型当顾问,读主 agent 的每个 turn,以 steer 消息内联注入便签(aside / concern / blocker)让主 agent 纠偏 |
|
|
11
11
|
| **hint** | Claude Code prompt suggestions | 任务结束后按上下文与目标生成下一步 prompt,输入框 ghost text 呈现:Tab 填入、Enter 直接发送 |
|
|
12
12
|
|
|
13
|
-
> 状态:早期版本(v0.0.
|
|
13
|
+
> 状态:早期版本(v0.0.4)。hint、advisor、heads-up 三个功能均已实现,默认关闭,尚在试用打磨中。
|
|
14
14
|
|
|
15
15
|
## 安装
|
|
16
16
|
|
|
@@ -30,7 +30,7 @@ pi --extension ~/github/pi-wingman/index.ts
|
|
|
30
30
|
- `/wingman advisor|hint|headsup` — 不带值时弹出 pi 的模型选择器(同 `/model`,可搜索),选完模型再选思考强度(同 `/thinking`,Esc 跳过);也可直接写 `<provider/model> [effort]`(模型须存在,effort 须是该模型支持的档位)、`on` / `off`(开关,保留已设模型与 effort);参数支持补全
|
|
31
31
|
- `/ask-advisor <问题>` — 就当前上下文咨询顾问模型,回答注入对话
|
|
32
32
|
|
|
33
|
-
advisor 与 heads-up 审计通过(ok)时不打扰,只在底栏状态显示 `advisor ⋯`(审计中)、`advisor ✓ ok`(结果级别)或 `advisor ✗
|
|
33
|
+
advisor 与 heads-up 审计通过(ok)时不打扰,只在底栏状态显示 `advisor ⋯`(审计中)、`advisor ✓ ok`(结果级别)或 `advisor ✗ 原因`(调用失败);hint 生成中显示 `hint ⋯`,失败显示 `hint ✗ 原因`,成功后 hint 直接出现在输入行;自定义 footer 扩展需要自己渲染扩展状态才看得到。
|
|
34
34
|
|
|
35
35
|
## 配置
|
|
36
36
|
|
|
@@ -44,7 +44,7 @@ advisor 与 heads-up 审计通过(ok)时不打扰,只在底栏状态显示
|
|
|
44
44
|
}
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
三个功能默认都关闭:每个功能都会额外调用模型,需要用户自己开启。模型形如 `provider/model-id`;hint 没配模型时用当前模型(`/wingman hint on`),advisor/heads-up 必须配模型才会激活。`effort` 可选(off / minimal / low / medium / high / xhigh / max,按模型支持的档位校正),不设则不开推理。advisor/heads-up 在后台跑,单次调用超时 60 秒;hint
|
|
47
|
+
三个功能默认都关闭:每个功能都会额外调用模型,需要用户自己开启。模型形如 `provider/model-id`;hint 没配模型时用当前模型(`/wingman hint on`),advisor/heads-up 必须配模型才会激活。`effort` 可选(off / minimal / low / medium / high / xhigh / max,按模型支持的档位校正),不设则不开推理。advisor/heads-up 在后台跑,单次调用超时 60 秒;hint 超时 30 秒;hint 越快越有用,建议不设或用低 effort(实测 glm-5.3-flash 不设约 2 秒,max 要 6–14 秒)。
|
|
48
48
|
|
|
49
49
|
## License
|
|
50
50
|
|
package/hint.ts
CHANGED
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
* before_agent_start 清除 hint 并使在途生成作废。
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
10
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
11
11
|
import { buildDigest, type DigestMessage } from "./audit.js";
|
|
12
12
|
import type { WingmanConfig } from "./config.js";
|
|
13
13
|
import type { EditorManager } from "./editor.js";
|
|
14
|
-
import { completeText, resolveModel, type AnyModel
|
|
14
|
+
import { completeText, resolveModel, type AnyModel } from "./llm.js";
|
|
15
15
|
|
|
16
16
|
const HINT_SYSTEM_PROMPT = `The user is driving an AI coding agent. Given the user's goal and the latest transcript, suggest the single next prompt the user is most likely to send.
|
|
17
17
|
|
|
@@ -22,6 +22,7 @@ Rules:
|
|
|
22
22
|
- If the work looks finished, suggest a sensible follow-up or say "继续".`;
|
|
23
23
|
|
|
24
24
|
const MAX_HINT_CHARS = 120;
|
|
25
|
+
const STATUS_KEY = "wingman-hint";
|
|
25
26
|
|
|
26
27
|
export function installHint(
|
|
27
28
|
pi: ExtensionAPI,
|
|
@@ -33,10 +34,11 @@ export function installHint(
|
|
|
33
34
|
/** 每个新 run 自增;生成回来时代际已变说明 hint 过期,丢弃。 */
|
|
34
35
|
let generation = 0;
|
|
35
36
|
|
|
36
|
-
const generate = async (
|
|
37
|
+
const generate = async (ctx: ExtensionContext, model: AnyModel, transcript: string, gen: number) => {
|
|
38
|
+
ctx.ui.setStatus(STATUS_KEY, "hint ⋯");
|
|
37
39
|
const goal = getGoal() ? `User's goal: ${getGoal()}\n\n` : "";
|
|
38
40
|
const result = await completeText(
|
|
39
|
-
|
|
41
|
+
ctx.modelRegistry,
|
|
40
42
|
model,
|
|
41
43
|
{
|
|
42
44
|
systemPrompt: HINT_SYSTEM_PROMPT,
|
|
@@ -48,16 +50,19 @@ export function installHint(
|
|
|
48
50
|
},
|
|
49
51
|
],
|
|
50
52
|
},
|
|
51
|
-
//
|
|
52
|
-
{ timeoutMs:
|
|
53
|
+
// 高 effort 常要 10s 以上;迟到的 hint 由代际与空编辑器判断兜底,放宽无副作用
|
|
54
|
+
{ timeoutMs: 30_000, signal: shutdown.signal, effort: getConfig().hint.effort },
|
|
53
55
|
);
|
|
54
|
-
if (
|
|
56
|
+
if (gen !== generation) return; // 已过期:新 run 开始时已清状态
|
|
57
|
+
ctx.ui.setStatus(STATUS_KEY, result.ok ? undefined : `hint ✗ ${result.reason.slice(0, 60)}`);
|
|
58
|
+
if (!result.ok) return;
|
|
55
59
|
editors.current?.setHint(result.text.replace(/\s+/g, " ").trim().slice(0, MAX_HINT_CHARS));
|
|
56
60
|
};
|
|
57
61
|
|
|
58
|
-
pi.on("before_agent_start", () => {
|
|
62
|
+
pi.on("before_agent_start", (_event, ctx) => {
|
|
59
63
|
generation++;
|
|
60
64
|
editors.current?.setHint(undefined);
|
|
65
|
+
ctx.ui.setStatus(STATUS_KEY, undefined);
|
|
61
66
|
});
|
|
62
67
|
|
|
63
68
|
pi.on("agent_end", (event, ctx) => {
|
|
@@ -68,7 +73,7 @@ export function installHint(
|
|
|
68
73
|
const transcript = buildDigest(event.messages as DigestMessage[], { maxMessages: 6, perMessageChars: 500 });
|
|
69
74
|
if (!transcript) return;
|
|
70
75
|
// 后台执行已在 runner 的 try/catch 之外,自己兜底(会话替换后 UI 调用可能抛)
|
|
71
|
-
generate(ctx
|
|
76
|
+
generate(ctx, model, transcript, generation).catch(() => {});
|
|
72
77
|
});
|
|
73
78
|
|
|
74
79
|
pi.on("session_shutdown", () => {
|
package/package.json
CHANGED