@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
@@ -0,0 +1,169 @@
1
+ /**
2
+ * The bus row grammar: the one place a session, a held path, or a message is
3
+ * turned into a line, shared by the `/sessions` board and the `session` tool
4
+ * block's expanded result.
5
+ *
6
+ * Every field came from another session's record, message, or claim, so it is
7
+ * sanitized here, at the boundary that reaches the terminal, and every row is
8
+ * clipped to the width it is given by `listRow`/`statusRow`.
9
+ */
10
+
11
+ import type { Theme } from "@earendil-works/pi-coding-agent";
12
+ import { formatDuration, sanitizeLine } from "../../lib/format.ts";
13
+ import { GLYPHS, SEPARATORS } from "../../lib/tui/glyphs.ts";
14
+ import { listRow, statusRow } from "../../lib/tui/rows.ts";
15
+ import type { TailRowLine } from "../../lib/tui/tool.ts";
16
+ import { paint } from "../../lib/tui/tokens.ts";
17
+ import { shortId } from "./format.ts";
18
+ import type { BusMessage, ClaimRecord, SessionRecord, SessionStatus } from "./types.ts";
19
+
20
+ /** Claim paths the focus block lists before it points at the pane. */
21
+ const BLOCK_CLAIMS = 2;
22
+
23
+ /** `1 claim`, `2 claims`. */
24
+ export function count(n: number, noun: string): string {
25
+ return `${n} ${noun}${n === 1 ? "" : "s"}`;
26
+ }
27
+
28
+ /** One session on the board, with the claims it holds. */
29
+ export interface SessionRow {
30
+ session: SessionRecord & { unread: number };
31
+ /** Whether this row is the session reading the board. */
32
+ self: boolean;
33
+ claims: ClaimRecord[];
34
+ }
35
+
36
+ /** A row of the transcript's expanded result: one entity per action. */
37
+ export type BusRow =
38
+ | { kind: "session"; row: SessionRow }
39
+ | { kind: "claim"; claim: Pick<ClaimRecord, "path" | "ownerLabel"> }
40
+ | { kind: "message"; message: BusMessage }
41
+ | { kind: "result"; label: string; tone: "ok" | "warn" };
42
+
43
+ /** Label order by code unit, so a live re-sort is deterministic. */
44
+ function byLabel(a: { label: string }, b: { label: string }): number {
45
+ return a.label < b.label ? -1 : a.label > b.label ? 1 : 0;
46
+ }
47
+
48
+ /**
49
+ * The board's rows: this session first, then peers by label, each with its own
50
+ * claims. A status without sessions (a failed read) is an empty board.
51
+ */
52
+ export function sessionRows(status: SessionStatus | undefined): SessionRow[] {
53
+ if (!status) return [];
54
+ const rows = status.sessions.map((session) => ({
55
+ session,
56
+ self: session.id === status.me.id,
57
+ claims: status.claims
58
+ .filter((claim) => claim.owner === session.id)
59
+ .sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0)),
60
+ }));
61
+ return rows.sort((a, b) => (a.self === b.self ? byLabel(a.session, b.session) : a.self ? -1 : 1));
62
+ }
63
+
64
+ /** One session row: the label, a `you` tag on this session, and its counts. */
65
+ export function sessionRowLine(
66
+ row: SessionRow,
67
+ theme: Theme,
68
+ width: number,
69
+ options: { selected?: boolean; marker?: boolean } = {},
70
+ ): string {
71
+ const label = `${sanitizeLine(row.session.label)}${row.self ? " · you" : ""}`;
72
+ const counts = [`${row.session.unread} unread`];
73
+ if (row.claims.length > 0) counts.push(count(row.claims.length, "claim"));
74
+ return listRow(theme, width, {
75
+ selected: options.selected === true,
76
+ marker: options.marker !== false,
77
+ label,
78
+ labelRole: options.selected === true ? "accent" : "label",
79
+ trailing: counts.join(SEPARATORS.item),
80
+ });
81
+ }
82
+
83
+ /** One held path: the claim glyph, the path, and the session holding it. */
84
+ export function claimRowLine(
85
+ claim: Pick<ClaimRecord, "path" | "ownerLabel">,
86
+ theme: Theme,
87
+ width: number,
88
+ options: { selected?: boolean; marker?: boolean; self?: boolean } = {},
89
+ ): string {
90
+ const owner = `${sanitizeLine(claim.ownerLabel)}${options.self === true ? " · you" : ""}`;
91
+ return statusRow(theme, width, {
92
+ selected: options.selected === true,
93
+ marker: options.marker !== false,
94
+ glyph: GLYPHS.target,
95
+ glyphRole: "info",
96
+ label: sanitizeLine(claim.path),
97
+ labelRole: options.selected === true ? "accent" : "label",
98
+ trailing: owner,
99
+ });
100
+ }
101
+
102
+ /** One message row: the sender and kind as meta trailing the text. */
103
+ export function messageRowLine(
104
+ message: BusMessage,
105
+ theme: Theme,
106
+ width: number,
107
+ options: { selected?: boolean; marker?: boolean } = {},
108
+ ): string {
109
+ const glyph = message.kind === "event" ? GLYPHS.warn : message.kind === "ask" ? GLYPHS.unknown : GLYPHS.pending;
110
+ return statusRow(theme, width, {
111
+ selected: options.selected === true,
112
+ marker: options.marker !== false,
113
+ glyph,
114
+ glyphRole: message.kind === "event" ? "warn" : "info",
115
+ label: sanitizeLine(message.text),
116
+ labelRole: options.selected === true ? "accent" : "label",
117
+ trailing: `${sanitizeLine(message.fromLabel)}${SEPARATORS.item}${sanitizeLine(message.kind)}`,
118
+ });
119
+ }
120
+
121
+ /** The one row renderer the expanded transcript block uses. */
122
+ export const busRowLine: TailRowLine<BusRow> = (row, width, theme) => {
123
+ switch (row.kind) {
124
+ case "session":
125
+ return sessionRowLine(row.row, theme, width, { marker: false });
126
+ case "claim":
127
+ return claimRowLine(row.claim, theme, width, { marker: false });
128
+ case "message":
129
+ return messageRowLine(row.message, theme, width, { marker: false });
130
+ case "result":
131
+ return statusRow(theme, width, {
132
+ marker: false,
133
+ glyph: row.tone === "ok" ? GLYPHS.check : GLYPHS.cross,
134
+ glyphRole: row.tone,
135
+ label: sanitizeLine(row.label),
136
+ trailing: "",
137
+ });
138
+ }
139
+ };
140
+
141
+ /** The summary cells: the counts a reader scans before the rows. */
142
+ export function summaryCells(
143
+ theme: Theme,
144
+ rows: readonly SessionRow[],
145
+ watching: { armed: boolean; wake: boolean } | undefined,
146
+ ): string[] {
147
+ const unread = rows.reduce((total, row) => total + row.session.unread, 0);
148
+ const claims = rows.reduce((total, row) => total + row.claims.length, 0);
149
+ const cells = [paint(theme, "meta", count(rows.length, "session"))];
150
+ if (unread > 0) cells.push(paint(theme, "label", `${unread} unread`));
151
+ cells.push(paint(theme, "meta", count(claims, "claim")));
152
+ if (watching) cells.push(paint(theme, "ok", watching.wake ? "watch wake" : "watch on"));
153
+ return cells;
154
+ }
155
+
156
+ /** The focus block under the list: what the row does not already say. */
157
+ export function sessionDetailBlock(row: SessionRow, now: number): string[] {
158
+ const lines = [`cwd: ${sanitizeLine(row.session.cwd)}`];
159
+ if (row.claims.length > 0) {
160
+ const shown = row.claims.slice(0, BLOCK_CLAIMS).map((claim) => sanitizeLine(claim.path));
161
+ const hidden = row.claims.length - shown.length;
162
+ lines.push(`claims: ${shown.join(", ")}${hidden > 0 ? ` +${hidden} more` : ""}`);
163
+ }
164
+ lines.push(
165
+ `mode: ${sanitizeLine(row.session.mode)}${SEPARATORS.item}id: ${shortId(row.session.id)}` +
166
+ `${SEPARATORS.item}last seen: ${formatDuration(Math.max(0, now - row.session.lastSeen))} ago`,
167
+ );
168
+ return lines;
169
+ }