@abtnode/core 1.16.47-beta-20250724-080141-d80ab374 → 1.16.47-beta-20250729-045152-0bde0f98

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.
@@ -2918,6 +2918,7 @@ class DiskBlockletManager extends BaseBlockletManager {
2918
2918
  key: '',
2919
2919
  accessKeyId: '',
2920
2920
  secretAccessKey: '',
2921
+ validationResult: '',
2921
2922
  },
2922
2923
  });
2923
2924
  const newState = await this.getBlocklet(did);
@@ -2938,10 +2939,14 @@ class DiskBlockletManager extends BaseBlockletManager {
2938
2939
  throw new CustomError(400, 'blocklet did invalid, no blocklet found');
2939
2940
  }
2940
2941
  const aigne = get(blocklet, 'settings.aigne', {});
2941
- const verified = await verifyAigneConfig(aigne, did);
2942
+ const verified = await verifyAigneConfig(aigne, blocklet);
2942
2943
  if (!verified.valid) {
2944
+ await states.blockletExtras.setSettings(did, {
2945
+ aigne: { ...aigne, validationResult: verified?.error || 'failed' },
2946
+ });
2943
2947
  throw new CustomError(500, verified.error);
2944
2948
  }
2949
+ await states.blockletExtras.setSettings(did, { aigne: { ...aigne, validationResult: 'success' } });
2945
2950
  } catch (error) {
2946
2951
  logger.error('verify aigne connection error', { did, error });
2947
2952
  throw error;
@@ -158,6 +158,7 @@ const installComponentFromUrl = async ({
158
158
  await validateBlocklet(newBlocklet);
159
159
 
160
160
  manager.emit(BlockletEvents.statusChange, newBlocklet);
161
+ const shouldCleanUploadFile = isUploadFile && url.includes(process.env.ABT_NODE_DATA_DIR);
161
162
 
162
163
  const downloadParams = {
163
164
  oldBlocklet: { ...oldBlocklet },
@@ -166,7 +167,7 @@ const installComponentFromUrl = async ({
166
167
  addedComponentDids: componentDids,
167
168
  context,
168
169
  postAction: action,
169
- shouldCleanUploadFile: isUploadFile,
170
+ shouldCleanUploadFile,
170
171
  url,
171
172
  };
172
173
 
@@ -38918,7 +38918,7 @@ module.exports = require("zlib");
38918
38918
  /***/ ((module) => {
38919
38919
 
38920
38920
  "use strict";
38921
- module.exports = /*#__PURE__*/JSON.parse('{"name":"@abtnode/core","publishConfig":{"access":"public"},"version":"1.16.46","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.46","@abtnode/auth":"1.16.46","@abtnode/certificate-manager":"1.16.46","@abtnode/client":"1.16.46","@abtnode/constant":"1.16.46","@abtnode/cron":"1.16.46","@abtnode/db-cache":"1.16.46","@abtnode/docker-utils":"1.16.46","@abtnode/logger":"1.16.46","@abtnode/models":"1.16.46","@abtnode/queue":"1.16.46","@abtnode/rbac":"1.16.46","@abtnode/router-provider":"1.16.46","@abtnode/static-server":"1.16.46","@abtnode/timemachine":"1.16.46","@abtnode/util":"1.16.46","@aigne/aigne-hub":"^0.2.0","@arcblock/did":"1.21.0","@arcblock/did-auth":"1.21.0","@arcblock/did-ext":"1.21.0","@arcblock/did-motif":"^1.1.14","@arcblock/did-util":"1.21.0","@arcblock/event-hub":"1.21.0","@arcblock/jwt":"1.21.0","@arcblock/pm2-events":"^0.0.5","@arcblock/validator":"1.21.0","@arcblock/vc":"1.21.0","@blocklet/constant":"1.16.46","@blocklet/did-space-js":"^1.1.8","@blocklet/env":"1.16.46","@blocklet/error":"^0.2.5","@blocklet/meta":"1.16.46","@blocklet/resolver":"1.16.46","@blocklet/sdk":"1.16.46","@blocklet/store":"1.16.46","@blocklet/theme":"^3.0.30","@fidm/x509":"^1.2.1","@ocap/mcrypto":"1.21.0","@ocap/util":"1.21.0","@ocap/wallet":"1.21.0","@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","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":"^11.1.0","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"}');
38921
+ module.exports = /*#__PURE__*/JSON.parse('{"name":"@abtnode/core","publishConfig":{"access":"public"},"version":"1.16.46","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.46","@abtnode/auth":"1.16.46","@abtnode/certificate-manager":"1.16.46","@abtnode/client":"1.16.46","@abtnode/constant":"1.16.46","@abtnode/cron":"1.16.46","@abtnode/db-cache":"1.16.46","@abtnode/docker-utils":"1.16.46","@abtnode/logger":"1.16.46","@abtnode/models":"1.16.46","@abtnode/queue":"1.16.46","@abtnode/rbac":"1.16.46","@abtnode/router-provider":"1.16.46","@abtnode/static-server":"1.16.46","@abtnode/timemachine":"1.16.46","@abtnode/util":"1.16.46","@aigne/aigne-hub":"^0.2.2","@arcblock/did":"1.21.0","@arcblock/did-auth":"1.21.0","@arcblock/did-ext":"1.21.0","@arcblock/did-motif":"^1.1.14","@arcblock/did-util":"1.21.0","@arcblock/event-hub":"1.21.0","@arcblock/jwt":"1.21.0","@arcblock/pm2-events":"^0.0.5","@arcblock/validator":"1.21.0","@arcblock/vc":"1.21.0","@blocklet/constant":"1.16.46","@blocklet/did-space-js":"^1.1.10","@blocklet/env":"1.16.46","@blocklet/error":"^0.2.5","@blocklet/meta":"1.16.46","@blocklet/resolver":"1.16.46","@blocklet/sdk":"1.16.46","@blocklet/store":"1.16.46","@blocklet/theme":"^3.0.34","@fidm/x509":"^1.2.1","@ocap/mcrypto":"1.21.0","@ocap/util":"1.21.0","@ocap/wallet":"1.21.0","@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","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":"^11.1.0","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"}');
38922
38922
 
38923
38923
  /***/ }),
38924
38924
 
package/lib/event/util.js CHANGED
@@ -11,10 +11,12 @@ const backupBlockletSites = async (blocklet) => {
11
11
  const sites = await states.site.getSitesByBlocklet(blocklet.meta.did);
12
12
  let backupFile = null;
13
13
  try {
14
- backupFile = path.join(blocklet.env.cacheDir, `sites-backup-${Date.now()}.json`);
15
- logger.info(`backup blocklet sites to ${backupFile}`, { did: blocklet.meta.did, sites });
16
- fs.writeFileSync(backupFile, JSON.stringify(sites));
17
- logger.info('backup blocklet sites', { did: blocklet.meta.did, backupFile });
14
+ if (blocklet.env) {
15
+ backupFile = path.join(blocklet.env.cacheDir, `sites-backup-${Date.now()}.json`);
16
+ logger.info(`backup blocklet sites to ${backupFile}`, { did: blocklet.meta.did, sites });
17
+ fs.writeFileSync(backupFile, JSON.stringify(sites));
18
+ logger.info('backup blocklet sites', { did: blocklet.meta.did, backupFile });
19
+ }
18
20
  } catch (error) {
19
21
  logger.error('backup blocklet sites error', { error });
20
22
  }
@@ -1,10 +1,12 @@
1
1
  const get = require('lodash/get');
2
+ const uniq = require('lodash/uniq');
2
3
  const { Op } = require('sequelize');
3
4
  const { isValid } = require('@arcblock/did');
4
5
  const { fromRandom, fromPublicKey } = require('@ocap/wallet');
5
6
  const { toBase58, fromBase58 } = require('@ocap/util');
6
7
  const { CustomError } = require('@blocklet/error');
7
8
  const logger = require('@abtnode/logger')('@abtnode/core:states:access-key');
9
+ const { SERVER_ROLES } = require('@abtnode/constant');
8
10
  const BaseState = require('./base');
9
11
  const { accessKeySchema, REMARK_MAX_LENGTH } = require('../validators/access-key');
10
12
  const { validateOperator, getEndpoint, isUserCenterPath } = require('../util/verify-access-key-user');
@@ -15,10 +17,32 @@ const validateRemark = (remark) => {
15
17
  }
16
18
  };
17
19
 
18
- const validatePassport = (passport) => {
20
+ const validatePassport = (passport, context) => {
19
21
  if (!passport) {
20
22
  throw new CustomError(400, 'passport should not be empty');
21
23
  }
24
+
25
+ const { user } = context;
26
+ logger.info('validate passport user', { userRole: user.role, passport });
27
+
28
+ const role = (user?.role || '').replace('blocklet-', '');
29
+ if (
30
+ [SERVER_ROLES.OWNER, SERVER_ROLES.ADMIN, SERVER_ROLES.BLOCKLET_OWNER, SERVER_ROLES.BLOCKLET_ADMIN].includes(role)
31
+ ) {
32
+ return;
33
+ }
34
+
35
+ const roles = uniq([
36
+ ...(user?.passports || []).filter((p) => p.status === 'valid').map((p) => p.role),
37
+ role,
38
+ 'guest',
39
+ ]);
40
+ if (!roles.includes(passport)) {
41
+ throw new CustomError(
42
+ 400,
43
+ `You can not create access keys with passports you do not have access to: ${roles.join(',')}.`
44
+ );
45
+ }
22
46
  };
23
47
 
24
48
  const validateExpireAt = (expireAt) => {
@@ -43,11 +67,10 @@ class AccessKeyState extends BaseState {
43
67
  resourceId = '',
44
68
  createdVia = 'web',
45
69
  expireAt = null,
46
- createdBy = '',
47
70
  } = input || {};
48
71
 
49
72
  validateRemark(remark);
50
- validatePassport(passport);
73
+ validatePassport(passport, context);
51
74
  validateExpireAt(expireAt);
52
75
 
53
76
  const wallet = newWallet || fromRandom();
@@ -67,7 +90,7 @@ class AccessKeyState extends BaseState {
67
90
  data.remark = remark;
68
91
  }
69
92
 
70
- data.createdBy = createdBy || getOperator(context);
93
+ data.createdBy = getOperator(context);
71
94
  data.updatedBy = data.createdBy;
72
95
 
73
96
  await accessKeySchema.validateAsync(data, { stripUnknown: true });
@@ -123,17 +146,18 @@ class AccessKeyState extends BaseState {
123
146
  const { accessKeyId, remark, passport, expireAt, authType } = input;
124
147
 
125
148
  validateRemark(remark);
126
- validatePassport(passport);
127
149
  validateExpireAt(expireAt);
128
150
 
129
151
  if (!accessKeyId) {
130
152
  throw new CustomError(400, 'accessKeyId should not be empty');
131
153
  }
154
+
132
155
  const doc = await this.findOne({ accessKeyId });
133
- if (!doc) {
134
- throw new CustomError(404, `Access Key Id ${accessKeyId} does not exist`);
135
- }
156
+ if (!doc) throw new CustomError(404, `Access Key Id ${accessKeyId} does not exist`);
157
+
136
158
  validateOperator(context, doc.createdBy);
159
+ validatePassport(passport, context);
160
+
137
161
  if (remark !== undefined) {
138
162
  doc.remark = remark;
139
163
  }
@@ -2,6 +2,7 @@ const logger = require('@abtnode/logger')('@abtnode/core:states:notification');
2
2
  const { MAX_PAGE_SIZE } = require('@abtnode/constant');
3
3
  const { Sequelize, Op } = require('sequelize');
4
4
  const { isValid } = require('@arcblock/did');
5
+ const { Joi } = require('@arcblock/validator');
5
6
  const { ROLES, SERVER_ROLES, NOTIFICATION_SEND_CHANNEL, NOTIFICATION_SEND_STATUS } = require('@abtnode/constant');
6
7
  const BaseState = require('./base');
7
8
  const { getReceiversStatistics } = require('../util/notification');
@@ -31,6 +32,11 @@ const safeJsonParse = (json) => {
31
32
  return JSON.parse(json);
32
33
  };
33
34
 
35
+ const pagingSchema = Joi.object({
36
+ page: Joi.number().integer().min(1).default(1),
37
+ pageSize: Joi.number().integer().min(1).default(10),
38
+ });
39
+
34
40
  /**
35
41
  * @extends BaseState<import('@abtnode/models').NotificationState>
36
42
  */
@@ -223,7 +229,14 @@ class NotificationState extends BaseState {
223
229
  throw new Error(errorMsg);
224
230
  }
225
231
 
226
- const { pageSize = 10, page = 1 } = paging ?? {};
232
+ const { error, value } = pagingSchema.validate(paging || {});
233
+ if (error) {
234
+ const { path, message } = error.details[0];
235
+ const field = path.join('.');
236
+
237
+ throw new Error(`Invalid paging parameter '${field}': ${message}. Page and pageSize must be positive integers.`);
238
+ }
239
+ const { pageSize, page } = value;
227
240
  const curPageSize = pageSize > MAX_PAGE_SIZE ? MAX_PAGE_SIZE : pageSize;
228
241
  const offset = (page - 1) * curPageSize;
229
242
 
@@ -30,7 +30,7 @@ const getAigneHubModelApi = async (url) => {
30
30
  }
31
31
  };
32
32
 
33
- const verifyAigneHub = async (config, did) => {
33
+ const verifyAigneHub = async (config, blocklet) => {
34
34
  try {
35
35
  if (!config.url) {
36
36
  return {
@@ -46,6 +46,7 @@ const verifyAigneHub = async (config, did) => {
46
46
  }
47
47
 
48
48
  const baseUrl = await getAigneHubModelApi(config.url);
49
+ const { did, name } = blocklet.meta || {};
49
50
 
50
51
  const modelConfig = {
51
52
  accessKey: decryptValue(config.key, did),
@@ -56,7 +57,7 @@ const verifyAigneHub = async (config, did) => {
56
57
  const model = new AIGNEHubChatModel(modelConfig);
57
58
 
58
59
  const result = await model.invoke({
59
- messages: [{ role: 'user', content: 'Hello, who are you?' }],
60
+ messages: [{ role: 'user', content: `Hi there! This is ${name} Blocklet speaking. What's your name?` }],
60
61
  });
61
62
 
62
63
  return { valid: !!result };
@@ -76,7 +77,7 @@ const verifyAigneHub = async (config, did) => {
76
77
  * @param {Object} [config.options] - 其他选项
77
78
  * @returns {Promise<{valid: boolean, error?: string}>}
78
79
  */
79
- async function verifyAigneConfig(config, did) {
80
+ async function verifyAigneConfig(config, blocklet) {
80
81
  try {
81
82
  if (!config || typeof config !== 'object') {
82
83
  return {
@@ -85,7 +86,7 @@ async function verifyAigneConfig(config, did) {
85
86
  };
86
87
  }
87
88
 
88
- return await verifyAigneHub(config, did);
89
+ return await verifyAigneHub(config, blocklet);
89
90
  } catch (error) {
90
91
  return {
91
92
  valid: false,
@@ -17,7 +17,7 @@ const getBlockletUrl = async (domain) => {
17
17
  const url = convertDomainToUrl(domain);
18
18
  const BLOCKLET_JSON_PATH = '__blocklet__.js?type=json';
19
19
  const blockletUrl = joinURL(url, BLOCKLET_JSON_PATH);
20
- const { data: blocklet } = await axios(blockletUrl);
20
+ const { data: blocklet } = await axios(blockletUrl, { timeout: 5000 });
21
21
 
22
22
  if (typeof blocklet === 'object') {
23
23
  return blocklet?.appId;
@@ -39,11 +39,7 @@ async function checkIsRedirectedBlocklet(domain1, domain2) {
39
39
 
40
40
  return domain1Blocklet === domain2Blocklet;
41
41
  } catch (err) {
42
- logger.error('DNS resolution error:', {
43
- domain1,
44
- domain2,
45
- error: err.message,
46
- });
42
+ logger.error('DNS resolution error:', { domain1, domain2, error: err.message });
47
43
  return false;
48
44
  }
49
45
  }
@@ -53,35 +49,17 @@ async function checkDnsAndCname(domain, expectedCname = '') {
53
49
  const dnsRecords = await dns.resolve(domain);
54
50
  logger.info('dnsRecords', { dnsRecords, domain });
55
51
 
56
- try {
57
- const cnameRecords = await dns.resolveCname(domain);
58
- const isCnameMatch = cnameRecords.some((cname) => cname.toLowerCase() === expectedCname.toLowerCase());
59
-
60
- return {
61
- isDnsResolved: true,
62
- hasCname: true,
63
- cnameRecords,
64
- isCnameMatch: isCnameMatch || (await checkIsRedirectedBlocklet(domain, expectedCname)),
65
- };
66
- } catch (cnameError) {
67
- logger.error('match resolve name error', {
68
- domain,
69
- error: cnameError?.message,
70
- });
52
+ const cnameRecords = await dns.resolveCname(domain).catch(() => []);
53
+ const isCnameMatch = cnameRecords.some((cname) => cname.toLowerCase() === expectedCname.toLowerCase());
71
54
 
72
- return {
73
- isDnsResolved: true,
74
- hasCname: false,
75
- cnameRecords: [],
76
- isCnameMatch: false,
77
- error: cnameError?.message,
78
- };
79
- }
55
+ return {
56
+ isDnsResolved: true,
57
+ hasCname: true,
58
+ cnameRecords,
59
+ isCnameMatch: isCnameMatch || (await checkIsRedirectedBlocklet(domain, expectedCname)),
60
+ };
80
61
  } catch (error) {
81
- logger.error('resolve name error', {
82
- domain,
83
- error: error?.message,
84
- });
62
+ logger.error('resolve name error', { domain, error });
85
63
 
86
64
  return {
87
65
  isDnsResolved: false,
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.16.47-beta-20250724-080141-d80ab374",
6
+ "version": "1.16.47-beta-20250729-045152-0bde0f98",
7
7
  "description": "",
8
8
  "main": "lib/index.js",
9
9
  "files": [
@@ -19,23 +19,23 @@
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.47-beta-20250724-080141-d80ab374",
23
- "@abtnode/auth": "1.16.47-beta-20250724-080141-d80ab374",
24
- "@abtnode/certificate-manager": "1.16.47-beta-20250724-080141-d80ab374",
25
- "@abtnode/client": "1.16.47-beta-20250724-080141-d80ab374",
26
- "@abtnode/constant": "1.16.47-beta-20250724-080141-d80ab374",
27
- "@abtnode/cron": "1.16.47-beta-20250724-080141-d80ab374",
28
- "@abtnode/db-cache": "1.16.47-beta-20250724-080141-d80ab374",
29
- "@abtnode/docker-utils": "1.16.47-beta-20250724-080141-d80ab374",
30
- "@abtnode/logger": "1.16.47-beta-20250724-080141-d80ab374",
31
- "@abtnode/models": "1.16.47-beta-20250724-080141-d80ab374",
32
- "@abtnode/queue": "1.16.47-beta-20250724-080141-d80ab374",
33
- "@abtnode/rbac": "1.16.47-beta-20250724-080141-d80ab374",
34
- "@abtnode/router-provider": "1.16.47-beta-20250724-080141-d80ab374",
35
- "@abtnode/static-server": "1.16.47-beta-20250724-080141-d80ab374",
36
- "@abtnode/timemachine": "1.16.47-beta-20250724-080141-d80ab374",
37
- "@abtnode/util": "1.16.47-beta-20250724-080141-d80ab374",
38
- "@aigne/aigne-hub": "^0.2.0",
22
+ "@abtnode/analytics": "1.16.47-beta-20250729-045152-0bde0f98",
23
+ "@abtnode/auth": "1.16.47-beta-20250729-045152-0bde0f98",
24
+ "@abtnode/certificate-manager": "1.16.47-beta-20250729-045152-0bde0f98",
25
+ "@abtnode/client": "1.16.47-beta-20250729-045152-0bde0f98",
26
+ "@abtnode/constant": "1.16.47-beta-20250729-045152-0bde0f98",
27
+ "@abtnode/cron": "1.16.47-beta-20250729-045152-0bde0f98",
28
+ "@abtnode/db-cache": "1.16.47-beta-20250729-045152-0bde0f98",
29
+ "@abtnode/docker-utils": "1.16.47-beta-20250729-045152-0bde0f98",
30
+ "@abtnode/logger": "1.16.47-beta-20250729-045152-0bde0f98",
31
+ "@abtnode/models": "1.16.47-beta-20250729-045152-0bde0f98",
32
+ "@abtnode/queue": "1.16.47-beta-20250729-045152-0bde0f98",
33
+ "@abtnode/rbac": "1.16.47-beta-20250729-045152-0bde0f98",
34
+ "@abtnode/router-provider": "1.16.47-beta-20250729-045152-0bde0f98",
35
+ "@abtnode/static-server": "1.16.47-beta-20250729-045152-0bde0f98",
36
+ "@abtnode/timemachine": "1.16.47-beta-20250729-045152-0bde0f98",
37
+ "@abtnode/util": "1.16.47-beta-20250729-045152-0bde0f98",
38
+ "@aigne/aigne-hub": "^0.2.2",
39
39
  "@arcblock/did": "1.21.0",
40
40
  "@arcblock/did-auth": "1.21.0",
41
41
  "@arcblock/did-ext": "1.21.0",
@@ -46,15 +46,15 @@
46
46
  "@arcblock/pm2-events": "^0.0.5",
47
47
  "@arcblock/validator": "1.21.0",
48
48
  "@arcblock/vc": "1.21.0",
49
- "@blocklet/constant": "1.16.47-beta-20250724-080141-d80ab374",
50
- "@blocklet/did-space-js": "^1.1.8",
51
- "@blocklet/env": "1.16.47-beta-20250724-080141-d80ab374",
49
+ "@blocklet/constant": "1.16.47-beta-20250729-045152-0bde0f98",
50
+ "@blocklet/did-space-js": "^1.1.10",
51
+ "@blocklet/env": "1.16.47-beta-20250729-045152-0bde0f98",
52
52
  "@blocklet/error": "^0.2.5",
53
- "@blocklet/meta": "1.16.47-beta-20250724-080141-d80ab374",
54
- "@blocklet/resolver": "1.16.47-beta-20250724-080141-d80ab374",
55
- "@blocklet/sdk": "1.16.47-beta-20250724-080141-d80ab374",
56
- "@blocklet/store": "1.16.47-beta-20250724-080141-d80ab374",
57
- "@blocklet/theme": "^3.0.30",
53
+ "@blocklet/meta": "1.16.47-beta-20250729-045152-0bde0f98",
54
+ "@blocklet/resolver": "1.16.47-beta-20250729-045152-0bde0f98",
55
+ "@blocklet/sdk": "1.16.47-beta-20250729-045152-0bde0f98",
56
+ "@blocklet/store": "1.16.47-beta-20250729-045152-0bde0f98",
57
+ "@blocklet/theme": "^3.0.34",
58
58
  "@fidm/x509": "^1.2.1",
59
59
  "@ocap/mcrypto": "1.21.0",
60
60
  "@ocap/util": "1.21.0",
@@ -117,5 +117,5 @@
117
117
  "jest": "^29.7.0",
118
118
  "unzipper": "^0.10.11"
119
119
  },
120
- "gitHead": "6861bb413155f5ea585e193b96f3157ff69f49a9"
120
+ "gitHead": "554bd257e6e9aaa2c63d2b6558871f632f7f8ea4"
121
121
  }