theokit 0.74.5 → 0.75.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.
- package/dist/{actions-virtual-module-MIQJEHKJ.js → actions-virtual-module-MIQPBAZW.js} +5 -5
- package/dist/{actions-virtual-module-4J7Z37Y4.js → actions-virtual-module-QEI6QPK4.js} +5 -5
- package/dist/adapters/agent-mount.js +1 -1
- package/dist/{agent-XPZUWTHR.js → agent-N4OV5MDY.js} +3 -3
- package/dist/{app-typed-client-AZMUYIYV.js → app-typed-client-CHSITA46.js} +5 -5
- package/dist/{app-typed-client-DSS23KDC.js → app-typed-client-XQJXF646.js} +5 -5
- package/dist/{build-F3O5LJHY.js → build-GNKTCEES.js} +24 -89
- package/dist/build-GNKTCEES.js.map +1 -0
- package/dist/{chunk-44E7XIZC.js → chunk-3MKRDJQ2.js} +2 -2
- package/dist/{chunk-4ERYQBL6.js → chunk-4Z5XO4O4.js} +2 -2
- package/dist/{chunk-V7ISZGNS.js → chunk-7HGZ3CKL.js} +2 -2
- package/dist/{chunk-6R5F5YF2.js → chunk-A6UFN6QQ.js} +16 -11
- package/dist/{chunk-6R5F5YF2.js.map → chunk-A6UFN6QQ.js.map} +1 -1
- package/dist/{chunk-5KRMDP46.js → chunk-AHYOVVJ7.js} +13 -3
- package/dist/chunk-AHYOVVJ7.js.map +1 -0
- package/dist/{chunk-FPC6ZEEU.js → chunk-E5QTCOKC.js} +10 -10
- package/dist/{chunk-WR5B2XNT.js → chunk-FNAEKJHO.js} +2 -2
- package/dist/{chunk-HKF6YNY4.js → chunk-FU3LEX2I.js} +26 -12
- package/dist/chunk-FU3LEX2I.js.map +1 -0
- package/dist/{chunk-VD3BCME6.js → chunk-I5PDEWZZ.js} +2 -2
- package/dist/chunk-IWIRHUNV.js +96 -0
- package/dist/chunk-IWIRHUNV.js.map +1 -0
- package/dist/{chunk-XUAWD5HK.js → chunk-J2KYVTPD.js} +10 -10
- package/dist/{chunk-U5PWXS3J.js → chunk-O5JZ6ROY.js} +13 -3
- package/dist/chunk-O5JZ6ROY.js.map +1 -0
- package/dist/{chunk-VOXLI66L.js → chunk-OZB2TKGJ.js} +2 -2
- package/dist/{chunk-ET2TAY3Z.js → chunk-RAUYMVUO.js} +279 -15
- package/dist/chunk-RAUYMVUO.js.map +1 -0
- package/dist/{chunk-DA3GGICE.js → chunk-RQKMY3JW.js} +2 -2
- package/dist/{chunk-D5KBBTVD.js → chunk-RY6D4EXL.js} +20 -13
- package/dist/chunk-RY6D4EXL.js.map +1 -0
- package/dist/{chunk-PZLH4WGU.js → chunk-UWV3B3RY.js} +5 -5
- package/dist/{chunk-47VNWTL4.js → chunk-XXHR7X35.js} +9 -5
- package/dist/chunk-XXHR7X35.js.map +1 -0
- package/dist/cli/index.js +10 -10
- package/dist/{cloudflare-PRTTYWRD.js → cloudflare-7EZQE4UV.js} +2 -2
- package/dist/{cloudflare-PRTTYWRD.js.map → cloudflare-7EZQE4UV.js.map} +1 -1
- package/dist/{dev-TW6QD7F3.js → dev-7PMNIIOF.js} +8 -8
- package/dist/{dev-emit-T3X6RR7M.js → dev-emit-BR6ERY63.js} +11 -7
- package/dist/dev-emit-BR6ERY63.js.map +1 -0
- package/dist/{dev-emit-ZK5GCHXN.js → dev-emit-GFGLZZOH.js} +4 -4
- package/dist/{generate-EN6EDITF.js → generate-RW3NO3NR.js} +239 -141
- package/dist/generate-RW3NO3NR.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +5 -5
- package/dist/{info-XURFOBRF.js → info-6NAUW5XY.js} +3 -3
- package/dist/{internal-api-XPT4GLYX.js → internal-api-A5HA7TYF.js} +5 -5
- package/dist/{internal-api-ATSPOXI2.js → internal-api-R7TTYMCY.js} +5 -5
- package/dist/{load-config-2DXLI7NW.js → load-config-CLFWJOXN.js} +3 -3
- package/dist/{mcp-LMV3NQEP.js → mcp-3NRZAQKY.js} +4 -4
- package/dist/{openapi-UJSUQPNT.js → openapi-ZHKJB3XL.js} +6 -6
- package/dist/{preview-AMNBV2DP.js → preview-SNS7VJWH.js} +3 -3
- package/dist/{registry-SUE4HJXL.js → registry-3SVWZVIJ.js} +2 -2
- package/dist/{routes-ENMU4GAN.js → routes-SMNSI2ZX.js} +3 -3
- package/dist/server/agent/index.d.ts +99 -6
- package/dist/server/agent/index.js +9 -1
- package/dist/server/cron/index.js +2 -2
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +15 -7
- package/dist/server/index.js.map +1 -1
- package/dist/server/jobs/index.js +2 -2
- package/dist/server/scan/index.js +4 -4
- package/dist/{server-boundary-K4YQXDQT.js → server-boundary-HYLYGFZY.js} +5 -5
- package/dist/{server-boundary-JM72DQLA.js → server-boundary-ZT6HN7ON.js} +5 -5
- package/dist/{start-GAULIE5E.js → start-L5TGWGLU.js} +7 -7
- package/dist/vite-plugin/index.js +5 -5
- package/dist/{vite-plugin-4ZMBW3KV.js → vite-plugin-UXEXT7GX.js} +8 -8
- package/package.json +5 -5
- package/dist/build-F3O5LJHY.js.map +0 -1
- package/dist/chunk-47VNWTL4.js.map +0 -1
- package/dist/chunk-5KRMDP46.js.map +0 -1
- package/dist/chunk-D5KBBTVD.js.map +0 -1
- package/dist/chunk-ET2TAY3Z.js.map +0 -1
- package/dist/chunk-HKF6YNY4.js.map +0 -1
- package/dist/chunk-U5PWXS3J.js.map +0 -1
- package/dist/dev-emit-T3X6RR7M.js.map +0 -1
- package/dist/generate-EN6EDITF.js.map +0 -1
- /package/dist/{actions-virtual-module-MIQJEHKJ.js.map → actions-virtual-module-MIQPBAZW.js.map} +0 -0
- /package/dist/{actions-virtual-module-4J7Z37Y4.js.map → actions-virtual-module-QEI6QPK4.js.map} +0 -0
- /package/dist/{agent-XPZUWTHR.js.map → agent-N4OV5MDY.js.map} +0 -0
- /package/dist/{app-typed-client-AZMUYIYV.js.map → app-typed-client-CHSITA46.js.map} +0 -0
- /package/dist/{app-typed-client-DSS23KDC.js.map → app-typed-client-XQJXF646.js.map} +0 -0
- /package/dist/{chunk-44E7XIZC.js.map → chunk-3MKRDJQ2.js.map} +0 -0
- /package/dist/{chunk-4ERYQBL6.js.map → chunk-4Z5XO4O4.js.map} +0 -0
- /package/dist/{chunk-V7ISZGNS.js.map → chunk-7HGZ3CKL.js.map} +0 -0
- /package/dist/{chunk-FPC6ZEEU.js.map → chunk-E5QTCOKC.js.map} +0 -0
- /package/dist/{chunk-WR5B2XNT.js.map → chunk-FNAEKJHO.js.map} +0 -0
- /package/dist/{chunk-VD3BCME6.js.map → chunk-I5PDEWZZ.js.map} +0 -0
- /package/dist/{chunk-XUAWD5HK.js.map → chunk-J2KYVTPD.js.map} +0 -0
- /package/dist/{chunk-VOXLI66L.js.map → chunk-OZB2TKGJ.js.map} +0 -0
- /package/dist/{chunk-DA3GGICE.js.map → chunk-RQKMY3JW.js.map} +0 -0
- /package/dist/{chunk-PZLH4WGU.js.map → chunk-UWV3B3RY.js.map} +0 -0
- /package/dist/{dev-TW6QD7F3.js.map → dev-7PMNIIOF.js.map} +0 -0
- /package/dist/{dev-emit-ZK5GCHXN.js.map → dev-emit-GFGLZZOH.js.map} +0 -0
- /package/dist/{info-XURFOBRF.js.map → info-6NAUW5XY.js.map} +0 -0
- /package/dist/{internal-api-XPT4GLYX.js.map → internal-api-A5HA7TYF.js.map} +0 -0
- /package/dist/{internal-api-ATSPOXI2.js.map → internal-api-R7TTYMCY.js.map} +0 -0
- /package/dist/{load-config-2DXLI7NW.js.map → load-config-CLFWJOXN.js.map} +0 -0
- /package/dist/{mcp-LMV3NQEP.js.map → mcp-3NRZAQKY.js.map} +0 -0
- /package/dist/{openapi-UJSUQPNT.js.map → openapi-ZHKJB3XL.js.map} +0 -0
- /package/dist/{preview-AMNBV2DP.js.map → preview-SNS7VJWH.js.map} +0 -0
- /package/dist/{registry-SUE4HJXL.js.map → registry-3SVWZVIJ.js.map} +0 -0
- /package/dist/{routes-ENMU4GAN.js.map → routes-SMNSI2ZX.js.map} +0 -0
- /package/dist/{server-boundary-K4YQXDQT.js.map → server-boundary-HYLYGFZY.js.map} +0 -0
- /package/dist/{server-boundary-JM72DQLA.js.map → server-boundary-ZT6HN7ON.js.map} +0 -0
- /package/dist/{start-GAULIE5E.js.map → start-L5TGWGLU.js.map} +0 -0
- /package/dist/{vite-plugin-4ZMBW3KV.js.map → vite-plugin-UXEXT7GX.js.map} +0 -0
|
@@ -33,35 +33,277 @@ function createWorkflowTool(workflow, config) {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
// src/server/agent/acp-tool.ts
|
|
36
|
+
import { resolve } from "node:path";
|
|
37
|
+
import { AcpClient, AcpConnectionClosedError, AcpProtocolError } from "@theokit/agents";
|
|
38
|
+
|
|
39
|
+
// src/server/agent/node-acp-transport.ts
|
|
36
40
|
import { spawn } from "node:child_process";
|
|
37
|
-
|
|
41
|
+
var AcpTransportClosedError = class extends Error {
|
|
42
|
+
constructor(command, reason, options) {
|
|
43
|
+
super(`[theokit] createACPTool: the agent process "${command}" ${reason}`, options);
|
|
44
|
+
this.command = command;
|
|
45
|
+
this.reason = reason;
|
|
46
|
+
}
|
|
47
|
+
command;
|
|
48
|
+
reason;
|
|
49
|
+
name = "AcpTransportClosedError";
|
|
50
|
+
};
|
|
51
|
+
var SIGTERM_GRACE_MS = 2e3;
|
|
52
|
+
var SIGKILL_WAIT_MS = 2e3;
|
|
53
|
+
var GROUP_POLL_MS = 20;
|
|
54
|
+
var OWN_PROCESS_GROUP = process.platform !== "win32";
|
|
38
55
|
var NodeAcpTransport = class {
|
|
39
|
-
// stdin=pipe, stdout=pipe, stderr=inherit → the third stream is null.
|
|
40
|
-
proc;
|
|
41
56
|
constructor(command, args = [], cwd) {
|
|
42
|
-
this.
|
|
57
|
+
this.command = command;
|
|
58
|
+
this.proc = spawn(command, args, {
|
|
59
|
+
cwd,
|
|
60
|
+
stdio: ["pipe", "pipe", "inherit"],
|
|
61
|
+
detached: OWN_PROCESS_GROUP
|
|
62
|
+
});
|
|
63
|
+
this.proc.stdout.setEncoding("utf8");
|
|
64
|
+
this.exited = new Promise((resolve2) => {
|
|
65
|
+
this.proc.once("exit", () => {
|
|
66
|
+
resolve2();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
this.proc.on("error", (err) => {
|
|
70
|
+
this.end(`failed: ${err.message}`, err);
|
|
71
|
+
});
|
|
72
|
+
this.proc.stdin.on("error", (err) => {
|
|
73
|
+
this.end(`closed its stdin: ${err.message}`, err);
|
|
74
|
+
});
|
|
75
|
+
this.proc.on("close", (code, signal) => {
|
|
76
|
+
this.end(code === null ? `exited on signal ${String(signal)}` : `exited with code ${code}`);
|
|
77
|
+
});
|
|
43
78
|
}
|
|
79
|
+
command;
|
|
80
|
+
// stdin=pipe, stdout=pipe, stderr=inherit → the third stream is null.
|
|
81
|
+
proc;
|
|
82
|
+
closed;
|
|
83
|
+
listeners = [];
|
|
84
|
+
/** Settles when the process has exited (or never started). */
|
|
85
|
+
exited;
|
|
44
86
|
send(line) {
|
|
45
|
-
this.proc.stdin.write(line);
|
|
87
|
+
if (this.closed === void 0) this.proc.stdin.write(line);
|
|
46
88
|
}
|
|
47
89
|
subscribe(onData) {
|
|
48
|
-
this.proc.stdout.on("data",
|
|
49
|
-
|
|
90
|
+
this.proc.stdout.on("data", onData);
|
|
91
|
+
}
|
|
92
|
+
onClose(listener) {
|
|
93
|
+
if (this.closed !== void 0) listener(this.closed);
|
|
94
|
+
else this.listeners.push(listener);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* End the channel and the process, and settle once the process and its group have exited:
|
|
98
|
+
* SIGTERM first, then SIGKILL for anything still running after {@link SIGTERM_GRACE_MS}.
|
|
99
|
+
*/
|
|
100
|
+
async close() {
|
|
101
|
+
this.end("was closed by the caller");
|
|
102
|
+
try {
|
|
103
|
+
if (!this.running() && !this.groupAlive()) return;
|
|
104
|
+
this.signal("SIGTERM");
|
|
105
|
+
if (await this.goneWithin(SIGTERM_GRACE_MS)) return;
|
|
106
|
+
this.signal("SIGKILL");
|
|
107
|
+
await this.goneWithin(SIGKILL_WAIT_MS);
|
|
108
|
+
} finally {
|
|
109
|
+
this.proc.stdin.destroy();
|
|
110
|
+
this.proc.stdout.destroy();
|
|
111
|
+
this.proc.unref();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** Whether the process started and has not exited yet. */
|
|
115
|
+
running() {
|
|
116
|
+
return this.proc.pid !== void 0 && this.proc.exitCode === null && this.proc.signalCode === null;
|
|
117
|
+
}
|
|
118
|
+
/** Whether a process of the agent's group is still running (always `false` without a group). */
|
|
119
|
+
groupAlive() {
|
|
120
|
+
const pid = this.proc.pid;
|
|
121
|
+
if (!OWN_PROCESS_GROUP || pid === void 0) return false;
|
|
122
|
+
try {
|
|
123
|
+
process.kill(-pid, 0);
|
|
124
|
+
return true;
|
|
125
|
+
} catch (err) {
|
|
126
|
+
return err.code === "EPERM";
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/** Send `signal` to the agent's process group, or to the spawned process without one. */
|
|
130
|
+
signal(signal) {
|
|
131
|
+
const pid = this.proc.pid;
|
|
132
|
+
if (!OWN_PROCESS_GROUP || pid === void 0) {
|
|
133
|
+
this.proc.kill(signal);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
process.kill(-pid, signal);
|
|
138
|
+
} catch (err) {
|
|
139
|
+
if (err.code !== "ESRCH") throw err;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/** Wait up to `ms` for the process and every process of its group to exit; `true` when they did. */
|
|
143
|
+
async goneWithin(ms) {
|
|
144
|
+
const deadline = Date.now() + ms;
|
|
145
|
+
if (!await this.exitsWithin(ms)) return false;
|
|
146
|
+
while (this.groupAlive()) {
|
|
147
|
+
if (Date.now() >= deadline) return false;
|
|
148
|
+
await new Promise((resolve2) => setTimeout(resolve2, GROUP_POLL_MS));
|
|
149
|
+
}
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
/** Wait up to `ms` for the process to exit; `true` when it did. */
|
|
153
|
+
async exitsWithin(ms) {
|
|
154
|
+
let timer;
|
|
155
|
+
const elapsed = new Promise((resolve2) => {
|
|
156
|
+
timer = setTimeout(() => {
|
|
157
|
+
resolve2(false);
|
|
158
|
+
}, ms);
|
|
50
159
|
});
|
|
160
|
+
try {
|
|
161
|
+
return await Promise.race([this.exited.then(() => true), elapsed]);
|
|
162
|
+
} finally {
|
|
163
|
+
clearTimeout(timer);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/** Record the first way the channel ended and tell every listener; later endings are ignored. */
|
|
167
|
+
end(reason, cause) {
|
|
168
|
+
if (this.closed !== void 0) return;
|
|
169
|
+
const error = new AcpTransportClosedError(this.command, reason, { cause });
|
|
170
|
+
this.closed = error;
|
|
171
|
+
for (const listener of this.listeners.splice(0)) listener(error);
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
// src/server/agent/acp-tool.ts
|
|
176
|
+
var AcpRequestTimeoutError = class extends Error {
|
|
177
|
+
constructor(command, method, timeoutMs) {
|
|
178
|
+
super(
|
|
179
|
+
`[theokit] createACPTool: the agent "${command}" did not answer ${method} within ${String(timeoutMs)}ms`
|
|
180
|
+
);
|
|
181
|
+
this.command = command;
|
|
182
|
+
this.method = method;
|
|
183
|
+
this.timeoutMs = timeoutMs;
|
|
51
184
|
}
|
|
52
|
-
|
|
53
|
-
|
|
185
|
+
command;
|
|
186
|
+
method;
|
|
187
|
+
timeoutMs;
|
|
188
|
+
name = "AcpRequestTimeoutError";
|
|
189
|
+
};
|
|
190
|
+
var STOP_REASON_MEANING = {
|
|
191
|
+
max_tokens: "it reached its token limit",
|
|
192
|
+
max_turn_requests: "it reached its limit of model requests in one turn",
|
|
193
|
+
refusal: "it refused to continue",
|
|
194
|
+
cancelled: "it cancelled the turn"
|
|
195
|
+
};
|
|
196
|
+
var AcpTurnStoppedError = class extends Error {
|
|
197
|
+
constructor(command, stopReason, partialText) {
|
|
198
|
+
const meaning = STOP_REASON_MEANING[stopReason] ?? "a stop reason this client does not know";
|
|
199
|
+
super(
|
|
200
|
+
`[theokit] createACPTool: the agent "${command}" stopped the turn before finishing it, with stopReason "${stopReason}" (${meaning}); the ${String(partialText.length)} characters it streamed are on the error's partialText`
|
|
201
|
+
);
|
|
202
|
+
this.command = command;
|
|
203
|
+
this.stopReason = stopReason;
|
|
204
|
+
this.partialText = partialText;
|
|
54
205
|
}
|
|
206
|
+
command;
|
|
207
|
+
stopReason;
|
|
208
|
+
partialText;
|
|
209
|
+
name = "AcpTurnStoppedError";
|
|
55
210
|
};
|
|
211
|
+
var DEFAULT_ACP_TIMEOUT_MS = 6e5;
|
|
56
212
|
function defaultTransport(config) {
|
|
57
213
|
return new NodeAcpTransport(config.command, config.args, config.cwd);
|
|
58
214
|
}
|
|
215
|
+
var ACP_PROTOCOL_VERSION = 1;
|
|
216
|
+
function isRecord(value) {
|
|
217
|
+
return typeof value === "object" && value !== null;
|
|
218
|
+
}
|
|
219
|
+
function toAcpPermissionResponse(params, decision) {
|
|
220
|
+
const options = isRecord(params) && Array.isArray(params.options) ? params.options : [];
|
|
221
|
+
const wanted = decision.granted ? ["allow_once"] : ["reject_once", "reject_always"];
|
|
222
|
+
for (const kind of wanted) {
|
|
223
|
+
const option = options.find((o) => isRecord(o) && o.kind === kind);
|
|
224
|
+
if (isRecord(option) && typeof option.optionId === "string") {
|
|
225
|
+
return { outcome: { outcome: "selected", optionId: option.optionId } };
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return { outcome: { outcome: "cancelled" } };
|
|
229
|
+
}
|
|
230
|
+
function agentTextChunk(params, sessionId) {
|
|
231
|
+
if (!isRecord(params) || params.sessionId !== sessionId || !isRecord(params.update))
|
|
232
|
+
return void 0;
|
|
233
|
+
const { sessionUpdate, content } = params.update;
|
|
234
|
+
if (sessionUpdate !== "agent_message_chunk" || !isRecord(content)) return void 0;
|
|
235
|
+
return content.type === "text" && typeof content.text === "string" ? content.text : void 0;
|
|
236
|
+
}
|
|
237
|
+
function stepFailure(method, cause) {
|
|
238
|
+
if (cause instanceof AcpConnectionClosedError) {
|
|
239
|
+
return cause.cause instanceof Error ? cause.cause : cause;
|
|
240
|
+
}
|
|
241
|
+
if (cause instanceof AcpProtocolError) return cause;
|
|
242
|
+
const reason = cause instanceof Error ? cause.message : String(cause);
|
|
243
|
+
return new Error(`[theokit] createACPTool: the agent refused ${method}: ${reason}`, { cause });
|
|
244
|
+
}
|
|
245
|
+
async function step(turn, method, params) {
|
|
246
|
+
turn.signal?.throwIfAborted();
|
|
247
|
+
let timer;
|
|
248
|
+
try {
|
|
249
|
+
return await new Promise((resolve2, reject) => {
|
|
250
|
+
turn.abort = reject;
|
|
251
|
+
timer = setTimeout(() => {
|
|
252
|
+
reject(new AcpRequestTimeoutError(turn.command, method, turn.timeoutMs));
|
|
253
|
+
}, turn.timeoutMs);
|
|
254
|
+
turn.client.request(method, params).then(resolve2).catch((cause) => {
|
|
255
|
+
reject(stepFailure(method, cause));
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
} finally {
|
|
259
|
+
clearTimeout(timer);
|
|
260
|
+
turn.abort = void 0;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
function sessionIdOf(created) {
|
|
264
|
+
if (isRecord(created) && typeof created.sessionId === "string") return created.sessionId;
|
|
265
|
+
throw new Error(
|
|
266
|
+
`[theokit] createACPTool: the agent refused session/new: returned no sessionId (got ${JSON.stringify(created)})`
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
function stopReasonOf(result) {
|
|
270
|
+
if (isRecord(result) && typeof result.stopReason === "string") return result.stopReason;
|
|
271
|
+
throw new Error(
|
|
272
|
+
`[theokit] createACPTool: the agent refused session/prompt: returned no stopReason (got ${JSON.stringify(result)})`
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
async function runTurn(turn, cwd, message) {
|
|
276
|
+
const updates = [];
|
|
277
|
+
turn.client.onNotification("session/update", (params) => {
|
|
278
|
+
updates.push(params);
|
|
279
|
+
});
|
|
280
|
+
await step(turn, "initialize", {
|
|
281
|
+
protocolVersion: ACP_PROTOCOL_VERSION,
|
|
282
|
+
clientCapabilities: {}
|
|
283
|
+
});
|
|
284
|
+
const sessionId = sessionIdOf(await step(turn, "session/new", { cwd, mcpServers: [] }));
|
|
285
|
+
const result = await step(turn, "session/prompt", {
|
|
286
|
+
sessionId,
|
|
287
|
+
prompt: [{ type: "text", text: message }]
|
|
288
|
+
});
|
|
289
|
+
const stopReason = stopReasonOf(result);
|
|
290
|
+
const texts = updates.map((params) => agentTextChunk(params, sessionId));
|
|
291
|
+
const reply = texts.filter((text) => text !== void 0).join("");
|
|
292
|
+
if (stopReason !== "end_turn") throw new AcpTurnStoppedError(turn.command, stopReason, reply);
|
|
293
|
+
return reply;
|
|
294
|
+
}
|
|
59
295
|
function createACPTool(config) {
|
|
60
296
|
if (typeof config.onPermissionRequest !== "function") {
|
|
61
297
|
throw new Error(
|
|
62
298
|
"[theokit] createACPTool requires onPermissionRequest (security by default \u2014 no default-allow)"
|
|
63
299
|
);
|
|
64
300
|
}
|
|
301
|
+
const timeoutMs = config.timeoutMs ?? DEFAULT_ACP_TIMEOUT_MS;
|
|
302
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
303
|
+
throw new RangeError(
|
|
304
|
+
`[theokit] createACPTool: timeoutMs must be a positive finite number of milliseconds (got ${String(timeoutMs)})`
|
|
305
|
+
);
|
|
306
|
+
}
|
|
65
307
|
const makeTransport = config.transportFactory ?? defaultTransport;
|
|
66
308
|
return {
|
|
67
309
|
name: config.name,
|
|
@@ -73,12 +315,30 @@ function createACPTool(config) {
|
|
|
73
315
|
},
|
|
74
316
|
required: ["message"]
|
|
75
317
|
},
|
|
76
|
-
handler: async (input) => {
|
|
318
|
+
handler: async (input, ctx) => {
|
|
77
319
|
const message = typeof input.message === "string" ? input.message : "";
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
const
|
|
81
|
-
|
|
320
|
+
const signal = ctx?.signal;
|
|
321
|
+
signal?.throwIfAborted();
|
|
322
|
+
const transport = makeTransport(config);
|
|
323
|
+
let onAbort;
|
|
324
|
+
try {
|
|
325
|
+
const turn = {
|
|
326
|
+
client: new AcpClient(transport),
|
|
327
|
+
command: config.command,
|
|
328
|
+
timeoutMs,
|
|
329
|
+
signal
|
|
330
|
+
};
|
|
331
|
+
onAbort = () => turn.abort?.(signal?.reason);
|
|
332
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
333
|
+
turn.client.onRequest(
|
|
334
|
+
"session/request_permission",
|
|
335
|
+
async (params) => toAcpPermissionResponse(params, await config.onPermissionRequest(params))
|
|
336
|
+
);
|
|
337
|
+
return await runTurn(turn, resolve(config.cwd ?? process.cwd()), message);
|
|
338
|
+
} finally {
|
|
339
|
+
if (onAbort !== void 0) signal?.removeEventListener("abort", onAbort);
|
|
340
|
+
await transport.close?.();
|
|
341
|
+
}
|
|
82
342
|
}
|
|
83
343
|
};
|
|
84
344
|
}
|
|
@@ -295,7 +555,11 @@ async function serveMcpStdio(mod, name, appResources, streams) {
|
|
|
295
555
|
|
|
296
556
|
export {
|
|
297
557
|
createWorkflowTool,
|
|
558
|
+
AcpTransportClosedError,
|
|
298
559
|
NodeAcpTransport,
|
|
560
|
+
AcpRequestTimeoutError,
|
|
561
|
+
AcpTurnStoppedError,
|
|
562
|
+
DEFAULT_ACP_TIMEOUT_MS,
|
|
299
563
|
createACPTool,
|
|
300
564
|
createVendorAgentTool,
|
|
301
565
|
CodeModePermissionDeniedError,
|
|
@@ -308,4 +572,4 @@ export {
|
|
|
308
572
|
streamAgentTurnInProcess,
|
|
309
573
|
InProcessApprovalRequiredError
|
|
310
574
|
};
|
|
311
|
-
//# sourceMappingURL=chunk-
|
|
575
|
+
//# sourceMappingURL=chunk-RAUYMVUO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/agent/workflow-tool.ts","../src/server/agent/acp-tool.ts","../src/server/agent/node-acp-transport.ts","../src/server/agent/vendor-agent-tool.ts","../src/server/agent/code-mode.ts","../src/server/agent/channel-webhook.ts","../src/server/agent/index.ts","../src/server/agent/mcp-stdio.ts"],"mappings":"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","names":["resolve","resolve","tool"]}
|
|
@@ -33,7 +33,7 @@ import {
|
|
|
33
33
|
} from "./chunk-Z7CJHDLS.js";
|
|
34
34
|
import {
|
|
35
35
|
importUserModule
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-O5JZ6ROY.js";
|
|
37
37
|
import {
|
|
38
38
|
TheoError,
|
|
39
39
|
serverErrorToEnvelope
|
|
@@ -2784,4 +2784,4 @@ export {
|
|
|
2784
2784
|
CsrfReadinessStore,
|
|
2785
2785
|
applySecurityHeaders
|
|
2786
2786
|
};
|
|
2787
|
-
//# sourceMappingURL=chunk-
|
|
2787
|
+
//# sourceMappingURL=chunk-RQKMY3JW.js.map
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-UMNXCU3K.js";
|
|
7
7
|
import {
|
|
8
8
|
importUserModule
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-AHYOVVJ7.js";
|
|
10
10
|
import {
|
|
11
11
|
walkSourceFiles
|
|
12
12
|
} from "./chunk-SOYOYGWY.js";
|
|
@@ -47,11 +47,13 @@ function validateCronSchedule(schedule) {
|
|
|
47
47
|
|
|
48
48
|
// src/server/cron/define-cron.ts
|
|
49
49
|
var NAME_RE = /^[a-z0-9][a-z0-9-]{0,63}$/;
|
|
50
|
+
var CRON_NAME_RULE = "Must be 1-64 chars, lowercase alphanumeric + hyphen, starting with [a-z0-9].";
|
|
51
|
+
function isValidCronName(name) {
|
|
52
|
+
return typeof name === "string" && NAME_RE.test(name);
|
|
53
|
+
}
|
|
50
54
|
function validateName(name) {
|
|
51
|
-
if (
|
|
52
|
-
throw new Error(
|
|
53
|
-
`defineCron: invalid name "${name}". Must be 1-64 chars, lowercase alphanumeric + hyphen, starting with [a-z0-9].`
|
|
54
|
-
);
|
|
55
|
+
if (!isValidCronName(name)) {
|
|
56
|
+
throw new Error(`defineCron: invalid name "${name}". ${CRON_NAME_RULE}`);
|
|
55
57
|
}
|
|
56
58
|
}
|
|
57
59
|
function defineCron(name, options) {
|
|
@@ -309,7 +311,7 @@ function createCronScheduler(definitions) {
|
|
|
309
311
|
|
|
310
312
|
// src/server/cron/cron-scan.ts
|
|
311
313
|
import { existsSync as existsSync2 } from "node:fs";
|
|
312
|
-
import { basename } from "node:path";
|
|
314
|
+
import { basename, resolve } from "node:path";
|
|
313
315
|
var DuplicateCronNameError = class extends Error {
|
|
314
316
|
constructor(cronName, filePaths) {
|
|
315
317
|
super(
|
|
@@ -329,19 +331,24 @@ function isCronDefinition(value) {
|
|
|
329
331
|
const def = value;
|
|
330
332
|
return typeof def.name === "string" && typeof def.schedule === "string" && typeof def.handler === "function" && (def.concurrency === "forbid" || def.concurrency === "allow");
|
|
331
333
|
}
|
|
332
|
-
|
|
333
|
-
return
|
|
334
|
+
function isDiscoverableCronFile(fileName) {
|
|
335
|
+
return !fileName.startsWith("_") && !fileName.startsWith(".");
|
|
334
336
|
}
|
|
335
|
-
|
|
337
|
+
function listCronFiles(dirs) {
|
|
336
338
|
const filePaths = [];
|
|
337
339
|
for (const dir of dirs) {
|
|
338
340
|
if (!existsSync2(dir)) continue;
|
|
339
341
|
walkSourceFiles(dir, { extensions: CRON_EXTENSIONS }, (p) => {
|
|
340
|
-
|
|
341
|
-
if (base.startsWith("_") || base.startsWith(".")) return;
|
|
342
|
-
filePaths.push(p);
|
|
342
|
+
if (isDiscoverableCronFile(basename(p))) filePaths.push(p);
|
|
343
343
|
});
|
|
344
344
|
}
|
|
345
|
+
return filePaths;
|
|
346
|
+
}
|
|
347
|
+
async function scanCrons(cronsDir) {
|
|
348
|
+
return scanCronDirs([cronsDir]);
|
|
349
|
+
}
|
|
350
|
+
async function scanCronDirs(dirs) {
|
|
351
|
+
const filePaths = listCronFiles(dirs);
|
|
345
352
|
const nodes = [];
|
|
346
353
|
for (const filePath of filePaths) {
|
|
347
354
|
let mod;
|
|
@@ -395,4 +402,4 @@ export {
|
|
|
395
402
|
scanCrons,
|
|
396
403
|
scanCronDirs
|
|
397
404
|
};
|
|
398
|
-
//# sourceMappingURL=chunk-
|
|
405
|
+
//# sourceMappingURL=chunk-RY6D4EXL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/cron/cron-validate.ts","../src/server/cron/define-cron.ts","../src/server/cron/cron-manifest.ts","../src/server/cron/adapter-translators.ts","../src/server/cron/cron-runtime-node.ts","../src/server/cron/cron-scan.ts"],"mappings":"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","names":["CronExpressionParser","CronExpressionParser","existsSync","existsSync"]}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-BINRCILF.js";
|
|
7
7
|
import {
|
|
8
8
|
scanAgents
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-FU3LEX2I.js";
|
|
10
10
|
import {
|
|
11
11
|
loadEnv
|
|
12
12
|
} from "./chunk-3QPVEJ7D.js";
|
|
@@ -145,7 +145,7 @@ async function agentCommand(name, message, deps = {}) {
|
|
|
145
145
|
);
|
|
146
146
|
}
|
|
147
147
|
const projectRoot = deps.projectRoot ?? process.cwd();
|
|
148
|
-
const agentsDir = deps.agentsDir ?? (await (await import("./load-config-
|
|
148
|
+
const agentsDir = deps.agentsDir ?? (await (await import("./load-config-CLFWJOXN.js")).loadConfig(projectRoot)).agentsDir;
|
|
149
149
|
const agents = scanAgents(projectRoot, agentsDir);
|
|
150
150
|
const agent = agents.find((a) => a.name === name);
|
|
151
151
|
if (!agent) {
|
|
@@ -178,8 +178,8 @@ async function agentCommand(name, message, deps = {}) {
|
|
|
178
178
|
async function createAgentSsrLoader(projectRoot) {
|
|
179
179
|
const { createServer } = await import("vite");
|
|
180
180
|
const react = (await import("@vitejs/plugin-react")).default;
|
|
181
|
-
const { theoPluginAsync } = await import("./vite-plugin-
|
|
182
|
-
const { loadConfig } = await import("./load-config-
|
|
181
|
+
const { theoPluginAsync } = await import("./vite-plugin-UXEXT7GX.js");
|
|
182
|
+
const { loadConfig } = await import("./load-config-CLFWJOXN.js");
|
|
183
183
|
const config = await loadConfig(projectRoot);
|
|
184
184
|
const theoPlugins = await theoPluginAsync({
|
|
185
185
|
root: projectRoot,
|
|
@@ -212,4 +212,4 @@ export {
|
|
|
212
212
|
agentCommand,
|
|
213
213
|
createAgentSsrLoader
|
|
214
214
|
};
|
|
215
|
-
//# sourceMappingURL=chunk-
|
|
215
|
+
//# sourceMappingURL=chunk-UWV3B3RY.js.map
|
|
@@ -95,6 +95,13 @@ function convertAnyOf(branches, rest) {
|
|
|
95
95
|
if (k !== "anyOf") result[k] = v;
|
|
96
96
|
return result;
|
|
97
97
|
}
|
|
98
|
+
function convertTypeArray(value) {
|
|
99
|
+
const types = value.filter((t) => typeof t === "string");
|
|
100
|
+
const nonNull = types.filter((t) => t !== "null");
|
|
101
|
+
const out = nonNull.length > 1 ? { oneOf: nonNull.map((t) => ({ type: t })) } : { type: nonNull.length === 1 ? nonNull[0] : nonNull };
|
|
102
|
+
if (types.includes("null")) out.nullable = true;
|
|
103
|
+
return out;
|
|
104
|
+
}
|
|
98
105
|
function toOpenApi3(js) {
|
|
99
106
|
const { $schema: _, $defs: _defs, ...rest } = js;
|
|
100
107
|
if (Array.isArray(rest.anyOf)) return convertAnyOf(rest.anyOf, rest);
|
|
@@ -108,10 +115,7 @@ function toOpenApi3(js) {
|
|
|
108
115
|
continue;
|
|
109
116
|
}
|
|
110
117
|
if (key === "type" && Array.isArray(value)) {
|
|
111
|
-
|
|
112
|
-
const nonNull = types.filter((t) => t !== "null");
|
|
113
|
-
out.type = nonNull.length === 1 ? nonNull[0] : nonNull;
|
|
114
|
-
if (types.includes("null")) out.nullable = true;
|
|
118
|
+
Object.assign(out, convertTypeArray(value));
|
|
115
119
|
} else {
|
|
116
120
|
out[key] = normalizeValue(key, value);
|
|
117
121
|
}
|
|
@@ -307,4 +311,4 @@ export {
|
|
|
307
311
|
emitOpenApi,
|
|
308
312
|
loadRoutesForOpenApi
|
|
309
313
|
};
|
|
310
|
-
//# sourceMappingURL=chunk-
|
|
314
|
+
//# sourceMappingURL=chunk-XXHR7X35.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/vite-plugin/openapi-emit/emit.ts","../src/vite-plugin/openapi-emit/zod-to-openapi.ts","../src/vite-plugin/openapi-emit/load-routes.ts"],"sourcesContent":["/**\n * In-house `emitOpenApi()` orchestrator (build-time only).\n *\n * Pure transformation: takes a route manifest (already hydrated with Zod\n * schemas extracted from `defineRoute()` config) + the openapi config\n * block, builds an OpenAPI 3.x document, writes `<outDir>/openapi.json`,\n * returns the document for downstream callers (CLI logs, tests).\n *\n * Per G2 plan v1.1 T2.1. Modelled on trpc-openapi's\n * `generateOpenApiDocument` + encore's `Generator.Generate()`.\n *\n * NEVER ship to runtime — devDep-shaped artifact.\n *\n * Path templating: TheoKit's `:param` syntax is converted to OpenAPI's\n * `{param}` per the spec. Env-var override: `THEOKIT_OPENAPI_SERVER_URL`\n * overrides `servers[0].url` without rebuilding the config.\n */\n/* eslint-disable security/detect-non-literal-fs-filename --\n * Build-time emit. outDir is a config-controlled relative path. The\n * caller already refused absolute paths via theoConfigSchema.distDir\n * pattern; the openapi.outDir field follows the same convention.\n */\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport type { z } from 'zod'\n\nimport { zodToOpenApiSchema, type ConvertCtx, type OpenApiSchema } from './zod-to-openapi.js'\n\nexport interface OpenApiManifestRoute {\n /** TheoKit-style path with `:param` placeholders (`/users/:id`). */\n routePath: string\n /** Uppercase HTTP methods the route exports (`['GET','POST']`). */\n methods: string[]\n /** Optional `defineRoute({body})` schema. */\n body?: z.ZodType\n /** Optional `defineRoute({query})` schema. */\n query?: z.ZodType\n /** Optional `defineRoute({params})` schema. */\n params?: z.ZodType\n /** Optional `defineRoute({response})` schema. */\n response?: z.ZodType\n}\n\nexport interface OpenApiEmitConfig {\n servers: { url: string; description?: string }[]\n specVersion: '3.1.0' | '3.0.3'\n title: string\n version: string\n outDir: string\n}\n\ninterface OpenApiOperation {\n operationId?: string\n parameters?: OpenApiParameter[]\n requestBody?: {\n required?: boolean\n content: Record<string, { schema: OpenApiSchema }>\n }\n responses: Record<\n string,\n { description: string; content?: Record<string, { schema: OpenApiSchema }> }\n >\n}\n\ninterface OpenApiParameter {\n name: string\n in: 'path' | 'query' | 'header' | 'cookie'\n required: boolean\n schema: OpenApiSchema\n description?: string\n}\n\ntype OpenApiPathItem = Partial<\n Record<'get' | 'post' | 'put' | 'patch' | 'delete' | 'head' | 'options', OpenApiOperation>\n>\n\ninterface OpenApiDocument {\n openapi: '3.1.0' | '3.0.3'\n info: { title: string; version: string }\n servers: { url: string; description?: string }[]\n paths: Record<string, OpenApiPathItem>\n components?: { schemas?: Record<string, OpenApiSchema> }\n}\n\ninterface EmitOpenApiInput {\n manifest: OpenApiManifestRoute[]\n config: OpenApiEmitConfig\n}\n\ninterface EmitOpenApiResult {\n document: OpenApiDocument\n path: string\n}\n\nconst METHOD_TO_KEY: Record<string, keyof OpenApiPathItem> = {\n GET: 'get',\n POST: 'post',\n PUT: 'put',\n PATCH: 'patch',\n DELETE: 'delete',\n HEAD: 'head',\n OPTIONS: 'options',\n}\n\n/** Convert `/users/:id/posts/:postId?` → `/users/{id}/posts/{postId}`. */\nfunction templatePath(routePath: string): string {\n // Bounded quantifier (\\w{0,64}) is OSS-safe — TheoKit route param names\n // never exceed 64 chars in practice; cap prevents super-linear backtracking.\n return routePath.replace(/:([A-Za-z_]\\w{0,64})\\??/g, '{$1}')\n}\n\nfunction buildParameters(\n paramsSchema: z.ZodType | undefined,\n querySchema: z.ZodType | undefined,\n ctx: ConvertCtx,\n): OpenApiParameter[] {\n const out: OpenApiParameter[] = []\n if (paramsSchema !== undefined) {\n appendObjectAsParameters(paramsSchema, 'path', out, ctx)\n }\n if (querySchema !== undefined) {\n appendObjectAsParameters(querySchema, 'query', out, ctx)\n }\n return out\n}\n\nfunction appendObjectAsParameters(\n schema: z.ZodType,\n location: 'path' | 'query',\n out: OpenApiParameter[],\n ctx: ConvertCtx,\n): void {\n // We expect an object schema; if it's not, skip silently (caller already\n // validated upstream when scanning defineRoute()).\n const shape = (schema as unknown as { shape?: Record<string, z.ZodType> }).shape\n if (shape === undefined) return\n for (const [name, child] of Object.entries(shape)) {\n // A field is optional iff the schema accepts `undefined` (covers\n // `.optional()` + `.default()`). Runtime check via safeParse — robust\n // across zod versions, unlike reading the changed `_def.typeName` internal\n // (zod 3) / `def.type` (zod 4).\n const optional = child.safeParse(undefined).success\n out.push({\n name,\n in: location,\n required: location === 'path' ? true : !optional,\n schema: zodToOpenApiSchema(child, { ctx }),\n })\n }\n}\n\nfunction buildOperation(\n route: OpenApiManifestRoute,\n ctx: ConvertCtx,\n method: string,\n): OpenApiOperation {\n // Bounded sanitizer: two single-pass replacements (no nested quantifiers).\n const sanitized = route.routePath.replace(/[/:\\-{}]/g, '_').replace(/_+/g, '_')\n const operationId = `${method.toLowerCase()}_${sanitized.replace(/^_|_$/g, '')}`\n const op: OpenApiOperation = {\n operationId,\n responses: {\n '200': { description: 'OK' },\n },\n }\n\n const parameters = buildParameters(route.params, route.query, ctx)\n if (parameters.length > 0) op.parameters = parameters\n\n // Body only meaningful for write methods; we still attach if defined so\n // the document is honest about the contract.\n if (route.body !== undefined) {\n op.requestBody = {\n required: true,\n content: {\n 'application/json': { schema: zodToOpenApiSchema(route.body, { ctx }) },\n },\n }\n }\n\n if (route.response !== undefined) {\n op.responses['200'] = {\n description: 'OK',\n content: {\n 'application/json': { schema: zodToOpenApiSchema(route.response, { ctx }) },\n },\n }\n }\n\n return op\n}\n\nexport function emitOpenApi(input: EmitOpenApiInput): EmitOpenApiResult {\n const { manifest, config } = input\n\n const ctx: ConvertCtx = { seen: new Map(), components: {} }\n\n const paths: Record<string, OpenApiPathItem> = {}\n for (const route of manifest) {\n const templatedPath = templatePath(route.routePath)\n const item: OpenApiPathItem = paths[templatedPath] ?? {}\n for (const method of route.methods) {\n // Defensive: manifest emitter normalizes to uppercase, but if a\n // future scanner produces a non-HTTP verb the key lookup yields\n // undefined and we skip silently. TS narrows the indexed type to\n // keyof OpenApiPathItem; the runtime undefined check is honest.\n const key = METHOD_TO_KEY[method.toUpperCase()] as keyof OpenApiPathItem | undefined\n if (key === undefined) continue\n item[key] = buildOperation(route, ctx, method)\n }\n paths[templatedPath] = item\n }\n\n const servers = applyServerOverride(config.servers)\n\n const document: OpenApiDocument = {\n openapi: config.specVersion,\n info: { title: config.title, version: config.version },\n servers,\n paths,\n }\n\n if (Object.keys(ctx.components).length > 0) {\n document.components = { schemas: ctx.components }\n }\n\n mkdirSync(config.outDir, { recursive: true })\n const outPath = join(config.outDir, 'openapi.json')\n writeFileSync(outPath, `${JSON.stringify(document, null, 2)}\\n`, 'utf8')\n\n return { document, path: outPath }\n}\n\nfunction applyServerOverride(\n servers: { url: string; description?: string }[],\n): { url: string; description?: string }[] {\n const override = process.env.THEOKIT_OPENAPI_SERVER_URL\n if (override === undefined || override === '') return servers\n if (servers.length === 0) return [{ url: override }]\n const [first, ...rest] = servers\n return [\n {\n url: override,\n ...(first.description !== undefined ? { description: first.description } : {}),\n },\n ...rest,\n ]\n}\n","/**\n * Zod → OpenAPI 3.0 Schema converter (build-time only).\n *\n * Uses Zod v4's native `z.toJSONSchema()` and post-processes\n * the JSON Schema output into OpenAPI 3.0 format:\n * - Removes `$schema` (invalid in OpenAPI 3.0)\n * - Converts `type: [\"string\", \"null\"]` → `{ type: \"string\", nullable: true }`\n * - Recursively normalizes nested schemas\n *\n * NEVER ship to runtime — devDep-shaped artifact.\n */\nimport { z } from 'zod'\n\nexport interface OpenApiSchema {\n type?: 'string' | 'number' | 'integer' | 'boolean' | 'array' | 'object' | 'null'\n format?: string\n items?: OpenApiSchema\n properties?: Record<string, OpenApiSchema>\n required?: string[]\n additionalProperties?: boolean | OpenApiSchema\n oneOf?: OpenApiSchema[]\n anyOf?: OpenApiSchema[]\n allOf?: OpenApiSchema[]\n discriminator?: { propertyName: string; mapping?: Record<string, string> }\n enum?: unknown[]\n nullable?: boolean\n description?: string\n default?: unknown\n $ref?: string\n}\n\nexport interface ConvertCtx {\n seen: Map<z.ZodType, string>\n components: Record<string, OpenApiSchema>\n}\n\ninterface ConvertOptions {\n ctx?: ConvertCtx\n name?: string\n}\n\nexport class ZodToOpenApiError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ZodToOpenApiError'\n }\n}\n\nexport function zodToOpenApiSchema(schema: z.ZodType, options: ConvertOptions = {}): OpenApiSchema {\n const ctx: ConvertCtx = options.ctx ?? { seen: new Map(), components: {} }\n\n const name = options.name\n if (name !== undefined) {\n if (Object.prototype.hasOwnProperty.call(ctx.components, name)) {\n return { $ref: `#/components/schemas/${name}` }\n }\n ctx.seen.set(schema, name)\n ctx.components[name] = {}\n const body = convertSchema(schema, ctx)\n ctx.components[name] = body\n return { $ref: `#/components/schemas/${name}` }\n }\n\n return convertSchema(schema, ctx)\n}\n\ninterface ZodInternalDef {\n type?: string\n discriminator?: string\n in?: z.ZodType\n}\n\n/** Read zod v4's internal schema def (the `.def` getter) without a hard `any`. */\nfunction zodDef(schema: z.ZodType): ZodInternalDef | undefined {\n return (schema as unknown as { def?: ZodInternalDef }).def\n}\n\nfunction convertSchema(schema: z.ZodType, ctx: ConvertCtx): OpenApiSchema {\n const existing = ctx.seen.get(schema)\n if (existing !== undefined) {\n return { $ref: `#/components/schemas/${existing}` }\n }\n\n const def = zodDef(schema)\n // Fail loud on schema kinds that have no OpenAPI representation (rather than\n // swallowing the zod throw into `{}`). z.function() is the canonical case.\n if (def?.type === 'function') {\n throw new ZodToOpenApiError(\n 'z.function() cannot be represented in an OpenAPI schema (functions are not serializable).',\n )\n }\n\n // A transform / pipe (`z.string().transform(...)`) has no JSON-Schema of its\n // own — zod throws. The wire shape is the INPUT (transforms run post-parse),\n // so emit the input schema. This avoids the global `io: 'input'` mode, which\n // would also flip object `additionalProperties` semantics.\n if (def?.type === 'pipe' && def.in !== undefined) {\n return convertSchema(def.in, ctx)\n }\n\n try {\n const jsonSchema = z.toJSONSchema(schema) as Record<string, unknown>\n const out = toOpenApi3(jsonSchema)\n // zod v4 emits a discriminated union as `oneOf` but drops the discriminator\n // key; re-attach it from the zod def so OpenAPI consumers can branch.\n if (def?.type === 'union' && def.discriminator !== undefined && out.oneOf !== undefined) {\n out.discriminator = { propertyName: def.discriminator }\n }\n return out\n } catch (err) {\n if (err instanceof ZodToOpenApiError) throw err\n return {}\n }\n}\n\n/** JS safe-integer bounds zod v4 attaches to `.int()` — noise for OpenAPI, stripped. */\nconst SAFE_INT_MIN = Number.MIN_SAFE_INTEGER\nconst SAFE_INT_MAX = Number.MAX_SAFE_INTEGER\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return v !== null && typeof v === 'object' && !Array.isArray(v)\n}\n\n/** Drop zod-v4 noise keys: redundant `pattern` when `format` is set; JS safe-integer sentinel bounds. */\nfunction isNoiseKey(key: string, value: unknown, isInteger: boolean, hasFormat: boolean): boolean {\n if (key === 'pattern' && hasFormat) return true\n if (isInteger && key === 'minimum' && value === SAFE_INT_MIN) return true\n if (isInteger && key === 'maximum' && value === SAFE_INT_MAX) return true\n return false\n}\n\n/** Recursively normalize one JSON-Schema value (properties/items/*Of/additionalProperties). */\nfunction normalizeValue(key: string, value: unknown): unknown {\n if (key === 'properties' && isRecord(value)) {\n const props: Record<string, unknown> = {}\n for (const [pk, pv] of Object.entries(value)) props[pk] = isRecord(pv) ? toOpenApi3(pv) : pv\n return props\n }\n if (key === 'items' && isRecord(value)) return toOpenApi3(value)\n if ((key === 'anyOf' || key === 'oneOf' || key === 'allOf') && Array.isArray(value)) {\n const arr: unknown[] = value\n return arr.map((v) => (isRecord(v) ? toOpenApi3(v) : v))\n }\n if (key === 'additionalProperties' && isRecord(value)) return toOpenApi3(value)\n return value\n}\n\n/** Convert zod v4's `anyOf` (used for `.nullable()` + `z.union()`) to OpenAPI 3.0 shape. */\nfunction convertAnyOf(branches: unknown[], rest: Record<string, unknown>): OpenApiSchema {\n const records = branches.filter(isRecord)\n const hasNull = records.some((b) => b.type === 'null')\n const nonNull = records.filter((b) => b.type !== 'null')\n if (hasNull && nonNull.length === 1) {\n return { ...toOpenApi3(nonNull[0]), nullable: true }\n }\n const result: OpenApiSchema = { oneOf: nonNull.map((b) => toOpenApi3(b)) }\n if (hasNull) result.nullable = true\n for (const [k, v] of Object.entries(rest))\n if (k !== 'anyOf') (result as Record<string, unknown>)[k] = v\n return result\n}\n\n/**\n * Convert a JSON-Schema type array to OpenAPI 3.0, which has none. `null` becomes\n * `nullable: true`. zod 4.6+ collapses a union of unconstrained primitives into one\n * type array (`[\"string\",\"number\"]`), so more than one non-null type becomes `oneOf`,\n * the shape an `anyOf` union already gets.\n */\nfunction convertTypeArray(value: unknown[]): Record<string, unknown> {\n const types = value.filter((t): t is string => typeof t === 'string')\n const nonNull = types.filter((t) => t !== 'null')\n const out: Record<string, unknown> =\n nonNull.length > 1\n ? { oneOf: nonNull.map((t) => ({ type: t })) }\n : { type: nonNull.length === 1 ? nonNull[0] : nonNull }\n if (types.includes('null')) out.nullable = true\n return out\n}\n\n/**\n * Post-process JSON Schema (draft-2020-12) → OpenAPI 3.0:\n * - strip `$schema`/`$defs`\n * - `.nullable()`/union `anyOf` → `nullable: true` / `oneOf`\n * - `type: [\"string\",\"null\"]` → `{ type: \"string\", nullable: true }`\n * - `type: [\"string\",\"number\"]` → `{ oneOf: [{ type: \"string\" }, { type: \"number\" }] }`\n * - drop zod-v4 noise (redundant pattern, safe-integer bounds)\n * - recurse into nested schemas\n */\nfunction toOpenApi3(js: Record<string, unknown>): OpenApiSchema {\n const { $schema: _, $defs: _defs, ...rest } = js\n if (Array.isArray(rest.anyOf)) return convertAnyOf(rest.anyOf, rest)\n\n const isInteger = rest.type === 'integer'\n const hasFormat = typeof rest.format === 'string'\n const out: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(rest)) {\n if (isNoiseKey(key, value, isInteger, hasFormat)) continue\n // `const` is JSON-Schema / OpenAPI-3.1 only; `enum: [x]` is the 3.0-and-3.1\n // compatible spelling. zod v4 emits `const` for literals (discriminator tags).\n if (key === 'const') {\n out.enum = [value]\n continue\n }\n if (key === 'type' && Array.isArray(value)) {\n Object.assign(out, convertTypeArray(value))\n } else {\n out[key] = normalizeValue(key, value)\n }\n }\n\n return out\n}\n","/**\n * Build-time route loader for OpenAPI emit.\n *\n * Takes the G1 manifest (filePath + routePath + methods) and hydrates each\n * route's Zod schemas by dynamically importing the module. `defineRoute`\n * is an identity function, so the imported config exposes `body/query/\n * params/response` directly without any AST gymnastics.\n *\n * Supports both export shapes:\n * 1. `export const POST = defineRoute({...})` (per-method named exports)\n * 2. `export default defineRoute({...})` (single-export legacy shape)\n *\n * Per G2 plan v1.1 T2.2. Uses Vite's `ssrLoadModule` because route files\n * are TS at build time — Node's native loader doesn't transpile.\n */\nimport { resolve } from 'node:path'\n\nimport type { z } from 'zod'\n\nimport type { ManifestRoute } from '../../server/scan/manifest.js'\n\nimport type { OpenApiManifestRoute } from './emit.js'\n\ninterface RouteConfigShape {\n body?: z.ZodType\n query?: z.ZodType\n params?: z.ZodType\n response?: z.ZodType\n}\n\ninterface ViteLikeServer {\n ssrLoadModule: (id: string) => Promise<Record<string, unknown>>\n close: () => Promise<void>\n}\n\ninterface DefaultLoader {\n load: (absPath: string) => Promise<Record<string, unknown>>\n dispose: () => Promise<void>\n}\n\n/** Method names recognized as per-route named exports (UPPERCASE). */\nconst HTTP_METHOD_KEYS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'] as const\n\ninterface LoadRoutesOptions {\n serverDir: string\n routes: ManifestRoute[]\n /** Injectable for tests; defaults to a fresh Vite SSR dev server. */\n loadModule?: (absPath: string) => Promise<Record<string, unknown>>\n}\n\n/**\n * Hydrate manifest routes with Zod schemas extracted from their modules.\n *\n * Returns one `OpenApiManifestRoute` per (file × method) tuple. If a route\n * file declares multiple methods (`GET` + `POST`), each method gets its\n * own entry with the schemas from that method's `defineRoute()` call.\n *\n * Routes that fail to load are skipped with a console warning — the emit\n * should be best-effort, not a hard build failure.\n *\n * The default Vite loader is created once per call and disposed in the\n * `finally` block so the underlying server is released even when route\n * loading throws.\n */\nexport async function loadRoutesForOpenApi(\n options: LoadRoutesOptions,\n): Promise<OpenApiManifestRoute[]> {\n const { serverDir, routes } = options\n let loadModule = options.loadModule\n let dispose: (() => Promise<void>) | undefined\n if (loadModule === undefined) {\n const created = await createDefaultLoader(serverDir)\n loadModule = created.load\n dispose = created.dispose\n }\n\n const out: OpenApiManifestRoute[] = []\n try {\n for (const r of routes) {\n const abs = resolve(serverDir, r.filePath)\n let mod: Record<string, unknown>\n try {\n mod = await loadModule(abs)\n } catch (err) {\n console.warn(\n `[openapi-emit] Skipping ${r.filePath}: load failed (${(err as Error).message})`,\n )\n continue\n }\n\n const methods = r.methods ?? HTTP_METHOD_KEYS.filter((m) => mod[m] !== undefined)\n if (methods.length === 0) {\n // Fall back to default export when no method-named exports detected.\n const def = mod.default\n if (def !== undefined && def !== null) {\n out.push({ routePath: r.routePath, methods: ['GET'], ...extractSchemas(def) })\n }\n continue\n }\n\n for (const method of methods) {\n const handler = mod[method] ?? mod.default\n if (handler === undefined || handler === null) continue\n out.push({ routePath: r.routePath, methods: [method], ...extractSchemas(handler) })\n }\n }\n } finally {\n if (dispose !== undefined) {\n await dispose()\n }\n }\n return out\n}\n\nfunction extractSchemas(handlerExport: unknown): RouteConfigShape {\n if (typeof handlerExport !== 'object' || handlerExport === null) return {}\n const cfg = handlerExport as RouteConfigShape\n const out: RouteConfigShape = {}\n if (cfg.body !== undefined) out.body = cfg.body\n if (cfg.query !== undefined) out.query = cfg.query\n if (cfg.params !== undefined) out.params = cfg.params\n if (cfg.response !== undefined) out.response = cfg.response\n return out\n}\n\n/**\n * Default loader: spin up a minimal Vite SSR dev server (no HMR, no\n * middlewares) just to use its `ssrLoadModule`. Vite handles TS, ESM, and\n * import resolution for free.\n *\n * Returns `{load, dispose}` — the caller owns the lifecycle and MUST\n * call `dispose()` (typically in a `finally`) so the server is closed.\n */\nasync function createDefaultLoader(serverDir: string): Promise<DefaultLoader> {\n // Vite is a peerDep in build flows; import dynamically.\n const { createServer } = await import('vite')\n const server = (await createServer({\n root: serverDir,\n configFile: false,\n server: { middlewareMode: true },\n appType: 'custom',\n logLevel: 'silent',\n })) as unknown as ViteLikeServer\n\n const swallow = (): void => {\n /* eat close errors — best-effort cleanup */\n }\n return {\n load: async (absPath) => server.ssrLoadModule(absPath),\n dispose: async () => {\n await server.close().catch(swallow)\n },\n }\n}\n"],"mappings":"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","names":[]}
|