Pi Entegrasyon Mimarisi
Bu belge, Mayros'un AI ajan yeteneklerini güçlendirmek için pi-coding-agent ve kardeş paketleri (pi-ai, pi-agent-core, pi-tui) ile nasıl entegre olduğunu açıklar.
Genel Bakış
Mayros, mesajlaşma ağ geçidi mimarisine bir AI kodlama ajanı yerleştirmek için pi SDK'sını kullanır. Pi'yi bir alt işlem olarak başlatmak veya RPC modunu kullanmak yerine, Mayros doğrudan pi'nin AgentSession'ını createAgentSession() aracılığıyla içe aktarır ve başlatır. Bu gömülü yaklaşım şunları sağlar:
- Oturum yaşam döngüsü ve olay işleme üzerinde tam kontrol
- Özel araç enjeksiyonu (mesajlaşma, sandbox, kanala özgü eylemler)
- Kanal/bağlam başına sistem istemi özelleştirme
- Dallanma/sıkıştırma desteği ile oturum kalıcılığı
- Yük devretme ile çok hesaplı kimlik doğrulama profili rotasyonu
- Sağlayıcıdan bağımsız model değiştirme
Paket Bağımlılıkları
json{ "@mariozechner/pi-agent-core": "0.49.3", "@mariozechner/pi-ai": "0.49.3", "@mariozechner/pi-coding-agent": "0.49.3", "@mariozechner/pi-tui": "0.49.3" }
| Paket | Amaç |
|---|---|
pi-ai | Temel LLM soyutlamaları: Model, streamSimple, mesaj tipleri, sağlayıcı API'leri |
pi-agent-core | Ajan döngüsü, araç yürütme, AgentMessage tipleri |
pi-coding-agent | Üst düzey SDK: createAgentSession, SessionManager, AuthStorage, ModelRegistry, yerleşik araçlar |
pi-tui | Terminal UI bileşenleri (Mayros'un yerel TUI modunda kullanılır) |
Dosya Yapısı
src/agents/
├── pi-embedded-runner.ts # pi-embedded-runner/'dan yeniden ihraç eder
├── pi-embedded-runner/
│ ├── run.ts # Ana giriş: runEmbeddedPiAgent()
│ ├── run/
│ │ ├── attempt.ts # Oturum kurulumu ile tek deneme mantığı
│ │ ├── params.ts # RunEmbeddedPiAgentParams tipi
│ │ ├── payloads.ts # Çalıştırma sonuçlarından yanıt yükleri oluştur
│ │ ├── images.ts # Görme modeli görüntü enjeksiyonu
│ │ └── types.ts # EmbeddedRunAttemptResult
│ ├── abort.ts # İptal hatası algılama
│ ├── cache-ttl.ts # Bağlam budama için önbellek TTL izleme
│ ├── compact.ts # Manuel/otomatik sıkıştırma mantığı
│ ├── extensions.ts # Gömülü çalıştırmalar için pi uzantıları yükle
│ ├── extra-params.ts # Sağlayıcıya özgü akış parametreleri
│ ├── google.ts # Google/Gemini tur sıralaması düzeltmeleri
│ ├── history.ts # Geçmiş sınırlama (DM vs grup)
│ ├── lanes.ts # Oturum/global komut şeritleri
│ ├── logger.ts # Alt sistem logger
│ ├── model.ts # ModelRegistry aracılığıyla model çözümlemesi
│ ├── runs.ts # Aktif çalıştırma izleme, iptal, kuyruk
│ ├── sandbox-info.ts # Sistem istemi için sandbox bilgisi
│ ├── session-manager-cache.ts # SessionManager örneği önbelleğe alma
│ ├── session-manager-init.ts # Oturum dosyası başlatma
│ ├── system-prompt.ts # Sistem istemi oluşturucu
│ ├── tool-split.ts # Araçları builtIn vs custom olarak ayır
│ ├── types.ts # EmbeddedPiAgentMeta, EmbeddedPiRunResult
│ └── utils.ts # ThinkLevel eşleme, hata açıklaması
├── pi-embedded-subscribe.ts # Oturum olayı aboneliği/dağıtımı
├── pi-embedded-subscribe.types.ts # SubscribeEmbeddedPiSessionParams
├── pi-embedded-subscribe.handlers.ts # Olay işleyici fabrikası
├── pi-embedded-subscribe.handlers.lifecycle.ts
├── pi-embedded-subscribe.handlers.types.ts
├── pi-embedded-block-chunker.ts # Akış blok yanıtı parçalama
├── pi-embedded-messaging.ts # Mesajlaşma aracı gönderim izleme
├── pi-embedded-helpers.ts # Hata sınıflandırma, tur doğrulama
├── pi-embedded-helpers/ # Yardımcı modüller
├── pi-embedded-utils.ts # Biçimlendirme yardımcı programları
├── pi-tools.ts # createMayrosCodingTools()
├── pi-tools.abort.ts # Araçlar için AbortSignal sarma
├── pi-tools.policy.ts # Araç izin/reddetme listesi politikası
├── pi-tools.read.ts # Read araç özelleştirmeleri
├── pi-tools.schema.ts # Araç şeması normalleştirme
├── pi-tools.types.ts # AnyAgentTool tip takma adı
├── pi-tool-definition-adapter.ts # AgentTool -> ToolDefinition adaptörü
├── pi-settings.ts # Ayarlar geçersiz kılmaları
├── pi-extensions/ # Özel pi uzantıları
│ ├── compaction-safeguard.ts # Koruma uzantısı
│ ├── compaction-safeguard-runtime.ts
│ ├── context-pruning.ts # Cache-TTL bağlam budama uzantısı
│ └── context-pruning/
├── model-auth.ts # Kimlik doğrulama profili çözümlemesi
├── auth-profiles.ts # Profil deposu, cooldown, yük devretme
├── model-selection.ts # Varsayılan model çözümlemesi
├── models-config.ts # models.json üretimi
├── model-catalog.ts # Model kataloğu önbelleği
├── context-window-guard.ts # Bağlam penceresi doğrulaması
├── failover-error.ts # FailoverError sınıfı
├── defaults.ts # DEFAULT_PROVIDER, DEFAULT_MODEL
├── system-prompt.ts # buildAgentSystemPrompt()
├── system-prompt-params.ts # Sistem istemi parametre çözümlemesi
├── system-prompt-report.ts # Hata ayıklama raporu üretimi
├── tool-summaries.ts # Araç açıklama özetleri
├── tool-policy.ts # Araç politikası çözümlemesi
├── transcript-policy.ts # Transcript doğrulama politikası
├── skills.ts # Beceri anlık görüntüsü/istem oluşturma
├── skills/ # Beceri alt sistemi
├── sandbox.ts # Sandbox bağlamı çözümlemesi
├── sandbox/ # Sandbox alt sistemi
├── channel-tools.ts # Kanala özgü araç enjeksiyonu
├── mayros-tools.ts # Mayros'a özgü araçlar
├── bash-tools.ts # exec/process araçları
├── apply-patch.ts # apply_patch aracı (OpenAI)
├── tools/ # Bireysel araç uygulamaları
│ ├── browser-tool.ts
│ ├── canvas-tool.ts
│ ├── cron-tool.ts
│ ├── discord-actions*.ts
│ ├── gateway-tool.ts
│ ├── image-tool.ts
│ ├── message-tool.ts
│ ├── nodes-tool.ts
│ ├── session*.ts
│ ├── slack-actions.ts
│ ├── telegram-actions.ts
│ ├── web-*.ts
│ └── whatsapp-actions.ts
└── ...
Temel Entegrasyon Akışı
1. Gömülü Bir Ajan Çalıştırma
Ana giriş noktası pi-embedded-runner/run.ts içindeki runEmbeddedPiAgent()'tır:
typescriptimport { runEmbeddedPiAgent } from "./agents/pi-embedded-runner.js"; const result = await runEmbeddedPiAgent({ sessionId: "user-123", sessionKey: "main:whatsapp:+1234567890", sessionFile: "/path/to/session.jsonl", workspaceDir: "/path/to/workspace", config: mayrosConfig, prompt: "Merhaba, nasılsın?", provider: "anthropic", model: "claude-sonnet-4-20250514", timeoutMs: 120_000, runId: "run-abc", onBlockReply: async (payload) => { await sendToChannel(payload.text, payload.mediaUrls); }, });
2. Oturum Oluşturma
runEmbeddedAttempt() içinde (runEmbeddedPiAgent() tarafından çağrılır), pi SDK kullanılır:
typescriptimport { createAgentSession, DefaultResourceLoader, SessionManager, SettingsManager, } from "@mariozechner/pi-coding-agent"; const resourceLoader = new DefaultResourceLoader({ cwd: resolvedWorkspace, agentDir, settingsManager, additionalExtensionPaths, }); await resourceLoader.reload(); const { session } = await createAgentSession({ cwd: resolvedWorkspace, agentDir, authStorage: params.authStorage, modelRegistry: params.modelRegistry, model: params.model, thinkingLevel: mapThinkingLevel(params.thinkLevel), tools: builtInTools, customTools: allCustomTools, sessionManager, settingsManager, resourceLoader, }); applySystemPromptOverrideToSession(session, systemPromptOverride);
3. Olay Aboneliği
subscribeEmbeddedPiSession(), pi'nin AgentSession olaylarına abone olur:
typescriptconst subscription = subscribeEmbeddedPiSession({ session: activeSession, runId: params.runId, verboseLevel: params.verboseLevel, reasoningMode: params.reasoningLevel, toolResultFormat: params.toolResultFormat, onToolResult: params.onToolResult, onReasoningStream: params.onReasoningStream, onBlockReply: params.onBlockReply, onPartialReply: params.onPartialReply, onAgentEvent: params.onAgentEvent, });
İşlenen olaylar şunları içerir:
message_start/message_end/message_update(metin/düşünme akışı)tool_execution_start/tool_execution_update/tool_execution_endturn_start/turn_endagent_start/agent_endauto_compaction_start/auto_compaction_end
4. İstem Gönderme
Kurulumdan sonra, oturuma istem gönderilir:
typescriptawait session.prompt(effectivePrompt, { images: imageResult.images });
SDK, tam ajan döngüsünü işler: LLM'ye gönderme, araç çağrılarını yürütme, yanıtları akıtma.
Araç Mimarisi
Araç Pipeline'ı
- Temel Araçlar: pi'nin
codingTools(read, bash, edit, write) - Özel Değiştirmeler: Mayros, bash'i
exec/processile değiştirir, sandbox için read/edit/write'ı özelleştirir - Mayros Araçları: mesajlaşma, tarayıcı, canvas, oturumlar, cron, ağ geçidi, vb.
- Kanal Araçları: Discord/Telegram/Slack/WhatsApp'a özgü eylem araçları
- Politika Filtreleme: Araçlar profil, sağlayıcı, ajan, grup, sandbox politikalarına göre filtrelenir
- Şema Normalleştirme: Şemalar Gemini/OpenAI tuhafları için temizlenir
- AbortSignal Sarma: Araçlar iptal sinyallerine saygı göstermek için sarılır
Araç Tanımı Adaptörü
pi-agent-core'un AgentTool'u, pi-coding-agent'in ToolDefinition'ından farklı bir execute imzasına sahiptir. pi-tool-definition-adapter.ts içindeki adaptör bunu köprüler:
typescriptexport function toToolDefinitions(tools: AnyAgentTool[]): ToolDefinition[] { return tools.map((tool) => ({ name: tool.name, label: tool.label ?? name, description: tool.description ?? "", parameters: tool.parameters, execute: async (toolCallId, params, onUpdate, _ctx, signal) => { // pi-coding-agent imzası pi-agent-core'dan farklıdır return await tool.execute(toolCallId, params, signal, onUpdate); }, })); }
Araç Ayırma Stratejisi
splitSdkTools() tüm araçları customTools aracılığıyla geçirir:
typescriptexport function splitSdkTools(options: { tools: AnyAgentTool[]; sandboxEnabled: boolean }) { return { builtInTools: [], // Boş. Her şeyi geçersiz kılıyoruz customTools: toToolDefinitions(options.tools), }; }
Bu, Mayros'un politika filtrelemesinin, sandbox entegrasyonunun ve genişletilmiş araç setinin sağlayıcılar arasında tutarlı kalmasını sağlar.
Sistem İstemi Oluşturma
Sistem istemi buildAgentSystemPrompt() (system-prompt.ts) içinde oluşturulur. Araçlar, Araç Çağrısı Stili, Güvenlik korumaları, Mayros CLI referansı, Beceriler, Dokümanlar, Çalışma alanı, Sandbox, Mesajlaşma, Yanıt Etiketleri, Ses, Sessiz Yanıtlar, Kalp atışları, Çalışma zamanı meta verileri, artı etkinleştirildiğinde Bellek ve Tepkiler ve isteğe bağlı bağlam dosyaları ve ekstra sistem istemi içeriği dahil bölümlerle tam bir istem birleştirir. Bölümler, alt ajanlar tarafından kullanılan minimal istem modu için kırpılır.
İstem, oturum oluşturulduktan sonra applySystemPromptOverrideToSession() aracılığıyla uygulanır:
typescriptconst systemPromptOverride = createSystemPromptOverride(appendPrompt); applySystemPromptOverrideToSession(session, systemPromptOverride);
Oturum Yönetimi
Oturum Dosyaları
Oturumlar, ağaç yapısına sahip JSONL dosyalarıdır (id/parentId bağlama). Pi'nin SessionManager'ı kalıcılığı işler:
typescriptconst sessionManager = SessionManager.open(params.sessionFile);
Mayros bunu araç sonucu güvenliği için guardSessionManager() ile sarar.
Oturum Önbelleğe Alma
session-manager-cache.ts, tekrarlanan dosya ayrıştırmasını önlemek için SessionManager örneklerini önbelleğe alır:
typescriptawait prewarmSessionFile(params.sessionFile); sessionManager = SessionManager.open(params.sessionFile); trackSessionManagerAccess(params.sessionFile);
Geçmiş Sınırlama
limitHistoryTurns(), kanal türüne (DM vs grup) göre konuşma geçmişini kırpar.
Sıkıştırma
Otomatik sıkıştırma, bağlam taşması üzerinde tetiklenir. compactEmbeddedPiSessionDirect() manuel sıkıştırmayı işler:
typescriptconst compactResult = await compactEmbeddedPiSessionDirect({ sessionId, sessionFile, provider, model, ... });
Kimlik Doğrulama ve Model Çözümlemesi
Kimlik Doğrulama Profilleri
Mayros, sağlayıcı başına birden fazla API anahtarı ile bir kimlik doğrulama profili deposu tutar:
typescriptconst authStore = ensureAuthProfileStore(agentDir, { allowKeychainPrompt: false }); const profileOrder = resolveAuthProfileOrder({ cfg, store: authStore, provider, preferredProfile });
Profiller, cooldown izleme ile hatalar üzerinde döner:
typescriptawait markAuthProfileFailure({ store, profileId, reason, cfg, agentDir }); const rotated = await advanceAuthProfile();
Model Çözümlemesi
typescriptimport { resolveModel } from "./pi-embedded-runner/model.js"; const { model, error, authStorage, modelRegistry } = resolveModel( provider, modelId, agentDir, config, ); // Pi'nin ModelRegistry ve AuthStorage'ını kullanır authStorage.setRuntimeApiKey(model.provider, apiKeyInfo.apiKey);
Yük Devretme
FailoverError, yapılandırıldığında model geri dönüşünü tetikler:
typescriptif (fallbackConfigured && isFailoverErrorMessage(errorText)) { throw new FailoverError(errorText, { reason: promptFailoverReason ?? "unknown", provider, model: modelId, profileId, status: resolveFailoverStatus(promptFailoverReason), }); }
Pi Uzantıları
Mayros, özel davranış için özel pi uzantıları yükler:
Sıkıştırma Koruması
pi-extensions/compaction-safeguard.ts, uyarlanabilir belirteç bütçeleme artı araç hatası ve dosya işlemi özetleri dahil olmak üzere sıkıştırmaya korumalar ekler:
typescriptif (resolveCompactionMode(params.cfg) === "safeguard") { setCompactionSafeguardRuntime(params.sessionManager, { maxHistoryShare }); paths.push(resolvePiExtensionPath("compaction-safeguard")); }
Bağlam Budama
pi-extensions/context-pruning.ts, cache-TTL tabanlı bağlam budamayı uygular:
typescriptif (cfg?.agents?.defaults?.contextPruning?.mode === "cache-ttl") { setContextPruningRuntime(params.sessionManager, { settings, contextWindowTokens, isToolPrunable, lastCacheTouchAt, }); paths.push(resolvePiExtensionPath("context-pruning")); }
Akış ve Blok Yanıtları
Blok Parçalama
EmbeddedBlockChunker, akış metnini ayrık yanıt bloklarına yönetir:
typescriptconst blockChunker = blockChunking ? new EmbeddedBlockChunker(blockChunking) : null;
Düşünme/Final Etiket Çıkarma
Akış çıktısı, <think>/<thinking> bloklarını çıkarmak ve <final> içeriğini ayıklamak için işlenir:
typescriptconst stripBlockTags = (text: string, state: { thinking: boolean; final: boolean }) => { // <think>...</think> içeriğini çıkar // enforceFinalTag varsa, yalnızca <final>...</final> içeriğini döndür };
Yanıt Direktifleri
[[media:url]], [[voice]], [[reply:id]] gibi yanıt direktifleri ayrıştırılır ve ayıklanır:
typescriptconst { text: cleanedText, mediaUrls, audioAsVoice, replyToId } = consumeReplyDirectives(chunk);
Hata İşleme
Hata Sınıflandırma
pi-embedded-helpers.ts hataları uygun işleme için sınıflandırır:
typescriptisContextOverflowError(errorText) // Bağlam çok büyük isCompactionFailureError(errorText) // Sıkıştırma başarısız isAuthAssistantError(lastAssistant) // Kimlik doğrulama hatası isRateLimitAssistantError(...) // Oran sınırlı isFailoverAssistantError(...) // Yük devretme yapılmalı classifyFailoverReason(errorText) // "auth" | "rate_limit" | "quota" | "timeout" | ...
Düşünme Seviyesi Geri Dönüş
Bir düşünme seviyesi desteklenmiyorsa, geri döner:
typescriptconst fallbackThinking = pickFallbackThinkingLevel({ message: errorText, attempted: attemptedThinking, }); if (fallbackThinking) { thinkLevel = fallbackThinking; continue; }
Sandbox Entegrasyonu
Sandbox modu etkinleştirildiğinde, araçlar ve yollar kısıtlanır:
typescriptconst sandbox = await resolveSandboxContext({ config: params.config, sessionKey: sandboxSessionKey, workspaceDir: resolvedWorkspace, }); if (sandboxRoot) { // Sandbox'lanmış read/edit/write araçlarını kullan // Exec konteyner içinde çalışır // Tarayıcı köprü URL'sini kullanır }
Sağlayıcıya Özgü İşleme
Anthropic
- Ret sihirli dize temizleme
- Ardışık roller için tur doğrulaması
- Claude Code parametre uyumluluğu
Google/Gemini
- Tur sıralaması düzeltmeleri (
applyGoogleTurnOrderingFix) - Araç şeması sanitizasyonu (
sanitizeToolsForGoogle) - Oturum geçmişi sanitizasyonu (
sanitizeSessionHistory)
OpenAI
- Codex modelleri için
apply_patcharacı - Düşünme seviyesi düşürme işleme
TUI Entegrasyonu
Mayros ayrıca doğrudan pi-tui bileşenlerini kullanan yerel bir TUI moduna sahiptir:
typescript// src/tui/tui.ts import { ... } from "@mariozechner/pi-tui";
Bu, pi'nin yerel moduna benzer etkileşimli terminal deneyimi sağlar.
Pi CLI'den Temel Farklar
| Yön | Pi CLI | Mayros Gömülü |
|---|---|---|
| Çağrılma | pi komutu / RPC | SDK aracılığıyla createAgentSession() |
| Araçlar | Varsayılan kodlama araçları | Özel Mayros araç paketi |
| Sistem istemi | AGENTS.md + istemler | Kanal/bağlam başına dinamik |
| Oturum depolama | ~/.pi/agent/sessions/ | ~/.mayros/agents/<agentId>/sessions/ (veya $MAYROS_STATE_DIR/agents/<agentId>/sessions/) |
| Kimlik doğrulama | Tek kimlik bilgisi | Rotasyon ile çok profil |
| Uzantılar | Diskten yüklenir | Programatik + disk yolları |
| Olay işleme | TUI renderleme | Geri çağırma tabanlı (onBlockReply, vb.) |
Gelecek Değerlendirmeler
Potansiyel yeniden çalışma alanları:
- Araç imzası hizalama: Şu anda pi-agent-core ve pi-coding-agent imzaları arasında uyarlama yapılıyor
- Oturum yöneticisi sarma:
guardSessionManagergüvenlik ekler ancak karmaşıklığı artırır - Uzantı yükleme: Pi'nin
ResourceLoader'ını daha doğrudan kullanabilir - Akış işleyici karmaşıklığı:
subscribeEmbeddedPiSessionbüyümüş - Sağlayıcı tuhafları: Pi'nin potansiyel olarak işleyebileceği birçok sağlayıcıya özgü kod yolu
Testler
Pi entegrasyonunu ve uzantılarını kapsayan mevcut tüm testler:
src/agents/pi-embedded-block-chunker.test.tssrc/agents/pi-embedded-helpers.buildbootstrapcontextfiles.test.tssrc/agents/pi-embedded-helpers.classifyfailoverreason.test.tssrc/agents/pi-embedded-helpers.downgradeopenai-reasoning.test.tssrc/agents/pi-embedded-helpers.formatassistanterrortext.test.tssrc/agents/pi-embedded-helpers.formatrawassistanterrorforui.test.tssrc/agents/pi-embedded-helpers.image-dimension-error.test.tssrc/agents/pi-embedded-helpers.image-size-error.test.tssrc/agents/pi-embedded-helpers.isautherrormessage.test.tssrc/agents/pi-embedded-helpers.isbillingerrormessage.test.tssrc/agents/pi-embedded-helpers.iscloudcodeassistformaterror.test.tssrc/agents/pi-embedded-helpers.iscompactionfailureerror.test.tssrc/agents/pi-embedded-helpers.iscontextoverflowerror.test.tssrc/agents/pi-embedded-helpers.isfailovererrormessage.test.tssrc/agents/pi-embedded-helpers.islikelycontextoverflowerror.test.tssrc/agents/pi-embedded-helpers.ismessagingtoolduplicate.test.tssrc/agents/pi-embedded-helpers.messaging-duplicate.test.tssrc/agents/pi-embedded-helpers.normalizetextforcomparison.test.tssrc/agents/pi-embedded-helpers.resolvebootstrapmaxchars.test.tssrc/agents/pi-embedded-helpers.sanitize-session-messages-images.keeps-tool-call-tool-result-ids-unchanged.test.tssrc/agents/pi-embedded-helpers.sanitize-session-messages-images.removes-empty-assistant-text-blocks-but-preserves.test.tssrc/agents/pi-embedded-helpers.sanitizegoogleturnordering.test.tssrc/agents/pi-embedded-helpers.sanitizesessionmessagesimages-thought-signature-stripping.test.tssrc/agents/pi-embedded-helpers.sanitizetoolcallid.test.tssrc/agents/pi-embedded-helpers.sanitizeuserfacingtext.test.tssrc/agents/pi-embedded-helpers.stripthoughtsignatures.test.tssrc/agents/pi-embedded-helpers.validate-turns.test.tssrc/agents/pi-embedded-runner-extraparams.live.test.ts(canlı)src/agents/pi-embedded-runner-extraparams.test.tssrc/agents/pi-embedded-runner.applygoogleturnorderingfix.test.tssrc/agents/pi-embedded-runner.buildembeddedsandboxinfo.test.tssrc/agents/pi-embedded-runner.createsystempromptoverride.test.tssrc/agents/pi-embedded-runner.get-dm-history-limit-from-session-key.falls-back-provider-default-per-dm-not.test.tssrc/agents/pi-embedded-runner.get-dm-history-limit-from-session-key.returns-undefined-sessionkey-is-undefined.test.tssrc/agents/pi-embedded-runner.google-sanitize-thinking.test.tssrc/agents/pi-embedded-runner.guard.test.tssrc/agents/pi-embedded-runner.limithistoryturns.test.tssrc/agents/pi-embedded-runner.resolvesessionagentids.test.tssrc/agents/pi-embedded-runner.run-embedded-pi-agent.auth-profile-rotation.test.tssrc/agents/pi-embedded-runner.sanitize-session-history.test.tssrc/agents/pi-embedded-runner.splitsdktools.test.tssrc/agents/pi-embedded-runner.test.tssrc/agents/pi-embedded-subscribe.code-span-awareness.test.tssrc/agents/pi-embedded-subscribe.reply-tags.test.tssrc/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.calls-onblockreplyflush-before-tool-execution-start-preserve.test.tssrc/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.does-not-append-text-end-content-is.test.tssrc/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.does-not-call-onblockreplyflush-callback-is-not.test.tssrc/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.does-not-duplicate-text-end-repeats-full.test.tssrc/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.does-not-emit-duplicate-block-replies-text.test.tssrc/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.emits-block-replies-text-end-does-not.test.tssrc/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.emits-reasoning-as-separate-message-enabled.test.tssrc/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.filters-final-suppresses-output-without-start-tag.test.tssrc/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.includes-canvas-action-metadata-tool-summaries.test.tssrc/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.keeps-assistanttexts-final-answer-block-replies-are.test.tssrc/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.keeps-indented-fenced-blocks-intact.test.tssrc/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.reopens-fenced-blocks-splitting-inside-them.test.tssrc/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.splits-long-single-line-fenced-blocks-reopen.test.tssrc/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.streams-soft-chunks-paragraph-preference.test.tssrc/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.subscribeembeddedpisession.test.tssrc/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.suppresses-message-end-block-replies-message-tool.test.tssrc/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.waits-multiple-compaction-retries-before-resolving.test.tssrc/agents/pi-embedded-subscribe.tools.test.tssrc/agents/pi-embedded-utils.test.tssrc/agents/pi-extensions/compaction-safeguard.test.tssrc/agents/pi-extensions/context-pruning.test.tssrc/agents/pi-settings.test.tssrc/agents/pi-tool-definition-adapter.test.tssrc/agents/pi-tools-agent-config.test.tssrc/agents/pi-tools.create-mayros-coding-tools.adds-claude-style-aliases-schemas-without-dropping-b.test.tssrc/agents/pi-tools.create-mayros-coding-tools.adds-claude-style-aliases-schemas-without-dropping-d.test.tssrc/agents/pi-tools.create-mayros-coding-tools.adds-claude-style-aliases-schemas-without-dropping-f.test.tssrc/agents/pi-tools.create-mayros-coding-tools.adds-claude-style-aliases-schemas-without-dropping.test.tssrc/agents/pi-tools.policy.test.tssrc/agents/pi-tools.safe-bins.test.tssrc/agents/pi-tools.workspace-paths.test.ts