@tradejs/app 1.0.0 → 1.0.3
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/package.json +16 -7
- package/src/app/api/ai/route.ts +11 -4
- package/src/app/api/indicators/route.ts +5 -3
- package/src/app/api/kline/[provider]/[symbol]/[interval]/route.ts +7 -4
- package/src/app/api/scanner/[provider]/route.ts +4 -2
- package/src/app/api/scanner/route.ts +6 -1
- package/tsconfig.json +9 -8
package/package.json
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tradejs/app",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
|
+
"keywords": [
|
|
5
|
+
"tradejs",
|
|
6
|
+
"trading",
|
|
7
|
+
"backtesting",
|
|
8
|
+
"app",
|
|
9
|
+
"dashboard",
|
|
10
|
+
"nextjs",
|
|
11
|
+
"signals"
|
|
12
|
+
],
|
|
4
13
|
"files": [
|
|
5
14
|
"README.md",
|
|
6
15
|
"bin",
|
|
@@ -24,12 +33,12 @@
|
|
|
24
33
|
"@emotion/react": "^11.14.0",
|
|
25
34
|
"@langchain/core": "^0.3.68",
|
|
26
35
|
"@langchain/openai": "^0.6.11",
|
|
27
|
-
"@tradejs/connectors": "^1.0.
|
|
28
|
-
"@tradejs/core": "^1.0.
|
|
29
|
-
"@tradejs/indicators": "^1.0.
|
|
30
|
-
"@tradejs/infra": "^1.0.
|
|
31
|
-
"@tradejs/node": "^1.0.
|
|
32
|
-
"@tradejs/types": "^1.0.
|
|
36
|
+
"@tradejs/connectors": "^1.0.3",
|
|
37
|
+
"@tradejs/core": "^1.0.3",
|
|
38
|
+
"@tradejs/indicators": "^1.0.3",
|
|
39
|
+
"@tradejs/infra": "^1.0.3",
|
|
40
|
+
"@tradejs/node": "^1.0.3",
|
|
41
|
+
"@tradejs/types": "^1.0.3",
|
|
33
42
|
"bcryptjs": "^2.4.3",
|
|
34
43
|
"date-fns": "^3.3.1",
|
|
35
44
|
"idb-keyval": "^6.2.2",
|
package/src/app/api/ai/route.ts
CHANGED
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
HumanMessage,
|
|
6
6
|
SystemMessage,
|
|
7
7
|
} from '@langchain/core/messages';
|
|
8
|
-
import { toJson } from '@tradejs/core/
|
|
8
|
+
import { toJson } from '@tradejs/core/data';
|
|
9
9
|
import { getConnectorCreatorByProvider } from '@tradejs/node/connectors';
|
|
10
10
|
import {
|
|
11
11
|
AIChatHistory,
|
|
@@ -19,9 +19,11 @@ import { logger } from '@tradejs/infra/logger';
|
|
|
19
19
|
export const dynamic = 'force-dynamic';
|
|
20
20
|
|
|
21
21
|
const HISTORY_DIR = 'data/chats';
|
|
22
|
+
const projectRoot =
|
|
23
|
+
String(process.env.PROJECT_CWD || process.cwd()).trim() || process.cwd();
|
|
22
24
|
|
|
23
25
|
const getHistory = async (symbol: string): Promise<AIChatHistory> => {
|
|
24
|
-
const history = await getFile(HISTORY_DIR, symbol);
|
|
26
|
+
const history = await getFile(HISTORY_DIR, symbol, [], projectRoot);
|
|
25
27
|
return history;
|
|
26
28
|
};
|
|
27
29
|
|
|
@@ -30,7 +32,9 @@ const appendMessagesToHistory = async (
|
|
|
30
32
|
messages: AIChatHistory,
|
|
31
33
|
): Promise<void> => {
|
|
32
34
|
const history = await getHistory(symbol);
|
|
33
|
-
await setFile(HISTORY_DIR, symbol, [...history, ...messages]
|
|
35
|
+
await setFile(HISTORY_DIR, symbol, [...history, ...messages], {
|
|
36
|
+
projectRoot,
|
|
37
|
+
});
|
|
34
38
|
};
|
|
35
39
|
|
|
36
40
|
const buildMessages = (
|
|
@@ -115,7 +119,10 @@ export const POST = async (request: NextRequest) => {
|
|
|
115
119
|
|
|
116
120
|
await appendMessagesToHistory(filters.symbol, [message]);
|
|
117
121
|
|
|
118
|
-
const connectorCreator = await getConnectorCreatorByProvider(
|
|
122
|
+
const connectorCreator = await getConnectorCreatorByProvider(
|
|
123
|
+
'bybit',
|
|
124
|
+
projectRoot,
|
|
125
|
+
);
|
|
119
126
|
if (!connectorCreator) {
|
|
120
127
|
throw new Error('No connector available for provider');
|
|
121
128
|
}
|
|
@@ -7,12 +7,14 @@ import { ensureIndicatorPluginsLoaded } from '@tradejs/node/registry';
|
|
|
7
7
|
import { logger } from '@tradejs/infra/logger';
|
|
8
8
|
|
|
9
9
|
export const dynamic = 'force-dynamic';
|
|
10
|
+
const projectRoot =
|
|
11
|
+
String(process.env.PROJECT_CWD || process.cwd()).trim() || process.cwd();
|
|
10
12
|
|
|
11
13
|
export const GET = async () => {
|
|
12
14
|
try {
|
|
13
|
-
await ensureIndicatorPluginsLoaded();
|
|
14
|
-
const data = getPluginIndicatorCatalog();
|
|
15
|
-
const renderers = getPluginIndicatorRenderers();
|
|
15
|
+
await ensureIndicatorPluginsLoaded(projectRoot);
|
|
16
|
+
const data = getPluginIndicatorCatalog(projectRoot);
|
|
17
|
+
const renderers = getPluginIndicatorRenderers(projectRoot);
|
|
16
18
|
return NextResponse.json({ data, renderers });
|
|
17
19
|
} catch (error) {
|
|
18
20
|
logger.log('error', 'Indicators catalog error: %o', error);
|
|
@@ -14,6 +14,8 @@ import {
|
|
|
14
14
|
} from '@tradejs/types';
|
|
15
15
|
|
|
16
16
|
export const dynamic = 'force-dynamic';
|
|
17
|
+
const projectRoot =
|
|
18
|
+
String(process.env.PROJECT_CWD || process.cwd()).trim() || process.cwd();
|
|
17
19
|
|
|
18
20
|
interface Params {
|
|
19
21
|
provider: string;
|
|
@@ -32,6 +34,7 @@ const enrichWithPluginIndicators = (
|
|
|
32
34
|
|
|
33
35
|
const history = createIndicators(data, btcData, {
|
|
34
36
|
includeMlPayload: false,
|
|
37
|
+
pluginRegistryScope: projectRoot,
|
|
35
38
|
}).result() as Record<string, number[]>;
|
|
36
39
|
|
|
37
40
|
const nextData = data.map((candle) => ({ ...candle }));
|
|
@@ -78,8 +81,8 @@ export const POST = async (
|
|
|
78
81
|
}
|
|
79
82
|
|
|
80
83
|
const connectorCreator =
|
|
81
|
-
(await getConnectorCreatorByProvider(provider)) ||
|
|
82
|
-
(await getConnectorCreatorByProvider('bybit'));
|
|
84
|
+
(await getConnectorCreatorByProvider(provider, projectRoot)) ||
|
|
85
|
+
(await getConnectorCreatorByProvider('bybit', projectRoot));
|
|
83
86
|
if (!connectorCreator) {
|
|
84
87
|
throw new Error('No connector available for provider');
|
|
85
88
|
}
|
|
@@ -93,8 +96,8 @@ export const POST = async (
|
|
|
93
96
|
...options,
|
|
94
97
|
});
|
|
95
98
|
|
|
96
|
-
await ensureIndicatorPluginsLoaded();
|
|
97
|
-
const pluginKeys = getRegisteredIndicatorEntries().map(
|
|
99
|
+
await ensureIndicatorPluginsLoaded(projectRoot);
|
|
100
|
+
const pluginKeys = getRegisteredIndicatorEntries(projectRoot).map(
|
|
98
101
|
(entry) => entry.historyKey || entry.indicator.id,
|
|
99
102
|
);
|
|
100
103
|
if (!pluginKeys.length) {
|
|
@@ -5,6 +5,8 @@ import { getTopTickers } from '@tradejs/core/tickers';
|
|
|
5
5
|
import { logger } from '@tradejs/infra/logger';
|
|
6
6
|
|
|
7
7
|
export const dynamic = 'force-dynamic';
|
|
8
|
+
const projectRoot =
|
|
9
|
+
String(process.env.PROJECT_CWD || process.cwd()).trim() || process.cwd();
|
|
8
10
|
|
|
9
11
|
interface Params {
|
|
10
12
|
provider: string;
|
|
@@ -17,8 +19,8 @@ export const GET = async (
|
|
|
17
19
|
try {
|
|
18
20
|
const { provider } = await params;
|
|
19
21
|
const connectorCreator =
|
|
20
|
-
(await getConnectorCreatorByProvider(provider)) ||
|
|
21
|
-
(await getConnectorCreatorByProvider('bybit'));
|
|
22
|
+
(await getConnectorCreatorByProvider(provider, projectRoot)) ||
|
|
23
|
+
(await getConnectorCreatorByProvider('bybit', projectRoot));
|
|
22
24
|
if (!connectorCreator) {
|
|
23
25
|
throw new Error('No connector available for provider');
|
|
24
26
|
}
|
|
@@ -5,10 +5,15 @@ import { logger } from '@tradejs/infra/logger';
|
|
|
5
5
|
import { ConnectorCreator } from '@tradejs/types';
|
|
6
6
|
|
|
7
7
|
export const dynamic = 'force-dynamic';
|
|
8
|
+
const projectRoot =
|
|
9
|
+
String(process.env.PROJECT_CWD || process.cwd()).trim() || process.cwd();
|
|
8
10
|
|
|
9
11
|
export const GET = async () => {
|
|
10
12
|
try {
|
|
11
|
-
const connectorCreator = await getConnectorCreatorByProvider(
|
|
13
|
+
const connectorCreator = await getConnectorCreatorByProvider(
|
|
14
|
+
'bybit',
|
|
15
|
+
projectRoot,
|
|
16
|
+
);
|
|
12
17
|
if (!connectorCreator) {
|
|
13
18
|
throw new Error('No connector available for provider');
|
|
14
19
|
}
|
package/tsconfig.json
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"compilerOptions": {
|
|
3
|
-
"target": "ES2017",
|
|
4
3
|
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
4
|
"types": ["jest", "node"],
|
|
6
5
|
"allowJs": true,
|
|
@@ -10,23 +9,25 @@
|
|
|
10
9
|
"esModuleInterop": true,
|
|
11
10
|
"module": "esnext",
|
|
12
11
|
"moduleResolution": "bundler",
|
|
13
|
-
"baseUrl": "./src",
|
|
14
12
|
"resolveJsonModule": true,
|
|
15
13
|
"isolatedModules": true,
|
|
16
14
|
"jsx": "react-jsx",
|
|
17
15
|
"incremental": true,
|
|
16
|
+
"target": "ES2017",
|
|
17
|
+
"baseUrl": ".",
|
|
18
18
|
"plugins": [
|
|
19
19
|
{
|
|
20
20
|
"name": "next"
|
|
21
21
|
}
|
|
22
22
|
],
|
|
23
23
|
"paths": {
|
|
24
|
-
"
|
|
25
|
-
"@
|
|
26
|
-
"@
|
|
27
|
-
"@
|
|
28
|
-
"@
|
|
29
|
-
"@
|
|
24
|
+
"@/*": ["./src/*"],
|
|
25
|
+
"@app/*": ["./src/app/*"],
|
|
26
|
+
"@actions/*": ["./src/app/actions/*"],
|
|
27
|
+
"@store": ["./src/app/store/index"],
|
|
28
|
+
"@shared/*": ["./src/app/components/Shared/*"],
|
|
29
|
+
"@UI": ["./src/app/components/UI/index"],
|
|
30
|
+
"@components/*": ["./src/app/components/*"]
|
|
30
31
|
}
|
|
31
32
|
},
|
|
32
33
|
"include": [
|