@gavin-hu/my-pi-agent 0.16.0 → 0.18.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.
- package/README.md +29 -15
- package/README.zh-CN.md +27 -15
- package/extensions/bytefly/README.md +195 -115
- package/extensions/bytefly/footer/collect/entries.ts +1 -6
- package/extensions/bytefly/footer/collect/snapshot.ts +23 -9
- package/extensions/bytefly/footer/price/price.ts +12 -8
- package/extensions/bytefly/footer/register.ts +13 -1
- package/extensions/bytefly/footer/types.ts +11 -0
- package/extensions/bytefly/footer/unpriced.ts +36 -0
- package/extensions/bytefly/header/component.ts +15 -29
- package/extensions/bytefly/header/identity.ts +71 -0
- package/extensions/bytefly/header/register.ts +9 -3
- package/extensions/bytefly/index.ts +13 -5
- package/extensions/bytefly/message/format.ts +20 -13
- package/extensions/bytefly/message/register.ts +8 -7
- package/extensions/bytefly/notify/types.ts +1 -1
- package/extensions/bytefly/panel/commands.ts +46 -25
- package/extensions/bytefly/panel/format.ts +49 -14
- package/extensions/bytefly/panel/join.ts +35 -9
- package/extensions/bytefly/panel/settings.ts +29 -39
- package/extensions/bytefly/panel/skills.ts +51 -0
- package/extensions/bytefly/panel/tui/extensions-view.ts +7 -61
- package/extensions/bytefly/panel/tui/frame.ts +9 -1
- package/extensions/bytefly/panel/tui/list-view.ts +72 -0
- package/extensions/bytefly/panel/tui/nav.ts +71 -3
- package/extensions/bytefly/panel/tui/settings-section.ts +250 -0
- package/extensions/bytefly/panel/tui/skills-view.ts +50 -0
- package/extensions/bytefly/panel/tui.ts +223 -331
- package/extensions/bytefly/panel/types.ts +26 -8
- package/extensions/bytefly/picker/discovery.ts +32 -27
- package/extensions/bytefly/picker/resources.ts +16 -8
- package/extensions/bytefly/picker/runtime.ts +62 -34
- package/extensions/bytefly/picker/toggle.ts +16 -10
- package/extensions/bytefly/picker/types.ts +31 -13
- package/extensions/bytefly/update/format.ts +66 -8
- package/extensions/bytefly/update/patch.ts +66 -0
- package/extensions/bytefly/update/register.ts +4 -11
- package/extensions/bytefly/update/release.ts +65 -0
- package/extensions/bytefly/update/state.ts +14 -0
- package/extensions/bytefly/update/suppress.ts +47 -29
- package/extensions/bytefly/update/types.ts +15 -5
- package/extensions/check/tui.ts +2 -0
- package/extensions/context/README.md +21 -11
- package/extensions/context/format.ts +10 -8
- package/extensions/context/report.ts +21 -8
- package/extensions/context/tui.ts +26 -10
- package/extensions/context/types.ts +5 -3
- package/extensions/file-browse/README.md +89 -22
- package/extensions/file-browse/chrome.ts +83 -0
- package/extensions/file-browse/client.ts +74 -459
- package/extensions/file-browse/config.ts +12 -3
- package/extensions/file-browse/diff-html.ts +94 -0
- package/extensions/file-browse/html.ts +26 -152
- package/extensions/file-browse/live-client.ts +47 -1
- package/extensions/file-browse/live.ts +35 -14
- package/extensions/file-browse/palette.ts +224 -0
- package/extensions/file-browse/rev.ts +42 -0
- package/extensions/file-browse/router.ts +27 -6
- package/extensions/file-browse/server.ts +7 -0
- package/extensions/file-browse/styles.ts +10 -3
- package/extensions/file-browse/tree.ts +381 -0
- package/extensions/file-read/README.md +4 -1
- package/extensions/file-read/extract/odt.ts +7 -5
- package/extensions/goal/plan-route.ts +8 -2
- package/extensions/goal/tools.ts +6 -11
- package/extensions/job/README.md +7 -5
- package/extensions/job/index.ts +35 -52
- package/extensions/job/tools.ts +51 -77
- package/extensions/memory/README.md +3 -3
- package/extensions/memory/tools.ts +4 -6
- package/extensions/memory/tui.ts +5 -1
- package/extensions/plan/README.md +333 -84
- package/extensions/plan/commands.ts +73 -7
- package/extensions/plan/feedback.ts +300 -63
- package/extensions/plan/index.ts +1 -1
- package/extensions/plan/plan-index.ts +4 -2
- package/extensions/plan/plan-text.ts +18 -1
- package/extensions/plan/plans.ts +184 -58
- package/extensions/plan/review-prompt.ts +93 -0
- package/extensions/plan/review.ts +95 -95
- package/extensions/plan/runtime.ts +4 -2
- package/extensions/plan/split.ts +87 -0
- package/extensions/plan/steps.ts +123 -107
- package/extensions/plan/tools/cancel.ts +79 -0
- package/extensions/plan/tools/enter.ts +17 -12
- package/extensions/plan/tools/exit.ts +148 -59
- package/extensions/plan/tools/steps.ts +7 -19
- package/extensions/plan/tools/write.ts +29 -31
- package/extensions/plan/tools.ts +6 -3
- package/extensions/plan/tui.ts +60 -15
- package/extensions/plan/types.ts +45 -3
- package/extensions/plan/web-chrome.ts +102 -0
- package/extensions/plan/web-client.ts +177 -446
- package/extensions/plan/web-collab.ts +207 -0
- package/extensions/plan/web-comments.ts +269 -0
- package/extensions/plan/web-markdown.ts +222 -0
- package/extensions/plan/web-page.ts +131 -19
- package/extensions/plan/web-router.ts +148 -32
- package/extensions/plan/web-share-session.ts +197 -0
- package/extensions/plan/web-share.ts +169 -0
- package/extensions/plan/web-streams.ts +124 -0
- package/extensions/plan/web-tokens.ts +63 -0
- package/extensions/plan/web.ts +193 -45
- package/extensions/question/README.md +3 -0
- package/extensions/question/dialogs.ts +91 -1
- package/extensions/question/tools.ts +2 -1
- package/extensions/rewind/checklist.ts +4 -0
- package/extensions/rewind/review-tui.ts +3 -1
- package/extensions/rewind/rewind-tui.ts +4 -0
- package/extensions/session-bus/README.md +247 -0
- package/extensions/session-bus/commands.ts +165 -0
- package/extensions/session-bus/format.ts +124 -0
- package/extensions/session-bus/index.ts +69 -0
- package/extensions/session-bus/notice.ts +58 -0
- package/extensions/session-bus/protocol.ts +134 -0
- package/extensions/session-bus/result.ts +243 -0
- package/extensions/session-bus/rows.ts +169 -0
- package/extensions/session-bus/runtime.ts +575 -0
- package/extensions/session-bus/store.ts +329 -0
- package/extensions/session-bus/team.ts +102 -0
- package/extensions/session-bus/tools.ts +227 -0
- package/extensions/session-bus/tui.ts +394 -0
- package/extensions/session-bus/types.ts +98 -0
- package/extensions/subagent/README.md +26 -13
- package/extensions/subagent/format.ts +72 -25
- package/extensions/subagent/index.ts +21 -47
- package/extensions/subagent/orchestrate.ts +18 -41
- package/extensions/subagent/render.ts +29 -42
- package/extensions/subagent/stream.ts +24 -18
- package/extensions/subagent/types.ts +7 -0
- package/extensions/todo/tools.ts +5 -6
- package/extensions/todo/tui.ts +5 -1
- package/extensions/watch/README.md +9 -5
- package/extensions/watch/index.ts +25 -44
- package/extensions/watch/tools.ts +31 -59
- package/extensions/wechat/README.md +45 -36
- package/extensions/wechat/bridge.ts +46 -48
- package/extensions/wechat/client.ts +1 -4
- package/extensions/wechat/commands.ts +3 -3
- package/extensions/wechat/deliver.ts +57 -37
- package/extensions/wechat/interaction.ts +54 -18
- package/extensions/wechat/login-screen.ts +2 -3
- package/extensions/wechat/notices.ts +9 -7
- package/extensions/wechat/peer-worker.ts +19 -34
- package/extensions/wechat/presence.ts +3 -4
- package/extensions/wechat/prompt.ts +53 -23
- package/extensions/wechat/reply-pipeline.ts +12 -4
- package/extensions/wechat/slash.ts +14 -0
- package/extensions/wechat/status-screen.ts +2 -2
- package/extensions/wechat/tools.ts +3 -11
- package/extensions/worktree/README.md +48 -12
- package/extensions/worktree/commands.ts +109 -65
- package/extensions/worktree/enter.ts +1 -1
- package/extensions/worktree/exit.ts +11 -1
- package/extensions/worktree/git.ts +5 -0
- package/extensions/worktree/lifecycle.ts +9 -1
- package/extensions/worktree/registry.ts +11 -5
- package/extensions/worktree/screen.ts +263 -0
- package/extensions/worktree/status.ts +84 -40
- package/lib/README.md +12 -7
- package/lib/claims/overlap.ts +43 -0
- package/lib/config.ts +12 -0
- package/lib/format.ts +6 -2
- package/lib/http/router.ts +40 -13
- package/lib/http/server.ts +27 -13
- package/lib/interaction.ts +28 -1
- package/lib/notice.ts +29 -2
- package/lib/plan-entry.ts +7 -2
- package/lib/plans/sections.ts +172 -0
- package/lib/plans/setting.ts +52 -0
- package/lib/plans/split.ts +215 -0
- package/lib/plans/store.ts +19 -0
- package/lib/plans/team.ts +151 -0
- package/lib/qr.ts +64 -0
- package/lib/repo-key.ts +74 -0
- package/lib/report.ts +117 -25
- package/lib/requirements.ts +1 -2
- package/lib/tool-result.ts +54 -4
- package/lib/tui/README.md +30 -8
- package/lib/tui/chrome.ts +27 -6
- package/lib/tui/dock-screen.ts +91 -19
- package/lib/tui/gauge.ts +9 -5
- package/lib/tui/line-pane.ts +15 -4
- package/lib/tui/tool.ts +23 -4
- package/lib/usage.ts +26 -0
- package/lib/web/README.md +131 -0
- package/lib/web/base.ts +19 -2
- package/lib/web/components.ts +10 -6
- package/lib/web/layout.ts +2 -0
- package/lib/web/markup.ts +2 -1
- package/lib/web/runtime.ts +103 -25
- package/lib/web/tokens.ts +23 -7
- package/package.json +5 -2
- package/skills/changelog/SKILL.md +57 -45
- package/skills/init/SKILL.md +80 -45
- package/skills/init/references/agents-md-quality.md +26 -2
- package/skills/init/references/interview-questions.md +36 -14
- package/skills/next/SKILL.md +209 -0
- package/skills/parallel-dev/SKILL.md +150 -0
- package/extensions/wechat/qrcode.ts +0 -46
package/extensions/job/tools.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
12
|
-
import { errorResult } from "../../lib/tool-result.ts";
|
|
12
|
+
import { errorResult, textResult } from "../../lib/tool-result.ts";
|
|
13
13
|
import { reuseText, toolDetails } from "../../lib/tui/chrome.ts";
|
|
14
14
|
import { callLine, detailsOrLine, elapsedSuffix, rejectionLine, syncElapsedTimer } from "../../lib/tui/tool.ts";
|
|
15
15
|
import { SEPARATORS } from "../../lib/tui/glyphs.ts";
|
|
@@ -77,46 +77,40 @@ export function registerTools(pi: ExtensionAPI, runtime: JobsRuntime): void {
|
|
|
77
77
|
},
|
|
78
78
|
ctx,
|
|
79
79
|
);
|
|
80
|
-
return
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
text: `Started ${job.id} (pid ${job.pid ?? "?"}): ${job.command}\nPoll with \`job status ${job.id}\`, or \`job wait ${job.id}\`.`,
|
|
85
|
-
},
|
|
86
|
-
],
|
|
87
|
-
details: { action: "start", job: toRecord(job) } satisfies JobDetails,
|
|
88
|
-
};
|
|
80
|
+
return textResult(
|
|
81
|
+
`Started ${job.id} (pid ${job.pid ?? "?"}): ${job.command}\nPoll with \`job status ${job.id}\`, or \`job wait ${job.id}\`.`,
|
|
82
|
+
{ action: "start", job: toRecord(job) } satisfies JobDetails,
|
|
83
|
+
);
|
|
89
84
|
}
|
|
90
85
|
|
|
91
86
|
case "list": {
|
|
92
87
|
const jobs = runtime.list();
|
|
93
|
-
return {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
88
|
+
return textResult(formatJobList(jobs, Date.now(), runtime.sessionId), {
|
|
89
|
+
action: "list",
|
|
90
|
+
jobs,
|
|
91
|
+
sessionId: runtime.sessionId,
|
|
92
|
+
} satisfies JobDetails);
|
|
97
93
|
}
|
|
98
94
|
|
|
99
95
|
case "status": {
|
|
100
96
|
const job = runtime.get(call.id);
|
|
101
97
|
if (!job) return errorResult("status", `no job "${call.id}".`);
|
|
102
|
-
return {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
98
|
+
return textResult(formatJobStatus(job, Date.now(), runtime.sessionId), {
|
|
99
|
+
action: "status",
|
|
100
|
+
job: toRecord(job),
|
|
101
|
+
sessionId: runtime.sessionId,
|
|
102
|
+
} satisfies JobDetails);
|
|
106
103
|
}
|
|
107
104
|
|
|
108
105
|
case "logs": {
|
|
109
106
|
const result = runtime.logs(call.id, call.lines);
|
|
110
107
|
if (!result) return errorResult("logs", `no job "${call.id}".`);
|
|
111
|
-
return {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
truncated: result.truncated,
|
|
118
|
-
} satisfies JobDetails,
|
|
119
|
-
};
|
|
108
|
+
return textResult(result.text, {
|
|
109
|
+
action: "logs",
|
|
110
|
+
job: toRecord(result.job),
|
|
111
|
+
logs: result.lines.join("\n"),
|
|
112
|
+
truncated: result.truncated,
|
|
113
|
+
} satisfies JobDetails);
|
|
120
114
|
}
|
|
121
115
|
|
|
122
116
|
case "send": {
|
|
@@ -132,15 +126,12 @@ export function registerTools(pi: ExtensionAPI, runtime: JobsRuntime): void {
|
|
|
132
126
|
result.closed ? " and closed its stdin" : ""
|
|
133
127
|
}.`
|
|
134
128
|
: `Closed ${job.id}'s stdin.`;
|
|
135
|
-
return {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
stdinClosed: result.closed,
|
|
142
|
-
} satisfies JobDetails,
|
|
143
|
-
};
|
|
129
|
+
return textResult(text, {
|
|
130
|
+
action: "send",
|
|
131
|
+
job: toRecord(job),
|
|
132
|
+
sent: result.sent,
|
|
133
|
+
stdinClosed: result.closed,
|
|
134
|
+
} satisfies JobDetails);
|
|
144
135
|
}
|
|
145
136
|
|
|
146
137
|
case "kill": {
|
|
@@ -149,30 +140,27 @@ export function registerTools(pi: ExtensionAPI, runtime: JobsRuntime): void {
|
|
|
149
140
|
const job = runtime.kill(call.id, call.signal);
|
|
150
141
|
if (!job) return errorResult("kill", `no job "${call.id}".`);
|
|
151
142
|
const wasRunning = before.status === "running";
|
|
152
|
-
return
|
|
153
|
-
|
|
154
|
-
{
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
? `Sent ${call.signal ?? "SIGTERM"} to ${job.id} (${job.label}).`
|
|
158
|
-
: `${job.id} already ${job.status}; nothing to kill.`,
|
|
159
|
-
},
|
|
160
|
-
],
|
|
161
|
-
details: {
|
|
143
|
+
return textResult(
|
|
144
|
+
wasRunning
|
|
145
|
+
? `Sent ${call.signal ?? "SIGTERM"} to ${job.id} (${job.label}).`
|
|
146
|
+
: `${job.id} already ${job.status}; nothing to kill.`,
|
|
147
|
+
{
|
|
162
148
|
action: "kill",
|
|
163
149
|
job: toRecord(job),
|
|
164
150
|
signalled: wasRunning,
|
|
165
151
|
signal: call.signal ?? "SIGTERM",
|
|
166
152
|
} satisfies JobDetails,
|
|
167
|
-
|
|
153
|
+
);
|
|
168
154
|
}
|
|
169
155
|
|
|
170
156
|
case "wait": {
|
|
171
157
|
const result = await runtime.wait(call.id, call.timeoutMs, signal, () =>
|
|
172
|
-
onUpdate?.(
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
158
|
+
onUpdate?.(
|
|
159
|
+
textResult(`Waiting on ${call.id}…`, {
|
|
160
|
+
action: "wait",
|
|
161
|
+
job: runtime.get(call.id),
|
|
162
|
+
} satisfies JobDetails),
|
|
163
|
+
),
|
|
176
164
|
);
|
|
177
165
|
if (!result) return errorResult("wait", `no job "${call.id}".`);
|
|
178
166
|
const { job, timedOut, cancelled } = result;
|
|
@@ -181,37 +169,23 @@ export function registerTools(pi: ExtensionAPI, runtime: JobsRuntime): void {
|
|
|
181
169
|
: timedOut
|
|
182
170
|
? " (still running after the timeout)"
|
|
183
171
|
: "";
|
|
184
|
-
return {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
],
|
|
191
|
-
details: {
|
|
192
|
-
action: "wait",
|
|
193
|
-
job: toRecord(job),
|
|
194
|
-
timedOut,
|
|
195
|
-
cancelled,
|
|
196
|
-
} satisfies JobDetails,
|
|
197
|
-
};
|
|
172
|
+
return textResult(`${formatCompletion(job)}${note}${job.lastLine ? `\nlast: ${job.lastLine}` : ""}`, {
|
|
173
|
+
action: "wait",
|
|
174
|
+
job: toRecord(job),
|
|
175
|
+
timedOut,
|
|
176
|
+
cancelled,
|
|
177
|
+
} satisfies JobDetails);
|
|
198
178
|
}
|
|
199
179
|
|
|
200
180
|
case "clear": {
|
|
201
181
|
const result = runtime.clear(call.id, call.all ?? false);
|
|
202
182
|
if (result.refused) return errorResult("clear", result.refused);
|
|
203
|
-
return
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
? "Nothing to clear."
|
|
210
|
-
: `Cleared ${result.cleared} job${result.cleared === 1 ? "" : "s"}.`,
|
|
211
|
-
},
|
|
212
|
-
],
|
|
213
|
-
details: { action: "clear", cleared: result.cleared, jobs: runtime.list() } satisfies JobDetails,
|
|
214
|
-
};
|
|
183
|
+
return textResult(
|
|
184
|
+
result.cleared === 0
|
|
185
|
+
? "Nothing to clear."
|
|
186
|
+
: `Cleared ${result.cleared} job${result.cleared === 1 ? "" : "s"}.`,
|
|
187
|
+
{ action: "clear", cleared: result.cleared, jobs: runtime.list() } satisfies JobDetails,
|
|
188
|
+
);
|
|
215
189
|
}
|
|
216
190
|
}
|
|
217
191
|
} catch (error) {
|
|
@@ -169,9 +169,9 @@ skill. Mitigations:
|
|
|
169
169
|
injection, and rendering.
|
|
170
170
|
- Reads are capped at 256 KiB and the injected body at `maxInjectBytes`.
|
|
171
171
|
- The path is a fixed constant; a symlink at the memory path is refused.
|
|
172
|
-
- The files are ordinary user-owned markdown
|
|
173
|
-
|
|
174
|
-
project
|
|
172
|
+
- The files are ordinary user-owned markdown, so committing or sharing them is
|
|
173
|
+
the user's choice; review project memory before trusting a repository. Notes
|
|
174
|
+
stay in the project, unlike plans, which live in the agent directory.
|
|
175
175
|
|
|
176
176
|
## Limitations
|
|
177
177
|
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
import type { JsonValue } from "@earendil-works/pi-ai";
|
|
12
12
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
13
13
|
import { callLine, detailsOrLine } from "../../lib/tui/tool.ts";
|
|
14
|
+
import { failedResult, textResult } from "../../lib/tool-result.ts";
|
|
14
15
|
import { reuseText, toolDetails } from "../../lib/tui/chrome.ts";
|
|
15
16
|
import { messageOf } from "./errors.ts";
|
|
16
17
|
import { formatCallText, formatResultText, scopeLabel } from "./format.ts";
|
|
@@ -49,12 +50,9 @@ function toStructuredContent(details: MemoryDetails): Record<string, JsonValue>
|
|
|
49
50
|
*/
|
|
50
51
|
function memoryResult(details: MemoryDetails, error?: string) {
|
|
51
52
|
const full: MemoryDetails = error === undefined ? details : { ...details, error };
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
structuredContent: toStructuredContent(full),
|
|
56
|
-
...(error === undefined ? {} : { isError: true as const }),
|
|
57
|
-
};
|
|
53
|
+
const text = formatResultText(full);
|
|
54
|
+
const structuredContent = toStructuredContent(full);
|
|
55
|
+
return error === undefined ? textResult(text, full, structuredContent) : failedResult(text, full, structuredContent);
|
|
58
56
|
}
|
|
59
57
|
|
|
60
58
|
export function registerTools(pi: ExtensionAPI, runtime: MemoryRuntime): void {
|
package/extensions/memory/tui.ts
CHANGED
|
@@ -43,7 +43,7 @@ const MAX_NOTE_CHARS = 500;
|
|
|
43
43
|
/** Rows the screen shows when the terminal height is unknown. */
|
|
44
44
|
const SCREEN_DEFAULT_ROWS = 14;
|
|
45
45
|
|
|
46
|
-
/** Fixed rows around the list: header, summary, blank, blank, hint,
|
|
46
|
+
/** Fixed rows around the list: header, summary, blank, blank, hint, closing rule. */
|
|
47
47
|
const CHROME = 6;
|
|
48
48
|
|
|
49
49
|
/** Which scopes the list shows. */
|
|
@@ -482,6 +482,8 @@ export class MemoryPickerComponent implements Component {
|
|
|
482
482
|
const body: string[] = [];
|
|
483
483
|
for (const line of this.editor.render(Math.max(1, width - 2))) body.push(`${pad}${line}`);
|
|
484
484
|
return dockListFrame({
|
|
485
|
+
theme: this.theme,
|
|
486
|
+
width,
|
|
485
487
|
header: titleRule(this.theme, width, `Memory · ${verb} ${scope}`),
|
|
486
488
|
summary: clip(` ${paint(this.theme, "meta", summary)}`, width),
|
|
487
489
|
body,
|
|
@@ -528,6 +530,8 @@ export class MemoryPickerComponent implements Component {
|
|
|
528
530
|
]);
|
|
529
531
|
|
|
530
532
|
return dockListFrame({
|
|
533
|
+
theme: this.theme,
|
|
534
|
+
width: w,
|
|
531
535
|
header: titleRule(this.theme, w, "Memory"),
|
|
532
536
|
summary: this.summary(w),
|
|
533
537
|
body,
|