Pi integratsiooni arhitektuur
See dokument kirjeldab, kuidas Mayros integreerib pi-coding-agent ja selle õde pakettidega (pi-ai, pi-agent-core, pi-tui), et võimendada oma AI agendi võimalusi.
Ülevaade
Mayros kasutab pi SDK-d, et manustada AI koodimise agent oma sõnumivahetuse lüüsi arhitektuuri. Selle asemel, et tekitada pi alamprotsessina või kasutada RPC režiimi, impordib ja instantseerib Mayros otse pi AgentSession createAgentSession() kaudu. See manustatud lähenemine pakub:
- Täielik kontroll sessiooni elutsükli ja sündmuse käsitlemise üle
- Kohandatud tööriista sisestamine (sõnumivahetus, liivakast, kanalipõhised toimingud)
- Süsteemi viiba kohandamine kanali/konteksti kohta
- Sessiooni püsivus hargnemise/kompakteerimise toega
- Mitme konto auth profiili pööramine failover-iga
- Pakkuja-agnostiline mudeli vahetamine
Paketi sõltuvused
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" }
| Pakett | Eesmärk |
|---|---|
pi-ai | Põhi LLM abstraktsioonid: Model, streamSimple, sõnumi tüübid, pakkuja API-d |
pi-agent-core | Agendi tsükkel, tööriista täitmine, AgentMessage tüübid |
pi-coding-agent | Kõrge taseme SDK: createAgentSession, SessionManager, AuthStorage, ModelRegistry, sisseehitatud tööriistad |
pi-tui | Terminali UI komponendid (kasutatakse Mayros kohalikus TUI režiimis) |
Failistruktuur
src/agents/
├── pi-embedded-runner.ts # Taas-ekspordid pi-embedded-runner/ kohalt
├── pi-embedded-runner/
│ ├── run.ts # Peamine sissepääs: runEmbeddedPiAgent()
│ ├── run/
│ │ ├── attempt.ts # Ühe katse loogika sessiooni seadistusega
│ │ ├── params.ts # RunEmbeddedPiAgentParams tüüp
│ │ ├── payloads.ts # Ehita vastuse kasulikud koormused käitamise tulemustest
│ │ ├── images.ts # Visiooni mudeli pildi sisestamine
│ │ └── types.ts # EmbeddedRunAttemptResult
│ ├── abort.ts # Katkestamise vea tuvastamine
│ ├── cache-ttl.ts # Vahemälu TTL jälgimine konteksti kärpimiseks
│ ├── compact.ts # Manuaalne/automaatne kompakteerimise loogika
│ ├── extensions.ts # Laadi pi laiendused manustatud käitamiste jaoks
│ ├── extra-params.ts # Pakkujapõhised voo parameetrid
│ ├── google.ts # Google/Gemini pöörde järjestuse parandused
│ ├── history.ts # Ajaloo piiramine (DM vs grupp)
│ ├── lanes.ts # Sessiooni/globaalsed käsuread
│ ├── logger.ts # Alamsüsteemi logger
│ ├── model.ts # Mudeli lahendus ModelRegistry kaudu
│ ├── runs.ts # Aktiivne käitamise jälgimine, katkestamine, järjekord
│ ├── sandbox-info.ts # Liivakasti info süsteemi viiba jaoks
│ ├── session-manager-cache.ts # SessionManager instansi vahemällu salvestamine
│ ├── session-manager-init.ts # Sessiooni faili initsialiseerimine
│ ├── system-prompt.ts # Süsteemi viiba ehitaja
│ ├── tool-split.ts # Tööriistade jagamine builtIn vs custom
│ ├── types.ts # EmbeddedPiAgentMeta, EmbeddedPiRunResult
│ └── utils.ts # ThinkLevel vastendamine, vea kirjeldus
├── pi-embedded-subscribe.ts # Sessiooni sündmuse tellimus/saatmine
├── pi-embedded-subscribe.types.ts # SubscribeEmbeddedPiSessionParams
├── pi-embedded-subscribe.handlers.ts # Sündmuse käsitseja tehas
├── pi-embedded-subscribe.handlers.lifecycle.ts
├── pi-embedded-subscribe.handlers.types.ts
├── pi-embedded-block-chunker.ts # Voogedastamise bloki vastuse tükeldamine
├── pi-embedded-messaging.ts # Sõnumivahetuse tööriista saadetud jälgimine
├── pi-embedded-helpers.ts # Vea klassifikatsioon, pöörde valideerimine
├── pi-embedded-helpers/ # Abistaja moodulid
├── pi-embedded-utils.ts # Vormindamise utiliidid
├── pi-tools.ts # createMayrosCodingTools()
├── pi-tools.abort.ts # AbortSignal mähkimine tööriistade jaoks
├── pi-tools.policy.ts # Tööriista lubatud nimekiri/keeldunimekiri poliitika
├── pi-tools.read.ts # Lugemise tööriista kohandused
├── pi-tools.schema.ts # Tööriista skeemi normaliseerimine
├── pi-tools.types.ts # AnyAgentTool tüübi alias
├── pi-tool-definition-adapter.ts # AgentTool -> ToolDefinition adapter
├── pi-settings.ts # Seadete alistused
├── pi-extensions/ # Kohandatud pi laiendused
│ ├── compaction-safeguard.ts # Kaitsemeetme laiendus
│ ├── compaction-safeguard-runtime.ts
│ ├── context-pruning.ts # Vahemälu-TTL konteksti kärpimise laiendus
│ └── context-pruning/
├── model-auth.ts # Auth profiili lahendus
├── auth-profiles.ts # Profiili pood, jahtumisaeg, failover
├── model-selection.ts # Vaikimisi mudeli lahendus
├── models-config.ts # models.json genereerimine
├── model-catalog.ts # Mudeli kataloogi vahemälu
├── context-window-guard.ts # Konteksti akna valideerimine
├── failover-error.ts # FailoverError klass
├── defaults.ts # DEFAULT_PROVIDER, DEFAULT_MODEL
├── system-prompt.ts # buildAgentSystemPrompt()
├── system-prompt-params.ts # Süsteemi viiba parameetri lahendus
├── system-prompt-report.ts # Silumise aruande genereerimine
├── tool-summaries.ts # Tööriista kirjelduse kokkuvõtted
├── tool-policy.ts # Tööriista poliitika lahendus
├── transcript-policy.ts # Transkripti valideerimise poliitika
├── skills.ts # Oskuse hetktõmmis/viiba ehitamine
├── skills/ # Oskuse alamsüsteem
├── sandbox.ts # Liivakasti konteksti lahendus
├── sandbox/ # Liivakasti alamsüsteem
├── channel-tools.ts # Kanalipõhine tööriista sisestamine
├── mayros-tools.ts # Mayros-spetsiifilised tööriistad
├── bash-tools.ts # exec/process tööriistad
├── apply-patch.ts # apply_patch tööriist (OpenAI)
├── tools/ # Individuaalsed tööriista rakendused
│ ├── 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
└── ...
Põhiintegratsiooni voog
1. Manustatud agendi käitamine
Peamine sissepääsupunkt on runEmbeddedPiAgent() pi-embedded-runner/run.ts failis:
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: "Tere, kuidas sul läheb?", provider: "anthropic", model: "claude-sonnet-4-20250514", timeoutMs: 120_000, runId: "run-abc", onBlockReply: async (payload) => { await sendToChannel(payload.text, payload.mediaUrls); }, });
2. Sessiooni loomine
runEmbeddedAttempt() sees (mida kutsub runEmbeddedPiAgent()), kasutatakse pi SDK-d:
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. Sündmuse tellimus
subscribeEmbeddedPiSession() tellib pi AgentSession sündmusi:
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, });
Käsitletud sündmused sisaldavad:
message_start/message_end/message_update(voogedastamise tekst/mõtlemine)tool_execution_start/tool_execution_update/tool_execution_endturn_start/turn_endagent_start/agent_endauto_compaction_start/auto_compaction_end
4. Viipamine
Pärast seadistamist viipatakse sessiooni:
typescriptawait session.prompt(effectivePrompt, { images: imageResult.images });
SDK käsitseb täielikku agendi tsüklit: saatmine LLM-ile, tööriista kõnede täitmine, vastuste voogedastamine.
Tööriista arhitektuur
Tööriista torujuhe
- Baastööriistad: pi
codingTools(read, bash, edit, write) - Kohandatud asendused: Mayros asendab bash
exec/process-ga, kohandab read/edit/write liivakasti jaoks - Mayros tööriistad: sõnumivahetus, brauser, canvas, sessioonid, cron, gateway jne.
- Kanali tööriistad: Discord/Telegram/Slack/WhatsApp-spetsiifilised tegevuse tööriistad
- Poliitika filtreerimine: Tööriistad filtreeritud profiili, pakkuja, agendi, grupi, liivakasti poliitikate järgi
- Skeemi normaliseerimine: Skeemid puhastatud Gemini/OpenAI kummalistuste jaoks
- AbortSignal mähkimine: Tööriistad mähitud, et austada katkestamise signaale
Tööriista definitsiooni adapter
pi-agent-core AgentTool omab erinevat execute signatuuri kui pi-coding-agent ToolDefinition. Adapter pi-tool-definition-adapter.ts failis ületab selle:
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 signatuur erineb pi-agent-core omast return await tool.execute(toolCallId, params, signal, onUpdate); }, })); }
Tööriista jagamise strateegia
splitSdkTools() edastab kõik tööriistad läbi customTools:
typescriptexport function splitSdkTools(options: { tools: AnyAgentTool[]; sandboxEnabled: boolean }) { return { builtInTools: [], // Tühi. Me alistame kõike customTools: toToolDefinitions(options.tools), }; }
See tagab, et Mayros poliitika filtreerimine, liivakasti integratsioon ja laiendatud tööriistakomplekt jäävad järjepidevaks pakkujate vahel.
Süsteemi viiba konstrueerimine
Süsteemi viip on ehitatud buildAgentSystemPrompt() (system-prompt.ts) abil. See koostab täieliku viiba sektsioonidega, sealhulgas Tooling, Tool Call Style, Safety kaitsemeetmed, Mayros CLI viide, Skills, Docs, Workspace, Sandbox, Messaging, Reply Tags, Voice, Silent Replies, Heartbeats, Runtime metaandmed, pluss Memory ja Reactions kui lubatud, ja valikulised konteksti failid ning lisa süsteemi viiba sisu. Sektsioonid on kärpitud minimaalse viiba režiimi jaoks, mida kasutavad alam-agendid.
Viip rakendatakse pärast sessiooni loomist applySystemPromptOverrideToSession() kaudu:
typescriptconst systemPromptOverride = createSystemPromptOverride(appendPrompt); applySystemPromptOverrideToSession(session, systemPromptOverride);
Sessiooni haldus
Sessiooni failid
Sessioonid on JSONL failid puu struktuuriga (id/parentId linkimine). Pi SessionManager käsitseb püsivust:
typescriptconst sessionManager = SessionManager.open(params.sessionFile);
Mayros mähib selle guardSessionManager() abil tööriista tulemuse ohutuse jaoks.
Sessiooni vahemällu salvestamine
session-manager-cache.ts vahemälustab SessionManager instantse, et vältida korduvat faili parserimist:
typescriptawait prewarmSessionFile(params.sessionFile); sessionManager = SessionManager.open(params.sessionFile); trackSessionManagerAccess(params.sessionFile);
Ajaloo piiramine
limitHistoryTurns() kärpib vestluse ajalugu kanali tüübi (DM vs grupp) põhjal.
Kompakteerimine
Automaatne kompakteerimine käivitub konteksti ületäitumisel. compactEmbeddedPiSessionDirect() käsitseb manuaalset kompakteerimist:
typescriptconst compactResult = await compactEmbeddedPiSessionDirect({ sessionId, sessionFile, provider, model, ... });
Autentimine ja mudeli lahendus
Auth profiilid
Mayros hoiab auth profiili poodi mitme API võtmega pakkuja kohta:
typescriptconst authStore = ensureAuthProfileStore(agentDir, { allowKeychainPrompt: false }); const profileOrder = resolveAuthProfileOrder({ cfg, store: authStore, provider, preferredProfile });
Profiilid pöörlevad ebaõnnestumiste korral jahtumisaja jälgimisega:
typescriptawait markAuthProfileFailure({ store, profileId, reason, cfg, agentDir }); const rotated = await advanceAuthProfile();
Mudeli lahendus
typescriptimport { resolveModel } from "./pi-embedded-runner/model.js"; const { model, error, authStorage, modelRegistry } = resolveModel( provider, modelId, agentDir, config, ); // Kasutab pi ModelRegistry ja AuthStorage authStorage.setRuntimeApiKey(model.provider, apiKeyInfo.apiKey);
Failover
FailoverError käivitab mudeli tagasilangemise kui konfigureeritud:
typescriptif (fallbackConfigured && isFailoverErrorMessage(errorText)) { throw new FailoverError(errorText, { reason: promptFailoverReason ?? "unknown", provider, model: modelId, profileId, status: resolveFailoverStatus(promptFailoverReason), }); }
Pi laiendused
Mayros laadib kohandatud pi laiendusi spetsialiseeritud käitumise jaoks:
Kompakteerimise kaitsemeede
pi-extensions/compaction-safeguard.ts lisab kaitsemeetmed kompakteerimisele, sealhulgas adaptiivne tokeni eelarvestamine pluss tööriista ebaõnnestumise ja faili operatsiooni kokkuvõtted:
typescriptif (resolveCompactionMode(params.cfg) === "safeguard") { setCompactionSafeguardRuntime(params.sessionManager, { maxHistoryShare }); paths.push(resolvePiExtensionPath("compaction-safeguard")); }
Konteksti kärpimine
pi-extensions/context-pruning.ts rakendab vahemälu-TTL põhist konteksti kärpimist:
typescriptif (cfg?.agents?.defaults?.contextPruning?.mode === "cache-ttl") { setContextPruningRuntime(params.sessionManager, { settings, contextWindowTokens, isToolPrunable, lastCacheTouchAt, }); paths.push(resolvePiExtensionPath("context-pruning")); }
Voogedastamine ja blokivastused
Bloki tükeldamine
EmbeddedBlockChunker haldab voogedastamise teksti diskreetseteks vastuse blokkideks:
typescriptconst blockChunker = blockChunking ? new EmbeddedBlockChunker(blockChunking) : null;
Thinking/Final märgendi eemaldamine
Voogedastamise väljund töödeldakse, et eemaldada <think>/<thinking> blokid ja ekstraktida <final> sisu:
typescriptconst stripBlockTags = (text: string, state: { thinking: boolean; final: boolean }) => { // Eemalda <think>...</think> sisu // Kui enforceFinalTag, tagasta ainult <final>...</final> sisu };
Vastuse direktiivid
Vastuse direktiivid nagu [[media:url]], [[voice]], [[reply:id]] parsitakse ja ekstraktitakse:
typescriptconst { text: cleanedText, mediaUrls, audioAsVoice, replyToId } = consumeReplyDirectives(chunk);
Vea käsitsemine
Vea klassifikatsioon
pi-embedded-helpers.ts klassifitseerib vigu sobivaks käsitsemiseks:
typescriptisContextOverflowError(errorText) // Kontekst liiga suur isCompactionFailureError(errorText) // Kompakteerimine ebaõnnestus isAuthAssistantError(lastAssistant) // Auth ebaõnnestumine isRateLimitAssistantError(...) // Määra piiratud isFailoverAssistantError(...) // Peaks failover tegema classifyFailoverReason(errorText) // "auth" | "rate_limit" | "quota" | "timeout" | ...
Mõtlemise taseme tagasilangemine
Kui mõtlemise tase ei ole toetatud, langeb tagasi:
typescriptconst fallbackThinking = pickFallbackThinkingLevel({ message: errorText, attempted: attemptedThinking, }); if (fallbackThinking) { thinkLevel = fallbackThinking; continue; }
Liivakasti integratsioon
Kui liivakasti režiim on lubatud, on tööriistad ja teed piiratud:
typescriptconst sandbox = await resolveSandboxContext({ config: params.config, sessionKey: sandboxSessionKey, workspaceDir: resolvedWorkspace, }); if (sandboxRoot) { // Kasuta liivakasti read/edit/write tööriistu // Exec käib konteineris // Brauser kasutab sillaabi URL-i }
Pakkujapõhine käsitsemine
Anthropic
- Keeldumise maagiline stringi puhastamine
- Pöörde valideerimine järjestikuste rollide jaoks
- Claude Code parameetri ühilduvus
Google/Gemini
- Pöörde järjestuse parandused (
applyGoogleTurnOrderingFix) - Tööriista skeemi sanitiseerimine (
sanitizeToolsForGoogle) - Sessiooni ajaloo sanitiseerimine (
sanitizeSessionHistory)
OpenAI
apply_patchtööriist Codex mudelite jaoks- Mõtlemise taseme alandamise käsitsemine
TUI integratsioon
Mayros omab ka kohalikku TUI režiimi, mis kasutab pi-tui komponente otse:
typescript// src/tui/tui.ts import { ... } from "@mariozechner/pi-tui";
See pakub interaktiivset terminali kogemust, mis on sarnane pi natiivsele režiimile.
Peamised erinevused Pi CLI-st
| Aspekt | Pi CLI | Mayros manustatud |
|---|---|---|
| Käivitamine | pi käsk / RPC | SDK läbi createAgentSession() |
| Tööriistad | Vaikimisi koodimise tööriistad | Kohandatud Mayros tööriistakomplekt |
| Süsteemi viip | AGENTS.md + viibad | Dünaamiline kanali/konteksti kohta |
| Sessiooni salvestamine | ~/.pi/agent/sessions/ | ~/.mayros/agents/<agentId>/sessions/ (või $MAYROS_STATE_DIR/agents/<agentId>/sessions/) |
| Auth | Üks krediit | Mitme profiili pööramisega |
| Laiendused | Laaditud kettalt | Programmaatiline + ketta teed |
| Sündmuse käsitsemine | TUI renderdamine | Tagasihelistus-põhine (onBlockReply jne.) |
Tulevased kaalutlused
Alad võimalikuks ümbertöötamiseks:
- Tööriista signatuuri joondamine: Praegu kohandatakse pi-agent-core ja pi-coding-agent signatuuride vahel
- Sessiooni haldaja mähkimine:
guardSessionManagerlisab ohutust, kuid suurendab keerukust - Laienduse laadimine: Võiks kasutada pi
ResourceLoaderrohkem otse - Voogedastamise käsitseja keerukus:
subscribeEmbeddedPiSessionon kasvanud suureks - Pakkuja kummalistused: Palju pakkujapõhiseid koodi teid, mida pi võiks potentsiaalselt käsitseda
Testid
Kõik olemasolevad testid, mis katavad pi integratsiooni ja selle laiendusi:
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(live)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