pi-crew 0.1.49 → 0.2.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 (249) hide show
  1. package/CHANGELOG.md +74 -1
  2. package/README.md +176 -781
  3. package/agents/analyst.md +11 -11
  4. package/agents/critic.md +11 -11
  5. package/agents/executor.md +11 -11
  6. package/agents/explorer.md +11 -11
  7. package/agents/planner.md +11 -11
  8. package/agents/reviewer.md +11 -11
  9. package/agents/security-reviewer.md +11 -11
  10. package/agents/test-engineer.md +11 -11
  11. package/agents/verifier.md +70 -11
  12. package/agents/writer.md +11 -11
  13. package/docs/actions-reference.md +595 -0
  14. package/docs/commands-reference.md +347 -0
  15. package/docs/runtime-flow.md +148 -148
  16. package/index.ts +6 -6
  17. package/package.json +99 -99
  18. package/skills/async-worker-recovery/SKILL.md +42 -42
  19. package/skills/context-artifact-hygiene/SKILL.md +52 -52
  20. package/skills/delegation-patterns/SKILL.md +54 -54
  21. package/skills/mailbox-interactive/SKILL.md +40 -40
  22. package/skills/model-routing-context/SKILL.md +39 -39
  23. package/skills/multi-perspective-review/SKILL.md +58 -58
  24. package/skills/observability-reliability/SKILL.md +41 -41
  25. package/skills/orchestration/SKILL.md +157 -157
  26. package/skills/ownership-session-security/SKILL.md +41 -41
  27. package/skills/pi-extension-lifecycle/SKILL.md +39 -39
  28. package/skills/requirements-to-task-packet/SKILL.md +63 -63
  29. package/skills/resource-discovery-config/SKILL.md +41 -41
  30. package/skills/runtime-state-reader/SKILL.md +44 -44
  31. package/skills/secure-agent-orchestration-review/SKILL.md +45 -45
  32. package/skills/state-mutation-locking/SKILL.md +42 -42
  33. package/skills/systematic-debugging/SKILL.md +67 -67
  34. package/skills/ui-render-performance/SKILL.md +39 -39
  35. package/skills/verification-before-done/SKILL.md +57 -57
  36. package/skills/worktree-isolation/SKILL.md +39 -39
  37. package/src/adapters/claude-adapter.ts +25 -0
  38. package/src/adapters/codex-adapter.ts +21 -0
  39. package/src/adapters/cursor-adapter.ts +17 -0
  40. package/src/adapters/export-util.ts +137 -0
  41. package/src/adapters/index.ts +15 -0
  42. package/src/adapters/registry.ts +18 -0
  43. package/src/adapters/types.ts +23 -0
  44. package/src/agents/agent-config.ts +2 -0
  45. package/src/agents/agent-search.ts +98 -98
  46. package/src/agents/discover-agents.ts +2 -1
  47. package/src/config/config.ts +14 -1
  48. package/src/config/defaults.ts +5 -5
  49. package/src/config/drift-detector.ts +211 -0
  50. package/src/config/markers.ts +327 -0
  51. package/src/config/resilient-parser.ts +108 -0
  52. package/src/config/suggestions.ts +74 -0
  53. package/src/extension/cross-extension-rpc.ts +103 -82
  54. package/src/extension/project-init.ts +36 -4
  55. package/src/extension/register.ts +67 -22
  56. package/src/extension/registration/commands.ts +77 -8
  57. package/src/extension/registration/subagent-tools.ts +10 -1
  58. package/src/extension/registration/team-tool.ts +10 -1
  59. package/src/extension/registration/viewers.ts +48 -34
  60. package/src/extension/run-bundle-schema.ts +89 -89
  61. package/src/extension/run-export.ts +26 -12
  62. package/src/extension/run-import.ts +25 -1
  63. package/src/extension/run-index.ts +5 -1
  64. package/src/extension/run-maintenance.ts +142 -68
  65. package/src/extension/team-manager-command.ts +10 -1
  66. package/src/extension/team-tool/context.ts +1 -1
  67. package/src/extension/team-tool/doctor.ts +28 -3
  68. package/src/extension/team-tool/handle-settings.ts +195 -188
  69. package/src/extension/team-tool/inspect.ts +41 -41
  70. package/src/extension/team-tool/intent-policy.ts +42 -42
  71. package/src/extension/team-tool/lifecycle-actions.ts +27 -8
  72. package/src/extension/team-tool/plan.ts +19 -19
  73. package/src/extension/team-tool/run.ts +12 -1
  74. package/src/extension/team-tool.ts +14 -3
  75. package/src/i18n.ts +184 -184
  76. package/src/observability/exporters/otlp-exporter.ts +92 -77
  77. package/src/prompt/prompt-runtime.ts +72 -72
  78. package/src/runtime/agent-memory.ts +72 -72
  79. package/src/runtime/agent-observability.ts +114 -114
  80. package/src/runtime/async-marker.ts +26 -26
  81. package/src/runtime/attention-events.ts +28 -28
  82. package/src/runtime/auto-resume.ts +100 -0
  83. package/src/runtime/background-runner.ts +11 -1
  84. package/src/runtime/cancellation-token.ts +89 -89
  85. package/src/runtime/cancellation.ts +61 -61
  86. package/src/runtime/capability-inventory.ts +116 -116
  87. package/src/runtime/child-pi.ts +7 -2
  88. package/src/runtime/compaction-summary.ts +271 -0
  89. package/src/runtime/completion-guard.ts +190 -190
  90. package/src/runtime/concurrency.ts +3 -1
  91. package/src/runtime/crash-recovery.ts +33 -0
  92. package/src/runtime/delta-conflict.ts +360 -0
  93. package/src/runtime/diagnostic-export.ts +3 -1
  94. package/src/runtime/direct-run.ts +35 -35
  95. package/src/runtime/event-stream-bridge.ts +3 -1
  96. package/src/runtime/foreground-control.ts +82 -82
  97. package/src/runtime/green-contract.ts +46 -46
  98. package/src/runtime/group-join.ts +106 -106
  99. package/src/runtime/heartbeat-gradient.ts +28 -28
  100. package/src/runtime/heartbeat-watcher.ts +124 -124
  101. package/src/runtime/iteration-hooks.ts +262 -0
  102. package/src/runtime/live-agent-control.ts +88 -88
  103. package/src/runtime/live-control-realtime.ts +36 -36
  104. package/src/runtime/live-extension-bridge.ts +150 -150
  105. package/src/runtime/live-irc.ts +92 -92
  106. package/src/runtime/live-session-health.ts +100 -100
  107. package/src/runtime/loop-gates.ts +129 -0
  108. package/src/runtime/metric-parser.ts +40 -0
  109. package/src/runtime/notebook-helpers.ts +90 -90
  110. package/src/runtime/orphan-sentinel.ts +7 -7
  111. package/src/runtime/parallel-research.ts +44 -44
  112. package/src/runtime/phase-progress.ts +217 -0
  113. package/src/runtime/pi-args.ts +38 -2
  114. package/src/runtime/pi-json-output.ts +111 -111
  115. package/src/runtime/pi-spawn.ts +74 -6
  116. package/src/runtime/policy-engine.ts +79 -79
  117. package/src/runtime/post-checks.ts +122 -0
  118. package/src/runtime/process-status.ts +14 -1
  119. package/src/runtime/progress-event-coalescer.ts +43 -43
  120. package/src/runtime/prose-compressor.ts +164 -164
  121. package/src/runtime/recovery-recipes.ts +74 -74
  122. package/src/runtime/result-extractor.ts +121 -121
  123. package/src/runtime/role-permission.ts +39 -39
  124. package/src/runtime/sensitive-paths.ts +3 -3
  125. package/src/runtime/session-resources.ts +25 -25
  126. package/src/runtime/session-snapshot.ts +59 -59
  127. package/src/runtime/session-usage.ts +79 -79
  128. package/src/runtime/sidechain-output.ts +29 -29
  129. package/src/runtime/stream-preview.ts +177 -177
  130. package/src/runtime/supervisor-contact.ts +59 -59
  131. package/src/runtime/task-display.ts +38 -38
  132. package/src/runtime/task-graph.ts +207 -0
  133. package/src/runtime/task-quality.ts +207 -0
  134. package/src/runtime/task-runner/capabilities.ts +78 -78
  135. package/src/runtime/task-runner/live-executor.ts +7 -1
  136. package/src/runtime/task-runner/progress.ts +119 -119
  137. package/src/runtime/task-runner/prompt-builder.ts +1 -1
  138. package/src/runtime/task-runner/prompt-pipeline.ts +64 -64
  139. package/src/runtime/task-runner/result-utils.ts +14 -14
  140. package/src/runtime/task-runner/run-projection.ts +103 -103
  141. package/src/runtime/task-runner/state-helpers.ts +22 -22
  142. package/src/runtime/team-runner.ts +126 -7
  143. package/src/runtime/worker-heartbeat.ts +21 -21
  144. package/src/runtime/worker-startup.ts +57 -57
  145. package/src/runtime/workflow-state.ts +187 -0
  146. package/src/runtime/workspace-tree.ts +298 -298
  147. package/src/schema/config-schema.ts +12 -0
  148. package/src/schema/validation-types.ts +148 -0
  149. package/src/skills/skill-templates.ts +374 -0
  150. package/src/state/active-run-registry.ts +35 -11
  151. package/src/state/atomic-write.ts +33 -26
  152. package/src/state/contracts.ts +1 -0
  153. package/src/state/event-reconstructor.ts +217 -0
  154. package/src/state/locks.ts +2 -11
  155. package/src/state/mailbox.ts +4 -3
  156. package/src/state/state-store.ts +32 -14
  157. package/src/state/task-claims.ts +44 -44
  158. package/src/state/types.ts +9 -0
  159. package/src/state/usage.ts +29 -29
  160. package/src/subagents/async-entry.ts +1 -1
  161. package/src/subagents/index.ts +3 -3
  162. package/src/subagents/live/control.ts +1 -1
  163. package/src/subagents/live/manager.ts +1 -1
  164. package/src/subagents/live/realtime.ts +1 -1
  165. package/src/subagents/live/session-runtime.ts +1 -1
  166. package/src/subagents/manager.ts +1 -1
  167. package/src/subagents/spawn.ts +1 -1
  168. package/src/teams/team-serializer.ts +38 -38
  169. package/src/types/diff.d.ts +18 -18
  170. package/src/ui/crew-footer.ts +101 -101
  171. package/src/ui/crew-select-list.ts +111 -111
  172. package/src/ui/crew-widget.ts +9 -4
  173. package/src/ui/dashboard-panes/cancellation-pane.ts +42 -42
  174. package/src/ui/dashboard-panes/capability-pane.ts +59 -59
  175. package/src/ui/dashboard-panes/mailbox-pane.ts +35 -35
  176. package/src/ui/dashboard-panes/metrics-pane.ts +34 -34
  177. package/src/ui/dashboard-panes/progress-pane.ts +11 -0
  178. package/src/ui/dynamic-border.ts +25 -25
  179. package/src/ui/layout-primitives.ts +106 -106
  180. package/src/ui/loaders.ts +158 -158
  181. package/src/ui/powerbar-publisher.ts +6 -0
  182. package/src/ui/render-coalescer.ts +51 -51
  183. package/src/ui/render-diff.ts +119 -119
  184. package/src/ui/render-scheduler.ts +143 -143
  185. package/src/ui/run-action-dispatcher.ts +10 -1
  186. package/src/ui/spinner.ts +17 -17
  187. package/src/ui/status-colors.ts +58 -58
  188. package/src/ui/syntax-highlight.ts +116 -116
  189. package/src/ui/transcript-entries.ts +258 -258
  190. package/src/utils/completion-dedupe.ts +63 -63
  191. package/src/utils/frontmatter.ts +68 -68
  192. package/src/utils/git.ts +262 -262
  193. package/src/utils/ids.ts +17 -17
  194. package/src/utils/incremental-reader.ts +104 -104
  195. package/src/utils/names.ts +27 -27
  196. package/src/utils/redaction.ts +44 -44
  197. package/src/utils/safe-paths.ts +47 -47
  198. package/src/utils/scan-cache.ts +136 -136
  199. package/src/utils/sleep.ts +40 -26
  200. package/src/utils/task-name-generator.ts +337 -337
  201. package/src/workflows/validate-workflow.ts +40 -40
  202. package/src/worktree/branch-freshness.ts +45 -45
  203. package/src/worktree/worktree-manager.ts +11 -3
  204. package/teams/default.team.md +12 -12
  205. package/teams/fast-fix.team.md +11 -11
  206. package/teams/implementation.team.md +18 -18
  207. package/teams/parallel-research.team.md +14 -14
  208. package/teams/research.team.md +11 -11
  209. package/teams/review.team.md +12 -12
  210. package/workflows/default.workflow.md +30 -29
  211. package/workflows/fast-fix.workflow.md +23 -22
  212. package/workflows/implementation.workflow.md +43 -38
  213. package/workflows/parallel-research.workflow.md +46 -46
  214. package/workflows/research.workflow.md +22 -22
  215. package/workflows/review.workflow.md +30 -30
  216. package/docs/refactor-tasks-phase3.md +0 -394
  217. package/docs/refactor-tasks-phase4.md +0 -564
  218. package/docs/refactor-tasks-phase5.md +0 -402
  219. package/docs/refactor-tasks-phase6.md +0 -662
  220. package/docs/refactor-tasks.md +0 -1484
  221. package/docs/research/AGENT-EXECUTION-ARCHITECTURE.md +0 -261
  222. package/docs/research/AGENT-LIFECYCLE-COMPARISON.md +0 -111
  223. package/docs/research/AUDIT_OH_MY_PI.md +0 -261
  224. package/docs/research/AUDIT_PI_CREW.md +0 -457
  225. package/docs/research/CAVEMAN-DEEP-RESEARCH.md +0 -281
  226. package/docs/research/COMPARISON_OH_MY_PI_VS_PI_CREW.md +0 -264
  227. package/docs/research/DEEP-RESEARCH-PI-POWERBAR.md +0 -343
  228. package/docs/research/DEEP_RESEARCH_SUBAGENT_ARCHITECTURE.md +0 -480
  229. package/docs/research/GAP_CLOSURE_IMPLEMENTATION_PLAN.md +0 -354
  230. package/docs/research/IMPLEMENTATION_PLAN.md +0 -385
  231. package/docs/research/LIVE-SESSION-PRODUCTION-READY-PLAN.md +0 -502
  232. package/docs/research/OH-MY-PI-DEEP-RESEARCH-v14.7.6.md +0 -266
  233. package/docs/research/REMAINING-GAPS-PLAN.md +0 -363
  234. package/docs/research/SESSION-SUMMARY-2026-05-08.md +0 -146
  235. package/docs/research/UI-RESPONSIVENESS-AUDIT.md +0 -173
  236. package/docs/research-awesome-agent-skills-distillation.md +0 -100
  237. package/docs/research-extension-examples.md +0 -297
  238. package/docs/research-extension-system.md +0 -324
  239. package/docs/research-oh-my-pi-distillation.md +0 -369
  240. package/docs/research-optimization-plan.md +0 -548
  241. package/docs/research-phase10-distillation.md +0 -199
  242. package/docs/research-phase11-distillation.md +0 -201
  243. package/docs/research-phase8-operator-experience-plan.md +0 -819
  244. package/docs/research-phase9-observability-reliability-plan.md +0 -1190
  245. package/docs/research-pi-coding-agent.md +0 -357
  246. package/docs/research-source-pi-crew-reference.md +0 -174
  247. package/docs/research-ui-optimization-plan.md +0 -480
  248. package/docs/source-runtime-refactor-map.md +0 -107
  249. package/src/utils/atomic-write.ts +0 -33
@@ -1,480 +0,0 @@
1
- # 🔬 Deep Research: Oh-My-Pi Subagent Architecture
2
-
3
- > **Nguồn**: Đọc sâu trực tiếp source code oh-my-pi v14.7.3 + 6 parallel research agents (4 explorer shards + 1 analyst + 1 writer)
4
- > **Mục đích**: Hiểu cách hoạt động subagent, giao tiếp giữa các subagent, và UI hiển thị
5
- > **Files đã kiểm tra**: 16 files chính (~8000+ dòng code)
6
-
7
- ---
8
-
9
- ## 1. Subagent Lifecycle & Execution
10
-
11
- ### 1.1 Architecture Overview
12
-
13
- ```
14
- ┌─────────────────────────────────────────────────────────┐
15
- │ Main Session │
16
- │ (AgentSession) │
17
- │ ├─ TaskTool.execute() │
18
- │ │ ├─ #executeSync() ← sequential/sync path │
19
- │ │ └─ execute() async ← async background path │
20
- │ │ │
21
- │ │ ┌─────────────┐ ┌─────────────┐ │
22
- │ │ │ runSubprocess│ │ runSubprocess│ ← parallel │
23
- │ │ │ (task 0) │ │ (task 1) │ via │
24
- │ │ │ AgentSession│ │ AgentSession│ Semaphore │
25
- │ │ │ + Events │ │ + Events │ + mapWith... │
26
- │ │ └─────────────┘ └─────────────┘ │
27
- │ └─ EventBus │
28
- │ ├─ task:subagent:event (raw events) │
29
- │ ├─ task:subagent:progress (aggregated) │
30
- │ └─ task:subagent:lifecycle (start/end) │
31
- └─────────────────────────────────────────────────────────┘
32
- ```
33
-
34
- ### 1.2 In-Process Execution Model (KHÔNG phải child process!)
35
-
36
- **Key insight**: Oh-my-pi subagents chạy **in-process** (cùng process), KHÔNG spawn child process như pi-crew.
37
-
38
- **File**: `packages/coding-agent/src/task/executor.ts` (~1291 lines)
39
-
40
- ```typescript
41
- // executor.ts — runSubprocess creates an AgentSession IN-PROCESS
42
- const { session } = await createAgentSession({
43
- cwd: worktree ?? cwd,
44
- authStorage, modelRegistry, settings: subagentSettings,
45
- model, thinkingLevel: effectiveThinkingLevel,
46
- toolNames, // ← restricted tool set
47
- systemPrompt: ..., // ← composed prompt
48
- sessionManager, // ← in-memory or file-backed
49
- hasUI: false, // ← no UI for subagents
50
- spawns: spawnsEnv, // ← recursion control
51
- taskDepth: childDepth,
52
- });
53
- ```
54
-
55
- ### 1.3 Agent Definition & Discovery
56
-
57
- **File**: `packages/coding-agent/src/task/agents.ts`
58
-
59
- - **Bundled agents**: Embedded via `import ... with { type: "text" }` (Bun compile-time)
60
- - explore, plan, designer, reviewer, librarian, task, quick_task
61
- - **User agents**: `~/.omp/agent/agents/*.md`
62
- - **Project agents**: `.omp/agents/*.md`
63
- - **Frontmatter** (YAML): `name, description, tools?, spawns?, model?, thinkingLevel?, blocking?, output?`
64
-
65
- **File**: `packages/coding-agent/src/task/types.ts`
66
- ```typescript
67
- interface AgentDefinition {
68
- name: string;
69
- description: string;
70
- systemPrompt: string;
71
- tools?: string[]; // ← tool whitelist
72
- spawns?: string[] | "*"; // ← recursion control
73
- model?: string[]; // ← model pattern override
74
- thinkingLevel?: ThinkingLevel;
75
- blocking?: boolean; // ← prevent async execution
76
- output?: unknown; // ← JTD output schema
77
- source: AgentSource;
78
- filePath?: string;
79
- }
80
- ```
81
-
82
- ### 1.4 System Prompt Construction
83
-
84
- **File**: `packages/coding-agent/src/task/executor.ts`
85
-
86
- ```
87
- Subagent system prompt = template.render(subagentSystemPromptTemplate, {
88
- base: defaultPrompt, // ← Pi's default system prompt
89
- agent: agent.systemPrompt, // ← agent-specific instructions
90
- worktree: worktree ?? "", // ← isolation directory
91
- outputSchema: ..., // ← expected output format
92
- contextFile: ..., // ← parent conversation context
93
- ircPeers: ..., // ← visible IRC peers
94
- ircSelfId: ..., // ← self agent ID for IRC
95
- })
96
- ```
97
-
98
- ### 1.5 Tool Access Control
99
-
100
- ```typescript
101
- // Restricted tool set from agent definition
102
- let toolNames: string[] | undefined;
103
- if (agent.tools && agent.tools.length > 0) {
104
- toolNames = agent.tools;
105
- // Auto-include task tool if spawns defined
106
- if (agent.spawns !== undefined && !toolNames.includes("task") && !atMaxDepth) {
107
- toolNames = [...toolNames, "task"];
108
- }
109
- }
110
-
111
- // Recursion depth limit
112
- const maxRecursionDepth = settings.get("task.maxRecursionDepth") ?? 2;
113
- if (atMaxDepth && toolNames?.includes("task")) {
114
- toolNames = toolNames.filter(name => name !== "task");
115
- }
116
- ```
117
-
118
- ### 1.6 Yield Tool Pattern (Critical!)
119
-
120
- Subagents **MUST** call `yield` tool to submit results:
121
-
122
- ```typescript
123
- // executor.ts — yield enforcement
124
- const MAX_YIELD_RETRIES = 3;
125
- while (!yieldCalled && retryCount < MAX_YIELD_RETRIES && !abortSignal.aborted) {
126
- const reminder = prompt.render(submitReminderTemplate, {
127
- retryCount, maxRetries: MAX_YIELD_RETRIES,
128
- });
129
- await session.prompt(reminder, {
130
- attribution: "agent",
131
- ...(reminderToolChoice ? { toolChoice: reminderToolChoice } : {}),
132
- });
133
- await session.waitForIdle();
134
- }
135
- ```
136
-
137
- If subagent exits without calling yield → warning + potential exitCode=1.
138
-
139
- ### 1.7 Progress Tracking
140
-
141
- **Coalesced progress updates** (150ms debounce):
142
-
143
- ```typescript
144
- const PROGRESS_COALESCE_MS = 150;
145
-
146
- // Events tracked per-subagent:
147
- progress.currentTool = event.toolName;
148
- progress.currentToolArgs = extractToolArgsPreview(event.args);
149
- progress.recentTools.unshift({ tool, args, endMs });
150
- progress.tokens += getUsageTokens(messageUsage);
151
- progress.recentOutput = lines.slice(-8).reverse(); // 8 recent output lines
152
- ```
153
-
154
- ### 1.8 Isolation Modes
155
-
156
- ```typescript
157
- type IsolationMode = "worktree" | "fuse-overlay" | "fuse-projfs" | "none";
158
- type MergeMode = "patch" | "branch" | "none";
159
- type CommitStyle = "ai" | "simple";
160
- ```
161
-
162
- - **worktree**: Git worktree per task → capture patch or branch
163
- - **fuse-overlay**: FUSE filesystem overlay (fast copy-on-write)
164
- - **fuse-projfs**: Windows ProjFS overlay
165
- - **none**: No isolation, in-place editing
166
-
167
- ---
168
-
169
- ## 2. Inter-Subagent Communication
170
-
171
- ### 2.1 IRC Tool — Agent-to-Agent Messaging
172
-
173
- **File**: `packages/coding-agent/src/tools/irc.ts`
174
-
175
- Oh-my-pi has a full **IRC-like messaging system** between agents:
176
-
177
- ```
178
- ┌──────────────┐ irc.send ┌──────────────┐
179
- │ Agent A │ ─────────────→ │ Agent B │
180
- │ (subagent) │ message │ (subagent) │
181
- │ │ ←───────────── │ │
182
- │ │ auto-reply │ │
183
- └──────────────┘ └──────────────┘
184
- ↓ ↓
185
- relay to Main relay to Main
186
- (display only) (display only)
187
- ```
188
-
189
- **Operations**:
190
- - `op: "list"` → list visible peers
191
- - `op: "send"` → send message to peer or broadcast ("all")
192
- - `awaitReply: true/false` → DM auto-replies, broadcast doesn't
193
-
194
- ### 2.2 AgentRegistry — Global Process Registry
195
-
196
- **File**: `packages/coding-agent/src/registry/agent-registry.ts`
197
-
198
- ```typescript
199
- class AgentRegistry {
200
- // Process-global singleton
201
- static global(): AgentRegistry;
202
-
203
- register(input: RegisterInput): AgentRef; // register at creation
204
- unregister(id: string): void; // remove on dispose
205
- setStatus(id: string, AgentStatus): void;
206
- listVisibleTo(id: string): AgentRef[]; // peers visible to caller
207
- }
208
- ```
209
-
210
- - Main agent: id="0-Main", kind="main"
211
- - Subagents: id="0-TaskName", kind="sub", parentId="0-Main"
212
-
213
- ### 2.3 Ephemeral Side-Channel (Anti-Deadlock!)
214
-
215
- **File**: `packages/coding-agent/src/session/agent-session.ts`
216
-
217
- ```typescript
218
- async respondAsBackground(args): Promise<{ replyText: string | null }> {
219
- // 1. Create incoming record (irc:incoming)
220
- // 2. Forward to Main UI for display (relay)
221
- // 3. Run ephemeral turn: snapshot current model+history, no tools, no persistence
222
- // → avoids deadlock with recipient's in-flight tool calls
223
- // 4. Create reply record (irc:autoreply)
224
- // 5. Queue both records for injection into recipient's history (deferred until idle)
225
- }
226
-
227
- async runEphemeralTurn(args): Promise<{ replyText, assistantMessage }> {
228
- // Snapshot includes in-flight streaming text!
229
- const snapshot = this.#buildEphemeralSnapshot(args.promptText);
230
- const llmMessages = await this.convertMessagesToLlm(snapshot, args.signal);
231
- // ... stream response, no tools, no history mutation
232
- }
233
- ```
234
-
235
- **Key design**: The side-channel does NOT require the recipient's main loop to be free. It takes a snapshot of the current history (including any in-flight streaming text) and generates a reply in parallel.
236
-
237
- ### 2.4 IRC Relay to Main
238
-
239
- All IRC exchanges are **relayed to the main agent's UI** (display-only, not persisted to main's history):
240
-
241
- ```
242
- Subagent A sends to Subagent B:
243
- → Main UI shows: [IRC `AgentA` → `AgentB`] message...
244
- → Main UI shows: [IRC `AgentB` → (auto) `AgentA`] reply...
245
- ```
246
-
247
- ### 2.5 EventBus Channels
248
-
249
- Three channels for subagent events:
250
-
251
- | Channel | Purpose | Payload |
252
- |---------|---------|---------|
253
- | `task:subagent:event` | Raw agent events (tool calls, messages) | `{ index, agent, event }` |
254
- | `task:subagent:progress` | Aggregated progress (debounced 150ms) | `SubagentProgressPayload` |
255
- | `task:subagent:lifecycle` | Start/end transitions | `SubagentLifecyclePayload` |
256
-
257
- ### 2.6 Communication Summary
258
-
259
- ```
260
- Method │ Direction │ Persistence │ Use Case
261
- ────────────────┼───────────────────┼──────────────────┼──────────────────
262
- IRC tool │ peer ↔ peer │ queued on idle │ Coordination
263
- EventBus │ child → parent │ in-memory only │ Progress tracking
264
- Session file │ child → parent │ .jsonl on disk │ Transcript
265
- Artifacts │ child → parent │ files on disk │ Output/patches
266
- Context file │ parent → child │ .md on disk │ Parent context
267
- Yield tool │ child → parent │ in output │ Submit results
268
- ```
269
-
270
- ---
271
-
272
- ## 3. TUI/UI Rendering for Subagents
273
-
274
- ### 3.1 Session Observer Registry
275
-
276
- **File**: `packages/coding-agent/src/modes/session-observer-registry.ts`
277
-
278
- ```
279
- SessionObserverRegistry
280
- ├─ subscribeToEventBus(eventBus)
281
- │ ├─ on(TASK_SUBAGENT_LIFECYCLE_CHANNEL) → track start/end
282
- │ └─ on(TASK_SUBAGENT_PROGRESS_CHANNEL) → update progress
283
- ├─ onChange(callback) → notify UI to re-render
284
- ├─ getSessions() → sorted list [main, ...subagents]
285
- └─ getActiveSubagentCount()
286
- ```
287
-
288
- Tracks `ObservableSession[]`:
289
- ```typescript
290
- interface ObservableSession {
291
- id: string;
292
- kind: "main" | "subagent";
293
- label: string;
294
- agent?: string;
295
- status: "active" | "completed" | "failed" | "aborted";
296
- sessionFile?: string; // ← JSONL transcript path
297
- lastUpdate: number;
298
- progress?: AgentProgress; // ← latest progress snapshot
299
- }
300
- ```
301
-
302
- ### 3.2 Session Observer Overlay (Main UI Component)
303
-
304
- **File**: `packages/coding-agent/src/modes/components/session-observer-overlay.ts` (~824 lines)
305
-
306
- **Architecture**:
307
- ```
308
- ┌─ DynamicBorder ──────────────────────────────────────────┐
309
- │ Session Observer > Subagent #0 │
310
- │ fix-security-bug [active] explorer │
311
- ├──────────────────────────────────────────────────────────┤
312
- │ │
313
- │ ▶ ▸ bash │
314
- │ npm run test │
315
- │ ✓ done │
316
- │ │
317
- │ ▸ read │
318
- │ path: src/auth.ts │
319
- │ ✓ 24 lines │
320
- │ │
321
- │ ▶ Response │
322
- │ I found the security issue in... │
323
- │ │
324
- ├──────────────────────────────────────────────────────────┤
325
- │ 12 tools · 8.5k tokens · 2m 34s [1-45/89] │
326
- │ j/k:scroll Enter:expand [/]/←→:cycle Esc:close │
327
- └─ DynamicBorder ──────────────────────────────────────────┘
328
- ```
329
-
330
- **Key UI Features**:
331
-
332
- 1. **Auto-jump to most recent active subagent** on open
333
- 2. **Incremental transcript loading**: reads JSONL file incrementally (`readFileIncremental`) — only reads new bytes since last render
334
- 3. **Entry-based selection**: each thinking/text/toolCall/user block is a selectable entry
335
- 4. **Expand/collapse**: Enter toggles expanded view per entry
336
- 5. **Breadcrumb navigation**: for nested sub-agents (subagent spawning subagent)
337
- 6. **Cycle agents**: `]`/`[` or ←→ to switch between subagents
338
- 7. **Auto-scroll**: stays at bottom unless user manually scrolled up
339
- 8. **Markdown rendering**: expanded entries use `Markdown` component for rich formatting
340
- 9. **Smart scrolling**: entries larger than viewport only snap when completely out of view
341
-
342
- ### 3.3 Anti-Flicker Techniques
343
-
344
- 1. **Progress coalescing** (150ms debounce in executor.ts):
345
- ```typescript
346
- const PROGRESS_COALESCE_MS = 150;
347
- // Only emit progress if 150ms elapsed since last emit
348
- ```
349
-
350
- 2. **Incremental file reading** (only new bytes):
351
- ```typescript
352
- readFileIncremental(filePath, fromByte) → { text, newSize }
353
- ```
354
-
355
- 3. **Viewport-based rendering**: only renders visible lines in viewport, pads rest
356
- 4. **Rebuild on state change only**: content rebuilt only when selection/expansion changes
357
-
358
- ### 3.4 Agent Dashboard (Configuration UI)
359
-
360
- **File**: `packages/coding-agent/src/modes/components/agent-dashboard.ts` (~1120 lines)
361
-
362
- Two-column layout for managing agents:
363
- - Left: agent list with search/filter by source (All/Project/User/Bundled)
364
- - Right: inspector showing model resolution, overrides, file path
365
- - Can create new agents via AI generation (architect agent)
366
- - Toggle enable/disable, model override per agent
367
-
368
- ### 3.5 Render Chain for Subagent Progress
369
-
370
- ```
371
- AgentEvent (in subagent session)
372
- → processEvent() [executor.ts]
373
- → AgentProgress updated in-memory
374
- → scheduleProgress() with 150ms coalesce
375
- → EventBus.emit(TASK_SUBAGENT_PROGRESS_CHANNEL)
376
- → SessionObserverRegistry updates ObservableSession
377
- → onChange listeners fire
378
- → UI re-renders observer overlay
379
- ```
380
-
381
- ### 3.6 Streaming Text Display
382
-
383
- From executor.ts `processEvent`:
384
- ```typescript
385
- case "message_update":
386
- if (assistantEvent.type === "text_delta") {
387
- appendRecentOutputTail(assistantEvent.delta); // incremental
388
- }
389
- ```
390
-
391
- The observer overlay reads the full JSONL transcript from disk, so it shows the complete conversation, not just the last delta.
392
-
393
- ---
394
-
395
- ## 4. Steering & Follow-up (Từ agent research)
396
-
397
- ### 4.1 Steering Mechanism
398
-
399
- **Files**: `packages/agent/src/agent.ts` (line 220-580), `packages/agent/src/agent-loop.ts`
400
-
401
- ```
402
- agent.steer(message) → thêm vào #steeringQueue
403
- agent.followUp(message) → thêm vào #followUpQueue
404
-
405
- Agent Loop:
406
- while (true) { // outer loop: follow-ups
407
- while (hasMoreToolCalls || pendingMessages) { // inner loop
408
- // inject pending messages từ steering queue
409
- // check interruptMode: "immediate" (sau mỗi tool) hoặc "wait" (đợi turn xong)
410
- }
411
- }
412
- ```
413
-
414
- Hai chế độ interrupt:
415
- - `"immediate"`: kiểm tra steering queue sau mỗi tool call → phản hồi nhanh
416
- - `"wait"`: đợi turn hiện tại hoàn tất → không gián đoạn
417
-
418
- ### 4.2 render.ts — Task Tool TUI Rendering (~1020 lines)
419
-
420
- **File**: `packages/coding-agent/src/task/render.ts`
421
-
422
- Component hiển thị kết quả task tool trong main session transcript:
423
- - `renderCall()`: Hiển thị khi parent gọi task tool (tóm tắt agent, tasks, isolation mode)
424
- - `renderResult()`: Hiển thị kết quả khi subagent hoàn thành
425
- - Per-task status indicators (✓/✗/⊘)
426
- - Duration, token counts
427
- - Truncated output previews
428
- - Patch/merge summaries
429
- - Usage aggregation across all subagents
430
-
431
- ---
432
-
433
- ## 5. Key Differences from pi-crew
434
-
435
- | Aspect | oh-my-pi | pi-crew |
436
- |--------|----------|---------|
437
- | Execution model | In-process (AgentSession) | Child process (pi CLI) |
438
- | Communication | IRC tool + EventBus | File-based (manifest, artifacts) |
439
- | Progress | Real-time EventBus (150ms coalesce) | Post-hoc file reading |
440
- | UI | Full overlay with transcript | Powerbar segments |
441
- | Isolation | worktree/fuse-overlay/patch | worktree (planned) |
442
- | Tool control | Agent frontmatter `tools[]` | Agent frontmatter (new) |
443
- | Output | yield tool (enforced) | exit code + stdout |
444
- | Recursion | maxRecursionDepth + spawns[] | N/A |
445
- | Streaming | AgentEvent subscription | JSON stdout parsing |
446
- | Steering | steer()/followUp() queues | cancel/respond commands |
447
- | Agent registry | Process-global singleton | Per-run manifest |
448
-
449
- ## 6. Applicable Patterns for pi-crew
450
-
451
- ### Priority 1 (High Impact — Giảm flicker UI)
452
- 1. **Progress coalescing** → 150ms debounce cho task progress events (tránh render quá nhiều)
453
- 2. **Incremental transcript reading** → chỉ đọc bytes mới từ file JSONL, không đọc lại toàn bộ
454
- 3. **In-process event bus** → thay thế post-hoc file reading bằng real-time events (nếu chuyển sang in-process)
455
-
456
- ### Priority 2 (Medium Impact — Tăng khả năng coordination)
457
- 4. **Yield tool enforcement** → structured output submission thay vì parse stdout
458
- 5. **IRC-like messaging** → inter-subagent coordination (anti-deadlock side-channel)
459
- 6. **Ephemeral side-channel** → respondAsBackground() không cần recipient idle
460
-
461
- ### Priority 3 (Polish — UX tốt hơn)
462
- 7. **Entry-based observer** → expand/collapse per tool call trong transcript viewer
463
- 8. **Breadcrumb navigation** → nested subagent exploration (subagent spawn subagent)
464
- 9. **Auto-scroll with manual override** → stay at bottom unless user scrolled up
465
- 10. **Semaphore-based concurrency** → Semaphore class với acquire/release thay vì Promise.all limitation
466
- 11. **Context file sharing** → parent ghi context.md, child đọc được ngay
467
- 12. **MCP proxy tools** → subagent dùng lại parent's MCP connections không cần reconnect
468
-
469
- ## 7. Nguồn dữ liệu
470
-
471
- Báo cáo này được tổng hợp từ:
472
- - **Đọc trực tiếp**: executor.ts (1291 lines), types.ts (277 lines), agent-dashboard.ts (1120 lines), session-observer-overlay.ts (824 lines), agent-session.ts (partial), irc.ts, agent-registry.ts, session-observer-registry.ts, task/index.ts (1274 lines)
473
- - **Research team**: 6 parallel agents (4 explorer shards + 1 analyst synthesis + 1 writer)
474
- - 01_discover: Tổng quan kiến trúc
475
- - 02_explore-shard-1: Steering & TUI pipeline
476
- - 03_explore-shard-2: Lifecycle + Communication chi tiết
477
- - 04_explore-shard-3: pi-subagents + isolation
478
- - 05_synthesize: Tổng hợp phân tích
479
- - 06_write: Báo cáo cuối cùng
480
- - **Total tokens**: input=446K, output=41K, cacheRead=6.4M