@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,96 @@
|
|
|
1
|
+
import { ProjectCreateRequestSchema, ProjectUpdateRequestSchema, } from "../schemas/index.js";
|
|
2
|
+
import { LOCAL_SERVICE_ROUTES } from "./routes.js";
|
|
3
|
+
import { decodeOr400, 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
|
+
intent: body.intent,
|
|
23
|
+
build_plan_id: body.build_plan_id,
|
|
24
|
+
});
|
|
25
|
+
sendJson(res, 201, projectWireShape(stored));
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
// assertCanCreateProject throws EntitlementError when the Free
|
|
29
|
+
// 10-Project cap is reached. sendErrorResponse routes it to 402 with
|
|
30
|
+
// upgrade_hint; everything else stays a 400 with the message body.
|
|
31
|
+
sendErrorResponse(res, error);
|
|
32
|
+
}
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
export async function tryHandlePerProject(req, res, runtime, path, method) {
|
|
38
|
+
if (!path.startsWith(`${LOCAL_SERVICE_ROUTES.projects}/`)) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
const tail = path.slice(LOCAL_SERVICE_ROUTES.projects.length + 1);
|
|
42
|
+
const slashIndex = tail.indexOf("/");
|
|
43
|
+
const projectId = slashIndex === -1 ? tail : tail.slice(0, slashIndex);
|
|
44
|
+
const subPath = slashIndex === -1 ? "" : tail.slice(slashIndex + 1);
|
|
45
|
+
const decodedProjectId = decodeOr400(res, projectId, "Project id");
|
|
46
|
+
if (decodedProjectId === null)
|
|
47
|
+
return true;
|
|
48
|
+
const storedProject = getStoredProject(decodedProjectId);
|
|
49
|
+
if (!storedProject) {
|
|
50
|
+
sendError(res, 404, `Project not found: ${decodedProjectId}`);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
runtime.touchProject(storedProject.projectDataDir);
|
|
54
|
+
if (subPath === "") {
|
|
55
|
+
// Bare /v1/projects/{id} — project CRUD.
|
|
56
|
+
if (method === "GET") {
|
|
57
|
+
const project = runtime.getProject(storedProject.projectDataDir, storedProject.id);
|
|
58
|
+
if (!project) {
|
|
59
|
+
sendError(res, 404, `Project not found: ${decodedProjectId}`);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
sendJson(res, 200, project);
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
if (method === "PATCH") {
|
|
66
|
+
try {
|
|
67
|
+
const body = ProjectUpdateRequestSchema.parse(await readJsonBody(req));
|
|
68
|
+
const updated = updateStoredProject(decodedProjectId, {
|
|
69
|
+
intent: body.intent,
|
|
70
|
+
build_plan_id: body.build_plan_id,
|
|
71
|
+
});
|
|
72
|
+
sendJson(res, 200, projectWireShape(updated));
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
76
|
+
}
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
if (method === "DELETE") {
|
|
80
|
+
deleteStoredProject(runtime, decodedProjectId);
|
|
81
|
+
sendJson(res, 200, { id: decodedProjectId, deleted: true });
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
sendError(res, 404, `Unknown project route: ${path}`);
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
const ctx = { storedProject, decodedProjectId, subPath };
|
|
88
|
+
if (await tryHandleProjectRuns(req, res, runtime, ctx, method))
|
|
89
|
+
return true;
|
|
90
|
+
if (await tryHandleProjectJobs(req, res, runtime, ctx, method))
|
|
91
|
+
return true;
|
|
92
|
+
if (await tryHandleProjectContext(req, res, runtime, ctx, method))
|
|
93
|
+
return true;
|
|
94
|
+
sendError(res, 404, `Unknown project sub-route: ${subPath}`);
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
@@ -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;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { LOCAL_SERVICE_ROUTES, RUN_SUBRESOURCES } from "./routes.js";
|
|
2
|
+
import { decodeOr400, parseRequestUrl, sendError, sendJson } from "./server-helpers.js";
|
|
3
|
+
import { isTraversalRelativePath, safeApiFilePath, sendApiFile, } from "./server-api-files.js";
|
|
4
|
+
import { findInstanceBuildRun, findInstanceJob, findInstanceRun, findInstanceVerifyRun, listInstanceRuns, } from "./server-instance-helpers.js";
|
|
5
|
+
import { runObservabilityToStatus } from "../run-observability.js";
|
|
6
|
+
export function tryHandleRuns(req, res, runtime, path, method) {
|
|
7
|
+
if (method === "GET" && path === LOCAL_SERVICE_ROUTES.runs) {
|
|
8
|
+
sendJson(res, 200, { runs: listInstanceRuns(runtime) });
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
const observableRunMatch = path.match(/^\/v1\/runs\/([^/]+)(?:\/([^/]+))?$/);
|
|
12
|
+
if (observableRunMatch?.[1]) {
|
|
13
|
+
const runId = decodeOr400(res, observableRunMatch[1], "Run id");
|
|
14
|
+
if (runId === null)
|
|
15
|
+
return true;
|
|
16
|
+
const child = observableRunMatch[2];
|
|
17
|
+
if (method === "GET" && !child) {
|
|
18
|
+
const run = findInstanceRun(runtime, runId);
|
|
19
|
+
if (!run)
|
|
20
|
+
sendError(res, 404, "Run not found.");
|
|
21
|
+
else
|
|
22
|
+
sendJson(res, 200, run);
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
if (method === "GET" && child === RUN_SUBRESOURCES.status) {
|
|
26
|
+
const run = findInstanceRun(runtime, runId);
|
|
27
|
+
if (!run)
|
|
28
|
+
sendError(res, 404, "Run not found.");
|
|
29
|
+
else
|
|
30
|
+
sendJson(res, 200, runObservabilityToStatus(run));
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
const found = findInstanceBuildRun(runtime, runId);
|
|
34
|
+
if (method === "GET" && child === RUN_SUBRESOURCES.events) {
|
|
35
|
+
const events = found ? runtime.getBuildRunEvents(found.projectDataDir, runId) : null;
|
|
36
|
+
if (!events)
|
|
37
|
+
sendError(res, 404, "Build not found.");
|
|
38
|
+
else
|
|
39
|
+
sendJson(res, 200, { events });
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
if (method === "GET" && child === RUN_SUBRESOURCES.artifacts) {
|
|
43
|
+
const artifacts = found ? runtime.getBuildRunArtifacts(found.projectDataDir, runId) : null;
|
|
44
|
+
if (!artifacts)
|
|
45
|
+
sendError(res, 404, "Build not found.");
|
|
46
|
+
else
|
|
47
|
+
sendJson(res, 200, { artifacts });
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
if (method === "GET" && child === RUN_SUBRESOURCES.files) {
|
|
51
|
+
const relPath = parseRequestUrl(req).searchParams.get("path")?.trim() ?? "";
|
|
52
|
+
if (!found) {
|
|
53
|
+
sendError(res, 404, "Build not found.");
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
if (!relPath) {
|
|
57
|
+
sendError(res, 400, "Missing required query parameter: path.");
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
if (isTraversalRelativePath(relPath)) {
|
|
61
|
+
sendError(res, 400, "File path escapes Run output root.");
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
const safePath = safeApiFilePath(found.run.run.context_graph_path, relPath);
|
|
65
|
+
if (!safePath) {
|
|
66
|
+
sendError(res, 400, "File path escapes Run output root.");
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
if (!sendApiFile(res, safePath)) {
|
|
70
|
+
sendError(res, 404, `File not found: ${relPath}`);
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
if (method === "POST" && child === RUN_SUBRESOURCES.cancel) {
|
|
75
|
+
if (!found) {
|
|
76
|
+
sendError(res, 404, "Build not found.");
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
sendJson(res, 200, runtime.cancelBuildRun(runId));
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const verifyRunMatch = path.match(/^\/v1\/verify-runs\/([^/]+)$/);
|
|
84
|
+
if (method === "GET" && verifyRunMatch?.[1]) {
|
|
85
|
+
const verifyRunId = decodeOr400(res, verifyRunMatch[1], "Verify run id");
|
|
86
|
+
if (verifyRunId === null)
|
|
87
|
+
return true;
|
|
88
|
+
const found = findInstanceVerifyRun(runtime, verifyRunId);
|
|
89
|
+
if (!found)
|
|
90
|
+
sendError(res, 404, "Verify run not found.");
|
|
91
|
+
else
|
|
92
|
+
sendJson(res, 200, found.run);
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
const jobMatch = path.match(/^\/v1\/jobs\/([^/]+)(?:\/([^/]+))?$/);
|
|
96
|
+
if (jobMatch?.[1]) {
|
|
97
|
+
const runId = decodeOr400(res, jobMatch[1], "Job run id");
|
|
98
|
+
if (runId === null)
|
|
99
|
+
return true;
|
|
100
|
+
const child = jobMatch[2];
|
|
101
|
+
const found = findInstanceJob(runtime, runId);
|
|
102
|
+
if (method === "GET" && !child) {
|
|
103
|
+
if (!found)
|
|
104
|
+
sendError(res, 404, "Job run not found.");
|
|
105
|
+
else
|
|
106
|
+
sendJson(res, 200, found.job);
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
if (method === "GET" && child === "events") {
|
|
110
|
+
const events = found ? runtime.getJobEvents(found.projectDataDir, runId) : null;
|
|
111
|
+
if (!events)
|
|
112
|
+
sendError(res, 404, "Job run not found.");
|
|
113
|
+
else
|
|
114
|
+
sendJson(res, 200, { events });
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type Server } from "node:http";
|
|
2
|
+
import { type LocalServiceRunHandlers, type LocalServiceRuntime } from "../runtime.js";
|
|
3
|
+
import { createLocalServiceAuthToken } from "./server-guards.js";
|
|
4
|
+
export { createLocalServiceAuthToken };
|
|
5
|
+
export interface StartLocalServiceOptions {
|
|
6
|
+
rootPath?: string;
|
|
7
|
+
host?: string;
|
|
8
|
+
port?: number;
|
|
9
|
+
searchFromPort?: number;
|
|
10
|
+
packageVersion?: string;
|
|
11
|
+
handlers?: Partial<LocalServiceRunHandlers>;
|
|
12
|
+
/**
|
|
13
|
+
* Local authorization policy.
|
|
14
|
+
*
|
|
15
|
+
* Product/app-owned loopback defaults to `token-required`: startup
|
|
16
|
+
* generates a per-instance bearer token unless the caller pins one.
|
|
17
|
+
* Tests may pass `tokenless-dev` to keep direct fetch fixtures readable.
|
|
18
|
+
*/
|
|
19
|
+
localAuthMode?: "token-required" | "tokenless-dev";
|
|
20
|
+
/**
|
|
21
|
+
* Per-instance bearer token. In token-required mode:
|
|
22
|
+
* - undefined or `"auto"` generates a fresh random hex token.
|
|
23
|
+
* - a literal string pins a token for tests.
|
|
24
|
+
* - `null` is rejected unless `localAuthMode` is `tokenless-dev`.
|
|
25
|
+
*/
|
|
26
|
+
authToken?: string | null | "auto";
|
|
27
|
+
ownerKind?: "desktop-app" | "headless";
|
|
28
|
+
ownerPid?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface StartedLocalService {
|
|
31
|
+
runtime: LocalServiceRuntime;
|
|
32
|
+
server: Server;
|
|
33
|
+
url: string;
|
|
34
|
+
close(): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
export declare function createLocalServiceServer(runtime: LocalServiceRuntime): Server;
|
|
37
|
+
export declare function startLocalService(options?: StartLocalServiceOptions): Promise<StartedLocalService>;
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import { createServer } from "node:http";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { LOCAL_SERVICE_LOOPBACK_HOSTS, LocalServiceConfigSchema, LocalServiceErrorSchema, ServiceRegistryEntrySchema, } from "../schemas/index.js";
|
|
4
|
+
import { createLocalServiceRuntime, } from "../runtime.js";
|
|
5
|
+
import { LOCAL_SERVICE_DEFAULT_HOST, LOCAL_SERVICE_DEFAULT_PORT, LOCAL_SERVICE_ROUTES, } from "./routes.js";
|
|
6
|
+
import { registerServiceLocally, unregisterService, } from "./service-registry.js";
|
|
7
|
+
import { rehydrateProjects, } from "../project-store.js";
|
|
8
|
+
import { readSession } from "../auth/session-store.js";
|
|
9
|
+
import { clearConnection, readActiveConnection, writeConnection, } from "../connection-config.js";
|
|
10
|
+
import { attachResponseContext, NO_ORIGIN_RESPONSE_CONTEXT, parseRequestUrl, sendError, writeHeaders, } from "./server-helpers.js";
|
|
11
|
+
import { buildAllowedOrigins, corsHeadersFor, createLocalServiceAuthToken, isAuthorizedLocalBearer, isMutatingMethod, isOriginAllowed, originHeaderValue, requiresLocalServiceAuthorization, validateBearerJwt, } from "./server-guards.js";
|
|
12
|
+
import { sendDesktopAppBoot, sendServiceNotFound, } from "./server-app-boot.js";
|
|
13
|
+
import { tryHandleDiscovery, tryHandleOpenPath, } from "./server-routes-discovery.js";
|
|
14
|
+
import { tryHandlePerProject, tryHandleProjectCollection, } from "./server-routes-projects.js";
|
|
15
|
+
import { tryHandleBuildPlans } from "./server-routes-build-plans.js";
|
|
16
|
+
import { tryHandleRuns } from "./server-routes-runs.js";
|
|
17
|
+
import { notifyServiceChange, tryHandleEvents } from "./server-routes-events.js";
|
|
18
|
+
import { tryHandleActionProposals } from "./server-routes-action-proposals.js";
|
|
19
|
+
import { tryHandleAgents, tryHandleExecutor, } from "./server-routes-agents.js";
|
|
20
|
+
import { tryHandleAuth } from "./server-routes-auth.js";
|
|
21
|
+
export { createLocalServiceAuthToken };
|
|
22
|
+
async function routeApi(req, res, runtime) {
|
|
23
|
+
const url = parseRequestUrl(req);
|
|
24
|
+
const path = url.pathname;
|
|
25
|
+
const method = req.method ?? "GET";
|
|
26
|
+
const origin = originHeaderValue(req);
|
|
27
|
+
const allowed = buildAllowedOrigins(runtime.host, runtime.port);
|
|
28
|
+
// CORS preflight — answered for allowed origins, refused otherwise.
|
|
29
|
+
if (method === "OPTIONS") {
|
|
30
|
+
if (!isOriginAllowed(origin, allowed)) {
|
|
31
|
+
attachResponseContext(res, NO_ORIGIN_RESPONSE_CONTEXT);
|
|
32
|
+
sendError(res, 403, "Origin not allowed.");
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
attachResponseContext(res, { cors: corsHeadersFor(origin, allowed) });
|
|
36
|
+
writeHeaders(res, 204);
|
|
37
|
+
res.end();
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
// For non-OPTIONS, attach the CORS context once.
|
|
41
|
+
attachResponseContext(res, { cors: corsHeadersFor(origin, allowed) });
|
|
42
|
+
// Protected requests must:
|
|
43
|
+
// 1. Have an Origin that's local OR no Origin at all (CLI),
|
|
44
|
+
// 2. Carry a valid Authorization: Bearer <token> if the runtime issued one.
|
|
45
|
+
//
|
|
46
|
+
// Only /health, /v1, and /v1/instance stay tokenless for discovery.
|
|
47
|
+
if (requiresLocalServiceAuthorization(method, path) && path !== LOCAL_SERVICE_ROUTES.events) {
|
|
48
|
+
if (!isOriginAllowed(origin, allowed)) {
|
|
49
|
+
sendError(res, 403, "Origin not allowed.");
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
if (runtime.authMode === "jwt") {
|
|
53
|
+
const result = await validateBearerJwt(req);
|
|
54
|
+
if (!result.ok) {
|
|
55
|
+
writeHeaders(res, 401, { "www-authenticate": "Bearer realm=\"interf-cloud\"" });
|
|
56
|
+
res.end(`${JSON.stringify(LocalServiceErrorSchema.parse({
|
|
57
|
+
error: { message: "Missing or invalid bearer token." },
|
|
58
|
+
}), null, 2)}\n`);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
// Hand the validated claims to downstream handlers (billing
|
|
62
|
+
// events, route guards) without forcing every handler to re-parse.
|
|
63
|
+
req.interfAccount = result.account;
|
|
64
|
+
}
|
|
65
|
+
else if (!isAuthorizedLocalBearer(req, runtime)) {
|
|
66
|
+
writeHeaders(res, 401, { "www-authenticate": "Bearer realm=\"interf-local-service\"" });
|
|
67
|
+
res.end(`${JSON.stringify(LocalServiceErrorSchema.parse({
|
|
68
|
+
error: { message: "Missing or invalid bearer token." },
|
|
69
|
+
}), null, 2)}\n`);
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Dispatch chain — each route module returns true once it has handled
|
|
74
|
+
// the request. The first match wins; nothing falls through to the next
|
|
75
|
+
// module after a handler claims the route.
|
|
76
|
+
if (tryHandleDiscovery(req, res, runtime, path, method))
|
|
77
|
+
return true;
|
|
78
|
+
if (tryHandleEvents(req, res, runtime, path, method))
|
|
79
|
+
return true;
|
|
80
|
+
if (await tryHandleAuth(req, res, runtime, path, method))
|
|
81
|
+
return true;
|
|
82
|
+
if (await tryHandleProjectCollection(req, res, runtime, path, method))
|
|
83
|
+
return true;
|
|
84
|
+
if (await tryHandlePerProject(req, res, runtime, path, method))
|
|
85
|
+
return true;
|
|
86
|
+
if (await tryHandleBuildPlans(req, res, runtime, path, method))
|
|
87
|
+
return true;
|
|
88
|
+
if (tryHandleRuns(req, res, runtime, path, method))
|
|
89
|
+
return true;
|
|
90
|
+
if (await tryHandleActionProposals(req, res, runtime, path, method))
|
|
91
|
+
return true;
|
|
92
|
+
if (await tryHandleExecutor(req, res, runtime, path, method))
|
|
93
|
+
return true;
|
|
94
|
+
if (await tryHandleAgents(req, res, runtime, path, method))
|
|
95
|
+
return true;
|
|
96
|
+
if (await tryHandleOpenPath(req, res, runtime, path, method))
|
|
97
|
+
return true;
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
export function createLocalServiceServer(runtime) {
|
|
101
|
+
return createServer((req, res) => {
|
|
102
|
+
void (async () => {
|
|
103
|
+
// Pre-attach a CORS context so app boot GETs and the 404
|
|
104
|
+
// fallback emit the right headers even before routeApi has a
|
|
105
|
+
// chance to set its own. The OPTIONS preflight handling and the
|
|
106
|
+
// mutating-buildPlan guards still happen inside routeApi.
|
|
107
|
+
const origin = originHeaderValue(req);
|
|
108
|
+
const allowed = buildAllowedOrigins(runtime.host, runtime.port);
|
|
109
|
+
attachResponseContext(res, { cors: corsHeadersFor(origin, allowed) });
|
|
110
|
+
try {
|
|
111
|
+
const routed = await routeApi(req, res, runtime);
|
|
112
|
+
if (routed) {
|
|
113
|
+
// After a successful mutation from any client (app, CLI, MCP), fan a
|
|
114
|
+
// change ping to SSE subscribers so open renderers refresh without
|
|
115
|
+
// polling. Run progress is still owned by the active-run poll.
|
|
116
|
+
if (isMutatingMethod(req.method) &&
|
|
117
|
+
res.statusCode >= 200 &&
|
|
118
|
+
res.statusCode < 300) {
|
|
119
|
+
notifyServiceChange(runtime);
|
|
120
|
+
}
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (sendDesktopAppBoot(req, res, runtime))
|
|
124
|
+
return;
|
|
125
|
+
sendServiceNotFound(res);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
sendError(res, 500, error instanceof Error ? error.message : String(error));
|
|
129
|
+
}
|
|
130
|
+
})();
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
function resolvePort(optionPort) {
|
|
134
|
+
if (typeof optionPort === "number")
|
|
135
|
+
return { port: optionPort, pinned: true };
|
|
136
|
+
const envPort = Number.parseInt(process.env.INTERF_SERVICE_PORT ?? "", 10);
|
|
137
|
+
if (Number.isInteger(envPort))
|
|
138
|
+
return { port: envPort, pinned: true };
|
|
139
|
+
return { port: LOCAL_SERVICE_DEFAULT_PORT, pinned: false };
|
|
140
|
+
}
|
|
141
|
+
const LOCAL_SERVICE_PORT_FALLBACK_RANGE = 50;
|
|
142
|
+
async function listenWithFallback(server, host, startPort, pinned) {
|
|
143
|
+
const maxPort = pinned ? startPort : startPort + LOCAL_SERVICE_PORT_FALLBACK_RANGE;
|
|
144
|
+
for (let port = startPort; port <= maxPort; port += 1) {
|
|
145
|
+
try {
|
|
146
|
+
await new Promise((resolveListen, rejectListen) => {
|
|
147
|
+
const onError = (error) => {
|
|
148
|
+
server.off("listening", onListening);
|
|
149
|
+
rejectListen(error);
|
|
150
|
+
};
|
|
151
|
+
const onListening = () => {
|
|
152
|
+
server.off("error", onError);
|
|
153
|
+
resolveListen();
|
|
154
|
+
};
|
|
155
|
+
server.once("error", onError);
|
|
156
|
+
server.once("listening", onListening);
|
|
157
|
+
server.listen(port, host);
|
|
158
|
+
});
|
|
159
|
+
return port;
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
const code = error?.code;
|
|
163
|
+
if (code !== "EADDRINUSE" || port === maxPort)
|
|
164
|
+
throw error;
|
|
165
|
+
// Retry on the next port; the server will emit a fresh "listening" event on the next attempt.
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
throw new Error(`Could not bind a free port between ${startPort} and ${maxPort}.`);
|
|
169
|
+
}
|
|
170
|
+
export async function startLocalService(options = {}) {
|
|
171
|
+
const requestedPort = typeof options.searchFromPort === "number"
|
|
172
|
+
? { port: options.searchFromPort, pinned: false }
|
|
173
|
+
: resolvePort(options.port);
|
|
174
|
+
const requestedHost = options.host ?? process.env.INTERF_SERVICE_HOST ?? LOCAL_SERVICE_DEFAULT_HOST;
|
|
175
|
+
// Reject non-loopback host bindings before we even configure anything.
|
|
176
|
+
// This guards against `INTERF_SERVICE_HOST=0.0.0.0` env injection or a
|
|
177
|
+
// call site that passes a LAN IP. The schema-level refinement also
|
|
178
|
+
// rejects, but we want a clearer error message.
|
|
179
|
+
if (!LOCAL_SERVICE_LOOPBACK_HOSTS.includes(requestedHost)) {
|
|
180
|
+
throw new Error(`Refusing to bind local service to non-loopback host '${requestedHost}'. ` +
|
|
181
|
+
`Use one of ${LOCAL_SERVICE_LOOPBACK_HOSTS.join(", ")} ` +
|
|
182
|
+
`(adjust the --host flag or INTERF_SERVICE_HOST env var).`);
|
|
183
|
+
}
|
|
184
|
+
const config = LocalServiceConfigSchema.parse({
|
|
185
|
+
host: requestedHost,
|
|
186
|
+
port: requestedPort.port,
|
|
187
|
+
});
|
|
188
|
+
const rootPath = options.rootPath ?? process.cwd();
|
|
189
|
+
const resolvedRoot = resolve(rootPath);
|
|
190
|
+
// auth-token policy: app-owned/product loopback is token-required by
|
|
191
|
+
// default. Tests must opt into the explicit tokenless-dev mode.
|
|
192
|
+
const authToken = (() => {
|
|
193
|
+
const localAuthMode = options.localAuthMode ?? "token-required";
|
|
194
|
+
if (localAuthMode === "tokenless-dev")
|
|
195
|
+
return null;
|
|
196
|
+
if (options.authToken === null) {
|
|
197
|
+
throw new Error("authToken:null requires localAuthMode:'tokenless-dev'.");
|
|
198
|
+
}
|
|
199
|
+
if (options.authToken === "auto")
|
|
200
|
+
return createLocalServiceAuthToken();
|
|
201
|
+
if (typeof options.authToken === "string")
|
|
202
|
+
return options.authToken;
|
|
203
|
+
return createLocalServiceAuthToken();
|
|
204
|
+
})();
|
|
205
|
+
// Boot-time auth: read the persisted session, if any. The session file
|
|
206
|
+
// is local-only and stamps `account_id` on every billing event so audit
|
|
207
|
+
// trails connect runs to a signed-in user. Loopback engines stay JWT-free.
|
|
208
|
+
const bootAccount = (() => {
|
|
209
|
+
try {
|
|
210
|
+
return readSession();
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
})();
|
|
216
|
+
const runtime = createLocalServiceRuntime({
|
|
217
|
+
rootPath: resolvedRoot,
|
|
218
|
+
host: config.host,
|
|
219
|
+
port: config.port,
|
|
220
|
+
packageVersion: options.packageVersion,
|
|
221
|
+
ownerKind: options.ownerKind ?? "headless",
|
|
222
|
+
...(options.ownerPid ? { ownerPid: options.ownerPid } : {}),
|
|
223
|
+
handlers: options.handlers,
|
|
224
|
+
...(authToken ? { authToken } : {}),
|
|
225
|
+
currentAccount: bootAccount,
|
|
226
|
+
});
|
|
227
|
+
// Rehydrate saved Projects so subsequent
|
|
228
|
+
// build / benchmark / readiness calls find them after a service restart.
|
|
229
|
+
try {
|
|
230
|
+
rehydrateProjects(runtime);
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
// best effort
|
|
234
|
+
}
|
|
235
|
+
const server = createLocalServiceServer(runtime);
|
|
236
|
+
const boundPort = await listenWithFallback(server, config.host, config.port, requestedPort.pinned);
|
|
237
|
+
runtime.setBoundPort(boundPort);
|
|
238
|
+
const health = runtime.health();
|
|
239
|
+
const url = health.service_url;
|
|
240
|
+
const startedAt = health.instance_started_at ?? new Date().toISOString();
|
|
241
|
+
// Central stop-lookup registry — one entry per running instance.
|
|
242
|
+
// Runtime stop uses this as a fallback when the active connection record is missing.
|
|
243
|
+
const writeRegistryEntry = () => {
|
|
244
|
+
try {
|
|
245
|
+
registerServiceLocally(ServiceRegistryEntrySchema.parse({
|
|
246
|
+
pid: process.pid,
|
|
247
|
+
host: config.host,
|
|
248
|
+
port: boundPort,
|
|
249
|
+
url,
|
|
250
|
+
started_at: startedAt,
|
|
251
|
+
owner_kind: options.ownerKind ?? "headless",
|
|
252
|
+
...(options.ownerPid ? { owner_pid: options.ownerPid } : {}),
|
|
253
|
+
...(authToken ? { auth_token: authToken } : {}),
|
|
254
|
+
}));
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
// best effort: registry corruption shouldn't take the service down
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
writeRegistryEntry();
|
|
261
|
+
runtime.setOnRegistryChanged(writeRegistryEntry);
|
|
262
|
+
// Write the single-record CLI connection so `interf project`,
|
|
263
|
+
// `interf build`, etc. can find this engine without a pointer file.
|
|
264
|
+
try {
|
|
265
|
+
writeConnection({ url, auth_token: authToken });
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// best effort: connection file is convenience, not correctness
|
|
269
|
+
}
|
|
270
|
+
return {
|
|
271
|
+
runtime,
|
|
272
|
+
server,
|
|
273
|
+
url,
|
|
274
|
+
close: () => new Promise((resolveClose, rejectClose) => {
|
|
275
|
+
runtime.setOnRegistryChanged(null);
|
|
276
|
+
server.close((error) => {
|
|
277
|
+
if (error) {
|
|
278
|
+
rejectClose(error);
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
try {
|
|
282
|
+
unregisterService(process.pid);
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
// best effort
|
|
286
|
+
}
|
|
287
|
+
try {
|
|
288
|
+
// Clear connection record only if it still points at us.
|
|
289
|
+
const current = readActiveConnection();
|
|
290
|
+
if (current?.url === url)
|
|
291
|
+
clearConnection();
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
// best effort
|
|
295
|
+
}
|
|
296
|
+
resolveClose();
|
|
297
|
+
});
|
|
298
|
+
}),
|
|
299
|
+
};
|
|
300
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Central service registry at `~/.interf/services.json`.
|
|
3
3
|
*
|
|
4
|
-
* Every running `interf
|
|
4
|
+
* Every running `interf runtime` instance writes an entry here on start and
|
|
5
5
|
* removes it on close. CLI/UX code consults this registry for explicit
|
|
6
|
-
* `interf
|
|
6
|
+
* `interf runtime stop` lookup.
|
|
7
7
|
*
|
|
8
8
|
* Entry shape:
|
|
9
9
|
* {
|
|
@@ -11,11 +11,11 @@
|
|
|
11
11
|
* }
|
|
12
12
|
*
|
|
13
13
|
* Atomic write: write to a sibling tmp file, then rename. Concurrent
|
|
14
|
-
* `interf
|
|
14
|
+
* `interf runtime` invocations get last-writer-wins semantics; pruning of
|
|
15
15
|
* stale entries makes that self-healing.
|
|
16
16
|
*/
|
|
17
|
-
import { interfHomeRoot, serviceRegistryPath } from "
|
|
18
|
-
import { type ServiceRegistryEntry } from "
|
|
17
|
+
import { interfHomeRoot, serviceRegistryPath } from "../../contracts/lib/project-paths.js";
|
|
18
|
+
import { type ServiceRegistryEntry } from "../schemas/index.js";
|
|
19
19
|
/**
|
|
20
20
|
* Read the service registry. Removes entries whose pid is no longer alive
|
|
21
21
|
* before returning. Does not health-check the HTTP endpoint — that is too
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Central service registry at `~/.interf/services.json`.
|
|
3
3
|
*
|
|
4
|
-
* Every running `interf
|
|
4
|
+
* Every running `interf runtime` instance writes an entry here on start and
|
|
5
5
|
* removes it on close. CLI/UX code consults this registry for explicit
|
|
6
|
-
* `interf
|
|
6
|
+
* `interf runtime stop` lookup.
|
|
7
7
|
*
|
|
8
8
|
* Entry shape:
|
|
9
9
|
* {
|
|
@@ -11,13 +11,13 @@
|
|
|
11
11
|
* }
|
|
12
12
|
*
|
|
13
13
|
* Atomic write: write to a sibling tmp file, then rename. Concurrent
|
|
14
|
-
* `interf
|
|
14
|
+
* `interf runtime` invocations get last-writer-wins semantics; pruning of
|
|
15
15
|
* stale entries makes that self-healing.
|
|
16
16
|
*/
|
|
17
17
|
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync, } from "node:fs";
|
|
18
18
|
import { dirname } from "node:path";
|
|
19
|
-
import { interfHomeRoot, serviceRegistryPath, } from "
|
|
20
|
-
import { ServiceRegistrySchema, ServiceRegistryEntrySchema, } from "
|
|
19
|
+
import { interfHomeRoot, serviceRegistryPath, } from "../../contracts/lib/project-paths.js";
|
|
20
|
+
import { ServiceRegistrySchema, ServiceRegistryEntrySchema, } from "../schemas/index.js";
|
|
21
21
|
/** Returns true when the OS still has a process with this pid. */
|
|
22
22
|
function isProcessAlive(pid) {
|
|
23
23
|
if (!Number.isInteger(pid) || pid <= 0)
|
|
@@ -54,10 +54,10 @@ function readRegistryRaw() {
|
|
|
54
54
|
function writeRegistryRaw(registry) {
|
|
55
55
|
const path = serviceRegistryPath();
|
|
56
56
|
const dir = dirname(path);
|
|
57
|
-
mkdirSync(dir, { recursive: true });
|
|
57
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
58
58
|
const tmpPath = `${path}.${process.pid}.${Date.now()}.tmp`;
|
|
59
59
|
const parsed = ServiceRegistrySchema.parse(registry);
|
|
60
|
-
writeFileSync(tmpPath, `${JSON.stringify(parsed, null, 2)}\n
|
|
60
|
+
writeFileSync(tmpPath, `${JSON.stringify(parsed, null, 2)}\n`, { mode: 0o600 });
|
|
61
61
|
try {
|
|
62
62
|
renameSync(tmpPath, path);
|
|
63
63
|
}
|