@hasna/computer 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/LICENSE +189 -0
- package/README.md +151 -0
- package/dist/agent/loop.d.ts +7 -0
- package/dist/agent/loop.d.ts.map +1 -0
- package/dist/agent/safety.d.ts +15 -0
- package/dist/agent/safety.d.ts.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +12221 -0
- package/dist/db/index.d.ts +46 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/drivers/mac/index.d.ts +14 -0
- package/dist/drivers/mac/index.d.ts.map +1 -0
- package/dist/drivers/mac/input.d.ts +6 -0
- package/dist/drivers/mac/input.d.ts.map +1 -0
- package/dist/drivers/mac/screenshot.d.ts +15 -0
- package/dist/drivers/mac/screenshot.d.ts.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10012 -0
- package/dist/lib/config.d.ts +33 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/diff.d.ts +22 -0
- package/dist/lib/diff.d.ts.map +1 -0
- package/dist/lib/pricing.d.ts +18 -0
- package/dist/lib/pricing.d.ts.map +1 -0
- package/dist/lib/scale.d.ts +26 -0
- package/dist/lib/scale.d.ts.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +14063 -0
- package/dist/providers/anthropic.d.ts +25 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/index.d.ts +9 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/openai.d.ts +29 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +9921 -0
- package/dist/types/index.d.ts +175 -0
- package/dist/types/index.d.ts.map +1 -0
- package/helpers/scroll +0 -0
- package/helpers/scroll.swift +35 -0
- package/package.json +79 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Provider, SafetyConfig } from "../types/index.js";
|
|
2
|
+
/** Full configuration schema */
|
|
3
|
+
export interface ComputerConfig {
|
|
4
|
+
/** Default AI provider */
|
|
5
|
+
provider: Provider;
|
|
6
|
+
/** Default model (per provider) */
|
|
7
|
+
model?: string;
|
|
8
|
+
/** Maximum steps per task */
|
|
9
|
+
maxSteps: number;
|
|
10
|
+
/** Save screenshots to disk by default */
|
|
11
|
+
saveScreenshots: boolean;
|
|
12
|
+
/** Screenshots directory (default: ~/.hasna/computer/screenshots/<session>) */
|
|
13
|
+
screenshotsDir?: string;
|
|
14
|
+
/** Max screenshot width before sending to AI model */
|
|
15
|
+
screenshotMaxWidth: number;
|
|
16
|
+
/** REST API port */
|
|
17
|
+
port: number;
|
|
18
|
+
/** Safety rules */
|
|
19
|
+
safety: SafetyConfig;
|
|
20
|
+
}
|
|
21
|
+
/** Default configuration */
|
|
22
|
+
export declare const DEFAULT_CONFIG: ComputerConfig;
|
|
23
|
+
/** Load config from disk, merged with defaults */
|
|
24
|
+
export declare function loadConfig(): ComputerConfig;
|
|
25
|
+
/** Save config to disk */
|
|
26
|
+
export declare function saveConfig(config: ComputerConfig): void;
|
|
27
|
+
/** Get a single config value by dot path (e.g. "safety.blockedApps") */
|
|
28
|
+
export declare function getConfigValue(key: string): unknown;
|
|
29
|
+
/** Set a single config value by dot path */
|
|
30
|
+
export declare function setConfigValue(key: string, value: unknown): void;
|
|
31
|
+
/** Get config file path */
|
|
32
|
+
export declare function getConfigPath(): string;
|
|
33
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKhE,gCAAgC;AAChC,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,eAAe,EAAE,OAAO,CAAC;IACzB,+EAA+E;IAC/E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sDAAsD;IACtD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,4BAA4B;AAC5B,eAAO,MAAM,cAAc,EAAE,cAiB5B,CAAC;AAEF,kDAAkD;AAClD,wBAAgB,UAAU,IAAI,cAAc,CAW3C;AAED,0BAA0B;AAC1B,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAGvD;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CASnD;AAED,4CAA4C;AAC5C,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAmBhE;AAyBD,2BAA2B;AAC3B,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Screenshot } from "../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Simple average hash (aHash) for perceptual screenshot comparison.
|
|
4
|
+
* Computes a hash from the base64 PNG data that is similar for
|
|
5
|
+
* visually similar images. Not pixel-perfect, but fast and good
|
|
6
|
+
* enough to detect "the screen didn't change at all."
|
|
7
|
+
*
|
|
8
|
+
* We sample evenly spaced bytes from the raw base64 to build
|
|
9
|
+
* a lightweight fingerprint without decoding the full image.
|
|
10
|
+
*/
|
|
11
|
+
export declare function computeScreenHash(screenshot: Screenshot): string;
|
|
12
|
+
/**
|
|
13
|
+
* Compare two screenshot hashes and return a similarity ratio (0-1).
|
|
14
|
+
* 1.0 = identical, 0.0 = completely different.
|
|
15
|
+
*/
|
|
16
|
+
export declare function compareHashes(hash1: string, hash2: string): number;
|
|
17
|
+
/**
|
|
18
|
+
* Check if two screenshots are effectively the same.
|
|
19
|
+
* Default threshold: 0.98 (98% similar = same screen).
|
|
20
|
+
*/
|
|
21
|
+
export declare function screenshotsMatch(prev: Screenshot, curr: Screenshot, threshold?: number): boolean;
|
|
22
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/lib/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAUhE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CASlE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,EAChB,SAAS,GAAE,MAAa,GACvB,OAAO,CAIT"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculate cost in USD for a given model and token counts.
|
|
3
|
+
*/
|
|
4
|
+
export declare function calculateCost(model: string, tokensIn: number, tokensOut: number): number;
|
|
5
|
+
/**
|
|
6
|
+
* Format a cost as a human-readable string.
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatCost(cost: number): string;
|
|
9
|
+
/**
|
|
10
|
+
* Get step cost for display (tokens in this step → cost string).
|
|
11
|
+
*/
|
|
12
|
+
export declare function stepCost(model: string, tokensIn: number, tokensOut: number): string;
|
|
13
|
+
/** Get all known model pricings */
|
|
14
|
+
export declare function listPricing(): Record<string, {
|
|
15
|
+
input: number;
|
|
16
|
+
output: number;
|
|
17
|
+
}>;
|
|
18
|
+
//# sourceMappingURL=pricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/lib/pricing.ts"],"names":[],"mappings":"AAoBA;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,MAAM,CAER;AAiBD,mCAAmC;AACnC,wBAAgB,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAE/E"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Screenshot, ScreenSize } from "../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Recommended max resolutions for AI models.
|
|
4
|
+
* Anthropic docs say resolutions above XGA/WXGA hurt accuracy and speed.
|
|
5
|
+
*/
|
|
6
|
+
export declare const RECOMMENDED_WIDTHS: {
|
|
7
|
+
/** XGA: 1024x768 (4:3) — most conservative, best for accuracy */
|
|
8
|
+
readonly xga: 1024;
|
|
9
|
+
/** WXGA: 1280x800 (16:10) — good balance */
|
|
10
|
+
readonly wxga: 1280;
|
|
11
|
+
/** HD: 1366x768 (16:9) — wider but still reasonable */
|
|
12
|
+
readonly hd: 1366;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Scale a screenshot down if it exceeds maxWidth.
|
|
16
|
+
* Uses macOS `sips` (built-in, zero dependencies).
|
|
17
|
+
* Returns a new Screenshot with scaled base64 data and updated size.
|
|
18
|
+
* If the screenshot is already smaller than maxWidth, returns it unchanged.
|
|
19
|
+
*/
|
|
20
|
+
export declare function scaleScreenshot(screenshot: Screenshot, maxWidth?: number): Promise<Screenshot>;
|
|
21
|
+
/**
|
|
22
|
+
* Calculate the scaled dimensions for a display size.
|
|
23
|
+
* Used to tell the AI model what resolution the screenshot is at.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getScaledSize(original: ScreenSize, maxWidth?: number): ScreenSize;
|
|
26
|
+
//# sourceMappingURL=scale.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scale.d.ts","sourceRoot":"","sources":["../../src/lib/scale.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEhE;;;GAGG;AACH,eAAO,MAAM,kBAAkB;IAC7B,iEAAiE;;IAEjE,4CAA4C;;IAE5C,uDAAuD;;CAE/C,CAAC;AAIX;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,UAAU,EACtB,QAAQ,GAAE,MAA0B,GACnC,OAAO,CAAC,UAAU,CAAC,CAmDrB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,UAAU,EACpB,QAAQ,GAAE,MAA0B,GACnC,UAAU,CAOZ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":""}
|