@claushaas/ergon-engine 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +13 -0
  3. package/dist/defaults.d.ts +11 -0
  4. package/dist/defaults.d.ts.map +1 -0
  5. package/dist/defaults.js +27 -0
  6. package/dist/defaults.js.map +1 -0
  7. package/dist/executors/agent.d.ts +12 -0
  8. package/dist/executors/agent.d.ts.map +1 -0
  9. package/dist/executors/agent.js +80 -0
  10. package/dist/executors/agent.js.map +1 -0
  11. package/dist/executors/artifact.d.ts +7 -0
  12. package/dist/executors/artifact.d.ts.map +1 -0
  13. package/dist/executors/artifact.js +148 -0
  14. package/dist/executors/artifact.js.map +1 -0
  15. package/dist/executors/condition.d.ts +7 -0
  16. package/dist/executors/condition.d.ts.map +1 -0
  17. package/dist/executors/condition.js +53 -0
  18. package/dist/executors/condition.js.map +1 -0
  19. package/dist/executors/exec.d.ts +32 -0
  20. package/dist/executors/exec.d.ts.map +1 -0
  21. package/dist/executors/exec.js +169 -0
  22. package/dist/executors/exec.js.map +1 -0
  23. package/dist/executors/index.d.ts +54 -0
  24. package/dist/executors/index.d.ts.map +1 -0
  25. package/dist/executors/index.js +49 -0
  26. package/dist/executors/index.js.map +1 -0
  27. package/dist/executors/manual.d.ts +7 -0
  28. package/dist/executors/manual.d.ts.map +1 -0
  29. package/dist/executors/manual.js +25 -0
  30. package/dist/executors/manual.js.map +1 -0
  31. package/dist/executors/notify.d.ts +48 -0
  32. package/dist/executors/notify.d.ts.map +1 -0
  33. package/dist/executors/notify.js +313 -0
  34. package/dist/executors/notify.js.map +1 -0
  35. package/dist/index.d.ts +12 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +12 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/runner.d.ts +11 -0
  40. package/dist/runner.d.ts.map +1 -0
  41. package/dist/runner.js +1061 -0
  42. package/dist/runner.js.map +1 -0
  43. package/dist/templating/index.d.ts +43 -0
  44. package/dist/templating/index.d.ts.map +1 -0
  45. package/dist/templating/index.js +778 -0
  46. package/dist/templating/index.js.map +1 -0
  47. package/dist/worker.d.ts +26 -0
  48. package/dist/worker.d.ts.map +1 -0
  49. package/dist/worker.js +320 -0
  50. package/dist/worker.js.map +1 -0
  51. package/dist/workflowIdentity.d.ts +3 -0
  52. package/dist/workflowIdentity.d.ts.map +1 -0
  53. package/dist/workflowIdentity.js +12 -0
  54. package/dist/workflowIdentity.js.map +1 -0
  55. package/package.json +44 -0
@@ -0,0 +1,54 @@
1
+ import type { ArtifactType, EventType, StepDefinition, StepKind, StepRunStatus } from '@claushaas/ergon-shared';
2
+ export interface ExecutorArtifact {
3
+ name: string;
4
+ type: ArtifactType;
5
+ value: unknown;
6
+ }
7
+ export interface ExecutorEvent {
8
+ payload?: Record<string, unknown>;
9
+ type: EventType;
10
+ }
11
+ export interface ExecutionRunMetadata {
12
+ readonly attempt: number;
13
+ readonly runId: string;
14
+ readonly stepIndex: number;
15
+ readonly workflowId: string;
16
+ readonly workflowVersion: number;
17
+ readonly workerId?: string;
18
+ }
19
+ export interface ExecutionContext {
20
+ readonly artifacts: Readonly<Record<string, unknown>>;
21
+ getArtifact: (name: string) => unknown;
22
+ getRequiredArtifact: (name: string) => unknown;
23
+ hasArtifact: (name: string) => boolean;
24
+ readonly inputs: Readonly<Record<string, unknown>>;
25
+ readonly run: ExecutionRunMetadata;
26
+ readonly signal: AbortSignal;
27
+ }
28
+ export interface CreateExecutionContextOptions {
29
+ artifacts?: Record<string, unknown>;
30
+ inputs: Record<string, unknown>;
31
+ run: ExecutionRunMetadata;
32
+ signal?: AbortSignal;
33
+ }
34
+ export interface ExecutorResult {
35
+ artifacts?: ExecutorArtifact[];
36
+ events?: ExecutorEvent[];
37
+ outputs?: Record<string, unknown>;
38
+ status: Extract<StepRunStatus, 'failed' | 'skipped' | 'succeeded' | 'waiting_manual'>;
39
+ }
40
+ export interface Executor<TStep extends StepDefinition = StepDefinition> {
41
+ readonly kind: TStep['kind'];
42
+ execute(step: TStep, context: ExecutionContext): Promise<ExecutorResult>;
43
+ }
44
+ type RegisteredExecutor = Executor<StepDefinition>;
45
+ export declare function createExecutionContext(options: CreateExecutionContextOptions): ExecutionContext;
46
+ export declare class ExecutorRegistry {
47
+ private readonly executors;
48
+ constructor(executors?: RegisteredExecutor[]);
49
+ get(kind: StepKind): RegisteredExecutor;
50
+ has(kind: StepKind): boolean;
51
+ register(executor: RegisteredExecutor): void;
52
+ }
53
+ export {};
54
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/executors/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,YAAY,EACZ,SAAS,EACT,cAAc,EACd,QAAQ,EACR,aAAa,EACb,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,IAAI,EAAE,SAAS,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/C,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,GAAG,EAAE,oBAAoB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC7B;AAED,MAAM,WAAW,6BAA6B;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,GAAG,EAAE,oBAAoB,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC9B,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,EAAE,OAAO,CACd,aAAa,EACb,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,gBAAgB,CACrD,CAAC;CACF;AAED,MAAM,WAAW,QAAQ,CAAC,KAAK,SAAS,cAAc,GAAG,cAAc;IACtE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACzE;AAED,KAAK,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;AAEnD,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,6BAA6B,GACpC,gBAAgB,CAwBlB;AAED,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2C;gBAElD,SAAS,GAAE,kBAAkB,EAAO;IAMhD,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,kBAAkB;IAQvC,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO;IAI5B,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;CAQnD"}
@@ -0,0 +1,49 @@
1
+ export function createExecutionContext(options) {
2
+ const artifacts = Object.freeze({ ...(options.artifacts ?? {}) });
3
+ const inputs = Object.freeze({ ...options.inputs });
4
+ const run = Object.freeze({ ...options.run });
5
+ const signal = options.signal ?? new AbortController().signal;
6
+ return {
7
+ artifacts,
8
+ getArtifact(name) {
9
+ return artifacts[name];
10
+ },
11
+ getRequiredArtifact(name) {
12
+ if (name in artifacts) {
13
+ return artifacts[name];
14
+ }
15
+ throw new Error(`Artifact "${name}" was not found in execution context`);
16
+ },
17
+ hasArtifact(name) {
18
+ return name in artifacts;
19
+ },
20
+ inputs,
21
+ run,
22
+ signal,
23
+ };
24
+ }
25
+ export class ExecutorRegistry {
26
+ executors = new Map();
27
+ constructor(executors = []) {
28
+ for (const executor of executors) {
29
+ this.register(executor);
30
+ }
31
+ }
32
+ get(kind) {
33
+ const executor = this.executors.get(kind);
34
+ if (!executor) {
35
+ throw new Error(`No executor registered for step kind "${kind}"`);
36
+ }
37
+ return executor;
38
+ }
39
+ has(kind) {
40
+ return this.executors.has(kind);
41
+ }
42
+ register(executor) {
43
+ if (this.executors.has(executor.kind)) {
44
+ throw new Error(`Executor already registered for step kind "${executor.kind}"`);
45
+ }
46
+ this.executors.set(executor.kind, executor);
47
+ }
48
+ }
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/executors/index.ts"],"names":[],"mappings":"AA8DA,MAAM,UAAU,sBAAsB,CACrC,OAAsC;IAEtC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC,MAAM,CAAC;IAE9D,OAAO;QACN,SAAS;QACT,WAAW,CAAC,IAAY;YACvB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QACD,mBAAmB,CAAC,IAAY;YAC/B,IAAI,IAAI,IAAI,SAAS,EAAE,CAAC;gBACvB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,sCAAsC,CAAC,CAAC;QAC1E,CAAC;QACD,WAAW,CAAC,IAAY;YACvB,OAAO,IAAI,IAAI,SAAS,CAAC;QAC1B,CAAC;QACD,MAAM;QACN,GAAG;QACH,MAAM;KACN,CAAC;AACH,CAAC;AAED,MAAM,OAAO,gBAAgB;IACX,SAAS,GAAG,IAAI,GAAG,EAAgC,CAAC;IAErE,YAAmB,YAAkC,EAAE;QACtD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;IACF,CAAC;IAEM,GAAG,CAAC,IAAc;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,GAAG,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,QAAQ,CAAC;IACjB,CAAC;IAEM,GAAG,CAAC,IAAc;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAEM,QAAQ,CAAC,QAA4B;QAC3C,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CACd,8CAA8C,QAAQ,CAAC,IAAI,GAAG,CAC9D,CAAC;QACH,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;CACD"}
@@ -0,0 +1,7 @@
1
+ import type { ManualStepDefinition } from '@claushaas/ergon-shared';
2
+ import type { ExecutionContext, Executor, ExecutorResult } from './index.js';
3
+ export declare class ManualExecutor implements Executor<ManualStepDefinition> {
4
+ readonly kind: "manual";
5
+ execute(step: ManualStepDefinition, context: ExecutionContext): Promise<ExecutorResult>;
6
+ }
7
+ //# sourceMappingURL=manual.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manual.d.ts","sourceRoot":"","sources":["../../src/executors/manual.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7E,qBAAa,cAAe,YAAW,QAAQ,CAAC,oBAAoB,CAAC;IACpE,SAAgB,IAAI,EAAG,QAAQ,CAAU;IAE5B,OAAO,CACnB,IAAI,EAAE,oBAAoB,EAC1B,OAAO,EAAE,gBAAgB,GACvB,OAAO,CAAC,cAAc,CAAC;CAsB1B"}
@@ -0,0 +1,25 @@
1
+ import { renderStepRequestPayload } from '../templating/index.js';
2
+ export class ManualExecutor {
3
+ kind = 'manual';
4
+ async execute(step, context) {
5
+ const message = renderStepRequestPayload(step, {
6
+ artifacts: context.artifacts,
7
+ inputs: context.inputs,
8
+ }).message ?? undefined;
9
+ const payload = {
10
+ runId: context.run.runId,
11
+ stepId: step.id,
12
+ ...(message ? { message } : {}),
13
+ };
14
+ return {
15
+ events: [
16
+ {
17
+ payload,
18
+ type: 'manual_waiting',
19
+ },
20
+ ],
21
+ status: 'waiting_manual',
22
+ };
23
+ }
24
+ }
25
+ //# sourceMappingURL=manual.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manual.js","sourceRoot":"","sources":["../../src/executors/manual.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAGlE,MAAM,OAAO,cAAc;IACV,IAAI,GAAG,QAAiB,CAAC;IAElC,KAAK,CAAC,OAAO,CACnB,IAA0B,EAC1B,OAAyB;QAEzB,MAAM,OAAO,GACZ,wBAAwB,CAAC,IAAI,EAAE;YAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;SACtB,CAAC,CAAC,OAAO,IAAI,SAAS,CAAC;QACzB,MAAM,OAAO,GAAG;YACf,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK;YACxB,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/B,CAAC;QAEF,OAAO;YACN,MAAM,EAAE;gBACP;oBACC,OAAO;oBACP,IAAI,EAAE,gBAAgB;iBACtB;aACD;YACD,MAAM,EAAE,gBAAgB;SACxB,CAAC;IACH,CAAC;CACD"}
@@ -0,0 +1,48 @@
1
+ import { lookup as dnsLookup } from 'node:dns/promises';
2
+ import type { CliClientOptions } from '@claushaas/ergon-clients';
3
+ import { type NotifyStepDefinition } from '@claushaas/ergon-shared';
4
+ import type { ExecutionContext, Executor, ExecutorResult } from './index.js';
5
+ export interface NotifyWebhookPayload {
6
+ channel: string;
7
+ message: string;
8
+ runId: string;
9
+ stepId: string;
10
+ target: string;
11
+ workflowId: string;
12
+ }
13
+ export interface NotifyWebhookResult {
14
+ status?: number;
15
+ }
16
+ export interface NotifyOpenClawResult {
17
+ status?: number;
18
+ }
19
+ export type HostnameResolver = typeof dnsLookup;
20
+ export type NotifyLogger = (message: string) => void;
21
+ export type NotifyWebhookSender = (payload: NotifyWebhookPayload & {
22
+ signal?: AbortSignal;
23
+ }) => Promise<NotifyWebhookResult>;
24
+ export type NotifyOpenClawSender = (payload: {
25
+ message: string;
26
+ signal?: AbortSignal;
27
+ target: string;
28
+ }) => Promise<NotifyOpenClawResult>;
29
+ export interface NotifyExecutorOptions {
30
+ log?: NotifyLogger;
31
+ openclaw?: CliClientOptions;
32
+ resolveHostname?: HostnameResolver;
33
+ sendOpenClawMessage?: NotifyOpenClawSender;
34
+ sendWebhook?: NotifyWebhookSender;
35
+ }
36
+ export declare function defaultSendWebhook(payload: NotifyWebhookPayload & {
37
+ signal?: AbortSignal;
38
+ }): Promise<NotifyWebhookResult>;
39
+ export declare class NotifyExecutor implements Executor<NotifyStepDefinition> {
40
+ readonly kind: "notify";
41
+ private readonly log;
42
+ private readonly sendOpenClawMessage;
43
+ private readonly resolveHostname;
44
+ private readonly sendWebhook;
45
+ constructor(options?: NotifyExecutorOptions);
46
+ execute(step: NotifyStepDefinition, context: ExecutionContext): Promise<ExecutorResult>;
47
+ }
48
+ //# sourceMappingURL=notify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/executors/notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,KAAK,EAAE,gBAAgB,EAAY,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAEN,KAAK,oBAAoB,EACzB,MAAM,yBAAyB,CAAC;AAKjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7E,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,gBAAgB,GAAG,OAAO,SAAS,CAAC;AAChD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AACrD,MAAM,MAAM,mBAAmB,GAAG,CACjC,OAAO,EAAE,oBAAoB,GAAG;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KACpD,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAClC,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CACf,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAEpC,MAAM,WAAW,qBAAqB;IACrC,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,mBAAmB,CAAC,EAAE,oBAAoB,CAAC;IAC3C,WAAW,CAAC,EAAE,mBAAmB,CAAC;CAClC;AA+HD,wBAAsB,kBAAkB,CACvC,OAAO,EAAE,oBAAoB,GAAG;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GACtD,OAAO,CAAC,mBAAmB,CAAC,CAyB9B;AA0HD,qBAAa,cAAe,YAAW,QAAQ,CAAC,oBAAoB,CAAC;IACpE,SAAgB,IAAI,EAAG,QAAQ,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAuB;IAC3D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmB;IACnD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;gBAE/B,OAAO,GAAE,qBAA0B;IAQzC,OAAO,CACnB,IAAI,EAAE,oBAAoB,EAC1B,OAAO,EAAE,gBAAgB,GACvB,OAAO,CAAC,cAAc,CAAC;CA+G1B"}
@@ -0,0 +1,313 @@
1
+ import { lookup as dnsLookup } from 'node:dns/promises';
2
+ import { isIP } from 'node:net';
3
+ import { createChildProcessAbortController, } from '@claushaas/ergon-shared';
4
+ import { interpolateTemplateString, renderStepRequestPayload, } from '../templating/index.js';
5
+ const RUN_SUMMARY_ARTIFACT_NAME = 'run.summary';
6
+ const DEFAULT_OPENCLAW_COMMAND = 'openclaw';
7
+ const DEFAULT_OPENCLAW_ARGS = ['message', 'send'];
8
+ function sanitizeLoggedMessage(message) {
9
+ return JSON.stringify(message.replaceAll('\u0000', ''));
10
+ }
11
+ function buildRunSummaryArtifact(context, channel, step, message, target) {
12
+ return {
13
+ channel,
14
+ message,
15
+ run_id: context.run.runId,
16
+ step_id: step.id,
17
+ ...(target ? { target } : {}),
18
+ workflow_id: context.run.workflowId,
19
+ workflow_version: context.run.workflowVersion,
20
+ };
21
+ }
22
+ function formatStableStdoutMessage(summary) {
23
+ return [
24
+ `[ergon-flow] workflow=${summary.workflow_id} run=${summary.run_id} step=${summary.step_id} channel=${summary.channel}`,
25
+ summary.message,
26
+ ].join('\n');
27
+ }
28
+ function createRunSummaryArtifact(summary) {
29
+ return {
30
+ name: RUN_SUMMARY_ARTIFACT_NAME,
31
+ type: 'json',
32
+ value: summary,
33
+ };
34
+ }
35
+ function isBlockedIpAddress(address) {
36
+ if (address === '::1') {
37
+ return true;
38
+ }
39
+ if (address.startsWith('fe80:') ||
40
+ address.startsWith('fc') ||
41
+ address.startsWith('fd')) {
42
+ return true;
43
+ }
44
+ const parts = address.split('.').map((part) => Number.parseInt(part, 10));
45
+ if (parts.length !== 4 || parts.some((part) => Number.isNaN(part))) {
46
+ return false;
47
+ }
48
+ const [first, second] = parts;
49
+ if (first === 10 || first === 127 || first === 0) {
50
+ return true;
51
+ }
52
+ if (first === 169 && second === 254) {
53
+ return true;
54
+ }
55
+ if (first === 172 && second !== undefined && second >= 16 && second <= 31) {
56
+ return true;
57
+ }
58
+ if (first === 192 && second === 168) {
59
+ return true;
60
+ }
61
+ return false;
62
+ }
63
+ async function validateWebhookTarget(target, resolveHostname) {
64
+ let parsedUrl;
65
+ try {
66
+ parsedUrl = new URL(target);
67
+ }
68
+ catch {
69
+ throw new Error('Notify webhook target must be a valid https URL');
70
+ }
71
+ if (parsedUrl.protocol !== 'https:') {
72
+ throw new Error('Notify webhook target must use https');
73
+ }
74
+ const normalizedHostname = parsedUrl.hostname
75
+ .replace(/\.$/, '')
76
+ .toLowerCase();
77
+ if (!normalizedHostname ||
78
+ normalizedHostname === 'localhost' ||
79
+ normalizedHostname.endsWith('.localhost')) {
80
+ throw new Error('Notify webhook target must use a non-local hostname');
81
+ }
82
+ if (isIP(normalizedHostname) !== 0) {
83
+ throw new Error('Notify webhook target must not use an IP address');
84
+ }
85
+ if (parsedUrl.username || parsedUrl.password) {
86
+ throw new Error('Notify webhook target must not include credentials');
87
+ }
88
+ const resolvedAddresses = await resolveHostname(normalizedHostname, {
89
+ all: true,
90
+ family: 0,
91
+ });
92
+ if (resolvedAddresses.length === 0) {
93
+ throw new Error('Notify webhook target must resolve to a public address');
94
+ }
95
+ if (resolvedAddresses.some((entry) => isBlockedIpAddress(entry.address))) {
96
+ throw new Error('Notify webhook target must resolve to a public address');
97
+ }
98
+ return parsedUrl;
99
+ }
100
+ export async function defaultSendWebhook(payload) {
101
+ const response = await fetch(payload.target, {
102
+ body: JSON.stringify({
103
+ channel: payload.channel,
104
+ message: payload.message,
105
+ runId: payload.runId,
106
+ stepId: payload.stepId,
107
+ workflowId: payload.workflowId,
108
+ }),
109
+ headers: {
110
+ 'content-type': 'application/json',
111
+ },
112
+ method: 'POST',
113
+ redirect: 'error',
114
+ signal: payload.signal,
115
+ });
116
+ if (!response.ok) {
117
+ throw new Error(`Notify webhook request failed with status ${response.status}`);
118
+ }
119
+ return {
120
+ status: response.status,
121
+ };
122
+ }
123
+ async function defaultSpawn(options) {
124
+ if (options.spawn) {
125
+ const result = await options.spawn({
126
+ args: options.args,
127
+ command: options.command,
128
+ env: options.env,
129
+ input: options.input,
130
+ signal: options.signal,
131
+ });
132
+ return {
133
+ code: result.code,
134
+ signal: result.signal,
135
+ stderr: result.stderr,
136
+ stdout: result.stdout,
137
+ };
138
+ }
139
+ const { spawn } = await import('node:child_process');
140
+ return await new Promise((resolve, reject) => {
141
+ const child = spawn(options.command, options.args, {
142
+ env: options.env ? { ...process.env, ...options.env } : process.env,
143
+ stdio: 'pipe',
144
+ });
145
+ let stdout = '';
146
+ let stderr = '';
147
+ let settled = false;
148
+ const { cleanupAbort, registerAbort } = createChildProcessAbortController({
149
+ abortMessage: 'Notify command aborted',
150
+ child,
151
+ isSettled: () => settled,
152
+ onAbort: reject,
153
+ setSettled: () => {
154
+ settled = true;
155
+ },
156
+ signal: options.signal,
157
+ });
158
+ const settle = (handler) => {
159
+ if (settled) {
160
+ cleanupAbort();
161
+ return undefined;
162
+ }
163
+ settled = true;
164
+ cleanupAbort();
165
+ return handler();
166
+ };
167
+ const fail = (error) => {
168
+ settle(() => reject(error));
169
+ };
170
+ child.stdout.on('data', (chunk) => {
171
+ stdout += chunk.toString();
172
+ });
173
+ child.stderr.on('data', (chunk) => {
174
+ stderr += chunk.toString();
175
+ });
176
+ child.on('error', fail);
177
+ child.on('close', (code, signal) => {
178
+ settle(() => resolve({
179
+ code,
180
+ signal,
181
+ stderr,
182
+ stdout,
183
+ }));
184
+ });
185
+ if (registerAbort()) {
186
+ return;
187
+ }
188
+ child.stdin.write(options.input);
189
+ child.stdin.end();
190
+ });
191
+ }
192
+ function createOpenClawSender(options = {}) {
193
+ const command = options.command ?? DEFAULT_OPENCLAW_COMMAND;
194
+ const args = [...(options.args ?? []), ...DEFAULT_OPENCLAW_ARGS];
195
+ const env = options.env;
196
+ const spawn = options.spawn;
197
+ return async ({ message, signal, target }) => {
198
+ const result = await defaultSpawn({
199
+ args: [...args, target],
200
+ command,
201
+ env,
202
+ input: message,
203
+ signal,
204
+ spawn,
205
+ });
206
+ if (result.code !== 0) {
207
+ const detail = result.stderr.trim() || result.stdout.trim();
208
+ throw new Error(detail
209
+ ? `OpenClaw notify command failed (${String(result.code)}): ${detail}`
210
+ : `OpenClaw notify command failed (${String(result.code)})`);
211
+ }
212
+ return {
213
+ status: 0,
214
+ };
215
+ };
216
+ }
217
+ export class NotifyExecutor {
218
+ kind = 'notify';
219
+ log;
220
+ sendOpenClawMessage;
221
+ resolveHostname;
222
+ sendWebhook;
223
+ constructor(options = {}) {
224
+ this.log = options.log ?? console.log;
225
+ this.sendOpenClawMessage =
226
+ options.sendOpenClawMessage ?? createOpenClawSender(options.openclaw);
227
+ this.resolveHostname = options.resolveHostname ?? dnsLookup;
228
+ this.sendWebhook = options.sendWebhook ?? defaultSendWebhook;
229
+ }
230
+ async execute(step, context) {
231
+ const payload = renderStepRequestPayload(step, {
232
+ artifacts: context.artifacts,
233
+ inputs: context.inputs,
234
+ });
235
+ if (!payload.message) {
236
+ throw new Error(`Notify step "${step.id}" did not render a message`);
237
+ }
238
+ const channel = interpolateTemplateString(step.channel, {
239
+ artifacts: context.artifacts,
240
+ inputs: context.inputs,
241
+ });
242
+ switch (channel) {
243
+ case 'stdout': {
244
+ const summary = buildRunSummaryArtifact(context, channel, step, payload.message);
245
+ this.log(sanitizeLoggedMessage(formatStableStdoutMessage(summary)));
246
+ return {
247
+ artifacts: [createRunSummaryArtifact(summary)],
248
+ outputs: {
249
+ ...summary,
250
+ },
251
+ status: 'succeeded',
252
+ };
253
+ }
254
+ case 'webhook': {
255
+ if (!step.target) {
256
+ throw new Error(`Notify step "${step.id}" requires a target`);
257
+ }
258
+ const target = interpolateTemplateString(step.target, {
259
+ artifacts: context.artifacts,
260
+ inputs: context.inputs,
261
+ });
262
+ const validatedTarget = await validateWebhookTarget(target, this.resolveHostname);
263
+ const result = await this.sendWebhook({
264
+ channel,
265
+ message: payload.message,
266
+ runId: context.run.runId,
267
+ signal: context.signal,
268
+ stepId: step.id,
269
+ target: validatedTarget.toString(),
270
+ workflowId: context.run.workflowId,
271
+ });
272
+ const summary = buildRunSummaryArtifact(context, channel, step, payload.message, validatedTarget.toString());
273
+ return {
274
+ artifacts: [createRunSummaryArtifact(summary)],
275
+ outputs: {
276
+ ...summary,
277
+ status: result.status,
278
+ },
279
+ status: 'succeeded',
280
+ };
281
+ }
282
+ case 'openclaw': {
283
+ if (!step.target) {
284
+ throw new Error(`Notify step "${step.id}" requires a target`);
285
+ }
286
+ const target = interpolateTemplateString(step.target, {
287
+ artifacts: context.artifacts,
288
+ inputs: context.inputs,
289
+ });
290
+ if (target.startsWith('-')) {
291
+ throw new Error(`Notify step "${step.id}" target cannot start with a hyphen`);
292
+ }
293
+ await this.sendOpenClawMessage({
294
+ message: payload.message,
295
+ signal: context.signal,
296
+ target,
297
+ });
298
+ const summary = buildRunSummaryArtifact(context, channel, step, payload.message, target);
299
+ return {
300
+ artifacts: [createRunSummaryArtifact(summary)],
301
+ outputs: {
302
+ ...summary,
303
+ status: 0,
304
+ },
305
+ status: 'succeeded',
306
+ };
307
+ }
308
+ default:
309
+ throw new Error(`Notify step "${step.id}" uses unsupported channel "${step.channel}"`);
310
+ }
311
+ }
312
+ }
313
+ //# sourceMappingURL=notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/executors/notify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export * from './defaults.js';
2
+ export * from './executors/agent.js';
3
+ export * from './executors/artifact.js';
4
+ export * from './executors/condition.js';
5
+ export * from './executors/exec.js';
6
+ export * from './executors/index.js';
7
+ export * from './executors/manual.js';
8
+ export * from './executors/notify.js';
9
+ export * from './runner.js';
10
+ export * from './templating/index.js';
11
+ export * from './worker.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ export * from './defaults.js';
2
+ export * from './executors/agent.js';
3
+ export * from './executors/artifact.js';
4
+ export * from './executors/condition.js';
5
+ export * from './executors/exec.js';
6
+ export * from './executors/index.js';
7
+ export * from './executors/manual.js';
8
+ export * from './executors/notify.js';
9
+ export * from './runner.js';
10
+ export * from './templating/index.js';
11
+ export * from './worker.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,aAAa,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { DatabaseSync } from 'node:sqlite';
2
+ import { type RunClaim } from '@claushaas/ergon-storage';
3
+ import { type ExecutorRegistry } from './executors/index.js';
4
+ export interface ExecuteRunOptions {
5
+ artifactBaseDir?: string;
6
+ db: DatabaseSync;
7
+ executors: ExecutorRegistry;
8
+ rootDir?: string;
9
+ }
10
+ export declare function executeRun(runId: string, claim: RunClaim, options: ExecuteRunOptions): Promise<import("@claushaas/ergon-storage").WorkflowRunRow | null>;
11
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQhD,OAAO,EAiBN,KAAK,QAAQ,EAMb,MAAM,0BAA0B,CAAC;AAMlC,OAAO,EAEN,KAAK,gBAAgB,EACrB,MAAM,sBAAsB,CAAC;AAY9B,MAAM,WAAW,iBAAiB;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,EAAE,EAAE,YAAY,CAAC;IACjB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AA+pDD,wBAAsB,UAAU,CAC/B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,iBAAiB,qEAmH1B"}