@interf/compiler 0.22.2 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +119 -282
- package/dist/bin-mcp.d.ts +2 -0
- package/dist/bin-mcp.js +63 -0
- package/dist/bin-runtime.d.ts +2 -0
- package/dist/bin-runtime.js +111 -0
- package/dist/cli/commands/agents.js +4 -35
- package/dist/cli/commands/auth.d.ts +20 -0
- package/dist/cli/commands/auth.js +161 -0
- package/dist/cli/commands/benchmark.d.ts +9 -0
- package/dist/cli/commands/benchmark.js +58 -0
- package/dist/cli/commands/build-plan.js +107 -139
- package/dist/cli/commands/build.d.ts +3 -4
- package/dist/cli/commands/build.js +16 -45
- package/dist/cli/commands/doctor.js +3 -3
- package/dist/cli/commands/graphs.d.ts +2 -0
- package/dist/cli/commands/graphs.js +344 -0
- package/dist/cli/commands/login.js +4 -6
- package/dist/cli/commands/logout.js +1 -1
- package/dist/cli/commands/mcp.d.ts +4 -2
- package/dist/cli/commands/mcp.js +846 -232
- package/dist/cli/commands/project.d.ts +2 -0
- package/dist/cli/commands/project.js +176 -0
- package/dist/cli/commands/reset.d.ts +3 -4
- package/dist/cli/commands/reset.js +10 -31
- package/dist/cli/commands/runs.js +136 -57
- package/dist/cli/commands/runtime.d.ts +24 -0
- package/dist/cli/commands/runtime.js +373 -0
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.js +35 -45
- package/dist/cli/commands/traces.d.ts +2 -0
- package/dist/cli/commands/traces.js +97 -0
- package/dist/cli/commands/wizard.js +171 -178
- package/dist/cli/index.d.ts +7 -4
- package/dist/cli/index.js +13 -7
- package/dist/cli/lib/http-client.d.ts +39 -0
- package/dist/cli/lib/http-client.js +73 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/packages/build-plans/authoring/brief.d.ts +538 -0
- package/dist/packages/build-plans/authoring/brief.js +89 -0
- package/dist/packages/build-plans/authoring/build-plan-authoring.d.ts +52 -11
- package/dist/packages/build-plans/authoring/build-plan-authoring.js +493 -46
- package/dist/packages/build-plans/authoring/build-plan-edit-session.d.ts +10 -1
- package/dist/packages/build-plans/authoring/build-plan-edit-session.js +27 -4
- package/dist/packages/build-plans/authoring/build-plan-improvement.d.ts +9 -6
- package/dist/packages/build-plans/authoring/build-plan-improvement.js +97 -46
- package/dist/packages/build-plans/authoring/lib/build-plan-edit-utils.d.ts +1 -0
- package/dist/packages/build-plans/authoring/lib/build-plan-edit-utils.js +7 -7
- package/dist/packages/build-plans/build-plan-resolution.d.ts +1 -1
- package/dist/packages/build-plans/build-plan-resolution.js +3 -3
- package/dist/packages/build-plans/index.d.ts +1 -1
- package/dist/packages/build-plans/index.js +1 -1
- package/dist/packages/build-plans/package/build-plan-definitions.d.ts +14 -13
- package/dist/packages/build-plans/package/build-plan-definitions.js +45 -42
- package/dist/packages/build-plans/package/build-plan-helpers.d.ts +3 -2
- package/dist/packages/build-plans/package/build-plan-helpers.js +27 -13
- package/dist/packages/build-plans/package/build-plan-review-paths.d.ts +5 -5
- package/dist/packages/build-plans/package/build-plan-review-paths.js +15 -15
- package/dist/packages/build-plans/package/build-plan-stage-runner.d.ts +5 -4
- package/dist/packages/build-plans/package/build-plan-stage-runner.js +23 -11
- package/dist/packages/build-plans/package/builtin-build-plan.d.ts +7 -8
- package/dist/packages/build-plans/package/builtin-build-plan.js +10 -11
- package/dist/packages/build-plans/package/context-interface.d.ts +14 -9
- package/dist/packages/build-plans/package/context-interface.js +14 -33
- package/dist/packages/build-plans/package/interf-build-plan-package.d.ts +6 -17
- package/dist/packages/build-plans/package/interf-build-plan-package.js +68 -64
- package/dist/packages/build-plans/package/local-build-plans.d.ts +21 -14
- package/dist/packages/build-plans/package/local-build-plans.js +105 -55
- package/dist/packages/build-plans/package/user-build-plans.js +1 -1
- package/dist/packages/contracts/index.d.ts +5 -2
- package/dist/packages/contracts/index.js +3 -1
- package/dist/packages/contracts/lib/context-graph-layer.d.ts +161 -0
- package/dist/packages/contracts/lib/context-graph-layer.js +216 -0
- package/dist/packages/contracts/lib/project-paths.d.ts +144 -0
- package/dist/packages/contracts/lib/project-paths.js +220 -0
- package/dist/packages/contracts/lib/project-schema.d.ts +423 -0
- package/dist/packages/contracts/lib/project-schema.js +138 -0
- package/dist/packages/contracts/lib/schema.d.ts +1273 -81
- package/dist/packages/contracts/lib/schema.js +675 -79
- package/dist/packages/contracts/utils/filesystem.d.ts +1 -0
- package/dist/packages/contracts/utils/filesystem.js +29 -1
- package/dist/packages/contracts/utils/parse.js +67 -0
- package/dist/packages/projects/index.d.ts +6 -0
- package/dist/packages/{project → projects}/index.js +0 -3
- package/dist/packages/{project → projects}/interf-detect.d.ts +12 -12
- package/dist/packages/{project → projects}/interf-detect.js +56 -50
- package/dist/packages/projects/interf.d.ts +2 -0
- package/dist/packages/projects/interf.js +1 -0
- package/dist/packages/projects/lib/schema.d.ts +77 -0
- package/dist/packages/projects/lib/schema.js +91 -0
- package/dist/packages/projects/source-config.d.ts +53 -0
- package/dist/packages/projects/source-config.js +339 -0
- package/dist/packages/projects/source-folders.d.ts +11 -0
- package/dist/packages/{project → projects}/source-folders.js +26 -26
- package/dist/packages/{engine → runtime}/action-planner.d.ts +1 -1
- package/dist/packages/{engine → runtime}/action-planner.js +20 -22
- package/dist/packages/runtime/action-values.d.ts +1 -0
- package/dist/packages/runtime/action-values.js +1 -0
- package/dist/packages/runtime/actions/errors.d.ts +2 -0
- package/dist/packages/runtime/actions/errors.js +12 -0
- package/dist/packages/runtime/actions/fields.d.ts +86 -0
- package/dist/packages/runtime/actions/form-builders.d.ts +14 -0
- package/dist/packages/runtime/actions/form-builders.js +667 -0
- package/dist/packages/runtime/actions/form-validators.d.ts +8 -0
- package/dist/packages/runtime/actions/form-validators.js +134 -0
- package/dist/packages/runtime/actions/helpers.d.ts +11 -0
- package/dist/packages/runtime/actions/helpers.js +80 -0
- package/dist/packages/runtime/actions/index.d.ts +8 -0
- package/dist/packages/runtime/actions/index.js +11 -0
- package/dist/packages/runtime/actions/registry.d.ts +64 -0
- package/dist/packages/runtime/actions/registry.js +62 -0
- package/dist/packages/runtime/actions/requests.d.ts +45 -0
- package/dist/packages/runtime/actions/requests.js +164 -0
- package/dist/packages/runtime/actions/schemas.d.ts +161 -0
- package/dist/packages/runtime/actions/schemas.js +37 -0
- package/dist/packages/runtime/agent-handoff.d.ts +11 -0
- package/dist/packages/runtime/agent-handoff.js +102 -0
- package/dist/packages/{engine → runtime}/agents/index.d.ts +1 -2
- package/dist/packages/{engine → runtime}/agents/index.js +1 -2
- package/dist/packages/runtime/agents/lib/args.d.ts +14 -0
- package/dist/packages/runtime/agents/lib/args.js +24 -0
- package/dist/packages/{engine → runtime}/agents/lib/constants.d.ts +4 -1
- package/dist/packages/runtime/agents/lib/constants.js +13 -0
- package/dist/packages/runtime/agents/lib/context-graph-bootstrap.d.ts +3 -0
- package/dist/packages/{engine/agents/lib/verifiable-context-bootstrap.js → runtime/agents/lib/context-graph-bootstrap.js} +5 -6
- package/dist/packages/{engine → runtime}/agents/lib/detection.d.ts +5 -0
- package/dist/packages/{engine → runtime}/agents/lib/detection.js +16 -7
- package/dist/packages/{engine → runtime}/agents/lib/execution-profile.d.ts +14 -0
- package/dist/packages/{engine → runtime}/agents/lib/execution-profile.js +31 -14
- package/dist/packages/{engine → runtime}/agents/lib/execution.js +22 -6
- package/dist/packages/{engine → runtime}/agents/lib/executors.d.ts +1 -0
- package/dist/packages/{engine → runtime}/agents/lib/executors.js +11 -2
- package/dist/packages/runtime/agents/lib/logs.d.ts +12 -0
- package/dist/packages/runtime/agents/lib/logs.js +41 -0
- package/dist/packages/{engine → runtime}/agents/lib/preflight.js +19 -14
- package/dist/packages/runtime/agents/lib/render.d.ts +26 -0
- package/dist/packages/{engine → runtime}/agents/lib/render.js +48 -22
- package/dist/packages/runtime/agents/lib/shell-fs.d.ts +18 -0
- package/dist/packages/runtime/agents/lib/shell-fs.js +190 -0
- package/dist/packages/runtime/agents/lib/shell-paths.d.ts +16 -0
- package/dist/packages/runtime/agents/lib/shell-paths.js +63 -0
- package/dist/packages/runtime/agents/lib/shell-projection.d.ts +25 -0
- package/dist/packages/runtime/agents/lib/shell-projection.js +314 -0
- package/dist/packages/runtime/agents/lib/shell-templates.d.ts +30 -0
- package/dist/packages/runtime/agents/lib/shell-templates.js +494 -0
- package/dist/packages/runtime/agents/lib/shell-workspace.d.ts +17 -0
- package/dist/packages/runtime/agents/lib/shell-workspace.js +70 -0
- package/dist/packages/runtime/agents/lib/shells.d.ts +92 -0
- package/dist/packages/runtime/agents/lib/shells.js +509 -0
- package/dist/packages/runtime/agents/lib/source-context-scan.d.ts +10 -0
- package/dist/packages/runtime/agents/lib/source-context-scan.js +388 -0
- package/dist/packages/{engine → runtime}/agents/lib/status.js +1 -14
- package/dist/packages/runtime/agents/lib/string-utils.d.ts +16 -0
- package/dist/packages/runtime/agents/lib/string-utils.js +36 -0
- package/dist/packages/{engine → runtime}/agents/lib/types.d.ts +1 -0
- package/dist/packages/{engine → runtime}/agents/lib/user-config.d.ts +8 -2
- package/dist/packages/{engine → runtime}/agents/lib/user-config.js +8 -2
- package/dist/packages/runtime/agents/providers/claude-code.d.ts +13 -0
- package/dist/packages/runtime/agents/providers/claude-code.js +45 -0
- package/dist/packages/runtime/agents/providers/codex.d.ts +17 -0
- package/dist/packages/runtime/agents/providers/codex.js +66 -0
- package/dist/packages/runtime/agents/providers/cursor.d.ts +9 -0
- package/dist/packages/runtime/agents/providers/cursor.js +24 -0
- package/dist/packages/runtime/agents/providers/index.d.ts +9 -0
- package/dist/packages/runtime/agents/providers/index.js +31 -0
- package/dist/packages/runtime/agents/providers/types.d.ts +50 -0
- package/dist/packages/{engine → runtime}/agents/registry.d.ts +13 -2
- package/dist/packages/{engine → runtime}/agents/registry.js +48 -10
- package/dist/packages/{engine → runtime}/agents/role-executors.d.ts +1 -1
- package/dist/packages/{engine → runtime}/agents/role-executors.js +9 -7
- package/dist/packages/{engine → runtime}/agents/role-router.js +7 -5
- package/dist/packages/runtime/auth/account-context.d.ts +52 -0
- package/dist/packages/runtime/auth/account-context.js +68 -0
- package/dist/packages/runtime/auth/auth-flow.d.ts +73 -0
- package/dist/packages/runtime/auth/auth-flow.js +189 -0
- package/dist/packages/runtime/auth/jwt-validator.d.ts +58 -0
- package/dist/packages/runtime/auth/jwt-validator.js +86 -0
- package/dist/packages/runtime/auth/keychain.d.ts +35 -0
- package/dist/packages/runtime/auth/keychain.js +85 -0
- package/dist/packages/runtime/auth/session-store.d.ts +38 -0
- package/dist/packages/runtime/auth/session-store.js +96 -0
- package/dist/packages/runtime/auth/workos-client.d.ts +58 -0
- package/dist/packages/runtime/auth/workos-client.js +87 -0
- package/dist/packages/runtime/benchmark-question-draft.d.ts +23 -0
- package/dist/packages/runtime/benchmark-question-draft.js +153 -0
- package/dist/packages/runtime/build/artifact-counts.d.ts +1 -0
- package/dist/packages/{engine → runtime}/build/artifact-counts.js +5 -9
- package/dist/packages/{engine → runtime}/build/artifact-status.d.ts +6 -6
- package/dist/packages/{engine → runtime}/build/artifact-status.js +26 -24
- package/dist/packages/runtime/build/atomic-fs.d.ts +3 -0
- package/dist/packages/runtime/build/atomic-fs.js +95 -0
- package/dist/packages/runtime/build/billing-events.d.ts +78 -0
- package/dist/packages/{engine → runtime}/build/billing-events.js +17 -19
- package/dist/packages/runtime/build/build-evidence.d.ts +16 -0
- package/dist/packages/runtime/build/build-evidence.js +179 -0
- package/dist/packages/{engine → runtime}/build/build-pipeline.d.ts +12 -8
- package/dist/packages/runtime/build/build-pipeline.js +388 -0
- package/dist/packages/{engine → runtime}/build/build-plan-primitives.d.ts +1 -1
- package/dist/packages/{engine → runtime}/build/build-plan-primitives.js +0 -1
- package/dist/packages/runtime/build/build-plan-runs.d.ts +14 -0
- package/dist/packages/runtime/build/build-plan-runs.js +31 -0
- package/dist/packages/runtime/build/build-stage-plan.d.ts +16 -0
- package/dist/packages/runtime/build/build-stage-plan.js +101 -0
- package/dist/packages/{engine → runtime}/build/build-stage-runner.d.ts +2 -1
- package/dist/packages/runtime/build/build-stage-runner.js +302 -0
- package/dist/packages/{engine → runtime}/build/build-target.d.ts +7 -4
- package/dist/packages/runtime/build/build-target.js +40 -0
- package/dist/packages/{engine → runtime}/build/check-evaluator.d.ts +14 -16
- package/dist/packages/runtime/build/check-evaluator.js +1226 -0
- package/dist/packages/runtime/build/context-graph-paths.d.ts +64 -0
- package/dist/packages/runtime/build/context-graph-paths.js +160 -0
- package/dist/packages/runtime/build/context-graph-schema.d.ts +19 -0
- package/dist/packages/runtime/build/context-graph-schema.js +39 -0
- package/dist/packages/{engine → runtime}/build/discovery.d.ts +2 -2
- package/dist/packages/{engine → runtime}/build/discovery.js +4 -4
- package/dist/packages/{engine → runtime}/build/index.d.ts +7 -5
- package/dist/packages/{engine → runtime}/build/index.js +7 -5
- package/dist/packages/runtime/build/inspect-map.d.ts +10 -0
- package/dist/packages/runtime/build/inspect-map.js +270 -0
- package/dist/packages/{engine → runtime}/build/lib/schema.d.ts +449 -123
- package/dist/packages/runtime/build/lib/schema.js +494 -0
- package/dist/packages/runtime/build/native-entrypoint.d.ts +2 -0
- package/dist/packages/runtime/build/native-entrypoint.js +286 -0
- package/dist/packages/runtime/build/reset.d.ts +2 -0
- package/dist/packages/runtime/build/reset.js +62 -0
- package/dist/packages/{engine → runtime}/build/runtime-contracts.js +13 -7
- package/dist/packages/runtime/build/runtime-inventory.d.ts +7 -0
- package/dist/packages/{engine → runtime}/build/runtime-inventory.js +3 -3
- package/dist/packages/runtime/build/runtime-log-paths.d.ts +3 -0
- package/dist/packages/runtime/build/runtime-log-paths.js +16 -0
- package/dist/packages/{engine → runtime}/build/runtime-prompt.js +12 -9
- package/dist/packages/{engine → runtime}/build/runtime-reconcile.d.ts +1 -1
- package/dist/packages/{engine → runtime}/build/runtime-reconcile.js +25 -21
- package/dist/packages/runtime/build/runtime-runs.d.ts +10 -0
- package/dist/packages/runtime/build/runtime-runs.js +318 -0
- package/dist/packages/{engine → runtime}/build/runtime-types.d.ts +9 -6
- package/dist/packages/runtime/build/runtime-types.js +1 -0
- package/dist/packages/runtime/build/runtime.d.ts +8 -0
- package/dist/packages/runtime/build/runtime.js +7 -0
- package/dist/packages/runtime/build/source-files.d.ts +58 -0
- package/dist/packages/runtime/build/source-files.js +193 -0
- package/dist/packages/runtime/build/source-inventory.d.ts +28 -0
- package/dist/packages/runtime/build/source-inventory.js +512 -0
- package/dist/packages/runtime/build/source-manifest.d.ts +63 -0
- package/dist/packages/runtime/build/source-manifest.js +220 -0
- package/dist/packages/runtime/build/stage-evidence.d.ts +22 -0
- package/dist/packages/runtime/build/stage-evidence.js +386 -0
- package/dist/packages/runtime/build/stage-manifest.d.ts +45 -0
- package/dist/packages/runtime/build/stage-manifest.js +1125 -0
- package/dist/packages/runtime/build/stage-reuse.d.ts +11 -0
- package/dist/packages/runtime/build/stage-reuse.js +154 -0
- package/dist/packages/runtime/build/stage-session.d.ts +81 -0
- package/dist/packages/runtime/build/stage-session.js +308 -0
- package/dist/packages/runtime/build/state-artifacts.d.ts +9 -0
- package/dist/packages/runtime/build/state-artifacts.js +14 -0
- package/dist/packages/runtime/build/state-health.d.ts +4 -0
- package/dist/packages/{engine → runtime}/build/state-health.js +21 -26
- package/dist/packages/runtime/build/state-io.d.ts +12 -0
- package/dist/packages/runtime/build/state-io.js +118 -0
- package/dist/packages/runtime/build/state-view.d.ts +5 -0
- package/dist/packages/runtime/build/state-view.js +121 -0
- package/dist/packages/runtime/build/state.d.ts +7 -0
- package/dist/packages/runtime/build/state.js +12 -0
- package/dist/packages/runtime/build/summary-coverage-index.d.ts +21 -0
- package/dist/packages/runtime/build/summary-coverage-index.js +189 -0
- package/dist/packages/runtime/build/traces.d.ts +30 -0
- package/dist/packages/runtime/build/traces.js +133 -0
- package/dist/packages/{engine/build/validate-verifiable-context.d.ts → runtime/build/validate-context-graph.d.ts} +6 -6
- package/dist/packages/{engine/build/validate-verifiable-context.js → runtime/build/validate-context-graph.js} +49 -36
- package/dist/packages/{engine → runtime}/build/validate.d.ts +5 -5
- package/dist/packages/{engine → runtime}/build/validate.js +26 -26
- package/dist/packages/{engine → runtime}/client.d.ts +18 -18
- package/dist/packages/{engine → runtime}/client.js +48 -36
- package/dist/packages/{engine → runtime}/connection-config.d.ts +3 -2
- package/dist/packages/{engine → runtime}/connection-config.js +9 -8
- package/dist/packages/runtime/context-checks.d.ts +10 -0
- package/dist/packages/runtime/context-checks.js +127 -0
- package/dist/packages/runtime/context-graph-scaffold.d.ts +9 -0
- package/dist/packages/runtime/context-graph-scaffold.js +135 -0
- package/dist/packages/runtime/context-graph-semantic-graph.d.ts +9 -0
- package/dist/packages/runtime/context-graph-semantic-graph.js +416 -0
- package/dist/packages/runtime/entitlement-guard.d.ts +43 -0
- package/dist/packages/runtime/entitlement-guard.js +70 -0
- package/dist/packages/{engine → runtime}/execution/index.d.ts +2 -2
- package/dist/packages/{engine → runtime}/execution/index.js +1 -1
- package/dist/packages/{engine → runtime}/execution/lib/schema.d.ts +272 -191
- package/dist/packages/{engine → runtime}/execution/lib/schema.js +35 -32
- package/dist/packages/runtime/index.d.ts +29 -0
- package/dist/packages/runtime/index.js +21 -0
- package/dist/packages/runtime/instance-paths.d.ts +30 -0
- package/dist/packages/runtime/instance-paths.js +29 -0
- package/dist/packages/runtime/native-run-handlers.d.ts +63 -0
- package/dist/packages/{engine → runtime}/native-run-handlers.js +217 -166
- package/dist/packages/runtime/plan-artifact-contract.d.ts +17 -0
- package/dist/packages/runtime/plan-artifact-contract.js +42 -0
- package/dist/packages/runtime/project-entries.d.ts +11 -0
- package/dist/packages/runtime/project-entries.js +49 -0
- package/dist/packages/runtime/project-source-state.d.ts +26 -0
- package/dist/packages/runtime/project-source-state.js +56 -0
- package/dist/packages/runtime/project-store.d.ts +90 -0
- package/dist/packages/runtime/project-store.js +195 -0
- package/dist/packages/runtime/requested-artifacts.d.ts +7 -0
- package/dist/packages/{engine → runtime}/requested-artifacts.js +23 -1
- package/dist/packages/{engine → runtime}/run-observability.d.ts +2 -1
- package/dist/packages/{engine → runtime}/run-observability.js +174 -87
- package/dist/packages/runtime/runtime-action-proposals.d.ts +7 -0
- package/dist/packages/runtime/runtime-action-proposals.js +542 -0
- package/dist/packages/runtime/runtime-build-plans.d.ts +5 -0
- package/dist/packages/runtime/runtime-build-plans.js +175 -0
- package/dist/packages/runtime/runtime-build-runs.d.ts +47 -0
- package/dist/packages/runtime/runtime-build-runs.js +555 -0
- package/dist/packages/runtime/runtime-caches.d.ts +117 -0
- package/dist/packages/runtime/runtime-caches.js +266 -0
- package/dist/packages/{engine → runtime}/runtime-event-applier.d.ts +3 -1
- package/dist/packages/{engine → runtime}/runtime-event-applier.js +53 -17
- package/dist/packages/runtime/runtime-executor.d.ts +22 -0
- package/dist/packages/runtime/runtime-executor.js +131 -0
- package/dist/packages/runtime/runtime-jobs.d.ts +13 -0
- package/dist/packages/runtime/runtime-jobs.js +463 -0
- package/dist/packages/runtime/runtime-observability.d.ts +11 -0
- package/dist/packages/runtime/runtime-observability.js +39 -0
- package/dist/packages/{engine → runtime}/runtime-persistence.d.ts +9 -18
- package/dist/packages/{engine → runtime}/runtime-persistence.js +25 -25
- package/dist/packages/runtime/runtime-project-mutations.d.ts +7 -0
- package/dist/packages/runtime/runtime-project-mutations.js +65 -0
- package/dist/packages/runtime/runtime-project-reads.d.ts +18 -0
- package/dist/packages/runtime/runtime-project-reads.js +574 -0
- package/dist/packages/runtime/runtime-proposal-helpers.d.ts +22 -0
- package/dist/packages/runtime/runtime-proposal-helpers.js +223 -0
- package/dist/packages/{engine → runtime}/runtime-resource-builders.d.ts +23 -16
- package/dist/packages/{engine → runtime}/runtime-resource-builders.js +58 -46
- package/dist/packages/runtime/runtime-status.d.ts +14 -0
- package/dist/packages/runtime/runtime-status.js +15 -0
- package/dist/packages/runtime/runtime-verify-runs.d.ts +84 -0
- package/dist/packages/runtime/runtime-verify-runs.js +296 -0
- package/dist/packages/runtime/runtime.d.ts +1582 -0
- package/dist/packages/runtime/runtime.js +431 -0
- package/dist/packages/runtime/schemas/actions.d.ts +1206 -0
- package/dist/packages/runtime/schemas/actions.js +117 -0
- package/dist/packages/runtime/schemas/agents.d.ts +104 -0
- package/dist/packages/runtime/schemas/agents.js +74 -0
- package/dist/packages/runtime/schemas/build-plans.d.ts +1132 -0
- package/dist/packages/runtime/schemas/build-plans.js +141 -0
- package/dist/packages/runtime/schemas/context-graphs.d.ts +1522 -0
- package/dist/packages/runtime/schemas/context-graphs.js +110 -0
- package/dist/packages/runtime/schemas/files.d.ts +227 -0
- package/dist/packages/runtime/schemas/files.js +28 -0
- package/dist/packages/runtime/schemas/index.d.ts +9 -0
- package/dist/packages/runtime/schemas/index.js +13 -0
- package/dist/packages/runtime/schemas/instance.d.ts +141 -0
- package/dist/packages/runtime/schemas/instance.js +143 -0
- package/dist/packages/runtime/schemas/jobs.d.ts +339 -0
- package/dist/packages/runtime/schemas/jobs.js +107 -0
- package/dist/packages/runtime/schemas/projects.d.ts +366 -0
- package/dist/packages/runtime/schemas/projects.js +160 -0
- package/dist/packages/runtime/schemas/runs.d.ts +3445 -0
- package/dist/packages/runtime/schemas/runs.js +115 -0
- package/dist/packages/runtime/service/index.d.ts +3 -0
- package/dist/packages/runtime/service/index.js +3 -0
- package/dist/packages/runtime/service/openapi.d.ts +7 -0
- package/dist/packages/runtime/service/openapi.js +118 -0
- package/dist/packages/runtime/service/operations.d.ts +3011 -0
- package/dist/packages/runtime/service/operations.js +375 -0
- package/dist/packages/runtime/service/routes.d.ts +114 -0
- package/dist/packages/runtime/service/routes.js +128 -0
- package/dist/packages/runtime/service/server-api-files.d.ts +10 -0
- package/dist/packages/runtime/service/server-api-files.js +85 -0
- package/dist/packages/runtime/service/server-app-boot.d.ts +4 -0
- package/dist/packages/runtime/service/server-app-boot.js +46 -0
- package/dist/packages/runtime/service/server-guards.d.ts +63 -0
- package/dist/packages/runtime/service/server-guards.js +181 -0
- package/dist/packages/runtime/service/server-helpers.d.ts +38 -0
- package/dist/packages/runtime/service/server-helpers.js +108 -0
- package/dist/packages/runtime/service/server-instance-helpers.d.ts +30 -0
- package/dist/packages/runtime/service/server-instance-helpers.js +114 -0
- package/dist/packages/runtime/service/server-routes-action-proposals.d.ts +3 -0
- package/dist/packages/runtime/service/server-routes-action-proposals.js +45 -0
- package/dist/packages/runtime/service/server-routes-agents.d.ts +4 -0
- package/dist/packages/runtime/service/server-routes-agents.js +132 -0
- package/dist/packages/runtime/service/server-routes-auth.d.ts +33 -0
- package/dist/packages/runtime/service/server-routes-auth.js +138 -0
- package/dist/packages/runtime/service/server-routes-build-plans.d.ts +3 -0
- package/dist/packages/runtime/service/server-routes-build-plans.js +86 -0
- package/dist/packages/runtime/service/server-routes-discovery.d.ts +4 -0
- package/dist/packages/runtime/service/server-routes-discovery.js +196 -0
- package/dist/packages/runtime/service/server-routes-events.d.ts +5 -0
- package/dist/packages/runtime/service/server-routes-events.js +99 -0
- package/dist/packages/runtime/service/server-routes-project-context.d.ts +9 -0
- package/dist/packages/runtime/service/server-routes-project-context.js +287 -0
- package/dist/packages/runtime/service/server-routes-project-jobs.d.ts +9 -0
- package/dist/packages/runtime/service/server-routes-project-jobs.js +137 -0
- package/dist/packages/runtime/service/server-routes-project-runs.d.ts +14 -0
- package/dist/packages/runtime/service/server-routes-project-runs.js +88 -0
- package/dist/packages/runtime/service/server-routes-projects.d.ts +4 -0
- package/dist/packages/runtime/service/server-routes-projects.js +96 -0
- package/dist/packages/runtime/service/server-routes-runs.d.ts +3 -0
- package/dist/packages/runtime/service/server-routes-runs.js +119 -0
- package/dist/packages/runtime/service/server.d.ts +37 -0
- package/dist/packages/runtime/service/server.js +300 -0
- package/dist/packages/{engine → runtime/service}/service-registry.d.ts +5 -5
- package/dist/packages/{engine → runtime/service}/service-registry.js +7 -7
- package/dist/packages/runtime/verify/benchmark-run.d.ts +81 -0
- package/dist/packages/runtime/verify/benchmark-run.js +303 -0
- package/dist/packages/{engine → runtime}/verify/index.d.ts +2 -2
- package/dist/packages/{engine → runtime}/verify/index.js +1 -1
- package/dist/packages/{engine → runtime}/verify/lib/schema.d.ts +83 -16
- package/dist/packages/{engine → runtime}/verify/lib/schema.js +38 -18
- package/dist/packages/runtime/verify/test-file-guard.d.ts +2 -0
- package/dist/packages/runtime/verify/test-file-guard.js +29 -0
- package/dist/packages/{engine → runtime}/verify/verify-execution.d.ts +7 -0
- package/dist/packages/{engine → runtime}/verify/verify-execution.js +119 -45
- package/dist/packages/{engine → runtime}/verify/verify-paths.d.ts +5 -4
- package/dist/packages/runtime/verify/verify-paths.js +65 -0
- package/dist/packages/{engine → runtime}/verify/verify-sandbox.d.ts +1 -1
- package/dist/packages/runtime/verify/verify-sandbox.js +88 -0
- package/dist/packages/{engine → runtime}/verify/verify-specs.d.ts +2 -0
- package/dist/packages/runtime/verify/verify-specs.js +126 -0
- package/dist/packages/runtime/verify/verify-targets.d.ts +5 -0
- package/dist/packages/{engine → runtime}/verify/verify-targets.js +12 -12
- package/dist/packages/runtime/verify/verify-types.js +1 -0
- package/dist/packages/{engine → runtime}/verify/verify.d.ts +1 -1
- package/dist/packages/{engine → runtime}/verify/verify.js +1 -1
- package/dist/packages/runtime/wire-schemas.d.ts +18 -0
- package/dist/packages/runtime/wire-schemas.js +27 -0
- package/package.json +32 -30
- package/public-repo/CONTRIBUTING.md +16 -18
- package/public-repo/README.md +119 -282
- package/public-repo/SECURITY.md +3 -4
- package/public-repo/build-plans/interf-default/README.md +24 -16
- package/public-repo/build-plans/interf-default/build/stages/entrypoint/SKILL.md +74 -0
- package/public-repo/build-plans/interf-default/build/stages/knowledge/SKILL.md +95 -0
- package/public-repo/build-plans/interf-default/build/stages/summarize/SKILL.md +49 -4
- package/public-repo/build-plans/interf-default/build-plan.json +49 -39
- package/public-repo/build-plans/interf-default/build-plan.schema.json +59 -33
- package/public-repo/build-plans/interf-default/improve/SKILL.md +3 -3
- package/public-repo/build-plans/interf-default/use/query/SKILL.md +18 -11
- package/public-repo/openapi/local-service.openapi.json +14227 -0
- package/public-repo/skills/interf/SKILL.md +508 -187
- package/dist/cli/commands/prep.d.ts +0 -2
- package/dist/cli/commands/prep.js +0 -240
- package/dist/cli/commands/test.d.ts +0 -10
- package/dist/cli/commands/test.js +0 -85
- package/dist/cli/commands/web.d.ts +0 -2
- package/dist/cli/commands/web.js +0 -286
- package/dist/interf-ui/404.html +0 -1
- package/dist/interf-ui/__next.__PAGE__.txt +0 -10
- package/dist/interf-ui/__next._full.txt +0 -20
- package/dist/interf-ui/__next._head.txt +0 -5
- package/dist/interf-ui/__next._index.txt +0 -5
- package/dist/interf-ui/__next._tree.txt +0 -5
- package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_buildManifest.js +0 -11
- package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_clientMiddlewareManifest.js +0 -1
- package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_ssgManifest.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0.tjb6f4golw..css +0 -3
- package/dist/interf-ui/_next/static/chunks/03~yq9q893hmn.js +0 -1
- package/dist/interf-ui/_next/static/chunks/085-n_jv2ng_q.css +0 -1
- package/dist/interf-ui/_next/static/chunks/0dn41fa_zvgsl.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0g-ea0zj5d-0k.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0gwqglc4iz583.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0haldgm65ve6l.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0nv3am99vjzn4.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0s77gt_o4jwtx.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0y5z3t-z1c8ks.js.map +0 -5
- package/dist/interf-ui/_next/static/chunks/0~a36ujuzpaz..js +0 -116
- package/dist/interf-ui/_next/static/chunks/10jeodxe4nkgj.js +0 -31
- package/dist/interf-ui/_next/static/chunks/119h2rouych2t.js +0 -1
- package/dist/interf-ui/_next/static/chunks/13c8b~m8knjsf.js +0 -1
- package/dist/interf-ui/_next/static/chunks/14dznb2qpt-ho.js +0 -91
- package/dist/interf-ui/_next/static/chunks/15z_en80lrq-3.js +0 -5
- package/dist/interf-ui/_next/static/chunks/turbopack-0p.pvcjrtq-jh.js +0 -1
- package/dist/interf-ui/_next/static/chunks/turbopack-0usj_75.8frlw.js +0 -1
- package/dist/interf-ui/_next/static/chunks/turbopack-worker-0sjn--fhq~1cg.js +0 -1
- package/dist/interf-ui/_next/static/media/GeistMono_Variable.p.17jn9btb_52pq.woff2 +0 -0
- package/dist/interf-ui/_next/static/media/Geist_Variable-s.p.0-te~ja_gpvcf.woff2 +0 -0
- package/dist/interf-ui/_next/static/media/worker.102zas1s52_pf.js +0 -109
- package/dist/interf-ui/_not-found/__next._full.txt +0 -15
- package/dist/interf-ui/_not-found/__next._head.txt +0 -5
- package/dist/interf-ui/_not-found/__next._index.txt +0 -5
- package/dist/interf-ui/_not-found/__next._not-found.__PAGE__.txt +0 -5
- package/dist/interf-ui/_not-found/__next._not-found.txt +0 -5
- package/dist/interf-ui/_not-found/__next._tree.txt +0 -2
- package/dist/interf-ui/_not-found.html +0 -1
- package/dist/interf-ui/_not-found.txt +0 -15
- package/dist/interf-ui/index.html +0 -1
- package/dist/interf-ui/index.txt +0 -20
- package/dist/packages/contracts/lib/preparation-paths.d.ts +0 -117
- package/dist/packages/contracts/lib/preparation-paths.js +0 -177
- package/dist/packages/engine/action-definitions.d.ts +0 -407
- package/dist/packages/engine/action-definitions.js +0 -1158
- package/dist/packages/engine/action-values.d.ts +0 -1
- package/dist/packages/engine/action-values.js +0 -1
- package/dist/packages/engine/agents/lib/args.d.ts +0 -4
- package/dist/packages/engine/agents/lib/args.js +0 -52
- package/dist/packages/engine/agents/lib/chart-guidance.d.ts +0 -1
- package/dist/packages/engine/agents/lib/chart-guidance.js +0 -8
- package/dist/packages/engine/agents/lib/constants.js +0 -28
- package/dist/packages/engine/agents/lib/logs.d.ts +0 -2
- package/dist/packages/engine/agents/lib/logs.js +0 -17
- package/dist/packages/engine/agents/lib/render.d.ts +0 -8
- package/dist/packages/engine/agents/lib/schema.d.ts +0 -8
- package/dist/packages/engine/agents/lib/schema.js +0 -7
- package/dist/packages/engine/agents/lib/shells.d.ts +0 -74
- package/dist/packages/engine/agents/lib/shells.js +0 -1052
- package/dist/packages/engine/agents/lib/verifiable-context-bootstrap.d.ts +0 -3
- package/dist/packages/engine/build/artifact-counts.d.ts +0 -1
- package/dist/packages/engine/build/billing-events.d.ts +0 -89
- package/dist/packages/engine/build/build-pipeline.js +0 -175
- package/dist/packages/engine/build/build-plan-runs.d.ts +0 -14
- package/dist/packages/engine/build/build-plan-runs.js +0 -31
- package/dist/packages/engine/build/build-stage-plan.d.ts +0 -16
- package/dist/packages/engine/build/build-stage-plan.js +0 -100
- package/dist/packages/engine/build/build-stage-runner.js +0 -94
- package/dist/packages/engine/build/build-target.js +0 -16
- package/dist/packages/engine/build/check-evaluator.js +0 -298
- package/dist/packages/engine/build/lib/schema.js +0 -316
- package/dist/packages/engine/build/reset.d.ts +0 -2
- package/dist/packages/engine/build/reset.js +0 -74
- package/dist/packages/engine/build/runtime-inventory.d.ts +0 -7
- package/dist/packages/engine/build/runtime-paths.d.ts +0 -8
- package/dist/packages/engine/build/runtime-paths.js +0 -26
- package/dist/packages/engine/build/runtime-runs.d.ts +0 -10
- package/dist/packages/engine/build/runtime-runs.js +0 -224
- package/dist/packages/engine/build/runtime.d.ts +0 -5
- package/dist/packages/engine/build/runtime.js +0 -4
- package/dist/packages/engine/build/source-files.d.ts +0 -46
- package/dist/packages/engine/build/source-files.js +0 -149
- package/dist/packages/engine/build/state-artifacts.d.ts +0 -9
- package/dist/packages/engine/build/state-artifacts.js +0 -14
- package/dist/packages/engine/build/state-health.d.ts +0 -4
- package/dist/packages/engine/build/state-io.d.ts +0 -11
- package/dist/packages/engine/build/state-io.js +0 -82
- package/dist/packages/engine/build/state-paths.d.ts +0 -5
- package/dist/packages/engine/build/state-paths.js +0 -16
- package/dist/packages/engine/build/state-view.d.ts +0 -5
- package/dist/packages/engine/build/state-view.js +0 -94
- package/dist/packages/engine/build/state.d.ts +0 -7
- package/dist/packages/engine/build/state.js +0 -12
- package/dist/packages/engine/build/validate-helpers.d.ts +0 -12
- package/dist/packages/engine/build/validate-helpers.js +0 -41
- package/dist/packages/engine/build/verifiable-context-paths.d.ts +0 -47
- package/dist/packages/engine/build/verifiable-context-paths.js +0 -121
- package/dist/packages/engine/build/verifiable-context-schema.d.ts +0 -21
- package/dist/packages/engine/build/verifiable-context-schema.js +0 -126
- package/dist/packages/engine/cloud-seams.d.ts +0 -115
- package/dist/packages/engine/cloud-seams.js +0 -84
- package/dist/packages/engine/index.d.ts +0 -22
- package/dist/packages/engine/index.js +0 -15
- package/dist/packages/engine/instance-paths.d.ts +0 -106
- package/dist/packages/engine/instance-paths.js +0 -171
- package/dist/packages/engine/lib/schema.d.ts +0 -6304
- package/dist/packages/engine/lib/schema.js +0 -730
- package/dist/packages/engine/native-run-handlers.d.ts +0 -25
- package/dist/packages/engine/preparation-store.d.ts +0 -105
- package/dist/packages/engine/preparation-store.js +0 -213
- package/dist/packages/engine/readiness-check-draft.d.ts +0 -20
- package/dist/packages/engine/readiness-check-draft.js +0 -111
- package/dist/packages/engine/requested-artifacts.d.ts +0 -5
- package/dist/packages/engine/routes.d.ts +0 -85
- package/dist/packages/engine/routes.js +0 -99
- package/dist/packages/engine/runtime-caches.d.ts +0 -76
- package/dist/packages/engine/runtime-caches.js +0 -191
- package/dist/packages/engine/runtime-proposal-helpers.d.ts +0 -35
- package/dist/packages/engine/runtime-proposal-helpers.js +0 -247
- package/dist/packages/engine/runtime.d.ts +0 -371
- package/dist/packages/engine/runtime.js +0 -2463
- package/dist/packages/engine/server.d.ts +0 -58
- package/dist/packages/engine/server.js +0 -1399
- package/dist/packages/engine/verify/readiness-check-run.d.ts +0 -82
- package/dist/packages/engine/verify/readiness-check-run.js +0 -265
- package/dist/packages/engine/verify/verify-paths.js +0 -61
- package/dist/packages/engine/verify/verify-sandbox.js +0 -88
- package/dist/packages/engine/verify/verify-specs.js +0 -114
- package/dist/packages/engine/verify/verify-targets.d.ts +0 -5
- package/dist/packages/engine/wire-schemas.d.ts +0 -547
- package/dist/packages/engine/wire-schemas.js +0 -59
- package/dist/packages/project/index.d.ts +0 -9
- package/dist/packages/project/interf-bootstrap.d.ts +0 -1
- package/dist/packages/project/interf-bootstrap.js +0 -1
- package/dist/packages/project/interf-scaffold.d.ts +0 -3
- package/dist/packages/project/interf-scaffold.js +0 -136
- package/dist/packages/project/interf.d.ts +0 -4
- package/dist/packages/project/interf.js +0 -3
- package/dist/packages/project/lib/schema.d.ts +0 -328
- package/dist/packages/project/lib/schema.js +0 -136
- package/dist/packages/project/preparation-entries.d.ts +0 -11
- package/dist/packages/project/preparation-entries.js +0 -49
- package/dist/packages/project/source-config.d.ts +0 -46
- package/dist/packages/project/source-config.js +0 -394
- package/dist/packages/project/source-folders.d.ts +0 -11
- package/public-repo/build-plans/interf-default/build/stages/shape/SKILL.md +0 -27
- package/public-repo/build-plans/interf-default/build/stages/structure/SKILL.md +0 -21
- package/public-repo/plugins/README.md +0 -9
- package/public-repo/plugins/interf/.claude-plugin/plugin.json +0 -21
- package/public-repo/plugins/interf/.mcp.json +0 -12
- package/public-repo/plugins/interf/README.md +0 -32
- package/public-repo/plugins/interf/skills/interf/SKILL.md +0 -376
- /package/dist/packages/{engine/agents/lib/types.js → runtime/actions/fields.js} +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/agents.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/agents.js +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/execution.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/preflight.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/status.d.ts +0 -0
- /package/dist/packages/{engine/build/runtime-types.js → runtime/agents/lib/types.js} +0 -0
- /package/dist/packages/{engine/verify/verify-types.js → runtime/agents/providers/types.js} +0 -0
- /package/dist/packages/{engine → runtime}/agents/role-router.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/build/build-execution.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/build/build-execution.js +0 -0
- /package/dist/packages/{engine → runtime}/build/runtime-contracts.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/build/runtime-prompt.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/execution/adapters.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/execution/adapters.js +0 -0
- /package/dist/packages/{engine → runtime}/execution/events.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/execution/events.js +0 -0
- /package/dist/packages/{engine → runtime}/verify/verify-profile-presets.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/verify/verify-profile-presets.js +0 -0
- /package/dist/packages/{engine → runtime}/verify/verify-types.d.ts +0 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { LOCAL_SERVICE_ROUTES } from "./routes.js";
|
|
2
|
+
import { parseRequestUrl, sendError, writeHeaders } from "./server-helpers.js";
|
|
3
|
+
/**
|
|
4
|
+
* `GET /v1/events` — a Server-Sent Events change stream.
|
|
5
|
+
*
|
|
6
|
+
* Every authorized client (Interf Desktop, CLI, MCP host) is a peer of the
|
|
7
|
+
* same local service, so any client's write fans out here to every open
|
|
8
|
+
* renderer. The renderer keeps one `EventSource` open and refreshes on each
|
|
9
|
+
* frame — push, not idle polling. The dispatcher calls `notifyServiceChange`
|
|
10
|
+
* after a successful mutating request (see `server.ts`); the active-run poll
|
|
11
|
+
* still owns in-flight run progress.
|
|
12
|
+
*
|
|
13
|
+
* Auth: browser `EventSource` cannot set an `Authorization` header, so the
|
|
14
|
+
* token rides in `?token=`. The dispatcher exempts this path from the header
|
|
15
|
+
* guard; we validate the query token here against the runtime token.
|
|
16
|
+
*/
|
|
17
|
+
// One subscriber set per runtime. A WeakMap keeps multi-runtime test setups
|
|
18
|
+
// isolated and lets sets be GC'd with their runtime — no global leak.
|
|
19
|
+
const subscribers = new WeakMap();
|
|
20
|
+
const KEEPALIVE_INTERVAL_MS = 25_000;
|
|
21
|
+
function subscriberSet(runtime) {
|
|
22
|
+
let set = subscribers.get(runtime);
|
|
23
|
+
if (!set) {
|
|
24
|
+
set = new Set();
|
|
25
|
+
subscribers.set(runtime, set);
|
|
26
|
+
}
|
|
27
|
+
return set;
|
|
28
|
+
}
|
|
29
|
+
/** Constant-time compare of the query token against the runtime token. */
|
|
30
|
+
function isAuthorizedQueryToken(runtime, token) {
|
|
31
|
+
if (!runtime.authToken)
|
|
32
|
+
return true; // tokenless-dev mode
|
|
33
|
+
if (!token || token.length !== runtime.authToken.length)
|
|
34
|
+
return false;
|
|
35
|
+
let mismatch = 0;
|
|
36
|
+
for (let index = 0; index < runtime.authToken.length; index += 1) {
|
|
37
|
+
mismatch |= token.charCodeAt(index) ^ runtime.authToken.charCodeAt(index);
|
|
38
|
+
}
|
|
39
|
+
return mismatch === 0;
|
|
40
|
+
}
|
|
41
|
+
/** Fan a change ping out to every open events stream for this runtime. */
|
|
42
|
+
export function notifyServiceChange(runtime) {
|
|
43
|
+
const set = subscribers.get(runtime);
|
|
44
|
+
if (!set || set.size === 0)
|
|
45
|
+
return;
|
|
46
|
+
const frame = `event: changed\ndata: {"ts":"${new Date().toISOString()}"}\n\n`;
|
|
47
|
+
for (const res of set) {
|
|
48
|
+
try {
|
|
49
|
+
res.write(frame);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// A dead socket is reaped by its own close handler; ignore here.
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function tryHandleEvents(req, res, runtime, path, method) {
|
|
57
|
+
if (path !== LOCAL_SERVICE_ROUTES.events)
|
|
58
|
+
return false;
|
|
59
|
+
if (method !== "GET")
|
|
60
|
+
return false;
|
|
61
|
+
const url = parseRequestUrl(req);
|
|
62
|
+
if (!isAuthorizedQueryToken(runtime, url.searchParams.get("token"))) {
|
|
63
|
+
sendError(res, 401, "Missing or invalid token.");
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
// SSE headers (CORS context is merged in by writeHeaders). Connection stays
|
|
67
|
+
// open — no res.end until the client disconnects.
|
|
68
|
+
writeHeaders(res, 200, {
|
|
69
|
+
"content-type": "text/event-stream; charset=utf-8",
|
|
70
|
+
"cache-control": "no-cache, no-transform",
|
|
71
|
+
connection: "keep-alive",
|
|
72
|
+
// Disable proxy buffering so frames flush immediately.
|
|
73
|
+
"x-accel-buffering": "no",
|
|
74
|
+
});
|
|
75
|
+
// Initial sync frame: tells the client to refresh on every (re)connect.
|
|
76
|
+
// EventSource reconnects when the webview wakes, so this is what makes the
|
|
77
|
+
// app fresh "on focus" without any client-side focus listener.
|
|
78
|
+
res.write(`event: sync\ndata: {"ts":"${new Date().toISOString()}"}\n\n`);
|
|
79
|
+
const set = subscriberSet(runtime);
|
|
80
|
+
set.add(res);
|
|
81
|
+
// Keepalive comment so idle connections aren't reaped by the webview/proxy.
|
|
82
|
+
const keepalive = setInterval(() => {
|
|
83
|
+
try {
|
|
84
|
+
res.write(`: keepalive ${Date.now()}\n\n`);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// ignore; close handler cleans up
|
|
88
|
+
}
|
|
89
|
+
}, KEEPALIVE_INTERVAL_MS);
|
|
90
|
+
if (typeof keepalive.unref === "function")
|
|
91
|
+
keepalive.unref();
|
|
92
|
+
const cleanup = () => {
|
|
93
|
+
clearInterval(keepalive);
|
|
94
|
+
set.delete(res);
|
|
95
|
+
};
|
|
96
|
+
req.on("close", cleanup);
|
|
97
|
+
res.on("close", cleanup);
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { ProjectRouteContext } from "./server-routes-project-runs.js";
|
|
3
|
+
import type { LocalServiceRuntime } from "../runtime.js";
|
|
4
|
+
/**
|
|
5
|
+
* Read-only observability over a project: readiness state,
|
|
6
|
+
* source-file inventory, Context Graph locator, file serving
|
|
7
|
+
* inside the Context Graph root, and per-Artifact status.
|
|
8
|
+
*/
|
|
9
|
+
export declare function tryHandleProjectContext(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, ctx: ProjectRouteContext, method: string): Promise<boolean>;
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { PROJECT_SUBRESOURCES } from "./routes.js";
|
|
2
|
+
import { parseRequestUrl, sendError, sendJson, } from "./server-helpers.js";
|
|
3
|
+
import { isTraversalRelativePath, safeApiFilePath, sendApiFile, } from "./server-api-files.js";
|
|
4
|
+
import { buildTraces } from "../build/traces.js";
|
|
5
|
+
import { loadContextGraphSourceManifest } from "../build/source-manifest.js";
|
|
6
|
+
import { computeProjectSourceState } from "../project-source-state.js";
|
|
7
|
+
/**
|
|
8
|
+
* Read-only observability over a project: readiness state,
|
|
9
|
+
* source-file inventory, Context Graph locator, file serving
|
|
10
|
+
* inside the Context Graph root, and per-Artifact status.
|
|
11
|
+
*/
|
|
12
|
+
export async function tryHandleProjectContext(req, res, runtime, ctx, method) {
|
|
13
|
+
const { storedProject, subPath } = ctx;
|
|
14
|
+
if (subPath === PROJECT_SUBRESOURCES.readiness) {
|
|
15
|
+
if (method === "GET") {
|
|
16
|
+
const readiness = runtime.getReadiness(storedProject.projectDataDir, storedProject.id);
|
|
17
|
+
sendJson(res, 200, readiness);
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (subPath === PROJECT_SUBRESOURCES.sourceFiles) {
|
|
22
|
+
if (method === "GET") {
|
|
23
|
+
sendJson(res, 200, {
|
|
24
|
+
source_files: runtime.listSourceFiles(storedProject.projectDataDir, storedProject.id),
|
|
25
|
+
});
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (subPath === PROJECT_SUBRESOURCES.sourceManifest) {
|
|
30
|
+
if (method === "GET") {
|
|
31
|
+
const latestContext = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
|
|
32
|
+
const manifest = latestContext?.path ? loadContextGraphSourceManifest(latestContext.path) : null;
|
|
33
|
+
if (!manifest)
|
|
34
|
+
sendError(res, 404, "Source Manifest not found.");
|
|
35
|
+
else
|
|
36
|
+
sendJson(res, 200, { source_manifest: manifest });
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (subPath === PROJECT_SUBRESOURCES.contextGraph) {
|
|
41
|
+
if (method === "GET") {
|
|
42
|
+
const context = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
|
|
43
|
+
if (!context)
|
|
44
|
+
sendError(res, 404, "Context Graph not found.");
|
|
45
|
+
else
|
|
46
|
+
sendJson(res, 200, context);
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (subPath === PROJECT_SUBRESOURCES.graphs) {
|
|
51
|
+
if (method === "GET") {
|
|
52
|
+
sendJson(res, 200, {
|
|
53
|
+
graphs: runtime.listContextGraphs(storedProject.projectDataDir, storedProject.id),
|
|
54
|
+
});
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (subPath.startsWith(`${PROJECT_SUBRESOURCES.graphs}/`)) {
|
|
59
|
+
if (method === "GET") {
|
|
60
|
+
const rawGraphId = subPath.slice(PROJECT_SUBRESOURCES.graphs.length + 1);
|
|
61
|
+
let graphId;
|
|
62
|
+
try {
|
|
63
|
+
graphId = decodeURIComponent(rawGraphId);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
sendError(res, 400, "Context Graph id is not valid URI-encoded UTF-8.");
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
const graph = runtime
|
|
70
|
+
.listContextGraphs(storedProject.projectDataDir, storedProject.id)
|
|
71
|
+
.find((entry) => entry.graph_id === graphId || entry.build_run_id === graphId);
|
|
72
|
+
if (!graph)
|
|
73
|
+
sendError(res, 404, "Context Graph not found.");
|
|
74
|
+
else
|
|
75
|
+
sendJson(res, 200, graph);
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (subPath === PROJECT_SUBRESOURCES.buildEvidence) {
|
|
80
|
+
if (method === "GET") {
|
|
81
|
+
const context = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
|
|
82
|
+
if (!context?.build_evidence) {
|
|
83
|
+
sendError(res, 404, "Graph diagnostics not found.");
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
sendJson(res, 200, context.build_evidence);
|
|
87
|
+
}
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (subPath === PROJECT_SUBRESOURCES.contextGraphSessions) {
|
|
92
|
+
if (method === "GET") {
|
|
93
|
+
const sessions = runtime.listLatestContextGraphStageSessions(storedProject.projectDataDir, storedProject.id);
|
|
94
|
+
sendJson(res, 200, { sessions });
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (subPath.startsWith(`${PROJECT_SUBRESOURCES.contextGraphSessions}/`)) {
|
|
99
|
+
if (method === "GET") {
|
|
100
|
+
const rawStageRunId = subPath.slice(PROJECT_SUBRESOURCES.contextGraphSessions.length + 1);
|
|
101
|
+
let stageRunId;
|
|
102
|
+
try {
|
|
103
|
+
stageRunId = decodeURIComponent(rawStageRunId);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
sendError(res, 400, "Stage execution session id is not valid URI-encoded UTF-8.");
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
const session = runtime
|
|
110
|
+
.listLatestContextGraphStageSessions(storedProject.projectDataDir, storedProject.id)
|
|
111
|
+
.find((entry) => entry.stage_run_id === stageRunId) ?? null;
|
|
112
|
+
if (!session)
|
|
113
|
+
sendError(res, 404, `Stage execution session not found: ${stageRunId}`);
|
|
114
|
+
else
|
|
115
|
+
sendJson(res, 200, { session });
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (subPath === PROJECT_SUBRESOURCES.contextGraphEntrypoint) {
|
|
120
|
+
if (method === "GET") {
|
|
121
|
+
const handoff = runtime.getContextGraphHandoff(storedProject.projectDataDir, storedProject.id);
|
|
122
|
+
if (!handoff) {
|
|
123
|
+
sendError(res, 404, "Context Graph handoff not found.");
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
sendJson(res, 200, handoff);
|
|
127
|
+
}
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// GET /v1/projects/<id>/context-graph/traces — first-class traces surface.
|
|
132
|
+
// Returns a derived Traces wire shape rolled up from the current
|
|
133
|
+
// Context Graph's artifacts + Checks + source file index.
|
|
134
|
+
if (subPath === PROJECT_SUBRESOURCES.traces) {
|
|
135
|
+
if (method === "GET") {
|
|
136
|
+
const project = runtime.getProject(storedProject.projectDataDir, storedProject.id);
|
|
137
|
+
if (!project) {
|
|
138
|
+
sendError(res, 404, "Context Graph not found.");
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
const readiness = runtime.getReadiness(storedProject.projectDataDir, storedProject.id);
|
|
142
|
+
const sourceFiles = runtime.listSourceFiles(storedProject.projectDataDir, storedProject.id);
|
|
143
|
+
const sourceFileCount = Array.isArray(sourceFiles) ? sourceFiles.length : 0;
|
|
144
|
+
const context = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
|
|
145
|
+
const filesProcessed = context?.build_evidence?.rows
|
|
146
|
+
.find((row) => row.id === "files-processed")
|
|
147
|
+
?.metric.observed;
|
|
148
|
+
const traces = buildTraces({
|
|
149
|
+
projectId: storedProject.id,
|
|
150
|
+
graphId: project.latest_build_run_id ?? project.runs?.latest_build_run_id ?? "no-graph",
|
|
151
|
+
readiness,
|
|
152
|
+
artifacts: project.artifacts ?? [],
|
|
153
|
+
sourceFileCount,
|
|
154
|
+
filesProcessed,
|
|
155
|
+
});
|
|
156
|
+
sendJson(res, 200, traces);
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (subPath === PROJECT_SUBRESOURCES.contextGraphStages) {
|
|
161
|
+
if (method === "GET") {
|
|
162
|
+
const context = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
|
|
163
|
+
if (!context) {
|
|
164
|
+
sendError(res, 404, "Context Graph not found.");
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
sendJson(res, 200, {
|
|
168
|
+
stages: context.stage_summaries,
|
|
169
|
+
readiness: context.readiness_rollup,
|
|
170
|
+
primary_metrics: context.primary_metrics,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (subPath === PROJECT_SUBRESOURCES.contextGraphResources) {
|
|
177
|
+
if (method === "GET") {
|
|
178
|
+
const context = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
|
|
179
|
+
if (!context) {
|
|
180
|
+
sendError(res, 404, "Context Graph not found.");
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
sendJson(res, 200, {
|
|
184
|
+
resources: context.resources,
|
|
185
|
+
entrypoints: context.entrypoints,
|
|
186
|
+
graph_outputs: context.graph_manifest?.graph_outputs ?? null,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (subPath.startsWith(`${PROJECT_SUBRESOURCES.contextGraphResources}/`)) {
|
|
193
|
+
if (method === "GET") {
|
|
194
|
+
const rawResourceId = subPath.slice(PROJECT_SUBRESOURCES.contextGraphResources.length + 1);
|
|
195
|
+
let resourceId;
|
|
196
|
+
try {
|
|
197
|
+
resourceId = decodeURIComponent(rawResourceId);
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
sendError(res, 400, "Resource id is not valid URI-encoded UTF-8.");
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
const context = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
|
|
204
|
+
const resource = context?.resources.find((entry) => entry.id === resourceId) ?? null;
|
|
205
|
+
if (!resource) {
|
|
206
|
+
sendError(res, 404, `Context Graph resource not found: ${resourceId}`);
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
const stage = resource.stage_id
|
|
210
|
+
? context?.stage_summaries.find((entry) => entry.stage_id === resource.stage_id) ?? null
|
|
211
|
+
: null;
|
|
212
|
+
sendJson(res, 200, {
|
|
213
|
+
resource,
|
|
214
|
+
stage,
|
|
215
|
+
linked_resources: context?.resources.filter((entry) => resource.links.includes(entry.path ?? entry.id)) ?? [],
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
return true;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// GET /v1/projects/<id>/source-state — manifest-backed drift verdict for
|
|
222
|
+
// the Project's Source binding.
|
|
223
|
+
if (subPath === PROJECT_SUBRESOURCES.sourceState) {
|
|
224
|
+
if (method === "GET") {
|
|
225
|
+
const latestContext = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
|
|
226
|
+
const state = computeProjectSourceState({
|
|
227
|
+
projectId: storedProject.id,
|
|
228
|
+
contextGraphPath: latestContext?.path ?? storedProject.contextGraphPath,
|
|
229
|
+
});
|
|
230
|
+
sendJson(res, 200, state);
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (subPath === PROJECT_SUBRESOURCES.contextGraphFile) {
|
|
235
|
+
// GET /v1/projects/<id>/context-graph/file?path=<relpath>
|
|
236
|
+
if (method === "GET") {
|
|
237
|
+
const relPath = parseRequestUrl(req).searchParams.get("path")?.trim() ?? "";
|
|
238
|
+
if (!relPath) {
|
|
239
|
+
sendError(res, 400, "Missing required query parameter: path.");
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
if (isTraversalRelativePath(relPath)) {
|
|
243
|
+
sendError(res, 400, "File path escapes Context Graph root.");
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
const latestContext = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
|
|
247
|
+
if (!latestContext?.path) {
|
|
248
|
+
sendError(res, 404, "Context Graph not found.");
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
const contextGraphPath = latestContext.path;
|
|
252
|
+
const safePath = safeApiFilePath(contextGraphPath, relPath);
|
|
253
|
+
if (!safePath) {
|
|
254
|
+
sendError(res, 400, "File path escapes Context Graph root.");
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
if (!sendApiFile(res, safePath)) {
|
|
258
|
+
sendError(res, 404, `File not found: ${relPath}`);
|
|
259
|
+
}
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (subPath.startsWith(`${PROJECT_SUBRESOURCES.artifacts}/`)) {
|
|
264
|
+
// GET /v1/projects/<id>/artifacts/<artifact-id> — per-Artifact
|
|
265
|
+
// status from the latest Build.
|
|
266
|
+
if (method === "GET") {
|
|
267
|
+
const rawArtifactId = subPath.slice(PROJECT_SUBRESOURCES.artifacts.length + 1);
|
|
268
|
+
let artifactId;
|
|
269
|
+
try {
|
|
270
|
+
artifactId = decodeURIComponent(rawArtifactId);
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
sendError(res, 400, "Artifact id is not valid URI-encoded UTF-8.");
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
const project = runtime.getProject(storedProject.projectDataDir, storedProject.id);
|
|
277
|
+
const status = project?.artifacts.find((entry) => entry.artifact_id === artifactId);
|
|
278
|
+
if (!status) {
|
|
279
|
+
sendError(res, 404, `Artifact not found: ${artifactId}`);
|
|
280
|
+
return true;
|
|
281
|
+
}
|
|
282
|
+
sendJson(res, 200, status);
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { ProjectRouteContext } from "./server-routes-project-runs.js";
|
|
3
|
+
import type { LocalServiceRuntime } from "../runtime.js";
|
|
4
|
+
/**
|
|
5
|
+
* Async/structured mutations on a project: Build Plan authoring
|
|
6
|
+
* and improvement jobs, benchmark-question drafts, Build Plan change deltas,
|
|
7
|
+
* and the destructive reset action.
|
|
8
|
+
*/
|
|
9
|
+
export declare function tryHandleProjectJobs(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, ctx: ProjectRouteContext, method: string): Promise<boolean>;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { PROJECT_SUBRESOURCES } from "./routes.js";
|
|
2
|
+
import { readJsonBody, sendError, sendJson, } from "./server-helpers.js";
|
|
3
|
+
import { writeBenchmarkSpecsForProject } from "../../projects/source-config.js";
|
|
4
|
+
import { loadTestSpec } from "../verify/verify-specs.js";
|
|
5
|
+
import { ProjectBenchmarkQuestionDraftCreateRequestSchema, ProjectBuildPlanAuthoringCreateRequestSchema, ProjectResetRequestSchema, } from "../schemas/index.js";
|
|
6
|
+
function projectScopedJobRequest(storedProject, body) {
|
|
7
|
+
const scopedRequest = ProjectBuildPlanAuthoringCreateRequestSchema.parse(body ?? {});
|
|
8
|
+
const explicitIntent = typeof scopedRequest.intent === "string" && scopedRequest.intent.trim().length > 0
|
|
9
|
+
? scopedRequest.intent
|
|
10
|
+
: null;
|
|
11
|
+
return {
|
|
12
|
+
...scopedRequest,
|
|
13
|
+
project: storedProject.id,
|
|
14
|
+
source_folder_path: storedProject.source.locator,
|
|
15
|
+
intent: explicitIntent ?? storedProject.intent,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Async/structured mutations on a project: Build Plan authoring
|
|
20
|
+
* and improvement jobs, benchmark-question drafts, Build Plan change deltas,
|
|
21
|
+
* and the destructive reset action.
|
|
22
|
+
*/
|
|
23
|
+
export async function tryHandleProjectJobs(req, res, runtime, ctx, method) {
|
|
24
|
+
const { storedProject, subPath } = ctx;
|
|
25
|
+
if (subPath === PROJECT_SUBRESOURCES.buildPlanDraftRuns ||
|
|
26
|
+
subPath === PROJECT_SUBRESOURCES.legacyBuildPlanDraftRuns) {
|
|
27
|
+
if (method === "POST") {
|
|
28
|
+
try {
|
|
29
|
+
const body = (await readJsonBody(req));
|
|
30
|
+
const job = await runtime.createBuildPlanAuthoringRun(storedProject.projectDataDir, projectScopedJobRequest(storedProject, body));
|
|
31
|
+
sendJson(res, 202, job);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
35
|
+
}
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (subPath === PROJECT_SUBRESOURCES.buildPlanImprovementRuns) {
|
|
40
|
+
if (method === "POST") {
|
|
41
|
+
try {
|
|
42
|
+
const body = (await readJsonBody(req));
|
|
43
|
+
const job = await runtime.createBuildPlanAuthoringRun(storedProject.projectDataDir, projectScopedJobRequest(storedProject, body), "build-plan-improvement");
|
|
44
|
+
sendJson(res, 202, job);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (subPath === PROJECT_SUBRESOURCES.benchmarkQuestionDrafts) {
|
|
53
|
+
if (method === "POST") {
|
|
54
|
+
try {
|
|
55
|
+
const body = (await readJsonBody(req));
|
|
56
|
+
const scopedRequest = ProjectBenchmarkQuestionDraftCreateRequestSchema.parse(body ?? {});
|
|
57
|
+
const job = await runtime.createBenchmarkQuestionDraftRun(storedProject.projectDataDir, {
|
|
58
|
+
...scopedRequest,
|
|
59
|
+
project: storedProject.id,
|
|
60
|
+
source_folder_path: storedProject.source.locator,
|
|
61
|
+
});
|
|
62
|
+
sendJson(res, 202, job);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// The saved Q&A check set is the editable benchmark spec. Read it from the
|
|
71
|
+
// source-files spec (source + context graph specs share the same cases) and
|
|
72
|
+
// persist edits to both via the spec writer.
|
|
73
|
+
if (subPath === PROJECT_SUBRESOURCES.benchmarkChecks) {
|
|
74
|
+
if (method === "GET") {
|
|
75
|
+
const spec = loadTestSpec(storedProject.projectDataDir, "source-files", storedProject.id);
|
|
76
|
+
const checks = (spec?.cases ?? []).map((testCase) => ({
|
|
77
|
+
question: testCase.question,
|
|
78
|
+
answer: testCase.answer ?? "",
|
|
79
|
+
}));
|
|
80
|
+
sendJson(res, 200, { checks });
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
if (method === "PATCH") {
|
|
84
|
+
try {
|
|
85
|
+
const body = (await readJsonBody(req));
|
|
86
|
+
const rawChecks = Array.isArray(body?.checks) ? body.checks : [];
|
|
87
|
+
const checks = rawChecks
|
|
88
|
+
.filter((entry) => Boolean(entry) &&
|
|
89
|
+
typeof entry === "object" &&
|
|
90
|
+
typeof entry.question === "string")
|
|
91
|
+
.map((entry) => ({
|
|
92
|
+
question: entry.question.trim(),
|
|
93
|
+
answer: typeof entry.answer === "string" ? entry.answer.trim() : "",
|
|
94
|
+
}))
|
|
95
|
+
.filter((entry) => entry.question.length > 0);
|
|
96
|
+
writeBenchmarkSpecsForProject({
|
|
97
|
+
projectDataDir: storedProject.projectDataDir,
|
|
98
|
+
projectName: storedProject.id,
|
|
99
|
+
checks,
|
|
100
|
+
});
|
|
101
|
+
sendJson(res, 200, { checks });
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
105
|
+
}
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (subPath === PROJECT_SUBRESOURCES.buildPlanChanges) {
|
|
110
|
+
if (method === "POST") {
|
|
111
|
+
try {
|
|
112
|
+
const body = (await readJsonBody(req));
|
|
113
|
+
sendJson(res, 200, runtime.applyBuildPlanChange(storedProject.projectDataDir, body));
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
117
|
+
}
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (subPath === PROJECT_SUBRESOURCES.reset) {
|
|
122
|
+
if (method === "POST") {
|
|
123
|
+
try {
|
|
124
|
+
const body = (await readJsonBody(req));
|
|
125
|
+
const scopedRequest = ProjectResetRequestSchema.parse(body ?? {});
|
|
126
|
+
const request = { ...scopedRequest, project: storedProject.id };
|
|
127
|
+
const result = runtime.applyReset(storedProject.projectDataDir, request);
|
|
128
|
+
sendJson(res, 200, result);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
132
|
+
}
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { StoredProject } from "../project-store.js";
|
|
3
|
+
import type { LocalServiceRuntime } from "../runtime.js";
|
|
4
|
+
export type ProjectRouteContext = {
|
|
5
|
+
storedProject: StoredProject;
|
|
6
|
+
decodedProjectId: string;
|
|
7
|
+
subPath: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Build/verify run mutations and the per-Project runs listing.
|
|
11
|
+
* Run-id lookups for an unknown project are handled by the
|
|
12
|
+
* top-level /v1/runs and /v1/verify-runs routes.
|
|
13
|
+
*/
|
|
14
|
+
export declare function tryHandleProjectRuns(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, ctx: ProjectRouteContext, method: string): Promise<boolean>;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { PROJECT_SUBRESOURCES } from "./routes.js";
|
|
2
|
+
import { readJsonBody, sendError, sendErrorResponse, sendJson, } from "./server-helpers.js";
|
|
3
|
+
import { assertCanRunBenchmark } from "../entitlement-guard.js";
|
|
4
|
+
import { ProjectBuildRunCreateRequestSchema, ProjectVerifyRunCreateRequestSchema, } from "../schemas/index.js";
|
|
5
|
+
/**
|
|
6
|
+
* Build/verify run mutations and the per-Project runs listing.
|
|
7
|
+
* Run-id lookups for an unknown project are handled by the
|
|
8
|
+
* top-level /v1/runs and /v1/verify-runs routes.
|
|
9
|
+
*/
|
|
10
|
+
export async function tryHandleProjectRuns(req, res, runtime, ctx, method) {
|
|
11
|
+
const { storedProject, subPath } = ctx;
|
|
12
|
+
if (subPath === PROJECT_SUBRESOURCES.buildRuns) {
|
|
13
|
+
if (method === "POST") {
|
|
14
|
+
if (!storedProject.buildPlanId) {
|
|
15
|
+
sendError(res, 400, `Project ${storedProject.id} has no Build Plan selected. Select one via PATCH /v1/projects/${storedProject.id} { "build_plan_id": "<id>" } before building.`);
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const body = (await readJsonBody(req));
|
|
20
|
+
const scopedRequest = ProjectBuildRunCreateRequestSchema.parse(body ?? {});
|
|
21
|
+
const request = { ...scopedRequest, project: storedProject.id };
|
|
22
|
+
const idempotencyKeyRaw = req.headers["x-interf-idempotency-key"];
|
|
23
|
+
const idempotencyKey = Array.isArray(idempotencyKeyRaw)
|
|
24
|
+
? idempotencyKeyRaw[0]
|
|
25
|
+
: idempotencyKeyRaw;
|
|
26
|
+
const trimmedKey = typeof idempotencyKey === "string" ? idempotencyKey.trim() : "";
|
|
27
|
+
const dedupedRunId = trimmedKey
|
|
28
|
+
? runtime.findIdempotentBuildRun(storedProject.projectDataDir, trimmedKey)
|
|
29
|
+
: null;
|
|
30
|
+
if (dedupedRunId) {
|
|
31
|
+
const existing = runtime.getBuildRun(storedProject.projectDataDir, dedupedRunId);
|
|
32
|
+
if (existing) {
|
|
33
|
+
sendJson(res, 200, existing);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const resource = await runtime.createBuildRun(storedProject.projectDataDir, request);
|
|
38
|
+
if (trimmedKey) {
|
|
39
|
+
runtime.recordIdempotentBuildRun(storedProject.projectDataDir, trimmedKey, resource.run.run_id);
|
|
40
|
+
}
|
|
41
|
+
sendJson(res, 201, resource);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (subPath === PROJECT_SUBRESOURCES.verifyRuns) {
|
|
50
|
+
if (method === "GET") {
|
|
51
|
+
const runs = runtime.listVerifyRunsForProject(storedProject.projectDataDir, storedProject.id);
|
|
52
|
+
sendJson(res, 200, { runs });
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
if (method === "POST") {
|
|
56
|
+
if (!storedProject.buildPlanId) {
|
|
57
|
+
sendError(res, 400, `Project ${storedProject.id} has no Build Plan selected. Select one via PATCH /v1/projects/${storedProject.id} { "build_plan_id": "<id>" } before running a benchmark.`);
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
// Free-tier benchmark quota lives next to project creation.
|
|
62
|
+
// Pro / Enterprise have `benchmarking-unlimited` and bypass;
|
|
63
|
+
// Free / Anonymous get one run per Project, ever.
|
|
64
|
+
const existingCount = runtime
|
|
65
|
+
.listVerifyRunsForProject(storedProject.projectDataDir, storedProject.id)
|
|
66
|
+
.filter((run) => !run.parent_run_id).length;
|
|
67
|
+
assertCanRunBenchmark(runtime.currentAccount, existingCount);
|
|
68
|
+
const body = (await readJsonBody(req));
|
|
69
|
+
const scopedRequest = ProjectVerifyRunCreateRequestSchema.parse(body ?? {});
|
|
70
|
+
const request = { ...scopedRequest, project: storedProject.id };
|
|
71
|
+
const resource = await runtime.createVerifyRun(storedProject.projectDataDir, request);
|
|
72
|
+
sendJson(res, 201, resource);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
sendErrorResponse(res, error);
|
|
76
|
+
}
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (subPath === PROJECT_SUBRESOURCES.runs) {
|
|
81
|
+
if (method === "GET") {
|
|
82
|
+
const runs = runtime.listBuildRunsForProject(storedProject.projectDataDir, storedProject.id);
|
|
83
|
+
sendJson(res, 200, { runs });
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { LocalServiceRuntime } from "../runtime.js";
|
|
3
|
+
export declare function tryHandleProjectCollection(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, path: string, method: string): Promise<boolean>;
|
|
4
|
+
export declare function tryHandlePerProject(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, path: string, method: string): Promise<boolean>;
|