pi-crew 0.1.51 → 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 (239) hide show
  1. package/CHANGELOG.md +56 -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 +13 -1
  48. package/src/config/drift-detector.ts +211 -0
  49. package/src/config/markers.ts +327 -0
  50. package/src/config/resilient-parser.ts +108 -0
  51. package/src/config/suggestions.ts +74 -0
  52. package/src/extension/cross-extension-rpc.ts +103 -94
  53. package/src/extension/project-init.ts +21 -1
  54. package/src/extension/register.ts +45 -14
  55. package/src/extension/registration/commands.ts +77 -8
  56. package/src/extension/registration/subagent-tools.ts +10 -1
  57. package/src/extension/registration/team-tool.ts +10 -1
  58. package/src/extension/registration/viewers.ts +48 -34
  59. package/src/extension/run-bundle-schema.ts +89 -89
  60. package/src/extension/run-import.ts +25 -1
  61. package/src/extension/run-index.ts +5 -1
  62. package/src/extension/run-maintenance.ts +142 -68
  63. package/src/extension/team-manager-command.ts +10 -1
  64. package/src/extension/team-tool/doctor.ts +28 -3
  65. package/src/extension/team-tool/handle-settings.ts +195 -188
  66. package/src/extension/team-tool/inspect.ts +41 -41
  67. package/src/extension/team-tool/intent-policy.ts +42 -42
  68. package/src/extension/team-tool/lifecycle-actions.ts +27 -8
  69. package/src/extension/team-tool/plan.ts +19 -19
  70. package/src/extension/team-tool/run.ts +12 -1
  71. package/src/extension/team-tool.ts +11 -1
  72. package/src/i18n.ts +184 -184
  73. package/src/observability/exporters/otlp-exporter.ts +92 -77
  74. package/src/prompt/prompt-runtime.ts +72 -72
  75. package/src/runtime/agent-memory.ts +72 -72
  76. package/src/runtime/agent-observability.ts +114 -114
  77. package/src/runtime/async-marker.ts +26 -26
  78. package/src/runtime/attention-events.ts +28 -28
  79. package/src/runtime/auto-resume.ts +100 -0
  80. package/src/runtime/background-runner.ts +11 -1
  81. package/src/runtime/cancellation-token.ts +89 -89
  82. package/src/runtime/cancellation.ts +61 -61
  83. package/src/runtime/capability-inventory.ts +116 -116
  84. package/src/runtime/child-pi.ts +7 -2
  85. package/src/runtime/compaction-summary.ts +271 -0
  86. package/src/runtime/completion-guard.ts +190 -190
  87. package/src/runtime/crash-recovery.ts +33 -0
  88. package/src/runtime/delta-conflict.ts +360 -0
  89. package/src/runtime/direct-run.ts +35 -35
  90. package/src/runtime/foreground-control.ts +82 -82
  91. package/src/runtime/green-contract.ts +46 -46
  92. package/src/runtime/group-join.ts +106 -106
  93. package/src/runtime/heartbeat-gradient.ts +28 -28
  94. package/src/runtime/heartbeat-watcher.ts +124 -124
  95. package/src/runtime/iteration-hooks.ts +262 -0
  96. package/src/runtime/live-agent-control.ts +88 -88
  97. package/src/runtime/live-control-realtime.ts +36 -36
  98. package/src/runtime/live-extension-bridge.ts +150 -150
  99. package/src/runtime/live-irc.ts +92 -92
  100. package/src/runtime/live-session-health.ts +100 -100
  101. package/src/runtime/loop-gates.ts +129 -0
  102. package/src/runtime/metric-parser.ts +40 -0
  103. package/src/runtime/notebook-helpers.ts +90 -90
  104. package/src/runtime/orphan-sentinel.ts +7 -7
  105. package/src/runtime/parallel-research.ts +44 -44
  106. package/src/runtime/phase-progress.ts +217 -0
  107. package/src/runtime/pi-args.ts +38 -11
  108. package/src/runtime/pi-json-output.ts +111 -111
  109. package/src/runtime/pi-spawn.ts +57 -7
  110. package/src/runtime/policy-engine.ts +79 -79
  111. package/src/runtime/post-checks.ts +122 -0
  112. package/src/runtime/progress-event-coalescer.ts +43 -43
  113. package/src/runtime/prose-compressor.ts +164 -164
  114. package/src/runtime/recovery-recipes.ts +74 -74
  115. package/src/runtime/result-extractor.ts +121 -121
  116. package/src/runtime/role-permission.ts +39 -39
  117. package/src/runtime/sensitive-paths.ts +2 -2
  118. package/src/runtime/session-resources.ts +25 -25
  119. package/src/runtime/session-snapshot.ts +59 -59
  120. package/src/runtime/session-usage.ts +79 -79
  121. package/src/runtime/sidechain-output.ts +29 -29
  122. package/src/runtime/stream-preview.ts +177 -177
  123. package/src/runtime/supervisor-contact.ts +59 -59
  124. package/src/runtime/task-display.ts +38 -38
  125. package/src/runtime/task-graph.ts +207 -0
  126. package/src/runtime/task-quality.ts +207 -0
  127. package/src/runtime/task-runner/capabilities.ts +78 -78
  128. package/src/runtime/task-runner/live-executor.ts +7 -1
  129. package/src/runtime/task-runner/progress.ts +119 -119
  130. package/src/runtime/task-runner/prompt-pipeline.ts +64 -64
  131. package/src/runtime/task-runner/result-utils.ts +14 -14
  132. package/src/runtime/task-runner/run-projection.ts +103 -103
  133. package/src/runtime/task-runner/state-helpers.ts +22 -22
  134. package/src/runtime/team-runner.ts +117 -7
  135. package/src/runtime/worker-heartbeat.ts +21 -21
  136. package/src/runtime/worker-startup.ts +57 -57
  137. package/src/runtime/workflow-state.ts +187 -0
  138. package/src/runtime/workspace-tree.ts +298 -298
  139. package/src/schema/config-schema.ts +11 -0
  140. package/src/schema/validation-types.ts +148 -0
  141. package/src/skills/skill-templates.ts +374 -0
  142. package/src/state/active-run-registry.ts +35 -11
  143. package/src/state/atomic-write.ts +33 -26
  144. package/src/state/contracts.ts +1 -0
  145. package/src/state/event-reconstructor.ts +217 -0
  146. package/src/state/locks.ts +2 -13
  147. package/src/state/mailbox.ts +4 -3
  148. package/src/state/state-store.ts +32 -14
  149. package/src/state/task-claims.ts +44 -44
  150. package/src/state/types.ts +9 -0
  151. package/src/state/usage.ts +29 -29
  152. package/src/subagents/async-entry.ts +1 -1
  153. package/src/subagents/index.ts +3 -3
  154. package/src/subagents/live/control.ts +1 -1
  155. package/src/subagents/live/manager.ts +1 -1
  156. package/src/subagents/live/realtime.ts +1 -1
  157. package/src/subagents/live/session-runtime.ts +1 -1
  158. package/src/subagents/manager.ts +1 -1
  159. package/src/subagents/spawn.ts +1 -1
  160. package/src/teams/team-serializer.ts +38 -38
  161. package/src/types/diff.d.ts +18 -18
  162. package/src/ui/crew-footer.ts +101 -101
  163. package/src/ui/crew-select-list.ts +111 -111
  164. package/src/ui/crew-widget.ts +5 -2
  165. package/src/ui/dashboard-panes/cancellation-pane.ts +42 -42
  166. package/src/ui/dashboard-panes/capability-pane.ts +59 -59
  167. package/src/ui/dashboard-panes/mailbox-pane.ts +35 -35
  168. package/src/ui/dashboard-panes/metrics-pane.ts +34 -34
  169. package/src/ui/dashboard-panes/progress-pane.ts +11 -0
  170. package/src/ui/dynamic-border.ts +25 -25
  171. package/src/ui/layout-primitives.ts +106 -106
  172. package/src/ui/loaders.ts +158 -158
  173. package/src/ui/render-coalescer.ts +51 -51
  174. package/src/ui/render-diff.ts +119 -119
  175. package/src/ui/render-scheduler.ts +143 -143
  176. package/src/ui/run-action-dispatcher.ts +10 -1
  177. package/src/ui/spinner.ts +17 -17
  178. package/src/ui/status-colors.ts +58 -58
  179. package/src/ui/syntax-highlight.ts +116 -116
  180. package/src/ui/transcript-entries.ts +258 -258
  181. package/src/utils/completion-dedupe.ts +63 -63
  182. package/src/utils/frontmatter.ts +68 -68
  183. package/src/utils/git.ts +262 -262
  184. package/src/utils/ids.ts +17 -17
  185. package/src/utils/incremental-reader.ts +104 -104
  186. package/src/utils/names.ts +27 -27
  187. package/src/utils/redaction.ts +44 -44
  188. package/src/utils/safe-paths.ts +47 -47
  189. package/src/utils/scan-cache.ts +136 -136
  190. package/src/utils/sleep.ts +40 -26
  191. package/src/utils/task-name-generator.ts +337 -337
  192. package/src/workflows/validate-workflow.ts +40 -40
  193. package/src/worktree/branch-freshness.ts +45 -45
  194. package/teams/default.team.md +12 -12
  195. package/teams/fast-fix.team.md +11 -11
  196. package/teams/implementation.team.md +18 -18
  197. package/teams/parallel-research.team.md +14 -14
  198. package/teams/research.team.md +11 -11
  199. package/teams/review.team.md +12 -12
  200. package/workflows/default.workflow.md +30 -29
  201. package/workflows/fast-fix.workflow.md +23 -22
  202. package/workflows/implementation.workflow.md +43 -43
  203. package/workflows/parallel-research.workflow.md +46 -46
  204. package/workflows/research.workflow.md +22 -22
  205. package/workflows/review.workflow.md +30 -30
  206. package/docs/refactor-tasks-phase3.md +0 -394
  207. package/docs/refactor-tasks-phase4.md +0 -564
  208. package/docs/refactor-tasks-phase5.md +0 -402
  209. package/docs/refactor-tasks-phase6.md +0 -662
  210. package/docs/refactor-tasks.md +0 -1484
  211. package/docs/research/AGENT-EXECUTION-ARCHITECTURE.md +0 -261
  212. package/docs/research/AGENT-LIFECYCLE-COMPARISON.md +0 -111
  213. package/docs/research/AUDIT_OH_MY_PI.md +0 -261
  214. package/docs/research/AUDIT_PI_CREW.md +0 -457
  215. package/docs/research/CAVEMAN-DEEP-RESEARCH.md +0 -281
  216. package/docs/research/COMPARISON_OH_MY_PI_VS_PI_CREW.md +0 -264
  217. package/docs/research/DEEP-RESEARCH-PI-POWERBAR.md +0 -343
  218. package/docs/research/DEEP_RESEARCH_SUBAGENT_ARCHITECTURE.md +0 -480
  219. package/docs/research/GAP_CLOSURE_IMPLEMENTATION_PLAN.md +0 -354
  220. package/docs/research/IMPLEMENTATION_PLAN.md +0 -385
  221. package/docs/research/LIVE-SESSION-PRODUCTION-READY-PLAN.md +0 -502
  222. package/docs/research/OH-MY-PI-DEEP-RESEARCH-v14.7.6.md +0 -266
  223. package/docs/research/REMAINING-GAPS-PLAN.md +0 -363
  224. package/docs/research/SESSION-SUMMARY-2026-05-08.md +0 -146
  225. package/docs/research/UI-RESPONSIVENESS-AUDIT.md +0 -173
  226. package/docs/research-awesome-agent-skills-distillation.md +0 -100
  227. package/docs/research-extension-examples.md +0 -297
  228. package/docs/research-extension-system.md +0 -324
  229. package/docs/research-oh-my-pi-distillation.md +0 -369
  230. package/docs/research-optimization-plan.md +0 -548
  231. package/docs/research-phase10-distillation.md +0 -199
  232. package/docs/research-phase11-distillation.md +0 -201
  233. package/docs/research-phase8-operator-experience-plan.md +0 -819
  234. package/docs/research-phase9-observability-reliability-plan.md +0 -1190
  235. package/docs/research-pi-coding-agent.md +0 -357
  236. package/docs/research-source-pi-crew-reference.md +0 -174
  237. package/docs/research-ui-optimization-plan.md +0 -480
  238. package/docs/source-runtime-refactor-map.md +0 -107
  239. package/src/utils/atomic-write.ts +0 -33
@@ -1,261 +0,0 @@
1
- # pi-crew vs oh-my-pi: Agent Execution Architecture Comparison
2
-
3
- > **Ngày**: 2026-05-07
4
- > **Mục đích**: Tài liệu nghiên cứu để quyết định hybrid execution model
5
-
6
- ---
7
-
8
- ## 1. Kiến trúc execution hiện tại
9
-
10
- ### oh-my-pi: In-process
11
-
12
- ```
13
- User → TaskTool.execute()
14
- → mapWithConcurrencyLimit(tasks, maxConcurrency, runSubprocess)
15
- → Worker 1: createAgentSession() → session.prompt(task)
16
- → Worker 2: createAgentSession() → session.prompt(task)
17
- → Worker 3: createAgentSession() → session.prompt(task)
18
- → Collect results via EventBus subscription
19
- ```
20
-
21
- **Key files:**
22
- - `Source/oh-my-pi/packages/coding-agent/src/task/executor.ts` (1291 dòng) — `runSubprocess()`
23
- - `Source/oh-my-pi/packages/coding-agent/src/task/parallel.ts` — `mapWithConcurrencyLimit()` + `Semaphore`
24
- - `Source/oh-my-pi/packages/coding-agent/src/sdk.ts` — `createAgentSession()` factory
25
-
26
- **Flow chi tiết:**
27
- 1. `createAgentSession({ cwd, model, tools, systemPrompt, ... })` — tạo AgentSession mới
28
- 2. `session.prompt(task)` — gửi task text, agent loop chạy trong process
29
- 3. EventBus subscription lắng nghe events (tool_execution_start/end, message, yield)
30
- 4. Worker **phải** gọi `yield` tool đúng 1 lần → result extraction
31
- 5. Nếu không yield → gửi reminder prompt (tối đa 3 lần)
32
- 6. `session.waitForIdle()` → collect final result
33
-
34
- ### pi-crew: Child-process (default) + Live-session (in-process)
35
-
36
- ```
37
- User → team tool → handleRun()
38
- → executeTeamRun()
39
- → mapConcurrent(batchTasks, concurrency, runTeamTask)
40
- → Task 1: runChildPi() → spawn("pi", [...args]) → parse stdout JSONL
41
- → Task 2: runChildPi() → spawn("pi", [...args]) → parse stdout JSONL
42
- → Task 3: runLiveSession() → createAgentSession() → session.prompt()
43
- ```
44
-
45
- **Key files:**
46
- - `src/runtime/child-pi.ts` (458 dòng) — child process spawn + stdout capture
47
- - `src/runtime/live-session-runtime.ts` (245 dòng) — in-process execution via Pi SDK
48
- - `src/runtime/parallel-utils.ts` — `mapConcurrent()` worker pool
49
- - `src/runtime/runtime-resolver.ts` — chọn child-process vs live-session
50
-
51
- **2 execution modes:**
52
- | Mode | Khi nào dùng | File |
53
- |------|-------------|------|
54
- | `child-process` | Default, production | `child-pi.ts` |
55
- | `live-session` | Khi Pi host expose SDK | `live-session-runtime.ts` |
56
-
57
- ---
58
-
59
- ## 2. So sánh chi tiết
60
-
61
- ### 2.1 Performance & Overhead
62
-
63
- | Metric | oh-my-pi (in-process) | pi-crew (child-process) | pi-crew (live-session) |
64
- |--------|----------------------|------------------------|----------------------|
65
- | Worker startup | ~50ms (createAgentSession) | ~2-5s (spawn pi CLI) | ~50ms (createAgentSession) |
66
- | IPC overhead | Zero (function calls) | JSON parse mỗi line | Zero (function calls) |
67
- | MCP connections | Share parent's | Mỗi worker tự discover | Share parent's |
68
- | Memory per worker | ~10-50MB (AgentSession) | ~100-200MB (full pi process) | ~10-50MB |
69
- | Model registry | Shared | Separate | Shared |
70
-
71
- ### 2.2 Fault Isolation
72
-
73
- | Scenario | oh-my-pi | pi-crew (child-process) | pi-crew (live-session) |
74
- |----------|----------|------------------------|----------------------|
75
- | Worker throws unhandled | ❌ Crash toàn process | ✅ Chỉ worker chết | ❌ Crash toàn process |
76
- | Worker infinite loop | ❌ Block event loop | ✅ Timeout + kill | ❌ Block event loop |
77
- | Worker memory leak | ❌ Accumulate | ✅ OS cleanup khi exit | ❌ Accumulate |
78
- | Worker segfault | ❌ Process die | ✅ Isolated | ❌ Process die |
79
-
80
- ### 2.3 Result Collection
81
-
82
- | Aspect | oh-my-pi | pi-crew (child-process) | pi-crew (live-session) |
83
- |--------|----------|------------------------|----------------------|
84
- | Contract | Yield tool (mandatory, 1 lần) | Parse stdout JSONL (ad-hoc) | TBD (chưa enforce) |
85
- | Validation | JTD/JSON Schema on yield | Không có | TBD |
86
- | Reminder | 3 reminders nếu quên yield | Không có | Không có |
87
- | Extraction | SubprocessToolRegistry (extensible) | SubprocessToolRegistry (mới thêm) | SubprocessToolRegistry |
88
-
89
- ### 2.4 Communication
90
-
91
- | Channel | oh-my-pi | pi-crew |
92
- |---------|----------|---------|
93
- | Parent → Worker | `session.abort()`, AbortSignal | `child.kill()`, AbortSignal, stdin |
94
- | Worker → Parent | EventBus (in-process, typed channels) | stdout JSONL + RunEventBus (5 channels) |
95
- | Inter-agent | IRC tool (DM/broadcast) | Mailbox (task-scoped) |
96
- | Mid-turn steering | ✅ `session.abort()` + continue | ✅ Live-session: steer; Child: cancel only |
97
- | Progress | EventBus typed channels | RunEventBus typed channels |
98
-
99
- ### 2.5 Parallel Execution
100
-
101
- | Aspect | oh-my-pi | pi-crew |
102
- |--------|----------|---------|
103
- | Pool primitive | `Semaphore` (explicit acquire/release) | `mapConcurrent` (implicit worker pool) |
104
- | Fail-fast | `Promise.race([all, firstError])` | Worker loop + signal check |
105
- | Max concurrency | Config `task.maxConcurrency` | `MAX_PARALLEL_CONCURRENCY = 4` |
106
- | Cancellation | AbortSignal per worker | AbortSignal + cancel events |
107
- | Host dispatch | 1 call → N workers (in-process) | 1 call → N child processes hoặc `parallel` action |
108
-
109
- ---
110
-
111
- ## 3. pi-crew đã có gì từ oh-my-pi
112
-
113
- | Feature | oh-my-pi | pi-crew status |
114
- |---------|----------|---------------|
115
- | In-process execution | ✅ Core design | ✅ `live-session-runtime.ts` (đã có) |
116
- | Yield-based completion | ✅ Mandatory | ✅ `yield-handler.ts` (mới thêm, chưa enforce) |
117
- | SubprocessToolRegistry | ✅ Extensible | ✅ `subprocess-tool-registry.ts` (mới thêm) |
118
- | Typed event channels | ✅ 3 channels | ✅ 5 channels (mới thêm) |
119
- | Semaphore concurrency | ✅ Explicit | ✅ Via `mapConcurrent` |
120
- | MCP proxy tools | ✅ Share parent MCP | ❌ Mỗi worker tự discover |
121
- | IRC inter-agent | ✅ DM/broadcast | ❌ Chỉ mailbox |
122
- | Human-readable names | ✅ AdjectiveNoun | ✅ `task-name-generator.ts` |
123
- | Handlebars templates | ✅ | ❌ String concatenation |
124
- | FUSE/ProjFS isolation | ✅ 3 backends | ❌ Chỉ worktree |
125
-
126
- ## 4. pi-crew features mà oh-my-pi KHÔNG có
127
-
128
- | Feature | Detail |
129
- |---------|--------|
130
- | Process isolation | Child-process mode → fault boundary |
131
- | Crash recovery | Manifest + event sourcing → resume sau crash |
132
- | Adaptive planning | Planner agent quyết định fanout dynamically |
133
- | Policy engine | Configurable rules cho effectiveness, concurrency, etc. |
134
- | Deadletter tracking | Permanently failed task tracking |
135
- | Event log rotation | Auto-compact over 5MB/50k events |
136
- | Blob artifact store | SHA-256 content-addressed storage |
137
- | Hook lifecycle | 8/9 typed hooks with blocking support |
138
- | Incremental reader | Seek-based JSONL reading |
139
- | Parallel dispatch action | `team action='parallel'` for multi-task fanout |
140
-
141
- ---
142
-
143
- ## 5. Nghiên cứu tiếp theo
144
-
145
- ### 5.1 Hybrid model: Best of both worlds
146
-
147
- **Ý tưởng**: Chọn execution mode tự động per-task thay vì global config.
148
-
149
- ```
150
- executeTeamRun()
151
- → resolveCrewRuntime() → check live-session available
152
- → for each task:
153
- if (lightweight, trusted agent) → live-session (in-process, fast)
154
- if (heavy, untrusted, risky) → child-process (isolated, safe)
155
- ```
156
-
157
- **Implementation plan:**
158
- 1. Extend `runtime-resolver.ts` → per-task runtime selection
159
- 2. Add `agent.trustLevel` field → "trusted" (in-process) / "untrusted" (child-process)
160
- 3. Wire `live-session-runtime.ts` into `task-runner.ts` as alternative to `child-pi.ts`
161
- 4. Add fallback: if live-session crashes → retry with child-process
162
-
163
- ### 5.2 MCP proxy cho child-process mode
164
-
165
- Hiện mỗi child process tự discover MCP connections → chậm.
166
-
167
- **Ý tưởng**: Parent discover MCP → serialize config → pass cho child via env/args.
168
-
169
- ```
170
- Parent:
171
- mcpManager = discoverMCPConnections()
172
- mcpConfig = mcpManager.serialize()
173
- child = spawn("pi", [...args, `--mcp-config=${base64(mcpConfig)}`])
174
- ```
175
-
176
- ### 5.3 Yield enforcement cho live-session
177
-
178
- Live-session đã dùng `session.prompt()` nhưng chưa enforce yield.
179
-
180
- **Ý tưởng**:
181
- 1. Register `submit_result` as required tool khi tạo live-session
182
- 2. Sau `session.prompt()` + `waitForIdle()`, check yieldCalled
183
- 3. Nếu chưa yield → gửi reminder (giống oh-my-pi)
184
-
185
- ### 5.4 Semaphore thay mapConcurrent
186
-
187
- `mapConcurrent` hiện tại là simple worker pool. `Semaphore` explicit hơn cho:
188
- - Dynamic acquire/release
189
- - Rate limiting across multiple scheduling points
190
- - Priority queue (future)
191
-
192
- ### 5.5 Handlebars templates cho prompts
193
-
194
- Hiện `prompt-builder.ts` dùng string concatenation. Template engine sẽ dễ maintain:
195
- ```
196
- {{#if hasSkills}}
197
- ## Available Skills
198
- {{#each skills}}
199
- - {{name}}: {{description}}
200
- {{/each}}
201
- {{/if}}
202
- ```
203
-
204
- ### 5.6 IRC-style inter-agent messaging
205
-
206
- Hiện chỉ có mailbox (task-scoped). Cần thêm:
207
- - Broadcast: agent gửi message cho tất cả agents trong run
208
- - DM: agent gửi cho agent cụ thể
209
- - Pub/sub channel: subscribe theo topic
210
-
211
- ---
212
-
213
- ## 6. Decision matrix: Khi nào dùng mode nào
214
-
215
- | Criteria | child-process | live-session (in-process) |
216
- |----------|--------------|--------------------------|
217
- | Production safety | ✅ Preferred | ⚠️ Chỉ khi trust agents |
218
- | Speed critical tasks | ❌ Slow startup | ✅ Preferred |
219
- | Many parallel workers | ⚠️ Memory heavy | ✅ Lightweight |
220
- | Untrusted/third-party agents | ✅ Isolated | ❌ Never |
221
- | Debugging | ⚠️ Hard (separate process) | ✅ Easy (same process) |
222
- | Crash recovery | ✅ Manifest-based | ❌ State lost on crash |
223
- | MCP sharing | ❌ Separate discovery | ✅ Share parent's |
224
- | Steering mid-turn | ❌ Cancel only | ✅ Full control |
225
-
226
- **Recommended default**: child-process (safe) với opt-in live-session cho trusted agents.
227
-
228
- ---
229
-
230
- ## 7. Key source files cho reference
231
-
232
- ### oh-my-pi (Source/oh-my-pi/packages/coding-agent/src/)
233
- | File | Lines | Purpose |
234
- |------|-------|---------|
235
- | `task/executor.ts` | 1291 | In-process subagent execution |
236
- | `task/parallel.ts` | 100 | Semaphore + mapWithConcurrencyLimit |
237
- | `task/index.ts` | 1275 | Task tool entry point, parallel orchestration |
238
- | `task/subprocess-tool-registry.ts` | 80 | Extensible tool event handlers |
239
- | `task/types.ts` | 230 | Core types, event channel constants |
240
- | `sdk.ts` | 1900 | AgentSession factory |
241
- | `session/agent-session.ts` | 7500 | Core agent session (GOD OBJECT) |
242
- | `tools/yield.ts` | 170 | Submit result tool with schema validation |
243
- | `tools/irc.ts` | 250 | Inter-agent messaging |
244
- | `config/settings-schema.ts` | 2700 | Single source of truth cho all settings |
245
-
246
- ### pi-crew (pi-crew/src/)
247
- | File | Lines | Purpose |
248
- |------|-------|---------|
249
- | `runtime/child-pi.ts` | 458 | Child process execution |
250
- | `runtime/live-session-runtime.ts` | 245 | In-process execution via Pi SDK |
251
- | `runtime/runtime-resolver.ts` | 100 | Mode selection |
252
- | `runtime/parallel-utils.ts` | 100 | mapConcurrent worker pool |
253
- | `runtime/team-runner.ts` | 800 | Workflow scheduler |
254
- | `runtime/task-runner.ts` | 430 | Per-task execution |
255
- | `runtime/yield-handler.ts` | 100 | Yield-based completion |
256
- | `runtime/subprocess-tool-registry.ts` | 55 | Tool event handlers |
257
- | `ui/run-event-bus.ts` | 207 | Typed event channels |
258
- | `extension/team-tool/parallel-dispatch.ts` | 120 | Parallel action dispatcher |
259
- | `state/event-log-rotation.ts` | 115 | Event log compaction |
260
- | `utils/incremental-reader.ts` | 93 | Seek-based file reading |
261
- | `utils/task-name-generator.ts` | 224 | Human-readable task names |
@@ -1,111 +0,0 @@
1
- # Agent Lifecycle: pi-crew vs oh-my-pi
2
-
3
- ## Architecture Fundamental Difference
4
-
5
- | Aspect | oh-my-pi | pi-crew |
6
- |--------|----------|---------|
7
- | **Execution model** | In-process (`createAgentSession()`) | Child process (`child_process.spawn()`) |
8
- | **Agent tracking** | In-memory `Map<string, AgentRef>` | File-based `active-run-index.json` |
9
- | **Lifetime** = Process lifetime | ✅ Yes (GC + process exit cleans everything) | ❌ No (files persist after process exit) |
10
- | **Abort mechanism** | `AbortController` → `session.abort()` | File-based status + process kill |
11
-
12
- ## Edge Case Matrix
13
-
14
- ### Case 1: Normal session exit (user types /exit or Pi quits normally)
15
-
16
- | | oh-my-pi | pi-crew |
17
- |--|----------|---------|
18
- | **Path** | `shutdown()` → `dispose()` → `session_shutdown` event | Same — Pi calls `session_shutdown` → `cleanupRuntime()` |
19
- | **Subagents** | `session.dispose()` kills all in-process agents | `stopSessionBoundSubagents()` → `terminateActiveChildPiProcesses()` kills child procs |
20
- | **State cleanup** | In-memory Map → auto-clean by GC | **❌ `cleanupRuntime()` does NOT call `unregisterActiveRun()`** |
21
- | **Result** | ✅ Clean | ⚠️ Child procs killed, but active-run-index.json still has entries pointing to cancelled manifests |
22
-
23
- ### Case 2: SIGTERM (kill <pid>)
24
-
25
- | | oh-my-pi | pi-crew |
26
- |--|----------|---------|
27
- | **Path** | Signal handler → `shutdown()` → `dispose()` | Same — Pi calls `session_shutdown` |
28
- | **Result** | ✅ Clean | ⚠️ Same as Case 1 — child procs killed, index stale |
29
-
30
- ### Case 3: SIGINT (Ctrl+C)
31
-
32
- | | oh-my-pi | pi-crew |
33
- |--|----------|---------|
34
- | **Path** | Pi's Ctrl+C handler (not SIGINT signal) — asks confirm, then `shutdown()` | Same |
35
- | **Result** | ✅ Clean (if user confirms) | ⚠️ Same as Case 1 |
36
-
37
- ### Case 4: SIGKILL / kill -9 / taskkill /f
38
-
39
- | | oh-my-pi | pi-crew |
40
- |--|----------|---------|
41
- | **Path** | Process dies instantly. No handlers fire. | Same |
42
- | **Child processes** | In-process → die with parent ✅ | **❌ Child Pi processes become ORPHANS** |
43
- | **State** | In-memory → gone ✅ | **❌ active-run-index.json has zombie entries, manifests stuck at "running"** |
44
- | **Recovery** | Not needed | **Session start `purgeStaleActiveRunIndex()` + `cancelOrphanedRuns()`** — NOW implemented ✅ |
45
-
46
- ### Case 5: Terminal closed (SIGHUP / window X button)
47
-
48
- | | oh-my-pi | pi-crew |
49
- |--|----------|---------|
50
- | **Path** | `emergencyTerminalExit()` → `killTrackedDetachedChildren()` → `process.exit(129)` | Same |
51
- | **Extension events** | **❌ `session_shutdown` NOT fired** | **❌ `cleanupRuntime()` NOT called** |
52
- | **Child processes** | In-process → die ✅ | **❌ Child procs NOT killed** (only `killTrackedDetachedChildren()` which is Pi's own tracked children, not pi-crew's) |
53
- | **Result** | ✅ Clean (in-process) | **❌ Total zombie — child procs alive, index stale, manifests stuck** |
54
-
55
- ### Case 6: Computer crash / power loss
56
-
57
- | | oh-my-pi | pi-crew |
58
- |--|----------|---------|
59
- | **Result** | ✅ Clean (everything in-memory) | **❌ File-based state corrupted/inconsistent** |
60
-
61
- ### Case 7: Out of Memory (OOM kill)
62
-
63
- | | oh-my-pi | pi-crew |
64
- |--|----------|---------|
65
- | **Result** | Same as SIGKILL | Same as SIGKILL |
66
-
67
- ### Case 8: Node.js uncaught exception
68
-
69
- | | oh-my-pi | pi-crew |
70
- |--|----------|---------|
71
- | **Path** | Depends on Pi's uncaughtException handler | Same |
72
- | **Result** | In-process agents may leak | **❌ Child procs may survive as orphans** |
73
-
74
- ### Case 9: Test runs that create state
75
-
76
- | | oh-my-pi | pi-crew |
77
- |--|----------|---------|
78
- | **State creation** | No persistent state | `createRunManifest()` + `registerActiveRun()` |
79
- | **Cleanup** | Automatic (in-process) | **❌ Many tests don't call `unregisterActiveRun()`** |
80
- | **Result** | ✅ Clean | **❌ active-run-index.json accumulates test garbage** |
81
-
82
- ## Summary: What's Fixed and What's Not
83
-
84
- ### Fixed in this session:
85
- 1. ✅ `purgeStaleActiveRunIndex()` — scans global active-run-index at session_start AND cleanupRuntime
86
- 2. ✅ Removes entries with: missing manifest, missing cwd, terminal status, dead PID + stale
87
- 3. ✅ `cancelOrphanedRuns()` — cancels project-scoped orphaned runs
88
- 4. ✅ **`parent-guard.ts`** — workers self-monitor parent PID, auto-exit if parent dies
89
- 5. ✅ **`PI_CREW_PARENT_PID`** env var injected into all child spawns (child-pi + async-runner)
90
- 6. ✅ **`background-runner.ts`** calls `startParentGuard()` at startup
91
- 7. ✅ **`cleanupRuntime()`** now calls `purgeStaleActiveRunIndex()` on session end
92
- 8. ✅ **`executeTeamRun`** wrapped in try/catch — unhandled errors set manifest to "failed"
93
-
94
- ### What oh-my-pi does that pi-crew can never match:
95
- - oh-my-pi agents are **in-process** → process death = guaranteed cleanup
96
- - pi-crew agents are **child processes** → parent-guard + stale purge covers all cases
97
-
98
- ## The parent-guard solution
99
-
100
- ```
101
- Parent Pi process (PID 100)
102
- ├── background-runner.ts (PID 200) ← env PI_CREW_PARENT_PID=100
103
- │ ├── startParentGuard(100) ← polls every 3s: is PID 100 alive?
104
- │ ├── ... runs workflow ...
105
- │ └── if PID 100 dies → process.exit(124) ← SELF-TERMINATE
106
- └── child-pi.ts worker (PID 300) ← env PI_CREW_PARENT_PID=100
107
- └── (Pi itself checks PI_CREW_PARENT_PID in its own entry point)
108
- ```
109
-
110
- **Key**: Workers check parent liveness THEMSELVES. No external sentinel needed.
111
- If parent dies (SIGKILL, crash, power loss) → workers detect within 3s and exit.
@@ -1,261 +0,0 @@
1
- # 🔍 Oh-My-Pi Codebase Deep Audit
2
-
3
- > **Ngày**: 2026-05-07
4
- > **Phiên bản**: v14.7.3 (`e8caad723`)
5
- > **Codebase**: `source/oh-my-pi/` — chủ yếu `packages/coding-agent/src/`
6
-
7
- ---
8
-
9
- ## 1. Tổng quan Architecture
10
-
11
- ### End-to-End Flow
12
-
13
- ```
14
- User Prompt → Main AgentSession → TaskTool.execute()
15
- ├── discoverAgents() → merge bundled + user + project agents
16
- ├── validate agent, check disabled/spawns
17
- ├── allocate unique IDs (AgentOutputManager)
18
- ├── For each task:
19
- │ ├── If isolated → create worktree/overlay → runSubprocess()
20
- │ └── If not → runSubprocess() in same cwd
21
- │ ├── createAgentSession() → new in-process AgentSession
22
- │ ├── Subscribe to AgentEvents → progress tracking
23
- │ ├── session.prompt(task) → agent loop runs
24
- │ ├── Wait for yield tool call (3 retries)
25
- │ └── Return SingleResult
26
- └── Merge results (patch apply or branch merge)
27
- ```
28
-
29
- ### Quyết định kiến trúc chính
30
-
31
- 1. **In-process subagents**: Chạy subagent như `AgentSession` instances trong cùng process. Tránh IPC overhead, cho phép sharing MCP connections, settings, model registry.
32
-
33
- 2. **Yield-based completion**: Subagent **phải** gọi `yield` tool đúng 1 lần. Executor gửi tối đa 3 reminders nếu agent thoát mà không yield. Contract mạnh — ngăn agent "quên" return results.
34
-
35
- 3. **Isolation backends**: 3 mode — `worktree` (git worktree), `fuse-overlay` (COW overlayfs Unix), `fuse-projfs` (ProjFS Windows). Mỗi isolated task có sandboxed filesystem view.
36
-
37
- 4. **EventBus pub/sub**: 3 channel — `task:subagent:event` (raw events), `task:subagent:progress` (aggregated), `task:subagent:lifecycle` (start/end). Decouple UI rendering từ execution.
38
-
39
- 5. **Agent discovery cascade**: Bundled → user (`~/.omp/agent/agents/*.md`) → project (`.omp/agents/*.md`) → Claude Code marketplace plugins. First name match wins.
40
-
41
- ---
42
-
43
- ## 2. Key Files & Responsibilities
44
-
45
- ### Task System Core
46
-
47
- | File | ~Lines | Responsibility |
48
- |------|--------|----------------|
49
- | `task/index.ts` | ~750 | **TaskTool class** — entry point. Agent discovery, validation, parallel execution orchestration, isolation/merge, result formatting |
50
- | `task/executor.ts` | ~620 | **runSubprocess()** — chạy 1 subagent in-process. Progress tracking, yield handling, usage accumulation, MCP proxy tools |
51
- | `task/types.ts` | ~230 | Core types: `AgentDefinition`, `AgentProgress`, `SingleResult`, `TaskParams`, `TaskToolDetails`, event channel constants |
52
- | `task/agents.ts` | ~150 | Bundled agent definitions (explore, plan, designer, reviewer, librarian, task, quick_task). Parses from embedded markdown + frontmatter |
53
- | `task/discovery.ts` | ~130 | Agent discovery từ filesystem. Merge user/project/bundled/Claude plugin agents với precedence rules |
54
- | `task/parallel.ts` | ~100 | `mapWithConcurrencyLimit()` — worker pool với fail-fast. `Semaphore` cho async concurrency control |
55
- | `task/worktree.ts` | ~580 | Git worktree creation/cleanup, baseline capture, patch generation/apply, branch commit/merge, nested repo handling |
56
- | `task/render.ts` | ~1020 | TUI rendering cho task tool — call preview, result display, progress indicators, tree view, review finding badges |
57
- | `task/template.ts` | ~40 | Renders context + assignment thành full subagent prompt dùng Handlebars templates |
58
- | `task/subprocess-tool-registry.ts` | ~80 | Registry pattern cho extracting data từ tool events (yield, report_finding). Extensible handler system |
59
- | `task/output-manager.ts` | ~100 | Sequential ID allocation với parent prefix support (e.g., `0-Auth.1-Subtask`). Scans existing artifacts on resume |
60
- | `task/simple-mode.ts` | ~35 | Three modes: `default` (context + schema), `schema-free` (context only), `independent` (neither) |
61
- | `task/isolation-backend.ts` | ~100 | Platform detection cho isolation mode (Win/Unix/ARM64), probe ProjFS availability |
62
- | `task/name-generator.ts` | ~340 | AdjectiveNoun generator (426,710 combinations) cho human-readable task names |
63
-
64
- ### Session & Agent Runtime
65
-
66
- | File | ~Lines | Responsibility |
67
- |------|--------|----------------|
68
- | `session/agent-session.ts` | **~7500** | **Core agent session** — model management, tool dispatch, streaming, compaction, bash execution, extension runner. **GOD OBJECT** — quá lớn |
69
- | `sdk.ts` | ~1900 | Factory cho `AgentSession` and `SessionManager`. Loads tools, skills, extensions, MCP, slash commands |
70
- | `registry/agent-registry.ts` | ~140 | Process-global registry của live agent sessions. Dùng bởi IRC tool cho peer discovery |
71
-
72
- ### Tools
73
-
74
- | File | ~Lines | Responsibility |
75
- |------|--------|----------------|
76
- | `tools/irc.ts` | ~250 | IRC tool — agent-to-agent messaging. DM/broadcast với optional reply qua `respondAsBackground()` |
77
- | `tools/yield.ts` | ~170 | Submit result tool. JTD/JSON Schema validation với override sau first failure. Registers subprocess handler |
78
- | `tools/review.ts` | ~240 | `report_finding` tool cho structured code review. Priority (P0-P3), file/line tracking |
79
-
80
- ### UI Components
81
-
82
- | File | ~Lines | Responsibility |
83
- |------|--------|----------------|
84
- | `modes/components/agent-dashboard.ts` | ~900 | Interactive agent management: enable/disable, model overrides, AI-powered agent creation |
85
- | `modes/components/session-observer-overlay.ts` | ~650 | Real-time subagent transcript viewer với expand/collapse, breadcrumb navigation, incremental file reading |
86
- | `modes/session-observer-registry.ts` | ~140 | Tracks observable sessions, subscribes to EventBus cho lifecycle/progress updates |
87
-
88
- ### Configuration
89
-
90
- | File | ~Lines | Responsibility |
91
- |------|--------|----------------|
92
- | `config/settings-schema.ts` | ~2700 | Single source of truth cho all settings. Typed schema với UI metadata, tabs, conditions |
93
- | `config/model-resolver.ts` | — | Model pattern resolution (agent → settings → session → fallback) |
94
-
95
- ### Tool Discovery
96
-
97
- | File | ~Lines | Responsibility |
98
- |------|--------|----------------|
99
- | `tool-discovery/tool-index.ts` | ~400 | BM25-based search index over all tools. Generic `DiscoverableTool` type covers builtin, MCP, extension, custom sources |
100
-
101
- ---
102
-
103
- ## 3. Patterns đáng học hỏi cho pi-crew
104
-
105
- ### 3.1 Yield-Based Completion Contract
106
- **File**: `tools/yield.ts`, `task/executor.ts` (lines ~380-420)
107
-
108
- Subagent **phải** gọi `yield` đúng 1 lần. Executor:
109
- 1. Detects `yield` qua `subprocessToolRegistry` handler
110
- 2. Sends up to 3 reminder prompts nếu agent exits without yielding
111
- 3. Extracts và validates structured data từ yield result
112
- 4. Falls back to raw output parsing nếu no yield
113
-
114
- **pi-crew takeaway**: Result collection hiện tại ad-hoc. Formal "submit result" tool với schema validation + retry reminders sẽ tăng reliability đáng kể.
115
-
116
- ### 3.2 SubprocessToolRegistry — Extensible Tool Event Handling
117
- **File**: `task/subprocess-tool-registry.ts`
118
-
119
- Tools register handlers cho:
120
- - `extractData()` — pull structured data từ tool results
121
- - `shouldTerminate()` — signal agent completion
122
- - `renderInline()` / `renderFinal()` — custom TUI rendering
123
-
124
- **pi-crew takeaway**: Worker result extraction có thể dùng registry pattern tương tự, cho phép different tool types contribute structured data without coupling to executor.
125
-
126
- ### 3.3 EventBus Pub/Sub cho Progress
127
- **File**: `task/types.ts` (channel constants), `task/executor.ts` (emission)
128
-
129
- 3 dedicated channels với typed payloads tách biệt raw events, aggregated progress, lifecycle transitions. Cho phép:
130
- - Multiple UI components subscribe independently
131
- - Session observer gets updates without polling
132
- - Clean separation of concerns
133
-
134
- **pi-crew takeaway**: pi-crew đã có `RunEventBus` (từ Phase 1), nhưng chưa có typed channels. Có thể tách thành `worker:progress`, `worker:lifecycle`, `worker:stream`.
135
-
136
- ### 3.4 Isolation Backends — FUSE/ProjFS
137
- **File**: `task/isolation-backend.ts`, `task/worktree.ts`
138
-
139
- 3 isolation modes:
140
- - `worktree` — git worktree per task (cross-platform)
141
- - `fuse-overlay` — Copy-on-Write overlayfs (Unix)
142
- - `fuse-projfs` — Windows ProjFS
143
-
144
- **pi-crew takeaway**: Chỉ có worktree. Thêm FUSE/ProjFS isolation cho environments cần true filesystem isolation.
145
-
146
- ### 3.5 Agent Dashboard — Interactive Configuration UI
147
- **File**: `modes/components/agent-dashboard.ts` (~900 lines)
148
-
149
- Full interactive UI cho agent management:
150
- - Enable/disable agents
151
- - Model override per agent
152
- - AI-powered agent creation (nhập description → generate agent)
153
- - Source filtering (builtin/user/project)
154
-
155
- **pi-crew takeaway**: pi-crew đã có `agent-management-overlay.ts` (read-only). Cần thêm enable/disable toggle + model override editing.
156
-
157
- ### 3.6 Session Observer — Incremental Transcript Reading
158
- **File**: `modes/components/session-observer-overlay.ts` (~650 lines)
159
-
160
- - Incremental JSONL reading (không load toàn bộ file)
161
- - Expand/collapse per entry
162
- - Breadcrumb navigation cho nested subagent transcripts
163
- - Auto-scroll to bottom unless user scrolled up
164
-
165
- **pi-crew takeaway**: pi-crew đã có `transcript-entries.ts`. Cần thêm breadcrumb navigation + incremental reading.
166
-
167
- ### 3.7 Name Generator — Human-Readable Task Names
168
- **File**: `task/name-generator.ts` (~340 lines)
169
-
170
- `AdjectiveNoun` generator → 426,710 combinations. Thay vì `task_01`, dùng `BraveFalcon`. Dễ nhận diện trong UI.
171
-
172
- **pi-crew takeaway**: pi-crew dùng task IDs như `01_discover`. Human-readable names sẽ tốt hơn cho UX.
173
-
174
- ### 3.8 Semaphore Concurrency Control
175
- **File**: `task/parallel.ts`
176
-
177
- ```typescript
178
- class Semaphore {
179
- private queue: (() => void)[] = [];
180
- private running = 0;
181
- constructor(private max: number) {}
182
- async acquire(): Promise<void> { ... }
183
- release(): void { ... }
184
- }
185
- ```
186
-
187
- Clean async concurrency primitive. pi-crew dùng `mapConcurrent` từ `parallel-utils.ts` — tương đương nhưng Semaphore explicit hơn.
188
-
189
- ### 3.9 Handlebars Template Rendering
190
- **File**: `task/template.ts`
191
-
192
- Handlebars templates cho subagent prompts. Cho phép customization dễ dàng.
193
-
194
- **pi-crew takeaway**: pi-crew dùng string concatenation trong `prompt-builder.ts`. Templates sẽ dễ maintain hơn.
195
-
196
- ### 3.10 MCP Proxy Tools
197
- **File**: `task/executor.ts` (~line 280)
198
-
199
- Subagents reuse parent's MCP connections qua `createMCPProxyTools()`. Tránh mỗi subagent phải setup riêng.
200
-
201
- **pi-crew takeaway**: pi-crew chưa có MCP proxy. Mỗi child Pi process tự discover MCP connections. Thêm proxy sẽ giảm startup time.
202
-
203
- ---
204
-
205
- ## 4. Anti-patterns & Vấn đề trong oh-my-pi
206
-
207
- ### 4.1 God Object — `agent-session.ts` (~7500 lines)
208
- Một file duy nhất chứa model management, tool dispatch, streaming, compaction, bash execution, extension runner. Quá khó maintain. Nên tách thành multiple modules.
209
-
210
- ### 4.2 No Process Isolation
211
- Crashed subagent → potential full process crash. Không có fault boundary. pi-crew's child process approach an toàn hơn cho production.
212
-
213
- ### 4.3 Settings Schema Monolith — `settings-schema.ts` (~2700 lines)
214
- Single source of truth cho all settings, nhưng 2700 dòng là quá lớn. Nên tách theo domain (agent settings, UI settings, task settings, etc.).
215
-
216
- ### 4.4 Hardcoded Bundled Agents
217
- `task/agents.ts` embeds agent definitions as multiline string literals. Khó edit, khó test. pi-crew's file-based approach (agents/*.md) linh hoạt hơn.
218
-
219
- ---
220
-
221
- ## 5. Recent Changes (git log)
222
-
223
- ```
224
- e8caad723 feat: v14.7.3
225
- ... (56 commits since v14.6.6)
226
- ```
227
-
228
- Key changes since last review:
229
- - Isolation backend improvements (ProjFS support)
230
- - Agent dashboard UI enhancements
231
- - Yield tool schema validation improvements
232
- - IRC tool anti-deadlock side-channel
233
- - Session observer incremental reading
234
- - BM25 tool discovery index
235
-
236
- ---
237
-
238
- ## 6. Feature Matrix (so với pi-crew)
239
-
240
- | Feature | oh-my-pi | pi-crew | Gap |
241
- |---------|:--------:|:-------:|-----|
242
- | In-process execution | ✅ | ❌ | pi-crew dùng child process |
243
- | Process isolation | ❌ | ✅ | oh-my-pi crash cascade risk |
244
- | Yield tool enforcement | ✅ | ❌ | pi-crew cần implement |
245
- | IRC messaging | ✅ | ❌ | pi-crew chỉ có mailbox |
246
- | Broadcast messaging | ✅ | ❌ | pi-crew không có |
247
- | Steering mid-turn | ✅ | ❌ | pi-crew chỉ cancel/respond |
248
- | EventBus typed channels | ✅ | 🔶 | pi-crew có RunEventBus nhưng chưa typed |
249
- | FUSE/ProjFS isolation | ✅ | ❌ | pi-crew chỉ worktree |
250
- | Agent dashboard UI | ✅ | 🔶 | pi-crew có read-only overlay |
251
- | Session observer | ✅ | 🔶 | pi-crew có transcript-entries |
252
- | MCP proxy | ✅ | ❌ | pi-crew mỗi child tự discover |
253
- | Human-readable task names | ✅ | ❌ | pi-crew dùng IDs |
254
- | Handlebars templates | ✅ | ❌ | pi-crew dùng string concat |
255
- | Adaptive planning | ❌ | ✅ | oh-my-pi không có |
256
- | Retry policy | ❌ | ✅ | oh-my-pi chỉ yield reminder |
257
- | Policy engine | ❌ | ✅ | oh-my-pi không có |
258
- | Crash recovery | ❌ | ✅ | oh-my-pi không có |
259
- | Dependency context | ❌ | ✅ | oh-my-pi chỉ context.md |
260
- | Effectiveness guard | ❌ | ✅ | oh-my-pi không có |
261
- | Deadletter tracking | ❌ | ✅ | oh-my-pi không có |