@interf/compiler 0.22.2 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +175 -234
- package/dist/bin-mcp.d.ts +2 -0
- package/dist/bin-mcp.js +63 -0
- package/dist/bin-runtime.d.ts +2 -0
- package/dist/bin-runtime.js +111 -0
- package/dist/cli/commands/agents.js +4 -4
- package/dist/cli/commands/auth.d.ts +20 -0
- package/dist/cli/commands/auth.js +161 -0
- package/dist/cli/commands/benchmark.d.ts +10 -0
- package/dist/cli/commands/benchmark.js +88 -0
- package/dist/cli/commands/build-plan.js +95 -103
- package/dist/cli/commands/build.d.ts +1 -1
- package/dist/cli/commands/build.js +16 -15
- package/dist/cli/commands/doctor.js +3 -3
- package/dist/cli/commands/graphs.d.ts +2 -0
- package/dist/cli/commands/graphs.js +199 -0
- package/dist/cli/commands/login.js +4 -6
- package/dist/cli/commands/logout.js +1 -1
- package/dist/cli/commands/mcp.d.ts +3 -2
- package/dist/cli/commands/mcp.js +721 -204
- package/dist/cli/commands/project.d.ts +2 -0
- package/dist/cli/commands/project.js +202 -0
- package/dist/cli/commands/reset.d.ts +1 -1
- package/dist/cli/commands/reset.js +10 -10
- package/dist/cli/commands/runs.js +52 -26
- package/dist/cli/commands/runtime.d.ts +24 -0
- package/dist/cli/commands/runtime.js +373 -0
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.js +33 -22
- package/dist/cli/commands/traces.d.ts +2 -0
- package/dist/cli/commands/traces.js +125 -0
- package/dist/cli/commands/wizard.js +155 -150
- package/dist/cli/index.d.ts +7 -4
- package/dist/cli/index.js +13 -7
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/packages/build-plans/authoring/brief.d.ts +517 -0
- package/dist/packages/build-plans/authoring/brief.js +89 -0
- package/dist/packages/build-plans/authoring/build-plan-authoring.d.ts +10 -10
- package/dist/packages/build-plans/authoring/build-plan-authoring.js +66 -26
- package/dist/packages/build-plans/authoring/build-plan-edit-session.d.ts +1 -1
- package/dist/packages/build-plans/authoring/build-plan-edit-session.js +8 -2
- package/dist/packages/build-plans/authoring/build-plan-improvement.d.ts +9 -6
- package/dist/packages/build-plans/authoring/build-plan-improvement.js +39 -42
- package/dist/packages/build-plans/authoring/lib/build-plan-edit-utils.js +7 -7
- package/dist/packages/build-plans/build-plan-resolution.d.ts +1 -1
- package/dist/packages/build-plans/build-plan-resolution.js +3 -3
- package/dist/packages/build-plans/index.d.ts +1 -1
- package/dist/packages/build-plans/index.js +1 -1
- package/dist/packages/build-plans/package/build-plan-definitions.d.ts +14 -12
- package/dist/packages/build-plans/package/build-plan-definitions.js +40 -39
- package/dist/packages/build-plans/package/build-plan-helpers.d.ts +3 -2
- package/dist/packages/build-plans/package/build-plan-helpers.js +27 -13
- package/dist/packages/build-plans/package/build-plan-review-paths.d.ts +5 -5
- package/dist/packages/build-plans/package/build-plan-review-paths.js +15 -15
- package/dist/packages/build-plans/package/build-plan-stage-runner.d.ts +4 -4
- package/dist/packages/build-plans/package/build-plan-stage-runner.js +22 -11
- package/dist/packages/build-plans/package/builtin-build-plan.d.ts +5 -6
- package/dist/packages/build-plans/package/builtin-build-plan.js +7 -8
- package/dist/packages/build-plans/package/context-interface.d.ts +11 -9
- package/dist/packages/build-plans/package/context-interface.js +14 -33
- package/dist/packages/build-plans/package/interf-build-plan-package.d.ts +6 -17
- package/dist/packages/build-plans/package/interf-build-plan-package.js +56 -52
- package/dist/packages/build-plans/package/local-build-plans.d.ts +12 -10
- package/dist/packages/build-plans/package/local-build-plans.js +56 -31
- package/dist/packages/build-plans/package/user-build-plans.js +1 -1
- package/dist/packages/contracts/index.d.ts +4 -2
- package/dist/packages/contracts/index.js +2 -1
- package/dist/packages/contracts/lib/project-paths.d.ts +137 -0
- package/dist/packages/contracts/lib/project-paths.js +211 -0
- package/dist/packages/contracts/lib/project-schema.d.ts +160 -0
- package/dist/packages/contracts/lib/project-schema.js +113 -0
- package/dist/packages/contracts/lib/schema.d.ts +739 -80
- package/dist/packages/contracts/lib/schema.js +410 -75
- package/dist/packages/contracts/utils/parse.js +67 -0
- package/dist/packages/projects/index.d.ts +6 -0
- package/dist/packages/{project → projects}/index.js +0 -3
- package/dist/packages/{project → projects}/interf-detect.d.ts +12 -12
- package/dist/packages/{project → projects}/interf-detect.js +56 -50
- package/dist/packages/projects/interf.d.ts +2 -0
- package/dist/packages/projects/interf.js +1 -0
- package/dist/packages/projects/lib/schema.d.ts +79 -0
- package/dist/packages/projects/lib/schema.js +89 -0
- package/dist/packages/projects/source-config.d.ts +58 -0
- package/dist/packages/projects/source-config.js +352 -0
- package/dist/packages/projects/source-folders.d.ts +11 -0
- package/dist/packages/{project → projects}/source-folders.js +26 -26
- package/dist/packages/{engine → runtime}/action-planner.d.ts +1 -1
- package/dist/packages/{engine → runtime}/action-planner.js +20 -22
- package/dist/packages/runtime/action-values.d.ts +1 -0
- package/dist/packages/runtime/action-values.js +1 -0
- package/dist/packages/runtime/actions/errors.d.ts +2 -0
- package/dist/packages/runtime/actions/errors.js +12 -0
- package/dist/packages/runtime/actions/fields.d.ts +82 -0
- package/dist/packages/runtime/actions/form-builders.d.ts +14 -0
- package/dist/packages/runtime/actions/form-builders.js +619 -0
- package/dist/packages/runtime/actions/form-validators.d.ts +8 -0
- package/dist/packages/runtime/actions/form-validators.js +128 -0
- package/dist/packages/runtime/actions/helpers.d.ts +11 -0
- package/dist/packages/runtime/actions/helpers.js +80 -0
- package/dist/packages/runtime/actions/index.d.ts +8 -0
- package/dist/packages/runtime/actions/index.js +11 -0
- package/dist/packages/runtime/actions/registry.d.ts +64 -0
- package/dist/packages/runtime/actions/registry.js +62 -0
- package/dist/packages/runtime/actions/requests.d.ts +45 -0
- package/dist/packages/runtime/actions/requests.js +158 -0
- package/dist/packages/runtime/actions/schemas.d.ts +154 -0
- package/dist/packages/runtime/actions/schemas.js +36 -0
- package/dist/packages/runtime/agent-handoff.d.ts +11 -0
- package/dist/packages/runtime/agent-handoff.js +101 -0
- package/dist/packages/{engine → runtime}/agents/index.d.ts +1 -2
- package/dist/packages/{engine → runtime}/agents/index.js +1 -2
- package/dist/packages/runtime/agents/lib/args.d.ts +14 -0
- package/dist/packages/runtime/agents/lib/args.js +24 -0
- package/dist/packages/{engine → runtime}/agents/lib/constants.d.ts +4 -1
- package/dist/packages/runtime/agents/lib/constants.js +13 -0
- package/dist/packages/runtime/agents/lib/context-graph-bootstrap.d.ts +3 -0
- package/dist/packages/{engine/agents/lib/verifiable-context-bootstrap.js → runtime/agents/lib/context-graph-bootstrap.js} +5 -6
- package/dist/packages/{engine → runtime}/agents/lib/detection.d.ts +5 -0
- package/dist/packages/{engine → runtime}/agents/lib/detection.js +16 -7
- package/dist/packages/{engine → runtime}/agents/lib/execution-profile.js +8 -14
- package/dist/packages/{engine → runtime}/agents/lib/execution.js +14 -4
- package/dist/packages/{engine → runtime}/agents/lib/preflight.js +15 -13
- package/dist/packages/{engine → runtime}/agents/lib/render.js +4 -4
- package/dist/packages/runtime/agents/lib/shell-fs.d.ts +18 -0
- package/dist/packages/runtime/agents/lib/shell-fs.js +190 -0
- package/dist/packages/runtime/agents/lib/shell-paths.d.ts +16 -0
- package/dist/packages/runtime/agents/lib/shell-paths.js +63 -0
- package/dist/packages/runtime/agents/lib/shell-projection.d.ts +25 -0
- package/dist/packages/runtime/agents/lib/shell-projection.js +314 -0
- package/dist/packages/runtime/agents/lib/shell-templates.d.ts +30 -0
- package/dist/packages/runtime/agents/lib/shell-templates.js +452 -0
- package/dist/packages/runtime/agents/lib/shell-workspace.d.ts +17 -0
- package/dist/packages/runtime/agents/lib/shell-workspace.js +70 -0
- package/dist/packages/runtime/agents/lib/shells.d.ts +63 -0
- package/dist/packages/runtime/agents/lib/shells.js +383 -0
- package/dist/packages/{engine → runtime}/agents/lib/user-config.d.ts +8 -2
- package/dist/packages/{engine → runtime}/agents/lib/user-config.js +8 -2
- package/dist/packages/runtime/agents/providers/claude-code.d.ts +13 -0
- package/dist/packages/runtime/agents/providers/claude-code.js +45 -0
- package/dist/packages/runtime/agents/providers/codex.d.ts +17 -0
- package/dist/packages/runtime/agents/providers/codex.js +64 -0
- package/dist/packages/runtime/agents/providers/cursor.d.ts +9 -0
- package/dist/packages/runtime/agents/providers/cursor.js +24 -0
- package/dist/packages/runtime/agents/providers/index.d.ts +9 -0
- package/dist/packages/runtime/agents/providers/index.js +31 -0
- package/dist/packages/runtime/agents/providers/types.d.ts +50 -0
- package/dist/packages/{engine → runtime}/agents/registry.d.ts +13 -2
- package/dist/packages/{engine → runtime}/agents/registry.js +48 -10
- package/dist/packages/{engine → runtime}/agents/role-executors.d.ts +1 -1
- package/dist/packages/{engine → runtime}/agents/role-executors.js +7 -6
- package/dist/packages/{engine → runtime}/agents/role-router.js +7 -5
- package/dist/packages/runtime/auth/account-context.d.ts +52 -0
- package/dist/packages/runtime/auth/account-context.js +68 -0
- package/dist/packages/runtime/auth/auth-flow.d.ts +73 -0
- package/dist/packages/runtime/auth/auth-flow.js +189 -0
- package/dist/packages/runtime/auth/jwt-validator.d.ts +58 -0
- package/dist/packages/runtime/auth/jwt-validator.js +86 -0
- package/dist/packages/runtime/auth/keychain.d.ts +35 -0
- package/dist/packages/runtime/auth/keychain.js +85 -0
- package/dist/packages/runtime/auth/session-store.d.ts +38 -0
- package/dist/packages/runtime/auth/session-store.js +88 -0
- package/dist/packages/runtime/auth/workos-client.d.ts +58 -0
- package/dist/packages/runtime/auth/workos-client.js +87 -0
- package/dist/packages/runtime/benchmark-question-draft.d.ts +20 -0
- package/dist/packages/runtime/benchmark-question-draft.js +124 -0
- package/dist/packages/runtime/build/artifact-counts.d.ts +1 -0
- package/dist/packages/{engine → runtime}/build/artifact-counts.js +5 -9
- package/dist/packages/{engine → runtime}/build/artifact-status.d.ts +5 -5
- package/dist/packages/{engine → runtime}/build/artifact-status.js +25 -23
- package/dist/packages/runtime/build/atomic-fs.d.ts +3 -0
- package/dist/packages/runtime/build/atomic-fs.js +95 -0
- package/dist/packages/runtime/build/billing-events.d.ts +78 -0
- package/dist/packages/{engine → runtime}/build/billing-events.js +17 -19
- package/dist/packages/runtime/build/build-evidence.d.ts +15 -0
- package/dist/packages/runtime/build/build-evidence.js +173 -0
- package/dist/packages/{engine → runtime}/build/build-pipeline.d.ts +12 -8
- package/dist/packages/runtime/build/build-pipeline.js +304 -0
- package/dist/packages/{engine → runtime}/build/build-plan-primitives.d.ts +1 -1
- package/dist/packages/{engine → runtime}/build/build-plan-primitives.js +0 -1
- package/dist/packages/runtime/build/build-plan-runs.d.ts +14 -0
- package/dist/packages/runtime/build/build-plan-runs.js +31 -0
- package/dist/packages/runtime/build/build-stage-plan.d.ts +16 -0
- package/dist/packages/{engine → runtime}/build/build-stage-plan.js +28 -29
- package/dist/packages/{engine → runtime}/build/build-stage-runner.d.ts +2 -1
- package/dist/packages/runtime/build/build-stage-runner.js +165 -0
- package/dist/packages/{engine → runtime}/build/build-target.d.ts +4 -4
- package/dist/packages/runtime/build/build-target.js +16 -0
- package/dist/packages/{engine → runtime}/build/check-evaluator.d.ts +14 -16
- package/dist/packages/runtime/build/check-evaluator.js +575 -0
- package/dist/packages/runtime/build/context-graph-paths.d.ts +51 -0
- package/dist/packages/runtime/build/context-graph-paths.js +133 -0
- package/dist/packages/runtime/build/context-graph-schema.d.ts +19 -0
- package/dist/packages/runtime/build/context-graph-schema.js +39 -0
- package/dist/packages/{engine → runtime}/build/discovery.d.ts +2 -2
- package/dist/packages/{engine → runtime}/build/discovery.js +4 -4
- package/dist/packages/{engine → runtime}/build/index.d.ts +5 -3
- package/dist/packages/{engine → runtime}/build/index.js +5 -3
- package/dist/packages/{engine → runtime}/build/lib/schema.d.ts +221 -88
- package/dist/packages/{engine → runtime}/build/lib/schema.js +61 -41
- package/dist/packages/runtime/build/reset.d.ts +2 -0
- package/dist/packages/runtime/build/reset.js +62 -0
- package/dist/packages/{engine → runtime}/build/runtime-contracts.js +5 -5
- package/dist/packages/runtime/build/runtime-inventory.d.ts +7 -0
- package/dist/packages/{engine → runtime}/build/runtime-inventory.js +3 -3
- package/dist/packages/{engine → runtime}/build/runtime-paths.js +6 -6
- package/dist/packages/{engine → runtime}/build/runtime-prompt.js +7 -6
- package/dist/packages/{engine → runtime}/build/runtime-reconcile.d.ts +1 -1
- package/dist/packages/{engine → runtime}/build/runtime-reconcile.js +25 -21
- package/dist/packages/runtime/build/runtime-runs.d.ts +10 -0
- package/dist/packages/runtime/build/runtime-runs.js +265 -0
- package/dist/packages/{engine → runtime}/build/runtime-types.d.ts +6 -6
- package/dist/packages/runtime/build/runtime-types.js +1 -0
- package/dist/packages/runtime/build/runtime.d.ts +6 -0
- package/dist/packages/runtime/build/runtime.js +5 -0
- package/dist/packages/runtime/build/source-files.d.ts +58 -0
- package/dist/packages/runtime/build/source-files.js +184 -0
- package/dist/packages/runtime/build/source-inventory.d.ts +27 -0
- package/dist/packages/runtime/build/source-inventory.js +273 -0
- package/dist/packages/runtime/build/source-manifest.d.ts +52 -0
- package/dist/packages/runtime/build/source-manifest.js +192 -0
- package/dist/packages/runtime/build/stage-evidence.d.ts +22 -0
- package/dist/packages/runtime/build/stage-evidence.js +317 -0
- package/dist/packages/runtime/build/stage-reuse.d.ts +11 -0
- package/dist/packages/runtime/build/stage-reuse.js +142 -0
- package/dist/packages/runtime/build/state-artifacts.d.ts +9 -0
- package/dist/packages/runtime/build/state-artifacts.js +14 -0
- package/dist/packages/runtime/build/state-health.d.ts +4 -0
- package/dist/packages/{engine → runtime}/build/state-health.js +21 -26
- package/dist/packages/runtime/build/state-io.d.ts +12 -0
- package/dist/packages/runtime/build/state-io.js +119 -0
- package/dist/packages/{engine → runtime}/build/state-paths.d.ts +3 -1
- package/dist/packages/runtime/build/state-paths.js +22 -0
- package/dist/packages/runtime/build/state-view.d.ts +5 -0
- package/dist/packages/{engine → runtime}/build/state-view.js +60 -33
- package/dist/packages/runtime/build/state.d.ts +7 -0
- package/dist/packages/runtime/build/state.js +12 -0
- package/dist/packages/runtime/build/traces.d.ts +30 -0
- package/dist/packages/runtime/build/traces.js +133 -0
- package/dist/packages/{engine/build/validate-verifiable-context.d.ts → runtime/build/validate-context-graph.d.ts} +6 -6
- package/dist/packages/{engine/build/validate-verifiable-context.js → runtime/build/validate-context-graph.js} +48 -35
- package/dist/packages/{engine → runtime}/build/validate.d.ts +5 -5
- package/dist/packages/{engine → runtime}/build/validate.js +26 -26
- package/dist/packages/{engine → runtime}/client.d.ts +15 -15
- package/dist/packages/{engine → runtime}/client.js +41 -24
- package/dist/packages/{engine → runtime}/connection-config.d.ts +3 -2
- package/dist/packages/{engine → runtime}/connection-config.js +9 -8
- package/dist/packages/runtime/context-checks.d.ts +10 -0
- package/dist/packages/runtime/context-checks.js +114 -0
- package/dist/packages/runtime/context-graph-scaffold.d.ts +9 -0
- package/dist/packages/runtime/context-graph-scaffold.js +134 -0
- package/dist/packages/runtime/entitlement-guard.d.ts +43 -0
- package/dist/packages/runtime/entitlement-guard.js +70 -0
- package/dist/packages/{engine → runtime}/execution/index.d.ts +2 -2
- package/dist/packages/{engine → runtime}/execution/index.js +1 -1
- package/dist/packages/{engine → runtime}/execution/lib/schema.d.ts +270 -192
- package/dist/packages/{engine → runtime}/execution/lib/schema.js +35 -32
- package/dist/packages/runtime/index.d.ts +29 -0
- package/dist/packages/runtime/index.js +21 -0
- package/dist/packages/runtime/instance-paths.d.ts +30 -0
- package/dist/packages/runtime/instance-paths.js +29 -0
- package/dist/packages/{engine → runtime}/native-run-handlers.d.ts +4 -4
- package/dist/packages/{engine → runtime}/native-run-handlers.js +184 -152
- package/dist/packages/runtime/plan-artifact-contract.d.ts +17 -0
- package/dist/packages/runtime/plan-artifact-contract.js +42 -0
- package/dist/packages/runtime/project-entries.d.ts +11 -0
- package/dist/packages/runtime/project-entries.js +49 -0
- package/dist/packages/runtime/project-source-state.d.ts +26 -0
- package/dist/packages/runtime/project-source-state.js +53 -0
- package/dist/packages/runtime/project-store.d.ts +85 -0
- package/dist/packages/runtime/project-store.js +168 -0
- package/dist/packages/runtime/requested-artifacts.d.ts +7 -0
- package/dist/packages/{engine → runtime}/requested-artifacts.js +23 -1
- package/dist/packages/{engine → runtime}/run-observability.d.ts +2 -1
- package/dist/packages/{engine → runtime}/run-observability.js +166 -84
- package/dist/packages/runtime/runtime-action-proposals.d.ts +7 -0
- package/dist/packages/runtime/runtime-action-proposals.js +542 -0
- package/dist/packages/runtime/runtime-build-plans.d.ts +5 -0
- package/dist/packages/runtime/runtime-build-plans.js +131 -0
- package/dist/packages/runtime/runtime-build-runs.d.ts +47 -0
- package/dist/packages/runtime/runtime-build-runs.js +562 -0
- package/dist/packages/runtime/runtime-caches.d.ts +91 -0
- package/dist/packages/{engine → runtime}/runtime-caches.js +77 -49
- package/dist/packages/{engine → runtime}/runtime-event-applier.d.ts +3 -1
- package/dist/packages/{engine → runtime}/runtime-event-applier.js +53 -17
- package/dist/packages/runtime/runtime-executor.d.ts +22 -0
- package/dist/packages/runtime/runtime-executor.js +131 -0
- package/dist/packages/runtime/runtime-jobs.d.ts +13 -0
- package/dist/packages/runtime/runtime-jobs.js +463 -0
- package/dist/packages/runtime/runtime-observability.d.ts +11 -0
- package/dist/packages/runtime/runtime-observability.js +39 -0
- package/dist/packages/{engine → runtime}/runtime-persistence.d.ts +9 -18
- package/dist/packages/{engine → runtime}/runtime-persistence.js +25 -25
- package/dist/packages/runtime/runtime-project-mutations.d.ts +7 -0
- package/dist/packages/runtime/runtime-project-mutations.js +64 -0
- package/dist/packages/runtime/runtime-project-reads.d.ts +15 -0
- package/dist/packages/runtime/runtime-project-reads.js +381 -0
- package/dist/packages/runtime/runtime-proposal-helpers.d.ts +22 -0
- package/dist/packages/runtime/runtime-proposal-helpers.js +223 -0
- package/dist/packages/{engine → runtime}/runtime-resource-builders.d.ts +21 -16
- package/dist/packages/{engine → runtime}/runtime-resource-builders.js +48 -38
- package/dist/packages/runtime/runtime-verify-runs.d.ts +84 -0
- package/dist/packages/runtime/runtime-verify-runs.js +295 -0
- package/dist/packages/runtime/runtime.d.ts +1165 -0
- package/dist/packages/runtime/runtime.js +417 -0
- package/dist/packages/runtime/schemas/actions.d.ts +1182 -0
- package/dist/packages/runtime/schemas/actions.js +117 -0
- package/dist/packages/runtime/schemas/agents.d.ts +76 -0
- package/dist/packages/runtime/schemas/agents.js +41 -0
- package/dist/packages/runtime/schemas/build-plans.d.ts +959 -0
- package/dist/packages/runtime/schemas/build-plans.js +107 -0
- package/dist/packages/runtime/schemas/files.d.ts +567 -0
- package/dist/packages/runtime/schemas/files.js +51 -0
- package/dist/packages/runtime/schemas/index.d.ts +8 -0
- package/dist/packages/runtime/schemas/index.js +12 -0
- package/dist/packages/runtime/schemas/instance.d.ts +141 -0
- package/dist/packages/runtime/schemas/instance.js +143 -0
- package/dist/packages/runtime/schemas/jobs.d.ts +339 -0
- package/dist/packages/runtime/schemas/jobs.js +103 -0
- package/dist/packages/runtime/schemas/projects.d.ts +339 -0
- package/dist/packages/runtime/schemas/projects.js +136 -0
- package/dist/packages/runtime/schemas/runs.d.ts +2676 -0
- package/dist/packages/runtime/schemas/runs.js +98 -0
- package/dist/packages/runtime/service/index.d.ts +3 -0
- package/dist/packages/runtime/service/index.js +3 -0
- package/dist/packages/runtime/service/openapi.d.ts +7 -0
- package/dist/packages/runtime/service/openapi.js +117 -0
- package/dist/packages/runtime/service/operations.d.ts +1490 -0
- package/dist/packages/runtime/service/operations.js +245 -0
- package/dist/packages/runtime/service/routes.d.ts +106 -0
- package/dist/packages/runtime/service/routes.js +120 -0
- package/dist/packages/runtime/service/server-api-files.d.ts +10 -0
- package/dist/packages/runtime/service/server-api-files.js +85 -0
- package/dist/packages/runtime/service/server-app-boot.d.ts +4 -0
- package/dist/packages/runtime/service/server-app-boot.js +46 -0
- package/dist/packages/runtime/service/server-guards.d.ts +63 -0
- package/dist/packages/runtime/service/server-guards.js +181 -0
- package/dist/packages/runtime/service/server-helpers.d.ts +27 -0
- package/dist/packages/runtime/service/server-helpers.js +89 -0
- package/dist/packages/runtime/service/server-instance-helpers.d.ts +30 -0
- package/dist/packages/runtime/service/server-instance-helpers.js +114 -0
- package/dist/packages/runtime/service/server-routes-action-proposals.d.ts +3 -0
- package/dist/packages/runtime/service/server-routes-action-proposals.js +43 -0
- package/dist/packages/runtime/service/server-routes-agents.d.ts +4 -0
- package/dist/packages/runtime/service/server-routes-agents.js +198 -0
- package/dist/packages/runtime/service/server-routes-auth.d.ts +33 -0
- package/dist/packages/runtime/service/server-routes-auth.js +138 -0
- package/dist/packages/runtime/service/server-routes-build-plans.d.ts +3 -0
- package/dist/packages/runtime/service/server-routes-build-plans.js +83 -0
- package/dist/packages/runtime/service/server-routes-discovery.d.ts +4 -0
- package/dist/packages/runtime/service/server-routes-discovery.js +196 -0
- package/dist/packages/runtime/service/server-routes-events.d.ts +5 -0
- package/dist/packages/runtime/service/server-routes-events.js +99 -0
- package/dist/packages/runtime/service/server-routes-project-context.d.ts +9 -0
- package/dist/packages/runtime/service/server-routes-project-context.js +192 -0
- package/dist/packages/runtime/service/server-routes-project-jobs.d.ts +9 -0
- package/dist/packages/runtime/service/server-routes-project-jobs.js +130 -0
- package/dist/packages/runtime/service/server-routes-project-runs.d.ts +14 -0
- package/dist/packages/runtime/service/server-routes-project-runs.js +85 -0
- package/dist/packages/runtime/service/server-routes-projects.d.ts +4 -0
- package/dist/packages/runtime/service/server-routes-projects.js +92 -0
- package/dist/packages/runtime/service/server-routes-runs.d.ts +3 -0
- package/dist/packages/runtime/service/server-routes-runs.js +112 -0
- package/dist/packages/runtime/service/server.d.ts +37 -0
- package/dist/packages/runtime/service/server.js +300 -0
- package/dist/packages/{engine → runtime/service}/service-registry.d.ts +5 -5
- package/dist/packages/{engine → runtime/service}/service-registry.js +7 -7
- package/dist/packages/runtime/verify/benchmark-run.d.ts +81 -0
- package/dist/packages/runtime/verify/benchmark-run.js +303 -0
- package/dist/packages/{engine → runtime}/verify/index.d.ts +2 -2
- package/dist/packages/{engine → runtime}/verify/index.js +1 -1
- package/dist/packages/{engine → runtime}/verify/lib/schema.d.ts +83 -16
- package/dist/packages/{engine → runtime}/verify/lib/schema.js +26 -18
- package/dist/packages/{engine → runtime}/verify/verify-execution.js +11 -11
- package/dist/packages/{engine → runtime}/verify/verify-paths.d.ts +4 -4
- package/dist/packages/runtime/verify/verify-paths.js +61 -0
- package/dist/packages/{engine → runtime}/verify/verify-sandbox.d.ts +1 -1
- package/dist/packages/runtime/verify/verify-sandbox.js +88 -0
- package/dist/packages/{engine → runtime}/verify/verify-specs.d.ts +2 -0
- package/dist/packages/{engine → runtime}/verify/verify-specs.js +5 -3
- package/dist/packages/runtime/verify/verify-targets.d.ts +5 -0
- package/dist/packages/{engine → runtime}/verify/verify-targets.js +12 -12
- package/dist/packages/runtime/verify/verify-types.js +1 -0
- package/dist/packages/{engine → runtime}/verify/verify.d.ts +1 -1
- package/dist/packages/{engine → runtime}/verify/verify.js +1 -1
- package/dist/packages/runtime/wire-schemas.d.ts +18 -0
- package/dist/packages/runtime/wire-schemas.js +27 -0
- package/package.json +39 -31
- package/public-repo/CONTRIBUTING.md +7 -16
- package/public-repo/README.md +175 -234
- package/public-repo/SECURITY.md +3 -4
- package/public-repo/build-plans/interf-default/README.md +19 -14
- package/public-repo/build-plans/interf-default/build/stages/shape/SKILL.md +18 -11
- package/public-repo/build-plans/interf-default/build/stages/structure/SKILL.md +12 -5
- package/public-repo/build-plans/interf-default/build/stages/summarize/SKILL.md +16 -4
- package/public-repo/build-plans/interf-default/build-plan.json +34 -28
- package/public-repo/build-plans/interf-default/build-plan.schema.json +54 -32
- package/public-repo/build-plans/interf-default/improve/SKILL.md +3 -3
- package/public-repo/build-plans/interf-default/use/query/SKILL.md +17 -11
- package/public-repo/openapi/local-service.openapi.json +6803 -0
- package/public-repo/skills/interf/SKILL.md +460 -179
- package/dist/cli/commands/prep.d.ts +0 -2
- package/dist/cli/commands/prep.js +0 -240
- package/dist/cli/commands/test.d.ts +0 -10
- package/dist/cli/commands/test.js +0 -85
- package/dist/cli/commands/web.d.ts +0 -2
- package/dist/cli/commands/web.js +0 -286
- package/dist/interf-ui/404.html +0 -1
- package/dist/interf-ui/__next.__PAGE__.txt +0 -10
- package/dist/interf-ui/__next._full.txt +0 -20
- package/dist/interf-ui/__next._head.txt +0 -5
- package/dist/interf-ui/__next._index.txt +0 -5
- package/dist/interf-ui/__next._tree.txt +0 -5
- package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_buildManifest.js +0 -11
- package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_clientMiddlewareManifest.js +0 -1
- package/dist/interf-ui/_next/static/--reS3xBzM5zc6QxNjZd6/_ssgManifest.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0.tjb6f4golw..css +0 -3
- package/dist/interf-ui/_next/static/chunks/03~yq9q893hmn.js +0 -1
- package/dist/interf-ui/_next/static/chunks/085-n_jv2ng_q.css +0 -1
- package/dist/interf-ui/_next/static/chunks/0dn41fa_zvgsl.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0g-ea0zj5d-0k.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0gwqglc4iz583.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0haldgm65ve6l.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0nv3am99vjzn4.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0s77gt_o4jwtx.js +0 -1
- package/dist/interf-ui/_next/static/chunks/0y5z3t-z1c8ks.js.map +0 -5
- package/dist/interf-ui/_next/static/chunks/0~a36ujuzpaz..js +0 -116
- package/dist/interf-ui/_next/static/chunks/10jeodxe4nkgj.js +0 -31
- package/dist/interf-ui/_next/static/chunks/119h2rouych2t.js +0 -1
- package/dist/interf-ui/_next/static/chunks/13c8b~m8knjsf.js +0 -1
- package/dist/interf-ui/_next/static/chunks/14dznb2qpt-ho.js +0 -91
- package/dist/interf-ui/_next/static/chunks/15z_en80lrq-3.js +0 -5
- package/dist/interf-ui/_next/static/chunks/turbopack-0p.pvcjrtq-jh.js +0 -1
- package/dist/interf-ui/_next/static/chunks/turbopack-0usj_75.8frlw.js +0 -1
- package/dist/interf-ui/_next/static/chunks/turbopack-worker-0sjn--fhq~1cg.js +0 -1
- package/dist/interf-ui/_next/static/media/GeistMono_Variable.p.17jn9btb_52pq.woff2 +0 -0
- package/dist/interf-ui/_next/static/media/Geist_Variable-s.p.0-te~ja_gpvcf.woff2 +0 -0
- package/dist/interf-ui/_next/static/media/worker.102zas1s52_pf.js +0 -109
- package/dist/interf-ui/_not-found/__next._full.txt +0 -15
- package/dist/interf-ui/_not-found/__next._head.txt +0 -5
- package/dist/interf-ui/_not-found/__next._index.txt +0 -5
- package/dist/interf-ui/_not-found/__next._not-found.__PAGE__.txt +0 -5
- package/dist/interf-ui/_not-found/__next._not-found.txt +0 -5
- package/dist/interf-ui/_not-found/__next._tree.txt +0 -2
- package/dist/interf-ui/_not-found.html +0 -1
- package/dist/interf-ui/_not-found.txt +0 -15
- package/dist/interf-ui/index.html +0 -1
- package/dist/interf-ui/index.txt +0 -20
- package/dist/packages/contracts/lib/preparation-paths.d.ts +0 -117
- package/dist/packages/contracts/lib/preparation-paths.js +0 -177
- package/dist/packages/engine/action-definitions.d.ts +0 -407
- package/dist/packages/engine/action-definitions.js +0 -1158
- package/dist/packages/engine/action-values.d.ts +0 -1
- package/dist/packages/engine/action-values.js +0 -1
- package/dist/packages/engine/agents/lib/args.d.ts +0 -4
- package/dist/packages/engine/agents/lib/args.js +0 -52
- package/dist/packages/engine/agents/lib/chart-guidance.d.ts +0 -1
- package/dist/packages/engine/agents/lib/chart-guidance.js +0 -8
- package/dist/packages/engine/agents/lib/constants.js +0 -28
- package/dist/packages/engine/agents/lib/schema.d.ts +0 -8
- package/dist/packages/engine/agents/lib/schema.js +0 -7
- package/dist/packages/engine/agents/lib/shells.d.ts +0 -74
- package/dist/packages/engine/agents/lib/shells.js +0 -1052
- package/dist/packages/engine/agents/lib/verifiable-context-bootstrap.d.ts +0 -3
- package/dist/packages/engine/build/artifact-counts.d.ts +0 -1
- package/dist/packages/engine/build/billing-events.d.ts +0 -89
- package/dist/packages/engine/build/build-pipeline.js +0 -175
- package/dist/packages/engine/build/build-plan-runs.d.ts +0 -14
- package/dist/packages/engine/build/build-plan-runs.js +0 -31
- package/dist/packages/engine/build/build-stage-plan.d.ts +0 -16
- package/dist/packages/engine/build/build-stage-runner.js +0 -94
- package/dist/packages/engine/build/build-target.js +0 -16
- package/dist/packages/engine/build/check-evaluator.js +0 -298
- package/dist/packages/engine/build/reset.d.ts +0 -2
- package/dist/packages/engine/build/reset.js +0 -74
- package/dist/packages/engine/build/runtime-inventory.d.ts +0 -7
- package/dist/packages/engine/build/runtime-runs.d.ts +0 -10
- package/dist/packages/engine/build/runtime-runs.js +0 -224
- package/dist/packages/engine/build/runtime.d.ts +0 -5
- package/dist/packages/engine/build/runtime.js +0 -4
- package/dist/packages/engine/build/source-files.d.ts +0 -46
- package/dist/packages/engine/build/source-files.js +0 -149
- package/dist/packages/engine/build/state-artifacts.d.ts +0 -9
- package/dist/packages/engine/build/state-artifacts.js +0 -14
- package/dist/packages/engine/build/state-health.d.ts +0 -4
- package/dist/packages/engine/build/state-io.d.ts +0 -11
- package/dist/packages/engine/build/state-io.js +0 -82
- package/dist/packages/engine/build/state-paths.js +0 -16
- package/dist/packages/engine/build/state-view.d.ts +0 -5
- package/dist/packages/engine/build/state.d.ts +0 -7
- package/dist/packages/engine/build/state.js +0 -12
- package/dist/packages/engine/build/validate-helpers.d.ts +0 -12
- package/dist/packages/engine/build/validate-helpers.js +0 -41
- package/dist/packages/engine/build/verifiable-context-paths.d.ts +0 -47
- package/dist/packages/engine/build/verifiable-context-paths.js +0 -121
- package/dist/packages/engine/build/verifiable-context-schema.d.ts +0 -21
- package/dist/packages/engine/build/verifiable-context-schema.js +0 -126
- package/dist/packages/engine/cloud-seams.d.ts +0 -115
- package/dist/packages/engine/cloud-seams.js +0 -84
- package/dist/packages/engine/index.d.ts +0 -22
- package/dist/packages/engine/index.js +0 -15
- package/dist/packages/engine/instance-paths.d.ts +0 -106
- package/dist/packages/engine/instance-paths.js +0 -171
- package/dist/packages/engine/lib/schema.d.ts +0 -6304
- package/dist/packages/engine/lib/schema.js +0 -730
- package/dist/packages/engine/preparation-store.d.ts +0 -105
- package/dist/packages/engine/preparation-store.js +0 -213
- package/dist/packages/engine/readiness-check-draft.d.ts +0 -20
- package/dist/packages/engine/readiness-check-draft.js +0 -111
- package/dist/packages/engine/requested-artifacts.d.ts +0 -5
- package/dist/packages/engine/routes.d.ts +0 -85
- package/dist/packages/engine/routes.js +0 -99
- package/dist/packages/engine/runtime-caches.d.ts +0 -76
- package/dist/packages/engine/runtime-proposal-helpers.d.ts +0 -35
- package/dist/packages/engine/runtime-proposal-helpers.js +0 -247
- package/dist/packages/engine/runtime.d.ts +0 -371
- package/dist/packages/engine/runtime.js +0 -2463
- package/dist/packages/engine/server.d.ts +0 -58
- package/dist/packages/engine/server.js +0 -1399
- package/dist/packages/engine/verify/readiness-check-run.d.ts +0 -82
- package/dist/packages/engine/verify/readiness-check-run.js +0 -265
- package/dist/packages/engine/verify/verify-paths.js +0 -61
- package/dist/packages/engine/verify/verify-sandbox.js +0 -88
- package/dist/packages/engine/verify/verify-targets.d.ts +0 -5
- package/dist/packages/engine/wire-schemas.d.ts +0 -547
- package/dist/packages/engine/wire-schemas.js +0 -59
- package/dist/packages/project/index.d.ts +0 -9
- package/dist/packages/project/interf-bootstrap.d.ts +0 -1
- package/dist/packages/project/interf-bootstrap.js +0 -1
- package/dist/packages/project/interf-scaffold.d.ts +0 -3
- package/dist/packages/project/interf-scaffold.js +0 -136
- package/dist/packages/project/interf.d.ts +0 -4
- package/dist/packages/project/interf.js +0 -3
- package/dist/packages/project/lib/schema.d.ts +0 -328
- package/dist/packages/project/lib/schema.js +0 -136
- package/dist/packages/project/preparation-entries.d.ts +0 -11
- package/dist/packages/project/preparation-entries.js +0 -49
- package/dist/packages/project/source-config.d.ts +0 -46
- package/dist/packages/project/source-config.js +0 -394
- package/dist/packages/project/source-folders.d.ts +0 -11
- package/public-repo/plugins/README.md +0 -9
- package/public-repo/plugins/interf/.claude-plugin/plugin.json +0 -21
- package/public-repo/plugins/interf/.mcp.json +0 -12
- package/public-repo/plugins/interf/README.md +0 -32
- package/public-repo/plugins/interf/skills/interf/SKILL.md +0 -376
- /package/dist/packages/{engine/agents/lib/types.js → runtime/actions/fields.js} +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/agents.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/agents.js +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/execution-profile.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/execution.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/executors.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/executors.js +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/logs.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/logs.js +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/preflight.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/render.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/status.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/status.js +0 -0
- /package/dist/packages/{engine → runtime}/agents/lib/types.d.ts +0 -0
- /package/dist/packages/{engine/build/runtime-types.js → runtime/agents/lib/types.js} +0 -0
- /package/dist/packages/{engine/verify/verify-types.js → runtime/agents/providers/types.js} +0 -0
- /package/dist/packages/{engine → runtime}/agents/role-router.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/build/build-execution.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/build/build-execution.js +0 -0
- /package/dist/packages/{engine → runtime}/build/runtime-contracts.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/build/runtime-paths.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/build/runtime-prompt.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/execution/adapters.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/execution/adapters.js +0 -0
- /package/dist/packages/{engine → runtime}/execution/events.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/execution/events.js +0 -0
- /package/dist/packages/{engine → runtime}/verify/verify-execution.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/verify/verify-profile-presets.d.ts +0 -0
- /package/dist/packages/{engine → runtime}/verify/verify-profile-presets.js +0 -0
- /package/dist/packages/{engine → runtime}/verify/verify-types.d.ts +0 -0
package/dist/cli/commands/mcp.js
CHANGED
|
@@ -1,52 +1,114 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Interf Model Context Protocol server.
|
|
3
3
|
*
|
|
4
4
|
* Wraps the local-service HTTP API as a typed agent surface so coding
|
|
5
5
|
* agents can interact with Interf the same way they call other MCP tools
|
|
6
6
|
* (instead of shelling out to the CLI).
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Packaged Desktop exposes this through `dist/bin-mcp.js`; the CLI subcommand
|
|
9
|
+
* is kept as a hidden developer entrypoint so tests and local hosts can launch
|
|
10
|
+
* the same adapter directly when needed.
|
|
10
11
|
*
|
|
11
12
|
* API-backed tools read `~/.interf/connection.json` (the same file every
|
|
12
|
-
* other client uses) on each call.
|
|
13
|
-
*
|
|
14
|
-
* tool surface first, then call `
|
|
15
|
-
*
|
|
16
|
-
*
|
|
13
|
+
* other client uses) on each call. In the default headless profile, the
|
|
14
|
+
* MCP server can start before a local service is connected so local plugin hosts
|
|
15
|
+
* can load the tool surface first, then call `runtime_start` or `runtime_status`.
|
|
16
|
+
* In the app profile, lifecycle, inventory, admin, and library-browsing tools
|
|
17
|
+
* are hidden because Interf Desktop owns the running service and the user flow
|
|
18
|
+
* should stay preparation-first: create a Project for the current Source,
|
|
19
|
+
* draft a Build Plan, build a Context Graph, then inspect graph evidence.
|
|
20
|
+
* The MCP server itself holds no Interf runtime state.
|
|
17
21
|
*
|
|
18
22
|
* Tool list:
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* build_plan_draft POST /v1/preparations/{id}/build-plan-draft-runs
|
|
31
|
-
* build_plan_improve POST /v1/preparations/{id}/build-plan-improvement-runs
|
|
32
|
-
* runs_status GET /v1/runs/{run-id}
|
|
33
|
-
* runs_watch GET /v1/build-runs/{run-id}/events (snapshot, not SSE)
|
|
34
|
-
* runs_cancel POST /v1/build-runs/{run-id}/cancel
|
|
35
|
-
* runs_fetch GET /v1/build-runs/{run-id}/artifacts
|
|
36
|
-
* instance_status GET /v1/instance
|
|
23
|
+
* runtime_start shell out to `interf runtime start`
|
|
24
|
+
* runtime_stop shell out to `interf runtime stop`
|
|
25
|
+
* runtime_status shell out to `interf runtime status`
|
|
26
|
+
* Desktop app profile tools:
|
|
27
|
+
* create_project, prepare_build_plan, run_build
|
|
28
|
+
* get_instance_status, get_project, get_run_status, get_run_artifacts
|
|
29
|
+
* get_latest_context_graph, read_context_graph_file
|
|
30
|
+
* get_context_graph_traces, get_build_evidence
|
|
31
|
+
*
|
|
32
|
+
* Headless developer profile additionally exposes runtime lifecycle,
|
|
33
|
+
* inventory, Build Plan library, benchmark, cancel, and admin tools.
|
|
37
34
|
*/
|
|
38
35
|
import { spawn } from "node:child_process";
|
|
39
36
|
import { readFileSync } from "node:fs";
|
|
40
37
|
import { z } from "zod";
|
|
41
38
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
42
39
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
43
|
-
import { CONNECT_OR_ERROR_HINT, readActiveConnection, } from "../../packages/
|
|
44
|
-
import {
|
|
45
|
-
import {
|
|
46
|
-
import {
|
|
40
|
+
import { CONNECT_OR_ERROR_HINT, readActiveConnection, } from "../../packages/runtime/connection-config.js";
|
|
41
|
+
import { readServiceRegistry, } from "../../packages/runtime/service/service-registry.js";
|
|
42
|
+
import { LOCAL_SERVICE_ROUTES, buildPlanResourcePath, buildPlanSubresourcePath, projectResourcePath, projectSubresourcePath, runResourcePath, runSubresourcePath, } from "../../packages/runtime/service/routes.js";
|
|
43
|
+
import { BuildPlanAuthoringArtifactRequirementSchema, BuildPlanContextCheckDraftSchema, RequestedArtifactSchema, } from "../../packages/runtime/schemas/index.js";
|
|
44
|
+
import { SourceContextSchema, } from "../../packages/projects/lib/schema.js";
|
|
45
|
+
const INTERF_MCP_INSTRUCTIONS = [
|
|
46
|
+
"Interf prepares data for agents. It is not a search engine and not a general RAG index.",
|
|
47
|
+
"Interf MCP is how this host talks to Interf. Agents listed inside Interf are executors that run Build Plan stages. Do not treat MCP setup as executor setup.",
|
|
48
|
+
"App MCP exposes three core workflow tools: create_project, prepare_build_plan, and run_build. Other tools are read-only inspection helpers.",
|
|
49
|
+
"Default workflow for a user question over files: create a fresh Project for the current Source, propose Context Checks and requested Artifacts, prepare the Build Plan after the user approves those checks and Artifacts, stop for Build Plan approval, run_build only after that approval, then answer from the prepared Context Graph and its source-backed traces.",
|
|
50
|
+
"Source scope default: if Interf Desktop, the MCP host, or the user context already provides a Source locator or file set, use that whole Source. Do not ask the user to choose individual files or a subset unless they explicitly ask to narrow scope.",
|
|
51
|
+
"Do not answer by browsing existing Projects as if they were a corpus. In the Desktop app profile, always create a fresh Project for the current Source unless the user explicitly names an existing Project id.",
|
|
52
|
+
"Use existing Projects or Context Graphs only when the user explicitly selected or named them and they bind the same Source and task.",
|
|
53
|
+
"If no usable Source locator is available, ask for one Source locator. In the local Desktop path this may be a folder path. Do not present a file-selection menu or ask which files inside the Source to use.",
|
|
54
|
+
"Project creation is allowed when the user asks Interf to use a Source. Project ids are generated internally. Do not ask for existing Project ids. Approval gates are for Build Plan preparation and Build execution.",
|
|
55
|
+
"Before building, show the user the Context Checks, requested Artifacts, and drafted Build Plan in chat. Wait for approval unless the user has explicitly granted end-to-end autonomy.",
|
|
56
|
+
"No automatic retries: if prepare_build_plan, run_build, or a polled Run reaches failed/cancelled, report the failure and ask the user before starting another draft or Build run.",
|
|
57
|
+
"After a Build succeeds, read the task handoff under artifacts/ first. Treat home.md as a graph index, summaries/ as source coverage proof, and knowledge/ as navigation/drilldown.",
|
|
58
|
+
"A Context Graph is a knowledge map over the Source, not the answer source. Use it to understand what exists and where evidence lives; follow source references and traces when exact values, chart reads, tables, or provenance matter.",
|
|
59
|
+
"If a Context Graph artifact is too coarse or missing the needed evidence, improve the Build Plan and rebuild instead of giving a weak answer.",
|
|
60
|
+
].join("\n");
|
|
61
|
+
const McpRequestedArtifactSchema = RequestedArtifactSchema.describe("Requested Artifact the user approved. Use a short title, optional id, description/purpose, and plain-English checks.");
|
|
62
|
+
function normalizeRequestedArtifacts(artifacts) {
|
|
63
|
+
if (!artifacts)
|
|
64
|
+
return undefined;
|
|
65
|
+
return artifacts.map((artifact) => RequestedArtifactSchema.parse(artifact));
|
|
66
|
+
}
|
|
47
67
|
function trimTrailingSlash(value) {
|
|
48
68
|
return value.replace(/\/+$/, "");
|
|
49
69
|
}
|
|
70
|
+
function normalizeConnectionUrl(value) {
|
|
71
|
+
return trimTrailingSlash(value.trim());
|
|
72
|
+
}
|
|
73
|
+
function registryTokenForUrl(url) {
|
|
74
|
+
const normalized = normalizeConnectionUrl(url);
|
|
75
|
+
for (const service of readServiceRegistry()) {
|
|
76
|
+
if (normalizeConnectionUrl(service.url) === normalized && service.auth_token) {
|
|
77
|
+
return service.auth_token;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
function connectionTokenForUrl(url) {
|
|
83
|
+
const normalized = normalizeConnectionUrl(url);
|
|
84
|
+
const active = readActiveConnection();
|
|
85
|
+
if (!active)
|
|
86
|
+
return null;
|
|
87
|
+
return normalizeConnectionUrl(active.url) === normalized ? active.auth_token : null;
|
|
88
|
+
}
|
|
89
|
+
function encodeRelativePath(value) {
|
|
90
|
+
return value
|
|
91
|
+
.split("/")
|
|
92
|
+
.filter((segment) => segment.length > 0)
|
|
93
|
+
.map((segment) => encodeURIComponent(segment))
|
|
94
|
+
.join("/");
|
|
95
|
+
}
|
|
96
|
+
function contextGraphFilePath(projectId, filePath) {
|
|
97
|
+
return `${projectSubresourcePath(projectId, "contextGraphFile")}?path=${encodeURIComponent(filePath)}`;
|
|
98
|
+
}
|
|
99
|
+
function slugifyMcpId(input) {
|
|
100
|
+
return input
|
|
101
|
+
.toLowerCase()
|
|
102
|
+
.trim()
|
|
103
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
104
|
+
.replace(/^-+|-+$/g, "")
|
|
105
|
+
.slice(0, 48);
|
|
106
|
+
}
|
|
107
|
+
function generatedMcpId(prefix) {
|
|
108
|
+
const base = slugifyMcpId(prefix).slice(0, 18) || "item";
|
|
109
|
+
const suffix = `${Date.now().toString(36)}${Math.random().toString(36).slice(2, 6)}`;
|
|
110
|
+
return `${base}-${suffix}`;
|
|
111
|
+
}
|
|
50
112
|
function packageVersionFromManifest() {
|
|
51
113
|
try {
|
|
52
114
|
const url = new URL("../../../package.json", import.meta.url);
|
|
@@ -59,14 +121,18 @@ function packageVersionFromManifest() {
|
|
|
59
121
|
}
|
|
60
122
|
}
|
|
61
123
|
function resolveConnectionOrNull(args) {
|
|
124
|
+
const urlOverride = args.url?.trim();
|
|
125
|
+
const currentLocalToken = urlOverride
|
|
126
|
+
? registryTokenForUrl(urlOverride) ?? connectionTokenForUrl(urlOverride)
|
|
127
|
+
: null;
|
|
62
128
|
const conn = readActiveConnection({
|
|
63
|
-
urlOverride:
|
|
64
|
-
authTokenOverride: args.token ?? null,
|
|
129
|
+
urlOverride: urlOverride ?? null,
|
|
130
|
+
authTokenOverride: currentLocalToken ?? args.token ?? null,
|
|
65
131
|
});
|
|
66
132
|
if (!conn)
|
|
67
133
|
return null;
|
|
68
134
|
return {
|
|
69
|
-
url:
|
|
135
|
+
url: normalizeConnectionUrl(conn.url),
|
|
70
136
|
token: conn.auth_token ?? null,
|
|
71
137
|
};
|
|
72
138
|
}
|
|
@@ -164,262 +230,712 @@ async function callAndReturn(args, path, init = {}) {
|
|
|
164
230
|
}
|
|
165
231
|
return toolErrorJson(`Local service responded with HTTP ${response.status}.`, response.body ?? response.raw);
|
|
166
232
|
}
|
|
167
|
-
function
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
233
|
+
async function callAndProject(args, path, project, init = {}) {
|
|
234
|
+
const conn = resolveConnectionOrNull(args);
|
|
235
|
+
if (!conn)
|
|
236
|
+
return toolErrorJson(CONNECT_OR_ERROR_HINT);
|
|
237
|
+
const response = await callApi(conn, path, init);
|
|
238
|
+
if (response.status >= 200 && response.status < 300) {
|
|
239
|
+
return toolResultJson(project(response.body, response.raw));
|
|
240
|
+
}
|
|
241
|
+
return toolErrorJson(`Local service responded with HTTP ${response.status}.`, response.body ?? response.raw);
|
|
242
|
+
}
|
|
243
|
+
function isRecord(value) {
|
|
244
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
245
|
+
}
|
|
246
|
+
function readString(record, key) {
|
|
247
|
+
const value = record[key];
|
|
248
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
249
|
+
}
|
|
250
|
+
function readNumber(record, key) {
|
|
251
|
+
const value = record[key];
|
|
252
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
253
|
+
}
|
|
254
|
+
function readArray(record, key) {
|
|
255
|
+
const value = record[key];
|
|
256
|
+
return Array.isArray(value) ? value : [];
|
|
257
|
+
}
|
|
258
|
+
function truncateText(value, max = 360) {
|
|
259
|
+
if (value.length <= max)
|
|
260
|
+
return value;
|
|
261
|
+
return `${value.slice(0, Math.max(0, max - 1))}…`;
|
|
262
|
+
}
|
|
263
|
+
function summarizeMetrics(metrics) {
|
|
264
|
+
return metrics
|
|
265
|
+
.filter(isRecord)
|
|
266
|
+
.map((metric) => ({
|
|
267
|
+
label: readString(metric, "label") ?? "",
|
|
268
|
+
value: String(metric.value ?? ""),
|
|
269
|
+
}))
|
|
270
|
+
.filter((metric) => metric.label.length > 0 && metric.value.length > 0)
|
|
271
|
+
.slice(0, 12);
|
|
272
|
+
}
|
|
273
|
+
function summarizeCollection(items) {
|
|
274
|
+
const statuses = {};
|
|
275
|
+
for (const item of items) {
|
|
276
|
+
if (!isRecord(item))
|
|
277
|
+
continue;
|
|
278
|
+
const status = readString(item, "status");
|
|
279
|
+
if (status)
|
|
280
|
+
statuses[status] = (statuses[status] ?? 0) + 1;
|
|
281
|
+
}
|
|
282
|
+
return {
|
|
283
|
+
total: items.length,
|
|
284
|
+
...(Object.keys(statuses).length > 0 ? { statuses } : {}),
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
function summarizeReadiness(value) {
|
|
288
|
+
if (!isRecord(value))
|
|
289
|
+
return null;
|
|
290
|
+
return {
|
|
291
|
+
status: readString(value, "status"),
|
|
292
|
+
ready: value.ready === true ? true : value.ready === false ? false : undefined,
|
|
293
|
+
checks_passed: readNumber(value, "checks_passed"),
|
|
294
|
+
checks_total: readNumber(value, "checks_total"),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
function summarizeTraceEvent(event) {
|
|
298
|
+
if (!isRecord(event))
|
|
299
|
+
return null;
|
|
300
|
+
const eventData = isRecord(event.eventData) ? event.eventData : {};
|
|
301
|
+
const result = isRecord(eventData.result) ? eventData.result : {};
|
|
302
|
+
const error = isRecord(eventData.error) ? eventData.error : {};
|
|
303
|
+
return {
|
|
304
|
+
event_id: readString(event, "eventId"),
|
|
305
|
+
type: readString(event, "eventType"),
|
|
306
|
+
correlation_id: readString(event, "correlationId"),
|
|
307
|
+
created_at: readString(event, "createdAt"),
|
|
308
|
+
message: readString(eventData, "message") ?? readString(result, "summary") ?? readString(error, "message"),
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
function compactTraceStream(stream) {
|
|
312
|
+
if (!isRecord(stream))
|
|
313
|
+
return null;
|
|
314
|
+
const text = readString(stream, "text");
|
|
315
|
+
if (!text)
|
|
316
|
+
return null;
|
|
317
|
+
return {
|
|
318
|
+
stream_id: readString(stream, "streamId"),
|
|
319
|
+
chunk_id: readString(stream, "chunkId"),
|
|
320
|
+
index: readNumber(stream, "index"),
|
|
321
|
+
created_at: readString(stream, "createdAt"),
|
|
322
|
+
text: truncateText(text),
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
function latestTraceStream(streams) {
|
|
326
|
+
for (let index = streams.length - 1; index >= 0; index -= 1) {
|
|
327
|
+
const compact = compactTraceStream(streams[index]);
|
|
328
|
+
if (compact)
|
|
329
|
+
return compact;
|
|
330
|
+
}
|
|
331
|
+
return null;
|
|
332
|
+
}
|
|
333
|
+
function compactRunStatus(payload) {
|
|
334
|
+
if (!isRecord(payload))
|
|
335
|
+
return payload;
|
|
336
|
+
const trace = isRecord(payload.trace) ? payload.trace : {};
|
|
337
|
+
const events = readArray(trace, "events");
|
|
338
|
+
const streams = readArray(trace, "streams");
|
|
339
|
+
return {
|
|
340
|
+
kind: "interf-run-status",
|
|
341
|
+
version: 1,
|
|
342
|
+
run_id: readString(payload, "run_id"),
|
|
343
|
+
run_type: readString(payload, "run_type"),
|
|
344
|
+
title: readString(payload, "title"),
|
|
345
|
+
status: readString(payload, "status"),
|
|
346
|
+
project: readString(payload, "project"),
|
|
347
|
+
build_plan: readString(payload, "build_plan"),
|
|
348
|
+
created_at: readString(payload, "created_at"),
|
|
349
|
+
started_at: readString(payload, "started_at"),
|
|
350
|
+
finished_at: readString(payload, "finished_at"),
|
|
351
|
+
metrics: summarizeMetrics(readArray(payload, "metrics")),
|
|
352
|
+
artifacts: summarizeCollection(readArray(payload, "artifacts")),
|
|
353
|
+
checks: summarizeCollection(readArray(payload, "checks")),
|
|
354
|
+
context_checks: summarizeCollection(readArray(payload, "context_checks")),
|
|
355
|
+
readiness: summarizeReadiness(payload.readiness),
|
|
356
|
+
latest_event: events.length > 0 ? summarizeTraceEvent(events[events.length - 1]) : null,
|
|
357
|
+
latest_log: latestTraceStream(streams),
|
|
358
|
+
detail_hint: "Poll this compact status until terminal. If status is failed or cancelled, report it and ask before retrying; use event/log and artifact tools only when debugging or reading finished outputs.",
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
function compactRunEvents(payload, options) {
|
|
362
|
+
if (!isRecord(payload))
|
|
363
|
+
return payload;
|
|
364
|
+
const trace = isRecord(payload.trace) ? payload.trace : {};
|
|
365
|
+
const events = readArray(trace, "events");
|
|
366
|
+
const streams = readArray(trace, "streams");
|
|
367
|
+
const recentEvents = events
|
|
368
|
+
.slice(Math.max(0, events.length - options.eventLimit))
|
|
369
|
+
.map(summarizeTraceEvent)
|
|
370
|
+
.filter((event) => event !== null);
|
|
371
|
+
const recentStreams = options.includeStreams
|
|
372
|
+
? streams
|
|
373
|
+
.slice(Math.max(0, streams.length - options.streamLimit))
|
|
374
|
+
.map(compactTraceStream)
|
|
375
|
+
.filter((stream) => stream !== null)
|
|
376
|
+
: undefined;
|
|
377
|
+
return {
|
|
378
|
+
kind: "interf-run-events",
|
|
379
|
+
version: 1,
|
|
380
|
+
run_id: readString(payload, "run_id"),
|
|
381
|
+
status: readString(payload, "status"),
|
|
382
|
+
event_count: events.length,
|
|
383
|
+
stream_count: streams.length,
|
|
384
|
+
events: recentEvents,
|
|
385
|
+
...(recentStreams ? { streams: recentStreams } : {}),
|
|
386
|
+
detail_hint: "This is a bounded tail. Use a larger limit only when debugging; use compact run status for polling.",
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
async function currentSourcePathForApp(conn) {
|
|
390
|
+
const response = await callApi(conn, LOCAL_SERVICE_ROUTES.health);
|
|
391
|
+
if (response.status >= 200 && response.status < 300 && isRecord(response.body)) {
|
|
392
|
+
const sourcePath = readString(response.body, "source_folder_path");
|
|
393
|
+
if (sourcePath)
|
|
394
|
+
return sourcePath;
|
|
395
|
+
}
|
|
396
|
+
const sourceCandidates = await sourceCandidatesForApp(conn);
|
|
397
|
+
return sourceCandidates.length === 1 ? sourceCandidates[0]?.source_path ?? null : null;
|
|
398
|
+
}
|
|
399
|
+
async function sourceCandidatesForApp(conn) {
|
|
400
|
+
const response = await callApi(conn, LOCAL_SERVICE_ROUTES.projects);
|
|
401
|
+
if (response.status < 200 || response.status >= 300 || !isRecord(response.body))
|
|
402
|
+
return [];
|
|
403
|
+
const bySource = new Map();
|
|
404
|
+
for (const project of readArray(response.body, "projects").filter(isRecord)) {
|
|
405
|
+
const source = isRecord(project.source) ? project.source : {};
|
|
406
|
+
const sourcePath = readString(source, "locator");
|
|
407
|
+
if (!sourcePath)
|
|
408
|
+
continue;
|
|
409
|
+
const entry = bySource.get(sourcePath) ?? { count: 0, buildPlanIds: new Set() };
|
|
410
|
+
entry.count += 1;
|
|
411
|
+
const buildPlanId = readString(project, "build_plan_id");
|
|
412
|
+
if (buildPlanId)
|
|
413
|
+
entry.buildPlanIds.add(buildPlanId);
|
|
414
|
+
bySource.set(sourcePath, entry);
|
|
415
|
+
}
|
|
416
|
+
return [...bySource.entries()]
|
|
417
|
+
.map(([sourcePath, entry]) => ({
|
|
418
|
+
source_path: sourcePath,
|
|
419
|
+
project_count: entry.count,
|
|
420
|
+
build_plan_ids: [...entry.buildPlanIds].slice(0, 4),
|
|
421
|
+
}))
|
|
422
|
+
.slice(0, 8);
|
|
423
|
+
}
|
|
424
|
+
async function callAppCreateProject(args, request) {
|
|
425
|
+
const conn = resolveConnectionOrNull(args);
|
|
426
|
+
if (!conn)
|
|
427
|
+
return toolErrorJson(CONNECT_OR_ERROR_HINT);
|
|
428
|
+
const sourcePath = request.source_path?.trim() || await currentSourcePathForApp(conn);
|
|
429
|
+
if (!sourcePath) {
|
|
430
|
+
const sourceCandidates = await sourceCandidatesForApp(conn);
|
|
431
|
+
return toolErrorJson("No unambiguous current Source locator is exposed by Interf. If source_candidates contains a Source that clearly matches the user's task, call create_project again with that source_path. Otherwise ask for one Source locator. Do not ask for an existing Project id or ask the user to choose individual files.", { source_candidates: sourceCandidates });
|
|
432
|
+
}
|
|
433
|
+
const id = generatedMcpId("project");
|
|
434
|
+
const response = await callApi(conn, LOCAL_SERVICE_ROUTES.projects, {
|
|
435
|
+
method: "POST",
|
|
436
|
+
body: JSON.stringify({
|
|
437
|
+
id,
|
|
438
|
+
source: { kind: "local-folder", locator: sourcePath },
|
|
439
|
+
}),
|
|
440
|
+
});
|
|
441
|
+
if (response.status >= 200 && response.status < 300) {
|
|
442
|
+
return toolResultJson(response.body ?? response.raw);
|
|
443
|
+
}
|
|
444
|
+
return toolErrorJson(`Local service responded with HTTP ${response.status}.`, response.body ?? response.raw);
|
|
445
|
+
}
|
|
446
|
+
function registerAppProfileTools(server, connectionArgs) {
|
|
447
|
+
server.registerTool("create_project", {
|
|
448
|
+
title: "Create Project",
|
|
449
|
+
description: "Core step 1. Create a fresh Project for this task and the whole current Source. The Project id is generated internally; do not ask for or provide one.",
|
|
173
450
|
inputSchema: {
|
|
174
|
-
|
|
175
|
-
port: z.number().int().positive().optional().describe("Port to bind. Defaults to 4873."),
|
|
176
|
-
timeout_ms: z.number().int().positive().optional().describe("Startup timeout in milliseconds."),
|
|
177
|
-
log: z.string().min(1).optional().describe("Optional path for background engine logs."),
|
|
451
|
+
source_path: z.string().min(1).optional().describe("Fallback Source locator. In the local Desktop path this is an absolute folder path. Use only when Interf does not expose a current Source; do not pass individual files or a subset selection."),
|
|
178
452
|
},
|
|
179
|
-
}, async (args) =>
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
if (args.port)
|
|
184
|
-
cliArgs.push("--port", String(args.port));
|
|
185
|
-
if (args.timeout_ms)
|
|
186
|
-
cliArgs.push("--timeout-ms", String(args.timeout_ms));
|
|
187
|
-
if (args.log)
|
|
188
|
-
cliArgs.push("--log", args.log);
|
|
189
|
-
return cliToolResult(await runInterfCli(cliArgs));
|
|
190
|
-
});
|
|
191
|
-
server.registerTool("web_stop", {
|
|
192
|
-
title: "Stop local Interf engine",
|
|
193
|
-
description: "Stop the connected Interf engine or the live engine recorded in the "
|
|
194
|
-
+ "local service registry.",
|
|
453
|
+
}, async (args) => callAppCreateProject(connectionArgs, args));
|
|
454
|
+
server.registerTool("prepare_build_plan", {
|
|
455
|
+
title: "Prepare Build Plan",
|
|
456
|
+
description: "Core step 2. Draft the approved Build Plan for the Project. Use after the user approves checks and requested Artifacts. Stop after this tool and ask for Build Plan approval before building. If it fails, report the failure; do not retry without explicit user approval.",
|
|
195
457
|
inputSchema: {
|
|
196
|
-
|
|
197
|
-
|
|
458
|
+
project_id: z.string().min(1).describe("Project id from create_project."),
|
|
459
|
+
build_plan_id: z.string().min(1).optional().describe("Optional Build Plan id. Omit to auto-generate."),
|
|
460
|
+
label: z.string().min(1).optional().describe("Optional short human label."),
|
|
461
|
+
hint: z.string().min(1).optional().describe("Optional one-line plan hint."),
|
|
462
|
+
intent: z.string().min(1).describe("Question/task the Context Graph must support."),
|
|
463
|
+
context_checks: z.array(BuildPlanContextCheckDraftSchema).optional().describe("Plain-English checks the user approved."),
|
|
464
|
+
requested_artifacts: z.array(McpRequestedArtifactSchema).optional().describe("Requested Artifacts the user approved."),
|
|
465
|
+
source_context: SourceContextSchema.nullable().optional(),
|
|
198
466
|
},
|
|
199
|
-
}, async (args) => {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
467
|
+
}, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "buildPlanDraftRuns"), {
|
|
468
|
+
method: "POST",
|
|
469
|
+
body: JSON.stringify((() => {
|
|
470
|
+
const intent = args.intent.trim();
|
|
471
|
+
const buildPlanId = args.build_plan_id?.trim() || generatedMcpId("plan");
|
|
472
|
+
return {
|
|
473
|
+
build_plan_id: buildPlanId,
|
|
474
|
+
label: args.label?.trim() || buildPlanId,
|
|
475
|
+
hint: args.hint?.trim() || intent,
|
|
476
|
+
intent,
|
|
477
|
+
...(args.context_checks ? { checks: args.context_checks } : {}),
|
|
478
|
+
...(args.requested_artifacts ? { requested_artifacts: normalizeRequestedArtifacts(args.requested_artifacts) } : {}),
|
|
479
|
+
...(args.source_context !== undefined ? { source_context: args.source_context } : {}),
|
|
480
|
+
};
|
|
481
|
+
})()),
|
|
482
|
+
}));
|
|
483
|
+
server.registerTool("run_build", {
|
|
484
|
+
title: "Run Build",
|
|
485
|
+
description: "Core step 3. Run the selected Build Plan and create the Context Graph. Never call immediately after prepare_build_plan; use only after explicit Build Plan approval or explicit end-to-end autonomy. If it fails, report the failure; do not retry without explicit user approval.",
|
|
211
486
|
inputSchema: {
|
|
212
|
-
|
|
213
|
-
token: z.string().min(1).optional().describe("Optional bearer token."),
|
|
487
|
+
project_id: z.string().min(1).describe("Project id from create_project."),
|
|
214
488
|
},
|
|
215
|
-
}, async (args) => {
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
if (args.token)
|
|
220
|
-
cliArgs.push("--token", args.token);
|
|
221
|
-
return cliToolResult(await runInterfCli(cliArgs));
|
|
222
|
-
});
|
|
223
|
-
// ── Preparations ────────────────────────────────────────────────────────
|
|
224
|
-
server.registerTool("prep_list", {
|
|
225
|
-
title: "List preparations",
|
|
226
|
-
description: "List every Preparation registered on the connected Interf instance, "
|
|
227
|
-
+ "with source binding, Build Plan id, and current readiness.",
|
|
489
|
+
}, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "buildRuns"), { method: "POST", body: "{}" }));
|
|
490
|
+
server.registerTool("get_instance_status", {
|
|
491
|
+
title: "Get Instance Status",
|
|
492
|
+
description: "Read-only helper. Check service health, current Source, active runs, and instance metadata. Not for Project search.",
|
|
228
493
|
inputSchema: {},
|
|
229
|
-
}, async () =>
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
494
|
+
}, async () => {
|
|
495
|
+
const conn = resolveConnectionOrNull(connectionArgs);
|
|
496
|
+
if (!conn)
|
|
497
|
+
return toolErrorJson(CONNECT_OR_ERROR_HINT);
|
|
498
|
+
const [health, instance, sourceCandidates] = await Promise.all([
|
|
499
|
+
callApi(conn, LOCAL_SERVICE_ROUTES.health),
|
|
500
|
+
callApi(conn, LOCAL_SERVICE_ROUTES.instance),
|
|
501
|
+
sourceCandidatesForApp(conn),
|
|
502
|
+
]);
|
|
503
|
+
if (health.status < 200 || health.status >= 300) {
|
|
504
|
+
return toolErrorJson(`Health responded with HTTP ${health.status}.`, health.body ?? health.raw);
|
|
505
|
+
}
|
|
506
|
+
if (instance.status < 200 || instance.status >= 300) {
|
|
507
|
+
return toolErrorJson(`Instance responded with HTTP ${instance.status}.`, instance.body ?? instance.raw);
|
|
508
|
+
}
|
|
509
|
+
const healthBody = isRecord(health.body) ? health.body : {};
|
|
510
|
+
const instanceBody = isRecord(instance.body) ? instance.body : {};
|
|
511
|
+
const healthSource = readString(healthBody, "source_folder_path");
|
|
512
|
+
const sourcePath = healthSource ?? (sourceCandidates.length === 1 ? sourceCandidates[0]?.source_path ?? null : null);
|
|
513
|
+
return toolResultJson({
|
|
514
|
+
kind: "interf-mcp-status",
|
|
515
|
+
version: 1,
|
|
516
|
+
service_url: readString(healthBody, "service_url") ?? readString(instanceBody, "url"),
|
|
517
|
+
source_path: sourcePath,
|
|
518
|
+
project_count: readNumber(instanceBody, "project_count"),
|
|
519
|
+
active_run_count: readNumber(instanceBody, "active_run_count"),
|
|
520
|
+
agent_count: readNumber(instanceBody, "agent_count"),
|
|
521
|
+
default_agent: readString(instanceBody, "default_agent"),
|
|
522
|
+
source_candidates: sourceCandidates,
|
|
523
|
+
instruction: "For a new file question: use the whole current Source, create_project -> ask user to approve checks/Artifacts -> prepare_build_plan -> ask user to approve the Build Plan -> run_build. If source_path is null but source_candidates has a Source that clearly matches the user's task, pass that source_path to create_project. Do not ask which files inside the Source to use unless the user explicitly narrows scope.",
|
|
524
|
+
});
|
|
525
|
+
});
|
|
526
|
+
server.registerTool("get_project", {
|
|
527
|
+
title: "Get Project",
|
|
528
|
+
description: "Read-only helper. Confirm one Project's Source binding, selected Build Plan, readiness, and latest Context Graph.",
|
|
529
|
+
inputSchema: {
|
|
530
|
+
project_id: z.string().min(1).describe("Project id."),
|
|
531
|
+
},
|
|
532
|
+
}, async (args) => callAndReturn(connectionArgs, projectResourcePath(args.project_id)));
|
|
533
|
+
server.registerTool("get_run_status", {
|
|
534
|
+
title: "Get Run Status",
|
|
535
|
+
description: "Read-only helper. Compact polling receipt for one Run. Use this for repeated status checks.",
|
|
536
|
+
inputSchema: {
|
|
537
|
+
run_id: z.string().min(1).describe("Run id."),
|
|
538
|
+
},
|
|
539
|
+
}, async (args) => callAndProject(connectionArgs, runSubresourcePath(args.run_id, "status"), compactRunStatus));
|
|
540
|
+
server.registerTool("get_run_artifacts", {
|
|
541
|
+
title: "Get Run Artifacts",
|
|
542
|
+
description: "Read-only helper. Fetch a finished Run's artifact manifest only when status is terminal or when reviewing a completed Build Plan draft.",
|
|
543
|
+
inputSchema: {
|
|
544
|
+
run_id: z.string().min(1).describe("Run id."),
|
|
545
|
+
},
|
|
546
|
+
}, async (args) => callAndReturn(connectionArgs, `${LOCAL_SERVICE_ROUTES.runs}/${encodeURIComponent(args.run_id)}/artifacts`));
|
|
547
|
+
server.registerTool("get_latest_context_graph", {
|
|
548
|
+
title: "Get Latest Context Graph",
|
|
549
|
+
description: "Read-only helper. Show the latest Context Graph locator for a Project. This is a locator/status read, not the answer surface; read artifacts/ handoff files next.",
|
|
550
|
+
inputSchema: {
|
|
551
|
+
project_id: z.string().min(1).describe("Project id."),
|
|
552
|
+
},
|
|
553
|
+
}, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "contextGraph")));
|
|
554
|
+
server.registerTool("read_context_graph_file", {
|
|
555
|
+
title: "Read Context Graph File",
|
|
556
|
+
description: "Read one prepared Context Graph file by relative path. Start with artifacts/ task handoffs; use summaries/ for coverage and knowledge/ for drilldown.",
|
|
557
|
+
inputSchema: {
|
|
558
|
+
project_id: z.string().min(1).describe("Project id."),
|
|
559
|
+
path: z.string().min(1).describe("Relative path inside the Context Graph."),
|
|
560
|
+
},
|
|
561
|
+
}, async (args) => callAndReturn(connectionArgs, contextGraphFilePath(args.project_id, args.path)));
|
|
562
|
+
server.registerTool("get_context_graph_traces", {
|
|
563
|
+
title: "Get Context Graph Traces",
|
|
564
|
+
description: "Read-only helper. Read source-backed traces for exact values and provenance.",
|
|
565
|
+
inputSchema: {
|
|
566
|
+
project_id: z.string().min(1).describe("Project id."),
|
|
567
|
+
},
|
|
568
|
+
}, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "traces")));
|
|
569
|
+
server.registerTool("get_build_evidence", {
|
|
570
|
+
title: "Get Build Evidence",
|
|
571
|
+
description: "Read-only helper. Read checks, Artifact diagnostics, and readiness evidence.",
|
|
234
572
|
inputSchema: {
|
|
235
|
-
|
|
573
|
+
project_id: z.string().min(1).describe("Project id."),
|
|
574
|
+
},
|
|
575
|
+
}, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "buildEvidence")));
|
|
576
|
+
}
|
|
577
|
+
function registerTools(server, connectionArgs) {
|
|
578
|
+
const appProfile = (connectionArgs.profile ?? "headless") === "app";
|
|
579
|
+
if (appProfile) {
|
|
580
|
+
registerAppProfileTools(server, connectionArgs);
|
|
581
|
+
return;
|
|
582
|
+
}
|
|
583
|
+
// ── Local service lifecycle ────────────────────────────────────────────
|
|
584
|
+
if (!appProfile) {
|
|
585
|
+
server.registerTool("runtime_start", {
|
|
586
|
+
title: "Start local Interf service",
|
|
587
|
+
description: "Start the Interf local service in the background on the user's machine. "
|
|
588
|
+
+ "Use this when no Interf instance is connected yet.",
|
|
589
|
+
inputSchema: {
|
|
590
|
+
host: z.string().min(1).optional().describe("Host to bind. Defaults to 127.0.0.1."),
|
|
591
|
+
port: z.number().int().positive().optional().describe("Port to bind. Defaults to 4873."),
|
|
592
|
+
timeout_ms: z.number().int().positive().optional().describe("Startup timeout in milliseconds."),
|
|
593
|
+
log: z.string().min(1).optional().describe("Optional path for background service logs."),
|
|
594
|
+
},
|
|
595
|
+
}, async (args) => {
|
|
596
|
+
const cliArgs = ["runtime", "start"];
|
|
597
|
+
if (args.host)
|
|
598
|
+
cliArgs.push("--host", args.host);
|
|
599
|
+
if (args.port)
|
|
600
|
+
cliArgs.push("--port", String(args.port));
|
|
601
|
+
if (args.timeout_ms)
|
|
602
|
+
cliArgs.push("--timeout-ms", String(args.timeout_ms));
|
|
603
|
+
if (args.log)
|
|
604
|
+
cliArgs.push("--log", args.log);
|
|
605
|
+
return cliToolResult(await runInterfCli(cliArgs));
|
|
606
|
+
});
|
|
607
|
+
server.registerTool("runtime_stop", {
|
|
608
|
+
title: "Stop local Interf service",
|
|
609
|
+
description: "Stop the connected Interf local service or the live service recorded in the "
|
|
610
|
+
+ "local service registry.",
|
|
611
|
+
inputSchema: {
|
|
612
|
+
url: z.string().url().optional().describe("Optional service URL to stop."),
|
|
613
|
+
token: z.string().min(1).optional().describe("Optional bearer token."),
|
|
614
|
+
},
|
|
615
|
+
}, async (args) => {
|
|
616
|
+
const cliArgs = ["runtime", "stop"];
|
|
617
|
+
if (args.url)
|
|
618
|
+
cliArgs.push("--url", args.url);
|
|
619
|
+
if (args.token)
|
|
620
|
+
cliArgs.push("--token", args.token);
|
|
621
|
+
return cliToolResult(await runInterfCli(cliArgs));
|
|
622
|
+
});
|
|
623
|
+
server.registerTool("runtime_status", {
|
|
624
|
+
title: "Show local Interf service status",
|
|
625
|
+
description: "Return the connected service status using the same connection record "
|
|
626
|
+
+ "as the CLI.",
|
|
627
|
+
inputSchema: {
|
|
628
|
+
url: z.string().url().optional().describe("Optional service URL."),
|
|
629
|
+
token: z.string().min(1).optional().describe("Optional bearer token."),
|
|
630
|
+
},
|
|
631
|
+
}, async (args) => {
|
|
632
|
+
const cliArgs = ["runtime", "status"];
|
|
633
|
+
if (args.url)
|
|
634
|
+
cliArgs.push("--url", args.url);
|
|
635
|
+
if (args.token)
|
|
636
|
+
cliArgs.push("--token", args.token);
|
|
637
|
+
return cliToolResult(await runInterfCli(cliArgs));
|
|
638
|
+
});
|
|
639
|
+
}
|
|
640
|
+
// ── Projects ────────────────────────────────────────────────────────────
|
|
641
|
+
if (!appProfile) {
|
|
642
|
+
server.registerTool("project_list", {
|
|
643
|
+
title: "List Projects",
|
|
644
|
+
description: "Developer inventory tool. Do not use this as search over a corpus. "
|
|
645
|
+
+ "For user questions over files, create a Project for the current Source unless the user names an existing Project.",
|
|
646
|
+
inputSchema: {},
|
|
647
|
+
}, async () => callAndReturn(connectionArgs, LOCAL_SERVICE_ROUTES.projects));
|
|
648
|
+
}
|
|
649
|
+
server.registerTool("project_create", {
|
|
650
|
+
title: "Create a Project",
|
|
651
|
+
description: "Create a Project for the user's current Source. In the Desktop app profile, this is normally "
|
|
652
|
+
+ "the first Interf action for a new user question over files.",
|
|
653
|
+
inputSchema: {
|
|
654
|
+
id: z.string().min(1).describe("Project id (kebab-case)."),
|
|
236
655
|
source_path: z.string().min(1).describe("Source path visible to the connected instance."),
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
656
|
+
...(!appProfile
|
|
657
|
+
? {
|
|
658
|
+
build_plan_id: z.string().min(1).optional().describe("Optional Build Plan id to select."),
|
|
659
|
+
}
|
|
660
|
+
: {}),
|
|
241
661
|
},
|
|
242
|
-
}, async (args) => callAndReturn(connectionArgs, LOCAL_SERVICE_ROUTES.
|
|
662
|
+
}, async (args) => callAndReturn(connectionArgs, LOCAL_SERVICE_ROUTES.projects, {
|
|
243
663
|
method: "POST",
|
|
244
664
|
body: JSON.stringify({
|
|
245
665
|
id: args.id,
|
|
246
666
|
source: { kind: "local-folder", locator: args.source_path },
|
|
247
667
|
...(args.build_plan_id ? { build_plan_id: args.build_plan_id } : {}),
|
|
248
|
-
...(args.about ? { about: args.about } : {}),
|
|
249
|
-
...(args.requested_artifacts ? { requested_artifacts: args.requested_artifacts } : {}),
|
|
250
|
-
...(args.source_profile ? { source_profile: args.source_profile } : {}),
|
|
251
668
|
}),
|
|
252
669
|
}));
|
|
253
|
-
server.registerTool("
|
|
254
|
-
title: "Show one
|
|
255
|
-
description: "Return
|
|
670
|
+
server.registerTool("project_show", {
|
|
671
|
+
title: "Show one Project",
|
|
672
|
+
description: "Return one Project resource to confirm its Source binding, selected Build Plan, readiness, "
|
|
673
|
+
+ "and latest Context Graph before deciding whether it matches the current task.",
|
|
674
|
+
inputSchema: {
|
|
675
|
+
id: z.string().min(1).describe("Project id."),
|
|
676
|
+
},
|
|
677
|
+
}, async (args) => callAndReturn(connectionArgs, projectResourcePath(args.id)));
|
|
678
|
+
if (!appProfile) {
|
|
679
|
+
server.registerTool("project_select_build_plan", {
|
|
680
|
+
title: "Select a Build Plan for a Project",
|
|
681
|
+
description: "Developer/admin tool. Update the selected Build Plan on a Project. "
|
|
682
|
+
+ "Build Plan draft/improve runs select their resulting Plan automatically.",
|
|
683
|
+
inputSchema: {
|
|
684
|
+
id: z.string().min(1).describe("Project id."),
|
|
685
|
+
build_plan_id: z.string().min(1).describe("Build Plan id to use."),
|
|
686
|
+
},
|
|
687
|
+
}, async (args) => callAndReturn(connectionArgs, projectResourcePath(args.id), {
|
|
688
|
+
method: "PATCH",
|
|
689
|
+
body: JSON.stringify({ build_plan_id: args.build_plan_id }),
|
|
690
|
+
}));
|
|
691
|
+
server.registerTool("project_remove", {
|
|
692
|
+
title: "Remove a Project",
|
|
693
|
+
description: "Developer/admin tool. Delete a Project and its Context Graph.",
|
|
694
|
+
inputSchema: {
|
|
695
|
+
id: z.string().min(1).describe("Project id."),
|
|
696
|
+
},
|
|
697
|
+
}, async (args) => callAndReturn(connectionArgs, projectResourcePath(args.id), {
|
|
698
|
+
method: "DELETE",
|
|
699
|
+
}));
|
|
700
|
+
}
|
|
701
|
+
// ── Build + benchmark/evaluation runs ────────────────────────────
|
|
702
|
+
server.registerTool("project_build", {
|
|
703
|
+
title: "Build Context Graph",
|
|
704
|
+
description: "Run the selected Build Plan for a Project and write a task-specific Context Graph. "
|
|
705
|
+
+ "Use this only after the user has approved the checks/requested Artifacts and Build Plan, "
|
|
706
|
+
+ "unless they explicitly granted autonomy. Returns immediately; poll with runs_status.",
|
|
256
707
|
inputSchema: {
|
|
257
|
-
id: z.string().min(1).describe("
|
|
708
|
+
id: z.string().min(1).describe("Project id."),
|
|
258
709
|
},
|
|
259
|
-
}, async (args) => callAndReturn(connectionArgs,
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
710
|
+
}, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.id, "buildRuns"), { method: "POST", body: "{}" }));
|
|
711
|
+
if (!appProfile) {
|
|
712
|
+
server.registerTool("project_benchmark", {
|
|
713
|
+
title: "Run benchmark/evaluation",
|
|
714
|
+
description: "Developer/evaluation tool. Run the Project's Q&A / fact-check benchmark against the latest Context Graph.",
|
|
715
|
+
inputSchema: {
|
|
716
|
+
id: z.string().min(1).describe("Project id."),
|
|
717
|
+
},
|
|
718
|
+
}, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.id, "verifyRuns"), {
|
|
719
|
+
method: "POST",
|
|
720
|
+
body: JSON.stringify({}),
|
|
721
|
+
}));
|
|
722
|
+
}
|
|
723
|
+
server.registerTool("project_source_files", {
|
|
724
|
+
title: "List Project source files",
|
|
725
|
+
description: "List the Source files bound to a Project to confirm coverage scope. "
|
|
726
|
+
+ "This is not an answer source by itself; prepare or inspect a Context Graph before answering.",
|
|
264
727
|
inputSchema: {
|
|
265
|
-
id: z.string().min(1).describe("
|
|
266
|
-
build_plan_id: z.string().min(1).describe("Build Plan id to use."),
|
|
728
|
+
id: z.string().min(1).describe("Project id."),
|
|
267
729
|
},
|
|
268
|
-
}, async (args) => callAndReturn(connectionArgs,
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
title: "Remove a preparation",
|
|
274
|
-
description: "Delete a Preparation. Verifiable context is removed too.",
|
|
730
|
+
}, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.id, "sourceFiles")));
|
|
731
|
+
server.registerTool("context_graph_show", {
|
|
732
|
+
title: "Show latest Context Graph",
|
|
733
|
+
description: "Inspect the latest Context Graph locator/status for a Project. Reuse it only if it was built for the same Source "
|
|
734
|
+
+ "and task-relevant checks/artifacts; otherwise improve or draft a Build Plan and rebuild. Read artifacts/ handoffs before answering.",
|
|
275
735
|
inputSchema: {
|
|
276
|
-
|
|
736
|
+
project_id: z.string().min(1).describe("Project id."),
|
|
277
737
|
},
|
|
278
|
-
}, async (args) => callAndReturn(connectionArgs,
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
title: "Start a Build run",
|
|
284
|
-
description: "Run the selected Build Plan for a Preparation. Returns the new Build run "
|
|
285
|
-
+ "resource immediately; use runs_status to poll progress and "
|
|
286
|
-
+ "runs_fetch when the run finishes.",
|
|
738
|
+
}, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "contextGraph")));
|
|
739
|
+
server.registerTool("context_graph_file_read", {
|
|
740
|
+
title: "Read a Context Graph file",
|
|
741
|
+
description: "Read one prepared Context Graph file by relative path. Start with artifacts/ task handoffs, "
|
|
742
|
+
+ "then use summaries/ for coverage and knowledge/ for drilldown. Do not use this to search unrelated Projects for answers.",
|
|
287
743
|
inputSchema: {
|
|
288
|
-
|
|
744
|
+
project_id: z.string().min(1).describe("Project id."),
|
|
745
|
+
path: z.string().min(1).describe("Relative path inside the Context Graph root."),
|
|
289
746
|
},
|
|
290
|
-
}, async (args) => callAndReturn(connectionArgs,
|
|
291
|
-
server.registerTool("
|
|
292
|
-
title: "
|
|
293
|
-
description: "
|
|
294
|
-
+ "
|
|
747
|
+
}, async (args) => callAndReturn(connectionArgs, contextGraphFilePath(args.project_id, args.path)));
|
|
748
|
+
server.registerTool("project_traces", {
|
|
749
|
+
title: "Read Project traces",
|
|
750
|
+
description: "Read source-backed traces for the latest Context Graph. Use traces to follow prepared context "
|
|
751
|
+
+ "back to the Source for exact values, chart reads, tables, and provenance-sensitive claims.",
|
|
295
752
|
inputSchema: {
|
|
296
|
-
|
|
753
|
+
project_id: z.string().min(1).describe("Project id."),
|
|
297
754
|
},
|
|
298
|
-
}, async (args) => callAndReturn(connectionArgs,
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
755
|
+
}, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "traces")));
|
|
756
|
+
server.registerTool("project_build_evidence", {
|
|
757
|
+
title: "Read Build evidence",
|
|
758
|
+
description: "Read the latest Build evidence resource for a Project: check rows, Artifact diagnostics, "
|
|
759
|
+
+ "and readiness backing. If evidence is weak or missing, improve the Build Plan instead of answering.",
|
|
760
|
+
inputSchema: {
|
|
761
|
+
project_id: z.string().min(1).describe("Project id."),
|
|
762
|
+
},
|
|
763
|
+
}, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "buildEvidence")));
|
|
764
|
+
server.registerTool("project_artifact_show", {
|
|
765
|
+
title: "Show Project Artifact",
|
|
766
|
+
description: "Return latest status and contributing evidence for one Build Plan-declared Artifact.",
|
|
767
|
+
inputSchema: {
|
|
768
|
+
project_id: z.string().min(1).describe("Project id."),
|
|
769
|
+
artifact_id: z.string().min(1).describe("Artifact id."),
|
|
770
|
+
},
|
|
771
|
+
}, async (args) => callAndReturn(connectionArgs, `${projectSubresourcePath(args.project_id, "artifacts")}/${encodeURIComponent(args.artifact_id)}`));
|
|
302
772
|
// ── Build Plans ────────────────────────────────────────────────────────
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
773
|
+
if (!appProfile) {
|
|
774
|
+
server.registerTool("build_plan_list", {
|
|
775
|
+
title: "List Build Plans",
|
|
776
|
+
description: "Developer/library tool. Do not treat the Build Plan library as an answer source.",
|
|
777
|
+
inputSchema: {},
|
|
778
|
+
}, async () => callAndReturn(connectionArgs, LOCAL_SERVICE_ROUTES.buildPlans));
|
|
779
|
+
server.registerTool("build_plan_show", {
|
|
780
|
+
title: "Show one Build Plan",
|
|
781
|
+
description: "Developer/library tool. Return one Build Plan resource, including requested Artifacts, stages, and checks.",
|
|
782
|
+
inputSchema: {
|
|
783
|
+
build_plan_id: z.string().min(1).describe("Build Plan id."),
|
|
784
|
+
},
|
|
785
|
+
}, async (args) => callAndReturn(connectionArgs, buildPlanResourcePath(args.build_plan_id)));
|
|
786
|
+
server.registerTool("build_plan_file_read", {
|
|
787
|
+
title: "Read a Build Plan file",
|
|
788
|
+
description: "Developer/library tool. Read one file inside a Build Plan package by relative path, such as "
|
|
789
|
+
+ "build-plan.json, build-plan.schema.json, or a stage SKILL.md.",
|
|
790
|
+
inputSchema: {
|
|
791
|
+
build_plan_id: z.string().min(1).describe("Build Plan id."),
|
|
792
|
+
path: z.string().min(1).describe("Relative path inside the Build Plan package."),
|
|
793
|
+
},
|
|
794
|
+
}, async (args) => callAndReturn(connectionArgs, `${buildPlanSubresourcePath(args.build_plan_id, "files")}/${encodeRelativePath(args.path)}`));
|
|
795
|
+
}
|
|
309
796
|
server.registerTool("build_plan_draft", {
|
|
310
797
|
title: "Draft a Build Plan",
|
|
311
|
-
description: "
|
|
312
|
-
+ "Artifacts
|
|
798
|
+
description: "Draft the task-specific Build Plan after the user approves the proposed Context Checks "
|
|
799
|
+
+ "and requested Artifacts. This is the main Interf preparation action before building.",
|
|
313
800
|
inputSchema: {
|
|
314
|
-
|
|
315
|
-
source_folder_path: z.string().min(1).describe("Source folder path visible to the connected instance."),
|
|
801
|
+
project_id: z.string().min(1).describe("Project id."),
|
|
316
802
|
build_plan_id: z.string().min(1).describe("Build Plan id to create."),
|
|
317
803
|
label: z.string().min(1).describe("Human-readable Build Plan label."),
|
|
318
804
|
hint: z.string().min(1).describe("Short Build Plan hint."),
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
805
|
+
intent: z.string().min(1).describe("Agent task this Build Plan should support."),
|
|
806
|
+
context_checks: z.array(BuildPlanContextCheckDraftSchema).optional().describe("Plain-English Context Checks the user approved before drafting."),
|
|
807
|
+
requested_artifacts: z.array(McpRequestedArtifactSchema).optional().describe("Requested Artifacts the user approved before drafting. Use simple titles, descriptions, and plain-English checks."),
|
|
808
|
+
source_context: SourceContextSchema.nullable().optional(),
|
|
809
|
+
...(!appProfile
|
|
810
|
+
? {
|
|
811
|
+
artifact_requirements: z.array(BuildPlanAuthoringArtifactRequirementSchema).optional(),
|
|
812
|
+
}
|
|
813
|
+
: {}),
|
|
323
814
|
},
|
|
324
|
-
}, async (args) => callAndReturn(connectionArgs,
|
|
815
|
+
}, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "buildPlanDraftRuns"), {
|
|
325
816
|
method: "POST",
|
|
326
817
|
body: JSON.stringify({
|
|
327
|
-
|
|
328
|
-
source_folder_path: args.source_folder_path,
|
|
818
|
+
project: args.project_id,
|
|
329
819
|
build_plan_id: args.build_plan_id,
|
|
330
820
|
label: args.label,
|
|
331
821
|
hint: args.hint,
|
|
332
|
-
|
|
333
|
-
...(args.
|
|
334
|
-
...(args.
|
|
335
|
-
...(args.
|
|
822
|
+
intent: args.intent,
|
|
823
|
+
...(args.context_checks ? { checks: args.context_checks } : {}),
|
|
824
|
+
...(args.requested_artifacts ? { requested_artifacts: normalizeRequestedArtifacts(args.requested_artifacts) } : {}),
|
|
825
|
+
...(args.source_context !== undefined ? { source_context: args.source_context } : {}),
|
|
826
|
+
...(!appProfile && args.artifact_requirements ? { artifact_requirements: args.artifact_requirements } : {}),
|
|
336
827
|
}),
|
|
337
828
|
}));
|
|
338
829
|
server.registerTool("build_plan_improve", {
|
|
339
830
|
title: "Improve a Build Plan",
|
|
340
|
-
description: "
|
|
341
|
-
+ "
|
|
831
|
+
description: "Improve the selected Build Plan when the current Context Graph is not ready for the user's task, "
|
|
832
|
+
+ "for example when an Artifact is too coarse, a chart/table was under-extracted, or evidence is missing.",
|
|
342
833
|
inputSchema: {
|
|
343
|
-
|
|
344
|
-
source_folder_path: z.string().min(1).describe("Source folder path visible to the connected instance."),
|
|
834
|
+
project_id: z.string().min(1).describe("Project id."),
|
|
345
835
|
build_plan_id: z.string().min(1).describe("Selected Build Plan id to improve."),
|
|
346
836
|
label: z.string().min(1).describe("Human-readable Build Plan label."),
|
|
347
837
|
hint: z.string().min(1).describe("Short Build Plan hint."),
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
838
|
+
intent: z.string().min(1).describe("Change request or improvement goal."),
|
|
839
|
+
context_checks: z.array(BuildPlanContextCheckDraftSchema).optional().describe("Plain-English Context Checks the improved Plan must satisfy."),
|
|
840
|
+
requested_artifacts: z.array(McpRequestedArtifactSchema).optional().describe("Requested Artifacts for the improved Plan. Use simple titles, descriptions, and plain-English checks."),
|
|
841
|
+
source_context: SourceContextSchema.nullable().optional(),
|
|
842
|
+
...(!appProfile
|
|
843
|
+
? {
|
|
844
|
+
artifact_requirements: z.array(BuildPlanAuthoringArtifactRequirementSchema).optional(),
|
|
845
|
+
}
|
|
846
|
+
: {}),
|
|
352
847
|
},
|
|
353
|
-
}, async (args) => callAndReturn(connectionArgs,
|
|
848
|
+
}, async (args) => callAndReturn(connectionArgs, projectSubresourcePath(args.project_id, "buildPlanImprovementRuns"), {
|
|
354
849
|
method: "POST",
|
|
355
850
|
body: JSON.stringify({
|
|
356
|
-
|
|
357
|
-
source_folder_path: args.source_folder_path,
|
|
851
|
+
project: args.project_id,
|
|
358
852
|
build_plan_id: args.build_plan_id,
|
|
359
853
|
reference_build_plan_id: args.build_plan_id,
|
|
360
854
|
label: args.label,
|
|
361
855
|
hint: args.hint,
|
|
362
|
-
|
|
363
|
-
...(args.
|
|
364
|
-
...(args.
|
|
365
|
-
...(args.
|
|
856
|
+
intent: args.intent,
|
|
857
|
+
...(args.context_checks ? { checks: args.context_checks } : {}),
|
|
858
|
+
...(args.requested_artifacts ? { requested_artifacts: normalizeRequestedArtifacts(args.requested_artifacts) } : {}),
|
|
859
|
+
...(args.source_context !== undefined ? { source_context: args.source_context } : {}),
|
|
860
|
+
...(!appProfile && args.artifact_requirements ? { artifact_requirements: args.artifact_requirements } : {}),
|
|
366
861
|
}),
|
|
367
862
|
}));
|
|
368
863
|
// ── Runs ────────────────────────────────────────────────────────────────
|
|
369
864
|
server.registerTool("runs_status", {
|
|
370
865
|
title: "Get run status",
|
|
371
|
-
description: "Return
|
|
866
|
+
description: "Return a compact run-status receipt for polling. This intentionally omits full trace events, "
|
|
867
|
+
+ "stream logs, and artifact manifests so repeated polls do not fill the agent context window.",
|
|
372
868
|
inputSchema: {
|
|
373
869
|
run_id: z.string().min(1).describe("Run id."),
|
|
374
870
|
},
|
|
375
|
-
}, async (args) =>
|
|
871
|
+
}, async (args) => callAndProject(connectionArgs, runSubresourcePath(args.run_id, "status"), compactRunStatus));
|
|
376
872
|
server.registerTool("runs_watch", {
|
|
377
|
-
title: "Read run events",
|
|
378
|
-
description: "Read
|
|
379
|
-
+ "
|
|
380
|
-
+ "should poll runs_status until the run reaches a terminal state.",
|
|
381
|
-
inputSchema: {
|
|
382
|
-
run_id: z.string().min(1).describe("Run id."),
|
|
383
|
-
},
|
|
384
|
-
}, async (args) => callAndReturn(connectionArgs, `${LOCAL_SERVICE_ROUTES.buildRuns}/${encodeURIComponent(args.run_id)}/events`));
|
|
385
|
-
server.registerTool("runs_cancel", {
|
|
386
|
-
title: "Cancel a run",
|
|
387
|
-
description: "Request cancellation of an in-flight run.",
|
|
873
|
+
title: "Read recent run events",
|
|
874
|
+
description: "Read a bounded tail of run events for debugging or progress detail. Do not use this for polling; "
|
|
875
|
+
+ "poll runs_status until the run reaches a terminal state.",
|
|
388
876
|
inputSchema: {
|
|
389
877
|
run_id: z.string().min(1).describe("Run id."),
|
|
878
|
+
limit: z.number().int().min(1).max(50).default(10).describe("Maximum recent events to return. Defaults to 10; max 50."),
|
|
879
|
+
include_streams: z.boolean().default(false).describe("Include recent log stream chunks. Defaults to false because logs can be verbose."),
|
|
880
|
+
stream_limit: z.number().int().min(1).max(20).default(5).describe("Maximum recent log stream chunks to return when include_streams is true. Defaults to 5; max 20."),
|
|
390
881
|
},
|
|
391
|
-
}, async (args) =>
|
|
882
|
+
}, async (args) => callAndProject(connectionArgs, runResourcePath(args.run_id), (body) => compactRunEvents(body, {
|
|
883
|
+
eventLimit: args.limit,
|
|
884
|
+
includeStreams: args.include_streams,
|
|
885
|
+
streamLimit: args.stream_limit,
|
|
886
|
+
})));
|
|
887
|
+
if (!appProfile) {
|
|
888
|
+
server.registerTool("runs_cancel", {
|
|
889
|
+
title: "Cancel a run",
|
|
890
|
+
description: "Developer/admin tool. Request cancellation of an in-flight run.",
|
|
891
|
+
inputSchema: {
|
|
892
|
+
run_id: z.string().min(1).describe("Run id."),
|
|
893
|
+
},
|
|
894
|
+
}, async (args) => callAndReturn(connectionArgs, `${LOCAL_SERVICE_ROUTES.runs}/${encodeURIComponent(args.run_id)}/cancel`, { method: "POST", body: "{}" }));
|
|
895
|
+
}
|
|
392
896
|
server.registerTool("runs_fetch", {
|
|
393
897
|
title: "Fetch run artifacts",
|
|
394
|
-
description: "Return the artifact manifest for a finished run (
|
|
395
|
-
+ "
|
|
898
|
+
description: "Return the artifact manifest for a finished run (Context Graph, "
|
|
899
|
+
+ "evidence records, logs, run-scoped audit trail).",
|
|
396
900
|
inputSchema: {
|
|
397
901
|
run_id: z.string().min(1).describe("Run id."),
|
|
398
902
|
},
|
|
399
|
-
}, async (args) => callAndReturn(connectionArgs, `${LOCAL_SERVICE_ROUTES.
|
|
903
|
+
}, async (args) => callAndReturn(connectionArgs, `${LOCAL_SERVICE_ROUTES.runs}/${encodeURIComponent(args.run_id)}/artifacts`));
|
|
400
904
|
// ── Instance ────────────────────────────────────────────────────────────
|
|
401
905
|
server.registerTool("instance_status", {
|
|
402
906
|
title: "Show instance status",
|
|
403
|
-
description: "Return the
|
|
404
|
-
+ "
|
|
907
|
+
description: "Return the local service instance resource: started_at, registered "
|
|
908
|
+
+ "Projects, active runs, idle seconds.",
|
|
405
909
|
inputSchema: {},
|
|
406
910
|
}, async () => callAndReturn(connectionArgs, LOCAL_SERVICE_ROUTES.instance));
|
|
407
911
|
}
|
|
408
|
-
async function
|
|
409
|
-
|
|
912
|
+
export async function startInterfMcpServer(args) {
|
|
913
|
+
if (args.transport && args.transport !== "stdio") {
|
|
914
|
+
throw new Error("Only the MCP stdio transport is implemented for the local Interf MCP server.");
|
|
915
|
+
}
|
|
916
|
+
const server = new McpServer({ name: "interf", version: packageVersionFromManifest() }, {
|
|
917
|
+
capabilities: { tools: {} },
|
|
918
|
+
instructions: INTERF_MCP_INSTRUCTIONS,
|
|
919
|
+
});
|
|
410
920
|
registerTools(server, args);
|
|
411
921
|
const transport = new StdioServerTransport();
|
|
412
922
|
await server.connect(transport);
|
|
413
923
|
}
|
|
414
924
|
export const mcpCommand = {
|
|
415
925
|
command: "mcp",
|
|
416
|
-
describe:
|
|
926
|
+
describe: false,
|
|
417
927
|
builder: (yargs) => yargs
|
|
418
928
|
.option("transport", {
|
|
419
929
|
type: "string",
|
|
420
|
-
choices: ["stdio"
|
|
930
|
+
choices: ["stdio"],
|
|
421
931
|
default: "stdio",
|
|
422
932
|
describe: "Transport for the MCP server.",
|
|
933
|
+
})
|
|
934
|
+
.option("profile", {
|
|
935
|
+
type: "string",
|
|
936
|
+
choices: ["headless", "app"],
|
|
937
|
+
default: "headless",
|
|
938
|
+
describe: "Tool profile. App profile hides lifecycle tools because Desktop owns the local service.",
|
|
423
939
|
})
|
|
424
940
|
.option("url", {
|
|
425
941
|
type: "string",
|
|
@@ -430,11 +946,12 @@ export const mcpCommand = {
|
|
|
430
946
|
describe: "Override the active bearer token.",
|
|
431
947
|
}),
|
|
432
948
|
handler: async (args) => {
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
949
|
+
try {
|
|
950
|
+
await startInterfMcpServer(args);
|
|
951
|
+
}
|
|
952
|
+
catch (error) {
|
|
953
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
436
954
|
process.exit(2);
|
|
437
955
|
}
|
|
438
|
-
await startStdioServer(args);
|
|
439
956
|
},
|
|
440
957
|
};
|