@abtnode/core 1.16.44-beta-20250529-004636-15e80e20 → 1.16.44-beta-20250601-083116-288e5ea5

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.
@@ -26,6 +26,7 @@ const { sendToUser } = require('@blocklet/sdk/lib/util/send-notification');
26
26
  const { getDidDomainForBlocklet } = require('@abtnode/util/lib/get-domain-for-blocklet');
27
27
  const logger = require('@abtnode/logger')('@abtnode/core:blocklet:manager');
28
28
  const promiseSpawn = require('@abtnode/util/lib/promise-spawn');
29
+ const { sanitizeTag } = require('@abtnode/util/lib/sanitize');
29
30
 
30
31
  const {
31
32
  BLOCKLET_INSTALL_TYPE,
@@ -237,7 +238,6 @@ const ensureBlockletRunning = require('./ensure-blocklet-running');
237
238
  const { transformNotification } = require('../../util/notification');
238
239
  const { generateUserUpdateData } = require('../../util/user');
239
240
  const { blockletThemeSchema } = require('../../validators/theme');
240
- const checkDNS = require('../../util/check-dns.js');
241
241
  const { removeDockerNetwork } = require('../../util/docker/docker-network.js');
242
242
  const parseDockerName = require('../../util/docker/parse-docker-name.js');
243
243
 
@@ -341,6 +341,7 @@ class DiskBlockletManager extends BaseBlockletManager {
341
341
  nodeAPI,
342
342
  teamAPI,
343
343
  certManager,
344
+ routerManager,
344
345
  }) {
345
346
  super();
346
347
 
@@ -358,6 +359,7 @@ class DiskBlockletManager extends BaseBlockletManager {
358
359
  this.resendNotificationQueue = resendNotificationQueue;
359
360
  this.teamManager = teamManager;
360
361
  this.certManager = certManager;
362
+ this.routerManager = routerManager;
361
363
  /**
362
364
  * @type {import('../../api/node')}
363
365
  */
@@ -1664,6 +1666,12 @@ class DiskBlockletManager extends BaseBlockletManager {
1664
1666
  throw new Error('configs list is not an array');
1665
1667
  }
1666
1668
 
1669
+ // 对用户输入的配置进行 XSS 清理
1670
+ const sanitizedConfigs = newConfigs.map((c) => ({
1671
+ ...c,
1672
+ value: sanitizeTag(c.value),
1673
+ }));
1674
+
1667
1675
  const tmpDids = Array.isArray(did) ? did : [did];
1668
1676
  const [rootDid, childDid] = tmpDids;
1669
1677
  const rootMetaDid = await states.blocklet.getBlockletMetaDid(rootDid);
@@ -1682,7 +1690,7 @@ class DiskBlockletManager extends BaseBlockletManager {
1682
1690
 
1683
1691
  const configObj = {};
1684
1692
  const ignoredKeys = [];
1685
- for (const x of newConfigs) {
1693
+ for (const x of sanitizedConfigs) {
1686
1694
  if (['CHAIN_TYPE', 'BLOCKLET_APP_CHAIN_TYPE'].includes(x.key)) {
1687
1695
  throw new Error(`${x.key} should not be changed`);
1688
1696
  } else if (x.custom === true) {
@@ -1715,7 +1723,7 @@ class DiskBlockletManager extends BaseBlockletManager {
1715
1723
  configObj[x.key] = x.value;
1716
1724
  }
1717
1725
 
1718
- const finalConfigs = newConfigs.filter((x) => !ignoredKeys.includes(x.key));
1726
+ const finalConfigs = sanitizedConfigs.filter((x) => !ignoredKeys.includes(x.key));
1719
1727
  const willAppSkChange = isRotatingAppSk(finalConfigs, blocklet.configs, blocklet.externalSk);
1720
1728
 
1721
1729
  // NOTICE: cannot use appDid as did param because appDid will become old appDid in alsoKnownAs and cannot get blocklet by the old appDid
@@ -2348,12 +2356,18 @@ class DiskBlockletManager extends BaseBlockletManager {
2348
2356
 
2349
2357
  await Promise.all(
2350
2358
  customAliases.map(async (alias) => {
2351
- const dns = await checkDNS(alias.value, cnameDomain?.value);
2359
+ const dns = await this.routerManager.checkDomainDNS(alias.value, cnameDomain?.value);
2352
2360
  logger.info('dns info', { dns });
2353
2361
  if (!dns.isDnsResolved || !dns.isCnameMatch) {
2354
2362
  return;
2355
2363
  }
2356
2364
 
2365
+ const foundCert = await this.routerManager.getHttpsCert({ domain: alias.value });
2366
+ logger.info('cron check dns global certificate', { foundCert: !!foundCert, domain: alias.value });
2367
+ if (foundCert) {
2368
+ return;
2369
+ }
2370
+
2357
2371
  if (!alias.certificateId) {
2358
2372
  logger.info('cron check dns no certificate');
2359
2373
  await issueCert(alias);
@@ -5162,7 +5176,7 @@ class DiskBlockletManager extends BaseBlockletManager {
5162
5176
  async getDomainDNS({ teamDid, domain }) {
5163
5177
  const blocklet = await this.getBlocklet(teamDid);
5164
5178
  const cnameDomain = (get(blocklet, 'site.domainAliases') || []).find((item) => isDidDomain(item.value));
5165
- return checkDNS(domain, cnameDomain?.value);
5179
+ return this.routerManager.checkDomainDNS(domain, cnameDomain?.value);
5166
5180
  }
5167
5181
  }
5168
5182
 
@@ -38885,7 +38885,7 @@ module.exports = require("zlib");
38885
38885
  /***/ ((module) => {
38886
38886
 
38887
38887
  "use strict";
38888
- module.exports = /*#__PURE__*/JSON.parse('{"name":"@abtnode/core","publishConfig":{"access":"public"},"version":"1.16.43","description":"","main":"lib/index.js","files":["lib"],"scripts":{"lint":"eslint tests lib --ignore-pattern \'tests/assets/*\'","lint:fix":"eslint --fix tests lib","test":"node tools/jest.js","coverage":"npm run test -- --coverage"},"keywords":[],"author":"wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)","license":"Apache-2.0","dependencies":{"@abtnode/analytics":"1.16.43","@abtnode/auth":"1.16.43","@abtnode/certificate-manager":"1.16.43","@abtnode/client":"1.16.43","@abtnode/constant":"1.16.43","@abtnode/cron":"1.16.43","@abtnode/docker-utils":"1.16.43","@abtnode/logger":"1.16.43","@abtnode/models":"1.16.43","@abtnode/queue":"1.16.43","@abtnode/rbac":"1.16.43","@abtnode/router-provider":"1.16.43","@abtnode/static-server":"1.16.43","@abtnode/timemachine":"1.16.43","@abtnode/util":"1.16.43","@arcblock/did":"1.20.11","@arcblock/did-auth":"1.20.11","@arcblock/did-ext":"1.20.11","@arcblock/did-motif":"^1.1.13","@arcblock/did-util":"1.20.11","@arcblock/event-hub":"1.20.11","@arcblock/jwt":"1.20.11","@arcblock/pm2-events":"^0.0.5","@arcblock/validator":"1.20.11","@arcblock/vc":"1.20.11","@blocklet/constant":"1.16.43","@blocklet/did-space-js":"^1.0.56","@blocklet/env":"1.16.43","@blocklet/error":"^0.2.4","@blocklet/meta":"1.16.43","@blocklet/resolver":"1.16.43","@blocklet/sdk":"1.16.43","@blocklet/store":"1.16.43","@blocklet/theme":"^2.13.55","@fidm/x509":"^1.2.1","@ocap/mcrypto":"1.20.11","@ocap/util":"1.20.11","@ocap/wallet":"1.20.11","@slack/webhook":"^5.0.4","archiver":"^7.0.1","axios":"^1.7.9","axon":"^2.0.3","chalk":"^4.1.2","cross-spawn":"^7.0.3","dayjs":"^1.11.13","deep-diff":"^1.0.2","detect-port":"^1.5.1","envfile":"^7.1.0","escape-string-regexp":"^4.0.0","fast-glob":"^3.3.2","filesize":"^10.1.1","flat":"^5.0.2","fs-extra":"^11.2.0","get-port":"^5.1.1","hasha":"^5.2.2","is-base64":"^1.1.0","is-cidr":"4","is-ip":"3","is-url":"^1.2.4","joi":"17.12.2","joi-extension-semver":"^5.0.0","js-yaml":"^4.1.0","kill-port":"^2.0.1","lodash":"^4.17.21","lru-cache":"^11.0.2","node-stream-zip":"^1.15.0","p-all":"^3.0.0","p-limit":"^3.1.0","p-map":"^4.0.0","p-retry":"^4.6.2","p-wait-for":"^3.2.0","rate-limiter-flexible":"^5.0.5","read-last-lines":"^1.8.0","semver":"^7.6.3","sequelize":"^6.35.0","shelljs":"^0.8.5","slugify":"^1.6.6","ssri":"^8.0.1","stream-throttle":"^0.1.3","stream-to-promise":"^3.0.0","systeminformation":"^5.23.3","tail":"^2.2.4","tar":"^6.1.11","transliteration":"^2.3.5","ua-parser-js":"^1.0.2","ufo":"^1.5.3","uuid":"^9.0.1","valid-url":"^1.0.9","which":"^2.0.2","xbytes":"^1.8.0"},"devDependencies":{"expand-tilde":"^2.0.2","express":"^4.18.2","jest":"^29.7.0","unzipper":"^0.10.11"},"gitHead":"e5764f753181ed6a7c615cd4fc6682aacf0cb7cd"}');
38888
+ module.exports = /*#__PURE__*/JSON.parse('{"name":"@abtnode/core","publishConfig":{"access":"public"},"version":"1.16.43","description":"","main":"lib/index.js","files":["lib"],"scripts":{"lint":"eslint tests lib --ignore-pattern \'tests/assets/*\'","lint:fix":"eslint --fix tests lib","test":"node tools/jest.js","coverage":"npm run test -- --coverage"},"keywords":[],"author":"wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)","license":"Apache-2.0","dependencies":{"@abtnode/analytics":"1.16.43","@abtnode/auth":"1.16.43","@abtnode/certificate-manager":"1.16.43","@abtnode/client":"1.16.43","@abtnode/constant":"1.16.43","@abtnode/cron":"1.16.43","@abtnode/docker-utils":"1.16.43","@abtnode/logger":"1.16.43","@abtnode/models":"1.16.43","@abtnode/queue":"1.16.43","@abtnode/rbac":"1.16.43","@abtnode/router-provider":"1.16.43","@abtnode/static-server":"1.16.43","@abtnode/timemachine":"1.16.43","@abtnode/util":"1.16.43","@arcblock/did":"1.20.11","@arcblock/did-auth":"1.20.11","@arcblock/did-ext":"1.20.11","@arcblock/did-motif":"^1.1.13","@arcblock/did-util":"1.20.11","@arcblock/event-hub":"1.20.11","@arcblock/jwt":"1.20.11","@arcblock/pm2-events":"^0.0.5","@arcblock/validator":"1.20.11","@arcblock/vc":"1.20.11","@blocklet/constant":"1.16.43","@blocklet/did-space-js":"^1.0.56","@blocklet/env":"1.16.43","@blocklet/error":"^0.2.5","@blocklet/meta":"1.16.43","@blocklet/resolver":"1.16.43","@blocklet/sdk":"1.16.43","@blocklet/store":"1.16.43","@blocklet/theme":"^2.13.57","@fidm/x509":"^1.2.1","@ocap/mcrypto":"1.20.11","@ocap/util":"1.20.11","@ocap/wallet":"1.20.11","@slack/webhook":"^5.0.4","archiver":"^7.0.1","axios":"^1.7.9","axon":"^2.0.3","chalk":"^4.1.2","cross-spawn":"^7.0.3","dayjs":"^1.11.13","deep-diff":"^1.0.2","detect-port":"^1.5.1","envfile":"^7.1.0","escape-string-regexp":"^4.0.0","fast-glob":"^3.3.2","filesize":"^10.1.1","flat":"^5.0.2","fs-extra":"^11.2.0","get-port":"^5.1.1","hasha":"^5.2.2","is-base64":"^1.1.0","is-cidr":"4","is-ip":"3","is-url":"^1.2.4","joi":"17.12.2","joi-extension-semver":"^5.0.0","js-yaml":"^4.1.0","kill-port":"^2.0.1","lodash":"^4.17.21","lru-cache":"^11.0.2","node-stream-zip":"^1.15.0","p-all":"^3.0.0","p-limit":"^3.1.0","p-map":"^4.0.0","p-retry":"^4.6.2","p-wait-for":"^3.2.0","rate-limiter-flexible":"^5.0.5","read-last-lines":"^1.8.0","semver":"^7.6.3","sequelize":"^6.35.0","shelljs":"^0.8.5","slugify":"^1.6.6","ssri":"^8.0.1","stream-throttle":"^0.1.3","stream-to-promise":"^3.0.0","systeminformation":"^5.23.3","tail":"^2.2.4","tar":"^6.1.11","transliteration":"^2.3.5","ua-parser-js":"^1.0.2","ufo":"^1.5.3","uuid":"^9.0.1","valid-url":"^1.0.9","which":"^2.0.2","xbytes":"^1.8.0"},"devDependencies":{"expand-tilde":"^2.0.2","express":"^4.18.2","jest":"^29.7.0","unzipper":"^0.10.11"},"gitHead":"e5764f753181ed6a7c615cd4fc6682aacf0cb7cd"}');
38889
38889
 
38890
38890
  /***/ }),
38891
38891
 
package/lib/index.js CHANGED
@@ -280,6 +280,7 @@ function ABTNode(options) {
280
280
  nodeAPI,
281
281
  teamAPI,
282
282
  certManager,
283
+ routerManager,
283
284
  });
284
285
  blockletManager.setMaxListeners(0);
285
286
  const securityAPI = new SecurityAPI({ teamManager, blockletManager });
@@ -4,6 +4,7 @@
4
4
  * Router manager is the business logic layer of router related, includes:
5
5
  * RoutingRuleState, HttpsCertState
6
6
  */
7
+ const https = require('https');
7
8
  const path = require('path');
8
9
  const os = require('os');
9
10
  const dns = require('dns');
@@ -22,7 +23,7 @@ const { getProvider } = require('@abtnode/router-provider');
22
23
  const checkDomainMatch = require('@abtnode/util/lib/check-domain-match');
23
24
  const { isDidDomain, isCustomDomain } = require('@abtnode/util/lib/url-evaluation');
24
25
  const { isTopLevelDomain } = require('@abtnode/util/lib/domain');
25
- const { EVENTS } = require('@abtnode/constant');
26
+ const { EVENTS, WELLKNOWN_PING_PREFIX } = require('@abtnode/constant');
26
27
  const {
27
28
  DOMAIN_FOR_IP_SITE,
28
29
  DOMAIN_FOR_DEFAULT_SITE,
@@ -342,12 +343,41 @@ class RouterManager extends EventEmitter {
342
343
 
343
344
  if (issueCert) {
344
345
  const didDomain = doc.domainAliases.find((x) => isDidDomain(x.value));
345
- const dnsValue = await checkDNS(domain, didDomain?.value);
346
- const shouldSkipCertIssue = isCustomDomain(domain) && (!dnsValue.isDnsResolved || !dnsValue.isCnameMatch);
346
+ const [dnsValue, cert] = await Promise.all([
347
+ this.checkDomainDNS(domain, didDomain?.value),
348
+ this.getHttpsCert({ domain }),
349
+ ]);
350
+
351
+ // 自定义域名如果 DNS 未解析成功 或 CNAME 不匹配 或 已配置证书,则不自动颁发证书
352
+ const shouldSkipCertIssue =
353
+ isCustomDomain(domain) && (!dnsValue.isDnsResolved || !dnsValue.isCnameMatch || !!cert);
354
+
355
+ if (shouldSkipCertIssue) {
356
+ const reasonFn = () => {
357
+ if (cert) {
358
+ return 'cert already exists';
359
+ }
360
+
361
+ if (!dnsValue.isDnsResolved) {
362
+ return 'DNS not resolved';
363
+ }
347
364
 
348
- if (!shouldSkipCertIssue) {
365
+ if (!dnsValue.isCnameMatch) {
366
+ return 'CNAME not match';
367
+ }
368
+
369
+ return 'unknown reason';
370
+ };
371
+
372
+ logger.info('skip cert issue for domain alias', {
373
+ cert,
374
+ domain,
375
+ dnsValue,
376
+ reason: reasonFn(),
377
+ });
378
+ } else {
349
379
  this.certManager
350
- .issue({ domain, did, siteId: id, inBlockletSetup }, { delay: 5000 })
380
+ .issue({ domain, did, siteId: id, inBlockletSetup }, { delay: 3000 })
351
381
  .then(() => {
352
382
  logger.info('issue cert for domain alias', { domain, did });
353
383
  })
@@ -635,6 +665,63 @@ class RouterManager extends EventEmitter {
635
665
  return null;
636
666
  }
637
667
 
668
+ checkDomainDNS(domain, cnameDomain) {
669
+ try {
670
+ if (isCustomDomain(domain)) {
671
+ return checkDNS(domain, cnameDomain);
672
+ }
673
+
674
+ return Promise.resolve({
675
+ isDnsResolved: true,
676
+ hasCname: true,
677
+ cnameRecords: [cnameDomain],
678
+ isCnameMatch: true,
679
+ });
680
+ } catch (error) {
681
+ logger.error('check domain dns error', error?.message);
682
+ return Promise.resolve({
683
+ isDnsResolved: false,
684
+ hasCname: false,
685
+ cnameRecords: [],
686
+ isCnameMatch: false,
687
+ });
688
+ }
689
+ }
690
+
691
+ async getHttpsCert({ domain }) {
692
+ const matchedCert = await this.getMatchedCert(domain);
693
+
694
+ if (matchedCert) {
695
+ return matchedCert;
696
+ }
697
+
698
+ return new Promise((resolve) => {
699
+ const req = https.request(
700
+ { host: domain, path: WELLKNOWN_PING_PREFIX, method: 'GET', timeout: 1000 * 10 },
701
+ (res) => {
702
+ try {
703
+ const data = res.socket.getPeerCertificate();
704
+ const cert = {
705
+ issuer: {
706
+ countryName: data.issuer.C,
707
+ organizationName: data.issuer.O,
708
+ commonName: data.issuer.CN,
709
+ },
710
+ validFrom: data.valid_from,
711
+ validTo: data.valid_to,
712
+ };
713
+ resolve(cert);
714
+ } catch {
715
+ resolve(null);
716
+ }
717
+ }
718
+ );
719
+
720
+ req.on('error', () => resolve(null));
721
+ req.end();
722
+ });
723
+ }
724
+
638
725
  isCertMatchedDomain(cert, domain = '') {
639
726
  return [cert.domain, ...(cert.sans || [])].some((d) => checkDomainMatch(d, domain));
640
727
  }
@@ -1590,6 +1590,13 @@ const _getBlocklet = async ({
1590
1590
 
1591
1591
  blocklet.settings.languages = blocklet.settings.languages || [];
1592
1592
 
1593
+ // 移除第一个版本中 from 为 tmpl 的导航
1594
+ if (blocklet?.settings?.navigations && Array.isArray(blocklet.settings.navigations)) {
1595
+ blocklet.settings.navigations = (blocklet.settings.navigations || []).filter(
1596
+ (item) => !(item?.parent === '/team' && ['tmpl'].includes(item.from))
1597
+ );
1598
+ }
1599
+
1593
1600
  const nodeInfo = await states.node.read();
1594
1601
 
1595
1602
  (nodeInfo?.blockletRegistryList || []).forEach((store) => {
@@ -1,11 +1,9 @@
1
- const https = require('https');
2
1
  const { EventEmitter } = require('events');
3
2
  const logger = require('@abtnode/logger')('@abtnode/domain-status');
4
- const { EVENTS, WELLKNOWN_PING_PREFIX } = require('@abtnode/constant');
3
+ const { EVENTS } = require('@abtnode/constant');
5
4
  const { BlockletEvents } = require('@blocklet/constant');
6
- const { isCustomDomain, isDidDomain } = require('@abtnode/util/lib/url-evaluation');
5
+ const { isDidDomain } = require('@abtnode/util/lib/url-evaluation');
7
6
  const { checkDomainDNS } = require('./index');
8
- const checkDNS = require('./check-dns');
9
7
 
10
8
  const dnsStatusStore = Object.create(null);
11
9
 
@@ -48,71 +46,6 @@ class DomainStatus extends EventEmitter {
48
46
  this.states = states;
49
47
  }
50
48
 
51
- async getHttpsCert(domain) {
52
- const matchedCert = await this.routerManager.getMatchedCert(domain);
53
-
54
- if (matchedCert) {
55
- return matchedCert;
56
- }
57
-
58
- return new Promise((resolve) => {
59
- const req = https.request(
60
- {
61
- host: domain,
62
- path: WELLKNOWN_PING_PREFIX,
63
- method: 'GET',
64
- timeout: 1000 * 10,
65
- },
66
- (res) => {
67
- try {
68
- const data = res.socket.getPeerCertificate();
69
- const cert = {
70
- issuer: {
71
- countryName: data.issuer.C,
72
- organizationName: data.issuer.O,
73
- commonName: data.issuer.CN,
74
- },
75
- validFrom: data.valid_from,
76
- validTo: data.valid_to,
77
- };
78
- resolve(cert);
79
- } catch {
80
- resolve(null);
81
- }
82
- }
83
- );
84
-
85
- req.on('error', () => {
86
- resolve(null);
87
- });
88
-
89
- req.end();
90
- });
91
- }
92
-
93
- checkDomainDNS(domain, cnameDomain) {
94
- try {
95
- if (isCustomDomain(domain)) {
96
- return checkDNS(domain, cnameDomain);
97
- }
98
-
99
- return Promise.resolve({
100
- isDnsResolved: true,
101
- hasCname: true,
102
- cnameRecords: [cnameDomain],
103
- isCnameMatch: true,
104
- });
105
- } catch (error) {
106
- logger.error('check domain dns error', error?.message);
107
- return Promise.resolve({
108
- isDnsResolved: false,
109
- hasCname: false,
110
- cnameRecords: [],
111
- isCnameMatch: false,
112
- });
113
- }
114
- }
115
-
116
49
  async checkDomainsStatus({ domains, did } = {}) {
117
50
  if (did) {
118
51
  // eslint-disable-next-line no-param-reassign
@@ -122,8 +55,12 @@ class DomainStatus extends EventEmitter {
122
55
  const cnameDomain = domains.find((x) => isDidDomain(x));
123
56
 
124
57
  (domains || []).forEach((domain) => {
125
- Promise.all([this.getHttpsCert(domain), checkDomainDnsWrapper(domain), this.checkDomainDNS(domain, cnameDomain)])
126
- .then(([matchedCert, dns, dnsResolve]) => {
58
+ Promise.all([
59
+ this.routerManager.getHttpsCert({ domain }),
60
+ this.routerManager.checkDomainDNS(domain, cnameDomain),
61
+ checkDomainDnsWrapper(domain),
62
+ ])
63
+ .then(([matchedCert, dnsResolve, dns]) => {
127
64
  const eventData = {
128
65
  domain,
129
66
  matchedCert,
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.16.44-beta-20250529-004636-15e80e20",
6
+ "version": "1.16.44-beta-20250601-083116-288e5ea5",
7
7
  "description": "",
8
8
  "main": "lib/index.js",
9
9
  "files": [
@@ -19,21 +19,21 @@
19
19
  "author": "wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)",
20
20
  "license": "Apache-2.0",
21
21
  "dependencies": {
22
- "@abtnode/analytics": "1.16.44-beta-20250529-004636-15e80e20",
23
- "@abtnode/auth": "1.16.44-beta-20250529-004636-15e80e20",
24
- "@abtnode/certificate-manager": "1.16.44-beta-20250529-004636-15e80e20",
25
- "@abtnode/client": "1.16.44-beta-20250529-004636-15e80e20",
26
- "@abtnode/constant": "1.16.44-beta-20250529-004636-15e80e20",
27
- "@abtnode/cron": "1.16.44-beta-20250529-004636-15e80e20",
28
- "@abtnode/docker-utils": "1.16.44-beta-20250529-004636-15e80e20",
29
- "@abtnode/logger": "1.16.44-beta-20250529-004636-15e80e20",
30
- "@abtnode/models": "1.16.44-beta-20250529-004636-15e80e20",
31
- "@abtnode/queue": "1.16.44-beta-20250529-004636-15e80e20",
32
- "@abtnode/rbac": "1.16.44-beta-20250529-004636-15e80e20",
33
- "@abtnode/router-provider": "1.16.44-beta-20250529-004636-15e80e20",
34
- "@abtnode/static-server": "1.16.44-beta-20250529-004636-15e80e20",
35
- "@abtnode/timemachine": "1.16.44-beta-20250529-004636-15e80e20",
36
- "@abtnode/util": "1.16.44-beta-20250529-004636-15e80e20",
22
+ "@abtnode/analytics": "1.16.44-beta-20250601-083116-288e5ea5",
23
+ "@abtnode/auth": "1.16.44-beta-20250601-083116-288e5ea5",
24
+ "@abtnode/certificate-manager": "1.16.44-beta-20250601-083116-288e5ea5",
25
+ "@abtnode/client": "1.16.44-beta-20250601-083116-288e5ea5",
26
+ "@abtnode/constant": "1.16.44-beta-20250601-083116-288e5ea5",
27
+ "@abtnode/cron": "1.16.44-beta-20250601-083116-288e5ea5",
28
+ "@abtnode/docker-utils": "1.16.44-beta-20250601-083116-288e5ea5",
29
+ "@abtnode/logger": "1.16.44-beta-20250601-083116-288e5ea5",
30
+ "@abtnode/models": "1.16.44-beta-20250601-083116-288e5ea5",
31
+ "@abtnode/queue": "1.16.44-beta-20250601-083116-288e5ea5",
32
+ "@abtnode/rbac": "1.16.44-beta-20250601-083116-288e5ea5",
33
+ "@abtnode/router-provider": "1.16.44-beta-20250601-083116-288e5ea5",
34
+ "@abtnode/static-server": "1.16.44-beta-20250601-083116-288e5ea5",
35
+ "@abtnode/timemachine": "1.16.44-beta-20250601-083116-288e5ea5",
36
+ "@abtnode/util": "1.16.44-beta-20250601-083116-288e5ea5",
37
37
  "@arcblock/did": "1.20.11",
38
38
  "@arcblock/did-auth": "1.20.11",
39
39
  "@arcblock/did-ext": "1.20.11",
@@ -44,15 +44,15 @@
44
44
  "@arcblock/pm2-events": "^0.0.5",
45
45
  "@arcblock/validator": "1.20.11",
46
46
  "@arcblock/vc": "1.20.11",
47
- "@blocklet/constant": "1.16.44-beta-20250529-004636-15e80e20",
47
+ "@blocklet/constant": "1.16.44-beta-20250601-083116-288e5ea5",
48
48
  "@blocklet/did-space-js": "^1.0.56",
49
- "@blocklet/env": "1.16.44-beta-20250529-004636-15e80e20",
50
- "@blocklet/error": "^0.2.4",
51
- "@blocklet/meta": "1.16.44-beta-20250529-004636-15e80e20",
52
- "@blocklet/resolver": "1.16.44-beta-20250529-004636-15e80e20",
53
- "@blocklet/sdk": "1.16.44-beta-20250529-004636-15e80e20",
54
- "@blocklet/store": "1.16.44-beta-20250529-004636-15e80e20",
55
- "@blocklet/theme": "^2.13.55",
49
+ "@blocklet/env": "1.16.44-beta-20250601-083116-288e5ea5",
50
+ "@blocklet/error": "^0.2.5",
51
+ "@blocklet/meta": "1.16.44-beta-20250601-083116-288e5ea5",
52
+ "@blocklet/resolver": "1.16.44-beta-20250601-083116-288e5ea5",
53
+ "@blocklet/sdk": "1.16.44-beta-20250601-083116-288e5ea5",
54
+ "@blocklet/store": "1.16.44-beta-20250601-083116-288e5ea5",
55
+ "@blocklet/theme": "^2.13.57",
56
56
  "@fidm/x509": "^1.2.1",
57
57
  "@ocap/mcrypto": "1.20.11",
58
58
  "@ocap/util": "1.20.11",
@@ -116,5 +116,5 @@
116
116
  "jest": "^29.7.0",
117
117
  "unzipper": "^0.10.11"
118
118
  },
119
- "gitHead": "93f38f56824d2dd2afcd6950b73a67510d9cd18c"
119
+ "gitHead": "5d978739f099374dcc9d4ce9572eb343fd0c39b4"
120
120
  }