mixdog 0.9.2 → 0.9.3

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.
Files changed (154) hide show
  1. package/package.json +2 -1
  2. package/scripts/anthropic-maxtokens-test.mjs +119 -0
  3. package/scripts/build-tui.mjs +13 -1
  4. package/scripts/explore-bench.mjs +124 -0
  5. package/scripts/hook-bus-test.mjs +191 -0
  6. package/scripts/path-suffix-test.mjs +57 -0
  7. package/scripts/recall-bench.mjs +207 -0
  8. package/scripts/tool-smoke.mjs +7 -4
  9. package/src/agents/debugger/AGENT.md +2 -2
  10. package/src/agents/heavy-worker/AGENT.md +20 -11
  11. package/src/agents/reviewer/AGENT.md +2 -2
  12. package/src/agents/worker/AGENT.md +17 -11
  13. package/src/mixdog-session-runtime.mjs +424 -1812
  14. package/src/repl.mjs +5 -5
  15. package/src/rules/agent/30-explorer.md +8 -11
  16. package/src/rules/lead/lead-tool.md +9 -5
  17. package/src/rules/shared/01-tool.md +11 -5
  18. package/src/runtime/agent/orchestrator/context/collect.mjs +51 -0
  19. package/src/runtime/agent/orchestrator/mcp/client.mjs +6 -2
  20. package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +1 -1
  21. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +93 -0
  22. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +22 -68
  23. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +46 -7
  24. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +1 -13
  25. package/src/runtime/agent/orchestrator/providers/gemini.mjs +1 -1
  26. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +1 -1
  27. package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +32 -0
  28. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +54 -20
  29. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +19 -12
  30. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +7 -5
  31. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +33 -23
  32. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +31 -14
  33. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +38 -12
  34. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +7 -8
  35. package/src/runtime/agent/orchestrator/session/loop/compact-debug.mjs +28 -0
  36. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +262 -0
  37. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +38 -0
  38. package/src/runtime/agent/orchestrator/session/loop/env.mjs +14 -0
  39. package/src/runtime/agent/orchestrator/session/loop/hidden-agents.mjs +21 -0
  40. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +49 -0
  41. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +63 -0
  42. package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +100 -0
  43. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +52 -0
  44. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +218 -0
  45. package/src/runtime/agent/orchestrator/session/loop/transcript-repair.mjs +101 -0
  46. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +35 -0
  47. package/src/runtime/agent/orchestrator/session/loop.mjs +169 -918
  48. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +227 -0
  49. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +235 -0
  50. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +137 -0
  51. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +155 -0
  52. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +303 -0
  53. package/src/runtime/agent/orchestrator/session/manager.mjs +65 -1032
  54. package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -3
  55. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +2 -2
  56. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +241 -0
  57. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.test.mjs +162 -0
  58. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +1 -1
  59. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +42 -2
  60. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +1 -1
  61. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +11 -4
  62. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +5 -0
  63. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +50 -39
  64. package/src/runtime/agent/orchestrator/tools/builtin.mjs +11 -0
  65. package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +303 -0
  66. package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +43 -0
  67. package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +382 -0
  68. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +497 -0
  69. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +295 -0
  70. package/src/runtime/agent/orchestrator/tools/code-graph/graph-model.mjs +158 -0
  71. package/src/runtime/agent/orchestrator/tools/code-graph/lang-predicates.mjs +128 -0
  72. package/src/runtime/agent/orchestrator/tools/code-graph/memory-cache.mjs +66 -0
  73. package/src/runtime/agent/orchestrator/tools/code-graph/project-root.mjs +44 -0
  74. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1192 -0
  75. package/src/runtime/agent/orchestrator/tools/code-graph/source-access.mjs +81 -0
  76. package/src/runtime/agent/orchestrator/tools/code-graph/span.mjs +19 -0
  77. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +280 -0
  78. package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.mjs +347 -0
  79. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +36 -4277
  80. package/src/runtime/agent/orchestrator/tools/patch.mjs +3 -3
  81. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +1 -2
  82. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +1 -2
  83. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +2 -4
  84. package/src/runtime/channels/index.mjs +14 -233
  85. package/src/runtime/channels/lib/boot-profile.mjs +23 -0
  86. package/src/runtime/channels/lib/crash-log.mjs +106 -0
  87. package/src/runtime/channels/lib/index-drop-trace.mjs +72 -0
  88. package/src/runtime/channels/lib/output-forwarder.mjs +8 -0
  89. package/src/runtime/channels/lib/telegram-format.mjs +19 -22
  90. package/src/runtime/channels/lib/whisper-language.mjs +42 -0
  91. package/src/runtime/memory/index.mjs +314 -359
  92. package/src/runtime/memory/lib/core-memory-store.mjs +351 -1
  93. package/src/runtime/memory/lib/cycle-signatures.mjs +34 -0
  94. package/src/runtime/memory/lib/http-wire.mjs +57 -0
  95. package/src/runtime/memory/lib/memory-cycle2.mjs +56 -3
  96. package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +24 -0
  97. package/src/runtime/memory/lib/memory-retrievers.mjs +8 -0
  98. package/src/runtime/memory/lib/memory.mjs +20 -0
  99. package/src/runtime/memory/lib/promotion-fingerprint.mjs +50 -0
  100. package/src/runtime/memory/lib/recall-format.mjs +183 -0
  101. package/src/runtime/memory/tool-defs.mjs +4 -4
  102. package/src/runtime/shared/abort-controller.mjs +1 -1
  103. package/src/runtime/shared/background-tasks.mjs +2 -3
  104. package/src/runtime/shared/buffered-appender.mjs +149 -0
  105. package/src/runtime/shared/task-notification-envelope.mjs +98 -0
  106. package/src/runtime/shared/task-notification-envelope.test.mjs +107 -0
  107. package/src/runtime/shared/tool-execution-contract.mjs +2 -2
  108. package/src/runtime/shared/transcript-writer.mjs +29 -2
  109. package/src/session-runtime/config-helpers.mjs +209 -0
  110. package/src/session-runtime/effort.mjs +128 -0
  111. package/src/session-runtime/fs-utils.mjs +10 -0
  112. package/src/session-runtime/model-capabilities.mjs +130 -0
  113. package/src/session-runtime/output-styles.mjs +124 -0
  114. package/src/session-runtime/plugin-mcp.mjs +114 -0
  115. package/src/session-runtime/session-text.mjs +100 -0
  116. package/src/session-runtime/statusline-route.mjs +35 -0
  117. package/src/session-runtime/tool-catalog.mjs +720 -0
  118. package/src/session-runtime/workflow.mjs +358 -0
  119. package/src/standalone/agent-tool.mjs +49 -10
  120. package/src/standalone/channel-worker.mjs +3 -2
  121. package/src/standalone/explore-tool.mjs +10 -3
  122. package/src/standalone/hook-bus.mjs +165 -8
  123. package/src/standalone/opencode-go-login.mjs +121 -0
  124. package/src/standalone/provider-admin.mjs +14 -3
  125. package/src/tui/App.jsx +884 -143
  126. package/src/tui/components/PromptInput.jsx +272 -15
  127. package/src/tui/components/ToolExecution.jsx +20 -10
  128. package/src/tui/components/tool-output-format.mjs +2 -2
  129. package/src/tui/dist/index.mjs +1771 -1947
  130. package/src/tui/engine/agent-envelope.mjs +296 -0
  131. package/src/tui/engine/boot-profile.mjs +21 -0
  132. package/src/tui/engine/labels.mjs +67 -0
  133. package/src/tui/engine/notice-text.mjs +112 -0
  134. package/src/tui/engine/queue-helpers.mjs +161 -0
  135. package/src/tui/engine/session-stats.mjs +46 -0
  136. package/src/tui/engine/tool-call-fields.mjs +23 -0
  137. package/src/tui/engine/tool-result-text.mjs +126 -0
  138. package/src/tui/engine.mjs +311 -851
  139. package/src/tui/input-editing.mjs +58 -8
  140. package/src/tui/input-editing.selection.test.mjs +75 -0
  141. package/src/tui/keyboard-protocol.mjs +2 -2
  142. package/src/tui/lib/voice-recorder.mjs +35 -19
  143. package/src/tui/markdown/format-token.mjs +7 -8
  144. package/src/tui/markdown/format-token.test.mjs +3 -3
  145. package/src/tui/paste-attachments.mjs +38 -0
  146. package/src/tui/paste-fix.test.mjs +119 -0
  147. package/src/tui/themes/base.mjs +2 -2
  148. package/src/tui/themes/kanagawa.mjs +4 -4
  149. package/src/tui/themes/teal.mjs +4 -5
  150. package/src/tui/themes/utils.mjs +1 -1
  151. package/src/ui/statusline.mjs +49 -0
  152. package/src/workflows/default/WORKFLOW.md +16 -9
  153. package/src/workflows/sequential/WORKFLOW.md +16 -11
  154. package/src/workflows/solo/WORKFLOW.md +5 -1
@@ -425,6 +425,16 @@ function renderNativeStatusline({
425
425
  const label = `Running ${n} Shell${n === 1 ? '' : 's'}`;
426
426
  addL2(`${spin} ${B}${label}${R}${elapsedSuffix(shellStatus.elapsedLabel)}`);
427
427
  }
428
+ // Memory cycle segment — single unified "Memory" wording for all states:
429
+ // running -> "⠋ Memory · 12s"; backlog warning -> "⠋ Memory · backlog 512"
430
+ // (yellow). Nothing when idle (no L2 pollution).
431
+ const memStatus = memoryCycleStatus();
432
+ if (memStatus?.kind === 'running') {
433
+ const elapsed = formatElapsed(Date.now() - memStatus.startedAt);
434
+ addL2(`${spin} ${B}Memory${R}${elapsedSuffix(elapsed)}`);
435
+ } else if (memStatus?.kind === 'backlog') {
436
+ addL2(`${spin} ${B}Memory${R} ${D}·${R} ${YLW}backlog ${memStatus.pending}${R}`);
437
+ }
428
438
  const l1 = l1Parts.join(sep) || 'mixdog';
429
439
  const l2 = l2Parts.join(sep);
430
440
  return l2 ? `${l1}\n${l2}` : l1;
@@ -767,6 +777,45 @@ function maintenanceLabel(tag) {
767
777
  }
768
778
 
769
779
  function shellJobsStatus({ clientHostPid } = {}) {
780
+ return _shellJobsStatusImpl({ clientHostPid });
781
+ }
782
+
783
+ // Memory cycle L2 segment source. The memory daemon writes
784
+ // data/memory-cycle-state.json on every cycle start/finish (index.mjs
785
+ // _writeCycleStateFile) — no HTTP call from the statusline path. Cached at
786
+ // the same 1s cadence as the shell segment. Shows a single unified "Memory"
787
+ // segment: running (spinner + elapsed) or backlog warning (yellow count).
788
+ let _memoryCycleSegmentCache = { at: 0, value: null };
789
+ const MEMORY_CYCLE_SEGMENT_CACHE_MS = 1000;
790
+ const MEMORY_CYCLE_BACKLOG_WARN = 500;
791
+ function memoryCycleStatus() {
792
+ const now = Date.now();
793
+ if (now - _memoryCycleSegmentCache.at < MEMORY_CYCLE_SEGMENT_CACHE_MS) {
794
+ return _memoryCycleSegmentCache.value;
795
+ }
796
+ let value = null;
797
+ try {
798
+ const p = join(dataDir(), 'memory-cycle-state.json');
799
+ if (existsSync(p)) {
800
+ const state = JSON.parse(readFileSync(p, 'utf-8'));
801
+ const running = state?.running || null;
802
+ const backlog = state?.backlog || {};
803
+ // Stale-file guard: a daemon that died mid-run leaves running set —
804
+ // ignore anything not refreshed in the last 10 minutes.
805
+ const fresh = Number(state?.updatedAt) > now - 10 * 60_000;
806
+ if (fresh && running?.cycle && Number(running.started_at) > 0) {
807
+ value = { kind: 'running', startedAt: Number(running.started_at) };
808
+ } else if (fresh) {
809
+ const pending = Math.max(Number(backlog?.unchunked) || 0, Number(backlog?.cycle2_pending) || 0);
810
+ if (pending > MEMORY_CYCLE_BACKLOG_WARN) value = { kind: 'backlog', pending };
811
+ }
812
+ }
813
+ } catch { value = null; }
814
+ _memoryCycleSegmentCache = { at: now, value };
815
+ return value;
816
+ }
817
+
818
+ function _shellJobsStatusImpl({ clientHostPid } = {}) {
770
819
  const ownerPid = positiveInt(clientHostPid);
771
820
  const empty = { count: 0, elapsedLabel: '' };
772
821
  if (!ownerPid) return empty;
@@ -26,16 +26,23 @@ Lead supervises: delegates, coordinates, judges, decides. Route by complexity:
26
26
  - SEQUENTIAL within a single complex scope — split it into ordered steps
27
27
  rather than handing it off in one shot, with a build/test-green gate
28
28
  between steps.
29
- - Reuse the existing agent (same tag) for follow-up on the same scope; spawn
30
- new only for a separate scope. Write briefs per the lead-tool brief
31
- contract (token-optimized labeled fragments).
29
+ - Write briefs per the lead-tool brief contract (token-optimized labeled
30
+ fragments).
32
31
  - After spawning async agent(s), END THE TURN — do not poll, guess, or start
33
- dependent work until the completion notification resumes you (status/read
34
- are manual recovery only). Then wait and continue automatically.
32
+ dependent work until the completion notification resumes you. Then wait
33
+ and continue automatically.
35
34
  3. Review — pair one reviewer 1:1 with each implementation scope, spawned in the
36
- same turn. Cross-check implementation and review results yourself before
37
- acting on them. Send fixes back to the original scope and repeat until clean.
38
- Skip review only for simple, low-risk tasks.
35
+ same turn; never defer or batch the reviewer call — wait for its result.
36
+ Fact-check the agent response and cross-check implementation and review
37
+ results yourself before acting on them. Send fixes back to the original
38
+ scope and loop verify -> fix -> re-verify until clean. Skip review only for
39
+ simple, low-risk tasks. If the user asks for debugging, or a bug survives
40
+ 2+ fix cycles, have the debugger investigate first instead of another fix
41
+ round.
39
42
  4. Report — deliver the final report: synthesize results (outcome + key
40
43
  evidence; never forward raw agent output), state the final state, and ask the
41
- user whether to ship/deploy when relevant.
44
+ user whether to ship/deploy when relevant. Only after user feedback with no
45
+ issues prepare deploy/build/commit.
46
+
47
+ On any major change or direction shift mid-work, pause and re-consult the user
48
+ before continuing.
@@ -29,18 +29,23 @@ Lead supervises: delegates, coordinates, judges, decides. Route by complexity:
29
29
  - SEQUENTIAL within a single complex scope — split it into ordered steps
30
30
  rather than handing it off in one shot, with a build/test-green gate
31
31
  between steps.
32
- - Reuse the existing agent (same tag) for follow-up on the same scope; spawn
33
- new only for a separate scope. Write briefs per the lead-tool brief
34
- contract (token-optimized labeled fragments).
32
+ - Write briefs per the lead-tool brief contract (token-optimized labeled
33
+ fragments).
35
34
  - After spawning an async agent, END THE TURN — do not poll, guess, or start
36
- dependent or subsequent work until the completion notification resumes you
37
- (status/read are manual recovery only). Then wait and continue
38
- automatically.
35
+ dependent or subsequent work until the completion notification resumes
36
+ you. Then wait and continue automatically.
39
37
  3. Review — after each implementation scope completes, pair one reviewer 1:1
40
- with that scope (spawned on its own turn, not batched). Cross-check
41
- implementation and review results yourself before acting on them. Send fixes
42
- back to the original scope and repeat until clean. Skip review only for
43
- simple, low-risk tasks.
38
+ with that scope (spawned on its own turn, not batched); never defer the
39
+ reviewer call wait for its result. Fact-check the agent response and
40
+ cross-check implementation and review results yourself before acting on
41
+ them. Send fixes back to the original scope and loop verify -> fix ->
42
+ re-verify until clean. Skip review only for simple, low-risk tasks. If the
43
+ user asks for debugging, or a bug survives 2+ fix cycles, have the debugger
44
+ investigate first instead of another fix round.
44
45
  4. Report — deliver the final report: synthesize results (outcome + key
45
46
  evidence; never forward raw agent output), state the final state, and ask the
46
- user whether to ship/deploy when relevant.
47
+ user whether to ship/deploy when relevant. Only after user feedback with no
48
+ issues prepare deploy/build/commit.
49
+
50
+ On any major change or direction shift mid-work, pause and re-consult the user
51
+ before continuing.
@@ -14,7 +14,11 @@ agents:
14
14
  3. Verify — Lead checks the result directly, fixes issues directly, and repeats
15
15
  until the work is clean or a blocker must be reported.
16
16
  4. Report — Lead summarizes the final state, verification result, and any
17
- remaining risk or requested next step.
17
+ remaining risk or requested next step. Only after user feedback with no
18
+ issues prepare deploy/build/commit.
19
+
20
+ On any major change or direction shift mid-work, pause and re-consult the user
21
+ before continuing.
18
22
 
19
23
  Delegation rule:
20
24
  - Do not delegate, spawn, send, or ask any agent to perform work.