@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,48 @@
|
|
|
1
|
+
import { WORKFLOW_SCHEMA_FILE } from "./compiled-schema.js";
|
|
2
|
+
export function buildRuntimeStageContract(options) {
|
|
3
|
+
const localSkillDocs = options.localSkillDocs ?? [];
|
|
4
|
+
const workflowNotes = options.workflowNotes ?? [];
|
|
5
|
+
return {
|
|
6
|
+
instructions: options.instructions,
|
|
7
|
+
counts: {
|
|
8
|
+
...(options.counts ?? {}),
|
|
9
|
+
local_skill_docs: localSkillDocs.length,
|
|
10
|
+
},
|
|
11
|
+
...(options.acceptance ? { acceptance: options.acceptance } : {}),
|
|
12
|
+
artifacts: {
|
|
13
|
+
reads: [
|
|
14
|
+
"interf.json",
|
|
15
|
+
`workflow/${WORKFLOW_SCHEMA_FILE}`,
|
|
16
|
+
...(options.extraReadArtifacts ?? []),
|
|
17
|
+
...options.stageReadArtifacts,
|
|
18
|
+
...localSkillDocs,
|
|
19
|
+
],
|
|
20
|
+
writes: options.stageWriteArtifacts,
|
|
21
|
+
verifies: [
|
|
22
|
+
`interf verify stage ${options.stageId} --json`,
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
policies: {
|
|
26
|
+
execution_mode: "deterministic",
|
|
27
|
+
status_prefixes: ["STATUS:", "DONE:", "BLOCKED:", "ERROR:"],
|
|
28
|
+
notes: [
|
|
29
|
+
`This is the "${options.stageLabel}" stage for the compiled context "${options.compiledName}".`,
|
|
30
|
+
"The workflow package is the authoritative method layer for this run.",
|
|
31
|
+
`Use \`workflow/${WORKFLOW_SCHEMA_FILE}\` as the deterministic zone-contract reference for this compiled context.`,
|
|
32
|
+
"Honor the declared read and write artifacts instead of inventing a parallel workflow.",
|
|
33
|
+
"Only create or update files that fall under the declared write targets for this stage.",
|
|
34
|
+
"Interf writes `.interf/runtime/` ledgers such as run, state, health, and view-spec files. Read them if needed, but do not create, edit, or replace them in this stage unless the contract explicitly marks a runtime artifact as stage-owned.",
|
|
35
|
+
"Keep scratch extraction commands single-purpose and non-destructive. Avoid wildcard cleanup and multi-command chains.",
|
|
36
|
+
...workflowNotes,
|
|
37
|
+
...(localSkillDocs.length > 0
|
|
38
|
+
? [
|
|
39
|
+
"Read any local instruction docs listed in the contract before you write artifacts or declare the stage complete.",
|
|
40
|
+
options.instructions.effective_mode === "override"
|
|
41
|
+
? "Local stage docs replace the default workflow guidance for this run, but they still do not bypass required writes, declared proof artifacts, or deterministic runtime reconciliation."
|
|
42
|
+
: "Local stage docs can refine the stage behavior, but they do not bypass required writes, declared proof artifacts, or deterministic runtime reconciliation.",
|
|
43
|
+
]
|
|
44
|
+
: []),
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type CompiledInventory, type CompiledInventoryEntry } from "./lib/schema.js";
|
|
2
|
+
export declare function emptyCompiledInventory(): CompiledInventory;
|
|
3
|
+
export declare function compiledInventoryFromEntries(entries: CompiledInventoryEntry[], stage?: string): CompiledInventory;
|
|
4
|
+
export declare function compiledInventoryEntryCount(inventory: CompiledInventory | null): number;
|
|
5
|
+
export declare function compiledInventoryTotal(inventory: CompiledInventory | null): number;
|
|
6
|
+
export declare function compiledInventoryFrontmatterScannedCount(inventory: CompiledInventory | null): number;
|
|
7
|
+
export declare function compiledInventoryAbstractCoverageCount(inventory: CompiledInventory | null): number;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export function emptyCompiledInventory() {
|
|
2
|
+
return {
|
|
3
|
+
kind: "compiled-runtime-ledger",
|
|
4
|
+
version: 1,
|
|
5
|
+
entries: [],
|
|
6
|
+
total: 0,
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function compiledInventoryFromEntries(entries, stage) {
|
|
10
|
+
return {
|
|
11
|
+
kind: "compiled-runtime-ledger",
|
|
12
|
+
version: 1,
|
|
13
|
+
...(stage ? { stage } : {}),
|
|
14
|
+
entries,
|
|
15
|
+
total: entries.length,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function compiledInventoryEntryCount(inventory) {
|
|
19
|
+
return inventory?.entries.length ?? 0;
|
|
20
|
+
}
|
|
21
|
+
export function compiledInventoryTotal(inventory) {
|
|
22
|
+
return inventory?.total ?? 0;
|
|
23
|
+
}
|
|
24
|
+
export function compiledInventoryFrontmatterScannedCount(inventory) {
|
|
25
|
+
return (inventory?.entries ?? []).filter((entry) => entry.metadata?.frontmatter_scanned === true).length;
|
|
26
|
+
}
|
|
27
|
+
export function compiledInventoryAbstractCoverageCount(inventory) {
|
|
28
|
+
return (inventory?.entries ?? []).filter((entry) => entry.metadata?.abstract_read === true || typeof entry.metadata?.abstract === "string").length;
|
|
29
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function runPath(dirPath: string): string;
|
|
2
|
+
export declare function runHistoryPath(dirPath: string): string;
|
|
3
|
+
export declare function stageContractPath(dirPath: string): string;
|
|
4
|
+
export declare function archivedStageContractPath(dirPath: string, runId: string): string;
|
|
5
|
+
export declare function logsDirPath(dirPath: string): string;
|
|
6
|
+
export declare function promptLogPath(dirPath: string, runId: string): string;
|
|
7
|
+
export declare function eventLogPath(dirPath: string, runId: string): string;
|
|
8
|
+
export declare function statusLogPath(dirPath: string, runId: string): string;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { compiledRuntimeArchivedStageContractPath, compiledRuntimeLogsRoot, compiledRuntimeRunHistoryPath, compiledRuntimeRunPath, compiledRuntimeStageContractPath, } from "../project-model/compiled-paths.js";
|
|
3
|
+
export function runPath(dirPath) {
|
|
4
|
+
return compiledRuntimeRunPath(dirPath);
|
|
5
|
+
}
|
|
6
|
+
export function runHistoryPath(dirPath) {
|
|
7
|
+
return compiledRuntimeRunHistoryPath(dirPath);
|
|
8
|
+
}
|
|
9
|
+
export function stageContractPath(dirPath) {
|
|
10
|
+
return compiledRuntimeStageContractPath(dirPath);
|
|
11
|
+
}
|
|
12
|
+
export function archivedStageContractPath(dirPath, runId) {
|
|
13
|
+
return compiledRuntimeArchivedStageContractPath(dirPath, runId);
|
|
14
|
+
}
|
|
15
|
+
export function logsDirPath(dirPath) {
|
|
16
|
+
return compiledRuntimeLogsRoot(dirPath);
|
|
17
|
+
}
|
|
18
|
+
export function promptLogPath(dirPath, runId) {
|
|
19
|
+
return join(logsDirPath(dirPath), `${runId}.prompt.txt`);
|
|
20
|
+
}
|
|
21
|
+
export function eventLogPath(dirPath, runId) {
|
|
22
|
+
return join(logsDirPath(dirPath), `${runId}.events.ndjson`);
|
|
23
|
+
}
|
|
24
|
+
export function statusLogPath(dirPath, runId) {
|
|
25
|
+
return join(logsDirPath(dirPath), `${runId}.status.log`);
|
|
26
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export function buildStagePrompt(instructions, contractPath, statusLines) {
|
|
2
|
+
const stageSkillDir = instructions.stage_skill_dir || "stage";
|
|
3
|
+
const modeNotes = instructions.effective_mode === "override"
|
|
4
|
+
? [
|
|
5
|
+
"Local stage instruction docs are authoritative for this run.",
|
|
6
|
+
"Do not fall back to bundled workflow heuristics unless the stage contract explicitly leaves room for them.",
|
|
7
|
+
"Interf still enforces the same required reads, writes, verifier outputs, and runtime reconciliation at stage close.",
|
|
8
|
+
]
|
|
9
|
+
: instructions.effective_mode === "extend"
|
|
10
|
+
? [
|
|
11
|
+
"Use the current compiled workflow docs as the default workflow for this run.",
|
|
12
|
+
"Then apply any additional local stage instruction docs referenced by the contract as stage-specific extensions.",
|
|
13
|
+
]
|
|
14
|
+
: [
|
|
15
|
+
"Use the current compiled workflow docs as the default workflow for this run.",
|
|
16
|
+
];
|
|
17
|
+
return [
|
|
18
|
+
`Interf workflow stage docs: workflow/compile/stages/${stageSkillDir}/`,
|
|
19
|
+
"",
|
|
20
|
+
"This is an automated Interf stage run, not an open-ended chat session.",
|
|
21
|
+
"The user has already invoked this stage through the Interf CLI. Execute it now.",
|
|
22
|
+
"Do not ask what the user wants, offer help, list tools, or wait for another instruction.",
|
|
23
|
+
`Read \`${contractPath}\` first. It is the authoritative contract for this stage.`,
|
|
24
|
+
"If `runtime/paths.json` exists in this shell, read it next. It maps workflow zone ids onto the shell-local `inputs/` and `outputs/` mounts for this stage.",
|
|
25
|
+
"For file-zone mounts, `runtime/paths.json` also gives the exact file path inside the `inputs/` or `outputs/` mount root.",
|
|
26
|
+
"Honor the contract's counts, artifact paths, and policies instead of inventing another workflow.",
|
|
27
|
+
"Read only the files named by the contract's `artifacts.reads` list plus any paths they explicitly direct you to open.",
|
|
28
|
+
"Prefer direct file-reading and search tools over shell commands when you inspect inputs, docs, or generated outputs.",
|
|
29
|
+
"Do not use shell helpers like `cat`, `sed`, `ls`, or `find` for routine file inspection if a native read/search tool can do the same job.",
|
|
30
|
+
"If the contract lists `instructions.local_docs`, open every one of those files before you write artifacts or declare the stage complete.",
|
|
31
|
+
"If `AGENTS.md` is listed in the contract, use it only for context-folder routing that is directly relevant to this stage.",
|
|
32
|
+
"`.interf/runtime/run.json`, `.interf/runtime/state.json`, `.interf/runtime/health.json`, and `.interf/runtime/view-spec.json` are runtime artifacts written by Interf. You may read them, but do not create, edit, or replace them unless the contract explicitly marks a different proof artifact as stage-owned.",
|
|
33
|
+
"If a contract-listed output file does not exist yet, create it in one whole-file write. Do not attempt patch-style edits against a missing runtime path.",
|
|
34
|
+
"Stay inside the current compiled context. Do not try to open repo docs, repo source files, or other paths outside the compiled context unless the stage contract explicitly requires them.",
|
|
35
|
+
instructions.effective_mode === "override"
|
|
36
|
+
? "Do not depend on any repo-root or globally installed skill cache for this run. Local stage instruction docs are the primary workflow layer for this run."
|
|
37
|
+
: "Do not depend on any repo-root or globally installed skill cache for this run. Use the current compiled workflow docs and the contract as the default behavior.",
|
|
38
|
+
...modeNotes,
|
|
39
|
+
"Do not narrate intentions, plans, or reasoning to the user.",
|
|
40
|
+
"Only emit user-visible updates that begin with STATUS:, DONE:, BLOCKED:, or ERROR:.",
|
|
41
|
+
"Those status lines are progress hints for the operator. The CLI decides stage completion from artifacts, validation, and reconcile checks rather than trusting status text alone.",
|
|
42
|
+
"Before any long-running raw inspection or shell-based helper step, emit a STATUS: line that names the current subtask.",
|
|
43
|
+
"If work stays in progress, do not remain silent for more than about one minute. Emit another STATUS: line when you switch files, page groups, targets, or extraction methods.",
|
|
44
|
+
"If you respond conversationally instead of executing the stage, the run will be treated as failed.",
|
|
45
|
+
"As soon as the required proof artifacts are complete, stop. Do not keep browsing or auditing after the contract is satisfied.",
|
|
46
|
+
...statusLines,
|
|
47
|
+
].join("\n");
|
|
48
|
+
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { existsSync, readFileSync, statSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { extname, join, relative } from "node:path";
|
|
3
|
+
import { listFilesRecursive } from "../../lib/filesystem.js";
|
|
4
|
+
import { compiledZoneAbsolutePath, findCompiledSchemaZone, readCompiledSchemaFile, } from "./compiled-schema.js";
|
|
5
|
+
import { parseJsonFrontmatter } from "../../lib/parse.js";
|
|
6
|
+
import { loadRuntimeRun } from "./runtime.js";
|
|
7
|
+
import { initCompiledState, loadState, refreshCompiledArtifacts, saveState, } from "./state.js";
|
|
8
|
+
import { compiledInventoryFromEntries } from "./runtime-inventory.js";
|
|
9
|
+
import { compiledRuntimeRoot } from "../project-model/compiled-paths.js";
|
|
10
|
+
import { extractSynthAbstract, isOutputMarkdownFile } from "./validate.js";
|
|
11
|
+
function readActiveRunStartedAtMs(dirPath) {
|
|
12
|
+
const run = loadRuntimeRun(dirPath);
|
|
13
|
+
if (!run)
|
|
14
|
+
return null;
|
|
15
|
+
const startedAtMs = Date.parse(run.started_at);
|
|
16
|
+
return Number.isFinite(startedAtMs) ? startedAtMs : null;
|
|
17
|
+
}
|
|
18
|
+
function anyPathUpdatedSince(absolutePath, sinceMs) {
|
|
19
|
+
if (!existsSync(absolutePath))
|
|
20
|
+
return false;
|
|
21
|
+
try {
|
|
22
|
+
const stat = statSync(absolutePath);
|
|
23
|
+
if (stat.isFile())
|
|
24
|
+
return stat.mtimeMs >= sinceMs;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
for (const filePath of listFilesRecursive(absolutePath)) {
|
|
30
|
+
try {
|
|
31
|
+
if (statSync(filePath).mtimeMs >= sinceMs)
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
function zoneArtifactCount(dirPath, zonePath, kind) {
|
|
41
|
+
const absolutePath = compiledZoneAbsolutePath(dirPath, { path: zonePath });
|
|
42
|
+
if (!existsSync(absolutePath))
|
|
43
|
+
return 0;
|
|
44
|
+
if (kind === "file")
|
|
45
|
+
return 1;
|
|
46
|
+
return listFilesRecursive(absolutePath).length;
|
|
47
|
+
}
|
|
48
|
+
function summaryAbstract(content) {
|
|
49
|
+
const parsed = parseJsonFrontmatter(content);
|
|
50
|
+
if (!parsed)
|
|
51
|
+
return null;
|
|
52
|
+
return extractSynthAbstract(parsed.frontmatter, parsed.body);
|
|
53
|
+
}
|
|
54
|
+
function listZoneArtifacts(dirPath, zone) {
|
|
55
|
+
const absolutePath = compiledZoneAbsolutePath(dirPath, zone);
|
|
56
|
+
if (!existsSync(absolutePath) || zone.kind === "runtime")
|
|
57
|
+
return [];
|
|
58
|
+
if (zone.kind === "file") {
|
|
59
|
+
try {
|
|
60
|
+
return statSync(absolutePath).isFile() ? [absolutePath] : [];
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return listFilesRecursive(absolutePath);
|
|
67
|
+
}
|
|
68
|
+
function buildInventoryMetadata(options) {
|
|
69
|
+
const metadata = {
|
|
70
|
+
zone_id: options.zoneId,
|
|
71
|
+
zone_kind: options.zoneKind,
|
|
72
|
+
file_extension: extname(options.filePath).toLowerCase() || null,
|
|
73
|
+
};
|
|
74
|
+
if (!options.parsedFrontmatter) {
|
|
75
|
+
return metadata;
|
|
76
|
+
}
|
|
77
|
+
metadata.frontmatter_scanned = true;
|
|
78
|
+
const abstract = summaryAbstract(readFileSync(options.filePath, "utf8"));
|
|
79
|
+
if (abstract) {
|
|
80
|
+
metadata.abstract = abstract;
|
|
81
|
+
metadata.abstract_read = true;
|
|
82
|
+
}
|
|
83
|
+
const frontmatter = options.parsedFrontmatter.frontmatter;
|
|
84
|
+
if (typeof frontmatter.source_kind === "string") {
|
|
85
|
+
metadata.source_kind = frontmatter.source_kind;
|
|
86
|
+
}
|
|
87
|
+
if (typeof frontmatter.evidence_tier === "string") {
|
|
88
|
+
metadata.evidence_tier = frontmatter.evidence_tier;
|
|
89
|
+
}
|
|
90
|
+
if (typeof frontmatter.truth_mode === "string") {
|
|
91
|
+
metadata.truth_mode = frontmatter.truth_mode;
|
|
92
|
+
}
|
|
93
|
+
return metadata;
|
|
94
|
+
}
|
|
95
|
+
function buildStageInventoryEntries(dirPath, stage) {
|
|
96
|
+
const schema = readCompiledSchemaFile(join(dirPath, ".interf", "workflow"));
|
|
97
|
+
if (!schema)
|
|
98
|
+
return [];
|
|
99
|
+
const readableInputZones = stage.reads
|
|
100
|
+
.map((zoneId) => findCompiledSchemaZone(schema, zoneId))
|
|
101
|
+
.filter((zone) => zone !== null && zone.kind !== "runtime");
|
|
102
|
+
const outputZones = stage.writes
|
|
103
|
+
.map((zoneId) => findCompiledSchemaZone(schema, zoneId))
|
|
104
|
+
.filter((zone) => zone !== null && zone.kind !== "runtime");
|
|
105
|
+
if (outputZones.length === 0)
|
|
106
|
+
return [];
|
|
107
|
+
const entries = [];
|
|
108
|
+
for (const outputZone of outputZones) {
|
|
109
|
+
for (const filePath of listZoneArtifacts(dirPath, outputZone)) {
|
|
110
|
+
const relativeOutputPath = relative(dirPath, filePath).replaceAll("\\", "/");
|
|
111
|
+
const parsed = isOutputMarkdownFile(filePath)
|
|
112
|
+
? parseJsonFrontmatter(readFileSync(filePath, "utf8"))
|
|
113
|
+
: null;
|
|
114
|
+
const sourcePath = typeof parsed?.frontmatter.source === "string"
|
|
115
|
+
? parsed.frontmatter.source.trim()
|
|
116
|
+
: "";
|
|
117
|
+
const sourceZoneId = typeof parsed?.frontmatter.source_zone === "string"
|
|
118
|
+
? parsed.frontmatter.source_zone.trim()
|
|
119
|
+
: "";
|
|
120
|
+
const inputZone = sourceZoneId.length > 0
|
|
121
|
+
? readableInputZones.find((zone) => zone.id === sourceZoneId) ?? null
|
|
122
|
+
: readableInputZones.length === 1
|
|
123
|
+
? readableInputZones[0]
|
|
124
|
+
: null;
|
|
125
|
+
entries.push({
|
|
126
|
+
...(inputZone && sourcePath.length > 0
|
|
127
|
+
? {
|
|
128
|
+
input_zone: inputZone.id,
|
|
129
|
+
input_path: sourcePath,
|
|
130
|
+
}
|
|
131
|
+
: {}),
|
|
132
|
+
output_zone: outputZone.id,
|
|
133
|
+
output_path: relativeOutputPath,
|
|
134
|
+
...(typeof parsed?.frontmatter.state === "string"
|
|
135
|
+
? { state: parsed.frontmatter.state }
|
|
136
|
+
: {}),
|
|
137
|
+
metadata: buildInventoryMetadata({
|
|
138
|
+
zoneId: outputZone.id,
|
|
139
|
+
zoneKind: outputZone.kind,
|
|
140
|
+
filePath,
|
|
141
|
+
parsedFrontmatter: parsed,
|
|
142
|
+
}),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return entries.sort((left, right) => `${left.output_zone}:${left.output_path}`.localeCompare(`${right.output_zone}:${right.output_path}`));
|
|
147
|
+
}
|
|
148
|
+
function writeStageInventory(dirPath, stageId, entries) {
|
|
149
|
+
writeFileSync(join(compiledRuntimeRoot(dirPath), "inventory.json"), JSON.stringify(compiledInventoryFromEntries(entries, stageId), null, 2) + "\n");
|
|
150
|
+
}
|
|
151
|
+
function activeRunCounts(dirPath) {
|
|
152
|
+
return { ...(loadRuntimeRun(dirPath)?.counts ?? {}) };
|
|
153
|
+
}
|
|
154
|
+
export function reconcileCompiledStageRun(dirPath, stage) {
|
|
155
|
+
const startedAtMs = readActiveRunStartedAtMs(dirPath);
|
|
156
|
+
if (startedAtMs === null)
|
|
157
|
+
return false;
|
|
158
|
+
const schema = readCompiledSchemaFile(join(dirPath, ".interf", "workflow"));
|
|
159
|
+
if (!schema)
|
|
160
|
+
return false;
|
|
161
|
+
const writeZones = stage.writes
|
|
162
|
+
.map((zoneId) => findCompiledSchemaZone(schema, zoneId))
|
|
163
|
+
.filter((zone) => zone !== null);
|
|
164
|
+
if (writeZones.length === 0)
|
|
165
|
+
return false;
|
|
166
|
+
if (!writeZones.some((zone) => anyPathUpdatedSince(compiledZoneAbsolutePath(dirPath, zone), startedAtMs))) {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
writeStageInventory(dirPath, stage.id, buildStageInventoryEntries(dirPath, stage));
|
|
170
|
+
const currentState = {
|
|
171
|
+
...initCompiledState(),
|
|
172
|
+
...(loadState(dirPath) ?? {}),
|
|
173
|
+
stages: {
|
|
174
|
+
...(loadState(dirPath)?.stages ?? {}),
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
const now = new Date().toISOString();
|
|
178
|
+
currentState.stages[stage.id] = {
|
|
179
|
+
contract_type: stage.contractType,
|
|
180
|
+
status: "succeeded",
|
|
181
|
+
started_at: loadRuntimeRun(dirPath)?.started_at ?? now,
|
|
182
|
+
finished_at: now,
|
|
183
|
+
counts: activeRunCounts(dirPath),
|
|
184
|
+
zone_counts: Object.fromEntries(writeZones.map((zone) => [zone.id, zoneArtifactCount(dirPath, zone.path, zone.kind)])),
|
|
185
|
+
artifacts: writeZones.map((zone) => zone.kind === "file" ? zone.path : `${zone.path}/`),
|
|
186
|
+
summary: loadRuntimeRun(dirPath)?.summary ?? null,
|
|
187
|
+
run_id: loadRuntimeRun(dirPath)?.run_id ?? null,
|
|
188
|
+
};
|
|
189
|
+
currentState.last_compile = now;
|
|
190
|
+
saveState(dirPath, currentState);
|
|
191
|
+
refreshCompiledArtifacts(dirPath, { ensureViewSpec: true });
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type RuntimeRun, type RuntimeStageContract } from "./lib/schema.js";
|
|
2
|
+
import { type RuntimeRunPatch, type RuntimeStageExecutionOptions, type RuntimeSummarizeExecutionOptions } from "./runtime-types.js";
|
|
3
|
+
export declare function loadRuntimeRun(dirPath: string): RuntimeRun | null;
|
|
4
|
+
export declare function saveRuntimeRun(dirPath: string, run: RuntimeRun): void;
|
|
5
|
+
export declare function writeStageContract(dirPath: string, contract: RuntimeStageContract): string;
|
|
6
|
+
export declare function runExecutorStage(options: RuntimeStageExecutionOptions): Promise<number>;
|
|
7
|
+
export declare function runExecutorSummarizeStage(options: RuntimeSummarizeExecutionOptions): Promise<number>;
|
|
8
|
+
export declare function beginRuntimeRun(dirPath: string, run: RuntimeRun): RuntimeRun;
|
|
9
|
+
export declare function updateRuntimeRun(dirPath: string, patch: RuntimeRunPatch): RuntimeRun | null;
|
|
10
|
+
export declare function markRuntimeRunFailedAfterValidation(dirPath: string, summary: string): RuntimeRun | null;
|
|
11
|
+
export declare function markRuntimeRunSucceededAfterValidation(dirPath: string, summary: string): RuntimeRun | null;
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { appendFileSync, mkdirSync, existsSync, readFileSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import { dirname, join, relative } from "node:path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { countFilesRecursive } from "../../lib/filesystem.js";
|
|
5
|
+
import { buildRuntimeExecutorInfo } from "../agents/lib/executors.js";
|
|
6
|
+
import { RuntimeRunSchema, } from "./lib/schema.js";
|
|
7
|
+
import { getWorkflowStageDefinition, getWorkflowStagePosition, getWorkflowStages, } from "../workflow-package/workflow-definitions.js";
|
|
8
|
+
import { archivedStageContractPath, eventLogPath, logsDirPath, promptLogPath, runHistoryPath, runPath, stageContractPath, statusLogPath, } from "./runtime-paths.js";
|
|
9
|
+
import { warnInterf } from "../../lib/logger.js";
|
|
10
|
+
export function loadRuntimeRun(dirPath) {
|
|
11
|
+
const path = runPath(dirPath);
|
|
12
|
+
if (!existsSync(path))
|
|
13
|
+
return null;
|
|
14
|
+
try {
|
|
15
|
+
const raw = JSON.parse(readFileSync(path, "utf8"));
|
|
16
|
+
const parsed = RuntimeRunSchema.safeParse(raw);
|
|
17
|
+
if (parsed.success)
|
|
18
|
+
return parsed.data;
|
|
19
|
+
warnInterf(`Warning: failed to validate runtime run at ${path}: ${parsed.error.issues.map((issue) => issue.message).join("; ")}`);
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
warnInterf(`Warning: failed to read runtime run at ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function saveRuntimeRun(dirPath, run) {
|
|
28
|
+
mkdirSync(dirname(runPath(dirPath)), { recursive: true });
|
|
29
|
+
writeFileSync(runPath(dirPath), JSON.stringify(run, null, 2) + "\n");
|
|
30
|
+
}
|
|
31
|
+
export function writeStageContract(dirPath, contract) {
|
|
32
|
+
mkdirSync(dirname(stageContractPath(dirPath)), { recursive: true });
|
|
33
|
+
const path = stageContractPath(dirPath);
|
|
34
|
+
writeFileSync(path, JSON.stringify(contract, null, 2) + "\n");
|
|
35
|
+
return path;
|
|
36
|
+
}
|
|
37
|
+
function writeArchivedStageContract(dirPath, runId, contract) {
|
|
38
|
+
const path = archivedStageContractPath(dirPath, runId);
|
|
39
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
40
|
+
writeFileSync(path, JSON.stringify(contract, null, 2) + "\n");
|
|
41
|
+
return path;
|
|
42
|
+
}
|
|
43
|
+
export async function runExecutorStage(options) {
|
|
44
|
+
const startedRun = startRuntimeRun(options);
|
|
45
|
+
const prompt = options.buildPrompt(startedRun.activeContractPath);
|
|
46
|
+
writeRuntimeRunPrompt(options.compiledPath, startedRun.run.run_id, prompt);
|
|
47
|
+
const executionPath = options.executionPath ?? options.compiledPath;
|
|
48
|
+
const code = await options.executor.execute(executionPath, prompt, {
|
|
49
|
+
eventLogPath: eventLogPath(options.compiledPath, startedRun.run.run_id),
|
|
50
|
+
statusLogPath: statusLogPath(options.compiledPath, startedRun.run.run_id),
|
|
51
|
+
completionCheck: options.completionCheck,
|
|
52
|
+
});
|
|
53
|
+
finalizeRuntimeRun(options.compiledPath, code);
|
|
54
|
+
return code;
|
|
55
|
+
}
|
|
56
|
+
export async function runExecutorSummarizeStage(options) {
|
|
57
|
+
const startedRun = startRuntimeRun(options);
|
|
58
|
+
const prompt = options.buildPrompt(startedRun.activeContractPath);
|
|
59
|
+
let lastReported = 0;
|
|
60
|
+
writeRuntimeRunPrompt(options.compiledPath, startedRun.run.run_id, prompt);
|
|
61
|
+
const executionPath = options.executionPath ?? options.compiledPath;
|
|
62
|
+
const progressPromise = options.executor.execute(executionPath, prompt, {
|
|
63
|
+
eventLogPath: eventLogPath(options.compiledPath, startedRun.run.run_id),
|
|
64
|
+
statusLogPath: statusLogPath(options.compiledPath, startedRun.run.run_id),
|
|
65
|
+
completionCheck: options.completionCheck,
|
|
66
|
+
});
|
|
67
|
+
const timer = setInterval(() => {
|
|
68
|
+
const currentSummaryCount = countFilesRecursive(join(options.compiledPath, "summaries"));
|
|
69
|
+
const completed = Math.max(0, Math.min(options.targetCount, currentSummaryCount - options.startingSummaryCount));
|
|
70
|
+
if (completed <= lastReported)
|
|
71
|
+
return;
|
|
72
|
+
lastReported = completed;
|
|
73
|
+
updateRuntimeRun(options.compiledPath, {
|
|
74
|
+
counts: {
|
|
75
|
+
...startedRun.run.counts,
|
|
76
|
+
completed_summaries: completed,
|
|
77
|
+
target_summaries: options.targetCount,
|
|
78
|
+
},
|
|
79
|
+
summary: `${options.stageLabel} ${completed}/${options.targetCount} source files into summaries.`,
|
|
80
|
+
});
|
|
81
|
+
console.log(chalk.dim(` STATUS: wrote ${completed}/${options.targetCount} summaries`));
|
|
82
|
+
}, 10000);
|
|
83
|
+
try {
|
|
84
|
+
const code = await progressPromise;
|
|
85
|
+
finalizeRuntimeRun(options.compiledPath, code);
|
|
86
|
+
return code;
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
clearInterval(timer);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export function beginRuntimeRun(dirPath, run) {
|
|
93
|
+
saveRuntimeRun(dirPath, run);
|
|
94
|
+
return run;
|
|
95
|
+
}
|
|
96
|
+
export function updateRuntimeRun(dirPath, patch) {
|
|
97
|
+
const current = loadRuntimeRun(dirPath);
|
|
98
|
+
if (!current)
|
|
99
|
+
return null;
|
|
100
|
+
const next = {
|
|
101
|
+
...current,
|
|
102
|
+
...patch,
|
|
103
|
+
updated_at: new Date().toISOString(),
|
|
104
|
+
};
|
|
105
|
+
saveRuntimeRun(dirPath, next);
|
|
106
|
+
return next;
|
|
107
|
+
}
|
|
108
|
+
export function markRuntimeRunFailedAfterValidation(dirPath, summary) {
|
|
109
|
+
const current = loadRuntimeRun(dirPath);
|
|
110
|
+
if (!current)
|
|
111
|
+
return null;
|
|
112
|
+
const finishedAt = current.finished_at ?? new Date().toISOString();
|
|
113
|
+
const next = {
|
|
114
|
+
...current,
|
|
115
|
+
status: "failed",
|
|
116
|
+
updated_at: new Date().toISOString(),
|
|
117
|
+
finished_at: finishedAt,
|
|
118
|
+
exit_code: 1,
|
|
119
|
+
error: summary,
|
|
120
|
+
summary,
|
|
121
|
+
};
|
|
122
|
+
saveRuntimeRun(dirPath, next);
|
|
123
|
+
replaceOrAppendRunHistoryEntry(dirPath, next);
|
|
124
|
+
return next;
|
|
125
|
+
}
|
|
126
|
+
export function markRuntimeRunSucceededAfterValidation(dirPath, summary) {
|
|
127
|
+
const current = loadRuntimeRun(dirPath);
|
|
128
|
+
if (!current)
|
|
129
|
+
return null;
|
|
130
|
+
const finishedAt = current.finished_at ?? new Date().toISOString();
|
|
131
|
+
const next = {
|
|
132
|
+
...current,
|
|
133
|
+
status: "succeeded",
|
|
134
|
+
updated_at: new Date().toISOString(),
|
|
135
|
+
finished_at: finishedAt,
|
|
136
|
+
exit_code: 0,
|
|
137
|
+
error: null,
|
|
138
|
+
summary,
|
|
139
|
+
};
|
|
140
|
+
saveRuntimeRun(dirPath, next);
|
|
141
|
+
replaceOrAppendRunHistoryEntry(dirPath, next);
|
|
142
|
+
return next;
|
|
143
|
+
}
|
|
144
|
+
function startRuntimeRun(options) {
|
|
145
|
+
const runId = createRunId();
|
|
146
|
+
const generatedAt = new Date().toISOString();
|
|
147
|
+
const workflowStages = getWorkflowStages(options.workflow, options.workflowSourcePath);
|
|
148
|
+
const stagePosition = getWorkflowStagePosition(options.workflow, options.stage, options.workflowSourcePath);
|
|
149
|
+
const stageDefinition = getWorkflowStageDefinition(options.workflow, options.stage, options.workflowSourcePath);
|
|
150
|
+
const contract = {
|
|
151
|
+
kind: "interf-stage-contract",
|
|
152
|
+
version: 1,
|
|
153
|
+
generated_at: generatedAt,
|
|
154
|
+
run_id: runId,
|
|
155
|
+
target_type: "compiled",
|
|
156
|
+
target_name: options.compiledName,
|
|
157
|
+
workflow: {
|
|
158
|
+
id: options.workflow,
|
|
159
|
+
stage_index: stagePosition?.stageIndex ?? null,
|
|
160
|
+
stage_total: stagePosition?.stageTotal ?? workflowStages.length,
|
|
161
|
+
stages: stagePosition?.stages ?? workflowStages,
|
|
162
|
+
},
|
|
163
|
+
stage: options.stage,
|
|
164
|
+
stage_label: stageDefinition?.label ?? options.stageLabel,
|
|
165
|
+
contract_type: options.contractType,
|
|
166
|
+
executor: buildRuntimeExecutorInfo(options.executor),
|
|
167
|
+
instructions: options.contract.instructions,
|
|
168
|
+
counts: options.contract.counts,
|
|
169
|
+
...(options.contract.acceptance ? { acceptance: options.contract.acceptance } : {}),
|
|
170
|
+
artifacts: options.contract.artifacts,
|
|
171
|
+
policies: options.contract.policies,
|
|
172
|
+
};
|
|
173
|
+
const activeContractPath = writeStageContract(options.compiledPath, contract);
|
|
174
|
+
const archivedContractPath = writeArchivedStageContract(options.compiledPath, runId, contract);
|
|
175
|
+
const run = {
|
|
176
|
+
kind: "interf-run",
|
|
177
|
+
version: 1,
|
|
178
|
+
run_id: runId,
|
|
179
|
+
target_type: "compiled",
|
|
180
|
+
target_name: options.compiledName,
|
|
181
|
+
workflow: options.workflow,
|
|
182
|
+
stage: options.stage,
|
|
183
|
+
stage_label: stageDefinition?.label ?? options.stageLabel,
|
|
184
|
+
contract_type: options.contractType,
|
|
185
|
+
status: "running",
|
|
186
|
+
executor: buildRuntimeExecutorInfo(options.executor),
|
|
187
|
+
started_at: generatedAt,
|
|
188
|
+
updated_at: generatedAt,
|
|
189
|
+
finished_at: null,
|
|
190
|
+
contract_path: relative(options.compiledPath, archivedContractPath),
|
|
191
|
+
...(options.executionPath ? { execution_path: relative(options.compiledPath, options.executionPath) } : {}),
|
|
192
|
+
counts: { ...contract.counts },
|
|
193
|
+
output_artifacts: [...contract.artifacts.writes],
|
|
194
|
+
logs: {
|
|
195
|
+
prompt_path: relative(options.compiledPath, promptLogPath(options.compiledPath, runId)),
|
|
196
|
+
event_stream_path: relative(options.compiledPath, eventLogPath(options.compiledPath, runId)),
|
|
197
|
+
status_path: relative(options.compiledPath, statusLogPath(options.compiledPath, runId)),
|
|
198
|
+
},
|
|
199
|
+
summary: options.summary,
|
|
200
|
+
exit_code: null,
|
|
201
|
+
error: null,
|
|
202
|
+
};
|
|
203
|
+
return {
|
|
204
|
+
run: beginRuntimeRun(options.compiledPath, run),
|
|
205
|
+
activeContractPath: options.executionPath
|
|
206
|
+
? "runtime/stage-contract.json"
|
|
207
|
+
: relative(options.compiledPath, activeContractPath),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function finalizeRuntimeRun(dirPath, code) {
|
|
211
|
+
const current = loadRuntimeRun(dirPath);
|
|
212
|
+
if (!current)
|
|
213
|
+
return null;
|
|
214
|
+
const finishedAt = new Date().toISOString();
|
|
215
|
+
const next = {
|
|
216
|
+
...current,
|
|
217
|
+
status: code === 0 ? "succeeded" : "failed",
|
|
218
|
+
updated_at: finishedAt,
|
|
219
|
+
finished_at: finishedAt,
|
|
220
|
+
exit_code: code,
|
|
221
|
+
error: code === 0 ? null : `Executor exited with code ${code}.`,
|
|
222
|
+
summary: code === 0
|
|
223
|
+
? `${current.stage_label} completed successfully.`
|
|
224
|
+
: `${current.stage_label} failed with exit code ${code}.`,
|
|
225
|
+
};
|
|
226
|
+
saveRuntimeRun(dirPath, next);
|
|
227
|
+
appendFileSync(runHistoryPath(dirPath), JSON.stringify(next) + "\n");
|
|
228
|
+
return next;
|
|
229
|
+
}
|
|
230
|
+
function writeRuntimeRunPrompt(dirPath, runId, prompt) {
|
|
231
|
+
mkdirSync(logsDirPath(dirPath), { recursive: true });
|
|
232
|
+
writeFileSync(promptLogPath(dirPath, runId), `${prompt}\n`);
|
|
233
|
+
}
|
|
234
|
+
function createRunId() {
|
|
235
|
+
return `run_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
|
|
236
|
+
}
|
|
237
|
+
function replaceOrAppendRunHistoryEntry(dirPath, run) {
|
|
238
|
+
const historyPath = runHistoryPath(dirPath);
|
|
239
|
+
if (!existsSync(historyPath)) {
|
|
240
|
+
appendFileSync(historyPath, JSON.stringify(run) + "\n");
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
const raw = readFileSync(historyPath, "utf8");
|
|
244
|
+
const lines = raw.split("\n").filter((line) => line.trim().length > 0);
|
|
245
|
+
let replaced = false;
|
|
246
|
+
const nextLines = lines.map((line) => {
|
|
247
|
+
try {
|
|
248
|
+
const entry = JSON.parse(line);
|
|
249
|
+
if (entry.run_id === run.run_id) {
|
|
250
|
+
replaced = true;
|
|
251
|
+
return JSON.stringify(run);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
// preserve malformed history lines as-is
|
|
256
|
+
}
|
|
257
|
+
return line;
|
|
258
|
+
});
|
|
259
|
+
if (!replaced)
|
|
260
|
+
nextLines.push(JSON.stringify(run));
|
|
261
|
+
writeFileSync(historyPath, `${nextLines.join("\n")}\n`);
|
|
262
|
+
}
|