mia-code 0.2.0 → 0.3.0
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/.miette/260321.md +1 -0
- package/.miette/260323.md +9 -0
- package/.miette/260331.md +2 -0
- package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/2604020008--d3417f2c-df12-4f0f-8a1b-d88e7968f822/d3417f2c-df12-4f0f-8a1b-d88e7968f822.md +63 -0
- package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/2604020008--e6c3fc5d-4a70-4523-ba7d-a3250da4c235/e6c3fc5d-4a70-4523-ba7d-a3250da4c235.md +72 -0
- package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/2604020008--efeb00a2-b17a-4d32-b1f0-b90c37a8d24e/efeb00a2-b17a-4d32-b1f0-b90c37a8d24e.md +62 -0
- package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/83a2d7f9-24a5-4cf4-98d5-036c82f872e8.json +302 -0
- package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/83a2d7f9-24a5-4cf4-98d5-036c82f872e8.md +149 -0
- package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/AGENTS.md +31 -0
- package/.pde/2604011511--83a2d7f9-24a5-4cf4-98d5-036c82f872e8/meta-decomposition-3-children.md +67 -0
- package/.pde/2604040129--61f9dd4d-7aa6-45e6-a58b-e480b1aa6737/61f9dd4d-7aa6-45e6-a58b-e480b1aa6737--from-mia-openclaw-workspace.md +125 -0
- package/.pde/2604040129--61f9dd4d-7aa6-45e6-a58b-e480b1aa6737/STATUS.md +1 -0
- package/.pde/4f02ba94-9f52-422e-9389-b16f9b37f358.json +177 -0
- package/.pde/4f02ba94-9f52-422e-9389-b16f9b37f358.md +77 -0
- package/.pde/6ad9244d-5340-490f-b76c-c86728b9de52.json +222 -0
- package/.pde/6ad9244d-5340-490f-b76c-c86728b9de52.md +99 -0
- package/.pde/8b566792-ed15-4606-96f9-2b6f593d7e6b.json +111 -0
- package/.pde/8b566792-ed15-4606-96f9-2b6f593d7e6b.md +67 -0
- package/.pde/c7f1e74b-05a5-40e2-9f01-4cc48d2528f7.json +349 -0
- package/.pde/c7f1e74b-05a5-40e2-9f01-4cc48d2528f7.md +147 -0
- package/.pde/dfc00a78-1da0-4c09-8a16-c6982644051b.json +118 -0
- package/.pde/dfc00a78-1da0-4c09-8a16-c6982644051b.md +64 -0
- package/GUILLAUME.md +8 -0
- package/KINSHIP.md +9 -0
- package/MIA_CODE_ARCHITECTURE_REPORT.md +718 -0
- package/contextual_research/260119-MIA-CODE--98090899-8aff-4e11-9dc3-8b99466d1.md +1101 -0
- package/contextual_research/MIA.md +38 -0
- package/contextual_research/MIAWAPASCONE.md +59 -0
- package/contextual_research/MIETTE.md +38 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/2504.00218v2.pdf +7483 -12
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/2505.00212v3.pdf +0 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/CONTENT.md +1014 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/DESIGN.gemini.md +242 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/INDEX.md +45 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/2504.00218v2.md +2025 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/2504.00218v2.pdf +7483 -12
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/2505.00212v3.md +1755 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/2505.00212v3.pdf +0 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_12_decomposed_prompting.pdf +0 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_19_hugginggpt_planning.pdf +0 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_1_coordination_challenges.md +766 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_1_coordination_challenges.pdf +3431 -4
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_28_guardrails_multi_agent.md +260 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_28_guardrails_multi_agent.pdf +0 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_2_navigating_complexity.md +558 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_2_navigating_complexity.pdf +0 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_34_hierarchical_multi_agent.pdf +0 -0
- package/contextual_research/PDE-generalization--caefee82-efb1-4dbb-8733-691b01581464--260130/sources/footnote_1_5_open_intent_extraction.pdf +0 -0
- package/contextual_research/PODCAST.md +109 -0
- package/contextual_research/langchain-principles-roadmap.md +157 -0
- package/contextual_research/persona-to-narrative-character-inquiry_260201.md +50 -0
- package/dist/cli.js +35 -11
- package/dist/geminiHeadless.js +8 -2
- package/dist/index.js +2 -1
- package/dist/mcp/miaco-server.js +10 -1
- package/dist/mcp/miatel-server.js +10 -1
- package/dist/mcp/miawa-server.js +10 -1
- package/dist/mcp/utils.d.ts +6 -1
- package/dist/mcp/utils.js +24 -3
- package/dist/sessionStore.d.ts +8 -2
- package/dist/sessionStore.js +39 -3
- package/dist/types.d.ts +1 -0
- package/miaco/README.md +124 -0
- package/miaco/dist/commands/chart.d.ts +6 -0
- package/miaco/dist/commands/chart.d.ts.map +1 -0
- package/miaco/dist/commands/chart.js +222 -0
- package/miaco/dist/commands/chart.js.map +1 -0
- package/miaco/dist/commands/decompose.d.ts +6 -0
- package/miaco/dist/commands/decompose.d.ts.map +1 -0
- package/miaco/dist/commands/decompose.js +98 -0
- package/miaco/dist/commands/decompose.js.map +1 -0
- package/miaco/dist/commands/schema.d.ts +6 -0
- package/miaco/dist/commands/schema.d.ts.map +1 -0
- package/miaco/dist/commands/schema.js +66 -0
- package/miaco/dist/commands/schema.js.map +1 -0
- package/miaco/dist/commands/stc.d.ts +11 -0
- package/miaco/dist/commands/stc.d.ts.map +1 -0
- package/miaco/dist/commands/stc.js +590 -0
- package/miaco/dist/commands/stc.js.map +1 -0
- package/miaco/dist/commands/trace.d.ts +6 -0
- package/miaco/dist/commands/trace.d.ts.map +1 -0
- package/miaco/dist/commands/trace.js +83 -0
- package/miaco/dist/commands/trace.js.map +1 -0
- package/miaco/dist/commands/validate.d.ts +6 -0
- package/miaco/dist/commands/validate.d.ts.map +1 -0
- package/miaco/dist/commands/validate.js +58 -0
- package/miaco/dist/commands/validate.js.map +1 -0
- package/miaco/dist/decompose.d.ts +93 -0
- package/miaco/dist/decompose.d.ts.map +1 -0
- package/miaco/dist/decompose.js +562 -0
- package/miaco/dist/decompose.js.map +1 -0
- package/miaco/dist/index.d.ts +18 -0
- package/miaco/dist/index.d.ts.map +1 -0
- package/miaco/dist/index.js +83 -0
- package/miaco/dist/index.js.map +1 -0
- package/miaco/dist/storage.d.ts +60 -0
- package/miaco/dist/storage.d.ts.map +1 -0
- package/miaco/dist/storage.js +100 -0
- package/miaco/dist/storage.js.map +1 -0
- package/miaco/package-lock.json +4103 -0
- package/miaco/package.json +40 -0
- package/miaco/tsconfig.json +18 -0
- package/miaco/version-patch-commit-and-publish.sh +1 -0
- package/miatel/MISSION_251231.md +3 -0
- package/miatel/README.md +107 -0
- package/miatel/dist/commands/analyze.d.ts +6 -0
- package/miatel/dist/commands/analyze.d.ts.map +1 -0
- package/miatel/dist/commands/analyze.js +100 -0
- package/miatel/dist/commands/analyze.js.map +1 -0
- package/miatel/dist/commands/arc.d.ts +6 -0
- package/miatel/dist/commands/arc.d.ts.map +1 -0
- package/miatel/dist/commands/arc.js +71 -0
- package/miatel/dist/commands/arc.js.map +1 -0
- package/miatel/dist/commands/beat.d.ts +6 -0
- package/miatel/dist/commands/beat.d.ts.map +1 -0
- package/miatel/dist/commands/beat.js +165 -0
- package/miatel/dist/commands/beat.js.map +1 -0
- package/miatel/dist/commands/theme.d.ts +6 -0
- package/miatel/dist/commands/theme.d.ts.map +1 -0
- package/miatel/dist/commands/theme.js +54 -0
- package/miatel/dist/commands/theme.js.map +1 -0
- package/miatel/dist/index.d.ts +18 -0
- package/miatel/dist/index.d.ts.map +1 -0
- package/miatel/dist/index.js +80 -0
- package/miatel/dist/index.js.map +1 -0
- package/miatel/dist/storage.d.ts +55 -0
- package/miatel/dist/storage.d.ts.map +1 -0
- package/miatel/dist/storage.js +100 -0
- package/miatel/dist/storage.js.map +1 -0
- package/miatel/package-lock.json +4103 -0
- package/miatel/package.json +35 -0
- package/miatel/src/commands/analyze.ts +109 -0
- package/miatel/src/commands/arc.ts +78 -0
- package/miatel/src/commands/beat.ts +176 -0
- package/miatel/src/commands/theme.ts +60 -0
- package/miatel/src/index.ts +94 -0
- package/miatel/src/storage.ts +156 -0
- package/miatel/tsconfig.json +18 -0
- package/miawa/MISSION_251231.md +144 -0
- package/miawa/README.md +133 -0
- package/miawa/dist/commands/beat.d.ts +6 -0
- package/miawa/dist/commands/beat.d.ts.map +1 -0
- package/miawa/dist/commands/beat.js +69 -0
- package/miawa/dist/commands/beat.js.map +1 -0
- package/miawa/dist/commands/ceremony.d.ts +6 -0
- package/miawa/dist/commands/ceremony.d.ts.map +1 -0
- package/miawa/dist/commands/ceremony.js +239 -0
- package/miawa/dist/commands/ceremony.js.map +1 -0
- package/miawa/dist/commands/circle.d.ts +6 -0
- package/miawa/dist/commands/circle.d.ts.map +1 -0
- package/miawa/dist/commands/circle.js +75 -0
- package/miawa/dist/commands/circle.js.map +1 -0
- package/miawa/dist/commands/eva.d.ts +6 -0
- package/miawa/dist/commands/eva.d.ts.map +1 -0
- package/miawa/dist/commands/eva.js +73 -0
- package/miawa/dist/commands/eva.js.map +1 -0
- package/miawa/dist/commands/wound.d.ts +6 -0
- package/miawa/dist/commands/wound.d.ts.map +1 -0
- package/miawa/dist/commands/wound.js +74 -0
- package/miawa/dist/commands/wound.js.map +1 -0
- package/miawa/dist/index.d.ts +19 -0
- package/miawa/dist/index.d.ts.map +1 -0
- package/miawa/dist/index.js +91 -0
- package/miawa/dist/index.js.map +1 -0
- package/miawa/dist/storage.d.ts +73 -0
- package/miawa/dist/storage.d.ts.map +1 -0
- package/miawa/dist/storage.js +100 -0
- package/miawa/dist/storage.js.map +1 -0
- package/miawa/package-lock.json +4103 -0
- package/miawa/package.json +36 -0
- package/miawa/src/commands/beat.ts +74 -0
- package/miawa/src/commands/ceremony.ts +256 -0
- package/miawa/src/commands/circle.ts +83 -0
- package/miawa/src/commands/eva.ts +84 -0
- package/miawa/src/commands/wound.ts +79 -0
- package/miawa/src/index.ts +108 -0
- package/miawa/src/storage.ts +179 -0
- package/miawa/tsconfig.json +18 -0
- package/package.json +7 -5
- package/references/acp/CLAUDE.md +7 -0
- package/references/acp/agent-plan.md +84 -0
- package/references/acp/clients.md +31 -0
- package/references/acp/extensibility.md +137 -0
- package/references/acp/initialization.md +225 -0
- package/references/acp/prompt-turn.md +321 -0
- package/references/acp/proxy-chains.md +562 -0
- package/references/acp/schema.md +3171 -0
- package/references/acp/session-list.md +334 -0
- package/references/acp/session-modes.md +170 -0
- package/references/acp/slash-commands.md +99 -0
- package/references/acp/terminals.md +281 -0
- package/references/acp/tool-calls.md +311 -0
- package/references/acp/typescript.md +29 -0
- package/references/claude/agent-teams.md +399 -0
- package/references/claude/chrome.md +231 -0
- package/references/claude/headless.md +158 -0
- package/references/claude/hooks-guide.md +708 -0
- package/references/claude/output-styles.md +112 -0
- package/references/claude/plugins.md +432 -0
- package/references/claude/skills.md +693 -0
- package/references/claude/sub-agents.md +816 -0
- package/references/copilot/acp/agents.md +32 -0
- package/references/copilot/acp/architecture.md +37 -0
- package/references/copilot/acp/clients.md +31 -0
- package/references/copilot/acp/introduction.md +42 -0
- package/references/copilot/acp/registry.md +339 -0
- package/references/copilot/acp-server.md +117 -0
- package/references/copilot/create-copilot-instructions.md +840 -0
- package/references/langchain/llms.txt +833 -0
- package/references/langchain/python/agents.md +677 -0
- package/references/langchain/python/context-engineering.md +1195 -0
- package/references/langchain/python/human-in-the-loop.md +326 -0
- package/references/langchain/python/long-term-memory.md +168 -0
- package/references/langchain/python/mcp.md +949 -0
- package/references/langchain/python/multi-agents/custom-workflow.md +187 -0
- package/references/langchain/python/multi-agents/handoffs.md +436 -0
- package/references/langchain/python/multi-agents/overview.md +295 -0
- package/references/langchain/python/multi-agents/router.md +150 -0
- package/references/langchain/python/multi-agents/skills.md +92 -0
- package/references/langchain/python/multi-agents/subagents.md +486 -0
- package/references/langchain/python/retrieval.md +320 -0
- package/references/langchain/python/runtime.md +141 -0
- package/references/langchain/python/short-term-memory.md +658 -0
- package/references/langchain/python/structured-output.md +712 -0
- package/references/langfuse/llms.txt +148 -0
- package/references/langgraph/javascript/llms.txt +275 -0
- package/references/skills/home.md +259 -0
- package/references/skills/integrate-skills.md +103 -0
- package/references/skills/specification.md +254 -0
- package/references/skills/what-are-skills.md +74 -0
- package/rispecs/README.md +164 -0
- package/rispecs/_sync_/miadi-code/SPEC.md +313 -0
- package/rispecs/_sync_/miadi-code/STATUS.md +177 -0
- package/rispecs/_sync_/miadi-code/dashboard/SPEC.md +465 -0
- package/rispecs/_sync_/miadi-code/dashboard/STATUS.md +212 -0
- package/rispecs/_sync_/miadi-code/multiline-input/SPEC.md +232 -0
- package/rispecs/_sync_/miadi-code/multiline-input/STATUS.md +108 -0
- package/rispecs/_sync_/miadi-code/pde/SPEC.md +253 -0
- package/rispecs/_sync_/miadi-code/pde/STATUS.md +56 -0
- package/rispecs/_sync_/miadi-code/stc/SPEC.md +397 -0
- package/rispecs/_sync_/miadi-code/stc/STATUS.md +70 -0
- package/rispecs/ava-langstack/inquiry-routing-upgrade.spec.md +119 -0
- package/rispecs/borrowed_from_opencode/001-client-server-architecture.rispec.md +98 -0
- package/rispecs/borrowed_from_opencode/002-event-bus-system.rispec.md +125 -0
- package/rispecs/borrowed_from_opencode/003-instance-state-pattern.rispec.md +136 -0
- package/rispecs/borrowed_from_opencode/004-namespace-module-pattern.rispec.md +151 -0
- package/rispecs/borrowed_from_opencode/005-zod-schema-validation.rispec.md +139 -0
- package/rispecs/borrowed_from_opencode/006-named-error-system.rispec.md +155 -0
- package/rispecs/borrowed_from_opencode/007-structured-logging.rispec.md +138 -0
- package/rispecs/borrowed_from_opencode/008-lazy-initialization.rispec.md +127 -0
- package/rispecs/borrowed_from_opencode/009-multi-agent-system.rispec.md +97 -0
- package/rispecs/borrowed_from_opencode/010-agent-definition-config.rispec.md +135 -0
- package/rispecs/borrowed_from_opencode/011-agent-permission-rulesets.rispec.md +151 -0
- package/rispecs/borrowed_from_opencode/012-agent-prompt-templates.rispec.md +141 -0
- package/rispecs/borrowed_from_opencode/013-agent-generation.rispec.md +142 -0
- package/rispecs/borrowed_from_opencode/014-plan-build-mode-toggle.rispec.md +155 -0
- package/rispecs/borrowed_from_opencode/015-subagent-task-delegation.rispec.md +146 -0
- package/rispecs/borrowed_from_opencode/016-agent-model-selection.rispec.md +151 -0
- package/rispecs/borrowed_from_opencode/017-compaction-agent.rispec.md +150 -0
- package/rispecs/borrowed_from_opencode/018-session-persistence.rispec.md +125 -0
- package/rispecs/borrowed_from_opencode/019-session-compaction.rispec.md +132 -0
- package/rispecs/borrowed_from_opencode/020-session-forking.rispec.md +134 -0
- package/rispecs/borrowed_from_opencode/021-session-revert-snapshot.rispec.md +135 -0
- package/rispecs/borrowed_from_opencode/022-session-sharing.rispec.md +165 -0
- package/rispecs/borrowed_from_opencode/023-session-summary-diffs.rispec.md +165 -0
- package/rispecs/borrowed_from_opencode/024-child-sessions.rispec.md +164 -0
- package/rispecs/borrowed_from_opencode/025-session-title-generation.rispec.md +162 -0
- package/rispecs/borrowed_from_opencode/026-message-parts-model.rispec.md +201 -0
- package/rispecs/borrowed_from_opencode/027-streaming-message-deltas.rispec.md +212 -0
- package/rispecs/borrowed_from_opencode/028-multi-provider-architecture.rispec.md +184 -0
- package/rispecs/borrowed_from_opencode/029-provider-authentication.rispec.md +225 -0
- package/rispecs/borrowed_from_opencode/030-model-registry.rispec.md +222 -0
- package/rispecs/borrowed_from_opencode/031-cost-tracking.rispec.md +243 -0
- package/rispecs/borrowed_from_opencode/032-provider-transform-pipeline.rispec.md +282 -0
- package/rispecs/borrowed_from_opencode/033-provider-sdk-abstraction.rispec.md +338 -0
- package/rispecs/borrowed_from_opencode/034-tool-registry.rispec.md +110 -0
- package/rispecs/borrowed_from_opencode/035-tool-context-injection.rispec.md +155 -0
- package/rispecs/borrowed_from_opencode/036-tool-output-truncation.rispec.md +138 -0
- package/rispecs/borrowed_from_opencode/037-batch-tool.rispec.md +129 -0
- package/rispecs/borrowed_from_opencode/038-multi-edit-tool.rispec.md +167 -0
- package/rispecs/borrowed_from_opencode/039-apply-patch-tool.rispec.md +161 -0
- package/rispecs/borrowed_from_opencode/040-code-search-tool.rispec.md +143 -0
- package/rispecs/borrowed_from_opencode/041-web-fetch-tool.rispec.md +131 -0
- package/rispecs/borrowed_from_opencode/042-web-search-tool.rispec.md +159 -0
- package/rispecs/borrowed_from_opencode/043-todo-tool.rispec.md +156 -0
- package/rispecs/borrowed_from_opencode/044-plan-mode-tool.rispec.md +139 -0
- package/rispecs/borrowed_from_opencode/045-task-tool.rispec.md +146 -0
- package/rispecs/borrowed_from_opencode/046-question-tool.rispec.md +170 -0
- package/rispecs/borrowed_from_opencode/047-external-directory-tool.rispec.md +166 -0
- package/rispecs/borrowed_from_opencode/048-file-read-write-tools.rispec.md +205 -0
- package/rispecs/borrowed_from_opencode/049-lsp-server-management.rispec.md +104 -0
- package/rispecs/borrowed_from_opencode/050-lsp-hover-completion.rispec.md +102 -0
- package/rispecs/borrowed_from_opencode/051-lsp-diagnostics.rispec.md +86 -0
- package/rispecs/borrowed_from_opencode/052-lsp-root-detection.rispec.md +109 -0
- package/rispecs/borrowed_from_opencode/053-remote-mcp-servers.rispec.md +119 -0
- package/rispecs/borrowed_from_opencode/054-mcp-oauth-flow.rispec.md +107 -0
- package/rispecs/borrowed_from_opencode/055-mcp-tool-conversion.rispec.md +118 -0
- package/rispecs/borrowed_from_opencode/056-mcp-connection-monitoring.rispec.md +106 -0
- package/rispecs/borrowed_from_opencode/057-local-mcp-servers.rispec.md +116 -0
- package/rispecs/borrowed_from_opencode/058-rich-tui.rispec.md +108 -0
- package/rispecs/borrowed_from_opencode/059-streaming-display.rispec.md +116 -0
- package/rispecs/borrowed_from_opencode/060-permission-prompts.rispec.md +130 -0
- package/rispecs/borrowed_from_opencode/061-session-navigation.rispec.md +155 -0
- package/rispecs/borrowed_from_opencode/062-syntax-highlighting.rispec.md +151 -0
- package/rispecs/borrowed_from_opencode/063-keybinding-system.rispec.md +181 -0
- package/rispecs/borrowed_from_opencode/064-multi-level-config.rispec.md +155 -0
- package/rispecs/borrowed_from_opencode/065-jsonc-config.rispec.md +190 -0
- package/rispecs/borrowed_from_opencode/066-config-env-variables.rispec.md +153 -0
- package/rispecs/borrowed_from_opencode/067-config-deep-merging.rispec.md +178 -0
- package/rispecs/borrowed_from_opencode/068-remote-org-config.rispec.md +183 -0
- package/rispecs/borrowed_from_opencode/069-config-markdown-frontmatter.rispec.md +206 -0
- package/rispecs/borrowed_from_opencode/070-managed-config-directory.rispec.md +232 -0
- package/rispecs/borrowed_from_opencode/071-plugin-architecture.rispec.md +104 -0
- package/rispecs/borrowed_from_opencode/072-plugin-hooks.rispec.md +123 -0
- package/rispecs/borrowed_from_opencode/073-plugin-auto-install.rispec.md +115 -0
- package/rispecs/borrowed_from_opencode/074-permission-system.rispec.md +133 -0
- package/rispecs/borrowed_from_opencode/075-git-worktree-management.rispec.md +126 -0
- package/rispecs/borrowed_from_opencode/076-snapshot-system.rispec.md +124 -0
- package/rispecs/borrowed_from_opencode/077-snapshot-diff.rispec.md +117 -0
- package/rispecs/borrowed_from_opencode/078-snapshot-restore.rispec.md +128 -0
- package/rispecs/borrowed_from_opencode/079-worktree-branch-naming.rispec.md +122 -0
- package/rispecs/borrowed_from_opencode/080-sqlite-storage.rispec.md +134 -0
- package/rispecs/borrowed_from_opencode/081-database-migrations.rispec.md +148 -0
- package/rispecs/borrowed_from_opencode/082-database-transactions.rispec.md +138 -0
- package/rispecs/borrowed_from_opencode/083-deferred-effects.rispec.md +148 -0
- package/rispecs/borrowed_from_opencode/084-permission-rules.rispec.md +123 -0
- package/rispecs/borrowed_from_opencode/085-permission-glob-patterns.rispec.md +113 -0
- package/rispecs/borrowed_from_opencode/086-permission-merging.rispec.md +134 -0
- package/rispecs/borrowed_from_opencode/087-permission-modes.rispec.md +145 -0
- package/rispecs/borrowed_from_opencode/088-http-api-server.rispec.md +165 -0
- package/rispecs/borrowed_from_opencode/089-openapi-spec-generation.rispec.md +164 -0
- package/rispecs/borrowed_from_opencode/090-websocket-support.rispec.md +136 -0
- package/rispecs/borrowed_from_opencode/091-sse-streaming.rispec.md +168 -0
- package/rispecs/borrowed_from_opencode/092-mdns-discovery.rispec.md +145 -0
- package/rispecs/borrowed_from_opencode/093-javascript-sdk.rispec.md +200 -0
- package/rispecs/borrowed_from_opencode/094-skill-system.rispec.md +187 -0
- package/rispecs/borrowed_from_opencode/095-skill-discovery.rispec.md +182 -0
- package/rispecs/borrowed_from_opencode/096-desktop-remote-driving.rispec.md +175 -0
- package/rispecs/borrowed_from_opencode/INDEX.md +255 -0
- package/rispecs/core.rispecs.md +261 -0
- package/rispecs/engines.rispecs.md +241 -0
- package/rispecs/formatting.rispecs.md +252 -0
- package/rispecs/living-specifications.rispecs.md +361 -0
- package/rispecs/mcp.rispecs.md +197 -0
- package/rispecs/pde.rispecs.md +399 -0
- package/rispecs/pi-mono-envisionning/ENVISIONING.md +366 -0
- package/rispecs/pi-mono-envisionning/storytelling-horizon.rispecs.md +76 -0
- package/rispecs/pi-mono-envisionning/widget.rispecs.md +2 -0
- package/rispecs/relation-to-mcp-structural-thinking.kin.md +72 -0
- package/rispecs/research-for-better-framework/CLAUDE.md +7 -0
- package/rispecs/research-for-better-framework/survey-pi-openclaw-opencode-openhands.md +210 -0
- package/rispecs/session.rispecs.md +277 -0
- package/rispecs/stc.rispecs.md +138 -0
- package/rispecs/unifier.rispecs.md +317 -0
- package/scripts/LAUNCH--mcp-mia-code--testing--2603141315--ac705a66-2c15-4a1c-a26d-9491018c5ba8.sh +2 -0
- package/scripts/RESUME--mia-code--mcps--260313--ac705a66-2c15-4a1c-a26d-9491018c5ba8.sh +1 -0
- package/scripts/install-widget-in-home-pi-agent-extensions.sh +4 -0
- package/scripts/sample-decompose--2604011535-prompt.sh +1 -0
- package/skills/deep-search/AGENTS.md +17 -0
- package/skills/deep-search/SKILL.md +281 -0
- package/skills/deep-search/agent-templates.md +224 -0
- package/skills/deep-search/orchestration-patterns.md +95 -0
- package/skills/miaco-pde-inquiry-routing-deep-search/AGENTS.md +13 -0
- package/skills/miaco-pde-inquiry-routing-deep-search/SKILL.md +136 -0
- package/skills/miaco-pde-inquiry-routing-internal-external-relationship/AGENTS.md +4 -0
- package/skills/miaco-pde-inquiry-routing-internal-external-relationship/SKILL.md +157 -0
- package/skills/miaco-pde-inquiry-routing-local-qmd/AGENTS.md +42 -0
- package/skills/miaco-pde-inquiry-routing-local-qmd/SKILL.md +135 -0
- package/skills/qmd/AGENTS.md +3 -0
- package/skills/qmd/SKILL.md +144 -0
- package/skills/qmd/references/mcp-setup.md +102 -0
- package/skills/rise-pde-inquiry-session-multi-agents-v3/SKILL.md +234 -0
- package/skills/rise-pde-inquiry-session-multi-agents-v3/agent-templates.md +436 -0
- package/skills/rise-pde-inquiry-session-multi-agents-v3/orchestration-patterns.md +197 -0
- package/skills/rise-pde-inquiry-session-multi-agents-v3/references/ceremonial-technology.md +102 -0
- package/skills/rise-pde-inquiry-session-multi-agents-v3/references/creative-orientation.md +99 -0
- package/skills/rise-pde-inquiry-session-multi-agents-v3/references/prompt-decomposition.md +73 -0
- package/skills/rise-pde-inquiry-session-multi-agents-v3/references/rise-framework.md +74 -0
- package/skills/rise-pde-inquiry-session-multi-agents-v3/references/structural-tension.md +82 -0
- package/src/cli.ts +35 -11
- package/src/geminiHeadless.ts +7 -2
- package/src/index.ts +2 -1
- package/src/mcp/miaco-server.ts +13 -1
- package/src/mcp/miatel-server.ts +13 -1
- package/src/mcp/miawa-server.ts +13 -1
- package/src/mcp/utils.ts +41 -8
- package/src/sessionStore.ts +44 -4
- package/src/types.ts +2 -1
- package/widget/mia-ceremony/README.md +36 -0
- package/widget/mia-ceremony/index.ts +143 -0
- package/widget/mia-interceptor/README.md +39 -0
- package/widget/mia-interceptor/index.ts +221 -0
- package/widget/mia-tools/README.md +37 -0
- package/widget/mia-tools/index.ts +569 -0
- package/widget/miette-echo/README.md +44 -0
- package/widget/miette-echo/index.ts +164 -0
- package/.claude/settings.local.json +0 -9
- package/.hch/issue_.env +0 -4
- package/.hch/issue_add__2601211715.json +0 -77
- package/.hch/issue_add__2601211715.md +0 -4
- package/.hch/issue_add__2602242020.json +0 -78
- package/.hch/issue_add__2602242020.md +0 -7
- package/.hch/issues.json +0 -2312
- package/.hch/issues.md +0 -30
- package/WS__mia-code__260214__IAIP_PDE.code-workspace +0 -29
- package/WS__mia-code__src332__260122.code-workspace +0 -23
- package/samples/copilot/session-state/be76abaa-a27f-4725-b2a9-22fb45f7e0f7/checkpoints/index.md +0 -6
- package/samples/copilot/session-state/be76abaa-a27f-4725-b2a9-22fb45f7e0f7/events.jsonl +0 -213
- package/samples/copilot/session-state/be76abaa-a27f-4725-b2a9-22fb45f7e0f7/plan.md +0 -243
- package/samples/copilot/session-state/be76abaa-a27f-4725-b2a9-22fb45f7e0f7/workspace.yaml +0 -5
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# RISE-026: Message Parts Model
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/026-message-parts-model.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code replaces flat text messages with a rich, structured parts model where each message contains typed components — text, tool calls, tool results, errors, images, and files. This enables the system to render tool calls differently from prose, track costs per message, replay sessions with full fidelity, and stream individual parts during generation. The message becomes a container of semantic units, each carrying its own type information and metadata.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- Messages are stored as flat text strings with no internal structure
|
|
14
|
+
- Tool calls and their results are serialized as part of the text blob — no programmatic access
|
|
15
|
+
- Rendering logic must parse text to identify tool calls, code blocks, and other elements
|
|
16
|
+
- Cost and token tracking is per-session at best — not per-message
|
|
17
|
+
- Session replay loses tool call boundaries and timing
|
|
18
|
+
- Streaming delivers raw text chunks with no semantic framing
|
|
19
|
+
- Errors, images, and file references are ad-hoc text within messages
|
|
20
|
+
|
|
21
|
+
**Desired State:**
|
|
22
|
+
- Each message is a container holding one or more typed Parts
|
|
23
|
+
- Parts have explicit types: TextPart, ToolCallPart, ToolResultPart, ErrorPart, ImagePart, FilePart
|
|
24
|
+
- Each part is independently addressable, renderable, and streamable
|
|
25
|
+
- Message metadata carries model, token counts, and cost information
|
|
26
|
+
- The UI renders each part type with appropriate formatting
|
|
27
|
+
- Session replay reconstructs the exact sequence of parts
|
|
28
|
+
- Parts are individually stored in the database with ordering indices
|
|
29
|
+
|
|
30
|
+
## Desired Outcome Definition
|
|
31
|
+
|
|
32
|
+
An assistant message containing a text explanation, a tool call to edit a file, and the tool's result is stored as three separate parts. The UI renders the text in normal formatting, the tool call in a collapsible panel with syntax-highlighted arguments, and the tool result with a success/failure indicator. Each part was streamed independently during generation.
|
|
33
|
+
|
|
34
|
+
## Natural Language Functional Description
|
|
35
|
+
|
|
36
|
+
### Message Structure
|
|
37
|
+
|
|
38
|
+
A Message contains:
|
|
39
|
+
```typescript
|
|
40
|
+
interface Message {
|
|
41
|
+
id: string; // UUID v4
|
|
42
|
+
session_id: string; // FK to sessions table
|
|
43
|
+
role: "user" | "assistant" | "system";
|
|
44
|
+
metadata: MessageMetadata;
|
|
45
|
+
parts: Part[]; // ordered list of typed parts
|
|
46
|
+
created_at: number; // Unix timestamp ms
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
interface MessageMetadata {
|
|
50
|
+
model?: string; // e.g. "claude-sonnet-4-20250514"
|
|
51
|
+
input_tokens?: number;
|
|
52
|
+
output_tokens?: number;
|
|
53
|
+
cost?: number; // USD cost of this message
|
|
54
|
+
duration_ms?: number; // generation time
|
|
55
|
+
cached_tokens?: number; // tokens served from cache
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Part Types
|
|
60
|
+
|
|
61
|
+
Each Part has a `type` discriminator and type-specific content:
|
|
62
|
+
|
|
63
|
+
**TextPart** — plain text content from the LLM or user:
|
|
64
|
+
```typescript
|
|
65
|
+
interface TextPart {
|
|
66
|
+
type: "text";
|
|
67
|
+
content: string; // the text content, may contain markdown
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**ToolCallPart** — an invocation of a tool by the assistant:
|
|
72
|
+
```typescript
|
|
73
|
+
interface ToolCallPart {
|
|
74
|
+
type: "tool_call";
|
|
75
|
+
tool_call_id: string; // unique ID for matching with result
|
|
76
|
+
tool_name: string; // e.g. "edit_file", "bash", "grep"
|
|
77
|
+
arguments: Record<string, unknown>; // tool-specific arguments
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**ToolResultPart** — the output from a tool execution:
|
|
82
|
+
```typescript
|
|
83
|
+
interface ToolResultPart {
|
|
84
|
+
type: "tool_result";
|
|
85
|
+
tool_call_id: string; // matches the ToolCallPart
|
|
86
|
+
output: string; // tool output text
|
|
87
|
+
title?: string; // human-readable title for display
|
|
88
|
+
metadata?: {
|
|
89
|
+
exit_code?: number;
|
|
90
|
+
duration_ms?: number;
|
|
91
|
+
bytes_read?: number;
|
|
92
|
+
};
|
|
93
|
+
attachments?: Attachment[]; // files, images produced by tool
|
|
94
|
+
is_error?: boolean; // true if tool execution failed
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**ErrorPart** — an error that occurred during processing:
|
|
99
|
+
```typescript
|
|
100
|
+
interface ErrorPart {
|
|
101
|
+
type: "error";
|
|
102
|
+
error_name: string; // e.g. "ToolExecutionError", "RateLimitError"
|
|
103
|
+
message: string; // human-readable error description
|
|
104
|
+
metadata?: {
|
|
105
|
+
code?: string;
|
|
106
|
+
retryable?: boolean;
|
|
107
|
+
stack?: string;
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**ImagePart** — an image (screenshot, diagram, generated visual):
|
|
113
|
+
```typescript
|
|
114
|
+
interface ImagePart {
|
|
115
|
+
type: "image";
|
|
116
|
+
data: string; // base64-encoded image data
|
|
117
|
+
mime_type: string; // e.g. "image/png", "image/jpeg"
|
|
118
|
+
alt_text?: string; // accessibility description
|
|
119
|
+
width?: number;
|
|
120
|
+
height?: number;
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**FilePart** — a reference to or content of a file:
|
|
125
|
+
```typescript
|
|
126
|
+
interface FilePart {
|
|
127
|
+
type: "file";
|
|
128
|
+
path: string; // relative file path
|
|
129
|
+
content?: string; // file content (may be truncated)
|
|
130
|
+
language?: string; // syntax highlighting hint
|
|
131
|
+
line_range?: [number, number]; // if showing a range
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Database Storage
|
|
136
|
+
|
|
137
|
+
Parts are stored in the `parts` table (RISE-018):
|
|
138
|
+
- `id` TEXT PRIMARY KEY
|
|
139
|
+
- `message_id` TEXT FK → messages
|
|
140
|
+
- `type` TEXT — the part type discriminator
|
|
141
|
+
- `content` JSON — the full part payload serialized as JSON
|
|
142
|
+
- `index` INTEGER — ordering within the message (0-based)
|
|
143
|
+
- `created_at` INTEGER — timestamp
|
|
144
|
+
|
|
145
|
+
Query patterns:
|
|
146
|
+
- Get all parts for a message: `SELECT * FROM parts WHERE message_id = ? ORDER BY index`
|
|
147
|
+
- Get tool calls in a session: `SELECT p.* FROM parts p JOIN messages m ON p.message_id = m.id WHERE m.session_id = ? AND p.type = 'tool_call'`
|
|
148
|
+
- Count errors: `SELECT COUNT(*) FROM parts p JOIN messages m ON p.message_id = m.id WHERE m.session_id = ? AND p.type = 'error'`
|
|
149
|
+
|
|
150
|
+
### Part Construction
|
|
151
|
+
|
|
152
|
+
When the LLM generates a response, the output is parsed into parts:
|
|
153
|
+
1. Text content → TextPart
|
|
154
|
+
2. Tool use blocks → ToolCallPart (one per tool invocation)
|
|
155
|
+
3. After tool execution → ToolResultPart (paired with ToolCallPart via tool_call_id)
|
|
156
|
+
4. Errors during processing → ErrorPart
|
|
157
|
+
5. Image outputs → ImagePart
|
|
158
|
+
6. File references in structured output → FilePart
|
|
159
|
+
|
|
160
|
+
Parts are assigned sequential `index` values as they are created.
|
|
161
|
+
|
|
162
|
+
### Rendering Contract
|
|
163
|
+
|
|
164
|
+
Each part type has a defined rendering behavior:
|
|
165
|
+
- **TextPart:** rendered as markdown with syntax highlighting for code blocks
|
|
166
|
+
- **ToolCallPart:** rendered as a collapsible panel showing tool name and formatted arguments
|
|
167
|
+
- **ToolResultPart:** rendered with success/failure indicator, collapsible output, duration badge
|
|
168
|
+
- **ErrorPart:** rendered with error styling (red), error name prominent, details expandable
|
|
169
|
+
- **ImagePart:** rendered as inline image with alt text
|
|
170
|
+
- **FilePart:** rendered as syntax-highlighted code block with file path header
|
|
171
|
+
|
|
172
|
+
### Streaming Integration
|
|
173
|
+
|
|
174
|
+
Parts are individually streamable (see RISE-027):
|
|
175
|
+
- TextPart streams incrementally as `text_delta` events
|
|
176
|
+
- ToolCallPart streams as `tool_call_start` then `tool_call_delta` for arguments
|
|
177
|
+
- ToolResultPart streams as `tool_result_delta` for long outputs
|
|
178
|
+
- Other parts are sent as complete units
|
|
179
|
+
|
|
180
|
+
## Supporting Structures
|
|
181
|
+
|
|
182
|
+
- **Session Persistence (RISE-018)** defines the `parts` table schema and data access methods
|
|
183
|
+
- **Streaming Message Deltas (RISE-027)** builds on parts for incremental delivery
|
|
184
|
+
- **Session Compaction (RISE-019)** — compaction summary is stored as a special TextPart
|
|
185
|
+
- **Session Sharing (RISE-022)** — shared views render each part type with appropriate formatting
|
|
186
|
+
- **Zod Schema Validation (RISE-005)** validates part payloads before database insertion
|
|
187
|
+
- **Named Error System (RISE-006)** provides InvalidPartTypeError, PartValidationError
|
|
188
|
+
|
|
189
|
+
## Creative Advancement Scenarios
|
|
190
|
+
|
|
191
|
+
**Scenario 1 — Rich Tool Call Display:**
|
|
192
|
+
The agent calls `bash` with a complex command. The UI renders a ToolCallPart showing the command in a monospace panel. The ToolResultPart appears below with the output, a green checkmark, and "completed in 1.2s." The developer sees structured, readable output instead of a text dump.
|
|
193
|
+
|
|
194
|
+
**Scenario 2 — Cost Tracking:**
|
|
195
|
+
After a session, the developer checks costs. Each message's metadata shows token counts and cost. The session total is computed by summing message costs. Tool-heavy messages cost more (large tool results consume input tokens) — the parts model makes this visible.
|
|
196
|
+
|
|
197
|
+
**Scenario 3 — Session Replay:**
|
|
198
|
+
A developer replays a shared session (RISE-022). Each part renders in sequence with timing: text appears as if being typed, tool calls expand to show execution, results appear after the recorded duration. The replay recreates the development experience.
|
|
199
|
+
|
|
200
|
+
**Scenario 4 — Error Diagnosis:**
|
|
201
|
+
A session had intermittent failures. The developer queries: "show me all errors in this session." The system queries parts with `type = 'error'`, returning a focused list of ErrorParts with names, messages, and timestamps — no manual scanning required.
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# RISE-027: Streaming Message Deltas
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/027-streaming-message-deltas.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code streams partial message updates to the UI in real-time as the LLM generates content, rather than waiting for the complete response. Developers see text appear word-by-word, tool calls unfold as they are constructed, and results flow in progressively. Streaming transforms the interaction from "wait and see" to "watch it think" — providing immediate feedback, enabling early cancellation of wrong-headed responses, and creating the fluid, responsive feel that distinguishes a professional tool from a batch job.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- Agent responses are buffered until complete, then displayed as a monolithic block
|
|
14
|
+
- Long responses leave the developer staring at a spinner for 10-30 seconds with no feedback
|
|
15
|
+
- There is no way to cancel a response mid-generation — the developer must wait for completion
|
|
16
|
+
- Tool calls appear atomically: the developer sees nothing until the tool finishes and the result is rendered
|
|
17
|
+
- Token costs accumulate invisibly — the developer only sees the total after the response completes
|
|
18
|
+
- The UI cannot progressively render content, missing opportunities for perceived performance gains
|
|
19
|
+
|
|
20
|
+
**Desired State:**
|
|
21
|
+
- Text streams character-by-character (or chunk-by-chunk) as the LLM generates it
|
|
22
|
+
- Tool calls stream in phases: start (name known), delta (arguments building), result (output streaming)
|
|
23
|
+
- The UI renders incrementally, giving immediate visual feedback
|
|
24
|
+
- Developers can cancel mid-generation, stopping token consumption
|
|
25
|
+
- Token counts and cost estimates update in real-time during generation
|
|
26
|
+
- The streaming protocol is well-defined with typed delta events
|
|
27
|
+
|
|
28
|
+
## Desired Outcome Definition
|
|
29
|
+
|
|
30
|
+
The developer sends a prompt. Within 200ms, the first text characters appear. As the LLM constructs a tool call, the tool name appears immediately, then arguments build progressively. When the tool executes, its output streams line by line. A running token counter updates throughout. At any point, Ctrl+C cancels generation and stops billing. The complete message is assembled from deltas and persisted.
|
|
31
|
+
|
|
32
|
+
## Natural Language Functional Description
|
|
33
|
+
|
|
34
|
+
### Delta Types
|
|
35
|
+
|
|
36
|
+
Each delta is a typed event referencing a specific message and part:
|
|
37
|
+
|
|
38
|
+
**TextDelta** — incremental text content:
|
|
39
|
+
```typescript
|
|
40
|
+
interface TextDelta {
|
|
41
|
+
type: "text_delta";
|
|
42
|
+
message_id: string;
|
|
43
|
+
part_index: number;
|
|
44
|
+
content: string; // the new text chunk
|
|
45
|
+
accumulated_length: number; // total text length so far
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**ToolCallStart** — a tool invocation begins:
|
|
50
|
+
```typescript
|
|
51
|
+
interface ToolCallStart {
|
|
52
|
+
type: "tool_call_start";
|
|
53
|
+
message_id: string;
|
|
54
|
+
part_index: number;
|
|
55
|
+
tool_call_id: string;
|
|
56
|
+
tool_name: string;
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**ToolCallDelta** — tool arguments are being built:
|
|
61
|
+
```typescript
|
|
62
|
+
interface ToolCallDelta {
|
|
63
|
+
type: "tool_call_delta";
|
|
64
|
+
message_id: string;
|
|
65
|
+
part_index: number;
|
|
66
|
+
tool_call_id: string;
|
|
67
|
+
arguments_delta: string; // JSON fragment of arguments
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**ToolResultStart** — tool execution has begun:
|
|
72
|
+
```typescript
|
|
73
|
+
interface ToolResultStart {
|
|
74
|
+
type: "tool_result_start";
|
|
75
|
+
message_id: string;
|
|
76
|
+
part_index: number;
|
|
77
|
+
tool_call_id: string;
|
|
78
|
+
title?: string;
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**ToolResultDelta** — streaming tool output:
|
|
83
|
+
```typescript
|
|
84
|
+
interface ToolResultDelta {
|
|
85
|
+
type: "tool_result_delta";
|
|
86
|
+
message_id: string;
|
|
87
|
+
part_index: number;
|
|
88
|
+
tool_call_id: string;
|
|
89
|
+
content: string; // output chunk
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**ToolResultEnd** — tool execution completed:
|
|
94
|
+
```typescript
|
|
95
|
+
interface ToolResultEnd {
|
|
96
|
+
type: "tool_result_end";
|
|
97
|
+
message_id: string;
|
|
98
|
+
part_index: number;
|
|
99
|
+
tool_call_id: string;
|
|
100
|
+
is_error: boolean;
|
|
101
|
+
duration_ms: number;
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**MetadataDelta** — updated token counts and cost:
|
|
106
|
+
```typescript
|
|
107
|
+
interface MetadataDelta {
|
|
108
|
+
type: "metadata_delta";
|
|
109
|
+
message_id: string;
|
|
110
|
+
input_tokens: number; // cumulative input tokens
|
|
111
|
+
output_tokens: number; // cumulative output tokens
|
|
112
|
+
cost: number; // estimated cost so far (USD)
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Complete** — message generation finished:
|
|
117
|
+
```typescript
|
|
118
|
+
interface Complete {
|
|
119
|
+
type: "complete";
|
|
120
|
+
message_id: string;
|
|
121
|
+
final_metadata: MessageMetadata;
|
|
122
|
+
stop_reason: "end_turn" | "max_tokens" | "tool_use" | "cancelled";
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Streaming Pipeline
|
|
127
|
+
|
|
128
|
+
The streaming pipeline processes LLM output through these stages:
|
|
129
|
+
|
|
130
|
+
1. **LLM Stream:** the model provider emits raw chunks (text tokens, tool use blocks)
|
|
131
|
+
2. **Delta Parser:** converts raw chunks into typed Delta events
|
|
132
|
+
3. **Part Assembler:** accumulates deltas into complete Parts for persistence
|
|
133
|
+
4. **Delta Emitter:** sends deltas to connected clients via the event bus (RISE-002)
|
|
134
|
+
5. **Persistence:** when complete, the assembled message and parts are written to the database
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
LLM API → Delta Parser → Part Assembler → Database
|
|
138
|
+
↓
|
|
139
|
+
Delta Emitter → Event Bus → Client(s)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Client Rendering
|
|
143
|
+
|
|
144
|
+
The client receives deltas and updates the display:
|
|
145
|
+
|
|
146
|
+
- **TextDelta:** append text to the current text block, re-render markdown
|
|
147
|
+
- **ToolCallStart:** create a new tool call panel with the tool name
|
|
148
|
+
- **ToolCallDelta:** progressively render JSON arguments in the panel
|
|
149
|
+
- **ToolResultStart:** show a "running..." indicator beneath the tool call
|
|
150
|
+
- **ToolResultDelta:** append output lines to the result area
|
|
151
|
+
- **ToolResultEnd:** update the indicator to success/failure with duration
|
|
152
|
+
- **MetadataDelta:** update the token/cost counter in the status bar
|
|
153
|
+
- **Complete:** finalize rendering, remove any "generating..." indicators
|
|
154
|
+
|
|
155
|
+
### Cancellation
|
|
156
|
+
|
|
157
|
+
At any point during streaming, the developer can cancel:
|
|
158
|
+
|
|
159
|
+
1. User presses Ctrl+C or clicks cancel
|
|
160
|
+
2. Client sends an abort signal to the server (or locally to the agent)
|
|
161
|
+
3. The abort signal propagates to the LLM API call, stopping generation
|
|
162
|
+
4. The Delta Parser emits a `Complete` event with `stop_reason: "cancelled"`
|
|
163
|
+
5. The Part Assembler finalizes with whatever content was received
|
|
164
|
+
6. Partial content is persisted — the message exists with whatever parts were completed
|
|
165
|
+
7. Token billing stops at the cancellation point
|
|
166
|
+
|
|
167
|
+
### Delivery Mechanisms
|
|
168
|
+
|
|
169
|
+
Deltas reach clients through multiple transport options:
|
|
170
|
+
|
|
171
|
+
**Local (CLI):** deltas flow directly through in-process event bus to the TUI renderer. Zero network overhead.
|
|
172
|
+
|
|
173
|
+
**SSE (HTTP):** for client-server architecture (RISE-001), deltas are serialized as Server-Sent Events on the `/sessions/:id/events` endpoint. Each delta is a JSON event with a type field.
|
|
174
|
+
|
|
175
|
+
**WebSocket (future):** for bidirectional communication, deltas flow over WebSocket with the same JSON format.
|
|
176
|
+
|
|
177
|
+
### Backpressure and Buffering
|
|
178
|
+
|
|
179
|
+
- If the client cannot render as fast as deltas arrive, a small buffer (default: 100 deltas) absorbs bursts
|
|
180
|
+
- If the buffer fills, deltas are coalesced: multiple TextDeltas merge into one larger chunk
|
|
181
|
+
- MetadataDeltas are sampled: at most one per 500ms reaches the client
|
|
182
|
+
- Coalescing preserves correctness — the final assembled message is identical regardless of delta granularity
|
|
183
|
+
|
|
184
|
+
### Error Handling During Streaming
|
|
185
|
+
|
|
186
|
+
- **LLM connection drop:** emit an ErrorPart, then Complete with `stop_reason: "cancelled"`
|
|
187
|
+
- **Tool execution failure:** emit ToolResultEnd with `is_error: true`, continue with next LLM turn
|
|
188
|
+
- **Client disconnect:** streaming continues server-side; deltas are buffered for reconnection
|
|
189
|
+
- **Rate limit:** emit MetadataDelta with rate limit info, pause, then resume streaming
|
|
190
|
+
|
|
191
|
+
## Supporting Structures
|
|
192
|
+
|
|
193
|
+
- **Message Parts Model (RISE-026)** defines the Part types that deltas assemble into
|
|
194
|
+
- **Client-Server Architecture (RISE-001)** provides SSE transport for remote streaming
|
|
195
|
+
- **Event Bus (RISE-002)** distributes deltas to all connected clients
|
|
196
|
+
- **Session Persistence (RISE-018)** stores the final assembled message and parts
|
|
197
|
+
- **Structured Logging (RISE-007)** logs streaming metrics: delta count, latency, coalescing events
|
|
198
|
+
- **Named Error System (RISE-006)** provides StreamAbortedError, DeltaParseError, BackpressureError
|
|
199
|
+
|
|
200
|
+
## Creative Advancement Scenarios
|
|
201
|
+
|
|
202
|
+
**Scenario 1 — Instant Feedback:**
|
|
203
|
+
The developer sends a complex prompt. Within 200ms, the first word appears. They immediately see the agent is on the right track — discussing the correct file and approach. Without streaming, they would have waited 15 seconds before seeing anything, wondering if the agent understood.
|
|
204
|
+
|
|
205
|
+
**Scenario 2 — Early Cancellation:**
|
|
206
|
+
The agent starts generating a response that misunderstands the task. After seeing 3 sentences of wrong-headed approach, the developer hits Ctrl+C. Generation stops, saving ~2000 tokens of wasted output. The developer rephrases and tries again — fast iteration without cost penalty.
|
|
207
|
+
|
|
208
|
+
**Scenario 3 — Progressive Tool Visualization:**
|
|
209
|
+
The agent calls `grep` to search a codebase. The ToolCallStart appears with "grep" and the search pattern. ToolResultDelta events stream matching lines as grep finds them. The developer sees results populating in real-time, understanding what the agent is finding before the search completes.
|
|
210
|
+
|
|
211
|
+
**Scenario 4 — Real-Time Cost Monitoring:**
|
|
212
|
+
During an expensive operation (large file analysis), the MetadataDelta updates show token count climbing: 1k, 5k, 10k, 15k. The developer sees costs approaching their budget. At 18k tokens, they cancel — staying within budget. Without streaming cost updates, they would have discovered the overage only after the response completed.
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# RISE-028: Multi-Provider Architecture
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/028-multi-provider-architecture.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code abstracts away the specifics of individual LLM providers behind a unified interface, enabling developers to switch between 20+ providers — OpenAI, Anthropic, Google Gemini, Mistral, Groq, XAI, and more — without changing agent definitions, tool configurations, or workflow logic. Instead of shelling out to CLI binaries with bespoke argument parsing, mia-code communicates through a common provider contract. A developer can start a session with Claude, switch mid-project to GPT for cost reasons, and later deploy with a self-hosted model — all through the same interface. The provider becomes a pluggable detail, not a structural commitment.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Structural Reality:**
|
|
13
|
+
- mia-code supports Gemini and Claude by shelling out to their respective CLI binaries (`gemini`, `claude`)
|
|
14
|
+
- Each provider integration is a custom shell script with provider-specific argument formatting
|
|
15
|
+
- Adding a new provider requires writing a new shell integration from scratch
|
|
16
|
+
- No shared interface exists — each provider has its own calling convention, output parsing, and error handling
|
|
17
|
+
- Model selection is tightly coupled to the binary name rather than a provider abstraction
|
|
18
|
+
- There is no fallback mechanism — if the configured CLI binary is unavailable, the session fails
|
|
19
|
+
- Provider capabilities (streaming, vision, function calling) are implicit, not declared
|
|
20
|
+
|
|
21
|
+
**Desired State:**
|
|
22
|
+
- A common `Provider` interface defines the contract all providers implement
|
|
23
|
+
- 20+ providers are available out of the box, each implementing the same interface
|
|
24
|
+
- Provider configuration lives in `mia-code.json` with a consistent schema
|
|
25
|
+
- Provider selection is explicit in agent config or inferred from the model ID prefix
|
|
26
|
+
- Fallback chains allow automatic failover when a provider is unavailable or rate-limited
|
|
27
|
+
- Custom providers can be added via the OpenAI-compatible API base class
|
|
28
|
+
- Provider capabilities are declared and queryable, enabling intelligent feature gating
|
|
29
|
+
|
|
30
|
+
## Desired Outcome Definition
|
|
31
|
+
|
|
32
|
+
A developer configures three providers in `mia-code.json`: Anthropic as primary, OpenAI as fallback, and a local Ollama instance for offline work. When they invoke an agent, the system resolves the model ID to the correct provider, initializes it with stored credentials, and communicates through the unified interface. If Anthropic returns a rate limit error, the system automatically falls through to OpenAI with the equivalent model. The developer sees a brief notification of the fallback but their workflow is uninterrupted.
|
|
33
|
+
|
|
34
|
+
## Natural Language Functional Description
|
|
35
|
+
|
|
36
|
+
### Provider Interface
|
|
37
|
+
|
|
38
|
+
Every provider implements this contract:
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
interface Provider {
|
|
42
|
+
id: string; // e.g. "anthropic", "openai", "groq"
|
|
43
|
+
name: string; // e.g. "Anthropic", "OpenAI", "Groq"
|
|
44
|
+
apiEndpoint: string; // base URL for API calls
|
|
45
|
+
authMethod: "api_key" | "oauth" | "custom";
|
|
46
|
+
|
|
47
|
+
initialize(config: ProviderConfig): Promise<void>;
|
|
48
|
+
chat(messages: Message[], options: ChatOptions): Promise<AssistantMessage>;
|
|
49
|
+
stream(messages: Message[], options: StreamOptions): AsyncIterable<Delta>;
|
|
50
|
+
listModels(): Promise<ModelInfo[]>;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
interface ProviderConfig {
|
|
54
|
+
apiKey?: string; // direct key or ${ENV_VAR} reference
|
|
55
|
+
baseURL?: string; // override default endpoint
|
|
56
|
+
organizationId?: string; // for multi-tenant providers
|
|
57
|
+
projectId?: string; // for scoped access (Vertex, Bedrock)
|
|
58
|
+
customHeaders?: Record<string, string>;
|
|
59
|
+
timeout?: number; // request timeout in ms (default: 120000)
|
|
60
|
+
maxRetries?: number; // retry count (default: 3)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
interface ChatOptions {
|
|
64
|
+
model: string; // model ID within this provider
|
|
65
|
+
temperature?: number;
|
|
66
|
+
maxTokens?: number;
|
|
67
|
+
tools?: ToolDefinition[];
|
|
68
|
+
systemPrompt?: string;
|
|
69
|
+
stopSequences?: string[];
|
|
70
|
+
responseFormat?: "text" | "json";
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Supported Providers
|
|
75
|
+
|
|
76
|
+
The following providers are supported with dedicated implementations:
|
|
77
|
+
|
|
78
|
+
| Provider | ID | Auth Method | Notable Capabilities |
|
|
79
|
+
|---|---|---|---|
|
|
80
|
+
| OpenAI | `openai` | api_key | GPT-4o, o1, o3, function calling, vision, JSON mode |
|
|
81
|
+
| Anthropic | `anthropic` | api_key | Claude family, extended thinking, cache control |
|
|
82
|
+
| Google Gemini API | `google` | api_key | Gemini 2.5, grounding, long context |
|
|
83
|
+
| Mistral | `mistral` | api_key | Mistral Large, code generation, function calling |
|
|
84
|
+
| Groq | `groq` | api_key | Ultra-fast inference, Llama/Mixtral hosting |
|
|
85
|
+
| XAI | `xai` | api_key | Grok models |
|
|
86
|
+
| DeepInfra | `deepinfra` | api_key | Open model hosting, competitive pricing |
|
|
87
|
+
| Cerebras | `cerebras` | api_key | Wafer-scale inference, extreme speed |
|
|
88
|
+
| Cohere | `cohere` | api_key | Command R+, RAG-optimized, reranking |
|
|
89
|
+
| Azure OpenAI | `azure` | api_key/oauth | Enterprise OpenAI, regional deployments |
|
|
90
|
+
| Google Vertex AI | `vertex` | oauth | Gemini via GCP, enterprise features |
|
|
91
|
+
| Amazon Bedrock | `bedrock` | custom | Multi-model access via AWS, IAM auth |
|
|
92
|
+
| GitHub Copilot | `copilot` | oauth | Copilot API access, GitHub-integrated auth |
|
|
93
|
+
| OpenRouter | `openrouter` | api_key | Multi-model gateway, unified billing |
|
|
94
|
+
| Together.AI | `together` | api_key | Open model hosting, fine-tuning |
|
|
95
|
+
| Custom (OpenAI-compat) | `custom` | api_key | Any OpenAI-compatible endpoint |
|
|
96
|
+
|
|
97
|
+
### Configuration Schema
|
|
98
|
+
|
|
99
|
+
Provider configuration in `mia-code.json`:
|
|
100
|
+
|
|
101
|
+
```json
|
|
102
|
+
{
|
|
103
|
+
"provider": {
|
|
104
|
+
"anthropic": {
|
|
105
|
+
"apiKey": "${ANTHROPIC_API_KEY}",
|
|
106
|
+
"baseURL": "https://api.anthropic.com"
|
|
107
|
+
},
|
|
108
|
+
"openai": {
|
|
109
|
+
"apiKey": "${OPENAI_API_KEY}"
|
|
110
|
+
},
|
|
111
|
+
"custom": {
|
|
112
|
+
"apiKey": "sk-local-...",
|
|
113
|
+
"baseURL": "http://localhost:11434/v1",
|
|
114
|
+
"name": "Local Ollama"
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Provider Resolution
|
|
121
|
+
|
|
122
|
+
When a model ID is specified (e.g. `claude-sonnet-4-20250514`), the system resolves it to a provider:
|
|
123
|
+
|
|
124
|
+
1. **Explicit provider:** agent config specifies `provider: "anthropic"` — use that provider directly
|
|
125
|
+
2. **Model prefix match:** model ID is looked up in the model registry (RISE-030) which maps models to providers
|
|
126
|
+
3. **Fallback scan:** iterate configured providers, call `listModels()`, find which provider serves this model
|
|
127
|
+
4. **Error:** if no provider serves the model, emit a `ProviderResolutionError` with suggestions
|
|
128
|
+
|
|
129
|
+
### Fallback Chains
|
|
130
|
+
|
|
131
|
+
Fallback is configured per-agent or globally:
|
|
132
|
+
|
|
133
|
+
```json
|
|
134
|
+
{
|
|
135
|
+
"fallback": ["anthropic", "openai", "custom"],
|
|
136
|
+
"fallbackTriggers": ["rate_limit", "auth_failure", "server_error"]
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
When the primary provider returns a triggering error:
|
|
141
|
+
1. Log the failure with provider ID, error type, and model
|
|
142
|
+
2. Select the next provider in the fallback chain
|
|
143
|
+
3. Map the model to an equivalent on the fallback provider (e.g. `claude-sonnet-4-20250514` → `gpt-4o`)
|
|
144
|
+
4. Retry the request on the fallback provider
|
|
145
|
+
5. Notify the developer of the fallback via a status message
|
|
146
|
+
|
|
147
|
+
### Custom Provider Registration
|
|
148
|
+
|
|
149
|
+
Developers can register custom providers for OpenAI-compatible endpoints:
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
interface CustomProviderConfig extends ProviderConfig {
|
|
153
|
+
id: string; // unique custom provider ID
|
|
154
|
+
name: string; // display name
|
|
155
|
+
models?: ModelInfo[]; // manually declared model list
|
|
156
|
+
capabilities?: string[]; // e.g. ["streaming", "function_calling"]
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Custom providers inherit the OpenAI-compatible base implementation and only need endpoint and auth configuration.
|
|
161
|
+
|
|
162
|
+
## Supporting Structures
|
|
163
|
+
|
|
164
|
+
- **Provider Authentication (RISE-029)** handles credential management for each provider
|
|
165
|
+
- **Model Registry (RISE-030)** maps model IDs to providers and capabilities
|
|
166
|
+
- **Provider Transform Pipeline (RISE-032)** normalizes request/response formats per provider
|
|
167
|
+
- **Provider SDK Abstraction (RISE-033)** wraps low-level API communication
|
|
168
|
+
- **Agent Definition Config (RISE-010)** references providers in agent model selection
|
|
169
|
+
- **Named Error System (RISE-006)** provides ProviderResolutionError, ProviderUnavailableError, FallbackExhaustedError
|
|
170
|
+
- **Structured Logging (RISE-007)** logs provider selection, fallback events, and latency metrics
|
|
171
|
+
|
|
172
|
+
## Creative Advancement Scenarios
|
|
173
|
+
|
|
174
|
+
**Scenario 1 — Seamless Provider Switch:**
|
|
175
|
+
A developer has been using Claude for a complex refactoring session. Anthropic's API goes down for maintenance. mia-code automatically falls back to OpenAI, mapping `claude-sonnet-4-20250514` to `gpt-4o`. The developer sees "⚠ Switched to OpenAI (Anthropic unavailable)" and continues working without restarting the session or reconfiguring anything.
|
|
176
|
+
|
|
177
|
+
**Scenario 2 — Cost-Optimized Agent Hierarchy:**
|
|
178
|
+
A developer configures the main coding agent with `claude-sonnet-4-20250514` (high capability) and the explore sub-agent with `llama-3.1-70b` on Groq (fast and cheap). Each agent uses its designated provider through the same interface. The developer gets quality where it matters and speed where it doesn't — all through provider configuration, not code changes.
|
|
179
|
+
|
|
180
|
+
**Scenario 3 — Air-Gapped Development:**
|
|
181
|
+
A developer on a classified network configures a custom provider pointing to a self-hosted vLLM instance at `http://internal-gpu:8000/v1`. They register it as an OpenAI-compatible custom provider with their organization's fine-tuned model. mia-code treats it identically to any cloud provider — same tools, same streaming, same session management.
|
|
182
|
+
|
|
183
|
+
**Scenario 4 — Provider Evaluation:**
|
|
184
|
+
A team wants to compare Claude vs GPT vs Gemini for their codebase. They configure all three providers and run the same set of tasks, switching the agent's model between runs. Cost tracking (RISE-031) records per-provider expenses. After a week, they have concrete data on quality, speed, and cost per provider — enabling an informed decision.
|