@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.
Files changed (129) hide show
  1. package/LICENSE +662 -0
  2. package/dist/agents/lib/definitions.server.d.mts +11 -0
  3. package/dist/agents/lib/definitions.server.mjs +14 -0
  4. package/dist/agents/lib/delegation.server.d.mts +15 -0
  5. package/dist/agents/lib/delegation.server.mjs +28 -0
  6. package/dist/agents/lib/instructions.server.d.mts +14 -0
  7. package/dist/agents/lib/instructions.server.mjs +26 -0
  8. package/dist/agents/lib/types.d.mts +26 -0
  9. package/dist/agents/server.d.mts +5 -0
  10. package/dist/agents/server.mjs +5 -0
  11. package/dist/chat/client.d.mts +10 -0
  12. package/dist/chat/client.mjs +12 -0
  13. package/dist/chat/components/agent-activity.client.d.mts +14 -0
  14. package/dist/chat/components/agent-activity.client.mjs +26 -0
  15. package/dist/chat/components/assistant-panel.client.d.mts +40 -0
  16. package/dist/chat/components/assistant-panel.client.mjs +53 -0
  17. package/dist/chat/components/chat-composer.client.d.mts +160 -0
  18. package/dist/chat/components/chat-composer.client.mjs +266 -0
  19. package/dist/chat/components/chat-message.client.d.mts +92 -0
  20. package/dist/chat/components/chat-message.client.mjs +121 -0
  21. package/dist/chat/components/chat-thread.client.d.mts +130 -0
  22. package/dist/chat/components/chat-thread.client.mjs +164 -0
  23. package/dist/chat/components/message-part.client.d.mts +23 -0
  24. package/dist/chat/components/message-part.client.mjs +38 -0
  25. package/dist/chat/components/starter-prompts.client.d.mts +25 -0
  26. package/dist/chat/components/starter-prompts.client.mjs +31 -0
  27. package/dist/chat/components/tool-call-card.client.d.mts +29 -0
  28. package/dist/chat/components/tool-call-card.client.mjs +60 -0
  29. package/dist/chat/lib/classes.mjs +7 -0
  30. package/dist/chat/lib/parts.d.mts +10 -0
  31. package/dist/chat/lib/parts.mjs +25 -0
  32. package/dist/chat/lib/stream.server.d.mts +24 -0
  33. package/dist/chat/lib/stream.server.mjs +34 -0
  34. package/dist/chat/lib/types.d.mts +21 -0
  35. package/dist/chat/server.d.mts +3 -0
  36. package/dist/chat/server.mjs +3 -0
  37. package/dist/chat.d.mts +3 -0
  38. package/dist/chat.mjs +3 -0
  39. package/dist/index.d.mts +1 -0
  40. package/dist/index.mjs +1 -0
  41. package/dist/mcp/lib/content.d.mts +66 -0
  42. package/dist/mcp/lib/content.d.mts.map +1 -0
  43. package/dist/mcp/lib/content.mjs +115 -0
  44. package/dist/mcp/lib/content.mjs.map +1 -0
  45. package/dist/mcp/lib/tool-result.server.d.mts +12 -0
  46. package/dist/mcp/lib/tool-result.server.d.mts.map +1 -0
  47. package/dist/mcp/lib/tool-result.server.mjs +10 -0
  48. package/dist/mcp/lib/tool-result.server.mjs.map +1 -0
  49. package/dist/mcp/lib/types.d.mts +27 -0
  50. package/dist/mcp/server.d.mts +3 -0
  51. package/dist/mcp/server.mjs +3 -0
  52. package/dist/mcp/types.d.mts +27 -0
  53. package/dist/mcp/types.d.mts.map +1 -0
  54. package/dist/server/mcp-content.d.mts +44 -0
  55. package/dist/server/mcp-content.d.mts.map +1 -0
  56. package/dist/server/mcp-content.mjs +71 -0
  57. package/dist/server/mcp-content.mjs.map +1 -0
  58. package/dist/server/tools.d.mts +61 -0
  59. package/dist/server/tools.d.mts.map +1 -0
  60. package/dist/server/tools.mjs +47 -0
  61. package/dist/server/tools.mjs.map +1 -0
  62. package/dist/server.d.mts +3 -0
  63. package/dist/server.mjs +4 -0
  64. package/dist/tools/client.d.mts +3 -0
  65. package/dist/tools/client.mjs +5 -0
  66. package/dist/tools/lib/ai-sdk.server.d.mts +12 -0
  67. package/dist/tools/lib/ai-sdk.server.d.mts.map +1 -0
  68. package/dist/tools/lib/ai-sdk.server.mjs +38 -0
  69. package/dist/tools/lib/ai-sdk.server.mjs.map +1 -0
  70. package/dist/tools/lib/define-tool.server.d.mts +9 -0
  71. package/dist/tools/lib/define-tool.server.d.mts.map +1 -0
  72. package/dist/tools/lib/define-tool.server.mjs +13 -0
  73. package/dist/tools/lib/define-tool.server.mjs.map +1 -0
  74. package/dist/tools/lib/definitions.client.d.mts +20 -0
  75. package/dist/tools/lib/definitions.client.mjs +21 -0
  76. package/dist/tools/lib/definitions.d.mts +16 -0
  77. package/dist/tools/lib/definitions.d.mts.map +1 -0
  78. package/dist/tools/lib/definitions.mjs +20 -0
  79. package/dist/tools/lib/definitions.mjs.map +1 -0
  80. package/dist/tools/lib/resolvers.d.mts +41 -0
  81. package/dist/tools/lib/resolvers.d.mts.map +1 -0
  82. package/dist/tools/lib/resolvers.mjs +43 -0
  83. package/dist/tools/lib/resolvers.mjs.map +1 -0
  84. package/dist/tools/lib/types.client.d.mts +13 -0
  85. package/dist/tools/lib/types.d.mts +33 -0
  86. package/dist/tools/resolvers/agent.server.d.mts +27 -0
  87. package/dist/tools/resolvers/agent.server.d.mts.map +1 -0
  88. package/dist/tools/resolvers/agent.server.mjs +44 -0
  89. package/dist/tools/resolvers/agent.server.mjs.map +1 -0
  90. package/dist/tools/resolvers/mcp.server.d.mts +31 -0
  91. package/dist/tools/resolvers/mcp.server.d.mts.map +1 -0
  92. package/dist/tools/resolvers/mcp.server.mjs +20 -0
  93. package/dist/tools/resolvers/mcp.server.mjs.map +1 -0
  94. package/dist/tools/server.d.mts +5 -0
  95. package/dist/tools/server.mjs +5 -0
  96. package/dist/tools/types.d.mts +33 -0
  97. package/dist/tools/types.d.mts.map +1 -0
  98. package/package.json +61 -0
  99. package/src/agents/entry.server.ts +7 -0
  100. package/src/agents/lib/definitions.server.ts +14 -0
  101. package/src/agents/lib/delegation.server.ts +33 -0
  102. package/src/agents/lib/instructions.server.ts +37 -0
  103. package/src/agents/lib/types.ts +32 -0
  104. package/src/chat/components/agent-activity.client.tsx +21 -0
  105. package/src/chat/components/chat-composer.client.tsx +379 -0
  106. package/src/chat/components/chat-message.client.tsx +166 -0
  107. package/src/chat/components/chat-thread.client.tsx +242 -0
  108. package/src/chat/components/message-part.client.tsx +59 -0
  109. package/src/chat/components/starter-prompts.client.tsx +49 -0
  110. package/src/chat/components/tool-call-card.client.tsx +78 -0
  111. package/src/chat/entry.client.ts +18 -0
  112. package/src/chat/entry.server.ts +5 -0
  113. package/src/chat/entry.ts +5 -0
  114. package/src/chat/lib/parts.ts +33 -0
  115. package/src/chat/lib/stream.server.ts +40 -0
  116. package/src/chat/lib/types.ts +20 -0
  117. package/src/entry.ts +24 -0
  118. package/src/mcp/entry.server.ts +2 -0
  119. package/src/mcp/lib/content.ts +131 -0
  120. package/src/mcp/lib/types.ts +28 -0
  121. package/src/styles.css +1 -0
  122. package/src/tools/entry.client.ts +7 -0
  123. package/src/tools/entry.server.ts +11 -0
  124. package/src/tools/lib/definitions.client.ts +21 -0
  125. package/src/tools/lib/definitions.ts +24 -0
  126. package/src/tools/lib/types.client.ts +11 -0
  127. package/src/tools/lib/types.ts +44 -0
  128. package/src/tools/resolvers/agent.server.ts +78 -0
  129. 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,3 @@
1
+ import { json, resource, table, text } from "./lib/content.mjs";
2
+
3
+ export { 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 };
@@ -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,3 @@
1
+ import { ToolClientDefinition, ToolClientSource } from "./lib/types.client.mjs";
2
+ import { defineToolClient } from "./lib/definitions.client.mjs";
3
+ export { ToolClientDefinition, ToolClientSource, defineToolClient };
@@ -0,0 +1,5 @@
1
+ "use client";
2
+
3
+ import { defineToolClient } from "./lib/definitions.client.mjs";
4
+
5
+ export { defineToolClient };
@@ -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 };