@adhdev/daemon-core 0.6.34 → 0.6.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -2810,6 +2810,7 @@ declare class DevServer {
2810
2810
  private handleSpawnTest;
2811
2811
  private handleRunScript;
2812
2812
  private handleCdpEvaluate;
2813
+ private handleCdpClick;
2813
2814
  private handleCdpDomQuery;
2814
2815
  private handleScreenshot;
2815
2816
  private handleScriptsRun;
@@ -2833,6 +2834,7 @@ declare class DevServer {
2833
2834
  private handleWriteFile;
2834
2835
  private handleSource;
2835
2836
  private handleSave;
2837
+ private handleTypeAndSend;
2836
2838
  private handleScriptHints;
2837
2839
  private handleValidate;
2838
2840
  private handleAcpChat;
package/dist/index.js CHANGED
@@ -1967,21 +1967,41 @@ var DaemonCdpManager = class {
1967
1967
  clickCount: 1
1968
1968
  });
1969
1969
  await new Promise((r) => setTimeout(r, 150));
1970
- await this.sendInternal("Input.insertText", { text });
1970
+ const lines = text.split("\n");
1971
+ for (let i = 0; i < lines.length; i++) {
1972
+ if (lines[i].length > 0) {
1973
+ await this.sendInternal("Input.insertText", { text: lines[i] });
1974
+ await new Promise((r) => setTimeout(r, 100));
1975
+ }
1976
+ if (i < lines.length - 1) {
1977
+ await this.sendInternal("Input.dispatchKeyEvent", { type: "rawKeyDown", key: "Enter", code: "Enter", windowsVirtualKeyCode: 13, modifiers: 8 });
1978
+ await this.sendInternal("Input.dispatchKeyEvent", { type: "char", key: "Enter", code: "Enter", windowsVirtualKeyCode: 13, text: "\r", unmodifiedText: "\r", modifiers: 8 });
1979
+ await this.sendInternal("Input.dispatchKeyEvent", { type: "keyUp", key: "Enter", code: "Enter", windowsVirtualKeyCode: 13, modifiers: 8 });
1980
+ await new Promise((r) => setTimeout(r, 100));
1981
+ }
1982
+ }
1971
1983
  await new Promise((r) => setTimeout(r, 200));
1972
1984
  await this.sendInternal("Input.dispatchKeyEvent", {
1973
1985
  type: "rawKeyDown",
1974
1986
  key: "Enter",
1975
1987
  code: "Enter",
1976
1988
  windowsVirtualKeyCode: 13,
1977
- nativeVirtualKeyCode: 13
1989
+ text: "\r",
1990
+ unmodifiedText: "\r"
1978
1991
  });
1979
1992
  await this.sendInternal("Input.dispatchKeyEvent", {
1980
- type: "keyUp",
1993
+ type: "char",
1981
1994
  key: "Enter",
1982
1995
  code: "Enter",
1983
1996
  windowsVirtualKeyCode: 13,
1984
- nativeVirtualKeyCode: 13
1997
+ text: "\r",
1998
+ unmodifiedText: "\r"
1999
+ });
2000
+ await this.sendInternal("Input.dispatchKeyEvent", {
2001
+ type: "keyUp",
2002
+ key: "Enter",
2003
+ code: "Enter",
2004
+ windowsVirtualKeyCode: 13
1985
2005
  });
1986
2006
  this.log(`[CDP] typeAndSend: sent "${text.substring(0, 50)}..."`);
1987
2007
  return true;
@@ -2035,21 +2055,41 @@ var DaemonCdpManager = class {
2035
2055
  windowsVirtualKeyCode: 8
2036
2056
  });
2037
2057
  await new Promise((r) => setTimeout(r, 150));
2038
- await this.sendInternal("Input.insertText", { text });
2058
+ const lines = text.split("\n");
2059
+ for (let i = 0; i < lines.length; i++) {
2060
+ if (lines[i].length > 0) {
2061
+ await this.sendInternal("Input.insertText", { text: lines[i] });
2062
+ await new Promise((r) => setTimeout(r, 100));
2063
+ }
2064
+ if (i < lines.length - 1) {
2065
+ await this.sendInternal("Input.dispatchKeyEvent", { type: "rawKeyDown", key: "Enter", code: "Enter", windowsVirtualKeyCode: 13, modifiers: 8 });
2066
+ await this.sendInternal("Input.dispatchKeyEvent", { type: "char", key: "Enter", code: "Enter", windowsVirtualKeyCode: 13, text: "\r", unmodifiedText: "\r", modifiers: 8 });
2067
+ await this.sendInternal("Input.dispatchKeyEvent", { type: "keyUp", key: "Enter", code: "Enter", windowsVirtualKeyCode: 13, modifiers: 8 });
2068
+ await new Promise((r) => setTimeout(r, 100));
2069
+ }
2070
+ }
2039
2071
  await new Promise((r) => setTimeout(r, 200));
2040
2072
  await this.sendInternal("Input.dispatchKeyEvent", {
2041
2073
  type: "rawKeyDown",
2042
2074
  key: "Enter",
2043
2075
  code: "Enter",
2044
2076
  windowsVirtualKeyCode: 13,
2045
- nativeVirtualKeyCode: 13
2077
+ text: "\r",
2078
+ unmodifiedText: "\r"
2046
2079
  });
2047
2080
  await this.sendInternal("Input.dispatchKeyEvent", {
2048
- type: "keyUp",
2081
+ type: "char",
2049
2082
  key: "Enter",
2050
2083
  code: "Enter",
2051
2084
  windowsVirtualKeyCode: 13,
2052
- nativeVirtualKeyCode: 13
2085
+ text: "\r",
2086
+ unmodifiedText: "\r"
2087
+ });
2088
+ await this.sendInternal("Input.dispatchKeyEvent", {
2089
+ type: "keyUp",
2090
+ key: "Enter",
2091
+ code: "Enter",
2092
+ windowsVirtualKeyCode: 13
2053
2093
  });
2054
2094
  this.log(`[CDP] typeAndSendAt(${Math.round(x)},${Math.round(y)}): sent "${text.substring(0, 50)}..."`);
2055
2095
  return true;
@@ -5733,7 +5773,9 @@ var ProviderLoader = class _ProviderLoader {
5733
5773
  if (options?.builtinDir) {
5734
5774
  this.builtinDirs = Array.isArray(options.builtinDir) ? options.builtinDir : [options.builtinDir];
5735
5775
  } else {
5736
- this.builtinDirs = [path6.resolve(__dirname, "../providers/_builtin")];
5776
+ const bundledDir = path6.resolve(__dirname, "../providers/_builtin");
5777
+ const devDir = path6.resolve(__dirname, "../../providers/_builtin");
5778
+ this.builtinDirs = [fs5.existsSync(devDir) ? devDir : bundledDir];
5737
5779
  }
5738
5780
  this.userDir = options?.userDir || path6.join(os7.homedir(), ".adhdev", "providers");
5739
5781
  this.upstreamDir = path6.join(this.userDir, ".upstream");
@@ -10284,6 +10326,7 @@ var DevServer = class _DevServer {
10284
10326
  { method: "GET", pattern: "/api/providers/versions", handler: (q, s) => this.handleDetectVersions(q, s) },
10285
10327
  { method: "POST", pattern: "/api/providers/reload", handler: (q, s) => this.handleReload(q, s) },
10286
10328
  { method: "POST", pattern: "/api/cdp/evaluate", handler: (q, s) => this.handleCdpEvaluate(q, s) },
10329
+ { method: "POST", pattern: "/api/cdp/click", handler: (q, s) => this.handleCdpClick(q, s) },
10287
10330
  { method: "POST", pattern: "/api/cdp/dom/query", handler: (q, s) => this.handleCdpDomQuery(q, s) },
10288
10331
  { method: "POST", pattern: "/api/cdp/dom/inspect", handler: (q, s) => this.handleDomInspect(q, s) },
10289
10332
  { method: "POST", pattern: "/api/cdp/dom/children", handler: (q, s) => this.handleDomChildren(q, s) },
@@ -10314,6 +10357,7 @@ var DevServer = class _DevServer {
10314
10357
  { method: "POST", pattern: /^\/api\/providers\/([^/]+)\/file$/, handler: (q, s, p) => this.handleWriteFile(p[0], q, s) },
10315
10358
  { method: "GET", pattern: /^\/api\/providers\/([^/]+)\/source$/, handler: (q, s, p) => this.handleSource(p[0], q, s) },
10316
10359
  { method: "POST", pattern: /^\/api\/providers\/([^/]+)\/save$/, handler: (q, s, p) => this.handleSave(p[0], q, s) },
10360
+ { method: "POST", pattern: /^\/api\/providers\/([^/]+)\/typeAndSend$/, handler: (q, s, p) => this.handleTypeAndSend(p[0], q, s) },
10317
10361
  { method: "GET", pattern: /^\/api\/providers\/([^/]+)\/config$/, handler: (q, s, p) => this.handleProviderConfig(p[0], q, s) },
10318
10362
  { method: "POST", pattern: /^\/api\/providers\/([^/]+)\/dom-context$/, handler: (q, s, p) => this.handleDomContext(p[0], q, s) },
10319
10363
  { method: "POST", pattern: /^\/api\/providers\/([^/]+)\/auto-implement$/, handler: (q, s, p) => this.handleAutoImplement(p[0], q, s) },
@@ -10556,6 +10600,7 @@ var DevServer = class _DevServer {
10556
10600
  } catch {
10557
10601
  }
10558
10602
  }
10603
+ this.log(`Script raw debug: typeof=${typeof raw}, raw=${JSON.stringify(raw)}, parsed=${JSON.stringify(result)}`);
10559
10604
  this.json(res, 200, { type, script: scriptName, result });
10560
10605
  } catch (e) {
10561
10606
  this.json(res, 500, { error: `Script execution failed: ${e.message}` });
@@ -10590,6 +10635,26 @@ var DevServer = class _DevServer {
10590
10635
  this.json(res, 500, { error: e.message });
10591
10636
  }
10592
10637
  }
10638
+ async handleCdpClick(req, res) {
10639
+ const body = await this.readBody(req);
10640
+ const { ideType, x, y } = body;
10641
+ if (x == null || y == null) {
10642
+ this.json(res, 400, { error: "x and y coordinates required" });
10643
+ return;
10644
+ }
10645
+ const cdp = this.getCdp(ideType);
10646
+ if (!cdp?.isConnected) {
10647
+ this.json(res, 503, { error: "No CDP connection available" });
10648
+ return;
10649
+ }
10650
+ try {
10651
+ await cdp.send("Input.dispatchMouseEvent", { type: "mousePressed", x, y, button: "left", clickCount: 1 });
10652
+ await cdp.send("Input.dispatchMouseEvent", { type: "mouseReleased", x, y, button: "left", clickCount: 1 });
10653
+ this.json(res, 200, { success: true, clicked: true, x, y });
10654
+ } catch (e) {
10655
+ this.json(res, 500, { error: e.message });
10656
+ }
10657
+ }
10593
10658
  async handleCdpDomQuery(req, res) {
10594
10659
  const body = await this.readBody(req);
10595
10660
  const { selector, limit = 10, ideType } = body;
@@ -10698,6 +10763,11 @@ var DevServer = class _DevServer {
10698
10763
  name: p.name,
10699
10764
  category: p.category
10700
10765
  }));
10766
+ for (const cdp of this.cdpManagers.values()) {
10767
+ if (!cdp.isConnected) {
10768
+ cdp._targetId = null;
10769
+ }
10770
+ }
10701
10771
  this.json(res, 200, { reloaded: true, providers });
10702
10772
  } catch (e) {
10703
10773
  this.json(res, 500, { error: e.message });
@@ -10853,7 +10923,7 @@ var DevServer = class _DevServer {
10853
10923
  const provider = this.providerLoader.getMeta(type);
10854
10924
  if (!provider) return null;
10855
10925
  const cat = provider.category;
10856
- const builtinDir = this.providerLoader.builtinDir || path12.resolve(__dirname, "../providers/_builtin");
10926
+ const builtinDir = this.providerLoader.builtinDirs?.[0] || path12.resolve(__dirname, "../providers/_builtin");
10857
10927
  const userDir = path12.join(os14.homedir(), ".adhdev", "providers");
10858
10928
  const directCandidates = [
10859
10929
  path12.join(userDir, type),
@@ -11004,6 +11074,25 @@ var DevServer = class _DevServer {
11004
11074
  this.json(res, 500, { error: `Save failed: ${e.message}` });
11005
11075
  }
11006
11076
  }
11077
+ async handleTypeAndSend(type, req, res) {
11078
+ const body = await this.readBody(req);
11079
+ const { selector, text } = body;
11080
+ if (!selector || typeof selector !== "string" || !text || typeof text !== "string") {
11081
+ this.json(res, 400, { error: "selector and text strings required" });
11082
+ return;
11083
+ }
11084
+ const cdp = this.getCdp(type);
11085
+ if (!cdp) {
11086
+ this.json(res, 503, { error: `CDP not connected for '${type}'` });
11087
+ return;
11088
+ }
11089
+ try {
11090
+ const sent = await cdp.typeAndSend(selector, text);
11091
+ this.json(res, 200, { sent });
11092
+ } catch (e) {
11093
+ this.json(res, 500, { error: e.message });
11094
+ }
11095
+ }
11007
11096
  async handleScriptHints(type, _req, res) {
11008
11097
  const dir = this.findProviderDir(type);
11009
11098
  if (!dir) {
@@ -11239,7 +11328,7 @@ var DevServer = class _DevServer {
11239
11328
  if (location === "user") {
11240
11329
  targetDir = path12.join(os14.homedir(), ".adhdev", "providers", type);
11241
11330
  } else {
11242
- const builtinDir = path12.resolve(__dirname, "../providers/_builtin");
11331
+ const builtinDir = this.providerLoader.builtinDirs?.[0] || path12.resolve(__dirname, "../providers/_builtin");
11243
11332
  targetDir = path12.join(builtinDir, category, type);
11244
11333
  }
11245
11334
  const jsonPath = path12.join(targetDir, "provider.json");
@@ -12049,7 +12138,7 @@ var DevServer = class _DevServer {
12049
12138
  const domContext = null;
12050
12139
  this.sendAutoImplSSE({ event: "progress", data: { function: "_init", status: "loading_reference", message: `\uB808\uD37C\uB7F0\uC2A4 \uC2A4\uD06C\uB9BD\uD2B8 \uB85C\uB4DC \uC911 (${reference})...` } });
12051
12140
  let referenceScripts = {};
12052
- const builtinDir = this.providerLoader.builtinDir || path12.resolve(__dirname, "../providers/_builtin");
12141
+ const builtinDir = this.providerLoader.builtinDirs?.[0] || path12.resolve(__dirname, "../providers/_builtin");
12053
12142
  const refDir = path12.join(builtinDir, "ide", reference);
12054
12143
  if (fs9.existsSync(refDir)) {
12055
12144
  const scriptsDir = path12.join(refDir, "scripts");
@@ -12249,7 +12338,7 @@ var DevServer = class _DevServer {
12249
12338
  }
12250
12339
  if (model) args.push("--model", model);
12251
12340
  const escapedArgs = args.map((a) => `'${a.replace(/'/g, "'\\''")}'`).join(" ");
12252
- const metaPrompt = `Read the file at ${promptFile} and follow ALL instructions recursively. You have full authority to implement ALL required script files, update provider.json configurations based on the reference patterns, and independently test them against 127.0.0.1:19280 via CDP CURL. Upon complete validation of ALL assigned files, print exactly "AUTO_IMPLEMENT_FINISHED" to gracefully close the pipeline. DO NOT WAIT FOR APPROVAL, execute completely autonomously.`;
12341
+ const metaPrompt = `Read the file at ${promptFile} and follow ALL instructions recursively. You have full authority to implement ALL required script files, update provider.json configurations based on the reference patterns, and independently test them against 127.0.0.1:19280 via CDP CURL. Upon complete validation of ALL assigned files, print exactly "_PIPELINE_COMPLETE_SIGNAL_" to gracefully close the pipeline. DO NOT WAIT FOR APPROVAL, execute completely autonomously.`;
12253
12342
  shellCmd = `${command} ${escapedArgs} "${metaPrompt}"`;
12254
12343
  } else {
12255
12344
  const escapedArgs = baseArgs.map((a) => `'${a.replace(/'/g, "'\\''")}'`).join(" ");
@@ -12311,7 +12400,7 @@ var DevServer = class _DevServer {
12311
12400
  const cleanData = chunk.replace(/\x1B\[\d*[A-HJKSTfG]/g, " ").replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g, "").replace(/\x1B\][^\x07]*\x07/g, "").replace(/\x1B\][^\x1B]*\x1B\\/g, "").replace(/ +/g, " ");
12312
12401
  approvalBuffer = (approvalBuffer + cleanData).slice(-1500);
12313
12402
  const elapsed = Date.now() - spawnedAt;
12314
- if (elapsed > 15e3 && approvalBuffer.includes("AUTO_IMPLEMENT_FINISHED")) {
12403
+ if (elapsed > 15e3 && approvalBuffer.includes("_PIPELINE_COMPLETE_SIGNAL_")) {
12315
12404
  this.log(`Agent finished task after ${Math.round(elapsed / 1e3)}s. Terminating interactive CLI session to unblock pipeline.`);
12316
12405
  this.sendAutoImplSSE({ event: "output", data: { chunk: `
12317
12406
  [\u{1F916} ADHDev Pipeline] Completion token detected. Proceeding...