kernl 0.8.0 → 0.8.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.
- package/.turbo/turbo-build.log +5 -4
- package/CHANGELOG.md +15 -0
- package/dist/memory/__tests__/encoder.test.js +3 -2
- package/dist/memory/codecs/domain.d.ts +2 -1
- package/dist/memory/codecs/domain.d.ts.map +1 -1
- package/dist/memory/codecs/domain.js +2 -2
- package/dist/memory/codecs/tpuf.d.ts.map +1 -1
- package/dist/memory/codecs/tpuf.js +2 -5
- package/dist/memory/handle.d.ts.map +1 -1
- package/dist/memory/handle.js +3 -1
- package/dist/memory/schema.d.ts.map +1 -1
- package/dist/memory/schema.js +0 -4
- package/dist/memory/types.d.ts +1 -1
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/thread/__tests__/integration.test.d.ts +1 -1
- package/dist/thread/__tests__/integration.test.d.ts.map +1 -1
- package/dist/thread/__tests__/integration.test.js +10 -5
- package/dist/tool/sys/memory.d.ts.map +1 -1
- package/dist/tool/sys/memory.js +3 -0
- package/package.json +1 -1
- package/src/memory/__tests__/encoder.test.ts +3 -2
- package/src/memory/codecs/domain.ts +2 -2
- package/src/memory/codecs/tpuf.ts +2 -5
- package/src/memory/handle.ts +2 -1
- package/src/memory/schema.ts +0 -5
- package/src/memory/types.ts +1 -1
- package/src/tool/sys/memory.ts +3 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
>
|
|
4
|
-
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
> kernl@0.8.1 build /Users/andjones/Documents/projects/kernl/packages/kernl
|
|
4
|
+
> tsc && tsc-alias --resolve-full-paths
|
|
5
|
+
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# @kernl/core
|
|
2
2
|
|
|
3
|
+
## 0.8.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- fix: handle postgres duplicate key error when index already exists
|
|
8
|
+
- fix: include object content and collection in memory search/list results
|
|
9
|
+
|
|
10
|
+
## 0.8.1
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- 86fad68: Drop metadata from search index projection
|
|
15
|
+
|
|
16
|
+
Metadata now lives only in the primary DB, not the search index. This fixes Turbopuffer serialization errors with nested objects and simplifies the index schema.
|
|
17
|
+
|
|
3
18
|
## 0.8.0
|
|
4
19
|
|
|
5
20
|
### Minor Changes
|
|
@@ -88,7 +88,7 @@ describe("MemoryByteEncoder", () => {
|
|
|
88
88
|
expect(embedCall.values[0]).toContain("Tony likes coffee");
|
|
89
89
|
expect(embedCall.values[0]).toContain("shots: 2");
|
|
90
90
|
});
|
|
91
|
-
it("does not
|
|
91
|
+
it("does not include metadata (lives in primary DB only)", async () => {
|
|
92
92
|
const embedder = createMockEmbedder();
|
|
93
93
|
const encoder = new MemoryByteEncoder(embedder);
|
|
94
94
|
const byte = {
|
|
@@ -96,7 +96,8 @@ describe("MemoryByteEncoder", () => {
|
|
|
96
96
|
object: { key: "value" },
|
|
97
97
|
};
|
|
98
98
|
const result = await encoder.encode(byte);
|
|
99
|
-
|
|
99
|
+
// metadata is not part of IndexableByte - it stays in the primary DB
|
|
100
|
+
expect("metadata" in result).toBe(false);
|
|
100
101
|
});
|
|
101
102
|
it("returns undefined tvec when no content", async () => {
|
|
102
103
|
const embedder = createMockEmbedder();
|
|
@@ -25,7 +25,8 @@ export declare const MEMORY_FILTER: Codec<MemoryFilter, SearchFilter>;
|
|
|
25
25
|
* Combines:
|
|
26
26
|
* - Record scope/timestamps from MemoryRecord
|
|
27
27
|
* - Indexed content (text, object projection, embeddings) from byte codec
|
|
28
|
-
*
|
|
28
|
+
*
|
|
29
|
+
* Note: metadata is NOT included - it lives in the primary DB only.
|
|
29
30
|
*/
|
|
30
31
|
export declare function recordCodec(bytecodec: MemoryByteCodec): AsyncCodec<MemoryRecord, IndexMemoryRecord>;
|
|
31
32
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../../src/memory/codecs/domain.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EAChB,MAAM,UAAU,CAAC;AAElB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,YAAY,EAAE,YAAY,CA0B3D,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../../src/memory/codecs/domain.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EAChB,MAAM,UAAU,CAAC;AAElB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,YAAY,EAAE,YAAY,CA0B3D,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,eAAe,GACzB,UAAU,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAqB7C;AAED;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,kBAAkB,EAAE,sBAAsB,CAqBzE,CAAC"}
|
|
@@ -48,7 +48,8 @@ export const MEMORY_FILTER = {
|
|
|
48
48
|
* Combines:
|
|
49
49
|
* - Record scope/timestamps from MemoryRecord
|
|
50
50
|
* - Indexed content (text, object projection, embeddings) from byte codec
|
|
51
|
-
*
|
|
51
|
+
*
|
|
52
|
+
* Note: metadata is NOT included - it lives in the primary DB only.
|
|
52
53
|
*/
|
|
53
54
|
export function recordCodec(bytecodec) {
|
|
54
55
|
return {
|
|
@@ -65,7 +66,6 @@ export function recordCodec(bytecodec) {
|
|
|
65
66
|
createdAt: record.createdAt,
|
|
66
67
|
updatedAt: record.updatedAt,
|
|
67
68
|
...indexable,
|
|
68
|
-
metadata: record.metadata ?? null, // user metadata, not content.object
|
|
69
69
|
};
|
|
70
70
|
},
|
|
71
71
|
async decode() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tpuf.d.ts","sourceRoot":"","sources":["../../../src/memory/codecs/tpuf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EAEX,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,iBAAiB,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"tpuf.d.ts","sourceRoot":"","sources":["../../../src/memory/codecs/tpuf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EAEX,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,iBAAiB,EAAE,eAAe,CAe9D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,KAAK,CAC7B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAC3B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAmB5B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,WAAW,EAAE,WAAW,CA6BtD,CAAC"}
|
|
@@ -18,11 +18,8 @@
|
|
|
18
18
|
*/
|
|
19
19
|
export const TPUF_DOC = {
|
|
20
20
|
encode(doc) {
|
|
21
|
-
const { tvec, ivec, avec, vvec,
|
|
22
|
-
const row = {
|
|
23
|
-
...rest,
|
|
24
|
-
metadata: metadata, // metadata is JSONObject | null, cast to FieldValue for UnknownDocument
|
|
25
|
-
};
|
|
21
|
+
const { tvec, ivec, avec, vvec, ...rest } = doc;
|
|
22
|
+
const row = { ...rest };
|
|
26
23
|
if (tvec)
|
|
27
24
|
row.vector = tvec;
|
|
28
25
|
return row;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle.d.ts","sourceRoot":"","sources":["../../src/memory/handle.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,WAAW,EAGjB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,KAAK,EAAE,WAAW,CAAC;IAEnB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEpC;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED;;;;;;GAMG;AACH,qBAAa,iBAAkB,YAAW,WAAW,CAAC,iBAAiB,CAAC;IACtE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAA0B;IAE3D,OAAO,CAAC,WAAW,CAA8B;gBAErC,MAAM,EAAE,uBAAuB;IAS3C;;;;OAIG;YACW,UAAU;IAUxB;;OAEG;YACW,WAAW;
|
|
1
|
+
{"version":3,"file":"handle.d.ts","sourceRoot":"","sources":["../../src/memory/handle.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,WAAW,EAGjB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,KAAK,EAAE,WAAW,CAAC;IAEnB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEpC;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED;;;;;;GAMG;AACH,qBAAa,iBAAkB,YAAW,WAAW,CAAC,iBAAiB,CAAC;IACtE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAA0B;IAE3D,OAAO,CAAC,WAAW,CAA8B;gBAErC,MAAM,EAAE,uBAAuB;IAS3C;;;;OAIG;YACW,UAAU;IAUxB;;OAEG;YACW,WAAW;IAsBzB;;;;;OAKG;IACG,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAevE;;OAEG;IACG,MAAM,CACV,IAAI,EAAE,iBAAiB,GAAG,iBAAiB,EAAE,GAC5C,OAAO,CAAC,YAAY,CAAC;IAOxB;;;;;OAKG;IACG,KAAK,CACT,OAAO,EACH,aAAa,CAAC,iBAAiB,CAAC,GAChC,aAAa,CAAC,iBAAiB,CAAC,EAAE,GACrC,OAAO,CAAC,WAAW,CAAC;IAKvB;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAK3D;;;;OAIG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAInE;;;;;OAKG;YACW,MAAM;CAIrB"}
|
package/dist/memory/handle.js
CHANGED
|
@@ -56,7 +56,9 @@ export class MemoryIndexHandle {
|
|
|
56
56
|
//
|
|
57
57
|
// Ignore "already exists" errors
|
|
58
58
|
if (err.message?.includes("already exists") ||
|
|
59
|
-
err.message?.includes("AlreadyExists")
|
|
59
|
+
err.message?.includes("AlreadyExists") ||
|
|
60
|
+
err.code === "23505" // postgres unique constraint violation
|
|
61
|
+
) {
|
|
60
62
|
return;
|
|
61
63
|
}
|
|
62
64
|
throw err;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/memory/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,UAAU,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,aAAa,CAAC;CACrD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/memory/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,UAAU,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,aAAa,CAAC;CACrD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAgG7B"}
|
package/dist/memory/schema.js
CHANGED
package/dist/memory/types.d.ts
CHANGED
|
@@ -48,6 +48,7 @@ export interface MemoryByte {
|
|
|
48
48
|
* Search-ready projection of a MemoryByte.
|
|
49
49
|
*
|
|
50
50
|
* Contains canonical text plus embeddings for each modality.
|
|
51
|
+
* Note: metadata is NOT included - it lives in the primary DB only.
|
|
51
52
|
*/
|
|
52
53
|
export interface IndexableByte {
|
|
53
54
|
text?: string;
|
|
@@ -56,7 +57,6 @@ export interface IndexableByte {
|
|
|
56
57
|
ivec?: number[];
|
|
57
58
|
avec?: number[];
|
|
58
59
|
vvec?: number[];
|
|
59
|
-
metadata?: JSONObject | null;
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
62
62
|
* Encoder that converts MemoryByte to IndexableByte with embeddings.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAM3C,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import "@kernl-sdk/ai/openai";
|
|
2
2
|
//# sourceMappingURL=integration.test.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration.test.d.ts","sourceRoot":"","sources":["../../../src/thread/__tests__/integration.test.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"integration.test.d.ts","sourceRoot":"","sources":["../../../src/thread/__tests__/integration.test.ts"],"names":[],"mappings":"AAIA,OAAO,sBAAsB,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { describe, it, expect, beforeAll } from "vitest";
|
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { openai } from "@ai-sdk/openai";
|
|
4
4
|
import { AISDKLanguageModel } from "@kernl-sdk/ai";
|
|
5
|
+
import "@kernl-sdk/ai/openai"; // (TMP)
|
|
5
6
|
import { Agent } from "../../agent.js";
|
|
6
7
|
import { Kernl } from "../../kernl/index.js";
|
|
7
8
|
import { tool, Toolkit } from "../../tool/index.js";
|
|
@@ -20,7 +21,7 @@ describe.skipIf(SKIP_INTEGRATION_TESTS)("Thread streaming integration", () => {
|
|
|
20
21
|
let model;
|
|
21
22
|
beforeAll(() => {
|
|
22
23
|
kernl = new Kernl();
|
|
23
|
-
model = new AISDKLanguageModel(openai("gpt-
|
|
24
|
+
model = new AISDKLanguageModel(openai("gpt-4.1"));
|
|
24
25
|
});
|
|
25
26
|
describe("stream()", () => {
|
|
26
27
|
it("should yield both delta events and complete items", async () => {
|
|
@@ -106,8 +107,12 @@ describe.skipIf(SKIP_INTEGRATION_TESTS)("Thread streaming integration", () => {
|
|
|
106
107
|
e.kind === "text-start" ||
|
|
107
108
|
e.kind === "text-end");
|
|
108
109
|
expect(streamDeltas.length).toBeGreaterThan(0);
|
|
109
|
-
// History should contain the input message
|
|
110
|
-
expect(history[0]).
|
|
110
|
+
// History should contain the input message (with ThreadEvent headers added)
|
|
111
|
+
expect(history[0]).toMatchObject({
|
|
112
|
+
kind: "message",
|
|
113
|
+
role: "user",
|
|
114
|
+
content: [{ kind: "text", text: "Count to 3" }],
|
|
115
|
+
});
|
|
111
116
|
// History should contain complete Message items
|
|
112
117
|
const historyMessages = history.filter((e) => e.kind === "message");
|
|
113
118
|
expect(historyMessages.length).toBeGreaterThan(1); // input + assistant response
|
|
@@ -279,7 +284,7 @@ describe.skipIf(SKIP_INTEGRATION_TESTS)("Thread streaming integration", () => {
|
|
|
279
284
|
expect(result.state).toBe("stopped");
|
|
280
285
|
}, 30000);
|
|
281
286
|
it("should validate structured output in blocking mode", async () => {
|
|
282
|
-
const
|
|
287
|
+
const PersonSchema = z.object({
|
|
283
288
|
name: z.string(),
|
|
284
289
|
age: z.number(),
|
|
285
290
|
});
|
|
@@ -288,7 +293,7 @@ describe.skipIf(SKIP_INTEGRATION_TESTS)("Thread streaming integration", () => {
|
|
|
288
293
|
name: "Test Structured Agent",
|
|
289
294
|
instructions: "You are a helpful assistant. Return JSON with name and age fields.",
|
|
290
295
|
model,
|
|
291
|
-
output:
|
|
296
|
+
output: PersonSchema,
|
|
292
297
|
});
|
|
293
298
|
const input = [
|
|
294
299
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/tool/sys/memory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/tool/sys/memory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AA8HrC;;;;GAIG;AACH,eAAO,MAAM,MAAM,kBAIjB,CAAC"}
|
package/dist/tool/sys/memory.js
CHANGED
|
@@ -32,7 +32,9 @@ const search = tool({
|
|
|
32
32
|
});
|
|
33
33
|
return mems.map((h) => ({
|
|
34
34
|
id: h.document?.id,
|
|
35
|
+
collection: h.document?.collection,
|
|
35
36
|
text: h.document?.text,
|
|
37
|
+
object: h.document?.objtext,
|
|
36
38
|
score: h.score,
|
|
37
39
|
}));
|
|
38
40
|
},
|
|
@@ -108,6 +110,7 @@ const list = tool({
|
|
|
108
110
|
id: r.id,
|
|
109
111
|
collection: r.collection,
|
|
110
112
|
text: r.content.text,
|
|
113
|
+
object: r.content.object,
|
|
111
114
|
}));
|
|
112
115
|
},
|
|
113
116
|
});
|
package/package.json
CHANGED
|
@@ -113,7 +113,7 @@ describe("MemoryByteEncoder", () => {
|
|
|
113
113
|
expect(embedCall.values[0]).toContain("shots: 2");
|
|
114
114
|
});
|
|
115
115
|
|
|
116
|
-
it("does not
|
|
116
|
+
it("does not include metadata (lives in primary DB only)", async () => {
|
|
117
117
|
const embedder = createMockEmbedder();
|
|
118
118
|
const encoder = new MemoryByteEncoder(embedder);
|
|
119
119
|
|
|
@@ -123,7 +123,8 @@ describe("MemoryByteEncoder", () => {
|
|
|
123
123
|
};
|
|
124
124
|
const result = await encoder.encode(byte);
|
|
125
125
|
|
|
126
|
-
|
|
126
|
+
// metadata is not part of IndexableByte - it stays in the primary DB
|
|
127
|
+
expect("metadata" in result).toBe(false);
|
|
127
128
|
});
|
|
128
129
|
|
|
129
130
|
it("returns undefined tvec when no content", async () => {
|
|
@@ -62,7 +62,8 @@ export const MEMORY_FILTER: Codec<MemoryFilter, SearchFilter> = {
|
|
|
62
62
|
* Combines:
|
|
63
63
|
* - Record scope/timestamps from MemoryRecord
|
|
64
64
|
* - Indexed content (text, object projection, embeddings) from byte codec
|
|
65
|
-
*
|
|
65
|
+
*
|
|
66
|
+
* Note: metadata is NOT included - it lives in the primary DB only.
|
|
66
67
|
*/
|
|
67
68
|
export function recordCodec(
|
|
68
69
|
bytecodec: MemoryByteCodec,
|
|
@@ -81,7 +82,6 @@ export function recordCodec(
|
|
|
81
82
|
createdAt: record.createdAt,
|
|
82
83
|
updatedAt: record.updatedAt,
|
|
83
84
|
...indexable,
|
|
84
|
-
metadata: record.metadata ?? null, // user metadata, not content.object
|
|
85
85
|
};
|
|
86
86
|
},
|
|
87
87
|
async decode(): Promise<MemoryRecord> {
|
|
@@ -29,11 +29,8 @@ import type { IndexMemoryRecord } from "../types";
|
|
|
29
29
|
*/
|
|
30
30
|
export const TPUF_DOC: Codec<IndexMemoryRecord, UnknownDocument> = {
|
|
31
31
|
encode(doc: IndexMemoryRecord): UnknownDocument {
|
|
32
|
-
const { tvec, ivec, avec, vvec,
|
|
33
|
-
const row: UnknownDocument = {
|
|
34
|
-
...rest,
|
|
35
|
-
metadata: metadata as UnknownDocument["metadata"], // metadata is JSONObject | null, cast to FieldValue for UnknownDocument
|
|
36
|
-
};
|
|
32
|
+
const { tvec, ivec, avec, vvec, ...rest } = doc;
|
|
33
|
+
const row: UnknownDocument = { ...rest };
|
|
37
34
|
if (tvec) row.vector = tvec;
|
|
38
35
|
return row;
|
|
39
36
|
},
|
package/src/memory/handle.ts
CHANGED
|
@@ -103,7 +103,8 @@ export class MemoryIndexHandle implements IndexHandle<IndexMemoryRecord> {
|
|
|
103
103
|
// Ignore "already exists" errors
|
|
104
104
|
if (
|
|
105
105
|
err.message?.includes("already exists") ||
|
|
106
|
-
err.message?.includes("AlreadyExists")
|
|
106
|
+
err.message?.includes("AlreadyExists") ||
|
|
107
|
+
err.code === "23505" // postgres unique constraint violation
|
|
107
108
|
) {
|
|
108
109
|
return;
|
|
109
110
|
}
|
package/src/memory/schema.ts
CHANGED
package/src/memory/types.ts
CHANGED
|
@@ -60,6 +60,7 @@ export interface MemoryByte {
|
|
|
60
60
|
* Search-ready projection of a MemoryByte.
|
|
61
61
|
*
|
|
62
62
|
* Contains canonical text plus embeddings for each modality.
|
|
63
|
+
* Note: metadata is NOT included - it lives in the primary DB only.
|
|
63
64
|
*/
|
|
64
65
|
export interface IndexableByte {
|
|
65
66
|
text?: string; // canonical semantic text
|
|
@@ -68,7 +69,6 @@ export interface IndexableByte {
|
|
|
68
69
|
ivec?: number[]; // image embedding
|
|
69
70
|
avec?: number[]; // audio embedding
|
|
70
71
|
vvec?: number[]; // video embedding
|
|
71
|
-
metadata?: JSONObject | null; // structured payload
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
/**
|
package/src/tool/sys/memory.ts
CHANGED
|
@@ -38,7 +38,9 @@ const search = tool({
|
|
|
38
38
|
|
|
39
39
|
return mems.map((h) => ({
|
|
40
40
|
id: h.document?.id,
|
|
41
|
+
collection: h.document?.collection,
|
|
41
42
|
text: h.document?.text,
|
|
43
|
+
object: h.document?.objtext,
|
|
42
44
|
score: h.score,
|
|
43
45
|
}));
|
|
44
46
|
},
|
|
@@ -126,6 +128,7 @@ const list = tool({
|
|
|
126
128
|
id: r.id,
|
|
127
129
|
collection: r.collection,
|
|
128
130
|
text: r.content.text,
|
|
131
|
+
object: r.content.object,
|
|
129
132
|
}));
|
|
130
133
|
},
|
|
131
134
|
});
|