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"
}
PaketAmaç
pi-aiTemel LLM soyutlamaları: Model, streamSimple, mesaj tipleri, sağlayıcı API'leri
pi-agent-coreAjan 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-tuiTerminal 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:

typescript
import { 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:

typescript
import {
  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:

typescript
const 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_end
  • turn_start / turn_end
  • agent_start / agent_end
  • auto_compaction_start / auto_compaction_end

4. İstem Gönderme

Kurulumdan sonra, oturuma istem gönderilir:

typescript
await 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'ı

  1. Temel Araçlar: pi'nin codingTools (read, bash, edit, write)
  2. Özel Değiştirmeler: Mayros, bash'i exec/process ile değiştirir, sandbox için read/edit/write'ı özelleştirir
  3. Mayros Araçları: mesajlaşma, tarayıcı, canvas, oturumlar, cron, ağ geçidi, vb.
  4. Kanal Araçları: Discord/Telegram/Slack/WhatsApp'a özgü eylem araçları
  5. Politika Filtreleme: Araçlar profil, sağlayıcı, ajan, grup, sandbox politikalarına göre filtrelenir
  6. Şema Normalleştirme: Şemalar Gemini/OpenAI tuhafları için temizlenir
  7. 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:

typescript
export 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:

typescript
export 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:

typescript
const 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:

typescript
const 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:

typescript
await 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:

typescript
const 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:

typescript
const authStore = ensureAuthProfileStore(agentDir, { allowKeychainPrompt: false });
const profileOrder = resolveAuthProfileOrder({ cfg, store: authStore, provider, preferredProfile });

Profiller, cooldown izleme ile hatalar üzerinde döner:

typescript
await markAuthProfileFailure({ store, profileId, reason, cfg, agentDir });
const rotated = await advanceAuthProfile();

Model Çözümlemesi

typescript
import { 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:

typescript
if (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:

typescript
if (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:

typescript
if (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:

typescript
const 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:

typescript
const 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:

typescript
const { 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:

typescript
isContextOverflowError(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:

typescript
const 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:

typescript
const 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_patch aracı
  • 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önPi CLIMayros Gömülü
Çağrılmapi komutu / RPCSDK aracılığıyla createAgentSession()
AraçlarVarsayılan kodlama araçlarıÖzel Mayros araç paketi
Sistem istemiAGENTS.md + istemlerKanal/bağlam başına dinamik
Oturum depolama~/.pi/agent/sessions/~/.mayros/agents/<agentId>/sessions/ (veya $MAYROS_STATE_DIR/agents/<agentId>/sessions/)
Kimlik doğrulamaTek kimlik bilgisiRotasyon ile çok profil
UzantılarDiskten yüklenirProgramatik + disk yolları
Olay işlemeTUI renderlemeGeri çağırma tabanlı (onBlockReply, vb.)

Gelecek Değerlendirmeler

Potansiyel yeniden çalışma alanları:

  1. Araç imzası hizalama: Şu anda pi-agent-core ve pi-coding-agent imzaları arasında uyarlama yapılıyor
  2. Oturum yöneticisi sarma: guardSessionManager güvenlik ekler ancak karmaşıklığı artırır
  3. Uzantı yükleme: Pi'nin ResourceLoader'ını daha doğrudan kullanabilir
  4. Akış işleyici karmaşıklığı: subscribeEmbeddedPiSession büyümüş
  5. 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.ts
  • src/agents/pi-embedded-helpers.buildbootstrapcontextfiles.test.ts
  • src/agents/pi-embedded-helpers.classifyfailoverreason.test.ts
  • src/agents/pi-embedded-helpers.downgradeopenai-reasoning.test.ts
  • src/agents/pi-embedded-helpers.formatassistanterrortext.test.ts
  • src/agents/pi-embedded-helpers.formatrawassistanterrorforui.test.ts
  • src/agents/pi-embedded-helpers.image-dimension-error.test.ts
  • src/agents/pi-embedded-helpers.image-size-error.test.ts
  • src/agents/pi-embedded-helpers.isautherrormessage.test.ts
  • src/agents/pi-embedded-helpers.isbillingerrormessage.test.ts
  • src/agents/pi-embedded-helpers.iscloudcodeassistformaterror.test.ts
  • src/agents/pi-embedded-helpers.iscompactionfailureerror.test.ts
  • src/agents/pi-embedded-helpers.iscontextoverflowerror.test.ts
  • src/agents/pi-embedded-helpers.isfailovererrormessage.test.ts
  • src/agents/pi-embedded-helpers.islikelycontextoverflowerror.test.ts
  • src/agents/pi-embedded-helpers.ismessagingtoolduplicate.test.ts
  • src/agents/pi-embedded-helpers.messaging-duplicate.test.ts
  • src/agents/pi-embedded-helpers.normalizetextforcomparison.test.ts
  • src/agents/pi-embedded-helpers.resolvebootstrapmaxchars.test.ts
  • src/agents/pi-embedded-helpers.sanitize-session-messages-images.keeps-tool-call-tool-result-ids-unchanged.test.ts
  • src/agents/pi-embedded-helpers.sanitize-session-messages-images.removes-empty-assistant-text-blocks-but-preserves.test.ts
  • src/agents/pi-embedded-helpers.sanitizegoogleturnordering.test.ts
  • src/agents/pi-embedded-helpers.sanitizesessionmessagesimages-thought-signature-stripping.test.ts
  • src/agents/pi-embedded-helpers.sanitizetoolcallid.test.ts
  • src/agents/pi-embedded-helpers.sanitizeuserfacingtext.test.ts
  • src/agents/pi-embedded-helpers.stripthoughtsignatures.test.ts
  • src/agents/pi-embedded-helpers.validate-turns.test.ts
  • src/agents/pi-embedded-runner-extraparams.live.test.ts (canlı)
  • src/agents/pi-embedded-runner-extraparams.test.ts
  • src/agents/pi-embedded-runner.applygoogleturnorderingfix.test.ts
  • src/agents/pi-embedded-runner.buildembeddedsandboxinfo.test.ts
  • src/agents/pi-embedded-runner.createsystempromptoverride.test.ts
  • src/agents/pi-embedded-runner.get-dm-history-limit-from-session-key.falls-back-provider-default-per-dm-not.test.ts
  • src/agents/pi-embedded-runner.get-dm-history-limit-from-session-key.returns-undefined-sessionkey-is-undefined.test.ts
  • src/agents/pi-embedded-runner.google-sanitize-thinking.test.ts
  • src/agents/pi-embedded-runner.guard.test.ts
  • src/agents/pi-embedded-runner.limithistoryturns.test.ts
  • src/agents/pi-embedded-runner.resolvesessionagentids.test.ts
  • src/agents/pi-embedded-runner.run-embedded-pi-agent.auth-profile-rotation.test.ts
  • src/agents/pi-embedded-runner.sanitize-session-history.test.ts
  • src/agents/pi-embedded-runner.splitsdktools.test.ts
  • src/agents/pi-embedded-runner.test.ts
  • src/agents/pi-embedded-subscribe.code-span-awareness.test.ts
  • src/agents/pi-embedded-subscribe.reply-tags.test.ts
  • src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.calls-onblockreplyflush-before-tool-execution-start-preserve.test.ts
  • src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.does-not-append-text-end-content-is.test.ts
  • src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.does-not-call-onblockreplyflush-callback-is-not.test.ts
  • src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.does-not-duplicate-text-end-repeats-full.test.ts
  • src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.does-not-emit-duplicate-block-replies-text.test.ts
  • src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.emits-block-replies-text-end-does-not.test.ts
  • src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.emits-reasoning-as-separate-message-enabled.test.ts
  • src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.filters-final-suppresses-output-without-start-tag.test.ts
  • src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.includes-canvas-action-metadata-tool-summaries.test.ts
  • src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.keeps-assistanttexts-final-answer-block-replies-are.test.ts
  • src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.keeps-indented-fenced-blocks-intact.test.ts
  • src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.reopens-fenced-blocks-splitting-inside-them.test.ts
  • src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.splits-long-single-line-fenced-blocks-reopen.test.ts
  • src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.streams-soft-chunks-paragraph-preference.test.ts
  • src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.subscribeembeddedpisession.test.ts
  • src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.suppresses-message-end-block-replies-message-tool.test.ts
  • src/agents/pi-embedded-subscribe.subscribe-embedded-pi-session.waits-multiple-compaction-retries-before-resolving.test.ts
  • src/agents/pi-embedded-subscribe.tools.test.ts
  • src/agents/pi-embedded-utils.test.ts
  • src/agents/pi-extensions/compaction-safeguard.test.ts
  • src/agents/pi-extensions/context-pruning.test.ts
  • src/agents/pi-settings.test.ts
  • src/agents/pi-tool-definition-adapter.test.ts
  • src/agents/pi-tools-agent-config.test.ts
  • src/agents/pi-tools.create-mayros-coding-tools.adds-claude-style-aliases-schemas-without-dropping-b.test.ts
  • src/agents/pi-tools.create-mayros-coding-tools.adds-claude-style-aliases-schemas-without-dropping-d.test.ts
  • src/agents/pi-tools.create-mayros-coding-tools.adds-claude-style-aliases-schemas-without-dropping-f.test.ts
  • src/agents/pi-tools.create-mayros-coding-tools.adds-claude-style-aliases-schemas-without-dropping.test.ts
  • src/agents/pi-tools.policy.test.ts
  • src/agents/pi-tools.safe-bins.test.ts
  • src/agents/pi-tools.workspace-paths.test.ts