aiwg 2026.9.1 → 2026.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/agentic/code/plugins/agent-loop/.claude-plugin/plugin.json +1 -1
  2. package/agentic/code/plugins/agent-persistence/.claude-plugin/plugin.json +1 -1
  3. package/agentic/code/plugins/agentic-installer/.claude-plugin/plugin.json +1 -1
  4. package/agentic/code/plugins/aiwg-dev/.claude-plugin/plugin.json +1 -1
  5. package/agentic/code/plugins/aiwg-evals/.claude-plugin/plugin.json +1 -1
  6. package/agentic/code/plugins/auto-memory/.claude-plugin/plugin.json +1 -1
  7. package/agentic/code/plugins/browser-control/.claude-plugin/plugin.json +1 -1
  8. package/agentic/code/plugins/color-palette/.claude-plugin/plugin.json +1 -1
  9. package/agentic/code/plugins/compound-memory/.claude-plugin/plugin.json +1 -1
  10. package/agentic/code/plugins/context-curator/.claude-plugin/plugin.json +1 -1
  11. package/agentic/code/plugins/daemon/.claude-plugin/plugin.json +1 -1
  12. package/agentic/code/plugins/doc-intelligence/.claude-plugin/plugin.json +1 -1
  13. package/agentic/code/plugins/droid-bridge/.claude-plugin/plugin.json +1 -1
  14. package/agentic/code/plugins/forensics/.claude-plugin/plugin.json +1 -1
  15. package/agentic/code/plugins/guided-implementation/.claude-plugin/plugin.json +1 -1
  16. package/agentic/code/plugins/hooks/.claude-plugin/plugin.json +1 -1
  17. package/agentic/code/plugins/knowledge-base/.claude-plugin/plugin.json +1 -1
  18. package/agentic/code/plugins/line-memory/.claude-plugin/plugin.json +1 -1
  19. package/agentic/code/plugins/llm-wiki/.claude-plugin/plugin.json +1 -1
  20. package/agentic/code/plugins/marketing/.claude-plugin/plugin.json +1 -1
  21. package/agentic/code/plugins/media-curator/.claude-plugin/plugin.json +1 -1
  22. package/agentic/code/plugins/nlp-prod/.claude-plugin/plugin.json +1 -1
  23. package/agentic/code/plugins/ops/.claude-plugin/plugin.json +1 -1
  24. package/agentic/code/plugins/prose-integration/.claude-plugin/plugin.json +1 -1
  25. package/agentic/code/plugins/research/.claude-plugin/plugin.json +1 -1
  26. package/agentic/code/plugins/rlm/.claude-plugin/plugin.json +1 -1
  27. package/agentic/code/plugins/sdlc/.claude-plugin/plugin.json +1 -1
  28. package/agentic/code/plugins/security-engineering/.claude-plugin/plugin.json +1 -1
  29. package/agentic/code/plugins/semantic-memory/.claude-plugin/plugin.json +1 -1
  30. package/agentic/code/plugins/skill-factory/.claude-plugin/plugin.json +1 -1
  31. package/agentic/code/plugins/star-prompt/.claude-plugin/plugin.json +1 -1
  32. package/agentic/code/plugins/testing-quality/.claude-plugin/plugin.json +1 -1
  33. package/agentic/code/plugins/twelve-factor/.claude-plugin/plugin.json +1 -1
  34. package/agentic/code/plugins/uat-mcp/.claude-plugin/plugin.json +1 -1
  35. package/agentic/code/plugins/utils/.claude-plugin/plugin.json +1 -1
  36. package/agentic/code/plugins/validation-complete/.claude-plugin/plugin.json +1 -1
  37. package/agentic/code/plugins/verbalized-sampling/.claude-plugin/plugin.json +1 -1
  38. package/agentic/code/plugins/voice/.claude-plugin/plugin.json +1 -1
  39. package/agentic/code/plugins/writing/.claude-plugin/plugin.json +1 -1
  40. package/agentic/code/providers/capability-matrix.yaml +1 -1
  41. package/agentic/code/providers/model-capabilities.v1.json +11 -0
  42. package/agentic/code/providers/model-catalog.v1.json +8 -0
  43. package/agentic/code/providers/pi/aiwg-bridge.ts +26 -0
  44. package/dist/src/auth/credential-store.js +6 -0
  45. package/dist/src/cli/handlers/sessions.js +30 -12
  46. package/dist/src/models/model-discovery.js +32 -0
  47. package/dist/src/models/provider-policy.js +3 -2
  48. package/dist/src/sessions/adapters/pi.js +141 -0
  49. package/dist/src/sessions/contracts.js +1 -1
  50. package/dist/src/sessions/index.js +1 -0
  51. package/dist/src/sessions/workspace-discovery.js +10 -0
  52. package/docs/agent-loop/manual-provider-testing.md +6 -0
  53. package/docs/agents/providers/pi.md +163 -31
  54. package/docs/cli/reference.md +2 -2
  55. package/docs/integrations/pi-quickstart.md +70 -27
  56. package/docs/planning/session-intelligence/provider-conformance-matrix.json +11 -1
  57. package/docs/providers/pi-sessions.md +7 -0
  58. package/docs/releases/v2026.9.2-announcement.md +91 -0
  59. package/docs/testing/model-provider-conformance.md +34 -2
  60. package/package.json +2 -1
  61. package/prebuilt/fortemi-core/framework/aiwg-fortemi-index-v2.json +1 -1
  62. package/prebuilt/fortemi-core/framework/manifest.json +2 -2
  63. package/schemas/mission-protocol/inventory-v1.json +0 -10
  64. package/tools/agents/providers/pi.mjs +13 -1
  65. package/tools/providers/pi-live-smoke.mjs +222 -0
  66. package/tools/ralph-external/index.mjs +13 -3
  67. package/tools/ralph-external/lib/pi-adapter.mjs +56 -0
  68. package/tools/ralph-external/lib/provider-adapter.mjs +6 -0
  69. package/tools/ralph-external/orchestrator.mjs +2 -0
  70. package/tools/ralph-external/session-launcher.mjs +9 -4
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-loop",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Iterative AI coding loops with automatic recovery - iteration beats perfection",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-persistence",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Human-in-the-loop (HITL) gate definitions for agent operations. Provides reusable YAML gates for destructive-action authorization, false-positive override, and recovery escalation. Loaded by agent loops and orchestrators that need bounded human checkpoints.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-installer",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Structured YAML manifests for reproducible, agent-driven software installation across platforms. Scripts are the primary artifact; agentic instructions handle adaptation and recovery.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiwg-dev",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Developer tooling for building AIWG itself and AIWG addons/frameworks. Not for end users — install explicitly with `aiwg use aiwg-dev`.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiwg-evals",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Automated evaluation framework for agent quality, based on KAMI benchmark methodology and ReAct patterns",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "auto-memory",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Automatic memory seed templates for AIWG projects",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browser-control",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Drive a real, user-installed Chromium-derived browser from an AIWG agent. Wraps @playwright/mcp with a setup wizard, health-check doctor, allow-list enforcement, and an opinionated agent persona that respects authorization and audit boundaries.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "color-palette",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Color palette selection and review tooling with color theory fundamentals, current trend research, and accessibility analysis.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "compound-memory",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Governed orchestration across AIWG line memory, semantic memory, and llm-wiki.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "context-curator",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Context curation and distractor filtering for production-grade agent reliability",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "daemon",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Persistent daemon session capabilities: Concierge front-end, session memory, scheduler integration",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "doc-intelligence",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Documentation intelligence addon for scraping, extraction, analysis, and generated-docs auditing.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "droid-bridge",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "MCP server bridging Claude Code to Factory Droid for batch operations and automated fixes",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forensics",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Digital forensics and incident response framework with 14 specialized agents covering target profiling, evidence acquisition, log/memory/container/cloud analysis, IOC extraction, and reporting.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "guided-implementation",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Bounded iteration control for autonomous issue-to-code implementation",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hooks",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Claude Code hooks for workflow tracing and observability.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "knowledge-base",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Knowledge-base / wiki framework with skills for ingestion, query, and lint. Build a structured, citable corpus with cross-references and concept pages.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "line-memory",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Bounded, plain-text project memory with least-recently-used retention.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "llm-wiki",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "LLM-maintained markdown wiki that compounds as sources are ingested. Thin topology declaration on the semantic memory kernel — ships schema profiles and page templates, no custom mechanics.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "marketing",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Marketing automation framework with 37 specialized agents for campaign management.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "media-curator",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Media archive management framework with 7 specialized agents for source discovery, acquisition (yt-dlp / Internet Archive / Bandcamp), quality assessment, metadata tagging, and provenance tracking.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nlp-prod",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Tools, skills, and CLI extensions for designing and productionizing LLM inference pipelines. Pattern-guided, slim by default, eval-first.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ops",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Operational infrastructure framework with 12 specialized agents covering incident response, runbook execution, fleet inventory, certificate lifecycle, and disaster recovery planning.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prose-integration",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Tools for reading, parsing, validating, and executing OpenProse programs from AIWG workflows",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "research",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Research workflow framework with 9 specialized agents for discovery, acquisition, synthesis, citation management, GRADE quality assessment, and OAIS-compliant archival.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rlm",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "RLM-inspired recursive context decomposition for processing arbitrarily large codebases and document corpora through programmatic sub-agent delegation",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sdlc",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Complete SDLC framework with 180+ specialized agents for software development lifecycle management.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "security-engineering",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Applied security framework for cryptographic primitive selection, chain-of-trust design, authentication factor analysis, supply-chain trust, and physical-threat modeling. Complements OWASP-style application audits.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "semantic-memory",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Topology-agnostic semantic memory operations: ingest, lint, query-capture, and structured event logging. Consumers declare a memory topology in their manifest.json; kernel skills read that contract to parameterize behavior.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skill-factory",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Build, enhance, validate, and package Claude skills end-to-end. Coordinates skill-builder, skill-enhancer, quality-checker, and skill-packager via the skill-architect agent.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "star-prompt",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Tasteful prompt to encourage users to star the repository after successful command completion",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "testing-quality",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Testing enforcement, quality metrics, and automation skills",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "twelve-factor",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Design-time and audit-time workflows for Twelve-Factor and modern 12+ Factor cloud-native application practices.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uat-mcp",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Agent-executable acceptance testing via MCP connections — generate, execute, and report on UAT plans that validate MCP tool surfaces.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "utils",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Core AIWG utilities for context regeneration and workspace management.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "validation-complete",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Validation Complete for AIWG",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "verbalized-sampling",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Training-free prompting technique that improves output diversity by 1.6-2.1x through verbalized probability distributions, addressing RLHF mode collapse",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "voice",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Voice profile system for consistent, authentic writing.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "writing",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.2",
4
4
  "description": "Writing quality validation and AI pattern detection.",
5
5
  "author": {
6
6
  "name": "AIWG Contributors",
@@ -489,7 +489,7 @@ providers:
489
489
  agent_teams: false
490
490
  tasks: false
491
491
  mcp: false
492
- behaviors: false
492
+ behaviors: true
493
493
  mission_control: false
494
494
  daemon: false
495
495
  emulation:
@@ -76,6 +76,17 @@
76
76
  "verification": "Inspect active profile and run metadata",
77
77
  "sourceUrl": "https://docs.warp.dev/agent-platform/capabilities/agent-profiles-permissions", "verifiedAt": "2026-07-20"
78
78
  },
79
+ "pi": {
80
+ "agent": "native", "skill": "inherited", "globalChild": "native",
81
+ "identifierSyntax": "provider/model identifier accepted by Pi --model",
82
+ "effortValues": ["minimal", "low", "medium", "high", "xhigh"],
83
+ "inheritance": "Omitted model and thinking level inherit the invoking Pi session",
84
+ "invalidPinFallback": "Pi resolves against its configured catalog and exits on invalid explicit selection",
85
+ "configTarget": "Pi headless launch arguments",
86
+ "artifactFormat": "Runtime --model and --thinking flags",
87
+ "verification": "Inspect strict JSONL state and the selected provider/model",
88
+ "sourceUrl": "https://github.com/earendil-works/pi/tree/main/packages/coding-agent#cli-reference", "verifiedAt": "2026-09-04"
89
+ },
79
90
  "windsurf": {
80
91
  "agent": "unsupported", "skill": "unsupported", "globalChild": "inherited",
81
92
  "identifierSyntax": "UI-selected provider model",
@@ -52,6 +52,14 @@
52
52
  },
53
53
  "sourceUrl": "https://opencode.ai/docs/models", "verifiedAt": "2026-07-20"
54
54
  },
55
+ "pi": {
56
+ "roles": {
57
+ "reasoning": { "id": "configured/reasoning", "status": "unverified", "observed": false },
58
+ "coding": { "id": "configured/coding", "status": "unverified", "observed": false },
59
+ "efficiency": { "id": "configured/efficiency", "status": "unverified", "observed": false }
60
+ },
61
+ "sourceUrl": "https://github.com/earendil-works/pi/tree/main/packages/coding-agent#providers--models", "verifiedAt": "2026-09-04"
62
+ },
55
63
  "warp": {
56
64
  "roles": {
57
65
  "reasoning": { "id": "profile-selected", "status": "unverified", "observed": false },
@@ -0,0 +1,26 @@
1
+ /** AIWG's reviewed Pi bridge. Loaded only after Pi project trust is granted. */
2
+ import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';
3
+
4
+ const destructive = /(?:^|[;&|]\s*)(?:sudo\s+)?(?:rm\s+-\S*r\S*\s+|git\s+(?:reset\s+--hard|clean\s+-)|chmod\s+777|chown\s+-R)/i;
5
+ const packageMutation = /(?:^|[;&|]\s*)(?:npm|pnpm|yarn|bun|pipx?|uv|cargo)\s+(?:install|add|update|upgrade)\b/i;
6
+
7
+ export async function evaluateAiwgPiCommand(
8
+ command: string,
9
+ hasUI: boolean,
10
+ confirm?: () => Promise<boolean>,
11
+ ): Promise<{ block: true; reason: string } | undefined> {
12
+ if (!destructive.test(command) && !packageMutation.test(command)) return undefined;
13
+ if (!hasUI) return { block: true, reason: 'AIWG policy blocked a destructive or package-mutating command in headless mode.' };
14
+ return await confirm?.() ? undefined : { block: true, reason: 'Denied by AIWG operator policy.' };
15
+ }
16
+
17
+ export default function aiwgBridge(pi: ExtensionAPI): void {
18
+ pi.on('tool_call', async (event, context) => {
19
+ if (event.toolName !== 'bash') return undefined;
20
+ const command = typeof event.input?.command === 'string' ? event.input.command : '';
21
+ return evaluateAiwgPiCommand(command, context.hasUI, async () => {
22
+ const choice = await context.ui.select('AIWG policy requires explicit approval for this command.', ['Deny', 'Allow once']);
23
+ return choice === 'Allow once';
24
+ });
25
+ });
26
+ }
@@ -17,6 +17,12 @@ export const defaultCommandRunner = (command, args, stdin = "") => new Promise((
17
17
  child.stdout.on("data", (chunk) => collect(stdout, chunk));
18
18
  child.stderr.on("data", (chunk) => collect(stderr, chunk));
19
19
  child.once("error", reject);
20
+ child.stdin.once("error", (error) => {
21
+ // A short-lived credential helper may close stdin before Node flushes the
22
+ // payload. Its process exit remains the authoritative command result.
23
+ if (error.code !== "EPIPE")
24
+ reject(error);
25
+ });
20
26
  child.once("close", (code) => resolve({
21
27
  stdout: Buffer.concat(stdout).toString("utf8"),
22
28
  stderr: Buffer.concat(stderr).toString("utf8"),
@@ -1,7 +1,7 @@
1
1
  import { existsSync, mkdirSync, realpathSync, statSync, } from 'node:fs';
2
2
  import { dirname, isAbsolute, resolve, } from 'node:path';
3
3
  import { pathToFileURL } from 'node:url';
4
- import { CLAUDE_ADAPTER_VERSION, ClaudeSessionAdapter, CODEX_ADAPTER_VERSION, CodexSessionAdapter, COPILOT_ADAPTER_VERSION, CopilotSessionAdapter, CURSOR_ADAPTER_VERSION, CursorSessionAdapter, FACTORY_ADAPTER_VERSION, FactorySessionAdapter, HERMES_ADAPTER_VERSION, HermesSessionAdapter, OPENCODE_ADAPTER_VERSION, OpenCodeSessionAdapter, OPENCLAW_ADAPTER_VERSION, OpenClawSessionAdapter, OPENHUMAN_ADAPTER_VERSION, OpenHumanSessionAdapter, WARP_ADAPTER_VERSION, WarpSessionAdapter, DEVIN_DESKTOP_ADAPTER_VERSION, DevinDesktopSessionAdapter, CandidateExtractionService, GENERIC_ADAPTER_VERSION, GenericSessionInterchangeAdapter, IncrementalSessionImporter, ImportLeaseContentionError, FilesystemMemoryDestination, FilesystemPromotionDispositionCoordinator, MemoryPromotionGateway, SESSION_CONTRACT_VERSION, SESSION_PROVIDER_IDS, SessionContractError, SessionRepository, SessionSourceSchema, StructuralCandidateExtractor, resolveMemoryConsumerManifest, assertSessionProviderId, acquireImportLease, defaultDiscoveryManifestPath, discoverWorkspaceHistories, deriveSessionTimeline, importDiscoveryManifest, previewDiscoveryImport, publicDiscoveryManifest, readDiscoveryManifest, redactSourceLocator, sha256, parseTimelineGap, writeDiscoveryManifest, } from '../../sessions/index.js';
4
+ import { CLAUDE_ADAPTER_VERSION, ClaudeSessionAdapter, CODEX_ADAPTER_VERSION, CodexSessionAdapter, COPILOT_ADAPTER_VERSION, CopilotSessionAdapter, CURSOR_ADAPTER_VERSION, CursorSessionAdapter, FACTORY_ADAPTER_VERSION, FactorySessionAdapter, HERMES_ADAPTER_VERSION, HermesSessionAdapter, OPENCODE_ADAPTER_VERSION, OpenCodeSessionAdapter, OPENCLAW_ADAPTER_VERSION, OpenClawSessionAdapter, OPENHUMAN_ADAPTER_VERSION, OpenHumanSessionAdapter, PI_ADAPTER_VERSION, PiSessionAdapter, WARP_ADAPTER_VERSION, WarpSessionAdapter, DEVIN_DESKTOP_ADAPTER_VERSION, DevinDesktopSessionAdapter, CandidateExtractionService, GENERIC_ADAPTER_VERSION, GenericSessionInterchangeAdapter, IncrementalSessionImporter, ImportLeaseContentionError, FilesystemMemoryDestination, FilesystemPromotionDispositionCoordinator, MemoryPromotionGateway, SESSION_CONTRACT_VERSION, SESSION_PROVIDER_IDS, SessionContractError, SessionRepository, SessionSourceSchema, StructuralCandidateExtractor, resolveMemoryConsumerManifest, assertSessionProviderId, acquireImportLease, defaultDiscoveryManifestPath, discoverWorkspaceHistories, deriveSessionTimeline, importDiscoveryManifest, previewDiscoveryImport, publicDiscoveryManifest, readDiscoveryManifest, redactSourceLocator, sha256, parseTimelineGap, writeDiscoveryManifest, } from '../../sessions/index.js';
5
5
  const JSON_CONTRACT_VERSION = '1.0.0';
6
6
  async function createLineMemoryPromotionDestination(projectRoot, manifestPath) {
7
7
  const modulePath = resolve(dirname(manifestPath), 'commands', 'line-memory.mjs');
@@ -622,7 +622,7 @@ async function importSource(ctx, args) {
622
622
  if (provider !== 'generic' && provider !== 'claude' && provider !== 'codex'
623
623
  && provider !== 'copilot' && provider !== 'cursor' && provider !== 'factory'
624
624
  && provider !== 'hermes' && provider !== 'opencode' && provider !== 'openclaw'
625
- && provider !== 'openhuman' && provider !== 'warp' && provider !== 'devin-desktop') {
625
+ && provider !== 'openhuman' && provider !== 'pi' && provider !== 'warp' && provider !== 'devin-desktop') {
626
626
  throw new CliError('UNSUPPORTED_OPERATION', `session import is not implemented for ${provider}`, EXIT.unsupported);
627
627
  }
628
628
  const sourceId = requiredValue(args, '--source-id');
@@ -638,6 +638,7 @@ async function importSource(ctx, args) {
638
638
  const isOpenCode = provider === 'opencode';
639
639
  const isOpenClaw = provider === 'openclaw';
640
640
  const isOpenHuman = provider === 'openhuman';
641
+ const isPi = provider === 'pi';
641
642
  const isWarp = provider === 'warp';
642
643
  const isDevinDesktop = provider === 'devin-desktop';
643
644
  const adapter = isClaude
@@ -658,11 +659,13 @@ async function importSource(ctx, args) {
658
659
  ? new OpenClawSessionAdapter()
659
660
  : isOpenHuman
660
661
  ? new OpenHumanSessionAdapter()
661
- : isWarp
662
- ? new WarpSessionAdapter()
663
- : isDevinDesktop
664
- ? new DevinDesktopSessionAdapter()
665
- : new GenericSessionInterchangeAdapter();
662
+ : isPi
663
+ ? new PiSessionAdapter()
664
+ : isWarp
665
+ ? new WarpSessionAdapter()
666
+ : isDevinDesktop
667
+ ? new DevinDesktopSessionAdapter()
668
+ : new GenericSessionInterchangeAdapter();
666
669
  const locatorClass = isClaude
667
670
  ? (input.endsWith('.hooks.jsonl') ? 'claude-hook-jsonl' : 'claude-transcript-jsonl')
668
671
  : isCodex
@@ -681,11 +684,13 @@ async function importSource(ctx, args) {
681
684
  ? 'openclaw-consistent-snapshot-jsonl'
682
685
  : isOpenHuman
683
686
  ? 'openhuman-enriched-jsonl'
684
- : isWarp
685
- ? 'warp-markdown-export'
686
- : isDevinDesktop
687
- ? 'devin-desktop-cascade-hook-jsonl'
688
- : 'manual-export';
687
+ : isPi
688
+ ? 'pi-session-v3-jsonl'
689
+ : isWarp
690
+ ? 'warp-markdown-export'
691
+ : isDevinDesktop
692
+ ? 'devin-desktop-cascade-hook-jsonl'
693
+ : 'manual-export';
689
694
  const selectedSource = {
690
695
  provider, locator: input, locatorClass, sourceId,
691
696
  authorizedScope: { workspaceId, allowedRoots: [dirname(input)] },
@@ -1007,6 +1012,19 @@ function providerDisposition(provider) {
1007
1012
  },
1008
1013
  };
1009
1014
  }
1015
+ if (provider === 'pi') {
1016
+ return {
1017
+ provider, disposition: 'implemented', operationalState: 'available',
1018
+ supportedOperations: ['discover', 'inspect', 'stream'],
1019
+ acquisitionModes: ['jsonl'], reasonCode: null,
1020
+ remediation: 'Authorize PI_CODING_AGENT_SESSION_DIR, the default Pi sessions root, or an explicit v3 JSONL export.',
1021
+ evidence: {
1022
+ adapterVersion: PI_ADAPTER_VERSION,
1023
+ verifiedAt: '2026-09-04',
1024
+ documentation: 'https://github.com/earendil-works/pi/blob/main/packages/coding-agent/src/core/session-manager.ts',
1025
+ },
1026
+ };
1027
+ }
1010
1028
  if (provider === 'warp') {
1011
1029
  return {
1012
1030
  provider, disposition: 'manual-only', operationalState: 'available',
@@ -67,6 +67,13 @@ export const PROVIDER_DISCOVERY_DECISIONS = {
67
67
  reason: 'OpenHuman profiles accept semantic model hints but expose no standardized local model-list command.',
68
68
  documentation: 'https://github.com/roctinam/openhuman',
69
69
  },
70
+ pi: {
71
+ provider: 'pi',
72
+ status: 'native',
73
+ interface: 'pi --list-models',
74
+ reason: 'Pi exposes the configured provider/model catalog through a read-only non-interactive table.',
75
+ documentation: 'https://github.com/earendil-works/pi/tree/main/packages/coding-agent#cli-reference',
76
+ },
70
77
  warp: {
71
78
  provider: 'warp',
72
79
  status: 'unsupported',
@@ -161,6 +168,30 @@ export async function discoverOpenCodeModels(command = 'opencode', runner = runM
161
168
  : {}),
162
169
  };
163
170
  }
171
+ export async function discoverPiModels(command = 'pi', runner = runModelDiscoveryCommand) {
172
+ const observedAt = new Date().toISOString();
173
+ const [version, result] = await Promise.all([
174
+ runtimeVersion(command, runner),
175
+ runner(command, ['--list-models'], { cwd: tmpdir(), timeoutMs: 15_000 }),
176
+ ]);
177
+ if (result.exitCode !== 0) {
178
+ const error = result.stderr.trim() || `Pi --list-models exited ${result.exitCode}`;
179
+ return { provider: 'pi', source: 'native', observedAt,
180
+ ...(version ? { runtimeVersion: version } : {}), accountScope: 'local-runtime',
181
+ models: [], errorKind: classifyDiscoveryError(error), error };
182
+ }
183
+ const lines = result.stdout.split(/\r?\n/).map(line => line.trim()).filter(Boolean);
184
+ const models = lines.slice(1).flatMap(line => {
185
+ const columns = line.split(/\s{2,}/);
186
+ if (columns.length < 2 || !/^[a-z0-9][a-z0-9._-]*$/i.test(columns[0]))
187
+ return [];
188
+ return [{ id: `${columns[0]}/${columns[1]}` }];
189
+ });
190
+ return { provider: 'pi', source: 'native', observedAt,
191
+ ...(version ? { runtimeVersion: version } : {}), accountScope: 'local-runtime', models,
192
+ ...(models.length === 0 ? { errorKind: 'invalid-output',
193
+ error: 'Pi returned no parseable provider/model rows.' } : {}) };
194
+ }
164
195
  export async function discoverOpenClawModels(command = 'openclaw', runner = runModelDiscoveryCommand) {
165
196
  const observedAt = new Date().toISOString();
166
197
  const [version, result] = await Promise.all([
@@ -455,6 +486,7 @@ export async function resolveDynamicModelCatalog(options) {
455
486
  codex: () => discoverCodexModels(),
456
487
  opencode: () => discoverOpenCodeModels(),
457
488
  openclaw: () => discoverOpenClawModels(),
489
+ pi: () => discoverPiModels(),
458
490
  };
459
491
  const providerDiscovery = {};
460
492
  for (const provider of available) {
@@ -27,7 +27,7 @@ const capabilityData = requireModelResource('model-capabilities.v1.json');
27
27
  const catalogData = requireModelResource('model-catalog.v1.json');
28
28
  const ProviderSchema = z.enum([
29
29
  'claude', 'codex', 'copilot', 'cursor', 'factory', 'hermes',
30
- 'opencode', 'openclaw', 'openhuman', 'warp', 'windsurf',
30
+ 'opencode', 'openclaw', 'openhuman', 'pi', 'warp', 'windsurf',
31
31
  ]);
32
32
  const OutcomeSchema = z.enum([
33
33
  'native', 'compiled', 'inherited', 'global-only', 'informational', 'unsupported',
@@ -107,7 +107,7 @@ export function loadProviderModelCapabilities() {
107
107
  const expected = new Set(ProviderSchema.options);
108
108
  const actual = new Set(Object.keys(registryCache.providers));
109
109
  if (actual.size !== expected.size || [...expected].some(id => !actual.has(id))) {
110
- throw new Error('Provider model capability registry must cover all 11 providers');
110
+ throw new Error('Provider model capability registry must cover all 12 providers');
111
111
  }
112
112
  }
113
113
  return registryCache;
@@ -159,6 +159,7 @@ function fieldNames(provider) {
159
159
  case 'copilot':
160
160
  case 'cursor':
161
161
  case 'opencode': return { model: 'model' };
162
+ case 'pi': return { model: 'model', effort: 'thinking' };
162
163
  case 'openhuman': return { model: 'model_hint' };
163
164
  case 'openclaw': return { model: 'subagents.model' };
164
165
  default: return {};