@openephemeris/mcp-server 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +163 -0
- package/config/dev-allowlist.json +1165 -0
- package/dist/backend/client.d.ts +33 -0
- package/dist/backend/client.js +167 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +87 -0
- package/dist/schema-packs/llm.d.ts +105 -0
- package/dist/schema-packs/llm.js +429 -0
- package/dist/tools/dev.d.ts +1 -0
- package/dist/tools/dev.js +183 -0
- package/dist/tools/index.d.ts +18 -0
- package/dist/tools/index.js +31 -0
- package/dist/tools/specialized/eclipse.d.ts +1 -0
- package/dist/tools/specialized/eclipse.js +56 -0
- package/dist/tools/specialized/electional.d.ts +1 -0
- package/dist/tools/specialized/electional.js +79 -0
- package/dist/tools/specialized/human_design.d.ts +1 -0
- package/dist/tools/specialized/human_design.js +53 -0
- package/dist/tools/specialized/moon.d.ts +1 -0
- package/dist/tools/specialized/moon.js +50 -0
- package/dist/tools/specialized/natal.d.ts +1 -0
- package/dist/tools/specialized/natal.js +71 -0
- package/dist/tools/specialized/relocation.d.ts +1 -0
- package/dist/tools/specialized/relocation.js +71 -0
- package/dist/tools/specialized/synastry.d.ts +1 -0
- package/dist/tools/specialized/synastry.js +61 -0
- package/dist/tools/specialized/transits.d.ts +1 -0
- package/dist/tools/specialized/transits.js +80 -0
- package/package.json +60 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface BackendConfig {
|
|
2
|
+
baseURL: string;
|
|
3
|
+
userId?: string;
|
|
4
|
+
jwt?: string;
|
|
5
|
+
serviceKey?: string;
|
|
6
|
+
apiKey?: string;
|
|
7
|
+
/** Back-compat: previous name for JWT token (Bearer). */
|
|
8
|
+
authToken?: string;
|
|
9
|
+
}
|
|
10
|
+
export type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
|
|
11
|
+
export interface BackendRequestOptions {
|
|
12
|
+
params?: Record<string, unknown>;
|
|
13
|
+
data?: unknown;
|
|
14
|
+
headers?: Record<string, string>;
|
|
15
|
+
/** Override per-request timeout in milliseconds. */
|
|
16
|
+
timeoutMs?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare class BackendClient {
|
|
19
|
+
private client;
|
|
20
|
+
private userId;
|
|
21
|
+
private jwt?;
|
|
22
|
+
private serviceKey?;
|
|
23
|
+
private apiKey?;
|
|
24
|
+
constructor(config: BackendConfig);
|
|
25
|
+
/** Maps an AxiosError to a concise MCP-friendly Error. */
|
|
26
|
+
private mapError;
|
|
27
|
+
get<T>(path: string, params?: Record<string, any>, timeoutMs?: number): Promise<T>;
|
|
28
|
+
post<T>(path: string, data?: any, timeoutMs?: number): Promise<T>;
|
|
29
|
+
delete<T>(path: string): Promise<T>;
|
|
30
|
+
request<T>(method: HttpMethod, path: string, options?: BackendRequestOptions): Promise<T>;
|
|
31
|
+
getUserId(): string;
|
|
32
|
+
}
|
|
33
|
+
export declare const backendClient: BackendClient;
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import axios, { AxiosError } from "axios";
|
|
2
|
+
const DEFAULT_TIMEOUT_MS = 45_000;
|
|
3
|
+
const RATE_LIMIT_RETRY_DELAYS_MS = [1_000, 2_000]; // Two retries on 429
|
|
4
|
+
function sleep(ms) {
|
|
5
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
6
|
+
}
|
|
7
|
+
export class BackendClient {
|
|
8
|
+
client;
|
|
9
|
+
userId;
|
|
10
|
+
jwt;
|
|
11
|
+
serviceKey;
|
|
12
|
+
apiKey;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.userId = config.userId || "anonymous";
|
|
15
|
+
this.jwt =
|
|
16
|
+
config.jwt ||
|
|
17
|
+
config.authToken ||
|
|
18
|
+
process.env.ASTROMCP_JWT ||
|
|
19
|
+
process.env.MERIDIAN_AUTH_TOKEN;
|
|
20
|
+
this.serviceKey =
|
|
21
|
+
config.serviceKey ||
|
|
22
|
+
process.env.ASTROMCP_SERVICE_KEY ||
|
|
23
|
+
process.env.MERIDIAN_SERVICE_KEY;
|
|
24
|
+
this.apiKey =
|
|
25
|
+
config.apiKey ||
|
|
26
|
+
process.env.ASTROMCP_API_KEY ||
|
|
27
|
+
process.env.MERIDIAN_API_KEY;
|
|
28
|
+
this.client = axios.create({
|
|
29
|
+
baseURL: config.baseURL ||
|
|
30
|
+
process.env.ASTROMCP_BACKEND_URL ||
|
|
31
|
+
process.env.MERIDIAN_BACKEND_URL ||
|
|
32
|
+
"https://api.openephemeris.com",
|
|
33
|
+
timeout: DEFAULT_TIMEOUT_MS,
|
|
34
|
+
headers: {
|
|
35
|
+
"Content-Type": "application/json",
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
// Add auth interceptor (priority: service key > API key > JWT)
|
|
39
|
+
this.client.interceptors.request.use((req) => {
|
|
40
|
+
req.headers = req.headers ?? {};
|
|
41
|
+
// Explicit per-request headers win.
|
|
42
|
+
const hasAuthHeader = typeof req.headers.Authorization === "string" &&
|
|
43
|
+
req.headers.Authorization.length > 0;
|
|
44
|
+
const hasServiceKeyHeader = typeof req.headers["X-Service-Key"] === "string" &&
|
|
45
|
+
req.headers["X-Service-Key"].length > 0;
|
|
46
|
+
const hasApiKeyHeader = typeof req.headers["X-API-Key"] === "string" &&
|
|
47
|
+
req.headers["X-API-Key"].length > 0;
|
|
48
|
+
if (!hasAuthHeader && !hasServiceKeyHeader && !hasApiKeyHeader) {
|
|
49
|
+
if (this.serviceKey) {
|
|
50
|
+
req.headers["X-Service-Key"] = this.serviceKey;
|
|
51
|
+
}
|
|
52
|
+
else if (this.apiKey) {
|
|
53
|
+
req.headers["X-API-Key"] = this.apiKey;
|
|
54
|
+
}
|
|
55
|
+
else if (this.jwt) {
|
|
56
|
+
req.headers.Authorization = `Bearer ${this.jwt}`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return req;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/** Maps an AxiosError to a concise MCP-friendly Error. */
|
|
63
|
+
mapError(error) {
|
|
64
|
+
if (error.response) {
|
|
65
|
+
const status = error.response.status;
|
|
66
|
+
const data = error.response.data;
|
|
67
|
+
const msg = data?.message || data?.detail || error.message;
|
|
68
|
+
if (status === 429) {
|
|
69
|
+
return new Error(`Rate limit exceeded. Your plan credits may be exhausted or requests are too frequent. ` +
|
|
70
|
+
`Check your usage at openephemeris.com/dashboard, then retry in a moment. (${msg})`);
|
|
71
|
+
}
|
|
72
|
+
if (status === 404)
|
|
73
|
+
return new Error(`Resource not found: ${msg}`);
|
|
74
|
+
if (status === 400)
|
|
75
|
+
return new Error(`Invalid request: ${msg}`);
|
|
76
|
+
if (status === 401 || status === 403)
|
|
77
|
+
return new Error(`Authentication error: ${msg}. Verify your ASTROMCP_API_KEY.`);
|
|
78
|
+
if (status >= 500)
|
|
79
|
+
return new Error(`Backend error (${status}): ${msg}`);
|
|
80
|
+
}
|
|
81
|
+
return new Error(`Network error: ${error.message}`);
|
|
82
|
+
}
|
|
83
|
+
async get(path, params, timeoutMs) {
|
|
84
|
+
try {
|
|
85
|
+
const response = await this.client.get(path, {
|
|
86
|
+
params,
|
|
87
|
+
timeout: timeoutMs ?? DEFAULT_TIMEOUT_MS,
|
|
88
|
+
});
|
|
89
|
+
return response.data;
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
if (err instanceof AxiosError)
|
|
93
|
+
throw this.mapError(err);
|
|
94
|
+
throw err;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async post(path, data, timeoutMs) {
|
|
98
|
+
try {
|
|
99
|
+
const response = await this.client.post(path, data, {
|
|
100
|
+
timeout: timeoutMs ?? DEFAULT_TIMEOUT_MS,
|
|
101
|
+
});
|
|
102
|
+
return response.data;
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
if (err instanceof AxiosError)
|
|
106
|
+
throw this.mapError(err);
|
|
107
|
+
throw err;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async delete(path) {
|
|
111
|
+
try {
|
|
112
|
+
const response = await this.client.delete(path);
|
|
113
|
+
return response.data;
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
if (err instanceof AxiosError)
|
|
117
|
+
throw this.mapError(err);
|
|
118
|
+
throw err;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async request(method, path, options) {
|
|
122
|
+
const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
123
|
+
let lastError = new Error("Unknown error");
|
|
124
|
+
// Attempt + retries on 429
|
|
125
|
+
for (let attempt = 0; attempt <= RATE_LIMIT_RETRY_DELAYS_MS.length; attempt++) {
|
|
126
|
+
try {
|
|
127
|
+
const response = await this.client.request({
|
|
128
|
+
method,
|
|
129
|
+
url: path,
|
|
130
|
+
params: options?.params,
|
|
131
|
+
data: options?.data,
|
|
132
|
+
headers: options?.headers,
|
|
133
|
+
timeout: timeoutMs,
|
|
134
|
+
});
|
|
135
|
+
return response.data;
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
if (err instanceof AxiosError) {
|
|
139
|
+
if (err.response?.status === 429 && attempt < RATE_LIMIT_RETRY_DELAYS_MS.length) {
|
|
140
|
+
const delay = RATE_LIMIT_RETRY_DELAYS_MS[attempt];
|
|
141
|
+
await sleep(delay);
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
lastError = this.mapError(err);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
lastError = err instanceof Error ? err : new Error(String(err));
|
|
148
|
+
}
|
|
149
|
+
throw lastError;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
throw lastError;
|
|
153
|
+
}
|
|
154
|
+
getUserId() {
|
|
155
|
+
return this.userId;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Singleton instance
|
|
159
|
+
export const backendClient = new BackendClient({
|
|
160
|
+
baseURL: process.env.ASTROMCP_BACKEND_URL ||
|
|
161
|
+
process.env.MERIDIAN_BACKEND_URL ||
|
|
162
|
+
"https://api.openephemeris.com",
|
|
163
|
+
userId: process.env.MCP_USER_ID || "anonymous",
|
|
164
|
+
jwt: process.env.ASTROMCP_JWT || process.env.MERIDIAN_AUTH_TOKEN,
|
|
165
|
+
serviceKey: process.env.ASTROMCP_SERVICE_KEY || process.env.MERIDIAN_SERVICE_KEY,
|
|
166
|
+
apiKey: process.env.ASTROMCP_API_KEY || process.env.MERIDIAN_API_KEY,
|
|
167
|
+
});
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
6
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
7
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
8
|
+
import { initTools, toolRegistry } from "./tools/index.js";
|
|
9
|
+
function resolveServerVersion() {
|
|
10
|
+
try {
|
|
11
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
12
|
+
const pkgPath = path.resolve(here, "..", "package.json");
|
|
13
|
+
const raw = fs.readFileSync(pkgPath, "utf-8");
|
|
14
|
+
const parsed = JSON.parse(raw);
|
|
15
|
+
if (typeof parsed.version === "string" && parsed.version.trim()) {
|
|
16
|
+
return parsed.version.trim();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Ignore and fall back to an explicit unknown version.
|
|
21
|
+
}
|
|
22
|
+
return "0.0.0-unknown";
|
|
23
|
+
}
|
|
24
|
+
const server = new Server({
|
|
25
|
+
name: "openephemeris-mcp",
|
|
26
|
+
version: resolveServerVersion(),
|
|
27
|
+
}, {
|
|
28
|
+
capabilities: {
|
|
29
|
+
tools: {},
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
// List available tools
|
|
33
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
34
|
+
return {
|
|
35
|
+
tools: Object.values(toolRegistry).map((tool) => ({
|
|
36
|
+
name: tool.name,
|
|
37
|
+
description: tool.description,
|
|
38
|
+
inputSchema: tool.inputSchema,
|
|
39
|
+
})),
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
// Handle tool calls
|
|
43
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
44
|
+
const toolName = request.params.name;
|
|
45
|
+
const tool = toolRegistry[toolName];
|
|
46
|
+
if (!tool) {
|
|
47
|
+
throw new Error(`Unknown tool: ${toolName}`);
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const result = await tool.handler(request.params.arguments ?? {});
|
|
51
|
+
return {
|
|
52
|
+
content: [
|
|
53
|
+
{
|
|
54
|
+
type: "text",
|
|
55
|
+
text: JSON.stringify(result, null, 2),
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
62
|
+
return {
|
|
63
|
+
content: [
|
|
64
|
+
{
|
|
65
|
+
type: "text",
|
|
66
|
+
text: JSON.stringify({
|
|
67
|
+
success: false,
|
|
68
|
+
error: "TOOL_EXECUTION_ERROR",
|
|
69
|
+
message: errorMessage,
|
|
70
|
+
}, null, 2),
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
isError: true,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
// Start server
|
|
78
|
+
async function main() {
|
|
79
|
+
await initTools();
|
|
80
|
+
const transport = new StdioServerTransport();
|
|
81
|
+
await server.connect(transport);
|
|
82
|
+
console.error("Open Ephemeris MCP server running on stdio");
|
|
83
|
+
}
|
|
84
|
+
main().catch((error) => {
|
|
85
|
+
console.error("Fatal error:", error);
|
|
86
|
+
process.exit(1);
|
|
87
|
+
});
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const LLM_V2_POINTS_SCHEMA: readonly ["id", "kind", "src", "lon", "lat", "spd", "rx", "sg", "deg", "hs", "dec", "oob", "ed", "ed_sc", "ad_sc", "on_cusp"];
|
|
3
|
+
export declare const LLM_V2_ASPECTS_SCHEMA: readonly ["a_i", "b_i", "t", "orb", "orb_pct", "app", "str"];
|
|
4
|
+
export declare const LLM_V2_DICT: {
|
|
5
|
+
readonly sign_id: readonly ["ari", "tau", "gem", "can", "leo", "vir", "lib", "sco", "sag", "cap", "aqu", "pis"];
|
|
6
|
+
readonly aspect_id: readonly ["con", "opp", "tri", "sqr", "sex"];
|
|
7
|
+
readonly aspect_angle: readonly [0, 180, 120, 90, 60];
|
|
8
|
+
readonly kind_id: readonly ["planet", "angle", "node", "lilith", "asteroid", "uranian", "other"];
|
|
9
|
+
};
|
|
10
|
+
export declare const LlmV2PayloadSchema: z.ZodObject<{
|
|
11
|
+
output_mode: z.ZodOptional<z.ZodLiteral<"llm">>;
|
|
12
|
+
schema_version: z.ZodOptional<z.ZodLiteral<"llm">>;
|
|
13
|
+
chart: z.ZodObject<{
|
|
14
|
+
chart_type: z.ZodEnum<{
|
|
15
|
+
natal: "natal";
|
|
16
|
+
synastry: "synastry";
|
|
17
|
+
}>;
|
|
18
|
+
subject: z.ZodOptional<z.ZodObject<{
|
|
19
|
+
datetime: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
20
|
+
jd: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
21
|
+
lat: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
22
|
+
lon: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
23
|
+
}, z.core.$strict>>;
|
|
24
|
+
}, z.core.$strict>;
|
|
25
|
+
rules: z.ZodOptional<z.ZodObject<{
|
|
26
|
+
zodiac_type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
27
|
+
house_system: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
28
|
+
coordinate_system: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
29
|
+
node_source: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
30
|
+
lon_range: z.ZodLiteral<"0_360">;
|
|
31
|
+
aspect_set: z.ZodLiteral<"major_default">;
|
|
32
|
+
orb_profile: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
33
|
+
strength_basis: z.ZodLiteral<"engine">;
|
|
34
|
+
point_order_id: z.ZodLiteral<"astro_point_order_v1">;
|
|
35
|
+
core_set_id: z.ZodLiteral<"core_interp_set_v1">;
|
|
36
|
+
}, z.core.$strict>>;
|
|
37
|
+
reliability: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
38
|
+
provenance: z.ZodOptional<z.ZodObject<{
|
|
39
|
+
engine: z.ZodString;
|
|
40
|
+
ephemeris_source: z.ZodString;
|
|
41
|
+
ephemeris_version: z.ZodString;
|
|
42
|
+
validation_profile: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
43
|
+
precision_level: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
44
|
+
checksum: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
45
|
+
}, z.core.$strict>>;
|
|
46
|
+
dict: z.ZodObject<{
|
|
47
|
+
sign_id: z.ZodTuple<any, null>;
|
|
48
|
+
aspect_id: z.ZodTuple<any, null>;
|
|
49
|
+
aspect_angle: z.ZodTuple<any, null>;
|
|
50
|
+
kind_id: z.ZodTuple<any, null>;
|
|
51
|
+
}, z.core.$strict>;
|
|
52
|
+
present: z.ZodObject<{
|
|
53
|
+
point_count: z.ZodNumber;
|
|
54
|
+
kinds: z.ZodRecord<z.ZodString, z.ZodNumber>;
|
|
55
|
+
}, z.core.$strict>;
|
|
56
|
+
points_schema: z.ZodTuple<any, null>;
|
|
57
|
+
points: z.ZodArray<z.ZodTuple<[z.ZodString, z.ZodEnum<{
|
|
58
|
+
[x: string]: any;
|
|
59
|
+
}>, z.ZodNumber, z.ZodNumber, z.ZodNullable<z.ZodNumber>, z.ZodNullable<z.ZodNumber>, z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNullable<z.ZodNumber>, z.ZodNullable<z.ZodNumber>, z.ZodNumber, z.ZodEnum<{
|
|
60
|
+
none: "none";
|
|
61
|
+
dom: "dom";
|
|
62
|
+
ex: "ex";
|
|
63
|
+
det: "det";
|
|
64
|
+
fall: "fall";
|
|
65
|
+
}>, z.ZodNullable<z.ZodNumber>, z.ZodNullable<z.ZodNumber>, z.ZodNumber], null>>;
|
|
66
|
+
angles: z.ZodOptional<z.ZodObject<{
|
|
67
|
+
asc: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
68
|
+
mc: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
69
|
+
dsc: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
70
|
+
ic: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
71
|
+
}, z.core.$strict>>;
|
|
72
|
+
houses: z.ZodOptional<z.ZodObject<{
|
|
73
|
+
system: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
74
|
+
cusps: z.ZodArray<z.ZodNumber>;
|
|
75
|
+
}, z.core.$strict>>;
|
|
76
|
+
aspects_schema: z.ZodTuple<any, null>;
|
|
77
|
+
aspects: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
|
|
78
|
+
patterns: z.ZodOptional<z.ZodObject<{
|
|
79
|
+
stellium: z.ZodArray<z.ZodUnknown>;
|
|
80
|
+
t_square: z.ZodArray<z.ZodUnknown>;
|
|
81
|
+
grand_trine: z.ZodArray<z.ZodUnknown>;
|
|
82
|
+
kite: z.ZodArray<z.ZodUnknown>;
|
|
83
|
+
yod: z.ZodArray<z.ZodUnknown>;
|
|
84
|
+
grand_cross: z.ZodArray<z.ZodUnknown>;
|
|
85
|
+
}, z.core.$strict>>;
|
|
86
|
+
extras: z.ZodOptional<z.ZodObject<{
|
|
87
|
+
fixed_star_conjunctions: z.ZodArray<z.ZodUnknown>;
|
|
88
|
+
lots: z.ZodArray<z.ZodUnknown>;
|
|
89
|
+
}, z.core.$strict>>;
|
|
90
|
+
counts: z.ZodObject<{
|
|
91
|
+
point_count: z.ZodNumber;
|
|
92
|
+
aspect_count: z.ZodNumber;
|
|
93
|
+
aspect_count_unfiltered: z.ZodOptional<z.ZodNumber>;
|
|
94
|
+
midpoint_count: z.ZodOptional<z.ZodNumber>;
|
|
95
|
+
declination_aspect_count: z.ZodOptional<z.ZodNumber>;
|
|
96
|
+
stellium_count: z.ZodOptional<z.ZodNumber>;
|
|
97
|
+
}, z.core.$strict>;
|
|
98
|
+
analysis: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
99
|
+
human_design: z.ZodOptional<z.ZodObject<{
|
|
100
|
+
gates_schema: z.ZodArray<z.ZodString>;
|
|
101
|
+
gates: z.ZodArray<z.ZodArray<z.ZodAny>>;
|
|
102
|
+
}, z.core.$strict>>;
|
|
103
|
+
}, z.core.$strict>;
|
|
104
|
+
export type LlmV2Payload = z.infer<typeof LlmV2PayloadSchema>;
|
|
105
|
+
export declare const llmV2JsonSchema: Record<string, unknown>;
|