pilot-ai 0.4.0 → 0.5.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/README.md +75 -5
- package/dist/agent/claude.d.ts +7 -0
- package/dist/agent/claude.d.ts.map +1 -1
- package/dist/agent/claude.js +30 -2
- package/dist/agent/claude.js.map +1 -1
- package/dist/agent/core.d.ts +3 -0
- package/dist/agent/core.d.ts.map +1 -1
- package/dist/agent/core.js +87 -6
- package/dist/agent/core.js.map +1 -1
- package/dist/agent/queue.d.ts +12 -7
- package/dist/agent/queue.d.ts.map +1 -1
- package/dist/agent/queue.js +89 -0
- package/dist/agent/queue.js.map +1 -1
- package/dist/agent/session.d.ts +44 -0
- package/dist/agent/session.d.ts.map +1 -0
- package/dist/agent/session.js +131 -0
- package/dist/agent/session.js.map +1 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +17 -2
- package/dist/api/server.js.map +1 -1
- package/dist/cli/doctor.d.ts +2 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +198 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +51 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/config/schema.d.ts +6 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +9 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/messenger/slack.d.ts +1 -0
- package/dist/messenger/slack.d.ts.map +1 -1
- package/dist/messenger/slack.js +15 -6
- package/dist/messenger/slack.js.map +1 -1
- package/dist/messenger/split.d.ts +16 -0
- package/dist/messenger/split.d.ts.map +1 -0
- package/dist/messenger/split.js +66 -0
- package/dist/messenger/split.js.map +1 -0
- package/dist/messenger/telegram.d.ts +1 -0
- package/dist/messenger/telegram.d.ts.map +1 -1
- package/dist/messenger/telegram.js +14 -5
- package/dist/messenger/telegram.js.map +1 -1
- package/dist/security/permissions.d.ts +7 -0
- package/dist/security/permissions.d.ts.map +1 -1
- package/dist/security/permissions.js +57 -1
- package/dist/security/permissions.js.map +1 -1
- package/dist/security/sandbox.d.ts +1 -0
- package/dist/security/sandbox.d.ts.map +1 -1
- package/dist/security/sandbox.js +61 -4
- package/dist/security/sandbox.js.map +1 -1
- package/dist/tools/calendar.d.ts.map +1 -1
- package/dist/tools/calendar.js +9 -14
- package/dist/tools/calendar.js.map +1 -1
- package/dist/tools/clipboard.d.ts.map +1 -1
- package/dist/tools/clipboard.js +2 -2
- package/dist/tools/clipboard.js.map +1 -1
- package/dist/tools/email.d.ts +1 -0
- package/dist/tools/email.d.ts.map +1 -1
- package/dist/tools/email.js +26 -4
- package/dist/tools/email.js.map +1 -1
- package/dist/tools/filesystem.d.ts.map +1 -1
- package/dist/tools/filesystem.js +22 -6
- package/dist/tools/filesystem.js.map +1 -1
- package/dist/tools/github.d.ts.map +1 -1
- package/dist/tools/github.js +20 -0
- package/dist/tools/github.js.map +1 -1
- package/dist/tools/google-auth.d.ts +1 -0
- package/dist/tools/google-auth.d.ts.map +1 -1
- package/dist/tools/google-auth.js +26 -4
- package/dist/tools/google-auth.js.map +1 -1
- package/dist/tools/notification.d.ts.map +1 -1
- package/dist/tools/notification.js +2 -7
- package/dist/tools/notification.js.map +1 -1
- package/dist/tools/obsidian.d.ts.map +1 -1
- package/dist/tools/obsidian.js +23 -3
- package/dist/tools/obsidian.js.map +1 -1
- package/dist/utils/circuit-breaker.d.ts +30 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +69 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/errors.d.ts +55 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +79 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/escape.d.ts +15 -0
- package/dist/utils/escape.d.ts.map +1 -0
- package/dist/utils/escape.js +23 -0
- package/dist/utils/escape.js.map +1 -0
- package/dist/utils/logger.d.ts +39 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +119 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/oauth-manager.d.ts +49 -0
- package/dist/utils/oauth-manager.d.ts.map +1 -0
- package/dist/utils/oauth-manager.js +112 -0
- package/dist/utils/oauth-manager.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +24 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +52 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/retry.d.ts +20 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +45 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +1 -1
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import fs from 'node:fs/promises';
|
|
6
6
|
import path from 'node:path';
|
|
7
7
|
import { getPilotDir } from '../config/store.js';
|
|
8
|
+
import { getSecret, setSecret, deleteSecret } from '../config/keychain.js';
|
|
8
9
|
const TOKEN_URL = 'https://oauth2.googleapis.com/token';
|
|
9
10
|
export const GOOGLE_SCOPES = {
|
|
10
11
|
gmail: [
|
|
@@ -21,7 +22,8 @@ export const GOOGLE_SCOPES = {
|
|
|
21
22
|
'https://www.googleapis.com/auth/drive.file',
|
|
22
23
|
],
|
|
23
24
|
};
|
|
24
|
-
|
|
25
|
+
const KEYCHAIN_KEY = 'google-oauth-tokens';
|
|
26
|
+
function getLegacyTokenPath() {
|
|
25
27
|
return path.join(getPilotDir(), 'credentials', 'google-tokens.json');
|
|
26
28
|
}
|
|
27
29
|
let config = null;
|
|
@@ -33,9 +35,25 @@ export function getGoogleConfig() {
|
|
|
33
35
|
return config;
|
|
34
36
|
}
|
|
35
37
|
export async function loadGoogleTokens() {
|
|
38
|
+
// Try Keychain first
|
|
39
|
+
const secret = await getSecret(KEYCHAIN_KEY);
|
|
40
|
+
if (secret) {
|
|
41
|
+
try {
|
|
42
|
+
tokens = JSON.parse(secret);
|
|
43
|
+
return tokens;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Corrupted keychain entry, fall through to legacy
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Try legacy JSON file and migrate if found
|
|
36
50
|
try {
|
|
37
|
-
const data = await fs.readFile(
|
|
38
|
-
|
|
51
|
+
const data = await fs.readFile(getLegacyTokenPath(), 'utf-8');
|
|
52
|
+
const parsed = JSON.parse(data);
|
|
53
|
+
// Migrate to Keychain
|
|
54
|
+
await saveGoogleTokens(parsed);
|
|
55
|
+
// Remove legacy file
|
|
56
|
+
await fs.unlink(getLegacyTokenPath()).catch(() => { });
|
|
39
57
|
return tokens;
|
|
40
58
|
}
|
|
41
59
|
catch {
|
|
@@ -44,7 +62,11 @@ export async function loadGoogleTokens() {
|
|
|
44
62
|
}
|
|
45
63
|
export async function saveGoogleTokens(t) {
|
|
46
64
|
tokens = t;
|
|
47
|
-
await
|
|
65
|
+
await setSecret(KEYCHAIN_KEY, JSON.stringify(t));
|
|
66
|
+
}
|
|
67
|
+
export async function deleteGoogleTokens() {
|
|
68
|
+
tokens = null;
|
|
69
|
+
await deleteSecret(KEYCHAIN_KEY);
|
|
48
70
|
}
|
|
49
71
|
/**
|
|
50
72
|
* Returns the OAuth2 authorization URL for user consent.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-auth.js","sourceRoot":"","sources":["../../src/tools/google-auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"google-auth.js","sourceRoot":"","sources":["../../src/tools/google-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../src/tools/notification.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../src/tools/notification.ts"],"names":[],"mappings":"AAGA,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBhB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { executeShell } from './shell.js';
|
|
2
|
+
import { escapeAppleScript, escapeShellArg } from '../utils/escape.js';
|
|
2
3
|
export async function sendNotification(params) {
|
|
3
4
|
// Try terminal-notifier first for click action support
|
|
4
5
|
if (params.clickUrl) {
|
|
@@ -16,7 +17,7 @@ export async function sendNotification(params) {
|
|
|
16
17
|
parts.push('sound name "default"');
|
|
17
18
|
}
|
|
18
19
|
const script = parts.join(' ');
|
|
19
|
-
const result = await executeShell(`osascript -e
|
|
20
|
+
const result = await executeShell(`osascript -e ${escapeShellArg(script)}`);
|
|
20
21
|
if (result.exitCode !== 0)
|
|
21
22
|
throw new Error(`Failed to send notification: ${result.stderr}`);
|
|
22
23
|
}
|
|
@@ -40,10 +41,4 @@ async function sendWithTerminalNotifier(params) {
|
|
|
40
41
|
const result = await executeShell(`terminal-notifier ${args.join(' ')}`);
|
|
41
42
|
return result.exitCode === 0;
|
|
42
43
|
}
|
|
43
|
-
function escapeAppleScript(str) {
|
|
44
|
-
return str.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
45
|
-
}
|
|
46
|
-
function escapeShellArg(str) {
|
|
47
|
-
return `'${str.replace(/'/g, "'\\''")}'`;
|
|
48
|
-
}
|
|
49
44
|
//# sourceMappingURL=notification.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../../src/tools/notification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../../src/tools/notification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEvE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAMtC;IACC,uDAAuD;IACvD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,QAAQ;YAAE,OAAO;IACvB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC;IACzC,MAAM,KAAK,GAAG,CAAC,yBAAyB,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9E,KAAK,CAAC,IAAI,CAAC,eAAe,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,aAAa,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,gBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5E,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,MAMvC;IACC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,yBAAyB,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,MAAM,IAAI,GAAG;QACX,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC;QACpD,UAAU,EAAE,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC;KAC3C,CAAC;IACF,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,qBAAqB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzE,OAAO,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"obsidian.d.ts","sourceRoot":"","sources":["../../src/tools/obsidian.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"obsidian.d.ts","sourceRoot":"","sources":["../../src/tools/obsidian.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,wBAAsB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGnF;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAInG;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQtG;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAe7G;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC,CA4BvH;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBrF"}
|
package/dist/tools/obsidian.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import fsSync from 'node:fs';
|
|
1
2
|
import fs from 'node:fs/promises';
|
|
2
3
|
import path from 'node:path';
|
|
3
4
|
/**
|
|
@@ -88,13 +89,32 @@ export async function listNotes(vaultPath, subdir) {
|
|
|
88
89
|
await walk(dir);
|
|
89
90
|
return notes.sort();
|
|
90
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Resolves a path following symlinks where possible.
|
|
94
|
+
* If the full path doesn't exist, resolves the deepest existing ancestor.
|
|
95
|
+
*/
|
|
96
|
+
function resolveReal(p) {
|
|
97
|
+
try {
|
|
98
|
+
return fsSync.realpathSync(p);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
const parent = path.dirname(p);
|
|
102
|
+
const base = path.basename(p);
|
|
103
|
+
if (parent === p)
|
|
104
|
+
return p;
|
|
105
|
+
return path.join(resolveReal(parent), base);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
91
108
|
function resolveNotePath(vaultPath, notePath) {
|
|
92
109
|
const normalized = notePath.endsWith('.md') ? notePath : notePath + '.md';
|
|
93
110
|
const resolved = path.resolve(vaultPath, normalized);
|
|
94
|
-
|
|
95
|
-
|
|
111
|
+
const resolvedVault = path.resolve(vaultPath);
|
|
112
|
+
// Resolve symlinks to prevent symlink-based bypass
|
|
113
|
+
const realResolved = resolveReal(resolved);
|
|
114
|
+
const realVault = resolveReal(resolvedVault);
|
|
115
|
+
if (!realResolved.startsWith(realVault + path.sep) && realResolved !== realVault) {
|
|
96
116
|
throw new Error('Path traversal detected: note path is outside vault');
|
|
97
117
|
}
|
|
98
|
-
return
|
|
118
|
+
return realResolved;
|
|
99
119
|
}
|
|
100
120
|
//# sourceMappingURL=obsidian.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"obsidian.js","sourceRoot":"","sources":["../../src/tools/obsidian.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"obsidian.js","sourceRoot":"","sources":["../../src/tools/obsidian.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit breaker implementation (CLOSED → OPEN → HALF-OPEN state machine).
|
|
3
|
+
* Protects against cascading failures by failing fast when a service is down.
|
|
4
|
+
*/
|
|
5
|
+
export type CircuitState = 'CLOSED' | 'OPEN' | 'HALF_OPEN';
|
|
6
|
+
export interface CircuitBreakerOptions {
|
|
7
|
+
/** Number of failures before opening the circuit (default: 5) */
|
|
8
|
+
failureThreshold?: number;
|
|
9
|
+
/** Time in ms to wait before transitioning from OPEN to HALF_OPEN (default: 60000) */
|
|
10
|
+
resetTimeout?: number;
|
|
11
|
+
/** Number of successful calls in HALF_OPEN to close the circuit (default: 1) */
|
|
12
|
+
halfOpenSuccessThreshold?: number;
|
|
13
|
+
}
|
|
14
|
+
export declare class CircuitBreaker {
|
|
15
|
+
private state;
|
|
16
|
+
private failureCount;
|
|
17
|
+
private successCount;
|
|
18
|
+
private lastFailureTime;
|
|
19
|
+
private readonly failureThreshold;
|
|
20
|
+
private readonly resetTimeout;
|
|
21
|
+
private readonly halfOpenSuccessThreshold;
|
|
22
|
+
constructor(options?: CircuitBreakerOptions);
|
|
23
|
+
getState(): CircuitState;
|
|
24
|
+
execute<T>(fn: () => Promise<T>): Promise<T>;
|
|
25
|
+
private onSuccess;
|
|
26
|
+
private onFailure;
|
|
27
|
+
/** Reset the circuit breaker to CLOSED state */
|
|
28
|
+
reset(): void;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=circuit-breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../src/utils/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3D,MAAM,WAAW,qBAAqB;IACpC,iEAAiE;IACjE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;gBAEtC,OAAO,CAAC,EAAE,qBAAqB;IAM3C,QAAQ,IAAI,YAAY;IAQlB,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAiBlD,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,SAAS;IASjB,gDAAgD;IAChD,KAAK,IAAI,IAAI;CAMd"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit breaker implementation (CLOSED → OPEN → HALF-OPEN state machine).
|
|
3
|
+
* Protects against cascading failures by failing fast when a service is down.
|
|
4
|
+
*/
|
|
5
|
+
export class CircuitBreaker {
|
|
6
|
+
state = 'CLOSED';
|
|
7
|
+
failureCount = 0;
|
|
8
|
+
successCount = 0;
|
|
9
|
+
lastFailureTime = 0;
|
|
10
|
+
failureThreshold;
|
|
11
|
+
resetTimeout;
|
|
12
|
+
halfOpenSuccessThreshold;
|
|
13
|
+
constructor(options) {
|
|
14
|
+
this.failureThreshold = options?.failureThreshold ?? 5;
|
|
15
|
+
this.resetTimeout = options?.resetTimeout ?? 60_000;
|
|
16
|
+
this.halfOpenSuccessThreshold = options?.halfOpenSuccessThreshold ?? 1;
|
|
17
|
+
}
|
|
18
|
+
getState() {
|
|
19
|
+
if (this.state === 'OPEN' && Date.now() - this.lastFailureTime >= this.resetTimeout) {
|
|
20
|
+
this.state = 'HALF_OPEN';
|
|
21
|
+
this.successCount = 0;
|
|
22
|
+
}
|
|
23
|
+
return this.state;
|
|
24
|
+
}
|
|
25
|
+
async execute(fn) {
|
|
26
|
+
const currentState = this.getState();
|
|
27
|
+
if (currentState === 'OPEN') {
|
|
28
|
+
throw new Error('Circuit breaker is OPEN — request blocked');
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const result = await fn();
|
|
32
|
+
this.onSuccess();
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
this.onFailure();
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
onSuccess() {
|
|
41
|
+
if (this.state === 'HALF_OPEN') {
|
|
42
|
+
this.successCount++;
|
|
43
|
+
if (this.successCount >= this.halfOpenSuccessThreshold) {
|
|
44
|
+
this.state = 'CLOSED';
|
|
45
|
+
this.failureCount = 0;
|
|
46
|
+
this.successCount = 0;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
this.failureCount = 0;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
onFailure() {
|
|
54
|
+
this.failureCount++;
|
|
55
|
+
this.lastFailureTime = Date.now();
|
|
56
|
+
if (this.state === 'HALF_OPEN' || this.failureCount >= this.failureThreshold) {
|
|
57
|
+
this.state = 'OPEN';
|
|
58
|
+
this.successCount = 0;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** Reset the circuit breaker to CLOSED state */
|
|
62
|
+
reset() {
|
|
63
|
+
this.state = 'CLOSED';
|
|
64
|
+
this.failureCount = 0;
|
|
65
|
+
this.successCount = 0;
|
|
66
|
+
this.lastFailureTime = 0;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../src/utils/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,MAAM,OAAO,cAAc;IACjB,KAAK,GAAiB,QAAQ,CAAC;IAC/B,YAAY,GAAG,CAAC,CAAC;IACjB,YAAY,GAAG,CAAC,CAAC;IACjB,eAAe,GAAG,CAAC,CAAC;IACX,gBAAgB,CAAS;IACzB,YAAY,CAAS;IACrB,wBAAwB,CAAS;IAElD,YAAY,OAA+B;QACzC,IAAI,CAAC,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,MAAM,CAAC;QACpD,IAAI,CAAC,wBAAwB,GAAG,OAAO,EAAE,wBAAwB,IAAI,CAAC,CAAC;IACzE,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpF,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;YACzB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,OAAO,CAAI,EAAoB;QACnC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAErC,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,SAAS;QACf,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBACvD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;gBACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;gBACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC7E,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;YACpB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified error hierarchy for pilot-ai.
|
|
3
|
+
* Each error includes a machine-readable code, a user-friendly message, and optional cause.
|
|
4
|
+
*/
|
|
5
|
+
export declare class PilotError extends Error {
|
|
6
|
+
readonly code: string;
|
|
7
|
+
readonly userMessage: string;
|
|
8
|
+
constructor(message: string, options?: {
|
|
9
|
+
code?: string;
|
|
10
|
+
userMessage?: string;
|
|
11
|
+
cause?: unknown;
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export declare class AuthError extends PilotError {
|
|
15
|
+
constructor(message: string, options?: {
|
|
16
|
+
code?: string;
|
|
17
|
+
userMessage?: string;
|
|
18
|
+
cause?: unknown;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export declare class ToolError extends PilotError {
|
|
22
|
+
constructor(message: string, options?: {
|
|
23
|
+
code?: string;
|
|
24
|
+
userMessage?: string;
|
|
25
|
+
cause?: unknown;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
export declare class ConfigError extends PilotError {
|
|
29
|
+
constructor(message: string, options?: {
|
|
30
|
+
code?: string;
|
|
31
|
+
userMessage?: string;
|
|
32
|
+
cause?: unknown;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export declare class ExternalApiError extends PilotError {
|
|
36
|
+
readonly statusCode?: number;
|
|
37
|
+
constructor(message: string, options?: {
|
|
38
|
+
code?: string;
|
|
39
|
+
userMessage?: string;
|
|
40
|
+
cause?: unknown;
|
|
41
|
+
statusCode?: number;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export declare class TimeoutError extends PilotError {
|
|
45
|
+
constructor(message: string, options?: {
|
|
46
|
+
code?: string;
|
|
47
|
+
userMessage?: string;
|
|
48
|
+
cause?: unknown;
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Returns a user-friendly message for any error.
|
|
53
|
+
*/
|
|
54
|
+
export declare function getUserMessage(error: unknown): string;
|
|
55
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAEjB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAMhG;AAED,qBAAa,SAAU,SAAQ,UAAU;gBAC3B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAQhG;AAED,qBAAa,SAAU,SAAQ,UAAU;gBAC3B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAQhG;AAED,qBAAa,WAAY,SAAQ,UAAU;gBAC7B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAQhG;AAED,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;gBAEjB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;CASrH;AAED,qBAAa,YAAa,SAAQ,UAAU;gBAC9B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAQhG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQrD"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified error hierarchy for pilot-ai.
|
|
3
|
+
* Each error includes a machine-readable code, a user-friendly message, and optional cause.
|
|
4
|
+
*/
|
|
5
|
+
export class PilotError extends Error {
|
|
6
|
+
code;
|
|
7
|
+
userMessage;
|
|
8
|
+
constructor(message, options) {
|
|
9
|
+
super(message, { cause: options?.cause });
|
|
10
|
+
this.name = 'PilotError';
|
|
11
|
+
this.code = options?.code ?? 'PILOT_ERROR';
|
|
12
|
+
this.userMessage = options?.userMessage ?? message;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export class AuthError extends PilotError {
|
|
16
|
+
constructor(message, options) {
|
|
17
|
+
super(message, {
|
|
18
|
+
code: options?.code ?? 'AUTH_ERROR',
|
|
19
|
+
userMessage: options?.userMessage ?? 'Authentication failed. Please check your credentials.',
|
|
20
|
+
cause: options?.cause,
|
|
21
|
+
});
|
|
22
|
+
this.name = 'AuthError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class ToolError extends PilotError {
|
|
26
|
+
constructor(message, options) {
|
|
27
|
+
super(message, {
|
|
28
|
+
code: options?.code ?? 'TOOL_ERROR',
|
|
29
|
+
userMessage: options?.userMessage ?? 'A tool operation failed. Please try again.',
|
|
30
|
+
cause: options?.cause,
|
|
31
|
+
});
|
|
32
|
+
this.name = 'ToolError';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class ConfigError extends PilotError {
|
|
36
|
+
constructor(message, options) {
|
|
37
|
+
super(message, {
|
|
38
|
+
code: options?.code ?? 'CONFIG_ERROR',
|
|
39
|
+
userMessage: options?.userMessage ?? 'Configuration error. Run "pilot-ai init" to fix.',
|
|
40
|
+
cause: options?.cause,
|
|
41
|
+
});
|
|
42
|
+
this.name = 'ConfigError';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export class ExternalApiError extends PilotError {
|
|
46
|
+
statusCode;
|
|
47
|
+
constructor(message, options) {
|
|
48
|
+
super(message, {
|
|
49
|
+
code: options?.code ?? 'EXTERNAL_API_ERROR',
|
|
50
|
+
userMessage: options?.userMessage ?? 'An external service is temporarily unavailable.',
|
|
51
|
+
cause: options?.cause,
|
|
52
|
+
});
|
|
53
|
+
this.name = 'ExternalApiError';
|
|
54
|
+
this.statusCode = options?.statusCode;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export class TimeoutError extends PilotError {
|
|
58
|
+
constructor(message, options) {
|
|
59
|
+
super(message, {
|
|
60
|
+
code: options?.code ?? 'TIMEOUT_ERROR',
|
|
61
|
+
userMessage: options?.userMessage ?? 'The operation timed out. Please try again.',
|
|
62
|
+
cause: options?.cause,
|
|
63
|
+
});
|
|
64
|
+
this.name = 'TimeoutError';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Returns a user-friendly message for any error.
|
|
69
|
+
*/
|
|
70
|
+
export function getUserMessage(error) {
|
|
71
|
+
if (error instanceof PilotError) {
|
|
72
|
+
return error.userMessage;
|
|
73
|
+
}
|
|
74
|
+
if (error instanceof Error) {
|
|
75
|
+
return error.message;
|
|
76
|
+
}
|
|
77
|
+
return String(error);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,IAAI,CAAS;IACb,WAAW,CAAS;IAE7B,YAAY,OAAe,EAAE,OAAkE;QAC7F,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,aAAa,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,OAAO,CAAC;IACrD,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,UAAU;IACvC,YAAY,OAAe,EAAE,OAAkE;QAC7F,KAAK,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,YAAY;YACnC,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,uDAAuD;YAC5F,KAAK,EAAE,OAAO,EAAE,KAAK;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,UAAU;IACvC,YAAY,OAAe,EAAE,OAAkE;QAC7F,KAAK,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,YAAY;YACnC,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,4CAA4C;YACjF,KAAK,EAAE,OAAO,EAAE,KAAK;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,UAAU;IACzC,YAAY,OAAe,EAAE,OAAkE;QAC7F,KAAK,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,cAAc;YACrC,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,kDAAkD;YACvF,KAAK,EAAE,OAAO,EAAE,KAAK;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,UAAU;IACrC,UAAU,CAAU;IAE7B,YAAY,OAAe,EAAE,OAAuF;QAClH,KAAK,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,oBAAoB;YAC3C,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,iDAAiD;YACtF,KAAK,EAAE,OAAO,EAAE,KAAK;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC;IACxC,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,UAAU;IAC1C,YAAY,OAAe,EAAE,OAAkE;QAC7F,KAAK,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,eAAe;YACtC,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,4CAA4C;YACjF,KAAK,EAAE,OAAO,EAAE,KAAK;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,WAAW,CAAC;IAC3B,CAAC;IACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized escaping utilities for AppleScript and shell arguments.
|
|
3
|
+
* Replaces duplicated escape functions across notification.ts, calendar.ts, clipboard.ts.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Escapes a string for use inside AppleScript double-quoted strings.
|
|
7
|
+
* Handles: backslash, double quotes, backticks, and $() subshell expressions.
|
|
8
|
+
*/
|
|
9
|
+
export declare function escapeAppleScript(str: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Escapes a string for use as a POSIX shell argument.
|
|
12
|
+
* Wraps in single quotes and handles embedded single quotes.
|
|
13
|
+
*/
|
|
14
|
+
export declare function escapeShellArg(str: string): string;
|
|
15
|
+
//# sourceMappingURL=escape.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/utils/escape.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized escaping utilities for AppleScript and shell arguments.
|
|
3
|
+
* Replaces duplicated escape functions across notification.ts, calendar.ts, clipboard.ts.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Escapes a string for use inside AppleScript double-quoted strings.
|
|
7
|
+
* Handles: backslash, double quotes, backticks, and $() subshell expressions.
|
|
8
|
+
*/
|
|
9
|
+
export function escapeAppleScript(str) {
|
|
10
|
+
return str
|
|
11
|
+
.replace(/\\/g, '\\\\') // backslashes first
|
|
12
|
+
.replace(/"/g, '\\"') // double quotes
|
|
13
|
+
.replace(/`/g, '\\`') // backticks (prevent shell expansion in osascript)
|
|
14
|
+
.replace(/\$/g, '\\$'); // dollar signs (prevent $() expansion)
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Escapes a string for use as a POSIX shell argument.
|
|
18
|
+
* Wraps in single quotes and handles embedded single quotes.
|
|
19
|
+
*/
|
|
20
|
+
export function escapeShellArg(str) {
|
|
21
|
+
return `'${str.replace(/'/g, "'\\''")}'`;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=escape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/utils/escape.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,GAAG;SACP,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAG,oBAAoB;SAC7C,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAK,gBAAgB;SACzC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAK,mDAAmD;SAC5E,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAG,uCAAuC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured JSON logger with correlation IDs, log levels, and file output.
|
|
3
|
+
* Replaces ad-hoc console.error() calls throughout the codebase.
|
|
4
|
+
*/
|
|
5
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
6
|
+
/**
|
|
7
|
+
* Set the minimum log level (default: info).
|
|
8
|
+
*/
|
|
9
|
+
export declare function setLogLevel(level: LogLevel): void;
|
|
10
|
+
/**
|
|
11
|
+
* Set the current correlation ID for request tracing.
|
|
12
|
+
*/
|
|
13
|
+
export declare function setCorrelationId(id: string | undefined): void;
|
|
14
|
+
/**
|
|
15
|
+
* Generate a new correlation ID for a message processing cycle.
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateCorrelationId(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Get the current correlation ID.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getCorrelationId(): string | undefined;
|
|
22
|
+
export declare function log(level: LogLevel, message: string, extra?: Record<string, unknown>): void;
|
|
23
|
+
export declare function debug(message: string, extra?: Record<string, unknown>): void;
|
|
24
|
+
export declare function info(message: string, extra?: Record<string, unknown>): void;
|
|
25
|
+
export declare function warn(message: string, extra?: Record<string, unknown>): void;
|
|
26
|
+
export declare function error(message: string, extra?: Record<string, unknown>): void;
|
|
27
|
+
export declare function recordRequest(): void;
|
|
28
|
+
export declare function recordError(): void;
|
|
29
|
+
export declare function recordResponseTime(ms: number): void;
|
|
30
|
+
export declare function getMetrics(): {
|
|
31
|
+
requestCount: number;
|
|
32
|
+
errorCount: number;
|
|
33
|
+
avgResponseTimeMs: number;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* No-op for backward compatibility. Sync writes need no cleanup.
|
|
37
|
+
*/
|
|
38
|
+
export declare function closeLogger(): void;
|
|
39
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AA2B3D;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE7D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAI9C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAErD;AA+BD,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQ3F;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAE5E;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAE3E;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAE3E;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAE5E;AAID,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEnD;AAED,wBAAgB,UAAU,IAAI;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAQA;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
|