@diff-review-system/drs 4.0.1 → 4.1.0
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/.pi/agents/review/unified-reviewer.md +2 -6
- package/.pi/agents/task/review-assistant.md +22 -0
- package/.pi/workflows/github-pr-fix-review-issues-stacked.yaml +10 -4
- package/.pi/workflows/github-pr-review-post.yaml +0 -1
- package/.pi/workflows/github-pr-review.yaml +14 -8
- package/.pi/workflows/github-pr-visual-explain.yaml +46 -1
- package/.pi/workflows/gitlab-mr-fix-review-issues-stacked.yaml +10 -4
- package/.pi/workflows/gitlab-mr-review.yaml +14 -8
- package/.pi/workflows/gitlab-mr-visual-explain.yaml +46 -1
- package/.pi/workflows/local-fix-review-issues.yaml +13 -6
- package/.pi/workflows/local-review.yaml +7 -1
- package/.pi/workflows/local-visual-explain.yaml +46 -1
- package/.pi/workflows/temporal-control-smoke.yaml +63 -0
- package/README.md +39 -0
- package/dist/cli/index.js +211 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +6 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +29 -10
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/run-agent.d.ts +2 -7
- package/dist/cli/run-agent.d.ts.map +1 -1
- package/dist/cli/run-agent.js.map +1 -1
- package/dist/cli/workflow-executor-selection.d.ts +3 -0
- package/dist/cli/workflow-executor-selection.d.ts.map +1 -0
- package/dist/cli/workflow-executor-selection.js +15 -0
- package/dist/cli/workflow-executor-selection.js.map +1 -0
- package/dist/cli/workflow.d.ts +38 -42
- package/dist/cli/workflow.d.ts.map +1 -1
- package/dist/cli/workflow.js +190 -838
- package/dist/cli/workflow.js.map +1 -1
- package/dist/lib/agent-result.d.ts +8 -0
- package/dist/lib/agent-result.d.ts.map +1 -0
- package/dist/lib/agent-result.js +2 -0
- package/dist/lib/agent-result.js.map +1 -0
- package/dist/lib/config.d.ts +21 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/output-paths.d.ts +0 -1
- package/dist/lib/output-paths.d.ts.map +1 -1
- package/dist/lib/output-paths.js +0 -1
- package/dist/lib/output-paths.js.map +1 -1
- package/dist/lib/project-setup.d.ts +10 -0
- package/dist/lib/project-setup.d.ts.map +1 -0
- package/dist/lib/project-setup.js +25 -0
- package/dist/lib/project-setup.js.map +1 -0
- package/dist/lib/review-artifact-store.d.ts +16 -0
- package/dist/lib/review-artifact-store.d.ts.map +1 -0
- package/dist/lib/review-artifact-store.js +84 -0
- package/dist/lib/review-artifact-store.js.map +1 -0
- package/dist/lib/review-artifact.d.ts.map +1 -1
- package/dist/lib/review-artifact.js +1 -0
- package/dist/lib/review-artifact.js.map +1 -1
- package/dist/lib/review-core.d.ts +1 -0
- package/dist/lib/review-core.d.ts.map +1 -1
- package/dist/lib/review-core.js +11 -14
- package/dist/lib/review-core.js.map +1 -1
- package/dist/lib/review-parser.d.ts.map +1 -1
- package/dist/lib/review-parser.js +15 -12
- package/dist/lib/review-parser.js.map +1 -1
- package/dist/lib/skills.d.ts +16 -0
- package/dist/lib/skills.d.ts.map +1 -0
- package/dist/lib/skills.js +140 -0
- package/dist/lib/skills.js.map +1 -0
- package/dist/lib/workflow/artifact-store.d.ts +71 -0
- package/dist/lib/workflow/artifact-store.d.ts.map +1 -0
- package/dist/lib/workflow/artifact-store.js +121 -0
- package/dist/lib/workflow/artifact-store.js.map +1 -0
- package/dist/lib/workflow/compiled-plan.d.ts +87 -0
- package/dist/lib/workflow/compiled-plan.d.ts.map +1 -0
- package/dist/lib/workflow/compiled-plan.js +62 -0
- package/dist/lib/workflow/compiled-plan.js.map +1 -0
- package/dist/lib/workflow/executor.d.ts +18 -0
- package/dist/lib/workflow/executor.d.ts.map +1 -0
- package/dist/lib/workflow/executor.js +2 -0
- package/dist/lib/workflow/executor.js.map +1 -0
- package/dist/lib/workflow/graph.d.ts +30 -0
- package/dist/lib/workflow/graph.d.ts.map +1 -0
- package/dist/lib/workflow/graph.js +139 -0
- package/dist/lib/workflow/graph.js.map +1 -0
- package/dist/lib/workflow/input.d.ts +4 -0
- package/dist/lib/workflow/input.d.ts.map +1 -0
- package/dist/lib/workflow/input.js +4 -0
- package/dist/lib/workflow/input.js.map +1 -0
- package/dist/lib/workflow/node-executor.d.ts +19 -0
- package/dist/lib/workflow/node-executor.d.ts.map +1 -0
- package/dist/lib/workflow/node-executor.js +2 -0
- package/dist/lib/workflow/node-executor.js.map +1 -0
- package/dist/lib/workflow/planning.d.ts +51 -0
- package/dist/lib/workflow/planning.d.ts.map +1 -0
- package/dist/lib/workflow/planning.js +814 -0
- package/dist/lib/workflow/planning.js.map +1 -0
- package/dist/lib/workflow/types.d.ts +66 -0
- package/dist/lib/workflow/types.d.ts.map +1 -0
- package/dist/lib/workflow/types.js +2 -0
- package/dist/lib/workflow/types.js.map +1 -0
- package/dist/lib/write-json-output.d.ts.map +1 -1
- package/dist/lib/write-json-output.js +3 -8
- package/dist/lib/write-json-output.js.map +1 -1
- package/dist/pi/sdk.d.ts.map +1 -1
- package/dist/pi/sdk.js +6 -2
- package/dist/pi/sdk.js.map +1 -1
- package/dist/runtime/built-in-paths.d.ts +1 -0
- package/dist/runtime/built-in-paths.d.ts.map +1 -1
- package/dist/runtime/built-in-paths.js +7 -0
- package/dist/runtime/built-in-paths.js.map +1 -1
- package/dist/temporal/activities.d.ts +26 -0
- package/dist/temporal/activities.d.ts.map +1 -0
- package/dist/temporal/activities.js +219 -0
- package/dist/temporal/activities.js.map +1 -0
- package/dist/temporal/config.d.ts +4 -0
- package/dist/temporal/config.d.ts.map +1 -0
- package/dist/temporal/config.js +36 -0
- package/dist/temporal/config.js.map +1 -0
- package/dist/temporal/executor.d.ts +7 -0
- package/dist/temporal/executor.d.ts.map +1 -0
- package/dist/temporal/executor.js +233 -0
- package/dist/temporal/executor.js.map +1 -0
- package/dist/temporal/retry-policy.d.ts +28 -0
- package/dist/temporal/retry-policy.d.ts.map +1 -0
- package/dist/temporal/retry-policy.js +56 -0
- package/dist/temporal/retry-policy.js.map +1 -0
- package/dist/temporal/types.d.ts +86 -0
- package/dist/temporal/types.d.ts.map +1 -0
- package/dist/temporal/types.js +2 -0
- package/dist/temporal/types.js.map +1 -0
- package/dist/temporal/worker.d.ts +3 -0
- package/dist/temporal/worker.d.ts.map +1 -0
- package/dist/temporal/worker.js +18 -0
- package/dist/temporal/worker.js.map +1 -0
- package/dist/temporal/workflow-id.d.ts +27 -0
- package/dist/temporal/workflow-id.d.ts.map +1 -0
- package/dist/temporal/workflow-id.js +53 -0
- package/dist/temporal/workflow-id.js.map +1 -0
- package/dist/temporal/workflows.d.ts +6 -0
- package/dist/temporal/workflows.d.ts.map +1 -0
- package/dist/temporal/workflows.js +342 -0
- package/dist/temporal/workflows.js.map +1 -0
- package/package.json +6 -1
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { WorkflowNodeConfig } from '../lib/config.js';
|
|
2
|
+
import type { CompiledWorkflowPlan } from '../lib/workflow/compiled-plan.js';
|
|
3
|
+
import type { WorkflowRunOptions, WorkflowRunResult, WorkflowTemplateContext, WorkflowActivityIdempotencyContext } from '../lib/workflow/types.js';
|
|
4
|
+
import type { TemporalArtifactRef } from '../lib/workflow/artifact-store.js';
|
|
5
|
+
export interface TemporalConfig {
|
|
6
|
+
address: string;
|
|
7
|
+
namespace: string;
|
|
8
|
+
taskQueue: string;
|
|
9
|
+
workflowIdPrefix: string;
|
|
10
|
+
workspace: TemporalWorkspaceConfig;
|
|
11
|
+
}
|
|
12
|
+
export interface TemporalWorkspaceConfig {
|
|
13
|
+
mode: 'local' | 'managed';
|
|
14
|
+
root: string;
|
|
15
|
+
}
|
|
16
|
+
export interface TemporalManagedWorkspaceInput {
|
|
17
|
+
mode: 'managed';
|
|
18
|
+
root: string;
|
|
19
|
+
repoUrl: string;
|
|
20
|
+
ref: string;
|
|
21
|
+
}
|
|
22
|
+
export interface TemporalWorkflowInput {
|
|
23
|
+
plan: CompiledWorkflowPlan;
|
|
24
|
+
inputs: Record<string, string>;
|
|
25
|
+
workingDir: string;
|
|
26
|
+
options?: Pick<WorkflowRunOptions, 'debug' | 'thinkingLevel'>;
|
|
27
|
+
workspace?: TemporalManagedWorkspaceInput;
|
|
28
|
+
}
|
|
29
|
+
export interface PrepareWorkspaceActivityInput {
|
|
30
|
+
workspace: TemporalManagedWorkspaceInput;
|
|
31
|
+
workflowId: string;
|
|
32
|
+
runId: string;
|
|
33
|
+
}
|
|
34
|
+
export interface PrepareWorkspaceActivityResult {
|
|
35
|
+
workingDir: string;
|
|
36
|
+
}
|
|
37
|
+
export interface ResolveArtifactRefsActivityInput {
|
|
38
|
+
workingDir: string;
|
|
39
|
+
refs: Record<string, TemporalArtifactRef>;
|
|
40
|
+
}
|
|
41
|
+
export type ActivityIdempotencyContext = WorkflowActivityIdempotencyContext;
|
|
42
|
+
export type ScheduledActivityIdempotencyContext = Omit<ActivityIdempotencyContext, 'attempt'> & {
|
|
43
|
+
attempt?: number;
|
|
44
|
+
};
|
|
45
|
+
export interface RunWorkflowNodeActivityInput {
|
|
46
|
+
workingDir: string;
|
|
47
|
+
nodeId: string;
|
|
48
|
+
node: WorkflowNodeConfig;
|
|
49
|
+
context: WorkflowTemplateContext;
|
|
50
|
+
options?: Pick<WorkflowRunOptions, 'debug' | 'thinkingLevel'>;
|
|
51
|
+
idempotencyContext?: ScheduledActivityIdempotencyContext;
|
|
52
|
+
/**
|
|
53
|
+
* When true, the activity constructs a LocalWorkflowArtifactStore for the
|
|
54
|
+
* worker's working directory and offloads large node outputs as refs so
|
|
55
|
+
* they stay out of Temporal event history.
|
|
56
|
+
*/
|
|
57
|
+
offloadArtifacts?: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Inline size threshold in bytes. Values larger than this become refs when
|
|
60
|
+
* offloadArtifacts is true. Defaults to 64KB.
|
|
61
|
+
*/
|
|
62
|
+
artifactInlineMaxBytes?: number;
|
|
63
|
+
}
|
|
64
|
+
export type TemporalWorkflowNodeQueryStatus = 'pending' | 'running' | 'success' | 'skipped';
|
|
65
|
+
export interface TemporalWorkflowNodeStatusSnapshot {
|
|
66
|
+
id: string;
|
|
67
|
+
status: TemporalWorkflowNodeQueryStatus;
|
|
68
|
+
action?: string;
|
|
69
|
+
agent?: string;
|
|
70
|
+
control?: string;
|
|
71
|
+
}
|
|
72
|
+
export interface TemporalWorkflowStatusQueryResult {
|
|
73
|
+
workflow: string;
|
|
74
|
+
workflowId: string;
|
|
75
|
+
runId: string;
|
|
76
|
+
cancelled: boolean;
|
|
77
|
+
nodes: Record<string, TemporalWorkflowNodeStatusSnapshot>;
|
|
78
|
+
runningNodeIds: string[];
|
|
79
|
+
completedNodeIds: string[];
|
|
80
|
+
}
|
|
81
|
+
export interface TemporalWorkflowArtifactsQueryResult {
|
|
82
|
+
artifactKeys: string[];
|
|
83
|
+
artifactRefs: Record<string, TemporalArtifactRef>;
|
|
84
|
+
}
|
|
85
|
+
export type TemporalWorkflowResult = WorkflowRunResult;
|
|
86
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/temporal/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/temporal/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/temporal/worker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAYxE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { fileURLToPath } from 'url';
|
|
2
|
+
import { Worker, NativeConnection } from '@temporalio/worker';
|
|
3
|
+
import { resolveTemporalConfig } from './config.js';
|
|
4
|
+
import * as activities from './activities.js';
|
|
5
|
+
export async function runTemporalWorker(config) {
|
|
6
|
+
const temporal = resolveTemporalConfig(config);
|
|
7
|
+
const workflowModule = import.meta.url.endsWith('.ts') ? './workflows.ts' : './workflows.js';
|
|
8
|
+
const connection = await NativeConnection.connect({ address: temporal.address });
|
|
9
|
+
const worker = await Worker.create({
|
|
10
|
+
connection,
|
|
11
|
+
namespace: temporal.namespace,
|
|
12
|
+
taskQueue: temporal.taskQueue,
|
|
13
|
+
workflowsPath: fileURLToPath(new URL(workflowModule, import.meta.url)),
|
|
14
|
+
activities,
|
|
15
|
+
});
|
|
16
|
+
await worker.run();
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/temporal/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAiB;IACvD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAC7F,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;QACjC,UAAU;QACV,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,aAAa,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtE,UAAU;KACX,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derive a deterministic Temporal workflow ID from the workflow name and
|
|
3
|
+
* resolved inputs.
|
|
4
|
+
*
|
|
5
|
+
* DRS workflows are triggered by external events whose identity is stable
|
|
6
|
+
* across re-deliveries (a webhook retried, a scheduler replay, a service
|
|
7
|
+
* restart). A deterministic workflow ID lets Temporal's built-in workflow-ID
|
|
8
|
+
* uniqueness deduplicate repeated triggers instead of scheduling duplicate
|
|
9
|
+
* work.
|
|
10
|
+
*
|
|
11
|
+
* Recognized trigger patterns (based on the standard DRS workflow inputs):
|
|
12
|
+
*
|
|
13
|
+
* - **GitHub PR** — inputs contain `owner`, `repo`, and `pr`:
|
|
14
|
+
* `{prefix}-{workflowName}-gh-{owner}-{repo}-pr-{pr}`
|
|
15
|
+
* - **GitLab MR** — inputs contain `project` and `mr`:
|
|
16
|
+
* `{prefix}-{workflowName}-gl-{project}-mr-{mr}`
|
|
17
|
+
*
|
|
18
|
+
* Workflows without a recognized external trigger identity (e.g. `local-review`,
|
|
19
|
+
* one-off CLI runs, smoke tests) fall back to a random UUID suffix so each
|
|
20
|
+
* dispatch is a fresh run — exactly the behavior expected for unique work.
|
|
21
|
+
*
|
|
22
|
+
* Callers that need full control (a service layer with a custom trigger
|
|
23
|
+
* identity) can bypass this helper by passing an explicit `workflowId` in
|
|
24
|
+
* {@link WorkflowRunOptions}.
|
|
25
|
+
*/
|
|
26
|
+
export declare function deriveTemporalWorkflowId(prefix: string, workflowName: string, inputs: Record<string, string>): string;
|
|
27
|
+
//# sourceMappingURL=workflow-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-id.d.ts","sourceRoot":"","sources":["../../src/temporal/workflow-id.ts"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,MAAM,CAoBR"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Sanitize a value for safe inclusion in a Temporal workflow ID.
|
|
4
|
+
*
|
|
5
|
+
* Replaces any character outside [A-Za-z0-9._-] with a dash and trims leading
|
|
6
|
+
* / trailing dashes, so values like GitLab project paths (`org/subgroup/repo`)
|
|
7
|
+
* become ID-safe segments (`org-subgroup-repo`).
|
|
8
|
+
*/
|
|
9
|
+
function sanitizeIdSegment(value) {
|
|
10
|
+
return value.replace(/[^A-Za-z0-9._-]+/g, '-').replace(/^-+|-+$/g, '') || 'unknown';
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Derive a deterministic Temporal workflow ID from the workflow name and
|
|
14
|
+
* resolved inputs.
|
|
15
|
+
*
|
|
16
|
+
* DRS workflows are triggered by external events whose identity is stable
|
|
17
|
+
* across re-deliveries (a webhook retried, a scheduler replay, a service
|
|
18
|
+
* restart). A deterministic workflow ID lets Temporal's built-in workflow-ID
|
|
19
|
+
* uniqueness deduplicate repeated triggers instead of scheduling duplicate
|
|
20
|
+
* work.
|
|
21
|
+
*
|
|
22
|
+
* Recognized trigger patterns (based on the standard DRS workflow inputs):
|
|
23
|
+
*
|
|
24
|
+
* - **GitHub PR** — inputs contain `owner`, `repo`, and `pr`:
|
|
25
|
+
* `{prefix}-{workflowName}-gh-{owner}-{repo}-pr-{pr}`
|
|
26
|
+
* - **GitLab MR** — inputs contain `project` and `mr`:
|
|
27
|
+
* `{prefix}-{workflowName}-gl-{project}-mr-{mr}`
|
|
28
|
+
*
|
|
29
|
+
* Workflows without a recognized external trigger identity (e.g. `local-review`,
|
|
30
|
+
* one-off CLI runs, smoke tests) fall back to a random UUID suffix so each
|
|
31
|
+
* dispatch is a fresh run — exactly the behavior expected for unique work.
|
|
32
|
+
*
|
|
33
|
+
* Callers that need full control (a service layer with a custom trigger
|
|
34
|
+
* identity) can bypass this helper by passing an explicit `workflowId` in
|
|
35
|
+
* {@link WorkflowRunOptions}.
|
|
36
|
+
*/
|
|
37
|
+
export function deriveTemporalWorkflowId(prefix, workflowName, inputs) {
|
|
38
|
+
const safePrefix = sanitizeIdSegment(prefix);
|
|
39
|
+
const safeName = sanitizeIdSegment(workflowName);
|
|
40
|
+
const owner = inputs['owner'];
|
|
41
|
+
const repo = inputs['repo'];
|
|
42
|
+
const pr = inputs['pr'];
|
|
43
|
+
if (owner && repo && pr) {
|
|
44
|
+
return `${safePrefix}-${safeName}-gh-${sanitizeIdSegment(owner)}-${sanitizeIdSegment(repo)}-pr-${sanitizeIdSegment(pr)}`;
|
|
45
|
+
}
|
|
46
|
+
const project = inputs['project'];
|
|
47
|
+
const mr = inputs['mr'];
|
|
48
|
+
if (project && mr) {
|
|
49
|
+
return `${safePrefix}-${safeName}-gl-${sanitizeIdSegment(project)}-mr-${sanitizeIdSegment(mr)}`;
|
|
50
|
+
}
|
|
51
|
+
return `${safePrefix}-${safeName}-${randomUUID()}`;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=workflow-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-id.js","sourceRoot":"","sources":["../../src/temporal/workflow-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;;;;;GAMG;AACH,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC;AACtF,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAc,EACd,YAAoB,EACpB,MAA8B;IAE9B,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAEjD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAExB,IAAI,KAAK,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;QACxB,OAAO,GAAG,UAAU,IAAI,QAAQ,OAAO,iBAAiB,CAAC,KAAK,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC;IAC3H,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAExB,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;QAClB,OAAO,GAAG,UAAU,IAAI,QAAQ,OAAO,iBAAiB,CAAC,OAAO,CAAC,OAAO,iBAAiB,CAAC,EAAE,CAAC,EAAE,CAAC;IAClG,CAAC;IAED,OAAO,GAAG,UAAU,IAAI,QAAQ,IAAI,UAAU,EAAE,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { TemporalWorkflowArtifactsQueryResult, TemporalWorkflowInput, TemporalWorkflowStatusQueryResult, TemporalWorkflowResult } from './types.js';
|
|
2
|
+
export declare const workflowStatusQuery: import("@temporalio/common").QueryDefinition<TemporalWorkflowStatusQueryResult, [], string>;
|
|
3
|
+
export declare const workflowLoopStateQuery: import("@temporalio/common").QueryDefinition<Record<string, import("../cli/workflow.js").WorkflowLoopState>, [], string>;
|
|
4
|
+
export declare const workflowArtifactsQuery: import("@temporalio/common").QueryDefinition<TemporalWorkflowArtifactsQueryResult, [], string>;
|
|
5
|
+
export declare function drsWorkflow(input: TemporalWorkflowInput): Promise<TemporalWorkflowResult>;
|
|
6
|
+
//# sourceMappingURL=workflows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../src/temporal/workflows.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAEV,oCAAoC,EACpC,qBAAqB,EACrB,iCAAiC,EACjC,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,mBAAmB,6FACqC,CAAC;AACtE,eAAO,MAAM,sBAAsB,0HACmC,CAAC;AACvE,eAAO,MAAM,sBAAsB,gGACwC,CAAC;AAsY5E,wBAAsB,WAAW,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA4D/F"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import { defineQuery, isCancellation, proxyActivities, setHandler, workflowInfo, } from '@temporalio/workflow';
|
|
2
|
+
import { computeActiveWorkflowNodes, createSkippedWorkflowNodeResult, findWorkflowSegmentIndex, getNodeNeeds, getWorkflowNodeSkipReason, runControlWorkflowNode, } from '../lib/workflow/planning.js';
|
|
3
|
+
import { isArtifactRef } from '../lib/workflow/artifact-store.js';
|
|
4
|
+
import { getTemporalNodeRetryMode, TEMPORAL_RETRYABLE_ACTIVITY_POLICY } from './retry-policy.js';
|
|
5
|
+
export const workflowStatusQuery = defineQuery('drsWorkflowStatus');
|
|
6
|
+
export const workflowLoopStateQuery = defineQuery('drsWorkflowLoopState');
|
|
7
|
+
export const workflowArtifactsQuery = defineQuery('drsWorkflowArtifacts');
|
|
8
|
+
const { runWorkflowNodeActivity, resolveArtifactRefsActivity, prepareWorkspaceActivity } = proxyActivities({
|
|
9
|
+
startToCloseTimeout: '30 minutes',
|
|
10
|
+
// Bound total time across all retries so a persistently failing activity
|
|
11
|
+
// fails the workflow instead of retrying indefinitely. 3 hours comfortably
|
|
12
|
+
// allows 5 attempts at up to 30 minutes each plus backoff.
|
|
13
|
+
scheduleToCloseTimeout: '3 hours',
|
|
14
|
+
retry: TEMPORAL_RETRYABLE_ACTIVITY_POLICY,
|
|
15
|
+
});
|
|
16
|
+
const { runWorkflowNodeActivity: runWorkflowNodeNoRetryActivity } = proxyActivities({
|
|
17
|
+
startToCloseTimeout: '30 minutes',
|
|
18
|
+
retry: {
|
|
19
|
+
maximumAttempts: 1,
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
function recordNodeArtifact(nodeId, node, result, artifacts) {
|
|
23
|
+
const artifactValue = result.output ?? result.response ?? result.responses;
|
|
24
|
+
artifacts[nodeId] = artifactValue;
|
|
25
|
+
if (node.output) {
|
|
26
|
+
artifacts[node.output] = artifactValue;
|
|
27
|
+
}
|
|
28
|
+
if (result.outputs) {
|
|
29
|
+
for (const [name, value] of Object.entries(result.outputs)) {
|
|
30
|
+
artifacts[name] = value;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function recordWorkflowNodeResult(nodeId, node, result, nodes, artifacts) {
|
|
35
|
+
result.status ??= 'success';
|
|
36
|
+
nodes[nodeId] = result;
|
|
37
|
+
if (result.status !== 'skipped') {
|
|
38
|
+
recordNodeArtifact(nodeId, node, result, artifacts);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function buildWorkflowStatusSnapshot(input, context, runningNodeIds, isCancelled) {
|
|
42
|
+
const nodes = {};
|
|
43
|
+
for (const [nodeId, node] of Object.entries(input.plan.nodes)) {
|
|
44
|
+
const result = context.nodes[nodeId];
|
|
45
|
+
nodes[nodeId] = {
|
|
46
|
+
id: nodeId,
|
|
47
|
+
status: runningNodeIds.has(nodeId) ? 'running' : (result?.status ?? 'pending'),
|
|
48
|
+
action: node.action,
|
|
49
|
+
agent: node.agent,
|
|
50
|
+
control: node.control,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const info = workflowInfo();
|
|
54
|
+
return {
|
|
55
|
+
workflow: input.plan.workflowName,
|
|
56
|
+
workflowId: info.workflowId,
|
|
57
|
+
runId: info.runId,
|
|
58
|
+
cancelled: isCancelled,
|
|
59
|
+
nodes,
|
|
60
|
+
runningNodeIds: [...runningNodeIds],
|
|
61
|
+
completedNodeIds: Object.keys(context.nodes),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function buildArtifactsSnapshot(context) {
|
|
65
|
+
const artifactRefs = {};
|
|
66
|
+
for (const [key, value] of Object.entries(context.artifacts)) {
|
|
67
|
+
if (isArtifactRef(value)) {
|
|
68
|
+
artifactRefs[key] = value;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
artifactKeys: Object.keys(context.artifacts),
|
|
73
|
+
artifactRefs,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function createActivityIdempotencyContext(nodeId) {
|
|
77
|
+
const info = workflowInfo();
|
|
78
|
+
return {
|
|
79
|
+
workflowId: info.workflowId,
|
|
80
|
+
runId: info.runId,
|
|
81
|
+
nodeId,
|
|
82
|
+
idempotencyKey: `${info.workflowId}:${info.runId}:${nodeId}`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
async function runTemporalWorkflowNodeActivity(input, nodeId, node, context) {
|
|
86
|
+
const activityInput = {
|
|
87
|
+
workingDir: input.workingDir,
|
|
88
|
+
nodeId,
|
|
89
|
+
node,
|
|
90
|
+
context,
|
|
91
|
+
options: input.options,
|
|
92
|
+
idempotencyContext: createActivityIdempotencyContext(nodeId),
|
|
93
|
+
offloadArtifacts: true,
|
|
94
|
+
};
|
|
95
|
+
if (getTemporalNodeRetryMode(node) === 'no-retry') {
|
|
96
|
+
return runWorkflowNodeNoRetryActivity(activityInput);
|
|
97
|
+
}
|
|
98
|
+
return runWorkflowNodeActivity(activityInput);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Extract artifact keys referenced by a template/expression string.
|
|
102
|
+
*
|
|
103
|
+
* Scans for `{{artifacts.KEY}}` template references and bare `artifacts.KEY`
|
|
104
|
+
* path references, collecting only the first path segment after `artifacts.`
|
|
105
|
+
* (the key in `context.artifacts`). Subsequent dotted segments are sub-paths
|
|
106
|
+
* within the resolved value and are resolved at evaluation time.
|
|
107
|
+
*/
|
|
108
|
+
function extractArtifactKeysFromExpression(expression, keys) {
|
|
109
|
+
for (const match of expression.matchAll(/\{\{\s*artifacts\.([A-Za-z0-9_-]+)/g)) {
|
|
110
|
+
keys.add(match[1] ?? '');
|
|
111
|
+
}
|
|
112
|
+
const stripped = expression.replace(/\{\{[^}]+\}\}/g, '');
|
|
113
|
+
for (const match of stripped.matchAll(/(?:^|[^A-Za-z0-9_.])artifacts\.([A-Za-z0-9_-]+)/g)) {
|
|
114
|
+
keys.add(match[1] ?? '');
|
|
115
|
+
}
|
|
116
|
+
keys.delete('');
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Resolve only the artifact refs needed for upcoming control-flow evaluation.
|
|
120
|
+
*
|
|
121
|
+
* Returns a shallow-copy evaluation context with the requested keys resolved.
|
|
122
|
+
* The original `context.artifacts` is never mutated, so large values that are
|
|
123
|
+
* not needed for branching stay as refs in workflow state and never enter
|
|
124
|
+
* Temporal event history. Activities self-hydrate from their own deserialized
|
|
125
|
+
* copy, so node execution is unaffected.
|
|
126
|
+
*/
|
|
127
|
+
async function resolveEvaluationArtifacts(input, context, keys) {
|
|
128
|
+
if (keys.size === 0)
|
|
129
|
+
return context;
|
|
130
|
+
const refsToResolve = {};
|
|
131
|
+
for (const key of keys) {
|
|
132
|
+
const value = context.artifacts[key];
|
|
133
|
+
if (isArtifactRef(value)) {
|
|
134
|
+
refsToResolve[key] = value;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (Object.keys(refsToResolve).length === 0)
|
|
138
|
+
return context;
|
|
139
|
+
const resolved = await resolveArtifactRefsActivity({
|
|
140
|
+
workingDir: input.workingDir,
|
|
141
|
+
refs: refsToResolve,
|
|
142
|
+
});
|
|
143
|
+
return {
|
|
144
|
+
...context,
|
|
145
|
+
artifacts: { ...context.artifacts, ...resolved },
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Build an evaluation context for a set of runnable DAG nodes by resolving
|
|
150
|
+
* only the artifact refs referenced by their `if` conditions.
|
|
151
|
+
*/
|
|
152
|
+
async function resolveDagEvaluationContext(input, context, runnableNodeIds) {
|
|
153
|
+
const keys = new Set();
|
|
154
|
+
for (const nodeId of runnableNodeIds) {
|
|
155
|
+
const node = input.plan.nodes[nodeId];
|
|
156
|
+
if (node?.if) {
|
|
157
|
+
extractArtifactKeysFromExpression(node.if, keys);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return resolveEvaluationArtifacts(input, context, keys);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Build an evaluation context for a control node by resolving only the
|
|
164
|
+
* artifact refs referenced by its `if`, `value` (switch), or `maxIterations`
|
|
165
|
+
* (loop) expressions.
|
|
166
|
+
*/
|
|
167
|
+
async function resolveControlEvaluationContext(input, context, node) {
|
|
168
|
+
const keys = new Set();
|
|
169
|
+
if (node.if) {
|
|
170
|
+
extractArtifactKeysFromExpression(node.if, keys);
|
|
171
|
+
}
|
|
172
|
+
if (node.control === 'switch' && node.value) {
|
|
173
|
+
extractArtifactKeysFromExpression(node.value, keys);
|
|
174
|
+
}
|
|
175
|
+
if (node.control === 'loop' && typeof node.maxIterations === 'string') {
|
|
176
|
+
extractArtifactKeysFromExpression(node.maxIterations, keys);
|
|
177
|
+
}
|
|
178
|
+
return resolveEvaluationArtifacts(input, context, keys);
|
|
179
|
+
}
|
|
180
|
+
async function runTemporalDagNodes(input, nodeIds, activeNodeIds, context, runningNodeIds) {
|
|
181
|
+
const { plan } = input;
|
|
182
|
+
const completed = new Set();
|
|
183
|
+
const segmentNodeIds = new Set(nodeIds);
|
|
184
|
+
if (activeNodeIds) {
|
|
185
|
+
for (const nodeId of nodeIds) {
|
|
186
|
+
if (!activeNodeIds.has(nodeId)) {
|
|
187
|
+
completed.add(nodeId);
|
|
188
|
+
context.nodes[nodeId] ??= createSkippedWorkflowNodeResult(nodeId);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
while (completed.size < nodeIds.length) {
|
|
193
|
+
const runnable = nodeIds.filter((nodeId) => {
|
|
194
|
+
if (completed.has(nodeId))
|
|
195
|
+
return false;
|
|
196
|
+
const node = plan.nodes[nodeId];
|
|
197
|
+
if (!node)
|
|
198
|
+
return false;
|
|
199
|
+
return getNodeNeeds(node).every((dependency) => completed.has(dependency) || !segmentNodeIds.has(dependency));
|
|
200
|
+
});
|
|
201
|
+
if (runnable.length === 0) {
|
|
202
|
+
const incomplete = nodeIds.filter((nodeId) => !completed.has(nodeId));
|
|
203
|
+
throw new Error(`Workflow control runner could not make progress in a DAG segment. Pending nodes: ${incomplete.join(', ')}.`);
|
|
204
|
+
}
|
|
205
|
+
const evalContext = await resolveDagEvaluationContext(input, context, runnable);
|
|
206
|
+
const results = await Promise.all(runnable.map(async (nodeId) => {
|
|
207
|
+
const node = plan.nodes[nodeId];
|
|
208
|
+
if (!node) {
|
|
209
|
+
throw new Error(`Workflow references unknown node "${nodeId}".`);
|
|
210
|
+
}
|
|
211
|
+
const skipReason = getWorkflowNodeSkipReason(node, evalContext);
|
|
212
|
+
if (skipReason) {
|
|
213
|
+
return { nodeId, node, result: createSkippedWorkflowNodeResult(nodeId) };
|
|
214
|
+
}
|
|
215
|
+
runningNodeIds.add(nodeId);
|
|
216
|
+
try {
|
|
217
|
+
const result = await runTemporalWorkflowNodeActivity(input, nodeId, node, context);
|
|
218
|
+
return { nodeId, node, result };
|
|
219
|
+
}
|
|
220
|
+
finally {
|
|
221
|
+
runningNodeIds.delete(nodeId);
|
|
222
|
+
}
|
|
223
|
+
}));
|
|
224
|
+
for (const { nodeId, node, result } of results) {
|
|
225
|
+
completed.add(nodeId);
|
|
226
|
+
recordWorkflowNodeResult(nodeId, node, result, context.nodes, context.artifacts);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function toWorkflowSegments(compiledSegments) {
|
|
231
|
+
return compiledSegments.map((segment) => segment.type === 'control'
|
|
232
|
+
? { type: 'control', nodeId: segment.nodeId }
|
|
233
|
+
: {
|
|
234
|
+
type: 'dag',
|
|
235
|
+
nodeIds: [...segment.nodeIds],
|
|
236
|
+
...(segment.activeNodeIds ? { activeNodeIds: new Set(segment.activeNodeIds) } : {}),
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
async function runTemporalControlWorkflow(input, context, runningNodeIds) {
|
|
240
|
+
const { plan } = input;
|
|
241
|
+
const segments = toWorkflowSegments(plan.segments);
|
|
242
|
+
let segmentIndex = 0;
|
|
243
|
+
while (segmentIndex < segments.length) {
|
|
244
|
+
const segment = segments[segmentIndex];
|
|
245
|
+
if (segment.type === 'dag') {
|
|
246
|
+
await runTemporalDagNodes(input, segment.nodeIds, segment.activeNodeIds, context, runningNodeIds);
|
|
247
|
+
segmentIndex += 1;
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
const node = plan.nodes[segment.nodeId];
|
|
251
|
+
if (!node) {
|
|
252
|
+
throw new Error(`Workflow references unknown node "${segment.nodeId}".`);
|
|
253
|
+
}
|
|
254
|
+
const evalContext = await resolveControlEvaluationContext(input, context, node);
|
|
255
|
+
const skipReason = getWorkflowNodeSkipReason(node, evalContext);
|
|
256
|
+
const { result, nextNodeId, ended } = skipReason
|
|
257
|
+
? { result: createSkippedWorkflowNodeResult(segment.nodeId) }
|
|
258
|
+
: runControlWorkflowNode(segment.nodeId, node, evalContext);
|
|
259
|
+
recordWorkflowNodeResult(segment.nodeId, node, result, context.nodes, context.artifacts);
|
|
260
|
+
if (ended) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
if (!nextNodeId) {
|
|
264
|
+
segmentIndex += 1;
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
const targetIndex = findWorkflowSegmentIndex(segments, nextNodeId);
|
|
268
|
+
if (targetIndex < 0) {
|
|
269
|
+
throw new Error(`Workflow control node "${segment.nodeId}" targets unknown node "${nextNodeId}".`);
|
|
270
|
+
}
|
|
271
|
+
if (node.control !== 'loop' && targetIndex <= segmentIndex) {
|
|
272
|
+
throw new Error(`Workflow control node "${segment.nodeId}" cannot jump backward to "${nextNodeId}". Use control: loop with maxIterations for repeated execution.`);
|
|
273
|
+
}
|
|
274
|
+
const targetSegment = segments[targetIndex];
|
|
275
|
+
if (targetSegment.type === 'dag') {
|
|
276
|
+
targetSegment.activeNodeIds = computeActiveWorkflowNodes(plan.nodes, targetSegment.nodeIds, nextNodeId, !(node.control === 'loop' && nextNodeId === node.target));
|
|
277
|
+
}
|
|
278
|
+
segmentIndex = targetIndex;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
async function runTemporalDagWorkflow(input, context, runningNodeIds) {
|
|
282
|
+
for (const wave of input.plan.waves) {
|
|
283
|
+
await runTemporalDagNodes(input, wave, undefined, context, runningNodeIds);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
export async function drsWorkflow(input) {
|
|
287
|
+
const { plan } = input;
|
|
288
|
+
const info = workflowInfo();
|
|
289
|
+
const executionInput = input.workspace
|
|
290
|
+
? {
|
|
291
|
+
...input,
|
|
292
|
+
workingDir: (await prepareWorkspaceActivity({
|
|
293
|
+
workspace: input.workspace,
|
|
294
|
+
workflowId: info.workflowId,
|
|
295
|
+
runId: info.runId,
|
|
296
|
+
})).workingDir,
|
|
297
|
+
}
|
|
298
|
+
: input;
|
|
299
|
+
const nodes = {};
|
|
300
|
+
const artifacts = {};
|
|
301
|
+
const runningNodeIds = new Set();
|
|
302
|
+
let isCancelled = false;
|
|
303
|
+
const context = {
|
|
304
|
+
inputs: input.inputs,
|
|
305
|
+
nodes,
|
|
306
|
+
artifacts,
|
|
307
|
+
loop: {},
|
|
308
|
+
};
|
|
309
|
+
setHandler(workflowStatusQuery, () => buildWorkflowStatusSnapshot(input, context, runningNodeIds, isCancelled));
|
|
310
|
+
setHandler(workflowLoopStateQuery, () => context.loop);
|
|
311
|
+
setHandler(workflowArtifactsQuery, () => buildArtifactsSnapshot(context));
|
|
312
|
+
try {
|
|
313
|
+
if (plan.hasControlNodes) {
|
|
314
|
+
await runTemporalControlWorkflow(executionInput, context, runningNodeIds);
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
await runTemporalDagWorkflow(executionInput, context, runningNodeIds);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
if (isCancellation(error)) {
|
|
322
|
+
isCancelled = true;
|
|
323
|
+
runningNodeIds.clear();
|
|
324
|
+
}
|
|
325
|
+
throw error;
|
|
326
|
+
}
|
|
327
|
+
const lastNode = plan.nodes[plan.lastNodeId];
|
|
328
|
+
const outputKey = plan.output ?? lastNode?.output ?? plan.lastNodeId;
|
|
329
|
+
return {
|
|
330
|
+
// Deterministic timestamp: derive from workflowInfo().runStartTime (set by
|
|
331
|
+
// the Temporal server and replayed) instead of new Date(), which would be a
|
|
332
|
+
// determinism violation in workflow code.
|
|
333
|
+
timestamp: info.runStartTime.toISOString(),
|
|
334
|
+
workflow: plan.workflowName,
|
|
335
|
+
inputs: input.inputs,
|
|
336
|
+
nodes,
|
|
337
|
+
artifacts,
|
|
338
|
+
loop: context.loop,
|
|
339
|
+
output: artifacts[outputKey],
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=workflows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/temporal/workflows.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@diff-review-system/drs",
|
|
3
|
-
"version": "4.0
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"description": "Workflow-first AI code maintenance for reviews, changelogs, docs, and repository upkeep.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"dev:cli": "tsx src/cli/index.ts",
|
|
15
15
|
"start": "node dist/cli/index.js",
|
|
16
16
|
"test": "vitest run",
|
|
17
|
+
"test:temporal:smoke": "DRS_TEMPORAL_SMOKE=1 vitest run src/temporal/smoke.test.ts",
|
|
17
18
|
"test:e2e": "DRS_E2E_LIVE=1 vitest run src/cli/review-local.live.e2e.test.ts",
|
|
18
19
|
"lint": "eslint 'src/**/*.ts'",
|
|
19
20
|
"lint:fix": "eslint 'src/**/*.ts' --fix",
|
|
@@ -59,6 +60,10 @@
|
|
|
59
60
|
"@gitbeaker/node": "^35.8.1",
|
|
60
61
|
"@octokit/rest": "^21.0.0",
|
|
61
62
|
"@sinclair/typebox": "^0.34.49",
|
|
63
|
+
"@temporalio/activity": "^1.18.1",
|
|
64
|
+
"@temporalio/client": "^1.18.1",
|
|
65
|
+
"@temporalio/worker": "^1.18.1",
|
|
66
|
+
"@temporalio/workflow": "^1.18.1",
|
|
62
67
|
"ajv": "^8.20.0",
|
|
63
68
|
"chalk": "^5.3.0",
|
|
64
69
|
"commander": "^12.0.0",
|