forgeomni / superaicore
Laravel package for AI execution engine: pluggable backends (Claude CLI / Codex CLI / SuperAgent / Anthropic API / OpenAI API), provider/service/routing management UI, MCP server management, usage tracking, cost analytics, process monitor. Works standalone in a fresh Laravel install; UI is optional
Requires
- php: ^8.1
- forgeomni/superagent: ^1.0.9
- guzzlehttp/guzzle: ^7.0
- illuminate/console: ^10.0|^11.0|^12.0
- illuminate/database: ^10.0|^11.0|^12.0
- illuminate/http: ^10.0|^11.0|^12.0
- illuminate/support: ^10.0|^11.0|^12.0
- symfony/console: ^6.0|^7.0
- symfony/process: ^6.0|^7.0
Requires (Dev)
- orchestra/testbench: ^8.0|^9.0|^10.0
- phpunit/phpunit: ^10.0|^11.0
- dev-main
- v1.0.1
- v1.0.0
- v0.9.9
- v0.9.8
- v0.9.7
- v0.9.6
- v0.9.5
- v0.9.2
- v0.9.1
- v0.9.0
- v0.8.9
- v0.8.8
- v0.8.7
- v0.8.6
- v0.8.5
- v0.8.2
- v0.8.1
- v0.8.0
- v0.7.2
- v0.7.1
- v0.7.0
- v0.6.9
- v0.6.8
- v0.6.7
- v0.6.6
- v0.6.5
- v0.6.2
- v0.6.1
- v0.6.0
- v0.5.9
- v0.5.8
- v0.5.7
- v0.5.6
- v0.5.5
- v0.5.2
- v0.5.1
- v0.5.0
- dev-test
- dev-fix/providers-page-cli-gating
- dev-release/0.8.1
- dev-feat/portable-mcp-paths
This package is auto-updated.
Last update: 2026-05-29 19:35:39 UTC
README
Laravel package for unified AI execution across eight execution engines — Claude Code CLI, Codex CLI, Gemini CLI, GitHub Copilot CLI, AWS Kiro CLI, Moonshot Kimi Code CLI, Alibaba Qwen Code CLI, and SuperAgent SDK. Ships with a framework-agnostic CLI, a capability-based dispatcher, MCP server management, usage tracking, cost analytics, an OpenAI-compatible proxy, magic-trace ring-buffer tracing, and a complete admin UI.
Works standalone in a fresh Laravel install. The UI is optional and fully overridable — embed it inside a host application (e.g. SuperTeam) or disable it entirely when only the services are needed.
Table of contents
- Relationship to SuperAgent
- Features
- Execution engines + provider types
- Skill & sub-agent runner
- Skill engine — telemetry, ranking, evolution
- jcode companion-tools wave (0.9.0 / SDK 0.9.7)
- DeepSeek-TUI parity wave (0.9.1 / SDK 0.9.8)
- TaskRunner reliability wave (0.9.2)
- Squad multi-agent + SDK 1.0.0 wave (0.9.6)
- opencode-borrowed feature wave (0.9.7 / SDK 1.0.5)
- Qwen + tracing + 9Router wave (0.9.8)
- Opus 4.8 + Grok + Cursor wave (1.0.0 / SDK 1.0.9)
- CLI installer & health
- Dispatcher & streaming
- Model catalog
- Provider type system
- Usage tracking & cost
- Idempotency & tracing
- MCP server manager
- SuperAgent SDK integration
- Agent-spawn hardening
- Process monitor & admin UI
- Host integration
- Requirements
- Install
- CLI quick start
- PHP quick start
- Architecture
- Advanced usage
- Configuration
- License
Relationship to SuperAgent
forgeomni/superaicore and forgeomni/superagent are sibling packages, not a parent and a child:
- SuperAgent is a minimal in-process PHP SDK that drives a single LLM tool-use loop (one agent, one conversation).
- SuperAICore is a Laravel-wide orchestration layer — it picks a backend, resolves provider credentials, routes by capability, tracks usage, calculates cost, manages MCP servers, and ships an admin UI.
SuperAICore does not require SuperAgent to function. The SDK is one of several backends. The six CLI engines and the three HTTP backends work without it, and SuperAgentBackend gracefully reports itself as unavailable (class_exists(Agent::class) check) when the SDK is absent. Set AI_CORE_SUPERAGENT_ENABLED=false in your .env and the Dispatcher falls back to the remaining backends.
The forgeomni/superagent entry in composer.json is there so the SuperAgent backend compiles out of the box. If you never use it, remove it from composer.json before composer install in your host app — nothing else in SuperAICore imports the SuperAgent namespace.
Features
Each feature below is tagged with the version it landed in. Features without a tag have been there since before 0.6.0.
Execution engines + provider types
- Ten execution engines unified behind a single
Dispatchercontract:- Claude Code CLI — provider types:
builtin(local login),anthropic,anthropic-proxy,bedrock,vertex. - Codex CLI —
builtin(ChatGPT login),openai,openai-compatible. - Gemini CLI —
builtin(Google OAuth),google-ai,vertex. - GitHub Copilot CLI —
builtinonly (copilotbinary owns OAuth/keychain/refresh). Reads.claude/skills/natively (zero-translation skill pass-through). Subscription billed — tracked separately on the dashboard. - AWS Kiro CLI (since 0.6.1) —
builtin(localkiro-cli login),kiro-api(stored key injected asKIRO_API_KEYfor headless). Ships the richest out-of-the-box CLI feature set — native agents, skills, MCP, and subagent DAG orchestration (noSpawnPlanemulation). Reads Claude'sSKILL.mdformat verbatim. Subscription billed — credit-based Pro / Pro+ / Power plans. - Moonshot Kimi Code CLI (since 0.6.8) —
builtin(kimi loginOAuth viaauth.kimi.com). Complements the SDK's direct-HTTPKimiProviderby covering the OAuth-subscription agentic-loop path, mirroring theanthropic_api↔claude_clisplit. NativeAgentfanout is honoured by default; opt into AICore's three-phase Pipeline viause_native_agents=false. Subscription billed — Moonshot Pro / Power. - Alibaba Qwen Code CLI (since 0.9.8) — gemini-cli fork (
QwenLM/qwen-codev0.16.0). API key only viaDASHSCOPE_API_KEY/QWEN_API_KEY(Qwen OAuth was EOL'd 2026-04-15). Default modelqwen3.7-max— 1M context, $2.50/$7.50 per 1M, speaks Anthropic's/v1/messagesnatively (drop-in for Claude in fallback chains). Usage billed. - Cursor Composer CLI (since 1.0.0) —
builtin(cursor-agent loginbrowser OAuth →~/.cursor; headless runners may exportCURSOR_API_KEY). Cursor's headless Composer agent (cursor-agent). Default modelcomposer-2.5-fast; also proxies Anthropic (claude-opus-4-8-thinking-high) and OpenAI (gpt-5.x-codex) SKUs + anautorouter. MCP via.cursor/mcp.json. Subscription billed — Cursor plan. - xAI Grok Build CLI (since 1.0.0) —
builtin(grok logingrok.com OAuth →~/.grok). xAI's "Grok Build" agentic CLI (grok). Default modelgrok-build; native sub-agents, effort control (--effort low…max), MCP viagrok mcp add. Subscription billed — grok.com plan. (Distinct from the metered xAI API provider type below.) - SuperAgent SDK — provider types:
anthropic,anthropic-proxy,openai,openai-compatible, plusopenai-responses(since 0.7.0),lmstudio(since 0.7.0),deepseek(since 0.9.0),qwen-anthropic(since 0.9.8), andgrok(since 1.0.0 — metered xAI API,XAI_API_KEY/GROK_API_KEY, defaultgrok-4.3, 1M context).
- Claude Code CLI — provider types:
openai-responsesprovider type (since 0.7.0) — routes through the SDK'sOpenAIResponsesProvideragainst/v1/responses. Auto-detects Azure OpenAI deployments from thebase_urlpattern (addsapi-version=2025-04-01-previewquery string; override viaextra_config.azure_api_version). When the row stores anaccess_tokenfrom a host-app ChatGPT-OAuth flow instead of an API key, the SDK flips the base URL tochatgpt.com/backend-api/codexso Plus / Pro / Business subscribers hit their subscription quota.lmstudioprovider type (since 0.7.0) — local LM Studio server (defaulthttp://localhost:1234). OpenAI-compat wire; no real API key needed — the SDK synthesises a placeholderAuthorizationheader.- Thirteen dispatcher adapters behind the ten engines (
claude_cli,codex_cli,gemini_cli,copilot_cli,kiro_cli,kimi_cli,qwen_cli,cursor_cli,grok_cli,superagent,anthropic_api,openai_api,gemini_api). CLI adapters when a provider usesbuiltin/kiro-api; HTTP adapters when it uses an API key. Addressable directly from the CLI when needed. EngineCatalogsingle source of truth — engine labels, icons, dispatcher backends, supported provider types, available models, and the declarativeProcessSpec(binary, version/auth-status args, prompt/output/model flags, default flags) live in one PHP service. Adding a new CLI engine means editingEngineCatalog::seed()and every picker updates automatically. Host apps override per-engine fields viasuper-ai-core.enginesconfig.modelOptions($key)/modelAliases($key)(since 0.5.9) drive host-app model dropdowns.
Skill & sub-agent runner
- Skill & sub-agent discovery — auto-discovers Claude Code skills (
.claude/skills/<name>/SKILL.md) and sub-agents (.claude/agents/<name>.md) from three sources for skills (project > plugin > user) and two for agents. Exposes each as a first-class CLI subcommand (skill:list,skill:run,agent:list,agent:run). - Cross-backend native execution —
--exec=nativeruns a skill on the selected backend's CLI;CompatibilityProbeflags incompatible skills;SkillBodyTranslatorrewrites canonical tool names (`Read`→read_file, …) and injects backend preamble (Gemini / Codex). - Side-effect-locking fallback chain —
--exec=fallback --fallback-chain=gemini,claudetries hops in order, skips incompatible ones, and hard-locks on the first hop that writes to cwd (mtime diff + stream-jsontool_useevents). gemini:sync— mirrors skills/agents into Gemini custom commands (/skill:init,/agent:reviewer). Respects manual edits via~/.gemini/commands/.superaicore-manifest.json.copilot:sync— mirrors agents into~/.copilot/agents/*.agent.md. Auto-fires beforeagent:run --backend=copilot.copilot:sync-hooks— merges Claude-style hooks (.claude/settings.json:hooks) into Copilot's~/.copilot/config.json:hooks.copilot:fleet— runs the same task across N Copilot sub-agents concurrently, aggregates results, registers each child in the Process Monitor.kiro:sync(since 0.6.1) — translates Claude agent frontmatter into~/.kiro/agents/*.jsonfor native Kiro DAG execution.kimi:sync(since 0.6.8) — translates.claude/agents/*.mdtool lists into~/.kimi/agents/*.yaml+~/.kimi/mcp.json.claude:mcp-syncfans out to Kimi automatically.
Skill engine — telemetry, ranking, evolution
Three orthogonal services (since 0.8.6) that turn the static skill catalog into a feedback loop. Borrowed in spirit from HKUDS/OpenSpace's skill_engine, trimmed to the safe subset for production use — DERIVED / CAPTURED modes intentionally omitted (humans curate new skills on Day 0); cloud registry omitted (no cross-project sharing need yet).
SkillTelemetry(since 0.8.6) — one row per Claude Code Skill tool invocation insac_skill_executions. PreToolUse hook →php artisan skill:track-start(insertin_progressrow, returns id). Stop hook →php artisan skill:track-stop(close every still-open row for the session). Both commands accept Claude Code's hook JSON payload on stdin so the wiring lives in.claude/settings.local.json, not in PHP. Aggregation seam:SkillTelemetry::metrics(?since, ?skillName)returns per-skillapplied / completed / failed / orphaned / interrupted / completion_rate / failure_rate / last_used_at.sweepOrphaned(maxAgeSeconds=7200)recovers from crashed sessions.SkillRanker(since 0.8.6) — pure-PHP BM25 over theSkillRegistrycatalog (Robertson-WalkerK1=1.5,B=0.75, BM25-Plus IDF). CJK-aware tokeniser emits each Han character as its own token (Chinese skill descriptions are short — char-grams suffice), tiny EN+zh stopword list, hyphenated words yield their parts. Confidence-weighted telemetry boost:final = bm25 * (1 + 0.4 * (success_rate - 0.5) * applied_signal), whereapplied_signal = min(1, applied / 10)saturates near 10 runs. Skills with no telemetry getboost = 1.0. Drivesphp artisan skill:rank "your task description"— table or JSON, with full per-term IDF×TF breakdown for debugging.SkillEvolver(since 0.8.6) — FIX-mode only. Reads recent failures + current SKILL.md, builds a constrained LLM prompt ("smallest possible patch", "do not invent failures the evidence does not support", "do not restructure sections / rename / change frontmattername/ add new tools toallowed-toolsunless evidence demands it"), and persists aSkillEvolutionCandidaterow inpendingstatus. Never modifies SKILL.md directly — humans review viaphp artisan skill:candidates --id=N --show-prompt --show-diff.--dispatchmode (off by default — costs tokens) routes the prompt through the Dispatcher withcapability: 'reasoning', parses the\``diffblock, and stores bothproposed_bodyandproposed_diff.--sweep --threshold=0.30 --min-applied=5queues candidates for every skill that exceeds the threshold; de-duped against existing pending rows so it's safe to run daily. Triggers:manual/failure/metric_degradation`.- Six artisan commands:
skill:track-start,skill:track-stop,skill:stats,skill:rank,skill:evolve,skill:candidates. All registered throughSuperAICoreServiceProvider::boot()—php artisan skill:*works in any host that mounts the package. - Two new tables:
sac_skill_executions(skill_name, host_app, session_id, status, started_at, completed_at, duration_ms, transcript_path, error_summary, cwd, metadata json) andsac_skill_evolution_candidates(skill_name, trigger_type, execution_id, status, rationale, proposed_diff, proposed_body, llm_prompt, context json, reviewed_at, reviewed_by). Both honoursuper-ai-core.table_prefixviaHasConfigurablePrefix.php artisan migrateto pick them up.
jcode companion-tools wave (0.9.0 / SDK 0.9.7)
Five jcode-borrowed primitives shipped in SuperAgent SDK 0.9.7 and surfaced
in SuperAICore 0.9.0. Each is opt-in via env flag and degrades to no-op when
its host wiring is absent — pre-0.9.7 behaviour preserved verbatim unless
you flip the corresponding switch. SDK constraint moves to ^0.9.7.
agent_greptool — default ON (0.9.0) —SuperAgentBackendauto-prepends'agent_grep'toload_toolswhen callers don't supply one (AI_CORE_TOOLS_AGENT_GREP=trueis the default). The tool injects enclosing-symbol context (PHP/JS/TS/Py/Go) into every grep hit and truncates chunks the agent has already seen this session. Strict superset ofgrep; only fires on dispatches that actually opt into a tool-using agentic loop. SetAI_CORE_TOOLS_AGENT_GREP=falsefor byte-identical pre-0.9.7 behaviour.browsertool wiring (0.9.0) —AI_CORE_TOOLS_BROWSER=truemakesSuperAgentBackendinstantiate SDK 0.9.7'sFirefoxBridgeTool(drives Firefox / Chromium via Native Messaging) andAgent::addTool()it. RequiresSUPERAGENT_BROWSER_BRIDGE_PATHto point at the launcher; without it every action returns an explanatory error so the agent stops looping.BrowserScreenshotStoreround-trip (0.9.0) — when thebrowsertool emits a base64 PNG,SuperAgentBackendwrites it toBrowserScreenshotStorekeyed byprocess_id/external_label/metadata.session_idand surfaces the URL on the dispatch envelope aslatest_screenshot_url.AiProcessSourcereadslatest()against the row'sexternal_label(then composite id) when constructingProcessEntry, andpurgeFor()'s those keys on reap. End-to-end loop closes without host-side glue. Configurable disk + dir viasuper-ai-core.browser_screenshots.SemanticSkillRerankerviaEmbeddingProviderSPI (0.9.0) — the optional second pass overSkillRanker's BM25 top-N now resolves a SuperAgent SDK 0.9.7EmbeddingProviderthroughEmbeddingProviderFactory(super-ai-core.embeddings.{provider,callback,ollama_url}). Reranker, the SDK's ownSemanticSkillRouter, and any host-suppliedOnnxEmbeddingProvidershare one container singleton + one cache. Per-row failure ([]vector) keeps the BM25 score for that hit instead of bailing the whole call. Falls back to BM25 ordering when no embedder is configured.usage_sourcecost-attribution split (0.9.0) —Dispatcher::resolveUsageSource()promotesoptions['usage_source']/options['metadata']['usage_source']to a top-levelmetadata.usage_sourcekey (default'user')./usagegains a "By Source" card with an "N ambient · $X" badge so SuperAgent'sAmbientWorker-tagged dedup/staleness ticks are visible at a glance without re-instrumenting host cost code.- Cross-harness session resume (0.9.0) —
HarnessSessionResolverwraps SDK 0.9.7'sConversation\HarnessImporterfamily (ClaudeCodeImporterreads~/.claude/projects/<hash>/<uuid>.jsonl,CodexImporterreads~/.codex/sessions/**/*.jsonl)./processesgains a "Resume from…" dropdown + transcript modal gated bysuper-ai-core.resume.enabled. Hosts wiresuper-ai-core.resume.on_load(callable) to actually re-dispatch into a backend; otherwise the modal shows the transcript inline for inspection.
Full recipes (Ollama embedder wiring, browser launcher setup, ambient worker tick loop, harness resume callback): docs/advanced-usage.md §17–§21.
DeepSeek-TUI parity wave (0.9.1 / SDK 0.9.8)
Five SDK 0.9.8 companion bindings landed in SuperAICore 0.9.1, plus one
backend hardening fix. SDK constraint moves to ^0.9.8. None of the new
SDK pieces (Goals\GoalManager, Security\UntrustedInput,
Swarm\AgentDepthGuard, Providers\Transport\TokenBucket,
Conversation\Fork, Memory\AdHocMemoryProvider, the DeepSeek V4
Interleaved-Thinking enforcer, Routing\AutoModelStrategy,
Context\Strategies\CacheAwareCompressor) change SDK call shapes —
they're additive and opt-in.
Goals\EloquentGoalStore+AiGoalmodel + migration (0.9.1) — durable backing for SDK 0.9.8'sGoals\Contracts\GoalStoreSPI. Each thread can hold at most one row in non-terminal status (active/paused/budget_limited); paused goals stay paused after the host process restarts. The service provider bindsGoalStore::class → EloquentGoalStore::classand registersGoalManageras a singleton, soapp(GoalManager::class)resolves with the durable store auto-injected. Hosts that already keep goals in their own table swap in their ownGoalStoreimplementation — no fork. Runphp artisan migrateto pick up theai_goalstable; if you don't useGoals\GoalManagerthe binding stays inert.- Three-tier approval gate (0.9.1) —
Runner\ApprovalMode(Auto/Suggest/Never) +ApprovalGate+ApprovalDecisionmirror codex's/permissionscommand. Read-only allowlist (agent_grep/agent_glob/agent_read/agent_ls/web_search/web_fetch/agent_get_goal) flows through every mode. Mutations inSuggestreturncanRetry: truewith codemutation_pending_approval(ordestructive_pending_approvalwhen the existingGuidance\Gates\DestructiveCommandScannerflags the call); a single-usetool_use_idoverride token unblocks one retry — the codex/approveflow ported to API shape.Automode lets ordinary mutations through but still pauses for/approveon destructive ops;Neveris read-only. Resolve viaapp(ApprovalGate::class). Plugins\WorkspacePluginRegistry(0.9.1) — codex's "workspace plugin sharing" pattern. A team checks.superaicore/workspace-plugins.jsoninto the repo; the registry diffs against locally-installed plugin names and returnsmissing_required(scope=workspace, must install for everyone) vsmissing_recommended(scope=user, informational).git cloneputs new hires on the team's full toolset without a per-machine onboarding doc. Bound as a singleton overbase_path().- Headless
GET /v1/usageJSON endpoint (0.9.1) —Http\Controllers\UsageApiControllermirrors codex's app-server/v1/usageshape. One axis per request:group_by=day | model | provider | thread | backend | task_type. Same filters as the HTML controller (model,task_type,user_id,backend,days). Auth is the host's job — wrap the route group in your own middleware. Buckets carryruns / cost_usd / shadow_cost_usd / input_tokens / output_tokens / cache_read_tokens / cache_hit_rate. metadata.cache_hit_rateon every usage row (0.9.1) —UsageRecorderstampscache_hit_rate ∈ [0, 1]whenever the row carries a non-zero cache slice. Denominator is the GROSS prompt (uncached input + cache reads) so dashboards can group by model / day / backend and average without re-deriving the denominator. Absent when no cache activity occurred — distinguishes "no cache eligible" from "0% hit rate". Also accepts the legacycache_hit_tokensalias from DeepSeek V3 / R1 wires. The/usagepage now answers "what fraction of my paid prompt was free this period?" — same question DeepSeek-TUI asks at turn-end, just aggregated. Newtotal_cache_read_tokenssummary card.
Full recipes (goal store override, approval gate wiring, workspace
plugin manifest, /v1/usage cookbook, cache-hit-rate dashboards):
docs/advanced-usage.md §22–§26.
TaskRunner reliability wave (0.9.2)
Long operator tasks can now fail over between backends when the primary CLI/API hits a quota or rate-limit wall. 0.9.2 treats this as a reliability layer for TaskRunner: explicit/automatic chains, failure-context handoff, attempt reporting, UI persistence hooks, and safe retry boundaries. Fallback is per-run: the requested backend is always attempted first, so recovered primaries take traffic again automatically.
- Explicit chains — pass
fallback_chainas['claude_cli', 'codex_cli', 'gemini_cli']; TaskRunner prepends the requested backend when missing and de-dupes the chain. - Workload policies — pass
fallback_profileor rely ontask_type/capabilityto resolvechains_by_profile,chains_by_task_type, orchains_by_capabilityfrom config. - Automatic chains —
fallback_chain => 'auto'builds the chain from registered/enabled backends, with optional availability checks viaAI_CORE_TASK_FALLBACK_CHECK_AVAILABILITY=true. - Limit-aware handoff —
fallback_ondefaults cover quota/rate-limit wording (rate limit,usage limit,quota,429,too many requests,usage_not_included). Non-matching failures stop on the original backend. - Failure-context inheritance — the next backend receives the original
prompt plus a compact failure/log excerpt unless
inherit_failure_context=false. TaskResultEnvelope::$fallbackReportrecords every attempt (backend, attempt number, success, exit code, model, log file, error).- Workload-specific policy — hosts can keep different chains for coding, research/summarisation, and background maintenance instead of using one global retry rule for every task type.
- Operator observability — the compact report and per-attempt Dispatcher metadata can be stored on task rows or usage rows and rendered as "primary limited, continued on codex" with direct links to per-attempt logs.
- Reliability analytics — combine
fallbackReportwithai_usage_logs.backendto find primaries that frequently hit quota and secondaries that actually complete work. - Safe rollout path — start with per-call chains, promote stable policy into config, then enable automatic fallback only after backend availability and billing behaviour are understood.
Global defaults live under super-ai-core.task_fallback; env toggles are
AI_CORE_TASK_FALLBACK_AUTO, AI_CORE_TASK_FALLBACK_CHAIN,
AI_CORE_TASK_FALLBACK_CHECK_AVAILABILITY, and
AI_CORE_TASK_FALLBACK_INHERIT_CONTEXT. See
docs/advanced-usage.md §27 and
docs/task-runner-quickstart.md.
Squad multi-agent + SDK 1.0.0 wave (0.9.6)
SDK constraint moves to ^1.0. SuperAICore 0.9.6 lands the SDK
1.0.0 Squad peer-collaboration pipeline as a tenth dispatcher
adapter and wraps the SDK 0.9.8 companion primitives
(AutoModelStrategy, CacheAwareCompressor, UntrustedInput,
TokenBucket, AdHocMemoryProvider, Conversation\Fork,
AgentDepthGuard, DeepSeek FIM) behind first-class host services so
they're addressable from any dispatch path. Every binding is additive
and opt-in — pre-0.9.6 behaviour is preserved unless you enable a
flag, pass a new option, or resolve a new service from the container.
No migrations.
SquadBackend— SDK 1.0.0 adaptive cross-model pipeline (0.9.6) — registered as the tenth dispatcher adapter whensuper-ai-core.squad.enabled=trueand the SDK 1.0.0 classes are on the classpath. Drives a heuristic-decomposed pipeline viaSquad\TaskDecomposer+Squad\PeerOrchestrator, with one model per subtask (mapped throughSquad\ModelTierMap), per-stepSquadCheckpointStorewrites, peer-to-peer messaging via SDK'sPeerMailbox, and an optional cost cap with automatic downshift at 80% budget. Mid-run failures leave the checkpoint on disk; resume by re-dispatching with the samesquad_idandcheckpoint_dir. Envelope carriessquad: {squad_id, step_count, completed, roles, checkpoint_path, mailbox_log}. Tier map ships with sensible defaults (trivial→claude-haiku-4-5,easy→deepseek-v4-flash,moderate→claude-sonnet-4-6,hard→deepseek-v4-pro,expert→claude-opus-4-8); override per-call viaoptions.tier_mapor globally viasuper-ai-core.squad.tier_map.AutoModelRouterservice (0.9.6) —/model autoheuristic for any dispatch path. Wraps SDK 0.9.8Routing\AutoModelStrategyso the Claude / Codex / Gemini CLI backends can opt into Pro/Flash routing once theirprovider_configdeclaresauto_models: {pro, flash}. Escalates Flash → Pro on long context (>32k tokens), trailing tool-chain depth (≥3), explicitreasoning_effort=max, or intent keywords in the system prompt (review/audit/design/migration/architecture/…). Whensuper-ai-core.auto_model.score_catalog_pathis wired the catalog's top-scoring model overrides the heuristic. Rebind Pro/Flash to any model pair (e.g.claude-opus/claude-haiku) viaauto_model.{pro_model, flash_model}— no SDK fork.CompressionStrategyFactory(0.9.6) — cache-aware compaction for host-drivenContextManagerflows. Wraps the bundledConversationCompressorin SDK 0.9.8'sCacheAwareCompressorso summary boundaries land AFTER the prompt-cache prefix instead of clobbering it. Hosts running long multi-turn sessions (sub-agent loops, browser-tool sessions, multi-step refactors) callapp(CompressionStrategyFactory::class)->build($estimator, $config, $provider)when constructing their ownContextManager. Pins 1 system + 4 conversation messages at the head by default.UntrustedInputHelper(0.9.6) — host-sideSecurity\UntrustedInputwrapper for free-form text injected into system prompts. The SDK'sGoalManageralready wrapsgoal.objective; this helper covers the other sites — ad-hoc memory entries, workspace plugin descriptions, MCP tool docs from third-party servers, host UI form input. Two methods:tag()adds the marker;wrap()prepends the "treat as data, not instructions" disclaimer. Disable viaAI_CORE_UNTRUSTED_INPUT=falsefor tests that compare prompts byte-for-byte.RateLimiterRegistry(0.9.6) — per-process token-bucket pool wrapped around SDK 0.9.8Providers\Transport\TokenBucket.SuperAgentBackendandSquadBackendcallconsume()before each provider dispatch. Missing keys fall back todefault(8 RPS / 16 burst); per-provider overrides go insuper-ai-core.rate_limits.<provider>. Empty config disables rate limiting entirely — the SDK still has per-call 429 retry.AdHocMemoryRegistry(0.9.6) — per-sessionMemory\AdHocMemoryProviderpool. Chat UIs callforSession($id)->push($text, $ttlSeconds)(or the convenience$registry->push($id, $text, $ttl)) to inject a "for the next turn" fact that the SuperAgent backend renders ahead of the prompt. Per-session isolation prevents cross-chat leakage. Memory is process-local — durable facts belong inMEMORY.md/BuiltinMemoryProvider.ConversationForkService(0.9.6) — codex/sidesemantics on top of SDK 0.9.8Conversation\Fork.start($parentMessages)snapshots the list and returns a fork handle;finish($fork, $action, $indexes?)collapses withdiscard/promote(...indexes)/promoteAll. Useful for chat UIs that want "branch and try a different model on the side, promote only the useful side messages back".DeepSeekFimService(0.9.6) — standalone wrapper around SDK 0.9.8DeepSeekProvider::completeFim()against thebetaregion. The chat-shapedBackendabstraction doesn't fit FIM, so hosts building IDE-style completion features call this service directly:app(DeepSeekFimService::class)->complete($prefix, $suffix, ['max_tokens' => 64]).reasoning_effortthree-tier dial onSuperAgentBackend(0.9.6) — per-callreasoning_effort: 'off' | 'high' | 'max'forwarded as the SDK'sreasoning_effortper-call option. Routes to the right body shape per upstream via SDK'sSupportsReasoningEffortcapability interface. Silently ignored by providers that don't implement it. Also feeds theAutoModelRouterescalation heuristic when set tomax.Agent::switchProvider()handoff (0.9.6) — passoptions.handoff: {provider, config, policy}andSuperAgentBackendcallsAgent::switchProvider()before dispatch. Envelope gainshandoff_token_status: {tokens, window, fits, model}so dashboards can warn "history won't fit under <target_model> — compress before the next turn". Failure to construct the new provider leaves the original agent untouched.smart/squadconsole commands (0.9.6) — passthrough to vendorsuperagent smart/superagent auto --squad. Reuse the operator's existing SuperAgent credentials and SDK CLI behaviour rather than re-implementing the orchestrator in PHP:./vendor/bin/superaicore smart "audit this diff" ./vendor/bin/superaicore smart show --last ./vendor/bin/superaicore squad "refactor auth module" --max-cost=2.0 ./vendor/bin/superaicore squad --no-squad "compare against legacy path"
super-ai-core.agents.max_depth(0.9.6) — forwarded to SDK 0.9.8Swarm\AgentDepthGuard::setMax()during service-provider boot. Negative / unset preserves SDK default (5). Per-process override:SUPERAGENT_MAX_AGENT_DEPTHenv var.
Full recipes (Squad pipelines, AutoModelRouter integration, CacheAwareCompressor wiring, RateLimiterRegistry overrides, AdHocMemoryRegistry chat-UI integration, ConversationForkService side-panels, DeepSeek FIM completion endpoints): docs/advanced-usage.md §28.
opencode-borrowed feature wave (0.9.7 / SDK 1.0.5)
SDK constraint moves ^1.0 → ^1.0.5, picking up cross-provider
handoff transcoder fixes, opencode BashArity permission matching,
the opencode 7-section structured compactor summary, the SDK's real
LSP client (LSPTool), LlmLoopChecker semantic loop detection,
ACP v1 stdio server, and the Gemini 3.5 / 3.x family with thinking +
grounding + thought-part wiring. On top of that SDK bump, ten patterns
are ported from opencode
(packages/opencode/src/) and surfaced as first-class SuperAICore
features. Run php artisan migrate after upgrading — 0.9.7 ships
three new tables and three new columns on ai_usage_logs.
- Per-file diff summary on every dispatch (0.9.7) —
SuperAgentBackendsnapshots the worktree before and after each call via the SDK'sGitShadowStore, thenServices\SnapshotDiffServiceproduces a structured{additions, deletions, files, diffs[]}envelope where each diff carries{file, additions, deletions, status, patch, truncated}. Persisted onai_usage_logs.file_diff_summaryalongside the two snapshot hashes (pre_snapshot,post_snapshot). The/usagepage renders a+N −Mbadge per row + a side-panel diff viewer. Modeled on opencodesession/summary.ts+snapshot.diffFull(). - Mid-run HITL
ask_usertool (0.9.7) —Services\Tools\AskUserTool(opt-in viaAI_CORE_TOOLS_ASK_USER=true) lets the agent interrupt and ask the operator a clarifying question with optional pre-defined choices. Rows land in the newai_user_questionstable and render as inline cards on/processes(polled every 4s). Modeled on opencodetool/question.ts. Endpoints:/processes/questions{,/{id}/answer,/{id}/cancel}. - Revert worktree to pre-dispatch snapshot (0.9.7) —
POST /usage/{id}/revertreadspre_snapshotoff the UsageLog row and restores the worktree via SDK'sGitShadowStore::restore(). Tracked files revert; untracked files left in place. Gated byAI_CORE_SNAPSHOT_REVERT_ENABLED(default true). The/usagepage surfaces a ↩ button on every row that recorded a snapshot. - Shadow-git snapshot retention (0.9.7) —
super-ai-core:snapshot-pruneArtisan command walks everyshadow.gitunder~/.superagent/history/, expires old reflogs past--days(default 7), and runsgit gc --prune=now. Supports--dry-run. Schedule from the host app'sKernel.phpwith$schedule->command('super-ai-core:snapshot-prune')->daily(). Modeled on opencode'sprune = "7.days"policy. - Session reminders synthetic injection (0.9.7) —
Services\RemindersResolverreadssuper-ai-core.reminders.rulesand prepends synthetic system-prompt blocks when a rule'swhenpredicate (dotted-path → fnmatch globs) matches the dispatch options/metadata. Modeled on opencodesession/reminders.ts. - Per-agent permission ruleset (0.9.7) —
Services\PermissionEvaluatorports opencodepermission/evaluate.ts({permission, pattern, action}rules with last-match-wins semantics, fnmatch wildcards, defaultask). Configure per agent viasuper-ai-core.agents.{name}.permission;SuperAgentBackendprojects the ruleset onto the SDK agent'swithAllowedTools()/withDeniedTools()when the caller didn't pass explicit lists. - Plan mode (
Modes\CliPlanOrchestrator) (0.9.7) — three-phase plan → approve → build workflow. Phase 1 runs the model in plan-only mode (edit tools denied except for the plan file glob) and writes a markdown plan to.superagent/plans/{session}.md. Phase 2 opens anai_user_questionsrow asking the operator to[Approve, Reject]. Phase 3 hands off to the build backend with a synthetic prompt containing the approved plan. Registered withCliModeRouterunder mode nameplan. Auto-approves when HITL is disabled so the orchestrator stays usable in CI. Config:super-ai-core.modes.plan.*. Modeled on opencodeagent/agent.ts+tool/plan.ts. - Sub-agent permission derivation (0.9.7) —
Services\SubagentPermissionDerivermerges the parent agent'sdenied_toolsset into the child's so a read-only parent always produces read-only children. Readsoptions['parent_denied_tools'](explicit) oroptions['metadata']['parent_agent'](resolved throughPermissionEvaluator). Modeled on opencodeagent/subagent-permissions.ts. - PTY long-lived shell sessions, Phase 1 (0.9.7) —
Services\PtyService+Http\Controllers\PtyControllerspawnproc_open-backed shell sessions and stream stdout to clients via cursor-keyed long-poll. Endpoints:POST /pty/sessions(spawn),GET /pty/sessions/{id}/poll?cursor=N(poll),POST /pty/sessions/{id}/kill(terminate). Opt-in viaAI_CORE_PTY_ENABLED=true. Phase 2 (deferred) upgrades the wire to WebSocket via Reverb / Soketi without changing the cursor protocol. - Session share host queue (0.9.7) —
Services\ShareSessionServicemints a{share_id, secret, share_url}triple per session and POSTs the session's UsageLog rows + attachedfile_diff_summarypayloads to a configured remote sharer (AI_CORE_SHARE_REMOTE_URL) with a Bearer token. Falls back to a local URL template (AI_CORE_SHARE_LOCAL_URL_TEMPLATE, with a{share_id}placeholder) when no remote is configured. Modeled on opencodeshare/share-next.ts. - SDK 1.0.5 LSP tool (0.9.7) — opt in via
AI_CORE_TOOLS_LSP=trueandSuperAgentBackendprependslspto the implicitload_toolslist so the agent gets the SDK's bundled LSP client (phpactor / intelephense / gopls / rust-analyzer / pyright / tsserver / clangd / bash-language-server / zls). Lazy via the SDK'sBuiltinToolRegistryclassMap. - Opencode structured compactor summary (0.9.7) — set
AI_CORE_COMPRESSION_SUMMARY_PROMPT=structuredto opt every dispatch into the SDK's 7-section Markdown summary template (Goal / Constraints / Progress / Decisions / Next Steps / Critical Context / Relevant Files). ~30-50% smaller than the default 9-section summary and preserves blocked-item state across compactions. Per-calloptions['summary_prompt']overrides. - Gemini 3.5 thinking + grounding + URL context (0.9.7) —
thinking,grounding/google_search, andurl_contextper-call options pass straight through to the SDK'sGeminiProvider(silently ignored elsewhere).EngineCatalognow listsgemini-3.5-pro / -flash / -flash-litefor the gemini-cli engine;CopilotModelResolvergains ageminifamily alias resolving togemini-3-pro-preview.
Full recipes (per-file diff dashboard, AskUserTool integration, plan mode workflow, session reminders, per-agent permissions, PTY sessions, session sharing): docs/advanced-usage.md §29.
Qwen + tracing + 9Router wave (0.9.8)
The eighth execution engine, an always-on Dispatcher trace ring
(chrome://tracing-viewable, auto-dumps on quota / null result /
auto-rotate), an OpenAI-compatible proxy at
/super-ai-core/v1/chat/completions, multi-account round-robin with
cooldowns, real SSE streaming on the three HTTP backends, pre-emptive
OAuth refreshers for Claude / Codex / Copilot / Kiro, Pi-style
session tree branching, a progressive-disclosure skill index for the
non-skill-native CLIs, a pi v3 JSONL exporter, and a gh-watch
GitHub PR / CI reaction engine. SDK constraint bumped to ^1.0.6 —
picks up the real RtkPipeline (6 built-in compressors), the
Hooks\HookEvent::PR_EVENT hook (fired automatically from
gh-watch), Agent::steer() / followUp() mid-turn control
(exposed via SuperAgentBackend options), and the qwen-anthropic
SDK provider (new AiProvider::TYPE_QWEN_ANTHROPIC for DashScope's
Anthropic-protocol endpoint — drop-in Claude substitute).
- Qwen Code CLI as the 8th engine (
qwen_cli) (0.9.8) — fork ofgemini-cliadapted for Alibaba's Qwen family. ImplementsBackend,StreamingBackend, andScriptedSpawnBackendso it slots into every existing dispatch path. API key only (DASHSCOPE_API_KEY/QWEN_API_KEY); OAuth EOL'd 2026-04-15. Default modelqwen3.7-max(1M context, $2.50/$7.50 per 1M, native Anthropic/v1/messagesprotocol — drop-in for Claude in fallback chains). Toggle viaAI_CORE_QWEN_CLI_ENABLED. - Dispatcher trace ring (
Tracing\TraceCollector) (0.9.8) — always-on, lock-free ring ofllm/cache/provider/tool/errorevents. ~150 KB at 1024 events; zero file-system cost when disabled. Auto-dumps to Chrome Trace Event JSON (viewable inchrome://tracing,https://ui.perfetto.dev, or the bundledtrace-viewer.html) onerror/rotate/timeouttriggers.SuperAgentBackendauto-dumps withtrigger=rotateforquota_exceeded/usage_not_included/server_overloaded/cyber_policyso the post-mortem captures the failing envelope. Manual flush:php artisan dispatcher:dump-trace. UI:/super-ai-core/traces. - OpenAI-compatible proxy (0.9.8) —
Http\Controllers\OpenAiCompatibleControllerexposesGET /v1/models+POST /v1/chat/completions(streaming + non-streaming).modelaccepts either a literal id or anai_routing_combos.name, so Cursor / Cline / Roo / Kiro / continue.dev / the OpenAI SDK can drop in unchanged. Streaming chunks shaped exactly like OpenAI's. - Real SSE streaming on the three HTTP backends (0.9.8) —
AnthropicApiBackend,OpenAiApiBackend,GeminiApiBackendimplement the newContracts\StreamableTextBackendinterface, yielding canonical envelopes ({type:'text'|'thinking'|'tool_use_delta'|'usage'|'stop'}). The OpenAI-compat proxy consumes these directly. - Named routing combos (
ai_routing_combos) (0.9.8) — ordered[{provider, model}, ...]resolved at dispatch time. Sits above the statictier_map. CRUD:/super-ai-core/routing/combos[/{name}]. Per-call override:--combo=NAMEonsmart/squad/auto. - Multi-account round-robin (
AccountRoundRobin) (0.9.8) — picks the active, non-cooled-down account with the lowest(priority, last_used_at)tuple via atomic compare-and-update.cooldown()marks accounts for 10 min onQuotaExceededException/ null result. Backed by the newai_provider_accountstable. - OAuth refresher registry (0.9.8) — pre-emptive token refresh
for the four CLIs that own OAuth state in on-disk JSON
(Claude / Codex / Copilot / Kiro). Drive via
php artisan super-ai-core:oauth-refresh; schedule fromapp/Console/Kernel.phpwith->everyTenMinutes(). - Pi-style session tree branching (0.9.8) —
Services\SessionBranchManager+ai_session_branchestable. Forking creates a new branch from an old entry; switching auto-summarises the abandoned branch so context isn't lost. Endpoints:/sessions/{session}/tree,/sessions/{session}/fork,/sessions/{session}/switch. - Progressive-disclosure skill index (0.9.8) —
Services\SkillIndexBuilderemits a compact XML index of everySKILL.md(name + description, no body) thatCodexCliBackend/GeminiCliBackendprepend to every prompt. The model reads the body via its existing file-read tool only when it picks a skill. Suppress withoptions['skills_disabled']=trueor--no-skills. - Pi
kinddiscriminator onask_user(0.9.8) —select/confirm/input/editorso the/processes/questionsUI renders the right widget per call (defaultselectpreserves 0.9.7 behaviour). - Caveman mode (
--caveman) (0.9.8) — output-token compression reminder ported from 9Router. Empirically saves 30-65% on output tokens for reasoning-quick tasks (not for long-form writing). - GitHub PR / CI watcher (
super-ai-core:gh-watch) (0.9.8) — claude-octopus pattern. Polls every activeai_pr_watchersrow (ETag-cached), fires per-row actions (ask_user/spawn_squad/webhook/log). Schedule via->everyFiveMinutes()or daemonise with--loop=30. - Pi v3 session JSONL exporter (0.9.8) —
php artisan task-results:export-jsonlemits one file permetadata.session_id. Opt-in via--i-understand(the format is lossy); supports--anonymize,--since. - Apache Arrow tabular round-trip (
Arrow\ArrowSerializer) (0.9.8) — minimal IPC stream writer (noapache/arrowPECL dependency). Opt in per dispatch withoutput_format: 'arrow'; the envelope gains a base64-encoded Arrow stream. 10–100× faster than JSON for wide tabular agent payloads. - SuperTeam agents browser (
/super-ai-core/agents) (0.9.8) — reads.claude/agents/*.mdfrom configurable roots and groups by category (Strategy / Product / Engineering / Business / Security / …). Config:super-ai-core.agent_catalog.paths. - SDK 1.0.6 wirings (0.9.8) — four targeted wirings on top of
the SDK bump: (1)
RtkCompressorServicenow returns real byte savings out of the box (SDK ships six built-in compressors — git diff / grep / find / ls / tree / Bash); (2)GhWatchCommandfiresHooks\HookEvent::PR_EVENTwith aPrWatchHookDatapayload on every event, so SDK hook listeners observe the same stream as the local action handler; (3)SuperAgentBackendaccepts afollow_up_queuearray option (pre-seeds the agent's follow-up queue) and anon_agent_built: fn(Agent)callback (lets a sibling process register the running agent against a session-keyed broker so HTTP / ACPsession/steercan callAgent::steer()mid-run); (4) newAiProvider::TYPE_QWEN_ANTHROPICprovider type backed by SDK 1.0.6'sQwenAnthropicProvider— Qwen 3.7 Max via DashScope's Anthropic-protocol endpoint, drop-in Claude substitute.
Full recipes (Qwen CLI install, tracing viewer setup, OpenAI proxy client setup, routing combo CRUD, multi-account onboarding, OAuth refresher schedule, session branch forking, gh-watch row schema, SDK 1.0.6 wirings): docs/advanced-usage.md §30.
Opus 4.8 + Grok + Cursor wave (1.0.0 / SDK 1.0.9)
The 1.0.0 stable cut takes SDK ^1.0.9 and lands the Opus 4.8 generation,
xAI Grok on two channels, and two new subscription CLI engines. Additive —
no schema changes, no migrations, no config publish.
- Claude Opus 4.8 flagship (1.0.0) — SDK 1.0.9 promotes
claude-opus-4-8to the Anthropic flagship: it takes theopusalias, native 1M context, interleaved thinking, fast mode, effort control, and dynamic-workflow / agent-orchestration support, at the Opus tier ($15 / $75 per 1M).ClaudeModelResolverresolvesopus → claude-opus-4-8and listsclaude-opus-4-8/claude-opus-4-8[1m]first; theclaudeengine catalog,model_pricing, and thesquad/cli_squadexpert tiers all point at 4.8. - xAI Grok API provider (
groktype) (1.0.0) — first-class provider type routed through thesuperagentbackend to SDK 1.0.9'sGrokProvider(xAI's OpenAI-compatiblehttps://api.x.ai/v1).XAI_API_KEY(canonical) withGROK_API_KEYaliased; default modelgrok-4.3(1M context). Surfaced inApiHealthDetector(api:status+ dashboard probe) and the cost catalog (grok-4.3 / grok-4-fast / grok-code-fast-1 / grok-3-mini). - Cursor Composer CLI (
cursor_cli) (1.0.0) — Cursor's headlesscursor-agent(Composer 2.5). Subscription engine;builtinlogin at~/.cursor. Streaming + scripted-spawn + one-shot chat, Claude-Code-shaped JSON / stream-json parsing with token tracking, MCP via.cursor/mcp.json,--forceheadless tool-approval. Default modelcomposer-2.5-fast. - Grok Build CLI (
grok_cli) (1.0.0) — xAI'sgrok"Grok Build" agentic CLI. Subscription engine;builtinlogin at~/.grok. Effort control (--effort low…max/--reasoning-effort),--prompt-filescripted spawn, native sub-agents. Default modelgrok-build. Distinct from the metered Grok API provider type — same brand, different channel. - Data-driven surfaces — because
EngineCatalog,ProviderTypeRegistry, and the per-engine model resolvers feed everything, the/providersUI (engine cards, builtin rows, add-provider dropdowns, version + login badges), model pickers,cli:status, the cost dashboard, the Process Monitor, andMcpManagersync all pick up the new engines automatically.
Full recipes (Cursor / Grok CLI onboarding, Opus 4.8 routing, Grok API vs CLI channel split, effort control): docs/advanced-usage.md §30.
CLI installer & health
cli:status— shows which engine CLIs are installed / logged in, plus install hints for anything missing.cli:install [backend] [--all-missing]— shells out to the canonical package manager (npm/brew/script) with confirmation by default. Explicit by design — no CLI ever auto-installs as a dispatch side-effect.api:status(since 0.6.8) — 5-second cURL probe against every direct-HTTP API provider (anthropic / openai / openrouter / gemini / kimi / qwen / glm / minimax). Returns{ok, latency_ms, reason}per provider so operators can tell auth rejections (401/403), network timeouts, and missing keys apart at a glance.--all/--providers=a,b,c/--jsonflags. Parallel sibling ofcli:statusfor direct-HTTP providers.
Dispatcher & streaming
- Capability-based routing —
Dispatcher::dispatch(['task_type' => 'tasks.run', 'capability' => 'summarise'])resolves the right backend + provider credentials viaRoutingRepository→ProviderResolver→ fallback chain. Contracts\StreamingBackend(since 0.6.6) — every CLI backend streams chunks through anonChunkcallback while tee'ing to disk and registering anai_processesrow for the Monitor UI.Dispatcher::dispatch(['stream' => true, ...])opts in transparently. Honours per-calltimeout/idle_timeout/mcp_mode('empty'for claude prevents global MCPs from blocking exit). Seedocs/streaming-backends.md.Runner\TaskRunner— one-call task execution (since 0.6.6) — drop-in wrapper aroundDispatcher::dispatch(['stream' => true, ...])that returns a typedTaskResultEnvelope(success / output / summary / usage / cost / log file / spawn report / fallback report). Replaces ~150 lines of host-side "build prompt → spawn → tee log → extract usage → wrap result" glue with one call. 0.9.2 adds the TaskRunner reliability wave: opt-in backend fallback, continuation context, attempt observability, and workload-specific retry policy. Identical API across all 6 CLIs. Seedocs/task-runner-quickstart.md.AgentSpawn\Pipeline— spawn-plan protocol for codex/gemini (since 0.6.6) — three-phase choreography (preamble → parallel fanout → consolidation re-call) upstream in SuperAICore.TaskRunneractivates it whenspawn_plan_diris passed. New CLIs that need the protocol implementBackendCapabilities::spawnPreamble()+consolidationPrompt()once and inherit the rest. Seedocs/spawn-plan-protocol.md.- Per-call
cwdon every CLI (since 0.6.7) — hosts whose PHP process runs fromweb/publiccan still spawn aclaudethat findsartisan+.claude/at the project root. Claude-only options (permission_mode,allowed_tools,session_id) let headless callers bypass interactive approval prompts and restrict the tool surface. - Headless Claude from PHP-FPM now works (since 0.6.7) —
ClaudeCliBackendscrubsCLAUDECODE/CLAUDE_CODE_ENTRYPOINT/ … from the child env so a Laravel server launched from a parentclaudeshell no longer trips claude's recursion guard. On macOS,builtinauth falls back to reading the OAuth token viasecurity find-generic-passwordand injecting it asANTHROPIC_API_KEY— the only path that works for web workers. Contracts\ScriptedSpawnBackend(since 0.7.1) — sibling ofStreamingBackendfor hosts that detach the child (nohup/background job) and poll the log asynchronously.prepareScriptedProcess([...])returns a configuredSymfony\Component\Process\Processthat readsprompt_filevia stdin, tees combined stdout+stderr tolog_file, applies env scrub + capability transforms (Gemini tool-name rewrite), and honourstimeout/idle_timeout.streamChat($prompt, $onChunk, $options)is the blocking one-shot sibling — backend owns argv composition, prompt-vs-argv passing, output parsing, and ANSI stripping (Kiro/Copilot). All six CLI backends (claude/codex/gemini/copilot/kiro/kimi) implement the contract on 0.7.1; hosts collapse a per-backendmatchstatement into one polymorphic call viaBackendRegistry::forEngine($engineKey).Support\CliBinaryLocator(singleton) centralises filesystem probing for CLI binaries (~/.npm-global/bin,/opt/homebrew/bin, nvm paths, Windows%APPDATA%/npm).Backends\Concerns\BuildsScriptedProcesstrait supplies shared wrapper-script helpers for implementers. See docs/host-spawn-uplift-roadmap.md.
Model catalog
- Dynamic model catalog (since 0.6.0) —
CostCalculator,ClaudeModelResolver,GeminiModelResolver, andEngineCatalog::seed()'savailable_modelsall fall through to SuperAgent'sModelCatalog(bundledresources/models.json+ user override at~/.superagent/models.json). super-ai-core:models update(since 0.6.0) — fetches$SUPERAGENT_MODELS_URLand refreshes pricing + model lists for every Anthropic / OpenAI / Gemini / Bedrock / OpenRouter row withoutcomposer update.super-ai-core:models refresh [--provider <p>](since 0.6.9) — pulls each provider's liveGET /modelsendpoint into a per-provider overlay cache at~/.superagent/models-cache/<provider>.json. Supports anthropic / openai / openrouter / kimi / glm / minimax / qwen. Overlay sits above the user override but below runtimeregister(), so bundled pricing is preserved when the vendor's/modelsomits rates (usually the case).statusgains arefresh cacherow.
Provider type system
ProviderTypeRegistry+ProviderEnvBuilder(since 0.6.2) — every provider type (Anthropic / OpenAI / Google / Kiro / …) lives in a single bundled registry carrying its label, icon, form fields, env-var name, base-url env, allowed backends, andextra_config → envmap. One source of truth for/providersUI + CLI backend env injection +AiProvider::requiresApiKey(). Host apps override viasuper-ai-core.provider_types. New types surface oncomposer updatewith zero code changes.sdkProvideron the descriptor (since 0.7.0) — wrapper types (anthropic-proxy,openai-compatible) now declare which SDKProviderRegistrykey they route to.SuperAgentBackend::buildAgent()consults the descriptor whenprovider_config.providerisn't set, fixing a long-standing gap where wrapper types silently defaulted to'anthropic'.http_headers/env_http_headerson the descriptor (since 0.7.0) — declarative HTTP-header injection via the SDK's 0.9.1ChatCompletionsProviderknobs.http_headersare literal;env_http_headersreference env vars and are silently dropped when the env var isn't set. Host apps injectOpenAI-Project,LangSmith-Project,OpenRouter-Appetc. without package code changes.
Usage tracking & cost
ai_usage_logs— every call persists prompt/response tokens, duration, and cost. Rows also carryshadow_cost_usd+billing_model(since 0.6.2) so subscription engines (Copilot, Kiro, Claude Code builtin) surface a meaningful pay-as-you-go USD estimate instead of a $0 row.- Cache-aware shadow cost (since 0.6.5) —
cache_read_tokenspriced at 0.1× andcache_write_tokensat 1.25× the baseinputrate (falls back to explicit catalog rows). Heavy-cache Claude sessions now match the real Anthropic invoice instead of over-reporting by ~10×. - CLI-reported
total_cost_usd(since 0.6.5) — when the backend envelope carries its owntotal_cost_usd(Claude CLI does), Dispatcher uses that figure as the billed cost and marks the row withmetadata.cost_source=cli_envelope. Matters because only the CLI knows whether a given session is on a subscription or an API key. UsageRecorderfor host-side runners (since 0.6.2) — thin façade overUsageTracker+CostCalculatorthat host apps spawning CLIs directly (e.g.App\Services\ClaudeRunner, PPT stage jobs) call after each turn to drop oneai_usage_logsrow withcost_usd/shadow_cost_usd/billing_modelauto-filled from the catalog.CliOutputParser— extracts{text, model, input_tokens, output_tokens, …}from captured stdout (parseClaude()/parseCodex()/parseCopilot()/parseGemini()) without constructing a full backend object.MonitoredProcess::runMonitoredAndRecord()(since 0.6.5) — opt-in trait method that buffers stdout, parses it, and writes anai_usage_logsrow on process exit. Parser failures never propagate — plain-text Codex/Copilot output gets adebug-level note instead of a row.- Cost dashboard — per-model pricing, USD rollups, "By Task Type" card + per-row
usage/subbilling-model badge + shadow-cost column on every breakdown (since 0.6.2). Dashboards hide 0-token andtest_connectionrows by default.
Idempotency & tracing
ai_usage_logs.idempotency_key60s dedup window (since 0.6.6) —EloquentUsageRepository::record()honours anidempotency_key; matching keys within 60s return the existing row id instead of inserting.Dispatcher::dispatch()auto-generates"{backend}:{external_label}"so hosts that accidentally double-record the same logical turn auto-collapse to one row. Migration:php artisan migrateadds a nullable column + composite index. Seedocs/idempotency.md.- Round-trip key through the SDK (since 0.7.0) — Dispatcher now computes the key before
generate()and forwards it toSuperAgentBackend, which threads it throughAgent::run($prompt, ['idempotency_key' => $k])→AgentResult::$idempotencyKey(SDK 0.9.1). The backend echoes it back onto the envelope asidempotency_key; Dispatcher's write toai_usage_logsprefers the envelope-echoed value. Net effect: hosts whose Dispatcher runs on a different PHP process than the write-through still observe the same key the SDK saw. - W3C
traceparent/tracestatepassthrough (since 0.7.0) — passtraceparent: '<w3c-string>'onDispatcher::dispatch()options.SuperAgentBackendforwards toAgent::run()options; the SDK projects it onto the Responses API'sclient_metadataenvelope so OpenAI-side logs correlate with the host's distributed trace.tracestateand pre-builtTraceContextinstances also accepted. Empty strings are filtered.
MCP server manager
- UI-driven manager — install, enable, and configure MCP servers from the admin UI.
- Catalog-driven sync (since 0.6.8) —
claude:mcp-syncreads.mcp-servers/mcp-catalog.json+ a thin.claude/mcp-host.jsonmapping and fans the right server set out to project.mcp.json, per-agentmcpServers:frontmatter blocks inside.claude/agents/*.md, and every installed CLI backend's user-scope config.mcp:sync-backendsis the standalone entry point for hand-edited.mcp.jsonor file-watcher auto-sync. Non-destructive: user-edited files flaguser-editedvia a sha256 manifest and are left alone. Seedocs/mcp-sync.md. - OAuth helpers for mcp.json servers (since 0.6.9) —
McpManager::oauthStatus(key)/oauthLogin(key)/oauthLogout(key)wrap SDK 0.9.0'sMcpOAuthfor MCP servers declaring anoauth: {client_id, device_endpoint, token_endpoint, scope?}block. Host UIs render an OAuth button per server. - Portable
.mcp.jsonwrites (since 0.8.1) — opt in by settingAI_CORE_MCP_PORTABLE_ROOT_VAR=SUPERTEAM_ROOT(or any env var name your MCP runtime exports) and everyMcpManager::install*()writer emits bare commands (node,php,uvx,uv,python) plus${SUPERTEAM_ROOT}/<rel>placeholders for paths under the project root, so the generated file survives being copied / synced across machines / users / containers without re-pollution fromwhich()andPHP_BINARY. Egress to per-machine targets (Codex~/.codex/config.toml, Gemini / Claude / Copilot / Kiro / Kimi user-scope MCP configs,codex exec -cruntime flags) materialises the placeholders back to absolute paths so backends that don't expand${VAR}still spawn correctly. Default staysnull— legacy "absolute path everywhere" behaviour preserved for hosts that haven't opted in. Seedocs/advanced-usage.md§13.
SuperAgent SDK integration
- Real agentic loop (since 0.6.8) —
SuperAgentBackendhonoursmax_turns,max_cost_usd→Agent::withMaxBudget(),allowed_tools/denied_toolsfilters,mcp_config_file(loads a.mcp.json, auto-disconnects infinally{}), andprovider_config.regionfor Kimi / Qwen / GLM / MiniMax regions. Envelope gainsusage.cache_read_input_tokens,usage.cache_creation_input_tokens,cost_usd(SDK turn-summed), andturns. AgentToolproductivity forwarded (since 0.6.8) — when callers opt into SDK sub-agent dispatch (load_tools: ['agent', …]), the envelope forwardsAgentToolproductivity info (filesWritten,toolCallsByName,productivityWarning,status: completed|completed_empty) under an optionalsubagentskey.- Three 0.9.0 options forwarded (since 0.6.9) —
extra_body(deep-merged at the top level of everyChatCompletionsProviderrequest body),features(routed through SDK'sFeatureDispatcher; useful keys:prompt_cache_key.session_id,thinking.*,dashscope_cache_control),loop_detection: true|array(wraps streaming handler inLoopDetectionHarness). Convenience shim:prompt_cache_key: '<sessionId>'accepted as session-id shorthand. - Classified
ProviderExceptionsubclasses (since 0.7.0) —SuperAgentBackend::generate()catches six typed SDK subclasses (ContextWindowExceeded,QuotaExceeded,UsageNotIncluded,CyberPolicy,ServerOverloaded,InvalidPrompt) each logged with a stableerror_classtag +retryableflag. Contract unchanged (still returnsnull); alogProviderError()seam lets subclasses route on the classification. createForHosthost-config adapter migration complete (since 0.8.5) —SuperAgentBackend::buildAgent()collapses to a singleProviderRegistry::createForHost($sdkKey, $hostConfig)call instead of branching onregionand hand-rolling the constructor shape per provider. The SDK-side per-key adapter (default for ChatCompletions-style; dedicated one forbedrockthat splits AWS credentials; built-in Azure auto-detection onopenai-responses; LMStudio synthetic auth) owns the constructor-shape mapping. Future SDK provider keys land here without backend changes — the adapter is the extension point.- SDK pinned to 0.9.5 (since 0.8.5) — Composer constraint
^0.9.5. Multi-turn tool-use replays against non-Anthropic providers now work correctly (pre-0.9.5,ChatCompletionsProvider::convertMessage()early-returned on the firsttool_useblock and read nonexistentContentBlockproperties — every replayed tool call against Kimi / GLM / MiniMax / Qwen / OpenAI / OpenRouter / LMStudio went out as{id: null, name: null, arguments: "null"}); the SDK's six-encoderConversation\Transcoderputs every wire family behind one canonical converter so the bug fix lands in one place. PlusAgent::switchProvider($name, $config, $policy)is available for in-process mid-conversation handoff (withHandoffPolicy::default() / preserveAll() / freshStart()presets) — useful for hosts that wrapSuperAgentBackenddirectly.
Agent-spawn hardening
Five layered defences (since 0.6.8) so weak children (Gemini Flash, GLM Air) can't pollute the consolidator's view:
SpawnPlan::appendGuards()— host-injected per-agent guard block appended to every child'stask_prompt(six rules: stay in lane, no consolidator filenames, language uniformity, extension whitelist, canonical_signals/<name>.mdpath, don't apologise for tool failures). Language-aware via CJK regex.SpawnPlan::fromFile()canonical ASCIIoutput_subdir— forcesoutput_subdir = agent.nameso Flash emitting首席执行官instead ofceo-bezosno longer breaks the audit walk.Pipeline::cleanPrematureConsolidatorFiles()— before fanout, deletes any early摘要.md/思维导图.md/流程图.md/ English variants at$outputDirtop-level that the first-pass model wrote in violation of "emit plan and STOP".Orchestrator::auditAgentOutput()— post-fanout, flags non-whitelisted extensions, consolidator-reserved filenames inside agent subdirs, and sibling-role sub-directories; warnings land inreport[N].warnings[]without modifying disk. Per-agent plumbing (run.log/ prompt / exec script) moves out of the user-facing output dir into$TMPDIR.- Language-aware
SpawnConsolidationPrompt::build()— hard-codes the English → Chinese section-heading map for zh runs and bans fabricated error-filenames likeError_No_Agent_Outputs_Found.md.GeminiCliBackend::parseJson()tolerates Gemini's "YOLO mode is enabled." / "MCP issues detected." preamble.
Process monitor & admin UI
- Live-only Process Monitor (since 0.6.7) —
AiProcessSource::list()queries the liveps auxsnapshot first and only emitsai_processesrows whose PID is alive. Finished / failed / killed runs disappear from the Monitor UI the moment their subprocess exits. host_owned_label_prefixes(since 0.6.7) — hosts with their ownProcessSource(e.g. SuperTeam'stask:rows) claim a namespace so AiProcessSource doesn't double-render the same logical run.- Admin pages —
/integrations,/providers,/services,/ai-models,/usage,/costs,/processes. Admin-only/processes, disabled by default.
Host integration
- Trilingual UI — English, Simplified Chinese, French, runtime-switchable.
- Disable routes / views — embed inside a parent app, swap the Blade layout, or reuse the back-link + locale switcher.
BackendCapabilitiesDefaultstrait (since 0.6.6) — host implementersusethe trait to inherit safe no-op defaults for methods added in future minor releases. Host class stays satisfying the interface without code changes. Seedocs/api-stability.mdfor the full SemVer contract.
Requirements
- PHP ≥ 8.1
- Laravel 10, 11, or 12
- Guzzle 7, Symfony Process 6/7
Optional, only when the respective backend is enabled:
claudeCLI on$PATH—npm i -g @anthropic-ai/claude-codecodexCLI on$PATH—brew install codexgeminiCLI on$PATH—npm i -g @google/gemini-clicopilotCLI on$PATH—npm i -g @github/copilot(thencopilot login)kiro-clion$PATH— install from kiro.dev (thenkiro-cli login, or setKIRO_API_KEYfor headless Pro/Pro+/Power)kimiCLI on$PATH(since 0.6.8) — install from kimi.com (thenkimi login)qwenCLI on$PATH(since 0.9.8) —npm i -g @qwen-code/qwen-code(then exportDASHSCOPE_API_KEY— OAuth EOL'd 2026-04-15)- An Anthropic / OpenAI / Google AI Studio / DashScope API key for the HTTP backends
Don't want to remember package names? Run ./vendor/bin/superaicore cli:status to see what's missing and ./vendor/bin/superaicore cli:install --all-missing to bootstrap everything (confirmation prompt by default).
Install
composer require forgeomni/superaicore php artisan vendor:publish --tag=super-ai-core-config php artisan vendor:publish --tag=super-ai-core-migrations php artisan migrate
Upgrading from 0.9.7? Just composer update forgeomni/superaicore and
php artisan migrate — five additive migrations land in 0.9.8 (kind
column on ai_user_questions, plus four new tables:
ai_session_branches, ai_routing_combos, ai_provider_accounts,
ai_pr_watchers). Re-publish the config to pick up the new
tracing.*, agent_catalog.*, and backends.qwen_cli.* blocks:
php artisan vendor:publish --tag=super-ai-core-config --force
Optional cron entries (host's app/Console/Kernel.php):
$schedule->command('super-ai-core:snapshot-prune')->dailyAt('02:00'); // 0.9.7 $schedule->command('super-ai-core:oauth-refresh')->everyTenMinutes(); // 0.9.8 $schedule->command('super-ai-core:gh-watch')->everyFiveMinutes(); // 0.9.8
Full step-by-step guide: INSTALL.md.
CLI quick start
# List Dispatcher adapters and their availability ./vendor/bin/superaicore list-backends # Drive the seven engines from the CLI ./vendor/bin/superaicore call "Hello" --backend=claude_cli # Claude Code CLI (local login) ./vendor/bin/superaicore call "Hello" --backend=codex_cli # Codex CLI (ChatGPT login) ./vendor/bin/superaicore call "Hello" --backend=gemini_cli # Gemini CLI (Google OAuth) ./vendor/bin/superaicore call "Hello" --backend=copilot_cli # GitHub Copilot CLI (subscription) ./vendor/bin/superaicore call "Hello" --backend=kiro_cli # AWS Kiro CLI (subscription) ./vendor/bin/superaicore call "Hello" --backend=kimi_cli # Moonshot Kimi Code CLI (OAuth subscription) ./vendor/bin/superaicore call "Hello" --backend=qwen_cli --api-key=sk-... # Alibaba Qwen Code CLI (0.9.8+) ./vendor/bin/superaicore call "Hello" --backend=superagent --api-key=sk-ant-... # SuperAgent SDK # Skip the CLI wrapper and hit the HTTP APIs directly ./vendor/bin/superaicore call "Hello" --backend=anthropic_api --api-key=sk-ant-... # Claude engine, HTTP mode ./vendor/bin/superaicore call "Hello" --backend=openai_api --api-key=sk-... # Codex engine, HTTP mode ./vendor/bin/superaicore call "Hello" --backend=gemini_api --api-key=AIza... # Gemini engine, HTTP mode # Health + install ./vendor/bin/superaicore cli:status # table of installed / version / auth / hint ./vendor/bin/superaicore api:status # 5s probe against every direct-HTTP API (0.6.8+) ./vendor/bin/superaicore cli:install --all-missing # npm/brew/script install with confirmation # Model catalog ./vendor/bin/superaicore super-ai-core:models status # sources, override mtime, total rows ./vendor/bin/superaicore super-ai-core:models list --provider=anthropic # per-1M pricing + aliases ./vendor/bin/superaicore super-ai-core:models update # fetch $SUPERAGENT_MODELS_URL (0.6.0+) ./vendor/bin/superaicore super-ai-core:models refresh --provider=kimi # live GET /models overlay (0.6.9+)
Skill & sub-agent CLI
# Discover what's installed ./vendor/bin/superaicore skill:list ./vendor/bin/superaicore agent:list # Run a skill on Claude (default) ./vendor/bin/superaicore skill:run init # Native on Gemini — probe + translate + preamble ./vendor/bin/superaicore skill:run simplify --backend=gemini --exec=native # Try Gemini first, fall back to Claude on incompatibility; hard-lock on cwd-touching hop ./vendor/bin/superaicore skill:run simplify --exec=fallback --fallback-chain=gemini,claude # Run a sub-agent; backend inferred from its `model:` frontmatter ./vendor/bin/superaicore agent:run security-reviewer "audit this diff" # Sync engines ./vendor/bin/superaicore gemini:sync # expose skills/agents as Gemini custom commands ./vendor/bin/superaicore copilot:sync # ~/.copilot/agents/*.agent.md ./vendor/bin/superaicore copilot:sync-hooks # merge Claude-style hooks into Copilot ./vendor/bin/superaicore kiro:sync --dry-run # ~/.kiro/agents/*.json (0.6.1+) ./vendor/bin/superaicore kimi:sync # ~/.kimi/agents/*.yaml + mcp.json (0.6.8+) # Run the same task across N Copilot agents in parallel ./vendor/bin/superaicore copilot:fleet "refactor auth" --agents planner,reviewer,tester
Skill engine — telemetry / ranking / evolution (artisan, since 0.8.6)
Mounted on Laravel artisan via the package service provider — invoke with php artisan from any host:
# Hook targets — read Claude Code hook payload on stdin php artisan skill:track-start --json # PreToolUse(Skill) — insert in_progress row php artisan skill:track-stop --json # Stop — close session's open rows # Read the table php artisan skill:stats --since=7d --sort=failure_rate php artisan skill:stats --skill=research --format=json # Rank skills against a task description (BM25 + telemetry boost) php artisan skill:rank "estimate effort for an outsource project" php artisan skill:rank "重构认证模块" --no-telemetry --format=json # Queue a FIX-mode candidate (review-only — never auto-applied) php artisan skill:evolve --skill=research # manual trigger php artisan skill:evolve --skill=research --dispatch # also invoke LLM (costs tokens) php artisan skill:evolve --sweep --threshold=0.30 --min-applied=5 # all degraded skills # Inspect the queue php artisan skill:candidates # list pending php artisan skill:candidates --id=42 --show-prompt --show-diff # full detail
PHP quick start
Long-running task — TaskRunner (since 0.6.6)
For anything where you want a tail-able log, a Process Monitor row, live UI previews, automatic usage recording, and optional spawn-plan emulation for codex/gemini:
use SuperAICore\Runner\TaskRunner; $envelope = app(TaskRunner::class)->run('claude_cli', $prompt, [ 'log_file' => $logFile, 'timeout' => 7200, 'idle_timeout' => 1800, 'mcp_mode' => 'empty', 'spawn_plan_dir' => $outputDir, 'task_type' => 'tasks.run', 'capability' => $task->type, 'user_id' => auth()->id(), 'external_label' => "task:{$task->id}", 'metadata' => ['task_id' => $task->id], 'onChunk' => fn ($chunk) => $taskResult->updateQuietly(['preview' => $chunk]), ]); if ($envelope->success) { $taskResult->update([ 'content' => $envelope->summary, 'raw_output' => $envelope->output, 'metadata' => ['usage' => $envelope->usage, 'cost_usd' => $envelope->costUsd], ]); }
Returns a typed TaskResultEnvelope with success / output / summary / usage / costUsd / shadowCostUsd / billingModel / logFile / usageLogId / spawnReport / fallbackReport / error. Identical API across all 6 CLI engines.
Add fallback for quota/rate-limit failures:
$envelope = app(TaskRunner::class)->run('claude_cli', $prompt, [ 'fallback_chain' => ['claude_cli', 'codex_cli', 'gemini_cli'], 'fallback_on' => ['rate limit', 'usage limit', 'quota', '429'], 'inherit_failure_context' => true, ]);
When fallback is active, $envelope->fallbackReport contains the attempted
backend chain and final failure/success state.
Short call — Dispatcher::dispatch()
use SuperAICore\Services\BackendRegistry; use SuperAICore\Services\CostCalculator; use SuperAICore\Services\Dispatcher; $dispatcher = new Dispatcher(new BackendRegistry(), new CostCalculator()); $result = $dispatcher->dispatch([ 'prompt' => 'Hello', 'backend' => 'anthropic_api', 'provider_config' => ['api_key' => 'sk-ant-...'], 'model' => 'claude-sonnet-4-5-20241022', 'max_tokens' => 200, ]); echo $result['text'];
Also accepts 'stream' => true to opt into the same streaming path TaskRunner uses internally.
Advanced options (idempotency, tracing, SDK features, classified errors): see docs/advanced-usage.md.
Architecture
Engines (user-facing) Provider types Dispatcher adapters
──────────────────── ────────────────────── ───────────────────
Claude Code CLI ────────▶ builtin ────▶ claude_cli
anthropic / bedrock / ────▶ anthropic_api
vertex / anthropic-proxy
Codex CLI ────────▶ builtin ────▶ codex_cli
openai / openai-compat ────▶ openai_api
Gemini CLI ────────▶ builtin / vertex ────▶ gemini_cli
google-ai ────▶ gemini_api
Copilot CLI ────────▶ builtin ────▶ copilot_cli
Kiro CLI ────────▶ builtin / kiro-api ────▶ kiro_cli
Kimi Code CLI ────────▶ builtin ────▶ kimi_cli
Qwen Code CLI ────────▶ dashscope-api ────▶ qwen_cli (0.9.8+)
SuperAgent SDK ────────▶ anthropic(-proxy) / ────▶ superagent
openai(-compatible) /
openai-responses / (0.7.0+)
lmstudio (0.7.0+)
Dispatcher ← BackendRegistry (owns the 11 adapters above)
← ProviderResolver (active provider from ProviderRepository)
← RoutingRepository (task_type + capability → service)
← AccountRoundRobin (multi-account picker with cooldowns, 0.9.8+)
← TraceCollector (magic-trace ring; auto-dumps on error/rotate, 0.9.8+)
← UsageTracker (writes to UsageRepository)
← CostCalculator (model pricing → USD)
All repositories are interfaces. The service provider auto-binds Eloquent implementations; swap them for JSON files, Redis, or an external API without touching the dispatcher.
Advanced usage
- Advanced usage guide — idempotency round-trip, W3C trace context, classified provider exceptions,
openai-responses+ Azure OpenAI + ChatGPT OAuth, LM Studio,http_headers/env_http_headersoverrides, SDK features (extra_body/features/loop_detection),ScriptedSpawnBackendhost migration, skill engine telemetry / BM25 ranker / FIX-mode evolution (0.8.6+), the 0.9.0 jcode wave, the 0.9.1 DeepSeek-TUI parity wave, the 0.9.2 TaskRunner reliability wave, the 0.9.6 Squad multi-agent + SDK 1.0.0 wave, the 0.9.7 opencode-borrowed wave, and the 0.9.8 Qwen + tracing + 9Router wave. - Cookbook (0.9.8+) — five gs-quant-style narrative examples: dispatcher basics, prompt caching, provider rotation, cross-harness resume, tracing quickstart.
- Commercialization tiers (0.9.8+) — reference doc for how a tiered offering (Cloud Dashboard / Managed Dispatcher / Enterprise overlays) could look on top of the MIT core. Nothing in this doc is implemented today.
- Supply chain policy (0.9.8+) — no Composer lifecycle scripts,
composer install --no-scriptsdefault, weeklycomposer audit. - Task runner quickstart — full
TaskRunneroption reference. - Streaming backends —
mcp_mode, per-backend stream formats,onChunk. - Spawn plan protocol — codex/gemini agent emulation.
- Host spawn uplift roadmap — why
ScriptedSpawnBackendexists + the 700-line glue it replaces. - Idempotency — 60s dedup window, auto-key derivation.
- MCP sync — catalog + host map → every backend.
- API stability — the SemVer contract.
Configuration
The published config (config/super-ai-core.php) covers host integration, locale switcher, route/view registration, per-backend toggles, default backend, usage retention, MCP directory, process monitor toggle, and per-model pricing. See inline comments for every key.
License
MIT. See LICENSE.