@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,21 @@
|
|
|
1
|
+
//#region src/tools/lib/definitions.client.ts
|
|
2
|
+
/**
|
|
3
|
+
* Defines how a server-side tool should be rendered in client chat UI.
|
|
4
|
+
* Use `import type` with the server tool to keep client bundles free of server code.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* import type { webSearchTool } from "./tool.server";
|
|
9
|
+
*
|
|
10
|
+
* export const webSearchToolClient = defineToolClient<typeof webSearchTool>({
|
|
11
|
+
* toolName: "web_search",
|
|
12
|
+
* render: (part) => <ToolCallCard part={part} title="Web Search" />,
|
|
13
|
+
* });
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
function defineToolClient(definition) {
|
|
17
|
+
return definition;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
//#endregion
|
|
21
|
+
export { defineToolClient };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ToolContext, TulipToolDefinition, TulipToolSet } from "./types.mjs";
|
|
2
|
+
import "server-cli-only";
|
|
3
|
+
|
|
4
|
+
//#region src/tools/lib/definitions.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Defines the canonical Tulip tool shape without binding it to a specific transport.
|
|
7
|
+
* Resolvers adapt this definition for agents, MCP, UI, auditing, or permissions later.
|
|
8
|
+
*/
|
|
9
|
+
declare function defineTool<const TName extends string, TInput, TOutput, TContext extends ToolContext = ToolContext>(definition: TulipToolDefinition<TName, TInput, TOutput, TContext>): TulipToolDefinition<TName, TInput, TOutput, TContext>;
|
|
10
|
+
/**
|
|
11
|
+
* Groups multiple Tulip tool definitions while preserving their literal names and types.
|
|
12
|
+
* Use this before resolving a shared set of tools for an agent or MCP endpoint.
|
|
13
|
+
*/
|
|
14
|
+
declare function defineToolSet<const TTools extends TulipToolSet>(tools: TTools): TTools;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { defineTool, defineToolSet };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.d.mts","names":[],"sources":["../../../src/tools/lib/definitions.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,20 @@
|
|
|
1
|
+
import "server-cli-only";
|
|
2
|
+
|
|
3
|
+
//#region src/tools/lib/definitions.ts
|
|
4
|
+
/**
|
|
5
|
+
* Defines the canonical Tulip tool shape without binding it to a specific transport.
|
|
6
|
+
* Resolvers adapt this definition for agents, MCP, UI, auditing, or permissions later.
|
|
7
|
+
*/
|
|
8
|
+
function defineTool(definition) {
|
|
9
|
+
return definition;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Groups multiple Tulip tool definitions while preserving their literal names and types.
|
|
13
|
+
* Use this before resolving a shared set of tools for an agent or MCP endpoint.
|
|
14
|
+
*/
|
|
15
|
+
function defineToolSet(tools) {
|
|
16
|
+
return tools;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
//#endregion
|
|
20
|
+
export { defineTool, defineToolSet };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.mjs","names":[],"sources":["../../../src/tools/lib/definitions.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,41 @@
|
|
|
1
|
+
import { McpToolResult } from "../../mcp/types.mjs";
|
|
2
|
+
import { ToolAudit, ToolConfirmation, ToolContext, ToolDisplay, TulipToolDefinition, TulipToolSet } from "../types.mjs";
|
|
3
|
+
import "server-cli-only";
|
|
4
|
+
import { Tool } from "ai";
|
|
5
|
+
|
|
6
|
+
//#region src/tools/lib/resolvers.d.ts
|
|
7
|
+
type AgentToolResolverOptions = {
|
|
8
|
+
title?: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
permissions?: string[];
|
|
11
|
+
confirmation?: ToolConfirmation;
|
|
12
|
+
audit?: ToolAudit;
|
|
13
|
+
ui?: ToolDisplay;
|
|
14
|
+
};
|
|
15
|
+
type MCPToolResolverOptions<TInput, TOutput> = {
|
|
16
|
+
title?: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
content?: (options: {
|
|
19
|
+
input: TInput;
|
|
20
|
+
output: TOutput;
|
|
21
|
+
}) => McpToolResult | Promise<McpToolResult>;
|
|
22
|
+
};
|
|
23
|
+
type ResolvedMCPTool<TInput = unknown, TOutput = unknown> = {
|
|
24
|
+
name: string;
|
|
25
|
+
title: string;
|
|
26
|
+
description: string;
|
|
27
|
+
inputSchema: TulipToolDefinition<string, TInput, TOutput>["inputSchema"];
|
|
28
|
+
outputSchema?: TulipToolDefinition<string, TInput, TOutput>["outputSchema"];
|
|
29
|
+
resolveResult: (options: {
|
|
30
|
+
input: TInput;
|
|
31
|
+
output: TOutput;
|
|
32
|
+
}) => Promise<McpToolResult | undefined>;
|
|
33
|
+
};
|
|
34
|
+
declare function resolveAgentTool<TInput, TOutput, TContext extends ToolContext>(definition: TulipToolDefinition<string, TInput, TOutput, TContext>, options?: AgentToolResolverOptions): Tool<TInput, TOutput, TContext>;
|
|
35
|
+
declare function resolveAgentToolSet<TTools extends TulipToolSet>(tools: TTools, options?: Partial<Record<keyof TTools, AgentToolResolverOptions>>): {
|
|
36
|
+
[k: string]: Tool<unknown, unknown, ToolContext>;
|
|
37
|
+
};
|
|
38
|
+
declare function resolveMCPTool<TInput, TOutput>(definition: TulipToolDefinition<string, TInput, TOutput>, options?: MCPToolResolverOptions<TInput, TOutput>): ResolvedMCPTool<TInput, TOutput>;
|
|
39
|
+
//#endregion
|
|
40
|
+
export { AgentToolResolverOptions, MCPToolResolverOptions, ResolvedMCPTool, resolveAgentTool, resolveAgentToolSet, resolveMCPTool };
|
|
41
|
+
//# sourceMappingURL=resolvers.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolvers.d.mts","names":[],"sources":["../../../src/tools/lib/resolvers.ts"],"mappings":";;;;;;KAaY,wBAAA;EACV,KAAA;EACA,WAAA;EACA,WAAA;EACA,YAAA,GAAe,gBAAA;EACf,KAAA,GAAQ,SAAA;EACR,EAAA,GAAK,WAAA;AAAA;AAAA,KAGK,sBAAA;EACV,KAAA;EACA,WAAA;EACA,OAAA,IAAW,OAAA;IAAW,KAAA,EAAO,MAAA;IAAQ,MAAA,EAAQ,OAAA;EAAA,MAAc,aAAA,GAAgB,OAAA,CAAQ,aAAA;AAAA;AAAA,KAGzE,eAAA;EACV,IAAA;EACA,KAAA;EACA,WAAA;EACA,WAAA,EAAa,mBAAA,SAA4B,MAAA,EAAQ,OAAA;EACjD,YAAA,GAAe,mBAAA,SAA4B,MAAA,EAAQ,OAAA;EACnD,aAAA,GAAgB,OAAA;IACd,KAAA,EAAO,MAAA;IACP,MAAA,EAAQ,OAAA;EAAA,MACJ,OAAA,CAAQ,aAAA;AAAA;AAAA,iBAGA,gBAAA,mCAAmD,WAAA,CAAA,CACjE,UAAA,EAAY,mBAAA,SAA4B,MAAA,EAAQ,OAAA,EAAS,QAAA,GACzD,OAAA,GAAS,wBAAA,GACR,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,QAAA;AAAA,iBAgBT,mBAAA,gBAAmC,YAAA,CAAA,CACjD,KAAA,EAAO,MAAA,EACP,OAAA,GAAS,OAAA,CAAQ,MAAA,OAAa,MAAA,EAAQ,wBAAA;EAAA;;iBAUxB,cAAA,iBAAA,CACd,UAAA,EAAY,mBAAA,SAA4B,MAAA,EAAQ,OAAA,GAChD,OAAA,GAAS,sBAAA,CAAuB,MAAA,EAAQ,OAAA,IACvC,eAAA,CAAgB,MAAA,EAAQ,OAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import "server-cli-only";
|
|
2
|
+
import { tool } from "ai";
|
|
3
|
+
|
|
4
|
+
//#region src/tools/lib/resolvers.ts
|
|
5
|
+
function resolveAgentTool(definition, options = {}) {
|
|
6
|
+
return tool({
|
|
7
|
+
title: options.title ?? definition.title,
|
|
8
|
+
description: options.description ?? definition.description,
|
|
9
|
+
inputSchema: definition.inputSchema,
|
|
10
|
+
outputSchema: definition.outputSchema,
|
|
11
|
+
contextSchema: definition.contextSchema,
|
|
12
|
+
execute: definition.execute,
|
|
13
|
+
metadata: { tulip: getSerializableToolMetadata(definition, options) }
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
function resolveAgentToolSet(tools, options = {}) {
|
|
17
|
+
return Object.fromEntries(Object.entries(tools).map(([name, definition]) => [name, resolveAgentTool(definition, options[name])]));
|
|
18
|
+
}
|
|
19
|
+
function resolveMCPTool(definition, options = {}) {
|
|
20
|
+
return {
|
|
21
|
+
name: definition.name,
|
|
22
|
+
title: options.title ?? definition.title,
|
|
23
|
+
description: options.description ?? definition.description,
|
|
24
|
+
inputSchema: definition.inputSchema,
|
|
25
|
+
outputSchema: definition.outputSchema,
|
|
26
|
+
resolveResult: async (resultOptions) => options.content?.(resultOptions)
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function getSerializableToolMetadata(definition, options) {
|
|
30
|
+
return {
|
|
31
|
+
name: definition.name,
|
|
32
|
+
title: options.title ?? definition.title,
|
|
33
|
+
description: options.description ?? definition.description,
|
|
34
|
+
permissions: options.permissions,
|
|
35
|
+
confirmation: options.confirmation,
|
|
36
|
+
audit: options.audit,
|
|
37
|
+
ui: options.ui
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
//#endregion
|
|
42
|
+
export { resolveAgentTool, resolveAgentToolSet, resolveMCPTool };
|
|
43
|
+
//# sourceMappingURL=resolvers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolvers.mjs","names":[],"sources":["../../../src/tools/lib/resolvers.ts"],"sourcesContent":["import \"server-cli-only\";\n\nimport { type Tool, type ToolExecuteFunction, tool } from \"ai\";\nimport type { McpToolResult } from \"../../mcp/types.js\";\nimport type {\n ToolAudit,\n ToolConfirmation,\n ToolContext,\n ToolDisplay,\n TulipToolDefinition,\n TulipToolSet,\n} from \"../types.js\";\n\nexport type AgentToolResolverOptions = {\n title?: string;\n description?: string;\n permissions?: string[];\n confirmation?: ToolConfirmation;\n audit?: ToolAudit;\n ui?: ToolDisplay;\n};\n\nexport type MCPToolResolverOptions<TInput, TOutput> = {\n title?: string;\n description?: string;\n content?: (options: { input: TInput; output: TOutput }) => McpToolResult | Promise<McpToolResult>;\n};\n\nexport type ResolvedMCPTool<TInput = unknown, TOutput = unknown> = {\n name: string;\n title: string;\n description: string;\n inputSchema: TulipToolDefinition<string, TInput, TOutput>[\"inputSchema\"];\n outputSchema?: TulipToolDefinition<string, TInput, TOutput>[\"outputSchema\"];\n resolveResult: (options: {\n input: TInput;\n output: TOutput;\n }) => Promise<McpToolResult | undefined>;\n};\n\nexport function resolveAgentTool<TInput, TOutput, TContext extends ToolContext>(\n definition: TulipToolDefinition<string, TInput, TOutput, TContext>,\n options: AgentToolResolverOptions = {},\n): Tool<TInput, TOutput, TContext> {\n return tool({\n title: options.title ?? definition.title,\n description: options.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, options),\n },\n } as unknown as Tool<TInput, TOutput, TContext> & {\n execute: ToolExecuteFunction<TInput, TOutput, TContext>;\n });\n}\n\nexport function resolveAgentToolSet<TTools extends TulipToolSet>(\n tools: TTools,\n options: Partial<Record<keyof TTools, AgentToolResolverOptions>> = {},\n) {\n return Object.fromEntries(\n Object.entries(tools).map(([name, definition]) => [\n name,\n resolveAgentTool(definition, options[name]),\n ]),\n );\n}\n\nexport function resolveMCPTool<TInput, TOutput>(\n definition: TulipToolDefinition<string, TInput, TOutput>,\n options: MCPToolResolverOptions<TInput, TOutput> = {},\n): ResolvedMCPTool<TInput, TOutput> {\n return {\n name: definition.name,\n title: options.title ?? definition.title,\n description: options.description ?? definition.description,\n inputSchema: definition.inputSchema,\n outputSchema: definition.outputSchema,\n resolveResult: async (resultOptions) => options.content?.(resultOptions),\n };\n}\n\nfunction getSerializableToolMetadata(\n definition: Pick<TulipToolDefinition, \"name\" | \"title\" | \"description\">,\n options: AgentToolResolverOptions,\n) {\n return {\n name: definition.name,\n title: options.title ?? definition.title,\n description: options.description ?? definition.description,\n permissions: options.permissions,\n confirmation: options.confirmation,\n audit: options.audit,\n ui: options.ui,\n };\n}\n"],"mappings":";;;;AAwCA,SAAgB,iBACd,YACA,UAAoC,EAAE,EACL;AACjC,QAAO,KAAK;EACV,OAAO,QAAQ,SAAS,WAAW;EACnC,aAAa,QAAQ,eAAe,WAAW;EAC/C,aAAa,WAAW;EACxB,cAAc,WAAW;EACzB,eAAe,WAAW;EAC1B,SAAS,WAAW;EACpB,UAAU,EACR,OAAO,4BAA4B,YAAY,QAAQ,EACxD;EACF,CAEC;;AAGJ,SAAgB,oBACd,OACA,UAAmE,EAAE,EACrE;AACA,QAAO,OAAO,YACZ,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,MAAM,gBAAgB,CAChD,MACA,iBAAiB,YAAY,QAAQ,MAAM,CAC5C,CAAC,CACH;;AAGH,SAAgB,eACd,YACA,UAAmD,EAAE,EACnB;AAClC,QAAO;EACL,MAAM,WAAW;EACjB,OAAO,QAAQ,SAAS,WAAW;EACnC,aAAa,QAAQ,eAAe,WAAW;EAC/C,aAAa,WAAW;EACxB,cAAc,WAAW;EACzB,eAAe,OAAO,kBAAkB,QAAQ,UAAU,cAAc;EACzE;;AAGH,SAAS,4BACP,YACA,SACA;AACA,QAAO;EACL,MAAM,WAAW;EACjB,OAAO,QAAQ,SAAS,WAAW;EACnC,aAAa,QAAQ,eAAe,WAAW;EAC/C,aAAa,QAAQ;EACrB,cAAc,QAAQ;EACtB,OAAO,QAAQ;EACf,IAAI,QAAQ;EACb"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ToolChatPart } from "../../chat/lib/types.mjs";
|
|
2
|
+
import { ReactNode } from "react";
|
|
3
|
+
|
|
4
|
+
//#region src/tools/lib/types.client.d.ts
|
|
5
|
+
type ToolClientSource = {
|
|
6
|
+
name: string;
|
|
7
|
+
};
|
|
8
|
+
type ToolClientDefinition<TTool extends ToolClientSource = ToolClientSource> = {
|
|
9
|
+
toolName: TTool["name"];
|
|
10
|
+
render: (part: ToolChatPart) => ReactNode;
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { ToolClientDefinition, ToolClientSource };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { FlexibleSchema, ToolExecuteFunction, ToolExecutionOptions } from "ai";
|
|
2
|
+
|
|
3
|
+
//#region src/tools/lib/types.d.ts
|
|
4
|
+
type ToolContext = Record<string, unknown>;
|
|
5
|
+
type ToolConfirmation = false | {
|
|
6
|
+
required?: boolean;
|
|
7
|
+
title?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
destructive?: boolean;
|
|
10
|
+
};
|
|
11
|
+
type ToolAudit = {
|
|
12
|
+
action: string;
|
|
13
|
+
resource?: string;
|
|
14
|
+
severity?: "low" | "medium" | "high";
|
|
15
|
+
};
|
|
16
|
+
type ToolDisplay = {
|
|
17
|
+
label?: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
icon?: string;
|
|
20
|
+
};
|
|
21
|
+
type TulipToolDefinition<TName extends string = string, TInput = unknown, TOutput = unknown, TContext extends ToolContext = ToolContext> = {
|
|
22
|
+
name: TName;
|
|
23
|
+
title: string;
|
|
24
|
+
description: string;
|
|
25
|
+
inputSchema: FlexibleSchema<TInput>;
|
|
26
|
+
outputSchema?: FlexibleSchema<TOutput>;
|
|
27
|
+
contextSchema?: FlexibleSchema<TContext>;
|
|
28
|
+
execute: ToolExecuteFunction<TInput, TOutput, TContext>;
|
|
29
|
+
};
|
|
30
|
+
type TulipToolSet = Record<string, TulipToolDefinition>;
|
|
31
|
+
type TulipToolExecutionOptions<TContext extends ToolContext = ToolContext> = ToolExecutionOptions<TContext>;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { ToolAudit, ToolConfirmation, ToolContext, ToolDisplay, TulipToolDefinition, TulipToolExecutionOptions, TulipToolSet };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ToolAudit, ToolConfirmation, ToolContext, ToolDisplay, TulipToolDefinition, TulipToolSet } from "../lib/types.mjs";
|
|
2
|
+
import "server-cli-only";
|
|
3
|
+
import { Tool } from "ai";
|
|
4
|
+
|
|
5
|
+
//#region src/tools/resolvers/agent.server.d.ts
|
|
6
|
+
type AgentToolResolverOptions = {
|
|
7
|
+
title?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
permissions?: string[];
|
|
10
|
+
confirmation?: ToolConfirmation;
|
|
11
|
+
audit?: ToolAudit;
|
|
12
|
+
ui?: ToolDisplay;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Resolves a Tulip tool definition into an AI SDK tool for internal agents.
|
|
16
|
+
* Agent-specific metadata lives here so the base tool remains reusable by MCP and UI layers.
|
|
17
|
+
*/
|
|
18
|
+
declare function resolveAgentTool<TInput, TOutput, TContext extends ToolContext>(definition: TulipToolDefinition<string, TInput, TOutput, TContext>, options?: AgentToolResolverOptions): Tool<TInput, TOutput, TContext>;
|
|
19
|
+
/**
|
|
20
|
+
* Resolves a named set of Tulip tools into AI SDK tools.
|
|
21
|
+
* Per-tool resolver options can override labels, permissions, confirmation, audit, or UI metadata.
|
|
22
|
+
*/
|
|
23
|
+
declare function resolveAgentToolSet<TTools extends TulipToolSet>(tools: TTools, options?: Partial<Record<keyof TTools, AgentToolResolverOptions>>): {
|
|
24
|
+
[k: string]: Tool<unknown, unknown, ToolContext>;
|
|
25
|
+
};
|
|
26
|
+
//#endregion
|
|
27
|
+
export { AgentToolResolverOptions, resolveAgentTool, resolveAgentToolSet };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.server.d.mts","names":[],"sources":["../../../src/tools/resolvers/agent.server.ts"],"mappings":";;;;;KAYY,wBAAA;EACV,KAAA;EACA,WAAA;EACA,WAAA;EACA,YAAA,GAAe,gBAAA;EACf,KAAA,GAAQ,SAAA;EACR,EAAA,GAAK,WAAA;AAAA;AAAA,iBAGS,gBAAA,mCAAmD,WAAA,CAAA,CACjE,UAAA,EAAY,mBAAA,SAA4B,MAAA,EAAQ,OAAA,EAAS,QAAA,GACzD,OAAA,GAAS,wBAAA,GACR,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,QAAA;AAAA,iBAgBT,mBAAA,gBAAmC,YAAA,CAAA,CACjD,KAAA,EAAO,MAAA,EACP,OAAA,GAAS,OAAA,CAAQ,MAAA,OAAa,MAAA,EAAQ,wBAAA;EAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import "server-cli-only";
|
|
2
|
+
import { tool } from "ai";
|
|
3
|
+
|
|
4
|
+
//#region src/tools/resolvers/agent.server.ts
|
|
5
|
+
/**
|
|
6
|
+
* Resolves a Tulip tool definition into an AI SDK tool for internal agents.
|
|
7
|
+
* Agent-specific metadata lives here so the base tool remains reusable by MCP and UI layers.
|
|
8
|
+
*/
|
|
9
|
+
function resolveAgentTool(definition, options = {}) {
|
|
10
|
+
return tool({
|
|
11
|
+
title: options.title ?? definition.title,
|
|
12
|
+
description: options.description ?? definition.description,
|
|
13
|
+
inputSchema: definition.inputSchema,
|
|
14
|
+
outputSchema: definition.outputSchema,
|
|
15
|
+
contextSchema: definition.contextSchema,
|
|
16
|
+
execute: definition.execute,
|
|
17
|
+
metadata: { tulip: getSerializableToolMetadata(definition, options) }
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Resolves a named set of Tulip tools into AI SDK tools.
|
|
22
|
+
* Per-tool resolver options can override labels, permissions, confirmation, audit, or UI metadata.
|
|
23
|
+
*/
|
|
24
|
+
function resolveAgentToolSet(tools, options = {}) {
|
|
25
|
+
return Object.fromEntries(Object.entries(tools).map(([name, definition]) => [name, resolveAgentTool(definition, options[name])]));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Produces serializable metadata that is attached to AI SDK tool calls.
|
|
29
|
+
* The chat UI and observability layers can read this without importing server-only code.
|
|
30
|
+
*/
|
|
31
|
+
function getSerializableToolMetadata(definition, options) {
|
|
32
|
+
return {
|
|
33
|
+
name: definition.name,
|
|
34
|
+
title: options.title ?? definition.title,
|
|
35
|
+
description: options.description ?? definition.description,
|
|
36
|
+
permissions: options.permissions,
|
|
37
|
+
confirmation: options.confirmation,
|
|
38
|
+
audit: options.audit,
|
|
39
|
+
ui: options.ui
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
//#endregion
|
|
44
|
+
export { resolveAgentTool, resolveAgentToolSet };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.server.mjs","names":[],"sources":["../../../src/tools/resolvers/agent.server.ts"],"sourcesContent":["import \"server-cli-only\";\n\nimport { type Tool, type ToolExecuteFunction, tool } from \"ai\";\nimport type {\n ToolAudit,\n ToolConfirmation,\n ToolContext,\n ToolDisplay,\n TulipToolDefinition,\n TulipToolSet,\n} from \"../types.js\";\n\nexport type AgentToolResolverOptions = {\n title?: string;\n description?: string;\n permissions?: string[];\n confirmation?: ToolConfirmation;\n audit?: ToolAudit;\n ui?: ToolDisplay;\n};\n\nexport function resolveAgentTool<TInput, TOutput, TContext extends ToolContext>(\n definition: TulipToolDefinition<string, TInput, TOutput, TContext>,\n options: AgentToolResolverOptions = {},\n): Tool<TInput, TOutput, TContext> {\n return tool({\n title: options.title ?? definition.title,\n description: options.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, options),\n },\n } as unknown as Tool<TInput, TOutput, TContext> & {\n execute: ToolExecuteFunction<TInput, TOutput, TContext>;\n });\n}\n\nexport function resolveAgentToolSet<TTools extends TulipToolSet>(\n tools: TTools,\n options: Partial<Record<keyof TTools, AgentToolResolverOptions>> = {},\n) {\n return Object.fromEntries(\n Object.entries(tools).map(([name, definition]) => [\n name,\n resolveAgentTool(definition, options[name]),\n ]),\n );\n}\n\nfunction getSerializableToolMetadata(\n definition: Pick<TulipToolDefinition, \"name\" | \"title\" | \"description\">,\n options: AgentToolResolverOptions,\n) {\n return {\n name: definition.name,\n title: options.title ?? definition.title,\n description: options.description ?? definition.description,\n permissions: options.permissions,\n confirmation: options.confirmation,\n audit: options.audit,\n ui: options.ui,\n };\n}\n"],"mappings":";;;;AAqBA,SAAgB,iBACd,YACA,UAAoC,EAAE,EACL;AACjC,QAAO,KAAK;EACV,OAAO,QAAQ,SAAS,WAAW;EACnC,aAAa,QAAQ,eAAe,WAAW;EAC/C,aAAa,WAAW;EACxB,cAAc,WAAW;EACzB,eAAe,WAAW;EAC1B,SAAS,WAAW;EACpB,UAAU,EACR,OAAO,4BAA4B,YAAY,QAAQ,EACxD;EACF,CAEC;;AAGJ,SAAgB,oBACd,OACA,UAAmE,EAAE,EACrE;AACA,QAAO,OAAO,YACZ,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,MAAM,gBAAgB,CAChD,MACA,iBAAiB,YAAY,QAAQ,MAAM,CAC5C,CAAC,CACH;;AAGH,SAAS,4BACP,YACA,SACA;AACA,QAAO;EACL,MAAM,WAAW;EACjB,OAAO,QAAQ,SAAS,WAAW;EACnC,aAAa,QAAQ,eAAe,WAAW;EAC/C,aAAa,QAAQ;EACrB,cAAc,QAAQ;EACtB,OAAO,QAAQ;EACf,IAAI,QAAQ;EACb"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { TulipToolDefinition } from "../lib/types.mjs";
|
|
2
|
+
import { McpToolResult } from "../../mcp/lib/types.mjs";
|
|
3
|
+
import "server-cli-only";
|
|
4
|
+
|
|
5
|
+
//#region src/tools/resolvers/mcp.server.d.ts
|
|
6
|
+
type MCPToolResolverOptions<TInput, TOutput> = {
|
|
7
|
+
title?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
content?: (options: {
|
|
10
|
+
input: TInput;
|
|
11
|
+
output: TOutput;
|
|
12
|
+
}) => McpToolResult | Promise<McpToolResult>;
|
|
13
|
+
};
|
|
14
|
+
type ResolvedMCPTool<TInput = unknown, TOutput = unknown> = {
|
|
15
|
+
name: string;
|
|
16
|
+
title: string;
|
|
17
|
+
description: string;
|
|
18
|
+
inputSchema: TulipToolDefinition<string, TInput, TOutput>["inputSchema"];
|
|
19
|
+
outputSchema?: TulipToolDefinition<string, TInput, TOutput>["outputSchema"];
|
|
20
|
+
resolveResult: (options: {
|
|
21
|
+
input: TInput;
|
|
22
|
+
output: TOutput;
|
|
23
|
+
}) => Promise<McpToolResult | undefined>;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Resolves a Tulip tool definition into an MCP-facing tool descriptor.
|
|
27
|
+
* MCP-specific labels and content formatting live here instead of in the base tool definition.
|
|
28
|
+
*/
|
|
29
|
+
declare function resolveMCPTool<TInput, TOutput>(definition: TulipToolDefinition<string, TInput, TOutput>, options?: MCPToolResolverOptions<TInput, TOutput>): ResolvedMCPTool<TInput, TOutput>;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { MCPToolResolverOptions, ResolvedMCPTool, resolveMCPTool };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.server.d.mts","names":[],"sources":["../../../src/tools/resolvers/mcp.server.ts"],"mappings":";;;;;KAKY,sBAAA;EACV,KAAA;EACA,WAAA;EACA,OAAA,IAAW,OAAA;IAAW,KAAA,EAAO,MAAA;IAAQ,MAAA,EAAQ,OAAA;EAAA,MAAc,aAAA,GAAgB,OAAA,CAAQ,aAAA;AAAA;AAAA,KAGzE,eAAA;EACV,IAAA;EACA,KAAA;EACA,WAAA;EACA,WAAA,EAAa,mBAAA,SAA4B,MAAA,EAAQ,OAAA;EACjD,YAAA,GAAe,mBAAA,SAA4B,MAAA,EAAQ,OAAA;EACnD,aAAA,GAAgB,OAAA;IACd,KAAA,EAAO,MAAA;IACP,MAAA,EAAQ,OAAA;EAAA,MACJ,OAAA,CAAQ,aAAA;AAAA;AAAA,iBAGA,cAAA,iBAAA,CACd,UAAA,EAAY,mBAAA,SAA4B,MAAA,EAAQ,OAAA,GAChD,OAAA,GAAS,sBAAA,CAAuB,MAAA,EAAQ,OAAA,IACvC,eAAA,CAAgB,MAAA,EAAQ,OAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import "server-cli-only";
|
|
2
|
+
|
|
3
|
+
//#region src/tools/resolvers/mcp.server.ts
|
|
4
|
+
/**
|
|
5
|
+
* Resolves a Tulip tool definition into an MCP-facing tool descriptor.
|
|
6
|
+
* MCP-specific labels and content formatting live here instead of in the base tool definition.
|
|
7
|
+
*/
|
|
8
|
+
function resolveMCPTool(definition, options = {}) {
|
|
9
|
+
return {
|
|
10
|
+
name: definition.name,
|
|
11
|
+
title: options.title ?? definition.title,
|
|
12
|
+
description: options.description ?? definition.description,
|
|
13
|
+
inputSchema: definition.inputSchema,
|
|
14
|
+
outputSchema: definition.outputSchema,
|
|
15
|
+
resolveResult: async (resultOptions) => options.content?.(resultOptions)
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
//#endregion
|
|
20
|
+
export { resolveMCPTool };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.server.mjs","names":[],"sources":["../../../src/tools/resolvers/mcp.server.ts"],"sourcesContent":["import \"server-cli-only\";\n\nimport type { McpToolResult } from \"../../mcp/types.js\";\nimport type { TulipToolDefinition } from \"../types.js\";\n\nexport type MCPToolResolverOptions<TInput, TOutput> = {\n title?: string;\n description?: string;\n content?: (options: { input: TInput; output: TOutput }) => McpToolResult | Promise<McpToolResult>;\n};\n\nexport type ResolvedMCPTool<TInput = unknown, TOutput = unknown> = {\n name: string;\n title: string;\n description: string;\n inputSchema: TulipToolDefinition<string, TInput, TOutput>[\"inputSchema\"];\n outputSchema?: TulipToolDefinition<string, TInput, TOutput>[\"outputSchema\"];\n resolveResult: (options: {\n input: TInput;\n output: TOutput;\n }) => Promise<McpToolResult | undefined>;\n};\n\nexport function resolveMCPTool<TInput, TOutput>(\n definition: TulipToolDefinition<string, TInput, TOutput>,\n options: MCPToolResolverOptions<TInput, TOutput> = {},\n): ResolvedMCPTool<TInput, TOutput> {\n return {\n name: definition.name,\n title: options.title ?? definition.title,\n description: options.description ?? definition.description,\n inputSchema: definition.inputSchema,\n outputSchema: definition.outputSchema,\n resolveResult: async (resultOptions) => options.content?.(resultOptions),\n };\n}\n"],"mappings":";;;AAuBA,SAAgB,eACd,YACA,UAAmD,EAAE,EACnB;AAClC,QAAO;EACL,MAAM,WAAW;EACjB,OAAO,QAAQ,SAAS,WAAW;EACnC,aAAa,QAAQ,eAAe,WAAW;EAC/C,aAAa,WAAW;EACxB,cAAc,WAAW;EACzB,eAAe,OAAO,kBAAkB,QAAQ,UAAU,cAAc;EACzE"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ToolAudit, ToolConfirmation, ToolContext, ToolDisplay, TulipToolDefinition, TulipToolExecutionOptions, TulipToolSet } from "./lib/types.mjs";
|
|
2
|
+
import { defineTool, defineToolSet } from "./lib/definitions.mjs";
|
|
3
|
+
import { AgentToolResolverOptions, resolveAgentTool, resolveAgentToolSet } from "./resolvers/agent.server.mjs";
|
|
4
|
+
import { MCPToolResolverOptions, ResolvedMCPTool, resolveMCPTool } from "./resolvers/mcp.server.mjs";
|
|
5
|
+
export { AgentToolResolverOptions, MCPToolResolverOptions, ResolvedMCPTool, ToolAudit, ToolConfirmation, ToolContext, ToolDisplay, TulipToolDefinition, TulipToolExecutionOptions, TulipToolSet, defineTool, defineToolSet, resolveAgentTool, resolveAgentToolSet, resolveMCPTool };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { defineTool, defineToolSet } from "./lib/definitions.mjs";
|
|
2
|
+
import { resolveAgentTool, resolveAgentToolSet } from "./resolvers/agent.server.mjs";
|
|
3
|
+
import { resolveMCPTool } from "./resolvers/mcp.server.mjs";
|
|
4
|
+
|
|
5
|
+
export { defineTool, defineToolSet, resolveAgentTool, resolveAgentToolSet, resolveMCPTool };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { FlexibleSchema, ToolExecuteFunction, ToolExecutionOptions } from "ai";
|
|
2
|
+
|
|
3
|
+
//#region src/tools/types.d.ts
|
|
4
|
+
type ToolContext = Record<string, unknown>;
|
|
5
|
+
type ToolConfirmation = false | {
|
|
6
|
+
required?: boolean;
|
|
7
|
+
title?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
destructive?: boolean;
|
|
10
|
+
};
|
|
11
|
+
type ToolAudit = {
|
|
12
|
+
action: string;
|
|
13
|
+
resource?: string;
|
|
14
|
+
severity?: "low" | "medium" | "high";
|
|
15
|
+
};
|
|
16
|
+
type ToolDisplay = {
|
|
17
|
+
label?: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
icon?: string;
|
|
20
|
+
};
|
|
21
|
+
type TulipToolDefinition<TName extends string = string, TInput = unknown, TOutput = unknown, TContext extends ToolContext = ToolContext> = {
|
|
22
|
+
name: TName;
|
|
23
|
+
title: string;
|
|
24
|
+
description: string;
|
|
25
|
+
inputSchema: FlexibleSchema<TInput>;
|
|
26
|
+
outputSchema?: FlexibleSchema<TOutput>;
|
|
27
|
+
contextSchema?: FlexibleSchema<TContext>;
|
|
28
|
+
execute: ToolExecuteFunction<TInput, TOutput, TContext>;
|
|
29
|
+
};
|
|
30
|
+
type TulipToolSet = Record<string, TulipToolDefinition>;
|
|
31
|
+
type TulipToolExecutionOptions<TContext extends ToolContext = ToolContext> = ToolExecutionOptions<TContext>;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { ToolAudit, ToolConfirmation, ToolContext, ToolDisplay, TulipToolDefinition, TulipToolExecutionOptions, TulipToolSet };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/tools/types.ts"],"mappings":";;;KAEY,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,mBAAA,sFAIO,WAAA,GAAc,WAAA;EAE/B,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,KAE9B,yBAAA,kBAA2C,WAAA,GAAc,WAAA,IACnE,oBAAA,CAAqB,QAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tulip-systems/ai",
|
|
3
|
+
"version": "0.11.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"sideEffects": false,
|
|
6
|
+
"license": "AGPL-3.0",
|
|
7
|
+
"devDependencies": {
|
|
8
|
+
"@arethetypeswrong/core": "^0.18.2",
|
|
9
|
+
"@orpc/server": "^1.14.2",
|
|
10
|
+
"@types/react": "19.2.14",
|
|
11
|
+
"ai": "^7.0.9",
|
|
12
|
+
"publint": "^0.3.20",
|
|
13
|
+
"react": "19.2.6",
|
|
14
|
+
"tsdown": "^0.20.3",
|
|
15
|
+
"typescript": "5.9.3",
|
|
16
|
+
"unrun": "^0.3.0",
|
|
17
|
+
"@tulip-systems/typescript-config": "0.0.0"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"lucide-react": "1.14.0",
|
|
21
|
+
"server-cli-only": "^0.3.2",
|
|
22
|
+
"tailwindcss": "4.3.0",
|
|
23
|
+
"vitest": "4.1.5",
|
|
24
|
+
"@tulip-systems/core": "0.11.0"
|
|
25
|
+
},
|
|
26
|
+
"peerDependencies": {
|
|
27
|
+
"@orpc/server": "^1.14.2",
|
|
28
|
+
"ai": "^7.0.9",
|
|
29
|
+
"react": "19.2.6"
|
|
30
|
+
},
|
|
31
|
+
"publishConfig": {
|
|
32
|
+
"access": "public"
|
|
33
|
+
},
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": "24.x"
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"dist",
|
|
39
|
+
"src"
|
|
40
|
+
],
|
|
41
|
+
"exports": {
|
|
42
|
+
"./agents/server": "./dist/agents/server.mjs",
|
|
43
|
+
"./chat": "./dist/chat.mjs",
|
|
44
|
+
"./chat/client": "./dist/chat/client.mjs",
|
|
45
|
+
"./chat/server": "./dist/chat/server.mjs",
|
|
46
|
+
"./mcp/server": "./dist/mcp/server.mjs",
|
|
47
|
+
"./tools/client": "./dist/tools/client.mjs",
|
|
48
|
+
"./tools/server": "./dist/tools/server.mjs",
|
|
49
|
+
"./package.json": "./package.json",
|
|
50
|
+
"./styles.css": "./src/styles.css"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"dev": "tsdown --config tsdown.config.ts --config-loader unrun --watch",
|
|
54
|
+
"build": "tsdown --config tsdown.config.ts --config-loader unrun",
|
|
55
|
+
"release:build": "pnpm run build",
|
|
56
|
+
"lint": "biome check",
|
|
57
|
+
"format": "biome format --write",
|
|
58
|
+
"typecheck": "tsc --noEmit",
|
|
59
|
+
"clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import "server-cli-only";
|
|
2
|
+
|
|
3
|
+
import { ToolLoopAgent } from "ai";
|
|
4
|
+
import type { AgentSettings, CreatedAgent } from "./types";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Creates an AI SDK tool-loop agent with Tulip's package-level entrypoint.
|
|
8
|
+
* This keeps applications from importing the underlying agent implementation directly.
|
|
9
|
+
*/
|
|
10
|
+
export function createAgent(settings: AgentSettings): CreatedAgent {
|
|
11
|
+
return new ToolLoopAgent(
|
|
12
|
+
settings as ConstructorParameters<typeof ToolLoopAgent>[0],
|
|
13
|
+
) as CreatedAgent;
|
|
14
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import "server-cli-only";
|
|
2
|
+
|
|
3
|
+
import { defineTool } from "../../tools/lib/definitions";
|
|
4
|
+
import type { ToolContext } from "../../tools/lib/types";
|
|
5
|
+
import type { DelegateToAgentToolOptions } from "./types";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Defines a Tulip tool that delegates work to another agent and returns its result.
|
|
9
|
+
* Resolve the returned definition with `resolveAgentTool()` before passing it to an agent.
|
|
10
|
+
*/
|
|
11
|
+
export function delegateToAgentTool<
|
|
12
|
+
const TName extends string,
|
|
13
|
+
TInput extends Record<string, unknown>,
|
|
14
|
+
TOutput = { summary: string },
|
|
15
|
+
TContext extends ToolContext = ToolContext,
|
|
16
|
+
>(options: DelegateToAgentToolOptions<TName, TInput, TOutput, TContext>) {
|
|
17
|
+
return defineTool({
|
|
18
|
+
name: options.name,
|
|
19
|
+
title: options.title,
|
|
20
|
+
description: options.description,
|
|
21
|
+
inputSchema: options.inputSchema,
|
|
22
|
+
outputSchema: options.outputSchema,
|
|
23
|
+
contextSchema: options.contextSchema,
|
|
24
|
+
async execute(input, { abortSignal }) {
|
|
25
|
+
const result = await options.agent.generate({
|
|
26
|
+
prompt: options.prompt ? options.prompt(input) : String(input.task ?? ""),
|
|
27
|
+
abortSignal,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
return options.output ? options.output(result, input) : ({ summary: result.text } as TOutput);
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import "server-cli-only";
|
|
2
|
+
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
|
|
5
|
+
const instructionCache = new Map<string, string>();
|
|
6
|
+
|
|
7
|
+
export type LoadAgentInstructionsOptions = {
|
|
8
|
+
path?: string;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Loads an agent's always-on instructions from a file next to the agent module.
|
|
13
|
+
* Pass `import.meta.url` from the agent file so relative paths resolve from that agent folder.
|
|
14
|
+
* Defaults to `./instructions.md`.
|
|
15
|
+
*/
|
|
16
|
+
export function loadAgentInstructions(
|
|
17
|
+
importMetaUrl: string,
|
|
18
|
+
options: LoadAgentInstructionsOptions = {},
|
|
19
|
+
) {
|
|
20
|
+
const instructionUrl = new URL(options.path ?? "./instructions.md", importMetaUrl);
|
|
21
|
+
const cacheKey = instructionUrl.href;
|
|
22
|
+
const cached = instructionCache.get(cacheKey);
|
|
23
|
+
|
|
24
|
+
if (cached !== undefined) {
|
|
25
|
+
return cached;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
const instructions = readFileSync(instructionUrl, "utf-8");
|
|
30
|
+
instructionCache.set(cacheKey, instructions);
|
|
31
|
+
return instructions;
|
|
32
|
+
} catch (error) {
|
|
33
|
+
throw new Error(`Unable to load agent instructions from ${instructionUrl.pathname}.`, {
|
|
34
|
+
cause: error,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Agent, Experimental_AgentSettings, FlexibleSchema, ToolSet } from "ai";
|
|
2
|
+
import type { ToolContext, TulipToolDefinition } from "../../tools/lib/types";
|
|
3
|
+
|
|
4
|
+
export type AgentSettings = Experimental_AgentSettings;
|
|
5
|
+
|
|
6
|
+
export type CreatedAgent<TTools extends ToolSet = ToolSet> = Agent<
|
|
7
|
+
never,
|
|
8
|
+
TTools,
|
|
9
|
+
Record<string, unknown>,
|
|
10
|
+
never
|
|
11
|
+
>;
|
|
12
|
+
|
|
13
|
+
export type DelegationTargetAgent = {
|
|
14
|
+
generate(options: { prompt: string; abortSignal?: AbortSignal }): PromiseLike<{ text: string }>;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type DelegateToAgentToolOptions<
|
|
18
|
+
TName extends string,
|
|
19
|
+
TInput extends Record<string, unknown>,
|
|
20
|
+
TOutput,
|
|
21
|
+
TContext extends ToolContext = ToolContext,
|
|
22
|
+
> = Pick<
|
|
23
|
+
TulipToolDefinition<TName, TInput, TOutput, TContext>,
|
|
24
|
+
"name" | "title" | "description"
|
|
25
|
+
> & {
|
|
26
|
+
agent: DelegationTargetAgent;
|
|
27
|
+
inputSchema: FlexibleSchema<TInput>;
|
|
28
|
+
outputSchema?: FlexibleSchema<TOutput>;
|
|
29
|
+
contextSchema?: FlexibleSchema<TContext>;
|
|
30
|
+
prompt?: (input: TInput) => string;
|
|
31
|
+
output?: (result: { text: string }, input: TInput) => TOutput;
|
|
32
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { cn } from "@tulip-systems/core/lib";
|
|
4
|
+
|
|
5
|
+
export type AgentActivityProps = {
|
|
6
|
+
className?: string;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Small typing indicator for an agent that is currently streaming a response.
|
|
11
|
+
*/
|
|
12
|
+
export function AgentActivity({ className }: AgentActivityProps) {
|
|
13
|
+
return (
|
|
14
|
+
<div className={cn("flex h-7 w-fit items-center gap-1 px-1", className)}>
|
|
15
|
+
<span className="sr-only">Assistant is responding</span>
|
|
16
|
+
<span className="size-1.5 animate-pulse rounded-full bg-muted-foreground/50 [animation-delay:-0.3s]" />
|
|
17
|
+
<span className="size-1.5 animate-pulse rounded-full bg-muted-foreground/50 [animation-delay:-0.15s]" />
|
|
18
|
+
<span className="size-1.5 animate-pulse rounded-full bg-muted-foreground/50" />
|
|
19
|
+
</div>
|
|
20
|
+
);
|
|
21
|
+
}
|