@metamask-previews/ai-controllers 0.1.0-preview-93519965c → 0.1.0-preview-62fe3fa64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +0 -9
- package/dist/AiDigestController.cjs +0 -38
- package/dist/AiDigestController.cjs.map +1 -1
- package/dist/AiDigestController.d.cts +2 -13
- package/dist/AiDigestController.d.cts.map +1 -1
- package/dist/AiDigestController.d.mts +2 -13
- package/dist/AiDigestController.d.mts.map +1 -1
- package/dist/AiDigestController.mjs +0 -38
- package/dist/AiDigestController.mjs.map +1 -1
- package/dist/AiDigestService.cjs +15 -69
- package/dist/AiDigestService.cjs.map +1 -1
- package/dist/AiDigestService.d.cts +2 -10
- package/dist/AiDigestService.d.cts.map +1 -1
- package/dist/AiDigestService.d.mts +2 -10
- package/dist/AiDigestService.d.mts.map +1 -1
- package/dist/AiDigestService.mjs +16 -70
- package/dist/AiDigestService.mjs.map +1 -1
- package/dist/ai-digest-types.cjs.map +1 -1
- package/dist/ai-digest-types.d.cts +22 -67
- package/dist/ai-digest-types.d.cts.map +1 -1
- package/dist/ai-digest-types.d.mts +22 -67
- package/dist/ai-digest-types.d.mts.map +1 -1
- package/dist/ai-digest-types.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,18 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
-
### Added
|
|
11
|
-
|
|
12
|
-
- Add `fetchMarketOverview` method to `AiDigestService`, with superstruct validation of the `MarketOverview` response shape ([#8109](https://github.com/MetaMask/core/pull/8109)).
|
|
13
|
-
- Export new shared sub-types `Article`, `Tweet`, `Source`, `AIResponseMetadata`, `MarketOverview`, `MarketOverviewEntry`, `MarketOverviewTrend`, and `AiDigestControllerFetchMarketOverviewAction` ([#8109](https://github.com/MetaMask/core/pull/8109)).
|
|
14
|
-
|
|
15
10
|
### Changed
|
|
16
11
|
|
|
17
12
|
- Strengthen `AiDigestService` response validation using nested `superstruct` schemas for market insights payloads, including deep validation of `trends`/`sources` items and support for optional top-level `social` entries while allowing additional unknown API fields for forward compatibility ([#8006](https://github.com/MetaMask/core/pull/8006)).
|
|
18
|
-
- Rename shared sub-types `MarketInsightsArticle`, `MarketInsightsTweet`, and `MarketInsightsSource` to `Article`, `Tweet`, and `Source`; original names are kept as type aliases for backward compatibility ([#8109](https://github.com/MetaMask/core/pull/8109)).
|
|
19
|
-
- Tighten `MarketInsightsTrend.category` and `MarketInsightsTrend.impact` to closed string unions matching the API spec; `Source.type` is also now a closed union (`'news' | 'data' | 'social'`) ([#8109](https://github.com/MetaMask/core/pull/8109)).
|
|
20
|
-
- Update `searchDigest` endpoint from `/digests` to `/asset-summary` ([#8109](https://github.com/MetaMask/core/pull/8109)).
|
|
21
|
-
- Add optional `metadata` field to `MarketInsightsReport` ([#8109](https://github.com/MetaMask/core/pull/8109)).
|
|
22
13
|
|
|
23
14
|
## [0.1.0]
|
|
24
15
|
|
|
@@ -19,7 +19,6 @@ const ai_digest_constants_1 = require("./ai-digest-constants.cjs");
|
|
|
19
19
|
function getDefaultAiDigestControllerState() {
|
|
20
20
|
return {
|
|
21
21
|
marketInsights: {},
|
|
22
|
-
marketOverview: null,
|
|
23
22
|
};
|
|
24
23
|
}
|
|
25
24
|
exports.getDefaultAiDigestControllerState = getDefaultAiDigestControllerState;
|
|
@@ -30,12 +29,6 @@ const aiDigestControllerMetadata = {
|
|
|
30
29
|
includeInStateLogs: true,
|
|
31
30
|
usedInUi: true,
|
|
32
31
|
},
|
|
33
|
-
marketOverview: {
|
|
34
|
-
persist: true,
|
|
35
|
-
includeInDebugSnapshot: true,
|
|
36
|
-
includeInStateLogs: true,
|
|
37
|
-
usedInUi: true,
|
|
38
|
-
},
|
|
39
32
|
};
|
|
40
33
|
class AiDigestController extends base_controller_1.BaseController {
|
|
41
34
|
constructor({ messenger, state, digestService }) {
|
|
@@ -90,41 +83,10 @@ class AiDigestController extends base_controller_1.BaseController {
|
|
|
90
83
|
});
|
|
91
84
|
return data;
|
|
92
85
|
}
|
|
93
|
-
/**
|
|
94
|
-
* Fetches the market overview report.
|
|
95
|
-
* Returns cached data if still fresh, otherwise calls the service.
|
|
96
|
-
*
|
|
97
|
-
* @returns The market overview report, or `null` if none exists.
|
|
98
|
-
*/
|
|
99
|
-
async fetchMarketOverview() {
|
|
100
|
-
const existing = this.state.marketOverview;
|
|
101
|
-
if (existing) {
|
|
102
|
-
const age = Date.now() - existing.fetchedAt;
|
|
103
|
-
if (age < ai_digest_constants_1.CACHE_DURATION_MS) {
|
|
104
|
-
return existing.data;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
const data = await __classPrivateFieldGet(this, _AiDigestController_digestService, "f").fetchMarketOverview();
|
|
108
|
-
if (data === null) {
|
|
109
|
-
this.update((state) => {
|
|
110
|
-
state.marketOverview = null;
|
|
111
|
-
});
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
const entry = {
|
|
115
|
-
fetchedAt: Date.now(),
|
|
116
|
-
data,
|
|
117
|
-
};
|
|
118
|
-
this.update((state) => {
|
|
119
|
-
state.marketOverview = entry;
|
|
120
|
-
});
|
|
121
|
-
return data;
|
|
122
|
-
}
|
|
123
86
|
}
|
|
124
87
|
exports.AiDigestController = AiDigestController;
|
|
125
88
|
_AiDigestController_digestService = new WeakMap(), _AiDigestController_instances = new WeakSet(), _AiDigestController_registerMessageHandlers = function _AiDigestController_registerMessageHandlers() {
|
|
126
89
|
this.messenger.registerActionHandler(`${ai_digest_constants_1.controllerName}:fetchMarketInsights`, this.fetchMarketInsights.bind(this));
|
|
127
|
-
this.messenger.registerActionHandler(`${ai_digest_constants_1.controllerName}:fetchMarketOverview`, this.fetchMarketOverview.bind(this));
|
|
128
90
|
}, _AiDigestController_evictStaleCachedEntries = function _AiDigestController_evictStaleCachedEntries(cache) {
|
|
129
91
|
const now = Date.now();
|
|
130
92
|
const entries = Object.entries(cache);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiDigestController.cjs","sourceRoot":"","sources":["../src/AiDigestController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n StateMetadata,\n ControllerStateChangeEvent,\n ControllerGetStateAction,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport { isCaipAssetType } from '@metamask/utils';\n\nimport {\n AiDigestControllerErrorMessage,\n controllerName,\n CACHE_DURATION_MS,\n MAX_CACHE_ENTRIES,\n} from './ai-digest-constants';\nimport type {\n AiDigestControllerState,\n DigestService,\n MarketInsightsReport,\n MarketInsightsEntry,\n MarketOverview,\n MarketOverviewEntry,\n} from './ai-digest-types';\n\nexport type AiDigestControllerFetchMarketInsightsAction = {\n type: `${typeof controllerName}:fetchMarketInsights`;\n handler: AiDigestController['fetchMarketInsights'];\n};\n\nexport type AiDigestControllerFetchMarketOverviewAction = {\n type: `${typeof controllerName}:fetchMarketOverview`;\n handler: AiDigestController['fetchMarketOverview'];\n};\n\nexport type AiDigestControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AiDigestControllerState\n>;\n\nexport type AiDigestControllerActions =\n | AiDigestControllerFetchMarketInsightsAction\n | AiDigestControllerFetchMarketOverviewAction\n | AiDigestControllerGetStateAction;\n\nexport type AiDigestControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AiDigestControllerState\n>;\n\nexport type AiDigestControllerEvents = AiDigestControllerStateChangeEvent;\n\nexport type AiDigestControllerMessenger = Messenger<\n typeof controllerName,\n AiDigestControllerActions,\n AiDigestControllerEvents\n>;\n\nexport type AiDigestControllerOptions = {\n messenger: AiDigestControllerMessenger;\n state?: Partial<AiDigestControllerState>;\n digestService: DigestService;\n};\n\nexport function getDefaultAiDigestControllerState(): AiDigestControllerState {\n return {\n marketInsights: {},\n marketOverview: null,\n };\n}\n\nconst aiDigestControllerMetadata: StateMetadata<AiDigestControllerState> = {\n marketInsights: {\n persist: true,\n includeInDebugSnapshot: true,\n includeInStateLogs: true,\n usedInUi: true,\n },\n marketOverview: {\n persist: true,\n includeInDebugSnapshot: true,\n includeInStateLogs: true,\n usedInUi: true,\n },\n};\n\nexport class AiDigestController extends BaseController<\n typeof controllerName,\n AiDigestControllerState,\n AiDigestControllerMessenger\n> {\n readonly #digestService: DigestService;\n\n constructor({ messenger, state, digestService }: AiDigestControllerOptions) {\n super({\n name: controllerName,\n metadata: aiDigestControllerMetadata,\n state: {\n ...getDefaultAiDigestControllerState(),\n ...state,\n },\n messenger,\n });\n\n this.#digestService = digestService;\n this.#registerMessageHandlers();\n }\n\n #registerMessageHandlers(): void {\n this.messenger.registerActionHandler(\n `${controllerName}:fetchMarketInsights`,\n this.fetchMarketInsights.bind(this),\n );\n this.messenger.registerActionHandler(\n `${controllerName}:fetchMarketOverview`,\n this.fetchMarketOverview.bind(this),\n );\n }\n\n /**\n * Fetches market insights for a given CAIP-19 asset identifier.\n * Returns cached data if still fresh, otherwise calls the service.\n *\n * @param caip19Id - The CAIP-19 identifier of the asset.\n * @returns The market insights report, or `null` if none exists.\n */\n async fetchMarketInsights(\n caip19Id: string,\n ): Promise<MarketInsightsReport | null> {\n if (!isCaipAssetType(caip19Id)) {\n throw new Error(AiDigestControllerErrorMessage.INVALID_CAIP_ASSET_TYPE);\n }\n\n const existing = this.state.marketInsights[caip19Id];\n if (existing) {\n const age = Date.now() - existing.fetchedAt;\n if (age < CACHE_DURATION_MS) {\n return existing.data;\n }\n }\n\n const data = await this.#digestService.searchDigest(caip19Id);\n\n if (data === null) {\n // No insights available for this asset — clear any stale cache entry\n this.update((state) => {\n delete state.marketInsights[caip19Id];\n });\n return null;\n }\n\n const entry: MarketInsightsEntry = {\n caip19Id,\n fetchedAt: Date.now(),\n data,\n };\n\n this.update((state) => {\n state.marketInsights[caip19Id] = entry;\n this.#evictStaleCachedEntries(state.marketInsights);\n });\n\n return data;\n }\n\n /**\n * Fetches the market overview report.\n * Returns cached data if still fresh, otherwise calls the service.\n *\n * @returns The market overview report, or `null` if none exists.\n */\n async fetchMarketOverview(): Promise<MarketOverview | null> {\n const existing = this.state.marketOverview;\n if (existing) {\n const age = Date.now() - existing.fetchedAt;\n if (age < CACHE_DURATION_MS) {\n return existing.data;\n }\n }\n\n const data = await this.#digestService.fetchMarketOverview();\n\n if (data === null) {\n this.update((state) => {\n state.marketOverview = null;\n });\n return null;\n }\n\n const entry: MarketOverviewEntry = {\n fetchedAt: Date.now(),\n data,\n };\n\n this.update((state) => {\n state.marketOverview = entry;\n });\n\n return data;\n }\n\n /**\n * Evicts stale (TTL expired) and oldest entries (FIFO) if cache exceeds max size.\n *\n * @param cache - The cache record to evict entries from.\n */\n #evictStaleCachedEntries<EntryType extends { fetchedAt: number }>(\n cache: Record<string, EntryType>,\n ): void {\n const now = Date.now();\n const entries = Object.entries(cache);\n const keysToDelete: string[] = [];\n const freshEntries: [string, EntryType][] = [];\n\n for (const [key, entry] of entries) {\n if (now - entry.fetchedAt >= CACHE_DURATION_MS) {\n keysToDelete.push(key);\n } else {\n freshEntries.push([key, entry]);\n }\n }\n\n if (freshEntries.length > MAX_CACHE_ENTRIES) {\n freshEntries.sort((a, b) => a[1].fetchedAt - b[1].fetchedAt);\n const entriesToRemove = freshEntries.length - MAX_CACHE_ENTRIES;\n for (let i = 0; i < entriesToRemove; i++) {\n keysToDelete.push(freshEntries[i][0]);\n }\n }\n\n for (const key of keysToDelete) {\n delete cache[key];\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AiDigestController.cjs","sourceRoot":"","sources":["../src/AiDigestController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n StateMetadata,\n ControllerStateChangeEvent,\n ControllerGetStateAction,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport { isCaipAssetType } from '@metamask/utils';\n\nimport {\n AiDigestControllerErrorMessage,\n controllerName,\n CACHE_DURATION_MS,\n MAX_CACHE_ENTRIES,\n} from './ai-digest-constants';\nimport type {\n AiDigestControllerState,\n DigestService,\n MarketInsightsReport,\n MarketInsightsEntry,\n} from './ai-digest-types';\n\nexport type AiDigestControllerFetchMarketInsightsAction = {\n type: `${typeof controllerName}:fetchMarketInsights`;\n handler: AiDigestController['fetchMarketInsights'];\n};\n\nexport type AiDigestControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AiDigestControllerState\n>;\n\nexport type AiDigestControllerActions =\n | AiDigestControllerFetchMarketInsightsAction\n | AiDigestControllerGetStateAction;\n\nexport type AiDigestControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AiDigestControllerState\n>;\n\nexport type AiDigestControllerEvents = AiDigestControllerStateChangeEvent;\n\nexport type AiDigestControllerMessenger = Messenger<\n typeof controllerName,\n AiDigestControllerActions,\n AiDigestControllerEvents\n>;\n\nexport type AiDigestControllerOptions = {\n messenger: AiDigestControllerMessenger;\n state?: Partial<AiDigestControllerState>;\n digestService: DigestService;\n};\n\nexport function getDefaultAiDigestControllerState(): AiDigestControllerState {\n return {\n marketInsights: {},\n };\n}\n\nconst aiDigestControllerMetadata: StateMetadata<AiDigestControllerState> = {\n marketInsights: {\n persist: true,\n includeInDebugSnapshot: true,\n includeInStateLogs: true,\n usedInUi: true,\n },\n};\n\nexport class AiDigestController extends BaseController<\n typeof controllerName,\n AiDigestControllerState,\n AiDigestControllerMessenger\n> {\n readonly #digestService: DigestService;\n\n constructor({ messenger, state, digestService }: AiDigestControllerOptions) {\n super({\n name: controllerName,\n metadata: aiDigestControllerMetadata,\n state: {\n ...getDefaultAiDigestControllerState(),\n ...state,\n },\n messenger,\n });\n\n this.#digestService = digestService;\n this.#registerMessageHandlers();\n }\n\n #registerMessageHandlers(): void {\n this.messenger.registerActionHandler(\n `${controllerName}:fetchMarketInsights`,\n this.fetchMarketInsights.bind(this),\n );\n }\n\n /**\n * Fetches market insights for a given CAIP-19 asset identifier.\n * Returns cached data if still fresh, otherwise calls the service.\n *\n * @param caip19Id - The CAIP-19 identifier of the asset.\n * @returns The market insights report, or `null` if none exists.\n */\n async fetchMarketInsights(\n caip19Id: string,\n ): Promise<MarketInsightsReport | null> {\n if (!isCaipAssetType(caip19Id)) {\n throw new Error(AiDigestControllerErrorMessage.INVALID_CAIP_ASSET_TYPE);\n }\n\n const existing = this.state.marketInsights[caip19Id];\n if (existing) {\n const age = Date.now() - existing.fetchedAt;\n if (age < CACHE_DURATION_MS) {\n return existing.data;\n }\n }\n\n const data = await this.#digestService.searchDigest(caip19Id);\n\n if (data === null) {\n // No insights available for this asset — clear any stale cache entry\n this.update((state) => {\n delete state.marketInsights[caip19Id];\n });\n return null;\n }\n\n const entry: MarketInsightsEntry = {\n caip19Id,\n fetchedAt: Date.now(),\n data,\n };\n\n this.update((state) => {\n state.marketInsights[caip19Id] = entry;\n this.#evictStaleCachedEntries(state.marketInsights);\n });\n\n return data;\n }\n\n /**\n * Evicts stale (TTL expired) and oldest entries (FIFO) if cache exceeds max size.\n *\n * @param cache - The cache record to evict entries from.\n */\n #evictStaleCachedEntries<EntryType extends { fetchedAt: number }>(\n cache: Record<string, EntryType>,\n ): void {\n const now = Date.now();\n const entries = Object.entries(cache);\n const keysToDelete: string[] = [];\n const freshEntries: [string, EntryType][] = [];\n\n for (const [key, entry] of entries) {\n if (now - entry.fetchedAt >= CACHE_DURATION_MS) {\n keysToDelete.push(key);\n } else {\n freshEntries.push([key, entry]);\n }\n }\n\n if (freshEntries.length > MAX_CACHE_ENTRIES) {\n freshEntries.sort((a, b) => a[1].fetchedAt - b[1].fetchedAt);\n const entriesToRemove = freshEntries.length - MAX_CACHE_ENTRIES;\n for (let i = 0; i < entriesToRemove; i++) {\n keysToDelete.push(freshEntries[i][0]);\n }\n }\n\n for (const key of keysToDelete) {\n delete cache[key];\n }\n }\n}\n"]}
|
|
@@ -2,17 +2,13 @@ import type { ControllerStateChangeEvent, ControllerGetStateAction } from "@meta
|
|
|
2
2
|
import { BaseController } from "@metamask/base-controller";
|
|
3
3
|
import type { Messenger } from "@metamask/messenger";
|
|
4
4
|
import { controllerName } from "./ai-digest-constants.cjs";
|
|
5
|
-
import type { AiDigestControllerState, DigestService, MarketInsightsReport
|
|
5
|
+
import type { AiDigestControllerState, DigestService, MarketInsightsReport } from "./ai-digest-types.cjs";
|
|
6
6
|
export type AiDigestControllerFetchMarketInsightsAction = {
|
|
7
7
|
type: `${typeof controllerName}:fetchMarketInsights`;
|
|
8
8
|
handler: AiDigestController['fetchMarketInsights'];
|
|
9
9
|
};
|
|
10
|
-
export type AiDigestControllerFetchMarketOverviewAction = {
|
|
11
|
-
type: `${typeof controllerName}:fetchMarketOverview`;
|
|
12
|
-
handler: AiDigestController['fetchMarketOverview'];
|
|
13
|
-
};
|
|
14
10
|
export type AiDigestControllerGetStateAction = ControllerGetStateAction<typeof controllerName, AiDigestControllerState>;
|
|
15
|
-
export type AiDigestControllerActions = AiDigestControllerFetchMarketInsightsAction |
|
|
11
|
+
export type AiDigestControllerActions = AiDigestControllerFetchMarketInsightsAction | AiDigestControllerGetStateAction;
|
|
16
12
|
export type AiDigestControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, AiDigestControllerState>;
|
|
17
13
|
export type AiDigestControllerEvents = AiDigestControllerStateChangeEvent;
|
|
18
14
|
export type AiDigestControllerMessenger = Messenger<typeof controllerName, AiDigestControllerActions, AiDigestControllerEvents>;
|
|
@@ -33,12 +29,5 @@ export declare class AiDigestController extends BaseController<typeof controller
|
|
|
33
29
|
* @returns The market insights report, or `null` if none exists.
|
|
34
30
|
*/
|
|
35
31
|
fetchMarketInsights(caip19Id: string): Promise<MarketInsightsReport | null>;
|
|
36
|
-
/**
|
|
37
|
-
* Fetches the market overview report.
|
|
38
|
-
* Returns cached data if still fresh, otherwise calls the service.
|
|
39
|
-
*
|
|
40
|
-
* @returns The market overview report, or `null` if none exists.
|
|
41
|
-
*/
|
|
42
|
-
fetchMarketOverview(): Promise<MarketOverview | null>;
|
|
43
32
|
}
|
|
44
33
|
//# sourceMappingURL=AiDigestController.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiDigestController.d.cts","sourceRoot":"","sources":["../src/AiDigestController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,0BAA0B,EAC1B,wBAAwB,EACzB,kCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AAGrD,OAAO,EAEL,cAAc,EAGf,kCAA8B;AAC/B,OAAO,KAAK,EACV,uBAAuB,EACvB,aAAa,EACb,oBAAoB,
|
|
1
|
+
{"version":3,"file":"AiDigestController.d.cts","sourceRoot":"","sources":["../src/AiDigestController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,0BAA0B,EAC1B,wBAAwB,EACzB,kCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AAGrD,OAAO,EAEL,cAAc,EAGf,kCAA8B;AAC/B,OAAO,KAAK,EACV,uBAAuB,EACvB,aAAa,EACb,oBAAoB,EAErB,8BAA0B;AAE3B,MAAM,MAAM,2CAA2C,GAAG;IACxD,IAAI,EAAE,GAAG,OAAO,cAAc,sBAAsB,CAAC;IACrD,OAAO,EAAE,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG,wBAAwB,CACrE,OAAO,cAAc,EACrB,uBAAuB,CACxB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GACjC,2CAA2C,GAC3C,gCAAgC,CAAC;AAErC,MAAM,MAAM,kCAAkC,GAAG,0BAA0B,CACzE,OAAO,cAAc,EACrB,uBAAuB,CACxB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,kCAAkC,CAAC;AAE1E,MAAM,MAAM,2BAA2B,GAAG,SAAS,CACjD,OAAO,cAAc,EACrB,yBAAyB,EACzB,wBAAwB,CACzB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,2BAA2B,CAAC;IACvC,KAAK,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACzC,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,wBAAgB,iCAAiC,IAAI,uBAAuB,CAI3E;AAWD,qBAAa,kBAAmB,SAAQ,cAAc,CACpD,OAAO,cAAc,EACrB,uBAAuB,EACvB,2BAA2B,CAC5B;;gBAGa,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,yBAAyB;IAsB1E;;;;;;OAMG;IACG,mBAAmB,CACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;CAsExC"}
|
|
@@ -2,17 +2,13 @@ import type { ControllerStateChangeEvent, ControllerGetStateAction } from "@meta
|
|
|
2
2
|
import { BaseController } from "@metamask/base-controller";
|
|
3
3
|
import type { Messenger } from "@metamask/messenger";
|
|
4
4
|
import { controllerName } from "./ai-digest-constants.mjs";
|
|
5
|
-
import type { AiDigestControllerState, DigestService, MarketInsightsReport
|
|
5
|
+
import type { AiDigestControllerState, DigestService, MarketInsightsReport } from "./ai-digest-types.mjs";
|
|
6
6
|
export type AiDigestControllerFetchMarketInsightsAction = {
|
|
7
7
|
type: `${typeof controllerName}:fetchMarketInsights`;
|
|
8
8
|
handler: AiDigestController['fetchMarketInsights'];
|
|
9
9
|
};
|
|
10
|
-
export type AiDigestControllerFetchMarketOverviewAction = {
|
|
11
|
-
type: `${typeof controllerName}:fetchMarketOverview`;
|
|
12
|
-
handler: AiDigestController['fetchMarketOverview'];
|
|
13
|
-
};
|
|
14
10
|
export type AiDigestControllerGetStateAction = ControllerGetStateAction<typeof controllerName, AiDigestControllerState>;
|
|
15
|
-
export type AiDigestControllerActions = AiDigestControllerFetchMarketInsightsAction |
|
|
11
|
+
export type AiDigestControllerActions = AiDigestControllerFetchMarketInsightsAction | AiDigestControllerGetStateAction;
|
|
16
12
|
export type AiDigestControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, AiDigestControllerState>;
|
|
17
13
|
export type AiDigestControllerEvents = AiDigestControllerStateChangeEvent;
|
|
18
14
|
export type AiDigestControllerMessenger = Messenger<typeof controllerName, AiDigestControllerActions, AiDigestControllerEvents>;
|
|
@@ -33,12 +29,5 @@ export declare class AiDigestController extends BaseController<typeof controller
|
|
|
33
29
|
* @returns The market insights report, or `null` if none exists.
|
|
34
30
|
*/
|
|
35
31
|
fetchMarketInsights(caip19Id: string): Promise<MarketInsightsReport | null>;
|
|
36
|
-
/**
|
|
37
|
-
* Fetches the market overview report.
|
|
38
|
-
* Returns cached data if still fresh, otherwise calls the service.
|
|
39
|
-
*
|
|
40
|
-
* @returns The market overview report, or `null` if none exists.
|
|
41
|
-
*/
|
|
42
|
-
fetchMarketOverview(): Promise<MarketOverview | null>;
|
|
43
32
|
}
|
|
44
33
|
//# sourceMappingURL=AiDigestController.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiDigestController.d.mts","sourceRoot":"","sources":["../src/AiDigestController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,0BAA0B,EAC1B,wBAAwB,EACzB,kCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AAGrD,OAAO,EAEL,cAAc,EAGf,kCAA8B;AAC/B,OAAO,KAAK,EACV,uBAAuB,EACvB,aAAa,EACb,oBAAoB,
|
|
1
|
+
{"version":3,"file":"AiDigestController.d.mts","sourceRoot":"","sources":["../src/AiDigestController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,0BAA0B,EAC1B,wBAAwB,EACzB,kCAAkC;AACnC,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AAGrD,OAAO,EAEL,cAAc,EAGf,kCAA8B;AAC/B,OAAO,KAAK,EACV,uBAAuB,EACvB,aAAa,EACb,oBAAoB,EAErB,8BAA0B;AAE3B,MAAM,MAAM,2CAA2C,GAAG;IACxD,IAAI,EAAE,GAAG,OAAO,cAAc,sBAAsB,CAAC;IACrD,OAAO,EAAE,kBAAkB,CAAC,qBAAqB,CAAC,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG,wBAAwB,CACrE,OAAO,cAAc,EACrB,uBAAuB,CACxB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GACjC,2CAA2C,GAC3C,gCAAgC,CAAC;AAErC,MAAM,MAAM,kCAAkC,GAAG,0BAA0B,CACzE,OAAO,cAAc,EACrB,uBAAuB,CACxB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,kCAAkC,CAAC;AAE1E,MAAM,MAAM,2BAA2B,GAAG,SAAS,CACjD,OAAO,cAAc,EACrB,yBAAyB,EACzB,wBAAwB,CACzB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,2BAA2B,CAAC;IACvC,KAAK,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACzC,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,wBAAgB,iCAAiC,IAAI,uBAAuB,CAI3E;AAWD,qBAAa,kBAAmB,SAAQ,cAAc,CACpD,OAAO,cAAc,EACrB,uBAAuB,EACvB,2BAA2B,CAC5B;;gBAGa,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,yBAAyB;IAsB1E;;;;;;OAMG;IACG,mBAAmB,CACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;CAsExC"}
|
|
@@ -16,7 +16,6 @@ import { AiDigestControllerErrorMessage, controllerName, CACHE_DURATION_MS, MAX_
|
|
|
16
16
|
export function getDefaultAiDigestControllerState() {
|
|
17
17
|
return {
|
|
18
18
|
marketInsights: {},
|
|
19
|
-
marketOverview: null,
|
|
20
19
|
};
|
|
21
20
|
}
|
|
22
21
|
const aiDigestControllerMetadata = {
|
|
@@ -26,12 +25,6 @@ const aiDigestControllerMetadata = {
|
|
|
26
25
|
includeInStateLogs: true,
|
|
27
26
|
usedInUi: true,
|
|
28
27
|
},
|
|
29
|
-
marketOverview: {
|
|
30
|
-
persist: true,
|
|
31
|
-
includeInDebugSnapshot: true,
|
|
32
|
-
includeInStateLogs: true,
|
|
33
|
-
usedInUi: true,
|
|
34
|
-
},
|
|
35
28
|
};
|
|
36
29
|
export class AiDigestController extends BaseController {
|
|
37
30
|
constructor({ messenger, state, digestService }) {
|
|
@@ -86,40 +79,9 @@ export class AiDigestController extends BaseController {
|
|
|
86
79
|
});
|
|
87
80
|
return data;
|
|
88
81
|
}
|
|
89
|
-
/**
|
|
90
|
-
* Fetches the market overview report.
|
|
91
|
-
* Returns cached data if still fresh, otherwise calls the service.
|
|
92
|
-
*
|
|
93
|
-
* @returns The market overview report, or `null` if none exists.
|
|
94
|
-
*/
|
|
95
|
-
async fetchMarketOverview() {
|
|
96
|
-
const existing = this.state.marketOverview;
|
|
97
|
-
if (existing) {
|
|
98
|
-
const age = Date.now() - existing.fetchedAt;
|
|
99
|
-
if (age < CACHE_DURATION_MS) {
|
|
100
|
-
return existing.data;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
const data = await __classPrivateFieldGet(this, _AiDigestController_digestService, "f").fetchMarketOverview();
|
|
104
|
-
if (data === null) {
|
|
105
|
-
this.update((state) => {
|
|
106
|
-
state.marketOverview = null;
|
|
107
|
-
});
|
|
108
|
-
return null;
|
|
109
|
-
}
|
|
110
|
-
const entry = {
|
|
111
|
-
fetchedAt: Date.now(),
|
|
112
|
-
data,
|
|
113
|
-
};
|
|
114
|
-
this.update((state) => {
|
|
115
|
-
state.marketOverview = entry;
|
|
116
|
-
});
|
|
117
|
-
return data;
|
|
118
|
-
}
|
|
119
82
|
}
|
|
120
83
|
_AiDigestController_digestService = new WeakMap(), _AiDigestController_instances = new WeakSet(), _AiDigestController_registerMessageHandlers = function _AiDigestController_registerMessageHandlers() {
|
|
121
84
|
this.messenger.registerActionHandler(`${controllerName}:fetchMarketInsights`, this.fetchMarketInsights.bind(this));
|
|
122
|
-
this.messenger.registerActionHandler(`${controllerName}:fetchMarketOverview`, this.fetchMarketOverview.bind(this));
|
|
123
85
|
}, _AiDigestController_evictStaleCachedEntries = function _AiDigestController_evictStaleCachedEntries(cache) {
|
|
124
86
|
const now = Date.now();
|
|
125
87
|
const entries = Object.entries(cache);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiDigestController.mjs","sourceRoot":"","sources":["../src/AiDigestController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n StateMetadata,\n ControllerStateChangeEvent,\n ControllerGetStateAction,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport { isCaipAssetType } from '@metamask/utils';\n\nimport {\n AiDigestControllerErrorMessage,\n controllerName,\n CACHE_DURATION_MS,\n MAX_CACHE_ENTRIES,\n} from './ai-digest-constants';\nimport type {\n AiDigestControllerState,\n DigestService,\n MarketInsightsReport,\n MarketInsightsEntry,\n MarketOverview,\n MarketOverviewEntry,\n} from './ai-digest-types';\n\nexport type AiDigestControllerFetchMarketInsightsAction = {\n type: `${typeof controllerName}:fetchMarketInsights`;\n handler: AiDigestController['fetchMarketInsights'];\n};\n\nexport type AiDigestControllerFetchMarketOverviewAction = {\n type: `${typeof controllerName}:fetchMarketOverview`;\n handler: AiDigestController['fetchMarketOverview'];\n};\n\nexport type AiDigestControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AiDigestControllerState\n>;\n\nexport type AiDigestControllerActions =\n | AiDigestControllerFetchMarketInsightsAction\n | AiDigestControllerFetchMarketOverviewAction\n | AiDigestControllerGetStateAction;\n\nexport type AiDigestControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AiDigestControllerState\n>;\n\nexport type AiDigestControllerEvents = AiDigestControllerStateChangeEvent;\n\nexport type AiDigestControllerMessenger = Messenger<\n typeof controllerName,\n AiDigestControllerActions,\n AiDigestControllerEvents\n>;\n\nexport type AiDigestControllerOptions = {\n messenger: AiDigestControllerMessenger;\n state?: Partial<AiDigestControllerState>;\n digestService: DigestService;\n};\n\nexport function getDefaultAiDigestControllerState(): AiDigestControllerState {\n return {\n marketInsights: {},\n marketOverview: null,\n };\n}\n\nconst aiDigestControllerMetadata: StateMetadata<AiDigestControllerState> = {\n marketInsights: {\n persist: true,\n includeInDebugSnapshot: true,\n includeInStateLogs: true,\n usedInUi: true,\n },\n marketOverview: {\n persist: true,\n includeInDebugSnapshot: true,\n includeInStateLogs: true,\n usedInUi: true,\n },\n};\n\nexport class AiDigestController extends BaseController<\n typeof controllerName,\n AiDigestControllerState,\n AiDigestControllerMessenger\n> {\n readonly #digestService: DigestService;\n\n constructor({ messenger, state, digestService }: AiDigestControllerOptions) {\n super({\n name: controllerName,\n metadata: aiDigestControllerMetadata,\n state: {\n ...getDefaultAiDigestControllerState(),\n ...state,\n },\n messenger,\n });\n\n this.#digestService = digestService;\n this.#registerMessageHandlers();\n }\n\n #registerMessageHandlers(): void {\n this.messenger.registerActionHandler(\n `${controllerName}:fetchMarketInsights`,\n this.fetchMarketInsights.bind(this),\n );\n this.messenger.registerActionHandler(\n `${controllerName}:fetchMarketOverview`,\n this.fetchMarketOverview.bind(this),\n );\n }\n\n /**\n * Fetches market insights for a given CAIP-19 asset identifier.\n * Returns cached data if still fresh, otherwise calls the service.\n *\n * @param caip19Id - The CAIP-19 identifier of the asset.\n * @returns The market insights report, or `null` if none exists.\n */\n async fetchMarketInsights(\n caip19Id: string,\n ): Promise<MarketInsightsReport | null> {\n if (!isCaipAssetType(caip19Id)) {\n throw new Error(AiDigestControllerErrorMessage.INVALID_CAIP_ASSET_TYPE);\n }\n\n const existing = this.state.marketInsights[caip19Id];\n if (existing) {\n const age = Date.now() - existing.fetchedAt;\n if (age < CACHE_DURATION_MS) {\n return existing.data;\n }\n }\n\n const data = await this.#digestService.searchDigest(caip19Id);\n\n if (data === null) {\n // No insights available for this asset — clear any stale cache entry\n this.update((state) => {\n delete state.marketInsights[caip19Id];\n });\n return null;\n }\n\n const entry: MarketInsightsEntry = {\n caip19Id,\n fetchedAt: Date.now(),\n data,\n };\n\n this.update((state) => {\n state.marketInsights[caip19Id] = entry;\n this.#evictStaleCachedEntries(state.marketInsights);\n });\n\n return data;\n }\n\n /**\n * Fetches the market overview report.\n * Returns cached data if still fresh, otherwise calls the service.\n *\n * @returns The market overview report, or `null` if none exists.\n */\n async fetchMarketOverview(): Promise<MarketOverview | null> {\n const existing = this.state.marketOverview;\n if (existing) {\n const age = Date.now() - existing.fetchedAt;\n if (age < CACHE_DURATION_MS) {\n return existing.data;\n }\n }\n\n const data = await this.#digestService.fetchMarketOverview();\n\n if (data === null) {\n this.update((state) => {\n state.marketOverview = null;\n });\n return null;\n }\n\n const entry: MarketOverviewEntry = {\n fetchedAt: Date.now(),\n data,\n };\n\n this.update((state) => {\n state.marketOverview = entry;\n });\n\n return data;\n }\n\n /**\n * Evicts stale (TTL expired) and oldest entries (FIFO) if cache exceeds max size.\n *\n * @param cache - The cache record to evict entries from.\n */\n #evictStaleCachedEntries<EntryType extends { fetchedAt: number }>(\n cache: Record<string, EntryType>,\n ): void {\n const now = Date.now();\n const entries = Object.entries(cache);\n const keysToDelete: string[] = [];\n const freshEntries: [string, EntryType][] = [];\n\n for (const [key, entry] of entries) {\n if (now - entry.fetchedAt >= CACHE_DURATION_MS) {\n keysToDelete.push(key);\n } else {\n freshEntries.push([key, entry]);\n }\n }\n\n if (freshEntries.length > MAX_CACHE_ENTRIES) {\n freshEntries.sort((a, b) => a[1].fetchedAt - b[1].fetchedAt);\n const entriesToRemove = freshEntries.length - MAX_CACHE_ENTRIES;\n for (let i = 0; i < entriesToRemove; i++) {\n keysToDelete.push(freshEntries[i][0]);\n }\n }\n\n for (const key of keysToDelete) {\n delete cache[key];\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"AiDigestController.mjs","sourceRoot":"","sources":["../src/AiDigestController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n StateMetadata,\n ControllerStateChangeEvent,\n ControllerGetStateAction,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { Messenger } from '@metamask/messenger';\nimport { isCaipAssetType } from '@metamask/utils';\n\nimport {\n AiDigestControllerErrorMessage,\n controllerName,\n CACHE_DURATION_MS,\n MAX_CACHE_ENTRIES,\n} from './ai-digest-constants';\nimport type {\n AiDigestControllerState,\n DigestService,\n MarketInsightsReport,\n MarketInsightsEntry,\n} from './ai-digest-types';\n\nexport type AiDigestControllerFetchMarketInsightsAction = {\n type: `${typeof controllerName}:fetchMarketInsights`;\n handler: AiDigestController['fetchMarketInsights'];\n};\n\nexport type AiDigestControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AiDigestControllerState\n>;\n\nexport type AiDigestControllerActions =\n | AiDigestControllerFetchMarketInsightsAction\n | AiDigestControllerGetStateAction;\n\nexport type AiDigestControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AiDigestControllerState\n>;\n\nexport type AiDigestControllerEvents = AiDigestControllerStateChangeEvent;\n\nexport type AiDigestControllerMessenger = Messenger<\n typeof controllerName,\n AiDigestControllerActions,\n AiDigestControllerEvents\n>;\n\nexport type AiDigestControllerOptions = {\n messenger: AiDigestControllerMessenger;\n state?: Partial<AiDigestControllerState>;\n digestService: DigestService;\n};\n\nexport function getDefaultAiDigestControllerState(): AiDigestControllerState {\n return {\n marketInsights: {},\n };\n}\n\nconst aiDigestControllerMetadata: StateMetadata<AiDigestControllerState> = {\n marketInsights: {\n persist: true,\n includeInDebugSnapshot: true,\n includeInStateLogs: true,\n usedInUi: true,\n },\n};\n\nexport class AiDigestController extends BaseController<\n typeof controllerName,\n AiDigestControllerState,\n AiDigestControllerMessenger\n> {\n readonly #digestService: DigestService;\n\n constructor({ messenger, state, digestService }: AiDigestControllerOptions) {\n super({\n name: controllerName,\n metadata: aiDigestControllerMetadata,\n state: {\n ...getDefaultAiDigestControllerState(),\n ...state,\n },\n messenger,\n });\n\n this.#digestService = digestService;\n this.#registerMessageHandlers();\n }\n\n #registerMessageHandlers(): void {\n this.messenger.registerActionHandler(\n `${controllerName}:fetchMarketInsights`,\n this.fetchMarketInsights.bind(this),\n );\n }\n\n /**\n * Fetches market insights for a given CAIP-19 asset identifier.\n * Returns cached data if still fresh, otherwise calls the service.\n *\n * @param caip19Id - The CAIP-19 identifier of the asset.\n * @returns The market insights report, or `null` if none exists.\n */\n async fetchMarketInsights(\n caip19Id: string,\n ): Promise<MarketInsightsReport | null> {\n if (!isCaipAssetType(caip19Id)) {\n throw new Error(AiDigestControllerErrorMessage.INVALID_CAIP_ASSET_TYPE);\n }\n\n const existing = this.state.marketInsights[caip19Id];\n if (existing) {\n const age = Date.now() - existing.fetchedAt;\n if (age < CACHE_DURATION_MS) {\n return existing.data;\n }\n }\n\n const data = await this.#digestService.searchDigest(caip19Id);\n\n if (data === null) {\n // No insights available for this asset — clear any stale cache entry\n this.update((state) => {\n delete state.marketInsights[caip19Id];\n });\n return null;\n }\n\n const entry: MarketInsightsEntry = {\n caip19Id,\n fetchedAt: Date.now(),\n data,\n };\n\n this.update((state) => {\n state.marketInsights[caip19Id] = entry;\n this.#evictStaleCachedEntries(state.marketInsights);\n });\n\n return data;\n }\n\n /**\n * Evicts stale (TTL expired) and oldest entries (FIFO) if cache exceeds max size.\n *\n * @param cache - The cache record to evict entries from.\n */\n #evictStaleCachedEntries<EntryType extends { fetchedAt: number }>(\n cache: Record<string, EntryType>,\n ): void {\n const now = Date.now();\n const entries = Object.entries(cache);\n const keysToDelete: string[] = [];\n const freshEntries: [string, EntryType][] = [];\n\n for (const [key, entry] of entries) {\n if (now - entry.fetchedAt >= CACHE_DURATION_MS) {\n keysToDelete.push(key);\n } else {\n freshEntries.push([key, entry]);\n }\n }\n\n if (freshEntries.length > MAX_CACHE_ENTRIES) {\n freshEntries.sort((a, b) => a[1].fetchedAt - b[1].fetchedAt);\n const entriesToRemove = freshEntries.length - MAX_CACHE_ENTRIES;\n for (let i = 0; i < entriesToRemove; i++) {\n keysToDelete.push(freshEntries[i][0]);\n }\n }\n\n for (const key of keysToDelete) {\n delete cache[key];\n }\n }\n}\n"]}
|
package/dist/AiDigestService.cjs
CHANGED
|
@@ -15,44 +15,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.AiDigestService = void 0;
|
|
16
16
|
const superstruct_1 = require("@metamask/superstruct");
|
|
17
17
|
const ai_digest_constants_1 = require("./ai-digest-constants.cjs");
|
|
18
|
-
|
|
19
|
-
const ArticleStruct = (0, superstruct_1.type)({
|
|
18
|
+
const MarketInsightsArticleStruct = (0, superstruct_1.type)({
|
|
20
19
|
title: (0, superstruct_1.string)(),
|
|
21
20
|
url: (0, superstruct_1.string)(),
|
|
22
21
|
source: (0, superstruct_1.string)(),
|
|
23
22
|
date: (0, superstruct_1.string)(),
|
|
24
23
|
});
|
|
25
|
-
const
|
|
24
|
+
const MarketInsightsTweetStruct = (0, superstruct_1.type)({
|
|
26
25
|
contentSummary: (0, superstruct_1.string)(),
|
|
27
26
|
url: (0, superstruct_1.string)(),
|
|
28
27
|
author: (0, superstruct_1.string)(),
|
|
29
28
|
date: (0, superstruct_1.string)(),
|
|
30
29
|
});
|
|
31
|
-
const SourceStruct = (0, superstruct_1.type)({
|
|
32
|
-
name: (0, superstruct_1.string)(),
|
|
33
|
-
url: (0, superstruct_1.string)(),
|
|
34
|
-
type: (0, superstruct_1.enums)(['news', 'data', 'social']),
|
|
35
|
-
});
|
|
36
|
-
const AIResponseMetadataStruct = (0, superstruct_1.type)({
|
|
37
|
-
provider: (0, superstruct_1.string)(),
|
|
38
|
-
});
|
|
39
|
-
const trendCategoryValues = [
|
|
40
|
-
'geopolitical',
|
|
41
|
-
'macro',
|
|
42
|
-
'regulatory',
|
|
43
|
-
'technical',
|
|
44
|
-
'social',
|
|
45
|
-
'other',
|
|
46
|
-
];
|
|
47
|
-
const trendImpactValues = ['positive', 'negative', 'neutral'];
|
|
48
|
-
// Market Insights structs
|
|
49
30
|
const MarketInsightsTrendStruct = (0, superstruct_1.type)({
|
|
50
31
|
title: (0, superstruct_1.string)(),
|
|
51
32
|
description: (0, superstruct_1.string)(),
|
|
52
|
-
category: (0, superstruct_1.
|
|
53
|
-
impact: (0, superstruct_1.
|
|
54
|
-
articles: (0, superstruct_1.array)(
|
|
55
|
-
tweets: (0, superstruct_1.array)(
|
|
33
|
+
category: (0, superstruct_1.string)(),
|
|
34
|
+
impact: (0, superstruct_1.string)(),
|
|
35
|
+
articles: (0, superstruct_1.array)(MarketInsightsArticleStruct),
|
|
36
|
+
tweets: (0, superstruct_1.array)(MarketInsightsTweetStruct),
|
|
37
|
+
});
|
|
38
|
+
const MarketInsightsSourceStruct = (0, superstruct_1.type)({
|
|
39
|
+
name: (0, superstruct_1.string)(),
|
|
40
|
+
url: (0, superstruct_1.string)(),
|
|
41
|
+
type: (0, superstruct_1.string)(),
|
|
56
42
|
});
|
|
57
43
|
const MarketInsightsReportStruct = (0, superstruct_1.type)({
|
|
58
44
|
version: (0, superstruct_1.optional)((0, superstruct_1.string)()),
|
|
@@ -61,31 +47,12 @@ const MarketInsightsReportStruct = (0, superstruct_1.type)({
|
|
|
61
47
|
headline: (0, superstruct_1.string)(),
|
|
62
48
|
summary: (0, superstruct_1.string)(),
|
|
63
49
|
trends: (0, superstruct_1.array)(MarketInsightsTrendStruct),
|
|
64
|
-
social: (0, superstruct_1.optional)((0, superstruct_1.array)(
|
|
65
|
-
sources: (0, superstruct_1.array)(
|
|
66
|
-
metadata: (0, superstruct_1.optional)((0, superstruct_1.array)(AIResponseMetadataStruct)),
|
|
50
|
+
social: (0, superstruct_1.optional)((0, superstruct_1.array)(MarketInsightsTweetStruct)),
|
|
51
|
+
sources: (0, superstruct_1.array)(MarketInsightsSourceStruct),
|
|
67
52
|
});
|
|
68
53
|
const MarketInsightsDigestEnvelopeStruct = (0, superstruct_1.type)({
|
|
69
54
|
digest: MarketInsightsReportStruct,
|
|
70
55
|
});
|
|
71
|
-
// Market Overview structs
|
|
72
|
-
const MarketOverviewTrendStruct = (0, superstruct_1.type)({
|
|
73
|
-
title: (0, superstruct_1.string)(),
|
|
74
|
-
description: (0, superstruct_1.string)(),
|
|
75
|
-
category: (0, superstruct_1.enums)(trendCategoryValues),
|
|
76
|
-
impact: (0, superstruct_1.enums)(trendImpactValues),
|
|
77
|
-
articles: (0, superstruct_1.array)(ArticleStruct),
|
|
78
|
-
relatedAssets: (0, superstruct_1.array)((0, superstruct_1.string)()),
|
|
79
|
-
});
|
|
80
|
-
const MarketOverviewStruct = (0, superstruct_1.type)({
|
|
81
|
-
version: (0, superstruct_1.optional)((0, superstruct_1.string)()),
|
|
82
|
-
generatedAt: (0, superstruct_1.string)(),
|
|
83
|
-
headline: (0, superstruct_1.string)(),
|
|
84
|
-
summary: (0, superstruct_1.string)(),
|
|
85
|
-
trends: (0, superstruct_1.array)(MarketOverviewTrendStruct),
|
|
86
|
-
sources: (0, superstruct_1.array)(SourceStruct),
|
|
87
|
-
metadata: (0, superstruct_1.optional)((0, superstruct_1.array)(AIResponseMetadataStruct)),
|
|
88
|
-
});
|
|
89
56
|
const getNormalizedMarketInsightsReport = (value) => {
|
|
90
57
|
if ((0, superstruct_1.is)(value, MarketInsightsReportStruct)) {
|
|
91
58
|
return value;
|
|
@@ -100,37 +67,16 @@ class AiDigestService {
|
|
|
100
67
|
_AiDigestService_baseUrl.set(this, void 0);
|
|
101
68
|
__classPrivateFieldSet(this, _AiDigestService_baseUrl, config.baseUrl, "f");
|
|
102
69
|
}
|
|
103
|
-
/**
|
|
104
|
-
* Fetch the market overview report.
|
|
105
|
-
*
|
|
106
|
-
* Calls `GET ${this.#baseUrl}/market-overview`.
|
|
107
|
-
*
|
|
108
|
-
* @returns The market overview report, or `null` if none exists (404).
|
|
109
|
-
*/
|
|
110
|
-
async fetchMarketOverview() {
|
|
111
|
-
const response = await fetch(`${__classPrivateFieldGet(this, _AiDigestService_baseUrl, "f")}/market-overview`);
|
|
112
|
-
if (response.status === 404) {
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
|
-
if (!response.ok) {
|
|
116
|
-
throw new Error(`${ai_digest_constants_1.AiDigestControllerErrorMessage.API_REQUEST_FAILED}: ${response.status}`);
|
|
117
|
-
}
|
|
118
|
-
const body = await response.json();
|
|
119
|
-
if (!(0, superstruct_1.is)(body, MarketOverviewStruct)) {
|
|
120
|
-
throw new Error(ai_digest_constants_1.AiDigestControllerErrorMessage.API_INVALID_RESPONSE);
|
|
121
|
-
}
|
|
122
|
-
return body;
|
|
123
|
-
}
|
|
124
70
|
/**
|
|
125
71
|
* Search for market insights by CAIP-19 asset identifier.
|
|
126
72
|
*
|
|
127
|
-
* Calls `GET ${this.#baseUrl}/
|
|
73
|
+
* Calls `GET ${this.#baseUrl}/digests?caipAssetType=${encodeURIComponent(caip19Id)}`.
|
|
128
74
|
*
|
|
129
75
|
* @param caip19Id - The CAIP-19 identifier of the asset.
|
|
130
76
|
* @returns The market insights report, or `null` if none exists (404).
|
|
131
77
|
*/
|
|
132
78
|
async searchDigest(caip19Id) {
|
|
133
|
-
const response = await fetch(`${__classPrivateFieldGet(this, _AiDigestService_baseUrl, "f")}/
|
|
79
|
+
const response = await fetch(`${__classPrivateFieldGet(this, _AiDigestService_baseUrl, "f")}/digests?caipAssetType=${encodeURIComponent(caip19Id)}`);
|
|
134
80
|
if (response.status === 404) {
|
|
135
81
|
return null;
|
|
136
82
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiDigestService.cjs","sourceRoot":"","sources":["../src/AiDigestService.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"AiDigestService.cjs","sourceRoot":"","sources":["../src/AiDigestService.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,uDAM+B;AAG/B,mEAAuE;AAOvE,MAAM,2BAA2B,GAAG,IAAA,kBAAU,EAAC;IAC7C,KAAK,EAAE,IAAA,oBAAM,GAAE;IACf,GAAG,EAAE,IAAA,oBAAM,GAAE;IACb,MAAM,EAAE,IAAA,oBAAM,GAAE;IAChB,IAAI,EAAE,IAAA,oBAAM,GAAE;CACf,CAAC,CAAC;AAEH,MAAM,yBAAyB,GAAG,IAAA,kBAAU,EAAC;IAC3C,cAAc,EAAE,IAAA,oBAAM,GAAE;IACxB,GAAG,EAAE,IAAA,oBAAM,GAAE;IACb,MAAM,EAAE,IAAA,oBAAM,GAAE;IAChB,IAAI,EAAE,IAAA,oBAAM,GAAE;CACf,CAAC,CAAC;AAEH,MAAM,yBAAyB,GAAG,IAAA,kBAAU,EAAC;IAC3C,KAAK,EAAE,IAAA,oBAAM,GAAE;IACf,WAAW,EAAE,IAAA,oBAAM,GAAE;IACrB,QAAQ,EAAE,IAAA,oBAAM,GAAE;IAClB,MAAM,EAAE,IAAA,oBAAM,GAAE;IAChB,QAAQ,EAAE,IAAA,mBAAK,EAAC,2BAA2B,CAAC;IAC5C,MAAM,EAAE,IAAA,mBAAK,EAAC,yBAAyB,CAAC;CACzC,CAAC,CAAC;AAEH,MAAM,0BAA0B,GAAG,IAAA,kBAAU,EAAC;IAC5C,IAAI,EAAE,IAAA,oBAAM,GAAE;IACd,GAAG,EAAE,IAAA,oBAAM,GAAE;IACb,IAAI,EAAE,IAAA,oBAAM,GAAE;CACf,CAAC,CAAC;AAEH,MAAM,0BAA0B,GAAG,IAAA,kBAAU,EAAC;IAC5C,OAAO,EAAE,IAAA,sBAAQ,EAAC,IAAA,oBAAM,GAAE,CAAC;IAC3B,KAAK,EAAE,IAAA,oBAAM,GAAE;IACf,WAAW,EAAE,IAAA,oBAAM,GAAE;IACrB,QAAQ,EAAE,IAAA,oBAAM,GAAE;IAClB,OAAO,EAAE,IAAA,oBAAM,GAAE;IACjB,MAAM,EAAE,IAAA,mBAAK,EAAC,yBAAyB,CAAC;IACxC,MAAM,EAAE,IAAA,sBAAQ,EAAC,IAAA,mBAAK,EAAC,yBAAyB,CAAC,CAAC;IAClD,OAAO,EAAE,IAAA,mBAAK,EAAC,0BAA0B,CAAC;CAC3C,CAAC,CAAC;AAEH,MAAM,kCAAkC,GAAG,IAAA,kBAAU,EAAC;IACpD,MAAM,EAAE,0BAA0B;CACnC,CAAC,CAAC;AAEH,MAAM,iCAAiC,GAAG,CACxC,KAAc,EACe,EAAE;IAC/B,IAAI,IAAA,gBAAE,EAAC,KAAK,EAAE,0BAA0B,CAAC,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,IAAA,gBAAE,EAAC,KAAK,EAAE,kCAAkC,CAAC,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAa,eAAe;IAG1B,YAAY,MAA6B;QAFhC,2CAAiB;QAGxB,uBAAA,IAAI,4BAAY,MAAM,CAAC,OAAO,MAAA,CAAC;IACjC,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,YAAY,CAChB,QAAuB;QAEvB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,uBAAA,IAAI,gCAAS,0BAA0B,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CACzE,CAAC;QAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,GAAG,oDAA8B,CAAC,kBAAkB,KAAK,QAAQ,CAAC,MAAM,EAAE,CAC3E,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,iCAAiC,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAExE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,oDAA8B,CAAC,oBAAoB,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAxCD,0CAwCC","sourcesContent":["import {\n array,\n is,\n optional,\n string,\n type as structType,\n} from '@metamask/superstruct';\nimport type { CaipAssetType } from '@metamask/utils';\n\nimport { AiDigestControllerErrorMessage } from './ai-digest-constants';\nimport type { DigestService, MarketInsightsReport } from './ai-digest-types';\n\nexport type AiDigestServiceConfig = {\n baseUrl: string;\n};\n\nconst MarketInsightsArticleStruct = structType({\n title: string(),\n url: string(),\n source: string(),\n date: string(),\n});\n\nconst MarketInsightsTweetStruct = structType({\n contentSummary: string(),\n url: string(),\n author: string(),\n date: string(),\n});\n\nconst MarketInsightsTrendStruct = structType({\n title: string(),\n description: string(),\n category: string(),\n impact: string(),\n articles: array(MarketInsightsArticleStruct),\n tweets: array(MarketInsightsTweetStruct),\n});\n\nconst MarketInsightsSourceStruct = structType({\n name: string(),\n url: string(),\n type: string(),\n});\n\nconst MarketInsightsReportStruct = structType({\n version: optional(string()),\n asset: string(),\n generatedAt: string(),\n headline: string(),\n summary: string(),\n trends: array(MarketInsightsTrendStruct),\n social: optional(array(MarketInsightsTweetStruct)),\n sources: array(MarketInsightsSourceStruct),\n});\n\nconst MarketInsightsDigestEnvelopeStruct = structType({\n digest: MarketInsightsReportStruct,\n});\n\nconst getNormalizedMarketInsightsReport = (\n value: unknown,\n): MarketInsightsReport | null => {\n if (is(value, MarketInsightsReportStruct)) {\n return value;\n }\n\n if (is(value, MarketInsightsDigestEnvelopeStruct)) {\n return value.digest;\n }\n\n return null;\n};\n\nexport class AiDigestService implements DigestService {\n readonly #baseUrl: string;\n\n constructor(config: AiDigestServiceConfig) {\n this.#baseUrl = config.baseUrl;\n }\n\n /**\n * Search for market insights by CAIP-19 asset identifier.\n *\n * Calls `GET ${this.#baseUrl}/digests?caipAssetType=${encodeURIComponent(caip19Id)}`.\n *\n * @param caip19Id - The CAIP-19 identifier of the asset.\n * @returns The market insights report, or `null` if none exists (404).\n */\n async searchDigest(\n caip19Id: CaipAssetType,\n ): Promise<MarketInsightsReport | null> {\n const response = await fetch(\n `${this.#baseUrl}/digests?caipAssetType=${encodeURIComponent(caip19Id)}`,\n );\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n throw new Error(\n `${AiDigestControllerErrorMessage.API_REQUEST_FAILED}: ${response.status}`,\n );\n }\n\n const report = getNormalizedMarketInsightsReport(await response.json());\n\n if (!report) {\n throw new Error(AiDigestControllerErrorMessage.API_INVALID_RESPONSE);\n }\n\n return report;\n }\n}\n"]}
|
|
@@ -1,23 +1,15 @@
|
|
|
1
1
|
import type { CaipAssetType } from "@metamask/utils";
|
|
2
|
-
import type { DigestService, MarketInsightsReport
|
|
2
|
+
import type { DigestService, MarketInsightsReport } from "./ai-digest-types.cjs";
|
|
3
3
|
export type AiDigestServiceConfig = {
|
|
4
4
|
baseUrl: string;
|
|
5
5
|
};
|
|
6
6
|
export declare class AiDigestService implements DigestService {
|
|
7
7
|
#private;
|
|
8
8
|
constructor(config: AiDigestServiceConfig);
|
|
9
|
-
/**
|
|
10
|
-
* Fetch the market overview report.
|
|
11
|
-
*
|
|
12
|
-
* Calls `GET ${this.#baseUrl}/market-overview`.
|
|
13
|
-
*
|
|
14
|
-
* @returns The market overview report, or `null` if none exists (404).
|
|
15
|
-
*/
|
|
16
|
-
fetchMarketOverview(): Promise<MarketOverview | null>;
|
|
17
9
|
/**
|
|
18
10
|
* Search for market insights by CAIP-19 asset identifier.
|
|
19
11
|
*
|
|
20
|
-
* Calls `GET ${this.#baseUrl}/
|
|
12
|
+
* Calls `GET ${this.#baseUrl}/digests?caipAssetType=${encodeURIComponent(caip19Id)}`.
|
|
21
13
|
*
|
|
22
14
|
* @param caip19Id - The CAIP-19 identifier of the asset.
|
|
23
15
|
* @returns The market insights report, or `null` if none exists (404).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiDigestService.d.cts","sourceRoot":"","sources":["../src/AiDigestService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AiDigestService.d.cts","sourceRoot":"","sources":["../src/AiDigestService.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB;AAGrD,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,8BAA0B;AAE7E,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AA4DF,qBAAa,eAAgB,YAAW,aAAa;;gBAGvC,MAAM,EAAE,qBAAqB;IAIzC;;;;;;;OAOG;IACG,YAAY,CAChB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;CAuBxC"}
|
|
@@ -1,23 +1,15 @@
|
|
|
1
1
|
import type { CaipAssetType } from "@metamask/utils";
|
|
2
|
-
import type { DigestService, MarketInsightsReport
|
|
2
|
+
import type { DigestService, MarketInsightsReport } from "./ai-digest-types.mjs";
|
|
3
3
|
export type AiDigestServiceConfig = {
|
|
4
4
|
baseUrl: string;
|
|
5
5
|
};
|
|
6
6
|
export declare class AiDigestService implements DigestService {
|
|
7
7
|
#private;
|
|
8
8
|
constructor(config: AiDigestServiceConfig);
|
|
9
|
-
/**
|
|
10
|
-
* Fetch the market overview report.
|
|
11
|
-
*
|
|
12
|
-
* Calls `GET ${this.#baseUrl}/market-overview`.
|
|
13
|
-
*
|
|
14
|
-
* @returns The market overview report, or `null` if none exists (404).
|
|
15
|
-
*/
|
|
16
|
-
fetchMarketOverview(): Promise<MarketOverview | null>;
|
|
17
9
|
/**
|
|
18
10
|
* Search for market insights by CAIP-19 asset identifier.
|
|
19
11
|
*
|
|
20
|
-
* Calls `GET ${this.#baseUrl}/
|
|
12
|
+
* Calls `GET ${this.#baseUrl}/digests?caipAssetType=${encodeURIComponent(caip19Id)}`.
|
|
21
13
|
*
|
|
22
14
|
* @param caip19Id - The CAIP-19 identifier of the asset.
|
|
23
15
|
* @returns The market insights report, or `null` if none exists (404).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiDigestService.d.mts","sourceRoot":"","sources":["../src/AiDigestService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AiDigestService.d.mts","sourceRoot":"","sources":["../src/AiDigestService.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB;AAGrD,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,8BAA0B;AAE7E,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AA4DF,qBAAa,eAAgB,YAAW,aAAa;;gBAGvC,MAAM,EAAE,qBAAqB;IAIzC;;;;;;;OAOG;IACG,YAAY,CAChB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;CAuBxC"}
|
package/dist/AiDigestService.mjs
CHANGED
|
@@ -10,46 +10,32 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
12
|
var _AiDigestService_baseUrl;
|
|
13
|
-
import { array,
|
|
13
|
+
import { array, is, optional, string, type as structType } from "@metamask/superstruct";
|
|
14
14
|
import { AiDigestControllerErrorMessage } from "./ai-digest-constants.mjs";
|
|
15
|
-
|
|
16
|
-
const ArticleStruct = structType({
|
|
15
|
+
const MarketInsightsArticleStruct = structType({
|
|
17
16
|
title: string(),
|
|
18
17
|
url: string(),
|
|
19
18
|
source: string(),
|
|
20
19
|
date: string(),
|
|
21
20
|
});
|
|
22
|
-
const
|
|
21
|
+
const MarketInsightsTweetStruct = structType({
|
|
23
22
|
contentSummary: string(),
|
|
24
23
|
url: string(),
|
|
25
24
|
author: string(),
|
|
26
25
|
date: string(),
|
|
27
26
|
});
|
|
28
|
-
const SourceStruct = structType({
|
|
29
|
-
name: string(),
|
|
30
|
-
url: string(),
|
|
31
|
-
type: enums(['news', 'data', 'social']),
|
|
32
|
-
});
|
|
33
|
-
const AIResponseMetadataStruct = structType({
|
|
34
|
-
provider: string(),
|
|
35
|
-
});
|
|
36
|
-
const trendCategoryValues = [
|
|
37
|
-
'geopolitical',
|
|
38
|
-
'macro',
|
|
39
|
-
'regulatory',
|
|
40
|
-
'technical',
|
|
41
|
-
'social',
|
|
42
|
-
'other',
|
|
43
|
-
];
|
|
44
|
-
const trendImpactValues = ['positive', 'negative', 'neutral'];
|
|
45
|
-
// Market Insights structs
|
|
46
27
|
const MarketInsightsTrendStruct = structType({
|
|
47
28
|
title: string(),
|
|
48
29
|
description: string(),
|
|
49
|
-
category:
|
|
50
|
-
impact:
|
|
51
|
-
articles: array(
|
|
52
|
-
tweets: array(
|
|
30
|
+
category: string(),
|
|
31
|
+
impact: string(),
|
|
32
|
+
articles: array(MarketInsightsArticleStruct),
|
|
33
|
+
tweets: array(MarketInsightsTweetStruct),
|
|
34
|
+
});
|
|
35
|
+
const MarketInsightsSourceStruct = structType({
|
|
36
|
+
name: string(),
|
|
37
|
+
url: string(),
|
|
38
|
+
type: string(),
|
|
53
39
|
});
|
|
54
40
|
const MarketInsightsReportStruct = structType({
|
|
55
41
|
version: optional(string()),
|
|
@@ -58,31 +44,12 @@ const MarketInsightsReportStruct = structType({
|
|
|
58
44
|
headline: string(),
|
|
59
45
|
summary: string(),
|
|
60
46
|
trends: array(MarketInsightsTrendStruct),
|
|
61
|
-
social: optional(array(
|
|
62
|
-
sources: array(
|
|
63
|
-
metadata: optional(array(AIResponseMetadataStruct)),
|
|
47
|
+
social: optional(array(MarketInsightsTweetStruct)),
|
|
48
|
+
sources: array(MarketInsightsSourceStruct),
|
|
64
49
|
});
|
|
65
50
|
const MarketInsightsDigestEnvelopeStruct = structType({
|
|
66
51
|
digest: MarketInsightsReportStruct,
|
|
67
52
|
});
|
|
68
|
-
// Market Overview structs
|
|
69
|
-
const MarketOverviewTrendStruct = structType({
|
|
70
|
-
title: string(),
|
|
71
|
-
description: string(),
|
|
72
|
-
category: enums(trendCategoryValues),
|
|
73
|
-
impact: enums(trendImpactValues),
|
|
74
|
-
articles: array(ArticleStruct),
|
|
75
|
-
relatedAssets: array(string()),
|
|
76
|
-
});
|
|
77
|
-
const MarketOverviewStruct = structType({
|
|
78
|
-
version: optional(string()),
|
|
79
|
-
generatedAt: string(),
|
|
80
|
-
headline: string(),
|
|
81
|
-
summary: string(),
|
|
82
|
-
trends: array(MarketOverviewTrendStruct),
|
|
83
|
-
sources: array(SourceStruct),
|
|
84
|
-
metadata: optional(array(AIResponseMetadataStruct)),
|
|
85
|
-
});
|
|
86
53
|
const getNormalizedMarketInsightsReport = (value) => {
|
|
87
54
|
if (is(value, MarketInsightsReportStruct)) {
|
|
88
55
|
return value;
|
|
@@ -97,37 +64,16 @@ export class AiDigestService {
|
|
|
97
64
|
_AiDigestService_baseUrl.set(this, void 0);
|
|
98
65
|
__classPrivateFieldSet(this, _AiDigestService_baseUrl, config.baseUrl, "f");
|
|
99
66
|
}
|
|
100
|
-
/**
|
|
101
|
-
* Fetch the market overview report.
|
|
102
|
-
*
|
|
103
|
-
* Calls `GET ${this.#baseUrl}/market-overview`.
|
|
104
|
-
*
|
|
105
|
-
* @returns The market overview report, or `null` if none exists (404).
|
|
106
|
-
*/
|
|
107
|
-
async fetchMarketOverview() {
|
|
108
|
-
const response = await fetch(`${__classPrivateFieldGet(this, _AiDigestService_baseUrl, "f")}/market-overview`);
|
|
109
|
-
if (response.status === 404) {
|
|
110
|
-
return null;
|
|
111
|
-
}
|
|
112
|
-
if (!response.ok) {
|
|
113
|
-
throw new Error(`${AiDigestControllerErrorMessage.API_REQUEST_FAILED}: ${response.status}`);
|
|
114
|
-
}
|
|
115
|
-
const body = await response.json();
|
|
116
|
-
if (!is(body, MarketOverviewStruct)) {
|
|
117
|
-
throw new Error(AiDigestControllerErrorMessage.API_INVALID_RESPONSE);
|
|
118
|
-
}
|
|
119
|
-
return body;
|
|
120
|
-
}
|
|
121
67
|
/**
|
|
122
68
|
* Search for market insights by CAIP-19 asset identifier.
|
|
123
69
|
*
|
|
124
|
-
* Calls `GET ${this.#baseUrl}/
|
|
70
|
+
* Calls `GET ${this.#baseUrl}/digests?caipAssetType=${encodeURIComponent(caip19Id)}`.
|
|
125
71
|
*
|
|
126
72
|
* @param caip19Id - The CAIP-19 identifier of the asset.
|
|
127
73
|
* @returns The market insights report, or `null` if none exists (404).
|
|
128
74
|
*/
|
|
129
75
|
async searchDigest(caip19Id) {
|
|
130
|
-
const response = await fetch(`${__classPrivateFieldGet(this, _AiDigestService_baseUrl, "f")}/
|
|
76
|
+
const response = await fetch(`${__classPrivateFieldGet(this, _AiDigestService_baseUrl, "f")}/digests?caipAssetType=${encodeURIComponent(caip19Id)}`);
|
|
131
77
|
if (response.status === 404) {
|
|
132
78
|
return null;
|
|
133
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiDigestService.mjs","sourceRoot":"","sources":["../src/AiDigestService.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EACL,KAAK,EACL,
|
|
1
|
+
{"version":3,"file":"AiDigestService.mjs","sourceRoot":"","sources":["../src/AiDigestService.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n array,\n is,\n optional,\n string,\n type as structType,\n} from '@metamask/superstruct';\nimport type { CaipAssetType } from '@metamask/utils';\n\nimport { AiDigestControllerErrorMessage } from './ai-digest-constants';\nimport type { DigestService, MarketInsightsReport } from './ai-digest-types';\n\nexport type AiDigestServiceConfig = {\n baseUrl: string;\n};\n\nconst MarketInsightsArticleStruct = structType({\n title: string(),\n url: string(),\n source: string(),\n date: string(),\n});\n\nconst MarketInsightsTweetStruct = structType({\n contentSummary: string(),\n url: string(),\n author: string(),\n date: string(),\n});\n\nconst MarketInsightsTrendStruct = structType({\n title: string(),\n description: string(),\n category: string(),\n impact: string(),\n articles: array(MarketInsightsArticleStruct),\n tweets: array(MarketInsightsTweetStruct),\n});\n\nconst MarketInsightsSourceStruct = structType({\n name: string(),\n url: string(),\n type: string(),\n});\n\nconst MarketInsightsReportStruct = structType({\n version: optional(string()),\n asset: string(),\n generatedAt: string(),\n headline: string(),\n summary: string(),\n trends: array(MarketInsightsTrendStruct),\n social: optional(array(MarketInsightsTweetStruct)),\n sources: array(MarketInsightsSourceStruct),\n});\n\nconst MarketInsightsDigestEnvelopeStruct = structType({\n digest: MarketInsightsReportStruct,\n});\n\nconst getNormalizedMarketInsightsReport = (\n value: unknown,\n): MarketInsightsReport | null => {\n if (is(value, MarketInsightsReportStruct)) {\n return value;\n }\n\n if (is(value, MarketInsightsDigestEnvelopeStruct)) {\n return value.digest;\n }\n\n return null;\n};\n\nexport class AiDigestService implements DigestService {\n readonly #baseUrl: string;\n\n constructor(config: AiDigestServiceConfig) {\n this.#baseUrl = config.baseUrl;\n }\n\n /**\n * Search for market insights by CAIP-19 asset identifier.\n *\n * Calls `GET ${this.#baseUrl}/digests?caipAssetType=${encodeURIComponent(caip19Id)}`.\n *\n * @param caip19Id - The CAIP-19 identifier of the asset.\n * @returns The market insights report, or `null` if none exists (404).\n */\n async searchDigest(\n caip19Id: CaipAssetType,\n ): Promise<MarketInsightsReport | null> {\n const response = await fetch(\n `${this.#baseUrl}/digests?caipAssetType=${encodeURIComponent(caip19Id)}`,\n );\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n throw new Error(\n `${AiDigestControllerErrorMessage.API_REQUEST_FAILED}: ${response.status}`,\n );\n }\n\n const report = getNormalizedMarketInsightsReport(await response.json());\n\n if (!report) {\n throw new Error(AiDigestControllerErrorMessage.API_INVALID_RESPONSE);\n }\n\n return report;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-digest-types.cjs","sourceRoot":"","sources":["../src/ai-digest-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { CaipAssetType } from '@metamask/utils';\n\n// ---------------------------------------------------------------------------\n//
|
|
1
|
+
{"version":3,"file":"ai-digest-types.cjs","sourceRoot":"","sources":["../src/ai-digest-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { CaipAssetType } from '@metamask/utils';\n\n// ---------------------------------------------------------------------------\n// Market Insights types\n// ---------------------------------------------------------------------------\n\n/**\n * A news article referenced by a market insight trend.\n */\nexport type MarketInsightsArticle = {\n /** Article title */\n title: string;\n /** Full URL to the article */\n url: string;\n /** Source domain name (e.g. \"coindesk.com\") */\n source: string;\n /** ISO date string */\n date: string;\n};\n\n/**\n * A social media post referenced by a market insight trend.\n */\nexport type MarketInsightsTweet = {\n /** Summary of the tweet content */\n contentSummary: string;\n /** Full URL to the tweet */\n url: string;\n /** Author handle (e.g. \"@saylordocs\") */\n author: string;\n /** ISO date string */\n date: string;\n};\n\n/**\n * A key market trend identified in the insights report.\n */\nexport type MarketInsightsTrend = {\n /** Trend title (e.g. \"Institutions Buying the Dip\") */\n title: string;\n /** Detailed description of the trend */\n description: string;\n /** Category of the trend */\n category: 'macro' | 'technical' | 'social' | string;\n /** Impact direction */\n impact: 'positive' | 'negative' | 'neutral' | string;\n /** Related news articles */\n articles: MarketInsightsArticle[];\n /** Related social media posts */\n tweets: MarketInsightsTweet[];\n};\n\n/**\n * A data source used to generate the market insights report.\n */\nexport type MarketInsightsSource = {\n /** Source name (e.g. \"CoinDesk\") */\n name: string;\n /** Source URL */\n url: string;\n /** Source type */\n type: 'news' | 'data' | 'social' | string;\n};\n\n/**\n * AI-generated market insights report for a crypto asset.\n * Returned by `GET /digests?caipAssetType=<caip19Id>`.\n */\nexport type MarketInsightsReport = {\n /** API version */\n version?: string;\n /** Asset symbol (lowercase, e.g. \"btc\") */\n asset: string;\n /** ISO date string when the report was generated */\n generatedAt: string;\n /** Main headline */\n headline: string;\n /** Summary paragraph */\n summary: string;\n /** Key market trends */\n trends: MarketInsightsTrend[];\n /** Optional top-level social posts included by the API */\n social?: MarketInsightsTweet[];\n /** Data sources used to generate the report */\n sources: MarketInsightsSource[];\n};\n\n/**\n * A cached market insights entry.\n */\nexport type MarketInsightsEntry = {\n /** CAIP-19 asset identifier */\n caip19Id: CaipAssetType;\n /** Timestamp when the entry was fetched */\n fetchedAt: number;\n /** The market insights report data */\n data: MarketInsightsReport;\n};\n\n// ---------------------------------------------------------------------------\n// Controller state\n// ---------------------------------------------------------------------------\n\nexport type AiDigestControllerState = {\n marketInsights: Record<string, MarketInsightsEntry>;\n};\n\n// ---------------------------------------------------------------------------\n// Service interface\n// ---------------------------------------------------------------------------\n\nexport type DigestService = {\n /**\n * Search for market insights by CAIP-19 asset identifier.\n * Calls `GET /digests?caipAssetType=<caip19Id>`.\n *\n * @param caip19Id - The CAIP-19 identifier of the asset.\n * @returns The market insights report, or `null` if no insights exist (404).\n */\n searchDigest(caip19Id: CaipAssetType): Promise<MarketInsightsReport | null>;\n};\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { CaipAssetType } from "@metamask/utils";
|
|
2
2
|
/**
|
|
3
|
-
* A news article referenced by a trend.
|
|
3
|
+
* A news article referenced by a market insight trend.
|
|
4
4
|
*/
|
|
5
|
-
export type
|
|
5
|
+
export type MarketInsightsArticle = {
|
|
6
6
|
/** Article title */
|
|
7
7
|
title: string;
|
|
8
8
|
/** Full URL to the article */
|
|
@@ -13,9 +13,9 @@ export type Article = {
|
|
|
13
13
|
date: string;
|
|
14
14
|
};
|
|
15
15
|
/**
|
|
16
|
-
* A social media post referenced by a trend.
|
|
16
|
+
* A social media post referenced by a market insight trend.
|
|
17
17
|
*/
|
|
18
|
-
export type
|
|
18
|
+
export type MarketInsightsTweet = {
|
|
19
19
|
/** Summary of the tweet content */
|
|
20
20
|
contentSummary: string;
|
|
21
21
|
/** Full URL to the tweet */
|
|
@@ -25,20 +25,6 @@ export type Tweet = {
|
|
|
25
25
|
/** ISO date string */
|
|
26
26
|
date: string;
|
|
27
27
|
};
|
|
28
|
-
/**
|
|
29
|
-
* A data source used to generate a report.
|
|
30
|
-
*/
|
|
31
|
-
export type Source = {
|
|
32
|
-
/** Source name (e.g. "CoinDesk") */
|
|
33
|
-
name: string;
|
|
34
|
-
/** Source URL */
|
|
35
|
-
url: string;
|
|
36
|
-
/** Source type */
|
|
37
|
-
type: 'news' | 'data' | 'social';
|
|
38
|
-
};
|
|
39
|
-
export type MarketInsightsArticle = Article;
|
|
40
|
-
export type MarketInsightsTweet = Tweet;
|
|
41
|
-
export type MarketInsightsSource = Source;
|
|
42
28
|
/**
|
|
43
29
|
* A key market trend identified in the insights report.
|
|
44
30
|
*/
|
|
@@ -48,13 +34,24 @@ export type MarketInsightsTrend = {
|
|
|
48
34
|
/** Detailed description of the trend */
|
|
49
35
|
description: string;
|
|
50
36
|
/** Category of the trend */
|
|
51
|
-
category: '
|
|
37
|
+
category: 'macro' | 'technical' | 'social' | string;
|
|
52
38
|
/** Impact direction */
|
|
53
|
-
impact: 'positive' | 'negative' | 'neutral';
|
|
39
|
+
impact: 'positive' | 'negative' | 'neutral' | string;
|
|
54
40
|
/** Related news articles */
|
|
55
|
-
articles:
|
|
41
|
+
articles: MarketInsightsArticle[];
|
|
56
42
|
/** Related social media posts */
|
|
57
|
-
tweets:
|
|
43
|
+
tweets: MarketInsightsTweet[];
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* A data source used to generate the market insights report.
|
|
47
|
+
*/
|
|
48
|
+
export type MarketInsightsSource = {
|
|
49
|
+
/** Source name (e.g. "CoinDesk") */
|
|
50
|
+
name: string;
|
|
51
|
+
/** Source URL */
|
|
52
|
+
url: string;
|
|
53
|
+
/** Source type */
|
|
54
|
+
type: 'news' | 'data' | 'social' | string;
|
|
58
55
|
};
|
|
59
56
|
/**
|
|
60
57
|
* AI-generated market insights report for a crypto asset.
|
|
@@ -74,11 +71,9 @@ export type MarketInsightsReport = {
|
|
|
74
71
|
/** Key market trends */
|
|
75
72
|
trends: MarketInsightsTrend[];
|
|
76
73
|
/** Optional top-level social posts included by the API */
|
|
77
|
-
social?:
|
|
74
|
+
social?: MarketInsightsTweet[];
|
|
78
75
|
/** Data sources used to generate the report */
|
|
79
|
-
sources:
|
|
80
|
-
/** Provider metadata */
|
|
81
|
-
metadata?: AIResponseMetadata[];
|
|
76
|
+
sources: MarketInsightsSource[];
|
|
82
77
|
};
|
|
83
78
|
/**
|
|
84
79
|
* A cached market insights entry.
|
|
@@ -91,57 +86,17 @@ export type MarketInsightsEntry = {
|
|
|
91
86
|
/** The market insights report data */
|
|
92
87
|
data: MarketInsightsReport;
|
|
93
88
|
};
|
|
94
|
-
/**
|
|
95
|
-
* A cached market overview entry.
|
|
96
|
-
*/
|
|
97
|
-
export type MarketOverviewEntry = {
|
|
98
|
-
/** Timestamp when the entry was fetched */
|
|
99
|
-
fetchedAt: number;
|
|
100
|
-
/** The market overview data */
|
|
101
|
-
data: MarketOverview;
|
|
102
|
-
};
|
|
103
|
-
export type MarketOverviewTrend = {
|
|
104
|
-
title: string;
|
|
105
|
-
description: string;
|
|
106
|
-
category: 'geopolitical' | 'macro' | 'regulatory' | 'technical' | 'social' | 'other';
|
|
107
|
-
impact: 'positive' | 'negative' | 'neutral';
|
|
108
|
-
articles: Article[];
|
|
109
|
-
relatedAssets: string[];
|
|
110
|
-
};
|
|
111
|
-
/**
|
|
112
|
-
* Provider metadata included in AI API responses.
|
|
113
|
-
*/
|
|
114
|
-
export type AIResponseMetadata = {
|
|
115
|
-
provider: string;
|
|
116
|
-
};
|
|
117
|
-
export type MarketOverview = {
|
|
118
|
-
version?: string;
|
|
119
|
-
generatedAt: string;
|
|
120
|
-
headline: string;
|
|
121
|
-
summary: string;
|
|
122
|
-
trends: MarketOverviewTrend[];
|
|
123
|
-
sources: Source[];
|
|
124
|
-
metadata?: AIResponseMetadata[];
|
|
125
|
-
};
|
|
126
89
|
export type AiDigestControllerState = {
|
|
127
90
|
marketInsights: Record<string, MarketInsightsEntry>;
|
|
128
|
-
marketOverview: MarketOverviewEntry | null;
|
|
129
91
|
};
|
|
130
92
|
export type DigestService = {
|
|
131
93
|
/**
|
|
132
94
|
* Search for market insights by CAIP-19 asset identifier.
|
|
133
|
-
* Calls `GET /
|
|
95
|
+
* Calls `GET /digests?caipAssetType=<caip19Id>`.
|
|
134
96
|
*
|
|
135
97
|
* @param caip19Id - The CAIP-19 identifier of the asset.
|
|
136
98
|
* @returns The market insights report, or `null` if no insights exist (404).
|
|
137
99
|
*/
|
|
138
100
|
searchDigest(caip19Id: CaipAssetType): Promise<MarketInsightsReport | null>;
|
|
139
|
-
/**
|
|
140
|
-
* Fetch the market overview report.
|
|
141
|
-
* Calls `GET /market-overview`.
|
|
142
|
-
*
|
|
143
|
-
* @returns The market overview report, or `null` if none exists (404).
|
|
144
|
-
*/
|
|
145
|
-
fetchMarketOverview(): Promise<MarketOverview | null>;
|
|
146
101
|
};
|
|
147
102
|
//# sourceMappingURL=ai-digest-types.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-digest-types.d.cts","sourceRoot":"","sources":["../src/ai-digest-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB;AAMrD;;GAEG;AACH,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"ai-digest-types.d.cts","sourceRoot":"","sources":["../src/ai-digest-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB;AAMrD;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,mCAAmC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,QAAQ,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpD,uBAAuB;IACvB,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IACrD,4BAA4B;IAC5B,QAAQ,EAAE,qBAAqB,EAAE,CAAC;IAClC,iCAAiC;IACjC,MAAM,EAAE,mBAAmB,EAAE,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB;IAClB,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;CAC3C,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,kBAAkB;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC/B,+CAA+C;IAC/C,OAAO,EAAE,oBAAoB,EAAE,CAAC;CACjC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,+BAA+B;IAC/B,QAAQ,EAAE,aAAa,CAAC;IACxB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,IAAI,EAAE,oBAAoB,CAAC;CAC5B,CAAC;AAMF,MAAM,MAAM,uBAAuB,GAAG;IACpC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CACrD,CAAC;AAMF,MAAM,MAAM,aAAa,GAAG;IAC1B;;;;;;OAMG;IACH,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;CAC7E,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { CaipAssetType } from "@metamask/utils";
|
|
2
2
|
/**
|
|
3
|
-
* A news article referenced by a trend.
|
|
3
|
+
* A news article referenced by a market insight trend.
|
|
4
4
|
*/
|
|
5
|
-
export type
|
|
5
|
+
export type MarketInsightsArticle = {
|
|
6
6
|
/** Article title */
|
|
7
7
|
title: string;
|
|
8
8
|
/** Full URL to the article */
|
|
@@ -13,9 +13,9 @@ export type Article = {
|
|
|
13
13
|
date: string;
|
|
14
14
|
};
|
|
15
15
|
/**
|
|
16
|
-
* A social media post referenced by a trend.
|
|
16
|
+
* A social media post referenced by a market insight trend.
|
|
17
17
|
*/
|
|
18
|
-
export type
|
|
18
|
+
export type MarketInsightsTweet = {
|
|
19
19
|
/** Summary of the tweet content */
|
|
20
20
|
contentSummary: string;
|
|
21
21
|
/** Full URL to the tweet */
|
|
@@ -25,20 +25,6 @@ export type Tweet = {
|
|
|
25
25
|
/** ISO date string */
|
|
26
26
|
date: string;
|
|
27
27
|
};
|
|
28
|
-
/**
|
|
29
|
-
* A data source used to generate a report.
|
|
30
|
-
*/
|
|
31
|
-
export type Source = {
|
|
32
|
-
/** Source name (e.g. "CoinDesk") */
|
|
33
|
-
name: string;
|
|
34
|
-
/** Source URL */
|
|
35
|
-
url: string;
|
|
36
|
-
/** Source type */
|
|
37
|
-
type: 'news' | 'data' | 'social';
|
|
38
|
-
};
|
|
39
|
-
export type MarketInsightsArticle = Article;
|
|
40
|
-
export type MarketInsightsTweet = Tweet;
|
|
41
|
-
export type MarketInsightsSource = Source;
|
|
42
28
|
/**
|
|
43
29
|
* A key market trend identified in the insights report.
|
|
44
30
|
*/
|
|
@@ -48,13 +34,24 @@ export type MarketInsightsTrend = {
|
|
|
48
34
|
/** Detailed description of the trend */
|
|
49
35
|
description: string;
|
|
50
36
|
/** Category of the trend */
|
|
51
|
-
category: '
|
|
37
|
+
category: 'macro' | 'technical' | 'social' | string;
|
|
52
38
|
/** Impact direction */
|
|
53
|
-
impact: 'positive' | 'negative' | 'neutral';
|
|
39
|
+
impact: 'positive' | 'negative' | 'neutral' | string;
|
|
54
40
|
/** Related news articles */
|
|
55
|
-
articles:
|
|
41
|
+
articles: MarketInsightsArticle[];
|
|
56
42
|
/** Related social media posts */
|
|
57
|
-
tweets:
|
|
43
|
+
tweets: MarketInsightsTweet[];
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* A data source used to generate the market insights report.
|
|
47
|
+
*/
|
|
48
|
+
export type MarketInsightsSource = {
|
|
49
|
+
/** Source name (e.g. "CoinDesk") */
|
|
50
|
+
name: string;
|
|
51
|
+
/** Source URL */
|
|
52
|
+
url: string;
|
|
53
|
+
/** Source type */
|
|
54
|
+
type: 'news' | 'data' | 'social' | string;
|
|
58
55
|
};
|
|
59
56
|
/**
|
|
60
57
|
* AI-generated market insights report for a crypto asset.
|
|
@@ -74,11 +71,9 @@ export type MarketInsightsReport = {
|
|
|
74
71
|
/** Key market trends */
|
|
75
72
|
trends: MarketInsightsTrend[];
|
|
76
73
|
/** Optional top-level social posts included by the API */
|
|
77
|
-
social?:
|
|
74
|
+
social?: MarketInsightsTweet[];
|
|
78
75
|
/** Data sources used to generate the report */
|
|
79
|
-
sources:
|
|
80
|
-
/** Provider metadata */
|
|
81
|
-
metadata?: AIResponseMetadata[];
|
|
76
|
+
sources: MarketInsightsSource[];
|
|
82
77
|
};
|
|
83
78
|
/**
|
|
84
79
|
* A cached market insights entry.
|
|
@@ -91,57 +86,17 @@ export type MarketInsightsEntry = {
|
|
|
91
86
|
/** The market insights report data */
|
|
92
87
|
data: MarketInsightsReport;
|
|
93
88
|
};
|
|
94
|
-
/**
|
|
95
|
-
* A cached market overview entry.
|
|
96
|
-
*/
|
|
97
|
-
export type MarketOverviewEntry = {
|
|
98
|
-
/** Timestamp when the entry was fetched */
|
|
99
|
-
fetchedAt: number;
|
|
100
|
-
/** The market overview data */
|
|
101
|
-
data: MarketOverview;
|
|
102
|
-
};
|
|
103
|
-
export type MarketOverviewTrend = {
|
|
104
|
-
title: string;
|
|
105
|
-
description: string;
|
|
106
|
-
category: 'geopolitical' | 'macro' | 'regulatory' | 'technical' | 'social' | 'other';
|
|
107
|
-
impact: 'positive' | 'negative' | 'neutral';
|
|
108
|
-
articles: Article[];
|
|
109
|
-
relatedAssets: string[];
|
|
110
|
-
};
|
|
111
|
-
/**
|
|
112
|
-
* Provider metadata included in AI API responses.
|
|
113
|
-
*/
|
|
114
|
-
export type AIResponseMetadata = {
|
|
115
|
-
provider: string;
|
|
116
|
-
};
|
|
117
|
-
export type MarketOverview = {
|
|
118
|
-
version?: string;
|
|
119
|
-
generatedAt: string;
|
|
120
|
-
headline: string;
|
|
121
|
-
summary: string;
|
|
122
|
-
trends: MarketOverviewTrend[];
|
|
123
|
-
sources: Source[];
|
|
124
|
-
metadata?: AIResponseMetadata[];
|
|
125
|
-
};
|
|
126
89
|
export type AiDigestControllerState = {
|
|
127
90
|
marketInsights: Record<string, MarketInsightsEntry>;
|
|
128
|
-
marketOverview: MarketOverviewEntry | null;
|
|
129
91
|
};
|
|
130
92
|
export type DigestService = {
|
|
131
93
|
/**
|
|
132
94
|
* Search for market insights by CAIP-19 asset identifier.
|
|
133
|
-
* Calls `GET /
|
|
95
|
+
* Calls `GET /digests?caipAssetType=<caip19Id>`.
|
|
134
96
|
*
|
|
135
97
|
* @param caip19Id - The CAIP-19 identifier of the asset.
|
|
136
98
|
* @returns The market insights report, or `null` if no insights exist (404).
|
|
137
99
|
*/
|
|
138
100
|
searchDigest(caip19Id: CaipAssetType): Promise<MarketInsightsReport | null>;
|
|
139
|
-
/**
|
|
140
|
-
* Fetch the market overview report.
|
|
141
|
-
* Calls `GET /market-overview`.
|
|
142
|
-
*
|
|
143
|
-
* @returns The market overview report, or `null` if none exists (404).
|
|
144
|
-
*/
|
|
145
|
-
fetchMarketOverview(): Promise<MarketOverview | null>;
|
|
146
101
|
};
|
|
147
102
|
//# sourceMappingURL=ai-digest-types.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-digest-types.d.mts","sourceRoot":"","sources":["../src/ai-digest-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB;AAMrD;;GAEG;AACH,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"ai-digest-types.d.mts","sourceRoot":"","sources":["../src/ai-digest-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB;AAMrD;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,mCAAmC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,QAAQ,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpD,uBAAuB;IACvB,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IACrD,4BAA4B;IAC5B,QAAQ,EAAE,qBAAqB,EAAE,CAAC;IAClC,iCAAiC;IACjC,MAAM,EAAE,mBAAmB,EAAE,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,kBAAkB;IAClB,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;CAC3C,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,kBAAkB;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAC/B,+CAA+C;IAC/C,OAAO,EAAE,oBAAoB,EAAE,CAAC;CACjC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,+BAA+B;IAC/B,QAAQ,EAAE,aAAa,CAAC;IACxB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,IAAI,EAAE,oBAAoB,CAAC;CAC5B,CAAC;AAMF,MAAM,MAAM,uBAAuB,GAAG;IACpC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CACrD,CAAC;AAMF,MAAM,MAAM,aAAa,GAAG;IAC1B;;;;;;OAMG;IACH,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;CAC7E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-digest-types.mjs","sourceRoot":"","sources":["../src/ai-digest-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { CaipAssetType } from '@metamask/utils';\n\n// ---------------------------------------------------------------------------\n//
|
|
1
|
+
{"version":3,"file":"ai-digest-types.mjs","sourceRoot":"","sources":["../src/ai-digest-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { CaipAssetType } from '@metamask/utils';\n\n// ---------------------------------------------------------------------------\n// Market Insights types\n// ---------------------------------------------------------------------------\n\n/**\n * A news article referenced by a market insight trend.\n */\nexport type MarketInsightsArticle = {\n /** Article title */\n title: string;\n /** Full URL to the article */\n url: string;\n /** Source domain name (e.g. \"coindesk.com\") */\n source: string;\n /** ISO date string */\n date: string;\n};\n\n/**\n * A social media post referenced by a market insight trend.\n */\nexport type MarketInsightsTweet = {\n /** Summary of the tweet content */\n contentSummary: string;\n /** Full URL to the tweet */\n url: string;\n /** Author handle (e.g. \"@saylordocs\") */\n author: string;\n /** ISO date string */\n date: string;\n};\n\n/**\n * A key market trend identified in the insights report.\n */\nexport type MarketInsightsTrend = {\n /** Trend title (e.g. \"Institutions Buying the Dip\") */\n title: string;\n /** Detailed description of the trend */\n description: string;\n /** Category of the trend */\n category: 'macro' | 'technical' | 'social' | string;\n /** Impact direction */\n impact: 'positive' | 'negative' | 'neutral' | string;\n /** Related news articles */\n articles: MarketInsightsArticle[];\n /** Related social media posts */\n tweets: MarketInsightsTweet[];\n};\n\n/**\n * A data source used to generate the market insights report.\n */\nexport type MarketInsightsSource = {\n /** Source name (e.g. \"CoinDesk\") */\n name: string;\n /** Source URL */\n url: string;\n /** Source type */\n type: 'news' | 'data' | 'social' | string;\n};\n\n/**\n * AI-generated market insights report for a crypto asset.\n * Returned by `GET /digests?caipAssetType=<caip19Id>`.\n */\nexport type MarketInsightsReport = {\n /** API version */\n version?: string;\n /** Asset symbol (lowercase, e.g. \"btc\") */\n asset: string;\n /** ISO date string when the report was generated */\n generatedAt: string;\n /** Main headline */\n headline: string;\n /** Summary paragraph */\n summary: string;\n /** Key market trends */\n trends: MarketInsightsTrend[];\n /** Optional top-level social posts included by the API */\n social?: MarketInsightsTweet[];\n /** Data sources used to generate the report */\n sources: MarketInsightsSource[];\n};\n\n/**\n * A cached market insights entry.\n */\nexport type MarketInsightsEntry = {\n /** CAIP-19 asset identifier */\n caip19Id: CaipAssetType;\n /** Timestamp when the entry was fetched */\n fetchedAt: number;\n /** The market insights report data */\n data: MarketInsightsReport;\n};\n\n// ---------------------------------------------------------------------------\n// Controller state\n// ---------------------------------------------------------------------------\n\nexport type AiDigestControllerState = {\n marketInsights: Record<string, MarketInsightsEntry>;\n};\n\n// ---------------------------------------------------------------------------\n// Service interface\n// ---------------------------------------------------------------------------\n\nexport type DigestService = {\n /**\n * Search for market insights by CAIP-19 asset identifier.\n * Calls `GET /digests?caipAssetType=<caip19Id>`.\n *\n * @param caip19Id - The CAIP-19 identifier of the asset.\n * @returns The market insights report, or `null` if no insights exist (404).\n */\n searchDigest(caip19Id: CaipAssetType): Promise<MarketInsightsReport | null>;\n};\n"]}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AASA,+DAG8B;AAF5B,wHAAA,kBAAkB,OAAA;AAClB,uIAAA,iCAAiC,OAAA;AAInC,yDAAoD;AAA3C,kHAAA,eAAe,OAAA;AAaxB,iEAK+B;AAJ7B,6HAAA,cAAc,OAA0B;AACxC,wHAAA,iBAAiB,OAAA;AACjB,wHAAA,iBAAiB,OAAA;AACjB,qIAAA,8BAA8B,OAAA","sourcesContent":["export type {\n AiDigestControllerActions,\n AiDigestControllerEvents,\n AiDigestControllerFetchMarketInsightsAction,\n AiDigestControllerGetStateAction,\n AiDigestControllerMessenger,\n AiDigestControllerOptions,\n AiDigestControllerStateChangeEvent,\n} from './AiDigestController';\nexport {\n AiDigestController,\n getDefaultAiDigestControllerState,\n} from './AiDigestController';\n\nexport type { AiDigestServiceConfig } from './AiDigestService';\nexport { AiDigestService } from './AiDigestService';\n\nexport type {\n AiDigestControllerState,\n DigestService,\n MarketInsightsArticle,\n MarketInsightsTweet,\n MarketInsightsTrend,\n MarketInsightsSource,\n MarketInsightsReport,\n MarketInsightsEntry,\n} from './ai-digest-types';\n\nexport {\n controllerName as aiDigestControllerName,\n CACHE_DURATION_MS,\n MAX_CACHE_ENTRIES,\n AiDigestControllerErrorMessage,\n} from './ai-digest-constants';\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export type { AiDigestControllerActions, AiDigestControllerEvents, AiDigestControllerFetchMarketInsightsAction,
|
|
1
|
+
export type { AiDigestControllerActions, AiDigestControllerEvents, AiDigestControllerFetchMarketInsightsAction, AiDigestControllerGetStateAction, AiDigestControllerMessenger, AiDigestControllerOptions, AiDigestControllerStateChangeEvent, } from "./AiDigestController.cjs";
|
|
2
2
|
export { AiDigestController, getDefaultAiDigestControllerState, } from "./AiDigestController.cjs";
|
|
3
3
|
export type { AiDigestServiceConfig } from "./AiDigestService.cjs";
|
|
4
4
|
export { AiDigestService } from "./AiDigestService.cjs";
|
|
5
|
-
export type { AiDigestControllerState,
|
|
5
|
+
export type { AiDigestControllerState, DigestService, MarketInsightsArticle, MarketInsightsTweet, MarketInsightsTrend, MarketInsightsSource, MarketInsightsReport, MarketInsightsEntry, } from "./ai-digest-types.cjs";
|
|
6
6
|
export { controllerName as aiDigestControllerName, CACHE_DURATION_MS, MAX_CACHE_ENTRIES, AiDigestControllerErrorMessage, } from "./ai-digest-constants.cjs";
|
|
7
7
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,2CAA2C,EAC3C,
|
|
1
|
+
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,2CAA2C,EAC3C,gCAAgC,EAChC,2BAA2B,EAC3B,yBAAyB,EACzB,kCAAkC,GACnC,iCAA6B;AAC9B,OAAO,EACL,kBAAkB,EAClB,iCAAiC,GAClC,iCAA6B;AAE9B,YAAY,EAAE,qBAAqB,EAAE,8BAA0B;AAC/D,OAAO,EAAE,eAAe,EAAE,8BAA0B;AAEpD,YAAY,EACV,uBAAuB,EACvB,aAAa,EACb,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GACpB,8BAA0B;AAE3B,OAAO,EACL,cAAc,IAAI,sBAAsB,EACxC,iBAAiB,EACjB,iBAAiB,EACjB,8BAA8B,GAC/B,kCAA8B"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export type { AiDigestControllerActions, AiDigestControllerEvents, AiDigestControllerFetchMarketInsightsAction,
|
|
1
|
+
export type { AiDigestControllerActions, AiDigestControllerEvents, AiDigestControllerFetchMarketInsightsAction, AiDigestControllerGetStateAction, AiDigestControllerMessenger, AiDigestControllerOptions, AiDigestControllerStateChangeEvent, } from "./AiDigestController.mjs";
|
|
2
2
|
export { AiDigestController, getDefaultAiDigestControllerState, } from "./AiDigestController.mjs";
|
|
3
3
|
export type { AiDigestServiceConfig } from "./AiDigestService.mjs";
|
|
4
4
|
export { AiDigestService } from "./AiDigestService.mjs";
|
|
5
|
-
export type { AiDigestControllerState,
|
|
5
|
+
export type { AiDigestControllerState, DigestService, MarketInsightsArticle, MarketInsightsTweet, MarketInsightsTrend, MarketInsightsSource, MarketInsightsReport, MarketInsightsEntry, } from "./ai-digest-types.mjs";
|
|
6
6
|
export { controllerName as aiDigestControllerName, CACHE_DURATION_MS, MAX_CACHE_ENTRIES, AiDigestControllerErrorMessage, } from "./ai-digest-constants.mjs";
|
|
7
7
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,2CAA2C,EAC3C,
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,2CAA2C,EAC3C,gCAAgC,EAChC,2BAA2B,EAC3B,yBAAyB,EACzB,kCAAkC,GACnC,iCAA6B;AAC9B,OAAO,EACL,kBAAkB,EAClB,iCAAiC,GAClC,iCAA6B;AAE9B,YAAY,EAAE,qBAAqB,EAAE,8BAA0B;AAC/D,OAAO,EAAE,eAAe,EAAE,8BAA0B;AAEpD,YAAY,EACV,uBAAuB,EACvB,aAAa,EACb,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GACpB,8BAA0B;AAE3B,OAAO,EACL,cAAc,IAAI,sBAAsB,EACxC,iBAAiB,EACjB,iBAAiB,EACjB,8BAA8B,GAC/B,kCAA8B"}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EACL,kBAAkB,EAClB,iCAAiC,EAClC,iCAA6B;AAG9B,OAAO,EAAE,eAAe,EAAE,8BAA0B;AAapD,OAAO,EACL,cAAc,IAAI,sBAAsB,EACxC,iBAAiB,EACjB,iBAAiB,EACjB,8BAA8B,EAC/B,kCAA8B","sourcesContent":["export type {\n AiDigestControllerActions,\n AiDigestControllerEvents,\n AiDigestControllerFetchMarketInsightsAction,\n AiDigestControllerGetStateAction,\n AiDigestControllerMessenger,\n AiDigestControllerOptions,\n AiDigestControllerStateChangeEvent,\n} from './AiDigestController';\nexport {\n AiDigestController,\n getDefaultAiDigestControllerState,\n} from './AiDigestController';\n\nexport type { AiDigestServiceConfig } from './AiDigestService';\nexport { AiDigestService } from './AiDigestService';\n\nexport type {\n AiDigestControllerState,\n DigestService,\n MarketInsightsArticle,\n MarketInsightsTweet,\n MarketInsightsTrend,\n MarketInsightsSource,\n MarketInsightsReport,\n MarketInsightsEntry,\n} from './ai-digest-types';\n\nexport {\n controllerName as aiDigestControllerName,\n CACHE_DURATION_MS,\n MAX_CACHE_ENTRIES,\n AiDigestControllerErrorMessage,\n} from './ai-digest-constants';\n"]}
|