@dmindai/sdk 0.1.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.
Files changed (50) hide show
  1. package/README.md +145 -0
  2. package/dist/chat-types.d.ts +137 -0
  3. package/dist/chat-types.js +6 -0
  4. package/dist/chat-types.js.map +1 -0
  5. package/dist/chat.d.ts +16 -0
  6. package/dist/chat.js +286 -0
  7. package/dist/chat.js.map +1 -0
  8. package/dist/constants.d.ts +6 -0
  9. package/dist/constants.js +10 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/errors.d.ts +10 -0
  12. package/dist/errors.js +13 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/index.d.ts +12 -0
  15. package/dist/index.js +29 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/parser.d.ts +3 -0
  18. package/dist/parser.js +160 -0
  19. package/dist/parser.js.map +1 -0
  20. package/dist/profiles.d.ts +3 -0
  21. package/dist/profiles.js +95 -0
  22. package/dist/profiles.js.map +1 -0
  23. package/dist/runtime.d.ts +2 -0
  24. package/dist/runtime.js +54 -0
  25. package/dist/runtime.js.map +1 -0
  26. package/dist/sdk.d.ts +22 -0
  27. package/dist/sdk.js +58 -0
  28. package/dist/sdk.js.map +1 -0
  29. package/dist/tool.d.ts +47 -0
  30. package/dist/tool.js +61 -0
  31. package/dist/tool.js.map +1 -0
  32. package/dist/tools/execute-swap.d.ts +17 -0
  33. package/dist/tools/execute-swap.js +51 -0
  34. package/dist/tools/execute-swap.js.map +1 -0
  35. package/dist/tools/index.d.ts +2 -0
  36. package/dist/tools/index.js +10 -0
  37. package/dist/tools/index.js.map +1 -0
  38. package/dist/tools/search-token.d.ts +14 -0
  39. package/dist/tools/search-token.js +43 -0
  40. package/dist/tools/search-token.js.map +1 -0
  41. package/dist/types.d.ts +81 -0
  42. package/dist/types.js +3 -0
  43. package/dist/types.js.map +1 -0
  44. package/dist/utils.d.ts +9 -0
  45. package/dist/utils.js +73 -0
  46. package/dist/utils.js.map +1 -0
  47. package/dist/validator.d.ts +3 -0
  48. package/dist/validator.js +106 -0
  49. package/dist/validator.js.map +1 -0
  50. package/package.json +39 -0
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EXECUTE_SWAP = exports.executeSwapInputSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const tool_1 = require("../tool");
6
+ exports.executeSwapInputSchema = zod_1.z.object({
7
+ inputTokenSymbol: zod_1.z.string(),
8
+ inputTokenCA: zod_1.z.string().optional(),
9
+ outputTokenCA: zod_1.z.string().optional(),
10
+ inputTokenAmount: zod_1.z.number().optional(),
11
+ inputTokenPercentage: zod_1.z.number().optional(),
12
+ outputTokenAmount: zod_1.z.number().optional(),
13
+ });
14
+ const EXECUTE_SWAP_JSON_SCHEMA = {
15
+ type: "object",
16
+ properties: {
17
+ inputTokenSymbol: {
18
+ type: "string",
19
+ description: "Symbol of the token being sold (e.g., 'SOL').",
20
+ },
21
+ inputTokenCA: {
22
+ type: "string",
23
+ description: "Contract address of the token being sold.",
24
+ },
25
+ outputTokenCA: {
26
+ type: "string",
27
+ description: "Contract address of the token being bought.",
28
+ },
29
+ inputTokenAmount: {
30
+ type: "number",
31
+ description: "Absolute amount of input token to swap.",
32
+ },
33
+ inputTokenPercentage: {
34
+ type: "number",
35
+ description: "Percentage of balance to swap (0.0 to 1.0), used if exact amount is not specified.",
36
+ },
37
+ outputTokenAmount: {
38
+ type: "number",
39
+ description: "Minimum amount of output token expected (optional/slippage related).",
40
+ },
41
+ },
42
+ required: ["inputTokenSymbol"],
43
+ };
44
+ exports.EXECUTE_SWAP = (0, tool_1.tool)({
45
+ name: "EXECUTE_SWAP",
46
+ description: "Propose a token swap transaction.",
47
+ inputSchema: exports.executeSwapInputSchema,
48
+ jsonSchemaParameters: EXECUTE_SWAP_JSON_SCHEMA,
49
+ execute: false,
50
+ });
51
+ //# sourceMappingURL=execute-swap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-swap.js","sourceRoot":"","sources":["../../src/tools/execute-swap.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AACxB,kCAA+B;AAsBlB,QAAA,sBAAsB,GAAgC,OAAC,CAAC,MAAM,CAAC;IAC1E,gBAAgB,EAAE,OAAC,CAAC,MAAM,EAAE;IAC5B,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,gBAAgB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACvC,oBAAoB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3C,iBAAiB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACzC,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAA4B;IACxD,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,gBAAgB,EAAE;YAChB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,+CAA+C;SAC7D;QACD,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,2CAA2C;SACzD;QACD,aAAa,EAAE;YACb,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,6CAA6C;SAC3D;QACD,gBAAgB,EAAE;YAChB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,yCAAyC;SACvD;QACD,oBAAoB,EAAE;YACpB,IAAI,EAAE,QAAQ;YACd,WAAW,EACT,oFAAoF;SACvF;QACD,iBAAiB,EAAE;YACjB,IAAI,EAAE,QAAQ;YACd,WAAW,EACT,sEAAsE;SACzE;KACF;IACD,QAAQ,EAAE,CAAC,kBAAkB,CAAC;CAC/B,CAAC;AAEW,QAAA,YAAY,GAAG,IAAA,WAAI,EAAC;IAC/B,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,mCAAmC;IAChD,WAAW,EAAE,8BAAsB;IACnC,oBAAoB,EAAE,wBAAwB;IAC9C,OAAO,EAAE,KAAK;CACf,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { SEARCH_TOKEN, searchTokenInputSchema, type SearchTokenInput, type Chain, } from "./search-token";
2
+ export { EXECUTE_SWAP, executeSwapInputSchema, type ExecuteSwapInput, } from "./execute-swap";
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeSwapInputSchema = exports.EXECUTE_SWAP = exports.searchTokenInputSchema = exports.SEARCH_TOKEN = void 0;
4
+ var search_token_1 = require("./search-token");
5
+ Object.defineProperty(exports, "SEARCH_TOKEN", { enumerable: true, get: function () { return search_token_1.SEARCH_TOKEN; } });
6
+ Object.defineProperty(exports, "searchTokenInputSchema", { enumerable: true, get: function () { return search_token_1.searchTokenInputSchema; } });
7
+ var execute_swap_1 = require("./execute-swap");
8
+ Object.defineProperty(exports, "EXECUTE_SWAP", { enumerable: true, get: function () { return execute_swap_1.EXECUTE_SWAP; } });
9
+ Object.defineProperty(exports, "executeSwapInputSchema", { enumerable: true, get: function () { return execute_swap_1.executeSwapInputSchema; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";;;AAAA,+CAKwB;AAJtB,4GAAA,YAAY,OAAA;AACZ,sHAAA,sBAAsB,OAAA;AAKxB,+CAIwB;AAHtB,4GAAA,YAAY,OAAA;AACZ,sHAAA,sBAAsB,OAAA"}
@@ -0,0 +1,14 @@
1
+ import { z } from "zod";
2
+ export type Chain = "solana" | "ethereum" | "bsc" | "base";
3
+ export interface SearchTokenInput {
4
+ /** Token ticker symbol (e.g. SOL, USDC) */
5
+ symbol?: string;
6
+ /** Contract address of the token */
7
+ address?: string;
8
+ /** Target blockchain network */
9
+ chain?: Chain;
10
+ /** Free-text search keywords */
11
+ keyword?: string;
12
+ }
13
+ export declare const searchTokenInputSchema: z.ZodType<SearchTokenInput>;
14
+ export declare const SEARCH_TOKEN: import("../tool").Tool<SearchTokenInput, unknown, never>;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SEARCH_TOKEN = exports.searchTokenInputSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const tool_1 = require("../tool");
6
+ const CHAIN_VALUES = ["solana", "ethereum", "bsc", "base"];
7
+ exports.searchTokenInputSchema = zod_1.z.object({
8
+ symbol: zod_1.z.string().optional(),
9
+ address: zod_1.z.string().optional(),
10
+ chain: zod_1.z.enum(CHAIN_VALUES).optional(),
11
+ keyword: zod_1.z.string().optional(),
12
+ });
13
+ const SEARCH_TOKEN_JSON_SCHEMA = {
14
+ type: "object",
15
+ properties: {
16
+ symbol: {
17
+ type: "string",
18
+ description: "The ticker symbol of the token (e.g., 'SOL', 'USDC').",
19
+ },
20
+ address: {
21
+ type: "string",
22
+ description: "The specific contract address (CA) of the token, if known.",
23
+ },
24
+ chain: {
25
+ type: "string",
26
+ enum: ["solana", "ethereum", "bsc", "base"],
27
+ description: "The target blockchain network.",
28
+ },
29
+ keyword: {
30
+ type: "string",
31
+ description: "General search keywords (e.g., project name) if symbol/address are unclear.",
32
+ },
33
+ },
34
+ required: [],
35
+ };
36
+ exports.SEARCH_TOKEN = (0, tool_1.tool)({
37
+ name: "SEARCH_TOKEN",
38
+ description: "Search for a cryptocurrency token on-chain to retrieve its metadata or address.",
39
+ inputSchema: exports.searchTokenInputSchema,
40
+ jsonSchemaParameters: SEARCH_TOKEN_JSON_SCHEMA,
41
+ execute: false,
42
+ });
43
+ //# sourceMappingURL=search-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-token.js","sourceRoot":"","sources":["../../src/tools/search-token.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AACxB,kCAA+B;AAoB/B,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAU,CAAC;AAEvD,QAAA,sBAAsB,GAAgC,OAAC,CAAC,MAAM,CAAC;IAC1E,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,KAAK,EAAE,OAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE;IACtC,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAA4B;IACxD,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,uDAAuD;SACrE;QACD,OAAO,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,WAAW,EACT,4DAA4D;SAC/D;QACD,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC;YAC3C,WAAW,EAAE,gCAAgC;SAC9C;QACD,OAAO,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,WAAW,EACT,6EAA6E;SAChF;KACF;IACD,QAAQ,EAAE,EAAE;CACb,CAAC;AAEW,QAAA,YAAY,GAAG,IAAA,WAAI,EAAC;IAC/B,IAAI,EAAE,cAAc;IACpB,WAAW,EACT,iFAAiF;IACnF,WAAW,EAAE,8BAAsB;IACnC,oBAAoB,EAAE,wBAAwB;IAC9C,OAAO,EAAE,KAAK;CACf,CAAC,CAAC"}
@@ -0,0 +1,81 @@
1
+ import type { SDKErrorCode, ValidationIssue } from "./errors";
2
+ export type Role = "developer" | "user" | "assistant";
3
+ export interface Message {
4
+ role: Role;
5
+ content: string;
6
+ }
7
+ export type ProtocolMode = "official" | "dual" | "legacy";
8
+ export type ToolName = string;
9
+ export interface ToolCallResult {
10
+ type: "tool_call";
11
+ tool: ToolName;
12
+ args: Record<string, any>;
13
+ raw: string;
14
+ protocol: "official" | "legacy";
15
+ }
16
+ export interface TextResult {
17
+ type: "text";
18
+ text: string;
19
+ raw: string;
20
+ }
21
+ export interface ParseErrorResult {
22
+ type: "parse_error";
23
+ code: SDKErrorCode;
24
+ message: string;
25
+ raw: string;
26
+ }
27
+ export type ParsedResult = ToolCallResult | TextResult | ParseErrorResult;
28
+ export type BasicValidationResult = {
29
+ ok: true;
30
+ } | {
31
+ ok: false;
32
+ errors: string[];
33
+ };
34
+ export type DetailedValidationResult = {
35
+ ok: true;
36
+ } | {
37
+ ok: false;
38
+ errors: ValidationIssue[];
39
+ };
40
+ export type ModelGenerate = (messages: Message[]) => Promise<string>;
41
+ export type ToolHandler = (args: Record<string, any>) => Promise<any> | any;
42
+ export type ToolHandlers = Partial<Record<ToolName, ToolHandler>>;
43
+ export interface SDKCore {
44
+ generate(messages: Message[]): Promise<string>;
45
+ parse(raw: string, mode?: ProtocolMode): ParsedResult;
46
+ validate(call: ToolCallResult): BasicValidationResult;
47
+ execute(call: ToolCallResult): Promise<any>;
48
+ wrapResponse(payload: any): string;
49
+ }
50
+ export interface RunLoopOptions {
51
+ maxToolHops?: number;
52
+ mode?: ProtocolMode;
53
+ functionResponseRole?: Extract<Role, "user" | "assistant">;
54
+ }
55
+ export interface RunLoopResult {
56
+ final: ParsedResult;
57
+ messages: Message[];
58
+ toolHops: number;
59
+ }
60
+ export type ToolParameterType = "string" | "number" | "boolean" | "object";
61
+ export interface ToolParameterSchema {
62
+ type: ToolParameterType;
63
+ required?: boolean;
64
+ nonEmpty?: boolean;
65
+ enum?: Array<string | number | boolean>;
66
+ min?: number;
67
+ max?: number;
68
+ pattern?: string;
69
+ }
70
+ export interface ToolSchema {
71
+ parameters: Record<string, ToolParameterSchema>;
72
+ strict?: boolean;
73
+ customValidate?: (args: Record<string, any>) => ValidationIssue[];
74
+ }
75
+ export interface ModelProfile {
76
+ id: string;
77
+ tools: Record<string, ToolSchema>;
78
+ }
79
+ export interface ParseOptions {
80
+ allowedTools?: Set<string>;
81
+ }
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import type { ParseErrorResult } from "./types";
2
+ import type { SDKErrorCode } from "./errors";
3
+ export declare function makeParseError(code: SDKErrorCode, message: string, raw: string): ParseErrorResult;
4
+ export declare function isPlainObject(value: unknown): value is Record<string, any>;
5
+ export declare function isNonEmptyString(value: unknown): value is string;
6
+ export declare function isFiniteNumber(value: unknown): value is number;
7
+ export declare function isLikelyTokenAddress(value: string): boolean;
8
+ export declare function decodeXml(value: string): string;
9
+ export declare function parseLooseXmlValue(raw: string): any;
package/dist/utils.js ADDED
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeParseError = makeParseError;
4
+ exports.isPlainObject = isPlainObject;
5
+ exports.isNonEmptyString = isNonEmptyString;
6
+ exports.isFiniteNumber = isFiniteNumber;
7
+ exports.isLikelyTokenAddress = isLikelyTokenAddress;
8
+ exports.decodeXml = decodeXml;
9
+ exports.parseLooseXmlValue = parseLooseXmlValue;
10
+ function makeParseError(code, message, raw) {
11
+ return { type: "parse_error", code, message, raw };
12
+ }
13
+ function isPlainObject(value) {
14
+ return typeof value === "object" && value !== null && !Array.isArray(value);
15
+ }
16
+ function isNonEmptyString(value) {
17
+ return typeof value === "string" && value.trim().length > 0;
18
+ }
19
+ function isFiniteNumber(value) {
20
+ return typeof value === "number" && Number.isFinite(value);
21
+ }
22
+ function isLikelyTokenAddress(value) {
23
+ const trimmed = value.trim();
24
+ if (trimmed.length === 0) {
25
+ return false;
26
+ }
27
+ // EVM address format.
28
+ if (/^0x[a-fA-F0-9]{40}$/.test(trimmed)) {
29
+ return true;
30
+ }
31
+ // Solana-like Base58 contract address.
32
+ if (/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(trimmed)) {
33
+ return true;
34
+ }
35
+ return false;
36
+ }
37
+ function decodeXml(value) {
38
+ return value
39
+ .replace(/&lt;/g, "<")
40
+ .replace(/&gt;/g, ">")
41
+ .replace(/&quot;/g, '"')
42
+ .replace(/&apos;/g, "'")
43
+ .replace(/&amp;/g, "&");
44
+ }
45
+ function parseLooseXmlValue(raw) {
46
+ const value = decodeXml(raw).trim();
47
+ if (value.length === 0) {
48
+ return "";
49
+ }
50
+ if (value === "true") {
51
+ return true;
52
+ }
53
+ if (value === "false") {
54
+ return false;
55
+ }
56
+ if (value === "null") {
57
+ return null;
58
+ }
59
+ if (/^-?\d+(\.\d+)?$/.test(value)) {
60
+ return Number(value);
61
+ }
62
+ if ((value.startsWith("{") && value.endsWith("}")) ||
63
+ (value.startsWith("[") && value.endsWith("]"))) {
64
+ try {
65
+ return JSON.parse(value);
66
+ }
67
+ catch {
68
+ return value;
69
+ }
70
+ }
71
+ return value;
72
+ }
73
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;AAGA,wCAMC;AAED,sCAEC;AAED,4CAEC;AAED,wCAEC;AAED,oDAiBC;AAED,8BAOC;AAED,gDAgCC;AAhFD,SAAgB,cAAc,CAC5B,IAAkB,EAClB,OAAe,EACf,GAAW;IAEX,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AACrD,CAAC;AAED,SAAgB,aAAa,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAgB,gBAAgB,CAAC,KAAc;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,SAAgB,cAAc,CAAC,KAAc;IAC3C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED,SAAgB,oBAAoB,CAAC,KAAa;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sBAAsB;IACtB,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uCAAuC;IACvC,IAAI,+BAA+B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,SAAS,CAAC,KAAa;IACrC,OAAO,KAAK;SACT,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,SAAgB,kBAAkB,CAAC,GAAW;IAC5C,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC9C,CAAC;QACD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { BasicValidationResult, DetailedValidationResult, ModelProfile, ToolCallResult } from "./types";
2
+ export declare function validateDetailed(call: ToolCallResult, profile?: ModelProfile): DetailedValidationResult;
3
+ export declare function validate(call: ToolCallResult, profile?: ModelProfile): BasicValidationResult;
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateDetailed = validateDetailed;
4
+ exports.validate = validate;
5
+ const profiles_1 = require("./profiles");
6
+ const utils_1 = require("./utils");
7
+ function push(errors, code, message) {
8
+ errors.push({ code, message });
9
+ }
10
+ function validateByType(key, value, schema, errors) {
11
+ if (schema.type === "string") {
12
+ if (typeof value !== "string") {
13
+ push(errors, "E_PARAM_INVALID", `${key} must be a string.`);
14
+ return;
15
+ }
16
+ if (schema.nonEmpty && value.trim().length === 0) {
17
+ push(errors, "E_PARAM_INVALID", `${key} must be a non-empty string.`);
18
+ return;
19
+ }
20
+ if (schema.pattern) {
21
+ const regex = new RegExp(schema.pattern);
22
+ if (!regex.test(value)) {
23
+ push(errors, "E_PARAM_INVALID", `${key} does not match pattern ${schema.pattern}.`);
24
+ }
25
+ }
26
+ return;
27
+ }
28
+ if (schema.type === "number") {
29
+ if (!(0, utils_1.isFiniteNumber)(value)) {
30
+ push(errors, "E_PARAM_INVALID", `${key} must be a number.`);
31
+ return;
32
+ }
33
+ if (schema.min !== undefined && value < schema.min) {
34
+ push(errors, "E_PARAM_INVALID", `${key} must be >= ${schema.min}.`);
35
+ }
36
+ if (schema.max !== undefined && value > schema.max) {
37
+ push(errors, "E_PARAM_INVALID", `${key} must be <= ${schema.max}.`);
38
+ }
39
+ return;
40
+ }
41
+ if (schema.type === "boolean") {
42
+ if (typeof value !== "boolean") {
43
+ push(errors, "E_PARAM_INVALID", `${key} must be a boolean.`);
44
+ }
45
+ return;
46
+ }
47
+ if (!(0, utils_1.isPlainObject)(value)) {
48
+ push(errors, "E_PARAM_INVALID", `${key} must be an object.`);
49
+ }
50
+ }
51
+ function validateEnum(key, value, schema, errors) {
52
+ if (!schema.enum) {
53
+ return;
54
+ }
55
+ if (!schema.enum.includes(value)) {
56
+ push(errors, "E_PARAM_INVALID", `${key} must be one of: ${schema.enum.join(", ")}.`);
57
+ }
58
+ }
59
+ function validateDetailed(call, profile = profiles_1.DMIND_3_NANO_PROFILE) {
60
+ const errors = [];
61
+ const schema = profile.tools[call.tool];
62
+ if (!schema) {
63
+ push(errors, "E_TOOL_UNKNOWN", `Tool ${call.tool} is not defined in profile ${profile.id}.`);
64
+ return { ok: false, errors };
65
+ }
66
+ const args = call.args ?? {};
67
+ const parameterEntries = Object.entries(schema.parameters);
68
+ for (const [key, paramSchema] of parameterEntries) {
69
+ if (paramSchema.required && args[key] === undefined) {
70
+ push(errors, "E_PARAM_MISSING", `${key} is required for ${call.tool}.`);
71
+ }
72
+ }
73
+ if (schema.strict ?? true) {
74
+ for (const key of Object.keys(args)) {
75
+ if (!(key in schema.parameters)) {
76
+ push(errors, "E_PARAM_FORBIDDEN", `${call.tool} does not allow parameter: ${key}.`);
77
+ }
78
+ }
79
+ }
80
+ for (const [key, value] of Object.entries(args)) {
81
+ const paramSchema = schema.parameters[key];
82
+ if (!paramSchema) {
83
+ continue;
84
+ }
85
+ validateByType(key, value, paramSchema, errors);
86
+ validateEnum(key, value, paramSchema, errors);
87
+ }
88
+ if (schema.customValidate) {
89
+ errors.push(...schema.customValidate(args));
90
+ }
91
+ if (errors.length > 0) {
92
+ return { ok: false, errors };
93
+ }
94
+ return { ok: true };
95
+ }
96
+ function validate(call, profile = profiles_1.DMIND_3_NANO_PROFILE) {
97
+ const detailed = validateDetailed(call, profile);
98
+ if (detailed.ok) {
99
+ return { ok: true };
100
+ }
101
+ return {
102
+ ok: false,
103
+ errors: detailed.errors.map((item) => `${item.code}: ${item.message}`)
104
+ };
105
+ }
106
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@dmindai/sdk",
3
+ "version": "0.1.0",
4
+ "description": "TypeScript SDK for DMind AI — chat completions with built-in crypto trading tools (SEARCH_TOKEN, EXECUTE_SWAP).",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "README.md"
10
+ ],
11
+ "scripts": {
12
+ "build": "rm -rf dist && tsc -p tsconfig.json",
13
+ "clean": "rm -rf dist",
14
+ "test": "vitest run"
15
+ },
16
+ "keywords": [
17
+ "dmind",
18
+ "sdk",
19
+ "function-calling",
20
+ "tool-call",
21
+ "crypto",
22
+ "swap",
23
+ "web3",
24
+ "vllm"
25
+ ],
26
+ "author": "",
27
+ "license": "MIT",
28
+ "engines": {
29
+ "node": ">=18"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^24.0.0",
33
+ "typescript": "^5.8.0",
34
+ "vitest": "^3.2.0"
35
+ },
36
+ "dependencies": {
37
+ "zod": "^4.3.6"
38
+ }
39
+ }