kortyx 0.20.4 → 0.22.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.22.0](https://github.com/kortyx-io/kortyx/compare/kortyx-v0.21.0...kortyx-v0.22.0) (2026-09-18)
4
+
5
+
6
+ ### Features
7
+
8
+ * **tools:** add useTool and first-class Studio observability ([#215](https://github.com/kortyx-io/kortyx/issues/215)) ([224c92d](https://github.com/kortyx-io/kortyx/commit/224c92d73caead320dd14582d8b624efc3252c9f))
9
+
10
+
11
+ ### Dependencies
12
+
13
+ * The following workspace dependencies were updated
14
+ * dependencies
15
+ * @kortyx/agent bumped to 0.25.0
16
+ * @kortyx/cli bumped to 0.9.0
17
+ * @kortyx/hooks bumped to 0.26.0
18
+ * @kortyx/mcp bumped to 0.2.4
19
+ * @kortyx/providers bumped to 0.8.0
20
+ * @kortyx/runtime bumped to 0.20.0
21
+
22
+ ## [0.21.0](https://github.com/kortyx-io/kortyx/compare/kortyx-v0.20.4...kortyx-v0.21.0) (2026-09-16)
23
+
24
+
25
+ ### Features
26
+
27
+ * **runtime:** add PostgreSQL persistence, caching composition, and retention ([#207](https://github.com/kortyx-io/kortyx/issues/207)) ([6c1e7df](https://github.com/kortyx-io/kortyx/commit/6c1e7df22ffe8c792bf52b7dba5ae6ea04c1eb2a))
28
+
29
+
30
+ ### Dependencies
31
+
32
+ * The following workspace dependencies were updated
33
+ * dependencies
34
+ * @kortyx/agent bumped to 0.24.0
35
+ * @kortyx/cli bumped to 0.8.0
36
+ * @kortyx/hooks bumped to 0.25.3
37
+ * @kortyx/runtime bumped to 0.19.0
38
+
3
39
  ## [0.20.4](https://github.com/kortyx-io/kortyx/compare/kortyx-v0.20.3...kortyx-v0.20.4) (2026-09-16)
4
40
 
5
41
 
package/README.md CHANGED
@@ -262,3 +262,12 @@ Apache-2.0. See [LICENSE](https://github.com/kortyx-io/kortyx/blob/main/LICENSE)
262
262
  ## Error handling
263
263
 
264
264
  Use `serializeFailure` for safe structured diagnostics and `DomainError` for explicitly approved domain details that must survive child checkpoint restore. Cancellation, execution limits and human interrupts remain control flow. Applications own retry and schema correction policy. See the [error handling guide](../../apps/website/src/docs/v0/03-guides/08-error-handling.md).
265
+
266
+ ## Shared tools
267
+
268
+ `await useTool({tool, input})` executes a typed plain tool immediately inside a workflow node, without a model call or MCP transport. Pass the same definition to `useReason({tools: [tool]})` for model-driven selection and arguments. Tool definitions can provide `outcomes.denialCodes`, `classifyResult` and `classifyError`; permission enforcement remains application-owned. Direct calls preserve result/error identity and do not cache executions.
269
+
270
+ Studio records individual durations and separate success, denial, fault and cancellation outcomes; cached native and child calls appear as reuse with their original scope. Tool faults automatically include error type and message (up to 256/8192 characters), without extra call-site wiring. Observations exclude raw inputs/results, exception objects, causes and stacks. Error messages are exported verbatim and can contain sensitive text; an optional tool `telemetry.error(error)` callback can replace them with `{type, message}` or return `null` to suppress them. Throwing projections suppress diagnostics and never alter execution. Observer and delivery failures cannot change execution. `kortyx topology push` discovers attached tools from source, marks dynamic attachments unresolved, and makes available tools visible before traffic.
271
+
272
+
273
+ Configured Studio/OpenTelemetry tracing also captures model provider failures and `useReason` output-parsing failures automatically, including bounded error type/message. No extra wiring is needed. Studio opens the failed model event and displays reasoning/output failures separately when the model response itself completed normally. Prompts, outputs, exception stacks/causes and raw provider responses are excluded by default. Messages are verbatim; the optional trace adapter `error(error)` override can return `{type, message}` or `null` to replace/suppress model diagnostics without changing execution. Client-facing failure contracts remain unchanged.
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  export * from '@kortyx/core/errors';
2
2
  export { Agent, AgentProcessOptions, ChatRequestBody, CheckpointRequestBody, CreateAgentArgs, ExecutableWorkflow, ExecuteOptions, ExecutionInfo, ExecutionInterrupt, ExecutionRequestError, ExecutionResult, InterruptScope, ListInterruptsOptions, PendingInterrupt, ResumableInterrupt, ResumeHandle, ResumeOptions, ResumeResponse, StreamChatFromRouteArgs, createAgent, createChatRouteHandler, createCheckpointRouteHandler, createFailureResponse, handleChatRequestBody, handleCheckpointRequestBody, parseChatRequestBody, parseCheckpointRequestBody, readRequestJson, streamChatFromRoute } from '@kortyx/agent';
3
3
  export { ExecutionLimit, ExecutionLimitReached, ExecutionLimits, GraphState, NodeConfig, NodeContext, NodeFn, NodeHandler, NodeResult, RuntimeEnvelope, WorkflowDefinition, WorkflowId, defineWorkflow, loadWorkflow, validateWorkflow } from '@kortyx/core';
4
- export { CompleteResponseOptions, EnsureWorkflowTopologyRequest, EnsureWorkflowTopologyResponse, KortyxTelemetryConfig, KortyxTelemetryContentCapture, KortyxTelemetryCorrelation, KortyxTelemetryEvent, KortyxTelemetryEventType, KortyxTelemetryPrompt, KortyxTelemetryReporter, KortyxTelemetryService, KortyxTraceAdapter, KortyxTraceMetadata, ParallelError, UseInterruptArgs, UseReasonArgs, UseReasonResult, UseReasonStep, UseReasonToolExecution, UseStructuredDataArgs, WorkflowCallError, completeResponse, createWorkflowHooks, parallel, useAbortSignal, useInterrupt, useNodeState, useReason, useRuntimeContext, useStructuredData, useWorkflow, useWorkflowState } from '@kortyx/hooks';
4
+ export { CompleteResponseOptions, EnsureWorkflowTopologyRequest, EnsureWorkflowTopologyResponse, KortyxErrorDetails, KortyxTelemetryConfig, KortyxTelemetryContentCapture, KortyxTelemetryCorrelation, KortyxTelemetryEvent, KortyxTelemetryEventType, KortyxTelemetryPrompt, KortyxTelemetryReporter, KortyxTelemetryService, KortyxTraceAdapter, KortyxTraceErrorProjection, KortyxTraceMetadata, ParallelError, UseInterruptArgs, UseReasonArgs, UseReasonResult, UseReasonStep, UseReasonToolExecution, UseStructuredDataArgs, UseToolArgs, WorkflowCallError, completeResponse, createWorkflowHooks, parallel, useAbortSignal, useInterrupt, useNodeState, useReason, useRuntimeContext, useStructuredData, useTool, useWorkflow, useWorkflowState } from '@kortyx/hooks';
5
5
  export { CreateMCPClientArgs, MCPClient, McpToolsArgs, McpTransportConfig, createMCPClient } from '@kortyx/mcp';
6
6
  export * from '@kortyx/providers';
7
- export { WorkflowRegistry, clearRegisteredNodes, createFileWorkflowRegistry, createFrameworkAdapterFromEnv, createInMemoryFrameworkAdapter, createInMemoryWorkflowRegistry, createRedisFrameworkAdapter, getRegisteredNode, listRegisteredNodes, registerNode } from '@kortyx/runtime';
7
+ export { CreateCachingFrameworkAdapterOptions, CreatePostgresFrameworkAdapterOptions, FrameworkAdapter, ManagedFrameworkAdapter, PostgresFrameworkAdapter, PruneRuntimeOptions, PruneRuntimeResult, RuntimeMaintenance, RuntimeRetentionPolicy, WorkflowRegistry, clearRegisteredNodes, createCachingFrameworkAdapter, createFileWorkflowRegistry, createFrameworkAdapterFromEnv, createInMemoryFrameworkAdapter, createInMemoryWorkflowRegistry, createPostgresFrameworkAdapter, createRedisFrameworkAdapter, getRegisteredNode, listRegisteredNodes, registerNode } from '@kortyx/runtime';
8
8
  export { BufferedStreamResult, ConsumeStreamHandlers, StreamChunk, StructuredDataChunk, StructuredStreamAccumulator, StructuredStreamState, applyStructuredChunk, collectBufferedStream, collectStream, consumeStream, createStreamResponse, createStructuredStreamAccumulator, readStream, reduceStructuredChunks, summarizeStreamChunks, toSSE } from '@kortyx/stream';
package/dist/index.js CHANGED
@@ -30,6 +30,7 @@ __export(index_exports, {
30
30
  completeResponse: () => import_hooks.completeResponse,
31
31
  consumeStream: () => import_stream.consumeStream,
32
32
  createAgent: () => import_agent.createAgent,
33
+ createCachingFrameworkAdapter: () => import_runtime.createCachingFrameworkAdapter,
33
34
  createChatRouteHandler: () => import_agent.createChatRouteHandler,
34
35
  createCheckpointRouteHandler: () => import_agent.createCheckpointRouteHandler,
35
36
  createFailureResponse: () => import_agent.createFailureResponse,
@@ -38,6 +39,7 @@ __export(index_exports, {
38
39
  createInMemoryFrameworkAdapter: () => import_runtime.createInMemoryFrameworkAdapter,
39
40
  createInMemoryWorkflowRegistry: () => import_runtime.createInMemoryWorkflowRegistry,
40
41
  createMCPClient: () => import_mcp.createMCPClient,
42
+ createPostgresFrameworkAdapter: () => import_runtime.createPostgresFrameworkAdapter,
41
43
  createRedisFrameworkAdapter: () => import_runtime.createRedisFrameworkAdapter,
42
44
  createStreamResponse: () => import_stream.createStreamResponse,
43
45
  createStructuredStreamAccumulator: () => import_stream.createStructuredStreamAccumulator,
@@ -64,6 +66,7 @@ __export(index_exports, {
64
66
  useReason: () => import_hooks.useReason,
65
67
  useRuntimeContext: () => import_hooks.useRuntimeContext,
66
68
  useStructuredData: () => import_hooks.useStructuredData,
69
+ useTool: () => import_hooks.useTool,
67
70
  useWorkflow: () => import_hooks.useWorkflow,
68
71
  useWorkflowState: () => import_hooks.useWorkflowState,
69
72
  validateWorkflow: () => import_core.validateWorkflow
@@ -89,6 +92,7 @@ var import_stream = require("@kortyx/stream");
89
92
  completeResponse,
90
93
  consumeStream,
91
94
  createAgent,
95
+ createCachingFrameworkAdapter,
92
96
  createChatRouteHandler,
93
97
  createCheckpointRouteHandler,
94
98
  createFailureResponse,
@@ -97,6 +101,7 @@ var import_stream = require("@kortyx/stream");
97
101
  createInMemoryFrameworkAdapter,
98
102
  createInMemoryWorkflowRegistry,
99
103
  createMCPClient,
104
+ createPostgresFrameworkAdapter,
100
105
  createRedisFrameworkAdapter,
101
106
  createStreamResponse,
102
107
  createStructuredStreamAccumulator,
@@ -123,6 +128,7 @@ var import_stream = require("@kortyx/stream");
123
128
  useReason,
124
129
  useRuntimeContext,
125
130
  useStructuredData,
131
+ useTool,
126
132
  useWorkflow,
127
133
  useWorkflowState,
128
134
  validateWorkflow,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from \"@kortyx/core/errors\";\n// release-test: 2026-01-22\n// Public DX surface for the Kortyx framework.\n\nexport type {\n Agent,\n AgentProcessOptions,\n ChatRequestBody,\n CheckpointRequestBody,\n CreateAgentArgs,\n ExecutableWorkflow,\n ExecuteOptions,\n ExecutionInfo,\n ExecutionInterrupt,\n ExecutionResult,\n InterruptScope,\n ListInterruptsOptions,\n PendingInterrupt,\n ResumableInterrupt,\n ResumeHandle,\n ResumeOptions,\n ResumeResponse,\n StreamChatFromRouteArgs,\n} from \"@kortyx/agent\";\nexport {\n createAgent,\n createChatRouteHandler,\n createCheckpointRouteHandler,\n createFailureResponse,\n ExecutionRequestError,\n handleChatRequestBody,\n handleCheckpointRequestBody,\n parseChatRequestBody,\n parseCheckpointRequestBody,\n readRequestJson,\n streamChatFromRoute,\n} from \"@kortyx/agent\";\nexport type {\n ExecutionLimit,\n ExecutionLimitReached,\n ExecutionLimits,\n GraphState,\n NodeConfig,\n NodeContext,\n NodeFn,\n NodeHandler,\n NodeResult,\n RuntimeEnvelope,\n WorkflowDefinition,\n WorkflowId,\n} from \"@kortyx/core\";\nexport { defineWorkflow, loadWorkflow, validateWorkflow } from \"@kortyx/core\";\nexport type {\n EnsureWorkflowTopologyRequest,\n EnsureWorkflowTopologyResponse,\n KortyxTelemetryConfig,\n KortyxTelemetryContentCapture,\n KortyxTelemetryCorrelation,\n KortyxTelemetryEvent,\n KortyxTelemetryEventType,\n KortyxTelemetryPrompt,\n KortyxTelemetryReporter,\n KortyxTelemetryService,\n KortyxTraceAdapter,\n KortyxTraceMetadata,\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonResult,\n UseReasonStep,\n UseReasonToolExecution,\n UseStructuredDataArgs,\n} from \"@kortyx/hooks\";\nexport {\n type CompleteResponseOptions,\n completeResponse,\n createWorkflowHooks,\n ParallelError,\n parallel,\n useAbortSignal,\n useInterrupt,\n useNodeState,\n useReason,\n useRuntimeContext,\n useStructuredData,\n useWorkflow,\n useWorkflowState,\n WorkflowCallError,\n} from \"@kortyx/hooks\";\nexport type {\n CreateMCPClientArgs,\n MCPClient,\n McpToolsArgs,\n McpTransportConfig,\n} from \"@kortyx/mcp\";\nexport { createMCPClient } from \"@kortyx/mcp\";\nexport * from \"@kortyx/providers\";\nexport type { WorkflowRegistry } from \"@kortyx/runtime\";\nexport {\n clearRegisteredNodes,\n createFileWorkflowRegistry,\n createFrameworkAdapterFromEnv,\n createInMemoryFrameworkAdapter,\n createInMemoryWorkflowRegistry,\n createRedisFrameworkAdapter,\n getRegisteredNode,\n listRegisteredNodes,\n registerNode,\n} from \"@kortyx/runtime\";\nexport type {\n BufferedStreamResult,\n ConsumeStreamHandlers,\n StreamChunk,\n StructuredDataChunk,\n StructuredStreamAccumulator,\n StructuredStreamState,\n} from \"@kortyx/stream\";\nexport {\n applyStructuredChunk,\n collectBufferedStream,\n collectStream,\n consumeStream,\n createStreamResponse,\n createStructuredStreamAccumulator,\n readStream,\n reduceStructuredChunks,\n summarizeStreamChunks,\n toSSE,\n} from \"@kortyx/stream\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAc,gCAAd;AAwBA,mBAYO;AAeP,kBAA+D;AAqB/D,mBAeO;AAOP,iBAAgC;AAChC,0BAAc,8BA/Fd;AAiGA,qBAUO;AASP,oBAWO;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from \"@kortyx/core/errors\";\n// release-test: 2026-01-22\n// Public DX surface for the Kortyx framework.\n\nexport type {\n Agent,\n AgentProcessOptions,\n ChatRequestBody,\n CheckpointRequestBody,\n CreateAgentArgs,\n ExecutableWorkflow,\n ExecuteOptions,\n ExecutionInfo,\n ExecutionInterrupt,\n ExecutionResult,\n InterruptScope,\n ListInterruptsOptions,\n PendingInterrupt,\n ResumableInterrupt,\n ResumeHandle,\n ResumeOptions,\n ResumeResponse,\n StreamChatFromRouteArgs,\n} from \"@kortyx/agent\";\nexport {\n createAgent,\n createChatRouteHandler,\n createCheckpointRouteHandler,\n createFailureResponse,\n ExecutionRequestError,\n handleChatRequestBody,\n handleCheckpointRequestBody,\n parseChatRequestBody,\n parseCheckpointRequestBody,\n readRequestJson,\n streamChatFromRoute,\n} from \"@kortyx/agent\";\nexport type {\n ExecutionLimit,\n ExecutionLimitReached,\n ExecutionLimits,\n GraphState,\n NodeConfig,\n NodeContext,\n NodeFn,\n NodeHandler,\n NodeResult,\n RuntimeEnvelope,\n WorkflowDefinition,\n WorkflowId,\n} from \"@kortyx/core\";\nexport { defineWorkflow, loadWorkflow, validateWorkflow } from \"@kortyx/core\";\nexport type {\n EnsureWorkflowTopologyRequest,\n EnsureWorkflowTopologyResponse,\n KortyxErrorDetails,\n KortyxTelemetryConfig,\n KortyxTelemetryContentCapture,\n KortyxTelemetryCorrelation,\n KortyxTelemetryEvent,\n KortyxTelemetryEventType,\n KortyxTelemetryPrompt,\n KortyxTelemetryReporter,\n KortyxTelemetryService,\n KortyxTraceAdapter,\n KortyxTraceErrorProjection,\n KortyxTraceMetadata,\n UseInterruptArgs,\n UseReasonArgs,\n UseReasonResult,\n UseReasonStep,\n UseReasonToolExecution,\n UseStructuredDataArgs,\n UseToolArgs,\n} from \"@kortyx/hooks\";\nexport {\n type CompleteResponseOptions,\n completeResponse,\n createWorkflowHooks,\n ParallelError,\n parallel,\n useAbortSignal,\n useInterrupt,\n useNodeState,\n useReason,\n useRuntimeContext,\n useStructuredData,\n useTool,\n useWorkflow,\n useWorkflowState,\n WorkflowCallError,\n} from \"@kortyx/hooks\";\nexport type {\n CreateMCPClientArgs,\n MCPClient,\n McpToolsArgs,\n McpTransportConfig,\n} from \"@kortyx/mcp\";\nexport { createMCPClient } from \"@kortyx/mcp\";\nexport * from \"@kortyx/providers\";\nexport type {\n CreateCachingFrameworkAdapterOptions,\n CreatePostgresFrameworkAdapterOptions,\n FrameworkAdapter,\n ManagedFrameworkAdapter,\n PostgresFrameworkAdapter,\n PruneRuntimeOptions,\n PruneRuntimeResult,\n RuntimeMaintenance,\n RuntimeRetentionPolicy,\n WorkflowRegistry,\n} from \"@kortyx/runtime\";\nexport {\n clearRegisteredNodes,\n createCachingFrameworkAdapter,\n createFileWorkflowRegistry,\n createFrameworkAdapterFromEnv,\n createInMemoryFrameworkAdapter,\n createInMemoryWorkflowRegistry,\n createPostgresFrameworkAdapter,\n createRedisFrameworkAdapter,\n getRegisteredNode,\n listRegisteredNodes,\n registerNode,\n} from \"@kortyx/runtime\";\nexport type {\n BufferedStreamResult,\n ConsumeStreamHandlers,\n StreamChunk,\n StructuredDataChunk,\n StructuredStreamAccumulator,\n StructuredStreamState,\n} from \"@kortyx/stream\";\nexport {\n applyStructuredChunk,\n collectBufferedStream,\n collectStream,\n consumeStream,\n createStreamResponse,\n createStructuredStreamAccumulator,\n readStream,\n reduceStructuredChunks,\n summarizeStreamChunks,\n toSSE,\n} from \"@kortyx/stream\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAc,gCAAd;AAwBA,mBAYO;AAeP,kBAA+D;AAwB/D,mBAgBO;AAOP,iBAAgC;AAChC,0BAAc,8BAnGd;AAgHA,qBAYO;AASP,oBAWO;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kortyx",
3
- "version": "0.20.4",
3
+ "version": "0.22.0",
4
4
  "private": false,
5
5
  "description": "TypeScript framework for production AI agents with explicit workflows, provider-agnostic models, streaming, interrupts, and runtime persistence.",
6
6
  "keywords": [
@@ -43,15 +43,15 @@
43
43
  "CHANGELOG.md"
44
44
  ],
45
45
  "dependencies": {
46
- "@kortyx/cli": "0.7.3",
47
- "@kortyx/agent": "0.23.0",
46
+ "@kortyx/agent": "0.25.0",
47
+ "@kortyx/cli": "0.9.0",
48
48
  "@kortyx/core": "0.9.0",
49
- "@kortyx/mcp": "0.2.3",
50
- "@kortyx/hooks": "0.25.2",
51
- "@kortyx/providers": "0.7.0",
52
- "@kortyx/stream": "0.12.0",
49
+ "@kortyx/mcp": "0.2.4",
50
+ "@kortyx/hooks": "0.26.0",
51
+ "@kortyx/providers": "0.8.0",
53
52
  "@kortyx/utils": "0.3.0",
54
- "@kortyx/runtime": "0.18.0"
53
+ "@kortyx/runtime": "0.20.0",
54
+ "@kortyx/stream": "0.12.0"
55
55
  },
56
56
  "devDependencies": {
57
57
  "turbo": "2.6.1",