codetrellis 0.0.0-stage → 0.2.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/LICENSE +201 -0
- package/README.md +27 -2
- package/bin/codetrellis.mjs +4 -0
- package/package.json +43 -4
- package/reader/material-reader.mjs +130346 -0
- package/resources/tree-sitter/README.md +150 -0
- package/resources/tree-sitter/tree-sitter-c-sharp.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-go.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-java.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-javascript.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-kotlin.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-php.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-python.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-ruby.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-rust.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-swift.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-tsx.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-typescript.wasm +0 -0
- package/resources/tree-sitter/tree-sitter.wasm +0 -0
- package/src/backend/agent/claude-code-watcher.js +270 -0
- package/src/backend/index.js +8 -0
- package/src/backend/lib/sha256-file.js +39 -0
- package/src/backend/lib/zip-entries.js +98 -0
- package/src/backend/lifecycle.js +102 -0
- package/src/backend/mcp/binding-headers.js +54 -0
- package/src/backend/mcp/client-identity.js +44 -0
- package/src/backend/mcp/connector/command.js +110 -0
- package/src/backend/mcp/connector/core.js +278 -0
- package/src/backend/mcp/connector/files.js +121 -0
- package/src/backend/mcp/connector/hook.js +284 -0
- package/src/backend/mcp/connector/main.js +126 -0
- package/src/backend/mcp/connector/sse-upstream.js +152 -0
- package/src/backend/mcp/helpers.js +43 -0
- package/src/backend/mcp/prompt-builders.js +104 -0
- package/src/backend/mcp/resources.js +197 -0
- package/src/backend/mcp/server.js +813 -0
- package/src/backend/mcp/skill-guide.js +1528 -0
- package/src/backend/mcp/tools/architecture-tools.js +273 -0
- package/src/backend/mcp/tools/audio-tools.js +117 -0
- package/src/backend/mcp/tools/awareness-tools.js +623 -0
- package/src/backend/mcp/tools/budget-tools.js +185 -0
- package/src/backend/mcp/tools/channel-tools.js +205 -0
- package/src/backend/mcp/tools/contribution-tools.js +181 -0
- package/src/backend/mcp/tools/drift-tools.js +252 -0
- package/src/backend/mcp/tools/git-tools.js +316 -0
- package/src/backend/mcp/tools/governance-tools.js +175 -0
- package/src/backend/mcp/tools/graph-tools.js +181 -0
- package/src/backend/mcp/tools/intake-tools.js +244 -0
- package/src/backend/mcp/tools/mobile-tools.js +118 -0
- package/src/backend/mcp/tools/peer-tools.js +330 -0
- package/src/backend/mcp/tools/plan-item-tools.js +1601 -0
- package/src/backend/mcp/tools/plan-tools.js +680 -0
- package/src/backend/mcp/tools/presence-tools.js +185 -0
- package/src/backend/mcp/tools/project-config-tools.js +150 -0
- package/src/backend/mcp/tools/review-tools.js +172 -0
- package/src/backend/mcp/tools/session-tools.js +554 -0
- package/src/backend/mcp/tools/system-docs-tools.js +168 -0
- package/src/backend/mcp/tools/terminal-tools.js +186 -0
- package/src/backend/mcp/tools/test-tools.js +117 -0
- package/src/backend/mcp/tools/ui-tools.js +356 -0
- package/src/backend/mcp/types.js +15 -0
- package/src/backend/middleware/local-auth.js +116 -0
- package/src/backend/server.js +5951 -0
- package/src/backend/services/agent-event-log.js +350 -0
- package/src/backend/services/architecture-rule.js +584 -0
- package/src/backend/services/architecture-rules.js +275 -0
- package/src/backend/services/artefact-content-service.js +181 -0
- package/src/backend/services/artefact-service.js +305 -0
- package/src/backend/services/artefact-watcher.js +167 -0
- package/src/backend/services/ast-parser.js +327 -0
- package/src/backend/services/audio-buffer-service.js +152 -0
- package/src/backend/services/awareness-notices.js +139 -0
- package/src/backend/services/awareness-replies.js +194 -0
- package/src/backend/services/awareness-service.js +344 -0
- package/src/backend/services/awareness-signals.js +267 -0
- package/src/backend/services/baseline-store.js +83 -0
- package/src/backend/services/branch-workstreams.js +341 -0
- package/src/backend/services/breakpoint-service.js +584 -0
- package/src/backend/services/brief-service.js +299 -0
- package/src/backend/services/budget-service.js +528 -0
- package/src/backend/services/callsites/base.js +15 -0
- package/src/backend/services/callsites/csharp.js +148 -0
- package/src/backend/services/callsites/go.js +163 -0
- package/src/backend/services/callsites/index.js +53 -0
- package/src/backend/services/callsites/kotlin.js +123 -0
- package/src/backend/services/callsites/process-env.js +125 -0
- package/src/backend/services/callsites/python.js +91 -0
- package/src/backend/services/callsites/ruby.js +164 -0
- package/src/backend/services/callsites/shared.js +198 -0
- package/src/backend/services/callsites/swift.js +115 -0
- package/src/backend/services/callsites/typescript.js +87 -0
- package/src/backend/services/capability-token.js +108 -0
- package/src/backend/services/change-check.js +156 -0
- package/src/backend/services/channel-dispatcher-service.js +235 -0
- package/src/backend/services/channel-event-file-service.js +125 -0
- package/src/backend/services/channel-event-service.js +297 -0
- package/src/backend/services/check-runs.js +177 -0
- package/src/backend/services/checkout-identity.js +73 -0
- package/src/backend/services/claude-code-parallel.js +221 -0
- package/src/backend/services/claude-desktop-config.js +186 -0
- package/src/backend/services/clock.js +57 -0
- package/src/backend/services/cloud-files.js +191 -0
- package/src/backend/services/coalesce.js +50 -0
- package/src/backend/services/code-breakpoints.js +291 -0
- package/src/backend/services/comment-service.js +168 -0
- package/src/backend/services/commit-attribution.js +134 -0
- package/src/backend/services/commit-edges.js +99 -0
- package/src/backend/services/confined-fs.js +241 -0
- package/src/backend/services/conformity-gate.js +132 -0
- package/src/backend/services/contribution-service.js +409 -0
- package/src/backend/services/coverage-service.js +173 -0
- package/src/backend/services/criteria-service.js +721 -0
- package/src/backend/services/criterion-checks.js +387 -0
- package/src/backend/services/criterion-loop-service.js +411 -0
- package/src/backend/services/cross-system-service.js +231 -0
- package/src/backend/services/database.js +916 -0
- package/src/backend/services/db-schema.js +1358 -0
- package/src/backend/services/deviation-service.js +344 -0
- package/src/backend/services/diff-engine.js +168 -0
- package/src/backend/services/evidence.js +363 -0
- package/src/backend/services/external-intake-service.js +269 -0
- package/src/backend/services/external-pointer-service.js +195 -0
- package/src/backend/services/external-refs-service.js +214 -0
- package/src/backend/services/file-history.js +158 -0
- package/src/backend/services/file-watcher.js +193 -0
- package/src/backend/services/folder-requests.js +118 -0
- package/src/backend/services/freeze-service.js +189 -0
- package/src/backend/services/gemini-cli-hook.js +172 -0
- package/src/backend/services/git-activity-service.js +325 -0
- package/src/backend/services/git-blobs.js +70 -0
- package/src/backend/services/git-branches.js +357 -0
- package/src/backend/services/git-checkout.js +153 -0
- package/src/backend/services/git-commit-service.js +91 -0
- package/src/backend/services/git-env.js +121 -0
- package/src/backend/services/git-identity.js +84 -0
- package/src/backend/services/git-refs.js +386 -0
- package/src/backend/services/git-safety.js +58 -0
- package/src/backend/services/grant-guard.js +67 -0
- package/src/backend/services/html-view-policy.js +135 -0
- package/src/backend/services/human-decision.js +55 -0
- package/src/backend/services/importers.js +159 -0
- package/src/backend/services/intent-service.js +105 -0
- package/src/backend/services/ipc-dispatcher.js +164 -0
- package/src/backend/services/item-git-state.js +208 -0
- package/src/backend/services/line-changes.js +232 -0
- package/src/backend/services/line-history.js +174 -0
- package/src/backend/services/local-api-changes.js +40 -0
- package/src/backend/services/logger.js +217 -0
- package/src/backend/services/material-footprints.js +203 -0
- package/src/backend/services/material-place.js +82 -0
- package/src/backend/services/material-reader/child.js +4 -0
- package/src/backend/services/material-reader/docx-markdown.js +198 -0
- package/src/backend/services/material-reader/fixtures.test-helper.js +169 -0
- package/src/backend/services/material-reader/quote.js +44 -0
- package/src/backend/services/material-reader/read.js +430 -0
- package/src/backend/services/material-reader/reader-host.js +202 -0
- package/src/backend/services/material-signals.js +141 -0
- package/src/backend/services/mcp-capabilities.js +390 -0
- package/src/backend/services/mdns-service.js +304 -0
- package/src/backend/services/mobile-api-server.js +281 -0
- package/src/backend/services/mobile-approvals.js +306 -0
- package/src/backend/services/mobile-awareness.js +180 -0
- package/src/backend/services/mobile-breakpoints.js +115 -0
- package/src/backend/services/mobile-budget.js +98 -0
- package/src/backend/services/mobile-freeze.js +106 -0
- package/src/backend/services/mobile-proposals.js +100 -0
- package/src/backend/services/mobile-rpc-service.js +1289 -0
- package/src/backend/services/mobile-workstreams.js +160 -0
- package/src/backend/services/monorepo-detector.js +131 -0
- package/src/backend/services/other-work.js +45 -0
- package/src/backend/services/pack-seal.js +129 -0
- package/src/backend/services/paired-device-service.js +192 -0
- package/src/backend/services/pairing-server.js +323 -0
- package/src/backend/services/pairing-service.js +200 -0
- package/src/backend/services/pantry-resolution-service.js +166 -0
- package/src/backend/services/parsers/base.js +124 -0
- package/src/backend/services/parsers/csharp.js +224 -0
- package/src/backend/services/parsers/go.js +180 -0
- package/src/backend/services/parsers/index.js +101 -0
- package/src/backend/services/parsers/java.js +103 -0
- package/src/backend/services/parsers/kotlin.js +252 -0
- package/src/backend/services/parsers/php.js +113 -0
- package/src/backend/services/parsers/python.js +189 -0
- package/src/backend/services/parsers/ruby.js +212 -0
- package/src/backend/services/parsers/rust.js +97 -0
- package/src/backend/services/parsers/swift.js +221 -0
- package/src/backend/services/parsers/typescript.js +235 -0
- package/src/backend/services/pattern-scan.js +65 -0
- package/src/backend/services/patterns.js +281 -0
- package/src/backend/services/peer-audit-service.js +123 -0
- package/src/backend/services/peer-auth.js +153 -0
- package/src/backend/services/peer-capabilities.js +209 -0
- package/src/backend/services/peer-connection-service.js +450 -0
- package/src/backend/services/peer-grants.js +33 -0
- package/src/backend/services/persistence.js +116 -0
- package/src/backend/services/personal-sync-service.js +232 -0
- package/src/backend/services/pipeline-approvals.js +72 -0
- package/src/backend/services/pipeline.js +232 -0
- package/src/backend/services/plan-arrivals.js +68 -0
- package/src/backend/services/plan-changes-service.js +273 -0
- package/src/backend/services/plan-conflict-service.js +288 -0
- package/src/backend/services/plan-dependencies.js +91 -0
- package/src/backend/services/plan-doc-guard.js +90 -0
- package/src/backend/services/plan-documents-service.js +275 -0
- package/src/backend/services/plan-event-service.js +154 -0
- package/src/backend/services/plan-file-refs.js +106 -0
- package/src/backend/services/plan-file-service.js +1564 -0
- package/src/backend/services/plan-history-service.js +156 -0
- package/src/backend/services/plan-import-service.js +261 -0
- package/src/backend/services/plan-item-service.js +1223 -0
- package/src/backend/services/plan-migrate-service.js +395 -0
- package/src/backend/services/plan-overlay-service.js +173 -0
- package/src/backend/services/plan-phases-service.js +182 -0
- package/src/backend/services/plan-progress-service.js +134 -0
- package/src/backend/services/plan-review-service.js +262 -0
- package/src/backend/services/plan-service.js +682 -0
- package/src/backend/services/plan-status.js +113 -0
- package/src/backend/services/plan-template-publish-service.js +217 -0
- package/src/backend/services/plan-templates-service.js +242 -0
- package/src/backend/services/plan-templates.js +1164 -0
- package/src/backend/services/planned-overlap-actions.js +200 -0
- package/src/backend/services/plans-home.js +224 -0
- package/src/backend/services/play-forward.js +256 -0
- package/src/backend/services/playback-service.js +117 -0
- package/src/backend/services/power-service.js +167 -0
- package/src/backend/services/power-signals.js +81 -0
- package/src/backend/services/pr-draft-service.js +142 -0
- package/src/backend/services/presence-service.js +122 -0
- package/src/backend/services/pricing.js +60 -0
- package/src/backend/services/project-config-service.js +474 -0
- package/src/backend/services/project-scanner.js +184 -0
- package/src/backend/services/projection-service.js +69 -0
- package/src/backend/services/push-notification-service.js +288 -0
- package/src/backend/services/recent-projects-service.js +204 -0
- package/src/backend/services/record-chain.js +162 -0
- package/src/backend/services/recurrence-rule.js +63 -0
- package/src/backend/services/recurring-agent.js +89 -0
- package/src/backend/services/recurring-scheduler.js +77 -0
- package/src/backend/services/recurring-service.js +276 -0
- package/src/backend/services/reference-service.js +169 -0
- package/src/backend/services/release-public-key.js +30 -0
- package/src/backend/services/release-signature.js +64 -0
- package/src/backend/services/remote-audio-service.js +224 -0
- package/src/backend/services/remote-interaction-service.js +275 -0
- package/src/backend/services/remote-terminal-service.js +324 -0
- package/src/backend/services/rendition/child/main.js +76 -0
- package/src/backend/services/rendition/engine-host.js +249 -0
- package/src/backend/services/rendition/engine-lock.js +39 -0
- package/src/backend/services/rendition/engine-lock.json +14 -0
- package/src/backend/services/rendition/engine-manifest.js +97 -0
- package/src/backend/services/rendition/network-proof.js +73 -0
- package/src/backend/services/rendition/rendition-service.js +175 -0
- package/src/backend/services/replay-frames.js +387 -0
- package/src/backend/services/replay-state.js +201 -0
- package/src/backend/services/resolvers/base.js +108 -0
- package/src/backend/services/resolvers/csharp.js +109 -0
- package/src/backend/services/resolvers/go.js +105 -0
- package/src/backend/services/resolvers/index.js +60 -0
- package/src/backend/services/resolvers/java.js +63 -0
- package/src/backend/services/resolvers/kotlin.js +109 -0
- package/src/backend/services/resolvers/php.js +89 -0
- package/src/backend/services/resolvers/python.js +154 -0
- package/src/backend/services/resolvers/ruby.js +103 -0
- package/src/backend/services/resolvers/rust.js +77 -0
- package/src/backend/services/resolvers/swift.js +98 -0
- package/src/backend/services/resolvers/typescript.js +71 -0
- package/src/backend/services/retention.js +54 -0
- package/src/backend/services/review-architecture.js +236 -0
- package/src/backend/services/review-attest.js +68 -0
- package/src/backend/services/review-bundle.js +226 -0
- package/src/backend/services/review-graduation.js +93 -0
- package/src/backend/services/review-host/bitbucket.js +79 -0
- package/src/backend/services/review-host/detect.js +80 -0
- package/src/backend/services/review-host/github.js +97 -0
- package/src/backend/services/review-host/gitlab.js +77 -0
- package/src/backend/services/review-host/host-state.js +103 -0
- package/src/backend/services/review-host/http.js +58 -0
- package/src/backend/services/review-host/switch.js +120 -0
- package/src/backend/services/review-marks.js +72 -0
- package/src/backend/services/review-notes.js +169 -0
- package/src/backend/services/review-other-work.js +90 -0
- package/src/backend/services/review-queue-service.js +147 -0
- package/src/backend/services/review-risk.js +127 -0
- package/src/backend/services/review-task.js +121 -0
- package/src/backend/services/rule-approvals.js +268 -0
- package/src/backend/services/rule-baseline.js +134 -0
- package/src/backend/services/rule-changes.js +162 -0
- package/src/backend/services/rule-preview.js +47 -0
- package/src/backend/services/rule-proposals.js +104 -0
- package/src/backend/services/rule-scope.js +76 -0
- package/src/backend/services/rulebook.js +286 -0
- package/src/backend/services/rules-at.js +56 -0
- package/src/backend/services/rules-overview.js +88 -0
- package/src/backend/services/schema-reconciler.js +250 -0
- package/src/backend/services/secret-store.js +119 -0
- package/src/backend/services/section-workstreams.js +95 -0
- package/src/backend/services/self-write-tracker.js +75 -0
- package/src/backend/services/sensor-bridge-service.js +285 -0
- package/src/backend/services/session-service.js +192 -0
- package/src/backend/services/settings-service.js +324 -0
- package/src/backend/services/signal-breakpoints.js +172 -0
- package/src/backend/services/signed-approval-record.js +86 -0
- package/src/backend/services/signed-approvals.js +244 -0
- package/src/backend/services/signoff-pack.js +328 -0
- package/src/backend/services/signoff-rows.js +114 -0
- package/src/backend/services/skill-arrival-service.js +138 -0
- package/src/backend/services/skill-model.js +193 -0
- package/src/backend/services/skill-use-service.js +140 -0
- package/src/backend/services/skills-service.js +150 -0
- package/src/backend/services/snapshot-compare-service.js +397 -0
- package/src/backend/services/source-control.js +189 -0
- package/src/backend/services/spec-links-service.js +123 -0
- package/src/backend/services/spec-proposal-withdraw.js +50 -0
- package/src/backend/services/spec-proposals-service.js +470 -0
- package/src/backend/services/sql/embedded.js +95 -0
- package/src/backend/services/sql/index.js +63 -0
- package/src/backend/services/sql/refs.js +357 -0
- package/src/backend/services/sql/schema.js +312 -0
- package/src/backend/services/sql/tokenizer.js +195 -0
- package/src/backend/services/stack-overlaps.js +117 -0
- package/src/backend/services/stack-service.js +225 -0
- package/src/backend/services/state-sync-service.js +384 -0
- package/src/backend/services/stuck-sensor-service.js +200 -0
- package/src/backend/services/system-discovery.js +481 -0
- package/src/backend/services/system-docs-service.js +701 -0
- package/src/backend/services/task-attachments-service.js +340 -0
- package/src/backend/services/task-grounding.js +60 -0
- package/src/backend/services/task-records/check-run-record.js +146 -0
- package/src/backend/services/task-records/check-runs.js +115 -0
- package/src/backend/services/task-records/heads.js +88 -0
- package/src/backend/services/task-records/material-reads.js +225 -0
- package/src/backend/services/task-records/read-record.js +100 -0
- package/src/backend/services/task-records/record.js +173 -0
- package/src/backend/services/task-records/run-record.js +136 -0
- package/src/backend/services/task-records/shared-state.js +548 -0
- package/src/backend/services/task-records/signing.js +140 -0
- package/src/backend/services/task-records/split-signals.js +52 -0
- package/src/backend/services/task-records/test-runs.js +164 -0
- package/src/backend/services/task-records/trust.js +243 -0
- package/src/backend/services/task-rules.js +81 -0
- package/src/backend/services/task-workstreams.js +90 -0
- package/src/backend/services/terminal-history-service.js +266 -0
- package/src/backend/services/terminal-service.js +267 -0
- package/src/backend/services/test-clock.js +53 -0
- package/src/backend/services/tests/grounding.js +266 -0
- package/src/backend/services/tests/junit.js +104 -0
- package/src/backend/services/tests/teammate-runs.js +134 -0
- package/src/backend/services/tests/test-results.js +234 -0
- package/src/backend/services/tree-watcher.js +204 -0
- package/src/backend/services/trellis-service.js +204 -0
- package/src/backend/services/trusted-roots.js +186 -0
- package/src/backend/services/update-download-service.js +342 -0
- package/src/backend/services/update-service.js +266 -0
- package/src/backend/services/watch-ignore.js +76 -0
- package/src/backend/services/webhook-egress.js +206 -0
- package/src/backend/services/webrtc-service.js +413 -0
- package/src/backend/services/work-changes.js +59 -0
- package/src/backend/services/workstream-binding.js +82 -0
- package/src/backend/services/workstream-commits.js +116 -0
- package/src/backend/services/workstream-imports.js +177 -0
- package/src/backend/services/workstream-service.js +335 -0
- package/src/backend/services/workstream-symbols.js +223 -0
- package/src/backend/services/workstream-watch-service.js +391 -0
- package/src/backend/services/worktree-service.js +235 -0
- package/src/cli/agent.js +100 -0
- package/src/cli/args.js +201 -0
- package/src/cli/conformity.js +106 -0
- package/src/cli/desktop.js +91 -0
- package/src/cli/main.js +409 -0
- package/src/cli/pipeline.js +109 -0
- package/src/cli/plan-verbs.js +259 -0
- package/src/cli/review-adapters.js +218 -0
- package/src/cli/review-output.js +93 -0
- package/src/cli/review-post.js +89 -0
- package/src/cli/review-sink.js +183 -0
- package/src/cli/review-skill.js +44 -0
- package/src/cli/review-verify.js +104 -0
- package/src/cli/review.js +386 -0
- package/src/cli/sarif.js +148 -0
- package/src/cli/verbs.js +359 -0
- package/src/shared/build-info.js +39 -0
- package/src/shared/lib/agent-review.js +199 -0
- package/src/shared/lib/agent-turns.js +140 -0
- package/src/shared/lib/awareness-digest.js +120 -0
- package/src/shared/lib/branch-name.js +45 -0
- package/src/shared/lib/breakpoint-words.js +118 -0
- package/src/shared/lib/budget-words.js +56 -0
- package/src/shared/lib/burst.js +69 -0
- package/src/shared/lib/call-entry.js +105 -0
- package/src/shared/lib/check-compare.js +42 -0
- package/src/shared/lib/check-words.js +216 -0
- package/src/shared/lib/csv.js +62 -0
- package/src/shared/lib/folder-entry.js +87 -0
- package/src/shared/lib/freeze-words.js +60 -0
- package/src/shared/lib/fuzzy.js +84 -0
- package/src/shared/lib/git-state-words.js +80 -0
- package/src/shared/lib/grep-entry.js +86 -0
- package/src/shared/lib/grounding-line.js +61 -0
- package/src/shared/lib/import-line.js +71 -0
- package/src/shared/lib/item-status.js +249 -0
- package/src/shared/lib/line-changes.js +53 -0
- package/src/shared/lib/locator.js +71 -0
- package/src/shared/lib/matcher.js +120 -0
- package/src/shared/lib/merge-order.js +65 -0
- package/src/shared/lib/open-findings.js +68 -0
- package/src/shared/lib/other-work.js +108 -0
- package/src/shared/lib/package-entry.js +142 -0
- package/src/shared/lib/plan-vocab.js +40 -0
- package/src/shared/lib/pptx-xml.js +86 -0
- package/src/shared/lib/proposal-words.js +61 -0
- package/src/shared/lib/recurrence.js +183 -0
- package/src/shared/lib/references.js +72 -0
- package/src/shared/lib/rule-pattern.js +56 -0
- package/src/shared/lib/sdp-fingerprint.js +115 -0
- package/src/shared/lib/sdp-minimal.js +123 -0
- package/src/shared/lib/secret-paths.js +34 -0
- package/src/shared/lib/signal-words.js +172 -0
- package/src/shared/lib/signoff.js +56 -0
- package/src/shared/lib/skills-note.js +60 -0
- package/src/shared/lib/spec-sections.js +78 -0
- package/src/shared/lib/symbol-entry.js +60 -0
- package/src/shared/lib/tool-phrasing.js +338 -0
- package/src/shared/lib/turn-gap.js +27 -0
- package/src/shared/lib/workstream-words.js +38 -0
- package/src/shared/lib/xlsx-xml.js +144 -0
- package/src/shared/lib/zip-reader.js +99 -0
- package/src/shared/types/agent.js +27 -0
- package/src/shared/types/architecture-rules.js +30 -0
- package/src/shared/types/ast.js +15 -0
- package/src/shared/types/breakpoint.js +33 -0
- package/src/shared/types/channel.js +41 -0
- package/src/shared/types/criteria.js +15 -0
- package/src/shared/types/graph.js +15 -0
- package/src/shared/types/index.js +53 -0
- package/src/shared/types/peer.js +36 -0
- package/src/shared/types/pipeline.js +15 -0
- package/src/shared/types/plan.js +15 -0
- package/src/shared/types/play-forward.js +15 -0
- package/src/shared/types/power.js +15 -0
- package/src/shared/types/presence.js +15 -0
- package/src/shared/types/project-config.js +35 -0
- package/src/shared/types/project.js +15 -0
- package/src/shared/types/record.js +15 -0
- package/src/shared/types/recurring.js +15 -0
- package/src/shared/types/review.js +15 -0
- package/src/shared/types/settings.js +114 -0
- package/src/shared/types/stack.js +15 -0
- package/src/shared/types/system-doc.js +15 -0
- package/src/shared/types/system.js +15 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var lifecycle_exports = {};
|
|
19
|
+
__export(lifecycle_exports, {
|
|
20
|
+
gracefulShutdown: () => gracefulShutdown,
|
|
21
|
+
installProcessHandlers: () => installProcessHandlers
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(lifecycle_exports);
|
|
24
|
+
var import_server = require("./server");
|
|
25
|
+
var import_file_watcher = require("./services/file-watcher");
|
|
26
|
+
var import_server2 = require("./mcp/server");
|
|
27
|
+
var import_terminal_service = require("./services/terminal-service");
|
|
28
|
+
var import_persistence = require("./services/persistence");
|
|
29
|
+
var import_database = require("./services/database");
|
|
30
|
+
var import_persistence2 = require("./services/persistence");
|
|
31
|
+
var import_claude_code_watcher = require("./agent/claude-code-watcher");
|
|
32
|
+
var import_peer_connection_service = require("./services/peer-connection-service");
|
|
33
|
+
function installProcessHandlers() {
|
|
34
|
+
process.on("uncaughtException", (err) => {
|
|
35
|
+
console.error("[Backend] Uncaught exception (kept alive):", err);
|
|
36
|
+
});
|
|
37
|
+
process.on("unhandledRejection", (reason) => {
|
|
38
|
+
console.error("[Backend] Unhandled rejection (kept alive):", reason);
|
|
39
|
+
});
|
|
40
|
+
process.on("SIGTERM", () => {
|
|
41
|
+
void gracefulShutdown("SIGTERM");
|
|
42
|
+
});
|
|
43
|
+
process.on("SIGINT", () => {
|
|
44
|
+
void gracefulShutdown("SIGINT");
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
let shuttingDown = false;
|
|
48
|
+
async function gracefulShutdown(signal) {
|
|
49
|
+
if (shuttingDown) return;
|
|
50
|
+
shuttingDown = true;
|
|
51
|
+
console.log(`[Backend] ${signal} received \u2014 shutting down gracefully\u2026`);
|
|
52
|
+
const deadline = setTimeout(() => {
|
|
53
|
+
console.error("[Backend] Shutdown deadline exceeded \u2014 forcing exit");
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}, 4e3);
|
|
56
|
+
deadline.unref();
|
|
57
|
+
try {
|
|
58
|
+
try {
|
|
59
|
+
(0, import_persistence2.stopAutoSave)();
|
|
60
|
+
(0, import_persistence.saveNow)(() => (0, import_database.exportDatabase)());
|
|
61
|
+
console.log("[Backend] Database flushed");
|
|
62
|
+
} catch (err) {
|
|
63
|
+
console.error("[Backend] Database flush failed:", err);
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
(0, import_terminal_service.killAllTerminals)();
|
|
67
|
+
console.log("[Backend] Terminals killed");
|
|
68
|
+
} catch (err) {
|
|
69
|
+
console.error("[Backend] Terminal cleanup failed:", err);
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
(0, import_claude_code_watcher.stopClaudeCodeWatcher)();
|
|
73
|
+
await (0, import_file_watcher.stopWatching)();
|
|
74
|
+
console.log("[Backend] File watchers stopped");
|
|
75
|
+
} catch (err) {
|
|
76
|
+
console.error("[Backend] File watcher cleanup failed:", err);
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
await (0, import_peer_connection_service.stopPeerManager)();
|
|
80
|
+
console.log("[Backend] Peer manager stopped");
|
|
81
|
+
} catch (err) {
|
|
82
|
+
console.error("[Backend] Peer manager cleanup failed:", err);
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
await (0, import_server2.stopMcpServer)();
|
|
86
|
+
console.log("[Backend] MCP server stopped");
|
|
87
|
+
} catch (err) {
|
|
88
|
+
console.error("[Backend] MCP cleanup failed:", err);
|
|
89
|
+
}
|
|
90
|
+
import_server.server.close();
|
|
91
|
+
console.log("[Backend] HTTP server closed");
|
|
92
|
+
} catch (err) {
|
|
93
|
+
console.error("[Backend] Shutdown error:", err);
|
|
94
|
+
}
|
|
95
|
+
clearTimeout(deadline);
|
|
96
|
+
process.exit(0);
|
|
97
|
+
}
|
|
98
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
99
|
+
0 && (module.exports = {
|
|
100
|
+
gracefulShutdown,
|
|
101
|
+
installProcessHandlers
|
|
102
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var binding_headers_exports = {};
|
|
19
|
+
__export(binding_headers_exports, {
|
|
20
|
+
CWD_HEADER: () => CWD_HEADER,
|
|
21
|
+
HOST_TERMINAL_HEADER: () => HOST_TERMINAL_HEADER,
|
|
22
|
+
bindingHeaders: () => bindingHeaders,
|
|
23
|
+
readBindingHeaders: () => readBindingHeaders
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(binding_headers_exports);
|
|
26
|
+
const CWD_HEADER = "x-codetrellis-cwd";
|
|
27
|
+
const HOST_TERMINAL_HEADER = "x-codetrellis-host-terminal";
|
|
28
|
+
function bindingHeaders(hint) {
|
|
29
|
+
const out = {};
|
|
30
|
+
if (hint.cwd) out[CWD_HEADER] = encodeURIComponent(hint.cwd);
|
|
31
|
+
if (hint.hostTerminal) out[HOST_TERMINAL_HEADER] = encodeURIComponent(hint.hostTerminal);
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
function readBindingHeaders(headers) {
|
|
35
|
+
const one = (name) => {
|
|
36
|
+
const raw = headers[name];
|
|
37
|
+
const value = Array.isArray(raw) ? raw[0] : raw;
|
|
38
|
+
if (!value) return null;
|
|
39
|
+
try {
|
|
40
|
+
const decoded = decodeURIComponent(value);
|
|
41
|
+
return decoded.includes("\0") ? null : decoded;
|
|
42
|
+
} catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
return { cwd: one(CWD_HEADER), hostTerminal: one(HOST_TERMINAL_HEADER) };
|
|
47
|
+
}
|
|
48
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
49
|
+
0 && (module.exports = {
|
|
50
|
+
CWD_HEADER,
|
|
51
|
+
HOST_TERMINAL_HEADER,
|
|
52
|
+
bindingHeaders,
|
|
53
|
+
readBindingHeaders
|
|
54
|
+
});
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var client_identity_exports = {};
|
|
19
|
+
__export(client_identity_exports, {
|
|
20
|
+
agentTypeFromClientInfo: () => agentTypeFromClientInfo
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(client_identity_exports);
|
|
23
|
+
const KNOWN_CLIENTS = {
|
|
24
|
+
"claude-code": "claude-code",
|
|
25
|
+
"claude-ai": "claude-desktop",
|
|
26
|
+
"claude-desktop": "claude-desktop",
|
|
27
|
+
"cursor-vscode": "cursor",
|
|
28
|
+
cursor: "cursor",
|
|
29
|
+
codex: "codex",
|
|
30
|
+
"codex-mcp-client": "codex",
|
|
31
|
+
windsurf: "windsurf",
|
|
32
|
+
aider: "aider"
|
|
33
|
+
};
|
|
34
|
+
const RESERVED = /* @__PURE__ */ new Set(["mcp-client", "mcp-agent", "human", "user"]);
|
|
35
|
+
function agentTypeFromClientInfo(name) {
|
|
36
|
+
if (typeof name !== "string") return null;
|
|
37
|
+
const slug = name.trim().toLowerCase().replace(/[^a-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 40);
|
|
38
|
+
if (!slug || RESERVED.has(slug)) return null;
|
|
39
|
+
return KNOWN_CLIENTS[slug] ?? slug;
|
|
40
|
+
}
|
|
41
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
42
|
+
0 && (module.exports = {
|
|
43
|
+
agentTypeFromClientInfo
|
|
44
|
+
});
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
var command_exports = {};
|
|
29
|
+
__export(command_exports, {
|
|
30
|
+
APPIMAGE_BOOTSTRAP: () => APPIMAGE_BOOTSTRAP,
|
|
31
|
+
CONNECTOR_SCRIPT: () => CONNECTOR_SCRIPT,
|
|
32
|
+
PORTABLE_CAVEAT: () => PORTABLE_CAVEAT,
|
|
33
|
+
claudeCodeConnectorCommand: () => claudeCodeConnectorCommand,
|
|
34
|
+
connectorConfig: () => connectorConfig,
|
|
35
|
+
isPackagedElectron: () => isPackagedElectron,
|
|
36
|
+
resolveConnectorCommand: () => resolveConnectorCommand,
|
|
37
|
+
shellQuote: () => shellQuote
|
|
38
|
+
});
|
|
39
|
+
module.exports = __toCommonJS(command_exports);
|
|
40
|
+
var import_node_path = __toESM(require("node:path"));
|
|
41
|
+
const CONNECTOR_SCRIPT = "mcp-connector.cjs";
|
|
42
|
+
function isPackagedElectron(input) {
|
|
43
|
+
return !!input.electronVersion && !/[\\/]node_modules[\\/]electron[\\/]/.test(input.execPath);
|
|
44
|
+
}
|
|
45
|
+
function resolveConnectorCommand(input) {
|
|
46
|
+
const packaged = isPackagedElectron(input);
|
|
47
|
+
const script = packaged ? input.resourcesPath ? import_node_path.default.join(input.resourcesPath, "connector", CONNECTOR_SCRIPT) : null : import_node_path.default.join(input.cwd, "out", "connector", CONNECTOR_SCRIPT);
|
|
48
|
+
if (!script || !input.exists(script)) return null;
|
|
49
|
+
if (packaged) {
|
|
50
|
+
const appImage = runningAppImage(input);
|
|
51
|
+
if (appImage) return appImageCommand(appImage, input.dataDir);
|
|
52
|
+
}
|
|
53
|
+
const cmd = {
|
|
54
|
+
command: input.execPath,
|
|
55
|
+
args: [script, "--data-dir", input.dataDir],
|
|
56
|
+
env: input.electronVersion ? { ELECTRON_RUN_AS_NODE: "1" } : {}
|
|
57
|
+
};
|
|
58
|
+
if (packaged && input.env?.PORTABLE_EXECUTABLE_FILE) cmd.caveat = PORTABLE_CAVEAT;
|
|
59
|
+
return cmd;
|
|
60
|
+
}
|
|
61
|
+
const APPIMAGE_BOOTSTRAP = `require(require('path').join(process.resourcesPath, 'connector', '${CONNECTOR_SCRIPT}'))`;
|
|
62
|
+
const PORTABLE_CAVEAT = "This is the portable build: the connector starts only while CodeTrellis is open, and this config must be copied again after updating. The Windows installer gives a config that always works.";
|
|
63
|
+
function runningAppImage(input) {
|
|
64
|
+
const { APPIMAGE, APPDIR } = input.env ?? {};
|
|
65
|
+
if (!APPIMAGE || !APPDIR || !import_node_path.default.isAbsolute(APPIMAGE) || !import_node_path.default.isAbsolute(APPDIR)) return null;
|
|
66
|
+
if (import_node_path.default.dirname(input.execPath) !== import_node_path.default.resolve(APPDIR)) return null;
|
|
67
|
+
return input.exists(APPIMAGE) ? APPIMAGE : null;
|
|
68
|
+
}
|
|
69
|
+
function appImageCommand(appImage, dataDir) {
|
|
70
|
+
return {
|
|
71
|
+
command: appImage,
|
|
72
|
+
args: ["-e", APPIMAGE_BOOTSTRAP, "--", "--data-dir", dataDir, "--no-sandbox"],
|
|
73
|
+
env: { ELECTRON_RUN_AS_NODE: "1" }
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function shellQuote(arg, platform = process.platform) {
|
|
77
|
+
if (/^[\w@%+=:,./\\-]+$/.test(arg)) return arg;
|
|
78
|
+
if (platform === "win32") return `"${arg.replace(/"/g, '\\"')}"`;
|
|
79
|
+
return `'${arg.replace(/'/g, `'\\''`)}'`;
|
|
80
|
+
}
|
|
81
|
+
function claudeCodeConnectorCommand(cmd, platform = process.platform) {
|
|
82
|
+
const env = Object.entries(cmd.env).map(([k, v]) => `-e ${k}=${v}`);
|
|
83
|
+
return [
|
|
84
|
+
"claude mcp add codetrellis --scope user",
|
|
85
|
+
...env,
|
|
86
|
+
"--",
|
|
87
|
+
shellQuote(cmd.command, platform),
|
|
88
|
+
...cmd.args.map((a) => shellQuote(a, platform))
|
|
89
|
+
].join(" ");
|
|
90
|
+
}
|
|
91
|
+
function connectorConfig(cmd) {
|
|
92
|
+
return {
|
|
93
|
+
codetrellis: {
|
|
94
|
+
command: cmd.command,
|
|
95
|
+
args: cmd.args,
|
|
96
|
+
...Object.keys(cmd.env).length > 0 ? { env: cmd.env } : {}
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
101
|
+
0 && (module.exports = {
|
|
102
|
+
APPIMAGE_BOOTSTRAP,
|
|
103
|
+
CONNECTOR_SCRIPT,
|
|
104
|
+
PORTABLE_CAVEAT,
|
|
105
|
+
claudeCodeConnectorCommand,
|
|
106
|
+
connectorConfig,
|
|
107
|
+
isPackagedElectron,
|
|
108
|
+
resolveConnectorCommand,
|
|
109
|
+
shellQuote
|
|
110
|
+
});
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var core_exports = {};
|
|
19
|
+
__export(core_exports, {
|
|
20
|
+
ConnectorCore: () => ConnectorCore,
|
|
21
|
+
LOST_MESSAGE: () => LOST_MESSAGE,
|
|
22
|
+
NOT_RUNNING_MESSAGE: () => NOT_RUNNING_MESSAGE
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(core_exports);
|
|
25
|
+
const NOT_RUNNING_MESSAGE = "CodeTrellis is not running, so its tools are unavailable. Open the CodeTrellis app \u2014 this connection picks it up automatically, with no change to your MCP settings.";
|
|
26
|
+
const LOST_MESSAGE = "CodeTrellis stopped (or restarted) while this request was in flight. It reconnects automatically; try the request again in a moment.";
|
|
27
|
+
const REPLAY_ID_PREFIX = "ct-connector-reinit-";
|
|
28
|
+
const DEFAULT_PROTOCOL_VERSION = "2025-06-18";
|
|
29
|
+
const idKey = (id) => JSON.stringify(id);
|
|
30
|
+
const isRequest = (m) => typeof m.method === "string" && m.id !== void 0 && m.id !== null;
|
|
31
|
+
const isResponse = (m) => m.method === void 0 && m.id !== void 0 && m.id !== null;
|
|
32
|
+
class ConnectorCore {
|
|
33
|
+
opts;
|
|
34
|
+
upstream = null;
|
|
35
|
+
/** The upstream has completed an `initialize` handshake of its own. */
|
|
36
|
+
ready = false;
|
|
37
|
+
/** The client's `initialize`, kept so it can be replayed to a new server. */
|
|
38
|
+
initRequest = null;
|
|
39
|
+
/** The id of the client's own `initialize`, while its reply is outstanding. */
|
|
40
|
+
clientInitInFlight = null;
|
|
41
|
+
/** We completed the client's handshake ourselves, because no app was there. */
|
|
42
|
+
answeredLocally = false;
|
|
43
|
+
/** The client's `initialize` is waiting to learn whether a server exists. */
|
|
44
|
+
deciding = false;
|
|
45
|
+
/** Client requests forwarded upstream and not yet answered. */
|
|
46
|
+
pending = /* @__PURE__ */ new Set();
|
|
47
|
+
replayWaiters = /* @__PURE__ */ new Map();
|
|
48
|
+
replaySeq = 0;
|
|
49
|
+
firstAttempt = Promise.resolve();
|
|
50
|
+
retryMs;
|
|
51
|
+
retryTimer = null;
|
|
52
|
+
stopped = false;
|
|
53
|
+
/** Log "waiting for CodeTrellis" once per outage, not once per retry. */
|
|
54
|
+
announcedDown = false;
|
|
55
|
+
constructor(options) {
|
|
56
|
+
this.opts = {
|
|
57
|
+
initialWaitMs: 3e3,
|
|
58
|
+
retryMinMs: 500,
|
|
59
|
+
retryMaxMs: 5e3,
|
|
60
|
+
replayTimeoutMs: 1e4,
|
|
61
|
+
log: () => {
|
|
62
|
+
},
|
|
63
|
+
...options
|
|
64
|
+
};
|
|
65
|
+
this.retryMs = this.opts.retryMinMs;
|
|
66
|
+
}
|
|
67
|
+
start() {
|
|
68
|
+
this.firstAttempt = this.connectOnce();
|
|
69
|
+
}
|
|
70
|
+
stop() {
|
|
71
|
+
this.stopped = true;
|
|
72
|
+
if (this.retryTimer) clearTimeout(this.retryTimer);
|
|
73
|
+
this.retryTimer = null;
|
|
74
|
+
const up = this.upstream;
|
|
75
|
+
this.upstream = null;
|
|
76
|
+
up?.close();
|
|
77
|
+
}
|
|
78
|
+
/** True while there is a connected, initialised server behind us. */
|
|
79
|
+
get connected() {
|
|
80
|
+
return this.upstream !== null && this.ready;
|
|
81
|
+
}
|
|
82
|
+
// ── From the client ───────────────────────────────────────────────
|
|
83
|
+
async handleClientMessage(msg) {
|
|
84
|
+
if (isRequest(msg) && msg.method === "initialize") {
|
|
85
|
+
await this.handleInitialize(msg);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (msg.method === "notifications/initialized" && !isRequest(msg)) {
|
|
89
|
+
if (this.upstream && this.ready && this.clientInitInFlight === null && !this.answeredLocally) {
|
|
90
|
+
await this.forward(msg);
|
|
91
|
+
}
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (isRequest(msg)) {
|
|
95
|
+
if (this.connected) {
|
|
96
|
+
this.pending.add(idKey(msg.id));
|
|
97
|
+
await this.forward(msg);
|
|
98
|
+
} else {
|
|
99
|
+
this.answerLocally(msg);
|
|
100
|
+
}
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (this.upstream && (this.ready || isResponse(msg))) await this.forward(msg);
|
|
104
|
+
}
|
|
105
|
+
async handleInitialize(msg) {
|
|
106
|
+
this.initRequest = msg;
|
|
107
|
+
if (!this.upstream) {
|
|
108
|
+
this.deciding = true;
|
|
109
|
+
let timer;
|
|
110
|
+
await Promise.race([
|
|
111
|
+
this.firstAttempt,
|
|
112
|
+
new Promise((r) => {
|
|
113
|
+
timer = setTimeout(r, this.opts.initialWaitMs);
|
|
114
|
+
})
|
|
115
|
+
]);
|
|
116
|
+
clearTimeout(timer);
|
|
117
|
+
this.deciding = false;
|
|
118
|
+
}
|
|
119
|
+
if (this.upstream) {
|
|
120
|
+
this.clientInitInFlight = idKey(msg.id);
|
|
121
|
+
this.pending.add(this.clientInitInFlight);
|
|
122
|
+
this.answeredLocally = false;
|
|
123
|
+
await this.forward(msg);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
this.answeredLocally = true;
|
|
127
|
+
const params = msg.params ?? {};
|
|
128
|
+
this.opts.send({
|
|
129
|
+
jsonrpc: "2.0",
|
|
130
|
+
id: msg.id,
|
|
131
|
+
result: {
|
|
132
|
+
protocolVersion: params.protocolVersion ?? DEFAULT_PROTOCOL_VERSION,
|
|
133
|
+
capabilities: { tools: { listChanged: true }, resources: { listChanged: true } },
|
|
134
|
+
serverInfo: { name: "codetrellis", version: this.opts.version },
|
|
135
|
+
instructions: NOT_RUNNING_MESSAGE
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/** What a request gets when there is no server to ask. */
|
|
140
|
+
answerLocally(msg) {
|
|
141
|
+
const reply = (result) => this.opts.send({ jsonrpc: "2.0", id: msg.id, result });
|
|
142
|
+
switch (msg.method) {
|
|
143
|
+
case "ping":
|
|
144
|
+
return reply({});
|
|
145
|
+
case "tools/list":
|
|
146
|
+
return reply({ tools: [] });
|
|
147
|
+
case "resources/list":
|
|
148
|
+
return reply({ resources: [] });
|
|
149
|
+
case "resources/templates/list":
|
|
150
|
+
return reply({ resourceTemplates: [] });
|
|
151
|
+
case "prompts/list":
|
|
152
|
+
return reply({ prompts: [] });
|
|
153
|
+
case "tools/call":
|
|
154
|
+
return reply({ content: [{ type: "text", text: NOT_RUNNING_MESSAGE }], isError: true });
|
|
155
|
+
default:
|
|
156
|
+
this.opts.send({ jsonrpc: "2.0", id: msg.id, error: { code: -32e3, message: NOT_RUNNING_MESSAGE } });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// ── From the server ───────────────────────────────────────────────
|
|
160
|
+
handleUpstreamMessage(up, msg) {
|
|
161
|
+
if (up !== this.upstream) return;
|
|
162
|
+
if (isResponse(msg)) {
|
|
163
|
+
const id = msg.id;
|
|
164
|
+
if (typeof id === "string" && id.startsWith(REPLAY_ID_PREFIX)) {
|
|
165
|
+
this.replayWaiters.get(id)?.(msg);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const key = idKey(id);
|
|
169
|
+
this.pending.delete(key);
|
|
170
|
+
if (key === this.clientInitInFlight) {
|
|
171
|
+
this.clientInitInFlight = null;
|
|
172
|
+
if (!msg.error) this.ready = true;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
this.opts.send(msg);
|
|
176
|
+
}
|
|
177
|
+
handleUpstreamClosed(up) {
|
|
178
|
+
if (up !== this.upstream) return;
|
|
179
|
+
this.upstream = null;
|
|
180
|
+
this.ready = false;
|
|
181
|
+
for (const key of this.pending) {
|
|
182
|
+
this.opts.send({ jsonrpc: "2.0", id: JSON.parse(key), error: { code: -32e3, message: LOST_MESSAGE } });
|
|
183
|
+
}
|
|
184
|
+
this.pending.clear();
|
|
185
|
+
this.clientInitInFlight = null;
|
|
186
|
+
for (const resolve of this.replayWaiters.values()) resolve(null);
|
|
187
|
+
this.replayWaiters.clear();
|
|
188
|
+
this.opts.log("Lost the connection to CodeTrellis; reconnecting.");
|
|
189
|
+
this.scheduleRetry();
|
|
190
|
+
}
|
|
191
|
+
// ── Connection lifecycle ──────────────────────────────────────────
|
|
192
|
+
async connectOnce() {
|
|
193
|
+
if (this.stopped || this.upstream) return;
|
|
194
|
+
let up;
|
|
195
|
+
try {
|
|
196
|
+
up = await this.opts.connect();
|
|
197
|
+
} catch (err) {
|
|
198
|
+
if (!this.announcedDown) {
|
|
199
|
+
this.opts.log(`Waiting for CodeTrellis (${err instanceof Error ? err.message : String(err)}).`);
|
|
200
|
+
this.announcedDown = true;
|
|
201
|
+
}
|
|
202
|
+
this.scheduleRetry();
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (this.stopped) {
|
|
206
|
+
up.close();
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
this.upstream = up;
|
|
210
|
+
this.ready = false;
|
|
211
|
+
this.retryMs = this.opts.retryMinMs;
|
|
212
|
+
this.announcedDown = false;
|
|
213
|
+
up.onmessage = (m) => this.handleUpstreamMessage(up, m);
|
|
214
|
+
up.onclose = () => this.handleUpstreamClosed(up);
|
|
215
|
+
this.opts.log("Connected to CodeTrellis.");
|
|
216
|
+
if (this.initRequest && this.clientInitInFlight === null && !this.deciding) {
|
|
217
|
+
await this.replayInitialize(up);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
async replayInitialize(up) {
|
|
221
|
+
const id = `${REPLAY_ID_PREFIX}${++this.replaySeq}`;
|
|
222
|
+
const reply = new Promise((resolve) => {
|
|
223
|
+
const timer = setTimeout(() => resolve(null), this.opts.replayTimeoutMs);
|
|
224
|
+
this.replayWaiters.set(id, (m) => {
|
|
225
|
+
clearTimeout(timer);
|
|
226
|
+
this.replayWaiters.delete(id);
|
|
227
|
+
resolve(m);
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
try {
|
|
231
|
+
await up.send({ jsonrpc: "2.0", id, method: "initialize", params: this.initRequest.params });
|
|
232
|
+
} catch {
|
|
233
|
+
up.close();
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
const answer = await reply;
|
|
237
|
+
if (up !== this.upstream) return;
|
|
238
|
+
if (!answer || answer.error) {
|
|
239
|
+
this.opts.log(`CodeTrellis refused the handshake${answer?.error ? `: ${answer.error.message}` : " (timed out)"}; retrying.`);
|
|
240
|
+
up.close();
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
try {
|
|
244
|
+
await up.send({ jsonrpc: "2.0", method: "notifications/initialized" });
|
|
245
|
+
} catch {
|
|
246
|
+
up.close();
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
this.ready = true;
|
|
250
|
+
this.opts.send({ jsonrpc: "2.0", method: "notifications/tools/list_changed" });
|
|
251
|
+
this.opts.send({ jsonrpc: "2.0", method: "notifications/resources/list_changed" });
|
|
252
|
+
}
|
|
253
|
+
scheduleRetry() {
|
|
254
|
+
if (this.stopped || this.retryTimer) return;
|
|
255
|
+
const wait = this.retryMs;
|
|
256
|
+
this.retryMs = Math.min(this.retryMs * 2, this.opts.retryMaxMs);
|
|
257
|
+
this.retryTimer = setTimeout(() => {
|
|
258
|
+
this.retryTimer = null;
|
|
259
|
+
void this.connectOnce();
|
|
260
|
+
}, wait);
|
|
261
|
+
}
|
|
262
|
+
async forward(msg) {
|
|
263
|
+
const up = this.upstream;
|
|
264
|
+
if (!up) return;
|
|
265
|
+
try {
|
|
266
|
+
await up.send(msg);
|
|
267
|
+
} catch {
|
|
268
|
+
up.close();
|
|
269
|
+
this.handleUpstreamClosed(up);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
274
|
+
0 && (module.exports = {
|
|
275
|
+
ConnectorCore,
|
|
276
|
+
LOST_MESSAGE,
|
|
277
|
+
NOT_RUNNING_MESSAGE
|
|
278
|
+
});
|