@duckmind/dm-darwin-x64 0.43.4 → 0.43.8

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 (251) hide show
  1. package/dm +0 -0
  2. package/extensions/.dm-extensions.json +241 -49
  3. package/extensions/dm-9router-ext/package.json +2 -19
  4. package/extensions/dm-9router-ext/src/index.js +5 -0
  5. package/extensions/dm-ask-user/index.js +10 -0
  6. package/extensions/dm-ask-user/package.json +1 -21
  7. package/extensions/dm-cli-anything/package.json +0 -6
  8. package/extensions/dm-context/package.json +2 -12
  9. package/extensions/dm-context/src/context.js +1 -0
  10. package/extensions/dm-context/src/index.js +7 -0
  11. package/extensions/dm-context/src/utils.js +1 -0
  12. package/extensions/dm-cua/package.json +0 -7
  13. package/extensions/dm-fff/package.json +1 -28
  14. package/extensions/dm-fff/src/index.js +15 -0
  15. package/extensions/dm-fff/src/query.js +1 -0
  16. package/extensions/dm-goal/package.json +2 -31
  17. package/extensions/dm-goal/src/goal.js +43 -0
  18. package/extensions/dm-grill-me/index.js +174 -0
  19. package/extensions/dm-grill-me/package.json +1 -26
  20. package/extensions/dm-image2/package.json +0 -7
  21. package/extensions/dm-subagents/package.json +1 -32
  22. package/extensions/dm-subagents/src/agents/agent-management.js +37 -0
  23. package/extensions/dm-subagents/src/agents/agent-memory.js +6 -0
  24. package/extensions/dm-subagents/src/agents/agent-scope.js +1 -0
  25. package/extensions/dm-subagents/src/agents/agent-selection.js +1 -0
  26. package/extensions/dm-subagents/src/agents/agent-serializer.js +7 -0
  27. package/extensions/dm-subagents/src/agents/agents.js +11 -0
  28. package/extensions/dm-subagents/src/agents/chain-serializer.js +12 -0
  29. package/extensions/dm-subagents/src/agents/frontmatter.js +6 -0
  30. package/extensions/dm-subagents/src/agents/identity.js +1 -0
  31. package/extensions/dm-subagents/src/agents/proactive-skills.js +1 -0
  32. package/extensions/dm-subagents/src/agents/skills.js +6 -0
  33. package/extensions/dm-subagents/src/extension/config.js +2 -0
  34. package/extensions/dm-subagents/src/extension/control-notices.js +4 -0
  35. package/extensions/dm-subagents/src/extension/doctor.js +16 -0
  36. package/extensions/dm-subagents/src/extension/fanout-child.js +231 -0
  37. package/extensions/dm-subagents/src/extension/index.js +367 -0
  38. package/extensions/dm-subagents/src/extension/rpc.js +8 -0
  39. package/extensions/dm-subagents/src/extension/schemas.js +1 -0
  40. package/extensions/dm-subagents/src/extension/{tool-description.ts → tool-description.js} +6 -126
  41. package/extensions/dm-subagents/src/intercom/intercom-bridge.js +13 -0
  42. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.js +5 -0
  43. package/extensions/dm-subagents/src/intercom/result-intercom.js +3 -0
  44. package/extensions/dm-subagents/src/profiles/profiles.js +3 -0
  45. package/extensions/dm-subagents/src/runs/background/async-execution.js +46 -0
  46. package/extensions/dm-subagents/src/runs/background/async-job-tracker.js +14 -0
  47. package/extensions/dm-subagents/src/runs/background/async-resume.js +8 -0
  48. package/extensions/dm-subagents/src/runs/background/async-status.js +12 -0
  49. package/extensions/dm-subagents/src/runs/background/chain-append.js +2 -0
  50. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.js +1 -0
  51. package/extensions/dm-subagents/src/runs/background/completion-batcher.js +1 -0
  52. package/extensions/dm-subagents/src/runs/background/completion-dedupe.js +1 -0
  53. package/extensions/dm-subagents/src/runs/background/control-channel.js +1 -0
  54. package/extensions/dm-subagents/src/runs/background/fleet-view.js +17 -0
  55. package/extensions/dm-subagents/src/runs/background/notify.js +3 -0
  56. package/extensions/dm-subagents/src/runs/background/parallel-groups.js +1 -0
  57. package/extensions/dm-subagents/src/runs/background/result-watcher.js +8 -0
  58. package/extensions/dm-subagents/src/runs/background/run-id-resolver.js +4 -0
  59. package/extensions/dm-subagents/src/runs/background/run-status.js +23 -0
  60. package/extensions/dm-subagents/src/runs/background/scheduled-runs.js +4 -0
  61. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.js +11 -0
  62. package/extensions/dm-subagents/src/runs/background/subagent-runner.js +78 -0
  63. package/extensions/dm-subagents/src/runs/background/top-level-async.js +1 -0
  64. package/extensions/dm-subagents/src/runs/background/wait.js +11 -0
  65. package/extensions/dm-subagents/src/runs/foreground/chain-clarify.js +12 -0
  66. package/extensions/dm-subagents/src/runs/foreground/chain-execution.js +102 -0
  67. package/extensions/dm-subagents/src/runs/foreground/execution.js +51 -0
  68. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.js +228 -0
  69. package/extensions/dm-subagents/src/runs/shared/acceptance.js +3 -0
  70. package/extensions/dm-subagents/src/runs/shared/chain-outputs.js +1 -0
  71. package/extensions/dm-subagents/src/runs/shared/completion-guard.js +3 -0
  72. package/extensions/dm-subagents/src/runs/shared/dm-args.js +1 -0
  73. package/extensions/dm-subagents/src/runs/shared/dm-spawn.js +1 -0
  74. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.js +1 -0
  75. package/extensions/dm-subagents/src/runs/shared/long-running-guard.js +1 -0
  76. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.js +1 -0
  77. package/extensions/dm-subagents/src/runs/shared/model-fallback.js +1 -0
  78. package/extensions/dm-subagents/src/runs/shared/model-scope.js +1 -0
  79. package/extensions/dm-subagents/src/runs/shared/nested-events.js +8 -0
  80. package/extensions/dm-subagents/src/runs/shared/nested-path.js +1 -0
  81. package/extensions/dm-subagents/src/runs/shared/nested-render.js +1 -0
  82. package/extensions/dm-subagents/src/runs/shared/parallel-utils.js +5 -0
  83. package/extensions/dm-subagents/src/runs/shared/run-history.js +5 -0
  84. package/extensions/dm-subagents/src/runs/shared/single-output.js +14 -0
  85. package/extensions/dm-subagents/src/runs/shared/structured-output.js +1 -0
  86. package/extensions/dm-subagents/src/runs/shared/subagent-control.js +5 -0
  87. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.js +22 -0
  88. package/extensions/dm-subagents/src/runs/shared/tool-budget.js +1 -0
  89. package/extensions/dm-subagents/src/runs/shared/turn-budget.js +7 -0
  90. package/extensions/dm-subagents/src/runs/shared/workflow-graph.js +1 -0
  91. package/extensions/dm-subagents/src/runs/shared/worktree.js +3 -0
  92. package/extensions/dm-subagents/src/shared/artifacts.js +2 -0
  93. package/extensions/dm-subagents/src/shared/atomic-json.js +1 -0
  94. package/extensions/dm-subagents/src/shared/child-transcript.js +5 -0
  95. package/extensions/dm-subagents/src/shared/file-coalescer.js +1 -0
  96. package/extensions/dm-subagents/src/shared/fork-context.js +6 -0
  97. package/extensions/dm-subagents/src/shared/formatters.js +9 -0
  98. package/extensions/dm-subagents/src/shared/jsonl-writer.js +2 -0
  99. package/extensions/dm-subagents/src/shared/model-info.js +1 -0
  100. package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.js +1 -0
  101. package/extensions/dm-subagents/src/shared/session-identity.js +1 -0
  102. package/extensions/dm-subagents/src/shared/session-tokens.js +2 -0
  103. package/extensions/dm-subagents/src/shared/settings.js +23 -0
  104. package/extensions/dm-subagents/src/shared/status-format.js +1 -0
  105. package/extensions/dm-subagents/src/shared/types.js +8 -0
  106. package/extensions/dm-subagents/src/shared/utils.js +2 -0
  107. package/extensions/dm-subagents/src/slash/prompt-template-bridge.js +1 -0
  108. package/extensions/dm-subagents/src/slash/prompt-workflows.js +7 -0
  109. package/extensions/dm-subagents/src/slash/slash-bridge.js +1 -0
  110. package/extensions/dm-subagents/src/slash/slash-commands.js +38 -0
  111. package/extensions/dm-subagents/src/slash/slash-live-state.js +6 -0
  112. package/extensions/dm-subagents/src/tui/render-helpers.js +1 -0
  113. package/extensions/dm-subagents/src/tui/render.js +4 -0
  114. package/extensions/dm-tasks/package.json +1 -30
  115. package/extensions/dm-tasks/src/auto-clear.js +1 -0
  116. package/extensions/dm-tasks/src/index.js +212 -0
  117. package/extensions/dm-tasks/src/process-tracker.js +1 -0
  118. package/extensions/dm-tasks/src/task-store.js +1 -0
  119. package/extensions/dm-tasks/src/tasks-config.js +1 -0
  120. package/extensions/dm-tasks/src/types.js +0 -0
  121. package/extensions/dm-tasks/src/ui/settings-menu.js +1 -0
  122. package/extensions/dm-tasks/src/ui/task-widget.js +1 -0
  123. package/extensions/dm-usage/index.js +9 -0
  124. package/extensions/dm-usage/package.json +1 -18
  125. package/extensions/greedysearch-dm/index.js +20 -0
  126. package/extensions/greedysearch-dm/package.json +1 -22
  127. package/extensions/greedysearch-dm/src/formatters/results.js +8 -0
  128. package/extensions/greedysearch-dm/src/formatters/sources.js +1 -0
  129. package/extensions/greedysearch-dm/src/formatters/synthesis.js +1 -0
  130. package/extensions/greedysearch-dm/src/tools/greedy-search-handler.js +20 -0
  131. package/extensions/greedysearch-dm/src/tools/shared.js +9 -0
  132. package/extensions/greedysearch-dm/src/types.js +0 -0
  133. package/extensions/greedysearch-dm/src/utils/helpers.js +1 -0
  134. package/package.json +1 -1
  135. package/extensions/dm-9router-ext/src/index.ts +0 -541
  136. package/extensions/dm-ask-user/index.ts +0 -857
  137. package/extensions/dm-context/src/context.ts +0 -158
  138. package/extensions/dm-context/src/index.ts +0 -439
  139. package/extensions/dm-context/src/utils.ts +0 -6
  140. package/extensions/dm-fff/src/index.ts +0 -1023
  141. package/extensions/dm-fff/src/query.ts +0 -87
  142. package/extensions/dm-goal/src/goal.ts +0 -1073
  143. package/extensions/dm-grill-me/index.ts +0 -1085
  144. package/extensions/dm-subagents/src/agents/agent-management.ts +0 -1052
  145. package/extensions/dm-subagents/src/agents/agent-memory.ts +0 -254
  146. package/extensions/dm-subagents/src/agents/agent-scope.ts +0 -6
  147. package/extensions/dm-subagents/src/agents/agent-selection.ts +0 -25
  148. package/extensions/dm-subagents/src/agents/agent-serializer.ts +0 -121
  149. package/extensions/dm-subagents/src/agents/agents.ts +0 -1553
  150. package/extensions/dm-subagents/src/agents/chain-serializer.ts +0 -277
  151. package/extensions/dm-subagents/src/agents/frontmatter.ts +0 -93
  152. package/extensions/dm-subagents/src/agents/identity.ts +0 -30
  153. package/extensions/dm-subagents/src/agents/proactive-skills.ts +0 -191
  154. package/extensions/dm-subagents/src/agents/skills.ts +0 -729
  155. package/extensions/dm-subagents/src/extension/config.ts +0 -39
  156. package/extensions/dm-subagents/src/extension/control-notices.ts +0 -92
  157. package/extensions/dm-subagents/src/extension/doctor.ts +0 -214
  158. package/extensions/dm-subagents/src/extension/fanout-child.ts +0 -172
  159. package/extensions/dm-subagents/src/extension/index.ts +0 -656
  160. package/extensions/dm-subagents/src/extension/rpc.ts +0 -369
  161. package/extensions/dm-subagents/src/extension/schemas.ts +0 -309
  162. package/extensions/dm-subagents/src/intercom/intercom-bridge.ts +0 -180
  163. package/extensions/dm-subagents/src/intercom/native-supervisor-channel.ts +0 -519
  164. package/extensions/dm-subagents/src/intercom/result-intercom.ts +0 -377
  165. package/extensions/dm-subagents/src/profiles/profiles.ts +0 -637
  166. package/extensions/dm-subagents/src/runs/background/async-execution.ts +0 -1065
  167. package/extensions/dm-subagents/src/runs/background/async-job-tracker.ts +0 -441
  168. package/extensions/dm-subagents/src/runs/background/async-resume.ts +0 -391
  169. package/extensions/dm-subagents/src/runs/background/async-status.ts +0 -395
  170. package/extensions/dm-subagents/src/runs/background/chain-append.ts +0 -282
  171. package/extensions/dm-subagents/src/runs/background/chain-root-attachment.ts +0 -191
  172. package/extensions/dm-subagents/src/runs/background/completion-batcher.ts +0 -166
  173. package/extensions/dm-subagents/src/runs/background/completion-dedupe.ts +0 -63
  174. package/extensions/dm-subagents/src/runs/background/control-channel.ts +0 -332
  175. package/extensions/dm-subagents/src/runs/background/fleet-view.ts +0 -515
  176. package/extensions/dm-subagents/src/runs/background/notify.ts +0 -225
  177. package/extensions/dm-subagents/src/runs/background/parallel-groups.ts +0 -45
  178. package/extensions/dm-subagents/src/runs/background/result-watcher.ts +0 -315
  179. package/extensions/dm-subagents/src/runs/background/run-id-resolver.ts +0 -84
  180. package/extensions/dm-subagents/src/runs/background/run-status.ts +0 -434
  181. package/extensions/dm-subagents/src/runs/background/scheduled-runs.ts +0 -514
  182. package/extensions/dm-subagents/src/runs/background/stale-run-reconciler.ts +0 -368
  183. package/extensions/dm-subagents/src/runs/background/subagent-runner.ts +0 -3171
  184. package/extensions/dm-subagents/src/runs/background/top-level-async.ts +0 -13
  185. package/extensions/dm-subagents/src/runs/background/wait.ts +0 -353
  186. package/extensions/dm-subagents/src/runs/foreground/chain-clarify.ts +0 -1333
  187. package/extensions/dm-subagents/src/runs/foreground/chain-execution.ts +0 -1313
  188. package/extensions/dm-subagents/src/runs/foreground/execution.ts +0 -1239
  189. package/extensions/dm-subagents/src/runs/foreground/subagent-executor.ts +0 -3613
  190. package/extensions/dm-subagents/src/runs/shared/acceptance.ts +0 -879
  191. package/extensions/dm-subagents/src/runs/shared/chain-outputs.ts +0 -116
  192. package/extensions/dm-subagents/src/runs/shared/completion-guard.ts +0 -147
  193. package/extensions/dm-subagents/src/runs/shared/dm-args.ts +0 -271
  194. package/extensions/dm-subagents/src/runs/shared/dm-spawn.ts +0 -147
  195. package/extensions/dm-subagents/src/runs/shared/dynamic-fanout.ts +0 -295
  196. package/extensions/dm-subagents/src/runs/shared/long-running-guard.ts +0 -175
  197. package/extensions/dm-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +0 -365
  198. package/extensions/dm-subagents/src/runs/shared/model-fallback.ts +0 -292
  199. package/extensions/dm-subagents/src/runs/shared/model-scope.ts +0 -128
  200. package/extensions/dm-subagents/src/runs/shared/nested-events.ts +0 -908
  201. package/extensions/dm-subagents/src/runs/shared/nested-path.ts +0 -52
  202. package/extensions/dm-subagents/src/runs/shared/nested-render.ts +0 -115
  203. package/extensions/dm-subagents/src/runs/shared/parallel-utils.ts +0 -198
  204. package/extensions/dm-subagents/src/runs/shared/run-history.ts +0 -60
  205. package/extensions/dm-subagents/src/runs/shared/single-output.ts +0 -180
  206. package/extensions/dm-subagents/src/runs/shared/structured-output.ts +0 -77
  207. package/extensions/dm-subagents/src/runs/shared/subagent-control.ts +0 -223
  208. package/extensions/dm-subagents/src/runs/shared/subagent-prompt-runtime.ts +0 -342
  209. package/extensions/dm-subagents/src/runs/shared/tool-budget.ts +0 -74
  210. package/extensions/dm-subagents/src/runs/shared/turn-budget.ts +0 -52
  211. package/extensions/dm-subagents/src/runs/shared/workflow-graph.ts +0 -206
  212. package/extensions/dm-subagents/src/runs/shared/worktree.ts +0 -600
  213. package/extensions/dm-subagents/src/shared/artifacts.ts +0 -113
  214. package/extensions/dm-subagents/src/shared/atomic-json.ts +0 -86
  215. package/extensions/dm-subagents/src/shared/child-transcript.ts +0 -212
  216. package/extensions/dm-subagents/src/shared/file-coalescer.ts +0 -40
  217. package/extensions/dm-subagents/src/shared/fork-context.ts +0 -194
  218. package/extensions/dm-subagents/src/shared/formatters.ts +0 -133
  219. package/extensions/dm-subagents/src/shared/jsonl-writer.ts +0 -81
  220. package/extensions/dm-subagents/src/shared/model-info.ts +0 -78
  221. package/extensions/dm-subagents/src/shared/post-exit-stdio-guard.ts +0 -85
  222. package/extensions/dm-subagents/src/shared/session-identity.ts +0 -10
  223. package/extensions/dm-subagents/src/shared/session-tokens.ts +0 -44
  224. package/extensions/dm-subagents/src/shared/settings.ts +0 -450
  225. package/extensions/dm-subagents/src/shared/status-format.ts +0 -49
  226. package/extensions/dm-subagents/src/shared/types.ts +0 -1257
  227. package/extensions/dm-subagents/src/shared/utils.ts +0 -554
  228. package/extensions/dm-subagents/src/slash/prompt-template-bridge.ts +0 -420
  229. package/extensions/dm-subagents/src/slash/prompt-workflows.ts +0 -330
  230. package/extensions/dm-subagents/src/slash/slash-bridge.ts +0 -176
  231. package/extensions/dm-subagents/src/slash/slash-commands.ts +0 -1296
  232. package/extensions/dm-subagents/src/slash/slash-live-state.ts +0 -292
  233. package/extensions/dm-subagents/src/tui/render-helpers.ts +0 -80
  234. package/extensions/dm-subagents/src/tui/render.ts +0 -1748
  235. package/extensions/dm-tasks/src/auto-clear.ts +0 -91
  236. package/extensions/dm-tasks/src/index.ts +0 -1145
  237. package/extensions/dm-tasks/src/process-tracker.ts +0 -140
  238. package/extensions/dm-tasks/src/task-store.ts +0 -305
  239. package/extensions/dm-tasks/src/tasks-config.ts +0 -23
  240. package/extensions/dm-tasks/src/types.ts +0 -40
  241. package/extensions/dm-tasks/src/ui/settings-menu.ts +0 -100
  242. package/extensions/dm-tasks/src/ui/task-widget.ts +0 -265
  243. package/extensions/dm-usage/index.ts +0 -1718
  244. package/extensions/greedysearch-dm/index.ts +0 -177
  245. package/extensions/greedysearch-dm/src/formatters/results.ts +0 -163
  246. package/extensions/greedysearch-dm/src/formatters/sources.ts +0 -116
  247. package/extensions/greedysearch-dm/src/formatters/synthesis.ts +0 -87
  248. package/extensions/greedysearch-dm/src/tools/greedy-search-handler.ts +0 -370
  249. package/extensions/greedysearch-dm/src/tools/shared.ts +0 -187
  250. package/extensions/greedysearch-dm/src/types.ts +0 -110
  251. package/extensions/greedysearch-dm/src/utils/helpers.ts +0 -40
@@ -1,177 +0,0 @@
1
- /**
2
- * GreedySearch DM Extension
3
- *
4
- * Adds `greedy_search` tool to DM.
5
- * Use depth: "deep" for deep research (source fetching + synthesis + confidence).
6
- *
7
- * Reports streaming progress as each engine completes.
8
- * Requires Chrome to be running (or it auto-launches a dedicated instance).
9
- */
10
-
11
- import { spawn } from "node:child_process";
12
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
13
- import { homedir } from "node:os";
14
- import { dirname, join } from "node:path";
15
- import { fileURLToPath } from "node:url";
16
-
17
- import { registerGreedySearchTool } from "./src/tools/greedy-search-handler.js";
18
-
19
- type ExtensionAPI = any;
20
- import { cdpAvailable } from "./src/tools/shared.js";
21
- import { nodeRuntimeCommand } from "./src/utils/node-runtime.mjs";
22
-
23
- const __dir = dirname(fileURLToPath(import.meta.url));
24
-
25
- export default function greedySearchExtension(dm: ExtensionAPI) {
26
- dm.on("session_start", async (_event, ctx) => {
27
- if (!cdpAvailable(__dir)) {
28
- ctx.ui.notify(
29
- "GreedySearch: cdp.mjs missing from package directory — try reinstall DM or rebuild the bundled GreedySearch asset",
30
- "warning",
31
- );
32
- }
33
- });
34
-
35
- // ─── greedy_search ────────────────────────────────────────────────────────
36
- registerGreedySearchTool(dm, __dir);
37
-
38
- // ─── GreedySearch Chrome commands ─────────────────────────────────────────
39
- dm.registerCommand("greedy-visible", {
40
- description:
41
- "Launch GreedySearch Chrome in visible mode for captcha/login/cookie setup.",
42
- handler: async (_args, ctx) => {
43
- await runChromeCommand([], ctx, "Visible GreedySearch Chrome launched.");
44
- },
45
- });
46
-
47
- dm.registerCommand("greedy-status", {
48
- description: "Show GreedySearch Chrome status.",
49
- handler: async (_args, ctx) => {
50
- await runChromeCommand(["--status"], ctx);
51
- },
52
- });
53
-
54
- dm.registerCommand("greedy-kill", {
55
- description: "Stop GreedySearch Chrome.",
56
- handler: async (_args, ctx) => {
57
- await runChromeCommand(["--kill"], ctx, "GreedySearch Chrome stopped.");
58
- },
59
- });
60
-
61
- // ─── /set-greedy-locale command ───────────────────────────────────────────
62
- dm.registerCommand("set-greedy-locale", {
63
- description:
64
- "Set default locale for GreedySearch results (e.g., /set-greedy-locale de, /set-greedy-locale --clear, /set-greedy-locale --show)",
65
- handler: async (args, ctx) => {
66
- const arg = args.trim() || "--show";
67
-
68
- if (arg === "--show") {
69
- const config = loadUserConfig();
70
- if (config.locale) {
71
- ctx.ui.notify(`Default locale: ${config.locale}`, "info");
72
- } else {
73
- ctx.ui.notify("No default locale (uses: en)", "info");
74
- }
75
- return;
76
- }
77
-
78
- if (arg === "--clear") {
79
- const config = loadUserConfig();
80
- delete config.locale;
81
- saveUserConfig(config);
82
- ctx.ui.notify("Default locale cleared (now uses: en).", "info");
83
- return;
84
- }
85
-
86
- // Set locale
87
- const locale = arg.toLowerCase();
88
- const VALID_LOCALES = [
89
- "en",
90
- "de",
91
- "fr",
92
- "es",
93
- "it",
94
- "pt",
95
- "nl",
96
- "pl",
97
- "ru",
98
- "ja",
99
- "ko",
100
- "zh",
101
- "ar",
102
- "hi",
103
- "tr",
104
- "sv",
105
- "da",
106
- "no",
107
- "fi",
108
- "cs",
109
- "hu",
110
- "ro",
111
- "el",
112
- ];
113
-
114
- if (!VALID_LOCALES.includes(locale)) {
115
- ctx.ui.notify(
116
- `Invalid locale "${locale}". Valid: ${VALID_LOCALES.join(", ")}`,
117
- "error",
118
- );
119
- return;
120
- }
121
-
122
- const config = loadUserConfig();
123
- config.locale = locale;
124
- saveUserConfig(config);
125
- ctx.ui.notify(`Default locale set to: ${locale}`, "info");
126
- },
127
- });
128
- }
129
-
130
- const USER_CONFIG_DIR = join(homedir(), ".config", "greedysearch");
131
- const USER_CONFIG_FILE = join(USER_CONFIG_DIR, "config.json");
132
-
133
- async function runChromeCommand(
134
- args: string[],
135
- ctx: any,
136
- successMessage?: string,
137
- ): Promise<void> {
138
- const visibleBin = join(__dir, "bin", "visible.mjs");
139
- const { code, output } = await new Promise<{
140
- code: number | null;
141
- output: string;
142
- }>((resolve) => {
143
- const proc = spawn(nodeRuntimeCommand(), [visibleBin, ...args], {
144
- stdio: ["ignore", "pipe", "pipe"],
145
- env: { ...process.env, GREEDY_SEARCH_VISIBLE: "1" },
146
- });
147
- let output = "";
148
- proc.stdout.on("data", (d: Buffer) => (output += d.toString()));
149
- proc.stderr.on("data", (d: Buffer) => (output += d.toString()));
150
- proc.on("close", (code: number | null) => resolve({ code, output }));
151
- });
152
-
153
- if (code === 0) {
154
- ctx.ui.notify((successMessage || output.trim() || "Done.").trim(), "info");
155
- } else {
156
- ctx.ui.notify(
157
- output.trim() || `GreedySearch Chrome command failed (${code})`,
158
- "error",
159
- );
160
- }
161
- }
162
-
163
- function loadUserConfig(): Record<string, string> {
164
- try {
165
- if (existsSync(USER_CONFIG_FILE)) {
166
- return JSON.parse(readFileSync(USER_CONFIG_FILE, "utf8"));
167
- }
168
- } catch {
169
- // Ignore parse errors
170
- }
171
- return {};
172
- }
173
-
174
- function saveUserConfig(config: Record<string, string>): void {
175
- mkdirSync(USER_CONFIG_DIR, { recursive: true });
176
- writeFileSync(USER_CONFIG_FILE, JSON.stringify(config, null, 2), "utf8");
177
- }
@@ -1,163 +0,0 @@
1
- /**
2
- * Search results formatters
3
- * Extracted from index.ts
4
- */
5
-
6
- import { formatEngineName } from "../utils/helpers.js";
7
- import { renderSynthesis } from "./synthesis.js";
8
-
9
- /**
10
- * Format search results based on engine type
11
- */
12
- export function formatResults(
13
- engine: string,
14
- data: Record<string, unknown>,
15
- ): string {
16
- const lines: string[] = [];
17
-
18
- if (engine === "all") {
19
- return formatAllEnginesResult(data, lines);
20
- }
21
-
22
- return formatSingleEngineResult(data, lines);
23
- }
24
-
25
- /**
26
- * Format multi-engine results with synthesis
27
- */
28
- function formatAllEnginesResult(
29
- data: Record<string, unknown>,
30
- lines: string[],
31
- ): string {
32
- const synthesis = data._synthesis as Record<string, unknown> | undefined;
33
- const dedupedSources = data._sources as
34
- | Array<Record<string, unknown>>
35
- | undefined;
36
- const needsHuman = data._needsHumanVerification as
37
- | Record<string, unknown>
38
- | undefined;
39
- const research = data._research as Record<string, unknown> | undefined;
40
-
41
- if (needsHuman) {
42
- const engines = Array.isArray(needsHuman.engines)
43
- ? needsHuman.engines.join(", ")
44
- : "one or more engines";
45
- lines.push("## Manual verification required");
46
- lines.push(
47
- String(
48
- needsHuman.message ||
49
- "Visible Chrome is open. Solve the verification challenge, then rerun the same search.",
50
- ),
51
- );
52
- lines.push(`Engines: ${engines}`);
53
- lines.push("");
54
- }
55
-
56
- // If we have a synthesis answer, render it
57
- if (synthesis?.answer) {
58
- if (research?.mode === "iterative") renderResearchHeader(lines, research);
59
- renderSynthesis(lines, synthesis, dedupedSources || [], 6);
60
- const synthesizedBy = String(
61
- synthesis.synthesizedBy || "configured synthesizer",
62
- );
63
- lines.push(
64
- research?.mode === "iterative"
65
- ? "*Research mode: iterative planning, source fetching, citation audit, and bundle output*\n"
66
- : `*Synthesized by ${synthesizedBy} from multi-engine results and fetched sources*\n`,
67
- );
68
- return lines.join("\n").trim();
69
- }
70
-
71
- // Fallback: render individual engine results
72
- for (const [eng, result] of Object.entries(data)) {
73
- if (eng.startsWith("_")) continue;
74
- lines.push(`\n## ${formatEngineName(eng)}`);
75
- formatEngineResult(result as Record<string, unknown>, lines, 3);
76
- }
77
-
78
- return lines.join("\n").trim();
79
- }
80
-
81
- function renderResearchHeader(
82
- lines: string[],
83
- research: Record<string, unknown>,
84
- ): void {
85
- const floor = research.floor as Record<string, unknown> | undefined;
86
- const metrics = floor?.metrics as Record<string, unknown> | undefined;
87
- const bundle = research.bundle as Record<string, unknown> | undefined;
88
- const manifest = research.manifest as Record<string, unknown> | undefined;
89
- lines.push("## Research Run");
90
- lines.push(
91
- `- Status: ${floor?.floorMet ? "floor met" : "partial / floor unmet"}`,
92
- );
93
- if (manifest?.terminationReason)
94
- lines.push(`- Stop reason: ${String(manifest.terminationReason)}`);
95
- if (metrics) {
96
- lines.push(
97
- `- Evidence: ${metrics.fetchedOk || 0} fetched sources, ${metrics.primarySources || 0} primary/official, ${metrics.claims || 0} claims, ${metrics.cited || 0} citations`,
98
- );
99
- lines.push(
100
- `- Questions: ${metrics.closedQuestions || 0}/${metrics.totalQuestions || 0} closed${metrics.openQuestions ? `, ${metrics.openQuestions} open` : ""}`,
101
- );
102
- }
103
- if (bundle?.dir) lines.push(`- Bundle: ${String(bundle.dir)}`);
104
- lines.push("");
105
- }
106
-
107
- /**
108
- * Format single engine result
109
- */
110
- function formatSingleEngineResult(
111
- data: Record<string, unknown>,
112
- lines: string[],
113
- ): string {
114
- const needsHuman = data._needsHumanVerification as
115
- | Record<string, unknown>
116
- | undefined;
117
- if (needsHuman) {
118
- const engines = Array.isArray(needsHuman.engines)
119
- ? needsHuman.engines.join(", ")
120
- : "this engine";
121
- lines.push("## Manual verification required");
122
- lines.push(
123
- String(
124
- needsHuman.message ||
125
- "Visible Chrome is open. Solve the verification challenge, then rerun the same search.",
126
- ),
127
- );
128
- lines.push(`Engines: ${engines}`);
129
- lines.push("");
130
- }
131
- formatEngineResult(data, lines, 5);
132
- return lines.join("\n").trim();
133
- }
134
-
135
- /**
136
- * Format a single engine's result (answer + sources)
137
- */
138
- function formatEngineResult(
139
- data: Record<string, unknown>,
140
- lines: string[],
141
- maxSources: number,
142
- ): void {
143
- if (data.error) {
144
- lines.push(`Error: ${data.error}`);
145
- return;
146
- }
147
-
148
- if (data.answer) {
149
- lines.push(String(data.answer));
150
- }
151
-
152
- const sources = data.sources as Array<Record<string, string>> | undefined;
153
- if (Array.isArray(sources) && sources.length > 0) {
154
- lines.push("\nSources:");
155
- for (const s of sources.slice(0, maxSources)) {
156
- lines.push(`- [${s.title || s.url}](${s.url})`);
157
- }
158
- }
159
- }
160
-
161
- /**
162
- * Format deep research results with confidence metrics
163
- */
@@ -1,116 +0,0 @@
1
- /**
2
- * Source formatting utilities
3
- * Extracted from index.ts
4
- */
5
-
6
- import { formatEngineName, humanizeSourceType } from "../utils/helpers.js";
7
-
8
- /**
9
- * Get source URL from various possible fields
10
- */
11
- export function sourceUrl(source: Record<string, unknown>): string {
12
- return String(source.displayUrl || source.canonicalUrl || source.url || "");
13
- }
14
-
15
- /**
16
- * Get source label/title from various possible fields
17
- */
18
- export function sourceLabel(source: Record<string, unknown>): string {
19
- return String(
20
- source.title || source.domain || sourceUrl(source) || "Untitled source",
21
- );
22
- }
23
-
24
- /**
25
- * Calculate consensus score (engine count)
26
- */
27
- export function sourceConsensus(source: Record<string, unknown>): number {
28
- if (typeof source.engineCount === "number") return source.engineCount;
29
- const engines = Array.isArray(source.engines)
30
- ? (source.engines as string[])
31
- : [];
32
- return engines.length;
33
- }
34
-
35
- /**
36
- * Build a map of sources by ID for quick lookup
37
- */
38
- export function getSourceMap(
39
- sources: Array<Record<string, unknown>>,
40
- ): Map<string, Record<string, unknown>> {
41
- return new Map(
42
- sources
43
- .map((source) => [String(source.id || ""), source] as const)
44
- .filter(([id]) => id),
45
- );
46
- }
47
-
48
- /**
49
- * Format a single source line for display
50
- */
51
- export function formatSourceLine(source: Record<string, unknown>): string {
52
- const id = String(source.id || "?");
53
- const url = sourceUrl(source);
54
- const title = sourceLabel(source);
55
- const domain = String(source.domain || "");
56
- const engines = Array.isArray(source.engines)
57
- ? (source.engines as string[])
58
- : [];
59
- const consensus = sourceConsensus(source);
60
- const typeLabel = humanizeSourceType(String(source.sourceType || ""));
61
- const fetch = source.fetch as Record<string, unknown> | undefined;
62
- const fetchStatus = fetch?.ok
63
- ? `fetched ${fetch.status || 200}`
64
- : fetch?.attempted
65
- ? "fetch failed"
66
- : "";
67
-
68
- const pieces = [
69
- `${id} - [${title}](${url})`,
70
- domain,
71
- typeLabel,
72
- engines.length
73
- ? `cited by ${engines.map(formatEngineName).join(", ")} (${consensus}/3)`
74
- : `${consensus}/3`,
75
- fetchStatus,
76
- ].filter(Boolean);
77
-
78
- return `- ${pieces.join(" - ")}`;
79
- }
80
-
81
- /**
82
- * Render source evidence (snippet, last modified, errors)
83
- */
84
- export function renderSourceEvidence(
85
- lines: string[],
86
- source: Record<string, unknown>,
87
- ): void {
88
- const fetch = source.fetch as Record<string, unknown> | undefined;
89
- if (!fetch?.attempted) return;
90
-
91
- const snippet = String(fetch.snippet || "").trim();
92
- const lastModified = String(fetch.lastModified || "").trim();
93
-
94
- if (snippet) lines.push(` Evidence: ${snippet}`);
95
- if (lastModified) lines.push(` Last-Modified: ${lastModified}`);
96
- if (fetch.error) lines.push(` Fetch error: ${String(fetch.error)}`);
97
- }
98
-
99
- /**
100
- * Pick top sources, preferring recommended ones
101
- */
102
- export function pickSources(
103
- sources: Array<Record<string, unknown>>,
104
- recommendedIds: string[] = [],
105
- max = 6,
106
- ): Array<Record<string, unknown>> {
107
- if (!sources.length) return [];
108
-
109
- const sourceMap = getSourceMap(sources);
110
- const recommended = recommendedIds
111
- .map((id) => sourceMap.get(id))
112
- .filter((source): source is Record<string, unknown> => Boolean(source));
113
-
114
- if (recommended.length > 0) return recommended.slice(0, max);
115
- return sources.slice(0, max);
116
- }
@@ -1,87 +0,0 @@
1
- /**
2
- * Synthesis and research result formatters
3
- * Extracted from index.ts
4
- */
5
-
6
- import { formatAgreementLevel } from "../utils/helpers.js";
7
- import { formatSourceLine, pickSources } from "./sources.js";
8
-
9
- /**
10
- * Render synthesis data (answer, consensus, differences, caveats, claims, sources)
11
- */
12
- export function renderSynthesis(
13
- lines: string[],
14
- synthesis: Record<string, unknown>,
15
- sources: Array<Record<string, unknown>>,
16
- maxSources = 6,
17
- ): void {
18
- // Answer section
19
- if (synthesis.answer) {
20
- lines.push("## Answer");
21
- lines.push(String(synthesis.answer));
22
- lines.push("");
23
- }
24
-
25
- // Consensus section
26
- const agreement = synthesis.agreement as Record<string, unknown> | undefined;
27
- const agreementSummary = String(agreement?.summary || "").trim();
28
- const agreementLevel = String(agreement?.level || "").trim();
29
-
30
- if (agreementSummary || agreementLevel) {
31
- lines.push("## Consensus");
32
- lines.push(
33
- `- ${formatAgreementLevel(agreementLevel)}${agreementSummary ? ` - ${agreementSummary}` : ""}`,
34
- );
35
- lines.push("");
36
- }
37
-
38
- // Differences section
39
- const differences = Array.isArray(synthesis.differences)
40
- ? (synthesis.differences as string[])
41
- : [];
42
- if (differences.length > 0) {
43
- lines.push("## Where Engines Differ");
44
- for (const difference of differences) lines.push(`- ${difference}`);
45
- lines.push("");
46
- }
47
-
48
- // Caveats section
49
- const caveats = Array.isArray(synthesis.caveats)
50
- ? (synthesis.caveats as string[])
51
- : [];
52
- if (caveats.length > 0) {
53
- lines.push("## Caveats");
54
- for (const caveat of caveats) lines.push(`- ${caveat}`);
55
- lines.push("");
56
- }
57
-
58
- // Claims section
59
- const claims = Array.isArray(synthesis.claims)
60
- ? (synthesis.claims as Array<Record<string, unknown>>)
61
- : [];
62
- if (claims.length > 0) {
63
- lines.push("## Key Claims");
64
- for (const claim of claims) {
65
- const sourceIds = Array.isArray(claim.sourceIds)
66
- ? (claim.sourceIds as string[])
67
- : [];
68
- const support = String(claim.support || "moderate");
69
- lines.push(
70
- `- ${String(claim.claim || "")} [${support}${sourceIds.length ? `; ${sourceIds.join(", ")}` : ""}]`,
71
- );
72
- }
73
- lines.push("");
74
- }
75
-
76
- // Top sources section
77
- const recommendedIds = Array.isArray(synthesis.recommendedSources)
78
- ? (synthesis.recommendedSources as string[])
79
- : [];
80
- const topSources = pickSources(sources, recommendedIds, maxSources);
81
-
82
- if (topSources.length > 0) {
83
- lines.push("## Top Sources");
84
- for (const source of topSources) lines.push(formatSourceLine(source));
85
- lines.push("");
86
- }
87
- }