@duckmind/dm-windows-x64 0.62.1 → 0.62.9

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 (93) hide show
  1. package/dm.exe +0 -0
  2. package/extensions/.dm-extensions.json +43 -183
  3. package/extensions/dm-context/src/context.js +1 -2
  4. package/extensions/dm-context/src/index.js +1 -2
  5. package/extensions/{greedysearch-dm/bin/cdp.mjs → dm-cua/bin/browser-cdp.mjs} +3 -3
  6. package/extensions/dm-cua/bin/browser-cua.mjs +1 -1
  7. package/extensions/{greedysearch-dm/bin/launch.mjs → dm-cua/bin/browser-launch.mjs} +12 -11
  8. package/extensions/dm-cua/index.js +1 -1
  9. package/extensions/dm-cua/src/browser-cua-lib.mjs +17 -12
  10. package/extensions/{greedysearch-dm/src/search → dm-cua/src/browser-helpers}/constants.mjs +11 -11
  11. package/extensions/{greedysearch-dm/src/utils → dm-cua/src/browser-helpers}/node-runtime.mjs +1 -1
  12. package/extensions/{greedysearch-dm/src/search → dm-cua/src/browser-helpers}/port-pid.mjs +1 -1
  13. package/extensions/dm-ponytail/extensions/ponytail.mjs +186 -0
  14. package/extensions/dm-ponytail/hooks/claude-codex-hooks.json +41 -0
  15. package/extensions/dm-ponytail/hooks/copilot-hooks.json +21 -0
  16. package/extensions/dm-ponytail/hooks/ponytail-activate.js +59 -0
  17. package/extensions/dm-ponytail/hooks/ponytail-config.js +116 -0
  18. package/extensions/dm-ponytail/hooks/ponytail-instructions.js +81 -0
  19. package/extensions/dm-ponytail/hooks/ponytail-mode-tracker.js +96 -0
  20. package/extensions/dm-ponytail/hooks/ponytail-runtime.js +79 -0
  21. package/extensions/dm-ponytail/hooks/ponytail-statusline.ps1 +24 -0
  22. package/extensions/dm-ponytail/hooks/ponytail-statusline.sh +18 -0
  23. package/extensions/dm-ponytail/hooks/ponytail-subagent.js +50 -0
  24. package/extensions/dm-ponytail/hooks/qoder-hooks.json +26 -0
  25. package/extensions/dm-ponytail/package.json +19 -0
  26. package/extensions/dm-ponytail/pi-extension/index.js +186 -0
  27. package/extensions/dm-ponytail/pi-extension/package.json +8 -0
  28. package/extensions/dm-ponytail/skills/ponytail/SKILL.md +120 -0
  29. package/extensions/dm-ponytail/skills/ponytail-audit/SKILL.md +41 -0
  30. package/extensions/dm-ponytail/skills/ponytail-debt/SKILL.md +44 -0
  31. package/extensions/dm-ponytail/skills/ponytail-gain/SKILL.md +50 -0
  32. package/extensions/dm-ponytail/skills/ponytail-help/SKILL.md +71 -0
  33. package/extensions/dm-ponytail/skills/ponytail-review/SKILL.md +57 -0
  34. package/package.json +2 -6
  35. package/extensions/dm-caveman/extensions/caveman.js +0 -300
  36. package/extensions/dm-caveman/package.json +0 -20
  37. package/extensions/dm-goal/package.json +0 -23
  38. package/extensions/dm-goal/src/goal.js +0 -914
  39. package/extensions/greedysearch-dm/bin/cdp-greedy.mjs +0 -40
  40. package/extensions/greedysearch-dm/bin/cdp-headless.mjs +0 -5
  41. package/extensions/greedysearch-dm/bin/cdp-visible.mjs +0 -5
  42. package/extensions/greedysearch-dm/bin/gschrome.mjs +0 -30
  43. package/extensions/greedysearch-dm/bin/kill-visible.mjs +0 -7
  44. package/extensions/greedysearch-dm/bin/launch-visible.mjs +0 -13
  45. package/extensions/greedysearch-dm/bin/mcp.mjs +0 -400
  46. package/extensions/greedysearch-dm/bin/search.mjs +0 -635
  47. package/extensions/greedysearch-dm/bin/visible.mjs +0 -22
  48. package/extensions/greedysearch-dm/extractors/bing-copilot.mjs +0 -344
  49. package/extensions/greedysearch-dm/extractors/chatgpt.mjs +0 -354
  50. package/extensions/greedysearch-dm/extractors/common.mjs +0 -794
  51. package/extensions/greedysearch-dm/extractors/consensus.mjs +0 -527
  52. package/extensions/greedysearch-dm/extractors/consent.mjs +0 -449
  53. package/extensions/greedysearch-dm/extractors/gemini.mjs +0 -291
  54. package/extensions/greedysearch-dm/extractors/google-ai.mjs +0 -86
  55. package/extensions/greedysearch-dm/extractors/logically.mjs +0 -589
  56. package/extensions/greedysearch-dm/extractors/perplexity.mjs +0 -370
  57. package/extensions/greedysearch-dm/extractors/selectors.mjs +0 -32
  58. package/extensions/greedysearch-dm/extractors/semantic-scholar.mjs +0 -199
  59. package/extensions/greedysearch-dm/index.js +0 -123
  60. package/extensions/greedysearch-dm/package.json +0 -27
  61. package/extensions/greedysearch-dm/skills/greedy-search/skill.md +0 -18
  62. package/extensions/greedysearch-dm/src/fetcher.mjs +0 -577
  63. package/extensions/greedysearch-dm/src/formatters/results.js +0 -95
  64. package/extensions/greedysearch-dm/src/formatters/sources.js +0 -57
  65. package/extensions/greedysearch-dm/src/formatters/synthesis.js +0 -49
  66. package/extensions/greedysearch-dm/src/github.mjs +0 -228
  67. package/extensions/greedysearch-dm/src/reddit.mjs +0 -154
  68. package/extensions/greedysearch-dm/src/search/browser-lifecycle.mjs +0 -340
  69. package/extensions/greedysearch-dm/src/search/challenge-detect.mjs +0 -156
  70. package/extensions/greedysearch-dm/src/search/chrome.mjs +0 -510
  71. package/extensions/greedysearch-dm/src/search/defaults.mjs +0 -10
  72. package/extensions/greedysearch-dm/src/search/engines.mjs +0 -79
  73. package/extensions/greedysearch-dm/src/search/fetch-source.mjs +0 -470
  74. package/extensions/greedysearch-dm/src/search/file-sources.mjs +0 -31
  75. package/extensions/greedysearch-dm/src/search/output.mjs +0 -51
  76. package/extensions/greedysearch-dm/src/search/paths.mjs +0 -48
  77. package/extensions/greedysearch-dm/src/search/pdf.mjs +0 -64
  78. package/extensions/greedysearch-dm/src/search/progress.mjs +0 -109
  79. package/extensions/greedysearch-dm/src/search/query.mjs +0 -21
  80. package/extensions/greedysearch-dm/src/search/recovery.mjs +0 -49
  81. package/extensions/greedysearch-dm/src/search/research.mjs +0 -2255
  82. package/extensions/greedysearch-dm/src/search/scale-aware.mjs +0 -61
  83. package/extensions/greedysearch-dm/src/search/simple-research.mjs +0 -418
  84. package/extensions/greedysearch-dm/src/search/sources.mjs +0 -412
  85. package/extensions/greedysearch-dm/src/search/synthesis-runner.mjs +0 -127
  86. package/extensions/greedysearch-dm/src/search/synthesis.mjs +0 -202
  87. package/extensions/greedysearch-dm/src/tools/greedy-search-handler.js +0 -209
  88. package/extensions/greedysearch-dm/src/tools/shared.js +0 -226
  89. package/extensions/greedysearch-dm/src/types.js +0 -0
  90. package/extensions/greedysearch-dm/src/utils/content.mjs +0 -38
  91. package/extensions/greedysearch-dm/src/utils/helpers.js +0 -22
  92. /package/extensions/{greedysearch-dm/src/search → dm-cua/src/browser-helpers}/minimize.mjs +0 -0
  93. /package/extensions/{greedysearch-dm/src/utils → dm-cua/src/browser-helpers}/system-cmds.mjs +0 -0
package/dm.exe CHANGED
Binary file
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "status": "ok",
3
- "prepared_at": "2026-08-30T19:28:31.595264+00:00",
3
+ "prepared_at": "2026-08-31T07:37:40.698156+00:00",
4
4
  "managed_entries": [
5
5
  {
6
6
  "id": "dm-context",
@@ -17,29 +17,19 @@
17
17
  "target_dir": "extensions/dm-9router-ext",
18
18
  "bundle_mode": "source-package-with-runtime-deps"
19
19
  },
20
- {
21
- "id": "greedysearch-dm",
22
- "target_dir": "extensions/greedysearch-dm",
23
- "bundle_mode": "source-package-with-runtime-deps"
24
- },
25
20
  {
26
21
  "id": "dm-usage",
27
22
  "target_dir": "extensions/dm-usage",
28
23
  "bundle_mode": "source-package"
29
24
  },
30
- {
31
- "id": "dm-goal",
32
- "target_dir": "extensions/dm-goal",
33
- "bundle_mode": "source-package"
34
- },
35
25
  {
36
26
  "id": "dm-cliproxy",
37
27
  "target_dir": "extensions/dm-cliproxy",
38
28
  "bundle_mode": "source-package-with-runtime-deps"
39
29
  },
40
30
  {
41
- "id": "dm-caveman",
42
- "target_dir": "extensions/dm-caveman",
31
+ "id": "dm-ponytail",
32
+ "target_dir": "extensions/dm-ponytail",
43
33
  "bundle_mode": "source-package"
44
34
  },
45
35
  {
@@ -87,8 +77,8 @@
87
77
  "src/utils.js"
88
78
  ],
89
79
  "file_count": 3,
90
- "before_bytes": 26171,
91
- "after_bytes": 21047,
80
+ "before_bytes": 25960,
81
+ "after_bytes": 20884,
92
82
  "runtime_specifier_rewrites": 0,
93
83
  "runtime_filename_rewrites": 3,
94
84
  "declaration_files_removed": 0
@@ -422,109 +412,6 @@
422
412
  "declaration_files_removed": 0
423
413
  }
424
414
  },
425
- {
426
- "id": "greedysearch-dm",
427
- "staged_dir": "extensions/greedysearch-dm",
428
- "bundle_mode": "source-package-with-runtime-deps",
429
- "dependencies_installed": false,
430
- "dependency_mode": "platform-package-dependency",
431
- "dependencies_declared": [
432
- "@duckmind/dm-coding-agent",
433
- "@mozilla/readability",
434
- "@sinclair/typebox",
435
- "jsdom",
436
- "pdf-parse",
437
- "turndown"
438
- ],
439
- "dependency_patches": [
440
- "dm.extensions ts->js",
441
- "drop-dependencies",
442
- "drop-devDependencies",
443
- "drop-peerDependencies",
444
- "drop-scripts",
445
- "drop-files"
446
- ],
447
- "stripped_documentation": [
448
- "docs/",
449
- "CHANGELOG.md",
450
- "LICENSE",
451
- "README.md"
452
- ],
453
- "javascript_compile": {
454
- "tool": "bun build --no-bundle",
455
- "mode": "module-preserving-transpile",
456
- "files": [
457
- "bin/cdp-greedy.mjs",
458
- "bin/cdp-headless.mjs",
459
- "bin/cdp-visible.mjs",
460
- "bin/cdp.mjs",
461
- "bin/gschrome.mjs",
462
- "bin/kill-visible.mjs",
463
- "bin/launch-visible.mjs",
464
- "bin/launch.mjs",
465
- "bin/mcp.mjs",
466
- "bin/search.mjs",
467
- "bin/visible.mjs",
468
- "extractors/bing-copilot.mjs",
469
- "extractors/chatgpt.mjs",
470
- "extractors/common.mjs",
471
- "extractors/consensus.mjs",
472
- "extractors/consent.mjs",
473
- "extractors/gemini.mjs",
474
- "extractors/google-ai.mjs",
475
- "extractors/logically.mjs",
476
- "extractors/perplexity.mjs",
477
- "extractors/selectors.mjs",
478
- "extractors/semantic-scholar.mjs",
479
- "index.js",
480
- "results/test_1785727384847/_gh_blob_test.mjs",
481
- "results/test_1785727384847/_gh_fetcher_test.mjs",
482
- "results/test_1785727384847/_synth_chatgpt.mjs",
483
- "results/test_1785727384847/_synth_gemini.mjs",
484
- "src/fetcher.mjs",
485
- "src/formatters/results.js",
486
- "src/formatters/sources.js",
487
- "src/formatters/synthesis.js",
488
- "src/github.mjs",
489
- "src/reddit.mjs",
490
- "src/search/browser-lifecycle.mjs",
491
- "src/search/challenge-detect.mjs",
492
- "src/search/chrome.mjs",
493
- "src/search/constants.mjs",
494
- "src/search/defaults.mjs",
495
- "src/search/engines.mjs",
496
- "src/search/fetch-source.mjs",
497
- "src/search/file-sources.mjs",
498
- "src/search/minimize.mjs",
499
- "src/search/output.mjs",
500
- "src/search/paths.mjs",
501
- "src/search/pdf.mjs",
502
- "src/search/port-pid.mjs",
503
- "src/search/progress.mjs",
504
- "src/search/query.mjs",
505
- "src/search/recovery.mjs",
506
- "src/search/research.mjs",
507
- "src/search/scale-aware.mjs",
508
- "src/search/simple-research.mjs",
509
- "src/search/sources.mjs",
510
- "src/search/synthesis-runner.mjs",
511
- "src/search/synthesis.mjs",
512
- "src/tools/greedy-search-handler.js",
513
- "src/tools/shared.js",
514
- "src/types.js",
515
- "src/utils/content.mjs",
516
- "src/utils/helpers.js",
517
- "src/utils/node-runtime.mjs",
518
- "src/utils/system-cmds.mjs"
519
- ],
520
- "file_count": 62,
521
- "before_bytes": 613697,
522
- "after_bytes": 496359,
523
- "runtime_specifier_rewrites": 0,
524
- "runtime_filename_rewrites": 8,
525
- "declaration_files_removed": 0
526
- }
527
- },
528
415
  {
529
416
  "id": "dm-usage",
530
417
  "staged_dir": "extensions/dm-usage",
@@ -561,45 +448,6 @@
561
448
  "declaration_files_removed": 0
562
449
  }
563
450
  },
564
- {
565
- "id": "dm-goal",
566
- "staged_dir": "extensions/dm-goal",
567
- "bundle_mode": "source-package",
568
- "dependencies_installed": false,
569
- "dependency_mode": "platform-package-dependency",
570
- "dependencies_declared": [
571
- "@duckmind/dm-ai",
572
- "@duckmind/dm-coding-agent",
573
- "typebox"
574
- ],
575
- "dependency_patches": [
576
- "dm.extensions ts->js",
577
- "main ts->js",
578
- "drop-dependencies",
579
- "drop-devDependencies",
580
- "drop-peerDependencies",
581
- "drop-scripts",
582
- "drop-files"
583
- ],
584
- "stripped_documentation": [
585
- "CHANGELOG.md",
586
- "LICENSE",
587
- "README.md"
588
- ],
589
- "javascript_compile": {
590
- "tool": "bun build --no-bundle",
591
- "mode": "module-preserving-transpile",
592
- "files": [
593
- "src/goal.js"
594
- ],
595
- "file_count": 1,
596
- "before_bytes": 36860,
597
- "after_bytes": 33331,
598
- "runtime_specifier_rewrites": 0,
599
- "runtime_filename_rewrites": 1,
600
- "declaration_files_removed": 0
601
- }
602
- },
603
451
  {
604
452
  "id": "dm-cliproxy",
605
453
  "staged_dir": "extensions/dm-cliproxy",
@@ -659,7 +507,7 @@
659
507
  "src/usage-shared-cache.js"
660
508
  ],
661
509
  "file_count": 31,
662
- "before_bytes": 136451,
510
+ "before_bytes": 136427,
663
511
  "after_bytes": 98105,
664
512
  "runtime_specifier_rewrites": 20,
665
513
  "runtime_filename_rewrites": 29,
@@ -667,17 +515,15 @@
667
515
  }
668
516
  },
669
517
  {
670
- "id": "dm-caveman",
671
- "staged_dir": "extensions/dm-caveman",
518
+ "id": "dm-ponytail",
519
+ "staged_dir": "extensions/dm-ponytail",
672
520
  "bundle_mode": "source-package",
673
521
  "dependencies_installed": false,
674
522
  "dependency_mode": "platform-package-dependency",
675
523
  "dependencies_declared": [
676
- "@duckmind/dm-coding-agent",
677
- "@duckmind/dm-tui"
524
+ "@duckmind/dm-coding-agent"
678
525
  ],
679
526
  "dependency_patches": [
680
- "dm.extensions ts->js",
681
527
  "drop-devDependencies",
682
528
  "drop-peerDependencies",
683
529
  "drop-files"
@@ -690,13 +536,20 @@
690
536
  "tool": "bun build --no-bundle",
691
537
  "mode": "module-preserving-transpile",
692
538
  "files": [
693
- "extensions/caveman.js"
539
+ "extensions/ponytail.mjs",
540
+ "hooks/ponytail-activate.js",
541
+ "hooks/ponytail-config.js",
542
+ "hooks/ponytail-instructions.js",
543
+ "hooks/ponytail-mode-tracker.js",
544
+ "hooks/ponytail-runtime.js",
545
+ "hooks/ponytail-subagent.js",
546
+ "pi-extension/index.js"
694
547
  ],
695
- "file_count": 1,
696
- "before_bytes": 14030,
697
- "after_bytes": 11757,
548
+ "file_count": 8,
549
+ "before_bytes": 40920,
550
+ "after_bytes": 31348,
698
551
  "runtime_specifier_rewrites": 0,
699
- "runtime_filename_rewrites": 1,
552
+ "runtime_filename_rewrites": 0,
700
553
  "declaration_files_removed": 0
701
554
  }
702
555
  },
@@ -745,7 +598,11 @@
745
598
  "staged_dir": "extensions/dm-cua",
746
599
  "bundle_mode": "local-source-package",
747
600
  "dependencies_installed": false,
748
- "dependency_mode": "none",
601
+ "dependency_mode": "platform-package-dependency",
602
+ "dependencies_declared": [
603
+ "@duckmind/dm-coding-agent",
604
+ "@sinclair/typebox"
605
+ ],
749
606
  "dependency_patches": [
750
607
  "drop-devDependencies",
751
608
  "drop-peerDependencies",
@@ -758,14 +615,21 @@
758
615
  "tool": "bun build --no-bundle",
759
616
  "mode": "module-preserving-transpile",
760
617
  "files": [
618
+ "bin/browser-cdp.mjs",
761
619
  "bin/browser-cua.mjs",
620
+ "bin/browser-launch.mjs",
762
621
  "index.js",
763
622
  "src/browser-cua-lib.mjs",
623
+ "src/browser-helpers/constants.mjs",
624
+ "src/browser-helpers/minimize.mjs",
625
+ "src/browser-helpers/node-runtime.mjs",
626
+ "src/browser-helpers/port-pid.mjs",
627
+ "src/browser-helpers/system-cmds.mjs",
764
628
  "src/browser-install.mjs"
765
629
  ],
766
- "file_count": 4,
767
- "before_bytes": 38392,
768
- "after_bytes": 38745,
630
+ "file_count": 11,
631
+ "before_bytes": 98273,
632
+ "after_bytes": 90409,
769
633
  "runtime_specifier_rewrites": 0,
770
634
  "runtime_filename_rewrites": 0,
771
635
  "declaration_files_removed": 0
@@ -776,7 +640,11 @@
776
640
  "staged_dir": "extensions/dm-image2",
777
641
  "bundle_mode": "local-source-package",
778
642
  "dependencies_installed": false,
779
- "dependency_mode": "none",
643
+ "dependency_mode": "platform-package-dependency",
644
+ "dependencies_declared": [
645
+ "@duckmind/dm-coding-agent",
646
+ "@sinclair/typebox"
647
+ ],
780
648
  "dependency_patches": [
781
649
  "drop-devDependencies",
782
650
  "drop-peerDependencies",
@@ -806,24 +674,16 @@
806
674
  "jiti": "2.7.0",
807
675
  "typebox": "^1.1.34",
808
676
  "yaml": "2.8.3",
809
- "@mozilla/readability": "^0.6.0",
810
- "@sinclair/typebox": "^0.34.48",
811
- "jsdom": "^29.1.1",
812
- "pdf-parse": "^2.4.5",
813
- "turndown": "^7.1.2"
677
+ "@sinclair/typebox": "^0.34.48"
814
678
  },
815
679
  "runtime_loader": {
816
680
  "status": "verified",
817
- "entries": 12,
681
+ "entries": 10,
818
682
  "loader": "dm-coding-agent",
819
683
  "platform_dependencies": [
820
- "@mozilla/readability",
821
684
  "@sinclair/typebox",
822
685
  "acorn",
823
686
  "jiti",
824
- "jsdom",
825
- "pdf-parse",
826
- "turndown",
827
687
  "typebox",
828
688
  "yaml"
829
689
  ]
@@ -65,7 +65,6 @@ export default function context_default(pi) {
65
65
  ctx.ui.notify("Context usage info not available.", "warning");
66
66
  return;
67
67
  }
68
- const usagePercent = usage.percent;
69
68
  const totalRaw = systemTokensRaw + toolDefTokensRaw + msgTokensRaw + toolUseTokensRaw + toolResultTokensRaw;
70
69
  const ratio = totalRaw > 0 ? totalActual / totalRaw : 1;
71
70
  const systemTokens = Math.round(systemTokensRaw * ratio);
@@ -114,7 +113,7 @@ export default function context_default(pi) {
114
113
  }
115
114
  gridLines.push(rowStr.trimEnd());
116
115
  }
117
- const totalUsageTitle = `${theme.fg("text", theme.bold("Total Usage".padEnd(16)))} ${theme.fg("text", theme.bold(formatTokens(totalActual).padStart(7)))} ${theme.fg("text", theme.bold(`(${usagePercent.toFixed(1).padStart(5)}%)`))}`;
116
+ const totalUsageTitle = `${theme.fg("text", theme.bold("Total Usage".padEnd(16)))} ${theme.fg("text", theme.bold(formatTokens(totalActual).padStart(7)))} ${theme.fg("text", theme.bold(`(${usage.percent.toFixed(1).padStart(5)}%)`))}`;
118
117
  const catDetailLines = categories.map((cat) => {
119
118
  const labelStr = cat.label.padEnd(14);
120
119
  const valStr = formatTokens(cat.value).padStart(7);
@@ -245,8 +245,7 @@ export default function src_default(pi) {
245
245
  const usage = await ctx.getContextUsage();
246
246
  let usageStr = "Unknown";
247
247
  if (usage) {
248
- const percent = usage.percent;
249
- usageStr = percent == null ? `${formatTokens(usage.tokens)}/${formatTokens(usage.contextWindow)}` : `${percent.toFixed(1)}% (${formatTokens(usage.tokens)}/${formatTokens(usage.contextWindow)})`;
248
+ usageStr = `${usage.percent.toFixed(1)}% (${formatTokens(usage.tokens)}/${formatTokens(usage.contextWindow)})`;
250
249
  }
251
250
  let stepsSinceTag = 0;
252
251
  let nearestTagName = "None";
@@ -1,6 +1,6 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { createHash } from "node:crypto";
3
- import { nodeRuntimeCommand } from "../src/utils/node-runtime.mjs";
3
+ import { nodeRuntimeCommand } from "../src/browser-helpers/node-runtime.mjs";
4
4
  import {
5
5
  existsSync,
6
6
  mkdirSync,
@@ -15,7 +15,7 @@ import { join } from "node:path";
15
15
  import {
16
16
  GREEDY_CDP_SOCKET_DIR,
17
17
  PAGES_CACHE
18
- } from "../src/search/constants.mjs";
18
+ } from "../src/browser-helpers/constants.mjs";
19
19
  const TIMEOUT = 90000;
20
20
  const NAVIGATION_TIMEOUT = 30000;
21
21
  const IDLE_TIMEOUT = 20 * 60 * 1000;
@@ -46,7 +46,7 @@ function getWsUrl() {
46
46
  `);
47
47
  return `ws://localhost:${lines[0]}${lines[1]}`;
48
48
  }
49
- throw new Error(`GreedySearch DevToolsActivePort not found at ${p}. Refusing to fall back to the main Chrome session.`);
49
+ throw new Error(`DM CUA DevToolsActivePort not found at ${p}. Refusing to fall back to the main Chrome session.`);
50
50
  }
51
51
  const portFile = getDevToolsActivePortPath();
52
52
  const lines = readFileSync(portFile, "utf8").trim().split(`
@@ -15,7 +15,7 @@ Usage:
15
15
  node browser-cua.mjs stop [--json]
16
16
 
17
17
  Notes:
18
- - This helper reuses DM's bundled greedysearch-dm CDP sidecar.
18
+ - This helper uses DM's bundled CUA CDP sidecar.
19
19
  - Fresh dedicated browser profiles auto-bootstrap a blank tab.
20
20
  - handoff opens the dedicated browser visibly for user-authorized login or
21
21
  verification. DM does not solve challenges or enter credentials for you.
@@ -9,16 +9,16 @@ import {
9
9
  } from "node:fs";
10
10
  import { platform, tmpdir } from "node:os";
11
11
  import { join } from "node:path";
12
- import { httpGet } from "../src/search/minimize.mjs";
12
+ import { httpGet } from "../src/browser-helpers/minimize.mjs";
13
13
  import {
14
14
  ACTIVE_PORT_FILE,
15
15
  CHROME_MODE_FILE,
16
16
  GREEDY_PID_FILE,
17
17
  GREEDY_PORT,
18
18
  GREEDY_PROFILE_DIR
19
- } from "../src/search/constants.mjs";
20
- import { findListeningProcessPid } from "../src/search/port-pid.mjs";
21
- import { resolveSystemCmd } from "../src/utils/system-cmds.mjs";
19
+ } from "../src/browser-helpers/constants.mjs";
20
+ import { findListeningProcessPid } from "../src/browser-helpers/port-pid.mjs";
21
+ import { resolveSystemCmd } from "../src/browser-helpers/system-cmds.mjs";
22
22
  const PORT = GREEDY_PORT;
23
23
  const PROFILE_DIR = GREEDY_PROFILE_DIR;
24
24
  const ACTIVE_PORT = ACTIVE_PORT_FILE;
@@ -41,7 +41,8 @@ function findChrome() {
41
41
  ];
42
42
  return candidates.find(existsSync) || null;
43
43
  }
44
- const isHeadless = () => process.env.GREEDY_SEARCH_VISIBLE !== "1";
44
+ const visibleMode = () => process.env.DM_CUA_VISIBLE ?? process.env.GREEDY_SEARCH_VISIBLE;
45
+ const isHeadless = () => visibleMode() !== "1";
45
46
  const BASE_CHROME_FLAGS = [
46
47
  `--remote-debugging-port=${PORT}`,
47
48
  "--disable-features=DevToolsPrivacyUI",
@@ -87,7 +88,7 @@ function buildChromeFlags(chromePath) {
87
88
  flags.push("about:blank");
88
89
  return flags;
89
90
  }
90
- const isVisible = () => process.env.GREEDY_SEARCH_VISIBLE === "1";
91
+ const isVisible = () => visibleMode() === "1";
91
92
  function isModeFileHeadless() {
92
93
  try {
93
94
  if (!existsSync(MODE_FILE))
@@ -170,7 +171,7 @@ function cleanupGhostChrome() {
170
171
  writeFileSync(PID_FILE, String(portPid), "utf8");
171
172
  return true;
172
173
  }
173
- console.error(`Browser/CDP port ${PORT} is owned by unverified pid ${portPid}; ` + "refusing to kill it. Set GREEDY_SEARCH_PORT to a free port.");
174
+ console.error(`Browser/CDP port ${PORT} is owned by unverified pid ${portPid}; ` + "refusing to kill it. Set DM_CUA_PORT to a free port.");
174
175
  return false;
175
176
  }
176
177
  async function writePortFile(timeoutMs = 15000) {
@@ -202,7 +203,7 @@ async function main() {
202
203
  const ok = killProcess(pid);
203
204
  console.log(ok ? `Stopped Chrome (pid ${pid}).` : `Failed to stop pid ${pid}.`);
204
205
  } else {
205
- console.log("GreedySearch Chrome is not running.");
206
+ console.log("DM CUA Chrome is not running.");
206
207
  }
207
208
  try {
208
209
  unlinkSync(PID_FILE);
@@ -226,7 +227,7 @@ async function main() {
226
227
  }
227
228
  const existing = isRunning();
228
229
  if (existing) {
229
- const isWantingVisible = process.env.GREEDY_SEARCH_VISIBLE === "1" && !process.argv.includes("--headless");
230
+ const isWantingVisible = visibleMode() === "1" && !process.argv.includes("--headless");
230
231
  if (isWantingVisible && isModeFileHeadless()) {
231
232
  console.log(`Headless Chrome running (pid ${existing}) but visible requested — killing...`);
232
233
  killProcess(existing);
@@ -239,7 +240,7 @@ async function main() {
239
240
  } else {
240
241
  const ready = await writePortFile(5000);
241
242
  if (ready) {
242
- console.log(`GreedySearch Chrome already running (pid ${existing}).`);
243
+ console.log(`DM CUA Chrome already running (pid ${existing}).`);
243
244
  return;
244
245
  }
245
246
  console.log(`Stale PID ${existing} — launching fresh.`);
@@ -254,7 +255,7 @@ async function main() {
254
255
  process.exit(1);
255
256
  }
256
257
  mkdirSync(PROFILE_DIR, { recursive: true });
257
- console.log(`Launching GreedySearch Chrome on port ${PORT}...`);
258
+ console.log(`Launching DM CUA Chrome on port ${PORT}...`);
258
259
  if (isHeadless()) {
259
260
  console.log("Headless mode — no window will be shown");
260
261
  } else if (!isVisible()) {
@@ -36,7 +36,7 @@ export default function registerDmCua(pi) {
36
36
  pi.on("session_start", async (_event, ctx) => {
37
37
  const { launchScript, cdpScript } = resolveBrowserHelperPaths();
38
38
  if (!existsSync(launchScript) || !existsSync(cdpScript)) {
39
- ctx.ui.notify("dm-cua: bundled browser helpers are missing. Rebuild DM so dm-cua and greedysearch-dm are staged together.", "warning");
39
+ ctx.ui.notify("dm-cua: bundled browser helpers are missing. Rebuild DM to restore them.", "warning");
40
40
  }
41
41
  });
42
42
  pi.registerTool({
@@ -119,14 +119,10 @@ async function ensureConfiguredBrowserSelectionUsable() {
119
119
  return browserSelectionPromise;
120
120
  }
121
121
  export function resolveBrowserHelperPaths() {
122
- const helperRoots = [
123
- resolve(__dirname, "..", "greedysearch-dm"),
124
- resolve(__dirname, "..", "..", "greedysearch-dm")
125
- ];
126
- const candidates = helperRoots.map((root) => ({
127
- launchScript: join(root, "bin", "launch.mjs"),
128
- cdpScript: join(root, "bin", "cdp.mjs")
129
- }));
122
+ const candidates = [{
123
+ launchScript: resolve(__dirname, "..", "bin", "browser-launch.mjs"),
124
+ cdpScript: resolve(__dirname, "..", "bin", "browser-cdp.mjs")
125
+ }];
130
126
  for (const candidate of candidates) {
131
127
  if (existsSync(candidate.launchScript) && existsSync(candidate.cdpScript)) {
132
128
  return candidate;
@@ -135,10 +131,16 @@ export function resolveBrowserHelperPaths() {
135
131
  return candidates[0];
136
132
  }
137
133
  export function resolveBrowserProcessEnv(config = BROWSER_CONFIG, env = process.env, { visible } = {}) {
138
- const visibleMode = visible === true ? "1" : visible === false ? "0" : env.GREEDY_SEARCH_VISIBLE ?? env.DM_CUA_VISIBLE ?? env.DM_BROWSER_CUA_VISIBLE;
134
+ const visibleMode = visible === true ? "1" : visible === false ? "0" : env.DM_CUA_VISIBLE ?? env.DM_BROWSER_CUA_VISIBLE ?? env.GREEDY_SEARCH_VISIBLE;
139
135
  return {
140
136
  ...env,
141
137
  ...config.browserExecutablePath ? { CHROME_PATH: config.browserExecutablePath } : {},
138
+ DM_CUA_BROWSER_LABEL: config.browserDisplayName,
139
+ DM_CUA_PORT: String(config.port),
140
+ DM_CUA_PROFILE_DIR: config.profileDir.replace(/\\/g, "/"),
141
+ DM_CUA_PID_FILE: config.pidFile.replace(/\\/g, "/"),
142
+ DM_CUA_MODE_FILE: config.modeFile.replace(/\\/g, "/"),
143
+ DM_CUA_ALLOW_PORT_CLEANUP: env.DM_CUA_ALLOW_PORT_CLEANUP ?? env.GREEDY_SEARCH_ALLOW_PORT_CLEANUP ?? "0",
142
144
  CDP_PROFILE_DIR: config.profileDir.replace(/\\/g, "/"),
143
145
  CDP_PAGES_CACHE: config.pagesCache.replace(/\\/g, "/"),
144
146
  CDP_SOCKET_DIR: config.socketDir.replace(/\\/g, "/"),
@@ -147,8 +149,11 @@ export function resolveBrowserProcessEnv(config = BROWSER_CONFIG, env = process.
147
149
  GREEDY_SEARCH_PROFILE_DIR: config.profileDir.replace(/\\/g, "/"),
148
150
  GREEDY_SEARCH_PID_FILE: config.pidFile.replace(/\\/g, "/"),
149
151
  GREEDY_SEARCH_MODE_FILE: config.modeFile.replace(/\\/g, "/"),
150
- GREEDY_SEARCH_ALLOW_PORT_CLEANUP: env.GREEDY_SEARCH_ALLOW_PORT_CLEANUP ?? "0",
151
- ...visibleMode === undefined ? {} : { GREEDY_SEARCH_VISIBLE: visibleMode }
152
+ GREEDY_SEARCH_ALLOW_PORT_CLEANUP: env.DM_CUA_ALLOW_PORT_CLEANUP ?? env.GREEDY_SEARCH_ALLOW_PORT_CLEANUP ?? "0",
153
+ ...visibleMode === undefined ? {} : {
154
+ DM_CUA_VISIBLE: visibleMode,
155
+ GREEDY_SEARCH_VISIBLE: visibleMode
156
+ }
152
157
  };
153
158
  }
154
159
  function browserEnv(options) {
@@ -288,7 +293,7 @@ function findPage(pages, prefix) {
288
293
  async function ensureBrowserHelpersExist() {
289
294
  const { launchScript, cdpScript } = resolveBrowserHelperPaths();
290
295
  if (!existsSync(launchScript) || !existsSync(cdpScript)) {
291
- throw new Error("Bundled browser helpers are missing. Rebuild DM so dm-cua and greedysearch-dm are staged together.");
296
+ throw new Error("Bundled DM CUA browser helpers are missing. Rebuild DM to restore them.");
292
297
  }
293
298
  return { launchScript, cdpScript };
294
299
  }
@@ -3,17 +3,17 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
3
  import { homedir, platform } from "node:os";
4
4
  import { join } from "node:path";
5
5
  import { tmpdir } from "node:os";
6
- export function parseGreedySearchPort(value, fallback = 9222) {
6
+ export function parseBrowserPort(value, fallback = 9222) {
7
7
  const port = Number.parseInt(String(value ?? ""), 10);
8
8
  return Number.isInteger(port) && port > 1024 && port < 65535 ? port : fallback;
9
9
  }
10
10
  const GREEDY_TMP = tmpdir().replaceAll("\\", "/");
11
- export const GREEDY_PORT = parseGreedySearchPort(process.env.GREEDY_SEARCH_PORT);
12
- export const GREEDY_PROFILE_DIR = (process.env.GREEDY_SEARCH_PROFILE_DIR || process.env.CDP_PROFILE_DIR || `${GREEDY_TMP}/greedysearch-chrome-profile`).replaceAll("\\", "/");
11
+ export const GREEDY_PORT = parseBrowserPort(process.env.DM_CUA_PORT ?? process.env.GREEDY_SEARCH_PORT);
12
+ export const GREEDY_PROFILE_DIR = (process.env.DM_CUA_PROFILE_DIR || process.env.GREEDY_SEARCH_PROFILE_DIR || process.env.CDP_PROFILE_DIR || `${GREEDY_TMP}/dm-cua-chrome-profile`).replaceAll("\\", "/");
13
13
  export const ACTIVE_PORT_FILE = `${GREEDY_PROFILE_DIR}/DevToolsActivePort`;
14
- export const GREEDY_PID_FILE = process.env.GREEDY_SEARCH_PID_FILE || `${GREEDY_PROFILE_DIR}/browser.pid`;
14
+ export const GREEDY_PID_FILE = process.env.DM_CUA_PID_FILE || process.env.GREEDY_SEARCH_PID_FILE || `${GREEDY_PROFILE_DIR}/browser.pid`;
15
15
  export const PAGES_CACHE = process.env.CDP_PAGES_CACHE || `${GREEDY_PROFILE_DIR}/cdp-pages.json`;
16
- export const CHROME_MODE_FILE = process.env.GREEDY_SEARCH_MODE_FILE || `${GREEDY_PROFILE_DIR}/browser-mode`;
16
+ export const CHROME_MODE_FILE = process.env.DM_CUA_MODE_FILE || process.env.GREEDY_SEARCH_MODE_FILE || `${GREEDY_PROFILE_DIR}/browser-mode`;
17
17
  export const GREEDY_METADATA_FILE = process.env.GREEDY_SEARCH_METADATA_FILE || `${GREEDY_PROFILE_DIR}/browser-metadata.json`;
18
18
  export const GREEDY_LAUNCH_LOCK_FILE = process.env.GREEDY_SEARCH_LAUNCH_LOCK_FILE || `${GREEDY_PROFILE_DIR}/browser-launch.lock`;
19
19
  export const GREEDY_ACTIVITY_FILE = process.env.GREEDY_SEARCH_ACTIVITY_FILE || `${GREEDY_PROFILE_DIR}/browser-last-activity`;
@@ -34,13 +34,13 @@ function loadUserEngines() {
34
34
  const valid = config.engines.filter((e) => ENGINES[e]);
35
35
  const invalid = config.engines.filter((e) => !ENGINES[e]);
36
36
  if (invalid.length > 0) {
37
- process.stderr.write(`[greedysearch] Warning: ignoring unknown engine(s) in ${CONFIG_FILE}: ${invalid.join(", ")}
38
- ` + `[greedysearch] Available engines: ${Object.keys(ENGINES).join(", ")}
37
+ process.stderr.write(`[dm-cua] Warning: ignoring unknown engine(s) in ${CONFIG_FILE}: ${invalid.join(", ")}
38
+ ` + `[dm-cua] Available engines: ${Object.keys(ENGINES).join(", ")}
39
39
  `);
40
40
  }
41
41
  if (valid.length > 0)
42
42
  return valid;
43
- process.stderr.write(`[greedysearch] Warning: no valid engines in ${CONFIG_FILE}, falling back to defaults: ${DEFAULT_ENGINES.join(", ")}
43
+ process.stderr.write(`[dm-cua] Warning: no valid engines in ${CONFIG_FILE}, falling back to defaults: ${DEFAULT_ENGINES.join(", ")}
44
44
  `);
45
45
  }
46
46
  }
@@ -68,9 +68,9 @@ function loadUserSynthesizer() {
68
68
  const normalized = config.synthesizer.toLowerCase();
69
69
  if (SUPPORTED_SYNTHESIZERS.includes(normalized))
70
70
  return normalized;
71
- process.stderr.write(`[greedysearch] Warning: unknown synthesizer "${config.synthesizer}" in ${CONFIG_FILE}
72
- ` + `[greedysearch] Available synthesizers: ${SUPPORTED_SYNTHESIZERS.join(", ")}
73
- ` + `[greedysearch] Falling back to default: ${DEFAULT_SYNTHESIZER}
71
+ process.stderr.write(`[dm-cua] Warning: unknown synthesizer "${config.synthesizer}" in ${CONFIG_FILE}
72
+ ` + `[dm-cua] Available synthesizers: ${SUPPORTED_SYNTHESIZERS.join(", ")}
73
+ ` + `[dm-cua] Falling back to default: ${DEFAULT_SYNTHESIZER}
74
74
  `);
75
75
  }
76
76
  }
@@ -1,6 +1,6 @@
1
1
  import { basename } from "node:path";
2
2
  export function nodeRuntimeCommand(env = process.env, execPath = process.execPath) {
3
- const configured = env.GREEDY_SEARCH_NODE || env.NODE_BINARY || env.NODE;
3
+ const configured = env.DM_CUA_NODE || env.GREEDY_SEARCH_NODE || env.NODE_BINARY || env.NODE;
4
4
  if (configured?.trim())
5
5
  return configured.trim();
6
6
  const name = basename(execPath || "").toLowerCase();
@@ -1,6 +1,6 @@
1
1
  import { execFileSync } from "node:child_process";
2
2
  import { platform } from "node:os";
3
- import { resolveSystemCmd } from "../utils/system-cmds.mjs";
3
+ import { resolveSystemCmd } from "./system-cmds.mjs";
4
4
  function defaultRun(command, args) {
5
5
  return execFileSync(resolveSystemCmd(command), args, {
6
6
  encoding: "utf8",