@linzumi/cli 0.0.52-beta → 0.0.54-beta

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 (3) hide show
  1. package/README.md +7 -1
  2. package/dist/index.js +142 -81
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -62,7 +62,7 @@ Install the CLI or run it with `npx`:
62
62
  ```bash
63
63
  npm install -g @linzumi/cli@latest
64
64
  npx -y @linzumi/cli@latest signup
65
- npx -y @linzumi/cli@0.0.52-beta --version
65
+ npx -y @linzumi/cli@0.0.54-beta --version
66
66
  linzumi --version
67
67
  ```
68
68
 
@@ -79,6 +79,12 @@ For explicit runner roots, pass a comma-separated allowlist:
79
79
  linzumi start ~/code/my-app --allowed-cwd <paths>
80
80
  ```
81
81
 
82
+ For non-production Linzumi servers, `connect` accepts either API URL flag:
83
+
84
+ ```bash
85
+ linzumi connect --linzumi-url ws://127.0.0.1:4140 --workspace default --allow-port-forwarding-by-default
86
+ ```
87
+
82
88
  ## Agent-first launch path
83
89
 
84
90
  The fastest path is the `npx -y @linzumi/cli@latest signup` command
package/dist/index.js CHANGED
@@ -4,35 +4,21 @@ var __getProtoOf = Object.getPrototypeOf;
4
4
  var __defProp = Object.defineProperty;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- function __accessProp(key) {
8
- return this[key];
9
- }
10
- var __toESMCache_node;
11
- var __toESMCache_esm;
12
7
  var __toESM = (mod, isNodeMode, target) => {
13
- var canCache = mod != null && typeof mod === "object";
14
- if (canCache) {
15
- var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
16
- var cached = cache.get(mod);
17
- if (cached)
18
- return cached;
19
- }
20
8
  target = mod != null ? __create(__getProtoOf(mod)) : {};
21
9
  const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
22
10
  for (let key of __getOwnPropNames(mod))
23
11
  if (!__hasOwnProp.call(to, key))
24
12
  __defProp(to, key, {
25
- get: __accessProp.bind(mod, key),
13
+ get: () => mod[key],
26
14
  enumerable: true
27
15
  });
28
- if (canCache)
29
- cache.set(mod, to);
30
16
  return to;
31
17
  };
32
18
  var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
33
19
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
34
20
 
35
- // node_modules/yoctocolors-cjs/index.js
21
+ // ../../node_modules/yoctocolors-cjs/index.js
36
22
  var require_yoctocolors_cjs = __commonJS((exports, module) => {
37
23
  var tty = __require("node:tty");
38
24
  var hasColors = tty?.WriteStream?.prototype?.hasColors?.() ?? false;
@@ -106,7 +92,7 @@ var require_yoctocolors_cjs = __commonJS((exports, module) => {
106
92
  module.exports = colors;
107
93
  });
108
94
 
109
- // node_modules/cli-width/index.js
95
+ // ../../node_modules/cli-width/index.js
110
96
  var require_cli_width = __commonJS((exports, module) => {
111
97
  module.exports = cliWidth;
112
98
  function normalizeOpts(options) {
@@ -146,7 +132,7 @@ var require_cli_width = __commonJS((exports, module) => {
146
132
  }
147
133
  });
148
134
 
149
- // node_modules/ansi-regex/index.js
135
+ // ../../node_modules/ansi-regex/index.js
150
136
  var require_ansi_regex = __commonJS((exports, module) => {
151
137
  module.exports = ({ onlyFirst = false } = {}) => {
152
138
  const pattern = [
@@ -157,13 +143,13 @@ var require_ansi_regex = __commonJS((exports, module) => {
157
143
  };
158
144
  });
159
145
 
160
- // node_modules/strip-ansi/index.js
146
+ // ../../node_modules/strip-ansi/index.js
161
147
  var require_strip_ansi = __commonJS((exports, module) => {
162
148
  var ansiRegex = require_ansi_regex();
163
149
  module.exports = (string) => typeof string === "string" ? string.replace(ansiRegex(), "") : string;
164
150
  });
165
151
 
166
- // node_modules/is-fullwidth-code-point/index.js
152
+ // ../../node_modules/string-width/node_modules/is-fullwidth-code-point/index.js
167
153
  var require_is_fullwidth_code_point = __commonJS((exports, module) => {
168
154
  var isFullwidthCodePoint = (codePoint) => {
169
155
  if (Number.isNaN(codePoint)) {
@@ -178,14 +164,14 @@ var require_is_fullwidth_code_point = __commonJS((exports, module) => {
178
164
  module.exports.default = isFullwidthCodePoint;
179
165
  });
180
166
 
181
- // node_modules/emoji-regex/index.js
167
+ // ../../node_modules/string-width/node_modules/emoji-regex/index.js
182
168
  var require_emoji_regex = __commonJS((exports, module) => {
183
169
  module.exports = function() {
184
170
  return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g;
185
171
  };
186
172
  });
187
173
 
188
- // node_modules/string-width/index.js
174
+ // ../../node_modules/string-width/index.js
189
175
  var require_string_width = __commonJS((exports, module) => {
190
176
  var stripAnsi = require_strip_ansi();
191
177
  var isFullwidthCodePoint = require_is_fullwidth_code_point();
@@ -219,7 +205,7 @@ var require_string_width = __commonJS((exports, module) => {
219
205
  module.exports.default = stringWidth;
220
206
  });
221
207
 
222
- // node_modules/color-name/index.js
208
+ // ../../node_modules/color-name/index.js
223
209
  var require_color_name = __commonJS((exports, module) => {
224
210
  module.exports = {
225
211
  aliceblue: [240, 248, 255],
@@ -373,7 +359,7 @@ var require_color_name = __commonJS((exports, module) => {
373
359
  };
374
360
  });
375
361
 
376
- // node_modules/color-convert/conversions.js
362
+ // ../../node_modules/color-convert/conversions.js
377
363
  var require_conversions = __commonJS((exports, module) => {
378
364
  var cssKeywords = require_color_name();
379
365
  var reverseKeywords = {};
@@ -1042,7 +1028,7 @@ var require_conversions = __commonJS((exports, module) => {
1042
1028
  };
1043
1029
  });
1044
1030
 
1045
- // node_modules/color-convert/route.js
1031
+ // ../../node_modules/color-convert/route.js
1046
1032
  var require_route = __commonJS((exports, module) => {
1047
1033
  var conversions = require_conversions();
1048
1034
  function buildGraph() {
@@ -1108,7 +1094,7 @@ var require_route = __commonJS((exports, module) => {
1108
1094
  };
1109
1095
  });
1110
1096
 
1111
- // node_modules/color-convert/index.js
1097
+ // ../../node_modules/color-convert/index.js
1112
1098
  var require_color_convert = __commonJS((exports, module) => {
1113
1099
  var conversions = require_conversions();
1114
1100
  var route = require_route();
@@ -1167,7 +1153,7 @@ var require_color_convert = __commonJS((exports, module) => {
1167
1153
  module.exports = convert;
1168
1154
  });
1169
1155
 
1170
- // node_modules/ansi-styles/index.js
1156
+ // ../../node_modules/ansi-styles/index.js
1171
1157
  var require_ansi_styles = __commonJS((exports, module) => {
1172
1158
  var wrapAnsi16 = (fn, offset) => (...args) => {
1173
1159
  const code = fn(...args);
@@ -1303,7 +1289,7 @@ var require_ansi_styles = __commonJS((exports, module) => {
1303
1289
  });
1304
1290
  });
1305
1291
 
1306
- // node_modules/wrap-ansi/index.js
1292
+ // ../../node_modules/@inquirer/core/node_modules/wrap-ansi/index.js
1307
1293
  var require_wrap_ansi = __commonJS((exports, module) => {
1308
1294
  var stringWidth = require_string_width();
1309
1295
  var stripAnsi = require_strip_ansi();
@@ -1439,7 +1425,7 @@ var require_wrap_ansi = __commonJS((exports, module) => {
1439
1425
  };
1440
1426
  });
1441
1427
 
1442
- // node_modules/mute-stream/lib/index.js
1428
+ // ../../node_modules/mute-stream/lib/index.js
1443
1429
  var require_lib = __commonJS((exports, module) => {
1444
1430
  var Stream = __require("stream");
1445
1431
 
@@ -10456,7 +10442,7 @@ function realpathOrResolved(pathValue) {
10456
10442
  }
10457
10443
 
10458
10444
  // src/version.ts
10459
- var linzumiCliVersion = "0.0.52-beta";
10445
+ var linzumiCliVersion = "0.0.54-beta";
10460
10446
  var linzumiCliVersionText = `linzumi ${linzumiCliVersion}`;
10461
10447
 
10462
10448
  // src/runnerLock.ts
@@ -11240,13 +11226,65 @@ async function openLocalCodexRunner(options, log, cleanup, close) {
11240
11226
  const codex = await connectCodexAppServer(codexUrl);
11241
11227
  cleanup.actions.push(() => codex.close());
11242
11228
  const seq = { value: 0 };
11243
- const codexThreads = options.channelSession === undefined ? await discoverCodexThreads(codex, options.cwd).catch((error) => {
11244
- log("kandan.codex_threads_startup_discovery_failed", {
11245
- message: error instanceof Error ? error.message : String(error)
11229
+ const discoveredCodexThreads = { value: [] };
11230
+ const lastReportedDiscoveryFailure = { value: undefined };
11231
+ const reportClientError = async (args) => {
11232
+ await kandan.push(topic, "client_error_report", {
11233
+ id: `client-error-${randomUUID3()}`,
11234
+ severity: args.severity ?? "error",
11235
+ code: args.code,
11236
+ operation: args.operation,
11237
+ message: args.message,
11238
+ occurredAt: new Date().toISOString(),
11239
+ instanceId,
11240
+ clientId,
11241
+ runnerId: options.runnerId,
11242
+ hostname: runnerHost,
11243
+ cwd: options.cwd,
11244
+ codexUrl,
11245
+ workspace: runnerWorkspaceSlug(options) ?? null,
11246
+ channel: options.channelSession?.channelSlug ?? null,
11247
+ cliVersion: linzumiCliVersion,
11248
+ details: args.details ?? {}
11249
+ }).catch((error) => {
11250
+ log("kandan.client_error_report_push_failed", {
11251
+ code: args.code,
11252
+ operation: args.operation,
11253
+ message: error instanceof Error ? error.message : String(error)
11254
+ });
11246
11255
  });
11247
- return [];
11248
- }) : [];
11249
- const discoveredCodexThreads = { value: codexThreads };
11256
+ };
11257
+ const loadDiscoveredCodexThreads = async (phase) => {
11258
+ try {
11259
+ const threads = await discoverCodexThreads(codex, options.cwd);
11260
+ lastReportedDiscoveryFailure.value = undefined;
11261
+ return threads;
11262
+ } catch (error) {
11263
+ const message = error instanceof Error ? error.message : String(error);
11264
+ const signature = `codex_thread_discovery_failed:${message}`;
11265
+ log("codex.thread_discovery_failed", {
11266
+ phase,
11267
+ message
11268
+ });
11269
+ if (lastReportedDiscoveryFailure.value !== signature) {
11270
+ lastReportedDiscoveryFailure.value = signature;
11271
+ await reportClientError({
11272
+ code: "codex_thread_discovery_failed",
11273
+ operation: "codex_thread_discovery",
11274
+ message,
11275
+ details: {
11276
+ phase,
11277
+ codexUrl,
11278
+ cwd: options.cwd
11279
+ }
11280
+ });
11281
+ }
11282
+ return discoveredCodexThreads.value;
11283
+ }
11284
+ };
11285
+ if (options.channelSession === undefined) {
11286
+ discoveredCodexThreads.value = await loadDiscoveredCodexThreads("initial");
11287
+ }
11250
11288
  const runtimeDefaults = runnerRuntimeDefaults(options);
11251
11289
  const instancePayload = {
11252
11290
  instanceId,
@@ -11255,7 +11293,7 @@ async function openLocalCodexRunner(options, log, cleanup, close) {
11255
11293
  tuiLaunched: options.launchTui,
11256
11294
  cwd: options.cwd,
11257
11295
  hostname: runnerHost,
11258
- codexThreads,
11296
+ codexThreads: discoveredCodexThreads.value,
11259
11297
  workspace: runnerWorkspaceSlug(options) ?? null,
11260
11298
  channel: options.channelSession?.channelSlug ?? null,
11261
11299
  model: runtimeDefaults.model ?? null,
@@ -11399,19 +11437,17 @@ async function openLocalCodexRunner(options, log, cleanup, close) {
11399
11437
  message: error instanceof Error ? error.message : String(error)
11400
11438
  });
11401
11439
  });
11402
- const refreshDiscoveredCodexThreads = () => discoverCodexThreads(codex, options.cwd).then((threads) => {
11403
- discoveredCodexThreads.value = threads;
11404
- return kandan.push(topic, "heartbeat", heartbeatPayload());
11405
- }).catch((error) => {
11406
- log("kandan.codex_threads_refresh_failed", {
11407
- message: error instanceof Error ? error.message : String(error)
11408
- });
11409
- });
11440
+ const refreshDiscoveredCodexThreads = async (phase) => {
11441
+ discoveredCodexThreads.value = await loadDiscoveredCodexThreads(phase);
11442
+ await pushHeartbeat();
11443
+ };
11410
11444
  const heartbeatInterval = setInterval(() => {
11411
- channelSession === undefined ? refreshDiscoveredCodexThreads() : pushHeartbeat();
11445
+ channelSession === undefined ? refreshDiscoveredCodexThreads("heartbeat") : pushHeartbeat();
11412
11446
  }, 15000);
11413
11447
  cleanup.actions.push(() => clearInterval(heartbeatInterval));
11414
- kandan.onReconnect(() => (channelSession === undefined ? refreshDiscoveredCodexThreads() : pushHeartbeat()).then(() => {
11448
+ kandan.onReconnect(() => channelSession === undefined ? refreshDiscoveredCodexThreads("reconnect").then(() => {
11449
+ return;
11450
+ }) : pushHeartbeat().then(() => {
11415
11451
  return;
11416
11452
  }));
11417
11453
  pushHeartbeat();
@@ -11446,7 +11482,7 @@ async function openLocalCodexRunner(options, log, cleanup, close) {
11446
11482
  });
11447
11483
  }
11448
11484
  if (channelSession === undefined && notification.method === "thread/started") {
11449
- refreshDiscoveredCodexThreads();
11485
+ refreshDiscoveredCodexThreads("thread_started");
11450
11486
  }
11451
11487
  log("codex.notification", {
11452
11488
  method: notification.method,
@@ -13804,7 +13840,7 @@ To kick the agent off:
13804
13840
  3. Paste into the thread. Codex will pick it up and start editing this folder.
13805
13841
  `;
13806
13842
 
13807
- // node_modules/@inquirer/core/dist/esm/lib/key.js
13843
+ // ../../node_modules/@inquirer/core/dist/esm/lib/key.js
13808
13844
  var isUpKey = (key, keybindings = []) => key.name === "up" || keybindings.includes("vim") && key.name === "k" || keybindings.includes("emacs") && key.ctrl && key.name === "p";
13809
13845
  var isDownKey = (key, keybindings = []) => key.name === "down" || keybindings.includes("vim") && key.name === "j" || keybindings.includes("emacs") && key.ctrl && key.name === "n";
13810
13846
  var isSpaceKey = (key) => key.name === "space";
@@ -13812,7 +13848,7 @@ var isBackspaceKey = (key) => key.name === "backspace";
13812
13848
  var isTabKey = (key) => key.name === "tab";
13813
13849
  var isNumberKey = (key) => "1234567890".includes(key.name);
13814
13850
  var isEnterKey = (key) => key.name === "enter" || key.name === "return";
13815
- // node_modules/@inquirer/core/dist/esm/lib/errors.js
13851
+ // ../../node_modules/@inquirer/core/dist/esm/lib/errors.js
13816
13852
  class AbortPromptError extends Error {
13817
13853
  name = "AbortPromptError";
13818
13854
  message = "Prompt was aborted";
@@ -13838,10 +13874,10 @@ class HookError extends Error {
13838
13874
  class ValidationError extends Error {
13839
13875
  name = "ValidationError";
13840
13876
  }
13841
- // node_modules/@inquirer/core/dist/esm/lib/use-state.js
13877
+ // ../../node_modules/@inquirer/core/dist/esm/lib/use-state.js
13842
13878
  import { AsyncResource as AsyncResource2 } from "node:async_hooks";
13843
13879
 
13844
- // node_modules/@inquirer/core/dist/esm/lib/hook-engine.js
13880
+ // ../../node_modules/@inquirer/core/dist/esm/lib/hook-engine.js
13845
13881
  import { AsyncLocalStorage, AsyncResource } from "node:async_hooks";
13846
13882
  var hookStorage = new AsyncLocalStorage;
13847
13883
  function createStore(rl) {
@@ -13946,7 +13982,7 @@ var effectScheduler = {
13946
13982
  }
13947
13983
  };
13948
13984
 
13949
- // node_modules/@inquirer/core/dist/esm/lib/use-state.js
13985
+ // ../../node_modules/@inquirer/core/dist/esm/lib/use-state.js
13950
13986
  function useState(defaultValue) {
13951
13987
  return withPointer((pointer) => {
13952
13988
  const setState = AsyncResource2.bind(function setState2(newValue) {
@@ -13964,7 +14000,7 @@ function useState(defaultValue) {
13964
14000
  });
13965
14001
  }
13966
14002
 
13967
- // node_modules/@inquirer/core/dist/esm/lib/use-effect.js
14003
+ // ../../node_modules/@inquirer/core/dist/esm/lib/use-effect.js
13968
14004
  function useEffect(cb, depArray) {
13969
14005
  withPointer((pointer) => {
13970
14006
  const oldDeps = pointer.get();
@@ -13976,10 +14012,10 @@ function useEffect(cb, depArray) {
13976
14012
  });
13977
14013
  }
13978
14014
 
13979
- // node_modules/@inquirer/core/dist/esm/lib/theme.js
14015
+ // ../../node_modules/@inquirer/core/dist/esm/lib/theme.js
13980
14016
  var import_yoctocolors_cjs = __toESM(require_yoctocolors_cjs(), 1);
13981
14017
 
13982
- // node_modules/@inquirer/figures/dist/esm/index.js
14018
+ // ../../node_modules/@inquirer/figures/dist/esm/index.js
13983
14019
  import process2 from "node:process";
13984
14020
  function isUnicodeSupported() {
13985
14021
  if (process2.platform !== "win32") {
@@ -14268,7 +14304,7 @@ var figures = shouldUseMain ? mainSymbols : fallbackSymbols;
14268
14304
  var esm_default = figures;
14269
14305
  var replacements = Object.entries(specialMainSymbols);
14270
14306
 
14271
- // node_modules/@inquirer/core/dist/esm/lib/theme.js
14307
+ // ../../node_modules/@inquirer/core/dist/esm/lib/theme.js
14272
14308
  var defaultTheme = {
14273
14309
  prefix: {
14274
14310
  idle: import_yoctocolors_cjs.default.blue("?"),
@@ -14289,7 +14325,7 @@ var defaultTheme = {
14289
14325
  }
14290
14326
  };
14291
14327
 
14292
- // node_modules/@inquirer/core/dist/esm/lib/make-theme.js
14328
+ // ../../node_modules/@inquirer/core/dist/esm/lib/make-theme.js
14293
14329
  function isPlainObject(value) {
14294
14330
  if (typeof value !== "object" || value === null)
14295
14331
  return false;
@@ -14317,7 +14353,7 @@ function makeTheme(...themes) {
14317
14353
  return deepMerge(...themesToMerge);
14318
14354
  }
14319
14355
 
14320
- // node_modules/@inquirer/core/dist/esm/lib/use-prefix.js
14356
+ // ../../node_modules/@inquirer/core/dist/esm/lib/use-prefix.js
14321
14357
  function usePrefix({ status = "idle", theme }) {
14322
14358
  const [showLoader, setShowLoader] = useState(false);
14323
14359
  const [tick, setTick] = useState(0);
@@ -14347,7 +14383,7 @@ function usePrefix({ status = "idle", theme }) {
14347
14383
  const iconName = status === "loading" ? "idle" : status;
14348
14384
  return typeof prefix === "string" ? prefix : prefix[iconName] ?? prefix["idle"];
14349
14385
  }
14350
- // node_modules/@inquirer/core/dist/esm/lib/use-memo.js
14386
+ // ../../node_modules/@inquirer/core/dist/esm/lib/use-memo.js
14351
14387
  function useMemo(fn, dependencies) {
14352
14388
  return withPointer((pointer) => {
14353
14389
  const prev = pointer.get();
@@ -14359,11 +14395,11 @@ function useMemo(fn, dependencies) {
14359
14395
  return prev.value;
14360
14396
  });
14361
14397
  }
14362
- // node_modules/@inquirer/core/dist/esm/lib/use-ref.js
14398
+ // ../../node_modules/@inquirer/core/dist/esm/lib/use-ref.js
14363
14399
  function useRef(val) {
14364
14400
  return useState({ current: val })[0];
14365
14401
  }
14366
- // node_modules/@inquirer/core/dist/esm/lib/use-keypress.js
14402
+ // ../../node_modules/@inquirer/core/dist/esm/lib/use-keypress.js
14367
14403
  function useKeypress(userHandler) {
14368
14404
  const signal = useRef(userHandler);
14369
14405
  signal.current = userHandler;
@@ -14381,7 +14417,7 @@ function useKeypress(userHandler) {
14381
14417
  };
14382
14418
  }, []);
14383
14419
  }
14384
- // node_modules/@inquirer/core/dist/esm/lib/utils.js
14420
+ // ../../node_modules/@inquirer/core/dist/esm/lib/utils.js
14385
14421
  var import_cli_width = __toESM(require_cli_width(), 1);
14386
14422
  var import_wrap_ansi = __toESM(require_wrap_ansi(), 1);
14387
14423
  function breakLines(content, width) {
@@ -14394,7 +14430,7 @@ function readlineWidth() {
14394
14430
  return import_cli_width.default({ defaultWidth: 80, output: readline().output });
14395
14431
  }
14396
14432
 
14397
- // node_modules/@inquirer/core/dist/esm/lib/pagination/use-pagination.js
14433
+ // ../../node_modules/@inquirer/core/dist/esm/lib/pagination/use-pagination.js
14398
14434
  function usePointerPosition({ active, renderedItems, pageSize, loop }) {
14399
14435
  const state = useRef({
14400
14436
  lastPointer: active,
@@ -14460,12 +14496,12 @@ function usePagination({ items, active, renderItem, pageSize, loop = true }) {
14460
14496
  return pageBuffer.filter((line) => typeof line === "string").join(`
14461
14497
  `);
14462
14498
  }
14463
- // node_modules/@inquirer/core/dist/esm/lib/create-prompt.js
14499
+ // ../../node_modules/@inquirer/core/dist/esm/lib/create-prompt.js
14464
14500
  var import_mute_stream = __toESM(require_lib(), 1);
14465
14501
  import * as readline2 from "node:readline";
14466
14502
  import { AsyncResource as AsyncResource3 } from "node:async_hooks";
14467
14503
 
14468
- // node_modules/signal-exit/dist/mjs/signals.js
14504
+ // ../../node_modules/@inquirer/core/node_modules/signal-exit/dist/mjs/signals.js
14469
14505
  var signals = [];
14470
14506
  signals.push("SIGHUP", "SIGINT", "SIGTERM");
14471
14507
  if (process.platform !== "win32") {
@@ -14475,7 +14511,7 @@ if (process.platform === "linux") {
14475
14511
  signals.push("SIGIO", "SIGPOLL", "SIGPWR", "SIGSTKFLT");
14476
14512
  }
14477
14513
 
14478
- // node_modules/signal-exit/dist/mjs/index.js
14514
+ // ../../node_modules/@inquirer/core/node_modules/signal-exit/dist/mjs/index.js
14479
14515
  var processOk = (process3) => !!process3 && typeof process3 === "object" && typeof process3.removeListener === "function" && typeof process3.emit === "function" && typeof process3.reallyExit === "function" && typeof process3.listeners === "function" && typeof process3.kill === "function" && typeof process3.pid === "number" && typeof process3.on === "function";
14480
14516
  var kExitEmitter = Symbol.for("signal-exit emitter");
14481
14517
  var global = globalThis;
@@ -14673,10 +14709,10 @@ var {
14673
14709
  unload
14674
14710
  } = signalExitWrap(processOk(process3) ? new SignalExit(process3) : new SignalExitFallback);
14675
14711
 
14676
- // node_modules/@inquirer/core/dist/esm/lib/screen-manager.js
14712
+ // ../../node_modules/@inquirer/core/dist/esm/lib/screen-manager.js
14677
14713
  import { stripVTControlCharacters } from "node:util";
14678
14714
 
14679
- // node_modules/@inquirer/ansi/dist/esm/index.js
14715
+ // ../../node_modules/@inquirer/ansi/dist/esm/index.js
14680
14716
  var ESC = "\x1B[";
14681
14717
  var cursorLeft = ESC + "G";
14682
14718
  var cursorHide = ESC + "?25l";
@@ -14692,7 +14728,7 @@ var cursorTo = (x, y) => {
14692
14728
  var eraseLine = ESC + "2K";
14693
14729
  var eraseLines = (lines) => lines > 0 ? (eraseLine + cursorUp(1)).repeat(lines - 1) + eraseLine + cursorLeft : "";
14694
14730
 
14695
- // node_modules/@inquirer/core/dist/esm/lib/screen-manager.js
14731
+ // ../../node_modules/@inquirer/core/dist/esm/lib/screen-manager.js
14696
14732
  var height = (content) => content.split(`
14697
14733
  `).length;
14698
14734
  var lastLine = (content) => content.split(`
@@ -14757,7 +14793,7 @@ class ScreenManager {
14757
14793
  }
14758
14794
  }
14759
14795
 
14760
- // node_modules/@inquirer/core/dist/esm/lib/promise-polyfill.js
14796
+ // ../../node_modules/@inquirer/core/dist/esm/lib/promise-polyfill.js
14761
14797
  class PromisePolyfill extends Promise {
14762
14798
  static withResolver() {
14763
14799
  let resolve8;
@@ -14770,7 +14806,7 @@ class PromisePolyfill extends Promise {
14770
14806
  }
14771
14807
  }
14772
14808
 
14773
- // node_modules/@inquirer/core/dist/esm/lib/create-prompt.js
14809
+ // ../../node_modules/@inquirer/core/dist/esm/lib/create-prompt.js
14774
14810
  function getCallSites() {
14775
14811
  const _prepareStackTrace = Error.prepareStackTrace;
14776
14812
  let result = [];
@@ -14856,7 +14892,7 @@ function createPrompt(view) {
14856
14892
  };
14857
14893
  return prompt;
14858
14894
  }
14859
- // node_modules/@inquirer/core/dist/esm/lib/Separator.js
14895
+ // ../../node_modules/@inquirer/core/dist/esm/lib/Separator.js
14860
14896
  var import_yoctocolors_cjs2 = __toESM(require_yoctocolors_cjs(), 1);
14861
14897
  class Separator {
14862
14898
  separator = import_yoctocolors_cjs2.default.dim(Array.from({ length: 15 }).join(esm_default.line));
@@ -14870,7 +14906,7 @@ class Separator {
14870
14906
  return Boolean(choice && typeof choice === "object" && "type" in choice && choice.type === "separator");
14871
14907
  }
14872
14908
  }
14873
- // node_modules/@inquirer/checkbox/dist/esm/index.js
14909
+ // ../../node_modules/@inquirer/checkbox/dist/esm/index.js
14874
14910
  var import_yoctocolors_cjs3 = __toESM(require_yoctocolors_cjs(), 1);
14875
14911
  var checkboxTheme = {
14876
14912
  icon: {
@@ -15057,7 +15093,7 @@ var esm_default2 = createPrompt((config, done) => {
15057
15093
  `).trimEnd();
15058
15094
  return `${lines}${cursorHide}`;
15059
15095
  });
15060
- // node_modules/@inquirer/input/dist/esm/index.js
15096
+ // ../../node_modules/@inquirer/input/dist/esm/index.js
15061
15097
  var inputTheme = {
15062
15098
  validationFailureMode: "keep"
15063
15099
  };
@@ -15141,7 +15177,7 @@ var esm_default3 = createPrompt((config, done) => {
15141
15177
  error
15142
15178
  ];
15143
15179
  });
15144
- // node_modules/@inquirer/select/dist/esm/index.js
15180
+ // ../../node_modules/@inquirer/select/dist/esm/index.js
15145
15181
  var import_yoctocolors_cjs4 = __toESM(require_yoctocolors_cjs(), 1);
15146
15182
  var selectTheme = {
15147
15183
  icon: { cursor: esm_default.pointer },
@@ -18340,6 +18376,7 @@ async function waitForFileChangeOrTimeout(path, deadline, now, ready2 = () => fa
18340
18376
  var flagDefinitions = new Map([
18341
18377
  ["version", { kind: "boolean" }],
18342
18378
  ["api-url", { kind: "value" }],
18379
+ ["linzumi-url", { kind: "value" }],
18343
18380
  ["token", { kind: "value" }],
18344
18381
  ["runner-id", { kind: "value" }],
18345
18382
  ["cwd", { kind: "value" }],
@@ -18354,6 +18391,7 @@ var flagDefinitions = new Map([
18354
18391
  ["reasoning-effort", { kind: "value" }],
18355
18392
  ["sandbox", { kind: "value" }],
18356
18393
  ["approval-policy", { kind: "value" }],
18394
+ ["allow-port-forwarding-by-default", { kind: "boolean" }],
18357
18395
  ["stream-flush-ms", { kind: "value" }],
18358
18396
  ["allowed-cwd", { kind: "value" }],
18359
18397
  ["forward-port", { kind: "value" }],
@@ -18733,7 +18771,7 @@ async function runAuthCommand(args) {
18733
18771
  process.stdout.write(helpText());
18734
18772
  return;
18735
18773
  }
18736
- const kandanUrl = required(values, "api-url");
18774
+ const kandanUrl = requiredKandanUrl(values);
18737
18775
  const target = parseOptionalChannelTarget(values);
18738
18776
  const token = await acquireLocalRunnerTokenDetails({
18739
18777
  kandanUrl,
@@ -18764,7 +18802,7 @@ async function parseStartRunnerArgs(args, deps = {
18764
18802
  process.exit(0);
18765
18803
  }
18766
18804
  rejectStartTargetingFlags(values);
18767
- const kandanUrl = stringValue4(values, "api-url") ?? defaultLinzumiWebSocketUrl;
18805
+ const kandanUrl = kandanUrlValue(values) ?? defaultLinzumiWebSocketUrl;
18768
18806
  const requestedCwd = resolveUserPath(cwdArg ?? process.cwd());
18769
18807
  const cwd = assertConfiguredAllowedCwds([requestedCwd])[0] ?? requestedCwd;
18770
18808
  const explicitAllowedCwds = values.has("allowed-cwd") ? assertConfiguredAllowedCwds(parseAllowedCwdList(stringValue4(values, "allowed-cwd"))) : [];
@@ -18848,6 +18886,7 @@ async function parseStartRunnerArgs(args, deps = {
18848
18886
  reasoningEffort: stringValue4(values, "reasoning-effort"),
18849
18887
  sandbox: stringValue4(values, "sandbox"),
18850
18888
  approvalPolicy: stringValue4(values, "approval-policy"),
18889
+ allowPortForwardingByDefault: booleanFlagValue(values, "allow-port-forwarding-by-default"),
18851
18890
  streamFlushMs: positiveIntegerValue2(values, "stream-flush-ms")
18852
18891
  }
18853
18892
  };
@@ -18880,9 +18919,10 @@ async function parseAgentRunnerArgs(args, deps = {
18880
18919
  reasoningEffort: stringValue4(values, "reasoning-effort"),
18881
18920
  sandbox: stringValue4(values, "sandbox"),
18882
18921
  approvalPolicy: stringValue4(values, "approval-policy"),
18922
+ allowPortForwardingByDefault: booleanFlagValue(values, "allow-port-forwarding-by-default"),
18883
18923
  streamFlushMs: positiveIntegerValue2(values, "stream-flush-ms")
18884
18924
  };
18885
- const kandanUrl = stringValue4(values, "api-url") ?? agentApiUrlToKandanUrl(tokenFile.apiUrl);
18925
+ const kandanUrl = kandanUrlValue(values) ?? agentApiUrlToKandanUrl(tokenFile.apiUrl);
18886
18926
  const requestedCwdValue = cwdArg ?? stringValue4(values, "cwd");
18887
18927
  const requestedCwd = resolveUserPath(requestedCwdValue ?? process.cwd());
18888
18928
  const configuredAllowedCwds2 = requestedCwdValue === undefined && !values.has("allowed-cwd") ? readConfiguredAllowedCwdDetailsForLinzumiUrl(kandanUrl) : { allowedCwds: [], missingAllowedCwds: [] };
@@ -19014,7 +19054,7 @@ async function parseRunnerArgs(args, deps = {
19014
19054
  }
19015
19055
  rejectConnectChannelFlags(values);
19016
19056
  const workspaceSlug = stringValue4(values, "workspace");
19017
- const kandanUrl = stringValue4(values, "api-url") ?? defaultLinzumiWebSocketUrl;
19057
+ const kandanUrl = kandanUrlValue(values) ?? defaultLinzumiWebSocketUrl;
19018
19058
  const cwd = stringValue4(values, "cwd") ?? process.cwd();
19019
19059
  const cwdAllowedCwds = assertConfiguredAllowedCwds([cwd]);
19020
19060
  const localConfiguredAllowedCwds = values.has("allowed-cwd") ? { allowedCwds: [], missingAllowedCwds: [] } : readConfiguredAllowedCwdDetailsForLinzumiUrl(kandanUrl);
@@ -19073,9 +19113,27 @@ function runnerRuntimeDefaultsFromValues(values) {
19073
19113
  reasoningEffort: stringValue4(values, "reasoning-effort"),
19074
19114
  approvalPolicy: stringValue4(values, "approval-policy"),
19075
19115
  sandbox: stringValue4(values, "sandbox"),
19076
- allowPortForwardingByDefault: undefined
19116
+ allowPortForwardingByDefault: booleanFlagValue(values, "allow-port-forwarding-by-default")
19077
19117
  };
19078
19118
  }
19119
+ function kandanUrlValue(values) {
19120
+ const apiUrl = stringValue4(values, "api-url");
19121
+ const linzumiUrl = stringValue4(values, "linzumi-url");
19122
+ if (apiUrl !== undefined && linzumiUrl !== undefined && apiUrl !== linzumiUrl) {
19123
+ throw new Error("use only one of --api-url or --linzumi-url");
19124
+ }
19125
+ return apiUrl ?? linzumiUrl;
19126
+ }
19127
+ function requiredKandanUrl(values) {
19128
+ const value = kandanUrlValue(values);
19129
+ if (value === undefined) {
19130
+ throw new Error("missing required flag: --api-url or --linzumi-url");
19131
+ }
19132
+ return value;
19133
+ }
19134
+ function booleanFlagValue(values, key) {
19135
+ return values.get(key) === true ? true : undefined;
19136
+ }
19079
19137
  function strictFlagValues(args, definitions = flagDefinitions) {
19080
19138
  const values = new Map;
19081
19139
  for (let index = 0;index < args.length; index += 1) {
@@ -19282,6 +19340,7 @@ Usage:
19282
19340
 
19283
19341
  Connection:
19284
19342
  --api-url <url> Linzumi API URL, default ${defaultLinzumiWebSocketUrl}
19343
+ --linzumi-url <url> Alias for --api-url
19285
19344
  --token <jwt> Optional override token. Otherwise ~/.linzumi/auth.json is validated or OAuth opens.
19286
19345
  --auth-file <path> Auth cache path, default ~/.linzumi/auth.json
19287
19346
  --oauth-callback-host <ip> Callback host reachable by your browser
@@ -19298,6 +19357,8 @@ Codex:
19298
19357
  --reasoning-effort <value> Reasoning effort requested for Codex and shown in Linzumi
19299
19358
  --sandbox <value> Sandbox metadata shown in Linzumi
19300
19359
  --approval-policy <value> Approval-policy metadata shown in Linzumi
19360
+ --allow-port-forwarding-by-default
19361
+ Auto-approve detected port-forward candidates for started sessions
19301
19362
  --stream-flush-ms <ms> Batch live Codex deltas before Linzumi persistence, default 150
19302
19363
  --fast Mark this runner as low-latency/fast in the availability message
19303
19364
  --log-file <path> JSONL event log path, default <cwd>/.linzumi-runner.log
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@linzumi/cli",
3
- "version": "0.0.52-beta",
3
+ "version": "0.0.54-beta",
4
4
  "description": "Linzumi CLI — point a Codex agent at the real code on your laptop, with your team watching and steering from shared threads.",
5
5
  "type": "module",
6
6
  "bin": {