@intentic/machine 1.233.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 (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +72 -0
  3. package/dist/app.d.ts +2 -0
  4. package/dist/app.d.ts.map +1 -0
  5. package/dist/app.js +12 -0
  6. package/dist/app.js.map +1 -0
  7. package/dist/autostart.d.ts +3 -0
  8. package/dist/autostart.d.ts.map +1 -0
  9. package/dist/autostart.js +13 -0
  10. package/dist/autostart.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +5 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/commands.d.ts +11 -0
  16. package/dist/commands.d.ts.map +1 -0
  17. package/dist/commands.js +91 -0
  18. package/dist/commands.js.map +1 -0
  19. package/dist/computer/audit.d.ts +6 -0
  20. package/dist/computer/audit.d.ts.map +1 -0
  21. package/dist/computer/audit.js +12 -0
  22. package/dist/computer/audit.js.map +1 -0
  23. package/dist/computer/commands.d.ts +8 -0
  24. package/dist/computer/commands.d.ts.map +1 -0
  25. package/dist/computer/commands.js +113 -0
  26. package/dist/computer/commands.js.map +1 -0
  27. package/dist/computer/config.d.ts +19 -0
  28. package/dist/computer/config.d.ts.map +1 -0
  29. package/dist/computer/config.js +31 -0
  30. package/dist/computer/config.js.map +1 -0
  31. package/dist/computer/connection.d.ts +8 -0
  32. package/dist/computer/connection.d.ts.map +1 -0
  33. package/dist/computer/connection.js +63 -0
  34. package/dist/computer/connection.js.map +1 -0
  35. package/dist/computer/mcp.d.ts +3 -0
  36. package/dist/computer/mcp.d.ts.map +1 -0
  37. package/dist/computer/mcp.js +312 -0
  38. package/dist/computer/mcp.js.map +1 -0
  39. package/dist/computer/policy.d.ts +8 -0
  40. package/dist/computer/policy.d.ts.map +1 -0
  41. package/dist/computer/policy.js +42 -0
  42. package/dist/computer/policy.js.map +1 -0
  43. package/dist/computer/router.d.ts +93 -0
  44. package/dist/computer/router.d.ts.map +1 -0
  45. package/dist/computer/router.js +79 -0
  46. package/dist/computer/router.js.map +1 -0
  47. package/dist/computer/tools/apps.d.ts +9 -0
  48. package/dist/computer/tools/apps.d.ts.map +1 -0
  49. package/dist/computer/tools/apps.js +41 -0
  50. package/dist/computer/tools/apps.js.map +1 -0
  51. package/dist/computer/tools/browser.d.ts +11 -0
  52. package/dist/computer/tools/browser.d.ts.map +1 -0
  53. package/dist/computer/tools/browser.js +63 -0
  54. package/dist/computer/tools/browser.js.map +1 -0
  55. package/dist/computer/tools/computer.d.ts +16 -0
  56. package/dist/computer/tools/computer.d.ts.map +1 -0
  57. package/dist/computer/tools/computer.js +80 -0
  58. package/dist/computer/tools/computer.js.map +1 -0
  59. package/dist/computer/tools/describe.d.ts +4 -0
  60. package/dist/computer/tools/describe.d.ts.map +1 -0
  61. package/dist/computer/tools/describe.js +37 -0
  62. package/dist/computer/tools/describe.js.map +1 -0
  63. package/dist/computer/tools/files.d.ts +12 -0
  64. package/dist/computer/tools/files.d.ts.map +1 -0
  65. package/dist/computer/tools/files.js +58 -0
  66. package/dist/computer/tools/files.js.map +1 -0
  67. package/dist/computer/tools/sandboxes.d.ts +45 -0
  68. package/dist/computer/tools/sandboxes.d.ts.map +1 -0
  69. package/dist/computer/tools/sandboxes.js +230 -0
  70. package/dist/computer/tools/sandboxes.js.map +1 -0
  71. package/dist/computer/tools/shell.d.ts +22 -0
  72. package/dist/computer/tools/shell.d.ts.map +1 -0
  73. package/dist/computer/tools/shell.js +78 -0
  74. package/dist/computer/tools/shell.js.map +1 -0
  75. package/dist/config.d.ts +4 -0
  76. package/dist/config.d.ts.map +1 -0
  77. package/dist/config.js +7 -0
  78. package/dist/config.js.map +1 -0
  79. package/dist/resident.d.ts +8 -0
  80. package/dist/resident.d.ts.map +1 -0
  81. package/dist/resident.js +92 -0
  82. package/dist/resident.js.map +1 -0
  83. package/dist/status.d.ts +21 -0
  84. package/dist/status.d.ts.map +1 -0
  85. package/dist/status.js +123 -0
  86. package/dist/status.js.map +1 -0
  87. package/dist/sync/commands.d.ts +20 -0
  88. package/dist/sync/commands.d.ts.map +1 -0
  89. package/dist/sync/commands.js +244 -0
  90. package/dist/sync/commands.js.map +1 -0
  91. package/dist/sync/config.d.ts +41 -0
  92. package/dist/sync/config.d.ts.map +1 -0
  93. package/dist/sync/config.js +35 -0
  94. package/dist/sync/config.js.map +1 -0
  95. package/dist/sync/exec.d.ts +10 -0
  96. package/dist/sync/exec.d.ts.map +1 -0
  97. package/dist/sync/exec.js +26 -0
  98. package/dist/sync/exec.js.map +1 -0
  99. package/dist/sync/git-bridge.d.ts +11 -0
  100. package/dist/sync/git-bridge.d.ts.map +1 -0
  101. package/dist/sync/git-bridge.js +122 -0
  102. package/dist/sync/git-bridge.js.map +1 -0
  103. package/dist/sync/mirror.d.ts +19 -0
  104. package/dist/sync/mirror.d.ts.map +1 -0
  105. package/dist/sync/mirror.js +310 -0
  106. package/dist/sync/mirror.js.map +1 -0
  107. package/dist/sync/mutagen.d.ts +68 -0
  108. package/dist/sync/mutagen.d.ts.map +1 -0
  109. package/dist/sync/mutagen.js +289 -0
  110. package/dist/sync/mutagen.js.map +1 -0
  111. package/dist/sync/report.d.ts +6 -0
  112. package/dist/sync/report.d.ts.map +1 -0
  113. package/dist/sync/report.js +66 -0
  114. package/dist/sync/report.js.map +1 -0
  115. package/dist/sync/ssh.d.ts +29 -0
  116. package/dist/sync/ssh.d.ts.map +1 -0
  117. package/dist/sync/ssh.js +165 -0
  118. package/dist/sync/ssh.js.map +1 -0
  119. package/dist/sync/tunnel.d.ts +22 -0
  120. package/dist/sync/tunnel.d.ts.map +1 -0
  121. package/dist/sync/tunnel.js +160 -0
  122. package/dist/sync/tunnel.js.map +1 -0
  123. package/dist/upgrade.d.ts +36 -0
  124. package/dist/upgrade.d.ts.map +1 -0
  125. package/dist/upgrade.js +95 -0
  126. package/dist/upgrade.js.map +1 -0
  127. package/dist/version.d.ts +2 -0
  128. package/dist/version.d.ts.map +1 -0
  129. package/dist/version.js +2 -0
  130. package/dist/version.js.map +1 -0
  131. package/package.json +49 -0
@@ -0,0 +1,41 @@
1
+ import { DesktopError } from "@intentic/desktop";
2
+ import { assertScope } from "../policy.js";
3
+ export const describeWindows = (windows) => {
4
+ if (windows.length === 0) {
5
+ return "No windows are open on this computer.";
6
+ }
7
+ const rows = windows.map((window) => `${window.focused ? "* " : " "}[${window.id}] ${window.app}, ${window.title} (${window.bounds.width}×${window.bounds.height} at ${window.bounds.x},${window.bounds.y})`);
8
+ return [`${windows.length} window${windows.length === 1 ? "" : "s"} (* = focused). Pass the id in brackets to focus_window.`, ...rows].join("\n");
9
+ };
10
+ export const listWindows = async (screen, scopes) => {
11
+ assertScope(scopes, "screen");
12
+ return describeWindows(await screen.windows());
13
+ };
14
+ export const focusWindow = async (screen, id, scopes) => {
15
+ assertScope(scopes, "control");
16
+ if (id === "") {
17
+ throw new DesktopError(`"id" is required: take a window list first and pass the id in brackets.`);
18
+ }
19
+ await screen.focusWindow(id);
20
+ const focused = (await screen.windows().catch(() => [])).find((window) => window.focused);
21
+ return focused === undefined ? `Asked this computer to focus window ${id}.` : `Focused: ${focused.app}, ${focused.title}. Typing now goes here.`;
22
+ };
23
+ export const openTarget = async (screen, target, scopes) => {
24
+ assertScope(scopes, "shell");
25
+ if (target === "") {
26
+ throw new DesktopError(`"target" is required: an application name, a file path, or a URL.`);
27
+ }
28
+ await screen.launch(target);
29
+ return `Opened ${target}. Give it a moment, then take a screenshot or list the windows to see it.`;
30
+ };
31
+ export const readClipboard = async (screen, scopes) => {
32
+ assertScope(scopes, "screen");
33
+ const text = await screen.readClipboard();
34
+ return text === "" ? "The clipboard is empty." : text;
35
+ };
36
+ export const writeClipboard = async (screen, text, scopes) => {
37
+ assertScope(scopes, "control");
38
+ await screen.writeClipboard(text);
39
+ return `Put ${text.length} characters on this computer's clipboard.`;
40
+ };
41
+ //# sourceMappingURL=apps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apps.js","sourceRoot":"","sources":["../../../src/computer/tools/apps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type Browser } from "@intentic/browser";
2
+ import type { HostScopes } from "@intentic/sandbox-contract";
3
+ export declare const openPage: (web: Browser, url: string, scopes: HostScopes) => Promise<string>;
4
+ export declare const snapshotPage: (web: Browser, scopes: HostScopes) => Promise<string>;
5
+ export declare const readPage: (web: Browser, scopes: HostScopes) => Promise<string>;
6
+ export declare const clickElement: (web: Browser, ref: string, scopes: HostScopes) => Promise<string>;
7
+ export declare const fillElement: (web: Browser, ref: string, text: string, submit: boolean, scopes: HostScopes) => Promise<string>;
8
+ export declare const pressKey: (web: Browser, combo: string, scopes: HostScopes) => Promise<string>;
9
+ export declare const listTabs: (web: Browser, scopes: HostScopes) => Promise<string>;
10
+ export declare const selectTab: (web: Browser, id: string, scopes: HostScopes) => Promise<string>;
11
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/computer/tools/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAA4B,MAAM,mBAAmB,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAqB7D,eAAO,MAAM,QAAQ,QAAe,OAAO,OAAO,MAAM,UAAU,UAAU,KAAG,OAAO,CAAC,MAAM,CAU5F,CAAC;AAEF,eAAO,MAAM,YAAY,QAAe,OAAO,UAAU,UAAU,KAAG,OAAO,CAAC,MAAM,CAGnF,CAAC;AAEF,eAAO,MAAM,QAAQ,QAAe,OAAO,UAAU,UAAU,KAAG,OAAO,CAAC,MAAM,CAI/E,CAAC;AAKF,eAAO,MAAM,YAAY,QAAe,OAAO,OAAO,MAAM,UAAU,UAAU,KAAG,OAAO,CAAC,MAAM,CAQhG,CAAC;AAEF,eAAO,MAAM,WAAW,QAAe,OAAO,OAAO,MAAM,QAAQ,MAAM,UAAU,OAAO,UAAU,UAAU,KAAG,OAAO,CAAC,MAAM,CAS9H,CAAC;AAEF,eAAO,MAAM,QAAQ,QAAe,OAAO,SAAS,MAAM,UAAU,UAAU,KAAG,OAAO,CAAC,MAAM,CAK9F,CAAC;AAEF,eAAO,MAAM,QAAQ,QAAe,OAAO,UAAU,UAAU,KAAG,OAAO,CAAC,MAAM,CAU/E,CAAC;AAEF,eAAO,MAAM,SAAS,QAAe,OAAO,MAAM,MAAM,UAAU,UAAU,KAAG,OAAO,CAAC,MAAM,CAM5F,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { BrowserError, renderPage } from "@intentic/browser";
2
+ import { assertScope } from "../policy.js";
3
+ export const openPage = async (web, url, scopes) => {
4
+ assertScope(scopes, "shell");
5
+ if (url === "") {
6
+ throw new BrowserError(`"url" is required: the page to open.`);
7
+ }
8
+ const target = /^[a-z][a-z0-9+.-]*:/i.test(url) ? url : `https://${url}`;
9
+ return renderPage(await web.open(target));
10
+ };
11
+ export const snapshotPage = async (web, scopes) => {
12
+ assertScope(scopes, "screen");
13
+ return renderPage(await web.snapshot());
14
+ };
15
+ export const readPage = async (web, scopes) => {
16
+ assertScope(scopes, "screen");
17
+ const text = await web.text();
18
+ return text.trim() === "" ? "That page has no readable text, it may still be loading, or it may be a canvas or a PDF." : text;
19
+ };
20
+ export const clickElement = async (web, ref, scopes) => {
21
+ assertScope(scopes, "control");
22
+ if (ref === "") {
23
+ throw new BrowserError(`"ref" is required: take a snapshot and use one of the [e…] references from it.`);
24
+ }
25
+ await web.click(ref);
26
+ await settle();
27
+ return `Clicked ${ref}.\n\n${renderPage(await web.snapshot())}`;
28
+ };
29
+ export const fillElement = async (web, ref, text, submit, scopes) => {
30
+ assertScope(scopes, "control");
31
+ if (ref === "") {
32
+ throw new BrowserError(`"ref" is required: take a snapshot and use one of the [e…] references from it.`);
33
+ }
34
+ await web.fill(ref, text, submit);
35
+ await settle();
36
+ return `Typed ${text.length} characters into ${ref}${submit ? " and submitted" : ""}.\n\n${renderPage(await web.snapshot())}`;
37
+ };
38
+ export const pressKey = async (web, combo, scopes) => {
39
+ assertScope(scopes, "control");
40
+ await web.press(combo === "" ? "Return" : combo);
41
+ await settle();
42
+ return `Pressed ${combo === "" ? "Return" : combo}.\n\n${renderPage(await web.snapshot())}`;
43
+ };
44
+ export const listTabs = async (web, scopes) => {
45
+ assertScope(scopes, "screen");
46
+ const tabs = await web.tabs();
47
+ if (tabs.length === 0) {
48
+ return "The browser has no open tabs.";
49
+ }
50
+ return [
51
+ `${tabs.length} tab${tabs.length === 1 ? "" : "s"} (* = the one these tools are acting on). Pass an id to switch.`,
52
+ ...tabs.map((tab) => `${tab.active ? "* " : " "}[${tab.id}] ${tab.title}, ${tab.url}`),
53
+ ].join("\n");
54
+ };
55
+ export const selectTab = async (web, id, scopes) => {
56
+ assertScope(scopes, "control");
57
+ if (id === "") {
58
+ throw new BrowserError(`"id" is required: list the tabs and pass one of the ids in brackets.`);
59
+ }
60
+ return renderPage(await web.selectTab(id));
61
+ };
62
+ const settle = () => new Promise((resolvePromise) => setTimeout(resolvePromise, 500));
63
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/computer/tools/browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type Desktop, type ScrollDirection } from "@intentic/desktop";
2
+ import type { HostScopes } from "@intentic/sandbox-contract";
3
+ export type ComputerAction = "mouse_move" | "left_click" | "right_click" | "middle_click" | "double_click" | "left_click_drag" | "type" | "key" | "scroll" | "wait";
4
+ export interface ComputerInput {
5
+ readonly action: ComputerAction;
6
+ readonly coordinate?: readonly [number, number] | undefined;
7
+ readonly to?: readonly [number, number] | undefined;
8
+ readonly text?: string | undefined;
9
+ readonly direction?: ScrollDirection | undefined;
10
+ readonly amount?: number | undefined;
11
+ readonly ms?: number | undefined;
12
+ }
13
+ export declare const describeAction: (input: ComputerInput) => string;
14
+ export declare const act: (screen: Desktop, input: ComputerInput, scopes: HostScopes) => Promise<void>;
15
+ export declare const settle: () => Promise<void>;
16
+ //# sourceMappingURL=computer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computer.d.ts","sourceRoot":"","sources":["../../../src/computer/tools/computer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAA8C,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACnH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAqB7D,MAAM,MAAM,cAAc,GACtB,YAAY,GAAG,YAAY,GAAG,aAAa,GAAG,cAAc,GAAG,cAAc,GAAG,iBAAiB,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE3I,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC5D,QAAQ,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AA4BD,eAAO,MAAM,cAAc,UAAW,aAAa,KAAG,MAerD,CAAC;AAMF,eAAO,MAAM,GAAG,WAAkB,OAAO,SAAS,aAAa,UAAU,UAAU,KAAG,OAAO,CAAC,IAAI,CA6CjG,CAAC;AAIF,eAAO,MAAM,MAAM,QAAa,OAAO,CAAC,IAAI,CAA2B,CAAC"}
@@ -0,0 +1,80 @@
1
+ import { DesktopError } from "@intentic/desktop";
2
+ import { assertScope } from "../policy.js";
3
+ const SETTLE_MS = 400;
4
+ const MAX_WAIT_MS = 10_000;
5
+ const point = (value, name) => {
6
+ if (value === undefined || value.length !== 2 || !Number.isFinite(value[0]) || !Number.isFinite(value[1])) {
7
+ throw new DesktopError(`"${name}" must be [x, y] in screenshot pixels.`);
8
+ }
9
+ return { x: value[0], y: value[1] };
10
+ };
11
+ const within = (at, frame, name) => {
12
+ if (at.x < 0 || at.y < 0 || at.x >= frame.width || at.y >= frame.height) {
13
+ throw new DesktopError(`${name} (${at.x}, ${at.y}) is outside the screen, which is ${frame.width}×${frame.height}. Take a screenshot and read the coordinates off it.`);
14
+ }
15
+ return at;
16
+ };
17
+ const CLICK_BUTTON = { left_click: "left", right_click: "right", middle_click: "middle" };
18
+ export const describeAction = (input) => {
19
+ switch (input.action) {
20
+ case "type":
21
+ return `Typed ${input.text?.length ?? 0} characters.`;
22
+ case "key":
23
+ return `Pressed ${input.text ?? ""}.`;
24
+ case "wait":
25
+ return `Waited ${Math.min(input.ms ?? SETTLE_MS, MAX_WAIT_MS)}ms.`;
26
+ case "scroll":
27
+ return `Scrolled ${input.direction ?? "down"} at (${input.coordinate?.join(", ") ?? ""}).`;
28
+ case "left_click_drag":
29
+ return `Dragged from (${input.coordinate?.join(", ") ?? ""}) to (${input.to?.join(", ") ?? ""}).`;
30
+ default:
31
+ return `${input.action.replace(/_/g, " ")} at (${input.coordinate?.join(", ") ?? ""}).`;
32
+ }
33
+ };
34
+ const sleep = (ms) => new Promise((resolvePromise) => setTimeout(resolvePromise, ms));
35
+ export const act = async (screen, input, scopes) => {
36
+ assertScope(scopes, "control");
37
+ if (input.action === "wait") {
38
+ await sleep(Math.min(Math.max(0, input.ms ?? SETTLE_MS), MAX_WAIT_MS));
39
+ return;
40
+ }
41
+ if (input.action === "type") {
42
+ if (input.text === undefined || input.text === "") {
43
+ throw new DesktopError(`"text" is required to type.`);
44
+ }
45
+ await screen.type(input.text);
46
+ return;
47
+ }
48
+ if (input.action === "key") {
49
+ if (input.text === undefined || input.text === "") {
50
+ throw new DesktopError(`"text" is required to press a key: for example "Return", "ctrl+c", "alt+Tab".`);
51
+ }
52
+ await screen.key(input.text);
53
+ return;
54
+ }
55
+ const frame = await screen.frame();
56
+ const at = within(point(input.coordinate, "coordinate"), frame, "The coordinate");
57
+ if (input.action === "mouse_move") {
58
+ await screen.move(at);
59
+ return;
60
+ }
61
+ if (input.action === "double_click") {
62
+ await screen.doubleClick(at);
63
+ return;
64
+ }
65
+ if (input.action === "left_click_drag") {
66
+ await screen.drag(at, within(point(input.to, "to"), frame, "The drag target"));
67
+ return;
68
+ }
69
+ if (input.action === "scroll") {
70
+ await screen.scroll(at, input.direction ?? "down", input.amount ?? 3);
71
+ return;
72
+ }
73
+ const button = CLICK_BUTTON[input.action];
74
+ if (button === undefined) {
75
+ throw new DesktopError(`"${input.action}" is not something this computer can do.`);
76
+ }
77
+ await screen.click(at, button);
78
+ };
79
+ export const settle = async () => await sleep(SETTLE_MS);
80
+ //# sourceMappingURL=computer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computer.js","sourceRoot":"","sources":["../../../src/computer/tools/computer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { HostFacts, HostScopes } from "@intentic/sandbox-contract";
2
+ export declare const hostFacts: (scopes: HostScopes) => Promise<HostFacts>;
3
+ export declare const describeText: (scopes: HostScopes) => Promise<string>;
4
+ //# sourceMappingURL=describe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe.d.ts","sourceRoot":"","sources":["../../../src/computer/tools/describe.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAmCxE,eAAO,MAAM,SAAS,WAAkB,UAAU,KAAG,OAAO,CAAC,SAAS,CAMpE,CAAC;AAIH,eAAO,MAAM,YAAY,WAAkB,UAAU,KAAG,OAAO,CAAC,MAAM,CAcrE,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { execFile } from "node:child_process";
2
+ import { arch, homedir, hostname, platform, release, type } from "node:os";
3
+ import { promisify } from "node:util";
4
+ import { rootsOf } from "../policy.js";
5
+ import { shellFor } from "./shell.js";
6
+ const exec = promisify(execFile);
7
+ const osName = async () => {
8
+ if (platform() === "win32") {
9
+ const { stdout } = await exec("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", "(Get-CimInstance Win32_OperatingSystem).Caption"], { windowsHide: true }).catch(() => ({ stdout: "" }));
10
+ const caption = stdout.trim();
11
+ return caption === "" ? `Windows (${release()})` : `${caption} (build ${release()})`;
12
+ }
13
+ const { stdout } = await exec("sh", ["-c", '. /etc/os-release 2>/dev/null && printf %s "$PRETTY_NAME"']).catch(() => ({ stdout: "" }));
14
+ const pretty = stdout.trim();
15
+ return pretty === "" ? `${type()} ${release()}` : `${pretty} (kernel ${release()})`;
16
+ };
17
+ export const hostFacts = async (scopes) => ({
18
+ os: await osName(),
19
+ arch: arch(),
20
+ shell: shellFor(platform()).label,
21
+ home: homedir(),
22
+ roots: rootsOf(scopes),
23
+ });
24
+ export const describeText = async (scopes) => {
25
+ const facts = await hostFacts(scopes);
26
+ const session = platform() === "linux" ? `\nGraphical session: ${process.env["XDG_SESSION_TYPE"] ?? "none detected (headless)"}` : "";
27
+ return ([
28
+ `Computer: ${hostname()}`,
29
+ `OS: ${facts.os}`,
30
+ `Architecture: ${facts.arch}`,
31
+ `Shell for run_command: ${facts.shell}`,
32
+ `Home: ${facts.home}`,
33
+ `Folders you may read and write: ${facts.roots.join(", ")}`,
34
+ `Permissions: run commands ${scopes.shell}, write files ${scopes.write}, see the screen ${scopes.screen}, manage sandboxes ${scopes.sandboxes}`,
35
+ ].join("\n") + session);
36
+ };
37
+ //# sourceMappingURL=describe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe.js","sourceRoot":"","sources":["../../../src/computer/tools/describe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { HostScopes } from "@intentic/sandbox-contract";
2
+ export declare const readTextFile: (path: string, scopes: HostScopes) => Promise<string>;
3
+ export declare const writeTextFile: (path: string, content: string, scopes: HostScopes) => Promise<string>;
4
+ export interface DirEntry {
5
+ readonly name: string;
6
+ readonly kind: "file" | "directory" | "other";
7
+ readonly size?: number;
8
+ readonly modified?: string;
9
+ }
10
+ export declare const listDirectory: (path: string, scopes: HostScopes) => Promise<DirEntry[]>;
11
+ export declare const trashFile: (path: string, scopes: HostScopes) => Promise<string>;
12
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../src/computer/tools/files.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAmB7D,eAAO,MAAM,YAAY,SAAgB,MAAM,UAAU,UAAU,KAAG,OAAO,CAAC,MAAM,CAUnF,CAAC;AAEF,eAAO,MAAM,aAAa,SAAgB,MAAM,WAAW,MAAM,UAAU,UAAU,KAAG,OAAO,CAAC,MAAM,CAYrG,CAAC;AAEF,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,aAAa,SAAgB,MAAM,UAAU,UAAU,KAAG,OAAO,CAAC,QAAQ,EAAE,CAexF,CAAC;AAIF,eAAO,MAAM,SAAS,SAAgB,MAAM,UAAU,UAAU,KAAG,OAAO,CAAC,MAAM,CAuBhF,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { mkdir, readdir, readFile, rename, stat, writeFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { basename, dirname, join } from "node:path";
4
+ import { assertPath, assertScope } from "../policy.js";
5
+ const MAX_READ_BYTES = 2_000_000;
6
+ export const readTextFile = async (path, scopes) => {
7
+ const target = assertPath(path, scopes, "read");
8
+ const info = await stat(target);
9
+ if (info.isDirectory()) {
10
+ throw new Error(`"${path}" is a directory: use list_dir for it.`);
11
+ }
12
+ if (info.size > MAX_READ_BYTES) {
13
+ throw new Error(`"${path}" is ${Math.round(info.size / 1_000_000)} MB, too large to read whole. Read part of it with a command instead.`);
14
+ }
15
+ return await readFile(target, "utf8");
16
+ };
17
+ export const writeTextFile = async (path, content, scopes) => {
18
+ assertScope(scopes, "write");
19
+ const target = assertPath(path, scopes, "write");
20
+ await mkdir(dirname(target), { recursive: true });
21
+ const existed = await stat(target).then(() => true, () => false);
22
+ await writeFile(target, content, "utf8");
23
+ return existed ? `Overwrote ${target} (${content.length} characters).` : `Created ${target} (${content.length} characters).`;
24
+ };
25
+ export const listDirectory = async (path, scopes) => {
26
+ const target = assertPath(path, scopes, "list");
27
+ const entries = await readdir(target, { withFileTypes: true });
28
+ return await Promise.all(entries.map(async (entry) => {
29
+ const kind = entry.isDirectory() ? "directory" : entry.isFile() ? "file" : "other";
30
+ if (kind !== "file") {
31
+ return { name: entry.name, kind };
32
+ }
33
+ const info = await stat(join(target, entry.name)).catch(() => undefined);
34
+ return info === undefined ? { name: entry.name, kind } : { name: entry.name, kind, size: info.size, modified: info.mtime.toISOString() };
35
+ }));
36
+ };
37
+ const trashDir = () => join(homedir(), ".intentic", "host", "trash");
38
+ export const trashFile = async (path, scopes) => {
39
+ assertScope(scopes, "write");
40
+ const target = assertPath(path, scopes, "trash");
41
+ await stat(target);
42
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
43
+ const destination = join(trashDir(), stamp);
44
+ await mkdir(destination, { recursive: true });
45
+ const moved = join(destination, basename(target));
46
+ try {
47
+ await rename(target, moved);
48
+ }
49
+ catch (error) {
50
+ const code = error.code;
51
+ if (code === "EXDEV") {
52
+ throw new Error(`"${path}" is on a different drive from the trash folder (${trashDir()}), so it cannot be moved there safely. Ask the user to remove it themselves.`, { cause: error });
53
+ }
54
+ throw error;
55
+ }
56
+ return `Moved ${target} to ${moved}. It is recoverable from there until the user empties that folder.`;
57
+ };
58
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/computer/tools/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAgBvD,MAAM,cAAc,GAAG,SAAS,CAAC;AAEjC,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,IAAY,EAAE,MAAkB,EAAmB,EAAE;IACpF,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,wCAAwC,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,GAAG,cAAc,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,uEAAuE,CAAC,CAAC;IAC9I,CAAC;IACD,OAAO,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,IAAY,EAAE,OAAe,EAAE,MAAkB,EAAmB,EAAE;IACtG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CACnC,GAAG,EAAE,CAAC,IAAI,EACV,GAAG,EAAE,CAAC,KAAK,CACd,CAAC;IACF,MAAM,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAGzC,OAAO,OAAO,CAAC,CAAC,CAAC,aAAa,MAAM,KAAK,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC,CAAC,WAAW,MAAM,KAAK,OAAO,CAAC,MAAM,eAAe,CAAC;AACjI,CAAC,CAAC;AASF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,IAAY,EAAE,MAAkB,EAAuB,EAAE;IACzF,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,OAAO,MAAM,OAAO,CAAC,GAAG,CACpB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QACnF,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAClB,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;QACtC,CAAC;QAGD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACzE,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;IAC7I,CAAC,CAAC,CACL,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAE7E,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,IAAY,EAAE,MAAkB,EAAmB,EAAE;IACjF,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;IAGnB,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;IAC5C,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,IAAI,CAAC;QACD,MAAM,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;QACnD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACX,IAAI,IAAI,oDAAoD,QAAQ,EAAE,8EAA8E,EACpJ,EAAE,KAAK,EAAE,KAAK,EAAE,CACnB,CAAC;QACN,CAAC;QACD,MAAM,KAAK,CAAC;IAChB,CAAC;IACD,OAAO,SAAS,MAAM,OAAO,KAAK,oEAAoE,CAAC;AAC3G,CAAC,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { HostScopes, MachineSandbox } from "@intentic/sandbox-contract";
2
+ import { z } from "zod";
3
+ export interface DockerRow {
4
+ readonly names: string;
5
+ readonly state: string;
6
+ readonly image: string;
7
+ }
8
+ export declare const rowsFrom: (stdout: string) => DockerRow[];
9
+ export declare const sandboxesFrom: (rows: readonly DockerRow[]) => MachineSandbox[];
10
+ export declare const listSandboxes: (scopes: HostScopes) => Promise<string>;
11
+ export declare const SandboxOpSchema: z.ZodEnum<{
12
+ restart: "restart";
13
+ start: "start";
14
+ stop: "stop";
15
+ }>;
16
+ export type SandboxOp = z.infer<typeof SandboxOpSchema>;
17
+ export declare const manageSandbox: (op: SandboxOp, slug: string, scopes: HostScopes) => Promise<string>;
18
+ export declare const SandboxSwapSchema: z.ZodEnum<{
19
+ prepare: "prepare";
20
+ rebuild: "rebuild";
21
+ rollback: "rollback";
22
+ update: "update";
23
+ }>;
24
+ export type SandboxSwap = z.infer<typeof SandboxSwapSchema>;
25
+ export declare const icCandidates: (platform: NodeJS.Platform, home: string | undefined) => string[];
26
+ export declare const icSwapArgs: (swap: SandboxSwap, slug: string, hash: string | undefined) => string[];
27
+ export declare const icRemoveArgs: (slug: string) => string[];
28
+ export interface RunnerShapeFiles {
29
+ readonly definitionFile?: string;
30
+ readonly overlayFile?: string;
31
+ readonly environmentHash?: string;
32
+ }
33
+ export declare const icRunnerArgs: (op: "runner-up" | "runner-remove", name: string, parentUrl: string | undefined, pair: string | undefined, shape?: RunnerShapeFiles) => string[];
34
+ export declare const runnerFlow: (op: "runner-up" | "runner-remove", name: string, parentUrl: string | undefined, pair: string | undefined, shape: {
35
+ definition?: string;
36
+ overlay?: string;
37
+ overlayHash?: string;
38
+ }, scopes: HostScopes, onLine: (line: string) => void) => Promise<string>;
39
+ export declare const swapSandbox: (swap: SandboxSwap, slug: string, hash: string | undefined, scopes: HostScopes, onLine: (line: string) => void) => Promise<string>;
40
+ export declare const removeSandbox: (slug: string, scopes: HostScopes, onLine: (line: string) => void) => Promise<string>;
41
+ export declare const DEFAULT_LOG_LINES = 200;
42
+ export declare const MAX_LOG_LINES = 2000;
43
+ export declare const sandboxLogs: (slug: string, lines: number | undefined, scopes: HostScopes) => Promise<string>;
44
+ export declare const tailSandboxLogs: (slug: string, scopes: HostScopes, onLine: (line: string) => void) => Promise<string>;
45
+ //# sourceMappingURL=sandboxes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandboxes.d.ts","sourceRoot":"","sources":["../../../src/computer/tools/sandboxes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA6BxB,MAAM,WAAW,SAAS;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B;AAID,eAAO,MAAM,QAAQ,WAAY,MAAM,KAAG,SAAS,EAYzC,CAAC;AAKX,eAAO,MAAM,aAAa,SAAU,SAAS,SAAS,EAAE,KAAG,cAAc,EAkBxE,CAAC;AAqBF,eAAO,MAAM,aAAa,WAAkB,UAAU,KAAG,OAAO,CAAC,MAAM,CAKtE,CAAC;AAIF,eAAO,MAAM,eAAe;;;;EAAuC,CAAC;AACpE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAexD,eAAO,MAAM,aAAa,OAAc,SAAS,QAAQ,MAAM,UAAU,UAAU,KAAG,OAAO,CAAC,MAAM,CASnG,CAAC;AAWF,eAAO,MAAM,iBAAiB;;;;;EAAuD,CAAC;AACtF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAU5D,eAAO,MAAM,YAAY,aAAc,MAAM,CAAC,QAAQ,QAAQ,MAAM,GAAG,SAAS,KAAG,MAAM,EAKxF,CAAC;AAOF,eAAO,MAAM,UAAU,SAAU,WAAW,QAAQ,MAAM,QAAQ,MAAM,GAAG,SAAS,KAAG,MAAM,EAQ5F,CAAC;AAIF,eAAO,MAAM,YAAY,SAAU,MAAM,KAAG,MAAM,EAAuC,CAAC;AAM1F,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACrC;AAMD,eAAO,MAAM,YAAY,OAAQ,WAAW,GAAG,eAAe,QAAQ,MAAM,aAAa,MAAM,GAAG,SAAS,QAAQ,MAAM,GAAG,SAAS,UAAS,gBAAgB,KAAQ,MAAM,EAuB3K,CAAC;AAQF,eAAO,MAAM,UAAU,OACf,WAAW,GAAG,eAAe,QAC3B,MAAM,aACD,MAAM,GAAG,SAAS,QACvB,MAAM,GAAG,SAAS,SACjB;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,UAC9D,UAAU,UACV,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAC/B,OAAO,CAAC,MAAM,CAoChB,CAAC;AA+CF,eAAO,MAAM,WAAW,SACd,WAAW,QACX,MAAM,QACN,MAAM,GAAG,SAAS,UAChB,UAAU,UACV,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAC/B,OAAO,CAAC,MAAM,CAiBhB,CAAC;AAEF,eAAO,MAAM,aAAa,SAAgB,MAAM,UAAU,UAAU,UAAU,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAAG,OAAO,CAAC,MAAM,CAQpH,CAAC;AASF,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,aAAa,OAAQ,CAAC;AAuBnC,eAAO,MAAM,WAAW,SAAgB,MAAM,SAAS,MAAM,GAAG,SAAS,UAAU,UAAU,KAAG,OAAO,CAAC,MAAM,CAG7G,CAAC;AASF,eAAO,MAAM,eAAe,SAAgB,MAAM,UAAU,UAAU,UAAU,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAAG,OAAO,CAAC,MAAM,CAMtH,CAAC"}