@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,85 @@
|
|
|
1
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { dirname, extname, normalize, resolve, sep } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { writeHeaders } from "./server-helpers.js";
|
|
5
|
+
export function packageRoot() {
|
|
6
|
+
return resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "..", "..");
|
|
7
|
+
}
|
|
8
|
+
function contentType(filePath) {
|
|
9
|
+
switch (extname(filePath)) {
|
|
10
|
+
case ".html":
|
|
11
|
+
return "text/html; charset=utf-8";
|
|
12
|
+
case ".js":
|
|
13
|
+
return "text/javascript; charset=utf-8";
|
|
14
|
+
case ".css":
|
|
15
|
+
return "text/css; charset=utf-8";
|
|
16
|
+
case ".json":
|
|
17
|
+
return "application/json; charset=utf-8";
|
|
18
|
+
case ".svg":
|
|
19
|
+
return "image/svg+xml";
|
|
20
|
+
case ".png":
|
|
21
|
+
return "image/png";
|
|
22
|
+
case ".ico":
|
|
23
|
+
return "image/x-icon";
|
|
24
|
+
case ".txt":
|
|
25
|
+
return "text/plain; charset=utf-8";
|
|
26
|
+
case ".md":
|
|
27
|
+
return "text/markdown; charset=utf-8";
|
|
28
|
+
case ".yml":
|
|
29
|
+
case ".yaml":
|
|
30
|
+
return "application/yaml; charset=utf-8";
|
|
31
|
+
case ".map":
|
|
32
|
+
return "application/json; charset=utf-8";
|
|
33
|
+
case ".webmanifest":
|
|
34
|
+
return "application/manifest+json; charset=utf-8";
|
|
35
|
+
case ".woff2":
|
|
36
|
+
return "font/woff2";
|
|
37
|
+
default:
|
|
38
|
+
return "application/octet-stream";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function safeApiFilePath(root, relativePath) {
|
|
42
|
+
const normalized = normalize(relativePath).replace(/^(\.\.(?:\/|\\|$))+/, "");
|
|
43
|
+
const absolute = resolve(root, normalized);
|
|
44
|
+
const resolvedRoot = resolve(root);
|
|
45
|
+
if (absolute !== resolvedRoot && !absolute.startsWith(`${resolvedRoot}${sep}`)) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
return absolute;
|
|
49
|
+
}
|
|
50
|
+
export function sendApiFile(res, filePath) {
|
|
51
|
+
if (!existsSync(filePath))
|
|
52
|
+
return false;
|
|
53
|
+
try {
|
|
54
|
+
if (!statSync(filePath).isFile())
|
|
55
|
+
return false;
|
|
56
|
+
const type = contentType(filePath);
|
|
57
|
+
const headers = { "content-type": type };
|
|
58
|
+
if (type.startsWith("text/html")) {
|
|
59
|
+
headers["cache-control"] = "no-store";
|
|
60
|
+
}
|
|
61
|
+
writeHeaders(res, 200, headers);
|
|
62
|
+
res.end(readFileSync(filePath));
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Reject any path that contains `..` or absolute segments. These helpers are
|
|
71
|
+
* only for authenticated `/v1/.../files/...` API resources, not for serving
|
|
72
|
+
* the Desktop renderer.
|
|
73
|
+
*/
|
|
74
|
+
export function isTraversalRelativePath(relPath) {
|
|
75
|
+
if (relPath.length === 0)
|
|
76
|
+
return true;
|
|
77
|
+
const segments = relPath.split(/[\\/]+/);
|
|
78
|
+
for (const segment of segments) {
|
|
79
|
+
if (segment === ".." || segment === "")
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
if (relPath.startsWith("/") || /^[A-Za-z]:/.test(relPath))
|
|
83
|
+
return true;
|
|
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 sendDesktopAppBoot(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime): boolean;
|
|
4
|
+
export declare function sendServiceNotFound(res: ServerResponse): void;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { buildLocalServiceUrl } from "./routes.js";
|
|
2
|
+
import { parseRequestUrl, sendText, writeHeaders } from "./server-helpers.js";
|
|
3
|
+
function escapedJsonForHtml(value) {
|
|
4
|
+
return JSON.stringify(value).replace(/</g, "\\u003c");
|
|
5
|
+
}
|
|
6
|
+
export function sendDesktopAppBoot(req, res, runtime) {
|
|
7
|
+
const url = parseRequestUrl(req);
|
|
8
|
+
if (url.pathname !== "/")
|
|
9
|
+
return false;
|
|
10
|
+
const method = req.method ?? "GET";
|
|
11
|
+
if (method !== "GET" && method !== "HEAD")
|
|
12
|
+
return false;
|
|
13
|
+
const boot = {
|
|
14
|
+
kind: "interf-app-boot",
|
|
15
|
+
version: 1,
|
|
16
|
+
service_url: buildLocalServiceUrl({ host: runtime.host, port: runtime.port }),
|
|
17
|
+
auth_required: Boolean(runtime.authToken),
|
|
18
|
+
auth_token: runtime.authToken,
|
|
19
|
+
};
|
|
20
|
+
const json = escapedJsonForHtml(boot);
|
|
21
|
+
writeHeaders(res, 200, {
|
|
22
|
+
"content-type": "text/html; charset=utf-8",
|
|
23
|
+
"cache-control": "no-store",
|
|
24
|
+
});
|
|
25
|
+
if (method === "HEAD") {
|
|
26
|
+
res.end();
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
res.end(`<!doctype html>
|
|
30
|
+
<html lang="en">
|
|
31
|
+
<head>
|
|
32
|
+
<meta charset="utf-8">
|
|
33
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
34
|
+
<title>Interf local service</title>
|
|
35
|
+
<script id="interf-app-boot" type="application/json">${json}</script>
|
|
36
|
+
</head>
|
|
37
|
+
<body>
|
|
38
|
+
<p>Interf local service is running.</p>
|
|
39
|
+
</body>
|
|
40
|
+
</html>
|
|
41
|
+
`);
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
export function sendServiceNotFound(res) {
|
|
45
|
+
sendText(res, 404, "Not found. Interf local service is running.\n");
|
|
46
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { IncomingMessage } from "node:http";
|
|
2
|
+
import type { LocalServiceRuntime } from "../runtime.js";
|
|
3
|
+
import { type ValidatedAccessToken } from "../auth/jwt-validator.js";
|
|
4
|
+
/** Generate a fresh per-instance bearer token. */
|
|
5
|
+
export declare function createLocalServiceAuthToken(): string;
|
|
6
|
+
export interface AllowedOrigins {
|
|
7
|
+
hostnames: string[];
|
|
8
|
+
ports: number[];
|
|
9
|
+
hostUrls: string[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Build the per-instance CORS / Origin allowlist. Only the loopback
|
|
13
|
+
* hostnames bound to the active port count as same-origin. `null` and
|
|
14
|
+
* absent Origin are also accepted (Electron / file:// / CLI tools).
|
|
15
|
+
*/
|
|
16
|
+
export declare function buildAllowedOrigins(host: string, port: number): AllowedOrigins;
|
|
17
|
+
export declare function originHeaderValue(req: IncomingMessage): string | null;
|
|
18
|
+
export declare function isOriginAllowed(origin: string | null, allowed: AllowedOrigins): boolean;
|
|
19
|
+
export declare function corsHeadersFor(origin: string | null, allowed: AllowedOrigins): Record<string, string>;
|
|
20
|
+
export declare function isMutatingMethod(method: string | undefined): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Return whether a request is one of the tokenless local discovery reads.
|
|
23
|
+
*
|
|
24
|
+
* The body of these routes must stay small and must not include Project,
|
|
25
|
+
* Source, Context Graph, trace, or evidence state.
|
|
26
|
+
*/
|
|
27
|
+
export declare function isPublicDiscoveryRead(method: string | undefined, path: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Return whether the local-service dispatcher must authenticate this request.
|
|
30
|
+
*
|
|
31
|
+
* Product mode protects every non-discovery `/v1` route, including read-only
|
|
32
|
+
* Project, Source, Context Graph, trace, evidence, account, run, and action
|
|
33
|
+
* resources. Mutating routes are always protected.
|
|
34
|
+
*/
|
|
35
|
+
export declare function requiresLocalServiceAuthorization(method: string | undefined, path: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Validate the bearer token on a protected local request. Returns true when:
|
|
38
|
+
* - the runtime has no token (test harness mode), or
|
|
39
|
+
* - the request includes `Authorization: Bearer <token>` matching the runtime token.
|
|
40
|
+
*/
|
|
41
|
+
export declare function isAuthorizedLocalBearer(req: IncomingMessage, runtime: LocalServiceRuntime): boolean;
|
|
42
|
+
/** @deprecated use `isAuthorizedLocalBearer`. */
|
|
43
|
+
export declare const isAuthorizedMutation: typeof isAuthorizedLocalBearer;
|
|
44
|
+
export type BearerJwtValidationResult = {
|
|
45
|
+
ok: true;
|
|
46
|
+
account: ValidatedAccessToken;
|
|
47
|
+
} | {
|
|
48
|
+
ok: false;
|
|
49
|
+
reason: "missing" | "malformed" | "invalid";
|
|
50
|
+
message?: string;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Validate a `Authorization: Bearer <jwt>` header against the WorkOS JWKS.
|
|
54
|
+
*
|
|
55
|
+
* Used by the cloud engine binding (`authMode: "jwt"`). The loopback engine
|
|
56
|
+
* stays on `isAuthorizedMutation` — the loopback bind + CORS allowlist + hex
|
|
57
|
+
* bearer are sufficient there, and avoiding the JWKS HTTP fetch keeps the
|
|
58
|
+
* local dev loop snappy.
|
|
59
|
+
*
|
|
60
|
+
* On `ok: true`, the validated claims are returned so the dispatcher can
|
|
61
|
+
* attach them to the request for downstream handlers.
|
|
62
|
+
*/
|
|
63
|
+
export declare function validateBearerJwt(req: IncomingMessage): Promise<BearerJwtValidationResult>;
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { LOCAL_SERVICE_LOOPBACK_HOSTS } from "../schemas/index.js";
|
|
3
|
+
import { JwtValidationError, validateAccessToken, } from "../auth/jwt-validator.js";
|
|
4
|
+
/** HTTP methods that require an authenticated bearer token + Origin guard. */
|
|
5
|
+
const MUTATING_METHODS = new Set(["POST", "PUT", "PATCH", "DELETE"]);
|
|
6
|
+
/** Read-only probes agents may use before authorization. */
|
|
7
|
+
const PUBLIC_DISCOVERY_GET_PATHS = new Set(["/health", "/v1", "/v1/instance", "/v1/openapi.json"]);
|
|
8
|
+
/** Generate a fresh per-instance bearer token. */
|
|
9
|
+
export function createLocalServiceAuthToken() {
|
|
10
|
+
return randomBytes(32).toString("hex");
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Build the per-instance CORS / Origin allowlist. Only the loopback
|
|
14
|
+
* hostnames bound to the active port count as same-origin. `null` and
|
|
15
|
+
* absent Origin are also accepted (Electron / file:// / CLI tools).
|
|
16
|
+
*/
|
|
17
|
+
export function buildAllowedOrigins(host, port) {
|
|
18
|
+
const hostnames = Array.from(new Set([host, ...LOCAL_SERVICE_LOOPBACK_HOSTS]));
|
|
19
|
+
// Dev mode: also allow the Next.js dev ports so the UI dev server can
|
|
20
|
+
// hit the engine cross-origin. Defaults to 3000,3001 — covers the
|
|
21
|
+
// standard `desktop:renderer:dev` + a previous A/B worktree. Override with the
|
|
22
|
+
// `INTERF_DEV_ORIGINS_PORTS` env var (comma-separated).
|
|
23
|
+
const devPortsRaw = process.env.INTERF_DEV_ORIGINS_PORTS ?? "3000,3001";
|
|
24
|
+
const devPorts = devPortsRaw
|
|
25
|
+
.split(",")
|
|
26
|
+
.map((raw) => Number.parseInt(raw.trim(), 10))
|
|
27
|
+
.filter((value) => Number.isInteger(value) && value > 0 && value !== port);
|
|
28
|
+
const ports = Array.from(new Set([port, ...devPorts]));
|
|
29
|
+
return {
|
|
30
|
+
hostnames,
|
|
31
|
+
ports,
|
|
32
|
+
hostUrls: hostnames.map((hostname) => {
|
|
33
|
+
const wrapped = hostname.includes(":") ? `[${hostname}]` : hostname;
|
|
34
|
+
return `http://${wrapped}:${port}`;
|
|
35
|
+
}),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export function originHeaderValue(req) {
|
|
39
|
+
const raw = req.headers.origin;
|
|
40
|
+
if (raw === undefined)
|
|
41
|
+
return null;
|
|
42
|
+
const value = Array.isArray(raw) ? raw[0] : raw;
|
|
43
|
+
if (typeof value !== "string")
|
|
44
|
+
return null;
|
|
45
|
+
const trimmed = value.trim();
|
|
46
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
47
|
+
}
|
|
48
|
+
function authorizationHeaderValue(req) {
|
|
49
|
+
const raw = req.headers.authorization;
|
|
50
|
+
if (!raw)
|
|
51
|
+
return null;
|
|
52
|
+
const value = Array.isArray(raw) ? raw[0] : raw;
|
|
53
|
+
if (typeof value !== "string")
|
|
54
|
+
return null;
|
|
55
|
+
const trimmed = value.trim();
|
|
56
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
57
|
+
}
|
|
58
|
+
export function isOriginAllowed(origin, allowed) {
|
|
59
|
+
if (origin === null)
|
|
60
|
+
return true; // CLI / Node fetch / native app — no Origin sent.
|
|
61
|
+
if (origin === "null")
|
|
62
|
+
return true; // Electron / sandboxed / file:// page.
|
|
63
|
+
if (origin === "zero://app" || origin === "zero://inline")
|
|
64
|
+
return true;
|
|
65
|
+
let parsed;
|
|
66
|
+
try {
|
|
67
|
+
parsed = new URL(origin);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:")
|
|
73
|
+
return false;
|
|
74
|
+
const hostname = parsed.hostname.replace(/^\[|\]$/g, "");
|
|
75
|
+
if (!allowed.hostnames.includes(hostname))
|
|
76
|
+
return false;
|
|
77
|
+
// Default ports (no explicit port in URL) cannot be the local service.
|
|
78
|
+
if (!parsed.port)
|
|
79
|
+
return false;
|
|
80
|
+
const portNumber = Number.parseInt(parsed.port, 10);
|
|
81
|
+
if (!Number.isInteger(portNumber))
|
|
82
|
+
return false;
|
|
83
|
+
return allowed.ports.includes(portNumber);
|
|
84
|
+
}
|
|
85
|
+
export function corsHeadersFor(origin, allowed) {
|
|
86
|
+
if (!isOriginAllowed(origin, allowed))
|
|
87
|
+
return { vary: "origin" };
|
|
88
|
+
return {
|
|
89
|
+
"access-control-allow-origin": origin ?? allowed.hostUrls[0] ?? "",
|
|
90
|
+
"access-control-allow-credentials": "false",
|
|
91
|
+
"access-control-allow-methods": "GET,POST,PATCH,DELETE,OPTIONS",
|
|
92
|
+
"access-control-allow-headers": "content-type, authorization, x-interf-idempotency-key",
|
|
93
|
+
vary: "origin",
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export function isMutatingMethod(method) {
|
|
97
|
+
return method !== undefined && MUTATING_METHODS.has(method.toUpperCase());
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Return whether a request is one of the tokenless local discovery reads.
|
|
101
|
+
*
|
|
102
|
+
* The body of these routes must stay small and must not include Project,
|
|
103
|
+
* Source, Context Graph, trace, or evidence state.
|
|
104
|
+
*/
|
|
105
|
+
export function isPublicDiscoveryRead(method, path) {
|
|
106
|
+
return method?.toUpperCase() === "GET" && PUBLIC_DISCOVERY_GET_PATHS.has(path);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Return whether the local-service dispatcher must authenticate this request.
|
|
110
|
+
*
|
|
111
|
+
* Product mode protects every non-discovery `/v1` route, including read-only
|
|
112
|
+
* Project, Source, Context Graph, trace, evidence, account, run, and action
|
|
113
|
+
* resources. Mutating routes are always protected.
|
|
114
|
+
*/
|
|
115
|
+
export function requiresLocalServiceAuthorization(method, path) {
|
|
116
|
+
if (isMutatingMethod(method))
|
|
117
|
+
return true;
|
|
118
|
+
if (isPublicDiscoveryRead(method, path))
|
|
119
|
+
return false;
|
|
120
|
+
return method?.toUpperCase() === "GET" && path.startsWith("/v1");
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Validate the bearer token on a protected local request. Returns true when:
|
|
124
|
+
* - the runtime has no token (test harness mode), or
|
|
125
|
+
* - the request includes `Authorization: Bearer <token>` matching the runtime token.
|
|
126
|
+
*/
|
|
127
|
+
export function isAuthorizedLocalBearer(req, runtime) {
|
|
128
|
+
if (!runtime.authToken)
|
|
129
|
+
return true;
|
|
130
|
+
const authorization = authorizationHeaderValue(req);
|
|
131
|
+
if (!authorization)
|
|
132
|
+
return false;
|
|
133
|
+
const match = /^Bearer\s+([A-Za-z0-9._\-]+)$/.exec(authorization);
|
|
134
|
+
if (!match)
|
|
135
|
+
return false;
|
|
136
|
+
const presented = match[1];
|
|
137
|
+
if (!presented || presented.length !== runtime.authToken.length)
|
|
138
|
+
return false;
|
|
139
|
+
// Constant-time compare to avoid timing oracles.
|
|
140
|
+
let mismatch = 0;
|
|
141
|
+
for (let index = 0; index < runtime.authToken.length; index += 1) {
|
|
142
|
+
mismatch |= presented.charCodeAt(index) ^ runtime.authToken.charCodeAt(index);
|
|
143
|
+
}
|
|
144
|
+
return mismatch === 0;
|
|
145
|
+
}
|
|
146
|
+
/** @deprecated use `isAuthorizedLocalBearer`. */
|
|
147
|
+
export const isAuthorizedMutation = isAuthorizedLocalBearer;
|
|
148
|
+
/**
|
|
149
|
+
* Validate a `Authorization: Bearer <jwt>` header against the WorkOS JWKS.
|
|
150
|
+
*
|
|
151
|
+
* Used by the cloud engine binding (`authMode: "jwt"`). The loopback engine
|
|
152
|
+
* stays on `isAuthorizedMutation` — the loopback bind + CORS allowlist + hex
|
|
153
|
+
* bearer are sufficient there, and avoiding the JWKS HTTP fetch keeps the
|
|
154
|
+
* local dev loop snappy.
|
|
155
|
+
*
|
|
156
|
+
* On `ok: true`, the validated claims are returned so the dispatcher can
|
|
157
|
+
* attach them to the request for downstream handlers.
|
|
158
|
+
*/
|
|
159
|
+
export async function validateBearerJwt(req) {
|
|
160
|
+
const authorization = authorizationHeaderValue(req);
|
|
161
|
+
if (!authorization)
|
|
162
|
+
return { ok: false, reason: "missing" };
|
|
163
|
+
const match = /^Bearer\s+(.+)$/.exec(authorization);
|
|
164
|
+
if (!match || !match[1])
|
|
165
|
+
return { ok: false, reason: "malformed" };
|
|
166
|
+
const token = match[1].trim();
|
|
167
|
+
if (token.length === 0)
|
|
168
|
+
return { ok: false, reason: "malformed" };
|
|
169
|
+
try {
|
|
170
|
+
const account = await validateAccessToken(token);
|
|
171
|
+
return { ok: true, account };
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
const message = error instanceof JwtValidationError
|
|
175
|
+
? error.message
|
|
176
|
+
: error instanceof Error
|
|
177
|
+
? error.message
|
|
178
|
+
: String(error);
|
|
179
|
+
return { ok: false, reason: "invalid", message };
|
|
180
|
+
}
|
|
181
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
/**
|
|
3
|
+
* Per-request response context. Carries the precomputed CORS headers so
|
|
4
|
+
* every helper call echoes the same allowlisted Origin.
|
|
5
|
+
*
|
|
6
|
+
* Default state is `NO_ORIGIN_RESPONSE_CONTEXT` — only `vary: origin`
|
|
7
|
+
* is emitted, no `access-control-allow-origin`, so a browser blocks the
|
|
8
|
+
* cross-origin response. The entry-point handler swaps in a context with
|
|
9
|
+
* `access-control-allow-origin` once it has validated the Origin header.
|
|
10
|
+
*/
|
|
11
|
+
export interface ResponseContext {
|
|
12
|
+
cors: Record<string, string>;
|
|
13
|
+
}
|
|
14
|
+
export declare const NO_ORIGIN_RESPONSE_CONTEXT: ResponseContext;
|
|
15
|
+
export declare function attachResponseContext(res: ServerResponse, ctx: ResponseContext): void;
|
|
16
|
+
export declare function writeHeaders(res: ServerResponse, statusCode: number, contextOrHeaders?: ResponseContext | Record<string, string>, headers?: Record<string, string>): void;
|
|
17
|
+
export declare function sendJson(res: ServerResponse, statusCode: number, contextOrValue: ResponseContext | unknown, maybeValue?: unknown): void;
|
|
18
|
+
export declare function sendText(res: ServerResponse, statusCode: number, contextOrValue: ResponseContext | string, maybeValue?: string): void;
|
|
19
|
+
export declare function sendError(res: ServerResponse, statusCode: number, contextOrMessage: ResponseContext | string, maybeMessage?: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* Route any thrown error to its proper response. EntitlementError gets its
|
|
22
|
+
* own status (402) and propagates `upgrade_hint` so clients can render an
|
|
23
|
+
* upgrade CTA. Everything else becomes a 400 with the message body.
|
|
24
|
+
*/
|
|
25
|
+
export declare function sendErrorResponse(res: ServerResponse, error: unknown, fallbackStatus?: number): void;
|
|
26
|
+
export declare function readJsonBody(req: IncomingMessage): Promise<unknown>;
|
|
27
|
+
export declare function parseRequestUrl(req: IncomingMessage): URL;
|
|
28
|
+
/**
|
|
29
|
+
* Decode a single percent-encoded path segment, or send a structured 400 and
|
|
30
|
+
* return `null`. `decodeURIComponent` throws a `URIError` on malformed input
|
|
31
|
+
* (e.g. a truncated escape like `%E0%A4%A`); left unguarded that crashes the
|
|
32
|
+
* handler into an uncaught 500. Routing every guarded call site through this
|
|
33
|
+
* helper keeps the decode semantics and the 400 message single-sourced.
|
|
34
|
+
*
|
|
35
|
+
* `label` names the id in the error message, e.g. `"Run id"` ->
|
|
36
|
+
* `"Run id is not valid URI-encoded UTF-8."`.
|
|
37
|
+
*/
|
|
38
|
+
export declare function decodeOr400(res: ServerResponse, raw: string, label: string): string | null;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { LocalServiceErrorSchema } from "../schemas/index.js";
|
|
2
|
+
import { EntitlementError } from "../entitlement-guard.js";
|
|
3
|
+
export const NO_ORIGIN_RESPONSE_CONTEXT = { cors: { vary: "origin" } };
|
|
4
|
+
/** Stash slot on the response object that holds the per-request CORS headers. */
|
|
5
|
+
const RESPONSE_CONTEXT_KEY = Symbol.for("interf.localService.responseContext");
|
|
6
|
+
export function attachResponseContext(res, ctx) {
|
|
7
|
+
res[RESPONSE_CONTEXT_KEY] = ctx;
|
|
8
|
+
}
|
|
9
|
+
function activeResponseContext(res) {
|
|
10
|
+
const ctx = res[RESPONSE_CONTEXT_KEY];
|
|
11
|
+
return ctx ?? NO_ORIGIN_RESPONSE_CONTEXT;
|
|
12
|
+
}
|
|
13
|
+
export function writeHeaders(res, statusCode, contextOrHeaders, headers = {}) {
|
|
14
|
+
// Compatibility shim while call sites migrate. Older callers pass a
|
|
15
|
+
// plain headers record as the third argument; new callers thread a
|
|
16
|
+
// `ResponseContext`. When neither is supplied (or only headers are),
|
|
17
|
+
// we read the per-request context the entry-point handler stashed on
|
|
18
|
+
// the response.
|
|
19
|
+
const isContext = contextOrHeaders !== undefined && "cors" in contextOrHeaders;
|
|
20
|
+
const context = isContext ? contextOrHeaders : activeResponseContext(res);
|
|
21
|
+
const extraHeaders = isContext ? headers : (contextOrHeaders ?? {});
|
|
22
|
+
res.writeHead(statusCode, {
|
|
23
|
+
...context.cors,
|
|
24
|
+
...extraHeaders,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export function sendJson(res, statusCode, contextOrValue, maybeValue) {
|
|
28
|
+
const usingContext = contextOrValue !== null
|
|
29
|
+
&& typeof contextOrValue === "object"
|
|
30
|
+
&& "cors" in contextOrValue
|
|
31
|
+
&& maybeValue !== undefined;
|
|
32
|
+
const context = usingContext ? contextOrValue : activeResponseContext(res);
|
|
33
|
+
const value = usingContext ? maybeValue : contextOrValue;
|
|
34
|
+
writeHeaders(res, statusCode, context, {
|
|
35
|
+
"content-type": "application/json; charset=utf-8",
|
|
36
|
+
});
|
|
37
|
+
res.end(`${JSON.stringify(value, null, 2)}\n`);
|
|
38
|
+
}
|
|
39
|
+
export function sendText(res, statusCode, contextOrValue, maybeValue) {
|
|
40
|
+
const usingContext = typeof contextOrValue === "object" && contextOrValue !== null && "cors" in contextOrValue;
|
|
41
|
+
const context = usingContext ? contextOrValue : activeResponseContext(res);
|
|
42
|
+
const value = usingContext ? (maybeValue ?? "") : contextOrValue;
|
|
43
|
+
writeHeaders(res, statusCode, context, {
|
|
44
|
+
"content-type": "text/plain; charset=utf-8",
|
|
45
|
+
});
|
|
46
|
+
res.end(value);
|
|
47
|
+
}
|
|
48
|
+
export function sendError(res, statusCode, contextOrMessage, maybeMessage) {
|
|
49
|
+
const usingContext = typeof contextOrMessage === "object" && contextOrMessage !== null && "cors" in contextOrMessage;
|
|
50
|
+
const context = usingContext ? contextOrMessage : activeResponseContext(res);
|
|
51
|
+
const message = usingContext ? (maybeMessage ?? "") : contextOrMessage;
|
|
52
|
+
sendJson(res, statusCode, context, LocalServiceErrorSchema.parse({
|
|
53
|
+
error: {
|
|
54
|
+
message,
|
|
55
|
+
},
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Route any thrown error to its proper response. EntitlementError gets its
|
|
60
|
+
* own status (402) and propagates `upgrade_hint` so clients can render an
|
|
61
|
+
* upgrade CTA. Everything else becomes a 400 with the message body.
|
|
62
|
+
*/
|
|
63
|
+
export function sendErrorResponse(res, error, fallbackStatus = 400) {
|
|
64
|
+
if (error instanceof EntitlementError) {
|
|
65
|
+
sendJson(res, error.httpStatus, LocalServiceErrorSchema.parse({
|
|
66
|
+
error: {
|
|
67
|
+
message: error.message,
|
|
68
|
+
code: "entitlement-required",
|
|
69
|
+
upgrade_hint: error.upgradeHint,
|
|
70
|
+
},
|
|
71
|
+
}));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
75
|
+
sendError(res, fallbackStatus, message);
|
|
76
|
+
}
|
|
77
|
+
export async function readJsonBody(req) {
|
|
78
|
+
const chunks = [];
|
|
79
|
+
for await (const chunk of req) {
|
|
80
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
81
|
+
}
|
|
82
|
+
const raw = Buffer.concat(chunks).toString("utf8").trim();
|
|
83
|
+
if (!raw)
|
|
84
|
+
return {};
|
|
85
|
+
return JSON.parse(raw);
|
|
86
|
+
}
|
|
87
|
+
export function parseRequestUrl(req) {
|
|
88
|
+
return new URL(req.url ?? "/", "http://127.0.0.1");
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Decode a single percent-encoded path segment, or send a structured 400 and
|
|
92
|
+
* return `null`. `decodeURIComponent` throws a `URIError` on malformed input
|
|
93
|
+
* (e.g. a truncated escape like `%E0%A4%A`); left unguarded that crashes the
|
|
94
|
+
* handler into an uncaught 500. Routing every guarded call site through this
|
|
95
|
+
* helper keeps the decode semantics and the 400 message single-sourced.
|
|
96
|
+
*
|
|
97
|
+
* `label` names the id in the error message, e.g. `"Run id"` ->
|
|
98
|
+
* `"Run id is not valid URI-encoded UTF-8."`.
|
|
99
|
+
*/
|
|
100
|
+
export function decodeOr400(res, raw, label) {
|
|
101
|
+
try {
|
|
102
|
+
return decodeURIComponent(raw);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
sendError(res, 400, `${label} is not valid URI-encoded UTF-8.`);
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { BuildRunResource, LocalJobRunResource, RunObservabilityResource, VerifyRunResource } from "../schemas/index.js";
|
|
2
|
+
import type { LocalServiceRuntime } from "../runtime.js";
|
|
3
|
+
type InstanceBuildPlanResource = ReturnType<LocalServiceRuntime["listBuildPlans"]>[number];
|
|
4
|
+
export declare function listInstanceRuns(runtime: LocalServiceRuntime): RunObservabilityResource[];
|
|
5
|
+
export declare function findInstanceRun(runtime: LocalServiceRuntime, runId: string): RunObservabilityResource | null;
|
|
6
|
+
export declare function findInstanceJob(runtime: LocalServiceRuntime, runId: string): {
|
|
7
|
+
job: LocalJobRunResource;
|
|
8
|
+
projectDataDir: string;
|
|
9
|
+
} | null;
|
|
10
|
+
export declare function findInstanceBuildRun(runtime: LocalServiceRuntime, runId: string): {
|
|
11
|
+
run: BuildRunResource;
|
|
12
|
+
projectDataDir: string;
|
|
13
|
+
} | null;
|
|
14
|
+
export declare function findInstanceVerifyRun(runtime: LocalServiceRuntime, runId: string): {
|
|
15
|
+
run: VerifyRunResource;
|
|
16
|
+
projectDataDir: string;
|
|
17
|
+
} | null;
|
|
18
|
+
export declare function listInstanceBuildPlans(runtime: LocalServiceRuntime): InstanceBuildPlanResource[];
|
|
19
|
+
export declare function findInstanceBuildPlan(runtime: LocalServiceRuntime, buildPlanId: string): InstanceBuildPlanResource | null;
|
|
20
|
+
export declare function listInstanceBuildPlanRuns(runtime: LocalServiceRuntime, buildPlanId: string): RunObservabilityResource[];
|
|
21
|
+
/**
|
|
22
|
+
* Resolve the on-disk root path for a Build Plan id. Used by the
|
|
23
|
+
* `/v1/build-plans/<id>/files/<relpath>` route. Resolution order matches
|
|
24
|
+
* the runtime: project-draft (if a project id is supplied) → user
|
|
25
|
+
* library → built-in. Returns `null` when the Build Plan id resolves
|
|
26
|
+
* nowhere.
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveBuildPlanPackageRoot(buildPlanId: string, projectDataDir?: string): string | null;
|
|
29
|
+
export declare function resolveInstanceBuildPlanPackageRoot(runtime: LocalServiceRuntime, buildPlanId: string): string | null;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { buildPlanDefinitionPath, builtinBuildPlanPackagePath, } from "../../build-plans/package/local-build-plans.js";
|
|
4
|
+
import { userBuildPlanExists, userBuildPlanPath, } from "../../build-plans/package/user-build-plans.js";
|
|
5
|
+
import { listStoredProjects } from "../project-store.js";
|
|
6
|
+
function projectDataDirsForInstance(runtime) {
|
|
7
|
+
return listStoredProjects().map((project) => project.projectDataDir);
|
|
8
|
+
}
|
|
9
|
+
export function listInstanceRuns(runtime) {
|
|
10
|
+
return projectDataDirsForInstance(runtime)
|
|
11
|
+
.flatMap((projectDataDir) => runtime.listRunObservability(projectDataDir))
|
|
12
|
+
.sort((left, right) => {
|
|
13
|
+
const leftMs = Date.parse(left.started_at ?? left.created_at ?? left.finished_at ?? "");
|
|
14
|
+
const rightMs = Date.parse(right.started_at ?? right.created_at ?? right.finished_at ?? "");
|
|
15
|
+
return (Number.isFinite(rightMs) ? rightMs : 0) - (Number.isFinite(leftMs) ? leftMs : 0);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export function findInstanceRun(runtime, runId) {
|
|
19
|
+
for (const projectDataDir of projectDataDirsForInstance(runtime)) {
|
|
20
|
+
const run = runtime.getRunObservability(projectDataDir, runId);
|
|
21
|
+
if (run)
|
|
22
|
+
return run;
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
export function findInstanceJob(runtime, runId) {
|
|
27
|
+
for (const projectDataDir of projectDataDirsForInstance(runtime)) {
|
|
28
|
+
const job = runtime.getJob(projectDataDir, runId);
|
|
29
|
+
if (job)
|
|
30
|
+
return { job, projectDataDir };
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
export function findInstanceBuildRun(runtime, runId) {
|
|
35
|
+
for (const projectDataDir of projectDataDirsForInstance(runtime)) {
|
|
36
|
+
const run = runtime.getBuildRun(projectDataDir, runId);
|
|
37
|
+
if (run)
|
|
38
|
+
return { run, projectDataDir };
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
export function findInstanceVerifyRun(runtime, runId) {
|
|
43
|
+
for (const projectDataDir of projectDataDirsForInstance(runtime)) {
|
|
44
|
+
const run = runtime.getVerifyRun(projectDataDir, runId);
|
|
45
|
+
if (run)
|
|
46
|
+
return { run, projectDataDir };
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
export function listInstanceBuildPlans(runtime) {
|
|
51
|
+
const byId = new Map();
|
|
52
|
+
const projectDataDirs = projectDataDirsForInstance(runtime);
|
|
53
|
+
for (const projectDataDir of projectDataDirs.length > 0 ? projectDataDirs : [runtime.rootPath]) {
|
|
54
|
+
for (const buildPlanResource of runtime.listBuildPlans(projectDataDir)) {
|
|
55
|
+
const existing = byId.get(buildPlanResource.id);
|
|
56
|
+
if (!existing) {
|
|
57
|
+
byId.set(buildPlanResource.id, buildPlanResource);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const preferred = existing.built_in && !buildPlanResource.built_in
|
|
61
|
+
? buildPlanResource
|
|
62
|
+
: existing;
|
|
63
|
+
byId.set(buildPlanResource.id, {
|
|
64
|
+
...preferred,
|
|
65
|
+
active_for_projects: Array.from(new Set([
|
|
66
|
+
...existing.active_for_projects,
|
|
67
|
+
...buildPlanResource.active_for_projects,
|
|
68
|
+
])).sort(),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return [...byId.values()].sort((left, right) => left.id.localeCompare(right.id));
|
|
73
|
+
}
|
|
74
|
+
export function findInstanceBuildPlan(runtime, buildPlanId) {
|
|
75
|
+
return listInstanceBuildPlans(runtime).find((buildPlanResource) => buildPlanResource.id === buildPlanId) ?? null;
|
|
76
|
+
}
|
|
77
|
+
export function listInstanceBuildPlanRuns(runtime, buildPlanId) {
|
|
78
|
+
return projectDataDirsForInstance(runtime)
|
|
79
|
+
.flatMap((projectDataDir) => runtime.listBuildPlanRuns(projectDataDir, buildPlanId))
|
|
80
|
+
.sort((left, right) => {
|
|
81
|
+
const leftMs = Date.parse(left.started_at ?? left.created_at ?? left.finished_at ?? "");
|
|
82
|
+
const rightMs = Date.parse(right.started_at ?? right.created_at ?? right.finished_at ?? "");
|
|
83
|
+
return (Number.isFinite(rightMs) ? rightMs : 0) - (Number.isFinite(leftMs) ? leftMs : 0);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resolve the on-disk root path for a Build Plan id. Used by the
|
|
88
|
+
* `/v1/build-plans/<id>/files/<relpath>` route. Resolution order matches
|
|
89
|
+
* the runtime: project-draft (if a project id is supplied) → user
|
|
90
|
+
* library → built-in. Returns `null` when the Build Plan id resolves
|
|
91
|
+
* nowhere.
|
|
92
|
+
*/
|
|
93
|
+
export function resolveBuildPlanPackageRoot(buildPlanId, projectDataDir) {
|
|
94
|
+
if (projectDataDir) {
|
|
95
|
+
const localPath = buildPlanDefinitionPath(projectDataDir, buildPlanId);
|
|
96
|
+
if (existsSync(join(localPath, "build-plan.json")))
|
|
97
|
+
return localPath;
|
|
98
|
+
}
|
|
99
|
+
if (userBuildPlanExists(buildPlanId)) {
|
|
100
|
+
return userBuildPlanPath(buildPlanId);
|
|
101
|
+
}
|
|
102
|
+
const builtinPath = builtinBuildPlanPackagePath(buildPlanId);
|
|
103
|
+
if (existsSync(join(builtinPath, "build-plan.json")))
|
|
104
|
+
return builtinPath;
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
export function resolveInstanceBuildPlanPackageRoot(runtime, buildPlanId) {
|
|
108
|
+
for (const projectDataDir of projectDataDirsForInstance(runtime)) {
|
|
109
|
+
const localPath = buildPlanDefinitionPath(projectDataDir, buildPlanId);
|
|
110
|
+
if (existsSync(join(localPath, "build-plan.json")))
|
|
111
|
+
return localPath;
|
|
112
|
+
}
|
|
113
|
+
return resolveBuildPlanPackageRoot(buildPlanId);
|
|
114
|
+
}
|