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,326 @@
|
|
|
1
|
+
> ## Documentation Index
|
|
2
|
+
> Fetch the complete documentation index at: https://docs.langchain.com/llms.txt
|
|
3
|
+
> Use this file to discover all available pages before exploring further.
|
|
4
|
+
|
|
5
|
+
# Human-in-the-loop
|
|
6
|
+
|
|
7
|
+
The Human-in-the-Loop (HITL) [middleware](/oss/python/langchain/middleware/built-in#human-in-the-loop) lets you add human oversight to agent tool calls.
|
|
8
|
+
When a model proposes an action that might require review — for example, writing to a file or executing SQL — the middleware can pause execution and wait for a decision.
|
|
9
|
+
|
|
10
|
+
It does this by checking each tool call against a configurable policy. If intervention is needed, the middleware issues an [interrupt](https://reference.langchain.com/python/langgraph/types/#langgraph.types.interrupt) that halts execution. The graph state is saved using LangGraph's [persistence layer](/oss/python/langgraph/persistence), so execution can pause safely and resume later.
|
|
11
|
+
|
|
12
|
+
A human decision then determines what happens next: the action can be approved as-is (`approve`), modified before running (`edit`), or rejected with feedback (`reject`).
|
|
13
|
+
|
|
14
|
+
## Interrupt decision types
|
|
15
|
+
|
|
16
|
+
The [middleware](/oss/python/langchain/middleware/built-in#human-in-the-loop) defines three built-in ways a human can respond to an interrupt:
|
|
17
|
+
|
|
18
|
+
| Decision Type | Description | Example Use Case |
|
|
19
|
+
| ------------- | ------------------------------------------------------------------------- | --------------------------------------------------- |
|
|
20
|
+
| ✅ `approve` | The action is approved as-is and executed without changes. | Send an email draft exactly as written |
|
|
21
|
+
| ✏️ `edit` | The tool call is executed with modifications. | Change the recipient before sending an email |
|
|
22
|
+
| ❌ `reject` | The tool call is rejected, with an explanation added to the conversation. | Reject an email draft and explain how to rewrite it |
|
|
23
|
+
|
|
24
|
+
The available decision types for each tool depend on the policy you configure in `interrupt_on`.
|
|
25
|
+
When multiple tool calls are paused at the same time, each action requires a separate decision.
|
|
26
|
+
Decisions must be provided in the same order as the actions appear in the interrupt request.
|
|
27
|
+
|
|
28
|
+
<Tip>
|
|
29
|
+
When **editing** tool arguments, make changes conservatively. Significant modifications to the original arguments may cause the model to re-evaluate its approach and potentially execute the tool multiple times or take unexpected actions.
|
|
30
|
+
</Tip>
|
|
31
|
+
|
|
32
|
+
## Configuring interrupts
|
|
33
|
+
|
|
34
|
+
To use HITL, add the [middleware](/oss/python/langchain/middleware/built-in#human-in-the-loop) to the agent's `middleware` list when creating the agent.
|
|
35
|
+
|
|
36
|
+
You configure it with a mapping of tool actions to the decision types that are allowed for each action. The middleware will interrupt execution when a tool call matches an action in the mapping.
|
|
37
|
+
|
|
38
|
+
```python theme={null}
|
|
39
|
+
from langchain.agents import create_agent
|
|
40
|
+
from langchain.agents.middleware import HumanInTheLoopMiddleware # [!code highlight]
|
|
41
|
+
from langgraph.checkpoint.memory import InMemorySaver # [!code highlight]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
agent = create_agent(
|
|
45
|
+
model="gpt-4.1",
|
|
46
|
+
tools=[write_file_tool, execute_sql_tool, read_data_tool],
|
|
47
|
+
middleware=[
|
|
48
|
+
HumanInTheLoopMiddleware( # [!code highlight]
|
|
49
|
+
interrupt_on={
|
|
50
|
+
"write_file": True, # All decisions (approve, edit, reject) allowed
|
|
51
|
+
"execute_sql": {"allowed_decisions": ["approve", "reject"]}, # No editing allowed
|
|
52
|
+
# Safe operation, no approval needed
|
|
53
|
+
"read_data": False,
|
|
54
|
+
},
|
|
55
|
+
# Prefix for interrupt messages - combined with tool name and args to form the full message
|
|
56
|
+
# e.g., "Tool execution pending approval: execute_sql with query='DELETE FROM...'"
|
|
57
|
+
# Individual tools can override this by specifying a "description" in their interrupt config
|
|
58
|
+
description_prefix="Tool execution pending approval",
|
|
59
|
+
),
|
|
60
|
+
],
|
|
61
|
+
# Human-in-the-loop requires checkpointing to handle interrupts.
|
|
62
|
+
# In production, use a persistent checkpointer like AsyncPostgresSaver.
|
|
63
|
+
checkpointer=InMemorySaver(), # [!code highlight]
|
|
64
|
+
)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
<Info>
|
|
68
|
+
You must configure a checkpointer to persist the graph state across interrupts.
|
|
69
|
+
In production, use a persistent checkpointer like [`AsyncPostgresSaver`](https://reference.langchain.com/python/langgraph/checkpoints/#langgraph.checkpoint.postgres.aio.AsyncPostgresSaver). For testing or prototyping, use [`InMemorySaver`](https://reference.langchain.com/python/langgraph/checkpoints/#langgraph.checkpoint.memory.InMemorySaver).
|
|
70
|
+
|
|
71
|
+
When invoking the agent, pass a `config` that includes the **thread ID** to associate execution with a conversation thread.
|
|
72
|
+
See the [LangGraph interrupts documentation](/oss/python/langgraph/interrupts) for details.
|
|
73
|
+
</Info>
|
|
74
|
+
|
|
75
|
+
<Accordion title="Configuration options">
|
|
76
|
+
<ParamField body="interrupt_on" type="dict" required>
|
|
77
|
+
Mapping of tool names to approval configs. Values can be `True` (interrupt with default config), `False` (auto-approve), or an `InterruptOnConfig` object.
|
|
78
|
+
</ParamField>
|
|
79
|
+
|
|
80
|
+
<ParamField body="description_prefix" type="string" default="Tool execution requires approval">
|
|
81
|
+
Prefix for action request descriptions
|
|
82
|
+
</ParamField>
|
|
83
|
+
|
|
84
|
+
**`InterruptOnConfig` options:**
|
|
85
|
+
|
|
86
|
+
<ParamField body="allowed_decisions" type="list[string]">
|
|
87
|
+
List of allowed decisions: `'approve'`, `'edit'`, or `'reject'`
|
|
88
|
+
</ParamField>
|
|
89
|
+
|
|
90
|
+
<ParamField body="description" type="string | callable">
|
|
91
|
+
Static string or callable function for custom description
|
|
92
|
+
</ParamField>
|
|
93
|
+
</Accordion>
|
|
94
|
+
|
|
95
|
+
## Responding to interrupts
|
|
96
|
+
|
|
97
|
+
When you invoke the agent, it runs until it either completes or an interrupt is raised. An interrupt is triggered when a tool call matches the policy you configured in `interrupt_on`. In that case, the invocation result will include an `__interrupt__` field with the actions that require review. You can then present those actions to a reviewer and resume execution once decisions are provided.
|
|
98
|
+
|
|
99
|
+
```python theme={null}
|
|
100
|
+
from langgraph.types import Command
|
|
101
|
+
|
|
102
|
+
# Human-in-the-loop leverages LangGraph's persistence layer.
|
|
103
|
+
# You must provide a thread ID to associate the execution with a conversation thread,
|
|
104
|
+
# so the conversation can be paused and resumed (as is needed for human review).
|
|
105
|
+
config = {"configurable": {"thread_id": "some_id"}} # [!code highlight]
|
|
106
|
+
# Run the graph until the interrupt is hit.
|
|
107
|
+
result = agent.invoke(
|
|
108
|
+
{
|
|
109
|
+
"messages": [
|
|
110
|
+
{
|
|
111
|
+
"role": "user",
|
|
112
|
+
"content": "Delete old records from the database",
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
config=config # [!code highlight]
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
# The interrupt contains the full HITL request with action_requests and review_configs
|
|
120
|
+
print(result['__interrupt__'])
|
|
121
|
+
# > [
|
|
122
|
+
# > Interrupt(
|
|
123
|
+
# > value={
|
|
124
|
+
# > 'action_requests': [
|
|
125
|
+
# > {
|
|
126
|
+
# > 'name': 'execute_sql',
|
|
127
|
+
# > 'arguments': {'query': 'DELETE FROM records WHERE created_at < NOW() - INTERVAL \'30 days\';'},
|
|
128
|
+
# > 'description': 'Tool execution pending approval\n\nTool: execute_sql\nArgs: {...}'
|
|
129
|
+
# > }
|
|
130
|
+
# > ],
|
|
131
|
+
# > 'review_configs': [
|
|
132
|
+
# > {
|
|
133
|
+
# > 'action_name': 'execute_sql',
|
|
134
|
+
# > 'allowed_decisions': ['approve', 'reject']
|
|
135
|
+
# > }
|
|
136
|
+
# > ]
|
|
137
|
+
# > }
|
|
138
|
+
# > )
|
|
139
|
+
# > ]
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
# Resume with approval decision
|
|
143
|
+
agent.invoke(
|
|
144
|
+
Command( # [!code highlight]
|
|
145
|
+
resume={"decisions": [{"type": "approve"}]} # or "reject" [!code highlight]
|
|
146
|
+
), # [!code highlight]
|
|
147
|
+
config=config # Same thread ID to resume the paused conversation
|
|
148
|
+
)
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Decision types
|
|
152
|
+
|
|
153
|
+
<Tabs>
|
|
154
|
+
<Tab title="✅ approve">
|
|
155
|
+
Use `approve` to approve the tool call as-is and execute it without changes.
|
|
156
|
+
|
|
157
|
+
```python theme={null}
|
|
158
|
+
agent.invoke(
|
|
159
|
+
Command(
|
|
160
|
+
# Decisions are provided as a list, one per action under review.
|
|
161
|
+
# The order of decisions must match the order of actions
|
|
162
|
+
# listed in the `__interrupt__` request.
|
|
163
|
+
resume={
|
|
164
|
+
"decisions": [
|
|
165
|
+
{
|
|
166
|
+
"type": "approve",
|
|
167
|
+
}
|
|
168
|
+
]
|
|
169
|
+
}
|
|
170
|
+
),
|
|
171
|
+
config=config # Same thread ID to resume the paused conversation
|
|
172
|
+
)
|
|
173
|
+
```
|
|
174
|
+
</Tab>
|
|
175
|
+
|
|
176
|
+
<Tab title="✏️ edit">
|
|
177
|
+
Use `edit` to modify the tool call before execution.
|
|
178
|
+
Provide the edited action with the new tool name and arguments.
|
|
179
|
+
|
|
180
|
+
```python theme={null}
|
|
181
|
+
agent.invoke(
|
|
182
|
+
Command(
|
|
183
|
+
# Decisions are provided as a list, one per action under review.
|
|
184
|
+
# The order of decisions must match the order of actions
|
|
185
|
+
# listed in the `__interrupt__` request.
|
|
186
|
+
resume={
|
|
187
|
+
"decisions": [
|
|
188
|
+
{
|
|
189
|
+
"type": "edit",
|
|
190
|
+
# Edited action with tool name and args
|
|
191
|
+
"edited_action": {
|
|
192
|
+
# Tool name to call.
|
|
193
|
+
# Will usually be the same as the original action.
|
|
194
|
+
"name": "new_tool_name",
|
|
195
|
+
# Arguments to pass to the tool.
|
|
196
|
+
"args": {"key1": "new_value", "key2": "original_value"},
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
]
|
|
200
|
+
}
|
|
201
|
+
),
|
|
202
|
+
config=config # Same thread ID to resume the paused conversation
|
|
203
|
+
)
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
<Tip>
|
|
207
|
+
When **editing** tool arguments, make changes conservatively. Significant modifications to the original arguments may cause the model to re-evaluate its approach and potentially execute the tool multiple times or take unexpected actions.
|
|
208
|
+
</Tip>
|
|
209
|
+
</Tab>
|
|
210
|
+
|
|
211
|
+
<Tab title="❌ reject">
|
|
212
|
+
Use `reject` to reject the tool call and provide feedback instead of execution.
|
|
213
|
+
|
|
214
|
+
```python theme={null}
|
|
215
|
+
agent.invoke(
|
|
216
|
+
Command(
|
|
217
|
+
# Decisions are provided as a list, one per action under review.
|
|
218
|
+
# The order of decisions must match the order of actions
|
|
219
|
+
# listed in the `__interrupt__` request.
|
|
220
|
+
resume={
|
|
221
|
+
"decisions": [
|
|
222
|
+
{
|
|
223
|
+
"type": "reject",
|
|
224
|
+
# An explanation about why the action was rejected
|
|
225
|
+
"message": "No, this is wrong because ..., instead do this ...",
|
|
226
|
+
}
|
|
227
|
+
]
|
|
228
|
+
}
|
|
229
|
+
),
|
|
230
|
+
config=config # Same thread ID to resume the paused conversation
|
|
231
|
+
)
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
The `message` is added to the conversation as feedback to help the agent understand why the action was rejected and what it should do instead.
|
|
235
|
+
|
|
236
|
+
***
|
|
237
|
+
|
|
238
|
+
### Multiple decisions
|
|
239
|
+
|
|
240
|
+
When multiple actions are under review, provide a decision for each action in the same order as they appear in the interrupt:
|
|
241
|
+
|
|
242
|
+
```python theme={null}
|
|
243
|
+
{
|
|
244
|
+
"decisions": [
|
|
245
|
+
{"type": "approve"},
|
|
246
|
+
{
|
|
247
|
+
"type": "edit",
|
|
248
|
+
"edited_action": {
|
|
249
|
+
"name": "tool_name",
|
|
250
|
+
"args": {"param": "new_value"}
|
|
251
|
+
}
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
"type": "reject",
|
|
255
|
+
"message": "This action is not allowed"
|
|
256
|
+
}
|
|
257
|
+
]
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
</Tab>
|
|
261
|
+
</Tabs>
|
|
262
|
+
|
|
263
|
+
## Streaming with human-in-the-loop
|
|
264
|
+
|
|
265
|
+
You can use `stream()` instead of `invoke()` to get real-time updates while the agent runs and handles interrupts. Use `stream_mode=['updates', 'messages']` to stream both agent progress and LLM tokens.
|
|
266
|
+
|
|
267
|
+
```python theme={null}
|
|
268
|
+
from langgraph.types import Command
|
|
269
|
+
|
|
270
|
+
config = {"configurable": {"thread_id": "some_id"}}
|
|
271
|
+
|
|
272
|
+
# Stream agent progress and LLM tokens until interrupt
|
|
273
|
+
for mode, chunk in agent.stream(
|
|
274
|
+
{"messages": [{"role": "user", "content": "Delete old records from the database"}]},
|
|
275
|
+
config=config,
|
|
276
|
+
stream_mode=["updates", "messages"], # [!code highlight]
|
|
277
|
+
):
|
|
278
|
+
if mode == "messages":
|
|
279
|
+
# LLM token
|
|
280
|
+
token, metadata = chunk
|
|
281
|
+
if token.content:
|
|
282
|
+
print(token.content, end="", flush=True)
|
|
283
|
+
elif mode == "updates":
|
|
284
|
+
# Check for interrupt
|
|
285
|
+
if "__interrupt__" in chunk:
|
|
286
|
+
print(f"\n\nInterrupt: {chunk['__interrupt__']}")
|
|
287
|
+
|
|
288
|
+
# Resume with streaming after human decision
|
|
289
|
+
for mode, chunk in agent.stream(
|
|
290
|
+
Command(resume={"decisions": [{"type": "approve"}]}),
|
|
291
|
+
config=config,
|
|
292
|
+
stream_mode=["updates", "messages"],
|
|
293
|
+
):
|
|
294
|
+
if mode == "messages":
|
|
295
|
+
token, metadata = chunk
|
|
296
|
+
if token.content:
|
|
297
|
+
print(token.content, end="", flush=True)
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
See the [Streaming](/oss/python/langchain/streaming) guide for more details on stream modes.
|
|
301
|
+
|
|
302
|
+
## Execution lifecycle
|
|
303
|
+
|
|
304
|
+
The middleware defines an `after_model` hook that runs after the model generates a response but before any tool calls are executed:
|
|
305
|
+
|
|
306
|
+
1. The agent invokes the model to generate a response.
|
|
307
|
+
2. The middleware inspects the response for tool calls.
|
|
308
|
+
3. If any calls require human input, the middleware builds a `HITLRequest` with `action_requests` and `review_configs` and calls [interrupt](https://reference.langchain.com/python/langgraph/types/#langgraph.types.interrupt).
|
|
309
|
+
4. The agent waits for human decisions.
|
|
310
|
+
5. Based on the `HITLResponse` decisions, the middleware executes approved or edited calls, synthesizes [ToolMessage](https://reference.langchain.com/python/langchain/messages/#langchain.messages.ToolMessage)'s for rejected calls, and resumes execution.
|
|
311
|
+
|
|
312
|
+
## Custom HITL logic
|
|
313
|
+
|
|
314
|
+
For more specialized workflows, you can build custom HITL logic directly using the [interrupt](https://reference.langchain.com/python/langgraph/types/#langgraph.types.interrupt) primitive and [middleware](/oss/python/langchain/middleware) abstraction.
|
|
315
|
+
|
|
316
|
+
Review the [execution lifecycle](#execution-lifecycle) above to understand how to integrate interrupts into the agent's operation.
|
|
317
|
+
|
|
318
|
+
***
|
|
319
|
+
|
|
320
|
+
<Callout icon="pen-to-square" iconType="regular">
|
|
321
|
+
[Edit this page on GitHub](https://github.com/langchain-ai/docs/edit/main/src/oss/langchain/human-in-the-loop.mdx) or [file an issue](https://github.com/langchain-ai/docs/issues/new/choose).
|
|
322
|
+
</Callout>
|
|
323
|
+
|
|
324
|
+
<Tip icon="terminal" iconType="regular">
|
|
325
|
+
[Connect these docs](/use-these-docs) to Claude, VSCode, and more via MCP for real-time answers.
|
|
326
|
+
</Tip>
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
> ## Documentation Index
|
|
2
|
+
> Fetch the complete documentation index at: https://docs.langchain.com/llms.txt
|
|
3
|
+
> Use this file to discover all available pages before exploring further.
|
|
4
|
+
|
|
5
|
+
# Long-term memory
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
LangChain agents use [LangGraph persistence](/oss/python/langgraph/persistence#memory-store) to enable long-term memory. This is a more advanced topic and requires knowledge of LangGraph to use.
|
|
10
|
+
|
|
11
|
+
## Memory storage
|
|
12
|
+
|
|
13
|
+
LangGraph stores long-term memories as JSON documents in a [store](/oss/python/langgraph/persistence#memory-store).
|
|
14
|
+
|
|
15
|
+
Each memory is organized under a custom `namespace` (similar to a folder) and a distinct `key` (like a file name). Namespaces often include user or org IDs or other labels that makes it easier to organize information.
|
|
16
|
+
|
|
17
|
+
This structure enables hierarchical organization of memories. Cross-namespace searching is then supported through content filters.
|
|
18
|
+
|
|
19
|
+
```python theme={null}
|
|
20
|
+
from langgraph.store.memory import InMemoryStore
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def embed(texts: list[str]) -> list[list[float]]:
|
|
24
|
+
# Replace with an actual embedding function or LangChain embeddings object
|
|
25
|
+
return [[1.0, 2.0] * len(texts)]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# InMemoryStore saves data to an in-memory dictionary. Use a DB-backed store in production use.
|
|
29
|
+
store = InMemoryStore(index={"embed": embed, "dims": 2}) # [!code highlight]
|
|
30
|
+
user_id = "my-user"
|
|
31
|
+
application_context = "chitchat"
|
|
32
|
+
namespace = (user_id, application_context) # [!code highlight]
|
|
33
|
+
store.put( # [!code highlight]
|
|
34
|
+
namespace,
|
|
35
|
+
"a-memory",
|
|
36
|
+
{
|
|
37
|
+
"rules": [
|
|
38
|
+
"User likes short, direct language",
|
|
39
|
+
"User only speaks English & python",
|
|
40
|
+
],
|
|
41
|
+
"my-key": "my-value",
|
|
42
|
+
},
|
|
43
|
+
)
|
|
44
|
+
# get the "memory" by ID
|
|
45
|
+
item = store.get(namespace, "a-memory") # [!code highlight]
|
|
46
|
+
# search for "memories" within this namespace, filtering on content equivalence, sorted by vector similarity
|
|
47
|
+
items = store.search( # [!code highlight]
|
|
48
|
+
namespace, filter={"my-key": "my-value"}, query="language preferences"
|
|
49
|
+
)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
For more information about the memory store, see the [Persistence](/oss/python/langgraph/persistence#memory-store) guide.
|
|
53
|
+
|
|
54
|
+
## Read long-term memory in tools
|
|
55
|
+
|
|
56
|
+
```python A tool the agent can use to look up user information theme={null}
|
|
57
|
+
from dataclasses import dataclass
|
|
58
|
+
|
|
59
|
+
from langchain_core.runnables import RunnableConfig
|
|
60
|
+
from langchain.agents import create_agent
|
|
61
|
+
from langchain.tools import tool, ToolRuntime
|
|
62
|
+
from langgraph.store.memory import InMemoryStore
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@dataclass
|
|
66
|
+
class Context:
|
|
67
|
+
user_id: str
|
|
68
|
+
|
|
69
|
+
# InMemoryStore saves data to an in-memory dictionary. Use a DB-backed store in production.
|
|
70
|
+
store = InMemoryStore() # [!code highlight]
|
|
71
|
+
|
|
72
|
+
# Write sample data to the store using the put method
|
|
73
|
+
store.put( # [!code highlight]
|
|
74
|
+
("users",), # Namespace to group related data together (users namespace for user data)
|
|
75
|
+
"user_123", # Key within the namespace (user ID as key)
|
|
76
|
+
{
|
|
77
|
+
"name": "John Smith",
|
|
78
|
+
"language": "English",
|
|
79
|
+
} # Data to store for the given user
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
@tool
|
|
83
|
+
def get_user_info(runtime: ToolRuntime[Context]) -> str:
|
|
84
|
+
"""Look up user info."""
|
|
85
|
+
# Access the store - same as that provided to `create_agent`
|
|
86
|
+
store = runtime.store # [!code highlight]
|
|
87
|
+
user_id = runtime.context.user_id
|
|
88
|
+
# Retrieve data from store - returns StoreValue object with value and metadata
|
|
89
|
+
user_info = store.get(("users",), user_id) # [!code highlight]
|
|
90
|
+
return str(user_info.value) if user_info else "Unknown user"
|
|
91
|
+
|
|
92
|
+
agent = create_agent(
|
|
93
|
+
model="claude-sonnet-4-5-20250929",
|
|
94
|
+
tools=[get_user_info],
|
|
95
|
+
# Pass store to agent - enables agent to access store when running tools
|
|
96
|
+
store=store, # [!code highlight]
|
|
97
|
+
context_schema=Context
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
# Run the agent
|
|
101
|
+
agent.invoke(
|
|
102
|
+
{"messages": [{"role": "user", "content": "look up user information"}]},
|
|
103
|
+
context=Context(user_id="user_123") # [!code highlight]
|
|
104
|
+
)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
<a id="write-long-term" />
|
|
108
|
+
|
|
109
|
+
## Write long-term memory from tools
|
|
110
|
+
|
|
111
|
+
```python Example of a tool that updates user information theme={null}
|
|
112
|
+
from dataclasses import dataclass
|
|
113
|
+
from typing_extensions import TypedDict
|
|
114
|
+
|
|
115
|
+
from langchain.agents import create_agent
|
|
116
|
+
from langchain.tools import tool, ToolRuntime
|
|
117
|
+
from langgraph.store.memory import InMemoryStore
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
# InMemoryStore saves data to an in-memory dictionary. Use a DB-backed store in production.
|
|
121
|
+
store = InMemoryStore() # [!code highlight]
|
|
122
|
+
|
|
123
|
+
@dataclass
|
|
124
|
+
class Context:
|
|
125
|
+
user_id: str
|
|
126
|
+
|
|
127
|
+
# TypedDict defines the structure of user information for the LLM
|
|
128
|
+
class UserInfo(TypedDict):
|
|
129
|
+
name: str
|
|
130
|
+
|
|
131
|
+
# Tool that allows agent to update user information (useful for chat applications)
|
|
132
|
+
@tool
|
|
133
|
+
def save_user_info(user_info: UserInfo, runtime: ToolRuntime[Context]) -> str:
|
|
134
|
+
"""Save user info."""
|
|
135
|
+
# Access the store - same as that provided to `create_agent`
|
|
136
|
+
store = runtime.store # [!code highlight]
|
|
137
|
+
user_id = runtime.context.user_id # [!code highlight]
|
|
138
|
+
# Store data in the store (namespace, key, data)
|
|
139
|
+
store.put(("users",), user_id, user_info) # [!code highlight]
|
|
140
|
+
return "Successfully saved user info."
|
|
141
|
+
|
|
142
|
+
agent = create_agent(
|
|
143
|
+
model="claude-sonnet-4-5-20250929",
|
|
144
|
+
tools=[save_user_info],
|
|
145
|
+
store=store, # [!code highlight]
|
|
146
|
+
context_schema=Context
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
# Run the agent
|
|
150
|
+
agent.invoke(
|
|
151
|
+
{"messages": [{"role": "user", "content": "My name is John Smith"}]},
|
|
152
|
+
# user_id passed in context to identify whose information is being updated
|
|
153
|
+
context=Context(user_id="user_123") # [!code highlight]
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
# You can access the store directly to get the value
|
|
157
|
+
store.get(("users",), "user_123").value
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
***
|
|
161
|
+
|
|
162
|
+
<Callout icon="pen-to-square" iconType="regular">
|
|
163
|
+
[Edit this page on GitHub](https://github.com/langchain-ai/docs/edit/main/src/oss/langchain/long-term-memory.mdx) or [file an issue](https://github.com/langchain-ai/docs/issues/new/choose).
|
|
164
|
+
</Callout>
|
|
165
|
+
|
|
166
|
+
<Tip icon="terminal" iconType="regular">
|
|
167
|
+
[Connect these docs](/use-these-docs) to Claude, VSCode, and more via MCP for real-time answers.
|
|
168
|
+
</Tip>
|