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
@@ -1,31 +1,28 @@
1
- // Telegram MarkdownV2 conversion — a faithful JS port of hermes-agent's
2
- // gateway/platforms/telegram.py (functions: _MDV2_ESCAPE_RE, _escape_mdv2,
3
- // _strip_mdv2, _TABLE_SEPARATOR_RE, _is_table_row, _split_markdown_table_row,
4
- // _render_table_block_for_telegram, _wrap_markdown_tables, and the 12-step
5
- // format_message pipeline). The Python behaviour is battle-tested; this port
6
- // keeps the same step order and the same table/header/blockquote decisions so
7
- // output matches the reference.
1
+ // Telegram MarkdownV2 conversion.
2
+ //
3
+ // Converts standard markdown into Telegram's MarkdownV2 entity format: escapes
4
+ // all MarkdownV2-special characters outside protected regions, converts tables
5
+ // into bullet-grouped blocks Telegram can render, and preserves a fixed step
6
+ // order for table/header/blockquote handling so output stays deterministic.
8
7
  //
9
8
  // Exported:
10
- // toMarkdownV2(text) — the main converter (port of format_message)
11
- // stripMdV2(text) — plain-text fallback (port of _strip_mdv2)
12
- // escapeMdV2(text) — raw escape helper (port of _escape_mdv2)
9
+ // toMarkdownV2(text) — the main converter
10
+ // stripMdV2(text) — plain-text fallback (strips MarkdownV2 markers)
11
+ // escapeMdV2(text) — raw escape helper
13
12
  // isParseEntitiesError(err) — detect a MarkdownV2 400 parse failure
14
13
 
15
14
  // Matches every character MarkdownV2 requires to be backslash-escaped outside a
16
- // code span / fenced block. Port of _MDV2_ESCAPE_RE:
17
- // Python: r'([_*\[\]()~`>#\+\-=|{}.!\\])'
15
+ // code span / fenced block.
18
16
  const MDV2_ESCAPE_RE = /([_*[\]()~`>#+\-=|{}.!\\])/g;
19
17
 
20
- /** Port of _escape_mdv2: backslash-escape all MarkdownV2 specials. */
18
+ /** Backslash-escape all MarkdownV2 special characters. */
21
19
  export function escapeMdV2(text) {
22
20
  return String(text).replace(MDV2_ESCAPE_RE, "\\$1");
23
21
  }
24
22
 
25
23
  /**
26
- * Port of _strip_mdv2: remove MarkdownV2 escape backslashes AND the entity
27
- * markers format_message introduced, producing clean plain text for the
28
- * parse-error fallback.
24
+ * Remove MarkdownV2 escape backslashes and the entity markers toMarkdownV2
25
+ * introduces, producing clean plain text for the parse-error fallback.
29
26
  */
30
27
  export function stripMdV2(text) {
31
28
  let cleaned = String(text);
@@ -34,7 +31,7 @@ export function stripMdV2(text) {
34
31
  // Remove bold markers (*text* → text).
35
32
  cleaned = cleaned.replace(/\*([^*]+)\*/g, "$1");
36
33
  // Remove italic markers (_text_ → text). Word-boundary guards keep
37
- // snake_case identifiers intact (mirrors the Python lookbehind/lookahead).
34
+ // snake_case identifiers intact.
38
35
  cleaned = cleaned.replace(/(^|\W)_([^_]+)_(?!\w)/g, "$1$2");
39
36
  // Remove strikethrough markers (~text~ → text).
40
37
  cleaned = cleaned.replace(/~([^~]+)~/g, "$1");
@@ -44,10 +41,10 @@ export function stripMdV2(text) {
44
41
  }
45
42
 
46
43
  // ── Markdown table → Telegram-friendly row groups ──────────────────────────
47
- // Port of _TABLE_SEPARATOR_RE / _is_table_row / _split_markdown_table_row /
48
- // _render_table_block_for_telegram / _wrap_markdown_tables.
44
+ // Converts a markdown table block into per-row bullet groups Telegram can
45
+ // render (Telegram MarkdownV2 has no native table support).
49
46
 
50
- // Python: r'^\s*\|?\s*:?-+:?\s*(?:\|\s*:?-+:?\s*){1,}\|?\s*$'
47
+ // Matches a markdown table header-separator row, e.g. `| --- | :---: |`.
51
48
  const TABLE_SEPARATOR_RE = /^\s*\|?\s*:?-+:?\s*(?:\|\s*:?-+:?\s*){1,}\|?\s*$/;
52
49
 
53
50
  function isTableRow(line) {
@@ -99,7 +96,7 @@ function renderTableBlockForTelegram(tableBlock) {
99
96
  bullets.push(`• ${headers[c]}: ${value}`);
100
97
  }
101
98
  // The heading is emitted as `**heading**` markdown so step 5 (bold) of the
102
- // main pipeline converts it — matches the Python ordering intentionally.
99
+ // main pipeline converts it.
103
100
  const groupLines = [`**${heading}**`, ...bullets];
104
101
  renderedGroups.push(groupLines.join("\n"));
105
102
  }
@@ -145,7 +142,7 @@ function wrapMarkdownTables(text) {
145
142
  return out.join("\n");
146
143
  }
147
144
 
148
- // ── Main converter — port of format_message (12-step placeholder pipeline) ──
145
+ // ── Main converter (placeholder-protected escape pipeline) ──
149
146
 
150
147
  /**
151
148
  * Convert standard/assistant markdown into Telegram MarkdownV2.
@@ -0,0 +1,42 @@
1
+ // Whisper transcription language detection. Extracted verbatim from
2
+ // channels/index.mjs (behavior-preserving). Module-scoped memoization of the
3
+ // resolved device language mirrors the original file-level `let`.
4
+ let resolvedWhisperLanguage = null;
5
+
6
+ function normalizeWhisperLanguage(value) {
7
+ const raw = String(value ?? "").trim().toLowerCase();
8
+ if (!raw || raw === "auto") return null;
9
+ if (raw.startsWith("ko")) return "ko";
10
+ if (raw.startsWith("ja")) return "ja";
11
+ if (raw.startsWith("en")) return "en";
12
+ if (raw.startsWith("zh")) return "zh";
13
+ if (raw.startsWith("de")) return "de";
14
+ if (raw.startsWith("fr")) return "fr";
15
+ if (raw.startsWith("es")) return "es";
16
+ if (raw.startsWith("it")) return "it";
17
+ if (raw.startsWith("pt")) return "pt";
18
+ if (raw.startsWith("ru")) return "ru";
19
+ return raw;
20
+ }
21
+
22
+ function detectDeviceLanguage() {
23
+ if (resolvedWhisperLanguage) return resolvedWhisperLanguage;
24
+ const candidates = [
25
+ process.env.MIXDOG_CHANNELS_WHISPER_LANGUAGE,
26
+ process.env.LC_ALL,
27
+ process.env.LC_MESSAGES,
28
+ process.env.LANG,
29
+ Intl.DateTimeFormat().resolvedOptions().locale
30
+ ];
31
+ for (const candidate of candidates) {
32
+ const normalized = normalizeWhisperLanguage(candidate);
33
+ if (normalized) {
34
+ resolvedWhisperLanguage = normalized;
35
+ return normalized;
36
+ }
37
+ }
38
+ resolvedWhisperLanguage = "auto";
39
+ return resolvedWhisperLanguage;
40
+ }
41
+
42
+ export { normalizeWhisperLanguage, detectDeviceLanguage };