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,387 @@
|
|
|
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 replay_frames_exports = {};
|
|
29
|
+
__export(replay_frames_exports, {
|
|
30
|
+
DEFAULT_FRAME_LIMIT: () => DEFAULT_FRAME_LIMIT,
|
|
31
|
+
MAX_FRAME_LIMIT: () => MAX_FRAME_LIMIT,
|
|
32
|
+
frameIntervalMs: () => frameIntervalMs,
|
|
33
|
+
frameRefusal: () => frameRefusal,
|
|
34
|
+
framesByCommit: () => framesByCommit,
|
|
35
|
+
graphDigest: () => graphDigest,
|
|
36
|
+
holdsProject: () => holdsProject,
|
|
37
|
+
listFrames: () => listFrames,
|
|
38
|
+
mergeTriggers: () => mergeTriggers,
|
|
39
|
+
noteAgentActivity: () => noteAgentActivity,
|
|
40
|
+
noteRefsChanged: () => noteRefsChanged,
|
|
41
|
+
parseWorktreeList: () => parseWorktreeList,
|
|
42
|
+
pruneFrames: () => pruneFrames,
|
|
43
|
+
requestFrame: () => requestFrame,
|
|
44
|
+
seedHeads: () => seedHeads,
|
|
45
|
+
setFramePublisher: () => setFramePublisher,
|
|
46
|
+
setHeldProject: () => setHeldProject,
|
|
47
|
+
startReplayFrames: () => startReplayFrames,
|
|
48
|
+
takeFrame: () => takeFrame,
|
|
49
|
+
turnGapMs: () => turnGapMs
|
|
50
|
+
});
|
|
51
|
+
module.exports = __toCommonJS(replay_frames_exports);
|
|
52
|
+
var import_node_crypto = require("node:crypto");
|
|
53
|
+
var import_node_child_process = require("node:child_process");
|
|
54
|
+
var import_node_fs = __toESM(require("node:fs"));
|
|
55
|
+
var import_database = require("./database");
|
|
56
|
+
var import_persistence = require("./persistence");
|
|
57
|
+
var import_git_checkout = require("./git-checkout");
|
|
58
|
+
var import_trellis_service = require("./trellis-service");
|
|
59
|
+
var import_workstream_watch_service = require("./workstream-watch-service");
|
|
60
|
+
var import_retention = require("./retention");
|
|
61
|
+
var import_turn_gap = require("../../shared/lib/turn-gap");
|
|
62
|
+
const frameIntervalMs = () => Number(process.env.CODETRELLIS_FRAME_INTERVAL_MS) || 1e4;
|
|
63
|
+
const turnGapMs = () => Number(process.env.CODETRELLIS_TURN_GAP_MS) || import_turn_gap.TURN_GAP_MS;
|
|
64
|
+
const DEFAULT_FRAME_LIMIT = 500;
|
|
65
|
+
const MAX_FRAME_LIMIT = 2e3;
|
|
66
|
+
const trimRoot = (p) => p.replace(/[\\/]+$/, "");
|
|
67
|
+
let held = () => ({ path: null, scanning: null });
|
|
68
|
+
function setHeldProject(fn) {
|
|
69
|
+
held = fn;
|
|
70
|
+
}
|
|
71
|
+
let publisher = null;
|
|
72
|
+
function setFramePublisher(fn) {
|
|
73
|
+
publisher = fn;
|
|
74
|
+
}
|
|
75
|
+
function graphDigest(graph) {
|
|
76
|
+
const files = graph.files.map((f) => `${f.path}\0${f.contentHash}`).sort();
|
|
77
|
+
const edges = graph.edges.map((e) => `${e.source}\0${e.target}\0${[...e.specifiers].sort().join(",")}`).sort();
|
|
78
|
+
return (0, import_node_crypto.createHash)("sha256").update(files.join("\n")).update("").update(edges.join("\n")).digest("hex");
|
|
79
|
+
}
|
|
80
|
+
function mergeTriggers(triggers) {
|
|
81
|
+
const reasons = [];
|
|
82
|
+
const merged = { projectPath: triggers[0].projectPath, reason: triggers[0].reason, reasons };
|
|
83
|
+
for (const t of triggers) {
|
|
84
|
+
if (!reasons.includes(t.reason)) reasons.push(t.reason);
|
|
85
|
+
if (t.ref) merged.ref = t.ref;
|
|
86
|
+
if (t.sessionId) {
|
|
87
|
+
merged.sessionId = t.sessionId;
|
|
88
|
+
merged.agentType = t.agentType ?? null;
|
|
89
|
+
}
|
|
90
|
+
if (t.workstreamRoot) merged.workstreamRoot = t.workstreamRoot;
|
|
91
|
+
if (t.commitSha) merged.commitSha = t.commitSha;
|
|
92
|
+
}
|
|
93
|
+
return merged;
|
|
94
|
+
}
|
|
95
|
+
function frameRefusal(projectPath, now) {
|
|
96
|
+
if (now.scanning) return "scanning";
|
|
97
|
+
if (!now.path || trimRoot(now.path) !== trimRoot(projectPath)) return "other-project";
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
function holdsProject(projectPath) {
|
|
101
|
+
return frameRefusal(projectPath, held()) === null;
|
|
102
|
+
}
|
|
103
|
+
function git(root, args) {
|
|
104
|
+
try {
|
|
105
|
+
return (0, import_node_child_process.execFileSync)("git", ["-C", root, ...args], {
|
|
106
|
+
encoding: "utf-8",
|
|
107
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
108
|
+
timeout: 5e3,
|
|
109
|
+
maxBuffer: 4 * 1024 * 1024
|
|
110
|
+
});
|
|
111
|
+
} catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function headSha(root) {
|
|
116
|
+
const out = git(root, ["rev-parse", "HEAD"])?.trim() ?? "";
|
|
117
|
+
return /^[0-9a-f]{40,64}$/.test(out) ? out : null;
|
|
118
|
+
}
|
|
119
|
+
const canonical = (p) => {
|
|
120
|
+
try {
|
|
121
|
+
return import_node_fs.default.realpathSync(p);
|
|
122
|
+
} catch {
|
|
123
|
+
return trimRoot(p);
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
function parseWorktreeList(porcelain) {
|
|
127
|
+
const heads2 = /* @__PURE__ */ new Map();
|
|
128
|
+
for (const block of porcelain.split(/\n\s*\n/)) {
|
|
129
|
+
const root = /^worktree (.+)$/m.exec(block)?.[1];
|
|
130
|
+
const head = /^HEAD ([0-9a-f]{40,64})$/m.exec(block)?.[1];
|
|
131
|
+
if (root && head && !/^bare$/m.test(block)) heads2.set(root, head);
|
|
132
|
+
}
|
|
133
|
+
return heads2;
|
|
134
|
+
}
|
|
135
|
+
function checkoutHeads(project) {
|
|
136
|
+
const out = git(project, ["worktree", "list", "--porcelain"]);
|
|
137
|
+
return out ? parseWorktreeList(out) : /* @__PURE__ */ new Map();
|
|
138
|
+
}
|
|
139
|
+
function takeFrame(m) {
|
|
140
|
+
const refusal = frameRefusal(m.projectPath, held());
|
|
141
|
+
if (refusal) return refusal;
|
|
142
|
+
const db = (0, import_database.getDb)();
|
|
143
|
+
const project = trimRoot(m.projectPath);
|
|
144
|
+
const reasons = m.reasons ?? [m.reason];
|
|
145
|
+
const graph = (0, import_trellis_service.readLiveGraph)();
|
|
146
|
+
const digest = graphDigest(graph);
|
|
147
|
+
const last = db.exec(
|
|
148
|
+
`SELECT id, digest, same_as FROM trellis_snapshots
|
|
149
|
+
WHERE snapshot_type = 'frame' AND project_path = ? ORDER BY created_at DESC, id DESC LIMIT 1`,
|
|
150
|
+
[project]
|
|
151
|
+
)[0]?.values[0];
|
|
152
|
+
const sameAs = last && last[1] === digest ? last[2] ?? last[0] : null;
|
|
153
|
+
const commitSha = m.commitSha ?? headSha(m.projectPath);
|
|
154
|
+
const branch = (0, import_git_checkout.currentBranch)(m.projectPath);
|
|
155
|
+
const at = Date.now();
|
|
156
|
+
db.run(
|
|
157
|
+
`INSERT INTO trellis_snapshots
|
|
158
|
+
(name, snapshot_type, plan_uid, git_branch, files_json, edges_json, created_at,
|
|
159
|
+
project_path, reason, ref, session_id, agent_type, workstream_root, commit_sha, digest, same_as)
|
|
160
|
+
VALUES (?, 'frame', NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
161
|
+
[
|
|
162
|
+
`Frame: ${reasons.join(", ")}`,
|
|
163
|
+
branch,
|
|
164
|
+
sameAs ? "[]" : JSON.stringify(graph.files),
|
|
165
|
+
sameAs ? "[]" : JSON.stringify(graph.edges),
|
|
166
|
+
at,
|
|
167
|
+
project,
|
|
168
|
+
reasons.join(","),
|
|
169
|
+
m.ref ?? null,
|
|
170
|
+
m.sessionId ?? null,
|
|
171
|
+
m.agentType ?? null,
|
|
172
|
+
m.workstreamRoot ?? null,
|
|
173
|
+
commitSha,
|
|
174
|
+
digest,
|
|
175
|
+
sameAs
|
|
176
|
+
]
|
|
177
|
+
);
|
|
178
|
+
const id = db.exec("SELECT last_insert_rowid()")[0]?.values[0]?.[0] || 0;
|
|
179
|
+
(0, import_persistence.markDirty)();
|
|
180
|
+
const frame = {
|
|
181
|
+
id,
|
|
182
|
+
at,
|
|
183
|
+
projectPath: project,
|
|
184
|
+
reasons,
|
|
185
|
+
ref: m.ref ?? null,
|
|
186
|
+
sessionId: m.sessionId ?? null,
|
|
187
|
+
agentType: m.agentType ?? null,
|
|
188
|
+
workstreamRoot: m.workstreamRoot ?? null,
|
|
189
|
+
commitSha,
|
|
190
|
+
branch,
|
|
191
|
+
digest,
|
|
192
|
+
sameAs,
|
|
193
|
+
fileCount: graph.files.length,
|
|
194
|
+
edgeCount: graph.edges.length
|
|
195
|
+
};
|
|
196
|
+
try {
|
|
197
|
+
publisher?.("replay-frame", frame);
|
|
198
|
+
} catch {
|
|
199
|
+
}
|
|
200
|
+
return frame;
|
|
201
|
+
}
|
|
202
|
+
const lastFrameAt = /* @__PURE__ */ new Map();
|
|
203
|
+
const pending = /* @__PURE__ */ new Map();
|
|
204
|
+
function requestFrame(trigger) {
|
|
205
|
+
if (!trigger.projectPath) return;
|
|
206
|
+
const key = trimRoot(trigger.projectPath);
|
|
207
|
+
const open = pending.get(key);
|
|
208
|
+
if (open) {
|
|
209
|
+
open.triggers.push(trigger);
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const wait = Math.max(0, (lastFrameAt.get(key) ?? 0) + frameIntervalMs() - Date.now());
|
|
213
|
+
const timer = setTimeout(() => flush(key), wait);
|
|
214
|
+
timer.unref?.();
|
|
215
|
+
pending.set(key, { triggers: [trigger], timer });
|
|
216
|
+
}
|
|
217
|
+
function flush(key) {
|
|
218
|
+
const open = pending.get(key);
|
|
219
|
+
pending.delete(key);
|
|
220
|
+
if (!open) return;
|
|
221
|
+
lastFrameAt.set(key, Date.now());
|
|
222
|
+
try {
|
|
223
|
+
const result = takeFrame(mergeTriggers(open.triggers));
|
|
224
|
+
if (result === "scanning") for (const t of open.triggers) requestFrame(t);
|
|
225
|
+
} catch (err) {
|
|
226
|
+
console.warn("[Replay] Frame not taken:", err instanceof Error ? err.message : err);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
const turns = /* @__PURE__ */ new Map();
|
|
230
|
+
function heldProjectOf(root) {
|
|
231
|
+
const project = held().path;
|
|
232
|
+
if (!project) return null;
|
|
233
|
+
if (!root || trimRoot(root) === trimRoot(project)) return project;
|
|
234
|
+
const target = canonical(root);
|
|
235
|
+
return [...checkoutHeads(project).keys()].some((r) => canonical(r) === target) ? project : null;
|
|
236
|
+
}
|
|
237
|
+
function noteAgentActivity(e) {
|
|
238
|
+
const key = e.sessionId ?? (e.workstreamRoot ? `workstream:${e.workstreamRoot}` : null);
|
|
239
|
+
if (!key) return;
|
|
240
|
+
const running = turns.get(key);
|
|
241
|
+
if (running) clearTimeout(running);
|
|
242
|
+
const timer = setTimeout(() => {
|
|
243
|
+
turns.delete(key);
|
|
244
|
+
const project = heldProjectOf(e.workstreamRoot);
|
|
245
|
+
if (project) {
|
|
246
|
+
requestFrame({
|
|
247
|
+
projectPath: project,
|
|
248
|
+
reason: "turn-end",
|
|
249
|
+
sessionId: e.sessionId,
|
|
250
|
+
agentType: e.agentType,
|
|
251
|
+
workstreamRoot: e.workstreamRoot
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
}, turnGapMs());
|
|
255
|
+
timer.unref?.();
|
|
256
|
+
turns.set(key, timer);
|
|
257
|
+
}
|
|
258
|
+
const heads = /* @__PURE__ */ new Map();
|
|
259
|
+
function seedHeads(project) {
|
|
260
|
+
heads.clear();
|
|
261
|
+
if (!project) return;
|
|
262
|
+
for (const [root, head] of checkoutHeads(project)) heads.set(root, head);
|
|
263
|
+
(0, import_workstream_watch_service.watchRefs)(project).catch(() => {
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
function noteRefsChanged() {
|
|
267
|
+
const project = held().path;
|
|
268
|
+
if (!project) return;
|
|
269
|
+
const now = checkoutHeads(project);
|
|
270
|
+
for (const [root, head] of now) {
|
|
271
|
+
const before = heads.get(root);
|
|
272
|
+
if (before && before !== head) {
|
|
273
|
+
requestFrame({ projectPath: project, reason: "commit", ref: head, commitSha: head, workstreamRoot: root });
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
heads.clear();
|
|
277
|
+
for (const [root, head] of now) heads.set(root, head);
|
|
278
|
+
}
|
|
279
|
+
function framesByCommit(projectPath, shas) {
|
|
280
|
+
const out = /* @__PURE__ */ new Map();
|
|
281
|
+
const wanted = shas.filter((s) => /^[0-9a-f]{40,64}$/.test(s));
|
|
282
|
+
for (let i = 0; i < wanted.length; i += 200) {
|
|
283
|
+
const batch = wanted.slice(i, i + 200);
|
|
284
|
+
const rows = (0, import_database.getDb)().exec(
|
|
285
|
+
`SELECT commit_sha, agent_type, session_id, workstream_root FROM trellis_snapshots
|
|
286
|
+
WHERE snapshot_type = 'frame' AND project_path = ? AND commit_sha IN (${batch.map(() => "?").join(",")})
|
|
287
|
+
ORDER BY created_at ASC`,
|
|
288
|
+
[trimRoot(projectPath), ...batch]
|
|
289
|
+
)[0]?.values ?? [];
|
|
290
|
+
for (const r of rows) {
|
|
291
|
+
const prior = out.get(r[0]);
|
|
292
|
+
if (prior?.agentType && !r[1]) continue;
|
|
293
|
+
out.set(r[0], { agentType: r[1] ?? null, sessionId: r[2] ?? null, workstreamRoot: r[3] ?? null });
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return out;
|
|
297
|
+
}
|
|
298
|
+
function listFrames(projectPath, q = {}) {
|
|
299
|
+
const where = [`t.snapshot_type = 'frame'`, "t.project_path = ?"];
|
|
300
|
+
const params = [trimRoot(projectPath)];
|
|
301
|
+
if (Number.isFinite(q.from)) {
|
|
302
|
+
where.push("t.created_at >= ?");
|
|
303
|
+
params.push(q.from);
|
|
304
|
+
}
|
|
305
|
+
if (Number.isFinite(q.to)) {
|
|
306
|
+
where.push("t.created_at <= ?");
|
|
307
|
+
params.push(q.to);
|
|
308
|
+
}
|
|
309
|
+
const limit = Math.min(Math.max(1, Math.floor(q.limit ?? DEFAULT_FRAME_LIMIT)), MAX_FRAME_LIMIT);
|
|
310
|
+
params.push(limit);
|
|
311
|
+
const rows = (0, import_database.getDb)().exec(
|
|
312
|
+
`SELECT t.id, t.created_at, t.project_path, t.reason, t.ref, t.session_id, t.agent_type, t.workstream_root,
|
|
313
|
+
t.commit_sha, t.git_branch, t.digest, t.same_as,
|
|
314
|
+
json_array_length(COALESCE(o.files_json, t.files_json)), json_array_length(COALESCE(o.edges_json, t.edges_json))
|
|
315
|
+
FROM trellis_snapshots t LEFT JOIN trellis_snapshots o ON o.id = t.same_as
|
|
316
|
+
WHERE ${where.join(" AND ")} ORDER BY t.created_at ${q.newestFirst ? "DESC" : "ASC"}, t.id ${q.newestFirst ? "DESC" : "ASC"} LIMIT ?`,
|
|
317
|
+
params
|
|
318
|
+
)[0]?.values ?? [];
|
|
319
|
+
return rows.map((r) => ({
|
|
320
|
+
id: r[0],
|
|
321
|
+
at: r[1],
|
|
322
|
+
projectPath: r[2],
|
|
323
|
+
reasons: String(r[3] ?? "").split(",").filter(Boolean),
|
|
324
|
+
ref: r[4] ?? null,
|
|
325
|
+
sessionId: r[5] ?? null,
|
|
326
|
+
agentType: r[6] ?? null,
|
|
327
|
+
workstreamRoot: r[7] ?? null,
|
|
328
|
+
commitSha: r[8] ?? null,
|
|
329
|
+
branch: r[9] ?? null,
|
|
330
|
+
digest: String(r[10] ?? ""),
|
|
331
|
+
sameAs: r[11] ?? null,
|
|
332
|
+
fileCount: Number(r[12]) || 0,
|
|
333
|
+
edgeCount: Number(r[13]) || 0
|
|
334
|
+
}));
|
|
335
|
+
}
|
|
336
|
+
function pruneFrames(now = Date.now()) {
|
|
337
|
+
const cutoff = (0, import_retention.retentionCutoff)(now);
|
|
338
|
+
if (cutoff === null) return 0;
|
|
339
|
+
const db = (0, import_database.getDb)();
|
|
340
|
+
const before = Number(db.exec(`SELECT COUNT(*) FROM trellis_snapshots WHERE snapshot_type = 'frame'`)[0]?.values[0]?.[0]) || 0;
|
|
341
|
+
db.run(
|
|
342
|
+
`DELETE FROM trellis_snapshots WHERE snapshot_type = 'frame' AND created_at < ?
|
|
343
|
+
AND id NOT IN (SELECT same_as FROM trellis_snapshots WHERE same_as IS NOT NULL AND created_at >= ?)`,
|
|
344
|
+
[cutoff, cutoff]
|
|
345
|
+
);
|
|
346
|
+
const after = Number(db.exec(`SELECT COUNT(*) FROM trellis_snapshots WHERE snapshot_type = 'frame'`)[0]?.values[0]?.[0]) || 0;
|
|
347
|
+
db.run("DELETE FROM awareness_signal_spans WHERE closed_at IS NOT NULL AND closed_at < ?", [cutoff]);
|
|
348
|
+
if (after !== before) (0, import_persistence.markDirty)();
|
|
349
|
+
return before - after;
|
|
350
|
+
}
|
|
351
|
+
let pruneTimer = null;
|
|
352
|
+
function startReplayFrames() {
|
|
353
|
+
(0, import_database.getDb)().run("CREATE INDEX IF NOT EXISTS idx_trellis_frames ON trellis_snapshots(project_path, created_at)");
|
|
354
|
+
pruneFrames();
|
|
355
|
+
if (!pruneTimer) {
|
|
356
|
+
pruneTimer = setInterval(() => {
|
|
357
|
+
try {
|
|
358
|
+
pruneFrames();
|
|
359
|
+
} catch {
|
|
360
|
+
}
|
|
361
|
+
}, 60 * 60 * 1e3);
|
|
362
|
+
pruneTimer.unref?.();
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
366
|
+
0 && (module.exports = {
|
|
367
|
+
DEFAULT_FRAME_LIMIT,
|
|
368
|
+
MAX_FRAME_LIMIT,
|
|
369
|
+
frameIntervalMs,
|
|
370
|
+
frameRefusal,
|
|
371
|
+
framesByCommit,
|
|
372
|
+
graphDigest,
|
|
373
|
+
holdsProject,
|
|
374
|
+
listFrames,
|
|
375
|
+
mergeTriggers,
|
|
376
|
+
noteAgentActivity,
|
|
377
|
+
noteRefsChanged,
|
|
378
|
+
parseWorktreeList,
|
|
379
|
+
pruneFrames,
|
|
380
|
+
requestFrame,
|
|
381
|
+
seedHeads,
|
|
382
|
+
setFramePublisher,
|
|
383
|
+
setHeldProject,
|
|
384
|
+
startReplayFrames,
|
|
385
|
+
takeFrame,
|
|
386
|
+
turnGapMs
|
|
387
|
+
});
|
|
@@ -0,0 +1,201 @@
|
|
|
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 replay_state_exports = {};
|
|
19
|
+
__export(replay_state_exports, {
|
|
20
|
+
itemsAt: () => itemsAt,
|
|
21
|
+
stateAt: () => stateAt
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(replay_state_exports);
|
|
24
|
+
var import_database = require("./database");
|
|
25
|
+
var import_trellis_service = require("./trellis-service");
|
|
26
|
+
var import_replay_frames = require("./replay-frames");
|
|
27
|
+
var import_breakpoint_service = require("./breakpoint-service");
|
|
28
|
+
var import_plan_item_service = require("./plan-item-service");
|
|
29
|
+
var import_stack_service = require("./stack-service");
|
|
30
|
+
const trimRoot = (p) => p.replace(/[\\/]+$/, "");
|
|
31
|
+
const rows = (sql, params = []) => (0, import_database.getDb)().exec(sql, params)[0]?.values ?? [];
|
|
32
|
+
const parse = (s, fallback) => {
|
|
33
|
+
try {
|
|
34
|
+
return JSON.parse(String(s));
|
|
35
|
+
} catch {
|
|
36
|
+
return fallback;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
function frameAt(projectPath, at) {
|
|
40
|
+
return (0, import_replay_frames.listFrames)(projectPath, { to: at, limit: 1, newestFirst: true })[0] ?? null;
|
|
41
|
+
}
|
|
42
|
+
const KEPT = [
|
|
43
|
+
["title", ""],
|
|
44
|
+
["assignee", null],
|
|
45
|
+
["assigneeType", null],
|
|
46
|
+
["dependencies", []],
|
|
47
|
+
["workstream", null],
|
|
48
|
+
["fileSpecs", []],
|
|
49
|
+
["symbolSpecs", []],
|
|
50
|
+
["parentUid", null]
|
|
51
|
+
];
|
|
52
|
+
function itemsAt(projectPath, at) {
|
|
53
|
+
const plans = rows(
|
|
54
|
+
// The plan list's order, so rows keep their places as the cursor moves.
|
|
55
|
+
"SELECT uid, title, status FROM plans WHERE (project_path = ? OR project_path = ?) AND created_at <= ? ORDER BY updated_at DESC",
|
|
56
|
+
[projectPath, trimRoot(projectPath), at]
|
|
57
|
+
);
|
|
58
|
+
if (plans.length === 0) return [];
|
|
59
|
+
const uids = plans.map((r) => r[0]);
|
|
60
|
+
const marks = uids.map(() => "?").join(",");
|
|
61
|
+
const changes = /* @__PURE__ */ new Map();
|
|
62
|
+
for (const r of rows(
|
|
63
|
+
`SELECT item_uid, created_at, before_state, after_state FROM plan_events
|
|
64
|
+
WHERE plan_uid IN (${marks}) AND event_type = 'status_changed' ORDER BY created_at, id`,
|
|
65
|
+
uids
|
|
66
|
+
)) {
|
|
67
|
+
const list = changes.get(r[0]) ?? [];
|
|
68
|
+
list.push({
|
|
69
|
+
when: r[1],
|
|
70
|
+
before: parse(r[2], {}).status ?? null,
|
|
71
|
+
after: parse(r[3], {}).status ?? null
|
|
72
|
+
});
|
|
73
|
+
changes.set(r[0], list);
|
|
74
|
+
}
|
|
75
|
+
const statusThen = (uid, now) => {
|
|
76
|
+
const list = changes.get(uid) ?? [];
|
|
77
|
+
const lastBy = [...list].reverse().find((c) => c.when <= at);
|
|
78
|
+
const firstAfter = list.find((c) => c.when > at);
|
|
79
|
+
return lastBy ? lastBy.after : firstAfter ? firstAfter.before : now;
|
|
80
|
+
};
|
|
81
|
+
const snapshot = /* @__PURE__ */ new Map();
|
|
82
|
+
for (const r of rows(
|
|
83
|
+
`SELECT v.item_uid, v.meta_snapshot FROM plan_item_versions v JOIN plan_items i ON i.uid = v.item_uid
|
|
84
|
+
WHERE i.plan_uid IN (${marks}) AND v.created_at <= ? ORDER BY v.item_uid, v.version`,
|
|
85
|
+
[...uids, at]
|
|
86
|
+
)) snapshot.set(r[0], parse(r[1], {}));
|
|
87
|
+
const out = [];
|
|
88
|
+
for (const r of plans) {
|
|
89
|
+
const planUid = r[0];
|
|
90
|
+
const items = (0, import_plan_item_service.listAllItems)(planUid).filter((i) => i.createdAt <= at).map((now) => {
|
|
91
|
+
const then = { ...now };
|
|
92
|
+
const snap = snapshot.get(now.uid);
|
|
93
|
+
if (snap) {
|
|
94
|
+
for (const [key, missing] of KEPT) then[key] = snap[key] ?? missing;
|
|
95
|
+
}
|
|
96
|
+
if (then.assignee !== now.assignee) then.assigneeSession = null;
|
|
97
|
+
if (now.kind === "action") then.status = statusThen(now.uid, now.status ?? null);
|
|
98
|
+
return then;
|
|
99
|
+
});
|
|
100
|
+
const status = r[2];
|
|
101
|
+
const finishedNow = status === "completed" || status === "archived";
|
|
102
|
+
const openThen = items.some((i) => i.kind === "action" && i.status !== "done" && i.status !== "skipped");
|
|
103
|
+
out.push({ plan: { uid: planUid, title: r[1], status: finishedNow && openThen ? "in_progress" : status }, items });
|
|
104
|
+
}
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
function tasksAt(then, stack) {
|
|
108
|
+
const rowOf = new Map(stack.plans.flatMap((p) => p.tasks.map((t) => [t.uid, t])));
|
|
109
|
+
const nowStatus = /* @__PURE__ */ new Map();
|
|
110
|
+
for (const p of then) for (const i of (0, import_plan_item_service.listAllItems)(p.plan.uid)) nowStatus.set(i.uid, i.status ?? null);
|
|
111
|
+
return then.flatMap((p) => p.items.filter((i) => i.kind === "action").map((i) => {
|
|
112
|
+
const row = rowOf.get(i.uid);
|
|
113
|
+
const status = i.status ?? null;
|
|
114
|
+
const now = nowStatus.get(i.uid) ?? null;
|
|
115
|
+
const task = {
|
|
116
|
+
uid: i.uid,
|
|
117
|
+
planUid: p.plan.uid,
|
|
118
|
+
planTitle: p.plan.title,
|
|
119
|
+
title: i.title,
|
|
120
|
+
status,
|
|
121
|
+
assignee: i.assignee ?? null,
|
|
122
|
+
workstream: row?.workstream ?? null,
|
|
123
|
+
dependencies: i.dependencies ?? []
|
|
124
|
+
};
|
|
125
|
+
if (status !== now) task.statusNow = now;
|
|
126
|
+
return task;
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
129
|
+
function waitingAt(projectPath, at) {
|
|
130
|
+
return rows(
|
|
131
|
+
`SELECT h.ref FROM breakpoint_hits h JOIN breakpoints b ON b.id = h.breakpoint_id
|
|
132
|
+
LEFT JOIN plans p ON p.uid = COALESCE(h.plan_uid, b.plan_uid)
|
|
133
|
+
WHERE (b.project_root IN (?, ?) OR p.project_path IN (?, ?))
|
|
134
|
+
AND h.hit_at <= ? AND (h.answered_at IS NULL OR h.answered_at > ?)
|
|
135
|
+
ORDER BY h.hit_at`,
|
|
136
|
+
[projectPath, trimRoot(projectPath), projectPath, trimRoot(projectPath), at, at]
|
|
137
|
+
).map((r) => (0, import_breakpoint_service.getHit)(r[0])).filter((h) => h !== null);
|
|
138
|
+
}
|
|
139
|
+
function signalsAt(projectPath, at) {
|
|
140
|
+
const roots = [projectPath, trimRoot(projectPath)];
|
|
141
|
+
const spans = rows(
|
|
142
|
+
`SELECT p.signal_id, p.kind, p.severity, p.summary, p.workstreams, p.opened_at, p.closed_at, s.subject
|
|
143
|
+
FROM awareness_signal_spans p LEFT JOIN awareness_signals s ON s.id = p.signal_id
|
|
144
|
+
WHERE p.project_root IN (?, ?) AND p.opened_at <= ? AND (p.closed_at IS NULL OR p.closed_at > ?)`,
|
|
145
|
+
[...roots, at, at]
|
|
146
|
+
).map((r) => ({
|
|
147
|
+
id: r[0],
|
|
148
|
+
kind: r[1],
|
|
149
|
+
subject: parse(r[7], {}),
|
|
150
|
+
severity: r[2],
|
|
151
|
+
summary: r[3],
|
|
152
|
+
workstreams: parse(r[4], []),
|
|
153
|
+
openedAt: r[5],
|
|
154
|
+
closedAt: r[6] ?? null
|
|
155
|
+
}));
|
|
156
|
+
const older = rows(
|
|
157
|
+
`SELECT s.id, s.kind, s.severity, s.summary, s.workstreams, s.first_seen, s.resolved_at, s.subject FROM awareness_signals s
|
|
158
|
+
WHERE s.project_root IN (?, ?) AND s.first_seen <= ? AND (s.resolved_at IS NULL OR s.resolved_at > ?)
|
|
159
|
+
AND NOT EXISTS (SELECT 1 FROM awareness_signal_spans p WHERE p.signal_id = s.id)`,
|
|
160
|
+
[...roots, at, at]
|
|
161
|
+
).map((r) => ({
|
|
162
|
+
id: r[0],
|
|
163
|
+
kind: r[1],
|
|
164
|
+
subject: parse(r[7], {}),
|
|
165
|
+
severity: r[2],
|
|
166
|
+
summary: r[3],
|
|
167
|
+
workstreams: parse(r[4], []),
|
|
168
|
+
openedAt: r[5],
|
|
169
|
+
closedAt: r[6] ?? null
|
|
170
|
+
}));
|
|
171
|
+
return [...spans, ...older].sort((a, b) => a.openedAt - b.openedAt);
|
|
172
|
+
}
|
|
173
|
+
function stateAt(projectPath, at, holdsProject) {
|
|
174
|
+
const frame = frameAt(projectPath, at);
|
|
175
|
+
const waiting = waitingAt(projectPath, at);
|
|
176
|
+
const signals = signalsAt(projectPath, at);
|
|
177
|
+
const then = itemsAt(projectPath, at);
|
|
178
|
+
const stack = (0, import_stack_service.stackThen)(
|
|
179
|
+
projectPath,
|
|
180
|
+
then.filter((p) => p.plan.status !== "completed" && p.plan.status !== "archived"),
|
|
181
|
+
// Open then, whatever became of them since.
|
|
182
|
+
signals.map((sig) => ({ ...sig, kind: sig.kind, severity: sig.severity, state: "open" })),
|
|
183
|
+
waiting,
|
|
184
|
+
at
|
|
185
|
+
);
|
|
186
|
+
return {
|
|
187
|
+
at,
|
|
188
|
+
projectPath: trimRoot(projectPath),
|
|
189
|
+
frame,
|
|
190
|
+
sinceFrame: frame && holdsProject ? (0, import_trellis_service.computeTrellisDiff)(frame.id) : null,
|
|
191
|
+
tasks: tasksAt(then, stack),
|
|
192
|
+
waiting,
|
|
193
|
+
signals,
|
|
194
|
+
stack
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
198
|
+
0 && (module.exports = {
|
|
199
|
+
itemsAt,
|
|
200
|
+
stateAt
|
|
201
|
+
});
|
|
@@ -0,0 +1,108 @@
|
|
|
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 base_exports = {};
|
|
29
|
+
__export(base_exports, {
|
|
30
|
+
buildDirectoryIndex: () => buildDirectoryIndex,
|
|
31
|
+
findContainingSystem: () => findContainingSystem,
|
|
32
|
+
pickRepresentativeFile: () => pickRepresentativeFile,
|
|
33
|
+
tryExtensions: () => tryExtensions
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(base_exports);
|
|
36
|
+
var import_node_path = __toESM(require("node:path"));
|
|
37
|
+
function findContainingSystem(filePath, systems) {
|
|
38
|
+
let best = null;
|
|
39
|
+
for (const sys of systems) {
|
|
40
|
+
if (filePath === sys.rootPath || filePath.startsWith(sys.rootPath + "/")) {
|
|
41
|
+
if (!best || sys.rootPath.length > best.rootPath.length) best = sys;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return best;
|
|
45
|
+
}
|
|
46
|
+
function tryExtensions(basePath, knownFiles, extensions = [
|
|
47
|
+
"",
|
|
48
|
+
".ts",
|
|
49
|
+
".tsx",
|
|
50
|
+
".js",
|
|
51
|
+
".jsx",
|
|
52
|
+
".mjs",
|
|
53
|
+
".cjs",
|
|
54
|
+
"/index.ts",
|
|
55
|
+
"/index.tsx",
|
|
56
|
+
"/index.js",
|
|
57
|
+
"/index.jsx"
|
|
58
|
+
]) {
|
|
59
|
+
for (const ext of extensions) {
|
|
60
|
+
const candidate = basePath + ext;
|
|
61
|
+
if (knownFiles.has(candidate)) return candidate;
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
const dirIndexCache = /* @__PURE__ */ new WeakMap();
|
|
66
|
+
function buildDirectoryIndex(knownFiles, extensions) {
|
|
67
|
+
const key = [...extensions].sort().join(",");
|
|
68
|
+
let perSet = dirIndexCache.get(knownFiles);
|
|
69
|
+
if (!perSet) {
|
|
70
|
+
perSet = /* @__PURE__ */ new Map();
|
|
71
|
+
dirIndexCache.set(knownFiles, perSet);
|
|
72
|
+
}
|
|
73
|
+
const cached = perSet.get(key);
|
|
74
|
+
if (cached) return cached;
|
|
75
|
+
const index = /* @__PURE__ */ new Map();
|
|
76
|
+
for (const file of knownFiles) {
|
|
77
|
+
if (!extensions.some((ext) => file.endsWith(ext))) continue;
|
|
78
|
+
const dir = import_node_path.default.dirname(file);
|
|
79
|
+
const bucket = index.get(dir);
|
|
80
|
+
if (bucket) bucket.push(file);
|
|
81
|
+
else index.set(dir, [file]);
|
|
82
|
+
}
|
|
83
|
+
for (const bucket of index.values()) bucket.sort();
|
|
84
|
+
perSet.set(key, index);
|
|
85
|
+
return index;
|
|
86
|
+
}
|
|
87
|
+
function pickRepresentativeFile(dir, knownFiles, options) {
|
|
88
|
+
const files = buildDirectoryIndex(knownFiles, options.extensions).get(dir);
|
|
89
|
+
if (!files || files.length === 0) return null;
|
|
90
|
+
if (options.prefer) {
|
|
91
|
+
for (const ext of options.extensions) {
|
|
92
|
+
const candidate = import_node_path.default.join(dir, options.prefer + ext);
|
|
93
|
+
if (files.includes(candidate)) return candidate;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (options.deprioritize) {
|
|
97
|
+
const primary = files.find((f) => !options.deprioritize(f));
|
|
98
|
+
if (primary) return primary;
|
|
99
|
+
}
|
|
100
|
+
return files[0];
|
|
101
|
+
}
|
|
102
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
103
|
+
0 && (module.exports = {
|
|
104
|
+
buildDirectoryIndex,
|
|
105
|
+
findContainingSystem,
|
|
106
|
+
pickRepresentativeFile,
|
|
107
|
+
tryExtensions
|
|
108
|
+
});
|