@knocklabs/agent-toolkit 0.1.14 → 0.3.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/README.md +42 -0
- package/dist/ai-sdk/index.d.ts +3 -3
- package/dist/ai-sdk/index.js +3 -3
- package/dist/{chunk-GWRZ4NRX.js → chunk-6XUAKMWE.js} +3 -3
- package/dist/{chunk-GWRZ4NRX.js.map → chunk-6XUAKMWE.js.map} +1 -1
- package/dist/{chunk-IGJSMDBC.js → chunk-X3LAGKQW.js} +2 -2
- package/dist/chunk-X3LAGKQW.js.map +1 -0
- package/dist/chunk-YKYMGKIV.js +153 -0
- package/dist/chunk-YKYMGKIV.js.map +1 -0
- package/dist/{chunk-RMUYOYLN.js → chunk-YLJGTJTR.js} +635 -242
- package/dist/chunk-YLJGTJTR.js.map +1 -0
- package/dist/human-in-the-loop.d.ts +7 -6
- package/dist/human-in-the-loop.js +1 -1
- package/dist/langchain/index.js +3 -3
- package/dist/langchain/index.js.map +1 -1
- package/dist/mastra/index.d.ts +18 -0
- package/dist/mastra/index.js +74 -0
- package/dist/mastra/index.js.map +1 -0
- package/dist/modelcontextprotocol/index.js +2 -2
- package/dist/modelcontextprotocol/local-server.js +8 -5
- package/dist/modelcontextprotocol/local-server.js.map +1 -1
- package/dist/openai/index.js +2 -2
- package/dist/{types-D6xiNyB2.d.ts → types-kR5zfaEk.d.ts} +7 -3
- package/dist/types.d.ts +5 -0
- package/package.json +9 -4
- package/dist/chunk-IGJSMDBC.js.map +0 -1
- package/dist/chunk-RMUYOYLN.js.map +0 -1
- package/dist/chunk-TRLABEB7.js +0 -35
- package/dist/chunk-TRLABEB7.js.map +0 -1
package/README.md
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
- [AI SDK](#ai-sdk)
|
|
13
13
|
- [OpenAI](#openai)
|
|
14
14
|
- [Langchain](#langchain)
|
|
15
|
+
- [Mastra](#mastra)
|
|
15
16
|
|
|
16
17
|
## Getting started
|
|
17
18
|
|
|
@@ -227,3 +228,44 @@ export async function POST(req: Request) {
|
|
|
227
228
|
return LangChainAdapter.toDataStreamResponse(stream);
|
|
228
229
|
}
|
|
229
230
|
```
|
|
231
|
+
|
|
232
|
+
### Mastra
|
|
233
|
+
|
|
234
|
+
The agent toolkit provides a `createKnockToolkit` under the `/mastra` path for easily integrating into the Mastra framework and returning tools ready for use.
|
|
235
|
+
|
|
236
|
+
1. Install the package:
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
npm install @knocklabs/agent-toolkit
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
2. Import the `createKnockToolkit` helper, configure it, and use it in your LLM calling:
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
import { anthropic } from "@ai-sdk/anthropic";
|
|
246
|
+
import { Agent } from "@mastra/core/agent";
|
|
247
|
+
import { Memory } from "@mastra/memory";
|
|
248
|
+
import { LibSQLStore } from "@mastra/libsql";
|
|
249
|
+
import { createKnockToolkit } from "@knocklabs/agent-toolkit/mastra";
|
|
250
|
+
|
|
251
|
+
const toolkit = await createKnockToolkit({
|
|
252
|
+
serviceToken: "knock_st_",
|
|
253
|
+
permissions: {
|
|
254
|
+
// (optional but recommended): Set the permissions of the tools to expose
|
|
255
|
+
workflows: { read: true, run: true, manage: true },
|
|
256
|
+
},
|
|
257
|
+
userId: "10",
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
export const weatherAgent = new Agent({
|
|
261
|
+
name: "Weather Agent",
|
|
262
|
+
instructions: `You are a helpful weather assistant that provides accurate weather information.`,
|
|
263
|
+
model: anthropic("claude-3-5-sonnet-20241022"),
|
|
264
|
+
tools: toolkit.getAllTools(),
|
|
265
|
+
memory: new Memory({
|
|
266
|
+
storage: new LibSQLStore({
|
|
267
|
+
url: "file:../mastra.db", // path is relative to the .mastra/output directory
|
|
268
|
+
}),
|
|
269
|
+
}),
|
|
270
|
+
});
|
|
271
|
+
```
|
package/dist/ai-sdk/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ToolSet, Tool } from 'ai';
|
|
2
|
-
import { a as DeferredToolCall, b as DeferredToolCallConfig, K as KnockOutboundWebhookEvent, D as DeferredToolCallInteractionResult } from '../types-
|
|
2
|
+
import { a as DeferredToolCall, b as DeferredToolCallConfig, K as KnockOutboundWebhookEvent, D as DeferredToolCallInteractionResult } from '../types-kR5zfaEk.js';
|
|
3
3
|
import { ToolkitConfig, ToolCategory } from '../types.js';
|
|
4
4
|
import { ToolInvocation } from '@ai-sdk/ui-utils';
|
|
5
|
-
import '@knocklabs/
|
|
6
|
-
import '@knocklabs/node/
|
|
5
|
+
import '@knocklabs/mgmt/resources.js';
|
|
6
|
+
import '@knocklabs/node/resources.js';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Convert a deferred tool call to a tool invocation. Useful when building an assistant
|
package/dist/ai-sdk/index.js
CHANGED
|
@@ -2,14 +2,14 @@ import {
|
|
|
2
2
|
handleMessageInteraction,
|
|
3
3
|
triggerHumanInTheLoopWorkflow,
|
|
4
4
|
wrapToolDescription
|
|
5
|
-
} from "../chunk-
|
|
5
|
+
} from "../chunk-X3LAGKQW.js";
|
|
6
6
|
import {
|
|
7
7
|
createKnockClient
|
|
8
|
-
} from "../chunk-
|
|
8
|
+
} from "../chunk-YKYMGKIV.js";
|
|
9
9
|
import {
|
|
10
10
|
getToolMap,
|
|
11
11
|
getToolsByPermissionsInCategories
|
|
12
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-YLJGTJTR.js";
|
|
13
13
|
import "../chunk-G3PMV62Z.js";
|
|
14
14
|
|
|
15
15
|
// src/ai-sdk/tool-converter.ts
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
allTools,
|
|
3
3
|
createWorkflowTools
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-YLJGTJTR.js";
|
|
5
5
|
|
|
6
6
|
// src/modelcontextprotocol/adapter.ts
|
|
7
7
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
8
|
import { z } from "zod";
|
|
9
9
|
var KnockMcpServer = class extends McpServer {
|
|
10
10
|
constructor(knockClient, config, tools) {
|
|
11
|
-
super({ name: "Knock", version: "0.
|
|
11
|
+
super({ name: "Knock", version: "0.3.0" });
|
|
12
12
|
tools.forEach((tool) => {
|
|
13
13
|
const toolParams = tool.parameters ?? z.object({});
|
|
14
14
|
this.tool(
|
|
@@ -44,4 +44,4 @@ var createKnockMcpServer = async (params) => {
|
|
|
44
44
|
export {
|
|
45
45
|
createKnockMcpServer
|
|
46
46
|
};
|
|
47
|
-
//# sourceMappingURL=chunk-
|
|
47
|
+
//# sourceMappingURL=chunk-6XUAKMWE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modelcontextprotocol/adapter.ts","../src/modelcontextprotocol/index.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n\nimport { KnockClient } from \"../lib/knock-client.js\";\nimport type { KnockTool } from \"../lib/knock-tool.js\";\nimport { Config } from \"../types.js\";\n\nexport class KnockMcpServer extends McpServer {\n constructor(knockClient: KnockClient, config: Config, tools: KnockTool[]) {\n super({ name: \"Knock\", version: PACKAGE_VERSION });\n\n tools.forEach((tool) => {\n const toolParams = tool.parameters ?? z.object({});\n\n this.tool(\n tool.method,\n tool.description,\n toolParams.shape,\n async (arg: unknown) => {\n const res = await tool.bindExecute(knockClient, config)(arg);\n\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(res) }],\n };\n }\n );\n });\n }\n}\n","import { KnockClient } from \"../lib/knock-client.js\";\nimport type { KnockTool } from \"../lib/knock-tool.js\";\nimport { allTools } from \"../lib/tools/index.js\";\nimport { createWorkflowTools } from \"../lib/tools/workflows-as-tools.js\";\nimport { Config } from \"../types.js\";\n\nimport { KnockMcpServer } from \"./adapter.js\";\n\ntype CreateKnockMcpServerParams = {\n /**\n * Array of Knock tools to enable in the server.\n */\n tools?: KnockTool[];\n\n /**\n * A Knock client to use for the server.\n */\n knockClient: KnockClient;\n\n /**\n * The config to use for the server.\n */\n config: Config;\n\n /**\n * The workflows to enable as tools in the MCP server.\n */\n workflows?: string[];\n};\n\n/**\n * Creates a Knock MCP Server with the given parameters.\n */\nexport const createKnockMcpServer = async (\n params: CreateKnockMcpServerParams\n): Promise<KnockMcpServer> => {\n const { tools, knockClient, config, workflows } = params;\n\n let baseTools = tools || Object.values(allTools);\n\n if (workflows && Array.isArray(workflows) && workflows.length > 0) {\n const workflowTools = await createWorkflowTools(\n knockClient,\n config,\n workflows\n );\n\n baseTools = [...baseTools, ...workflowTools];\n }\n\n return Promise.resolve(new KnockMcpServer(knockClient, config, baseTools));\n};\n"],"mappings":";;;;;;AAAA,SAAS,iBAAiB;AAC1B,SAAS,SAAS;AAMX,IAAM,iBAAN,cAA6B,UAAU;AAAA,EAC5C,YAAY,aAA0B,QAAgB,OAAoB;AACxE,UAAM,EAAE,MAAM,SAAS,SAAS,
|
|
1
|
+
{"version":3,"sources":["../src/modelcontextprotocol/adapter.ts","../src/modelcontextprotocol/index.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n\nimport { KnockClient } from \"../lib/knock-client.js\";\nimport type { KnockTool } from \"../lib/knock-tool.js\";\nimport { Config } from \"../types.js\";\n\nexport class KnockMcpServer extends McpServer {\n constructor(knockClient: KnockClient, config: Config, tools: KnockTool[]) {\n super({ name: \"Knock\", version: PACKAGE_VERSION });\n\n tools.forEach((tool) => {\n const toolParams = tool.parameters ?? z.object({});\n\n this.tool(\n tool.method,\n tool.description,\n toolParams.shape,\n async (arg: unknown) => {\n const res = await tool.bindExecute(knockClient, config)(arg);\n\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(res) }],\n };\n }\n );\n });\n }\n}\n","import { KnockClient } from \"../lib/knock-client.js\";\nimport type { KnockTool } from \"../lib/knock-tool.js\";\nimport { allTools } from \"../lib/tools/index.js\";\nimport { createWorkflowTools } from \"../lib/tools/workflows-as-tools.js\";\nimport { Config } from \"../types.js\";\n\nimport { KnockMcpServer } from \"./adapter.js\";\n\ntype CreateKnockMcpServerParams = {\n /**\n * Array of Knock tools to enable in the server.\n */\n tools?: KnockTool[];\n\n /**\n * A Knock client to use for the server.\n */\n knockClient: KnockClient;\n\n /**\n * The config to use for the server.\n */\n config: Config;\n\n /**\n * The workflows to enable as tools in the MCP server.\n */\n workflows?: string[];\n};\n\n/**\n * Creates a Knock MCP Server with the given parameters.\n */\nexport const createKnockMcpServer = async (\n params: CreateKnockMcpServerParams\n): Promise<KnockMcpServer> => {\n const { tools, knockClient, config, workflows } = params;\n\n let baseTools = tools || Object.values(allTools);\n\n if (workflows && Array.isArray(workflows) && workflows.length > 0) {\n const workflowTools = await createWorkflowTools(\n knockClient,\n config,\n workflows\n );\n\n baseTools = [...baseTools, ...workflowTools];\n }\n\n return Promise.resolve(new KnockMcpServer(knockClient, config, baseTools));\n};\n"],"mappings":";;;;;;AAAA,SAAS,iBAAiB;AAC1B,SAAS,SAAS;AAMX,IAAM,iBAAN,cAA6B,UAAU;AAAA,EAC5C,YAAY,aAA0B,QAAgB,OAAoB;AACxE,UAAM,EAAE,MAAM,SAAS,SAAS,QAAgB,CAAC;AAEjD,UAAM,QAAQ,CAAC,SAAS;AACtB,YAAM,aAAa,KAAK,cAAc,EAAE,OAAO,CAAC,CAAC;AAEjD,WAAK;AAAA,QACH,KAAK;AAAA,QACL,KAAK;AAAA,QACL,WAAW;AAAA,QACX,OAAO,QAAiB;AACtB,gBAAM,MAAM,MAAM,KAAK,YAAY,aAAa,MAAM,EAAE,GAAG;AAE3D,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,GAAG,EAAE,CAAC;AAAA,UAChE;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACKO,IAAM,uBAAuB,OAClC,WAC4B;AAC5B,QAAM,EAAE,OAAO,aAAa,QAAQ,UAAU,IAAI;AAElD,MAAI,YAAY,SAAS,OAAO,OAAO,QAAQ;AAE/C,MAAI,aAAa,MAAM,QAAQ,SAAS,KAAK,UAAU,SAAS,GAAG;AACjE,UAAM,gBAAgB,MAAM;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,gBAAY,CAAC,GAAG,WAAW,GAAG,aAAa;AAAA,EAC7C;AAEA,SAAO,QAAQ,QAAQ,IAAI,eAAe,aAAa,QAAQ,SAAS,CAAC;AAC3E;","names":[]}
|
|
@@ -34,7 +34,7 @@ function handleMessageInteraction(event) {
|
|
|
34
34
|
if (event.type !== "message.interacted") {
|
|
35
35
|
return null;
|
|
36
36
|
}
|
|
37
|
-
if (message
|
|
37
|
+
if (message?.data?.type !== "deferred_tool_call" || !message.data.tool_call) {
|
|
38
38
|
return null;
|
|
39
39
|
}
|
|
40
40
|
const messageData = message.data;
|
|
@@ -61,4 +61,4 @@ export {
|
|
|
61
61
|
triggerHumanInTheLoopWorkflow,
|
|
62
62
|
handleMessageInteraction
|
|
63
63
|
};
|
|
64
|
-
//# sourceMappingURL=chunk-
|
|
64
|
+
//# sourceMappingURL=chunk-X3LAGKQW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/human-in-the-loop/index.ts"],"sourcesContent":["import { RecipientRequest } from \"@knocklabs/node/resources.js\";\n\nimport { Config } from \"@/types\";\n\nimport { KnockClient } from \"../knock-client\";\n\nimport {\n DeferredToolCallWorkflowData,\n DeferredToolCallConfig,\n KnockOutboundWebhookEvent,\n DeferredToolCall,\n DeferredToolCallInteractionResult,\n} from \"./types\";\n\nfunction wrapToolDescription(description: string) {\n return `${description}\\n\\nThis tool call is deferred. You will NOT receive a result from this tool but this is NOT an error. Do NOT retry the tool call as the result will be the same. The tool call result will be provided to you in the future.`;\n}\n\n/**\n * Triggers a human in the loop workflow.\n *\n * @param knockClient - The Knock client to use.\n * @param toolCall - The tool call to trigger.\n * @param config - The configuration to use.\n */\nasync function triggerHumanInTheLoopWorkflow({\n knockClient,\n config,\n toolCall,\n inputConfig,\n}: {\n knockClient: KnockClient;\n config: Config;\n toolCall: DeferredToolCall;\n inputConfig: DeferredToolCallConfig;\n}) {\n const knock = await knockClient.publicApi(config.environment);\n\n if (inputConfig.onBeforeCallKnock) {\n await inputConfig.onBeforeCallKnock(toolCall);\n }\n\n const result = await knock.workflows.trigger(inputConfig.workflow, {\n data: {\n type: \"deferred_tool_call\",\n tool_call: toolCall,\n metadata: inputConfig.metadata,\n } as DeferredToolCallWorkflowData,\n recipients: inputConfig.recipients as RecipientRequest[],\n tenant: inputConfig.tenant,\n actor: inputConfig.actor as unknown as RecipientRequest,\n });\n\n if (inputConfig.onAfterCallKnock) {\n await inputConfig.onAfterCallKnock(toolCall, result);\n }\n\n return result;\n}\n\n/**\n * Given an outboundwebhook event, this function will parse the event into a normalized format.\n *\n * If the event is not associated with a deferred tool call, this function will return null.\n *\n * @param event - The outbound webhook event\n * @returns A deferred tool call interaction result, or null if the event is not a deferred tool call\n */\nfunction handleMessageInteraction(\n event: KnockOutboundWebhookEvent\n): DeferredToolCallInteractionResult | null {\n const { data: message } = event;\n\n // We only care about message.interacted events\n if (event.type !== \"message.interacted\") {\n return null;\n }\n\n // We only care about messages that contain a tool call\n if (message?.data?.type !== \"deferred_tool_call\" || !message.data.tool_call) {\n return null;\n }\n\n const messageData = message.data as unknown as DeferredToolCallWorkflowData;\n\n return {\n workflow: message.source!.key,\n interaction: event.event_data,\n toolCall: {\n id: messageData.tool_call.id,\n method: messageData.tool_call.method,\n args: messageData.tool_call.args,\n extra: messageData.tool_call.extra,\n },\n metadata: messageData.metadata,\n context: {\n messageId: message.id!,\n channelId: message.channel_id!,\n timestamp: event.created_at,\n },\n };\n}\n\nexport {\n handleMessageInteraction,\n triggerHumanInTheLoopWorkflow,\n wrapToolDescription,\n};\n"],"mappings":";AAcA,SAAS,oBAAoB,aAAqB;AAChD,SAAO,GAAG,WAAW;AAAA;AAAA;AACvB;AASA,eAAe,8BAA8B;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,QAAQ,MAAM,YAAY,UAAU,OAAO,WAAW;AAE5D,MAAI,YAAY,mBAAmB;AACjC,UAAM,YAAY,kBAAkB,QAAQ;AAAA,EAC9C;AAEA,QAAM,SAAS,MAAM,MAAM,UAAU,QAAQ,YAAY,UAAU;AAAA,IACjE,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,WAAW;AAAA,MACX,UAAU,YAAY;AAAA,IACxB;AAAA,IACA,YAAY,YAAY;AAAA,IACxB,QAAQ,YAAY;AAAA,IACpB,OAAO,YAAY;AAAA,EACrB,CAAC;AAED,MAAI,YAAY,kBAAkB;AAChC,UAAM,YAAY,iBAAiB,UAAU,MAAM;AAAA,EACrD;AAEA,SAAO;AACT;AAUA,SAAS,yBACP,OAC0C;AAC1C,QAAM,EAAE,MAAM,QAAQ,IAAI;AAG1B,MAAI,MAAM,SAAS,sBAAsB;AACvC,WAAO;AAAA,EACT;AAGA,MAAI,SAAS,MAAM,SAAS,wBAAwB,CAAC,QAAQ,KAAK,WAAW;AAC3E,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,QAAQ;AAE5B,SAAO;AAAA,IACL,UAAU,QAAQ,OAAQ;AAAA,IAC1B,aAAa,MAAM;AAAA,IACnB,UAAU;AAAA,MACR,IAAI,YAAY,UAAU;AAAA,MAC1B,QAAQ,YAAY,UAAU;AAAA,MAC9B,MAAM,YAAY,UAAU;AAAA,MAC5B,OAAO,YAAY,UAAU;AAAA,IAC/B;AAAA,IACA,UAAU,YAAY;AAAA,IACtB,SAAS;AAAA,MACP,WAAW,QAAQ;AAAA,MACnB,WAAW,QAAQ;AAAA,MACnB,WAAW,MAAM;AAAA,IACnB;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// src/lib/knock-client.ts
|
|
2
|
+
import KnockMgmt from "@knocklabs/mgmt";
|
|
3
|
+
import { Knock } from "@knocklabs/node";
|
|
4
|
+
|
|
5
|
+
// package.json
|
|
6
|
+
var package_default = {
|
|
7
|
+
name: "@knocklabs/agent-toolkit",
|
|
8
|
+
version: "0.3.0",
|
|
9
|
+
description: "A toolkit for working with Knock in Agent workflows.",
|
|
10
|
+
main: "src/index.js",
|
|
11
|
+
scripts: {
|
|
12
|
+
build: "tsup --env.NODE_ENV production",
|
|
13
|
+
clean: "rimraf ./dist",
|
|
14
|
+
dev: "tsup --watch",
|
|
15
|
+
lint: "eslint src --ext .ts,.tsx",
|
|
16
|
+
"lint:fix": "eslint src --ext .ts,.tsx --fix",
|
|
17
|
+
format: 'prettier --write "src/**/*.{ts,tsx}"',
|
|
18
|
+
"format:check": 'prettier --check "src/**/*.{ts,tsx}"',
|
|
19
|
+
test: "vitest run",
|
|
20
|
+
"test:watch": "vitest",
|
|
21
|
+
release: "npm run build && npm run release:publish && changeset tag",
|
|
22
|
+
"release:publish": "npm publish --access public --tolerate-republish"
|
|
23
|
+
},
|
|
24
|
+
author: "Knock",
|
|
25
|
+
license: "MIT",
|
|
26
|
+
sideEffects: false,
|
|
27
|
+
type: "module",
|
|
28
|
+
exports: {
|
|
29
|
+
"./openai": {
|
|
30
|
+
types: "./dist/openai/index.d.ts",
|
|
31
|
+
default: "./dist/openai/index.js"
|
|
32
|
+
},
|
|
33
|
+
"./ai-sdk": {
|
|
34
|
+
types: "./dist/ai-sdk/index.d.ts",
|
|
35
|
+
default: "./dist/ai-sdk/index.js"
|
|
36
|
+
},
|
|
37
|
+
"./langchain": {
|
|
38
|
+
types: "./dist/langchain/index.d.ts",
|
|
39
|
+
default: "./dist/langchain/index.js"
|
|
40
|
+
},
|
|
41
|
+
"./mastra": {
|
|
42
|
+
types: "./dist/mastra/index.d.ts",
|
|
43
|
+
default: "./dist/mastra/index.js"
|
|
44
|
+
},
|
|
45
|
+
"./modelcontextprotocol": {
|
|
46
|
+
types: "./dist/modelcontextprotocol/index.d.ts",
|
|
47
|
+
default: "./dist/modelcontextprotocol/index.js"
|
|
48
|
+
},
|
|
49
|
+
"./human-in-the-loop": {
|
|
50
|
+
types: "./dist/human-in-the-loop/index.d.ts",
|
|
51
|
+
default: "./dist/human-in-the-loop/index.js"
|
|
52
|
+
},
|
|
53
|
+
"./types": {
|
|
54
|
+
types: "./dist/types.d.ts"
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
bin: {
|
|
58
|
+
"local-mcp": "dist/modelcontextprotocol/local-server.js"
|
|
59
|
+
},
|
|
60
|
+
files: [
|
|
61
|
+
"dist"
|
|
62
|
+
],
|
|
63
|
+
dependencies: {
|
|
64
|
+
"@knocklabs/mgmt": "^0.2.0",
|
|
65
|
+
"@knocklabs/node": "^1.10.3",
|
|
66
|
+
"@modelcontextprotocol/sdk": "^1.7.0",
|
|
67
|
+
"json-schema-to-zod": "^2.6.1",
|
|
68
|
+
uuid: "^11.1.0",
|
|
69
|
+
yargs: "^17.7.2",
|
|
70
|
+
zod: "^3.24.2",
|
|
71
|
+
"zod-to-json-schema": "^3.24.5"
|
|
72
|
+
},
|
|
73
|
+
devDependencies: {
|
|
74
|
+
"@changesets/cli": "^2.28.1",
|
|
75
|
+
"@eslint/js": "^9.24.0",
|
|
76
|
+
"@langchain/core": "^0.3.45",
|
|
77
|
+
"@types/node": "^22.13.10",
|
|
78
|
+
"@types/yargs": "^17.0.33",
|
|
79
|
+
"@typescript-eslint/eslint-plugin": "^8.29.1",
|
|
80
|
+
"@typescript-eslint/parser": "^8.29.1",
|
|
81
|
+
ai: "^4.2.8",
|
|
82
|
+
eslint: "^9.24.0",
|
|
83
|
+
"eslint-config-prettier": "^10.1.2",
|
|
84
|
+
"eslint-import-resolver-typescript": "^4.3.2",
|
|
85
|
+
"eslint-plugin-import": "^2.31.0",
|
|
86
|
+
"eslint-plugin-prettier": "^5.2.6",
|
|
87
|
+
openai: "^4.90.0",
|
|
88
|
+
prettier: "^3.5.3",
|
|
89
|
+
rimraf: "^6.0.1",
|
|
90
|
+
"ts-node": "^10.9.2",
|
|
91
|
+
tsup: "^8.4.0",
|
|
92
|
+
typescript: "^5.8.2",
|
|
93
|
+
"typescript-eslint": "^8.29.1",
|
|
94
|
+
vitest: "^1.3.1"
|
|
95
|
+
},
|
|
96
|
+
peerDependencies: {
|
|
97
|
+
ai: "^4.0.0",
|
|
98
|
+
openai: "^4.0.0",
|
|
99
|
+
"@mastra/core": "^0.10.3"
|
|
100
|
+
},
|
|
101
|
+
peerDependenciesMeta: {
|
|
102
|
+
ai: {
|
|
103
|
+
optional: true
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
engines: {
|
|
107
|
+
node: ">=20"
|
|
108
|
+
},
|
|
109
|
+
publishConfig: {
|
|
110
|
+
access: "public"
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// src/lib/knock-client.ts
|
|
115
|
+
var serviceTokensToApiClients = {};
|
|
116
|
+
var knockClientHeaders = {
|
|
117
|
+
"X-Knock-Client": `knock/agent-toolkit@${package_default.version}`
|
|
118
|
+
};
|
|
119
|
+
var createKnockClient = (config) => {
|
|
120
|
+
const serviceToken = config.serviceToken ?? process.env.KNOCK_SERVICE_TOKEN;
|
|
121
|
+
if (!serviceToken) {
|
|
122
|
+
throw new Error(
|
|
123
|
+
"Service token is required. Please set the `serviceToken` property in the config or the `KNOCK_SERVICE_TOKEN` environment variable."
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
const client = new KnockMgmt({
|
|
127
|
+
serviceToken,
|
|
128
|
+
defaultHeaders: knockClientHeaders
|
|
129
|
+
});
|
|
130
|
+
return Object.assign(client, {
|
|
131
|
+
publicApi: async (environmentSlug) => {
|
|
132
|
+
const environment = environmentSlug ?? config.environment ?? "development";
|
|
133
|
+
if (serviceTokensToApiClients?.[serviceToken]?.[environment]) {
|
|
134
|
+
return serviceTokensToApiClients[serviceToken][environment];
|
|
135
|
+
}
|
|
136
|
+
const { api_key } = await client.apiKeys.exchange({ environment });
|
|
137
|
+
const knock = new Knock({
|
|
138
|
+
apiKey: api_key,
|
|
139
|
+
defaultHeaders: knockClientHeaders
|
|
140
|
+
});
|
|
141
|
+
if (!serviceTokensToApiClients[serviceToken]) {
|
|
142
|
+
serviceTokensToApiClients[serviceToken] = {};
|
|
143
|
+
}
|
|
144
|
+
serviceTokensToApiClients[serviceToken][environment] = knock;
|
|
145
|
+
return knock;
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
export {
|
|
151
|
+
createKnockClient
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=chunk-YKYMGKIV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/knock-client.ts","../package.json"],"sourcesContent":["import KnockMgmt from \"@knocklabs/mgmt\";\nimport { Knock } from \"@knocklabs/node\";\n\nimport pkg from \"../../package.json\";\nimport { Config } from \"../types.js\";\n\nconst serviceTokensToApiClients: Record<string, Record<string, Knock>> = {};\n\ntype KnockClient = ReturnType<typeof createKnockClient>;\n\n// Include a custom header to identify all client requests in the API logs\nconst knockClientHeaders = {\n \"X-Knock-Client\": `knock/agent-toolkit@${pkg.version}`,\n};\n\nconst createKnockClient = (config: Config) => {\n const serviceToken = config.serviceToken ?? process.env.KNOCK_SERVICE_TOKEN;\n\n if (!serviceToken) {\n throw new Error(\n \"Service token is required. Please set the `serviceToken` property in the config or the `KNOCK_SERVICE_TOKEN` environment variable.\"\n );\n }\n\n const client = new KnockMgmt({\n serviceToken,\n defaultHeaders: knockClientHeaders,\n });\n\n return Object.assign(client, {\n publicApi: async (environmentSlug?: string): Promise<Knock> => {\n const environment =\n environmentSlug ?? config.environment ?? \"development\";\n\n // If the client already exists for this service token and environment, return it\n if (serviceTokensToApiClients?.[serviceToken]?.[environment]) {\n return serviceTokensToApiClients[serviceToken][environment];\n }\n\n // Otherwise, fetch a public API key for this service token and environment\n const { api_key } = await client.apiKeys.exchange({ environment });\n\n // Create a new Knock client with the public API key\n const knock = new Knock({\n apiKey: api_key,\n defaultHeaders: knockClientHeaders,\n });\n\n // Store the client in the cache\n if (!serviceTokensToApiClients[serviceToken]) {\n serviceTokensToApiClients[serviceToken] = {};\n }\n\n serviceTokensToApiClients[serviceToken][environment] = knock;\n\n return knock;\n },\n });\n};\n\nexport { createKnockClient, type KnockClient };\n","{\n \"name\": \"@knocklabs/agent-toolkit\",\n \"version\": \"0.3.0\",\n \"description\": \"A toolkit for working with Knock in Agent workflows.\",\n \"main\": \"src/index.js\",\n \"scripts\": {\n \"build\": \"tsup --env.NODE_ENV production\",\n \"clean\": \"rimraf ./dist\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint src --ext .ts,.tsx\",\n \"lint:fix\": \"eslint src --ext .ts,.tsx --fix\",\n \"format\": \"prettier --write \\\"src/**/*.{ts,tsx}\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.{ts,tsx}\\\"\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"release\": \"npm run build && npm run release:publish && changeset tag\",\n \"release:publish\": \"npm publish --access public --tolerate-republish\"\n },\n \"author\": \"Knock\",\n \"license\": \"MIT\",\n \"sideEffects\": false,\n \"type\": \"module\",\n \"exports\": {\n \"./openai\": {\n \"types\": \"./dist/openai/index.d.ts\",\n \"default\": \"./dist/openai/index.js\"\n },\n \"./ai-sdk\": {\n \"types\": \"./dist/ai-sdk/index.d.ts\",\n \"default\": \"./dist/ai-sdk/index.js\"\n },\n \"./langchain\": {\n \"types\": \"./dist/langchain/index.d.ts\",\n \"default\": \"./dist/langchain/index.js\"\n },\n \"./mastra\": {\n \"types\": \"./dist/mastra/index.d.ts\",\n \"default\": \"./dist/mastra/index.js\"\n },\n \"./modelcontextprotocol\": {\n \"types\": \"./dist/modelcontextprotocol/index.d.ts\",\n \"default\": \"./dist/modelcontextprotocol/index.js\"\n },\n \"./human-in-the-loop\": {\n \"types\": \"./dist/human-in-the-loop/index.d.ts\",\n \"default\": \"./dist/human-in-the-loop/index.js\"\n },\n \"./types\": {\n \"types\": \"./dist/types.d.ts\"\n }\n },\n \"bin\": {\n \"local-mcp\": \"dist/modelcontextprotocol/local-server.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"dependencies\": {\n \"@knocklabs/mgmt\": \"^0.2.0\",\n \"@knocklabs/node\": \"^1.10.3\",\n \"@modelcontextprotocol/sdk\": \"^1.7.0\",\n \"json-schema-to-zod\": \"^2.6.1\",\n \"uuid\": \"^11.1.0\",\n \"yargs\": \"^17.7.2\",\n \"zod\": \"^3.24.2\",\n \"zod-to-json-schema\": \"^3.24.5\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.28.1\",\n \"@eslint/js\": \"^9.24.0\",\n \"@langchain/core\": \"^0.3.45\",\n \"@types/node\": \"^22.13.10\",\n \"@types/yargs\": \"^17.0.33\",\n \"@typescript-eslint/eslint-plugin\": \"^8.29.1\",\n \"@typescript-eslint/parser\": \"^8.29.1\",\n \"ai\": \"^4.2.8\",\n \"eslint\": \"^9.24.0\",\n \"eslint-config-prettier\": \"^10.1.2\",\n \"eslint-import-resolver-typescript\": \"^4.3.2\",\n \"eslint-plugin-import\": \"^2.31.0\",\n \"eslint-plugin-prettier\": \"^5.2.6\",\n \"openai\": \"^4.90.0\",\n \"prettier\": \"^3.5.3\",\n \"rimraf\": \"^6.0.1\",\n \"ts-node\": \"^10.9.2\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.8.2\",\n \"typescript-eslint\": \"^8.29.1\",\n \"vitest\": \"^1.3.1\"\n },\n \"peerDependencies\": {\n \"ai\": \"^4.0.0\",\n \"openai\": \"^4.0.0\",\n \"@mastra/core\": \"^0.10.3\"\n },\n \"peerDependenciesMeta\": {\n \"ai\": {\n \"optional\": true\n }\n },\n \"engines\": {\n \"node\": \">=20\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n"],"mappings":"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","names":[]}
|