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,145 @@
|
|
|
1
|
+
# RISE-087: Permission Modes
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/087-permission-modes.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code provides three distinct permission action modes that govern how each rule resolves at runtime. "Allow" is silent trust. "Deny" is silent refusal. "Ask" is a conversation — the agent pauses, presents details, and the user decides. Each mode serves a different risk profile. Together they let developers build nuanced permission policies where safe operations flow freely, dangerous ones are blocked, and everything in between gets human judgment.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code has only two effective modes: full trust (`--yolo`) or full prompting (default)
|
|
14
|
+
- There is no "deny" mode — every action either proceeds or is prompted
|
|
15
|
+
- When prompted, the user can only say yes or no for that single occurrence
|
|
16
|
+
- No mechanism to escalate a single "yes" into a persistent "always allow" rule
|
|
17
|
+
- No mechanism to escalate a single "no" into a persistent "never allow" rule
|
|
18
|
+
- The agent receives no structured feedback when an action is denied — it may retry indefinitely
|
|
19
|
+
|
|
20
|
+
**Desired State:**
|
|
21
|
+
- Three modes: "allow" (silent proceed), "deny" (silent block with reason), "ask" (interactive prompt)
|
|
22
|
+
- "Ask" mode offers five response options: y, n, always, never, session
|
|
23
|
+
- "Always" and "never" responses create persistent session-scoped rules (RISE-086 layer 5)
|
|
24
|
+
- "Session" response allows for the rest of the session without creating a permanent rule
|
|
25
|
+
- Deny mode sends a structured denial message to the agent so it can adapt
|
|
26
|
+
- The agent gracefully handles denials — suggests alternatives or asks the user to adjust permissions
|
|
27
|
+
|
|
28
|
+
## Desired Outcome Definition
|
|
29
|
+
|
|
30
|
+
Each permission rule action resolves through one of three modes. Allow and deny are non-interactive. Ask pauses execution for user input and supports five response types that range from one-time decisions to persistent session rules. The agent receives clear feedback on denials and can adapt its behavior.
|
|
31
|
+
|
|
32
|
+
## Natural Language Functional Description
|
|
33
|
+
|
|
34
|
+
### Allow Mode
|
|
35
|
+
|
|
36
|
+
When a rule resolves to `"allow"`:
|
|
37
|
+
|
|
38
|
+
1. The action proceeds immediately with no user interaction
|
|
39
|
+
2. No visual indicator is shown (silent operation)
|
|
40
|
+
3. The tool executes and returns its result to the agent
|
|
41
|
+
4. Logging records the permission check: `permission.allowed: write src/foo.test.ts (rule #3, project)`
|
|
42
|
+
|
|
43
|
+
Allow mode is appropriate for: reading files, running safe commands (linters, tests), writing to well-understood paths, asking questions.
|
|
44
|
+
|
|
45
|
+
### Deny Mode
|
|
46
|
+
|
|
47
|
+
When a rule resolves to `"deny"`:
|
|
48
|
+
|
|
49
|
+
1. The action is blocked immediately with no user interaction
|
|
50
|
+
2. The agent receives a structured denial message:
|
|
51
|
+
```
|
|
52
|
+
Permission denied: [tool] on [path/command]
|
|
53
|
+
Reason: [rule description from matching rule]
|
|
54
|
+
Source: [rule source layer]
|
|
55
|
+
```
|
|
56
|
+
3. The tool returns an error result, not a thrown exception
|
|
57
|
+
4. The agent should interpret the denial and adapt — suggest alternatives, ask the user, or proceed differently
|
|
58
|
+
5. Logging records: `permission.denied: bash "rm -rf /" (rule #4, global)`
|
|
59
|
+
|
|
60
|
+
Deny messages are designed to be informative. The agent receives enough context to understand *why* the action was blocked and *what rule* caused it. This enables the agent to explain the denial to the user or try an alternative approach.
|
|
61
|
+
|
|
62
|
+
### Ask Mode
|
|
63
|
+
|
|
64
|
+
When a rule resolves to `"ask"`:
|
|
65
|
+
|
|
66
|
+
1. Execution pauses
|
|
67
|
+
2. The user is presented with the action details:
|
|
68
|
+
```
|
|
69
|
+
🔐 Permission required: write
|
|
70
|
+
Target: src/components/Header.tsx
|
|
71
|
+
Content preview: [first 5 lines of content]
|
|
72
|
+
|
|
73
|
+
Allow? (y)es / (n)o / (a)lways / ne(v)er / (s)ession
|
|
74
|
+
```
|
|
75
|
+
3. The user responds with one of five options:
|
|
76
|
+
|
|
77
|
+
| Response | Key | Behavior |
|
|
78
|
+
|-----------|-----|----------|
|
|
79
|
+
| Yes | `y` | Allow this one action, continue. No rule created. |
|
|
80
|
+
| No | `n` | Deny this one action, continue. No rule created. Agent receives denial message. |
|
|
81
|
+
| Always | `a` | Allow this action AND create a session-scoped allow rule for this permission+pattern. Future matching actions auto-allow. |
|
|
82
|
+
| Never | `v` | Deny this action AND create a session-scoped deny rule for this permission+pattern. Future matching actions auto-deny. |
|
|
83
|
+
| Session | `s` | Allow this action for the rest of the session. Creates a temporary allow rule that is discarded on session end. Functionally similar to "always" but semantically different — it signals "I trust this for now." |
|
|
84
|
+
|
|
85
|
+
### Always / Never Rule Creation
|
|
86
|
+
|
|
87
|
+
When a user responds "always" to a write permission on `src/**/*.ts`:
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{"permission": "write", "pattern": "src/**/*.ts", "action": "allow", "source": "session"}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
This rule is prepended to the session layer (RISE-086). All subsequent writes to TypeScript files under `src/` will silently allow without prompting.
|
|
94
|
+
|
|
95
|
+
When a user responds "never" to a bash permission on `rm *`:
|
|
96
|
+
|
|
97
|
+
```json
|
|
98
|
+
{"permission": "bash", "pattern": "rm *", "action": "deny", "source": "session"}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
All subsequent bash commands matching `rm *` will silently deny.
|
|
102
|
+
|
|
103
|
+
### Agent Denial Handling
|
|
104
|
+
|
|
105
|
+
When the agent receives a denial, it should:
|
|
106
|
+
|
|
107
|
+
1. Acknowledge the denial in its response to the user
|
|
108
|
+
2. Explain what it was trying to do and why it was blocked
|
|
109
|
+
3. Suggest alternatives: different approach, different path, or ask the user to adjust permissions
|
|
110
|
+
4. Not retry the same denied action immediately — this wastes tokens and annoys users
|
|
111
|
+
|
|
112
|
+
Example agent response after denial:
|
|
113
|
+
> I tried to delete the old config file but was blocked by a permission rule. I can either leave it in place or you can adjust permissions with `/permissions`. Would you like me to try a different approach?
|
|
114
|
+
|
|
115
|
+
### Visual Presentation
|
|
116
|
+
|
|
117
|
+
The ask prompt is rendered with clear formatting:
|
|
118
|
+
|
|
119
|
+
- 🔐 emoji prefix for visual distinctiveness
|
|
120
|
+
- Permission type and target are highlighted
|
|
121
|
+
- For file writes, a content preview shows the first few lines
|
|
122
|
+
- For bash commands, the full command string is shown
|
|
123
|
+
- Response options are shown with keyboard shortcuts
|
|
124
|
+
|
|
125
|
+
## Supporting Structures
|
|
126
|
+
|
|
127
|
+
- **Permission Rules (RISE-084)** defines the rule objects that specify actions
|
|
128
|
+
- **Permission Glob Patterns (RISE-085)** defines pattern matching that scopes rules
|
|
129
|
+
- **Permission Merging (RISE-086)** defines how "always"/"never" responses become session rules
|
|
130
|
+
- **Event Bus (RISE-002)** emits permission events for external clients (RISE-090, RISE-091)
|
|
131
|
+
- **Named Error System (RISE-006)** provides PermissionDeniedError for deny mode
|
|
132
|
+
|
|
133
|
+
## Creative Advancement Scenarios
|
|
134
|
+
|
|
135
|
+
**Scenario 1 — Progressive Trust Building:**
|
|
136
|
+
A developer starts with all "ask" defaults. The agent requests write access to a test file — the developer responds "always." Next, a bash command for `npm test` — "always." Over a session, the developer builds up a set of trusted operations. The ask prompts become rarer as trust accumulates.
|
|
137
|
+
|
|
138
|
+
**Scenario 2 — Guarded Exploration:**
|
|
139
|
+
The agent tries to read `.env` — denied by a global rule. The agent reports: "I can't read .env due to permission rules. Could you paste the relevant environment variable values?" The developer shares only what's needed. Security is maintained through structured denial and agent adaptation.
|
|
140
|
+
|
|
141
|
+
**Scenario 3 — Session-Scoped Experimentation:**
|
|
142
|
+
A developer responds "session" to a write prompt. For the rest of this session, similar writes proceed silently. On the next session, the permission resets to "ask." This lets developers experiment with trust levels without permanent consequences.
|
|
143
|
+
|
|
144
|
+
**Scenario 4 — Remote Permission Approval:**
|
|
145
|
+
A developer drives mia-code remotely via the HTTP API (RISE-088). The ask prompt is serialized as a permission event over WebSocket (RISE-090). The developer approves from their phone. The agent continues on the workstation. Permission modes work identically regardless of interface.
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# RISE-088: HTTP API Server
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/088-http-api-server.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code exposes its full capabilities through an HTTP API server, enabling any program — web UIs, desktop apps, mobile clients, CI scripts, custom bots — to create sessions, send messages, manage tools, and control permissions over standard HTTP. The server transforms mia-code from a terminal-only tool into a platform that any interface can drive. A developer starts the server on their workstation and connects from anywhere.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code runs exclusively as a CLI process — interaction requires a terminal
|
|
14
|
+
- No HTTP endpoints exist; external programs cannot interact with a running agent
|
|
15
|
+
- Building a web UI or desktop app requires reimplementing the entire agent stack
|
|
16
|
+
- CI/CD integration means shelling out to the CLI and parsing stdout — fragile and limited
|
|
17
|
+
- Multi-client access to the same session is impossible
|
|
18
|
+
- No authentication mechanism exists for remote access
|
|
19
|
+
|
|
20
|
+
**Desired State:**
|
|
21
|
+
- A lightweight HTTP server exposes mia-code's capabilities as JSON endpoints
|
|
22
|
+
- Endpoints are organized by domain: sessions, messages, tools, config, permissions, projects
|
|
23
|
+
- The server starts via `mia-code serve --port 4096` or auto-starts in background mode
|
|
24
|
+
- Optional authentication via password protects remote access
|
|
25
|
+
- CORS is configurable for web client access
|
|
26
|
+
- Standardized error responses enable reliable client error handling
|
|
27
|
+
- The server is the foundation for web UI, desktop app, mobile app, and API automation
|
|
28
|
+
|
|
29
|
+
## Desired Outcome Definition
|
|
30
|
+
|
|
31
|
+
Running `mia-code serve` starts an HTTP server that accepts JSON requests and returns JSON responses. Any HTTP client can create sessions, send messages, list tools, read configuration, and manage permissions. The server is lightweight, secure by default, and designed for both local and remote access.
|
|
32
|
+
|
|
33
|
+
## Natural Language Functional Description
|
|
34
|
+
|
|
35
|
+
### Server Startup
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
mia-code serve # start on default port 4096
|
|
39
|
+
mia-code serve --port 8080 # custom port
|
|
40
|
+
mia-code serve --password mysecret # require authentication
|
|
41
|
+
mia-code serve --host 0.0.0.0 # bind to all interfaces (for remote access)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The server binds to `127.0.0.1` by default (localhost only). Use `--host 0.0.0.0` for remote access. Environment variable `MIA_CODE_SERVER_PASSWORD` sets the password without command-line exposure.
|
|
45
|
+
|
|
46
|
+
### Framework Choice
|
|
47
|
+
|
|
48
|
+
The server uses Hono — a lightweight, fast HTTP framework with TypeScript-first design. Hono provides routing, middleware, and request validation with minimal overhead. Alternative: Express if Hono proves unsuitable.
|
|
49
|
+
|
|
50
|
+
### API Endpoints
|
|
51
|
+
|
|
52
|
+
**Sessions** (`/api/session`):
|
|
53
|
+
- `GET /api/session` — list all sessions (pagination, filtering by status)
|
|
54
|
+
- `POST /api/session` — create a new session `{title, directory, model?}`
|
|
55
|
+
- `GET /api/session/:id` — get session details with message history
|
|
56
|
+
- `DELETE /api/session/:id` — archive a session
|
|
57
|
+
- `PATCH /api/session/:id` — update session metadata (title, model)
|
|
58
|
+
|
|
59
|
+
**Messages** (`/api/message`):
|
|
60
|
+
- `POST /api/session/:id/message` — send a user message `{content: string}`
|
|
61
|
+
- `GET /api/session/:id/message` — list messages (pagination, cursor-based)
|
|
62
|
+
- `GET /api/session/:id/message/:msgId` — get a specific message
|
|
63
|
+
|
|
64
|
+
**Tools** (`/api/tool`):
|
|
65
|
+
- `GET /api/tool` — list available tools with descriptions and schemas
|
|
66
|
+
- `POST /api/tool/:name/execute` — execute a tool directly `{parameters: object}`
|
|
67
|
+
- `GET /api/tool/:name` — get tool details and parameter schema
|
|
68
|
+
|
|
69
|
+
**Configuration** (`/api/config`):
|
|
70
|
+
- `GET /api/config` — get current effective configuration
|
|
71
|
+
- `PATCH /api/config` — update configuration values `{key: value}`
|
|
72
|
+
|
|
73
|
+
**Permissions** (`/api/permission`):
|
|
74
|
+
- `GET /api/permission` — get effective merged permission rules
|
|
75
|
+
- `POST /api/permission/respond` — respond to a pending permission prompt `{requestId, response}`
|
|
76
|
+
- `POST /api/permission/reset` — reset session-scoped permissions
|
|
77
|
+
|
|
78
|
+
**Project** (`/api/project`):
|
|
79
|
+
- `GET /api/project` — get project information (root, git status, file count)
|
|
80
|
+
|
|
81
|
+
**System** (`/api`):
|
|
82
|
+
- `GET /api/health` — server health: uptime, version, active sessions
|
|
83
|
+
- `GET /api/openapi.json` — OpenAPI specification (RISE-089)
|
|
84
|
+
|
|
85
|
+
### Authentication
|
|
86
|
+
|
|
87
|
+
When a password is configured, all requests must include it:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
Authorization: Basic base64(username:password)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Username can be anything (conventionally "mia-code"). Unauthenticated requests receive `401 Unauthorized`. The `/api/health` endpoint is always public (allows connection testing).
|
|
94
|
+
|
|
95
|
+
### Error Responses
|
|
96
|
+
|
|
97
|
+
All errors follow a consistent structure:
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"error": {
|
|
102
|
+
"name": "SessionNotFoundError",
|
|
103
|
+
"message": "Session abc-123 does not exist",
|
|
104
|
+
"code": 404
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Error names map to the Named Error System (RISE-006). HTTP status codes: 400 (bad request), 401 (unauthorized), 404 (not found), 422 (validation error), 500 (internal error).
|
|
110
|
+
|
|
111
|
+
### CORS Configuration
|
|
112
|
+
|
|
113
|
+
CORS headers are configurable in the server config:
|
|
114
|
+
|
|
115
|
+
```json
|
|
116
|
+
{
|
|
117
|
+
"server": {
|
|
118
|
+
"cors": {
|
|
119
|
+
"origins": ["http://localhost:3000", "https://mia-code.app"],
|
|
120
|
+
"methods": ["GET", "POST", "PATCH", "DELETE"],
|
|
121
|
+
"credentials": true
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Default: allow `localhost` origins only.
|
|
128
|
+
|
|
129
|
+
### Request Validation
|
|
130
|
+
|
|
131
|
+
All request bodies are validated against Zod schemas. Invalid requests receive a 422 response with detailed validation errors:
|
|
132
|
+
|
|
133
|
+
```json
|
|
134
|
+
{
|
|
135
|
+
"error": {
|
|
136
|
+
"name": "ValidationError",
|
|
137
|
+
"message": "Invalid request body",
|
|
138
|
+
"code": 422,
|
|
139
|
+
"details": [{"path": "content", "message": "Required"}]
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Supporting Structures
|
|
145
|
+
|
|
146
|
+
- **Client-Server Architecture (RISE-001)** provides the architectural foundation this server implements
|
|
147
|
+
- **OpenAPI Spec Generation (RISE-089)** auto-generates API documentation from these endpoints
|
|
148
|
+
- **WebSocket Support (RISE-090)** adds real-time bidirectional communication alongside HTTP
|
|
149
|
+
- **SSE Streaming (RISE-091)** adds server-sent events for message streaming
|
|
150
|
+
- **mDNS Discovery (RISE-092)** enables automatic discovery of the running server
|
|
151
|
+
- **Zod Schema Validation (RISE-005)** validates all request/response payloads
|
|
152
|
+
|
|
153
|
+
## Creative Advancement Scenarios
|
|
154
|
+
|
|
155
|
+
**Scenario 1 — Web UI Dashboard:**
|
|
156
|
+
A React web app connects to the HTTP API. It lists sessions in a sidebar, shows message history in the main panel, and sends new messages via POST. The web app provides a richer interface than the terminal — syntax highlighting, file previews, tool execution visualizations.
|
|
157
|
+
|
|
158
|
+
**Scenario 2 — CI/CD Agent:**
|
|
159
|
+
A GitHub Actions workflow starts the server, sends a prompt via `curl -X POST /api/session/:id/message`, and polls for the response. The agent reviews a PR diff and posts its analysis as a comment. No terminal, no human — pure API automation.
|
|
160
|
+
|
|
161
|
+
**Scenario 3 — Multi-Client Collaboration:**
|
|
162
|
+
Two developers connect to the same server. One drives the agent from a web UI, the other monitors from a terminal client. Both see the same messages in real-time via SSE (RISE-091). Permission prompts route to whichever client responds first.
|
|
163
|
+
|
|
164
|
+
**Scenario 4 — Remote Workstation:**
|
|
165
|
+
A developer runs `mia-code serve --host 0.0.0.0 --password secret` on their powerful desktop. They connect from a laptop on the same network via `http://desktop:4096/api`. The agent runs on the desktop's 64GB RAM while the developer works from a lightweight notebook.
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# RISE-089: OpenAPI Spec Generation
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/089-openapi-spec-generation.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code auto-generates an OpenAPI 3.0 specification from its HTTP API routes, turning route definitions into living documentation. Every endpoint, every request body, every response shape is derived from the same Zod schemas that validate runtime data. Documentation cannot drift from implementation because they share a single source of truth. The spec enables client SDK generation, Swagger UI exploration, and automated testing — all without manual documentation effort.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code has no HTTP API and therefore no API documentation
|
|
14
|
+
- When an API is added (RISE-088), documentation will need to be written and maintained
|
|
15
|
+
- Manual API documentation drifts from implementation — endpoints change, docs stay stale
|
|
16
|
+
- No mechanism exists to generate client SDKs for TypeScript, Python, or other languages
|
|
17
|
+
- Zod schemas exist for internal validation but are not exposed as machine-readable contracts
|
|
18
|
+
|
|
19
|
+
**Desired State:**
|
|
20
|
+
- Each API route is annotated with metadata: path, method, request schema, response schema, description, tags
|
|
21
|
+
- Zod schemas are automatically converted to JSON Schema for OpenAPI compatibility
|
|
22
|
+
- The OpenAPI specification is generated at build time and also served live at `/api/openapi.json`
|
|
23
|
+
- Swagger UI is available at `/api/docs` for interactive API exploration
|
|
24
|
+
- The spec is the source for auto-generating the TypeScript SDK (RISE-093)
|
|
25
|
+
- API versioning tracks mia-code's version number
|
|
26
|
+
|
|
27
|
+
## Desired Outcome Definition
|
|
28
|
+
|
|
29
|
+
The HTTP API server serves a complete OpenAPI 3.0 specification at `/api/openapi.json`. The spec is auto-generated from route definitions and Zod schemas. Developers and tools can consume it for documentation, SDK generation, testing, and validation. No manual spec maintenance is needed.
|
|
30
|
+
|
|
31
|
+
## Natural Language Functional Description
|
|
32
|
+
|
|
33
|
+
### Route Annotation
|
|
34
|
+
|
|
35
|
+
Each API route carries metadata alongside its handler:
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
const createSession = route({
|
|
39
|
+
method: "POST",
|
|
40
|
+
path: "/api/session",
|
|
41
|
+
operationId: "createSession",
|
|
42
|
+
summary: "Create a new agent session",
|
|
43
|
+
description: "Creates a new session with the specified configuration. Returns the session ID and initial state.",
|
|
44
|
+
tags: ["sessions"],
|
|
45
|
+
request: z.object({
|
|
46
|
+
title: z.string().optional(),
|
|
47
|
+
directory: z.string(),
|
|
48
|
+
model: z.string().optional(),
|
|
49
|
+
}),
|
|
50
|
+
responses: {
|
|
51
|
+
200: z.object({
|
|
52
|
+
id: z.string(),
|
|
53
|
+
title: z.string(),
|
|
54
|
+
createdAt: z.string().datetime(),
|
|
55
|
+
}),
|
|
56
|
+
400: ErrorResponseSchema,
|
|
57
|
+
401: ErrorResponseSchema,
|
|
58
|
+
},
|
|
59
|
+
})
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Zod-to-JSON-Schema Conversion
|
|
63
|
+
|
|
64
|
+
Zod schemas are converted to JSON Schema using `zod-to-json-schema` or an equivalent library. Conversion handles:
|
|
65
|
+
|
|
66
|
+
- Primitive types: `z.string()` → `{"type": "string"}`
|
|
67
|
+
- Objects: `z.object({...})` → `{"type": "object", "properties": {...}}`
|
|
68
|
+
- Arrays: `z.array(z.string())` → `{"type": "array", "items": {"type": "string"}}`
|
|
69
|
+
- Enums: `z.enum(["a", "b"])` → `{"type": "string", "enum": ["a", "b"]}`
|
|
70
|
+
- Optional fields: `z.string().optional()` → property not in `required` array
|
|
71
|
+
- Descriptions: `z.string().describe("User's name")` → `{"description": "User's name"}`
|
|
72
|
+
- Unions, intersections, and refinements mapped to appropriate JSON Schema constructs
|
|
73
|
+
|
|
74
|
+
### OpenAPI Spec Structure
|
|
75
|
+
|
|
76
|
+
The generated specification follows OpenAPI 3.0:
|
|
77
|
+
|
|
78
|
+
```yaml
|
|
79
|
+
openapi: "3.0.3"
|
|
80
|
+
info:
|
|
81
|
+
title: "mia-code API"
|
|
82
|
+
version: "1.0.0" # matches mia-code package version
|
|
83
|
+
description: "HTTP API for programmatic control of mia-code"
|
|
84
|
+
servers:
|
|
85
|
+
- url: "http://localhost:4096"
|
|
86
|
+
paths:
|
|
87
|
+
/api/session:
|
|
88
|
+
post:
|
|
89
|
+
operationId: createSession
|
|
90
|
+
tags: [sessions]
|
|
91
|
+
summary: Create a new agent session
|
|
92
|
+
requestBody:
|
|
93
|
+
content:
|
|
94
|
+
application/json:
|
|
95
|
+
schema: { ... } # from Zod
|
|
96
|
+
responses:
|
|
97
|
+
"200": { ... } # from Zod
|
|
98
|
+
"400": { ... }
|
|
99
|
+
components:
|
|
100
|
+
schemas:
|
|
101
|
+
Session: { ... }
|
|
102
|
+
Message: { ... }
|
|
103
|
+
Error: { ... }
|
|
104
|
+
securitySchemes:
|
|
105
|
+
basicAuth:
|
|
106
|
+
type: http
|
|
107
|
+
scheme: basic
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Tags
|
|
111
|
+
|
|
112
|
+
Tags group endpoints by domain for organized documentation:
|
|
113
|
+
|
|
114
|
+
| Tag | Endpoints |
|
|
115
|
+
|--------------|------------------------------|
|
|
116
|
+
| sessions | `/api/session/*` |
|
|
117
|
+
| messages | `/api/session/:id/message/*` |
|
|
118
|
+
| tools | `/api/tool/*` |
|
|
119
|
+
| config | `/api/config/*` |
|
|
120
|
+
| permissions | `/api/permission/*` |
|
|
121
|
+
| project | `/api/project/*` |
|
|
122
|
+
| system | `/api/health`, `/api/openapi.json` |
|
|
123
|
+
|
|
124
|
+
### Serving the Spec
|
|
125
|
+
|
|
126
|
+
- `GET /api/openapi.json` — returns the generated OpenAPI spec as JSON
|
|
127
|
+
- `GET /api/docs` — serves Swagger UI pointed at the spec (optional, dev mode only)
|
|
128
|
+
- Build-time generation: `mia-code build:openapi` writes the spec to `dist/openapi.json`
|
|
129
|
+
|
|
130
|
+
### Versioning
|
|
131
|
+
|
|
132
|
+
The API version in the spec matches the mia-code package version from `package.json`. Breaking API changes increment the major version. The version is also included in response headers: `X-MiaCode-Version: 1.0.0`.
|
|
133
|
+
|
|
134
|
+
### Response Schemas
|
|
135
|
+
|
|
136
|
+
Every endpoint defines response schemas for common status codes:
|
|
137
|
+
|
|
138
|
+
- `200` — success response with typed body
|
|
139
|
+
- `400` — bad request (malformed input)
|
|
140
|
+
- `401` — unauthorized (missing or invalid credentials)
|
|
141
|
+
- `404` — resource not found
|
|
142
|
+
- `422` — validation error (input fails schema validation)
|
|
143
|
+
- `500` — internal server error
|
|
144
|
+
|
|
145
|
+
## Supporting Structures
|
|
146
|
+
|
|
147
|
+
- **HTTP API Server (RISE-088)** defines the routes this spec documents
|
|
148
|
+
- **Zod Schema Validation (RISE-005)** provides the schemas converted to JSON Schema
|
|
149
|
+
- **JavaScript SDK (RISE-093)** is auto-generated from this OpenAPI spec
|
|
150
|
+
- **Named Error System (RISE-006)** defines the error response shapes documented in the spec
|
|
151
|
+
|
|
152
|
+
## Creative Advancement Scenarios
|
|
153
|
+
|
|
154
|
+
**Scenario 1 — Swagger UI Exploration:**
|
|
155
|
+
A developer visits `http://localhost:4096/api/docs` and sees all endpoints organized by tag. They expand "sessions," click "Create Session," fill in parameters, and hit "Try it out." The API responds with a new session. Documentation and testing in one interface.
|
|
156
|
+
|
|
157
|
+
**Scenario 2 — SDK Generation Pipeline:**
|
|
158
|
+
A CI pipeline runs `mia-code build:openapi`, then feeds the spec to `openapi-typescript` to generate type definitions. The generated types are published as `@mia-code/sdk`. Any breaking API change triggers a type error in SDK consumers — drift is impossible.
|
|
159
|
+
|
|
160
|
+
**Scenario 3 — Third-Party Integration:**
|
|
161
|
+
A developer imports the OpenAPI spec into Postman. All endpoints appear as a collection with example request bodies pre-filled from schemas. They build an integration test suite against the live API using the imported collection.
|
|
162
|
+
|
|
163
|
+
**Scenario 4 — Contract Testing:**
|
|
164
|
+
The OpenAPI spec serves as a contract. Integration tests validate that every endpoint returns responses matching their declared schemas. If a handler returns an undocumented field or omits a required one, the test fails. The spec is both documentation and test oracle.
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# RISE-090: WebSocket Support
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/090-websocket-support.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code provides a WebSocket connection for real-time bidirectional communication between the server and clients. While HTTP endpoints handle request-response operations, the WebSocket channel carries live streaming data — message deltas as the agent thinks, tool execution updates, permission requests that need immediate user response, and session state changes. The WebSocket makes remote driving feel as responsive as sitting at the terminal.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code renders output directly to the terminal — there is no streaming protocol
|
|
14
|
+
- Agent responses appear character-by-character via ora spinners and chalk formatting, tightly coupled to stdout
|
|
15
|
+
- No mechanism exists for a remote client to receive real-time updates from a running agent
|
|
16
|
+
- Permission prompts are blocking terminal reads — they cannot be routed to a remote client
|
|
17
|
+
- Tool execution progress is visible only in the terminal that started the process
|
|
18
|
+
|
|
19
|
+
**Desired State:**
|
|
20
|
+
- A WebSocket endpoint at `ws://localhost:4096/ws` accepts client connections
|
|
21
|
+
- Connected clients receive real-time events: message deltas, tool updates, permission requests, cost data
|
|
22
|
+
- Clients send messages, permission responses, and cancel signals over the same connection
|
|
23
|
+
- Multiple clients can connect simultaneously — all receive the same events
|
|
24
|
+
- The protocol uses typed JSON messages with clear event categorization
|
|
25
|
+
- Connection health is maintained via ping/pong heartbeats
|
|
26
|
+
|
|
27
|
+
## Desired Outcome Definition
|
|
28
|
+
|
|
29
|
+
A client opens a WebSocket connection to the mia-code server and receives typed JSON events in real-time as the agent processes messages. The same connection carries client-to-server messages like user input and permission responses. The experience is instantaneous, bidirectional, and multiplexed across clients.
|
|
30
|
+
|
|
31
|
+
## Natural Language Functional Description
|
|
32
|
+
|
|
33
|
+
### Connection Lifecycle
|
|
34
|
+
|
|
35
|
+
1. **Connect**: Client opens WebSocket to `ws://localhost:4096/ws`
|
|
36
|
+
2. **Authenticate**: If password configured, client sends `{type: "auth", data: {password: "..."}}`
|
|
37
|
+
3. **Subscribe**: Client sends `{type: "subscribe", data: {sessionId: "..."}}`
|
|
38
|
+
4. **Receive events**: Server pushes typed events as they occur
|
|
39
|
+
5. **Send messages**: Client sends user messages, permission responses, cancel signals
|
|
40
|
+
6. **Disconnect**: Either side closes the connection; client can reconnect at any time
|
|
41
|
+
|
|
42
|
+
### Message Protocol
|
|
43
|
+
|
|
44
|
+
All messages follow a uniform structure:
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
interface WebSocketMessage {
|
|
48
|
+
type: string // event type identifier
|
|
49
|
+
data: object // typed payload
|
|
50
|
+
timestamp: string // ISO 8601 timestamp
|
|
51
|
+
sessionId?: string // session scope (absent for system messages)
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Server → Client Events
|
|
56
|
+
|
|
57
|
+
| Event Type | Payload | Description |
|
|
58
|
+
|-----------------------|------------------------------------------------|------------------------------------|
|
|
59
|
+
| `message.start` | `{messageId, role}` | Agent begins generating a response |
|
|
60
|
+
| `message.delta` | `{messageId, content, index}` | Streaming text chunk |
|
|
61
|
+
| `message.complete` | `{messageId, content, usage}` | Agent finished, full response |
|
|
62
|
+
| `tool.start` | `{toolName, parameters, toolCallId}` | Tool execution begins |
|
|
63
|
+
| `tool.result` | `{toolCallId, result, duration}` | Tool execution completed |
|
|
64
|
+
| `permission.request` | `{requestId, permission, target, preview}` | Permission prompt needs response |
|
|
65
|
+
| `session.updated` | `{session}` | Session metadata changed |
|
|
66
|
+
| `cost.updated` | `{sessionCost, totalCost, tokens}` | Token usage and cost update |
|
|
67
|
+
| `error` | `{name, message, code}` | Error occurred during processing |
|
|
68
|
+
| `heartbeat` | `{}` | Keep-alive ping |
|
|
69
|
+
|
|
70
|
+
### Client → Server Messages
|
|
71
|
+
|
|
72
|
+
| Message Type | Payload | Description |
|
|
73
|
+
|-----------------------|------------------------------------------------|------------------------------------|
|
|
74
|
+
| `auth` | `{password}` | Authenticate connection |
|
|
75
|
+
| `subscribe` | `{sessionId}` | Subscribe to session events |
|
|
76
|
+
| `unsubscribe` | `{sessionId}` | Unsubscribe from session |
|
|
77
|
+
| `message.send` | `{sessionId, content}` | Send a user message |
|
|
78
|
+
| `permission.respond` | `{requestId, response}` | Respond to permission prompt |
|
|
79
|
+
| `cancel` | `{sessionId}` | Cancel current agent operation |
|
|
80
|
+
|
|
81
|
+
### Multi-Client Support
|
|
82
|
+
|
|
83
|
+
Multiple clients can connect to the same server simultaneously:
|
|
84
|
+
|
|
85
|
+
- All clients subscribed to a session receive the same events
|
|
86
|
+
- Any client can send a user message — messages are queued and processed in order
|
|
87
|
+
- Permission requests are broadcast to all clients — the first response wins
|
|
88
|
+
- Client disconnect does not affect other clients or the running agent
|
|
89
|
+
- Each client maintains its own subscription state
|
|
90
|
+
|
|
91
|
+
### Heartbeat Protocol
|
|
92
|
+
|
|
93
|
+
- Server sends `{type: "heartbeat"}` every 30 seconds
|
|
94
|
+
- Client should respond with a WebSocket pong frame
|
|
95
|
+
- If no pong received within 10 seconds, server considers client disconnected
|
|
96
|
+
- Client should reconnect if no heartbeat received within 60 seconds
|
|
97
|
+
- Heartbeat interval configurable: `{"server": {"heartbeatInterval": 30000}}`
|
|
98
|
+
|
|
99
|
+
### Authentication Flow
|
|
100
|
+
|
|
101
|
+
When a server password is configured:
|
|
102
|
+
|
|
103
|
+
1. Client connects via WebSocket
|
|
104
|
+
2. Client sends `{type: "auth", data: {password: "secret"}}`
|
|
105
|
+
3. Server responds with `{type: "auth.success"}` or `{type: "auth.failed", data: {message: "Invalid password"}}`
|
|
106
|
+
4. Unauthenticated clients receive no events and cannot send messages
|
|
107
|
+
5. Authentication is per-connection — reconnections must re-authenticate
|
|
108
|
+
|
|
109
|
+
### Error Handling
|
|
110
|
+
|
|
111
|
+
- Malformed messages receive `{type: "error", data: {message: "Invalid message format"}}`
|
|
112
|
+
- Messages to non-existent sessions receive `{type: "error", data: {message: "Session not found"}}`
|
|
113
|
+
- Server errors during message processing are sent as error events, not connection closures
|
|
114
|
+
- The WebSocket connection stays open through errors — only explicit close or timeout disconnects
|
|
115
|
+
|
|
116
|
+
## Supporting Structures
|
|
117
|
+
|
|
118
|
+
- **HTTP API Server (RISE-088)** provides the server that hosts the WebSocket endpoint
|
|
119
|
+
- **SSE Streaming (RISE-091)** provides an alternative one-way streaming protocol
|
|
120
|
+
- **Event Bus (RISE-002)** provides the internal event system that WebSocket events mirror
|
|
121
|
+
- **Permission Modes (RISE-087)** defines permission prompts routed via WebSocket
|
|
122
|
+
- **Client-Server Architecture (RISE-001)** defines the overall architecture this implements
|
|
123
|
+
|
|
124
|
+
## Creative Advancement Scenarios
|
|
125
|
+
|
|
126
|
+
**Scenario 1 — Real-Time Web UI:**
|
|
127
|
+
A React web app opens a WebSocket connection and renders message deltas as they arrive. The user sees the agent's response streaming character-by-character, tool executions appearing as they start and complete, and permission prompts appearing as modal dialogs. The experience mirrors the terminal but with richer rendering.
|
|
128
|
+
|
|
129
|
+
**Scenario 2 — Mobile Remote Driving:**
|
|
130
|
+
A mobile app connects via WebSocket over the local network. The developer sends prompts by typing on their phone. Message deltas stream back in real-time. Permission prompts appear as push notifications. The developer approves from the lock screen.
|
|
131
|
+
|
|
132
|
+
**Scenario 3 — Multi-Monitor Pair Programming:**
|
|
133
|
+
Developer A drives the agent from a web UI on one monitor. Developer B has a terminal client on another monitor subscribed to the same session. Both see identical real-time output. Developer B spots an issue and sends a correction — it appears in both clients immediately.
|
|
134
|
+
|
|
135
|
+
**Scenario 4 — Dashboard Monitoring:**
|
|
136
|
+
An ops dashboard subscribes to all active sessions via WebSocket. It shows a grid of running agents: current task, token usage, tool executions, and errors. Cost updates stream in real-time. A sudden spike in errors triggers an alert without polling.
|