@flyingrobots/graft 0.6.1 → 0.7.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/CHANGELOG.md +135 -0
- package/README.md +1 -1
- package/dist/adapters/json-text-decoder.d.ts +3 -0
- package/dist/adapters/json-text-decoder.d.ts.map +1 -0
- package/dist/adapters/json-text-decoder.js +12 -0
- package/dist/adapters/json-text-decoder.js.map +1 -0
- package/dist/adapters/node-paths.d.ts +3 -0
- package/dist/adapters/node-paths.d.ts.map +1 -0
- package/dist/adapters/node-paths.js +29 -0
- package/dist/adapters/node-paths.js.map +1 -0
- package/dist/adapters/repo-paths.d.ts.map +1 -1
- package/dist/adapters/repo-paths.js +40 -5
- package/dist/adapters/repo-paths.js.map +1 -1
- package/dist/api/tool-bridge.d.ts +1 -1
- package/dist/api/tool-bridge.d.ts.map +1 -1
- package/dist/api/tool-bridge.js +1 -1
- package/dist/api/tool-bridge.js.map +1 -1
- package/dist/cli/cli-error.d.ts.map +1 -1
- package/dist/cli/cli-error.js +47 -10
- package/dist/cli/cli-error.js.map +1 -1
- package/dist/cli/command-parser.d.ts +12 -3
- package/dist/cli/command-parser.d.ts.map +1 -1
- package/dist/cli/command-parser.js +161 -2
- package/dist/cli/command-parser.js.map +1 -1
- package/dist/cli/daemon-status-model.d.ts +87 -0
- package/dist/cli/daemon-status-model.d.ts.map +1 -0
- package/dist/cli/daemon-status-model.js +142 -0
- package/dist/cli/daemon-status-model.js.map +1 -0
- package/dist/cli/daemon-status-render.d.ts +3 -0
- package/dist/cli/daemon-status-render.d.ts.map +1 -0
- package/dist/cli/daemon-status-render.js +100 -0
- package/dist/cli/daemon-status-render.js.map +1 -0
- package/dist/cli/daemon-status.d.ts +7 -0
- package/dist/cli/daemon-status.d.ts.map +1 -0
- package/dist/cli/daemon-status.js +79 -0
- package/dist/cli/daemon-status.js.map +1 -0
- package/dist/cli/git-graft-enhance-model.d.ts +67 -0
- package/dist/cli/git-graft-enhance-model.d.ts.map +1 -0
- package/dist/cli/git-graft-enhance-model.js +55 -0
- package/dist/cli/git-graft-enhance-model.js.map +1 -0
- package/dist/cli/git-graft-enhance-render.d.ts +3 -0
- package/dist/cli/git-graft-enhance-render.d.ts.map +1 -0
- package/dist/cli/git-graft-enhance-render.js +29 -0
- package/dist/cli/git-graft-enhance-render.js.map +1 -0
- package/dist/cli/git-graft-enhance.d.ts +14 -0
- package/dist/cli/git-graft-enhance.d.ts.map +1 -0
- package/dist/cli/git-graft-enhance.js +29 -0
- package/dist/cli/git-graft-enhance.js.map +1 -0
- package/dist/cli/index-cmd.d.ts.map +1 -1
- package/dist/cli/index-cmd.js +18 -21
- package/dist/cli/index-cmd.js.map +1 -1
- package/dist/cli/index-model.d.ts +5 -9
- package/dist/cli/index-model.d.ts.map +1 -1
- package/dist/cli/index-model.js +20 -18
- package/dist/cli/index-model.js.map +1 -1
- package/dist/cli/init-client-config.d.ts +12 -7
- package/dist/cli/init-client-config.d.ts.map +1 -1
- package/dist/cli/init-client-config.js +105 -43
- package/dist/cli/init-client-config.js.map +1 -1
- package/dist/cli/init-model.d.ts +9 -2
- package/dist/cli/init-model.d.ts.map +1 -1
- package/dist/cli/init-model.js +52 -4
- package/dist/cli/init-model.js.map +1 -1
- package/dist/cli/init-render.d.ts.map +1 -1
- package/dist/cli/init-render.js +2 -2
- package/dist/cli/init-render.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +11 -9
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/json-document.d.ts +5 -0
- package/dist/cli/json-document.d.ts.map +1 -1
- package/dist/cli/json-document.js +9 -0
- package/dist/cli/json-document.js.map +1 -1
- package/dist/cli/main.d.ts +7 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +49 -7
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/migrate-local-history.d.ts.map +1 -1
- package/dist/cli/migrate-local-history.js +3 -2
- package/dist/cli/migrate-local-history.js.map +1 -1
- package/dist/cli/peer-command.d.ts +1 -1
- package/dist/cli/peer-command.d.ts.map +1 -1
- package/dist/cli/peer-command.js +1 -1
- package/dist/cli/peer-command.js.map +1 -1
- package/dist/contracts/capabilities.d.ts +5 -5
- package/dist/contracts/capabilities.d.ts.map +1 -1
- package/dist/contracts/capabilities.js +89 -0
- package/dist/contracts/capabilities.js.map +1 -1
- package/dist/contracts/causal-ontology.d.ts +17 -17
- package/dist/contracts/json-object.d.ts +0 -1
- package/dist/contracts/json-object.d.ts.map +1 -1
- package/dist/contracts/json-object.js +0 -10
- package/dist/contracts/json-object.js.map +1 -1
- package/dist/contracts/output-schema-cli.d.ts +277 -25
- package/dist/contracts/output-schema-cli.d.ts.map +1 -1
- package/dist/contracts/output-schema-cli.js +35 -3
- package/dist/contracts/output-schema-cli.js.map +1 -1
- package/dist/contracts/output-schema-fragments.d.ts +212 -87
- package/dist/contracts/output-schema-fragments.d.ts.map +1 -1
- package/dist/contracts/output-schema-fragments.js +49 -2
- package/dist/contracts/output-schema-fragments.js.map +1 -1
- package/dist/contracts/output-schema-mcp.d.ts +372 -47
- package/dist/contracts/output-schema-mcp.d.ts.map +1 -1
- package/dist/contracts/output-schema-mcp.js +217 -1
- package/dist/contracts/output-schema-mcp.js.map +1 -1
- package/dist/contracts/output-schema-meta.d.ts +2 -2
- package/dist/contracts/output-schema-meta.d.ts.map +1 -1
- package/dist/contracts/output-schemas.d.ts +7 -7
- package/dist/contracts/output-schemas.d.ts.map +1 -1
- package/dist/contracts/output-schemas.js +294 -6
- package/dist/contracts/output-schemas.js.map +1 -1
- package/dist/git/diff.d.ts +11 -0
- package/dist/git/diff.d.ts.map +1 -1
- package/dist/git/diff.js +50 -6
- package/dist/git/diff.js.map +1 -1
- package/dist/mcp/burden.d.ts.map +1 -1
- package/dist/mcp/burden.js +9 -0
- package/dist/mcp/burden.js.map +1 -1
- package/dist/mcp/context.d.ts +3 -2
- package/dist/mcp/context.d.ts.map +1 -1
- package/dist/mcp/context.js +2 -37
- package/dist/mcp/context.js.map +1 -1
- package/dist/mcp/daemon-server.d.ts +2 -0
- package/dist/mcp/daemon-server.d.ts.map +1 -1
- package/dist/mcp/daemon-server.js +6 -1
- package/dist/mcp/daemon-server.js.map +1 -1
- package/dist/mcp/daemon-session-host.d.ts +1 -0
- package/dist/mcp/daemon-session-host.d.ts.map +1 -1
- package/dist/mcp/daemon-session-host.js +3 -0
- package/dist/mcp/daemon-session-host.js.map +1 -1
- package/dist/mcp/daemon-stdio-bridge.d.ts +1 -0
- package/dist/mcp/daemon-stdio-bridge.d.ts.map +1 -1
- package/dist/mcp/daemon-stdio-bridge.js +1 -0
- package/dist/mcp/daemon-stdio-bridge.js.map +1 -1
- package/dist/mcp/monitor-tick-job.d.ts +1 -0
- package/dist/mcp/monitor-tick-job.d.ts.map +1 -1
- package/dist/mcp/monitor-tick-job.js +84 -29
- package/dist/mcp/monitor-tick-job.js.map +1 -1
- package/dist/mcp/monitor-types.d.ts +1 -1
- package/dist/mcp/monitor-types.d.ts.map +1 -1
- package/dist/mcp/persisted-local-history-graph.d.ts +2 -2
- package/dist/mcp/persisted-local-history-graph.d.ts.map +1 -1
- package/dist/mcp/persisted-local-history-graph.js +3 -2
- package/dist/mcp/persisted-local-history-graph.js.map +1 -1
- package/dist/mcp/persisted-local-history.d.ts +5 -5
- package/dist/mcp/persisted-local-history.js +2 -2
- package/dist/mcp/persisted-local-history.js.map +1 -1
- package/dist/mcp/persistent-monitor-runtime.d.ts +1 -0
- package/dist/mcp/persistent-monitor-runtime.d.ts.map +1 -1
- package/dist/mcp/persistent-monitor-runtime.js +35 -0
- package/dist/mcp/persistent-monitor-runtime.js.map +1 -1
- package/dist/mcp/repo-tool-worker-context.d.ts.map +1 -1
- package/dist/mcp/repo-tool-worker-context.js +5 -2
- package/dist/mcp/repo-tool-worker-context.js.map +1 -1
- package/dist/mcp/server-context.d.ts.map +1 -1
- package/dist/mcp/server-context.js +13 -0
- package/dist/mcp/server-context.js.map +1 -1
- package/dist/mcp/server-tool-access.d.ts +1 -1
- package/dist/mcp/server-tool-access.d.ts.map +1 -1
- package/dist/mcp/server-tool-access.js +3 -1
- package/dist/mcp/server-tool-access.js.map +1 -1
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +5 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tool-registry.d.ts.map +1 -1
- package/dist/mcp/tool-registry.js +18 -0
- package/dist/mcp/tool-registry.js.map +1 -1
- package/dist/mcp/tools/code-find.d.ts.map +1 -1
- package/dist/mcp/tools/code-find.js +20 -0
- package/dist/mcp/tools/code-find.js.map +1 -1
- package/dist/mcp/tools/code-show.d.ts.map +1 -1
- package/dist/mcp/tools/code-show.js +24 -0
- package/dist/mcp/tools/code-show.js.map +1 -1
- package/dist/mcp/tools/diagnostic-models.d.ts +2 -0
- package/dist/mcp/tools/diagnostic-models.d.ts.map +1 -1
- package/dist/mcp/tools/doctor.d.ts.map +1 -1
- package/dist/mcp/tools/doctor.js +18 -1
- package/dist/mcp/tools/doctor.js.map +1 -1
- package/dist/mcp/tools/export-surface-diff.d.ts +3 -0
- package/dist/mcp/tools/export-surface-diff.d.ts.map +1 -0
- package/dist/mcp/tools/export-surface-diff.js +24 -0
- package/dist/mcp/tools/export-surface-diff.js.map +1 -0
- package/dist/mcp/tools/file-outline.js +1 -1
- package/dist/mcp/tools/file-outline.js.map +1 -1
- package/dist/mcp/tools/graft-edit.d.ts +3 -0
- package/dist/mcp/tools/graft-edit.d.ts.map +1 -0
- package/dist/mcp/tools/graft-edit.js +192 -0
- package/dist/mcp/tools/graft-edit.js.map +1 -0
- package/dist/mcp/tools/knowledge-map.d.ts +3 -0
- package/dist/mcp/tools/knowledge-map.d.ts.map +1 -0
- package/dist/mcp/tools/knowledge-map.js +31 -0
- package/dist/mcp/tools/knowledge-map.js.map +1 -0
- package/dist/mcp/tools/monitor-nudge.d.ts +3 -0
- package/dist/mcp/tools/monitor-nudge.d.ts.map +1 -0
- package/dist/mcp/tools/monitor-nudge.js +17 -0
- package/dist/mcp/tools/monitor-nudge.js.map +1 -0
- package/dist/mcp/tools/precision-warp.d.ts +3 -3
- package/dist/mcp/tools/precision-warp.d.ts.map +1 -1
- package/dist/mcp/tools/precision-warp.js +24 -15
- package/dist/mcp/tools/precision-warp.js.map +1 -1
- package/dist/mcp/tools/refactor-difficulty.d.ts +3 -0
- package/dist/mcp/tools/refactor-difficulty.d.ts.map +1 -0
- package/dist/mcp/tools/refactor-difficulty.js +36 -0
- package/dist/mcp/tools/refactor-difficulty.js.map +1 -0
- package/dist/mcp/tools/safe-read.js +2 -2
- package/dist/mcp/tools/safe-read.js.map +1 -1
- package/dist/mcp/tools/structural-blame.d.ts +3 -0
- package/dist/mcp/tools/structural-blame.d.ts.map +1 -0
- package/dist/mcp/tools/structural-blame.js +44 -0
- package/dist/mcp/tools/structural-blame.js.map +1 -0
- package/dist/mcp/tools/structural-churn.d.ts +3 -0
- package/dist/mcp/tools/structural-churn.d.ts.map +1 -0
- package/dist/mcp/tools/structural-churn.js +28 -0
- package/dist/mcp/tools/structural-churn.js.map +1 -0
- package/dist/mcp/tools/structural-log.d.ts +3 -0
- package/dist/mcp/tools/structural-log.d.ts.map +1 -0
- package/dist/mcp/tools/structural-log.js +38 -0
- package/dist/mcp/tools/structural-log.js.map +1 -0
- package/dist/mcp/tools/structural-review.d.ts +3 -0
- package/dist/mcp/tools/structural-review.d.ts.map +1 -0
- package/dist/mcp/tools/structural-review.js +55 -0
- package/dist/mcp/tools/structural-review.js.map +1 -0
- package/dist/mcp/warp-pool.d.ts +4 -4
- package/dist/mcp/warp-pool.d.ts.map +1 -1
- package/dist/mcp/warp-pool.js.map +1 -1
- package/dist/mcp/workspace-router-model.d.ts +2 -2
- package/dist/mcp/workspace-router-model.d.ts.map +1 -1
- package/dist/mcp/workspace-router-runtime.d.ts +3 -3
- package/dist/mcp/workspace-router-runtime.d.ts.map +1 -1
- package/dist/mcp/workspace-router-runtime.js +4 -1
- package/dist/mcp/workspace-router-runtime.js.map +1 -1
- package/dist/mcp/workspace-router.d.ts +3 -2
- package/dist/mcp/workspace-router.d.ts.map +1 -1
- package/dist/mcp/workspace-router.js +6 -0
- package/dist/mcp/workspace-router.js.map +1 -1
- package/dist/operations/adaptive-projection.d.ts +22 -0
- package/dist/operations/adaptive-projection.d.ts.map +1 -0
- package/dist/operations/adaptive-projection.js +36 -0
- package/dist/operations/adaptive-projection.js.map +1 -0
- package/dist/operations/agent-handoff.d.ts +25 -0
- package/dist/operations/agent-handoff.d.ts.map +1 -0
- package/dist/operations/agent-handoff.js +36 -0
- package/dist/operations/agent-handoff.js.map +1 -0
- package/dist/operations/capture-range.d.ts +33 -0
- package/dist/operations/capture-range.d.ts.map +1 -0
- package/dist/operations/capture-range.js +45 -0
- package/dist/operations/capture-range.js.map +1 -0
- package/dist/operations/conversation-primer.d.ts +27 -0
- package/dist/operations/conversation-primer.d.ts.map +1 -0
- package/dist/operations/conversation-primer.js +52 -0
- package/dist/operations/conversation-primer.js.map +1 -0
- package/dist/operations/cross-session-resume.d.ts +28 -0
- package/dist/operations/cross-session-resume.d.ts.map +1 -0
- package/dist/operations/cross-session-resume.js +79 -0
- package/dist/operations/cross-session-resume.js.map +1 -0
- package/dist/operations/deterministic-replay.d.ts +39 -0
- package/dist/operations/deterministic-replay.d.ts.map +1 -0
- package/dist/operations/deterministic-replay.js +90 -0
- package/dist/operations/deterministic-replay.js.map +1 -0
- package/dist/operations/export-surface-diff.d.ts +36 -0
- package/dist/operations/export-surface-diff.d.ts.map +1 -0
- package/dist/operations/export-surface-diff.js +298 -0
- package/dist/operations/export-surface-diff.js.map +1 -0
- package/dist/operations/footprint-parallelism.d.ts +25 -0
- package/dist/operations/footprint-parallelism.d.ts.map +1 -0
- package/dist/operations/footprint-parallelism.js +79 -0
- package/dist/operations/footprint-parallelism.js.map +1 -0
- package/dist/operations/graft-diff.d.ts.map +1 -1
- package/dist/operations/graft-diff.js +14 -7
- package/dist/operations/graft-diff.js.map +1 -1
- package/dist/operations/horizon-of-readability.d.ts +23 -0
- package/dist/operations/horizon-of-readability.d.ts.map +1 -0
- package/dist/operations/horizon-of-readability.js +39 -0
- package/dist/operations/horizon-of-readability.js.map +1 -0
- package/dist/operations/import-reference-impact.d.ts +13 -0
- package/dist/operations/import-reference-impact.d.ts.map +1 -0
- package/dist/operations/import-reference-impact.js +101 -0
- package/dist/operations/import-reference-impact.js.map +1 -0
- package/dist/operations/knowledge-map.d.ts +30 -0
- package/dist/operations/knowledge-map.d.ts.map +1 -0
- package/dist/operations/knowledge-map.js +64 -0
- package/dist/operations/knowledge-map.js.map +1 -0
- package/dist/operations/observation-cache.d.ts +8 -2
- package/dist/operations/observation-cache.d.ts.map +1 -1
- package/dist/operations/observation-cache.js +17 -5
- package/dist/operations/observation-cache.js.map +1 -1
- package/dist/operations/projection-safety.d.ts +31 -0
- package/dist/operations/projection-safety.d.ts.map +1 -0
- package/dist/operations/projection-safety.js +77 -0
- package/dist/operations/projection-safety.js.map +1 -0
- package/dist/operations/repo-workspace.js +3 -3
- package/dist/operations/repo-workspace.js.map +1 -1
- package/dist/operations/semantic-drift.d.ts +27 -0
- package/dist/operations/semantic-drift.d.ts.map +1 -0
- package/dist/operations/semantic-drift.js +46 -0
- package/dist/operations/semantic-drift.js.map +1 -0
- package/dist/operations/session-filtration.d.ts +36 -0
- package/dist/operations/session-filtration.d.ts.map +1 -0
- package/dist/operations/session-filtration.js +48 -0
- package/dist/operations/session-filtration.js.map +1 -0
- package/dist/operations/session-replay.d.ts +17 -0
- package/dist/operations/session-replay.d.ts.map +1 -0
- package/dist/operations/session-replay.js +59 -0
- package/dist/operations/session-replay.js.map +1 -0
- package/dist/operations/sludge-detector.d.ts +45 -0
- package/dist/operations/sludge-detector.d.ts.map +1 -0
- package/dist/operations/sludge-detector.js +278 -0
- package/dist/operations/sludge-detector.js.map +1 -0
- package/dist/operations/structural-blame.d.ts +67 -0
- package/dist/operations/structural-blame.d.ts.map +1 -0
- package/dist/operations/structural-blame.js +111 -0
- package/dist/operations/structural-blame.js.map +1 -0
- package/dist/operations/structural-review.d.ts +47 -0
- package/dist/operations/structural-review.d.ts.map +1 -0
- package/dist/operations/structural-review.js +225 -0
- package/dist/operations/structural-review.js.map +1 -0
- package/dist/operations/teaching-hints.d.ts +18 -0
- package/dist/operations/teaching-hints.d.ts.map +1 -0
- package/dist/operations/teaching-hints.js +35 -0
- package/dist/operations/teaching-hints.js.map +1 -0
- package/dist/parser/diff.d.ts +2 -0
- package/dist/parser/diff.d.ts.map +1 -1
- package/dist/parser/diff.js +7 -0
- package/dist/parser/diff.js.map +1 -1
- package/dist/ports/paths.d.ts +17 -0
- package/dist/ports/paths.d.ts.map +1 -0
- package/dist/ports/{warp.js → paths.js} +2 -2
- package/dist/ports/paths.js.map +1 -0
- package/dist/warp/ast-emitter.d.ts +28 -0
- package/dist/warp/ast-emitter.d.ts.map +1 -0
- package/dist/warp/ast-emitter.js +90 -0
- package/dist/warp/ast-emitter.js.map +1 -0
- package/dist/warp/ast-import-resolver.d.ts +13 -0
- package/dist/warp/ast-import-resolver.d.ts.map +1 -0
- package/dist/warp/ast-import-resolver.js +259 -0
- package/dist/warp/ast-import-resolver.js.map +1 -0
- package/dist/warp/commit-meta.d.ts +8 -0
- package/dist/warp/commit-meta.d.ts.map +1 -0
- package/dist/warp/commit-meta.js +13 -0
- package/dist/warp/commit-meta.js.map +1 -0
- package/dist/warp/context.d.ts +10 -0
- package/dist/warp/context.d.ts.map +1 -0
- package/dist/warp/context.js +26 -0
- package/dist/warp/context.js.map +1 -0
- package/dist/warp/dead-symbols.d.ts +40 -0
- package/dist/warp/dead-symbols.d.ts.map +1 -0
- package/dist/warp/dead-symbols.js +127 -0
- package/dist/warp/dead-symbols.js.map +1 -0
- package/dist/warp/drift-sentinel.d.ts +30 -0
- package/dist/warp/drift-sentinel.d.ts.map +1 -0
- package/dist/warp/drift-sentinel.js +65 -0
- package/dist/warp/drift-sentinel.js.map +1 -0
- package/dist/warp/index-head.d.ts +32 -0
- package/dist/warp/index-head.d.ts.map +1 -0
- package/dist/warp/index-head.js +245 -0
- package/dist/warp/index-head.js.map +1 -0
- package/dist/warp/observers.d.ts +6 -6
- package/dist/warp/observers.d.ts.map +1 -1
- package/dist/warp/observers.js +5 -4
- package/dist/warp/observers.js.map +1 -1
- package/dist/warp/open.d.ts +5 -4
- package/dist/warp/open.d.ts.map +1 -1
- package/dist/warp/open.js +24 -49
- package/dist/warp/open.js.map +1 -1
- package/dist/warp/outline-diff-trailer.d.ts +26 -0
- package/dist/warp/outline-diff-trailer.d.ts.map +1 -0
- package/dist/warp/outline-diff-trailer.js +68 -0
- package/dist/warp/outline-diff-trailer.js.map +1 -0
- package/dist/warp/refactor-difficulty.d.ts +38 -0
- package/dist/warp/refactor-difficulty.d.ts.map +1 -0
- package/dist/warp/refactor-difficulty.js +169 -0
- package/dist/warp/refactor-difficulty.js.map +1 -0
- package/dist/warp/references.d.ts +22 -0
- package/dist/warp/references.d.ts.map +1 -0
- package/dist/warp/references.js +57 -0
- package/dist/warp/references.js.map +1 -0
- package/dist/warp/stale-docs.d.ts +56 -0
- package/dist/warp/stale-docs.d.ts.map +1 -0
- package/dist/warp/stale-docs.js +149 -0
- package/dist/warp/stale-docs.js.map +1 -0
- package/dist/warp/structural-drift-detection.d.ts +49 -0
- package/dist/warp/structural-drift-detection.d.ts.map +1 -0
- package/dist/warp/structural-drift-detection.js +51 -0
- package/dist/warp/structural-drift-detection.js.map +1 -0
- package/dist/warp/structural-queries.d.ts +49 -0
- package/dist/warp/structural-queries.d.ts.map +1 -0
- package/dist/warp/structural-queries.js +175 -0
- package/dist/warp/structural-queries.js.map +1 -0
- package/dist/warp/symbol-timeline.d.ts +34 -0
- package/dist/warp/symbol-timeline.d.ts.map +1 -0
- package/dist/warp/symbol-timeline.js +127 -0
- package/dist/warp/symbol-timeline.js.map +1 -0
- package/dist/warp/traverse-hydrate.d.ts +23 -0
- package/dist/warp/traverse-hydrate.d.ts.map +1 -0
- package/dist/warp/traverse-hydrate.js +39 -0
- package/dist/warp/traverse-hydrate.js.map +1 -0
- package/dist/warp/warp-reference-count.d.ts +19 -0
- package/dist/warp/warp-reference-count.d.ts.map +1 -0
- package/dist/warp/warp-reference-count.js +32 -0
- package/dist/warp/warp-reference-count.js.map +1 -0
- package/dist/warp/warp-structural-blame.d.ts +20 -0
- package/dist/warp/warp-structural-blame.d.ts.map +1 -0
- package/dist/warp/warp-structural-blame.js +43 -0
- package/dist/warp/warp-structural-blame.js.map +1 -0
- package/dist/warp/warp-structural-churn.d.ts +30 -0
- package/dist/warp/warp-structural-churn.d.ts.map +1 -0
- package/dist/warp/warp-structural-churn.js +213 -0
- package/dist/warp/warp-structural-churn.js.map +1 -0
- package/dist/warp/warp-structural-log.d.ts +35 -0
- package/dist/warp/warp-structural-log.d.ts.map +1 -0
- package/dist/warp/warp-structural-log.js +104 -0
- package/dist/warp/warp-structural-log.js.map +1 -0
- package/docs/CLI.md +68 -4
- package/docs/MCP.md +23 -0
- package/docs/SETUP.md +101 -20
- package/package.json +5 -3
- package/src/adapters/json-text-decoder.ts +11 -0
- package/src/adapters/node-paths.ts +35 -0
- package/src/adapters/repo-paths.ts +45 -4
- package/src/api/tool-bridge.ts +2 -1
- package/src/cli/cli-error.ts +49 -10
- package/src/cli/command-parser.ts +185 -3
- package/src/cli/daemon-status-model.ts +238 -0
- package/src/cli/daemon-status-render.ts +102 -0
- package/src/cli/daemon-status.ts +100 -0
- package/src/cli/git-graft-enhance-model.ts +131 -0
- package/src/cli/git-graft-enhance-render.ts +33 -0
- package/src/cli/git-graft-enhance.ts +54 -0
- package/src/cli/index-cmd.ts +18 -22
- package/src/cli/index-model.ts +21 -22
- package/src/cli/init-client-config.ts +167 -38
- package/src/cli/init-model.ts +57 -2
- package/src/cli/init-render.ts +2 -2
- package/src/cli/init.ts +11 -9
- package/src/cli/json-document.ts +11 -0
- package/src/cli/main.ts +53 -6
- package/src/cli/migrate-local-history.ts +3 -2
- package/src/cli/peer-command.ts +2 -1
- package/src/contracts/capabilities.ts +90 -0
- package/src/contracts/json-object.ts +1 -11
- package/src/contracts/output-schema-cli.ts +36 -3
- package/src/contracts/output-schema-fragments.ts +52 -2
- package/src/contracts/output-schema-mcp.ts +219 -0
- package/src/contracts/output-schemas.ts +300 -6
- package/src/git/diff.ts +61 -0
- package/src/mcp/burden.ts +9 -0
- package/src/mcp/context.ts +5 -42
- package/src/mcp/daemon-server.ts +8 -1
- package/src/mcp/daemon-session-host.ts +4 -0
- package/src/mcp/daemon-stdio-bridge.ts +2 -0
- package/src/mcp/monitor-tick-job.ts +90 -39
- package/src/mcp/monitor-types.ts +1 -1
- package/src/mcp/persisted-local-history-graph.ts +5 -4
- package/src/mcp/persisted-local-history.ts +2 -2
- package/src/mcp/persistent-monitor-runtime.ts +37 -0
- package/src/mcp/repo-tool-worker-context.ts +5 -2
- package/src/mcp/server-context.ts +15 -2
- package/src/mcp/server-tool-access.ts +4 -1
- package/src/mcp/server.ts +8 -3
- package/src/mcp/tool-registry.ts +18 -0
- package/src/mcp/tools/code-find.ts +23 -0
- package/src/mcp/tools/code-show.ts +27 -0
- package/src/mcp/tools/diagnostic-models.ts +2 -0
- package/src/mcp/tools/doctor.ts +18 -1
- package/src/mcp/tools/export-surface-diff.ts +26 -0
- package/src/mcp/tools/file-outline.ts +1 -1
- package/src/mcp/tools/graft-edit.ts +276 -0
- package/src/mcp/tools/knowledge-map.ts +34 -0
- package/src/mcp/tools/monitor-nudge.ts +19 -0
- package/src/mcp/tools/precision-warp.ts +27 -16
- package/src/mcp/tools/refactor-difficulty.ts +42 -0
- package/src/mcp/tools/safe-read.ts +2 -2
- package/src/mcp/tools/structural-blame.ts +55 -0
- package/src/mcp/tools/structural-churn.ts +28 -0
- package/src/mcp/tools/structural-log.ts +41 -0
- package/src/mcp/tools/structural-review.ts +63 -0
- package/src/mcp/warp-pool.ts +6 -6
- package/src/mcp/workspace-router-model.ts +2 -2
- package/src/mcp/workspace-router-runtime.ts +11 -8
- package/src/mcp/workspace-router.ts +9 -2
- package/src/operations/adaptive-projection.ts +54 -0
- package/src/operations/agent-handoff.ts +59 -0
- package/src/operations/capture-range.ts +64 -0
- package/src/operations/conversation-primer.ts +82 -0
- package/src/operations/cross-session-resume.ts +104 -0
- package/src/operations/deterministic-replay.ts +143 -0
- package/src/operations/export-surface-diff.ts +355 -0
- package/src/operations/footprint-parallelism.ts +98 -0
- package/src/operations/graft-diff.ts +14 -7
- package/src/operations/horizon-of-readability.ts +60 -0
- package/src/operations/import-reference-impact.ts +143 -0
- package/src/operations/knowledge-map.ts +96 -0
- package/src/operations/observation-cache.ts +20 -4
- package/src/operations/projection-safety.ts +111 -0
- package/src/operations/repo-workspace.ts +3 -3
- package/src/operations/semantic-drift.ts +70 -0
- package/src/operations/session-filtration.ts +76 -0
- package/src/operations/session-replay.ts +73 -0
- package/src/operations/sludge-detector.ts +356 -0
- package/src/operations/structural-blame.ts +197 -0
- package/src/operations/structural-review.ts +317 -0
- package/src/operations/teaching-hints.ts +52 -0
- package/src/parser/diff.ts +7 -0
- package/src/ports/paths.ts +22 -0
- package/src/warp/ast-emitter.ts +133 -0
- package/src/warp/ast-import-resolver.ts +333 -0
- package/src/warp/commit-meta.ts +19 -0
- package/src/warp/context.ts +48 -0
- package/src/warp/dead-symbols.ts +174 -0
- package/src/warp/drift-sentinel.ts +101 -0
- package/src/warp/index-head.ts +348 -0
- package/src/warp/observers.ts +8 -7
- package/src/warp/open.ts +40 -66
- package/src/warp/outline-diff-trailer.ts +100 -0
- package/src/warp/plumbing.d.ts +11 -2
- package/src/warp/refactor-difficulty.ts +257 -0
- package/src/warp/references.ts +77 -0
- package/src/warp/stale-docs.ts +210 -0
- package/src/warp/structural-drift-detection.ts +97 -0
- package/src/warp/structural-queries.ts +258 -0
- package/src/warp/symbol-timeline.ts +209 -0
- package/src/warp/traverse-hydrate.ts +61 -0
- package/src/warp/warp-reference-count.ts +47 -0
- package/src/warp/warp-structural-blame.ts +65 -0
- package/src/warp/warp-structural-churn.ts +309 -0
- package/src/warp/warp-structural-log.ts +149 -0
- package/dist/ports/warp.d.ts +0 -45
- package/dist/ports/warp.d.ts.map +0 -1
- package/dist/ports/warp.js.map +0 -1
- package/dist/warp/identity-resolver.d.ts +0 -14
- package/dist/warp/identity-resolver.d.ts.map +0 -1
- package/dist/warp/identity-resolver.js +0 -31
- package/dist/warp/identity-resolver.js.map +0 -1
- package/dist/warp/indexer-git.d.ts +0 -22
- package/dist/warp/indexer-git.d.ts.map +0 -1
- package/dist/warp/indexer-git.js +0 -148
- package/dist/warp/indexer-git.js.map +0 -1
- package/dist/warp/indexer-graph.d.ts +0 -17
- package/dist/warp/indexer-graph.d.ts.map +0 -1
- package/dist/warp/indexer-graph.js +0 -179
- package/dist/warp/indexer-graph.js.map +0 -1
- package/dist/warp/indexer-model.d.ts +0 -51
- package/dist/warp/indexer-model.d.ts.map +0 -1
- package/dist/warp/indexer-model.js +0 -21
- package/dist/warp/indexer-model.js.map +0 -1
- package/dist/warp/indexer.d.ts +0 -9
- package/dist/warp/indexer.d.ts.map +0 -1
- package/dist/warp/indexer.js +0 -112
- package/dist/warp/indexer.js.map +0 -1
- package/dist/warp/symbol-identity.d.ts +0 -11
- package/dist/warp/symbol-identity.d.ts.map +0 -1
- package/dist/warp/symbol-identity.js +0 -67
- package/dist/warp/symbol-identity.js.map +0 -1
- package/src/ports/warp.ts +0 -55
- package/src/warp/identity-resolver.ts +0 -35
- package/src/warp/indexer-git.ts +0 -182
- package/src/warp/indexer-graph.ts +0 -276
- package/src/warp/indexer-model.ts +0 -69
- package/src/warp/indexer.ts +0 -186
- package/src/warp/symbol-identity.ts +0 -100
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DEFAULT_INDEX_MAX_FILES_PER_CALL, indexHead } from "../warp/index-head.js";
|
|
2
2
|
import { nodeGit } from "../adapters/node-git.js";
|
|
3
|
+
import { nodePathOps } from "../adapters/node-paths.js";
|
|
3
4
|
import { openWarp } from "../warp/open.js";
|
|
4
5
|
|
|
5
6
|
export interface MonitorTickWorkerJob {
|
|
@@ -7,6 +8,7 @@ export interface MonitorTickWorkerJob {
|
|
|
7
8
|
readonly worktreeRoot: string;
|
|
8
9
|
readonly writerId: string;
|
|
9
10
|
readonly lastIndexedCommit: string | null;
|
|
11
|
+
readonly maxFilesPerBatch?: number | undefined;
|
|
10
12
|
}
|
|
11
13
|
|
|
12
14
|
export type MonitorTickWorkerResult =
|
|
@@ -26,8 +28,8 @@ export type MonitorTickWorkerResult =
|
|
|
26
28
|
readonly backlogCommits: number;
|
|
27
29
|
};
|
|
28
30
|
|
|
29
|
-
async function
|
|
30
|
-
const result = await nodeGit.run({ cwd, args });
|
|
31
|
+
async function readHeadCommit(cwd: string): Promise<string | null> {
|
|
32
|
+
const result = await nodeGit.run({ cwd, args: ["rev-parse", "--verify", "HEAD"] });
|
|
31
33
|
if (result.error !== undefined || result.status !== 0) {
|
|
32
34
|
return null;
|
|
33
35
|
}
|
|
@@ -35,68 +37,117 @@ async function readGit(cwd: string, args: readonly string[]): Promise<string | n
|
|
|
35
37
|
return trimmed.length === 0 ? null : trimmed;
|
|
36
38
|
}
|
|
37
39
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
+
function parseGitPathList(output: string): readonly string[] {
|
|
41
|
+
const seen = new Set<string>();
|
|
42
|
+
const paths: string[] = [];
|
|
43
|
+
for (const line of output.split("\n")) {
|
|
44
|
+
const filePath = line.trim();
|
|
45
|
+
if (filePath.length === 0 || seen.has(filePath)) continue;
|
|
46
|
+
seen.add(filePath);
|
|
47
|
+
paths.push(filePath);
|
|
48
|
+
}
|
|
49
|
+
return paths;
|
|
40
50
|
}
|
|
41
51
|
|
|
42
|
-
async function
|
|
43
|
-
cwd:
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const
|
|
52
|
-
|
|
52
|
+
async function listTrackedPaths(cwd: string): Promise<readonly string[]> {
|
|
53
|
+
const result = await nodeGit.run({ cwd, args: ["ls-files"] });
|
|
54
|
+
if (result.error !== undefined || result.status !== 0) {
|
|
55
|
+
throw result.error ?? new Error(result.stderr.trim() || `git ls-files exited with status ${String(result.status)}`);
|
|
56
|
+
}
|
|
57
|
+
return parseGitPathList(result.stdout);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async function listChangedPaths(cwd: string, base: string, head: string): Promise<readonly string[] | null> {
|
|
61
|
+
const result = await nodeGit.run({ cwd, args: ["diff", "--name-only", `${base}..${head}`] });
|
|
62
|
+
if (result.error !== undefined || result.status !== 0) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
return parseGitPathList(result.stdout);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async function monitorIndexPaths(input: {
|
|
69
|
+
readonly cwd: string;
|
|
70
|
+
readonly currentHead: string | null;
|
|
71
|
+
readonly lastIndexedCommit: string | null;
|
|
72
|
+
}): Promise<readonly string[]> {
|
|
73
|
+
if (input.currentHead === null) return [];
|
|
74
|
+
if (input.lastIndexedCommit !== null) {
|
|
75
|
+
const changedPaths = await listChangedPaths(input.cwd, input.lastIndexedCommit, input.currentHead);
|
|
76
|
+
if (changedPaths !== null) return changedPaths;
|
|
77
|
+
}
|
|
78
|
+
return listTrackedPaths(input.cwd);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function pathBatches(paths: readonly string[], size: number): readonly (readonly string[])[] {
|
|
82
|
+
const batches: (readonly string[])[] = [];
|
|
83
|
+
for (let index = 0; index < paths.length; index += size) {
|
|
84
|
+
batches.push(paths.slice(index, index + size));
|
|
85
|
+
}
|
|
86
|
+
return batches;
|
|
53
87
|
}
|
|
54
88
|
|
|
55
89
|
export async function runMonitorTickJob(job: MonitorTickWorkerJob): Promise<MonitorTickWorkerResult> {
|
|
56
90
|
const headAtStart = await readHeadCommit(job.worktreeRoot);
|
|
57
91
|
|
|
92
|
+
// ── Tick ceiling: skip indexing when HEAD hasn't moved ───────────
|
|
93
|
+
// When HEAD equals the last indexed commit (including both null for
|
|
94
|
+
// empty repos), there is nothing to index. Short-circuit before
|
|
95
|
+
// opening WARP or calling indexCommits to keep idle ticks near-zero-cost.
|
|
96
|
+
if (headAtStart === job.lastIndexedCommit) {
|
|
97
|
+
return {
|
|
98
|
+
ok: true,
|
|
99
|
+
headAtStart,
|
|
100
|
+
currentHead: headAtStart,
|
|
101
|
+
lastIndexedCommit: job.lastIndexedCommit,
|
|
102
|
+
backlogCommits: 0,
|
|
103
|
+
commitsIndexed: 0,
|
|
104
|
+
patchesWritten: 0,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
58
108
|
try {
|
|
59
|
-
const
|
|
109
|
+
const app = await openWarp({
|
|
60
110
|
cwd: job.worktreeRoot,
|
|
61
111
|
writerId: job.writerId,
|
|
62
112
|
});
|
|
63
|
-
const
|
|
113
|
+
const ctx = { app, strandId: null };
|
|
114
|
+
const paths = await monitorIndexPaths({
|
|
64
115
|
cwd: job.worktreeRoot,
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
...(headAtStart !== null ? { to: headAtStart } : {}),
|
|
116
|
+
currentHead: headAtStart,
|
|
117
|
+
lastIndexedCommit: job.lastIndexedCommit,
|
|
68
118
|
});
|
|
69
|
-
|
|
70
|
-
|
|
119
|
+
let commitsIndexed = 0;
|
|
120
|
+
let patchesWritten = 0;
|
|
121
|
+
const maxFilesPerBatch = job.maxFilesPerBatch ?? DEFAULT_INDEX_MAX_FILES_PER_CALL;
|
|
122
|
+
for (const batch of pathBatches(paths, maxFilesPerBatch)) {
|
|
123
|
+
const result = await indexHead({
|
|
124
|
+
cwd: job.worktreeRoot,
|
|
125
|
+
git: nodeGit,
|
|
126
|
+
pathOps: nodePathOps,
|
|
127
|
+
ctx,
|
|
128
|
+
paths: batch,
|
|
129
|
+
maxFilesPerCall: maxFilesPerBatch,
|
|
130
|
+
});
|
|
131
|
+
commitsIndexed += result.filesIndexed;
|
|
132
|
+
patchesWritten += result.nodesEmitted;
|
|
71
133
|
}
|
|
72
134
|
const currentHead = await readHeadCommit(job.worktreeRoot);
|
|
73
|
-
const lastIndexedCommit = headAtStart ?? job.lastIndexedCommit;
|
|
74
|
-
const backlogCommits = await countPendingCommits(
|
|
75
|
-
job.worktreeRoot,
|
|
76
|
-
lastIndexedCommit,
|
|
77
|
-
currentHead,
|
|
78
|
-
);
|
|
79
135
|
return {
|
|
80
136
|
ok: true,
|
|
81
137
|
headAtStart,
|
|
82
138
|
currentHead,
|
|
83
|
-
lastIndexedCommit,
|
|
84
|
-
backlogCommits,
|
|
85
|
-
commitsIndexed
|
|
86
|
-
patchesWritten
|
|
139
|
+
lastIndexedCommit: headAtStart,
|
|
140
|
+
backlogCommits: 0,
|
|
141
|
+
commitsIndexed,
|
|
142
|
+
patchesWritten,
|
|
87
143
|
};
|
|
88
144
|
} catch (error) {
|
|
89
145
|
const currentHead = await readHeadCommit(job.worktreeRoot);
|
|
90
|
-
const backlogCommits = await countPendingCommits(
|
|
91
|
-
job.worktreeRoot,
|
|
92
|
-
job.lastIndexedCommit,
|
|
93
|
-
currentHead,
|
|
94
|
-
);
|
|
95
146
|
return {
|
|
96
147
|
ok: false,
|
|
97
148
|
error: error instanceof Error ? error.message : String(error),
|
|
98
149
|
currentHead,
|
|
99
|
-
backlogCommits,
|
|
150
|
+
backlogCommits: 0,
|
|
100
151
|
};
|
|
101
152
|
}
|
|
102
153
|
}
|
package/src/mcp/monitor-types.ts
CHANGED
|
@@ -18,7 +18,7 @@ export const DEFAULT_POLL_INTERVAL_MS = 5_000;
|
|
|
18
18
|
export type MonitorLifecycleState = "running" | "paused" | "stopped";
|
|
19
19
|
export type MonitorHealth = "ok" | "lagging" | "error" | "unauthorized" | "paused" | "stopped";
|
|
20
20
|
export type MonitorWorkerKind = "git_poll_indexer";
|
|
21
|
-
export type MonitorAction = "start" | "pause" | "resume" | "stop";
|
|
21
|
+
export type MonitorAction = "start" | "pause" | "resume" | "stop" | "nudge";
|
|
22
22
|
|
|
23
23
|
// ── Persistence schemas ────────────────────────────────────────────
|
|
24
24
|
|
|
@@ -6,10 +6,11 @@ import type {
|
|
|
6
6
|
CausalRegion,
|
|
7
7
|
Evidence,
|
|
8
8
|
} from "../contracts/causal-ontology.js";
|
|
9
|
-
import type {
|
|
9
|
+
import type { WarpContext } from "../warp/context.js";
|
|
10
|
+
import { patchGraph } from "../warp/context.js";
|
|
10
11
|
import type { RuntimeStagedTargetFullFile } from "./runtime-staged-target.js";
|
|
11
12
|
|
|
12
|
-
export type PersistedLocalHistoryGraphWarp =
|
|
13
|
+
export type PersistedLocalHistoryGraphWarp = WarpContext;
|
|
13
14
|
|
|
14
15
|
export interface PersistedLocalHistoryGraphContext {
|
|
15
16
|
readonly warp: PersistedLocalHistoryGraphWarp;
|
|
@@ -161,10 +162,10 @@ async function commitAccumulator(
|
|
|
161
162
|
const ids = [...accumulator.nodes.keys()];
|
|
162
163
|
const existence = new Map<string, boolean>();
|
|
163
164
|
for (const id of ids) {
|
|
164
|
-
existence.set(id, await graph.warp.hasNode(id));
|
|
165
|
+
existence.set(id, await graph.warp.app.core().hasNode(id));
|
|
165
166
|
}
|
|
166
167
|
|
|
167
|
-
await graph.warp
|
|
168
|
+
await patchGraph(graph.warp, (patch) => {
|
|
168
169
|
for (const [id, props] of accumulator.nodes.entries()) {
|
|
169
170
|
const exists = existence.get(id) ?? false;
|
|
170
171
|
if (!exists) {
|
|
@@ -462,7 +462,7 @@ async function loadObservedLocalHistoryGraph(
|
|
|
462
462
|
return null;
|
|
463
463
|
}
|
|
464
464
|
|
|
465
|
-
const observer = await graph.warp.observer({
|
|
465
|
+
const observer = await graph.warp.app.observer({
|
|
466
466
|
match: [...LOCAL_HISTORY_GRAPH_MATCH],
|
|
467
467
|
expose: [...LOCAL_HISTORY_GRAPH_EXPOSE],
|
|
468
468
|
});
|
|
@@ -980,7 +980,7 @@ async function hasLocalHistoryEventNode(
|
|
|
980
980
|
graph: PersistedLocalHistoryGraphContext,
|
|
981
981
|
eventId: string,
|
|
982
982
|
): Promise<boolean> {
|
|
983
|
-
return graph.warp.hasNode(`lh:event:${eventId}`);
|
|
983
|
+
return graph.warp.app.core().hasNode(`lh:event:${eventId}`);
|
|
984
984
|
}
|
|
985
985
|
|
|
986
986
|
export async function migrateLegacyPersistedLocalHistoryToGraph(input: {
|
|
@@ -200,6 +200,43 @@ export class PersistentMonitorRuntime {
|
|
|
200
200
|
return this.transitionMonitor("stop", request, "stopped");
|
|
201
201
|
}
|
|
202
202
|
|
|
203
|
+
async nudgeMonitor(request: WorkspaceBindRequest): Promise<MonitorActionResult> {
|
|
204
|
+
await this.ensureLoaded();
|
|
205
|
+
const resolved = await this.resolveAuthorizedRepo(request);
|
|
206
|
+
if ("errorCode" in resolved) {
|
|
207
|
+
return {
|
|
208
|
+
ok: false,
|
|
209
|
+
action: "nudge",
|
|
210
|
+
created: false,
|
|
211
|
+
changed: false,
|
|
212
|
+
errorCode: resolved.errorCode,
|
|
213
|
+
error: resolved.error,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
const { repoId } = resolved;
|
|
217
|
+
const record = this.records.get(repoId);
|
|
218
|
+
if (record?.lifecycleState !== "running") {
|
|
219
|
+
return {
|
|
220
|
+
ok: false,
|
|
221
|
+
action: "nudge",
|
|
222
|
+
created: false,
|
|
223
|
+
changed: false,
|
|
224
|
+
errorCode: "not_running",
|
|
225
|
+
error: "Monitor is not running — start it first.",
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
// Fire an immediate tick without changing lifecycle state
|
|
229
|
+
await this.runTick(repoId).catch(() => undefined);
|
|
230
|
+
return {
|
|
231
|
+
ok: true,
|
|
232
|
+
action: "nudge" as MonitorAction,
|
|
233
|
+
created: false,
|
|
234
|
+
changed: false,
|
|
235
|
+
status: await this.getStatusByRepoId(repoId),
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
|
|
203
240
|
// ── Private: lifecycle transitions ─────────────────────────────
|
|
204
241
|
|
|
205
242
|
private async transitionMonitor(
|
|
@@ -118,8 +118,8 @@ export function buildRepoToolWorkerContext(
|
|
|
118
118
|
// captures footprint via AsyncLocalStorage in the invocation engine.
|
|
119
119
|
},
|
|
120
120
|
resolvePath: createRepoPathResolver(job.projectRoot),
|
|
121
|
-
getWarp() {
|
|
122
|
-
return openWarp({ cwd: job.projectRoot, writerId: job.writerId });
|
|
121
|
+
async getWarp() {
|
|
122
|
+
return { app: await openWarp({ cwd: job.projectRoot, writerId: job.writerId }), strandId: null };
|
|
123
123
|
},
|
|
124
124
|
getRepoState() {
|
|
125
125
|
return job.repoState;
|
|
@@ -179,6 +179,9 @@ export function buildRepoToolWorkerContext(
|
|
|
179
179
|
resumeMonitor() {
|
|
180
180
|
return unsupported("resumeMonitor");
|
|
181
181
|
},
|
|
182
|
+
nudgeMonitor() {
|
|
183
|
+
return unsupported("nudgeMonitor");
|
|
184
|
+
},
|
|
182
185
|
stopMonitor() {
|
|
183
186
|
return unsupported("stopMonitor");
|
|
184
187
|
},
|
|
@@ -3,7 +3,7 @@ import type { CanonicalJsonCodec } from "../adapters/canonical-json.js";
|
|
|
3
3
|
import type { FileSystem } from "../ports/filesystem.js";
|
|
4
4
|
import type { ProcessRunner } from "../ports/process-runner.js";
|
|
5
5
|
import type { GitClient } from "../ports/git.js";
|
|
6
|
-
import type {
|
|
6
|
+
import type { WarpContext } from "../warp/context.js";
|
|
7
7
|
import type { ToolContext, ToolDefinition } from "./context.js";
|
|
8
8
|
import type { McpToolResult } from "./receipt.js";
|
|
9
9
|
import type { RunCaptureConfig } from "./run-capture-config.js";
|
|
@@ -92,7 +92,7 @@ export function buildToolContext(deps: ToolContextDeps): ToolContext {
|
|
|
92
92
|
git: deps.git,
|
|
93
93
|
runCapture: deps.runCapture,
|
|
94
94
|
observability: deps.observability,
|
|
95
|
-
getWarp(): Promise<
|
|
95
|
+
getWarp(): Promise<WarpContext> {
|
|
96
96
|
return getActiveExecutionContext()?.getWarp() ?? workspaceRouter.getWarp();
|
|
97
97
|
},
|
|
98
98
|
getRepoState() {
|
|
@@ -195,6 +195,19 @@ export function buildToolContext(deps: ToolContextDeps): ToolContext {
|
|
|
195
195
|
}
|
|
196
196
|
return monitorRuntime.resumeMonitor(request);
|
|
197
197
|
},
|
|
198
|
+
nudgeMonitor(request) {
|
|
199
|
+
if (monitorRuntime === null) {
|
|
200
|
+
return Promise.resolve({
|
|
201
|
+
ok: false,
|
|
202
|
+
action: "nudge",
|
|
203
|
+
created: false,
|
|
204
|
+
changed: false,
|
|
205
|
+
errorCode: "no_daemon",
|
|
206
|
+
error: "Monitor runtime is not available.",
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
return monitorRuntime.nudgeMonitor(request);
|
|
210
|
+
},
|
|
198
211
|
stopMonitor(request) {
|
|
199
212
|
if (monitorRuntime === null) {
|
|
200
213
|
throw new Error("monitor_stop is only available in daemon mode");
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { McpToolResult } from "./receipt.js";
|
|
2
|
-
import {
|
|
2
|
+
import type { JsonObject } from "../contracts/json-object.js";
|
|
3
|
+
import { parseJsonTextObject } from "../adapters/json-text-decoder.js";
|
|
3
4
|
import { evaluateMcpPolicy } from "./policy.js";
|
|
4
5
|
import { RefusedResult } from "../policy/types.js";
|
|
5
6
|
import { OFFLOADED_DAEMON_REPO_TOOL_NAMES, type OffloadedRepoToolName } from "./repo-tool-job.js";
|
|
@@ -18,6 +19,7 @@ const daemonAlwaysAvailableTools = new Set<string>([
|
|
|
18
19
|
"monitor_start",
|
|
19
20
|
"monitor_pause",
|
|
20
21
|
"monitor_resume",
|
|
22
|
+
"monitor_nudge",
|
|
21
23
|
"monitor_stop",
|
|
22
24
|
"workspace_authorize",
|
|
23
25
|
"workspace_authorizations",
|
|
@@ -37,6 +39,7 @@ export const repoStateOptionalTools = new Set<string>([
|
|
|
37
39
|
"monitor_start",
|
|
38
40
|
"monitor_pause",
|
|
39
41
|
"monitor_resume",
|
|
42
|
+
"monitor_nudge",
|
|
40
43
|
"monitor_stop",
|
|
41
44
|
"workspace_authorize",
|
|
42
45
|
"workspace_authorizations",
|
package/src/mcp/server.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { CanonicalJsonCodec } from "../adapters/canonical-json.js";
|
|
|
10
10
|
import { nodeProcessRunner } from "../adapters/node-process-runner.js";
|
|
11
11
|
import type { ProcessRunner } from "../ports/process-runner.js";
|
|
12
12
|
import { nodeGit } from "../adapters/node-git.js";
|
|
13
|
+
import type { GitClient } from "../ports/git.js";
|
|
13
14
|
import { openWarp } from "../warp/open.js";
|
|
14
15
|
import type { RunCaptureConfig } from "./run-capture-config.js";
|
|
15
16
|
import { resolveRunCaptureConfig } from "./run-capture-config.js";
|
|
@@ -64,6 +65,8 @@ export interface CreateGraftServerOptions {
|
|
|
64
65
|
daemonWorkerPool?: DaemonWorkerPool;
|
|
65
66
|
daemonRuntime?: (() => DaemonRuntimeDescriptor) | undefined;
|
|
66
67
|
processRunner?: ProcessRunner;
|
|
68
|
+
git?: GitClient;
|
|
69
|
+
persistedLocalHistoryGraph?: boolean;
|
|
67
70
|
}
|
|
68
71
|
|
|
69
72
|
export function createGraftServer(options: CreateGraftServerOptions = {}): GraftServer {
|
|
@@ -88,6 +91,7 @@ export function createGraftServer(options: CreateGraftServerOptions = {}): Graft
|
|
|
88
91
|
...(options.env !== undefined ? { env: options.env } : {}),
|
|
89
92
|
...(options.runtimeObservability !== undefined ? { overrides: options.runtimeObservability } : {}),
|
|
90
93
|
});
|
|
94
|
+
const gitClient = options.git ?? nodeGit;
|
|
91
95
|
const runtimeLogger = new RuntimeEventLogger({
|
|
92
96
|
fs: nodeFs,
|
|
93
97
|
codec,
|
|
@@ -107,7 +111,7 @@ export function createGraftServer(options: CreateGraftServerOptions = {}): Graft
|
|
|
107
111
|
? (options.daemonControlPlane ?? new DaemonControlPlane({
|
|
108
112
|
fs: nodeFs,
|
|
109
113
|
codec,
|
|
110
|
-
git:
|
|
114
|
+
git: gitClient,
|
|
111
115
|
graftDir,
|
|
112
116
|
}))
|
|
113
117
|
: null;
|
|
@@ -116,7 +120,7 @@ export function createGraftServer(options: CreateGraftServerOptions = {}): Graft
|
|
|
116
120
|
: (options.monitorRuntime ?? new PersistentMonitorRuntime({
|
|
117
121
|
fs: nodeFs,
|
|
118
122
|
codec,
|
|
119
|
-
git:
|
|
123
|
+
git: gitClient,
|
|
120
124
|
graftDir,
|
|
121
125
|
controlPlane: daemonControlPlane,
|
|
122
126
|
scheduler: daemonScheduler,
|
|
@@ -139,7 +143,7 @@ export function createGraftServer(options: CreateGraftServerOptions = {}): Graft
|
|
|
139
143
|
const workspaceRouter = new WorkspaceRouter({
|
|
140
144
|
mode,
|
|
141
145
|
fs: nodeFs,
|
|
142
|
-
git:
|
|
146
|
+
git: gitClient,
|
|
143
147
|
graftDir,
|
|
144
148
|
...(projectRoot !== undefined ? { projectRoot } : {}),
|
|
145
149
|
warpPool,
|
|
@@ -148,6 +152,7 @@ export function createGraftServer(options: CreateGraftServerOptions = {}): Graft
|
|
|
148
152
|
...(daemonControlPlane !== null ? { authorizationPolicy: daemonControlPlane } : {}),
|
|
149
153
|
...(daemonControlPlane !== null ? { sharedAttachPolicy: daemonControlPlane } : {}),
|
|
150
154
|
persistedLocalHistory,
|
|
155
|
+
persistedLocalHistoryGraph: options.persistedLocalHistoryGraph ?? true,
|
|
151
156
|
});
|
|
152
157
|
const daemonRepoOverview = daemonControlPlane !== null && monitorRuntime !== null
|
|
153
158
|
? new DaemonRepoOverview({
|
package/src/mcp/tool-registry.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ToolDefinition } from "./context.js";
|
|
2
2
|
|
|
3
3
|
import { safeReadTool } from "./tools/safe-read.js";
|
|
4
|
+
import { graftEditTool } from "./tools/graft-edit.js";
|
|
4
5
|
import { fileOutlineTool } from "./tools/file-outline.js";
|
|
5
6
|
import { readRangeTool } from "./tools/read-range.js";
|
|
6
7
|
import { changedSinceTool } from "./tools/changed-since.js";
|
|
@@ -16,15 +17,23 @@ import { mapTool } from "./tools/map.js";
|
|
|
16
17
|
import { codeShowTool } from "./tools/code-show.js";
|
|
17
18
|
import { codeFindTool } from "./tools/code-find.js";
|
|
18
19
|
import { codeRefsTool } from "./tools/code-refs.js";
|
|
20
|
+
import { structuralChurnTool } from "./tools/structural-churn.js";
|
|
21
|
+
import { exportSurfaceDiffTool } from "./tools/export-surface-diff.js";
|
|
22
|
+
import { structuralLogTool } from "./tools/structural-log.js";
|
|
23
|
+
import { structuralBlameTool } from "./tools/structural-blame.js";
|
|
24
|
+
import { refactorDifficultyTool } from "./tools/refactor-difficulty.js";
|
|
25
|
+
import { structuralReviewTool } from "./tools/structural-review.js";
|
|
19
26
|
import { daemonMonitorsTool } from "./tools/daemon-monitors.js";
|
|
20
27
|
import { daemonReposTool } from "./tools/daemon-repos.js";
|
|
21
28
|
import { daemonSessionsTool } from "./tools/daemon-sessions.js";
|
|
22
29
|
import { daemonStatusTool } from "./tools/daemon-status.js";
|
|
23
30
|
import { monitorPauseTool } from "./tools/monitor-pause.js";
|
|
24
31
|
import { monitorResumeTool } from "./tools/monitor-resume.js";
|
|
32
|
+
import { monitorNudgeTool } from "./tools/monitor-nudge.js";
|
|
25
33
|
import { monitorStartTool } from "./tools/monitor-start.js";
|
|
26
34
|
import { monitorStopTool } from "./tools/monitor-stop.js";
|
|
27
35
|
import { activityViewTool } from "./tools/activity-view.js";
|
|
36
|
+
import { knowledgeMapTool } from "./tools/knowledge-map.js";
|
|
28
37
|
import { causalStatusTool } from "./tools/causal-status.js";
|
|
29
38
|
import { causalAttachTool } from "./tools/causal-attach.js";
|
|
30
39
|
import { workspaceAuthorizeTool } from "./tools/workspace-authorize.js";
|
|
@@ -36,6 +45,7 @@ import { workspaceRebindTool } from "./tools/workspace-rebind.js";
|
|
|
36
45
|
|
|
37
46
|
export const TOOL_REGISTRY: readonly ToolDefinition[] = [
|
|
38
47
|
safeReadTool,
|
|
48
|
+
graftEditTool,
|
|
39
49
|
fileOutlineTool,
|
|
40
50
|
readRangeTool,
|
|
41
51
|
changedSinceTool,
|
|
@@ -55,6 +65,13 @@ export const TOOL_REGISTRY: readonly ToolDefinition[] = [
|
|
|
55
65
|
codeShowTool,
|
|
56
66
|
codeFindTool,
|
|
57
67
|
codeRefsTool,
|
|
68
|
+
structuralChurnTool,
|
|
69
|
+
exportSurfaceDiffTool,
|
|
70
|
+
structuralLogTool,
|
|
71
|
+
structuralBlameTool,
|
|
72
|
+
refactorDifficultyTool,
|
|
73
|
+
structuralReviewTool,
|
|
74
|
+
knowledgeMapTool,
|
|
58
75
|
];
|
|
59
76
|
|
|
60
77
|
export const DAEMON_TOOL_REGISTRY: readonly ToolDefinition[] = [
|
|
@@ -65,6 +82,7 @@ export const DAEMON_TOOL_REGISTRY: readonly ToolDefinition[] = [
|
|
|
65
82
|
monitorStartTool,
|
|
66
83
|
monitorPauseTool,
|
|
67
84
|
monitorResumeTool,
|
|
85
|
+
monitorNudgeTool,
|
|
68
86
|
monitorStopTool,
|
|
69
87
|
workspaceAuthorizeTool,
|
|
70
88
|
workspaceAuthorizationsTool,
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import type { ToolDefinition, ToolContext, ToolHandler } from "../context.js";
|
|
3
|
+
import { nodePathOps } from "../../adapters/node-paths.js";
|
|
4
|
+
import { indexHead } from "../../warp/index-head.js";
|
|
3
5
|
import { GitFileQuery, listGitFiles } from "./git-files.js";
|
|
4
6
|
import {
|
|
5
7
|
evaluatePrecisionPolicy,
|
|
@@ -57,6 +59,26 @@ interface CodeFindOptions {
|
|
|
57
59
|
readonly allowWarp: boolean;
|
|
58
60
|
}
|
|
59
61
|
|
|
62
|
+
async function lazyIndexReadPaths(
|
|
63
|
+
ctx: ToolContext,
|
|
64
|
+
paths: readonly string[],
|
|
65
|
+
dirty: boolean,
|
|
66
|
+
): Promise<void> {
|
|
67
|
+
if (dirty || paths.length === 0) return;
|
|
68
|
+
try {
|
|
69
|
+
const warp = await ctx.getWarp();
|
|
70
|
+
await indexHead({
|
|
71
|
+
cwd: ctx.projectRoot,
|
|
72
|
+
git: ctx.git,
|
|
73
|
+
pathOps: nodePathOps,
|
|
74
|
+
ctx: warp,
|
|
75
|
+
paths: [...new Set(paths)],
|
|
76
|
+
});
|
|
77
|
+
} catch {
|
|
78
|
+
// Lazy indexing must never turn a successful read/search into a failure.
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
60
82
|
export async function runCodeFind(
|
|
61
83
|
ctx: ToolContext,
|
|
62
84
|
args: Record<string, unknown>,
|
|
@@ -140,6 +162,7 @@ export async function runCodeFind(
|
|
|
140
162
|
paths: [...new Set(visibleMatches.map((m) => m.path))],
|
|
141
163
|
symbols: visibleMatches.map((m) => m.name),
|
|
142
164
|
});
|
|
165
|
+
await lazyIndexReadPaths(ctx, visibleMatches.map((m) => m.path), repoState.dirty);
|
|
143
166
|
|
|
144
167
|
return ctx.respond("code_find", {
|
|
145
168
|
query: request.query,
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { readRange } from "../../operations/read-range.js";
|
|
3
3
|
import type { ToolDefinition, ToolContext, ToolHandler } from "../context.js";
|
|
4
|
+
import { nodePathOps } from "../../adapters/node-paths.js";
|
|
5
|
+
import { indexHead } from "../../warp/index-head.js";
|
|
4
6
|
import { listProjectFiles } from "./git-files.js";
|
|
5
7
|
import {
|
|
6
8
|
evaluatePrecisionPolicy,
|
|
@@ -21,6 +23,26 @@ interface CodeShowOptions {
|
|
|
21
23
|
readonly allowWarp: boolean;
|
|
22
24
|
}
|
|
23
25
|
|
|
26
|
+
async function lazyIndexReadPaths(
|
|
27
|
+
ctx: ToolContext,
|
|
28
|
+
paths: readonly string[],
|
|
29
|
+
dirty: boolean,
|
|
30
|
+
): Promise<void> {
|
|
31
|
+
if (dirty || paths.length === 0) return;
|
|
32
|
+
try {
|
|
33
|
+
const warp = await ctx.getWarp();
|
|
34
|
+
await indexHead({
|
|
35
|
+
cwd: ctx.projectRoot,
|
|
36
|
+
git: ctx.git,
|
|
37
|
+
pathOps: nodePathOps,
|
|
38
|
+
ctx: warp,
|
|
39
|
+
paths: [...new Set(paths)],
|
|
40
|
+
});
|
|
41
|
+
} catch {
|
|
42
|
+
// Lazy indexing is a cache refresh. It must not break the read response.
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
24
46
|
export async function runCodeShow(
|
|
25
47
|
ctx: ToolContext,
|
|
26
48
|
args: Record<string, unknown>,
|
|
@@ -186,6 +208,7 @@ export async function runCodeShow(
|
|
|
186
208
|
paths: [...new Set(visibleLocations.map((m) => m.path))],
|
|
187
209
|
symbols: visibleLocations.map((m) => m.name),
|
|
188
210
|
});
|
|
211
|
+
await lazyIndexReadPaths(ctx, visibleLocations.map((m) => m.path), repoState.dirty);
|
|
189
212
|
return ctx.respond("code_show", {
|
|
190
213
|
symbol: symbolName,
|
|
191
214
|
ambiguous: true,
|
|
@@ -197,6 +220,9 @@ export async function runCodeShow(
|
|
|
197
220
|
|
|
198
221
|
const loc = visibleLocations[0];
|
|
199
222
|
if (loc?.startLine === undefined || loc.endLine === undefined) {
|
|
223
|
+
if (loc?.path !== undefined) {
|
|
224
|
+
await lazyIndexReadPaths(ctx, [loc.path], repoState.dirty);
|
|
225
|
+
}
|
|
200
226
|
return ctx.respond("code_show", {
|
|
201
227
|
symbol: symbolName,
|
|
202
228
|
kind: loc?.kind,
|
|
@@ -228,6 +254,7 @@ export async function runCodeShow(
|
|
|
228
254
|
symbols: [loc.name],
|
|
229
255
|
regions: [{ path: loc.path, startLine: loc.startLine, endLine: loc.endLine }],
|
|
230
256
|
});
|
|
257
|
+
await lazyIndexReadPaths(ctx, [loc.path], repoState.dirty);
|
|
231
258
|
|
|
232
259
|
return ctx.respond("code_show", {
|
|
233
260
|
symbol: loc.name,
|
|
@@ -12,6 +12,7 @@ import type {
|
|
|
12
12
|
} from "../persisted-local-history.js";
|
|
13
13
|
import type { RuntimeWorkspaceOverlayFooting } from "../runtime-workspace-overlay.js";
|
|
14
14
|
import type { CausalSurfaceNextAction } from "../../contracts/causal-surface-next-action.js";
|
|
15
|
+
import type { SludgeReport } from "../../operations/sludge-detector.js";
|
|
15
16
|
|
|
16
17
|
export interface SetBudgetResponse {
|
|
17
18
|
readonly budget: {
|
|
@@ -72,6 +73,7 @@ export interface DoctorResponse {
|
|
|
72
73
|
readonly attribution: PersistedLocalHistorySummary["attribution"];
|
|
73
74
|
readonly persistedLocalHistory: PersistedLocalHistorySummary;
|
|
74
75
|
readonly recommendedNextAction: CausalSurfaceNextAction;
|
|
76
|
+
readonly sludge?: SludgeReport | undefined;
|
|
75
77
|
}
|
|
76
78
|
|
|
77
79
|
export interface RunCapturePolicyBoundary {
|
package/src/mcp/tools/doctor.ts
CHANGED
|
@@ -5,14 +5,30 @@ import { deriveCausalSurfaceNextAction } from "../semantic-transition-guidance.j
|
|
|
5
5
|
import type { ToolDefinition, ToolHandler } from "../context.js";
|
|
6
6
|
import { toJsonObject } from "../../operations/result-dto.js";
|
|
7
7
|
import type { DoctorResponse } from "./diagnostic-models.js";
|
|
8
|
+
import { detectSludge } from "../../operations/sludge-detector.js";
|
|
9
|
+
import { z } from "zod";
|
|
8
10
|
|
|
9
11
|
export const doctorTool: ToolDefinition = {
|
|
10
12
|
name: "doctor",
|
|
11
13
|
description:
|
|
12
14
|
"Runtime health check. Shows project root, parser status, active " +
|
|
13
15
|
"thresholds, session depth, message count, and burden summary.",
|
|
16
|
+
schema: {
|
|
17
|
+
sludge: z.boolean().optional(),
|
|
18
|
+
path: z.string().optional(),
|
|
19
|
+
},
|
|
14
20
|
createHandler(): ToolHandler {
|
|
15
|
-
return async (
|
|
21
|
+
return async (args, ctx) => {
|
|
22
|
+
const pathArg = typeof args["path"] === "string" ? args["path"] : undefined;
|
|
23
|
+
const sludge = args["sludge"] === true
|
|
24
|
+
? await detectSludge({
|
|
25
|
+
cwd: ctx.projectRoot,
|
|
26
|
+
fs: ctx.fs,
|
|
27
|
+
git: ctx.git,
|
|
28
|
+
resolvePath: (filePath) => ctx.resolvePath(filePath),
|
|
29
|
+
...(pathArg !== undefined ? { path: pathArg } : {}),
|
|
30
|
+
})
|
|
31
|
+
: undefined;
|
|
16
32
|
const repoState = ctx.getRepoState();
|
|
17
33
|
const causalContext = ctx.getCausalContext();
|
|
18
34
|
const workspaceOverlayFooting = await ctx.getWorkspaceOverlayFooting();
|
|
@@ -59,6 +75,7 @@ export const doctorTool: ToolDefinition = {
|
|
|
59
75
|
attribution: persistedLocalHistory.attribution,
|
|
60
76
|
persistedLocalHistory,
|
|
61
77
|
recommendedNextAction,
|
|
78
|
+
...(sludge !== undefined ? { sludge } : {}),
|
|
62
79
|
};
|
|
63
80
|
return ctx.respond("doctor", toJsonObject(response));
|
|
64
81
|
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { exportSurfaceDiff, exportSurfaceDiffToJson } from "../../operations/export-surface-diff.js";
|
|
3
|
+
import type { ToolDefinition, ToolHandler } from "../context.js";
|
|
4
|
+
|
|
5
|
+
export const exportSurfaceDiffTool: ToolDefinition = {
|
|
6
|
+
name: "graft_exports",
|
|
7
|
+
description:
|
|
8
|
+
"Export surface diff — what changed in the public API between two " +
|
|
9
|
+
"refs? Identifies added, removed, and signature-changed exported " +
|
|
10
|
+
"symbols and derives semver impact.",
|
|
11
|
+
schema: {
|
|
12
|
+
base: z.string().optional(),
|
|
13
|
+
head: z.string().optional(),
|
|
14
|
+
},
|
|
15
|
+
createHandler(): ToolHandler {
|
|
16
|
+
return async (args, ctx) => {
|
|
17
|
+
const result = await exportSurfaceDiff({
|
|
18
|
+
cwd: ctx.projectRoot,
|
|
19
|
+
git: ctx.git,
|
|
20
|
+
base: args["base"] as string | undefined,
|
|
21
|
+
head: args["head"] as string | undefined,
|
|
22
|
+
});
|
|
23
|
+
return ctx.respond("graft_exports", exportSurfaceDiffToJson(result));
|
|
24
|
+
};
|
|
25
|
+
},
|
|
26
|
+
};
|