@skillful-agents/agent-computer 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +458 -0
- package/bin/ac-core-darwin-arm64 +0 -0
- package/bin/ac-core-darwin-x64 +0 -0
- package/bin/ac-core-win32-arm64.exe +0 -0
- package/bin/ac-core-win32-x64.exe +0 -0
- package/dist/bin/ac.d.ts +3 -0
- package/dist/bin/ac.d.ts.map +1 -0
- package/dist/bin/ac.js +126 -0
- package/dist/bin/ac.js.map +1 -0
- package/dist/src/bridge.d.ts +69 -0
- package/dist/src/bridge.d.ts.map +1 -0
- package/dist/src/bridge.js +687 -0
- package/dist/src/bridge.js.map +1 -0
- package/dist/src/cdp/ax-tree.d.ts +19 -0
- package/dist/src/cdp/ax-tree.d.ts.map +1 -0
- package/dist/src/cdp/ax-tree.js +159 -0
- package/dist/src/cdp/ax-tree.js.map +1 -0
- package/dist/src/cdp/bounds.d.ts +25 -0
- package/dist/src/cdp/bounds.d.ts.map +1 -0
- package/dist/src/cdp/bounds.js +62 -0
- package/dist/src/cdp/bounds.js.map +1 -0
- package/dist/src/cdp/client.d.ts +115 -0
- package/dist/src/cdp/client.d.ts.map +1 -0
- package/dist/src/cdp/client.js +269 -0
- package/dist/src/cdp/client.js.map +1 -0
- package/dist/src/cdp/connection.d.ts +25 -0
- package/dist/src/cdp/connection.d.ts.map +1 -0
- package/dist/src/cdp/connection.js +249 -0
- package/dist/src/cdp/connection.js.map +1 -0
- package/dist/src/cdp/diff.d.ts +17 -0
- package/dist/src/cdp/diff.d.ts.map +1 -0
- package/dist/src/cdp/diff.js +52 -0
- package/dist/src/cdp/diff.js.map +1 -0
- package/dist/src/cdp/discovery.d.ts +8 -0
- package/dist/src/cdp/discovery.d.ts.map +1 -0
- package/dist/src/cdp/discovery.js +54 -0
- package/dist/src/cdp/discovery.js.map +1 -0
- package/dist/src/cdp/index.d.ts +12 -0
- package/dist/src/cdp/index.d.ts.map +1 -0
- package/dist/src/cdp/index.js +10 -0
- package/dist/src/cdp/index.js.map +1 -0
- package/dist/src/cdp/interactions.d.ts +47 -0
- package/dist/src/cdp/interactions.d.ts.map +1 -0
- package/dist/src/cdp/interactions.js +298 -0
- package/dist/src/cdp/interactions.js.map +1 -0
- package/dist/src/cdp/port-manager.d.ts +3 -0
- package/dist/src/cdp/port-manager.d.ts.map +1 -0
- package/dist/src/cdp/port-manager.js +33 -0
- package/dist/src/cdp/port-manager.js.map +1 -0
- package/dist/src/cdp/role-map.d.ts +8 -0
- package/dist/src/cdp/role-map.d.ts.map +1 -0
- package/dist/src/cdp/role-map.js +99 -0
- package/dist/src/cdp/role-map.js.map +1 -0
- package/dist/src/cdp/types.d.ts +53 -0
- package/dist/src/cdp/types.d.ts.map +1 -0
- package/dist/src/cdp/types.js +2 -0
- package/dist/src/cdp/types.js.map +1 -0
- package/dist/src/cli/commands/apps.d.ts +2 -0
- package/dist/src/cli/commands/apps.d.ts.map +1 -0
- package/dist/src/cli/commands/apps.js +62 -0
- package/dist/src/cli/commands/apps.js.map +1 -0
- package/dist/src/cli/commands/batch.d.ts +2 -0
- package/dist/src/cli/commands/batch.d.ts.map +1 -0
- package/dist/src/cli/commands/batch.js +36 -0
- package/dist/src/cli/commands/batch.js.map +1 -0
- package/dist/src/cli/commands/click.d.ts +2 -0
- package/dist/src/cli/commands/click.d.ts.map +1 -0
- package/dist/src/cli/commands/click.js +60 -0
- package/dist/src/cli/commands/click.js.map +1 -0
- package/dist/src/cli/commands/clipboard.d.ts +2 -0
- package/dist/src/cli/commands/clipboard.d.ts.map +1 -0
- package/dist/src/cli/commands/clipboard.js +30 -0
- package/dist/src/cli/commands/clipboard.js.map +1 -0
- package/dist/src/cli/commands/dialog.d.ts +2 -0
- package/dist/src/cli/commands/dialog.d.ts.map +1 -0
- package/dist/src/cli/commands/dialog.js +44 -0
- package/dist/src/cli/commands/dialog.js.map +1 -0
- package/dist/src/cli/commands/drag.d.ts +2 -0
- package/dist/src/cli/commands/drag.d.ts.map +1 -0
- package/dist/src/cli/commands/drag.js +25 -0
- package/dist/src/cli/commands/drag.js.map +1 -0
- package/dist/src/cli/commands/find.d.ts +2 -0
- package/dist/src/cli/commands/find.d.ts.map +1 -0
- package/dist/src/cli/commands/find.js +98 -0
- package/dist/src/cli/commands/find.js.map +1 -0
- package/dist/src/cli/commands/menu.d.ts +2 -0
- package/dist/src/cli/commands/menu.d.ts.map +1 -0
- package/dist/src/cli/commands/menu.js +35 -0
- package/dist/src/cli/commands/menu.js.map +1 -0
- package/dist/src/cli/commands/screenshot.d.ts +2 -0
- package/dist/src/cli/commands/screenshot.d.ts.map +1 -0
- package/dist/src/cli/commands/screenshot.js +26 -0
- package/dist/src/cli/commands/screenshot.js.map +1 -0
- package/dist/src/cli/commands/scroll.d.ts +2 -0
- package/dist/src/cli/commands/scroll.d.ts.map +1 -0
- package/dist/src/cli/commands/scroll.js +76 -0
- package/dist/src/cli/commands/scroll.js.map +1 -0
- package/dist/src/cli/commands/session.d.ts +2 -0
- package/dist/src/cli/commands/session.d.ts.map +1 -0
- package/dist/src/cli/commands/session.js +26 -0
- package/dist/src/cli/commands/session.js.map +1 -0
- package/dist/src/cli/commands/snapshot.d.ts +2 -0
- package/dist/src/cli/commands/snapshot.d.ts.map +1 -0
- package/dist/src/cli/commands/snapshot.js +23 -0
- package/dist/src/cli/commands/snapshot.js.map +1 -0
- package/dist/src/cli/commands/type.d.ts +2 -0
- package/dist/src/cli/commands/type.d.ts.map +1 -0
- package/dist/src/cli/commands/type.js +68 -0
- package/dist/src/cli/commands/type.js.map +1 -0
- package/dist/src/cli/commands/windowmgmt.d.ts +2 -0
- package/dist/src/cli/commands/windowmgmt.d.ts.map +1 -0
- package/dist/src/cli/commands/windowmgmt.js +61 -0
- package/dist/src/cli/commands/windowmgmt.js.map +1 -0
- package/dist/src/cli/commands/windows.d.ts +2 -0
- package/dist/src/cli/commands/windows.d.ts.map +1 -0
- package/dist/src/cli/commands/windows.js +9 -0
- package/dist/src/cli/commands/windows.js.map +1 -0
- package/dist/src/cli/commands.d.ts +13 -0
- package/dist/src/cli/commands.d.ts.map +1 -0
- package/dist/src/cli/commands.js +177 -0
- package/dist/src/cli/commands.js.map +1 -0
- package/dist/src/cli/output.d.ts +4 -0
- package/dist/src/cli/output.d.ts.map +1 -0
- package/dist/src/cli/output.js +249 -0
- package/dist/src/cli/output.js.map +1 -0
- package/dist/src/cli/parser.d.ts +19 -0
- package/dist/src/cli/parser.d.ts.map +1 -0
- package/dist/src/cli/parser.js +125 -0
- package/dist/src/cli/parser.js.map +1 -0
- package/dist/src/config.d.ts +14 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +73 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/daemon.d.ts +21 -0
- package/dist/src/daemon.d.ts.map +1 -0
- package/dist/src/daemon.js +180 -0
- package/dist/src/daemon.js.map +1 -0
- package/dist/src/errors.d.ts +39 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +103 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +8 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/platform/index.d.ts +6 -0
- package/dist/src/platform/index.d.ts.map +1 -0
- package/dist/src/platform/index.js +14 -0
- package/dist/src/platform/index.js.map +1 -0
- package/dist/src/platform/resolve.d.ts +2 -0
- package/dist/src/platform/resolve.d.ts.map +1 -0
- package/dist/src/platform/resolve.js +54 -0
- package/dist/src/platform/resolve.js.map +1 -0
- package/dist/src/refs.d.ts +12 -0
- package/dist/src/refs.d.ts.map +1 -0
- package/dist/src/refs.js +85 -0
- package/dist/src/refs.js.map +1 -0
- package/dist/src/sdk.d.ts +258 -0
- package/dist/src/sdk.d.ts.map +1 -0
- package/dist/src/sdk.js +285 -0
- package/dist/src/sdk.js.map +1 -0
- package/dist/src/types.d.ts +93 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +9 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +67 -0
- package/schema/examples/click.response.example.json +9 -0
- package/schema/examples/error.response.example.json +12 -0
- package/schema/examples/ping.response.example.json +7 -0
- package/schema/examples/snapshot.response.example.json +50 -0
- package/schema/methods/click.request.json +26 -0
- package/schema/methods/click.response.json +24 -0
- package/schema/methods/error.response.json +19 -0
- package/schema/methods/ping.request.json +12 -0
- package/schema/methods/ping.response.json +17 -0
- package/schema/methods/snapshot.request.json +24 -0
- package/schema/methods/snapshot.response.json +23 -0
- package/schema/methods/status.request.json +12 -0
- package/schema/methods/status.response.json +20 -0
- package/schema/types/element.json +26 -0
- package/schema/types/normalized-role.json +13 -0
- package/schema/types/ref.json +7 -0
- package/schema/types/window-info.json +24 -0
- package/scripts/build-macos.sh +5 -0
- package/scripts/postinstall.js +35 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import { connect } from 'net';
|
|
3
|
+
import { existsSync, readFileSync, unlinkSync, mkdirSync } from 'fs';
|
|
4
|
+
import { AC_DIR, SOCKET_PATH, DAEMON_JSON_PATH, IS_NAMED_PIPE } from './platform/index.js';
|
|
5
|
+
import { resolveBinary } from './platform/resolve.js';
|
|
6
|
+
export class DaemonManager {
|
|
7
|
+
binaryPath;
|
|
8
|
+
constructor(binaryPath) {
|
|
9
|
+
this.binaryPath = binaryPath ?? resolveBinary();
|
|
10
|
+
}
|
|
11
|
+
async start() {
|
|
12
|
+
// Check if already running
|
|
13
|
+
const current = this.readDaemonInfo();
|
|
14
|
+
if (current && this.isProcessAlive(current.pid)) {
|
|
15
|
+
return this.buildStatus(current, true);
|
|
16
|
+
}
|
|
17
|
+
// Clean up stale files
|
|
18
|
+
this.cleanupStale();
|
|
19
|
+
// Spawn daemon
|
|
20
|
+
mkdirSync(AC_DIR, { recursive: true });
|
|
21
|
+
const proc = spawn(this.binaryPath, ['--daemon'], {
|
|
22
|
+
detached: true,
|
|
23
|
+
stdio: ['ignore', 'ignore', 'pipe'],
|
|
24
|
+
});
|
|
25
|
+
proc.unref();
|
|
26
|
+
// Wait for daemon to be ready
|
|
27
|
+
const start = Date.now();
|
|
28
|
+
if (IS_NAMED_PIPE) {
|
|
29
|
+
// Named pipes: wait for daemon.json to appear (pipe has no file)
|
|
30
|
+
while (Date.now() - start < 5000) {
|
|
31
|
+
if (existsSync(DAEMON_JSON_PATH)) {
|
|
32
|
+
await sleep(50);
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
await sleep(50);
|
|
36
|
+
}
|
|
37
|
+
if (!existsSync(DAEMON_JSON_PATH)) {
|
|
38
|
+
throw new Error('Daemon failed to start: daemon.json not created within 5s');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// Unix socket: wait for socket file to appear
|
|
43
|
+
while (Date.now() - start < 5000) {
|
|
44
|
+
if (existsSync(SOCKET_PATH)) {
|
|
45
|
+
await sleep(50);
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
await sleep(50);
|
|
49
|
+
}
|
|
50
|
+
if (!existsSync(SOCKET_PATH)) {
|
|
51
|
+
throw new Error('Daemon failed to start: socket not created within 5s');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const info = this.readDaemonInfo();
|
|
55
|
+
if (!info) {
|
|
56
|
+
throw new Error('Daemon started but daemon.json not found');
|
|
57
|
+
}
|
|
58
|
+
return this.buildStatus(info, true);
|
|
59
|
+
}
|
|
60
|
+
async stop() {
|
|
61
|
+
const info = this.readDaemonInfo();
|
|
62
|
+
if (!info)
|
|
63
|
+
return;
|
|
64
|
+
if (this.isProcessAlive(info.pid)) {
|
|
65
|
+
// On Windows, SIGTERM is a hard kill — try graceful RPC shutdown first
|
|
66
|
+
if (IS_NAMED_PIPE) {
|
|
67
|
+
try {
|
|
68
|
+
await this.sendShutdownRPC(info.socket);
|
|
69
|
+
}
|
|
70
|
+
catch { /* fall through to SIGTERM */ }
|
|
71
|
+
}
|
|
72
|
+
// Wait for process to exit (may already be gone from RPC shutdown)
|
|
73
|
+
let start = Date.now();
|
|
74
|
+
while (Date.now() - start < 3000) {
|
|
75
|
+
if (!this.isProcessAlive(info.pid))
|
|
76
|
+
break;
|
|
77
|
+
await sleep(50);
|
|
78
|
+
}
|
|
79
|
+
// Send SIGTERM if still alive
|
|
80
|
+
if (this.isProcessAlive(info.pid)) {
|
|
81
|
+
try {
|
|
82
|
+
process.kill(info.pid, 'SIGTERM');
|
|
83
|
+
}
|
|
84
|
+
catch { /* ok */ }
|
|
85
|
+
start = Date.now();
|
|
86
|
+
while (Date.now() - start < 3000) {
|
|
87
|
+
if (!this.isProcessAlive(info.pid))
|
|
88
|
+
break;
|
|
89
|
+
await sleep(50);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Force kill if still alive
|
|
93
|
+
if (this.isProcessAlive(info.pid)) {
|
|
94
|
+
try {
|
|
95
|
+
process.kill(info.pid, 'SIGKILL');
|
|
96
|
+
}
|
|
97
|
+
catch { /* ok */ }
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
this.cleanupStale();
|
|
101
|
+
}
|
|
102
|
+
sendShutdownRPC(socketPath) {
|
|
103
|
+
return new Promise((resolve, reject) => {
|
|
104
|
+
const sock = connect({ path: socketPath });
|
|
105
|
+
const timeout = setTimeout(() => { sock.destroy(); reject(new Error('shutdown timeout')); }, 2000);
|
|
106
|
+
sock.on('connect', () => {
|
|
107
|
+
const req = JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'shutdown', params: {} }) + '\n';
|
|
108
|
+
sock.write(req, () => {
|
|
109
|
+
clearTimeout(timeout);
|
|
110
|
+
// Give daemon a moment to process before closing
|
|
111
|
+
setTimeout(() => { sock.destroy(); resolve(); }, 100);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
sock.on('error', (err) => { clearTimeout(timeout); reject(err); });
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
async status() {
|
|
118
|
+
const info = this.readDaemonInfo();
|
|
119
|
+
if (!info) {
|
|
120
|
+
return { running: false };
|
|
121
|
+
}
|
|
122
|
+
const alive = this.isProcessAlive(info.pid);
|
|
123
|
+
if (!alive) {
|
|
124
|
+
this.cleanupStale();
|
|
125
|
+
return { running: false };
|
|
126
|
+
}
|
|
127
|
+
return this.buildStatus(info, true);
|
|
128
|
+
}
|
|
129
|
+
async restart() {
|
|
130
|
+
await this.stop();
|
|
131
|
+
return this.start();
|
|
132
|
+
}
|
|
133
|
+
readDaemonInfo() {
|
|
134
|
+
try {
|
|
135
|
+
if (!existsSync(DAEMON_JSON_PATH))
|
|
136
|
+
return null;
|
|
137
|
+
const raw = readFileSync(DAEMON_JSON_PATH, 'utf-8');
|
|
138
|
+
return JSON.parse(raw);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
isProcessAlive(pid) {
|
|
145
|
+
try {
|
|
146
|
+
process.kill(pid, 0);
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
cleanupStale() {
|
|
154
|
+
if (!IS_NAMED_PIPE) {
|
|
155
|
+
try {
|
|
156
|
+
unlinkSync(SOCKET_PATH);
|
|
157
|
+
}
|
|
158
|
+
catch { /* ok */ }
|
|
159
|
+
}
|
|
160
|
+
try {
|
|
161
|
+
unlinkSync(DAEMON_JSON_PATH);
|
|
162
|
+
}
|
|
163
|
+
catch { /* ok */ }
|
|
164
|
+
}
|
|
165
|
+
buildStatus(info, running) {
|
|
166
|
+
const startedAt = new Date(info.started_at);
|
|
167
|
+
const uptime = Date.now() - startedAt.getTime();
|
|
168
|
+
return {
|
|
169
|
+
running,
|
|
170
|
+
pid: info.pid,
|
|
171
|
+
socket: info.socket,
|
|
172
|
+
started_at: info.started_at,
|
|
173
|
+
uptime_ms: Math.max(0, uptime),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function sleep(ms) {
|
|
178
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export declare class ACError extends Error {
|
|
2
|
+
readonly code: number;
|
|
3
|
+
readonly exitCode: number;
|
|
4
|
+
readonly data?: Record<string, unknown> | undefined;
|
|
5
|
+
constructor(message: string, code: number, exitCode: number, data?: Record<string, unknown> | undefined);
|
|
6
|
+
}
|
|
7
|
+
export declare class ElementNotFoundError extends ACError {
|
|
8
|
+
constructor(message: string, data?: Record<string, unknown>);
|
|
9
|
+
}
|
|
10
|
+
export declare class PermissionDeniedError extends ACError {
|
|
11
|
+
constructor(message: string, data?: Record<string, unknown>);
|
|
12
|
+
}
|
|
13
|
+
export declare class TimeoutError extends ACError {
|
|
14
|
+
constructor(message: string, data?: Record<string, unknown>);
|
|
15
|
+
}
|
|
16
|
+
export declare class AppNotFoundError extends ACError {
|
|
17
|
+
constructor(message: string, data?: Record<string, unknown>);
|
|
18
|
+
}
|
|
19
|
+
export declare class WindowNotFoundError extends ACError {
|
|
20
|
+
constructor(message: string, data?: Record<string, unknown>);
|
|
21
|
+
}
|
|
22
|
+
export declare class InvalidRefError extends ACError {
|
|
23
|
+
constructor(message: string, data?: Record<string, unknown>);
|
|
24
|
+
}
|
|
25
|
+
export declare class OCRFallbackFailedError extends ACError {
|
|
26
|
+
constructor(message: string, data?: Record<string, unknown>);
|
|
27
|
+
}
|
|
28
|
+
export declare class InvalidRequestError extends ACError {
|
|
29
|
+
constructor(message: string, data?: Record<string, unknown>);
|
|
30
|
+
}
|
|
31
|
+
export declare class MethodNotFoundError extends ACError {
|
|
32
|
+
constructor(message: string, data?: Record<string, unknown>);
|
|
33
|
+
}
|
|
34
|
+
export declare class InvalidParamsError extends ACError {
|
|
35
|
+
constructor(message: string, data?: Record<string, unknown>);
|
|
36
|
+
}
|
|
37
|
+
export declare function errorFromCode(code: number, message: string, data?: Record<string, unknown>): ACError;
|
|
38
|
+
export declare function exitCodeFromErrorCode(code: number): number;
|
|
39
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,OAAQ,SAAQ,KAAK;aAGd,IAAI,EAAE,MAAM;aACZ,QAAQ,EAAE,MAAM;aAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAH9C,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAKjD;AAED,qBAAa,oBAAqB,SAAQ,OAAO;gBACnC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI5D;AAED,qBAAa,qBAAsB,SAAQ,OAAO;gBACpC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI5D;AAED,qBAAa,YAAa,SAAQ,OAAO;gBAC3B,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI5D;AAED,qBAAa,gBAAiB,SAAQ,OAAO;gBAC/B,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI5D;AAED,qBAAa,mBAAoB,SAAQ,OAAO;gBAClC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI5D;AAED,qBAAa,eAAgB,SAAQ,OAAO;gBAC9B,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI5D;AAED,qBAAa,sBAAuB,SAAQ,OAAO;gBACrC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI5D;AAGD,qBAAa,mBAAoB,SAAQ,OAAO;gBAClC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI5D;AAED,qBAAa,mBAAoB,SAAQ,OAAO;gBAClC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI5D;AAED,qBAAa,kBAAmB,SAAQ,OAAO;gBACjC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAI5D;AAgBD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAMpG;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ1D"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
export class ACError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
exitCode;
|
|
4
|
+
data;
|
|
5
|
+
constructor(message, code, exitCode, data) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.exitCode = exitCode;
|
|
9
|
+
this.data = data;
|
|
10
|
+
this.name = 'ACError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class ElementNotFoundError extends ACError {
|
|
14
|
+
constructor(message, data) {
|
|
15
|
+
super(message, -32001, 1, data);
|
|
16
|
+
this.name = 'ELEMENT_NOT_FOUND';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class PermissionDeniedError extends ACError {
|
|
20
|
+
constructor(message, data) {
|
|
21
|
+
super(message, -32002, 2, data);
|
|
22
|
+
this.name = 'PERMISSION_DENIED';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class TimeoutError extends ACError {
|
|
26
|
+
constructor(message, data) {
|
|
27
|
+
super(message, -32003, 3, data);
|
|
28
|
+
this.name = 'TIMEOUT';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class AppNotFoundError extends ACError {
|
|
32
|
+
constructor(message, data) {
|
|
33
|
+
super(message, -32004, 4, data);
|
|
34
|
+
this.name = 'APP_NOT_FOUND';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export class WindowNotFoundError extends ACError {
|
|
38
|
+
constructor(message, data) {
|
|
39
|
+
super(message, -32005, 5, data);
|
|
40
|
+
this.name = 'WINDOW_NOT_FOUND';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class InvalidRefError extends ACError {
|
|
44
|
+
constructor(message, data) {
|
|
45
|
+
super(message, -32006, 6, data);
|
|
46
|
+
this.name = 'INVALID_REF';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export class OCRFallbackFailedError extends ACError {
|
|
50
|
+
constructor(message, data) {
|
|
51
|
+
super(message, -32007, 7, data);
|
|
52
|
+
this.name = 'OCR_FALLBACK_FAILED';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// JSON-RPC standard errors
|
|
56
|
+
export class InvalidRequestError extends ACError {
|
|
57
|
+
constructor(message, data) {
|
|
58
|
+
super(message, -32600, 126, data);
|
|
59
|
+
this.name = 'INVALID_REQUEST';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export class MethodNotFoundError extends ACError {
|
|
63
|
+
constructor(message, data) {
|
|
64
|
+
super(message, -32601, 126, data);
|
|
65
|
+
this.name = 'METHOD_NOT_FOUND';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export class InvalidParamsError extends ACError {
|
|
69
|
+
constructor(message, data) {
|
|
70
|
+
super(message, -32602, 126, data);
|
|
71
|
+
this.name = 'INVALID_PARAMS';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Error code → error class mapping
|
|
75
|
+
const ERROR_MAP = {
|
|
76
|
+
[-32001]: ElementNotFoundError,
|
|
77
|
+
[-32002]: PermissionDeniedError,
|
|
78
|
+
[-32003]: TimeoutError,
|
|
79
|
+
[-32004]: AppNotFoundError,
|
|
80
|
+
[-32005]: WindowNotFoundError,
|
|
81
|
+
[-32006]: InvalidRefError,
|
|
82
|
+
[-32007]: OCRFallbackFailedError,
|
|
83
|
+
[-32600]: InvalidRequestError,
|
|
84
|
+
[-32601]: MethodNotFoundError,
|
|
85
|
+
[-32602]: InvalidParamsError,
|
|
86
|
+
};
|
|
87
|
+
export function errorFromCode(code, message, data) {
|
|
88
|
+
const ErrorClass = ERROR_MAP[code];
|
|
89
|
+
if (ErrorClass) {
|
|
90
|
+
return new ErrorClass(message, data);
|
|
91
|
+
}
|
|
92
|
+
return new ACError(message, code, 126, data);
|
|
93
|
+
}
|
|
94
|
+
export function exitCodeFromErrorCode(code) {
|
|
95
|
+
const instance = ERROR_MAP[code];
|
|
96
|
+
if (instance) {
|
|
97
|
+
// Create a temporary instance to get the exit code
|
|
98
|
+
const temp = new instance('');
|
|
99
|
+
return temp.exitCode;
|
|
100
|
+
}
|
|
101
|
+
return 126;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type { Element, Snapshot, WindowInfo, ScreenshotResult, RecordingStatus, DialogInfo, AppInfo, StatusInfo, PermissionsInfo, DoctorResult, DisplayInfo, Ref, RefPrefix, NormalizedRole, } from './types.js';
|
|
2
|
+
export { parseRef, isValidRef, refToRole, REF_PREFIXES } from './refs.js';
|
|
3
|
+
export { ACError, ElementNotFoundError, PermissionDeniedError, TimeoutError } from './errors.js';
|
|
4
|
+
export { Bridge, type BridgeOptions } from './bridge.js';
|
|
5
|
+
export { AC } from './sdk.js';
|
|
6
|
+
export { CDPClient, CDPConnection, CDPAXTree, CDPInteractions } from './cdp/index.js';
|
|
7
|
+
export type { CDPTarget, CDPAXNode, CDPNodeRef, CDPSnapshotOptions, CDPSnapshotResult } from './cdp/index.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,OAAO,EACP,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,OAAO,EACP,UAAU,EACV,eAAe,EACf,YAAY,EACZ,WAAW,EACX,GAAG,EACH,SAAS,EACT,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAG9B,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtF,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// @skillful-agents/ac — TypeScript SDK for macOS desktop automation
|
|
2
|
+
export { parseRef, isValidRef, refToRole, REF_PREFIXES } from './refs.js';
|
|
3
|
+
export { ACError, ElementNotFoundError, PermissionDeniedError, TimeoutError } from './errors.js';
|
|
4
|
+
export { Bridge } from './bridge.js';
|
|
5
|
+
export { AC } from './sdk.js';
|
|
6
|
+
// CDP support
|
|
7
|
+
export { CDPClient, CDPConnection, CDPAXTree, CDPInteractions } from './cdp/index.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAmBpE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,MAAM,EAAsB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAE9B,cAAc;AACd,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/platform/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,MAAM,QAAyB,CAAC;AAC7C,eAAO,MAAM,gBAAgB,QAA8B,CAAC;AAC5D,eAAO,MAAM,aAAa,QAA4B,CAAC;AAIvD,eAAO,MAAM,WAAW,QAEO,CAAC;AAGhC,eAAO,MAAM,aAAa,SAAiB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { join } from 'path';
|
|
2
|
+
import { homedir, platform } from 'os';
|
|
3
|
+
const os = platform();
|
|
4
|
+
export const AC_DIR = join(homedir(), '.ac');
|
|
5
|
+
export const DAEMON_JSON_PATH = join(AC_DIR, 'daemon.json');
|
|
6
|
+
export const SNAPSHOTS_DIR = join(AC_DIR, 'snapshots');
|
|
7
|
+
// macOS: Unix domain socket file on disk
|
|
8
|
+
// Windows: Named pipe (kernel object, no file on disk)
|
|
9
|
+
export const SOCKET_PATH = os === 'win32'
|
|
10
|
+
? '\\\\.\\pipe\\ac-daemon'
|
|
11
|
+
: join(AC_DIR, 'daemon.sock');
|
|
12
|
+
// Named pipes don't exist as files — connection-based detection needed
|
|
13
|
+
export const IS_NAMED_PIPE = os === 'win32';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/platform/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAEvC,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;AAEtB,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEvD,yCAAyC;AACzC,uDAAuD;AACvD,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,KAAK,OAAO;IACvC,CAAC,CAAC,wBAAwB;IAC1B,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAEhC,uEAAuE;AACvE,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,KAAK,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/platform/resolve.ts"],"names":[],"mappings":"AAOA,wBAAgB,aAAa,IAAI,MAAM,CAsDtC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { platform, arch } from 'os';
|
|
2
|
+
import { join, dirname } from 'path';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
export function resolveBinary() {
|
|
7
|
+
const os = platform();
|
|
8
|
+
const cpu = arch();
|
|
9
|
+
if (os !== 'darwin' && os !== 'win32') {
|
|
10
|
+
throw new Error(`Unsupported platform: ${os}. agent-computer supports macOS and Windows.`);
|
|
11
|
+
}
|
|
12
|
+
const ext = os === 'win32' ? '.exe' : '';
|
|
13
|
+
const key = `${os}-${cpu === 'arm64' ? 'arm64' : 'x64'}`;
|
|
14
|
+
// Bundled platform-specific binary (npm package)
|
|
15
|
+
const bundledPath = join(__dirname, '..', '..', 'bin', `ac-core-${key}${ext}`);
|
|
16
|
+
if (existsSync(bundledPath)) {
|
|
17
|
+
return bundledPath;
|
|
18
|
+
}
|
|
19
|
+
if (os === 'darwin') {
|
|
20
|
+
// Development: locally-built Swift binary (release)
|
|
21
|
+
const devBinaryPath = join(__dirname, '..', '..', 'native', 'macos', '.build', 'release', 'ac-core');
|
|
22
|
+
if (existsSync(devBinaryPath))
|
|
23
|
+
return devBinaryPath;
|
|
24
|
+
// Development: Swift debug build
|
|
25
|
+
const debugBinaryPath = join(__dirname, '..', '..', 'native', 'macos', '.build', 'debug', 'ac-core');
|
|
26
|
+
if (existsSync(debugBinaryPath))
|
|
27
|
+
return debugBinaryPath;
|
|
28
|
+
}
|
|
29
|
+
if (os === 'win32') {
|
|
30
|
+
const rid = cpu === 'arm64' ? 'win-arm64' : 'win-x64';
|
|
31
|
+
const tfms = ['net9.0-windows', 'net9.0'];
|
|
32
|
+
const base = join(__dirname, '..', '..', 'native', 'windows', 'ACCore', 'bin');
|
|
33
|
+
for (const tfm of tfms) {
|
|
34
|
+
// Development: self-contained release publish
|
|
35
|
+
const publishPath = join(base, 'Release', tfm, rid, 'publish', 'ac-core.exe');
|
|
36
|
+
if (existsSync(publishPath))
|
|
37
|
+
return publishPath;
|
|
38
|
+
// Development: release build (framework-dependent)
|
|
39
|
+
const releasePath = join(base, 'Release', tfm, 'ac-core.exe');
|
|
40
|
+
if (existsSync(releasePath))
|
|
41
|
+
return releasePath;
|
|
42
|
+
// Development: debug build (framework-dependent)
|
|
43
|
+
const debugPath = join(base, 'Debug', tfm, 'ac-core.exe');
|
|
44
|
+
if (existsSync(debugPath))
|
|
45
|
+
return debugPath;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const buildHint = os === 'win32'
|
|
49
|
+
? 'cd native/windows && dotnet build'
|
|
50
|
+
: 'cd native/macos && swift build -c release';
|
|
51
|
+
throw new Error(`Native binary not found for ${key}. ` +
|
|
52
|
+
`Build from source: ${buildHint}`);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/platform/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { NormalizedRole } from './types.js';
|
|
2
|
+
export declare const REF_PREFIXES: Record<string, NormalizedRole>;
|
|
3
|
+
export declare function roleToPrefix(role: string): string;
|
|
4
|
+
export interface ParsedRef {
|
|
5
|
+
prefix: string;
|
|
6
|
+
role: NormalizedRole;
|
|
7
|
+
id: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function parseRef(input: string): ParsedRef;
|
|
10
|
+
export declare function isValidRef(input: string): boolean;
|
|
11
|
+
export declare function refToRole(prefix: string): NormalizedRole | undefined;
|
|
12
|
+
//# sourceMappingURL=refs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../src/refs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,cAAc,EAAE,MAAM,YAAY,CAAC;AAiC5D,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAGvD,CAAC;AAaF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAQD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,cAAc,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CA0BjD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAOjD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEpE"}
|
package/dist/src/refs.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// Single-letter prefix → role mapping
|
|
2
|
+
const SINGLE_LETTER_PREFIXES = {
|
|
3
|
+
b: 'button',
|
|
4
|
+
t: 'textfield',
|
|
5
|
+
l: 'link',
|
|
6
|
+
m: 'menuitem',
|
|
7
|
+
c: 'checkbox',
|
|
8
|
+
r: 'radio',
|
|
9
|
+
s: 'slider',
|
|
10
|
+
d: 'dropdown',
|
|
11
|
+
i: 'image',
|
|
12
|
+
g: 'group',
|
|
13
|
+
w: 'window',
|
|
14
|
+
x: 'table',
|
|
15
|
+
o: 'row',
|
|
16
|
+
a: 'tab',
|
|
17
|
+
e: 'generic',
|
|
18
|
+
};
|
|
19
|
+
// Two-letter prefix → role mapping (for less common roles)
|
|
20
|
+
const TWO_LETTER_PREFIXES = {
|
|
21
|
+
cb: 'combobox',
|
|
22
|
+
sa: 'scrollarea',
|
|
23
|
+
st: 'stepper',
|
|
24
|
+
sp: 'splitgroup',
|
|
25
|
+
tl: 'timeline',
|
|
26
|
+
pg: 'progress',
|
|
27
|
+
tv: 'treeview',
|
|
28
|
+
wb: 'webarea',
|
|
29
|
+
};
|
|
30
|
+
export const REF_PREFIXES = {
|
|
31
|
+
...SINGLE_LETTER_PREFIXES,
|
|
32
|
+
...TWO_LETTER_PREFIXES,
|
|
33
|
+
};
|
|
34
|
+
// Reverse mapping: role → prefix
|
|
35
|
+
const ROLE_TO_PREFIX = {};
|
|
36
|
+
for (const [prefix, role] of Object.entries(REF_PREFIXES)) {
|
|
37
|
+
// Prefer shorter prefix if role already mapped
|
|
38
|
+
if (!ROLE_TO_PREFIX[role] || prefix.length < ROLE_TO_PREFIX[role].length) {
|
|
39
|
+
ROLE_TO_PREFIX[role] = prefix;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// textfield and textarea both map to 't' — textarea gets 't' by convention
|
|
43
|
+
ROLE_TO_PREFIX['textarea'] = 't';
|
|
44
|
+
export function roleToPrefix(role) {
|
|
45
|
+
return ROLE_TO_PREFIX[role] ?? 'e';
|
|
46
|
+
}
|
|
47
|
+
const ALL_PREFIXES = new Set(Object.keys(REF_PREFIXES));
|
|
48
|
+
// Ref pattern: @<prefix><positive integer>
|
|
49
|
+
// Try two-letter prefix first, then single-letter
|
|
50
|
+
const REF_REGEX = /^@([a-z]{1,2})([1-9]\d*)$/;
|
|
51
|
+
export function parseRef(input) {
|
|
52
|
+
const match = REF_REGEX.exec(input);
|
|
53
|
+
if (!match) {
|
|
54
|
+
throw new Error(`Invalid ref format: "${input}". Expected @<prefix><number> (e.g., @b1, @cb3)`);
|
|
55
|
+
}
|
|
56
|
+
const rawPrefix = match[1];
|
|
57
|
+
const id = parseInt(match[2], 10);
|
|
58
|
+
// Try two-letter prefix first (e.g., "@cb1" → prefix "cb", not "c" with "b1")
|
|
59
|
+
if (rawPrefix.length === 2 && ALL_PREFIXES.has(rawPrefix)) {
|
|
60
|
+
return { prefix: rawPrefix, role: REF_PREFIXES[rawPrefix], id };
|
|
61
|
+
}
|
|
62
|
+
// Try single-letter prefix
|
|
63
|
+
if (rawPrefix.length === 1 && ALL_PREFIXES.has(rawPrefix)) {
|
|
64
|
+
return { prefix: rawPrefix, role: REF_PREFIXES[rawPrefix], id };
|
|
65
|
+
}
|
|
66
|
+
// Two-letter prefix but only first letter is valid (e.g., "@bx1" is not valid)
|
|
67
|
+
if (rawPrefix.length === 2) {
|
|
68
|
+
// Check if first letter alone is a valid prefix — if so, reject because the second char is part of the number parsing issue
|
|
69
|
+
throw new Error(`Invalid ref prefix: "${rawPrefix}" in "${input}". Valid prefixes: ${[...ALL_PREFIXES].sort().join(', ')}`);
|
|
70
|
+
}
|
|
71
|
+
throw new Error(`Unknown ref prefix: "${rawPrefix}" in "${input}". Valid prefixes: ${[...ALL_PREFIXES].sort().join(', ')}`);
|
|
72
|
+
}
|
|
73
|
+
export function isValidRef(input) {
|
|
74
|
+
try {
|
|
75
|
+
parseRef(input);
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function refToRole(prefix) {
|
|
83
|
+
return REF_PREFIXES[prefix];
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/refs.ts"],"names":[],"mappings":"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"}
|