@intentic/machine 1.308.2 → 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.
Files changed (45) hide show
  1. package/README.md +52 -2
  2. package/dist/device/connection.d.ts +2 -1
  3. package/dist/device/connection.d.ts.map +1 -1
  4. package/dist/device/connection.js +13 -2
  5. package/dist/device/connection.js.map +1 -1
  6. package/dist/device/indicator.d.ts +28 -0
  7. package/dist/device/indicator.d.ts.map +1 -0
  8. package/dist/device/indicator.js +115 -0
  9. package/dist/device/indicator.js.map +1 -0
  10. package/dist/device/mcp.d.ts.map +1 -1
  11. package/dist/device/mcp.js +62 -8
  12. package/dist/device/mcp.js.map +1 -1
  13. package/dist/device/policy.d.ts +4 -1
  14. package/dist/device/policy.d.ts.map +1 -1
  15. package/dist/device/policy.js +23 -5
  16. package/dist/device/policy.js.map +1 -1
  17. package/dist/device/router.d.ts +2 -0
  18. package/dist/device/router.d.ts.map +1 -1
  19. package/dist/device/router.js +4 -3
  20. package/dist/device/router.js.map +1 -1
  21. package/dist/device/tools/apps.d.ts +3 -2
  22. package/dist/device/tools/apps.d.ts.map +1 -1
  23. package/dist/device/tools/apps.js +5 -2
  24. package/dist/device/tools/apps.js.map +1 -1
  25. package/dist/device/tools/device.d.ts +2 -1
  26. package/dist/device/tools/device.d.ts.map +1 -1
  27. package/dist/device/tools/device.js +30 -37
  28. package/dist/device/tools/device.js.map +1 -1
  29. package/dist/device/tools/files.d.ts +14 -2
  30. package/dist/device/tools/files.d.ts.map +1 -1
  31. package/dist/device/tools/files.js +164 -16
  32. package/dist/device/tools/files.js.map +1 -1
  33. package/dist/device/tools/sandboxes.d.ts +7 -4
  34. package/dist/device/tools/sandboxes.d.ts.map +1 -1
  35. package/dist/device/tools/sandboxes.js +22 -10
  36. package/dist/device/tools/sandboxes.js.map +1 -1
  37. package/dist/device/tools/shell.d.ts +7 -2
  38. package/dist/device/tools/shell.d.ts.map +1 -1
  39. package/dist/device/tools/shell.js +99 -39
  40. package/dist/device/tools/shell.js.map +1 -1
  41. package/dist/status.d.ts +1 -0
  42. package/dist/status.d.ts.map +1 -1
  43. package/dist/status.js +13 -2
  44. package/dist/status.js.map +1 -1
  45. 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;AASzE,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,WAAY,QAAQ,WAAW,MAAM,OAAO,GAAG,SAAQ,IAAI,iCAAmC,QA+CjH,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) => handler.upgrade(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,CAAC,MAAgB,EAAE,OAAe,EAAE,GAAQ,EAAE,IAAI,GAAS,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAY,EAAE;IAIzH,MAAM,OAAO,GAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC,CAAC;IAG1E,IAAI,MAAM,GAAiB,MAAM,CAAC,MAAM,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,UAAU,CAC1B,gBAAgB,CAAC;QACb,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM;QACpB,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YAChB,MAAM,GAAG,IAAI,CAAC;YAId,KAAK,cAAc,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACjD,CAAC;QACD,GAAG;KACN,CAAC,CACL,CAAC;IAEF,OAAO,QAAQ,CAAY;QACvB,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACnB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAClE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,SAAS,CAAC;YACrB,CAAC;YACD,OAAO;gBACH,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBAGzC,IAAI,EAAE,YAAY,KAAK,CAAC,CAAC,CAAC,mBAAmB,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,MAAM,CAAC,EAAE,GAAG;aAChF,CAAC;QACN,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;QAC9D,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,aAAa,CAAC,iBAAiB,CAAC;QAEzC,SAAS,EAAE,iBAAiB,CAAC,iBAAiB,CAAC;QAC/C,GAAG,EAAE,OAAO;QAEZ,OAAO,EAAE,GAAG,EAAE;YACV,OAAO,CAAC,4IAA4I,CAAC,CAAC;YACtJ,KAAK,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,OAAO,CAAC,oCAAoC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5H,CAAC;KACJ,CAAC,CAAC;AACP,CAAC,CAAC"}
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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/device/mcp.ts"],"names":[],"mappings":"AAoVA,eAAO,MAAM,gBAAgB;;;;;;;;kDAQ3B,CAAC"}
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/device/mcp.ts"],"names":[],"mappings":"AAyZA,eAAO,MAAM,gBAAgB;;;;;;;;kDAQ3B,CAAC"}
@@ -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. Bounded by the folders this machine allows.",
68
- input: z.object({ path: required }),
69
- run: async ({ path }, scopes) => textResult(await readTextFile(path, scopes)),
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 its contents. Requires the 'Create and change files' permission, which is OFF unless the user turned it on. Overwrites whole: read first if you mean to edit.",
74
- input: z.object({ path: required, content: z.string() }),
75
- run: async ({ path, content }, scopes) => textResult(await writeTextFile(path, content, scopes)),
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
@@ -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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"}