pi-crew 0.1.46 → 0.1.49

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 (253) hide show
  1. package/CHANGELOG.md +97 -0
  2. package/agents/analyst.md +11 -11
  3. package/agents/critic.md +11 -11
  4. package/agents/executor.md +11 -11
  5. package/agents/explorer.md +11 -11
  6. package/agents/planner.md +11 -11
  7. package/agents/reviewer.md +11 -11
  8. package/agents/security-reviewer.md +11 -11
  9. package/agents/test-engineer.md +11 -11
  10. package/agents/verifier.md +11 -11
  11. package/agents/writer.md +11 -11
  12. package/docs/next-upgrade-roadmap.md +117 -42
  13. package/docs/refactor-tasks-phase3.md +394 -394
  14. package/docs/refactor-tasks-phase4.md +564 -564
  15. package/docs/refactor-tasks-phase5.md +402 -402
  16. package/docs/refactor-tasks-phase6.md +662 -662
  17. package/docs/research/AGENT-EXECUTION-ARCHITECTURE.md +261 -0
  18. package/docs/research/AGENT-LIFECYCLE-COMPARISON.md +111 -0
  19. package/docs/research/AUDIT_OH_MY_PI.md +261 -0
  20. package/docs/research/AUDIT_PI_CREW.md +457 -0
  21. package/docs/research/CAVEMAN-DEEP-RESEARCH.md +281 -0
  22. package/docs/research/COMPARISON_OH_MY_PI_VS_PI_CREW.md +264 -0
  23. package/docs/research/DEEP-RESEARCH-PI-POWERBAR.md +343 -0
  24. package/docs/research/DEEP_RESEARCH_SUBAGENT_ARCHITECTURE.md +480 -0
  25. package/docs/research/GAP_CLOSURE_IMPLEMENTATION_PLAN.md +354 -0
  26. package/docs/research/IMPLEMENTATION_PLAN.md +385 -0
  27. package/docs/research/LIVE-SESSION-PRODUCTION-READY-PLAN.md +502 -0
  28. package/docs/research/OH-MY-PI-DEEP-RESEARCH-v14.7.6.md +266 -0
  29. package/docs/research/REMAINING-GAPS-PLAN.md +363 -0
  30. package/docs/research/SESSION-SUMMARY-2026-05-08.md +146 -0
  31. package/docs/research/UI-RESPONSIVENESS-AUDIT.md +173 -0
  32. package/docs/research-awesome-agent-skills-distillation.md +100 -100
  33. package/docs/research-extension-examples.md +297 -297
  34. package/docs/research-extension-system.md +324 -324
  35. package/docs/research-oh-my-pi-distillation.md +56 -9
  36. package/docs/research-optimization-plan.md +548 -548
  37. package/docs/research-phase10-distillation.md +198 -198
  38. package/docs/research-phase11-distillation.md +201 -201
  39. package/docs/research-pi-coding-agent.md +357 -357
  40. package/docs/research-source-pi-crew-reference.md +174 -174
  41. package/docs/runtime-flow.md +148 -148
  42. package/docs/source-runtime-refactor-map.md +107 -107
  43. package/index.ts +6 -6
  44. package/package.json +99 -98
  45. package/schema.json +8 -0
  46. package/skills/async-worker-recovery/SKILL.md +42 -42
  47. package/skills/context-artifact-hygiene/SKILL.md +52 -52
  48. package/skills/delegation-patterns/SKILL.md +54 -54
  49. package/skills/mailbox-interactive/SKILL.md +40 -40
  50. package/skills/model-routing-context/SKILL.md +39 -39
  51. package/skills/multi-perspective-review/SKILL.md +58 -58
  52. package/skills/observability-reliability/SKILL.md +41 -41
  53. package/skills/orchestration/SKILL.md +157 -0
  54. package/skills/ownership-session-security/SKILL.md +41 -41
  55. package/skills/pi-extension-lifecycle/SKILL.md +39 -39
  56. package/skills/requirements-to-task-packet/SKILL.md +63 -63
  57. package/skills/resource-discovery-config/SKILL.md +41 -41
  58. package/skills/runtime-state-reader/SKILL.md +44 -44
  59. package/skills/secure-agent-orchestration-review/SKILL.md +45 -45
  60. package/skills/state-mutation-locking/SKILL.md +42 -42
  61. package/skills/systematic-debugging/SKILL.md +67 -67
  62. package/skills/ui-render-performance/SKILL.md +39 -39
  63. package/skills/verification-before-done/SKILL.md +57 -57
  64. package/skills/worktree-isolation/SKILL.md +39 -39
  65. package/src/agents/agent-config.ts +6 -0
  66. package/src/agents/agent-search.ts +98 -0
  67. package/src/agents/agent-serializer.ts +4 -0
  68. package/src/agents/discover-agents.ts +17 -4
  69. package/src/config/config.ts +24 -0
  70. package/src/config/defaults.ts +11 -0
  71. package/src/extension/autonomous-policy.ts +26 -33
  72. package/src/extension/cross-extension-rpc.ts +82 -82
  73. package/src/extension/help.ts +1 -0
  74. package/src/extension/management.ts +5 -0
  75. package/src/extension/register.ts +58 -13
  76. package/src/extension/registration/commands.ts +33 -1
  77. package/src/extension/registration/compaction-guard.ts +125 -125
  78. package/src/extension/registration/team-tool.ts +6 -4
  79. package/src/extension/run-bundle-schema.ts +89 -89
  80. package/src/extension/run-index.ts +24 -18
  81. package/src/extension/run-maintenance.ts +68 -62
  82. package/src/extension/team-tool/api.ts +23 -2
  83. package/src/extension/team-tool/cancel.ts +86 -11
  84. package/src/extension/team-tool/context.ts +3 -0
  85. package/src/extension/team-tool/handle-settings.ts +188 -188
  86. package/src/extension/team-tool/inspect.ts +41 -41
  87. package/src/extension/team-tool/intent-policy.ts +42 -0
  88. package/src/extension/team-tool/lifecycle-actions.ts +47 -18
  89. package/src/extension/team-tool/parallel-dispatch.ts +156 -0
  90. package/src/extension/team-tool/plan.ts +19 -19
  91. package/src/extension/team-tool/respond.ts +10 -2
  92. package/src/extension/team-tool/run.ts +3 -2
  93. package/src/extension/team-tool/status.ts +1 -1
  94. package/src/extension/team-tool-types.ts +1 -0
  95. package/src/extension/team-tool.ts +13 -3
  96. package/src/hooks/registry.ts +61 -0
  97. package/src/hooks/types.ts +41 -0
  98. package/src/i18n.ts +184 -184
  99. package/src/observability/exporters/otlp-exporter.ts +77 -77
  100. package/src/prompt/prompt-runtime.ts +72 -72
  101. package/src/runtime/agent-control.ts +108 -2
  102. package/src/runtime/agent-memory.ts +72 -72
  103. package/src/runtime/agent-observability.ts +114 -114
  104. package/src/runtime/async-marker.ts +26 -26
  105. package/src/runtime/async-runner.ts +3 -1
  106. package/src/runtime/attention-events.ts +28 -28
  107. package/src/runtime/background-runner.ts +19 -0
  108. package/src/runtime/cancellation-token.ts +89 -0
  109. package/src/runtime/cancellation.ts +61 -51
  110. package/src/runtime/capability-inventory.ts +116 -0
  111. package/src/runtime/child-pi.ts +2 -1
  112. package/src/runtime/code-summary.ts +247 -0
  113. package/src/runtime/completion-guard.ts +190 -190
  114. package/src/runtime/crash-recovery.ts +181 -0
  115. package/src/runtime/crew-agent-records.ts +35 -7
  116. package/src/runtime/crew-agent-runtime.ts +1 -0
  117. package/src/runtime/custom-tools/irc-tool.ts +201 -0
  118. package/src/runtime/custom-tools/submit-result-tool.ts +90 -0
  119. package/src/runtime/delivery-coordinator.ts +3 -1
  120. package/src/runtime/direct-run.ts +35 -35
  121. package/src/runtime/effectiveness.ts +81 -76
  122. package/src/runtime/event-stream-bridge.ts +90 -0
  123. package/src/runtime/foreground-control.ts +82 -82
  124. package/src/runtime/green-contract.ts +46 -46
  125. package/src/runtime/group-join.ts +106 -106
  126. package/src/runtime/heartbeat-gradient.ts +28 -28
  127. package/src/runtime/heartbeat-watcher.ts +124 -124
  128. package/src/runtime/live-agent-control.ts +88 -88
  129. package/src/runtime/live-agent-manager.ts +78 -2
  130. package/src/runtime/live-control-realtime.ts +36 -36
  131. package/src/runtime/live-extension-bridge.ts +150 -0
  132. package/src/runtime/live-irc.ts +92 -0
  133. package/src/runtime/live-session-health.ts +100 -0
  134. package/src/runtime/live-session-runtime.ts +297 -7
  135. package/src/runtime/mcp-proxy.ts +113 -0
  136. package/src/runtime/notebook-helpers.ts +90 -0
  137. package/src/runtime/orphan-sentinel.ts +7 -0
  138. package/src/runtime/output-validator.ts +187 -0
  139. package/src/runtime/parallel-research.ts +44 -44
  140. package/src/runtime/parallel-utils.ts +57 -0
  141. package/src/runtime/parent-guard.ts +80 -0
  142. package/src/runtime/pi-json-output.ts +111 -111
  143. package/src/runtime/policy-engine.ts +79 -79
  144. package/src/runtime/progress-event-coalescer.ts +43 -43
  145. package/src/runtime/prose-compressor.ts +164 -0
  146. package/src/runtime/recovery-recipes.ts +74 -74
  147. package/src/runtime/result-extractor.ts +121 -0
  148. package/src/runtime/role-permission.ts +39 -39
  149. package/src/runtime/runtime-resolver.ts +1 -4
  150. package/src/runtime/semaphore.ts +131 -0
  151. package/src/runtime/sensitive-paths.ts +92 -0
  152. package/src/runtime/session-resources.ts +25 -25
  153. package/src/runtime/session-snapshot.ts +59 -59
  154. package/src/runtime/session-usage.ts +79 -79
  155. package/src/runtime/sidechain-output.ts +29 -29
  156. package/src/runtime/stream-preview.ts +177 -0
  157. package/src/runtime/subagent-manager.ts +3 -2
  158. package/src/runtime/subprocess-tool-registry.ts +67 -0
  159. package/src/runtime/supervisor-contact.ts +59 -59
  160. package/src/runtime/task-display.ts +38 -38
  161. package/src/runtime/task-output-context.ts +59 -9
  162. package/src/runtime/task-runner/capabilities.ts +78 -78
  163. package/src/runtime/task-runner/live-executor.ts +2 -0
  164. package/src/runtime/task-runner/progress.ts +119 -119
  165. package/src/runtime/task-runner/prompt-builder.ts +70 -8
  166. package/src/runtime/task-runner/prompt-pipeline.ts +64 -64
  167. package/src/runtime/task-runner/result-utils.ts +14 -14
  168. package/src/runtime/task-runner/run-projection.ts +104 -0
  169. package/src/runtime/task-runner/state-helpers.ts +22 -22
  170. package/src/runtime/task-runner.ts +75 -4
  171. package/src/runtime/team-runner.ts +60 -8
  172. package/src/runtime/worker-heartbeat.ts +21 -21
  173. package/src/runtime/worker-startup.ts +57 -57
  174. package/src/runtime/workspace-tree.ts +298 -0
  175. package/src/runtime/yield-handler.ts +189 -0
  176. package/src/schema/config-schema.ts +6 -0
  177. package/src/schema/team-tool-schema.ts +11 -1
  178. package/src/skills/discover-skills.ts +67 -0
  179. package/src/state/active-run-registry.ts +4 -2
  180. package/src/state/artifact-store.ts +4 -1
  181. package/src/state/atomic-write.ts +50 -1
  182. package/src/state/blob-store.ts +117 -0
  183. package/src/state/contracts.ts +1 -0
  184. package/src/state/event-log-rotation.ts +158 -0
  185. package/src/state/event-log.ts +52 -2
  186. package/src/state/mailbox.ts +87 -7
  187. package/src/state/state-store.ts +24 -4
  188. package/src/state/task-claims.ts +44 -44
  189. package/src/state/types.ts +20 -0
  190. package/src/state/usage.ts +29 -29
  191. package/src/subagents/async-entry.ts +1 -1
  192. package/src/subagents/index.ts +3 -3
  193. package/src/subagents/live/control.ts +1 -1
  194. package/src/subagents/live/manager.ts +1 -1
  195. package/src/subagents/live/realtime.ts +1 -1
  196. package/src/subagents/live/session-runtime.ts +1 -1
  197. package/src/subagents/manager.ts +1 -1
  198. package/src/subagents/spawn.ts +1 -1
  199. package/src/teams/team-serializer.ts +38 -38
  200. package/src/types/diff.d.ts +18 -18
  201. package/src/ui/agent-management-overlay.ts +144 -0
  202. package/src/ui/crew-footer.ts +101 -101
  203. package/src/ui/crew-select-list.ts +111 -111
  204. package/src/ui/crew-widget.ts +11 -2
  205. package/src/ui/dashboard-panes/cancellation-pane.ts +43 -0
  206. package/src/ui/dashboard-panes/capability-pane.ts +60 -0
  207. package/src/ui/dashboard-panes/mailbox-pane.ts +35 -11
  208. package/src/ui/dashboard-panes/metrics-pane.ts +34 -34
  209. package/src/ui/dynamic-border.ts +25 -25
  210. package/src/ui/layout-primitives.ts +106 -106
  211. package/src/ui/live-run-sidebar.ts +4 -0
  212. package/src/ui/loaders.ts +158 -158
  213. package/src/ui/powerbar-publisher.ts +77 -15
  214. package/src/ui/render-coalescer.ts +51 -0
  215. package/src/ui/render-diff.ts +119 -119
  216. package/src/ui/render-scheduler.ts +143 -143
  217. package/src/ui/run-dashboard.ts +4 -0
  218. package/src/ui/run-event-bus.ts +209 -0
  219. package/src/ui/run-snapshot-cache.ts +68 -16
  220. package/src/ui/snapshot-types.ts +8 -0
  221. package/src/ui/spinner.ts +17 -17
  222. package/src/ui/status-colors.ts +58 -58
  223. package/src/ui/syntax-highlight.ts +116 -116
  224. package/src/ui/transcript-entries.ts +258 -0
  225. package/src/utils/atomic-write.ts +33 -33
  226. package/src/utils/completion-dedupe.ts +63 -63
  227. package/src/utils/frontmatter.ts +68 -68
  228. package/src/utils/git.ts +262 -262
  229. package/src/utils/ids.ts +17 -12
  230. package/src/utils/incremental-reader.ts +104 -0
  231. package/src/utils/names.ts +27 -27
  232. package/src/utils/redaction.ts +44 -44
  233. package/src/utils/safe-paths.ts +47 -47
  234. package/src/utils/scan-cache.ts +137 -0
  235. package/src/utils/sleep.ts +32 -32
  236. package/src/utils/sse-parser.ts +134 -0
  237. package/src/utils/task-name-generator.ts +337 -0
  238. package/src/utils/visual.ts +33 -2
  239. package/src/workflows/validate-workflow.ts +40 -40
  240. package/src/worktree/branch-freshness.ts +45 -45
  241. package/src/worktree/cleanup.ts +2 -1
  242. package/teams/default.team.md +12 -12
  243. package/teams/fast-fix.team.md +11 -11
  244. package/teams/implementation.team.md +18 -18
  245. package/teams/parallel-research.team.md +14 -14
  246. package/teams/research.team.md +11 -11
  247. package/teams/review.team.md +12 -12
  248. package/workflows/default.workflow.md +29 -29
  249. package/workflows/fast-fix.workflow.md +22 -22
  250. package/workflows/implementation.workflow.md +38 -38
  251. package/workflows/parallel-research.workflow.md +46 -46
  252. package/workflows/research.workflow.md +22 -22
  253. package/workflows/review.workflow.md +30 -30
@@ -0,0 +1,354 @@
1
+ # 📋 Implementation Plan: Thu hẹp Gap với oh-my-pi
2
+
3
+ > Dựa trên `COMPARISON_OH_MY_PI_VS_PI_CREW.md`
4
+ > Mục tiêu: Giảm UI flicker, tăng real-time responsiveness, structured output, inter-worker communication
5
+
6
+ ---
7
+
8
+ ## Phased Approach
9
+
10
+ ```
11
+ Phase 1 (2 tasks) ─── Real-time Event Bridge ──────────── HIGH impact
12
+ Phase 2 (2 tasks) ─── Structured Output & Yield ────────── MEDIUM impact
13
+ Phase 3 (2 tasks) ─── Inter-Worker Communication ───────── MEDIUM impact
14
+ Phase 4 (2 tasks) ─── Agent Config UI & Polish ─────────── LOW impact
15
+ ```
16
+
17
+ ---
18
+
19
+ ## Phase 1: Real-time Event Bridge
20
+
21
+ > **Problem**: UI đọc từ files (manifest, tasks.json) mỗi 500-1000ms → flicker, chậm
22
+ > **Solution**: Bridge child Pi JSON events trực tiếp đến UI qua RunEventBus
23
+
24
+ ### Task 1.1: Event Stream Bridge
25
+
26
+ **File mới**: `src/runtime/event-stream-bridge.ts`
27
+
28
+ **Ý tưởng**: Kết nối `onJsonEvent` callback trong `task-runner.ts` trực tiếp đến `runEventBus` (đã tồn tại), thay vì chỉ ghi file rồi poll.
29
+
30
+ ```
31
+ Current flow (chậm):
32
+ child Pi → stdout JSON → onJsonEvent → appendCrewAgentEvent (file)
33
+
34
+ UI poll (500ms) → read files → render
35
+
36
+ New flow (nhanh):
37
+ child Pi → stdout JSON → onJsonEvent → appendCrewAgentEvent (file)
38
+ └→ runEventBus.emit() → UI callback → render
39
+ ```
40
+
41
+ **Implementation**:
42
+ ```typescript
43
+ // event-stream-bridge.ts
44
+ import { runEventBus, type RunEventPayload } from "../ui/run-event-bus.ts";
45
+
46
+ export interface StreamBridgeEvent {
47
+ runId: string;
48
+ taskId: string;
49
+ eventType: string;
50
+ toolName?: string;
51
+ toolArgs?: string;
52
+ intent?: string;
53
+ tokens?: number;
54
+ timestamp: number;
55
+ }
56
+
57
+ const bridge = new Map<string, (event: StreamBridgeEvent) => void>();
58
+
59
+ export function registerStreamBridge(runId: string): (event: StreamBridgeEvent) => void {
60
+ const handler = (event: StreamBridgeEvent) => {
61
+ runEventBus.emit({
62
+ type: "worker_status",
63
+ runId: event.runId,
64
+ taskId: event.taskId,
65
+ data: event,
66
+ });
67
+ };
68
+ bridge.set(runId, handler);
69
+ return handler;
70
+ }
71
+
72
+ export function unregisterStreamBridge(runId: string): void {
73
+ bridge.delete(runId);
74
+ }
75
+ ```
76
+
77
+ **Thay đổi trong `task-runner.ts`**:
78
+ - Import `registerStreamBridge` / `unregisterStreamBridge`
79
+ - Trong `onJsonEvent` callback: gọi thêm bridge handler
80
+ - Trong task cleanup: unregister bridge
81
+
82
+ **Thay đổi trong `run-snapshot-cache.ts`**:
83
+ - Subscribe `runEventBus.on(runId, ...)` cho active run
84
+ - On event: invalidate cache cho task đó (thay vì TTL-based refresh)
85
+ - Giảm TTL từ 500ms → 200ms cho polled data, nhưng event-driven cho real-time
86
+
87
+ **Risk**: LOW — chỉ thêm event emission, không thay đổi flow hiện tại
88
+
89
+ ---
90
+
91
+ ### Task 1.2: Render Coalescing & Debounce
92
+
93
+ **File mới**: `src/ui/render-coalescer.ts`
94
+
95
+ **Ý tưởng**: Gom nhiều render requests thành 1 render duy nhất trong 1 frame (16ms). Tránh render nhiều lần khi nhiều events đến cùng lúc.
96
+
97
+ ```typescript
98
+ // render-coalescer.ts
99
+ export class RenderCoalescer {
100
+ #pending = false;
101
+ #rafId: ReturnType<typeof setTimeout> | null = null;
102
+ #callback: () => void;
103
+ #intervalMs: number;
104
+
105
+ constructor(callback: () => void, intervalMs = 32) { // ~30fps
106
+ this.#callback = callback;
107
+ this.#intervalMs = intervalMs;
108
+ }
109
+
110
+ request(): void {
111
+ if (this.#pending) return;
112
+ this.#pending = true;
113
+ this.#rafId = setTimeout(() => {
114
+ this.#pending = false;
115
+ this.#rafId = null;
116
+ this.#callback();
117
+ }, this.#intervalMs);
118
+ }
119
+
120
+ flush(): void {
121
+ if (this.#rafId) clearTimeout(this.#rafId);
122
+ this.#pending = false;
123
+ this.#rafId = null;
124
+ this.#callback();
125
+ }
126
+
127
+ dispose(): void {
128
+ if (this.#rafId) clearTimeout(this.#rafId);
129
+ this.#pending = false;
130
+ }
131
+ }
132
+ ```
133
+
134
+ **Thay đổi trong `run-dashboard.ts`**:
135
+ - Wrap `invalidate()` calls trong `RenderCoalescer`
136
+ - Khi event đến → `coalescer.request()` thay vì `invalidate()` trực tiếp
137
+ - Khi user input → `coalescer.flush()` (responsive input)
138
+
139
+ **Thay đổi trong `powerbar-publisher.ts`**:
140
+ - Wrap `safeEmit()` trong coalescer
141
+ - Giảm powerbar update frequency xuống ~200ms
142
+
143
+ **Risk**: LOW — chỉ thêm debounce layer
144
+
145
+ ---
146
+
147
+ ## Phase 2: Structured Output & Yield
148
+
149
+ ### Task 2.1: Output Schema in Task Packets
150
+
151
+ **File sửa**: `src/runtime/task-packet.ts`
152
+
153
+ **Ý tưởng**: Thêm optional `outputSchema` field vào task packet, worker prompt hướng dẫn subagent output theo schema.
154
+
155
+ ```typescript
156
+ // task-packet.ts — thêm field
157
+ export interface TaskPacket {
158
+ // ... existing fields
159
+ outputSchema?: {
160
+ type: "json" | "markdown" | "text";
161
+ schema?: unknown; // JTD/JSON Schema for JSON output
162
+ description?: string; // human-readable expected output
163
+ };
164
+ }
165
+ ```
166
+
167
+ **Thay đổi trong `prompt-builder.ts`**:
168
+ - Nếu `taskPacket.outputSchema` được set → thêm output format instruction vào prompt
169
+ - Pattern từ oh-my-pi: "Your result MUST match this TypeScript interface: ..."
170
+
171
+ **Risk**: LOW — additive, không ảnh hưởng existing tasks
172
+
173
+ ---
174
+
175
+ ### Task 2.2: Structured Result Extraction
176
+
177
+ **File mới**: `src/runtime/result-extractor.ts`
178
+
179
+ **Ý tưởng**: Parse worker output cố gắng extract structured JSON trước khi fallback sang raw text.
180
+
181
+ ```typescript
182
+ // result-extractor.ts
183
+ export interface ExtractedResult {
184
+ structured: boolean;
185
+ data: unknown;
186
+ rawText: string;
187
+ error?: string;
188
+ }
189
+
190
+ export function extractStructuredResult(raw: string, schema?: unknown): ExtractedResult {
191
+ // 1. Try JSON parse
192
+ // 2. Try extract from ```json``` fence
193
+ // 3. Try extract from ADAPTIVE_PLAN_JSON markers (existing)
194
+ // 4. Fallback to raw text
195
+ }
196
+ ```
197
+
198
+ **Thay đổi trong `task-runner.ts`**:
199
+ - Sau khi có `parsedOutput.finalText` → chạy qua `extractStructuredResult`
200
+ - Lưu structured result vào artifact riêng (metadata/{taskId}.result.json)
201
+
202
+ **Risk**: LOW — chỉ thêm extraction layer, không thay đổi existing flow
203
+
204
+ ---
205
+
206
+ ## Phase 3: Inter-Worker Communication
207
+
208
+ ### Task 3.1: Mailbox Reply Support
209
+
210
+ **File sửa**: `src/state/mailbox.ts`
211
+
212
+ **Ý tưởng**: Mailbox hiện tại là fire-and-forget. Thêm `replyTo` field cho phép worker trả lời message.
213
+
214
+ ```typescript
215
+ // mailbox.ts — thêm fields
216
+ export interface MailboxMessage {
217
+ // ... existing fields
218
+ replyTo?: string; // ID của message gốc (nếu là reply)
219
+ replyFrom?: string; // Task ID gửi reply
220
+ replyDeadline?: number; // Ms deadline cho reply
221
+ }
222
+
223
+ export interface MailboxMessageStatus {
224
+ // ... existing fields
225
+ repliedAt?: string; // Khi reply được nhận
226
+ replyContent?: string; // Nội dung reply
227
+ }
228
+ ```
229
+
230
+ **Thay đổi trong prompt-builder.ts**:
231
+ - Nếu task có unread mailbox messages với `replyTo` → thêm instruction "Reply to this message using the respond command"
232
+
233
+ **Risk**: MEDIUM — thay đổi mailbox schema, cần migration
234
+
235
+ ---
236
+
237
+ ### Task 3.2: Dependency Context Enhancement
238
+
239
+ **File sửa**: `src/runtime/task-output-context.ts`
240
+
241
+ **Ý tưởng**: Hiện tại chỉ collect output text. Thêm collect structured data (JSON results, artifacts produced).
242
+
243
+ ```typescript
244
+ // task-output-context.ts — thêm
245
+ export interface DependencyContext {
246
+ taskId: string;
247
+ role: string;
248
+ status: string;
249
+ resultSummary: string; // existing text output
250
+ structuredResults?: Map<string, unknown>; // NEW: parsed JSON results
251
+ artifactsProduced?: string[]; // NEW: artifact paths
252
+ usage?: { tokens: number; durationMs: number }; // NEW: usage stats
253
+ }
254
+ ```
255
+
256
+ **Risk**: LOW — additive extension
257
+
258
+ ---
259
+
260
+ ## Phase 4: Agent Config UI & Polish
261
+
262
+ ### Task 4.1: Agent Management Dashboard
263
+
264
+ **File mới**: `src/ui/overlays/agent-management-overlay.ts`
265
+
266
+ **Ý tưởng**: UI overlay cho phép enable/disable agents, xem model resolution, edit model override — tương tự oh-my-pi's `AgentDashboard`.
267
+
268
+ **Features**:
269
+ - List agents from discovery (agents/ dir)
270
+ - Show source (project/user/package), description, model
271
+ - Toggle enable/disable → writes to config
272
+ - Edit model override → inline input
273
+ - Keyboard navigation (j/k, Tab, Enter, Esc)
274
+
275
+ **Risk**: MEDIUM — requires Pi TUI component support, may need pi-mono API
276
+
277
+ ---
278
+
279
+ ### Task 4.2: Transcript Entry Viewer Enhancement
280
+
281
+ **File sửa**: `src/ui/transcript-viewer.ts`
282
+
283
+ **Ý tưởng**: Thêm expand/collapse per entry (như oh-my-pi's SessionObserverOverlay).
284
+
285
+ **Features**:
286
+ - Entry-based navigation (each tool call/message = 1 entry)
287
+ - `Enter` toggle expand/collapse
288
+ - `j/k` move between entries
289
+ - Auto-scroll to bottom unless user scrolled up
290
+ - Breadcrumb for nested subagent transcripts (if available)
291
+
292
+ **Risk**: LOW — extending existing transcript viewer
293
+
294
+ ---
295
+
296
+ ## Dependency Graph
297
+
298
+ ```
299
+ Phase 1:
300
+ 1.1 Event Stream Bridge ─────┐
301
+ 1.2 Render Coalescing ────────┤ (independent, can parallel)
302
+ └→ UI responsiveness improved
303
+ Phase 2:
304
+ 2.1 Output Schema ───────────┐
305
+ 2.2 Result Extractor ─────────┤ (2.1 before 2.2)
306
+ └→ Structured output capability
307
+ Phase 3:
308
+ 3.1 Mailbox Reply ───────────┐
309
+ 3.2 Dependency Context ──────┤ (independent, can parallel)
310
+ └→ Inter-worker communication
311
+ Phase 4:
312
+ 4.1 Agent Dashboard ─────────┐
313
+ 4.2 Transcript Enhancement ──┤ (independent, can parallel)
314
+ └→ Polish & UX
315
+ ```
316
+
317
+ ---
318
+
319
+ ## Effort Estimates
320
+
321
+ | Task | Lines | Files | Tests | Phase |
322
+ |------|-------|-------|-------|-------|
323
+ | 1.1 Event Stream Bridge | ~80 new, ~30 modified | 3 | 5 | 1 |
324
+ | 1.2 Render Coalescing | ~60 new, ~20 modified | 3 | 4 | 1 |
325
+ | 2.1 Output Schema | ~40 modified | 2 | 3 | 2 |
326
+ | 2.2 Result Extractor | ~100 new, ~20 modified | 3 | 8 | 2 |
327
+ | 3.1 Mailbox Reply | ~80 modified | 3 | 6 | 3 |
328
+ | 3.2 Dependency Context | ~50 modified | 2 | 4 | 3 |
329
+ | 4.1 Agent Dashboard | ~300 new | 2 | 8 | 4 |
330
+ | 4.2 Transcript Enhancement | ~120 modified | 1 | 6 | 4 |
331
+ | **Total** | **~850** | **~19** | **~44** | |
332
+
333
+ ---
334
+
335
+ ## Risk Mitigation
336
+
337
+ | Risk | Probability | Impact | Mitigation |
338
+ |------|-------------|--------|------------|
339
+ | Event bridge causes memory leak | Low | Medium | Unregister on task complete, WeakRef for handlers |
340
+ | Render coalescer misses last event | Low | Low | `flush()` on task complete + user input |
341
+ | Output schema breaks existing tasks | Low | Medium | Optional — only enforce when schema is set |
342
+ | Mailbox reply schema migration | Medium | Low | Additive fields only, no breaking change |
343
+ | Agent dashboard needs pi-mono API | Medium | Medium | Fallback to file-based config if API unavailable |
344
+ | Child Pi event format changes | Low | High | Defensive parsing with fallback |
345
+
346
+ ---
347
+
348
+ ## Testing Strategy
349
+
350
+ - **Phase 1**: Unit test bridge registration/emission, coalescer debounce timing
351
+ - **Phase 2**: Unit test result extraction with various output formats
352
+ - **Phase 3**: Unit test mailbox reply flow, integration test with real workers
353
+ - **Phase 4**: Manual UI testing + screenshot comparison
354
+ - **All phases**: `npm test` (868 tests baseline) must stay green