evolcore 0.0.25 → 0.0.26

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 (231) hide show
  1. package/CHANGELOG.md +607 -565
  2. package/LICENSE +21 -21
  3. package/README.md +455 -455
  4. package/bin/codex-managed-acl.ps1 +160 -160
  5. package/bin/codex-managed-hook.mjs +208 -208
  6. package/bin/ec-safe-output.js +327 -327
  7. package/bin/ec.js +40 -29
  8. package/bin/install-codex-managed-hooks.mjs +582 -555
  9. package/dist/agents/baseagent.js +96 -46
  10. package/dist/agents/claude-runner.js +50 -12
  11. package/dist/agents/codex/app-server-client.js +13 -5
  12. package/dist/agents/codex/catalog.js +1 -1
  13. package/dist/agents/codex/diagnostics.js +34 -1
  14. package/dist/agents/codex-runner.js +121 -38
  15. package/dist/agents/ecagent-runner.js +4 -9
  16. package/dist/agents/gemini-runner.js +2 -7
  17. package/dist/agents/runner-types.js +25 -17
  18. package/dist/aun/aid/agentmd.js +81 -8
  19. package/dist/aun/aid/client.js +1 -1
  20. package/dist/aun/aid/identity.js +1 -1
  21. package/dist/aun/aid/index.js +1 -1
  22. package/dist/aun/aid/store.js +17 -13
  23. package/dist/aun/menu-client.js +74 -0
  24. package/dist/aun/msg/group.js +1 -1
  25. package/dist/aun/msg/managed-operation.js +1 -1
  26. package/dist/aun/msg/p2p.js +6 -1
  27. package/dist/aun/msg/upload.js +30 -22
  28. package/dist/channels/aun.js +329 -94
  29. package/dist/cli/agent-command.js +105 -84
  30. package/dist/cli/agent-create.js +112 -10
  31. package/dist/cli/agent.js +16 -5
  32. package/dist/cli/aun-commands.js +297 -296
  33. package/dist/cli/bench.js +20 -20
  34. package/dist/cli/config.js +47 -28
  35. package/dist/cli/contact.js +70 -13
  36. package/dist/cli/ctl-command.js +22 -22
  37. package/dist/cli/daemon-commands.js +105 -40
  38. package/dist/cli/diag.js +31 -0
  39. package/dist/cli/fs-command.js +67 -67
  40. package/dist/cli/handoff-command.js +41 -9
  41. package/dist/cli/index.js +83 -77
  42. package/dist/cli/link-rules.js +21 -21
  43. package/dist/cli/managed-command-guard.js +3 -0
  44. package/dist/cli/menu-client.js +46 -31
  45. package/dist/cli/net-check.js +22 -22
  46. package/dist/cli/queue-command.js +29 -29
  47. package/dist/cli/response.js +30 -30
  48. package/dist/cli/restart-monitor.js +87 -40
  49. package/dist/cli/stats.js +51 -51
  50. package/dist/cli/trigger-command.js +56 -56
  51. package/dist/config/builtin-roles.js +1 -0
  52. package/dist/config/config-operation-service.js +145 -0
  53. package/dist/config/contact-operation-service.js +96 -7
  54. package/dist/config/resolved-config-op.js +27 -7
  55. package/dist/core/agent-application-service.js +2 -1
  56. package/dist/core/auth/authorization-audit.js +20 -12
  57. package/dist/core/auth/operation-authorizer.js +25 -4
  58. package/dist/core/auth/operation-catalog.js +35 -4
  59. package/dist/core/auth/remote-access-store.js +40 -1
  60. package/dist/core/bootstrap-service.js +1 -1
  61. package/dist/core/command/command-handler.js +83 -26
  62. package/dist/core/command/diag-service.js +118 -0
  63. package/dist/core/command/menu-catalog.js +12 -3
  64. package/dist/core/command/menu-handler.js +47 -26
  65. package/dist/core/command/menu-protocol.js +5 -0
  66. package/dist/core/command/menu-token-store.js +41 -8
  67. package/dist/core/command/slash-gate.js +34 -4
  68. package/dist/core/command/slash-handler.js +86 -21
  69. package/dist/core/handoff/runtime.js +205 -27
  70. package/dist/core/handoff/store.js +193 -4
  71. package/dist/core/message/im-renderer.js +72 -21
  72. package/dist/core/message/message-bridge.js +69 -9
  73. package/dist/core/message/message-queue.js +26 -0
  74. package/dist/core/message/message-utils.js +1 -0
  75. package/dist/core/message/response-engine.js +47 -28
  76. package/dist/core/model/catalog-service.js +79 -49
  77. package/dist/core/model/context-window-suffix.js +33 -0
  78. package/dist/core/model/model-catalog.js +1 -1
  79. package/dist/core/model/model-permission.js +12 -3
  80. package/dist/core/permission/ec-command-parser.js +51 -12
  81. package/dist/core/permission/sandbox-runtime.js +36 -14
  82. package/dist/core/permission/tool-policy.js +2 -1
  83. package/dist/index.js +280 -163
  84. package/dist/ipc.js +54 -2
  85. package/dist/response-system/engines/v1/proactive-flow.js +59 -2
  86. package/dist/stats/billing.js +41 -15
  87. package/dist/stats/db.js +159 -159
  88. package/dist/stats/eck-vars.js +9 -9
  89. package/dist/stats/price-resolver.js +28 -10
  90. package/dist/stats/query.js +139 -139
  91. package/dist/stats/role-budget.js +6 -6
  92. package/dist/stats/writer.js +51 -51
  93. package/dist/utils/cross-platform.js +30 -1
  94. package/dist/utils/error-dict.json +160 -160
  95. package/dist/utils/error-utils.js +21 -0
  96. package/dist/utils/evolcore-version.js +129 -0
  97. package/dist/utils/logger.js +3 -1
  98. package/dist/utils/macos-autostart.js +22 -22
  99. package/dist/utils/model-prices.jsonl +23 -23
  100. package/dist/utils/npm-ops.js +176 -35
  101. package/dist/utils/welcome.js +22 -22
  102. package/ecagent/LICENSE +21 -21
  103. package/ecagent/NOTICE +11 -11
  104. package/ecagent/README.md +61 -61
  105. package/ecagent/dist/harness/compaction/branch-summarization.js +30 -30
  106. package/ecagent/dist/harness/compaction/compaction.js +83 -83
  107. package/ecagent/dist/harness/messages.js +7 -7
  108. package/kits/docs/GUIDE.md +20 -20
  109. package/kits/docs/INDEX.md +66 -66
  110. package/kits/docs/aun/CHEATSHEET.md +19 -19
  111. package/kits/docs/aun/SYNC_PROTOCOL.md +15 -15
  112. package/kits/docs/channels/aun.md +56 -56
  113. package/kits/docs/channels/feishu.md +56 -56
  114. package/kits/docs/context-assembly.md +364 -364
  115. package/kits/docs/eck_templates/GUIDE.template.md +22 -22
  116. package/kits/docs/eck_templates/INDEX.template.md +28 -28
  117. package/kits/docs/eck_templates/path-registry.template.md +33 -33
  118. package/kits/docs/eck_templates/runtime.template.md +19 -19
  119. package/kits/docs/evolcore/INDEX.md +71 -71
  120. package/kits/docs/evolcore/agent-create.md +170 -165
  121. package/kits/docs/evolcore/agent.md +66 -66
  122. package/kits/docs/evolcore/aid.md +60 -60
  123. package/kits/docs/evolcore/codex-windows-sandbox.md +146 -146
  124. package/kits/docs/evolcore/config.md +202 -195
  125. package/kits/docs/evolcore/contact.md +75 -68
  126. package/kits/docs/evolcore/ctl.md +46 -46
  127. package/kits/docs/evolcore/event.md +216 -216
  128. package/kits/docs/evolcore/fs-architecture.md +1215 -1215
  129. package/kits/docs/evolcore/fs.md +110 -110
  130. package/kits/docs/evolcore/group-collaboration.md +243 -243
  131. package/kits/docs/evolcore/group-fs.md +17 -17
  132. package/kits/docs/evolcore/group-rules.md +251 -251
  133. package/kits/docs/evolcore/group.md +152 -152
  134. package/kits/docs/evolcore/menu-client.md +42 -34
  135. package/kits/docs/evolcore/model.md +50 -50
  136. package/kits/docs/evolcore/msg.md +166 -165
  137. package/kits/docs/evolcore/response.md +75 -75
  138. package/kits/docs/evolcore/rpc.md +37 -37
  139. package/kits/docs/evolcore/self-summary.md +29 -29
  140. package/kits/docs/evolcore/stats.md +83 -83
  141. package/kits/docs/evolcore/storage.md +50 -50
  142. package/kits/docs/evolcore/trigger.md +575 -575
  143. package/kits/docs/identity/AID_PROFILE_SPEC.md +26 -26
  144. package/kits/docs/identity/PATH_OPS.md +16 -16
  145. package/kits/docs/identity/ROLE_DETAIL.md +25 -25
  146. package/kits/docs/identity/identity-tools.md +26 -26
  147. package/kits/docs/path-registry.md +62 -62
  148. package/kits/docs/prompt-loading-architecture.md +269 -269
  149. package/kits/docs/venues/aun-group.md +45 -45
  150. package/kits/docs/venues/aun-private.md +10 -10
  151. package/kits/docs/venues/client-desktop.md +10 -10
  152. package/kits/docs/venues/client-mobile.md +10 -10
  153. package/kits/docs/venues/feishu-group.md +13 -13
  154. package/kits/docs/venues/feishu-private.md +9 -9
  155. package/kits/docs/venues/group.md +37 -25
  156. package/kits/docs/venues/private.md +10 -10
  157. package/kits/eck_manifest.auxiliary.json +43 -43
  158. package/kits/eck_manifest.json +190 -190
  159. package/kits/eck_message_manifest.json +74 -74
  160. package/kits/migrations/README-role-config-v4.md +32 -32
  161. package/kits/migrations/migrate-contact-book-v2.mjs +748 -748
  162. package/kits/migrations/migrate-role-config-v4.mjs +614 -614
  163. package/kits/migrations/migrate-role-config-v5.mjs +365 -365
  164. package/kits/migrations/rename-config-file.mjs +99 -99
  165. package/kits/rules/01-overview.md +162 -162
  166. package/kits/rules/02-navigation.md +96 -96
  167. package/kits/rules/03-identity.md +36 -36
  168. package/kits/rules/04-relation.md +75 -75
  169. package/kits/rules/05-venue.md +60 -60
  170. package/kits/rules/06-channel.md +63 -63
  171. package/kits/schemas/_meta.json +53 -53
  172. package/kits/schemas/agent-config.schema.1.json +177 -177
  173. package/kits/schemas/agent-config.schema.10.json +395 -395
  174. package/kits/schemas/agent-config.schema.11.json +421 -421
  175. package/kits/schemas/agent-config.schema.12.json +427 -427
  176. package/kits/schemas/agent-config.schema.2.json +239 -239
  177. package/kits/schemas/agent-config.schema.3.json +119 -119
  178. package/kits/schemas/agent-config.schema.4.json +208 -208
  179. package/kits/schemas/agent-config.schema.5.json +326 -326
  180. package/kits/schemas/agent-config.schema.6.json +322 -322
  181. package/kits/schemas/agent-config.schema.7.json +303 -303
  182. package/kits/schemas/agent-config.schema.8.json +304 -304
  183. package/kits/schemas/agent-config.schema.9.json +364 -364
  184. package/kits/schemas/contact-book.schema.1.json +36 -36
  185. package/kits/schemas/contact-book.schema.2.json +43 -43
  186. package/kits/schemas/contact-book.schema.3.json +67 -67
  187. package/kits/schemas/daemon.schema.1.json +91 -91
  188. package/kits/schemas/daemon.schema.2.json +101 -101
  189. package/kits/schemas/daemon.schema.3.json +123 -123
  190. package/kits/schemas/daemon.schema.4.json +136 -136
  191. package/kits/schemas/daemon.schema.5.json +135 -135
  192. package/kits/schemas/daemon.schema.6.json +131 -131
  193. package/kits/schemas/defaults.schema.1.json +81 -81
  194. package/kits/schemas/defaults.schema.2.json +85 -85
  195. package/kits/schemas/defaults.schema.3.json +73 -73
  196. package/kits/schemas/defaults.schema.4.json +107 -107
  197. package/kits/schemas/defaults.schema.5.json +119 -119
  198. package/kits/schemas/menu-exec-schema-commands.md +208 -208
  199. package/kits/schemas/migrations/README.md +30 -30
  200. package/kits/schemas/relation-config.schema.1.json +158 -158
  201. package/kits/schemas/relation-config.schema.2.json +73 -73
  202. package/kits/schemas/relation-config.schema.3.json +50 -50
  203. package/kits/schemas/relation-config.schema.4.json +47 -47
  204. package/kits/schemas/relation-config.schema.5.json +47 -47
  205. package/kits/schemas/relation-config.schema.6.json +46 -46
  206. package/kits/schemas/relation-config.schema.7.json +59 -59
  207. package/kits/schemas/relation-config.schema.8.json +103 -103
  208. package/kits/schemas/role-config.schema.1.json +201 -201
  209. package/kits/schemas/role-registry.schema.1.json +35 -35
  210. package/kits/schemas/single-session.schema.1.json +31 -31
  211. package/kits/schemas/single-session.schema.2.json +57 -57
  212. package/kits/schemas/single-session.schema.3.json +32 -32
  213. package/kits/templates/bootstrap-welcome.md +17 -17
  214. package/kits/templates/message-fragments/handoff-context-to-target.md +9 -9
  215. package/kits/templates/message-fragments/handoff-request-to-target.md +19 -19
  216. package/kits/templates/message-fragments/handoff-response-to-origin.md +9 -9
  217. package/kits/templates/message-fragments/inject-default.md +2 -2
  218. package/kits/templates/message-fragments/item.md +2 -2
  219. package/kits/templates/roles/admin.json +92 -92
  220. package/kits/templates/roles/member.json +96 -96
  221. package/kits/templates/roles/owner.json +9 -9
  222. package/kits/templates/roles/visitor.json +85 -85
  223. package/kits/templates/system-fragments/baseagent.md +14 -14
  224. package/kits/templates/system-fragments/bootstrap.md +31 -29
  225. package/kits/templates/system-fragments/channel.md +64 -64
  226. package/kits/templates/system-fragments/commands.md +28 -28
  227. package/kits/templates/system-fragments/identity.md +13 -13
  228. package/kits/templates/system-fragments/relation.md +19 -19
  229. package/kits/templates/system-fragments/session.md +59 -59
  230. package/kits/templates/system-fragments/venue.md +31 -31
  231. package/package.json +100 -98
@@ -22,6 +22,80 @@ export class MenuClientError extends Error {
22
22
  this.name = 'MenuClientError';
23
23
  }
24
24
  }
25
+ /** Uses the daemon's existing authenticated AUN channel and its normal ACK path. */
26
+ export class ManagedMenuClient {
27
+ send;
28
+ pending = new Map();
29
+ constructor(send) {
30
+ this.send = send;
31
+ }
32
+ accept(fromAid, payload, encrypted) {
33
+ if (!payload || typeof payload !== 'object' || payload.type !== 'menu.response')
34
+ return false;
35
+ if (!encrypted)
36
+ return true;
37
+ try {
38
+ const response = parseMenuResponse(payload);
39
+ this.pending.get(this.key(fromAid, response.id))?.resolve(response);
40
+ }
41
+ catch { /* Invalid responses cannot complete a pending request. */ }
42
+ return true;
43
+ }
44
+ close() {
45
+ for (const pending of this.pending.values())
46
+ pending.reject(new MenuClientError('AUN_DISCONNECTED', 'AUN channel disconnected'));
47
+ this.pending.clear();
48
+ }
49
+ async request(options) {
50
+ if (!isValidAid(options.fromAid) || !isValidAid(options.targetAid))
51
+ throw new MenuClientError('INVALID_ARGUMENT', 'Valid sender and target AIDs are required');
52
+ if (options.aunPath !== undefined || options.slotId !== undefined || options.encrypt === false)
53
+ throw new MenuClientError('INVALID_ARGUMENT', 'Managed Menu uses the daemon connection with E2EE; connection overrides are forbidden');
54
+ const request = { ...options.request, id: options.request.id || crypto.randomUUID() };
55
+ const validation = validateMenuRequest(request);
56
+ if (validation)
57
+ throw new MenuClientError(validation.code, validation.message);
58
+ const timeout = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
59
+ if (!Number.isFinite(timeout) || timeout < 1000 || timeout > MAX_TIMEOUT_MS)
60
+ throw new MenuClientError('INVALID_ARGUMENT', 'timeout must be between 1s and 120s');
61
+ const key = this.key(options.targetAid, request.id);
62
+ if (this.pending.has(key))
63
+ throw new MenuClientError('CLIENT_BUSY', 'Request ID is already in flight for this daemon');
64
+ const headers = buildMenuClientProtectedHeaders({ clientName: 'ec-menu-client', clientVersion: readInstalledEvolcoreVersion(), remoteAccessToken: options.remoteAccessToken ?? options.ecwebToken });
65
+ const attempts = request.type === 'menu.query' || request.type === 'menu.options' ? 2 : 1;
66
+ let timer;
67
+ try {
68
+ for (let attempt = 0; attempt < attempts; attempt++) {
69
+ const response = new Promise((resolve, reject) => {
70
+ this.pending.set(key, { resolve, reject });
71
+ timer = setTimeout(() => reject(new MenuClientError('TIMEOUT', 'Remote Menu response timed out')), timeout);
72
+ });
73
+ const sent = this.send({ to: options.targetAid, payload: request, encrypt: true, protected_headers: headers })
74
+ .then(result => {
75
+ if (!(result?.message_id ?? result?.message?.message_id))
76
+ throw new MenuClientError('SEND_FAILED', 'message.send returned no message_id');
77
+ });
78
+ try {
79
+ const [, value] = await Promise.all([sent, response]);
80
+ return value;
81
+ }
82
+ catch (error) {
83
+ if (!(error instanceof MenuClientError) || error.code !== 'TIMEOUT' || attempt + 1 === attempts)
84
+ throw error;
85
+ }
86
+ finally {
87
+ clearTimeout(timer);
88
+ }
89
+ }
90
+ throw new MenuClientError('TIMEOUT', 'Remote Menu response timed out');
91
+ }
92
+ finally {
93
+ clearTimeout(timer);
94
+ this.pending.delete(key);
95
+ }
96
+ }
97
+ key(target, id) { return JSON.stringify([target, id]); }
98
+ }
25
99
  async function callClient(conn, method, params) {
26
100
  try {
27
101
  return await conn.call(method, params);
@@ -52,7 +52,7 @@ function groupThreadId(args, payload, runtimeContext) {
52
52
  }
53
53
  function applyGroupRoutingPayloadFields(payload, args, runtimeContext) {
54
54
  const threadId = groupThreadId(args, payload, runtimeContext);
55
- if (threadId && typeof payload.thread_id !== 'string')
55
+ if (threadId)
56
56
  payload.thread_id = threadId;
57
57
  }
58
58
  function groupSendLogMetadata(args, payload, runtimeContext) {
@@ -248,7 +248,7 @@ export function resolveManagedGroupOperation(argv) {
248
248
  return checked;
249
249
  }
250
250
  const memberType = values.get('--member-type');
251
- if (memberType !== undefined && memberType !== 'human' && memberType !== 'ai')
251
+ if (memberType !== undefined && memberType !== 'human' && memberType !== 'agent')
252
252
  return failGroup('INVALID_ARGUMENT', 'invalid --member-type');
253
253
  extra.members = members;
254
254
  extra.memberType = memberType;
@@ -67,7 +67,7 @@ function messageLogContent(body) {
67
67
  }
68
68
  function applyRoutingPayloadFields(payload, args, runtimeContext, includeRuntimeRef = true) {
69
69
  const threadId = msgSendThreadId(args, payload, runtimeContext);
70
- if (threadId && !payload.thread_id)
70
+ if (threadId)
71
71
  payload.thread_id = threadId;
72
72
  if (!includeRuntimeRef)
73
73
  return;
@@ -135,6 +135,7 @@ async function tryDaemonMsgSend(args, payload, runtimeContext, file) {
135
135
  encrypt: args.encrypt,
136
136
  thread,
137
137
  returnPolicy: args.returnPolicy,
138
+ handoffContext: args.handoffContext,
138
139
  originSessionId: runtimeContext.sessionId,
139
140
  originMessageId: runtimeContext.messageId,
140
141
  delegationToken: process.env[AGENT_DELEGATION_TOKEN_ENV],
@@ -213,6 +214,10 @@ async function appendMsgSendOutboundLog(args, result, opts) {
213
214
  catch { /* daemon 不在或 IPC 失败都忽略 */ }
214
215
  }
215
216
  export async function msgSend(args) {
217
+ if (args.handoffContext !== undefined && (!process.env.EVOLCORE_SESSION_ID
218
+ || !args.handoffContext.trim() || args.handoffContext.length > 64 * 1024)) {
219
+ return { ok: false, code: 'INVALID_HANDOFF_CONTEXT', error: 'handoff context requires a managed session and 1–65536 characters' };
220
+ }
216
221
  const runtimeContext = await readBestTaskRuntimeContext();
217
222
  // Contact admission is a daemon-owned policy for managed Agent tasks. A
218
223
  // non-managed CLI caller may use any valid AUN sender identity and must not
@@ -20,6 +20,11 @@ export function isValidPayloadType(value) {
20
20
  }
21
21
  /** 单次上传最大大小(与 daemon sendFile 一致)。 */
22
22
  export const MAX_AUN_ATTACHMENT_SIZE = 10 * 1024 * 1024;
23
+ /**
24
+ * Inline JSON-RPC 上传阈值。超过该大小直接使用上传会话,避免把文件
25
+ * Base64 编码后放进 storage.put_object 的 RPC 参数。
26
+ */
27
+ export const INLINE_AUN_ATTACHMENT_SIZE = 64 * 1024;
23
28
  /** server 端 inline 上限错误的识别特征。优先匹配错误消息里的“inline 上限”字样。 */
24
29
  function isInlineLimitError(err) {
25
30
  const msg = err?.message ?? '';
@@ -44,26 +49,29 @@ export async function uploadBufferAndBuildPayload(conn, ownerAid, data, filename
44
49
  const objectKey = `shared/${crypto.randomUUID()}/${safeFilename}`;
45
50
  const total = data.length;
46
51
  const report = (phase, bytes) => opts?.onProgress?.({ phase, bytes, total });
47
- // 1. 先按 inline 走
48
- let inlineRejected = false;
49
- try {
50
- report('inline', 0);
51
- await conn.call('storage.put_object', {
52
- object_key: objectKey,
53
- content: data.toString('base64'),
54
- content_type: contentType,
55
- is_private: false,
56
- overwrite: true,
57
- });
58
- report('inline', total);
59
- }
60
- catch (e) {
61
- if (!isInlineLimitError(e))
62
- throw e;
63
- inlineRejected = true;
52
+ // 小文件优先走 inline,兼容不支持上传会话的服务端;大文件直接走
53
+ // session,避免先构造一份可能超过 JSON-RPC 限制的 Base64 请求。
54
+ let useUploadSession = total > INLINE_AUN_ATTACHMENT_SIZE;
55
+ if (!useUploadSession) {
56
+ try {
57
+ report('inline', 0);
58
+ await conn.call('storage.put_object', {
59
+ object_key: objectKey,
60
+ content: data.toString('base64'),
61
+ content_type: contentType,
62
+ is_private: false,
63
+ overwrite: true,
64
+ });
65
+ report('inline', total);
66
+ }
67
+ catch (e) {
68
+ if (!isInlineLimitError(e))
69
+ throw e;
70
+ useUploadSession = true;
71
+ }
64
72
  }
65
- // 2. inline 被拒:降级到 session + HTTP PUT
66
- if (inlineRejected) {
73
+ // inline 被拒或文件超过 inline 阈值:session + HTTP PUT
74
+ if (useUploadSession) {
67
75
  report('session-create', 0);
68
76
  const session = await conn.call('storage.create_upload_session', {
69
77
  object_key: objectKey,
@@ -144,9 +152,9 @@ export async function uploadBufferAndBuildPayload(conn, ownerAid, data, filename
144
152
  /**
145
153
  * 上传本地文件并构造发送用的 payload。
146
154
  *
147
- * 策略:先无脑 storage.put_object(内联 base64)。server 报“超过 inline 上限”
148
- * 时降级到 storage.create_upload_session + HTTP PUT + storage.complete_upload,
149
- * 此时通过 onProgress 上报字节级进度。
155
+ * 策略:小文件使用 storage.put_object(内联 base64);大文件直接使用
156
+ * storage.create_upload_session + HTTP PUT + storage.complete_upload,避免
157
+ * 将大文件编码后放入 JSON-RPC。此时通过 onProgress 上报字节级进度。
150
158
  */
151
159
  export async function uploadFileAndBuildPayload(conn, ownerAid, filePath, opts) {
152
160
  const absPath = path.resolve(filePath);