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,128 @@
|
|
|
1
|
+
# RISE-078: Snapshot Restore
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/078-snapshot-restore.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
Any snapshot becomes a recovery point — the developer can rewind the workspace to any captured state with a single command. Whether undoing the last edit or reverting an entire sequence of changes, restore operations are safe, documented, and themselves reversible. The agent's workspace becomes a timeline the developer can scrub backward through.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code has no snapshot system, so no restore capability exists
|
|
14
|
+
- Reverting agent changes requires manual `git checkout` per file or `git stash`
|
|
15
|
+
- No way to undo a specific tool call while keeping later changes
|
|
16
|
+
- Partial reverts (restoring specific files) require knowing exactly which files changed
|
|
17
|
+
- Undo operations are not documented in session history — the developer loses context
|
|
18
|
+
- Restoring to a previous state risks overwriting files the developer modified independently
|
|
19
|
+
|
|
20
|
+
**Desired State:**
|
|
21
|
+
- `restore(hash)` reverts all files to a captured snapshot state with one operation
|
|
22
|
+
- `restore(hash, files)` selectively restores specific files, leaving others untouched
|
|
23
|
+
- A safety snapshot is automatically created before every restore (restore is itself undoable)
|
|
24
|
+
- Restore operations create session messages documenting what was reverted and why
|
|
25
|
+
- `/undo` command provides one-keystroke access to undo the most recent tool execution
|
|
26
|
+
- `/revert <messageId>` restores to the state before a specific message's tool calls began
|
|
27
|
+
|
|
28
|
+
## Desired Outcome Definition
|
|
29
|
+
|
|
30
|
+
The agent edits `src/api.ts`, `src/db.ts`, and `tests/api.test.ts`. The developer likes the API changes but not the database changes. They run `/undo` to revert the last edit (restoring `tests/api.test.ts`), then selectively restore `src/db.ts` from the session-start snapshot. The API changes remain. A message in the session records what was restored.
|
|
31
|
+
|
|
32
|
+
## Natural Language Functional Description
|
|
33
|
+
|
|
34
|
+
### Restore Operations
|
|
35
|
+
|
|
36
|
+
**Full Restore** — `restore(hash: string)`
|
|
37
|
+
1. Create a safety snapshot of the current state (so the restore itself can be undone).
|
|
38
|
+
2. Read the tree object at the given hash from the snapshot repository.
|
|
39
|
+
3. For each file in the tree: overwrite the working copy with the snapshot version.
|
|
40
|
+
4. For files present in the working copy but not in the snapshot: leave them (don't delete new files unless explicitly requested).
|
|
41
|
+
5. Record a restore event in the session.
|
|
42
|
+
|
|
43
|
+
**Selective Restore** — `restore(hash: string, files: string[])`
|
|
44
|
+
1. Create a safety snapshot of the current state.
|
|
45
|
+
2. For each specified file: read its content from the snapshot tree and overwrite the working copy.
|
|
46
|
+
3. Files not in the `files` array are left untouched.
|
|
47
|
+
4. Record which files were restored in the session.
|
|
48
|
+
|
|
49
|
+
### Safety Snapshot
|
|
50
|
+
|
|
51
|
+
Every restore operation begins by capturing a new snapshot of the current state. This means:
|
|
52
|
+
- Restoring to snapshot A creates snapshot B (current state before restore)
|
|
53
|
+
- If the developer doesn't like the restore, they can restore to snapshot B to get back
|
|
54
|
+
- Restore chains are always reversible — no state is ever permanently lost
|
|
55
|
+
|
|
56
|
+
### Commands
|
|
57
|
+
|
|
58
|
+
**`/undo`** — Undo the most recent file-modifying tool execution.
|
|
59
|
+
1. Find the most recent snapshot in the session's snapshot index.
|
|
60
|
+
2. Restore all files to that snapshot's state.
|
|
61
|
+
3. Display: "Restored {n} files to state before {tool call description}."
|
|
62
|
+
|
|
63
|
+
**`/revert <messageId>`** — Revert to the state before a specific message.
|
|
64
|
+
1. Look up the first snapshot associated with the given message ID.
|
|
65
|
+
2. Restore all files to that snapshot's state.
|
|
66
|
+
3. Display: "Restored to state before message #{messageId}."
|
|
67
|
+
|
|
68
|
+
**`/revert session`** — Revert to session start.
|
|
69
|
+
1. Restore all files to snapshot #0 (the initial session snapshot).
|
|
70
|
+
2. Display: "Restored all files to session start state."
|
|
71
|
+
|
|
72
|
+
### Restore Respect for Gitignore
|
|
73
|
+
|
|
74
|
+
Restore operations respect the project's `.gitignore`:
|
|
75
|
+
- Files listed in `.gitignore` are not restored (they were likely excluded from snapshots too)
|
|
76
|
+
- `node_modules/`, build outputs, and other ignored directories are never touched
|
|
77
|
+
- This prevents restore from overwriting environment-specific files
|
|
78
|
+
|
|
79
|
+
### Restore Notification
|
|
80
|
+
|
|
81
|
+
Every restore produces a structured session message:
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
interface RestoreMessage {
|
|
85
|
+
type: "restore";
|
|
86
|
+
snapshotHash: string;
|
|
87
|
+
filesRestored: string[];
|
|
88
|
+
filesSkipped: string[]; // gitignored or binary files
|
|
89
|
+
diff: FileDiff[]; // what actually changed
|
|
90
|
+
description: string; // human-readable summary
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Example output:
|
|
95
|
+
```
|
|
96
|
+
✓ Restored 3 files to state before file_edit on src/db.ts
|
|
97
|
+
- src/db.ts (reverted 12 lines)
|
|
98
|
+
- src/models/user.ts (reverted 5 lines)
|
|
99
|
+
- tests/db.test.ts (reverted 8 lines)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Edge Cases
|
|
103
|
+
|
|
104
|
+
- **File deleted since snapshot:** Restore recreates the file from the snapshot.
|
|
105
|
+
- **File created since snapshot:** Restore does not delete it (conservative approach). User can explicitly request deletion.
|
|
106
|
+
- **File modified by developer AND agent:** Restore overwrites with snapshot state. The safety snapshot preserves the developer's version if needed.
|
|
107
|
+
- **Empty diff:** If restoring would change nothing (current state matches snapshot), skip and notify: "Already at requested state."
|
|
108
|
+
|
|
109
|
+
## Supporting Structures
|
|
110
|
+
|
|
111
|
+
- **Snapshot System (RISE-076)** provides the snapshots that restore operations target
|
|
112
|
+
- **Snapshot Diff (RISE-077)** shows what a restore will change before executing
|
|
113
|
+
- **Session Persistence (RISE-018)** records restore events in session history
|
|
114
|
+
- **Permission System (RISE-074)** may require permission for restore operations (they modify files)
|
|
115
|
+
|
|
116
|
+
## Creative Advancement Scenarios
|
|
117
|
+
|
|
118
|
+
**Scenario 1 — Quick Undo:**
|
|
119
|
+
The agent edits `src/auth.ts` and introduces a regression. The developer immediately types `/undo`. mia-code restores `src/auth.ts` to its pre-edit state in under a second. The session records the undo. The developer asks the agent to try a different approach.
|
|
120
|
+
|
|
121
|
+
**Scenario 2 — Selective File Restore:**
|
|
122
|
+
After a 10-tool-call session, the developer is happy with most changes but wants to revert `config.yml` to its original state. They restore just that file from the session-start snapshot. All other modifications remain intact.
|
|
123
|
+
|
|
124
|
+
**Scenario 3 — Undo the Undo:**
|
|
125
|
+
The developer runs `/undo`, then realizes the original change was actually correct. They run `/undo` again — which restores to the safety snapshot created before the first undo, effectively re-applying the original change. Every restore is reversible.
|
|
126
|
+
|
|
127
|
+
**Scenario 4 — Revert to Pre-Message State:**
|
|
128
|
+
The agent's response to message #5 made sweeping changes across 8 files. The developer wants to undo everything from that message but keep changes from messages #1-4. They run `/revert 5`, which restores to the snapshot captured before message #5's first tool call.
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# RISE-079: Worktree Branch Naming
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/079-worktree-branch-naming.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
Agent-created worktrees get memorable, human-readable names that feel natural in conversation and git logs. Instead of UUIDs or timestamps, branches like `mia-code/swift-falcon` and `mia-code/calm-brook` give each workspace a distinct identity — easy to reference, easy to remember, easy to discuss with teammates.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code has no worktree management, so no branch naming convention exists
|
|
14
|
+
- Developer-created branches typically follow patterns like `feature/ticket-123` or `fix/bug-description`
|
|
15
|
+
- Agent-generated identifiers tend toward UUIDs or timestamps — functional but inhuman
|
|
16
|
+
- No collision detection mechanism exists for programmatically generated branch names
|
|
17
|
+
- No configurable prefix for namespacing agent branches from developer branches
|
|
18
|
+
- Branch cleanup after worktree removal is manual
|
|
19
|
+
|
|
20
|
+
**Desired State:**
|
|
21
|
+
- Worktree branches follow a `{prefix}/{adjective}-{noun}` pattern that is immediately recognizable
|
|
22
|
+
- Curated word pools ensure names are positive, professional, and easy to pronounce
|
|
23
|
+
- Collision detection tries alternative pairs before falling back to numeric suffixes
|
|
24
|
+
- The prefix is configurable (default `mia-code/`) to support team conventions
|
|
25
|
+
- Branch lifecycle is tied to worktree lifecycle — branch is deleted when worktree is removed
|
|
26
|
+
- Names work well in conversation: "check the swift-falcon branch" is natural
|
|
27
|
+
|
|
28
|
+
## Desired Outcome Definition
|
|
29
|
+
|
|
30
|
+
The agent creates a worktree. The naming system randomly selects "swift" from the adjective pool and "falcon" from the noun pool. It verifies no branch `mia-code/swift-falcon` exists and no directory `.mia-code/worktrees/swift-falcon/` exists. The worktree is created with branch `mia-code/swift-falcon`. In git log, the branch is immediately identifiable as agent-created and distinguishable from developer branches.
|
|
31
|
+
|
|
32
|
+
## Natural Language Functional Description
|
|
33
|
+
|
|
34
|
+
### Naming Pattern
|
|
35
|
+
|
|
36
|
+
Branch names follow the pattern: `{prefix}{adjective}-{noun}`
|
|
37
|
+
|
|
38
|
+
- **Default prefix:** `mia-code/`
|
|
39
|
+
- **Separator:** hyphen between adjective and noun
|
|
40
|
+
- **Examples:** `mia-code/swift-falcon`, `mia-code/calm-brook`, `mia-code/bright-cedar`
|
|
41
|
+
|
|
42
|
+
### Adjective Pool
|
|
43
|
+
|
|
44
|
+
Approximately 50 positive, professional adjectives:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
swift, bright, calm, clear, crisp, deep, fair, fast, fine, firm,
|
|
48
|
+
glad, keen, kind, lean, mild, neat, pure, rich, sage, warm,
|
|
49
|
+
wise, bold, cool, deft, dry, apt, free, full, good, hale,
|
|
50
|
+
just, live, new, open, peak, rare, safe, slim, soft, sure,
|
|
51
|
+
tall, tidy, trim, true, vast, wry, able, avid, brave, fresh
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Noun Pool
|
|
55
|
+
|
|
56
|
+
Approximately 50 nature and animal nouns:
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
brook, cedar, crane, dawn, eagle, flame, grove, hawk, jade, lake,
|
|
60
|
+
maple, north, oak, peak, quail, ridge, sage, tide, vale, wave,
|
|
61
|
+
wolf, ash, bay, birch, cliff, cove, dune, elm, fern, finch,
|
|
62
|
+
frost, glade, heron, iris, ivy, knoll, lark, marsh, moss, nest,
|
|
63
|
+
otter, pine, plum, reef, robin, shore, stone, swift, thorn, wren
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Name Generation Algorithm
|
|
67
|
+
|
|
68
|
+
Generate a random adjective-noun pair. Check for collisions (existing branch via `git branch --list`, existing directory, existing worktree). If collision detected, retry with a new random pair (up to 10 attempts). After 10 failures, append an incrementing counter: `mia-code/swift-falcon-2`. With two pools of 50, collision probability is 1/2500 per attempt — practically impossible even with dozens of active worktrees.
|
|
69
|
+
|
|
70
|
+
### Configuration
|
|
71
|
+
|
|
72
|
+
The branch prefix is configurable in `mia-code.json`:
|
|
73
|
+
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"worktree": {
|
|
77
|
+
"branchPrefix": "mia-code/",
|
|
78
|
+
"nameFormat": "adjective-noun"
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Teams can customize the prefix to match their conventions (e.g., `ai/`, `agent/`, `auto/`).
|
|
84
|
+
|
|
85
|
+
### Branch Lifecycle
|
|
86
|
+
|
|
87
|
+
- **Creation:** branch created with `git checkout -b {name}` during worktree setup
|
|
88
|
+
- **Active:** branch tracks all commits made within the worktree
|
|
89
|
+
- **Removal:** branch deleted with `git branch -D {name}` when worktree is removed
|
|
90
|
+
- **Pruning:** `git worktree prune` cleans stale references after removal
|
|
91
|
+
- **Protection:** branches with unmerged commits trigger a warning before deletion
|
|
92
|
+
|
|
93
|
+
### Display
|
|
94
|
+
|
|
95
|
+
When listing worktrees, names are displayed with their creation time and status:
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
Active worktrees:
|
|
99
|
+
● swift-falcon (created 2h ago, 3 commits ahead)
|
|
100
|
+
● calm-brook (created 1d ago, 1 commit ahead)
|
|
101
|
+
○ deep-ridge (created 3d ago, merged)
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Supporting Structures
|
|
105
|
+
|
|
106
|
+
- **Git Worktree Management (RISE-075)** uses this naming system when creating worktrees
|
|
107
|
+
- **Session Persistence (RISE-018)** records which worktree names are associated with which sessions
|
|
108
|
+
- **Multi-Level Config (RISE-064)** provides the `worktree.branchPrefix` configuration
|
|
109
|
+
|
|
110
|
+
## Creative Advancement Scenarios
|
|
111
|
+
|
|
112
|
+
**Scenario 1 — Natural Conversation:**
|
|
113
|
+
Developer: "What's on the swift-falcon branch?" Agent: "In swift-falcon, I implemented the caching optimization — 3 files changed, all tests passing." The name is memorable enough that both human and agent can reference it naturally.
|
|
114
|
+
|
|
115
|
+
**Scenario 2 — Team Visibility:**
|
|
116
|
+
A team runs `git branch -a` and sees `mia-code/calm-brook` alongside `feature/auth-redesign`. The prefix immediately identifies it as agent-created. The adjective-noun format distinguishes it from other agent branches without needing to check metadata.
|
|
117
|
+
|
|
118
|
+
**Scenario 3 — Multiple Active Worktrees:**
|
|
119
|
+
An agent creates three worktrees for parallel exploration. The names — `swift-falcon`, `calm-brook`, `bright-cedar` — are distinct and memorable. The developer can say "merge bright-cedar" without looking up UUIDs or timestamps.
|
|
120
|
+
|
|
121
|
+
**Scenario 4 — Collision Handling:**
|
|
122
|
+
In a long-running project, `swift-falcon` already exists from a previous session. The naming system detects the collision, generates a new pair `keen-maple`, and creates the worktree with that name. No manual intervention needed.
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# RISE-080: SQLite Storage Layer
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/080-sqlite-storage.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
mia-code's persistence moves from fragile JSON file I/O to a proper database — SQLite provides transactional integrity, concurrent access safety, query capabilities, and efficient partial updates. The developer's session data, configuration cache, and project metadata live in a single reliable database file that never corrupts on concurrent writes and never rewrites 10MB of JSON to update one message.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code stores sessions in `~/.mia-code-sessions.json` — a single JSON file holding all session data
|
|
14
|
+
- Every write operation serializes the entire sessions object and overwrites the file
|
|
15
|
+
- Concurrent access (multiple mia-code instances) risks data corruption or loss
|
|
16
|
+
- No query capability — finding sessions by project, date, or model requires loading and scanning everything
|
|
17
|
+
- File size grows unbounded as sessions accumulate — reads become slow
|
|
18
|
+
- No transactional guarantees — a crash mid-write can corrupt the entire file
|
|
19
|
+
- Schema changes require migrating JSON manually with no versioning
|
|
20
|
+
|
|
21
|
+
**Desired State:**
|
|
22
|
+
- SQLite database (`~/.mia-code/data.db`) replaces JSON files as the primary storage layer
|
|
23
|
+
- Normalized tables (sessions, messages, parts) enable efficient queries and partial updates
|
|
24
|
+
- WAL mode allows concurrent reads from multiple instances without blocking
|
|
25
|
+
- Single connection per instance with proper locking prevents corruption
|
|
26
|
+
- Queries filter, sort, and join data without loading everything into memory
|
|
27
|
+
- Schema is versioned with migrations — evolves safely over time
|
|
28
|
+
- File permissions (0o600) protect sensitive session data
|
|
29
|
+
|
|
30
|
+
## Desired Outcome Definition
|
|
31
|
+
|
|
32
|
+
mia-code starts and opens `~/.mia-code/data.db`. On first run, it creates the database with the base schema. If `~/.mia-code-sessions.json` exists, it imports existing sessions (one-time migration). Subsequent operations — creating sessions, appending messages, querying by project — use SQL queries. Two mia-code instances running simultaneously both read and write safely via WAL mode.
|
|
33
|
+
|
|
34
|
+
## Natural Language Functional Description
|
|
35
|
+
|
|
36
|
+
### Database Location
|
|
37
|
+
|
|
38
|
+
The database file lives at `~/.mia-code/data.db`. The directory is created if it doesn't exist. File permissions are set to `0o600` (owner read/write only) to protect session data that may contain code snippets, file contents, and conversation history.
|
|
39
|
+
|
|
40
|
+
### Schema
|
|
41
|
+
|
|
42
|
+
Core tables:
|
|
43
|
+
|
|
44
|
+
```sql
|
|
45
|
+
CREATE TABLE sessions (
|
|
46
|
+
id TEXT PRIMARY KEY,
|
|
47
|
+
project_root TEXT NOT NULL,
|
|
48
|
+
model TEXT,
|
|
49
|
+
provider TEXT,
|
|
50
|
+
created_at INTEGER NOT NULL,
|
|
51
|
+
updated_at INTEGER NOT NULL,
|
|
52
|
+
title TEXT,
|
|
53
|
+
summary TEXT,
|
|
54
|
+
message_count INTEGER DEFAULT 0,
|
|
55
|
+
cost_total REAL DEFAULT 0
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
CREATE TABLE messages (
|
|
59
|
+
id TEXT PRIMARY KEY,
|
|
60
|
+
session_id TEXT NOT NULL REFERENCES sessions(id),
|
|
61
|
+
role TEXT NOT NULL, -- 'user' | 'assistant' | 'system'
|
|
62
|
+
content TEXT,
|
|
63
|
+
created_at INTEGER NOT NULL,
|
|
64
|
+
token_input INTEGER,
|
|
65
|
+
token_output INTEGER,
|
|
66
|
+
cost REAL,
|
|
67
|
+
model TEXT,
|
|
68
|
+
tool_calls TEXT -- JSON array of tool call objects
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
CREATE TABLE parts (
|
|
72
|
+
id TEXT PRIMARY KEY,
|
|
73
|
+
message_id TEXT NOT NULL REFERENCES messages(id),
|
|
74
|
+
type TEXT NOT NULL, -- 'text' | 'tool_call' | 'tool_result'
|
|
75
|
+
content TEXT NOT NULL, -- JSON content
|
|
76
|
+
sequence INTEGER NOT NULL
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
CREATE TABLE projects (
|
|
80
|
+
root TEXT PRIMARY KEY,
|
|
81
|
+
name TEXT,
|
|
82
|
+
last_session_id TEXT,
|
|
83
|
+
last_accessed INTEGER
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
CREATE TABLE config_cache (
|
|
87
|
+
key TEXT PRIMARY KEY,
|
|
88
|
+
value TEXT NOT NULL,
|
|
89
|
+
source TEXT NOT NULL, -- 'global' | 'project' | 'env'
|
|
90
|
+
cached_at INTEGER NOT NULL
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
CREATE INDEX idx_messages_session ON messages(session_id, created_at);
|
|
94
|
+
CREATE INDEX idx_parts_message ON parts(message_id, sequence);
|
|
95
|
+
CREATE INDEX idx_sessions_project ON sessions(project_root, updated_at);
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Query Layer
|
|
99
|
+
|
|
100
|
+
Queries use `better-sqlite3` with TypeScript type definitions mirroring table columns for compile-time safety. Prepared statements with parameterized queries prevent SQL injection.
|
|
101
|
+
|
|
102
|
+
### Connection Management
|
|
103
|
+
|
|
104
|
+
One database connection per mia-code instance. WAL mode (`PRAGMA journal_mode=WAL`) enables concurrent reads without blocking. Writes are serialized. Busy timeout: 5 seconds (`PRAGMA busy_timeout=5000`). Connection closed on process exit via shutdown hook.
|
|
105
|
+
|
|
106
|
+
### Benefits Over JSON
|
|
107
|
+
|
|
108
|
+
Concurrent access safety (WAL vs. file race), partial updates (single row vs. full rewrite), query capabilities (SQL WHERE vs. load-and-filter), ACID transactions, and scalability to GB+ without degradation.
|
|
109
|
+
|
|
110
|
+
### Database Creation
|
|
111
|
+
|
|
112
|
+
On first access: ensure `~/.mia-code/` exists, open connection (creates file if missing), enable WAL mode and busy timeout, apply pending migrations, connection ready.
|
|
113
|
+
|
|
114
|
+
## Supporting Structures
|
|
115
|
+
|
|
116
|
+
- **Database Migrations (RISE-081)** manages schema versioning and evolution
|
|
117
|
+
- **Database Transactions (RISE-082)** provides atomic multi-operation guarantees
|
|
118
|
+
- **Deferred Effects (RISE-083)** ensures side effects only execute after successful commits
|
|
119
|
+
- **Session Persistence (RISE-018)** moves from JSON storage to SQLite queries
|
|
120
|
+
- **Managed Config Directory (RISE-070)** manages the `~/.mia-code/` directory where the database lives
|
|
121
|
+
|
|
122
|
+
## Creative Advancement Scenarios
|
|
123
|
+
|
|
124
|
+
**Scenario 1 — Fast Session Lookup:**
|
|
125
|
+
A developer has 500 sessions across 20 projects. They run `mia-code sessions` in a project directory. SQLite queries `SELECT * FROM sessions WHERE project_root = ? ORDER BY updated_at DESC LIMIT 20` — instant results. The JSON approach would have loaded and scanned the entire 50MB file.
|
|
126
|
+
|
|
127
|
+
**Scenario 2 — Concurrent Instances:**
|
|
128
|
+
Two terminal windows run mia-code in different project directories. Both read and write session data simultaneously. WAL mode ensures reads never block and writes are serialized safely. No data corruption, no lost messages.
|
|
129
|
+
|
|
130
|
+
**Scenario 3 — Efficient Message Append:**
|
|
131
|
+
The agent generates a 100-message session. Each message is an `INSERT INTO messages` — only the new row is written. The JSON approach would have rewritten the entire file 100 times, each time larger than the last.
|
|
132
|
+
|
|
133
|
+
**Scenario 4 — Migration from JSON:**
|
|
134
|
+
A developer upgrades mia-code. On first run, the migration system detects `~/.mia-code-sessions.json`, reads it, inserts all sessions and messages into SQLite, and renames the JSON file to `.mia-code-sessions.json.migrated`. All history is preserved. Subsequent runs use SQLite exclusively.
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# RISE-081: Database Migrations
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/081-database-migrations.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
The database schema evolves safely alongside the codebase. Each schema change is captured in a versioned migration that runs exactly once, in order, within a transaction. Developers never face "database out of sync" errors — mia-code auto-applies pending migrations at startup, and the migration from JSON to SQLite is itself just migration #1.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code uses a JSON file with no schema versioning — the structure is implicit in the code
|
|
14
|
+
- Adding a new field to sessions requires updating serialization code and hoping existing files parse correctly
|
|
15
|
+
- No mechanism exists to transform existing data when the schema changes
|
|
16
|
+
- Downgrading mia-code may break storage compatibility with no recovery path
|
|
17
|
+
- The JSON-to-SQLite transition (RISE-080) requires a one-time data transformation with no framework to support it
|
|
18
|
+
- Schema changes across versions are not tracked — users on older versions face silent data issues
|
|
19
|
+
|
|
20
|
+
**Desired State:**
|
|
21
|
+
- Migrations are ordered files, each with an `up()` function that applies one schema change
|
|
22
|
+
- A `_migrations` table tracks which migrations have been applied and when
|
|
23
|
+
- On startup, mia-code checks the current version and applies any pending migrations in order
|
|
24
|
+
- Each migration runs within a transaction — failure rolls back cleanly, leaving the database in its previous state
|
|
25
|
+
- Migration #1 handles the JSON-to-SQLite import, making the transition a standard migration
|
|
26
|
+
- Migrations are additive — columns are added, not dropped, preserving backward compatibility
|
|
27
|
+
|
|
28
|
+
## Desired Outcome Definition
|
|
29
|
+
|
|
30
|
+
A developer updates mia-code from v1.0 to v1.3. Three new migrations exist (004, 005, 006). On startup, mia-code checks `_migrations`, finds the last applied is 003, and runs 004, 005, 006 in order within transactions. Each succeeds and is recorded. The database now has cost tracking columns (004), snapshot tables (005), and a full-text search index (006). The developer notices nothing — it just works.
|
|
31
|
+
|
|
32
|
+
## Natural Language Functional Description
|
|
33
|
+
|
|
34
|
+
### Migration Structure
|
|
35
|
+
|
|
36
|
+
Each migration is a TypeScript module exporting an `up()` function:
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
// migrations/001_base_tables.ts
|
|
40
|
+
import { Database } from "better-sqlite3";
|
|
41
|
+
|
|
42
|
+
export const version = 1;
|
|
43
|
+
export const description = "Create base tables for sessions, messages, and parts";
|
|
44
|
+
|
|
45
|
+
export function up(db: Database): void {
|
|
46
|
+
db.exec(`
|
|
47
|
+
CREATE TABLE sessions (
|
|
48
|
+
id TEXT PRIMARY KEY,
|
|
49
|
+
project_root TEXT NOT NULL,
|
|
50
|
+
model TEXT,
|
|
51
|
+
created_at INTEGER NOT NULL,
|
|
52
|
+
updated_at INTEGER NOT NULL
|
|
53
|
+
);
|
|
54
|
+
CREATE TABLE messages (
|
|
55
|
+
id TEXT PRIMARY KEY,
|
|
56
|
+
session_id TEXT NOT NULL REFERENCES sessions(id),
|
|
57
|
+
role TEXT NOT NULL,
|
|
58
|
+
content TEXT,
|
|
59
|
+
created_at INTEGER NOT NULL
|
|
60
|
+
);
|
|
61
|
+
`);
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Migration Registry
|
|
66
|
+
|
|
67
|
+
Migrations are registered in order:
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
const migrations = [
|
|
71
|
+
migration_001_base_tables,
|
|
72
|
+
migration_002_json_import,
|
|
73
|
+
migration_003_cost_tracking,
|
|
74
|
+
migration_004_snapshot_tables,
|
|
75
|
+
migration_005_plugin_state,
|
|
76
|
+
migration_006_fulltext_search,
|
|
77
|
+
];
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Tracking Table
|
|
81
|
+
|
|
82
|
+
The `_migrations` table records applied migrations:
|
|
83
|
+
|
|
84
|
+
```sql
|
|
85
|
+
CREATE TABLE IF NOT EXISTS _migrations (
|
|
86
|
+
version INTEGER PRIMARY KEY,
|
|
87
|
+
description TEXT NOT NULL,
|
|
88
|
+
applied_at INTEGER NOT NULL
|
|
89
|
+
);
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Startup Process
|
|
93
|
+
|
|
94
|
+
On every startup:
|
|
95
|
+
|
|
96
|
+
1. Open database connection.
|
|
97
|
+
2. Ensure `_migrations` table exists (bootstrap).
|
|
98
|
+
3. Query: `SELECT MAX(version) FROM _migrations` → current version (or 0 if empty).
|
|
99
|
+
4. Filter migration registry to those with `version > currentVersion`.
|
|
100
|
+
5. For each pending migration, in order:
|
|
101
|
+
a. Begin transaction.
|
|
102
|
+
b. Execute `up(db)`.
|
|
103
|
+
c. Insert into `_migrations`: `{version, description, applied_at: now}`.
|
|
104
|
+
d. Commit transaction.
|
|
105
|
+
e. If any step fails: rollback transaction, log error, abort startup.
|
|
106
|
+
6. Log: "Applied {n} migration(s), database at version {latest}."
|
|
107
|
+
|
|
108
|
+
### Example Migrations
|
|
109
|
+
|
|
110
|
+
- **001 — Base Tables:** Creates `sessions`, `messages`, `parts`, `projects`, `config_cache` tables.
|
|
111
|
+
- **002 — JSON Import:** Reads `~/.mia-code-sessions.json`, imports into SQLite, renames to `.migrated`.
|
|
112
|
+
- **003 — Cost Tracking:** Adds `cost`, `token_input`, `token_output` columns to messages; `cost_total` to sessions.
|
|
113
|
+
- **004 — Snapshot Tables:** Creates `snapshots` and `snapshot_files` tables (RISE-076).
|
|
114
|
+
- **005 — Plugin State:** Creates `plugin_state` table for cross-session plugin data.
|
|
115
|
+
- **006 — Full-Text Search:** Creates FTS5 virtual table on message content.
|
|
116
|
+
|
|
117
|
+
### Safety Principles
|
|
118
|
+
|
|
119
|
+
- **Transactional:** each migration runs in a single transaction — all or nothing.
|
|
120
|
+
- **Ordered:** migrations always apply in version order, never skipping.
|
|
121
|
+
- **Idempotent:** version check prevents re-applying already-applied migrations.
|
|
122
|
+
- **Additive only:** add columns/tables, don't drop them. Use defaults for new columns.
|
|
123
|
+
- **Forward-only:** no `down()` — rollback via database backup, not reverse migrations.
|
|
124
|
+
|
|
125
|
+
### Error Handling
|
|
126
|
+
|
|
127
|
+
If a migration fails, the transaction rolls back, the error is logged, and mia-code refuses to start with an outdated schema. Each migration application is logged with version, description, and success/failure status.
|
|
128
|
+
|
|
129
|
+
## Supporting Structures
|
|
130
|
+
|
|
131
|
+
- **SQLite Storage (RISE-080)** provides the database that migrations operate on
|
|
132
|
+
- **Database Transactions (RISE-082)** ensures each migration is atomic
|
|
133
|
+
- **Structured Logging (RISE-007)** records migration progress and errors
|
|
134
|
+
- **Managed Config Directory (RISE-070)** manages the `~/.mia-code/` directory containing the database
|
|
135
|
+
|
|
136
|
+
## Creative Advancement Scenarios
|
|
137
|
+
|
|
138
|
+
**Scenario 1 — Seamless Upgrade:**
|
|
139
|
+
A developer hasn't updated mia-code in 3 months. They install the latest version. On startup, 5 pending migrations apply automatically in 200ms. Their existing sessions, messages, and configuration are preserved and enhanced with new columns. They never know migrations happened.
|
|
140
|
+
|
|
141
|
+
**Scenario 2 — JSON to SQLite Transition:**
|
|
142
|
+
A long-time user with 200 sessions in JSON upgrades. Migration 002 reads the JSON file, inserts all sessions and messages into SQLite, and archives the JSON. Startup takes 2 seconds for the one-time import. All history is queryable via SQL.
|
|
143
|
+
|
|
144
|
+
**Scenario 3 — Migration Failure Recovery:**
|
|
145
|
+
Migration 005 fails because the database file is read-only (permissions issue). The transaction rolls back. mia-code logs the error and refuses to start. The developer fixes permissions with `chmod 600 ~/.mia-code/data.db` and restarts — migration applies successfully.
|
|
146
|
+
|
|
147
|
+
**Scenario 4 — Development Workflow:**
|
|
148
|
+
A contributor adds a new feature requiring a schema change. They create `migration_007_add_tags.ts`, add it to the registry, and test locally. The migration applies on their dev database. PR review includes the migration file. After merge, all users get the migration on next update.
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# RISE-082: Database Transactions
|
|
2
|
+
|
|
3
|
+
> RISE Framework Specification — Borrowed from OpenCode for mia-code
|
|
4
|
+
> Document: rispecs/borrowed_from_opencode/082-database-transactions.rispec.md
|
|
5
|
+
|
|
6
|
+
## Creative Intent
|
|
7
|
+
|
|
8
|
+
Every multi-step database operation is atomic — either all changes commit or none do. Paired with deferred effects, transactions ensure that the system never publishes events about data that wasn't persisted, never leaves partial session state, and never corrupts the database from a crash mid-operation. The developer's session data maintains perfect consistency.
|
|
9
|
+
|
|
10
|
+
## Structural Tension Analysis
|
|
11
|
+
|
|
12
|
+
**Current Reality:**
|
|
13
|
+
- mia-code writes to JSON by serializing the entire object — no transactional guarantees
|
|
14
|
+
- A crash during JSON write can corrupt the entire sessions file
|
|
15
|
+
- Creating a session and adding its first message are separate operations — failure between them leaves orphaned data
|
|
16
|
+
- Events (if they existed) would fire before data is confirmed persisted
|
|
17
|
+
- No mechanism to group related operations into an atomic unit
|
|
18
|
+
- Concurrent writes from multiple instances can interleave, producing inconsistent state
|
|
19
|
+
|
|
20
|
+
**Desired State:**
|
|
21
|
+
- Related database operations are grouped in transactions that commit or rollback atomically
|
|
22
|
+
- Side effects (event publishing, notifications) are deferred until after successful commit
|
|
23
|
+
- Nested operations use savepoints for fine-grained control within a larger transaction
|
|
24
|
+
- Read-only transactions provide consistent snapshots without write locks
|
|
25
|
+
- Lock management coordinates cross-process operations when needed
|
|
26
|
+
- A crash at any point during a transaction leaves the database in its pre-transaction state
|
|
27
|
+
|
|
28
|
+
## Desired Outcome Definition
|
|
29
|
+
|
|
30
|
+
Creating a new session involves inserting into `sessions`, creating the initial message, updating the `projects` table, and publishing a `session.created` event. All four operations happen within a transaction. If the message insert fails, the session insert is rolled back too. The event only fires after all inserts succeed and the transaction commits. The database is never in a state where a session exists without its initial message.
|
|
31
|
+
|
|
32
|
+
## Natural Language Functional Description
|
|
33
|
+
|
|
34
|
+
### Transaction Pattern
|
|
35
|
+
|
|
36
|
+
The primary transaction API wraps operations in an async callback:
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
await db.transaction(async (tx) => {
|
|
40
|
+
// All operations within are atomic
|
|
41
|
+
await tx.run(
|
|
42
|
+
"INSERT INTO sessions (id, project_root, created_at, updated_at) VALUES (?, ?, ?, ?)",
|
|
43
|
+
[id, root, now, now]
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
await tx.run(
|
|
47
|
+
"INSERT INTO messages (id, session_id, role, content, created_at) VALUES (?, ?, ?, ?, ?)",
|
|
48
|
+
[msgId, id, "system", systemPrompt, now]
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
// Side effects are deferred — only execute after commit
|
|
52
|
+
tx.effect(() => {
|
|
53
|
+
Bus.publish("session.created", { id, root });
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
// At this point: both inserts committed, event published
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
If any operation within the callback throws, the entire transaction is rolled back and the effects are discarded.
|
|
60
|
+
|
|
61
|
+
### Atomic Guarantees
|
|
62
|
+
|
|
63
|
+
Within a transaction:
|
|
64
|
+
- **All or nothing:** either every `INSERT`, `UPDATE`, `DELETE` commits, or none do.
|
|
65
|
+
- **Isolation:** concurrent reads see the pre-transaction state until commit.
|
|
66
|
+
- **Durability:** once committed, data survives process crashes (SQLite's WAL guarantees).
|
|
67
|
+
- **Consistency:** foreign key constraints and check constraints are enforced at commit.
|
|
68
|
+
|
|
69
|
+
### Deferred Effects
|
|
70
|
+
|
|
71
|
+
Side effects registered with `tx.effect()` are queued during the transaction and executed only after successful commit. See RISE-083 for full details. Key properties:
|
|
72
|
+
|
|
73
|
+
- Effects execute in registration order.
|
|
74
|
+
- Effects run outside the transaction — they cannot cause rollback.
|
|
75
|
+
- If the transaction rolls back, effects are silently discarded.
|
|
76
|
+
- Common effects: event bus publishing, cache invalidation, file operations.
|
|
77
|
+
|
|
78
|
+
### Nested Transactions (Savepoints)
|
|
79
|
+
|
|
80
|
+
For complex operations with sub-operations that may independently fail:
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
await db.transaction(async (tx) => {
|
|
84
|
+
await tx.run("INSERT INTO sessions ...");
|
|
85
|
+
|
|
86
|
+
try {
|
|
87
|
+
await tx.savepoint(async (sp) => {
|
|
88
|
+
await sp.run("INSERT INTO optional_metadata ...");
|
|
89
|
+
// If this fails, only the savepoint rolls back
|
|
90
|
+
});
|
|
91
|
+
} catch {
|
|
92
|
+
// Savepoint rolled back, but outer transaction continues
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
await tx.run("INSERT INTO messages ...");
|
|
96
|
+
// Session and message commit even if metadata failed
|
|
97
|
+
});
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Read Transactions
|
|
101
|
+
|
|
102
|
+
`db.read(async (tx) => { ... })` provides consistent reads using SQLite's snapshot isolation — all queries within see the same database state, even if writes occur concurrently. No write lock is acquired.
|
|
103
|
+
|
|
104
|
+
### Lock Management
|
|
105
|
+
|
|
106
|
+
`db.lock(key, callback)` provides cross-process coordination using advisory locking. Only one process holds a given lock at a time. Lock timeout is configurable (default 5 seconds).
|
|
107
|
+
|
|
108
|
+
### Error Handling
|
|
109
|
+
|
|
110
|
+
If any operation within a transaction throws, the entire transaction rolls back automatically, no effects execute, and the error propagates to the caller. The database remains in its pre-transaction state.
|
|
111
|
+
|
|
112
|
+
### Common Transaction Patterns
|
|
113
|
+
|
|
114
|
+
- **Session creation:** INSERT session + INSERT initial message + UPDATE project → effect: publish `session.created`
|
|
115
|
+
- **Message append:** INSERT message + INSERT parts + UPDATE session.updated_at → effect: publish `message.added`
|
|
116
|
+
- **Session deletion:** DELETE parts + DELETE messages + DELETE session → effect: publish `session.deleted`, invalidate cache
|
|
117
|
+
|
|
118
|
+
## Supporting Structures
|
|
119
|
+
|
|
120
|
+
- **SQLite Storage (RISE-080)** provides the database connection that transactions operate on
|
|
121
|
+
- **Deferred Effects (RISE-083)** implements the `tx.effect()` mechanism in detail
|
|
122
|
+
- **Database Migrations (RISE-081)** uses transactions to ensure each migration is atomic
|
|
123
|
+
- **Event Bus (RISE-002)** receives events published by deferred effects after commit
|
|
124
|
+
- **Session Persistence (RISE-018)** uses transactions for all session read/write operations
|
|
125
|
+
|
|
126
|
+
## Creative Advancement Scenarios
|
|
127
|
+
|
|
128
|
+
**Scenario 1 — Crash-Safe Session Creation:**
|
|
129
|
+
mia-code creates a session with 3 related inserts. The process is killed mid-transaction (power failure, OOM kill). On restart, the database is in its pre-transaction state — no orphaned sessions, no partial data. The user starts a new session cleanly.
|
|
130
|
+
|
|
131
|
+
**Scenario 2 — Event Consistency:**
|
|
132
|
+
A session is created within a transaction. The `session.created` event is deferred. If the message insert fails, the transaction rolls back and the event never fires. No subscriber (UI, logger, plugin) ever learns about a session that doesn't exist in the database.
|
|
133
|
+
|
|
134
|
+
**Scenario 3 — Concurrent Instance Safety:**
|
|
135
|
+
Two mia-code instances write to the same database. Instance A creates a session while instance B appends a message to a different session. SQLite serializes the writes. Both transactions commit successfully. Neither instance sees partial state from the other.
|
|
136
|
+
|
|
137
|
+
**Scenario 4 — Graceful Degradation:**
|
|
138
|
+
A plugin's `session.create` hook (RISE-072) throws an error during a transaction's deferred effect. The transaction already committed — session data is safe. The effect error is logged. The plugin is notified of its failure. The user's session is unaffected.
|