nodebench-mcp 2.70.0 → 3.0.1
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 +95 -41
- package/dist/agents/alertRouter.d.ts +38 -0
- package/dist/agents/alertRouter.js +151 -0
- package/dist/agents/alertRouter.js.map +1 -0
- package/dist/agents/entityMemory.d.ts +40 -0
- package/dist/agents/entityMemory.js +64 -0
- package/dist/agents/entityMemory.js.map +1 -0
- package/dist/agents/subAgents.d.ts +35 -0
- package/dist/agents/subAgents.js +62 -0
- package/dist/agents/subAgents.js.map +1 -0
- package/dist/benchmarks/benchmarkRunner.js +14 -0
- package/dist/benchmarks/benchmarkRunner.js.map +1 -1
- package/dist/benchmarks/chainEval.js +107 -0
- package/dist/benchmarks/chainEval.js.map +1 -1
- package/dist/benchmarks/llmJudgeEval.js +85 -0
- package/dist/benchmarks/llmJudgeEval.js.map +1 -1
- package/dist/benchmarks/searchQualityEval.js +118 -5
- package/dist/benchmarks/searchQualityEval.js.map +1 -1
- package/dist/cli/search.d.ts +13 -0
- package/dist/cli/search.js +130 -0
- package/dist/cli/search.js.map +1 -0
- package/dist/dashboard/operatingDashboardHtml.js +2 -1
- package/dist/dashboard/operatingDashboardHtml.js.map +1 -1
- package/dist/dashboard/operatingServer.js +3 -2
- package/dist/dashboard/operatingServer.js.map +1 -1
- package/dist/db.d.ts +6 -2
- package/dist/db.js +521 -6
- package/dist/db.js.map +1 -1
- package/dist/index.js +349 -67
- package/dist/index.js.map +1 -1
- package/dist/packageInfo.d.ts +3 -0
- package/dist/packageInfo.js +32 -0
- package/dist/packageInfo.js.map +1 -0
- package/dist/profiler/behaviorStore.d.ts +97 -0
- package/dist/profiler/behaviorStore.js +276 -0
- package/dist/profiler/behaviorStore.js.map +1 -0
- package/dist/profiler/eventCollector.d.ts +119 -0
- package/dist/profiler/eventCollector.js +267 -0
- package/dist/profiler/eventCollector.js.map +1 -0
- package/dist/profiler/index.d.ts +15 -0
- package/dist/profiler/index.js +16 -0
- package/dist/profiler/index.js.map +1 -0
- package/dist/profiler/mcpProxy.d.ts +49 -0
- package/dist/profiler/mcpProxy.js +123 -0
- package/dist/profiler/mcpProxy.js.map +1 -0
- package/dist/profiler/modelRouter.d.ts +30 -0
- package/dist/profiler/modelRouter.js +99 -0
- package/dist/profiler/modelRouter.js.map +1 -0
- package/dist/profiler/otelReceiver.d.ts +17 -0
- package/dist/profiler/otelReceiver.js +62 -0
- package/dist/profiler/otelReceiver.js.map +1 -0
- package/dist/profiler/proofEngine.d.ts +41 -0
- package/dist/profiler/proofEngine.js +93 -0
- package/dist/profiler/proofEngine.js.map +1 -0
- package/dist/profiler/workflowTemplates.d.ts +41 -0
- package/dist/profiler/workflowTemplates.js +95 -0
- package/dist/profiler/workflowTemplates.js.map +1 -0
- package/dist/providers/localMemoryProvider.js +3 -2
- package/dist/providers/localMemoryProvider.js.map +1 -1
- package/dist/runtimeConfig.d.ts +11 -0
- package/dist/runtimeConfig.js +27 -0
- package/dist/runtimeConfig.js.map +1 -0
- package/dist/sandboxApi.js +2 -1
- package/dist/sandboxApi.js.map +1 -1
- package/dist/security/auditLog.js +8 -3
- package/dist/security/auditLog.js.map +1 -1
- package/dist/subconscious/blocks.d.ts +43 -0
- package/dist/subconscious/blocks.js +158 -0
- package/dist/subconscious/blocks.js.map +1 -0
- package/dist/subconscious/classifier.d.ts +22 -0
- package/dist/subconscious/classifier.js +118 -0
- package/dist/subconscious/classifier.js.map +1 -0
- package/dist/subconscious/graphEngine.d.ts +65 -0
- package/dist/subconscious/graphEngine.js +234 -0
- package/dist/subconscious/graphEngine.js.map +1 -0
- package/dist/subconscious/index.d.ts +19 -0
- package/dist/subconscious/index.js +20 -0
- package/dist/subconscious/index.js.map +1 -0
- package/dist/subconscious/tools.d.ts +5 -0
- package/dist/subconscious/tools.js +255 -0
- package/dist/subconscious/tools.js.map +1 -0
- package/dist/subconscious/whisperPolicy.d.ts +20 -0
- package/dist/subconscious/whisperPolicy.js +171 -0
- package/dist/subconscious/whisperPolicy.js.map +1 -0
- package/dist/sweep/engine.d.ts +27 -0
- package/dist/sweep/engine.js +244 -0
- package/dist/sweep/engine.js.map +1 -0
- package/dist/sweep/index.d.ts +9 -0
- package/dist/sweep/index.js +8 -0
- package/dist/sweep/index.js.map +1 -0
- package/dist/sweep/sources/github_trending.d.ts +6 -0
- package/dist/sweep/sources/github_trending.js +37 -0
- package/dist/sweep/sources/github_trending.js.map +1 -0
- package/dist/sweep/sources/hackernews.d.ts +7 -0
- package/dist/sweep/sources/hackernews.js +57 -0
- package/dist/sweep/sources/hackernews.js.map +1 -0
- package/dist/sweep/sources/openbb_finance.d.ts +9 -0
- package/dist/sweep/sources/openbb_finance.js +46 -0
- package/dist/sweep/sources/openbb_finance.js.map +1 -0
- package/dist/sweep/sources/producthunt.d.ts +6 -0
- package/dist/sweep/sources/producthunt.js +41 -0
- package/dist/sweep/sources/producthunt.js.map +1 -0
- package/dist/sweep/sources/web_signals.d.ts +7 -0
- package/dist/sweep/sources/web_signals.js +63 -0
- package/dist/sweep/sources/web_signals.js.map +1 -0
- package/dist/sweep/sources/yahoo_finance.d.ts +6 -0
- package/dist/sweep/sources/yahoo_finance.js +47 -0
- package/dist/sweep/sources/yahoo_finance.js.map +1 -0
- package/dist/sweep/types.d.ts +50 -0
- package/dist/sweep/types.js +9 -0
- package/dist/sweep/types.js.map +1 -0
- package/dist/sync/founderEpisodeStore.d.ts +98 -0
- package/dist/sync/founderEpisodeStore.js +230 -0
- package/dist/sync/founderEpisodeStore.js.map +1 -0
- package/dist/sync/hyperloopArchive.d.ts +51 -0
- package/dist/sync/hyperloopArchive.js +153 -0
- package/dist/sync/hyperloopArchive.js.map +1 -0
- package/dist/sync/hyperloopEval.d.ts +123 -0
- package/dist/sync/hyperloopEval.js +389 -0
- package/dist/sync/hyperloopEval.js.map +1 -0
- package/dist/sync/protocol.d.ts +172 -0
- package/dist/sync/protocol.js +9 -0
- package/dist/sync/protocol.js.map +1 -0
- package/dist/sync/sessionMemory.d.ts +47 -0
- package/dist/sync/sessionMemory.js +138 -0
- package/dist/sync/sessionMemory.js.map +1 -0
- package/dist/sync/store.d.ts +384 -0
- package/dist/sync/store.js +1435 -0
- package/dist/sync/store.js.map +1 -0
- package/dist/sync/syncBridgeClient.d.ts +30 -0
- package/dist/sync/syncBridgeClient.js +172 -0
- package/dist/sync/syncBridgeClient.js.map +1 -0
- package/dist/tools/autonomousDeliveryTools.d.ts +2 -0
- package/dist/tools/autonomousDeliveryTools.js +1104 -0
- package/dist/tools/autonomousDeliveryTools.js.map +1 -0
- package/dist/tools/boilerplateTools.js +10 -9
- package/dist/tools/boilerplateTools.js.map +1 -1
- package/dist/tools/claudeCodeIngestTools.d.ts +10 -0
- package/dist/tools/claudeCodeIngestTools.js +347 -0
- package/dist/tools/claudeCodeIngestTools.js.map +1 -0
- package/dist/tools/coreWorkflowTools.d.ts +2 -0
- package/dist/tools/coreWorkflowTools.js +488 -0
- package/dist/tools/coreWorkflowTools.js.map +1 -0
- package/dist/tools/deltaTools.d.ts +15 -0
- package/dist/tools/deltaTools.js +1522 -0
- package/dist/tools/deltaTools.js.map +1 -0
- package/dist/tools/documentationTools.js +2 -1
- package/dist/tools/documentationTools.js.map +1 -1
- package/dist/tools/entityLookupTools.d.ts +14 -0
- package/dist/tools/entityLookupTools.js +159 -0
- package/dist/tools/entityLookupTools.js.map +1 -0
- package/dist/tools/entityTemporalTools.d.ts +12 -0
- package/dist/tools/entityTemporalTools.js +330 -0
- package/dist/tools/entityTemporalTools.js.map +1 -0
- package/dist/tools/founderLocalPipeline.d.ts +215 -0
- package/dist/tools/founderLocalPipeline.js +1516 -2
- package/dist/tools/founderLocalPipeline.js.map +1 -1
- package/dist/tools/founderOperatingModel.d.ts +120 -0
- package/dist/tools/founderOperatingModel.js +469 -0
- package/dist/tools/founderOperatingModel.js.map +1 -0
- package/dist/tools/founderOperatingModelTools.d.ts +2 -0
- package/dist/tools/founderOperatingModelTools.js +169 -0
- package/dist/tools/founderOperatingModelTools.js.map +1 -0
- package/dist/tools/founderStrategicOpsTools.d.ts +2 -0
- package/dist/tools/founderStrategicOpsTools.js +1310 -0
- package/dist/tools/founderStrategicOpsTools.js.map +1 -0
- package/dist/tools/graphifyTools.d.ts +19 -0
- package/dist/tools/graphifyTools.js +375 -0
- package/dist/tools/graphifyTools.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/monteCarloTools.d.ts +16 -0
- package/dist/tools/monteCarloTools.js +225 -0
- package/dist/tools/monteCarloTools.js.map +1 -0
- package/dist/tools/packetCompilerTools.d.ts +12 -0
- package/dist/tools/packetCompilerTools.js +322 -0
- package/dist/tools/packetCompilerTools.js.map +1 -0
- package/dist/tools/planSynthesisTools.d.ts +15 -0
- package/dist/tools/planSynthesisTools.js +455 -0
- package/dist/tools/planSynthesisTools.js.map +1 -0
- package/dist/tools/profilerTools.d.ts +20 -0
- package/dist/tools/profilerTools.js +364 -0
- package/dist/tools/profilerTools.js.map +1 -0
- package/dist/tools/progressiveDiscoveryTools.js +2 -1
- package/dist/tools/progressiveDiscoveryTools.js.map +1 -1
- package/dist/tools/savingsTools.d.ts +11 -0
- package/dist/tools/savingsTools.js +155 -0
- package/dist/tools/savingsTools.js.map +1 -0
- package/dist/tools/scenarioCompilerTools.d.ts +14 -0
- package/dist/tools/scenarioCompilerTools.js +290 -0
- package/dist/tools/scenarioCompilerTools.js.map +1 -0
- package/dist/tools/sharedContextTools.d.ts +2 -0
- package/dist/tools/sharedContextTools.js +423 -0
- package/dist/tools/sharedContextTools.js.map +1 -0
- package/dist/tools/sitemapTools.d.ts +15 -0
- package/dist/tools/sitemapTools.js +560 -0
- package/dist/tools/sitemapTools.js.map +1 -0
- package/dist/tools/sweepTools.d.ts +9 -0
- package/dist/tools/sweepTools.js +112 -0
- package/dist/tools/sweepTools.js.map +1 -0
- package/dist/tools/syncBridgeTools.d.ts +2 -0
- package/dist/tools/syncBridgeTools.js +258 -0
- package/dist/tools/syncBridgeTools.js.map +1 -0
- package/dist/tools/toolRegistry.js +1223 -45
- package/dist/tools/toolRegistry.js.map +1 -1
- package/dist/tools/workspaceTools.d.ts +19 -0
- package/dist/tools/workspaceTools.js +762 -0
- package/dist/tools/workspaceTools.js.map +1 -0
- package/dist/toolsetRegistry.js +162 -3
- package/dist/toolsetRegistry.js.map +1 -1
- package/package.json +39 -38
- package/rules/nodebench-agentic-reliability.md +32 -0
- package/rules/nodebench-analyst-diagnostic.md +25 -0
- package/rules/nodebench-auto-qa.md +31 -0
- package/rules/nodebench-completion-traceability.md +22 -0
- package/rules/nodebench-flywheel-continuous.md +25 -0
- package/rules/nodebench-pre-release-review.md +24 -0
- package/rules/nodebench-qa-dogfood.md +26 -0
- package/rules/nodebench-scenario-testing.md +30 -0
- package/rules/nodebench-self-direction.md +23 -0
- package/rules/nodebench-self-judge-loop.md +24 -0
- package/scripts/install.sh +215 -0
- package/dist/__tests__/analytics.test.d.ts +0 -11
- package/dist/__tests__/analytics.test.js +0 -546
- package/dist/__tests__/analytics.test.js.map +0 -1
- package/dist/__tests__/architectComplex.test.d.ts +0 -1
- package/dist/__tests__/architectComplex.test.js +0 -373
- package/dist/__tests__/architectComplex.test.js.map +0 -1
- package/dist/__tests__/architectSmoke.test.d.ts +0 -1
- package/dist/__tests__/architectSmoke.test.js +0 -92
- package/dist/__tests__/architectSmoke.test.js.map +0 -1
- package/dist/__tests__/audit-registry.d.ts +0 -1
- package/dist/__tests__/audit-registry.js +0 -60
- package/dist/__tests__/audit-registry.js.map +0 -1
- package/dist/__tests__/batchAutopilot.test.d.ts +0 -8
- package/dist/__tests__/batchAutopilot.test.js +0 -218
- package/dist/__tests__/batchAutopilot.test.js.map +0 -1
- package/dist/__tests__/cliSubcommands.test.d.ts +0 -1
- package/dist/__tests__/cliSubcommands.test.js +0 -138
- package/dist/__tests__/cliSubcommands.test.js.map +0 -1
- package/dist/__tests__/comparativeBench.test.d.ts +0 -1
- package/dist/__tests__/comparativeBench.test.js +0 -722
- package/dist/__tests__/comparativeBench.test.js.map +0 -1
- package/dist/__tests__/critterCalibrationEval.d.ts +0 -8
- package/dist/__tests__/critterCalibrationEval.js +0 -370
- package/dist/__tests__/critterCalibrationEval.js.map +0 -1
- package/dist/__tests__/dynamicLoading.test.d.ts +0 -1
- package/dist/__tests__/dynamicLoading.test.js +0 -280
- package/dist/__tests__/dynamicLoading.test.js.map +0 -1
- package/dist/__tests__/embeddingProvider.test.d.ts +0 -1
- package/dist/__tests__/embeddingProvider.test.js +0 -86
- package/dist/__tests__/embeddingProvider.test.js.map +0 -1
- package/dist/__tests__/evalDatasetBench.test.d.ts +0 -1
- package/dist/__tests__/evalDatasetBench.test.js +0 -738
- package/dist/__tests__/evalDatasetBench.test.js.map +0 -1
- package/dist/__tests__/evalHarness.test.d.ts +0 -1
- package/dist/__tests__/evalHarness.test.js +0 -1107
- package/dist/__tests__/evalHarness.test.js.map +0 -1
- package/dist/__tests__/fixtures/bfcl_v3_long_context.sample.json +0 -264
- package/dist/__tests__/fixtures/generateBfclLongContextFixture.d.ts +0 -10
- package/dist/__tests__/fixtures/generateBfclLongContextFixture.js +0 -135
- package/dist/__tests__/fixtures/generateBfclLongContextFixture.js.map +0 -1
- package/dist/__tests__/fixtures/generateSwebenchVerifiedFixture.d.ts +0 -14
- package/dist/__tests__/fixtures/generateSwebenchVerifiedFixture.js +0 -189
- package/dist/__tests__/fixtures/generateSwebenchVerifiedFixture.js.map +0 -1
- package/dist/__tests__/fixtures/generateToolbenchInstructionFixture.d.ts +0 -16
- package/dist/__tests__/fixtures/generateToolbenchInstructionFixture.js +0 -154
- package/dist/__tests__/fixtures/generateToolbenchInstructionFixture.js.map +0 -1
- package/dist/__tests__/fixtures/swebench_verified.sample.json +0 -162
- package/dist/__tests__/fixtures/toolbench_instruction.sample.json +0 -109
- package/dist/__tests__/forecastingDogfood.test.d.ts +0 -9
- package/dist/__tests__/forecastingDogfood.test.js +0 -284
- package/dist/__tests__/forecastingDogfood.test.js.map +0 -1
- package/dist/__tests__/forecastingScoring.test.d.ts +0 -9
- package/dist/__tests__/forecastingScoring.test.js +0 -202
- package/dist/__tests__/forecastingScoring.test.js.map +0 -1
- package/dist/__tests__/gaiaCapabilityAudioEval.test.d.ts +0 -15
- package/dist/__tests__/gaiaCapabilityAudioEval.test.js +0 -265
- package/dist/__tests__/gaiaCapabilityAudioEval.test.js.map +0 -1
- package/dist/__tests__/gaiaCapabilityEval.test.d.ts +0 -14
- package/dist/__tests__/gaiaCapabilityEval.test.js +0 -1259
- package/dist/__tests__/gaiaCapabilityEval.test.js.map +0 -1
- package/dist/__tests__/gaiaCapabilityFilesEval.test.d.ts +0 -15
- package/dist/__tests__/gaiaCapabilityFilesEval.test.js +0 -914
- package/dist/__tests__/gaiaCapabilityFilesEval.test.js.map +0 -1
- package/dist/__tests__/gaiaCapabilityMediaEval.test.d.ts +0 -15
- package/dist/__tests__/gaiaCapabilityMediaEval.test.js +0 -1101
- package/dist/__tests__/gaiaCapabilityMediaEval.test.js.map +0 -1
- package/dist/__tests__/helpers/answerMatch.d.ts +0 -41
- package/dist/__tests__/helpers/answerMatch.js +0 -267
- package/dist/__tests__/helpers/answerMatch.js.map +0 -1
- package/dist/__tests__/helpers/textLlm.d.ts +0 -25
- package/dist/__tests__/helpers/textLlm.js +0 -214
- package/dist/__tests__/helpers/textLlm.js.map +0 -1
- package/dist/__tests__/localDashboard.test.d.ts +0 -1
- package/dist/__tests__/localDashboard.test.js +0 -226
- package/dist/__tests__/localDashboard.test.js.map +0 -1
- package/dist/__tests__/multiHopDogfood.test.d.ts +0 -12
- package/dist/__tests__/multiHopDogfood.test.js +0 -303
- package/dist/__tests__/multiHopDogfood.test.js.map +0 -1
- package/dist/__tests__/openDatasetParallelEval.test.d.ts +0 -7
- package/dist/__tests__/openDatasetParallelEval.test.js +0 -209
- package/dist/__tests__/openDatasetParallelEval.test.js.map +0 -1
- package/dist/__tests__/openDatasetParallelEvalGaia.test.d.ts +0 -7
- package/dist/__tests__/openDatasetParallelEvalGaia.test.js +0 -279
- package/dist/__tests__/openDatasetParallelEvalGaia.test.js.map +0 -1
- package/dist/__tests__/openDatasetParallelEvalSwebench.test.d.ts +0 -7
- package/dist/__tests__/openDatasetParallelEvalSwebench.test.js +0 -220
- package/dist/__tests__/openDatasetParallelEvalSwebench.test.js.map +0 -1
- package/dist/__tests__/openDatasetParallelEvalToolbench.test.d.ts +0 -7
- package/dist/__tests__/openDatasetParallelEvalToolbench.test.js +0 -218
- package/dist/__tests__/openDatasetParallelEvalToolbench.test.js.map +0 -1
- package/dist/__tests__/openDatasetPerfComparison.test.d.ts +0 -10
- package/dist/__tests__/openDatasetPerfComparison.test.js +0 -318
- package/dist/__tests__/openDatasetPerfComparison.test.js.map +0 -1
- package/dist/__tests__/openclawDogfood.test.d.ts +0 -23
- package/dist/__tests__/openclawDogfood.test.js +0 -535
- package/dist/__tests__/openclawDogfood.test.js.map +0 -1
- package/dist/__tests__/openclawMessaging.test.d.ts +0 -14
- package/dist/__tests__/openclawMessaging.test.js +0 -232
- package/dist/__tests__/openclawMessaging.test.js.map +0 -1
- package/dist/__tests__/presetRealWorldBench.test.d.ts +0 -1
- package/dist/__tests__/presetRealWorldBench.test.js +0 -859
- package/dist/__tests__/presetRealWorldBench.test.js.map +0 -1
- package/dist/__tests__/tools.test.d.ts +0 -1
- package/dist/__tests__/tools.test.js +0 -3201
- package/dist/__tests__/tools.test.js.map +0 -1
- package/dist/__tests__/toolsetGatingEval.test.d.ts +0 -1
- package/dist/__tests__/toolsetGatingEval.test.js +0 -1099
- package/dist/__tests__/toolsetGatingEval.test.js.map +0 -1
- package/dist/__tests__/traceabilityDogfood.test.d.ts +0 -12
- package/dist/__tests__/traceabilityDogfood.test.js +0 -241
- package/dist/__tests__/traceabilityDogfood.test.js.map +0 -1
- package/dist/__tests__/webmcpTools.test.d.ts +0 -7
- package/dist/__tests__/webmcpTools.test.js +0 -195
- package/dist/__tests__/webmcpTools.test.js.map +0 -1
- package/dist/benchmarks/testProviderBus.d.ts +0 -7
- package/dist/benchmarks/testProviderBus.js +0 -272
- package/dist/benchmarks/testProviderBus.js.map +0 -1
- package/dist/hooks/postCompaction.d.ts +0 -14
- package/dist/hooks/postCompaction.js +0 -51
- package/dist/hooks/postCompaction.js.map +0 -1
- package/dist/security/__tests__/security.test.d.ts +0 -8
- package/dist/security/__tests__/security.test.js +0 -295
- package/dist/security/__tests__/security.test.js.map +0 -1
- package/dist/tools/documentTools.d.ts +0 -5
- package/dist/tools/documentTools.js +0 -524
- package/dist/tools/documentTools.js.map +0 -1
- package/dist/tools/financialTools.d.ts +0 -10
- package/dist/tools/financialTools.js +0 -403
- package/dist/tools/financialTools.js.map +0 -1
- package/dist/tools/memoryTools.d.ts +0 -5
- package/dist/tools/memoryTools.js +0 -137
- package/dist/tools/memoryTools.js.map +0 -1
- package/dist/tools/planningTools.d.ts +0 -5
- package/dist/tools/planningTools.js +0 -147
- package/dist/tools/planningTools.js.map +0 -1
- package/dist/tools/searchTools.d.ts +0 -5
- package/dist/tools/searchTools.js +0 -145
- package/dist/tools/searchTools.js.map +0 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Yahoo Finance source — live market data for key AI/tech stocks.
|
|
3
|
+
* No API key needed. Pattern from Crucix's yfinance.mjs.
|
|
4
|
+
*/
|
|
5
|
+
// Key AI/tech tickers that founders track
|
|
6
|
+
const TICKERS = ["GOOGL", "MSFT", "META", "NVDA", "AMD", "PLTR", "SNOW", "CRM"];
|
|
7
|
+
export async function collect() {
|
|
8
|
+
const signals = [];
|
|
9
|
+
try {
|
|
10
|
+
// Use Yahoo Finance v8 API (no key needed)
|
|
11
|
+
const tickerStr = TICKERS.join(",");
|
|
12
|
+
const resp = await fetch(`https://query1.finance.yahoo.com/v8/finance/spark?symbols=${tickerStr}&range=1d&interval=1d`, { signal: AbortSignal.timeout(5000), headers: { "User-Agent": "NodeBench/1.0" } });
|
|
13
|
+
if (!resp.ok)
|
|
14
|
+
return [];
|
|
15
|
+
const data = (await resp.json());
|
|
16
|
+
for (const ticker of TICKERS) {
|
|
17
|
+
const spark = data?.spark?.result?.find((r) => r.symbol === ticker);
|
|
18
|
+
if (!spark?.response?.[0]?.indicators?.quote?.[0])
|
|
19
|
+
continue;
|
|
20
|
+
const quote = spark.response[0].indicators.quote[0];
|
|
21
|
+
const close = quote.close?.filter(Boolean);
|
|
22
|
+
if (!close?.length)
|
|
23
|
+
continue;
|
|
24
|
+
const current = close[close.length - 1];
|
|
25
|
+
const prev = close[0];
|
|
26
|
+
const changePct = prev > 0 ? ((current - prev) / prev) * 100 : 0;
|
|
27
|
+
const absChange = Math.abs(changePct);
|
|
28
|
+
if (absChange < 2)
|
|
29
|
+
continue; // Only signal meaningful moves
|
|
30
|
+
signals.push({
|
|
31
|
+
id: `yf_${ticker}_${new Date().toISOString().slice(0, 10)}`,
|
|
32
|
+
source: "yahoo_finance",
|
|
33
|
+
entity: ticker,
|
|
34
|
+
headline: `${ticker} ${changePct > 0 ? "up" : "down"} ${absChange.toFixed(1)}% today ($${current.toFixed(2)})`,
|
|
35
|
+
url: `https://finance.yahoo.com/quote/${ticker}`,
|
|
36
|
+
score: Math.min(100, Math.round(absChange * 10)),
|
|
37
|
+
category: "market",
|
|
38
|
+
severity: absChange > 5 ? "flash" : absChange > 3 ? "priority" : "routine",
|
|
39
|
+
metadata: { price: current, changePct: Math.round(changePct * 100) / 100 },
|
|
40
|
+
collectedAt: new Date().toISOString(),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch { /* Yahoo unavailable */ }
|
|
45
|
+
return signals;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=yahoo_finance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yahoo_finance.js","sourceRoot":"","sources":["../../../src/sweep/sources/yahoo_finance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sweep Engine Types — following Crucix's pattern of self-contained
|
|
3
|
+
* source modules with standardized output shapes.
|
|
4
|
+
*
|
|
5
|
+
* Each source module exports collect() → Promise<SweepSignal[]>
|
|
6
|
+
* The sweep engine runs all sources in parallel and feeds the delta engine.
|
|
7
|
+
*/
|
|
8
|
+
export interface SweepSignal {
|
|
9
|
+
id: string;
|
|
10
|
+
source: string;
|
|
11
|
+
entity: string;
|
|
12
|
+
headline: string;
|
|
13
|
+
url?: string;
|
|
14
|
+
score?: number;
|
|
15
|
+
category: "company" | "product" | "market" | "funding" | "launch" | "trend" | "risk" | "regulatory";
|
|
16
|
+
severity: "flash" | "priority" | "routine";
|
|
17
|
+
metadata?: Record<string, unknown>;
|
|
18
|
+
collectedAt: string;
|
|
19
|
+
}
|
|
20
|
+
export interface SweepResult {
|
|
21
|
+
signals: SweepSignal[];
|
|
22
|
+
sources: Array<{
|
|
23
|
+
name: string;
|
|
24
|
+
status: "ok" | "error" | "timeout";
|
|
25
|
+
count: number;
|
|
26
|
+
durationMs: number;
|
|
27
|
+
}>;
|
|
28
|
+
totalDurationMs: number;
|
|
29
|
+
sweepId: string;
|
|
30
|
+
timestamp: string;
|
|
31
|
+
}
|
|
32
|
+
export interface DeltaResult {
|
|
33
|
+
newSignals: SweepSignal[];
|
|
34
|
+
escalations: Array<{
|
|
35
|
+
signal: SweepSignal;
|
|
36
|
+
from: string;
|
|
37
|
+
to: string;
|
|
38
|
+
}>;
|
|
39
|
+
deescalations: Array<{
|
|
40
|
+
signal: SweepSignal;
|
|
41
|
+
from: string;
|
|
42
|
+
to: string;
|
|
43
|
+
}>;
|
|
44
|
+
topEntity: string | null;
|
|
45
|
+
topEntityQuery: string | null;
|
|
46
|
+
topEntitySeverity: "flash" | "priority" | "routine" | null;
|
|
47
|
+
sweepId: string;
|
|
48
|
+
previousSweepId: string | null;
|
|
49
|
+
}
|
|
50
|
+
export type SourceCollector = () => Promise<SweepSignal[]>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sweep Engine Types — following Crucix's pattern of self-contained
|
|
3
|
+
* source modules with standardized output shapes.
|
|
4
|
+
*
|
|
5
|
+
* Each source module exports collect() → Promise<SweepSignal[]>
|
|
6
|
+
* The sweep engine runs all sources in parallel and feeds the delta engine.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sweep/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export type FounderEpisodeStatus = "active" | "completed" | "error" | "aborted";
|
|
2
|
+
export type FounderEpisodeSurface = "web" | "api" | "browser" | "claude_code" | "openclaw" | "local_runtime";
|
|
3
|
+
export interface FounderEpisodeRecord {
|
|
4
|
+
episodeId: string;
|
|
5
|
+
correlationId: string;
|
|
6
|
+
sessionKey?: string | null;
|
|
7
|
+
workspaceId?: string | null;
|
|
8
|
+
companyKey?: string | null;
|
|
9
|
+
surface: FounderEpisodeSurface;
|
|
10
|
+
episodeType: string;
|
|
11
|
+
status: FounderEpisodeStatus;
|
|
12
|
+
query?: string | null;
|
|
13
|
+
lens?: string | null;
|
|
14
|
+
entityName?: string | null;
|
|
15
|
+
packetId?: string | null;
|
|
16
|
+
packetType?: string | null;
|
|
17
|
+
workflowAssetId?: string | null;
|
|
18
|
+
workflowEnvelopeId?: string | null;
|
|
19
|
+
contextId?: string | null;
|
|
20
|
+
taskId?: string | null;
|
|
21
|
+
summary?: string | null;
|
|
22
|
+
stateBefore?: Record<string, unknown>;
|
|
23
|
+
stateAfter?: Record<string, unknown>;
|
|
24
|
+
stateBeforeHash?: string | null;
|
|
25
|
+
stateAfterHash?: string | null;
|
|
26
|
+
spans: Array<Record<string, unknown>>;
|
|
27
|
+
traceStepCount?: number | null;
|
|
28
|
+
toolsInvoked: string[];
|
|
29
|
+
artifactsProduced: string[];
|
|
30
|
+
importantChangesDetected?: number | null;
|
|
31
|
+
contradictionsDetected?: number | null;
|
|
32
|
+
metadata?: Record<string, unknown>;
|
|
33
|
+
startedAt: string;
|
|
34
|
+
updatedAt: string;
|
|
35
|
+
completedAt?: string | null;
|
|
36
|
+
}
|
|
37
|
+
export declare function startFounderEpisode(input: {
|
|
38
|
+
episodeId?: string;
|
|
39
|
+
correlationId?: string;
|
|
40
|
+
sessionKey?: string | null;
|
|
41
|
+
workspaceId?: string | null;
|
|
42
|
+
companyKey?: string | null;
|
|
43
|
+
surface: FounderEpisodeSurface;
|
|
44
|
+
episodeType: string;
|
|
45
|
+
query?: string | null;
|
|
46
|
+
lens?: string | null;
|
|
47
|
+
entityName?: string | null;
|
|
48
|
+
stateBefore?: Record<string, unknown>;
|
|
49
|
+
stateBeforeHash?: string;
|
|
50
|
+
metadata?: Record<string, unknown>;
|
|
51
|
+
initialSpan?: Record<string, unknown>;
|
|
52
|
+
workflowAssetId?: string | null;
|
|
53
|
+
workflowEnvelopeId?: string | null;
|
|
54
|
+
}): FounderEpisodeRecord;
|
|
55
|
+
export declare function appendFounderEpisodeSpan(input: {
|
|
56
|
+
episodeId: string;
|
|
57
|
+
span: Record<string, unknown>;
|
|
58
|
+
contextId?: string | null;
|
|
59
|
+
taskId?: string | null;
|
|
60
|
+
entityName?: string | null;
|
|
61
|
+
packetId?: string | null;
|
|
62
|
+
packetType?: string | null;
|
|
63
|
+
workspaceId?: string | null;
|
|
64
|
+
companyKey?: string | null;
|
|
65
|
+
metadata?: Record<string, unknown>;
|
|
66
|
+
workflowAssetId?: string | null;
|
|
67
|
+
workflowEnvelopeId?: string | null;
|
|
68
|
+
}): FounderEpisodeRecord;
|
|
69
|
+
export declare function finalizeFounderEpisode(input: {
|
|
70
|
+
episodeId: string;
|
|
71
|
+
status?: FounderEpisodeStatus;
|
|
72
|
+
stateAfter?: Record<string, unknown>;
|
|
73
|
+
stateAfterHash?: string;
|
|
74
|
+
summary?: string | null;
|
|
75
|
+
toolsInvoked?: string[];
|
|
76
|
+
artifactsProduced?: string[];
|
|
77
|
+
traceStepCount?: number | null;
|
|
78
|
+
importantChangesDetected?: number | null;
|
|
79
|
+
contradictionsDetected?: number | null;
|
|
80
|
+
contextId?: string | null;
|
|
81
|
+
taskId?: string | null;
|
|
82
|
+
entityName?: string | null;
|
|
83
|
+
packetId?: string | null;
|
|
84
|
+
packetType?: string | null;
|
|
85
|
+
workspaceId?: string | null;
|
|
86
|
+
companyKey?: string | null;
|
|
87
|
+
finalSpan?: Record<string, unknown>;
|
|
88
|
+
metadata?: Record<string, unknown>;
|
|
89
|
+
workflowAssetId?: string | null;
|
|
90
|
+
workflowEnvelopeId?: string | null;
|
|
91
|
+
}): FounderEpisodeRecord;
|
|
92
|
+
export declare function getFounderEpisode(episodeId: string): FounderEpisodeRecord | null;
|
|
93
|
+
export declare function listFounderEpisodes(input?: {
|
|
94
|
+
sessionKey?: string | null;
|
|
95
|
+
workspaceId?: string | null;
|
|
96
|
+
status?: FounderEpisodeStatus;
|
|
97
|
+
limit?: number;
|
|
98
|
+
}): FounderEpisodeRecord[];
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { genId, getDb } from "../db.js";
|
|
3
|
+
function json(value, fallback = {}) {
|
|
4
|
+
return JSON.stringify(value ?? fallback);
|
|
5
|
+
}
|
|
6
|
+
function parseJson(value, fallback) {
|
|
7
|
+
if (!value)
|
|
8
|
+
return fallback;
|
|
9
|
+
try {
|
|
10
|
+
return JSON.parse(value);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return fallback;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function hashPayload(payload) {
|
|
17
|
+
return createHash("sha256").update(JSON.stringify(payload ?? null)).digest("hex");
|
|
18
|
+
}
|
|
19
|
+
function ensureFounderEpisodeColumns() {
|
|
20
|
+
const db = getDb();
|
|
21
|
+
const columns = db.prepare("PRAGMA table_info(founder_harness_episodes)").all();
|
|
22
|
+
if (!columns.some((column) => column.name === "workflow_asset_id")) {
|
|
23
|
+
db.exec("ALTER TABLE founder_harness_episodes ADD COLUMN workflow_asset_id TEXT");
|
|
24
|
+
}
|
|
25
|
+
if (!columns.some((column) => column.name === "workflow_envelope_id")) {
|
|
26
|
+
db.exec("ALTER TABLE founder_harness_episodes ADD COLUMN workflow_envelope_id TEXT");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function parseRow(row) {
|
|
30
|
+
return {
|
|
31
|
+
episodeId: row.episode_id,
|
|
32
|
+
correlationId: row.correlation_id,
|
|
33
|
+
sessionKey: row.session_key ?? null,
|
|
34
|
+
workspaceId: row.workspace_id ?? null,
|
|
35
|
+
companyKey: row.company_key ?? null,
|
|
36
|
+
surface: row.surface,
|
|
37
|
+
episodeType: row.episode_type,
|
|
38
|
+
status: row.status,
|
|
39
|
+
query: row.query ?? null,
|
|
40
|
+
lens: row.lens ?? null,
|
|
41
|
+
entityName: row.entity_name ?? null,
|
|
42
|
+
packetId: row.packet_id ?? null,
|
|
43
|
+
packetType: row.packet_type ?? null,
|
|
44
|
+
workflowAssetId: row.workflow_asset_id ?? null,
|
|
45
|
+
workflowEnvelopeId: row.workflow_envelope_id ?? null,
|
|
46
|
+
contextId: row.context_id ?? null,
|
|
47
|
+
taskId: row.task_id ?? null,
|
|
48
|
+
summary: row.summary ?? null,
|
|
49
|
+
stateBefore: parseJson(row.state_before_json, {}),
|
|
50
|
+
stateAfter: parseJson(row.state_after_json, {}),
|
|
51
|
+
stateBeforeHash: row.state_before_hash ?? null,
|
|
52
|
+
stateAfterHash: row.state_after_hash ?? null,
|
|
53
|
+
spans: parseJson(row.spans_json, []),
|
|
54
|
+
traceStepCount: row.trace_step_count ?? null,
|
|
55
|
+
toolsInvoked: parseJson(row.tools_invoked_json, []),
|
|
56
|
+
artifactsProduced: parseJson(row.artifacts_produced_json, []),
|
|
57
|
+
importantChangesDetected: row.important_changes_detected ?? null,
|
|
58
|
+
contradictionsDetected: row.contradictions_detected ?? null,
|
|
59
|
+
metadata: parseJson(row.metadata_json, {}),
|
|
60
|
+
startedAt: row.started_at,
|
|
61
|
+
updatedAt: row.updated_at,
|
|
62
|
+
completedAt: row.completed_at ?? null,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function startFounderEpisode(input) {
|
|
66
|
+
ensureFounderEpisodeColumns();
|
|
67
|
+
const db = getDb();
|
|
68
|
+
const now = new Date().toISOString();
|
|
69
|
+
const episodeId = input.episodeId ?? genId("episode");
|
|
70
|
+
const correlationId = input.correlationId ?? genId("corr");
|
|
71
|
+
const existing = db.prepare(`
|
|
72
|
+
SELECT *
|
|
73
|
+
FROM founder_harness_episodes
|
|
74
|
+
WHERE episode_id = ?
|
|
75
|
+
LIMIT 1
|
|
76
|
+
`).get(episodeId);
|
|
77
|
+
const stateBeforeHash = input.stateBeforeHash ?? hashPayload(input.stateBefore ?? null);
|
|
78
|
+
const spans = input.initialSpan ? [input.initialSpan] : [];
|
|
79
|
+
if (existing) {
|
|
80
|
+
db.prepare(`
|
|
81
|
+
UPDATE founder_harness_episodes
|
|
82
|
+
SET correlation_id = ?,
|
|
83
|
+
session_key = COALESCE(?, session_key),
|
|
84
|
+
workspace_id = COALESCE(?, workspace_id),
|
|
85
|
+
company_key = COALESCE(?, company_key),
|
|
86
|
+
surface = ?,
|
|
87
|
+
episode_type = ?,
|
|
88
|
+
query = COALESCE(?, query),
|
|
89
|
+
lens = COALESCE(?, lens),
|
|
90
|
+
entity_name = COALESCE(?, entity_name),
|
|
91
|
+
workflow_asset_id = COALESCE(?, workflow_asset_id),
|
|
92
|
+
workflow_envelope_id = COALESCE(?, workflow_envelope_id),
|
|
93
|
+
state_before_json = COALESCE(?, state_before_json),
|
|
94
|
+
state_before_hash = COALESCE(?, state_before_hash),
|
|
95
|
+
spans_json = CASE WHEN length(COALESCE(spans_json, '')) > 2 THEN spans_json ELSE ? END,
|
|
96
|
+
metadata_json = COALESCE(?, metadata_json),
|
|
97
|
+
updated_at = ?,
|
|
98
|
+
status = CASE WHEN status = 'completed' THEN status ELSE 'active' END
|
|
99
|
+
WHERE episode_id = ?
|
|
100
|
+
`).run(correlationId, input.sessionKey ?? null, input.workspaceId ?? null, input.companyKey ?? null, input.surface, input.episodeType, input.query ?? null, input.lens ?? null, input.entityName ?? null, input.workflowAssetId ?? null, input.workflowEnvelopeId ?? null, input.stateBefore ? json(input.stateBefore) : null, stateBeforeHash, json(spans, []), input.metadata ? json(input.metadata) : null, now, episodeId);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
db.prepare(`
|
|
104
|
+
INSERT INTO founder_harness_episodes (
|
|
105
|
+
episode_id, correlation_id, session_key, workspace_id, company_key,
|
|
106
|
+
surface, episode_type, status, query, lens, entity_name, state_before_json,
|
|
107
|
+
workflow_asset_id, workflow_envelope_id, state_before_hash, spans_json, tools_invoked_json, artifacts_produced_json,
|
|
108
|
+
metadata_json, started_at, updated_at
|
|
109
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
110
|
+
`).run(episodeId, correlationId, input.sessionKey ?? null, input.workspaceId ?? null, input.companyKey ?? null, input.surface, input.episodeType, "active", input.query ?? null, input.lens ?? null, input.entityName ?? null, json(input.stateBefore), input.workflowAssetId ?? null, input.workflowEnvelopeId ?? null, stateBeforeHash, json(spans, []), "[]", "[]", input.metadata ? json(input.metadata) : null, now, now);
|
|
111
|
+
}
|
|
112
|
+
return getFounderEpisode(episodeId);
|
|
113
|
+
}
|
|
114
|
+
export function appendFounderEpisodeSpan(input) {
|
|
115
|
+
ensureFounderEpisodeColumns();
|
|
116
|
+
const db = getDb();
|
|
117
|
+
const existing = getFounderEpisode(input.episodeId);
|
|
118
|
+
if (!existing) {
|
|
119
|
+
throw new Error(`Founder harness episode not found: ${input.episodeId}`);
|
|
120
|
+
}
|
|
121
|
+
const spans = [...existing.spans, input.span];
|
|
122
|
+
const metadata = input.metadata ? { ...(existing.metadata ?? {}), ...input.metadata } : existing.metadata;
|
|
123
|
+
const now = new Date().toISOString();
|
|
124
|
+
db.prepare(`
|
|
125
|
+
UPDATE founder_harness_episodes
|
|
126
|
+
SET spans_json = ?,
|
|
127
|
+
context_id = COALESCE(?, context_id),
|
|
128
|
+
task_id = COALESCE(?, task_id),
|
|
129
|
+
entity_name = COALESCE(?, entity_name),
|
|
130
|
+
packet_id = COALESCE(?, packet_id),
|
|
131
|
+
packet_type = COALESCE(?, packet_type),
|
|
132
|
+
workflow_asset_id = COALESCE(?, workflow_asset_id),
|
|
133
|
+
workflow_envelope_id = COALESCE(?, workflow_envelope_id),
|
|
134
|
+
workspace_id = COALESCE(?, workspace_id),
|
|
135
|
+
company_key = COALESCE(?, company_key),
|
|
136
|
+
metadata_json = ?,
|
|
137
|
+
updated_at = ?
|
|
138
|
+
WHERE episode_id = ?
|
|
139
|
+
`).run(json(spans, []), input.contextId ?? null, input.taskId ?? null, input.entityName ?? null, input.packetId ?? null, input.packetType ?? null, input.workflowAssetId ?? null, input.workflowEnvelopeId ?? null, input.workspaceId ?? null, input.companyKey ?? null, json(metadata), now, input.episodeId);
|
|
140
|
+
return getFounderEpisode(input.episodeId);
|
|
141
|
+
}
|
|
142
|
+
export function finalizeFounderEpisode(input) {
|
|
143
|
+
ensureFounderEpisodeColumns();
|
|
144
|
+
const db = getDb();
|
|
145
|
+
const existing = getFounderEpisode(input.episodeId);
|
|
146
|
+
if (!existing) {
|
|
147
|
+
throw new Error(`Founder harness episode not found: ${input.episodeId}`);
|
|
148
|
+
}
|
|
149
|
+
const spans = input.finalSpan ? [...existing.spans, input.finalSpan] : existing.spans;
|
|
150
|
+
const toolsInvoked = input.toolsInvoked
|
|
151
|
+
? Array.from(new Set([...(existing.toolsInvoked ?? []), ...input.toolsInvoked]))
|
|
152
|
+
: existing.toolsInvoked;
|
|
153
|
+
const artifactsProduced = input.artifactsProduced
|
|
154
|
+
? Array.from(new Set([...(existing.artifactsProduced ?? []), ...input.artifactsProduced]))
|
|
155
|
+
: existing.artifactsProduced;
|
|
156
|
+
const metadata = input.metadata ? { ...(existing.metadata ?? {}), ...input.metadata } : existing.metadata;
|
|
157
|
+
const now = new Date().toISOString();
|
|
158
|
+
db.prepare(`
|
|
159
|
+
UPDATE founder_harness_episodes
|
|
160
|
+
SET status = ?,
|
|
161
|
+
state_after_json = COALESCE(?, state_after_json),
|
|
162
|
+
state_after_hash = COALESCE(?, state_after_hash),
|
|
163
|
+
summary = COALESCE(?, summary),
|
|
164
|
+
tools_invoked_json = ?,
|
|
165
|
+
artifacts_produced_json = ?,
|
|
166
|
+
trace_step_count = COALESCE(?, trace_step_count),
|
|
167
|
+
important_changes_detected = COALESCE(?, important_changes_detected),
|
|
168
|
+
contradictions_detected = COALESCE(?, contradictions_detected),
|
|
169
|
+
context_id = COALESCE(?, context_id),
|
|
170
|
+
task_id = COALESCE(?, task_id),
|
|
171
|
+
entity_name = COALESCE(?, entity_name),
|
|
172
|
+
packet_id = COALESCE(?, packet_id),
|
|
173
|
+
packet_type = COALESCE(?, packet_type),
|
|
174
|
+
workflow_asset_id = COALESCE(?, workflow_asset_id),
|
|
175
|
+
workflow_envelope_id = COALESCE(?, workflow_envelope_id),
|
|
176
|
+
workspace_id = COALESCE(?, workspace_id),
|
|
177
|
+
company_key = COALESCE(?, company_key),
|
|
178
|
+
spans_json = ?,
|
|
179
|
+
metadata_json = ?,
|
|
180
|
+
updated_at = ?,
|
|
181
|
+
completed_at = ?
|
|
182
|
+
WHERE episode_id = ?
|
|
183
|
+
`).run(input.status ?? "completed", input.stateAfter ? json(input.stateAfter) : null, input.stateAfterHash ?? hashPayload(input.stateAfter ?? existing.stateAfter ?? null), input.summary ?? null, json(toolsInvoked, []), json(artifactsProduced, []), input.traceStepCount ?? null, input.importantChangesDetected ?? null, input.contradictionsDetected ?? null, input.contextId ?? null, input.taskId ?? null, input.entityName ?? null, input.packetId ?? null, input.packetType ?? null, input.workflowAssetId ?? null, input.workflowEnvelopeId ?? null, input.workspaceId ?? null, input.companyKey ?? null, json(spans, []), json(metadata), now, now, input.episodeId);
|
|
184
|
+
return getFounderEpisode(input.episodeId);
|
|
185
|
+
}
|
|
186
|
+
export function getFounderEpisode(episodeId) {
|
|
187
|
+
ensureFounderEpisodeColumns();
|
|
188
|
+
const row = getDb().prepare(`
|
|
189
|
+
SELECT *
|
|
190
|
+
FROM founder_harness_episodes
|
|
191
|
+
WHERE episode_id = ?
|
|
192
|
+
LIMIT 1
|
|
193
|
+
`).get(episodeId);
|
|
194
|
+
return row ? parseRow(row) : null;
|
|
195
|
+
}
|
|
196
|
+
export function listFounderEpisodes(input = {}) {
|
|
197
|
+
ensureFounderEpisodeColumns();
|
|
198
|
+
const limit = Math.min(Math.max(input.limit ?? 10, 1), 50);
|
|
199
|
+
const db = getDb();
|
|
200
|
+
let rows = [];
|
|
201
|
+
if (input.sessionKey) {
|
|
202
|
+
rows = db.prepare(`
|
|
203
|
+
SELECT *
|
|
204
|
+
FROM founder_harness_episodes
|
|
205
|
+
WHERE session_key = ?
|
|
206
|
+
ORDER BY started_at DESC
|
|
207
|
+
LIMIT ?
|
|
208
|
+
`).all(input.sessionKey, limit * 2);
|
|
209
|
+
}
|
|
210
|
+
else if (input.workspaceId) {
|
|
211
|
+
rows = db.prepare(`
|
|
212
|
+
SELECT *
|
|
213
|
+
FROM founder_harness_episodes
|
|
214
|
+
WHERE workspace_id = ?
|
|
215
|
+
ORDER BY started_at DESC
|
|
216
|
+
LIMIT ?
|
|
217
|
+
`).all(input.workspaceId, limit * 2);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
rows = db.prepare(`
|
|
221
|
+
SELECT *
|
|
222
|
+
FROM founder_harness_episodes
|
|
223
|
+
ORDER BY started_at DESC
|
|
224
|
+
LIMIT ?
|
|
225
|
+
`).all(limit * 2);
|
|
226
|
+
}
|
|
227
|
+
const parsed = rows.map(parseRow);
|
|
228
|
+
return input.status ? parsed.filter((row) => row.status === input.status).slice(0, limit) : parsed.slice(0, limit);
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=founderEpisodeStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"founderEpisodeStore.js","sourceRoot":"","sources":["../../src/sync/founderEpisodeStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hyperloopArchive.ts — Archive of historically successful variants.
|
|
3
|
+
*
|
|
4
|
+
* Meta HyperAgent pattern: keep a population of successful variants
|
|
5
|
+
* as stepping stones for improvement. Each entry is a packet template,
|
|
6
|
+
* workflow path, routing policy, or signal recipe that worked.
|
|
7
|
+
*
|
|
8
|
+
* SQLite-backed. Bounded (MAX_ARCHIVE entries with eviction by lowest score).
|
|
9
|
+
*/
|
|
10
|
+
export type ArchiveEntryType = "packet_template" | "workflow_path" | "routing_policy" | "signal_recipe" | "export_adapter" | "delegation_shape";
|
|
11
|
+
export type ArchiveEntryStatus = "candidate" | "validated" | "promoted" | "retired";
|
|
12
|
+
export interface ArchiveEntry {
|
|
13
|
+
id: string;
|
|
14
|
+
type: ArchiveEntryType;
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
content: string;
|
|
18
|
+
sourceEpisodeId: string;
|
|
19
|
+
sourceQuery: string;
|
|
20
|
+
sourceLens: string;
|
|
21
|
+
sourceEntity: string | null;
|
|
22
|
+
evidenceCoverage: number;
|
|
23
|
+
contradictionsCaught: number;
|
|
24
|
+
userEditDistance: number;
|
|
25
|
+
wasExported: boolean;
|
|
26
|
+
wasDelegated: boolean;
|
|
27
|
+
qualityScore: number;
|
|
28
|
+
improvementDelta: number;
|
|
29
|
+
status: ArchiveEntryStatus;
|
|
30
|
+
usageCount: number;
|
|
31
|
+
createdAt: string;
|
|
32
|
+
updatedAt: string;
|
|
33
|
+
}
|
|
34
|
+
export declare function initHyperloopTables(): void;
|
|
35
|
+
export declare function addArchiveEntry(entry: Omit<ArchiveEntry, "id" | "status" | "usageCount" | "updatedAt">): ArchiveEntry;
|
|
36
|
+
/** Find the best archive entry for a given type + query context. */
|
|
37
|
+
export declare function lookupBestVariant(type: ArchiveEntryType, lens?: string, entity?: string): ArchiveEntry | null;
|
|
38
|
+
/** Validate entries that meet thresholds. Promotion is human-gated in Convex. */
|
|
39
|
+
export declare function runPromotionCycle(): {
|
|
40
|
+
promoted: number;
|
|
41
|
+
validated: number;
|
|
42
|
+
};
|
|
43
|
+
/** Get archive stats. */
|
|
44
|
+
export declare function getArchiveStats(): {
|
|
45
|
+
total: number;
|
|
46
|
+
byType: Record<string, number>;
|
|
47
|
+
byStatus: Record<string, number>;
|
|
48
|
+
avgQuality: number;
|
|
49
|
+
};
|
|
50
|
+
/** List top archive entries. */
|
|
51
|
+
export declare function listTopEntries(type?: ArchiveEntryType, limit?: number): ArchiveEntry[];
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hyperloopArchive.ts — Archive of historically successful variants.
|
|
3
|
+
*
|
|
4
|
+
* Meta HyperAgent pattern: keep a population of successful variants
|
|
5
|
+
* as stepping stones for improvement. Each entry is a packet template,
|
|
6
|
+
* workflow path, routing policy, or signal recipe that worked.
|
|
7
|
+
*
|
|
8
|
+
* SQLite-backed. Bounded (MAX_ARCHIVE entries with eviction by lowest score).
|
|
9
|
+
*/
|
|
10
|
+
import { getDb, genId } from "../db.js";
|
|
11
|
+
// ─── Constants ───────────────────────────────────────────────────
|
|
12
|
+
const MAX_ARCHIVE = 200;
|
|
13
|
+
const PROMOTE_USAGE_THRESHOLD = 5;
|
|
14
|
+
const VALIDATE_USAGE_THRESHOLD = 3;
|
|
15
|
+
const PROMOTE_QUALITY_THRESHOLD = 0.7;
|
|
16
|
+
// ─── Schema init ─────────────────────────────────────────────────
|
|
17
|
+
export function initHyperloopTables() {
|
|
18
|
+
const db = getDb();
|
|
19
|
+
db.exec(`
|
|
20
|
+
CREATE TABLE IF NOT EXISTS hyperloop_archive (
|
|
21
|
+
id TEXT PRIMARY KEY,
|
|
22
|
+
type TEXT NOT NULL,
|
|
23
|
+
name TEXT NOT NULL,
|
|
24
|
+
description TEXT NOT NULL,
|
|
25
|
+
content TEXT NOT NULL,
|
|
26
|
+
source_episode_id TEXT NOT NULL,
|
|
27
|
+
source_query TEXT NOT NULL,
|
|
28
|
+
source_lens TEXT NOT NULL,
|
|
29
|
+
source_entity TEXT,
|
|
30
|
+
evidence_coverage REAL NOT NULL DEFAULT 0,
|
|
31
|
+
contradictions_caught INTEGER NOT NULL DEFAULT 0,
|
|
32
|
+
user_edit_distance REAL NOT NULL DEFAULT 1,
|
|
33
|
+
was_exported INTEGER NOT NULL DEFAULT 0,
|
|
34
|
+
was_delegated INTEGER NOT NULL DEFAULT 0,
|
|
35
|
+
quality_score REAL NOT NULL DEFAULT 0,
|
|
36
|
+
improvement_delta REAL NOT NULL DEFAULT 0,
|
|
37
|
+
status TEXT NOT NULL DEFAULT 'candidate',
|
|
38
|
+
usage_count INTEGER NOT NULL DEFAULT 0,
|
|
39
|
+
created_at TEXT NOT NULL,
|
|
40
|
+
updated_at TEXT NOT NULL
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_archive_type_status ON hyperloop_archive(type, status);
|
|
44
|
+
CREATE INDEX IF NOT EXISTS idx_archive_quality ON hyperloop_archive(quality_score DESC);
|
|
45
|
+
CREATE INDEX IF NOT EXISTS idx_archive_type_quality ON hyperloop_archive(type, quality_score DESC);
|
|
46
|
+
`);
|
|
47
|
+
}
|
|
48
|
+
// ─── CRUD ────────────────────────────────────────────────────────
|
|
49
|
+
export function addArchiveEntry(entry) {
|
|
50
|
+
const db = getDb();
|
|
51
|
+
initHyperloopTables();
|
|
52
|
+
const id = genId("hyp");
|
|
53
|
+
const now = new Date().toISOString();
|
|
54
|
+
// Bounded: evict lowest quality if over limit
|
|
55
|
+
const countRow = db.prepare("SELECT COUNT(*) as cnt FROM hyperloop_archive").get();
|
|
56
|
+
if ((countRow?.cnt ?? 0) >= MAX_ARCHIVE) {
|
|
57
|
+
db.prepare("DELETE FROM hyperloop_archive WHERE id IN (SELECT id FROM hyperloop_archive WHERE status = 'candidate' ORDER BY quality_score ASC LIMIT 10)").run();
|
|
58
|
+
}
|
|
59
|
+
db.prepare(`
|
|
60
|
+
INSERT INTO hyperloop_archive (id, type, name, description, content, source_episode_id, source_query, source_lens, source_entity, evidence_coverage, contradictions_caught, user_edit_distance, was_exported, was_delegated, quality_score, improvement_delta, status, usage_count, created_at, updated_at)
|
|
61
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'candidate', 0, ?, ?)
|
|
62
|
+
`).run(id, entry.type, entry.name, entry.description, entry.content, entry.sourceEpisodeId, entry.sourceQuery, entry.sourceLens, entry.sourceEntity ?? null, entry.evidenceCoverage, entry.contradictionsCaught, entry.userEditDistance, entry.wasExported ? 1 : 0, entry.wasDelegated ? 1 : 0, entry.qualityScore, entry.improvementDelta, entry.createdAt, now);
|
|
63
|
+
return { ...entry, id, status: "candidate", usageCount: 0, updatedAt: now };
|
|
64
|
+
}
|
|
65
|
+
/** Find the best archive entry for a given type + query context. */
|
|
66
|
+
export function lookupBestVariant(type, lens, entity) {
|
|
67
|
+
const db = getDb();
|
|
68
|
+
initHyperloopTables();
|
|
69
|
+
// Prefer promoted > validated > candidate. Match lens/entity if possible.
|
|
70
|
+
let row = null;
|
|
71
|
+
if (entity) {
|
|
72
|
+
row = db.prepare("SELECT * FROM hyperloop_archive WHERE type = ? AND status = 'promoted' AND source_entity = ? ORDER BY quality_score DESC LIMIT 1").get(type, entity);
|
|
73
|
+
}
|
|
74
|
+
if (!row && lens) {
|
|
75
|
+
row = db.prepare("SELECT * FROM hyperloop_archive WHERE type = ? AND status = 'promoted' AND source_lens = ? ORDER BY quality_score DESC LIMIT 1").get(type, lens);
|
|
76
|
+
}
|
|
77
|
+
if (!row) {
|
|
78
|
+
row = db.prepare("SELECT * FROM hyperloop_archive WHERE type = ? AND status IN ('promoted', 'validated') ORDER BY quality_score DESC LIMIT 1").get(type);
|
|
79
|
+
}
|
|
80
|
+
if (!row)
|
|
81
|
+
return null;
|
|
82
|
+
// Increment usage count
|
|
83
|
+
db.prepare("UPDATE hyperloop_archive SET usage_count = usage_count + 1, updated_at = ? WHERE id = ?")
|
|
84
|
+
.run(new Date().toISOString(), row.id);
|
|
85
|
+
return rowToEntry(row);
|
|
86
|
+
}
|
|
87
|
+
/** Validate entries that meet thresholds. Promotion is human-gated in Convex. */
|
|
88
|
+
export function runPromotionCycle() {
|
|
89
|
+
const db = getDb();
|
|
90
|
+
initHyperloopTables();
|
|
91
|
+
// Candidate → Validated: usage >= 3, quality > 0.6
|
|
92
|
+
const validated = db.prepare("UPDATE hyperloop_archive SET status = 'validated', updated_at = ? WHERE status = 'candidate' AND usage_count >= ? AND quality_score > 0.6").run(new Date().toISOString(), VALIDATE_USAGE_THRESHOLD);
|
|
93
|
+
// Validated → Promoted: usage >= 5, quality > 0.7, improvement_delta > 0
|
|
94
|
+
// Promotion is deliberately not automatic here. Use the Convex HyperLoop
|
|
95
|
+
// promotion mutation so reviewer id and deterministic gates are preserved.
|
|
96
|
+
const promoted = { changes: 0 };
|
|
97
|
+
return {
|
|
98
|
+
promoted: promoted.changes,
|
|
99
|
+
validated: validated.changes,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/** Get archive stats. */
|
|
103
|
+
export function getArchiveStats() {
|
|
104
|
+
const db = getDb();
|
|
105
|
+
initHyperloopTables();
|
|
106
|
+
const total = db.prepare("SELECT COUNT(*) as cnt FROM hyperloop_archive").get()?.cnt ?? 0;
|
|
107
|
+
const typeRows = db.prepare("SELECT type, COUNT(*) as cnt FROM hyperloop_archive GROUP BY type").all();
|
|
108
|
+
const byType = {};
|
|
109
|
+
for (const r of typeRows)
|
|
110
|
+
byType[r.type] = r.cnt;
|
|
111
|
+
const statusRows = db.prepare("SELECT status, COUNT(*) as cnt FROM hyperloop_archive GROUP BY status").all();
|
|
112
|
+
const byStatus = {};
|
|
113
|
+
for (const r of statusRows)
|
|
114
|
+
byStatus[r.status] = r.cnt;
|
|
115
|
+
const avgRow = db.prepare("SELECT AVG(quality_score) as avg FROM hyperloop_archive").get();
|
|
116
|
+
const avgQuality = avgRow?.avg ?? 0;
|
|
117
|
+
return { total, byType, byStatus, avgQuality: Math.round(avgQuality * 100) / 100 };
|
|
118
|
+
}
|
|
119
|
+
/** List top archive entries. */
|
|
120
|
+
export function listTopEntries(type, limit = 10) {
|
|
121
|
+
const db = getDb();
|
|
122
|
+
initHyperloopTables();
|
|
123
|
+
const rows = type
|
|
124
|
+
? db.prepare("SELECT * FROM hyperloop_archive WHERE type = ? ORDER BY quality_score DESC LIMIT ?").all(type, limit)
|
|
125
|
+
: db.prepare("SELECT * FROM hyperloop_archive ORDER BY quality_score DESC LIMIT ?").all(limit);
|
|
126
|
+
return rows.map(rowToEntry);
|
|
127
|
+
}
|
|
128
|
+
// ─── Helpers ─────────────────────────────────────────────────────
|
|
129
|
+
function rowToEntry(row) {
|
|
130
|
+
return {
|
|
131
|
+
id: row.id,
|
|
132
|
+
type: row.type,
|
|
133
|
+
name: row.name,
|
|
134
|
+
description: row.description,
|
|
135
|
+
content: row.content,
|
|
136
|
+
sourceEpisodeId: row.source_episode_id,
|
|
137
|
+
sourceQuery: row.source_query,
|
|
138
|
+
sourceLens: row.source_lens,
|
|
139
|
+
sourceEntity: row.source_entity,
|
|
140
|
+
evidenceCoverage: row.evidence_coverage,
|
|
141
|
+
contradictionsCaught: row.contradictions_caught,
|
|
142
|
+
userEditDistance: row.user_edit_distance,
|
|
143
|
+
wasExported: !!row.was_exported,
|
|
144
|
+
wasDelegated: !!row.was_delegated,
|
|
145
|
+
qualityScore: row.quality_score,
|
|
146
|
+
improvementDelta: row.improvement_delta,
|
|
147
|
+
status: row.status,
|
|
148
|
+
usageCount: row.usage_count,
|
|
149
|
+
createdAt: row.created_at,
|
|
150
|
+
updatedAt: row.updated_at,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=hyperloopArchive.js.map
|