@yolk-sdk/knowledge 0.0.1-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +104 -0
  3. package/dist/agent.d.mts +26 -0
  4. package/dist/agent.d.mts.map +1 -0
  5. package/dist/agent.mjs +45 -0
  6. package/dist/agent.mjs.map +1 -0
  7. package/dist/artifacts.d.mts +37 -0
  8. package/dist/artifacts.d.mts.map +1 -0
  9. package/dist/artifacts.mjs +28 -0
  10. package/dist/artifacts.mjs.map +1 -0
  11. package/dist/chunking.d.mts +38 -0
  12. package/dist/chunking.d.mts.map +1 -0
  13. package/dist/chunking.mjs +93 -0
  14. package/dist/chunking.mjs.map +1 -0
  15. package/dist/context.d.mts +16 -0
  16. package/dist/context.d.mts.map +1 -0
  17. package/dist/context.mjs +25 -0
  18. package/dist/context.mjs.map +1 -0
  19. package/dist/documents.d.mts +105 -0
  20. package/dist/documents.d.mts.map +1 -0
  21. package/dist/documents.mjs +93 -0
  22. package/dist/documents.mjs.map +1 -0
  23. package/dist/embeddings.d.mts +14 -0
  24. package/dist/embeddings.d.mts.map +1 -0
  25. package/dist/embeddings.mjs +8 -0
  26. package/dist/embeddings.mjs.map +1 -0
  27. package/dist/errors.d.mts +72 -0
  28. package/dist/errors.d.mts.map +1 -0
  29. package/dist/errors.mjs +26 -0
  30. package/dist/errors.mjs.map +1 -0
  31. package/dist/extraction.d.mts +19 -0
  32. package/dist/extraction.d.mts.map +1 -0
  33. package/dist/extraction.mjs +7 -0
  34. package/dist/extraction.mjs.map +1 -0
  35. package/dist/index.d.mts +5 -0
  36. package/dist/index.mjs +5 -0
  37. package/dist/ingestion.d.mts +48 -0
  38. package/dist/ingestion.d.mts.map +1 -0
  39. package/dist/ingestion.mjs +111 -0
  40. package/dist/ingestion.mjs.map +1 -0
  41. package/dist/links.d.mts +17 -0
  42. package/dist/links.d.mts.map +1 -0
  43. package/dist/links.mjs +24 -0
  44. package/dist/links.mjs.map +1 -0
  45. package/dist/provenance.d.mts +20 -0
  46. package/dist/provenance.d.mts.map +1 -0
  47. package/dist/provenance.mjs +26 -0
  48. package/dist/provenance.mjs.map +1 -0
  49. package/dist/records.d.mts +59 -0
  50. package/dist/records.d.mts.map +1 -0
  51. package/dist/records.mjs +64 -0
  52. package/dist/records.mjs.map +1 -0
  53. package/dist/representations.d.mts +36 -0
  54. package/dist/representations.d.mts.map +1 -0
  55. package/dist/representations.mjs +44 -0
  56. package/dist/representations.mjs.map +1 -0
  57. package/dist/search-store.d.mts +77 -0
  58. package/dist/search-store.d.mts.map +1 -0
  59. package/dist/search-store.mjs +7 -0
  60. package/dist/search-store.mjs.map +1 -0
  61. package/dist/search.d.mts +49 -0
  62. package/dist/search.d.mts.map +1 -0
  63. package/dist/search.mjs +179 -0
  64. package/dist/search.mjs.map +1 -0
  65. package/dist/store.d.mts +44 -0
  66. package/dist/store.d.mts.map +1 -0
  67. package/dist/store.mjs +7 -0
  68. package/dist/store.mjs.map +1 -0
  69. package/dist/summarization.d.mts +23 -0
  70. package/dist/summarization.d.mts.map +1 -0
  71. package/dist/summarization.mjs +8 -0
  72. package/dist/summarization.mjs.map +1 -0
  73. package/dist/vector-store.d.mts +3 -0
  74. package/dist/vector-store.mjs +2 -0
  75. package/package.json +147 -0
  76. package/src/agent.ts +96 -0
  77. package/src/artifacts.ts +48 -0
  78. package/src/chunking.ts +175 -0
  79. package/src/context.ts +42 -0
  80. package/src/documents.ts +109 -0
  81. package/src/embeddings.ts +18 -0
  82. package/src/errors.ts +63 -0
  83. package/src/extraction.ts +21 -0
  84. package/src/index.ts +4 -0
  85. package/src/ingestion.ts +157 -0
  86. package/src/links.ts +23 -0
  87. package/src/provenance.ts +25 -0
  88. package/src/records.ts +76 -0
  89. package/src/representations.ts +51 -0
  90. package/src/search-store.ts +98 -0
  91. package/src/search.ts +270 -0
  92. package/src/store.ts +53 -0
  93. package/src/summarization.ts +28 -0
  94. package/src/vector-store.ts +6 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Yolk SDK contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # @yolk-sdk/knowledge
2
+
3
+ Domain-free knowledge record, artifact, representation, search, provenance, link, store, and context contracts.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pnpm add @yolk-sdk/knowledge@canary @yolk-sdk/agent@canary effect
9
+ ```
10
+
11
+ Canary APIs are unstable. Keep all `@yolk-sdk/*` packages on the same version.
12
+
13
+ ## Subpaths
14
+
15
+ | Subpath | Purpose |
16
+ | --- | --- |
17
+ | `@yolk-sdk/knowledge/records` | Knowledge record schemas and roles |
18
+ | `@yolk-sdk/knowledge/artifacts` | Artifact catalog and blob-store contract |
19
+ | `@yolk-sdk/knowledge/representations` | Agent-readable/searchable representations |
20
+ | `@yolk-sdk/knowledge/chunking` | Search chunker contracts and defaults |
21
+ | `@yolk-sdk/knowledge/embeddings` | Embedder contract and vector types |
22
+ | `@yolk-sdk/knowledge/extraction` | Loaded source/extractor contract |
23
+ | `@yolk-sdk/knowledge/ingestion` | Generic search ingestion pipeline |
24
+ | `@yolk-sdk/knowledge/search` | Search interface, hybrid search, context packing |
25
+ | `@yolk-sdk/knowledge/documents` | Collection, document, chunk, and search scope schemas |
26
+ | `@yolk-sdk/knowledge/search-store` | Collection/document/chunk/search lifecycle store |
27
+ | `@yolk-sdk/knowledge/summarization` | Optional title/summary service contract |
28
+ | `@yolk-sdk/knowledge/provenance` | Source/provenance metadata |
29
+ | `@yolk-sdk/knowledge/links` | Typed links between records |
30
+ | `@yolk-sdk/knowledge/store` | Knowledge store lifecycle contract |
31
+ | `@yolk-sdk/knowledge/context` | Context assembly helpers |
32
+ | `@yolk-sdk/knowledge/agent` | Agent-facing helper contracts |
33
+
34
+ ## Imports
35
+
36
+ ```ts
37
+ import { buildKnowledgeContext, KnowledgeStore } from '@yolk-sdk/knowledge'
38
+ import { KnowledgeRecord } from '@yolk-sdk/knowledge/records'
39
+ import { KnowledgeArtifactStore } from '@yolk-sdk/knowledge/artifacts'
40
+ import { makeDefaultKnowledgeChunker } from '@yolk-sdk/knowledge/chunking'
41
+ import { searchKnowledge } from '@yolk-sdk/knowledge/search'
42
+ ```
43
+
44
+ ## Migration
45
+
46
+ Search APIs use canonical search naming. Removed APIs are intentionally not backward-compatible.
47
+
48
+ | Removed | Use |
49
+ | --- | --- |
50
+ | `@yolk-sdk/knowledge/retrieval` | `@yolk-sdk/knowledge/search` |
51
+ | `KnowledgeRetriever` | `KnowledgeSearcher` |
52
+ | `retrieve(input)` | `search(input)` |
53
+ | `KnowledgeRetrievalError` | `KnowledgeSearchError` |
54
+
55
+ ## Glossary
56
+
57
+ | Term | Meaning |
58
+ | --- | --- |
59
+ | Knowledge record | Stable logical thing an agent can know about. Domain-free; hosts decide product meaning. |
60
+ | Artifact | Stored source/blob attached to knowledge, such as a file or captured output. |
61
+ | Representation | Agent-readable or searchable form of knowledge, usually text plus metadata. |
62
+ | Provenance | Source metadata explaining where knowledge came from and how it was produced. |
63
+ | Link | Typed relationship between knowledge records. |
64
+ | Context | Model-ready knowledge selected for a run. Built from host policy. |
65
+ | Context policy | Host intent for use: `pinned`, `routable`, `searchable`, or `archival`. |
66
+ | Search index | Searchable corpus built from source documents, chunks, embeddings, and metadata. |
67
+ | Collection | Named searchable document group with shared embedding and chunking config. |
68
+ | Document | Source item tracked through search ingestion: pending, processing, ready, or error. |
69
+ | Source | Document origin: file ref, URL, or raw text. |
70
+ | Chunk | Searchable slice of a document with position and token count. |
71
+ | Embedding | Numeric vector for semantic search. Hosts provide the embedding provider. |
72
+ | Chunker | Service that splits extracted text into chunks. |
73
+ | Extractor | Service that loads source content into text/title/summary/metadata. |
74
+ | Ingestion | Pipeline that extracts, chunks, embeds, stores chunks, and marks document status. |
75
+ | Search | Query-time search over search chunks, optionally packed into context text. |
76
+ | Hybrid search | Search mode that fuses vector and text search rankings. |
77
+ | Search scope | Caller-provided collection or collections to search. Package does not interpret tenant semantics. |
78
+ | Search index store | Persistence contract for collections, documents, chunks, status, and search. |
79
+ | Vector store | Lower-level vector persistence/search contract. |
80
+ | Knowledge store | Persistence contract for non-index knowledge records and context assembly. |
81
+ | Artifact store | Persistence contract for artifact bytes/metadata. |
82
+ | Host | App using the package; owns auth, DB, object storage, providers, permissions, and policy. |
83
+
84
+ ## Context policy
85
+
86
+ | Policy | Meaning |
87
+ | --- | --- |
88
+ | `pinned` | Host may inject into model startup context |
89
+ | `routable` | Host may use for routing/dispatch decisions |
90
+ | `searchable` | Host may expose through search tools |
91
+ | `archival` | Retained but normally omitted from active context/search |
92
+
93
+ ## Host responsibilities
94
+
95
+ - Own users, teams, permissions, routing, and product policy.
96
+ - Implement `KnowledgeStore` and `KnowledgeArtifactStore` with app storage.
97
+ - Own concrete extraction, embeddings, search ingestion, R2/S3 layout, and DB schema.
98
+ - Decide which knowledge is pinned, searchable, routable, or archival.
99
+
100
+ ## Boundaries
101
+
102
+ - No app auth, DB drivers, object storage SDKs, React, Next.js, or provider SDKs.
103
+ - Search/chunking APIs are exposed as flat knowledge subpaths; concrete stores and providers remain app-owned.
104
+ - Package owns semantics and contracts only.
@@ -0,0 +1,26 @@
1
+ import { KnowledgeScope } from "./records.mjs";
2
+ import { KnowledgeSearchScope } from "./documents.mjs";
3
+ import { KnowledgeSearcher } from "./search.mjs";
4
+ import { Effect } from "effect";
5
+ import { ToolError } from "@yolk-sdk/agent/loop";
6
+ import { ToolRegistration } from "@yolk-sdk/agent/tools";
7
+
8
+ //#region src/agent.d.ts
9
+ type ResolveKnowledgeScope<Context> = (context: Context) => KnowledgeScope;
10
+ type KnowledgeAgentContextOptions = {
11
+ readonly maxPinnedContextCharacters: number;
12
+ };
13
+ declare const defaultKnowledgeAgentContextOptions: KnowledgeAgentContextOptions;
14
+ type KnowledgeSearchToolScopeResolver<Context> = KnowledgeSearchScope | ((context: Context) => Effect.Effect<KnowledgeSearchScope, ToolError>);
15
+ type MakeKnowledgeSearchToolOptions<Context> = {
16
+ readonly scope: KnowledgeSearchToolScopeResolver<Context>;
17
+ readonly name?: string;
18
+ readonly description?: string;
19
+ readonly limit?: number;
20
+ readonly minScore?: number;
21
+ readonly contextChunks?: number;
22
+ };
23
+ declare const makeKnowledgeSearchTool: <Context>(searcher: KnowledgeSearcher, options: MakeKnowledgeSearchToolOptions<Context>) => ToolRegistration<Context>;
24
+ //#endregion
25
+ export { KnowledgeAgentContextOptions, KnowledgeSearchToolScopeResolver, MakeKnowledgeSearchToolOptions, ResolveKnowledgeScope, defaultKnowledgeAgentContextOptions, makeKnowledgeSearchTool };
26
+ //# sourceMappingURL=agent.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.mts","names":[],"sources":["../src/agent.ts"],"mappings":";;;;;;;;KAUY,qBAAA,aAAkC,OAAA,EAAS,OAAA,KAAY,cAAc;AAAA,KAErE,4BAAA;EAAA,SACD,0BAA0B;AAAA;AAAA,cAGxB,mCAAA,EAAqC,4BAEjD;AAAA,KAWW,gCAAA,YACR,oBAAA,KACE,OAAA,EAAS,OAAA,KAAY,MAAA,CAAO,MAAA,CAAO,oBAAA,EAAsB,SAAA;AAAA,KAEnD,8BAAA;EAAA,SACD,KAAA,EAAO,gCAAgC,CAAC,OAAA;EAAA,SACxC,IAAA;EAAA,SACA,WAAA;EAAA,SACA,KAAA;EAAA,SACA,QAAA;EAAA,SACA,aAAA;AAAA;AAAA,cAWE,uBAAA,YACX,QAAA,EAAU,iBAAA,EACV,OAAA,EAAS,8BAAA,CAA+B,OAAA,MACvC,gBAAA,CAAiB,OAAA"}
package/dist/agent.mjs ADDED
@@ -0,0 +1,45 @@
1
+ import { packKnowledgeSearchContext } from "./search.mjs";
2
+ import { Effect } from "effect";
3
+ import * as Schema$1 from "effect/Schema";
4
+ import { ToolError } from "@yolk-sdk/agent/loop";
5
+ import { ToolResult } from "@yolk-sdk/agent/protocol";
6
+ import { makeTool } from "@yolk-sdk/agent/tools";
7
+ //#region src/agent.ts
8
+ const defaultKnowledgeAgentContextOptions = { maxPinnedContextCharacters: 6e3 };
9
+ const KnowledgeSearchToolParams = Schema$1.Struct({ query: Schema$1.Trimmed.pipe(Schema$1.check(Schema$1.isNonEmpty()), Schema$1.annotate({ description: "Search query for the configured knowledge search." })) });
10
+ const isToolError = Schema$1.is(ToolError);
11
+ const resolveScope = (resolver, context) => {
12
+ if (typeof resolver === "function") return resolver(context);
13
+ return Effect.succeed(resolver);
14
+ };
15
+ const makeKnowledgeSearchTool = (searcher, options) => {
16
+ return makeTool({
17
+ name: options.name ?? "search_knowledge",
18
+ description: options.description ?? "Search the configured knowledge search.",
19
+ parameters: KnowledgeSearchToolParams,
20
+ access: "read",
21
+ invalidParamsMessage: (error) => error instanceof Error ? error.message : String(error),
22
+ execute: (input) => resolveScope(options.scope, input.context).pipe(Effect.flatMap((scope) => searcher.search({
23
+ scope,
24
+ query: input.params.query,
25
+ limit: options.limit,
26
+ minScore: options.minScore,
27
+ contextChunks: options.contextChunks
28
+ })), Effect.map((results) => packKnowledgeSearchContext(input.params.query, results)), Effect.map((context) => ToolResult.make({
29
+ toolCallId: input.call.id,
30
+ content: context.text,
31
+ structuredContent: context
32
+ })), Effect.mapError((error) => {
33
+ if (isToolError(error)) return error;
34
+ return new ToolError({
35
+ tool: input.call.name,
36
+ message: error.message,
37
+ cause: "execution"
38
+ });
39
+ }))
40
+ });
41
+ };
42
+ //#endregion
43
+ export { defaultKnowledgeAgentContextOptions, makeKnowledgeSearchTool };
44
+
45
+ //# sourceMappingURL=agent.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.mjs","names":["Schema"],"sources":["../src/agent.ts"],"sourcesContent":["import { Effect } from 'effect'\nimport * as Schema from 'effect/Schema'\nimport { ToolError } from '@yolk-sdk/agent/loop'\nimport { ToolResult } from '@yolk-sdk/agent/protocol'\nimport { makeTool, type ToolRegistration } from '@yolk-sdk/agent/tools'\nimport type { KnowledgeScope } from './records.ts'\nimport type { KnowledgeSearchScope } from './documents.ts'\nimport type { KnowledgeSearcher } from './search.ts'\nimport { packKnowledgeSearchContext } from './search.ts'\n\nexport type ResolveKnowledgeScope<Context> = (context: Context) => KnowledgeScope\n\nexport type KnowledgeAgentContextOptions = {\n readonly maxPinnedContextCharacters: number\n}\n\nexport const defaultKnowledgeAgentContextOptions: KnowledgeAgentContextOptions = {\n maxPinnedContextCharacters: 6000\n}\n\nconst KnowledgeSearchToolParams = Schema.Struct({\n query: Schema.Trimmed.pipe(\n Schema.check(Schema.isNonEmpty()),\n Schema.annotate({ description: 'Search query for the configured knowledge search.' })\n )\n})\n\nconst isToolError = Schema.is(ToolError)\n\nexport type KnowledgeSearchToolScopeResolver<Context> =\n | KnowledgeSearchScope\n | ((context: Context) => Effect.Effect<KnowledgeSearchScope, ToolError>)\n\nexport type MakeKnowledgeSearchToolOptions<Context> = {\n readonly scope: KnowledgeSearchToolScopeResolver<Context>\n readonly name?: string\n readonly description?: string\n readonly limit?: number\n readonly minScore?: number\n readonly contextChunks?: number\n}\n\nconst resolveScope = <Context>(resolver: KnowledgeSearchToolScopeResolver<Context>, context: Context) => {\n if (typeof resolver === 'function') {\n return resolver(context)\n }\n\n return Effect.succeed(resolver)\n}\n\nexport const makeKnowledgeSearchTool = <Context>(\n searcher: KnowledgeSearcher,\n options: MakeKnowledgeSearchToolOptions<Context>\n): ToolRegistration<Context> => {\n const name = options.name ?? 'search_knowledge'\n\n return makeTool({\n name,\n description: options.description ?? 'Search the configured knowledge search.',\n parameters: KnowledgeSearchToolParams,\n access: 'read',\n invalidParamsMessage: error => error instanceof Error ? error.message : String(error),\n execute: input =>\n resolveScope(options.scope, input.context).pipe(\n Effect.flatMap(scope =>\n searcher.search({\n scope,\n query: input.params.query,\n limit: options.limit,\n minScore: options.minScore,\n contextChunks: options.contextChunks\n })\n ),\n Effect.map(results => packKnowledgeSearchContext(input.params.query, results)),\n Effect.map(\n context =>\n ToolResult.make({\n toolCallId: input.call.id,\n content: context.text,\n structuredContent: context\n })\n ),\n Effect.mapError(error => {\n if (isToolError(error)) {\n return error\n }\n\n return new ToolError({\n tool: input.call.name,\n message: error.message,\n cause: 'execution'\n })\n })\n )\n })\n}\n"],"mappings":";;;;;;;AAgBA,MAAa,sCAAoE,EAC/E,4BAA4B,IAC9B;AAEA,MAAM,4BAA4BA,SAAO,OAAO,EAC9C,OAAOA,SAAO,QAAQ,KACpBA,SAAO,MAAMA,SAAO,WAAW,CAAC,GAChCA,SAAO,SAAS,EAAE,aAAa,oDAAoD,CAAC,CACtF,EACF,CAAC;AAED,MAAM,cAAcA,SAAO,GAAG,SAAS;AAevC,MAAM,gBAAyB,UAAqD,YAAqB;CACvG,IAAI,OAAO,aAAa,YACtB,OAAO,SAAS,OAAO;CAGzB,OAAO,OAAO,QAAQ,QAAQ;AAChC;AAEA,MAAa,2BACX,UACA,YAC8B;CAG9B,OAAO,SAAS;EACd,MAHW,QAAQ,QAAQ;EAI3B,aAAa,QAAQ,eAAe;EACpC,YAAY;EACZ,QAAQ;EACR,uBAAsB,UAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EACpF,UAAS,UACP,aAAa,QAAQ,OAAO,MAAM,OAAO,EAAE,KACzC,OAAO,SAAQ,UACb,SAAS,OAAO;GACd;GACA,OAAO,MAAM,OAAO;GACpB,OAAO,QAAQ;GACf,UAAU,QAAQ;GAClB,eAAe,QAAQ;EACzB,CAAC,CACH,GACA,OAAO,KAAI,YAAW,2BAA2B,MAAM,OAAO,OAAO,OAAO,CAAC,GAC7E,OAAO,KACL,YACE,WAAW,KAAK;GACd,YAAY,MAAM,KAAK;GACvB,SAAS,QAAQ;GACjB,mBAAmB;EACrB,CAAC,CACL,GACA,OAAO,UAAS,UAAS;GACvB,IAAI,YAAY,KAAK,GACnB,OAAO;GAGT,OAAO,IAAI,UAAU;IACnB,MAAM,MAAM,KAAK;IACjB,SAAS,MAAM;IACf,OAAO;GACT,CAAC;EACH,CAAC,CACH;CACJ,CAAC;AACH"}
@@ -0,0 +1,37 @@
1
+ import { KnowledgeArtifactError } from "./errors.mjs";
2
+ import { Context, Effect } from "effect";
3
+ import * as Schema$1 from "effect/Schema";
4
+
5
+ //#region src/artifacts.d.ts
6
+ declare const KnowledgeArtifactKindSchema: Schema$1.Literals<readonly ["original", "extracted_text", "thumbnail", "transcript", "caption", "structured"]>;
7
+ type KnowledgeArtifactKind = Schema$1.Schema.Type<typeof KnowledgeArtifactKindSchema>;
8
+ declare const KnowledgeArtifactSchema: Schema$1.Struct<{
9
+ readonly id: Schema$1.Trimmed;
10
+ readonly recordId: Schema$1.Trimmed;
11
+ readonly kind: Schema$1.Literals<readonly ["original", "extracted_text", "thumbnail", "transcript", "caption", "structured"]>;
12
+ readonly storageKey: Schema$1.Trimmed;
13
+ readonly mediaType: Schema$1.optional<Schema$1.Trimmed>;
14
+ readonly byteSize: Schema$1.optional<Schema$1.Int>;
15
+ readonly checksum: Schema$1.optional<Schema$1.Trimmed>;
16
+ readonly metadata: Schema$1.optional<Schema$1.$Record<Schema$1.String, Schema$1.Unknown>>;
17
+ readonly createdAt: Schema$1.DateTimeUtc;
18
+ }>;
19
+ type KnowledgeArtifact = Schema$1.Schema.Type<typeof KnowledgeArtifactSchema>;
20
+ type PutKnowledgeArtifactInput = {
21
+ readonly storageKey: string;
22
+ readonly mediaType?: string;
23
+ readonly bytes: Uint8Array;
24
+ };
25
+ type GetKnowledgeArtifactInput = {
26
+ readonly storageKey: string;
27
+ };
28
+ type KnowledgeArtifactStoreApi = {
29
+ readonly putArtifact: (input: PutKnowledgeArtifactInput) => Effect.Effect<void, KnowledgeArtifactError>;
30
+ readonly getArtifact: (input: GetKnowledgeArtifactInput) => Effect.Effect<Uint8Array, KnowledgeArtifactError>;
31
+ readonly deleteArtifact: (input: GetKnowledgeArtifactInput) => Effect.Effect<void, KnowledgeArtifactError>;
32
+ };
33
+ declare const KnowledgeArtifactStore_base: Context.ServiceClass<KnowledgeArtifactStore, "@yolk-sdk/knowledge/KnowledgeArtifactStore", KnowledgeArtifactStoreApi>;
34
+ declare class KnowledgeArtifactStore extends KnowledgeArtifactStore_base {}
35
+ //#endregion
36
+ export { GetKnowledgeArtifactInput, KnowledgeArtifact, KnowledgeArtifactKind, KnowledgeArtifactKindSchema, KnowledgeArtifactSchema, KnowledgeArtifactStore, KnowledgeArtifactStoreApi, PutKnowledgeArtifactInput };
37
+ //# sourceMappingURL=artifacts.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.d.mts","names":[],"sources":["../src/artifacts.ts"],"mappings":";;;;;cAMa,2BAAA,EAA2B,QAAA,CAAA,QAAA;AAAA,KAQ5B,qBAAA,GAAwB,QAAA,CAAO,MAAA,CAAO,IAAI,QAAQ,2BAAA;AAAA,cAEjD,uBAAA,EAAuB,QAAA,CAAA,MAAA;EAAA;;;;;;;;;;KAWxB,iBAAA,GAAoB,QAAA,CAAO,MAAA,CAAO,IAAI,QAAQ,uBAAA;AAAA,KAE9C,yBAAA;EAAA,SACD,UAAA;EAAA,SACA,SAAA;EAAA,SACA,KAAA,EAAO,UAAU;AAAA;AAAA,KAGhB,yBAAA;EAAA,SACD,UAAU;AAAA;AAAA,KAGT,yBAAA;EAAA,SACD,WAAA,GAAc,KAAA,EAAO,yBAAA,KAA8B,MAAA,CAAO,MAAA,OAAa,sBAAA;EAAA,SACvE,WAAA,GAAc,KAAA,EAAO,yBAAA,KAA8B,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,sBAAA;EAAA,SAC7E,cAAA,GAAiB,KAAA,EAAO,yBAAA,KAA8B,MAAA,CAAO,MAAA,OAAa,sBAAA;AAAA;AAAA,cACpF,2BAAA;cAEY,sBAAA,SAA+B,2BAE3C"}
@@ -0,0 +1,28 @@
1
+ import { KnowledgeMetadataSchema, NonEmptyTrimmedString, NonNegativeInteger } from "./records.mjs";
2
+ import { Context } from "effect";
3
+ import * as Schema$1 from "effect/Schema";
4
+ //#region src/artifacts.ts
5
+ const KnowledgeArtifactKindSchema = Schema$1.Literals([
6
+ "original",
7
+ "extracted_text",
8
+ "thumbnail",
9
+ "transcript",
10
+ "caption",
11
+ "structured"
12
+ ]);
13
+ const KnowledgeArtifactSchema = Schema$1.Struct({
14
+ id: NonEmptyTrimmedString,
15
+ recordId: NonEmptyTrimmedString,
16
+ kind: KnowledgeArtifactKindSchema,
17
+ storageKey: NonEmptyTrimmedString,
18
+ mediaType: Schema$1.optional(NonEmptyTrimmedString),
19
+ byteSize: Schema$1.optional(NonNegativeInteger),
20
+ checksum: Schema$1.optional(NonEmptyTrimmedString),
21
+ metadata: Schema$1.optional(KnowledgeMetadataSchema),
22
+ createdAt: Schema$1.DateTimeUtc
23
+ });
24
+ var KnowledgeArtifactStore = class extends Context.Service()("@yolk-sdk/knowledge/KnowledgeArtifactStore") {};
25
+ //#endregion
26
+ export { KnowledgeArtifactKindSchema, KnowledgeArtifactSchema, KnowledgeArtifactStore };
27
+
28
+ //# sourceMappingURL=artifacts.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.mjs","names":["Schema"],"sources":["../src/artifacts.ts"],"sourcesContent":["import { Context } from 'effect'\nimport type { Effect } from 'effect'\nimport * as Schema from 'effect/Schema'\nimport type { KnowledgeArtifactError } from './errors.ts'\nimport { KnowledgeMetadataSchema, NonEmptyTrimmedString, NonNegativeInteger } from './records.ts'\n\nexport const KnowledgeArtifactKindSchema = Schema.Literals([\n 'original',\n 'extracted_text',\n 'thumbnail',\n 'transcript',\n 'caption',\n 'structured'\n])\nexport type KnowledgeArtifactKind = Schema.Schema.Type<typeof KnowledgeArtifactKindSchema>\n\nexport const KnowledgeArtifactSchema = Schema.Struct({\n id: NonEmptyTrimmedString,\n recordId: NonEmptyTrimmedString,\n kind: KnowledgeArtifactKindSchema,\n storageKey: NonEmptyTrimmedString,\n mediaType: Schema.optional(NonEmptyTrimmedString),\n byteSize: Schema.optional(NonNegativeInteger),\n checksum: Schema.optional(NonEmptyTrimmedString),\n metadata: Schema.optional(KnowledgeMetadataSchema),\n createdAt: Schema.DateTimeUtc\n})\nexport type KnowledgeArtifact = Schema.Schema.Type<typeof KnowledgeArtifactSchema>\n\nexport type PutKnowledgeArtifactInput = {\n readonly storageKey: string\n readonly mediaType?: string\n readonly bytes: Uint8Array\n}\n\nexport type GetKnowledgeArtifactInput = {\n readonly storageKey: string\n}\n\nexport type KnowledgeArtifactStoreApi = {\n readonly putArtifact: (input: PutKnowledgeArtifactInput) => Effect.Effect<void, KnowledgeArtifactError>\n readonly getArtifact: (input: GetKnowledgeArtifactInput) => Effect.Effect<Uint8Array, KnowledgeArtifactError>\n readonly deleteArtifact: (input: GetKnowledgeArtifactInput) => Effect.Effect<void, KnowledgeArtifactError>\n}\n\nexport class KnowledgeArtifactStore extends Context.Service<KnowledgeArtifactStore, KnowledgeArtifactStoreApi>()(\n '@yolk-sdk/knowledge/KnowledgeArtifactStore'\n) {}\n"],"mappings":";;;;AAMA,MAAa,8BAA8BA,SAAO,SAAS;CACzD;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAGD,MAAa,0BAA0BA,SAAO,OAAO;CACnD,IAAI;CACJ,UAAU;CACV,MAAM;CACN,YAAY;CACZ,WAAWA,SAAO,SAAS,qBAAqB;CAChD,UAAUA,SAAO,SAAS,kBAAkB;CAC5C,UAAUA,SAAO,SAAS,qBAAqB;CAC/C,UAAUA,SAAO,SAAS,uBAAuB;CACjD,WAAWA,SAAO;AACpB,CAAC;AAmBD,IAAa,yBAAb,cAA4C,QAAQ,QAA2D,EAC7G,4CACF,EAAE,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { KnowledgeChunk, KnowledgeMetadata } from "./documents.mjs";
2
+ import { KnowledgeChunkingError } from "./errors.mjs";
3
+ import { Context, Effect, Layer } from "effect";
4
+
5
+ //#region src/chunking.d.ts
6
+ type ChunkKnowledgeDocumentInput = {
7
+ readonly collectionId: string;
8
+ readonly documentId: string;
9
+ readonly content: string;
10
+ readonly maxTokens?: number;
11
+ readonly metadata?: KnowledgeMetadata;
12
+ };
13
+ type KnowledgeChunkerApi = {
14
+ readonly chunk: (input: ChunkKnowledgeDocumentInput) => Effect.Effect<ReadonlyArray<KnowledgeChunk>, KnowledgeChunkingError>;
15
+ };
16
+ declare const KnowledgeChunker_base: Context.ServiceClass<KnowledgeChunker, "@yolk-sdk/knowledge/KnowledgeChunker", KnowledgeChunkerApi>;
17
+ declare class KnowledgeChunker extends KnowledgeChunker_base {}
18
+ declare const countKnowledgeChunkTokens: (text: string) => number;
19
+ declare const chunkKnowledgeText: (input: ChunkKnowledgeDocumentInput, maxTokens: number) => Effect.Effect<{
20
+ id: string;
21
+ collectionId: string;
22
+ documentId: string;
23
+ content: string;
24
+ position: number;
25
+ tokenCount: number;
26
+ metadata: {
27
+ readonly [x: string]: unknown;
28
+ } | undefined;
29
+ }[], KnowledgeChunkingError, never>;
30
+ declare const makeDefaultKnowledgeChunker: (input: {
31
+ readonly maxTokens: number;
32
+ }) => KnowledgeChunkerApi;
33
+ declare const DefaultKnowledgeChunkerLive: (input?: {
34
+ readonly maxTokens: number;
35
+ }) => Layer.Layer<KnowledgeChunker, never, never>;
36
+ //#endregion
37
+ export { ChunkKnowledgeDocumentInput, DefaultKnowledgeChunkerLive, KnowledgeChunker, KnowledgeChunkerApi, chunkKnowledgeText, countKnowledgeChunkTokens, makeDefaultKnowledgeChunker };
38
+ //# sourceMappingURL=chunking.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunking.d.mts","names":[],"sources":["../src/chunking.ts"],"mappings":";;;;;KASY,2BAAA;EAAA,SACD,YAAA;EAAA,SACA,UAAA;EAAA,SACA,OAAA;EAAA,SACA,SAAA;EAAA,SACA,QAAA,GAAW,iBAAiB;AAAA;AAAA,KAG3B,mBAAA;EAAA,SACD,KAAA,GACP,KAAA,EAAO,2BAAA,KACJ,MAAA,CAAO,MAAA,CAAO,aAAA,CAAc,cAAA,GAAiB,sBAAA;AAAA;AAAA,cACnD,qBAAA;cAEY,gBAAA,SAAyB,qBAErC;AAAA,cAEY,yBAAA,GAA6B,IAAY;AAAA,cA+GzC,kBAAA,GAAsB,KAAA,EAAO,2BAAA,EAA6B,SAAA,aAAiB,MAAA,CAAA,MAAA;;;;;;;;;;;cA+B3E,2BAAA,GAA+B,KAAA;EAAA,SAAkB,SAAA;AAAA,MAAsB,mBAElF;AAAA,cAEW,2BAAA,GAA+B,KAAA;EAAA,SAAkB,SAAA;AAAA,MAAwC,KAAA,CAAA,KAAA,CAAA,gBAAA"}
@@ -0,0 +1,93 @@
1
+ import { KnowledgeChunkingError } from "./errors.mjs";
2
+ import { Context, Effect, Layer } from "effect";
3
+ import { countTokens, decode, encode } from "gpt-tokenizer/encoding/o200k_base";
4
+ //#region src/chunking.ts
5
+ const SENTENCE_PATTERN = /[^.!?]+[.!?]+(?:["')\]]+)?\s*|[^.!?]+$/g;
6
+ const PARAGRAPH_BREAK_PATTERN = /(\n{2,})/;
7
+ const WORD_PATTERN = /\S+\s*/g;
8
+ var KnowledgeChunker = class extends Context.Service()("@yolk-sdk/knowledge/KnowledgeChunker") {};
9
+ const countKnowledgeChunkTokens = (text) => countTokens(text);
10
+ const sanitizeText = (text) => text.replace(/\r\n/g, "\n").replace(/[\t ]+/g, " ").replace(/\n{3,}/g, "\n\n").trim();
11
+ const splitSentences = (text) => text.split(PARAGRAPH_BREAK_PATTERN).flatMap((part) => {
12
+ if (part.length === 0) return [];
13
+ if (/^\n{2,}$/.test(part)) return ["\n\n"];
14
+ return part.match(SENTENCE_PATTERN) ?? [part];
15
+ }).filter((unit) => unit.length > 0);
16
+ const splitEncodedTokens = (text, maxTokens) => {
17
+ const tokens = encode(text);
18
+ return Array.from({ length: Math.ceil(tokens.length / maxTokens) }, (_, index) => decode(tokens.slice(index * maxTokens, index * maxTokens + maxTokens)).trim()).filter((chunk) => chunk.length > 0);
19
+ };
20
+ const splitOversizedUnit = (text, maxTokens) => {
21
+ const words = text.match(WORD_PATTERN) ?? [];
22
+ const chunks = [];
23
+ let current = "";
24
+ let currentTokenCount = 0;
25
+ for (const word of words) {
26
+ const wordTokenCount = countTokens(word);
27
+ if (wordTokenCount > maxTokens) {
28
+ const currentChunk = current.trim();
29
+ if (currentChunk.length > 0) chunks.push(currentChunk);
30
+ chunks.push(...splitEncodedTokens(word, maxTokens));
31
+ current = "";
32
+ currentTokenCount = 0;
33
+ continue;
34
+ }
35
+ if (currentTokenCount > 0 && currentTokenCount + wordTokenCount > maxTokens) {
36
+ const currentChunk = current.trim();
37
+ if (currentChunk.length > 0) chunks.push(currentChunk);
38
+ current = word;
39
+ currentTokenCount = wordTokenCount;
40
+ continue;
41
+ }
42
+ current = `${current}${word}`;
43
+ currentTokenCount += wordTokenCount;
44
+ }
45
+ const finalChunk = current.trim();
46
+ if (finalChunk.length > 0) chunks.push(finalChunk);
47
+ return chunks;
48
+ };
49
+ const splitUnitsBySize = (units, maxTokens) => units.flatMap((unit) => countTokens(unit) <= maxTokens ? [unit] : splitOversizedUnit(unit, maxTokens));
50
+ const buildChunkContents = (units, maxTokens) => {
51
+ const chunks = [];
52
+ let current = "";
53
+ let currentTokenCount = 0;
54
+ const pushCurrent = () => {
55
+ const content = current.trim();
56
+ if (content.length > 0) chunks.push(content);
57
+ };
58
+ for (const unit of units) {
59
+ const unitTokenCount = countTokens(unit);
60
+ if (currentTokenCount > 0 && currentTokenCount + unitTokenCount > maxTokens) {
61
+ pushCurrent();
62
+ current = unit;
63
+ currentTokenCount = unitTokenCount;
64
+ continue;
65
+ }
66
+ current = `${current}${unit}`;
67
+ currentTokenCount += unitTokenCount;
68
+ }
69
+ pushCurrent();
70
+ return chunks;
71
+ };
72
+ const chunkKnowledgeText = (input, maxTokens) => Effect.gen(function* () {
73
+ if (!Number.isInteger(maxTokens) || maxTokens < 1) return yield* Effect.fail(new KnowledgeChunkingError({ message: "Chunk maxTokens must be a positive integer" }));
74
+ const sanitized = sanitizeText(input.content);
75
+ if (sanitized.length === 0) return yield* Effect.fail(new KnowledgeChunkingError({ message: "Cannot chunk empty content" }));
76
+ const contents = buildChunkContents(splitUnitsBySize(splitSentences(sanitized), maxTokens), maxTokens);
77
+ if (contents.length === 0) return yield* Effect.fail(new KnowledgeChunkingError({ message: "No chunks produced" }));
78
+ return contents.map((content, position) => ({
79
+ id: `${input.documentId}:chunk:${position}`,
80
+ collectionId: input.collectionId,
81
+ documentId: input.documentId,
82
+ content,
83
+ position,
84
+ tokenCount: countTokens(content),
85
+ metadata: input.metadata
86
+ }));
87
+ });
88
+ const makeDefaultKnowledgeChunker = (input) => ({ chunk: (document) => chunkKnowledgeText(document, document.maxTokens ?? input.maxTokens) });
89
+ const DefaultKnowledgeChunkerLive = (input = { maxTokens: 512 }) => Layer.succeed(KnowledgeChunker, makeDefaultKnowledgeChunker(input));
90
+ //#endregion
91
+ export { DefaultKnowledgeChunkerLive, KnowledgeChunker, chunkKnowledgeText, countKnowledgeChunkTokens, makeDefaultKnowledgeChunker };
92
+
93
+ //# sourceMappingURL=chunking.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunking.mjs","names":[],"sources":["../src/chunking.ts"],"sourcesContent":["import { Context, Effect, Layer } from 'effect'\nimport { countTokens, decode, encode } from 'gpt-tokenizer/encoding/o200k_base'\nimport type { KnowledgeChunk, KnowledgeMetadata } from './documents.ts'\nimport { KnowledgeChunkingError } from './errors.ts'\n\nconst SENTENCE_PATTERN = /[^.!?]+[.!?]+(?:[\"')\\]]+)?\\s*|[^.!?]+$/g\nconst PARAGRAPH_BREAK_PATTERN = /(\\n{2,})/\nconst WORD_PATTERN = /\\S+\\s*/g\n\nexport type ChunkKnowledgeDocumentInput = {\n readonly collectionId: string\n readonly documentId: string\n readonly content: string\n readonly maxTokens?: number\n readonly metadata?: KnowledgeMetadata\n}\n\nexport type KnowledgeChunkerApi = {\n readonly chunk: (\n input: ChunkKnowledgeDocumentInput\n ) => Effect.Effect<ReadonlyArray<KnowledgeChunk>, KnowledgeChunkingError>\n}\n\nexport class KnowledgeChunker extends Context.Service<KnowledgeChunker, KnowledgeChunkerApi>()(\n '@yolk-sdk/knowledge/KnowledgeChunker'\n) {}\n\nexport const countKnowledgeChunkTokens = (text: string) => countTokens(text)\n\nconst sanitizeText = (text: string) =>\n text\n .replace(/\\r\\n/g, '\\n')\n .replace(/[\\t ]+/g, ' ')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()\n\nconst splitSentences = (text: string) =>\n text\n .split(PARAGRAPH_BREAK_PATTERN)\n .flatMap(part => {\n if (part.length === 0) {\n return []\n }\n\n if (/^\\n{2,}$/.test(part)) {\n return ['\\n\\n']\n }\n\n return part.match(SENTENCE_PATTERN) ?? [part]\n })\n .filter(unit => unit.length > 0)\n\nconst splitEncodedTokens = (text: string, maxTokens: number) => {\n const tokens = encode(text)\n return Array.from({ length: Math.ceil(tokens.length / maxTokens) }, (_, index) =>\n decode(tokens.slice(index * maxTokens, index * maxTokens + maxTokens)).trim()\n ).filter(chunk => chunk.length > 0)\n}\n\nconst splitOversizedUnit = (text: string, maxTokens: number) => {\n const words = text.match(WORD_PATTERN) ?? []\n const chunks: string[] = []\n let current = ''\n let currentTokenCount = 0\n\n for (const word of words) {\n const wordTokenCount = countTokens(word)\n\n if (wordTokenCount > maxTokens) {\n const currentChunk = current.trim()\n if (currentChunk.length > 0) {\n chunks.push(currentChunk)\n }\n\n chunks.push(...splitEncodedTokens(word, maxTokens))\n current = ''\n currentTokenCount = 0\n continue\n }\n\n if (currentTokenCount > 0 && currentTokenCount + wordTokenCount > maxTokens) {\n const currentChunk = current.trim()\n if (currentChunk.length > 0) {\n chunks.push(currentChunk)\n }\n\n current = word\n currentTokenCount = wordTokenCount\n continue\n }\n\n current = `${current}${word}`\n currentTokenCount += wordTokenCount\n }\n\n const finalChunk = current.trim()\n if (finalChunk.length > 0) {\n chunks.push(finalChunk)\n }\n\n return chunks\n}\n\nconst splitUnitsBySize = (units: ReadonlyArray<string>, maxTokens: number) =>\n units.flatMap(unit =>\n countTokens(unit) <= maxTokens ? [unit] : splitOversizedUnit(unit, maxTokens)\n )\n\nconst buildChunkContents = (units: ReadonlyArray<string>, maxTokens: number) => {\n const chunks: string[] = []\n let current = ''\n let currentTokenCount = 0\n\n const pushCurrent = () => {\n const content = current.trim()\n if (content.length > 0) {\n chunks.push(content)\n }\n }\n\n for (const unit of units) {\n const unitTokenCount = countTokens(unit)\n\n if (currentTokenCount > 0 && currentTokenCount + unitTokenCount > maxTokens) {\n pushCurrent()\n current = unit\n currentTokenCount = unitTokenCount\n continue\n }\n\n current = `${current}${unit}`\n currentTokenCount += unitTokenCount\n }\n\n pushCurrent()\n return chunks\n}\n\nexport const chunkKnowledgeText = (input: ChunkKnowledgeDocumentInput, maxTokens: number) =>\n Effect.gen(function* () {\n if (!Number.isInteger(maxTokens) || maxTokens < 1) {\n return yield* Effect.fail(\n new KnowledgeChunkingError({ message: 'Chunk maxTokens must be a positive integer' })\n )\n }\n\n const sanitized = sanitizeText(input.content)\n if (sanitized.length === 0) {\n return yield* Effect.fail(new KnowledgeChunkingError({ message: 'Cannot chunk empty content' }))\n }\n\n const units = splitUnitsBySize(splitSentences(sanitized), maxTokens)\n const contents = buildChunkContents(units, maxTokens)\n\n if (contents.length === 0) {\n return yield* Effect.fail(new KnowledgeChunkingError({ message: 'No chunks produced' }))\n }\n\n return contents.map((content, position) => ({\n id: `${input.documentId}:chunk:${position}`,\n collectionId: input.collectionId,\n documentId: input.documentId,\n content,\n position,\n tokenCount: countTokens(content),\n metadata: input.metadata\n })) satisfies ReadonlyArray<KnowledgeChunk>\n })\n\nexport const makeDefaultKnowledgeChunker = (input: { readonly maxTokens: number }): KnowledgeChunkerApi => ({\n chunk: document => chunkKnowledgeText(document, document.maxTokens ?? input.maxTokens)\n})\n\nexport const DefaultKnowledgeChunkerLive = (input: { readonly maxTokens: number } = { maxTokens: 512 }) =>\n Layer.succeed(KnowledgeChunker, makeDefaultKnowledgeChunker(input))\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { KnowledgeRecord } from "./records.mjs";
2
+ import { KnowledgeRepresentation } from "./representations.mjs";
3
+
4
+ //#region src/context.d.ts
5
+ type KnowledgeContextItem = {
6
+ readonly record: KnowledgeRecord;
7
+ readonly representation?: KnowledgeRepresentation;
8
+ };
9
+ type BuildKnowledgeContextInput = {
10
+ readonly items: ReadonlyArray<KnowledgeContextItem>;
11
+ readonly maxCharacters: number;
12
+ };
13
+ declare const buildKnowledgeContext: (input: BuildKnowledgeContextInput) => string;
14
+ //#endregion
15
+ export { BuildKnowledgeContextInput, KnowledgeContextItem, buildKnowledgeContext };
16
+ //# sourceMappingURL=context.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.mts","names":[],"sources":["../src/context.ts"],"mappings":";;;;KAIY,oBAAA;EAAA,SACD,MAAA,EAAQ,eAAA;EAAA,SACR,cAAA,GAAiB,uBAAuB;AAAA;AAAA,KAGvC,0BAAA;EAAA,SACD,KAAA,EAAO,aAAa,CAAC,oBAAA;EAAA,SACrB,aAAA;AAAA;AAAA,cAeE,qBAAA,GAAyB,KAAiC,EAA1B,0BAA0B"}
@@ -0,0 +1,25 @@
1
+ import { Array } from "effect";
2
+ //#region src/context.ts
3
+ const truncationMarker = "\n\n[truncated: pinned knowledge exceeded context budget]";
4
+ const recordHeader = (record) => `## ${record.title}\nrole: ${record.role}\nstatus: ${record.status}\ncontext: ${record.contextPolicy}`;
5
+ const itemBody = (item) => {
6
+ const representationText = item.representation?.summary ?? item.representation?.contentText;
7
+ return [
8
+ recordHeader(item.record),
9
+ item.record.summary,
10
+ representationText
11
+ ].filter((section) => section !== void 0 && section.trim().length > 0).join("\n");
12
+ };
13
+ const buildKnowledgeContext = (input) => {
14
+ const sections = Array.map(input.items, itemBody).filter((section) => section.trim().length > 0);
15
+ const header = "# Pinned knowledge\nUse this durable user knowledge as high-priority context. Cite knowledge records when relevant.";
16
+ const body = sections.join("\n\n");
17
+ const context = body.length === 0 ? "" : `${header}\n\n${body}`;
18
+ if (context.length <= input.maxCharacters) return context;
19
+ if (input.maxCharacters <= 55) return context.slice(0, input.maxCharacters).trimEnd();
20
+ return `${context.slice(0, input.maxCharacters - 55).trimEnd()}${truncationMarker}`;
21
+ };
22
+ //#endregion
23
+ export { buildKnowledgeContext };
24
+
25
+ //# sourceMappingURL=context.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.mjs","names":["Arr"],"sources":["../src/context.ts"],"sourcesContent":["import { Array as Arr } from 'effect'\nimport type { KnowledgeRecord } from './records.ts'\nimport type { KnowledgeRepresentation } from './representations.ts'\n\nexport type KnowledgeContextItem = {\n readonly record: KnowledgeRecord\n readonly representation?: KnowledgeRepresentation\n}\n\nexport type BuildKnowledgeContextInput = {\n readonly items: ReadonlyArray<KnowledgeContextItem>\n readonly maxCharacters: number\n}\n\nconst truncationMarker = '\\n\\n[truncated: pinned knowledge exceeded context budget]'\n\nconst recordHeader = (record: KnowledgeRecord) =>\n `## ${record.title}\\nrole: ${record.role}\\nstatus: ${record.status}\\ncontext: ${record.contextPolicy}`\n\nconst itemBody = (item: KnowledgeContextItem) => {\n const representationText = item.representation?.summary ?? item.representation?.contentText\n return [recordHeader(item.record), item.record.summary, representationText]\n .filter(section => section !== undefined && section.trim().length > 0)\n .join('\\n')\n}\n\nexport const buildKnowledgeContext = (input: BuildKnowledgeContextInput) => {\n const sections = Arr.map(input.items, itemBody).filter(section => section.trim().length > 0)\n const header = '# Pinned knowledge\\nUse this durable user knowledge as high-priority context. Cite knowledge records when relevant.'\n const body = sections.join('\\n\\n')\n const context = body.length === 0 ? '' : `${header}\\n\\n${body}`\n\n if (context.length <= input.maxCharacters) {\n return context\n }\n\n if (input.maxCharacters <= truncationMarker.length) {\n return context.slice(0, input.maxCharacters).trimEnd()\n }\n\n return `${context.slice(0, input.maxCharacters - truncationMarker.length).trimEnd()}${truncationMarker}`\n}\n"],"mappings":";;AAcA,MAAM,mBAAmB;AAEzB,MAAM,gBAAgB,WACpB,MAAM,OAAO,MAAM,UAAU,OAAO,KAAK,YAAY,OAAO,OAAO,aAAa,OAAO;AAEzF,MAAM,YAAY,SAA+B;CAC/C,MAAM,qBAAqB,KAAK,gBAAgB,WAAW,KAAK,gBAAgB;CAChF,OAAO;EAAC,aAAa,KAAK,MAAM;EAAG,KAAK,OAAO;EAAS;CAAkB,EACvE,QAAO,YAAW,YAAY,KAAA,KAAa,QAAQ,KAAK,EAAE,SAAS,CAAC,EACpE,KAAK,IAAI;AACd;AAEA,MAAa,yBAAyB,UAAsC;CAC1E,MAAM,WAAWA,MAAI,IAAI,MAAM,OAAO,QAAQ,EAAE,QAAO,YAAW,QAAQ,KAAK,EAAE,SAAS,CAAC;CAC3F,MAAM,SAAS;CACf,MAAM,OAAO,SAAS,KAAK,MAAM;CACjC,MAAM,UAAU,KAAK,WAAW,IAAI,KAAK,GAAG,OAAO,MAAM;CAEzD,IAAI,QAAQ,UAAU,MAAM,eAC1B,OAAO;CAGT,IAAI,MAAM,iBAAiB,IACzB,OAAO,QAAQ,MAAM,GAAG,MAAM,aAAa,EAAE,QAAQ;CAGvD,OAAO,GAAG,QAAQ,MAAM,GAAG,MAAM,gBAAgB,EAAuB,EAAE,QAAQ,IAAI;AACxF"}
@@ -0,0 +1,105 @@
1
+ import { Schema } from "effect";
2
+
3
+ //#region src/documents.d.ts
4
+ declare const KnowledgeMetadataSchema: Schema.$Record<Schema.String, Schema.Unknown>;
5
+ type KnowledgeMetadata = Schema.Schema.Type<typeof KnowledgeMetadataSchema>;
6
+ declare const KnowledgeDocumentStatusSchema: Schema.Literals<readonly ["pending", "processing", "ready", "error"]>;
7
+ type KnowledgeDocumentStatus = Schema.Schema.Type<typeof KnowledgeDocumentStatusSchema>;
8
+ declare const KnowledgeSourceSchema: Schema.Union<readonly [Schema.Struct<{
9
+ readonly _tag: Schema.Literal<"File">;
10
+ readonly ref: Schema.Trimmed;
11
+ readonly name: Schema.optional<Schema.Trimmed>;
12
+ readonly mediaType: Schema.optional<Schema.Trimmed>;
13
+ }>, Schema.Struct<{
14
+ readonly _tag: Schema.Literal<"Url">;
15
+ readonly url: Schema.Trimmed;
16
+ }>, Schema.Struct<{
17
+ readonly _tag: Schema.Literal<"Text">;
18
+ readonly label: Schema.optional<Schema.Trimmed>;
19
+ }>]>;
20
+ type KnowledgeSource = Schema.Schema.Type<typeof KnowledgeSourceSchema>;
21
+ declare const KnowledgeEmbeddingConfigSchema: Schema.Struct<{
22
+ readonly model: Schema.Trimmed;
23
+ readonly dimensions: Schema.Int;
24
+ }>;
25
+ type KnowledgeEmbeddingConfig = Schema.Schema.Type<typeof KnowledgeEmbeddingConfigSchema>;
26
+ declare const KnowledgeChunkingConfigSchema: Schema.Struct<{
27
+ readonly strategy: Schema.Literal<"sentence-token">;
28
+ readonly maxTokens: Schema.Int;
29
+ }>;
30
+ type KnowledgeChunkingConfig = Schema.Schema.Type<typeof KnowledgeChunkingConfigSchema>;
31
+ declare const KnowledgeCollectionSchema: Schema.Struct<{
32
+ readonly id: Schema.Trimmed;
33
+ readonly label: Schema.optional<Schema.Trimmed>;
34
+ readonly embeddingConfig: Schema.Struct<{
35
+ readonly model: Schema.Trimmed;
36
+ readonly dimensions: Schema.Int;
37
+ }>;
38
+ readonly chunkingConfig: Schema.Struct<{
39
+ readonly strategy: Schema.Literal<"sentence-token">;
40
+ readonly maxTokens: Schema.Int;
41
+ }>;
42
+ readonly metadata: Schema.optional<Schema.$Record<Schema.String, Schema.Unknown>>;
43
+ }>;
44
+ type KnowledgeCollection = Schema.Schema.Type<typeof KnowledgeCollectionSchema>;
45
+ declare const KnowledgeDocumentSchema: Schema.Struct<{
46
+ readonly id: Schema.Trimmed;
47
+ readonly collectionId: Schema.Trimmed;
48
+ readonly source: Schema.Union<readonly [Schema.Struct<{
49
+ readonly _tag: Schema.Literal<"File">;
50
+ readonly ref: Schema.Trimmed;
51
+ readonly name: Schema.optional<Schema.Trimmed>;
52
+ readonly mediaType: Schema.optional<Schema.Trimmed>;
53
+ }>, Schema.Struct<{
54
+ readonly _tag: Schema.Literal<"Url">;
55
+ readonly url: Schema.Trimmed;
56
+ }>, Schema.Struct<{
57
+ readonly _tag: Schema.Literal<"Text">;
58
+ readonly label: Schema.optional<Schema.Trimmed>;
59
+ }>]>;
60
+ readonly status: Schema.Literals<readonly ["pending", "processing", "ready", "error"]>;
61
+ readonly title: Schema.optional<Schema.Trimmed>;
62
+ readonly summary: Schema.optional<Schema.String>;
63
+ readonly errorMessage: Schema.optional<Schema.String>;
64
+ readonly contentHash: Schema.optional<Schema.Trimmed>;
65
+ readonly tokenCount: Schema.optional<Schema.Int>;
66
+ readonly chunkCount: Schema.optional<Schema.Int>;
67
+ readonly metadata: Schema.optional<Schema.$Record<Schema.String, Schema.Unknown>>;
68
+ }>;
69
+ type KnowledgeDocument = Schema.Schema.Type<typeof KnowledgeDocumentSchema>;
70
+ declare const KnowledgeChunkSchema: Schema.Struct<{
71
+ readonly id: Schema.Trimmed;
72
+ readonly collectionId: Schema.Trimmed;
73
+ readonly documentId: Schema.Trimmed;
74
+ readonly content: Schema.Trimmed;
75
+ readonly position: Schema.Int;
76
+ readonly tokenCount: Schema.Int;
77
+ readonly metadata: Schema.optional<Schema.$Record<Schema.String, Schema.Unknown>>;
78
+ }>;
79
+ type KnowledgeChunk = Schema.Schema.Type<typeof KnowledgeChunkSchema>;
80
+ declare const ExtractedKnowledgeDocumentSchema: Schema.Struct<{
81
+ readonly content: Schema.Trimmed;
82
+ readonly title: Schema.optional<Schema.Trimmed>;
83
+ readonly summary: Schema.optional<Schema.String>;
84
+ readonly metadata: Schema.optional<Schema.$Record<Schema.String, Schema.Unknown>>;
85
+ }>;
86
+ type ExtractedKnowledgeDocument = Schema.Schema.Type<typeof ExtractedKnowledgeDocumentSchema>;
87
+ declare const KnowledgeSearchScopeSchema: Schema.Union<readonly [Schema.Struct<{
88
+ readonly _tag: Schema.Literal<"KnowledgeCollection">;
89
+ readonly id: Schema.Trimmed;
90
+ }>, Schema.Struct<{
91
+ readonly _tag: Schema.Literal<"KnowledgeCollections">;
92
+ readonly ids: Schema.$Array<Schema.Trimmed>;
93
+ }>]>;
94
+ type KnowledgeSearchScope = Schema.Schema.Type<typeof KnowledgeSearchScopeSchema>;
95
+ declare const defaultKnowledgeChunkingConfig: KnowledgeChunkingConfig;
96
+ declare const makeKnowledgeCollection: (input: {
97
+ readonly id: string;
98
+ readonly label?: string;
99
+ readonly embeddingConfig: KnowledgeEmbeddingConfig;
100
+ readonly chunkingConfig?: KnowledgeChunkingConfig;
101
+ readonly metadata?: KnowledgeMetadata;
102
+ }) => KnowledgeCollection;
103
+ //#endregion
104
+ export { ExtractedKnowledgeDocument, ExtractedKnowledgeDocumentSchema, KnowledgeChunk, KnowledgeChunkSchema, KnowledgeChunkingConfig, KnowledgeChunkingConfigSchema, KnowledgeCollection, KnowledgeCollectionSchema, KnowledgeDocument, KnowledgeDocumentSchema, KnowledgeDocumentStatus, KnowledgeDocumentStatusSchema, KnowledgeEmbeddingConfig, KnowledgeEmbeddingConfigSchema, KnowledgeMetadata, KnowledgeMetadataSchema, KnowledgeSearchScope, KnowledgeSearchScopeSchema, KnowledgeSource, KnowledgeSourceSchema, defaultKnowledgeChunkingConfig, makeKnowledgeCollection };
105
+ //# sourceMappingURL=documents.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.d.mts","names":[],"sources":["../src/documents.ts"],"mappings":";;;cAMa,uBAAA,EAAuB,MAAA,CAAA,OAAA,CAAA,MAAA,CAAA,MAAA,EAAA,MAAA,CAAA,OAAA;AAAA,KACxB,iBAAA,GAAoB,MAAA,CAAO,MAAA,CAAO,IAAI,QAAQ,uBAAA;AAAA,cAE7C,6BAAA,EAA6B,MAAA,CAAA,QAAA;AAAA,KAC9B,uBAAA,GAA0B,MAAA,CAAO,MAAA,CAAO,IAAI,QAAQ,6BAAA;AAAA,cAEnD,qBAAA,EAAqB,MAAA,CAAA,KAAA,WAAA,MAAA,CAAA,MAAA;EAAA;;;;;;;;;;;KAgBtB,eAAA,GAAkB,MAAA,CAAO,MAAA,CAAO,IAAI,QAAQ,qBAAA;AAAA,cAE3C,8BAAA,EAA8B,MAAA,CAAA,MAAA;EAAA;;;KAI/B,wBAAA,GAA2B,MAAA,CAAO,MAAA,CAAO,IAAI,QAAQ,8BAAA;AAAA,cAEpD,6BAAA,EAA6B,MAAA,CAAA,MAAA;EAAA;;;KAI9B,uBAAA,GAA0B,MAAA,CAAO,MAAA,CAAO,IAAI,QAAQ,6BAAA;AAAA,cAEnD,yBAAA,EAAyB,MAAA,CAAA,MAAA;EAAA;;;;;;;;;;;;KAO1B,mBAAA,GAAsB,MAAA,CAAO,MAAA,CAAO,IAAI,QAAQ,yBAAA;AAAA,cAE/C,uBAAA,EAAuB,MAAA,CAAA,MAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;KAaxB,iBAAA,GAAoB,MAAA,CAAO,MAAA,CAAO,IAAI,QAAQ,uBAAA;AAAA,cAE7C,oBAAA,EAAoB,MAAA,CAAA,MAAA;EAAA;;;;;;;;KASrB,cAAA,GAAiB,MAAA,CAAO,MAAA,CAAO,IAAI,QAAQ,oBAAA;AAAA,cAE1C,gCAAA,EAAgC,MAAA,CAAA,MAAA;EAAA;;;;;KAMjC,0BAAA,GAA6B,MAAA,CAAO,MAAA,CAAO,IAAI,QAAQ,gCAAA;AAAA,cAEtD,0BAAA,EAA0B,MAAA,CAAA,KAAA,WAAA,MAAA,CAAA,MAAA;EAAA;;;;;;KAI3B,oBAAA,GAAuB,MAAA,CAAO,MAAA,CAAO,IAAI,QAAQ,0BAAA;AAAA,cAEhD,8BAAA,EAAgC,uBAG5C;AAAA,cAEY,uBAAA,GAA2B,KAAA;EAAA,SAC7B,EAAA;EAAA,SACA,KAAA;EAAA,SACA,eAAA,EAAiB,wBAAA;EAAA,SACjB,cAAA,GAAiB,uBAAA;EAAA,SACjB,QAAA,GAAW,iBAAA;AAAA,MAClB,mBAAA"}