@intentic/machine 1.308.0 → 1.309.0
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/README.md +52 -2
- package/dist/device/connection.d.ts +2 -1
- package/dist/device/connection.d.ts.map +1 -1
- package/dist/device/connection.js +13 -2
- package/dist/device/connection.js.map +1 -1
- package/dist/device/indicator.d.ts +28 -0
- package/dist/device/indicator.d.ts.map +1 -0
- package/dist/device/indicator.js +115 -0
- package/dist/device/indicator.js.map +1 -0
- package/dist/device/mcp.d.ts.map +1 -1
- package/dist/device/mcp.js +62 -8
- package/dist/device/mcp.js.map +1 -1
- package/dist/device/policy.d.ts +4 -1
- package/dist/device/policy.d.ts.map +1 -1
- package/dist/device/policy.js +23 -5
- package/dist/device/policy.js.map +1 -1
- package/dist/device/router.d.ts +2 -0
- package/dist/device/router.d.ts.map +1 -1
- package/dist/device/router.js +4 -3
- package/dist/device/router.js.map +1 -1
- package/dist/device/tools/apps.d.ts +3 -2
- package/dist/device/tools/apps.d.ts.map +1 -1
- package/dist/device/tools/apps.js +5 -2
- package/dist/device/tools/apps.js.map +1 -1
- package/dist/device/tools/device.d.ts +2 -1
- package/dist/device/tools/device.d.ts.map +1 -1
- package/dist/device/tools/device.js +30 -37
- package/dist/device/tools/device.js.map +1 -1
- package/dist/device/tools/files.d.ts +14 -2
- package/dist/device/tools/files.d.ts.map +1 -1
- package/dist/device/tools/files.js +164 -16
- package/dist/device/tools/files.js.map +1 -1
- package/dist/device/tools/sandboxes.d.ts +7 -4
- package/dist/device/tools/sandboxes.d.ts.map +1 -1
- package/dist/device/tools/sandboxes.js +22 -10
- package/dist/device/tools/sandboxes.js.map +1 -1
- package/dist/device/tools/shell.d.ts +7 -2
- package/dist/device/tools/shell.d.ts.map +1 -1
- package/dist/device/tools/shell.js +99 -39
- package/dist/device/tools/shell.js.map +1 -1
- package/dist/status.d.ts +1 -0
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +13 -2
- package/dist/status.js.map +1 -1
- package/package.json +8 -8
package/README.md
CHANGED
|
@@ -17,9 +17,29 @@ The **device half** (`src/device/`, the machine side of the `host` capability):
|
|
|
17
17
|
machine *serves* `deviceContract`, so no port ever opens here. Where it dials is the shared resolver's answer
|
|
18
18
|
(below), re-asked on every reconnect, so a sandbox on this very machine stays connected with its tunnel down.
|
|
19
19
|
- Expose the tool surface (`run_command`, files, screenshot, `describe`; deliberately no delete — trash is
|
|
20
|
-
recoverable) as MCP carried verbatim, so a machine can learn a tool without a daemon release.
|
|
20
|
+
recoverable) as MCP carried verbatim, so a machine can learn a tool without a daemon release. Each tool says what
|
|
21
|
+
a call can do — only read, change something that can be put back, or lose something — as MCP annotations, so a
|
|
22
|
+
runtime may run the reads side by side.
|
|
21
23
|
- Enforce the owner's scopes **here**, never in the sandbox, and append every call to an audit log that
|
|
22
24
|
survives uninstall.
|
|
25
|
+
- **Show the person at the machine when an agent is driving it, and let them pause it** (see **What the person at
|
|
26
|
+
the machine sees**).
|
|
27
|
+
- Judge every path **where it really leads** ([src/device/policy.ts](src/device/policy.ts)): links and junctions
|
|
28
|
+
are resolved, on the path and on the roots, before the check, and the tool then acts on the resolved path, so a
|
|
29
|
+
link inside an allowed folder cannot carry a read or a write out of it. A new file is judged by the folder it would
|
|
30
|
+
land in. `trash_file` alone judges a link where it sits, because it moves the link and not what it points at.
|
|
31
|
+
- **Change a file only as it was read** ([src/device/tools/files.ts](src/device/tools/files.ts)). `read_file`
|
|
32
|
+
answers with the file's revision (a hash of its bytes) and takes a line range, saying where to continue;
|
|
33
|
+
replacing a file with `write_file`, or one exact piece of it with `edit_file`, needs that revision and is refused
|
|
34
|
+
when the file has changed since. A file keeps its encoding (UTF-8, UTF-8 with a BOM, and UTF-16LE with a BOM,
|
|
35
|
+
which is what Windows PowerShell 5.1 writes) and its line endings, and is replaced by a rename, never rewritten
|
|
36
|
+
in place. Binary files are refused; text in a legacy code page is shown but never written back.
|
|
37
|
+
- **A command ends whole** ([src/device/tools/shell.ts](src/device/tools/shell.ts)). `run_command` starts its
|
|
38
|
+
shell in a process group of its own: at the deadline the group gets SIGTERM and, two seconds later, SIGKILL
|
|
39
|
+
(Windows has no groups, so `taskkill /T /F` ends the process tree), so nothing it started outlives it. The call
|
|
40
|
+
returns when the command exits, not when the last process it left in the background lets go of its output: one
|
|
41
|
+
second's grace, then the pipes are closed and the answer says something is still running. Each stream keeps its
|
|
42
|
+
first and last 50,000 characters and counts what fell between.
|
|
23
43
|
- Manage this machine's sandboxes for a browser button or a model, under the `sandboxes` switch: list them
|
|
24
44
|
with their **share of the machine** (one `docker inspect` per listing: memory and CPU caps, privileged, GPU,
|
|
25
45
|
and who asked for each directive, the approved environment or the owner), start/stop/restart, run the `ic`
|
|
@@ -101,6 +121,36 @@ tab, with every button there gone, while this same process was polling it over l
|
|
|
101
121
|
a pairing sitting on the public URL each minute, so a container started later is promoted with no restart; the
|
|
102
122
|
socket re-resolves on every reconnect.
|
|
103
123
|
|
|
124
|
+
## What the person at the machine sees
|
|
125
|
+
|
|
126
|
+
While an agent is driving this computer's mouse and keyboard, a small notice sits at the top of the display the
|
|
127
|
+
pointer was on ([src/device/indicator.ts](src/device/indicator.ts); the window is `@intentic/desktop-automation`'s
|
|
128
|
+
`notice`):
|
|
129
|
+
|
|
130
|
+
> Intentic agent is controlling this computer · sandbox-host.example.dev · Ctrl+Alt+Shift+P pauses
|
|
131
|
+
|
|
132
|
+
- **What counts as driving** is the `device` tool's pointer and keyboard actions. A screenshot or a `wait` moves
|
|
133
|
+
nothing and shows nothing.
|
|
134
|
+
- **It never gets in the agent's way.** It never takes focus, so typing still lands in the focused window; every
|
|
135
|
+
click goes through it to what is underneath; and it is left out of screen captures, so no screenshot the model
|
|
136
|
+
reads has it in it.
|
|
137
|
+
- **It goes** 30 seconds after the last action, at once when the link that drove it disconnects, and with the agent
|
|
138
|
+
when it exits. The hidden `powershell.exe` behind it is started by the first action and ended with the notice. It
|
|
139
|
+
fails toward hidden: a helper that dies is not restarted until the links go quiet, one that will not quit is
|
|
140
|
+
killed, and a notice that cannot be shown costs the notice, never the action.
|
|
141
|
+
- **Ctrl+Alt+Shift+P pauses**, pressed while the notice is on screen. From then on every sandbox's mouse and keyboard
|
|
142
|
+
actions here are refused with `Refused: paused by the person at this computer: …`, and the notice reads
|
|
143
|
+
`Intentic agent paused · … · Ctrl+Alt+Shift+P resumes`. The same keys lift it, again while a notice is up: an agent
|
|
144
|
+
that tries while paused puts one up, which is also how the person learns an agent is waiting on them. Every press
|
|
145
|
+
and every refusal is in the audit log.
|
|
146
|
+
- **A pause survives a restart.** It is a file (`~/.intentic/machine/paused`), because a sandbox can ask for this
|
|
147
|
+
agent to restart. `status` prints it, `status --json` carries it as `device.pausedAt`, and the summary the tray
|
|
148
|
+
shows ends in `mouse and keyboard paused`.
|
|
149
|
+
- **It is not a lock** against an agent that may also run commands here: the capability card's switches are the
|
|
150
|
+
owner's lever for that. When another program already holds Ctrl+Alt+Shift+P, the notice leaves the keys off and
|
|
151
|
+
the agent's log says so.
|
|
152
|
+
- **Windows only.** Elsewhere nothing is shown and nothing can be paused.
|
|
153
|
+
|
|
104
154
|
## The resident agent
|
|
105
155
|
|
|
106
156
|
`intentic-machine run --foreground` (what systemd, launchd, the Windows logon task and, for a distro, its Windows side
|
|
@@ -213,7 +263,7 @@ said so in a log nobody had been pointed at.
|
|
|
213
263
|
- [src/status.ts](src/status.ts) — both halves as one answer; `--json` is what the desktop app and tray read.
|
|
214
264
|
- [src/device/router.ts](src/device/router.ts) — the `deviceContract` this machine serves, including `report`, the reading the sandbox's Devices tab is built from.
|
|
215
265
|
- [src/wsl.ts](src/wsl.ts) — whether this is a WSL distro, and which one. WSL hands a distro the Windows machine's own hostname, so without this the sandbox cannot tell a distro from the Windows install hosting it, or one distro from its neighbour; reported at connect (`describe`) as well as in the status report, so it is known even with "Run commands" off.
|
|
216
|
-
- [src/device/tools/shell.ts](src/device/tools/shell.ts) — `run_command`, and its `in:` crossing: `wsl:<distro>` from Windows runs `wsl.exe --exec sh -lc` with the script as one argument, `windows` from a distro runs PowerShell through interop; no quoting through the first shell either way.
|
|
266
|
+
- [src/device/tools/shell.ts](src/device/tools/shell.ts) — `run_command`, its process group and bounded output, and its `in:` crossing: `wsl:<distro>` from Windows runs `wsl.exe --exec sh -lc` with the script as one argument, `windows` from a distro runs PowerShell through interop; no quoting through the first shell either way.
|
|
217
267
|
- [src/device/policy.ts](src/device/policy.ts) — what the sandbox is permitted to do here; the security surface.
|
|
218
268
|
- [src/device/tools/sandboxes.ts](src/device/tools/sandboxes.ts) — the fleet: the `docker ps`/`inspect` readers, the docker verbs, and the `ic` flows (swap, reshape, remove, runners) with the pure argv builders beside them.
|
|
219
269
|
- [src/sync/mirror.ts](src/sync/mirror.ts) — the sync tick: ports reconcile, git bridge, revocation handling.
|
|
@@ -2,11 +2,12 @@ import type { Log } from "@intentic/local-agent";
|
|
|
2
2
|
import { type PeerLink } from "@intentic/sandbox-contract/peer-dial";
|
|
3
3
|
import { type DaemonBase } from "../daemon-base.js";
|
|
4
4
|
import { type HostLink } from "./config.js";
|
|
5
|
+
import { type Indicator } from "./indicator.js";
|
|
5
6
|
export interface Dial {
|
|
6
7
|
readonly resolveBase: (sandboxUrl: string) => Promise<DaemonBase>;
|
|
7
8
|
readonly socket: (url: string) => WebSocket;
|
|
8
9
|
}
|
|
9
10
|
declare const forgetLink: (sandboxUrl: string) => Promise<void>;
|
|
10
|
-
export declare const connect: (config: HostLink, version: string, log: Log, dial?: Dial, forget?: typeof forgetLink) => PeerLink;
|
|
11
|
+
export declare const connect: (config: HostLink, version: string, log: Log, dial?: Dial, forget?: typeof forgetLink, indicator?: Indicator) => PeerLink;
|
|
11
12
|
export {};
|
|
12
13
|
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/device/connection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAkD,KAAK,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAErH,OAAO,EAAE,KAAK,UAAU,EAAqB,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,KAAK,QAAQ,EAA+B,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/device/connection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAkD,KAAK,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAErH,OAAO,EAAE,KAAK,UAAU,EAAqB,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,KAAK,QAAQ,EAA+B,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,gBAAgB,CAAC;AASlE,MAAM,WAAW,IAAI;IACjB,QAAQ,CAAC,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAClE,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC;CAC/C;AAKD,QAAA,MAAM,UAAU,eAAsB,MAAM,KAAG,OAAO,CAAC,IAAI,CAAyC,CAAC;AAErG,eAAO,MAAM,OAAO,WACR,QAAQ,WACP,MAAM,OACV,GAAG,SACF,IAAI,0CAEC,SAAS,KACrB,QA0DF,CAAC"}
|
|
@@ -4,13 +4,16 @@ import { dialPeer, PEER_LINK_BACKOFF, peerLinkSilenceMs } from "@intentic/sandbo
|
|
|
4
4
|
import { RPCHandler } from "@orpc/server/websocket";
|
|
5
5
|
import { resolveDaemonBase } from "../daemon-base.js";
|
|
6
6
|
import { rememberScopes, removeLinks } from "./config.js";
|
|
7
|
+
import { machineIndicator } from "./indicator.js";
|
|
7
8
|
import { createHostRouter } from "./router.js";
|
|
8
9
|
const realDial = { resolveBase: resolveDaemonBase, socket: (url) => new WebSocket(url) };
|
|
9
10
|
const forgetLink = async (sandboxUrl) => void (await removeLinks(sandboxUrl));
|
|
10
|
-
export const connect = (config, version, log, dial = realDial, forget = forgetLink) => {
|
|
11
|
+
export const connect = (config, version, log, dial = realDial, forget = forgetLink, indicator = machineIndicator()) => {
|
|
11
12
|
const linkLog = (message) => log(`${config.sandboxUrl}: ${message}`);
|
|
12
13
|
let scopes = config.scopes;
|
|
14
|
+
let held;
|
|
13
15
|
const handler = new RPCHandler(createHostRouter({
|
|
16
|
+
sandboxUrl: config.sandboxUrl,
|
|
14
17
|
scopes: () => scopes,
|
|
15
18
|
setScopes: (next) => {
|
|
16
19
|
scopes = next;
|
|
@@ -30,7 +33,15 @@ export const connect = (config, version, log, dial = realDial, forget = forgetLi
|
|
|
30
33
|
};
|
|
31
34
|
},
|
|
32
35
|
hello: () => ({ type: "hello", token: config.token, version }),
|
|
33
|
-
attach: (ws) =>
|
|
36
|
+
attach: (ws) => {
|
|
37
|
+
held = ws;
|
|
38
|
+
ws.addEventListener("close", () => {
|
|
39
|
+
if (held === ws) {
|
|
40
|
+
indicator.release(config.sandboxUrl);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
handler.upgrade(ws);
|
|
44
|
+
},
|
|
34
45
|
backoff: createBackoff(PEER_LINK_BACKOFF),
|
|
35
46
|
silenceMs: peerLinkSilenceMs(HOST_HEARTBEAT_MS),
|
|
36
47
|
log: linkLog,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/device/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAqB,MAAM,4BAA4B,CAAC;AAClG,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,iBAAiB,EAAiB,MAAM,sCAAsC,CAAC;AACrH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAmB,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAiB,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAa/C,MAAM,QAAQ,GAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AAG/F,MAAM,UAAU,GAAG,KAAK,EAAE,UAAkB,EAAiB,EAAE,CAAC,KAAK,CAAC,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;AAErG,MAAM,CAAC,MAAM,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/device/connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { type Notice, type NoticeEvents } from "@intentic/desktop-automation";
|
|
3
|
+
import type { Log } from "@intentic/local-agent";
|
|
4
|
+
export declare const PAUSE_HOTKEY = "Ctrl+Alt+Shift+P";
|
|
5
|
+
export declare const IDLE_MS = 30000;
|
|
6
|
+
export declare const readPausedAt: () => Promise<Date | undefined>;
|
|
7
|
+
export interface Caller {
|
|
8
|
+
readonly sandboxUrl: string;
|
|
9
|
+
readonly log: Log;
|
|
10
|
+
}
|
|
11
|
+
export declare const calling: AsyncLocalStorage<Caller>;
|
|
12
|
+
export interface IndicatorDeps {
|
|
13
|
+
readonly open: (events: NoticeEvents) => Notice | undefined;
|
|
14
|
+
readonly paused: () => Promise<boolean>;
|
|
15
|
+
readonly setPaused: (paused: boolean) => Promise<void>;
|
|
16
|
+
readonly audit: (entry: {
|
|
17
|
+
tool: string;
|
|
18
|
+
ok: boolean;
|
|
19
|
+
detail: string;
|
|
20
|
+
}) => Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
export interface Indicator {
|
|
23
|
+
readonly control: (caller: Caller | undefined) => Promise<void>;
|
|
24
|
+
readonly release: (sandboxUrl: string) => void;
|
|
25
|
+
}
|
|
26
|
+
export declare const createIndicator: (deps: IndicatorDeps) => Indicator;
|
|
27
|
+
export declare const machineIndicator: () => Indicator;
|
|
28
|
+
//# sourceMappingURL=indicator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indicator.d.ts","sourceRoot":"","sources":["../../src/device/indicator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAIrD,OAAO,EAAU,KAAK,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACtF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAUjD,eAAO,MAAM,YAAY,qBAAqB,CAAC;AAG/C,eAAO,MAAM,OAAO,QAAS,CAAC;AAM9B,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,IAAI,GAAG,SAAS,CAA0D,CAAC;AAIzH,MAAM,WAAW,MAAM;IACnB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;CACrB;AACD,eAAO,MAAM,OAAO,2BAAkC,CAAC;AAGvD,MAAM,WAAW,aAAa;IAE1B,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,MAAM,GAAG,SAAS,CAAC;IAC5D,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3F;AAED,MAAM,WAAW,SAAS;IAEtB,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhE,QAAQ,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAOD,eAAO,MAAM,eAAe,SAAU,aAAa,KAAG,SA8FrD,CAAC;AAKF,eAAO,MAAM,gBAAgB,QAAO,SAa7B,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { mkdir, rm, stat, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { errorMessage } from "@intentic/base/errors";
|
|
5
|
+
import { notice } from "@intentic/desktop-automation";
|
|
6
|
+
import { baseDir } from "../config.js";
|
|
7
|
+
import { audit } from "./audit.js";
|
|
8
|
+
import { ScopeError } from "./policy.js";
|
|
9
|
+
export const PAUSE_HOTKEY = "Ctrl+Alt+Shift+P";
|
|
10
|
+
export const IDLE_MS = 30_000;
|
|
11
|
+
const pausePath = join(baseDir, "paused");
|
|
12
|
+
export const readPausedAt = async () => (await stat(pausePath).catch(() => undefined))?.mtime;
|
|
13
|
+
export const calling = new AsyncLocalStorage();
|
|
14
|
+
const PAUSED = `Refused: paused by the person at this computer: they pressed ${PAUSE_HOTKEY}, which stops agents from using its mouse and keyboard until they press it again. Tell the user; do not look for another way to do this on the screen.`;
|
|
15
|
+
const hostOf = (sandboxUrl) => URL.parse(sandboxUrl)?.host ?? sandboxUrl;
|
|
16
|
+
export const createIndicator = (deps) => {
|
|
17
|
+
const driving = new Map();
|
|
18
|
+
let shown;
|
|
19
|
+
let paused;
|
|
20
|
+
let broken = false;
|
|
21
|
+
let hotkey = true;
|
|
22
|
+
let saved = Promise.resolve();
|
|
23
|
+
const latest = () => [...driving.values()].at(-1)?.caller;
|
|
24
|
+
const log = (message) => latest()?.log(message);
|
|
25
|
+
const text = () => {
|
|
26
|
+
const caller = latest();
|
|
27
|
+
const who = caller === undefined ? "" : ` · ${hostOf(caller.sandboxUrl)}`;
|
|
28
|
+
const keys = hotkey ? ` · ${PAUSE_HOTKEY} ${paused === true ? "resumes" : "pauses"}` : "";
|
|
29
|
+
return `${paused === true ? "Intentic agent paused" : "Intentic agent is controlling this computer"}${who}${keys}`;
|
|
30
|
+
};
|
|
31
|
+
const toggle = () => {
|
|
32
|
+
const now = paused !== true;
|
|
33
|
+
paused = now;
|
|
34
|
+
saved = saved.then(async () => await deps.setPaused(now)).catch((error) => log(`could not save the pause: ${errorMessage(error)}`));
|
|
35
|
+
const detail = `${now ? "paused" : "resumed"} by the person at this computer (${PAUSE_HOTKEY})`;
|
|
36
|
+
log(detail);
|
|
37
|
+
void deps.audit({ tool: "local-pause", ok: true, detail });
|
|
38
|
+
shown?.show(text());
|
|
39
|
+
};
|
|
40
|
+
const open = () => {
|
|
41
|
+
try {
|
|
42
|
+
shown = deps.open({
|
|
43
|
+
hotkey: toggle,
|
|
44
|
+
hotkeyTaken: () => {
|
|
45
|
+
hotkey = false;
|
|
46
|
+
log(`${PAUSE_HOTKEY} is held by another program, so it cannot pause agents here until that program lets go of it.`);
|
|
47
|
+
shown?.show(text());
|
|
48
|
+
},
|
|
49
|
+
exited: (said) => {
|
|
50
|
+
shown = undefined;
|
|
51
|
+
broken = true;
|
|
52
|
+
log(`the on-screen notice stopped: ${said}`);
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
broken = true;
|
|
58
|
+
log(`the on-screen notice could not open: ${errorMessage(error)}`);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
const release = (sandboxUrl) => {
|
|
62
|
+
const entry = driving.get(sandboxUrl);
|
|
63
|
+
if (entry === undefined) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
clearTimeout(entry.timer);
|
|
67
|
+
driving.delete(sandboxUrl);
|
|
68
|
+
if (driving.size > 0) {
|
|
69
|
+
shown?.show(text());
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const closing = shown;
|
|
73
|
+
shown = undefined;
|
|
74
|
+
broken = false;
|
|
75
|
+
hotkey = true;
|
|
76
|
+
closing?.close();
|
|
77
|
+
};
|
|
78
|
+
return {
|
|
79
|
+
control: async (caller) => {
|
|
80
|
+
if (paused === undefined) {
|
|
81
|
+
const onDisk = await deps.paused();
|
|
82
|
+
paused ??= onDisk;
|
|
83
|
+
}
|
|
84
|
+
const key = caller?.sandboxUrl ?? "";
|
|
85
|
+
clearTimeout(driving.get(key)?.timer);
|
|
86
|
+
driving.delete(key);
|
|
87
|
+
const timer = setTimeout(() => release(key), IDLE_MS);
|
|
88
|
+
timer.unref();
|
|
89
|
+
driving.set(key, { caller, timer });
|
|
90
|
+
if (shown === undefined && !broken) {
|
|
91
|
+
open();
|
|
92
|
+
}
|
|
93
|
+
shown?.show(text());
|
|
94
|
+
if (paused) {
|
|
95
|
+
throw new ScopeError(PAUSED);
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
release,
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
let machine;
|
|
102
|
+
export const machineIndicator = () => (machine ??= createIndicator({
|
|
103
|
+
open: (events) => notice(PAUSE_HOTKEY, events),
|
|
104
|
+
paused: async () => (await readPausedAt()) !== undefined,
|
|
105
|
+
setPaused: async (paused) => {
|
|
106
|
+
if (!paused) {
|
|
107
|
+
await rm(pausePath, { force: true });
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
await mkdir(baseDir, { recursive: true, mode: 0o700 });
|
|
111
|
+
await writeFile(pausePath, "", { mode: 0o600 });
|
|
112
|
+
},
|
|
113
|
+
audit,
|
|
114
|
+
}));
|
|
115
|
+
//# sourceMappingURL=indicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indicator.js","sourceRoot":"","sources":["../../src/device/indicator.ts"],"names":[],"mappings":"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"}
|
package/dist/device/mcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/device/mcp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/device/mcp.ts"],"names":[],"mappings":"AAyZA,eAAO,MAAM,gBAAgB;;;;;;;;kDAQ3B,CAAC"}
|
package/dist/device/mcp.js
CHANGED
|
@@ -7,7 +7,7 @@ import { z } from "zod";
|
|
|
7
7
|
import { audit } from "./audit.js";
|
|
8
8
|
import { assertScope, ScopeError } from "./policy.js";
|
|
9
9
|
import { describeText } from "./tools/describe.js";
|
|
10
|
-
import { listDirectory, readTextFile, trashFile, writeTextFile } from "./tools/files.js";
|
|
10
|
+
import { editTextFile, listDirectory, readTextFile, trashFile, writeTextFile } from "./tools/files.js";
|
|
11
11
|
import { focusWindow, listWindows, openTarget, readClipboard, writeClipboard } from "./tools/apps.js";
|
|
12
12
|
import { clickElement, fillElement, listTabs, openPage, pressKey, readPage, selectTab, snapshotPage } from "./tools/browser.js";
|
|
13
13
|
import { act, describeAction, settle } from "./tools/device.js";
|
|
@@ -36,12 +36,14 @@ const TOOLS = [
|
|
|
36
36
|
tool({
|
|
37
37
|
name: "describe",
|
|
38
38
|
description: "What this device is: OS and version, CPU architecture, the exact shell run_command uses, the home directory, the folders you may touch, and which permissions are on. Call this once before your first command here, it is the difference between writing for this machine and guessing.",
|
|
39
|
+
effect: "read",
|
|
39
40
|
input: NO_ARGS,
|
|
40
41
|
run: async (_args, scopes) => textResult(await describeText(scopes)),
|
|
41
42
|
}),
|
|
42
43
|
tool({
|
|
43
44
|
name: "run_command",
|
|
44
|
-
description: "Run a command on this device and get back its exit code, stdout and stderr. The shell is PowerShell on Windows and the user's login shell elsewhere (see describe). On a Windows PC with WSL, `in: \"wsl:<distro>\"` runs the command inside that distro through sh -lc instead, and inside a WSL distro `in: \"windows\"` runs it in PowerShell on the Windows side: the same PC, the other environment, with no quoting through the first shell. There is no terminal for anyone to type into: a command that prompts will fail rather than wait. Commands that DELETE (a recursive delete, a formatted disk, a removed Docker volume) need this device's \"Run destructive commands\" switch, which is off unless its owner turned it on: they are refused with a message naming the switch, so ask the owner to turn it on rather than looking for a spelling that gets past it. Prefer one script that does the whole job over many small calls, every call is a network round trip to somebody's laptop.",
|
|
45
|
+
description: "Run a command on this device and get back its exit code, stdout and stderr. The shell is PowerShell on Windows and the user's login shell elsewhere (see describe). On a Windows PC with WSL, `in: \"wsl:<distro>\"` runs the command inside that distro through sh -lc instead, and inside a WSL distro `in: \"windows\"` runs it in PowerShell on the Windows side: the same PC, the other environment, with no quoting through the first shell. There is no terminal for anyone to type into: a command that prompts will fail rather than wait. At the deadline the command is stopped together with everything it started. The call returns once the command itself exits: a process it leaves running in the background keeps running, but nothing it prints after that is collected, so start one with its output redirected to a file (`> out.log 2>&1`). Very long output comes back as its start and its end, with the middle cut and counted. Commands that DELETE (a recursive delete, a formatted disk, a removed Docker volume) need this device's \"Run destructive commands\" switch, which is off unless its owner turned it on: they are refused with a message naming the switch, so ask the owner to turn it on rather than looking for a spelling that gets past it. Prefer one script that does the whole job over many small calls, every call is a network round trip to somebody's laptop.",
|
|
46
|
+
effect: "destructive",
|
|
45
47
|
input: z.object({
|
|
46
48
|
command: required.describe("The command line to run, in the shell of the environment it runs in."),
|
|
47
49
|
cwd: required
|
|
@@ -64,49 +66,86 @@ const TOOLS = [
|
|
|
64
66
|
}),
|
|
65
67
|
tool({
|
|
66
68
|
name: "read_file",
|
|
67
|
-
description: "Read a text file on this device
|
|
68
|
-
|
|
69
|
-
|
|
69
|
+
description: "Read a text file on this device, within the folders this machine allows. Answers with the text, then a note giving the file's revision, which write_file and edit_file need to change it, and, when you read part of it, how much remains and the offset to continue from. Without offset and limit it is the whole file; one too long for a single answer is refused with its line count, to be read in parts. Line endings come back as LF whatever the file uses. Binary files are refused.",
|
|
70
|
+
effect: "read",
|
|
71
|
+
input: z.object({
|
|
72
|
+
path: required,
|
|
73
|
+
offset: z.int().positive().optional().describe("The line to start from, counting from 1. Default 1."),
|
|
74
|
+
limit: z.int().positive().optional().describe("How many lines to read from there. Default: to the end of the file."),
|
|
75
|
+
}),
|
|
76
|
+
run: async ({ path, offset, limit }, scopes) => {
|
|
77
|
+
const read = await readTextFile(path, { offset, limit }, scopes);
|
|
78
|
+
return {
|
|
79
|
+
content: [
|
|
80
|
+
{ type: "text", text: read.text },
|
|
81
|
+
{ type: "text", text: read.note },
|
|
82
|
+
],
|
|
83
|
+
isError: false,
|
|
84
|
+
};
|
|
85
|
+
},
|
|
70
86
|
}),
|
|
71
87
|
tool({
|
|
72
88
|
name: "write_file",
|
|
73
|
-
description: "Create a file or replace
|
|
74
|
-
|
|
75
|
-
|
|
89
|
+
description: "Create a file, or replace a file's whole contents. Replacing a file that exists needs the `revision` your last read_file, write_file or edit_file of it answered with, and is refused if the file has changed since; creating one needs none. A replaced file keeps its encoding (UTF-8, UTF-8 with BOM, UTF-16LE) and its line endings (CRLF or LF), whatever you send. To change part of a file, edit_file is cheaper and safer. Requires the 'Create and change files' permission, which is OFF unless the user turned it on.",
|
|
90
|
+
effect: "destructive",
|
|
91
|
+
input: z.object({
|
|
92
|
+
path: required,
|
|
93
|
+
content: z.string(),
|
|
94
|
+
revision: required.optional().describe("The file's revision from read_file. Required to replace a file that exists; omit it to create one."),
|
|
95
|
+
}),
|
|
96
|
+
run: async ({ path, content, revision }, scopes) => textResult(await writeTextFile(path, content, revision, scopes)),
|
|
97
|
+
}),
|
|
98
|
+
tool({
|
|
99
|
+
name: "edit_file",
|
|
100
|
+
description: "Replace one exact piece of a file's text with another. `old_string` has to appear in the file exactly once, whitespace and indentation included, as read_file shows it (LF line endings): include a line or two around it to make it unique. Needs the `revision` your last read_file, write_file or edit_file of the file answered with, and is refused if the file has changed since; it answers with the new revision, so a run of edits needs no re-read. The file keeps its encoding and line endings. Requires the 'Create and change files' permission, which is OFF unless the user turned it on.",
|
|
101
|
+
effect: "write",
|
|
102
|
+
input: z.object({
|
|
103
|
+
path: required,
|
|
104
|
+
old_string: required.describe("The text to replace, exactly as read_file shows it."),
|
|
105
|
+
new_string: z.string().describe("What replaces it."),
|
|
106
|
+
revision: required.describe("The file's revision from read_file, or from the write or edit that last changed it."),
|
|
107
|
+
}),
|
|
108
|
+
run: async ({ path, old_string: oldString, new_string: newString, revision }, scopes) => textResult(await editTextFile(path, { oldString, newString, revision }, scopes)),
|
|
76
109
|
}),
|
|
77
110
|
tool({
|
|
78
111
|
name: "list_dir",
|
|
79
112
|
description: "List a directory, with each entry's kind, size and modification time.",
|
|
113
|
+
effect: "read",
|
|
80
114
|
input: z.object({ path: required }),
|
|
81
115
|
run: async ({ path }, scopes) => textResult(JSON.stringify(await listDirectory(path, scopes), undefined, 2)),
|
|
82
116
|
}),
|
|
83
117
|
tool({
|
|
84
118
|
name: "trash_file",
|
|
85
119
|
description: "Move a file into this agent's trash folder, from which the user can restore it. There is deliberately no permanent-delete tool. Requires the 'Create and change files' permission.",
|
|
120
|
+
effect: "write",
|
|
86
121
|
input: z.object({ path: required }),
|
|
87
122
|
run: async ({ path }, scopes) => textResult(await trashFile(path, scopes)),
|
|
88
123
|
}),
|
|
89
124
|
tool({
|
|
90
125
|
name: "list_windows",
|
|
91
126
|
description: "Every window open on this device: its app, title, size, position, and which one has focus. Call this before any GUI work, it is how you find the application you were asked about, and how you know where your typing will land. Requires the 'See the screen' permission.",
|
|
127
|
+
effect: "read",
|
|
92
128
|
input: NO_ARGS,
|
|
93
129
|
run: async (_args, scopes) => textResult(await listWindows(desktop(), scopes)),
|
|
94
130
|
}),
|
|
95
131
|
tool({
|
|
96
132
|
name: "focus_window",
|
|
97
133
|
description: "Bring a window to the front and give it the keyboard, by the id from list_windows. ALWAYS do this before typing: text goes to whatever window has focus, not to where the pointer is. Requires the 'Use the mouse and keyboard' permission.",
|
|
134
|
+
effect: "write",
|
|
98
135
|
input: z.object({ id: required }),
|
|
99
136
|
run: async ({ id }, scopes) => textResult(await focusWindow(desktop(), id, scopes)),
|
|
100
137
|
}),
|
|
101
138
|
tool({
|
|
102
139
|
name: "open",
|
|
103
140
|
description: "Start an application, or open a URL or file with whatever this device has registered for it: the usual first step of a task ('open the browser at this page'). Use this rather than working out the platform's own incantation. Requires the 'Run commands' permission.",
|
|
141
|
+
effect: "destructive",
|
|
104
142
|
input: z.object({ target: required.describe("An application name, a file path, or a URL.") }),
|
|
105
143
|
run: async ({ target }, scopes) => textResult(await openTarget(desktop(), target, scopes)),
|
|
106
144
|
}),
|
|
107
145
|
tool({
|
|
108
146
|
name: "clipboard",
|
|
109
147
|
description: "Read or replace this device's clipboard: the reliable way to move text between applications, and often easier than reading it off a screenshot. Reading needs 'See the screen'; writing needs 'Use the mouse and keyboard'.",
|
|
148
|
+
effect: "destructive",
|
|
110
149
|
input: z
|
|
111
150
|
.object({
|
|
112
151
|
action: z.enum(["read", "write"]),
|
|
@@ -123,30 +162,35 @@ const TOOLS = [
|
|
|
123
162
|
tool({
|
|
124
163
|
name: "browser_open",
|
|
125
164
|
description: "Open a page in a browser on this device and answer with what is on it: the page's title, its URL, and every element you can click or type into, each with a reference like [e12]. THIS IS THE RIGHT WAY TO USE A WEBSITE, act on elements by reference, never by clicking pixels, because references survive scrolling, resizing and re-rendering. The browser is a separate instance with its own profile, so the user's own tabs and session are untouched; the first time it opens they may need to sign in. Requires the 'Run commands' permission.",
|
|
165
|
+
effect: "write",
|
|
126
166
|
input: z.object({ url: required.describe("The page to open. A bare host like example.com is fine.") }),
|
|
127
167
|
run: async ({ url }, scopes) => textResult(await openPage(web(), url, scopes)),
|
|
128
168
|
}),
|
|
129
169
|
tool({
|
|
130
170
|
name: "browser_snapshot",
|
|
131
171
|
description: "What the current page shows right now, with fresh [e…] references. Take one after anything that might have changed the page: references from an older snapshot are refused rather than clicking the wrong thing. Requires the 'See the screen' permission.",
|
|
172
|
+
effect: "read",
|
|
132
173
|
input: NO_ARGS,
|
|
133
174
|
run: async (_args, scopes) => textResult(await snapshotPage(web(), scopes)),
|
|
134
175
|
}),
|
|
135
176
|
tool({
|
|
136
177
|
name: "browser_read",
|
|
137
178
|
description: "The current page as readable text: what a person would get by selecting all of it. Use this to ANSWER QUESTIONS about a page; use browser_snapshot when you intend to act on it. Requires the 'See the screen' permission.",
|
|
179
|
+
effect: "read",
|
|
138
180
|
input: NO_ARGS,
|
|
139
181
|
run: async (_args, scopes) => textResult(await readPage(web(), scopes)),
|
|
140
182
|
}),
|
|
141
183
|
tool({
|
|
142
184
|
name: "browser_click",
|
|
143
185
|
description: "Click an element by its [e…] reference from the last snapshot. Answers with the page as it stands afterwards, so you see the result without asking. Requires the 'Use the mouse and keyboard' permission.",
|
|
186
|
+
effect: "destructive",
|
|
144
187
|
input: z.object({ ref: required }),
|
|
145
188
|
run: async ({ ref }, scopes) => textResult(await clickElement(web(), ref, scopes)),
|
|
146
189
|
}),
|
|
147
190
|
tool({
|
|
148
191
|
name: "browser_fill",
|
|
149
192
|
description: "Type into a field by its [e…] reference: replaces what is there, and fires the events a page's own JavaScript listens for (setting a value without them is how a filled form submits empty). Set submit to press Enter afterwards. Requires the 'Use the mouse and keyboard' permission.",
|
|
193
|
+
effect: "destructive",
|
|
150
194
|
input: z.object({
|
|
151
195
|
ref: required,
|
|
152
196
|
text: z.string(),
|
|
@@ -157,18 +201,21 @@ const TOOLS = [
|
|
|
157
201
|
tool({
|
|
158
202
|
name: "browser_key",
|
|
159
203
|
description: 'Press a key on the page as a whole: "Return", "Escape", "Tab". For typing into a field use browser_fill. Requires the \'Use the mouse and keyboard\' permission.',
|
|
204
|
+
effect: "destructive",
|
|
160
205
|
input: z.object({ key: required }),
|
|
161
206
|
run: async ({ key }, scopes) => textResult(await pressKey(web(), key, scopes)),
|
|
162
207
|
}),
|
|
163
208
|
tool({
|
|
164
209
|
name: "browser_tabs",
|
|
165
210
|
description: "Every tab open in that browser, and which one these tools are acting on. Pass an id to `select` to switch. Reading the list needs 'See the screen'; switching needs 'Use the mouse and keyboard'.",
|
|
211
|
+
effect: "write",
|
|
166
212
|
input: z.object({ select: required.optional().describe("The id of the tab to switch to. Omit to just list them.") }),
|
|
167
213
|
run: async ({ select }, scopes) => textResult(select === undefined ? await listTabs(web(), scopes) : await selectTab(web(), select, scopes)),
|
|
168
214
|
}),
|
|
169
215
|
tool({
|
|
170
216
|
name: "device",
|
|
171
217
|
description: "Use this device's mouse and keyboard: click what is on the screen, type into the focused window, press a key combination, scroll, drag. Coordinates are PIXELS IN THE LAST SCREENSHOT, take one first and read them off it. Every action answers with a fresh screenshot so you can see what happened. Requires the 'Use the mouse and keyboard' permission, which is OFF unless the user turned it on. Prefer a command over the GUI when both would work: a command is exact, and a click is a guess about where something is.",
|
|
218
|
+
effect: "destructive",
|
|
172
219
|
input: z.object({
|
|
173
220
|
action: z.enum([
|
|
174
221
|
"mouse_move",
|
|
@@ -202,24 +249,28 @@ const TOOLS = [
|
|
|
202
249
|
tool({
|
|
203
250
|
name: "screenshot",
|
|
204
251
|
description: "Capture what is on this device's screen right now, as an image. Use it to read a dialog, check on a window, or see what the user is describing. Requires the 'See the screen' permission.",
|
|
252
|
+
effect: "read",
|
|
205
253
|
input: NO_ARGS,
|
|
206
254
|
run: async (_args, scopes) => await screenshotResult(scopes),
|
|
207
255
|
}),
|
|
208
256
|
tool({
|
|
209
257
|
name: "list_sandboxes",
|
|
210
258
|
description: "The Intentic sandboxes on this device, as JSON: each one's slug, whether it is running, whether its tunnel is up, and its share of this machine under `resources` (memory cap in bytes, CPU cap, privileged, GPU, and which of those the approved environment demands versus the owner asked for). Only sandbox containers; nothing else on the machine is listed. Requires 'Run commands' or 'Manage sandboxes on this device'.",
|
|
259
|
+
effect: "read",
|
|
211
260
|
input: NO_ARGS,
|
|
212
261
|
run: async (_args, scopes) => textResult(await listSandboxes(scopes)),
|
|
213
262
|
}),
|
|
214
263
|
tool({
|
|
215
264
|
name: "manage_sandbox",
|
|
216
265
|
description: "Start, stop or restart one Intentic sandbox on this device, by its slug from list_sandboxes. Stopping one interrupts whoever is working in it, and stopping the sandbox you are calling from severs your own connection. Requires the 'Manage sandboxes on this device' permission, which is OFF unless the user turned it on.",
|
|
266
|
+
effect: "write",
|
|
217
267
|
input: z.object({ op: SandboxOpSchema, slug: required.describe("The sandbox's slug, from list_sandboxes.") }),
|
|
218
268
|
run: async ({ op, slug }, scopes) => textResult(await manageSandbox(op, slug, scopes)),
|
|
219
269
|
}),
|
|
220
270
|
tool({
|
|
221
271
|
name: "swap_sandbox",
|
|
222
272
|
description: "Move one Intentic sandbox on this device onto a different image: 'update' pulls the newest image of its release channel, 'rollback' returns it to the image it ran before its last update, and 'rebuild' rebuilds the owner-approved environment overlay. Files (/work) and history are kept in all three. Takes MINUTES, it pulls an image and recreates the container, and the sandbox is down while it happens. 'prepare' is the exception and the one to reach for first: it does the downloading and building of the next update WITHOUT touching the container, so the sandbox keeps running throughout and the 'update' that follows is a restart of seconds instead of a wait of minutes. Requires the 'Manage sandboxes on this device' permission.",
|
|
273
|
+
effect: "write",
|
|
223
274
|
input: z.object({
|
|
224
275
|
op: SandboxSwapSchema,
|
|
225
276
|
slug: required.describe("The sandbox's slug, from list_sandboxes."),
|
|
@@ -230,18 +281,21 @@ const TOOLS = [
|
|
|
230
281
|
tool({
|
|
231
282
|
name: "reshape_sandbox",
|
|
232
283
|
description: "Change how much of this device one Intentic sandbox may use, or its privileges: a memory cap in whole GiB, a CPU cap in whole cores, whether the container runs privileged, and whether this device's NVIDIA GPUs are passed through. Give only what should change; `null` for a cap means back to the default (the memory share derived from this machine; every core). The sandbox RESTARTS onto the same image — about a minute, whoever is working in it is interrupted, and reshaping the sandbox you are calling from severs your own connection until it is back — and the new values live on the container, surviving every later update. A privilege the sandbox's approved environment demands (the Docker capability's --privileged) cannot be withdrawn here, only the owner's own ask. Requires the 'Manage sandboxes on this device' permission.",
|
|
284
|
+
effect: "write",
|
|
233
285
|
input: SandboxResourcesAskFieldsSchema.extend({ slug: required.describe("The sandbox's slug, from list_sandboxes.") }),
|
|
234
286
|
run: async ({ slug, ...ask }, scopes) => textResult(await reshapeSandbox(slug, ask, scopes, () => { })),
|
|
235
287
|
}),
|
|
236
288
|
tool({
|
|
237
289
|
name: "remove_sandbox",
|
|
238
290
|
description: "Remove one Intentic sandbox from this device: its container stops and leaves the listing. Its files and its history are kept for a week, so `ic sandbox restore <slug>` on the device brings it back whole; after that week they are deleted for good. This is not what stopping it does, so confirm with the user before calling it. Requires the 'Manage sandboxes on this device' permission, which is OFF unless the user turned it on.",
|
|
291
|
+
effect: "destructive",
|
|
239
292
|
input: z.object({ slug: required.describe("The sandbox's slug, from list_sandboxes.") }),
|
|
240
293
|
run: async ({ slug }, scopes) => textResult(await removeSandbox(slug, scopes, () => { })),
|
|
241
294
|
}),
|
|
242
295
|
tool({
|
|
243
296
|
name: "sandbox_logs",
|
|
244
297
|
description: "The tail of one Intentic sandbox's container log on this device: how you find out why it will not start or what it did before it stopped. Requires 'Run commands' or 'Manage sandboxes on this device'.",
|
|
298
|
+
effect: "read",
|
|
245
299
|
input: z.object({
|
|
246
300
|
slug: required.describe("The sandbox's slug, from list_sandboxes."),
|
|
247
301
|
lines: z
|
package/dist/device/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/device/mcp.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/device/mcp.ts"],"names":[],"mappings":"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"}
|