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.
- package/CHANGELOG.md +607 -565
- package/LICENSE +21 -21
- package/README.md +455 -455
- package/bin/codex-managed-acl.ps1 +160 -160
- package/bin/codex-managed-hook.mjs +208 -208
- package/bin/ec-safe-output.js +327 -327
- package/bin/ec.js +40 -29
- package/bin/install-codex-managed-hooks.mjs +582 -555
- package/dist/agents/baseagent.js +96 -46
- package/dist/agents/claude-runner.js +50 -12
- package/dist/agents/codex/app-server-client.js +13 -5
- package/dist/agents/codex/catalog.js +1 -1
- package/dist/agents/codex/diagnostics.js +34 -1
- package/dist/agents/codex-runner.js +121 -38
- package/dist/agents/ecagent-runner.js +4 -9
- package/dist/agents/gemini-runner.js +2 -7
- package/dist/agents/runner-types.js +25 -17
- package/dist/aun/aid/agentmd.js +81 -8
- package/dist/aun/aid/client.js +1 -1
- package/dist/aun/aid/identity.js +1 -1
- package/dist/aun/aid/index.js +1 -1
- package/dist/aun/aid/store.js +17 -13
- package/dist/aun/menu-client.js +74 -0
- package/dist/aun/msg/group.js +1 -1
- package/dist/aun/msg/managed-operation.js +1 -1
- package/dist/aun/msg/p2p.js +6 -1
- package/dist/aun/msg/upload.js +30 -22
- package/dist/channels/aun.js +329 -94
- package/dist/cli/agent-command.js +105 -84
- package/dist/cli/agent-create.js +112 -10
- package/dist/cli/agent.js +16 -5
- package/dist/cli/aun-commands.js +297 -296
- package/dist/cli/bench.js +20 -20
- package/dist/cli/config.js +47 -28
- package/dist/cli/contact.js +70 -13
- package/dist/cli/ctl-command.js +22 -22
- package/dist/cli/daemon-commands.js +105 -40
- package/dist/cli/diag.js +31 -0
- package/dist/cli/fs-command.js +67 -67
- package/dist/cli/handoff-command.js +41 -9
- package/dist/cli/index.js +83 -77
- package/dist/cli/link-rules.js +21 -21
- package/dist/cli/managed-command-guard.js +3 -0
- package/dist/cli/menu-client.js +46 -31
- package/dist/cli/net-check.js +22 -22
- package/dist/cli/queue-command.js +29 -29
- package/dist/cli/response.js +30 -30
- package/dist/cli/restart-monitor.js +87 -40
- package/dist/cli/stats.js +51 -51
- package/dist/cli/trigger-command.js +56 -56
- package/dist/config/builtin-roles.js +1 -0
- package/dist/config/config-operation-service.js +145 -0
- package/dist/config/contact-operation-service.js +96 -7
- package/dist/config/resolved-config-op.js +27 -7
- package/dist/core/agent-application-service.js +2 -1
- package/dist/core/auth/authorization-audit.js +20 -12
- package/dist/core/auth/operation-authorizer.js +25 -4
- package/dist/core/auth/operation-catalog.js +35 -4
- package/dist/core/auth/remote-access-store.js +40 -1
- package/dist/core/bootstrap-service.js +1 -1
- package/dist/core/command/command-handler.js +83 -26
- package/dist/core/command/diag-service.js +118 -0
- package/dist/core/command/menu-catalog.js +12 -3
- package/dist/core/command/menu-handler.js +47 -26
- package/dist/core/command/menu-protocol.js +5 -0
- package/dist/core/command/menu-token-store.js +41 -8
- package/dist/core/command/slash-gate.js +34 -4
- package/dist/core/command/slash-handler.js +86 -21
- package/dist/core/handoff/runtime.js +205 -27
- package/dist/core/handoff/store.js +193 -4
- package/dist/core/message/im-renderer.js +72 -21
- package/dist/core/message/message-bridge.js +69 -9
- package/dist/core/message/message-queue.js +26 -0
- package/dist/core/message/message-utils.js +1 -0
- package/dist/core/message/response-engine.js +47 -28
- package/dist/core/model/catalog-service.js +79 -49
- package/dist/core/model/context-window-suffix.js +33 -0
- package/dist/core/model/model-catalog.js +1 -1
- package/dist/core/model/model-permission.js +12 -3
- package/dist/core/permission/ec-command-parser.js +51 -12
- package/dist/core/permission/sandbox-runtime.js +36 -14
- package/dist/core/permission/tool-policy.js +2 -1
- package/dist/index.js +280 -163
- package/dist/ipc.js +54 -2
- package/dist/response-system/engines/v1/proactive-flow.js +59 -2
- package/dist/stats/billing.js +41 -15
- package/dist/stats/db.js +159 -159
- package/dist/stats/eck-vars.js +9 -9
- package/dist/stats/price-resolver.js +28 -10
- package/dist/stats/query.js +139 -139
- package/dist/stats/role-budget.js +6 -6
- package/dist/stats/writer.js +51 -51
- package/dist/utils/cross-platform.js +30 -1
- package/dist/utils/error-dict.json +160 -160
- package/dist/utils/error-utils.js +21 -0
- package/dist/utils/evolcore-version.js +129 -0
- package/dist/utils/logger.js +3 -1
- package/dist/utils/macos-autostart.js +22 -22
- package/dist/utils/model-prices.jsonl +23 -23
- package/dist/utils/npm-ops.js +176 -35
- package/dist/utils/welcome.js +22 -22
- package/ecagent/LICENSE +21 -21
- package/ecagent/NOTICE +11 -11
- package/ecagent/README.md +61 -61
- package/ecagent/dist/harness/compaction/branch-summarization.js +30 -30
- package/ecagent/dist/harness/compaction/compaction.js +83 -83
- package/ecagent/dist/harness/messages.js +7 -7
- package/kits/docs/GUIDE.md +20 -20
- package/kits/docs/INDEX.md +66 -66
- package/kits/docs/aun/CHEATSHEET.md +19 -19
- package/kits/docs/aun/SYNC_PROTOCOL.md +15 -15
- package/kits/docs/channels/aun.md +56 -56
- package/kits/docs/channels/feishu.md +56 -56
- package/kits/docs/context-assembly.md +364 -364
- package/kits/docs/eck_templates/GUIDE.template.md +22 -22
- package/kits/docs/eck_templates/INDEX.template.md +28 -28
- package/kits/docs/eck_templates/path-registry.template.md +33 -33
- package/kits/docs/eck_templates/runtime.template.md +19 -19
- package/kits/docs/evolcore/INDEX.md +71 -71
- package/kits/docs/evolcore/agent-create.md +170 -165
- package/kits/docs/evolcore/agent.md +66 -66
- package/kits/docs/evolcore/aid.md +60 -60
- package/kits/docs/evolcore/codex-windows-sandbox.md +146 -146
- package/kits/docs/evolcore/config.md +202 -195
- package/kits/docs/evolcore/contact.md +75 -68
- package/kits/docs/evolcore/ctl.md +46 -46
- package/kits/docs/evolcore/event.md +216 -216
- package/kits/docs/evolcore/fs-architecture.md +1215 -1215
- package/kits/docs/evolcore/fs.md +110 -110
- package/kits/docs/evolcore/group-collaboration.md +243 -243
- package/kits/docs/evolcore/group-fs.md +17 -17
- package/kits/docs/evolcore/group-rules.md +251 -251
- package/kits/docs/evolcore/group.md +152 -152
- package/kits/docs/evolcore/menu-client.md +42 -34
- package/kits/docs/evolcore/model.md +50 -50
- package/kits/docs/evolcore/msg.md +166 -165
- package/kits/docs/evolcore/response.md +75 -75
- package/kits/docs/evolcore/rpc.md +37 -37
- package/kits/docs/evolcore/self-summary.md +29 -29
- package/kits/docs/evolcore/stats.md +83 -83
- package/kits/docs/evolcore/storage.md +50 -50
- package/kits/docs/evolcore/trigger.md +575 -575
- package/kits/docs/identity/AID_PROFILE_SPEC.md +26 -26
- package/kits/docs/identity/PATH_OPS.md +16 -16
- package/kits/docs/identity/ROLE_DETAIL.md +25 -25
- package/kits/docs/identity/identity-tools.md +26 -26
- package/kits/docs/path-registry.md +62 -62
- package/kits/docs/prompt-loading-architecture.md +269 -269
- package/kits/docs/venues/aun-group.md +45 -45
- package/kits/docs/venues/aun-private.md +10 -10
- package/kits/docs/venues/client-desktop.md +10 -10
- package/kits/docs/venues/client-mobile.md +10 -10
- package/kits/docs/venues/feishu-group.md +13 -13
- package/kits/docs/venues/feishu-private.md +9 -9
- package/kits/docs/venues/group.md +37 -25
- package/kits/docs/venues/private.md +10 -10
- package/kits/eck_manifest.auxiliary.json +43 -43
- package/kits/eck_manifest.json +190 -190
- package/kits/eck_message_manifest.json +74 -74
- package/kits/migrations/README-role-config-v4.md +32 -32
- package/kits/migrations/migrate-contact-book-v2.mjs +748 -748
- package/kits/migrations/migrate-role-config-v4.mjs +614 -614
- package/kits/migrations/migrate-role-config-v5.mjs +365 -365
- package/kits/migrations/rename-config-file.mjs +99 -99
- package/kits/rules/01-overview.md +162 -162
- package/kits/rules/02-navigation.md +96 -96
- package/kits/rules/03-identity.md +36 -36
- package/kits/rules/04-relation.md +75 -75
- package/kits/rules/05-venue.md +60 -60
- package/kits/rules/06-channel.md +63 -63
- package/kits/schemas/_meta.json +53 -53
- package/kits/schemas/agent-config.schema.1.json +177 -177
- package/kits/schemas/agent-config.schema.10.json +395 -395
- package/kits/schemas/agent-config.schema.11.json +421 -421
- package/kits/schemas/agent-config.schema.12.json +427 -427
- package/kits/schemas/agent-config.schema.2.json +239 -239
- package/kits/schemas/agent-config.schema.3.json +119 -119
- package/kits/schemas/agent-config.schema.4.json +208 -208
- package/kits/schemas/agent-config.schema.5.json +326 -326
- package/kits/schemas/agent-config.schema.6.json +322 -322
- package/kits/schemas/agent-config.schema.7.json +303 -303
- package/kits/schemas/agent-config.schema.8.json +304 -304
- package/kits/schemas/agent-config.schema.9.json +364 -364
- package/kits/schemas/contact-book.schema.1.json +36 -36
- package/kits/schemas/contact-book.schema.2.json +43 -43
- package/kits/schemas/contact-book.schema.3.json +67 -67
- package/kits/schemas/daemon.schema.1.json +91 -91
- package/kits/schemas/daemon.schema.2.json +101 -101
- package/kits/schemas/daemon.schema.3.json +123 -123
- package/kits/schemas/daemon.schema.4.json +136 -136
- package/kits/schemas/daemon.schema.5.json +135 -135
- package/kits/schemas/daemon.schema.6.json +131 -131
- package/kits/schemas/defaults.schema.1.json +81 -81
- package/kits/schemas/defaults.schema.2.json +85 -85
- package/kits/schemas/defaults.schema.3.json +73 -73
- package/kits/schemas/defaults.schema.4.json +107 -107
- package/kits/schemas/defaults.schema.5.json +119 -119
- package/kits/schemas/menu-exec-schema-commands.md +208 -208
- package/kits/schemas/migrations/README.md +30 -30
- package/kits/schemas/relation-config.schema.1.json +158 -158
- package/kits/schemas/relation-config.schema.2.json +73 -73
- package/kits/schemas/relation-config.schema.3.json +50 -50
- package/kits/schemas/relation-config.schema.4.json +47 -47
- package/kits/schemas/relation-config.schema.5.json +47 -47
- package/kits/schemas/relation-config.schema.6.json +46 -46
- package/kits/schemas/relation-config.schema.7.json +59 -59
- package/kits/schemas/relation-config.schema.8.json +103 -103
- package/kits/schemas/role-config.schema.1.json +201 -201
- package/kits/schemas/role-registry.schema.1.json +35 -35
- package/kits/schemas/single-session.schema.1.json +31 -31
- package/kits/schemas/single-session.schema.2.json +57 -57
- package/kits/schemas/single-session.schema.3.json +32 -32
- package/kits/templates/bootstrap-welcome.md +17 -17
- package/kits/templates/message-fragments/handoff-context-to-target.md +9 -9
- package/kits/templates/message-fragments/handoff-request-to-target.md +19 -19
- package/kits/templates/message-fragments/handoff-response-to-origin.md +9 -9
- package/kits/templates/message-fragments/inject-default.md +2 -2
- package/kits/templates/message-fragments/item.md +2 -2
- package/kits/templates/roles/admin.json +92 -92
- package/kits/templates/roles/member.json +96 -96
- package/kits/templates/roles/owner.json +9 -9
- package/kits/templates/roles/visitor.json +85 -85
- package/kits/templates/system-fragments/baseagent.md +14 -14
- package/kits/templates/system-fragments/bootstrap.md +31 -29
- package/kits/templates/system-fragments/channel.md +64 -64
- package/kits/templates/system-fragments/commands.md +28 -28
- package/kits/templates/system-fragments/identity.md +13 -13
- package/kits/templates/system-fragments/relation.md +19 -19
- package/kits/templates/system-fragments/session.md +59 -59
- package/kits/templates/system-fragments/venue.md +31 -31
- package/package.json +100 -98
package/dist/aun/menu-client.js
CHANGED
|
@@ -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);
|
package/dist/aun/msg/group.js
CHANGED
|
@@ -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
|
|
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 !== '
|
|
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;
|
package/dist/aun/msg/p2p.js
CHANGED
|
@@ -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
|
|
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
|
package/dist/aun/msg/upload.js
CHANGED
|
@@ -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
|
-
//
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
//
|
|
66
|
-
if (
|
|
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
|
-
*
|
|
148
|
-
*
|
|
149
|
-
*
|
|
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);
|