@waniwani/sdk 0.1.20-beta.27 → 0.1.20-beta.28

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,38 +1,9 @@
1
- interface Chunk {
2
- id: string;
3
- source: string;
4
- heading: string;
5
- content: string;
6
- embedding: number[];
7
- }
8
- interface EmbeddingsFile {
9
- model: string;
10
- dimensions?: number;
11
- generatedAt: string;
12
- chunks: Chunk[];
13
- }
14
1
  interface SearchResult {
15
2
  source: string;
16
3
  heading: string;
17
4
  content: string;
18
5
  score: number;
19
6
  }
20
- interface GenerateEmbeddingsOptions {
21
- /** Directory containing .md files to embed */
22
- knowledgeDir: string;
23
- /** Output path for embeddings.json */
24
- outputPath: string;
25
- /** Embedding model string (default: "openai/text-embedding-3-small") */
26
- model?: string;
27
- /** Embedding dimensions (default: 512) */
28
- dimensions?: number;
29
- }
30
- interface KnowledgeBase {
31
- /** Search the knowledge base for relevant chunks */
32
- search(query: string, topK?: number): Promise<SearchResult[]>;
33
- /** Number of chunks in the knowledge base */
34
- readonly chunkCount: number;
35
- }
36
7
  /** A file to ingest into the knowledge base */
37
8
  interface KbIngestFile {
38
9
  /** Filename (used as chunk source identifier) */
@@ -105,17 +76,4 @@ interface InternalConfig {
105
76
 
106
77
  declare function createKbClient(config: InternalConfig): KbClient;
107
78
 
108
- declare function chunkMarkdown(filename: string, content: string): Omit<Chunk, "embedding">[];
109
- declare function generateEmbeddings(options: GenerateEmbeddingsOptions): Promise<void>;
110
-
111
- /**
112
- * Create a knowledge base instance from pre-loaded embeddings data.
113
- *
114
- * ```typescript
115
- * import embeddings from "./embeddings.json";
116
- * const kb = loadKnowledgeBase(embeddings);
117
- * ```
118
- */
119
- declare function loadKnowledgeBase(source: EmbeddingsFile): KnowledgeBase;
120
-
121
- export { type Chunk, type EmbeddingsFile, type GenerateEmbeddingsOptions, type KbClient, type KbIngestFile, type KbIngestResult, type KbSearchOptions, type KbSource, type KnowledgeBase, type SearchResult, chunkMarkdown, createKbClient, generateEmbeddings, loadKnowledgeBase };
79
+ export { type KbClient, type KbIngestFile, type KbIngestResult, type KbSearchOptions, type KbSource, type SearchResult, createKbClient };
package/dist/kb/index.js CHANGED
@@ -1,11 +1,2 @@
1
- var g=class extends Error{constructor(a,i){super(a);this.status=i;this.name="WaniWaniError"}};var K="@waniwani/sdk";function k(o){let{baseUrl:c,apiKey:a}=o;function i(){if(!a)throw new Error("WANIWANI_API_KEY is not set");return a}async function u(t,n,r){let l=i(),s=`${c.replace(/\/$/,"")}${n}`,e={Authorization:`Bearer ${l}`,"X-WaniWani-SDK":K},m={method:t,headers:e};r!==void 0&&(e["Content-Type"]="application/json",m.body=JSON.stringify(r));let d=await fetch(s,m);if(!d.ok){let f=await d.text().catch(()=>"");throw new g(f||`KB API error: HTTP ${d.status}`,d.status)}return d.json()}return{async ingest(t){return u("POST","/api/mcp/kb/ingest",{files:t})},async search(t,n){return u("POST","/api/mcp/kb/search",{query:t,...n})},async sources(){return u("GET","/api/mcp/kb/sources")}}}import{readdir as w,readFile as y,writeFile as S}from"fs/promises";import{join as E}from"path";import{embedMany as $}from"ai";var O="openai/text-embedding-3-small",I=512;function b(o,c){let a=c.split(`
2
- `),i=[],t=c.match(/^# (.+)$/m)?.[1]??o.replace(".md",""),n=t,r=[],l=0;for(let e of a){if(e.match(/^# /))continue;let m=e.match(/^## (.+)$/);if(m){if(r.length>0){let d=r.join(`
3
- `).trim();d&&(i.push({id:`${o.replace(".md","")}#${l}`,source:o,heading:n,content:`${t}: ${n}
4
-
5
- ${d}`}),l++)}n=m[1],r=[]}else r.push(e)}let s=r.join(`
6
- `).trim();return s&&i.push({id:`${o.replace(".md","")}#${l}`,source:o,heading:n,content:`${t}: ${n}
7
-
8
- ${s}`}),i}async function C(o){let{knowledgeDir:c,outputPath:a,model:i=O,dimensions:u=I}=o,t=(await w(c)).filter(e=>e.endsWith(".md"));console.log(`Found ${t.length} knowledge files`);let n=[];for(let e of t){let m=await y(E(c,e),"utf-8"),d=b(e,m);n.push(...d),console.log(` ${e}: ${d.length} chunk(s)`)}console.log(`
9
- Total chunks: ${n.length}`),console.log(`Generating embeddings with ${i}...`);let{embeddings:r}=await $({model:i,values:n.map(e=>e.content),providerOptions:{openai:{dimensions:u}}}),l=n.map((e,m)=>({...e,embedding:r[m]})),s={model:i,dimensions:u,generatedAt:new Date().toISOString(),chunks:l};await S(a,JSON.stringify(s)),console.log(`
10
- Written ${a} (${l.length} chunks)`)}import{cosineSimilarity as x,embed as F}from"ai";function P(o){function c(){return o}return{get chunkCount(){return c().chunks.length},async search(a,i=5){let{model:u,dimensions:t,chunks:n}=c(),{embedding:r}=await F({model:u,value:a,...t&&{providerOptions:{openai:{dimensions:t}}}});return n.map(s=>({source:s.source,heading:s.heading,content:s.content,score:x(r,s.embedding)})).sort((s,e)=>e.score-s.score).slice(0,i)}}}export{b as chunkMarkdown,k as createKbClient,C as generateEmbeddings,P as loadKnowledgeBase};
1
+ var n=class extends Error{constructor(r,c){super(r);this.status=c;this.name="WaniWaniError"}};var f="@waniwani/sdk";function h(o){let{baseUrl:a,apiKey:r}=o;function c(){if(!r)throw new Error("WANIWANI_API_KEY is not set");return r}async function s(e,i,u){let g=c(),m=`${a.replace(/\/$/,"")}${i}`,p={Authorization:`Bearer ${g}`,"X-WaniWani-SDK":f},b={method:e,headers:p};u!==void 0&&(p["Content-Type"]="application/json",b.body=JSON.stringify(u));let t=await fetch(m,b);if(!t.ok){let S=await t.text().catch(()=>"");throw new n(S||`KB API error: HTTP ${t.status}`,t.status)}return t.json()}return{async ingest(e){return s("POST","/api/mcp/kb/ingest",{files:e})},async search(e,i){return s("POST","/api/mcp/kb/search",{query:e,...i})},async sources(){return s("GET","/api/mcp/kb/sources")}}}export{h as createKbClient};
11
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/error.ts","../../src/kb/client.ts","../../src/kb/embed.ts","../../src/kb/search.ts"],"sourcesContent":["// WaniWani SDK - Errors\n\nexport class WaniWaniError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic status: number,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"WaniWaniError\";\n\t}\n}\n","// KB Client — thin HTTP wrapper for knowledge base API\n\nimport { WaniWaniError } from \"../error.js\";\nimport type { InternalConfig } from \"../types.js\";\nimport type {\n\tKbClient,\n\tKbIngestFile,\n\tKbIngestResult,\n\tKbSearchOptions,\n\tKbSource,\n\tSearchResult,\n} from \"./types.js\";\n\nconst SDK_NAME = \"@waniwani/sdk\";\n\nexport function createKbClient(config: InternalConfig): KbClient {\n\tconst { baseUrl, apiKey } = config;\n\n\tfunction requireApiKey(): string {\n\t\tif (!apiKey) {\n\t\t\tthrow new Error(\"WANIWANI_API_KEY is not set\");\n\t\t}\n\t\treturn apiKey;\n\t}\n\n\tasync function request<T>(\n\t\tmethod: \"GET\" | \"POST\",\n\t\tpath: string,\n\t\tbody?: unknown,\n\t): Promise<T> {\n\t\tconst key = requireApiKey();\n\t\tconst url = `${baseUrl.replace(/\\/$/, \"\")}${path}`;\n\n\t\tconst headers: Record<string, string> = {\n\t\t\tAuthorization: `Bearer ${key}`,\n\t\t\t\"X-WaniWani-SDK\": SDK_NAME,\n\t\t};\n\n\t\tconst init: RequestInit = { method, headers };\n\n\t\tif (body !== undefined) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t\tinit.body = JSON.stringify(body);\n\t\t}\n\n\t\tconst response = await fetch(url, init);\n\n\t\tif (!response.ok) {\n\t\t\tconst text = await response.text().catch(() => \"\");\n\t\t\tthrow new WaniWaniError(\n\t\t\t\ttext || `KB API error: HTTP ${response.status}`,\n\t\t\t\tresponse.status,\n\t\t\t);\n\t\t}\n\n\t\treturn response.json() as Promise<T>;\n\t}\n\n\treturn {\n\t\tasync ingest(files: KbIngestFile[]): Promise<KbIngestResult> {\n\t\t\treturn request<KbIngestResult>(\"POST\", \"/api/mcp/kb/ingest\", {\n\t\t\t\tfiles,\n\t\t\t});\n\t\t},\n\n\t\tasync search(\n\t\t\tquery: string,\n\t\t\toptions?: KbSearchOptions,\n\t\t): Promise<SearchResult[]> {\n\t\t\treturn request<SearchResult[]>(\"POST\", \"/api/mcp/kb/search\", {\n\t\t\t\tquery,\n\t\t\t\t...options,\n\t\t\t});\n\t\t},\n\n\t\tasync sources(): Promise<KbSource[]> {\n\t\t\treturn request<KbSource[]>(\"GET\", \"/api/mcp/kb/sources\");\n\t\t},\n\t};\n}\n","import { readdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { embedMany } from \"ai\";\nimport type { Chunk, EmbeddingsFile, GenerateEmbeddingsOptions } from \"./types\";\n\nconst DEFAULT_MODEL = \"openai/text-embedding-3-small\";\nconst DEFAULT_DIMENSIONS = 512;\n\nexport function chunkMarkdown(\n\tfilename: string,\n\tcontent: string,\n): Omit<Chunk, \"embedding\">[] {\n\tconst lines = content.split(\"\\n\");\n\tconst chunks: Omit<Chunk, \"embedding\">[] = [];\n\n\tconst h1Match = content.match(/^# (.+)$/m);\n\tconst title = h1Match?.[1] ?? filename.replace(\".md\", \"\");\n\n\tlet currentHeading = title;\n\tlet currentContent: string[] = [];\n\tlet chunkIndex = 0;\n\n\tfor (const line of lines) {\n\t\tif (line.match(/^# /)) continue;\n\n\t\tconst h2Match = line.match(/^## (.+)$/);\n\t\tif (h2Match) {\n\t\t\tif (currentContent.length > 0) {\n\t\t\t\tconst text = currentContent.join(\"\\n\").trim();\n\t\t\t\tif (text) {\n\t\t\t\t\tchunks.push({\n\t\t\t\t\t\tid: `${filename.replace(\".md\", \"\")}#${chunkIndex}`,\n\t\t\t\t\t\tsource: filename,\n\t\t\t\t\t\theading: currentHeading,\n\t\t\t\t\t\tcontent: `${title}: ${currentHeading}\\n\\n${text}`,\n\t\t\t\t\t});\n\t\t\t\t\tchunkIndex++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcurrentHeading = h2Match[1];\n\t\t\tcurrentContent = [];\n\t\t} else {\n\t\t\tcurrentContent.push(line);\n\t\t}\n\t}\n\n\tconst text = currentContent.join(\"\\n\").trim();\n\tif (text) {\n\t\tchunks.push({\n\t\t\tid: `${filename.replace(\".md\", \"\")}#${chunkIndex}`,\n\t\t\tsource: filename,\n\t\t\theading: currentHeading,\n\t\t\tcontent: `${title}: ${currentHeading}\\n\\n${text}`,\n\t\t});\n\t}\n\n\treturn chunks;\n}\n\nexport async function generateEmbeddings(\n\toptions: GenerateEmbeddingsOptions,\n): Promise<void> {\n\tconst {\n\t\tknowledgeDir,\n\t\toutputPath,\n\t\tmodel = DEFAULT_MODEL,\n\t\tdimensions = DEFAULT_DIMENSIONS,\n\t} = options;\n\n\tconst files = (await readdir(knowledgeDir)).filter((f) => f.endsWith(\".md\"));\n\tconsole.log(`Found ${files.length} knowledge files`);\n\n\tconst allChunks: Omit<Chunk, \"embedding\">[] = [];\n\tfor (const file of files) {\n\t\tconst content = await readFile(join(knowledgeDir, file), \"utf-8\");\n\t\tconst chunks = chunkMarkdown(file, content);\n\t\tallChunks.push(...chunks);\n\t\tconsole.log(` ${file}: ${chunks.length} chunk(s)`);\n\t}\n\n\tconsole.log(`\\nTotal chunks: ${allChunks.length}`);\n\tconsole.log(`Generating embeddings with ${model}...`);\n\n\tconst { embeddings } = await embedMany({\n\t\tmodel,\n\t\tvalues: allChunks.map((c) => c.content),\n\t\tproviderOptions: { openai: { dimensions } },\n\t});\n\n\tconst chunks: Chunk[] = allChunks.map((chunk, i) => ({\n\t\t...chunk,\n\t\tembedding: embeddings[i],\n\t}));\n\n\tconst output: EmbeddingsFile = {\n\t\tmodel,\n\t\tdimensions,\n\t\tgeneratedAt: new Date().toISOString(),\n\t\tchunks,\n\t};\n\n\tawait writeFile(outputPath, JSON.stringify(output));\n\tconsole.log(`\\nWritten ${outputPath} (${chunks.length} chunks)`);\n}\n","import { cosineSimilarity, embed } from \"ai\";\nimport type { EmbeddingsFile, KnowledgeBase, SearchResult } from \"./types\";\n\n/**\n * Create a knowledge base instance from pre-loaded embeddings data.\n *\n * ```typescript\n * import embeddings from \"./embeddings.json\";\n * const kb = loadKnowledgeBase(embeddings);\n * ```\n */\nexport function loadKnowledgeBase(source: EmbeddingsFile): KnowledgeBase {\n\tfunction getEmbeddings(): EmbeddingsFile {\n\t\treturn source;\n\t}\n\n\treturn {\n\t\tget chunkCount() {\n\t\t\treturn getEmbeddings().chunks.length;\n\t\t},\n\n\t\tasync search(query: string, topK = 5): Promise<SearchResult[]> {\n\t\t\tconst { model, dimensions, chunks } = getEmbeddings();\n\n\t\t\tconst { embedding: queryEmbedding } = await embed({\n\t\t\t\tmodel,\n\t\t\t\tvalue: query,\n\t\t\t\t...(dimensions && {\n\t\t\t\t\tproviderOptions: { openai: { dimensions } },\n\t\t\t\t}),\n\t\t\t});\n\n\t\t\tconst scored = chunks.map((chunk) => ({\n\t\t\t\tsource: chunk.source,\n\t\t\t\theading: chunk.heading,\n\t\t\t\tcontent: chunk.content,\n\t\t\t\tscore: cosineSimilarity(queryEmbedding, chunk.embedding),\n\t\t\t}));\n\n\t\t\treturn scored.sort((a, b) => b.score - a.score).slice(0, topK);\n\t\t},\n\t};\n}\n"],"mappings":"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","names":["WaniWaniError","message","status","SDK_NAME","createKbClient","config","baseUrl","apiKey","requireApiKey","request","method","path","body","key","url","headers","init","response","text","WaniWaniError","files","query","options","readdir","readFile","writeFile","join","embedMany","DEFAULT_MODEL","DEFAULT_DIMENSIONS","chunkMarkdown","filename","content","lines","chunks","title","currentHeading","currentContent","chunkIndex","line","h2Match","text","generateEmbeddings","options","knowledgeDir","outputPath","model","dimensions","files","f","allChunks","file","embeddings","c","chunk","i","output","cosineSimilarity","embed","loadKnowledgeBase","source","getEmbeddings","query","topK","model","dimensions","chunks","queryEmbedding","chunk","a","b"]}
1
+ {"version":3,"sources":["../../src/error.ts","../../src/kb/client.ts"],"sourcesContent":["// WaniWani SDK - Errors\n\nexport class WaniWaniError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic status: number,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"WaniWaniError\";\n\t}\n}\n","// KB Client — thin HTTP wrapper for knowledge base API\n\nimport { WaniWaniError } from \"../error.js\";\nimport type { InternalConfig } from \"../types.js\";\nimport type {\n\tKbClient,\n\tKbIngestFile,\n\tKbIngestResult,\n\tKbSearchOptions,\n\tKbSource,\n\tSearchResult,\n} from \"./types.js\";\n\nconst SDK_NAME = \"@waniwani/sdk\";\n\nexport function createKbClient(config: InternalConfig): KbClient {\n\tconst { baseUrl, apiKey } = config;\n\n\tfunction requireApiKey(): string {\n\t\tif (!apiKey) {\n\t\t\tthrow new Error(\"WANIWANI_API_KEY is not set\");\n\t\t}\n\t\treturn apiKey;\n\t}\n\n\tasync function request<T>(\n\t\tmethod: \"GET\" | \"POST\",\n\t\tpath: string,\n\t\tbody?: unknown,\n\t): Promise<T> {\n\t\tconst key = requireApiKey();\n\t\tconst url = `${baseUrl.replace(/\\/$/, \"\")}${path}`;\n\n\t\tconst headers: Record<string, string> = {\n\t\t\tAuthorization: `Bearer ${key}`,\n\t\t\t\"X-WaniWani-SDK\": SDK_NAME,\n\t\t};\n\n\t\tconst init: RequestInit = { method, headers };\n\n\t\tif (body !== undefined) {\n\t\t\theaders[\"Content-Type\"] = \"application/json\";\n\t\t\tinit.body = JSON.stringify(body);\n\t\t}\n\n\t\tconst response = await fetch(url, init);\n\n\t\tif (!response.ok) {\n\t\t\tconst text = await response.text().catch(() => \"\");\n\t\t\tthrow new WaniWaniError(\n\t\t\t\ttext || `KB API error: HTTP ${response.status}`,\n\t\t\t\tresponse.status,\n\t\t\t);\n\t\t}\n\n\t\treturn response.json() as Promise<T>;\n\t}\n\n\treturn {\n\t\tasync ingest(files: KbIngestFile[]): Promise<KbIngestResult> {\n\t\t\treturn request<KbIngestResult>(\"POST\", \"/api/mcp/kb/ingest\", {\n\t\t\t\tfiles,\n\t\t\t});\n\t\t},\n\n\t\tasync search(\n\t\t\tquery: string,\n\t\t\toptions?: KbSearchOptions,\n\t\t): Promise<SearchResult[]> {\n\t\t\treturn request<SearchResult[]>(\"POST\", \"/api/mcp/kb/search\", {\n\t\t\t\tquery,\n\t\t\t\t...options,\n\t\t\t});\n\t\t},\n\n\t\tasync sources(): Promise<KbSource[]> {\n\t\t\treturn request<KbSource[]>(\"GET\", \"/api/mcp/kb/sources\");\n\t\t},\n\t};\n}\n"],"mappings":"AAEO,IAAMA,EAAN,cAA4B,KAAM,CACxC,YACCC,EACOC,EACN,CACD,MAAMD,CAAO,EAFN,YAAAC,EAGP,KAAK,KAAO,eACb,CACD,ECGA,IAAMC,EAAW,gBAEV,SAASC,EAAeC,EAAkC,CAChE,GAAM,CAAE,QAAAC,EAAS,OAAAC,CAAO,EAAIF,EAE5B,SAASG,GAAwB,CAChC,GAAI,CAACD,EACJ,MAAM,IAAI,MAAM,6BAA6B,EAE9C,OAAOA,CACR,CAEA,eAAeE,EACdC,EACAC,EACAC,EACa,CACb,IAAMC,EAAML,EAAc,EACpBM,EAAM,GAAGR,EAAQ,QAAQ,MAAO,EAAE,CAAC,GAAGK,CAAI,GAE1CI,EAAkC,CACvC,cAAe,UAAUF,CAAG,GAC5B,iBAAkBV,CACnB,EAEMa,EAAoB,CAAE,OAAAN,EAAQ,QAAAK,CAAQ,EAExCH,IAAS,SACZG,EAAQ,cAAc,EAAI,mBAC1BC,EAAK,KAAO,KAAK,UAAUJ,CAAI,GAGhC,IAAMK,EAAW,MAAM,MAAMH,EAAKE,CAAI,EAEtC,GAAI,CAACC,EAAS,GAAI,CACjB,IAAMC,EAAO,MAAMD,EAAS,KAAK,EAAE,MAAM,IAAM,EAAE,EACjD,MAAM,IAAIE,EACTD,GAAQ,sBAAsBD,EAAS,MAAM,GAC7CA,EAAS,MACV,CACD,CAEA,OAAOA,EAAS,KAAK,CACtB,CAEA,MAAO,CACN,MAAM,OAAOG,EAAgD,CAC5D,OAAOX,EAAwB,OAAQ,qBAAsB,CAC5D,MAAAW,CACD,CAAC,CACF,EAEA,MAAM,OACLC,EACAC,EAC0B,CAC1B,OAAOb,EAAwB,OAAQ,qBAAsB,CAC5D,MAAAY,EACA,GAAGC,CACJ,CAAC,CACF,EAEA,MAAM,SAA+B,CACpC,OAAOb,EAAoB,MAAO,qBAAqB,CACxD,CACD,CACD","names":["WaniWaniError","message","status","SDK_NAME","createKbClient","config","baseUrl","apiKey","requireApiKey","request","method","path","body","key","url","headers","init","response","text","WaniWaniError","files","query","options"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@waniwani/sdk",
3
- "version": "0.1.20-beta.27",
3
+ "version": "0.1.20-beta.28",
4
4
  "description": "WaniWani SDK - MCP event tracking, widget framework, and tools",
5
5
  "type": "module",
6
6
  "exports": {