codetrellis 0.0.0-stage → 0.3.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 +41 -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/cli-install.js +249 -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/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/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 +275 -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 +209 -0
- package/src/cli/conformity.js +106 -0
- package/src/cli/desktop.js +91 -0
- package/src/cli/main.js +411 -0
- package/src/cli/pipeline.js +109 -0
- package/src/cli/plan-verbs.js +259 -0
- package/src/cli/review-adapters.js +220 -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 +360 -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,69 @@
|
|
|
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 projection_service_exports = {};
|
|
19
|
+
__export(projection_service_exports, {
|
|
20
|
+
computeProjection: () => computeProjection
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(projection_service_exports);
|
|
23
|
+
var import_plan_item_service = require("./plan-item-service");
|
|
24
|
+
var import_database = require("./database");
|
|
25
|
+
function computeProjection(planUid) {
|
|
26
|
+
const existingEdges = (0, import_database.getDependencyEdges)();
|
|
27
|
+
const existingFiles = new Set(existingEdges.flatMap((e) => [e.sourceRelative, e.targetRelative]));
|
|
28
|
+
const ghostFiles = [];
|
|
29
|
+
const modifiedFiles = [];
|
|
30
|
+
const removedFiles = [];
|
|
31
|
+
const newEdges = [];
|
|
32
|
+
const removedEdgesArr = [];
|
|
33
|
+
const seenFiles = /* @__PURE__ */ new Set();
|
|
34
|
+
const items = (0, import_plan_item_service.listAllItems)(planUid).filter((i) => i.kind === "action");
|
|
35
|
+
for (const item of items) {
|
|
36
|
+
for (const fs of item.fileSpecs ?? []) {
|
|
37
|
+
if (seenFiles.has(fs.path)) continue;
|
|
38
|
+
seenFiles.add(fs.path);
|
|
39
|
+
if (fs.action === "create") {
|
|
40
|
+
ghostFiles.push({ path: fs.path, taskUid: item.uid, taskDescription: item.title });
|
|
41
|
+
} else if (fs.action === "delete") {
|
|
42
|
+
removedFiles.push({ path: fs.path, taskUid: item.uid });
|
|
43
|
+
} else if (fs.action === "move") {
|
|
44
|
+
removedFiles.push({ path: fs.path, taskUid: item.uid });
|
|
45
|
+
if (fs.moveTo && !seenFiles.has(fs.moveTo)) {
|
|
46
|
+
seenFiles.add(fs.moveTo);
|
|
47
|
+
ghostFiles.push({ path: fs.moveTo, taskUid: item.uid, taskDescription: item.title });
|
|
48
|
+
}
|
|
49
|
+
} else {
|
|
50
|
+
if (existingFiles.has(fs.path)) {
|
|
51
|
+
modifiedFiles.push({ path: fs.path, taskUid: item.uid });
|
|
52
|
+
} else {
|
|
53
|
+
ghostFiles.push({ path: fs.path, taskUid: item.uid, taskDescription: item.title });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
for (const conn of item.newConnections ?? []) {
|
|
58
|
+
newEdges.push({ from: conn.from, to: conn.to, taskUid: item.uid });
|
|
59
|
+
}
|
|
60
|
+
for (const conn of item.removedConnections ?? []) {
|
|
61
|
+
removedEdgesArr.push({ from: conn.from, to: conn.to, taskUid: item.uid });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return { ghostFiles, modifiedFiles, removedFiles, newEdges, removedEdges: removedEdgesArr };
|
|
65
|
+
}
|
|
66
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
67
|
+
0 && (module.exports = {
|
|
68
|
+
computeProjection
|
|
69
|
+
});
|
|
@@ -0,0 +1,288 @@
|
|
|
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 push_notification_service_exports = {};
|
|
19
|
+
__export(push_notification_service_exports, {
|
|
20
|
+
isPushNotificationsRunning: () => isPushNotificationsRunning,
|
|
21
|
+
listPushTokens: () => listPushTokens,
|
|
22
|
+
pushForBreakpoint: () => pushForBreakpoint,
|
|
23
|
+
pushForBudgetChange: () => pushForBudgetChange,
|
|
24
|
+
pushForChannelEvent: () => pushForChannelEvent,
|
|
25
|
+
pushForInputRequest: () => pushForInputRequest,
|
|
26
|
+
pushForSignal: () => pushForSignal,
|
|
27
|
+
pushUrl: () => pushUrl,
|
|
28
|
+
registerPushToken: () => registerPushToken,
|
|
29
|
+
startPushNotifications: () => startPushNotifications,
|
|
30
|
+
stopPushNotifications: () => stopPushNotifications,
|
|
31
|
+
unregisterPushToken: () => unregisterPushToken
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(push_notification_service_exports);
|
|
34
|
+
var import_breakpoint_words = require("../../shared/lib/breakpoint-words");
|
|
35
|
+
var import_webrtc_service = require("./webrtc-service");
|
|
36
|
+
function isDeviceActive(fingerprint) {
|
|
37
|
+
try {
|
|
38
|
+
return (0, import_webrtc_service.getPeerConnection)(fingerprint)?.state === "connected";
|
|
39
|
+
} catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const pushTokens = /* @__PURE__ */ new Map();
|
|
44
|
+
const rateLimitMap = /* @__PURE__ */ new Map();
|
|
45
|
+
const RATE_LIMIT_MS = 6e4;
|
|
46
|
+
const EXPO_PUSH_URL = "https://exp.host/--/api/v2/push/send";
|
|
47
|
+
function pushUrl(env = process.env) {
|
|
48
|
+
const u = env.CODETRELLIS_PUSH_URL;
|
|
49
|
+
return u && /^http:\/\/(?:127\.0\.0\.1|localhost)(?::\d+)?\//.test(u) ? u : EXPO_PUSH_URL;
|
|
50
|
+
}
|
|
51
|
+
const PUSH_WORTHY_EVENTS = /* @__PURE__ */ new Set([
|
|
52
|
+
"stuck",
|
|
53
|
+
"need-decision",
|
|
54
|
+
"need-context",
|
|
55
|
+
"handing-off"
|
|
56
|
+
]);
|
|
57
|
+
let started = false;
|
|
58
|
+
function startPushNotifications() {
|
|
59
|
+
if (started) return;
|
|
60
|
+
started = true;
|
|
61
|
+
console.log("[PushNotifications] Started");
|
|
62
|
+
}
|
|
63
|
+
function stopPushNotifications() {
|
|
64
|
+
if (!started) return;
|
|
65
|
+
started = false;
|
|
66
|
+
pushTokens.clear();
|
|
67
|
+
rateLimitMap.clear();
|
|
68
|
+
console.log("[PushNotifications] Stopped");
|
|
69
|
+
}
|
|
70
|
+
function isPushNotificationsRunning() {
|
|
71
|
+
return started;
|
|
72
|
+
}
|
|
73
|
+
function registerPushToken(fingerprint, token) {
|
|
74
|
+
pushTokens.set(fingerprint, {
|
|
75
|
+
token,
|
|
76
|
+
fingerprint,
|
|
77
|
+
registeredAt: Date.now()
|
|
78
|
+
});
|
|
79
|
+
console.log(`[PushNotifications] Registered token for ${fingerprint.slice(0, 12)}...`);
|
|
80
|
+
}
|
|
81
|
+
function unregisterPushToken(fingerprint) {
|
|
82
|
+
return pushTokens.delete(fingerprint);
|
|
83
|
+
}
|
|
84
|
+
function listPushTokens() {
|
|
85
|
+
return Array.from(pushTokens.values());
|
|
86
|
+
}
|
|
87
|
+
async function pushForChannelEvent(event) {
|
|
88
|
+
if (!started) return;
|
|
89
|
+
if (!PUSH_WORTHY_EVENTS.has(event.eventType)) return;
|
|
90
|
+
const tokens = Array.from(pushTokens.values());
|
|
91
|
+
if (tokens.length === 0) return;
|
|
92
|
+
const title = channelEventTitle(event);
|
|
93
|
+
const body = channelEventBody(event);
|
|
94
|
+
const payloads = [];
|
|
95
|
+
for (const { token, fingerprint } of tokens) {
|
|
96
|
+
if (isDeviceActive(fingerprint)) continue;
|
|
97
|
+
if (isRateLimited(fingerprint, event.eventType)) continue;
|
|
98
|
+
markSent(fingerprint, event.eventType);
|
|
99
|
+
payloads.push({
|
|
100
|
+
to: token,
|
|
101
|
+
title,
|
|
102
|
+
body,
|
|
103
|
+
data: {
|
|
104
|
+
type: "channel-event",
|
|
105
|
+
eventId: event.uid,
|
|
106
|
+
planUid: event.planUid,
|
|
107
|
+
eventType: event.eventType,
|
|
108
|
+
// §12 — a notice about a criterion opens its approval on the phone.
|
|
109
|
+
...typeof event.payload?.criterionUid === "string" ? { criterionUid: event.payload.criterionUid } : {},
|
|
110
|
+
...event.itemUid ? { itemUid: event.itemUid } : {}
|
|
111
|
+
},
|
|
112
|
+
sound: "default",
|
|
113
|
+
channelId: "codetrellis-events"
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
if (payloads.length > 0) {
|
|
117
|
+
await sendExpoPush(payloads);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async function pushForInputRequest(prompt, requestId, planUid) {
|
|
121
|
+
if (!started) return;
|
|
122
|
+
const tokens = Array.from(pushTokens.values());
|
|
123
|
+
if (tokens.length === 0) return;
|
|
124
|
+
const payloads = [];
|
|
125
|
+
for (const { token, fingerprint } of tokens) {
|
|
126
|
+
if (isDeviceActive(fingerprint)) continue;
|
|
127
|
+
if (isRateLimited(fingerprint, "input-request")) continue;
|
|
128
|
+
markSent(fingerprint, "input-request");
|
|
129
|
+
payloads.push({
|
|
130
|
+
to: token,
|
|
131
|
+
title: "Agent needs your input",
|
|
132
|
+
body: prompt.length > 100 ? prompt.slice(0, 97) + "..." : prompt,
|
|
133
|
+
data: {
|
|
134
|
+
type: "input-request",
|
|
135
|
+
requestId,
|
|
136
|
+
...planUid ? { planUid } : {}
|
|
137
|
+
},
|
|
138
|
+
sound: "default",
|
|
139
|
+
channelId: "codetrellis-events"
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
if (payloads.length > 0) {
|
|
143
|
+
await sendExpoPush(payloads);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async function pushForBudgetChange(planUid, planTitle, agent) {
|
|
147
|
+
if (!started) return;
|
|
148
|
+
const tokens = Array.from(pushTokens.values());
|
|
149
|
+
if (tokens.length === 0) return;
|
|
150
|
+
const payloads = [];
|
|
151
|
+
for (const { token, fingerprint } of tokens) {
|
|
152
|
+
if (isDeviceActive(fingerprint)) continue;
|
|
153
|
+
if (isRateLimited(fingerprint, "budget-change")) continue;
|
|
154
|
+
markSent(fingerprint, "budget-change");
|
|
155
|
+
payloads.push({
|
|
156
|
+
to: token,
|
|
157
|
+
title: "Budget changed by an agent",
|
|
158
|
+
body: `${agent} changed the budget on ${planTitle.length > 80 ? planTitle.slice(0, 77) + "..." : planTitle}`,
|
|
159
|
+
data: { type: "budget-change", planUid },
|
|
160
|
+
sound: "default",
|
|
161
|
+
channelId: "codetrellis-events"
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
if (payloads.length > 0) await sendExpoPush(payloads);
|
|
165
|
+
}
|
|
166
|
+
async function pushForBreakpoint(hit) {
|
|
167
|
+
if (!started) return;
|
|
168
|
+
const tokens = Array.from(pushTokens.values());
|
|
169
|
+
if (tokens.length === 0) return;
|
|
170
|
+
const who = (0, import_breakpoint_words.agentName)(hit.agent);
|
|
171
|
+
const payloads = [];
|
|
172
|
+
for (const { token, fingerprint } of tokens) {
|
|
173
|
+
if (isDeviceActive(fingerprint)) continue;
|
|
174
|
+
if (isRateLimited(fingerprint, "breakpoint")) continue;
|
|
175
|
+
markSent(fingerprint, "breakpoint");
|
|
176
|
+
payloads.push({
|
|
177
|
+
to: token,
|
|
178
|
+
title: hit.breach ? "Edited past a breakpoint" : "Waiting on you",
|
|
179
|
+
body: hit.breach ? `${who} changed code past one of your breakpoints and was told to stop.` : hit.action === "disk" ? "A document you guard changed on disk. The app kept its version until you answer." : `${who} is held at one of your breakpoints until you answer.`,
|
|
180
|
+
data: { type: "breakpoint", ref: hit.ref, ...hit.planUid ? { planUid: hit.planUid } : {} },
|
|
181
|
+
sound: "default",
|
|
182
|
+
channelId: "codetrellis-events"
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
if (payloads.length > 0) await sendExpoPush(payloads);
|
|
186
|
+
}
|
|
187
|
+
const SIGNAL_WORDS = {
|
|
188
|
+
contract: "An exported function another line of work uses has changed.",
|
|
189
|
+
collision: "Two lines of work are changing the same code.",
|
|
190
|
+
drift: "A line of work is changing files outside its task.",
|
|
191
|
+
"stale-base": "A line of work is behind main on files it changes.",
|
|
192
|
+
"version-split": "Two tasks are working from different versions of the same file.",
|
|
193
|
+
"state-split": "Two people set one task two ways at once.",
|
|
194
|
+
rule: "A line of work adds an import one of your architecture rules forbids."
|
|
195
|
+
};
|
|
196
|
+
const MATERIAL_WORDS = {
|
|
197
|
+
contract: "A file other tasks cite has changed.",
|
|
198
|
+
collision: "Two tasks write the same output file.",
|
|
199
|
+
drift: "A task is reading a file its brief does not include.",
|
|
200
|
+
"stale-base": "A file several tasks read has changed."
|
|
201
|
+
};
|
|
202
|
+
async function pushForSignal(signal) {
|
|
203
|
+
if (!started || signal.severity !== "high") return;
|
|
204
|
+
const tokens = Array.from(pushTokens.values());
|
|
205
|
+
if (tokens.length === 0) return;
|
|
206
|
+
const kind = `signal:${signal.kind}`;
|
|
207
|
+
const payloads = [];
|
|
208
|
+
for (const { token, fingerprint } of tokens) {
|
|
209
|
+
if (isDeviceActive(fingerprint)) continue;
|
|
210
|
+
if (isRateLimited(fingerprint, kind)) continue;
|
|
211
|
+
markSent(fingerprint, kind);
|
|
212
|
+
payloads.push({
|
|
213
|
+
to: token,
|
|
214
|
+
title: "Needs you",
|
|
215
|
+
body: (signal.subject?.material ? MATERIAL_WORDS[signal.kind] : void 0) ?? SIGNAL_WORDS[signal.kind],
|
|
216
|
+
data: { type: "signal", id: signal.id },
|
|
217
|
+
sound: "default",
|
|
218
|
+
channelId: "codetrellis-events"
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
if (payloads.length > 0) await sendExpoPush(payloads);
|
|
222
|
+
}
|
|
223
|
+
function channelEventTitle(event) {
|
|
224
|
+
if (typeof event.payload?.criterionUid === "string") return "Approval needed";
|
|
225
|
+
const labels = {
|
|
226
|
+
"stuck": "Agent is stuck",
|
|
227
|
+
"need-decision": "Decision needed",
|
|
228
|
+
"need-context": "Context needed",
|
|
229
|
+
"handing-off": "Handoff",
|
|
230
|
+
"steer": "Steering input",
|
|
231
|
+
"weigh-in": "Team input requested"
|
|
232
|
+
};
|
|
233
|
+
return labels[event.eventType] || `Channel: ${event.eventType}`;
|
|
234
|
+
}
|
|
235
|
+
function channelEventBody(event) {
|
|
236
|
+
const message = event.payload?.message || "(no message)";
|
|
237
|
+
const author = event.author || "unknown";
|
|
238
|
+
const prefix = `${author}: `;
|
|
239
|
+
const maxLen = 120 - prefix.length;
|
|
240
|
+
const truncated = message.length > maxLen ? message.slice(0, maxLen - 3) + "..." : message;
|
|
241
|
+
return prefix + truncated;
|
|
242
|
+
}
|
|
243
|
+
function isRateLimited(fingerprint, eventType) {
|
|
244
|
+
const key = `${fingerprint}:${eventType}`;
|
|
245
|
+
const lastSent = rateLimitMap.get(key);
|
|
246
|
+
if (!lastSent) return false;
|
|
247
|
+
return Date.now() - lastSent < RATE_LIMIT_MS;
|
|
248
|
+
}
|
|
249
|
+
function markSent(fingerprint, eventType) {
|
|
250
|
+
const key = `${fingerprint}:${eventType}`;
|
|
251
|
+
rateLimitMap.set(key, Date.now());
|
|
252
|
+
}
|
|
253
|
+
async function sendExpoPush(payloads) {
|
|
254
|
+
try {
|
|
255
|
+
const controller = new AbortController();
|
|
256
|
+
const timeout = setTimeout(() => controller.abort(), 1e4);
|
|
257
|
+
try {
|
|
258
|
+
const res = await fetch(pushUrl(), {
|
|
259
|
+
method: "POST",
|
|
260
|
+
headers: { "content-type": "application/json" },
|
|
261
|
+
body: JSON.stringify(payloads),
|
|
262
|
+
signal: controller.signal
|
|
263
|
+
});
|
|
264
|
+
if (!res.ok) {
|
|
265
|
+
console.warn(`[PushNotifications] Expo Push API returned ${res.status}`);
|
|
266
|
+
}
|
|
267
|
+
} finally {
|
|
268
|
+
clearTimeout(timeout);
|
|
269
|
+
}
|
|
270
|
+
} catch (err) {
|
|
271
|
+
console.warn("[PushNotifications] Failed to send push:", err);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
275
|
+
0 && (module.exports = {
|
|
276
|
+
isPushNotificationsRunning,
|
|
277
|
+
listPushTokens,
|
|
278
|
+
pushForBreakpoint,
|
|
279
|
+
pushForBudgetChange,
|
|
280
|
+
pushForChannelEvent,
|
|
281
|
+
pushForInputRequest,
|
|
282
|
+
pushForSignal,
|
|
283
|
+
pushUrl,
|
|
284
|
+
registerPushToken,
|
|
285
|
+
startPushNotifications,
|
|
286
|
+
stopPushNotifications,
|
|
287
|
+
unregisterPushToken
|
|
288
|
+
});
|
|
@@ -0,0 +1,204 @@
|
|
|
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 recent_projects_service_exports = {};
|
|
29
|
+
__export(recent_projects_service_exports, {
|
|
30
|
+
MAX_RECENT_UNPINNED: () => MAX_RECENT_UNPINNED,
|
|
31
|
+
findRecentProjectByOriginUrl: () => findRecentProjectByOriginUrl,
|
|
32
|
+
getRecentProject: () => getRecentProject,
|
|
33
|
+
listEvictedProjects: () => listEvictedProjects,
|
|
34
|
+
listRecentProjects: () => listRecentProjects,
|
|
35
|
+
recordProjectOpen: () => recordProjectOpen,
|
|
36
|
+
refreshProjectOriginUrl: () => refreshProjectOriginUrl,
|
|
37
|
+
removeRecentProject: () => removeRecentProject,
|
|
38
|
+
setProjectAlias: () => setProjectAlias,
|
|
39
|
+
setRecentProjectPinned: () => setRecentProjectPinned
|
|
40
|
+
});
|
|
41
|
+
module.exports = __toCommonJS(recent_projects_service_exports);
|
|
42
|
+
var import_node_path = __toESM(require("node:path"));
|
|
43
|
+
var import_database = require("./database");
|
|
44
|
+
var import_persistence = require("./persistence");
|
|
45
|
+
var import_git_identity = require("./git-identity");
|
|
46
|
+
const MAX_RECENT_UNPINNED = 12;
|
|
47
|
+
function recordProjectOpen(projectPath, branch) {
|
|
48
|
+
const db = (0, import_database.getDb)();
|
|
49
|
+
const now = Date.now();
|
|
50
|
+
const defaultDisplayName = import_node_path.default.basename(projectPath) || projectPath;
|
|
51
|
+
const originUrl = (0, import_git_identity.getNormalisedOriginUrl)(projectPath);
|
|
52
|
+
const existing = db.exec(
|
|
53
|
+
`SELECT first_opened_at, pinned, display_name FROM recent_projects WHERE path = ?`,
|
|
54
|
+
[projectPath]
|
|
55
|
+
);
|
|
56
|
+
const row = existing[0]?.values[0];
|
|
57
|
+
if (row) {
|
|
58
|
+
const currentDisplay = String(row[2] ?? "");
|
|
59
|
+
const isCustom = currentDisplay && currentDisplay !== defaultDisplayName;
|
|
60
|
+
const displayName = isCustom ? currentDisplay : defaultDisplayName;
|
|
61
|
+
db.run(
|
|
62
|
+
`UPDATE recent_projects
|
|
63
|
+
SET display_name = ?, branch = ?, last_opened_at = ?, origin_url = ?
|
|
64
|
+
WHERE path = ?`,
|
|
65
|
+
[displayName, branch ?? null, now, originUrl ?? null, projectPath]
|
|
66
|
+
);
|
|
67
|
+
} else {
|
|
68
|
+
db.run(
|
|
69
|
+
`INSERT INTO recent_projects (path, display_name, branch, pinned, last_opened_at, first_opened_at, origin_url)
|
|
70
|
+
VALUES (?, ?, ?, 0, ?, ?, ?)`,
|
|
71
|
+
[projectPath, defaultDisplayName, branch ?? null, now, now, originUrl ?? null]
|
|
72
|
+
);
|
|
73
|
+
pruneUnpinned();
|
|
74
|
+
}
|
|
75
|
+
db.run(`DELETE FROM evicted_projects WHERE path = ?`, [projectPath]);
|
|
76
|
+
(0, import_persistence.markDirty)();
|
|
77
|
+
}
|
|
78
|
+
function listRecentProjects() {
|
|
79
|
+
const result = (0, import_database.getDb)().exec(
|
|
80
|
+
`SELECT path, display_name, branch, pinned, last_opened_at, first_opened_at, origin_url
|
|
81
|
+
FROM recent_projects
|
|
82
|
+
ORDER BY pinned DESC, last_opened_at DESC`
|
|
83
|
+
);
|
|
84
|
+
if (!result[0]) return [];
|
|
85
|
+
return result[0].values.map((r) => ({
|
|
86
|
+
path: r[0],
|
|
87
|
+
displayName: r[1],
|
|
88
|
+
branch: r[2] ?? null,
|
|
89
|
+
pinned: Boolean(r[3]),
|
|
90
|
+
lastOpenedAt: r[4],
|
|
91
|
+
firstOpenedAt: r[5],
|
|
92
|
+
originUrl: r[6] ?? null
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
function removeRecentProject(projectPath) {
|
|
96
|
+
(0, import_database.getDb)().run(`DELETE FROM recent_projects WHERE path = ?`, [projectPath]);
|
|
97
|
+
(0, import_persistence.markDirty)();
|
|
98
|
+
}
|
|
99
|
+
function setRecentProjectPinned(projectPath, pinned) {
|
|
100
|
+
(0, import_database.getDb)().run(
|
|
101
|
+
`UPDATE recent_projects SET pinned = ? WHERE path = ?`,
|
|
102
|
+
[pinned ? 1 : 0, projectPath]
|
|
103
|
+
);
|
|
104
|
+
(0, import_persistence.markDirty)();
|
|
105
|
+
}
|
|
106
|
+
const ALIAS_MAX_CHARS = 200;
|
|
107
|
+
function setProjectAlias(projectPath, alias) {
|
|
108
|
+
const trimmed = alias.trim();
|
|
109
|
+
const fallback = import_node_path.default.basename(projectPath) || projectPath;
|
|
110
|
+
const next = (trimmed || fallback).slice(0, ALIAS_MAX_CHARS);
|
|
111
|
+
(0, import_database.getDb)().run(
|
|
112
|
+
`UPDATE recent_projects SET display_name = ? WHERE path = ?`,
|
|
113
|
+
[next, projectPath]
|
|
114
|
+
);
|
|
115
|
+
(0, import_persistence.markDirty)();
|
|
116
|
+
return getRecentProject(projectPath);
|
|
117
|
+
}
|
|
118
|
+
function refreshProjectOriginUrl(projectPath) {
|
|
119
|
+
const originUrl = (0, import_git_identity.getNormalisedOriginUrl)(projectPath);
|
|
120
|
+
(0, import_database.getDb)().run(
|
|
121
|
+
`UPDATE recent_projects SET origin_url = ? WHERE path = ?`,
|
|
122
|
+
[originUrl ?? null, projectPath]
|
|
123
|
+
);
|
|
124
|
+
(0, import_persistence.markDirty)();
|
|
125
|
+
return getRecentProject(projectPath);
|
|
126
|
+
}
|
|
127
|
+
function findRecentProjectByOriginUrl(rawUrl) {
|
|
128
|
+
if (!rawUrl) return null;
|
|
129
|
+
const target = (0, import_git_identity.normaliseRepoUrl)(rawUrl);
|
|
130
|
+
if (!target) return null;
|
|
131
|
+
const result = (0, import_database.getDb)().exec(
|
|
132
|
+
`SELECT path, display_name, branch, pinned, last_opened_at, first_opened_at, origin_url
|
|
133
|
+
FROM recent_projects WHERE origin_url = ?
|
|
134
|
+
ORDER BY last_opened_at DESC LIMIT 1`,
|
|
135
|
+
[target]
|
|
136
|
+
);
|
|
137
|
+
if (!result[0] || result[0].values.length === 0) return null;
|
|
138
|
+
const r = result[0].values[0];
|
|
139
|
+
return {
|
|
140
|
+
path: r[0],
|
|
141
|
+
displayName: r[1],
|
|
142
|
+
branch: r[2] ?? null,
|
|
143
|
+
pinned: Boolean(r[3]),
|
|
144
|
+
lastOpenedAt: r[4],
|
|
145
|
+
firstOpenedAt: r[5],
|
|
146
|
+
originUrl: r[6] ?? null
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function getRecentProject(projectPath) {
|
|
150
|
+
const result = (0, import_database.getDb)().exec(
|
|
151
|
+
`SELECT path, display_name, branch, pinned, last_opened_at, first_opened_at, origin_url
|
|
152
|
+
FROM recent_projects WHERE path = ?`,
|
|
153
|
+
[projectPath]
|
|
154
|
+
);
|
|
155
|
+
if (!result[0] || result[0].values.length === 0) return null;
|
|
156
|
+
const r = result[0].values[0];
|
|
157
|
+
return {
|
|
158
|
+
path: r[0],
|
|
159
|
+
displayName: r[1],
|
|
160
|
+
branch: r[2] ?? null,
|
|
161
|
+
pinned: Boolean(r[3]),
|
|
162
|
+
lastOpenedAt: r[4],
|
|
163
|
+
firstOpenedAt: r[5],
|
|
164
|
+
originUrl: r[6] ?? null
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
function pruneUnpinned() {
|
|
168
|
+
const db = (0, import_database.getDb)();
|
|
169
|
+
const result = db.exec(
|
|
170
|
+
`SELECT path FROM recent_projects WHERE pinned = 0 ORDER BY last_opened_at DESC`
|
|
171
|
+
);
|
|
172
|
+
if (!result[0]) return;
|
|
173
|
+
const paths = result[0].values.map((r) => r[0]);
|
|
174
|
+
const toRemove = paths.slice(MAX_RECENT_UNPINNED);
|
|
175
|
+
const now = Date.now();
|
|
176
|
+
for (const p of toRemove) {
|
|
177
|
+
db.run(`DELETE FROM recent_projects WHERE path = ?`, [p]);
|
|
178
|
+
db.run(
|
|
179
|
+
`INSERT INTO evicted_projects (path, evicted_at) VALUES (?, ?)
|
|
180
|
+
ON CONFLICT(path) DO UPDATE SET evicted_at = excluded.evicted_at`,
|
|
181
|
+
[p, now]
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function listEvictedProjects() {
|
|
186
|
+
const result = (0, import_database.getDb)().exec(
|
|
187
|
+
`SELECT path, evicted_at FROM evicted_projects ORDER BY evicted_at DESC`
|
|
188
|
+
);
|
|
189
|
+
if (!result[0]) return [];
|
|
190
|
+
return result[0].values.map((r) => ({ path: r[0], evictedAt: r[1] }));
|
|
191
|
+
}
|
|
192
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
193
|
+
0 && (module.exports = {
|
|
194
|
+
MAX_RECENT_UNPINNED,
|
|
195
|
+
findRecentProjectByOriginUrl,
|
|
196
|
+
getRecentProject,
|
|
197
|
+
listEvictedProjects,
|
|
198
|
+
listRecentProjects,
|
|
199
|
+
recordProjectOpen,
|
|
200
|
+
refreshProjectOriginUrl,
|
|
201
|
+
removeRecentProject,
|
|
202
|
+
setProjectAlias,
|
|
203
|
+
setRecentProjectPinned
|
|
204
|
+
});
|