mixdog 0.7.18 → 0.8.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/README.md +37 -331
- package/package.json +67 -99
- package/scripts/boot-smoke.mjs +94 -0
- package/scripts/build-tui.mjs +52 -0
- package/scripts/compact-smoke.mjs +199 -0
- package/scripts/lead-workflow-smoke.mjs +598 -0
- package/scripts/live-worker-smoke.mjs +239 -0
- package/scripts/output-style-smoke.mjs +101 -0
- package/scripts/smoke-loop-report.mjs +221 -0
- package/scripts/smoke-loop.mjs +201 -0
- package/scripts/smoke.mjs +113 -0
- package/scripts/tool-failures.mjs +143 -0
- package/scripts/tool-smoke.mjs +456 -0
- package/src/agents/debugger/AGENT.md +3 -0
- package/src/agents/debugger/agent.json +6 -0
- package/src/agents/explore/AGENT.md +4 -0
- package/src/agents/explore/agent.json +6 -0
- package/src/agents/heavy-worker/AGENT.md +3 -0
- package/src/agents/heavy-worker/agent.json +6 -0
- package/src/agents/maintainer/AGENT.md +3 -0
- package/src/agents/maintainer/agent.json +6 -0
- package/src/agents/reviewer/AGENT.md +3 -0
- package/src/agents/reviewer/agent.json +6 -0
- package/src/agents/scheduler-task.md +3 -0
- package/src/agents/web-researcher/AGENT.md +3 -0
- package/src/agents/web-researcher/agent.json +6 -0
- package/src/agents/webhook-handler.md +3 -0
- package/src/agents/worker/AGENT.md +3 -0
- package/src/agents/worker/agent.json +6 -0
- package/src/app.mjs +90 -0
- package/src/cli.mjs +11 -0
- package/src/defaults/hidden-roles.json +72 -0
- package/src/defaults/mixdog-config.template.json +15 -0
- package/src/hooks/lib/permission-evaluator.cjs +488 -0
- package/src/hooks/lib/settings-loader.cjs +112 -0
- package/src/lib/keychain-cjs.cjs +332 -0
- package/src/lib/plugin-paths.cjs +28 -0
- package/src/lib/rules-builder.cjs +315 -0
- package/src/mixdog-session-runtime.mjs +3704 -0
- package/src/output-styles/default.md +38 -0
- package/src/output-styles/extreme-simple.md +17 -0
- package/src/output-styles/simple.md +17 -0
- package/src/repl.mjs +322 -0
- package/src/rules/bridge/00-common.md +5 -0
- package/src/rules/bridge/20-skip-protocol.md +11 -0
- package/src/rules/bridge/30-explorer.md +4 -0
- package/src/rules/bridge/40-cycle1-agent.md +28 -0
- package/src/rules/bridge/41-cycle2-agent.md +59 -0
- package/src/rules/lead/00-tool-lead.md +5 -0
- package/src/rules/lead/01-general.md +5 -0
- package/src/rules/lead/02-channels.md +3 -0
- package/src/rules/lead/04-workflow.md +12 -0
- package/src/rules/shared/00-language.md +3 -0
- package/src/rules/shared/01-tool.md +3 -0
- package/src/runtime/agent/orchestrator/bridge-trace.mjs +814 -0
- package/src/runtime/agent/orchestrator/cache-mtime.mjs +60 -0
- package/src/runtime/agent/orchestrator/config.mjs +446 -0
- package/src/runtime/agent/orchestrator/context/collect.mjs +796 -0
- package/src/runtime/agent/orchestrator/dispatch-persist.mjs +417 -0
- package/src/runtime/agent/orchestrator/internal-roles.mjs +188 -0
- package/src/runtime/agent/orchestrator/internal-tools.mjs +88 -0
- package/src/runtime/agent/orchestrator/mcp/client.mjs +345 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2104 -0
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +784 -0
- package/src/runtime/agent/orchestrator/providers/api-usage.mjs +341 -0
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +1679 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +959 -0
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +213 -0
- package/src/runtime/agent/orchestrator/providers/model-cache.mjs +38 -0
- package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +471 -0
- package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +615 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +808 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +1719 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2587 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +1953 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +136 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +317 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +109 -0
- package/src/runtime/agent/orchestrator/providers/registry.mjs +247 -0
- package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +332 -0
- package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +11 -0
- package/src/runtime/agent/orchestrator/providers/trace-utils.mjs +50 -0
- package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +142 -0
- package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +318 -0
- package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +367 -0
- package/src/runtime/agent/orchestrator/session/compact.mjs +882 -0
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +233 -0
- package/src/runtime/agent/orchestrator/session/loop.mjs +2320 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +2960 -0
- package/src/runtime/agent/orchestrator/session/result-classification.mjs +65 -0
- package/src/runtime/agent/orchestrator/session/store.mjs +663 -0
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +166 -0
- package/src/runtime/agent/orchestrator/smart-bridge/bridge-llm.mjs +339 -0
- package/src/runtime/agent/orchestrator/smart-bridge/cache-strategy.mjs +419 -0
- package/src/runtime/agent/orchestrator/stall-policy.mjs +227 -0
- package/src/runtime/agent/orchestrator/tool-loop-guard.mjs +235 -0
- package/src/runtime/agent/orchestrator/tools/bash-session.mjs +723 -0
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +389 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +637 -0
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +165 -0
- package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +104 -0
- package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +194 -0
- package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +596 -0
- package/src/runtime/agent/orchestrator/tools/builtin/native-edit-runner.mjs +110 -0
- package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +153 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +118 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +189 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +731 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +168 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +602 -0
- package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +465 -0
- package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +160 -0
- package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +982 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1087 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +231 -0
- package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +223 -0
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +478 -0
- package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +24 -0
- package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4102 -0
- package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +323 -0
- package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +154 -0
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +26 -0
- package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +143 -0
- package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +18 -0
- package/src/runtime/agent/orchestrator/tools/patch.mjs +2772 -0
- package/src/runtime/agent/orchestrator/tools/progress-message.mjs +114 -0
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +880 -0
- package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +312 -0
- package/src/runtime/channels/backends/discord.mjs +781 -0
- package/src/runtime/channels/data/voice-runtime-manifest.json +138 -0
- package/src/runtime/channels/index.mjs +3309 -0
- package/src/runtime/channels/lib/config.mjs +285 -0
- package/src/runtime/channels/lib/drop-trace.mjs +71 -0
- package/src/runtime/channels/lib/event-pipeline.mjs +81 -0
- package/src/runtime/channels/lib/holidays.mjs +138 -0
- package/src/runtime/channels/lib/hook-pipe-server.mjs +671 -0
- package/src/runtime/channels/lib/output-forwarder.mjs +765 -0
- package/src/runtime/channels/lib/runtime-paths.mjs +497 -0
- package/src/runtime/channels/lib/scheduler.mjs +710 -0
- package/src/runtime/channels/lib/session-discovery.mjs +102 -0
- package/src/runtime/channels/lib/state-file.mjs +68 -0
- package/src/runtime/channels/lib/status-snapshot.mjs +224 -0
- package/src/runtime/channels/lib/tool-format.mjs +124 -0
- package/src/runtime/channels/lib/transcript-discovery.mjs +195 -0
- package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +734 -0
- package/src/runtime/channels/lib/webhook.mjs +1288 -0
- package/src/runtime/channels/tool-defs.mjs +177 -0
- package/src/runtime/lib/keychain-cjs.cjs +289 -0
- package/src/runtime/memory/data/runtime-manifest.json +40 -0
- package/src/runtime/memory/index.mjs +3600 -0
- package/src/runtime/memory/lib/core-memory-store.mjs +336 -0
- package/src/runtime/memory/lib/embedding-provider.mjs +275 -0
- package/src/runtime/memory/lib/embedding-worker.mjs +331 -0
- package/src/runtime/memory/lib/memory-cycle-requests.mjs +276 -0
- package/src/runtime/memory/lib/memory-cycle1.mjs +783 -0
- package/src/runtime/memory/lib/memory-cycle2.mjs +1389 -0
- package/src/runtime/memory/lib/memory-cycle3.mjs +646 -0
- package/src/runtime/memory/lib/memory-embed.mjs +300 -0
- package/src/runtime/memory/lib/memory-ops-policy.mjs +149 -0
- package/src/runtime/memory/lib/memory-recall-store.mjs +644 -0
- package/src/runtime/memory/lib/memory.mjs +418 -0
- package/src/runtime/memory/lib/pg/adapter.mjs +314 -0
- package/src/runtime/memory/lib/pg/process.mjs +366 -0
- package/src/runtime/memory/lib/pg/supervisor.mjs +495 -0
- package/src/runtime/memory/lib/runtime-fetcher.mjs +464 -0
- package/src/runtime/memory/lib/trace-store.mjs +734 -0
- package/src/runtime/memory/tool-defs.mjs +79 -0
- package/src/runtime/search/index.mjs +925 -0
- package/src/runtime/search/lib/config.mjs +61 -0
- package/src/runtime/search/lib/web-tools.mjs +1278 -0
- package/src/runtime/search/tool-defs.mjs +64 -0
- package/src/runtime/shared/atomic-file.mjs +435 -0
- package/src/runtime/shared/background-tasks.mjs +376 -0
- package/src/runtime/shared/child-guardian.mjs +98 -0
- package/src/runtime/shared/config.mjs +393 -0
- package/src/runtime/shared/err-text.mjs +121 -0
- package/src/runtime/shared/launcher-control.mjs +259 -0
- package/src/runtime/shared/llm/http-agent.mjs +129 -0
- package/src/runtime/shared/open-url.mjs +37 -0
- package/src/runtime/shared/plugin-paths.mjs +25 -0
- package/src/runtime/shared/process-shutdown.mjs +147 -0
- package/src/runtime/shared/schedules-store.mjs +70 -0
- package/src/runtime/shared/tool-execution-contract.mjs +104 -0
- package/src/runtime/shared/tool-surface.mjs +950 -0
- package/src/runtime/shared/user-cwd.mjs +221 -0
- package/src/runtime/shared/user-data-guard.mjs +232 -0
- package/src/runtime/shared/workspace-router.mjs +259 -0
- package/src/standalone/bridge-tool.mjs +1414 -0
- package/src/standalone/channel-admin.mjs +366 -0
- package/src/standalone/channel-worker-preload.cjs +3 -0
- package/src/standalone/channel-worker.mjs +353 -0
- package/src/standalone/explore-tool.mjs +233 -0
- package/src/standalone/hook-bus.mjs +246 -0
- package/src/standalone/plugin-admin.mjs +247 -0
- package/src/standalone/provider-admin.mjs +338 -0
- package/src/standalone/seeds.mjs +94 -0
- package/src/standalone/usage-dashboard.mjs +510 -0
- package/src/tui/App.jsx +5438 -0
- package/src/tui/components/AnsiText.jsx +199 -0
- package/src/tui/components/ContextPanel.jsx +217 -0
- package/src/tui/components/Markdown.jsx +205 -0
- package/src/tui/components/MarkdownTable.jsx +204 -0
- package/src/tui/components/Message.jsx +103 -0
- package/src/tui/components/Picker.jsx +317 -0
- package/src/tui/components/PromptInput.jsx +584 -0
- package/src/tui/components/QueuedCommands.jsx +47 -0
- package/src/tui/components/SlashCommandPalette.jsx +114 -0
- package/src/tui/components/Spinner.jsx +317 -0
- package/src/tui/components/StatusLine.jsx +87 -0
- package/src/tui/components/TextEntryPanel.jsx +323 -0
- package/src/tui/components/ToolExecution.jsx +772 -0
- package/src/tui/components/TurnDone.jsx +78 -0
- package/src/tui/components/UsagePanel.jsx +331 -0
- package/src/tui/dist/index.mjs +12359 -0
- package/src/tui/engine.mjs +2410 -0
- package/src/tui/figures.mjs +50 -0
- package/src/tui/hooks/useEngine.mjs +16 -0
- package/src/tui/index.jsx +254 -0
- package/src/tui/input-editing.mjs +242 -0
- package/src/tui/markdown/format-token.mjs +194 -0
- package/src/tui/paste-attachments.mjs +198 -0
- package/src/tui/runtime/shared/process-shutdown.mjs +1 -0
- package/src/tui/spinner-verbs.mjs +45 -0
- package/src/tui/theme.mjs +67 -0
- package/src/tui/time-format.mjs +53 -0
- package/src/ui/ansi.mjs +115 -0
- package/src/ui/markdown.mjs +195 -0
- package/src/ui/statusline.mjs +730 -0
- package/src/ui/tool-card.mjs +101 -0
- package/src/vendor/statusline/bin/statusline-lib.mjs +805 -0
- package/src/vendor/statusline/bin/statusline-route.mjs +596 -0
- package/src/vendor/statusline/scripts/lib/gateway-settings.mjs +285 -0
- package/src/vendor/statusline/src/gateway/claude-current.mjs +320 -0
- package/src/vendor/statusline/src/gateway/route-meta.mjs +753 -0
- package/src/vendor/statusline/src/gateway/session-routes.mjs +244 -0
- package/src/workflows/default/WORKFLOW.md +7 -0
- package/src/workflows/default/workflow.json +14 -0
- package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
- package/vendor/ink/build/ansi-tokenizer.js +316 -0
- package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
- package/vendor/ink/build/colorize.d.ts +3 -0
- package/vendor/ink/build/colorize.js +48 -0
- package/vendor/ink/build/colorize.js.map +1 -0
- package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
- package/vendor/ink/build/components/AccessibilityContext.js +5 -0
- package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
- package/vendor/ink/build/components/AnimationContext.d.ts +9 -0
- package/vendor/ink/build/components/AnimationContext.js +13 -0
- package/vendor/ink/build/components/AnimationContext.js.map +1 -0
- package/vendor/ink/build/components/App.d.ts +24 -0
- package/vendor/ink/build/components/App.js +554 -0
- package/vendor/ink/build/components/App.js.map +1 -0
- package/vendor/ink/build/components/AppContext.d.ts +80 -0
- package/vendor/ink/build/components/AppContext.js +25 -0
- package/vendor/ink/build/components/AppContext.js.map +1 -0
- package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
- package/vendor/ink/build/components/BackgroundContext.js +3 -0
- package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
- package/vendor/ink/build/components/Box.d.ts +130 -0
- package/vendor/ink/build/components/Box.js +34 -0
- package/vendor/ink/build/components/Box.js.map +1 -0
- package/vendor/ink/build/components/CursorContext.d.ts +11 -0
- package/vendor/ink/build/components/CursorContext.js +8 -0
- package/vendor/ink/build/components/CursorContext.js.map +1 -0
- package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
- package/vendor/ink/build/components/ErrorBoundary.js +23 -0
- package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
- package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
- package/vendor/ink/build/components/ErrorOverview.js +90 -0
- package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
- package/vendor/ink/build/components/FocusContext.d.ts +16 -0
- package/vendor/ink/build/components/FocusContext.js +17 -0
- package/vendor/ink/build/components/FocusContext.js.map +1 -0
- package/vendor/ink/build/components/Newline.d.ts +13 -0
- package/vendor/ink/build/components/Newline.js +8 -0
- package/vendor/ink/build/components/Newline.js.map +1 -0
- package/vendor/ink/build/components/Spacer.d.ts +7 -0
- package/vendor/ink/build/components/Spacer.js +11 -0
- package/vendor/ink/build/components/Spacer.js.map +1 -0
- package/vendor/ink/build/components/Static.d.ts +24 -0
- package/vendor/ink/build/components/Static.js +28 -0
- package/vendor/ink/build/components/Static.js.map +1 -0
- package/vendor/ink/build/components/StderrContext.d.ts +15 -0
- package/vendor/ink/build/components/StderrContext.js +13 -0
- package/vendor/ink/build/components/StderrContext.js.map +1 -0
- package/vendor/ink/build/components/StdinContext.d.ts +28 -0
- package/vendor/ink/build/components/StdinContext.js +20 -0
- package/vendor/ink/build/components/StdinContext.js.map +1 -0
- package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
- package/vendor/ink/build/components/StdoutContext.js +13 -0
- package/vendor/ink/build/components/StdoutContext.js.map +1 -0
- package/vendor/ink/build/components/Text.d.ts +55 -0
- package/vendor/ink/build/components/Text.js +50 -0
- package/vendor/ink/build/components/Text.js.map +1 -0
- package/vendor/ink/build/components/Transform.d.ts +16 -0
- package/vendor/ink/build/components/Transform.js +15 -0
- package/vendor/ink/build/components/Transform.js.map +1 -0
- package/vendor/ink/build/cursor-helpers.d.ts +39 -0
- package/vendor/ink/build/cursor-helpers.js +62 -0
- package/vendor/ink/build/cursor-helpers.js.map +1 -0
- package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
- package/vendor/ink/build/devtools-window-polyfill.js +68 -0
- package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
- package/vendor/ink/build/devtools.d.ts +1 -0
- package/vendor/ink/build/devtools.js +36 -0
- package/vendor/ink/build/devtools.js.map +1 -0
- package/vendor/ink/build/dom.d.ts +62 -0
- package/vendor/ink/build/dom.js +143 -0
- package/vendor/ink/build/dom.js.map +1 -0
- package/vendor/ink/build/get-max-width.d.ts +3 -0
- package/vendor/ink/build/get-max-width.js +10 -0
- package/vendor/ink/build/get-max-width.js.map +1 -0
- package/vendor/ink/build/hooks/use-animation.d.ts +49 -0
- package/vendor/ink/build/hooks/use-animation.js +87 -0
- package/vendor/ink/build/hooks/use-animation.js.map +1 -0
- package/vendor/ink/build/hooks/use-app.d.ts +5 -0
- package/vendor/ink/build/hooks/use-app.js +8 -0
- package/vendor/ink/build/hooks/use-app.js.map +1 -0
- package/vendor/ink/build/hooks/use-box-metrics.d.ts +59 -0
- package/vendor/ink/build/hooks/use-box-metrics.js +81 -0
- package/vendor/ink/build/hooks/use-box-metrics.js.map +1 -0
- package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
- package/vendor/ink/build/hooks/use-cursor.js +29 -0
- package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
- package/vendor/ink/build/hooks/use-focus-manager.d.ts +43 -0
- package/vendor/ink/build/hooks/use-focus-manager.js +18 -0
- package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
- package/vendor/ink/build/hooks/use-focus.d.ts +30 -0
- package/vendor/ink/build/hooks/use-focus.js +43 -0
- package/vendor/ink/build/hooks/use-focus.js.map +1 -0
- package/vendor/ink/build/hooks/use-input.d.ts +132 -0
- package/vendor/ink/build/hooks/use-input.js +126 -0
- package/vendor/ink/build/hooks/use-input.js.map +1 -0
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +6 -0
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +12 -0
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
- package/vendor/ink/build/hooks/use-paste.d.ts +35 -0
- package/vendor/ink/build/hooks/use-paste.js +62 -0
- package/vendor/ink/build/hooks/use-paste.js.map +1 -0
- package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
- package/vendor/ink/build/hooks/use-stderr.js +8 -0
- package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
- package/vendor/ink/build/hooks/use-stdin.d.ts +7 -0
- package/vendor/ink/build/hooks/use-stdin.js +9 -0
- package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
- package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
- package/vendor/ink/build/hooks/use-stdout.js +8 -0
- package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
- package/vendor/ink/build/hooks/use-window-size.d.ts +18 -0
- package/vendor/ink/build/hooks/use-window-size.js +22 -0
- package/vendor/ink/build/hooks/use-window-size.js.map +1 -0
- package/vendor/ink/build/index.d.ts +42 -0
- package/vendor/ink/build/index.js +24 -0
- package/vendor/ink/build/index.js.map +1 -0
- package/vendor/ink/build/ink.d.ts +146 -0
- package/vendor/ink/build/ink.js +1022 -0
- package/vendor/ink/build/ink.js.map +1 -0
- package/vendor/ink/build/input-parser.d.ts +10 -0
- package/vendor/ink/build/input-parser.js +194 -0
- package/vendor/ink/build/input-parser.js.map +1 -0
- package/vendor/ink/build/instances.d.ts +3 -0
- package/vendor/ink/build/instances.js +8 -0
- package/vendor/ink/build/instances.js.map +1 -0
- package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
- package/vendor/ink/build/kitty-keyboard.js +32 -0
- package/vendor/ink/build/kitty-keyboard.js.map +1 -0
- package/vendor/ink/build/log-update.d.ts +20 -0
- package/vendor/ink/build/log-update.js +261 -0
- package/vendor/ink/build/log-update.js.map +1 -0
- package/vendor/ink/build/measure-element.d.ts +20 -0
- package/vendor/ink/build/measure-element.js +13 -0
- package/vendor/ink/build/measure-element.js.map +1 -0
- package/vendor/ink/build/measure-text.d.ts +6 -0
- package/vendor/ink/build/measure-text.js +21 -0
- package/vendor/ink/build/measure-text.js.map +1 -0
- package/vendor/ink/build/output.d.ts +35 -0
- package/vendor/ink/build/output.js +328 -0
- package/vendor/ink/build/output.js.map +1 -0
- package/vendor/ink/build/parse-keypress.d.ts +20 -0
- package/vendor/ink/build/parse-keypress.js +495 -0
- package/vendor/ink/build/parse-keypress.js.map +1 -0
- package/vendor/ink/build/reconciler.d.ts +4 -0
- package/vendor/ink/build/reconciler.js +306 -0
- package/vendor/ink/build/reconciler.js.map +1 -0
- package/vendor/ink/build/render-background.d.ts +4 -0
- package/vendor/ink/build/render-background.js +25 -0
- package/vendor/ink/build/render-background.js.map +1 -0
- package/vendor/ink/build/render-border.d.ts +4 -0
- package/vendor/ink/build/render-border.js +84 -0
- package/vendor/ink/build/render-border.js.map +1 -0
- package/vendor/ink/build/render-node-to-output.d.ts +14 -0
- package/vendor/ink/build/render-node-to-output.js +162 -0
- package/vendor/ink/build/render-node-to-output.js.map +1 -0
- package/vendor/ink/build/render-to-string.d.ts +38 -0
- package/vendor/ink/build/render-to-string.js +116 -0
- package/vendor/ink/build/render-to-string.js.map +1 -0
- package/vendor/ink/build/render.d.ts +176 -0
- package/vendor/ink/build/render.js +71 -0
- package/vendor/ink/build/render.js.map +1 -0
- package/vendor/ink/build/renderer.d.ts +8 -0
- package/vendor/ink/build/renderer.js +64 -0
- package/vendor/ink/build/renderer.js.map +1 -0
- package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
- package/vendor/ink/build/sanitize-ansi.js +27 -0
- package/vendor/ink/build/sanitize-ansi.js.map +1 -0
- package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
- package/vendor/ink/build/squash-text-nodes.js +36 -0
- package/vendor/ink/build/squash-text-nodes.js.map +1 -0
- package/vendor/ink/build/styles.d.ts +302 -0
- package/vendor/ink/build/styles.js +303 -0
- package/vendor/ink/build/styles.js.map +1 -0
- package/vendor/ink/build/utils.d.ts +9 -0
- package/vendor/ink/build/utils.js +19 -0
- package/vendor/ink/build/utils.js.map +1 -0
- package/vendor/ink/build/wrap-text.d.ts +3 -0
- package/vendor/ink/build/wrap-text.js +38 -0
- package/vendor/ink/build/wrap-text.js.map +1 -0
- package/vendor/ink/build/write-synchronized.d.ts +4 -0
- package/vendor/ink/build/write-synchronized.js +9 -0
- package/vendor/ink/build/write-synchronized.js.map +1 -0
- package/vendor/ink/license +10 -0
- package/vendor/ink/package.json +137 -0
- package/.claude-plugin/marketplace.json +0 -34
- package/.claude-plugin/plugin.json +0 -20
- package/.gitattributes +0 -34
- package/.mcp.json +0 -14
- package/ARCHITECTURE.md +0 -77
- package/CHANGELOG.md +0 -30
- package/CONTRIBUTING.md +0 -45
- package/DATA-FLOW.md +0 -79
- package/LICENSE +0 -21
- package/SECURITY.md +0 -138
- package/UNINSTALL.md +0 -115
- package/agents/maintenance.md +0 -5
- package/agents/memory-classification.md +0 -30
- package/agents/scheduler-task.md +0 -18
- package/agents/webhook-handler.md +0 -27
- package/agents/worker.md +0 -24
- package/bin/bridge +0 -133
- package/bin/statusline-launcher.mjs +0 -82
- package/bin/statusline-lib.mjs +0 -581
- package/bin/statusline-route.mjs +0 -273
- package/bin/statusline.mjs +0 -638
- package/bun.lock +0 -927
- package/commands/config.md +0 -16
- package/commands/doctor.md +0 -13
- package/commands/model.md +0 -61
- package/commands/setup.md +0 -17
- package/defaults/hidden-roles.json +0 -68
- package/defaults/memory-chunk-prompt.md +0 -63
- package/defaults/mixdog-config.template.json +0 -27
- package/defaults/user-workflow.json +0 -8
- package/defaults/user-workflow.md +0 -17
- package/hooks/hooks.json +0 -73
- package/hooks/lib/active-instance.cjs +0 -77
- package/hooks/lib/permission-evaluator.cjs +0 -411
- package/hooks/lib/permission-route.cjs +0 -63
- package/hooks/lib/settings-loader.cjs +0 -117
- package/hooks/post-tool-use.cjs +0 -84
- package/hooks/pre-mcp-sandbox.cjs +0 -158
- package/hooks/pre-tool-subagent.cjs +0 -258
- package/hooks/session-start.cjs +0 -1493
- package/hooks/shim-launcher.cjs +0 -65
- package/hooks/turn-timer.cjs +0 -82
- package/lib/claude-md-writer.cjs +0 -386
- package/lib/keychain-cjs.cjs +0 -290
- package/lib/plugin-paths.cjs +0 -69
- package/lib/rules-builder.cjs +0 -241
- package/native/README.md +0 -117
- package/native/prebuilt/linux-aarch64/mixdog-shim +0 -0
- package/native/prebuilt/linux-x86_64/mixdog-shim +0 -0
- package/native/prebuilt/macos-aarch64/mixdog-shim +0 -0
- package/native/prebuilt/macos-x86_64/mixdog-shim +0 -0
- package/native/prebuilt/windows-x86_64/mixdog-shim.exe +0 -0
- package/prompts/code-review.txt +0 -16
- package/prompts/security-audit.txt +0 -17
- package/rules/bridge/00-common.md +0 -39
- package/rules/bridge/20-skip-protocol.md +0 -18
- package/rules/bridge/30-explorer.md +0 -33
- package/rules/bridge/40-cycle1-agent.md +0 -52
- package/rules/bridge/41-cycle2-agent.md +0 -62
- package/rules/lead/00-tool-lead.md +0 -61
- package/rules/lead/01-general.md +0 -26
- package/rules/lead/02-channels.md +0 -49
- package/rules/lead/03-team.md +0 -27
- package/rules/lead/04-workflow.md +0 -20
- package/rules/shared/00-language.md +0 -14
- package/rules/shared/01-tool.md +0 -138
- package/scripts/bootstrap.mjs +0 -130
- package/scripts/bridge-unify-smoke.mjs +0 -308
- package/scripts/build-runtime-linux.sh +0 -348
- package/scripts/build-runtime-macos.sh +0 -217
- package/scripts/build-runtime-windows.ps1 +0 -242
- package/scripts/builtin-utils-smoke.mjs +0 -398
- package/scripts/bump.mjs +0 -80
- package/scripts/check-json.mjs +0 -45
- package/scripts/check-syntax-changed.mjs +0 -102
- package/scripts/check-syntax.mjs +0 -58
- package/scripts/code-graph-batch.test.mjs +0 -33
- package/scripts/config-preserve-smoke.mjs +0 -180
- package/scripts/doctor.mjs +0 -489
- package/scripts/edit-normalize-fuzz.mjs +0 -130
- package/scripts/edit-normalize-smoke.mjs +0 -401
- package/scripts/edit-operation-smoke.mjs +0 -369
- package/scripts/edit2-smoke.mjs +0 -63
- package/scripts/ensure-deps.mjs +0 -259
- package/scripts/fuzzy-e2e.mjs +0 -28
- package/scripts/fuzzy-smoke.mjs +0 -26
- package/scripts/gateway-model.mjs +0 -596
- package/scripts/generate-runtime-manifest.mjs +0 -166
- package/scripts/guard-smoke.mjs +0 -66
- package/scripts/hidden-role-schema-smoke.mjs +0 -162
- package/scripts/hook-routing-smoke.mjs +0 -29
- package/scripts/inject-input.ps1 +0 -204
- package/scripts/io-complex-smoke.mjs +0 -667
- package/scripts/io-explore-bench.mjs +0 -424
- package/scripts/io-guardrails-smoke.mjs +0 -205
- package/scripts/io-mini-bench-baseline.json +0 -11
- package/scripts/io-mini-bench.mjs +0 -216
- package/scripts/io-route-harness.mjs +0 -933
- package/scripts/io-telemetry-report.mjs +0 -691
- package/scripts/lib/gateway-inventory.mjs +0 -178
- package/scripts/lib/gateway-settings.mjs +0 -78
- package/scripts/mutation-bench.mjs +0 -564
- package/scripts/mutation-io-smoke.mjs +0 -1097
- package/scripts/native-patch-bridge-smoke.mjs +0 -288
- package/scripts/native-patch-smoke.mjs +0 -304
- package/scripts/openai-oauth-catalog-smoke.mjs +0 -53
- package/scripts/patch-interior-context-smoke.mjs +0 -49
- package/scripts/patch-newline-utf8-smoke.mjs +0 -157
- package/scripts/perf-hook-smoke.mjs +0 -71
- package/scripts/permission-eval-smoke.mjs +0 -443
- package/scripts/prep-patch.mjs +0 -53
- package/scripts/prep-shim.mjs +0 -96
- package/scripts/provider-cache-smoke.mjs +0 -687
- package/scripts/report-runtime-health.mjs +0 -132
- package/scripts/resolve-bun.mjs +0 -60
- package/scripts/run-mcp.mjs +0 -1473
- package/scripts/salvage-v4a-shatter.test.mjs +0 -58
- package/scripts/scoped-cache-io-smoke.mjs +0 -103
- package/scripts/shell-policy-round3-smoke.mjs +0 -46
- package/scripts/smoke-runtime-negative.ps1 +0 -100
- package/scripts/smoke-runtime-negative.sh +0 -95
- package/scripts/stall-policy-smoke.mjs +0 -50
- package/scripts/start-memory-worker.mjs +0 -23
- package/scripts/statusline-launcher-smoke.mjs +0 -235
- package/scripts/stress-atomic-write.mjs +0 -1028
- package/scripts/test-fault-inject.mjs +0 -164
- package/scripts/test-large-file.mjs +0 -174
- package/scripts/tool-edge-smoke.mjs +0 -209
- package/scripts/uninstall.mjs +0 -238
- package/scripts/webhook-selfheal-smoke.mjs +0 -27
- package/scripts/write-overwrite-guard-smoke.mjs +0 -56
- package/server-main.mjs +0 -3350
- package/server.mjs +0 -468
- package/setup/config-merge.mjs +0 -246
- package/setup/install.mjs +0 -574
- package/setup/launch-core.mjs +0 -617
- package/setup/launch.mjs +0 -101
- package/setup/locate-claude.mjs +0 -56
- package/setup/mixdog-cli.mjs +0 -122
- package/setup/setup-server.mjs +0 -3305
- package/setup/setup.html +0 -3740
- package/setup/tui.mjs +0 -325
- package/skills/retro-skill-proposer/SKILL.md +0 -92
- package/skills/schedule-add/SKILL.md +0 -77
- package/skills/setup/SKILL.md +0 -356
- package/skills/webhook-add/SKILL.md +0 -81
- package/src/agent/bridge-stall-watchdog.mjs +0 -337
- package/src/agent/index.mjs +0 -2229
- package/src/agent/orchestrator/ai-wrapped-dispatch.mjs +0 -1010
- package/src/agent/orchestrator/bridge-retry.mjs +0 -220
- package/src/agent/orchestrator/bridge-trace.mjs +0 -601
- package/src/agent/orchestrator/cache-mtime.mjs +0 -58
- package/src/agent/orchestrator/config.mjs +0 -405
- package/src/agent/orchestrator/context/collect.mjs +0 -651
- package/src/agent/orchestrator/dispatch-persist.mjs +0 -549
- package/src/agent/orchestrator/drain-registry.mjs +0 -50
- package/src/agent/orchestrator/explore-validator.mjs +0 -8
- package/src/agent/orchestrator/internal-roles.mjs +0 -118
- package/src/agent/orchestrator/internal-tools.mjs +0 -88
- package/src/agent/orchestrator/jobs.mjs +0 -116
- package/src/agent/orchestrator/mcp/client.mjs +0 -364
- package/src/agent/orchestrator/providers/anthropic-oauth.mjs +0 -1884
- package/src/agent/orchestrator/providers/anthropic.mjs +0 -598
- package/src/agent/orchestrator/providers/gemini.mjs +0 -1530
- package/src/agent/orchestrator/providers/grok-oauth.mjs +0 -779
- package/src/agent/orchestrator/providers/model-catalog.mjs +0 -374
- package/src/agent/orchestrator/providers/openai-compat-stream.mjs +0 -366
- package/src/agent/orchestrator/providers/openai-compat.mjs +0 -1511
- package/src/agent/orchestrator/providers/openai-oauth-ws.mjs +0 -1891
- package/src/agent/orchestrator/providers/openai-oauth.mjs +0 -1456
- package/src/agent/orchestrator/providers/openai-ws.mjs +0 -127
- package/src/agent/orchestrator/providers/registry.mjs +0 -192
- package/src/agent/orchestrator/providers/retry-classifier.mjs +0 -325
- package/src/agent/orchestrator/session/cache/prefetch-cache.mjs +0 -142
- package/src/agent/orchestrator/session/cache/read-cache.mjs +0 -319
- package/src/agent/orchestrator/session/cache/scoped-cache.mjs +0 -361
- package/src/agent/orchestrator/session/loop.mjs +0 -1619
- package/src/agent/orchestrator/session/manager.mjs +0 -1991
- package/src/agent/orchestrator/session/result-classification.mjs +0 -65
- package/src/agent/orchestrator/session/store.mjs +0 -632
- package/src/agent/orchestrator/session/stream-watchdog.mjs +0 -130
- package/src/agent/orchestrator/session/tool-result-offload.mjs +0 -166
- package/src/agent/orchestrator/session/trim.mjs +0 -491
- package/src/agent/orchestrator/smart-bridge/CACHE-SHARD.md +0 -115
- package/src/agent/orchestrator/smart-bridge/bridge-llm.mjs +0 -331
- package/src/agent/orchestrator/smart-bridge/cache-obs.mjs +0 -150
- package/src/agent/orchestrator/smart-bridge/cache-strategy.mjs +0 -228
- package/src/agent/orchestrator/smart-bridge/index.mjs +0 -215
- package/src/agent/orchestrator/smart-bridge/profiles.mjs +0 -37
- package/src/agent/orchestrator/smart-bridge/registry.mjs +0 -348
- package/src/agent/orchestrator/stall-policy.mjs +0 -201
- package/src/agent/orchestrator/tool-loop-guard.mjs +0 -75
- package/src/agent/orchestrator/tools/bash-session.mjs +0 -722
- package/src/agent/orchestrator/tools/builtin/arg-guard.mjs +0 -511
- package/src/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -480
- package/src/agent/orchestrator/tools/builtin/builtin-tools.mjs +0 -256
- package/src/agent/orchestrator/tools/builtin/edit-base-guard.mjs +0 -58
- package/src/agent/orchestrator/tools/builtin/edit-byte-plan.mjs +0 -240
- package/src/agent/orchestrator/tools/builtin/edit-byte-utils.mjs +0 -113
- package/src/agent/orchestrator/tools/builtin/edit-commit.mjs +0 -74
- package/src/agent/orchestrator/tools/builtin/edit-context-utils.mjs +0 -242
- package/src/agent/orchestrator/tools/builtin/edit-diagnostics.mjs +0 -211
- package/src/agent/orchestrator/tools/builtin/edit-engine.mjs +0 -1364
- package/src/agent/orchestrator/tools/builtin/edit-failure-context.mjs +0 -126
- package/src/agent/orchestrator/tools/builtin/edit-hint.mjs +0 -141
- package/src/agent/orchestrator/tools/builtin/edit-match-utils.mjs +0 -194
- package/src/agent/orchestrator/tools/builtin/edit-partial-write.mjs +0 -60
- package/src/agent/orchestrator/tools/builtin/edit-stale-refresh.mjs +0 -168
- package/src/agent/orchestrator/tools/builtin/edit-tool.mjs +0 -173
- package/src/agent/orchestrator/tools/builtin/edit-utf8-guard.mjs +0 -48
- package/src/agent/orchestrator/tools/builtin/fuzzy-match.mjs +0 -99
- package/src/agent/orchestrator/tools/builtin/glob-walk.mjs +0 -193
- package/src/agent/orchestrator/tools/builtin/list-tool.mjs +0 -597
- package/src/agent/orchestrator/tools/builtin/native-edit-runner.mjs +0 -110
- package/src/agent/orchestrator/tools/builtin/notebook-edit-tool.mjs +0 -300
- package/src/agent/orchestrator/tools/builtin/path-diagnostics.mjs +0 -152
- package/src/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -118
- package/src/agent/orchestrator/tools/builtin/read-open.mjs +0 -190
- package/src/agent/orchestrator/tools/builtin/read-single-tool.mjs +0 -728
- package/src/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +0 -173
- package/src/agent/orchestrator/tools/builtin/read-streaming.mjs +0 -602
- package/src/agent/orchestrator/tools/builtin/rename-tool.mjs +0 -196
- package/src/agent/orchestrator/tools/builtin/rg-runner.mjs +0 -422
- package/src/agent/orchestrator/tools/builtin/search-builders.mjs +0 -158
- package/src/agent/orchestrator/tools/builtin/search-tool.mjs +0 -869
- package/src/agent/orchestrator/tools/builtin/shell-jobs.mjs +0 -962
- package/src/agent/orchestrator/tools/builtin/shell-runtime.mjs +0 -223
- package/src/agent/orchestrator/tools/builtin/snapshot-store.mjs +0 -206
- package/src/agent/orchestrator/tools/builtin/write-tool.mjs +0 -401
- package/src/agent/orchestrator/tools/builtin.mjs +0 -503
- package/src/agent/orchestrator/tools/code-graph-tool-defs.mjs +0 -24
- package/src/agent/orchestrator/tools/code-graph.mjs +0 -4095
- package/src/agent/orchestrator/tools/cwd-tool.mjs +0 -298
- package/src/agent/orchestrator/tools/destructive-warning.mjs +0 -323
- package/src/agent/orchestrator/tools/edit-normalize.mjs +0 -603
- package/src/agent/orchestrator/tools/graph-binary-fetcher.mjs +0 -154
- package/src/agent/orchestrator/tools/graph-manifest.json +0 -26
- package/src/agent/orchestrator/tools/host-input.mjs +0 -204
- package/src/agent/orchestrator/tools/patch-binary-fetcher.mjs +0 -143
- package/src/agent/orchestrator/tools/patch-manifest.json +0 -26
- package/src/agent/orchestrator/tools/patch-tool-defs.mjs +0 -20
- package/src/agent/orchestrator/tools/patch.mjs +0 -2754
- package/src/agent/orchestrator/tools/progress-message.mjs +0 -118
- package/src/agent/orchestrator/tools/shell-command.mjs +0 -865
- package/src/agent/orchestrator/tools/shell-policy-imports.mjs +0 -7
- package/src/agent/orchestrator/tools/shell-snapshot.mjs +0 -313
- package/src/agent/orchestrator/workflow-store.mjs +0 -93
- package/src/agent/tool-defs.mjs +0 -110
- package/src/channels/backends/discord.mjs +0 -784
- package/src/channels/data/voice-runtime-manifest.json +0 -138
- package/src/channels/index.mjs +0 -3268
- package/src/channels/lib/config.mjs +0 -292
- package/src/channels/lib/drop-trace.mjs +0 -71
- package/src/channels/lib/event-pipeline.mjs +0 -81
- package/src/channels/lib/holidays.mjs +0 -138
- package/src/channels/lib/hook-pipe-server.mjs +0 -822
- package/src/channels/lib/output-forwarder.mjs +0 -765
- package/src/channels/lib/runtime-paths.mjs +0 -552
- package/src/channels/lib/scheduler.mjs +0 -723
- package/src/channels/lib/session-discovery.mjs +0 -103
- package/src/channels/lib/state-file.mjs +0 -68
- package/src/channels/lib/status-snapshot.mjs +0 -219
- package/src/channels/lib/tool-format.mjs +0 -140
- package/src/channels/lib/transcript-discovery.mjs +0 -195
- package/src/channels/lib/voice-runtime-fetcher.mjs +0 -734
- package/src/channels/lib/webhook.mjs +0 -1318
- package/src/channels/tool-defs.mjs +0 -170
- package/src/daemon/host.mjs +0 -118
- package/src/daemon/mcp-transport.mjs +0 -47
- package/src/daemon/session.mjs +0 -100
- package/src/daemon/thin-client.mjs +0 -71
- package/src/daemon/transport.mjs +0 -163
- package/src/gateway/claude-current.mjs +0 -255
- package/src/gateway/oauth-usage.mjs +0 -598
- package/src/gateway/route-meta.mjs +0 -629
- package/src/gateway/server.mjs +0 -713
- package/src/memory/data/runtime-manifest.json +0 -40
- package/src/memory/index.mjs +0 -3332
- package/src/memory/lib/core-memory-store.mjs +0 -330
- package/src/memory/lib/embedding-provider.mjs +0 -269
- package/src/memory/lib/embedding-worker.mjs +0 -323
- package/src/memory/lib/memory-cycle1.mjs +0 -645
- package/src/memory/lib/memory-cycle2.mjs +0 -1284
- package/src/memory/lib/memory-cycle3.mjs +0 -540
- package/src/memory/lib/memory-embed.mjs +0 -299
- package/src/memory/lib/memory-ops-policy.mjs +0 -190
- package/src/memory/lib/memory-recall-store.mjs +0 -638
- package/src/memory/lib/memory.mjs +0 -412
- package/src/memory/lib/pg/adapter.mjs +0 -308
- package/src/memory/lib/pg/process.mjs +0 -360
- package/src/memory/lib/pg/supervisor.mjs +0 -396
- package/src/memory/lib/runtime-fetcher.mjs +0 -458
- package/src/memory/lib/trace-store.mjs +0 -728
- package/src/memory/tool-defs.mjs +0 -79
- package/src/search/index.mjs +0 -1173
- package/src/search/lib/backends/anthropic-oauth.mjs +0 -98
- package/src/search/lib/backends/exa.mjs +0 -50
- package/src/search/lib/backends/firecrawl.mjs +0 -61
- package/src/search/lib/backends/gemini-api.mjs +0 -83
- package/src/search/lib/backends/grok-oauth.mjs +0 -86
- package/src/search/lib/backends/index.mjs +0 -150
- package/src/search/lib/backends/openai-api.mjs +0 -144
- package/src/search/lib/backends/openai-oauth.mjs +0 -102
- package/src/search/lib/backends/openai-web-search.mjs +0 -76
- package/src/search/lib/backends/tavily.mjs +0 -55
- package/src/search/lib/backends/xai-api.mjs +0 -113
- package/src/search/lib/config.mjs +0 -192
- package/src/search/lib/provider-usage.mjs +0 -67
- package/src/search/lib/providers.mjs +0 -47
- package/src/search/lib/search-intent.mjs +0 -109
- package/src/search/lib/setup-handler.mjs +0 -261
- package/src/search/lib/web-tools.mjs +0 -1219
- package/src/search/tool-defs.mjs +0 -83
- package/src/setup/defender-exclusion.mjs +0 -183
- package/src/shared/atomic-file.mjs +0 -436
- package/src/shared/config.mjs +0 -372
- package/src/shared/daemon-recycle.mjs +0 -108
- package/src/shared/disable-claude-builtins.mjs +0 -91
- package/src/shared/err-text.mjs +0 -12
- package/src/shared/llm/http-agent.mjs +0 -123
- package/src/shared/open-url.mjs +0 -62
- package/src/shared/plugin-paths.mjs +0 -58
- package/src/shared/schedules-store.mjs +0 -70
- package/src/shared/seed.mjs +0 -161
- package/src/shared/user-cwd.mjs +0 -225
- package/src/shared/user-data-guard.mjs +0 -244
- package/src/status/aggregator.mjs +0 -584
- package/src/status/server.mjs +0 -413
- package/tools.json +0 -1671
- /package/{defaults → src/defaults}/cycle3-review-prompt.md +0 -0
- /package/{defaults → src/defaults}/memory-promote-prompt.md +0 -0
- /package/{hooks → src/hooks}/lib/permission-rules.cjs +0 -0
- /package/{lib → src/lib}/config-cjs.cjs +0 -0
- /package/{lib → src/lib}/hook-pipe-path.cjs +0 -0
- /package/{lib → src/lib}/mixdog-debug.cjs +0 -0
- /package/{lib → src/lib}/text-utils.cjs +0 -0
- /package/{rules → src/rules}/bridge/42-cycle3-agent.md +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/activity-bus.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/providers/anthropic-betas.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/session/abort-lookup.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/session/cache/post-edit-marks.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/session/cache/scoped-cache-outcome.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/session/cache/util.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/session/read-dedup.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/session/save-session-worker.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/smart-bridge/session-builder.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/bash-policy-scan.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/advisory-lock.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/atomic-write.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/binary-file.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cache-layers.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cwd-utils.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/device-paths.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diff-utils.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/fs-reachability.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/grep-formatting.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/hash-utils.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/list-formatting.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/open-config-tool.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-locks.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-utils.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-args.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-batch.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-constants.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image-resize.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-lines.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-mode-tool.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-range-index.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-ranges.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-special-files.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-tool.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-windows.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-analysis.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-output.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-helpers.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-validation.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/text-stats.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/windows-roots.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/code-graph-prewarm-worker.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/env-scrub.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-content-cache.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-planner.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/next-call-utils.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/result-compression.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/shell-exec-policy.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy-danger-target.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/cli-worker-host.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/config-lock.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/event-queue.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/executor.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/format.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/interaction-workflows.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/memory-client.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/session-control.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/settings.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/whisper-server.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/agent-ipc.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/bridge-trace-queries.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/llm-worker-host.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-cycle.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-extraction.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-maintenance-store.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-recall-id-patch.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-recall-read-query.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-recall-scope-filter.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-retrievers.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-score.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-text-utils.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/model-profile.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/project-id-resolver.mjs +0 -0
- /package/src/{search → runtime/search}/lib/cache.mjs +0 -0
- /package/src/{search → runtime/search}/lib/formatter.mjs +0 -0
- /package/src/{search → runtime/search}/lib/state.mjs +0 -0
- /package/src/{shared → runtime/shared}/abort-controller.mjs +0 -0
- /package/src/{shared → runtime/shared}/llm/cost.mjs +0 -0
- /package/src/{shared → runtime/shared}/llm/index.mjs +0 -0
- /package/src/{shared → runtime/shared}/llm/pid-cleanup.mjs +0 -0
- /package/src/{shared → runtime/shared}/llm/usage-log.mjs +0 -0
- /package/src/{shared → runtime/shared}/wsl.mjs +0 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
const __mixdogMemoryStderrWrite = process.stderr.write.bind(process.stderr);
|
|
2
|
+
function __mixdogMemoryLog(...args) {
|
|
3
|
+
if (process.env.MIXDOG_QUIET_MEMORY_LOG) return true;
|
|
4
|
+
return __mixdogMemoryStderrWrite(...args);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
// User-curated core memory store — native PG-backed via core_entries table.
|
|
8
|
+
// Per-project entries distinguished by project_id column (NULL = COMMON).
|
|
9
|
+
// addCore / editCore generate an embedding for each row and run a cosine-sim
|
|
10
|
+
// lookup against existing rows in the same project pool: candidates at or
|
|
11
|
+
// above SIM_RECALL go through an LLM "merge or distinct" judge — only the
|
|
12
|
+
// LLM's verdict, not the embedding score, decides whether the prior row is
|
|
13
|
+
// superseded in place. Below the threshold the row is INSERTed fresh.
|
|
14
|
+
// cycle2 reads core_entries via the {{USER_CORE}} prompt slot to avoid
|
|
15
|
+
// re-promoting entries that already overlap a user-curated row.
|
|
16
|
+
|
|
17
|
+
import { getDatabase, embeddingToSql } from './memory.mjs'
|
|
18
|
+
import { cachedEmbedTextBatch } from './memory-embed.mjs'
|
|
19
|
+
import { callBridgeLlm } from './agent-ipc.mjs'
|
|
20
|
+
import { resolveMaintenancePreset } from '../../shared/llm/index.mjs'
|
|
21
|
+
import { checkedConnect } from './pg/adapter.mjs'
|
|
22
|
+
|
|
23
|
+
const VALID_CAT = new Set([
|
|
24
|
+
'rule', 'constraint', 'decision', 'fact', 'goal', 'preference', 'task', 'issue',
|
|
25
|
+
])
|
|
26
|
+
|
|
27
|
+
// Embedding sim threshold for surfacing a candidate to the LLM judge. Wider
|
|
28
|
+
// than cycle2's tier-1 (0.78) on purpose: LLM verdict is authoritative so
|
|
29
|
+
// the recall side can afford broader recall.
|
|
30
|
+
const SIM_RECALL = 0.65
|
|
31
|
+
const CORE_DEDUP_TOP_K = 5
|
|
32
|
+
|
|
33
|
+
export const CORE_SUMMARY_MAX = 120
|
|
34
|
+
|
|
35
|
+
function trimOrNull(v) {
|
|
36
|
+
if (v == null) return null
|
|
37
|
+
const s = String(v).trim()
|
|
38
|
+
return s === '' ? null : s
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function _getDb(dataDir) {
|
|
42
|
+
if (!dataDir) throw new Error('core-memory: dataDir required')
|
|
43
|
+
const db = getDatabase(dataDir)
|
|
44
|
+
if (!db) throw new Error('core-memory: database not open — call openDatabase first')
|
|
45
|
+
return db
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function _embedFor(db, element, summary) {
|
|
49
|
+
const text = `${element}\n${summary || ''}`.trim()
|
|
50
|
+
if (!text) return null
|
|
51
|
+
const [vec] = await cachedEmbedTextBatch(db, [text])
|
|
52
|
+
return Array.isArray(vec) ? vec : null
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Lazy repair of NULL embeddings on existing rows. Runs once per boot or
|
|
56
|
+
// whenever a NULL slips back in via direct SQL. SELECT WHERE embedding IS NULL
|
|
57
|
+
// returns 0 rows on a fully-populated table, so this is a fast no-op.
|
|
58
|
+
function throwIfAborted(signal) {
|
|
59
|
+
if (signal?.aborted) throw signal.reason ?? new Error('aborted')
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function _backfillNullEmbeddings(db, options = {}) {
|
|
63
|
+
const signal = options?.signal
|
|
64
|
+
throwIfAborted(signal)
|
|
65
|
+
const r = await db.query(`SELECT id, element, summary FROM core_entries WHERE embedding IS NULL`)
|
|
66
|
+
if (r.rows.length === 0) return 0
|
|
67
|
+
let filled = 0
|
|
68
|
+
for (const row of r.rows) {
|
|
69
|
+
throwIfAborted(signal)
|
|
70
|
+
const vec = await _embedFor(db, row.element, row.summary)
|
|
71
|
+
throwIfAborted(signal)
|
|
72
|
+
if (!vec) continue
|
|
73
|
+
await db.query(
|
|
74
|
+
`UPDATE core_entries SET embedding = $1::halfvec WHERE id = $2 AND embedding IS NULL`,
|
|
75
|
+
[embeddingToSql(vec), row.id],
|
|
76
|
+
)
|
|
77
|
+
filled++
|
|
78
|
+
}
|
|
79
|
+
if (filled > 0) {
|
|
80
|
+
__mixdogMemoryLog(`[core-memory] backfilled ${filled} NULL embedding(s) on core_entries\n`)
|
|
81
|
+
}
|
|
82
|
+
return filled
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export async function backfillCoreEmbeddings(dataDir, options = {}) {
|
|
86
|
+
const db = _getDb(dataDir)
|
|
87
|
+
return await _backfillNullEmbeddings(db, options)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Boot-time invariant restoration: core_entries.id must always be the
|
|
91
|
+
// contiguous sequence 1..N. SERIAL only ever increments, so deleting a row
|
|
92
|
+
// leaves a permanent gap (e.g. 1,2,4,5 after deleting 3). This closes those
|
|
93
|
+
// gaps by resequencing every row globally (across all project_id pools) to
|
|
94
|
+
// 1..N in id order, then realigns the serial so the next INSERT continues from
|
|
95
|
+
// N+1. Deterministic invariant restore — no heuristic, no fallback branch.
|
|
96
|
+
export async function compactCoreIds(dataDir) {
|
|
97
|
+
const db = _getDb(dataDir)
|
|
98
|
+
// Fast no-op guard: a contiguous 1..N table has COUNT == MAX(id). This also
|
|
99
|
+
// covers the empty table (n=0, mx=0) — return before any write.
|
|
100
|
+
const g = await db.query(`SELECT COUNT(*) AS n, COALESCE(MAX(id),0) AS mx FROM core_entries`)
|
|
101
|
+
const n = Number(g.rows[0].n)
|
|
102
|
+
const mx = Number(g.rows[0].mx)
|
|
103
|
+
if (n === mx) return 0
|
|
104
|
+
|
|
105
|
+
// BEGIN transaction on ONE checked-out client — the pool wrapper db.query
|
|
106
|
+
// releases the client per call, so BEGIN/COMMIT must run on one client
|
|
107
|
+
// (same pattern as addCore).
|
|
108
|
+
const client = await checkedConnect(db._pool, 'memory')
|
|
109
|
+
try {
|
|
110
|
+
await client.query('BEGIN')
|
|
111
|
+
// (a) Vacate the low range so shifted ids can't collide with the 1..N
|
|
112
|
+
// target. Offset by current MAX(id): every id becomes id+mx, which is
|
|
113
|
+
// strictly greater than N (N <= mx), so the resequence below is safe.
|
|
114
|
+
await client.query(`UPDATE core_entries SET id = id + $1`, [mx])
|
|
115
|
+
// (b) Resequence ALL rows globally to 1..N preserving id order.
|
|
116
|
+
await client.query(`
|
|
117
|
+
WITH ordered AS (
|
|
118
|
+
SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS rn FROM core_entries
|
|
119
|
+
)
|
|
120
|
+
UPDATE core_entries c SET id = o.rn FROM ordered o WHERE c.id = o.id`)
|
|
121
|
+
// (c) Realign the serial so the next INSERT continues from N+1. Guarded by
|
|
122
|
+
// the n===mx return above, so MAX(id) is always > 0 here — setval(...,0,true)
|
|
123
|
+
// is invalid and is never reached.
|
|
124
|
+
await client.query(
|
|
125
|
+
`SELECT setval(pg_get_serial_sequence('core_entries','id'),
|
|
126
|
+
(SELECT COALESCE(MAX(id),0) FROM core_entries), true)`)
|
|
127
|
+
await client.query('COMMIT')
|
|
128
|
+
} catch (err) {
|
|
129
|
+
try { await client.query('ROLLBACK') } catch {}
|
|
130
|
+
throw err
|
|
131
|
+
} finally {
|
|
132
|
+
client.release()
|
|
133
|
+
}
|
|
134
|
+
__mixdogMemoryLog(`[core-memory] compacted ${n} core id(s)\n`)
|
|
135
|
+
return n
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async function _findTopKCore(db, projectId, embedding, excludeId, { forUpdate = false } = {}) {
|
|
139
|
+
if (!embedding) return []
|
|
140
|
+
const exclusion = excludeId == null ? '' : 'AND id != $3'
|
|
141
|
+
const sql = `
|
|
142
|
+
SELECT id, element, summary, category, 1 - (embedding <=> $1::halfvec) AS sim
|
|
143
|
+
FROM core_entries
|
|
144
|
+
WHERE embedding IS NOT NULL
|
|
145
|
+
AND project_id IS NOT DISTINCT FROM $2
|
|
146
|
+
${exclusion}
|
|
147
|
+
ORDER BY embedding <=> $1::halfvec
|
|
148
|
+
LIMIT ${CORE_DEDUP_TOP_K}${forUpdate ? ' FOR UPDATE' : ''}`
|
|
149
|
+
const params = excludeId == null
|
|
150
|
+
? [embeddingToSql(embedding), projectId]
|
|
151
|
+
: [embeddingToSql(embedding), projectId, excludeId]
|
|
152
|
+
const r = await db.query(sql, params)
|
|
153
|
+
return r.rows.filter(row => Number(row.sim) >= SIM_RECALL)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async function _resolveMergeTarget(candidates, incoming) {
|
|
157
|
+
for (const c of candidates) {
|
|
158
|
+
if (await _llmJudgeMerge(c, incoming)) return c
|
|
159
|
+
}
|
|
160
|
+
return null
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// LLM judge for "is this incoming entry a restatement of the existing one?"
|
|
164
|
+
// One-word reply: merge | distinct. Errors fall back to distinct so a flaky
|
|
165
|
+
// LLM never silently absorbs a fresh registration into an unrelated row.
|
|
166
|
+
async function _llmJudgeMerge(existing, incoming) {
|
|
167
|
+
const prompt =
|
|
168
|
+
`Two user-curated core memory entries below. Are they restating the same rule, fact, or preference (just different wording)? Reply ONE WORD: merge or distinct.\n\n` +
|
|
169
|
+
`EXISTING: ${existing.element} — ${String(existing.summary || '')}\n` +
|
|
170
|
+
`INCOMING: ${incoming.element} — ${String(incoming.summary || '')}`
|
|
171
|
+
try {
|
|
172
|
+
const raw = await callBridgeLlm({
|
|
173
|
+
role: 'cycle2-agent',
|
|
174
|
+
taskType: 'maintenance',
|
|
175
|
+
mode: 'core-merge-judge',
|
|
176
|
+
preset: resolveMaintenancePreset('memory'),
|
|
177
|
+
timeout: 30_000,
|
|
178
|
+
cwd: null,
|
|
179
|
+
}, prompt)
|
|
180
|
+
return String(raw ?? '').trim().toLowerCase().startsWith('merge')
|
|
181
|
+
} catch (err) {
|
|
182
|
+
__mixdogMemoryLog(`[core-memory] LLM merge judge failed: ${err.message}\n`)
|
|
183
|
+
return false
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export async function listCore(dataDir, projectId = null) {
|
|
188
|
+
const db = _getDb(dataDir)
|
|
189
|
+
const cols = `id, element, summary, category, project_id, created_at, updated_at`
|
|
190
|
+
if (projectId === '*') {
|
|
191
|
+
const r = await db.query(`SELECT ${cols} FROM core_entries ORDER BY project_id NULLS FIRST, id ASC`)
|
|
192
|
+
return r.rows
|
|
193
|
+
}
|
|
194
|
+
if (projectId === null) {
|
|
195
|
+
const r = await db.query(`SELECT ${cols} FROM core_entries WHERE project_id IS NULL ORDER BY id ASC`)
|
|
196
|
+
return r.rows
|
|
197
|
+
}
|
|
198
|
+
const r = await db.query(`SELECT ${cols} FROM core_entries WHERE project_id = $1 ORDER BY id ASC`, [projectId])
|
|
199
|
+
return r.rows
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export async function addCore(dataDir, { element, summary, category }, projectId) {
|
|
203
|
+
if (projectId === undefined) throw new Error('addCore: projectId required — pass null for COMMON pool, or slug string for scoped pool')
|
|
204
|
+
const el = trimOrNull(element)
|
|
205
|
+
const sm = trimOrNull(summary) ?? el
|
|
206
|
+
if (!el || !sm) throw new Error('add requires element and summary')
|
|
207
|
+
if (sm.length > CORE_SUMMARY_MAX) {
|
|
208
|
+
throw new Error(`core summary too long (${sm.length} chars, max ${CORE_SUMMARY_MAX}) — core memory must be 1 fact in 1-2 sentences; procedures, multi-step, or code belong in recap or docs. Compress and retry.`)
|
|
209
|
+
}
|
|
210
|
+
const cat = (trimOrNull(category) ?? 'fact').toLowerCase()
|
|
211
|
+
if (!VALID_CAT.has(cat)) {
|
|
212
|
+
throw new Error(`invalid category "${cat}". Valid: ${[...VALID_CAT].join(', ')}`)
|
|
213
|
+
}
|
|
214
|
+
const db = _getDb(dataDir)
|
|
215
|
+
const now = Date.now()
|
|
216
|
+
await _backfillNullEmbeddings(db)
|
|
217
|
+
const embedding = await _embedFor(db, el, sm)
|
|
218
|
+
|
|
219
|
+
const client = await checkedConnect(db._pool, 'memory')
|
|
220
|
+
try {
|
|
221
|
+
await client.query('BEGIN')
|
|
222
|
+
await client.query(`SET LOCAL lock_timeout = '5s'`)
|
|
223
|
+
const poolKey = `core:${projectId == null ? 'COMMON' : projectId}`
|
|
224
|
+
await client.query(`SELECT pg_advisory_xact_lock(hashtext($1))`, [poolKey])
|
|
225
|
+
const candidates = await _findTopKCore(client, projectId, embedding, null, { forUpdate: true })
|
|
226
|
+
const mergeTarget = await _resolveMergeTarget(candidates, { element: el, summary: sm })
|
|
227
|
+
if (mergeTarget) {
|
|
228
|
+
const r = await client.query(
|
|
229
|
+
`UPDATE core_entries
|
|
230
|
+
SET element = $1, summary = $2, category = $3, embedding = $4::halfvec, updated_at = $5
|
|
231
|
+
WHERE id = $6
|
|
232
|
+
RETURNING id, element, summary, category, project_id, created_at, updated_at`,
|
|
233
|
+
[el, sm, cat, embedding ? embeddingToSql(embedding) : null, now, mergeTarget.id],
|
|
234
|
+
)
|
|
235
|
+
await client.query('COMMIT')
|
|
236
|
+
const row = r.rows[0]
|
|
237
|
+
return { ...row, merged_with: mergeTarget.id, sim: Number(mergeTarget.sim).toFixed(3) }
|
|
238
|
+
}
|
|
239
|
+
let r
|
|
240
|
+
try {
|
|
241
|
+
r = await client.query(
|
|
242
|
+
`INSERT INTO core_entries(element, summary, category, project_id, embedding, created_at, updated_at)
|
|
243
|
+
VALUES ($1, $2, $3, $4, $5::halfvec, $6, $7)
|
|
244
|
+
RETURNING id, element, summary, category, project_id, created_at, updated_at`,
|
|
245
|
+
[el, sm, cat, projectId, embedding ? embeddingToSql(embedding) : null, now, now],
|
|
246
|
+
)
|
|
247
|
+
} catch (err) {
|
|
248
|
+
if (err.code === '23505') {
|
|
249
|
+
throw new Error(`core entry already exists: project=${projectId ?? 'COMMON'} element=${JSON.stringify(el.slice(0, 200))}`)
|
|
250
|
+
}
|
|
251
|
+
throw err
|
|
252
|
+
}
|
|
253
|
+
await client.query('COMMIT')
|
|
254
|
+
return r.rows[0]
|
|
255
|
+
} catch (err) {
|
|
256
|
+
try { await client.query('ROLLBACK') } catch {}
|
|
257
|
+
throw err
|
|
258
|
+
} finally {
|
|
259
|
+
client.release()
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
export async function editCore(dataDir, id, patch) {
|
|
264
|
+
const numId = Number(id)
|
|
265
|
+
if (!Number.isInteger(numId) || numId <= 0) throw new Error('integer id > 0 required')
|
|
266
|
+
const db = _getDb(dataDir)
|
|
267
|
+
const cur = (await db.query(`SELECT * FROM core_entries WHERE id = $1`, [numId])).rows[0]
|
|
268
|
+
if (!cur) throw new Error(`no entry with id=${numId}`)
|
|
269
|
+
const newElement = trimOrNull(patch.element) ?? cur.element
|
|
270
|
+
const newSummary = trimOrNull(patch.summary) ?? cur.summary
|
|
271
|
+
const newCategoryRaw = trimOrNull(patch.category)
|
|
272
|
+
const newCategory = newCategoryRaw ? newCategoryRaw.toLowerCase() : cur.category
|
|
273
|
+
if (!VALID_CAT.has(newCategory)) {
|
|
274
|
+
throw new Error(`invalid category "${newCategory}". Valid: ${[...VALID_CAT].join(', ')}`)
|
|
275
|
+
}
|
|
276
|
+
if (newElement === cur.element && newSummary === cur.summary && newCategory === cur.category) {
|
|
277
|
+
throw new Error('no change')
|
|
278
|
+
}
|
|
279
|
+
if (newSummary && newSummary.length > CORE_SUMMARY_MAX) {
|
|
280
|
+
throw new Error(`core summary too long (${newSummary.length} chars, max ${CORE_SUMMARY_MAX}) — core memory must be 1 fact in 1-2 sentences; procedures, multi-step, or code belong in recap or docs. Compress and retry.`)
|
|
281
|
+
}
|
|
282
|
+
const now = Date.now()
|
|
283
|
+
const textChanged = newElement !== cur.element || newSummary !== cur.summary
|
|
284
|
+
if (!textChanged) {
|
|
285
|
+
await db.query(
|
|
286
|
+
`UPDATE core_entries SET category = $1, updated_at = $2 WHERE id = $3`,
|
|
287
|
+
[newCategory, now, numId],
|
|
288
|
+
)
|
|
289
|
+
return { ...cur, element: newElement, summary: newSummary, category: newCategory, updated_at: now }
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
await _backfillNullEmbeddings(db)
|
|
293
|
+
const embedding = await _embedFor(db, newElement, newSummary)
|
|
294
|
+
const client = await checkedConnect(db._pool, 'memory')
|
|
295
|
+
try {
|
|
296
|
+
await client.query('BEGIN')
|
|
297
|
+
await client.query(`SET LOCAL lock_timeout = '5s'`)
|
|
298
|
+
const poolKey = `core:${cur.project_id == null ? 'COMMON' : cur.project_id}`
|
|
299
|
+
await client.query(`SELECT pg_advisory_xact_lock(hashtext($1))`, [poolKey])
|
|
300
|
+
const candidates = await _findTopKCore(client, cur.project_id, embedding, numId, { forUpdate: true })
|
|
301
|
+
const mergeTarget = await _resolveMergeTarget(candidates, { element: newElement, summary: newSummary })
|
|
302
|
+
if (mergeTarget) {
|
|
303
|
+
const r = await client.query(
|
|
304
|
+
`UPDATE core_entries
|
|
305
|
+
SET element = $1, summary = $2, category = $3, embedding = $4::halfvec, updated_at = $5
|
|
306
|
+
WHERE id = $6
|
|
307
|
+
RETURNING id, element, summary, category, project_id, created_at, updated_at`,
|
|
308
|
+
[newElement, newSummary, newCategory, embedding ? embeddingToSql(embedding) : null, now, mergeTarget.id],
|
|
309
|
+
)
|
|
310
|
+
await client.query(`DELETE FROM core_entries WHERE id = $1`, [numId])
|
|
311
|
+
await client.query('COMMIT')
|
|
312
|
+
const row = r.rows[0]
|
|
313
|
+
return { ...row, merged_from: numId, merged_with: mergeTarget.id, sim: Number(mergeTarget.sim).toFixed(3) }
|
|
314
|
+
}
|
|
315
|
+
await client.query(
|
|
316
|
+
`UPDATE core_entries SET element = $1, summary = $2, category = $3, embedding = $4::halfvec, updated_at = $5 WHERE id = $6`,
|
|
317
|
+
[newElement, newSummary, newCategory, embedding ? embeddingToSql(embedding) : null, now, numId],
|
|
318
|
+
)
|
|
319
|
+
await client.query('COMMIT')
|
|
320
|
+
return { ...cur, element: newElement, summary: newSummary, category: newCategory, updated_at: now }
|
|
321
|
+
} catch (err) {
|
|
322
|
+
try { await client.query('ROLLBACK') } catch {}
|
|
323
|
+
throw err
|
|
324
|
+
} finally {
|
|
325
|
+
client.release()
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
export async function deleteCore(dataDir, id) {
|
|
330
|
+
const numId = Number(id)
|
|
331
|
+
if (!Number.isInteger(numId) || numId <= 0) throw new Error('integer id > 0 required')
|
|
332
|
+
const db = _getDb(dataDir)
|
|
333
|
+
const r = await db.query(`DELETE FROM core_entries WHERE id = $1 RETURNING *`, [numId])
|
|
334
|
+
if (r.rows.length === 0) throw new Error(`no entry with id=${numId}`)
|
|
335
|
+
return r.rows[0]
|
|
336
|
+
}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
const __mixdogMemoryStderrWrite = process.stderr.write.bind(process.stderr);
|
|
2
|
+
function __mixdogMemoryLog(...args) {
|
|
3
|
+
if (process.env.MIXDOG_QUIET_MEMORY_LOG) return true;
|
|
4
|
+
return __mixdogMemoryStderrWrite(...args);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* embedding-provider.mjs — Embedding provider with worker_threads isolation.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { Worker } from 'worker_threads'
|
|
12
|
+
import { join } from 'path'
|
|
13
|
+
import { fileURLToPath } from 'url'
|
|
14
|
+
import { writeProfilePoint } from './model-profile.mjs'
|
|
15
|
+
|
|
16
|
+
const MODEL_ID = 'Xenova/bge-m3'
|
|
17
|
+
|
|
18
|
+
// Static dims registry — bypasses first-boot measurement for registered models.
|
|
19
|
+
// Validated against measured dims inside warmupEmbeddingProvider; mismatch throws.
|
|
20
|
+
const KNOWN_MODEL_DIMS = { 'Xenova/bge-m3': 1024 }
|
|
21
|
+
|
|
22
|
+
let worker = null
|
|
23
|
+
let _restartCount = 0
|
|
24
|
+
let _lastRestartMs = 0
|
|
25
|
+
const MAX_RESTART_BACKOFF_MS = 30_000
|
|
26
|
+
let cachedDims = null
|
|
27
|
+
let _modelReady = false
|
|
28
|
+
let _device = 'cpu'
|
|
29
|
+
let _embedCallCount = 0
|
|
30
|
+
let _msgId = 0
|
|
31
|
+
const _pending = new Map()
|
|
32
|
+
const EMBED_STEADY_SAMPLE_EVERY = 20
|
|
33
|
+
const queryEmbeddingCache = new Map()
|
|
34
|
+
const QUERY_EMBEDDING_CACHE_LIMIT = 1000
|
|
35
|
+
|
|
36
|
+
const WORKER_PATH = join(fileURLToPath(import.meta.url), '..', 'embedding-worker.mjs')
|
|
37
|
+
|
|
38
|
+
function cacheEmbedding(key, vector) {
|
|
39
|
+
if (queryEmbeddingCache.has(key)) queryEmbeddingCache.delete(key)
|
|
40
|
+
queryEmbeddingCache.set(key, vector)
|
|
41
|
+
if (queryEmbeddingCache.size > QUERY_EMBEDDING_CACHE_LIMIT) {
|
|
42
|
+
const oldestKey = queryEmbeddingCache.keys().next().value
|
|
43
|
+
if (oldestKey) queryEmbeddingCache.delete(oldestKey)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function getCachedEmbedding(key) {
|
|
48
|
+
if (!queryEmbeddingCache.has(key)) return null
|
|
49
|
+
const value = queryEmbeddingCache.get(key)
|
|
50
|
+
queryEmbeddingCache.delete(key)
|
|
51
|
+
queryEmbeddingCache.set(key, value)
|
|
52
|
+
return value
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function ensureWorker() {
|
|
56
|
+
if (worker) return worker
|
|
57
|
+
const now = Date.now()
|
|
58
|
+
if (_restartCount > 0) {
|
|
59
|
+
const backoffMs = Math.min(1000 * Math.pow(2, _restartCount - 1), MAX_RESTART_BACKOFF_MS)
|
|
60
|
+
const elapsed = now - _lastRestartMs
|
|
61
|
+
if (elapsed < backoffMs) {
|
|
62
|
+
throw new Error(`embed worker in restart backoff (${Math.ceil((backoffMs - elapsed) / 1000)}s remaining)`)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
_lastRestartMs = now
|
|
66
|
+
const execArgv = process.execArgv.filter((arg) => !String(arg).startsWith('--input-type'))
|
|
67
|
+
worker = new Worker(WORKER_PATH, { env: { ...process.env }, execArgv })
|
|
68
|
+
worker.on('message', (msg) => {
|
|
69
|
+
if (msg.type === 'profile') {
|
|
70
|
+
writeProfilePoint(msg.record)
|
|
71
|
+
return
|
|
72
|
+
}
|
|
73
|
+
if (msg.type === 'idle-dispose') {
|
|
74
|
+
cachedDims = null
|
|
75
|
+
_modelReady = false
|
|
76
|
+
_device = 'cpu'
|
|
77
|
+
__mixdogMemoryLog('[embed] idle timeout — model disposed\n')
|
|
78
|
+
writeProfilePoint({ phase: 'post-idle', model: MODEL_ID, device: msg.device, dtype: msg.dtype, note: 'idle dispose' })
|
|
79
|
+
return
|
|
80
|
+
}
|
|
81
|
+
const pending = _pending.get(msg.id)
|
|
82
|
+
if (!pending) return
|
|
83
|
+
_pending.delete(msg.id)
|
|
84
|
+
if (msg.type === 'error') {
|
|
85
|
+
pending.reject(new Error(msg.message))
|
|
86
|
+
} else {
|
|
87
|
+
pending.resolve(msg)
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
worker.on('error', (err) => {
|
|
91
|
+
__mixdogMemoryLog(`[embed] worker error: ${err?.message || err}\n`)
|
|
92
|
+
for (const [, p] of _pending) p.reject(err)
|
|
93
|
+
_pending.clear()
|
|
94
|
+
worker = null
|
|
95
|
+
_modelReady = false
|
|
96
|
+
_restartCount++
|
|
97
|
+
})
|
|
98
|
+
worker.on('exit', (code) => {
|
|
99
|
+
if (code !== 0) {
|
|
100
|
+
__mixdogMemoryLog(`[embed] worker exited with code ${code}\n`)
|
|
101
|
+
for (const [, p] of _pending) p.reject(new Error(`Worker exited with code ${code}`))
|
|
102
|
+
_pending.clear()
|
|
103
|
+
_restartCount++
|
|
104
|
+
} else {
|
|
105
|
+
_restartCount = 0
|
|
106
|
+
}
|
|
107
|
+
worker = null
|
|
108
|
+
_modelReady = false
|
|
109
|
+
})
|
|
110
|
+
return worker
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const EMBED_WORKER_TIMEOUT_MS = 60_000
|
|
114
|
+
|
|
115
|
+
function sendToWorker(action, extra = {}, timeoutMs = EMBED_WORKER_TIMEOUT_MS) {
|
|
116
|
+
const w = ensureWorker()
|
|
117
|
+
const id = ++_msgId
|
|
118
|
+
return new Promise((resolve, reject) => {
|
|
119
|
+
const timer = setTimeout(() => {
|
|
120
|
+
_pending.delete(id)
|
|
121
|
+
__mixdogMemoryLog(`[embed] worker ${action} timed out — terminating worker\n`)
|
|
122
|
+
if (worker) {
|
|
123
|
+
const stuck = worker
|
|
124
|
+
worker = null
|
|
125
|
+
_restartCount++
|
|
126
|
+
stuck.terminate().catch(() => {})
|
|
127
|
+
}
|
|
128
|
+
reject(new Error(`embed worker ${action} timed out after ${timeoutMs}ms`))
|
|
129
|
+
}, timeoutMs)
|
|
130
|
+
_pending.set(id, {
|
|
131
|
+
resolve: (v) => { clearTimeout(timer); resolve(v) },
|
|
132
|
+
reject: (e) => { clearTimeout(timer); reject(e) },
|
|
133
|
+
})
|
|
134
|
+
try {
|
|
135
|
+
w.postMessage({ id, action, ...extra })
|
|
136
|
+
} catch (postErr) {
|
|
137
|
+
clearTimeout(timer)
|
|
138
|
+
_pending.delete(id)
|
|
139
|
+
reject(postErr)
|
|
140
|
+
}
|
|
141
|
+
})
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export function configureEmbedding(config = {}) {
|
|
145
|
+
cachedDims = null
|
|
146
|
+
_modelReady = false
|
|
147
|
+
_device = 'cpu'
|
|
148
|
+
queryEmbeddingCache.clear()
|
|
149
|
+
if (worker) {
|
|
150
|
+
sendToWorker('configure', { dtype: config.dtype }).catch((err) => {
|
|
151
|
+
// Silent .catch hid worker reconfigure failures (dtype mismatch,
|
|
152
|
+
// worker crash, IPC closed). At least one log line so cycle1 /
|
|
153
|
+
// cycle2 root-cause investigation can see the upstream failure
|
|
154
|
+
// instead of just the downstream `db write failed`.
|
|
155
|
+
__mixdogMemoryLog(`[embed] worker configure failed: ${err?.message || err}\n`)
|
|
156
|
+
})
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export function primeEmbeddingDims(dims) {
|
|
161
|
+
const n = Number(dims)
|
|
162
|
+
if (Number.isFinite(n) && n > 0) cachedDims = n
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export function getEmbeddingModelId() {
|
|
166
|
+
return MODEL_ID
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export function getKnownDimsForCurrentModel() {
|
|
170
|
+
return KNOWN_MODEL_DIMS[MODEL_ID] ?? null
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export function getEmbeddingDims() {
|
|
174
|
+
if (!cachedDims) throw new Error('embedding dims not yet measured — warmup required')
|
|
175
|
+
return cachedDims
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export async function warmupEmbeddingProvider() {
|
|
179
|
+
if (_modelReady && cachedDims) return true
|
|
180
|
+
const result = await sendToWorker('warmup')
|
|
181
|
+
if (!result.dims) throw new Error('warmup returned no dims — model output missing')
|
|
182
|
+
const known = KNOWN_MODEL_DIMS[MODEL_ID]
|
|
183
|
+
if (known != null && known !== result.dims) {
|
|
184
|
+
throw new Error(
|
|
185
|
+
`embedding dims invariant violation: model=${MODEL_ID} expected=${known} measured=${result.dims}`,
|
|
186
|
+
)
|
|
187
|
+
}
|
|
188
|
+
cachedDims = result.dims
|
|
189
|
+
_modelReady = true
|
|
190
|
+
_device = result.device || 'cpu'
|
|
191
|
+
return true
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export async function embedText(text) {
|
|
195
|
+
const clean = String(text ?? '').trim()
|
|
196
|
+
if (!clean) return []
|
|
197
|
+
const cacheKey = `${MODEL_ID}\n${clean}`
|
|
198
|
+
const cached = getCachedEmbedding(cacheKey)
|
|
199
|
+
if (cached) return [...cached]
|
|
200
|
+
|
|
201
|
+
const result = await sendToWorker('embed', { text: clean })
|
|
202
|
+
if (!result.dims) throw new Error(`embed result missing dims (model=${MODEL_ID})`)
|
|
203
|
+
const resultDims = result.dims
|
|
204
|
+
if (cachedDims && resultDims !== cachedDims) {
|
|
205
|
+
throw new Error(`embed vector dims mismatch: expected ${cachedDims}, got ${resultDims}`)
|
|
206
|
+
}
|
|
207
|
+
cachedDims = resultDims
|
|
208
|
+
_modelReady = true
|
|
209
|
+
_device = result.device || 'cpu'
|
|
210
|
+
const vector = result.vector
|
|
211
|
+
if (!Array.isArray(vector) || vector.length !== cachedDims) {
|
|
212
|
+
throw new Error(`embed vector length mismatch: expected ${cachedDims}, got ${vector?.length}`)
|
|
213
|
+
}
|
|
214
|
+
cacheEmbedding(cacheKey, vector)
|
|
215
|
+
_embedCallCount++
|
|
216
|
+
if (_embedCallCount % EMBED_STEADY_SAMPLE_EVERY === 0) {
|
|
217
|
+
writeProfilePoint({
|
|
218
|
+
phase: 'steady',
|
|
219
|
+
model: MODEL_ID,
|
|
220
|
+
device: _device,
|
|
221
|
+
dtype: result.dtype,
|
|
222
|
+
wallMs: result.wallMs,
|
|
223
|
+
note: `sample@${_embedCallCount}`,
|
|
224
|
+
})
|
|
225
|
+
}
|
|
226
|
+
return vector
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Batch variant of embedText. Pre-warms the per-query cache so subsequent
|
|
231
|
+
* single-text calls hit instantly. Invariant-preserving: each cached entry
|
|
232
|
+
* follows the same MODEL_ID-keyed format as embedText, so cache hits look
|
|
233
|
+
* identical regardless of whether the vector was originally produced via
|
|
234
|
+
* single or batch path. Worker still serializes the single ONNX run, but
|
|
235
|
+
* one batched run replaces N sequential runs.
|
|
236
|
+
*/
|
|
237
|
+
export async function embedTexts(texts) {
|
|
238
|
+
if (!Array.isArray(texts)) throw new Error('embedTexts requires an array')
|
|
239
|
+
const cleaned = texts.map(t => String(t ?? '').trim())
|
|
240
|
+
const missing = []
|
|
241
|
+
for (const t of cleaned) {
|
|
242
|
+
if (!t) continue
|
|
243
|
+
const key = `${MODEL_ID}\n${t}`
|
|
244
|
+
if (!queryEmbeddingCache.has(key)) missing.push(t)
|
|
245
|
+
}
|
|
246
|
+
if (missing.length === 0) return cleaned.map(t => {
|
|
247
|
+
if (!t) return []
|
|
248
|
+
return [...queryEmbeddingCache.get(`${MODEL_ID}\n${t}`)]
|
|
249
|
+
})
|
|
250
|
+
const result = await sendToWorker('embed-batch', { texts: missing })
|
|
251
|
+
if (!result.dims) throw new Error(`embed-batch result missing dims (model=${MODEL_ID})`)
|
|
252
|
+
const resultDims = result.dims
|
|
253
|
+
if (cachedDims && resultDims !== cachedDims) {
|
|
254
|
+
throw new Error(`embed-batch vector dims mismatch: expected ${cachedDims}, got ${resultDims}`)
|
|
255
|
+
}
|
|
256
|
+
cachedDims = resultDims
|
|
257
|
+
_modelReady = true
|
|
258
|
+
_device = result.device || _device
|
|
259
|
+
if (!Array.isArray(result.vectors) || result.vectors.length !== missing.length) {
|
|
260
|
+
throw new Error(`embed-batch vectors count mismatch: expected ${missing.length}, got ${result.vectors?.length}`)
|
|
261
|
+
}
|
|
262
|
+
for (let i = 0; i < missing.length; i++) {
|
|
263
|
+
const vec = result.vectors[i]
|
|
264
|
+
if (!Array.isArray(vec) || vec.length !== cachedDims) {
|
|
265
|
+
throw new Error(`embed-batch vector length mismatch at idx ${i}: expected ${cachedDims}, got ${vec?.length}`)
|
|
266
|
+
}
|
|
267
|
+
cacheEmbedding(`${MODEL_ID}\n${missing[i]}`, vec)
|
|
268
|
+
}
|
|
269
|
+
_embedCallCount += missing.length
|
|
270
|
+
return cleaned.map(t => {
|
|
271
|
+
if (!t) return []
|
|
272
|
+
const cached = queryEmbeddingCache.get(`${MODEL_ID}\n${t}`)
|
|
273
|
+
return cached ? [...cached] : []
|
|
274
|
+
})
|
|
275
|
+
}
|