@tulip-systems/ai 0.11.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/LICENSE +662 -0
- package/dist/agents/lib/definitions.server.d.mts +11 -0
- package/dist/agents/lib/definitions.server.mjs +14 -0
- package/dist/agents/lib/delegation.server.d.mts +15 -0
- package/dist/agents/lib/delegation.server.mjs +28 -0
- package/dist/agents/lib/instructions.server.d.mts +14 -0
- package/dist/agents/lib/instructions.server.mjs +26 -0
- package/dist/agents/lib/types.d.mts +26 -0
- package/dist/agents/server.d.mts +5 -0
- package/dist/agents/server.mjs +5 -0
- package/dist/chat/client.d.mts +10 -0
- package/dist/chat/client.mjs +12 -0
- package/dist/chat/components/agent-activity.client.d.mts +14 -0
- package/dist/chat/components/agent-activity.client.mjs +26 -0
- package/dist/chat/components/assistant-panel.client.d.mts +40 -0
- package/dist/chat/components/assistant-panel.client.mjs +53 -0
- package/dist/chat/components/chat-composer.client.d.mts +160 -0
- package/dist/chat/components/chat-composer.client.mjs +266 -0
- package/dist/chat/components/chat-message.client.d.mts +92 -0
- package/dist/chat/components/chat-message.client.mjs +121 -0
- package/dist/chat/components/chat-thread.client.d.mts +130 -0
- package/dist/chat/components/chat-thread.client.mjs +164 -0
- package/dist/chat/components/message-part.client.d.mts +23 -0
- package/dist/chat/components/message-part.client.mjs +38 -0
- package/dist/chat/components/starter-prompts.client.d.mts +25 -0
- package/dist/chat/components/starter-prompts.client.mjs +31 -0
- package/dist/chat/components/tool-call-card.client.d.mts +29 -0
- package/dist/chat/components/tool-call-card.client.mjs +60 -0
- package/dist/chat/lib/classes.mjs +7 -0
- package/dist/chat/lib/parts.d.mts +10 -0
- package/dist/chat/lib/parts.mjs +25 -0
- package/dist/chat/lib/stream.server.d.mts +24 -0
- package/dist/chat/lib/stream.server.mjs +34 -0
- package/dist/chat/lib/types.d.mts +21 -0
- package/dist/chat/server.d.mts +3 -0
- package/dist/chat/server.mjs +3 -0
- package/dist/chat.d.mts +3 -0
- package/dist/chat.mjs +3 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.mjs +1 -0
- package/dist/mcp/lib/content.d.mts +66 -0
- package/dist/mcp/lib/content.d.mts.map +1 -0
- package/dist/mcp/lib/content.mjs +115 -0
- package/dist/mcp/lib/content.mjs.map +1 -0
- package/dist/mcp/lib/tool-result.server.d.mts +12 -0
- package/dist/mcp/lib/tool-result.server.d.mts.map +1 -0
- package/dist/mcp/lib/tool-result.server.mjs +10 -0
- package/dist/mcp/lib/tool-result.server.mjs.map +1 -0
- package/dist/mcp/lib/types.d.mts +27 -0
- package/dist/mcp/server.d.mts +3 -0
- package/dist/mcp/server.mjs +3 -0
- package/dist/mcp/types.d.mts +27 -0
- package/dist/mcp/types.d.mts.map +1 -0
- package/dist/server/mcp-content.d.mts +44 -0
- package/dist/server/mcp-content.d.mts.map +1 -0
- package/dist/server/mcp-content.mjs +71 -0
- package/dist/server/mcp-content.mjs.map +1 -0
- package/dist/server/tools.d.mts +61 -0
- package/dist/server/tools.d.mts.map +1 -0
- package/dist/server/tools.mjs +47 -0
- package/dist/server/tools.mjs.map +1 -0
- package/dist/server.d.mts +3 -0
- package/dist/server.mjs +4 -0
- package/dist/tools/client.d.mts +3 -0
- package/dist/tools/client.mjs +5 -0
- package/dist/tools/lib/ai-sdk.server.d.mts +12 -0
- package/dist/tools/lib/ai-sdk.server.d.mts.map +1 -0
- package/dist/tools/lib/ai-sdk.server.mjs +38 -0
- package/dist/tools/lib/ai-sdk.server.mjs.map +1 -0
- package/dist/tools/lib/define-tool.server.d.mts +9 -0
- package/dist/tools/lib/define-tool.server.d.mts.map +1 -0
- package/dist/tools/lib/define-tool.server.mjs +13 -0
- package/dist/tools/lib/define-tool.server.mjs.map +1 -0
- package/dist/tools/lib/definitions.client.d.mts +20 -0
- package/dist/tools/lib/definitions.client.mjs +21 -0
- package/dist/tools/lib/definitions.d.mts +16 -0
- package/dist/tools/lib/definitions.d.mts.map +1 -0
- package/dist/tools/lib/definitions.mjs +20 -0
- package/dist/tools/lib/definitions.mjs.map +1 -0
- package/dist/tools/lib/resolvers.d.mts +41 -0
- package/dist/tools/lib/resolvers.d.mts.map +1 -0
- package/dist/tools/lib/resolvers.mjs +43 -0
- package/dist/tools/lib/resolvers.mjs.map +1 -0
- package/dist/tools/lib/types.client.d.mts +13 -0
- package/dist/tools/lib/types.d.mts +33 -0
- package/dist/tools/resolvers/agent.server.d.mts +27 -0
- package/dist/tools/resolvers/agent.server.d.mts.map +1 -0
- package/dist/tools/resolvers/agent.server.mjs +44 -0
- package/dist/tools/resolvers/agent.server.mjs.map +1 -0
- package/dist/tools/resolvers/mcp.server.d.mts +31 -0
- package/dist/tools/resolvers/mcp.server.d.mts.map +1 -0
- package/dist/tools/resolvers/mcp.server.mjs +20 -0
- package/dist/tools/resolvers/mcp.server.mjs.map +1 -0
- package/dist/tools/server.d.mts +5 -0
- package/dist/tools/server.mjs +5 -0
- package/dist/tools/types.d.mts +33 -0
- package/dist/tools/types.d.mts.map +1 -0
- package/package.json +61 -0
- package/src/agents/entry.server.ts +7 -0
- package/src/agents/lib/definitions.server.ts +14 -0
- package/src/agents/lib/delegation.server.ts +33 -0
- package/src/agents/lib/instructions.server.ts +37 -0
- package/src/agents/lib/types.ts +32 -0
- package/src/chat/components/agent-activity.client.tsx +21 -0
- package/src/chat/components/chat-composer.client.tsx +379 -0
- package/src/chat/components/chat-message.client.tsx +166 -0
- package/src/chat/components/chat-thread.client.tsx +242 -0
- package/src/chat/components/message-part.client.tsx +59 -0
- package/src/chat/components/starter-prompts.client.tsx +49 -0
- package/src/chat/components/tool-call-card.client.tsx +78 -0
- package/src/chat/entry.client.ts +18 -0
- package/src/chat/entry.server.ts +5 -0
- package/src/chat/entry.ts +5 -0
- package/src/chat/lib/parts.ts +33 -0
- package/src/chat/lib/stream.server.ts +40 -0
- package/src/chat/lib/types.ts +20 -0
- package/src/entry.ts +24 -0
- package/src/mcp/entry.server.ts +2 -0
- package/src/mcp/lib/content.ts +131 -0
- package/src/mcp/lib/types.ts +28 -0
- package/src/styles.css +1 -0
- package/src/tools/entry.client.ts +7 -0
- package/src/tools/entry.server.ts +11 -0
- package/src/tools/lib/definitions.client.ts +21 -0
- package/src/tools/lib/definitions.ts +24 -0
- package/src/tools/lib/types.client.ts +11 -0
- package/src/tools/lib/types.ts +44 -0
- package/src/tools/resolvers/agent.server.ts +78 -0
- package/src/tools/resolvers/mcp.server.ts +40 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
//#region src/mcp/lib/content.ts
|
|
2
|
+
/**
|
|
3
|
+
* Creates a plain text MCP tool result.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* resolveMCPTool(getStatus, {
|
|
8
|
+
* content: ({ output }) => text(`Status: ${output.status}`),
|
|
9
|
+
* });
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
function text(value, options) {
|
|
13
|
+
return {
|
|
14
|
+
content: [{
|
|
15
|
+
type: "text",
|
|
16
|
+
text: value
|
|
17
|
+
}],
|
|
18
|
+
isError: options?.isError
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Creates a JSON MCP tool result with structured content preserved for clients that support it.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* resolveMCPTool(createProspect, {
|
|
27
|
+
* content: ({ output }) => json(output, { label: "Created prospect:" }),
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
function json(value, options) {
|
|
32
|
+
const serialized = JSON.stringify(value, null, 2);
|
|
33
|
+
return {
|
|
34
|
+
content: [{
|
|
35
|
+
type: "text",
|
|
36
|
+
text: options?.label ? `${options.label}\n\n${serialized}` : serialized
|
|
37
|
+
}],
|
|
38
|
+
structuredContent: value,
|
|
39
|
+
isError: options?.isError
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Creates an MCP resource result for text, blob, or URI-backed resources.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```ts
|
|
47
|
+
* resolveMCPTool(getInvoice, {
|
|
48
|
+
* content: ({ output }) =>
|
|
49
|
+
* resource({ uri: output.uri, mimeType: "application/pdf" }),
|
|
50
|
+
* });
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
function resource(value) {
|
|
54
|
+
return { content: [{
|
|
55
|
+
type: "resource",
|
|
56
|
+
resource: value
|
|
57
|
+
}] };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Creates a markdown table MCP result and keeps the original rows as structured content.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```ts
|
|
64
|
+
* resolveMCPTool(listCustomers, {
|
|
65
|
+
* content: ({ output }) =>
|
|
66
|
+
* table(output.customers, {
|
|
67
|
+
* title: "Customers",
|
|
68
|
+
* columns: ["id", "name"],
|
|
69
|
+
* }),
|
|
70
|
+
* });
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
function table(rows, options) {
|
|
74
|
+
const columns = options?.columns ?? getColumns(rows);
|
|
75
|
+
if (rows.length === 0 || columns.length === 0) return {
|
|
76
|
+
content: [{
|
|
77
|
+
type: "text",
|
|
78
|
+
text: options?.emptyText ?? "No results."
|
|
79
|
+
}],
|
|
80
|
+
structuredContent: {
|
|
81
|
+
columns,
|
|
82
|
+
rows
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const table = [
|
|
86
|
+
`| ${columns.join(" | ")} |`,
|
|
87
|
+
`| ${columns.map(() => "---").join(" | ")} |`,
|
|
88
|
+
...rows.map((row) => `| ${columns.map((column) => formatCell(row[column])).join(" | ")} |`)
|
|
89
|
+
].join("\n");
|
|
90
|
+
return {
|
|
91
|
+
content: [{
|
|
92
|
+
type: "text",
|
|
93
|
+
text: options?.title ? `${options.title}\n\n${table}` : table
|
|
94
|
+
}],
|
|
95
|
+
structuredContent: {
|
|
96
|
+
columns,
|
|
97
|
+
rows
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function getColumns(rows) {
|
|
102
|
+
return Array.from(new Set(rows.flatMap((row) => Object.keys(row))));
|
|
103
|
+
}
|
|
104
|
+
function formatCell(value) {
|
|
105
|
+
if (value === null || value === void 0) return "";
|
|
106
|
+
if (value instanceof Date) return value.toISOString();
|
|
107
|
+
if (typeof value === "object") return escapeMarkdownTableCell(JSON.stringify(value));
|
|
108
|
+
return escapeMarkdownTableCell(String(value));
|
|
109
|
+
}
|
|
110
|
+
function escapeMarkdownTableCell(value) {
|
|
111
|
+
return value.replaceAll("|", "\\|").replaceAll("\n", " ");
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
//#endregion
|
|
115
|
+
export { json, resource, table, text };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.mjs","names":[],"sources":["../../../src/mcp/lib/content.ts"],"sourcesContent":["import type { McpResourceContent, McpToolResult } from \"../types.js\";\n\nexport function textContent(text: string, options?: { isError?: boolean }): McpToolResult {\n return {\n content: [{ type: \"text\", text }],\n isError: options?.isError,\n };\n}\n\nexport function jsonContent<TValue>(\n value: TValue,\n options?: { label?: string; isError?: boolean },\n): McpToolResult<TValue> {\n const json = JSON.stringify(value, null, 2);\n\n return {\n content: [\n {\n type: \"text\",\n text: options?.label ? `${options.label}\\n\\n${json}` : json,\n },\n ],\n structuredContent: value,\n isError: options?.isError,\n };\n}\n\nexport function resourceContent(resource: McpResourceContent[\"resource\"]): McpToolResult {\n return {\n content: [{ type: \"resource\", resource }],\n };\n}\n\nexport function tableContent<TRow extends Record<string, unknown>>(\n rows: TRow[],\n options?: {\n columns?: Array<keyof TRow & string>;\n emptyText?: string;\n title?: string;\n },\n): McpToolResult<{ columns: string[]; rows: TRow[] }> {\n const columns = options?.columns ?? getColumns(rows);\n\n if (rows.length === 0 || columns.length === 0) {\n return {\n content: [{ type: \"text\", text: options?.emptyText ?? \"No results.\" }],\n structuredContent: { columns, rows },\n };\n }\n\n const header = `| ${columns.join(\" | \")} |`;\n const separator = `| ${columns.map(() => \"---\").join(\" | \")} |`;\n const body = rows.map(\n (row) => `| ${columns.map((column) => formatCell(row[column])).join(\" | \")} |`,\n );\n const table = [header, separator, ...body].join(\"\\n\");\n\n return {\n content: [{ type: \"text\", text: options?.title ? `${options.title}\\n\\n${table}` : table }],\n structuredContent: { columns, rows },\n };\n}\n\nfunction getColumns<TRow extends Record<string, unknown>>(rows: TRow[]) {\n return Array.from(new Set(rows.flatMap((row) => Object.keys(row))));\n}\n\nfunction formatCell(value: unknown) {\n if (value === null || value === undefined) {\n return \"\";\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (typeof value === \"object\") {\n return escapeMarkdownTableCell(JSON.stringify(value));\n }\n\n return escapeMarkdownTableCell(String(value));\n}\n\nfunction escapeMarkdownTableCell(value: string) {\n return value.replaceAll(\"|\", \"\\\\|\").replaceAll(\"\\n\", \" \");\n}\n"],"mappings":";AAEA,SAAgB,YAAY,MAAc,SAAgD;AACxF,QAAO;EACL,SAAS,CAAC;GAAE,MAAM;GAAQ;GAAM,CAAC;EACjC,SAAS,SAAS;EACnB;;AAGH,SAAgB,YACd,OACA,SACuB;CACvB,MAAM,OAAO,KAAK,UAAU,OAAO,MAAM,EAAE;AAE3C,QAAO;EACL,SAAS,CACP;GACE,MAAM;GACN,MAAM,SAAS,QAAQ,GAAG,QAAQ,MAAM,MAAM,SAAS;GACxD,CACF;EACD,mBAAmB;EACnB,SAAS,SAAS;EACnB;;AAGH,SAAgB,gBAAgB,UAAyD;AACvF,QAAO,EACL,SAAS,CAAC;EAAE,MAAM;EAAY;EAAU,CAAC,EAC1C;;AAGH,SAAgB,aACd,MACA,SAKoD;CACpD,MAAM,UAAU,SAAS,WAAW,WAAW,KAAK;AAEpD,KAAI,KAAK,WAAW,KAAK,QAAQ,WAAW,EAC1C,QAAO;EACL,SAAS,CAAC;GAAE,MAAM;GAAQ,MAAM,SAAS,aAAa;GAAe,CAAC;EACtE,mBAAmB;GAAE;GAAS;GAAM;EACrC;CAQH,MAAM,QAAQ;EALC,KAAK,QAAQ,KAAK,MAAM,CAAC;EACtB,KAAK,QAAQ,UAAU,MAAM,CAAC,KAAK,MAAM,CAAC;EAI1B,GAHrB,KAAK,KACf,QAAQ,KAAK,QAAQ,KAAK,WAAW,WAAW,IAAI,QAAQ,CAAC,CAAC,KAAK,MAAM,CAAC,IAC5E;EACyC,CAAC,KAAK,KAAK;AAErD,QAAO;EACL,SAAS,CAAC;GAAE,MAAM;GAAQ,MAAM,SAAS,QAAQ,GAAG,QAAQ,MAAM,MAAM,UAAU;GAAO,CAAC;EAC1F,mBAAmB;GAAE;GAAS;GAAM;EACrC;;AAGH,SAAS,WAAiD,MAAc;AACtE,QAAO,MAAM,KAAK,IAAI,IAAI,KAAK,SAAS,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC;;AAGrE,SAAS,WAAW,OAAgB;AAClC,KAAI,UAAU,QAAQ,UAAU,OAC9B,QAAO;AAGT,KAAI,iBAAiB,KACnB,QAAO,MAAM,aAAa;AAG5B,KAAI,OAAO,UAAU,SACnB,QAAO,wBAAwB,KAAK,UAAU,MAAM,CAAC;AAGvD,QAAO,wBAAwB,OAAO,MAAM,CAAC;;AAG/C,SAAS,wBAAwB,OAAe;AAC9C,QAAO,MAAM,WAAW,KAAK,MAAM,CAAC,WAAW,MAAM,IAAI"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { McpToolResult } from "../types.mjs";
|
|
2
|
+
import { TulipToolDefinition } from "../../tools/types.mjs";
|
|
3
|
+
import "server-cli-only";
|
|
4
|
+
|
|
5
|
+
//#region src/mcp/lib/tool-result.server.d.ts
|
|
6
|
+
declare function toMcpToolResult<TInput, TOutput>(definition: TulipToolDefinition<string, TInput, TOutput>, options: {
|
|
7
|
+
input: TInput;
|
|
8
|
+
output: TOutput;
|
|
9
|
+
}): Promise<McpToolResult | undefined>;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { toMcpToolResult };
|
|
12
|
+
//# sourceMappingURL=tool-result.server.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-result.server.d.mts","names":[],"sources":["../../../src/mcp/lib/tool-result.server.ts"],"mappings":";;;;;iBAIsB,eAAA,iBAAA,CACpB,UAAA,EAAY,mBAAA,SAA4B,MAAA,EAAQ,OAAA,GAChD,OAAA;EAAW,KAAA,EAAO,MAAA;EAAQ,MAAA,EAAQ,OAAA;AAAA,IAAS,OAAA,CAAF,aAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import "server-cli-only";
|
|
2
|
+
|
|
3
|
+
//#region src/mcp/lib/tool-result.server.ts
|
|
4
|
+
async function toMcpToolResult(definition, options) {
|
|
5
|
+
return definition.mcp?.toContent?.(options);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
//#endregion
|
|
9
|
+
export { toMcpToolResult };
|
|
10
|
+
//# sourceMappingURL=tool-result.server.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-result.server.mjs","names":[],"sources":["../../../src/mcp/lib/tool-result.server.ts"],"sourcesContent":["import \"server-cli-only\";\n\nimport type { TulipToolDefinition } from \"../../tools/types.js\";\n\nexport async function toMcpToolResult<TInput, TOutput>(\n definition: TulipToolDefinition<string, TInput, TOutput>,\n options: { input: TInput; output: TOutput },\n) {\n return definition.mcp?.toContent?.(options);\n}\n"],"mappings":";;;AAIA,eAAsB,gBACpB,YACA,SACA;AACA,QAAO,WAAW,KAAK,YAAY,QAAQ"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//#region src/mcp/lib/types.d.ts
|
|
2
|
+
type McpTextContent = {
|
|
3
|
+
type: "text";
|
|
4
|
+
text: string;
|
|
5
|
+
};
|
|
6
|
+
type McpImageContent = {
|
|
7
|
+
type: "image";
|
|
8
|
+
data: string;
|
|
9
|
+
mimeType: string;
|
|
10
|
+
};
|
|
11
|
+
type McpResourceContent = {
|
|
12
|
+
type: "resource";
|
|
13
|
+
resource: {
|
|
14
|
+
uri: string;
|
|
15
|
+
mimeType?: string;
|
|
16
|
+
text?: string;
|
|
17
|
+
blob?: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
type McpContent = McpTextContent | McpImageContent | McpResourceContent;
|
|
21
|
+
type McpToolResult<TStructuredContent = unknown> = {
|
|
22
|
+
content: McpContent[];
|
|
23
|
+
structuredContent?: TStructuredContent;
|
|
24
|
+
isError?: boolean;
|
|
25
|
+
};
|
|
26
|
+
//#endregion
|
|
27
|
+
export { McpContent, McpImageContent, McpResourceContent, McpTextContent, McpToolResult };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { McpContent, McpImageContent, McpResourceContent, McpTextContent, McpToolResult } from "./lib/types.mjs";
|
|
2
|
+
import { json, resource, table, text } from "./lib/content.mjs";
|
|
3
|
+
export { McpContent, McpImageContent, McpResourceContent, McpTextContent, McpToolResult, json, resource, table, text };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//#region src/mcp/types.d.ts
|
|
2
|
+
type McpTextContent = {
|
|
3
|
+
type: "text";
|
|
4
|
+
text: string;
|
|
5
|
+
};
|
|
6
|
+
type McpImageContent = {
|
|
7
|
+
type: "image";
|
|
8
|
+
data: string;
|
|
9
|
+
mimeType: string;
|
|
10
|
+
};
|
|
11
|
+
type McpResourceContent = {
|
|
12
|
+
type: "resource";
|
|
13
|
+
resource: {
|
|
14
|
+
uri: string;
|
|
15
|
+
mimeType?: string;
|
|
16
|
+
text?: string;
|
|
17
|
+
blob?: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
type McpContent = McpTextContent | McpImageContent | McpResourceContent;
|
|
21
|
+
type McpToolResult<TStructuredContent = unknown> = {
|
|
22
|
+
content: McpContent[];
|
|
23
|
+
structuredContent?: TStructuredContent;
|
|
24
|
+
isError?: boolean;
|
|
25
|
+
};
|
|
26
|
+
//#endregion
|
|
27
|
+
export { McpContent, McpImageContent, McpResourceContent, McpTextContent, McpToolResult };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/mcp/types.ts"],"mappings":";KAAY,cAAA;EACV,IAAA;EACA,IAAA;AAAA;AAAA,KAGU,eAAA;EACV,IAAA;EACA,IAAA;EACA,QAAA;AAAA;AAAA,KAGU,kBAAA;EACV,IAAA;EACA,QAAA;IACE,GAAA;IACA,QAAA;IACA,IAAA;IACA,IAAA;EAAA;AAAA;AAAA,KAIQ,UAAA,GAAa,cAAA,GAAiB,eAAA,GAAkB,kBAAA;AAAA,KAEhD,aAAA;EACV,OAAA,EAAS,UAAA;EACT,iBAAA,GAAoB,kBAAA;EACpB,OAAA;AAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
//#region src/server/mcp-content.d.ts
|
|
2
|
+
type McpTextContent = {
|
|
3
|
+
type: "text";
|
|
4
|
+
text: string;
|
|
5
|
+
};
|
|
6
|
+
type McpImageContent = {
|
|
7
|
+
type: "image";
|
|
8
|
+
data: string;
|
|
9
|
+
mimeType: string;
|
|
10
|
+
};
|
|
11
|
+
type McpResourceContent = {
|
|
12
|
+
type: "resource";
|
|
13
|
+
resource: {
|
|
14
|
+
uri: string;
|
|
15
|
+
mimeType?: string;
|
|
16
|
+
text?: string;
|
|
17
|
+
blob?: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
type McpContent = McpTextContent | McpImageContent | McpResourceContent;
|
|
21
|
+
type McpToolResult<TStructuredContent = unknown> = {
|
|
22
|
+
content: McpContent[];
|
|
23
|
+
structuredContent?: TStructuredContent;
|
|
24
|
+
isError?: boolean;
|
|
25
|
+
};
|
|
26
|
+
declare function textContent(text: string, options?: {
|
|
27
|
+
isError?: boolean;
|
|
28
|
+
}): McpToolResult;
|
|
29
|
+
declare function jsonContent<TValue>(value: TValue, options?: {
|
|
30
|
+
label?: string;
|
|
31
|
+
isError?: boolean;
|
|
32
|
+
}): McpToolResult<TValue>;
|
|
33
|
+
declare function resourceContent(resource: McpResourceContent["resource"]): McpToolResult;
|
|
34
|
+
declare function tableContent<TRow extends Record<string, unknown>>(rows: TRow[], options?: {
|
|
35
|
+
columns?: Array<keyof TRow & string>;
|
|
36
|
+
emptyText?: string;
|
|
37
|
+
title?: string;
|
|
38
|
+
}): McpToolResult<{
|
|
39
|
+
columns: string[];
|
|
40
|
+
rows: TRow[];
|
|
41
|
+
}>;
|
|
42
|
+
//#endregion
|
|
43
|
+
export { McpContent, McpImageContent, McpResourceContent, McpTextContent, McpToolResult, jsonContent, resourceContent, tableContent, textContent };
|
|
44
|
+
//# sourceMappingURL=mcp-content.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-content.d.mts","names":[],"sources":["../../src/server/mcp-content.ts"],"mappings":";KAAY,cAAA;EACV,IAAA;EACA,IAAA;AAAA;AAAA,KAGU,eAAA;EACV,IAAA;EACA,IAAA;EACA,QAAA;AAAA;AAAA,KAGU,kBAAA;EACV,IAAA;EACA,QAAA;IACE,GAAA;IACA,QAAA;IACA,IAAA;IACA,IAAA;EAAA;AAAA;AAAA,KAIQ,UAAA,GAAa,cAAA,GAAiB,eAAA,GAAkB,kBAAA;AAAA,KAEhD,aAAA;EACV,OAAA,EAAS,UAAA;EACT,iBAAA,GAAoB,kBAAA;EACpB,OAAA;AAAA;AAAA,iBAGc,WAAA,CAAY,IAAA,UAAc,OAAA;EAAY,OAAA;AAAA,IAAsB,aAAA;AAAA,iBAO5D,WAAA,QAAA,CACd,KAAA,EAAO,MAAA,EACP,OAAA;EAAY,KAAA;EAAgB,OAAA;AAAA,IAC3B,aAAA,CAAc,MAAA;AAAA,iBAeD,eAAA,CAAgB,QAAA,EAAU,kBAAA,eAAiC,aAAA;AAAA,iBAM3D,YAAA,cAA0B,MAAA,kBAAA,CACxC,IAAA,EAAM,IAAA,IACN,OAAA;EACE,OAAA,GAAU,KAAA,OAAY,IAAA;EACtB,SAAA;EACA,KAAA;AAAA,IAED,aAAA;EAAgB,OAAA;EAAmB,IAAA,EAAM,IAAA;AAAA"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
//#region src/server/mcp-content.ts
|
|
2
|
+
function textContent(text, options) {
|
|
3
|
+
return {
|
|
4
|
+
content: [{
|
|
5
|
+
type: "text",
|
|
6
|
+
text
|
|
7
|
+
}],
|
|
8
|
+
isError: options?.isError
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function jsonContent(value, options) {
|
|
12
|
+
const json = JSON.stringify(value, null, 2);
|
|
13
|
+
return {
|
|
14
|
+
content: [{
|
|
15
|
+
type: "text",
|
|
16
|
+
text: options?.label ? `${options.label}\n\n${json}` : json
|
|
17
|
+
}],
|
|
18
|
+
structuredContent: value,
|
|
19
|
+
isError: options?.isError
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function resourceContent(resource) {
|
|
23
|
+
return { content: [{
|
|
24
|
+
type: "resource",
|
|
25
|
+
resource
|
|
26
|
+
}] };
|
|
27
|
+
}
|
|
28
|
+
function tableContent(rows, options) {
|
|
29
|
+
const columns = options?.columns ?? getColumns(rows);
|
|
30
|
+
if (rows.length === 0 || columns.length === 0) return {
|
|
31
|
+
content: [{
|
|
32
|
+
type: "text",
|
|
33
|
+
text: options?.emptyText ?? "No results."
|
|
34
|
+
}],
|
|
35
|
+
structuredContent: {
|
|
36
|
+
columns,
|
|
37
|
+
rows
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const table = [
|
|
41
|
+
`| ${columns.join(" | ")} |`,
|
|
42
|
+
`| ${columns.map(() => "---").join(" | ")} |`,
|
|
43
|
+
...rows.map((row) => `| ${columns.map((column) => formatCell(row[column])).join(" | ")} |`)
|
|
44
|
+
].join("\n");
|
|
45
|
+
return {
|
|
46
|
+
content: [{
|
|
47
|
+
type: "text",
|
|
48
|
+
text: options?.title ? `${options.title}\n\n${table}` : table
|
|
49
|
+
}],
|
|
50
|
+
structuredContent: {
|
|
51
|
+
columns,
|
|
52
|
+
rows
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function getColumns(rows) {
|
|
57
|
+
return Array.from(new Set(rows.flatMap((row) => Object.keys(row))));
|
|
58
|
+
}
|
|
59
|
+
function formatCell(value) {
|
|
60
|
+
if (value === null || value === void 0) return "";
|
|
61
|
+
if (value instanceof Date) return value.toISOString();
|
|
62
|
+
if (typeof value === "object") return escapeMarkdownTableCell(JSON.stringify(value));
|
|
63
|
+
return escapeMarkdownTableCell(String(value));
|
|
64
|
+
}
|
|
65
|
+
function escapeMarkdownTableCell(value) {
|
|
66
|
+
return value.replaceAll("|", "\\|").replaceAll("\n", " ");
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
//#endregion
|
|
70
|
+
export { jsonContent, resourceContent, tableContent, textContent };
|
|
71
|
+
//# sourceMappingURL=mcp-content.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-content.mjs","names":[],"sources":["../../src/server/mcp-content.ts"],"sourcesContent":["export type McpTextContent = {\n type: \"text\";\n text: string;\n};\n\nexport type McpImageContent = {\n type: \"image\";\n data: string;\n mimeType: string;\n};\n\nexport type McpResourceContent = {\n type: \"resource\";\n resource: {\n uri: string;\n mimeType?: string;\n text?: string;\n blob?: string;\n };\n};\n\nexport type McpContent = McpTextContent | McpImageContent | McpResourceContent;\n\nexport type McpToolResult<TStructuredContent = unknown> = {\n content: McpContent[];\n structuredContent?: TStructuredContent;\n isError?: boolean;\n};\n\nexport function textContent(text: string, options?: { isError?: boolean }): McpToolResult {\n return {\n content: [{ type: \"text\", text }],\n isError: options?.isError,\n };\n}\n\nexport function jsonContent<TValue>(\n value: TValue,\n options?: { label?: string; isError?: boolean },\n): McpToolResult<TValue> {\n const json = JSON.stringify(value, null, 2);\n\n return {\n content: [\n {\n type: \"text\",\n text: options?.label ? `${options.label}\\n\\n${json}` : json,\n },\n ],\n structuredContent: value,\n isError: options?.isError,\n };\n}\n\nexport function resourceContent(resource: McpResourceContent[\"resource\"]): McpToolResult {\n return {\n content: [{ type: \"resource\", resource }],\n };\n}\n\nexport function tableContent<TRow extends Record<string, unknown>>(\n rows: TRow[],\n options?: {\n columns?: Array<keyof TRow & string>;\n emptyText?: string;\n title?: string;\n },\n): McpToolResult<{ columns: string[]; rows: TRow[] }> {\n const columns = options?.columns ?? getColumns(rows);\n\n if (rows.length === 0 || columns.length === 0) {\n return {\n content: [{ type: \"text\", text: options?.emptyText ?? \"No results.\" }],\n structuredContent: { columns, rows },\n };\n }\n\n const header = `| ${columns.join(\" | \")} |`;\n const separator = `| ${columns.map(() => \"---\").join(\" | \")} |`;\n const body = rows.map(\n (row) => `| ${columns.map((column) => formatCell(row[column])).join(\" | \")} |`,\n );\n const table = [header, separator, ...body].join(\"\\n\");\n\n return {\n content: [{ type: \"text\", text: options?.title ? `${options.title}\\n\\n${table}` : table }],\n structuredContent: { columns, rows },\n };\n}\n\nfunction getColumns<TRow extends Record<string, unknown>>(rows: TRow[]) {\n return Array.from(new Set(rows.flatMap((row) => Object.keys(row))));\n}\n\nfunction formatCell(value: unknown) {\n if (value === null || value === undefined) {\n return \"\";\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (typeof value === \"object\") {\n return escapeMarkdownTableCell(JSON.stringify(value));\n }\n\n return escapeMarkdownTableCell(String(value));\n}\n\nfunction escapeMarkdownTableCell(value: string) {\n return value.replaceAll(\"|\", \"\\\\|\").replaceAll(\"\\n\", \" \");\n}\n"],"mappings":";AA6BA,SAAgB,YAAY,MAAc,SAAgD;AACxF,QAAO;EACL,SAAS,CAAC;GAAE,MAAM;GAAQ;GAAM,CAAC;EACjC,SAAS,SAAS;EACnB;;AAGH,SAAgB,YACd,OACA,SACuB;CACvB,MAAM,OAAO,KAAK,UAAU,OAAO,MAAM,EAAE;AAE3C,QAAO;EACL,SAAS,CACP;GACE,MAAM;GACN,MAAM,SAAS,QAAQ,GAAG,QAAQ,MAAM,MAAM,SAAS;GACxD,CACF;EACD,mBAAmB;EACnB,SAAS,SAAS;EACnB;;AAGH,SAAgB,gBAAgB,UAAyD;AACvF,QAAO,EACL,SAAS,CAAC;EAAE,MAAM;EAAY;EAAU,CAAC,EAC1C;;AAGH,SAAgB,aACd,MACA,SAKoD;CACpD,MAAM,UAAU,SAAS,WAAW,WAAW,KAAK;AAEpD,KAAI,KAAK,WAAW,KAAK,QAAQ,WAAW,EAC1C,QAAO;EACL,SAAS,CAAC;GAAE,MAAM;GAAQ,MAAM,SAAS,aAAa;GAAe,CAAC;EACtE,mBAAmB;GAAE;GAAS;GAAM;EACrC;CAQH,MAAM,QAAQ;EALC,KAAK,QAAQ,KAAK,MAAM,CAAC;EACtB,KAAK,QAAQ,UAAU,MAAM,CAAC,KAAK,MAAM,CAAC;EAI1B,GAHrB,KAAK,KACf,QAAQ,KAAK,QAAQ,KAAK,WAAW,WAAW,IAAI,QAAQ,CAAC,CAAC,KAAK,MAAM,CAAC,IAC5E;EACyC,CAAC,KAAK,KAAK;AAErD,QAAO;EACL,SAAS,CAAC;GAAE,MAAM;GAAQ,MAAM,SAAS,QAAQ,GAAG,QAAQ,MAAM,MAAM,UAAU;GAAO,CAAC;EAC1F,mBAAmB;GAAE;GAAS;GAAM;EACrC;;AAGH,SAAS,WAAiD,MAAc;AACtE,QAAO,MAAM,KAAK,IAAI,IAAI,KAAK,SAAS,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC;;AAGrE,SAAS,WAAW,OAAgB;AAClC,KAAI,UAAU,QAAQ,UAAU,OAC9B,QAAO;AAGT,KAAI,iBAAiB,KACnB,QAAO,MAAM,aAAa;AAG5B,KAAI,OAAO,UAAU,SACnB,QAAO,wBAAwB,KAAK,UAAU,MAAM,CAAC;AAGvD,QAAO,wBAAwB,OAAO,MAAM,CAAC;;AAG/C,SAAS,wBAAwB,OAAe;AAC9C,QAAO,MAAM,WAAW,KAAK,MAAM,CAAC,WAAW,MAAM,IAAI"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { McpToolResult } from "./mcp-content.mjs";
|
|
2
|
+
import "server-cli-only";
|
|
3
|
+
import { FlexibleSchema, Tool, ToolExecuteFunction, ToolExecutionOptions } from "ai";
|
|
4
|
+
|
|
5
|
+
//#region src/server/tools.d.ts
|
|
6
|
+
type ToolContext = Record<string, unknown>;
|
|
7
|
+
type ToolConfirmation = false | {
|
|
8
|
+
required?: boolean;
|
|
9
|
+
title?: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
destructive?: boolean;
|
|
12
|
+
};
|
|
13
|
+
type ToolAudit = {
|
|
14
|
+
action: string;
|
|
15
|
+
resource?: string;
|
|
16
|
+
severity?: "low" | "medium" | "high";
|
|
17
|
+
};
|
|
18
|
+
type ToolDisplay = {
|
|
19
|
+
label?: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
icon?: string;
|
|
22
|
+
};
|
|
23
|
+
type ToolMcpOptions<TInput, TOutput> = {
|
|
24
|
+
title?: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
toContent?: (options: {
|
|
27
|
+
input: TInput;
|
|
28
|
+
output: TOutput;
|
|
29
|
+
}) => McpToolResult | Promise<McpToolResult>;
|
|
30
|
+
};
|
|
31
|
+
type ToolMetadata<TInput, TOutput> = {
|
|
32
|
+
permissions?: string[];
|
|
33
|
+
confirmation?: ToolConfirmation;
|
|
34
|
+
audit?: ToolAudit;
|
|
35
|
+
ui?: ToolDisplay;
|
|
36
|
+
mcp?: ToolMcpOptions<TInput, TOutput>;
|
|
37
|
+
};
|
|
38
|
+
type TulipToolDefinition<TName extends string = string, TInput = unknown, TOutput = unknown, TContext extends ToolContext = ToolContext> = ToolMetadata<TInput, TOutput> & {
|
|
39
|
+
name: TName;
|
|
40
|
+
title: string;
|
|
41
|
+
description: string;
|
|
42
|
+
inputSchema: FlexibleSchema<TInput>;
|
|
43
|
+
outputSchema?: FlexibleSchema<TOutput>;
|
|
44
|
+
contextSchema?: FlexibleSchema<TContext>;
|
|
45
|
+
execute: ToolExecuteFunction<TInput, TOutput, TContext>;
|
|
46
|
+
};
|
|
47
|
+
type TulipToolSet = Record<string, TulipToolDefinition>;
|
|
48
|
+
declare function defineTool<const TName extends string, TInput, TOutput, TContext extends ToolContext = ToolContext>(definition: TulipToolDefinition<TName, TInput, TOutput, TContext>): TulipToolDefinition<TName, TInput, TOutput, TContext>;
|
|
49
|
+
declare function defineToolSet<const TTools extends TulipToolSet>(tools: TTools): TTools;
|
|
50
|
+
declare function toAiSdkTool<TInput, TOutput, TContext extends ToolContext>(definition: TulipToolDefinition<string, TInput, TOutput, TContext>): Tool<TInput, TOutput, TContext>;
|
|
51
|
+
declare function toAiSdkToolSet<TTools extends TulipToolSet>(tools: TTools): {
|
|
52
|
+
[k: string]: Tool<unknown, unknown, ToolContext>;
|
|
53
|
+
};
|
|
54
|
+
declare function toMcpToolResult<TInput, TOutput>(definition: TulipToolDefinition<string, TInput, TOutput>, options: {
|
|
55
|
+
input: TInput;
|
|
56
|
+
output: TOutput;
|
|
57
|
+
}): Promise<McpToolResult | undefined>;
|
|
58
|
+
type TulipToolExecutionOptions<TContext extends ToolContext = ToolContext> = ToolExecutionOptions<TContext>;
|
|
59
|
+
//#endregion
|
|
60
|
+
export { ToolAudit, ToolConfirmation, ToolContext, ToolDisplay, ToolMcpOptions, ToolMetadata, TulipToolDefinition, TulipToolExecutionOptions, TulipToolSet, defineTool, defineToolSet, toAiSdkTool, toAiSdkToolSet, toMcpToolResult };
|
|
61
|
+
//# sourceMappingURL=tools.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.mts","names":[],"sources":["../../src/server/tools.ts"],"mappings":";;;;;KAWY,WAAA,GAAc,MAAA;AAAA,KAEd,gBAAA;EAGN,QAAA;EACA,KAAA;EACA,WAAA;EACA,WAAA;AAAA;AAAA,KAGM,SAAA;EACV,MAAA;EACA,QAAA;EACA,QAAA;AAAA;AAAA,KAGU,WAAA;EACV,KAAA;EACA,WAAA;EACA,IAAA;AAAA;AAAA,KAGU,cAAA;EACV,KAAA;EACA,WAAA;EACA,SAAA,IAAa,OAAA;IACX,KAAA,EAAO,MAAA;IACP,MAAA,EAAQ,OAAA;EAAA,MACJ,aAAA,GAAgB,OAAA,CAAQ,aAAA;AAAA;AAAA,KAGpB,YAAA;EACV,WAAA;EACA,YAAA,GAAe,gBAAA;EACf,KAAA,GAAQ,SAAA;EACR,EAAA,GAAK,WAAA;EACL,GAAA,GAAM,cAAA,CAAe,MAAA,EAAQ,OAAA;AAAA;AAAA,KAGnB,mBAAA,sFAIO,WAAA,GAAc,WAAA,IAC7B,YAAA,CAAa,MAAA,EAAQ,OAAA;EACvB,IAAA,EAAM,KAAA;EACN,KAAA;EACA,WAAA;EACA,WAAA,EAAa,cAAA,CAAe,MAAA;EAC5B,YAAA,GAAe,cAAA,CAAe,OAAA;EAC9B,aAAA,GAAgB,cAAA,CAAe,QAAA;EAC/B,OAAA,EAAS,mBAAA,CAAoB,MAAA,EAAQ,OAAA,EAAS,QAAA;AAAA;AAAA,KAGpC,YAAA,GAAe,MAAA,SAAe,mBAAA;AAAA,iBAE1B,UAAA,+DAIG,WAAA,GAAc,WAAA,CAAA,CAC/B,UAAA,EAAY,mBAAA,CAAoB,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA,IAAS,mBAAA,CAAA,KAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA;AAAA,iBAInD,aAAA,sBAAmC,YAAA,CAAA,CAAc,KAAA,EAAO,MAAA,GAAM,MAAA;AAAA,iBAI9D,WAAA,mCAA8C,WAAA,CAAA,CAC5D,UAAA,EAAY,mBAAA,SAA4B,MAAA,EAAQ,OAAA,EAAS,QAAA,IACxD,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,QAAA;AAAA,iBAgBT,cAAA,gBAA8B,YAAA,CAAA,CAAc,KAAA,EAAO,MAAA;EAAA;;iBAM7C,eAAA,iBAAA,CACpB,UAAA,EAAY,mBAAA,SAA4B,MAAA,EAAQ,OAAA,GAChD,OAAA;EAAW,KAAA,EAAO,MAAA;EAAQ,MAAA,EAAQ,OAAA;AAAA,IAAS,OAAA,CAAA,aAAA;AAAA,KAKjC,yBAAA,kBAA2C,WAAA,GAAc,WAAA,IACnE,oBAAA,CAAqB,QAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import "server-cli-only";
|
|
2
|
+
import { tool } from "ai";
|
|
3
|
+
|
|
4
|
+
//#region src/server/tools.ts
|
|
5
|
+
function defineTool(definition) {
|
|
6
|
+
return definition;
|
|
7
|
+
}
|
|
8
|
+
function defineToolSet(tools) {
|
|
9
|
+
return tools;
|
|
10
|
+
}
|
|
11
|
+
function toAiSdkTool(definition) {
|
|
12
|
+
return tool({
|
|
13
|
+
title: definition.title,
|
|
14
|
+
description: definition.description,
|
|
15
|
+
inputSchema: definition.inputSchema,
|
|
16
|
+
outputSchema: definition.outputSchema,
|
|
17
|
+
contextSchema: definition.contextSchema,
|
|
18
|
+
execute: definition.execute,
|
|
19
|
+
metadata: { tulip: getSerializableToolMetadata(definition) }
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function toAiSdkToolSet(tools) {
|
|
23
|
+
return Object.fromEntries(Object.entries(tools).map(([name, definition]) => [name, toAiSdkTool(definition)]));
|
|
24
|
+
}
|
|
25
|
+
async function toMcpToolResult(definition, options) {
|
|
26
|
+
return definition.mcp?.toContent?.(options);
|
|
27
|
+
}
|
|
28
|
+
function getSerializableToolMetadata(definition) {
|
|
29
|
+
return {
|
|
30
|
+
name: definition.name,
|
|
31
|
+
title: definition.title,
|
|
32
|
+
description: definition.description,
|
|
33
|
+
permissions: definition.permissions,
|
|
34
|
+
confirmation: definition.confirmation,
|
|
35
|
+
audit: definition.audit,
|
|
36
|
+
ui: definition.ui,
|
|
37
|
+
mcp: definition.mcp ? {
|
|
38
|
+
title: definition.mcp.title,
|
|
39
|
+
description: definition.mcp.description,
|
|
40
|
+
hasContentFormatter: Boolean(definition.mcp.toContent)
|
|
41
|
+
} : void 0
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
//#endregion
|
|
46
|
+
export { defineTool, defineToolSet, toAiSdkTool, toAiSdkToolSet, toMcpToolResult };
|
|
47
|
+
//# sourceMappingURL=tools.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.mjs","names":[],"sources":["../../src/server/tools.ts"],"sourcesContent":["import \"server-cli-only\";\n\nimport {\n type FlexibleSchema,\n type Tool,\n type ToolExecuteFunction,\n type ToolExecutionOptions,\n tool,\n} from \"ai\";\nimport type { McpToolResult } from \"./mcp-content.js\";\n\nexport type ToolContext = Record<string, unknown>;\n\nexport type ToolConfirmation =\n | false\n | {\n required?: boolean;\n title?: string;\n description?: string;\n destructive?: boolean;\n };\n\nexport type ToolAudit = {\n action: string;\n resource?: string;\n severity?: \"low\" | \"medium\" | \"high\";\n};\n\nexport type ToolDisplay = {\n label?: string;\n description?: string;\n icon?: string;\n};\n\nexport type ToolMcpOptions<TInput, TOutput> = {\n title?: string;\n description?: string;\n toContent?: (options: {\n input: TInput;\n output: TOutput;\n }) => McpToolResult | Promise<McpToolResult>;\n};\n\nexport type ToolMetadata<TInput, TOutput> = {\n permissions?: string[];\n confirmation?: ToolConfirmation;\n audit?: ToolAudit;\n ui?: ToolDisplay;\n mcp?: ToolMcpOptions<TInput, TOutput>;\n};\n\nexport type TulipToolDefinition<\n TName extends string = string,\n TInput = unknown,\n TOutput = unknown,\n TContext extends ToolContext = ToolContext,\n> = ToolMetadata<TInput, TOutput> & {\n name: TName;\n title: string;\n description: string;\n inputSchema: FlexibleSchema<TInput>;\n outputSchema?: FlexibleSchema<TOutput>;\n contextSchema?: FlexibleSchema<TContext>;\n execute: ToolExecuteFunction<TInput, TOutput, TContext>;\n};\n\nexport type TulipToolSet = Record<string, TulipToolDefinition>;\n\nexport function defineTool<\n const TName extends string,\n TInput,\n TOutput,\n TContext extends ToolContext = ToolContext,\n>(definition: TulipToolDefinition<TName, TInput, TOutput, TContext>) {\n return definition;\n}\n\nexport function defineToolSet<const TTools extends TulipToolSet>(tools: TTools) {\n return tools;\n}\n\nexport function toAiSdkTool<TInput, TOutput, TContext extends ToolContext>(\n definition: TulipToolDefinition<string, TInput, TOutput, TContext>,\n): Tool<TInput, TOutput, TContext> {\n return tool({\n title: definition.title,\n description: definition.description,\n inputSchema: definition.inputSchema,\n outputSchema: definition.outputSchema,\n contextSchema: definition.contextSchema,\n execute: definition.execute,\n metadata: {\n tulip: getSerializableToolMetadata(definition),\n },\n } as unknown as Tool<TInput, TOutput, TContext> & {\n execute: ToolExecuteFunction<TInput, TOutput, TContext>;\n });\n}\n\nexport function toAiSdkToolSet<TTools extends TulipToolSet>(tools: TTools) {\n return Object.fromEntries(\n Object.entries(tools).map(([name, definition]) => [name, toAiSdkTool(definition)]),\n );\n}\n\nexport async function toMcpToolResult<TInput, TOutput>(\n definition: TulipToolDefinition<string, TInput, TOutput>,\n options: { input: TInput; output: TOutput },\n) {\n return definition.mcp?.toContent?.(options);\n}\n\nexport type TulipToolExecutionOptions<TContext extends ToolContext = ToolContext> =\n ToolExecutionOptions<TContext>;\n\nfunction getSerializableToolMetadata<TInput, TOutput>(\n definition: ToolMetadata<TInput, TOutput> & {\n name: string;\n title: string;\n description: string;\n },\n) {\n return {\n name: definition.name,\n title: definition.title,\n description: definition.description,\n permissions: definition.permissions,\n confirmation: definition.confirmation,\n audit: definition.audit,\n ui: definition.ui,\n mcp: definition.mcp\n ? {\n title: definition.mcp.title,\n description: definition.mcp.description,\n hasContentFormatter: Boolean(definition.mcp.toContent),\n }\n : undefined,\n };\n}\n"],"mappings":";;;;AAoEA,SAAgB,WAKd,YAAmE;AACnE,QAAO;;AAGT,SAAgB,cAAiD,OAAe;AAC9E,QAAO;;AAGT,SAAgB,YACd,YACiC;AACjC,QAAO,KAAK;EACV,OAAO,WAAW;EAClB,aAAa,WAAW;EACxB,aAAa,WAAW;EACxB,cAAc,WAAW;EACzB,eAAe,WAAW;EAC1B,SAAS,WAAW;EACpB,UAAU,EACR,OAAO,4BAA4B,WAAW,EAC/C;EACF,CAEC;;AAGJ,SAAgB,eAA4C,OAAe;AACzE,QAAO,OAAO,YACZ,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,MAAM,gBAAgB,CAAC,MAAM,YAAY,WAAW,CAAC,CAAC,CACnF;;AAGH,eAAsB,gBACpB,YACA,SACA;AACA,QAAO,WAAW,KAAK,YAAY,QAAQ;;AAM7C,SAAS,4BACP,YAKA;AACA,QAAO;EACL,MAAM,WAAW;EACjB,OAAO,WAAW;EAClB,aAAa,WAAW;EACxB,aAAa,WAAW;EACxB,cAAc,WAAW;EACzB,OAAO,WAAW;EAClB,IAAI,WAAW;EACf,KAAK,WAAW,MACZ;GACE,OAAO,WAAW,IAAI;GACtB,aAAa,WAAW,IAAI;GAC5B,qBAAqB,QAAQ,WAAW,IAAI,UAAU;GACvD,GACD;EACL"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { McpContent, McpImageContent, McpResourceContent, McpTextContent, McpToolResult, jsonContent, resourceContent, tableContent, textContent } from "./server/mcp-content.mjs";
|
|
2
|
+
import { ToolAudit, ToolConfirmation, ToolContext, ToolDisplay, ToolMcpOptions, ToolMetadata, TulipToolDefinition, TulipToolExecutionOptions, TulipToolSet, defineTool, defineToolSet, toAiSdkTool, toAiSdkToolSet, toMcpToolResult } from "./server/tools.mjs";
|
|
3
|
+
export { McpContent, McpImageContent, McpResourceContent, McpTextContent, McpToolResult, ToolAudit, ToolConfirmation, ToolContext, ToolDisplay, ToolMcpOptions, ToolMetadata, TulipToolDefinition, TulipToolExecutionOptions, TulipToolSet, defineTool, defineToolSet, jsonContent, resourceContent, tableContent, textContent, toAiSdkTool, toAiSdkToolSet, toMcpToolResult };
|
package/dist/server.mjs
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { jsonContent, resourceContent, tableContent, textContent } from "./server/mcp-content.mjs";
|
|
2
|
+
import { defineTool, defineToolSet, toAiSdkTool, toAiSdkToolSet, toMcpToolResult } from "./server/tools.mjs";
|
|
3
|
+
|
|
4
|
+
export { defineTool, defineToolSet, jsonContent, resourceContent, tableContent, textContent, toAiSdkTool, toAiSdkToolSet, toMcpToolResult };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ToolContext, TulipToolDefinition, TulipToolSet } from "../types.mjs";
|
|
2
|
+
import "server-cli-only";
|
|
3
|
+
import { Tool } from "ai";
|
|
4
|
+
|
|
5
|
+
//#region src/tools/lib/ai-sdk.server.d.ts
|
|
6
|
+
declare function toAiSdkTool<TInput, TOutput, TContext extends ToolContext>(definition: TulipToolDefinition<string, TInput, TOutput, TContext>): Tool<TInput, TOutput, TContext>;
|
|
7
|
+
declare function toAiSdkToolSet<TTools extends TulipToolSet>(tools: TTools): {
|
|
8
|
+
[k: string]: Tool<unknown, unknown, ToolContext>;
|
|
9
|
+
};
|
|
10
|
+
//#endregion
|
|
11
|
+
export { toAiSdkTool, toAiSdkToolSet };
|
|
12
|
+
//# sourceMappingURL=ai-sdk.server.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-sdk.server.d.mts","names":[],"sources":["../../../src/tools/lib/ai-sdk.server.ts"],"mappings":";;;;;iBAKgB,WAAA,mCAA8C,WAAA,CAAA,CAC5D,UAAA,EAAY,mBAAA,SAA4B,MAAA,EAAQ,OAAA,EAAS,QAAA,IACxD,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,QAAA;AAAA,iBAgBT,cAAA,gBAA8B,YAAA,CAAA,CAAc,KAAA,EAAO,MAAA;EAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import "server-cli-only";
|
|
2
|
+
import { tool } from "ai";
|
|
3
|
+
|
|
4
|
+
//#region src/tools/lib/ai-sdk.server.ts
|
|
5
|
+
function toAiSdkTool(definition) {
|
|
6
|
+
return tool({
|
|
7
|
+
title: definition.title,
|
|
8
|
+
description: definition.description,
|
|
9
|
+
inputSchema: definition.inputSchema,
|
|
10
|
+
outputSchema: definition.outputSchema,
|
|
11
|
+
contextSchema: definition.contextSchema,
|
|
12
|
+
execute: definition.execute,
|
|
13
|
+
metadata: { tulip: getSerializableToolMetadata(definition) }
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
function toAiSdkToolSet(tools) {
|
|
17
|
+
return Object.fromEntries(Object.entries(tools).map(([name, definition]) => [name, toAiSdkTool(definition)]));
|
|
18
|
+
}
|
|
19
|
+
function getSerializableToolMetadata(definition) {
|
|
20
|
+
return {
|
|
21
|
+
name: definition.name,
|
|
22
|
+
title: definition.title,
|
|
23
|
+
description: definition.description,
|
|
24
|
+
permissions: definition.permissions,
|
|
25
|
+
confirmation: definition.confirmation,
|
|
26
|
+
audit: definition.audit,
|
|
27
|
+
ui: definition.ui,
|
|
28
|
+
mcp: definition.mcp ? {
|
|
29
|
+
title: definition.mcp.title,
|
|
30
|
+
description: definition.mcp.description,
|
|
31
|
+
hasContentFormatter: Boolean(definition.mcp.toContent)
|
|
32
|
+
} : void 0
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
//#endregion
|
|
37
|
+
export { toAiSdkTool, toAiSdkToolSet };
|
|
38
|
+
//# sourceMappingURL=ai-sdk.server.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-sdk.server.mjs","names":[],"sources":["../../../src/tools/lib/ai-sdk.server.ts"],"sourcesContent":["import \"server-cli-only\";\n\nimport { type Tool, type ToolExecuteFunction, tool } from \"ai\";\nimport type { ToolContext, ToolMetadata, TulipToolDefinition, TulipToolSet } from \"../types.js\";\n\nexport function toAiSdkTool<TInput, TOutput, TContext extends ToolContext>(\n definition: TulipToolDefinition<string, TInput, TOutput, TContext>,\n): Tool<TInput, TOutput, TContext> {\n return tool({\n title: definition.title,\n description: definition.description,\n inputSchema: definition.inputSchema,\n outputSchema: definition.outputSchema,\n contextSchema: definition.contextSchema,\n execute: definition.execute,\n metadata: {\n tulip: getSerializableToolMetadata(definition),\n },\n } as unknown as Tool<TInput, TOutput, TContext> & {\n execute: ToolExecuteFunction<TInput, TOutput, TContext>;\n });\n}\n\nexport function toAiSdkToolSet<TTools extends TulipToolSet>(tools: TTools) {\n return Object.fromEntries(\n Object.entries(tools).map(([name, definition]) => [name, toAiSdkTool(definition)]),\n );\n}\n\nfunction getSerializableToolMetadata<TInput, TOutput>(\n definition: ToolMetadata<TInput, TOutput> & {\n name: string;\n title: string;\n description: string;\n },\n) {\n return {\n name: definition.name,\n title: definition.title,\n description: definition.description,\n permissions: definition.permissions,\n confirmation: definition.confirmation,\n audit: definition.audit,\n ui: definition.ui,\n mcp: definition.mcp\n ? {\n title: definition.mcp.title,\n description: definition.mcp.description,\n hasContentFormatter: Boolean(definition.mcp.toContent),\n }\n : undefined,\n };\n}\n"],"mappings":";;;;AAKA,SAAgB,YACd,YACiC;AACjC,QAAO,KAAK;EACV,OAAO,WAAW;EAClB,aAAa,WAAW;EACxB,aAAa,WAAW;EACxB,cAAc,WAAW;EACzB,eAAe,WAAW;EAC1B,SAAS,WAAW;EACpB,UAAU,EACR,OAAO,4BAA4B,WAAW,EAC/C;EACF,CAEC;;AAGJ,SAAgB,eAA4C,OAAe;AACzE,QAAO,OAAO,YACZ,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,MAAM,gBAAgB,CAAC,MAAM,YAAY,WAAW,CAAC,CAAC,CACnF;;AAGH,SAAS,4BACP,YAKA;AACA,QAAO;EACL,MAAM,WAAW;EACjB,OAAO,WAAW;EAClB,aAAa,WAAW;EACxB,aAAa,WAAW;EACxB,cAAc,WAAW;EACzB,OAAO,WAAW;EAClB,IAAI,WAAW;EACf,KAAK,WAAW,MACZ;GACE,OAAO,WAAW,IAAI;GACtB,aAAa,WAAW,IAAI;GAC5B,qBAAqB,QAAQ,WAAW,IAAI,UAAU;GACvD,GACD;EACL"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ToolContext, TulipToolDefinition, TulipToolSet } from "../types.mjs";
|
|
2
|
+
import "server-cli-only";
|
|
3
|
+
|
|
4
|
+
//#region src/tools/lib/define-tool.server.d.ts
|
|
5
|
+
declare function defineTool<const TName extends string, TInput, TOutput, TContext extends ToolContext = ToolContext>(definition: TulipToolDefinition<TName, TInput, TOutput, TContext>): TulipToolDefinition<TName, TInput, TOutput, TContext>;
|
|
6
|
+
declare function defineToolSet<const TTools extends TulipToolSet>(tools: TTools): TTools;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { defineTool, defineToolSet };
|
|
9
|
+
//# sourceMappingURL=define-tool.server.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-tool.server.d.mts","names":[],"sources":["../../../src/tools/lib/define-tool.server.ts"],"mappings":";;;;iBAIgB,UAAA,+DAIG,WAAA,GAAc,WAAA,CAAA,CAC/B,UAAA,EAAY,mBAAA,CAAoB,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAA,IAAS,mBAAA,CAAA,KAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA;AAAA,iBAInD,aAAA,sBAAmC,YAAA,CAAA,CAAc,KAAA,EAAO,MAAA,GAAM,MAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import "server-cli-only";
|
|
2
|
+
|
|
3
|
+
//#region src/tools/lib/define-tool.server.ts
|
|
4
|
+
function defineTool(definition) {
|
|
5
|
+
return definition;
|
|
6
|
+
}
|
|
7
|
+
function defineToolSet(tools) {
|
|
8
|
+
return tools;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
//#endregion
|
|
12
|
+
export { defineTool, defineToolSet };
|
|
13
|
+
//# sourceMappingURL=define-tool.server.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-tool.server.mjs","names":[],"sources":["../../../src/tools/lib/define-tool.server.ts"],"sourcesContent":["import \"server-cli-only\";\n\nimport type { ToolContext, TulipToolDefinition, TulipToolSet } from \"../types.js\";\n\nexport function defineTool<\n const TName extends string,\n TInput,\n TOutput,\n TContext extends ToolContext = ToolContext,\n>(definition: TulipToolDefinition<TName, TInput, TOutput, TContext>) {\n return definition;\n}\n\nexport function defineToolSet<const TTools extends TulipToolSet>(tools: TTools) {\n return tools;\n}\n"],"mappings":";;;AAIA,SAAgB,WAKd,YAAmE;AACnE,QAAO;;AAGT,SAAgB,cAAiD,OAAe;AAC9E,QAAO"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ToolClientDefinition, ToolClientSource } from "./types.client.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/tools/lib/definitions.client.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Defines how a server-side tool should be rendered in client chat UI.
|
|
6
|
+
* Use `import type` with the server tool to keep client bundles free of server code.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```tsx
|
|
10
|
+
* import type { webSearchTool } from "./tool.server";
|
|
11
|
+
*
|
|
12
|
+
* export const webSearchToolClient = defineToolClient<typeof webSearchTool>({
|
|
13
|
+
* toolName: "web_search",
|
|
14
|
+
* render: (part) => <ToolCallCard part={part} title="Web Search" />,
|
|
15
|
+
* });
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
declare function defineToolClient<const TTool extends ToolClientSource>(definition: ToolClientDefinition<TTool>): ToolClientDefinition<TTool>;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { defineToolClient };
|