Arsitektur Integrasi Pi

Dokumen ini menjelaskan bagaimana Mayros berintegrasi dengan pi-coding-agent dan paket saudaranya (pi-ai, pi-agent-core, pi-tui) untuk mendukung kemampuan agen AI-nya.

Ringkasan

Mayros menggunakan SDK pi untuk menyematkan agen coding AI ke dalam arsitektur gateway pesan. Alih-alih menelurkan pi sebagai subprocess atau menggunakan mode RPC, Mayros langsung mengimpor dan membuat instance AgentSession pi melalui createAgentSession(). Pendekatan embedded ini menyediakan:

  • Kontrol penuh atas siklus hidup sesi dan penanganan event
  • Injeksi tool kustom (pesan, sandbox, aksi spesifik channel)
  • Kustomisasi system prompt per channel/konteks
  • Persistensi sesi dengan dukungan branching/compaction
  • Rotasi profil auth multi-akun dengan failover
  • Peralihan model yang agnostik provider

Dependensi Paket

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"
}
PaketTujuan
pi-aiAbstraksi LLM inti: Model, streamSimple, tipe pesan, API provider
pi-agent-coreLoop agen, eksekusi tool, tipe AgentMessage
pi-coding-agentSDK tingkat tinggi: createAgentSession, SessionManager, AuthStorage, ModelRegistry, tool bawaan
pi-tuiKomponen UI terminal (digunakan dalam mode TUI lokal Mayros)

Struktur File

src/agents/
โ”œโ”€โ”€ pi-embedded-runner.ts          # Re-exports dari pi-embedded-runner/
โ”œโ”€โ”€ pi-embedded-runner/
โ”‚   โ”œโ”€โ”€ run.ts                     # Entry point utama: runEmbeddedPiAgent()
โ”‚   โ”œโ”€โ”€ run/
โ”‚   โ”‚   โ”œโ”€โ”€ attempt.ts             # Logika percobaan tunggal dengan setup sesi
โ”‚   โ”‚   โ”œโ”€โ”€ params.ts              # Tipe RunEmbeddedPiAgentParams
โ”‚   โ”‚   โ”œโ”€โ”€ payloads.ts            # Bangun payload respons dari hasil run
โ”‚   โ”‚   โ”œโ”€โ”€ images.ts              # Injeksi gambar model Vision
โ”‚   โ”‚   โ””โ”€โ”€ types.ts               # EmbeddedRunAttemptResult
โ”‚   โ”œโ”€โ”€ abort.ts                   # Deteksi error pembatalan
โ”‚   โ”œโ”€โ”€ cache-ttl.ts               # Pelacakan Cache TTL untuk pemangkasan konteks
โ”‚   โ”œโ”€โ”€ compact.ts                 # Logika compaction manual/otomatis
โ”‚   โ”œโ”€โ”€ extensions.ts              # Muat ekstensi pi untuk run embedded
โ”‚   โ”œโ”€โ”€ extra-params.ts            # Parameter stream spesifik provider
โ”‚   โ”œโ”€โ”€ google.ts                  # Perbaikan urutan turn Google/Gemini
โ”‚   โ”œโ”€โ”€ history.ts                 # Pembatasan histori (DM vs grup)
โ”‚   โ”œโ”€โ”€ lanes.ts                   # Lane perintah sesi/global
โ”‚   โ”œโ”€โ”€ logger.ts                  # Logger subsistem
โ”‚   โ”œโ”€โ”€ model.ts                   # Resolusi model via ModelRegistry
โ”‚   โ”œโ”€โ”€ runs.ts                    # Pelacakan run aktif, pembatalan, antrian
โ”‚   โ”œโ”€โ”€ sandbox-info.ts            # Info Sandbox untuk system prompt
โ”‚   โ”œโ”€โ”€ session-manager-cache.ts   # Caching instance SessionManager
โ”‚   โ”œโ”€โ”€ session-manager-init.ts    # Inisialisasi file sesi
โ”‚   โ”œโ”€โ”€ system-prompt.ts           # Pembangun system prompt
โ”‚   โ”œโ”€โ”€ tool-split.ts              # Pisahkan tool menjadi builtIn vs custom
โ”‚   โ”œโ”€โ”€ types.ts                   # EmbeddedPiAgentMeta, EmbeddedPiRunResult
โ”‚   โ””โ”€โ”€ utils.ts                   # Pemetaan ThinkLevel, deskripsi error
โ”œโ”€โ”€ pi-embedded-subscribe.ts       # Subscription/dispatch event sesi
โ”œโ”€โ”€ pi-embedded-subscribe.types.ts # SubscribeEmbeddedPiSessionParams
โ”œโ”€โ”€ pi-embedded-subscribe.handlers.ts # Factory handler event
โ”œโ”€โ”€ pi-embedded-subscribe.handlers.lifecycle.ts
โ”œโ”€โ”€ pi-embedded-subscribe.handlers.types.ts
โ”œโ”€โ”€ pi-embedded-block-chunker.ts   # Chunking balasan streaming block
โ”œโ”€โ”€ pi-embedded-messaging.ts       # Pelacakan pengiriman tool pesan
โ”œโ”€โ”€ pi-embedded-helpers.ts         # Klasifikasi error, validasi turn
โ”œโ”€โ”€ pi-embedded-helpers/           # Modul helper
โ”œโ”€โ”€ pi-embedded-utils.ts           # Utilitas format
โ”œโ”€โ”€ pi-tools.ts                    # createMayrosCodingTools()
โ”œโ”€โ”€ pi-tools.abort.ts              # Pembungkusan AbortSignal untuk tool
โ”œโ”€โ”€ pi-tools.policy.ts             # Kebijakan allowlist/denylist tool
โ”œโ”€โ”€ pi-tools.read.ts               # Kustomisasi tool Read
โ”œโ”€โ”€ pi-tools.schema.ts             # Normalisasi skema tool
โ”œโ”€โ”€ pi-tools.types.ts              # Alias tipe AnyAgentTool
โ”œโ”€โ”€ pi-tool-definition-adapter.ts  # Adapter AgentTool -> ToolDefinition
โ”œโ”€โ”€ pi-settings.ts                 # Override pengaturan
โ”œโ”€โ”€ pi-extensions/                 # Ekstensi pi kustom
โ”‚   โ”œโ”€โ”€ compaction-safeguard.ts    # Ekstensi Safeguard
โ”‚   โ”œโ”€โ”€ compaction-safeguard-runtime.ts
โ”‚   โ”œโ”€โ”€ context-pruning.ts         # Ekstensi pemangkasan konteks Cache-TTL
โ”‚   โ””โ”€โ”€ context-pruning/
โ”œโ”€โ”€ model-auth.ts                  # Resolusi profil Auth
โ”œโ”€โ”€ auth-profiles.ts               # Penyimpanan profil, cooldown, failover
โ”œโ”€โ”€ model-selection.ts             # Resolusi model default
โ”œโ”€โ”€ models-config.ts               # Pembuatan models.json
โ”œโ”€โ”€ model-catalog.ts               # Cache katalog model
โ”œโ”€โ”€ context-window-guard.ts        # Validasi jendela konteks
โ”œโ”€โ”€ failover-error.ts              # Kelas FailoverError
โ”œโ”€โ”€ defaults.ts                    # DEFAULT_PROVIDER, DEFAULT_MODEL
โ”œโ”€โ”€ system-prompt.ts               # buildAgentSystemPrompt()
โ”œโ”€โ”€ system-prompt-params.ts        # Resolusi parameter system prompt
โ”œโ”€โ”€ system-prompt-report.ts        # Pembuatan laporan debug
โ”œโ”€โ”€ tool-summaries.ts              # Ringkasan deskripsi tool
โ”œโ”€โ”€ tool-policy.ts                 # Resolusi kebijakan tool
โ”œโ”€โ”€ transcript-policy.ts           # Kebijakan validasi Transcript
โ”œโ”€โ”€ skills.ts                      # Pembuatan Skill snapshot/prompt
โ”œโ”€โ”€ skills/                        # Subsistem Skill
โ”œโ”€โ”€ sandbox.ts                     # Resolusi konteks Sandbox
โ”œโ”€โ”€ sandbox/                       # Subsistem Sandbox
โ”œโ”€โ”€ channel-tools.ts               # Injeksi tool spesifik channel
โ”œโ”€โ”€ mayros-tools.ts              # Tool spesifik Mayros
โ”œโ”€โ”€ bash-tools.ts                  # Tool exec/process
โ”œโ”€โ”€ apply-patch.ts                 # Tool apply_patch (OpenAI)
โ”œโ”€โ”€ tools/                         # Implementasi tool individual
โ”‚   โ”œโ”€โ”€ 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
โ””โ”€โ”€ ...

Alur Integrasi Inti

1. Menjalankan Embedded Agent

Entry point utama adalah runEmbeddedPiAgent() di pi-embedded-runner/run.ts:

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: "Hello, how are you?",
  provider: "anthropic",
  model: "claude-sonnet-4-20250514",
  timeoutMs: 120_000,
  runId: "run-abc",
  onBlockReply: async (payload) => {
    await sendToChannel(payload.text, payload.mediaUrls);
  },
});

2. Pembuatan Sesi

Di dalam runEmbeddedAttempt() (dipanggil oleh runEmbeddedPiAgent()), SDK pi digunakan:

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. Subscription Event

subscribeEmbeddedPiSession() berlangganan event AgentSession pi:

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,
});

Event yang ditangani meliputi:

  • message_start / message_end / message_update (streaming teks/thinking)
  • tool_execution_start / tool_execution_update / tool_execution_end
  • turn_start / turn_end
  • agent_start / agent_end
  • auto_compaction_start / auto_compaction_end

4. Prompting

Setelah pengaturan, sesi diprompt:

typescript
await session.prompt(effectivePrompt, { images: imageResult.images });

SDK menangani loop agen lengkap: mengirim ke LLM, mengeksekusi tool call, streaming respons.

Arsitektur Tool

Pipeline Tool

  1. Base Tools: codingTools pi (read, bash, edit, write)
  2. Custom Replacement: Mayros mengganti bash dengan exec/process, menyesuaikan read/edit/write untuk sandbox
  3. Mayros Tools: messaging, browser, canvas, sessions, cron, gateway, dll.
  4. Channel Tools: Tool aksi spesifik Discord/Telegram/Slack/WhatsApp
  5. Policy Filtering: Tool difilter berdasarkan profil, provider, agen, grup, kebijakan sandbox
  6. Schema Normalization: Skema dibersihkan untuk quirk Gemini/OpenAI
  7. AbortSignal Wrapping: Tool dibungkus untuk menghormati abort signal

Tool Definition Adapter

AgentTool pi-agent-core memiliki signature execute yang berbeda dari ToolDefinition pi-coding-agent. Adapter di pi-tool-definition-adapter.ts menjembatani ini:

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 signature differs from pi-agent-core
      return await tool.execute(toolCallId, params, signal, onUpdate);
    },
  }));
}

Strategi Tool Split

splitSdkTools() melewatkan semua tool melalui customTools:

typescript
export function splitSdkTools(options: { tools: AnyAgentTool[]; sandboxEnabled: boolean }) {
  return {
    builtInTools: [], // Empty. We override everything
    customTools: toToolDefinitions(options.tools),
  };
}

Ini memastikan filtering kebijakan Mayros, integrasi sandbox, dan toolset yang diperluas tetap konsisten di seluruh provider.

Konstruksi System Prompt

System prompt dibangun di buildAgentSystemPrompt() (system-prompt.ts). Ini merakit prompt lengkap dengan bagian termasuk Tooling, Tool Call Style, Safety guardrail, referensi CLI Mayros, Skills, Docs, Workspace, Sandbox, Messaging, Reply Tags, Voice, Silent Replies, Heartbeats, metadata Runtime, plus Memory dan Reactions ketika diaktifkan, dan file konteks opsional serta konten system prompt ekstra. Bagian dipangkas untuk mode prompt minimal yang digunakan oleh subagen.

Prompt diterapkan setelah pembuatan sesi melalui applySystemPromptOverrideToSession():

typescript
const systemPromptOverride = createSystemPromptOverride(appendPrompt);
applySystemPromptOverrideToSession(session, systemPromptOverride);

Manajemen Sesi

File Sesi

Sesi adalah file JSONL dengan struktur pohon (penautan id/parentId). SessionManager Pi menangani persistensi:

typescript
const sessionManager = SessionManager.open(params.sessionFile);

Mayros membungkus ini dengan guardSessionManager() untuk keamanan hasil tool.

Caching Sesi

session-manager-cache.ts menyimpan instance SessionManager untuk menghindari parsing file berulang:

typescript
await prewarmSessionFile(params.sessionFile);
sessionManager = SessionManager.open(params.sessionFile);
trackSessionManagerAccess(params.sessionFile);

Pembatasan Histori

limitHistoryTurns() memangkas histori percakapan berdasarkan tipe channel (DM vs grup).

Compaction

Auto-compaction terpicu pada context overflow. compactEmbeddedPiSessionDirect() menangani compaction manual:

typescript
const compactResult = await compactEmbeddedPiSessionDirect({
  sessionId, sessionFile, provider, model, ...
});

Autentikasi & Resolusi Model

Profil Auth

Mayros memelihara penyimpanan profil auth dengan beberapa API key per provider:

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

Profil berputar pada kegagalan dengan pelacakan cooldown:

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

Resolusi Model

typescript
import { resolveModel } from "./pi-embedded-runner/model.js";

const { model, error, authStorage, modelRegistry } = resolveModel(
  provider,
  modelId,
  agentDir,
  config,
);

// Uses pi's ModelRegistry and AuthStorage
authStorage.setRuntimeApiKey(model.provider, apiKeyInfo.apiKey);

Failover

FailoverError memicu model fallback ketika dikonfigurasi:

typescript
if (fallbackConfigured && isFailoverErrorMessage(errorText)) {
  throw new FailoverError(errorText, {
    reason: promptFailoverReason ?? "unknown",
    provider,
    model: modelId,
    profileId,
    status: resolveFailoverStatus(promptFailoverReason),
  });
}

Ekstensi Pi

Mayros memuat ekstensi pi kustom untuk perilaku khusus:

Compaction Safeguard

pi-extensions/compaction-safeguard.ts menambahkan guardrail ke compaction, termasuk penganggaran token adaptif plus ringkasan kegagalan tool dan operasi file:

typescript
if (resolveCompactionMode(params.cfg) === "safeguard") {
  setCompactionSafeguardRuntime(params.sessionManager, { maxHistoryShare });
  paths.push(resolvePiExtensionPath("compaction-safeguard"));
}

Context Pruning

pi-extensions/context-pruning.ts mengimplementasikan pemangkasan konteks berbasis cache-TTL:

typescript
if (cfg?.agents?.defaults?.contextPruning?.mode === "cache-ttl") {
  setContextPruningRuntime(params.sessionManager, {
    settings,
    contextWindowTokens,
    isToolPrunable,
    lastCacheTouchAt,
  });
  paths.push(resolvePiExtensionPath("context-pruning"));
}

Streaming & Balasan Block

Block Chunking

EmbeddedBlockChunker mengelola streaming teks menjadi block balasan diskrit:

typescript
const blockChunker = blockChunking ? new EmbeddedBlockChunker(blockChunking) : null;

Stripping Tag Thinking/Final

Output streaming diproses untuk menghapus block <think>/<thinking> dan mengekstrak konten <final>:

typescript
const stripBlockTags = (text: string, state: { thinking: boolean; final: boolean }) => {
  // Strip <think>...</think> content
  // If enforceFinalTag, only return <final>...</final> content
};

Reply Directives

Reply directives seperti [[media:url]], [[voice]], [[reply:id]] diparsing dan diekstrak:

typescript
const { text: cleanedText, mediaUrls, audioAsVoice, replyToId } = consumeReplyDirectives(chunk);

Penanganan Error

Klasifikasi Error

pi-embedded-helpers.ts mengklasifikasikan error untuk penanganan yang tepat:

typescript
isContextOverflowError(errorText)     // Konteks terlalu besar
isCompactionFailureError(errorText)   // Compaction gagal
isAuthAssistantError(lastAssistant)   // Kegagalan auth
isRateLimitAssistantError(...)        // Rate limited
isFailoverAssistantError(...)         // Harus failover
classifyFailoverReason(errorText)     // "auth" | "rate_limit" | "quota" | "timeout" | ...

Thinking Level Fallback

Jika thinking level tidak didukung, akan fallback:

typescript
const fallbackThinking = pickFallbackThinkingLevel({
  message: errorText,
  attempted: attemptedThinking,
});
if (fallbackThinking) {
  thinkLevel = fallbackThinking;
  continue;
}

Integrasi Sandbox

Ketika mode sandbox diaktifkan, tool dan path dibatasi:

typescript
const sandbox = await resolveSandboxContext({
  config: params.config,
  sessionKey: sandboxSessionKey,
  workspaceDir: resolvedWorkspace,
});

if (sandboxRoot) {
  // Use sandboxed read/edit/write tools
  // Exec runs in container
  // Browser uses bridge URL
}

Penanganan Spesifik Provider

Anthropic

  • Pembersihan magic string penolakan
  • Validasi turn untuk role berurutan
  • Kompatibilitas parameter Claude Code

Google/Gemini

  • Perbaikan urutan turn (applyGoogleTurnOrderingFix)
  • Sanitasi skema tool (sanitizeToolsForGoogle)
  • Sanitasi histori sesi (sanitizeSessionHistory)

OpenAI

  • Tool apply_patch untuk model Codex
  • Penanganan downgrade thinking level

Integrasi TUI

Mayros juga memiliki mode TUI lokal yang menggunakan komponen pi-tui langsung:

typescript
// src/tui/tui.ts
import { ... } from "@mariozechner/pi-tui";

Ini menyediakan pengalaman terminal interaktif serupa dengan mode native pi.

Perbedaan Utama dari Pi CLI

AspekPi CLIMayros Embedded
InvokasiPerintah pi / RPCSDK melalui createAgentSession()
ToolTool coding defaultSuite tool Mayros kustom
System promptAGENTS.md + promptDinamis per-channel/konteks
Penyimpanan sesi~/.pi/agent/sessions/~/.mayros/agents/<agentId>/sessions/ (atau $MAYROS_STATE_DIR/agents/<agentId>/sessions/)
AuthKredensial tunggalMulti-profil dengan rotasi
EkstensiDimuat dari diskProgrammatic + path disk
Penanganan eventRendering TUIBerbasis callback (onBlockReply, dll.)

Pertimbangan Masa Depan

Area untuk potensi pengerjaan ulang:

  1. Penyelarasan signature tool: Saat ini beradaptasi antara signature pi-agent-core dan pi-coding-agent
  2. Pembungkusan session manager: guardSessionManager menambahkan keamanan tetapi meningkatkan kompleksitas
  3. Pemuatan ekstensi: Dapat menggunakan ResourceLoader pi lebih langsung
  4. Kompleksitas handler streaming: subscribeEmbeddedPiSession telah tumbuh besar
  5. Quirk provider: Banyak codepath spesifik provider yang berpotensi ditangani pi

Test

Semua test yang ada yang mencakup integrasi pi dan ekstensinya:

  • 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 (live)
  • 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