@poolzin/pool-bot 2026.3.15 → 2026.3.17
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/CHANGELOG.md +20 -0
- package/dist/agents/checkpoint-manager.js +1 -2
- package/dist/build-info.json +3 -3
- package/docs/assets-evaluation.md +418 -0
- package/docs/branding-evaluation-2026-03-12.md +285 -0
- package/docs/commit-evaluation-42f463de4.md +362 -0
- package/docs/extensions-evaluation.md +696 -0
- package/docs/hexstrike-evaluation.md +514 -0
- package/docs/implementations-summary.md +300 -0
- package/docs/version-2026.3.16-evaluation.md +190 -0
- package/extensions/dexter/README.md +147 -0
- package/extensions/dexter/dist/agent.d.ts +44 -0
- package/extensions/dexter/dist/agent.js +265 -0
- package/extensions/dexter/dist/index.d.ts +12 -0
- package/extensions/dexter/dist/index.js +99 -0
- package/extensions/dexter/node_modules/.bin/tsc +21 -0
- package/extensions/dexter/node_modules/.bin/tsserver +21 -0
- package/extensions/dexter/package.json +33 -0
- package/extensions/dexter/poolbot.plugin.json +35 -0
- package/extensions/dexter/src/agent.ts +375 -0
- package/extensions/dexter/src/index.ts +129 -0
- package/extensions/dexter/tsconfig.json +20 -0
- package/extensions/hackingtool/README.md +75 -0
- package/extensions/hackingtool/dist/client.d.ts +34 -0
- package/extensions/hackingtool/dist/client.js +82 -0
- package/extensions/hackingtool/dist/index.d.ts +12 -0
- package/extensions/hackingtool/dist/index.js +163 -0
- package/extensions/hackingtool/dist/server-manager.d.ts +25 -0
- package/extensions/hackingtool/dist/server-manager.js +107 -0
- package/extensions/hackingtool/node_modules/.bin/tsc +21 -0
- package/extensions/hackingtool/node_modules/.bin/tsserver +21 -0
- package/extensions/hackingtool/package.json +36 -0
- package/extensions/hackingtool/poolbot.plugin.json +55 -0
- package/extensions/hackingtool/src/client.ts +120 -0
- package/extensions/hackingtool/src/index.ts +181 -0
- package/extensions/hackingtool/src/server/hackingtool_mcp.py +454 -0
- package/extensions/hackingtool/src/server/requirements.txt +2 -0
- package/extensions/hackingtool/src/server-manager.ts +128 -0
- package/extensions/hackingtool/tsconfig.json +20 -0
- package/extensions/hexstrike-ai/README.md +693 -44
- package/extensions/hexstrike-ai/src/client.test.ts +335 -0
- package/extensions/hexstrike-ai/src/server-manager.test.ts +286 -0
- package/package.json +1 -1
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
export class DexterAgent extends EventEmitter {
|
|
3
|
+
config;
|
|
4
|
+
activeQueries;
|
|
5
|
+
constructor(config = {}) {
|
|
6
|
+
super();
|
|
7
|
+
this.config = config;
|
|
8
|
+
this.activeQueries = new Map();
|
|
9
|
+
}
|
|
10
|
+
async research(query) {
|
|
11
|
+
const queryId = `query_${Date.now()}`;
|
|
12
|
+
this.emit("start", { query, queryId });
|
|
13
|
+
const result = {
|
|
14
|
+
query,
|
|
15
|
+
answer: "",
|
|
16
|
+
sources: [],
|
|
17
|
+
financialData: [],
|
|
18
|
+
confidence: 0,
|
|
19
|
+
stepsExecuted: 0,
|
|
20
|
+
};
|
|
21
|
+
try {
|
|
22
|
+
const steps = this.planResearch(query);
|
|
23
|
+
for (const step of steps) {
|
|
24
|
+
this.emit("step", { queryId, step, number: result.stepsExecuted + 1 });
|
|
25
|
+
const stepResult = await this.executeStep(step);
|
|
26
|
+
result.stepsExecuted++;
|
|
27
|
+
if (stepResult.type === "financial_data") {
|
|
28
|
+
result.financialData?.push(...stepResult.data);
|
|
29
|
+
}
|
|
30
|
+
else if (stepResult.type === "web_search") {
|
|
31
|
+
result.sources.push(...stepResult.sources);
|
|
32
|
+
}
|
|
33
|
+
if (result.stepsExecuted >= (this.config.maxSteps ?? 10)) {
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
result.answer = this.synthesizeAnswer(query, result);
|
|
38
|
+
result.confidence = this.calculateConfidence(result);
|
|
39
|
+
this.activeQueries.set(queryId, result);
|
|
40
|
+
this.emit("complete", { queryId, result });
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
this.emit("error", { queryId, error });
|
|
45
|
+
throw error;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
planResearch(query) {
|
|
49
|
+
const steps = [];
|
|
50
|
+
const tickerMatch = query.match(/\b([A-Z]{1,5})\b/);
|
|
51
|
+
if (tickerMatch) {
|
|
52
|
+
const ticker = tickerMatch[1];
|
|
53
|
+
if (query.toLowerCase().includes("revenue") || query.toLowerCase().includes("income")) {
|
|
54
|
+
steps.push({
|
|
55
|
+
type: "financial_search",
|
|
56
|
+
params: { ticker, metric: "income_statements", limit: 4 },
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (query.toLowerCase().includes("balance") || query.toLowerCase().includes("assets") || query.toLowerCase().includes("liabilities")) {
|
|
60
|
+
steps.push({
|
|
61
|
+
type: "financial_search",
|
|
62
|
+
params: { ticker, metric: "balance_sheets", limit: 4 },
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
if (query.toLowerCase().includes("cash flow") || query.toLowerCase().includes("free cash")) {
|
|
66
|
+
steps.push({
|
|
67
|
+
type: "financial_search",
|
|
68
|
+
params: { ticker, metric: "cash_flow_statements", limit: 4 },
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
if (query.toLowerCase().includes("metrics") || query.toLowerCase().includes("ratios") || query.toLowerCase().includes("pe ratio") || query.toLowerCase().includes("market cap")) {
|
|
72
|
+
steps.push({
|
|
73
|
+
type: "financial_metrics",
|
|
74
|
+
params: { ticker },
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (query.toLowerCase().includes("news") || query.toLowerCase().includes("recent") || query.toLowerCase().includes("latest")) {
|
|
79
|
+
steps.push({
|
|
80
|
+
type: "web_search",
|
|
81
|
+
params: {
|
|
82
|
+
query: `${tickerMatch ? tickerMatch[1] + " " : ""}${query}`,
|
|
83
|
+
numResults: 5,
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
if (steps.length === 0) {
|
|
88
|
+
steps.push({
|
|
89
|
+
type: "web_search",
|
|
90
|
+
params: { query, numResults: 5 },
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return steps;
|
|
94
|
+
}
|
|
95
|
+
async executeStep(step) {
|
|
96
|
+
switch (step.type) {
|
|
97
|
+
case "financial_search": {
|
|
98
|
+
const { ticker, metric, limit } = step.params;
|
|
99
|
+
if (!this.config.financialDatasetsApiKey) {
|
|
100
|
+
return {
|
|
101
|
+
type: "financial_data",
|
|
102
|
+
data: [],
|
|
103
|
+
simulated: true,
|
|
104
|
+
message: "Financial datasets API key not configured",
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
const response = await fetch(`https://api.financialdatasets.ai/financials/${ticker.toLowerCase()}/${metric}?limit=${limit}`, {
|
|
108
|
+
headers: {
|
|
109
|
+
"X-API-Key": this.config.financialDatasetsApiKey,
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
if (!response.ok) {
|
|
113
|
+
throw new Error(`Financial API error: ${response.statusText}`);
|
|
114
|
+
}
|
|
115
|
+
const data = await response.json();
|
|
116
|
+
return {
|
|
117
|
+
type: "financial_data",
|
|
118
|
+
data: this.parseFinancialData(data, metric),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
case "financial_metrics": {
|
|
122
|
+
const { ticker } = step.params;
|
|
123
|
+
if (!this.config.financialDatasetsApiKey) {
|
|
124
|
+
return {
|
|
125
|
+
type: "financial_data",
|
|
126
|
+
data: [],
|
|
127
|
+
simulated: true,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
const response = await fetch(`https://api.financialdatasets.ai/metrics/${ticker.toLowerCase()}`, {
|
|
131
|
+
headers: {
|
|
132
|
+
"X-API-Key": this.config.financialDatasetsApiKey,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
if (!response.ok) {
|
|
136
|
+
throw new Error(`Metrics API error: ${response.statusText}`);
|
|
137
|
+
}
|
|
138
|
+
const data = await response.json();
|
|
139
|
+
return {
|
|
140
|
+
type: "financial_data",
|
|
141
|
+
data: this.parseMetricsData(data),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
case "web_search": {
|
|
145
|
+
const { query, numResults } = step.params;
|
|
146
|
+
if (this.config.exaApiKey) {
|
|
147
|
+
const response = await fetch("https://api.exa.ai/search", {
|
|
148
|
+
method: "POST",
|
|
149
|
+
headers: {
|
|
150
|
+
"Content-Type": "application/json",
|
|
151
|
+
"x-api-key": this.config.exaApiKey,
|
|
152
|
+
},
|
|
153
|
+
body: JSON.stringify({
|
|
154
|
+
query,
|
|
155
|
+
numResults: numResults || 5,
|
|
156
|
+
useAutoprompt: true,
|
|
157
|
+
type: "auto",
|
|
158
|
+
}),
|
|
159
|
+
});
|
|
160
|
+
if (response.ok) {
|
|
161
|
+
const data = await response.json();
|
|
162
|
+
return {
|
|
163
|
+
type: "web_search",
|
|
164
|
+
sources: data.results?.map((r) => ({
|
|
165
|
+
title: r.title,
|
|
166
|
+
url: r.url,
|
|
167
|
+
snippet: r.text || r.summary || "",
|
|
168
|
+
})) || [],
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
type: "web_search",
|
|
174
|
+
sources: [],
|
|
175
|
+
simulated: true,
|
|
176
|
+
message: "Exa API key not configured",
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
default:
|
|
180
|
+
return { type: "unknown" };
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
parseFinancialData(data, metric) {
|
|
184
|
+
const results = [];
|
|
185
|
+
if (data?.financials) {
|
|
186
|
+
for (const financial of data.financials) {
|
|
187
|
+
if (metric === "income_statements" && financial.income_statement) {
|
|
188
|
+
const is = financial.income_statement;
|
|
189
|
+
results.push({ ticker: data.ticker, metric: "revenue", value: is.revenue, period: financial.period, date: financial.fiscal_year }, { ticker: data.ticker, metric: "net_income", value: is.net_income, period: financial.period, date: financial.fiscal_year }, { ticker: data.ticker, metric: "operating_income", value: is.operating_income, period: financial.period, date: financial.fiscal_year });
|
|
190
|
+
}
|
|
191
|
+
if (metric === "balance_sheets" && financial.balance_sheet) {
|
|
192
|
+
const bs = financial.balance_sheet;
|
|
193
|
+
results.push({ ticker: data.ticker, metric: "total_assets", value: bs.total_assets, period: financial.period, date: financial.fiscal_year }, { ticker: data.ticker, metric: "total_liabilities", value: bs.total_liabilities, period: financial.period, date: financial.fiscal_year }, { ticker: data.ticker, metric: "total_equity", value: bs.total_equity, period: financial.period, date: financial.fiscal_year });
|
|
194
|
+
}
|
|
195
|
+
if (metric === "cash_flow_statements" && financial.cash_flow_statement) {
|
|
196
|
+
const cf = financial.cash_flow_statement;
|
|
197
|
+
results.push({ ticker: data.ticker, metric: "operating_cash_flow", value: cf.operating_cash_flow, period: financial.period, date: financial.fiscal_year }, { ticker: data.ticker, metric: "free_cash_flow", value: cf.free_cash_flow, period: financial.period, date: financial.fiscal_year });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return results;
|
|
202
|
+
}
|
|
203
|
+
parseMetricsData(data) {
|
|
204
|
+
const results = [];
|
|
205
|
+
if (data?.metrics) {
|
|
206
|
+
const m = data.metrics;
|
|
207
|
+
results.push({ ticker: data.ticker, metric: "market_cap", value: m.market_cap, date: data.as_of_date }, { ticker: data.ticker, metric: "pe_ratio", value: m.price_to_earnings_ratio, date: data.as_of_date }, { ticker: data.ticker, metric: "pb_ratio", value: m.price_to_book_ratio, date: data.as_of_date }, { ticker: data.ticker, metric: "debt_to_equity", value: m.debt_to_equity, date: data.as_of_date }, { ticker: data.ticker, metric: "roe", value: m.return_on_equity, date: data.as_of_date });
|
|
208
|
+
}
|
|
209
|
+
return results;
|
|
210
|
+
}
|
|
211
|
+
synthesizeAnswer(_query, result) {
|
|
212
|
+
const parts = [];
|
|
213
|
+
if (result.financialData && result.financialData.length > 0) {
|
|
214
|
+
parts.push("📊 **Financial Data:**\n");
|
|
215
|
+
const byTicker = new Map();
|
|
216
|
+
for (const data of result.financialData) {
|
|
217
|
+
if (!byTicker.has(data.ticker)) {
|
|
218
|
+
byTicker.set(data.ticker, []);
|
|
219
|
+
}
|
|
220
|
+
byTicker.get(data.ticker).push(data);
|
|
221
|
+
}
|
|
222
|
+
for (const [ticker, data] of byTicker.entries()) {
|
|
223
|
+
parts.push(`**${ticker}**:`);
|
|
224
|
+
for (const item of data.slice(0, 8)) {
|
|
225
|
+
const formattedValue = typeof item.value === "number"
|
|
226
|
+
? item.value > 1e9
|
|
227
|
+
? `$${(item.value / 1e9).toFixed(2)}B`
|
|
228
|
+
: `$${item.value.toLocaleString()}`
|
|
229
|
+
: String(item.value);
|
|
230
|
+
parts.push(` • ${item.metric.replace(/_/g, " ")}: ${formattedValue}${item.period ? ` (${item.period})` : ""}`);
|
|
231
|
+
}
|
|
232
|
+
parts.push("");
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
if (result.sources.length > 0) {
|
|
236
|
+
parts.push("📰 **Sources:**\n");
|
|
237
|
+
for (const source of result.sources.slice(0, 5)) {
|
|
238
|
+
parts.push(`• [${source.title}](${source.url})`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (result.stepsExecuted > 0) {
|
|
242
|
+
parts.push(`\n🔍 Research completed in ${result.stepsExecuted} step(s)`);
|
|
243
|
+
}
|
|
244
|
+
return parts.join("\n") || "No relevant data found.";
|
|
245
|
+
}
|
|
246
|
+
calculateConfidence(result) {
|
|
247
|
+
let score = 0;
|
|
248
|
+
if (result.financialData && result.financialData.length > 0) {
|
|
249
|
+
score += 0.4;
|
|
250
|
+
}
|
|
251
|
+
if (result.sources.length > 0) {
|
|
252
|
+
score += Math.min(0.3, result.sources.length * 0.06);
|
|
253
|
+
}
|
|
254
|
+
if (result.stepsExecuted > 0) {
|
|
255
|
+
score += 0.3;
|
|
256
|
+
}
|
|
257
|
+
return Math.min(1.0, score);
|
|
258
|
+
}
|
|
259
|
+
getActiveQueries() {
|
|
260
|
+
return Array.from(this.activeQueries.entries()).map(([queryId, result]) => ({
|
|
261
|
+
queryId,
|
|
262
|
+
result,
|
|
263
|
+
}));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DexterAgent } from "./agent.js";
|
|
2
|
+
interface DexterConfig {
|
|
3
|
+
model?: string;
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
financialDatasetsApiKey?: string;
|
|
6
|
+
exaApiKey?: string;
|
|
7
|
+
maxSteps?: number;
|
|
8
|
+
autoStart?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export default function createPlugin(ctx: any): Promise<any>;
|
|
11
|
+
export { DexterAgent };
|
|
12
|
+
export type { DexterConfig };
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { DexterAgent } from "./agent.js";
|
|
2
|
+
export default async function createPlugin(ctx) {
|
|
3
|
+
const config = ctx.config;
|
|
4
|
+
const agent = new DexterAgent({
|
|
5
|
+
model: config.model ?? "gpt-4o",
|
|
6
|
+
apiKey: config.apiKey,
|
|
7
|
+
financialDatasetsApiKey: config.financialDatasetsApiKey,
|
|
8
|
+
exaApiKey: config.exaApiKey,
|
|
9
|
+
maxSteps: config.maxSteps ?? 10,
|
|
10
|
+
});
|
|
11
|
+
agent.on("start", ({ query, queryId: _queryId }) => {
|
|
12
|
+
ctx.logger.info(`🔍 Dexter research started: ${query}`);
|
|
13
|
+
});
|
|
14
|
+
agent.on("step", ({ queryId: _queryId, step, number }) => {
|
|
15
|
+
ctx.logger.info(` Step ${number}: ${step.type}`);
|
|
16
|
+
});
|
|
17
|
+
agent.on("complete", ({ queryId: _queryId2, result }) => {
|
|
18
|
+
ctx.logger.info(`✅ Dexter research completed`);
|
|
19
|
+
ctx.logger.info(` Confidence: ${(result.confidence * 100).toFixed(0)}%`);
|
|
20
|
+
ctx.logger.info(` Steps: ${result.stepsExecuted}`);
|
|
21
|
+
ctx.logger.info(` Sources: ${result.sources.length}`);
|
|
22
|
+
});
|
|
23
|
+
agent.on("error", ({ queryId: _queryId3, error }) => {
|
|
24
|
+
ctx.logger.error(`❌ Dexter research failed`, error);
|
|
25
|
+
});
|
|
26
|
+
ctx.cli
|
|
27
|
+
.command("finance.research")
|
|
28
|
+
.description("Run financial research query")
|
|
29
|
+
.argument("<query>", "Research question (e.g., 'AAPL revenue growth last 4 quarters')")
|
|
30
|
+
.option("-o, --output <file>", "Save results to file")
|
|
31
|
+
.action(async (query, options) => {
|
|
32
|
+
try {
|
|
33
|
+
console.log(`🔍 Starting financial research...`);
|
|
34
|
+
console.log(` Query: ${query}\n`);
|
|
35
|
+
const result = await agent.research(query);
|
|
36
|
+
console.log(result.answer);
|
|
37
|
+
if (options?.output && result) {
|
|
38
|
+
const fs = await import("fs");
|
|
39
|
+
fs.writeFileSync(options.output, JSON.stringify(result, null, 2));
|
|
40
|
+
console.log(`\n💾 Results saved to: ${options.output}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
console.error("❌ Research failed:", err instanceof Error ? err.message : String(err));
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
ctx.cli
|
|
49
|
+
.command("finance.status")
|
|
50
|
+
.description("Check Dexter agent status")
|
|
51
|
+
.action(async () => {
|
|
52
|
+
const queries = agent.getActiveQueries();
|
|
53
|
+
console.log("📊 Dexter Financial Research Agent");
|
|
54
|
+
console.log(` Active Queries: ${queries.length}`);
|
|
55
|
+
if (queries.length > 0) {
|
|
56
|
+
console.log("\n Recent Queries:");
|
|
57
|
+
for (const { result } of queries.slice(-5)) {
|
|
58
|
+
console.log(` • ${result.query}`);
|
|
59
|
+
console.log(` Confidence: ${(result.confidence * 100).toFixed(0)}% | Steps: ${result.stepsExecuted}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!config.financialDatasetsApiKey) {
|
|
63
|
+
console.log("\n⚠️ Warning: Financial datasets API key not configured");
|
|
64
|
+
console.log(" Set FINANCIAL_DATASETS_API_KEY environment variable for live data");
|
|
65
|
+
}
|
|
66
|
+
if (!config.exaApiKey) {
|
|
67
|
+
console.log("\n⚠️ Warning: Exa API key not configured");
|
|
68
|
+
console.log(" Set EXA_API_KEY environment variable for web search");
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
ctx.cli
|
|
72
|
+
.command("finance.queries")
|
|
73
|
+
.description("List recent research queries")
|
|
74
|
+
.action(async () => {
|
|
75
|
+
const queries = agent.getActiveQueries();
|
|
76
|
+
if (queries.length === 0) {
|
|
77
|
+
console.log("ℹ️ No research queries yet");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
console.log("📊 Recent Research Queries:\n");
|
|
81
|
+
for (const { queryId: _queryId, result } of queries) {
|
|
82
|
+
const statusIcon = result.confidence > 0.7 ? "✅" : result.confidence > 0.4 ? "🟡" : "🟠";
|
|
83
|
+
console.log(`${statusIcon} ${_queryId}`);
|
|
84
|
+
console.log(` Query: ${result.query}`);
|
|
85
|
+
console.log(` Confidence: ${(result.confidence * 100).toFixed(0)}%`);
|
|
86
|
+
console.log(` Steps: ${result.stepsExecuted}`);
|
|
87
|
+
console.log(` Sources: ${result.sources.length}`);
|
|
88
|
+
if (result.financialData && result.financialData.length > 0) {
|
|
89
|
+
console.log(` Financial Data Points: ${result.financialData.length}`);
|
|
90
|
+
}
|
|
91
|
+
console.log();
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
name: "dexter",
|
|
96
|
+
version: "2026.3.8",
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
export { DexterAgent };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*|*MINGW*|*MSYS*)
|
|
6
|
+
if command -v cygpath > /dev/null 2>&1; then
|
|
7
|
+
basedir=`cygpath -w "$basedir"`
|
|
8
|
+
fi
|
|
9
|
+
;;
|
|
10
|
+
esac
|
|
11
|
+
|
|
12
|
+
if [ -z "$NODE_PATH" ]; then
|
|
13
|
+
export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules"
|
|
14
|
+
else
|
|
15
|
+
export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
16
|
+
fi
|
|
17
|
+
if [ -x "$basedir/node" ]; then
|
|
18
|
+
exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@"
|
|
19
|
+
else
|
|
20
|
+
exec node "$basedir/../typescript/bin/tsc" "$@"
|
|
21
|
+
fi
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
|
|
3
|
+
|
|
4
|
+
case `uname` in
|
|
5
|
+
*CYGWIN*|*MINGW*|*MSYS*)
|
|
6
|
+
if command -v cygpath > /dev/null 2>&1; then
|
|
7
|
+
basedir=`cygpath -w "$basedir"`
|
|
8
|
+
fi
|
|
9
|
+
;;
|
|
10
|
+
esac
|
|
11
|
+
|
|
12
|
+
if [ -z "$NODE_PATH" ]; then
|
|
13
|
+
export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules"
|
|
14
|
+
else
|
|
15
|
+
export NODE_PATH="/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/bin/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/typescript@5.9.3/node_modules:/Users/pool/Documents/GitHub/pool-bot/node_modules/.pnpm/node_modules:$NODE_PATH"
|
|
16
|
+
fi
|
|
17
|
+
if [ -x "$basedir/node" ]; then
|
|
18
|
+
exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@"
|
|
19
|
+
else
|
|
20
|
+
exec node "$basedir/../typescript/bin/tsserver" "$@"
|
|
21
|
+
fi
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@poolbot/dexter",
|
|
3
|
+
"version": "2026.3.8",
|
|
4
|
+
"description": "Dexter - Autonomous Financial Research Agent for PoolBot",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "tsc",
|
|
10
|
+
"dev": "tsc --watch",
|
|
11
|
+
"typecheck": "tsc --noEmit"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"poolbot": "workspace:*"
|
|
15
|
+
},
|
|
16
|
+
"devDependencies": {
|
|
17
|
+
"@types/node": "^22.0.0",
|
|
18
|
+
"typescript": "^5.0.0"
|
|
19
|
+
},
|
|
20
|
+
"poolbot": {
|
|
21
|
+
"plugin": true
|
|
22
|
+
},
|
|
23
|
+
"keywords": [
|
|
24
|
+
"finance",
|
|
25
|
+
"research",
|
|
26
|
+
"analysis",
|
|
27
|
+
"stocks",
|
|
28
|
+
"financial-data",
|
|
29
|
+
"agent"
|
|
30
|
+
],
|
|
31
|
+
"author": "PoolBot Team",
|
|
32
|
+
"license": "MIT"
|
|
33
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "dexter",
|
|
3
|
+
"name": "Dexter Financial Research",
|
|
4
|
+
"version": "2026.3.8",
|
|
5
|
+
"description": "Autonomous financial research agent that performs deep analysis using real-time market data, task planning, and self-reflection",
|
|
6
|
+
"author": "PoolBot Team",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"capabilities": [
|
|
9
|
+
"financial-research",
|
|
10
|
+
"stock-analysis",
|
|
11
|
+
"market-data",
|
|
12
|
+
"financial-statements",
|
|
13
|
+
"metrics-analysis",
|
|
14
|
+
"web-research"
|
|
15
|
+
],
|
|
16
|
+
"commands": [
|
|
17
|
+
"finance.research",
|
|
18
|
+
"finance.status",
|
|
19
|
+
"finance.queries"
|
|
20
|
+
],
|
|
21
|
+
"hooks": ["onInit"],
|
|
22
|
+
"config": {
|
|
23
|
+
"model": "gpt-4o",
|
|
24
|
+
"maxSteps": 10,
|
|
25
|
+
"autoStart": true,
|
|
26
|
+
"financialDatasetsApiKey": "",
|
|
27
|
+
"exaApiKey": ""
|
|
28
|
+
},
|
|
29
|
+
"permissions": [
|
|
30
|
+
"gateway.rpc",
|
|
31
|
+
"telemetry.events",
|
|
32
|
+
"config.read",
|
|
33
|
+
"http.external"
|
|
34
|
+
]
|
|
35
|
+
}
|