@skrr-ai/cli 0.1.87 → 0.1.89

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/commands/agents/chat.js +27 -1
  2. package/dist/commands/computer/index.d.ts +19 -0
  3. package/dist/commands/computer/index.js +37 -0
  4. package/dist/commands/labels/create.d.ts +1 -0
  5. package/dist/commands/labels/create.js +2 -0
  6. package/dist/commands/labels/restore.d.ts +1 -0
  7. package/dist/commands/labels/restore.js +6 -3
  8. package/dist/commands/labels/update.d.ts +1 -0
  9. package/dist/commands/labels/update.js +2 -0
  10. package/dist/commands/machines/computer-adoption.d.ts +16 -0
  11. package/dist/commands/machines/computer-adoption.js +34 -0
  12. package/dist/commands/machines/dedicated/agent-browser.d.ts +25 -0
  13. package/dist/commands/machines/dedicated/agent-browser.js +65 -0
  14. package/dist/commands/machines/dedicated/archive.d.ts +26 -0
  15. package/dist/commands/machines/dedicated/archive.js +113 -0
  16. package/dist/commands/machines/dedicated/audit.d.ts +25 -0
  17. package/dist/commands/machines/dedicated/audit.js +113 -0
  18. package/dist/commands/machines/dedicated/computer.d.ts +23 -0
  19. package/dist/commands/machines/dedicated/computer.js +64 -0
  20. package/dist/commands/machines/dedicated/cp.d.ts +2 -0
  21. package/dist/commands/machines/dedicated/cp.js +74 -2
  22. package/dist/commands/machines/dedicated/git-status.d.ts +15 -0
  23. package/dist/commands/machines/dedicated/git-status.js +56 -0
  24. package/dist/commands/machines/dedicated/index.js +15 -1
  25. package/dist/commands/machines/dedicated/ls.d.ts +27 -0
  26. package/dist/commands/machines/dedicated/ls.js +100 -0
  27. package/dist/commands/machines/dedicated/mkdir.d.ts +18 -0
  28. package/dist/commands/machines/dedicated/mkdir.js +57 -0
  29. package/dist/commands/machines/dedicated/mv.d.ts +24 -0
  30. package/dist/commands/machines/dedicated/mv.js +83 -0
  31. package/dist/commands/machines/dedicated/rm.d.ts +26 -0
  32. package/dist/commands/machines/dedicated/rm.js +100 -0
  33. package/dist/commands/machines/dedicated/search.d.ts +24 -0
  34. package/dist/commands/machines/dedicated/search.js +78 -0
  35. package/dist/commands/machines/dedicated/show.js +17 -2
  36. package/dist/commands/machines/dedicated/stat.d.ts +22 -0
  37. package/dist/commands/machines/dedicated/stat.js +92 -0
  38. package/dist/commands/machines/hosted/index.js +1 -1
  39. package/dist/commands/machines/hosted/list.js +1 -1
  40. package/dist/commands/machines/hosted/start.js +1 -1
  41. package/dist/commands/machines/services/declare.d.ts +24 -0
  42. package/dist/commands/machines/services/declare.js +73 -0
  43. package/dist/commands/machines/services/index.d.ts +15 -0
  44. package/dist/commands/machines/services/index.js +31 -0
  45. package/dist/commands/machines/services/ls.d.ts +17 -0
  46. package/dist/commands/machines/services/ls.js +60 -0
  47. package/dist/commands/machines/services/withdraw.d.ts +19 -0
  48. package/dist/commands/machines/services/withdraw.js +47 -0
  49. package/dist/commands/machines/share.d.ts +29 -0
  50. package/dist/commands/machines/share.js +100 -0
  51. package/dist/commands/machines/shared.d.ts +19 -0
  52. package/dist/commands/machines/shared.js +62 -0
  53. package/dist/commands/machines/shares.d.ts +16 -0
  54. package/dist/commands/machines/shares.js +69 -0
  55. package/dist/commands/machines/unshare.d.ts +19 -0
  56. package/dist/commands/machines/unshare.js +61 -0
  57. package/dist/commands/tasks/labels/create.d.ts +1 -0
  58. package/dist/commands/tasks/labels/create.js +3 -0
  59. package/dist/commands/views/create.d.ts +1 -0
  60. package/dist/commands/views/create.js +5 -0
  61. package/dist/lib/agent-home-workspace.d.ts +7 -0
  62. package/dist/lib/agent-home-workspace.js +147 -0
  63. package/dist/lib/computer-adoption.d.ts +60 -0
  64. package/dist/lib/computer-adoption.js +72 -0
  65. package/dist/lib/computer-consent.d.ts +55 -0
  66. package/dist/lib/computer-consent.js +154 -0
  67. package/dist/lib/computer-files.d.ts +239 -0
  68. package/dist/lib/computer-files.js +707 -0
  69. package/dist/lib/dedicated-copy.d.ts +45 -9
  70. package/dist/lib/dedicated-copy.js +141 -44
  71. package/dist/lib/dedicated-machines.d.ts +80 -0
  72. package/dist/lib/dedicated-machines.js +137 -6
  73. package/dist/lib/exec-runtime-binary.d.ts +3 -1
  74. package/dist/lib/exec-runtime-binary.js +16 -2
  75. package/dist/lib/label-scope.d.ts +12 -0
  76. package/dist/lib/label-scope.js +15 -1
  77. package/dist/lib/machine-audit.d.ts +34 -0
  78. package/dist/lib/machine-audit.js +50 -0
  79. package/dist/lib/machine-grants.d.ts +70 -0
  80. package/dist/lib/machine-grants.js +47 -0
  81. package/dist/lib/machine-services.d.ts +64 -0
  82. package/dist/lib/machine-services.js +60 -0
  83. package/dist/lib/task-view-render.d.ts +2 -0
  84. package/dist/lib/task-view-render.js +1 -1
  85. package/dist/lib/views/vocabulary.d.ts +1 -1
  86. package/dist/lib/views/vocabulary.js +2 -1
  87. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/computerWire.d.ts +1050 -0
  88. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/computerWire.js +1196 -0
  89. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/daemonToolApproval.js +7 -0
  90. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/computerWire.d.ts +1050 -0
  91. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/computerWire.js +1175 -0
  92. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/daemonToolApproval.js +7 -0
  93. package/dist/node_modules/@skrr-ai/auth-core/package.json +11 -1
  94. package/dist/node_modules/@skrr-ai/data-provider/index.js +22391 -20727
  95. package/dist/node_modules/@skrr-ai/data-provider/package.json +1 -1
  96. package/oclif.manifest.json +14767 -13095
  97. package/package.json +2 -2
@@ -0,0 +1,1050 @@
1
+ /**
2
+ * computerWire.ts — the ONE declaration of every name the computer protocol
3
+ * puts on the wire, and the pure rules the daemon applies to them (design
4
+ * docs/architecture/dedicated-runtime-computer-2026-10-01.md §4, §7.1).
5
+ *
6
+ * The daemon is published and cannot depend on `@skrr-ai/data-provider`, which
7
+ * is private. Without this module it would declare its own copy of the event
8
+ * names and refusal codes, and two hand-typed copies of a wire contract drift
9
+ * in exactly the way neither copy's tests can see (OSK-8588). So the names live
10
+ * here, in the published package, the way `firstPartyHarness.ts` does for the
11
+ * harness; `@skrr-ai/data-provider` re-exports this module and builds its zod
12
+ * schemas over these constants (`z.enum(COMPUTER_REFUSAL_CODES)`), so each name
13
+ * is still declared exactly once. `packages/data-provider/specs/computerWireBoundary.spec.ts`
14
+ * fails on a `computer:*` event name or a refusal-code table declared anywhere
15
+ * else.
16
+ *
17
+ * Pure TypeScript: no zod, no Node-only imports, so the browser, React Native
18
+ * and a bun-compiled daemon all load it. Most payload SHAPES are not here — they
19
+ * are zod schemas in data-provider; the daemon re-validates every field it
20
+ * reads. The exceptions are shapes the DAEMON produces and the API re-validates
21
+ * (activity details, the browser key input): those are declared here as plain
22
+ * interfaces, and data-provider's zod schemas are checked against them at
23
+ * compile time, because a producer and a validator that each spell the shape
24
+ * dropped every command event for a release (OSK-13605).
25
+ */
26
+ /**
27
+ * Client ⇄ API, on the existing `/ws/agentic` socket. A request the client
28
+ * needs answered is acknowledged through the Socket.IO acknowledgement
29
+ * callback.
30
+ */
31
+ export declare const COMPUTER_EVENTS: {
32
+ /** client → API: attach to a machine. */
33
+ readonly attach: "computer:attach";
34
+ /** client → API: leave. */
35
+ readonly detach: "computer:detach";
36
+ /**
37
+ * client → API: read the whole manifest again ON THE SAME ATTACHMENT, after
38
+ * a missed delta or a `stale_epoch` (OSK-13815). The ack carries what an
39
+ * attach's does — the attachment id (unchanged), the manifest and the
40
+ * operations — or a typed refusal; `not_found` means the attachment is gone
41
+ * and only then does the client attach afresh. Re-reading state must never
42
+ * change who the reader is: a control lease is bound to the attachment
43
+ * (`holderAttachmentId`), and a resync that detached and attached again
44
+ * orphaned the hold the person had just taken. Answered by the API, which
45
+ * renews the binding with the daemon exactly as its periodic re-check does
46
+ * (a repeated `daemon:computer:attach` with the same id), so it has no
47
+ * daemon mirror and needs no daemon capability. An API that predates it
48
+ * never answers; the client bounds the wait and falls back to attaching
49
+ * afresh.
50
+ */
51
+ readonly resync: "computer:resync";
52
+ /** API → client: this attachment was detached, with the reason (revoked, stale generation, …). */
53
+ readonly detached: "computer:detached";
54
+ /** API → client: a whole manifest, or a revisioned delta. */
55
+ readonly manifest: "computer:manifest";
56
+ /** client → API: observe one surface. */
57
+ readonly subscribe: "computer:surface:subscribe";
58
+ /** client → API: stop observing one surface. */
59
+ readonly unsubscribe: "computer:surface:unsubscribe";
60
+ /** API → client: terminal bytes with a byte cursor, or a page frame. */
61
+ readonly data: "computer:surface:data";
62
+ /**
63
+ * client → API: this viewer painted the page frame `seq` and wants the next.
64
+ * A viewer's slot is latest-wins: until it acknowledges, newer frames
65
+ * replace the one waiting for it and nothing queues (§6.2, §7.2 R3).
66
+ * Never acknowledged.
67
+ */
68
+ readonly frameAck: "computer:surface:frame:ack";
69
+ /** client → API: take / release / request / grant / decline. */
70
+ readonly control: "computer:surface:control";
71
+ /** client → API: share or unshare one of the person's own surfaces with an agent session. */
72
+ readonly share: "computer:surface:share";
73
+ /** client → API: one input, carrying the lease epoch. Never acknowledged. */
74
+ readonly input: "computer:surface:input";
75
+ /** client → API: open a person's own terminal or browser window. */
76
+ readonly open: "computer:surface:open";
77
+ /** client → API: close a surface. */
78
+ readonly close: "computer:surface:close";
79
+ /** API → client: activity events. */
80
+ readonly activity: "computer:activity";
81
+ /** client → API: the activity events after a `seq`, to fill a gap. */
82
+ readonly activityFill: "computer:activity:fill";
83
+ /** client → API: the directories expanded and files open, which scope the file watches. */
84
+ readonly filesWatch: "computer:files:watch";
85
+ /**
86
+ * API → client: what this attachment's scoped watches saw — paths and kinds,
87
+ * never contents — or that they went stale and the tree must be refreshed
88
+ * (§6.3 layer 2). Needs `computer_files_watch_v1`.
89
+ */
90
+ readonly filesChanged: "computer:files:changed";
91
+ /**
92
+ * client → API: answer a dialog the page is blocked on. Only the attachment
93
+ * holding the browser's lease, at the current epoch. Needs
94
+ * `computer_browser_page_v1`.
95
+ */
96
+ readonly dialog: "computer:surface:dialog";
97
+ /**
98
+ * client → API: copy-out — the text the person selected on the page, answered
99
+ * to the asking attachment alone and only while it holds the lease at the
100
+ * current epoch. Needs `computer_browser_page_v1`.
101
+ */
102
+ readonly copy: "computer:surface:copy";
103
+ /**
104
+ * client → API: answer the file chooser a page opened (§6.2 "a file chooser
105
+ * opens a picker over the computer's files, or a local upload"): paths on the
106
+ * computer, or none to cancel. Only the attachment holding the browser's
107
+ * lease, at the current epoch; the paths are read as the file surface reads
108
+ * them. Needs `computer_browser_file_chooser_v1`.
109
+ */
110
+ readonly fileChooser: "computer:surface:filechooser";
111
+ };
112
+ /**
113
+ * API ⇄ daemon. The daemon transports (Socket.IO and SSE) carry no
114
+ * acknowledgement callback, so a request the API needs answered carries a
115
+ * `requestId` and the daemon answers with `daemon:computer:ack`.
116
+ */
117
+ export declare const DAEMON_COMPUTER_EVENTS: {
118
+ /** Bind an attachment: its principal, operations and (dedicated) generation. */
119
+ readonly attach: "daemon:computer:attach";
120
+ readonly detach: "daemon:computer:detach";
121
+ /** The machine's grant set, whole, on registration and on every change. */
122
+ readonly grants: "daemon:computer:grants";
123
+ readonly subscribe: "daemon:computer:surface:subscribe";
124
+ readonly unsubscribe: "daemon:computer:surface:unsubscribe";
125
+ readonly frameAck: "daemon:computer:surface:frame:ack";
126
+ readonly control: "daemon:computer:surface:control";
127
+ readonly share: "daemon:computer:surface:share";
128
+ readonly input: "daemon:computer:surface:input";
129
+ readonly open: "daemon:computer:surface:open";
130
+ readonly close: "daemon:computer:surface:close";
131
+ readonly activityFill: "daemon:computer:activity:fill";
132
+ readonly filesWatch: "daemon:computer:files:watch";
133
+ /** One file operation, relayed from `/api/machines/:machineId/files/<op>`. */
134
+ readonly files: "daemon:computer:files";
135
+ readonly dialog: "daemon:computer:surface:dialog";
136
+ readonly copy: "daemon:computer:surface:copy";
137
+ readonly fileChooser: "daemon:computer:surface:filechooser";
138
+ /**
139
+ * Pin or unpin the surface an open human-input request names (§8): a pinned
140
+ * surface is not reclaimed by idle or wall-clock expiry. Fire-and-forget,
141
+ * idempotent on the pin id, bounded by its own `until`. Needs
142
+ * `computer_surface_pin_v1`.
143
+ */
144
+ readonly pin: "daemon:computer:surface:pin";
145
+ /**
146
+ * Declare, withdraw or list the machine's declared services (§20.5): a web
147
+ * service someone started on the machine, named and opened in the
148
+ * computer's own browser. Carries a `requestId`, the principal the API
149
+ * authorized and, for a declaration, who declared it; the daemon checks the
150
+ * principal against the grant set it holds. Needs
151
+ * `computer_declared_services_v1`.
152
+ */
153
+ readonly services: "daemon:computer:services";
154
+ /** The answer to any request that carried a `requestId`. */
155
+ readonly ack: "daemon:computer:ack";
156
+ readonly manifest: "daemon:computer:manifest";
157
+ readonly data: "daemon:computer:surface:data";
158
+ readonly activity: "daemon:computer:activity";
159
+ /** The daemon detached an attachment itself, e.g. its grant was revoked. */
160
+ readonly detached: "daemon:computer:detached";
161
+ /** One attachment's scoped watches saw changes, or went stale (§6.3). */
162
+ readonly filesChanged: "daemon:computer:files:changed";
163
+ /**
164
+ * The daemon's own frame-lane counters (§7.2, OSK-13616), every
165
+ * `COMPUTER_DIAGNOSTICS_INTERVAL_MS` while anyone is attached: counters and
166
+ * per-viewer timestamps from a closed vocabulary, never content. Needs
167
+ * `computer_diagnostics_v1`. Fire-and-forget; a lost report is the next one.
168
+ */
169
+ readonly diagnostics: "daemon:computer:diagnostics";
170
+ };
171
+ export type ComputerEventKey = keyof typeof COMPUTER_EVENTS;
172
+ export type ComputerEventName = (typeof COMPUTER_EVENTS)[ComputerEventKey];
173
+ export type DaemonComputerEventKey = keyof typeof DAEMON_COMPUTER_EVENTS;
174
+ export type DaemonComputerEventName = (typeof DAEMON_COMPUTER_EVENTS)[DaemonComputerEventKey];
175
+ export declare const COMPUTER_EVENT_NAMES: readonly ComputerEventName[];
176
+ export declare const DAEMON_COMPUTER_EVENT_NAMES: readonly DaemonComputerEventName[];
177
+ /** The daemon → API events; every other `daemon:computer:*` event flows API → daemon. */
178
+ export declare const DAEMON_COMPUTER_REPORT_EVENT_KEYS: readonly ["ack", "manifest", "data", "activity", "detached", "filesChanged", "diagnostics"];
179
+ /** The API → client events; every other `computer:*` event flows client → API. */
180
+ export declare const COMPUTER_SERVER_EVENT_KEYS: readonly ["detached", "manifest", "data", "activity", "filesChanged"];
181
+ /**
182
+ * Client → API requests the API answers itself, with no `daemon:computer:*`
183
+ * mirror: every other client request is relayed to the daemon under the same
184
+ * key. `resync` renews the binding through the daemon's existing attach
185
+ * (OSK-13815).
186
+ */
187
+ export declare const COMPUTER_API_ANSWERED_EVENT_KEYS: readonly ["resync"];
188
+ /** How long the client waits for a `computer:resync` answer before attaching afresh (an API that predates it never answers). */
189
+ export declare const COMPUTER_RESYNC_TIMEOUT_MS = 12000;
190
+ /**
191
+ * How long a client holds a manifest delta that arrived AHEAD of its
192
+ * predecessor before reading the hole as a loss (OSK-13815). Deltas fan out
193
+ * through a relay of several replicas; a reorder is milliseconds, a loss is
194
+ * forever, and only a loss needs the whole manifest again.
195
+ */
196
+ export declare const COMPUTER_MANIFEST_REORDER_WAIT_MS = 300;
197
+ /**
198
+ * One capability per wire addition, each withheld positively at dispatch: the
199
+ * API never sends a computer event to a daemon that did not announce the
200
+ * capability that event belongs to. Activity is part of `computer_v1`.
201
+ */
202
+ export declare const COMPUTER_CAPABILITIES: {
203
+ /** Manifest, surfaces, control leases, terminal surfaces, activity core. */
204
+ readonly computer: "computer_v1";
205
+ /** The grant set and the daemon's own check of every attachment against it (§9). */
206
+ readonly access: "computer_access_v1";
207
+ /** The file surface: `daemon:computer:files` and `computer:files:watch` (§6.3). */
208
+ readonly files: "computer_files_v1";
209
+ /**
210
+ * Filename and content search and git status decorations over the tenant
211
+ * roots, as the workload (§6.3 "Later, same contract"): the `FileSearch` and
212
+ * `FileGitStatus` tools. A daemon without it is never asked.
213
+ */
214
+ readonly filesSearch: "computer_files_search_v1";
215
+ /**
216
+ * File mutations fenced on what the person saw (review CW-01, CW-02 and the
217
+ * folder-delete finding): an upload commits create-only (`exists` when the
218
+ * name was claimed) or over exactly the version chosen to be replaced
219
+ * (`replaceTag`, else `file_changed`); a committed transfer leaves a receipt,
220
+ * so a resume after a lost final acknowledgement answers "already
221
+ * committed"; and `stat` with `contents: true` gives a folder a contents tag that
222
+ * a recursive delete presents. A daemon without it would ignore those
223
+ * conditions, so the API refuses them `capability_missing` instead of
224
+ * sending them.
225
+ */
226
+ readonly filesFenced: "computer_files_fenced_v1";
227
+ /** Observe attachments on a browser surface, separate from control (§6.2). */
228
+ readonly browserObserve: "computer_browser_observe_v1";
229
+ /** A browser surface's tab strip and tab input (§6.2). */
230
+ readonly browserTabs: "computer_browser_tabs_v1";
231
+ /**
232
+ * The rest of a real browser on a browser surface (§6.2): its pending
233
+ * dialogs and its downloads on the descriptor, answering a dialog
234
+ * (`computer:surface:dialog`) and copy-out (`computer:surface:copy`).
235
+ * Permission prompts are not part of it: Chromium exposes no CDP event for
236
+ * them (headless refuses them), so no surface may claim to show one.
237
+ */
238
+ readonly browserPage: "computer_browser_page_v1";
239
+ /** Sharing a person's own surface with an agent session (§5.4). */
240
+ readonly surfaceShare: "computer_surface_share_v1";
241
+ /** Pinning a surface an open human-input request names: `daemon:computer:surface:pin` (§8). */
242
+ readonly surfacePin: "computer_surface_pin_v1";
243
+ /**
244
+ * "Reset browser" — sign out everywhere (§6.2, OSK-13499): the
245
+ * `reset_browser` control action on a browser surface. Announced only by a
246
+ * daemon whose browser keeps one profile across sessions (a Dedicated
247
+ * Runtime guest); a personal machine's browser keeps nothing to reset.
248
+ */
249
+ readonly browserReset: "computer_browser_reset_v1";
250
+ /**
251
+ * Scoped file watches (§6.3 layer 2): `computer:files:watch` is served and
252
+ * `computer:files:changed` reports. Announced only where the daemon runs a
253
+ * watcher it can stand behind; without it the file tree says it does not
254
+ * update by itself and offers a refresh.
255
+ */
256
+ readonly filesWatch: "computer_files_watch_v1";
257
+ /**
258
+ * The file chooser a page opens while a person holds the browser (§6.2,
259
+ * OSK-13481): the pending chooser on the descriptor (`fileChooser`) and
260
+ * answering it with files on the computer (`computer:surface:file-chooser`).
261
+ * Announced only by a daemon whose browser intercepts the chooser.
262
+ */
263
+ readonly browserFileChooser: "computer_browser_file_chooser_v1";
264
+ /**
265
+ * A person's own terminal opens in a folder (§6.3 "Open a terminal here",
266
+ * OSK-13615): `computer:surface:open` carries `cwd`, which the daemon checks
267
+ * the way the file surface would (the tenant roots as the workload; on a
268
+ * personal machine the deny set, `blockedPaths` and home) and refuses typed
269
+ * when it may not. Without it the client types `cd` once it holds control.
270
+ */
271
+ readonly terminalCwd: "computer_terminal_cwd_v1";
272
+ /**
273
+ * A run in an agent's interactive shell (`terminal.run`, tool `Terminal`)
274
+ * says where in its terminal's byte stream it began: `streamOffset` on its
275
+ * `command` activity, the terminal lane's cursor at that moment (§6.1, task
276
+ * 5-04b, OSK-13614). A client places such a block inline at that point of
277
+ * the terminal; without the capability it keeps every block in the list
278
+ * below the terminal, as before.
279
+ */
280
+ readonly terminalCommandOffset: "computer_terminal_command_offset_v1";
281
+ /**
282
+ * The daemon reports its frame-lane counters (`daemon:computer:diagnostics`,
283
+ * OSK-13616), so the API's own logs can tell "the daemon stopped sending"
284
+ * from "the page did not change". Announced by the relay that sends them;
285
+ * the API asks nothing of a daemon without it, and reads its silence as
286
+ * "unreported", never as healthy.
287
+ */
288
+ readonly diagnostics: "computer_diagnostics_v1";
289
+ /**
290
+ * Declared services (§20.5, 9-17, OSK-13579): the manifest carries
291
+ * `services`, the web services an agent or a person declared on this
292
+ * machine, and `daemon:computer:services` (and the agent's
293
+ * `computer.services` tool call) declares, withdraws and lists them. A
294
+ * service is a localhost port on the machine, opened in the computer's own
295
+ * browser; nothing is proxied to it. Announced by the relay that serves it.
296
+ */
297
+ readonly declaredServices: "computer_declared_services_v1";
298
+ /**
299
+ * The page follows the controlling window (§6.2 "a stable viewport", §7.1,
300
+ * OSK-13808): a browser `viewport` input, sent only by the attachment that
301
+ * holds the browser's lease at the current epoch, sizes the streamed page
302
+ * to that window's content box (`COMPUTER_BROWSER_VIEWPORT_LIMITS`). Only
303
+ * while a person holds control: handing back — or the hold lapsing, being
304
+ * revoked or moving to the agent any other way — restores the browser's own
305
+ * viewport before the agent can act, so an agent never inherits a person's
306
+ * size. Watchers keep seeing the page at whatever size it is, scaled to
307
+ * fit. Announced only where the browser driver can override and restore
308
+ * the page's metrics; without it the window scales the fixed page, as
309
+ * before, and never sends the input.
310
+ */
311
+ readonly browserViewport: "computer_browser_viewport_v1";
312
+ };
313
+ export type ComputerCapabilityKey = keyof typeof COMPUTER_CAPABILITIES;
314
+ export type ComputerCapability = (typeof COMPUTER_CAPABILITIES)[ComputerCapabilityKey];
315
+ export declare const COMPUTER_CAPABILITY_VALUES: [ComputerCapability, ...ComputerCapability[]];
316
+ /**
317
+ * Every refusal and limit the computer protocol can answer with. Callers branch
318
+ * on the code; a message beside it is free text and may change.
319
+ */
320
+ 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"];
321
+ export type ComputerRefusalCode = (typeof COMPUTER_REFUSAL_CODES)[number];
322
+ /**
323
+ * The code when it is a computer refusal, else `null`. There is one spelling
324
+ * per code: the browser's older spelling of `human_control` was accepted for
325
+ * one release and retired with the old browser events (§5.2, OSK-13509).
326
+ */
327
+ export declare function normalizeComputerRefusalCode(code: unknown): ComputerRefusalCode | null;
328
+ export declare const COMPUTER_ACTOR_KINDS: readonly ["agent", "human"];
329
+ export type ComputerActorKind = (typeof COMPUTER_ACTOR_KINDS)[number];
330
+ /**
331
+ * Who an activity event is attributed to. `system` is what happened with no
332
+ * actor behind it — a process exited, the machine stopped — and appears ONLY
333
+ * on activity: it never holds a lease, is never present, is never audited as
334
+ * an actor. Without it on the wire every lifecycle event was dropped by the
335
+ * API and a client saw a `seq` hole no fill could close.
336
+ */
337
+ export declare const COMPUTER_ACTIVITY_ACTOR_KINDS: readonly ["agent", "human", "system"];
338
+ export type ComputerActivityActorKind = (typeof COMPUTER_ACTIVITY_ACTOR_KINDS)[number];
339
+ /**
340
+ * The session ids the PLATFORM's own routes run daemon tools under — the web
341
+ * Files surface (`computer-files:` on a personal machine, `dedicated-runtime:`
342
+ * on a Dedicated Runtime) and the owner's `skrr machines dedicated` commands.
343
+ * No agent and no model is behind such a session: the person who asked is
344
+ * known to the API (which audits it), not to the daemon. So an activity event
345
+ * produced under one names no agent (OSK-13790: a person's upload used to read
346
+ * "agent created …"). Built by `ComputerFileService.runPersonalMachineTool`
347
+ * and `DedicatedRuntimeMachineAccess.runDedicatedRuntimeTool`.
348
+ */
349
+ export declare const COMPUTER_PLATFORM_ROUTE_SESSION_PREFIXES: readonly ["dedicated-runtime:", "computer-files:"];
350
+ /** Whether a tool call's session is one of the platform's own routes, not an agent's. */
351
+ export declare function isComputerPlatformRouteSession(sessionId: unknown): boolean;
352
+ /** An agent session, as the wire names it. Same session = same `agentId` AND `sessionId`. */
353
+ export interface ComputerWireAgentActor {
354
+ kind: 'agent';
355
+ agentId: string;
356
+ sessionId: string;
357
+ label: string;
358
+ }
359
+ export interface ComputerWireHumanActor {
360
+ kind: 'human';
361
+ userId: string;
362
+ label: string;
363
+ }
364
+ /** Activity only (see `COMPUTER_ACTIVITY_ACTOR_KINDS`). */
365
+ export interface ComputerWireSystemActor {
366
+ kind: 'system';
367
+ label: string;
368
+ }
369
+ /** Who can hold a lease or be present. */
370
+ export type ComputerWireActor = ComputerWireAgentActor | ComputerWireHumanActor;
371
+ /** Who an activity event is attributed to. */
372
+ export type ComputerWireActivityActor = ComputerWireActor | ComputerWireSystemActor;
373
+ /**
374
+ * How a person present on the machine reached it: as its owner, or through a
375
+ * grant at one of the two tiers. Agents carry no access level — an agent
376
+ * session acts with its own run's authority, not a grant.
377
+ */
378
+ export declare const COMPUTER_ACCESS_LEVELS: readonly ["owner", "watch", "operate"];
379
+ export type ComputerAccessLevel = (typeof COMPUTER_ACCESS_LEVELS)[number];
380
+ /**
381
+ * What a principal may do on a computer. Kept separate so a refusal says
382
+ * exactly what was refused. `power`, closing other people's surfaces and
383
+ * managing grants stay with the owner; no tier contains `power`.
384
+ */
385
+ export declare const COMPUTER_OPERATIONS: readonly ["observe", "control", "files.read", "files.write", "open", "power"];
386
+ export type ComputerOperation = (typeof COMPUTER_OPERATIONS)[number];
387
+ /** A grant is one of two fixed tiers: a finer grant cannot be enforced on a shell. */
388
+ export declare const COMPUTER_GRANT_TIERS: readonly ["watch", "operate"];
389
+ export type ComputerGrantTier = (typeof COMPUTER_GRANT_TIERS)[number];
390
+ /** The fixed set of operations a grant tier carries. */
391
+ export declare function computerTierOperations(tier: ComputerGrantTier): readonly ComputerOperation[];
392
+ /** Whether a grant tier carries `operation`. */
393
+ export declare function computerOperationAllowed(tier: ComputerGrantTier, operation: ComputerOperation): boolean;
394
+ /** The operations an access level carries: the owner holds every one. */
395
+ export declare function computerAccessOperations(level: ComputerAccessLevel): readonly ComputerOperation[];
396
+ /** A person releasing control may leave a note for the agent (§8). */
397
+ export declare const COMPUTER_HANDBACK_NOTE_MAX_LENGTH = 2000;
398
+ /** A person holding control is released after this long without human input (§5.1 rule 4). */
399
+ export declare const COMPUTER_CONTROL_IDLE_MS: number;
400
+ /** How long before idle reclaim of a person's hold the daemon says it is coming (§8). */
401
+ export declare const COMPUTER_RECLAIM_WARNING_MS: number;
402
+ /** A transport blip shorter than this changes no lease (§7.2 R6). */
403
+ export declare const COMPUTER_RECONNECT_GRACE_MS: number;
404
+ /** An agent terminal write waits this long for a person to hand back before refusing (§5.2). */
405
+ export declare const COMPUTER_AGENT_WRITE_WAIT_MS: number;
406
+ /** What a person can do to a surface's lease (§5.1, §5.3). */
407
+ export declare const COMPUTER_CONTROL_ACTIONS: readonly ["take", "release", "request", "grant", "decline", "reveal", "reset_browser"];
408
+ export type ComputerControlAction = (typeof COMPUTER_CONTROL_ACTIONS)[number];
409
+ /** Sharing one of a person's own surfaces with one agent session (§5.4). */
410
+ export declare const COMPUTER_SHARE_ACTIONS: readonly ["share", "unshare"];
411
+ export type ComputerShareAction = (typeof COMPUTER_SHARE_ACTIONS)[number];
412
+ export declare const COMPUTER_SHARE_MODES: readonly ["observe", "control"];
413
+ export type ComputerShareMode = (typeof COMPUTER_SHARE_MODES)[number];
414
+ /** `daemon:computer:surface:pin` actions (§8). */
415
+ export declare const COMPUTER_SURFACE_PIN_ACTIONS: readonly ["pin", "unpin"];
416
+ export type ComputerSurfacePinAction = (typeof COMPUTER_SURFACE_PIN_ACTIONS)[number];
417
+ /** Why a pin ended: the request it held the surface for left `open`. */
418
+ export declare const COMPUTER_SURFACE_UNPIN_REASONS: readonly ["answered", "dismissed", "expired"];
419
+ export type ComputerSurfaceUnpinReason = (typeof COMPUTER_SURFACE_UNPIN_REASONS)[number];
420
+ /**
421
+ * A surface held for a person by an open human-input request (§8), as the
422
+ * manifest shows it: which request, since when, until when at the latest.
423
+ */
424
+ export interface ComputerSurfacePin {
425
+ /** The human-input request id. */
426
+ pinId: string;
427
+ taskId?: string;
428
+ since: number;
429
+ until: number;
430
+ }
431
+ /** Why a lease changed holder. Carried by `control` activity events and the audit record. */
432
+ export declare const COMPUTER_CONTROL_CHANGE_REASONS: readonly ["take", "release", "grant", "idle", "disconnect", "share", "unshare", "revoked", "machine_stopped"];
433
+ export type ComputerControlChangeReason = (typeof COMPUTER_CONTROL_CHANGE_REASONS)[number];
434
+ /**
435
+ * What a `control` activity event reports: a change of holder (one of
436
+ * `COMPUTER_CONTROL_CHANGE_REASONS`), a person-to-person request's lifecycle,
437
+ * or a reveal (D12). Only the first changes the holder or the epoch's owner;
438
+ * {@link computerControlChangeIsHolderChange} tells them apart.
439
+ */
440
+ export declare const COMPUTER_CONTROL_ACTIVITY_CHANGES: readonly ["take", "release", "grant", "idle", "disconnect", "share", "unshare", "revoked", "machine_stopped", "request", "request_declined", "request_expired", "request_withdrawn", "revealed"];
441
+ export type ComputerControlActivityChange = (typeof COMPUTER_CONTROL_ACTIVITY_CHANGES)[number];
442
+ /** Whether a `control` activity change moved the lease to a new holder. */
443
+ export declare function computerControlChangeIsHolderChange(change: unknown): change is ComputerControlChangeReason;
444
+ /**
445
+ * The part of a control lease the input fence reads. `epoch` is a fence, not
446
+ * an authorisation: it increments on every change of holder, and because every
447
+ * observer can read it, input is accepted only from the ATTACHMENT that took
448
+ * the lease (`holderAttachmentId` + `epoch`).
449
+ */
450
+ export interface ComputerLeaseFence {
451
+ holder: {
452
+ kind: ComputerActorKind;
453
+ };
454
+ epoch: number;
455
+ /** The attachment that took the lease. Set while a person holds; absent for an agent. */
456
+ holderAttachmentId?: string;
457
+ }
458
+ /**
459
+ * Why an input from `attachmentId`, issued under `epoch`, must be dropped — or
460
+ * `null` when the lease accepts it.
461
+ *
462
+ * The epoch is checked first: an input issued under an epoch that is no longer
463
+ * current is the in-flight keystroke the fence exists for, whoever sent it.
464
+ * Only a current-epoch input from an attachment that does not hold the lease
465
+ * is `not_holder`. An agent-held lease accepts no attachment's input.
466
+ */
467
+ export declare function computerLeaseInputRefusal(lease: ComputerLeaseFence, attachmentId: string, epoch: number): Extract<ComputerRefusalCode, 'stale_epoch' | 'not_holder'> | null;
468
+ /** Whether the lease accepts an input from `attachmentId` issued under `epoch`. */
469
+ export declare function computerLeaseAcceptsInput(lease: ComputerLeaseFence, attachmentId: string, epoch: number): boolean;
470
+ /** Files are a namespace, not a leased surface (§6.3). */
471
+ export declare const COMPUTER_SURFACE_KINDS: readonly ["terminal", "browser"];
472
+ export type ComputerSurfaceKind = (typeof COMPUTER_SURFACE_KINDS)[number];
473
+ export declare const COMPUTER_SURFACE_STATES: readonly ["live", "ended"];
474
+ export type ComputerSurfaceState = (typeof COMPUTER_SURFACE_STATES)[number];
475
+ /**
476
+ * Why a surface ended (§10). An ended surface stays as a tombstone with its
477
+ * history until dismissed, and its reason is shown, never swallowed.
478
+ */
479
+ export declare const COMPUTER_SURFACE_END_REASONS: readonly ["machine_stopped", "closed_by_owner", "closed", "process_exited", "daemon_restarted", "browser_crashed", "expired", "browser_reset"];
480
+ export type ComputerSurfaceEndReason = (typeof COMPUTER_SURFACE_END_REASONS)[number];
481
+ /**
482
+ * The browser's logical viewport whoever is looking (§6.2): what the agent
483
+ * always works at. A person holding control may size the page to their window
484
+ * (`computer_browser_viewport_v1`); handing back restores this.
485
+ */
486
+ export declare const COMPUTER_BROWSER_VIEWPORT: Readonly<{
487
+ width: 1280;
488
+ height: 800;
489
+ }>;
490
+ /** One frame never exceeds this, so it fits the SSE transport every guest uses (§7.2 R7). */
491
+ export declare const COMPUTER_FRAME_MAX_BYTES: number;
492
+ /**
493
+ * A viewer's frame slot frees itself after this long without the viewer's
494
+ * acknowledgement. The relay cannot promise delivery of the acknowledgement
495
+ * either, and a lost one must not freeze a viewer that is still painting; a
496
+ * viewer that really stalled still gets at most one frame per bound, never a
497
+ * backlog.
498
+ */
499
+ export declare const COMPUTER_FRAME_ACK_TIMEOUT_MS = 5000;
500
+ /**
501
+ * The daemon's frame-lane counters (`daemon:computer:diagnostics`, OSK-13616).
502
+ * Cumulative since `since`, so a lost report loses nothing but its moment.
503
+ */
504
+ export declare const COMPUTER_DIAGNOSTIC_COUNTERS: readonly ["frames_produced", "frames_sent", "frames_held_disconnected", "frames_dropped_oversize", "frames_send_failed", "frames_acked", "frames_ack_timeout", "frame_slots_released"];
505
+ /** How often a daemon with anyone attached reports its counters. */
506
+ export declare const COMPUTER_DIAGNOSTICS_INTERVAL_MS = 15000;
507
+ /** Viewers one report names, newest first; the rest are in the totals only. */
508
+ export declare const COMPUTER_DIAGNOSTICS_MAX_STREAMS = 64;
509
+ export declare const COMPUTER_TERMINAL_SIGNALS: readonly ["interrupt", "eof"];
510
+ export type ComputerTerminalSignal = (typeof COMPUTER_TERMINAL_SIGNALS)[number];
511
+ /** Input a terminal surface takes. */
512
+ export declare const COMPUTER_TERMINAL_INPUT_TYPES: readonly ["bytes", "paste", "resize", "signal"];
513
+ /**
514
+ * How long a terminal lives (§6.1, §18), so its window can say so instead of
515
+ * implying a guest's guarantees on a laptop (OSK-13535):
516
+ * - `host`: its shell is in the terminal host; a daemon restart or update
517
+ * leaves it running. Off a guest the host closes it an hour after its
518
+ * daemon stopped for good. Its output is kept on disk, so after the machine
519
+ * (or the host) restarts it reopens with its history above a divider;
520
+ * - `tmux`: a guest's persistent terminal from before the host; it outlives
521
+ * the daemon and ends with the machine, with no history;
522
+ * - `daemon`: its shell is in the daemon's own process and ends with it.
523
+ */
524
+ export declare const COMPUTER_TERMINAL_LIFETIMES: readonly ["host", "tmux", "daemon"];
525
+ export type ComputerTerminalLifetime = (typeof COMPUTER_TERMINAL_LIFETIMES)[number];
526
+ /**
527
+ * Why a reopened terminal's shell is not the one that wrote the history above
528
+ * its divider (OSK-13474). The terminal host decides it from its records.
529
+ */
530
+ export declare const COMPUTER_TERMINAL_HISTORY_CAUSES: readonly ["machine_restarted", "host_stopped", "host_orphaned", "host_restarted"];
531
+ export type ComputerTerminalHistoryCause = (typeof COMPUTER_TERMINAL_HISTORY_CAUSES)[number];
532
+ /**
533
+ * What a terminal's window cannot promise on this machine, said rather than
534
+ * left silent. `windows_pty_unverified`: a Windows machine's terminal is a
535
+ * ConPTY in the daemon's process; its resize and PTY behaviour have not been
536
+ * verified (OSK-13535).
537
+ */
538
+ export declare const COMPUTER_TERMINAL_CAVEATS: readonly ["windows_pty_unverified"];
539
+ export type ComputerTerminalCaveat = (typeof COMPUTER_TERMINAL_CAVEATS)[number];
540
+ /** Terminal-only facts a surface descriptor carries (`terminal`). Every field is optional. */
541
+ export interface ComputerTerminalInfo {
542
+ /**
543
+ * The size the terminal's controller set (§6.1, OSK-13475). A viewer that
544
+ * does not hold control renders at this size, scaled to fit, and never sends
545
+ * its own.
546
+ */
547
+ cols?: number;
548
+ rows?: number;
549
+ lifetime?: ComputerTerminalLifetime;
550
+ /** It reopened above the history of a shell that ended with the machine or its host. */
551
+ restarted?: {
552
+ cause: ComputerTerminalHistoryCause;
553
+ at: number;
554
+ };
555
+ caveats?: ComputerTerminalCaveat[];
556
+ }
557
+ /**
558
+ * Input a browser surface takes. `tab` needs `computer_browser_tabs_v1`;
559
+ * `viewport` needs `computer_browser_viewport_v1`.
560
+ */
561
+ export declare const COMPUTER_BROWSER_INPUT_TYPES: readonly ["pointer", "key", "text", "navigate", "history", "tab", "viewport"];
562
+ /**
563
+ * What a `viewport` input may ask of the page (OSK-13808), in CSS pixels: the
564
+ * controlling window's content box, bounded so no window can make the page
565
+ * absurd for the agent that gets it back, and aspect-clamped (`minAspect` and
566
+ * `maxAspect` are width ÷ height) so a sliver of a window cannot either.
567
+ * Device pixel ratio is not part of it: the page keeps the browser's own, so a
568
+ * high-density screen changes no layout and no picture size.
569
+ */
570
+ export declare const COMPUTER_BROWSER_VIEWPORT_LIMITS: Readonly<{
571
+ minWidth: 320;
572
+ maxWidth: 2560;
573
+ minHeight: 240;
574
+ maxHeight: 1600;
575
+ minAspect: 0.4;
576
+ maxAspect: 3.2;
577
+ }>;
578
+ /**
579
+ * The size a `viewport` input asks for, made legal: whole CSS pixels inside
580
+ * `COMPUTER_BROWSER_VIEWPORT_LIMITS`, its aspect inside the clamp. Total and
581
+ * idempotent: the window sends what this returns and the daemon applies what
582
+ * this returns, so both ends agree on the page a size produces. Null for a size
583
+ * with no area (a hidden or collapsed window asks for nothing).
584
+ */
585
+ export declare function clampComputerBrowserViewport(size: {
586
+ width: number;
587
+ height: number;
588
+ }): {
589
+ width: number;
590
+ height: number;
591
+ } | null;
592
+ /**
593
+ * The client OS a browser `key` input comes from. A person's shortcuts are
594
+ * mapped onto the Linux page's by the daemon: on `mac`, Command is Control,
595
+ * Command+Arrow is Home/End and Option+Arrow is Control+Arrow. Omitted, the
596
+ * keys are sent as they are (the client has already mapped them, or needs none).
597
+ */
598
+ export declare const COMPUTER_BROWSER_INPUT_PLATFORMS: readonly ["mac", "windows", "linux", "other"];
599
+ export type ComputerBrowserInputPlatform = (typeof COMPUTER_BROWSER_INPUT_PLATFORMS)[number];
600
+ /** The most text one `text` input, `paste` input or `key` input's `text` carries. */
601
+ export declare const COMPUTER_INPUT_TEXT_MAX_LENGTH: number;
602
+ /**
603
+ * A browser `key` input. `text` is the character the key produces, so a
604
+ * printable key is inserted by the key itself (one input, the page sees the
605
+ * key and the character together); IME composition still commits through a
606
+ * separate `text` input. `platform` names the client OS so the daemon maps its
607
+ * shortcuts (see `COMPUTER_BROWSER_INPUT_PLATFORMS`).
608
+ */
609
+ export interface ComputerBrowserKeyInput {
610
+ type: 'key';
611
+ action: 'down' | 'up';
612
+ key: string;
613
+ code?: string;
614
+ /** CDP modifier bits: Alt 1, Control 2, Meta 4, Shift 8. */
615
+ modifiers?: number;
616
+ text?: string;
617
+ platform?: ComputerBrowserInputPlatform;
618
+ }
619
+ /** What a page can block on until someone answers (§6.2). Permission prompts have no CDP event. */
620
+ export declare const COMPUTER_BROWSER_DIALOG_KINDS: readonly ["alert", "confirm", "prompt", "beforeunload", "auth"];
621
+ export type ComputerBrowserDialogKind = (typeof COMPUTER_BROWSER_DIALOG_KINDS)[number];
622
+ /** How a dialog ended; `cancelled` is the page or a navigation closing it first. */
623
+ export declare const COMPUTER_BROWSER_DIALOG_OUTCOMES: readonly ["accepted", "dismissed", "credentials_supplied", "cancelled"];
624
+ export type ComputerBrowserDialogOutcome = (typeof COMPUTER_BROWSER_DIALOG_OUTCOMES)[number];
625
+ /** Who answered: the standing policy, the agent, the person, or the page itself. */
626
+ export declare const COMPUTER_BROWSER_DIALOG_ANSWERERS: readonly ["agent_policy", "agent", "person", "page"];
627
+ export type ComputerBrowserDialogAnswerer = (typeof COMPUTER_BROWSER_DIALOG_ANSWERERS)[number];
628
+ /** The most of a dialog's message the surface carries; the page's text is cut there. */
629
+ export declare const COMPUTER_BROWSER_DIALOG_MESSAGE_MAX_LENGTH = 2000;
630
+ /** The longest answer a `prompt` dialog takes. */
631
+ export declare const COMPUTER_BROWSER_DIALOG_PROMPT_MAX_LENGTH = 4096;
632
+ /** The longest username or password an `auth` dialog takes; forwarded to the page only. */
633
+ export declare const COMPUTER_BROWSER_DIALOG_CREDENTIAL_MAX_LENGTH = 1024;
634
+ /** A download's state on the surface (§6.2); a finished one also appears in Files. */
635
+ export declare const COMPUTER_BROWSER_DOWNLOAD_STATES: readonly ["in_progress", "completed", "canceled"];
636
+ export type ComputerBrowserDownloadState = (typeof COMPUTER_BROWSER_DOWNLOAD_STATES)[number];
637
+ /** The downloads one browser surface lists, newest first; older ones are in Files. */
638
+ export declare const COMPUTER_BROWSER_DOWNLOADS_MAX = 20;
639
+ /** Whether the page's file input takes one file or several. */
640
+ export declare const COMPUTER_BROWSER_FILE_CHOOSER_MODES: readonly ["single", "multiple"];
641
+ export type ComputerBrowserFileChooserMode = (typeof COMPUTER_BROWSER_FILE_CHOOSER_MODES)[number];
642
+ /** How a file chooser ended: files went to the page, or the person chose none. */
643
+ export declare const COMPUTER_BROWSER_FILE_CHOOSER_OUTCOMES: readonly ["files_chosen", "cancelled"];
644
+ export type ComputerBrowserFileChooserOutcome = (typeof COMPUTER_BROWSER_FILE_CHOOSER_OUTCOMES)[number];
645
+ /** The most files one answer hands the page. */
646
+ export declare const COMPUTER_BROWSER_FILE_CHOOSER_MAX_FILES = 32;
647
+ /** The longest `accept` attribute the descriptor carries; the page's is cut there. */
648
+ export declare const COMPUTER_BROWSER_FILE_CHOOSER_ACCEPT_MAX_LENGTH = 512;
649
+ /** The longest path one answer names. */
650
+ export declare const COMPUTER_BROWSER_FILE_CHOOSER_PATH_MAX_LENGTH = 4096;
651
+ /** The longest folder `computer:surface:open` may name as a terminal's `cwd`. */
652
+ export declare const COMPUTER_TERMINAL_CWD_MAX_LENGTH = 4096;
653
+ /** The most text one copy-out returns; a longer selection is cut there. */
654
+ export declare const COMPUTER_BROWSER_COPY_MAX_LENGTH: number;
655
+ /** `history` input: the browser's own back, forward and reload. */
656
+ export declare const COMPUTER_BROWSER_HISTORY_ACTIONS: readonly ["back", "forward", "reload"];
657
+ export type ComputerBrowserHistoryAction = (typeof COMPUTER_BROWSER_HISTORY_ACTIONS)[number];
658
+ /** `tab` input. `activate` and `close` name a `tabId`; `open` opens a blank tab. */
659
+ export declare const COMPUTER_BROWSER_TAB_ACTIONS: readonly ["activate", "open", "close"];
660
+ export type ComputerBrowserTabAction = (typeof COMPUTER_BROWSER_TAB_ACTIONS)[number];
661
+ /** The longest URL a `navigate` input carries. */
662
+ export declare const COMPUTER_BROWSER_URL_MAX_LENGTH = 4096;
663
+ export type ComputerSurfaceInputType = (typeof COMPUTER_TERMINAL_INPUT_TYPES)[number] | (typeof COMPUTER_BROWSER_INPUT_TYPES)[number];
664
+ export declare const COMPUTER_FILE_OPERATIONS: readonly ["list", "stat", "read", "write", "mkdir", "move", "delete", "archive"];
665
+ export type ComputerFileOperation = (typeof COMPUTER_FILE_OPERATIONS)[number];
666
+ /**
667
+ * The read-only file routes that arrived with `computer_files_search_v1`
668
+ * (§6.3). A separate list: the operations above are the original contract and
669
+ * the audit/activity vocabulary pins them; these two never mutate.
670
+ */
671
+ export declare const COMPUTER_FILE_SEARCH_OPERATIONS: readonly ["search", "gitstatus"];
672
+ export type ComputerFileSearchOperation = (typeof COMPUTER_FILE_SEARCH_OPERATIONS)[number];
673
+ /** How a search ended: all of it read, cut at the result limit, or cut at the time bound. */
674
+ export declare const COMPUTER_FILE_SEARCH_STATES: readonly ["complete", "truncated", "timed_out"];
675
+ export type ComputerFileSearchState = (typeof COMPUTER_FILE_SEARCH_STATES)[number];
676
+ /** What `git status` says about one entry of a directory. */
677
+ export declare const COMPUTER_FILE_GIT_MARKS: readonly ["modified", "added", "untracked", "ignored", "conflicted"];
678
+ export type ComputerFileGitMark = (typeof COMPUTER_FILE_GIT_MARKS)[number];
679
+ /** Search bounds, one declaration for the daemon, the API and the client. */
680
+ export declare const COMPUTER_FILE_SEARCH_DEFAULT_LIMIT = 200;
681
+ export declare const COMPUTER_FILE_SEARCH_MAX_LIMIT = 1000;
682
+ export declare const COMPUTER_FILE_SEARCH_DEFAULT_BUDGET_MS = 8000;
683
+ export declare const COMPUTER_FILE_SEARCH_MAX_BUDGET_MS = 20000;
684
+ export declare const COMPUTER_FILE_SEARCH_MAX_QUERY_LENGTH = 200;
685
+ export declare const COMPUTER_FILE_GIT_STATUS_BUDGET_MS = 4000;
686
+ export declare const COMPUTER_FILE_TYPES: readonly ["file", "directory", "symlink", "other"];
687
+ export type ComputerFileType = (typeof COMPUTER_FILE_TYPES)[number];
688
+ /**
689
+ * Why an entry is withheld rather than listed as readable (§18): the daemon's
690
+ * own deny set, the machine's `blockedPaths`, a built-in sensitive pattern, or
691
+ * an operating-system privacy control denying the daemon the folder.
692
+ */
693
+ export declare const COMPUTER_FILE_WITHHELD_REASONS: readonly ["deny_set", "blocked_path", "sensitive_pattern", "os_permission"];
694
+ export type ComputerFileWithheldReason = (typeof COMPUTER_FILE_WITHHELD_REASONS)[number];
695
+ /**
696
+ * Why an attachment's scoped watches went stale (§6.3 "degrades to stale, not
697
+ * to wrong"). The tree then says so and offers a refresh — it never sits on a
698
+ * silently partial picture.
699
+ *
700
+ * - `spawn_failed`: the watcher could not start.
701
+ * - `watcher_exited`: the watcher ended (tenant code may kill it on a guest).
702
+ * - `watch_quota`: the account's watch quota is spent.
703
+ * - `events_overflow`: more changes arrived than are forwarded (a build
704
+ * writing thousands of files), so the watcher stopped rather than queue.
705
+ * - `delivery_gap`: a report was lost between the machine and this viewer.
706
+ */
707
+ export declare const COMPUTER_FILES_WATCH_DEGRADED_REASONS: readonly ["spawn_failed", "watcher_exited", "watch_quota", "events_overflow", "delivery_gap"];
708
+ export type ComputerFilesWatchDegradedReason = (typeof COMPUTER_FILES_WATCH_DEGRADED_REASONS)[number];
709
+ /** Changes one `computer:files:changed` report carries; more in one window is `events_overflow`. */
710
+ export declare const COMPUTER_FILES_CHANGED_MAX_CHANGES = 256;
711
+ /** The kinds of change a `file_change` activity event reports. */
712
+ export declare const COMPUTER_FILE_CHANGES: readonly ["created", "modified", "deleted", "moved"];
713
+ export type ComputerFileChange = (typeof COMPUTER_FILE_CHANGES)[number];
714
+ /**
715
+ * The optimistic-concurrency tag a read returns and a write presents. Inode
716
+ * and nanosecond mtime are decimal strings: both exceed what a JS number holds
717
+ * exactly.
718
+ */
719
+ export interface ComputerFileEntityTagFields {
720
+ inode: string;
721
+ size: number;
722
+ mtimeNs: string;
723
+ /**
724
+ * A DIRECTORY's contents tag, asked for with `stat {contents: true}`: a
725
+ * SHA-256 (lowercase hex) over every entry below the folder — its type,
726
+ * inode, size, change time and relative path. It changes when anything
727
+ * inside the folder is created, removed, renamed or written, at any depth,
728
+ * which the folder's own `mtimeNs` does not (that moves only for its direct
729
+ * children). A recursive delete that presents a tag must present this one,
730
+ * so it can only erase the contents the person was shown. Comparable only
731
+ * on the machine that computed it.
732
+ */
733
+ contents?: string;
734
+ }
735
+ /** The most entries below a folder a contents tag covers; a larger folder is `too_large`. */
736
+ export declare const COMPUTER_FILE_CONTENTS_TAG_MAX_ENTRIES = 100000;
737
+ /** A contents tag's shape: SHA-256 as lowercase hex. */
738
+ export declare const COMPUTER_FILE_CONTENTS_TAG_PATTERN: RegExp;
739
+ export declare function computerFileEntityTagsEqual(a: ComputerFileEntityTagFields, b: ComputerFileEntityTagFields): boolean;
740
+ export declare const COMPUTER_ACTIVITY_KINDS: readonly ["command", "browser_action", "file_change", "control", "lifecycle"];
741
+ export type ComputerActivityKind = (typeof COMPUTER_ACTIVITY_KINDS)[number];
742
+ /** `summary` is one line, safe to show. */
743
+ export declare const COMPUTER_ACTIVITY_SUMMARY_MAX_LENGTH = 500;
744
+ /** The most command output one event carries; longer output is split across events. */
745
+ export declare const COMPUTER_ACTIVITY_OUTPUT_MAX_LENGTH: number;
746
+ /**
747
+ * What a viewer without file access reads where a withheld path stood
748
+ * (security review PM-10, OSK-13701): one stable token, so a client can say
749
+ * "withheld" rather than render a path-shaped string.
750
+ */
751
+ export declare const COMPUTER_ACTIVITY_WITHHELD_PLACEHOLDER = "[withheld]";
752
+ export declare const COMPUTER_COMMAND_PHASES: readonly ["started", "output", "exited"];
753
+ export type ComputerCommandPhase = (typeof COMPUTER_COMMAND_PHASES)[number];
754
+ export declare const COMPUTER_LIFECYCLE_EVENTS: readonly ["surface_opened", "surface_ended", "surface_shared", "surface_unshared", "surface_orphaned", "reclaim_imminent", "power", "browser_reset"];
755
+ export type ComputerLifecycleEvent = (typeof COMPUTER_LIFECYCLE_EVENTS)[number];
756
+ /** How a command call ended, as its producer stated it — never inferred from output. */
757
+ export declare const COMPUTER_COMMAND_OUTCOMES: readonly ["succeeded", "failed"];
758
+ export type ComputerCommandOutcome = (typeof COMPUTER_COMMAND_OUTCOMES)[number];
759
+ /**
760
+ * The `signal` of a command that ended without a process exit status, beyond
761
+ * `timeout`, `error`, `cancelled` and signal names (task 5-04b, OSK-13614):
762
+ * `not_started` — the run was refused before it began, and `refusal` says
763
+ * why; `unknown` — the shell it ran in ended first, so its own exit status
764
+ * cannot be known.
765
+ */
766
+ export declare const COMPUTER_COMMAND_NOT_STARTED_SIGNAL = "not_started";
767
+ export declare const COMPUTER_COMMAND_UNKNOWN_END_SIGNAL = "unknown";
768
+ /**
769
+ * Why a run in an agent's shell never started (`refusal` beside
770
+ * `signal: 'not_started'`): the shell was busy with another run, had ended,
771
+ * was still opening, a person held the terminal, the command could not be
772
+ * handed to the shell, or the request was incomplete. A client shows an
773
+ * unknown value as "did not start" without a reason.
774
+ */
775
+ export declare const COMPUTER_COMMAND_START_REFUSALS: readonly ["session_busy", "session_closed", "session_not_ready", "human_control", "start_failed", "invalid_request"];
776
+ export type ComputerCommandStartRefusal = (typeof COMPUTER_COMMAND_START_REFUSALS)[number];
777
+ export declare const COMPUTER_COMMAND_OUTPUT_STREAMS: readonly ["stdout", "stderr"];
778
+ export type ComputerCommandOutputStream = (typeof COMPUTER_COMMAND_OUTPUT_STREAMS)[number];
779
+ /**
780
+ * The `detail` of each activity kind, exactly as the daemon's stream composes
781
+ * it (`daemon/src/computer/activity-stream.ts` `compose()`). This is the one
782
+ * declaration of those shapes: data-provider's zod schema is checked against
783
+ * it at compile time, and the daemon's replay test pushes every producer's
784
+ * real events through that schema and fails on a rejected or a stripped field.
785
+ *
786
+ * Every text field has been redacted at the source; `redacted` says a secret
787
+ * pattern matched in at least one of them.
788
+ */
789
+ export interface ComputerCommandActivityDetail {
790
+ phase: ComputerCommandPhase;
791
+ /**
792
+ * Correlates the started / output / exited events of one call: the tool use
793
+ * id, or a harness's call id. Absent only when the producer had none (a
794
+ * harness call announced without an id), and such a call cannot be grouped.
795
+ */
796
+ runId?: string;
797
+ /** The command line as run (or the tool's one whitelisted line: a path, a pattern). Redacted. */
798
+ commandLine?: string;
799
+ cwd?: string;
800
+ /** `exited` only. `null`: the call ended without a process exit status (timeout, error). */
801
+ exitCode?: number | null;
802
+ /**
803
+ * `exited` only: `timeout`, `error`, `cancelled`, `not_started`, `unknown`
804
+ * (`COMPUTER_COMMAND_NOT_STARTED_SIGNAL`, `COMPUTER_COMMAND_UNKNOWN_END_SIGNAL`),
805
+ * or a signal name.
806
+ */
807
+ signal?: string;
808
+ /**
809
+ * `exited` with `signal: 'not_started'`: why the run never began, one of
810
+ * `COMPUTER_COMMAND_START_REFUSALS` (a string, so a newer reason does not
811
+ * break an older reader).
812
+ */
813
+ refusal?: string;
814
+ /**
815
+ * A run in an agent's shell: the terminal lane cursor where it began — the
816
+ * byte the shell's echo of the command starts at. Announced by
817
+ * `computer_terminal_command_offset_v1`.
818
+ */
819
+ streamOffset?: number;
820
+ /** `output` only, as produced — the one field that is not redacted. */
821
+ output?: string;
822
+ /** `output` only: this event's output was cut at `COMPUTER_ACTIVITY_OUTPUT_MAX_LENGTH`. */
823
+ outputTruncated?: true;
824
+ /**
825
+ * `output` only: this viewer may not read the machine's files (the watch
826
+ * tier), so the output was not sent to them (PM-10, OSK-13701). Set by the
827
+ * relay's per-viewer projection, never by the daemon.
828
+ */
829
+ outputWithheld?: true;
830
+ stream?: ComputerCommandOutputStream;
831
+ /** `output` only: bytes the live view did not stream before this event. */
832
+ droppedBytes?: number;
833
+ /** `output` only: the per-call streaming cap was reached; nothing further streams. */
834
+ streamTruncated?: true;
835
+ /** The agent tool behind the call (`Bash`, `Grep`); absent for a terminal's own commands. */
836
+ tool?: string;
837
+ outcome?: ComputerCommandOutcome;
838
+ durationMs?: number;
839
+ /**
840
+ * An agent session acted on a person's surface shared with it (§5.4): the
841
+ * audit record keeps it. Typed text is never carried on such an event.
842
+ */
843
+ shared?: true;
844
+ redacted?: true;
845
+ }
846
+ export interface ComputerActivityBox {
847
+ x: number;
848
+ y: number;
849
+ width: number;
850
+ height: number;
851
+ }
852
+ export interface ComputerBrowserActionActivityDetail {
853
+ /** `navigate`, `click`, `type`, … */
854
+ action: string;
855
+ url?: string;
856
+ tabId?: string;
857
+ /** The element acted on (role + name), from the daemon's snapshot. Never typed text. */
858
+ target?: string;
859
+ /** A short label for the target, never typed text. */
860
+ label?: string;
861
+ /** The target's box, for the cursor and ripple overlay. */
862
+ box?: ComputerActivityBox;
863
+ /** A two-target action's second box (a drag's destination). */
864
+ toBox?: ComputerActivityBox;
865
+ /** A named key, mouse button or mode token — never a typed character. */
866
+ key?: string;
867
+ count?: number;
868
+ /** `type`: how many characters, never which. */
869
+ textLength?: number;
870
+ /** An agent session acted on a person's window shared with it (§5.4). */
871
+ shared?: true;
872
+ redacted?: true;
873
+ }
874
+ export interface ComputerFileChangeActivityDetail {
875
+ change: ComputerFileChange;
876
+ /** Where the file is now (a move's destination). */
877
+ path: string;
878
+ /** A move's previous path. */
879
+ fromPath?: string;
880
+ bytes?: number;
881
+ redacted?: true;
882
+ }
883
+ export interface ComputerControlActivityDetail {
884
+ change: ComputerControlActivityChange;
885
+ epoch?: number;
886
+ /** The holder before (for a request: the holding person). */
887
+ from?: ComputerWireActor;
888
+ /** The holder after (for a request: the requester). */
889
+ to?: ComputerWireActor;
890
+ /** A handback note, or what caused a reveal. */
891
+ note?: string;
892
+ redacted?: true;
893
+ }
894
+ export interface ComputerLifecycleActivityDetail {
895
+ event: ComputerLifecycleEvent;
896
+ surfaceKind?: string;
897
+ title?: string;
898
+ endedReason?: ComputerSurfaceEndReason;
899
+ /** `power`: the machine's power phase now. */
900
+ phase?: string;
901
+ /** `surface_shared`: the share mode. */
902
+ mode?: string;
903
+ /** `surface_shared` / `surface_unshared`: the agent session. */
904
+ agent?: ComputerWireActor;
905
+ /** `surface_orphaned`: the person who opened it and lost access. */
906
+ opener?: ComputerWireActor;
907
+ /** `reclaim_imminent`: epoch ms the daemon hands the surface back unless the person acts. */
908
+ deadline?: number;
909
+ redacted?: true;
910
+ }
911
+ export interface ComputerActivityDetailByKind {
912
+ command: ComputerCommandActivityDetail;
913
+ browser_action: ComputerBrowserActionActivityDetail;
914
+ file_change: ComputerFileChangeActivityDetail;
915
+ control: ComputerControlActivityDetail;
916
+ lifecycle: ComputerLifecycleActivityDetail;
917
+ }
918
+ /**
919
+ * What `daemon:computer:services` (and the agent's `computer.services` call)
920
+ * asks of the machine: add or replace one service by name, remove one, or
921
+ * answer the list. Declaring and withdrawing need `open`; listing needs
922
+ * `observe`.
923
+ */
924
+ export declare const COMPUTER_DECLARED_SERVICE_ACTIONS: readonly ["declare", "withdraw", "list"];
925
+ export type ComputerDeclaredServiceAction = (typeof COMPUTER_DECLARED_SERVICE_ACTIONS)[number];
926
+ /**
927
+ * The tool an agent session's declaration rides to its own daemon: the same
928
+ * `daemon:tool:request` channel that carries its other calls, answered by the
929
+ * same gate as `daemon:computer:services`. The input is the API's (action,
930
+ * principal, agent, service or name); the session is the request's own.
931
+ */
932
+ export declare const COMPUTER_SERVICES_TOOL_NAME = "computer.services";
933
+ /** A refused `computer.services` call: this prefix, then the refusal as JSON. */
934
+ export declare const COMPUTER_SERVICES_TOOL_ERROR_PREFIX = "computer_services_refused:";
935
+ /** The operation each action needs, by the one access vocabulary. */
936
+ export declare function computerDeclaredServiceOperation(action: ComputerDeclaredServiceAction): Extract<ComputerOperation, 'open' | 'observe'>;
937
+ export declare const COMPUTER_DECLARED_SERVICE_PROTOCOLS: readonly ["http", "https"];
938
+ export type ComputerDeclaredServiceProtocol = (typeof COMPUTER_DECLARED_SERVICE_PROTOCOLS)[number];
939
+ /** Services one machine holds at once; one more is `service_limit`. */
940
+ export declare const COMPUTER_DECLARED_SERVICES_MAX = 16;
941
+ export declare const COMPUTER_DECLARED_SERVICE_NAME_MAX_LENGTH = 48;
942
+ export declare const COMPUTER_DECLARED_SERVICE_PATH_MAX_LENGTH = 512;
943
+ /**
944
+ * The one host a declared service names. A declaration carries a port and a
945
+ * path, never a host or a URL: the target is always this machine's own
946
+ * loopback, by construction, and a request that names anything else is
947
+ * refused as malformed rather than narrowed.
948
+ */
949
+ export declare const COMPUTER_DECLARED_SERVICE_HOST = "localhost";
950
+ /** A service's name: its key on the machine, lower case, shown as written. */
951
+ export declare const COMPUTER_DECLARED_SERVICE_NAME_PATTERN: RegExp;
952
+ /** A service as it is declared: what it is called and where it listens. */
953
+ export interface ComputerDeclaredServiceSpec {
954
+ name: string;
955
+ /** A TCP port on the machine's loopback, 1 to 65535. */
956
+ port: number;
957
+ /** Absolute; `/` when the declaration named none. */
958
+ path: string;
959
+ protocol: ComputerDeclaredServiceProtocol;
960
+ }
961
+ /** A declared service as the manifest carries it. */
962
+ export interface ComputerDeclaredService extends ComputerDeclaredServiceSpec {
963
+ /** Who declared it: an agent session or a person. */
964
+ declaredBy: ComputerWireActor;
965
+ /** Epoch ms of the declaration (or of the latest one that replaced it). */
966
+ declaredAt: number;
967
+ }
968
+ /** Which part of a declaration was refused. */
969
+ export declare const COMPUTER_DECLARED_SERVICE_PROBLEMS: readonly ["shape", "name", "port", "path", "protocol"];
970
+ export type ComputerDeclaredServiceProblem = (typeof COMPUTER_DECLARED_SERVICE_PROBLEMS)[number];
971
+ /**
972
+ * A declaration, checked and filled in, or the part of it that was refused.
973
+ * The daemon, the API, the client and the CLI all read a declaration through
974
+ * this one rule, so a service none of them would accept never reaches the
975
+ * manifest.
976
+ */
977
+ export declare function computerDeclaredServiceSpec(raw: unknown): {
978
+ ok: true;
979
+ spec: ComputerDeclaredServiceSpec;
980
+ } | {
981
+ ok: false;
982
+ problem: ComputerDeclaredServiceProblem;
983
+ };
984
+ /**
985
+ * The address a declared service opens at in the computer's browser: always
986
+ * this machine's loopback. Throws on a spec the rule above would refuse, so a
987
+ * caller can never be handed an address off the machine.
988
+ */
989
+ export declare function computerDeclaredServiceUrl(service: Pick<ComputerDeclaredServiceSpec, 'port'> & Partial<Pick<ComputerDeclaredServiceSpec, 'path' | 'protocol'>>): string;
990
+ export declare const COMPUTER_MACHINE_KINDS: readonly ["dedicated", "personal"];
991
+ export type ComputerMachineKind = (typeof COMPUTER_MACHINE_KINDS)[number];
992
+ /**
993
+ * One picture per machine state; none of them is a spinner without a bound,
994
+ * and none collapses two states into the reassuring one.
995
+ */
996
+ export declare const COMPUTER_POWER_PHASES: readonly ["on", "booting", "stopping", "off", "archived", "removing", "gone", "blind", "unresponsive", "not_a_computer", "needs_update", "online", "offline", "needs_sign_in", "not_allowed"];
997
+ export type ComputerPowerPhase = (typeof COMPUTER_POWER_PHASES)[number];
998
+ /**
999
+ * Phases a personal machine can be in. `blind` is shared with a Dedicated
1000
+ * Runtime: the machine's presence could not be READ, which is not the same
1001
+ * fact as "offline" and must not be shown as it (§10, §18; 10-09).
1002
+ */
1003
+ export declare const COMPUTER_PERSONAL_POWER_PHASES: readonly ["online", "offline", "needs_sign_in", "not_allowed", "needs_update", "blind"];
1004
+ /**
1005
+ * Why a personal machine needs signing in again — `power.reason` on
1006
+ * `needs_sign_in`. `needs_reauth`: the daemon's credential stopped refreshing
1007
+ * (it latches the Harness mark and waits). `revoked`: the machine's sign-in was
1008
+ * revoked from the account, so it is no longer this person's machine until it
1009
+ * is signed in again. Same next action, different fact, different picture.
1010
+ */
1011
+ export declare const COMPUTER_PERSONAL_SIGN_IN_REASONS: readonly ["needs_reauth", "revoked"];
1012
+ export type ComputerPersonalSignInReason = (typeof COMPUTER_PERSONAL_SIGN_IN_REASONS)[number];
1013
+ /** Why a stopped machine would also refuse a start, so the screen does not offer one (§10). */
1014
+ export declare const COMPUTER_START_REFUSALS: readonly ["spend_cap", "entitlement"];
1015
+ export type ComputerStartRefusal = (typeof COMPUTER_START_REFUSALS)[number];
1016
+ /**
1017
+ * The picture for each Dedicated Runtime lease state. Its keys are the lease
1018
+ * states; `@skrr-ai/data-provider` asserts at compile time that they are
1019
+ * exactly `MachineLeaseStateName`, so a new lease state fails to compile there
1020
+ * until it is given a picture here — never a default.
1021
+ */
1022
+ export declare const COMPUTER_LEASE_STATE_POWER_PHASE: Readonly<{
1023
+ readonly ready: "on";
1024
+ readonly active: "on";
1025
+ readonly idle: "on";
1026
+ readonly requested: "booting";
1027
+ readonly provisioning: "booting";
1028
+ readonly bootstrapping: "booting";
1029
+ readonly starting: "booting";
1030
+ readonly restarting: "booting";
1031
+ readonly recovering: "booting";
1032
+ readonly stopping: "stopping";
1033
+ readonly snapshotting: "stopping";
1034
+ readonly stopped: "off";
1035
+ readonly archived: "archived";
1036
+ readonly terminating: "removing";
1037
+ readonly failed: "gone";
1038
+ readonly lost: "gone";
1039
+ readonly terminated: "gone";
1040
+ readonly pausing: "not_a_computer";
1041
+ readonly paused: "not_a_computer";
1042
+ readonly resuming: "not_a_computer";
1043
+ }>;
1044
+ export type ComputerLeaseStateName = keyof typeof COMPUTER_LEASE_STATE_POWER_PHASE;
1045
+ /** The phase a Dedicated Runtime lease state shows as, or `null` for a state this build does not know. */
1046
+ export declare function computerPowerPhaseForLeaseState(state: unknown): ComputerPowerPhase | null;
1047
+ /** Whether the phase shows the desktop. */
1048
+ export declare function computerShowsDesktop(phase: ComputerPowerPhase): boolean;
1049
+ /** Power actions are offered for a Dedicated Runtime only; a personal machine has none (§18). */
1050
+ export declare function computerOffersPowerActions(machineKind: ComputerMachineKind): boolean;