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.
- package/agentic/code/plugins/agent-loop/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/agent-persistence/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/agentic-installer/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/aiwg-dev/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/aiwg-evals/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/auto-memory/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/browser-control/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/color-palette/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/compound-memory/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/context-curator/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/daemon/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/doc-intelligence/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/droid-bridge/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/forensics/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/guided-implementation/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/hooks/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/knowledge-base/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/line-memory/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/llm-wiki/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/marketing/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/media-curator/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/nlp-prod/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/ops/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/prose-integration/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/research/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/rlm/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/sdlc/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/security-engineering/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/semantic-memory/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/skill-factory/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/star-prompt/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/testing-quality/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/twelve-factor/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/uat-mcp/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/utils/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/validation-complete/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/verbalized-sampling/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/voice/.claude-plugin/plugin.json +1 -1
- package/agentic/code/plugins/writing/.claude-plugin/plugin.json +1 -1
- package/agentic/code/providers/capability-matrix.yaml +1 -1
- package/agentic/code/providers/model-capabilities.v1.json +11 -0
- package/agentic/code/providers/model-catalog.v1.json +8 -0
- package/agentic/code/providers/pi/aiwg-bridge.ts +26 -0
- package/dist/src/auth/credential-store.js +6 -0
- package/dist/src/cli/handlers/sessions.js +30 -12
- package/dist/src/models/model-discovery.js +32 -0
- package/dist/src/models/provider-policy.js +3 -2
- package/dist/src/sessions/adapters/pi.js +141 -0
- package/dist/src/sessions/contracts.js +1 -1
- package/dist/src/sessions/index.js +1 -0
- package/dist/src/sessions/workspace-discovery.js +10 -0
- package/docs/agent-loop/manual-provider-testing.md +6 -0
- package/docs/agents/providers/pi.md +163 -31
- package/docs/cli/reference.md +2 -2
- package/docs/integrations/pi-quickstart.md +70 -27
- package/docs/planning/session-intelligence/provider-conformance-matrix.json +11 -1
- package/docs/providers/pi-sessions.md +7 -0
- package/docs/releases/v2026.9.2-announcement.md +91 -0
- package/docs/testing/model-provider-conformance.md +34 -2
- package/package.json +2 -1
- package/prebuilt/fortemi-core/framework/aiwg-fortemi-index-v2.json +1 -1
- package/prebuilt/fortemi-core/framework/manifest.json +2 -2
- package/schemas/mission-protocol/inventory-v1.json +0 -10
- package/tools/agents/providers/pi.mjs +13 -1
- package/tools/providers/pi-live-smoke.mjs +222 -0
- package/tools/ralph-external/index.mjs +13 -3
- package/tools/ralph-external/lib/pi-adapter.mjs +56 -0
- package/tools/ralph-external/lib/provider-adapter.mjs +6 -0
- package/tools/ralph-external/orchestrator.mjs +2 -0
- package/tools/ralph-external/session-launcher.mjs +9 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-persistence",
|
|
3
|
-
"version": "2026.9.
|
|
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.
|
|
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.
|
|
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": "browser-control",
|
|
3
|
-
"version": "2026.9.
|
|
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.
|
|
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": "forensics",
|
|
3
|
-
"version": "2026.9.
|
|
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": "knowledge-base",
|
|
3
|
-
"version": "2026.9.
|
|
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": "llm-wiki",
|
|
3
|
-
"version": "2026.9.
|
|
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": "media-curator",
|
|
3
|
-
"version": "2026.9.
|
|
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.
|
|
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.
|
|
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": "research",
|
|
3
|
-
"version": "2026.9.
|
|
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.
|
|
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": "security-engineering",
|
|
3
|
-
"version": "2026.9.
|
|
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.
|
|
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.
|
|
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": "uat-mcp",
|
|
3
|
-
"version": "2026.9.
|
|
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": "verbalized-sampling",
|
|
3
|
-
"version": "2026.9.
|
|
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",
|
|
@@ -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
|
-
:
|
|
662
|
-
? new
|
|
663
|
-
:
|
|
664
|
-
? new
|
|
665
|
-
:
|
|
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
|
-
:
|
|
685
|
-
? '
|
|
686
|
-
:
|
|
687
|
-
? '
|
|
688
|
-
:
|
|
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
|
|
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 {};
|