@kortyx/agent 0.2.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 (37) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/chat/create-agent.d.ts +16 -0
  3. package/dist/chat/create-agent.d.ts.map +1 -0
  4. package/dist/chat/create-agent.js +61 -0
  5. package/dist/chat/process-chat.d.ts +25 -0
  6. package/dist/chat/process-chat.d.ts.map +1 -0
  7. package/dist/chat/process-chat.js +69 -0
  8. package/dist/index.d.ts +12 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +16 -0
  11. package/dist/interrupt/resume-handler.d.ts +27 -0
  12. package/dist/interrupt/resume-handler.d.ts.map +1 -0
  13. package/dist/interrupt/resume-handler.js +89 -0
  14. package/dist/orchestrator.d.ts +20 -0
  15. package/dist/orchestrator.d.ts.map +1 -0
  16. package/dist/orchestrator.js +391 -0
  17. package/dist/stream/transform-graph-stream-for-ui.d.ts +10 -0
  18. package/dist/stream/transform-graph-stream-for-ui.d.ts.map +1 -0
  19. package/dist/stream/transform-graph-stream-for-ui.js +194 -0
  20. package/dist/types/chat-message.d.ts +8 -0
  21. package/dist/types/chat-message.d.ts.map +1 -0
  22. package/dist/types/chat-message.js +2 -0
  23. package/dist/utils/extract-latest-message.d.ts +3 -0
  24. package/dist/utils/extract-latest-message.d.ts.map +1 -0
  25. package/dist/utils/extract-latest-message.js +14 -0
  26. package/package.json +36 -0
  27. package/src/chat/create-agent.ts +97 -0
  28. package/src/chat/process-chat.ts +132 -0
  29. package/src/index.ts +22 -0
  30. package/src/interrupt/resume-handler.ts +146 -0
  31. package/src/orchestrator.ts +532 -0
  32. package/src/stream/transform-graph-stream-for-ui.ts +245 -0
  33. package/src/types/chat-message.ts +7 -0
  34. package/src/utils/extract-latest-message.ts +13 -0
  35. package/tsconfig.build.json +21 -0
  36. package/tsconfig.build.tsbuildinfo +1 -0
  37. package/tsconfig.json +16 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,8 @@
1
+ # Changelog
2
+
3
+ ## [0.2.0](https://github.com/kortyx-io/kortyx/compare/agent-v0.1.0...agent-v0.2.0) (2026-01-21)
4
+
5
+
6
+ ### Features
7
+
8
+ * create kortyx packages ([fb9d281](https://github.com/kortyx-io/kortyx/commit/fb9d281e92e885fcfc2948dc1ee9701e881f7321))
@@ -0,0 +1,16 @@
1
+ import type { KortyxConfig, WorkflowRegistry } from "@kortyx/runtime";
2
+ import type { SelectWorkflowFn } from "../orchestrator";
3
+ import type { ChatMessage } from "../types/chat-message";
4
+ import type { ProcessChatArgs } from "./process-chat";
5
+ export interface CreateAgentArgs<Config extends Record<string, unknown>, Options> extends Omit<ProcessChatArgs<Config, Options>, "messages" | "options" | "selectWorkflow" | "workflowRegistry"> {
6
+ workflowsDir?: string;
7
+ workflowRegistry?: WorkflowRegistry;
8
+ selectWorkflow?: SelectWorkflowFn;
9
+ fallbackWorkflowId?: string;
10
+ config?: KortyxConfig;
11
+ configPath?: string;
12
+ }
13
+ export declare function createAgent<Config extends Record<string, unknown>, Options = unknown>(args: CreateAgentArgs<Config, Options>): {
14
+ processChat: (messages: ChatMessage[], options?: Options) => Promise<Response>;
15
+ };
16
+ //# sourceMappingURL=create-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-agent.d.ts","sourceRoot":"","sources":["../../src/chat/create-agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,MAAM,WAAW,eAAe,CAC9B,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,OAAO,CACP,SAAQ,IAAI,CACV,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,UAAU,GAAG,SAAS,GAAG,gBAAgB,GAAG,kBAAkB,CAC/D;IACD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,WAAW,CACzB,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,OAAO,GAAG,OAAO,EACjB,IAAI,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC;4BA6CN,WAAW,EAAE,YAAY,OAAO;EAyBjE"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAgent = createAgent;
4
+ const runtime_1 = require("@kortyx/runtime");
5
+ const path_1 = require("path");
6
+ const process_chat_1 = require("./process-chat");
7
+ function createAgent(args) {
8
+ const { workflowsDir, workflowRegistry, selectWorkflow, fallbackWorkflowId, config, configPath, ...baseArgs } = args;
9
+ const resolvedCwd = process.cwd();
10
+ const registryPromise = (async () => {
11
+ if (workflowRegistry)
12
+ return workflowRegistry;
13
+ if (workflowsDir) {
14
+ return (0, runtime_1.createFileWorkflowRegistry)({
15
+ workflowsDir,
16
+ fallbackId: fallbackWorkflowId ?? "general-chat",
17
+ });
18
+ }
19
+ const loadConfigArgs = {
20
+ cwd: resolvedCwd,
21
+ ...(configPath ? { configPath } : {}),
22
+ };
23
+ const loadedConfig = config ?? (await (0, runtime_1.loadKortyxConfig)(loadConfigArgs));
24
+ const resolvedWorkflowsDir = loadedConfig?.workflowsDir ?? (0, path_1.resolve)(resolvedCwd, "src", "workflows");
25
+ const registryOptions = {
26
+ workflowsDir: resolvedWorkflowsDir,
27
+ fallbackId: loadedConfig?.fallbackWorkflowId ??
28
+ fallbackWorkflowId ??
29
+ "general-chat",
30
+ ...(loadedConfig?.registry?.cache !== undefined
31
+ ? { cache: loadedConfig.registry.cache }
32
+ : {}),
33
+ ...(loadedConfig?.registry?.extensions
34
+ ? { extensions: loadedConfig.registry.extensions }
35
+ : {}),
36
+ };
37
+ return (0, runtime_1.createFileWorkflowRegistry)(registryOptions);
38
+ })();
39
+ return {
40
+ processChat: async (messages, options) => {
41
+ if (selectWorkflow) {
42
+ return (0, process_chat_1.processChat)({
43
+ ...baseArgs,
44
+ messages,
45
+ options,
46
+ selectWorkflow,
47
+ });
48
+ }
49
+ const registry = await registryPromise;
50
+ if (!registry) {
51
+ throw new Error("createAgent requires workflowsDir, workflowRegistry, or selectWorkflow.");
52
+ }
53
+ return (0, process_chat_1.processChat)({
54
+ ...baseArgs,
55
+ messages,
56
+ options,
57
+ workflowRegistry: registry,
58
+ });
59
+ },
60
+ };
61
+ }
@@ -0,0 +1,25 @@
1
+ import type { MemoryAdapter } from "@kortyx/memory";
2
+ import type { GetProviderFn } from "@kortyx/providers";
3
+ import type { WorkflowRegistry } from "@kortyx/runtime";
4
+ import type { ApplyResumeSelection } from "../interrupt/resume-handler";
5
+ import type { SelectWorkflowFn } from "../orchestrator";
6
+ import type { ChatMessage } from "../types/chat-message";
7
+ type InitializeProvidersFn<Config> = (aiConfig: Config extends {
8
+ ai: infer A;
9
+ } ? A : unknown) => void;
10
+ export interface ProcessChatArgs<Config extends Record<string, unknown>, Options> {
11
+ messages: ChatMessage[];
12
+ options?: Options | undefined;
13
+ sessionId?: string;
14
+ defaultWorkflowId?: string;
15
+ loadRuntimeConfig: (options?: Options) => Config | Promise<Config>;
16
+ selectWorkflow?: SelectWorkflowFn;
17
+ workflowRegistry?: WorkflowRegistry;
18
+ getProvider: GetProviderFn;
19
+ initializeProviders?: InitializeProvidersFn<Config>;
20
+ memoryAdapter: MemoryAdapter;
21
+ applyResumeSelection?: ApplyResumeSelection;
22
+ }
23
+ export declare function processChat<Config extends Record<string, unknown>, Options = unknown>({ messages, options, sessionId, defaultWorkflowId, loadRuntimeConfig, selectWorkflow, workflowRegistry, getProvider, initializeProviders, memoryAdapter, applyResumeSelection, }: ProcessChatArgs<Config, Options>): Promise<Response>;
24
+ export {};
25
+ //# sourceMappingURL=process-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-chat.d.ts","sourceRoot":"","sources":["../../src/chat/process-chat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAExE,OAAO,KAAK,EAAgB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzD,KAAK,qBAAqB,CAAC,MAAM,IAAI,CACnC,QAAQ,EAAE,MAAM,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,CAAC,GAAG,OAAO,KACnD,IAAI,CAAC;AAEV,MAAM,WAAW,eAAe,CAC9B,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,OAAO;IAEP,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnE,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,WAAW,EAAE,aAAa,CAAC;IAC3B,mBAAmB,CAAC,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACpD,aAAa,EAAE,aAAa,CAAC;IAC7B,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED,wBAAsB,WAAW,CAC/B,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,OAAO,GAAG,OAAO,EACjB,EACA,QAAQ,EACR,OAAO,EACP,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,oBAAoB,GACrB,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkFtD"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.processChat = processChat;
4
+ const runtime_1 = require("@kortyx/runtime");
5
+ const stream_1 = require("@kortyx/stream");
6
+ const resume_handler_1 = require("../interrupt/resume-handler");
7
+ const orchestrator_1 = require("../orchestrator");
8
+ const extract_latest_message_1 = require("../utils/extract-latest-message");
9
+ async function processChat({ messages, options, sessionId, defaultWorkflowId, loadRuntimeConfig, selectWorkflow, workflowRegistry, getProvider, initializeProviders, memoryAdapter, applyResumeSelection, }) {
10
+ const config = await loadRuntimeConfig(options);
11
+ if (initializeProviders) {
12
+ initializeProviders(config?.ai);
13
+ }
14
+ const runtimeConfig = {
15
+ ...config,
16
+ getProvider,
17
+ ...(memoryAdapter ? { memoryAdapter } : {}),
18
+ };
19
+ const workflowSelector = selectWorkflow ??
20
+ (workflowRegistry ? (id) => workflowRegistry.select(id) : null);
21
+ if (!workflowSelector) {
22
+ throw new Error("processChat requires selectWorkflow or workflowRegistry to resolve workflows.");
23
+ }
24
+ const fallbackSessionId = options
25
+ ?.sessionId;
26
+ const resolvedSessionId = sessionId || fallbackSessionId || "anonymous-session";
27
+ const last = messages[messages.length - 1];
28
+ const input = (0, extract_latest_message_1.extractLatestUserMessage)(messages);
29
+ const previousMessages = messages.slice(0, -1);
30
+ const storedState = await memoryAdapter.load(resolvedSessionId);
31
+ const memory = {
32
+ ...(storedState?.memory ?? {}),
33
+ ...(previousMessages.length > 0 && {
34
+ conversationMessages: previousMessages,
35
+ }),
36
+ };
37
+ const baseState = await (0, runtime_1.buildInitialGraphState)({
38
+ input,
39
+ config: runtimeConfig,
40
+ memory,
41
+ ...(defaultWorkflowId ? { defaultWorkflowId } : {}),
42
+ });
43
+ const saveMemory = async (activeSessionId, state) => {
44
+ await memoryAdapter.save(activeSessionId, state);
45
+ };
46
+ const resumeStream = await (0, resume_handler_1.tryPrepareResumeStream)({
47
+ lastMessage: last,
48
+ sessionId: resolvedSessionId,
49
+ config: runtimeConfig,
50
+ saveMemory,
51
+ selectWorkflow: workflowSelector,
52
+ ...(defaultWorkflowId ? { defaultWorkflowId } : {}),
53
+ ...(applyResumeSelection ? { applyResumeSelection } : {}),
54
+ });
55
+ if (resumeStream)
56
+ return (0, stream_1.createStreamResponse)(resumeStream);
57
+ const currentWorkflow = baseState.currentWorkflow;
58
+ const selectedWorkflow = await workflowSelector(currentWorkflow);
59
+ const graph = await (0, runtime_1.createLangGraph)(selectedWorkflow, runtimeConfig);
60
+ const orchestratedStream = await (0, orchestrator_1.orchestrateGraphStream)({
61
+ sessionId: resolvedSessionId,
62
+ graph,
63
+ state: { ...baseState, currentWorkflow },
64
+ config: runtimeConfig,
65
+ saveMemory,
66
+ selectWorkflow: workflowSelector,
67
+ });
68
+ return (0, stream_1.createStreamResponse)(orchestratedStream);
69
+ }
@@ -0,0 +1,12 @@
1
+ export type { CreateAgentArgs } from "./chat/create-agent";
2
+ export { createAgent } from "./chat/create-agent";
3
+ export type { ProcessChatArgs } from "./chat/process-chat";
4
+ export { processChat } from "./chat/process-chat";
5
+ export type { ApplyResumeSelection, ResumeMeta, } from "./interrupt/resume-handler";
6
+ export { parseResumeMeta, tryPrepareResumeStream, } from "./interrupt/resume-handler";
7
+ export type { CompiledGraphLike, OrchestrateArgs, SaveMemoryFn, SelectWorkflowFn, } from "./orchestrator";
8
+ export { orchestrateGraphStream } from "./orchestrator";
9
+ export { transformGraphStreamForUI } from "./stream/transform-graph-stream-for-ui";
10
+ export type { ChatMessage } from "./types/chat-message";
11
+ export { extractLatestUserMessage } from "./utils/extract-latest-message";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EACV,oBAAoB,EACpB,UAAU,GACX,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,eAAe,EACf,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACnF,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractLatestUserMessage = exports.transformGraphStreamForUI = exports.orchestrateGraphStream = exports.tryPrepareResumeStream = exports.parseResumeMeta = exports.processChat = exports.createAgent = void 0;
4
+ var create_agent_1 = require("./chat/create-agent");
5
+ Object.defineProperty(exports, "createAgent", { enumerable: true, get: function () { return create_agent_1.createAgent; } });
6
+ var process_chat_1 = require("./chat/process-chat");
7
+ Object.defineProperty(exports, "processChat", { enumerable: true, get: function () { return process_chat_1.processChat; } });
8
+ var resume_handler_1 = require("./interrupt/resume-handler");
9
+ Object.defineProperty(exports, "parseResumeMeta", { enumerable: true, get: function () { return resume_handler_1.parseResumeMeta; } });
10
+ Object.defineProperty(exports, "tryPrepareResumeStream", { enumerable: true, get: function () { return resume_handler_1.tryPrepareResumeStream; } });
11
+ var orchestrator_1 = require("./orchestrator");
12
+ Object.defineProperty(exports, "orchestrateGraphStream", { enumerable: true, get: function () { return orchestrator_1.orchestrateGraphStream; } });
13
+ var transform_graph_stream_for_ui_1 = require("./stream/transform-graph-stream-for-ui");
14
+ Object.defineProperty(exports, "transformGraphStreamForUI", { enumerable: true, get: function () { return transform_graph_stream_for_ui_1.transformGraphStreamForUI; } });
15
+ var extract_latest_message_1 = require("./utils/extract-latest-message");
16
+ Object.defineProperty(exports, "extractLatestUserMessage", { enumerable: true, get: function () { return extract_latest_message_1.extractLatestUserMessage; } });
@@ -0,0 +1,27 @@
1
+ import { type PendingRequestRecord } from "@kortyx/memory";
2
+ import type { StreamChunk } from "@kortyx/stream";
3
+ import type { SaveMemoryFn, SelectWorkflowFn } from "../orchestrator";
4
+ import type { ChatMessage } from "../types/chat-message";
5
+ export interface ResumeMeta {
6
+ token: string;
7
+ requestId: string;
8
+ selected: string[];
9
+ cancel?: boolean;
10
+ }
11
+ export type ApplyResumeSelection = (args: {
12
+ pending: PendingRequestRecord;
13
+ selected: string[];
14
+ }) => Record<string, unknown> | null | undefined;
15
+ export declare function parseResumeMeta(msg: ChatMessage | undefined): ResumeMeta | null;
16
+ interface TryResumeArgs {
17
+ lastMessage: ChatMessage | undefined;
18
+ sessionId: string;
19
+ config: Record<string, unknown>;
20
+ saveMemory?: SaveMemoryFn;
21
+ selectWorkflow: SelectWorkflowFn;
22
+ defaultWorkflowId?: string;
23
+ applyResumeSelection?: ApplyResumeSelection;
24
+ }
25
+ export declare function tryPrepareResumeStream({ lastMessage, sessionId, config, saveMemory, selectWorkflow, defaultWorkflowId, applyResumeSelection, }: TryResumeArgs): Promise<AsyncIterable<StreamChunk> | null>;
26
+ export {};
27
+ //# sourceMappingURL=resume-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-handler.d.ts","sourceRoot":"","sources":["../../src/interrupt/resume-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,IAAI,EAAE;IACxC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;AAEjD,wBAAgB,eAAe,CAC7B,GAAG,EAAE,WAAW,GAAG,SAAS,GAC3B,UAAU,GAAG,IAAI,CAmBnB;AAED,UAAU,aAAa;IACrB,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,cAAc,EAAE,gBAAgB,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED,wBAAsB,sBAAsB,CAAC,EAC3C,WAAW,EACX,SAAS,EACT,MAAM,EACN,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,oBAAoB,GACrB,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAgF5D"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseResumeMeta = parseResumeMeta;
4
+ exports.tryPrepareResumeStream = tryPrepareResumeStream;
5
+ const memory_1 = require("@kortyx/memory");
6
+ const runtime_1 = require("@kortyx/runtime");
7
+ const orchestrator_1 = require("../orchestrator");
8
+ function parseResumeMeta(msg) {
9
+ if (!msg || !msg.metadata)
10
+ return null;
11
+ const raw = msg.metadata?.resume;
12
+ if (!raw)
13
+ return null;
14
+ const token = typeof raw.token === "string" ? raw.token : "";
15
+ const requestId = typeof raw.requestId === "string" ? raw.requestId : "";
16
+ const cancel = Boolean(raw.cancel);
17
+ let selected = [];
18
+ if (typeof raw.selected === "string")
19
+ selected = [raw.selected];
20
+ else if (Array.isArray(raw.selected))
21
+ selected = raw.selected.map((x) => String(x));
22
+ else if (raw?.choice?.id)
23
+ selected = [String(raw.choice.id)];
24
+ else if (Array.isArray(raw?.choices))
25
+ selected = raw.choices.map((c) => String(c.id));
26
+ if (!token || !requestId)
27
+ return null;
28
+ return { token, requestId, selected, cancel };
29
+ }
30
+ async function tryPrepareResumeStream({ lastMessage, sessionId, config, saveMemory, selectWorkflow, defaultWorkflowId, applyResumeSelection, }) {
31
+ const meta = parseResumeMeta(lastMessage);
32
+ if (!meta)
33
+ return null;
34
+ const pending = (0, memory_1.getPendingRequest)(meta.token);
35
+ if (!pending || pending.requestId !== meta.requestId) {
36
+ console.log(`[resume] pending not found or mismatched. token=${meta.token} requestId=${meta.requestId}`);
37
+ return null;
38
+ }
39
+ if (meta.cancel) {
40
+ (0, memory_1.deletePendingRequest)(pending.token);
41
+ return null;
42
+ }
43
+ console.log(`[resume] token=${meta.token} requestId=${meta.requestId} selected=${JSON.stringify(meta.selected)} sessionId=${sessionId}`);
44
+ const resumeData = applyResumeSelection
45
+ ? applyResumeSelection({ pending, selected: meta.selected })
46
+ : meta.selected?.length
47
+ ? { coordinates: String(meta.selected[0]) }
48
+ : {};
49
+ const resumeDataPatch = resumeData && typeof resumeData === "object" ? resumeData : {};
50
+ const resumedState = {
51
+ input: "",
52
+ lastNode: "__start__",
53
+ currentWorkflow: pending.workflow ||
54
+ defaultWorkflowId ||
55
+ "job-search",
56
+ config: config,
57
+ conversationHistory: [],
58
+ awaitingHumanInput: false,
59
+ data: {
60
+ ...(pending.state?.data ?? {}),
61
+ ...resumeDataPatch,
62
+ },
63
+ };
64
+ const wf = await selectWorkflow(resumedState.currentWorkflow);
65
+ const resumeValue = meta.selected?.length
66
+ ? String(meta.selected[0])
67
+ : undefined;
68
+ const resumedGraph = await (0, runtime_1.createLangGraph)(wf, {
69
+ ...config,
70
+ resume: true,
71
+ ...(resumeValue !== undefined ? { resumeValue } : {}),
72
+ });
73
+ (0, memory_1.deletePendingRequest)(pending.token);
74
+ const args = {
75
+ sessionId,
76
+ graph: resumedGraph,
77
+ state: resumedState,
78
+ config: {
79
+ ...config,
80
+ resume: true,
81
+ ...(resumeValue !== undefined ? { resumeValue } : {}),
82
+ },
83
+ selectWorkflow,
84
+ };
85
+ if (saveMemory)
86
+ args.saveMemory = saveMemory;
87
+ const stream = await (0, orchestrator_1.orchestrateGraphStream)(args);
88
+ return stream;
89
+ }
@@ -0,0 +1,20 @@
1
+ import type { GraphState, WorkflowDefinition } from "@kortyx/core";
2
+ export type SelectWorkflowFn = (workflowId: string) => Promise<WorkflowDefinition<any, any>>;
3
+ export type SaveMemoryFn = (sessionId: string, state: GraphState) => Promise<void>;
4
+ export interface CompiledGraphLike {
5
+ config?: Record<string, unknown>;
6
+ streamEvents: (state: GraphState, options?: {
7
+ version?: string;
8
+ configurable?: Record<string, unknown>;
9
+ }) => AsyncIterable<unknown> | AsyncGenerator<unknown>;
10
+ }
11
+ export interface OrchestrateArgs {
12
+ sessionId?: string;
13
+ graph: CompiledGraphLike;
14
+ state: GraphState;
15
+ config: Record<string, unknown>;
16
+ saveMemory?: SaveMemoryFn;
17
+ selectWorkflow: SelectWorkflowFn;
18
+ }
19
+ export declare function orchestrateGraphStream({ sessionId, graph, state, config, saveMemory, selectWorkflow, }: OrchestrateArgs): Promise<NodeJS.ReadableStream>;
20
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAc,MAAM,cAAc,CAAC;AAgB/E,MAAM,MAAM,gBAAgB,GAAG,CAC7B,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAE3C,MAAM,MAAM,YAAY,GAAG,CACzB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,UAAU,KACd,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,EAAE,CACZ,KAAK,EAAE,UAAU,EACjB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KACnE,aAAa,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,cAAc,EAAE,gBAAgB,CAAC;CAClC;AAQD,wBAAsB,sBAAsB,CAAC,EAC3C,SAAS,EACT,KAAK,EACL,KAAK,EACL,MAAM,EACN,UAAU,EACV,cAAc,GACf,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CA4dlD"}