@keystrokehq/cli 0.0.165 → 0.0.166
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/README.md +11 -0
- package/dist/dist-BMPry9tj.mjs +577 -0
- package/dist/dist-BMPry9tj.mjs.map +1 -0
- package/dist/dist-CegYAHE0.mjs +3 -0
- package/dist/{schemas-Bq8SXmZk.mjs → dist-D_0UmqFb.mjs} +2113 -6
- package/dist/dist-D_0UmqFb.mjs.map +1 -0
- package/dist/{dist-CgV0MxBq.mjs → dist-WoxxHzM6.mjs} +123 -25
- package/dist/dist-WoxxHzM6.mjs.map +1 -0
- package/dist/index.mjs +147 -37
- package/dist/index.mjs.map +1 -1
- package/dist/{maybe-auto-update-CIcDJRrg.mjs → maybe-auto-update-B03C4E8i.mjs} +2 -2
- package/dist/{maybe-auto-update-CIcDJRrg.mjs.map → maybe-auto-update-B03C4E8i.mjs.map} +1 -1
- package/dist/skills-bundle/_AGENTS.md +7 -3
- package/dist/skills-bundle/skills/keystroke-actions/SKILL.md +1 -1
- package/dist/skills-bundle/skills/keystroke-actions/references/catalog-and-imports.md +2 -3
- package/dist/skills-bundle/skills/keystroke-agents/references/tools-mcp-codemode.md +1 -1
- package/dist/skills-bundle/skills/keystroke-cli/SKILL.md +4 -2
- package/dist/skills-bundle/skills/keystroke-deploy/SKILL.md +92 -0
- package/dist/skills-bundle/skills/keystroke-deploy/references/build-and-full-deploy.md +28 -0
- package/dist/skills-bundle/skills/keystroke-deploy/references/filtered-deploy.md +49 -0
- package/dist/skills-bundle/skills/keystroke-deploy/references/wip-ignore.md +32 -0
- package/dist/skills-bundle/skills/keystroke-gateways/SKILL.md +5 -6
- package/dist/skills-bundle/skills/keystroke-gateways/references/slack-setup.md +0 -11
- package/dist/templates/hello-world/README.md +1 -1
- package/dist/templates/hello-world/keystroke.config.ts +1 -5
- package/dist/{version-DdbxgFWa.mjs → version-FrEOAEU7.mjs} +2 -2
- package/dist/{version-DdbxgFWa.mjs.map → version-FrEOAEU7.mjs.map} +1 -1
- package/package.json +1 -1
- package/dist/discovery-DV7FkTRA-JYiC_9cY.mjs +0 -71
- package/dist/discovery-DV7FkTRA-JYiC_9cY.mjs.map +0 -1
- package/dist/dist-CgV0MxBq.mjs.map +0 -1
- package/dist/dist-DtqmE5R_.mjs +0 -2113
- package/dist/dist-DtqmE5R_.mjs.map +0 -1
- package/dist/dist-sXdjEZpP.mjs +0 -293
- package/dist/dist-sXdjEZpP.mjs.map +0 -1
- package/dist/schemas-Bq8SXmZk.mjs.map +0 -1
- package/dist/walk-project-171B4cvO-DKtupJ6Z.mjs +0 -102
- package/dist/walk-project-171B4cvO-DKtupJ6Z.mjs.map +0 -1
|
@@ -1,10 +1,104 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import { Zt as normalizeCredentialList, _t as ROUTE_MANIFEST_REL_PATH, mt as PromptResponseSchema, pt as PromptInputSchema } from "./dist-DtqmE5R_.mjs";
|
|
4
|
-
import { i as walkTypeScriptFiles, n as discoverModuleFileEntries, r as entryIdFromFile } from "./discovery-DV7FkTRA-JYiC_9cY.mjs";
|
|
2
|
+
import { $t as normalizeCredentialList, an as custom, cn as object, dn as toJSONSchema, ht as PromptResponseSchema, in as array, ln as string, mt as PromptInputSchema, nn as ZodType, on as discriminatedUnion, rn as _function, sn as literal, un as union, vt as ROUTE_MANIFEST_REL_PATH } from "./dist-D_0UmqFb.mjs";
|
|
5
3
|
import { dirname, join, relative, sep } from "node:path";
|
|
6
4
|
import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
|
|
7
5
|
import { pathToFileURL } from "node:url";
|
|
6
|
+
import { readdir, stat } from "node:fs/promises";
|
|
7
|
+
//#region ../../packages/manifest/dist/discovery-CWjr_liZ.mjs
|
|
8
|
+
const SOURCE_EXT = /\.(ts|mts|mjs|js)$/;
|
|
9
|
+
const DECLARATION_FILE$1 = /\.d\.(ts|mts|cts)$/;
|
|
10
|
+
function entryIdFromFile(rootDir, filePath, options) {
|
|
11
|
+
if (DECLARATION_FILE$1.test(filePath)) return null;
|
|
12
|
+
const baseName = filePath.split(sep).at(-1) ?? "";
|
|
13
|
+
if (/\.(int\.)?test\.(ts|mts)$/.test(baseName)) return null;
|
|
14
|
+
const segments = relative(rootDir, filePath).replace(SOURCE_EXT, "").split(sep).filter((segment) => segment.length > 0);
|
|
15
|
+
if (segments.length === 1) return segments[0] ?? null;
|
|
16
|
+
const last = segments.at(-1);
|
|
17
|
+
const entryNames = new Set([options.nestedEntry]);
|
|
18
|
+
if (options.allowIndex !== false) entryNames.add("index");
|
|
19
|
+
if (!last || !entryNames.has(last)) return null;
|
|
20
|
+
const id = segments.slice(0, -1).join("/");
|
|
21
|
+
return id.length > 0 ? id : null;
|
|
22
|
+
}
|
|
23
|
+
const SOURCE_FILE = /\.(ts|mts|mjs|js)$/;
|
|
24
|
+
const TEST_FILE = /\.(int\.)?test\.(ts|mts)$/;
|
|
25
|
+
const DECLARATION_FILE = /\.d\.(ts|mts|cts)$/;
|
|
26
|
+
const JUNK_FILE = /^\._|\.DS_Store$/;
|
|
27
|
+
async function walkTypeScriptFiles(dir) {
|
|
28
|
+
let names;
|
|
29
|
+
try {
|
|
30
|
+
names = await readdir(dir);
|
|
31
|
+
} catch (error) {
|
|
32
|
+
if (error.code === "ENOENT") return [];
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
const files = [];
|
|
36
|
+
for (const name of names) {
|
|
37
|
+
const path = join(dir, name);
|
|
38
|
+
if ((await stat(path)).isDirectory()) files.push(...await walkTypeScriptFiles(path));
|
|
39
|
+
else if (!JUNK_FILE.test(name) && SOURCE_FILE.test(name) && !DECLARATION_FILE.test(name) && !TEST_FILE.test(name)) files.push(path);
|
|
40
|
+
}
|
|
41
|
+
return files;
|
|
42
|
+
}
|
|
43
|
+
async function discoverEntries(rootDir, options) {
|
|
44
|
+
const files = await walkTypeScriptFiles(rootDir);
|
|
45
|
+
const byKey = /* @__PURE__ */ new Map();
|
|
46
|
+
for (const filePath of files) {
|
|
47
|
+
const id = entryIdFromFile(rootDir, filePath, options);
|
|
48
|
+
if (!id) continue;
|
|
49
|
+
const key = options.formatKey(id);
|
|
50
|
+
const moduleFile = relative(rootDir, filePath);
|
|
51
|
+
const existing = byKey.get(key);
|
|
52
|
+
if (existing) throw new Error(`Duplicate ${options.duplicateLabel} ${key}: ${existing.filePath} and ${filePath}`);
|
|
53
|
+
byKey.set(key, {
|
|
54
|
+
key,
|
|
55
|
+
filePath,
|
|
56
|
+
moduleFile
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return [...byKey.values()];
|
|
60
|
+
}
|
|
61
|
+
async function discoverModuleFileEntries(rootDir, options) {
|
|
62
|
+
return (await discoverEntries(rootDir, {
|
|
63
|
+
nestedEntry: options.nestedEntry,
|
|
64
|
+
formatKey: (id) => id,
|
|
65
|
+
duplicateLabel: options.duplicateLabel
|
|
66
|
+
})).filter((entry) => options.shouldDiscoverFile?.(entry.filePath) ?? true).map(({ filePath, moduleFile }) => ({
|
|
67
|
+
filePath,
|
|
68
|
+
moduleFile
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
const HEADER_BYTES = 2048;
|
|
72
|
+
const DIRECTIVE_RE = /@keystroke\s+ignore(?::([a-z]+))?/;
|
|
73
|
+
/** Parse `@keystroke ignore` directives from a file header snippet. */
|
|
74
|
+
function parseKeystrokeIgnoreDirective(header) {
|
|
75
|
+
for (const line of header.slice(0, HEADER_BYTES).split("\n")) {
|
|
76
|
+
const trimmed = line.trim();
|
|
77
|
+
if (trimmed.length === 0) continue;
|
|
78
|
+
if (!isCommentLine(trimmed)) break;
|
|
79
|
+
const match = DIRECTIVE_RE.exec(trimmed);
|
|
80
|
+
if (!match) continue;
|
|
81
|
+
const scope = match[1];
|
|
82
|
+
if (!scope) return "ignore";
|
|
83
|
+
if (scope === "deploy") return "ignore:deploy";
|
|
84
|
+
throw new Error(`Unknown @keystroke ignore target "${scope}" in directive "@keystroke ignore:${scope}"`);
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
/** Read `@keystroke ignore` directives from the top of a module file. */
|
|
89
|
+
function readKeystrokeIgnoreDirective(filePath) {
|
|
90
|
+
return parseKeystrokeIgnoreDirective(readFileSync(filePath, "utf8").slice(0, HEADER_BYTES));
|
|
91
|
+
}
|
|
92
|
+
/** Whether a discovered module file should be skipped for the given build phase. */
|
|
93
|
+
function shouldSkipKeystrokeModuleFile(directive, phase) {
|
|
94
|
+
if (!directive) return false;
|
|
95
|
+
if (directive === "ignore") return true;
|
|
96
|
+
return phase === "deploy";
|
|
97
|
+
}
|
|
98
|
+
function isCommentLine(line) {
|
|
99
|
+
return line.startsWith("//") || line.startsWith("/*") || line.startsWith("*");
|
|
100
|
+
}
|
|
101
|
+
//#endregion
|
|
8
102
|
//#region ../../packages/manifest/dist/index.mjs
|
|
9
103
|
function isManifestAgent(value) {
|
|
10
104
|
if (typeof value !== "object" || value === null) return false;
|
|
@@ -53,14 +147,14 @@ function webhookRouteFromEndpoint(endpoint) {
|
|
|
53
147
|
if (!normalized) throw new Error("Webhook endpoint must not be empty");
|
|
54
148
|
return `/triggers/${normalized}`;
|
|
55
149
|
}
|
|
56
|
-
async function discoverAgentEntries(agentsDir) {
|
|
150
|
+
async function discoverAgentEntries(agentsDir, options) {
|
|
57
151
|
const files = await discoverModuleFileEntries(agentsDir, {
|
|
58
152
|
nestedEntry: "agent",
|
|
59
153
|
duplicateLabel: "agent module file"
|
|
60
154
|
});
|
|
61
155
|
const entries = [];
|
|
62
156
|
for (const { filePath, moduleFile } of files) {
|
|
63
|
-
const agent = await importAgentDefinition(filePath);
|
|
157
|
+
const agent = await importAgentDefinition(filePath, options);
|
|
64
158
|
entries.push({
|
|
65
159
|
key: agent.slug,
|
|
66
160
|
route: agentRouteFromKey(agent.slug),
|
|
@@ -70,8 +164,9 @@ async function discoverAgentEntries(agentsDir) {
|
|
|
70
164
|
}
|
|
71
165
|
return entries;
|
|
72
166
|
}
|
|
73
|
-
async function importAgentDefinition(filePath) {
|
|
74
|
-
|
|
167
|
+
async function importAgentDefinition(filePath, options) {
|
|
168
|
+
const href = pathToFileURL(filePath).href;
|
|
169
|
+
return validateManifestAgent((await (options?.reload ? import(`${href}?keystroke=${Date.now()}`) : import(href))).default, filePath);
|
|
75
170
|
}
|
|
76
171
|
const ACTION = Symbol.for("keystroke.action");
|
|
77
172
|
function isManifestAction(value) {
|
|
@@ -314,7 +409,7 @@ function validateManifestTriggerAttachment(value, filePath) {
|
|
|
314
409
|
function shouldDiscoverTriggerFile(triggersDir, filePath) {
|
|
315
410
|
return !relative(triggersDir, filePath).split(sep).includes("sources");
|
|
316
411
|
}
|
|
317
|
-
async function discoverTriggerAttachments(triggersDir) {
|
|
412
|
+
async function discoverTriggerAttachments(triggersDir, options) {
|
|
318
413
|
const files = await discoverModuleFileEntries(triggersDir, {
|
|
319
414
|
nestedEntry: "trigger",
|
|
320
415
|
duplicateLabel: "trigger module file",
|
|
@@ -322,7 +417,7 @@ async function discoverTriggerAttachments(triggersDir) {
|
|
|
322
417
|
});
|
|
323
418
|
const attachments = [];
|
|
324
419
|
for (const { filePath, moduleFile } of files) {
|
|
325
|
-
const attachment = await importTriggerAttachment(filePath);
|
|
420
|
+
const attachment = await importTriggerAttachment(filePath, options);
|
|
326
421
|
attachments.push({
|
|
327
422
|
key: attachment.key,
|
|
328
423
|
filePath,
|
|
@@ -335,8 +430,9 @@ async function discoverTriggerAttachments(triggersDir) {
|
|
|
335
430
|
function validateImportedTriggerAttachment(def, filePath) {
|
|
336
431
|
return validateManifestTriggerAttachment(def, filePath);
|
|
337
432
|
}
|
|
338
|
-
async function importTriggerAttachment(filePath) {
|
|
339
|
-
|
|
433
|
+
async function importTriggerAttachment(filePath, options) {
|
|
434
|
+
const href = pathToFileURL(filePath).href;
|
|
435
|
+
return validateImportedTriggerAttachment((await (options?.reload ? import(`${href}?keystroke=${Date.now()}`) : import(href))).default, filePath);
|
|
340
436
|
}
|
|
341
437
|
function pollGroupId(discovered) {
|
|
342
438
|
const source = discovered.attachment.source;
|
|
@@ -398,14 +494,14 @@ function webhookManifestAttachmentSchemasFromBindings(bindings) {
|
|
|
398
494
|
...entry.filter ? { filter: entry.filter } : {}
|
|
399
495
|
}]));
|
|
400
496
|
}
|
|
401
|
-
async function discoverWorkflowEntries(workflowsDir) {
|
|
497
|
+
async function discoverWorkflowEntries(workflowsDir, options) {
|
|
402
498
|
const files = await discoverModuleFileEntries(workflowsDir, {
|
|
403
499
|
nestedEntry: "workflow",
|
|
404
500
|
duplicateLabel: "workflow module file"
|
|
405
501
|
});
|
|
406
502
|
const entries = [];
|
|
407
503
|
for (const { filePath, moduleFile } of files) {
|
|
408
|
-
const definition = await importWorkflowDefinition(filePath);
|
|
504
|
+
const definition = await importWorkflowDefinition(filePath, options);
|
|
409
505
|
entries.push({
|
|
410
506
|
key: definition.slug,
|
|
411
507
|
route: workflowRouteFromKey(definition.slug),
|
|
@@ -418,14 +514,15 @@ async function discoverWorkflowEntries(workflowsDir) {
|
|
|
418
514
|
function validateImportedWorkflowDefinition(def, filePath) {
|
|
419
515
|
return validateManifestWorkflow(def, filePath);
|
|
420
516
|
}
|
|
421
|
-
async function importWorkflowDefinition(filePath) {
|
|
422
|
-
|
|
517
|
+
async function importWorkflowDefinition(filePath, options) {
|
|
518
|
+
const href = pathToFileURL(filePath).href;
|
|
519
|
+
return validateImportedWorkflowDefinition((await (options?.reload ? import(`${href}?keystroke=${Date.now()}`) : import(href))).default, filePath);
|
|
423
520
|
}
|
|
424
|
-
async function discoverWorkflows(workflowsDir) {
|
|
425
|
-
const entries = await discoverWorkflowEntries(workflowsDir);
|
|
521
|
+
async function discoverWorkflows(workflowsDir, options) {
|
|
522
|
+
const entries = await discoverWorkflowEntries(workflowsDir, options);
|
|
426
523
|
const workflows = [];
|
|
427
524
|
for (const entry of entries) {
|
|
428
|
-
const definition = await importWorkflowDefinition(entry.filePath);
|
|
525
|
+
const definition = await importWorkflowDefinition(entry.filePath, options);
|
|
429
526
|
workflows.push({
|
|
430
527
|
key: definition.slug,
|
|
431
528
|
route: workflowRouteFromKey(definition.slug),
|
|
@@ -483,9 +580,10 @@ var SourceModuleFileResolver = class {
|
|
|
483
580
|
}
|
|
484
581
|
};
|
|
485
582
|
/** Build a stored route manifest from compiled dist/ modules without starting a server. */
|
|
486
|
-
async function buildStoredRouteManifestForProject(projectRoot) {
|
|
583
|
+
async function buildStoredRouteManifestForProject(projectRoot, options) {
|
|
487
584
|
const previousRoot = process.env.KEYSTROKE_ROOT;
|
|
488
585
|
process.env.KEYSTROKE_ROOT = projectRoot;
|
|
586
|
+
const reload = options?.reloadModules ? { reload: true } : void 0;
|
|
489
587
|
try {
|
|
490
588
|
const dirs = resolveDistModuleDirs(projectRoot);
|
|
491
589
|
const sourcePaths = new SourceModuleFileResolver(projectRoot);
|
|
@@ -494,9 +592,9 @@ async function buildStoredRouteManifestForProject(projectRoot) {
|
|
|
494
592
|
method: "GET",
|
|
495
593
|
path: "/health"
|
|
496
594
|
}];
|
|
497
|
-
const agentEntries = await discoverAgentEntries(dirs.agentsDir);
|
|
595
|
+
const agentEntries = await discoverAgentEntries(dirs.agentsDir, reload);
|
|
498
596
|
for (const entry of agentEntries) {
|
|
499
|
-
const agent = await importAgentDefinition(entry.filePath);
|
|
597
|
+
const agent = await importAgentDefinition(entry.filePath, reload);
|
|
500
598
|
const moduleFile = await sourcePaths.resolve("agents", "agent", dirs.agentsDir, entry.filePath);
|
|
501
599
|
manifest.push({
|
|
502
600
|
kind: "agent",
|
|
@@ -528,7 +626,7 @@ async function buildStoredRouteManifestForProject(projectRoot) {
|
|
|
528
626
|
moduleFile
|
|
529
627
|
});
|
|
530
628
|
}
|
|
531
|
-
const workflows = await discoverWorkflows(dirs.workflowsDir);
|
|
629
|
+
const workflows = await discoverWorkflows(dirs.workflowsDir, reload);
|
|
532
630
|
for (const workflow of workflows) {
|
|
533
631
|
const route = workflowRouteFromKey(workflow.key);
|
|
534
632
|
const moduleFile = await sourcePaths.resolve("workflows", "workflow", dirs.workflowsDir, workflow.filePath);
|
|
@@ -561,7 +659,7 @@ async function buildStoredRouteManifestForProject(projectRoot) {
|
|
|
561
659
|
moduleFile
|
|
562
660
|
});
|
|
563
661
|
}
|
|
564
|
-
const attachments = await discoverTriggerAttachments(dirs.triggersDir);
|
|
662
|
+
const attachments = await discoverTriggerAttachments(dirs.triggersDir, reload);
|
|
565
663
|
const discoveredByKey = new Map(attachments.map((attachment) => [attachment.key, attachment]));
|
|
566
664
|
const pollGroups = buildPollGroups(attachments);
|
|
567
665
|
for (const discovered of discoveredByKey.values()) {
|
|
@@ -672,6 +770,6 @@ async function emitStoredRouteManifestForProject(projectRoot) {
|
|
|
672
770
|
persistStoredRouteManifest(projectRoot, await buildStoredRouteManifestForProject(projectRoot));
|
|
673
771
|
}
|
|
674
772
|
//#endregion
|
|
675
|
-
export { emitStoredRouteManifestForProject };
|
|
773
|
+
export { webhookMatchSchemaForBindings as A, walkTypeScriptFiles as B, serializeRouteManifest as C, validateImportedTriggerAttachment as D, triggerRunsListPath as E, discoverEntries as F, discoverModuleFileEntries as I, entryIdFromFile as L, workflowRouteFromKey as M, workflowRunDetailPath as N, validateImportedWorkflowDefinition as O, workflowRunsListPath as P, readKeystrokeIgnoreDirective as R, schemaToJson as S, triggerRunDetailPath as T, importWorkflowDefinition as _, buildStoredRouteManifestForProject as a, pollGroupRouteFromId as b, countAgentCredentials as c, discoverTriggerAttachments as d, discoverWorkflowEntries as f, importTriggerAttachment as g, importAgentDefinition as h, buildPollGroups as i, webhookRouteFromEndpoint as j, webhookManifestAttachmentSchemasFromBindings as k, discoverAgentEntries as l, emitStoredRouteManifestForProject as m, agentSessionDetailPath as n, buildStoredRouteManifestFromContext as o, discoverWorkflows as p, agentSessionsListPath as r, buildWebhookBindingsByRoute as s, agentRouteFromKey as t, discoverSkillManifestEntries as u, persistStoredRouteManifest as v, toStoredRouteManifest as w, pollRouteFromKey as x, pollGroupId as y, shouldSkipKeystrokeModuleFile as z };
|
|
676
774
|
|
|
677
|
-
//# sourceMappingURL=dist-
|
|
775
|
+
//# sourceMappingURL=dist-WoxxHzM6.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dist-WoxxHzM6.mjs","names":["z.toJSONSchema","z.custom","z.ZodType","z.string","z.union","z.function","z.object","z.literal","z.array","z.discriminatedUnion"],"sources":["../../../packages/manifest/dist/discovery-CWjr_liZ.mjs","../../../packages/manifest/dist/index.mjs"],"sourcesContent":["import { join, relative, sep } from \"node:path\";\nimport { readdir, stat } from \"node:fs/promises\";\nimport { readFileSync } from \"node:fs\";\n//#region src/discovery/entry-from-file.ts\nconst SOURCE_EXT = /\\.(ts|mts|mjs|js)$/;\nconst DECLARATION_FILE$1 = /\\.d\\.(ts|mts|cts)$/;\nfunction entryIdFromFile(rootDir, filePath, options) {\n\tif (DECLARATION_FILE$1.test(filePath)) return null;\n\tconst baseName = filePath.split(sep).at(-1) ?? \"\";\n\tif (/\\.(int\\.)?test\\.(ts|mts)$/.test(baseName)) return null;\n\tconst segments = relative(rootDir, filePath).replace(SOURCE_EXT, \"\").split(sep).filter((segment) => segment.length > 0);\n\tif (segments.length === 1) return segments[0] ?? null;\n\tconst last = segments.at(-1);\n\tconst entryNames = new Set([options.nestedEntry]);\n\tif (options.allowIndex !== false) entryNames.add(\"index\");\n\tif (!last || !entryNames.has(last)) return null;\n\tconst id = segments.slice(0, -1).join(\"/\");\n\treturn id.length > 0 ? id : null;\n}\n//#endregion\n//#region src/discovery/walk-typescript-files.ts\nconst SOURCE_FILE = /\\.(ts|mts|mjs|js)$/;\nconst TEST_FILE = /\\.(int\\.)?test\\.(ts|mts)$/;\nconst DECLARATION_FILE = /\\.d\\.(ts|mts|cts)$/;\nconst JUNK_FILE = /^\\._|\\.DS_Store$/;\nasync function walkTypeScriptFiles(dir) {\n\tlet names;\n\ttry {\n\t\tnames = await readdir(dir);\n\t} catch (error) {\n\t\tif (error.code === \"ENOENT\") return [];\n\t\tthrow error;\n\t}\n\tconst files = [];\n\tfor (const name of names) {\n\t\tconst path = join(dir, name);\n\t\tif ((await stat(path)).isDirectory()) files.push(...await walkTypeScriptFiles(path));\n\t\telse if (!JUNK_FILE.test(name) && SOURCE_FILE.test(name) && !DECLARATION_FILE.test(name) && !TEST_FILE.test(name)) files.push(path);\n\t}\n\treturn files;\n}\n//#endregion\n//#region src/discovery/discover-entries.ts\nasync function discoverEntries(rootDir, options) {\n\tconst files = await walkTypeScriptFiles(rootDir);\n\tconst byKey = /* @__PURE__ */ new Map();\n\tfor (const filePath of files) {\n\t\tconst id = entryIdFromFile(rootDir, filePath, options);\n\t\tif (!id) continue;\n\t\tconst key = options.formatKey(id);\n\t\tconst moduleFile = relative(rootDir, filePath);\n\t\tconst existing = byKey.get(key);\n\t\tif (existing) throw new Error(`Duplicate ${options.duplicateLabel} ${key}: ${existing.filePath} and ${filePath}`);\n\t\tbyKey.set(key, {\n\t\t\tkey,\n\t\t\tfilePath,\n\t\t\tmoduleFile\n\t\t});\n\t}\n\treturn [...byKey.values()];\n}\n//#endregion\n//#region src/discovery/discover-module-entries.ts\nasync function discoverModuleFileEntries(rootDir, options) {\n\treturn (await discoverEntries(rootDir, {\n\t\tnestedEntry: options.nestedEntry,\n\t\tformatKey: (id) => id,\n\t\tduplicateLabel: options.duplicateLabel\n\t})).filter((entry) => options.shouldDiscoverFile?.(entry.filePath) ?? true).map(({ filePath, moduleFile }) => ({\n\t\tfilePath,\n\t\tmoduleFile\n\t}));\n}\nfunction moduleFileKeyFromPath(rootDir, filePath, nestedEntry) {\n\treturn entryIdFromFile(rootDir, filePath, { nestedEntry });\n}\n//#endregion\n//#region src/discovery/keystroke-ignore-directive.ts\nconst HEADER_BYTES = 2048;\nconst DIRECTIVE_RE = /@keystroke\\s+ignore(?::([a-z]+))?/;\n/** Parse `@keystroke ignore` directives from a file header snippet. */\nfunction parseKeystrokeIgnoreDirective(header) {\n\tfor (const line of header.slice(0, HEADER_BYTES).split(\"\\n\")) {\n\t\tconst trimmed = line.trim();\n\t\tif (trimmed.length === 0) continue;\n\t\tif (!isCommentLine(trimmed)) break;\n\t\tconst match = DIRECTIVE_RE.exec(trimmed);\n\t\tif (!match) continue;\n\t\tconst scope = match[1];\n\t\tif (!scope) return \"ignore\";\n\t\tif (scope === \"deploy\") return \"ignore:deploy\";\n\t\tthrow new Error(`Unknown @keystroke ignore target \"${scope}\" in directive \"@keystroke ignore:${scope}\"`);\n\t}\n\treturn null;\n}\n/** Read `@keystroke ignore` directives from the top of a module file. */\nfunction readKeystrokeIgnoreDirective(filePath) {\n\treturn parseKeystrokeIgnoreDirective(readFileSync(filePath, \"utf8\").slice(0, HEADER_BYTES));\n}\n/** Whether a discovered module file should be skipped for the given build phase. */\nfunction shouldSkipKeystrokeModuleFile(directive, phase) {\n\tif (!directive) return false;\n\tif (directive === \"ignore\") return true;\n\treturn phase === \"deploy\";\n}\nfunction isCommentLine(line) {\n\treturn line.startsWith(\"//\") || line.startsWith(\"/*\") || line.startsWith(\"*\");\n}\n//#endregion\n//#region src/discovery/validate-unique-module-keys.ts\nfunction validateUniqueModuleKeys(entries) {\n\tconst byKey = /* @__PURE__ */ new Map();\n\tfor (const entry of entries) {\n\t\tconst list = byKey.get(entry.key) ?? [];\n\t\tlist.push(entry);\n\t\tbyKey.set(entry.key, list);\n\t}\n\tfor (const [key, clashes] of byKey) {\n\t\tif (clashes.length <= 1) continue;\n\t\tconst detail = clashes.map((entry) => `${entry.kind} (${entry.filePath})`).join(\", \");\n\t\tthrow new Error(`Duplicate module key \"${key}\": ${detail}`);\n\t}\n}\n//#endregion\nexport { discoverModuleFileEntries as a, walkTypeScriptFiles as c, shouldSkipKeystrokeModuleFile as i, entryIdFromFile as l, parseKeystrokeIgnoreDirective as n, moduleFileKeyFromPath as o, readKeystrokeIgnoreDirective as r, discoverEntries as s, validateUniqueModuleKeys as t };\n\n//# sourceMappingURL=discovery-CWjr_liZ.mjs.map","import { a as discoverModuleFileEntries, c as walkTypeScriptFiles, l as entryIdFromFile, o as moduleFileKeyFromPath, s as discoverEntries, t as validateUniqueModuleKeys } from \"./discovery-CWjr_liZ.mjs\";\nimport { pathToFileURL } from \"node:url\";\nimport { dirname, join, relative, sep } from \"node:path\";\nimport { PromptInputSchema, PromptResponseSchema, ROUTE_MANIFEST_REL_PATH, normalizeCredentialList, parseStoredRouteManifest } from \"@keystrokehq/shared\";\nimport { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from \"node:fs\";\nimport { z } from \"zod\";\n//#region src/guards/agent.ts\nfunction isManifestAgent(value) {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tconst agent = value;\n\treturn typeof agent.slug === \"string\" && agent.slug.trim().length > 0 && typeof agent.buildRuntime === \"function\" && typeof agent.model === \"string\" && typeof agent.systemPrompt === \"string\";\n}\nfunction validateManifestAgent(value, filePath) {\n\tif (!isManifestAgent(value)) throw new Error(`${filePath} must default-export defineAgent(...)`);\n\treturn value;\n}\n//#endregion\n//#region src/routes.ts\nfunction normalizeWebhookEndpoint(endpoint) {\n\treturn endpoint.replace(/^\\/+|\\/+$/g, \"\").replace(/^triggers\\/?/, \"\");\n}\nfunction agentRouteFromKey(key) {\n\treturn `/agents/${key}`;\n}\nfunction agentSessionsListPath(route) {\n\treturn `${route}/sessions`;\n}\nfunction agentSessionDetailPath(route) {\n\treturn `${route}/sessions/:sessionId`;\n}\nfunction workflowRouteFromKey(key) {\n\treturn `/workflows/${key}`;\n}\nfunction workflowRunsListPath(route) {\n\treturn `${route}/runs`;\n}\nfunction workflowRunDetailPath(route) {\n\treturn `${route}/runs/:runId`;\n}\nfunction triggerRunsListPath(attachmentKey) {\n\treturn `/triggers/${attachmentKey}/runs`;\n}\nfunction triggerRunDetailPath(attachmentKey) {\n\treturn `/triggers/${attachmentKey}/runs/:runId`;\n}\nfunction pollRouteFromKey(attachmentKey) {\n\treturn `/triggers/${attachmentKey}/poll`;\n}\nfunction pollGroupRouteFromId(pollId) {\n\treturn `/triggers/polls/${pollId}/run`;\n}\nfunction webhookRouteFromEndpoint(endpoint) {\n\tconst normalized = normalizeWebhookEndpoint(endpoint);\n\tif (!normalized) throw new Error(\"Webhook endpoint must not be empty\");\n\treturn `/triggers/${normalized}`;\n}\n//#endregion\n//#region src/agents/discover.ts\nasync function discoverAgentEntries(agentsDir, options) {\n\tconst files = await discoverModuleFileEntries(agentsDir, {\n\t\tnestedEntry: \"agent\",\n\t\tduplicateLabel: \"agent module file\"\n\t});\n\tconst entries = [];\n\tfor (const { filePath, moduleFile } of files) {\n\t\tconst agent = await importAgentDefinition(filePath, options);\n\t\tentries.push({\n\t\t\tkey: agent.slug,\n\t\t\troute: agentRouteFromKey(agent.slug),\n\t\t\tfilePath,\n\t\t\tmoduleFile\n\t\t});\n\t}\n\treturn entries;\n}\nasync function importAgentDefinition(filePath, options) {\n\tconst href = pathToFileURL(filePath).href;\n\treturn validateManifestAgent((await (options?.reload ? import(`${href}?keystroke=${Date.now()}`) : import(href))).default, filePath);\n}\n//#endregion\n//#region src/guards/action.ts\nconst ACTION = Symbol.for(\"keystroke.action\");\nfunction isManifestAction(value) {\n\tif (typeof value !== \"object\" || value === null) return false;\n\treturn ACTION in value && value[ACTION] === true;\n}\nfunction getManifestActionCredentialRequirements(action) {\n\treturn Array.isArray(action.credentials) ? action.credentials : void 0;\n}\n//#endregion\n//#region src/agents/count-agent-credentials.ts\nfunction countAgentCredentials(agent) {\n\tconst keys = /* @__PURE__ */ new Set();\n\tfor (const tool of agent.tools ?? []) {\n\t\tconst record = tool;\n\t\tconst requirements = isManifestAction(tool) ? getManifestActionCredentialRequirements(tool) : \"credentials\" in record && Array.isArray(record.credentials) ? record.credentials : void 0;\n\t\tif (!requirements?.length) continue;\n\t\tfor (const requirement of normalizeCredentialList(requirements)) keys.add(requirement.key);\n\t}\n\treturn keys.size;\n}\n//#endregion\n//#region src/skills/discover-manifest-entries.ts\nconst SKIP_DIRS = new Set([\".git\", \"node_modules\"]);\nfunction toPosix$1(path) {\n\treturn path.split(sep).join(\"/\");\n}\nfunction parseSkillFrontmatter(raw) {\n\tconst match = raw.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n\tif (!match) return {};\n\tconst out = {};\n\tfor (const line of match[1]?.split(\"\\n\") ?? []) {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed || trimmed.startsWith(\"#\")) continue;\n\t\tconst colon = trimmed.indexOf(\":\");\n\t\tif (colon < 0) continue;\n\t\tconst key = trimmed.slice(0, colon).trim();\n\t\tlet value = trimmed.slice(colon + 1).trim();\n\t\tif (value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\") || value.startsWith(\"'\") && value.endsWith(\"'\")) value = value.slice(1, -1);\n\t\tif (key === \"name\") out.name = value;\n\t\telse if (key === \"description\") out.description = value;\n\t}\n\treturn out;\n}\nfunction walkSkillFiles(root, dir, out) {\n\tfor (const name of readdirSync(dir).sort()) {\n\t\tconst absolute = join(dir, name);\n\t\tconst stats = statSync(absolute);\n\t\tif (stats.isDirectory()) {\n\t\t\tif (SKIP_DIRS.has(name)) continue;\n\t\t\twalkSkillFiles(root, absolute, out);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!stats.isFile() || name !== \"SKILL.md\") continue;\n\t\tconst moduleFile = toPosix$1(relative(root, absolute));\n\t\tconst slug = toPosix$1(relative(join(root, \"src\", \"skills\"), absolute)).replace(/\\/?SKILL\\.md$/, \"\");\n\t\tif (!slug) continue;\n\t\tconst frontmatter = parseSkillFrontmatter(readFileSync(absolute, \"utf8\"));\n\t\tout.push({\n\t\t\tslug,\n\t\t\tname: frontmatter.name,\n\t\t\tdescription: frontmatter.description,\n\t\t\tmoduleFile\n\t\t});\n\t}\n}\n/** Discover skill metadata from src/skills SKILL.md files for the route manifest. */\nfunction discoverSkillManifestEntries(projectRoot) {\n\tconst skillsDir = join(projectRoot, \"src\", \"skills\");\n\tif (!statSync(skillsDir, { throwIfNoEntry: false })?.isDirectory()) return [];\n\tconst entries = [];\n\twalkSkillFiles(projectRoot, skillsDir, entries);\n\treturn entries;\n}\n//#endregion\n//#region src/openapi/schema-to-json.ts\nfunction schemaToJson(schema) {\n\treturn z.toJSONSchema(schema, { target: \"openapi-3.0\" });\n}\n//#endregion\n//#region src/openapi/serialize-manifest.ts\nfunction collectIntegrationKeys(integrations) {\n\treturn integrations.map((integration) => integration.key);\n}\nfunction serializeRouteManifest(manifest) {\n\treturn manifest.map((entry) => {\n\t\tswitch (entry.kind) {\n\t\t\tcase \"health\": return entry;\n\t\t\tcase \"agent\": return {\n\t\t\t\tkind: entry.kind,\n\t\t\t\tmethod: entry.method,\n\t\t\t\tpath: entry.path,\n\t\t\t\tagentSlug: entry.agentSlug,\n\t\t\t\tmoduleFile: entry.moduleFile,\n\t\t\t\tname: entry.name,\n\t\t\t\tdescription: entry.description,\n\t\t\t\tmodel: entry.model,\n\t\t\t\tsystemPrompt: entry.systemPrompt,\n\t\t\t\ttoolCount: entry.toolCount,\n\t\t\t\tcredentialCount: entry.credentialCount,\n\t\t\t\trequestSchema: schemaToJson(entry.request),\n\t\t\t\tresponseSchema: schemaToJson(entry.response)\n\t\t\t};\n\t\t\tcase \"workflow\": return {\n\t\t\t\tkind: entry.kind,\n\t\t\t\tmethod: entry.method,\n\t\t\t\tpath: entry.path,\n\t\t\t\tworkflowSlug: entry.workflowSlug,\n\t\t\t\tworkflowName: entry.workflowName,\n\t\t\t\tdescription: entry.description,\n\t\t\t\tsubscribable: entry.subscribable,\n\t\t\t\tmoduleFile: entry.moduleFile,\n\t\t\t\trequestSchema: schemaToJson(entry.request),\n\t\t\t\tresponseSchema: schemaToJson(entry.response)\n\t\t\t};\n\t\t\tcase \"trigger-webhook\": return {\n\t\t\t\tkind: entry.kind,\n\t\t\t\tmethod: entry.method,\n\t\t\t\tpath: entry.path,\n\t\t\t\tattachmentIds: entry.attachmentIds,\n\t\t\t\tmoduleFile: entry.moduleFile,\n\t\t\t\trequestSchema: schemaToJson(entry.request),\n\t\t\t\tattachmentSchemas: Object.fromEntries(Object.entries(entry.attachmentSchemas).map(([attachmentKey, schemas]) => [attachmentKey, {\n\t\t\t\t\trequestSchema: schemaToJson(schemas.request),\n\t\t\t\t\t...schemas.filter ? { filterSchema: schemaToJson(schemas.filter) } : {}\n\t\t\t\t}])),\n\t\t\t\tresponseSchema: schemaToJson(entry.response)\n\t\t\t};\n\t\t\tcase \"trigger-poll\": return {\n\t\t\t\tkind: entry.kind,\n\t\t\t\tmethod: entry.method,\n\t\t\t\tpath: entry.path,\n\t\t\t\tattachmentId: entry.attachmentId,\n\t\t\t\tmoduleFile: entry.moduleFile,\n\t\t\t\tschedule: entry.schedule,\n\t\t\t\tresponseSchema: schemaToJson(entry.response)\n\t\t\t};\n\t\t\tcase \"trigger-poll-group\": return {\n\t\t\t\tkind: entry.kind,\n\t\t\t\tmethod: entry.method,\n\t\t\t\tpath: entry.path,\n\t\t\t\tpollId: entry.pollId,\n\t\t\t\tattachmentIds: entry.attachmentIds,\n\t\t\t\tmoduleFile: entry.moduleFile,\n\t\t\t\tschedule: entry.schedule,\n\t\t\t\tresponseSchema: schemaToJson(entry.response)\n\t\t\t};\n\t\t\tcase \"plugin\": return {\n\t\t\t\tkind: entry.kind,\n\t\t\t\tmethod: entry.method,\n\t\t\t\tpath: entry.path,\n\t\t\t\tplugin: entry.plugin\n\t\t\t};\n\t\t\tdefault: return entry;\n\t\t}\n\t});\n}\nfunction toStoredRouteManifest(manifest, options) {\n\treturn {\n\t\tversion: 1,\n\t\tentries: serializeRouteManifest(manifest),\n\t\tskills: options?.skills ?? [],\n\t\tintegrations: options?.integrations\n\t};\n}\nfunction buildStoredRouteManifestFromContext(ctx) {\n\tconst integrations = ctx.options?.integrations ?? ctx.options?.plugins?.map((plugin) => ({\n\t\tkey: plugin.name,\n\t\tmount: plugin.register\n\t})) ?? [];\n\treturn toStoredRouteManifest(ctx.manifest, {\n\t\tintegrations: collectIntegrationKeys(integrations),\n\t\tskills: ctx.skills ?? (ctx.projectRoot ? discoverSkillManifestEntries(ctx.projectRoot) : void 0) ?? []\n\t});\n}\nfunction findWorkflowManifestEntry(manifest, workflowSlug) {\n\treturn manifest.entries.find((entry) => entry.kind === \"workflow\" && entry.workflowSlug === workflowSlug);\n}\nfunction findWebhookManifestEntryByPath(manifest, route) {\n\treturn manifest.entries.find((entry) => entry.kind === \"trigger-webhook\" && entry.path === route);\n}\n//#endregion\n//#region src/persist.ts\nfunction persistStoredRouteManifest(projectRoot, manifest) {\n\tconst path = join(projectRoot, ROUTE_MANIFEST_REL_PATH);\n\tmkdirSync(dirname(path), { recursive: true });\n\twriteFileSync(path, `${JSON.stringify(manifest, null, 2)}\\n`);\n}\n//#endregion\n//#region src/guards/workflow.ts\nconst WORKFLOW = Symbol.for(\"keystroke.workflow\");\nfunction isManifestWorkflow(value) {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tif (!(WORKFLOW in value) || value[WORKFLOW] !== true) return false;\n\tconst workflow = value;\n\treturn typeof workflow.slug === \"string\" && workflow.slug.trim().length > 0 && workflow.input instanceof Object && \"safeParse\" in workflow.input && workflow.output instanceof Object && \"safeParse\" in workflow.output;\n}\nfunction validateManifestWorkflow(value, filePath) {\n\tif (!isManifestWorkflow(value)) throw new Error(`${filePath} must default-export defineWorkflow(...)`);\n\treturn value;\n}\n//#endregion\n//#region src/guards/trigger.ts\nconst TRIGGER_ATTACHMENT = Symbol.for(\"keystroke.triggerAttachment\");\nconst zodSchema = z.custom((value) => value instanceof z.ZodType, \"must be a Zod schema\");\nconst cronScheduleSchema = z.string().trim().min(1, \"cron schedule must be a non-empty string\");\nconst workflowSchema = z.custom((value) => isManifestWorkflow(value), \"must be defineWorkflow(...)\");\nconst agentSchema = z.custom((value) => typeof value === \"object\" && value !== null && typeof value.slug === \"string\" && value.slug.trim().length > 0 && typeof value.prompt === \"function\", \"must be defineAgent(...)\");\nconst promptSchema = z.union([z.string(), z.function()]);\nconst baseSourceShape = {\n\tkey: z.string().trim().min(1),\n\tattach: z.function()\n};\nconst webhookSourceSchema = z.object({\n\tkind: z.literal(\"webhook\"),\n\t...baseSourceShape,\n\tendpoint: z.string().min(1),\n\trequest: zodSchema,\n\tfilter: zodSchema.optional(),\n\tpasses: z.function()\n});\nconst cronSourceSchema = z.object({\n\tkind: z.literal(\"cron\"),\n\t...baseSourceShape,\n\tschedule: cronScheduleSchema\n});\nconst pollSourceSchema = z.object({\n\tkind: z.literal(\"poll\"),\n\t...baseSourceShape,\n\tid: z.string().optional(),\n\tschedule: cronScheduleSchema,\n\trun: z.function(),\n\tfilters: z.array(z.function()),\n\tpasses: z.function()\n});\nconst triggerSourceSchema = z.discriminatedUnion(\"kind\", [\n\twebhookSourceSchema,\n\tcronSourceSchema,\n\tpollSourceSchema\n]);\nconst workflowAttachmentSchema = z.object({\n\tkey: z.string().trim().min(1),\n\tsource: triggerSourceSchema,\n\ttarget: z.literal(\"workflow\"),\n\tworkflow: workflowSchema,\n\ttransform: z.function().optional()\n});\nconst agentAttachmentSchema = z.object({\n\tkey: z.string().trim().min(1),\n\tsource: triggerSourceSchema,\n\ttarget: z.literal(\"agent\"),\n\tagent: agentSchema,\n\tprompt: promptSchema\n});\nconst triggerAttachmentCoreSchema = z.discriminatedUnion(\"target\", [workflowAttachmentSchema, agentAttachmentSchema]);\nfunction isManifestTriggerAttachment(value) {\n\tif (typeof value !== \"object\" || value === null) return false;\n\tif (!(TRIGGER_ATTACHMENT in value) || value[TRIGGER_ATTACHMENT] !== true) return false;\n\treturn triggerAttachmentCoreSchema.safeParse(value).success;\n}\nfunction validateManifestTriggerAttachment(value, filePath) {\n\tif (!isManifestTriggerAttachment(value)) throw new Error(`${filePath} must default-export a trigger attachment from .attach({ workflow }) or .attach({ agent, prompt })`);\n\treturn value;\n}\n//#endregion\n//#region src/triggers/discover.ts\nfunction shouldDiscoverTriggerFile(triggersDir, filePath) {\n\treturn !relative(triggersDir, filePath).split(sep).includes(\"sources\");\n}\nasync function discoverTriggerAttachments(triggersDir, options) {\n\tconst files = await discoverModuleFileEntries(triggersDir, {\n\t\tnestedEntry: \"trigger\",\n\t\tduplicateLabel: \"trigger module file\",\n\t\tshouldDiscoverFile: (filePath) => shouldDiscoverTriggerFile(triggersDir, filePath)\n\t});\n\tconst attachments = [];\n\tfor (const { filePath, moduleFile } of files) {\n\t\tconst attachment = await importTriggerAttachment(filePath, options);\n\t\tattachments.push({\n\t\t\tkey: attachment.key,\n\t\t\tfilePath,\n\t\t\tmoduleFile,\n\t\t\tattachment\n\t\t});\n\t}\n\treturn attachments;\n}\nfunction validateImportedTriggerAttachment(def, filePath) {\n\treturn validateManifestTriggerAttachment(def, filePath);\n}\nasync function importTriggerAttachment(filePath, options) {\n\tconst href = pathToFileURL(filePath).href;\n\treturn validateImportedTriggerAttachment((await (options?.reload ? import(`${href}?keystroke=${Date.now()}`) : import(href))).default, filePath);\n}\n//#endregion\n//#region src/triggers/poll/groups.ts\nfunction pollGroupId(discovered) {\n\tconst source = discovered.attachment.source;\n\tif (source.kind !== \"poll\") throw new Error(`Attachment \"${discovered.key}\" is not a poll trigger`);\n\treturn source.id ?? source.key;\n}\nfunction buildPollGroups(attachments) {\n\tconst byId = /* @__PURE__ */ new Map();\n\tfor (const discovered of attachments) {\n\t\tif (discovered.attachment.source.kind !== \"poll\") continue;\n\t\tconst id = pollGroupId(discovered);\n\t\tconst group = byId.get(id) ?? [];\n\t\tgroup.push(discovered);\n\t\tbyId.set(id, group);\n\t}\n\treturn [...byId.entries()].map(([id, groupAttachments]) => ({\n\t\tid,\n\t\tattachments: groupAttachments\n\t}));\n}\nfunction validatePollGroups(groups) {\n\tfor (const group of groups) {\n\t\tif (group.attachments.length <= 1) continue;\n\t\tif (new Set(group.attachments.map((discovered) => {\n\t\t\tconst source = discovered.attachment.source;\n\t\t\tif (source.kind !== \"poll\") throw new Error(`Poll group \"${group.id}\" has non-poll attachment ${discovered.key}`);\n\t\t\treturn source.schedule;\n\t\t})).size > 1) {\n\t\t\tconst keys = group.attachments.map((discovered) => discovered.key).join(\", \");\n\t\t\tthrow new Error(`Poll group \"${group.id}\" has attachments with different schedules (${keys})`);\n\t\t}\n\t}\n}\nfunction matchesPollRunTarget(attachmentKey, workflowKey, target) {\n\tif (!target?.workflows?.length && !target?.attachments?.length) return true;\n\tif (target.attachments?.length && !target.attachments.includes(attachmentKey)) return false;\n\tif (target.workflows?.length && !target.workflows.includes(workflowKey)) return false;\n\treturn true;\n}\n//#endregion\n//#region src/triggers/webhook/build-webhook-bindings.ts\nfunction buildWebhookBindingsByRoute(attachments, handlerOptionsFor) {\n\tconst webhookBindingsByRoute = /* @__PURE__ */ new Map();\n\tfor (const discovered of attachments) {\n\t\tconst source = discovered.attachment.source;\n\t\tif (source.kind !== \"webhook\") continue;\n\t\tconst route = webhookRouteFromEndpoint(source.endpoint);\n\t\tconst bindings = webhookBindingsByRoute.get(route) ?? [];\n\t\tbindings.push({\n\t\t\tdiscovered,\n\t\t\toptions: handlerOptionsFor(discovered.key)\n\t\t});\n\t\twebhookBindingsByRoute.set(route, bindings);\n\t}\n\treturn webhookBindingsByRoute;\n}\n//#endregion\n//#region src/triggers/webhook/webhook-schemas.ts\nfunction webhookSchemaEntriesFromBindings(bindings) {\n\treturn bindings.flatMap((binding) => {\n\t\tconst source = binding.discovered.attachment.source;\n\t\tif (source.kind !== \"webhook\") return [];\n\t\treturn [{\n\t\t\tattachmentKey: binding.discovered.key,\n\t\t\trequest: source.request,\n\t\t\t...source.filter ? { filter: source.filter } : {}\n\t\t}];\n\t});\n}\nfunction webhookAttachmentSchemasFromBindings(bindings) {\n\treturn webhookSchemaEntriesFromBindings(bindings).map((entry) => ({\n\t\tattachmentKey: entry.attachmentKey,\n\t\trequestSchema: schemaToJson(entry.request),\n\t\t...entry.filter ? { filterSchema: schemaToJson(entry.filter) } : {}\n\t}));\n}\nfunction webhookMatchSchemaForBindings(bindings) {\n\tconst schemas = bindings.flatMap((binding) => {\n\t\tconst source = binding.discovered.attachment.source;\n\t\treturn source.kind === \"webhook\" ? [source.request] : [];\n\t});\n\tif (schemas.length === 0) throw new Error(\"Webhook bindings require at least one webhook source\");\n\tif (schemas.length === 1) return schemas[0];\n\treturn z.union(schemas);\n}\nfunction webhookManifestAttachmentSchemasFromBindings(bindings) {\n\treturn Object.fromEntries(webhookSchemaEntriesFromBindings(bindings).map((entry) => [entry.attachmentKey, {\n\t\trequest: entry.request,\n\t\t...entry.filter ? { filter: entry.filter } : {}\n\t}]));\n}\n//#endregion\n//#region src/workflows/discover.ts\nasync function discoverWorkflowEntries(workflowsDir, options) {\n\tconst files = await discoverModuleFileEntries(workflowsDir, {\n\t\tnestedEntry: \"workflow\",\n\t\tduplicateLabel: \"workflow module file\"\n\t});\n\tconst entries = [];\n\tfor (const { filePath, moduleFile } of files) {\n\t\tconst definition = await importWorkflowDefinition(filePath, options);\n\t\tentries.push({\n\t\t\tkey: definition.slug,\n\t\t\troute: workflowRouteFromKey(definition.slug),\n\t\t\tfilePath,\n\t\t\tmoduleFile\n\t\t});\n\t}\n\treturn entries;\n}\nfunction validateImportedWorkflowDefinition(def, filePath) {\n\treturn validateManifestWorkflow(def, filePath);\n}\nasync function importWorkflowDefinition(filePath, options) {\n\tconst href = pathToFileURL(filePath).href;\n\treturn validateImportedWorkflowDefinition((await (options?.reload ? import(`${href}?keystroke=${Date.now()}`) : import(href))).default, filePath);\n}\nasync function discoverWorkflows(workflowsDir, options) {\n\tconst entries = await discoverWorkflowEntries(workflowsDir, options);\n\tconst workflows = [];\n\tfor (const entry of entries) {\n\t\tconst definition = await importWorkflowDefinition(entry.filePath, options);\n\t\tworkflows.push({\n\t\t\tkey: definition.slug,\n\t\t\troute: workflowRouteFromKey(definition.slug),\n\t\t\tfilePath: entry.filePath,\n\t\t\tdefinition\n\t\t});\n\t}\n\treturn workflows;\n}\n//#endregion\n//#region src/build-stored-manifest.ts\nfunction resolveDistModuleDirs(projectRoot) {\n\tconst distBase = join(projectRoot, \"dist\");\n\tif (!existsSync(distBase)) throw new Error(`Build output missing at ${distBase}. Run keystroke build before emitting the route manifest.`);\n\treturn {\n\t\tagentsDir: join(distBase, \"agents\"),\n\t\tworkflowsDir: join(distBase, \"workflows\"),\n\t\ttriggersDir: join(distBase, \"triggers\")\n\t};\n}\nfunction toPosix(path) {\n\treturn path.split(sep).join(\"/\");\n}\n/**\n* Resolve manifest moduleFile values to project-root-relative source paths.\n*\n* Discovery runs over compiled `dist/` modules, so the raw moduleFile is a\n* dist-relative `.mjs` path. Dist entries are named by their source entry id\n* (`team/escalation.mjs` ← `src/agents/team/escalation/agent.ts`), so walking\n* the matching source dir by the same id rules recovers the source path. Falls\n* back to the dist-relative value when no source file matches (e.g. building\n* a dist-only artifact with no `src/`).\n*/\nvar SourceModuleFileResolver = class {\n\tprojectRoot;\n\tmapsByKind = /* @__PURE__ */ new Map();\n\tconstructor(projectRoot) {\n\t\tthis.projectRoot = projectRoot;\n\t}\n\tasync sourceMapFor(kindDir, nestedEntry) {\n\t\tconst existing = this.mapsByKind.get(kindDir);\n\t\tif (existing) return existing;\n\t\tconst map = /* @__PURE__ */ new Map();\n\t\tconst sourceDir = join(this.projectRoot, \"src\", kindDir);\n\t\tfor (const filePath of await walkTypeScriptFiles(sourceDir)) {\n\t\t\tconst id = entryIdFromFile(sourceDir, filePath, { nestedEntry });\n\t\t\tif (id) map.set(id, toPosix(relative(this.projectRoot, filePath)));\n\t\t}\n\t\tthis.mapsByKind.set(kindDir, map);\n\t\treturn map;\n\t}\n\tasync resolve(kindDir, nestedEntry, distDir, distFilePath) {\n\t\tconst fallback = toPosix(relative(distDir, distFilePath));\n\t\tconst id = entryIdFromFile(distDir, distFilePath, { nestedEntry });\n\t\tif (!id) return fallback;\n\t\treturn (await this.sourceMapFor(kindDir, nestedEntry)).get(id) ?? fallback;\n\t}\n};\n/** Build a stored route manifest from compiled dist/ modules without starting a server. */\nasync function buildStoredRouteManifestForProject(projectRoot, options) {\n\tconst previousRoot = process.env.KEYSTROKE_ROOT;\n\tprocess.env.KEYSTROKE_ROOT = projectRoot;\n\tconst reload = options?.reloadModules ? { reload: true } : void 0;\n\ttry {\n\t\tconst dirs = resolveDistModuleDirs(projectRoot);\n\t\tconst sourcePaths = new SourceModuleFileResolver(projectRoot);\n\t\tconst manifest = [{\n\t\t\tkind: \"health\",\n\t\t\tmethod: \"GET\",\n\t\t\tpath: \"/health\"\n\t\t}];\n\t\tconst agentEntries = await discoverAgentEntries(dirs.agentsDir, reload);\n\t\tfor (const entry of agentEntries) {\n\t\t\tconst agent = await importAgentDefinition(entry.filePath, reload);\n\t\t\tconst moduleFile = await sourcePaths.resolve(\"agents\", \"agent\", dirs.agentsDir, entry.filePath);\n\t\t\tmanifest.push({\n\t\t\t\tkind: \"agent\",\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tpath: entry.route,\n\t\t\t\tagentSlug: agent.slug,\n\t\t\t\tmoduleFile,\n\t\t\t\tname: agent.name,\n\t\t\t\tdescription: agent.description,\n\t\t\t\tmodel: agent.model,\n\t\t\t\tsystemPrompt: agent.systemPrompt,\n\t\t\t\ttoolCount: agent.tools?.length ?? 0,\n\t\t\t\tcredentialCount: countAgentCredentials(agent),\n\t\t\t\trequest: PromptInputSchema,\n\t\t\t\tresponse: PromptResponseSchema\n\t\t\t});\n\t\t\tmanifest.push({\n\t\t\t\tkind: \"agent-sessions-list\",\n\t\t\t\tmethod: \"GET\",\n\t\t\t\tpath: agentSessionsListPath(entry.route),\n\t\t\t\tagentSlug: entry.key,\n\t\t\t\tmoduleFile\n\t\t\t});\n\t\t\tmanifest.push({\n\t\t\t\tkind: \"agent-session-detail\",\n\t\t\t\tmethod: \"GET\",\n\t\t\t\tpath: agentSessionDetailPath(entry.route),\n\t\t\t\tagentSlug: entry.key,\n\t\t\t\tmoduleFile\n\t\t\t});\n\t\t}\n\t\tconst workflows = await discoverWorkflows(dirs.workflowsDir, reload);\n\t\tfor (const workflow of workflows) {\n\t\t\tconst route = workflowRouteFromKey(workflow.key);\n\t\t\tconst moduleFile = await sourcePaths.resolve(\"workflows\", \"workflow\", dirs.workflowsDir, workflow.filePath);\n\t\t\tmanifest.push({\n\t\t\t\tkind: \"workflow\",\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tpath: route,\n\t\t\t\tworkflowSlug: workflow.definition.slug,\n\t\t\t\tworkflowName: workflow.definition.name,\n\t\t\t\tdescription: workflow.definition.description,\n\t\t\t\tsubscribable: workflow.definition.subscription?.mode === \"subscribable\",\n\t\t\t\tmoduleFile,\n\t\t\t\trequest: workflow.definition.input,\n\t\t\t\tresponse: workflow.definition.output\n\t\t\t});\n\t\t\tmanifest.push({\n\t\t\t\tkind: \"workflow-runs-list\",\n\t\t\t\tmethod: \"GET\",\n\t\t\t\tpath: workflowRunsListPath(route),\n\t\t\t\tworkflowSlug: workflow.definition.slug,\n\t\t\t\tworkflowName: workflow.definition.name,\n\t\t\t\tmoduleFile\n\t\t\t});\n\t\t\tmanifest.push({\n\t\t\t\tkind: \"workflow-run-detail\",\n\t\t\t\tmethod: \"GET\",\n\t\t\t\tpath: workflowRunDetailPath(route),\n\t\t\t\tworkflowSlug: workflow.definition.slug,\n\t\t\t\tworkflowName: workflow.definition.name,\n\t\t\t\tmoduleFile\n\t\t\t});\n\t\t}\n\t\tconst attachments = await discoverTriggerAttachments(dirs.triggersDir, reload);\n\t\tconst discoveredByKey = new Map(attachments.map((attachment) => [attachment.key, attachment]));\n\t\tconst pollGroups = buildPollGroups(attachments);\n\t\tfor (const discovered of discoveredByKey.values()) {\n\t\t\tconst source = discovered.attachment.source;\n\t\t\tconst moduleFile = await sourcePaths.resolve(\"triggers\", \"trigger\", dirs.triggersDir, discovered.filePath);\n\t\t\tif (source.kind === \"cron\") {\n\t\t\t\tmanifest.push({\n\t\t\t\t\tkind: \"cron-schedule\",\n\t\t\t\t\tattachmentId: discovered.key,\n\t\t\t\t\tmoduleFile,\n\t\t\t\t\tschedule: source.schedule\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (source.kind === \"poll\") {\n\t\t\t\tconst route = pollRouteFromKey(source.key);\n\t\t\t\tmanifest.push({\n\t\t\t\t\tkind: \"trigger-poll\",\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tpath: route,\n\t\t\t\t\tattachmentId: discovered.key,\n\t\t\t\t\tmoduleFile,\n\t\t\t\t\tschedule: source.schedule,\n\t\t\t\t\tresponse: PromptResponseSchema\n\t\t\t\t});\n\t\t\t\tmanifest.push({\n\t\t\t\t\tkind: \"trigger-runs-list\",\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tpath: triggerRunsListPath(discovered.key),\n\t\t\t\t\tattachmentId: discovered.key,\n\t\t\t\t\tmoduleFile\n\t\t\t\t});\n\t\t\t\tmanifest.push({\n\t\t\t\t\tkind: \"trigger-run-detail\",\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tpath: triggerRunDetailPath(discovered.key),\n\t\t\t\t\tattachmentId: discovered.key,\n\t\t\t\t\tmoduleFile\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (source.kind === \"webhook\") {\n\t\t\t\tconst route = webhookRouteFromEndpoint(source.endpoint);\n\t\t\t\tconst bindings = buildWebhookBindingsByRoute(discoveredByKey.values(), () => ({\n\t\t\t\t\texecution: { attachmentKey: discovered.key },\n\t\t\t\t\tattachmentKey: discovered.key\n\t\t\t\t})).get(route) ?? [{\n\t\t\t\t\tdiscovered,\n\t\t\t\t\toptions: { attachmentKey: discovered.key }\n\t\t\t\t}];\n\t\t\t\tmanifest.push({\n\t\t\t\t\tkind: \"trigger-webhook\",\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tpath: route,\n\t\t\t\t\tattachmentIds: bindings.map(({ discovered: row }) => row.key),\n\t\t\t\t\tmoduleFile,\n\t\t\t\t\trequest: webhookMatchSchemaForBindings(bindings),\n\t\t\t\t\tattachmentSchemas: webhookManifestAttachmentSchemasFromBindings(bindings),\n\t\t\t\t\tresponse: PromptResponseSchema\n\t\t\t\t});\n\t\t\t\tfor (const { discovered: row } of bindings) {\n\t\t\t\t\tconst rowModuleFile = await sourcePaths.resolve(\"triggers\", \"trigger\", dirs.triggersDir, row.filePath);\n\t\t\t\t\tmanifest.push({\n\t\t\t\t\t\tkind: \"trigger-runs-list\",\n\t\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\t\tpath: triggerRunsListPath(row.key),\n\t\t\t\t\t\tattachmentId: row.key,\n\t\t\t\t\t\tmoduleFile: rowModuleFile\n\t\t\t\t\t});\n\t\t\t\t\tmanifest.push({\n\t\t\t\t\t\tkind: \"trigger-run-detail\",\n\t\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\t\tpath: triggerRunDetailPath(row.key),\n\t\t\t\t\t\tattachmentId: row.key,\n\t\t\t\t\t\tmoduleFile: rowModuleFile\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const group of pollGroups) {\n\t\t\tif (group.attachments.length <= 1) continue;\n\t\t\tconst first = group.attachments[0];\n\t\t\tconst source = first.attachment.source;\n\t\t\tmanifest.push({\n\t\t\t\tkind: \"trigger-poll-group\",\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tpath: pollGroupRouteFromId(group.id),\n\t\t\t\tpollId: group.id,\n\t\t\t\tattachmentIds: group.attachments.map((attachment) => attachment.key),\n\t\t\t\tmoduleFile: await sourcePaths.resolve(\"triggers\", \"trigger\", dirs.triggersDir, first.filePath),\n\t\t\t\tschedule: source.kind === \"poll\" ? source.schedule : \"\",\n\t\t\t\tresponse: PromptResponseSchema\n\t\t\t});\n\t\t}\n\t\treturn buildStoredRouteManifestFromContext({\n\t\t\tmanifest,\n\t\t\toptions: {},\n\t\t\tprojectRoot,\n\t\t\tskills: discoverSkillManifestEntries(projectRoot)\n\t\t});\n\t} finally {\n\t\tif (previousRoot === void 0) delete process.env.KEYSTROKE_ROOT;\n\t\telse process.env.KEYSTROKE_ROOT = previousRoot;\n\t}\n}\n/** Write `dist/.keystroke/route-manifest.json` for the project. */\nasync function emitStoredRouteManifestForProject(projectRoot) {\n\tpersistStoredRouteManifest(projectRoot, await buildStoredRouteManifestForProject(projectRoot));\n}\n//#endregion\n//#region src/openapi/manifest.ts\nfunction schedulesFromManifest(manifest) {\n\tconst schedules = [];\n\tfor (const entry of manifest) {\n\t\tif (entry.kind === \"cron-schedule\") {\n\t\t\tschedules.push({\n\t\t\t\tattachmentId: entry.attachmentId,\n\t\t\t\ttype: \"cron\",\n\t\t\t\tschedule: entry.schedule\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tif (entry.kind === \"trigger-poll\") schedules.push({\n\t\t\tattachmentId: entry.attachmentId,\n\t\t\ttype: \"poll\",\n\t\t\tschedule: entry.schedule\n\t\t});\n\t}\n\treturn schedules;\n}\n//#endregion\n//#region src/load-route-manifest.ts\nfunction routeManifestPathForProjectRoot(projectRoot) {\n\treturn join(projectRoot, ROUTE_MANIFEST_REL_PATH);\n}\nfunction readRouteManifest(projectRoot) {\n\tconst path = routeManifestPathForProjectRoot(projectRoot);\n\tif (!existsSync(path)) throw new Error(`${ROUTE_MANIFEST_REL_PATH} not found — start the project server once to emit the manifest`);\n\tconst raw = readFileSync(path, \"utf8\");\n\treturn parseStoredRouteManifest(JSON.parse(raw));\n}\n//#endregion\nexport { agentRouteFromKey, agentSessionDetailPath, agentSessionsListPath, buildPollGroups, buildStoredRouteManifestForProject, buildStoredRouteManifestFromContext, buildWebhookBindingsByRoute, countAgentCredentials, discoverAgentEntries, discoverEntries, discoverModuleFileEntries, discoverSkillManifestEntries, discoverTriggerAttachments, discoverWorkflowEntries, discoverWorkflows, emitStoredRouteManifestForProject, entryIdFromFile, findWebhookManifestEntryByPath, findWorkflowManifestEntry, importAgentDefinition, importTriggerAttachment, importWorkflowDefinition, matchesPollRunTarget, moduleFileKeyFromPath, persistStoredRouteManifest, pollGroupId, pollGroupRouteFromId, pollRouteFromKey, readRouteManifest, routeManifestPathForProjectRoot, schedulesFromManifest, schemaToJson, serializeRouteManifest, toStoredRouteManifest, triggerRunDetailPath, triggerRunsListPath, validateImportedTriggerAttachment, validateImportedWorkflowDefinition, validatePollGroups, validateUniqueModuleKeys, walkTypeScriptFiles, webhookAttachmentSchemasFromBindings, webhookManifestAttachmentSchemasFromBindings, webhookMatchSchemaForBindings, webhookRouteFromEndpoint, workflowRouteFromKey, workflowRunDetailPath, workflowRunsListPath };\n\n//# sourceMappingURL=index.mjs.map"],"mappings":"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"}
|