239 lines
11 KiB
Markdown
239 lines
11 KiB
Markdown
# Task Handoff: executor.ts + pi-runtime.ts Split
|
|
|
|
## Context
|
|
|
|
Du arbeitest im Repo `/home/cynar/Projects/evOo-local`.
|
|
|
|
Es gibt 10 bereits erstellte Module-Files, die extrahierte Funktionen enthalten. Der Original-File enthält aber noch **Duplikate** derselben Funktionen. Ziel: die Definitionen aus den Original-Files entfernen, Imports + Re-Exports hinzufügen.
|
|
|
|
## Module Files (bereits vorhanden, NICHT löschen)
|
|
|
|
### executor-*.ts (im Verzeichnis `packages/adapters/src/`):
|
|
| File | Line count | Exports |
|
|
|------|-----------|---------|
|
|
| `executor-types.ts` | 50 | `ExecutorDeps` (interface) |
|
|
| `executor-attachments.ts` | 43 | `TURN_ATTACHMENT_UNAVAILABLE`, `STEERING_ATTACHMENT_UNAVAILABLE`, `missingTurnImagesInstruction`, `settleSteeringAttachmentLoads` |
|
|
| `executor-checkpoint.ts` | 23 | `createRunWorkspaceCheckpoint` |
|
|
| `executor-shell-guard.ts` | 177 | `isProtectedComputerLifecycleCommand` |
|
|
| `executor-effects.ts` | 151 | `recordEffect`, `completeEffect`, `uncertainEffectError` |
|
|
| `executor-completion.ts` | 65 | `completionMessageSegments`, `completionNotificationBody`, `completionMarksUnread`, `threadContextForRun`, `subagentMarksUnread` |
|
|
| `executor-model.ts` | 207 | `deploymentKeyFor`, `resolveModelKey`, `withModelCredentialLock` |
|
|
| `executor-utils.ts` | 63 | `selectRunConnections`, `loadCurrentTurnImages` |
|
|
| `executor-tools.ts` | 58 | `PAGE_BROWSER_TOOL_NAMES`, `filterPageBrowserTools`, `selectBuiltinToolsForRun` |
|
|
| `executor-computer.ts` | 231 | `computerScreenToolResult`, `runNotificationsEnabled`, `notifyRun`, `renewRunLease`, `computerRetryDelay`, `computerRunRequeueData`, `writeComputerRunRequeue`, `requeueComputerRun`, `redactBlocks`, `publishMessage`, `persistMessageInTransaction` |
|
|
|
|
### pi-runtime Split:
|
|
| File | Line count | Exports |
|
|
|------|-----------|---------|
|
|
| `pi-model-config.ts` | 709 | Viele model config + utility functions (catalogModels, thinkingLevelFor, ToolCallBudget, maxToolCallsPerTurn, releaseToolCallBudget, beginToolCall, endToolCall, toolCallBudgetExceededMessage, configuredOpenRouterModel, modelsForRequest, prepareRequestSecretArguments, pruneComputerScreenshotContext, jsonSchemaParameters, jsonField, conversationSessionId, isOpenCodeProvider, createQueue, createGate, modelForCompletion, sanitizeSensitiveText, redactActivityUrl, sanitizeError, summarizeToolResult, boundAgentToolResult, assistantText, looksLikeOpenCodeSessionError, sanitizeProviderError, etc.) |
|
|
| `pi-runtime.ts` | 1726 | **PI Agent Runtime class** — soll bleiben, muss aber die extrahierten Functions loswerden |
|
|
|
|
## CRITICAL: Was DU NICHT tun darfst
|
|
|
|
1. **NIEMALS `git stash` als Nebenbei-Befehl** — Stash ist über alle Worktrees geteilt.
|
|
2. **NIEMALS den Original-File (executor.ts / pi-runtime.ts) durch einen SubAgent schreiben lassen.** Der SubAgent wird den File während der Arbeit überschreiben.
|
|
3. **NIEMALS `sed` mit Shell-Metazeichen durch SSH.**
|
|
4. **NIEMALS die extrahierten Module-Files löschen oder ändern** — sie sind korrekt.
|
|
|
|
## Task 1: executor.ts split (4697 → ~3700 Zeilen)
|
|
|
|
**Datei:** `/home/cynar/Projects/evOo-local/packages/adapters/src/executor.ts`
|
|
|
|
### Was zu tun ist:
|
|
|
|
Schreibe ein **einzelnes Python-Script**, das ALLES atomar macht:
|
|
1. Liest executor.ts
|
|
2. Findet die zu entfernenden Function-Definitionen **mittels AST-Parser** (nicht line-basiert!)
|
|
3. Entfernt die Definitionen
|
|
4. Fügt Imports + Re-Exports am Ende des import-Blocks ein
|
|
5. Entfernt alte Re-Exports am Ende der Datei
|
|
6. Schreibt den File
|
|
7. Prüft `npx tsc --noEmit -p packages/adapters/tsconfig.json`
|
|
8. Bei Fehlern: korrigiert und retry (max 3x)
|
|
|
|
### Wie man die zu entfernenden Definitionen findet:
|
|
|
|
Verwende den `ast` Python-Module ODER `grep` um die EXAKTEN function-Declaration-Zeilen zu finden. Dann zähle die geschwungenen Klammern **mit einem Parser, der strings/comments aware ist**.
|
|
|
|
**WICHTIG:** Verwende `tree-sitter` oder `ast` Python-Modul wenn möglich. Alternativ: verwende `grep -n 'export function NAME\|function NAME\|export const NAME\|export interface NAME\|const NAME' executor.ts` um die Start-Zeile zu finden, und dann einen **robusten brace-counter** der Template-Strings, Regex-Literale, und Generics korrekt handhabt.
|
|
|
|
### Zu entfernende Functions (alle existieren schon in den executor-*.ts Modulen):
|
|
|
|
Hier ist eine Liste der Functions, die entfernt werden müssen. Für jede muss der **exakte** start/end-Block im executor.ts gefunden und entfernt werden.
|
|
|
|
**Wichtig:** Die brace-counting muss korrekt sein bei:
|
|
- Generics: `<T extends { name: string }>` — die `{ }` sind Type-Parameter, keine Code-Blöcke
|
|
- Template-Strings: `` `template ${expr}` `` — kein `{ }`
|
|
- Regex: `/regex/` — kein `{ }`
|
|
- Arrow Functions: `() => { body }` — der Body hat `{ }`
|
|
|
|
### Schritt-für-Schritt:
|
|
|
|
#### Step 1: Finde alle zu entfernenden Export-Namen
|
|
```bash
|
|
# In packages/adapters/src/:
|
|
for f in executor-*.ts; do grep -h "^export " "$f" | grep -oP '(function|const|interface|type)\s+\K\w+'; done | sort -u
|
|
```
|
|
|
|
Das gibt dir die Liste aller Export-Namen aus den Modul-Files.
|
|
|
|
#### Step 2: Finde diese Namen im executor.ts
|
|
```bash
|
|
# Für jeden Namen:
|
|
grep -n "^export.*NAME\b\|^function NAME\b\|^const NAME\b\|^interface NAME\b" executor.ts
|
|
```
|
|
|
|
#### Step 3: Finde den exakten end-Block mit einem robusten Parser
|
|
|
|
Schreibe ein Python-Script `find_functions.py`:
|
|
```python
|
|
import re, sys
|
|
|
|
file_path = sys.argv[1]
|
|
target_name = sys.argv[2]
|
|
|
|
with open(file_path) as f:
|
|
content = f.read()
|
|
lines = content.split('\n')
|
|
|
|
# Find declaration line
|
|
for i, line in enumerate(lines):
|
|
if re.search(rf'\b{re.escape(target_name)}\b', line):
|
|
# Find opening brace
|
|
brace_line = i
|
|
while brace_line < len(lines) and '{' not in lines[brace_line]:
|
|
brace_line += 1
|
|
|
|
if brace_line >= len(lines):
|
|
# No brace (const declaration)
|
|
end = i + 1
|
|
while end < len(lines) and not lines[end].strip().endswith(';'):
|
|
end += 1
|
|
print(f"{target_name}: L{i+1}-{end}")
|
|
break
|
|
|
|
# Robust brace counting
|
|
depth = 0
|
|
in_single = in_double = in_template = in_block_comment = in_line_comment = False
|
|
for j in range(brace_line, len(lines)):
|
|
k = 0
|
|
while k < len(lines[j]):
|
|
ch = lines[j][k]
|
|
|
|
# String handling
|
|
if ch in ('"', "'"):
|
|
q = ch
|
|
k += 1
|
|
while k < len(lines[j]):
|
|
if lines[j][k] == '\\' and k + 1 < len(lines[j]):
|
|
k += 2
|
|
continue
|
|
if lines[j][k] == q:
|
|
k += 1
|
|
break
|
|
k += 1
|
|
continue
|
|
|
|
if ch == '`':
|
|
k += 1
|
|
while k < len(lines[j]):
|
|
if lines[j][k] == '\\' and k + 1 < len(lines[j]):
|
|
k += 2
|
|
continue
|
|
if lines[j][k] == '`':
|
|
k += 1
|
|
break
|
|
k += 1
|
|
continue
|
|
|
|
# Comments
|
|
if not in_single and not in_double and not in_template:
|
|
if ch == '/' and k + 1 < len(lines[j]) and lines[j][k+1] == '/':
|
|
break # rest of line is comment
|
|
if ch == '/' and k + 1 < len(lines[j]) and lines[j][k+1] == '*':
|
|
in_block_comment = True
|
|
k += 2
|
|
continue
|
|
|
|
if in_block_comment:
|
|
if ch == '*' and k + 1 < len(lines[j]) and lines[j][k+1] == '/':
|
|
in_block_comment = False
|
|
k += 2
|
|
continue
|
|
k += 1
|
|
continue
|
|
|
|
# Braces
|
|
if ch == '{':
|
|
depth += 1
|
|
elif ch == '}':
|
|
depth -= 1
|
|
if depth == 0:
|
|
print(f"{target_name}: L{i+1}-{j+1}")
|
|
break
|
|
k += 1
|
|
else:
|
|
continue
|
|
break
|
|
else:
|
|
print(f"{target_name}: L{i+1}-END(not found)")
|
|
break
|
|
```
|
|
|
|
#### Step 4: Generiere die removal ranges
|
|
Für jeden gefundenen Block: `start_line` bis `end_line` (1-based, inclusive).
|
|
|
|
#### Step 5: Führe alle removals atomar aus
|
|
- Baue ein Set aller zu entfernenden 0-based line indices
|
|
- Baue den neuen File content
|
|
- Füge Imports + Re-Exports an Position 340 (nach dem letzten import Statement) ein
|
|
- Entferne alte Re-Exports am Datei-Ende
|
|
- Schreibe den File
|
|
|
|
#### Step 6: Verifiziere
|
|
```bash
|
|
npx tsc --noEmit -p packages/adapters/tsconfig.json 2>&1 | grep "executor.ts"
|
|
```
|
|
Wenn keine errors: SUCCESS.
|
|
Wenn errors: lies die errors, korrigiere, retry max 3x.
|
|
|
|
## Task 2: pi-runtime.ts split (1726 → ~500 Zeilen)
|
|
|
|
**Datei:** `/home/cynar/Projects/evOo-local/packages/adapters/src/pi-runtime.ts`
|
|
**Modul:** `pi-model-config.ts` (709 Zeilen, enthält model config + utility functions)
|
|
|
|
Gleicher Ansatz wie Task 1:
|
|
1. Finde alle Export-Namen in `pi-model-config.ts`
|
|
2. Finde diese im `pi-runtime.ts`
|
|
3. Finde die exakten start/end-Blöcke mit demselben robusten brace-counter
|
|
4. Entferne die Blöcke atomar
|
|
5. Füge Imports + Re-Exports ein
|
|
6. Entferne alte Re-Exports
|
|
7. Verifiziere mit `npx tsc --noEmit -p packages/adapters/tsconfig.json`
|
|
|
|
## Wichtige Hinweise
|
|
|
|
- Der `packages/adapters/src/index.ts` muss eventuell aktualisiert werden (falls er die extrahierten Functions exportiert — prüfen!)
|
|
- `verbatimModuleSyntax` ist enabled → alle imports müssen `.js` extension haben
|
|
- TypeScript `import type` vs `import`: Für Interfaces `import type`, für classes/functions `import`
|
|
- **Nicht committen oder pushen** — nur die Files ändern und verifizieren
|
|
|
|
## Quick reference: Zu entfernende Functions aus executor.ts
|
|
|
|
Diese Functions existieren in den executor-*.ts Modulen und MÜSSEN aus executor.ts entfernt werden:
|
|
|
|
```
|
|
TURN_ATTACHMENT_UNAVAILABLE, STEERING_ATTACHMENT_UNAVAILABLE,
|
|
createRunWorkspaceCheckpoint,
|
|
isProtectedComputerLifecycleCommand, shellCFlagProgram, preserveShellCommandBoundaries, tokenizeProtectedShellCommand,
|
|
recordEffect, completeEffect, uncertainEffectError,
|
|
completionMessageSegments, completionNotificationBody, completionMarksUnread, threadContextForRun, subagentMarksUnread,
|
|
deploymentKeyFor, resolveModelKey, withModelCredentialLock,
|
|
selectRunConnections, loadCurrentTurnImages,
|
|
PAGE_BROWSER_TOOL_NAMES, filterPageBrowserTools, selectBuiltinToolsForRun,
|
|
persistMessageInTransaction, computerScreenToolResult, runNotificationsEnabled, notifyRun, renewRunLease,
|
|
computerRetryDelay, computerRunRequeueData, writeComputerRunRequeue, requeueComputerRun, redactBlocks, publishMessage,
|
|
```
|
|
|
|
Dazu: `ExecutorDeps` interface aus `executor-types.ts`.
|