oasis_test_v2 2.2.107 → 2.2.108

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 (2) hide show
  1. package/dist/index.js +50 -6
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -206747,6 +206747,35 @@ var init_host_isolation = __esm({
206747
206747
  });
206748
206748
 
206749
206749
  // ../connectors/src/feishu/index.ts
206750
+ async function fetchFeishuTenantAccessToken(appId, appSecret) {
206751
+ try {
206752
+ const resp = await fetch(FEISHU_TENANT_TOKEN_URL, {
206753
+ method: "POST",
206754
+ headers: { "Content-Type": "application/json; charset=utf-8" },
206755
+ body: JSON.stringify({ app_id: appId, app_secret: appSecret }),
206756
+ signal: AbortSignal.timeout(TENANT_TOKEN_TIMEOUT_MS)
206757
+ });
206758
+ const data = await resp.json();
206759
+ if (!resp.ok || data.code !== 0 || typeof data.tenant_access_token !== "string" || !data.tenant_access_token) {
206760
+ log("[feishu]", `\u6362\u4F01\u4E1A token \u5931\u8D25\uFF08\u672C\u8F6E bot \u8EAB\u4EFD\u4E0D\u53EF\u7528\uFF09: HTTP ${resp.status} code=${String(data.code)} ${String(data.msg ?? "")}`.trim());
206761
+ return null;
206762
+ }
206763
+ return data.tenant_access_token;
206764
+ } catch (err) {
206765
+ log("[feishu]", `\u6362\u4F01\u4E1A token \u5931\u8D25\uFF08\u672C\u8F6E bot \u8EAB\u4EFD\u4E0D\u53EF\u7528\uFF09: ${String(err?.message ?? err).slice(0, 200)}`);
206766
+ return null;
206767
+ }
206768
+ }
206769
+ function previousTenantToken(credsFile, appId) {
206770
+ if (!credsFile) return null;
206771
+ try {
206772
+ const prev = readSessionCredsFile(credsFile);
206773
+ if (prev["LARKSUITE_CLI_APP_ID"] !== appId) return null;
206774
+ return prev["LARKSUITE_CLI_TENANT_ACCESS_TOKEN"] || null;
206775
+ } catch {
206776
+ return null;
206777
+ }
206778
+ }
206750
206779
  function parseFeishuTokenResponse(data, nowMs) {
206751
206780
  const accessToken = String(data["access_token"] ?? "");
206752
206781
  const refreshToken = String(data["refresh_token"] ?? "");
@@ -206765,7 +206794,7 @@ function parseFeishuTokenResponse(data, nowMs) {
206765
206794
  expiresAt: new Date(expiresAtMs)
206766
206795
  };
206767
206796
  }
206768
- var import_node_child_process14, import_node_util4, import_node_path16, import_node_url3, import_promises9, execFileAsync2, __dirname2, FEISHU_WELL_KNOWN_SKILLS_BASE, FEISHU_TOKEN_URL, FeishuConnector;
206797
+ var import_node_child_process14, import_node_util4, import_node_path16, import_node_url3, import_promises9, execFileAsync2, __dirname2, FEISHU_WELL_KNOWN_SKILLS_BASE, FEISHU_TOKEN_URL, FEISHU_TENANT_TOKEN_URL, TENANT_TOKEN_TIMEOUT_MS, FeishuConnector;
206769
206798
  var init_feishu = __esm({
206770
206799
  "../connectors/src/feishu/index.ts"() {
206771
206800
  "use strict";
@@ -206775,10 +206804,13 @@ var init_feishu = __esm({
206775
206804
  import_node_url3 = require("node:url");
206776
206805
  import_promises9 = require("node:fs/promises");
206777
206806
  init_base();
206807
+ init_logger();
206778
206808
  execFileAsync2 = (0, import_node_util4.promisify)(import_node_child_process14.execFile);
206779
206809
  __dirname2 = (0, import_node_path16.dirname)((0, import_node_url3.fileURLToPath)(__esm_import_meta_url));
206780
206810
  FEISHU_WELL_KNOWN_SKILLS_BASE = "https://open.feishu.cn/.well-known/skills";
206781
206811
  FEISHU_TOKEN_URL = "https://open.feishu.cn/open-apis/authen/v2/oauth/token";
206812
+ FEISHU_TENANT_TOKEN_URL = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal";
206813
+ TENANT_TOKEN_TIMEOUT_MS = 5e3;
206782
206814
  FeishuConnector = class extends CliConnector {
206783
206815
  config = {
206784
206816
  slug: "feishu",
@@ -206876,9 +206908,12 @@ var init_feishu = __esm({
206876
206908
  /** 厂商技能包源——平台自动拉取飞书官方技能包时用。 */
206877
206909
  wellKnownSkillsBase = FEISHU_WELL_KNOWN_SKILLS_BASE;
206878
206910
  larkBin;
206879
- constructor(larkBin) {
206911
+ fetchTenantToken;
206912
+ /** `fetchTenantToken` 只给测试替换(不打真飞书);生产一律用 {@link fetchFeishuTenantAccessToken}。 */
206913
+ constructor(larkBin, opts = {}) {
206880
206914
  super(__dirname2);
206881
206915
  this.larkBin = larkBin ?? this.resolveLarkBin();
206916
+ this.fetchTenantToken = opts.fetchTenantToken ?? fetchFeishuTenantAccessToken;
206882
206917
  }
206883
206918
  /**
206884
206919
  * 解析 user_info 的 JSON。lark-cli 的 `ok:false` 也是**退出码 0** 的正常输出,
@@ -206909,6 +206944,7 @@ var init_feishu = __esm({
206909
206944
  /**
206910
206945
  * Agent run 开始:把凭据作为 lark-cli「外部凭据」写进凭据文件(不进 agent env)。
206911
206946
  * credentials 接受:app_id, app_secret, user_access_token?(及其 FEISHU_* 别名)。
206947
+ * 企业 token 不随 job 下发,由这里用 app_id/app_secret 现换(换不到只是本轮没有 bot 身份,不抛)。
206912
206948
  *
206913
206949
  * 注入的 sessionEnv 键(全部非敏感):
206914
206950
  * FEISHU_CREDS_FILE — 凭据文件路径,wrapper source 它
@@ -206921,9 +206957,11 @@ var init_feishu = __esm({
206921
206957
  if (!appId) throw new Error("feishu inject: missing app_id");
206922
206958
  if (!appSecret) throw new Error("feishu inject: missing app_secret");
206923
206959
  const userAccessToken = credentials2["user_access_token"] ?? credentials2["FEISHU_USER_ACCESS_TOKEN"];
206960
+ const tenantAccessToken = this.isSimulated() ? null : await this.fetchTenantToken(appId, appSecret) ?? previousTenantToken(sessionEnv.get("FEISHU_CREDS_FILE"), appId);
206924
206961
  const creds = await writeSessionCredsFile(this.config.slug, {
206925
206962
  LARKSUITE_CLI_APP_ID: appId,
206926
206963
  LARKSUITE_CLI_APP_SECRET: appSecret,
206964
+ ...tenantAccessToken ? { LARKSUITE_CLI_TENANT_ACCESS_TOKEN: tenantAccessToken } : {},
206927
206965
  ...userAccessToken ? { LARKSUITE_CLI_USER_ACCESS_TOKEN: userAccessToken } : {}
206928
206966
  }, sessionEnv.get("FEISHU_RUN_TMPDIR"));
206929
206967
  const configDir = (0, import_node_path16.join)(creds.dir, "lark-config");
@@ -210646,7 +210684,7 @@ async function prepareConnectorsForJob(job, deps) {
210646
210684
  await connector.inject(credentials2, sessionEnv);
210647
210685
  for (const [k2, v2] of sessionEnv) envOverrides[k2] = v2;
210648
210686
  cleanups.push(() => connector.cleanup(sessionEnv));
210649
- injected.set(slug5, { connector, sessionEnv, credsFingerprint: credentialsFingerprint(credentials2) });
210687
+ injected.set(slug5, { connector, sessionEnv, credentials: credentials2, credsFingerprint: credentialsFingerprint(credentials2) });
210650
210688
  status.credsReady = true;
210651
210689
  } catch (err) {
210652
210690
  status.error = String(err);
@@ -210772,7 +210810,12 @@ async function renewInjectedCredentials(injected, fetchCredentials) {
210772
210810
  try {
210773
210811
  fresh = await fetchCredentials();
210774
210812
  } catch (err) {
210775
- for (const slug5 of injected.keys()) outcome.failed.push({ slug: slug5, error: String(err) });
210813
+ for (const [slug5, target] of injected) {
210814
+ outcome.failed.push({ slug: slug5, error: String(err) });
210815
+ await target.connector.inject(target.credentials, target.sessionEnv).catch((reErr) => {
210816
+ log("[node-connectors]", `\u26A0 \u7EED\u671F\uFF1A${slug5} \u6309\u65E7\u51ED\u636E\u91CD\u6CE8\u5931\u8D25: ${String(reErr)}`);
210817
+ });
210818
+ }
210776
210819
  log("[node-connectors]", `\u7EED\u671F\uFF1A\u5411 server \u53D6\u51ED\u636E\u5931\u8D25\uFF0C\u672C\u8F6E\u6CBF\u7528\u65E7\u51ED\u636E: ${String(err)}`);
210777
210820
  return outcome;
210778
210821
  }
@@ -210781,6 +210824,7 @@ async function renewInjectedCredentials(injected, fetchCredentials) {
210781
210824
  if (!target) continue;
210782
210825
  try {
210783
210826
  await target.connector.inject(credentials2, target.sessionEnv);
210827
+ target.credentials = credentials2;
210784
210828
  const fingerprint2 = credentialsFingerprint(credentials2);
210785
210829
  if (fingerprint2 !== target.credsFingerprint) {
210786
210830
  target.credsFingerprint = fingerprint2;
@@ -299347,7 +299391,7 @@ async function waitForCommandAuthorization(base, headers, draftId, fallback) {
299347
299391
  }
299348
299392
  }
299349
299393
  }
299350
- var CLI_VERSION = "2.2.107" ? "2.2.107" : "dev";
299394
+ var CLI_VERSION = "2.2.108" ? "2.2.108" : "dev";
299351
299395
  function apiHeaders(token2, company) {
299352
299396
  const headers = {
299353
299397
  authorization: `Bearer ${token2}`,
@@ -303518,7 +303562,7 @@ function shimScript() {
303518
303562
  }
303519
303563
 
303520
303564
  // src/index.ts
303521
- var PKG_VERSION = true ? "2.2.107" : "dev";
303565
+ var PKG_VERSION = true ? "2.2.108" : "dev";
303522
303566
  var LOCAL_BIN = localBin();
303523
303567
  var NPM_PREFIX = npmPrefix();
303524
303568
  var INSTANCE = DEFAULT_INSTANCE;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oasis_test_v2",
3
- "version": "2.2.107",
3
+ "version": "2.2.108",
4
4
  "description": "Oasis node daemon + CLI — background daemon, auto-start, full server CLI",
5
5
  "bin": {
6
6
  "oasis": "./dist/index.js"
@@ -26,6 +26,6 @@
26
26
  "node": ">=20"
27
27
  },
28
28
  "oasisRelease": {
29
- "sourceHead": "180e4e814716f1a7eb4870a1f88cd4d10398d726"
29
+ "sourceHead": "a953575106dcf944d7b32f0eca289792092539ff"
30
30
  }
31
31
  }