opencode-feishu-plugin 0.1.3 → 0.2.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/index.js CHANGED
@@ -4,11 +4,11 @@ import http from 'http';
4
4
  import https from 'https';
5
5
  import http2 from 'http2';
6
6
  import util from 'util';
7
- import path, { dirname, isAbsolute, resolve as resolve$1, join, sep, basename } from 'path';
7
+ import path, { dirname, isAbsolute, sep, resolve as resolve$1, join, basename } from 'path';
8
8
  import zlib from 'zlib';
9
9
  import stream3, { Readable } from 'stream';
10
10
  import { EventEmitter } from 'events';
11
- import fs, { mkdirSync, createWriteStream, readFileSync, statSync, realpathSync } from 'fs';
11
+ import fs, { mkdirSync, createWriteStream, readFileSync, realpathSync, statSync } from 'fs';
12
12
  import qs from 'querystring';
13
13
  import { homedir } from 'os';
14
14
  import { readFile, readdir } from 'fs/promises';
@@ -10936,12 +10936,12 @@ var require_promisify = __commonJS({
10936
10936
  Object.defineProperty(exports, "__esModule", { value: true });
10937
10937
  function promisify(fn3) {
10938
10938
  return function(req, opts) {
10939
- return new Promise((resolve3, reject) => {
10939
+ return new Promise((resolve4, reject) => {
10940
10940
  fn3.call(this, req, opts, (err2, rtn) => {
10941
10941
  if (err2) {
10942
10942
  reject(err2);
10943
10943
  } else {
10944
- resolve3(rtn);
10944
+ resolve4(rtn);
10945
10945
  }
10946
10946
  });
10947
10947
  });
@@ -11143,7 +11143,7 @@ var require_parse_proxy_response = __commonJS({
11143
11143
  var debug_1 = __importDefault(require_src());
11144
11144
  var debug = debug_1.default("https-proxy-agent:parse-proxy-response");
11145
11145
  function parseProxyResponse(socket) {
11146
- return new Promise((resolve3, reject) => {
11146
+ return new Promise((resolve4, reject) => {
11147
11147
  let buffersLength = 0;
11148
11148
  const buffers = [];
11149
11149
  function read() {
@@ -11183,7 +11183,7 @@ var require_parse_proxy_response = __commonJS({
11183
11183
  const firstLine = buffered.toString("ascii", 0, buffered.indexOf("\r\n"));
11184
11184
  const statusCode = +firstLine.split(" ")[1];
11185
11185
  debug("got proxy server response: %o", firstLine);
11186
- resolve3({
11186
+ resolve4({
11187
11187
  statusCode,
11188
11188
  buffered
11189
11189
  });
@@ -11203,11 +11203,11 @@ var require_agent = __commonJS({
11203
11203
  "node_modules/https-proxy-agent/dist/agent.js"(exports) {
11204
11204
  var __awaiter2 = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) {
11205
11205
  function adopt(value3) {
11206
- return value3 instanceof P ? value3 : new P(function(resolve3) {
11207
- resolve3(value3);
11206
+ return value3 instanceof P ? value3 : new P(function(resolve4) {
11207
+ resolve4(value3);
11208
11208
  });
11209
11209
  }
11210
- return new (P || (P = Promise))(function(resolve3, reject) {
11210
+ return new (P || (P = Promise))(function(resolve4, reject) {
11211
11211
  function fulfilled(value3) {
11212
11212
  try {
11213
11213
  step(generator.next(value3));
@@ -11223,7 +11223,7 @@ var require_agent = __commonJS({
11223
11223
  }
11224
11224
  }
11225
11225
  function step(result3) {
11226
- result3.done ? resolve3(result3.value) : adopt(result3.value).then(fulfilled, rejected);
11226
+ result3.done ? resolve4(result3.value) : adopt(result3.value).then(fulfilled, rejected);
11227
11227
  }
11228
11228
  step((generator = generator.apply(thisArg, _arguments || [])).next());
11229
11229
  });
@@ -18969,7 +18969,7 @@ var require_aspromise = __commonJS({
18969
18969
  var params = new Array(arguments.length - 1), offset = 0, index2 = 2, pending = true;
18970
18970
  while (index2 < arguments.length)
18971
18971
  params[offset++] = arguments[index2++];
18972
- return new Promise(function executor(resolve3, reject) {
18972
+ return new Promise(function executor(resolve4, reject) {
18973
18973
  params[offset] = function callback3(err2) {
18974
18974
  if (pending) {
18975
18975
  pending = false;
@@ -18979,7 +18979,7 @@ var require_aspromise = __commonJS({
18979
18979
  var params2 = new Array(arguments.length - 1), offset2 = 0;
18980
18980
  while (offset2 < params2.length)
18981
18981
  params2[offset2++] = arguments[offset2];
18982
- resolve3.apply(null, params2);
18982
+ resolve4.apply(null, params2);
18983
18983
  }
18984
18984
  }
18985
18985
  };
@@ -23158,10 +23158,10 @@ var CanceledError = class extends AxiosError_default {
23158
23158
  var CanceledError_default = CanceledError;
23159
23159
 
23160
23160
  // node_modules/axios/lib/core/settle.js
23161
- function settle(resolve3, reject, response2) {
23161
+ function settle(resolve4, reject, response2) {
23162
23162
  const validateStatus2 = response2.config.validateStatus;
23163
23163
  if (!response2.status || !validateStatus2 || validateStatus2(response2.status)) {
23164
- resolve3(response2);
23164
+ resolve4(response2);
23165
23165
  } else {
23166
23166
  reject(new AxiosError_default(
23167
23167
  "Request failed with status code " + response2.status,
@@ -24494,7 +24494,7 @@ function setProxy(options2, configProxy, location, isRedirect, configHttpsAgent,
24494
24494
  }
24495
24495
  var isHttpAdapterSupported = typeof process !== "undefined" && utils_default.kindOf(process) === "process";
24496
24496
  var wrapAsync = (asyncExecutor) => {
24497
- return new Promise((resolve3, reject) => {
24497
+ return new Promise((resolve4, reject) => {
24498
24498
  let onDone;
24499
24499
  let isDone3;
24500
24500
  const done4 = (value3, isRejected) => {
@@ -24504,7 +24504,7 @@ var wrapAsync = (asyncExecutor) => {
24504
24504
  };
24505
24505
  const _resolve = (value3) => {
24506
24506
  done4(value3);
24507
- resolve3(value3);
24507
+ resolve4(value3);
24508
24508
  };
24509
24509
  const _reject = (reason) => {
24510
24510
  done4(reason, true);
@@ -24575,7 +24575,7 @@ var http2Transport = {
24575
24575
  }
24576
24576
  };
24577
24577
  var http_default = isHttpAdapterSupported && function httpAdapter(config) {
24578
- return wrapAsync(async function dispatchHttpRequest(resolve3, reject, onDone) {
24578
+ return wrapAsync(async function dispatchHttpRequest(resolve4, reject, onDone) {
24579
24579
  const own2 = (key) => utils_default.getSafeProp(config, key);
24580
24580
  const transitional2 = own2("transitional") || transitional_default;
24581
24581
  let data = own2("data");
@@ -24712,7 +24712,7 @@ var http_default = isHttpAdapterSupported && function httpAdapter(config) {
24712
24712
  }
24713
24713
  let convertedData;
24714
24714
  if (method !== "GET") {
24715
- return settle(resolve3, reject, {
24715
+ return settle(resolve4, reject, {
24716
24716
  status: 405,
24717
24717
  statusText: "method not allowed",
24718
24718
  headers: {},
@@ -24734,7 +24734,7 @@ var http_default = isHttpAdapterSupported && function httpAdapter(config) {
24734
24734
  } else if (responseType === "stream") {
24735
24735
  convertedData = stream3.Readable.from(convertedData);
24736
24736
  }
24737
- return settle(resolve3, reject, {
24737
+ return settle(resolve4, reject, {
24738
24738
  data: convertedData,
24739
24739
  status: 200,
24740
24740
  statusText: "OK",
@@ -25105,7 +25105,7 @@ var http_default = isHttpAdapterSupported && function httpAdapter(config) {
25105
25105
  });
25106
25106
  }
25107
25107
  response2.data = responseStream;
25108
- settle(resolve3, reject, response2);
25108
+ settle(resolve4, reject, response2);
25109
25109
  } else {
25110
25110
  const responseBuffer = [];
25111
25111
  let totalResponseBytes = 0;
@@ -25156,7 +25156,7 @@ var http_default = isHttpAdapterSupported && function httpAdapter(config) {
25156
25156
  } catch (err2) {
25157
25157
  return reject(AxiosError_default.from(err2, null, config, response2.request, response2));
25158
25158
  }
25159
- settle(resolve3, reject, response2);
25159
+ settle(resolve4, reject, response2);
25160
25160
  });
25161
25161
  }
25162
25162
  abortEmitter.once("abort", (err2) => {
@@ -25530,7 +25530,7 @@ var resolveConfig_default = resolveConfig;
25530
25530
  // node_modules/axios/lib/adapters/xhr.js
25531
25531
  var isXHRAdapterSupported = typeof XMLHttpRequest !== "undefined";
25532
25532
  var xhr_default = isXHRAdapterSupported && function(config) {
25533
- return new Promise(function dispatchXhrRequest(resolve3, reject) {
25533
+ return new Promise(function dispatchXhrRequest(resolve4, reject) {
25534
25534
  const _config = resolveConfig_default(config);
25535
25535
  let requestData = _config.data;
25536
25536
  const requestHeaders = AxiosHeaders_default.from(_config.headers).normalize();
@@ -25585,7 +25585,7 @@ var xhr_default = isXHRAdapterSupported && function(config) {
25585
25585
  };
25586
25586
  settle(
25587
25587
  function _resolve(value3) {
25588
- resolve3(value3);
25588
+ resolve4(value3);
25589
25589
  done4();
25590
25590
  },
25591
25591
  function _reject(err2) {
@@ -26210,8 +26210,8 @@ var factory = (env) => {
26210
26210
  }
26211
26211
  }
26212
26212
  !isStreamResponse && unsubscribe && unsubscribe();
26213
- return await new Promise((resolve3, reject) => {
26214
- settle(resolve3, reject, {
26213
+ return await new Promise((resolve4, reject) => {
26214
+ settle(resolve4, reject, {
26215
26215
  data: responseData,
26216
26216
  headers: AxiosHeaders_default.from(response2.headers),
26217
26217
  status: response2.status,
@@ -26690,8 +26690,8 @@ var CancelToken = class _CancelToken {
26690
26690
  throw new TypeError("executor must be a function.");
26691
26691
  }
26692
26692
  let resolvePromise;
26693
- this.promise = new Promise(function promiseExecutor(resolve3) {
26694
- resolvePromise = resolve3;
26693
+ this.promise = new Promise(function promiseExecutor(resolve4) {
26694
+ resolvePromise = resolve4;
26695
26695
  });
26696
26696
  const token = this;
26697
26697
  this.promise.then((cancel) => {
@@ -26704,9 +26704,9 @@ var CancelToken = class _CancelToken {
26704
26704
  });
26705
26705
  this.promise.then = (onfulfilled) => {
26706
26706
  let _resolve;
26707
- const promise3 = new Promise((resolve3) => {
26708
- token.subscribe(resolve3);
26709
- _resolve = resolve3;
26707
+ const promise3 = new Promise((resolve4) => {
26708
+ token.subscribe(resolve4);
26709
+ _resolve = resolve4;
26710
26710
  }).then(onfulfilled);
26711
26711
  promise3.cancel = function reject() {
26712
26712
  token.unsubscribe(_resolve);
@@ -26966,11 +26966,11 @@ function __rest(s, e) {
26966
26966
  }
26967
26967
  function __awaiter(thisArg, _arguments, P, generator) {
26968
26968
  function adopt(value3) {
26969
- return value3 instanceof P ? value3 : new P(function(resolve3) {
26970
- resolve3(value3);
26969
+ return value3 instanceof P ? value3 : new P(function(resolve4) {
26970
+ resolve4(value3);
26971
26971
  });
26972
26972
  }
26973
- return new (P || (P = Promise))(function(resolve3, reject) {
26973
+ return new (P || (P = Promise))(function(resolve4, reject) {
26974
26974
  function fulfilled(value3) {
26975
26975
  try {
26976
26976
  step(generator.next(value3));
@@ -26986,7 +26986,7 @@ function __awaiter(thisArg, _arguments, P, generator) {
26986
26986
  }
26987
26987
  }
26988
26988
  function step(result3) {
26989
- result3.done ? resolve3(result3.value) : adopt(result3.value).then(fulfilled, rejected);
26989
+ result3.done ? resolve4(result3.value) : adopt(result3.value).then(fulfilled, rejected);
26990
26990
  }
26991
26991
  step((generator = generator.apply(thisArg, [])).next());
26992
26992
  });
@@ -27011,11 +27011,11 @@ function __asyncGenerator(thisArg, _arguments, generator) {
27011
27011
  try {
27012
27012
  step(g[n](v));
27013
27013
  } catch (e) {
27014
- settle2(q[0][3], e);
27014
+ settle3(q[0][3], e);
27015
27015
  }
27016
27016
  }
27017
27017
  function step(r) {
27018
- r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle2(q[0][2], r);
27018
+ r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle3(q[0][2], r);
27019
27019
  }
27020
27020
  function fulfill(value3) {
27021
27021
  resume("next", value3);
@@ -27023,7 +27023,7 @@ function __asyncGenerator(thisArg, _arguments, generator) {
27023
27023
  function reject(value3) {
27024
27024
  resume("throw", value3);
27025
27025
  }
27026
- function settle2(f, v) {
27026
+ function settle3(f, v) {
27027
27027
  if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);
27028
27028
  }
27029
27029
  }
@@ -27376,10 +27376,10 @@ var Client$1P = class {
27376
27376
  return {
27377
27377
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
27378
27378
  checkIsReadable();
27379
- return new Promise((resolve3, reject) => {
27379
+ return new Promise((resolve4, reject) => {
27380
27380
  const writableStream = fs.createWriteStream(filePath);
27381
27381
  writableStream.on("finish", () => {
27382
- resolve3(filePath);
27382
+ resolve4(filePath);
27383
27383
  });
27384
27384
  writableStream.on("error", (e) => {
27385
27385
  reject(e);
@@ -27559,10 +27559,10 @@ var Client$1P = class {
27559
27559
  return {
27560
27560
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
27561
27561
  checkIsReadable();
27562
- return new Promise((resolve3, reject) => {
27562
+ return new Promise((resolve4, reject) => {
27563
27563
  const writableStream = fs.createWriteStream(filePath);
27564
27564
  writableStream.on("finish", () => {
27565
- resolve3(filePath);
27565
+ resolve4(filePath);
27566
27566
  });
27567
27567
  writableStream.on("error", (e) => {
27568
27568
  reject(e);
@@ -27895,10 +27895,10 @@ var Client$1P = class {
27895
27895
  return {
27896
27896
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
27897
27897
  checkIsReadable();
27898
- return new Promise((resolve3, reject) => {
27898
+ return new Promise((resolve4, reject) => {
27899
27899
  const writableStream = fs.createWriteStream(filePath);
27900
27900
  writableStream.on("finish", () => {
27901
- resolve3(filePath);
27901
+ resolve4(filePath);
27902
27902
  });
27903
27903
  writableStream.on("error", (e) => {
27904
27904
  reject(e);
@@ -28080,10 +28080,10 @@ var Client$1P = class {
28080
28080
  return {
28081
28081
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
28082
28082
  checkIsReadable();
28083
- return new Promise((resolve3, reject) => {
28083
+ return new Promise((resolve4, reject) => {
28084
28084
  const writableStream = fs.createWriteStream(filePath);
28085
28085
  writableStream.on("finish", () => {
28086
- resolve3(filePath);
28086
+ resolve4(filePath);
28087
28087
  });
28088
28088
  writableStream.on("error", (e) => {
28089
28089
  reject(e);
@@ -36923,10 +36923,10 @@ var Client$1H = class extends Client$1I {
36923
36923
  return {
36924
36924
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
36925
36925
  checkIsReadable();
36926
- return new Promise((resolve3, reject) => {
36926
+ return new Promise((resolve4, reject) => {
36927
36927
  const writableStream = fs.createWriteStream(filePath);
36928
36928
  writableStream.on("finish", () => {
36929
- resolve3(filePath);
36929
+ resolve4(filePath);
36930
36930
  });
36931
36931
  writableStream.on("error", (e) => {
36932
36932
  reject(e);
@@ -38105,10 +38105,10 @@ var Client$1H = class extends Client$1I {
38105
38105
  return {
38106
38106
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
38107
38107
  checkIsReadable();
38108
- return new Promise((resolve3, reject) => {
38108
+ return new Promise((resolve4, reject) => {
38109
38109
  const writableStream = fs.createWriteStream(filePath);
38110
38110
  writableStream.on("finish", () => {
38111
- resolve3(filePath);
38111
+ resolve4(filePath);
38112
38112
  });
38113
38113
  writableStream.on("error", (e) => {
38114
38114
  reject(e);
@@ -40311,10 +40311,10 @@ var Client$1B = class extends Client$1C {
40311
40311
  return {
40312
40312
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
40313
40313
  checkIsReadable();
40314
- return new Promise((resolve3, reject) => {
40314
+ return new Promise((resolve4, reject) => {
40315
40315
  const writableStream = fs.createWriteStream(filePath);
40316
40316
  writableStream.on("finish", () => {
40317
- resolve3(filePath);
40317
+ resolve4(filePath);
40318
40318
  });
40319
40319
  writableStream.on("error", (e) => {
40320
40320
  reject(e);
@@ -40837,10 +40837,10 @@ var Client$1B = class extends Client$1C {
40837
40837
  return {
40838
40838
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
40839
40839
  checkIsReadable();
40840
- return new Promise((resolve3, reject) => {
40840
+ return new Promise((resolve4, reject) => {
40841
40841
  const writableStream = fs.createWriteStream(filePath);
40842
40842
  writableStream.on("finish", () => {
40843
- resolve3(filePath);
40843
+ resolve4(filePath);
40844
40844
  });
40845
40845
  writableStream.on("error", (e) => {
40846
40846
  reject(e);
@@ -44858,10 +44858,10 @@ var Client$1x = class extends Client$1y {
44858
44858
  return {
44859
44859
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
44860
44860
  checkIsReadable();
44861
- return new Promise((resolve3, reject) => {
44861
+ return new Promise((resolve4, reject) => {
44862
44862
  const writableStream = fs.createWriteStream(filePath);
44863
44863
  writableStream.on("finish", () => {
44864
- resolve3(filePath);
44864
+ resolve4(filePath);
44865
44865
  });
44866
44866
  writableStream.on("error", (e) => {
44867
44867
  reject(e);
@@ -55831,10 +55831,10 @@ var Client$1l = class extends Client$1m {
55831
55831
  return {
55832
55832
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
55833
55833
  checkIsReadable();
55834
- return new Promise((resolve3, reject) => {
55834
+ return new Promise((resolve4, reject) => {
55835
55835
  const writableStream = fs.createWriteStream(filePath);
55836
55836
  writableStream.on("finish", () => {
55837
- resolve3(filePath);
55837
+ resolve4(filePath);
55838
55838
  });
55839
55839
  writableStream.on("error", (e) => {
55840
55840
  reject(e);
@@ -58588,10 +58588,10 @@ var Client$1l = class extends Client$1m {
58588
58588
  return {
58589
58589
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
58590
58590
  checkIsReadable();
58591
- return new Promise((resolve3, reject) => {
58591
+ return new Promise((resolve4, reject) => {
58592
58592
  const writableStream = fs.createWriteStream(filePath);
58593
58593
  writableStream.on("finish", () => {
58594
- resolve3(filePath);
58594
+ resolve4(filePath);
58595
58595
  });
58596
58596
  writableStream.on("error", (e) => {
58597
58597
  reject(e);
@@ -62027,10 +62027,10 @@ var Client$1l = class extends Client$1m {
62027
62027
  return {
62028
62028
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
62029
62029
  checkIsReadable();
62030
- return new Promise((resolve3, reject) => {
62030
+ return new Promise((resolve4, reject) => {
62031
62031
  const writableStream = fs.createWriteStream(filePath);
62032
62032
  writableStream.on("finish", () => {
62033
- resolve3(filePath);
62033
+ resolve4(filePath);
62034
62034
  });
62035
62035
  writableStream.on("error", (e) => {
62036
62036
  reject(e);
@@ -68652,10 +68652,10 @@ var Client$1c = class extends Client$1d {
68652
68652
  return {
68653
68653
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
68654
68654
  checkIsReadable();
68655
- return new Promise((resolve3, reject) => {
68655
+ return new Promise((resolve4, reject) => {
68656
68656
  const writableStream = fs.createWriteStream(filePath);
68657
68657
  writableStream.on("finish", () => {
68658
- resolve3(filePath);
68658
+ resolve4(filePath);
68659
68659
  });
68660
68660
  writableStream.on("error", (e) => {
68661
68661
  reject(e);
@@ -68904,10 +68904,10 @@ var Client$1c = class extends Client$1d {
68904
68904
  return {
68905
68905
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
68906
68906
  checkIsReadable();
68907
- return new Promise((resolve3, reject) => {
68907
+ return new Promise((resolve4, reject) => {
68908
68908
  const writableStream = fs.createWriteStream(filePath);
68909
68909
  writableStream.on("finish", () => {
68910
- resolve3(filePath);
68910
+ resolve4(filePath);
68911
68911
  });
68912
68912
  writableStream.on("error", (e) => {
68913
68913
  reject(e);
@@ -69525,10 +69525,10 @@ var Client$1c = class extends Client$1d {
69525
69525
  return {
69526
69526
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
69527
69527
  checkIsReadable();
69528
- return new Promise((resolve3, reject) => {
69528
+ return new Promise((resolve4, reject) => {
69529
69529
  const writableStream = fs.createWriteStream(filePath);
69530
69530
  writableStream.on("finish", () => {
69531
- resolve3(filePath);
69531
+ resolve4(filePath);
69532
69532
  });
69533
69533
  writableStream.on("error", (e) => {
69534
69534
  reject(e);
@@ -70471,10 +70471,10 @@ var Client$1c = class extends Client$1d {
70471
70471
  return {
70472
70472
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
70473
70473
  checkIsReadable();
70474
- return new Promise((resolve3, reject) => {
70474
+ return new Promise((resolve4, reject) => {
70475
70475
  const writableStream = fs.createWriteStream(filePath);
70476
70476
  writableStream.on("finish", () => {
70477
- resolve3(filePath);
70477
+ resolve4(filePath);
70478
70478
  });
70479
70479
  writableStream.on("error", (e) => {
70480
70480
  reject(e);
@@ -70723,10 +70723,10 @@ var Client$1c = class extends Client$1d {
70723
70723
  return {
70724
70724
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
70725
70725
  checkIsReadable();
70726
- return new Promise((resolve3, reject) => {
70726
+ return new Promise((resolve4, reject) => {
70727
70727
  const writableStream = fs.createWriteStream(filePath);
70728
70728
  writableStream.on("finish", () => {
70729
- resolve3(filePath);
70729
+ resolve4(filePath);
70730
70730
  });
70731
70731
  writableStream.on("error", (e) => {
70732
70732
  reject(e);
@@ -71350,10 +71350,10 @@ var Client$1c = class extends Client$1d {
71350
71350
  return {
71351
71351
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
71352
71352
  checkIsReadable();
71353
- return new Promise((resolve3, reject) => {
71353
+ return new Promise((resolve4, reject) => {
71354
71354
  const writableStream = fs.createWriteStream(filePath);
71355
71355
  writableStream.on("finish", () => {
71356
- resolve3(filePath);
71356
+ resolve4(filePath);
71357
71357
  });
71358
71358
  writableStream.on("error", (e) => {
71359
71359
  reject(e);
@@ -72189,10 +72189,10 @@ var Client$19 = class extends Client$1a {
72189
72189
  return {
72190
72190
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
72191
72191
  checkIsReadable();
72192
- return new Promise((resolve3, reject) => {
72192
+ return new Promise((resolve4, reject) => {
72193
72193
  const writableStream = fs.createWriteStream(filePath);
72194
72194
  writableStream.on("finish", () => {
72195
- resolve3(filePath);
72195
+ resolve4(filePath);
72196
72196
  });
72197
72197
  writableStream.on("error", (e) => {
72198
72198
  reject(e);
@@ -72325,10 +72325,10 @@ var Client$19 = class extends Client$1a {
72325
72325
  return {
72326
72326
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
72327
72327
  checkIsReadable();
72328
- return new Promise((resolve3, reject) => {
72328
+ return new Promise((resolve4, reject) => {
72329
72329
  const writableStream = fs.createWriteStream(filePath);
72330
72330
  writableStream.on("finish", () => {
72331
- resolve3(filePath);
72331
+ resolve4(filePath);
72332
72332
  });
72333
72333
  writableStream.on("error", (e) => {
72334
72334
  reject(e);
@@ -73160,10 +73160,10 @@ var Client$11 = class extends Client$12 {
73160
73160
  return {
73161
73161
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
73162
73162
  checkIsReadable();
73163
- return new Promise((resolve3, reject) => {
73163
+ return new Promise((resolve4, reject) => {
73164
73164
  const writableStream = fs.createWriteStream(filePath);
73165
73165
  writableStream.on("finish", () => {
73166
- resolve3(filePath);
73166
+ resolve4(filePath);
73167
73167
  });
73168
73168
  writableStream.on("error", (e) => {
73169
73169
  reject(e);
@@ -73558,10 +73558,10 @@ var Client$11 = class extends Client$12 {
73558
73558
  return {
73559
73559
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
73560
73560
  checkIsReadable();
73561
- return new Promise((resolve3, reject) => {
73561
+ return new Promise((resolve4, reject) => {
73562
73562
  const writableStream = fs.createWriteStream(filePath);
73563
73563
  writableStream.on("finish", () => {
73564
- resolve3(filePath);
73564
+ resolve4(filePath);
73565
73565
  });
73566
73566
  writableStream.on("error", (e) => {
73567
73567
  reject(e);
@@ -74598,10 +74598,10 @@ var Client$11 = class extends Client$12 {
74598
74598
  return {
74599
74599
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
74600
74600
  checkIsReadable();
74601
- return new Promise((resolve3, reject) => {
74601
+ return new Promise((resolve4, reject) => {
74602
74602
  const writableStream = fs.createWriteStream(filePath);
74603
74603
  writableStream.on("finish", () => {
74604
- resolve3(filePath);
74604
+ resolve4(filePath);
74605
74605
  });
74606
74606
  writableStream.on("error", (e) => {
74607
74607
  reject(e);
@@ -75000,10 +75000,10 @@ var Client$11 = class extends Client$12 {
75000
75000
  return {
75001
75001
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
75002
75002
  checkIsReadable();
75003
- return new Promise((resolve3, reject) => {
75003
+ return new Promise((resolve4, reject) => {
75004
75004
  const writableStream = fs.createWriteStream(filePath);
75005
75005
  writableStream.on("finish", () => {
75006
- resolve3(filePath);
75006
+ resolve4(filePath);
75007
75007
  });
75008
75008
  writableStream.on("error", (e) => {
75009
75009
  reject(e);
@@ -89699,10 +89699,10 @@ var Client$_ = class extends Client$$ {
89699
89699
  return {
89700
89700
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
89701
89701
  checkIsReadable();
89702
- return new Promise((resolve3, reject) => {
89702
+ return new Promise((resolve4, reject) => {
89703
89703
  const writableStream = fs.createWriteStream(filePath);
89704
89704
  writableStream.on("finish", () => {
89705
- resolve3(filePath);
89705
+ resolve4(filePath);
89706
89706
  });
89707
89707
  writableStream.on("error", (e) => {
89708
89708
  reject(e);
@@ -89937,10 +89937,10 @@ var Client$_ = class extends Client$$ {
89937
89937
  return {
89938
89938
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
89939
89939
  checkIsReadable();
89940
- return new Promise((resolve3, reject) => {
89940
+ return new Promise((resolve4, reject) => {
89941
89941
  const writableStream = fs.createWriteStream(filePath);
89942
89942
  writableStream.on("finish", () => {
89943
- resolve3(filePath);
89943
+ resolve4(filePath);
89944
89944
  });
89945
89945
  writableStream.on("error", (e) => {
89946
89946
  reject(e);
@@ -90022,10 +90022,10 @@ var Client$_ = class extends Client$$ {
90022
90022
  return {
90023
90023
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
90024
90024
  checkIsReadable();
90025
- return new Promise((resolve3, reject) => {
90025
+ return new Promise((resolve4, reject) => {
90026
90026
  const writableStream = fs.createWriteStream(filePath);
90027
90027
  writableStream.on("finish", () => {
90028
- resolve3(filePath);
90028
+ resolve4(filePath);
90029
90029
  });
90030
90030
  writableStream.on("error", (e) => {
90031
90031
  reject(e);
@@ -91844,10 +91844,10 @@ var Client$_ = class extends Client$$ {
91844
91844
  return {
91845
91845
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
91846
91846
  checkIsReadable();
91847
- return new Promise((resolve3, reject) => {
91847
+ return new Promise((resolve4, reject) => {
91848
91848
  const writableStream = fs.createWriteStream(filePath);
91849
91849
  writableStream.on("finish", () => {
91850
- resolve3(filePath);
91850
+ resolve4(filePath);
91851
91851
  });
91852
91852
  writableStream.on("error", (e) => {
91853
91853
  reject(e);
@@ -92084,10 +92084,10 @@ var Client$_ = class extends Client$$ {
92084
92084
  return {
92085
92085
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
92086
92086
  checkIsReadable();
92087
- return new Promise((resolve3, reject) => {
92087
+ return new Promise((resolve4, reject) => {
92088
92088
  const writableStream = fs.createWriteStream(filePath);
92089
92089
  writableStream.on("finish", () => {
92090
- resolve3(filePath);
92090
+ resolve4(filePath);
92091
92091
  });
92092
92092
  writableStream.on("error", (e) => {
92093
92093
  reject(e);
@@ -92169,10 +92169,10 @@ var Client$_ = class extends Client$$ {
92169
92169
  return {
92170
92170
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
92171
92171
  checkIsReadable();
92172
- return new Promise((resolve3, reject) => {
92172
+ return new Promise((resolve4, reject) => {
92173
92173
  const writableStream = fs.createWriteStream(filePath);
92174
92174
  writableStream.on("finish", () => {
92175
- resolve3(filePath);
92175
+ resolve4(filePath);
92176
92176
  });
92177
92177
  writableStream.on("error", (e) => {
92178
92178
  reject(e);
@@ -92674,10 +92674,10 @@ var Client$X = class extends Client$Y {
92674
92674
  return {
92675
92675
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
92676
92676
  checkIsReadable();
92677
- return new Promise((resolve3, reject) => {
92677
+ return new Promise((resolve4, reject) => {
92678
92678
  const writableStream = fs.createWriteStream(filePath);
92679
92679
  writableStream.on("finish", () => {
92680
- resolve3(filePath);
92680
+ resolve4(filePath);
92681
92681
  });
92682
92682
  writableStream.on("error", (e) => {
92683
92683
  reject(e);
@@ -99848,10 +99848,10 @@ var Client$Q = class extends Client$R {
99848
99848
  return {
99849
99849
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
99850
99850
  checkIsReadable();
99851
- return new Promise((resolve3, reject) => {
99851
+ return new Promise((resolve4, reject) => {
99852
99852
  const writableStream = fs.createWriteStream(filePath);
99853
99853
  writableStream.on("finish", () => {
99854
- resolve3(filePath);
99854
+ resolve4(filePath);
99855
99855
  });
99856
99856
  writableStream.on("error", (e) => {
99857
99857
  reject(e);
@@ -114511,10 +114511,10 @@ var Client$4 = class extends Client$5 {
114511
114511
  return {
114512
114512
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
114513
114513
  checkIsReadable();
114514
- return new Promise((resolve3, reject) => {
114514
+ return new Promise((resolve4, reject) => {
114515
114515
  const writableStream = fs.createWriteStream(filePath);
114516
114516
  writableStream.on("finish", () => {
114517
- resolve3(filePath);
114517
+ resolve4(filePath);
114518
114518
  });
114519
114519
  writableStream.on("error", (e) => {
114520
114520
  reject(e);
@@ -117842,10 +117842,10 @@ var Client$4 = class extends Client$5 {
117842
117842
  return {
117843
117843
  writeFile: (filePath) => __awaiter(this, void 0, void 0, function* () {
117844
117844
  checkIsReadable();
117845
- return new Promise((resolve3, reject) => {
117845
+ return new Promise((resolve4, reject) => {
117846
117846
  const writableStream = fs.createWriteStream(filePath);
117847
117847
  writableStream.on("finish", () => {
117848
- resolve3(filePath);
117848
+ resolve4(filePath);
117849
117849
  });
117850
117850
  writableStream.on("error", (e) => {
117851
117851
  reject(e);
@@ -121514,7 +121514,7 @@ var WSClient = class {
121514
121514
  if (!wsInstance) {
121515
121515
  return Promise.resolve(false);
121516
121516
  }
121517
- return new Promise((resolve3) => {
121517
+ return new Promise((resolve4) => {
121518
121518
  let settled = false;
121519
121519
  let timer;
121520
121520
  const settleOnce = (ok) => {
@@ -121523,7 +121523,7 @@ var WSClient = class {
121523
121523
  settled = true;
121524
121524
  if (timer)
121525
121525
  clearTimeout(timer);
121526
- resolve3(ok);
121526
+ resolve4(ok);
121527
121527
  };
121528
121528
  if (this.handshakeTimeoutMs && this.handshakeTimeoutMs > 0) {
121529
121529
  timer = setTimeout(() => {
@@ -126771,8 +126771,8 @@ var runPromiseExitWith = (context3) => {
126771
126771
  const runFork3 = runForkWith(context3);
126772
126772
  return (effect2, options2) => {
126773
126773
  const fiber3 = runFork3(effect2, options2);
126774
- return new Promise((resolve3) => {
126775
- fiber3.addObserver((exit3) => resolve3(exit3));
126774
+ return new Promise((resolve4) => {
126775
+ fiber3.addObserver((exit3) => resolve4(exit3));
126776
126776
  });
126777
126777
  };
126778
126778
  };
@@ -137127,9 +137127,9 @@ function toStandardSchemaV1(self2, options2) {
137127
137127
  if (exit3) {
137128
137128
  return makeStandardResult(exit3);
137129
137129
  }
137130
- return new Promise((resolve3) => {
137130
+ return new Promise((resolve4) => {
137131
137131
  fiber3.addObserver((exit4) => {
137132
- resolve3(makeStandardResult(exit4));
137132
+ resolve4(makeStandardResult(exit4));
137133
137133
  });
137134
137134
  });
137135
137135
  };
@@ -144024,9 +144024,15 @@ function resolveConfig2(raw, env = process.env, deps = {}) {
144024
144024
  const topicStatusInTitle = asBoolean(merged.topicStatusInTitle, false);
144025
144025
  const topicStatusThrottleMs = clamp4(asNumber(merged.topicStatusThrottleMs, 1e3), 500, 1e4);
144026
144026
  const cardMaxTables = clamp4(asNumber(merged.cardMaxTables, 4), 1, 5);
144027
+ const keepalive = asBoolean(merged.keepalive, true);
144028
+ const keepaliveIntervalMs = clamp4(
144029
+ asNumber(merged.keepaliveIntervalMs, 20 * 60 * 1e3),
144030
+ 5 * 60 * 1e3,
144031
+ 45 * 60 * 1e3
144032
+ );
144027
144033
  const domain = merged.domain === "lark" ? "lark" : "feishu";
144028
144034
  const logFile = resolveLogFile(merged.logFile, env, deps);
144029
- const gatewayLocation = asString(merged.gatewayLocation).trim() || void 0;
144035
+ const gatewayLocation = normalizeGatewayLocation(asString(merged.gatewayLocation));
144030
144036
  const signSecretRaw = expandEnv(asString(merged.signSecret), env);
144031
144037
  const signSecret = signSecretRaw && signSecretRaw.length > 0 ? signSecretRaw : deriveSignSecret(appSecret);
144032
144038
  let enabled = true;
@@ -144071,7 +144077,9 @@ function resolveConfig2(raw, env = process.env, deps = {}) {
144071
144077
  topicStatus,
144072
144078
  topicStatusInTitle,
144073
144079
  topicStatusThrottleMs,
144074
- cardMaxTables
144080
+ cardMaxTables,
144081
+ keepalive,
144082
+ keepaliveIntervalMs
144075
144083
  };
144076
144084
  }
144077
144085
  function loadConfigFile(env, deps, warnings) {
@@ -144114,6 +144122,17 @@ function resolveConfigDir(env, explicit) {
144114
144122
  if (fromEnv) return fromEnv;
144115
144123
  return join(homedir(), ".config", "opencode");
144116
144124
  }
144125
+ function normalizeGatewayLocation(raw) {
144126
+ const trimmed = raw.trim();
144127
+ if (!trimmed) return void 0;
144128
+ const expanded = trimmed === "~" ? homedir() : trimmed.startsWith("~/") ? join(homedir(), trimmed.slice(2)) : trimmed;
144129
+ const resolved = resolve$1(expanded);
144130
+ try {
144131
+ return realpathSync(resolved);
144132
+ } catch {
144133
+ return resolved;
144134
+ }
144135
+ }
144117
144136
  function resolveLogFile(raw, env, deps) {
144118
144137
  if (raw === true) return join(resolveConfigDir(env, deps.configDir), ...LOG_FILE_RELATIVE);
144119
144138
  if (typeof raw !== "string") return void 0;
@@ -144258,6 +144277,56 @@ function releaseProcessGuard() {
144258
144277
  const slot = g[GUARD_SLOT];
144259
144278
  if (slot) slot.active = false;
144260
144279
  }
144280
+ var GATEWAY_SEEN_SLOT = /* @__PURE__ */ Symbol.for("opencode-feishu-v2/gateway-seen");
144281
+ function trackGatewayLocationSeen(input) {
144282
+ const g = globalThis;
144283
+ let slot = g[GATEWAY_SEEN_SLOT];
144284
+ if (!slot || slot.expected !== input.expected) {
144285
+ if (slot) settle2(slot);
144286
+ slot = { expected: input.expected, seen: [], matched: false, warned: false, onSettled: [], timer: void 0 };
144287
+ g[GATEWAY_SEEN_SLOT] = slot;
144288
+ }
144289
+ const current = slot;
144290
+ if (!current.seen.includes(input.here)) current.seen = [...current.seen, input.here];
144291
+ if (input.matched) {
144292
+ current.matched = true;
144293
+ settle2(current);
144294
+ return;
144295
+ }
144296
+ if (current.matched || current.warned) {
144297
+ runOnSettled(input.onSettled);
144298
+ return;
144299
+ }
144300
+ if (input.onSettled) current.onSettled.push(input.onSettled);
144301
+ if (current.timer) clearTimeout(current.timer);
144302
+ current.timer = setTimeout(() => {
144303
+ const live = g[GATEWAY_SEEN_SLOT];
144304
+ if (live !== current) return;
144305
+ current.timer = void 0;
144306
+ if (current.matched || current.warned) return;
144307
+ current.warned = true;
144308
+ input.warn(
144309
+ `\u5DF2\u914D\u7F6E gatewayLocation="${current.expected}"\uFF0C\u4F46\u5DF2\u52A0\u8F7D\u7684 location \u5747\u672A\u547D\u4E2D\uFF1A[${current.seen.join(", ") || "(\u65E0)"}]\u3002\u98DE\u4E66\u957F\u8FDE\u63A5\u4E0D\u4F1A\u542F\u52A8\uFF08\u673A\u5668\u4EBA\u65E0\u54CD\u5E94\uFF09\u3002\u8BF7\u786E\u8BA4 gatewayLocation \u662F\u5B9E\u9645\u6253\u5F00 opencode \u7684\u76EE\u5F55\u6216\u5176\u7236\u76EE\u5F55\uFF1B\u7559\u7A7A\u5219\u4EFB\u610F location \u751F\u6548\u3002`
144310
+ );
144311
+ runOnSettled(...current.onSettled.splice(0));
144312
+ }, input.delayMs ?? 2e3);
144313
+ }
144314
+ function settle2(slot) {
144315
+ if (slot.timer) {
144316
+ clearTimeout(slot.timer);
144317
+ slot.timer = void 0;
144318
+ }
144319
+ runOnSettled(...slot.onSettled.splice(0));
144320
+ }
144321
+ function runOnSettled(...callbacks) {
144322
+ for (const cb of callbacks) {
144323
+ if (!cb) continue;
144324
+ try {
144325
+ cb();
144326
+ } catch {
144327
+ }
144328
+ }
144329
+ }
144261
144330
 
144262
144331
  // src/security/allowlist.ts
144263
144332
  var OWNER_STORAGE_KEY = "feishu:v2:owner";
@@ -145064,10 +145133,18 @@ function createFeishuSender(client, log2, options2 = {}) {
145064
145133
  }
145065
145134
  },
145066
145135
  async deleteMessage(messageId) {
145067
- if (!messageId) return;
145136
+ if (!messageId) return { ok: false, error: "missing messageId" };
145068
145137
  try {
145069
- await client.im.message.delete({ path: { message_id: messageId } });
145070
- } catch {
145138
+ const res = await client.im.message.delete({ path: { message_id: messageId } });
145139
+ if (res?.code && res.code !== 0) {
145140
+ log2.debug("\u64A4\u56DE\u6D88\u606F\u5931\u8D25", { messageId, code: res.code, msg: res.msg });
145141
+ return { ok: false, error: `code=${res.code} msg=${res.msg ?? ""}` };
145142
+ }
145143
+ return { ok: true };
145144
+ } catch (err2) {
145145
+ const error = describeLarkError(err2);
145146
+ log2.debug("\u64A4\u56DE\u6D88\u606F\u5F02\u5E38", { messageId, error });
145147
+ return { ok: false, error };
145071
145148
  }
145072
145149
  }
145073
145150
  };
@@ -145243,6 +145320,25 @@ var SessionMap = class {
145243
145320
  await this.persist(chatId, record2);
145244
145321
  await this.safeSet(`${SESSION_KEY_PREFIX}${sessionID}`, serializeSession(link2));
145245
145322
  }
145323
+ /**
145324
+ * 为**外部来源**的会话(TUI/Web,无飞书映射)补一条会话索引(P7.5)。
145325
+ *
145326
+ * `/ls` 列出 opencode 全量会话后,用户「进入话题」的会话需要审批投递、
145327
+ * 跨 location 路由(`dir`)与失败通知的目标。已存在则只补缺失字段,
145328
+ * **不覆盖** perm/gateMode/model 等既有元数据。
145329
+ */
145330
+ async ensureSessionLink(sessionID, input) {
145331
+ if (!sessionID || !input.chatId) return;
145332
+ const existing = await this.resolveBySession(sessionID);
145333
+ const link2 = {
145334
+ ...existing,
145335
+ chatId: input.chatId,
145336
+ openId: input.openId,
145337
+ ...input.directory ? { dir: input.directory } : {}
145338
+ };
145339
+ this.remember(sessionID, link2);
145340
+ await this.safeSet(`${SESSION_KEY_PREFIX}${sessionID}`, serializeSession(link2));
145341
+ }
145246
145342
  /** 切换当前会话;会话不属于该 chat 时返回 false。 */
145247
145343
  async setActive(chatId, sessionID) {
145248
145344
  const record2 = await this.loadChat(chatId);
@@ -146752,7 +146848,7 @@ var FormRelay = class {
146752
146848
  return false;
146753
146849
  }
146754
146850
  const field = pending.form.fields.find((f) => f.key === fieldKey);
146755
- pending.answers[fieldKey] = coerceText(field?.type, text);
146851
+ pending.answers[fieldKey] = coerceAnswer(field, text);
146756
146852
  pending.awaitingField = void 0;
146757
146853
  this.awaiting.delete(sessionID);
146758
146854
  if (isComplete(pending.form, pending.answers)) {
@@ -146776,7 +146872,7 @@ var FormRelay = class {
146776
146872
  }
146777
146873
  this.awaiting.delete(sessionID ?? pending.sessionID);
146778
146874
  this.forms.delete(id2);
146779
- void this.patch(pending, buildFormResolvedCard(pending.form, pending.answers, "answered"));
146875
+ void this.finish(pending, "answered");
146780
146876
  }
146781
146877
  /** 处理 `form.cancelled`。 */
146782
146878
  onCancelled(data) {
@@ -146786,7 +146882,7 @@ var FormRelay = class {
146786
146882
  if (!pending) return;
146787
146883
  this.awaiting.delete(sessionID ?? pending.sessionID);
146788
146884
  this.forms.delete(id2);
146789
- void this.patch(pending, buildFormResolvedCard(pending.form, pending.answers, "cancelled"));
146885
+ void this.finish(pending, "cancelled");
146790
146886
  }
146791
146887
  dispose() {
146792
146888
  this.disposed = true;
@@ -146807,6 +146903,13 @@ var FormRelay = class {
146807
146903
  error: errorMessage(err2)
146808
146904
  });
146809
146905
  pending.settled = false;
146906
+ const missing2 = pending.form.fields.find(
146907
+ (f) => f.hidden !== true && pending.answers[f.key] === void 0
146908
+ );
146909
+ if (missing2) {
146910
+ pending.awaitingField = missing2.key;
146911
+ this.awaiting.set(pending.sessionID, pending.form.id);
146912
+ }
146810
146913
  this.forms.set(pending.form.id, pending);
146811
146914
  await this.patch(
146812
146915
  pending,
@@ -146815,7 +146918,20 @@ var FormRelay = class {
146815
146918
  return;
146816
146919
  }
146817
146920
  this.forms.delete(pending.form.id);
146818
- await this.patch(pending, buildFormResolvedCard(pending.form, pending.answers, "answered"));
146921
+ await this.finish(pending, "answered");
146922
+ }
146923
+ /**
146924
+ * 表单收敛:**优先撤回卡片**(作答/取消后不再残留待填卡),撤回失败(超时限/无权限)
146925
+ * 才降级 patch 成结果卡,避免卡片永久停在待填态。
146926
+ */
146927
+ async finish(pending, outcome) {
146928
+ if (this.disposed) return;
146929
+ const res = await this.deps.sender.deleteMessage(pending.messageId);
146930
+ if (res.ok) {
146931
+ this.deps.log.debug("\u8868\u5355\u5361\u5DF2\u64A4\u56DE", { formID: pending.form.id, outcome });
146932
+ return;
146933
+ }
146934
+ await this.patch(pending, buildFormResolvedCard(pending.form, pending.answers, outcome));
146819
146935
  }
146820
146936
  async patch(pending, card) {
146821
146937
  if (this.disposed) return;
@@ -146829,17 +146945,47 @@ function isFormValue(value3) {
146829
146945
  if (typeof value3 === "string" || typeof value3 === "number" || typeof value3 === "boolean") return true;
146830
146946
  return Array.isArray(value3) && value3.every((x) => typeof x === "string");
146831
146947
  }
146832
- function coerceText(type, text) {
146948
+ function coerceAnswer(field, text) {
146833
146949
  const trimmed = text.trim();
146834
- if (type === "number") {
146835
- const n = Number(trimmed);
146836
- return Number.isFinite(n) ? n : text;
146837
- }
146838
- if (type === "integer") {
146839
- const n = Number.parseInt(trimmed, 10);
146840
- return Number.isFinite(n) && String(n) === trimmed ? n : text;
146950
+ if (!field) return trimmed;
146951
+ switch (field.type) {
146952
+ case "number": {
146953
+ const n = Number(trimmed);
146954
+ return trimmed !== "" && Number.isFinite(n) ? n : trimmed;
146955
+ }
146956
+ case "integer": {
146957
+ const n = Number.parseInt(trimmed, 10);
146958
+ return Number.isFinite(n) && String(n) === trimmed ? n : trimmed;
146959
+ }
146960
+ case "boolean": {
146961
+ const parsed = parseBooleanText(trimmed);
146962
+ return parsed === void 0 ? trimmed : parsed;
146963
+ }
146964
+ case "multiselect": {
146965
+ const parts = trimmed.split(/[、,,;;\n]+/).map((s) => s.trim()).filter(Boolean);
146966
+ if (parts.length === 0) return trimmed;
146967
+ return parts.map((p) => matchOption(field, p) ?? p);
146968
+ }
146969
+ default:
146970
+ return matchOption(field, trimmed) ?? trimmed;
146841
146971
  }
146842
- return text;
146972
+ }
146973
+ function matchOption(field, text) {
146974
+ if (!field.options?.length) return void 0;
146975
+ const trimmed = text.trim();
146976
+ const lower = trimmed.toLowerCase();
146977
+ const hit = field.options.find(
146978
+ (o) => o.value === trimmed || o.label.trim() === trimmed || o.label.trim().toLowerCase() === lower
146979
+ );
146980
+ return hit?.value;
146981
+ }
146982
+ var TRUE_WORDS = /* @__PURE__ */ new Set(["\u662F", "\u5BF9", "\u597D", "\u53EF\u4EE5", "\u5141\u8BB8", "\u786E\u8BA4", "\u540C\u610F", "yes", "y", "true", "1"]);
146983
+ var FALSE_WORDS = /* @__PURE__ */ new Set(["\u5426", "\u4E0D", "\u4E0D\u884C", "\u62D2\u7EDD", "\u53D6\u6D88", "\u4E0D\u8981", "no", "n", "false", "0"]);
146984
+ function parseBooleanText(text) {
146985
+ const lower = text.trim().toLowerCase();
146986
+ if (TRUE_WORDS.has(lower)) return true;
146987
+ if (FALSE_WORDS.has(lower)) return false;
146988
+ return void 0;
146843
146989
  }
146844
146990
  function serviceStatePath(env = process.env) {
146845
146991
  const base2 = env["XDG_STATE_HOME"] ?? join(homedir(), ".local", "state");
@@ -146899,6 +147045,126 @@ async function replyFormOverHttp(input, deps) {
146899
147045
  }
146900
147046
  }
146901
147047
 
147048
+ // src/session/session-list-http.ts
147049
+ async function listSessionsOverHttp(input, deps) {
147050
+ const discover = deps.discover ?? (() => discoverLocalService());
147051
+ const doFetch = deps.fetchImpl ?? fetch;
147052
+ const service3 = await discover();
147053
+ if (!service3) {
147054
+ deps.log.debug("\u672A\u53D1\u73B0\u672C\u673A opencode \u670D\u52A1\uFF0CHTTP \u4F1A\u8BDD\u5217\u8868\u8DF3\u8FC7");
147055
+ return void 0;
147056
+ }
147057
+ const params = new URLSearchParams();
147058
+ params.set("limit", String(input.limit ?? 200));
147059
+ params.set("order", input.order ?? "desc");
147060
+ if (input.rootsOnly ?? true) params.set("parentID", "null");
147061
+ try {
147062
+ const response2 = await doFetch(`${service3.url}/api/session?${params.toString()}`, {
147063
+ method: "GET",
147064
+ headers: { ...authHeaders(service3) },
147065
+ signal: AbortSignal.timeout(deps.timeoutMs ?? 8e3)
147066
+ });
147067
+ if (!response2.ok) {
147068
+ deps.log.debug("HTTP \u4F1A\u8BDD\u5217\u8868\u5931\u8D25", { status: response2.status });
147069
+ return void 0;
147070
+ }
147071
+ return await response2.json();
147072
+ } catch (err2) {
147073
+ deps.log.debug("HTTP \u4F1A\u8BDD\u5217\u8868\u5F02\u5E38", { error: errorMessage(err2) });
147074
+ return void 0;
147075
+ }
147076
+ }
147077
+
147078
+ // src/session/keepalive.ts
147079
+ var KEEPALIVE_SESSION_TITLE = "__opencode_feishu_keepalive__";
147080
+ async function touchLocationOverHttp(directory, deps) {
147081
+ const discover = deps.discover ?? (() => discoverLocalService());
147082
+ const doFetch = deps.fetchImpl ?? fetch;
147083
+ const service3 = await discover();
147084
+ if (!service3) {
147085
+ deps.log.debug("\u4FDD\u6D3B\u8DF3\u8FC7\uFF1A\u672A\u53D1\u73B0\u672C\u673A opencode \u670D\u52A1");
147086
+ return false;
147087
+ }
147088
+ const headers = {
147089
+ "content-type": "application/json",
147090
+ ...authHeaders(service3)
147091
+ };
147092
+ const timeout3 = deps.timeoutMs ?? 8e3;
147093
+ const signal = () => AbortSignal.timeout(timeout3);
147094
+ let touched = false;
147095
+ try {
147096
+ const params = new URLSearchParams({ limit: "1", parentID: "null" });
147097
+ if (directory) params.set("directory", directory);
147098
+ const listRes = await doFetch(`${service3.url}/api/session?${params.toString()}`, {
147099
+ method: "GET",
147100
+ headers,
147101
+ signal: signal()
147102
+ });
147103
+ if (listRes.ok) {
147104
+ const list = await listRes.json().catch(() => void 0);
147105
+ const target = list?.data?.[0]?.id;
147106
+ if (target) {
147107
+ const getRes = await doFetch(`${service3.url}/api/session/${encodeURIComponent(target)}`, {
147108
+ method: "GET",
147109
+ headers,
147110
+ signal: signal()
147111
+ });
147112
+ touched = getRes.ok;
147113
+ }
147114
+ }
147115
+ } catch (err2) {
147116
+ deps.log.debug("\u4FDD\u6D3B\u4F1A\u8BDD\u7EA7\u7EED\u671F\u5931\u8D25", { directory, error: errorMessage(err2) });
147117
+ }
147118
+ let sessionID;
147119
+ try {
147120
+ const response2 = await doFetch(`${service3.url}/api/session`, {
147121
+ method: "POST",
147122
+ headers,
147123
+ body: JSON.stringify({
147124
+ title: KEEPALIVE_SESSION_TITLE,
147125
+ ...directory ? { location: { directory } } : {}
147126
+ }),
147127
+ signal: signal()
147128
+ });
147129
+ if (response2.ok) {
147130
+ const body = await response2.json().catch(() => void 0);
147131
+ sessionID = body?.data?.id;
147132
+ touched = true;
147133
+ } else {
147134
+ deps.log.debug("\u4FDD\u6D3B\u63A2\u9488\u521B\u5EFA\u5931\u8D25", { status: response2.status, directory });
147135
+ }
147136
+ } catch (err2) {
147137
+ deps.log.debug("\u4FDD\u6D3B\u63A2\u9488\u521B\u5EFA\u5F02\u5E38", { directory, error: errorMessage(err2) });
147138
+ }
147139
+ if (sessionID) {
147140
+ try {
147141
+ await doFetch(`${service3.url}/api/session/${encodeURIComponent(sessionID)}`, {
147142
+ method: "DELETE",
147143
+ headers,
147144
+ signal: signal()
147145
+ });
147146
+ } catch {
147147
+ }
147148
+ }
147149
+ if (touched) deps.log.debug("\u4FDD\u6D3B\u5FC3\u8DF3\u5DF2\u53D1\u9001", { directory, probe: sessionID ?? "(none)" });
147150
+ return touched;
147151
+ }
147152
+ function startKeepalive(deps) {
147153
+ const setIntervalImpl = deps.setIntervalImpl ?? setInterval;
147154
+ const clearIntervalImpl = deps.clearIntervalImpl ?? clearInterval;
147155
+ const touch = deps.touch ?? ((dir) => touchLocationOverHttp(dir, { log: deps.log }));
147156
+ const timer = setIntervalImpl(() => {
147157
+ void touch(deps.directory).catch((err2) => {
147158
+ deps.log.debug("\u4FDD\u6D3B\u5FC3\u8DF3\u5F02\u5E38", { error: errorMessage(err2) });
147159
+ });
147160
+ }, deps.intervalMs);
147161
+ timer.unref?.();
147162
+ deps.log.info("\u4F4D\u7F6E\u4FDD\u6D3B\u5DF2\u542F\u52A8", { directory: deps.directory, intervalMs: deps.intervalMs });
147163
+ return () => {
147164
+ clearIntervalImpl(timer);
147165
+ };
147166
+ }
147167
+
146902
147168
  // src/feishu/commands.ts
146903
147169
  var ALIASES = {
146904
147170
  new: "new",
@@ -149391,28 +149657,53 @@ async function cmdSessions(ctx, message, page = 0) {
149391
149657
  }
149392
149658
  }
149393
149659
  async function loadSessionEntries(ctx, chatId) {
149394
- if (ctx.deps.listAllSessions) {
149395
- try {
149396
- const raw = await ctx.deps.listAllSessions();
149397
- const normalized = normalizeSessionList(raw);
149398
- if (normalized) {
149399
- ctx.deps.log.info("\u5217\u51FA\u5168\u90E8\u4F1A\u8BDD", { count: normalized.length, source: "session.list" });
149400
- return normalized;
149401
- }
149402
- ctx.deps.log.warn("session.list \u8FD4\u56DE\u5F62\u72B6\u65E0\u6CD5\u8BC6\u522B\uFF0C\u56DE\u9000 SessionMap \u5217\u8868", { chatId });
149403
- } catch (err2) {
149404
- ctx.deps.log.warn("session.list \u8C03\u7528\u5931\u8D25\uFF0C\u56DE\u9000 SessionMap \u5217\u8868", {
149405
- chatId,
149406
- error: errorMessage(err2)
149407
- });
149408
- }
149409
- } else {
149410
- ctx.deps.log.warn("\u8FD0\u884C\u65F6\u672A\u66B4\u9732 session.list\uFF0C\u56DE\u9000 SessionMap \u5217\u8868", { chatId });
149411
- }
149660
+ const viaApi = await loadViaSessionListApi(ctx, chatId);
149661
+ if (viaApi) return viaApi;
149662
+ const viaHttp = await loadViaHttp(ctx, chatId);
149663
+ if (viaHttp) return viaHttp;
149412
149664
  const fallback = fallbackEntries(await ctx.deps.sessionMap.listSessions(chatId));
149413
149665
  ctx.deps.log.warn("\u4F1A\u8BDD\u5217\u8868\u56DE\u9000\u5230 SessionMap", { chatId, count: fallback.length });
149414
149666
  return fallback;
149415
149667
  }
149668
+ async function loadViaSessionListApi(ctx, chatId) {
149669
+ if (!ctx.deps.listAllSessions) {
149670
+ ctx.deps.log.warn("\u8FD0\u884C\u65F6\u672A\u66B4\u9732 session.list\uFF0C\u5C1D\u8BD5 HTTP \u515C\u5E95", { chatId });
149671
+ return void 0;
149672
+ }
149673
+ try {
149674
+ const raw = await ctx.deps.listAllSessions();
149675
+ const normalized = normalizeSessionList(raw);
149676
+ if (normalized) {
149677
+ ctx.deps.log.info("\u5217\u51FA\u5168\u90E8\u4F1A\u8BDD", { count: normalized.length, source: "session.list" });
149678
+ return normalized;
149679
+ }
149680
+ ctx.deps.log.warn("session.list \u8FD4\u56DE\u5F62\u72B6\u65E0\u6CD5\u8BC6\u522B\uFF0C\u5C1D\u8BD5 HTTP \u515C\u5E95", { chatId });
149681
+ } catch (err2) {
149682
+ ctx.deps.log.warn("session.list \u8C03\u7528\u5931\u8D25\uFF0C\u5C1D\u8BD5 HTTP \u515C\u5E95", {
149683
+ chatId,
149684
+ error: errorMessage(err2)
149685
+ });
149686
+ }
149687
+ return void 0;
149688
+ }
149689
+ async function loadViaHttp(ctx, chatId) {
149690
+ if (!ctx.deps.listAllSessionsHttp) return void 0;
149691
+ try {
149692
+ const raw = await ctx.deps.listAllSessionsHttp();
149693
+ const normalized = normalizeSessionList(raw);
149694
+ if (normalized) {
149695
+ ctx.deps.log.info("\u5217\u51FA\u5168\u90E8\u4F1A\u8BDD", { count: normalized.length, source: "http" });
149696
+ return normalized;
149697
+ }
149698
+ ctx.deps.log.warn("HTTP \u4F1A\u8BDD\u5217\u8868\u5F62\u72B6\u65E0\u6CD5\u8BC6\u522B\uFF0C\u56DE\u9000 SessionMap \u5217\u8868", { chatId });
149699
+ } catch (err2) {
149700
+ ctx.deps.log.warn("HTTP \u4F1A\u8BDD\u5217\u8868\u8C03\u7528\u5931\u8D25\uFF0C\u56DE\u9000 SessionMap \u5217\u8868", {
149701
+ chatId,
149702
+ error: errorMessage(err2)
149703
+ });
149704
+ }
149705
+ return void 0;
149706
+ }
149416
149707
  async function buildListCard(ctx, chatId, entries3, page, activeID) {
149417
149708
  const pageSize = ctx.sessionPageSize;
149418
149709
  const pageCount = Math.max(1, Math.ceil(entries3.length / pageSize));
@@ -149449,6 +149740,13 @@ async function enterSessionThread(ctx, input) {
149449
149740
  const info = input.info;
149450
149741
  const link2 = await ctx.deps.sessionMap.resolveBySession(sessionID);
149451
149742
  const dir = info?.directory ?? link2?.dir;
149743
+ if (!link2) {
149744
+ await ctx.deps.sessionMap.ensureSessionLink(sessionID, {
149745
+ chatId,
149746
+ openId: operatorOpenId,
149747
+ ...dir ? { directory: dir } : {}
149748
+ });
149749
+ }
149452
149750
  const showSummary = (ctx.deps.resumeSummary ?? true) && Boolean(ctx.deps.summarizeSession);
149453
149751
  const onLimit = (report) => {
149454
149752
  ctx.deps.log.warn("\u4F1A\u8BDD\u6062\u590D\u5361\u5185\u5BB9\u8D85\u9650\uFF0C\u5DF2\u964D\u7EA7", { sessionID, ...report });
@@ -150096,13 +150394,13 @@ var SummaryTimeoutError = class extends Error {
150096
150394
  }
150097
150395
  };
150098
150396
  function withTimeout(promise3, ms) {
150099
- return new Promise((resolve3, reject) => {
150397
+ return new Promise((resolve4, reject) => {
150100
150398
  const timer = setTimeout(() => reject(new SummaryTimeoutError()), Math.max(1, ms));
150101
150399
  timer.unref?.();
150102
150400
  promise3.then(
150103
150401
  (value3) => {
150104
150402
  clearTimeout(timer);
150105
- resolve3(value3);
150403
+ resolve4(value3);
150106
150404
  },
150107
150405
  (err2) => {
150108
150406
  clearTimeout(timer);
@@ -150234,7 +150532,7 @@ var CompactController = class {
150234
150532
  constructor(deps) {
150235
150533
  this.deps = deps;
150236
150534
  this.now = deps.now ?? (() => Date.now());
150237
- this.sleep = deps.sleep ?? ((ms) => new Promise((resolve3) => setTimeout(resolve3, ms)));
150535
+ this.sleep = deps.sleep ?? ((ms) => new Promise((resolve4) => setTimeout(resolve4, ms)));
150238
150536
  }
150239
150537
  deps;
150240
150538
  now;
@@ -150575,13 +150873,13 @@ async function quickGenerateWithSession(deps, input) {
150575
150873
  return { route: "http", result: result3 };
150576
150874
  }
150577
150875
  function withAttemptTimeout(promise3, ms) {
150578
- return new Promise((resolve3, reject) => {
150876
+ return new Promise((resolve4, reject) => {
150579
150877
  const timer = setTimeout(() => reject(new Error("generate-attempt-timeout")), Math.max(1, ms));
150580
150878
  timer.unref?.();
150581
150879
  promise3.then(
150582
150880
  (value3) => {
150583
150881
  clearTimeout(timer);
150584
- resolve3(value3);
150882
+ resolve4(value3);
150585
150883
  },
150586
150884
  (err2) => {
150587
150885
  clearTimeout(timer);
@@ -150619,11 +150917,20 @@ var index_default = plugin_exports.define({
150619
150917
  hasAppSecret: hasSecret(config.appSecret)
150620
150918
  });
150621
150919
  const here = ctx.location?.directory;
150622
- if (config.gatewayLocation && here !== config.gatewayLocation) {
150623
- log2.debug("\u8DF3\u8FC7\u975E\u7F51\u5173 location", { here, expected: config.gatewayLocation });
150624
- logSink?.close();
150625
- return async () => {
150626
- };
150920
+ if (config.gatewayLocation) {
150921
+ const matched = Boolean(here) && isUnder(here, config.gatewayLocation);
150922
+ trackGatewayLocationSeen({
150923
+ here: here ?? "(unknown)",
150924
+ expected: config.gatewayLocation,
150925
+ matched,
150926
+ warn: (message) => log2.warn(message),
150927
+ ...matched ? {} : { onSettled: () => logSink?.close() }
150928
+ });
150929
+ if (!matched) {
150930
+ log2.debug("\u8DF3\u8FC7\u975E\u7F51\u5173 location", { here, expected: config.gatewayLocation });
150931
+ return async () => {
150932
+ };
150933
+ }
150627
150934
  }
150628
150935
  if (!acquireProcessGuard()) {
150629
150936
  log2.debug("\u68C0\u6D4B\u5230\u540C\u8FDB\u7A0B\u91CD\u590D setup\uFF0C\u8DF3\u8FC7\u542F\u52A8\uFF08\u4EC5\u9996\u4E2A\u5B9E\u4F8B\u751F\u6548\uFF09");
@@ -150939,6 +151246,9 @@ async function start(ctx, config, log2, logSink) {
150939
151246
  sessionPageSize: config.sessionPageSize,
150940
151247
  threadRouting: config.threadRouting,
150941
151248
  listAllSessions: listAllSessionsRaw,
151249
+ // `ctx.session.list` 在 V2 运行时未暴露 → 本机 HTTP `GET /api/session`
151250
+ // 兜底列出全量会话(含 TUI/Web 来源)。
151251
+ listAllSessionsHttp: () => listSessionsOverHttp({}, { log: log2 }),
150942
151252
  getSessionInfo: getSessionInfoRaw,
150943
151253
  resumeSummary: config.resumeSummary,
150944
151254
  resumeSummaryTimeoutMs: config.resumeSummaryTimeoutMs,
@@ -151175,6 +151485,13 @@ async function start(ctx, config, log2, logSink) {
151175
151485
  const res = link2.replyMessageId ? await sender.replyCard(link2.replyMessageId, card) : await sender.sendCard(link2.chatId, card);
151176
151486
  if (!res.ok) log2.warn("\u5361\u6B7B\u63D0\u793A\u5361\u53D1\u9001\u5931\u8D25", { sessionID, error: res.error ?? "unknown" });
151177
151487
  }
151488
+ const here = ctx.location?.directory;
151489
+ const keepaliveDirectory = here ?? config.gatewayLocation;
151490
+ const stopKeepalive = config.keepalive && keepaliveDirectory ? startKeepalive({
151491
+ log: log2,
151492
+ directory: keepaliveDirectory,
151493
+ intervalMs: config.keepaliveIntervalMs
151494
+ }) : void 0;
151178
151495
  log2.info("\u98DE\u4E66\u63D2\u4EF6\u5DF2\u5C31\u7EEA");
151179
151496
  let cleanedUp = false;
151180
151497
  return async () => {
@@ -151183,6 +151500,7 @@ async function start(ctx, config, log2, logSink) {
151183
151500
  log2.info("\u98DE\u4E66\u63D2\u4EF6\u5378\u8F7D\u4E2D");
151184
151501
  abort.abort();
151185
151502
  stopWatchdog();
151503
+ stopKeepalive?.();
151186
151504
  await subscription.catch(() => void 0);
151187
151505
  runs.dispose();
151188
151506
  executions.clear();