drizzy-agent 0.7.3 → 0.8.0

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/cli/index.js CHANGED
@@ -3457,6 +3457,7 @@ var init_agent_model_defaults = __esm(() => {
3457
3457
  librarian: {
3458
3458
  chain: [
3459
3459
  { providers: GEMINI_PROVIDERS, model: "gemini-3-flash" },
3460
+ { providers: OPENAI_NATIVE_PROVIDERS, model: "gpt-5.4-mini", variant: "low" },
3460
3461
  { providers: ["opencode"], model: "glm-4.7" },
3461
3462
  { providers: CLAUDE_PROVIDERS, model: "claude-sonnet-4-5" },
3462
3463
  { providers: ["opencode"], model: "minimax-m2.5-free", alwaysAvailable: true },
@@ -3473,6 +3474,7 @@ var init_agent_model_defaults = __esm(() => {
3473
3474
  explore: {
3474
3475
  chain: [
3475
3476
  { providers: ["github-copilot"], model: "grok-code-fast-1" },
3477
+ { providers: OPENAI_NATIVE_PROVIDERS, model: "gpt-5.4-mini", variant: "low" },
3476
3478
  { providers: ["anthropic", "opencode"], model: "claude-haiku-4-5" },
3477
3479
  { providers: ["opencode"], model: "minimax-m2.5-free", alwaysAvailable: true },
3478
3480
  { providers: ["opencode"], model: "gpt-5-nano", alwaysAvailable: true }
@@ -4619,6 +4621,462 @@ var init_model_availability = __esm(() => {
4619
4621
  init_connected_providers_cache();
4620
4622
  });
4621
4623
 
4624
+ // node_modules/isexe/windows.js
4625
+ var require_windows = __commonJS((exports, module) => {
4626
+ module.exports = isexe;
4627
+ isexe.sync = sync;
4628
+ var fs4 = __require("fs");
4629
+ function checkPathExt(path4, options) {
4630
+ var pathext = options.pathExt !== undefined ? options.pathExt : process.env.PATHEXT;
4631
+ if (!pathext) {
4632
+ return true;
4633
+ }
4634
+ pathext = pathext.split(";");
4635
+ if (pathext.indexOf("") !== -1) {
4636
+ return true;
4637
+ }
4638
+ for (var i2 = 0;i2 < pathext.length; i2++) {
4639
+ var p2 = pathext[i2].toLowerCase();
4640
+ if (p2 && path4.substr(-p2.length).toLowerCase() === p2) {
4641
+ return true;
4642
+ }
4643
+ }
4644
+ return false;
4645
+ }
4646
+ function checkStat(stat, path4, options) {
4647
+ if (!stat.isSymbolicLink() && !stat.isFile()) {
4648
+ return false;
4649
+ }
4650
+ return checkPathExt(path4, options);
4651
+ }
4652
+ function isexe(path4, options, cb) {
4653
+ fs4.stat(path4, function(er, stat) {
4654
+ cb(er, er ? false : checkStat(stat, path4, options));
4655
+ });
4656
+ }
4657
+ function sync(path4, options) {
4658
+ return checkStat(fs4.statSync(path4), path4, options);
4659
+ }
4660
+ });
4661
+
4662
+ // node_modules/isexe/mode.js
4663
+ var require_mode = __commonJS((exports, module) => {
4664
+ module.exports = isexe;
4665
+ isexe.sync = sync;
4666
+ var fs4 = __require("fs");
4667
+ function isexe(path4, options, cb) {
4668
+ fs4.stat(path4, function(er, stat) {
4669
+ cb(er, er ? false : checkStat(stat, options));
4670
+ });
4671
+ }
4672
+ function sync(path4, options) {
4673
+ return checkStat(fs4.statSync(path4), options);
4674
+ }
4675
+ function checkStat(stat, options) {
4676
+ return stat.isFile() && checkMode(stat, options);
4677
+ }
4678
+ function checkMode(stat, options) {
4679
+ var mod = stat.mode;
4680
+ var uid = stat.uid;
4681
+ var gid = stat.gid;
4682
+ var myUid = options.uid !== undefined ? options.uid : process.getuid && process.getuid();
4683
+ var myGid = options.gid !== undefined ? options.gid : process.getgid && process.getgid();
4684
+ var u2 = parseInt("100", 8);
4685
+ var g2 = parseInt("010", 8);
4686
+ var o2 = parseInt("001", 8);
4687
+ var ug = u2 | g2;
4688
+ var ret = mod & o2 || mod & g2 && gid === myGid || mod & u2 && uid === myUid || mod & ug && myUid === 0;
4689
+ return ret;
4690
+ }
4691
+ });
4692
+
4693
+ // node_modules/isexe/index.js
4694
+ var require_isexe = __commonJS((exports, module) => {
4695
+ var fs4 = __require("fs");
4696
+ var core3;
4697
+ if (process.platform === "win32" || global.TESTING_WINDOWS) {
4698
+ core3 = require_windows();
4699
+ } else {
4700
+ core3 = require_mode();
4701
+ }
4702
+ module.exports = isexe;
4703
+ isexe.sync = sync;
4704
+ function isexe(path4, options, cb) {
4705
+ if (typeof options === "function") {
4706
+ cb = options;
4707
+ options = {};
4708
+ }
4709
+ if (!cb) {
4710
+ if (typeof Promise !== "function") {
4711
+ throw new TypeError("callback not provided");
4712
+ }
4713
+ return new Promise(function(resolve2, reject) {
4714
+ isexe(path4, options || {}, function(er, is) {
4715
+ if (er) {
4716
+ reject(er);
4717
+ } else {
4718
+ resolve2(is);
4719
+ }
4720
+ });
4721
+ });
4722
+ }
4723
+ core3(path4, options || {}, function(er, is) {
4724
+ if (er) {
4725
+ if (er.code === "EACCES" || options && options.ignoreErrors) {
4726
+ er = null;
4727
+ is = false;
4728
+ }
4729
+ }
4730
+ cb(er, is);
4731
+ });
4732
+ }
4733
+ function sync(path4, options) {
4734
+ try {
4735
+ return core3.sync(path4, options || {});
4736
+ } catch (er) {
4737
+ if (options && options.ignoreErrors || er.code === "EACCES") {
4738
+ return false;
4739
+ } else {
4740
+ throw er;
4741
+ }
4742
+ }
4743
+ }
4744
+ });
4745
+
4746
+ // node_modules/which/which.js
4747
+ var require_which = __commonJS((exports, module) => {
4748
+ var isWindows = process.platform === "win32" || process.env.OSTYPE === "cygwin" || process.env.OSTYPE === "msys";
4749
+ var path4 = __require("path");
4750
+ var COLON = isWindows ? ";" : ":";
4751
+ var isexe = require_isexe();
4752
+ var getNotFoundError = (cmd) => Object.assign(new Error(`not found: ${cmd}`), { code: "ENOENT" });
4753
+ var getPathInfo = (cmd, opt) => {
4754
+ const colon = opt.colon || COLON;
4755
+ const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? [""] : [
4756
+ ...isWindows ? [process.cwd()] : [],
4757
+ ...(opt.path || process.env.PATH || "").split(colon)
4758
+ ];
4759
+ const pathExtExe = isWindows ? opt.pathExt || process.env.PATHEXT || ".EXE;.CMD;.BAT;.COM" : "";
4760
+ const pathExt = isWindows ? pathExtExe.split(colon) : [""];
4761
+ if (isWindows) {
4762
+ if (cmd.indexOf(".") !== -1 && pathExt[0] !== "")
4763
+ pathExt.unshift("");
4764
+ }
4765
+ return {
4766
+ pathEnv,
4767
+ pathExt,
4768
+ pathExtExe
4769
+ };
4770
+ };
4771
+ var which = (cmd, opt, cb) => {
4772
+ if (typeof opt === "function") {
4773
+ cb = opt;
4774
+ opt = {};
4775
+ }
4776
+ if (!opt)
4777
+ opt = {};
4778
+ const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt);
4779
+ const found = [];
4780
+ const step = (i2) => new Promise((resolve2, reject) => {
4781
+ if (i2 === pathEnv.length)
4782
+ return opt.all && found.length ? resolve2(found) : reject(getNotFoundError(cmd));
4783
+ const ppRaw = pathEnv[i2];
4784
+ const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw;
4785
+ const pCmd = path4.join(pathPart, cmd);
4786
+ const p2 = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd;
4787
+ resolve2(subStep(p2, i2, 0));
4788
+ });
4789
+ const subStep = (p2, i2, ii) => new Promise((resolve2, reject) => {
4790
+ if (ii === pathExt.length)
4791
+ return resolve2(step(i2 + 1));
4792
+ const ext = pathExt[ii];
4793
+ isexe(p2 + ext, { pathExt: pathExtExe }, (er, is) => {
4794
+ if (!er && is) {
4795
+ if (opt.all)
4796
+ found.push(p2 + ext);
4797
+ else
4798
+ return resolve2(p2 + ext);
4799
+ }
4800
+ return resolve2(subStep(p2, i2, ii + 1));
4801
+ });
4802
+ });
4803
+ return cb ? step(0).then((res) => cb(null, res), cb) : step(0);
4804
+ };
4805
+ var whichSync = (cmd, opt) => {
4806
+ opt = opt || {};
4807
+ const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt);
4808
+ const found = [];
4809
+ for (let i2 = 0;i2 < pathEnv.length; i2++) {
4810
+ const ppRaw = pathEnv[i2];
4811
+ const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw;
4812
+ const pCmd = path4.join(pathPart, cmd);
4813
+ const p2 = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd : pCmd;
4814
+ for (let j2 = 0;j2 < pathExt.length; j2++) {
4815
+ const cur = p2 + pathExt[j2];
4816
+ try {
4817
+ const is = isexe.sync(cur, { pathExt: pathExtExe });
4818
+ if (is) {
4819
+ if (opt.all)
4820
+ found.push(cur);
4821
+ else
4822
+ return cur;
4823
+ }
4824
+ } catch (ex) {}
4825
+ }
4826
+ }
4827
+ if (opt.all && found.length)
4828
+ return found;
4829
+ if (opt.nothrow)
4830
+ return null;
4831
+ throw getNotFoundError(cmd);
4832
+ };
4833
+ module.exports = which;
4834
+ which.sync = whichSync;
4835
+ });
4836
+
4837
+ // node_modules/path-key/index.js
4838
+ var require_path_key = __commonJS((exports, module) => {
4839
+ var pathKey = (options = {}) => {
4840
+ const environment = options.env || process.env;
4841
+ const platform = options.platform || process.platform;
4842
+ if (platform !== "win32") {
4843
+ return "PATH";
4844
+ }
4845
+ return Object.keys(environment).reverse().find((key) => key.toUpperCase() === "PATH") || "Path";
4846
+ };
4847
+ module.exports = pathKey;
4848
+ module.exports.default = pathKey;
4849
+ });
4850
+
4851
+ // node_modules/cross-spawn/lib/util/resolveCommand.js
4852
+ var require_resolveCommand = __commonJS((exports, module) => {
4853
+ var path4 = __require("path");
4854
+ var which = require_which();
4855
+ var getPathKey = require_path_key();
4856
+ function resolveCommandAttempt(parsed, withoutPathExt) {
4857
+ const env = parsed.options.env || process.env;
4858
+ const cwd = process.cwd();
4859
+ const hasCustomCwd = parsed.options.cwd != null;
4860
+ const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined && !process.chdir.disabled;
4861
+ if (shouldSwitchCwd) {
4862
+ try {
4863
+ process.chdir(parsed.options.cwd);
4864
+ } catch (err) {}
4865
+ }
4866
+ let resolved;
4867
+ try {
4868
+ resolved = which.sync(parsed.command, {
4869
+ path: env[getPathKey({ env })],
4870
+ pathExt: withoutPathExt ? path4.delimiter : undefined
4871
+ });
4872
+ } catch (e2) {} finally {
4873
+ if (shouldSwitchCwd) {
4874
+ process.chdir(cwd);
4875
+ }
4876
+ }
4877
+ if (resolved) {
4878
+ resolved = path4.resolve(hasCustomCwd ? parsed.options.cwd : "", resolved);
4879
+ }
4880
+ return resolved;
4881
+ }
4882
+ function resolveCommand(parsed) {
4883
+ return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true);
4884
+ }
4885
+ module.exports = resolveCommand;
4886
+ });
4887
+
4888
+ // node_modules/cross-spawn/lib/util/escape.js
4889
+ var require_escape = __commonJS((exports, module) => {
4890
+ var metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g;
4891
+ function escapeCommand(arg) {
4892
+ arg = arg.replace(metaCharsRegExp, "^$1");
4893
+ return arg;
4894
+ }
4895
+ function escapeArgument(arg, doubleEscapeMetaChars) {
4896
+ arg = `${arg}`;
4897
+ arg = arg.replace(/(?=(\\+?)?)\1"/g, "$1$1\\\"");
4898
+ arg = arg.replace(/(?=(\\+?)?)\1$/, "$1$1");
4899
+ arg = `"${arg}"`;
4900
+ arg = arg.replace(metaCharsRegExp, "^$1");
4901
+ if (doubleEscapeMetaChars) {
4902
+ arg = arg.replace(metaCharsRegExp, "^$1");
4903
+ }
4904
+ return arg;
4905
+ }
4906
+ exports.command = escapeCommand;
4907
+ exports.argument = escapeArgument;
4908
+ });
4909
+
4910
+ // node_modules/shebang-regex/index.js
4911
+ var require_shebang_regex = __commonJS((exports, module) => {
4912
+ module.exports = /^#!(.*)/;
4913
+ });
4914
+
4915
+ // node_modules/shebang-command/index.js
4916
+ var require_shebang_command = __commonJS((exports, module) => {
4917
+ var shebangRegex = require_shebang_regex();
4918
+ module.exports = (string4 = "") => {
4919
+ const match = string4.match(shebangRegex);
4920
+ if (!match) {
4921
+ return null;
4922
+ }
4923
+ const [path4, argument] = match[0].replace(/#! ?/, "").split(" ");
4924
+ const binary2 = path4.split("/").pop();
4925
+ if (binary2 === "env") {
4926
+ return argument;
4927
+ }
4928
+ return argument ? `${binary2} ${argument}` : binary2;
4929
+ };
4930
+ });
4931
+
4932
+ // node_modules/cross-spawn/lib/util/readShebang.js
4933
+ var require_readShebang = __commonJS((exports, module) => {
4934
+ var fs4 = __require("fs");
4935
+ var shebangCommand = require_shebang_command();
4936
+ function readShebang(command) {
4937
+ const size = 150;
4938
+ const buffer = Buffer.alloc(size);
4939
+ let fd;
4940
+ try {
4941
+ fd = fs4.openSync(command, "r");
4942
+ fs4.readSync(fd, buffer, 0, size, 0);
4943
+ fs4.closeSync(fd);
4944
+ } catch (e2) {}
4945
+ return shebangCommand(buffer.toString());
4946
+ }
4947
+ module.exports = readShebang;
4948
+ });
4949
+
4950
+ // node_modules/cross-spawn/lib/parse.js
4951
+ var require_parse = __commonJS((exports, module) => {
4952
+ var path4 = __require("path");
4953
+ var resolveCommand = require_resolveCommand();
4954
+ var escape = require_escape();
4955
+ var readShebang = require_readShebang();
4956
+ var isWin = process.platform === "win32";
4957
+ var isExecutableRegExp = /\.(?:com|exe)$/i;
4958
+ var isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;
4959
+ function detectShebang(parsed) {
4960
+ parsed.file = resolveCommand(parsed);
4961
+ const shebang = parsed.file && readShebang(parsed.file);
4962
+ if (shebang) {
4963
+ parsed.args.unshift(parsed.file);
4964
+ parsed.command = shebang;
4965
+ return resolveCommand(parsed);
4966
+ }
4967
+ return parsed.file;
4968
+ }
4969
+ function parseNonShell(parsed) {
4970
+ if (!isWin) {
4971
+ return parsed;
4972
+ }
4973
+ const commandFile = detectShebang(parsed);
4974
+ const needsShell = !isExecutableRegExp.test(commandFile);
4975
+ if (parsed.options.forceShell || needsShell) {
4976
+ const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile);
4977
+ parsed.command = path4.normalize(parsed.command);
4978
+ parsed.command = escape.command(parsed.command);
4979
+ parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars));
4980
+ const shellCommand = [parsed.command].concat(parsed.args).join(" ");
4981
+ parsed.args = ["/d", "/s", "/c", `"${shellCommand}"`];
4982
+ parsed.command = process.env.comspec || "cmd.exe";
4983
+ parsed.options.windowsVerbatimArguments = true;
4984
+ }
4985
+ return parsed;
4986
+ }
4987
+ function parse7(command, args, options) {
4988
+ if (args && !Array.isArray(args)) {
4989
+ options = args;
4990
+ args = null;
4991
+ }
4992
+ args = args ? args.slice(0) : [];
4993
+ options = Object.assign({}, options);
4994
+ const parsed = {
4995
+ command,
4996
+ args,
4997
+ options,
4998
+ file: undefined,
4999
+ original: {
5000
+ command,
5001
+ args
5002
+ }
5003
+ };
5004
+ return options.shell ? parsed : parseNonShell(parsed);
5005
+ }
5006
+ module.exports = parse7;
5007
+ });
5008
+
5009
+ // node_modules/cross-spawn/lib/enoent.js
5010
+ var require_enoent = __commonJS((exports, module) => {
5011
+ var isWin = process.platform === "win32";
5012
+ function notFoundError(original, syscall) {
5013
+ return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), {
5014
+ code: "ENOENT",
5015
+ errno: "ENOENT",
5016
+ syscall: `${syscall} ${original.command}`,
5017
+ path: original.command,
5018
+ spawnargs: original.args
5019
+ });
5020
+ }
5021
+ function hookChildProcess(cp, parsed) {
5022
+ if (!isWin) {
5023
+ return;
5024
+ }
5025
+ const originalEmit = cp.emit;
5026
+ cp.emit = function(name, arg1) {
5027
+ if (name === "exit") {
5028
+ const err = verifyENOENT(arg1, parsed);
5029
+ if (err) {
5030
+ return originalEmit.call(cp, "error", err);
5031
+ }
5032
+ }
5033
+ return originalEmit.apply(cp, arguments);
5034
+ };
5035
+ }
5036
+ function verifyENOENT(status, parsed) {
5037
+ if (isWin && status === 1 && !parsed.file) {
5038
+ return notFoundError(parsed.original, "spawn");
5039
+ }
5040
+ return null;
5041
+ }
5042
+ function verifyENOENTSync(status, parsed) {
5043
+ if (isWin && status === 1 && !parsed.file) {
5044
+ return notFoundError(parsed.original, "spawnSync");
5045
+ }
5046
+ return null;
5047
+ }
5048
+ module.exports = {
5049
+ hookChildProcess,
5050
+ verifyENOENT,
5051
+ verifyENOENTSync,
5052
+ notFoundError
5053
+ };
5054
+ });
5055
+
5056
+ // node_modules/cross-spawn/index.js
5057
+ var require_cross_spawn = __commonJS((exports, module) => {
5058
+ var cp = __require("child_process");
5059
+ var parse7 = require_parse();
5060
+ var enoent = require_enoent();
5061
+ function spawn(command, args, options) {
5062
+ const parsed = parse7(command, args, options);
5063
+ const spawned = cp.spawn(parsed.command, parsed.args, parsed.options);
5064
+ enoent.hookChildProcess(spawned, parsed);
5065
+ return spawned;
5066
+ }
5067
+ function spawnSync(command, args, options) {
5068
+ const parsed = parse7(command, args, options);
5069
+ const result = cp.spawnSync(parsed.command, parsed.args, parsed.options);
5070
+ result.error = result.error || enoent.verifyENOENTSync(result.status, parsed);
5071
+ return result;
5072
+ }
5073
+ module.exports = spawn;
5074
+ module.exports.spawn = spawn;
5075
+ module.exports.sync = spawnSync;
5076
+ module.exports._parse = parse7;
5077
+ module.exports._enoent = enoent;
5078
+ });
5079
+
4622
5080
  // src/hooks/auto-update-checker/constants.ts
4623
5081
  import * as path4 from "path";
4624
5082
  import * as os3 from "os";
@@ -26083,6 +26541,31 @@ class OpencodeClient extends _HeyApiClient {
26083
26541
  }
26084
26542
 
26085
26543
  // node_modules/@opencode-ai/sdk/dist/client.js
26544
+ function pick2(value, fallback) {
26545
+ if (!value)
26546
+ return;
26547
+ if (!fallback)
26548
+ return value;
26549
+ if (value === fallback)
26550
+ return fallback;
26551
+ if (value === encodeURIComponent(fallback))
26552
+ return fallback;
26553
+ return value;
26554
+ }
26555
+ function rewrite(request, directory) {
26556
+ if (request.method !== "GET" && request.method !== "HEAD")
26557
+ return request;
26558
+ const value = pick2(request.headers.get("x-opencode-directory"), directory);
26559
+ if (!value)
26560
+ return request;
26561
+ const url2 = new URL(request.url);
26562
+ if (!url2.searchParams.has("directory")) {
26563
+ url2.searchParams.set("directory", value);
26564
+ }
26565
+ const next = new Request(url2, request);
26566
+ next.headers.delete("x-opencode-directory");
26567
+ return next;
26568
+ }
26086
26569
  function createOpencodeClient(config2) {
26087
26570
  if (!config2?.fetch) {
26088
26571
  const customFetch = (req) => {
@@ -26101,10 +26584,46 @@ function createOpencodeClient(config2) {
26101
26584
  };
26102
26585
  }
26103
26586
  const client2 = createClient(config2);
26587
+ client2.interceptors.request.use((request) => rewrite(request, config2?.directory));
26104
26588
  return new OpencodeClient({ client: client2 });
26105
26589
  }
26106
26590
  // node_modules/@opencode-ai/sdk/dist/server.js
26107
- import { spawn } from "child_process";
26591
+ var import_cross_spawn = __toESM(require_cross_spawn(), 1);
26592
+
26593
+ // node_modules/@opencode-ai/sdk/dist/process.js
26594
+ import { spawnSync } from "child_process";
26595
+ function stop(proc) {
26596
+ if (proc.exitCode !== null || proc.signalCode !== null)
26597
+ return;
26598
+ if (process.platform === "win32" && proc.pid) {
26599
+ const out = spawnSync("taskkill", ["/pid", String(proc.pid), "/T", "/F"], { windowsHide: true });
26600
+ if (!out.error && out.status === 0)
26601
+ return;
26602
+ }
26603
+ proc.kill();
26604
+ }
26605
+ function bindAbort(proc, signal, onAbort) {
26606
+ if (!signal)
26607
+ return () => {};
26608
+ const abort = () => {
26609
+ clear();
26610
+ stop(proc);
26611
+ onAbort?.();
26612
+ };
26613
+ const clear = () => {
26614
+ signal.removeEventListener("abort", abort);
26615
+ proc.off("exit", clear);
26616
+ proc.off("error", clear);
26617
+ };
26618
+ signal.addEventListener("abort", abort, { once: true });
26619
+ proc.on("exit", clear);
26620
+ proc.on("error", clear);
26621
+ if (signal.aborted)
26622
+ abort();
26623
+ return clear;
26624
+ }
26625
+
26626
+ // node_modules/@opencode-ai/sdk/dist/server.js
26108
26627
  async function createOpencodeServer(options) {
26109
26628
  options = Object.assign({
26110
26629
  hostname: "127.0.0.1",
@@ -26114,19 +26633,24 @@ async function createOpencodeServer(options) {
26114
26633
  const args = [`serve`, `--hostname=${options.hostname}`, `--port=${options.port}`];
26115
26634
  if (options.config?.logLevel)
26116
26635
  args.push(`--log-level=${options.config.logLevel}`);
26117
- const proc = spawn(`opencode`, args, {
26118
- signal: options.signal,
26636
+ const proc = import_cross_spawn.default(`opencode`, args, {
26119
26637
  env: {
26120
26638
  ...process.env,
26121
26639
  OPENCODE_CONFIG_CONTENT: JSON.stringify(options.config ?? {})
26122
26640
  }
26123
26641
  });
26642
+ let clear = () => {};
26124
26643
  const url2 = await new Promise((resolve2, reject) => {
26125
26644
  const id = setTimeout(() => {
26645
+ clear();
26646
+ stop(proc);
26126
26647
  reject(new Error(`Timeout waiting for server to start after ${options.timeout}ms`));
26127
26648
  }, options.timeout);
26128
26649
  let output = "";
26650
+ let resolved = false;
26129
26651
  proc.stdout?.on("data", (chunk) => {
26652
+ if (resolved)
26653
+ return;
26130
26654
  output += chunk.toString();
26131
26655
  const lines = output.split(`
26132
26656
  `);
@@ -26134,9 +26658,14 @@ async function createOpencodeServer(options) {
26134
26658
  if (line.startsWith("opencode server listening")) {
26135
26659
  const match = line.match(/on\s+(https?:\/\/[^\s]+)/);
26136
26660
  if (!match) {
26137
- throw new Error(`Failed to parse server url from output: ${line}`);
26661
+ clear();
26662
+ stop(proc);
26663
+ clearTimeout(id);
26664
+ reject(new Error(`Failed to parse server url from output: ${line}`));
26665
+ return;
26138
26666
  }
26139
26667
  clearTimeout(id);
26668
+ resolved = true;
26140
26669
  resolve2(match[1]);
26141
26670
  return;
26142
26671
  }
@@ -26158,17 +26687,16 @@ Server output: ${output}`;
26158
26687
  clearTimeout(id);
26159
26688
  reject(error48);
26160
26689
  });
26161
- if (options.signal) {
26162
- options.signal.addEventListener("abort", () => {
26163
- clearTimeout(id);
26164
- reject(new Error("Aborted"));
26165
- });
26166
- }
26690
+ clear = bindAbort(proc, options.signal, () => {
26691
+ clearTimeout(id);
26692
+ reject(options.signal?.reason);
26693
+ });
26167
26694
  });
26168
26695
  return {
26169
26696
  url: url2,
26170
26697
  close() {
26171
- proc.kill();
26698
+ clear();
26699
+ stop(proc);
26172
26700
  }
26173
26701
  };
26174
26702
  }
@@ -29017,7 +29545,7 @@ async function findAvailablePort2(startPort = DEFAULT_PORT) {
29017
29545
  }
29018
29546
 
29019
29547
  // src/features/mcp-oauth/oauth-authorization-flow.ts
29020
- import { spawn as spawn2 } from "child_process";
29548
+ import { spawn } from "child_process";
29021
29549
  import { createHash, randomBytes as randomBytes2 } from "crypto";
29022
29550
  import { createServer } from "http";
29023
29551
  function generateCodeVerifier() {
@@ -29098,7 +29626,7 @@ function openBrowser(url2) {
29098
29626
  args = [url2];
29099
29627
  }
29100
29628
  try {
29101
- const child = spawn2(command, args, { stdio: "ignore", detached: true });
29629
+ const child = spawn(command, args, { stdio: "ignore", detached: true });
29102
29630
  child.on("error", () => {});
29103
29631
  child.unref();
29104
29632
  } catch {}
@@ -29369,7 +29897,7 @@ function createMcpOAuthCommand() {
29369
29897
  // package.json
29370
29898
  var package_default = {
29371
29899
  name: "drizzy-agent",
29372
- version: "0.7.3",
29900
+ version: "0.8.0",
29373
29901
  description: "DrizzyAgent - AI agent plugin for OpenCode",
29374
29902
  main: "dist/index.js",
29375
29903
  types: "dist/index.d.ts",
@@ -29426,8 +29954,8 @@ var package_default = {
29426
29954
  "@clack/prompts": "^0.11.0",
29427
29955
  "@code-yeongyu/comment-checker": "^0.7.0",
29428
29956
  "@modelcontextprotocol/sdk": "^1.25.2",
29429
- "@opencode-ai/plugin": "^1.2.24",
29430
- "@opencode-ai/sdk": "^1.2.24",
29957
+ "@opencode-ai/plugin": "^1.4.0",
29958
+ "@opencode-ai/sdk": "^1.4.0",
29431
29959
  commander: "^14.0.2",
29432
29960
  "detect-libc": "^2.0.0",
29433
29961
  diff: "^8.0.3",
@@ -29445,20 +29973,20 @@ var package_default = {
29445
29973
  typescript: "^5.7.3"
29446
29974
  },
29447
29975
  optionalDependencies: {
29448
- "drizzy-agent-darwin-arm64": "0.7.3",
29449
- "drizzy-agent-darwin-x64": "0.7.3",
29450
- "drizzy-agent-darwin-x64-baseline": "0.7.3",
29451
- "drizzy-agent-linux-arm64": "0.7.3",
29452
- "drizzy-agent-linux-arm64-musl": "0.7.3",
29453
- "drizzy-agent-linux-x64": "0.7.3",
29454
- "drizzy-agent-linux-x64-baseline": "0.7.3",
29455
- "drizzy-agent-linux-x64-musl": "0.7.3",
29456
- "drizzy-agent-linux-x64-musl-baseline": "0.7.3",
29457
- "drizzy-agent-windows-x64": "0.7.3",
29458
- "drizzy-agent-windows-x64-baseline": "0.7.3"
29976
+ "drizzy-agent-darwin-arm64": "0.8.0",
29977
+ "drizzy-agent-darwin-x64": "0.8.0",
29978
+ "drizzy-agent-darwin-x64-baseline": "0.8.0",
29979
+ "drizzy-agent-linux-arm64": "0.8.0",
29980
+ "drizzy-agent-linux-arm64-musl": "0.8.0",
29981
+ "drizzy-agent-linux-x64": "0.8.0",
29982
+ "drizzy-agent-linux-x64-baseline": "0.8.0",
29983
+ "drizzy-agent-linux-x64-musl": "0.8.0",
29984
+ "drizzy-agent-linux-x64-musl-baseline": "0.8.0",
29985
+ "drizzy-agent-windows-x64": "0.8.0",
29986
+ "drizzy-agent-windows-x64-baseline": "0.8.0"
29459
29987
  },
29460
29988
  overrides: {
29461
- "@opencode-ai/sdk": "^1.2.24"
29989
+ "@opencode-ai/sdk": "^1.4.0"
29462
29990
  },
29463
29991
  trustedDependencies: [
29464
29992
  "@ast-grep/cli",
@@ -7,6 +7,7 @@ type SessionMessage = {
7
7
  modelID?: string;
8
8
  variant?: string;
9
9
  };
10
+ variant?: string;
10
11
  providerID?: string;
11
12
  modelID?: string;
12
13
  tools?: StoredMessage["tools"];