@interf/compiler 0.22.2 → 0.33.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 +175 -234
- 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 -4
- package/dist/cli/commands/auth.d.ts +20 -0
- package/dist/cli/commands/auth.js +161 -0
- package/dist/cli/commands/benchmark.d.ts +10 -0
- package/dist/cli/commands/benchmark.js +88 -0
- package/dist/cli/commands/build-plan.js +95 -103
- package/dist/cli/commands/build.d.ts +1 -1
- package/dist/cli/commands/build.js +16 -15
- package/dist/cli/commands/doctor.js +3 -3
- package/dist/cli/commands/graphs.d.ts +2 -0
- package/dist/cli/commands/graphs.js +199 -0
- package/dist/cli/commands/login.js +4 -6
- package/dist/cli/commands/logout.js +1 -1
- package/dist/cli/commands/mcp.d.ts +3 -2
- package/dist/cli/commands/mcp.js +721 -204
- package/dist/cli/commands/project.d.ts +2 -0
- package/dist/cli/commands/project.js +202 -0
- package/dist/cli/commands/reset.d.ts +1 -1
- package/dist/cli/commands/reset.js +10 -10
- package/dist/cli/commands/runs.js +52 -26
- 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 +33 -22
- package/dist/cli/commands/traces.d.ts +2 -0
- package/dist/cli/commands/traces.js +125 -0
- package/dist/cli/commands/wizard.js +155 -150
- package/dist/cli/index.d.ts +7 -4
- package/dist/cli/index.js +13 -7
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/packages/build-plans/authoring/brief.d.ts +517 -0
- package/dist/packages/build-plans/authoring/brief.js +89 -0
- package/dist/packages/build-plans/authoring/build-plan-authoring.d.ts +10 -10
- package/dist/packages/build-plans/authoring/build-plan-authoring.js +66 -26
- package/dist/packages/build-plans/authoring/build-plan-edit-session.d.ts +1 -1
- package/dist/packages/build-plans/authoring/build-plan-edit-session.js +8 -2
- package/dist/packages/build-plans/authoring/build-plan-improvement.d.ts +9 -6
- package/dist/packages/build-plans/authoring/build-plan-improvement.js +39 -42
- 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 -12
- package/dist/packages/build-plans/package/build-plan-definitions.js +40 -39
- 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 +4 -4
- package/dist/packages/build-plans/package/build-plan-stage-runner.js +22 -11
- package/dist/packages/build-plans/package/builtin-build-plan.d.ts +5 -6
- package/dist/packages/build-plans/package/builtin-build-plan.js +7 -8
- package/dist/packages/build-plans/package/context-interface.d.ts +11 -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 +56 -52
- package/dist/packages/build-plans/package/local-build-plans.d.ts +12 -10
- package/dist/packages/build-plans/package/local-build-plans.js +56 -31
- package/dist/packages/build-plans/package/user-build-plans.js +1 -1
- package/dist/packages/contracts/index.d.ts +4 -2
- package/dist/packages/contracts/index.js +2 -1
- package/dist/packages/contracts/lib/project-paths.d.ts +137 -0
- package/dist/packages/contracts/lib/project-paths.js +211 -0
- package/dist/packages/contracts/lib/project-schema.d.ts +160 -0
- package/dist/packages/contracts/lib/project-schema.js +113 -0
- package/dist/packages/contracts/lib/schema.d.ts +739 -80
- package/dist/packages/contracts/lib/schema.js +410 -75
- 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 +79 -0
- package/dist/packages/projects/lib/schema.js +89 -0
- package/dist/packages/projects/source-config.d.ts +58 -0
- package/dist/packages/projects/source-config.js +352 -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 +82 -0
- package/dist/packages/runtime/actions/form-builders.d.ts +14 -0
- package/dist/packages/runtime/actions/form-builders.js +619 -0
- package/dist/packages/runtime/actions/form-validators.d.ts +8 -0
- package/dist/packages/runtime/actions/form-validators.js +128 -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 +158 -0
- package/dist/packages/runtime/actions/schemas.d.ts +154 -0
- package/dist/packages/runtime/actions/schemas.js +36 -0
- package/dist/packages/runtime/agent-handoff.d.ts +11 -0
- package/dist/packages/runtime/agent-handoff.js +101 -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.js +8 -14
- package/dist/packages/{engine → runtime}/agents/lib/execution.js +14 -4
- package/dist/packages/{engine → runtime}/agents/lib/preflight.js +15 -13
- package/dist/packages/{engine → runtime}/agents/lib/render.js +4 -4
- 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 +452 -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 +63 -0
- package/dist/packages/runtime/agents/lib/shells.js +383 -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 +64 -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 +7 -6
- 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 +88 -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 +20 -0
- package/dist/packages/runtime/benchmark-question-draft.js +124 -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 +5 -5
- package/dist/packages/{engine → runtime}/build/artifact-status.js +25 -23
- 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 +15 -0
- package/dist/packages/runtime/build/build-evidence.js +173 -0
- package/dist/packages/{engine → runtime}/build/build-pipeline.d.ts +12 -8
- package/dist/packages/runtime/build/build-pipeline.js +304 -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/{engine → runtime}/build/build-stage-plan.js +28 -29
- package/dist/packages/{engine → runtime}/build/build-stage-runner.d.ts +2 -1
- package/dist/packages/runtime/build/build-stage-runner.js +165 -0
- package/dist/packages/{engine → runtime}/build/build-target.d.ts +4 -4
- package/dist/packages/runtime/build/build-target.js +16 -0
- package/dist/packages/{engine → runtime}/build/check-evaluator.d.ts +14 -16
- package/dist/packages/runtime/build/check-evaluator.js +575 -0
- package/dist/packages/runtime/build/context-graph-paths.d.ts +51 -0
- package/dist/packages/runtime/build/context-graph-paths.js +133 -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 +5 -3
- package/dist/packages/{engine → runtime}/build/index.js +5 -3
- package/dist/packages/{engine → runtime}/build/lib/schema.d.ts +221 -88
- package/dist/packages/{engine → runtime}/build/lib/schema.js +61 -41
- 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 +5 -5
- 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/{engine → runtime}/build/runtime-paths.js +6 -6
- package/dist/packages/{engine → runtime}/build/runtime-prompt.js +7 -6
- 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 +265 -0
- package/dist/packages/{engine → runtime}/build/runtime-types.d.ts +6 -6
- package/dist/packages/runtime/build/runtime-types.js +1 -0
- package/dist/packages/runtime/build/runtime.d.ts +6 -0
- package/dist/packages/runtime/build/runtime.js +5 -0
- package/dist/packages/runtime/build/source-files.d.ts +58 -0
- package/dist/packages/runtime/build/source-files.js +184 -0
- package/dist/packages/runtime/build/source-inventory.d.ts +27 -0
- package/dist/packages/runtime/build/source-inventory.js +273 -0
- package/dist/packages/runtime/build/source-manifest.d.ts +52 -0
- package/dist/packages/runtime/build/source-manifest.js +192 -0
- package/dist/packages/runtime/build/stage-evidence.d.ts +22 -0
- package/dist/packages/runtime/build/stage-evidence.js +317 -0
- package/dist/packages/runtime/build/stage-reuse.d.ts +11 -0
- package/dist/packages/runtime/build/stage-reuse.js +142 -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 +119 -0
- package/dist/packages/{engine → runtime}/build/state-paths.d.ts +3 -1
- package/dist/packages/runtime/build/state-paths.js +22 -0
- package/dist/packages/runtime/build/state-view.d.ts +5 -0
- package/dist/packages/{engine → runtime}/build/state-view.js +60 -33
- package/dist/packages/runtime/build/state.d.ts +7 -0
- package/dist/packages/runtime/build/state.js +12 -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} +48 -35
- 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 +15 -15
- package/dist/packages/{engine → runtime}/client.js +41 -24
- 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 +114 -0
- package/dist/packages/runtime/context-graph-scaffold.d.ts +9 -0
- package/dist/packages/runtime/context-graph-scaffold.js +134 -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 +270 -192
- 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/{engine → runtime}/native-run-handlers.d.ts +4 -4
- package/dist/packages/{engine → runtime}/native-run-handlers.js +184 -152
- 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 +53 -0
- package/dist/packages/runtime/project-store.d.ts +85 -0
- package/dist/packages/runtime/project-store.js +168 -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 +166 -84
- 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 +131 -0
- package/dist/packages/runtime/runtime-build-runs.d.ts +47 -0
- package/dist/packages/runtime/runtime-build-runs.js +562 -0
- package/dist/packages/runtime/runtime-caches.d.ts +91 -0
- package/dist/packages/{engine → runtime}/runtime-caches.js +77 -49
- 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 +64 -0
- package/dist/packages/runtime/runtime-project-reads.d.ts +15 -0
- package/dist/packages/runtime/runtime-project-reads.js +381 -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 +21 -16
- package/dist/packages/{engine → runtime}/runtime-resource-builders.js +48 -38
- package/dist/packages/runtime/runtime-verify-runs.d.ts +84 -0
- package/dist/packages/runtime/runtime-verify-runs.js +295 -0
- package/dist/packages/runtime/runtime.d.ts +1165 -0
- package/dist/packages/runtime/runtime.js +417 -0
- package/dist/packages/runtime/schemas/actions.d.ts +1182 -0
- package/dist/packages/runtime/schemas/actions.js +117 -0
- package/dist/packages/runtime/schemas/agents.d.ts +76 -0
- package/dist/packages/runtime/schemas/agents.js +41 -0
- package/dist/packages/runtime/schemas/build-plans.d.ts +959 -0
- package/dist/packages/runtime/schemas/build-plans.js +107 -0
- package/dist/packages/runtime/schemas/files.d.ts +567 -0
- package/dist/packages/runtime/schemas/files.js +51 -0
- package/dist/packages/runtime/schemas/index.d.ts +8 -0
- package/dist/packages/runtime/schemas/index.js +12 -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 +103 -0
- package/dist/packages/runtime/schemas/projects.d.ts +339 -0
- package/dist/packages/runtime/schemas/projects.js +136 -0
- package/dist/packages/runtime/schemas/runs.d.ts +2676 -0
- package/dist/packages/runtime/schemas/runs.js +98 -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 +117 -0
- package/dist/packages/runtime/service/operations.d.ts +1490 -0
- package/dist/packages/runtime/service/operations.js +245 -0
- package/dist/packages/runtime/service/routes.d.ts +106 -0
- package/dist/packages/runtime/service/routes.js +120 -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 +27 -0
- package/dist/packages/runtime/service/server-helpers.js +89 -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 +43 -0
- package/dist/packages/runtime/service/server-routes-agents.d.ts +4 -0
- package/dist/packages/runtime/service/server-routes-agents.js +198 -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 +83 -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 +192 -0
- package/dist/packages/runtime/service/server-routes-project-jobs.d.ts +9 -0
- package/dist/packages/runtime/service/server-routes-project-jobs.js +130 -0
- package/dist/packages/runtime/service/server-routes-project-runs.d.ts +14 -0
- package/dist/packages/runtime/service/server-routes-project-runs.js +85 -0
- package/dist/packages/runtime/service/server-routes-projects.d.ts +4 -0
- package/dist/packages/runtime/service/server-routes-projects.js +92 -0
- package/dist/packages/runtime/service/server-routes-runs.d.ts +3 -0
- package/dist/packages/runtime/service/server-routes-runs.js +112 -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 +26 -18
- package/dist/packages/{engine → runtime}/verify/verify-execution.js +11 -11
- package/dist/packages/{engine → runtime}/verify/verify-paths.d.ts +4 -4
- package/dist/packages/runtime/verify/verify-paths.js +61 -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/{engine → runtime}/verify/verify-specs.js +5 -3
- 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 +39 -31
- package/public-repo/CONTRIBUTING.md +7 -16
- package/public-repo/README.md +175 -234
- package/public-repo/SECURITY.md +3 -4
- package/public-repo/build-plans/interf-default/README.md +19 -14
- package/public-repo/build-plans/interf-default/build/stages/shape/SKILL.md +18 -11
- package/public-repo/build-plans/interf-default/build/stages/structure/SKILL.md +12 -5
- package/public-repo/build-plans/interf-default/build/stages/summarize/SKILL.md +16 -4
- package/public-repo/build-plans/interf-default/build-plan.json +34 -28
- package/public-repo/build-plans/interf-default/build-plan.schema.json +54 -32
- package/public-repo/build-plans/interf-default/improve/SKILL.md +3 -3
- package/public-repo/build-plans/interf-default/use/query/SKILL.md +17 -11
- package/public-repo/openapi/local-service.openapi.json +6803 -0
- package/public-repo/skills/interf/SKILL.md +460 -179
- 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/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-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/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-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.js +0 -16
- package/dist/packages/engine/build/state-view.d.ts +0 -5
- 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/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-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-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/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-profile.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/execution.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/executors.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/executors.js +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/logs.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/logs.js +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/preflight.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/render.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/status.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/status.js +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/types.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-paths.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-execution.d.ts +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,192 @@
|
|
|
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, "Build evidence not found.");
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
sendJson(res, 200, context.build_evidence);
|
|
87
|
+
}
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// GET /v1/projects/<id>/context-graph/traces — first-class traces surface.
|
|
92
|
+
// Returns a derived Traces wire shape rolled up from the current
|
|
93
|
+
// Context Graph's artifacts + Checks + source file index.
|
|
94
|
+
if (subPath === PROJECT_SUBRESOURCES.traces) {
|
|
95
|
+
if (method === "GET") {
|
|
96
|
+
const project = runtime.getProject(storedProject.projectDataDir, storedProject.id);
|
|
97
|
+
if (!project) {
|
|
98
|
+
sendError(res, 404, "Context Graph not found.");
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
const readiness = runtime.getReadiness(storedProject.projectDataDir, storedProject.id);
|
|
102
|
+
const sourceFiles = runtime.listSourceFiles(storedProject.projectDataDir, storedProject.id);
|
|
103
|
+
const sourceFileCount = Array.isArray(sourceFiles) ? sourceFiles.length : 0;
|
|
104
|
+
const context = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
|
|
105
|
+
const filesProcessed = context?.build_evidence?.rows
|
|
106
|
+
.find((row) => row.id === "files-processed")
|
|
107
|
+
?.metric.observed;
|
|
108
|
+
const traces = buildTraces({
|
|
109
|
+
projectId: storedProject.id,
|
|
110
|
+
graphId: project.latest_build_run_id ?? project.runs?.latest_build_run_id ?? "no-graph",
|
|
111
|
+
readiness,
|
|
112
|
+
artifacts: project.artifacts ?? [],
|
|
113
|
+
sourceFileCount,
|
|
114
|
+
filesProcessed,
|
|
115
|
+
});
|
|
116
|
+
sendJson(res, 200, traces);
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// GET /v1/projects/<id>/source-state — manifest-backed drift verdict for
|
|
121
|
+
// the Project's Source binding.
|
|
122
|
+
if (subPath === PROJECT_SUBRESOURCES.sourceState) {
|
|
123
|
+
if (method === "GET") {
|
|
124
|
+
// The per-run SourceState record carries the historical file index;
|
|
125
|
+
// for v1 we treat the latest Build id as the graph pointer and
|
|
126
|
+
// leave the hash comparison to a follow-up enhancement. For now the
|
|
127
|
+
// verdict is `unknown` until a Build has produced a Context Graph.
|
|
128
|
+
const latestContext = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
|
|
129
|
+
const state = computeProjectSourceState({
|
|
130
|
+
projectId: storedProject.id,
|
|
131
|
+
sourceFolderPath: storedProject.source.locator,
|
|
132
|
+
contextGraphPath: latestContext?.path ?? storedProject.contextGraphPath,
|
|
133
|
+
lastGraphIndexHash: null,
|
|
134
|
+
});
|
|
135
|
+
sendJson(res, 200, state);
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (subPath === PROJECT_SUBRESOURCES.contextGraphFile) {
|
|
140
|
+
// GET /v1/projects/<id>/context-graph/file?path=<relpath>
|
|
141
|
+
if (method === "GET") {
|
|
142
|
+
const relPath = parseRequestUrl(req).searchParams.get("path")?.trim() ?? "";
|
|
143
|
+
if (!relPath) {
|
|
144
|
+
sendError(res, 400, "Missing required query parameter: path.");
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
if (isTraversalRelativePath(relPath)) {
|
|
148
|
+
sendError(res, 400, "File path escapes Context Graph root.");
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
const latestContext = runtime.getLatestContextGraph(storedProject.projectDataDir, storedProject.id);
|
|
152
|
+
if (!latestContext?.path) {
|
|
153
|
+
sendError(res, 404, "Context Graph not found.");
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
const contextGraphPath = latestContext.path;
|
|
157
|
+
const safePath = safeApiFilePath(contextGraphPath, relPath);
|
|
158
|
+
if (!safePath) {
|
|
159
|
+
sendError(res, 400, "File path escapes Context Graph root.");
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
if (!sendApiFile(res, safePath)) {
|
|
163
|
+
sendError(res, 404, `File not found: ${relPath}`);
|
|
164
|
+
}
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (subPath.startsWith(`${PROJECT_SUBRESOURCES.artifacts}/`)) {
|
|
169
|
+
// GET /v1/projects/<id>/artifacts/<artifact-id> — per-Artifact
|
|
170
|
+
// status from the latest Build.
|
|
171
|
+
if (method === "GET") {
|
|
172
|
+
const rawArtifactId = subPath.slice(PROJECT_SUBRESOURCES.artifacts.length + 1);
|
|
173
|
+
let artifactId;
|
|
174
|
+
try {
|
|
175
|
+
artifactId = decodeURIComponent(rawArtifactId);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
sendError(res, 400, "Artifact id is not valid URI-encoded UTF-8.");
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
const project = runtime.getProject(storedProject.projectDataDir, storedProject.id);
|
|
182
|
+
const status = project?.artifacts.find((entry) => entry.artifact_id === artifactId);
|
|
183
|
+
if (!status) {
|
|
184
|
+
sendError(res, 404, `Artifact not found: ${artifactId}`);
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
sendJson(res, 200, status);
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
@@ -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,130 @@
|
|
|
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
|
+
/**
|
|
6
|
+
* Async/structured mutations on a project: Build Plan authoring
|
|
7
|
+
* and improvement jobs, benchmark-question drafts, Build Plan change deltas,
|
|
8
|
+
* and the destructive reset action.
|
|
9
|
+
*/
|
|
10
|
+
export async function tryHandleProjectJobs(req, res, runtime, ctx, method) {
|
|
11
|
+
const { storedProject, subPath } = ctx;
|
|
12
|
+
if (subPath === PROJECT_SUBRESOURCES.buildPlanDraftRuns ||
|
|
13
|
+
subPath === PROJECT_SUBRESOURCES.legacyBuildPlanDraftRuns) {
|
|
14
|
+
if (method === "POST") {
|
|
15
|
+
try {
|
|
16
|
+
const body = (await readJsonBody(req));
|
|
17
|
+
const job = await runtime.createBuildPlanAuthoringRun(storedProject.projectDataDir, {
|
|
18
|
+
...(body ?? {}),
|
|
19
|
+
project: storedProject.id,
|
|
20
|
+
source_folder_path: storedProject.source.locator,
|
|
21
|
+
});
|
|
22
|
+
sendJson(res, 202, job);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (subPath === PROJECT_SUBRESOURCES.buildPlanImprovementRuns) {
|
|
31
|
+
if (method === "POST") {
|
|
32
|
+
try {
|
|
33
|
+
const body = (await readJsonBody(req));
|
|
34
|
+
const job = await runtime.createBuildPlanAuthoringRun(storedProject.projectDataDir, {
|
|
35
|
+
...(body ?? {}),
|
|
36
|
+
project: storedProject.id,
|
|
37
|
+
source_folder_path: storedProject.source.locator,
|
|
38
|
+
}, "build-plan-improvement");
|
|
39
|
+
sendJson(res, 202, job);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
43
|
+
}
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (subPath === PROJECT_SUBRESOURCES.benchmarkQuestionDrafts) {
|
|
48
|
+
if (method === "POST") {
|
|
49
|
+
try {
|
|
50
|
+
const body = (await readJsonBody(req));
|
|
51
|
+
const job = await runtime.createBenchmarkQuestionDraftRun(storedProject.projectDataDir, {
|
|
52
|
+
...(body ?? {}),
|
|
53
|
+
project: storedProject.id,
|
|
54
|
+
source_folder_path: storedProject.source.locator,
|
|
55
|
+
});
|
|
56
|
+
sendJson(res, 202, job);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// The saved Q&A check set is the editable benchmark spec. Read it from the
|
|
65
|
+
// source-files spec (source + context graph specs share the same cases) and
|
|
66
|
+
// persist edits to both via the spec writer.
|
|
67
|
+
if (subPath === PROJECT_SUBRESOURCES.benchmarkChecks) {
|
|
68
|
+
if (method === "GET") {
|
|
69
|
+
const spec = loadTestSpec(storedProject.projectDataDir, "source-files", storedProject.id);
|
|
70
|
+
const checks = (spec?.cases ?? []).map((testCase) => ({
|
|
71
|
+
question: testCase.question,
|
|
72
|
+
answer: testCase.answer ?? "",
|
|
73
|
+
}));
|
|
74
|
+
sendJson(res, 200, { checks });
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
if (method === "PATCH") {
|
|
78
|
+
try {
|
|
79
|
+
const body = (await readJsonBody(req));
|
|
80
|
+
const rawChecks = Array.isArray(body?.checks) ? body.checks : [];
|
|
81
|
+
const checks = rawChecks
|
|
82
|
+
.filter((entry) => Boolean(entry) &&
|
|
83
|
+
typeof entry === "object" &&
|
|
84
|
+
typeof entry.question === "string")
|
|
85
|
+
.map((entry) => ({
|
|
86
|
+
question: entry.question.trim(),
|
|
87
|
+
answer: typeof entry.answer === "string" ? entry.answer.trim() : "",
|
|
88
|
+
}))
|
|
89
|
+
.filter((entry) => entry.question.length > 0);
|
|
90
|
+
writeBenchmarkSpecsForProject({
|
|
91
|
+
projectDataDir: storedProject.projectDataDir,
|
|
92
|
+
projectName: storedProject.id,
|
|
93
|
+
checks,
|
|
94
|
+
});
|
|
95
|
+
sendJson(res, 200, { checks });
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
99
|
+
}
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (subPath === PROJECT_SUBRESOURCES.buildPlanChanges) {
|
|
104
|
+
if (method === "POST") {
|
|
105
|
+
try {
|
|
106
|
+
const body = (await readJsonBody(req));
|
|
107
|
+
sendJson(res, 200, runtime.applyBuildPlanChange(storedProject.projectDataDir, body));
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
111
|
+
}
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (subPath === PROJECT_SUBRESOURCES.reset) {
|
|
116
|
+
if (method === "POST") {
|
|
117
|
+
try {
|
|
118
|
+
const body = (await readJsonBody(req));
|
|
119
|
+
const request = { project: storedProject.id, scope: "build", ...(body ?? {}) };
|
|
120
|
+
const result = runtime.applyReset(storedProject.projectDataDir, request);
|
|
121
|
+
sendJson(res, 200, result);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
125
|
+
}
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
@@ -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,85 @@
|
|
|
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
|
+
/**
|
|
5
|
+
* Build/verify run mutations and the per-Project runs listing.
|
|
6
|
+
* Run-id lookups for an unknown project are handled by the
|
|
7
|
+
* top-level /v1/runs and /v1/verify-runs routes.
|
|
8
|
+
*/
|
|
9
|
+
export async function tryHandleProjectRuns(req, res, runtime, ctx, method) {
|
|
10
|
+
const { storedProject, subPath } = ctx;
|
|
11
|
+
if (subPath === PROJECT_SUBRESOURCES.buildRuns) {
|
|
12
|
+
if (method === "POST") {
|
|
13
|
+
if (!storedProject.buildPlanId) {
|
|
14
|
+
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.`);
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const body = (await readJsonBody(req));
|
|
19
|
+
const request = { project: storedProject.id, ...(body ?? {}) };
|
|
20
|
+
const idempotencyKeyRaw = req.headers["x-interf-idempotency-key"];
|
|
21
|
+
const idempotencyKey = Array.isArray(idempotencyKeyRaw)
|
|
22
|
+
? idempotencyKeyRaw[0]
|
|
23
|
+
: idempotencyKeyRaw;
|
|
24
|
+
const trimmedKey = typeof idempotencyKey === "string" ? idempotencyKey.trim() : "";
|
|
25
|
+
const dedupedRunId = trimmedKey
|
|
26
|
+
? runtime.findIdempotentBuildRun(storedProject.projectDataDir, trimmedKey)
|
|
27
|
+
: null;
|
|
28
|
+
if (dedupedRunId) {
|
|
29
|
+
const existing = runtime.getBuildRun(storedProject.projectDataDir, dedupedRunId);
|
|
30
|
+
if (existing) {
|
|
31
|
+
sendJson(res, 200, existing);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const resource = await runtime.createBuildRun(storedProject.projectDataDir, request);
|
|
36
|
+
if (trimmedKey) {
|
|
37
|
+
runtime.recordIdempotentBuildRun(storedProject.projectDataDir, trimmedKey, resource.run.run_id);
|
|
38
|
+
}
|
|
39
|
+
sendJson(res, 201, resource);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
43
|
+
}
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (subPath === PROJECT_SUBRESOURCES.verifyRuns) {
|
|
48
|
+
if (method === "GET") {
|
|
49
|
+
const runs = runtime.listVerifyRunsForProject(storedProject.projectDataDir, storedProject.id);
|
|
50
|
+
sendJson(res, 200, { runs });
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
if (method === "POST") {
|
|
54
|
+
if (!storedProject.buildPlanId) {
|
|
55
|
+
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.`);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
// Free-tier benchmark quota lives next to project creation.
|
|
60
|
+
// Pro / Enterprise have `benchmarking-unlimited` and bypass;
|
|
61
|
+
// Free / Anonymous get one run per Project, ever.
|
|
62
|
+
const existingCount = runtime
|
|
63
|
+
.listVerifyRunsForProject(storedProject.projectDataDir, storedProject.id)
|
|
64
|
+
.filter((run) => !run.parent_run_id).length;
|
|
65
|
+
assertCanRunBenchmark(runtime.currentAccount, existingCount);
|
|
66
|
+
const body = (await readJsonBody(req));
|
|
67
|
+
const request = { project: storedProject.id, ...(body ?? {}) };
|
|
68
|
+
const resource = await runtime.createVerifyRun(storedProject.projectDataDir, request);
|
|
69
|
+
sendJson(res, 201, resource);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
sendErrorResponse(res, error);
|
|
73
|
+
}
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (subPath === PROJECT_SUBRESOURCES.runs) {
|
|
78
|
+
if (method === "GET") {
|
|
79
|
+
const runs = runtime.listBuildRunsForProject(storedProject.projectDataDir, storedProject.id);
|
|
80
|
+
sendJson(res, 200, { runs });
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
@@ -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>;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { ProjectCreateRequestSchema, ProjectUpdateRequestSchema, } from "../schemas/index.js";
|
|
2
|
+
import { LOCAL_SERVICE_ROUTES } from "./routes.js";
|
|
3
|
+
import { readJsonBody, sendError, sendErrorResponse, sendJson, } from "./server-helpers.js";
|
|
4
|
+
import { createStoredProject, deleteStoredProject, getStoredProject, listStoredProjects, projectWireShape, updateStoredProject, } from "../project-store.js";
|
|
5
|
+
import { tryHandleProjectRuns, } from "./server-routes-project-runs.js";
|
|
6
|
+
import { tryHandleProjectJobs } from "./server-routes-project-jobs.js";
|
|
7
|
+
import { tryHandleProjectContext } from "./server-routes-project-context.js";
|
|
8
|
+
export async function tryHandleProjectCollection(req, res, runtime, path, method) {
|
|
9
|
+
// GET /v1/projects — list every Project on the instance.
|
|
10
|
+
if (method === "GET" && path === LOCAL_SERVICE_ROUTES.projects) {
|
|
11
|
+
const items = listStoredProjects().map(projectWireShape);
|
|
12
|
+
sendJson(res, 200, { projects: items });
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
// POST /v1/projects — create a new Project.
|
|
16
|
+
if (method === "POST" && path === LOCAL_SERVICE_ROUTES.projects) {
|
|
17
|
+
try {
|
|
18
|
+
const body = ProjectCreateRequestSchema.parse(await readJsonBody(req));
|
|
19
|
+
const stored = createStoredProject(runtime, {
|
|
20
|
+
id: body.id,
|
|
21
|
+
source: { kind: "local-folder", locator: body.source.locator },
|
|
22
|
+
build_plan_id: body.build_plan_id,
|
|
23
|
+
});
|
|
24
|
+
sendJson(res, 201, projectWireShape(stored));
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
// assertCanCreateProject throws EntitlementError when the Free
|
|
28
|
+
// 10-Project cap is reached. sendErrorResponse routes it to 402 with
|
|
29
|
+
// upgrade_hint; everything else stays a 400 with the message body.
|
|
30
|
+
sendErrorResponse(res, error);
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
export async function tryHandlePerProject(req, res, runtime, path, method) {
|
|
37
|
+
if (!path.startsWith(`${LOCAL_SERVICE_ROUTES.projects}/`)) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
const tail = path.slice(LOCAL_SERVICE_ROUTES.projects.length + 1);
|
|
41
|
+
const slashIndex = tail.indexOf("/");
|
|
42
|
+
const projectId = slashIndex === -1 ? tail : tail.slice(0, slashIndex);
|
|
43
|
+
const subPath = slashIndex === -1 ? "" : tail.slice(slashIndex + 1);
|
|
44
|
+
const decodedProjectId = decodeURIComponent(projectId);
|
|
45
|
+
const storedProject = getStoredProject(decodedProjectId);
|
|
46
|
+
if (!storedProject) {
|
|
47
|
+
sendError(res, 404, `Project not found: ${decodedProjectId}`);
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
runtime.touchProject(storedProject.projectDataDir);
|
|
51
|
+
if (subPath === "") {
|
|
52
|
+
// Bare /v1/projects/{id} — project CRUD.
|
|
53
|
+
if (method === "GET") {
|
|
54
|
+
const project = runtime.getProject(storedProject.projectDataDir, storedProject.id);
|
|
55
|
+
if (!project) {
|
|
56
|
+
sendError(res, 404, `Project not found: ${decodedProjectId}`);
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
sendJson(res, 200, project);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
if (method === "PATCH") {
|
|
63
|
+
try {
|
|
64
|
+
const body = ProjectUpdateRequestSchema.parse(await readJsonBody(req));
|
|
65
|
+
const updated = updateStoredProject(decodedProjectId, {
|
|
66
|
+
build_plan_id: body.build_plan_id,
|
|
67
|
+
});
|
|
68
|
+
sendJson(res, 200, projectWireShape(updated));
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
if (method === "DELETE") {
|
|
76
|
+
deleteStoredProject(runtime, decodedProjectId);
|
|
77
|
+
sendJson(res, 200, { id: decodedProjectId, deleted: true });
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
sendError(res, 404, `Unknown project route: ${path}`);
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
const ctx = { storedProject, decodedProjectId, subPath };
|
|
84
|
+
if (await tryHandleProjectRuns(req, res, runtime, ctx, method))
|
|
85
|
+
return true;
|
|
86
|
+
if (await tryHandleProjectJobs(req, res, runtime, ctx, method))
|
|
87
|
+
return true;
|
|
88
|
+
if (await tryHandleProjectContext(req, res, runtime, ctx, method))
|
|
89
|
+
return true;
|
|
90
|
+
sendError(res, 404, `Unknown project sub-route: ${subPath}`);
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { LocalServiceRuntime } from "../runtime.js";
|
|
3
|
+
export declare function tryHandleRuns(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, path: string, method: string): boolean;
|