opentool 0.8.21 → 0.8.22

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.
@@ -18,6 +18,7 @@ type StoreEventInput = ChainScope & {
18
18
  action?: StoreAction;
19
19
  notional?: string;
20
20
  metadata?: Record<string, unknown>;
21
+ market?: Record<string, unknown>;
21
22
  };
22
23
  interface StoreOptions {
23
24
  baseUrl?: string;
@@ -7,6 +7,14 @@ var StoreError = class extends Error {
7
7
  this.name = "StoreError";
8
8
  }
9
9
  };
10
+ var requiresMarketIdentity = (input) => {
11
+ const action = (input.action ?? "").toLowerCase();
12
+ if (action === "order" || action === "swap" || action === "trade") return true;
13
+ return false;
14
+ };
15
+ var hasMarketIdentity = (value) => {
16
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
17
+ };
10
18
  function resolveConfig(options) {
11
19
  const baseUrl = options?.baseUrl ?? process.env.BASE_URL ?? "https://api.openpond.ai";
12
20
  const apiKey = options?.apiKey ?? process.env.OPENPOND_API_KEY;
@@ -58,6 +66,9 @@ async function requestJson(url, options, init) {
58
66
  }
59
67
  }
60
68
  async function store(input, options) {
69
+ if (requiresMarketIdentity(input) && !hasMarketIdentity(input.market)) {
70
+ throw new StoreError("market is required for trade events");
71
+ }
61
72
  const { baseUrl, apiKey, fetchFn } = resolveConfig(options);
62
73
  const url = `${baseUrl}/apps/positions/tx`;
63
74
  let response;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/store/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["type StoreStatus =\n | \"submitted\"\n | \"pending\"\n | \"confirmed\"\n | \"failed\"\n | \"cancelled\"\n | \"filled\"\n | \"partial_fill\"\n | \"settled\"\n | \"info\";\n\nexport type StoreAction =\n | \"stake\"\n | \"swap\"\n | \"bridge\"\n | \"order\"\n | \"lend\"\n | \"repay\"\n | \"withdraw\"\n | \"custom\"\n | string;\n\ntype ChainScope =\n | { chainId: number; network?: never }\n | { network: string; chainId?: never }\n | { chainId?: never; network?: never };\n\nexport type StoreEventInput = ChainScope & {\n source: string;\n ref: string;\n status: StoreStatus;\n walletAddress?: `0x${string}`;\n action?: StoreAction;\n notional?: string; // decimal string recommended to avoid float precision issues\n metadata?: Record<string, unknown>;\n};\n\nexport interface StoreOptions {\n baseUrl?: string;\n apiKey?: string;\n fetchFn?: typeof fetch;\n}\n\nexport interface StoreResponse {\n id: string;\n status?: StoreStatus | null;\n}\n\nexport type StoreRetrieveParams = {\n source?: string;\n walletAddress?: `0x${string}`;\n symbol?: string;\n status?: StoreStatus[];\n since?: number;\n until?: number;\n limit?: number;\n cursor?: string;\n history?: boolean;\n};\n\nexport type StoreRetrieveResult = {\n items: Array<\n StoreEventInput & {\n timestamp?: number;\n updatedBy?: string | null;\n signerKeyId?: string | null;\n }\n >;\n cursor?: string | null;\n};\n\nexport type MyToolsResponse = {\n tools: Array<{\n id: string;\n name: string;\n displayName: string;\n description?: string;\n serverUrl: string;\n source: \"internal\" | \"public\";\n appId?: string;\n deploymentId?: string;\n metadata?: unknown;\n }>;\n};\n\nexport type ToolExecuteRequest = {\n appId: string;\n deploymentId: string;\n toolName: string;\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n body?: unknown;\n};\n\nexport type ToolExecuteResponse = {\n ok: boolean;\n status: number;\n data: unknown;\n};\n\nexport type AgentDigestRequest = {\n content: string;\n runAt?: string;\n metadata?: Record<string, unknown>;\n};\nexport class StoreError extends Error {\n constructor(\n message: string,\n public readonly status?: number,\n public readonly causeData?: unknown\n ) {\n super(message);\n this.name = \"StoreError\";\n }\n}\n\nfunction resolveConfig(options?: StoreOptions) {\n const baseUrl = options?.baseUrl ?? process.env.BASE_URL ?? \"https://api.openpond.ai\";\n const apiKey = options?.apiKey ?? process.env.OPENPOND_API_KEY;\n\n if (!baseUrl) {\n throw new StoreError(\"BASE_URL is required to store activity events\");\n }\n if (!apiKey) {\n throw new StoreError(\n \"OPENPOND_API_KEY is required to store activity events\"\n );\n }\n\n const normalizedBaseUrl = baseUrl.replace(/\\/$/, \"\");\n const fetchFn = options?.fetchFn ?? globalThis.fetch;\n if (!fetchFn) {\n throw new StoreError(\"Fetch is not available in this environment\");\n }\n\n return { baseUrl: normalizedBaseUrl, apiKey, fetchFn };\n}\n\nasync function requestJson(\n url: string,\n options: StoreOptions | undefined,\n init: RequestInit\n): Promise<unknown> {\n const { apiKey, fetchFn } = resolveConfig(options);\n const response = await fetchFn(url, {\n ...init,\n headers: {\n \"content-type\": \"application/json\",\n \"openpond-api-key\": apiKey,\n ...(init.headers ?? {}),\n },\n });\n\n if (!response.ok) {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = await response.text().catch(() => undefined);\n }\n throw new StoreError(\n `Request failed with status ${response.status}`,\n response.status,\n body\n );\n }\n\n if (response.status === 204) {\n return null;\n }\n\n try {\n return await response.json();\n } catch {\n return await response.text().catch(() => null);\n }\n}\n\n/**\n * Store a generic activity event (onchain tx, Hyperliquid order, etc.) in OpenPond.\n */\nexport async function store(\n input: StoreEventInput,\n options?: StoreOptions\n): Promise<StoreResponse> {\n const { baseUrl, apiKey, fetchFn } = resolveConfig(options);\n\n const url = `${baseUrl}/apps/positions/tx`;\n\n let response: Response;\n try {\n response = await fetchFn(url, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"openpond-api-key\": apiKey,\n },\n body: JSON.stringify(input),\n });\n } catch (error) {\n throw new StoreError(\"Failed to reach store endpoint\", undefined, error);\n }\n\n if (!response.ok) {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = await response.text().catch(() => undefined);\n }\n throw new StoreError(\n `Store request failed with status ${response.status}`,\n response.status,\n body\n );\n }\n\n try {\n const data = (await response.json()) as Partial<StoreResponse>;\n return {\n id: data.id ?? \"\",\n status: data.status ?? null,\n };\n } catch {\n // Response is optional; return empty success\n return { id: \"\", status: null };\n }\n}\n\n/**\n * Retrieve stored activity events for an app.\n */\nexport async function retrieve(\n params?: StoreRetrieveParams,\n options?: StoreOptions\n): Promise<StoreRetrieveResult> {\n const { baseUrl, apiKey, fetchFn } = resolveConfig(options);\n\n const url = new URL(`${baseUrl}/apps/positions/tx`);\n if (params?.source) url.searchParams.set(\"source\", params.source);\n if (params?.walletAddress) url.searchParams.set(\"walletAddress\", params.walletAddress);\n if (params?.symbol) url.searchParams.set(\"symbol\", params.symbol);\n if (params?.status?.length) url.searchParams.set(\"status\", params.status.join(\",\"));\n if (typeof params?.since === \"number\") url.searchParams.set(\"since\", params.since.toString());\n if (typeof params?.until === \"number\") url.searchParams.set(\"until\", params.until.toString());\n if (typeof params?.limit === \"number\") url.searchParams.set(\"limit\", params.limit.toString());\n if (params?.cursor) url.searchParams.set(\"cursor\", params.cursor);\n if (params?.history) url.searchParams.set(\"history\", \"true\");\n\n let response: Response;\n try {\n response = await fetchFn(url.toString(), {\n method: \"GET\",\n headers: {\n \"content-type\": \"application/json\",\n \"openpond-api-key\": apiKey,\n },\n });\n } catch (error) {\n throw new StoreError(\"Failed to reach store endpoint\", undefined, error);\n }\n\n if (!response.ok) {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = await response.text().catch(() => undefined);\n }\n throw new StoreError(\n `Store retrieve failed with status ${response.status}`,\n response.status,\n body\n );\n }\n\n const data = (await response.json().catch(() => null)) as StoreRetrieveResult | null;\n if (!data) {\n return { items: [], cursor: null };\n }\n return data;\n}\n\nexport async function getMyTools(options?: StoreOptions): Promise<MyToolsResponse> {\n const { baseUrl } = resolveConfig(options);\n const url = `${baseUrl}/apps/tools`;\n const data = (await requestJson(url, options, { method: \"GET\" })) as MyToolsResponse;\n return data;\n}\n\nexport async function getMyPerformance(options?: StoreOptions): Promise<unknown> {\n const { baseUrl } = resolveConfig(options);\n const url = `${baseUrl}/apps/performance`;\n return requestJson(url, options, { method: \"GET\" });\n}\n\nexport async function postAgentDigest(\n input: AgentDigestRequest,\n options?: StoreOptions\n): Promise<unknown> {\n const { baseUrl } = resolveConfig(options);\n const url = `${baseUrl}/apps/agent/digest`;\n return requestJson(url, options, {\n method: \"POST\",\n body: JSON.stringify(input),\n });\n}\n\nexport async function executeTool(\n input: ToolExecuteRequest,\n options?: StoreOptions\n): Promise<ToolExecuteResponse> {\n const { baseUrl } = resolveConfig(options);\n const url = `${baseUrl}/apps/tools/execute`;\n const data = (await requestJson(url, options, {\n method: \"POST\",\n body: JSON.stringify(input),\n })) as ToolExecuteResponse;\n return data;\n}\n"]}
1
+ {"version":3,"sources":["../../src/store/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["type StoreStatus =\n | \"submitted\"\n | \"pending\"\n | \"confirmed\"\n | \"failed\"\n | \"cancelled\"\n | \"filled\"\n | \"partial_fill\"\n | \"settled\"\n | \"info\";\n\nexport type StoreAction =\n | \"stake\"\n | \"swap\"\n | \"bridge\"\n | \"order\"\n | \"lend\"\n | \"repay\"\n | \"withdraw\"\n | \"custom\"\n | string;\n\ntype ChainScope =\n | { chainId: number; network?: never }\n | { network: string; chainId?: never }\n | { chainId?: never; network?: never };\n\nexport type StoreEventInput = ChainScope & {\n source: string;\n ref: string;\n status: StoreStatus;\n walletAddress?: `0x${string}`;\n action?: StoreAction;\n notional?: string; // decimal string recommended to avoid float precision issues\n metadata?: Record<string, unknown>;\n market?: Record<string, unknown>;\n};\n\nexport interface StoreOptions {\n baseUrl?: string;\n apiKey?: string;\n fetchFn?: typeof fetch;\n}\n\nexport interface StoreResponse {\n id: string;\n status?: StoreStatus | null;\n}\n\nexport type StoreRetrieveParams = {\n source?: string;\n walletAddress?: `0x${string}`;\n symbol?: string;\n status?: StoreStatus[];\n since?: number;\n until?: number;\n limit?: number;\n cursor?: string;\n history?: boolean;\n};\n\nexport type StoreRetrieveResult = {\n items: Array<\n StoreEventInput & {\n timestamp?: number;\n updatedBy?: string | null;\n signerKeyId?: string | null;\n }\n >;\n cursor?: string | null;\n};\n\nexport type MyToolsResponse = {\n tools: Array<{\n id: string;\n name: string;\n displayName: string;\n description?: string;\n serverUrl: string;\n source: \"internal\" | \"public\";\n appId?: string;\n deploymentId?: string;\n metadata?: unknown;\n }>;\n};\n\nexport type ToolExecuteRequest = {\n appId: string;\n deploymentId: string;\n toolName: string;\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n body?: unknown;\n};\n\nexport type ToolExecuteResponse = {\n ok: boolean;\n status: number;\n data: unknown;\n};\n\nexport type AgentDigestRequest = {\n content: string;\n runAt?: string;\n metadata?: Record<string, unknown>;\n};\nexport class StoreError extends Error {\n constructor(\n message: string,\n public readonly status?: number,\n public readonly causeData?: unknown\n ) {\n super(message);\n this.name = \"StoreError\";\n }\n}\n\nconst requiresMarketIdentity = (input: StoreEventInput): boolean => {\n const action = (input.action ?? \"\").toLowerCase();\n if (action === \"order\" || action === \"swap\" || action === \"trade\") return true;\n return false;\n};\n\nconst hasMarketIdentity = (value: unknown): value is Record<string, unknown> => {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n};\n\nfunction resolveConfig(options?: StoreOptions) {\n const baseUrl = options?.baseUrl ?? process.env.BASE_URL ?? \"https://api.openpond.ai\";\n const apiKey = options?.apiKey ?? process.env.OPENPOND_API_KEY;\n\n if (!baseUrl) {\n throw new StoreError(\"BASE_URL is required to store activity events\");\n }\n if (!apiKey) {\n throw new StoreError(\n \"OPENPOND_API_KEY is required to store activity events\"\n );\n }\n\n const normalizedBaseUrl = baseUrl.replace(/\\/$/, \"\");\n const fetchFn = options?.fetchFn ?? globalThis.fetch;\n if (!fetchFn) {\n throw new StoreError(\"Fetch is not available in this environment\");\n }\n\n return { baseUrl: normalizedBaseUrl, apiKey, fetchFn };\n}\n\nasync function requestJson(\n url: string,\n options: StoreOptions | undefined,\n init: RequestInit\n): Promise<unknown> {\n const { apiKey, fetchFn } = resolveConfig(options);\n const response = await fetchFn(url, {\n ...init,\n headers: {\n \"content-type\": \"application/json\",\n \"openpond-api-key\": apiKey,\n ...(init.headers ?? {}),\n },\n });\n\n if (!response.ok) {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = await response.text().catch(() => undefined);\n }\n throw new StoreError(\n `Request failed with status ${response.status}`,\n response.status,\n body\n );\n }\n\n if (response.status === 204) {\n return null;\n }\n\n try {\n return await response.json();\n } catch {\n return await response.text().catch(() => null);\n }\n}\n\n/**\n * Store a generic activity event (onchain tx, Hyperliquid order, etc.) in OpenPond.\n */\nexport async function store(\n input: StoreEventInput,\n options?: StoreOptions\n): Promise<StoreResponse> {\n if (requiresMarketIdentity(input) && !hasMarketIdentity(input.market)) {\n throw new StoreError(\"market is required for trade events\");\n }\n const { baseUrl, apiKey, fetchFn } = resolveConfig(options);\n\n const url = `${baseUrl}/apps/positions/tx`;\n\n let response: Response;\n try {\n response = await fetchFn(url, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"openpond-api-key\": apiKey,\n },\n body: JSON.stringify(input),\n });\n } catch (error) {\n throw new StoreError(\"Failed to reach store endpoint\", undefined, error);\n }\n\n if (!response.ok) {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = await response.text().catch(() => undefined);\n }\n throw new StoreError(\n `Store request failed with status ${response.status}`,\n response.status,\n body\n );\n }\n\n try {\n const data = (await response.json()) as Partial<StoreResponse>;\n return {\n id: data.id ?? \"\",\n status: data.status ?? null,\n };\n } catch {\n // Response is optional; return empty success\n return { id: \"\", status: null };\n }\n}\n\n/**\n * Retrieve stored activity events for an app.\n */\nexport async function retrieve(\n params?: StoreRetrieveParams,\n options?: StoreOptions\n): Promise<StoreRetrieveResult> {\n const { baseUrl, apiKey, fetchFn } = resolveConfig(options);\n\n const url = new URL(`${baseUrl}/apps/positions/tx`);\n if (params?.source) url.searchParams.set(\"source\", params.source);\n if (params?.walletAddress) url.searchParams.set(\"walletAddress\", params.walletAddress);\n if (params?.symbol) url.searchParams.set(\"symbol\", params.symbol);\n if (params?.status?.length) url.searchParams.set(\"status\", params.status.join(\",\"));\n if (typeof params?.since === \"number\") url.searchParams.set(\"since\", params.since.toString());\n if (typeof params?.until === \"number\") url.searchParams.set(\"until\", params.until.toString());\n if (typeof params?.limit === \"number\") url.searchParams.set(\"limit\", params.limit.toString());\n if (params?.cursor) url.searchParams.set(\"cursor\", params.cursor);\n if (params?.history) url.searchParams.set(\"history\", \"true\");\n\n let response: Response;\n try {\n response = await fetchFn(url.toString(), {\n method: \"GET\",\n headers: {\n \"content-type\": \"application/json\",\n \"openpond-api-key\": apiKey,\n },\n });\n } catch (error) {\n throw new StoreError(\"Failed to reach store endpoint\", undefined, error);\n }\n\n if (!response.ok) {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = await response.text().catch(() => undefined);\n }\n throw new StoreError(\n `Store retrieve failed with status ${response.status}`,\n response.status,\n body\n );\n }\n\n const data = (await response.json().catch(() => null)) as StoreRetrieveResult | null;\n if (!data) {\n return { items: [], cursor: null };\n }\n return data;\n}\n\nexport async function getMyTools(options?: StoreOptions): Promise<MyToolsResponse> {\n const { baseUrl } = resolveConfig(options);\n const url = `${baseUrl}/apps/tools`;\n const data = (await requestJson(url, options, { method: \"GET\" })) as MyToolsResponse;\n return data;\n}\n\nexport async function getMyPerformance(options?: StoreOptions): Promise<unknown> {\n const { baseUrl } = resolveConfig(options);\n const url = `${baseUrl}/apps/performance`;\n return requestJson(url, options, { method: \"GET\" });\n}\n\nexport async function postAgentDigest(\n input: AgentDigestRequest,\n options?: StoreOptions\n): Promise<unknown> {\n const { baseUrl } = resolveConfig(options);\n const url = `${baseUrl}/apps/agent/digest`;\n return requestJson(url, options, {\n method: \"POST\",\n body: JSON.stringify(input),\n });\n}\n\nexport async function executeTool(\n input: ToolExecuteRequest,\n options?: StoreOptions\n): Promise<ToolExecuteResponse> {\n const { baseUrl } = resolveConfig(options);\n const url = `${baseUrl}/apps/tools/execute`;\n const data = (await requestJson(url, options, {\n method: \"POST\",\n body: JSON.stringify(input),\n })) as ToolExecuteResponse;\n return data;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opentool",
3
- "version": "0.8.21",
3
+ "version": "0.8.22",
4
4
  "description": "OpenTool framework for building serverless MCP tools",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -10,7 +10,7 @@
10
10
  "validate": "opentool validate"
11
11
  },
12
12
  "dependencies": {
13
- "opentool": "^0.8.21",
13
+ "opentool": "^0.8.22",
14
14
  "zod": "^4.1.11"
15
15
  },
16
16
  "devDependencies": {