freeturtle 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 +190 -0
- package/README.md +392 -0
- package/dist/bin/freeturtle.d.ts +2 -0
- package/dist/bin/freeturtle.js +119 -0
- package/dist/bin/freeturtle.js.map +1 -0
- package/dist/src/approval.d.ts +38 -0
- package/dist/src/approval.js +140 -0
- package/dist/src/approval.js.map +1 -0
- package/dist/src/audit.d.ts +33 -0
- package/dist/src/audit.js +36 -0
- package/dist/src/audit.js.map +1 -0
- package/dist/src/channels/telegram.d.ts +10 -0
- package/dist/src/channels/telegram.js +41 -0
- package/dist/src/channels/telegram.js.map +1 -0
- package/dist/src/channels/terminal.d.ts +9 -0
- package/dist/src/channels/terminal.js +52 -0
- package/dist/src/channels/terminal.js.map +1 -0
- package/dist/src/channels/types.d.ts +6 -0
- package/dist/src/channels/types.js +2 -0
- package/dist/src/channels/types.js.map +1 -0
- package/dist/src/cli/approvals.d.ts +3 -0
- package/dist/src/cli/approvals.js +33 -0
- package/dist/src/cli/approvals.js.map +1 -0
- package/dist/src/cli/connect-farcaster.d.ts +5 -0
- package/dist/src/cli/connect-farcaster.js +265 -0
- package/dist/src/cli/connect-farcaster.js.map +1 -0
- package/dist/src/cli/connection-tests.d.ts +16 -0
- package/dist/src/cli/connection-tests.js +65 -0
- package/dist/src/cli/connection-tests.js.map +1 -0
- package/dist/src/cli/init.d.ts +1 -0
- package/dist/src/cli/init.js +729 -0
- package/dist/src/cli/init.js.map +1 -0
- package/dist/src/cli/install-service.d.ts +1 -0
- package/dist/src/cli/install-service.js +57 -0
- package/dist/src/cli/install-service.js.map +1 -0
- package/dist/src/cli/intake.d.ts +23 -0
- package/dist/src/cli/intake.js +68 -0
- package/dist/src/cli/intake.js.map +1 -0
- package/dist/src/cli/send.d.ts +1 -0
- package/dist/src/cli/send.js +16 -0
- package/dist/src/cli/send.js.map +1 -0
- package/dist/src/cli/start.d.ts +3 -0
- package/dist/src/cli/start.js +25 -0
- package/dist/src/cli/start.js.map +1 -0
- package/dist/src/cli/status.d.ts +2 -0
- package/dist/src/cli/status.js +54 -0
- package/dist/src/cli/status.js.map +1 -0
- package/dist/src/cli/update.d.ts +1 -0
- package/dist/src/cli/update.js +39 -0
- package/dist/src/cli/update.js.map +1 -0
- package/dist/src/config.d.ts +31 -0
- package/dist/src/config.js +93 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/daemon.d.ts +18 -0
- package/dist/src/daemon.js +272 -0
- package/dist/src/daemon.js.map +1 -0
- package/dist/src/heartbeat.d.ts +17 -0
- package/dist/src/heartbeat.js +60 -0
- package/dist/src/heartbeat.js.map +1 -0
- package/dist/src/llm.d.ts +29 -0
- package/dist/src/llm.js +225 -0
- package/dist/src/llm.js.map +1 -0
- package/dist/src/logger.d.ts +8 -0
- package/dist/src/logger.js +45 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/memory.d.ts +3 -0
- package/dist/src/memory.js +36 -0
- package/dist/src/memory.js.map +1 -0
- package/dist/src/modules/database/client.d.ts +18 -0
- package/dist/src/modules/database/client.js +50 -0
- package/dist/src/modules/database/client.js.map +1 -0
- package/dist/src/modules/database/index.d.ts +9 -0
- package/dist/src/modules/database/index.js +32 -0
- package/dist/src/modules/database/index.js.map +1 -0
- package/dist/src/modules/database/tools.d.ts +2 -0
- package/dist/src/modules/database/tools.js +26 -0
- package/dist/src/modules/database/tools.js.map +1 -0
- package/dist/src/modules/farcaster/client.d.ts +43 -0
- package/dist/src/modules/farcaster/client.js +87 -0
- package/dist/src/modules/farcaster/client.js.map +1 -0
- package/dist/src/modules/farcaster/index.d.ts +14 -0
- package/dist/src/modules/farcaster/index.js +71 -0
- package/dist/src/modules/farcaster/index.js.map +1 -0
- package/dist/src/modules/farcaster/tools.d.ts +2 -0
- package/dist/src/modules/farcaster/tools.js +90 -0
- package/dist/src/modules/farcaster/tools.js.map +1 -0
- package/dist/src/modules/github/client.d.ts +21 -0
- package/dist/src/modules/github/client.js +80 -0
- package/dist/src/modules/github/client.js.map +1 -0
- package/dist/src/modules/github/index.d.ts +13 -0
- package/dist/src/modules/github/index.js +45 -0
- package/dist/src/modules/github/index.js.map +1 -0
- package/dist/src/modules/github/tools.d.ts +2 -0
- package/dist/src/modules/github/tools.js +74 -0
- package/dist/src/modules/github/tools.js.map +1 -0
- package/dist/src/modules/loader.d.ts +5 -0
- package/dist/src/modules/loader.js +35 -0
- package/dist/src/modules/loader.js.map +1 -0
- package/dist/src/modules/onchain/client.d.ts +8 -0
- package/dist/src/modules/onchain/client.js +46 -0
- package/dist/src/modules/onchain/client.js.map +1 -0
- package/dist/src/modules/onchain/index.d.ts +13 -0
- package/dist/src/modules/onchain/index.js +40 -0
- package/dist/src/modules/onchain/index.js.map +1 -0
- package/dist/src/modules/onchain/tools.d.ts +2 -0
- package/dist/src/modules/onchain/tools.js +61 -0
- package/dist/src/modules/onchain/tools.js.map +1 -0
- package/dist/src/modules/types.d.ts +24 -0
- package/dist/src/modules/types.js +2 -0
- package/dist/src/modules/types.js.map +1 -0
- package/dist/src/modules/xmtp/index.d.ts +8 -0
- package/dist/src/modules/xmtp/index.js +14 -0
- package/dist/src/modules/xmtp/index.js.map +1 -0
- package/dist/src/policy.d.ts +45 -0
- package/dist/src/policy.js +164 -0
- package/dist/src/policy.js.map +1 -0
- package/dist/src/redaction.d.ts +13 -0
- package/dist/src/redaction.js +75 -0
- package/dist/src/redaction.js.map +1 -0
- package/dist/src/reliability.d.ts +16 -0
- package/dist/src/reliability.js +124 -0
- package/dist/src/reliability.js.map +1 -0
- package/dist/src/runner.d.ts +37 -0
- package/dist/src/runner.js +257 -0
- package/dist/src/runner.js.map +1 -0
- package/dist/src/scheduler.d.ts +22 -0
- package/dist/src/scheduler.js +61 -0
- package/dist/src/scheduler.js.map +1 -0
- package/dist/src/setup.d.ts +8 -0
- package/dist/src/setup.js +179 -0
- package/dist/src/setup.js.map +1 -0
- package/dist/src/soul.d.ts +1 -0
- package/dist/src/soul.js +15 -0
- package/dist/src/soul.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// Empty allowlist = deny all for that domain
|
|
2
|
+
// undefined/not set = allow all (no restriction)
|
|
3
|
+
export class PolicyDeniedError extends Error {
|
|
4
|
+
code;
|
|
5
|
+
constructor(code, message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "PolicyDeniedError";
|
|
8
|
+
this.code = code;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Core allowlist check:
|
|
13
|
+
* - undefined = no restrictions (allow all)
|
|
14
|
+
* - empty array [] = deny everything
|
|
15
|
+
* - populated array = only allow listed values (case-insensitive)
|
|
16
|
+
*/
|
|
17
|
+
function assertAllowed(allowlist, value, code, label) {
|
|
18
|
+
if (allowlist === undefined)
|
|
19
|
+
return; // not configured = allow all
|
|
20
|
+
if (allowlist.length === 0) {
|
|
21
|
+
throw new PolicyDeniedError(code, `${label} denied: no entries are allowed (empty allowlist)`);
|
|
22
|
+
}
|
|
23
|
+
const lower = value.toLowerCase();
|
|
24
|
+
const match = allowlist.some((item) => item.toLowerCase() === lower);
|
|
25
|
+
if (!match) {
|
|
26
|
+
throw new PolicyDeniedError(code, `${label} denied: "${value}" is not in the allowlist [${allowlist.join(", ")}]`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function assertGithubRepoAllowed(policy, repo) {
|
|
30
|
+
if (!policy)
|
|
31
|
+
return;
|
|
32
|
+
assertAllowed(policy.github?.allowed_repos, repo, "GITHUB_REPO_DENIED", "GitHub repo");
|
|
33
|
+
}
|
|
34
|
+
export function assertGithubPathAllowed(policy, path) {
|
|
35
|
+
if (!policy)
|
|
36
|
+
return;
|
|
37
|
+
assertAllowed(policy.github?.allowed_paths, path, "GITHUB_PATH_DENIED", "GitHub path");
|
|
38
|
+
}
|
|
39
|
+
export function assertGithubBranchAllowed(policy, branch) {
|
|
40
|
+
if (!policy)
|
|
41
|
+
return;
|
|
42
|
+
assertAllowed(policy.github?.approval_required_branches, branch, "GITHUB_BRANCH_DENIED", "GitHub branch");
|
|
43
|
+
}
|
|
44
|
+
export function assertFarcasterChannelAllowed(policy, channel) {
|
|
45
|
+
if (!policy)
|
|
46
|
+
return;
|
|
47
|
+
assertAllowed(policy.farcaster?.allowed_channels, channel, "FARCASTER_CHANNEL_DENIED", "Farcaster channel");
|
|
48
|
+
}
|
|
49
|
+
export function assertDatabaseScopeAllowed(policy, schema, table) {
|
|
50
|
+
if (!policy)
|
|
51
|
+
return;
|
|
52
|
+
assertAllowed(policy.database?.allowed_schemas, schema, "DATABASE_SCHEMA_DENIED", "Database schema");
|
|
53
|
+
assertAllowed(policy.database?.allowed_tables, table, "DATABASE_TABLE_DENIED", "Database table");
|
|
54
|
+
}
|
|
55
|
+
export function assertOnchainScopeAllowed(policy, contract, fn) {
|
|
56
|
+
if (!policy)
|
|
57
|
+
return;
|
|
58
|
+
assertAllowed(policy.onchain?.allowed_contracts, contract, "ONCHAIN_CONTRACT_DENIED", "Onchain contract");
|
|
59
|
+
if (fn !== undefined) {
|
|
60
|
+
assertAllowed(policy.onchain?.allowed_read_functions, fn, "ONCHAIN_FUNCTION_DENIED", "Onchain function");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Determines whether a tool call requires human approval before execution.
|
|
65
|
+
* - delete_cast => always true
|
|
66
|
+
* - commit_file => true if branch is in approval_required_branches (default ["main"])
|
|
67
|
+
* - everything else => false
|
|
68
|
+
*/
|
|
69
|
+
export function requiresApproval(policy, toolName, input) {
|
|
70
|
+
if (toolName === "delete_cast")
|
|
71
|
+
return true;
|
|
72
|
+
if (toolName === "commit_file") {
|
|
73
|
+
const branch = input.branch ?? "main";
|
|
74
|
+
const approvalBranches = policy?.github?.approval_required_branches ?? ["main"];
|
|
75
|
+
return approvalBranches.some((b) => b.toLowerCase() === branch.toLowerCase());
|
|
76
|
+
}
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
export function getDefaultPolicy() {
|
|
80
|
+
return {
|
|
81
|
+
github: {
|
|
82
|
+
allowed_repos: [],
|
|
83
|
+
allowed_paths: [],
|
|
84
|
+
approval_required_branches: ["main"],
|
|
85
|
+
},
|
|
86
|
+
farcaster: {
|
|
87
|
+
allowed_channels: [],
|
|
88
|
+
},
|
|
89
|
+
database: {
|
|
90
|
+
allowed_schemas: [],
|
|
91
|
+
allowed_tables: [],
|
|
92
|
+
},
|
|
93
|
+
onchain: {
|
|
94
|
+
allowed_contracts: [],
|
|
95
|
+
allowed_read_functions: [],
|
|
96
|
+
},
|
|
97
|
+
approvals: {
|
|
98
|
+
timeout_seconds: 300,
|
|
99
|
+
fail_mode: "deny",
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Parse a raw config object (from the ## Policy section) into a PolicyConfig.
|
|
105
|
+
* Expects subsections like github.allowed_repos as comma-separated strings.
|
|
106
|
+
*/
|
|
107
|
+
export function parsePolicy(raw) {
|
|
108
|
+
const defaults = getDefaultPolicy();
|
|
109
|
+
function parseList(value) {
|
|
110
|
+
if (value === undefined)
|
|
111
|
+
return undefined;
|
|
112
|
+
if (typeof value === "boolean")
|
|
113
|
+
return [];
|
|
114
|
+
const trimmed = value.trim();
|
|
115
|
+
if (trimmed === "")
|
|
116
|
+
return [];
|
|
117
|
+
return trimmed.split(",").map((s) => s.trim()).filter((s) => s.length > 0);
|
|
118
|
+
}
|
|
119
|
+
function parseString(value, fallback) {
|
|
120
|
+
if (value === undefined || typeof value === "boolean")
|
|
121
|
+
return fallback;
|
|
122
|
+
return value.trim() || fallback;
|
|
123
|
+
}
|
|
124
|
+
function parseNumber(value, fallback) {
|
|
125
|
+
if (value === undefined || typeof value === "boolean")
|
|
126
|
+
return fallback;
|
|
127
|
+
const n = Number(value);
|
|
128
|
+
return Number.isNaN(n) ? fallback : n;
|
|
129
|
+
}
|
|
130
|
+
const github = raw.github ?? {};
|
|
131
|
+
const farcaster = raw.farcaster ?? {};
|
|
132
|
+
const database = raw.database ?? {};
|
|
133
|
+
const onchain = raw.onchain ?? {};
|
|
134
|
+
const approvals = raw.approvals ?? {};
|
|
135
|
+
return {
|
|
136
|
+
github: {
|
|
137
|
+
allowed_repos: parseList(github.allowed_repos) ?? defaults.github.allowed_repos,
|
|
138
|
+
allowed_paths: parseList(github.allowed_paths) ?? defaults.github.allowed_paths,
|
|
139
|
+
approval_required_branches: parseList(github.approval_required_branches) ??
|
|
140
|
+
defaults.github.approval_required_branches,
|
|
141
|
+
},
|
|
142
|
+
farcaster: {
|
|
143
|
+
allowed_channels: parseList(farcaster.allowed_channels) ??
|
|
144
|
+
defaults.farcaster.allowed_channels,
|
|
145
|
+
},
|
|
146
|
+
database: {
|
|
147
|
+
allowed_schemas: parseList(database.allowed_schemas) ??
|
|
148
|
+
defaults.database.allowed_schemas,
|
|
149
|
+
allowed_tables: parseList(database.allowed_tables) ??
|
|
150
|
+
defaults.database.allowed_tables,
|
|
151
|
+
},
|
|
152
|
+
onchain: {
|
|
153
|
+
allowed_contracts: parseList(onchain.allowed_contracts) ??
|
|
154
|
+
defaults.onchain.allowed_contracts,
|
|
155
|
+
allowed_read_functions: parseList(onchain.allowed_read_functions) ??
|
|
156
|
+
defaults.onchain.allowed_read_functions,
|
|
157
|
+
},
|
|
158
|
+
approvals: {
|
|
159
|
+
timeout_seconds: parseNumber(approvals.timeout_seconds, defaults.approvals.timeout_seconds),
|
|
160
|
+
fail_mode: parseString(approvals.fail_mode, defaults.approvals.fail_mode),
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const SENSITIVE_KEYS: string[];
|
|
2
|
+
export declare const SENSITIVE_PATTERNS: RegExp[];
|
|
3
|
+
/**
|
|
4
|
+
* Deep clone and redact sensitive fields/patterns.
|
|
5
|
+
* - For objects: if key matches SENSITIVE_KEYS, replace value with "***"
|
|
6
|
+
* - For strings: replace SENSITIVE_PATTERNS matches with first 4 chars + "***"
|
|
7
|
+
* - Recurse into arrays and nested objects
|
|
8
|
+
*/
|
|
9
|
+
export declare function redact(obj: unknown): unknown;
|
|
10
|
+
/**
|
|
11
|
+
* Replace sensitive patterns in a string with the first 4 characters + "***".
|
|
12
|
+
*/
|
|
13
|
+
export declare function redactString(str: string): string;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// List of keys that should be redacted in nested objects
|
|
2
|
+
export const SENSITIVE_KEYS = [
|
|
3
|
+
"password",
|
|
4
|
+
"token",
|
|
5
|
+
"secret",
|
|
6
|
+
"key",
|
|
7
|
+
"mnemonic",
|
|
8
|
+
"signer_uuid",
|
|
9
|
+
"api_key",
|
|
10
|
+
"auth",
|
|
11
|
+
"credential",
|
|
12
|
+
];
|
|
13
|
+
// Mask patterns in strings (API keys, tokens, etc)
|
|
14
|
+
export const SENSITIVE_PATTERNS = [
|
|
15
|
+
/sk-[a-zA-Z0-9]{20,}/g, // Anthropic/OpenAI keys
|
|
16
|
+
/ghp_[a-zA-Z0-9]{36}/g, // GitHub tokens
|
|
17
|
+
/neynar-[a-zA-Z0-9]+/g, // Neynar keys
|
|
18
|
+
/0x[a-fA-F0-9]{64}/g, // Private keys (64 hex chars)
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* Deep clone and redact sensitive fields/patterns.
|
|
22
|
+
* - For objects: if key matches SENSITIVE_KEYS, replace value with "***"
|
|
23
|
+
* - For strings: replace SENSITIVE_PATTERNS matches with first 4 chars + "***"
|
|
24
|
+
* - Recurse into arrays and nested objects
|
|
25
|
+
*/
|
|
26
|
+
export function redact(obj) {
|
|
27
|
+
return redactValue(obj, false);
|
|
28
|
+
}
|
|
29
|
+
function redactValue(value, isSensitiveKey) {
|
|
30
|
+
if (value === null || value === undefined)
|
|
31
|
+
return value;
|
|
32
|
+
// If this value sits under a sensitive key, mask it entirely
|
|
33
|
+
if (isSensitiveKey) {
|
|
34
|
+
if (typeof value === "string")
|
|
35
|
+
return "***";
|
|
36
|
+
if (typeof value === "number" || typeof value === "boolean")
|
|
37
|
+
return "***";
|
|
38
|
+
// For objects/arrays under a sensitive key, still mask to "***"
|
|
39
|
+
return "***";
|
|
40
|
+
}
|
|
41
|
+
if (typeof value === "string") {
|
|
42
|
+
return redactString(value);
|
|
43
|
+
}
|
|
44
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
if (Array.isArray(value)) {
|
|
48
|
+
return value.map((item) => redactValue(item, false));
|
|
49
|
+
}
|
|
50
|
+
if (typeof value === "object") {
|
|
51
|
+
const result = {};
|
|
52
|
+
for (const [k, v] of Object.entries(value)) {
|
|
53
|
+
const keyIsSensitive = SENSITIVE_KEYS.some((sk) => k.toLowerCase().includes(sk));
|
|
54
|
+
result[k] = redactValue(v, keyIsSensitive);
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Replace sensitive patterns in a string with the first 4 characters + "***".
|
|
62
|
+
*/
|
|
63
|
+
export function redactString(str) {
|
|
64
|
+
let result = str;
|
|
65
|
+
for (const pattern of SENSITIVE_PATTERNS) {
|
|
66
|
+
// Reset lastIndex since these are global regexes
|
|
67
|
+
pattern.lastIndex = 0;
|
|
68
|
+
result = result.replace(pattern, (match) => {
|
|
69
|
+
const prefix = match.slice(0, 4);
|
|
70
|
+
return `${prefix}***`;
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=redaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.js","sourceRoot":"","sources":["../../src/redaction.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,UAAU;IACV,OAAO;IACP,QAAQ;IACR,KAAK;IACL,UAAU;IACV,aAAa;IACb,SAAS;IACT,MAAM;IACN,YAAY;CACb,CAAC;AAEF,mDAAmD;AACnD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,sBAAsB,EAAE,wBAAwB;IAChD,sBAAsB,EAAE,gBAAgB;IACxC,sBAAsB,EAAE,cAAc;IACtC,oBAAoB,EAAE,8BAA8B;CACrD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,GAAY;IACjC,OAAO,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,cAAuB;IAC1D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAExD,6DAA6D;IAC7D,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC1E,gEAAgE;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;YACtE,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,CACxC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CACrC,CAAC;YACF,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;QACzC,iDAAiD;QACjD,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACtB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACzC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACjC,OAAO,GAAG,MAAM,KAAK,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface RetryOptions {
|
|
2
|
+
maxRetries: number;
|
|
3
|
+
baseDelayMs: number;
|
|
4
|
+
maxDelayMs: number;
|
|
5
|
+
timeoutMs: number;
|
|
6
|
+
retryOn?: (err: unknown) => boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Default classifier: retry on network errors, 429, 5xx.
|
|
10
|
+
* Don't retry 4xx (except 429).
|
|
11
|
+
*/
|
|
12
|
+
export declare function isRetryable(err: unknown): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Wraps an async function with timeout + exponential backoff + jitter.
|
|
15
|
+
*/
|
|
16
|
+
export declare function withRetry<T>(fn: () => Promise<T>, opts?: Partial<RetryOptions>): Promise<T>;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
const DEFAULT_OPTIONS = {
|
|
2
|
+
maxRetries: 3,
|
|
3
|
+
baseDelayMs: 1000,
|
|
4
|
+
maxDelayMs: 30000,
|
|
5
|
+
timeoutMs: 30000,
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Default classifier: retry on network errors, 429, 5xx.
|
|
9
|
+
* Don't retry 4xx (except 429).
|
|
10
|
+
*/
|
|
11
|
+
export function isRetryable(err) {
|
|
12
|
+
if (err === null || err === undefined)
|
|
13
|
+
return false;
|
|
14
|
+
// Check for status/statusCode properties (HTTP errors)
|
|
15
|
+
if (typeof err === "object") {
|
|
16
|
+
const obj = err;
|
|
17
|
+
const status = typeof obj.status === "number"
|
|
18
|
+
? obj.status
|
|
19
|
+
: typeof obj.statusCode === "number"
|
|
20
|
+
? obj.statusCode
|
|
21
|
+
: undefined;
|
|
22
|
+
if (status !== undefined) {
|
|
23
|
+
if (status === 429)
|
|
24
|
+
return true; // rate limited
|
|
25
|
+
if (status >= 500)
|
|
26
|
+
return true; // server errors
|
|
27
|
+
if (status >= 400 && status < 500)
|
|
28
|
+
return false; // client errors (except 429)
|
|
29
|
+
}
|
|
30
|
+
// Check for response.status (e.g. fetch-style errors)
|
|
31
|
+
if (typeof obj.response === "object" &&
|
|
32
|
+
obj.response !== null) {
|
|
33
|
+
const resp = obj.response;
|
|
34
|
+
const respStatus = typeof resp.status === "number" ? resp.status : undefined;
|
|
35
|
+
if (respStatus !== undefined) {
|
|
36
|
+
if (respStatus === 429)
|
|
37
|
+
return true;
|
|
38
|
+
if (respStatus >= 500)
|
|
39
|
+
return true;
|
|
40
|
+
if (respStatus >= 400 && respStatus < 500)
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Network errors (Node.js)
|
|
45
|
+
const code = typeof obj.code === "string" ? obj.code : "";
|
|
46
|
+
const networkCodes = [
|
|
47
|
+
"ECONNRESET",
|
|
48
|
+
"ECONNREFUSED",
|
|
49
|
+
"ENOTFOUND",
|
|
50
|
+
"ETIMEDOUT",
|
|
51
|
+
"EPIPE",
|
|
52
|
+
"EAI_AGAIN",
|
|
53
|
+
"ENETUNREACH",
|
|
54
|
+
"EHOSTUNREACH",
|
|
55
|
+
"UND_ERR_SOCKET",
|
|
56
|
+
"UND_ERR_CONNECT_TIMEOUT",
|
|
57
|
+
"FETCH_ERROR",
|
|
58
|
+
];
|
|
59
|
+
if (networkCodes.includes(code))
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
// Check error message for common network issues
|
|
63
|
+
if (err instanceof Error) {
|
|
64
|
+
const msg = err.message.toLowerCase();
|
|
65
|
+
if (msg.includes("network") ||
|
|
66
|
+
msg.includes("timeout") ||
|
|
67
|
+
msg.includes("econnreset") ||
|
|
68
|
+
msg.includes("econnrefused") ||
|
|
69
|
+
msg.includes("socket hang up") ||
|
|
70
|
+
msg.includes("fetch failed")) {
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Wraps an async function with timeout + exponential backoff + jitter.
|
|
78
|
+
*/
|
|
79
|
+
export async function withRetry(fn, opts) {
|
|
80
|
+
const options = { ...DEFAULT_OPTIONS, ...opts };
|
|
81
|
+
const classifier = options.retryOn ?? isRetryable;
|
|
82
|
+
let lastError;
|
|
83
|
+
for (let attempt = 0; attempt <= options.maxRetries; attempt++) {
|
|
84
|
+
try {
|
|
85
|
+
const result = await withTimeout(fn(), options.timeoutMs);
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
lastError = err;
|
|
90
|
+
// Don't retry if we've exhausted attempts
|
|
91
|
+
if (attempt >= options.maxRetries)
|
|
92
|
+
break;
|
|
93
|
+
// Don't retry if the error isn't retryable
|
|
94
|
+
if (!classifier(err))
|
|
95
|
+
break;
|
|
96
|
+
// Exponential backoff with jitter
|
|
97
|
+
const exponentialDelay = options.baseDelayMs * Math.pow(2, attempt);
|
|
98
|
+
const cappedDelay = Math.min(exponentialDelay, options.maxDelayMs);
|
|
99
|
+
const jitteredDelay = cappedDelay * (0.5 + Math.random());
|
|
100
|
+
await sleep(jitteredDelay);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
throw lastError;
|
|
104
|
+
}
|
|
105
|
+
function withTimeout(promise, timeoutMs) {
|
|
106
|
+
if (timeoutMs <= 0 || !Number.isFinite(timeoutMs))
|
|
107
|
+
return promise;
|
|
108
|
+
return new Promise((resolve, reject) => {
|
|
109
|
+
const timer = setTimeout(() => {
|
|
110
|
+
reject(new Error(`Operation timed out after ${timeoutMs}ms`));
|
|
111
|
+
}, timeoutMs);
|
|
112
|
+
promise.then((value) => {
|
|
113
|
+
clearTimeout(timer);
|
|
114
|
+
resolve(value);
|
|
115
|
+
}, (err) => {
|
|
116
|
+
clearTimeout(timer);
|
|
117
|
+
reject(err);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
function sleep(ms) {
|
|
122
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=reliability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reliability.js","sourceRoot":"","sources":["../../src/reliability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { LLMClient } from "./llm.js";
|
|
2
|
+
import type { FreeTurtleModule } from "./modules/types.js";
|
|
3
|
+
import type { Logger } from "./logger.js";
|
|
4
|
+
import type { PolicyConfig } from "./policy.js";
|
|
5
|
+
import { ApprovalManager } from "./approval.js";
|
|
6
|
+
export interface TaskConfig {
|
|
7
|
+
name: string;
|
|
8
|
+
prompt: string;
|
|
9
|
+
output?: string;
|
|
10
|
+
isHeartbeat?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface TaskResult {
|
|
13
|
+
response: string;
|
|
14
|
+
toolsCalled: string[];
|
|
15
|
+
durationMs: number;
|
|
16
|
+
}
|
|
17
|
+
export type ApprovalNotifier = (message: string) => void;
|
|
18
|
+
export declare class TaskRunner {
|
|
19
|
+
private dir;
|
|
20
|
+
private llm;
|
|
21
|
+
private modules;
|
|
22
|
+
private logger;
|
|
23
|
+
private policy?;
|
|
24
|
+
private approvalManager;
|
|
25
|
+
private auditLogger;
|
|
26
|
+
private onApprovalNeeded?;
|
|
27
|
+
constructor(dir: string, llm: LLMClient, modules: FreeTurtleModule[], logger: Logger, options?: {
|
|
28
|
+
policy?: PolicyConfig;
|
|
29
|
+
onApprovalNeeded?: ApprovalNotifier;
|
|
30
|
+
});
|
|
31
|
+
runTask(task: TaskConfig): Promise<TaskResult>;
|
|
32
|
+
runMessage(message: string, channel: string): Promise<string>;
|
|
33
|
+
getApprovalManager(): ApprovalManager;
|
|
34
|
+
private buildSystemPrompt;
|
|
35
|
+
private collectTools;
|
|
36
|
+
private buildExecutor;
|
|
37
|
+
}
|