neoctl 0.2.0 → 0.2.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.
Files changed (92) hide show
  1. package/README.md +20 -9
  2. package/dist/context/compaction.d.ts +3 -0
  3. package/dist/context/compaction.js +231 -40
  4. package/dist/context/compaction.js.map +1 -1
  5. package/dist/context/prompts.js +4 -4
  6. package/dist/context/prompts.js.map +1 -1
  7. package/dist/core/commands.d.ts +66 -0
  8. package/dist/core/commands.js +151 -0
  9. package/dist/core/commands.js.map +1 -0
  10. package/dist/core/context-metrics.d.ts +5 -2
  11. package/dist/core/context-metrics.js +85 -9
  12. package/dist/core/context-metrics.js.map +1 -1
  13. package/dist/core/image-registry.d.ts +42 -0
  14. package/dist/core/image-registry.js +128 -0
  15. package/dist/core/image-registry.js.map +1 -0
  16. package/dist/core/message-pipeline.d.ts +6 -0
  17. package/dist/core/message-pipeline.js +12 -0
  18. package/dist/core/message-pipeline.js.map +1 -1
  19. package/dist/core/query-engine.d.ts +0 -4
  20. package/dist/core/query-engine.js +0 -22
  21. package/dist/core/query-engine.js.map +1 -1
  22. package/dist/core/query.d.ts +0 -4
  23. package/dist/core/query.js +21 -8
  24. package/dist/core/query.js.map +1 -1
  25. package/dist/core/runtime.d.ts +59 -0
  26. package/dist/core/runtime.js +161 -0
  27. package/dist/core/runtime.js.map +1 -0
  28. package/dist/core/state.d.ts +6 -7
  29. package/dist/core/state.js +2 -0
  30. package/dist/core/state.js.map +1 -1
  31. package/dist/index.d.ts +4 -1
  32. package/dist/index.js +4 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/model/anthropic-adapter.d.ts +30 -0
  35. package/dist/model/anthropic-adapter.js +106 -0
  36. package/dist/model/anthropic-adapter.js.map +1 -0
  37. package/dist/model/anthropic-mapper.d.ts +13 -0
  38. package/dist/model/anthropic-mapper.js +482 -0
  39. package/dist/model/anthropic-mapper.js.map +1 -0
  40. package/dist/model/config.d.ts +8 -2
  41. package/dist/model/config.js +24 -1
  42. package/dist/model/config.js.map +1 -1
  43. package/dist/model/openai-mappers.js +1 -1
  44. package/dist/model/openai-mappers.js.map +1 -1
  45. package/dist/model/provider-factory.js +17 -0
  46. package/dist/model/provider-factory.js.map +1 -1
  47. package/dist/model/smoke-anthropic-mapper.d.ts +1 -0
  48. package/dist/model/smoke-anthropic-mapper.js +85 -0
  49. package/dist/model/smoke-anthropic-mapper.js.map +1 -0
  50. package/dist/repl/index.js +56 -27
  51. package/dist/repl/index.js.map +1 -1
  52. package/dist/repl/transcript-flush.d.ts +6 -0
  53. package/dist/repl/transcript-flush.js +54 -0
  54. package/dist/repl/transcript-flush.js.map +1 -0
  55. package/dist/repl/transcript-format.d.ts +16 -0
  56. package/dist/repl/transcript-format.js +199 -0
  57. package/dist/repl/transcript-format.js.map +1 -0
  58. package/dist/server/agent-manager.d.ts +56 -0
  59. package/dist/server/agent-manager.js +171 -0
  60. package/dist/server/agent-manager.js.map +1 -0
  61. package/dist/server/connection-manager.d.ts +18 -0
  62. package/dist/server/connection-manager.js +52 -0
  63. package/dist/server/connection-manager.js.map +1 -0
  64. package/dist/server/event-mapper.d.ts +4 -0
  65. package/dist/server/event-mapper.js +31 -0
  66. package/dist/server/event-mapper.js.map +1 -0
  67. package/dist/server/query-runtime.d.ts +29 -0
  68. package/dist/server/query-runtime.js +61 -0
  69. package/dist/server/query-runtime.js.map +1 -0
  70. package/dist/server/rpc-router.d.ts +24 -0
  71. package/dist/server/rpc-router.js +165 -0
  72. package/dist/server/rpc-router.js.map +1 -0
  73. package/dist/server/rpc-types.d.ts +92 -0
  74. package/dist/server/rpc-types.js +2 -0
  75. package/dist/server/rpc-types.js.map +1 -0
  76. package/dist/server/ws-server.d.ts +22 -0
  77. package/dist/server/ws-server.js +84 -0
  78. package/dist/server/ws-server.js.map +1 -0
  79. package/dist/tasks/task-record.d.ts +50 -0
  80. package/dist/tasks/task-record.js +50 -0
  81. package/dist/tasks/task-record.js.map +1 -0
  82. package/dist/tips.js +1 -1
  83. package/dist/tips.js.map +1 -1
  84. package/dist/tools/builtins/image-loader-tool.d.ts +22 -0
  85. package/dist/tools/builtins/image-loader-tool.js +235 -0
  86. package/dist/tools/builtins/image-loader-tool.js.map +1 -0
  87. package/dist/web/html.js +3 -4
  88. package/dist/web/html.js.map +1 -1
  89. package/dist/web/index.d.ts +6 -0
  90. package/dist/web/index.js +60 -20
  91. package/dist/web/index.js.map +1 -1
  92. package/package.json +3 -1
@@ -0,0 +1,6 @@
1
+ import { type TranscriptUiLine } from "./transcript-format.js";
2
+ export declare function TranscriptFlusher({ lines, columns, resetEpoch, }: {
3
+ lines: readonly TranscriptUiLine[];
4
+ columns: number;
5
+ resetEpoch: number;
6
+ }): null;
@@ -0,0 +1,54 @@
1
+ import { useStdout } from "ink";
2
+ import { useLayoutEffect } from "react";
3
+ import { markdownRenderKey } from "./markdown-renderer.js";
4
+ import { formatTranscriptBlock } from "./transcript-format.js";
5
+ function messageContentWidth(columns) {
6
+ return Math.max(10, columns - 2);
7
+ }
8
+ function lineNeedsDynamicRender(line, columns) {
9
+ const w = messageContentWidth(columns);
10
+ if (line.live || line.pendingReplacement)
11
+ return true;
12
+ if (line.previewStyle === "summary" || line.format === "ansi")
13
+ return false;
14
+ return line.renderedKey !== markdownRenderKey(line.text, line.kind, w);
15
+ }
16
+ function lineDigest(line) {
17
+ return `${line.text}\0${line.renderedKey ?? ""}\0${Boolean(line.live)}\0${Boolean(line.pendingReplacement)}\0${line.title ?? ""}\0${line.format ?? ""}\0${line.previewStyle ?? ""}`;
18
+ }
19
+ /** Survives React remount / HMR so we do not re-append the same transcript blocks to scrollback. */
20
+ let transcriptDigestMap = new Map();
21
+ let transcriptDigestLastEpoch = -1;
22
+ export function TranscriptFlusher({ lines, columns, resetEpoch, }) {
23
+ const { write } = useStdout();
24
+ useLayoutEffect(() => {
25
+ if (transcriptDigestLastEpoch !== resetEpoch) {
26
+ transcriptDigestMap.clear();
27
+ transcriptDigestLastEpoch = resetEpoch;
28
+ }
29
+ const w = messageContentWidth(columns);
30
+ let tailIndex = lines.findIndex((l) => lineNeedsDynamicRender(l, columns));
31
+ if (tailIndex === -1)
32
+ tailIndex = lines.length;
33
+ const parts = [];
34
+ for (let i = 0; i < tailIndex; i++) {
35
+ const line = lines[i];
36
+ if (!line)
37
+ continue;
38
+ const digest = lineDigest(line);
39
+ const mapKey = `${resetEpoch}:${line.id}`;
40
+ const prev = transcriptDigestMap.get(mapKey);
41
+ if (prev === digest)
42
+ continue;
43
+ transcriptDigestMap.set(mapKey, digest);
44
+ const block = formatTranscriptBlock(line, w);
45
+ if (block.length === 0)
46
+ continue;
47
+ parts.push(block.endsWith("\n") ? block : `${block}\n`);
48
+ }
49
+ if (parts.length > 0)
50
+ write(parts.join(""));
51
+ }, [lines, columns, write, resetEpoch]);
52
+ return null;
53
+ }
54
+ //# sourceMappingURL=transcript-flush.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-flush.js","sourceRoot":"","sources":["../../src/repl/transcript-flush.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface TranscriptUiLine {
2
+ id: number;
3
+ kind: "system" | "user" | "assistant" | "thinking" | "tool" | "error" | "meta";
4
+ text: string;
5
+ title?: string;
6
+ bodyTitle?: string;
7
+ titleStatus?: "success" | "failure";
8
+ format?: "markdown" | "ansi" | "plain";
9
+ previewStyle?: "summary";
10
+ summaryMaxLines?: number;
11
+ live?: boolean;
12
+ pendingReplacement?: boolean;
13
+ renderedKey?: string;
14
+ }
15
+ /** Full message block as ANSI (including role marker), for scrollback via Ink `write`. */
16
+ export declare function formatTranscriptBlock(line: TranscriptUiLine, width: number): string;
@@ -0,0 +1,199 @@
1
+ import chalk from "chalk";
2
+ import stripAnsi from "strip-ansi";
3
+ import wrapAnsi from "wrap-ansi";
4
+ import { getRenderedMarkdownLines, markdownRenderKey, renderedLinesToAnsi, renderMarkdownPreviewToLines, } from "./markdown-renderer.js";
5
+ const SUMMARY_BLOCK = {
6
+ maxLines: 6,
7
+ detailIndent: " ",
8
+ };
9
+ const THINKING_COLOR = "#a855f7";
10
+ const THINKING_MARKER = "◆";
11
+ const MESSAGE_ROLE_MARKER = "● ";
12
+ function colorForKind(kind) {
13
+ if (kind === "user")
14
+ return chalk.cyan;
15
+ if (kind === "assistant")
16
+ return chalk.green;
17
+ if (kind === "thinking")
18
+ return chalk.hex(THINKING_COLOR);
19
+ if (kind === "tool")
20
+ return chalk.hex("#d4b04c");
21
+ if (kind === "error")
22
+ return chalk.red;
23
+ if (kind === "meta")
24
+ return chalk.gray;
25
+ return chalk.white;
26
+ }
27
+ function markerColorForKind(kind) {
28
+ if (kind === "thinking")
29
+ return chalk.hex(THINKING_COLOR);
30
+ return colorForKind(kind);
31
+ }
32
+ function messageRoleMarker(kind) {
33
+ if (kind === "thinking")
34
+ return `${THINKING_MARKER} `;
35
+ return MESSAGE_ROLE_MARKER;
36
+ }
37
+ function titleForKind(kind) {
38
+ if (kind === "thinking")
39
+ return `${THINKING_MARKER} think`;
40
+ if (kind === "tool")
41
+ return "Tool";
42
+ if (kind === "error")
43
+ return "Error";
44
+ if (kind === "meta")
45
+ return "Meta";
46
+ if (kind === "system")
47
+ return "System";
48
+ if (kind === "user")
49
+ return "User";
50
+ return "Assistant";
51
+ }
52
+ function titleStatusMarker(status) {
53
+ return status === "success" ? "✓" : "✗";
54
+ }
55
+ function titleStatusColor(status) {
56
+ return status === "success" ? chalk.green : chalk.red;
57
+ }
58
+ function summaryTitle(line) {
59
+ if (summaryUsesRoleMarker(line))
60
+ return "";
61
+ const title = line.title ?? titleForKind(line.kind);
62
+ if (!line.titleStatus)
63
+ return title;
64
+ return `${title} ${titleStatusMarker(line.titleStatus)}`;
65
+ }
66
+ function summaryUsesRoleMarker(line) {
67
+ return line.previewStyle === "summary" && (line.kind === "system" || line.kind === "meta");
68
+ }
69
+ function titleProvidesToolMarker(line) {
70
+ return line.kind === "tool" && !!line.title && (line.title.startsWith("◇ ") || line.title.startsWith("◆ "));
71
+ }
72
+ function truncateAnsi(value, maxLength) {
73
+ let visible = 0;
74
+ let cut = value.length;
75
+ let inAnsi = false;
76
+ for (let i = 0; i < value.length; i++) {
77
+ const ch = value[i];
78
+ if (ch === "\x1B") {
79
+ inAnsi = true;
80
+ continue;
81
+ }
82
+ if (inAnsi) {
83
+ if (ch === "m")
84
+ inAnsi = false;
85
+ continue;
86
+ }
87
+ visible++;
88
+ if (visible > maxLength) {
89
+ cut = i;
90
+ break;
91
+ }
92
+ }
93
+ return value.slice(0, cut);
94
+ }
95
+ function renderSummaryLines(line, width) {
96
+ const content = line.text;
97
+ const detailWidth = Math.max(10, width - SUMMARY_BLOCK.detailIndent.length);
98
+ const title = summaryTitle(line);
99
+ const rawLines = content.replace(/\r\n/g, "\n").split("\n");
100
+ const wrapped = rawLines.flatMap((rawLine, index) => {
101
+ const lineWidth = index === 0 && !title ? width : detailWidth;
102
+ return wrapAnsi(rawLine, Math.max(10, lineWidth), { hard: true, trim: false }).split("\n");
103
+ });
104
+ const maxLines = line.summaryMaxLines ?? SUMMARY_BLOCK.maxLines;
105
+ const preview = [title, ...wrapped].filter((value) => stripAnsi(value).length > 0).slice(0, maxLines);
106
+ if (wrapped.length + (title ? 1 : 0) > maxLines && preview.length > 0) {
107
+ preview[preview.length - 1] = truncateAnsi(preview[preview.length - 1], Math.max(1, detailWidth - 1)) + "…";
108
+ }
109
+ return preview.length ? preview : [""];
110
+ }
111
+ function formatSummaryTranscript(line, width) {
112
+ const useRoleMarker = summaryUsesRoleMarker(line);
113
+ const summaryWidth = useRoleMarker ? width : Math.max(10, width - 2);
114
+ const lines = renderSummaryLines(line, summaryWidth);
115
+ const out = [];
116
+ for (let index = 0; index < lines.length; index++) {
117
+ const previewLine = lines[index] ?? "";
118
+ const detail = index > 0;
119
+ const text = detail ? `${SUMMARY_BLOCK.detailIndent}${previewLine}` : previewLine;
120
+ if (!detail && line.titleStatus) {
121
+ const marker = titleStatusMarker(line.titleStatus);
122
+ const markerSuffix = ` ${marker}`;
123
+ const titleText = text.endsWith(markerSuffix) ? text.slice(0, -markerSuffix.length) : `${text} `;
124
+ out.push(`${colorForKind(line.kind).bold(titleText)}${titleStatusColor(line.titleStatus).bold(marker)}`);
125
+ }
126
+ else if (line.format === "ansi") {
127
+ out.push(detail ? chalk.gray.dim(text) : `${colorForKind(line.kind).bold(text)}`);
128
+ }
129
+ else {
130
+ out.push(detail ? chalk.gray.dim(text) : colorForKind(line.kind).bold(text));
131
+ }
132
+ }
133
+ const prefix = useRoleMarker ? markerColorForKind(line.kind)(messageRoleMarker(line.kind)) : "";
134
+ const body = out.join("\n");
135
+ return useRoleMarker ? `${prefix}${body}` : body;
136
+ }
137
+ function formatPlainTranscript(line, width) {
138
+ const useRoleMarker = !titleProvidesToolMarker(line);
139
+ const lineWidth = useRoleMarker ? width : Math.max(10, width - 2);
140
+ const parts = [];
141
+ if (line.title) {
142
+ const t = line.titleStatus
143
+ ? `${colorForKind(line.kind).bold(line.title)} ${titleStatusColor(line.titleStatus).bold(titleStatusMarker(line.titleStatus))}`
144
+ : colorForKind(line.kind).bold(line.title);
145
+ parts.push(t);
146
+ }
147
+ if (line.bodyTitle)
148
+ parts.push(chalk.bold(line.bodyTitle));
149
+ const mdKind = line.kind;
150
+ const rendered = getRenderedMarkdownLines(line.text, mdKind, lineWidth);
151
+ parts.push(renderedLinesToAnsi(rendered, mdKind));
152
+ const body = parts.join("\n");
153
+ return useRoleMarker ? `${markerColorForKind(line.kind)(messageRoleMarker(line.kind))}${body}` : body;
154
+ }
155
+ function formatAnsiTranscript(line, width) {
156
+ const useRoleMarker = !titleProvidesToolMarker(line);
157
+ const lineWidth = useRoleMarker ? width : Math.max(10, width - 2);
158
+ const wrapped = wrapAnsi(line.text, Math.max(10, lineWidth), { hard: true, trim: false }).split("\n");
159
+ const parts = [];
160
+ if (line.title) {
161
+ const t = line.titleStatus
162
+ ? `${colorForKind(line.kind).bold(line.title)} ${titleStatusColor(line.titleStatus).bold(titleStatusMarker(line.titleStatus))}`
163
+ : colorForKind(line.kind).bold(line.title);
164
+ parts.push(t);
165
+ }
166
+ if (line.bodyTitle)
167
+ parts.push(chalk.bold(line.bodyTitle));
168
+ parts.push(...wrapped);
169
+ const body = parts.join("\n");
170
+ return useRoleMarker ? `${markerColorForKind(line.kind)(messageRoleMarker(line.kind))}${body}` : body;
171
+ }
172
+ /** Full message block as ANSI (including role marker), for scrollback via Ink `write`. */
173
+ export function formatTranscriptBlock(line, width) {
174
+ if (line.previewStyle === "summary")
175
+ return formatSummaryTranscript(line, width);
176
+ if (line.format === "ansi")
177
+ return formatAnsiTranscript(line, width);
178
+ const key = markdownRenderKey(line.text, line.kind, width);
179
+ if (line.renderedKey === key) {
180
+ return formatPlainTranscript(line, width);
181
+ }
182
+ const mdKind = line.kind;
183
+ const useRoleMarker = !titleProvidesToolMarker(line);
184
+ const lineWidth = useRoleMarker ? width : Math.max(10, width - 2);
185
+ const parts = [];
186
+ if (line.title) {
187
+ const t = line.titleStatus
188
+ ? `${colorForKind(line.kind).bold(line.title)} ${titleStatusColor(line.titleStatus).bold(titleStatusMarker(line.titleStatus))}`
189
+ : colorForKind(line.kind).bold(line.title);
190
+ parts.push(t);
191
+ }
192
+ if (line.bodyTitle)
193
+ parts.push(chalk.bold(line.bodyTitle));
194
+ const preview = renderMarkdownPreviewToLines(line.text, mdKind, lineWidth);
195
+ parts.push(renderedLinesToAnsi(preview, mdKind));
196
+ const body = parts.join("\n");
197
+ return useRoleMarker ? `${markerColorForKind(line.kind)(messageRoleMarker(line.kind))}${body}` : body;
198
+ }
199
+ //# sourceMappingURL=transcript-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-format.js","sourceRoot":"","sources":["../../src/repl/transcript-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,mBAAmB,EACnB,4BAA4B,GAE7B,MAAM,wBAAwB,CAAC;AAEhC,MAAM,aAAa,GAAG;IACpB,QAAQ,EAAE,CAAC;IACX,YAAY,EAAE,MAAM;CACZ,CAAC;AAEX,MAAM,cAAc,GAAG,SAAS,CAAC;AACjC,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAiBjC,SAAS,YAAY,CAAC,IAA8B;IAClD,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IACvC,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC;IAC7C,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1D,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC;IACvC,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IACvC,OAAO,KAAK,CAAC,KAAK,CAAC;AACrB,CAAC;AAED,SAAS,kBAAkB,CAAC,IAA8B;IACxD,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1D,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,iBAAiB,CAAC,IAA+B;IACxD,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,GAAG,eAAe,GAAG,CAAC;IACtD,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED,SAAS,YAAY,CAAC,IAA8B;IAClD,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,GAAG,eAAe,QAAQ,CAAC;IAC3D,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACnC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACrC,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACnC,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACvC,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACnC,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAoD;IAC7E,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAC1C,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAoD;IAC5E,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;AACxD,CAAC;AAED,SAAS,YAAY,CAAC,IAAsB;IAC1C,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,CAAC,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IACpC,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAsB;IACnD,OAAO,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAsB;IACrD,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9G,CAAC;AAED,SAAS,YAAY,CAAC,KAAa,EAAE,SAAiB;IACpD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;YAClB,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,EAAE,KAAK,GAAG;gBAAE,MAAM,GAAG,KAAK,CAAC;YAC/B,SAAS;QACX,CAAC;QACD,OAAO,EAAE,CAAC;QACV,IAAI,OAAO,GAAG,SAAS,EAAE,CAAC;YACxB,GAAG,GAAG,CAAC,CAAC;YACR,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAsB,EAAE,KAAa;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;IAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QAClD,MAAM,SAAS,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC;QAC9D,OAAO,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,IAAI,aAAa,CAAC,QAAQ,CAAC;IAChE,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtE,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IAC9G,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAsB,EAAE,KAAa;IACpE,MAAM,aAAa,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACrD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,YAAY,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;QAClF,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACnD,MAAM,YAAY,GAAG,IAAI,MAAM,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;YACjG,GAAG,CAAC,IAAI,CACN,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAC/F,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAClC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpF,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChG,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAsB,EAAE,KAAa;IAClE,MAAM,aAAa,GAAG,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAClE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW;YACxB,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE;YAC/H,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,IAAI,IAAI,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAwB,CAAC;IAC7C,MAAM,QAAQ,GAAG,wBAAwB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,aAAa,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACxG,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAsB,EAAE,KAAa;IACjE,MAAM,aAAa,GAAG,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtG,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW;YACxB,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE;YAC/H,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,IAAI,IAAI,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3D,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,aAAa,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACxG,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,qBAAqB,CAAC,IAAsB,EAAE,KAAa;IACzE,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;QAAE,OAAO,uBAAuB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACjF,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAwB,EAAE,KAAK,CAAC,CAAC;IAC/E,IAAI,IAAI,CAAC,WAAW,KAAK,GAAG,EAAE,CAAC;QAC7B,OAAO,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAwB,CAAC;IAC7C,MAAM,aAAa,GAAG,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAClE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW;YACxB,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE;YAC/H,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,IAAI,IAAI,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,4BAA4B,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3E,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,aAAa,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACxG,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { QueryEngine } from "../core/query-engine.js";
2
+ import { type CoreRuntime, type CoreServices, type CreateCoreRuntimeOptions } from "../core/runtime.js";
3
+ import type { RpcAgentSnapshot } from "./rpc-types.js";
4
+ import { QueryRun, type QueryRunOptions } from "./query-runtime.js";
5
+ export type ManagedAgentState = "attached" | "idle" | "running" | "detached_idle" | "detached_running" | "disposed";
6
+ export interface AgentManagerOptions {
7
+ idleAgentTtlMs?: number;
8
+ reconnectGraceMs?: number;
9
+ runningDetachedKeepAliveMs?: number;
10
+ createRuntime?: (options: CreateCoreRuntimeOptions) => Promise<CoreRuntime>;
11
+ services?: CoreServices;
12
+ sessionCwd?: string;
13
+ }
14
+ export interface AgentIdentity {
15
+ userId: string;
16
+ agentId: string;
17
+ sessionId?: string;
18
+ }
19
+ export interface ManagedAgent extends AgentIdentity {
20
+ key: string;
21
+ runtime: CoreRuntime;
22
+ engine: QueryEngine;
23
+ state: ManagedAgentState;
24
+ attachedConnections: Set<string>;
25
+ createdAt: Date;
26
+ updatedAt: Date;
27
+ lastDetachedAt?: Date;
28
+ activeQuery?: QueryRun;
29
+ }
30
+ export declare class AgentManager {
31
+ private readonly agents;
32
+ private readonly createRuntime;
33
+ private readonly idleAgentTtlMs;
34
+ private readonly reconnectGraceMs;
35
+ private readonly runningDetachedKeepAliveMs;
36
+ private readonly services?;
37
+ private readonly sessionCwd?;
38
+ constructor(options?: AgentManagerOptions);
39
+ getOrCreate(identity: AgentIdentity, options?: {
40
+ resume?: boolean;
41
+ }): Promise<ManagedAgent>;
42
+ get(identity: AgentIdentity): ManagedAgent | undefined;
43
+ attach(connectionId: string, identity: AgentIdentity, options?: {
44
+ create?: boolean;
45
+ resume?: boolean;
46
+ }): Promise<ManagedAgent>;
47
+ detach(connectionId: string, identity: AgentIdentity): ManagedAgent | undefined;
48
+ detachConnectionFromAll(connectionId: string): void;
49
+ startQuery(identity: AgentIdentity, input: Pick<QueryRunOptions, "queryId" | "text" | "displayText" | "disconnectPolicy" | "onEvent">): Promise<QueryRun>;
50
+ cancelQuery(identity: AgentIdentity, queryId: string): boolean;
51
+ listSnapshots(): RpcAgentSnapshot[];
52
+ sweep(now?: number): string[];
53
+ dispose(key: string): boolean;
54
+ private mustGet;
55
+ }
56
+ export declare function agentKey(identity: AgentIdentity): string;
@@ -0,0 +1,171 @@
1
+ import { createCoreRuntime, createQueryEngineRuntime, } from "../core/runtime.js";
2
+ import { QueryRun } from "./query-runtime.js";
3
+ export class AgentManager {
4
+ agents = new Map();
5
+ createRuntime;
6
+ idleAgentTtlMs;
7
+ reconnectGraceMs;
8
+ runningDetachedKeepAliveMs;
9
+ services;
10
+ sessionCwd;
11
+ constructor(options = {}) {
12
+ this.services = options.services;
13
+ this.sessionCwd = options.sessionCwd;
14
+ this.createRuntime = options.createRuntime ?? ((runtimeOptions) => this.services
15
+ ? createQueryEngineRuntime(this.services, runtimeOptions)
16
+ : createCoreRuntime(runtimeOptions));
17
+ this.idleAgentTtlMs = options.idleAgentTtlMs ?? 10 * 60_000;
18
+ this.reconnectGraceMs = options.reconnectGraceMs ?? 30_000;
19
+ this.runningDetachedKeepAliveMs = options.runningDetachedKeepAliveMs ?? 60 * 60_000;
20
+ }
21
+ async getOrCreate(identity, options = {}) {
22
+ const key = agentKey(identity);
23
+ const existing = this.agents.get(key);
24
+ if (existing)
25
+ return existing;
26
+ const runtime = await this.createRuntime({
27
+ agentId: identity.agentId,
28
+ sessionId: identity.sessionId,
29
+ sessionCwd: this.sessionCwd,
30
+ resume: options.resume ?? true,
31
+ queryOrigin: "json-rpc-ws",
32
+ });
33
+ const agent = {
34
+ ...identity,
35
+ key,
36
+ runtime,
37
+ engine: runtime.engine,
38
+ state: "idle",
39
+ attachedConnections: new Set(),
40
+ createdAt: new Date(),
41
+ updatedAt: new Date(),
42
+ };
43
+ this.agents.set(key, agent);
44
+ return agent;
45
+ }
46
+ get(identity) {
47
+ return this.agents.get(agentKey(identity));
48
+ }
49
+ async attach(connectionId, identity, options = {}) {
50
+ const agent = options.create === false ? this.mustGet(identity) : await this.getOrCreate(identity, { resume: options.resume });
51
+ agent.attachedConnections.add(connectionId);
52
+ agent.lastDetachedAt = undefined;
53
+ agent.updatedAt = new Date();
54
+ agent.state = agent.activeQuery ? "running" : "attached";
55
+ return agent;
56
+ }
57
+ detach(connectionId, identity) {
58
+ const agent = this.get(identity);
59
+ if (!agent)
60
+ return undefined;
61
+ agent.attachedConnections.delete(connectionId);
62
+ agent.updatedAt = new Date();
63
+ if (agent.attachedConnections.size === 0) {
64
+ agent.lastDetachedAt = new Date();
65
+ agent.state = agent.activeQuery ? "detached_running" : "detached_idle";
66
+ }
67
+ return agent;
68
+ }
69
+ detachConnectionFromAll(connectionId) {
70
+ for (const agent of this.agents.values()) {
71
+ if (!agent.attachedConnections.has(connectionId))
72
+ continue;
73
+ agent.attachedConnections.delete(connectionId);
74
+ agent.updatedAt = new Date();
75
+ if (agent.attachedConnections.size === 0) {
76
+ agent.lastDetachedAt = new Date();
77
+ agent.state = agent.activeQuery ? "detached_running" : "detached_idle";
78
+ }
79
+ }
80
+ }
81
+ async startQuery(identity, input) {
82
+ const agent = this.mustGet(identity);
83
+ if (agent.activeQuery && agent.activeQuery.getState() === "running") {
84
+ throw new Error(`agent already has a running query: ${agent.activeQuery.queryId}`);
85
+ }
86
+ const run = new QueryRun(agent.engine, {
87
+ queryId: input.queryId,
88
+ text: input.text,
89
+ displayText: input.displayText,
90
+ disconnectPolicy: input.disconnectPolicy,
91
+ onEvent: input.onEvent,
92
+ });
93
+ agent.activeQuery = run;
94
+ agent.updatedAt = new Date();
95
+ agent.state = agent.attachedConnections.size > 0 ? "running" : "detached_running";
96
+ run.start()
97
+ .catch(() => undefined)
98
+ .finally(() => {
99
+ if (agent.activeQuery === run) {
100
+ agent.activeQuery = undefined;
101
+ agent.updatedAt = new Date();
102
+ agent.state = agent.attachedConnections.size > 0 ? "idle" : "detached_idle";
103
+ }
104
+ });
105
+ return run;
106
+ }
107
+ cancelQuery(identity, queryId) {
108
+ const agent = this.mustGet(identity);
109
+ if (!agent.activeQuery || agent.activeQuery.queryId !== queryId)
110
+ return false;
111
+ agent.activeQuery.cancel();
112
+ agent.updatedAt = new Date();
113
+ return true;
114
+ }
115
+ listSnapshots() {
116
+ return [...this.agents.values()].map((agent) => ({
117
+ key: agent.key,
118
+ userId: agent.userId,
119
+ agentId: agent.agentId,
120
+ state: agent.state,
121
+ attachedConnections: agent.attachedConnections.size,
122
+ activeQueryId: agent.activeQuery?.queryId,
123
+ snapshot: agent.engine.snapshot(),
124
+ }));
125
+ }
126
+ sweep(now = Date.now()) {
127
+ const disposed = [];
128
+ for (const [key, agent] of this.agents) {
129
+ if (agent.attachedConnections.size > 0)
130
+ continue;
131
+ const detachedAt = agent.lastDetachedAt?.getTime() ?? agent.updatedAt.getTime();
132
+ const age = now - detachedAt;
133
+ if (agent.activeQuery) {
134
+ if (agent.activeQuery.getState() === "running") {
135
+ if (age < this.runningDetachedKeepAliveMs)
136
+ continue;
137
+ agent.activeQuery.cancel();
138
+ }
139
+ else if (age < this.idleAgentTtlMs) {
140
+ continue;
141
+ }
142
+ }
143
+ else {
144
+ if (age < Math.max(this.idleAgentTtlMs, this.reconnectGraceMs))
145
+ continue;
146
+ }
147
+ this.dispose(key);
148
+ disposed.push(key);
149
+ }
150
+ return disposed;
151
+ }
152
+ dispose(key) {
153
+ const agent = this.agents.get(key);
154
+ if (!agent)
155
+ return false;
156
+ agent.activeQuery?.cancel();
157
+ agent.state = "disposed";
158
+ this.agents.delete(key);
159
+ return true;
160
+ }
161
+ mustGet(identity) {
162
+ const agent = this.get(identity);
163
+ if (!agent)
164
+ throw new Error(`agent not found: ${agentKey(identity)}`);
165
+ return agent;
166
+ }
167
+ }
168
+ export function agentKey(identity) {
169
+ return `${identity.userId}:${identity.sessionId ?? "default"}:${identity.agentId}`;
170
+ }
171
+ //# sourceMappingURL=agent-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-manager.js","sourceRoot":"","sources":["../../src/server/agent-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { AgentIdentity } from "./agent-manager.js";
2
+ export interface ConnectionRecord {
3
+ id: string;
4
+ attachedAgents: Map<string, AgentIdentity>;
5
+ openedAt: Date;
6
+ closedAt?: Date;
7
+ }
8
+ export declare class ConnectionManager {
9
+ private readonly connections;
10
+ open(id: string): ConnectionRecord;
11
+ get(id: string): ConnectionRecord | undefined;
12
+ attachAgent(connectionId: string, identity: AgentIdentity): void;
13
+ detachAgent(connectionId: string, identity: AgentIdentity): void;
14
+ listAttachedAgents(connectionId: string): AgentIdentity[];
15
+ listConnectionIdsForAgent(identity: AgentIdentity): string[];
16
+ close(connectionId: string): AgentIdentity[];
17
+ private mustGet;
18
+ }
@@ -0,0 +1,52 @@
1
+ export class ConnectionManager {
2
+ connections = new Map();
3
+ open(id) {
4
+ const record = {
5
+ id,
6
+ attachedAgents: new Map(),
7
+ openedAt: new Date(),
8
+ };
9
+ this.connections.set(id, record);
10
+ return record;
11
+ }
12
+ get(id) {
13
+ return this.connections.get(id);
14
+ }
15
+ attachAgent(connectionId, identity) {
16
+ const record = this.mustGet(connectionId);
17
+ record.attachedAgents.set(agentLocatorKey(identity), identity);
18
+ }
19
+ detachAgent(connectionId, identity) {
20
+ this.mustGet(connectionId).attachedAgents.delete(agentLocatorKey(identity));
21
+ }
22
+ listAttachedAgents(connectionId) {
23
+ return [...this.mustGet(connectionId).attachedAgents.values()];
24
+ }
25
+ listConnectionIdsForAgent(identity) {
26
+ const key = agentLocatorKey(identity);
27
+ const results = [];
28
+ for (const [connectionId, record] of this.connections) {
29
+ if (record.attachedAgents.has(key))
30
+ results.push(connectionId);
31
+ }
32
+ return results;
33
+ }
34
+ close(connectionId) {
35
+ const record = this.connections.get(connectionId);
36
+ if (!record)
37
+ return [];
38
+ record.closedAt = new Date();
39
+ this.connections.delete(connectionId);
40
+ return [...record.attachedAgents.values()];
41
+ }
42
+ mustGet(connectionId) {
43
+ const record = this.connections.get(connectionId);
44
+ if (!record)
45
+ throw new Error(`connection not found: ${connectionId}`);
46
+ return record;
47
+ }
48
+ }
49
+ function agentLocatorKey(identity) {
50
+ return `${identity.userId}:${identity.sessionId ?? "default"}:${identity.agentId}`;
51
+ }
52
+ //# sourceMappingURL=connection-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-manager.js","sourceRoot":"","sources":["../../src/server/connection-manager.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,iBAAiB;IACX,WAAW,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEnE,IAAI,CAAC,EAAU;QACb,MAAM,MAAM,GAAqB;YAC/B,EAAE;YACF,cAAc,EAAE,IAAI,GAAG,EAAE;YACzB,QAAQ,EAAE,IAAI,IAAI,EAAE;SACrB,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,WAAW,CAAC,YAAoB,EAAE,QAAuB;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;IACjE,CAAC;IAED,WAAW,CAAC,YAAoB,EAAE,QAAuB;QACvD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,kBAAkB,CAAC,YAAoB;QACrC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,yBAAyB,CAAC,QAAuB;QAC/C,MAAM,GAAG,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACtD,IAAI,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,YAAoB;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QACvB,MAAM,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAEO,OAAO,CAAC,YAAoB;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC;QACtE,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,SAAS,eAAe,CAAC,QAAuB;IAC9C,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,SAAS,IAAI,SAAS,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;AACrF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { AgentEvent } from "../types/events.js";
2
+ import type { RpcQueryEventEnvelope, SerializedAgentEvent } from "./rpc-types.js";
3
+ export declare function serializeAgentEvent(event: AgentEvent): SerializedAgentEvent;
4
+ export declare function createQueryEventEnvelope(queryId: string, seq: number, event: AgentEvent): RpcQueryEventEnvelope;
@@ -0,0 +1,31 @@
1
+ export function serializeAgentEvent(event) {
2
+ if (event.type === "error") {
3
+ return {
4
+ ...event,
5
+ error: serializeError(event.error),
6
+ };
7
+ }
8
+ if (event.type === "retrying") {
9
+ return {
10
+ ...event,
11
+ error: serializeError(event.error),
12
+ };
13
+ }
14
+ return event;
15
+ }
16
+ export function createQueryEventEnvelope(queryId, seq, event) {
17
+ return {
18
+ queryId,
19
+ seq,
20
+ event: serializeAgentEvent(event),
21
+ createdAt: new Date().toISOString(),
22
+ };
23
+ }
24
+ function serializeError(error) {
25
+ return {
26
+ name: error.name,
27
+ message: error.message,
28
+ stack: error.stack,
29
+ };
30
+ }
31
+ //# sourceMappingURL=event-mapper.js.map