openyida 2026.7.13 → 2026.7.14-2

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 (95) hide show
  1. package/README.md +15 -22
  2. package/bin/yida.js +72 -220
  3. package/lib/agent-center/api.js +2 -2
  4. package/lib/aggregate-table/aggregate-table.js +2 -2
  5. package/lib/ai/ai.js +7 -12
  6. package/lib/app/canvas-compile.js +2 -2
  7. package/lib/app/create-app.js +5 -19
  8. package/lib/app/create-form.js +54 -76
  9. package/lib/app/create-page.js +4 -19
  10. package/lib/app/er.js +11 -8
  11. package/lib/app/export-app.js +2 -2
  12. package/lib/app/externalize-form.js +12 -10
  13. package/lib/app/get-schema.js +12 -10
  14. package/lib/app/import-app.js +6 -22
  15. package/lib/app/list-forms.js +3 -19
  16. package/lib/app/nav-group.js +6 -19
  17. package/lib/app/publish.js +60 -198
  18. package/lib/app/update-app.js +4 -18
  19. package/lib/app/update-form-config.js +20 -113
  20. package/lib/app-permission/app-permission.js +2 -2
  21. package/lib/auth/oauth-loopback.js +156 -0
  22. package/lib/auth/org.js +169 -322
  23. package/lib/auth/token-auth.js +346 -0
  24. package/lib/auth/token-store.js +174 -0
  25. package/lib/basic-info/basic-info.js +11 -12
  26. package/lib/bridge/bridge.js +29 -27
  27. package/lib/connector/api.js +4 -4
  28. package/lib/core/agent-capabilities.js +92 -8
  29. package/lib/core/batch.js +8 -8
  30. package/lib/core/check-data.js +2 -2
  31. package/lib/core/command-manifest.js +3 -3
  32. package/lib/core/doctor.js +19 -22
  33. package/lib/core/env-cmd.js +1 -3
  34. package/lib/core/env-manager.js +8 -121
  35. package/lib/core/env.js +30 -72
  36. package/lib/core/locales/ar.js +5 -5
  37. package/lib/core/locales/de.js +5 -5
  38. package/lib/core/locales/en.js +26 -26
  39. package/lib/core/locales/es.js +5 -5
  40. package/lib/core/locales/fr.js +5 -5
  41. package/lib/core/locales/hi.js +5 -5
  42. package/lib/core/locales/ja.js +14 -14
  43. package/lib/core/locales/ko.js +5 -5
  44. package/lib/core/locales/pt.js +5 -5
  45. package/lib/core/locales/vi.js +5 -5
  46. package/lib/core/locales/zh-HK.js +15 -15
  47. package/lib/core/locales/zh.js +26 -26
  48. package/lib/core/query-data.js +2 -2
  49. package/lib/core/task-center.js +2 -2
  50. package/lib/core/utils.js +156 -400
  51. package/lib/core/yida-client.js +57 -22
  52. package/lib/corp-efficiency/corp-efficiency.js +3 -3
  53. package/lib/corp-manager/api.js +2 -2
  54. package/lib/db/db-seq-fix.js +20 -25
  55. package/lib/flash-note/flash-to-prd.js +2 -2
  56. package/lib/i18n-management/i18n-management.js +2 -2
  57. package/lib/integration/integration-check.js +10 -7
  58. package/lib/integration/integration-create.js +11 -8
  59. package/lib/integration/integration-list.js +11 -8
  60. package/lib/mcp/server.js +5 -54
  61. package/lib/page-config/get-page-config.js +2 -2
  62. package/lib/page-config/save-share-config.js +2 -2
  63. package/lib/page-config/verify-short-url.js +2 -2
  64. package/lib/permission/get-permission.js +2 -2
  65. package/lib/permission/save-permission.js +2 -2
  66. package/lib/process/ai-form-setting.js +2 -2
  67. package/lib/process/create-process.js +2 -2
  68. package/lib/process/preview-process.js +2 -2
  69. package/lib/report/append.js +3 -3
  70. package/lib/report/index.js +3 -3
  71. package/package.json +1 -1
  72. package/scripts/check-syntax.js +6 -0
  73. package/scripts/e2e-real/full-runner.js +2 -10
  74. package/scripts/e2e-real/runner.js +0 -31
  75. package/scripts/eval/screenshot.js +27 -69
  76. package/scripts/nightly-smoke.js +16 -34
  77. package/scripts/postinstall.js +6 -2
  78. package/yida-skills/SKILL.md +10 -6
  79. package/yida-skills/references/development-rules.md +2 -2
  80. package/yida-skills/references/setup-and-env.md +10 -9
  81. package/yida-skills/skills/sls-log-workbench/SKILL.md +2 -2
  82. package/yida-skills/skills/sls-log-workbench/sls-query.js +27 -54
  83. package/yida-skills/skills/yida-flash-note-to-prd/SKILL.md +1 -1
  84. package/yida-skills/skills/yida-integration/SKILL.md +3 -3
  85. package/yida-skills/skills/yida-login/SKILL.md +56 -74
  86. package/yida-skills/skills/yida-logout/SKILL.md +13 -12
  87. package/yida-skills/skills/yida-process-rule/SKILL.md +1 -1
  88. package/yida-skills/skills/yida-publish-page/SKILL.md +1 -1
  89. package/yida-skills/skills/yida-report/references/report-api-guide.md +4 -20
  90. package/yida-skills/skills-index.json +4 -4
  91. package/lib/auth/auth.js +0 -313
  92. package/lib/auth/cdp-browser-login.js +0 -390
  93. package/lib/auth/codex-login.js +0 -71
  94. package/lib/auth/login.js +0 -550
  95. package/lib/auth/qr-login.js +0 -1575
@@ -1,10 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const {
4
- loadCookieData,
5
- triggerLogin,
6
- resolveBaseUrl,
7
- } = require('../core/utils');
3
+ const { createAuthRef } = require('../core/yida-client');
8
4
  const { t } = require('../core/i18n');
9
5
  const { fetchFormPageList } = require('./form-navigation');
10
6
 
@@ -60,23 +56,11 @@ async function run(args) {
60
56
  }
61
57
 
62
58
  console.error(t('common.step_login', 1));
63
- let cookieData = loadCookieData();
64
- if (!cookieData) {
65
- console.error(t('common.login_no_cache'));
66
- cookieData = triggerLogin();
67
- }
68
-
69
- if (!cookieData || !cookieData.cookies) {
59
+ const authRef = createAuthRef();
60
+ if (!authRef || !authRef.csrfToken) {
70
61
  console.error(t('list_forms.no_login'));
71
62
  process.exit(1);
72
63
  }
73
-
74
- const authRef = {
75
- csrfToken: cookieData.csrf_token,
76
- cookies: cookieData.cookies,
77
- baseUrl: resolveBaseUrl(cookieData),
78
- cookieData,
79
- };
80
64
  console.error(t('common.login_ready', authRef.baseUrl));
81
65
 
82
66
  console.error(t('list_forms.step_get'));
@@ -2,13 +2,11 @@
2
2
 
3
3
  const querystring = require('querystring');
4
4
  const {
5
- loadCookieData,
6
- triggerLogin,
7
- resolveBaseUrl,
8
5
  httpGet,
9
6
  httpPost,
10
7
  requestWithAutoLogin,
11
8
  } = require('../core/utils');
9
+ const { createAuthRef } = require('../core/yida-client');
12
10
 
13
11
  const ROOT_NAV_UUID = 'NAV-SYSTEM-PARENT-UUID';
14
12
  const FORM_UUID_FALLBACK = 'NAV-SYSTEM-FROM-ME-UUID';
@@ -365,21 +363,11 @@ function countChildren(list, navUuid) {
365
363
  }
366
364
 
367
365
  function loadAuthRef() {
368
- let cookieData = loadCookieData();
369
- if (!cookieData) {
370
- cookieData = triggerLogin();
371
- }
372
-
373
- if (!cookieData || !cookieData.cookies) {
366
+ const authRef = createAuthRef();
367
+ if (!authRef || !authRef.csrfToken) {
374
368
  throw new Error('No valid Yida login cache found. Run openyida login first.');
375
369
  }
376
-
377
- return {
378
- csrfToken: cookieData.csrf_token,
379
- cookies: cookieData.cookies,
380
- baseUrl: resolveBaseUrl(cookieData),
381
- cookieData,
382
- };
370
+ return authRef;
383
371
  }
384
372
 
385
373
  async function fetchNavigationList(appType, authRef) {
@@ -393,8 +381,7 @@ async function fetchNavigationList(appType, authRef) {
393
381
  _csrf_token: auth.csrfToken,
394
382
  _locale_time_zone_offset: 28800000,
395
383
  _stamp: Date.now(),
396
- },
397
- auth.cookies
384
+ }
398
385
  );
399
386
  }, authRef);
400
387
 
@@ -430,7 +417,7 @@ async function postNavAction(appType, action, payload, authRef) {
430
417
  `?_api=${encodeURIComponent(apiNames[action])}` +
431
418
  `&_mock=false&_csrf_token=${encodeURIComponent(auth.csrfToken)}` +
432
419
  `&_stamp=${Date.now()}`;
433
- return httpPost(auth.baseUrl, path, querystring.stringify(payload), auth.cookies);
420
+ return httpPost(auth.baseUrl, path, querystring.stringify(payload));
434
421
  }, authRef);
435
422
 
436
423
  if (!result || result.success === false) {
@@ -11,7 +11,7 @@
11
11
  * 流程:
12
12
  * 1. 读取源文件,通过内置 babel-transform 编译 + UglifyJS 压缩
13
13
  * 2. 用代码动态构建 Schema,将 source/compiled 填入 actions.module
14
- * 3. 读取本地 .cache/cookies.json 获取登录态;若未登录或接口返回 302,则调用 login.py 重新登录
14
+ * 3. 读取本地 token session 获取登录态;若未登录或 token 失效,则提示重新执行 openyida login
15
15
  * 4. 通过 HTTP POST 调用 saveFormSchema 接口发布 Schema
16
16
  */
17
17
 
@@ -22,11 +22,9 @@ const http = require('http');
22
22
  const querystring = require('querystring');
23
23
  const {
24
24
  findProjectRoot,
25
- isLoginExpired,
26
- isCsrfTokenExpired,
27
- loadCookieData,
25
+ loadAuthData,
28
26
  triggerLogin,
29
- refreshCsrfToken,
27
+ httpPost,
30
28
  httpGet,
31
29
  requestWithAutoLogin,
32
30
  } = require('../core/utils');
@@ -106,8 +104,8 @@ function parseArgs(argv = process.argv.slice(2)) {
106
104
 
107
105
  // ── 从登录态解析 baseUrl ─────────────────────────────
108
106
 
109
- function resolveBaseUrl(loginResult) {
110
- return (loginResult.base_url || DEFAULT_BASE_URL).replace(/\/+$/, '');
107
+ function resolveBaseUrl(authData) {
108
+ return (authData.base_url || DEFAULT_BASE_URL).replace(/\/+$/, '');
111
109
  }
112
110
 
113
111
  // ── ID 生成工具 ──────────────────────────────────────
@@ -320,8 +318,7 @@ async function fetchExistingSchemaContent(appType, formUuid, authRef) {
320
318
  return httpGet(
321
319
  auth.baseUrl,
322
320
  `/alibaba/web/${appType}/${PREFIX}/query/formdesign/getFormSchema.json`,
323
- { formUuid, schemaVersion: SCHEMA_VERSION },
324
- auth.cookies
321
+ { formUuid, schemaVersion: SCHEMA_VERSION }
325
322
  );
326
323
  }, authRef);
327
324
 
@@ -658,148 +655,32 @@ function buildCanvasSchemaContent(sourceCode, runtimeCode, importedModules, form
658
655
 
659
656
  // ── 4. 发送 saveFormSchema 请求 ──────────────────────
660
657
 
661
- function sendSaveRequest(csrfToken, cookies, schemaContent, baseUrl, appType, formUuid) {
662
- return new Promise((resolve, reject) => {
663
- const saveSchemaPath = `/alibaba/web/${appType}/${PREFIX}/query/formdesign/saveFormSchema.json?_stamp=${Date.now()}`;
664
-
665
- const postData = querystring.stringify({
666
- _csrf_token: csrfToken,
667
- prefix: PREFIX,
668
- content: schemaContent,
669
- formUuid: formUuid,
670
- schemaVersion: SCHEMA_VERSION,
671
- domainCode: DOMAIN_CODE,
672
- importSchema: true,
673
- });
674
-
675
- const cookieHeader = cookies
676
- .map((cookie) => `${cookie.name}=${cookie.value}`)
677
- .join('; ');
678
-
679
- const parsedUrl = new URL(baseUrl);
680
- const isHttps = parsedUrl.protocol === 'https:';
681
- const requestModule = isHttps ? https : http;
682
-
683
- const requestOptions = {
684
- hostname: parsedUrl.hostname,
685
- port: parsedUrl.port || (isHttps ? 443 : 80),
686
- path: saveSchemaPath,
687
- method: 'POST',
688
- headers: {
689
- 'Content-Type': 'application/x-www-form-urlencoded',
690
- 'Content-Length': Buffer.byteLength(postData),
691
- Origin: baseUrl,
692
- Referer: `${baseUrl}/`,
693
- Cookie: cookieHeader,
694
- },
695
- };
696
-
697
- const request = requestModule.request(requestOptions, (response) => {
698
- let responseData = '';
699
- response.on('data', (chunk) => { responseData += chunk; });
700
- response.on('end', () => {
701
- info(t('common.http_status', response.statusCode));
702
- let parsed;
703
- try {
704
- parsed = JSON.parse(responseData);
705
- } catch (parseError) {
706
- warn(t('common.response_body', responseData.substring(0, 500)));
707
- resolve({ success: false, errorMsg: 'HTTP ' + response.statusCode + ': ' + t('common.response_not_json') });
708
- return;
709
- }
710
- // 检测登录过期(errorCode: "307")
711
- if (isLoginExpired(parsed)) {
712
- warn(t('common.login_expired', parsed.errorMsg));
713
- resolve({ __needLogin: true });
714
- return;
715
- }
716
- // 检测 csrf_token 过期(errorCode: "TIANSHU_000030")
717
- if (isCsrfTokenExpired(parsed)) {
718
- warn(t('common.csrf_expired', parsed.errorMsg));
719
- resolve({ __csrfExpired: true });
720
- return;
721
- }
722
- resolve(parsed);
723
- });
724
- });
725
-
726
- request.on('error', (requestError) => { reject(requestError); });
727
-
728
- request.write(postData);
729
- request.end();
658
+ function sendSaveRequest(csrfToken, schemaContent, baseUrl, appType, formUuid) {
659
+ const saveSchemaPath = `/alibaba/web/${appType}/${PREFIX}/query/formdesign/saveFormSchema.json?_stamp=${Date.now()}`;
660
+ const postData = querystring.stringify({
661
+ _csrf_token: csrfToken,
662
+ prefix: PREFIX,
663
+ content: schemaContent,
664
+ formUuid: formUuid,
665
+ schemaVersion: SCHEMA_VERSION,
666
+ domainCode: DOMAIN_CODE,
667
+ importSchema: true,
730
668
  });
669
+ return httpPost(baseUrl, saveSchemaPath, postData);
731
670
  }
732
671
 
733
672
  // ── 5. 发送 updateFormConfig 请求 ────────────────────
734
673
 
735
- function sendUpdateConfigRequest(csrfToken, cookies, baseUrl, appType, formUuid, version, value) {
736
- return new Promise((resolve, reject) => {
737
- const updateConfigPath = `/dingtalk/web/${appType}/query/formdesign/updateFormConfig.json`;
738
-
739
- const postData = querystring.stringify({
740
- _csrf_token: csrfToken,
741
- formUuid: formUuid,
742
- version: version,
743
- configType: 'MINI_RESOURCE',
744
- value: value,
745
- });
746
-
747
- const cookieHeader = cookies
748
- .map((cookie) => `${cookie.name}=${cookie.value}`)
749
- .join('; ');
750
-
751
- const parsedUrl = new URL(baseUrl);
752
- const isHttps = parsedUrl.protocol === 'https:';
753
- const requestModule = isHttps ? https : http;
754
-
755
- const requestOptions = {
756
- hostname: parsedUrl.hostname,
757
- port: parsedUrl.port || (isHttps ? 443 : 80),
758
- path: updateConfigPath,
759
- method: 'POST',
760
- headers: {
761
- 'Content-Type': 'application/x-www-form-urlencoded',
762
- 'Content-Length': Buffer.byteLength(postData),
763
- Origin: baseUrl,
764
- Referer: `${baseUrl}/`,
765
- Cookie: cookieHeader,
766
- },
767
- };
768
-
769
- const request = requestModule.request(requestOptions, (response) => {
770
- let responseData = '';
771
- response.on('data', (chunk) => { responseData += chunk; });
772
- response.on('end', () => {
773
- info(t('common.http_status', response.statusCode));
774
- let parsed;
775
- try {
776
- parsed = JSON.parse(responseData);
777
- } catch (parseError) {
778
- warn(t('common.response_body', responseData.substring(0, 500)));
779
- resolve({ success: false, errorMsg: 'HTTP ' + response.statusCode + ': ' + t('common.response_not_json') });
780
- return;
781
- }
782
- // 检测登录过期(errorCode: "307")
783
- if (isLoginExpired(parsed)) {
784
- warn(t('common.login_expired', parsed.errorMsg));
785
- resolve({ __needLogin: true });
786
- return;
787
- }
788
- // 检测 csrf_token 过期(errorCode: "TIANSHU_000030")
789
- if (isCsrfTokenExpired(parsed)) {
790
- warn(t('common.csrf_expired', parsed.errorMsg));
791
- resolve({ __csrfExpired: true });
792
- return;
793
- }
794
- resolve(parsed);
795
- });
796
- });
797
-
798
- request.on('error', (requestError) => { reject(requestError); });
799
-
800
- request.write(postData);
801
- request.end();
674
+ function sendUpdateConfigRequest(csrfToken, baseUrl, appType, formUuid, version, value) {
675
+ const updateConfigPath = `/dingtalk/web/${appType}/query/formdesign/updateFormConfig.json`;
676
+ const postData = querystring.stringify({
677
+ _csrf_token: csrfToken,
678
+ formUuid: formUuid,
679
+ version: version,
680
+ configType: 'MINI_RESOURCE',
681
+ value: value,
802
682
  });
683
+ return httpPost(baseUrl, updateConfigPath, postData);
803
684
  }
804
685
 
805
686
  function walkFiles(dir, results, limit) {
@@ -940,14 +821,13 @@ async function ensurePublishTargetOrExit(appType, formUuid, authRef, options = {
940
821
  return null;
941
822
  }
942
823
 
943
- function sendHealthCheckRequest(pageUrl, cookies) {
824
+ async function sendHealthCheckRequest(pageUrl) {
825
+ const { getAccessToken } = require('../auth/token-auth');
826
+ const accessToken = await getAccessToken();
944
827
  return new Promise((resolve) => {
945
828
  const parsedUrl = new URL(pageUrl);
946
829
  const isHttps = parsedUrl.protocol === 'https:';
947
830
  const requestModule = isHttps ? https : http;
948
- const cookieHeader = cookies
949
- .map((cookie) => `${cookie.name}=${cookie.value}`)
950
- .join('; ');
951
831
  const requestOptions = {
952
832
  hostname: parsedUrl.hostname,
953
833
  port: parsedUrl.port || (isHttps ? 443 : 80),
@@ -955,7 +835,7 @@ function sendHealthCheckRequest(pageUrl, cookies) {
955
835
  method: 'GET',
956
836
  headers: {
957
837
  Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
958
- Cookie: cookieHeader,
838
+ Authorization: `Bearer ${accessToken}`,
959
839
  },
960
840
  timeout: 30000,
961
841
  };
@@ -1061,22 +941,24 @@ async function main(argv) {
1061
941
  const compiledPath = path.join(findProjectRoot(), 'pages', 'dist', `${parsedSource.name}.js`);
1062
942
 
1063
943
  step(2, t('common.step_login', 2));
1064
- let cookieData = loadCookieData();
1065
- if (!cookieData || !cookieData.csrf_token) {
944
+ let authData = loadAuthData();
945
+ if (!authData || !authData.csrf_token) {
1066
946
  warn(t('common.login_no_cache'));
1067
- cookieData = triggerLogin();
947
+ authData = triggerLogin();
1068
948
  }
1069
- let { csrf_token: csrfToken, cookies } = cookieData;
1070
- let baseUrl = resolveBaseUrl(cookieData);
949
+ let csrfToken = authData.csrf_token;
950
+ let baseUrl = resolveBaseUrl(authData);
1071
951
  const authRef = {
1072
952
  csrfToken,
1073
- cookies,
1074
953
  baseUrl,
1075
- cookieData,
954
+ authData,
955
+ authMode: authData.auth_mode || '',
956
+ authSource: authData.auth_source || '',
957
+ corpId: authData.corp_id || '',
958
+ userId: authData.user_id || '',
1076
959
  };
1077
960
  await ensurePublishTargetOrExit(appType, formUuid, authRef, { force });
1078
961
  csrfToken = authRef.csrfToken;
1079
- cookies = authRef.cookies;
1080
962
  baseUrl = authRef.baseUrl;
1081
963
 
1082
964
  let schemaContent;
@@ -1092,7 +974,6 @@ async function main(argv) {
1092
974
  process.exit(1);
1093
975
  }
1094
976
  csrfToken = authRef.csrfToken;
1095
- cookies = authRef.cookies;
1096
977
  baseUrl = authRef.baseUrl;
1097
978
  schemaContent = buildSchemaContent(sourceCode, compiledCode, formUuid, { existingDataSource });
1098
979
  }
@@ -1105,25 +986,15 @@ async function main(argv) {
1105
986
  label('Source:', sourcePath);
1106
987
  label('Compiled:', compiledPath);
1107
988
  step(3, t('publish.step_publish'));
1108
- let response = await sendSaveRequest(csrfToken, cookies, schemaContent, baseUrl, appType, formUuid);
1109
-
1110
- if (response && response.__csrfExpired) {
1111
- cookieData = refreshCsrfToken();
1112
- csrfToken = cookieData.csrf_token;
1113
- cookies = cookieData.cookies;
1114
- baseUrl = resolveBaseUrl(cookieData);
1115
- info(t('publish.resend_save_csrf'));
1116
- response = await sendSaveRequest(csrfToken, cookies, schemaContent, baseUrl, appType, formUuid);
1117
- }
1118
-
1119
- if (response && response.__needLogin) {
1120
- cookieData = triggerLogin();
1121
- csrfToken = cookieData.csrf_token;
1122
- cookies = cookieData.cookies;
1123
- baseUrl = resolveBaseUrl(cookieData);
1124
- info(t('publish.resend_save'));
1125
- response = await sendSaveRequest(csrfToken, cookies, schemaContent, baseUrl, appType, formUuid);
1126
- }
989
+ const response = await requestWithAutoLogin((ref) => sendSaveRequest(
990
+ ref.csrfToken,
991
+ schemaContent,
992
+ ref.baseUrl,
993
+ appType,
994
+ formUuid
995
+ ), authRef);
996
+ csrfToken = authRef.csrfToken;
997
+ baseUrl = authRef.baseUrl;
1127
998
 
1128
999
  if (!response || !response.success) {
1129
1000
  const errorMsg = response ? response.errorMsg || t('common.unknown_error') : t('common.request_failed');
@@ -1143,31 +1014,22 @@ async function main(argv) {
1143
1014
 
1144
1015
  step(4, t('publish.step_config'));
1145
1016
  info(t('publish.sending_config'));
1146
- let configResponse = await sendUpdateConfigRequest(csrfToken, cookies, baseUrl, appType, savedFormUuid, version, 8);
1147
-
1148
- if (configResponse && configResponse.__csrfExpired) {
1149
- cookieData = refreshCsrfToken();
1150
- csrfToken = cookieData.csrf_token;
1151
- cookies = cookieData.cookies;
1152
- baseUrl = resolveBaseUrl(cookieData);
1153
- info(t('publish.resend_config_csrf'));
1154
- configResponse = await sendUpdateConfigRequest(csrfToken, cookies, baseUrl, appType, savedFormUuid, version, 8);
1155
- }
1156
-
1157
- if (configResponse && configResponse.__needLogin) {
1158
- cookieData = triggerLogin();
1159
- csrfToken = cookieData.csrf_token;
1160
- cookies = cookieData.cookies;
1161
- baseUrl = resolveBaseUrl(cookieData);
1162
- info(t('publish.resend_config'));
1163
- configResponse = await sendUpdateConfigRequest(csrfToken, cookies, baseUrl, appType, savedFormUuid, version, 8);
1164
- }
1017
+ const configResponse = await requestWithAutoLogin((ref) => sendUpdateConfigRequest(
1018
+ ref.csrfToken,
1019
+ ref.baseUrl,
1020
+ appType,
1021
+ savedFormUuid,
1022
+ version,
1023
+ 8
1024
+ ), authRef);
1025
+ csrfToken = authRef.csrfToken;
1026
+ baseUrl = authRef.baseUrl;
1165
1027
 
1166
1028
  const pageUrl = `${baseUrl}/${appType}/workbench/${savedFormUuid}`;
1167
1029
  let healthCheckResult = null;
1168
1030
  if (healthCheck) {
1169
1031
  step(5, t('publish.step_health_check'));
1170
- healthCheckResult = await sendHealthCheckRequest(pageUrl, cookies);
1032
+ healthCheckResult = await sendHealthCheckRequest(pageUrl);
1171
1033
  if (healthCheckResult.ok) {
1172
1034
  success(t('publish.health_check_ok', healthCheckResult.statusCode));
1173
1035
  } else {
@@ -8,12 +8,10 @@
8
8
 
9
9
  const querystring = require('querystring');
10
10
  const {
11
- loadCookieData,
12
- triggerLogin,
13
- resolveBaseUrl,
14
11
  httpPost,
15
12
  requestWithAutoLogin,
16
13
  } = require('../core/utils');
14
+ const { createAuthRef } = require('../core/yida-client');
17
15
  const { t } = require('../core/i18n');
18
16
  const { buildYidaI18n } = require('../core/yida-i18n');
19
17
 
@@ -113,7 +111,7 @@ async function run(args) {
113
111
  const params = parseArgs(args);
114
112
 
115
113
  // 验证必填参数
116
- const { c, banner, step, label, info, warn, success: chalkSuccess, result: chalkResult, error: chalkError } = require('../core/chalk');
114
+ const { c, banner, step, label, warn, success: chalkSuccess, result: chalkResult, error: chalkError } = require('../core/chalk');
117
115
 
118
116
  if (!params.appType) {
119
117
  chalkError(t('update_app.missing_app_type'), { exit: false });
@@ -138,18 +136,7 @@ async function run(args) {
138
136
 
139
137
  // Step 1: 读取登录态
140
138
  step(1, t('common.step_login', 1));
141
- let cookieData = loadCookieData();
142
- if (!cookieData) {
143
- info(t('common.login_no_cache'));
144
- cookieData = triggerLogin();
145
- }
146
-
147
- const authRef = {
148
- csrfToken: cookieData.csrf_token,
149
- cookies: cookieData.cookies,
150
- baseUrl: resolveBaseUrl(cookieData),
151
- cookieData,
152
- };
139
+ const authRef = createAuthRef();
153
140
  chalkSuccess(t('common.login_ready', authRef.baseUrl));
154
141
 
155
142
  // Step 2: 更新应用
@@ -199,8 +186,7 @@ async function run(args) {
199
186
  return httpPost(
200
187
  auth.baseUrl,
201
188
  `/query/app/updateAppName.json?_api=Form.updateAppName&_mock=false&_stamp=${Date.now()}`,
202
- postData,
203
- auth.cookies
189
+ postData
204
190
  );
205
191
  }, authRef);
206
192
 
@@ -1,8 +1,6 @@
1
- const https = require('https');
2
- const http = require('http');
3
1
  const querystring = require('querystring');
4
2
 
5
- const { loadCookieData, triggerLogin, refreshCsrfToken, resolveBaseUrl, isLoginExpired, isCsrfTokenExpired } = require('../core/utils');
3
+ const { loadAuthData, triggerLogin, resolveBaseUrl, httpPost, requestWithAutoLogin } = require('../core/utils');
6
4
  const { t } = require('../core/i18n');
7
5
  const { buildYidaTitleI18n, normalizeYidaLocale, resolveContentLocale } = require('../core/yida-i18n');
8
6
  const { banner, step, label, success, fail, warn, info, error, result, usage } = require('../core/chalk');
@@ -75,72 +73,8 @@ function buildPostData(csrfToken, formUuid, isRenderNav, title) {
75
73
  }
76
74
 
77
75
 
78
- function sendPostRequest(baseUrl, cookies, requestPath, postData) {
79
- return new Promise((resolve, reject) => {
80
- const cookieHeader = cookies
81
- .map((cookie) => `${cookie.name}=${cookie.value}`)
82
- .join('; ');
83
-
84
- const parsedUrl = new URL(baseUrl);
85
- const isHttps = parsedUrl.protocol === 'https:';
86
- const requestModule = isHttps ? https : http;
87
-
88
- const requestOptions = {
89
- hostname: parsedUrl.hostname,
90
- port: parsedUrl.port || (isHttps ? 443 : 80),
91
- path: requestPath,
92
- method: 'POST',
93
- headers: {
94
- Origin: baseUrl,
95
- Referer: baseUrl + '/',
96
- Cookie: cookieHeader,
97
- Accept: 'application/json, text/json',
98
- 'Content-Type': 'application/x-www-form-urlencoded',
99
- 'x-requested-with': 'XMLHttpRequest',
100
- },
101
- timeout: 30000,
102
- };
103
-
104
- const request = requestModule.request(requestOptions, (response) => {
105
- let responseData = '';
106
- response.on('data', (chunk) => { responseData += chunk; });
107
- response.on('end', () => {
108
- info(t('common.http_status', response.statusCode));
109
- let parsed;
110
- try {
111
- parsed = JSON.parse(responseData);
112
- } catch (parseError) {
113
- warn(t('common.response_body', responseData.substring(0, 500)));
114
- resolve({ success: false, errorMsg: 'HTTP ' + response.statusCode + ': ' + t('common.response_not_json') });
115
- return;
116
- }
117
- if (isLoginExpired(parsed)) {
118
- warn(t('common.login_expired', parsed.errorMsg));
119
- resolve({ __needLogin: true });
120
- return;
121
- }
122
- if (isCsrfTokenExpired(parsed)) {
123
- warn(t('common.csrf_expired', parsed.errorMsg));
124
- resolve({ __csrfExpired: true });
125
- return;
126
- }
127
- resolve(parsed);
128
- });
129
- });
130
-
131
- request.on('timeout', () => {
132
- warn(t('common.request_timeout'));
133
- request.destroy();
134
- reject(new Error(t('common.request_timeout')));
135
- });
136
-
137
- request.on('error', (requestError) => {
138
- reject(requestError);
139
- });
140
-
141
- request.write(postData);
142
- request.end();
143
- });
76
+ function sendPostRequest(baseUrl, requestPath, postData) {
77
+ return httpPost(baseUrl, requestPath, postData);
144
78
  }
145
79
 
146
80
  async function main() {
@@ -153,58 +87,31 @@ async function main() {
153
87
  label('Title:', title);
154
88
 
155
89
  step(1, t('common.step_login_label'));
156
- let cookieData = loadCookieData();
157
- if (!cookieData) {
90
+ let authData = loadAuthData();
91
+ if (!authData) {
158
92
  warn(t('common.no_login_cache'));
159
- cookieData = triggerLogin();
93
+ authData = triggerLogin();
160
94
  }
161
- let { cookies } = cookieData;
162
- let baseUrl = resolveBaseUrl(cookieData);
95
+ const authRef = {
96
+ csrfToken: authData.csrf_token,
97
+ baseUrl: resolveBaseUrl(authData),
98
+ authData,
99
+ authMode: authData.auth_mode || '',
100
+ authSource: authData.auth_source || '',
101
+ corpId: authData.corp_id || '',
102
+ userId: authData.user_id || '',
103
+ };
104
+ const baseUrl = authRef.baseUrl;
163
105
  success(t('common.login_ready', baseUrl));
164
106
  label('Locale:', resolveContentLocale({ locale, baseUrl }));
165
107
 
166
108
  step(2, t('update_form_config.step_update'));
167
109
  info(t('update_form_config.sending_request'));
168
- let { csrf_token: csrfToken } = cookieData;
169
-
170
- const postData = buildPostData(csrfToken, formUuid, isRenderNav, title);
171
-
172
- let apiResult = await sendPostRequest(
173
- baseUrl,
174
- cookies,
110
+ const apiResult = await requestWithAutoLogin((ref) => sendPostRequest(
111
+ ref.baseUrl,
175
112
  `/dingtalk/web/${appType}/query/formdesign/updateFormSchemaInfo.json`,
176
- postData
177
- );
178
-
179
- if (apiResult && apiResult.__csrfExpired) {
180
- cookieData = refreshCsrfToken();
181
- csrfToken = cookieData.csrf_token;
182
- cookies = cookieData.cookies;
183
- baseUrl = resolveBaseUrl(cookieData);
184
- const newPostData = buildPostData(csrfToken, formUuid, isRenderNav, title);
185
- info(t('common.resend_csrf'));
186
- apiResult = await sendPostRequest(
187
- baseUrl,
188
- cookies,
189
- `/dingtalk/web/${appType}/query/formdesign/updateFormSchemaInfo.json`,
190
- newPostData
191
- );
192
- }
193
-
194
- if (apiResult && apiResult.__needLogin) {
195
- cookieData = triggerLogin();
196
- csrfToken = cookieData.csrf_token;
197
- cookies = cookieData.cookies;
198
- baseUrl = resolveBaseUrl(cookieData);
199
- const newPostData = buildPostData(csrfToken, formUuid, isRenderNav, title);
200
- info(t('common.resend'));
201
- apiResult = await sendPostRequest(
202
- baseUrl,
203
- cookies,
204
- `/dingtalk/web/${appType}/query/formdesign/updateFormSchemaInfo.json`,
205
- newPostData
206
- );
207
- }
113
+ buildPostData(ref.csrfToken, formUuid, isRenderNav, title)
114
+ ), authRef);
208
115
 
209
116
  if (apiResult && !apiResult.__needLogin && !apiResult.__csrfExpired) {
210
117
  if (apiResult.success) {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const { createAuthRef, createYidaClient } = require('../core/yida-client');
3
+ const { createAuthRef, createYidaClient, isAuthRefReady } = require('../core/yida-client');
4
4
  const { CliError } = require('../core/cli-error');
5
5
  const { searchUsers } = require('../corp-manager/api');
6
6
 
@@ -81,7 +81,7 @@ function printJson(payload) {
81
81
 
82
82
  function getAuthRef() {
83
83
  const authRef = createAuthRef();
84
- if (!authRef.cookies || !authRef.cookies.length || !authRef.csrfToken) {
84
+ if (!isAuthRefReady(authRef)) {
85
85
  throw new Error('无法获取有效登录态或 CSRF Token');
86
86
  }
87
87
  return authRef;