veryfront 0.1.974 → 0.1.975

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/esm/cli/commands/schedule/command-help.d.ts +3 -0
  2. package/esm/cli/commands/schedule/command-help.d.ts.map +1 -0
  3. package/esm/cli/commands/schedule/command-help.js +24 -0
  4. package/esm/cli/commands/schedule/handler.d.ts +3 -0
  5. package/esm/cli/commands/schedule/handler.d.ts.map +1 -0
  6. package/esm/cli/commands/schedule/handler.js +55 -0
  7. package/esm/cli/commands/schedules/command-help.d.ts +3 -0
  8. package/esm/cli/commands/schedules/command-help.d.ts.map +1 -0
  9. package/esm/cli/commands/schedules/command-help.js +16 -0
  10. package/esm/cli/commands/schedules/handler.d.ts +3 -0
  11. package/esm/cli/commands/schedules/handler.d.ts.map +1 -0
  12. package/esm/cli/commands/schedules/handler.js +19 -0
  13. package/esm/cli/commands/trigger-utils.d.ts +19 -0
  14. package/esm/cli/commands/trigger-utils.d.ts.map +1 -0
  15. package/esm/cli/commands/trigger-utils.js +50 -0
  16. package/esm/cli/commands/webhook/command-help.d.ts +3 -0
  17. package/esm/cli/commands/webhook/command-help.d.ts.map +1 -0
  18. package/esm/cli/commands/webhook/command-help.js +24 -0
  19. package/esm/cli/commands/webhook/handler.d.ts +3 -0
  20. package/esm/cli/commands/webhook/handler.d.ts.map +1 -0
  21. package/esm/cli/commands/webhook/handler.js +55 -0
  22. package/esm/cli/commands/webhooks/command-help.d.ts +3 -0
  23. package/esm/cli/commands/webhooks/command-help.d.ts.map +1 -0
  24. package/esm/cli/commands/webhooks/command-help.js +16 -0
  25. package/esm/cli/commands/webhooks/handler.d.ts +3 -0
  26. package/esm/cli/commands/webhooks/handler.d.ts.map +1 -0
  27. package/esm/cli/commands/webhooks/handler.js +19 -0
  28. package/esm/cli/help/command-definitions.d.ts.map +1 -1
  29. package/esm/cli/help/command-definitions.js +8 -0
  30. package/esm/cli/router.d.ts.map +1 -1
  31. package/esm/cli/router.js +8 -0
  32. package/esm/deno.d.ts +14 -0
  33. package/esm/deno.js +15 -1
  34. package/esm/src/agent/runtime/model-resolution.d.ts +1 -0
  35. package/esm/src/agent/runtime/model-resolution.d.ts.map +1 -1
  36. package/esm/src/agent/runtime/model-resolution.js +4 -1
  37. package/esm/src/agent/types.d.ts +1 -1
  38. package/esm/src/config/schemas/config.schema.d.ts +24 -0
  39. package/esm/src/config/schemas/config.schema.d.ts.map +1 -1
  40. package/esm/src/config/schemas/config.schema.js +24 -0
  41. package/esm/src/discovery/discovery-engine.d.ts.map +1 -1
  42. package/esm/src/discovery/discovery-engine.js +11 -1
  43. package/esm/src/discovery/handlers/index.d.ts +2 -0
  44. package/esm/src/discovery/handlers/index.d.ts.map +1 -1
  45. package/esm/src/discovery/handlers/index.js +2 -0
  46. package/esm/src/discovery/handlers/schedule-handler.d.ts +4 -0
  47. package/esm/src/discovery/handlers/schedule-handler.d.ts.map +1 -0
  48. package/esm/src/discovery/handlers/schedule-handler.js +8 -0
  49. package/esm/src/discovery/handlers/webhook-handler.d.ts +4 -0
  50. package/esm/src/discovery/handlers/webhook-handler.d.ts.map +1 -0
  51. package/esm/src/discovery/handlers/webhook-handler.js +8 -0
  52. package/esm/src/discovery/project-discovery-config.d.ts +4 -0
  53. package/esm/src/discovery/project-discovery-config.d.ts.map +1 -1
  54. package/esm/src/discovery/project-discovery-config.js +4 -0
  55. package/esm/src/discovery/types.d.ts +6 -0
  56. package/esm/src/discovery/types.d.ts.map +1 -1
  57. package/esm/src/platform/cloud/resolver.d.ts +1 -1
  58. package/esm/src/platform/cloud/resolver.d.ts.map +1 -1
  59. package/esm/src/platform/cloud/resolver.js +1 -1
  60. package/esm/src/provider/index.d.ts +1 -1
  61. package/esm/src/provider/index.js +1 -1
  62. package/esm/src/provider/veryfront-cloud/model-catalog.d.ts +1 -1
  63. package/esm/src/provider/veryfront-cloud/model-catalog.d.ts.map +1 -1
  64. package/esm/src/provider/veryfront-cloud/model-catalog.js +8 -1
  65. package/esm/src/schedule/discovery.d.ts +13 -0
  66. package/esm/src/schedule/discovery.d.ts.map +1 -0
  67. package/esm/src/schedule/discovery.js +12 -0
  68. package/esm/src/schedule/factory.d.ts +3 -0
  69. package/esm/src/schedule/factory.d.ts.map +1 -0
  70. package/esm/src/schedule/factory.js +48 -0
  71. package/esm/src/schedule/index.d.ts +25 -0
  72. package/esm/src/schedule/index.d.ts.map +1 -0
  73. package/esm/src/schedule/index.js +22 -0
  74. package/esm/src/schedule/types.d.ts +21 -0
  75. package/esm/src/schedule/types.d.ts.map +1 -0
  76. package/esm/src/schedule/types.js +9 -0
  77. package/esm/src/trigger/discovery.d.ts +31 -0
  78. package/esm/src/trigger/discovery.d.ts.map +1 -0
  79. package/esm/src/trigger/discovery.js +115 -0
  80. package/esm/src/trigger/index.d.ts +30 -0
  81. package/esm/src/trigger/index.d.ts.map +1 -0
  82. package/esm/src/trigger/index.js +26 -0
  83. package/esm/src/trigger/local-runner.d.ts +20 -0
  84. package/esm/src/trigger/local-runner.d.ts.map +1 -0
  85. package/esm/src/trigger/local-runner.js +92 -0
  86. package/esm/src/trigger/target.d.ts +7 -0
  87. package/esm/src/trigger/target.d.ts.map +1 -0
  88. package/esm/src/trigger/target.js +8 -0
  89. package/esm/src/trigger/validation.d.ts +3 -0
  90. package/esm/src/trigger/validation.d.ts.map +1 -0
  91. package/esm/src/trigger/validation.js +36 -0
  92. package/esm/src/utils/version-constant.d.ts +1 -1
  93. package/esm/src/utils/version-constant.js +1 -1
  94. package/esm/src/webhook/discovery.d.ts +13 -0
  95. package/esm/src/webhook/discovery.d.ts.map +1 -0
  96. package/esm/src/webhook/discovery.js +12 -0
  97. package/esm/src/webhook/factory.d.ts +3 -0
  98. package/esm/src/webhook/factory.d.ts.map +1 -0
  99. package/esm/src/webhook/factory.js +58 -0
  100. package/esm/src/webhook/index.d.ts +29 -0
  101. package/esm/src/webhook/index.d.ts.map +1 -0
  102. package/esm/src/webhook/index.js +26 -0
  103. package/esm/src/webhook/types.d.ts +26 -0
  104. package/esm/src/webhook/types.d.ts.map +1 -0
  105. package/esm/src/webhook/types.js +8 -0
  106. package/package.json +13 -1
@@ -0,0 +1,115 @@
1
+ import { join } from "../../deps/jsr.io/@std/path/1.1.4/mod.js";
2
+ import { importDiscoveryModule } from "../discovery/module-import.js";
3
+ import { collectFiles } from "../utils/file-discovery.js";
4
+ const TRIGGER_FILE_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx"];
5
+ const TRIGGER_IGNORE_PATTERNS = [
6
+ "node_modules",
7
+ ".git",
8
+ "__tests__",
9
+ "*.test.*",
10
+ "*.spec.*",
11
+ ];
12
+ function resolveTriggerBaseDir(projectDir, triggerDir, config) {
13
+ const fsType = config?.fs?.type ?? "local";
14
+ return fsType === "github" || fsType === "veryfront-api"
15
+ ? triggerDir
16
+ : join(projectDir, triggerDir);
17
+ }
18
+ function toErrorMessage(error) {
19
+ return error instanceof Error ? error.message : String(error);
20
+ }
21
+ function createError(input) {
22
+ return {
23
+ kind: "source_trigger_discovery_error",
24
+ sourceKind: input.sourceKind,
25
+ sourcePath: input.sourcePath,
26
+ ...(input.sourceId === undefined ? {} : { sourceId: input.sourceId }),
27
+ code: input.code,
28
+ message: input.message,
29
+ ...(input.details === undefined ? {} : { details: input.details }),
30
+ };
31
+ }
32
+ async function collectTriggerFiles(baseDir, adapter) {
33
+ return await collectFiles({
34
+ baseDir,
35
+ extensions: [...TRIGGER_FILE_EXTENSIONS],
36
+ recursive: true,
37
+ ignorePatterns: [...TRIGGER_IGNORE_PATTERNS],
38
+ adapter,
39
+ });
40
+ }
41
+ function extractTriggerExport(module, validate) {
42
+ if (validate(module.default)) {
43
+ return { exportName: "default", definition: module.default };
44
+ }
45
+ for (const [exportName, value] of Object.entries(module)) {
46
+ if (exportName === "default")
47
+ continue;
48
+ if (validate(value))
49
+ return { exportName, definition: value };
50
+ }
51
+ return null;
52
+ }
53
+ export async function discoverSourceTriggers(options) {
54
+ const { projectDir, adapter, config, triggerDir, sourceKind, validate } = options;
55
+ const baseDir = resolveTriggerBaseDir(projectDir, triggerDir, config);
56
+ const items = [];
57
+ const errors = [];
58
+ const seenIds = new Map();
59
+ try {
60
+ const dirExists = await adapter.fs.exists(baseDir);
61
+ if (!dirExists)
62
+ return { items, errors };
63
+ const files = await collectTriggerFiles(baseDir, adapter);
64
+ for (const file of files) {
65
+ try {
66
+ const module = await importDiscoveryModule(file.path, {
67
+ adapter,
68
+ projectDir,
69
+ });
70
+ const triggerExport = extractTriggerExport(module, validate);
71
+ if (!triggerExport) {
72
+ errors.push(createError({
73
+ sourceKind,
74
+ sourcePath: file.path,
75
+ code: "invalid_definition",
76
+ message: `File must export a valid ${sourceKind} definition.`,
77
+ }));
78
+ continue;
79
+ }
80
+ const existingPath = seenIds.get(triggerExport.definition.id);
81
+ if (existingPath) {
82
+ errors.push(createError({
83
+ sourceKind,
84
+ sourcePath: file.path,
85
+ sourceId: triggerExport.definition.id,
86
+ code: "duplicate_source_id",
87
+ message: `Duplicate ${sourceKind} id "${triggerExport.definition.id}".`,
88
+ details: { firstSourcePath: existingPath },
89
+ }));
90
+ continue;
91
+ }
92
+ seenIds.set(triggerExport.definition.id, file.path);
93
+ items.push(triggerExport.definition);
94
+ }
95
+ catch (error) {
96
+ errors.push(createError({
97
+ sourceKind,
98
+ sourcePath: file.path,
99
+ code: "parse_error",
100
+ message: toErrorMessage(error),
101
+ }));
102
+ }
103
+ }
104
+ return { items, errors };
105
+ }
106
+ catch (error) {
107
+ errors.push(createError({
108
+ sourceKind,
109
+ sourcePath: baseDir,
110
+ code: "parse_error",
111
+ message: toErrorMessage(error),
112
+ }));
113
+ return { items, errors };
114
+ }
115
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Shared source-trigger discovery and local execution primitives.
3
+ *
4
+ * @module trigger
5
+ *
6
+ * @example Discover and run a source-defined trigger target
7
+ * ```ts
8
+ * import { discoverSchedules } from "veryfront/schedule";
9
+ * import { runTriggerTarget } from "veryfront/trigger";
10
+ *
11
+ * const { items } = await discoverSchedules({ projectDir, adapter });
12
+ * const dailyTriage = items.find((item) => item.id === "daily-support-triage");
13
+ *
14
+ * if (dailyTriage) {
15
+ * await runTriggerTarget({
16
+ * projectDir,
17
+ * adapter,
18
+ * target: dailyTriage.target,
19
+ * input: dailyTriage.input,
20
+ * });
21
+ * }
22
+ * ```
23
+ */
24
+ import "../../_dnt.polyfills.js";
25
+ export { discoverSourceTriggers } from "./discovery.js";
26
+ export { runTriggerTarget } from "./local-runner.js";
27
+ export type { SourceTriggerDiscoveryError, SourceTriggerDiscoveryErrorCode, SourceTriggerDiscoveryResult, SourceTriggerKind, TriggerDefinitionWithId, TriggerDiscoveryOptions, } from "./discovery.js";
28
+ export type { RunTriggerTargetOptions, TriggerTargetRunResult } from "./local-runner.js";
29
+ export type { TriggerTarget } from "./target.js";
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/trigger/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,yBAAyB,CAAC;AAGjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EACV,2BAA2B,EAC3B,+BAA+B,EAC/B,4BAA4B,EAC5B,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACzF,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shared source-trigger discovery and local execution primitives.
3
+ *
4
+ * @module trigger
5
+ *
6
+ * @example Discover and run a source-defined trigger target
7
+ * ```ts
8
+ * import { discoverSchedules } from "veryfront/schedule";
9
+ * import { runTriggerTarget } from "veryfront/trigger";
10
+ *
11
+ * const { items } = await discoverSchedules({ projectDir, adapter });
12
+ * const dailyTriage = items.find((item) => item.id === "daily-support-triage");
13
+ *
14
+ * if (dailyTriage) {
15
+ * await runTriggerTarget({
16
+ * projectDir,
17
+ * adapter,
18
+ * target: dailyTriage.target,
19
+ * input: dailyTriage.input,
20
+ * });
21
+ * }
22
+ * ```
23
+ */
24
+ import "../../_dnt.polyfills.js";
25
+ export { discoverSourceTriggers } from "./discovery.js";
26
+ export { runTriggerTarget } from "./local-runner.js";
@@ -0,0 +1,20 @@
1
+ import type { RuntimeAdapter } from "../platform/index.js";
2
+ import type { VeryfrontConfig } from "../config/index.js";
3
+ import type { TriggerTarget } from "./target.js";
4
+ export interface RunTriggerTargetOptions {
5
+ projectDir: string;
6
+ adapter: RuntimeAdapter;
7
+ config?: VeryfrontConfig;
8
+ projectId?: string;
9
+ target: TriggerTarget;
10
+ input?: unknown;
11
+ debug?: boolean;
12
+ }
13
+ export interface TriggerTargetRunResult {
14
+ kind: TriggerTarget["kind"];
15
+ id: string;
16
+ output?: unknown;
17
+ durationMs: number;
18
+ }
19
+ export declare function runTriggerTarget(options: RunTriggerTargetOptions): Promise<TriggerTargetRunResult>;
20
+ //# sourceMappingURL=local-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-runner.d.ts","sourceRoot":"","sources":["../../../src/src/trigger/local-runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAK1D,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,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;AAyFD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CAYjC"}
@@ -0,0 +1,92 @@
1
+ import { agentRegistry } from "../agent/composition/index.js";
2
+ import { discoverProjectAgentRuntime } from "../agent/project/agent-runtime.js";
3
+ import { toolRegistry } from "../tool/registry.js";
4
+ import { createWorkflowClient } from "../workflow/api/workflow-client.js";
5
+ import { discoverTasks } from "../task/discovery.js";
6
+ import { runTask } from "../task/runner.js";
7
+ function toRecordInput(input) {
8
+ if (input === undefined)
9
+ return {};
10
+ if (input && typeof input === "object" && !Array.isArray(input)) {
11
+ return input;
12
+ }
13
+ return { payload: input };
14
+ }
15
+ async function runTaskTarget(options) {
16
+ const { tasks, errors } = await discoverTasks({
17
+ projectDir: options.projectDir,
18
+ adapter: options.adapter,
19
+ config: options.config,
20
+ debug: options.debug,
21
+ });
22
+ if (errors.length > 0) {
23
+ throw new Error(`Task discovery failed: ${errors[0]?.filePath}: ${errors[0]?.error}`);
24
+ }
25
+ const task = tasks.find((candidate) => candidate.id === options.target.id);
26
+ if (!task) {
27
+ throw new Error(`Task target "${options.target.id}" not found.`);
28
+ }
29
+ const result = await runTask({
30
+ task,
31
+ config: toRecordInput(options.input),
32
+ projectId: options.projectId,
33
+ debug: options.debug,
34
+ });
35
+ if (!result.success) {
36
+ throw new Error(result.error ?? `Task target "${options.target.id}" failed.`);
37
+ }
38
+ return {
39
+ kind: "task",
40
+ id: options.target.id,
41
+ output: result.result,
42
+ durationMs: result.durationMs,
43
+ };
44
+ }
45
+ async function runWorkflowTarget(options) {
46
+ const start = Date.now();
47
+ const discovery = await discoverProjectAgentRuntime({
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
+ }
56
+ const workflow = discovery.workflows.get(options.target.id);
57
+ if (!workflow) {
58
+ throw new Error(`Workflow target "${options.target.id}" not found.`);
59
+ }
60
+ const client = createWorkflowClient({
61
+ debug: options.debug,
62
+ executor: {
63
+ stepExecutor: {
64
+ agentRegistry,
65
+ toolRegistry,
66
+ },
67
+ },
68
+ });
69
+ try {
70
+ client.register(workflow.definition);
71
+ const handle = await client.start(options.target.id, options.input ?? {});
72
+ const output = await handle.result();
73
+ return {
74
+ kind: "workflow",
75
+ id: options.target.id,
76
+ output,
77
+ durationMs: Date.now() - start,
78
+ };
79
+ }
80
+ finally {
81
+ await client.destroy();
82
+ }
83
+ }
84
+ export async function runTriggerTarget(options) {
85
+ if (options.target.kind === "task") {
86
+ return await runTaskTarget(options);
87
+ }
88
+ if (options.target.kind === "workflow") {
89
+ return await runWorkflowTarget(options);
90
+ }
91
+ throw new Error("Agent trigger targets are Cloud-only for this milestone. Use a workflow or task for local trigger runs.");
92
+ }
@@ -0,0 +1,7 @@
1
+ export type TriggerTargetKind = "task" | "workflow" | "agent";
2
+ export interface TriggerTarget {
3
+ kind: TriggerTargetKind;
4
+ id: string;
5
+ }
6
+ export declare function isTriggerTarget(value: unknown): value is TriggerTarget;
7
+ //# sourceMappingURL=target.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target.d.ts","sourceRoot":"","sources":["../../../src/src/trigger/target.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAQtE"}
@@ -0,0 +1,8 @@
1
+ export function isTriggerTarget(value) {
2
+ if (!value || typeof value !== "object")
3
+ return false;
4
+ const target = value;
5
+ return ((target.kind === "task" || target.kind === "workflow" || target.kind === "agent") &&
6
+ typeof target.id === "string" &&
7
+ target.id.trim().length > 0);
8
+ }
@@ -0,0 +1,3 @@
1
+ export declare function validateTriggerId(id: string, label: string): void;
2
+ export declare function assertSerializable(value: unknown, path?: string): void;
3
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/src/trigger/validation.ts"],"names":[],"mappings":"AAEA,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAMjE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,SAAU,GAAG,IAAI,CAgCvE"}
@@ -0,0 +1,36 @@
1
+ const ID_PATTERN = /^[a-z0-9][a-z0-9._/-]*$/;
2
+ export function validateTriggerId(id, label) {
3
+ if (!ID_PATTERN.test(id)) {
4
+ throw new Error(`${label} id must start with a lowercase letter or number and use lowercase letters, numbers, dots, underscores, slashes, or hyphens.`);
5
+ }
6
+ }
7
+ export function assertSerializable(value, path = "value") {
8
+ if (value === undefined)
9
+ return;
10
+ if (value === null)
11
+ return;
12
+ const valueType = typeof value;
13
+ if (valueType === "string" || valueType === "number" || valueType === "boolean")
14
+ return;
15
+ if (valueType === "function" || valueType === "symbol" || valueType === "bigint") {
16
+ throw new Error(`${path} must be JSON-serializable.`);
17
+ }
18
+ if (value instanceof Date) {
19
+ throw new Error(`${path} must be JSON-serializable.`);
20
+ }
21
+ if (Array.isArray(value)) {
22
+ for (let index = 0; index < value.length; index++) {
23
+ assertSerializable(value[index], `${path}[${index}]`);
24
+ }
25
+ return;
26
+ }
27
+ if (typeof value === "object") {
28
+ const prototype = Object.getPrototypeOf(value);
29
+ if (prototype !== Object.prototype && prototype !== null) {
30
+ throw new Error(`${path} must be JSON-serializable.`);
31
+ }
32
+ for (const [key, child] of Object.entries(value)) {
33
+ assertSerializable(child, `${path}.${key}`);
34
+ }
35
+ }
36
+ }
@@ -1,3 +1,3 @@
1
1
  /** Shared version value. */
2
- export declare const VERSION = "0.1.974";
2
+ export declare const VERSION = "0.1.975";
3
3
  //# sourceMappingURL=version-constant.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
3
  /** Shared version value. */
4
- export const VERSION = "0.1.974";
4
+ export const VERSION = "0.1.975";
@@ -0,0 +1,13 @@
1
+ import type { RuntimeAdapter } from "../platform/index.js";
2
+ import type { VeryfrontConfig } from "../config/index.js";
3
+ import { type SourceTriggerDiscoveryResult } from "../trigger/discovery.js";
4
+ import { type WebhookDefinition } from "./types.js";
5
+ export interface WebhookDiscoveryOptions {
6
+ projectDir: string;
7
+ adapter: RuntimeAdapter;
8
+ config?: VeryfrontConfig;
9
+ webhooksDir?: string;
10
+ }
11
+ export type WebhookDiscoveryResult = SourceTriggerDiscoveryResult<WebhookDefinition>;
12
+ export declare function discoverWebhooks(options: WebhookDiscoveryOptions): Promise<WebhookDiscoveryResult>;
13
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/src/webhook/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,sBAAsB,GAAG,4BAA4B,CAAC,iBAAiB,CAAC,CAAC;AAErF,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CASjC"}
@@ -0,0 +1,12 @@
1
+ import { discoverSourceTriggers, } from "../trigger/discovery.js";
2
+ import { isWebhookDefinition } from "./types.js";
3
+ export async function discoverWebhooks(options) {
4
+ return await discoverSourceTriggers({
5
+ projectDir: options.projectDir,
6
+ adapter: options.adapter,
7
+ config: options.config,
8
+ triggerDir: options.webhooksDir ?? "webhooks",
9
+ sourceKind: "webhook",
10
+ validate: isWebhookDefinition,
11
+ });
12
+ }
@@ -0,0 +1,3 @@
1
+ import type { WebhookConfig, WebhookDefinition } from "./types.js";
2
+ export declare function webhook(config: WebhookConfig): WebhookDefinition;
3
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/src/webhook/factory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EAGlB,MAAM,YAAY,CAAC;AAuCpB,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,CA2BhE"}
@@ -0,0 +1,58 @@
1
+ import { isTriggerTarget } from "../trigger/target.js";
2
+ import { assertSerializable, validateTriggerId } from "../trigger/validation.js";
3
+ const OPERATORS = new Set(["equals", "not_equals", "contains", "exists"]);
4
+ function requireString(value, label) {
5
+ if (typeof value !== "string" || value.trim().length === 0) {
6
+ throw new Error(`${label} is required.`);
7
+ }
8
+ return value;
9
+ }
10
+ function normalizeFilter(filter) {
11
+ if (filter === undefined)
12
+ return undefined;
13
+ if (filter.mode !== "all" && filter.mode !== "any") {
14
+ throw new Error("Webhook eventFilter mode must be all or any.");
15
+ }
16
+ if (!Array.isArray(filter.conditions)) {
17
+ throw new Error("Webhook eventFilter conditions must be an array.");
18
+ }
19
+ return {
20
+ mode: filter.mode,
21
+ conditions: filter.conditions.map((condition, index) => {
22
+ if (typeof condition.path !== "string" || condition.path.trim().length === 0) {
23
+ throw new Error(`Webhook eventFilter condition ${index} path is required.`);
24
+ }
25
+ if (!OPERATORS.has(condition.operator)) {
26
+ throw new Error(`Webhook eventFilter condition ${index} operator is not supported.`);
27
+ }
28
+ assertSerializable(condition.value, `Webhook eventFilter condition ${index} value`);
29
+ return {
30
+ path: condition.path,
31
+ operator: condition.operator,
32
+ ...(condition.value === undefined ? {} : { value: condition.value }),
33
+ };
34
+ }),
35
+ };
36
+ }
37
+ export function webhook(config) {
38
+ const id = requireString(config.id, "Webhook id");
39
+ validateTriggerId(id, "Webhook");
40
+ if (!isTriggerTarget(config.target)) {
41
+ throw new Error("Webhook target must specify a valid task, workflow, or agent id.");
42
+ }
43
+ if (config.target.kind === "agent" &&
44
+ (!config.agentMessage || config.agentMessage.promptTemplate.trim().length === 0)) {
45
+ throw new Error("Agent webhooks must define agentMessage.promptTemplate.");
46
+ }
47
+ const eventFilter = normalizeFilter(config.eventFilter);
48
+ return {
49
+ id,
50
+ ...(config.name === undefined ? {} : { name: config.name }),
51
+ ...(config.description === undefined ? {} : { description: config.description }),
52
+ target: { kind: config.target.kind, id: config.target.id },
53
+ ...(eventFilter === undefined ? {} : { eventFilter }),
54
+ ...(config.agentMessage === undefined
55
+ ? {}
56
+ : { agentMessage: { promptTemplate: config.agentMessage.promptTemplate } }),
57
+ };
58
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Source-defined webhooks for Veryfront projects.
3
+ *
4
+ * @module webhook
5
+ *
6
+ * @example Run a workflow for urgent customer events
7
+ * ```ts
8
+ * import { webhook } from "veryfront/webhook";
9
+ *
10
+ * export default webhook({
11
+ * id: "customer-escalation",
12
+ * target: { kind: "workflow", id: "escalate-ticket" },
13
+ * eventFilter: {
14
+ * mode: "any",
15
+ * conditions: [
16
+ * { path: "severity", operator: "equals", value: "high" },
17
+ * { path: "priority", operator: "equals", value: "urgent" },
18
+ * ],
19
+ * },
20
+ * });
21
+ * ```
22
+ */
23
+ import "../../_dnt.polyfills.js";
24
+ export { webhook } from "./factory.js";
25
+ export { discoverWebhooks } from "./discovery.js";
26
+ export type { WebhookAgentMessageMapping, WebhookConfig, WebhookDefinition, WebhookEventFilter, WebhookEventFilterCondition, WebhookEventFilterMode, WebhookEventFilterOperator, } from "./types.js";
27
+ export { isWebhookDefinition } from "./types.js";
28
+ export type { WebhookDiscoveryOptions, WebhookDiscoveryResult } from "./discovery.js";
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/webhook/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,yBAAyB,CAAC;AAGjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EACV,0BAA0B,EAC1B,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,2BAA2B,EAC3B,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Source-defined webhooks for Veryfront projects.
3
+ *
4
+ * @module webhook
5
+ *
6
+ * @example Run a workflow for urgent customer events
7
+ * ```ts
8
+ * import { webhook } from "veryfront/webhook";
9
+ *
10
+ * export default webhook({
11
+ * id: "customer-escalation",
12
+ * target: { kind: "workflow", id: "escalate-ticket" },
13
+ * eventFilter: {
14
+ * mode: "any",
15
+ * conditions: [
16
+ * { path: "severity", operator: "equals", value: "high" },
17
+ * { path: "priority", operator: "equals", value: "urgent" },
18
+ * ],
19
+ * },
20
+ * });
21
+ * ```
22
+ */
23
+ import "../../_dnt.polyfills.js";
24
+ export { webhook } from "./factory.js";
25
+ export { discoverWebhooks } from "./discovery.js";
26
+ export { isWebhookDefinition } from "./types.js";
@@ -0,0 +1,26 @@
1
+ import type { TriggerTarget } from "../trigger/target.js";
2
+ export type WebhookEventFilterMode = "all" | "any";
3
+ export type WebhookEventFilterOperator = "equals" | "not_equals" | "contains" | "exists";
4
+ export interface WebhookEventFilterCondition {
5
+ path: string;
6
+ operator: WebhookEventFilterOperator;
7
+ value?: unknown;
8
+ }
9
+ export interface WebhookEventFilter {
10
+ mode: WebhookEventFilterMode;
11
+ conditions: WebhookEventFilterCondition[];
12
+ }
13
+ export interface WebhookAgentMessageMapping {
14
+ promptTemplate: string;
15
+ }
16
+ export interface WebhookDefinition {
17
+ id: string;
18
+ name?: string;
19
+ description?: string;
20
+ target: TriggerTarget;
21
+ eventFilter?: WebhookEventFilter;
22
+ agentMessage?: WebhookAgentMessageMapping;
23
+ }
24
+ export type WebhookConfig = WebhookDefinition;
25
+ export declare function isWebhookDefinition(value: unknown): value is WebhookDefinition;
26
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/src/webhook/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,KAAK,CAAC;AAEnD,MAAM,MAAM,0BAA0B,GAClC,QAAQ,GACR,YAAY,GACZ,UAAU,GACV,QAAQ,CAAC;AAEb,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,0BAA0B,CAAC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,UAAU,EAAE,2BAA2B,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,YAAY,CAAC,EAAE,0BAA0B,CAAC;CAC3C;AAED,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAE9C,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAQ9E"}
@@ -0,0 +1,8 @@
1
+ export function isWebhookDefinition(value) {
2
+ if (!value || typeof value !== "object")
3
+ return false;
4
+ const definition = value;
5
+ return (typeof definition.id === "string" &&
6
+ definition.target !== null &&
7
+ typeof definition.target === "object");
8
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.974",
3
+ "version": "0.1.975",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",
@@ -145,6 +145,18 @@
145
145
  "import": "./esm/src/skill/index.js",
146
146
  "types": "./esm/src/skill/index.d.ts"
147
147
  },
148
+ "./trigger": {
149
+ "import": "./esm/src/trigger/index.js",
150
+ "types": "./esm/src/trigger/index.d.ts"
151
+ },
152
+ "./schedule": {
153
+ "import": "./esm/src/schedule/index.js",
154
+ "types": "./esm/src/schedule/index.d.ts"
155
+ },
156
+ "./webhook": {
157
+ "import": "./esm/src/webhook/index.js",
158
+ "types": "./esm/src/webhook/index.d.ts"
159
+ },
148
160
  "./mcp": {
149
161
  "import": "./esm/src/mcp/index.js",
150
162
  "types": "./esm/src/mcp/index.d.ts"