@entrorove/skill 0.1.29 → 0.1.32
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 +15 -0
- package/SKILL.md +6 -2
- package/cli.mjs +26 -1
- package/cloud-task-client.mjs +175 -0
- package/manifest.json +1 -1
- package/package.json +2 -1
- package/release-state.json +7 -6
- package/release.mjs +2 -1
- package/releases.json +18 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.32 — 2026-10-11
|
|
4
|
+
|
|
5
|
+
- 增加云端沙箱状态与用量只读查询,并支持按任务直接读取真实状态。
|
|
6
|
+
- Added read-only cloud sandbox status and direct reads of authoritative task state and usage.
|
|
7
|
+
|
|
8
|
+
## 0.1.31 — 2026-10-11
|
|
9
|
+
|
|
10
|
+
- 修复云端沙箱任务响应处理并保留可继续的任务上下文。
|
|
11
|
+
- Hardened cloud sandbox responses and preserved continuation task context.
|
|
12
|
+
|
|
13
|
+
## 0.1.30 — 2026-10-11
|
|
14
|
+
|
|
15
|
+
- 修复云端沙箱任务路由与逐任务选择交互。
|
|
16
|
+
- Fixed cloud sandbox task routing and per-task choice interaction.
|
|
17
|
+
|
|
3
18
|
## 0.1.29 — 2026-10-11
|
|
4
19
|
|
|
5
20
|
- 更新了自动版本与更新日志、远端恢复客户端。
|
package/SKILL.md
CHANGED
|
@@ -5,7 +5,7 @@ description: An engineering skill that understands a task, chooses a fitting wor
|
|
|
5
5
|
|
|
6
6
|
# entrorove · 熵巡
|
|
7
7
|
|
|
8
|
-
Version: 0.1.
|
|
8
|
+
Version: 0.1.32.
|
|
9
9
|
|
|
10
10
|
Read the user's goal and repository instructions first. Preserve the original task through planning, execution and verification. Use the workflow only where it helps; a small, low-risk edit can proceed directly. Never claim a reported step is a verified result.
|
|
11
11
|
|
|
@@ -25,9 +25,13 @@ On first use or after a material agreement revision, the CLI returns a Confirm P
|
|
|
25
25
|
|
|
26
26
|
Send JSON on standard input to `npx @entrorove/skill invoke`. Before every execution call, discover `operation: "capabilities"` with `{}` and validate input against the returned operation schema. The CLI performs remote discovery automatically; local adapters discover the installed contract before execution. Discovery failure stops execution. Adapters that expose the four-step task route can call `task-describe`, `message-route`, `message-accept` and `task-resume` in order; `start` remains the one-call workflow equivalent. Then start with `operation: "start"` and an `input.task` containing the goal, work type, risk, difficulty and observed scope facts. Work types are `implementation`, `documentation`, `calculation`, `merge`, `review`, `decision` and `diagnosis`. Assess facts from the real task and repository; do not invent certainty. entrorove chooses the workflow. A small task may return `decision: "direct"`, meaning the IDE should do the work without another service call. The public envelope is `entrorove.skill.request/2.0`; `requestId` is the SHA-256 digest of `operation + canonical(input)`. Version 1.0 remains accepted for older callers.
|
|
27
27
|
|
|
28
|
+
`start` creates a normal durable skill flow. It does not create a cloud-sandbox task or contribute to cloud-sandbox usage. To create a real cloud-sandbox task, call `operation: "cloud-task"` with `input.goal`; the CLI returns a Confirm Protocol choice interaction before any cloud request. Continue the same request with `sandboxChoice: "use"` or `sandboxChoice: "local"`. `use` calls the authenticated `/api/cloud-task` endpoint and returns the real `taskId`; `local` skips only this task. The server is authoritative for account entitlement and the account-wide sandbox preference: a disabled or unavailable account returns `blocked` and creates no task. A `needs-input`, `blocked` or `failed` result is not a successful dispatch and must be shown to the user.
|
|
29
|
+
|
|
30
|
+
After dispatch, query the real task without resending it with the CLI-only `operation: "cloud-status"` and `input.taskId`, or `npx @entrorove/skill cloud-status` with the same JSON. This special CLI route reads the authoritative task list and usage endpoints; it is not part of the `/api/skill/invoke` capability map. The read-only result includes the current task status, public title/summary, and recorded model usage when available. A missing task is reported explicitly; it is never treated as completed. This is the skill-side status and usage check for cloud tasks; the web dock may additionally subscribe to its event stream.
|
|
31
|
+
|
|
28
32
|
### Per-task cloud sandbox choice
|
|
29
33
|
|
|
30
|
-
When the host exposes an enabled cloud-sandbox preference and a new task is about to dispatch a cloud model, ask once whether this task should use the cloud sandbox. This is a low-risk routing preference, separate from agreement acceptance and the medium/high-risk confirmations below. Offer `use for this task` and `continue locally`; if the user gives no answer, use the cloud sandbox by the host's stated timeout default. An explicit opt-out applies only to the current task and must not change the account-wide sandbox preference. Do not ask again while continuing or resuming the same task. If the
|
|
34
|
+
When the host exposes an enabled cloud-sandbox preference and a new task is about to dispatch a cloud model, ask once whether this task should use the cloud sandbox. This is a low-risk routing preference, separate from agreement acceptance and the medium/high-risk confirmations below. Offer `use for this task` and `continue locally`; if the user gives no answer, use the cloud sandbox by the host's stated timeout default. An explicit opt-out applies only to the current task and must not change the account-wide sandbox preference. Do not ask again while continuing or resuming the same task. If the host cannot preflight the account preference, show the choice only as a routing decision and let the server's authoritative `/api/cloud-task` check return a clear `blocked` prerequisite; never claim that a task started after a blocked response. This choice never bypasses the normal task schema, mutation authority, evidence checks, or risk confirmation.
|
|
31
35
|
|
|
32
36
|
```json
|
|
33
37
|
{"operation":"start","input":{"task":{"goal":"Update the checkout flow and verify it","workType":"implementation","risk":"medium","difficulty":"medium","crossModule":true,"parallel":false,"unclear":false,"architectureContract":false}}}
|
package/cli.mjs
CHANGED
|
@@ -12,6 +12,7 @@ import { runTaskMessageCli } from './task-message-cli.mjs';
|
|
|
12
12
|
import { apiUrl, buildInvocation, invokeRemote, queryFlows, queryStatus } from './remote-client.mjs';
|
|
13
13
|
const packageDir = path.dirname(fileURLToPath(import.meta.url));
|
|
14
14
|
import { buildReview, submitSkillFeedback, feedbackNoticeVersion } from './review-client.mjs';
|
|
15
|
+
import { queryCloudTask, runCloudTask as dispatchCloudTask } from './cloud-task-client.mjs';
|
|
15
16
|
const markerName = '.entrorove-managed.json';
|
|
16
17
|
const installFiles = ['SKILL.md', 'CAPABILITY-MAP.md', 'AGREEMENT.md', 'manifest.json'];
|
|
17
18
|
const markerSchema = 'entrorove.managed-install/1.0';
|
|
@@ -381,7 +382,27 @@ export function remoteDependencies(home = os.homedir()) {
|
|
|
381
382
|
};
|
|
382
383
|
}
|
|
383
384
|
|
|
385
|
+
export async function runCloudTask(input, dependencies = remoteDependencies()) {
|
|
386
|
+
const result = await dispatchCloudTask(input, dependencies);
|
|
387
|
+
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
388
|
+
if (['blocked', 'failed', 'incomplete', 'needs-input'].includes(result.status)) process.exitCode = 2;
|
|
389
|
+
return result;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
export async function runCloudStatus(input, dependencies = remoteDependencies()) {
|
|
393
|
+
const result = await queryCloudTask(input?.taskId, dependencies);
|
|
394
|
+
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
395
|
+
if (['blocked', 'failed', 'missing'].includes(result.status)) process.exitCode = 2;
|
|
396
|
+
return result;
|
|
397
|
+
}
|
|
398
|
+
|
|
384
399
|
async function invoke(data) {
|
|
400
|
+
if (data?.operation === 'cloud-task') {
|
|
401
|
+
return runCloudTask(data.input, remoteDependencies());
|
|
402
|
+
}
|
|
403
|
+
if (data?.operation === 'cloud-status') {
|
|
404
|
+
return runCloudStatus(data.input, remoteDependencies());
|
|
405
|
+
}
|
|
385
406
|
return invokeRemote(data, remoteDependencies());
|
|
386
407
|
}
|
|
387
408
|
|
|
@@ -410,6 +431,10 @@ async function main() {
|
|
|
410
431
|
await invoke(await stdinJson());
|
|
411
432
|
} else if (command === 'host-message') {
|
|
412
433
|
await runTaskMessageCli(args, await stdinJson(), remoteDependencies());
|
|
434
|
+
} else if (command === 'cloud-task' && args.length === 0) {
|
|
435
|
+
await runCloudTask(await stdinJson());
|
|
436
|
+
} else if (command === 'cloud-status' && args.length === 0) {
|
|
437
|
+
await runCloudStatus(await stdinJson());
|
|
413
438
|
} else if (command === 'review' && args.length === 0) {
|
|
414
439
|
await submitReview(await stdinJson());
|
|
415
440
|
} else if (command === 'status' && args.length === 1) {
|
|
@@ -431,7 +456,7 @@ async function main() {
|
|
|
431
456
|
} else if (command === 'local') {
|
|
432
457
|
await runLocal(args);
|
|
433
458
|
} else {
|
|
434
|
-
throw new Error('Usage: entrorove install | configure | agreement | invoke | host-message [adapterModulePath] | status <requestId> | flows | review | local (JSON on stdin)');
|
|
459
|
+
throw new Error('Usage: entrorove install | configure | agreement | invoke | host-message [adapterModulePath] | cloud-task | cloud-status | status <requestId> | flows | review | local (JSON on stdin)');
|
|
435
460
|
}
|
|
436
461
|
}
|
|
437
462
|
if (process.argv[1] && realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url))) {
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { appendInvocation } from './local-invocations.mjs';
|
|
3
|
+
import { parseTransportResponse, requestTransport, trustedOrigin } from './remote-transport.mjs';
|
|
4
|
+
|
|
5
|
+
const CLOUD_TASK_SCHEMA = 'entrorove.cloud-task/1.0';
|
|
6
|
+
const CLOUD_STATUS_SCHEMA = 'entrorove.cloud-status/1.0';
|
|
7
|
+
const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
8
|
+
|
|
9
|
+
function canonical(value) {
|
|
10
|
+
if (Array.isArray(value)) return `[${value.map(canonical).join(',')}]`;
|
|
11
|
+
if (value && typeof value === 'object') {
|
|
12
|
+
return `{${Object.keys(value).sort().map(key => `${JSON.stringify(key)}:${canonical(value[key])}`).join(',')}}`;
|
|
13
|
+
}
|
|
14
|
+
return JSON.stringify(value);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function requestId(input) {
|
|
18
|
+
return createHash('sha256').update(`cloud-task${canonical(input)}`).digest('hex');
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function validateInput(input) {
|
|
22
|
+
if (!input || typeof input !== 'object' || Array.isArray(input)) throw new Error('cloud-task input must be a JSON object');
|
|
23
|
+
if (typeof input.goal !== 'string' || !input.goal.trim() || input.goal.length > 12_000) {
|
|
24
|
+
throw new Error('cloud-task goal must be a non-empty string of at most 12000 characters');
|
|
25
|
+
}
|
|
26
|
+
if (input.ideTaskId !== undefined && (typeof input.ideTaskId !== 'string' || !input.ideTaskId.trim() || input.ideTaskId.length > 200)) {
|
|
27
|
+
throw new Error('cloud-task ideTaskId must be a non-empty string of at most 200 characters');
|
|
28
|
+
}
|
|
29
|
+
if (input.sandboxChoice !== undefined && !['use', 'local'].includes(input.sandboxChoice)) {
|
|
30
|
+
throw new Error('cloud-task sandboxChoice must be use or local');
|
|
31
|
+
}
|
|
32
|
+
return { goal: input.goal, ...(input.ideTaskId === undefined ? {} : { ideTaskId: input.ideTaskId }) };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function validateDependencies(dependencies) {
|
|
36
|
+
if (!dependencies || !['install', 'agreementAccepted', 'agreementRequired', 'readCredential', 'apiOrigin']
|
|
37
|
+
.every(key => typeof dependencies[key] === 'function')) {
|
|
38
|
+
throw new Error('Cloud sandbox client requires installed agreement, credential, and API-origin dependencies');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function validateTaskId(taskId) {
|
|
43
|
+
if (typeof taskId !== 'string' || !UUID.test(taskId)) throw new Error('cloud-status taskId must be a UUID');
|
|
44
|
+
return taskId;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function sandboxChoiceInteraction(id) {
|
|
48
|
+
return {
|
|
49
|
+
schemaVersion: 'confirm.interaction/1.0', requestId: id, type: 'choice',
|
|
50
|
+
question: '是否为本任务使用云端沙箱?',
|
|
51
|
+
options: [
|
|
52
|
+
{ id: 'use', label: '本任务使用云端沙箱', hint: '创建真实云端任务并持续记录进度' },
|
|
53
|
+
{ id: 'local', label: '继续本地执行', hint: '仅当前任务退出云端沙箱' },
|
|
54
|
+
],
|
|
55
|
+
default: 'use', timeout: 8_000, timeoutAction: 'use', risk: 'low',
|
|
56
|
+
riskDescription: '这是当前任务的执行位置选择,不改变账号级云端沙箱开关。',
|
|
57
|
+
rememberable: false, memoryKey: '',
|
|
58
|
+
callback: { operation: 'cloud-task', payload: { sandboxChoice: 'use' } },
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function envelope(input, status, extra = {}) {
|
|
63
|
+
return { schemaVersion: CLOUD_TASK_SCHEMA, status, requestId: requestId(input), ...extra };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function responseBody(response) {
|
|
67
|
+
try { return parseTransportResponse(response, 'cloud-task'); }
|
|
68
|
+
catch (cause) { throw Object.assign(new Error('Cloud sandbox returned an invalid response'), { cause }); }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export async function runCloudTask(input, dependencies) {
|
|
72
|
+
const task = validateInput(input);
|
|
73
|
+
validateDependencies(dependencies);
|
|
74
|
+
const id = requestId(task);
|
|
75
|
+
await dependencies.install();
|
|
76
|
+
if (!await dependencies.agreementAccepted(dependencies.home)) {
|
|
77
|
+
return envelope(task, 'blocked', { code: 'agreement-required', interaction: dependencies.agreementRequired(dependencies.home) });
|
|
78
|
+
}
|
|
79
|
+
if (input.sandboxChoice === undefined) return envelope(task, 'needs-input', {
|
|
80
|
+
task, interaction: sandboxChoiceInteraction(id),
|
|
81
|
+
});
|
|
82
|
+
if (input.sandboxChoice === 'local') return envelope(task, 'skipped', { reason: 'task' });
|
|
83
|
+
|
|
84
|
+
const token = await dependencies.readCredential(dependencies.home);
|
|
85
|
+
const origin = trustedOrigin(dependencies.apiOrigin());
|
|
86
|
+
const metadata = { kind: 'remote', operation: 'cloud-task', requestId: id };
|
|
87
|
+
await appendInvocation({ ...metadata, event: 'started' }, dependencies.home);
|
|
88
|
+
let response;
|
|
89
|
+
try {
|
|
90
|
+
response = await requestTransport(origin, '/api/cloud-task', {
|
|
91
|
+
method: 'POST', timeoutMs: 30_000,
|
|
92
|
+
headers: { 'content-type': 'application/json', authorization: `Bearer ${token}` },
|
|
93
|
+
body: JSON.stringify(task),
|
|
94
|
+
});
|
|
95
|
+
} catch (cause) {
|
|
96
|
+
if (cause.established) await appendInvocation({ ...metadata, event: 'outcome-unknown' }, dependencies.home);
|
|
97
|
+
else await appendInvocation({ ...metadata, event: 'not-sent' }, dependencies.home);
|
|
98
|
+
throw cause.established
|
|
99
|
+
? Object.assign(new Error(`Cloud sandbox outcome is unknown; requestId=${id}. Query the task list before retrying.`), { requestId: id, outcomeUnknown: true })
|
|
100
|
+
: cause;
|
|
101
|
+
}
|
|
102
|
+
let result;
|
|
103
|
+
try {
|
|
104
|
+
result = await responseBody(response);
|
|
105
|
+
} catch (cause) {
|
|
106
|
+
await appendInvocation({ ...metadata, event: 'outcome-unknown' }, dependencies.home);
|
|
107
|
+
throw Object.assign(new Error(`Cloud sandbox returned an unusable response; requestId=${id}. Query the task list before retrying.`), {
|
|
108
|
+
requestId: id, outcomeUnknown: true, cause,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
if (!response.ok) {
|
|
112
|
+
await appendInvocation({ ...metadata, event: response.status >= 500 ? 'outcome-unknown' : 'rejected' }, dependencies.home);
|
|
113
|
+
const code = typeof result?.error === 'string' ? result.error : 'cloud-task-rejected';
|
|
114
|
+
return envelope(task, response.status === 403 ? 'blocked' : 'failed', { code, message: result?.message ?? code, httpStatus: response.status });
|
|
115
|
+
}
|
|
116
|
+
if (!result?.ok || typeof result.taskId !== 'string' || !UUID.test(result.taskId)) {
|
|
117
|
+
await appendInvocation({ ...metadata, event: 'outcome-unknown' }, dependencies.home);
|
|
118
|
+
throw new Error(`Cloud sandbox response lost its task identity; requestId=${id}`);
|
|
119
|
+
}
|
|
120
|
+
await appendInvocation({ ...metadata, event: 'completed' }, dependencies.home);
|
|
121
|
+
return envelope(task, 'started', { taskId: result.taskId,
|
|
122
|
+
taskStatus: typeof result.status === 'string' ? result.status : 'running',
|
|
123
|
+
executionIsolation: typeof result.executionIsolation === 'string' ? result.executionIsolation : 'worker' });
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function publicTask(task) {
|
|
127
|
+
if (!task || typeof task !== 'object' || Array.isArray(task)) return null;
|
|
128
|
+
const allowed = ['id', 'status', 'displayTitle', 'titleStatus', 'titleError', 'summary', 'ideTaskId',
|
|
129
|
+
'createdAt', 'updatedAt', 'completedAt'];
|
|
130
|
+
return Object.fromEntries(allowed.filter(key => task[key] !== undefined).map(key => [key, task[key]]));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function publicUsage(value) {
|
|
134
|
+
if (!Array.isArray(value)) return [];
|
|
135
|
+
const allowed = ['usageId', 'requestId', 'operation', 'attempt', 'meterKind', 'state', 'tokenStatus',
|
|
136
|
+
'inputTokens', 'outputTokens', 'durationMs', 'durationBasis', 'providerId', 'modelId'];
|
|
137
|
+
return value.filter(item => item && typeof item === 'object' && !Array.isArray(item))
|
|
138
|
+
.map(item => Object.fromEntries(allowed.filter(key => item[key] !== undefined).map(key => [key, item[key]])));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export async function queryCloudTask(taskId, dependencies) {
|
|
142
|
+
const id = validateTaskId(taskId);
|
|
143
|
+
validateDependencies(dependencies);
|
|
144
|
+
await dependencies.install();
|
|
145
|
+
if (!await dependencies.agreementAccepted(dependencies.home)) {
|
|
146
|
+
return { schemaVersion: CLOUD_STATUS_SCHEMA, status: 'blocked', taskId: id,
|
|
147
|
+
code: 'agreement-required', interaction: dependencies.agreementRequired(dependencies.home) };
|
|
148
|
+
}
|
|
149
|
+
const token = await dependencies.readCredential(dependencies.home);
|
|
150
|
+
const origin = trustedOrigin(dependencies.apiOrigin());
|
|
151
|
+
const metadata = { kind: 'remote', operation: 'cloud-status', requestId: requestId({ taskId: id }) };
|
|
152
|
+
const taskResponse = await requestTransport(origin, `/api/cloud-sandbox/tasks/${id}`, { headers: { authorization: `Bearer ${token}` } });
|
|
153
|
+
let taskBody;
|
|
154
|
+
try { taskBody = await responseBody(taskResponse); } catch { taskBody = null; }
|
|
155
|
+
if (!taskResponse.ok || !taskBody?.task || taskBody.task.id !== id) {
|
|
156
|
+
await appendInvocation({ ...metadata, event: 'rejected' }, dependencies.home);
|
|
157
|
+
return { schemaVersion: CLOUD_STATUS_SCHEMA, status: taskResponse.status === 403 ? 'blocked' : taskResponse.status === 404 ? 'missing' : 'failed', taskId: id,
|
|
158
|
+
code: typeof taskBody?.error === 'string' ? taskBody.error : taskResponse.status === 404 ? 'cloud-task-not-found' : 'cloud-status-unavailable', httpStatus: taskResponse.status };
|
|
159
|
+
}
|
|
160
|
+
const task = taskBody.task;
|
|
161
|
+
let usage = [];
|
|
162
|
+
let usageError;
|
|
163
|
+
const usageResponse = await requestTransport(origin, `/api/cloud-sandbox/tasks/${id}/usage`, {
|
|
164
|
+
headers: { authorization: `Bearer ${token}` },
|
|
165
|
+
});
|
|
166
|
+
try {
|
|
167
|
+
const usageBody = await responseBody(usageResponse);
|
|
168
|
+
if (usageResponse.ok) usage = publicUsage(usageBody?.usage);
|
|
169
|
+
else usageError = typeof usageBody?.error === 'string' ? usageBody.error : 'cloud-usage-unavailable';
|
|
170
|
+
} catch { usageError = 'cloud-usage-invalid-response'; }
|
|
171
|
+
await appendInvocation({ ...metadata, event: 'status' }, dependencies.home);
|
|
172
|
+
return { schemaVersion: CLOUD_STATUS_SCHEMA, status: 'observed', taskId: id,
|
|
173
|
+
taskStatus: task.status, task: publicTask(task), usage, ...(usageError ? { usageError } : {}) };
|
|
174
|
+
}
|
|
175
|
+
|
package/manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@entrorove/skill",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.32",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"entrorove": "cli.mjs"
|
|
@@ -76,6 +76,7 @@
|
|
|
76
76
|
"local-task-handoff-write-archive.mjs",
|
|
77
77
|
"local-task-handoff-write-receipts.mjs",
|
|
78
78
|
"remote-client.mjs",
|
|
79
|
+
"cloud-task-client.mjs",
|
|
79
80
|
"remote-transport.mjs",
|
|
80
81
|
"local-credential.mjs",
|
|
81
82
|
"local-invocations.mjs",
|
package/release-state.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "entrorove.release-state/1.0",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"digest": "
|
|
3
|
+
"version": "0.1.32",
|
|
4
|
+
"digest": "615bc63383071e3a1356d129b2c072e1641744f6b82def3ec0c2f56fa68a39a4",
|
|
5
5
|
"files": {
|
|
6
6
|
"local-final-gate16.mjs": "b30caab08441449ad556a6e9a3cefbf91190f0b3f7370f46d2a21156375aa8e3",
|
|
7
7
|
"local-final-gate16-checks.mjs": "1dd30e9666d458d8b12ca6e4975f6f0ac8450c3ea9cbecc7401ae037f66b589a",
|
|
@@ -44,15 +44,15 @@
|
|
|
44
44
|
"local-autocoord17-waits.mjs": "2b0a713987822548a94e1ed3a9a891532db45383797dfc5d5bc8d1e35593cf25",
|
|
45
45
|
"local-validator-isolation17.mjs": "48e94604e28b8fddd567dfb35ff60b73fd094a5803bd49f076388b7f310f92aa",
|
|
46
46
|
"local-calctool-composition17.mjs": "ac89fcb41ab0d0d9b47c1b5696945281b0894eb064820775e36a011c76314e6a",
|
|
47
|
-
"cli.mjs": "
|
|
47
|
+
"cli.mjs": "6d455d8e22fccd24332726de6821a8a99f628d057648c9aae7c6262d89745722",
|
|
48
48
|
"review-client.mjs": "3491eef68ed533174b31db3c53febb6519b8f088f71a9964644714a9a4c03c77",
|
|
49
49
|
"version.mjs": "1f392147d72c40af4b03b307ea607075fb815af5174fa07e254b95fe12dbf3e7",
|
|
50
|
-
"SKILL.md": "
|
|
50
|
+
"SKILL.md": "20c09094ffd094fa59f73a26b8cbb987cf40a8247368bb5b6417695831ed2a70",
|
|
51
51
|
"CAPABILITY-MAP.md": "128ecc8d90b2c17846ce6f0c650eada9e7fa7240f5d3c03b31e3ee01135557b8",
|
|
52
52
|
"AGREEMENT.md": "f93a68e92c457200dd024610e65f74e478b8f60860f951da818b70561f1b9bf8",
|
|
53
|
-
"package.json": "
|
|
53
|
+
"package.json": "77e29f7740cc2a2284490a992a9945fbb4a3ad3ac044f4ff9a59b1aa83e44ae0",
|
|
54
54
|
"manifest.json": "ab06e307795bc9da5add926752b6c4dbdaf18625090261a035aa356a679c504f",
|
|
55
|
-
"release.mjs": "
|
|
55
|
+
"release.mjs": "1e6155d10b5e6384414233847815742e13f0945101c5f53253ad9ca827766beb",
|
|
56
56
|
"local-cli.mjs": "ecc85bc5f36a5663fef004e59525374dc7883d3889f5a0cfe219ae5e84b2d3ea",
|
|
57
57
|
"local-state-lock.mjs": "1dbf64264642a0851faf043e07ee9f66d2ad0508e9f799b0626246e42fae893e",
|
|
58
58
|
"local-execution.mjs": "97dfad5e889e679e9cc34434005342526502795abba21078fa40673788073153",
|
|
@@ -118,6 +118,7 @@
|
|
|
118
118
|
"local-scope-workspaces.mjs": "a44c34537e5ed2dcaf193a985e5bc05957989fbb160a650f9e37ba7d66eb2de8",
|
|
119
119
|
"local-task-routing.mjs": "e26d6f1ba134ffe1da2a49b4fb6bb6dfa5617671f774a08e719d04f202cf5eca",
|
|
120
120
|
"remote-client.mjs": "ce16258faffb09c9db19609d47a0af6f63fcbc256feb35ba7a14bbb89e69cc6e",
|
|
121
|
+
"cloud-task-client.mjs": "ca6c5af7f7c2507680fcce3b8ab739a50ebed88f5a202cffbecea962861bbebb",
|
|
121
122
|
"remote-transport.mjs": "5e5a8c0b490371f7f5a052cffbeee6202d4cf713dff1c43b6d910fe944f8429c",
|
|
122
123
|
"local-credential.mjs": "2a302a7f67b5ea8dc73453fc96ab33db349b59ca11fa9456e48ca1d9669d877c",
|
|
123
124
|
"local-invocations.mjs": "f6ac4c41c1a5ec34de358c4cca210ca8e403b3a913150a43bb55ec9be55d9998",
|
package/release.mjs
CHANGED
|
@@ -89,7 +89,7 @@ const sourceFiles = [
|
|
|
89
89
|
'local-scope-snapshot.mjs',
|
|
90
90
|
'local-scope-state.mjs',
|
|
91
91
|
'local-scope-workspaces.mjs',
|
|
92
|
-
'local-task-routing.mjs', 'remote-client.mjs',
|
|
92
|
+
'local-task-routing.mjs', 'remote-client.mjs', 'cloud-task-client.mjs',
|
|
93
93
|
'remote-transport.mjs', 'local-credential.mjs', 'local-invocations.mjs',
|
|
94
94
|
'local-task-handoff-fence.mjs',
|
|
95
95
|
'local-task-handoff-storage.mjs', 'local-task-handoff-overlay-wire.mjs', 'local-task-handoff-completion-wire.mjs',
|
|
@@ -343,6 +343,7 @@ function releaseNote(changed) {
|
|
|
343
343
|
'remote-client.mjs': { zh: '远端恢复客户端', en: 'remote recovery client' },
|
|
344
344
|
'task-message-entry.mjs': { zh: '任务消息实际投递入口', en: 'task message host delivery entry' },
|
|
345
345
|
'task-message-cli.mjs': { zh: '任务消息命令与适配器', en: 'task message command and adapter' },
|
|
346
|
+
'cloud-task-client.mjs': { zh: '云端沙箱任务路由与逐任务选择', en: 'cloud sandbox task routing and per-task choice' },
|
|
346
347
|
})
|
|
347
348
|
const distinct = distinctReleaseLabels(changed, labels)
|
|
348
349
|
return {
|
package/releases.json
CHANGED
|
@@ -1,4 +1,22 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "0.1.32",
|
|
4
|
+
"date": "2026-10-11",
|
|
5
|
+
"zh": "增加云端沙箱状态与用量只读查询,并支持按任务直接读取真实状态。",
|
|
6
|
+
"en": "Added read-only cloud sandbox status and direct reads of authoritative task state and usage."
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"version": "0.1.31",
|
|
10
|
+
"date": "2026-10-11",
|
|
11
|
+
"zh": "修复云端沙箱任务响应处理并保留可继续的任务上下文。",
|
|
12
|
+
"en": "Hardened cloud sandbox responses and preserved continuation task context."
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"version": "0.1.30",
|
|
16
|
+
"date": "2026-10-11",
|
|
17
|
+
"zh": "修复云端沙箱任务路由与逐任务选择交互。",
|
|
18
|
+
"en": "Fixed cloud sandbox task routing and per-task choice interaction."
|
|
19
|
+
},
|
|
2
20
|
{
|
|
3
21
|
"version": "0.1.29",
|
|
4
22
|
"date": "2026-10-11",
|