@interf/compiler 0.6.1 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -74
- package/builtin-workflows/interf/README.md +5 -5
- package/builtin-workflows/interf/compile/stages/shape/SKILL.md +4 -4
- package/builtin-workflows/interf/improve/SKILL.md +2 -2
- package/builtin-workflows/interf/use/query/SKILL.md +1 -1
- package/builtin-workflows/interf/workflow.json +6 -6
- package/builtin-workflows/interf/workflow.schema.json +1 -1
- package/dist/bin.js +2 -28
- package/dist/{commands → cli/commands}/check-draft.d.ts +2 -2
- package/dist/{commands → cli/commands}/check-draft.js +12 -12
- package/dist/{commands → cli/commands}/compile-controller.d.ts +3 -3
- package/dist/{commands → cli/commands}/compile-controller.js +36 -34
- package/dist/{commands → cli/commands}/compile.d.ts +2 -2
- package/dist/{commands → cli/commands}/compile.js +15 -11
- package/dist/{commands → cli/commands}/compiled-flow.d.ts +3 -4
- package/dist/{commands → cli/commands}/compiled-flow.js +9 -14
- package/dist/{commands → cli/commands}/create-workflow-wizard.d.ts +3 -3
- package/dist/{commands → cli/commands}/create-workflow-wizard.js +61 -34
- package/dist/{commands → cli/commands}/create.d.ts +1 -1
- package/dist/{commands → cli/commands}/create.js +15 -18
- package/dist/{commands → cli/commands}/dataset-selection.d.ts +1 -1
- package/dist/{commands → cli/commands}/default.js +3 -3
- package/dist/{commands → cli/commands}/doctor.js +5 -6
- package/dist/{commands → cli/commands}/executor-flow.d.ts +1 -1
- package/dist/{commands → cli/commands}/executor-flow.js +13 -16
- package/dist/{commands → cli/commands}/init.d.ts +4 -1
- package/dist/{commands → cli/commands}/init.js +157 -72
- package/dist/{commands → cli/commands}/list.js +5 -5
- package/dist/{commands → cli/commands}/reset.js +4 -4
- package/dist/{commands → cli/commands}/source-config-wizard.d.ts +8 -3
- package/dist/{commands → cli/commands}/source-config-wizard.js +161 -87
- package/dist/{commands → cli/commands}/status.js +20 -11
- package/dist/{commands → cli/commands}/test-flow.d.ts +13 -4
- package/dist/{commands → cli/commands}/test-flow.js +30 -26
- package/dist/cli/commands/test.d.ts +14 -0
- package/dist/{commands → cli/commands}/test.js +39 -23
- package/dist/{commands → cli/commands}/verify.js +4 -4
- package/dist/cli/index.d.ts +21 -0
- package/dist/cli/index.js +33 -0
- package/dist/index.d.ts +22 -11
- package/dist/index.js +15 -6
- package/dist/lib/agent-args.d.ts +1 -4
- package/dist/lib/agent-args.js +1 -52
- package/dist/lib/agent-constants.d.ts +1 -5
- package/dist/lib/agent-constants.js +1 -28
- package/dist/lib/agent-detection.d.ts +1 -7
- package/dist/lib/agent-detection.js +1 -65
- package/dist/lib/agent-execution.d.ts +1 -2
- package/dist/lib/agent-execution.js +1 -243
- package/dist/lib/agent-logs.d.ts +1 -2
- package/dist/lib/agent-logs.js +1 -17
- package/dist/lib/agent-preflight.d.ts +1 -7
- package/dist/lib/agent-preflight.js +1 -77
- package/dist/lib/agent-render.d.ts +1 -8
- package/dist/lib/agent-render.js +1 -218
- package/dist/lib/agent-shells.d.ts +1 -69
- package/dist/lib/agent-shells.js +1 -1021
- package/dist/lib/agent-status.d.ts +1 -3
- package/dist/lib/agent-status.js +1 -58
- package/dist/lib/agent-types.d.ts +1 -30
- package/dist/lib/agent-types.js +1 -1
- package/dist/lib/agents.d.ts +1 -6
- package/dist/lib/agents.js +1 -5
- package/dist/lib/builtin-compiled-workflow.d.ts +1 -38
- package/dist/lib/builtin-compiled-workflow.js +1 -94
- package/dist/lib/compiled-compile.d.ts +1 -48
- package/dist/lib/compiled-compile.js +1 -255
- package/dist/lib/compiled-paths.d.ts +1 -40
- package/dist/lib/compiled-paths.js +3 -106
- package/dist/lib/compiled-raw.d.ts +1 -49
- package/dist/lib/compiled-raw.js +3 -102
- package/dist/lib/compiled-reset.d.ts +1 -2
- package/dist/lib/compiled-reset.js +3 -72
- package/dist/lib/compiled-schema.d.ts +1 -31
- package/dist/lib/compiled-schema.js +1 -141
- package/dist/lib/execution-profile.d.ts +1 -17
- package/dist/lib/execution-profile.js +1 -84
- package/dist/lib/executors.d.ts +1 -32
- package/dist/lib/executors.js +1 -43
- package/dist/lib/interf-bootstrap.d.ts +1 -3
- package/dist/lib/interf-bootstrap.js +3 -18
- package/dist/lib/interf-detect.d.ts +1 -33
- package/dist/lib/interf-detect.js +3 -176
- package/dist/lib/interf-scaffold.d.ts +1 -2
- package/dist/lib/interf-scaffold.js +3 -114
- package/dist/lib/interf-workflow-package.d.ts +1 -25
- package/dist/lib/interf-workflow-package.js +1 -342
- package/dist/lib/interf.d.ts +1 -5
- package/dist/lib/interf.js +3 -4
- package/dist/lib/local-workflows.d.ts +1 -54
- package/dist/lib/local-workflows.js +1 -422
- package/dist/lib/package-root.d.ts +1 -0
- package/dist/lib/package-root.js +1 -0
- package/dist/lib/project-paths.d.ts +1 -11
- package/dist/lib/project-paths.js +3 -32
- package/dist/lib/runtime-acceptance.d.ts +1 -9
- package/dist/lib/runtime-acceptance.js +1 -269
- package/dist/lib/runtime-contracts.d.ts +1 -2
- package/dist/lib/runtime-contracts.js +1 -48
- package/dist/lib/runtime-inventory.d.ts +1 -7
- package/dist/lib/runtime-inventory.js +1 -29
- package/dist/lib/runtime-paths.d.ts +1 -8
- package/dist/lib/runtime-paths.js +1 -26
- package/dist/lib/runtime-prompt.d.ts +1 -2
- package/dist/lib/runtime-prompt.js +1 -48
- package/dist/lib/runtime-reconcile.d.ts +1 -2
- package/dist/lib/runtime-reconcile.js +1 -193
- package/dist/lib/runtime-runs.d.ts +1 -11
- package/dist/lib/runtime-runs.js +1 -262
- package/dist/lib/runtime-types.d.ts +1 -43
- package/dist/lib/runtime-types.js +1 -1
- package/dist/lib/runtime.d.ts +1 -6
- package/dist/lib/runtime.js +1 -5
- package/dist/lib/schema.d.ts +4 -1073
- package/dist/lib/schema.js +6 -542
- package/dist/lib/source-config.d.ts +1 -39
- package/dist/lib/source-config.js +3 -293
- package/dist/lib/state-artifacts.d.ts +1 -8
- package/dist/lib/state-artifacts.js +1 -13
- package/dist/lib/state-health.d.ts +1 -4
- package/dist/lib/state-health.js +1 -132
- package/dist/lib/state-io.d.ts +1 -10
- package/dist/lib/state-io.js +1 -76
- package/dist/lib/state-paths.d.ts +1 -4
- package/dist/lib/state-paths.js +1 -13
- package/dist/lib/state-view.d.ts +1 -4
- package/dist/lib/state-view.js +1 -103
- package/dist/lib/state.d.ts +1 -7
- package/dist/lib/state.js +1 -12
- package/dist/lib/test-execution.d.ts +1 -14
- package/dist/lib/test-execution.js +3 -525
- package/dist/lib/test-matrices.d.ts +1 -90
- package/dist/lib/test-matrices.js +3 -96
- package/dist/lib/test-paths.d.ts +1 -12
- package/dist/lib/test-paths.js +3 -59
- package/dist/lib/test-profile-presets.d.ts +1 -57
- package/dist/lib/test-profile-presets.js +3 -50
- package/dist/lib/test-sandbox.d.ts +1 -11
- package/dist/lib/test-sandbox.js +3 -105
- package/dist/lib/test-specs.d.ts +1 -7
- package/dist/lib/test-specs.js +3 -114
- package/dist/lib/test-targets.d.ts +1 -5
- package/dist/lib/test-targets.js +3 -38
- package/dist/lib/test-types.d.ts +1 -17
- package/dist/lib/test-types.js +3 -1
- package/dist/lib/test.d.ts +1 -4
- package/dist/lib/test.js +3 -3
- package/dist/lib/validate-compiled.d.ts +1 -27
- package/dist/lib/validate-compiled.js +1 -241
- package/dist/lib/validate-helpers.d.ts +1 -12
- package/dist/lib/validate-helpers.js +1 -41
- package/dist/lib/validate.d.ts +1 -21
- package/dist/lib/validate.js +1 -249
- package/dist/lib/workflow-authoring.d.ts +1 -26
- package/dist/lib/workflow-authoring.js +1 -119
- package/dist/lib/workflow-definitions.d.ts +1 -78
- package/dist/lib/workflow-definitions.js +1 -203
- package/dist/lib/workflow-edit-session.d.ts +1 -16
- package/dist/lib/workflow-edit-session.js +1 -57
- package/dist/lib/workflow-edit-utils.d.ts +1 -10
- package/dist/lib/workflow-edit-utils.js +1 -39
- package/dist/lib/workflow-helpers.d.ts +1 -38
- package/dist/lib/workflow-helpers.js +1 -167
- package/dist/lib/workflow-improvement.d.ts +1 -22
- package/dist/lib/workflow-improvement.js +1 -209
- package/dist/lib/workflow-primitives.d.ts +1 -2
- package/dist/lib/workflow-primitives.js +1 -5
- package/dist/lib/workflow-review-paths.d.ts +1 -10
- package/dist/lib/workflow-review-paths.js +1 -27
- package/dist/lib/workflow-stage-policy.d.ts +1 -5
- package/dist/lib/workflow-stage-policy.js +1 -31
- package/dist/lib/workflow-stage-runner.d.ts +1 -41
- package/dist/lib/workflow-stage-runner.js +1 -109
- package/dist/lib/workflows.d.ts +1 -15
- package/dist/lib/workflows.js +1 -31
- package/dist/packages/agents/index.d.ts +17 -0
- package/dist/packages/agents/index.js +15 -0
- package/dist/packages/agents/lib/agents.d.ts +6 -0
- package/dist/packages/agents/lib/agents.js +5 -0
- package/dist/packages/agents/lib/args.d.ts +4 -0
- package/dist/packages/agents/lib/args.js +52 -0
- package/dist/packages/agents/lib/constants.d.ts +5 -0
- package/dist/packages/agents/lib/constants.js +28 -0
- package/dist/packages/agents/lib/detection.d.ts +7 -0
- package/dist/packages/agents/lib/detection.js +65 -0
- package/dist/packages/agents/lib/execution-profile.d.ts +17 -0
- package/dist/packages/agents/lib/execution-profile.js +84 -0
- package/dist/packages/agents/lib/execution.d.ts +2 -0
- package/dist/packages/agents/lib/execution.js +243 -0
- package/dist/packages/agents/lib/executors.d.ts +32 -0
- package/dist/packages/agents/lib/executors.js +45 -0
- package/dist/packages/agents/lib/logs.d.ts +2 -0
- package/dist/packages/agents/lib/logs.js +17 -0
- package/dist/packages/agents/lib/preflight.d.ts +7 -0
- package/dist/packages/agents/lib/preflight.js +77 -0
- package/dist/packages/agents/lib/render.d.ts +8 -0
- package/dist/packages/agents/lib/render.js +218 -0
- package/dist/packages/agents/lib/schema.d.ts +8 -0
- package/dist/packages/agents/lib/schema.js +7 -0
- package/dist/packages/agents/lib/shells.d.ts +69 -0
- package/dist/packages/agents/lib/shells.js +1021 -0
- package/dist/packages/agents/lib/status.d.ts +3 -0
- package/dist/packages/agents/lib/status.js +58 -0
- package/dist/packages/agents/lib/types.d.ts +30 -0
- package/dist/packages/agents/lib/types.js +1 -0
- package/dist/{lib → packages/agents/lib}/user-config.d.ts +1 -0
- package/dist/{lib → packages/agents/lib}/user-config.js +3 -2
- package/dist/packages/compiler/compiled-compile.d.ts +48 -0
- package/dist/packages/compiler/compiled-compile.js +256 -0
- package/dist/packages/compiler/compiled-schema.d.ts +31 -0
- package/dist/packages/compiler/compiled-schema.js +141 -0
- package/dist/packages/compiler/index.d.ts +24 -0
- package/dist/packages/compiler/index.js +23 -0
- package/dist/packages/compiler/lib/schema.d.ts +684 -0
- package/dist/packages/compiler/lib/schema.js +361 -0
- package/dist/packages/compiler/runtime-acceptance.d.ts +9 -0
- package/dist/packages/compiler/runtime-acceptance.js +269 -0
- package/dist/packages/compiler/runtime-contracts.d.ts +2 -0
- package/dist/packages/compiler/runtime-contracts.js +48 -0
- package/dist/packages/compiler/runtime-inventory.d.ts +7 -0
- package/dist/packages/compiler/runtime-inventory.js +29 -0
- package/dist/packages/compiler/runtime-paths.d.ts +8 -0
- package/dist/packages/compiler/runtime-paths.js +26 -0
- package/dist/packages/compiler/runtime-prompt.d.ts +2 -0
- package/dist/packages/compiler/runtime-prompt.js +48 -0
- package/dist/packages/compiler/runtime-reconcile.d.ts +2 -0
- package/dist/packages/compiler/runtime-reconcile.js +193 -0
- package/dist/packages/compiler/runtime-runs.d.ts +11 -0
- package/dist/packages/compiler/runtime-runs.js +262 -0
- package/dist/packages/compiler/runtime-types.d.ts +43 -0
- package/dist/packages/compiler/runtime-types.js +1 -0
- package/dist/packages/compiler/runtime.d.ts +6 -0
- package/dist/packages/compiler/runtime.js +5 -0
- package/dist/packages/compiler/state-artifacts.d.ts +8 -0
- package/dist/packages/compiler/state-artifacts.js +13 -0
- package/dist/packages/compiler/state-health.d.ts +4 -0
- package/dist/packages/compiler/state-health.js +132 -0
- package/dist/packages/compiler/state-io.d.ts +10 -0
- package/dist/packages/compiler/state-io.js +76 -0
- package/dist/packages/compiler/state-paths.d.ts +4 -0
- package/dist/packages/compiler/state-paths.js +13 -0
- package/dist/packages/compiler/state-view.d.ts +4 -0
- package/dist/packages/compiler/state-view.js +103 -0
- package/dist/packages/compiler/state.d.ts +7 -0
- package/dist/packages/compiler/state.js +12 -0
- package/dist/packages/compiler/validate-compiled.d.ts +27 -0
- package/dist/packages/compiler/validate-compiled.js +241 -0
- package/dist/packages/compiler/validate-helpers.d.ts +12 -0
- package/dist/packages/compiler/validate-helpers.js +41 -0
- package/dist/packages/compiler/validate.d.ts +21 -0
- package/dist/packages/compiler/validate.js +249 -0
- package/dist/packages/compiler/workflow-primitives.d.ts +2 -0
- package/dist/packages/compiler/workflow-primitives.js +5 -0
- package/dist/packages/compiler/workflows.d.ts +15 -0
- package/dist/packages/compiler/workflows.js +31 -0
- package/dist/packages/project-model/compiled-paths.d.ts +40 -0
- package/dist/packages/project-model/compiled-paths.js +106 -0
- package/dist/packages/project-model/compiled-raw.d.ts +49 -0
- package/dist/packages/project-model/compiled-raw.js +102 -0
- package/dist/packages/project-model/compiled-reset.d.ts +2 -0
- package/dist/packages/project-model/compiled-reset.js +72 -0
- package/dist/packages/project-model/index.d.ts +11 -0
- package/dist/packages/project-model/index.js +10 -0
- package/dist/packages/project-model/interf-bootstrap.d.ts +3 -0
- package/dist/packages/project-model/interf-bootstrap.js +18 -0
- package/dist/packages/project-model/interf-detect.d.ts +33 -0
- package/dist/packages/project-model/interf-detect.js +176 -0
- package/dist/packages/project-model/interf-scaffold.d.ts +2 -0
- package/dist/packages/project-model/interf-scaffold.js +124 -0
- package/dist/packages/project-model/interf.d.ts +5 -0
- package/dist/packages/project-model/interf.js +4 -0
- package/dist/packages/project-model/lib/schema.d.ts +125 -0
- package/dist/packages/project-model/lib/schema.js +62 -0
- package/dist/packages/project-model/project-paths.d.ts +11 -0
- package/dist/packages/project-model/project-paths.js +32 -0
- package/dist/packages/project-model/source-config.d.ts +38 -0
- package/dist/packages/project-model/source-config.js +297 -0
- package/dist/packages/testing/index.d.ts +13 -0
- package/dist/packages/testing/index.js +10 -0
- package/dist/packages/testing/lib/schema.d.ts +261 -0
- package/dist/packages/testing/lib/schema.js +119 -0
- package/dist/packages/testing/test-execution.d.ts +14 -0
- package/dist/packages/testing/test-execution.js +525 -0
- package/dist/packages/testing/test-matrices.d.ts +90 -0
- package/dist/packages/testing/test-matrices.js +96 -0
- package/dist/packages/testing/test-paths.d.ts +12 -0
- package/dist/packages/testing/test-paths.js +59 -0
- package/dist/packages/testing/test-profile-presets.d.ts +57 -0
- package/dist/packages/testing/test-profile-presets.js +50 -0
- package/dist/packages/testing/test-sandbox.d.ts +11 -0
- package/dist/packages/testing/test-sandbox.js +105 -0
- package/dist/packages/testing/test-specs.d.ts +7 -0
- package/dist/packages/testing/test-specs.js +114 -0
- package/dist/packages/testing/test-targets.d.ts +5 -0
- package/dist/packages/testing/test-targets.js +38 -0
- package/dist/packages/testing/test-types.d.ts +16 -0
- package/dist/packages/testing/test-types.js +1 -0
- package/dist/packages/testing/test.d.ts +4 -0
- package/dist/packages/testing/test.js +3 -0
- package/dist/packages/workflow-authoring/index.d.ts +4 -0
- package/dist/packages/workflow-authoring/index.js +4 -0
- package/dist/packages/workflow-authoring/lib/workflow-edit-utils.d.ts +10 -0
- package/dist/packages/workflow-authoring/lib/workflow-edit-utils.js +39 -0
- package/dist/packages/workflow-authoring/workflow-authoring.d.ts +26 -0
- package/dist/packages/workflow-authoring/workflow-authoring.js +120 -0
- package/dist/packages/workflow-authoring/workflow-edit-session.d.ts +16 -0
- package/dist/packages/workflow-authoring/workflow-edit-session.js +57 -0
- package/dist/packages/workflow-authoring/workflow-improvement.d.ts +23 -0
- package/dist/packages/workflow-authoring/workflow-improvement.js +209 -0
- package/dist/packages/workflow-package/builtin-compiled-workflow.d.ts +38 -0
- package/dist/packages/workflow-package/builtin-compiled-workflow.js +94 -0
- package/dist/packages/workflow-package/index.d.ts +9 -0
- package/dist/packages/workflow-package/index.js +9 -0
- package/dist/packages/workflow-package/interf-workflow-package.d.ts +25 -0
- package/dist/packages/workflow-package/interf-workflow-package.js +342 -0
- package/dist/{lib/config.d.ts → packages/workflow-package/lib/package-root.d.ts} +0 -1
- package/dist/packages/workflow-package/lib/package-root.js +6 -0
- package/dist/packages/workflow-package/local-workflows.d.ts +54 -0
- package/dist/packages/workflow-package/local-workflows.js +422 -0
- package/dist/packages/workflow-package/workflow-definitions.d.ts +78 -0
- package/dist/packages/workflow-package/workflow-definitions.js +203 -0
- package/dist/packages/workflow-package/workflow-helpers.d.ts +38 -0
- package/dist/packages/workflow-package/workflow-helpers.js +167 -0
- package/dist/packages/workflow-package/workflow-review-paths.d.ts +10 -0
- package/dist/packages/workflow-package/workflow-review-paths.js +27 -0
- package/dist/packages/workflow-package/workflow-stage-policy.d.ts +5 -0
- package/dist/packages/workflow-package/workflow-stage-policy.js +31 -0
- package/dist/packages/workflow-package/workflow-stage-runner.d.ts +41 -0
- package/dist/packages/workflow-package/workflow-stage-runner.js +109 -0
- package/package.json +43 -19
- package/dist/commands/test.d.ts +0 -3
- package/dist/lib/compiled-home.d.ts +0 -5
- package/dist/lib/compiled-home.js +0 -32
- package/dist/lib/config.js +0 -9
- /package/dist/{commands → cli/commands}/dataset-selection.js +0 -0
- /package/dist/{commands → cli/commands}/default.d.ts +0 -0
- /package/dist/{commands → cli/commands}/doctor.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/reset.d.ts +0 -0
- /package/dist/{commands → cli/commands}/status.d.ts +0 -0
- /package/dist/{commands → cli/commands}/verify.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { TestCaseExpect, TestCase, TestSpec, TestCheckResult, TestCaseResult, TestTargetResult, TestTargetRun, TestTargetType, LoadedTestSpec, TestTargetCandidate, } from "./test-types.js";
|
|
2
|
+
export { listTestSpecs, loadTestSpec, loadTestSpecFromFile, writeTestSpec, } from "./test-specs.js";
|
|
3
|
+
export { createRawTestTarget, createCompiledTestTarget, listCompiledTestTargets, listTestTargets, } from "./test-targets.js";
|
|
4
|
+
export { runTargetTests, runTargetTestsWithJudge, runTargetTestsAuto, saveTargetTestRun, } from "./test-execution.js";
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { listTestSpecs, loadTestSpec, loadTestSpecFromFile, writeTestSpec, } from "./test-specs.js";
|
|
2
|
+
export { createRawTestTarget, createCompiledTestTarget, listCompiledTestTargets, listTestTargets, } from "./test-targets.js";
|
|
3
|
+
export { runTargetTests, runTargetTestsWithJudge, runTargetTestsAuto, saveTargetTestRun, } from "./test-execution.js";
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function copyDirectory(sourcePath: string, targetPath: string): void;
|
|
2
|
+
export declare function directoriesMatch(leftPath: string, rightPath: string): boolean;
|
|
3
|
+
export interface WorkflowEditShellArtifacts {
|
|
4
|
+
rootPath: string;
|
|
5
|
+
workflowBeforePath: string;
|
|
6
|
+
workflowAfterPath: string;
|
|
7
|
+
promptLogPath: string;
|
|
8
|
+
eventLogPath: string;
|
|
9
|
+
statusLogPath: string;
|
|
10
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, } from "node:fs";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
|
+
export function copyDirectory(sourcePath, targetPath) {
|
|
4
|
+
rmSync(targetPath, { recursive: true, force: true });
|
|
5
|
+
mkdirSync(targetPath, { recursive: true });
|
|
6
|
+
cpSync(sourcePath, targetPath, { recursive: true });
|
|
7
|
+
}
|
|
8
|
+
function listFileSnapshot(dirPath) {
|
|
9
|
+
const snapshot = new Map();
|
|
10
|
+
if (!existsSync(dirPath))
|
|
11
|
+
return snapshot;
|
|
12
|
+
const collect = (currentPath) => {
|
|
13
|
+
for (const entry of readdirSync(currentPath)) {
|
|
14
|
+
const fullPath = join(currentPath, entry);
|
|
15
|
+
const stat = statSync(fullPath);
|
|
16
|
+
if (stat.isDirectory()) {
|
|
17
|
+
collect(fullPath);
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (!stat.isFile())
|
|
21
|
+
continue;
|
|
22
|
+
snapshot.set(relative(dirPath, fullPath), readFileSync(fullPath, "utf8"));
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
collect(dirPath);
|
|
26
|
+
return snapshot;
|
|
27
|
+
}
|
|
28
|
+
export function directoriesMatch(leftPath, rightPath) {
|
|
29
|
+
const left = listFileSnapshot(leftPath);
|
|
30
|
+
const right = listFileSnapshot(rightPath);
|
|
31
|
+
if (left.size !== right.size)
|
|
32
|
+
return false;
|
|
33
|
+
for (const [relativePath, content] of left.entries()) {
|
|
34
|
+
if (right.get(relativePath) !== content) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { WorkflowExecutor } from "../agents/lib/executors.js";
|
|
2
|
+
import { validateWorkflowPackage } from "../workflow-package/local-workflows.js";
|
|
3
|
+
import { type WorkflowReporter } from "../compiler/workflows.js";
|
|
4
|
+
import type { SourceTruthCheck } from "../project-model/lib/schema.js";
|
|
5
|
+
export interface WorkflowAuthoringRunResult {
|
|
6
|
+
status: "updated" | "no-change" | "invalid" | "executor-failed";
|
|
7
|
+
changed: boolean;
|
|
8
|
+
summary: string;
|
|
9
|
+
validation: ReturnType<typeof validateWorkflowPackage> | null;
|
|
10
|
+
workflowPath: string;
|
|
11
|
+
shellPath: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function runWorkflowAuthoringDraft(options: {
|
|
14
|
+
sourcePath: string;
|
|
15
|
+
datasetPath: string;
|
|
16
|
+
baseWorkflowId: string;
|
|
17
|
+
workflowId: string;
|
|
18
|
+
label: string;
|
|
19
|
+
hint: string;
|
|
20
|
+
taskPrompt: string;
|
|
21
|
+
checks?: SourceTruthCheck[];
|
|
22
|
+
executor: WorkflowExecutor;
|
|
23
|
+
preparePreview?: boolean;
|
|
24
|
+
previewReporter?: WorkflowReporter | null;
|
|
25
|
+
}): Promise<WorkflowAuthoringRunResult>;
|
|
26
|
+
export declare function resolveWorkflowDraftPath(sourcePath: string, workflowId: string): string;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync, } from "node:fs";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { createWorkflowAuthoringShell } from "../agents/lib/shells.js";
|
|
5
|
+
import { WORKFLOW_SCHEMA_FILE } from "../compiler/compiled-schema.js";
|
|
6
|
+
import { seedLocalWorkflowPackageFromBase } from "../workflow-package/interf-workflow-package.js";
|
|
7
|
+
import { validateWorkflowPackage, workflowDefinitionPath } from "../workflow-package/local-workflows.js";
|
|
8
|
+
import { createCompiled, compileCompiled } from "../compiler/workflows.js";
|
|
9
|
+
import { projectRawSnapshot } from "../project-model/compiled-raw.js";
|
|
10
|
+
import { runWorkflowEditSession } from "./workflow-edit-session.js";
|
|
11
|
+
import { copyDirectory } from "./lib/workflow-edit-utils.js";
|
|
12
|
+
function buildWorkflowAuthoringPrompt() {
|
|
13
|
+
return [
|
|
14
|
+
"This is an automated Interf workflow-authoring run, not an open-ended chat session.",
|
|
15
|
+
"Execute it now.",
|
|
16
|
+
"Create one standalone workflow for the files and checks in this source folder.",
|
|
17
|
+
"Read `runtime/authoring-context.json` first.",
|
|
18
|
+
`Then read \`workflow/README.md\`, \`workflow/workflow.json\`, and \`workflow/${WORKFLOW_SCHEMA_FILE}\`.`,
|
|
19
|
+
"Review `artifacts/source-dataset/raw/` and any `artifacts/preview-compiled/` notes before editing the package.",
|
|
20
|
+
"Prefer direct file-reading and search tools over shell commands for routine file inspection.",
|
|
21
|
+
"Do not use shell helpers like `cat`, `sed`, `ls`, or `find` when a native read/search tool can inspect the same files.",
|
|
22
|
+
"Edit only files under `workflow/`.",
|
|
23
|
+
"Keep the workflow valid for the current compiler API and workflow schema.",
|
|
24
|
+
"Make the package materially more specific to this dataset task than the seeded base workflow. A no-op copy is not acceptable.",
|
|
25
|
+
"Prefer explicit stage-doc, stage-policy, purpose, and zone-contract edits over vague rewrites.",
|
|
26
|
+
"Do not introduce wikilinks unless the workflow also creates the target note by exact basename or explicit relative path.",
|
|
27
|
+
"Respect stage boundaries: a stage may only introduce links that resolve within that stage's declared writes or already-existing read zones.",
|
|
28
|
+
"Do not make one stage point at files or notes that are only created later by another stage.",
|
|
29
|
+
"Prefer conservative retrieval routing over speculative note sprawl.",
|
|
30
|
+
"Do not narrate plans or ask follow-up questions.",
|
|
31
|
+
"Only emit user-visible updates that begin with STATUS:, DONE:, BLOCKED:, or ERROR:.",
|
|
32
|
+
"As soon as the workflow edits are complete, stop.",
|
|
33
|
+
].join("\n");
|
|
34
|
+
}
|
|
35
|
+
async function prepareWorkflowAuthoringPreview(options) {
|
|
36
|
+
const tempRoot = mkdtempSync(join(tmpdir(), "interf-workflow-preview-"));
|
|
37
|
+
projectRawSnapshot({
|
|
38
|
+
sourcePath: options.datasetPath,
|
|
39
|
+
destinationPath: tempRoot,
|
|
40
|
+
compiledPath: tempRoot,
|
|
41
|
+
mode: "copy",
|
|
42
|
+
prune: true,
|
|
43
|
+
preserveTimestamps: true,
|
|
44
|
+
});
|
|
45
|
+
copyDirectory(options.workflowPath, workflowDefinitionPath(tempRoot, options.workflowId));
|
|
46
|
+
const compiledPath = createCompiled("preview", tempRoot, options.workflowId, options.about, tempRoot);
|
|
47
|
+
const result = await compileCompiled({
|
|
48
|
+
executor: options.executor,
|
|
49
|
+
compiledPath,
|
|
50
|
+
...(options.reporter ? { reporter: options.reporter } : {}),
|
|
51
|
+
preserveStageShells: "on-failure",
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
tempRoot,
|
|
55
|
+
compiledPath,
|
|
56
|
+
compileResult: {
|
|
57
|
+
ok: result.ok,
|
|
58
|
+
failedStage: result.failedStage,
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export async function runWorkflowAuthoringDraft(options) {
|
|
63
|
+
const workflowPath = seedLocalWorkflowPackageFromBase({
|
|
64
|
+
sourcePath: options.sourcePath,
|
|
65
|
+
baseWorkflowId: options.baseWorkflowId,
|
|
66
|
+
workflowId: options.workflowId,
|
|
67
|
+
label: options.label,
|
|
68
|
+
hint: options.hint,
|
|
69
|
+
});
|
|
70
|
+
let preview = null;
|
|
71
|
+
try {
|
|
72
|
+
if (options.preparePreview !== false) {
|
|
73
|
+
preview = await prepareWorkflowAuthoringPreview({
|
|
74
|
+
datasetPath: options.datasetPath,
|
|
75
|
+
about: options.taskPrompt,
|
|
76
|
+
workflowId: options.workflowId,
|
|
77
|
+
workflowPath,
|
|
78
|
+
executor: options.executor,
|
|
79
|
+
reporter: options.previewReporter ?? null,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const shell = createWorkflowAuthoringShell({
|
|
83
|
+
workflowPath,
|
|
84
|
+
workflowId: options.workflowId,
|
|
85
|
+
label: options.label,
|
|
86
|
+
baseWorkflowId: options.baseWorkflowId,
|
|
87
|
+
datasetPath: options.datasetPath,
|
|
88
|
+
taskPrompt: options.taskPrompt,
|
|
89
|
+
checks: options.checks ?? [],
|
|
90
|
+
preview,
|
|
91
|
+
});
|
|
92
|
+
if (preview) {
|
|
93
|
+
rmSync(preview.tempRoot, { recursive: true, force: true });
|
|
94
|
+
preview = null;
|
|
95
|
+
}
|
|
96
|
+
const session = await runWorkflowEditSession({
|
|
97
|
+
executor: options.executor,
|
|
98
|
+
workflowPath,
|
|
99
|
+
shell,
|
|
100
|
+
prompt: buildWorkflowAuthoringPrompt(),
|
|
101
|
+
validate: validateWorkflowPackage,
|
|
102
|
+
});
|
|
103
|
+
return {
|
|
104
|
+
status: session.status,
|
|
105
|
+
changed: session.changed,
|
|
106
|
+
summary: session.summary,
|
|
107
|
+
validation: session.validation,
|
|
108
|
+
workflowPath,
|
|
109
|
+
shellPath: shell.rootPath,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
if (preview) {
|
|
114
|
+
rmSync(preview.tempRoot, { recursive: true, force: true });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export function resolveWorkflowDraftPath(sourcePath, workflowId) {
|
|
119
|
+
return workflowDefinitionPath(sourcePath, workflowId);
|
|
120
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { WorkflowExecutor } from "../agents/lib/executors.js";
|
|
2
|
+
import type { WorkflowValidationResult } from "../workflow-package/local-workflows.js";
|
|
3
|
+
import { type WorkflowEditShellArtifacts } from "./lib/workflow-edit-utils.js";
|
|
4
|
+
export interface WorkflowEditSessionResult {
|
|
5
|
+
status: "updated" | "no-change" | "invalid" | "executor-failed";
|
|
6
|
+
changed: boolean;
|
|
7
|
+
validation: WorkflowValidationResult | null;
|
|
8
|
+
summary: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function runWorkflowEditSession(options: {
|
|
11
|
+
executor: WorkflowExecutor;
|
|
12
|
+
workflowPath: string;
|
|
13
|
+
shell: WorkflowEditShellArtifacts;
|
|
14
|
+
prompt: string;
|
|
15
|
+
validate: (workflowPath: string) => WorkflowValidationResult;
|
|
16
|
+
}): Promise<WorkflowEditSessionResult>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { writeFileSync } from "node:fs";
|
|
2
|
+
import { copyDirectory, directoriesMatch, } from "./lib/workflow-edit-utils.js";
|
|
3
|
+
export async function runWorkflowEditSession(options) {
|
|
4
|
+
copyDirectory(options.workflowPath, options.shell.workflowBeforePath);
|
|
5
|
+
writeFileSync(options.shell.promptLogPath, `${options.prompt}\n`);
|
|
6
|
+
let code = 1;
|
|
7
|
+
let executeError = null;
|
|
8
|
+
try {
|
|
9
|
+
code = await options.executor.execute(options.shell.rootPath, options.prompt, {
|
|
10
|
+
eventLogPath: options.shell.eventLogPath,
|
|
11
|
+
statusLogPath: options.shell.statusLogPath,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
executeError = error instanceof Error ? error.message : String(error);
|
|
16
|
+
}
|
|
17
|
+
copyDirectory(options.workflowPath, options.shell.workflowAfterPath);
|
|
18
|
+
const changed = !directoriesMatch(options.shell.workflowBeforePath, options.shell.workflowAfterPath);
|
|
19
|
+
if (executeError) {
|
|
20
|
+
copyDirectory(options.shell.workflowBeforePath, options.workflowPath);
|
|
21
|
+
return {
|
|
22
|
+
status: "executor-failed",
|
|
23
|
+
changed,
|
|
24
|
+
validation: null,
|
|
25
|
+
summary: `Workflow editor failed before completing: ${executeError}`,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (code !== 0) {
|
|
29
|
+
copyDirectory(options.shell.workflowBeforePath, options.workflowPath);
|
|
30
|
+
return {
|
|
31
|
+
status: "executor-failed",
|
|
32
|
+
changed,
|
|
33
|
+
validation: null,
|
|
34
|
+
summary: `Workflow editor exited with code ${code}.`,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const validation = options.validate(options.workflowPath);
|
|
38
|
+
if (!validation.ok) {
|
|
39
|
+
copyDirectory(options.shell.workflowBeforePath, options.workflowPath);
|
|
40
|
+
return {
|
|
41
|
+
status: "invalid",
|
|
42
|
+
changed,
|
|
43
|
+
validation,
|
|
44
|
+
summary: changed
|
|
45
|
+
? `Workflow package failed validation: ${validation.summary}`
|
|
46
|
+
: `Workflow package is invalid without any workflow edits: ${validation.summary}`,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
status: changed ? "updated" : "no-change",
|
|
51
|
+
changed,
|
|
52
|
+
validation,
|
|
53
|
+
summary: changed
|
|
54
|
+
? "Workflow package updated and validated."
|
|
55
|
+
: "Workflow package is valid without additional edits.",
|
|
56
|
+
};
|
|
57
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { WorkflowExecutor } from "../agents/lib/executors.js";
|
|
2
|
+
import { type WorkflowValidationResult } from "../workflow-package/local-workflows.js";
|
|
3
|
+
import type { SourceDatasetConfig } from "../project-model/lib/schema.js";
|
|
4
|
+
import type { WorkflowImprovementLoopSummary } from "../compiler/lib/schema.js";
|
|
5
|
+
export interface WorkflowImprovementRunResult {
|
|
6
|
+
status: "updated" | "no-change" | "invalid" | "executor-failed";
|
|
7
|
+
changed: boolean;
|
|
8
|
+
validation: WorkflowValidationResult | null;
|
|
9
|
+
summary: string;
|
|
10
|
+
shellPath: string;
|
|
11
|
+
loopRootPath: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function runWorkflowImprovementLoop(options: {
|
|
14
|
+
executor: WorkflowExecutor;
|
|
15
|
+
compiledPath: string;
|
|
16
|
+
workflowId: string;
|
|
17
|
+
compiledConfig: Pick<SourceDatasetConfig, "checks">;
|
|
18
|
+
runId: string;
|
|
19
|
+
loopIndex: number;
|
|
20
|
+
maxLoops: number;
|
|
21
|
+
maxAttempts: number;
|
|
22
|
+
previousVariations: WorkflowImprovementLoopSummary[];
|
|
23
|
+
}): Promise<WorkflowImprovementRunResult>;
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { appendFileSync, existsSync, mkdirSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
|
+
import { createWorkflowImprovementShell, freezeWorkflowImprovementShell, } from "../agents/lib/shells.js";
|
|
4
|
+
import { WORKFLOW_SCHEMA_FILE } from "../compiler/compiled-schema.js";
|
|
5
|
+
import { validateWorkflowPackage } from "../workflow-package/local-workflows.js";
|
|
6
|
+
import { readJsonFileWithSchema } from "../../lib/parse.js";
|
|
7
|
+
import { resolveWorkflowImprovementReviewPaths } from "../workflow-package/workflow-review-paths.js";
|
|
8
|
+
import { targetTestRunsRootForCompiled, targetTestSandboxesRootForCompiled, workflowImprovementRunRoot, workflowPackagePathForCompiled, } from "../project-model/compiled-paths.js";
|
|
9
|
+
import { readInterfConfig } from "../project-model/interf.js";
|
|
10
|
+
import { saveCompiledInterfConfig } from "../project-model/source-config.js";
|
|
11
|
+
import { WorkflowImprovementRunLedgerSchema, } from "../compiler/lib/schema.js";
|
|
12
|
+
import { runWorkflowEditSession } from "./workflow-edit-session.js";
|
|
13
|
+
function toShellArtifactPath(absolutePath, sourceRoot, shellRoot) {
|
|
14
|
+
if (!absolutePath)
|
|
15
|
+
return null;
|
|
16
|
+
const normalizedSourceRoot = `${sourceRoot}/`;
|
|
17
|
+
if (absolutePath !== sourceRoot && !absolutePath.startsWith(normalizedSourceRoot)) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
const relativePath = relative(sourceRoot, absolutePath);
|
|
21
|
+
return join(shellRoot, relativePath);
|
|
22
|
+
}
|
|
23
|
+
function mapLoopSummaryForShell(summary, compiledPath) {
|
|
24
|
+
const shellTestRunsRoot = "artifacts/test-runs";
|
|
25
|
+
const shellTestSandboxesRoot = "artifacts/test-sandboxes";
|
|
26
|
+
return {
|
|
27
|
+
...summary,
|
|
28
|
+
test_run_path: toShellArtifactPath(summary.test_run_path, targetTestRunsRootForCompiled(compiledPath), shellTestRunsRoot) ?? summary.test_run_path ?? null,
|
|
29
|
+
test_sandbox_path: toShellArtifactPath(summary.test_sandbox_path, targetTestSandboxesRootForCompiled(compiledPath), shellTestSandboxesRoot) ?? summary.test_sandbox_path ?? null,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function buildLoopContext(options) {
|
|
33
|
+
const previousVariations = options.previousVariations.map((summary) => mapLoopSummaryForShell(summary, options.compiledPath));
|
|
34
|
+
const latestFailure = previousVariations.at(-1) ?? null;
|
|
35
|
+
return {
|
|
36
|
+
kind: "interf-workflow-improvement-loop",
|
|
37
|
+
version: 1,
|
|
38
|
+
generated_at: new Date().toISOString(),
|
|
39
|
+
target_name: readInterfConfig(options.compiledPath)?.name ?? "compiled",
|
|
40
|
+
workflow_id: options.workflowId,
|
|
41
|
+
loop_index: options.loopIndex,
|
|
42
|
+
max_loops: options.maxLoops,
|
|
43
|
+
max_attempts: options.maxAttempts,
|
|
44
|
+
review_paths: resolveWorkflowImprovementReviewPaths(options.compiledPath),
|
|
45
|
+
truth_checks: {
|
|
46
|
+
count: options.compiledConfig.checks.length,
|
|
47
|
+
questions: options.compiledConfig.checks.map((check, index) => ({
|
|
48
|
+
id: check.id ?? `check-${index + 1}`,
|
|
49
|
+
question: check.question,
|
|
50
|
+
})),
|
|
51
|
+
},
|
|
52
|
+
previous_variations: previousVariations,
|
|
53
|
+
latest_failure: latestFailure,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function buildWorkflowImprovementPrompt() {
|
|
57
|
+
return [
|
|
58
|
+
"This is an automated Interf workflow-improvement run, not an open-ended chat session.",
|
|
59
|
+
"The user already invoked this through `interf compile` with self-improving loops enabled. Execute it now.",
|
|
60
|
+
"Read `runtime/loop-context.json` first.",
|
|
61
|
+
`Then read \`workflow/README.md\`, \`workflow/workflow.json\`, \`workflow/${WORKFLOW_SCHEMA_FILE}\`, and \`workflow/improve/SKILL.md\` if it exists.`,
|
|
62
|
+
"Review preserved evidence from earlier failures under `artifacts/` before you edit the workflow.",
|
|
63
|
+
"Treat `workflow/improve/SKILL.md` as guidance for how to improve the workflow, not as the default file to edit.",
|
|
64
|
+
"Prefer editing the stage docs, workflow contract, or schema ownership that actually change compiled outputs.",
|
|
65
|
+
"Edit only files under `workflow/`.",
|
|
66
|
+
"Do not edit checks, test specs, raw dataset files, or generated compiled outputs.",
|
|
67
|
+
"Keep the workflow valid for the current compiler API and workflow schema.",
|
|
68
|
+
"Respect stage boundaries: a stage may only introduce links that resolve within that stage's declared writes or already-existing read zones.",
|
|
69
|
+
"Do not make one stage point at files or notes that are only created later by another stage.",
|
|
70
|
+
"Prefer small, defensible changes to workflow docs, stage docs, stage policies, or schema ownership over random churn.",
|
|
71
|
+
"Do not narrate plans or ask follow-up questions.",
|
|
72
|
+
"Only emit user-visible updates that begin with STATUS:, DONE:, BLOCKED:, or ERROR:.",
|
|
73
|
+
"As soon as the workflow edits are complete, stop.",
|
|
74
|
+
].join("\n");
|
|
75
|
+
}
|
|
76
|
+
function updateCompiledWorkflowOrigin(options) {
|
|
77
|
+
const current = readInterfConfig(options.compiledPath);
|
|
78
|
+
if (!current)
|
|
79
|
+
return;
|
|
80
|
+
const nextConfig = {
|
|
81
|
+
...current,
|
|
82
|
+
workflow: current.workflow ?? options.selectedWorkflowId,
|
|
83
|
+
workflow_origin: {
|
|
84
|
+
selected: options.selectedWorkflowId,
|
|
85
|
+
...(options.localDraft ? { local_draft: true } : {}),
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
saveCompiledInterfConfig(options.compiledPath, nextConfig);
|
|
89
|
+
}
|
|
90
|
+
function workflowImprovementRunLedgerPath(compiledPath, runId) {
|
|
91
|
+
return join(workflowImprovementRunRoot(compiledPath, runId), "run.json");
|
|
92
|
+
}
|
|
93
|
+
function workflowImprovementLoopHistoryPath(compiledPath, runId) {
|
|
94
|
+
return join(workflowImprovementRunRoot(compiledPath, runId), "loop-history.jsonl");
|
|
95
|
+
}
|
|
96
|
+
function workflowImprovementLoopRecordPath(loopRootPath) {
|
|
97
|
+
return join(loopRootPath, "loop.json");
|
|
98
|
+
}
|
|
99
|
+
function readWorkflowImprovementRunLedger(compiledPath, runId) {
|
|
100
|
+
const ledgerPath = workflowImprovementRunLedgerPath(compiledPath, runId);
|
|
101
|
+
if (!existsSync(ledgerPath))
|
|
102
|
+
return null;
|
|
103
|
+
return readJsonFileWithSchema(ledgerPath, "workflow improvement run ledger", WorkflowImprovementRunLedgerSchema);
|
|
104
|
+
}
|
|
105
|
+
function writeWorkflowImprovementRunLedger(compiledPath, runId, record, options) {
|
|
106
|
+
const runRoot = workflowImprovementRunRoot(compiledPath, runId);
|
|
107
|
+
mkdirSync(runRoot, { recursive: true });
|
|
108
|
+
const existing = readWorkflowImprovementRunLedger(compiledPath, runId);
|
|
109
|
+
const generatedAt = existing?.generated_at ?? new Date().toISOString();
|
|
110
|
+
const ledger = {
|
|
111
|
+
kind: "interf-workflow-improvement-run",
|
|
112
|
+
version: 1,
|
|
113
|
+
generated_at: generatedAt,
|
|
114
|
+
updated_at: new Date().toISOString(),
|
|
115
|
+
run_id: runId,
|
|
116
|
+
target_name: options.targetName,
|
|
117
|
+
workflow_id: options.workflowId,
|
|
118
|
+
max_loops: options.maxLoops,
|
|
119
|
+
max_attempts: options.maxAttempts,
|
|
120
|
+
loops: [...(existing?.loops ?? []), record],
|
|
121
|
+
};
|
|
122
|
+
writeFileSync(workflowImprovementRunLedgerPath(compiledPath, runId), `${JSON.stringify(ledger, null, 2)}\n`);
|
|
123
|
+
writeFileSync(workflowImprovementLoopRecordPath(record.loop_root_path), `${JSON.stringify(record, null, 2)}\n`);
|
|
124
|
+
appendFileSync(workflowImprovementLoopHistoryPath(compiledPath, runId), `${JSON.stringify(record)}\n`);
|
|
125
|
+
}
|
|
126
|
+
function buildWorkflowImprovementLoopRecord(options) {
|
|
127
|
+
return {
|
|
128
|
+
kind: "interf-workflow-improvement-loop-record",
|
|
129
|
+
version: 1,
|
|
130
|
+
recorded_at: new Date().toISOString(),
|
|
131
|
+
run_id: options.runId,
|
|
132
|
+
loop_index: options.loopIndex,
|
|
133
|
+
target_name: options.targetName,
|
|
134
|
+
workflow_id: options.workflowId,
|
|
135
|
+
result: options.result,
|
|
136
|
+
changed: options.changed,
|
|
137
|
+
applied: options.result === "updated",
|
|
138
|
+
summary: options.summary,
|
|
139
|
+
shell_path: options.shellPath,
|
|
140
|
+
loop_root_path: options.loopRootPath,
|
|
141
|
+
context_path: join(options.shellPath, "runtime", "loop-context.json"),
|
|
142
|
+
workflow_before_path: options.workflowBeforePath,
|
|
143
|
+
workflow_after_path: options.workflowAfterPath,
|
|
144
|
+
prompt_log_path: options.promptLogPath,
|
|
145
|
+
event_log_path: options.eventLogPath,
|
|
146
|
+
status_log_path: options.statusLogPath,
|
|
147
|
+
preserved_shell_manifest_path: options.preservedShellManifestPath,
|
|
148
|
+
validation: options.validation,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
export async function runWorkflowImprovementLoop(options) {
|
|
152
|
+
const compiledName = readInterfConfig(options.compiledPath)?.name ?? "compiled";
|
|
153
|
+
const context = buildLoopContext(options);
|
|
154
|
+
const shell = createWorkflowImprovementShell({
|
|
155
|
+
compiledPath: options.compiledPath,
|
|
156
|
+
compiledName,
|
|
157
|
+
workflowId: options.workflowId,
|
|
158
|
+
runId: options.runId,
|
|
159
|
+
loopIndex: options.loopIndex,
|
|
160
|
+
context,
|
|
161
|
+
});
|
|
162
|
+
const workflowRoot = workflowPackagePathForCompiled(options.compiledPath);
|
|
163
|
+
const session = await runWorkflowEditSession({
|
|
164
|
+
executor: options.executor,
|
|
165
|
+
workflowPath: workflowRoot,
|
|
166
|
+
shell,
|
|
167
|
+
prompt: buildWorkflowImprovementPrompt(),
|
|
168
|
+
validate: validateWorkflowPackage,
|
|
169
|
+
});
|
|
170
|
+
const preservedShellManifestPath = freezeWorkflowImprovementShell(shell.rootPath);
|
|
171
|
+
writeWorkflowImprovementRunLedger(options.compiledPath, options.runId, buildWorkflowImprovementLoopRecord({
|
|
172
|
+
targetName: compiledName,
|
|
173
|
+
workflowId: options.workflowId,
|
|
174
|
+
runId: options.runId,
|
|
175
|
+
loopIndex: options.loopIndex,
|
|
176
|
+
shellPath: shell.rootPath,
|
|
177
|
+
loopRootPath: shell.loopRootPath,
|
|
178
|
+
workflowBeforePath: shell.workflowBeforePath,
|
|
179
|
+
workflowAfterPath: shell.workflowAfterPath,
|
|
180
|
+
promptLogPath: shell.promptLogPath,
|
|
181
|
+
eventLogPath: shell.eventLogPath,
|
|
182
|
+
statusLogPath: shell.statusLogPath,
|
|
183
|
+
preservedShellManifestPath,
|
|
184
|
+
changed: session.changed,
|
|
185
|
+
validation: session.validation,
|
|
186
|
+
result: session.status,
|
|
187
|
+
summary: session.summary,
|
|
188
|
+
}), {
|
|
189
|
+
targetName: compiledName,
|
|
190
|
+
workflowId: options.workflowId,
|
|
191
|
+
maxLoops: options.maxLoops,
|
|
192
|
+
maxAttempts: options.maxAttempts,
|
|
193
|
+
});
|
|
194
|
+
if (session.status === "updated") {
|
|
195
|
+
updateCompiledWorkflowOrigin({
|
|
196
|
+
compiledPath: options.compiledPath,
|
|
197
|
+
selectedWorkflowId: options.workflowId,
|
|
198
|
+
localDraft: true,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
status: session.status,
|
|
203
|
+
changed: session.changed,
|
|
204
|
+
validation: session.validation,
|
|
205
|
+
summary: session.summary,
|
|
206
|
+
shellPath: shell.rootPath,
|
|
207
|
+
loopRootPath: shell.loopRootPath,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { COMPILED_ZONE_KINDS, type CompiledZoneKind } from "../compiler/workflow-primitives.js";
|
|
2
|
+
export declare const BUILTIN_COMPILED_STAGE_IDS: {
|
|
3
|
+
readonly SUMMARIZE: "summarize";
|
|
4
|
+
readonly STRUCTURE: "structure";
|
|
5
|
+
readonly SHAPE: "shape";
|
|
6
|
+
};
|
|
7
|
+
export type BuiltinCompiledStageId = typeof BUILTIN_COMPILED_STAGE_IDS[keyof typeof BUILTIN_COMPILED_STAGE_IDS];
|
|
8
|
+
export declare const BUILTIN_COMPILED_ZONE_IDS: {
|
|
9
|
+
readonly RAW: "raw";
|
|
10
|
+
readonly SUMMARIES: "summaries";
|
|
11
|
+
readonly KNOWLEDGE_ENTITIES: "knowledge-entities";
|
|
12
|
+
readonly KNOWLEDGE_CLAIMS: "knowledge-claims";
|
|
13
|
+
readonly KNOWLEDGE_INDEXES: "knowledge-indexes";
|
|
14
|
+
readonly HOME: "home";
|
|
15
|
+
readonly RUNTIME: "runtime";
|
|
16
|
+
};
|
|
17
|
+
export type BuiltinCompiledZoneId = typeof BUILTIN_COMPILED_ZONE_IDS[keyof typeof BUILTIN_COMPILED_ZONE_IDS];
|
|
18
|
+
export interface BuiltinCompiledZoneSpec {
|
|
19
|
+
id: BuiltinCompiledZoneId;
|
|
20
|
+
role: "input" | "working" | "output" | "runtime";
|
|
21
|
+
path: string;
|
|
22
|
+
kind: CompiledZoneKind;
|
|
23
|
+
required: boolean;
|
|
24
|
+
description: string;
|
|
25
|
+
}
|
|
26
|
+
export interface BuiltinCompiledStageAccessPattern {
|
|
27
|
+
id: BuiltinCompiledStageId;
|
|
28
|
+
contract_type: string;
|
|
29
|
+
reads: BuiltinCompiledZoneId[];
|
|
30
|
+
writes: BuiltinCompiledZoneId[];
|
|
31
|
+
}
|
|
32
|
+
export declare function listBuiltinCompiledZoneSpecs(): BuiltinCompiledZoneSpec[];
|
|
33
|
+
export declare function listBuiltinCompiledFallbackStages(): BuiltinCompiledStageAccessPattern[];
|
|
34
|
+
export declare function requiredCompiledZoneOwners<TStage extends {
|
|
35
|
+
id: string;
|
|
36
|
+
writes: readonly string[];
|
|
37
|
+
}>(stages: readonly TStage[], zoneId: BuiltinCompiledZoneId): string[];
|
|
38
|
+
export { COMPILED_ZONE_KINDS };
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { readJsonFileWithSchema } from "../../lib/parse.js";
|
|
4
|
+
import { COMPILED_ZONE_KINDS } from "../compiler/workflow-primitives.js";
|
|
5
|
+
import { WorkflowCompiledSchemaSchema } from "../compiler/lib/schema.js";
|
|
6
|
+
import { PACKAGE_ROOT } from "./lib/package-root.js";
|
|
7
|
+
export const BUILTIN_COMPILED_STAGE_IDS = {
|
|
8
|
+
SUMMARIZE: "summarize",
|
|
9
|
+
STRUCTURE: "structure",
|
|
10
|
+
SHAPE: "shape",
|
|
11
|
+
};
|
|
12
|
+
export const BUILTIN_COMPILED_ZONE_IDS = {
|
|
13
|
+
RAW: "raw",
|
|
14
|
+
SUMMARIES: "summaries",
|
|
15
|
+
KNOWLEDGE_ENTITIES: "knowledge-entities",
|
|
16
|
+
KNOWLEDGE_CLAIMS: "knowledge-claims",
|
|
17
|
+
KNOWLEDGE_INDEXES: "knowledge-indexes",
|
|
18
|
+
HOME: "home",
|
|
19
|
+
RUNTIME: "runtime",
|
|
20
|
+
};
|
|
21
|
+
const BUILTIN_ZONE_ID_SET = new Set(Object.values(BUILTIN_COMPILED_ZONE_IDS));
|
|
22
|
+
const BUILTIN_STAGE_ID_SET = new Set(Object.values(BUILTIN_COMPILED_STAGE_IDS));
|
|
23
|
+
const BuiltinWorkflowStageSchema = z.object({
|
|
24
|
+
id: z.string(),
|
|
25
|
+
contract_type: z.string(),
|
|
26
|
+
reads: z.array(z.string()).min(1),
|
|
27
|
+
writes: z.array(z.string()).min(1),
|
|
28
|
+
});
|
|
29
|
+
const BuiltinWorkflowPackageSchema = z.object({
|
|
30
|
+
stages: z.array(BuiltinWorkflowStageSchema).min(1),
|
|
31
|
+
});
|
|
32
|
+
let builtinCompiledContractCache = null;
|
|
33
|
+
function builtinWorkflowRootPath() {
|
|
34
|
+
return join(PACKAGE_ROOT, "builtin-workflows", "interf");
|
|
35
|
+
}
|
|
36
|
+
function builtinWorkflowPath(relativePath) {
|
|
37
|
+
return join(builtinWorkflowRootPath(), relativePath);
|
|
38
|
+
}
|
|
39
|
+
function assertBuiltinZoneId(value) {
|
|
40
|
+
if (!BUILTIN_ZONE_ID_SET.has(value)) {
|
|
41
|
+
throw new Error(`Built-in Interf workflow schema declares unsupported zone id "${value}".`);
|
|
42
|
+
}
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
function assertBuiltinStageId(value) {
|
|
46
|
+
if (!BUILTIN_STAGE_ID_SET.has(value)) {
|
|
47
|
+
throw new Error(`Built-in Interf workflow package declares unsupported stage id "${value}".`);
|
|
48
|
+
}
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
function loadBuiltinCompiledContract() {
|
|
52
|
+
if (builtinCompiledContractCache)
|
|
53
|
+
return builtinCompiledContractCache;
|
|
54
|
+
const schema = readJsonFileWithSchema(builtinWorkflowPath("workflow.schema.json"), "built-in Interf workflow schema", WorkflowCompiledSchemaSchema);
|
|
55
|
+
if (!schema) {
|
|
56
|
+
throw new Error(`Missing or invalid built-in workflow schema at ${builtinWorkflowPath("workflow.schema.json")}.`);
|
|
57
|
+
}
|
|
58
|
+
const workflow = readJsonFileWithSchema(builtinWorkflowPath("workflow.json"), "built-in Interf workflow package", BuiltinWorkflowPackageSchema);
|
|
59
|
+
if (!workflow) {
|
|
60
|
+
throw new Error(`Missing or invalid built-in workflow package at ${builtinWorkflowPath("workflow.json")}.`);
|
|
61
|
+
}
|
|
62
|
+
const zones = schema.zones.map((zone) => ({
|
|
63
|
+
id: assertBuiltinZoneId(zone.id),
|
|
64
|
+
role: zone.role,
|
|
65
|
+
path: zone.path,
|
|
66
|
+
kind: zone.kind,
|
|
67
|
+
required: zone.required,
|
|
68
|
+
description: zone.description,
|
|
69
|
+
}));
|
|
70
|
+
const stages = workflow.stages.map((stage) => ({
|
|
71
|
+
id: assertBuiltinStageId(stage.id),
|
|
72
|
+
contract_type: stage.contract_type,
|
|
73
|
+
reads: stage.reads.map(assertBuiltinZoneId),
|
|
74
|
+
writes: stage.writes.map(assertBuiltinZoneId),
|
|
75
|
+
}));
|
|
76
|
+
builtinCompiledContractCache = { zones, stages };
|
|
77
|
+
return builtinCompiledContractCache;
|
|
78
|
+
}
|
|
79
|
+
export function listBuiltinCompiledZoneSpecs() {
|
|
80
|
+
return loadBuiltinCompiledContract().zones.map((zone) => ({ ...zone }));
|
|
81
|
+
}
|
|
82
|
+
export function listBuiltinCompiledFallbackStages() {
|
|
83
|
+
return loadBuiltinCompiledContract().stages.map((stage) => ({
|
|
84
|
+
...stage,
|
|
85
|
+
reads: [...stage.reads],
|
|
86
|
+
writes: [...stage.writes],
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
export function requiredCompiledZoneOwners(stages, zoneId) {
|
|
90
|
+
return Array.from(new Set(stages
|
|
91
|
+
.filter((stage) => stage.writes.includes(zoneId))
|
|
92
|
+
.map((stage) => stage.id)));
|
|
93
|
+
}
|
|
94
|
+
export { COMPILED_ZONE_KINDS };
|