kernl 0.2.1 → 0.6.1

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 (292) hide show
  1. package/.turbo/turbo-build.log +5 -4
  2. package/.turbo/turbo-check-types.log +4 -0
  3. package/CHANGELOG.md +147 -0
  4. package/LICENSE +1 -1
  5. package/dist/agent/__tests__/concurrency.test.d.ts +2 -0
  6. package/dist/agent/__tests__/concurrency.test.d.ts.map +1 -0
  7. package/dist/agent/__tests__/concurrency.test.js +152 -0
  8. package/dist/agent/__tests__/run.test.d.ts +2 -0
  9. package/dist/agent/__tests__/run.test.d.ts.map +1 -0
  10. package/dist/agent/__tests__/run.test.js +357 -0
  11. package/dist/agent/index.d.ts +1 -0
  12. package/dist/agent/index.d.ts.map +1 -0
  13. package/dist/agent.d.ts +35 -12
  14. package/dist/agent.d.ts.map +1 -1
  15. package/dist/agent.js +102 -15
  16. package/dist/api/__tests__/cursor-page.test.d.ts +2 -0
  17. package/dist/api/__tests__/cursor-page.test.d.ts.map +1 -0
  18. package/dist/api/__tests__/cursor-page.test.js +414 -0
  19. package/dist/api/__tests__/offset-page.test.d.ts +2 -0
  20. package/dist/api/__tests__/offset-page.test.d.ts.map +1 -0
  21. package/dist/api/__tests__/offset-page.test.js +510 -0
  22. package/dist/api/__tests__/threads.test.d.ts +2 -0
  23. package/dist/api/__tests__/threads.test.d.ts.map +1 -0
  24. package/dist/api/__tests__/threads.test.js +338 -0
  25. package/dist/api/models/index.d.ts +2 -0
  26. package/dist/api/models/index.d.ts.map +1 -0
  27. package/dist/api/models/thread.d.ts +120 -0
  28. package/dist/api/models/thread.d.ts.map +1 -0
  29. package/dist/api/pagination/base.d.ts +48 -0
  30. package/dist/api/pagination/base.d.ts.map +1 -0
  31. package/dist/api/pagination/base.js +45 -0
  32. package/dist/api/pagination/cursor.d.ts +44 -0
  33. package/dist/api/pagination/cursor.d.ts.map +1 -0
  34. package/dist/api/pagination/cursor.js +52 -0
  35. package/dist/api/pagination/offset.d.ts +42 -0
  36. package/dist/api/pagination/offset.d.ts.map +1 -0
  37. package/dist/api/pagination/offset.js +55 -0
  38. package/dist/api/resources/threads/events.d.ts +21 -0
  39. package/dist/api/resources/threads/events.d.ts.map +1 -0
  40. package/dist/api/resources/threads/events.js +24 -0
  41. package/dist/api/resources/threads/index.d.ts +4 -0
  42. package/dist/api/resources/threads/index.d.ts.map +1 -0
  43. package/dist/api/resources/threads/index.js +2 -0
  44. package/dist/api/resources/threads/threads.d.ts +57 -0
  45. package/dist/api/resources/threads/threads.d.ts.map +1 -0
  46. package/dist/api/resources/threads/threads.js +199 -0
  47. package/dist/api/resources/threads/types.d.ts +123 -0
  48. package/dist/api/resources/threads/types.d.ts.map +1 -0
  49. package/dist/api/resources/threads/utils.d.ts +18 -0
  50. package/dist/api/resources/threads/utils.d.ts.map +1 -0
  51. package/dist/api/resources/threads/utils.js +78 -0
  52. package/dist/context.d.ts +5 -1
  53. package/dist/context.d.ts.map +1 -1
  54. package/dist/context.js +6 -1
  55. package/dist/guardrail.d.ts +4 -4
  56. package/dist/index.d.ts +12 -4
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +10 -3
  59. package/dist/internal.d.ts +4 -0
  60. package/dist/internal.d.ts.map +1 -0
  61. package/dist/internal.js +2 -0
  62. package/dist/kernl/index.d.ts +3 -0
  63. package/dist/kernl/index.d.ts.map +1 -0
  64. package/dist/kernl/index.js +2 -0
  65. package/dist/kernl/kernl.d.ts +64 -0
  66. package/dist/kernl/kernl.d.ts.map +1 -0
  67. package/dist/kernl/kernl.js +116 -0
  68. package/dist/kernl/threads.d.ts +110 -0
  69. package/dist/kernl/threads.d.ts.map +1 -0
  70. package/dist/kernl/threads.js +126 -0
  71. package/dist/kernl.d.ts +27 -11
  72. package/dist/kernl.d.ts.map +1 -1
  73. package/dist/kernl.js +74 -11
  74. package/dist/lib/env.d.ts +3 -3
  75. package/dist/lib/env.js +1 -1
  76. package/dist/lib/error.d.ts +3 -3
  77. package/dist/lib/logger.js +1 -1
  78. package/dist/lifecycle.d.ts +5 -5
  79. package/dist/mcp/__tests__/base.test.js +2 -2
  80. package/dist/mcp/__tests__/fixtures/utils.d.ts +1 -1
  81. package/dist/mcp/__tests__/fixtures/utils.js +1 -1
  82. package/dist/mcp/__tests__/integration.test.js +16 -16
  83. package/dist/mcp/__tests__/stdio.test.js +2 -2
  84. package/dist/mcp/__tests__/utils.test.js +8 -8
  85. package/dist/mcp/base.d.ts +2 -2
  86. package/dist/mcp/http.d.ts +3 -3
  87. package/dist/mcp/http.d.ts.map +1 -1
  88. package/dist/mcp/http.js +11 -11
  89. package/dist/mcp/sse.d.ts +3 -3
  90. package/dist/mcp/sse.d.ts.map +1 -1
  91. package/dist/mcp/sse.js +9 -9
  92. package/dist/mcp/stdio.d.ts +2 -2
  93. package/dist/mcp/stdio.js +2 -2
  94. package/dist/mcp/types.d.ts +3 -3
  95. package/dist/mcp/utils.d.ts +4 -4
  96. package/dist/mcp/utils.d.ts.map +1 -1
  97. package/dist/mcp/utils.js +5 -6
  98. package/dist/storage/__tests__/in-memory.test.d.ts +2 -0
  99. package/dist/storage/__tests__/in-memory.test.d.ts.map +1 -0
  100. package/dist/storage/__tests__/in-memory.test.js +455 -0
  101. package/dist/storage/base.d.ts +64 -0
  102. package/dist/storage/base.d.ts.map +1 -0
  103. package/dist/storage/base.js +4 -0
  104. package/dist/storage/in-memory.d.ts +62 -0
  105. package/dist/storage/in-memory.d.ts.map +1 -0
  106. package/dist/storage/in-memory.js +283 -0
  107. package/dist/storage/index.d.ts +10 -0
  108. package/dist/storage/index.d.ts.map +1 -0
  109. package/dist/storage/index.js +7 -0
  110. package/dist/storage/thread.d.ts +123 -0
  111. package/dist/storage/thread.d.ts.map +1 -0
  112. package/dist/storage/thread.js +4 -0
  113. package/dist/task.d.ts +8 -6
  114. package/dist/task.d.ts.map +1 -1
  115. package/dist/task.js +10 -8
  116. package/dist/thread/__tests__/fixtures/mock-model.d.ts +1 -2
  117. package/dist/thread/__tests__/fixtures/mock-model.d.ts.map +1 -1
  118. package/dist/thread/__tests__/integration.test.js +10 -10
  119. package/dist/thread/__tests__/mock.d.ts +1 -1
  120. package/dist/thread/__tests__/namespace.test.d.ts +2 -0
  121. package/dist/thread/__tests__/namespace.test.d.ts.map +1 -0
  122. package/dist/thread/__tests__/namespace.test.js +131 -0
  123. package/dist/thread/__tests__/thread-persistence.test.d.ts +2 -0
  124. package/dist/thread/__tests__/thread-persistence.test.d.ts.map +1 -0
  125. package/dist/thread/__tests__/thread-persistence.test.js +351 -0
  126. package/dist/thread/__tests__/thread.test.js +55 -57
  127. package/dist/thread/index.d.ts +1 -1
  128. package/dist/thread/index.js +1 -1
  129. package/dist/thread/thread.d.ts +74 -22
  130. package/dist/thread/thread.d.ts.map +1 -1
  131. package/dist/thread/thread.js +212 -74
  132. package/dist/thread/utils.d.ts +38 -10
  133. package/dist/thread/utils.d.ts.map +1 -1
  134. package/dist/thread/utils.js +53 -9
  135. package/dist/tool/__tests__/fixtures.d.ts +8 -8
  136. package/dist/tool/__tests__/fixtures.js +3 -3
  137. package/dist/tool/__tests__/tool.test.js +2 -2
  138. package/dist/tool/__tests__/toolkit.test.js +17 -14
  139. package/dist/tool/index.d.ts +3 -3
  140. package/dist/tool/index.js +2 -2
  141. package/dist/tool/tool.d.ts +2 -2
  142. package/dist/tool/tool.js +5 -5
  143. package/dist/tool/toolkit.d.ts +4 -4
  144. package/dist/tool/toolkit.js +1 -1
  145. package/dist/tool/types.d.ts +4 -4
  146. package/dist/trace/traces.js +2 -2
  147. package/dist/types/agent.d.ts +4 -4
  148. package/dist/types/kernl.d.ts +42 -0
  149. package/dist/types/kernl.d.ts.map +1 -0
  150. package/dist/types/thread.d.ts +110 -24
  151. package/dist/types/thread.d.ts.map +1 -1
  152. package/dist/types/thread.js +12 -0
  153. package/package.json +12 -8
  154. package/src/agent/__tests__/concurrency.test.ts +194 -0
  155. package/src/agent/__tests__/run.test.ts +441 -0
  156. package/src/agent/index.ts +0 -0
  157. package/src/agent.ts +139 -24
  158. package/src/api/__tests__/cursor-page.test.ts +512 -0
  159. package/src/api/__tests__/offset-page.test.ts +624 -0
  160. package/src/api/__tests__/threads.test.ts +415 -0
  161. package/src/api/models/index.ts +6 -0
  162. package/src/api/models/thread.ts +138 -0
  163. package/src/api/pagination/base.ts +79 -0
  164. package/src/api/pagination/cursor.ts +86 -0
  165. package/src/api/pagination/offset.ts +89 -0
  166. package/src/api/resources/threads/events.ts +26 -0
  167. package/src/api/resources/threads/index.ts +9 -0
  168. package/src/api/resources/threads/threads.ts +256 -0
  169. package/src/api/resources/threads/types.ts +143 -0
  170. package/src/api/resources/threads/utils.ts +104 -0
  171. package/src/context.ts +10 -1
  172. package/src/index.ts +49 -1
  173. package/src/internal.ts +15 -0
  174. package/src/kernl.ts +86 -17
  175. package/src/mcp/__tests__/integration.test.ts +8 -9
  176. package/src/mcp/__tests__/utils.test.ts +6 -6
  177. package/src/mcp/http.ts +9 -9
  178. package/src/mcp/sse.ts +7 -7
  179. package/src/mcp/utils.ts +6 -5
  180. package/src/storage/__tests__/in-memory.test.ts +534 -0
  181. package/src/storage/base.ts +77 -0
  182. package/src/storage/in-memory.ts +372 -0
  183. package/src/storage/index.ts +21 -0
  184. package/src/storage/thread.ts +141 -0
  185. package/src/task.ts +12 -10
  186. package/src/thread/__tests__/fixtures/mock-model.ts +2 -4
  187. package/src/thread/__tests__/integration.test.ts +13 -12
  188. package/src/thread/__tests__/namespace.test.ts +158 -0
  189. package/src/thread/__tests__/thread-persistence.test.ts +367 -0
  190. package/src/thread/__tests__/thread.test.ts +52 -54
  191. package/src/thread/thread.ts +247 -96
  192. package/src/thread/utils.ts +76 -13
  193. package/src/tool/__tests__/fixtures.ts +1 -1
  194. package/src/tool/__tests__/toolkit.test.ts +15 -12
  195. package/src/tool/tool.ts +3 -3
  196. package/src/types/kernl.ts +51 -0
  197. package/src/types/thread.ts +139 -25
  198. package/vitest.config.ts +1 -0
  199. package/dist/env.d.ts +0 -45
  200. package/dist/env.d.ts.map +0 -1
  201. package/dist/env.js +0 -31
  202. package/dist/error.d.ts +0 -1
  203. package/dist/error.d.ts.map +0 -1
  204. package/dist/kernel.d.ts +0 -7
  205. package/dist/kernel.d.ts.map +0 -1
  206. package/dist/kernel.js +0 -7
  207. package/dist/lib/serde/__tests__/codec.test.d.ts +0 -2
  208. package/dist/lib/serde/__tests__/codec.test.d.ts.map +0 -1
  209. package/dist/lib/serde/__tests__/codec.test.js +0 -75
  210. package/dist/lib/serde/codec.d.ts +0 -12
  211. package/dist/lib/serde/codec.d.ts.map +0 -1
  212. package/dist/lib/serde/codec.js +0 -54
  213. package/dist/lib/serde/thread.d.ts +0 -1
  214. package/dist/lib/serde/thread.d.ts.map +0 -1
  215. package/dist/lib/serde/thread.js +0 -172
  216. package/dist/lib/serde/tool.d.ts +0 -36
  217. package/dist/lib/serde/tool.d.ts.map +0 -1
  218. package/dist/lib/utils.d.ts +0 -19
  219. package/dist/lib/utils.d.ts.map +0 -1
  220. package/dist/lib/utils.js +0 -41
  221. package/dist/logger.d.ts +0 -36
  222. package/dist/logger.d.ts.map +0 -1
  223. package/dist/logger.js +0 -43
  224. package/dist/mcp/__tests__/fixtures/echo-server.d.ts +0 -3
  225. package/dist/mcp/__tests__/fixtures/echo-server.d.ts.map +0 -1
  226. package/dist/mcp/__tests__/fixtures/echo-server.js +0 -92
  227. package/dist/mcp/__tests__/fixtures/math-server.d.ts +0 -3
  228. package/dist/mcp/__tests__/fixtures/math-server.d.ts.map +0 -1
  229. package/dist/mcp/__tests__/fixtures/math-server.js +0 -98
  230. package/dist/mcp/__tests__/fixtures/test-server.d.ts +0 -3
  231. package/dist/mcp/__tests__/fixtures/test-server.d.ts.map +0 -1
  232. package/dist/mcp/__tests__/fixtures/test-server.js +0 -163
  233. package/dist/mcp/__tests__/test-utils.d.ts +0 -17
  234. package/dist/mcp/__tests__/test-utils.d.ts.map +0 -1
  235. package/dist/mcp/__tests__/test-utils.js +0 -42
  236. package/dist/mcp/node.d.ts +0 -60
  237. package/dist/mcp/node.d.ts.map +0 -1
  238. package/dist/mcp/node.js +0 -297
  239. package/dist/model.d.ts +0 -175
  240. package/dist/model.d.ts.map +0 -1
  241. package/dist/providers/ai.d.ts +0 -1
  242. package/dist/providers/ai.d.ts.map +0 -1
  243. package/dist/providers/ai.js +0 -1
  244. package/dist/providers/default.d.ts +0 -16
  245. package/dist/providers/default.d.ts.map +0 -1
  246. package/dist/providers/default.js +0 -17
  247. package/dist/providers/registry.d.ts +0 -1
  248. package/dist/providers/registry.d.ts.map +0 -1
  249. package/dist/providers/registry.js +0 -1
  250. package/dist/sched/scheduler.d.ts +0 -20
  251. package/dist/sched/scheduler.d.ts.map +0 -1
  252. package/dist/sched/task.d.ts +0 -92
  253. package/dist/sched/task.d.ts.map +0 -1
  254. package/dist/sched/task.js +0 -102
  255. package/dist/serde/__tests__/codec.test.d.ts +0 -2
  256. package/dist/serde/__tests__/codec.test.d.ts.map +0 -1
  257. package/dist/serde/__tests__/codec.test.js +0 -75
  258. package/dist/serde/codec.d.ts +0 -12
  259. package/dist/serde/codec.d.ts.map +0 -1
  260. package/dist/serde/codec.js +0 -54
  261. package/dist/serde/json.d.ts +0 -8
  262. package/dist/serde/json.d.ts.map +0 -1
  263. package/dist/serde/json.js +0 -13
  264. package/dist/serde/thread.d.ts +0 -687
  265. package/dist/serde/thread.d.ts.map +0 -1
  266. package/dist/serde/thread.js +0 -158
  267. package/dist/serde/tool.d.ts +0 -36
  268. package/dist/serde/tool.d.ts.map +0 -1
  269. package/dist/session.d.ts +0 -1
  270. package/dist/session.d.ts.map +0 -1
  271. package/dist/session.js +0 -1
  272. package/dist/thread/__tests__/stream.test.d.ts +0 -2
  273. package/dist/thread/__tests__/stream.test.d.ts.map +0 -1
  274. package/dist/thread/__tests__/stream.test.js +0 -244
  275. package/dist/tool/mcp.d.ts +0 -75
  276. package/dist/tool/mcp.d.ts.map +0 -1
  277. package/dist/tool/mcp.js +0 -111
  278. package/dist/tools.d.ts +0 -362
  279. package/dist/tools.d.ts.map +0 -1
  280. package/dist/tools.js +0 -220
  281. package/dist/types/proto.d.ts +0 -1551
  282. package/dist/types/proto.d.ts.map +0 -1
  283. package/dist/types/proto.js +0 -531
  284. package/dist/usage.d.ts +0 -43
  285. package/dist/usage.d.ts.map +0 -1
  286. package/dist/usage.js +0 -61
  287. package/src/lib/serde/thread.ts +0 -188
  288. /package/dist/{error.js → agent/index.js} +0 -0
  289. /package/dist/{lib/serde/tool.js → api/models/index.js} +0 -0
  290. /package/dist/{model.js → api/models/thread.js} +0 -0
  291. /package/dist/{sched/scheduler.js → api/resources/threads/types.js} +0 -0
  292. /package/dist/{serde/tool.js → types/kernl.js} +0 -0
@@ -1,4 +1,5 @@
1
-
2
- > kernl@0.2.1 build /Users/andjones/Documents/projects/kernl/packages/kernl
3
- > tsc && tsc-alias
4
-
1
+
2
+ 
3
+ > kernl@0.6.0 build /Users/andjones/Documents/projects/kernl/packages/kernl
4
+ > tsc && tsc-alias --resolve-full-paths
5
+
@@ -0,0 +1,4 @@
1
+
2
+ > @kernl-sdk/core@0.2.2 check-types /Users/andjones/Documents/projects/kernl/packages/kernl
3
+ > tsc --noEmit
4
+
package/CHANGELOG.md CHANGED
@@ -1,5 +1,152 @@
1
1
  # @kernl/core
2
2
 
3
+ ## 0.6.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Fix ESM compatibility by adding --resolve-full-paths to tsc-alias build
8
+ - Updated dependencies
9
+ - @kernl-sdk/shared@0.1.6
10
+ - @kernl-sdk/protocol@0.2.5
11
+
12
+ ## 0.6.0
13
+
14
+ ### Minor Changes
15
+
16
+ - Migrate packages from GitHub Packages to npm registry.
17
+
18
+ **Breaking change for `kernl` (formerly `@kernl-sdk/core`):**
19
+
20
+ The core package has been renamed from `@kernl-sdk/core` to `kernl`. Update your imports:
21
+
22
+ ```diff
23
+ - import { Agent, Kernl } from "@kernl-sdk/core";
24
+ + import { Agent, Kernl } from "kernl";
25
+ ```
26
+
27
+ All other packages remain under the `@kernl-sdk` scope and are now publicly available on npm.
28
+
29
+ ### Patch Changes
30
+
31
+ - Updated dependencies
32
+ - @kernl-sdk/shared@0.1.5
33
+ - @kernl-sdk/protocol@0.2.4
34
+
35
+ ## 0.5.1
36
+
37
+ ### Patch Changes
38
+
39
+ - 08ab8a0: Fix duplicate thread inserts when streaming from hydrated threads by making
40
+ storage-backed Thread instances explicitly marked as persisted, and ensure
41
+ Postgres integration tests cover the no-double-insert behavior.
42
+
43
+ ## 0.5.0
44
+
45
+ ### Minor Changes
46
+
47
+ - ad56b86: Introduce the public Kernl threads API surface (`kernl.threads` and
48
+ `agent.threads`) for listing, getting, deleting, and reading history, backed
49
+ by simple `Thread` and `ThreadEvent` models.
50
+
51
+ Add explicit thread creation and update APIs, including first-class `title`
52
+ support (stored in `metadata.title`) and structured `context` / `metadata`
53
+ patch semantics, and tighten thread persistence behavior in core + storage
54
+ implementations to keep context and metadata consistent across in-memory and
55
+ Postgres stores.
56
+
57
+ ## 0.4.6
58
+
59
+ ### Patch Changes
60
+
61
+ - Add PublicThreadEvent type to filter internal system events from client-facing APIs. ThreadResource.history and ThreadsResource.history() now return only public events (messages, tool calls, tool results), excluding internal system events.
62
+
63
+ ## 0.4.5
64
+
65
+ ### Patch Changes
66
+
67
+ - 8e3bac1: Add ThreadResource public API type that separates the public thread interface from internal Thread execution primitive. ThreadsResource methods now return ThreadResource with serialized data instead of Thread class instances. Add createdAt/updatedAt timestamps to threads.
68
+
69
+ ## 0.4.4
70
+
71
+ ### Patch Changes
72
+
73
+ - ba8119d: Fix Kernl type exports - remove duplicate old Kernl definition from dist root that was missing the threads property. The correct Kernl class with ThreadsResource is now properly exported.
74
+
75
+ ## 0.4.3
76
+
77
+ ### Patch Changes
78
+
79
+ - f536b15: Add clean public API for thread management with ThreadsResource class and agent-scoped thread access. Users can now access threads via `kernl.threads.get/list/delete/history()` or use agent-scoped helpers like `agent.threads.list()` that automatically filter to that agent's threads.
80
+
81
+ ## 0.4.2
82
+
83
+ ### Patch Changes
84
+
85
+ - Updated dependencies
86
+ - @kernl-sdk/shared@0.1.4
87
+ - @kernl-sdk/protocol@0.2.3
88
+
89
+ ## 0.4.1
90
+
91
+ ### Patch Changes
92
+
93
+ - feat: implement lazy storage initialization
94
+
95
+ Storage is now automatically initialized on first agent execution. The `ensureInitialized()` method is called internally by spawn/schedule methods, so users never have to manually call `storage.init()`. Initialization is idempotent and concurrency-safe.
96
+
97
+ ## 0.4.0
98
+
99
+ ### Minor Changes
100
+
101
+ - feat: add storage infrastructure with automatic initialization
102
+
103
+ Adds comprehensive storage infrastructure to Kernl:
104
+ - New `KernlStorage` and `ThreadStore` interfaces for persistent thread management
105
+ - Automatic lazy initialization of storage on first agent execution
106
+ - Thread checkpointing at key lifecycle points (start, post-tools, terminal-tick, stop)
107
+ - Thread resumption support - pass `{ threadId }` to agent.run() or agent.stream()
108
+ - In-memory storage implementation as default (no setup required)
109
+ - PostgreSQL storage adapter via `@kernl/pg`
110
+ - LibSQL storage adapter via `@kernl/libsql`
111
+ - Full support for thread history queries and event filtering
112
+
113
+ ## 0.3.2
114
+
115
+ ### Patch Changes
116
+
117
+ - fix: MCP tool schema compatibility with OpenAI
118
+
119
+ Fixed MCP tool parameter schema serialization to match AI SDK pattern. Empty-parameter MCP tools now generate schemas with `{ type: "object", properties: {}, additionalProperties: false }` which satisfies OpenAI's strict validation requirements.
120
+
121
+ ## 0.3.1
122
+
123
+ ### Patch Changes
124
+
125
+ - e90f8bb: fix: handle model stream errors gracefully
126
+
127
+ Thread.stream() now properly catches and converts model errors (like missing API keys) to error events, preventing the UI from hanging. Errors are logged via logger.error() and sent to clients as error chunks.
128
+
129
+ ## 0.3.0
130
+
131
+ ### Minor Changes
132
+
133
+ - Allow Agent.run() and Agent.stream() to accept LanguageModelItem[] as input
134
+ - Update run() and stream() methods to accept `string | LanguageModelItem[]`
135
+ - Convert string inputs to message items internally for backwards compatibility
136
+ - Enable passing decoded UI messages directly to agent methods for multi-turn conversations
137
+
138
+ ## 0.2.2
139
+
140
+ ### Patch Changes
141
+
142
+ - 2c62c0a: Migrate from @kernl to @kernl-sdk scope
143
+
144
+ All packages have been migrated to the @kernl-sdk scope for publishing to GitHub Packages under the kernl-sdk organization.
145
+
146
+ - Updated dependencies [2c62c0a]
147
+ - @kernl-sdk/shared@0.1.3
148
+ - @kernl-sdk/protocol@0.2.2
149
+
3
150
  ## 0.2.1
4
151
 
5
152
  ### Patch Changes
package/LICENSE CHANGED
@@ -186,7 +186,7 @@
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright [yyyy] [name of copyright owner]
189
+ Copyright 2025 Andrew Jones
190
190
 
191
191
  Licensed under the Apache License, Version 2.0 (the "License");
192
192
  you may not use this file except in compliance with the License.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=concurrency.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.test.d.ts","sourceRoot":"","sources":["../../../src/agent/__tests__/concurrency.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,152 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { Agent } from "../../agent.js";
3
+ import { Kernl } from "../../kernl.js";
4
+ import { createMockModel } from "../../thread/__tests__/fixtures/mock-model.js";
5
+ import { RuntimeError } from "../../lib/error.js";
6
+ import { message } from "@kernl-sdk/protocol";
7
+ describe("Concurrent execution prevention", () => {
8
+ // (TODO): this should work
9
+ it.skip("should prevent two Agent.run() calls with same threadId", async () => {
10
+ const model = createMockModel(async () => {
11
+ await new Promise((resolve) => setTimeout(resolve, 200));
12
+ return {
13
+ content: [message({ role: "assistant", text: "Done" })],
14
+ finishReason: "stop",
15
+ usage: { inputTokens: 2, outputTokens: 2, totalTokens: 4 },
16
+ warnings: [],
17
+ };
18
+ });
19
+ const agent = new Agent({
20
+ id: "test-agent",
21
+ name: "Test",
22
+ instructions: "Test",
23
+ model,
24
+ });
25
+ const kernl = new Kernl();
26
+ kernl.register(agent);
27
+ const tid = "concurrent-test-1";
28
+ // Start first run
29
+ const run1 = agent.run("First", { threadId: tid });
30
+ // Try second run immediately
31
+ await expect(agent.run("Second", { threadId: tid })).rejects.toThrow(RuntimeError);
32
+ await expect(agent.run("Second", { threadId: tid })).rejects.toThrow(/already running/);
33
+ // Wait for first to complete
34
+ await run1;
35
+ // Now third should work
36
+ await expect(agent.run("Third", { threadId: tid })).resolves.toBeDefined();
37
+ });
38
+ // (TODO): this should work
39
+ it.skip("should prevent Agent.stream() on thread already in Agent.run()", async () => {
40
+ const model = createMockModel(async () => {
41
+ await new Promise((resolve) => setTimeout(resolve, 200));
42
+ return {
43
+ content: [message({ role: "assistant", text: "Done" })],
44
+ finishReason: "stop",
45
+ usage: { inputTokens: 2, outputTokens: 2, totalTokens: 4 },
46
+ warnings: [],
47
+ };
48
+ });
49
+ const agent = new Agent({
50
+ id: "test-agent",
51
+ name: "Test",
52
+ instructions: "Test",
53
+ model,
54
+ });
55
+ const kernl = new Kernl();
56
+ kernl.register(agent);
57
+ const tid = "concurrent-test-2";
58
+ // Start run()
59
+ const runPromise = agent.run("Test", { threadId: tid });
60
+ // Try to stream same thread
61
+ const streamIterable = agent.stream("Test", { threadId: tid });
62
+ const streamIterator = streamIterable[Symbol.asyncIterator]();
63
+ await expect(streamIterator.next()).rejects.toThrow(RuntimeError);
64
+ await expect(streamIterator.next()).rejects.toThrow(/already running/);
65
+ await runPromise;
66
+ });
67
+ it("should prevent Agent.run() on thread already in Agent.stream()", async () => {
68
+ const model = createMockModel(async () => {
69
+ await new Promise((resolve) => setTimeout(resolve, 50));
70
+ return {
71
+ content: [message({ role: "assistant", text: "Done" })],
72
+ finishReason: "stop",
73
+ usage: { inputTokens: 2, outputTokens: 2, totalTokens: 4 },
74
+ warnings: [],
75
+ };
76
+ });
77
+ const agent = new Agent({
78
+ id: "test-agent",
79
+ name: "Test",
80
+ instructions: "Test",
81
+ model,
82
+ });
83
+ const kernl = new Kernl();
84
+ kernl.register(agent);
85
+ const tid = "concurrent-test-3";
86
+ // Start stream() but don't await - start consuming
87
+ const streamIterator = agent.stream("Test", { threadId: tid });
88
+ const streamPromise = (async () => {
89
+ for await (const _event of streamIterator) {
90
+ // consume
91
+ }
92
+ })();
93
+ // Give stream time to start
94
+ await new Promise((resolve) => setTimeout(resolve, 10));
95
+ // Try to run() same thread
96
+ await expect(agent.run("Test", { threadId: tid })).rejects.toThrow(RuntimeError);
97
+ await streamPromise;
98
+ });
99
+ it("should allow different threadIds to run concurrently", async () => {
100
+ const model = createMockModel(async () => {
101
+ await new Promise((resolve) => setTimeout(resolve, 50));
102
+ return {
103
+ content: [message({ role: "assistant", text: "Done" })],
104
+ finishReason: "stop",
105
+ usage: { inputTokens: 2, outputTokens: 2, totalTokens: 4 },
106
+ warnings: [],
107
+ };
108
+ });
109
+ const agent = new Agent({
110
+ id: "test-agent",
111
+ name: "Test",
112
+ instructions: "Test",
113
+ model,
114
+ });
115
+ const kernl = new Kernl();
116
+ kernl.register(agent);
117
+ // These should all succeed
118
+ const results = await Promise.all([
119
+ agent.run("Test 1", { threadId: "thread-1" }),
120
+ agent.run("Test 2", { threadId: "thread-2" }),
121
+ agent.run("Test 3", { threadId: "thread-3" }),
122
+ ]);
123
+ expect(results).toHaveLength(3);
124
+ expect(results.every((r) => r.response === "Done")).toBe(true);
125
+ });
126
+ it("should allow same threadId after previous run completes", async () => {
127
+ const model = createMockModel(async () => ({
128
+ content: [message({ role: "assistant", text: "Done" })],
129
+ finishReason: "stop",
130
+ usage: { inputTokens: 2, outputTokens: 2, totalTokens: 4 },
131
+ warnings: [],
132
+ }));
133
+ const agent = new Agent({
134
+ id: "test-agent",
135
+ name: "Test",
136
+ instructions: "Test",
137
+ model,
138
+ });
139
+ const kernl = new Kernl();
140
+ kernl.register(agent);
141
+ const tid = "reuse-thread";
142
+ // First run
143
+ const result1 = await agent.run("First", { threadId: tid });
144
+ expect(result1.response).toBe("Done");
145
+ // Second run (should work since first completed)
146
+ const result2 = await agent.run("Second", { threadId: tid });
147
+ expect(result2.response).toBe("Done");
148
+ // Third run
149
+ const result3 = await agent.run("Third", { threadId: tid });
150
+ expect(result3.response).toBe("Done");
151
+ });
152
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=run.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.test.d.ts","sourceRoot":"","sources":["../../../src/agent/__tests__/run.test.ts"],"names":[],"mappings":""}