@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.
Files changed (200) hide show
  1. package/README.md +29 -15
  2. package/README.zh-CN.md +27 -15
  3. package/extensions/bytefly/README.md +195 -115
  4. package/extensions/bytefly/footer/collect/entries.ts +1 -6
  5. package/extensions/bytefly/footer/collect/snapshot.ts +23 -9
  6. package/extensions/bytefly/footer/price/price.ts +12 -8
  7. package/extensions/bytefly/footer/register.ts +13 -1
  8. package/extensions/bytefly/footer/types.ts +11 -0
  9. package/extensions/bytefly/footer/unpriced.ts +36 -0
  10. package/extensions/bytefly/header/component.ts +15 -29
  11. package/extensions/bytefly/header/identity.ts +71 -0
  12. package/extensions/bytefly/header/register.ts +9 -3
  13. package/extensions/bytefly/index.ts +13 -5
  14. package/extensions/bytefly/message/format.ts +20 -13
  15. package/extensions/bytefly/message/register.ts +8 -7
  16. package/extensions/bytefly/notify/types.ts +1 -1
  17. package/extensions/bytefly/panel/commands.ts +46 -25
  18. package/extensions/bytefly/panel/format.ts +49 -14
  19. package/extensions/bytefly/panel/join.ts +35 -9
  20. package/extensions/bytefly/panel/settings.ts +29 -39
  21. package/extensions/bytefly/panel/skills.ts +51 -0
  22. package/extensions/bytefly/panel/tui/extensions-view.ts +7 -61
  23. package/extensions/bytefly/panel/tui/frame.ts +9 -1
  24. package/extensions/bytefly/panel/tui/list-view.ts +72 -0
  25. package/extensions/bytefly/panel/tui/nav.ts +71 -3
  26. package/extensions/bytefly/panel/tui/settings-section.ts +250 -0
  27. package/extensions/bytefly/panel/tui/skills-view.ts +50 -0
  28. package/extensions/bytefly/panel/tui.ts +223 -331
  29. package/extensions/bytefly/panel/types.ts +26 -8
  30. package/extensions/bytefly/picker/discovery.ts +32 -27
  31. package/extensions/bytefly/picker/resources.ts +16 -8
  32. package/extensions/bytefly/picker/runtime.ts +62 -34
  33. package/extensions/bytefly/picker/toggle.ts +16 -10
  34. package/extensions/bytefly/picker/types.ts +31 -13
  35. package/extensions/bytefly/update/format.ts +66 -8
  36. package/extensions/bytefly/update/patch.ts +66 -0
  37. package/extensions/bytefly/update/register.ts +4 -11
  38. package/extensions/bytefly/update/release.ts +65 -0
  39. package/extensions/bytefly/update/state.ts +14 -0
  40. package/extensions/bytefly/update/suppress.ts +47 -29
  41. package/extensions/bytefly/update/types.ts +15 -5
  42. package/extensions/check/tui.ts +2 -0
  43. package/extensions/context/README.md +21 -11
  44. package/extensions/context/format.ts +10 -8
  45. package/extensions/context/report.ts +21 -8
  46. package/extensions/context/tui.ts +26 -10
  47. package/extensions/context/types.ts +5 -3
  48. package/extensions/file-browse/README.md +89 -22
  49. package/extensions/file-browse/chrome.ts +83 -0
  50. package/extensions/file-browse/client.ts +74 -459
  51. package/extensions/file-browse/config.ts +12 -3
  52. package/extensions/file-browse/diff-html.ts +94 -0
  53. package/extensions/file-browse/html.ts +26 -152
  54. package/extensions/file-browse/live-client.ts +47 -1
  55. package/extensions/file-browse/live.ts +35 -14
  56. package/extensions/file-browse/palette.ts +224 -0
  57. package/extensions/file-browse/rev.ts +42 -0
  58. package/extensions/file-browse/router.ts +27 -6
  59. package/extensions/file-browse/server.ts +7 -0
  60. package/extensions/file-browse/styles.ts +10 -3
  61. package/extensions/file-browse/tree.ts +381 -0
  62. package/extensions/file-read/README.md +4 -1
  63. package/extensions/file-read/extract/odt.ts +7 -5
  64. package/extensions/goal/plan-route.ts +8 -2
  65. package/extensions/goal/tools.ts +6 -11
  66. package/extensions/job/README.md +7 -5
  67. package/extensions/job/index.ts +35 -52
  68. package/extensions/job/tools.ts +51 -77
  69. package/extensions/memory/README.md +3 -3
  70. package/extensions/memory/tools.ts +4 -6
  71. package/extensions/memory/tui.ts +5 -1
  72. package/extensions/plan/README.md +333 -84
  73. package/extensions/plan/commands.ts +73 -7
  74. package/extensions/plan/feedback.ts +300 -63
  75. package/extensions/plan/index.ts +1 -1
  76. package/extensions/plan/plan-index.ts +4 -2
  77. package/extensions/plan/plan-text.ts +18 -1
  78. package/extensions/plan/plans.ts +184 -58
  79. package/extensions/plan/review-prompt.ts +93 -0
  80. package/extensions/plan/review.ts +95 -95
  81. package/extensions/plan/runtime.ts +4 -2
  82. package/extensions/plan/split.ts +87 -0
  83. package/extensions/plan/steps.ts +123 -107
  84. package/extensions/plan/tools/cancel.ts +79 -0
  85. package/extensions/plan/tools/enter.ts +17 -12
  86. package/extensions/plan/tools/exit.ts +148 -59
  87. package/extensions/plan/tools/steps.ts +7 -19
  88. package/extensions/plan/tools/write.ts +29 -31
  89. package/extensions/plan/tools.ts +6 -3
  90. package/extensions/plan/tui.ts +60 -15
  91. package/extensions/plan/types.ts +45 -3
  92. package/extensions/plan/web-chrome.ts +102 -0
  93. package/extensions/plan/web-client.ts +177 -446
  94. package/extensions/plan/web-collab.ts +207 -0
  95. package/extensions/plan/web-comments.ts +269 -0
  96. package/extensions/plan/web-markdown.ts +222 -0
  97. package/extensions/plan/web-page.ts +131 -19
  98. package/extensions/plan/web-router.ts +148 -32
  99. package/extensions/plan/web-share-session.ts +197 -0
  100. package/extensions/plan/web-share.ts +169 -0
  101. package/extensions/plan/web-streams.ts +124 -0
  102. package/extensions/plan/web-tokens.ts +63 -0
  103. package/extensions/plan/web.ts +193 -45
  104. package/extensions/question/README.md +3 -0
  105. package/extensions/question/dialogs.ts +91 -1
  106. package/extensions/question/tools.ts +2 -1
  107. package/extensions/rewind/checklist.ts +4 -0
  108. package/extensions/rewind/review-tui.ts +3 -1
  109. package/extensions/rewind/rewind-tui.ts +4 -0
  110. package/extensions/session-bus/README.md +247 -0
  111. package/extensions/session-bus/commands.ts +165 -0
  112. package/extensions/session-bus/format.ts +124 -0
  113. package/extensions/session-bus/index.ts +69 -0
  114. package/extensions/session-bus/notice.ts +58 -0
  115. package/extensions/session-bus/protocol.ts +134 -0
  116. package/extensions/session-bus/result.ts +243 -0
  117. package/extensions/session-bus/rows.ts +169 -0
  118. package/extensions/session-bus/runtime.ts +575 -0
  119. package/extensions/session-bus/store.ts +329 -0
  120. package/extensions/session-bus/team.ts +102 -0
  121. package/extensions/session-bus/tools.ts +227 -0
  122. package/extensions/session-bus/tui.ts +394 -0
  123. package/extensions/session-bus/types.ts +98 -0
  124. package/extensions/subagent/README.md +26 -13
  125. package/extensions/subagent/format.ts +72 -25
  126. package/extensions/subagent/index.ts +21 -47
  127. package/extensions/subagent/orchestrate.ts +18 -41
  128. package/extensions/subagent/render.ts +29 -42
  129. package/extensions/subagent/stream.ts +24 -18
  130. package/extensions/subagent/types.ts +7 -0
  131. package/extensions/todo/tools.ts +5 -6
  132. package/extensions/todo/tui.ts +5 -1
  133. package/extensions/watch/README.md +9 -5
  134. package/extensions/watch/index.ts +25 -44
  135. package/extensions/watch/tools.ts +31 -59
  136. package/extensions/wechat/README.md +45 -36
  137. package/extensions/wechat/bridge.ts +46 -48
  138. package/extensions/wechat/client.ts +1 -4
  139. package/extensions/wechat/commands.ts +3 -3
  140. package/extensions/wechat/deliver.ts +57 -37
  141. package/extensions/wechat/interaction.ts +54 -18
  142. package/extensions/wechat/login-screen.ts +2 -3
  143. package/extensions/wechat/notices.ts +9 -7
  144. package/extensions/wechat/peer-worker.ts +19 -34
  145. package/extensions/wechat/presence.ts +3 -4
  146. package/extensions/wechat/prompt.ts +53 -23
  147. package/extensions/wechat/reply-pipeline.ts +12 -4
  148. package/extensions/wechat/slash.ts +14 -0
  149. package/extensions/wechat/status-screen.ts +2 -2
  150. package/extensions/wechat/tools.ts +3 -11
  151. package/extensions/worktree/README.md +48 -12
  152. package/extensions/worktree/commands.ts +109 -65
  153. package/extensions/worktree/enter.ts +1 -1
  154. package/extensions/worktree/exit.ts +11 -1
  155. package/extensions/worktree/git.ts +5 -0
  156. package/extensions/worktree/lifecycle.ts +9 -1
  157. package/extensions/worktree/registry.ts +11 -5
  158. package/extensions/worktree/screen.ts +263 -0
  159. package/extensions/worktree/status.ts +84 -40
  160. package/lib/README.md +12 -7
  161. package/lib/claims/overlap.ts +43 -0
  162. package/lib/config.ts +12 -0
  163. package/lib/format.ts +6 -2
  164. package/lib/http/router.ts +40 -13
  165. package/lib/http/server.ts +27 -13
  166. package/lib/interaction.ts +28 -1
  167. package/lib/notice.ts +29 -2
  168. package/lib/plan-entry.ts +7 -2
  169. package/lib/plans/sections.ts +172 -0
  170. package/lib/plans/setting.ts +52 -0
  171. package/lib/plans/split.ts +215 -0
  172. package/lib/plans/store.ts +19 -0
  173. package/lib/plans/team.ts +151 -0
  174. package/lib/qr.ts +64 -0
  175. package/lib/repo-key.ts +74 -0
  176. package/lib/report.ts +117 -25
  177. package/lib/requirements.ts +1 -2
  178. package/lib/tool-result.ts +54 -4
  179. package/lib/tui/README.md +30 -8
  180. package/lib/tui/chrome.ts +27 -6
  181. package/lib/tui/dock-screen.ts +91 -19
  182. package/lib/tui/gauge.ts +9 -5
  183. package/lib/tui/line-pane.ts +15 -4
  184. package/lib/tui/tool.ts +23 -4
  185. package/lib/usage.ts +26 -0
  186. package/lib/web/README.md +131 -0
  187. package/lib/web/base.ts +19 -2
  188. package/lib/web/components.ts +10 -6
  189. package/lib/web/layout.ts +2 -0
  190. package/lib/web/markup.ts +2 -1
  191. package/lib/web/runtime.ts +103 -25
  192. package/lib/web/tokens.ts +23 -7
  193. package/package.json +5 -2
  194. package/skills/changelog/SKILL.md +57 -45
  195. package/skills/init/SKILL.md +80 -45
  196. package/skills/init/references/agents-md-quality.md +26 -2
  197. package/skills/init/references/interview-questions.md +36 -14
  198. package/skills/next/SKILL.md +209 -0
  199. package/skills/parallel-dev/SKILL.md +150 -0
  200. package/extensions/wechat/qrcode.ts +0 -46
@@ -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
- content: [
82
- {
83
- type: "text" as const,
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
- content: [{ type: "text" as const, text: formatJobList(jobs, Date.now(), runtime.sessionId) }],
95
- details: { action: "list", jobs, sessionId: runtime.sessionId } satisfies JobDetails,
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
- content: [{ type: "text" as const, text: formatJobStatus(job, Date.now(), runtime.sessionId) }],
104
- details: { action: "status", job: toRecord(job), sessionId: runtime.sessionId } satisfies JobDetails,
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
- content: [{ type: "text" as const, text: result.text }],
113
- details: {
114
- action: "logs",
115
- job: toRecord(result.job),
116
- logs: result.lines.join("\n"),
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
- content: [{ type: "text" as const, text }],
137
- details: {
138
- action: "send",
139
- job: toRecord(job),
140
- sent: result.sent,
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
- content: [
154
- {
155
- type: "text" as const,
156
- text: wasRunning
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
- content: [{ type: "text" as const, text: `Waiting on ${call.id}…` }],
174
- details: { action: "wait", job: runtime.get(call.id) } satisfies JobDetails,
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
- content: [
186
- {
187
- type: "text" as const,
188
- text: `${formatCompletion(job)}${note}${job.lastLine ? `\nlast: ${job.lastLine}` : ""}`,
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
- content: [
205
- {
206
- type: "text" as const,
207
- text:
208
- result.cleared === 0
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. They are **not** self-ignored like
173
- `.pi/plans`, so committing or sharing them is the user's choice; review
174
- project memory before trusting a repository.
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
- return {
53
- content: [{ type: "text" as const, text: formatResultText(full) }],
54
- details: full,
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 {
@@ -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, blank. */
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,