@skrr-ai/cli 0.1.119 → 0.1.120
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/dist/base-command.d.ts +31 -0
- package/dist/base-command.js +106 -4
- package/dist/commands/commands.js +11 -0
- package/dist/commands/commitments/action-proposal.d.ts +13 -0
- package/dist/commands/commitments/action-proposal.js +39 -0
- package/dist/commands/commitments/action-proposals/decide.js +8 -1
- package/dist/commands/commitments/action-proposals/execute.js +11 -1
- package/dist/commands/commitments/create.js +2 -2
- package/dist/commands/commitments/doctor.d.ts +8 -0
- package/dist/commands/commitments/doctor.js +22 -0
- package/dist/commands/commitments/execute-remediation.js +12 -1
- package/dist/commands/commitments/observations.js +2 -2
- package/dist/commands/commitments/pack/bind.d.ts +18 -1
- package/dist/commands/commitments/pack/bind.js +66 -8
- package/dist/commands/commitments/pack/plan.d.ts +4 -1
- package/dist/commands/commitments/pack/plan.js +30 -2
- package/dist/commands/commitments/update.js +8 -2
- package/dist/commands/completion/index.js +1 -1
- package/dist/commands/completion/values.js +1 -1
- package/dist/commands/computer-use/audio.d.ts +1 -0
- package/dist/commands/computer-use/audio.js +1 -0
- package/dist/commands/computer-use/browser.d.ts +1 -0
- package/dist/commands/computer-use/browser.js +1 -0
- package/dist/commands/computer-use/disable.d.ts +1 -0
- package/dist/commands/computer-use/disable.js +1 -0
- package/dist/commands/computer-use/enable.d.ts +1 -0
- package/dist/commands/computer-use/enable.js +1 -0
- package/dist/commands/computer-use/index.d.ts +1 -0
- package/dist/commands/computer-use/index.js +1 -0
- package/dist/commands/computer-use/install.d.ts +1 -0
- package/dist/commands/computer-use/install.js +1 -0
- package/dist/commands/computer-use/recover.d.ts +1 -0
- package/dist/commands/computer-use/recover.js +1 -0
- package/dist/commands/computer-use/status.d.ts +1 -0
- package/dist/commands/computer-use/status.js +1 -0
- package/dist/commands/computer-use/stop.d.ts +1 -0
- package/dist/commands/computer-use/stop.js +1 -0
- package/dist/commands/context.js +16 -11
- package/dist/commands/convos/recovery.js +1 -1
- package/dist/commands/daemon/diagnostics.d.ts +9 -0
- package/dist/commands/daemon/diagnostics.js +53 -0
- package/dist/commands/daemon/index.js +2 -0
- package/dist/commands/daemon/maintenance/attest.d.ts +15 -0
- package/dist/commands/daemon/maintenance/attest.js +52 -0
- package/dist/commands/daemon/maintenance/hold.d.ts +17 -0
- package/dist/commands/daemon/maintenance/hold.js +70 -0
- package/dist/commands/daemon/maintenance/index.d.ts +12 -0
- package/dist/commands/daemon/maintenance/index.js +30 -0
- package/dist/commands/daemon/maintenance/resume.d.ts +13 -0
- package/dist/commands/daemon/maintenance/resume.js +36 -0
- package/dist/commands/daemon/maintenance/status.d.ts +13 -0
- package/dist/commands/daemon/maintenance/status.js +36 -0
- package/dist/commands/doctor.d.ts +4 -1
- package/dist/commands/doctor.js +50 -6
- package/dist/commands/followups/plans/cancel-batch.js +6 -3
- package/dist/commands/followups/plans/capacity.js +7 -3
- package/dist/commands/followups/plans/observability.js +11 -3
- package/dist/commands/followups/plans/preferences/set.js +26 -8
- package/dist/commands/followups/plans/preferences.js +1 -1
- package/dist/commands/followups/plans/show.js +1 -1
- package/dist/commands/goals/key-results/assess.d.ts +36 -0
- package/dist/commands/goals/key-results/assess.js +110 -0
- package/dist/commands/goals/key-results/history.d.ts +30 -0
- package/dist/commands/goals/key-results/history.js +104 -0
- package/dist/commands/goals/key-results/list.d.ts +5 -4
- package/dist/commands/goals/key-results/list.js +12 -6
- package/dist/commands/goals/key-results/show.d.ts +4 -2
- package/dist/commands/goals/key-results/show.js +25 -4
- package/dist/commands/goals/key-results/update.d.ts +4 -0
- package/dist/commands/goals/key-results/update.js +18 -24
- package/dist/commands/goals/plan-now.js +12 -1
- package/dist/commands/goals/planner-compare.d.ts +30 -0
- package/dist/commands/goals/planner-compare.js +136 -0
- package/dist/commands/machines/dedicated/service/exec.d.ts +3 -0
- package/dist/commands/machines/dedicated/service/exec.js +70 -11
- package/dist/commands/machines/hosted/destroy.d.ts +1 -0
- package/dist/commands/machines/hosted/destroy.js +11 -1
- package/dist/commands/machines/hosted/exec.d.ts +1 -0
- package/dist/commands/machines/hosted/exec.js +12 -1
- package/dist/commands/machines/hosted/index.js +1 -0
- package/dist/commands/machines/hosted/operation.d.ts +14 -0
- package/dist/commands/machines/hosted/operation.js +51 -0
- package/dist/commands/machines/hosted/pull.js +1 -1
- package/dist/commands/machines/hosted/start.js +6 -2
- package/dist/commands/spaces/auto-executor/compare.d.ts +18 -0
- package/dist/commands/spaces/auto-executor/compare.js +139 -0
- package/dist/commands/spaces/auto-executor/runs.d.ts +3 -0
- package/dist/commands/spaces/auto-executor/runs.js +13 -1
- package/dist/commands/spaces/charter/create-from-description.d.ts +21 -0
- package/dist/commands/spaces/charter/create-from-description.js +77 -0
- package/dist/commands/spaces/charter/show.d.ts +22 -0
- package/dist/commands/spaces/charter/show.js +61 -0
- package/dist/commands/spaces/heartbeats/list.d.ts +1 -16
- package/dist/commands/spaces/heartbeats/list.js +13 -0
- package/dist/commands/spaces/install-template.js +3 -0
- package/dist/commands/spaces/loops/migrate.d.ts +32 -0
- package/dist/commands/spaces/loops/migrate.js +103 -0
- package/dist/commands/spaces/loops/release.d.ts +14 -0
- package/dist/commands/spaces/loops/release.js +59 -0
- package/dist/commands/spaces/notebook.d.ts +25 -0
- package/dist/commands/spaces/notebook.js +75 -0
- package/dist/commands/spaces/proposals/discard.d.ts +17 -0
- package/dist/commands/spaces/proposals/discard.js +17 -0
- package/dist/commands/spaces/proposals/keep.d.ts +17 -0
- package/dist/commands/spaces/proposals/keep.js +17 -0
- package/dist/commands/spaces/proposals/list.d.ts +24 -0
- package/dist/commands/spaces/proposals/list.js +89 -0
- package/dist/commands/spaces/skills/propose.d.ts +29 -0
- package/dist/commands/spaces/skills/propose.js +82 -0
- package/dist/commands/spaces/templates/fork.js +3 -0
- package/dist/commands/spaces/triggers/show.js +6 -0
- package/dist/commands/spaces/workflows/retry.d.ts +1 -0
- package/dist/commands/spaces/workflows/retry.js +8 -1
- package/dist/commands/spaces/workflows/triggers/create.js +3 -2
- package/dist/commands/spaces/workflows/triggers/fire.js +4 -0
- package/dist/commands/spaces/workflows/triggers/update.js +2 -1
- package/dist/commands/spaces/write-policy/set.d.ts +22 -0
- package/dist/commands/spaces/write-policy/set.js +82 -0
- package/dist/commands/spaces/write-policy/show.d.ts +19 -0
- package/dist/commands/spaces/write-policy/show.js +49 -0
- package/dist/commands/store/artifacts/receipt.d.ts +14 -0
- package/dist/commands/store/artifacts/receipt.js +34 -0
- package/dist/commands/store/artifacts/release.d.ts +2 -0
- package/dist/commands/store/artifacts/release.js +11 -0
- package/dist/commands/store/governance/publish-release.d.ts +2 -0
- package/dist/commands/store/governance/publish-release.js +30 -1
- package/dist/commands/store/governance/release-receipt.d.ts +12 -0
- package/dist/commands/store/governance/release-receipt.js +32 -0
- package/dist/commands/tasks/approvals/list.d.ts +11 -5
- package/dist/commands/tasks/approvals/list.js +13 -6
- package/dist/commands/tasks/attachments/facts.d.ts +12 -0
- package/dist/commands/tasks/attachments/facts.js +29 -0
- package/dist/commands/tasks/attachments/upload.d.ts +1 -0
- package/dist/commands/tasks/attachments/upload.js +16 -0
- package/dist/commands/tasks/bulk-update.js +35 -1
- package/dist/commands/tasks/context.d.ts +15 -0
- package/dist/commands/tasks/context.js +69 -0
- package/dist/commands/tasks/copy.d.ts +18 -0
- package/dist/commands/tasks/copy.js +85 -0
- package/dist/commands/tasks/create-tree.js +97 -23
- package/dist/commands/tasks/create.js +9 -1
- package/dist/commands/tasks/deliverable/add.js +20 -10
- package/dist/commands/tasks/move.js +8 -1
- package/dist/commands/tasks/operations/show.d.ts +16 -0
- package/dist/commands/tasks/operations/show.js +98 -0
- package/dist/commands/tasks/operations/wait.d.ts +22 -0
- package/dist/commands/tasks/operations/wait.js +114 -0
- package/dist/commands/tasks/preflight.d.ts +1 -0
- package/dist/commands/tasks/preflight.js +11 -1
- package/dist/commands/tasks/rearm-recurrence.js +4 -0
- package/dist/commands/tasks/result/show.js +22 -0
- package/dist/commands/tasks/result/submit.d.ts +1 -0
- package/dist/commands/tasks/result/submit.js +3 -0
- package/dist/commands/tasks/retry-receipt.d.ts +15 -0
- package/dist/commands/tasks/retry-receipt.js +89 -0
- package/dist/commands/tasks/retry-review.d.ts +16 -0
- package/dist/commands/tasks/retry-review.js +66 -0
- package/dist/commands/tasks/retry.d.ts +4 -8
- package/dist/commands/tasks/retry.js +34 -68
- package/dist/commands/tasks/runs.d.ts +21 -0
- package/dist/commands/tasks/runs.js +95 -0
- package/dist/commands/tasks/show.d.ts +2 -0
- package/dist/commands/tasks/show.js +15 -1
- package/dist/commands/tasks/start-receipt.d.ts +15 -0
- package/dist/commands/tasks/start-receipt.js +95 -0
- package/dist/commands/tasks/start.d.ts +4 -0
- package/dist/commands/tasks/start.js +49 -3
- package/dist/commands/tasks/update.js +3 -0
- package/dist/commands/tasks/upsert.js +17 -3
- package/dist/commands/tasks/watch.d.ts +3 -0
- package/dist/commands/tasks/watch.js +85 -20
- package/dist/commands/wiki/history.d.ts +33 -0
- package/dist/commands/wiki/history.js +134 -0
- package/dist/commands/wiki/ls.d.ts +2 -0
- package/dist/commands/wiki/ls.js +8 -0
- package/dist/commands/wiki/update.d.ts +3 -1
- package/dist/commands/wiki/update.js +24 -2
- package/dist/commands/wiki/write.d.ts +22 -0
- package/dist/commands/wiki/write.js +144 -6
- package/dist/generated/agent-guides.json +81 -81
- package/dist/generated/managed-instruction-guides.json +1 -1
- package/dist/lib/agent-guides.d.ts +9 -0
- package/dist/lib/agent-guides.js +23 -1
- package/dist/lib/agentic-stream.d.ts +5 -0
- package/dist/lib/agentic-stream.js +122 -3
- package/dist/lib/auth-diagnostics.d.ts +39 -0
- package/dist/lib/auth-diagnostics.js +71 -0
- package/dist/lib/cli-client-identity.d.ts +6 -0
- package/dist/lib/cli-client-identity.js +16 -0
- package/dist/lib/cli-installation-diagnostics.d.ts +52 -0
- package/dist/lib/cli-installation-diagnostics.js +254 -0
- package/dist/lib/command-hygiene.d.ts +45 -0
- package/dist/lib/command-hygiene.js +413 -0
- package/dist/lib/commitments.d.ts +64 -3
- package/dist/lib/commitments.js +34 -6
- package/dist/lib/completion-index.d.ts +16 -4
- package/dist/lib/completion-index.js +50 -14
- package/dist/lib/config.js +7 -1
- package/dist/lib/daemon-maintenance-command.d.ts +22 -0
- package/dist/lib/daemon-maintenance-command.js +39 -0
- package/dist/lib/daemon-maintenance.d.ts +275 -0
- package/dist/lib/daemon-maintenance.js +1035 -0
- package/dist/lib/dedicated-service.d.ts +3 -2
- package/dist/lib/dedicated-service.js +11 -3
- package/dist/lib/governed-store.d.ts +8 -0
- package/dist/lib/governed-store.js +5 -0
- package/dist/lib/hosted-machines.d.ts +33 -2
- package/dist/lib/hosted-machines.js +19 -1
- package/dist/lib/json-output.d.ts +1 -1
- package/dist/lib/machines.d.ts +9 -1
- package/dist/lib/machines.js +15 -1
- package/dist/lib/node-adapter.js +13 -0
- package/dist/lib/record-output.d.ts +22 -0
- package/dist/lib/record-output.js +78 -0
- package/dist/lib/roles.d.ts +3 -3
- package/dist/lib/scoped-memory-command.d.ts +18 -0
- package/dist/lib/scoped-memory-command.js +53 -2
- package/dist/lib/space-charter.d.ts +49 -0
- package/dist/lib/space-charter.js +78 -0
- package/dist/lib/space-loop-migration.d.ts +18 -0
- package/dist/lib/space-loop-migration.js +128 -0
- package/dist/lib/space-notebook.d.ts +22 -0
- package/dist/lib/space-notebook.js +140 -0
- package/dist/lib/space-proposal-decision-command.d.ts +36 -0
- package/dist/lib/space-proposal-decision-command.js +108 -0
- package/dist/lib/space-proposals.d.ts +44 -0
- package/dist/lib/space-proposals.js +186 -0
- package/dist/lib/space-templates.d.ts +8 -0
- package/dist/lib/space-templates.js +17 -0
- package/dist/lib/space-write-policy.d.ts +24 -0
- package/dist/lib/space-write-policy.js +103 -0
- package/dist/lib/task-agent-context-capabilities.d.ts +10 -0
- package/dist/lib/task-agent-context-capabilities.js +22 -0
- package/dist/lib/task-agent-context-compatibility.d.ts +9 -0
- package/dist/lib/task-agent-context-compatibility.js +30 -0
- package/dist/lib/task-asset-upload.d.ts +22 -0
- package/dist/lib/task-asset-upload.js +257 -29
- package/dist/lib/task-batch.d.ts +15 -1
- package/dist/lib/task-batch.js +35 -2
- package/dist/lib/task-operation-watch.d.ts +66 -0
- package/dist/lib/task-operation-watch.js +159 -0
- package/dist/lib/task-resolver.d.ts +1 -1
- package/dist/lib/task-resolver.js +4 -3
- package/dist/lib/task-work.d.ts +1 -1
- package/dist/lib/task-work.js +35 -1
- package/dist/lib/task-write-attribution.d.ts +14 -0
- package/dist/lib/task-write-attribution.js +35 -2
- package/dist/lib/triggers.d.ts +11 -0
- package/dist/lib/triggers.js +7 -0
- package/dist/lib/wiki-update.d.ts +1 -0
- package/dist/lib/wiki-update.js +10 -1
- package/dist/lib/wiki.js +4 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/computerWire.d.ts +9 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/computerWire.js +31 -15
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonToolApproval.js +1 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonWire.js +13 -7
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/guidedUpdate.d.ts +370 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/guidedUpdate.js +315 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/maintenanceReportWire.d.ts +178 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/maintenanceReportWire.js +262 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/toolApprovalSignature.d.ts +51 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/toolApprovalSignature.js +106 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/computerWire.d.ts +9 -1
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/computerWire.js +32 -5
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonToolApproval.js +1 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonWire.js +33 -14
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/guidedUpdate.d.ts +370 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/guidedUpdate.js +404 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/maintenanceReportWire.d.ts +178 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/maintenanceReportWire.js +342 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/toolApprovalSignature.d.ts +51 -0
- package/dist/node_modules/@skrr-ai/auth-core/dist/esm/toolApprovalSignature.js +138 -0
- package/dist/node_modules/@skrr-ai/auth-core/package.json +20 -0
- package/dist/node_modules/@skrr-ai/data-provider/index.js +27085 -20250
- package/oclif.manifest.json +10566 -7247
- package/package.json +20 -2
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Read-only waiting for a server-authoritative Task Operation.
|
|
4
|
+
*
|
|
5
|
+
* A Task status is intentionally not used as a completion signal here. One
|
|
6
|
+
* Task can have several sequential or competing operations, so only the
|
|
7
|
+
* operation's immutable id and server projection may settle this wait.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.parseTaskOperationWatchDuration = parseTaskOperationWatchDuration;
|
|
11
|
+
exports.classifyTaskOperation = classifyTaskOperation;
|
|
12
|
+
exports.watchTaskOperation = watchTaskOperation;
|
|
13
|
+
exports.taskOperationCheckpointLine = taskOperationCheckpointLine;
|
|
14
|
+
// These are operation outcomes, not Task-execution outcomes. A start can be
|
|
15
|
+
// successfully accepted and a retry successfully admitted while its execution
|
|
16
|
+
// Run is still active; waiting on the Operation must stop successfully at that
|
|
17
|
+
// durable boundary rather than misreporting it as an unknown terminal state.
|
|
18
|
+
const SUCCESS_STATES = new Set(['succeeded', 'completed', 'accepted', 'admitted']);
|
|
19
|
+
const FAILED_STATES = new Set(['failed', 'cancelled', 'canceled', 'abandoned', 'rejected', 'refused']);
|
|
20
|
+
/** Parse the same bounded duration grammar used by `tasks watch`. */
|
|
21
|
+
function parseTaskOperationWatchDuration(value) {
|
|
22
|
+
if (!value)
|
|
23
|
+
return null;
|
|
24
|
+
const match = value.trim().match(/^(\d+)(ms|s|m|h)?$/i);
|
|
25
|
+
if (!match)
|
|
26
|
+
throw new Error(`Invalid --timeout value: ${value}`);
|
|
27
|
+
const amount = Number(match[1]);
|
|
28
|
+
if (!Number.isSafeInteger(amount) || amount < 0) {
|
|
29
|
+
throw new Error(`Invalid --timeout value: ${value}`);
|
|
30
|
+
}
|
|
31
|
+
const unit = (match[2] || 's').toLowerCase();
|
|
32
|
+
if (unit === 'ms')
|
|
33
|
+
return amount;
|
|
34
|
+
if (unit === 's')
|
|
35
|
+
return amount * 1000;
|
|
36
|
+
if (unit === 'm')
|
|
37
|
+
return amount * 60 * 1000;
|
|
38
|
+
if (unit === 'h')
|
|
39
|
+
return amount * 60 * 60 * 1000;
|
|
40
|
+
throw new Error(`Invalid --timeout value: ${value}`);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Classify only server-declared terminal status or the narrow, stable terminal
|
|
44
|
+
* vocabulary. An absent/malformed/unknown projection never becomes success by
|
|
45
|
+
* inference, and neither does a Task's own workflow status.
|
|
46
|
+
*/
|
|
47
|
+
function classifyTaskOperation(operation) {
|
|
48
|
+
if (!operation || typeof operation !== 'object') {
|
|
49
|
+
return { terminal: false, result: 'unknown' };
|
|
50
|
+
}
|
|
51
|
+
const state = typeof operation.state === 'string' ? operation.state.trim().toLowerCase() : '';
|
|
52
|
+
const outcome = typeof operation.outcome === 'string' ? operation.outcome.trim().toLowerCase() : '';
|
|
53
|
+
if (SUCCESS_STATES.has(state) || SUCCESS_STATES.has(outcome)) {
|
|
54
|
+
return { terminal: true, result: 'succeeded' };
|
|
55
|
+
}
|
|
56
|
+
if (FAILED_STATES.has(state) || FAILED_STATES.has(outcome)) {
|
|
57
|
+
return { terminal: true, result: 'failed' };
|
|
58
|
+
}
|
|
59
|
+
if (operation.terminal === true) {
|
|
60
|
+
// A terminal projection without a known outcome is intentionally not
|
|
61
|
+
// recast as success. The caller sees `unknown` and must inspect its
|
|
62
|
+
// immutable recovery/receipt fields instead of issuing a new mutation.
|
|
63
|
+
return { terminal: true, result: 'unknown' };
|
|
64
|
+
}
|
|
65
|
+
return { terminal: false, result: state === 'unknown' ? 'unknown' : 'pending' };
|
|
66
|
+
}
|
|
67
|
+
function operationSignature(operation) {
|
|
68
|
+
if (!operation)
|
|
69
|
+
return 'null';
|
|
70
|
+
return JSON.stringify({
|
|
71
|
+
state: operation.state,
|
|
72
|
+
phase: operation.phase,
|
|
73
|
+
terminal: operation.terminal,
|
|
74
|
+
outcome: operation.outcome,
|
|
75
|
+
updatedAt: operation.updatedAt,
|
|
76
|
+
recovery: operation.recovery,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
function defaultSleep(milliseconds) {
|
|
80
|
+
return new Promise((resolve) => setTimeout(resolve, milliseconds));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Poll one immutable operation until it reaches an authoritative terminal
|
|
84
|
+
* result. Every read is emitted as a checkpoint so JSON consumers can prove
|
|
85
|
+
* liveness even where a server does not yet offer an event stream.
|
|
86
|
+
*/
|
|
87
|
+
async function watchTaskOperation(options) {
|
|
88
|
+
const now = options.now ?? Date.now;
|
|
89
|
+
const sleep = options.sleep ?? defaultSleep;
|
|
90
|
+
const startedAt = now();
|
|
91
|
+
let lastSignature = null;
|
|
92
|
+
while (true) {
|
|
93
|
+
const operation = await options.read(options.taskId, options.operationId);
|
|
94
|
+
const classification = classifyTaskOperation(operation);
|
|
95
|
+
const signature = operationSignature(operation);
|
|
96
|
+
const changed = signature !== lastSignature;
|
|
97
|
+
lastSignature = signature;
|
|
98
|
+
await options.onCheckpoint({
|
|
99
|
+
object: 'task_operation_watch_checkpoint',
|
|
100
|
+
schemaVersion: 1,
|
|
101
|
+
observedAt: new Date(now()).toISOString(),
|
|
102
|
+
taskId: options.taskId,
|
|
103
|
+
operationId: options.operationId,
|
|
104
|
+
observation: 'observed',
|
|
105
|
+
changed,
|
|
106
|
+
terminal: classification.terminal,
|
|
107
|
+
result: classification.result,
|
|
108
|
+
operation,
|
|
109
|
+
});
|
|
110
|
+
if (classification.terminal) {
|
|
111
|
+
if (classification.result === 'succeeded' || classification.result === 'failed') {
|
|
112
|
+
return { terminal: true, result: classification.result, operation };
|
|
113
|
+
}
|
|
114
|
+
// A terminal-but-unclassified operation is a server truth that requires
|
|
115
|
+
// an explicit user inspection, not an accidental green result.
|
|
116
|
+
const error = Object.assign(new Error('Task operation reached an unknown terminal state.'), {
|
|
117
|
+
code: 'TASK_OPERATION_TERMINAL_UNKNOWN',
|
|
118
|
+
operation,
|
|
119
|
+
});
|
|
120
|
+
throw error;
|
|
121
|
+
}
|
|
122
|
+
if (options.timeoutMs !== null && now() - startedAt >= options.timeoutMs) {
|
|
123
|
+
await options.onCheckpoint({
|
|
124
|
+
object: 'task_operation_watch_checkpoint',
|
|
125
|
+
schemaVersion: 1,
|
|
126
|
+
observedAt: new Date(now()).toISOString(),
|
|
127
|
+
taskId: options.taskId,
|
|
128
|
+
operationId: options.operationId,
|
|
129
|
+
observation: 'timeout',
|
|
130
|
+
changed: false,
|
|
131
|
+
terminal: false,
|
|
132
|
+
result: classification.result,
|
|
133
|
+
operation,
|
|
134
|
+
});
|
|
135
|
+
const error = Object.assign(new Error(`Timed out waiting for task operation ${options.operationId}.`), {
|
|
136
|
+
code: 'TASK_OPERATION_WAIT_TIMEOUT',
|
|
137
|
+
exitCode: 124,
|
|
138
|
+
operation,
|
|
139
|
+
});
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
await sleep(options.intervalMs);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function taskOperationCheckpointLine(checkpoint) {
|
|
146
|
+
if (checkpoint.observation === 'timeout') {
|
|
147
|
+
return `[${checkpoint.observedAt}] operation ${checkpoint.operationId}: timeout; last state ${operationLabel(checkpoint.operation)}`;
|
|
148
|
+
}
|
|
149
|
+
const suffix = checkpoint.changed ? '' : ' (unchanged)';
|
|
150
|
+
return `[${checkpoint.observedAt}] operation ${checkpoint.operationId}: ${operationLabel(checkpoint.operation)}${suffix}`;
|
|
151
|
+
}
|
|
152
|
+
function operationLabel(operation) {
|
|
153
|
+
if (!operation)
|
|
154
|
+
return 'unknown';
|
|
155
|
+
const state = typeof operation.state === 'string' && operation.state ? operation.state : 'unknown';
|
|
156
|
+
const phase = typeof operation.phase === 'string' && operation.phase ? ` / ${operation.phase}` : '';
|
|
157
|
+
const intent = typeof operation.intent === 'string' && operation.intent ? ` (${operation.intent})` : '';
|
|
158
|
+
return `${state}${phase}${intent}`;
|
|
159
|
+
}
|
|
@@ -26,7 +26,7 @@ export declare function resolveTaskIdentity({ positionalId, flagTask, jsonBody,
|
|
|
26
26
|
* The same resolution `resolveTaskIdentity` performs, without the throw.
|
|
27
27
|
* Read-only surfaces that REPORT task context (`skrr context`) need the
|
|
28
28
|
* identical answer an id-less task command would act on — runtime binding
|
|
29
|
-
* first, then the
|
|
29
|
+
* first, then the canonical task git branch — but "no task anywhere"
|
|
30
30
|
* is a fact to print, not an error to fail on.
|
|
31
31
|
*/
|
|
32
32
|
export declare function tryResolveTaskIdentity(options?: Parameters<typeof resolveTaskIdentity>[0]): TaskIdentity | null;
|
|
@@ -65,8 +65,9 @@ function resolveTaskIdentity({ positionalId, flagTask, jsonBody, jsonKeys = ['ta
|
|
|
65
65
|
identifierFallback: true,
|
|
66
66
|
};
|
|
67
67
|
}
|
|
68
|
-
// Human-side task work has no daemon runtime context. A
|
|
69
|
-
//
|
|
68
|
+
// Human-side task work has no daemon runtime context. A branch in the
|
|
69
|
+
// canonical task namespace (TASK_BRANCH_PREFIX) is therefore the final,
|
|
70
|
+
// local-only default.
|
|
70
71
|
// Keep it after all trusted session coordinates: a daemon-bound task must
|
|
71
72
|
// not silently become whichever branch happens to be checked out.
|
|
72
73
|
const branchTaskRef = gitTaskReference()?.trim();
|
|
@@ -90,7 +91,7 @@ function resolveTaskIdentity({ positionalId, flagTask, jsonBody, jsonKeys = ['ta
|
|
|
90
91
|
* The same resolution `resolveTaskIdentity` performs, without the throw.
|
|
91
92
|
* Read-only surfaces that REPORT task context (`skrr context`) need the
|
|
92
93
|
* identical answer an id-less task command would act on — runtime binding
|
|
93
|
-
* first, then the
|
|
94
|
+
* first, then the canonical task git branch — but "no task anywhere"
|
|
94
95
|
* is a fact to print, not an error to fail on.
|
|
95
96
|
*/
|
|
96
97
|
function tryResolveTaskIdentity(options = {}) {
|
package/dist/lib/task-work.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { TaskConversationInputBody, TaskConversationInputReceipt, TaskExecutionSnapshot, TaskInputPurpose } from '@skrr-ai/data-provider';
|
|
2
2
|
/** Observation time is not evidence that a worker just sent a heartbeat. */
|
|
3
3
|
export declare function describeExecutionState(state: TaskExecutionSnapshot): string[];
|
|
4
4
|
export declare function buildTaskContinuationBody(input: {
|
package/dist/lib/task-work.js
CHANGED
|
@@ -6,10 +6,44 @@ exports.describeTaskContinuation = describeTaskContinuation;
|
|
|
6
6
|
const node_crypto_1 = require("node:crypto");
|
|
7
7
|
/** Observation time is not evidence that a worker just sent a heartbeat. */
|
|
8
8
|
function describeExecutionState(state) {
|
|
9
|
+
const execution = state.execution;
|
|
10
|
+
const attempt = execution.attemptKey
|
|
11
|
+
? `Attempt: ${execution.attemptKey}`
|
|
12
|
+
: 'Attempt: not claimed by an executor';
|
|
13
|
+
const terminal = execution.executorTerminal
|
|
14
|
+
? `Executor terminal: observed for this attempt; canonical Run is ${execution.runStatus ?? 'not observed'}`
|
|
15
|
+
: null;
|
|
16
|
+
const finalization = execution.finalizationPending
|
|
17
|
+
? 'Finalization: pending; the canonical terminal is recorded but Task workflow projection is still reconciling'
|
|
18
|
+
: null;
|
|
19
|
+
const coverage = execution.workCoverage
|
|
20
|
+
? `Work coverage: ${execution.workCoverage.applicability}${execution.workCoverage.reason ? `; ${execution.workCoverage.reason}` : ''}`
|
|
21
|
+
: null;
|
|
22
|
+
const failure = execution.failure
|
|
23
|
+
? `Execution failure: ${[execution.failure.code, execution.failure.class]
|
|
24
|
+
.filter(Boolean)
|
|
25
|
+
.join(' · ')}${execution.failure.message
|
|
26
|
+
? `${execution.failure.code || execution.failure.class ? '; ' : ''}${execution.failure.message}`
|
|
27
|
+
: ''}`
|
|
28
|
+
: null;
|
|
29
|
+
const resources = state.resources
|
|
30
|
+
? [
|
|
31
|
+
`Execution resources: ${state.resources.state}; ${state.resources.reason}`,
|
|
32
|
+
...state.resources.items.map((resource) => `Resource: ${resource.kind} ${resource.state}; ${resource.reason}${resource.attempt
|
|
33
|
+
? `; attempt ${resource.attempt.kind}:${resource.attempt.runId}:${resource.attempt.attempt}:${resource.attempt.generation}`
|
|
34
|
+
: ''}; evidence ${resource.evidence?.source ?? 'unavailable'}${resource.evidence?.observedAt ? ` ${resource.evidence.observedAt}` : ''}${resource.requestedAt ? `; requested ${resource.requestedAt}` : ''}${resource.transportRequestedAt ? `; transport requested ${resource.transportRequestedAt}` : ''}${resource.acknowledgedAt ? `; acknowledged ${resource.acknowledgedAt}` : ''}${resource.releasedAt ? `; released ${resource.releasedAt}` : ''}${resource.unknownAt ? `; release unverifiable ${resource.unknownAt}` : ''}${resource.recoveryAttempts !== undefined ? `; recovery attempts ${resource.recoveryAttempts}` : ''}`),
|
|
35
|
+
]
|
|
36
|
+
: ['Execution resources: unavailable; this server did not return a resource projection'];
|
|
9
37
|
return [
|
|
10
38
|
`Task: ${state.taskId}`,
|
|
11
39
|
`Workflow: ${state.workflowStatus} (generation ${state.workflowGeneration})`,
|
|
12
|
-
`Execution: ${
|
|
40
|
+
`Execution: ${execution.runStatus ?? 'not observed'}${execution.runId ? `; Run ${execution.runId}` : ''}`,
|
|
41
|
+
attempt,
|
|
42
|
+
...(terminal ? [terminal] : []),
|
|
43
|
+
...(finalization ? [finalization] : []),
|
|
44
|
+
...(coverage ? [coverage] : []),
|
|
45
|
+
...(failure ? [failure] : []),
|
|
46
|
+
...resources,
|
|
13
47
|
`Liveness: ${state.liveness.state}; last runtime signal ${state.liveness.lastRuntimeSignalAt ?? 'unavailable'}`,
|
|
14
48
|
`Health: ${state.health.condition}; ${state.health.reason}`,
|
|
15
49
|
...(state.waiting ? [`Waiting: ${state.waiting.kind}; ${state.waiting.referenceId}`] : []),
|
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
import { readRuntimeContext } from './runtime-context';
|
|
2
|
+
export type UnboundRuntimeSetupStep = {
|
|
3
|
+
kind: 'inspect_local_harnesses' | 'inspect_local_code_agent' | 'start_assigned_task';
|
|
4
|
+
command: string;
|
|
5
|
+
description: string;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* An unbound shell is normal for a person starting the CLI by hand. The useful
|
|
9
|
+
* answer is not an invitation to forge an environment variable; it is the
|
|
10
|
+
* smallest truthful route to learn which local engines are registered, choose
|
|
11
|
+
* a local Code identity, or enter an assigned task's authenticated runtime.
|
|
12
|
+
*/
|
|
13
|
+
export declare function unboundRuntimeSetup(bin?: string): UnboundRuntimeSetupStep[];
|
|
14
|
+
export declare function agentBindingGuidance(bin?: string): string;
|
|
15
|
+
/** Compatibility for receipts and surfaces that do not know the invoked bin name. */
|
|
2
16
|
export declare const AGENT_BINDING_GUIDANCE: string;
|
|
3
17
|
export declare const ACCOUNT_ATTRIBUTION_NOTICE: string;
|
|
4
18
|
type Principal = {
|
|
@@ -1,11 +1,44 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ACCOUNT_ATTRIBUTION_NOTICE = exports.AGENT_BINDING_GUIDANCE = void 0;
|
|
4
|
+
exports.unboundRuntimeSetup = unboundRuntimeSetup;
|
|
5
|
+
exports.agentBindingGuidance = agentBindingGuidance;
|
|
4
6
|
exports.taskWriteAttribution = taskWriteAttribution;
|
|
5
7
|
exports.attributionLines = attributionLines;
|
|
6
8
|
exports.runtimeWriteAttribution = runtimeWriteAttribution;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
/**
|
|
10
|
+
* An unbound shell is normal for a person starting the CLI by hand. The useful
|
|
11
|
+
* answer is not an invitation to forge an environment variable; it is the
|
|
12
|
+
* smallest truthful route to learn which local engines are registered, choose
|
|
13
|
+
* a local Code identity, or enter an assigned task's authenticated runtime.
|
|
14
|
+
*/
|
|
15
|
+
function unboundRuntimeSetup(bin = 'skrr') {
|
|
16
|
+
return [
|
|
17
|
+
{
|
|
18
|
+
kind: 'inspect_local_harnesses',
|
|
19
|
+
command: `${bin} harnesses list --all`,
|
|
20
|
+
description: 'List the local provider harnesses this account has registered, including offline rows.',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
kind: 'inspect_local_code_agent',
|
|
24
|
+
command: `${bin} code skrr-agent`,
|
|
25
|
+
description: 'Show which Agent a locally started managed skrr Code session would use; it does not start work.',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
kind: 'start_assigned_task',
|
|
29
|
+
command: `${bin} tasks start <task>`,
|
|
30
|
+
description: 'For an assigned Task, enter its authenticated Agent runtime and execute that Task.',
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
}
|
|
34
|
+
function agentBindingGuidance(bin = 'skrr') {
|
|
35
|
+
const [harnesses, codeAgent, task] = unboundRuntimeSetup(bin);
|
|
36
|
+
return (`This shell is not an authenticated Agent runtime. Inspect registered local engines with \`${harnesses.command}\`; ` +
|
|
37
|
+
`inspect the local managed Code identity with \`${codeAgent.command}\`; and for an assigned Task, start it with \`${task.command}\`. ` +
|
|
38
|
+
'An --agent flag or an environment Agent id cannot establish authenticated authorship.');
|
|
39
|
+
}
|
|
40
|
+
/** Compatibility for receipts and surfaces that do not know the invoked bin name. */
|
|
41
|
+
exports.AGENT_BINDING_GUIDANCE = agentBindingGuidance();
|
|
9
42
|
exports.ACCOUNT_ATTRIBUTION_NOTICE = 'Without authenticated Agent provenance, Task writes are attributed to the signed-in account. ' +
|
|
10
43
|
'An account-attributed assessment is not proof of an independent human check.';
|
|
11
44
|
/** Use the persisted server receipt, never the process's claimed Agent identity. */
|
package/dist/lib/triggers.d.ts
CHANGED
|
@@ -126,6 +126,17 @@ export interface TriggerDefinition {
|
|
|
126
126
|
* to disagree with the route that does the refusing.
|
|
127
127
|
*/
|
|
128
128
|
producerOwned?: boolean;
|
|
129
|
+
/**
|
|
130
|
+
* The Space loop this trigger was converted into (`skrr spaces loops
|
|
131
|
+
* migrate`, OSK-18009/OSK-18011). `pending`: read-only and still firing until
|
|
132
|
+
* the loop is active; `retired`: replaced by the loop, read-only, does not run.
|
|
133
|
+
*/
|
|
134
|
+
supersededBy?: {
|
|
135
|
+
commitmentId?: string;
|
|
136
|
+
state?: string;
|
|
137
|
+
recordedAt?: string;
|
|
138
|
+
retiredAt?: string;
|
|
139
|
+
};
|
|
129
140
|
createdAt?: string;
|
|
130
141
|
updatedAt?: string;
|
|
131
142
|
}
|
package/dist/lib/triggers.js
CHANGED
|
@@ -1294,6 +1294,13 @@ function renderTriggerSummary(trigger, log, options = {}) {
|
|
|
1294
1294
|
if (trigger.producerOwned === true) {
|
|
1295
1295
|
log('Managed: by the platform — not editable here; change the object that owns it');
|
|
1296
1296
|
}
|
|
1297
|
+
// A trigger converted into a Space loop is read-only, and says where its turn went.
|
|
1298
|
+
const loop = trigger.supersededBy;
|
|
1299
|
+
if (loop?.commitmentId) {
|
|
1300
|
+
log(loop.state === 'retired'
|
|
1301
|
+
? `Loop: replaced by Space loop ${loop.commitmentId}; read-only and does not run (skrr commitments show ${loop.commitmentId})`
|
|
1302
|
+
: `Loop: being converted into Space loop ${loop.commitmentId}; read-only, and keeps firing until the loop is active`);
|
|
1303
|
+
}
|
|
1297
1304
|
if (trigger.label)
|
|
1298
1305
|
log(`Label: ${trigger.label}`);
|
|
1299
1306
|
if (trigger.execution?.mode)
|
package/dist/lib/wiki-update.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildWikiPageUpdate = buildWikiPageUpdate;
|
|
4
|
+
const data_provider_1 = require("@skrr-ai/data-provider");
|
|
4
5
|
/**
|
|
5
6
|
* Build the PATCH body for `skrr wiki update`.
|
|
6
7
|
*
|
|
@@ -39,10 +40,18 @@ function buildWikiPageUpdate(input) {
|
|
|
39
40
|
}
|
|
40
41
|
data.order = input.order;
|
|
41
42
|
}
|
|
43
|
+
// oclif already limits the flag to these values; this is the same check for
|
|
44
|
+
// a caller of the builder that is not the flag parser.
|
|
45
|
+
if (input.kind !== undefined) {
|
|
46
|
+
if (!(0, data_provider_1.isWikiPageKind)(input.kind)) {
|
|
47
|
+
return { ok: false, error: `--kind must be one of: ${data_provider_1.WIKI_PAGE_KINDS.join(', ')}.` };
|
|
48
|
+
}
|
|
49
|
+
data.kind = input.kind;
|
|
50
|
+
}
|
|
42
51
|
if (Object.keys(data).length === 0) {
|
|
43
52
|
return {
|
|
44
53
|
ok: false,
|
|
45
|
-
error: 'Nothing to update. Pass --title, --icon, --clear-icon, or --
|
|
54
|
+
error: 'Nothing to update. Pass --title, --icon, --clear-icon, --order, or --kind.',
|
|
46
55
|
};
|
|
47
56
|
}
|
|
48
57
|
return { ok: true, data };
|
package/dist/lib/wiki.js
CHANGED
|
@@ -68,7 +68,10 @@ function decorate(node) {
|
|
|
68
68
|
// name has drifted from its slug is worth seeing.
|
|
69
69
|
const slug = node.slug || node.name;
|
|
70
70
|
const title = node.name && node.name !== slug ? ` [${node.name}]` : '';
|
|
71
|
-
|
|
71
|
+
// An ordinary page says nothing; any other kind is named, so the charter and
|
|
72
|
+
// journal entries can be told apart from docs at a glance (OSK-17985).
|
|
73
|
+
const kind = node.kind && node.kind !== 'doc' ? ` (${node.kind})` : '';
|
|
74
|
+
return `${slug}${title}${kind}`;
|
|
72
75
|
}
|
|
73
76
|
function sortNodes(nodes) {
|
|
74
77
|
return [...nodes].sort((a, b) => {
|
|
@@ -185,6 +185,14 @@ export type DaemonComputerEventKey = keyof typeof DAEMON_COMPUTER_EVENTS;
|
|
|
185
185
|
export type DaemonComputerEventName = (typeof DAEMON_COMPUTER_EVENTS)[DaemonComputerEventKey];
|
|
186
186
|
export declare const COMPUTER_EVENT_NAMES: readonly ComputerEventName[];
|
|
187
187
|
export declare const DAEMON_COMPUTER_EVENT_NAMES: readonly DaemonComputerEventName[];
|
|
188
|
+
/**
|
|
189
|
+
* API → daemon: an authorized person observes, configures, stops or recovers
|
|
190
|
+
* the machine's Computer Use provider. Answered with `daemon:computer:ack`. It
|
|
191
|
+
* is deliberately outside `DAEMON_COMPUTER_EVENTS`, which lists the events the
|
|
192
|
+
* attachment protocol itself speaks, so the registry parity over that table
|
|
193
|
+
* does not move.
|
|
194
|
+
*/
|
|
195
|
+
export declare const DAEMON_COMPUTER_USE_CONTROL_EVENT: "daemon:computer:use-control";
|
|
188
196
|
/** The daemon → API events; every other `daemon:computer:*` event flows API → daemon. */
|
|
189
197
|
export declare const DAEMON_COMPUTER_REPORT_EVENT_KEYS: readonly ["ack", "manifest", "data", "activity", "detached", "filesChanged", "diagnostics"];
|
|
190
198
|
/** The API → client events; every other `computer:*` event flows client → API. */
|
|
@@ -362,7 +370,7 @@ export declare const COMPUTER_CAPABILITY_VALUES: [ComputerCapability, ...Compute
|
|
|
362
370
|
* Every refusal and limit the computer protocol can answer with. Callers branch
|
|
363
371
|
* on the code; a message beside it is free text and may change.
|
|
364
372
|
*/
|
|
365
|
-
export declare const COMPUTER_REFUSAL_CODES: readonly ["human_control", "stale_epoch", "stale_generation", "file_changed", "capability_missing", "unauthorized", "control_denied", "not_holder", "attachment_limit", "observer_limit", "watch_limit", "grant_limit", "browser_limit", "rate_limited", "not_found", "surface_ended", "machine_unavailable", "daemon_unreachable", "relay_error", "timeout", "invalid_request", "consent_missing", "path_withheld", "too_large", "service_limit"];
|
|
373
|
+
export declare const COMPUTER_REFUSAL_CODES: readonly ["human_control", "stale_epoch", "stale_generation", "file_changed", "capability_missing", "unauthorized", "control_denied", "not_holder", "attachment_limit", "observer_limit", "watch_limit", "grant_limit", "browser_limit", "rate_limited", "not_found", "surface_ended", "machine_unavailable", "daemon_unreachable", "relay_error", "timeout", "invalid_request", "consent_missing", "path_withheld", "too_large", "service_limit", "maintenance_hold"];
|
|
366
374
|
export type ComputerRefusalCode = (typeof COMPUTER_REFUSAL_CODES)[number];
|
|
367
375
|
/**
|
|
368
376
|
* The code when it is a computer refusal, else `null`. There is one spelling
|
|
@@ -131,6 +131,7 @@ __export(computerWire_exports, {
|
|
|
131
131
|
DAEMON_COMPUTER_EVENTS: () => DAEMON_COMPUTER_EVENTS,
|
|
132
132
|
DAEMON_COMPUTER_EVENT_NAMES: () => DAEMON_COMPUTER_EVENT_NAMES,
|
|
133
133
|
DAEMON_COMPUTER_REPORT_EVENT_KEYS: () => DAEMON_COMPUTER_REPORT_EVENT_KEYS,
|
|
134
|
+
DAEMON_COMPUTER_USE_CONTROL_EVENT: () => DAEMON_COMPUTER_USE_CONTROL_EVENT,
|
|
134
135
|
browserActivityOriginAllowed: () => browserActivityOriginAllowed,
|
|
135
136
|
clampComputerBrowserViewport: () => clampComputerBrowserViewport,
|
|
136
137
|
computerAccessOperations: () => computerAccessOperations,
|
|
@@ -301,6 +302,7 @@ const DAEMON_COMPUTER_EVENTS = {
|
|
|
301
302
|
};
|
|
302
303
|
const COMPUTER_EVENT_NAMES = Object.values(COMPUTER_EVENTS);
|
|
303
304
|
const DAEMON_COMPUTER_EVENT_NAMES = Object.values(DAEMON_COMPUTER_EVENTS);
|
|
305
|
+
const DAEMON_COMPUTER_USE_CONTROL_EVENT = "daemon:computer:use-control";
|
|
304
306
|
const DAEMON_COMPUTER_REPORT_EVENT_KEYS = [
|
|
305
307
|
"ack",
|
|
306
308
|
"manifest",
|
|
@@ -516,7 +518,15 @@ const COMPUTER_REFUSAL_CODES = [
|
|
|
516
518
|
/** The file is over the size the editor or the read accepts. */
|
|
517
519
|
"too_large",
|
|
518
520
|
/** The machine has as many declared services as it allows (`COMPUTER_DECLARED_SERVICES_MAX`). */
|
|
519
|
-
"service_limit"
|
|
521
|
+
"service_limit",
|
|
522
|
+
/**
|
|
523
|
+
* The machine's owner paused NEW work on it (OSK-19107). Refuses an `open` only:
|
|
524
|
+
* watching, reading files and controlling a surface that already exists keep
|
|
525
|
+
* working, and nothing running is touched. The refusal carries the hold's facts
|
|
526
|
+
* (`maintenance`), and it is not `machine_unavailable`, which says the machine is
|
|
527
|
+
* down: a paused machine is up.
|
|
528
|
+
*/
|
|
529
|
+
"maintenance_hold"
|
|
520
530
|
];
|
|
521
531
|
function normalizeComputerRefusalCode(code) {
|
|
522
532
|
if (typeof code !== "string") {
|
|
@@ -1020,21 +1030,26 @@ function normalizeBrowserActivityOriginPolicy(input) {
|
|
|
1020
1030
|
const origins = (items, required) => {
|
|
1021
1031
|
if (!Array.isArray(items) || items.length > 20 || required && !items.length)
|
|
1022
1032
|
throw new Error("Choose from one to twenty allowed origins and up to twenty excluded origins");
|
|
1023
|
-
return [
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1033
|
+
return [
|
|
1034
|
+
...new Set(items.map((item) => {
|
|
1035
|
+
if (typeof item !== "string" || item.length > 500)
|
|
1036
|
+
throw new Error("Use an exact http or https origin without a path, credentials, query or fragment");
|
|
1037
|
+
let url;
|
|
1038
|
+
try {
|
|
1039
|
+
url = new URL(item);
|
|
1040
|
+
} catch {
|
|
1041
|
+
throw new Error("Use an exact http or https origin");
|
|
1042
|
+
}
|
|
1043
|
+
if (!["http:", "https:"].includes(url.protocol) || url.hostname.includes("*") || url.username || url.password || item !== url.origin)
|
|
1044
|
+
throw new Error("Use an exact http or https origin without a path, credentials, query or fragment");
|
|
1045
|
+
return url.origin;
|
|
1046
|
+
}))
|
|
1047
|
+
].sort();
|
|
1048
|
+
};
|
|
1049
|
+
return {
|
|
1050
|
+
allowOrigins: origins(value.allowOrigins, true),
|
|
1051
|
+
excludeOrigins: origins(value.excludeOrigins, false)
|
|
1036
1052
|
};
|
|
1037
|
-
return { allowOrigins: origins(value.allowOrigins, true), excludeOrigins: origins(value.excludeOrigins, false) };
|
|
1038
1053
|
}
|
|
1039
1054
|
function browserActivityOriginAllowed(policy, url) {
|
|
1040
1055
|
if (typeof url !== "string")
|
|
@@ -1161,6 +1176,7 @@ function browserActivityOriginAllowed(policy, url) {
|
|
|
1161
1176
|
DAEMON_COMPUTER_EVENTS,
|
|
1162
1177
|
DAEMON_COMPUTER_EVENT_NAMES,
|
|
1163
1178
|
DAEMON_COMPUTER_REPORT_EVENT_KEYS,
|
|
1179
|
+
DAEMON_COMPUTER_USE_CONTROL_EVENT,
|
|
1164
1180
|
browserActivityOriginAllowed,
|
|
1165
1181
|
clampComputerBrowserViewport,
|
|
1166
1182
|
computerAccessOperations,
|
|
@@ -239,18 +239,18 @@ const TOOLS = [
|
|
|
239
239
|
capability: TOOL_RESPONSE_OUTBOX
|
|
240
240
|
}),
|
|
241
241
|
toDaemon("daemon:tool:cancel", "Abandon a running tool call."),
|
|
242
|
-
toDaemon(
|
|
242
|
+
toDaemon(import_computerWire.DAEMON_COMPUTER_USE_CONTROL_EVENT, "An authorized person observes, configures, stops or recovers the machine Computer Use provider.", {
|
|
243
243
|
stability: "experimental",
|
|
244
244
|
capability: "computer_use_mcp_v1",
|
|
245
245
|
delivery: "acked",
|
|
246
|
-
answeredBy:
|
|
246
|
+
answeredBy: import_computerWire.DAEMON_COMPUTER_EVENTS.ack,
|
|
247
247
|
payload: { kind: "zod", schema: "daemonComputerUseControlSchema" }
|
|
248
248
|
}),
|
|
249
249
|
toDaemon("daemon:computer-use:rotate-credential", "The approved hosted-desktop owner requests credential rotation for this exact active machine lease generation.", {
|
|
250
250
|
stability: "experimental",
|
|
251
251
|
capability: "computer_use_mcp_v1",
|
|
252
252
|
delivery: "acked",
|
|
253
|
-
answeredBy:
|
|
253
|
+
answeredBy: import_computerWire.DAEMON_COMPUTER_EVENTS.ack,
|
|
254
254
|
payload: { kind: "zod", schema: "daemonComputerUseRotateCredentialSchema" }
|
|
255
255
|
}),
|
|
256
256
|
toDaemon("daemon:computer-use:revoke", "Revoke cloud Computer Use bindings after owner machine authority was removed.", {
|
|
@@ -262,15 +262,21 @@ const TOOLS = [
|
|
|
262
262
|
stability: "experimental",
|
|
263
263
|
capability: import_desktopWire.COMPUTER_DESKTOP_CAPABILITY,
|
|
264
264
|
delivery: "acked",
|
|
265
|
-
answeredBy:
|
|
266
|
-
payload: {
|
|
265
|
+
answeredBy: import_computerWire.DAEMON_COMPUTER_EVENTS.ack,
|
|
266
|
+
payload: {
|
|
267
|
+
kind: "zod",
|
|
268
|
+
schema: `daemonComputerDesktop${operation[0].toUpperCase()}${operation.slice(1)}Schema`
|
|
269
|
+
}
|
|
267
270
|
})),
|
|
268
271
|
...["control", "input"].map((operation) => toDaemon(import_desktopWire.DAEMON_COMPUTER_DESKTOP_EVENTS[operation], `Human-only typed desktop ${operation}; exact authenticated attachment, stream and generation.`, {
|
|
269
272
|
stability: "experimental",
|
|
270
273
|
capability: import_desktopWire.COMPUTER_DESKTOP_CONTROL_CAPABILITY,
|
|
271
274
|
delivery: "acked",
|
|
272
|
-
answeredBy:
|
|
273
|
-
payload: {
|
|
275
|
+
answeredBy: import_computerWire.DAEMON_COMPUTER_EVENTS.ack,
|
|
276
|
+
payload: {
|
|
277
|
+
kind: "zod",
|
|
278
|
+
schema: `daemonComputerDesktop${operation[0].toUpperCase()}${operation.slice(1)}Schema`
|
|
279
|
+
}
|
|
274
280
|
})),
|
|
275
281
|
toServer(import_desktopWire.DAEMON_COMPUTER_DESKTOP_EVENTS.controlChanged, "Private desktop holder and input revocation fact; never carries a control token.", {
|
|
276
282
|
stability: "experimental",
|