@jamesaphoenix/tx-core 0.8.1 → 0.9.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/dist/db.d.ts +6 -6
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +29 -2
- package/dist/db.js.map +1 -1
- package/dist/index.d.ts +8 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/internal/cycle-scan-service-impl.d.ts +28 -0
- package/dist/internal/cycle-scan-service-impl.d.ts.map +1 -0
- package/dist/internal/cycle-scan-service-impl.js +877 -0
- package/dist/internal/cycle-scan-service-impl.js.map +1 -0
- package/dist/internal/doc-service-impl.d.ts +42 -0
- package/dist/internal/doc-service-impl.d.ts.map +1 -0
- package/dist/internal/doc-service-impl.js +812 -0
- package/dist/internal/doc-service-impl.js.map +1 -0
- package/dist/internal/embedding-service-impl.d.ts +202 -0
- package/dist/internal/embedding-service-impl.d.ts.map +1 -0
- package/dist/internal/embedding-service-impl.js +466 -0
- package/dist/internal/embedding-service-impl.js.map +1 -0
- package/dist/internal/memory-service-impl.d.ts +49 -0
- package/dist/internal/memory-service-impl.d.ts.map +1 -0
- package/dist/internal/memory-service-impl.js +1061 -0
- package/dist/internal/memory-service-impl.js.map +1 -0
- package/dist/internal/spec-trace-service-impl.d.ts +50 -0
- package/dist/internal/spec-trace-service-impl.d.ts.map +1 -0
- package/dist/internal/spec-trace-service-impl.js +707 -0
- package/dist/internal/spec-trace-service-impl.js.map +1 -0
- package/dist/internal/sync/service-impl.d.ts +41 -0
- package/dist/internal/sync/service-impl.d.ts.map +1 -0
- package/dist/{services/sync-service.js → internal/sync/service-impl.js} +954 -499
- package/dist/internal/sync/service-impl.js.map +1 -0
- package/dist/layer.d.ts +8 -5
- package/dist/layer.d.ts.map +1 -1
- package/dist/layer.js +22 -10
- package/dist/layer.js.map +1 -1
- package/dist/mappers/anchor.d.ts.map +1 -1
- package/dist/mappers/anchor.js +5 -4
- package/dist/mappers/anchor.js.map +1 -1
- package/dist/mappers/attempt.d.ts.map +1 -1
- package/dist/mappers/attempt.js +2 -1
- package/dist/mappers/attempt.js.map +1 -1
- package/dist/mappers/candidate.d.ts.map +1 -1
- package/dist/mappers/candidate.js +2 -1
- package/dist/mappers/candidate.js.map +1 -1
- package/dist/mappers/claim.d.ts.map +1 -1
- package/dist/mappers/claim.js +2 -1
- package/dist/mappers/claim.js.map +1 -1
- package/dist/mappers/doc.d.ts.map +1 -1
- package/dist/mappers/doc.js +9 -8
- package/dist/mappers/doc.js.map +1 -1
- package/dist/mappers/edge.d.ts.map +1 -1
- package/dist/mappers/edge.js +4 -3
- package/dist/mappers/edge.js.map +1 -1
- package/dist/mappers/file-learning.d.ts.map +1 -1
- package/dist/mappers/file-learning.js +2 -1
- package/dist/mappers/file-learning.js.map +1 -1
- package/dist/mappers/index.d.ts +1 -0
- package/dist/mappers/index.d.ts.map +1 -1
- package/dist/mappers/index.js +2 -0
- package/dist/mappers/index.js.map +1 -1
- package/dist/mappers/learning.d.ts.map +1 -1
- package/dist/mappers/learning.js +4 -3
- package/dist/mappers/learning.js.map +1 -1
- package/dist/mappers/memory.d.ts.map +1 -1
- package/dist/mappers/memory.js +7 -6
- package/dist/mappers/memory.js.map +1 -1
- package/dist/mappers/orchestrator-state.d.ts.map +1 -1
- package/dist/mappers/orchestrator-state.js +2 -1
- package/dist/mappers/orchestrator-state.js.map +1 -1
- package/dist/mappers/pin.d.ts.map +1 -1
- package/dist/mappers/pin.js +2 -1
- package/dist/mappers/pin.js.map +1 -1
- package/dist/mappers/run.d.ts.map +1 -1
- package/dist/mappers/run.js +4 -3
- package/dist/mappers/run.js.map +1 -1
- package/dist/mappers/spec-trace.d.ts +11 -0
- package/dist/mappers/spec-trace.d.ts.map +1 -0
- package/dist/mappers/spec-trace.js +59 -0
- package/dist/mappers/spec-trace.js.map +1 -0
- package/dist/mappers/task.d.ts.map +1 -1
- package/dist/mappers/task.js +4 -4
- package/dist/mappers/task.js.map +1 -1
- package/dist/mappers/worker.d.ts.map +1 -1
- package/dist/mappers/worker.js +2 -1
- package/dist/mappers/worker.js.map +1 -1
- package/dist/migrations-embedded.d.ts.map +1 -1
- package/dist/migrations-embedded.js +15 -0
- package/dist/migrations-embedded.js.map +1 -1
- package/dist/repo/anchor-repo.d.ts +2 -2
- package/dist/repo/anchor-repo.d.ts.map +1 -1
- package/dist/repo/anchor-repo.js +18 -17
- package/dist/repo/anchor-repo.js.map +1 -1
- package/dist/repo/attempt-repo.d.ts.map +1 -1
- package/dist/repo/attempt-repo.js +11 -10
- package/dist/repo/attempt-repo.js.map +1 -1
- package/dist/repo/candidate-repo.d.ts.map +1 -1
- package/dist/repo/candidate-repo.js +8 -7
- package/dist/repo/candidate-repo.js.map +1 -1
- package/dist/repo/claim-repo.d.ts +4 -4
- package/dist/repo/claim-repo.d.ts.map +1 -1
- package/dist/repo/claim-repo.js +14 -13
- package/dist/repo/claim-repo.js.map +1 -1
- package/dist/repo/compaction-repo.d.ts +4 -4
- package/dist/repo/compaction-repo.d.ts.map +1 -1
- package/dist/repo/compaction-repo.js +7 -6
- package/dist/repo/compaction-repo.js.map +1 -1
- package/dist/repo/deduplication-repo.d.ts.map +1 -1
- package/dist/repo/deduplication-repo.js +80 -57
- package/dist/repo/deduplication-repo.js.map +1 -1
- package/dist/repo/dep-repo.d.ts.map +1 -1
- package/dist/repo/dep-repo.js +90 -88
- package/dist/repo/dep-repo.js.map +1 -1
- package/dist/repo/doc-repo.d.ts +2 -63
- package/dist/repo/doc-repo.d.ts.map +1 -1
- package/dist/repo/doc-repo.js +6 -4
- package/dist/repo/doc-repo.js.map +1 -1
- package/dist/repo/doc-repo.types.d.ts +64 -0
- package/dist/repo/doc-repo.types.d.ts.map +1 -0
- package/dist/repo/doc-repo.types.js +2 -0
- package/dist/repo/doc-repo.types.js.map +1 -0
- package/dist/repo/edge-repo.d.ts.map +1 -1
- package/dist/repo/edge-repo.js +91 -81
- package/dist/repo/edge-repo.js.map +1 -1
- package/dist/repo/file-learning-repo.d.ts.map +1 -1
- package/dist/repo/file-learning-repo.js +7 -6
- package/dist/repo/file-learning-repo.js.map +1 -1
- package/dist/repo/guard-repo.d.ts +4 -4
- package/dist/repo/guard-repo.d.ts.map +1 -1
- package/dist/repo/guard-repo.js +8 -7
- package/dist/repo/guard-repo.js.map +1 -1
- package/dist/repo/index.d.ts +1 -0
- package/dist/repo/index.d.ts.map +1 -1
- package/dist/repo/index.js +1 -0
- package/dist/repo/index.js.map +1 -1
- package/dist/repo/label-repo.d.ts +4 -4
- package/dist/repo/label-repo.d.ts.map +1 -1
- package/dist/repo/label-repo.js +9 -8
- package/dist/repo/label-repo.js.map +1 -1
- package/dist/repo/learning-repo.d.ts +2 -2
- package/dist/repo/learning-repo.d.ts.map +1 -1
- package/dist/repo/learning-repo.js +37 -31
- package/dist/repo/learning-repo.js.map +1 -1
- package/dist/repo/memory-repo/document.d.ts +4 -0
- package/dist/repo/memory-repo/document.d.ts.map +1 -0
- package/dist/repo/memory-repo/document.js +205 -0
- package/dist/repo/memory-repo/document.js.map +1 -0
- package/dist/repo/memory-repo/link.d.ts +4 -0
- package/dist/repo/memory-repo/link.d.ts.map +1 -0
- package/dist/repo/memory-repo/link.js +124 -0
- package/dist/repo/memory-repo/link.js.map +1 -0
- package/dist/repo/memory-repo/property.d.ts +4 -0
- package/dist/repo/memory-repo/property.d.ts.map +1 -0
- package/dist/repo/memory-repo/property.js +56 -0
- package/dist/repo/memory-repo/property.js.map +1 -0
- package/dist/repo/memory-repo/shared.d.ts +28 -0
- package/dist/repo/memory-repo/shared.d.ts.map +1 -0
- package/dist/repo/memory-repo/shared.js +63 -0
- package/dist/repo/memory-repo/shared.js.map +1 -0
- package/dist/repo/memory-repo/source.d.ts +4 -0
- package/dist/repo/memory-repo/source.d.ts.map +1 -0
- package/dist/repo/memory-repo/source.js +58 -0
- package/dist/repo/memory-repo/source.js.map +1 -0
- package/dist/repo/memory-repo.d.ts +14 -10
- package/dist/repo/memory-repo.d.ts.map +1 -1
- package/dist/repo/memory-repo.js +8 -527
- package/dist/repo/memory-repo.js.map +1 -1
- package/dist/repo/message-repo.d.ts.map +1 -1
- package/dist/repo/message-repo.js +9 -8
- package/dist/repo/message-repo.js.map +1 -1
- package/dist/repo/orchestrator-state-repo.d.ts.map +1 -1
- package/dist/repo/orchestrator-state-repo.js +2 -1
- package/dist/repo/orchestrator-state-repo.js.map +1 -1
- package/dist/repo/pin-repo.d.ts.map +1 -1
- package/dist/repo/pin-repo.js +5 -4
- package/dist/repo/pin-repo.js.map +1 -1
- package/dist/repo/run-repo.d.ts.map +1 -1
- package/dist/repo/run-repo.js +11 -10
- package/dist/repo/run-repo.js.map +1 -1
- package/dist/repo/spec-trace-repo.d.ts +9 -0
- package/dist/repo/spec-trace-repo.d.ts.map +1 -0
- package/dist/repo/spec-trace-repo.filter.d.ts +3 -0
- package/dist/repo/spec-trace-repo.filter.d.ts.map +1 -0
- package/dist/repo/spec-trace-repo.filter.js +13 -0
- package/dist/repo/spec-trace-repo.filter.js.map +1 -0
- package/dist/repo/spec-trace-repo.js +323 -0
- package/dist/repo/spec-trace-repo.js.map +1 -0
- package/dist/repo/spec-trace-repo.types.d.ts +60 -0
- package/dist/repo/spec-trace-repo.types.d.ts.map +1 -0
- package/dist/repo/spec-trace-repo.types.js +2 -0
- package/dist/repo/spec-trace-repo.types.js.map +1 -0
- package/dist/repo/task-repo/factory.d.ts +4 -0
- package/dist/repo/task-repo/factory.d.ts.map +1 -0
- package/dist/repo/task-repo/factory.js +7 -0
- package/dist/repo/task-repo/factory.js.map +1 -0
- package/dist/repo/task-repo/read.d.ts +6 -0
- package/dist/repo/task-repo/read.d.ts.map +1 -0
- package/dist/repo/task-repo/read.js +332 -0
- package/dist/repo/task-repo/read.js.map +1 -0
- package/dist/repo/task-repo/shared.d.ts +10 -0
- package/dist/repo/task-repo/shared.d.ts.map +1 -0
- package/dist/repo/task-repo/shared.js +29 -0
- package/dist/repo/task-repo/shared.js.map +1 -0
- package/dist/repo/task-repo/write.d.ts +6 -0
- package/dist/repo/task-repo/write.d.ts.map +1 -0
- package/dist/repo/task-repo/write.js +182 -0
- package/dist/repo/task-repo/write.js.map +1 -0
- package/dist/repo/task-repo.d.ts +5 -4
- package/dist/repo/task-repo.d.ts.map +1 -1
- package/dist/repo/task-repo.js +2 -520
- package/dist/repo/task-repo.js.map +1 -1
- package/dist/repo/tracked-project-repo.d.ts.map +1 -1
- package/dist/repo/tracked-project-repo.js +6 -5
- package/dist/repo/tracked-project-repo.js.map +1 -1
- package/dist/repo/worker-repo.d.ts.map +1 -1
- package/dist/repo/worker-repo.js +60 -47
- package/dist/repo/worker-repo.js.map +1 -1
- package/dist/schemas/index.d.ts +4 -2
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +2 -1
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/sync-events.d.ts +25 -0
- package/dist/schemas/sync-events.d.ts.map +1 -0
- package/dist/schemas/sync-events.js +23 -0
- package/dist/schemas/sync-events.js.map +1 -0
- package/dist/schemas/sync.d.ts +20 -10
- package/dist/schemas/sync.d.ts.map +1 -1
- package/dist/schemas/sync.js +10 -4
- package/dist/schemas/sync.js.map +1 -1
- package/dist/services/agent-service.d.ts +4 -4
- package/dist/services/agent-service.d.ts.map +1 -1
- package/dist/services/agent-service.js.map +1 -1
- package/dist/services/anchor/anchor-service-core-ops.d.ts +125 -0
- package/dist/services/anchor/anchor-service-core-ops.d.ts.map +1 -0
- package/dist/services/anchor/anchor-service-core-ops.js +41 -0
- package/dist/services/anchor/anchor-service-core-ops.js.map +1 -0
- package/dist/services/anchor/anchor-service-deps.d.ts +10 -0
- package/dist/services/anchor/anchor-service-deps.d.ts.map +1 -0
- package/dist/services/anchor/anchor-service-deps.js +2 -0
- package/dist/services/anchor/anchor-service-deps.js.map +1 -0
- package/dist/services/anchor/anchor-service-ops.d.ts +296 -0
- package/dist/services/anchor/anchor-service-ops.d.ts.map +1 -0
- package/dist/services/anchor/anchor-service-ops.js +9 -0
- package/dist/services/anchor/anchor-service-ops.js.map +1 -0
- package/dist/services/anchor/anchor-service-state-ops.d.ts +116 -0
- package/dist/services/anchor/anchor-service-state-ops.d.ts.map +1 -0
- package/dist/services/anchor/anchor-service-state-ops.js +150 -0
- package/dist/services/anchor/anchor-service-state-ops.js.map +1 -0
- package/dist/services/anchor/anchor-service-validation.d.ts +7 -0
- package/dist/services/anchor/anchor-service-validation.d.ts.map +1 -0
- package/dist/services/anchor/anchor-service-validation.js +114 -0
- package/dist/services/anchor/anchor-service-validation.js.map +1 -0
- package/dist/services/anchor/anchor-service-verification-ops.d.ts +71 -0
- package/dist/services/anchor/anchor-service-verification-ops.d.ts.map +1 -0
- package/dist/services/anchor/anchor-service-verification-ops.js +169 -0
- package/dist/services/anchor/anchor-service-verification-ops.js.map +1 -0
- package/dist/services/anchor/anchor-verification-batch.d.ts +12 -0
- package/dist/services/anchor/anchor-verification-batch.d.ts.map +1 -0
- package/dist/services/anchor/anchor-verification-batch.js +109 -0
- package/dist/services/anchor/anchor-verification-batch.js.map +1 -0
- package/dist/services/anchor/anchor-verification-single.d.ts +7 -0
- package/dist/services/anchor/anchor-verification-single.d.ts.map +1 -0
- package/dist/services/anchor/anchor-verification-single.js +407 -0
- package/dist/services/anchor/anchor-verification-single.js.map +1 -0
- package/dist/services/anchor/anchor-verification-utils.d.ts +19 -0
- package/dist/services/anchor/anchor-verification-utils.d.ts.map +1 -0
- package/dist/services/anchor/anchor-verification-utils.js +107 -0
- package/dist/services/anchor/anchor-verification-utils.js.map +1 -0
- package/dist/services/anchor-service.d.ts +12 -90
- package/dist/services/anchor-service.d.ts.map +1 -1
- package/dist/services/anchor-service.js +5 -530
- package/dist/services/anchor-service.js.map +1 -1
- package/dist/services/anchor-verification.d.ts +9 -60
- package/dist/services/anchor-verification.d.ts.map +1 -1
- package/dist/services/anchor-verification.js +5 -796
- package/dist/services/anchor-verification.js.map +1 -1
- package/dist/services/ast-grep-service/patterns.d.ts +90 -0
- package/dist/services/ast-grep-service/patterns.d.ts.map +1 -0
- package/dist/services/ast-grep-service/patterns.js +261 -0
- package/dist/services/ast-grep-service/patterns.js.map +1 -0
- package/dist/services/ast-grep-service.d.ts +2 -13
- package/dist/services/ast-grep-service.d.ts.map +1 -1
- package/dist/services/ast-grep-service.js +3 -261
- package/dist/services/ast-grep-service.js.map +1 -1
- package/dist/services/auto-sync-service.d.ts +3 -3
- package/dist/services/auto-sync-service.d.ts.map +1 -1
- package/dist/services/auto-sync-service.js +12 -13
- package/dist/services/auto-sync-service.js.map +1 -1
- package/dist/services/compaction-service.d.ts +6 -6
- package/dist/services/compaction-service.d.ts.map +1 -1
- package/dist/services/compaction-service.js +11 -7
- package/dist/services/compaction-service.js.map +1 -1
- package/dist/services/cycle-scan-service.d.ts +1 -27
- package/dist/services/cycle-scan-service.d.ts.map +1 -1
- package/dist/services/cycle-scan-service.js +1 -876
- package/dist/services/cycle-scan-service.js.map +1 -1
- package/dist/services/daemon-service/process.d.ts +93 -0
- package/dist/services/daemon-service/process.d.ts.map +1 -0
- package/dist/services/daemon-service/process.js +325 -0
- package/dist/services/daemon-service/process.js.map +1 -0
- package/dist/services/daemon-service/templates.d.ts +88 -0
- package/dist/services/daemon-service/templates.d.ts.map +1 -0
- package/dist/services/daemon-service/templates.js +119 -0
- package/dist/services/daemon-service/templates.js.map +1 -0
- package/dist/services/daemon-service.d.ts +8 -160
- package/dist/services/daemon-service.d.ts.map +1 -1
- package/dist/services/daemon-service.js +4 -440
- package/dist/services/daemon-service.js.map +1 -1
- package/dist/services/doc-service.d.ts +1 -41
- package/dist/services/doc-service.d.ts.map +1 -1
- package/dist/services/doc-service.js +1 -780
- package/dist/services/doc-service.js.map +1 -1
- package/dist/services/edge-service.d.ts +6 -6
- package/dist/services/edge-service.d.ts.map +1 -1
- package/dist/services/edge-service.js.map +1 -1
- package/dist/services/embedding-service.d.ts +1 -201
- package/dist/services/embedding-service.d.ts.map +1 -1
- package/dist/services/embedding-service.js +1 -465
- package/dist/services/embedding-service.js.map +1 -1
- package/dist/services/feedback-tracker.d.ts +2 -2
- package/dist/services/feedback-tracker.d.ts.map +1 -1
- package/dist/services/feedback-tracker.js.map +1 -1
- package/dist/services/file-watcher-service/shared.d.ts +76 -0
- package/dist/services/file-watcher-service/shared.d.ts.map +1 -0
- package/dist/services/file-watcher-service/shared.js +43 -0
- package/dist/services/file-watcher-service/shared.js.map +1 -0
- package/dist/services/file-watcher-service.d.ts +2 -42
- package/dist/services/file-watcher-service.d.ts.map +1 -1
- package/dist/services/file-watcher-service.js +1 -46
- package/dist/services/file-watcher-service.js.map +1 -1
- package/dist/services/graph-expansion/from-files.d.ts +14 -0
- package/dist/services/graph-expansion/from-files.d.ts.map +1 -0
- package/dist/services/graph-expansion/from-files.js +187 -0
- package/dist/services/graph-expansion/from-files.js.map +1 -0
- package/dist/services/graph-expansion/live.d.ts +11 -0
- package/dist/services/graph-expansion/live.d.ts.map +1 -0
- package/dist/services/graph-expansion/live.js +263 -0
- package/dist/services/graph-expansion/live.js.map +1 -0
- package/dist/services/graph-expansion.d.ts +17 -20
- package/dist/services/graph-expansion.d.ts.map +1 -1
- package/dist/services/graph-expansion.js +2 -439
- package/dist/services/graph-expansion.js.map +1 -1
- package/dist/services/guard-service.d.ts +2 -2
- package/dist/services/guard-service.d.ts.map +1 -1
- package/dist/services/guard-service.js.map +1 -1
- package/dist/services/index.d.ts +3 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +3 -1
- package/dist/services/index.js.map +1 -1
- package/dist/services/learning-service.d.ts +4 -4
- package/dist/services/learning-service.d.ts.map +1 -1
- package/dist/services/learning-service.js.map +1 -1
- package/dist/services/llm-service.d.ts +4 -4
- package/dist/services/llm-service.d.ts.map +1 -1
- package/dist/services/llm-service.js.map +1 -1
- package/dist/services/memory-retriever-service.d.ts.map +1 -1
- package/dist/services/memory-retriever-service.js.map +1 -1
- package/dist/services/memory-service.d.ts +1 -48
- package/dist/services/memory-service.d.ts.map +1 -1
- package/dist/services/memory-service.js +1 -1060
- package/dist/services/memory-service.js.map +1 -1
- package/dist/services/migration-service.d.ts +6 -6
- package/dist/services/migration-service.d.ts.map +1 -1
- package/dist/services/migration-service.js +6 -2
- package/dist/services/migration-service.js.map +1 -1
- package/dist/services/orchestrator-service.d.ts +2 -2
- package/dist/services/orchestrator-service.d.ts.map +1 -1
- package/dist/services/orchestrator-service.js.map +1 -1
- package/dist/services/pin-service.d.ts.map +1 -1
- package/dist/services/pin-service.js +21 -28
- package/dist/services/pin-service.js.map +1 -1
- package/dist/services/promotion-service.d.ts +4 -4
- package/dist/services/promotion-service.d.ts.map +1 -1
- package/dist/services/promotion-service.js.map +1 -1
- package/dist/services/query-expansion-service.d.ts +2 -2
- package/dist/services/query-expansion-service.d.ts.map +1 -1
- package/dist/services/query-expansion-service.js.map +1 -1
- package/dist/services/reflect-service.d.ts +6 -6
- package/dist/services/reflect-service.d.ts.map +1 -1
- package/dist/services/reflect-service.js.map +1 -1
- package/dist/services/reranker-service.d.ts +2 -2
- package/dist/services/reranker-service.d.ts.map +1 -1
- package/dist/services/reranker-service.js.map +1 -1
- package/dist/services/retriever-scoring.d.ts +52 -0
- package/dist/services/retriever-scoring.d.ts.map +1 -0
- package/dist/services/retriever-scoring.js +146 -0
- package/dist/services/retriever-scoring.js.map +1 -0
- package/dist/services/retriever-service.d.ts.map +1 -1
- package/dist/services/retriever-service.js +1 -191
- package/dist/services/retriever-service.js.map +1 -1
- package/dist/services/run-heartbeat-service.d.ts +10 -10
- package/dist/services/run-heartbeat-service.d.ts.map +1 -1
- package/dist/services/run-heartbeat-service.js.map +1 -1
- package/dist/services/score-service.d.ts +2 -2
- package/dist/services/score-service.d.ts.map +1 -1
- package/dist/services/score-service.js.map +1 -1
- package/dist/services/spec-trace-service.d.ts +2 -0
- package/dist/services/spec-trace-service.d.ts.map +1 -0
- package/dist/services/spec-trace-service.js +2 -0
- package/dist/services/spec-trace-service.js.map +1 -0
- package/dist/services/stream-service.d.ts +31 -0
- package/dist/services/stream-service.d.ts.map +1 -0
- package/dist/services/stream-service.js +162 -0
- package/dist/services/stream-service.js.map +1 -0
- package/dist/services/swarm-verification/shared.d.ts +71 -0
- package/dist/services/swarm-verification/shared.d.ts.map +1 -0
- package/dist/services/swarm-verification/shared.js +108 -0
- package/dist/services/swarm-verification/shared.js.map +1 -0
- package/dist/services/swarm-verification.d.ts +4 -68
- package/dist/services/swarm-verification.d.ts.map +1 -1
- package/dist/services/swarm-verification.js +2 -122
- package/dist/services/swarm-verification.js.map +1 -1
- package/dist/services/sync/converters.d.ts +63 -0
- package/dist/services/sync/converters.d.ts.map +1 -0
- package/dist/services/sync/converters.js +253 -0
- package/dist/services/sync/converters.js.map +1 -0
- package/dist/services/sync/entity-export.d.ts +22 -0
- package/dist/services/sync/entity-export.d.ts.map +1 -0
- package/dist/services/sync/entity-export.js +15 -0
- package/dist/services/sync/entity-export.js.map +1 -0
- package/dist/services/sync/entity-import.d.ts +22 -0
- package/dist/services/sync/entity-import.d.ts.map +1 -0
- package/dist/services/sync/entity-import.js +15 -0
- package/dist/services/sync/entity-import.js.map +1 -0
- package/dist/services/sync/file-utils.d.ts +23 -0
- package/dist/services/sync/file-utils.d.ts.map +1 -0
- package/dist/services/sync/file-utils.js +97 -0
- package/dist/services/sync/file-utils.js.map +1 -0
- package/dist/services/sync/index.d.ts +3 -0
- package/dist/services/sync/index.d.ts.map +1 -0
- package/dist/services/sync/index.js +2 -0
- package/dist/services/sync/index.js.map +1 -0
- package/dist/services/sync/service.d.ts +2 -0
- package/dist/services/sync/service.d.ts.map +1 -0
- package/dist/services/sync/service.js +2 -0
- package/dist/services/sync/service.js.map +1 -0
- package/dist/services/sync/sync-helpers.d.ts +54 -0
- package/dist/services/sync/sync-helpers.d.ts.map +1 -0
- package/dist/services/sync/sync-helpers.js +245 -0
- package/dist/services/sync/sync-helpers.js.map +1 -0
- package/dist/services/sync/types.d.ts +104 -0
- package/dist/services/sync/types.d.ts.map +1 -0
- package/dist/services/sync/types.js +5 -0
- package/dist/services/sync/types.js.map +1 -0
- package/dist/services/task-service/internals.d.ts +36 -0
- package/dist/services/task-service/internals.d.ts.map +1 -0
- package/dist/services/task-service/internals.js +270 -0
- package/dist/services/task-service/internals.js.map +1 -0
- package/dist/services/task-service.d.ts +2 -1
- package/dist/services/task-service.d.ts.map +1 -1
- package/dist/services/task-service.js +28 -236
- package/dist/services/task-service.js.map +1 -1
- package/dist/services/tracing-service.d.ts +2 -2
- package/dist/services/tracing-service.d.ts.map +1 -1
- package/dist/services/tracing-service.js.map +1 -1
- package/dist/services/transcript-adapter.d.ts +6 -6
- package/dist/services/transcript-adapter.d.ts.map +1 -1
- package/dist/services/transcript-adapter.js +3 -8
- package/dist/services/transcript-adapter.js.map +1 -1
- package/dist/services/validation-service.d.ts +8 -8
- package/dist/services/validation-service.d.ts.map +1 -1
- package/dist/services/validation-service.js.map +1 -1
- package/dist/services/verify-service.d.ts +2 -2
- package/dist/services/verify-service.d.ts.map +1 -1
- package/dist/services/verify-service.js.map +1 -1
- package/dist/services/worker-process/runtime.d.ts +51 -0
- package/dist/services/worker-process/runtime.d.ts.map +1 -0
- package/dist/services/worker-process/runtime.js +150 -0
- package/dist/services/worker-process/runtime.js.map +1 -0
- package/dist/services/worker-process.d.ts +3 -18
- package/dist/services/worker-process.d.ts.map +1 -1
- package/dist/services/worker-process.js +3 -173
- package/dist/services/worker-process.js.map +1 -1
- package/dist/services/worker-service.d.ts +6 -6
- package/dist/services/worker-service.d.ts.map +1 -1
- package/dist/services/worker-service.js.map +1 -1
- package/dist/utils/db-result.d.ts +14 -0
- package/dist/utils/db-result.d.ts.map +1 -0
- package/dist/utils/db-result.js +37 -0
- package/dist/utils/db-result.js.map +1 -0
- package/dist/utils/doc-renderer.d.ts +10 -10
- package/dist/utils/doc-renderer.d.ts.map +1 -1
- package/dist/utils/doc-renderer.js.map +1 -1
- package/dist/utils/ears-validator.d.ts +2 -2
- package/dist/utils/ears-validator.d.ts.map +1 -1
- package/dist/utils/ears-validator.js.map +1 -1
- package/dist/utils/file-path.d.ts +27 -0
- package/dist/utils/file-path.d.ts.map +1 -0
- package/dist/utils/file-path.js +77 -0
- package/dist/utils/file-path.js.map +1 -0
- package/dist/utils/glob.d.ts +2 -11
- package/dist/utils/glob.d.ts.map +1 -1
- package/dist/utils/glob.js +22 -13
- package/dist/utils/glob.js.map +1 -1
- package/dist/utils/spec-discovery.d.ts +34 -0
- package/dist/utils/spec-discovery.d.ts.map +1 -0
- package/dist/utils/spec-discovery.js +344 -0
- package/dist/utils/spec-discovery.js.map +1 -0
- package/dist/utils/toml-config.d.ts +7 -2
- package/dist/utils/toml-config.d.ts.map +1 -1
- package/dist/utils/toml-config.js +106 -2
- package/dist/utils/toml-config.js.map +1 -1
- package/dist/utils/ulid.d.ts +8 -0
- package/dist/utils/ulid.d.ts.map +1 -0
- package/dist/utils/ulid.js +30 -0
- package/dist/utils/ulid.js.map +1 -0
- package/dist/worker/hooks.d.ts +10 -10
- package/dist/worker/hooks.d.ts.map +1 -1
- package/dist/worker/run-worker.d.ts.map +1 -1
- package/dist/worker/run-worker.js.map +1 -1
- package/migrations/033_sync_events.sql +33 -0
- package/migrations/034_spec_test_traceability.sql +51 -0
- package/migrations/035_anchor_schema_repair.sql +82 -0
- package/package.json +3 -2
- package/dist/services/sync-service.d.ts +0 -247
- package/dist/services/sync-service.d.ts.map +0 -1
- package/dist/services/sync-service.js.map +0 -1
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { GuardExceededError } from "../../errors.js";
|
|
3
|
+
import { isValidTaskId } from "@jamesaphoenix/tx-types";
|
|
4
|
+
/**
|
|
5
|
+
* Max recursion depth for destructive operations that must find ALL descendants.
|
|
6
|
+
* Bounded to avoid unbounded CTE recursion in SQLite while being deep enough
|
|
7
|
+
* for any realistic task hierarchy (display default is 10).
|
|
8
|
+
*/
|
|
9
|
+
export const CASCADE_MAX_DEPTH = 1000;
|
|
10
|
+
const GATE_PIN_PREFIX = "gate.";
|
|
11
|
+
const isRecord = (value) => value !== null && typeof value === "object";
|
|
12
|
+
const parseGateLinkedTaskId = (content) => {
|
|
13
|
+
try {
|
|
14
|
+
const parsed = JSON.parse(content);
|
|
15
|
+
if (!isRecord(parsed))
|
|
16
|
+
return null;
|
|
17
|
+
const taskId = parsed.taskId;
|
|
18
|
+
if (typeof taskId !== "string" || !isValidTaskId(taskId))
|
|
19
|
+
return null;
|
|
20
|
+
return taskId;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
export const listGateTaskLinks = (pinRepo) => Effect.gen(function* () {
|
|
27
|
+
const pins = yield* pinRepo.findAll();
|
|
28
|
+
const taskLinks = new Map();
|
|
29
|
+
for (const pin of pins) {
|
|
30
|
+
if (!pin.id.startsWith(GATE_PIN_PREFIX))
|
|
31
|
+
continue;
|
|
32
|
+
const taskId = parseGateLinkedTaskId(pin.content);
|
|
33
|
+
if (!taskId)
|
|
34
|
+
continue;
|
|
35
|
+
const linkedPins = taskLinks.get(taskId) ?? [];
|
|
36
|
+
linkedPins.push(pin.id);
|
|
37
|
+
taskLinks.set(taskId, linkedPins);
|
|
38
|
+
}
|
|
39
|
+
return taskLinks;
|
|
40
|
+
});
|
|
41
|
+
/**
|
|
42
|
+
* Check guards before task creation. Returns advisory warnings (empty array if none).
|
|
43
|
+
* Advisory mode logs warnings to stderr and returns them for metadata injection;
|
|
44
|
+
* enforce mode fails with GuardExceededError.
|
|
45
|
+
*/
|
|
46
|
+
export const checkGuards = (guardRepo, config, parentId) => Effect.gen(function* () {
|
|
47
|
+
const warnings = [];
|
|
48
|
+
// Defensive: if config.guard is undefined (malformed config), skip guard checks
|
|
49
|
+
if (!config?.guard)
|
|
50
|
+
return warnings;
|
|
51
|
+
// Resolve effective guard: DB row takes precedence, fall back to config defaults
|
|
52
|
+
const dbGuard = yield* guardRepo.findByScope("global");
|
|
53
|
+
const globalGuard = dbGuard
|
|
54
|
+
? { maxPending: dbGuard.maxPending, maxChildren: dbGuard.maxChildren, maxDepth: dbGuard.maxDepth, enforce: dbGuard.enforce }
|
|
55
|
+
: (config.guard.maxPending !== null || config.guard.maxChildren !== null || config.guard.maxDepth !== null)
|
|
56
|
+
? { maxPending: config.guard.maxPending, maxChildren: config.guard.maxChildren, maxDepth: config.guard.maxDepth, enforce: config.guard.mode === "enforce" }
|
|
57
|
+
: null;
|
|
58
|
+
if (globalGuard) {
|
|
59
|
+
// DB row's enforce setting takes precedence; config only applies when no DB row exists
|
|
60
|
+
const enforce = globalGuard.enforce;
|
|
61
|
+
// Check max_pending
|
|
62
|
+
if (globalGuard.maxPending !== null) {
|
|
63
|
+
const pending = yield* guardRepo.countPending();
|
|
64
|
+
if (pending >= globalGuard.maxPending) {
|
|
65
|
+
const msg = `${pending}/${globalGuard.maxPending} pending tasks (global limit)`;
|
|
66
|
+
if (enforce) {
|
|
67
|
+
return yield* Effect.fail(new GuardExceededError({
|
|
68
|
+
scope: "global", metric: "max_pending", current: pending, limit: globalGuard.maxPending,
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
console.error(`\u26A0 Guard warning: ${msg}`);
|
|
72
|
+
warnings.push(msg);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Check max_depth (only relevant when creating under a parent)
|
|
76
|
+
if (globalGuard.maxDepth !== null && parentId) {
|
|
77
|
+
const depth = yield* guardRepo.getMaxDepth(parentId);
|
|
78
|
+
const newDepth = depth + 1;
|
|
79
|
+
if (newDepth > globalGuard.maxDepth) {
|
|
80
|
+
const msg = `depth ${newDepth}/${globalGuard.maxDepth} (global limit)`;
|
|
81
|
+
if (enforce) {
|
|
82
|
+
return yield* Effect.fail(new GuardExceededError({
|
|
83
|
+
scope: "global", metric: "max_depth", current: newDepth, limit: globalGuard.maxDepth,
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
console.error(`\u26A0 Guard warning: ${msg}`);
|
|
87
|
+
warnings.push(msg);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Check max_children (only relevant when creating under a parent)
|
|
91
|
+
if (globalGuard.maxChildren !== null && parentId) {
|
|
92
|
+
const children = yield* guardRepo.countChildrenOf(parentId);
|
|
93
|
+
if (children >= globalGuard.maxChildren) {
|
|
94
|
+
const msg = `${children}/${globalGuard.maxChildren} children of ${parentId} (global limit)`;
|
|
95
|
+
if (enforce) {
|
|
96
|
+
return yield* Effect.fail(new GuardExceededError({
|
|
97
|
+
scope: "global", metric: "max_children", current: children, limit: globalGuard.maxChildren,
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
console.error(`\u26A0 Guard warning: ${msg}`);
|
|
101
|
+
warnings.push(msg);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Check parent-specific guard (independent of global guard)
|
|
106
|
+
if (parentId) {
|
|
107
|
+
const parentGuard = yield* guardRepo.findByScope(`parent:${parentId}`);
|
|
108
|
+
if (parentGuard?.maxChildren !== null && parentGuard?.maxChildren !== undefined) {
|
|
109
|
+
const children = yield* guardRepo.countChildrenOf(parentId);
|
|
110
|
+
const parentEnforce = parentGuard.enforce;
|
|
111
|
+
if (children >= parentGuard.maxChildren) {
|
|
112
|
+
const msg = `${children}/${parentGuard.maxChildren} children of ${parentId} (parent scope)`;
|
|
113
|
+
if (parentEnforce) {
|
|
114
|
+
return yield* Effect.fail(new GuardExceededError({
|
|
115
|
+
scope: `parent:${parentId}`, metric: "max_children", current: children, limit: parentGuard.maxChildren,
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
console.error(`\u26A0 Guard warning: ${msg}`);
|
|
119
|
+
warnings.push(msg);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return warnings;
|
|
124
|
+
});
|
|
125
|
+
const isWorkableStatus = (status) => ["backlog", "ready", "planning", "active"].includes(status);
|
|
126
|
+
export const enrichWithDeps = (deps, task) => Effect.gen(function* () {
|
|
127
|
+
const blockerIds = yield* deps.depRepo.getBlockerIds(task.id);
|
|
128
|
+
const blockingIds = yield* deps.depRepo.getBlockingIds(task.id);
|
|
129
|
+
const childIds = yield* deps.taskRepo.getChildIds(task.id);
|
|
130
|
+
const directContextMap = yield* deps.taskRepo.getGroupContextForMany([task.id]);
|
|
131
|
+
const effectiveContextMap = yield* deps.taskRepo.resolveEffectiveGroupContextForMany([task.id]);
|
|
132
|
+
let isReady = isWorkableStatus(task.status);
|
|
133
|
+
if (isReady && blockerIds.length > 0) {
|
|
134
|
+
const blockers = yield* deps.taskRepo.findByIds(blockerIds);
|
|
135
|
+
isReady = blockers.every(b => b.status === "done");
|
|
136
|
+
}
|
|
137
|
+
const effective = effectiveContextMap.get(task.id);
|
|
138
|
+
return {
|
|
139
|
+
...task,
|
|
140
|
+
blockedBy: blockerIds,
|
|
141
|
+
blocks: blockingIds,
|
|
142
|
+
children: childIds,
|
|
143
|
+
isReady,
|
|
144
|
+
groupContext: directContextMap.get(task.id) ?? null,
|
|
145
|
+
effectiveGroupContext: effective?.context ?? null,
|
|
146
|
+
effectiveGroupContextSourceTaskId: effective?.sourceTaskId ?? null
|
|
147
|
+
};
|
|
148
|
+
});
|
|
149
|
+
export const enrichWithDepsBatch = (deps, tasks) => Effect.gen(function* () {
|
|
150
|
+
if (tasks.length === 0)
|
|
151
|
+
return [];
|
|
152
|
+
const taskIds = tasks.map(t => t.id);
|
|
153
|
+
// Batch fetch all dependency info (3 queries total instead of 3N)
|
|
154
|
+
const blockerIdsMap = yield* deps.depRepo.getBlockerIdsForMany(taskIds);
|
|
155
|
+
const blockingIdsMap = yield* deps.depRepo.getBlockingIdsForMany(taskIds);
|
|
156
|
+
const childIdsMap = yield* deps.taskRepo.getChildIdsForMany(taskIds);
|
|
157
|
+
const directContextMap = yield* deps.taskRepo.getGroupContextForMany(taskIds);
|
|
158
|
+
const effectiveContextMap = yield* deps.taskRepo.resolveEffectiveGroupContextForMany(taskIds);
|
|
159
|
+
// Collect all unique blocker IDs to fetch their status
|
|
160
|
+
const allBlockerIds = new Set();
|
|
161
|
+
for (const blockerIds of blockerIdsMap.values()) {
|
|
162
|
+
for (const id of blockerIds) {
|
|
163
|
+
allBlockerIds.add(id);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Fetch all blocker tasks to check their status (1 query instead of N)
|
|
167
|
+
const blockerTasks = allBlockerIds.size > 0
|
|
168
|
+
? yield* deps.taskRepo.findByIds([...allBlockerIds])
|
|
169
|
+
: [];
|
|
170
|
+
const blockerStatusMap = new Map();
|
|
171
|
+
for (const t of blockerTasks) {
|
|
172
|
+
blockerStatusMap.set(t.id, t.status);
|
|
173
|
+
}
|
|
174
|
+
// Build TaskWithDeps for each task
|
|
175
|
+
const results = [];
|
|
176
|
+
for (const task of tasks) {
|
|
177
|
+
const blockerIds = blockerIdsMap.get(task.id) ?? [];
|
|
178
|
+
const blockingIds = blockingIdsMap.get(task.id) ?? [];
|
|
179
|
+
const childIds = childIdsMap.get(task.id) ?? [];
|
|
180
|
+
// Compute isReady
|
|
181
|
+
let isReady = isWorkableStatus(task.status);
|
|
182
|
+
if (isReady && blockerIds.length > 0) {
|
|
183
|
+
isReady = blockerIds.every(bid => blockerStatusMap.get(bid) === "done");
|
|
184
|
+
}
|
|
185
|
+
const effective = effectiveContextMap.get(task.id);
|
|
186
|
+
results.push({
|
|
187
|
+
...task,
|
|
188
|
+
blockedBy: blockerIds,
|
|
189
|
+
blocks: blockingIds,
|
|
190
|
+
children: childIds,
|
|
191
|
+
isReady,
|
|
192
|
+
groupContext: directContextMap.get(task.id) ?? null,
|
|
193
|
+
effectiveGroupContext: effective?.context ?? null,
|
|
194
|
+
effectiveGroupContextSourceTaskId: effective?.sourceTaskId ?? null
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
return results;
|
|
198
|
+
});
|
|
199
|
+
/**
|
|
200
|
+
* Auto-complete parent task when all children are done.
|
|
201
|
+
* Optimized to use batch queries instead of N+1 recursive queries.
|
|
202
|
+
*/
|
|
203
|
+
export const autoCompleteParent = (taskRepo, parentId, now, options) => Effect.gen(function* () {
|
|
204
|
+
// 1. Get all ancestors in one query (recursive CTE)
|
|
205
|
+
const ancestors = yield* taskRepo.getAncestorChain(parentId);
|
|
206
|
+
if (ancestors.length === 0)
|
|
207
|
+
return;
|
|
208
|
+
// Filter out already-done ancestors (nothing to auto-complete)
|
|
209
|
+
const pendingAncestors = ancestors.filter(a => a.status !== "done");
|
|
210
|
+
if (pendingAncestors.length === 0)
|
|
211
|
+
return;
|
|
212
|
+
// 2. Batch get all children for all pending ancestors (1 query)
|
|
213
|
+
const ancestorIds = pendingAncestors.map(a => a.id);
|
|
214
|
+
const childIdsMap = yield* taskRepo.getChildIdsForMany(ancestorIds);
|
|
215
|
+
// 3. Collect all unique child IDs and batch fetch them (1 query)
|
|
216
|
+
const allChildIds = new Set();
|
|
217
|
+
for (const childIds of childIdsMap.values()) {
|
|
218
|
+
for (const id of childIds) {
|
|
219
|
+
allChildIds.add(id);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const childTasks = allChildIds.size > 0
|
|
223
|
+
? yield* taskRepo.findByIds([...allChildIds])
|
|
224
|
+
: [];
|
|
225
|
+
// Build status map for quick lookups
|
|
226
|
+
const childStatusMap = new Map();
|
|
227
|
+
for (const child of childTasks) {
|
|
228
|
+
childStatusMap.set(child.id, child.status);
|
|
229
|
+
}
|
|
230
|
+
// 4. Process ancestors in order (parent -> grandparent -> ...)
|
|
231
|
+
// Track which ones should be auto-completed
|
|
232
|
+
const toComplete = [];
|
|
233
|
+
const nowCompletedIds = new Set();
|
|
234
|
+
const blockedTaskIds = options?.blockedTaskIds;
|
|
235
|
+
for (const ancestor of pendingAncestors) {
|
|
236
|
+
if (blockedTaskIds?.has(ancestor.id)) {
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
const childIds = childIdsMap.get(ancestor.id) ?? [];
|
|
240
|
+
if (childIds.length === 0)
|
|
241
|
+
continue;
|
|
242
|
+
// Check if all children are done
|
|
243
|
+
// Include children we're about to mark as done in this pass
|
|
244
|
+
const allChildrenDone = childIds.every(childId => {
|
|
245
|
+
if (nowCompletedIds.has(childId))
|
|
246
|
+
return true;
|
|
247
|
+
return childStatusMap.get(childId) === "done";
|
|
248
|
+
});
|
|
249
|
+
if (allChildrenDone) {
|
|
250
|
+
// Mark for completion
|
|
251
|
+
toComplete.push({
|
|
252
|
+
...ancestor,
|
|
253
|
+
status: "done",
|
|
254
|
+
updatedAt: now,
|
|
255
|
+
completedAt: now
|
|
256
|
+
});
|
|
257
|
+
// Track so parent levels can see this ancestor is now done
|
|
258
|
+
nowCompletedIds.add(ancestor.id);
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
// If this ancestor can't be completed, neither can its ancestors
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// 5. Batch update all auto-completed ancestors (1 transaction)
|
|
266
|
+
if (toComplete.length > 0) {
|
|
267
|
+
yield* taskRepo.updateMany(toComplete);
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
//# sourceMappingURL=internals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internals.js","sourceRoot":"","sources":["../../../src/services/task-service/internals.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { Context, Effect, Layer } from "effect";
|
|
|
2
2
|
import { TaskRepository } from "../repo/task-repo.js";
|
|
3
3
|
import { DependencyRepository } from "../repo/dep-repo.js";
|
|
4
4
|
import { GuardRepository } from "../repo/guard-repo.js";
|
|
5
|
+
import { PinRepository } from "../repo/pin-repo.js";
|
|
5
6
|
import { TaskNotFoundError, ValidationError, DatabaseError, GuardExceededError, StaleDataError, HasChildrenError } from "../errors.js";
|
|
6
7
|
import type { Task, TaskId, TaskStatus, TaskWithDeps, TaskFilter, CreateTaskInput, UpdateTaskInput } from "@jamesaphoenix/tx-types";
|
|
7
8
|
declare const TaskService_base: Context.TagClass<TaskService, "TaskService", {
|
|
@@ -24,6 +25,6 @@ declare const TaskService_base: Context.TagClass<TaskService, "TaskService", {
|
|
|
24
25
|
}>;
|
|
25
26
|
export declare class TaskService extends TaskService_base {
|
|
26
27
|
}
|
|
27
|
-
export declare const TaskServiceLive: Layer.Layer<TaskService, never, TaskRepository | DependencyRepository | GuardRepository>;
|
|
28
|
+
export declare const TaskServiceLive: Layer.Layer<TaskService, never, TaskRepository | DependencyRepository | GuardRepository | PinRepository>;
|
|
28
29
|
export {};
|
|
29
30
|
//# sourceMappingURL=task-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-service.d.ts","sourceRoot":"","sources":["../../src/services/task-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"task-service.d.ts","sourceRoot":"","sources":["../../src/services/task-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAKtI,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAoB,MAAM,yBAAyB,CAAA;;qBAKhI,CAAC,KAAK,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,GAAG,kBAAkB,CAAC;kBACxG,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAAC;0BAC9D,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,iBAAiB,GAAG,aAAa,CAAC;+BACzE,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;qBAC3F,CACf,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;KAAE,KACpC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,eAAe,GAAG,aAAa,GAAG,cAAc,CAAC;8BACpE,CACxB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,KACZ,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,iBAAiB,GAAG,eAAe,GAAG,aAAa,CAAC;gCACzD,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,iBAAiB,GAAG,aAAa,CAAC;0BACpF,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,eAAe,GAAG,aAAa,GAAG,cAAc,CAAC;qBAClI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,aAAa,CAAC;mBAC5H,CAAC,MAAM,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;2BAC9D,CAAC,MAAM,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;oBACrF,CAAC,MAAM,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;;AArBjF,qBAAa,WAAY,SAAQ,gBAuB9B;CAAG;AA2BN,eAAO,MAAM,eAAe,0GAwW3B,CAAA"}
|
|
@@ -2,10 +2,12 @@ import { Context, Effect, Layer } from "effect";
|
|
|
2
2
|
import { TaskRepository } from "../repo/task-repo.js";
|
|
3
3
|
import { DependencyRepository } from "../repo/dep-repo.js";
|
|
4
4
|
import { GuardRepository } from "../repo/guard-repo.js";
|
|
5
|
-
import {
|
|
5
|
+
import { PinRepository } from "../repo/pin-repo.js";
|
|
6
|
+
import { TaskNotFoundError, ValidationError, DatabaseError, HasChildrenError } from "../errors.js";
|
|
6
7
|
import { generateTaskId, isUniqueConstraintError } from "../id.js";
|
|
7
8
|
import { isValidTransition, isValidStatus } from "../mappers/task.js";
|
|
8
9
|
import { readTxConfig } from "../utils/toml-config.js";
|
|
10
|
+
import { CASCADE_MAX_DEPTH, autoCompleteParent, checkGuards, enrichWithDeps, enrichWithDepsBatch, listGateTaskLinks } from "./task-service/internals.js";
|
|
9
11
|
export class TaskService extends Context.Tag("TaskService")() {
|
|
10
12
|
}
|
|
11
13
|
/**
|
|
@@ -21,241 +23,13 @@ const trimVisible = (s) => s.replace(/^[\s\p{Cf}]+|[\s\p{Cf}]+$/gu, "");
|
|
|
21
23
|
/** Strips null bytes (\0) which cause C API truncation, JSON issues, and terminal corruption. */
|
|
22
24
|
const stripNullBytes = (s) => s.replace(/\0/g, "");
|
|
23
25
|
const isValidAssigneeType = (assigneeType) => assigneeType === undefined || assigneeType === null || assigneeType === "human" || assigneeType === "agent";
|
|
24
|
-
/** Max recursion depth for destructive operations that must find ALL descendants.
|
|
25
|
-
* Bounded to avoid unbounded CTE recursion in SQLite while being deep enough
|
|
26
|
-
* for any realistic task hierarchy (display default is 10). */
|
|
27
|
-
const CASCADE_MAX_DEPTH = 1000;
|
|
28
26
|
const GROUP_CONTEXT_MAX_CHARS = 20_000;
|
|
29
|
-
/**
|
|
30
|
-
* Check guards before task creation. Returns advisory warnings (empty array if none).
|
|
31
|
-
* Advisory mode logs warnings to stderr and returns them for metadata injection;
|
|
32
|
-
* enforce mode fails with GuardExceededError.
|
|
33
|
-
*/
|
|
34
|
-
const checkGuards = (guardRepo, config, parentId) => Effect.gen(function* () {
|
|
35
|
-
const warnings = [];
|
|
36
|
-
// Defensive: if config.guard is undefined (malformed config), skip guard checks
|
|
37
|
-
if (!config?.guard)
|
|
38
|
-
return warnings;
|
|
39
|
-
// Resolve effective guard: DB row takes precedence, fall back to config defaults
|
|
40
|
-
const dbGuard = yield* guardRepo.findByScope("global");
|
|
41
|
-
const globalGuard = dbGuard
|
|
42
|
-
? { maxPending: dbGuard.maxPending, maxChildren: dbGuard.maxChildren, maxDepth: dbGuard.maxDepth, enforce: dbGuard.enforce }
|
|
43
|
-
: (config.guard.maxPending !== null || config.guard.maxChildren !== null || config.guard.maxDepth !== null)
|
|
44
|
-
? { maxPending: config.guard.maxPending, maxChildren: config.guard.maxChildren, maxDepth: config.guard.maxDepth, enforce: config.guard.mode === "enforce" }
|
|
45
|
-
: null;
|
|
46
|
-
if (globalGuard) {
|
|
47
|
-
// DB row's enforce setting takes precedence; config only applies when no DB row exists
|
|
48
|
-
const enforce = globalGuard.enforce;
|
|
49
|
-
// Check max_pending
|
|
50
|
-
if (globalGuard.maxPending !== null) {
|
|
51
|
-
const pending = yield* guardRepo.countPending();
|
|
52
|
-
if (pending >= globalGuard.maxPending) {
|
|
53
|
-
const msg = `${pending}/${globalGuard.maxPending} pending tasks (global limit)`;
|
|
54
|
-
if (enforce) {
|
|
55
|
-
return yield* Effect.fail(new GuardExceededError({
|
|
56
|
-
scope: "global", metric: "max_pending", current: pending, limit: globalGuard.maxPending,
|
|
57
|
-
}));
|
|
58
|
-
}
|
|
59
|
-
console.error(`\u26A0 Guard warning: ${msg}`);
|
|
60
|
-
warnings.push(msg);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
// Check max_depth (only relevant when creating under a parent)
|
|
64
|
-
if (globalGuard.maxDepth !== null && parentId) {
|
|
65
|
-
const depth = yield* guardRepo.getMaxDepth(parentId);
|
|
66
|
-
const newDepth = depth + 1;
|
|
67
|
-
if (newDepth > globalGuard.maxDepth) {
|
|
68
|
-
const msg = `depth ${newDepth}/${globalGuard.maxDepth} (global limit)`;
|
|
69
|
-
if (enforce) {
|
|
70
|
-
return yield* Effect.fail(new GuardExceededError({
|
|
71
|
-
scope: "global", metric: "max_depth", current: newDepth, limit: globalGuard.maxDepth,
|
|
72
|
-
}));
|
|
73
|
-
}
|
|
74
|
-
console.error(`\u26A0 Guard warning: ${msg}`);
|
|
75
|
-
warnings.push(msg);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
// Check max_children (only relevant when creating under a parent)
|
|
79
|
-
if (globalGuard.maxChildren !== null && parentId) {
|
|
80
|
-
const children = yield* guardRepo.countChildrenOf(parentId);
|
|
81
|
-
if (children >= globalGuard.maxChildren) {
|
|
82
|
-
const msg = `${children}/${globalGuard.maxChildren} children of ${parentId} (global limit)`;
|
|
83
|
-
if (enforce) {
|
|
84
|
-
return yield* Effect.fail(new GuardExceededError({
|
|
85
|
-
scope: "global", metric: "max_children", current: children, limit: globalGuard.maxChildren,
|
|
86
|
-
}));
|
|
87
|
-
}
|
|
88
|
-
console.error(`\u26A0 Guard warning: ${msg}`);
|
|
89
|
-
warnings.push(msg);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
// Check parent-specific guard (independent of global guard)
|
|
94
|
-
if (parentId) {
|
|
95
|
-
const parentGuard = yield* guardRepo.findByScope(`parent:${parentId}`);
|
|
96
|
-
if (parentGuard?.maxChildren !== null && parentGuard?.maxChildren !== undefined) {
|
|
97
|
-
const children = yield* guardRepo.countChildrenOf(parentId);
|
|
98
|
-
const parentEnforce = parentGuard.enforce;
|
|
99
|
-
if (children >= parentGuard.maxChildren) {
|
|
100
|
-
const msg = `${children}/${parentGuard.maxChildren} children of ${parentId} (parent scope)`;
|
|
101
|
-
if (parentEnforce) {
|
|
102
|
-
return yield* Effect.fail(new GuardExceededError({
|
|
103
|
-
scope: `parent:${parentId}`, metric: "max_children", current: children, limit: parentGuard.maxChildren,
|
|
104
|
-
}));
|
|
105
|
-
}
|
|
106
|
-
console.error(`\u26A0 Guard warning: ${msg}`);
|
|
107
|
-
warnings.push(msg);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
return warnings;
|
|
112
|
-
});
|
|
113
27
|
export const TaskServiceLive = Layer.effect(TaskService, Effect.gen(function* () {
|
|
114
28
|
const taskRepo = yield* TaskRepository;
|
|
115
29
|
const depRepo = yield* DependencyRepository;
|
|
116
30
|
const guardRepo = yield* GuardRepository;
|
|
31
|
+
const pinRepo = yield* PinRepository;
|
|
117
32
|
const config = readTxConfig();
|
|
118
|
-
const enrichWithDeps = (task) => Effect.gen(function* () {
|
|
119
|
-
const blockerIds = yield* depRepo.getBlockerIds(task.id);
|
|
120
|
-
const blockingIds = yield* depRepo.getBlockingIds(task.id);
|
|
121
|
-
const childIds = yield* taskRepo.getChildIds(task.id);
|
|
122
|
-
const directContextMap = yield* taskRepo.getGroupContextForMany([task.id]);
|
|
123
|
-
const effectiveContextMap = yield* taskRepo.resolveEffectiveGroupContextForMany([task.id]);
|
|
124
|
-
let isReady = ["backlog", "ready", "planning", "active"].includes(task.status);
|
|
125
|
-
if (isReady && blockerIds.length > 0) {
|
|
126
|
-
const blockers = yield* taskRepo.findByIds(blockerIds);
|
|
127
|
-
isReady = blockers.every(b => b.status === "done");
|
|
128
|
-
}
|
|
129
|
-
const effective = effectiveContextMap.get(task.id);
|
|
130
|
-
return {
|
|
131
|
-
...task,
|
|
132
|
-
blockedBy: blockerIds,
|
|
133
|
-
blocks: blockingIds,
|
|
134
|
-
children: childIds,
|
|
135
|
-
isReady,
|
|
136
|
-
groupContext: directContextMap.get(task.id) ?? null,
|
|
137
|
-
effectiveGroupContext: effective?.context ?? null,
|
|
138
|
-
effectiveGroupContextSourceTaskId: effective?.sourceTaskId ?? null
|
|
139
|
-
};
|
|
140
|
-
});
|
|
141
|
-
// Batch version of enrichWithDeps - avoids N+1 queries
|
|
142
|
-
const enrichWithDepsBatch = (tasks) => Effect.gen(function* () {
|
|
143
|
-
if (tasks.length === 0)
|
|
144
|
-
return [];
|
|
145
|
-
const taskIds = tasks.map(t => t.id);
|
|
146
|
-
// Batch fetch all dependency info (3 queries total instead of 3N)
|
|
147
|
-
const blockerIdsMap = yield* depRepo.getBlockerIdsForMany(taskIds);
|
|
148
|
-
const blockingIdsMap = yield* depRepo.getBlockingIdsForMany(taskIds);
|
|
149
|
-
const childIdsMap = yield* taskRepo.getChildIdsForMany(taskIds);
|
|
150
|
-
const directContextMap = yield* taskRepo.getGroupContextForMany(taskIds);
|
|
151
|
-
const effectiveContextMap = yield* taskRepo.resolveEffectiveGroupContextForMany(taskIds);
|
|
152
|
-
// Collect all unique blocker IDs to fetch their status
|
|
153
|
-
const allBlockerIds = new Set();
|
|
154
|
-
for (const blockerIds of blockerIdsMap.values()) {
|
|
155
|
-
for (const id of blockerIds) {
|
|
156
|
-
allBlockerIds.add(id);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
// Fetch all blocker tasks to check their status (1 query instead of N)
|
|
160
|
-
const blockerTasks = allBlockerIds.size > 0
|
|
161
|
-
? yield* taskRepo.findByIds([...allBlockerIds])
|
|
162
|
-
: [];
|
|
163
|
-
const blockerStatusMap = new Map();
|
|
164
|
-
for (const t of blockerTasks) {
|
|
165
|
-
blockerStatusMap.set(t.id, t.status);
|
|
166
|
-
}
|
|
167
|
-
// Build TaskWithDeps for each task
|
|
168
|
-
const results = [];
|
|
169
|
-
for (const task of tasks) {
|
|
170
|
-
const blockerIds = blockerIdsMap.get(task.id) ?? [];
|
|
171
|
-
const blockingIds = blockingIdsMap.get(task.id) ?? [];
|
|
172
|
-
const childIds = childIdsMap.get(task.id) ?? [];
|
|
173
|
-
// Compute isReady
|
|
174
|
-
let isReady = ["backlog", "ready", "planning", "active"].includes(task.status);
|
|
175
|
-
if (isReady && blockerIds.length > 0) {
|
|
176
|
-
isReady = blockerIds.every(bid => blockerStatusMap.get(bid) === "done");
|
|
177
|
-
}
|
|
178
|
-
const effective = effectiveContextMap.get(task.id);
|
|
179
|
-
results.push({
|
|
180
|
-
...task,
|
|
181
|
-
blockedBy: blockerIds,
|
|
182
|
-
blocks: blockingIds,
|
|
183
|
-
children: childIds,
|
|
184
|
-
isReady,
|
|
185
|
-
groupContext: directContextMap.get(task.id) ?? null,
|
|
186
|
-
effectiveGroupContext: effective?.context ?? null,
|
|
187
|
-
effectiveGroupContextSourceTaskId: effective?.sourceTaskId ?? null
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
return results;
|
|
191
|
-
});
|
|
192
|
-
// Auto-complete parent task when all children are done
|
|
193
|
-
// Optimized to use batch queries instead of N+1 recursive queries
|
|
194
|
-
// Old implementation: 3-4 queries per hierarchy level (40+ for deep trees)
|
|
195
|
-
// New implementation: 3 queries total + 1 batch update
|
|
196
|
-
const autoCompleteParent = (parentId, now) => Effect.gen(function* () {
|
|
197
|
-
// 1. Get all ancestors in one query (recursive CTE)
|
|
198
|
-
const ancestors = yield* taskRepo.getAncestorChain(parentId);
|
|
199
|
-
if (ancestors.length === 0)
|
|
200
|
-
return;
|
|
201
|
-
// Filter out already-done ancestors (nothing to auto-complete)
|
|
202
|
-
const pendingAncestors = ancestors.filter(a => a.status !== "done");
|
|
203
|
-
if (pendingAncestors.length === 0)
|
|
204
|
-
return;
|
|
205
|
-
// 2. Batch get all children for all pending ancestors (1 query)
|
|
206
|
-
const ancestorIds = pendingAncestors.map(a => a.id);
|
|
207
|
-
const childIdsMap = yield* taskRepo.getChildIdsForMany(ancestorIds);
|
|
208
|
-
// 3. Collect all unique child IDs and batch fetch them (1 query)
|
|
209
|
-
const allChildIds = new Set();
|
|
210
|
-
for (const childIds of childIdsMap.values()) {
|
|
211
|
-
for (const id of childIds) {
|
|
212
|
-
allChildIds.add(id);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
const childTasks = allChildIds.size > 0
|
|
216
|
-
? yield* taskRepo.findByIds([...allChildIds])
|
|
217
|
-
: [];
|
|
218
|
-
// Build status map for quick lookups
|
|
219
|
-
const childStatusMap = new Map();
|
|
220
|
-
for (const child of childTasks) {
|
|
221
|
-
childStatusMap.set(child.id, child.status);
|
|
222
|
-
}
|
|
223
|
-
// 4. Process ancestors in order (parent -> grandparent -> ...)
|
|
224
|
-
// Track which ones should be auto-completed
|
|
225
|
-
const toComplete = [];
|
|
226
|
-
const nowCompletedIds = new Set();
|
|
227
|
-
for (const ancestor of pendingAncestors) {
|
|
228
|
-
const childIds = childIdsMap.get(ancestor.id) ?? [];
|
|
229
|
-
if (childIds.length === 0)
|
|
230
|
-
continue;
|
|
231
|
-
// Check if all children are done
|
|
232
|
-
// Include children we're about to mark as done in this pass
|
|
233
|
-
const allChildrenDone = childIds.every(childId => {
|
|
234
|
-
if (nowCompletedIds.has(childId))
|
|
235
|
-
return true;
|
|
236
|
-
return childStatusMap.get(childId) === "done";
|
|
237
|
-
});
|
|
238
|
-
if (allChildrenDone) {
|
|
239
|
-
// Mark for completion
|
|
240
|
-
toComplete.push({
|
|
241
|
-
...ancestor,
|
|
242
|
-
status: "done",
|
|
243
|
-
updatedAt: now,
|
|
244
|
-
completedAt: now
|
|
245
|
-
});
|
|
246
|
-
// Track so parent levels can see this ancestor is now done
|
|
247
|
-
nowCompletedIds.add(ancestor.id);
|
|
248
|
-
}
|
|
249
|
-
else {
|
|
250
|
-
// If this ancestor can't be completed, neither can its ancestors
|
|
251
|
-
break;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
// 5. Batch update all auto-completed ancestors (1 transaction)
|
|
255
|
-
if (toComplete.length > 0) {
|
|
256
|
-
yield* taskRepo.updateMany(toComplete);
|
|
257
|
-
}
|
|
258
|
-
});
|
|
259
33
|
return {
|
|
260
34
|
create: (input) => Effect.gen(function* () {
|
|
261
35
|
const title = stripNullBytes(input.title);
|
|
@@ -333,13 +107,13 @@ export const TaskServiceLive = Layer.effect(TaskService, Effect.gen(function* ()
|
|
|
333
107
|
if (!task) {
|
|
334
108
|
return yield* Effect.fail(new TaskNotFoundError({ id }));
|
|
335
109
|
}
|
|
336
|
-
return yield* enrichWithDeps(task);
|
|
110
|
+
return yield* enrichWithDeps({ taskRepo, depRepo }, task);
|
|
337
111
|
}),
|
|
338
112
|
getWithDepsBatch: (ids) => Effect.gen(function* () {
|
|
339
113
|
if (ids.length === 0)
|
|
340
114
|
return [];
|
|
341
115
|
const tasks = yield* taskRepo.findByIds(ids);
|
|
342
|
-
return yield* enrichWithDepsBatch(tasks);
|
|
116
|
+
return yield* enrichWithDepsBatch({ taskRepo, depRepo }, tasks);
|
|
343
117
|
}),
|
|
344
118
|
update: (id, input, options) => Effect.gen(function* () {
|
|
345
119
|
const existing = yield* taskRepo.findById(id);
|
|
@@ -392,6 +166,12 @@ export const TaskServiceLive = Layer.effect(TaskService, Effect.gen(function* ()
|
|
|
392
166
|
const now = new Date();
|
|
393
167
|
const actor = options?.actor ?? "agent";
|
|
394
168
|
const isDone = input.status === "done" && existing.status !== "done";
|
|
169
|
+
const shouldBlockAgentDoneForPinnedTasks = isDone &&
|
|
170
|
+
actor === "agent" &&
|
|
171
|
+
config.pins.blockAgentDoneWhenTaskIdPresent;
|
|
172
|
+
const linkedGatePins = shouldBlockAgentDoneForPinnedTasks
|
|
173
|
+
? yield* listGateTaskLinks(pinRepo)
|
|
174
|
+
: new Map();
|
|
395
175
|
if (isDone && actor === "agent") {
|
|
396
176
|
const childIds = yield* taskRepo.getChildIds(id);
|
|
397
177
|
if (childIds.length > 0) {
|
|
@@ -406,6 +186,14 @@ export const TaskServiceLive = Layer.effect(TaskService, Effect.gen(function* ()
|
|
|
406
186
|
}
|
|
407
187
|
}
|
|
408
188
|
}
|
|
189
|
+
if (shouldBlockAgentDoneForPinnedTasks) {
|
|
190
|
+
const blockingGateIds = linkedGatePins.get(id);
|
|
191
|
+
if (blockingGateIds && blockingGateIds.length > 0) {
|
|
192
|
+
return yield* Effect.fail(new ValidationError({
|
|
193
|
+
reason: `Agent cannot mark task ${id} done because it is linked by gate pin(s): ${blockingGateIds.join(", ")}`
|
|
194
|
+
}));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
409
197
|
const assigneeTypeChanged = input.assigneeType !== undefined && input.assigneeType !== existing.assigneeType;
|
|
410
198
|
const assigneeIdChanged = input.assigneeId !== undefined && input.assigneeId !== existing.assigneeId;
|
|
411
199
|
let nextAssigneeType = input.assigneeType !== undefined ? input.assigneeType : existing.assigneeType;
|
|
@@ -438,7 +226,11 @@ export const TaskServiceLive = Layer.effect(TaskService, Effect.gen(function* ()
|
|
|
438
226
|
yield* taskRepo.update(updated, existing.updatedAt);
|
|
439
227
|
// Auto-complete parent if all children are done
|
|
440
228
|
if (isDone && updated.parentId) {
|
|
441
|
-
yield* autoCompleteParent(updated.parentId, now
|
|
229
|
+
yield* autoCompleteParent(taskRepo, updated.parentId, now, {
|
|
230
|
+
blockedTaskIds: shouldBlockAgentDoneForPinnedTasks
|
|
231
|
+
? new Set(linkedGatePins.keys())
|
|
232
|
+
: undefined
|
|
233
|
+
});
|
|
442
234
|
}
|
|
443
235
|
return updated;
|
|
444
236
|
}),
|
|
@@ -460,7 +252,7 @@ export const TaskServiceLive = Layer.effect(TaskService, Effect.gen(function* ()
|
|
|
460
252
|
if (!task) {
|
|
461
253
|
return yield* Effect.fail(new TaskNotFoundError({ id }));
|
|
462
254
|
}
|
|
463
|
-
return yield* enrichWithDeps(task);
|
|
255
|
+
return yield* enrichWithDeps({ taskRepo, depRepo }, task);
|
|
464
256
|
}),
|
|
465
257
|
clearGroupContext: (id) => Effect.gen(function* () {
|
|
466
258
|
yield* taskRepo.clearGroupContext(id);
|
|
@@ -468,7 +260,7 @@ export const TaskServiceLive = Layer.effect(TaskService, Effect.gen(function* ()
|
|
|
468
260
|
if (!task) {
|
|
469
261
|
return yield* Effect.fail(new TaskNotFoundError({ id }));
|
|
470
262
|
}
|
|
471
|
-
return yield* enrichWithDeps(task);
|
|
263
|
+
return yield* enrichWithDeps({ taskRepo, depRepo }, task);
|
|
472
264
|
}),
|
|
473
265
|
forceStatus: (id, status) => Effect.gen(function* () {
|
|
474
266
|
const existing = yield* taskRepo.findById(id);
|
|
@@ -523,7 +315,7 @@ export const TaskServiceLive = Layer.effect(TaskService, Effect.gen(function* ()
|
|
|
523
315
|
list: (filter) => taskRepo.findAll(filter),
|
|
524
316
|
listWithDeps: (filter) => Effect.gen(function* () {
|
|
525
317
|
const tasks = yield* taskRepo.findAll(filter);
|
|
526
|
-
return yield* enrichWithDepsBatch(tasks);
|
|
318
|
+
return yield* enrichWithDepsBatch({ taskRepo, depRepo }, tasks);
|
|
527
319
|
}),
|
|
528
320
|
count: (filter) => taskRepo.count(filter)
|
|
529
321
|
};
|