pi-crew 0.1.45 → 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.
- package/CHANGELOG.md +97 -0
- package/README.md +5 -5
- package/agents/analyst.md +11 -11
- package/agents/critic.md +11 -11
- package/agents/executor.md +11 -11
- package/agents/explorer.md +11 -11
- package/agents/planner.md +11 -11
- package/agents/reviewer.md +11 -11
- package/agents/security-reviewer.md +11 -11
- package/agents/test-engineer.md +11 -11
- package/agents/verifier.md +11 -11
- package/agents/writer.md +11 -11
- package/docs/next-upgrade-roadmap.md +808 -0
- package/docs/research/AGENT-EXECUTION-ARCHITECTURE.md +261 -0
- package/docs/research/AGENT-LIFECYCLE-COMPARISON.md +111 -0
- package/docs/research/AUDIT_OH_MY_PI.md +261 -0
- package/docs/research/AUDIT_PI_CREW.md +457 -0
- package/docs/research/CAVEMAN-DEEP-RESEARCH.md +281 -0
- package/docs/research/COMPARISON_OH_MY_PI_VS_PI_CREW.md +264 -0
- package/docs/research/DEEP-RESEARCH-PI-POWERBAR.md +343 -0
- package/docs/research/DEEP_RESEARCH_SUBAGENT_ARCHITECTURE.md +480 -0
- package/docs/research/GAP_CLOSURE_IMPLEMENTATION_PLAN.md +354 -0
- package/docs/research/IMPLEMENTATION_PLAN.md +385 -0
- package/docs/research/LIVE-SESSION-PRODUCTION-READY-PLAN.md +502 -0
- package/docs/research/OH-MY-PI-DEEP-RESEARCH-v14.7.6.md +266 -0
- package/docs/research/REMAINING-GAPS-PLAN.md +363 -0
- package/docs/research/SESSION-SUMMARY-2026-05-08.md +146 -0
- package/docs/research/UI-RESPONSIVENESS-AUDIT.md +173 -0
- package/docs/research-awesome-agent-skills-distillation.md +100 -0
- package/docs/research-oh-my-pi-distillation.md +369 -0
- package/docs/source-runtime-refactor-map.md +24 -0
- package/docs/usage.md +3 -3
- package/install.mjs +52 -8
- package/package.json +99 -98
- package/schema.json +10 -1
- package/skills/async-worker-recovery/SKILL.md +42 -0
- package/skills/context-artifact-hygiene/SKILL.md +52 -0
- package/skills/delegation-patterns/SKILL.md +54 -0
- package/skills/mailbox-interactive/SKILL.md +40 -0
- package/skills/model-routing-context/SKILL.md +39 -0
- package/skills/multi-perspective-review/SKILL.md +58 -0
- package/skills/observability-reliability/SKILL.md +41 -0
- package/skills/orchestration/SKILL.md +157 -0
- package/skills/ownership-session-security/SKILL.md +41 -0
- package/skills/pi-extension-lifecycle/SKILL.md +39 -0
- package/skills/requirements-to-task-packet/SKILL.md +63 -0
- package/skills/resource-discovery-config/SKILL.md +41 -0
- package/skills/runtime-state-reader/SKILL.md +44 -0
- package/skills/secure-agent-orchestration-review/SKILL.md +45 -0
- package/skills/state-mutation-locking/SKILL.md +42 -0
- package/skills/systematic-debugging/SKILL.md +67 -0
- package/skills/ui-render-performance/SKILL.md +39 -0
- package/skills/verification-before-done/SKILL.md +57 -0
- package/skills/worktree-isolation/SKILL.md +39 -0
- package/src/agents/agent-config.ts +6 -0
- package/src/agents/agent-search.ts +98 -0
- package/src/agents/agent-serializer.ts +38 -34
- package/src/agents/discover-agents.ts +29 -15
- package/src/config/config.ts +72 -24
- package/src/config/defaults.ts +25 -0
- package/src/extension/autonomous-policy.ts +26 -33
- package/src/extension/help.ts +1 -0
- package/src/extension/management.ts +5 -0
- package/src/extension/project-init.ts +62 -2
- package/src/extension/register.ts +69 -22
- package/src/extension/registration/commands.ts +64 -25
- package/src/extension/registration/compaction-guard.ts +1 -1
- package/src/extension/registration/subagent-helpers.ts +8 -0
- package/src/extension/registration/subagent-tools.ts +149 -148
- package/src/extension/registration/team-tool.ts +14 -10
- package/src/extension/run-index.ts +35 -21
- package/src/extension/run-maintenance.ts +30 -5
- package/src/extension/team-tool/api.ts +47 -9
- package/src/extension/team-tool/cancel.ts +109 -5
- package/src/extension/team-tool/context.ts +8 -0
- package/src/extension/team-tool/intent-policy.ts +42 -0
- package/src/extension/team-tool/lifecycle-actions.ts +120 -79
- package/src/extension/team-tool/parallel-dispatch.ts +156 -0
- package/src/extension/team-tool/respond.ts +46 -18
- package/src/extension/team-tool/run.ts +55 -12
- package/src/extension/team-tool/status.ts +13 -2
- package/src/extension/team-tool-types.ts +3 -0
- package/src/extension/team-tool.ts +45 -14
- package/src/hooks/registry.ts +61 -0
- package/src/hooks/types.ts +41 -0
- package/src/observability/event-to-metric.ts +8 -1
- package/src/runtime/agent-control.ts +169 -63
- package/src/runtime/async-runner.ts +3 -1
- package/src/runtime/background-runner.ts +78 -53
- package/src/runtime/cancellation-token.ts +89 -0
- package/src/runtime/cancellation.ts +61 -0
- package/src/runtime/capability-inventory.ts +116 -0
- package/src/runtime/child-pi.ts +458 -444
- package/src/runtime/code-summary.ts +247 -0
- package/src/runtime/crash-recovery.ts +182 -0
- package/src/runtime/crew-agent-records.ts +70 -10
- package/src/runtime/crew-agent-runtime.ts +1 -0
- package/src/runtime/custom-tools/irc-tool.ts +201 -0
- package/src/runtime/custom-tools/submit-result-tool.ts +90 -0
- package/src/runtime/deadletter.ts +1 -0
- package/src/runtime/delivery-coordinator.ts +48 -25
- package/src/runtime/effectiveness.ts +81 -0
- package/src/runtime/event-stream-bridge.ts +90 -0
- package/src/runtime/live-agent-control.ts +2 -1
- package/src/runtime/live-agent-manager.ts +179 -85
- package/src/runtime/live-control-realtime.ts +1 -1
- package/src/runtime/live-extension-bridge.ts +150 -0
- package/src/runtime/live-irc.ts +92 -0
- package/src/runtime/live-session-health.ts +100 -0
- package/src/runtime/live-session-runtime.ts +599 -305
- package/src/runtime/manifest-cache.ts +17 -2
- package/src/runtime/mcp-proxy.ts +113 -0
- package/src/runtime/model-fallback.ts +6 -4
- package/src/runtime/notebook-helpers.ts +90 -0
- package/src/runtime/orphan-sentinel.ts +7 -0
- package/src/runtime/output-validator.ts +187 -0
- package/src/runtime/parallel-utils.ts +57 -0
- package/src/runtime/parent-guard.ts +80 -0
- package/src/runtime/pi-args.ts +18 -3
- package/src/runtime/process-status.ts +5 -1
- package/src/runtime/prose-compressor.ts +164 -0
- package/src/runtime/result-extractor.ts +121 -0
- package/src/runtime/retry-executor.ts +81 -64
- package/src/runtime/runtime-resolver.ts +23 -10
- package/src/runtime/semaphore.ts +131 -0
- package/src/runtime/sensitive-paths.ts +92 -0
- package/src/runtime/skill-instructions.ts +222 -0
- package/src/runtime/stale-reconciler.ts +4 -14
- package/src/runtime/stream-preview.ts +177 -0
- package/src/runtime/subagent-manager.ts +6 -2
- package/src/runtime/subprocess-tool-registry.ts +67 -0
- package/src/runtime/task-output-context.ts +177 -127
- package/src/runtime/task-runner/capabilities.ts +78 -0
- package/src/runtime/task-runner/live-executor.ts +107 -101
- package/src/runtime/task-runner/prompt-builder.ts +72 -8
- package/src/runtime/task-runner/prompt-pipeline.ts +64 -0
- package/src/runtime/task-runner/run-projection.ts +104 -0
- package/src/runtime/task-runner.ts +115 -5
- package/src/runtime/team-runner.ts +134 -19
- package/src/runtime/workspace-tree.ts +298 -0
- package/src/runtime/yield-handler.ts +189 -0
- package/src/schema/config-schema.ts +7 -0
- package/src/schema/team-tool-schema.ts +14 -4
- package/src/skills/discover-skills.ts +67 -0
- package/src/state/active-run-registry.ts +167 -0
- package/src/state/artifact-store.ts +4 -1
- package/src/state/atomic-write.ts +50 -1
- package/src/state/blob-store.ts +117 -0
- package/src/state/contracts.ts +2 -1
- package/src/state/event-log-rotation.ts +158 -0
- package/src/state/event-log.ts +52 -2
- package/src/state/mailbox.ts +129 -9
- package/src/state/state-store.ts +32 -5
- package/src/state/types.ts +64 -2
- package/src/teams/team-config.ts +1 -0
- package/src/ui/agent-management-overlay.ts +144 -0
- package/src/ui/crew-widget.ts +15 -5
- package/src/ui/dashboard-panes/cancellation-pane.ts +43 -0
- package/src/ui/dashboard-panes/capability-pane.ts +60 -0
- package/src/ui/dashboard-panes/mailbox-pane.ts +35 -11
- package/src/ui/dashboard-panes/progress-pane.ts +2 -0
- package/src/ui/live-run-sidebar.ts +4 -0
- package/src/ui/powerbar-publisher.ts +77 -15
- package/src/ui/render-coalescer.ts +51 -0
- package/src/ui/run-dashboard.ts +4 -0
- package/src/ui/run-event-bus.ts +209 -0
- package/src/ui/run-snapshot-cache.ts +78 -18
- package/src/ui/snapshot-types.ts +10 -0
- package/src/ui/transcript-entries.ts +258 -0
- package/src/utils/ids.ts +5 -0
- package/src/utils/incremental-reader.ts +104 -0
- package/src/utils/paths.ts +4 -2
- package/src/utils/scan-cache.ts +137 -0
- package/src/utils/sse-parser.ts +134 -0
- package/src/utils/task-name-generator.ts +337 -0
- package/src/utils/visual.ts +33 -2
- package/src/workflows/workflow-config.ts +1 -0
- package/src/worktree/cleanup.ts +2 -1
|
@@ -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
|