opencandle 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -4
- package/dist/analysts/contracts.d.ts +31 -0
- package/dist/analysts/contracts.js +158 -0
- package/dist/analysts/contracts.js.map +1 -0
- package/dist/analysts/orchestrator.d.ts +11 -2
- package/dist/analysts/orchestrator.js +155 -7
- package/dist/analysts/orchestrator.js.map +1 -1
- package/dist/cli.js +26 -10
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/infra/cache.d.ts +30 -0
- package/dist/infra/cache.js +40 -3
- package/dist/infra/cache.js.map +1 -1
- package/dist/infra/index.d.ts +1 -1
- package/dist/infra/index.js +1 -1
- package/dist/infra/index.js.map +1 -1
- package/dist/infra/opencandle-paths.d.ts +1 -0
- package/dist/infra/opencandle-paths.js +3 -0
- package/dist/infra/opencandle-paths.js.map +1 -1
- package/dist/infra/rate-limiter.js +1 -0
- package/dist/infra/rate-limiter.js.map +1 -1
- package/dist/memory/index.d.ts +3 -0
- package/dist/memory/index.js +2 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/manager.d.ts +19 -0
- package/dist/memory/manager.js +132 -0
- package/dist/memory/manager.js.map +1 -0
- package/dist/memory/sqlite.js +12 -1
- package/dist/memory/sqlite.js.map +1 -1
- package/dist/memory/types.d.ts +21 -0
- package/dist/memory/types.js +47 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/pi/opencandle-extension.d.ts +5 -1
- package/dist/pi/opencandle-extension.js +45 -142
- package/dist/pi/opencandle-extension.js.map +1 -1
- package/dist/pi/session.d.ts +2 -0
- package/dist/pi/session.js +1 -1
- package/dist/pi/session.js.map +1 -1
- package/dist/prompts/context-builder.d.ts +26 -0
- package/dist/prompts/context-builder.js +126 -0
- package/dist/prompts/context-builder.js.map +1 -0
- package/dist/prompts/sections.d.ts +13 -0
- package/dist/prompts/sections.js +35 -0
- package/dist/prompts/sections.js.map +1 -0
- package/dist/providers/alpha-vantage.d.ts +3 -0
- package/dist/providers/alpha-vantage.js +184 -76
- package/dist/providers/alpha-vantage.js.map +1 -1
- package/dist/providers/coingecko.js +53 -37
- package/dist/providers/coingecko.js.map +1 -1
- package/dist/providers/fear-greed.js +23 -15
- package/dist/providers/fear-greed.js.map +1 -1
- package/dist/providers/fred.js +35 -27
- package/dist/providers/fred.js.map +1 -1
- package/dist/providers/reddit.js +44 -36
- package/dist/providers/reddit.js.map +1 -1
- package/dist/providers/twitter.d.ts +20 -0
- package/dist/providers/twitter.js +143 -0
- package/dist/providers/twitter.js.map +1 -0
- package/dist/providers/with-fallback.d.ts +15 -0
- package/dist/providers/with-fallback.js +32 -0
- package/dist/providers/with-fallback.js.map +1 -0
- package/dist/providers/wrap-provider.d.ts +13 -0
- package/dist/providers/wrap-provider.js +43 -0
- package/dist/providers/wrap-provider.js.map +1 -0
- package/dist/providers/yahoo-finance.js +77 -57
- package/dist/providers/yahoo-finance.js.map +1 -1
- package/dist/runtime/evidence.d.ts +35 -0
- package/dist/runtime/evidence.js +29 -0
- package/dist/runtime/evidence.js.map +1 -0
- package/dist/runtime/index.d.ts +16 -0
- package/dist/runtime/index.js +10 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/prompt-step.d.ts +41 -0
- package/dist/runtime/prompt-step.js +42 -0
- package/dist/runtime/prompt-step.js.map +1 -0
- package/dist/runtime/provider-ids.d.ts +14 -0
- package/dist/runtime/provider-ids.js +14 -0
- package/dist/runtime/provider-ids.js.map +1 -0
- package/dist/runtime/provider-tracker.d.ts +20 -0
- package/dist/runtime/provider-tracker.js +36 -0
- package/dist/runtime/provider-tracker.js.map +1 -0
- package/dist/runtime/run-context.d.ts +11 -0
- package/dist/runtime/run-context.js +14 -0
- package/dist/runtime/run-context.js.map +1 -0
- package/dist/runtime/session-coordinator.d.ts +48 -0
- package/dist/runtime/session-coordinator.js +171 -0
- package/dist/runtime/session-coordinator.js.map +1 -0
- package/dist/runtime/validation.d.ts +44 -0
- package/dist/runtime/validation.js +157 -0
- package/dist/runtime/validation.js.map +1 -0
- package/dist/runtime/workflow-events.d.ts +21 -0
- package/dist/runtime/workflow-events.js +31 -0
- package/dist/runtime/workflow-events.js.map +1 -0
- package/dist/runtime/workflow-runner.d.ts +36 -0
- package/dist/runtime/workflow-runner.js +129 -0
- package/dist/runtime/workflow-runner.js.map +1 -0
- package/dist/runtime/workflow-types.d.ts +60 -0
- package/dist/runtime/workflow-types.js +32 -0
- package/dist/runtime/workflow-types.js.map +1 -0
- package/dist/system-prompt.js +52 -2
- package/dist/system-prompt.js.map +1 -1
- package/dist/tool-kit.d.ts +9 -5
- package/dist/tool-kit.js +29 -6
- package/dist/tool-kit.js.map +1 -1
- package/dist/tools/fundamentals/company-overview.js +13 -2
- package/dist/tools/fundamentals/company-overview.js.map +1 -1
- package/dist/tools/fundamentals/comps.js +15 -7
- package/dist/tools/fundamentals/comps.js.map +1 -1
- package/dist/tools/fundamentals/dcf.js +23 -5
- package/dist/tools/fundamentals/dcf.js.map +1 -1
- package/dist/tools/fundamentals/earnings.js +9 -1
- package/dist/tools/fundamentals/earnings.js.map +1 -1
- package/dist/tools/fundamentals/financials.js +9 -1
- package/dist/tools/fundamentals/financials.js.map +1 -1
- package/dist/tools/fundamentals/sec-filings.js +9 -1
- package/dist/tools/fundamentals/sec-filings.js.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/interaction/ask-user.d.ts +3 -0
- package/dist/tools/interaction/ask-user.js +87 -0
- package/dist/tools/interaction/ask-user.js.map +1 -0
- package/dist/tools/interaction/twitter-login.d.ts +8 -0
- package/dist/tools/interaction/twitter-login.js +77 -0
- package/dist/tools/interaction/twitter-login.js.map +1 -0
- package/dist/tools/macro/fear-greed.js +9 -1
- package/dist/tools/macro/fear-greed.js.map +1 -1
- package/dist/tools/macro/fred-data.js +13 -2
- package/dist/tools/macro/fred-data.js.map +1 -1
- package/dist/tools/market/crypto-history.js +9 -1
- package/dist/tools/market/crypto-history.js.map +1 -1
- package/dist/tools/market/crypto-price.js +9 -1
- package/dist/tools/market/crypto-price.js.map +1 -1
- package/dist/tools/market/stock-history.js +28 -1
- package/dist/tools/market/stock-history.js.map +1 -1
- package/dist/tools/market/stock-quote.js +29 -4
- package/dist/tools/market/stock-quote.js.map +1 -1
- package/dist/tools/options/option-chain.js +9 -1
- package/dist/tools/options/option-chain.js.map +1 -1
- package/dist/tools/portfolio/correlation.js +15 -3
- package/dist/tools/portfolio/correlation.js.map +1 -1
- package/dist/tools/portfolio/predictions.js +6 -5
- package/dist/tools/portfolio/predictions.js.map +1 -1
- package/dist/tools/portfolio/risk-analysis.js +9 -1
- package/dist/tools/portfolio/risk-analysis.js.map +1 -1
- package/dist/tools/portfolio/tracker.js +6 -3
- package/dist/tools/portfolio/tracker.js.map +1 -1
- package/dist/tools/portfolio/watchlist.js +6 -1
- package/dist/tools/portfolio/watchlist.js.map +1 -1
- package/dist/tools/sentiment/news-sentiment.js +8 -10
- package/dist/tools/sentiment/news-sentiment.js.map +1 -1
- package/dist/tools/sentiment/reddit-sentiment.js +9 -1
- package/dist/tools/sentiment/reddit-sentiment.js.map +1 -1
- package/dist/tools/sentiment/twitter-sentiment.d.ts +9 -0
- package/dist/tools/sentiment/twitter-sentiment.js +58 -0
- package/dist/tools/sentiment/twitter-sentiment.js.map +1 -0
- package/dist/tools/technical/backtest.js +9 -1
- package/dist/tools/technical/backtest.js.map +1 -1
- package/dist/tools/technical/indicators.js +9 -1
- package/dist/tools/technical/indicators.js.map +1 -1
- package/dist/types/index.d.ts +15 -0
- package/dist/types/sentiment.d.ts +20 -0
- package/dist/workflows/compare-assets.d.ts +3 -0
- package/dist/workflows/compare-assets.js +21 -5
- package/dist/workflows/compare-assets.js.map +1 -1
- package/dist/workflows/index.d.ts +3 -3
- package/dist/workflows/index.js +3 -3
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/options-screener.d.ts +3 -0
- package/dist/workflows/options-screener.js +24 -7
- package/dist/workflows/options-screener.js.map +1 -1
- package/dist/workflows/portfolio-builder.d.ts +3 -0
- package/dist/workflows/portfolio-builder.js +30 -9
- package/dist/workflows/portfolio-builder.js.map +1 -1
- package/package.json +9 -5
package/dist/infra/cache.d.ts
CHANGED
|
@@ -1,6 +1,28 @@
|
|
|
1
|
+
export interface StaleResult<T> {
|
|
2
|
+
value: T;
|
|
3
|
+
stale: true;
|
|
4
|
+
cachedAt: number;
|
|
5
|
+
}
|
|
1
6
|
export declare class Cache {
|
|
2
7
|
private store;
|
|
8
|
+
private lastStaleHit;
|
|
9
|
+
private lastStaleCachedAt;
|
|
3
10
|
get<T>(key: string): T | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Return an expired entry if it exists and is within the stale limit.
|
|
13
|
+
* Unlike get(), this does not require the entry to be within its TTL.
|
|
14
|
+
* Entries beyond the stale limit are deleted.
|
|
15
|
+
*/
|
|
16
|
+
getStale<T>(key: string, staleLimitMs: number): StaleResult<T> | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Consume the stale flag set by the last getStale() hit.
|
|
19
|
+
* Returns { stale: true, cachedAt } if the last getStale() found data,
|
|
20
|
+
* then resets the flag. Used by wrapProvider to propagate stale metadata.
|
|
21
|
+
*/
|
|
22
|
+
consumeStaleFlag(): {
|
|
23
|
+
stale: boolean;
|
|
24
|
+
cachedAt: number;
|
|
25
|
+
};
|
|
4
26
|
set<T>(key: string, value: T, ttlMs: number): void;
|
|
5
27
|
invalidate(pattern: string): void;
|
|
6
28
|
clear(): void;
|
|
@@ -16,3 +38,11 @@ export declare const TTL: {
|
|
|
16
38
|
readonly OPTIONS_CHAIN: 120000;
|
|
17
39
|
readonly CRUMB: 900000;
|
|
18
40
|
};
|
|
41
|
+
export declare const STALE_LIMIT: {
|
|
42
|
+
readonly QUOTE: number;
|
|
43
|
+
readonly HISTORY: number;
|
|
44
|
+
readonly FUNDAMENTALS: number;
|
|
45
|
+
readonly MACRO: number;
|
|
46
|
+
readonly SENTIMENT: 3600000;
|
|
47
|
+
readonly OPTIONS_CHAIN: number;
|
|
48
|
+
};
|
package/dist/infra/cache.js
CHANGED
|
@@ -1,17 +1,45 @@
|
|
|
1
1
|
export class Cache {
|
|
2
2
|
store = new Map();
|
|
3
|
+
lastStaleHit = false;
|
|
4
|
+
lastStaleCachedAt = 0;
|
|
3
5
|
get(key) {
|
|
4
6
|
const entry = this.store.get(key);
|
|
5
7
|
if (!entry)
|
|
6
8
|
return undefined;
|
|
7
|
-
if (Date.now() > entry.expiresAt)
|
|
9
|
+
if (Date.now() > entry.expiresAt)
|
|
10
|
+
return undefined;
|
|
11
|
+
return entry.value;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Return an expired entry if it exists and is within the stale limit.
|
|
15
|
+
* Unlike get(), this does not require the entry to be within its TTL.
|
|
16
|
+
* Entries beyond the stale limit are deleted.
|
|
17
|
+
*/
|
|
18
|
+
getStale(key, staleLimitMs) {
|
|
19
|
+
const entry = this.store.get(key);
|
|
20
|
+
if (!entry)
|
|
21
|
+
return undefined;
|
|
22
|
+
if (Date.now() > entry.cachedAt + staleLimitMs) {
|
|
8
23
|
this.store.delete(key);
|
|
9
24
|
return undefined;
|
|
10
25
|
}
|
|
11
|
-
|
|
26
|
+
this.lastStaleHit = true;
|
|
27
|
+
this.lastStaleCachedAt = entry.cachedAt;
|
|
28
|
+
return { value: entry.value, stale: true, cachedAt: entry.cachedAt };
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Consume the stale flag set by the last getStale() hit.
|
|
32
|
+
* Returns { stale: true, cachedAt } if the last getStale() found data,
|
|
33
|
+
* then resets the flag. Used by wrapProvider to propagate stale metadata.
|
|
34
|
+
*/
|
|
35
|
+
consumeStaleFlag() {
|
|
36
|
+
const result = { stale: this.lastStaleHit, cachedAt: this.lastStaleCachedAt };
|
|
37
|
+
this.lastStaleHit = false;
|
|
38
|
+
this.lastStaleCachedAt = 0;
|
|
39
|
+
return result;
|
|
12
40
|
}
|
|
13
41
|
set(key, value, ttlMs) {
|
|
14
|
-
this.store.set(key, { value, expiresAt: Date.now() + ttlMs });
|
|
42
|
+
this.store.set(key, { value, expiresAt: Date.now() + ttlMs, cachedAt: Date.now() });
|
|
15
43
|
}
|
|
16
44
|
invalidate(pattern) {
|
|
17
45
|
for (const key of this.store.keys()) {
|
|
@@ -39,4 +67,13 @@ export const TTL = {
|
|
|
39
67
|
OPTIONS_CHAIN: 120_000, // 2 minutes
|
|
40
68
|
CRUMB: 900_000, // 15 minutes
|
|
41
69
|
};
|
|
70
|
+
// Stale limits — how long past TTL expiry a cached value is still useful as fallback
|
|
71
|
+
export const STALE_LIMIT = {
|
|
72
|
+
QUOTE: 15 * 60_000, // 15 minutes
|
|
73
|
+
HISTORY: 24 * 3_600_000, // 24 hours
|
|
74
|
+
FUNDAMENTALS: 7 * 86_400_000, // 7 days
|
|
75
|
+
MACRO: 24 * 3_600_000, // 24 hours
|
|
76
|
+
SENTIMENT: 3_600_000, // 1 hour
|
|
77
|
+
OPTIONS_CHAIN: 30 * 60_000, // 30 minutes
|
|
78
|
+
};
|
|
42
79
|
//# sourceMappingURL=cache.js.map
|
package/dist/infra/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/infra/cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/infra/cache.ts"],"names":[],"mappings":"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"}
|
package/dist/infra/index.d.ts
CHANGED
|
@@ -2,4 +2,4 @@ export { Cache, cache, TTL } from "./cache.js";
|
|
|
2
2
|
export { RateLimiter, rateLimiter } from "./rate-limiter.js";
|
|
3
3
|
export { httpGet, HttpError, type HttpClientOptions } from "./http-client.js";
|
|
4
4
|
export { StealthBrowser } from "./browser.js";
|
|
5
|
-
export { getOpenCandleHomeDir, ensureOpenCandleHomeDir, resolveOpenCandlePath, ensureParentDir, getWatchlistPath, getPortfolioPath, getPredictionsPath, getConfigPath, getOnboardingPath, getStateDbPath, getLogsDir, } from "./opencandle-paths.js";
|
|
5
|
+
export { getOpenCandleHomeDir, ensureOpenCandleHomeDir, resolveOpenCandlePath, ensureParentDir, getWatchlistPath, getPortfolioPath, getPredictionsPath, getConfigPath, getOnboardingPath, getStateDbPath, getLogsDir, getBrowserProfileDir, } from "./opencandle-paths.js";
|
package/dist/infra/index.js
CHANGED
|
@@ -2,5 +2,5 @@ export { Cache, cache, TTL } from "./cache.js";
|
|
|
2
2
|
export { RateLimiter, rateLimiter } from "./rate-limiter.js";
|
|
3
3
|
export { httpGet, HttpError } from "./http-client.js";
|
|
4
4
|
export { StealthBrowser } from "./browser.js";
|
|
5
|
-
export { getOpenCandleHomeDir, ensureOpenCandleHomeDir, resolveOpenCandlePath, ensureParentDir, getWatchlistPath, getPortfolioPath, getPredictionsPath, getConfigPath, getOnboardingPath, getStateDbPath, getLogsDir, } from "./opencandle-paths.js";
|
|
5
|
+
export { getOpenCandleHomeDir, ensureOpenCandleHomeDir, resolveOpenCandlePath, ensureParentDir, getWatchlistPath, getPortfolioPath, getPredictionsPath, getConfigPath, getOnboardingPath, getStateDbPath, getLogsDir, getBrowserProfileDir, } from "./opencandle-paths.js";
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
package/dist/infra/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/infra/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,SAAS,EAA0B,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/infra/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,SAAS,EAA0B,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,oBAAoB,GACrB,MAAM,uBAAuB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencandle-paths.js","sourceRoot":"","sources":["../../src/infra/opencandle-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAE9C,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAClD,OAAO,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,SAAS,CAAC,IAAI,CAAC,CAAC;IAChB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAG,QAAkB;IACzD,OAAO,IAAI,CAAC,oBAAoB,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,SAAS,CAAC,MAAM,CAAC,CAAC;IAClB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,qBAAqB,CAAC,aAAa,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,qBAAqB,CAAC,UAAU,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC"}
|
|
1
|
+
{"version":3,"file":"opencandle-paths.js","sourceRoot":"","sources":["../../src/infra/opencandle-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAE9C,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAClD,OAAO,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,SAAS,CAAC,IAAI,CAAC,CAAC;IAChB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAG,QAAkB;IACzD,OAAO,IAAI,CAAC,oBAAoB,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,SAAS,CAAC,MAAM,CAAC,CAAC;IAClB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,qBAAqB,CAAC,aAAa,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,qBAAqB,CAAC,UAAU,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -35,4 +35,5 @@ rateLimiter.configure("yahoo", 5, 5); // 5 req/s
|
|
|
35
35
|
rateLimiter.configure("coingecko", 10, 0.167); // 10 req/min
|
|
36
36
|
rateLimiter.configure("alphavantage", 5, 0.083); // 5 req/min (free tier)
|
|
37
37
|
rateLimiter.configure("fred", 120, 2); // 120 req/min
|
|
38
|
+
rateLimiter.configure("twitter", 5, 0.167); // 5 req, ~10 req/min
|
|
38
39
|
//# sourceMappingURL=rate-limiter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/infra/rate-limiter.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,WAAW;IACd,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE5C,SAAS,CAAC,QAAgB,EAAE,SAAiB,EAAE,UAAkB;QAC/D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;YACzB,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,MAAM,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;SAClC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAgB;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,sBAAsB;QAE3C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEpB,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QAED,kCAAkC;QAClC,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QACvE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IACrB,CAAC;IAEO,MAAM,CAAC,MAAc;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QACjD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACtB,MAAM,CAAC,MAAM,CAAC,SAAS,EACvB,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CACnD,CAAC;QACF,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;IAC1B,CAAC;CACF;AAED,+CAA+C;AAC/C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAC7C,WAAW,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAW,UAAU;AAC1D,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAE,aAAa;AAC7D,WAAW,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,wBAAwB;AACzE,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAW,cAAc"}
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/infra/rate-limiter.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,WAAW;IACd,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE5C,SAAS,CAAC,QAAgB,EAAE,SAAiB,EAAE,UAAkB;QAC/D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;YACzB,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,MAAM,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;SAClC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAgB;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,sBAAsB;QAE3C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEpB,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QAED,kCAAkC;QAClC,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QACvE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IACrB,CAAC;IAEO,MAAM,CAAC,MAAc;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QACjD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACtB,MAAM,CAAC,MAAM,CAAC,SAAS,EACvB,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CACnD,CAAC;QACF,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;IAC1B,CAAC;CACF;AAED,+CAA+C;AAC/C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAC7C,WAAW,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAW,UAAU;AAC1D,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAE,aAAa;AAC7D,WAAW,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,wBAAwB;AACzE,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAW,cAAc;AAC/D,WAAW,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAM,qBAAqB"}
|
package/dist/memory/index.d.ts
CHANGED
|
@@ -3,3 +3,6 @@ export { MemoryStorage } from "./storage.js";
|
|
|
3
3
|
export type { WorkflowPreferences } from "./storage.js";
|
|
4
4
|
export { buildMemoryContext } from "./retrieval.js";
|
|
5
5
|
export { extractPreferences } from "./preference-extractor.js";
|
|
6
|
+
export { MemoryManager } from "./manager.js";
|
|
7
|
+
export type { MemoryCategory, MemoryEntry } from "./types.js";
|
|
8
|
+
export { isStale, STALENESS_THRESHOLDS, NEVER_TRUST_FROM_MEMORY } from "./types.js";
|
package/dist/memory/index.js
CHANGED
|
@@ -2,4 +2,6 @@ export { initDatabase, initDefaultDatabase, getTableNames, getSchemaVersion } fr
|
|
|
2
2
|
export { MemoryStorage } from "./storage.js";
|
|
3
3
|
export { buildMemoryContext } from "./retrieval.js";
|
|
4
4
|
export { extractPreferences } from "./preference-extractor.js";
|
|
5
|
+
export { MemoryManager } from "./manager.js";
|
|
6
|
+
export { isStale, STALENESS_THRESHOLDS, NEVER_TRUST_FROM_MEMORY } from "./types.js";
|
|
5
7
|
//# sourceMappingURL=index.js.map
|
package/dist/memory/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { MemoryStorage } from "./storage.js";
|
|
2
|
+
import type { MemoryEntry } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Selective, typed memory retrieval with staleness rules
|
|
5
|
+
* and override suppression.
|
|
6
|
+
*/
|
|
7
|
+
export declare class MemoryManager {
|
|
8
|
+
private readonly storage;
|
|
9
|
+
constructor(storage: MemoryStorage);
|
|
10
|
+
/**
|
|
11
|
+
* Retrieve memory entries relevant to the given workflow type,
|
|
12
|
+
* filtering by category, staleness, and overrides.
|
|
13
|
+
*/
|
|
14
|
+
retrieve(workflowType: string, overriddenSlots?: string[], now?: Date): MemoryEntry[];
|
|
15
|
+
/**
|
|
16
|
+
* Build compact text context from retrieved memory entries.
|
|
17
|
+
*/
|
|
18
|
+
buildContext(workflowType: string, overriddenSlots?: string[], now?: Date): string;
|
|
19
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { KEY_TO_CATEGORY, WORKFLOW_RELEVANT_CATEGORIES, NEVER_TRUST_FROM_MEMORY, isStale, } from "./types.js";
|
|
2
|
+
/** Slot name → preference key(s) mapping for suppression. */
|
|
3
|
+
const SLOT_TO_PREF_KEYS = {
|
|
4
|
+
riskProfile: ["risk_profile"],
|
|
5
|
+
assetScope: ["asset_scope"],
|
|
6
|
+
timeHorizon: ["time_horizon"],
|
|
7
|
+
dteTarget: ["dte_target"],
|
|
8
|
+
moneynessPreference: ["moneyness_preference"],
|
|
9
|
+
liquidityMinimum: ["liquidity_minimum", "options_liquidity"],
|
|
10
|
+
};
|
|
11
|
+
const MAX_WORKFLOW_HISTORY_PER_TYPE = 3;
|
|
12
|
+
const MAX_PREFERENCE_LINES = 15;
|
|
13
|
+
/**
|
|
14
|
+
* Selective, typed memory retrieval with staleness rules
|
|
15
|
+
* and override suppression.
|
|
16
|
+
*/
|
|
17
|
+
export class MemoryManager {
|
|
18
|
+
storage;
|
|
19
|
+
constructor(storage) {
|
|
20
|
+
this.storage = storage;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Retrieve memory entries relevant to the given workflow type,
|
|
24
|
+
* filtering by category, staleness, and overrides.
|
|
25
|
+
*/
|
|
26
|
+
retrieve(workflowType, overriddenSlots, now = new Date()) {
|
|
27
|
+
const relevantCategories = WORKFLOW_RELEVANT_CATEGORIES[workflowType] ??
|
|
28
|
+
WORKFLOW_RELEVANT_CATEGORIES["unclassified"];
|
|
29
|
+
// Build set of preference keys to suppress
|
|
30
|
+
const suppressedKeys = new Set();
|
|
31
|
+
if (overriddenSlots) {
|
|
32
|
+
for (const slot of overriddenSlots) {
|
|
33
|
+
const keys = SLOT_TO_PREF_KEYS[slot];
|
|
34
|
+
if (keys)
|
|
35
|
+
keys.forEach((k) => suppressedKeys.add(k));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const entries = [];
|
|
39
|
+
// Preferences as investor_profile entries
|
|
40
|
+
if (relevantCategories.includes("investor_profile")) {
|
|
41
|
+
const prefs = this.storage.getPreferencesByNamespace("global");
|
|
42
|
+
for (const pref of prefs) {
|
|
43
|
+
const key = String(pref.key);
|
|
44
|
+
if (suppressedKeys.has(key))
|
|
45
|
+
continue;
|
|
46
|
+
if (NEVER_TRUST_FROM_MEMORY.has(key))
|
|
47
|
+
continue;
|
|
48
|
+
const category = KEY_TO_CATEGORY[key] ?? "investor_profile";
|
|
49
|
+
if (!relevantCategories.includes(category))
|
|
50
|
+
continue;
|
|
51
|
+
const entry = {
|
|
52
|
+
key,
|
|
53
|
+
value: tryParseValue(String(pref.value_json ?? "")),
|
|
54
|
+
category,
|
|
55
|
+
recordedAt: String(pref.updated_at ?? pref.created_at ?? now.toISOString()),
|
|
56
|
+
confidence: pref.confidence != null ? String(pref.confidence) : undefined,
|
|
57
|
+
source: pref.source != null ? String(pref.source) : undefined,
|
|
58
|
+
};
|
|
59
|
+
if (!isStale(entry, now)) {
|
|
60
|
+
entries.push(entry);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Workflow history
|
|
65
|
+
if (relevantCategories.includes("workflow_history")) {
|
|
66
|
+
const runs = this.storage.getRecentWorkflowRuns(MAX_WORKFLOW_HISTORY_PER_TYPE * 4);
|
|
67
|
+
const countsByType = new Map();
|
|
68
|
+
for (const run of runs) {
|
|
69
|
+
const wfType = String(run.workflow_type);
|
|
70
|
+
const count = countsByType.get(wfType) ?? 0;
|
|
71
|
+
if (count >= MAX_WORKFLOW_HISTORY_PER_TYPE)
|
|
72
|
+
continue;
|
|
73
|
+
countsByType.set(wfType, count + 1);
|
|
74
|
+
const recordedAt = String(run.created_at ?? now.toISOString());
|
|
75
|
+
const entry = {
|
|
76
|
+
key: `workflow_run_${run.id}`,
|
|
77
|
+
value: run.output_summary
|
|
78
|
+
? `${wfType}: ${run.output_summary}`
|
|
79
|
+
: wfType,
|
|
80
|
+
category: "workflow_history",
|
|
81
|
+
recordedAt,
|
|
82
|
+
};
|
|
83
|
+
if (!isStale(entry, now)) {
|
|
84
|
+
entries.push(entry);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return entries.slice(0, MAX_PREFERENCE_LINES + MAX_WORKFLOW_HISTORY_PER_TYPE * 4);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Build compact text context from retrieved memory entries.
|
|
92
|
+
*/
|
|
93
|
+
buildContext(workflowType, overriddenSlots, now = new Date()) {
|
|
94
|
+
const entries = this.retrieve(workflowType, overriddenSlots, now);
|
|
95
|
+
if (entries.length === 0)
|
|
96
|
+
return "";
|
|
97
|
+
const sections = [];
|
|
98
|
+
// Group by category
|
|
99
|
+
const byCategory = new Map();
|
|
100
|
+
for (const entry of entries) {
|
|
101
|
+
const list = byCategory.get(entry.category) ?? [];
|
|
102
|
+
list.push(entry);
|
|
103
|
+
byCategory.set(entry.category, list);
|
|
104
|
+
}
|
|
105
|
+
const profileEntries = byCategory.get("investor_profile");
|
|
106
|
+
if (profileEntries && profileEntries.length > 0) {
|
|
107
|
+
const lines = profileEntries.map((e) => `- ${e.key}: ${e.value}`);
|
|
108
|
+
sections.push("User Preferences:\n" + lines.join("\n"));
|
|
109
|
+
}
|
|
110
|
+
const historyEntries = byCategory.get("workflow_history");
|
|
111
|
+
if (historyEntries && historyEntries.length > 0) {
|
|
112
|
+
const lines = historyEntries.map((e) => `- ${e.value} (${e.recordedAt})`);
|
|
113
|
+
sections.push("Recent Workflows:\n" + lines.join("\n"));
|
|
114
|
+
}
|
|
115
|
+
const feedbackEntries = byCategory.get("interaction_feedback");
|
|
116
|
+
if (feedbackEntries && feedbackEntries.length > 0) {
|
|
117
|
+
const lines = feedbackEntries.map((e) => `- ${e.key}: ${e.value}`);
|
|
118
|
+
sections.push("Feedback:\n" + lines.join("\n"));
|
|
119
|
+
}
|
|
120
|
+
return sections.join("\n\n");
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function tryParseValue(json) {
|
|
124
|
+
try {
|
|
125
|
+
const parsed = JSON.parse(json);
|
|
126
|
+
return typeof parsed === "string" ? parsed : JSON.stringify(parsed);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return json;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/memory/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/memory/sqlite.js
CHANGED
|
@@ -2,7 +2,7 @@ import { mkdirSync } from "node:fs";
|
|
|
2
2
|
import { dirname } from "node:path";
|
|
3
3
|
import Database from "better-sqlite3";
|
|
4
4
|
import { getStateDbPath } from "../infra/opencandle-paths.js";
|
|
5
|
-
const CURRENT_SCHEMA_VERSION =
|
|
5
|
+
const CURRENT_SCHEMA_VERSION = 2;
|
|
6
6
|
const CURRENT_SCHEMA = `
|
|
7
7
|
CREATE TABLE IF NOT EXISTS schema_version (
|
|
8
8
|
version INTEGER NOT NULL
|
|
@@ -40,6 +40,17 @@ const CURRENT_SCHEMA = `
|
|
|
40
40
|
created_at TEXT NOT NULL,
|
|
41
41
|
FOREIGN KEY (workflow_run_id) REFERENCES workflow_runs(id)
|
|
42
42
|
);
|
|
43
|
+
|
|
44
|
+
CREATE TABLE IF NOT EXISTS workflow_events (
|
|
45
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
46
|
+
run_id TEXT NOT NULL,
|
|
47
|
+
step_index INTEGER NOT NULL,
|
|
48
|
+
event_type TEXT NOT NULL,
|
|
49
|
+
payload_json TEXT,
|
|
50
|
+
timestamp TEXT NOT NULL
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_workflow_events_run_id ON workflow_events(run_id);
|
|
43
54
|
`;
|
|
44
55
|
export function initDatabase(path) {
|
|
45
56
|
if (path !== ":memory:") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/memory/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC,MAAM,cAAc,GAAG
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/memory/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDtB,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAExB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAqB;IAChD,MAAM,cAAc,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,cAAc,KAAK,sBAAsB,EAAE,CAAC;QAC9C,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAqB;IAC9C,MAAM,KAAK,GAAG,EAAE;SACb,OAAO,CAAC,iFAAiF,CAAC;SAC1F,GAAG,EAAkC,CAAC;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,EAE3D,CAAC;IACd,OAAO,GAAG,EAAE,OAAO,IAAI,IAAI,CAAC;AAC9B,CAAC;AAED,SAAS,WAAW,CAAC,EAAqB;IACxC,EAAE,CAAC,IAAI,CAAC;;;;;GAKP,CAAC,CAAC;IACH,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxB,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAqB;IACjD,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,iEAAiE,CAAC;SAC1E,GAAG,EAA6B,CAAC;IACpC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAqB;IACpD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,EAE3D,CAAC;IACd,OAAO,GAAG,EAAE,OAAO,IAAI,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Memory categories for typed, selective retrieval. */
|
|
2
|
+
export type MemoryCategory = "investor_profile" | "interaction_feedback" | "workflow_history" | "references";
|
|
3
|
+
/** A memory entry with category and freshness metadata. */
|
|
4
|
+
export interface MemoryEntry {
|
|
5
|
+
key: string;
|
|
6
|
+
value: string;
|
|
7
|
+
category: MemoryCategory;
|
|
8
|
+
recordedAt: string;
|
|
9
|
+
confidence?: string;
|
|
10
|
+
source?: string;
|
|
11
|
+
}
|
|
12
|
+
/** Staleness thresholds in milliseconds per category. */
|
|
13
|
+
export declare const STALENESS_THRESHOLDS: Record<MemoryCategory, number>;
|
|
14
|
+
/** Map preference keys to memory categories. */
|
|
15
|
+
export declare const KEY_TO_CATEGORY: Record<string, MemoryCategory>;
|
|
16
|
+
/** Categories relevant to each workflow type. */
|
|
17
|
+
export declare const WORKFLOW_RELEVANT_CATEGORIES: Record<string, MemoryCategory[]>;
|
|
18
|
+
/** Check whether a memory entry is stale. */
|
|
19
|
+
export declare function isStale(entry: MemoryEntry, now?: Date): boolean;
|
|
20
|
+
/** Keys whose values are market-sensitive and must never be trusted from memory. */
|
|
21
|
+
export declare const NEVER_TRUST_FROM_MEMORY: Set<string>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/** Staleness thresholds in milliseconds per category. */
|
|
2
|
+
export const STALENESS_THRESHOLDS = {
|
|
3
|
+
investor_profile: 90 * 24 * 60 * 60 * 1000, // 90 days
|
|
4
|
+
interaction_feedback: 14 * 24 * 60 * 60 * 1000, // 14 days
|
|
5
|
+
workflow_history: 7 * 24 * 60 * 60 * 1000, // 7 days
|
|
6
|
+
references: 30 * 24 * 60 * 60 * 1000, // 30 days
|
|
7
|
+
};
|
|
8
|
+
/** Map preference keys to memory categories. */
|
|
9
|
+
export const KEY_TO_CATEGORY = {
|
|
10
|
+
risk_profile: "investor_profile",
|
|
11
|
+
time_horizon: "investor_profile",
|
|
12
|
+
asset_scope: "investor_profile",
|
|
13
|
+
position_count: "investor_profile",
|
|
14
|
+
max_single_position_pct: "investor_profile",
|
|
15
|
+
account_type: "investor_profile",
|
|
16
|
+
income_vs_growth: "investor_profile",
|
|
17
|
+
dte_target: "investor_profile",
|
|
18
|
+
objective: "investor_profile",
|
|
19
|
+
moneyness_preference: "investor_profile",
|
|
20
|
+
liquidity_minimum: "investor_profile",
|
|
21
|
+
};
|
|
22
|
+
/** Categories relevant to each workflow type. */
|
|
23
|
+
export const WORKFLOW_RELEVANT_CATEGORIES = {
|
|
24
|
+
portfolio_builder: ["investor_profile", "interaction_feedback", "workflow_history"],
|
|
25
|
+
options_screener: ["investor_profile", "interaction_feedback", "workflow_history"],
|
|
26
|
+
compare_assets: ["investor_profile", "workflow_history"],
|
|
27
|
+
comprehensive_analysis: ["investor_profile", "workflow_history"],
|
|
28
|
+
single_asset_analysis: ["investor_profile"],
|
|
29
|
+
general_finance_qa: ["investor_profile"],
|
|
30
|
+
unclassified: ["investor_profile"],
|
|
31
|
+
};
|
|
32
|
+
/** Check whether a memory entry is stale. */
|
|
33
|
+
export function isStale(entry, now = new Date()) {
|
|
34
|
+
const threshold = STALENESS_THRESHOLDS[entry.category];
|
|
35
|
+
const age = now.getTime() - new Date(entry.recordedAt).getTime();
|
|
36
|
+
return age > threshold;
|
|
37
|
+
}
|
|
38
|
+
/** Keys whose values are market-sensitive and must never be trusted from memory. */
|
|
39
|
+
export const NEVER_TRUST_FROM_MEMORY = new Set([
|
|
40
|
+
"stock_price",
|
|
41
|
+
"crypto_price",
|
|
42
|
+
"market_thesis",
|
|
43
|
+
"target_price",
|
|
44
|
+
"entry_price",
|
|
45
|
+
"stop_loss",
|
|
46
|
+
]);
|
|
47
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAiBA,yDAAyD;AACzD,MAAM,CAAC,MAAM,oBAAoB,GAAmC;IAClE,gBAAgB,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAK,UAAU;IACzD,oBAAoB,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,UAAU;IAC1D,gBAAgB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAO,SAAS;IACzD,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAY,UAAU;CAC3D,CAAC;AAEF,gDAAgD;AAChD,MAAM,CAAC,MAAM,eAAe,GAAmC;IAC7D,YAAY,EAAE,kBAAkB;IAChC,YAAY,EAAE,kBAAkB;IAChC,WAAW,EAAE,kBAAkB;IAC/B,cAAc,EAAE,kBAAkB;IAClC,uBAAuB,EAAE,kBAAkB;IAC3C,YAAY,EAAE,kBAAkB;IAChC,gBAAgB,EAAE,kBAAkB;IACpC,UAAU,EAAE,kBAAkB;IAC9B,SAAS,EAAE,kBAAkB;IAC7B,oBAAoB,EAAE,kBAAkB;IACxC,iBAAiB,EAAE,kBAAkB;CACtC,CAAC;AAEF,iDAAiD;AACjD,MAAM,CAAC,MAAM,4BAA4B,GAAqC;IAC5E,iBAAiB,EAAE,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,kBAAkB,CAAC;IACnF,gBAAgB,EAAE,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,kBAAkB,CAAC;IAClF,cAAc,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IACxD,sBAAsB,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAChE,qBAAqB,EAAE,CAAC,kBAAkB,CAAC;IAC3C,kBAAkB,EAAE,CAAC,kBAAkB,CAAC;IACxC,YAAY,EAAE,CAAC,kBAAkB,CAAC;CACnC,CAAC;AAEF,6CAA6C;AAC7C,MAAM,UAAU,OAAO,CAAC,KAAkB,EAAE,MAAY,IAAI,IAAI,EAAE;IAChE,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;IACjE,OAAO,GAAG,GAAG,SAAS,CAAC;AACzB,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IAC7C,aAAa;IACb,cAAc;IACd,eAAe;IACf,cAAc;IACd,aAAa;IACb,WAAW;CACZ,CAAC,CAAC"}
|
|
@@ -1,2 +1,6 @@
|
|
|
1
1
|
import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
|
|
2
|
-
|
|
2
|
+
import type { AskUserHandler } from "../types/index.js";
|
|
3
|
+
export interface OpenCandleExtensionOptions {
|
|
4
|
+
askUserHandler?: AskUserHandler;
|
|
5
|
+
}
|
|
6
|
+
export default function openCandleExtension(pi: ExtensionAPI, options?: OpenCandleExtensionOptions): void;
|