pilot-ai 0.1.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/dist/agent/claude.d.ts +45 -0
- package/dist/agent/claude.d.ts.map +1 -0
- package/dist/agent/claude.js +114 -0
- package/dist/agent/claude.js.map +1 -0
- package/dist/agent/core.d.ts +17 -0
- package/dist/agent/core.d.ts.map +1 -0
- package/dist/agent/core.js +129 -0
- package/dist/agent/core.js.map +1 -0
- package/dist/agent/heartbeat.d.ts +51 -0
- package/dist/agent/heartbeat.d.ts.map +1 -0
- package/dist/agent/heartbeat.js +253 -0
- package/dist/agent/heartbeat.js.map +1 -0
- package/dist/agent/memory-commands.d.ts +11 -0
- package/dist/agent/memory-commands.d.ts.map +1 -0
- package/dist/agent/memory-commands.js +55 -0
- package/dist/agent/memory-commands.js.map +1 -0
- package/dist/agent/memory.d.ts +11 -0
- package/dist/agent/memory.d.ts.map +1 -0
- package/dist/agent/memory.js +109 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/multi-agent.d.ts +47 -0
- package/dist/agent/multi-agent.d.ts.map +1 -0
- package/dist/agent/multi-agent.js +117 -0
- package/dist/agent/multi-agent.js.map +1 -0
- package/dist/agent/pipeline.d.ts +27 -0
- package/dist/agent/pipeline.d.ts.map +1 -0
- package/dist/agent/pipeline.js +52 -0
- package/dist/agent/pipeline.js.map +1 -0
- package/dist/agent/planner.d.ts +21 -0
- package/dist/agent/planner.d.ts.map +1 -0
- package/dist/agent/planner.js +51 -0
- package/dist/agent/planner.js.map +1 -0
- package/dist/agent/preference-detector.d.ts +6 -0
- package/dist/agent/preference-detector.d.ts.map +1 -0
- package/dist/agent/preference-detector.js +50 -0
- package/dist/agent/preference-detector.js.map +1 -0
- package/dist/agent/project-analyzer.d.ts +6 -0
- package/dist/agent/project-analyzer.d.ts.map +1 -0
- package/dist/agent/project-analyzer.js +108 -0
- package/dist/agent/project-analyzer.js.map +1 -0
- package/dist/agent/project.d.ts +28 -0
- package/dist/agent/project.d.ts.map +1 -0
- package/dist/agent/project.js +121 -0
- package/dist/agent/project.js.map +1 -0
- package/dist/agent/queue.d.ts +61 -0
- package/dist/agent/queue.d.ts.map +1 -0
- package/dist/agent/queue.js +167 -0
- package/dist/agent/queue.js.map +1 -0
- package/dist/agent/safety.d.ts +25 -0
- package/dist/agent/safety.d.ts.map +1 -0
- package/dist/agent/safety.js +77 -0
- package/dist/agent/safety.js.map +1 -0
- package/dist/agent/semantic-search.d.ts +34 -0
- package/dist/agent/semantic-search.d.ts.map +1 -0
- package/dist/agent/semantic-search.js +183 -0
- package/dist/agent/semantic-search.js.map +1 -0
- package/dist/agent/skills.d.ts +59 -0
- package/dist/agent/skills.d.ts.map +1 -0
- package/dist/agent/skills.js +161 -0
- package/dist/agent/skills.js.map +1 -0
- package/dist/agent/tool-descriptions.d.ts +7 -0
- package/dist/agent/tool-descriptions.d.ts.map +1 -0
- package/dist/agent/tool-descriptions.js +51 -0
- package/dist/agent/tool-descriptions.js.map +1 -0
- package/dist/agent/worktree.d.ts +28 -0
- package/dist/agent/worktree.d.ts.map +1 -0
- package/dist/agent/worktree.js +59 -0
- package/dist/agent/worktree.js.map +1 -0
- package/dist/api/server.d.ts +30 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +135 -0
- package/dist/api/server.js.map +1 -0
- package/dist/cli/connection-test.d.ts +14 -0
- package/dist/cli/connection-test.d.ts.map +1 -0
- package/dist/cli/connection-test.js +82 -0
- package/dist/cli/connection-test.js.map +1 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +287 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/logs.d.ts +5 -0
- package/dist/cli/logs.d.ts.map +1 -0
- package/dist/cli/logs.js +32 -0
- package/dist/cli/logs.js.map +1 -0
- package/dist/cli/project.d.ts +3 -0
- package/dist/cli/project.d.ts.map +1 -0
- package/dist/cli/project.js +58 -0
- package/dist/cli/project.js.map +1 -0
- package/dist/cli/start.d.ts +5 -0
- package/dist/cli/start.d.ts.map +1 -0
- package/dist/cli/start.js +82 -0
- package/dist/cli/start.js.map +1 -0
- package/dist/cli/status.d.ts +8 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +39 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/stop.d.ts +2 -0
- package/dist/cli/stop.d.ts.map +1 -0
- package/dist/cli/stop.js +28 -0
- package/dist/cli/stop.js.map +1 -0
- package/dist/config/keychain.d.ts +4 -0
- package/dist/config/keychain.d.ts.map +1 -0
- package/dist/config/keychain.js +54 -0
- package/dist/config/keychain.js.map +1 -0
- package/dist/config/schema.d.ts +60 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +88 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/store.d.ts +8 -0
- package/dist/config/store.d.ts.map +1 -0
- package/dist/config/store.js +48 -0
- package/dist/config/store.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/messenger/adapter.d.ts +30 -0
- package/dist/messenger/adapter.d.ts.map +1 -0
- package/dist/messenger/adapter.js +2 -0
- package/dist/messenger/adapter.js.map +1 -0
- package/dist/messenger/factory.d.ts +4 -0
- package/dist/messenger/factory.d.ts.map +1 -0
- package/dist/messenger/factory.js +19 -0
- package/dist/messenger/factory.js.map +1 -0
- package/dist/messenger/slack.d.ts +21 -0
- package/dist/messenger/slack.d.ts.map +1 -0
- package/dist/messenger/slack.js +127 -0
- package/dist/messenger/slack.js.map +1 -0
- package/dist/messenger/telegram.d.ts +21 -0
- package/dist/messenger/telegram.d.ts.map +1 -0
- package/dist/messenger/telegram.js +118 -0
- package/dist/messenger/telegram.js.map +1 -0
- package/dist/security/audit.d.ts +15 -0
- package/dist/security/audit.d.ts.map +1 -0
- package/dist/security/audit.js +41 -0
- package/dist/security/audit.js.map +1 -0
- package/dist/security/auth.d.ts +8 -0
- package/dist/security/auth.d.ts.map +1 -0
- package/dist/security/auth.js +15 -0
- package/dist/security/auth.js.map +1 -0
- package/dist/security/prompt-guard.d.ts +11 -0
- package/dist/security/prompt-guard.d.ts.map +1 -0
- package/dist/security/prompt-guard.js +30 -0
- package/dist/security/prompt-guard.js.map +1 -0
- package/dist/security/sandbox.d.ts +11 -0
- package/dist/security/sandbox.d.ts.map +1 -0
- package/dist/security/sandbox.js +76 -0
- package/dist/security/sandbox.js.map +1 -0
- package/dist/tools/browser.d.ts +61 -0
- package/dist/tools/browser.d.ts.map +1 -0
- package/dist/tools/browser.js +196 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/calendar.d.ts +36 -0
- package/dist/tools/calendar.d.ts.map +1 -0
- package/dist/tools/calendar.js +146 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/clipboard.d.ts +13 -0
- package/dist/tools/clipboard.d.ts.map +1 -0
- package/dist/tools/clipboard.js +47 -0
- package/dist/tools/clipboard.js.map +1 -0
- package/dist/tools/email.d.ts +52 -0
- package/dist/tools/email.d.ts.map +1 -0
- package/dist/tools/email.js +211 -0
- package/dist/tools/email.js.map +1 -0
- package/dist/tools/figma-mcp.d.ts +30 -0
- package/dist/tools/figma-mcp.d.ts.map +1 -0
- package/dist/tools/figma-mcp.js +58 -0
- package/dist/tools/figma-mcp.js.map +1 -0
- package/dist/tools/figma.d.ts +52 -0
- package/dist/tools/figma.d.ts.map +1 -0
- package/dist/tools/figma.js +62 -0
- package/dist/tools/figma.js.map +1 -0
- package/dist/tools/filesystem.d.ts +9 -0
- package/dist/tools/filesystem.d.ts.map +1 -0
- package/dist/tools/filesystem.js +62 -0
- package/dist/tools/filesystem.js.map +1 -0
- package/dist/tools/github.d.ts +36 -0
- package/dist/tools/github.d.ts.map +1 -0
- package/dist/tools/github.js +93 -0
- package/dist/tools/github.js.map +1 -0
- package/dist/tools/image.d.ts +14 -0
- package/dist/tools/image.d.ts.map +1 -0
- package/dist/tools/image.js +57 -0
- package/dist/tools/image.js.map +1 -0
- package/dist/tools/linear.d.ts +41 -0
- package/dist/tools/linear.d.ts.map +1 -0
- package/dist/tools/linear.js +87 -0
- package/dist/tools/linear.js.map +1 -0
- package/dist/tools/notification.d.ts +8 -0
- package/dist/tools/notification.d.ts.map +1 -0
- package/dist/tools/notification.js +49 -0
- package/dist/tools/notification.js.map +1 -0
- package/dist/tools/notion.d.ts +23 -0
- package/dist/tools/notion.d.ts.map +1 -0
- package/dist/tools/notion.js +91 -0
- package/dist/tools/notion.js.map +1 -0
- package/dist/tools/obsidian.d.ts +17 -0
- package/dist/tools/obsidian.d.ts.map +1 -0
- package/dist/tools/obsidian.js +100 -0
- package/dist/tools/obsidian.js.map +1 -0
- package/dist/tools/shell.d.ts +10 -0
- package/dist/tools/shell.d.ts.map +1 -0
- package/dist/tools/shell.js +37 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/voice.d.ts +28 -0
- package/dist/tools/voice.d.ts.map +1 -0
- package/dist/tools/voice.js +88 -0
- package/dist/tools/voice.js.map +1 -0
- package/dist/tools/vscode.d.ts +42 -0
- package/dist/tools/vscode.d.ts.map +1 -0
- package/dist/tools/vscode.js +80 -0
- package/dist/tools/vscode.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/security/sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAGzB;;GAEG;AACH,SAAS,UAAU,CAAC,CAAS;IAC3B,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,MAAmB;IACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IAEtD,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAEzE,gBAAgB;IAChB,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1D,IAAI,QAAQ,KAAK,eAAe,IAAI,QAAQ,CAAC,UAAU,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACpF,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,WAAW;IACX,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1D,IAAI,QAAQ,KAAK,eAAe,IAAI,QAAQ,CAAC,UAAU,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACpF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,gBAAgB,GAAa;IACjC,8CAA8C,EAAG,uBAAuB;IACxE,wBAAwB,EAA4B,yBAAyB;IAC7E,wBAAwB,EAA4B,YAAY;IAChE,aAAa,EAAwC,YAAY;IACjE,aAAa,EAAwC,qBAAqB;IAC1E,QAAQ,EAA6C,gBAAgB;IACrE,mBAAmB,EAAkC,cAAc;IACnE,gBAAgB,EAAqC,YAAY;CAClE,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,kBAAkB,GAAG;IACzB,iBAAiB;IACjB,iBAAiB;IACjB,sBAAsB;IACtB,oBAAoB;IACpB,gBAAgB;IAChB,mBAAmB;IACnB,mBAAmB;IACnB,uBAAuB;IACvB,cAAc;IACd,WAAW;CACZ,CAAC;AAEF,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAA4B,CAAC;IACzD,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACrC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export declare function saveStorageState(): Promise<void>;
|
|
2
|
+
/**
|
|
3
|
+
* Launches a Chromium browser with an isolated profile.
|
|
4
|
+
* Restores session cookies/localStorage from encrypted storage if available.
|
|
5
|
+
*/
|
|
6
|
+
export declare function launchBrowser(): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Closes the browser and cleans up.
|
|
9
|
+
* Saves session cookies/localStorage to encrypted storage before closing.
|
|
10
|
+
*/
|
|
11
|
+
export declare function closeBrowser(): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Navigates to a URL and returns the page title.
|
|
14
|
+
*/
|
|
15
|
+
export declare function navigateTo(url: string): Promise<{
|
|
16
|
+
title: string;
|
|
17
|
+
url: string;
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* Clicks an element matching the selector.
|
|
21
|
+
*/
|
|
22
|
+
export declare function clickElement(selector: string): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Types text into an element matching the selector.
|
|
25
|
+
*/
|
|
26
|
+
export declare function typeText(selector: string, text: string): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Submits a form by clicking a submit button or pressing Enter.
|
|
29
|
+
*/
|
|
30
|
+
export declare function submitForm(selector?: string): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Extracts visible text content from the page or a specific selector.
|
|
33
|
+
*/
|
|
34
|
+
export declare function extractText(selector?: string): Promise<string>;
|
|
35
|
+
/**
|
|
36
|
+
* Extracts table data from a <table> element.
|
|
37
|
+
*/
|
|
38
|
+
export declare function extractTable(selector?: string): Promise<string[][]>;
|
|
39
|
+
/**
|
|
40
|
+
* Takes a screenshot and saves it to the specified path.
|
|
41
|
+
* Returns the file path of the screenshot.
|
|
42
|
+
*/
|
|
43
|
+
export declare function takeScreenshot(outputPath?: string): Promise<string>;
|
|
44
|
+
/**
|
|
45
|
+
* Waits for a download and saves it to the downloads directory.
|
|
46
|
+
* Returns the saved file path.
|
|
47
|
+
*/
|
|
48
|
+
export declare function waitForDownload(action: () => Promise<void>): Promise<string>;
|
|
49
|
+
/**
|
|
50
|
+
* Returns the current page URL.
|
|
51
|
+
*/
|
|
52
|
+
export declare function getCurrentUrl(): string;
|
|
53
|
+
/**
|
|
54
|
+
* Waits for navigation or network idle after an action.
|
|
55
|
+
*/
|
|
56
|
+
export declare function waitForLoad(state?: 'load' | 'domcontentloaded' | 'networkidle'): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Returns browser status.
|
|
59
|
+
*/
|
|
60
|
+
export declare function isBrowserRunning(): boolean;
|
|
61
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/tools/browser.ts"],"names":[],"mappings":"AAsDA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMtD;AAED;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAcnD;AAED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAWlD;AAOD;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAIrF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlE;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOjE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQpE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,GAAE,MAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAQlF;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMzE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAWlF;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,GAAE,MAAM,GAAG,kBAAkB,GAAG,aAAkC,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxH;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { chromium } from 'playwright';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import fs from 'node:fs/promises';
|
|
4
|
+
import crypto from 'node:crypto';
|
|
5
|
+
import { getPilotDir } from '../config/store.js';
|
|
6
|
+
let browser = null;
|
|
7
|
+
let context = null;
|
|
8
|
+
let page = null;
|
|
9
|
+
function getUserDataDir() {
|
|
10
|
+
return path.join(getPilotDir(), 'browser-profile');
|
|
11
|
+
}
|
|
12
|
+
function getDownloadDir() {
|
|
13
|
+
return path.join(getPilotDir(), 'downloads');
|
|
14
|
+
}
|
|
15
|
+
function getSessionPath() {
|
|
16
|
+
return path.join(getUserDataDir(), 'session.enc');
|
|
17
|
+
}
|
|
18
|
+
// Derive encryption key from machine-specific seed
|
|
19
|
+
function deriveKey() {
|
|
20
|
+
const seed = `pilot-ai-session-${process.env.USER ?? 'default'}-${getPilotDir()}`;
|
|
21
|
+
return crypto.createHash('sha256').update(seed).digest();
|
|
22
|
+
}
|
|
23
|
+
function encryptData(data) {
|
|
24
|
+
const key = deriveKey();
|
|
25
|
+
const iv = crypto.randomBytes(16);
|
|
26
|
+
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
|
|
27
|
+
const encrypted = Buffer.concat([cipher.update(data, 'utf-8'), cipher.final()]);
|
|
28
|
+
return Buffer.concat([iv, encrypted]);
|
|
29
|
+
}
|
|
30
|
+
function decryptData(encrypted) {
|
|
31
|
+
const key = deriveKey();
|
|
32
|
+
const iv = encrypted.subarray(0, 16);
|
|
33
|
+
const data = encrypted.subarray(16);
|
|
34
|
+
const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
|
|
35
|
+
return Buffer.concat([decipher.update(data), decipher.final()]).toString('utf-8');
|
|
36
|
+
}
|
|
37
|
+
async function loadStorageState() {
|
|
38
|
+
try {
|
|
39
|
+
const encrypted = await fs.readFile(getSessionPath());
|
|
40
|
+
const json = decryptData(encrypted);
|
|
41
|
+
return JSON.parse(json);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export async function saveStorageState() {
|
|
48
|
+
if (!context)
|
|
49
|
+
return;
|
|
50
|
+
const state = await context.storageState();
|
|
51
|
+
const encrypted = encryptData(JSON.stringify(state));
|
|
52
|
+
await fs.mkdir(getUserDataDir(), { recursive: true });
|
|
53
|
+
await fs.writeFile(getSessionPath(), encrypted, { mode: 0o600 });
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Launches a Chromium browser with an isolated profile.
|
|
57
|
+
* Restores session cookies/localStorage from encrypted storage if available.
|
|
58
|
+
*/
|
|
59
|
+
export async function launchBrowser() {
|
|
60
|
+
if (browser)
|
|
61
|
+
return;
|
|
62
|
+
browser = await chromium.launch({ headless: true });
|
|
63
|
+
const stored = await loadStorageState();
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
65
|
+
const contextOptions = {
|
|
66
|
+
userAgent: 'PilotAI/1.0',
|
|
67
|
+
acceptDownloads: true,
|
|
68
|
+
};
|
|
69
|
+
if (stored)
|
|
70
|
+
contextOptions.storageState = stored;
|
|
71
|
+
context = await browser.newContext(contextOptions);
|
|
72
|
+
page = await context.newPage();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Closes the browser and cleans up.
|
|
76
|
+
* Saves session cookies/localStorage to encrypted storage before closing.
|
|
77
|
+
*/
|
|
78
|
+
export async function closeBrowser() {
|
|
79
|
+
if (context) {
|
|
80
|
+
await saveStorageState();
|
|
81
|
+
await context.close();
|
|
82
|
+
context = null;
|
|
83
|
+
}
|
|
84
|
+
if (browser) {
|
|
85
|
+
await browser.close();
|
|
86
|
+
browser = null;
|
|
87
|
+
}
|
|
88
|
+
page = null;
|
|
89
|
+
}
|
|
90
|
+
function ensurePage() {
|
|
91
|
+
if (!page)
|
|
92
|
+
throw new Error('Browser not launched. Call launchBrowser() first.');
|
|
93
|
+
return page;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Navigates to a URL and returns the page title.
|
|
97
|
+
*/
|
|
98
|
+
export async function navigateTo(url) {
|
|
99
|
+
const p = ensurePage();
|
|
100
|
+
await p.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
|
|
101
|
+
return { title: await p.title(), url: p.url() };
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Clicks an element matching the selector.
|
|
105
|
+
*/
|
|
106
|
+
export async function clickElement(selector) {
|
|
107
|
+
const p = ensurePage();
|
|
108
|
+
await p.click(selector, { timeout: 10000 });
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Types text into an element matching the selector.
|
|
112
|
+
*/
|
|
113
|
+
export async function typeText(selector, text) {
|
|
114
|
+
const p = ensurePage();
|
|
115
|
+
await p.fill(selector, text, { timeout: 10000 });
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Submits a form by clicking a submit button or pressing Enter.
|
|
119
|
+
*/
|
|
120
|
+
export async function submitForm(selector) {
|
|
121
|
+
const p = ensurePage();
|
|
122
|
+
if (selector) {
|
|
123
|
+
await p.click(selector, { timeout: 10000 });
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
await p.keyboard.press('Enter');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Extracts visible text content from the page or a specific selector.
|
|
131
|
+
*/
|
|
132
|
+
export async function extractText(selector) {
|
|
133
|
+
const p = ensurePage();
|
|
134
|
+
if (selector) {
|
|
135
|
+
const element = await p.$(selector);
|
|
136
|
+
if (!element)
|
|
137
|
+
throw new Error(`Element not found: ${selector}`);
|
|
138
|
+
return (await element.textContent()) ?? '';
|
|
139
|
+
}
|
|
140
|
+
return p.innerText('body');
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Extracts table data from a <table> element.
|
|
144
|
+
*/
|
|
145
|
+
export async function extractTable(selector = 'table') {
|
|
146
|
+
const p = ensurePage();
|
|
147
|
+
return p.$$eval(`${selector} tr`, (rows) => rows.map((row) => {
|
|
148
|
+
const cells = row.querySelectorAll('td, th');
|
|
149
|
+
return Array.from(cells).map((cell) => cell.textContent?.trim() ?? '');
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Takes a screenshot and saves it to the specified path.
|
|
154
|
+
* Returns the file path of the screenshot.
|
|
155
|
+
*/
|
|
156
|
+
export async function takeScreenshot(outputPath) {
|
|
157
|
+
const p = ensurePage();
|
|
158
|
+
const filePath = outputPath ?? path.join(getPilotDir(), 'screenshots', `screenshot-${Date.now()}.png`);
|
|
159
|
+
await p.screenshot({ path: filePath, fullPage: false });
|
|
160
|
+
return filePath;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Waits for a download and saves it to the downloads directory.
|
|
164
|
+
* Returns the saved file path.
|
|
165
|
+
*/
|
|
166
|
+
export async function waitForDownload(action) {
|
|
167
|
+
const p = ensurePage();
|
|
168
|
+
const [download] = await Promise.all([
|
|
169
|
+
p.waitForEvent('download', { timeout: 30000 }),
|
|
170
|
+
action(),
|
|
171
|
+
]);
|
|
172
|
+
const downloadDir = getDownloadDir();
|
|
173
|
+
const filePath = path.join(downloadDir, download.suggestedFilename());
|
|
174
|
+
await download.saveAs(filePath);
|
|
175
|
+
return filePath;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Returns the current page URL.
|
|
179
|
+
*/
|
|
180
|
+
export function getCurrentUrl() {
|
|
181
|
+
return ensurePage().url();
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Waits for navigation or network idle after an action.
|
|
185
|
+
*/
|
|
186
|
+
export async function waitForLoad(state = 'domcontentloaded') {
|
|
187
|
+
const p = ensurePage();
|
|
188
|
+
await p.waitForLoadState(state, { timeout: 30000 });
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Returns browser status.
|
|
192
|
+
*/
|
|
193
|
+
export function isBrowserRunning() {
|
|
194
|
+
return browser !== null && browser.isConnected();
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/tools/browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface CalendarEvent {
|
|
2
|
+
title: string;
|
|
3
|
+
startDate: string;
|
|
4
|
+
endDate: string;
|
|
5
|
+
location?: string;
|
|
6
|
+
notes?: string;
|
|
7
|
+
calendar?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Lists events for a date range using AppleScript.
|
|
11
|
+
*/
|
|
12
|
+
export declare function listEvents(startDate: Date, endDate: Date): Promise<CalendarEvent[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Gets today's events.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getTodayEvents(): Promise<CalendarEvent[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Gets this week's events.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getWeekEvents(): Promise<CalendarEvent[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Creates a new calendar event.
|
|
23
|
+
*/
|
|
24
|
+
export declare function createEvent(event: CalendarEvent): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Deletes an event by title and date.
|
|
27
|
+
*/
|
|
28
|
+
export declare function deleteEvent(title: string, date: Date): Promise<boolean>;
|
|
29
|
+
/**
|
|
30
|
+
* Finds free time blocks for a given date.
|
|
31
|
+
*/
|
|
32
|
+
export declare function findFreeTime(date: Date, minMinutes?: number): Promise<Array<{
|
|
33
|
+
start: Date;
|
|
34
|
+
end: Date;
|
|
35
|
+
}>>;
|
|
36
|
+
//# sourceMappingURL=calendar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../src/tools/calendar.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAmCzF;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAK/D;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAU9D;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAarE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAoB7E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,GAAE,MAAW,GAAG,OAAO,CAAC,KAAK,CAAC;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC,CA2BlH"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* macOS Calendar integration via AppleScript + optional Google Calendar API.
|
|
3
|
+
* Primary: Apple Calendar via osascript (no OAuth needed)
|
|
4
|
+
*/
|
|
5
|
+
import { executeShell } from './shell.js';
|
|
6
|
+
/**
|
|
7
|
+
* Lists events for a date range using AppleScript.
|
|
8
|
+
*/
|
|
9
|
+
export async function listEvents(startDate, endDate) {
|
|
10
|
+
const start = formatAppleScriptDate(startDate);
|
|
11
|
+
const end = formatAppleScriptDate(endDate);
|
|
12
|
+
const script = `
|
|
13
|
+
tell application "Calendar"
|
|
14
|
+
set output to ""
|
|
15
|
+
set startD to date "${start}"
|
|
16
|
+
set endD to date "${end}"
|
|
17
|
+
repeat with cal in calendars
|
|
18
|
+
set calName to name of cal
|
|
19
|
+
set evts to (every event of cal whose start date >= startD and start date <= endD)
|
|
20
|
+
repeat with e in evts
|
|
21
|
+
set output to output & calName & " | " & summary of e & " | " & (start date of e as string) & " | " & (end date of e as string) & linefeed
|
|
22
|
+
end repeat
|
|
23
|
+
end repeat
|
|
24
|
+
return output
|
|
25
|
+
end tell`;
|
|
26
|
+
const result = await executeShell(`osascript -e '${escapeAppleScript(script)}'`);
|
|
27
|
+
if (result.exitCode !== 0)
|
|
28
|
+
return [];
|
|
29
|
+
return result.stdout
|
|
30
|
+
.split('\n')
|
|
31
|
+
.filter(Boolean)
|
|
32
|
+
.map((line) => {
|
|
33
|
+
const [calendar, title, startStr, endStr] = line.split(' | ');
|
|
34
|
+
return {
|
|
35
|
+
title: title?.trim() ?? '',
|
|
36
|
+
startDate: startStr?.trim() ?? '',
|
|
37
|
+
endDate: endStr?.trim() ?? '',
|
|
38
|
+
calendar: calendar?.trim(),
|
|
39
|
+
};
|
|
40
|
+
})
|
|
41
|
+
.filter((e) => e.title);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Gets today's events.
|
|
45
|
+
*/
|
|
46
|
+
export async function getTodayEvents() {
|
|
47
|
+
const now = new Date();
|
|
48
|
+
const start = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0);
|
|
49
|
+
const end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59);
|
|
50
|
+
return listEvents(start, end);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Gets this week's events.
|
|
54
|
+
*/
|
|
55
|
+
export async function getWeekEvents() {
|
|
56
|
+
const now = new Date();
|
|
57
|
+
const day = now.getDay();
|
|
58
|
+
const start = new Date(now);
|
|
59
|
+
start.setDate(now.getDate() - day);
|
|
60
|
+
start.setHours(0, 0, 0, 0);
|
|
61
|
+
const end = new Date(start);
|
|
62
|
+
end.setDate(start.getDate() + 6);
|
|
63
|
+
end.setHours(23, 59, 59, 999);
|
|
64
|
+
return listEvents(start, end);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Creates a new calendar event.
|
|
68
|
+
*/
|
|
69
|
+
export async function createEvent(event) {
|
|
70
|
+
const cal = event.calendar ?? 'Calendar';
|
|
71
|
+
const script = `
|
|
72
|
+
tell application "Calendar"
|
|
73
|
+
tell calendar "${escapeAS(cal)}"
|
|
74
|
+
set newEvent to make new event with properties {summary:"${escapeAS(event.title)}", start date:date "${event.startDate}", end date:date "${event.endDate}"}
|
|
75
|
+
${event.location ? `set location of newEvent to "${escapeAS(event.location)}"` : ''}
|
|
76
|
+
${event.notes ? `set description of newEvent to "${escapeAS(event.notes)}"` : ''}
|
|
77
|
+
end tell
|
|
78
|
+
end tell`;
|
|
79
|
+
const result = await executeShell(`osascript -e '${escapeAppleScript(script)}'`);
|
|
80
|
+
if (result.exitCode !== 0)
|
|
81
|
+
throw new Error(`Failed to create event: ${result.stderr}`);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Deletes an event by title and date.
|
|
85
|
+
*/
|
|
86
|
+
export async function deleteEvent(title, date) {
|
|
87
|
+
const dateStr = formatAppleScriptDate(date);
|
|
88
|
+
const nextDay = new Date(date);
|
|
89
|
+
nextDay.setDate(date.getDate() + 1);
|
|
90
|
+
const nextStr = formatAppleScriptDate(nextDay);
|
|
91
|
+
const script = `
|
|
92
|
+
tell application "Calendar"
|
|
93
|
+
repeat with cal in calendars
|
|
94
|
+
set evts to (every event of cal whose summary is "${escapeAS(title)}" and start date >= date "${dateStr}" and start date < date "${nextStr}")
|
|
95
|
+
repeat with e in evts
|
|
96
|
+
delete e
|
|
97
|
+
return "deleted"
|
|
98
|
+
end repeat
|
|
99
|
+
end repeat
|
|
100
|
+
return "not found"
|
|
101
|
+
end tell`;
|
|
102
|
+
const result = await executeShell(`osascript -e '${escapeAppleScript(script)}'`);
|
|
103
|
+
return result.stdout.includes('deleted');
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Finds free time blocks for a given date.
|
|
107
|
+
*/
|
|
108
|
+
export async function findFreeTime(date, minMinutes = 30) {
|
|
109
|
+
const dayStart = new Date(date);
|
|
110
|
+
dayStart.setHours(9, 0, 0, 0);
|
|
111
|
+
const dayEnd = new Date(date);
|
|
112
|
+
dayEnd.setHours(18, 0, 0, 0);
|
|
113
|
+
const events = await listEvents(dayStart, dayEnd);
|
|
114
|
+
const busy = events
|
|
115
|
+
.map((e) => ({ start: new Date(e.startDate).getTime(), end: new Date(e.endDate).getTime() }))
|
|
116
|
+
.filter((e) => !isNaN(e.start) && !isNaN(e.end))
|
|
117
|
+
.sort((a, b) => a.start - b.start);
|
|
118
|
+
const free = [];
|
|
119
|
+
let cursor = dayStart.getTime();
|
|
120
|
+
for (const slot of busy) {
|
|
121
|
+
if (slot.start > cursor && (slot.start - cursor) >= minMinutes * 60_000) {
|
|
122
|
+
free.push({ start: new Date(cursor), end: new Date(slot.start) });
|
|
123
|
+
}
|
|
124
|
+
cursor = Math.max(cursor, slot.end);
|
|
125
|
+
}
|
|
126
|
+
if (dayEnd.getTime() > cursor && (dayEnd.getTime() - cursor) >= minMinutes * 60_000) {
|
|
127
|
+
free.push({ start: new Date(cursor), end: dayEnd });
|
|
128
|
+
}
|
|
129
|
+
return free;
|
|
130
|
+
}
|
|
131
|
+
function formatAppleScriptDate(d) {
|
|
132
|
+
// AppleScript date format depends on locale, use a parseable format
|
|
133
|
+
return d.toLocaleDateString('en-US', {
|
|
134
|
+
weekday: 'long',
|
|
135
|
+
year: 'numeric',
|
|
136
|
+
month: 'long',
|
|
137
|
+
day: 'numeric',
|
|
138
|
+
}) + ` ${d.toLocaleTimeString('en-US', { hour12: true })}`;
|
|
139
|
+
}
|
|
140
|
+
function escapeAS(str) {
|
|
141
|
+
return str.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
142
|
+
}
|
|
143
|
+
function escapeAppleScript(script) {
|
|
144
|
+
return script.replace(/'/g, "'\\''");
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=calendar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../src/tools/calendar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function readClipboard(): Promise<string>;
|
|
2
|
+
export declare function writeClipboard(text: string): Promise<void>;
|
|
3
|
+
export declare function takeScreenshot(outputPath?: string): Promise<string>;
|
|
4
|
+
export declare function takeWindowScreenshot(outputPath?: string): Promise<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Takes a screenshot and returns it as a data URL for Claude Vision analysis.
|
|
7
|
+
*/
|
|
8
|
+
export declare function captureScreenForVision(): Promise<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Takes a window screenshot and returns it as a data URL for Claude Vision analysis.
|
|
11
|
+
*/
|
|
12
|
+
export declare function captureWindowForVision(): Promise<string>;
|
|
13
|
+
//# sourceMappingURL=clipboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/tools/clipboard.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAIrD;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhE;AAED,wBAAsB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKzE;AAED,wBAAsB,oBAAoB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM/E;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CAG9D;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CAG9D"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { executeShell } from './shell.js';
|
|
2
|
+
import { imageToDataUrl } from './image.js';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
export async function readClipboard() {
|
|
6
|
+
const result = await executeShell('pbpaste');
|
|
7
|
+
if (result.exitCode !== 0)
|
|
8
|
+
throw new Error(`Failed to read clipboard: ${result.stderr}`);
|
|
9
|
+
return result.stdout;
|
|
10
|
+
}
|
|
11
|
+
export async function writeClipboard(text) {
|
|
12
|
+
// Use printf to avoid echo adding newline issues with special chars
|
|
13
|
+
const escaped = text.replace(/\\/g, '\\\\').replace(/'/g, "'\\''");
|
|
14
|
+
const result = await executeShell(`printf '%s' '${escaped}' | pbcopy`);
|
|
15
|
+
if (result.exitCode !== 0)
|
|
16
|
+
throw new Error(`Failed to write clipboard: ${result.stderr}`);
|
|
17
|
+
}
|
|
18
|
+
export async function takeScreenshot(outputPath) {
|
|
19
|
+
const filePath = outputPath ?? path.join(os.tmpdir(), `pilot-screenshot-${Date.now()}.png`);
|
|
20
|
+
const result = await executeShell(`screencapture -x ${filePath}`);
|
|
21
|
+
if (result.exitCode !== 0)
|
|
22
|
+
throw new Error(`Failed to take screenshot: ${result.stderr}`);
|
|
23
|
+
return filePath;
|
|
24
|
+
}
|
|
25
|
+
export async function takeWindowScreenshot(outputPath) {
|
|
26
|
+
const filePath = outputPath ?? path.join(os.tmpdir(), `pilot-window-${Date.now()}.png`);
|
|
27
|
+
// -w flag captures the frontmost window
|
|
28
|
+
const result = await executeShell(`screencapture -x -w ${filePath}`);
|
|
29
|
+
if (result.exitCode !== 0)
|
|
30
|
+
throw new Error(`Failed to take window screenshot: ${result.stderr}`);
|
|
31
|
+
return filePath;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Takes a screenshot and returns it as a data URL for Claude Vision analysis.
|
|
35
|
+
*/
|
|
36
|
+
export async function captureScreenForVision() {
|
|
37
|
+
const filePath = await takeScreenshot();
|
|
38
|
+
return imageToDataUrl(filePath);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Takes a window screenshot and returns it as a data URL for Claude Vision analysis.
|
|
42
|
+
*/
|
|
43
|
+
export async function captureWindowForVision() {
|
|
44
|
+
const filePath = await takeWindowScreenshot();
|
|
45
|
+
return imageToDataUrl(filePath);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=clipboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../../src/tools/clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACzF,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,oEAAoE;IACpE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,gBAAgB,OAAO,YAAY,CAAC,CAAC;IACvE,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAmB;IACtD,MAAM,QAAQ,GAAG,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC5F,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;IAClE,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1F,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,UAAmB;IAC5D,MAAM,QAAQ,GAAG,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxF,wCAAwC;IACxC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACjG,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,QAAQ,GAAG,MAAM,cAAc,EAAE,CAAC;IACxC,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,QAAQ,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAC9C,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface EmailConfig {
|
|
2
|
+
clientId: string;
|
|
3
|
+
clientSecret: string;
|
|
4
|
+
redirectUri?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface OAuthTokens {
|
|
7
|
+
accessToken: string;
|
|
8
|
+
refreshToken: string;
|
|
9
|
+
expiresAt: number;
|
|
10
|
+
}
|
|
11
|
+
export interface EmailMessage {
|
|
12
|
+
id: string;
|
|
13
|
+
threadId: string;
|
|
14
|
+
from: string;
|
|
15
|
+
to: string;
|
|
16
|
+
subject: string;
|
|
17
|
+
snippet: string;
|
|
18
|
+
date: string;
|
|
19
|
+
body?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface EmailDraft {
|
|
22
|
+
to: string;
|
|
23
|
+
subject: string;
|
|
24
|
+
body: string;
|
|
25
|
+
cc?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function configureEmail(cfg: EmailConfig): void;
|
|
28
|
+
export declare function loadTokens(): Promise<OAuthTokens | null>;
|
|
29
|
+
export declare function saveTokens(t: OAuthTokens): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Returns the OAuth2 authorization URL for user consent.
|
|
32
|
+
*/
|
|
33
|
+
export declare function getAuthUrl(): string;
|
|
34
|
+
/**
|
|
35
|
+
* Exchanges authorization code for tokens.
|
|
36
|
+
*/
|
|
37
|
+
export declare function exchangeCode(code: string): Promise<OAuthTokens>;
|
|
38
|
+
/**
|
|
39
|
+
* Refreshes the access token if expired.
|
|
40
|
+
*/
|
|
41
|
+
export declare function refreshAccessToken(): Promise<string>;
|
|
42
|
+
export declare function listMessages(query?: string, maxResults?: number): Promise<EmailMessage[]>;
|
|
43
|
+
export declare function getMessage(messageId: string): Promise<EmailMessage | null>;
|
|
44
|
+
/**
|
|
45
|
+
* Sends an email. This is a DANGEROUS action.
|
|
46
|
+
*/
|
|
47
|
+
export declare function sendEmail(draft: EmailDraft): Promise<string>;
|
|
48
|
+
/**
|
|
49
|
+
* Creates a draft without sending.
|
|
50
|
+
*/
|
|
51
|
+
export declare function createDraft(draft: EmailDraft): Promise<string>;
|
|
52
|
+
//# sourceMappingURL=email.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/tools/email.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAYD,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAErD;AAID,wBAAsB,UAAU,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAQ9D;AAED,wBAAsB,UAAU,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9D;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAKnC;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA0BrE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CA8B1D;AAaD,wBAAsB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,GAAE,MAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAgBnG;AAED,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAmChF;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBlE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBpE"}
|