@timecell/api 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/routes/action-plan.d.ts +3 -0
- package/dist/routes/action-plan.d.ts.map +1 -0
- package/dist/routes/action-plan.js +58 -0
- package/dist/routes/action-plan.js.map +1 -0
- package/dist/routes/portfolio.d.ts.map +1 -1
- package/dist/routes/portfolio.js.map +1 -1
- package/dist/routes/position-sizing.d.ts +3 -0
- package/dist/routes/position-sizing.d.ts.map +1 -0
- package/dist/routes/position-sizing.js +7 -0
- package/dist/routes/position-sizing.js.map +1 -0
- package/dist/routes/temperature.d.ts +3 -0
- package/dist/routes/temperature.d.ts.map +1 -0
- package/dist/routes/temperature.js +18 -0
- package/dist/routes/temperature.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +8 -2
- package/dist/server.js.map +1 -1
- package/dist/web/dist/assets/index-BWWPrioD.js +113 -0
- package/dist/web/dist/assets/index-BY7xE2ch.css +1 -0
- package/dist/web/dist/assets/index-BdFQ7jf3.js +113 -0
- package/dist/web/dist/assets/index-C-dwRA62.js +113 -0
- package/dist/web/dist/assets/index-CAfGfEA4.css +1 -0
- package/dist/web/dist/assets/index-Csq6J4e2.js +113 -0
- package/dist/web/dist/assets/index-D2dZfIwA.css +1 -0
- package/dist/web/dist/assets/index-DISMfP4S.js +113 -0
- package/dist/web/dist/assets/index-DK51rASe.css +1 -0
- package/dist/web/dist/assets/index-DhhFLqcu.js +113 -0
- package/dist/web/dist/assets/index-FbkZPqxI.js +113 -0
- package/dist/web/dist/assets/index-_y4hFJfB.css +1 -0
- package/dist/web/dist/assets/index-yH4zur2Y.css +1 -0
- package/dist/web/dist/index.html +14 -0
- package/dist/web/dist/logo.png +0 -0
- package/dist/web/dist/timecell.svg +4 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-plan.d.ts","sourceRoot":"","sources":["../../src/routes/action-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA2D/C,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,eAAe,iBAS9D"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { generateActionPlan } from "@timecell/engine";
|
|
2
|
+
function validateActionPlanInput(body) {
|
|
3
|
+
if (!body || typeof body !== "object") {
|
|
4
|
+
return { valid: false, error: "Request body must be a JSON object" };
|
|
5
|
+
}
|
|
6
|
+
const b = body;
|
|
7
|
+
// btcPercentage: number 0-100
|
|
8
|
+
if (typeof b.btcPercentage !== "number" || b.btcPercentage < 0 || b.btcPercentage > 100) {
|
|
9
|
+
return { valid: false, error: "btcPercentage must be a number between 0 and 100" };
|
|
10
|
+
}
|
|
11
|
+
// ruinTestPassed: boolean
|
|
12
|
+
if (typeof b.ruinTestPassed !== "boolean") {
|
|
13
|
+
return { valid: false, error: "ruinTestPassed must be a boolean" };
|
|
14
|
+
}
|
|
15
|
+
// runwayMonths: number >= 0 (Infinity is allowed)
|
|
16
|
+
if (typeof b.runwayMonths !== "number" || b.runwayMonths < 0) {
|
|
17
|
+
return { valid: false, error: "runwayMonths must be a number >= 0" };
|
|
18
|
+
}
|
|
19
|
+
// temperatureScore: number 0-100
|
|
20
|
+
if (typeof b.temperatureScore !== "number" || b.temperatureScore < 0 || b.temperatureScore > 100) {
|
|
21
|
+
return { valid: false, error: "temperatureScore must be a number between 0 and 100" };
|
|
22
|
+
}
|
|
23
|
+
// liquidReserveUsd: number >= 0
|
|
24
|
+
if (typeof b.liquidReserveUsd !== "number" || b.liquidReserveUsd < 0) {
|
|
25
|
+
return { valid: false, error: "liquidReserveUsd must be a number >= 0" };
|
|
26
|
+
}
|
|
27
|
+
// monthlyBurnUsd: number >= 0
|
|
28
|
+
if (typeof b.monthlyBurnUsd !== "number" || b.monthlyBurnUsd < 0) {
|
|
29
|
+
return { valid: false, error: "monthlyBurnUsd must be a number >= 0" };
|
|
30
|
+
}
|
|
31
|
+
// totalValueUsd: number >= 0
|
|
32
|
+
if (typeof b.totalValueUsd !== "number" || b.totalValueUsd < 0) {
|
|
33
|
+
return { valid: false, error: "totalValueUsd must be a number >= 0" };
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
valid: true,
|
|
37
|
+
data: {
|
|
38
|
+
btcPercentage: b.btcPercentage,
|
|
39
|
+
ruinTestPassed: b.ruinTestPassed,
|
|
40
|
+
runwayMonths: b.runwayMonths,
|
|
41
|
+
temperatureScore: b.temperatureScore,
|
|
42
|
+
liquidReserveUsd: b.liquidReserveUsd,
|
|
43
|
+
monthlyBurnUsd: b.monthlyBurnUsd,
|
|
44
|
+
totalValueUsd: b.totalValueUsd,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export async function actionPlanRoutes(fastify) {
|
|
49
|
+
fastify.post("/action-plan", async (request, reply) => {
|
|
50
|
+
const validation = validateActionPlanInput(request.body);
|
|
51
|
+
if (!validation.valid) {
|
|
52
|
+
reply.status(400).send({ error: validation.error });
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
return generateActionPlan(validation.data);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=action-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-plan.js","sourceRoot":"","sources":["../../src/routes/action-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portfolio.d.ts","sourceRoot":"","sources":["../../src/routes/portfolio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"portfolio.d.ts","sourceRoot":"","sources":["../../src/routes/portfolio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA6B/C,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,iBAS7D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../src/routes/portfolio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAA2C,MAAM,kBAAkB,CAAC;AACjH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAChD,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../src/routes/portfolio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAA2C,MAAM,kBAAkB,CAAC;AACjH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAChD,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;AAQ1D,KAAK,UAAU,aAAa;IAC3B,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,oBAAoB,EAAE,CAAC;IAC5E,CAAC;AACF,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAoB;IAChD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAwB;IAC7D,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;QACpC,OAAO,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAA2B,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACtE,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"position-sizing.d.ts","sourceRoot":"","sources":["../../src/routes/position-sizing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,eAAe,iBAIlE"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { calculatePositionSizing } from "@timecell/engine";
|
|
2
|
+
export async function positionSizingRoutes(fastify) {
|
|
3
|
+
fastify.post("/position-sizing", async (request) => {
|
|
4
|
+
return calculatePositionSizing(request.body);
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=position-sizing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"position-sizing.js","sourceRoot":"","sources":["../../src/routes/position-sizing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAA4B,MAAM,kBAAkB,CAAC;AAErF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAwB;IAClE,OAAO,CAAC,IAAI,CAAgC,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACjF,OAAO,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temperature.d.ts","sourceRoot":"","sources":["../../src/routes/temperature.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAU/C,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,iBAS/D"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { calculateTemperature } from "@timecell/engine";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Mock data — will be replaced with live MVRV/RHODL feeds in a future release.
|
|
4
|
+
// MVRV ~1.8 and RHODL ~1.6 are representative of mid-cycle neutral territory.
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
const MOCK_MVRV = 1.8;
|
|
7
|
+
const MOCK_RHODL = 1.6;
|
|
8
|
+
export async function temperatureRoutes(fastify) {
|
|
9
|
+
fastify.get("/temperature", async () => {
|
|
10
|
+
const result = calculateTemperature(MOCK_MVRV, MOCK_RHODL);
|
|
11
|
+
return {
|
|
12
|
+
...result,
|
|
13
|
+
dataSource: "mock",
|
|
14
|
+
note: "Live MVRV/RHODL feeds coming soon",
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=temperature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temperature.js","sourceRoot":"","sources":["../../src/routes/temperature.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,8EAA8E;AAC9E,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAwB;IAC/D,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC3D,OAAO;YACN,GAAG,MAAM;YACT,UAAU,EAAE,MAAM;YAClB,IAAI,EAAE,mCAAmC;SACzC,CAAC;IACH,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AA4BA,wBAAsB,WAAW,mWAmChC"}
|
package/dist/server.js
CHANGED
|
@@ -7,6 +7,9 @@ import fastifyStatic from "@fastify/static";
|
|
|
7
7
|
import { crashRoutes } from "./routes/crash.js";
|
|
8
8
|
import { portfolioRoutes } from "./routes/portfolio.js";
|
|
9
9
|
import { priceRoutes } from "./routes/price.js";
|
|
10
|
+
import { temperatureRoutes } from "./routes/temperature.js";
|
|
11
|
+
import { positionSizingRoutes } from "./routes/position-sizing.js";
|
|
12
|
+
import { actionPlanRoutes } from "./routes/action-plan.js";
|
|
10
13
|
function findWebDist() {
|
|
11
14
|
const candidates = [
|
|
12
15
|
// Bundled inside API package (npm published)
|
|
@@ -23,14 +26,17 @@ function findWebDist() {
|
|
|
23
26
|
return null;
|
|
24
27
|
}
|
|
25
28
|
export async function buildServer() {
|
|
26
|
-
const fastify = Fastify({ logger:
|
|
29
|
+
const fastify = Fastify({ logger: false });
|
|
27
30
|
await fastify.register(cors, { origin: true });
|
|
28
31
|
// API routes
|
|
29
32
|
await fastify.register(crashRoutes, { prefix: "/api" });
|
|
30
33
|
await fastify.register(portfolioRoutes, { prefix: "/api" });
|
|
31
34
|
await fastify.register(priceRoutes, { prefix: "/api" });
|
|
35
|
+
await fastify.register(temperatureRoutes, { prefix: "/api" });
|
|
36
|
+
await fastify.register(positionSizingRoutes, { prefix: "/api" });
|
|
37
|
+
await fastify.register(actionPlanRoutes, { prefix: "/api" });
|
|
32
38
|
// Health check
|
|
33
|
-
fastify.get("/api/health", async () => ({ status: "ok", version: "0.
|
|
39
|
+
fastify.get("/api/health", async () => ({ status: "ok", version: "0.2.0" }));
|
|
34
40
|
// Serve built web dashboard if available
|
|
35
41
|
const webDist = findWebDist();
|
|
36
42
|
if (webDist) {
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,eAAe,CAAC;AACjC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|