veryfront 0.1.995 → 0.1.996
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/esm/cli/commands/schedule/handler.d.ts.map +1 -1
- package/esm/cli/commands/schedule/handler.js +3 -1
- package/esm/cli/commands/task/command.d.ts.map +1 -1
- package/esm/cli/commands/task/command.js +18 -9
- package/esm/cli/commands/webhook/handler.d.ts.map +1 -1
- package/esm/cli/commands/webhook/handler.js +3 -1
- package/esm/cli/commands/workflow/command.d.ts.map +1 -1
- package/esm/cli/commands/workflow/command.js +5 -1
- package/esm/cli/shared/project-source-context.d.ts +1 -0
- package/esm/cli/shared/project-source-context.d.ts.map +1 -1
- package/esm/cli/shared/project-source-context.js +6 -1
- package/esm/deno.js +1 -1
- package/esm/src/agent/project/agent-runtime.d.ts +5 -0
- package/esm/src/agent/project/agent-runtime.d.ts.map +1 -1
- package/esm/src/agent/project/agent-runtime.js +3 -1
- package/esm/src/channels/control-plane.d.ts +1 -1
- package/esm/src/channels/control-plane.d.ts.map +1 -1
- package/esm/src/discovery/discovery-engine.d.ts.map +1 -1
- package/esm/src/discovery/discovery-engine.js +23 -31
- package/esm/src/discovery/handlers/task-handler.d.ts.map +1 -1
- package/esm/src/discovery/handlers/task-handler.js +4 -1
- package/esm/src/discovery/project-discovery-config.d.ts.map +1 -1
- package/esm/src/discovery/project-discovery-config.js +5 -1
- package/esm/src/server/handlers/request/api/project-discovery.d.ts +2 -1
- package/esm/src/server/handlers/request/api/project-discovery.d.ts.map +1 -1
- package/esm/src/server/handlers/request/api/project-discovery.js +3 -1
- package/esm/src/server/handlers/request/project-run-execute.handler.d.ts +2 -8
- package/esm/src/server/handlers/request/project-run-execute.handler.d.ts.map +1 -1
- package/esm/src/server/handlers/request/project-run-execute.handler.js +3 -8
- package/esm/src/task/project-runtime.d.ts +19 -0
- package/esm/src/task/project-runtime.d.ts.map +1 -0
- package/esm/src/task/project-runtime.js +42 -0
- package/esm/src/task/runner.d.ts +10 -2
- package/esm/src/task/runner.d.ts.map +1 -1
- package/esm/src/trigger/local-runner.d.ts +1 -0
- package/esm/src/trigger/local-runner.d.ts.map +1 -1
- package/esm/src/trigger/local-runner.js +11 -17
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/esm/src/workflow/worker/dynamic-run-entrypoint.d.ts.map +1 -1
- package/esm/src/workflow/worker/dynamic-run-entrypoint.js +2 -0
- package/package.json +1 -1
- package/esm/src/task/discovery.d.ts +0 -79
- package/esm/src/task/discovery.d.ts.map +0 -1
- package/esm/src/task/discovery.js +0 -184
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/schedule/handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AA4BxD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/schedule/handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AA4BxD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC3E"}
|
|
@@ -23,7 +23,8 @@ export async function handleScheduleCommand(args) {
|
|
|
23
23
|
const opts = parseArgsOrThrow(parseScheduleArgs, "schedule", args);
|
|
24
24
|
const projectDir = dntShim.Deno.cwd();
|
|
25
25
|
const input = opts.input ? await readJsonFile(opts.input, "--input JSON file") : undefined;
|
|
26
|
-
await withProjectSourceContext(projectDir, async (
|
|
26
|
+
await withProjectSourceContext(projectDir, async (context) => {
|
|
27
|
+
const { adapter, config, configCacheKey, projectId } = context;
|
|
27
28
|
const result = await discoverSchedules({ projectDir, adapter, config });
|
|
28
29
|
if (result.errors.length > 0) {
|
|
29
30
|
throw new Error(`Schedule discovery failed: ${result.errors[0]?.message}`);
|
|
@@ -36,6 +37,7 @@ export async function handleScheduleCommand(args) {
|
|
|
36
37
|
projectDir,
|
|
37
38
|
adapter,
|
|
38
39
|
config,
|
|
40
|
+
cacheKey: configCacheKey,
|
|
39
41
|
projectId,
|
|
40
42
|
target: schedule.target,
|
|
41
43
|
input: input ?? schedule.input ?? {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/task/command.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,WAAW,WAAY,SAAQ,QAAQ;CAAG;
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/task/command.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,WAAW,WAAY,SAAQ,QAAQ;CAAG;AAahD,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiGrE"}
|
|
@@ -10,8 +10,15 @@ import { exitProcess } from "../../utils/index.js";
|
|
|
10
10
|
import { withProjectSourceContext } from "../../shared/project-source-context.js";
|
|
11
11
|
import { sanitizeRunOutputForLogging } from "../../utils/sanitize-run-output.js";
|
|
12
12
|
import { writeRunResultIfConfigured } from "../../utils/write-run-result.js";
|
|
13
|
+
function logRuntimeDiscoveryWarnings(errors, debug) {
|
|
14
|
+
if (errors.length === 0 || !debug)
|
|
15
|
+
return;
|
|
16
|
+
for (const err of errors) {
|
|
17
|
+
cliLogger.warn(` Warning: ${err.file}: ${err.error.message}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
13
20
|
export async function taskCommand(options) {
|
|
14
|
-
const {
|
|
21
|
+
const { discoverProjectTaskRuntime, findProjectRuntimeTask, listProjectRuntimeTasks } = await import("../../../src/task/project-runtime.js");
|
|
15
22
|
const { runTask } = await import("../../../src/task/runner.js");
|
|
16
23
|
const taskName = options.name;
|
|
17
24
|
if (!taskName) {
|
|
@@ -20,27 +27,29 @@ export async function taskCommand(options) {
|
|
|
20
27
|
return;
|
|
21
28
|
}
|
|
22
29
|
const projectDir = dntShim.Deno.cwd();
|
|
23
|
-
await withProjectSourceContext(projectDir, async ({ adapter, config, projectId, proxyContext }) => {
|
|
30
|
+
await withProjectSourceContext(projectDir, async ({ adapter, config, configCacheKey, projectId, proxyContext }) => {
|
|
24
31
|
const sourceLabel = proxyContext?.branchRef
|
|
25
32
|
? `branch ${proxyContext.branchRef}`
|
|
26
33
|
: proxyContext
|
|
27
34
|
? "main"
|
|
28
35
|
: `${projectDir}/tasks/...`;
|
|
29
36
|
cliLogger.info(`Discovering tasks in ${sourceLabel}`);
|
|
30
|
-
const
|
|
37
|
+
const discovery = await discoverProjectTaskRuntime({
|
|
31
38
|
projectDir,
|
|
32
39
|
adapter,
|
|
33
40
|
config,
|
|
41
|
+
fsAdapter: adapter.fs,
|
|
42
|
+
cacheKey: configCacheKey,
|
|
34
43
|
debug: options.debug,
|
|
35
44
|
});
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
cliLogger.warn(` Warning: ${err.filePath}: ${err.error}`);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
const task = tasks.find((t) => t.id === taskName);
|
|
45
|
+
logRuntimeDiscoveryWarnings(discovery.errors, options.debug);
|
|
46
|
+
const task = findProjectRuntimeTask(discovery, taskName);
|
|
42
47
|
if (!task) {
|
|
43
48
|
cliLogger.error(`Task "${taskName}" not found.`);
|
|
49
|
+
if (discovery.errors.length > 0 && !options.debug) {
|
|
50
|
+
cliLogger.warn("Some project files could not be loaded. Re-run with --debug for details.");
|
|
51
|
+
}
|
|
52
|
+
const tasks = listProjectRuntimeTasks(discovery);
|
|
44
53
|
if (tasks.length > 0) {
|
|
45
54
|
cliLogger.info("Available tasks:");
|
|
46
55
|
for (const t of tasks) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/webhook/handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AA4BxD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/webhook/handler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AA4BxD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC1E"}
|
|
@@ -23,7 +23,8 @@ export async function handleWebhookCommand(args) {
|
|
|
23
23
|
const opts = parseArgsOrThrow(parseWebhookArgs, "webhook", args);
|
|
24
24
|
const projectDir = dntShim.Deno.cwd();
|
|
25
25
|
const payload = await readJsonFile(opts.payload, "--payload JSON file");
|
|
26
|
-
await withProjectSourceContext(projectDir, async (
|
|
26
|
+
await withProjectSourceContext(projectDir, async (context) => {
|
|
27
|
+
const { adapter, config, configCacheKey, projectId } = context;
|
|
27
28
|
const result = await discoverWebhooks({ projectDir, adapter, config });
|
|
28
29
|
if (result.errors.length > 0) {
|
|
29
30
|
throw new Error(`Webhook discovery failed: ${result.errors[0]?.message}`);
|
|
@@ -36,6 +37,7 @@ export async function handleWebhookCommand(args) {
|
|
|
36
37
|
projectDir,
|
|
37
38
|
adapter,
|
|
38
39
|
config,
|
|
40
|
+
cacheKey: configCacheKey,
|
|
39
41
|
projectId,
|
|
40
42
|
target: webhook.target,
|
|
41
43
|
input: payload,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/workflow/command.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAO1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAKjD,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,2BAA2B;IACnC,2BAA2B,CAAC,EAAE,OAAO,2BAA2B,CAAC;CAClE;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,sBAAsB,EAAE,GAC/B,MAAM,EAAE,CAUV;AAuFD,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7E;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,eAAe,EACxB,YAAY,GAAE,2BAAgC,GAC7C,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/workflow/command.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAO1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAKjD,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,2BAA2B;IACnC,2BAA2B,CAAC,EAAE,OAAO,2BAA2B,CAAC;CAClE;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,sBAAsB,EAAE,GAC/B,MAAM,EAAE,CAUV;AAuFD,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7E;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,eAAe,EACxB,YAAY,GAAE,2BAAgC,GAC7C,OAAO,CAAC,IAAI,CAAC,CAkGf"}
|
|
@@ -109,7 +109,8 @@ export async function runWorkflowCommand(options, dependencies = {}) {
|
|
|
109
109
|
const projectDir = options.projectDir ?? dntShim.Deno.cwd();
|
|
110
110
|
const discoverRuntime = dependencies.discoverProjectAgentRuntime ??
|
|
111
111
|
discoverProjectAgentRuntime;
|
|
112
|
-
await withProjectSourceContext(projectDir, async (
|
|
112
|
+
await withProjectSourceContext(projectDir, async (context) => {
|
|
113
|
+
const { adapter, config, configCacheKey, proxyContext } = context;
|
|
113
114
|
const sourceLabel = proxyContext?.branchRef
|
|
114
115
|
? `branch ${proxyContext.branchRef}`
|
|
115
116
|
: proxyContext
|
|
@@ -119,6 +120,9 @@ export async function runWorkflowCommand(options, dependencies = {}) {
|
|
|
119
120
|
const discovery = await discoverRuntime({
|
|
120
121
|
projectDir,
|
|
121
122
|
adapter,
|
|
123
|
+
config,
|
|
124
|
+
fsAdapter: adapter.fs,
|
|
125
|
+
cacheKey: configCacheKey,
|
|
122
126
|
verbose: options.debug,
|
|
123
127
|
});
|
|
124
128
|
const workflows = [...discovery.workflows.values()];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-source-context.d.ts","sourceRoot":"","sources":["../../../src/cli/shared/project-source-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,6BAA6B,CAAC;AAGrC,UAAU,yBAAyB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,yBAAyB,CAAC;CAC1C;AAED,wBAAgB,4BAA4B,IAAI,yBAAyB,GAAG,IAAI,CAkB/E;
|
|
1
|
+
{"version":3,"file":"project-source-context.d.ts","sourceRoot":"","sources":["../../../src/cli/shared/project-source-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,6BAA6B,CAAC;AAGrC,UAAU,yBAAyB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,yBAAyB,CAAC;CAC1C;AAED,wBAAgB,4BAA4B,IAAI,yBAAyB,GAAG,IAAI,CAkB/E;AAiBD,wBAAsB,6BAA6B,CACjD,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,eAAe,2DAMxB;AAED,wBAAsB,wBAAwB,CAAC,CAAC,EAC9C,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,CAAC,OAAO,EAAE,6BAA6B,KAAK,OAAO,CAAC,CAAC,CAAC,GAC1D,OAAO,CAAC,CAAC,CAAC,CA2CZ"}
|
|
@@ -18,9 +18,12 @@ export function getProxyProjectSourceContext() {
|
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
20
|
async function loadProjectConfig(projectDir, adapter, proxyContext) {
|
|
21
|
-
const cacheKey = proxyContext
|
|
21
|
+
const cacheKey = getProjectSourceConfigCacheKey(proxyContext);
|
|
22
22
|
return await getConfig(projectDir, adapter, cacheKey ? { cacheKey } : undefined);
|
|
23
23
|
}
|
|
24
|
+
function getProjectSourceConfigCacheKey(proxyContext) {
|
|
25
|
+
return proxyContext?.projectId ?? proxyContext?.projectSlug;
|
|
26
|
+
}
|
|
24
27
|
export async function applyProjectSourceRuntimeAuth(projectDir, config) {
|
|
25
28
|
return await applyRuntimeAuthContext({
|
|
26
29
|
projectDir,
|
|
@@ -42,6 +45,7 @@ export async function withProjectSourceContext(projectDir, run) {
|
|
|
42
45
|
adapter,
|
|
43
46
|
config,
|
|
44
47
|
projectDir,
|
|
48
|
+
configCacheKey: getProjectSourceConfigCacheKey(proxyContext),
|
|
45
49
|
projectId: proxyContext.projectId,
|
|
46
50
|
proxyContext,
|
|
47
51
|
});
|
|
@@ -55,6 +59,7 @@ export async function withProjectSourceContext(projectDir, run) {
|
|
|
55
59
|
adapter,
|
|
56
60
|
config,
|
|
57
61
|
projectDir,
|
|
62
|
+
configCacheKey: getProjectSourceConfigCacheKey(proxyContext ?? undefined),
|
|
58
63
|
projectId: proxyContext?.projectId,
|
|
59
64
|
proxyContext: proxyContext ?? undefined,
|
|
60
65
|
});
|
package/esm/deno.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { DiscoveryResult } from "../../discovery/types.js";
|
|
2
|
+
import { type VeryfrontConfig } from "../../config/index.js";
|
|
2
3
|
import type { RuntimeAdapter } from "../../platform/adapters/base.js";
|
|
4
|
+
import type { FileSystemAdapter } from "../../platform/adapters/base.js";
|
|
3
5
|
import type { RuntimeAgentMarkdownDefinition } from "../runtime/agent-definition.js";
|
|
4
6
|
import type { Agent } from "../types.js";
|
|
5
7
|
/** Public API contract for project agent runtime agent source. */
|
|
@@ -13,6 +15,9 @@ export type ProjectAgentRuntimeAgentIdCandidates = {
|
|
|
13
15
|
export type DiscoverProjectAgentRuntimeInput = {
|
|
14
16
|
projectDir: string;
|
|
15
17
|
adapter: RuntimeAdapter;
|
|
18
|
+
config?: VeryfrontConfig | null;
|
|
19
|
+
fsAdapter?: FileSystemAdapter;
|
|
20
|
+
cacheKey?: string;
|
|
16
21
|
verbose?: boolean;
|
|
17
22
|
};
|
|
18
23
|
/** Clear project agent runtime registries. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runtime.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/project/agent-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-runtime.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/project/agent-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAOhE,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAIzE,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAC;AAKrF,OAAO,KAAK,EAAE,KAAK,EAAe,MAAM,aAAa,CAAC;AAEtD,kEAAkE;AAClE,MAAM,MAAM,8BAA8B,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAE1E,yEAAyE;AACzE,MAAM,MAAM,oCAAoC,GAAG;IACjD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,wDAAwD;AACxD,MAAM,MAAM,gCAAgC,GAAG;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAuBF,8CAA8C;AAC9C,wBAAgB,kCAAkC,IAAI,IAAI,CAMzD;AAED,6CAA6C;AAC7C,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,eAAe,CAAC,CAiB1B;AAED,4DAA4D;AAC5D,wBAAgB,uCAAuC,CACrD,YAAY,EAAE,KAAK,EACnB,MAAM,EAAE,8BAA8B,GACrC,OAAO,CAOT;AAED,kDAAkD;AAClD,wBAAsB,qCAAqC,CACzD,YAAY,EAAE,KAAK,GAClB,OAAO,CAAC,8BAA8B,CAAC,CA0BzC;AAED,wDAAwD;AACxD,wBAAgB,uCAAuC,CACrD,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,GAAG,IAAI,GAAG,SAAS,GAClE,oCAAoC,CAgBtC;AAED,iEAAiE;AACjE,wBAAgB,4CAA4C,CAC1D,KAAK,EAAE,oCAAoC,GAC1C,MAAM,CAKR;AAED,sDAAsD;AACtD,wBAAgB,uCAAuC,CAAC,KAAK,EAAE;IAC7D,UAAU,EAAE,oCAAoC,CAAC;IACjD,MAAM,EAAE,8BAA8B,CAAC;CACxC,GAAG,MAAM,GAAG,IAAI,CAiBhB"}
|
|
@@ -31,10 +31,12 @@ export function clearProjectAgentRuntimeRegistries() {
|
|
|
31
31
|
/** Discover project agent runtime helper. */
|
|
32
32
|
export async function discoverProjectAgentRuntime(input) {
|
|
33
33
|
clearProjectAgentRuntimeRegistries();
|
|
34
|
-
const config =
|
|
34
|
+
const config = input.config ??
|
|
35
|
+
await getConfig(input.projectDir, input.adapter, input.cacheKey ? { cacheKey: input.cacheKey } : undefined);
|
|
35
36
|
const discoveryOptions = createProjectDiscoveryConfig({
|
|
36
37
|
projectDir: input.projectDir,
|
|
37
38
|
config,
|
|
39
|
+
fsAdapter: input.fsAdapter,
|
|
38
40
|
verbose: input.verbose,
|
|
39
41
|
});
|
|
40
42
|
return await discoverAll(discoveryOptions);
|
|
@@ -264,7 +264,7 @@ export type DispatchClaims = InferSchema<ReturnType<typeof getDispatchClaimsSche
|
|
|
264
264
|
export type ControlPlaneClaims = InferSchema<ReturnType<typeof getControlPlaneClaimsSchema>>;
|
|
265
265
|
/** Public API contract for runtime agent discovery deps. */
|
|
266
266
|
export interface RuntimeAgentDiscoveryDeps {
|
|
267
|
-
ensureProjectDiscovery: (ctx: HandlerContext) => Promise<
|
|
267
|
+
ensureProjectDiscovery: (ctx: HandlerContext) => Promise<unknown>;
|
|
268
268
|
getAgent: (id: string) => Agent | undefined;
|
|
269
269
|
getAllAgentIds: () => string[];
|
|
270
270
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-plane.d.ts","sourceRoot":"","sources":["../../../src/src/channels/control-plane.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"control-plane.d.ts","sourceRoot":"","sources":["../../../src/src/channels/control-plane.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery-engine.d.ts","sourceRoot":"","sources":["../../../src/src/discovery/discovery-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,eAAe,EAEf,eAAe,EAEhB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"discovery-engine.d.ts","sourceRoot":"","sources":["../../../src/src/discovery/discovery-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,eAAe,EAEf,eAAe,EAEhB,MAAM,YAAY,CAAC;AAkKpB;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CA8JnF"}
|
|
@@ -13,7 +13,6 @@ import { findTypeScriptFiles } from "./file-discovery.js";
|
|
|
13
13
|
import { agentHandler, discoverSkills, evalHandler, promptHandler, resourceHandler, scheduleHandler, taskHandler, toolHandler, webhookHandler, workflowHandler, workHandler, } from "./handlers/index.js";
|
|
14
14
|
import { discoverRuntimeAgentMarkdownDefinitions } from "./handlers/runtime-agent-markdown-handler.js";
|
|
15
15
|
import { filenameToId } from "./discovery-utils.js";
|
|
16
|
-
import { join } from "../platform/compat/path/index.js";
|
|
17
16
|
const logger = agentLogger.component("discovery");
|
|
18
17
|
function isIndexModule(file) {
|
|
19
18
|
const normalized = file.replace("file://", "");
|
|
@@ -26,6 +25,11 @@ function compareDiscoveryFiles(a, b) {
|
|
|
26
25
|
return aIsIndex ? 1 : -1;
|
|
27
26
|
return a.localeCompare(b);
|
|
28
27
|
}
|
|
28
|
+
function resolveDiscoveryDir(baseDir, dir) {
|
|
29
|
+
if (baseDir === "")
|
|
30
|
+
return dir;
|
|
31
|
+
return `${baseDir}/${dir}`;
|
|
32
|
+
}
|
|
29
33
|
function collectDiscoveryCandidates(module, handler) {
|
|
30
34
|
const defaultItem = module.default;
|
|
31
35
|
if (handler.validate(defaultItem)) {
|
|
@@ -96,6 +100,11 @@ async function discoverItems(dir, result, context, handler, verbose) {
|
|
|
96
100
|
}
|
|
97
101
|
}
|
|
98
102
|
}
|
|
103
|
+
async function discoverConfiguredItems(dirs, defaultDirs, baseDir, result, context, handler, verbose) {
|
|
104
|
+
for (const dir of dirs ?? defaultDirs) {
|
|
105
|
+
await discoverItems(resolveDiscoveryDir(baseDir, dir), result, context, handler, verbose);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
99
108
|
/**
|
|
100
109
|
* Discover all items in configured directories
|
|
101
110
|
*/
|
|
@@ -121,9 +130,7 @@ export async function discoverAll(config) {
|
|
|
121
130
|
errors: [],
|
|
122
131
|
};
|
|
123
132
|
// Discover tools
|
|
124
|
-
|
|
125
|
-
await discoverItems(`${baseDir}/${dir}`, result, context, toolHandler, config.verbose);
|
|
126
|
-
}
|
|
133
|
+
await discoverConfiguredItems(config.toolDirs, ["tools"], baseDir, result, context, toolHandler, config.verbose);
|
|
127
134
|
// Clear stale skills before any skill registration so deleted/renamed
|
|
128
135
|
// skills are removed. Global skills are discovered BEFORE agents so that
|
|
129
136
|
// directory-agent colocated skills (registered during agent discovery)
|
|
@@ -132,7 +139,7 @@ export async function discoverAll(config) {
|
|
|
132
139
|
skillRegistry.clear();
|
|
133
140
|
// Discover skills (parallel path — markdown-based, not TypeScript import)
|
|
134
141
|
for (const dir of config.skillDirs ?? ["skills"]) {
|
|
135
|
-
const skillResult = await discoverSkills(
|
|
142
|
+
const skillResult = await discoverSkills(resolveDiscoveryDir(baseDir, dir), context, config.verbose);
|
|
136
143
|
for (const [id, skill] of skillResult.skills) {
|
|
137
144
|
if (result.skills.has(id)) {
|
|
138
145
|
logger.warn(`Duplicate skill "${id}" across discovery roots; keeping first registration`);
|
|
@@ -145,40 +152,25 @@ export async function discoverAll(config) {
|
|
|
145
152
|
}
|
|
146
153
|
// Discover agents
|
|
147
154
|
for (const dir of config.agentDirs ?? ["agents"]) {
|
|
148
|
-
|
|
149
|
-
await
|
|
155
|
+
const agentDir = resolveDiscoveryDir(baseDir, dir);
|
|
156
|
+
await discoverItems(agentDir, result, context, agentHandler, config.verbose);
|
|
157
|
+
await discoverRuntimeAgentMarkdownDefinitions(agentDir, result, context);
|
|
150
158
|
}
|
|
151
159
|
// Discover resources
|
|
152
|
-
|
|
153
|
-
await discoverItems(`${baseDir}/${dir}`, result, context, resourceHandler, config.verbose);
|
|
154
|
-
}
|
|
160
|
+
await discoverConfiguredItems(config.resourceDirs, ["resources"], baseDir, result, context, resourceHandler, config.verbose);
|
|
155
161
|
// Discover prompts
|
|
156
|
-
|
|
157
|
-
await discoverItems(`${baseDir}/${dir}`, result, context, promptHandler, config.verbose);
|
|
158
|
-
}
|
|
162
|
+
await discoverConfiguredItems(config.promptDirs, ["prompts"], baseDir, result, context, promptHandler, config.verbose);
|
|
159
163
|
// Discover workflows
|
|
160
|
-
|
|
161
|
-
await discoverItems(`${baseDir}/${dir}`, result, context, workflowHandler, config.verbose);
|
|
162
|
-
}
|
|
164
|
+
await discoverConfiguredItems(config.workflowDirs, ["workflows"], baseDir, result, context, workflowHandler, config.verbose);
|
|
163
165
|
// Discover Work definitions
|
|
164
|
-
|
|
165
|
-
await discoverItems(`${baseDir}/${dir}`, result, context, workHandler, config.verbose);
|
|
166
|
-
}
|
|
166
|
+
await discoverConfiguredItems(config.workDirs, ["work"], baseDir, result, context, workHandler, config.verbose);
|
|
167
167
|
// Discover tasks
|
|
168
|
-
|
|
169
|
-
await discoverItems(`${baseDir}/${dir}`, result, context, taskHandler, config.verbose);
|
|
170
|
-
}
|
|
168
|
+
await discoverConfiguredItems(config.taskDirs, ["tasks"], baseDir, result, context, taskHandler, config.verbose);
|
|
171
169
|
// Discover schedules
|
|
172
|
-
|
|
173
|
-
await discoverItems(`${baseDir}/${dir}`, result, context, scheduleHandler, config.verbose);
|
|
174
|
-
}
|
|
170
|
+
await discoverConfiguredItems(config.scheduleDirs, ["schedules"], baseDir, result, context, scheduleHandler, config.verbose);
|
|
175
171
|
// Discover webhooks
|
|
176
|
-
|
|
177
|
-
await discoverItems(`${baseDir}/${dir}`, result, context, webhookHandler, config.verbose);
|
|
178
|
-
}
|
|
172
|
+
await discoverConfiguredItems(config.webhookDirs, ["webhooks"], baseDir, result, context, webhookHandler, config.verbose);
|
|
179
173
|
// Discover eval definitions
|
|
180
|
-
|
|
181
|
-
await discoverItems(`${baseDir}/${dir}`, result, context, evalHandler, config.verbose);
|
|
182
|
-
}
|
|
174
|
+
await discoverConfiguredItems(config.evalDirs, ["evals"], baseDir, result, context, evalHandler, config.verbose);
|
|
183
175
|
return result;
|
|
184
176
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/discovery/handlers/task-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAErE,eAAO,MAAM,WAAW,EAAE,gBAAgB,CAAC,cAAc,
|
|
1
|
+
{"version":3,"file":"task-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/discovery/handlers/task-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAErE,eAAO,MAAM,WAAW,EAAE,gBAAgB,CAAC,cAAc,CAaxD,CAAC"}
|
|
@@ -6,8 +6,11 @@ export const taskHandler = {
|
|
|
6
6
|
typeName: "task",
|
|
7
7
|
validate: (item) => isTaskDefinition(item),
|
|
8
8
|
getId: (_task, file, dir) => {
|
|
9
|
+
const normalizedFile = file.startsWith("file://") ? file.slice("file://".length) : file;
|
|
9
10
|
const prefix = dir.endsWith("/") ? dir : `${dir}/`;
|
|
10
|
-
const relative =
|
|
11
|
+
const relative = normalizedFile.startsWith(prefix)
|
|
12
|
+
? normalizedFile.slice(prefix.length)
|
|
13
|
+
: normalizedFile;
|
|
11
14
|
return relative.replace(/\.(ts|tsx|js|jsx)$/, "");
|
|
12
15
|
},
|
|
13
16
|
register: (_id, task) => task,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-discovery-config.d.ts","sourceRoot":"","sources":["../../../src/src/discovery/project-discovery-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,eAAO,MAAM,8BAA8B;;;;;;;;;;;;CAY1C,CAAC;AAOF,KAAK,2BAA2B,GAAG;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAAG;IACrD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;
|
|
1
|
+
{"version":3,"file":"project-discovery-config.d.ts","sourceRoot":"","sources":["../../../src/src/discovery/project-discovery-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,eAAO,MAAM,8BAA8B;;;;;;;;;;;;CAY1C,CAAC;AAOF,KAAK,2BAA2B,GAAG;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAAG;IACrD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAwBF,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,2BAA2B,GACjC,sBAAsB,CAoDxB"}
|
|
@@ -20,10 +20,14 @@ function resolveDiscoveryPaths(discovery, defaultPaths) {
|
|
|
20
20
|
}
|
|
21
21
|
return discovery?.paths ?? defaultPaths;
|
|
22
22
|
}
|
|
23
|
+
function resolveProjectDiscoveryBaseDir(projectDir, config) {
|
|
24
|
+
const fsType = config?.fs?.type ?? "local";
|
|
25
|
+
return fsType === "github" || fsType === "veryfront-api" ? "" : projectDir;
|
|
26
|
+
}
|
|
23
27
|
export function createProjectDiscoveryConfig(input) {
|
|
24
28
|
const aiConfig = input.config?.ai;
|
|
25
29
|
return {
|
|
26
|
-
baseDir: input.projectDir,
|
|
30
|
+
baseDir: resolveProjectDiscoveryBaseDir(input.projectDir, input.config),
|
|
27
31
|
toolDirs: resolveDiscoveryPaths(aiConfig?.tools?.discovery, DEFAULT_PROJECT_DISCOVERY_DIRS.toolDirs),
|
|
28
32
|
agentDirs: resolveDiscoveryPaths(aiConfig?.agents?.discovery, DEFAULT_PROJECT_DISCOVERY_DIRS.agentDirs),
|
|
29
33
|
skillDirs: resolveDiscoveryPaths(aiConfig?.skills?.discovery, DEFAULT_PROJECT_DISCOVERY_DIRS.skillDirs),
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { DiscoveryResult } from "../../../../discovery/index.js";
|
|
1
2
|
import type { HandlerContext } from "../../types.js";
|
|
2
3
|
/**
|
|
3
4
|
* Run primitive discovery (agents, tools) for a project if not already done.
|
|
@@ -5,5 +6,5 @@ import type { HandlerContext } from "../../types.js";
|
|
|
5
6
|
* the correct remote project files and the agent registry uses the
|
|
6
7
|
* correct project scope.
|
|
7
8
|
*/
|
|
8
|
-
export declare function ensureProjectDiscovery(ctx: HandlerContext): Promise<
|
|
9
|
+
export declare function ensureProjectDiscovery(ctx: HandlerContext): Promise<DiscoveryResult>;
|
|
9
10
|
//# sourceMappingURL=project-discovery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-discovery.d.ts","sourceRoot":"","sources":["../../../../../../src/src/server/handlers/request/api/project-discovery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"project-discovery.d.ts","sourceRoot":"","sources":["../../../../../../src/src/server/handlers/request/api/project-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAItE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAkDrD;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CA8E1F"}
|
|
@@ -76,11 +76,12 @@ export async function ensureProjectDiscovery(ctx) {
|
|
|
76
76
|
else {
|
|
77
77
|
logger.info("Primitive discovery completed", logData);
|
|
78
78
|
}
|
|
79
|
+
return result;
|
|
79
80
|
})(),
|
|
80
81
|
};
|
|
81
82
|
discoveredProjects.set(key, discovery);
|
|
82
83
|
try {
|
|
83
|
-
await discovery.promise;
|
|
84
|
+
return await discovery.promise;
|
|
84
85
|
}
|
|
85
86
|
catch (error) {
|
|
86
87
|
// Allow retry on next request
|
|
@@ -90,6 +91,7 @@ export async function ensureProjectDiscovery(ctx) {
|
|
|
90
91
|
error: error instanceof Error ? error.message : String(error),
|
|
91
92
|
stack: error instanceof Error ? error.stack : undefined,
|
|
92
93
|
});
|
|
94
|
+
throw new Error(`Runtime discovery failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
93
95
|
}
|
|
94
96
|
finally {
|
|
95
97
|
if (!cacheCompletedDiscovery) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { RuntimeAdapter } from "../../../platform/index.js";
|
|
2
2
|
import type { VeryfrontConfig } from "../../../config/index.js";
|
|
3
|
-
import {
|
|
3
|
+
import type { DiscoveryResult } from "../../../discovery/index.js";
|
|
4
4
|
import { type RunTaskOptions, type TaskRunResult } from "../../../task/runner.js";
|
|
5
5
|
import { type DiscoveredEval } from "../../../eval/discovery.js";
|
|
6
6
|
import { type AgentServiceEvalAdapterConfig } from "../../../eval/agent-service.js";
|
|
@@ -55,12 +55,6 @@ interface WorkflowClientView {
|
|
|
55
55
|
destroy(): Promise<void>;
|
|
56
56
|
}
|
|
57
57
|
export interface ProjectRunExecuteHandlerDeps {
|
|
58
|
-
findTaskById(taskId: string, options: {
|
|
59
|
-
projectDir: string;
|
|
60
|
-
adapter: RuntimeAdapter;
|
|
61
|
-
config?: VeryfrontConfig;
|
|
62
|
-
debug?: boolean;
|
|
63
|
-
}): Promise<DiscoveredTask | null>;
|
|
64
58
|
runTask(options: RunTaskOptions): Promise<TaskRunResult>;
|
|
65
59
|
findWorkflowById(workflowId: string, options: {
|
|
66
60
|
projectDir: string;
|
|
@@ -78,7 +72,7 @@ export interface ProjectRunExecuteHandlerDeps {
|
|
|
78
72
|
runEval(definition: EvalDefinition, options: RunEvalOptions): Promise<EvalReport>;
|
|
79
73
|
createEvalAgentAdapter(config: AgentServiceEvalAdapterConfig): EvalAgentAdapter;
|
|
80
74
|
uploadEvalReport(input: EvalReportUploadInput): Promise<string | null>;
|
|
81
|
-
ensureProjectDiscovery(ctx: HandlerContext): Promise<
|
|
75
|
+
ensureProjectDiscovery(ctx: HandlerContext): Promise<DiscoveryResult>;
|
|
82
76
|
executeKnowledgeIngest(input: {
|
|
83
77
|
request: ProjectRunExecuteRequest;
|
|
84
78
|
ctx: HandlerContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-run-execute.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/request/project-run-execute.handler.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"project-run-execute.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/request/project-run-execute.handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { getEnvironmentConfig } from "../../../config/index.js";
|
|
|
4
4
|
import { ControlPlaneRequestError, verifyControlPlaneRequest, } from "../../../internal-agents/control-plane-auth.js";
|
|
5
5
|
import { INTERNAL_AGENT_CONTROL_PLANE_MAX_BODY_BYTES, InternalAgentRequestBodyTooLargeError, readInternalAgentRequestBody, } from "../../../internal-agents/request-body.js";
|
|
6
6
|
import { getHostEnv } from "../../../platform/compat/process.js";
|
|
7
|
-
import {
|
|
7
|
+
import { findProjectRuntimeTask } from "../../../task/project-runtime.js";
|
|
8
8
|
import { runTask } from "../../../task/runner.js";
|
|
9
9
|
import { findEvalById } from "../../../eval/discovery.js";
|
|
10
10
|
import { runEval } from "../../../eval/runner.js";
|
|
@@ -151,12 +151,8 @@ async function executeTaskRun(request, ctx, deps) {
|
|
|
151
151
|
if (taskId === "knowledge-ingest") {
|
|
152
152
|
throw new Error("Knowledge ingest must be executed through the knowledge ingest executor");
|
|
153
153
|
}
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
adapter: ctx.adapter,
|
|
157
|
-
config: ctx.config,
|
|
158
|
-
debug: ctx.debug,
|
|
159
|
-
});
|
|
154
|
+
const discovery = await deps.ensureProjectDiscovery(ctx);
|
|
155
|
+
const task = findProjectRuntimeTask(discovery, taskId);
|
|
160
156
|
if (!task) {
|
|
161
157
|
return {
|
|
162
158
|
success: false,
|
|
@@ -804,7 +800,6 @@ async function executeReleaseAssetBuildRun(input) {
|
|
|
804
800
|
}
|
|
805
801
|
}
|
|
806
802
|
const defaultDeps = {
|
|
807
|
-
findTaskById,
|
|
808
803
|
runTask,
|
|
809
804
|
findWorkflowById,
|
|
810
805
|
findEvalById,
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { DiscoveryResult } from "../discovery/index.js";
|
|
2
|
+
import type { RuntimeAdapter } from "../platform/index.js";
|
|
3
|
+
import type { FileSystemAdapter } from "../platform/adapters/base.js";
|
|
4
|
+
import type { VeryfrontConfig } from "../config/index.js";
|
|
5
|
+
import type { RunnableTask } from "./runner.js";
|
|
6
|
+
export interface ProjectTaskRuntimeOptions {
|
|
7
|
+
projectDir: string;
|
|
8
|
+
adapter: RuntimeAdapter;
|
|
9
|
+
config?: VeryfrontConfig | null;
|
|
10
|
+
fsAdapter?: FileSystemAdapter;
|
|
11
|
+
cacheKey?: string;
|
|
12
|
+
debug?: boolean;
|
|
13
|
+
throwOnErrors?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function formatProjectRuntimeDiscoveryErrors(errors: DiscoveryResult["errors"]): string[];
|
|
16
|
+
export declare function discoverProjectTaskRuntime(options: ProjectTaskRuntimeOptions): Promise<DiscoveryResult>;
|
|
17
|
+
export declare function findProjectRuntimeTask(discovery: DiscoveryResult, taskId: string): RunnableTask | null;
|
|
18
|
+
export declare function listProjectRuntimeTasks(discovery: DiscoveryResult): RunnableTask[];
|
|
19
|
+
//# sourceMappingURL=project-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-runtime.d.ts","sourceRoot":"","sources":["../../../src/src/task/project-runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAMD,wBAAgB,mCAAmC,CACjD,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,GAChC,MAAM,EAAE,CAEV;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,eAAe,CAAC,CAqB1B;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,MAAM,GACb,YAAY,GAAG,IAAI,CASrB;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,eAAe,GAAG,YAAY,EAAE,CAMlF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { discoverProjectAgentRuntime } from "../agent/project/agent-runtime.js";
|
|
2
|
+
function formatRuntimeDiscoveryError(error) {
|
|
3
|
+
return `${error.file}: ${error.error.message}`;
|
|
4
|
+
}
|
|
5
|
+
export function formatProjectRuntimeDiscoveryErrors(errors) {
|
|
6
|
+
return errors.map(formatRuntimeDiscoveryError);
|
|
7
|
+
}
|
|
8
|
+
export async function discoverProjectTaskRuntime(options) {
|
|
9
|
+
const discovery = await discoverProjectAgentRuntime({
|
|
10
|
+
projectDir: options.projectDir,
|
|
11
|
+
adapter: options.adapter,
|
|
12
|
+
config: options.config,
|
|
13
|
+
fsAdapter: options.fsAdapter,
|
|
14
|
+
cacheKey: options.cacheKey,
|
|
15
|
+
verbose: options.debug,
|
|
16
|
+
});
|
|
17
|
+
if (options.throwOnErrors && discovery.errors.length > 0) {
|
|
18
|
+
const lines = formatProjectRuntimeDiscoveryErrors(discovery.errors);
|
|
19
|
+
throw new Error([
|
|
20
|
+
`Runtime discovery failed with ${discovery.errors.length} errors:`,
|
|
21
|
+
...lines.map((line) => `- ${line}`),
|
|
22
|
+
].join("\n"));
|
|
23
|
+
}
|
|
24
|
+
return discovery;
|
|
25
|
+
}
|
|
26
|
+
export function findProjectRuntimeTask(discovery, taskId) {
|
|
27
|
+
const definition = discovery.tasks.get(taskId);
|
|
28
|
+
if (!definition)
|
|
29
|
+
return null;
|
|
30
|
+
return {
|
|
31
|
+
id: taskId,
|
|
32
|
+
name: definition.name || taskId,
|
|
33
|
+
definition,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function listProjectRuntimeTasks(discovery) {
|
|
37
|
+
return [...discovery.tasks].map(([id, definition]) => ({
|
|
38
|
+
id,
|
|
39
|
+
name: definition.name || id,
|
|
40
|
+
definition,
|
|
41
|
+
}));
|
|
42
|
+
}
|
package/esm/src/task/runner.d.ts
CHANGED
|
@@ -4,13 +4,21 @@
|
|
|
4
4
|
* Executes a discovered task by calling its run() function
|
|
5
5
|
* with the appropriate context.
|
|
6
6
|
*/
|
|
7
|
-
import type {
|
|
7
|
+
import type { TaskDefinition } from "./types.js";
|
|
8
|
+
export interface RunnableTask {
|
|
9
|
+
/** Stable task id used by CLI, triggers, and cloud runs. */
|
|
10
|
+
id: string;
|
|
11
|
+
/** Human-readable task name. */
|
|
12
|
+
name: string;
|
|
13
|
+
/** The task definition to execute. */
|
|
14
|
+
definition: TaskDefinition;
|
|
15
|
+
}
|
|
8
16
|
/**
|
|
9
17
|
* Options for running a task
|
|
10
18
|
*/
|
|
11
19
|
export interface RunTaskOptions {
|
|
12
20
|
/** The discovered task to run */
|
|
13
|
-
task:
|
|
21
|
+
task: RunnableTask;
|
|
14
22
|
/** Additional config to pass to the task */
|
|
15
23
|
config?: Record<string, unknown>;
|
|
16
24
|
/** Project ID (for cloud context) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/src/task/runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/src/task/runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,MAAM,WAAW,YAAY;IAC3B,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAC;IAEX,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IAEb,sCAAsC;IACtC,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,IAAI,EAAE,YAAY,CAAC;IAEnB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEjC,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IAEjB,yCAAyC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAkC7E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-runner.d.ts","sourceRoot":"","sources":["../../../src/src/trigger/local-runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"local-runner.d.ts","sourceRoot":"","sources":["../../../src/src/trigger/local-runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAoFD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CAYjC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { agentRegistry } from "../agent/composition/index.js";
|
|
2
|
-
import { discoverProjectAgentRuntime } from "../agent/project/agent-runtime.js";
|
|
3
2
|
import { toolRegistry } from "../tool/registry.js";
|
|
4
3
|
import { createWorkflowClient } from "../workflow/api/workflow-client.js";
|
|
5
|
-
import {
|
|
4
|
+
import { discoverProjectTaskRuntime, findProjectRuntimeTask, } from "../task/project-runtime.js";
|
|
6
5
|
import { runTask } from "../task/runner.js";
|
|
7
6
|
function toRecordInput(input) {
|
|
8
7
|
if (input === undefined)
|
|
@@ -12,17 +11,20 @@ function toRecordInput(input) {
|
|
|
12
11
|
}
|
|
13
12
|
return { payload: input };
|
|
14
13
|
}
|
|
15
|
-
async function
|
|
16
|
-
|
|
14
|
+
async function discoverRuntimeOrThrow(options) {
|
|
15
|
+
return await discoverProjectTaskRuntime({
|
|
17
16
|
projectDir: options.projectDir,
|
|
18
17
|
adapter: options.adapter,
|
|
19
18
|
config: options.config,
|
|
19
|
+
fsAdapter: options.adapter.fs,
|
|
20
|
+
cacheKey: options.cacheKey,
|
|
20
21
|
debug: options.debug,
|
|
22
|
+
throwOnErrors: true,
|
|
21
23
|
});
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const task =
|
|
24
|
+
}
|
|
25
|
+
async function runTaskTarget(options) {
|
|
26
|
+
const discovery = await discoverRuntimeOrThrow(options);
|
|
27
|
+
const task = findProjectRuntimeTask(discovery, options.target.id);
|
|
26
28
|
if (!task) {
|
|
27
29
|
throw new Error(`Task target "${options.target.id}" not found.`);
|
|
28
30
|
}
|
|
@@ -44,15 +46,7 @@ async function runTaskTarget(options) {
|
|
|
44
46
|
}
|
|
45
47
|
async function runWorkflowTarget(options) {
|
|
46
48
|
const start = Date.now();
|
|
47
|
-
const discovery = await
|
|
48
|
-
projectDir: options.projectDir,
|
|
49
|
-
adapter: options.adapter,
|
|
50
|
-
verbose: options.debug,
|
|
51
|
-
});
|
|
52
|
-
if (discovery.errors.length > 0) {
|
|
53
|
-
const first = discovery.errors[0];
|
|
54
|
-
throw new Error(`Runtime discovery failed: ${first?.file}: ${first?.error.message}`);
|
|
55
|
-
}
|
|
49
|
+
const discovery = await discoverRuntimeOrThrow(options);
|
|
56
50
|
const workflow = discovery.workflows.get(options.target.id);
|
|
57
51
|
if (!workflow) {
|
|
58
52
|
throw new Error(`Workflow target "${options.target.id}" not found.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-run-entrypoint.d.ts","sourceRoot":"","sources":["../../../../src/src/workflow/worker/dynamic-run-entrypoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AASH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAY5D;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;CAMrB,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,kCAAkC;IACjD,uCAAuC;IACvC,OAAO,EAAE,eAAe,CAAC;IAEzB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,kCAAkC,GACzC,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"dynamic-run-entrypoint.d.ts","sourceRoot":"","sources":["../../../../src/src/workflow/worker/dynamic-run-entrypoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AASH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAY5D;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;CAMrB,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,kCAAkC;IACjD,uCAAuC;IACvC,OAAO,EAAE,eAAe,CAAC;IAEzB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,kCAAkC,GACzC,OAAO,CAAC,MAAM,CAAC,CAqIjB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,yCAAyC;IACxD,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IAEjB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,gDAAgD;AAChD,wBAAsB,kCAAkC,CACtD,OAAO,EAAE,yCAAyC,GACjD,OAAO,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,CAchC"}
|
|
@@ -106,6 +106,8 @@ export async function runDynamicWorkflowRun(config) {
|
|
|
106
106
|
const discoveryResult = await discoverProjectAgentRuntime({
|
|
107
107
|
projectDir: "", // Root of project (relative paths with API)
|
|
108
108
|
adapter,
|
|
109
|
+
fsAdapter: adapter.fs,
|
|
110
|
+
cacheKey: tenant.projectId ?? tenant.projectSlug,
|
|
109
111
|
verbose: debug,
|
|
110
112
|
});
|
|
111
113
|
if (discoveryResult.errors.length > 0 && debug) {
|
package/package.json
CHANGED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Task Discovery
|
|
3
|
-
*
|
|
4
|
-
* Discovers task definitions from user's project `tasks/` directory.
|
|
5
|
-
* Follows the same patterns as workflow-discovery.ts.
|
|
6
|
-
*
|
|
7
|
-
* Scans:
|
|
8
|
-
* - tasks/*.ts - task definition files
|
|
9
|
-
* - tasks/**\/*.ts - nested task files
|
|
10
|
-
*
|
|
11
|
-
* Task files should export a task definition:
|
|
12
|
-
* ```typescript
|
|
13
|
-
* export default {
|
|
14
|
-
* name: "Sync external data",
|
|
15
|
-
* run: async (ctx) => {
|
|
16
|
-
* console.log("Syncing data...")
|
|
17
|
-
* return { synced: 42 }
|
|
18
|
-
* }
|
|
19
|
-
* }
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
import type { RuntimeAdapter } from "../platform/index.js";
|
|
23
|
-
import type { VeryfrontConfig } from "../config/index.js";
|
|
24
|
-
import type { TaskDefinition } from "./types.js";
|
|
25
|
-
/**
|
|
26
|
-
* Discovered task info
|
|
27
|
-
*/
|
|
28
|
-
export interface DiscoveredTask {
|
|
29
|
-
/** Task ID derived from file path (e.g., "sync-data" from tasks/sync-data.ts) */
|
|
30
|
-
id: string;
|
|
31
|
-
/** Human-readable name from task definition */
|
|
32
|
-
name: string;
|
|
33
|
-
/** File path where the task is defined */
|
|
34
|
-
filePath: string;
|
|
35
|
-
/** Export name (e.g., "default" or named export) */
|
|
36
|
-
exportName: string;
|
|
37
|
-
/** The task definition */
|
|
38
|
-
definition: TaskDefinition;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Options for task discovery
|
|
42
|
-
*/
|
|
43
|
-
export interface TaskDiscoveryOptions {
|
|
44
|
-
/** Project directory */
|
|
45
|
-
projectDir: string;
|
|
46
|
-
/** Runtime adapter for filesystem operations */
|
|
47
|
-
adapter: RuntimeAdapter;
|
|
48
|
-
/** Veryfront config (for import maps, etc.) */
|
|
49
|
-
config?: VeryfrontConfig;
|
|
50
|
-
/** Base directory for tasks (default: "tasks") */
|
|
51
|
-
tasksDir?: string;
|
|
52
|
-
/** Enable debug logging */
|
|
53
|
-
debug?: boolean;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Result of task discovery
|
|
57
|
-
*/
|
|
58
|
-
export interface TaskDiscoveryResult {
|
|
59
|
-
/** All discovered tasks */
|
|
60
|
-
tasks: DiscoveredTask[];
|
|
61
|
-
/** Errors encountered during discovery */
|
|
62
|
-
errors: Array<{
|
|
63
|
-
filePath: string;
|
|
64
|
-
error: string;
|
|
65
|
-
}>;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Derive task ID from file path (e.g., "tasks/sync-data.ts" → "sync-data")
|
|
69
|
-
*/
|
|
70
|
-
export declare function deriveTaskId(filePath: string, tasksDir: string): string;
|
|
71
|
-
/**
|
|
72
|
-
* Discover all tasks in a project
|
|
73
|
-
*/
|
|
74
|
-
export declare function discoverTasks(options: TaskDiscoveryOptions): Promise<TaskDiscoveryResult>;
|
|
75
|
-
/**
|
|
76
|
-
* Find a specific task by ID, short-circuiting discovery once found.
|
|
77
|
-
*/
|
|
78
|
-
export declare function findTaskById(taskId: string, options: TaskDiscoveryOptions): Promise<DiscoveredTask | null>;
|
|
79
|
-
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/src/task/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAajD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iFAAiF;IACjF,EAAE,EAAE,MAAM,CAAC;IAEX,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IAEb,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IAEjB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IAEnB,0BAA0B;IAC1B,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;IAEnB,gDAAgD;IAChD,OAAO,EAAE,cAAc,CAAC;IAExB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2BAA2B;IAC3B,KAAK,EAAE,cAAc,EAAE,CAAC;IAExB,0CAA0C;IAC1C,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAwED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CASvE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAiE9B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAuChC"}
|
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Task Discovery
|
|
3
|
-
*
|
|
4
|
-
* Discovers task definitions from user's project `tasks/` directory.
|
|
5
|
-
* Follows the same patterns as workflow-discovery.ts.
|
|
6
|
-
*
|
|
7
|
-
* Scans:
|
|
8
|
-
* - tasks/*.ts - task definition files
|
|
9
|
-
* - tasks/**\/*.ts - nested task files
|
|
10
|
-
*
|
|
11
|
-
* Task files should export a task definition:
|
|
12
|
-
* ```typescript
|
|
13
|
-
* export default {
|
|
14
|
-
* name: "Sync external data",
|
|
15
|
-
* run: async (ctx) => {
|
|
16
|
-
* console.log("Syncing data...")
|
|
17
|
-
* return { synced: 42 }
|
|
18
|
-
* }
|
|
19
|
-
* }
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
import { join } from "../../deps/jsr.io/@std/path/1.1.4/mod.js";
|
|
23
|
-
import { logger as baseLogger } from "../utils/index.js";
|
|
24
|
-
import { collectFiles } from "../utils/file-discovery.js";
|
|
25
|
-
import { importDiscoveryModule } from "../discovery/module-import.js";
|
|
26
|
-
import { isTaskDefinition } from "./types.js";
|
|
27
|
-
const logger = baseLogger.component("task-discovery");
|
|
28
|
-
const TASK_FILE_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx"];
|
|
29
|
-
const TASK_IGNORE_PATTERNS = [
|
|
30
|
-
"node_modules",
|
|
31
|
-
".git",
|
|
32
|
-
"__tests__",
|
|
33
|
-
"*.test.*",
|
|
34
|
-
"*.spec.*",
|
|
35
|
-
];
|
|
36
|
-
function resolveTasksBaseDir(projectDir, tasksDir, config) {
|
|
37
|
-
const fsType = config?.fs?.type ?? "local";
|
|
38
|
-
return fsType === "github" || fsType === "veryfront-api" ? tasksDir : join(projectDir, tasksDir);
|
|
39
|
-
}
|
|
40
|
-
function toErrorMessage(error) {
|
|
41
|
-
return error instanceof Error ? error.message : String(error);
|
|
42
|
-
}
|
|
43
|
-
async function collectTaskFiles(baseDir, adapter) {
|
|
44
|
-
return await collectFiles({
|
|
45
|
-
baseDir,
|
|
46
|
-
extensions: [...TASK_FILE_EXTENSIONS],
|
|
47
|
-
recursive: true,
|
|
48
|
-
ignorePatterns: [...TASK_IGNORE_PATTERNS],
|
|
49
|
-
adapter,
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
function extractTaskExport(module) {
|
|
53
|
-
const defaultExport = module.default;
|
|
54
|
-
if (isTaskDefinition(defaultExport)) {
|
|
55
|
-
return { exportName: "default", definition: defaultExport };
|
|
56
|
-
}
|
|
57
|
-
for (const [exportName, value] of Object.entries(module)) {
|
|
58
|
-
if (exportName !== "default" && isTaskDefinition(value)) {
|
|
59
|
-
return { exportName, definition: value };
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
async function loadTaskFromFile(filePath, id, adapter, projectDir) {
|
|
65
|
-
const module = await importDiscoveryModule(filePath, {
|
|
66
|
-
adapter,
|
|
67
|
-
projectDir,
|
|
68
|
-
});
|
|
69
|
-
const taskExport = extractTaskExport(module);
|
|
70
|
-
if (!taskExport)
|
|
71
|
-
return null;
|
|
72
|
-
return {
|
|
73
|
-
id,
|
|
74
|
-
name: taskExport.definition.name || id,
|
|
75
|
-
filePath,
|
|
76
|
-
exportName: taskExport.exportName,
|
|
77
|
-
definition: taskExport.definition,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
function logDiscoveredTask(task, debug) {
|
|
81
|
-
if (debug) {
|
|
82
|
-
logger.info(`Found task "${task.id}" in ${task.filePath} (export: ${task.exportName})`);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Derive task ID from file path (e.g., "tasks/sync-data.ts" → "sync-data")
|
|
87
|
-
*/
|
|
88
|
-
export function deriveTaskId(filePath, tasksDir) {
|
|
89
|
-
// Remove the tasks dir prefix and extension
|
|
90
|
-
let relative = filePath;
|
|
91
|
-
const dirPrefix = tasksDir.endsWith("/") ? tasksDir : `${tasksDir}/`;
|
|
92
|
-
if (relative.startsWith(dirPrefix)) {
|
|
93
|
-
relative = relative.slice(dirPrefix.length);
|
|
94
|
-
}
|
|
95
|
-
// Remove extension
|
|
96
|
-
return relative.replace(/\.(ts|tsx|js|jsx)$/, "");
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Discover all tasks in a project
|
|
100
|
-
*/
|
|
101
|
-
export async function discoverTasks(options) {
|
|
102
|
-
const { projectDir, adapter, config, tasksDir = "tasks", debug = false, } = options;
|
|
103
|
-
const tasks = [];
|
|
104
|
-
const errors = [];
|
|
105
|
-
const baseDir = resolveTasksBaseDir(projectDir, tasksDir, config);
|
|
106
|
-
if (debug) {
|
|
107
|
-
logger.info(`Scanning ${baseDir} for tasks`);
|
|
108
|
-
}
|
|
109
|
-
try {
|
|
110
|
-
const dirExists = await adapter.fs.exists(baseDir);
|
|
111
|
-
if (!dirExists) {
|
|
112
|
-
if (debug) {
|
|
113
|
-
logger.info(`No tasks directory found at ${baseDir}`);
|
|
114
|
-
}
|
|
115
|
-
return { tasks, errors };
|
|
116
|
-
}
|
|
117
|
-
const files = await collectTaskFiles(baseDir, adapter);
|
|
118
|
-
if (debug) {
|
|
119
|
-
logger.info(`Found ${files.length} potential task files`);
|
|
120
|
-
}
|
|
121
|
-
for (const file of files) {
|
|
122
|
-
try {
|
|
123
|
-
const task = await loadTaskFromFile(file.path, deriveTaskId(file.path, baseDir), adapter, projectDir);
|
|
124
|
-
if (task) {
|
|
125
|
-
tasks.push(task);
|
|
126
|
-
logDiscoveredTask(task, debug);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
catch (error) {
|
|
130
|
-
const errorMsg = toErrorMessage(error);
|
|
131
|
-
errors.push({ filePath: file.path, error: errorMsg });
|
|
132
|
-
if (debug) {
|
|
133
|
-
logger.warn(`Failed to load ${file.path}: ${errorMsg}`);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
if (debug) {
|
|
138
|
-
logger.info(`Discovered ${tasks.length} tasks`);
|
|
139
|
-
}
|
|
140
|
-
return { tasks, errors };
|
|
141
|
-
}
|
|
142
|
-
catch (error) {
|
|
143
|
-
const errorMsg = toErrorMessage(error);
|
|
144
|
-
logger.error(`Task discovery failed: ${errorMsg}`);
|
|
145
|
-
errors.push({ filePath: baseDir, error: errorMsg });
|
|
146
|
-
return { tasks, errors };
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Find a specific task by ID, short-circuiting discovery once found.
|
|
151
|
-
*/
|
|
152
|
-
export async function findTaskById(taskId, options) {
|
|
153
|
-
const { projectDir, adapter, config, tasksDir = "tasks", debug = false, } = options;
|
|
154
|
-
const baseDir = resolveTasksBaseDir(projectDir, tasksDir, config);
|
|
155
|
-
try {
|
|
156
|
-
const dirExists = await adapter.fs.exists(baseDir);
|
|
157
|
-
if (!dirExists)
|
|
158
|
-
return null;
|
|
159
|
-
const files = await collectTaskFiles(baseDir, adapter);
|
|
160
|
-
for (const file of files) {
|
|
161
|
-
const id = deriveTaskId(file.path, baseDir);
|
|
162
|
-
if (id !== taskId)
|
|
163
|
-
continue;
|
|
164
|
-
try {
|
|
165
|
-
const task = await loadTaskFromFile(file.path, id, adapter, projectDir);
|
|
166
|
-
if (task) {
|
|
167
|
-
logDiscoveredTask(task, debug);
|
|
168
|
-
return task;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
catch (error) {
|
|
172
|
-
const errorMsg = toErrorMessage(error);
|
|
173
|
-
if (debug) {
|
|
174
|
-
logger.warn(`Failed to load ${file.path}: ${errorMsg}`);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
catch (error) {
|
|
180
|
-
const errorMsg = toErrorMessage(error);
|
|
181
|
-
logger.error(`Task discovery failed while finding "${taskId}": ${errorMsg}`);
|
|
182
|
-
}
|
|
183
|
-
return null;
|
|
184
|
-
}
|