@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,3 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { LocalServiceRuntime } from "../runtime.js";
|
|
3
|
+
export declare function tryHandleActionProposals(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, path: string, method: string): Promise<boolean>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { LOCAL_SERVICE_ROUTES } from "./routes.js";
|
|
2
|
+
import { decodeOr400, readJsonBody, sendError, sendJson, } from "./server-helpers.js";
|
|
3
|
+
import { listStoredProjects } from "../project-store.js";
|
|
4
|
+
export async function tryHandleActionProposals(req, res, runtime, path, method) {
|
|
5
|
+
if (method === "GET" && path === LOCAL_SERVICE_ROUTES.actionProposals) {
|
|
6
|
+
const firstProject = listStoredProjects()[0];
|
|
7
|
+
sendJson(res, 200, {
|
|
8
|
+
action_proposals: runtime.listActionProposals(firstProject?.projectDataDir ?? runtime.rootPath),
|
|
9
|
+
});
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
if (method === "POST" && path === LOCAL_SERVICE_ROUTES.actionProposals) {
|
|
13
|
+
const body = await readJsonBody(req);
|
|
14
|
+
const firstProject = listStoredProjects()[0];
|
|
15
|
+
sendJson(res, 202, await runtime.createActionProposal(firstProject?.projectDataDir ?? runtime.rootPath, body));
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
const actionProposalMatch = path.match(/^\/v1\/action-proposals\/([^/]+)(?:\/([^/]+))?$/);
|
|
19
|
+
if (actionProposalMatch?.[1]) {
|
|
20
|
+
const proposalId = decodeOr400(res, actionProposalMatch[1], "Action proposal id");
|
|
21
|
+
if (proposalId === null)
|
|
22
|
+
return true;
|
|
23
|
+
const child = actionProposalMatch[2];
|
|
24
|
+
const firstProject = listStoredProjects()[0];
|
|
25
|
+
const projectDataDir = firstProject?.projectDataDir ?? runtime.rootPath;
|
|
26
|
+
if (method === "GET" && !child) {
|
|
27
|
+
const proposal = runtime.getActionProposal(projectDataDir, proposalId);
|
|
28
|
+
if (!proposal)
|
|
29
|
+
sendError(res, 404, "Action proposal not found.");
|
|
30
|
+
else
|
|
31
|
+
sendJson(res, 200, proposal);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
if (method === "POST" && child === "decision") {
|
|
35
|
+
const body = await readJsonBody(req);
|
|
36
|
+
const proposal = await runtime.decideActionProposal(projectDataDir, proposalId, body);
|
|
37
|
+
if (!proposal)
|
|
38
|
+
sendError(res, 404, "Action proposal not found.");
|
|
39
|
+
else
|
|
40
|
+
sendJson(res, 202, proposal);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { LocalServiceRuntime } from "../runtime.js";
|
|
3
|
+
export declare function tryHandleExecutor(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, path: string, method: string): Promise<boolean>;
|
|
4
|
+
export declare function tryHandleAgents(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, path: string, method: string): Promise<boolean>;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { AgentPrefsPatchSchema, AgentRoleMapPatchSchema, CustomAgentRegisterRequestSchema, InterfMcpHandoffSchema, } from "../schemas/index.js";
|
|
3
|
+
import { buildInterfMcpHandoff } from "../agent-handoff.js";
|
|
4
|
+
import { buildLocalServiceUrl, LOCAL_SERVICE_ROUTES } from "./routes.js";
|
|
5
|
+
import { decodeOr400, readJsonBody, sendError, sendJson, } from "./server-helpers.js";
|
|
6
|
+
import { packageRoot } from "./server-api-files.js";
|
|
7
|
+
export async function tryHandleExecutor(req, res, runtime, path, method) {
|
|
8
|
+
if (method === "GET" && path === LOCAL_SERVICE_ROUTES.executor) {
|
|
9
|
+
sendJson(res, 200, runtime.getExecutorStatus());
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
if (method === "POST" && path === LOCAL_SERVICE_ROUTES.executor) {
|
|
13
|
+
const body = await readJsonBody(req);
|
|
14
|
+
sendJson(res, 202, runtime.selectExecutor(body));
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
export async function tryHandleAgents(req, res, runtime, path, method) {
|
|
20
|
+
if (path === LOCAL_SERVICE_ROUTES.agents) {
|
|
21
|
+
if (method === "GET") {
|
|
22
|
+
sendJson(res, 200, runtime.getAgentsRegistry());
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
if (method === "POST") {
|
|
26
|
+
try {
|
|
27
|
+
const body = CustomAgentRegisterRequestSchema.parse(await readJsonBody(req));
|
|
28
|
+
const updated = runtime.registerCustomAgent(body);
|
|
29
|
+
sendJson(res, 201, updated);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (method === "GET" && path === `${LOCAL_SERVICE_ROUTES.agents}/roles`) {
|
|
38
|
+
sendJson(res, 200, {
|
|
39
|
+
kind: "interf-canonical-roles",
|
|
40
|
+
version: 1,
|
|
41
|
+
roles: ["extractor", "summarizer", "structurer", "verifier", "general"],
|
|
42
|
+
});
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
if (method === "GET" && path === `${LOCAL_SERVICE_ROUTES.mcp}/connect`) {
|
|
46
|
+
const serviceUrl = buildLocalServiceUrl({ host: runtime.host, port: runtime.port });
|
|
47
|
+
const skillPath = join(packageRoot(), "public-repo", "skills", "interf", "SKILL.md");
|
|
48
|
+
const mcpBinPath = join(packageRoot(), "dist", "bin-mcp.js");
|
|
49
|
+
const mcpArgs = [mcpBinPath, "--profile", "app", "--url", serviceUrl];
|
|
50
|
+
if (runtime.authToken) {
|
|
51
|
+
mcpArgs.push("--token", runtime.authToken);
|
|
52
|
+
}
|
|
53
|
+
sendJson(res, 200, InterfMcpHandoffSchema.parse(buildInterfMcpHandoff({
|
|
54
|
+
serviceUrl,
|
|
55
|
+
authToken: runtime.authToken,
|
|
56
|
+
skillPath,
|
|
57
|
+
mcpCommand: process.execPath,
|
|
58
|
+
mcpArgs,
|
|
59
|
+
})));
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
if (path === `${LOCAL_SERVICE_ROUTES.agents}/role-map`) {
|
|
63
|
+
if (method === "GET") {
|
|
64
|
+
const registry = runtime.getAgentsRegistry();
|
|
65
|
+
sendJson(res, 200, {
|
|
66
|
+
role_map: registry.role_map,
|
|
67
|
+
active_agent: registry.active_agent,
|
|
68
|
+
});
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
if (method === "PATCH") {
|
|
72
|
+
try {
|
|
73
|
+
const patch = AgentRoleMapPatchSchema.parse(await readJsonBody(req));
|
|
74
|
+
const updated = runtime.patchAgentsRoleMap(patch);
|
|
75
|
+
sendJson(res, 200, updated);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
79
|
+
}
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// /v1/agents/<name> — DELETE removes a custom agent (built-in names
|
|
84
|
+
// return 400). PATCH updates the agent's stored prefs (env vars, model,
|
|
85
|
+
// effort) for built-ins or custom agents alike.
|
|
86
|
+
const agentMatch = path.match(/^\/v1\/agents\/([^/]+)$/);
|
|
87
|
+
if (agentMatch?.[1] && method === "DELETE") {
|
|
88
|
+
const name = decodeOr400(res, agentMatch[1], "Agent name");
|
|
89
|
+
if (name === null)
|
|
90
|
+
return true;
|
|
91
|
+
try {
|
|
92
|
+
const updated = runtime.unregisterCustomAgent(name);
|
|
93
|
+
sendJson(res, 200, updated);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
97
|
+
const status = /built-in agent/.test(message) ? 400 : 404;
|
|
98
|
+
sendError(res, status, message);
|
|
99
|
+
}
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
if (agentMatch?.[1] && method === "PATCH") {
|
|
103
|
+
const name = decodeOr400(res, agentMatch[1], "Agent name");
|
|
104
|
+
if (name === null)
|
|
105
|
+
return true;
|
|
106
|
+
try {
|
|
107
|
+
const body = AgentPrefsPatchSchema.parse(await readJsonBody(req));
|
|
108
|
+
// Normalize the validated patch into the stored prefs shape, preserving
|
|
109
|
+
// the prior wire tolerance: an empty env_vars map is omitted, and a `""`
|
|
110
|
+
// or `null` model/effort clears that pref.
|
|
111
|
+
const prefs = {};
|
|
112
|
+
if ("env_vars" in body) {
|
|
113
|
+
const value = body.env_vars;
|
|
114
|
+
if (value && Object.keys(value).length > 0)
|
|
115
|
+
prefs.env_vars = value;
|
|
116
|
+
}
|
|
117
|
+
if ("model" in body) {
|
|
118
|
+
prefs.model = body.model === "" ? null : body.model ?? null;
|
|
119
|
+
}
|
|
120
|
+
if ("effort" in body) {
|
|
121
|
+
prefs.effort = body.effort === "" ? null : body.effort ?? null;
|
|
122
|
+
}
|
|
123
|
+
const updated = runtime.setAgentPrefs(name, prefs);
|
|
124
|
+
sendJson(res, 200, updated);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
128
|
+
}
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth routes for the desktop shell.
|
|
3
|
+
*
|
|
4
|
+
* The CLI's `interf auth login` command runs the loopback PKCE flow
|
|
5
|
+
* in-process and writes the session itself. The desktop app cannot do
|
|
6
|
+
* that — it is a Zero Native (Zig + WKWebView) binary with no Node
|
|
7
|
+
* runtime — so it asks the engine to run the same flow on its behalf
|
|
8
|
+
* and waits for the result.
|
|
9
|
+
*
|
|
10
|
+
* The flow is identical to the CLI path:
|
|
11
|
+
*
|
|
12
|
+
* 1. Engine binds a fresh loopback HTTP server on 127.0.0.1.
|
|
13
|
+
* 2. Engine asks WorkOS for a PKCE authorize URL bound to that
|
|
14
|
+
* callback URL and opens the user's system browser at it.
|
|
15
|
+
* 3. User completes AuthKit; AuthKit redirects to the loopback
|
|
16
|
+
* server with `?code=...&state=...`.
|
|
17
|
+
* 4. Engine exchanges the code for tokens, writes the refresh token
|
|
18
|
+
* to the keychain, writes `~/.interf/auth/session.json`, and
|
|
19
|
+
* updates `runtime.currentAccount` so any subsequent `/v1/me` GET
|
|
20
|
+
* reflects the new identity without an engine restart.
|
|
21
|
+
*
|
|
22
|
+
* The POST that triggers all this is long-running by design — the
|
|
23
|
+
* response is sent only after AuthKit has roundtripped. The UI calls
|
|
24
|
+
* it with a generous timeout and shows a spinner.
|
|
25
|
+
*
|
|
26
|
+
* `interf://` URL scheme handling is intentionally NOT used here. The
|
|
27
|
+
* loopback flow is platform-agnostic and reuses the CLI's well-tested
|
|
28
|
+
* orchestration; the deep-link path adds an Info.plist /
|
|
29
|
+
* NSAppleEventManager hop that zero-native 0.1.9 does not register.
|
|
30
|
+
*/
|
|
31
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
32
|
+
import type { LocalServiceRuntime } from "../runtime.js";
|
|
33
|
+
export declare function tryHandleAuth(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, path: string, method: string): Promise<boolean>;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth routes for the desktop shell.
|
|
3
|
+
*
|
|
4
|
+
* The CLI's `interf auth login` command runs the loopback PKCE flow
|
|
5
|
+
* in-process and writes the session itself. The desktop app cannot do
|
|
6
|
+
* that — it is a Zero Native (Zig + WKWebView) binary with no Node
|
|
7
|
+
* runtime — so it asks the engine to run the same flow on its behalf
|
|
8
|
+
* and waits for the result.
|
|
9
|
+
*
|
|
10
|
+
* The flow is identical to the CLI path:
|
|
11
|
+
*
|
|
12
|
+
* 1. Engine binds a fresh loopback HTTP server on 127.0.0.1.
|
|
13
|
+
* 2. Engine asks WorkOS for a PKCE authorize URL bound to that
|
|
14
|
+
* callback URL and opens the user's system browser at it.
|
|
15
|
+
* 3. User completes AuthKit; AuthKit redirects to the loopback
|
|
16
|
+
* server with `?code=...&state=...`.
|
|
17
|
+
* 4. Engine exchanges the code for tokens, writes the refresh token
|
|
18
|
+
* to the keychain, writes `~/.interf/auth/session.json`, and
|
|
19
|
+
* updates `runtime.currentAccount` so any subsequent `/v1/me` GET
|
|
20
|
+
* reflects the new identity without an engine restart.
|
|
21
|
+
*
|
|
22
|
+
* The POST that triggers all this is long-running by design — the
|
|
23
|
+
* response is sent only after AuthKit has roundtripped. The UI calls
|
|
24
|
+
* it with a generous timeout and shows a spinner.
|
|
25
|
+
*
|
|
26
|
+
* `interf://` URL scheme handling is intentionally NOT used here. The
|
|
27
|
+
* loopback flow is platform-agnostic and reuses the CLI's well-tested
|
|
28
|
+
* orchestration; the deep-link path adds an Info.plist /
|
|
29
|
+
* NSAppleEventManager hop that zero-native 0.1.9 does not register.
|
|
30
|
+
*/
|
|
31
|
+
import { AuthFlowError, defaultPkceTransport, runPkceFlow, } from "../auth/auth-flow.js";
|
|
32
|
+
import { entitlementsForPlan } from "../auth/account-context.js";
|
|
33
|
+
import { deleteRefreshToken, setRefreshToken, } from "../auth/keychain.js";
|
|
34
|
+
import { clearSession, writeSession, } from "../auth/session-store.js";
|
|
35
|
+
import { WorkOSConfigError } from "../auth/workos-client.js";
|
|
36
|
+
import { LOCAL_SERVICE_ROUTES } from "./routes.js";
|
|
37
|
+
import { readJsonBody, sendError, sendErrorResponse, sendJson, } from "./server-helpers.js";
|
|
38
|
+
const AUTH_LOGIN_PATH = `${LOCAL_SERVICE_ROUTES.auth}/login`;
|
|
39
|
+
const AUTH_LOGOUT_PATH = `${LOCAL_SERVICE_ROUTES.auth}/logout`;
|
|
40
|
+
export async function tryHandleAuth(req, res, runtime, path, method) {
|
|
41
|
+
if (method !== "POST")
|
|
42
|
+
return false;
|
|
43
|
+
if (path === AUTH_LOGIN_PATH) {
|
|
44
|
+
await handleLogin(req, res, runtime);
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
if (path === AUTH_LOGOUT_PATH) {
|
|
48
|
+
await handleLogout(req, res, runtime);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
async function handleLogin(req, res, runtime) {
|
|
54
|
+
let body = {};
|
|
55
|
+
try {
|
|
56
|
+
const raw = await readJsonBody(req);
|
|
57
|
+
if (raw && typeof raw === "object")
|
|
58
|
+
body = raw;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Empty/invalid body is fine — login takes no required input.
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const result = await runPkceFlow(defaultPkceTransport(), {
|
|
65
|
+
autoOpenBrowser: body.open_browser ?? true,
|
|
66
|
+
...(body.login_hint ? { loginHint: body.login_hint } : {}),
|
|
67
|
+
});
|
|
68
|
+
try {
|
|
69
|
+
await setRefreshToken(result.user.id, result.refreshToken);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Keychain failure is non-fatal — the session still works for
|
|
73
|
+
// the current process. The user will be prompted again after
|
|
74
|
+
// the next engine restart.
|
|
75
|
+
}
|
|
76
|
+
const refreshedAt = new Date().toISOString();
|
|
77
|
+
const plan = "free";
|
|
78
|
+
const displayName = [result.user.firstName, result.user.lastName]
|
|
79
|
+
.filter((part) => typeof part === "string" && part.length > 0)
|
|
80
|
+
.join(" ") || null;
|
|
81
|
+
const account = {
|
|
82
|
+
user_id: result.user.id,
|
|
83
|
+
email: result.user.email,
|
|
84
|
+
display_name: displayName,
|
|
85
|
+
plan,
|
|
86
|
+
entitlements: entitlementsForPlan(plan),
|
|
87
|
+
refreshed_at: refreshedAt,
|
|
88
|
+
};
|
|
89
|
+
writeSession(account);
|
|
90
|
+
runtime.currentAccount = account;
|
|
91
|
+
sendJson(res, 200, {
|
|
92
|
+
kind: "interf-auth-login",
|
|
93
|
+
version: 1,
|
|
94
|
+
account: {
|
|
95
|
+
user_id: account.user_id,
|
|
96
|
+
email: account.email,
|
|
97
|
+
display_name: account.display_name,
|
|
98
|
+
plan: account.plan,
|
|
99
|
+
entitlements: {
|
|
100
|
+
max_active_projects: Number.isFinite(account.entitlements.max_active_projects)
|
|
101
|
+
? account.entitlements.max_active_projects
|
|
102
|
+
: null,
|
|
103
|
+
pro_features: account.entitlements.pro_features,
|
|
104
|
+
},
|
|
105
|
+
refreshed_at: account.refreshed_at,
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
if (error instanceof WorkOSConfigError) {
|
|
111
|
+
sendError(res, 503, error.message);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (error instanceof AuthFlowError) {
|
|
115
|
+
sendError(res, 400, `Sign-in failed: ${error.message}`);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
sendErrorResponse(res, error, 500);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async function handleLogout(_req, res, runtime) {
|
|
122
|
+
const previous = runtime.currentAccount;
|
|
123
|
+
if (previous) {
|
|
124
|
+
try {
|
|
125
|
+
await deleteRefreshToken(previous.user_id);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Best-effort cleanup; the on-disk session below is the
|
|
129
|
+
// authoritative signal.
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
clearSession();
|
|
133
|
+
runtime.currentAccount = null;
|
|
134
|
+
sendJson(res, 200, {
|
|
135
|
+
kind: "interf-auth-logout",
|
|
136
|
+
version: 1,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { LocalServiceRuntime } from "../runtime.js";
|
|
3
|
+
export declare function tryHandleBuildPlans(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, path: string, method: string): Promise<boolean>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { BuildPlanSaveRequestSchema } from "../schemas/index.js";
|
|
2
|
+
import { LOCAL_SERVICE_ROUTES } from "./routes.js";
|
|
3
|
+
import { decodeOr400, readJsonBody, sendError, sendJson, } from "./server-helpers.js";
|
|
4
|
+
import { isTraversalRelativePath, safeApiFilePath, sendApiFile, } from "./server-api-files.js";
|
|
5
|
+
import { findInstanceBuildPlan, listInstanceBuildPlanRuns, listInstanceBuildPlans, resolveInstanceBuildPlanPackageRoot, } from "./server-instance-helpers.js";
|
|
6
|
+
import { installUserBuildPlan } from "../../build-plans/package/user-build-plans.js";
|
|
7
|
+
export async function tryHandleBuildPlans(req, res, runtime, path, method) {
|
|
8
|
+
if (method === "GET" && path === LOCAL_SERVICE_ROUTES.buildPlans) {
|
|
9
|
+
sendJson(res, 200, { build_plans: listInstanceBuildPlans(runtime) });
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
if (method === "POST" && path === LOCAL_SERVICE_ROUTES.buildPlans) {
|
|
13
|
+
try {
|
|
14
|
+
const body = BuildPlanSaveRequestSchema.parse(await readJsonBody(req));
|
|
15
|
+
const installed = installUserBuildPlan({
|
|
16
|
+
sourceDir: body.source_path,
|
|
17
|
+
id: body.id,
|
|
18
|
+
overwrite: body.overwrite,
|
|
19
|
+
});
|
|
20
|
+
sendJson(res, 201, {
|
|
21
|
+
build_plan_id: installed.id,
|
|
22
|
+
installed: true,
|
|
23
|
+
path: installed.path,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
const buildPlanMatch = path.match(/^\/v1\/build-plans\/([^/]+)$/);
|
|
32
|
+
if (method === "GET" && buildPlanMatch?.[1]) {
|
|
33
|
+
const buildPlanId = decodeOr400(res, buildPlanMatch[1], "Build Plan id");
|
|
34
|
+
if (buildPlanId === null)
|
|
35
|
+
return true;
|
|
36
|
+
const buildPlanResource = findInstanceBuildPlan(runtime, buildPlanId);
|
|
37
|
+
if (!buildPlanResource)
|
|
38
|
+
sendError(res, 404, "Build Plan not found.");
|
|
39
|
+
else
|
|
40
|
+
sendJson(res, 200, buildPlanResource);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
const buildPlanRunsMatch = path.match(/^\/v1\/build-plans\/([^/]+)\/runs$/);
|
|
44
|
+
if (method === "GET" && buildPlanRunsMatch?.[1]) {
|
|
45
|
+
const buildPlanId = decodeOr400(res, buildPlanRunsMatch[1], "Build Plan id");
|
|
46
|
+
if (buildPlanId === null)
|
|
47
|
+
return true;
|
|
48
|
+
const runs = listInstanceBuildPlanRuns(runtime, buildPlanId);
|
|
49
|
+
sendJson(res, 200, { runs });
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
// GET /v1/build-plans/<id>/files/<relpath> — read-only file serving inside
|
|
53
|
+
// the Build Plan package root. Used by the locator pattern's `api-served` kind so
|
|
54
|
+
// the UI can render SKILL.md / contract files in a side drawer over a
|
|
55
|
+
// remote engine. Resolution: project-draft (when first project exists) →
|
|
56
|
+
// user library → built-in. Path-guard rejects any traversal outside
|
|
57
|
+
// the resolved root.
|
|
58
|
+
const buildPlanFilesMatch = path.match(/^\/v1\/build-plans\/([^/]+)\/files\/(.+)$/);
|
|
59
|
+
if (method === "GET" && buildPlanFilesMatch?.[1] && buildPlanFilesMatch[2]) {
|
|
60
|
+
const buildPlanId = decodeOr400(res, buildPlanFilesMatch[1], "Build Plan id");
|
|
61
|
+
if (buildPlanId === null)
|
|
62
|
+
return true;
|
|
63
|
+
const relPath = decodeOr400(res, buildPlanFilesMatch[2], "File path");
|
|
64
|
+
if (relPath === null)
|
|
65
|
+
return true;
|
|
66
|
+
if (isTraversalRelativePath(relPath)) {
|
|
67
|
+
sendError(res, 400, "File path escapes Build Plan root.");
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
const root = resolveInstanceBuildPlanPackageRoot(runtime, buildPlanId);
|
|
71
|
+
if (!root) {
|
|
72
|
+
sendError(res, 404, `Build Plan not found: ${buildPlanId}`);
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
const safePath = safeApiFilePath(root, relPath);
|
|
76
|
+
if (!safePath) {
|
|
77
|
+
sendError(res, 400, "File path escapes Build Plan root.");
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
if (!sendApiFile(res, safePath)) {
|
|
81
|
+
sendError(res, 404, `File not found: ${relPath}`);
|
|
82
|
+
}
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { LocalServiceRuntime } from "../runtime.js";
|
|
3
|
+
export declare function tryHandleDiscovery(_req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, path: string, method: string): boolean;
|
|
4
|
+
export declare function tryHandleOpenPath(req: IncomingMessage, res: ServerResponse, _runtime: LocalServiceRuntime, path: string, method: string): Promise<boolean>;
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { LOCAL_SERVICE_LOOPBACK_HOSTS, LocalServiceDiscoverySchema, OpenPathRequestSchema, } from "../schemas/index.js";
|
|
2
|
+
import { buildLocalServiceUrl, LOCAL_SERVICE_ROUTES, } from "./routes.js";
|
|
3
|
+
import { buildOpenApiDocument } from "./openapi.js";
|
|
4
|
+
import { readJsonBody, sendError, sendJson, } from "./server-helpers.js";
|
|
5
|
+
import { packageRoot, } from "./server-api-files.js";
|
|
6
|
+
import { listStoredProjects } from "../project-store.js";
|
|
7
|
+
import { userBuildPlansRoot } from "../../contracts/lib/project-paths.js";
|
|
8
|
+
import { spawn } from "node:child_process";
|
|
9
|
+
import { existsSync, statSync } from "node:fs";
|
|
10
|
+
import { dirname, resolve } from "node:path";
|
|
11
|
+
import { assertPathWithinRoot } from "../../contracts/utils/path-guards.js";
|
|
12
|
+
export function tryHandleDiscovery(_req, res, runtime, path, method) {
|
|
13
|
+
// GET /health — liveness probe used by the CLI bootstrap.
|
|
14
|
+
if (method === "GET" && path === LOCAL_SERVICE_ROUTES.health) {
|
|
15
|
+
sendJson(res, 200, runtime.health());
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
// GET /v1 — discovery list of available resources.
|
|
19
|
+
if (method === "GET" && path === LOCAL_SERVICE_ROUTES.api) {
|
|
20
|
+
sendJson(res, 200, LocalServiceDiscoverySchema.parse({
|
|
21
|
+
kind: "interf-local-service-discovery",
|
|
22
|
+
version: 1,
|
|
23
|
+
resources: {
|
|
24
|
+
instance: LOCAL_SERVICE_ROUTES.instance,
|
|
25
|
+
projects: LOCAL_SERVICE_ROUTES.projects,
|
|
26
|
+
build_plans: LOCAL_SERVICE_ROUTES.buildPlans,
|
|
27
|
+
runs: LOCAL_SERVICE_ROUTES.runs,
|
|
28
|
+
openapi: LOCAL_SERVICE_ROUTES.openapi,
|
|
29
|
+
action_proposals: LOCAL_SERVICE_ROUTES.actionProposals,
|
|
30
|
+
executor: LOCAL_SERVICE_ROUTES.executor,
|
|
31
|
+
agents: LOCAL_SERVICE_ROUTES.agents,
|
|
32
|
+
me: LOCAL_SERVICE_ROUTES.me,
|
|
33
|
+
open_path: LOCAL_SERVICE_ROUTES.openPath,
|
|
34
|
+
},
|
|
35
|
+
}));
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
// GET /v1/openapi.json — human-readable API contract generated from the
|
|
39
|
+
// same operation registry used by clients and tools.
|
|
40
|
+
if (method === "GET" && path === LOCAL_SERVICE_ROUTES.openapi) {
|
|
41
|
+
sendJson(res, 200, buildOpenApiDocument({
|
|
42
|
+
version: runtime.packageVersion ?? "0.1.0",
|
|
43
|
+
}));
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
// GET /v1/me — current account / session.
|
|
47
|
+
if (method === "GET" && path === LOCAL_SERVICE_ROUTES.me) {
|
|
48
|
+
if (runtime.currentAccount) {
|
|
49
|
+
sendJson(res, 200, {
|
|
50
|
+
kind: "interf-current-account",
|
|
51
|
+
version: 1,
|
|
52
|
+
user_id: runtime.currentAccount.user_id,
|
|
53
|
+
email: runtime.currentAccount.email,
|
|
54
|
+
display_name: runtime.currentAccount.display_name,
|
|
55
|
+
plan: runtime.currentAccount.plan,
|
|
56
|
+
entitlements: {
|
|
57
|
+
max_active_projects: Number.isFinite(runtime.currentAccount.entitlements.max_active_projects)
|
|
58
|
+
? runtime.currentAccount.entitlements.max_active_projects
|
|
59
|
+
: null,
|
|
60
|
+
pro_features: runtime.currentAccount.entitlements.pro_features,
|
|
61
|
+
},
|
|
62
|
+
refreshed_at: runtime.currentAccount.refreshed_at,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
sendJson(res, 200, {
|
|
67
|
+
kind: "interf-current-account",
|
|
68
|
+
version: 1,
|
|
69
|
+
user_id: null,
|
|
70
|
+
email: null,
|
|
71
|
+
display_name: null,
|
|
72
|
+
plan: "anonymous",
|
|
73
|
+
entitlements: {
|
|
74
|
+
max_active_projects: 10,
|
|
75
|
+
pro_features: [],
|
|
76
|
+
},
|
|
77
|
+
refreshed_at: null,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
// GET /v1/instance — local service metadata.
|
|
83
|
+
if (method === "GET" && path === LOCAL_SERVICE_ROUTES.instance) {
|
|
84
|
+
const startedAtIso = runtime.startedAt ?? new Date().toISOString();
|
|
85
|
+
const startedMs = Date.parse(startedAtIso);
|
|
86
|
+
const uptimeSeconds = Number.isFinite(startedMs)
|
|
87
|
+
? Math.max(0, Math.floor((Date.now() - startedMs) / 1000))
|
|
88
|
+
: 0;
|
|
89
|
+
const agentState = runtime.getAgentsRegistry();
|
|
90
|
+
// `connection_kind` lets the UI know whether OS-open is even
|
|
91
|
+
// possible. A loopback bind means the local service has filesystem access
|
|
92
|
+
// to the same host as the user; non-loopback (cloud) returns
|
|
93
|
+
// "remote" so the UI routes to api-served / signed-URL paths
|
|
94
|
+
// instead. The current binary refuses non-loopback binds (see the
|
|
95
|
+
// host whitelist below), so the value is "local" today; the field
|
|
96
|
+
// is in place so the UI can read it without a CLI version sniff.
|
|
97
|
+
const isLoopback = LOCAL_SERVICE_LOOPBACK_HOSTS.includes(runtime.host);
|
|
98
|
+
const health = runtime.health();
|
|
99
|
+
sendJson(res, 200, {
|
|
100
|
+
kind: "interf-instance",
|
|
101
|
+
version: 1,
|
|
102
|
+
url: buildLocalServiceUrl({ host: runtime.host, port: runtime.port }),
|
|
103
|
+
host: runtime.host,
|
|
104
|
+
port: runtime.port,
|
|
105
|
+
pid: process.pid,
|
|
106
|
+
started_at: startedAtIso,
|
|
107
|
+
uptime_seconds: uptimeSeconds,
|
|
108
|
+
package_version: runtime.packageVersion ?? null,
|
|
109
|
+
project_count: listStoredProjects().length,
|
|
110
|
+
active_run_count: health.active_runs,
|
|
111
|
+
idle_for_seconds: health.idle_for_seconds,
|
|
112
|
+
auth_required: Boolean(runtime.authToken),
|
|
113
|
+
owner_kind: runtime.ownerKind,
|
|
114
|
+
...(runtime.ownerPid ? { owner_pid: runtime.ownerPid } : {}),
|
|
115
|
+
// connected-agents fields:
|
|
116
|
+
agent_count: agentState.agents.length,
|
|
117
|
+
default_agent: agentState.active_agent?.name ?? null,
|
|
118
|
+
// connection-mode flag:
|
|
119
|
+
connection_kind: isLoopback ? "local" : "remote",
|
|
120
|
+
});
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
function resolveOpenPath(allowedRoots, pathValue) {
|
|
126
|
+
const roots = allowedRoots.map((root) => resolve(root));
|
|
127
|
+
const targetPath = resolve(pathValue);
|
|
128
|
+
for (const root of roots) {
|
|
129
|
+
try {
|
|
130
|
+
return assertPathWithinRoot(root, targetPath, "Open path");
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
throw new Error(`Open path must stay inside ${roots.join(" or ")}: ${targetPath}`);
|
|
137
|
+
}
|
|
138
|
+
async function openLocalPath(allowedRoots, pathValue) {
|
|
139
|
+
const targetPath = resolveOpenPath(allowedRoots, pathValue);
|
|
140
|
+
if (!existsSync(targetPath)) {
|
|
141
|
+
throw new Error(`Path does not exist: ${targetPath}`);
|
|
142
|
+
}
|
|
143
|
+
if (process.env.INTERF_OPEN_PATH_DRY_RUN === "1") {
|
|
144
|
+
return targetPath;
|
|
145
|
+
}
|
|
146
|
+
const isDirectory = statSync(targetPath).isDirectory();
|
|
147
|
+
const command = process.platform === "darwin"
|
|
148
|
+
? "open"
|
|
149
|
+
: process.platform === "win32"
|
|
150
|
+
? "explorer.exe"
|
|
151
|
+
: "xdg-open";
|
|
152
|
+
const args = process.platform === "darwin"
|
|
153
|
+
? (isDirectory ? [targetPath] : ["-R", targetPath])
|
|
154
|
+
: process.platform === "win32"
|
|
155
|
+
? (isDirectory ? [targetPath] : ["/select,", targetPath])
|
|
156
|
+
: [isDirectory ? targetPath : dirname(targetPath)];
|
|
157
|
+
await new Promise((resolveOpen, rejectOpen) => {
|
|
158
|
+
const child = spawn(command, args, {
|
|
159
|
+
detached: true,
|
|
160
|
+
stdio: "ignore",
|
|
161
|
+
});
|
|
162
|
+
child.once("error", rejectOpen);
|
|
163
|
+
child.once("spawn", () => {
|
|
164
|
+
child.unref();
|
|
165
|
+
resolveOpen();
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
return targetPath;
|
|
169
|
+
}
|
|
170
|
+
export async function tryHandleOpenPath(req, res, _runtime, path, method) {
|
|
171
|
+
if (!(method === "POST" && path === LOCAL_SERVICE_ROUTES.openPath)) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
const body = OpenPathRequestSchema.parse(await readJsonBody(req));
|
|
176
|
+
// Permit opening:
|
|
177
|
+
// - any registered project root or its bound source folder
|
|
178
|
+
// - the user buildPlan library at `~/.interf/build-plans/`
|
|
179
|
+
// - the bundled built-in buildPlan root inside the installed package
|
|
180
|
+
// (so SKILL.md / contract files in `interf-default` open correctly)
|
|
181
|
+
const allowedRoots = [];
|
|
182
|
+
for (const stored of listStoredProjects()) {
|
|
183
|
+
allowedRoots.push(stored.projectDataDir);
|
|
184
|
+
if (stored.source.locator)
|
|
185
|
+
allowedRoots.push(stored.source.locator);
|
|
186
|
+
}
|
|
187
|
+
allowedRoots.push(userBuildPlansRoot());
|
|
188
|
+
allowedRoots.push(packageRoot()); // covers <pkg>/public-repo/build-plans/...
|
|
189
|
+
const openedPath = await openLocalPath(allowedRoots, body.path);
|
|
190
|
+
sendJson(res, 202, { opened: true, path: openedPath });
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
sendError(res, 400, error instanceof Error ? error.message : String(error));
|
|
194
|
+
}
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { LocalServiceRuntime } from "../runtime.js";
|
|
3
|
+
/** Fan a change ping out to every open events stream for this runtime. */
|
|
4
|
+
export declare function notifyServiceChange(runtime: LocalServiceRuntime): void;
|
|
5
|
+
export declare function tryHandleEvents(req: IncomingMessage, res: ServerResponse, runtime: LocalServiceRuntime, path: string, method: string): boolean;
|