bluedoor 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/dist/chunk-2H7UOFLK.js +11 -0
- package/dist/chunk-2H7UOFLK.js.map +1 -0
- package/dist/chunk-XL3AVDBS.js +144 -0
- package/dist/chunk-XL3AVDBS.js.map +1 -0
- package/dist/index.js +5977 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts-5WEB6NKV.js +367 -0
- package/dist/prompts-5WEB6NKV.js.map +1 -0
- package/dist/repl-YTZMGZXP.js +2224 -0
- package/dist/repl-YTZMGZXP.js.map +1 -0
- package/dist/schemas-3EVVHHPO.js +99 -0
- package/dist/schemas-3EVVHHPO.js.map +1 -0
- package/package.json +51 -0
- package/prompts/analyze-position.md +30 -0
- package/prompts/combine-snippets.md +23 -0
- package/prompts/extract-page.md +12 -0
- package/prompts/parse-query.md +167 -0
- package/prompts/research-field.md +25 -0
- package/prompts/search-strategy.md +20 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __export = (target, all) => {
|
|
4
|
+
for (var name in all)
|
|
5
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export {
|
|
9
|
+
__export
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=chunk-2H7UOFLK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/config.ts
|
|
4
|
+
import { resolve, dirname } from "path";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
try {
|
|
7
|
+
const dotenv = await import("dotenv");
|
|
8
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
dotenv.config({ path: resolve(__dirname, "../../../.env") });
|
|
10
|
+
} catch {
|
|
11
|
+
}
|
|
12
|
+
var config = {
|
|
13
|
+
api: {
|
|
14
|
+
baseUrl: process.env.BLUEDOOR_API_URL || "https://screener-api.crombiesamuel.workers.dev"
|
|
15
|
+
},
|
|
16
|
+
stackAuth: {
|
|
17
|
+
projectId: "d30205e1-fc62-4e16-aec2-5132d136a5a1",
|
|
18
|
+
publishableKey: "pck_segwxr1k9tqg0kk3e8bp20ce20serfzpvd8pxe3vmjj00"
|
|
19
|
+
},
|
|
20
|
+
research: {
|
|
21
|
+
maxCompaniesDefault: 50,
|
|
22
|
+
concurrency: 50,
|
|
23
|
+
exaResultsPerSearch: 15,
|
|
24
|
+
mode: process.env.RESEARCH_MODE || "map-reduce"
|
|
25
|
+
},
|
|
26
|
+
// Dev-only: loaded from .env when available
|
|
27
|
+
fmp: {
|
|
28
|
+
apiKey: process.env.FMP_API_KEY || "",
|
|
29
|
+
baseUrl: "https://financialmodelingprep.com/stable"
|
|
30
|
+
},
|
|
31
|
+
anthropic: {
|
|
32
|
+
apiKey: process.env.ANTHROPIC_API_KEY || ""
|
|
33
|
+
},
|
|
34
|
+
exa: {
|
|
35
|
+
apiKey: process.env.EXA_API_KEY || ""
|
|
36
|
+
},
|
|
37
|
+
groq: {
|
|
38
|
+
apiKey: process.env.GROQ_API_KEY || ""
|
|
39
|
+
},
|
|
40
|
+
llmProvider: process.env.LLM_PROVIDER || "claude",
|
|
41
|
+
db: {
|
|
42
|
+
path: "./screener.db"
|
|
43
|
+
},
|
|
44
|
+
cache: {
|
|
45
|
+
researchTtlDays: 30,
|
|
46
|
+
profileTtlDays: 7
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// ../core/dist/constants/cost-rates.js
|
|
51
|
+
var COST_RATES = {
|
|
52
|
+
exa: {
|
|
53
|
+
perSearch: 1e-3
|
|
54
|
+
},
|
|
55
|
+
edgar: {
|
|
56
|
+
perFiling: 0
|
|
57
|
+
},
|
|
58
|
+
claude: {
|
|
59
|
+
inputPerMToken: 3,
|
|
60
|
+
outputPerMToken: 15,
|
|
61
|
+
avgInputTokensPerResearch: 2e3,
|
|
62
|
+
avgOutputTokensPerResearch: 200,
|
|
63
|
+
avgInputTokensPerParse: 1500,
|
|
64
|
+
avgOutputTokensPerParse: 500
|
|
65
|
+
},
|
|
66
|
+
openai: {
|
|
67
|
+
inputPerMToken: 2.5,
|
|
68
|
+
outputPerMToken: 10,
|
|
69
|
+
avgInputTokensPerResearch: 2e3,
|
|
70
|
+
avgOutputTokensPerResearch: 200,
|
|
71
|
+
avgInputTokensPerParse: 1500,
|
|
72
|
+
avgOutputTokensPerParse: 500
|
|
73
|
+
},
|
|
74
|
+
haiku: {
|
|
75
|
+
inputPerMToken: 1,
|
|
76
|
+
outputPerMToken: 5
|
|
77
|
+
},
|
|
78
|
+
groq: {
|
|
79
|
+
inputPerMToken: 0.11,
|
|
80
|
+
outputPerMToken: 0.34,
|
|
81
|
+
avgInputTokensPerExtract: 900,
|
|
82
|
+
avgOutputTokensPerExtract: 50,
|
|
83
|
+
avgInputTokensPerCombine: 1200,
|
|
84
|
+
avgOutputTokensPerCombine: 150,
|
|
85
|
+
avgInputTokensPerResearch: 2e3,
|
|
86
|
+
avgOutputTokensPerResearch: 200,
|
|
87
|
+
avgInputTokensPerParse: 1500,
|
|
88
|
+
avgOutputTokensPerParse: 500
|
|
89
|
+
},
|
|
90
|
+
// Map-reduce pipeline estimates (Haiku) — calibrated from actual runs.
|
|
91
|
+
// A typical task does: 1 strategy + 2.5 Exa searches + ~7 extract calls + 1 combine.
|
|
92
|
+
// Failed tasks (no Exa results) still incur strategy + Exa cost, then SEC fallback
|
|
93
|
+
// adds ~$0.06 on top (EDGAR fetch + extract chunks + combine).
|
|
94
|
+
mapReduce: {
|
|
95
|
+
avgExaSearchesPerTask: 2.5,
|
|
96
|
+
// Aggregate Haiku tokens across all sub-calls (strategy + extract + combine)
|
|
97
|
+
avgHaikuInputPerTask: 2e4,
|
|
98
|
+
avgHaikuOutputPerTask: 1e3,
|
|
99
|
+
// SEC fallback probability and added cost when Exa finds nothing
|
|
100
|
+
secFallbackRate: 0.35,
|
|
101
|
+
secFallbackAddedCost: 0.06
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
// src/costs/estimator.ts
|
|
106
|
+
function estimateCost(companiesAfterScreener, companiesAfterPostFilter, researchQuestions, cacheHitCount, provider, researchMode = "map-reduce") {
|
|
107
|
+
const rates = COST_RATES[provider];
|
|
108
|
+
const totalTasks = companiesAfterPostFilter * researchQuestions.length;
|
|
109
|
+
const tasksNeeded = totalTasks - cacheHitCount;
|
|
110
|
+
const parseCost = rates.avgInputTokensPerParse / 1e6 * rates.inputPerMToken + rates.avgOutputTokensPerParse / 1e6 * rates.outputPerMToken;
|
|
111
|
+
let exaCost;
|
|
112
|
+
let llmSynthesisCost;
|
|
113
|
+
if (researchMode === "map-reduce") {
|
|
114
|
+
const mr = COST_RATES.mapReduce;
|
|
115
|
+
exaCost = tasksNeeded * mr.avgExaSearchesPerTask * COST_RATES.exa.perSearch;
|
|
116
|
+
const haikuCostPerTask = mr.avgHaikuInputPerTask / 1e6 * COST_RATES.haiku.inputPerMToken + mr.avgHaikuOutputPerTask / 1e6 * COST_RATES.haiku.outputPerMToken;
|
|
117
|
+
const baseLlmCost = tasksNeeded * haikuCostPerTask;
|
|
118
|
+
const secOverhead = tasksNeeded * mr.secFallbackRate * mr.secFallbackAddedCost;
|
|
119
|
+
llmSynthesisCost = baseLlmCost + secOverhead;
|
|
120
|
+
} else {
|
|
121
|
+
exaCost = tasksNeeded * COST_RATES.exa.perSearch;
|
|
122
|
+
const llmInputCost = tasksNeeded * rates.avgInputTokensPerResearch / 1e6 * rates.inputPerMToken;
|
|
123
|
+
const llmOutputCost = tasksNeeded * rates.avgOutputTokensPerResearch / 1e6 * rates.outputPerMToken;
|
|
124
|
+
llmSynthesisCost = llmInputCost + llmOutputCost;
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
queryParsingCost: parseCost,
|
|
128
|
+
companiesAfterScreener,
|
|
129
|
+
companiesAfterPostFilter,
|
|
130
|
+
researchTasksTotal: totalTasks,
|
|
131
|
+
researchTasksCached: cacheHitCount,
|
|
132
|
+
researchTasksNeeded: tasksNeeded,
|
|
133
|
+
exaSearchCost: exaCost,
|
|
134
|
+
llmSynthesisCost,
|
|
135
|
+
totalEstimatedCost: parseCost + exaCost + llmSynthesisCost
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export {
|
|
140
|
+
config,
|
|
141
|
+
COST_RATES,
|
|
142
|
+
estimateCost
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=chunk-XL3AVDBS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../../core/src/constants/cost-rates.ts","../src/costs/estimator.ts"],"sourcesContent":["/**\n * CLI configuration.\n * The CLI is a thin client — no API keys needed for normal operation.\n * API keys are only loaded from .env for dev/sync tools.\n */\n\n// Load .env for dev tools (fmp sync, benchmarks) — fail silently if not available\nimport { resolve, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\ntry {\n const dotenv = await import(\"dotenv\");\n const __dirname = dirname(fileURLToPath(import.meta.url));\n dotenv.config({ path: resolve(__dirname, \"../../../.env\") });\n} catch { /* dotenv not available — fine for published CLI */ }\n\nexport const config = {\n api: {\n baseUrl: process.env.BLUEDOOR_API_URL || \"https://screener-api.crombiesamuel.workers.dev\",\n },\n stackAuth: {\n projectId: \"d30205e1-fc62-4e16-aec2-5132d136a5a1\",\n publishableKey: \"pck_segwxr1k9tqg0kk3e8bp20ce20serfzpvd8pxe3vmjj00\",\n },\n research: {\n maxCompaniesDefault: 50,\n concurrency: 50,\n exaResultsPerSearch: 15,\n mode: (process.env.RESEARCH_MODE || \"map-reduce\") as \"claude\" | \"map-reduce\",\n },\n // Dev-only: loaded from .env when available\n fmp: {\n apiKey: process.env.FMP_API_KEY || \"\",\n baseUrl: \"https://financialmodelingprep.com/stable\",\n },\n anthropic: {\n apiKey: process.env.ANTHROPIC_API_KEY || \"\",\n },\n exa: {\n apiKey: process.env.EXA_API_KEY || \"\",\n },\n groq: {\n apiKey: process.env.GROQ_API_KEY || \"\",\n },\n llmProvider: (process.env.LLM_PROVIDER || \"claude\") as \"claude\" | \"openai\" | \"groq\",\n db: {\n path: \"./screener.db\",\n },\n cache: {\n researchTtlDays: 30,\n profileTtlDays: 7,\n },\n} as const;\n","export const COST_RATES = {\n exa: {\n perSearch: 0.001,\n },\n edgar: {\n perFiling: 0,\n },\n claude: {\n inputPerMToken: 3.0,\n outputPerMToken: 15.0,\n avgInputTokensPerResearch: 2000,\n avgOutputTokensPerResearch: 200,\n avgInputTokensPerParse: 1500,\n avgOutputTokensPerParse: 500,\n },\n openai: {\n inputPerMToken: 2.5,\n outputPerMToken: 10.0,\n avgInputTokensPerResearch: 2000,\n avgOutputTokensPerResearch: 200,\n avgInputTokensPerParse: 1500,\n avgOutputTokensPerParse: 500,\n },\n haiku: {\n inputPerMToken: 1.0,\n outputPerMToken: 5.0,\n },\n groq: {\n inputPerMToken: 0.11,\n outputPerMToken: 0.34,\n avgInputTokensPerExtract: 900,\n avgOutputTokensPerExtract: 50,\n avgInputTokensPerCombine: 1200,\n avgOutputTokensPerCombine: 150,\n avgInputTokensPerResearch: 2000,\n avgOutputTokensPerResearch: 200,\n avgInputTokensPerParse: 1500,\n avgOutputTokensPerParse: 500,\n },\n // Map-reduce pipeline estimates (Haiku) — calibrated from actual runs.\n // A typical task does: 1 strategy + 2.5 Exa searches + ~7 extract calls + 1 combine.\n // Failed tasks (no Exa results) still incur strategy + Exa cost, then SEC fallback\n // adds ~$0.06 on top (EDGAR fetch + extract chunks + combine).\n mapReduce: {\n avgExaSearchesPerTask: 2.5,\n // Aggregate Haiku tokens across all sub-calls (strategy + extract + combine)\n avgHaikuInputPerTask: 20_000,\n avgHaikuOutputPerTask: 1_000,\n // SEC fallback probability and added cost when Exa finds nothing\n secFallbackRate: 0.35,\n secFallbackAddedCost: 0.06,\n },\n} as const;\n","import { COST_RATES } from \"@screener/core\";\nimport type { ResearchQuestion, CostEstimate } from \"@screener/core\";\n\nexport function estimateCost(\n companiesAfterScreener: number,\n companiesAfterPostFilter: number,\n researchQuestions: ResearchQuestion[],\n cacheHitCount: number,\n provider: \"claude\" | \"openai\" | \"groq\",\n researchMode: \"claude\" | \"map-reduce\" = \"map-reduce\"\n): CostEstimate {\n const rates = COST_RATES[provider];\n const totalTasks = companiesAfterPostFilter * researchQuestions.length;\n const tasksNeeded = totalTasks - cacheHitCount;\n\n const parseCost =\n (rates.avgInputTokensPerParse / 1_000_000) * rates.inputPerMToken +\n (rates.avgOutputTokensPerParse / 1_000_000) * rates.outputPerMToken;\n\n let exaCost: number;\n let llmSynthesisCost: number;\n\n if (researchMode === \"map-reduce\") {\n // Map-reduce pipeline: strategy (Haiku) → Exa searches → extract per page (Haiku) → combine (Haiku)\n // Plus SEC fallback overhead for tasks that find no Exa results.\n const mr = COST_RATES.mapReduce;\n\n exaCost = tasksNeeded * mr.avgExaSearchesPerTask * COST_RATES.exa.perSearch;\n\n const haikuCostPerTask =\n (mr.avgHaikuInputPerTask / 1_000_000) * COST_RATES.haiku.inputPerMToken +\n (mr.avgHaikuOutputPerTask / 1_000_000) * COST_RATES.haiku.outputPerMToken;\n\n const baseLlmCost = tasksNeeded * haikuCostPerTask;\n const secOverhead = tasksNeeded * mr.secFallbackRate * mr.secFallbackAddedCost;\n\n llmSynthesisCost = baseLlmCost + secOverhead;\n } else {\n // Legacy single-call mode: 1 Exa search + 1 LLM synthesis per task\n exaCost = tasksNeeded * COST_RATES.exa.perSearch;\n const llmInputCost =\n (tasksNeeded * rates.avgInputTokensPerResearch) / 1_000_000 *\n rates.inputPerMToken;\n const llmOutputCost =\n (tasksNeeded * rates.avgOutputTokensPerResearch) / 1_000_000 *\n rates.outputPerMToken;\n llmSynthesisCost = llmInputCost + llmOutputCost;\n }\n\n return {\n queryParsingCost: parseCost,\n companiesAfterScreener,\n companiesAfterPostFilter,\n researchTasksTotal: totalTasks,\n researchTasksCached: cacheHitCount,\n researchTasksNeeded: tasksNeeded,\n exaSearchCost: exaCost,\n llmSynthesisCost,\n totalEstimatedCost: parseCost + exaCost + llmSynthesisCost,\n };\n}\n"],"mappings":";;;AAOA,SAAS,SAAS,eAAe;AACjC,SAAS,qBAAqB;AAE9B,IAAI;AACF,QAAM,SAAS,MAAM,OAAO,QAAQ;AACpC,QAAM,YAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,SAAO,OAAO,EAAE,MAAM,QAAQ,WAAW,eAAe,EAAE,CAAC;AAC7D,QAAQ;AAAsD;AAEvD,IAAM,SAAS;AAAA,EACpB,KAAK;AAAA,IACH,SAAS,QAAQ,IAAI,oBAAoB;AAAA,EAC3C;AAAA,EACA,WAAW;AAAA,IACT,WAAW;AAAA,IACX,gBAAgB;AAAA,EAClB;AAAA,EACA,UAAU;AAAA,IACR,qBAAqB;AAAA,IACrB,aAAa;AAAA,IACb,qBAAqB;AAAA,IACrB,MAAO,QAAQ,IAAI,iBAAiB;AAAA,EACtC;AAAA;AAAA,EAEA,KAAK;AAAA,IACH,QAAQ,QAAQ,IAAI,eAAe;AAAA,IACnC,SAAS;AAAA,EACX;AAAA,EACA,WAAW;AAAA,IACT,QAAQ,QAAQ,IAAI,qBAAqB;AAAA,EAC3C;AAAA,EACA,KAAK;AAAA,IACH,QAAQ,QAAQ,IAAI,eAAe;AAAA,EACrC;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ,QAAQ,IAAI,gBAAgB;AAAA,EACtC;AAAA,EACA,aAAc,QAAQ,IAAI,gBAAgB;AAAA,EAC1C,IAAI;AAAA,IACF,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,EAClB;AACF;;;ACpDO,IAAM,aAAa;EACxB,KAAK;IACH,WAAW;;EAEb,OAAO;IACL,WAAW;;EAEb,QAAQ;IACN,gBAAgB;IAChB,iBAAiB;IACjB,2BAA2B;IAC3B,4BAA4B;IAC5B,wBAAwB;IACxB,yBAAyB;;EAE3B,QAAQ;IACN,gBAAgB;IAChB,iBAAiB;IACjB,2BAA2B;IAC3B,4BAA4B;IAC5B,wBAAwB;IACxB,yBAAyB;;EAE3B,OAAO;IACL,gBAAgB;IAChB,iBAAiB;;EAEnB,MAAM;IACJ,gBAAgB;IAChB,iBAAiB;IACjB,0BAA0B;IAC1B,2BAA2B;IAC3B,0BAA0B;IAC1B,2BAA2B;IAC3B,2BAA2B;IAC3B,4BAA4B;IAC5B,wBAAwB;IACxB,yBAAyB;;;;;;EAM3B,WAAW;IACT,uBAAuB;;IAEvB,sBAAsB;IACtB,uBAAuB;;IAEvB,iBAAiB;IACjB,sBAAsB;;;;;AC/CnB,SAAS,aACd,wBACA,0BACA,mBACA,eACA,UACA,eAAwC,cAC1B;AACd,QAAM,QAAQ,WAAW,QAAQ;AACjC,QAAM,aAAa,2BAA2B,kBAAkB;AAChE,QAAM,cAAc,aAAa;AAEjC,QAAM,YACH,MAAM,yBAAyB,MAAa,MAAM,iBAClD,MAAM,0BAA0B,MAAa,MAAM;AAEtD,MAAI;AACJ,MAAI;AAEJ,MAAI,iBAAiB,cAAc;AAGjC,UAAM,KAAK,WAAW;AAEtB,cAAU,cAAc,GAAG,wBAAwB,WAAW,IAAI;AAElE,UAAM,mBACH,GAAG,uBAAuB,MAAa,WAAW,MAAM,iBACxD,GAAG,wBAAwB,MAAa,WAAW,MAAM;AAE5D,UAAM,cAAc,cAAc;AAClC,UAAM,cAAc,cAAc,GAAG,kBAAkB,GAAG;AAE1D,uBAAmB,cAAc;AAAA,EACnC,OAAO;AAEL,cAAU,cAAc,WAAW,IAAI;AACvC,UAAM,eACH,cAAc,MAAM,4BAA6B,MAClD,MAAM;AACR,UAAM,gBACH,cAAc,MAAM,6BAA8B,MACnD,MAAM;AACR,uBAAmB,eAAe;AAAA,EACpC;AAEA,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,eAAe;AAAA,IACf;AAAA,IACA,oBAAoB,YAAY,UAAU;AAAA,EAC5C;AACF;","names":[]}
|