mixdog 0.9.3 → 0.9.5
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/README.md +112 -38
- package/package.json +10 -3
- package/scripts/bench/lead-review-tasks-r3.json +20 -0
- package/scripts/bench/lead-review-tasks.json +20 -0
- package/scripts/bench/r4-mixed-tasks.json +20 -0
- package/scripts/bench/r5-orchestrated-task.json +7 -0
- package/scripts/bench/review-tasks.json +20 -0
- package/scripts/bench/round-codex.json +114 -0
- package/scripts/bench/round-mixdog-lead-r3.json +269 -0
- package/scripts/bench/round-mixdog-lead.json +269 -0
- package/scripts/bench/round-mixdog.json +126 -0
- package/scripts/bench/round-r10-bigsample.json +679 -0
- package/scripts/bench/round-r11-codexalign.json +257 -0
- package/scripts/bench/round-r13-clientmeta.json +464 -0
- package/scripts/bench/round-r14-betafeatures.json +466 -0
- package/scripts/bench/round-r15-fulldefault.json +462 -0
- package/scripts/bench/round-r16-sessionid.json +466 -0
- package/scripts/bench/round-r17-wirebytes.json +456 -0
- package/scripts/bench/round-r18-prewarm.json +468 -0
- package/scripts/bench/round-r19-clean.json +472 -0
- package/scripts/bench/round-r20-prewarm-clean.json +475 -0
- package/scripts/bench/round-r21-delta-retry.json +473 -0
- package/scripts/bench/round-r22-full-probe.json +693 -0
- package/scripts/bench/round-r23-itemprobe.json +701 -0
- package/scripts/bench/round-r24-shapefix.json +677 -0
- package/scripts/bench/round-r25-serial.json +464 -0
- package/scripts/bench/round-r26-parallel3.json +671 -0
- package/scripts/bench/round-r27-parallel10.json +894 -0
- package/scripts/bench/round-r28-parallel10-stagger.json +882 -0
- package/scripts/bench/round-r29-parallel10-stagger166.json +886 -0
- package/scripts/bench/round-r30-instid.json +253 -0
- package/scripts/bench/round-r31-upgradeprobe.json +256 -0
- package/scripts/bench/round-r32-vs-codex-lead.json +254 -0
- package/scripts/bench/round-r33-vs-codex-codex.json +115 -0
- package/scripts/bench/round-r34-orchestrated.json +120 -0
- package/scripts/bench/round-r35-orchestrated-codex.json +61 -0
- package/scripts/bench/round-r36-orchestrated-capped.json +128 -0
- package/scripts/bench/round-r4-codex.json +114 -0
- package/scripts/bench/round-r4-mixed.json +225 -0
- package/scripts/bench/round-r5-gpt-lead.json +259 -0
- package/scripts/bench/round-r6-codex.json +114 -0
- package/scripts/bench/round-r6-solo.json +257 -0
- package/scripts/bench/round-r7-full.json +254 -0
- package/scripts/bench/round-r8-fulldefault.json +255 -0
- package/scripts/bench-run.mjs +251 -32
- package/scripts/freevar-smoke.mjs +95 -0
- package/scripts/internal-comms-bench.mjs +3 -4
- package/scripts/internal-comms-smoke.mjs +10 -9
- package/scripts/model-catalog-audit.mjs +209 -0
- package/scripts/model-list-sanitize-test.mjs +37 -0
- package/scripts/mouse-probe.mjs +45 -0
- package/scripts/output-style-bench.mjs +13 -6
- package/scripts/output-style-smoke.mjs +4 -4
- package/scripts/provider-toolcall-test.mjs +7 -3
- package/scripts/recall-bench.mjs +76 -13
- package/scripts/recall-quality-cases.json +12 -0
- package/scripts/recall-usecase-cases.json +18 -0
- package/scripts/session-bench.mjs +152 -6
- package/scripts/tool-smoke.mjs +25 -65
- package/scripts/tui-render-smoke.mjs +90 -0
- package/scripts/webhook-smoke.mjs +208 -0
- package/src/agents/debugger/AGENT.md +4 -1
- package/src/agents/heavy-worker/AGENT.md +9 -8
- package/src/agents/maintainer/AGENT.md +4 -0
- package/src/agents/reviewer/AGENT.md +2 -1
- package/src/agents/scheduler-task/AGENT.md +2 -3
- package/src/agents/webhook-handler/AGENT.md +2 -3
- package/src/agents/worker/AGENT.md +10 -7
- package/src/app.mjs +12 -1
- package/src/headless-role.mjs +7 -1
- package/src/lib/rules-builder.cjs +4 -0
- package/src/mixdog-session-runtime.mjs +647 -2056
- package/src/output-styles/default.md +30 -9
- package/src/output-styles/{oneline.md → extreme-minimal.md} +5 -4
- package/src/output-styles/minimal.md +8 -6
- package/src/output-styles/simple.md +21 -7
- package/src/rules/agent/00-common.md +6 -3
- package/src/rules/agent/30-explorer.md +16 -5
- package/src/rules/lead/01-general.md +5 -5
- package/src/rules/lead/lead-brief.md +15 -0
- package/src/rules/lead/lead-tool.md +6 -15
- package/src/rules/shared/01-tool.md +17 -21
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +8 -3
- package/src/runtime/agent/orchestrator/agent-runtime/agent-loop-policy.mjs +25 -0
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +100 -23
- package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +6 -15
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +362 -0
- package/src/runtime/agent/orchestrator/agent-trace-io.mjs +410 -0
- package/src/runtime/agent/orchestrator/agent-trace.mjs +16 -735
- package/src/runtime/agent/orchestrator/config.mjs +69 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +62 -20
- package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +209 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +489 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +81 -1281
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +607 -0
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +32 -3
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +81 -0
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +248 -0
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +303 -0
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +505 -0
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +43 -1013
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +17 -3
- package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +105 -11
- package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +356 -0
- package/src/runtime/agent/orchestrator/providers/openai-codex-model.mjs +108 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +58 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +368 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +760 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +40 -1143
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +740 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +193 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +349 -2131
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +143 -1002
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +229 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-events.mjs +67 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +465 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +1105 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/provider-catalog-cache.mjs +80 -0
- package/src/runtime/agent/orchestrator/session/compact/budget.mjs +288 -0
- package/src/runtime/agent/orchestrator/session/compact/constants.mjs +85 -0
- package/src/runtime/agent/orchestrator/session/compact/engine.mjs +749 -0
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +82 -0
- package/src/runtime/agent/orchestrator/session/compact/summary-schema.mjs +315 -0
- package/src/runtime/agent/orchestrator/session/compact/summary.mjs +643 -0
- package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +326 -0
- package/src/runtime/agent/orchestrator/session/compact.mjs +40 -2282
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +14 -2
- package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +61 -0
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -3
- package/src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs +275 -0
- package/src/runtime/agent/orchestrator/session/loop/steering-ladder.mjs +173 -0
- package/src/runtime/agent/orchestrator/session/loop/termination.mjs +58 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +239 -0
- package/src/runtime/agent/orchestrator/session/loop.mjs +278 -402
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +471 -0
- package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +7 -4
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +12 -0
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +406 -0
- package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +80 -0
- package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +210 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +166 -1087
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +189 -0
- package/src/runtime/agent/orchestrator/session/store.mjs +74 -179
- package/src/runtime/agent/orchestrator/stall-policy.mjs +20 -1
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +70 -20
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +22 -2
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +35 -44
- package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +40 -0
- package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +29 -0
- package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +8 -0
- package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +126 -0
- package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +81 -92
- package/src/runtime/agent/orchestrator/tools/builtin/shell-job-paths.mjs +161 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-job-process.mjs +108 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +28 -265
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +0 -6
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +57 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/keyword-match.mjs +82 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +10 -122
- package/src/runtime/agent/orchestrator/tools/code-graph/text-columns.mjs +45 -0
- package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +6 -6
- package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +6 -3
- package/src/runtime/agent/orchestrator/tools/patch/constants.mjs +9 -0
- package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +171 -0
- package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +471 -0
- package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +436 -0
- package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +342 -0
- package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +359 -0
- package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +340 -0
- package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +643 -0
- package/src/runtime/agent/orchestrator/tools/patch.mjs +36 -2959
- package/src/runtime/agent/orchestrator/tools/progress-message.mjs +0 -21
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +9 -72
- package/src/runtime/agent/orchestrator/tools/shell-powershell.mjs +77 -0
- package/src/runtime/agent/orchestrator/tools/shell-state.mjs +154 -0
- package/src/runtime/channels/backends/discord-access.mjs +32 -0
- package/src/runtime/channels/backends/discord-attachments.mjs +65 -0
- package/src/runtime/channels/backends/discord-gateway.mjs +233 -0
- package/src/runtime/channels/backends/discord.mjs +27 -318
- package/src/runtime/channels/backends/telegram.mjs +8 -12
- package/src/runtime/channels/index.mjs +247 -701
- package/src/runtime/channels/lib/backend-dispatch.mjs +46 -0
- package/src/runtime/channels/lib/config.mjs +37 -149
- package/src/runtime/channels/lib/event-pipeline.mjs +22 -5
- package/src/runtime/channels/lib/event-queue.mjs +78 -13
- package/src/runtime/channels/lib/inbound-routing.mjs +74 -0
- package/src/runtime/channels/lib/interaction-workflows.mjs +5 -113
- package/src/runtime/channels/lib/output-forwarder.mjs +1 -1
- package/src/runtime/channels/lib/owner-heartbeat.mjs +75 -0
- package/src/runtime/channels/lib/parent-bridge.mjs +88 -0
- package/src/runtime/channels/lib/runtime-paths.mjs +14 -4
- package/src/runtime/channels/lib/scheduler.mjs +27 -113
- package/src/runtime/channels/lib/session-discovery.mjs +56 -4
- package/src/runtime/channels/lib/tool-dispatch.mjs +158 -0
- package/src/runtime/channels/lib/tool-format.mjs +1 -1
- package/src/runtime/channels/lib/transcript-discovery.mjs +4 -4
- package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +6 -3
- package/src/runtime/channels/lib/voice-transcription.mjs +179 -0
- package/src/runtime/channels/lib/webhook/deliveries.mjs +313 -0
- package/src/runtime/channels/lib/webhook/log.mjs +42 -0
- package/src/runtime/channels/lib/webhook/ngrok.mjs +181 -0
- package/src/runtime/channels/lib/webhook/signature.mjs +60 -0
- package/src/runtime/channels/lib/webhook.mjs +43 -616
- package/src/runtime/channels/tool-defs.mjs +11 -130
- package/src/runtime/memory/index.mjs +210 -1948
- package/src/runtime/memory/lib/core-memory-store.mjs +5 -1
- package/src/runtime/memory/lib/cycle-llm-adapters.mjs +58 -0
- package/src/runtime/memory/lib/cycle-scheduler.mjs +497 -0
- package/src/runtime/memory/lib/embedding-warmup.mjs +58 -0
- package/src/runtime/memory/lib/ko-morph.mjs +195 -0
- package/src/runtime/memory/lib/memory-config-flags.mjs +91 -0
- package/src/runtime/memory/lib/memory-cycle.mjs +1 -1
- package/src/runtime/memory/lib/memory-cycle2-gate.mjs +515 -0
- package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +324 -0
- package/src/runtime/memory/lib/memory-cycle2-shared.mjs +18 -0
- package/src/runtime/memory/lib/memory-cycle2.mjs +24 -842
- package/src/runtime/memory/lib/memory-embed.mjs +149 -0
- package/src/runtime/memory/lib/memory-process-lock.mjs +162 -0
- package/src/runtime/memory/lib/memory-recall-store.mjs +69 -12
- package/src/runtime/memory/lib/memory-text-utils.mjs +46 -0
- package/src/runtime/memory/lib/pg/supervisor.mjs +1 -1
- package/src/runtime/memory/lib/query-handlers.mjs +802 -0
- package/src/runtime/memory/lib/recall-format.mjs +55 -0
- package/src/runtime/memory/lib/runtime-fetcher.mjs +8 -3
- package/src/runtime/memory/lib/transcript-ingest.mjs +425 -0
- package/src/runtime/memory/tool-defs.mjs +5 -13
- package/src/runtime/search/lib/http-fetch.mjs +274 -0
- package/src/runtime/search/lib/ssrf-guard.mjs +333 -0
- package/src/runtime/search/lib/web-tools.mjs +24 -602
- package/src/runtime/shared/atomic-file.mjs +26 -1
- package/src/runtime/shared/config.mjs +14 -4
- package/src/runtime/shared/launcher-control.mjs +2 -2
- package/src/runtime/shared/markdown-frontmatter.mjs +19 -0
- package/src/runtime/shared/schedules-store.mjs +13 -3
- package/src/runtime/shared/tool-execution-contract.mjs +2 -2
- package/src/runtime/shared/tool-primitives.mjs +308 -0
- package/src/runtime/shared/tool-result-summary.mjs +515 -0
- package/src/runtime/shared/tool-surface.mjs +80 -898
- package/src/runtime/shared/transcript-writer.mjs +23 -0
- package/src/runtime/shared/update-checker.mjs +7 -4
- package/src/session-runtime/config-helpers.mjs +119 -2
- package/src/session-runtime/config-lifecycle.mjs +232 -0
- package/src/session-runtime/cwd-plugins.mjs +226 -0
- package/src/session-runtime/mcp-glue.mjs +177 -0
- package/src/session-runtime/model-recency.mjs +111 -0
- package/src/session-runtime/native-search.mjs +247 -0
- package/src/session-runtime/output-styles.mjs +11 -9
- package/src/session-runtime/prewarm.mjs +142 -0
- package/src/session-runtime/provider-models.mjs +278 -0
- package/src/session-runtime/provider-usage.mjs +120 -0
- package/src/session-runtime/quick-model-rows.mjs +205 -0
- package/src/session-runtime/quick-search-models.mjs +47 -0
- package/src/session-runtime/session-hooks.mjs +93 -0
- package/src/session-runtime/settings-api.mjs +352 -0
- package/src/session-runtime/tool-catalog.mjs +29 -29
- package/src/session-runtime/tool-defs.mjs +84 -0
- package/src/session-runtime/warmup-schedulers.mjs +201 -0
- package/src/session-runtime/workflow.mjs +1 -1
- package/src/standalone/agent-tool/helpers.mjs +237 -0
- package/src/standalone/agent-tool/notify.mjs +107 -0
- package/src/standalone/agent-tool/provider-init.mjs +143 -0
- package/src/standalone/agent-tool/render.mjs +152 -0
- package/src/standalone/agent-tool/tool-def.mjs +55 -0
- package/src/standalone/agent-tool.mjs +138 -669
- package/src/standalone/channel-admin.mjs +102 -90
- package/src/standalone/channel-worker.mjs +4 -7
- package/src/standalone/explore-tool.mjs +64 -14
- package/src/standalone/hook-bus/config.mjs +207 -0
- package/src/standalone/hook-bus/constants.mjs +90 -0
- package/src/standalone/hook-bus/handlers.mjs +481 -0
- package/src/standalone/hook-bus/payload.mjs +31 -0
- package/src/standalone/hook-bus/rules.mjs +77 -0
- package/src/standalone/hook-bus.mjs +77 -870
- package/src/standalone/memory-runtime-proxy.mjs +7 -0
- package/src/standalone/opencode-go-login.mjs +5 -1
- package/src/standalone/provider-admin.mjs +1 -16
- package/src/standalone/usage-dashboard.mjs +3 -1
- package/src/tui/App.jsx +1059 -8110
- package/src/tui/app/app-format.mjs +213 -0
- package/src/tui/app/channel-pickers.mjs +508 -0
- package/src/tui/app/clipboard.mjs +67 -0
- package/src/tui/app/core-memory-picker.mjs +210 -0
- package/src/tui/app/extension-pickers.mjs +506 -0
- package/src/tui/app/input-parsers.mjs +193 -0
- package/src/tui/app/maintenance-pickers.mjs +356 -0
- package/src/tui/app/model-options.mjs +334 -0
- package/src/tui/app/model-picker.mjs +365 -0
- package/src/tui/app/onboarding-steps.mjs +400 -0
- package/src/tui/app/project-picker.mjs +247 -0
- package/src/tui/app/provider-setup-picker.mjs +580 -0
- package/src/tui/app/resume-picker.mjs +55 -0
- package/src/tui/app/route-pickers.mjs +419 -0
- package/src/tui/app/settings-picker.mjs +489 -0
- package/src/tui/app/slash-commands.mjs +101 -0
- package/src/tui/app/slash-dispatch.mjs +427 -0
- package/src/tui/app/text-layout.mjs +46 -0
- package/src/tui/app/theme-effort-pickers.mjs +154 -0
- package/src/tui/app/transcript-window.mjs +677 -0
- package/src/tui/app/use-mouse-input.mjs +460 -0
- package/src/tui/app/use-prompt-handlers.mjs +310 -0
- package/src/tui/app/use-transcript-scroll.mjs +512 -0
- package/src/tui/app/use-transcript-window.mjs +607 -0
- package/src/tui/components/ConfirmBar.jsx +10 -7
- package/src/tui/components/Picker.jsx +64 -15
- package/src/tui/components/PromptInput.jsx +33 -102
- package/src/tui/components/SlashCommandPalette.jsx +8 -1
- package/src/tui/components/StatusLine.jsx +69 -15
- package/src/tui/components/TextEntryPanel.jsx +11 -0
- package/src/tui/components/ToolExecution.jsx +52 -594
- package/src/tui/components/TranscriptItem.jsx +105 -0
- package/src/tui/components/UsagePanel.jsx +18 -4
- package/src/tui/components/prompt-input/edit-helpers.mjs +72 -0
- package/src/tui/components/prompt-input/voice-indicator.mjs +39 -0
- package/src/tui/components/tool-execution/ResultBody.jsx +56 -0
- package/src/tui/components/tool-execution/surface-detail.mjs +405 -0
- package/src/tui/components/tool-execution/text-format.mjs +161 -0
- package/src/tui/display-width.mjs +20 -3
- package/src/tui/dist/index.mjs +13553 -12384
- package/src/tui/engine/agent-job-feed.mjs +133 -0
- package/src/tui/engine/notification-plan.mjs +76 -0
- package/src/tui/engine/render-timing.mjs +17 -0
- package/src/tui/engine/tool-approval.mjs +94 -0
- package/src/tui/engine/tool-card-results.mjs +234 -0
- package/src/tui/engine/tool-result-status.mjs +135 -0
- package/src/tui/engine.mjs +170 -574
- package/src/tui/figures.mjs +5 -0
- package/src/tui/index.jsx +65 -1
- package/src/tui/input-editing.mjs +2 -2
- package/src/tui/markdown/format-token.mjs +4 -1
- package/src/tui/statusline-ansi-bridge.mjs +11 -3
- package/src/tui/theme.mjs +6 -0
- package/src/ui/statusline-agents.mjs +213 -0
- package/src/ui/statusline-format.mjs +146 -0
- package/src/ui/statusline-segments.mjs +148 -0
- package/src/ui/statusline.mjs +77 -501
- package/src/ui/tool-card.mjs +0 -1
- package/src/vendor/statusline/bin/statusline-route.mjs +15 -2
- package/src/workflows/default/WORKFLOW.md +16 -18
- package/src/workflows/sequential/WORKFLOW.md +16 -18
- package/vendor/ink/build/display-width.js +19 -3
- package/vendor/ink/build/ink.js +112 -7
- package/vendor/ink/build/log-update.js +17 -3
- package/vendor/ink/build/wrap-text.js +125 -0
- package/scripts/_test-folder-dialog.mjs +0 -30
- package/scripts/fix-brief-fn.mjs +0 -35
- package/scripts/fix-format-tool-surface.mjs +0 -24
- package/scripts/fix-tool-exec-visible.mjs +0 -42
- package/scripts/patch-agent-brief.mjs +0 -48
- package/scripts/patch-app.mjs +0 -21
- package/scripts/patch-app2.mjs +0 -18
- package/scripts/patch-dist-brief.mjs +0 -96
- package/scripts/patch-tool-exec.mjs +0 -70
- package/src/examples/schedules/SCHEDULE.example.md +0 -32
- package/src/examples/webhooks/WEBHOOK.example.md +0 -40
- package/src/runtime/agent/orchestrator/session/manager.reactive-persist.test.mjs +0 -107
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.test.mjs +0 -143
- package/src/runtime/agent/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -285
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.test.mjs +0 -162
- package/src/runtime/agent/orchestrator/tools/builtin/open-config-tool.mjs +0 -26
- package/src/runtime/channels/lib/holidays.mjs +0 -138
- package/src/runtime/shared/channel-notification-routing.test.mjs +0 -45
- package/src/runtime/shared/task-notification-envelope.test.mjs +0 -107
- package/src/runtime/shared/tool-execution-contract.test.mjs +0 -183
- package/src/standalone/agent-task-status.test.mjs +0 -76
- package/src/tui/components/tool-output-format.test.mjs +0 -399
- package/src/tui/display-width.test.mjs +0 -35
- package/src/tui/engine-runtime-notification.test.mjs +0 -115
- package/src/tui/engine-tool-result-text.test.mjs +0 -75
- package/src/tui/input-editing.selection.test.mjs +0 -75
- package/src/tui/markdown/format-token.test.mjs +0 -354
- package/src/tui/markdown/render-ansi.test.mjs +0 -108
- package/src/tui/markdown/stream-fence.test.mjs +0 -26
- package/src/tui/markdown/streaming-markdown.test.mjs +0 -70
- package/src/tui/paste-fix.test.mjs +0 -119
- package/src/tui/prompt-history-store.test.mjs +0 -52
- package/src/tui/statusline-ansi-bridge.test.mjs +0 -159
- package/src/tui/transcript-tool-failures.test.mjs +0 -111
- package/src/ui/markdown.test.mjs +0 -70
- package/src/ui/statusline-context-label.test.mjs +0 -15
- package/src/vendor/statusline/bin/statusline-lib.mjs +0 -186
- package/src/vendor/statusline/bin/statusline-route.test.mjs +0 -80
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
// Korean morphological analysis for the recall FTS query path.
|
|
2
|
+
//
|
|
3
|
+
// Wraps kiwi-nlp (WASM). The npm package ships ONLY the WASM binary + JS glue,
|
|
4
|
+
// NOT the language model — so the model archive is downloaded ONCE at boot from
|
|
5
|
+
// the bab2min/Kiwi GitHub Release and cached under a gitignored data dir
|
|
6
|
+
// (precedent: the embedding ONNX model is runtime-downloaded/cached the same
|
|
7
|
+
// way). No per-query network. If download or WASM init fails, analyze() returns
|
|
8
|
+
// null and the caller (buildFtsQuery) falls back to its prior websearch path.
|
|
9
|
+
//
|
|
10
|
+
// Lifecycle:
|
|
11
|
+
// init(dataDir) — lazy, async, idempotent, safe to call fire-and-forget at
|
|
12
|
+
// boot. Downloads+extracts model on first run, then builds
|
|
13
|
+
// the Kiwi instance. Never throws (logs once, stays null).
|
|
14
|
+
// ready() — true once the Kiwi instance is built.
|
|
15
|
+
// analyze(text) — sync; returns TokenInfo[] or null when not ready.
|
|
16
|
+
// stems(text) — sync; content-morpheme stems (NNG/NNP/VV/VA/XR/SL) or null.
|
|
17
|
+
import fs from 'node:fs'
|
|
18
|
+
import path from 'node:path'
|
|
19
|
+
import zlib from 'node:zlib'
|
|
20
|
+
|
|
21
|
+
// Pinned model release. The WASM package version (kiwi-nlp in package.json) and
|
|
22
|
+
// this model version are independent; base model is format-stable across the
|
|
23
|
+
// 0.2x line. Bump deliberately, never floating.
|
|
24
|
+
// Model version MUST match the kiwi-nlp WASM version — a mismatched model
|
|
25
|
+
// aborts the WASM at build() with an opaque numeric error. Pinned pair:
|
|
26
|
+
// kiwi-nlp@0.21.0 (package.json) + model v0.21.0 KnLM. Deliberately NOT
|
|
27
|
+
// 0.23.0: its base model ships CoNg (72MB, ~940MB RSS after build) vs
|
|
28
|
+
// KnLM's 35MB download / ~560MB build peak, and recall stemming gains
|
|
29
|
+
// nothing from the CoNg accuracy delta.
|
|
30
|
+
export const KIWI_MODEL_VERSION = 'v0.21.0'
|
|
31
|
+
const KIWI_MODEL_ASSET = `kiwi_model_${KIWI_MODEL_VERSION}_base.tgz`
|
|
32
|
+
const KIWI_MODEL_URL = `https://github.com/bab2min/Kiwi/releases/download/${KIWI_MODEL_VERSION}/${KIWI_MODEL_ASSET}`
|
|
33
|
+
|
|
34
|
+
// Model files KiwiBuilder.build({ modelFiles }) needs from the extracted
|
|
35
|
+
// archive (v0.21.0 base layout: KnLM = sj.knlm + sj.morph).
|
|
36
|
+
const REQUIRED_MODEL_FILES = [
|
|
37
|
+
'combiningRule.txt', 'default.dict', 'extract.mdl', 'sj.knlm', 'sj.morph',
|
|
38
|
+
]
|
|
39
|
+
// Optional files loaded when present (loadMultiDict / loadTypoDict defaults).
|
|
40
|
+
const OPTIONAL_MODEL_FILES = ['multi.dict', 'skipbigram.mdl', 'typo.dict']
|
|
41
|
+
|
|
42
|
+
// Content-morpheme POS tags whose stems are worth indexing against search_tsv.
|
|
43
|
+
// NNG/NNP nouns, VV/VA predicate stems, XR root, SL foreign(latin) — matches
|
|
44
|
+
// the brief. Endings/particles/josa are intentionally dropped.
|
|
45
|
+
const CONTENT_TAGS = new Set(['NNG', 'NNP', 'VV', 'VA', 'XR', 'SL'])
|
|
46
|
+
|
|
47
|
+
let _state = 'idle' // idle | loading | ready | failed
|
|
48
|
+
let _initPromise = null
|
|
49
|
+
let _kiwi = null
|
|
50
|
+
let _log = () => {}
|
|
51
|
+
let _initMs = 0
|
|
52
|
+
|
|
53
|
+
export function isReady() { return _state === 'ready' && _kiwi != null }
|
|
54
|
+
export function state() { return _state }
|
|
55
|
+
export function initLatencyMs() { return _initMs }
|
|
56
|
+
|
|
57
|
+
function modelDir(dataDir) {
|
|
58
|
+
return path.join(dataDir, 'kiwi-model', KIWI_MODEL_VERSION)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function hasAllRequired(dir) {
|
|
62
|
+
try {
|
|
63
|
+
return REQUIRED_MODEL_FILES.every(f => fs.existsSync(path.join(dir, f)))
|
|
64
|
+
} catch { return false }
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Minimal POSIX/ustar tar reader over an already-gunzipped buffer. Avoids a
|
|
68
|
+
// node-tar dependency for a one-shot boot extraction. Handles regular files
|
|
69
|
+
// (typeflag '0'/'\0') and the GNU/pax long-name records well enough for the
|
|
70
|
+
// flat Kiwi model archive (all entries live under a single top-level dir).
|
|
71
|
+
function extractTar(buf, destDir) {
|
|
72
|
+
let offset = 0
|
|
73
|
+
const written = []
|
|
74
|
+
while (offset + 512 <= buf.length) {
|
|
75
|
+
const header = buf.subarray(offset, offset + 512)
|
|
76
|
+
// Two consecutive zero blocks mark end of archive.
|
|
77
|
+
if (header.every(b => b === 0)) break
|
|
78
|
+
let name = header.subarray(0, 100).toString('utf8').replace(/\0.*$/, '')
|
|
79
|
+
const sizeStr = header.subarray(124, 136).toString('utf8').replace(/\0.*$/, '').trim()
|
|
80
|
+
const size = parseInt(sizeStr, 8) || 0
|
|
81
|
+
const typeflag = String.fromCharCode(header[156]) || '0'
|
|
82
|
+
// ustar prefix (name continuation) at 345..500.
|
|
83
|
+
const prefix = header.subarray(345, 500).toString('utf8').replace(/\0.*$/, '')
|
|
84
|
+
if (prefix) name = `${prefix}/${name}`
|
|
85
|
+
offset += 512
|
|
86
|
+
const body = buf.subarray(offset, offset + size)
|
|
87
|
+
offset += Math.ceil(size / 512) * 512
|
|
88
|
+
if (typeflag !== '0' && typeflag !== '\0' && typeflag !== '') continue
|
|
89
|
+
// Flatten: take basename only; the archive nests files under one dir.
|
|
90
|
+
const base = name.split('/').filter(Boolean).pop()
|
|
91
|
+
if (!base) continue
|
|
92
|
+
fs.writeFileSync(path.join(destDir, base), body)
|
|
93
|
+
written.push(base)
|
|
94
|
+
}
|
|
95
|
+
return written
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async function downloadAndExtractModel(dataDir) {
|
|
99
|
+
const dir = modelDir(dataDir)
|
|
100
|
+
if (hasAllRequired(dir)) return dir
|
|
101
|
+
fs.mkdirSync(dir, { recursive: true })
|
|
102
|
+
_log(`[memory-service] kiwi model missing — downloading ${KIWI_MODEL_ASSET} (~35MB) once\n`)
|
|
103
|
+
const res = await fetch(KIWI_MODEL_URL, { redirect: 'follow' })
|
|
104
|
+
if (!res.ok) throw new Error(`kiwi model download HTTP ${res.status}`)
|
|
105
|
+
const gz = Buffer.from(await res.arrayBuffer())
|
|
106
|
+
const tar = zlib.gunzipSync(gz)
|
|
107
|
+
extractTar(tar, dir)
|
|
108
|
+
if (!hasAllRequired(dir)) {
|
|
109
|
+
throw new Error(`kiwi model extract incomplete under ${dir}`)
|
|
110
|
+
}
|
|
111
|
+
return dir
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function readModelFiles(dir) {
|
|
115
|
+
const modelFiles = {}
|
|
116
|
+
for (const f of REQUIRED_MODEL_FILES) {
|
|
117
|
+
modelFiles[f] = new Uint8Array(fs.readFileSync(path.join(dir, f)))
|
|
118
|
+
}
|
|
119
|
+
for (const f of OPTIONAL_MODEL_FILES) {
|
|
120
|
+
const p = path.join(dir, f)
|
|
121
|
+
if (fs.existsSync(p)) modelFiles[f] = new Uint8Array(fs.readFileSync(p))
|
|
122
|
+
}
|
|
123
|
+
return modelFiles
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Lazy, idempotent, never-throwing init. Fire-and-forget at boot.
|
|
127
|
+
export async function init(dataDir, log = () => {}) {
|
|
128
|
+
if (_state === 'ready') return true
|
|
129
|
+
if (_initPromise) return _initPromise
|
|
130
|
+
_log = typeof log === 'function' ? log : (() => {})
|
|
131
|
+
_state = 'loading'
|
|
132
|
+
const t0 = Date.now()
|
|
133
|
+
_initPromise = (async () => {
|
|
134
|
+
// Resolve the WASM path from the installed package without hard-importing
|
|
135
|
+
// (keeps the whole feature optional if kiwi-nlp isn't installed).
|
|
136
|
+
// NOTE: must go through module resolution (import.meta.resolve) — a bare
|
|
137
|
+
// `new URL(spec, import.meta.url)` resolves relative to THIS file's
|
|
138
|
+
// directory, not node_modules.
|
|
139
|
+
const { KiwiBuilder } = await import('kiwi-nlp')
|
|
140
|
+
const wasmUrl = import.meta.resolve('kiwi-nlp/dist/kiwi-wasm.wasm')
|
|
141
|
+
const wasmPath = wasmUrl.startsWith('file:')
|
|
142
|
+
? (await import('node:url')).fileURLToPath(wasmUrl)
|
|
143
|
+
: wasmUrl
|
|
144
|
+
const dir = await downloadAndExtractModel(dataDir)
|
|
145
|
+
const modelFiles = readModelFiles(dir)
|
|
146
|
+
const builder = await KiwiBuilder.create(wasmPath)
|
|
147
|
+
// modelType 'knlm' = fast KnLM (sj.knlm); loadMultiDict/loadTypoDict only
|
|
148
|
+
// engage if the optional files were present.
|
|
149
|
+
_kiwi = await builder.build({ modelFiles, modelType: 'knlm' })
|
|
150
|
+
_state = 'ready'
|
|
151
|
+
_initMs = Date.now() - t0
|
|
152
|
+
_log(`[memory-service] kiwi morph ready in ${_initMs}ms (model ${KIWI_MODEL_VERSION}, rss≈${Math.round(process.memoryUsage().rss / 1e6)}MB)\n`)
|
|
153
|
+
return true
|
|
154
|
+
})().catch(err => {
|
|
155
|
+
_state = 'failed'
|
|
156
|
+
_kiwi = null
|
|
157
|
+
_log(`[memory-service] kiwi morph init failed — recall stays lexical: ${err?.message || err}\n`)
|
|
158
|
+
return false
|
|
159
|
+
})
|
|
160
|
+
return _initPromise
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Sync morphological analysis. Returns TokenInfo[] or null when not ready.
|
|
164
|
+
export function analyze(text) {
|
|
165
|
+
if (!isReady()) return null
|
|
166
|
+
const s = String(text ?? '')
|
|
167
|
+
if (!s) return null
|
|
168
|
+
try {
|
|
169
|
+
const r = _kiwi.analyze(s)
|
|
170
|
+
return Array.isArray(r?.tokens) ? r.tokens : null
|
|
171
|
+
} catch {
|
|
172
|
+
return null
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Content-morpheme stem forms for a Korean phrase. null when not ready.
|
|
177
|
+
// "개선을" → ['개선']; "개선하고" → ['개선','하'] filtered to content tags.
|
|
178
|
+
export function stems(text) {
|
|
179
|
+
const tokens = analyze(text)
|
|
180
|
+
if (!tokens) return null
|
|
181
|
+
const out = []
|
|
182
|
+
for (const t of tokens) {
|
|
183
|
+
if (!t || !CONTENT_TAGS.has(t.tag)) continue
|
|
184
|
+
const form = String(t.str || '').trim()
|
|
185
|
+
if (form.length >= 1) out.push(form)
|
|
186
|
+
}
|
|
187
|
+
return out
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function reset() {
|
|
191
|
+
_state = 'idle'
|
|
192
|
+
_initPromise = null
|
|
193
|
+
_kiwi = null
|
|
194
|
+
_initMs = 0
|
|
195
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// Extracted from index.mjs — env/config flag helpers (pure, poll-on-use).
|
|
2
|
+
// These read process.env and the on-disk config section each call so runtime
|
|
3
|
+
// toggles (recap, secondary mode, cycle kill-switches) take effect without a
|
|
4
|
+
// daemon restart. No module-level mutable state; safe to import anywhere.
|
|
5
|
+
import os from 'node:os'
|
|
6
|
+
import path from 'node:path'
|
|
7
|
+
import fs from 'node:fs'
|
|
8
|
+
import { readSection } from '../../shared/config.mjs'
|
|
9
|
+
|
|
10
|
+
export function readMainConfig() {
|
|
11
|
+
return readSection('memory')
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Recap toggle lives in the `agent` config section (agent.recap.enabled,
|
|
15
|
+
// default true) — the same file the session runtime persists via
|
|
16
|
+
// saveConfigAndAdopt. The memory daemon runs as a detached cross-process HTTP
|
|
17
|
+
// worker, so it re-reads this section from disk each cycle tick (poll-on-use)
|
|
18
|
+
// rather than relying on IPC. A legacy `agent.modules.memory === false` flag is
|
|
19
|
+
// still honored as recap off (migration folds it on the session-runtime side).
|
|
20
|
+
export function readRecapEnabled() {
|
|
21
|
+
try {
|
|
22
|
+
let agent = readSection('agent')
|
|
23
|
+
// The agent section may be double-wrapped ({ agent: { providers, ... } })
|
|
24
|
+
// in legacy config files; loadConfig() unwraps the same way (config.mjs
|
|
25
|
+
// `raw.agent && raw.agent.providers`). Mirror it here or a migrated/toggled
|
|
26
|
+
// recap flag written inside the wrapper would be invisible to the daemon.
|
|
27
|
+
if (agent?.agent && agent.agent.providers) agent = agent.agent
|
|
28
|
+
const recap = agent?.recap
|
|
29
|
+
if (recap && typeof recap === 'object' && recap.enabled === false) return false
|
|
30
|
+
const legacyMemory = agent?.modules?.memory
|
|
31
|
+
if (legacyMemory === false) return false
|
|
32
|
+
if (legacyMemory && typeof legacyMemory === 'object' && legacyMemory.enabled === false) return false
|
|
33
|
+
return true
|
|
34
|
+
} catch {
|
|
35
|
+
return true
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function embeddingWarmupEnabled() {
|
|
40
|
+
const raw = String(process.env.MIXDOG_EMBED_WARMUP ?? '1').trim().toLowerCase()
|
|
41
|
+
return !(raw === '0' || raw === 'false' || raw === 'off' || raw === 'no')
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function envFlagEnabled(name) {
|
|
45
|
+
const raw = String(process.env[name] ?? '').trim().toLowerCase()
|
|
46
|
+
return raw === '1' || raw === 'true' || raw === 'on' || raw === 'yes'
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function memorySecondaryMode() {
|
|
50
|
+
return envFlagEnabled('MIXDOG_MEMORY_SECONDARY')
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function embeddingWarmupCanStart() {
|
|
54
|
+
return embeddingWarmupEnabled() && !memorySecondaryMode()
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function memoryLlmWorkerEnabled() {
|
|
58
|
+
return !memorySecondaryMode() && !envFlagEnabled('MIXDOG_MEMORY_DISABLE_LLM_WORKER')
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function memoryCyclesEnabled() {
|
|
62
|
+
// Background cycles run only when: not secondary mode, the env hard-override
|
|
63
|
+
// is not set, AND the user-facing recap toggle is on. The recap flag is
|
|
64
|
+
// re-read from disk here so toggling it at runtime takes effect without a
|
|
65
|
+
// daemon restart (checkCycles polls this each tick). The env override stays a
|
|
66
|
+
// hard kill switch regardless of recap.
|
|
67
|
+
return !memorySecondaryMode()
|
|
68
|
+
&& !envFlagEnabled('MIXDOG_MEMORY_DISABLE_CYCLES')
|
|
69
|
+
&& readRecapEnabled()
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function secondaryPgAdvertised(dataDir) {
|
|
73
|
+
if (!memorySecondaryMode()) return true
|
|
74
|
+
const runtimeRoot = process.env.MIXDOG_RUNTIME_ROOT
|
|
75
|
+
? path.resolve(process.env.MIXDOG_RUNTIME_ROOT)
|
|
76
|
+
: path.join(os.tmpdir(), 'mixdog')
|
|
77
|
+
try {
|
|
78
|
+
const cur = JSON.parse(fs.readFileSync(path.join(runtimeRoot, 'active-instance.json'), 'utf8'))
|
|
79
|
+
const port = Number(cur?.pg_port)
|
|
80
|
+
const pgdata = cur?.pg_pgdata ? path.resolve(String(cur.pg_pgdata)) : ''
|
|
81
|
+
return Number.isInteger(port) && port > 0 && pgdata === path.resolve(path.join(dataDir, 'pgdata'))
|
|
82
|
+
} catch {
|
|
83
|
+
return false
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function assertSecondaryPgAttachable(dataDir) {
|
|
88
|
+
if (!secondaryPgAdvertised(dataDir)) {
|
|
89
|
+
throw new Error('memory-service: secondary mode requires an existing primary PG instance')
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Barrel — original memory-cycle module split into memory-embed / memory-cycle1 / memory-cycle2.
|
|
2
2
|
// External callers import from this path; the split is transparent.
|
|
3
3
|
export {
|
|
4
|
-
syncRootEmbedding, deleteRootEmbedding, flushEmbeddingDirty, inferChunkProjectId,
|
|
4
|
+
syncRootEmbedding, deleteRootEmbedding, flushEmbeddingDirty, flushRawEmbeddings, inferChunkProjectId,
|
|
5
5
|
} from './memory-embed.mjs'
|
|
6
6
|
export { runCycle1 } from './memory-cycle1.mjs'
|
|
7
7
|
export {
|