Pi Integration Architecture

यह दस्तावेज़ बताता है कि Mayros कैसे pi-coding-agent और इसके sibling packages (pi-ai, pi-agent-core, pi-tui) के साथ अपनी AI एजेंट क्षमताओं को power करने के लिए integrate करता है।

अवलोकन

Mayros अपने messaging gateway architecture में AI coding एजेंट embed करने के लिए pi SDK का उपयोग करता है। Subprocess के रूप में pi spawn करने या RPC mode का उपयोग करने के बजाय, Mayros सीधे createAgentSession() के माध्यम से pi की AgentSession को import और instantiate करता है। यह embedded दृष्टिकोण प्रदान करता है:

  • Session lifecycle और event handling पर पूर्ण नियंत्रण
  • Custom tool injection (messaging, sandbox, channel-विशिष्ट actions)
  • प्रति channel/context system prompt customization
  • Branching/compaction समर्थन के साथ session persistence
  • Failover के साथ multi-account auth profile rotation
  • Provider-agnostic model switching

Package Dependencies

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"
}
Packageउद्देश्य
pi-aiमुख्य LLM abstractions: Model, streamSimple, message types, provider APIs
pi-agent-coreAgent loop, tool execution, AgentMessage types
pi-coding-agentHigh-level SDK: createAgentSession, SessionManager, AuthStorage, ModelRegistry, built-in tools
pi-tuiTerminal UI components (Mayros के local TUI mode में उपयोग किया गया)

File संरचना

src/agents/
├── pi-embedded-runner.ts          # pi-embedded-runner/ से re-exports
├── pi-embedded-runner/
│   ├── run.ts                     # मुख्य entry: runEmbeddedPiAgent()
│   ├── run/
│   │   ├── attempt.ts             # Session setup के साथ single attempt logic
│   │   ├── params.ts              # RunEmbeddedPiAgentParams type
│   │   ├── payloads.ts            # Run results से response payloads बनाएं
│   │   ├── images.ts              # Vision model image injection
│   │   └── types.ts               # EmbeddedRunAttemptResult
│   ├── abort.ts                   # Abort error पता लगाना
│   ├── cache-ttl.ts               # Context pruning के लिए cache TTL tracking
│   ├── compact.ts                 # Manual/auto compaction logic
│   ├── extensions.ts              # Embedded runs के लिए pi extensions load करें
│   ├── extra-params.ts            # Provider-विशिष्ट stream params
│   ├── google.ts                  # Google/Gemini turn ordering fixes
│   ├── history.ts                 # History limiting (DM vs group)
│   ├── lanes.ts                   # Session/global command lanes
│   ├── logger.ts                  # Subsystem logger
│   ├── model.ts                   # ModelRegistry के माध्यम से model resolution
│   ├── runs.ts                    # Active run tracking, abort, queue
│   ├── sandbox-info.ts            # System prompt के लिए sandbox info
│   ├── session-manager-cache.ts   # SessionManager instance caching
│   ├── session-manager-init.ts    # Session file initialization
│   ├── system-prompt.ts           # System prompt builder
│   ├── tool-split.ts              # Tools को builtIn vs custom में split करें
│   ├── types.ts                   # EmbeddedPiAgentMeta, EmbeddedPiRunResult
│   └── utils.ts                   # ThinkLevel mapping, error description
├── pi-embedded-subscribe.ts       # Session event subscription/dispatch
├── pi-embedded-subscribe.types.ts # SubscribeEmbeddedPiSessionParams
├── pi-embedded-subscribe.handlers.ts # Event handler factory
├── pi-embedded-subscribe.handlers.lifecycle.ts
├── pi-embedded-subscribe.handlers.types.ts
├── pi-embedded-block-chunker.ts   # Streaming block reply chunking
├── pi-embedded-messaging.ts       # Messaging tool sent tracking
├── pi-embedded-helpers.ts         # Error classification, turn validation
├── pi-embedded-helpers/           # Helper modules
├── pi-embedded-utils.ts           # Formatting utilities
├── pi-tools.ts                    # createMayrosCodingTools()
├── pi-tools.abort.ts              # Tools के लिए AbortSignal wrapping
├── pi-tools.policy.ts             # Tool allowlist/denylist policy
├── pi-tools.read.ts               # Read tool customizations
├── pi-tools.schema.ts             # Tool schema normalization
├── pi-tools.types.ts              # AnyAgentTool type alias
├── pi-tool-definition-adapter.ts  # AgentTool -> ToolDefinition adapter
├── pi-settings.ts                 # Settings overrides
├── pi-extensions/                 # Custom pi extensions
│   ├── compaction-safeguard.ts    # Safeguard extension
│   ├── compaction-safeguard-runtime.ts
│   ├── context-pruning.ts         # Cache-TTL context pruning extension
│   └── context-pruning/
├── model-auth.ts                  # Auth profile resolution
├── auth-profiles.ts               # Profile store, cooldown, failover
├── model-selection.ts             # Default model resolution
├── models-config.ts               # models.json generation
├── model-catalog.ts               # Model catalog cache
├── context-window-guard.ts        # Context window validation
├── failover-error.ts              # FailoverError class
├── defaults.ts                    # DEFAULT_PROVIDER, DEFAULT_MODEL
├── system-prompt.ts               # buildAgentSystemPrompt()
├── system-prompt-params.ts        # System prompt parameter resolution
├── system-prompt-report.ts        # Debug report generation
├── tool-summaries.ts              # Tool description summaries
├── tool-policy.ts                 # Tool policy resolution
├── transcript-policy.ts           # Transcript validation policy
├── skills.ts                      # Skill snapshot/prompt building
├── skills/                        # Skill subsystem
├── sandbox.ts                     # Sandbox context resolution
├── sandbox/                       # Sandbox subsystem
├── channel-tools.ts               # Channel-विशिष्ट tool injection
├── mayros-tools.ts              # Mayros-विशिष्ट tools
├── bash-tools.ts                  # exec/process tools
├── apply-patch.ts                 # apply_patch tool (OpenAI)
├── tools/                         # व्यक्तिगत tool implementations
│   ├── 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
└── ...

मुख्य Integration Flow

1. Embedded Agent चलाना

मुख्य entry point pi-embedded-runner/run.ts में runEmbeddedPiAgent() है:

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. Session निर्माण

runEmbeddedAttempt() के अंदर (runEmbeddedPiAgent() द्वारा कहा जाता है), pi SDK का उपयोग किया जाता है:

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

subscribeEmbeddedPiSession() pi के AgentSession events को subscribe करता है:

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

Handle किए गए events में शामिल हैं:

  • message_start / message_end / message_update (streaming text/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

Setup के बाद, session को prompted किया जाता है:

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

SDK पूर्ण agent loop को handle करता है: LLM को भेजना, tool calls execute करना, responses streaming करना।

Tool Architecture

Tool Pipeline

  1. Base Tools: pi की codingTools (read, bash, edit, write)
  2. Custom Replacements: Mayros bash को exec/process से बदलता है, sandbox के लिए read/edit/write customize करता है
  3. Mayros Tools: messaging, browser, canvas, sessions, cron, gateway, आदि
  4. Channel Tools: Discord/Telegram/Slack/WhatsApp-विशिष्ट action tools
  5. Policy Filtering: Profile, provider, agent, group, sandbox policies द्वारा filtered tools
  6. Schema Normalization: Gemini/OpenAI quirks के लिए schemas cleaned
  7. AbortSignal Wrapping: Abort signals का सम्मान करने के लिए wrapped tools

Tool Definition Adapter

pi-agent-core की AgentTool में pi-coding-agent के ToolDefinition से अलग execute signature है। pi-tool-definition-adapter.ts में adapter इसे bridge करता है:

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

Tool Split रणनीति

splitSdkTools() सभी tools को customTools के माध्यम से pass करता है:

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

यह सुनिश्चित करता है कि Mayros की policy filtering, sandbox integration, और विस्तारित toolset providers में एक समान बने रहें।

System Prompt निर्माण

System prompt buildAgentSystemPrompt() (system-prompt.ts) में बनाया जाता है। यह Tooling, Tool Call Style, Safety guardrails, Mayros CLI reference, Skills, Docs, Workspace, Sandbox, Messaging, Reply Tags, Voice, Silent Replies, Heartbeats, Runtime metadata के sections के साथ एक पूर्ण prompt assemble करता है, साथ ही Memory और Reactions जब enabled हों, और वैकल्पिक context files और extra system prompt content। Subagents द्वारा उपयोग किए जाने वाले minimal prompt mode के लिए sections को trim किया जाता है।

Prompt session creation के बाद applySystemPromptOverrideToSession() के माध्यम से लागू किया जाता है:

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

Session Management

Session Files

Sessions tree structure (id/parentId linking) के साथ JSONL files हैं। Pi का SessionManager persistence handle करता है:

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

Mayros इसे tool result safety के लिए guardSessionManager() के साथ wrap करता है।

Session Caching

session-manager-cache.ts बार-बार file parsing से बचने के लिए SessionManager instances को cache करता है:

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

History Limiting

limitHistoryTurns() channel type (DM vs group) के आधार पर conversation history को trim करता है।

Compaction

Context overflow पर auto-compaction trigger होता है। compactEmbeddedPiSessionDirect() manual compaction handle करता है:

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

Authentication & Model Resolution

Auth Profiles

Mayros प्रति provider कई API keys के साथ एक auth profile store maintain करता है:

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

Profiles cooldown tracking के साथ failures पर rotate करते हैं:

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

Model Resolution

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 configured होने पर model fallback trigger करता है:

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

Pi Extensions

Mayros विशेष व्यवहार के लिए custom pi extensions load करता है:

Compaction Safeguard

pi-extensions/compaction-safeguard.ts compaction में guardrails जोड़ता है, adaptive token budgeting और tool failure और file operation summaries सहित:

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

Context Pruning

pi-extensions/context-pruning.ts cache-TTL आधारित context pruning implement करता है:

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

Streaming & Block Replies

Block Chunking

EmbeddedBlockChunker streaming text को discrete reply blocks में manage करता है:

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

Thinking/Final Tag Stripping

Streaming output को <think>/<thinking> blocks strip करने और <final> content extract करने के लिए process किया जाता है:

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

Reply Directives

[[media:url]], [[voice]], [[reply:id]] जैसे reply directives parse और extract किए जाते हैं:

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

Error Handling

Error Classification

pi-embedded-helpers.ts उचित handling के लिए errors classify करता है:

typescript
isContextOverflowError(errorText)     // Context बहुत बड़ा
isCompactionFailureError(errorText)   // Compaction विफल
isAuthAssistantError(lastAssistant)   // Auth विफलता
isRateLimitAssistantError(...)        // Rate limited
isFailoverAssistantError(...)         // Failover करना चाहिए
classifyFailoverReason(errorText)     // "auth" | "rate_limit" | "quota" | "timeout" | ...

Thinking Level Fallback

यदि thinking level असमर्थित है, तो fallback होता है:

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

Sandbox Integration

जब sandbox mode enabled होता है, tools और paths constrained होते हैं:

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
}

Provider-विशिष्ट Handling

Anthropic

  • Refusal magic string scrubbing
  • Consecutive roles के लिए turn validation
  • Claude Code parameter compatibility

Google/Gemini

  • Turn ordering fixes (applyGoogleTurnOrderingFix)
  • Tool schema sanitization (sanitizeToolsForGoogle)
  • Session history sanitization (sanitizeSessionHistory)

OpenAI

  • Codex models के लिए apply_patch tool
  • Thinking level downgrade handling

TUI Integration

Mayros में एक local TUI mode भी है जो pi-tui components का सीधे उपयोग करता है:

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

यह pi के native mode के समान interactive terminal अनुभव प्रदान करता है।

Pi CLI से मुख्य अंतर

पहलूPi CLIMayros Embedded
Invocationpi command / RPCSDK के माध्यम से createAgentSession()
Toolsडिफ़ॉल्ट coding toolsCustom Mayros tool suite
System promptAGENTS.md + promptsDynamic per-channel/context
Session storage~/.pi/agent/sessions/~/.mayros/agents/<agentId>/sessions/ (या $MAYROS_STATE_DIR/agents/<agentId>/sessions/)
AuthSingle credentialRotation के साथ multi-profile
ExtensionsDisk से loadedProgrammatic + disk paths
Event handlingTUI renderingCallback-based (onBlockReply, आदि)

भविष्य की संभावनाएं

संभावित rework के लिए क्षेत्र:

  1. Tool signature alignment: वर्तमान में pi-agent-core और pi-coding-agent signatures के बीच adapt कर रहा है
  2. Session manager wrapping: guardSessionManager safety जोड़ता है लेकिन complexity बढ़ाता है
  3. Extension loading: pi के ResourceLoader का अधिक सीधे उपयोग कर सकता है
  4. Streaming handler complexity: subscribeEmbeddedPiSession बड़ा हो गया है
  5. Provider quirks: कई provider-विशिष्ट codepaths जिन्हें pi संभावित रूप से handle कर सकता है

Tests

Pi integration और इसके extensions को कवर करने वाले सभी मौजूदा tests:

  • 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