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.
- package/CHANGELOG.md +56 -1
- package/README.md +176 -781
- 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 +70 -11
- package/agents/writer.md +11 -11
- package/docs/actions-reference.md +595 -0
- package/docs/commands-reference.md +347 -0
- package/docs/runtime-flow.md +148 -148
- package/index.ts +6 -6
- package/package.json +99 -99
- package/skills/async-worker-recovery/SKILL.md +42 -42
- package/skills/context-artifact-hygiene/SKILL.md +52 -52
- package/skills/delegation-patterns/SKILL.md +54 -54
- package/skills/mailbox-interactive/SKILL.md +40 -40
- package/skills/model-routing-context/SKILL.md +39 -39
- package/skills/multi-perspective-review/SKILL.md +58 -58
- package/skills/observability-reliability/SKILL.md +41 -41
- package/skills/orchestration/SKILL.md +157 -157
- package/skills/ownership-session-security/SKILL.md +41 -41
- package/skills/pi-extension-lifecycle/SKILL.md +39 -39
- package/skills/requirements-to-task-packet/SKILL.md +63 -63
- package/skills/resource-discovery-config/SKILL.md +41 -41
- package/skills/runtime-state-reader/SKILL.md +44 -44
- package/skills/secure-agent-orchestration-review/SKILL.md +45 -45
- package/skills/state-mutation-locking/SKILL.md +42 -42
- package/skills/systematic-debugging/SKILL.md +67 -67
- package/skills/ui-render-performance/SKILL.md +39 -39
- package/skills/verification-before-done/SKILL.md +57 -57
- package/skills/worktree-isolation/SKILL.md +39 -39
- package/src/adapters/claude-adapter.ts +25 -0
- package/src/adapters/codex-adapter.ts +21 -0
- package/src/adapters/cursor-adapter.ts +17 -0
- package/src/adapters/export-util.ts +137 -0
- package/src/adapters/index.ts +15 -0
- package/src/adapters/registry.ts +18 -0
- package/src/adapters/types.ts +23 -0
- package/src/agents/agent-config.ts +2 -0
- package/src/agents/agent-search.ts +98 -98
- package/src/agents/discover-agents.ts +2 -1
- package/src/config/config.ts +13 -1
- package/src/config/drift-detector.ts +211 -0
- package/src/config/markers.ts +327 -0
- package/src/config/resilient-parser.ts +108 -0
- package/src/config/suggestions.ts +74 -0
- package/src/extension/cross-extension-rpc.ts +103 -94
- package/src/extension/project-init.ts +21 -1
- package/src/extension/register.ts +45 -14
- package/src/extension/registration/commands.ts +77 -8
- package/src/extension/registration/subagent-tools.ts +10 -1
- package/src/extension/registration/team-tool.ts +10 -1
- package/src/extension/registration/viewers.ts +48 -34
- package/src/extension/run-bundle-schema.ts +89 -89
- package/src/extension/run-import.ts +25 -1
- package/src/extension/run-index.ts +5 -1
- package/src/extension/run-maintenance.ts +142 -68
- package/src/extension/team-manager-command.ts +10 -1
- package/src/extension/team-tool/doctor.ts +28 -3
- package/src/extension/team-tool/handle-settings.ts +195 -188
- package/src/extension/team-tool/inspect.ts +41 -41
- package/src/extension/team-tool/intent-policy.ts +42 -42
- package/src/extension/team-tool/lifecycle-actions.ts +27 -8
- package/src/extension/team-tool/plan.ts +19 -19
- package/src/extension/team-tool/run.ts +12 -1
- package/src/extension/team-tool.ts +11 -1
- package/src/i18n.ts +184 -184
- package/src/observability/exporters/otlp-exporter.ts +92 -77
- package/src/prompt/prompt-runtime.ts +72 -72
- package/src/runtime/agent-memory.ts +72 -72
- package/src/runtime/agent-observability.ts +114 -114
- package/src/runtime/async-marker.ts +26 -26
- package/src/runtime/attention-events.ts +28 -28
- package/src/runtime/auto-resume.ts +100 -0
- package/src/runtime/background-runner.ts +11 -1
- package/src/runtime/cancellation-token.ts +89 -89
- package/src/runtime/cancellation.ts +61 -61
- package/src/runtime/capability-inventory.ts +116 -116
- package/src/runtime/child-pi.ts +7 -2
- package/src/runtime/compaction-summary.ts +271 -0
- package/src/runtime/completion-guard.ts +190 -190
- package/src/runtime/crash-recovery.ts +33 -0
- package/src/runtime/delta-conflict.ts +360 -0
- package/src/runtime/direct-run.ts +35 -35
- package/src/runtime/foreground-control.ts +82 -82
- package/src/runtime/green-contract.ts +46 -46
- package/src/runtime/group-join.ts +106 -106
- package/src/runtime/heartbeat-gradient.ts +28 -28
- package/src/runtime/heartbeat-watcher.ts +124 -124
- package/src/runtime/iteration-hooks.ts +262 -0
- package/src/runtime/live-agent-control.ts +88 -88
- package/src/runtime/live-control-realtime.ts +36 -36
- package/src/runtime/live-extension-bridge.ts +150 -150
- package/src/runtime/live-irc.ts +92 -92
- package/src/runtime/live-session-health.ts +100 -100
- package/src/runtime/loop-gates.ts +129 -0
- package/src/runtime/metric-parser.ts +40 -0
- package/src/runtime/notebook-helpers.ts +90 -90
- package/src/runtime/orphan-sentinel.ts +7 -7
- package/src/runtime/parallel-research.ts +44 -44
- package/src/runtime/phase-progress.ts +217 -0
- package/src/runtime/pi-args.ts +38 -11
- package/src/runtime/pi-json-output.ts +111 -111
- package/src/runtime/pi-spawn.ts +57 -7
- package/src/runtime/policy-engine.ts +79 -79
- package/src/runtime/post-checks.ts +122 -0
- package/src/runtime/progress-event-coalescer.ts +43 -43
- package/src/runtime/prose-compressor.ts +164 -164
- package/src/runtime/recovery-recipes.ts +74 -74
- package/src/runtime/result-extractor.ts +121 -121
- package/src/runtime/role-permission.ts +39 -39
- package/src/runtime/sensitive-paths.ts +2 -2
- package/src/runtime/session-resources.ts +25 -25
- package/src/runtime/session-snapshot.ts +59 -59
- package/src/runtime/session-usage.ts +79 -79
- package/src/runtime/sidechain-output.ts +29 -29
- package/src/runtime/stream-preview.ts +177 -177
- package/src/runtime/supervisor-contact.ts +59 -59
- package/src/runtime/task-display.ts +38 -38
- package/src/runtime/task-graph.ts +207 -0
- package/src/runtime/task-quality.ts +207 -0
- package/src/runtime/task-runner/capabilities.ts +78 -78
- package/src/runtime/task-runner/live-executor.ts +7 -1
- package/src/runtime/task-runner/progress.ts +119 -119
- package/src/runtime/task-runner/prompt-pipeline.ts +64 -64
- package/src/runtime/task-runner/result-utils.ts +14 -14
- package/src/runtime/task-runner/run-projection.ts +103 -103
- package/src/runtime/task-runner/state-helpers.ts +22 -22
- package/src/runtime/team-runner.ts +117 -7
- package/src/runtime/worker-heartbeat.ts +21 -21
- package/src/runtime/worker-startup.ts +57 -57
- package/src/runtime/workflow-state.ts +187 -0
- package/src/runtime/workspace-tree.ts +298 -298
- package/src/schema/config-schema.ts +11 -0
- package/src/schema/validation-types.ts +148 -0
- package/src/skills/skill-templates.ts +374 -0
- package/src/state/active-run-registry.ts +35 -11
- package/src/state/atomic-write.ts +33 -26
- package/src/state/contracts.ts +1 -0
- package/src/state/event-reconstructor.ts +217 -0
- package/src/state/locks.ts +2 -13
- package/src/state/mailbox.ts +4 -3
- package/src/state/state-store.ts +32 -14
- package/src/state/task-claims.ts +44 -44
- package/src/state/types.ts +9 -0
- package/src/state/usage.ts +29 -29
- package/src/subagents/async-entry.ts +1 -1
- package/src/subagents/index.ts +3 -3
- package/src/subagents/live/control.ts +1 -1
- package/src/subagents/live/manager.ts +1 -1
- package/src/subagents/live/realtime.ts +1 -1
- package/src/subagents/live/session-runtime.ts +1 -1
- package/src/subagents/manager.ts +1 -1
- package/src/subagents/spawn.ts +1 -1
- package/src/teams/team-serializer.ts +38 -38
- package/src/types/diff.d.ts +18 -18
- package/src/ui/crew-footer.ts +101 -101
- package/src/ui/crew-select-list.ts +111 -111
- package/src/ui/crew-widget.ts +5 -2
- package/src/ui/dashboard-panes/cancellation-pane.ts +42 -42
- package/src/ui/dashboard-panes/capability-pane.ts +59 -59
- package/src/ui/dashboard-panes/mailbox-pane.ts +35 -35
- package/src/ui/dashboard-panes/metrics-pane.ts +34 -34
- package/src/ui/dashboard-panes/progress-pane.ts +11 -0
- package/src/ui/dynamic-border.ts +25 -25
- package/src/ui/layout-primitives.ts +106 -106
- package/src/ui/loaders.ts +158 -158
- package/src/ui/render-coalescer.ts +51 -51
- package/src/ui/render-diff.ts +119 -119
- package/src/ui/render-scheduler.ts +143 -143
- package/src/ui/run-action-dispatcher.ts +10 -1
- package/src/ui/spinner.ts +17 -17
- package/src/ui/status-colors.ts +58 -58
- package/src/ui/syntax-highlight.ts +116 -116
- package/src/ui/transcript-entries.ts +258 -258
- package/src/utils/completion-dedupe.ts +63 -63
- package/src/utils/frontmatter.ts +68 -68
- package/src/utils/git.ts +262 -262
- package/src/utils/ids.ts +17 -17
- package/src/utils/incremental-reader.ts +104 -104
- package/src/utils/names.ts +27 -27
- package/src/utils/redaction.ts +44 -44
- package/src/utils/safe-paths.ts +47 -47
- package/src/utils/scan-cache.ts +136 -136
- package/src/utils/sleep.ts +40 -26
- package/src/utils/task-name-generator.ts +337 -337
- package/src/workflows/validate-workflow.ts +40 -40
- package/src/worktree/branch-freshness.ts +45 -45
- package/teams/default.team.md +12 -12
- package/teams/fast-fix.team.md +11 -11
- package/teams/implementation.team.md +18 -18
- package/teams/parallel-research.team.md +14 -14
- package/teams/research.team.md +11 -11
- package/teams/review.team.md +12 -12
- package/workflows/default.workflow.md +30 -29
- package/workflows/fast-fix.workflow.md +23 -22
- package/workflows/implementation.workflow.md +43 -43
- package/workflows/parallel-research.workflow.md +46 -46
- package/workflows/research.workflow.md +22 -22
- package/workflows/review.workflow.md +30 -30
- package/docs/refactor-tasks-phase3.md +0 -394
- package/docs/refactor-tasks-phase4.md +0 -564
- package/docs/refactor-tasks-phase5.md +0 -402
- package/docs/refactor-tasks-phase6.md +0 -662
- package/docs/refactor-tasks.md +0 -1484
- package/docs/research/AGENT-EXECUTION-ARCHITECTURE.md +0 -261
- package/docs/research/AGENT-LIFECYCLE-COMPARISON.md +0 -111
- package/docs/research/AUDIT_OH_MY_PI.md +0 -261
- package/docs/research/AUDIT_PI_CREW.md +0 -457
- package/docs/research/CAVEMAN-DEEP-RESEARCH.md +0 -281
- package/docs/research/COMPARISON_OH_MY_PI_VS_PI_CREW.md +0 -264
- package/docs/research/DEEP-RESEARCH-PI-POWERBAR.md +0 -343
- package/docs/research/DEEP_RESEARCH_SUBAGENT_ARCHITECTURE.md +0 -480
- package/docs/research/GAP_CLOSURE_IMPLEMENTATION_PLAN.md +0 -354
- package/docs/research/IMPLEMENTATION_PLAN.md +0 -385
- package/docs/research/LIVE-SESSION-PRODUCTION-READY-PLAN.md +0 -502
- package/docs/research/OH-MY-PI-DEEP-RESEARCH-v14.7.6.md +0 -266
- package/docs/research/REMAINING-GAPS-PLAN.md +0 -363
- package/docs/research/SESSION-SUMMARY-2026-05-08.md +0 -146
- package/docs/research/UI-RESPONSIVENESS-AUDIT.md +0 -173
- package/docs/research-awesome-agent-skills-distillation.md +0 -100
- package/docs/research-extension-examples.md +0 -297
- package/docs/research-extension-system.md +0 -324
- package/docs/research-oh-my-pi-distillation.md +0 -369
- package/docs/research-optimization-plan.md +0 -548
- package/docs/research-phase10-distillation.md +0 -199
- package/docs/research-phase11-distillation.md +0 -201
- package/docs/research-phase8-operator-experience-plan.md +0 -819
- package/docs/research-phase9-observability-reliability-plan.md +0 -1190
- package/docs/research-pi-coding-agent.md +0 -357
- package/docs/research-source-pi-crew-reference.md +0 -174
- package/docs/research-ui-optimization-plan.md +0 -480
- package/docs/source-runtime-refactor-map.md +0 -107
- 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ó |
|