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,155 @@
|
|
|
1
|
+
# RISE-006: Named Error System
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/006-named-error-system.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code enables precise, machine-readable error handling throughout the system. Every error has a dot-notation name (`session.not_found`), a human-readable message, and optional metadata. Error handlers match on names, not on message strings. API responses serialize errors cleanly to JSON. Monitoring aggregates errors by name. No more `catch(e) { if (e.message.includes("not found")) ... }` — errors are data, not prose.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code throws raw `Error` objects with free-text messages
|
|
14
|
+
- Error handling relies on string matching against `error.message` — fragile and locale-dependent
|
|
15
|
+
- There is no hierarchy or categorization of errors — a config parse error looks the same as a network timeout
|
|
16
|
+
- Errors cannot carry structured metadata (which session failed, which file was missing)
|
|
17
|
+
- When the HTTP API (RISE-001) is added, errors must be serialized to JSON — raw Error objects lose their stack and carry only a message string
|
|
18
|
+
- There is no way to aggregate errors by type for monitoring or debugging
|
|
19
|
+
|
|
20
|
+
**Desired State:**
|
|
21
|
+
- Every error in the system is a `NamedError` with a machine-readable name, human message, and metadata
|
|
22
|
+
- Error names follow dot-notation: `module.error_type` (e.g., `session.not_found`, `config.invalid_field`, `agent.timeout`)
|
|
23
|
+
- Catch blocks match on `error.name` for reliable handling
|
|
24
|
+
- Errors serialize to JSON with name, message, and metadata — perfect for API responses
|
|
25
|
+
- Error aggregation by name enables patterns like "10 `agent.timeout` errors in the last hour"
|
|
26
|
+
- Raw `throw new Error(...)` is banned — linting or convention enforces `NamedError` usage
|
|
27
|
+
|
|
28
|
+
## Desired Outcome Definition
|
|
29
|
+
|
|
30
|
+
A `NamedError` class that extends `Error` with a structured `name`, `message`, and `metadata` object. All error paths in mia-code use `NamedError`. A utility function wraps unknown caught errors into `NamedError`.
|
|
31
|
+
|
|
32
|
+
## Natural Language Functional Description
|
|
33
|
+
|
|
34
|
+
### NamedError Class
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
class NamedError extends Error {
|
|
38
|
+
readonly name: string; // dot-notation: "session.not_found"
|
|
39
|
+
readonly message: string; // human-readable: "Session not found"
|
|
40
|
+
readonly metadata: Record<string, unknown>; // structured context
|
|
41
|
+
|
|
42
|
+
constructor(
|
|
43
|
+
name: string,
|
|
44
|
+
message: string,
|
|
45
|
+
metadata?: Record<string, unknown>
|
|
46
|
+
) {
|
|
47
|
+
super(message);
|
|
48
|
+
this.name = name;
|
|
49
|
+
this.metadata = metadata ?? {};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
toJSON(): { name: string; message: string; metadata: Record<string, unknown> } {
|
|
53
|
+
return { name: this.name, message: this.message, metadata: this.metadata };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Throwing Named Errors
|
|
59
|
+
|
|
60
|
+
Modules throw NamedErrors with descriptive names and relevant metadata:
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
throw new NamedError("session.not_found", "Session not found", {
|
|
64
|
+
sessionId: "abc-123", projectRoot: "/home/dev/myproject",
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
throw new NamedError("config.invalid_field", "Invalid configuration value", {
|
|
68
|
+
field: "defaultEngine", value: "gpt4", expected: ["gemini", "claude"],
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
throw new NamedError("agent.timeout", "Agent did not respond within timeout", {
|
|
72
|
+
engine: "gemini", timeoutMs: 30000, sessionId: "abc-123",
|
|
73
|
+
});
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Catching by Name
|
|
77
|
+
|
|
78
|
+
Error handlers match on the `name` property for reliable dispatch:
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
try {
|
|
82
|
+
await Session.resume(sessionId);
|
|
83
|
+
} catch (e) {
|
|
84
|
+
if (e instanceof NamedError && e.name === "session.not_found") {
|
|
85
|
+
return await Session.create({ projectRoot });
|
|
86
|
+
}
|
|
87
|
+
throw e;
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Wrapping Unknown Errors
|
|
92
|
+
|
|
93
|
+
When catching errors from third-party code or the runtime, wrap them into NamedErrors:
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
function wrapError(error: unknown, name: string): NamedError {
|
|
97
|
+
if (error instanceof NamedError) return error;
|
|
98
|
+
if (error instanceof Error) {
|
|
99
|
+
return new NamedError(name, error.message, {
|
|
100
|
+
originalName: error.name,
|
|
101
|
+
stack: error.stack,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return new NamedError(name, String(error));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Usage
|
|
108
|
+
try {
|
|
109
|
+
await fs.readFile(path);
|
|
110
|
+
} catch (e) {
|
|
111
|
+
throw wrapError(e, "fs.read_failed");
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Error Name Conventions
|
|
116
|
+
|
|
117
|
+
Names follow `module.error_type` pattern:
|
|
118
|
+
|
|
119
|
+
| Module | Error Names |
|
|
120
|
+
|-----------|-----------------------------------------------------------------|
|
|
121
|
+
| session | `session.not_found`, `session.corrupted`, `session.limit_reached` |
|
|
122
|
+
| config | `config.invalid_field`, `config.file_unreadable`, `config.parse_failed` |
|
|
123
|
+
| agent | `agent.timeout`, `agent.process_failed`, `agent.invalid_response` |
|
|
124
|
+
| tool | `tool.not_found`, `tool.execution_failed`, `tool.permission_denied` |
|
|
125
|
+
| bus | `bus.invalid_payload`, `bus.handler_failed` |
|
|
126
|
+
| api | `api.unauthorized`, `api.invalid_request`, `api.rate_limited` |
|
|
127
|
+
|
|
128
|
+
### API Error Serialization
|
|
129
|
+
|
|
130
|
+
The HTTP server (RISE-001) catches NamedErrors and serializes them via `err.toJSON()`, mapping error names to HTTP status codes (`session.not_found` → 404, `config.invalid_field` → 400, `api.unauthorized` → 401, `agent.timeout` → 504). Unknown NamedErrors default to 500.
|
|
131
|
+
|
|
132
|
+
### Integration with Zod Validation
|
|
133
|
+
|
|
134
|
+
A utility `parseOrThrow(schema, data, errorName)` wraps `schema.safeParse()` — on failure, it throws a `NamedError` with the given name and the first Zod issue as the message, with all issues in metadata.
|
|
135
|
+
|
|
136
|
+
## Supporting Structures
|
|
137
|
+
|
|
138
|
+
- **Zod Schema Validation (RISE-005)** generates validation errors that are wrapped into NamedErrors
|
|
139
|
+
- **Event Bus (RISE-002)** uses NamedErrors for invalid payload errors
|
|
140
|
+
- **Structured Logging (RISE-007)** logs NamedErrors with their name and metadata as structured fields
|
|
141
|
+
- **Client-Server Architecture (RISE-001)** serializes NamedErrors to JSON for API responses
|
|
142
|
+
|
|
143
|
+
## Creative Advancement Scenarios
|
|
144
|
+
|
|
145
|
+
**Scenario 1 — Graceful Session Recovery:**
|
|
146
|
+
`Session.resume()` throws `NamedError("session.corrupted", ...)`. The caller catches it by name, deletes the corrupted session, and creates a fresh one. The user sees "Session was corrupted, starting fresh" — not a stack trace.
|
|
147
|
+
|
|
148
|
+
**Scenario 2 — API Error Response:**
|
|
149
|
+
A client sends an invalid request. The server catches the NamedError and returns `{"name":"config.invalid_field","message":"Invalid engine 'gpt4'","metadata":{"field":"engine","expected":["gemini","claude"]}}`. The client renders a specific, helpful error message.
|
|
150
|
+
|
|
151
|
+
**Scenario 3 — Error Metrics Dashboard:**
|
|
152
|
+
A monitoring module subscribes to `Error.Event.Occurred` on the event bus. It counts errors by name. The team sees that `agent.timeout` spiked — Gemini's API is slow today. They switch the default engine to Claude.
|
|
153
|
+
|
|
154
|
+
**Scenario 4 — Third-Party Error Wrapping:**
|
|
155
|
+
The Gemini CLI process crashes with an opaque error. The agent module catches it and wraps it: `NamedError("agent.process_failed", "Gemini CLI exited with code 1", { stderr: "..." })`. Upstream code handles it by name without parsing stderr.
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# RISE-007: Structured Logging
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/007-structured-logging.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code enables observable, filterable, structured logging across every module. Every log line carries a service tag, a level, a timestamp, and structured metadata — not a concatenated string. Developers debug by filtering: `MIA_LOG=session:debug,agent:warn` shows verbose session logs and only agent warnings. In production, logs are JSON lines. In development, logs are human-readable. No `console.log` survives — all output flows through the Log system.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code uses `console.log` and chalk-styled output directly in business logic
|
|
14
|
+
- There is no distinction between "output for the user" and "output for debugging" — both go to stdout
|
|
15
|
+
- Debugging requires adding and removing `console.log` statements manually
|
|
16
|
+
- There is no way to enable verbose logging for one module without drowning in output from others
|
|
17
|
+
- Log lines carry no structured context — a message like `"Session created"` doesn't tell you which session or which project
|
|
18
|
+
- When the HTTP server (RISE-001) runs headlessly, console output is lost unless piped to a file
|
|
19
|
+
|
|
20
|
+
**Desired State:**
|
|
21
|
+
- Every module creates a tagged logger: `const log = Log.create({ service: "session" })`
|
|
22
|
+
- Log calls include structured metadata: `log.info("created", { sessionId, projectRoot })`
|
|
23
|
+
- Log levels (debug, info, warn, error) filter output by severity
|
|
24
|
+
- Per-module log level control via environment variable: `MIA_LOG=session:debug,agent:info`
|
|
25
|
+
- Development mode: human-readable colored output with timestamps
|
|
26
|
+
- Production/headless mode: JSON lines for machine parsing
|
|
27
|
+
- User-facing output (the TUI) is separate from logging — logs go to stderr or a file, UI goes to stdout
|
|
28
|
+
|
|
29
|
+
## Desired Outcome Definition
|
|
30
|
+
|
|
31
|
+
A `Log` module that provides per-service tagged loggers with structured metadata, configurable levels, and environment-based filtering.
|
|
32
|
+
|
|
33
|
+
## Natural Language Functional Description
|
|
34
|
+
|
|
35
|
+
### Logger Creation
|
|
36
|
+
|
|
37
|
+
Each module creates a logger with a service tag:
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { Log } from "./log";
|
|
41
|
+
|
|
42
|
+
const log = Log.create({ service: "session" });
|
|
43
|
+
|
|
44
|
+
log.debug("loading index", { path: "~/.mia-code-sessions.json" });
|
|
45
|
+
log.info("created", { sessionId: "abc-123", projectRoot: "/dev/myproject" });
|
|
46
|
+
log.warn("stale session", { sessionId: "old-456", ageHours: 72 });
|
|
47
|
+
log.error("failed to save", { path: "~/.mia-code-sessions.json", error: err.message });
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Log Levels
|
|
51
|
+
|
|
52
|
+
Four levels in ascending severity:
|
|
53
|
+
|
|
54
|
+
| Level | Purpose | Default visibility |
|
|
55
|
+
|-------|---------|-------------------|
|
|
56
|
+
| `debug` | Detailed internal state, iteration steps, raw data | Hidden |
|
|
57
|
+
| `info` | Significant state changes, lifecycle events | Visible |
|
|
58
|
+
| `warn` | Recoverable issues, degraded behavior | Visible |
|
|
59
|
+
| `error` | Failures that prevent normal operation | Visible |
|
|
60
|
+
|
|
61
|
+
### Log Output Format
|
|
62
|
+
|
|
63
|
+
**Development mode** (when stdout is a TTY):
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
12:34:56.789 [session] INFO created sessionId=abc-123 projectRoot=/dev/myproject
|
|
67
|
+
12:34:56.790 [agent] DEBUG spawning engine=gemini model=gemini-2.5-pro
|
|
68
|
+
12:34:57.123 [agent] WARN slow response elapsed=2341ms threshold=2000ms
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Format: `HH:mm:ss.SSS [service] LEVEL message key=value key=value`
|
|
72
|
+
|
|
73
|
+
Colors: debug=gray, info=blue, warn=yellow, error=red. Service tag is cyan. Keys are dimmed.
|
|
74
|
+
|
|
75
|
+
**Production mode** (when stdout is not a TTY, or `MIA_LOG_FORMAT=json`):
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{"ts":"2025-02-17T04:47:57.789Z","service":"session","level":"info","msg":"created","sessionId":"abc-123","projectRoot":"/dev/myproject"}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
One JSON object per line. Fields: `ts` (ISO 8601), `service`, `level`, `msg`, and all metadata keys flattened into the object.
|
|
82
|
+
|
|
83
|
+
### Level Filtering
|
|
84
|
+
|
|
85
|
+
The `MIA_LOG` environment variable controls per-module levels: `MIA_LOG=info,session:debug,agent:error`. Comma-separated entries; bare levels set the global default, `module:level` sets overrides. Per-module takes precedence.
|
|
86
|
+
|
|
87
|
+
### Separation from UI Output
|
|
88
|
+
|
|
89
|
+
UI output (prompts, agent responses, ceremony) goes to **stdout** via chalk/ora. Log output goes to **stderr** (or `MIA_LOG_FILE`). This means `mia-code 2>debug.log` captures logs without disrupting the TUI.
|
|
90
|
+
|
|
91
|
+
### Error Logging with NamedError
|
|
92
|
+
|
|
93
|
+
When logging errors, the logger extracts NamedError fields automatically:
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
try {
|
|
97
|
+
await Session.resume(id);
|
|
98
|
+
} catch (e) {
|
|
99
|
+
log.error("resume failed", {
|
|
100
|
+
sessionId: id,
|
|
101
|
+
...(e instanceof NamedError ? { errorName: e.name, ...e.metadata } : { error: String(e) }),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
This produces structured log entries like:
|
|
107
|
+
```json
|
|
108
|
+
{"ts":"...","service":"session","level":"error","msg":"resume failed","sessionId":"abc-123","errorName":"session.corrupted","reason":"invalid JSON"}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Child Loggers
|
|
112
|
+
|
|
113
|
+
`log.child({ sessionId: "abc-123", operation: "resume" })` creates a child logger with pre-bound context. Every log call from the child includes the bound fields automatically. The child inherits the parent's service tag and level.
|
|
114
|
+
|
|
115
|
+
### No Console.log
|
|
116
|
+
|
|
117
|
+
Zero `console.log`/`console.warn`/`console.error` in production code. All output goes through `Log` (debugging → stderr) or chalk/ora formatting (user-facing UI → stdout).
|
|
118
|
+
|
|
119
|
+
## Supporting Structures
|
|
120
|
+
|
|
121
|
+
- **Named Error System (RISE-006)** provides structured error data that loggers extract automatically
|
|
122
|
+
- **Event Bus (RISE-002)** can subscribe to error events and log them centrally
|
|
123
|
+
- **Instance State (RISE-003)** scopes logger context to the active project
|
|
124
|
+
- **Client-Server Architecture (RISE-001)** uses JSON log format for server-side observability
|
|
125
|
+
|
|
126
|
+
## Creative Advancement Scenarios
|
|
127
|
+
|
|
128
|
+
**Scenario 1 — Debugging a Session Resume Failure:**
|
|
129
|
+
A user reports that session resume fails silently. The developer asks them to run `MIA_LOG=session:debug mia-code` and share the output. The debug logs show: `loading index path=~/.mia-code-sessions.json`, `found session sessionId=abc-123`, `resume failed errorName=agent.process_failed stderr="API key expired"`. Root cause identified in one exchange.
|
|
130
|
+
|
|
131
|
+
**Scenario 2 — Server Log Aggregation:**
|
|
132
|
+
The mia-code server runs with `MIA_LOG_FORMAT=json MIA_LOG_FILE=/var/log/mia-code.log`. A log aggregator (like `tail -f | jq`) processes JSON lines. The ops team queries: "show all `level:error` entries from `service:agent` in the last hour."
|
|
133
|
+
|
|
134
|
+
**Scenario 3 — Isolating a Noisy Module:**
|
|
135
|
+
During development, the agent module emits hundreds of debug lines per request. The developer sets `MIA_LOG=debug,agent:warn` — full debug output from session, config, and bus modules, but only warnings and errors from agent. Signal without noise.
|
|
136
|
+
|
|
137
|
+
**Scenario 4 — CI Pipeline Logging:**
|
|
138
|
+
In CI, mia-code runs headlessly with `MIA_LOG=info MIA_LOG_FORMAT=json`. Logs are JSON lines captured by the CI system. On failure, the CI shows structured error entries with full metadata — no need to reproduce the failure locally.
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# RISE-008: Lazy Initialization
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/008-lazy-initialization.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code enables fast startup by deferring expensive work until it is actually needed. A database connection, an LSP server, an MCP transport, a provider API client — none of these initialize at startup. They initialize on first use, cache the result, and return it instantly on every subsequent access. The user types their first prompt in milliseconds; the heavy resources spin up in the background as the agent needs them.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code spawns agent CLI processes (Gemini, Claude) at the start of a session — even if the user hasn't typed a prompt yet
|
|
14
|
+
- Configuration is loaded synchronously at startup via `loadConfig()` in `config.ts`, blocking the main thread
|
|
15
|
+
- Session index is loaded from disk on every operation — no caching between calls within the same process
|
|
16
|
+
- If mia-code adds features like database-backed sessions, LSP integration, or MCP connections, each adds to startup latency
|
|
17
|
+
- There is no pattern for "initialize once, reuse forever" — developers either use module-level variables (no cleanup) or re-initialize on every call (no caching)
|
|
18
|
+
|
|
19
|
+
**Desired State:**
|
|
20
|
+
- Expensive resources initialize only when first accessed
|
|
21
|
+
- Subsequent accesses return the cached result with zero overhead
|
|
22
|
+
- Concurrent first-access calls share one initialization — no double-init
|
|
23
|
+
- Resources can register cleanup callbacks for graceful shutdown
|
|
24
|
+
- The pattern is generic, composable, and type-safe
|
|
25
|
+
- Startup time remains constant regardless of how many lazy resources are declared
|
|
26
|
+
|
|
27
|
+
## Desired Outcome Definition
|
|
28
|
+
|
|
29
|
+
A `lazy<T>(factory, dispose?)` function that returns an accessor. The accessor runs the factory on first call, caches the result, and returns it on subsequent calls. Concurrent first calls share one initialization. An optional dispose callback enables cleanup.
|
|
30
|
+
|
|
31
|
+
## Natural Language Functional Description
|
|
32
|
+
|
|
33
|
+
### Basic Usage
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import { lazy } from "./lazy";
|
|
37
|
+
|
|
38
|
+
const db = lazy(async () => {
|
|
39
|
+
const connection = await connectToDatabase({
|
|
40
|
+
path: "~/.mia-code/sessions.db",
|
|
41
|
+
});
|
|
42
|
+
await connection.migrate();
|
|
43
|
+
return connection;
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Later, anywhere in the codebase:
|
|
47
|
+
const conn = await db(); // first call: connects and migrates
|
|
48
|
+
const conn2 = await db(); // subsequent call: returns same connection instantly
|
|
49
|
+
console.log(conn === conn2); // true
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Implementation
|
|
53
|
+
|
|
54
|
+
The `lazy` function wraps a factory in a stateful accessor. It stores three pieces of state: the in-flight promise (for concurrent safety), the resolved value, and an initialized flag. On first call, it runs the factory and stores the promise. On subsequent calls, it returns the cached value. The accessor exposes `dispose()` (runs cleanup, resets state so next access re-initializes) and `isInitialized()` (check without triggering init).
|
|
55
|
+
|
|
56
|
+
### Concurrent Safety
|
|
57
|
+
|
|
58
|
+
If two code paths call `await db()` simultaneously before initialization completes, both receive the same promise. The factory runs exactly once — the second caller sees the in-flight promise and awaits it.
|
|
59
|
+
|
|
60
|
+
### Synchronous Variant
|
|
61
|
+
|
|
62
|
+
`lazySync<T>(factory, dispose?)` provides the same pattern for synchronous initialization (e.g., parsing a config file). Same API shape, minus the `async`.
|
|
63
|
+
|
|
64
|
+
### Disposal and Reset
|
|
65
|
+
|
|
66
|
+
Calling `dispose()` runs the cleanup callback and resets the accessor. The next call re-runs the factory, returning a fresh resource.
|
|
67
|
+
|
|
68
|
+
### Use Cases in mia-code
|
|
69
|
+
|
|
70
|
+
**Database connection** (when migrating from JSON file to SQLite):
|
|
71
|
+
```typescript
|
|
72
|
+
const db = lazy(async () => {
|
|
73
|
+
const conn = await openDatabase("~/.mia-code/sessions.db");
|
|
74
|
+
await conn.exec(SCHEMA_SQL);
|
|
75
|
+
return conn;
|
|
76
|
+
}, async (conn) => conn.close());
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Agent process pool:**
|
|
80
|
+
```typescript
|
|
81
|
+
const agentProcess = lazy(async () => {
|
|
82
|
+
const proc = spawn("gemini", ["--headless"], { stdio: "pipe" });
|
|
83
|
+
await waitForReady(proc);
|
|
84
|
+
return proc;
|
|
85
|
+
}, async (proc) => {
|
|
86
|
+
proc.kill("SIGTERM");
|
|
87
|
+
await waitForExit(proc);
|
|
88
|
+
});
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Configuration:**
|
|
92
|
+
```typescript
|
|
93
|
+
const config = lazy(async () => {
|
|
94
|
+
const raw = await readFile("~/.mia-code.json", "utf-8").catch(() => "{}");
|
|
95
|
+
return ConfigSchema.parse(JSON.parse(raw));
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Other use cases follow the same pattern: MCP clients, LSP servers, provider API clients — any resource with async setup and teardown.
|
|
100
|
+
|
|
101
|
+
### Composition with Instance State
|
|
102
|
+
|
|
103
|
+
`Instance.state()` (RISE-003) is built on `lazy()`, adding project-directory scoping and automatic cleanup on instance disposal: `lazy()` = init once + cache + optional dispose; `Instance.state()` = `lazy()` + directory scope + auto-dispose on teardown.
|
|
104
|
+
|
|
105
|
+
### Global Dispose All
|
|
106
|
+
|
|
107
|
+
A registry tracks all lazy accessors. On process shutdown (`SIGTERM`), `disposeAll()` iterates the registry in reverse creation order (LIFO), calling `dispose()` on each. This ensures orderly cleanup without manual bookkeeping.
|
|
108
|
+
|
|
109
|
+
## Supporting Structures
|
|
110
|
+
|
|
111
|
+
- **Instance State (RISE-003)** builds on lazy initialization, adding per-directory scoping
|
|
112
|
+
- **Client-Server Architecture (RISE-001)** benefits from lazy init — server resources initialize on first request, not on server start
|
|
113
|
+
- **Structured Logging (RISE-007)** can observe initialization timing via lazy wrappers that log init duration
|
|
114
|
+
|
|
115
|
+
## Creative Advancement Scenarios
|
|
116
|
+
|
|
117
|
+
**Scenario 1 — Instant Startup:**
|
|
118
|
+
A developer runs `mia-code`. The TUI appears instantly. They type a prompt. Only then does the agent process spawn, the session database open, and the config load. Startup time: ~50ms. First-prompt latency absorbs the initialization cost invisibly.
|
|
119
|
+
|
|
120
|
+
**Scenario 2 — Unused Resource Never Initializes:**
|
|
121
|
+
mia-code has an MCP client for connecting to external tool servers. If the user never invokes an MCP tool, the client never initializes. Zero cost for features not used.
|
|
122
|
+
|
|
123
|
+
**Scenario 3 — Graceful Shutdown:**
|
|
124
|
+
The user presses Ctrl+C. The process handler calls `disposeAll()`. Each lazy accessor's dispose callback runs: the database connection closes cleanly (flushing pending writes), the agent process receives SIGTERM (not SIGKILL), the LSP server shuts down gracefully. No orphan processes, no corrupted files.
|
|
125
|
+
|
|
126
|
+
**Scenario 4 — Reconnection After Error:**
|
|
127
|
+
The database connection drops. The code calls `db.dispose()` to reset the lazy accessor, then `await db()` to reconnect. The factory runs again, establishing a fresh connection. The reset-and-retry pattern is natural with lazy accessors.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# RISE-009: Multi-Agent System
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/009-multi-agent-system.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code enables developers to work with multiple specialized agents within a single application, each possessing distinct capabilities, permissions, and purposes. Instead of one monolithic agent that does everything, users select the right agent for the right task — a focused explorer for codebase discovery, a cautious planner for analysis, a powerful builder for execution. The agent system transforms mia-code from a single-voice tool into an ensemble of specialized collaborators, each with the 🧠 Mia / 🌸 Miette dual perspective but tuned to different operational registers.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code runs a single agent mode: the user sends a prompt, the engine (gemini/claude) responds, and the unifier interprets
|
|
14
|
+
- There is no concept of agent specialization — the same system prompt, permissions, and model apply to every interaction
|
|
15
|
+
- The engine selection (`gemini` vs `claude`) is the only axis of variation; it changes the backend but not the agent's behavior or constraints
|
|
16
|
+
- All tool access is uniform — there is no way to restrict an agent from editing files or running commands
|
|
17
|
+
- Switching between "exploration" and "execution" mindsets requires the user to mentally adjust, not the system
|
|
18
|
+
- The unifier treats every response identically regardless of task type
|
|
19
|
+
|
|
20
|
+
**Desired State:**
|
|
21
|
+
- Multiple named agents coexist in a single mia-code session, each with its own permission ruleset, system prompt, and optional model override
|
|
22
|
+
- Agents operate in two modes: "primary" (user-facing, full interaction loop) and "subagent" (invoked by other agents for subtasks)
|
|
23
|
+
- A third mode "all" marks agents available in both primary and subagent capacities
|
|
24
|
+
- Switching between primary agents is instantaneous via the Tab key — same session context, different capabilities
|
|
25
|
+
- Subagents are invoked via `@mention` syntax in user messages, delegating specific tasks to specialized agents
|
|
26
|
+
- Each agent's permission boundary is enforced independently — an explore agent cannot edit files even if the build agent can
|
|
27
|
+
- The unifier adapts its interpretation style based on which agent produced the output
|
|
28
|
+
|
|
29
|
+
## Desired Outcome Definition
|
|
30
|
+
|
|
31
|
+
A running mia-code session offers multiple agents selectable via Tab (for primary agents) or `@mention` (for subagents). Each agent operates within its defined permission boundary, uses its configured model, and follows its system prompt. The user moves fluidly between agents without losing session context.
|
|
32
|
+
|
|
33
|
+
## Natural Language Functional Description
|
|
34
|
+
|
|
35
|
+
### Built-in Agents
|
|
36
|
+
|
|
37
|
+
mia-code ships with four built-in agents:
|
|
38
|
+
|
|
39
|
+
1. **build** — The default primary agent. Full access to all tools: file read/write, bash execution, code editing, project manipulation. Uses the session's default model. System prompt emphasizes execution, implementation, and delivery. Mode: "primary".
|
|
40
|
+
|
|
41
|
+
2. **plan** — A read-only analysis agent. File edits are denied. Bash execution requires explicit user permission per invocation. Ideal for exploring unfamiliar codebases, analyzing architecture, or planning changes before committing to them. Mode: "primary".
|
|
42
|
+
|
|
43
|
+
3. **explore** — A fast codebase search agent. Limited to read operations and search tools (grep, glob, file viewing). Uses a faster/cheaper model by default for rapid iteration. Cannot edit, write, or execute. Mode: "all" (usable as primary or subagent).
|
|
44
|
+
|
|
45
|
+
4. **general** — A full-capability subagent for complex multi-step tasks. Invoked by other agents when they need to delegate work that requires multiple tool calls and reasoning steps. Runs in a separate context but shares the session. Mode: "subagent".
|
|
46
|
+
|
|
47
|
+
### Agent Properties
|
|
48
|
+
|
|
49
|
+
Each agent is defined by:
|
|
50
|
+
|
|
51
|
+
- **name**: Display name shown in UI and Tab switcher
|
|
52
|
+
- **description**: Brief purpose statement, shown in agent list
|
|
53
|
+
- **mode**: One of "primary", "subagent", or "all"
|
|
54
|
+
- **permissions**: A ruleset (see RISE-011) controlling tool and resource access
|
|
55
|
+
- **model**: Optional override `{providerID, modelID}` — defaults to session model if unset
|
|
56
|
+
- **prompt**: Custom system prompt template (see RISE-012) — defaults to built-in if unset
|
|
57
|
+
- **temperature**: Optional float (0.0–2.0) for response randomness
|
|
58
|
+
- **topP**: Optional float (0.0–1.0) for nucleus sampling
|
|
59
|
+
|
|
60
|
+
### Agent Switching
|
|
61
|
+
|
|
62
|
+
Primary agents appear in a Tab-accessible switcher. The UI displays the current agent name prominently. When the user presses Tab, a selection menu shows all primary-mode agents with their descriptions. Switching is instant — the session context (message history, file state, working directory) persists, but the active permission ruleset and system prompt change immediately.
|
|
63
|
+
|
|
64
|
+
### Subagent Invocation
|
|
65
|
+
|
|
66
|
+
Users invoke subagents by typing `@agentname` followed by a task description in their message. The current primary agent recognizes the mention, extracts the task, and delegates to the named subagent. The subagent executes within its own permission boundary and returns results to the primary agent, which synthesizes and presents them to the user.
|
|
67
|
+
|
|
68
|
+
### Session Context Sharing
|
|
69
|
+
|
|
70
|
+
All agents in a session share: message history, file system state, working directory, environment variables, and session metadata. Each agent maintains isolated: permission boundaries, active system prompt, model selection, and tool availability. This means an explore agent can reference files the build agent modified earlier, but cannot modify them itself.
|
|
71
|
+
|
|
72
|
+
### Unifier Adaptation
|
|
73
|
+
|
|
74
|
+
The unifier's dual 🧠/🌸 interpretation adjusts based on the active agent. Build agent output gets execution-focused commentary. Plan agent output gets analytical commentary. Explore agent output gets discovery-focused commentary. The unifier reads the agent's mode and name to calibrate its interpretive lens.
|
|
75
|
+
|
|
76
|
+
## Supporting Structures
|
|
77
|
+
|
|
78
|
+
- **Agent Definition Config (RISE-010)** enables user-defined custom agents beyond the built-in four
|
|
79
|
+
- **Agent Permission Rulesets (RISE-011)** provides the permission enforcement mechanism each agent relies on
|
|
80
|
+
- **Agent Prompt Templates (RISE-012)** supplies the system prompt framework agents use
|
|
81
|
+
- **Plan/Build Mode Toggle (RISE-014)** is the primary user-facing expression of agent switching
|
|
82
|
+
- **Subagent Task Delegation (RISE-015)** details the `@mention` delegation protocol
|
|
83
|
+
- **Event Bus (RISE-002)** broadcasts agent switch events to the UI and connected clients
|
|
84
|
+
|
|
85
|
+
## Creative Advancement Scenarios
|
|
86
|
+
|
|
87
|
+
**Scenario 1 — Exploration Before Execution:**
|
|
88
|
+
A developer opens a new codebase. They start in `plan` mode, asking questions about architecture and dependencies. The plan agent reads files, searches code, and builds understanding — but never modifies anything. Once the developer has a mental model, they press Tab, switch to `build`, and say "refactor the auth module as we discussed." The build agent has full context from the plan conversation and executes immediately.
|
|
89
|
+
|
|
90
|
+
**Scenario 2 — Delegated Code Search:**
|
|
91
|
+
While in build mode, the developer types: `@explore find all files that import the SessionStore class`. The explore agent runs rapidly through the codebase using its fast model, returns a list of files and line numbers. The build agent receives this, presents it to the user, and uses it to inform the next refactoring step.
|
|
92
|
+
|
|
93
|
+
**Scenario 3 — Custom Reviewer Agent:**
|
|
94
|
+
A team creates a custom "reviewer" agent (via RISE-010) with read-only permissions and a system prompt focused on code quality. During a pairing session, one developer works in build mode while the other occasionally switches to the reviewer agent to get automated code review feedback on recent changes — same session, different perspectives.
|
|
95
|
+
|
|
96
|
+
**Scenario 4 — Safe Onboarding:**
|
|
97
|
+
A junior developer's mia-code config sets `plan` as the default agent. They can explore, analyze, and plan freely. When they switch to `build`, additional confirmation prompts appear for destructive operations. The agent system provides guardrails without blocking productivity.
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# RISE-010: Agent Definition Config
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/010-agent-definition-config.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code enables developers to define custom agents through configuration files, extending the built-in agent roster without writing code. A user describes an agent's name, purpose, model, prompt, and permissions in JSON — and the system instantiates it alongside the defaults. This transforms agent creation from a developer-only activity into a configurable, shareable, team-level practice. Custom agents become part of the project's development infrastructure, versioned alongside code.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code's configuration lives in `_env.sh` and environment variables — there is no structured config file for agent behavior
|
|
14
|
+
- The only behavioral axis is engine selection (`gemini` vs `claude`), controlled by CLI flags or environment variables
|
|
15
|
+
- There is no mechanism to define new agents, their prompts, or their constraints
|
|
16
|
+
- The UNIFIER_SYSTEM_PROMPT is hardcoded in the source — users cannot customize agent personalities without modifying source code
|
|
17
|
+
- Team-specific conventions (e.g., "always review before committing") must be enforced by human discipline, not system configuration
|
|
18
|
+
- No config file format exists for mia-code beyond package.json scripts
|
|
19
|
+
|
|
20
|
+
**Desired State:**
|
|
21
|
+
- A `mia-code.json` (or `opencode.json`) configuration file in the project root defines custom agents
|
|
22
|
+
- Each agent entry specifies: name, description, model override, system prompt, permission ruleset, temperature, topP, and visibility
|
|
23
|
+
- Custom agents merge with built-in agents — they extend, not replace
|
|
24
|
+
- The config file is human-readable JSON, easily diffable, and version-controllable
|
|
25
|
+
- Hidden agents can exist for programmatic invocation without cluttering the agent list
|
|
26
|
+
- Agent definitions support inheritance — custom agents start with default permissions and override selectively
|
|
27
|
+
|
|
28
|
+
## Desired Outcome Definition
|
|
29
|
+
|
|
30
|
+
A developer creates a `mia-code.json` file in their project root containing custom agent definitions. When mia-code starts, it reads this config, merges custom agents with built-ins, and makes all agents available in the session. Custom agents behave identically to built-in ones — same switching, same permission enforcement, same unifier interpretation.
|
|
31
|
+
|
|
32
|
+
## Natural Language Functional Description
|
|
33
|
+
|
|
34
|
+
### Configuration File Location
|
|
35
|
+
|
|
36
|
+
mia-code searches for configuration in this order:
|
|
37
|
+
1. `mia-code.json` in the current working directory
|
|
38
|
+
2. `opencode.json` in the current working directory
|
|
39
|
+
3. `~/.config/mia-code/config.json` for global defaults
|
|
40
|
+
|
|
41
|
+
Project-level config overrides global config. Multiple config sources merge with project-level taking precedence.
|
|
42
|
+
|
|
43
|
+
### Agent Definition Schema
|
|
44
|
+
|
|
45
|
+
Each agent is defined under the `"agent"` key, keyed by a unique identifier:
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"agent": {
|
|
50
|
+
"reviewer": {
|
|
51
|
+
"name": "Code Reviewer",
|
|
52
|
+
"description": "Reviews code changes for quality, security, and style issues",
|
|
53
|
+
"model": {
|
|
54
|
+
"providerID": "anthropic",
|
|
55
|
+
"modelID": "claude-sonnet-4-20250514"
|
|
56
|
+
},
|
|
57
|
+
"prompt": "You are a code reviewer. Focus on bugs, security vulnerabilities, and logic errors. Never modify code directly — only suggest changes.",
|
|
58
|
+
"permissions": [
|
|
59
|
+
{"permission": "write", "action": "deny"},
|
|
60
|
+
{"permission": "edit", "action": "deny"},
|
|
61
|
+
{"permission": "read", "action": "allow"},
|
|
62
|
+
{"permission": "bash", "action": "ask"}
|
|
63
|
+
],
|
|
64
|
+
"temperature": 0.3,
|
|
65
|
+
"topP": 0.9,
|
|
66
|
+
"hidden": false
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Field Definitions
|
|
73
|
+
|
|
74
|
+
- **name** (string, required): Human-readable display name. Shown in Tab switcher and agent list.
|
|
75
|
+
- **description** (string, optional): Brief purpose statement. Shown alongside name in selection UI. Defaults to empty.
|
|
76
|
+
- **model** (object, optional): `{providerID: string, modelID: string}`. When omitted, the agent uses the session's default model. `providerID` maps to a configured API provider (e.g., "anthropic", "google", "openai"). `modelID` is the specific model identifier.
|
|
77
|
+
- **prompt** (string, optional): Custom system prompt text. Replaces the default agent prompt template. Supports variable interpolation (see RISE-012). Can be a multi-line string or a file path prefixed with `@` (e.g., `"@prompts/reviewer.md"`).
|
|
78
|
+
- **permissions** (array, optional): Permission ruleset array (see RISE-011). Merged with default permissions — custom rules take precedence over defaults.
|
|
79
|
+
- **temperature** (number, optional): Float 0.0–2.0. Controls response randomness. Lower values for deterministic tasks (code review), higher for creative tasks (brainstorming).
|
|
80
|
+
- **topP** (number, optional): Float 0.0–1.0. Nucleus sampling parameter. Defaults to model-specific value.
|
|
81
|
+
- **hidden** (boolean, optional): When `true`, the agent does not appear in the Tab switcher or agent list. It remains invocable via `@mention` or programmatic API. Useful for internal/utility agents.
|
|
82
|
+
|
|
83
|
+
### Merging with Built-in Agents
|
|
84
|
+
|
|
85
|
+
Custom agents are added to the agent roster alongside built-in agents (build, plan, explore, general). If a custom agent uses the same key as a built-in (e.g., `"build"`), the custom definition overrides the built-in fields selectively — unspecified fields retain their built-in defaults. This enables users to customize built-in agents without redefining them entirely.
|
|
86
|
+
|
|
87
|
+
### Validation
|
|
88
|
+
|
|
89
|
+
On startup, mia-code validates the config:
|
|
90
|
+
- Agent keys must be unique lowercase alphanumeric identifiers (no spaces, hyphens allowed)
|
|
91
|
+
- Model references must point to configured providers
|
|
92
|
+
- Permission rules must use valid action values ("allow", "deny", "ask")
|
|
93
|
+
- Temperature and topP must be within valid ranges
|
|
94
|
+
- Invalid agent definitions emit a warning and are skipped — they do not prevent startup
|
|
95
|
+
|
|
96
|
+
### File-Based Prompts
|
|
97
|
+
|
|
98
|
+
When the `prompt` field starts with `@`, the remainder is treated as a relative file path. mia-code reads the file contents as the prompt text. This enables long, structured prompts stored in dedicated files:
|
|
99
|
+
|
|
100
|
+
```json
|
|
101
|
+
{
|
|
102
|
+
"agent": {
|
|
103
|
+
"architect": {
|
|
104
|
+
"name": "System Architect",
|
|
105
|
+
"prompt": "@.mia-code/prompts/architect.md"
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Runtime Behavior
|
|
112
|
+
|
|
113
|
+
Custom agents are instantiated at session start. They participate in the same lifecycle as built-in agents: Tab switching, `@mention` invocation, permission enforcement, and unifier interpretation. The agent system makes no distinction between built-in and custom agents at runtime.
|
|
114
|
+
|
|
115
|
+
## Supporting Structures
|
|
116
|
+
|
|
117
|
+
- **Multi-Agent System (RISE-009)** defines the agent architecture that custom definitions plug into
|
|
118
|
+
- **Agent Permission Rulesets (RISE-011)** specifies the permission array format used in agent definitions
|
|
119
|
+
- **Agent Prompt Templates (RISE-012)** defines variable interpolation available in custom prompts
|
|
120
|
+
- **Agent Generation (RISE-013)** can produce agent definitions that are saved directly to this config format
|
|
121
|
+
- **Namespace Module Pattern (RISE-004)** guides the config loading module structure
|
|
122
|
+
|
|
123
|
+
## Creative Advancement Scenarios
|
|
124
|
+
|
|
125
|
+
**Scenario 1 — Team-Wide Code Standards:**
|
|
126
|
+
A team adds a `mia-code.json` to their repository defining a "standards" agent with a prompt encoding their code conventions, naming rules, and architectural patterns. Every developer who clones the repo gets the same standards agent. Code reviews become consistent because the agent enforces shared expectations.
|
|
127
|
+
|
|
128
|
+
**Scenario 2 — Project-Specific Security Agent:**
|
|
129
|
+
A fintech project defines a "security" agent with deny rules for any file matching `*.key`, `*.pem`, or `*.env`, and a prompt focused on OWASP top-10 vulnerabilities. The agent reviews changes through a security lens. It's hidden by default and invoked via `@security` when needed.
|
|
130
|
+
|
|
131
|
+
**Scenario 3 — Lightweight Exploration Override:**
|
|
132
|
+
A developer overrides the built-in `explore` agent to use Google's Gemini Flash model for even faster responses: `{"agent": {"explore": {"model": {"providerID": "google", "modelID": "gemini-2.0-flash"}}}}`. The explore agent now runs on a fast, cheap model while build stays on Claude Sonnet.
|
|
133
|
+
|
|
134
|
+
**Scenario 4 — Prompt Iteration Workflow:**
|
|
135
|
+
A developer creates `@.mia-code/prompts/reviewer.md` containing a detailed review prompt. They iterate on the prompt file, restarting mia-code to test changes. Once satisfied, they commit both the config and prompt file. The agent definition evolves with the project.
|