@silkweave/core 1.3.0 → 1.3.2

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.
@@ -1,18 +1,17 @@
1
-
2
- 
3
- > @silkweave/core@1.3.0 build /Users/atomic/projects/ai/silkweave/packages/core
4
- > tsup
5
-
6
- CLI Building entry: src/index.ts
7
- CLI Using tsconfig: tsconfig.json
8
- CLI tsup v8.5.1
9
- CLI Using tsup config: /Users/atomic/projects/ai/silkweave/packages/core/tsup.config.ts
10
- CLI Target: node18
11
- CLI Cleaning output folder
12
- ESM Build start
13
- ESM build/index.js 2.88 KB
14
- ESM build/index.js.map 7.19 KB
15
- ESM ⚡️ Build success in 6ms
16
- DTS Build start
17
- DTS ⚡️ Build success in 602ms
18
- DTS build/index.d.ts 2.54 KB
1
+
2
+ > @silkweave/core@1.3.1 build /Users/atomic/projects/ai/silkweave/packages/core
3
+ > tsup
4
+
5
+ CLI Building entry: src/index.ts
6
+ CLI Using tsconfig: tsconfig.json
7
+ CLI tsup v8.5.1
8
+ CLI Using tsup config: /Users/atomic/projects/ai/silkweave/packages/core/tsup.config.ts
9
+ CLI Target: node18
10
+ CLI Cleaning output folder
11
+ ESM Build start
12
+ ESM build/index.js 3.75 KB
13
+ ESM build/index.js.map 8.58 KB
14
+ ESM ⚡️ Build success in 7ms
15
+ DTS Build start
16
+ DTS ⚡️ Build success in 673ms
17
+ DTS build/index.d.ts 2.88 KB
@@ -1,13 +1,13 @@
1
1
 
2
2
  
3
- > @silkweave/core@1.3.0 check /Users/atomic/projects/ai/silkweave/packages/core
3
+ > @silkweave/core@1.3.1 check /Users/atomic/projects/ai/silkweave/packages/core
4
4
  > pnpm lint && pnpm typecheck
5
5
 
6
6
 
7
- > @silkweave/core@1.3.0 lint /Users/atomic/projects/ai/silkweave/packages/core
7
+ > @silkweave/core@1.3.1 lint /Users/atomic/projects/ai/silkweave/packages/core
8
8
  > eslint
9
9
 
10
10
 
11
- > @silkweave/core@1.3.0 typecheck /Users/atomic/projects/ai/silkweave/packages/core
11
+ > @silkweave/core@1.3.1 typecheck /Users/atomic/projects/ai/silkweave/packages/core
12
12
  > tsc --noEmit
13
13
 
@@ -1,13 +1,5 @@
1
1
 
2
2
  
3
- > @silkweave/core@1.3.0 lint /Users/atomic/projects/ai/silkweave/packages/core
3
+ > @silkweave/core@1.3.1 lint /Users/atomic/projects/ai/silkweave/packages/core
4
4
  > eslint
5
5
 
6
- 
7
- /Users/atomic/projects/ai/silkweave/packages/core/src/index.ts
8
- 8:1 error Too many blank lines at the end of file. Max of 0 allowed @stylistic/no-multiple-empty-lines
9
-
10
- ✖ 1 problem (1 error, 0 warnings)
11
-  1 error and 0 warnings potentially fixable with the `--fix` option.
12
- 
13
-  ELIFECYCLE  Command failed with exit code 1.
@@ -1,26 +1,26 @@
1
1
 
2
2
  
3
- > @silkweave/core@1.3.0 prepack /Users/atomic/projects/ai/mcphero/packages/core
3
+ > @silkweave/core@1.3.0 prepack /Users/atomic/projects/ai/silkweave/packages/core
4
4
  > pnpm clean && pnpm build
5
5
 
6
6
 
7
- > @silkweave/core@1.3.0 clean /Users/atomic/projects/ai/mcphero/packages/core
7
+ > @silkweave/core@1.3.0 clean /Users/atomic/projects/ai/silkweave/packages/core
8
8
  > rimraf build
9
9
 
10
10
 
11
- > @silkweave/core@1.3.0 build /Users/atomic/projects/ai/mcphero/packages/core
11
+ > @silkweave/core@1.3.0 build /Users/atomic/projects/ai/silkweave/packages/core
12
12
  > tsup
13
13
 
14
14
  CLI Building entry: src/index.ts
15
15
  CLI Using tsconfig: tsconfig.json
16
16
  CLI tsup v8.5.1
17
- CLI Using tsup config: /Users/atomic/projects/ai/mcphero/packages/core/tsup.config.ts
17
+ CLI Using tsup config: /Users/atomic/projects/ai/silkweave/packages/core/tsup.config.ts
18
18
  CLI Target: node18
19
19
  CLI Cleaning output folder
20
20
  ESM Build start
21
- ESM build/index.js 2.88 KB
22
- ESM build/index.js.map 7.19 KB
23
- ESM ⚡️ Build success in 12ms
21
+ ESM build/index.js 3.27 KB
22
+ ESM build/index.js.map 7.72 KB
23
+ ESM ⚡️ Build success in 5ms
24
24
  DTS Build start
25
- DTS ⚡️ Build success in 587ms
26
- DTS build/index.d.ts 2.54 KB
25
+ DTS ⚡️ Build success in 609ms
26
+ DTS build/index.d.ts 2.80 KB
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @silkweave/core
2
2
 
3
- Core library for [Silkweave](https://github.com/atomicbi/silkweave) — the TypeScript toolkit for building MCP servers and CLI tools from a single set of Actions.
3
+ Core library for [Silkweave](https://github.com/silkweave/silkweave) — the TypeScript toolkit for building MCP servers and CLI tools from a single set of Actions.
4
4
 
5
5
  ## Install
6
6
 
@@ -16,8 +16,7 @@ This package provides the foundational building blocks that all Silkweave adapte
16
16
  - **`createAction()`** — Define transport-agnostic actions with Zod input schemas
17
17
  - **Adapter types** — `Adapter`, `AdapterGenerator`, `AdapterFactory` interfaces for building custom adapters
18
18
  - **Context** — `SilkweaveContext` key-value store with `fork()` for per-adapter/per-request isolation
19
- - **MCP utilities** — `toolResponse()`, `parseToolResponse()` for MCP response formatting
20
- - **Sideload resources** — `createSideloadResource()` for binary resource handling
19
+ - **MCP utilities** — `toolResponse()`, `handleToolError()`, `parseToolResponse()` for MCP response formatting
21
20
  - **Zod utilities** — `unwrap()` to recursively unwrap Zod wrapper types
22
21
 
23
22
  ## Usage
@@ -82,7 +81,7 @@ type AdapterFactory<T = void> = (options: T) => AdapterGenerator
82
81
 
83
82
  ## See Also
84
83
 
85
- - [Silkweave README](https://github.com/atomicbi/silkweave) — Full documentation
84
+ - [Silkweave README](https://github.com/silkweave/silkweave) — Full documentation
86
85
  - [`@silkweave/mcp`](https://www.npmjs.com/package/@silkweave/mcp) — MCP stdio and HTTP adapters
87
86
  - [`@silkweave/fastify`](https://www.npmjs.com/package/@silkweave/fastify) — Fastify REST adapter
88
87
  - [`@silkweave/cli`](https://www.npmjs.com/package/@silkweave/cli) — CLI adapter
package/build/index.d.ts CHANGED
@@ -5,6 +5,7 @@ interface SilkweaveContext {
5
5
  keys: () => string[];
6
6
  has: (key: string) => boolean;
7
7
  get: <T>(key: string) => T;
8
+ getOptional: <T>(key: string) => T | undefined;
8
9
  set: <T>(key: string, value: T) => void;
9
10
  fork: (store?: Record<string, unknown>) => SilkweaveContext;
10
11
  }
@@ -22,6 +23,11 @@ interface Action<I extends object = any, O extends object = any> {
22
23
  }
23
24
  declare function createAction<I extends object = object, O extends object = object>(action: Action<I, O>): Action<I, O>;
24
25
 
26
+ interface SilkweaveOptions {
27
+ name: string;
28
+ description: string;
29
+ version: string;
30
+ }
25
31
  interface Adapter {
26
32
  context: SilkweaveContext;
27
33
  start(actions: Action[]): Promise<void>;
@@ -30,11 +36,6 @@ interface Adapter {
30
36
  type AdapterGenerator = (options: SilkweaveOptions, baseContext: SilkweaveContext) => Adapter;
31
37
  type AdapterFactory<T = void> = (options: T) => AdapterGenerator;
32
38
 
33
- interface SilkweaveOptions {
34
- name: string;
35
- description: string;
36
- version: string;
37
- }
38
39
  interface Silkweave {
39
40
  set: <T>(key: string, value: T) => Silkweave;
40
41
  adapter: (generator: AdapterGenerator) => Silkweave;
@@ -44,21 +45,25 @@ interface Silkweave {
44
45
  }
45
46
  declare function silkweave(options: SilkweaveOptions): Silkweave;
46
47
 
48
+ declare class SilkweaveError extends Error {
49
+ readonly code: string;
50
+ readonly statusCode: number;
51
+ constructor(message: string, code: string, statusCode?: number);
52
+ }
53
+ declare function notFound(message?: string): SilkweaveError;
54
+ declare function badRequest(message?: string): SilkweaveError;
55
+ declare function forbidden(message?: string): SilkweaveError;
56
+ declare function internal(message?: string): SilkweaveError;
57
+
47
58
  interface ToolResponse {
48
59
  content: TextContent[];
60
+ isError?: boolean;
49
61
  [x: string]: unknown;
50
62
  }
51
- declare function toolResponse(data: object): ToolResponse;
63
+ declare function toolResponse(data: object, isError?: boolean): ToolResponse;
64
+ declare function handleToolError(error: unknown): ToolResponse;
52
65
  declare function parseToolResponse<T = unknown>(result: ToolResponse): T;
53
66
 
54
- interface SideloadResource {
55
- id: string;
56
- name: string;
57
- contentType: string;
58
- size: number;
59
- }
60
- declare function createSideloadResource(buffer: Buffer, { name, contentType }: Pick<SideloadResource, 'name' | 'contentType'>): Promise<SideloadResource>;
61
-
62
67
  interface UnwrapResult {
63
68
  defaultValue?: any;
64
69
  isOptional?: boolean;
@@ -67,4 +72,4 @@ interface UnwrapResult {
67
72
  }
68
73
  declare function unwrap(type: z$1.ZodTypeAny, result?: UnwrapResult): [z$1.ZodTypeAny, UnwrapResult];
69
74
 
70
- export { type Action, type Adapter, type AdapterFactory, type AdapterGenerator, type SideloadResource, type Silkweave, type SilkweaveContext, type SilkweaveOptions, type ToolResponse, type UnwrapResult, createAction, createContext, createSideloadResource, parseToolResponse, silkweave, toolResponse, unwrap };
75
+ export { type Action, type Adapter, type AdapterFactory, type AdapterGenerator, type Silkweave, type SilkweaveContext, SilkweaveError, type SilkweaveOptions, type ToolResponse, type UnwrapResult, badRequest, createAction, createContext, forbidden, handleToolError, internal, notFound, parseToolResponse, silkweave, toolResponse, unwrap };
package/build/index.js CHANGED
@@ -14,6 +14,9 @@ function createContext(store = {}) {
14
14
  }
15
15
  return value;
16
16
  },
17
+ getOptional: (key) => {
18
+ return store[key];
19
+ },
17
20
  set: (key, value) => {
18
21
  store[key] = value;
19
22
  },
@@ -65,30 +68,51 @@ function createAction(action) {
65
68
  return action;
66
69
  }
67
70
 
71
+ // src/util/error.ts
72
+ var SilkweaveError = class extends Error {
73
+ constructor(message, code, statusCode = 500) {
74
+ super(message);
75
+ this.code = code;
76
+ this.statusCode = statusCode;
77
+ this.name = "SilkweaveError";
78
+ }
79
+ code;
80
+ statusCode;
81
+ };
82
+ function notFound(message = "Not found") {
83
+ return new SilkweaveError(message, "not_found", 404);
84
+ }
85
+ function badRequest(message = "Bad request") {
86
+ return new SilkweaveError(message, "bad_request", 400);
87
+ }
88
+ function forbidden(message = "Forbidden") {
89
+ return new SilkweaveError(message, "forbidden", 403);
90
+ }
91
+ function internal(message = "Internal error") {
92
+ return new SilkweaveError(message, "internal", 500);
93
+ }
94
+
68
95
  // src/util/mcp.ts
69
- function toolResponse(data) {
96
+ function toolResponse(data, isError = false) {
70
97
  return {
71
- content: [{ type: "text", text: JSON.stringify(data, null, 2) }]
98
+ content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
99
+ ...isError ? { isError: true } : {}
72
100
  };
73
101
  }
102
+ function handleToolError(error) {
103
+ if (error instanceof SilkweaveError) {
104
+ return toolResponse({ success: false, code: error.code, name: error.name, message: error.message }, true);
105
+ } else if (error instanceof Error) {
106
+ return toolResponse({ success: false, name: error.name, message: error.message, stack: error.stack }, true);
107
+ } else {
108
+ return toolResponse({ success: false, name: "Unknown Error", message: "An unknown error occurred", error }, true);
109
+ }
110
+ }
74
111
  function parseToolResponse(result) {
75
112
  const text = result.content[0].text;
76
113
  return JSON.parse(text);
77
114
  }
78
115
 
79
- // src/util/sideload.ts
80
- import { randomUUID } from "crypto";
81
- import { writeFile } from "fs/promises";
82
- async function createSideloadResource(buffer, { name, contentType }) {
83
- const id = randomUUID();
84
- const resource = { id, name, contentType, size: buffer.length };
85
- await Promise.all([
86
- writeFile(`resources/${id}`, buffer),
87
- writeFile(`resources/${id}.json`, JSON.stringify(resource), "utf-8")
88
- ]);
89
- return resource;
90
- }
91
-
92
116
  // src/util/zod.ts
93
117
  import { z } from "zod";
94
118
  function unwrap(type, result = {}) {
@@ -109,9 +133,14 @@ function unwrap(type, result = {}) {
109
133
  }
110
134
  }
111
135
  export {
136
+ SilkweaveError,
137
+ badRequest,
112
138
  createAction,
113
139
  createContext,
114
- createSideloadResource,
140
+ forbidden,
141
+ handleToolError,
142
+ internal,
143
+ notFound,
115
144
  parseToolResponse,
116
145
  silkweave,
117
146
  toolResponse,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/util/context.ts","../src/lib/silkweave.ts","../src/util/action.ts","../src/util/mcp.ts","../src/util/sideload.ts","../src/util/zod.ts"],"sourcesContent":["export interface SilkweaveContext {\n keys: () => string[]\n has: (key: string) => boolean\n get: <T>(key: string) => T\n set: <T>(key: string, value: T) => void\n fork: (store?: Record<string, unknown>) => SilkweaveContext\n}\n\nexport function createContext(store: Record<string, unknown> = {}): SilkweaveContext {\n return {\n keys: () => {\n return Object.keys(store)\n },\n has: (key: string): boolean => {\n return store[key] != null\n },\n get: <T>(key: string): T => {\n const value = store[key]\n if (value == null) { throw new Error(`Invalid context key: ${key}`) }\n return value as T\n },\n set: <T>(key: string, value: T) => {\n store[key] = value\n },\n fork: (value?: Record<string, unknown>) => {\n return createContext({ ...store, ...value })\n }\n }\n}\n","import { Action } from '../util/action.js'\nimport { Adapter, AdapterGenerator } from '../util/adapter.js'\nimport { createContext } from '../util/context.js'\n\nexport interface SilkweaveOptions {\n name: string\n description: string\n version: string\n}\n\nexport interface Silkweave {\n set: <T>(key: string, value: T) => Silkweave\n adapter: (generator: AdapterGenerator) => Silkweave\n action: (action: Action) => Silkweave\n actions: (actions: Action[]) => Silkweave\n start: () => Promise<Silkweave>\n}\n\nexport function silkweave(options: SilkweaveOptions): Silkweave {\n const adapters: Adapter[] = []\n const actions: Action[] = []\n const context = createContext()\n const builder: Silkweave = {\n set: (key, value) => {\n context.set(key, value)\n return builder\n },\n adapter: (generator) => {\n adapters.push(generator(options, context))\n return builder\n },\n action: (value) => {\n actions.push(value)\n return builder\n },\n actions: (values) => {\n actions.push(...values)\n return builder\n },\n start: async () => {\n await Promise.all(adapters.map((adapter) => {\n return adapter.start(actions.filter((action) => {\n if (!action.isEnabled) { return true }\n return action.isEnabled(adapter.context)\n }))\n }))\n return builder\n }\n }\n return builder\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport z from 'zod'\nimport { SilkweaveContext } from './context.js'\n\nexport interface Action<I extends object = any, O extends object = any> {\n name: string\n description: string\n input: z.ZodType<I> & { shape: Record<string, z.ZodTypeAny> }\n args?: (keyof I)[]\n isEnabled?: (context: SilkweaveContext) => boolean\n run: (input: I, context: SilkweaveContext) => Promise<O>\n}\n\nexport function createAction<I extends object = object, O extends object = object>(\n action: Action<I, O>\n): Action<I, O> {\n return action\n}\n","import { TextContent } from '@modelcontextprotocol/sdk/types.js'\n\nexport interface ToolResponse {\n content: TextContent[]\n [x: string]: unknown\n}\n\nexport function toolResponse(data: object): ToolResponse {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }]\n }\n}\n\nexport function parseToolResponse<T = unknown>(result: ToolResponse): T {\n const text = result.content[0].text\n return JSON.parse(text)\n}\n","import { randomUUID } from 'crypto'\nimport { writeFile } from 'fs/promises'\n\nexport interface SideloadResource {\n id: string\n name: string\n contentType: string\n size: number\n}\n\nexport async function createSideloadResource(buffer: Buffer, { name, contentType }: Pick<SideloadResource, 'name' | 'contentType'>) {\n const id = randomUUID()\n const resource: SideloadResource = { id, name, contentType, size: buffer.length }\n await Promise.all([\n writeFile(`resources/${id}`, buffer),\n writeFile(`resources/${id}.json`, JSON.stringify(resource), 'utf-8')\n ])\n return resource\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { z } from 'zod'\n\nexport interface UnwrapResult {\n defaultValue?: any\n isOptional?: boolean\n isNullable?: boolean\n isReadOnly?: boolean\n}\n\nexport function unwrap(\n type: z.ZodTypeAny,\n result: UnwrapResult = {}\n): [z.ZodTypeAny, UnwrapResult] {\n if (type instanceof z.ZodOptional) {\n result.isOptional = true\n return unwrap(type.unwrap() as z.ZodTypeAny, result)\n } else if (type instanceof z.ZodNullable) {\n result.isNullable = true\n return unwrap(type.unwrap() as z.ZodTypeAny, result)\n } else if (type instanceof z.ZodReadonly) {\n result.isReadOnly = true\n return unwrap(type.unwrap() as z.ZodTypeAny, result)\n } else if (type instanceof z.ZodDefault) {\n result.defaultValue = typeof type.def.defaultValue === 'function'\n ? type.def.defaultValue()\n : type.def.defaultValue\n return unwrap(type.unwrap() as z.ZodTypeAny, result)\n } else {\n return [type, result]\n }\n}\n"],"mappings":";AAQO,SAAS,cAAc,QAAiC,CAAC,GAAqB;AACnF,SAAO;AAAA,IACL,MAAM,MAAM;AACV,aAAO,OAAO,KAAK,KAAK;AAAA,IAC1B;AAAA,IACA,KAAK,CAAC,QAAyB;AAC7B,aAAO,MAAM,GAAG,KAAK;AAAA,IACvB;AAAA,IACA,KAAK,CAAI,QAAmB;AAC1B,YAAM,QAAQ,MAAM,GAAG;AACvB,UAAI,SAAS,MAAM;AAAE,cAAM,IAAI,MAAM,wBAAwB,GAAG,EAAE;AAAA,MAAE;AACpE,aAAO;AAAA,IACT;AAAA,IACA,KAAK,CAAI,KAAa,UAAa;AACjC,YAAM,GAAG,IAAI;AAAA,IACf;AAAA,IACA,MAAM,CAAC,UAAoC;AACzC,aAAO,cAAc,EAAE,GAAG,OAAO,GAAG,MAAM,CAAC;AAAA,IAC7C;AAAA,EACF;AACF;;;ACVO,SAAS,UAAU,SAAsC;AAC9D,QAAM,WAAsB,CAAC;AAC7B,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAU,cAAc;AAC9B,QAAM,UAAqB;AAAA,IACzB,KAAK,CAAC,KAAK,UAAU;AACnB,cAAQ,IAAI,KAAK,KAAK;AACtB,aAAO;AAAA,IACT;AAAA,IACA,SAAS,CAAC,cAAc;AACtB,eAAS,KAAK,UAAU,SAAS,OAAO,CAAC;AACzC,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,CAAC,UAAU;AACjB,cAAQ,KAAK,KAAK;AAClB,aAAO;AAAA,IACT;AAAA,IACA,SAAS,CAAC,WAAW;AACnB,cAAQ,KAAK,GAAG,MAAM;AACtB,aAAO;AAAA,IACT;AAAA,IACA,OAAO,YAAY;AACjB,YAAM,QAAQ,IAAI,SAAS,IAAI,CAAC,YAAY;AAC1C,eAAO,QAAQ,MAAM,QAAQ,OAAO,CAAC,WAAW;AAC9C,cAAI,CAAC,OAAO,WAAW;AAAE,mBAAO;AAAA,UAAK;AACrC,iBAAO,OAAO,UAAU,QAAQ,OAAO;AAAA,QACzC,CAAC,CAAC;AAAA,MACJ,CAAC,CAAC;AACF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;;;ACrCO,SAAS,aACd,QACc;AACd,SAAO;AACT;;;ACVO,SAAS,aAAa,MAA4B;AACvD,SAAO;AAAA,IACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,EAC1E;AACF;AAEO,SAAS,kBAA+B,QAAyB;AACtE,QAAM,OAAO,OAAO,QAAQ,CAAC,EAAE;AAC/B,SAAO,KAAK,MAAM,IAAI;AACxB;;;AChBA,SAAS,kBAAkB;AAC3B,SAAS,iBAAiB;AAS1B,eAAsB,uBAAuB,QAAgB,EAAE,MAAM,YAAY,GAAmD;AAClI,QAAM,KAAK,WAAW;AACtB,QAAM,WAA6B,EAAE,IAAI,MAAM,aAAa,MAAM,OAAO,OAAO;AAChF,QAAM,QAAQ,IAAI;AAAA,IAChB,UAAU,aAAa,EAAE,IAAI,MAAM;AAAA,IACnC,UAAU,aAAa,EAAE,SAAS,KAAK,UAAU,QAAQ,GAAG,OAAO;AAAA,EACrE,CAAC;AACD,SAAO;AACT;;;ACjBA,SAAS,SAAS;AASX,SAAS,OACd,MACA,SAAuB,CAAC,GACM;AAC9B,MAAI,gBAAgB,EAAE,aAAa;AACjC,WAAO,aAAa;AACpB,WAAO,OAAO,KAAK,OAAO,GAAmB,MAAM;AAAA,EACrD,WAAW,gBAAgB,EAAE,aAAa;AACxC,WAAO,aAAa;AACpB,WAAO,OAAO,KAAK,OAAO,GAAmB,MAAM;AAAA,EACrD,WAAW,gBAAgB,EAAE,aAAa;AACxC,WAAO,aAAa;AACpB,WAAO,OAAO,KAAK,OAAO,GAAmB,MAAM;AAAA,EACrD,WAAW,gBAAgB,EAAE,YAAY;AACvC,WAAO,eAAe,OAAO,KAAK,IAAI,iBAAiB,aACnD,KAAK,IAAI,aAAa,IACtB,KAAK,IAAI;AACb,WAAO,OAAO,KAAK,OAAO,GAAmB,MAAM;AAAA,EACrD,OAAO;AACL,WAAO,CAAC,MAAM,MAAM;AAAA,EACtB;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/util/context.ts","../src/lib/silkweave.ts","../src/util/action.ts","../src/util/error.ts","../src/util/mcp.ts","../src/util/zod.ts"],"sourcesContent":["export interface SilkweaveContext {\n keys: () => string[]\n has: (key: string) => boolean\n get: <T>(key: string) => T\n getOptional: <T>(key: string) => T | undefined\n set: <T>(key: string, value: T) => void\n fork: (store?: Record<string, unknown>) => SilkweaveContext\n}\n\nexport function createContext(store: Record<string, unknown> = {}): SilkweaveContext {\n return {\n keys: () => {\n return Object.keys(store)\n },\n has: (key: string): boolean => {\n return store[key] != null\n },\n get: <T>(key: string): T => {\n const value = store[key]\n if (value == null) { throw new Error(`Invalid context key: ${key}`) }\n return value as T\n },\n getOptional: <T>(key: string): T | undefined => {\n return store[key] as T | undefined\n },\n set: <T>(key: string, value: T) => {\n store[key] = value\n },\n fork: (value?: Record<string, unknown>) => {\n return createContext({ ...store, ...value })\n }\n }\n}\n","import { Action } from '../util/action.js'\nimport { Adapter, AdapterGenerator, SilkweaveOptions } from '../util/adapter.js'\nimport { createContext } from '../util/context.js'\n\nexport type { SilkweaveOptions } from '../util/adapter.js'\n\nexport interface Silkweave {\n set: <T>(key: string, value: T) => Silkweave\n adapter: (generator: AdapterGenerator) => Silkweave\n action: (action: Action) => Silkweave\n actions: (actions: Action[]) => Silkweave\n start: () => Promise<Silkweave>\n}\n\nexport function silkweave(options: SilkweaveOptions): Silkweave {\n const adapters: Adapter[] = []\n const actions: Action[] = []\n const context = createContext()\n const builder: Silkweave = {\n set: (key, value) => {\n context.set(key, value)\n return builder\n },\n adapter: (generator) => {\n adapters.push(generator(options, context))\n return builder\n },\n action: (value) => {\n actions.push(value)\n return builder\n },\n actions: (values) => {\n actions.push(...values)\n return builder\n },\n start: async () => {\n await Promise.all(adapters.map((adapter) => {\n return adapter.start(actions.filter((action) => {\n if (!action.isEnabled) { return true }\n return action.isEnabled(adapter.context)\n }))\n }))\n return builder\n }\n }\n return builder\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport z from 'zod'\nimport { SilkweaveContext } from './context.js'\n\nexport interface Action<I extends object = any, O extends object = any> {\n name: string\n description: string\n input: z.ZodType<I> & { shape: Record<string, z.ZodTypeAny> }\n args?: (keyof I)[]\n isEnabled?: (context: SilkweaveContext) => boolean\n run: (input: I, context: SilkweaveContext) => Promise<O>\n}\n\nexport function createAction<I extends object = object, O extends object = object>(\n action: Action<I, O>\n): Action<I, O> {\n return action\n}\n","export class SilkweaveError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly statusCode = 500\n ) {\n super(message)\n this.name = 'SilkweaveError'\n }\n}\n\nexport function notFound(message = 'Not found') {\n return new SilkweaveError(message, 'not_found', 404)\n}\n\nexport function badRequest(message = 'Bad request') {\n return new SilkweaveError(message, 'bad_request', 400)\n}\n\nexport function forbidden(message = 'Forbidden') {\n return new SilkweaveError(message, 'forbidden', 403)\n}\n\nexport function internal(message = 'Internal error') {\n return new SilkweaveError(message, 'internal', 500)\n}\n","import { TextContent } from '@modelcontextprotocol/sdk/types.js'\nimport { SilkweaveError } from './error.js'\n\nexport interface ToolResponse {\n content: TextContent[]\n isError?: boolean\n [x: string]: unknown\n}\n\nexport function toolResponse(data: object, isError = false): ToolResponse {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }],\n ...(isError ? { isError: true } : {})\n }\n}\n\nexport function handleToolError(error: unknown): ToolResponse {\n if (error instanceof SilkweaveError) {\n return toolResponse({ success: false, code: error.code, name: error.name, message: error.message }, true)\n } else if (error instanceof Error) {\n return toolResponse({ success: false, name: error.name, message: error.message, stack: error.stack }, true)\n } else {\n return toolResponse({ success: false, name: 'Unknown Error', message: 'An unknown error occurred', error }, true)\n }\n}\n\nexport function parseToolResponse<T = unknown>(result: ToolResponse): T {\n const text = result.content[0].text\n return JSON.parse(text)\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { z } from 'zod'\n\nexport interface UnwrapResult {\n defaultValue?: any\n isOptional?: boolean\n isNullable?: boolean\n isReadOnly?: boolean\n}\n\nexport function unwrap(\n type: z.ZodTypeAny,\n result: UnwrapResult = {}\n): [z.ZodTypeAny, UnwrapResult] {\n if (type instanceof z.ZodOptional) {\n result.isOptional = true\n return unwrap(type.unwrap() as z.ZodTypeAny, result)\n } else if (type instanceof z.ZodNullable) {\n result.isNullable = true\n return unwrap(type.unwrap() as z.ZodTypeAny, result)\n } else if (type instanceof z.ZodReadonly) {\n result.isReadOnly = true\n return unwrap(type.unwrap() as z.ZodTypeAny, result)\n } else if (type instanceof z.ZodDefault) {\n result.defaultValue = typeof type.def.defaultValue === 'function'\n ? type.def.defaultValue()\n : type.def.defaultValue\n return unwrap(type.unwrap() as z.ZodTypeAny, result)\n } else {\n return [type, result]\n }\n}\n"],"mappings":";AASO,SAAS,cAAc,QAAiC,CAAC,GAAqB;AACnF,SAAO;AAAA,IACL,MAAM,MAAM;AACV,aAAO,OAAO,KAAK,KAAK;AAAA,IAC1B;AAAA,IACA,KAAK,CAAC,QAAyB;AAC7B,aAAO,MAAM,GAAG,KAAK;AAAA,IACvB;AAAA,IACA,KAAK,CAAI,QAAmB;AAC1B,YAAM,QAAQ,MAAM,GAAG;AACvB,UAAI,SAAS,MAAM;AAAE,cAAM,IAAI,MAAM,wBAAwB,GAAG,EAAE;AAAA,MAAE;AACpE,aAAO;AAAA,IACT;AAAA,IACA,aAAa,CAAI,QAA+B;AAC9C,aAAO,MAAM,GAAG;AAAA,IAClB;AAAA,IACA,KAAK,CAAI,KAAa,UAAa;AACjC,YAAM,GAAG,IAAI;AAAA,IACf;AAAA,IACA,MAAM,CAAC,UAAoC;AACzC,aAAO,cAAc,EAAE,GAAG,OAAO,GAAG,MAAM,CAAC;AAAA,IAC7C;AAAA,EACF;AACF;;;AClBO,SAAS,UAAU,SAAsC;AAC9D,QAAM,WAAsB,CAAC;AAC7B,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAU,cAAc;AAC9B,QAAM,UAAqB;AAAA,IACzB,KAAK,CAAC,KAAK,UAAU;AACnB,cAAQ,IAAI,KAAK,KAAK;AACtB,aAAO;AAAA,IACT;AAAA,IACA,SAAS,CAAC,cAAc;AACtB,eAAS,KAAK,UAAU,SAAS,OAAO,CAAC;AACzC,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,CAAC,UAAU;AACjB,cAAQ,KAAK,KAAK;AAClB,aAAO;AAAA,IACT;AAAA,IACA,SAAS,CAAC,WAAW;AACnB,cAAQ,KAAK,GAAG,MAAM;AACtB,aAAO;AAAA,IACT;AAAA,IACA,OAAO,YAAY;AACjB,YAAM,QAAQ,IAAI,SAAS,IAAI,CAAC,YAAY;AAC1C,eAAO,QAAQ,MAAM,QAAQ,OAAO,CAAC,WAAW;AAC9C,cAAI,CAAC,OAAO,WAAW;AAAE,mBAAO;AAAA,UAAK;AACrC,iBAAO,OAAO,UAAU,QAAQ,OAAO;AAAA,QACzC,CAAC,CAAC;AAAA,MACJ,CAAC,CAAC;AACF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;;;ACjCO,SAAS,aACd,QACc;AACd,SAAO;AACT;;;ACjBO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YACE,SACgB,MACA,aAAa,KAC7B;AACA,UAAM,OAAO;AAHG;AACA;AAGhB,SAAK,OAAO;AAAA,EACd;AAAA,EALkB;AAAA,EACA;AAKpB;AAEO,SAAS,SAAS,UAAU,aAAa;AAC9C,SAAO,IAAI,eAAe,SAAS,aAAa,GAAG;AACrD;AAEO,SAAS,WAAW,UAAU,eAAe;AAClD,SAAO,IAAI,eAAe,SAAS,eAAe,GAAG;AACvD;AAEO,SAAS,UAAU,UAAU,aAAa;AAC/C,SAAO,IAAI,eAAe,SAAS,aAAa,GAAG;AACrD;AAEO,SAAS,SAAS,UAAU,kBAAkB;AACnD,SAAO,IAAI,eAAe,SAAS,YAAY,GAAG;AACpD;;;AChBO,SAAS,aAAa,MAAc,UAAU,OAAqB;AACxE,SAAO;AAAA,IACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,IACxE,GAAI,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,EACrC;AACF;AAEO,SAAS,gBAAgB,OAA8B;AAC5D,MAAI,iBAAiB,gBAAgB;AACnC,WAAO,aAAa,EAAE,SAAS,OAAO,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,SAAS,MAAM,QAAQ,GAAG,IAAI;AAAA,EAC1G,WAAW,iBAAiB,OAAO;AACjC,WAAO,aAAa,EAAE,SAAS,OAAO,MAAM,MAAM,MAAM,SAAS,MAAM,SAAS,OAAO,MAAM,MAAM,GAAG,IAAI;AAAA,EAC5G,OAAO;AACL,WAAO,aAAa,EAAE,SAAS,OAAO,MAAM,iBAAiB,SAAS,6BAA6B,MAAM,GAAG,IAAI;AAAA,EAClH;AACF;AAEO,SAAS,kBAA+B,QAAyB;AACtE,QAAM,OAAO,OAAO,QAAQ,CAAC,EAAE;AAC/B,SAAO,KAAK,MAAM,IAAI;AACxB;;;AC5BA,SAAS,SAAS;AASX,SAAS,OACd,MACA,SAAuB,CAAC,GACM;AAC9B,MAAI,gBAAgB,EAAE,aAAa;AACjC,WAAO,aAAa;AACpB,WAAO,OAAO,KAAK,OAAO,GAAmB,MAAM;AAAA,EACrD,WAAW,gBAAgB,EAAE,aAAa;AACxC,WAAO,aAAa;AACpB,WAAO,OAAO,KAAK,OAAO,GAAmB,MAAM;AAAA,EACrD,WAAW,gBAAgB,EAAE,aAAa;AACxC,WAAO,aAAa;AACpB,WAAO,OAAO,KAAK,OAAO,GAAmB,MAAM;AAAA,EACrD,WAAW,gBAAgB,EAAE,YAAY;AACvC,WAAO,eAAe,OAAO,KAAK,IAAI,iBAAiB,aACnD,KAAK,IAAI,aAAa,IACtB,KAAK,IAAI;AACb,WAAO,OAAO,KAAK,OAAO,GAAmB,MAAM;AAAA,EACrD,OAAO;AACL,WAAO,CAAC,MAAM,MAAM;AAAA,EACtB;AACF;","names":[]}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@silkweave/core",
3
- "version": "1.3.0",
3
+ "version": "1.3.2",
4
4
  "description": "Silkweave Core",
5
5
  "repository": {
6
6
  "type": "git",
7
- "url": "git+ssh://git@github.com/atomicbi/silkweave.git",
7
+ "url": "git+ssh://git@github.com/silkweave/silkweave.git",
8
8
  "directory": "packages/core"
9
9
  },
10
10
  "type": "module",
@@ -13,7 +13,7 @@
13
13
  "dependencies": {
14
14
  "@modelcontextprotocol/sdk": "^1.29.0",
15
15
  "zod": "^4.3.6",
16
- "@silkweave/logger": "1.3.0"
16
+ "@silkweave/logger": "1.3.2"
17
17
  },
18
18
  "devDependencies": {
19
19
  "@eslint/js": "^10.0.1",