@chemx/starter-kit 26.10.7-1061 → 26.10.10-75
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/AGENTS.md +158 -43
- package/README.md +253 -199
- package/blueprints/atoms/a-button.svelte +11 -9
- package/blueprints/atoms/a-button.vue +2 -1
- package/blueprints/molecule-capsule/m-chemx-badge/m-chemx-badge.svelte +8 -4
- package/blueprints/molecule-capsule/m-chemx-badge/m-chemx-badge.tsx +8 -4
- package/blueprints/molecule-capsule/m-chemx-badge/m-chemx-badge.vue +8 -4
- package/blueprints/molecule-capsule/m-sample-card.svelte +2 -1
- package/blueprints/molecule-capsule/m-sample-card.tsx +2 -1
- package/blueprints/molecule-capsule/m-sample-card.vue +4 -2
- package/blueprints/workflows/chemx-audit.yml +15 -46
- package/cli/agent-json.js +40 -0
- package/cli/apply-edits.js +195 -0
- package/cli/audit/ai-slop-detector.js +62 -35
- package/cli/audit/ast-passes.js +52 -0
- package/cli/audit/ast-visitors.js +231 -57
- package/cli/audit/audit-plain.js +26 -0
- package/cli/audit/audit-summary.js +16 -3
- package/cli/audit/autofix-content.js +122 -0
- package/cli/audit/autofix.js +74 -159
- package/cli/audit/budget-rules.js +84 -0
- package/cli/audit/catch-predicates.js +51 -0
- package/cli/audit/chemx-dir.js +76 -0
- package/cli/audit/clone-detector.js +4 -2
- package/cli/audit/comment-regions.js +83 -0
- package/cli/audit/coverage.js +48 -0
- package/cli/audit/csharp-analyzer.js +47 -22
- package/cli/audit/discussion-store.js +9 -4
- package/cli/audit/extended-text-patterns.js +104 -54
- package/cli/audit/extended-visitors.js +26 -12
- package/cli/audit/feed.d.ts +77 -0
- package/cli/audit/feed.js +146 -0
- package/cli/audit/gate-delta.js +91 -0
- package/cli/audit/gate-verdict.js +25 -3
- package/cli/audit/history.d.ts +14 -2
- package/cli/audit/history.js +90 -65
- package/cli/audit/hook-shape-validator.js +18 -9
- package/cli/audit/lexicon-predicates.js +125 -0
- package/cli/audit/lifecycle-predicates.js +106 -0
- package/cli/audit/line-budgets.js +154 -0
- package/cli/audit/metrics.js +56 -37
- package/cli/audit/mutable-ref-predicate.js +54 -0
- package/cli/audit/parseable-code.js +11 -0
- package/cli/audit/pattern-detector.js +56 -28
- package/cli/audit/project-figures.js +28 -0
- package/cli/audit/prompt-rule-lines.js +46 -0
- package/cli/audit/prompts.js +74 -46
- package/cli/audit/prop-surface.js +74 -0
- package/cli/audit/ratchet.js +112 -23
- package/cli/audit/render-depth.js +79 -0
- package/cli/audit/reporter-banner.js +7 -4
- package/cli/audit/reporter-grades.js +52 -34
- package/cli/audit/reporter-grouping.js +10 -5
- package/cli/audit/reporter-markdown.js +16 -8
- package/cli/audit/reporter-sections.js +31 -16
- package/cli/audit/reporter-summary.js +28 -16
- package/cli/audit/reporter-utils.js +54 -30
- package/cli/audit/roadmap.js +20 -15
- package/cli/audit/rule-overrides.js +78 -0
- package/cli/audit/rule-pillars.js +43 -0
- package/cli/audit/rule-revisions.js +42 -0
- package/cli/audit/rules-helpers.js +13 -63
- package/cli/audit/rules-predicates.d.ts +1 -0
- package/cli/audit/rules-predicates.js +233 -13
- package/cli/audit/rules-registry.js +115 -6
- package/cli/audit/rules.js +92 -171
- package/cli/audit/shallow-catch-csharp.js +49 -0
- package/cli/audit/shallow-catch-escalation.js +157 -0
- package/cli/audit/shallow-catch-reads.js +116 -0
- package/cli/audit/social-gh.js +18 -9
- package/cli/audit/social-git.js +82 -40
- package/cli/audit/social-http.js +17 -9
- package/cli/audit/social-publisher.js +14 -7
- package/cli/audit/social.js +39 -30
- package/cli/audit/staged-delta.js +67 -0
- package/cli/audit/status-file.js +67 -0
- package/cli/audit/structural-weight-evaluator.js +17 -29
- package/cli/audit/structural-weight.js +30 -13
- package/cli/audit/suppressions.js +130 -0
- package/cli/audit/template-rules.js +82 -0
- package/cli/audit/types.d.ts +24 -1
- package/cli/audit-engine.js +128 -0
- package/cli/audit-preflight-git.js +15 -1
- package/cli/audit-preflight.js +6 -4
- package/cli/audit-scan.js +180 -0
- package/cli/audit-scope.js +31 -14
- package/cli/audit.js +6 -201
- package/cli/babel-lazy.js +41 -0
- package/cli/badge.js +9 -6
- package/cli/banner.js +37 -0
- package/cli/build/child-registry.js +57 -0
- package/cli/build/executor.js +122 -48
- package/cli/build.js +75 -25
- package/cli/cli-args.js +107 -0
- package/cli/columnar.js +6 -3
- package/cli/commands/cmd-audit-each.js +164 -0
- package/cli/commands/cmd-audit-feed.js +78 -0
- package/cli/commands/cmd-audit.js +136 -57
- package/cli/commands/cmd-batch.js +60 -0
- package/cli/commands/cmd-check.js +74 -0
- package/cli/commands/cmd-project.js +18 -9
- package/cli/commands/cmd-router.js +177 -26
- package/cli/commands/cmd-show.js +56 -0
- package/cli/commands/cmd-staged-delta.js +27 -0
- package/cli/commands/cmd-wrappers-files.js +77 -0
- package/cli/commands/cmd-wrappers-git.js +122 -0
- package/cli/commands/cmd-wrappers-json.js +101 -0
- package/cli/commands/cmd-wrappers.js +7 -0
- package/cli/commands/unknown-flags.js +228 -0
- package/cli/commands-schema-badge.js +73 -0
- package/cli/commands-schema-commit.js +21 -0
- package/cli/commands-schema-edit.js +106 -0
- package/cli/commands-schema-host.js +65 -0
- package/cli/commands-schema-ops.js +127 -0
- package/cli/commands-schema-patterns.js +69 -0
- package/cli/commands-schema-report.js +18 -0
- package/cli/commands-schema-search.js +121 -0
- package/cli/commands-schema-setup.js +30 -0
- package/cli/commands-schema-verify.js +89 -0
- package/cli/commands-schema-wrappers.js +131 -0
- package/cli/commands-schema.js +26 -318
- package/cli/comment-ranges.js +108 -0
- package/cli/commit/commit-args.js +73 -0
- package/cli/commit/commit-cli.js +25 -0
- package/cli/commit/commit-facts.js +49 -0
- package/cli/commit/commit-git.js +98 -0
- package/cli/commit/commit-index.js +35 -0
- package/cli/commit/commit-message.js +52 -0
- package/cli/commit/commit-record.js +68 -0
- package/cli/commit/commit-run.js +160 -0
- package/cli/commit/commit-validate.js +62 -0
- package/cli/config/index.js +54 -8
- package/cli/config/loader.js +77 -8
- package/cli/config/profiles.js +7 -0
- package/cli/conflicts-cli.js +118 -0
- package/cli/conflicts.js +104 -0
- package/cli/create.js +11 -6
- package/cli/db-project-stamp.js +124 -0
- package/cli/docs-check/command-tree.js +27 -0
- package/cli/docs-check/extract.js +151 -0
- package/cli/docs-check/resolve.js +85 -0
- package/cli/docs-check/run.js +88 -0
- package/cli/doctor/check-env.js +43 -0
- package/cli/doctor/check-host.js +115 -0
- package/cli/doctor/check-index.js +93 -0
- package/cli/doctor/check-mcp.js +78 -0
- package/cli/doctor/doctor-cli.js +60 -0
- package/cli/doctor/kit-locate.js +40 -0
- package/cli/doctor/proc-scan.js +66 -0
- package/cli/edit-atomic.js +75 -0
- package/cli/edit-diff.js +98 -0
- package/cli/edit-guardrails.js +77 -0
- package/cli/edit-locks.js +128 -0
- package/cli/embeddings/vectorizer.js +9 -5
- package/cli/errors/catcher.js +67 -41
- package/cli/errors/formatter.js +14 -10
- package/cli/errors/policy.js +26 -0
- package/cli/errors/publisher.js +5 -1
- package/cli/errors/report-output.js +67 -0
- package/cli/errors/sanitizer.js +52 -3
- package/cli/errors/storage.js +17 -5
- package/cli/explode-importers.js +102 -0
- package/cli/explode-path-args.js +115 -0
- package/cli/explode-plan.js +153 -0
- package/cli/explode-prologue.js +43 -0
- package/cli/explode-relocate.js +73 -0
- package/cli/exploder.js +205 -193
- package/cli/forge/anchors.js +50 -0
- package/cli/forge/audit-forge.js +58 -0
- package/cli/forge/binding-walk.js +84 -0
- package/cli/forge/bindings.js +238 -0
- package/cli/forge/blueprint-cli.js +153 -0
- package/cli/forge/blueprint-context.js +69 -0
- package/cli/forge/blueprint-members.js +82 -0
- package/cli/forge/blueprint-store.js +106 -0
- package/cli/forge/blueprint-target.js +44 -0
- package/cli/forge/blueprint.js +276 -0
- package/cli/forge/body-end-cache.js +34 -0
- package/cli/forge/body-ends.js +86 -0
- package/cli/forge/canon-inline.js +342 -0
- package/cli/forge/canon-logic.js +106 -0
- package/cli/forge/canon-nodes.js +270 -0
- package/cli/forge/canon-print.js +120 -0
- package/cli/forge/canonicalize.js +49 -0
- package/cli/forge/conventions.js +51 -0
- package/cli/forge/drift.js +120 -0
- package/cli/forge/exclusions.js +21 -0
- package/cli/forge/exits.js +76 -0
- package/cli/forge/facets.js +86 -0
- package/cli/forge/file-units.js +53 -0
- package/cli/forge/fingerprint-file.js +52 -0
- package/cli/forge/fingerprint-session.js +215 -0
- package/cli/forge/fingerprint-sync.js +74 -0
- package/cli/forge/fingerprint-visitors.js +66 -0
- package/cli/forge/fixtures/heal/a7-dry-run.diff.txt +179 -0
- package/cli/forge/fixtures/heal/cli/commit/commit-facts.js.txt +49 -0
- package/cli/forge/fixtures/heal/cli/doctor/check-host.js.txt +117 -0
- package/cli/forge/fixtures/heal/cli/doctor/kit-locate.js.txt +42 -0
- package/cli/forge/fixtures/heal/cli/hooks/guard-paths.js.txt +80 -0
- package/cli/forge/fixtures/heal/cli/hooks/project-status.js.txt +62 -0
- package/cli/forge/fixtures/heal/cli/main.js.txt +169 -0
- package/cli/forge/fixtures/heal/cli/mcp/context.js.txt +81 -0
- package/cli/forge/fixtures/heal/cli/mcp/installer-report.js.txt +47 -0
- package/cli/forge/fixtures/heal/cli/path-scope.js.txt +169 -0
- package/cli/forge/fixtures/heal/cli/project-detector.js.txt +364 -0
- package/cli/forge/fixtures/heal/cli/project-markers.js.txt +42 -0
- package/cli/forge/fixtures/heal/cli/team/coordination-root.js.txt +161 -0
- package/cli/forge/fixtures/heal/cli/team/usage-reader.js.txt +109 -0
- package/cli/forge/fixtures/heal/cli/test-slots.js.txt +129 -0
- package/cli/forge/fixtures/social-gh.js.txt +131 -0
- package/cli/forge/fixtures/team-flags.js.txt +214 -0
- package/cli/forge/fold.js +199 -0
- package/cli/forge/forge-groups.js +200 -0
- package/cli/forge/forge-report.js +73 -0
- package/cli/forge/fuzz/binding-hook.js +36 -0
- package/cli/forge/fuzz/choices.js +40 -0
- package/cli/forge/fuzz/classes.js +41 -0
- package/cli/forge/fuzz/coverage.js +26 -0
- package/cli/forge/fuzz/gen-alias.js +61 -0
- package/cli/forge/fuzz/gen-control.js +73 -0
- package/cli/forge/fuzz/gen-kit.js +75 -0
- package/cli/forge/fuzz/gen-logic.js +77 -0
- package/cli/forge/fuzz/gen-mixed.js +204 -0
- package/cli/forge/fuzz/gen-modules.js +80 -0
- package/cli/forge/fuzz/gen-objects.js +92 -0
- package/cli/forge/fuzz/gen-scope.js +131 -0
- package/cli/forge/fuzz/gen-templates.js +87 -0
- package/cli/forge/fuzz/harness.js +314 -0
- package/cli/forge/fuzz/pair-check.js +115 -0
- package/cli/forge/fuzz/resolve.js +32 -0
- package/cli/forge/fuzz/run.js +121 -0
- package/cli/forge/fuzz/sandbox.js +108 -0
- package/cli/forge/fuzz/seeds.js +119 -0
- package/cli/forge/fuzz/slow-shard.js +60 -0
- package/cli/forge/fuzz/template-oracle.js +148 -0
- package/cli/forge/fuzz/transpile.js +61 -0
- package/cli/forge/gates.js +115 -0
- package/cli/forge/group-shape.js +137 -0
- package/cli/forge/group-store.js +160 -0
- package/cli/forge/group.js +280 -0
- package/cli/forge/gt-sandbox.js +83 -0
- package/cli/forge/gt-scaffold.js +110 -0
- package/cli/forge/hash-labels.js +117 -0
- package/cli/forge/hash.js +119 -0
- package/cli/forge/heal-apply.js +170 -0
- package/cli/forge/heal-cli.js +132 -0
- package/cli/forge/heal-leases.js +52 -0
- package/cli/forge/heal-locate.js +70 -0
- package/cli/forge/heal-match.js +208 -0
- package/cli/forge/heal-ops.js +197 -0
- package/cli/forge/heal-plan.js +143 -0
- package/cli/forge/heal-sandbox.js +126 -0
- package/cli/forge/heal-specs.js +80 -0
- package/cli/forge/heal-store.js +80 -0
- package/cli/forge/heal-text.js +60 -0
- package/cli/forge/heal-typecheck.js +108 -0
- package/cli/forge/heal-undo.js +74 -0
- package/cli/forge/heal-verify.js +148 -0
- package/cli/forge/hole-kinds.js +126 -0
- package/cli/forge/inline-mode.js +6 -0
- package/cli/forge/inline-on.setup.js +4 -0
- package/cli/forge/lgg-stage.js +125 -0
- package/cli/forge/lgg.js +197 -0
- package/cli/forge/library-match.js +74 -0
- package/cli/forge/murmur.js +86 -0
- package/cli/forge/naming.js +101 -0
- package/cli/forge/pattern-schema-ddl.js +157 -0
- package/cli/forge/placement.js +165 -0
- package/cli/forge/rank.js +174 -0
- package/cli/forge/refine.js +93 -0
- package/cli/forge/rejected-members.js +92 -0
- package/cli/forge/rejects.js +77 -0
- package/cli/forge/root-shapes.js +84 -0
- package/cli/forge/run-cache.js +145 -0
- package/cli/forge/sibling-blocks.js +41 -0
- package/cli/forge/siblings.js +140 -0
- package/cli/forge/store.js +180 -0
- package/cli/forge/template-normalize.js +209 -0
- package/cli/forge/template-roles.js +86 -0
- package/cli/forge/template-units.js +148 -0
- package/cli/forge/templates.js +42 -0
- package/cli/forge/unify-step.js +65 -0
- package/cli/forge/unit-floor.js +74 -0
- package/cli/forge/unit-hash.js +229 -0
- package/cli/forge/unit-trees.js +153 -0
- package/cli/forge/units.js +261 -0
- package/cli/forge/windows.js +129 -0
- package/cli/friction/friction-cli.js +71 -0
- package/cli/friction/friction-export.js +54 -0
- package/cli/friction/friction-log.js +54 -0
- package/cli/friction/usage-classify.js +56 -0
- package/cli/friction/usage-report.js +86 -0
- package/cli/friction/wrong-call.js +12 -0
- package/cli/fs-json.js +17 -0
- package/cli/generator-compact.js +55 -0
- package/cli/generator-help.js +16 -15
- package/cli/generator-indexer.js +2 -1
- package/cli/generator-jig-cli.js +11 -7
- package/cli/generator-jig.js +38 -33
- package/cli/generator-templates/archetypes/index.js +30 -13
- package/cli/generator-templates/archetypes/vector-matcher.js +8 -4
- package/cli/generator-templates/compact.js +4 -2
- package/cli/generator-templates/controller-converters.js +23 -14
- package/cli/generator-templates/controller.js +10 -5
- package/cli/generator-templates/hooks.js +4 -2
- package/cli/generator-templates/naming.js +2 -1
- package/cli/generator-templates/react.js +2 -1
- package/cli/generator-templates/specs.js +4 -2
- package/cli/generator-templates/svelte.js +4 -2
- package/cli/generator-templates/types.js +6 -3
- package/cli/generator-templates/views.js +4 -2
- package/cli/generator-templates/vue.js +4 -2
- package/cli/generator-writes.js +24 -0
- package/cli/generator.d.ts +1 -1
- package/cli/generator.js +86 -127
- package/cli/git-file-listing.js +69 -0
- package/cli/help-args.js +18 -0
- package/cli/help.d.ts +7 -3
- package/cli/help.js +92 -106
- package/cli/hooks/bypass-log.js +44 -0
- package/cli/hooks/claude-post-edit.js +79 -0
- package/cli/hooks/claude-pre-tool.js +178 -0
- package/cli/hooks/claude-settings-merge.js +101 -0
- package/cli/hooks/dispatch-identity.js +125 -0
- package/cli/hooks/entry.js +181 -0
- package/cli/hooks/foreign-identity.js +60 -0
- package/cli/hooks/guard-args.js +55 -0
- package/cli/hooks/guard-cases.js +94 -0
- package/cli/hooks/guard-config.js +43 -0
- package/cli/hooks/guard-invocation.js +106 -0
- package/cli/hooks/guard-paths.js +80 -0
- package/cli/hooks/guard-route.js +211 -0
- package/cli/hooks/guard-rules-nudge.js +37 -0
- package/cli/hooks/guard-rules-reads.js +66 -0
- package/cli/hooks/guard-rules-shell.js +239 -0
- package/cli/hooks/guard-rules.js +114 -0
- package/cli/hooks/hook-commands.js +21 -0
- package/cli/hooks/install-hooks-apply.js +36 -0
- package/cli/hooks/install-hooks-cli.js +100 -0
- package/cli/hooks/install-hooks-config.js +48 -0
- package/cli/hooks/install-hooks-pins.js +66 -0
- package/cli/hooks/install-hooks-plan.js +56 -0
- package/cli/hooks/install-hooks-status.js +7 -0
- package/cli/hooks/interpreter-writes.js +195 -0
- package/cli/hooks/launcher.js +60 -0
- package/cli/hooks/mcp-json-merge.js +39 -0
- package/cli/hooks/native-edit-lock.js +40 -0
- package/cli/hooks/native-tool-policy.js +152 -0
- package/cli/hooks/out-of-band-edits.js +141 -0
- package/cli/hooks/post-edit-scope.js +43 -0
- package/cli/hooks/project-status.js +59 -0
- package/cli/hooks/repo-membership.js +32 -0
- package/cli/hooks/run-hook.js +79 -0
- package/cli/hooks/session-identity.js +153 -0
- package/cli/hooks/session-start.js +50 -0
- package/cli/hooks/shell-lexer-readers.js +76 -0
- package/cli/hooks/shell-lexer-state.js +59 -0
- package/cli/hooks/shell-lexer.js +110 -0
- package/cli/hooks/shell-parse.js +232 -0
- package/cli/hooks/statusline.js +27 -0
- package/cli/hooks/xatoms-hints.js +38 -0
- package/cli/host-protocol.js +109 -0
- package/cli/host-shims.js +9 -5
- package/cli/index-admission.js +41 -0
- package/cli/index-freshness.js +83 -0
- package/cli/index-row-check.js +58 -0
- package/cli/index.js +52 -144
- package/cli/installer-templates.js +67 -75
- package/cli/installer.d.ts +16 -1
- package/cli/installer.js +159 -58
- package/cli/languages.js +8 -4
- package/cli/lattice-directives.js +24 -0
- package/cli/lattice-payload.js +34 -0
- package/cli/{tesseract-state.js → lattice-state.js} +8 -4
- package/cli/lease-view.js +48 -0
- package/cli/library/entry-fp.js +42 -0
- package/cli/library/entry-schema.js +90 -0
- package/cli/library/library-tasks.js +25 -0
- package/cli/library/registry.js +56 -0
- package/cli/library/reverify.js +56 -0
- package/cli/library/verify-checks.js +89 -0
- package/cli/library/verify.js +81 -0
- package/cli/license-config.js +124 -0
- package/cli/license.js +168 -135
- package/cli/line-count.js +23 -0
- package/cli/literal-replace.js +107 -0
- package/cli/main.js +166 -0
- package/cli/mcp/antigravity.js +19 -9
- package/cli/mcp/batch.js +59 -0
- package/cli/mcp/call-args.js +75 -0
- package/cli/mcp/call-effects.js +57 -0
- package/cli/mcp/call-scope.js +70 -62
- package/cli/mcp/context.js +81 -0
- package/cli/mcp/envelope.js +62 -0
- package/cli/mcp/fingerprint.js +26 -0
- package/cli/mcp/fresh-entry.js +34 -0
- package/cli/mcp/fresh-protocol.js +37 -0
- package/cli/mcp/fresh-runner.js +40 -0
- package/cli/mcp/help.js +53 -0
- package/cli/mcp/index.js +9 -5
- package/cli/mcp/inflight.js +47 -0
- package/cli/mcp/installer-jsonc.js +64 -0
- package/cli/mcp/installer-package.js +54 -0
- package/cli/mcp/installer-report.js +47 -0
- package/cli/mcp/installer-write.js +117 -0
- package/cli/mcp/installer.js +88 -187
- package/cli/mcp/manifests-analysis.js +156 -0
- package/cli/mcp/manifests-runners.js +48 -0
- package/cli/mcp/manifests-team.js +100 -0
- package/cli/mcp/manifests.js +78 -324
- package/cli/mcp/offload-worker.js +11 -0
- package/cli/mcp/offload.js +18 -0
- package/cli/mcp/patterns-cli.js +76 -0
- package/cli/mcp/patterns-forge-cli.js +120 -0
- package/cli/mcp/prompts.js +13 -10
- package/cli/mcp/resources.js +8 -35
- package/cli/mcp/roots.js +46 -0
- package/cli/mcp/scorecard-worker.js +7 -0
- package/cli/mcp/scorecard.js +42 -0
- package/cli/mcp/server-info.js +28 -0
- package/cli/mcp/server.js +91 -291
- package/cli/mcp/spec-harness.js +62 -0
- package/cli/mcp/stale-exec.js +48 -0
- package/cli/mcp/staleness.js +26 -0
- package/cli/mcp/stdio.js +141 -0
- package/cli/mcp/tool-call.js +73 -0
- package/cli/mcp/tools-audit-feed.js +33 -0
- package/cli/mcp/tools-audit.js +13 -7
- package/cli/mcp/tools-generate.js +3 -3
- package/cli/mcp/tools-lazy.js +39 -0
- package/cli/mcp/tools-patch.js +93 -21
- package/cli/mcp/tools-patterns.js +6 -3
- package/cli/mcp/tools-project.js +8 -4
- package/cli/mcp/tools-q-modes.js +15 -14
- package/cli/mcp/tools-q.js +94 -33
- package/cli/mcp/tools-read.js +30 -80
- package/cli/mcp/tools-team-feed.js +10 -8
- package/cli/mcp/tools-team-locks.js +22 -10
- package/cli/mcp/tools-team-mailbox.js +8 -7
- package/cli/mcp/tools-team-tasks.js +125 -38
- package/cli/mcp/tools-team.js +14 -7
- package/cli/mcp/tools-verify.js +44 -15
- package/cli/mcp/tools-write.js +11 -16
- package/cli/mcp/tools.js +208 -40
- package/cli/mcp/worker-run.js +24 -0
- package/cli/missing-imports.js +52 -0
- package/cli/mutation-args.js +96 -0
- package/cli/mutators.js +164 -61
- package/cli/navigator-actions.js +19 -13
- package/cli/navigator-banner-helpers.js +1 -26
- package/cli/navigator-banner.js +5 -3
- package/cli/navigator-conversion.js +23 -12
- package/cli/navigator-grades.js +70 -35
- package/cli/navigator-guide.js +13 -11
- package/cli/navigator-menu.js +80 -166
- package/cli/navigator-paged.js +15 -8
- package/cli/navigator-sections.js +32 -0
- package/cli/navigator-share.js +53 -39
- package/cli/navigator.d.ts +25 -5
- package/cli/navigator.js +14 -41
- package/cli/network-policy.js +72 -0
- package/cli/network-recorder.fixture.mjs +35 -0
- package/cli/outline/ast-outline.js +120 -0
- package/cli/outline/style-outline.js +42 -0
- package/cli/outline/vue-outline.js +88 -0
- package/cli/patcher-cli.js +255 -0
- package/cli/patcher.d.ts +55 -24
- package/cli/patcher.js +167 -358
- package/cli/path-scope.js +78 -22
- package/cli/patterns/fixtures/gt/A1.txt +109 -0
- package/cli/patterns/fixtures/gt/A10.txt +13 -0
- package/cli/patterns/fixtures/gt/A11.txt +10 -0
- package/cli/patterns/fixtures/gt/A12.txt +29 -0
- package/cli/patterns/fixtures/gt/A13.txt +39 -0
- package/cli/patterns/fixtures/gt/A14.txt +45 -0
- package/cli/patterns/fixtures/gt/A15.txt +70 -0
- package/cli/patterns/fixtures/gt/A16.txt +59 -0
- package/cli/patterns/fixtures/gt/A17.txt +29 -0
- package/cli/patterns/fixtures/gt/A18.txt +9 -0
- package/cli/patterns/fixtures/gt/A19.txt +29 -0
- package/cli/patterns/fixtures/gt/A2.txt +28 -0
- package/cli/patterns/fixtures/gt/A20.txt +83 -0
- package/cli/patterns/fixtures/gt/A21.txt +138 -0
- package/cli/patterns/fixtures/gt/A22.txt +32 -0
- package/cli/patterns/fixtures/gt/A23.txt +37 -0
- package/cli/patterns/fixtures/gt/A24.txt +67 -0
- package/cli/patterns/fixtures/gt/A25.txt +41 -0
- package/cli/patterns/fixtures/gt/A26.txt +29 -0
- package/cli/patterns/fixtures/gt/A3.txt +17 -0
- package/cli/patterns/fixtures/gt/A4.txt +44 -0
- package/cli/patterns/fixtures/gt/A5.txt +32 -0
- package/cli/patterns/fixtures/gt/A6.txt +15 -0
- package/cli/patterns/fixtures/gt/A7.txt +79 -0
- package/cli/patterns/fixtures/gt/A8.txt +41 -0
- package/cli/patterns/fixtures/gt/A9.txt +42 -0
- package/cli/patterns/fixtures/gt/B1.txt +11 -0
- package/cli/patterns/fixtures/gt/B10.txt +41 -0
- package/cli/patterns/fixtures/gt/B11.txt +7 -0
- package/cli/patterns/fixtures/gt/B2.txt +19 -0
- package/cli/patterns/fixtures/gt/B3.txt +70 -0
- package/cli/patterns/fixtures/gt/B4.txt +55 -0
- package/cli/patterns/fixtures/gt/B5.txt +21 -0
- package/cli/patterns/fixtures/gt/B6.txt +15 -0
- package/cli/patterns/fixtures/gt/B7.txt +24 -0
- package/cli/patterns/fixtures/gt/B8.txt +40 -0
- package/cli/patterns/fixtures/gt/B9.txt +18 -0
- package/cli/patterns/fixtures/gt/C1.txt +26 -0
- package/cli/patterns/fixtures/gt/C2.txt +33 -0
- package/cli/patterns/fixtures/gt/C3.txt +26 -0
- package/cli/patterns/fixtures/gt/C4.txt +7 -0
- package/cli/patterns/fixtures/gt/C5.txt +29 -0
- package/cli/patterns/fixtures/gt/C6.txt +7 -0
- package/cli/patterns/fixtures/gt/C7.txt +18 -0
- package/cli/patterns/fixtures/gt/labels.json +1837 -0
- package/cli/patterns/gt-build.js +55 -0
- package/cli/patterns/gt-locations.js +76 -0
- package/cli/patterns/gt-resolve.js +66 -0
- package/cli/patterns/gt-score-cli.js +80 -0
- package/cli/patterns/gt-score.js +188 -0
- package/cli/patterns/gt-text.js +79 -0
- package/cli/pillars-wizard.js +53 -24
- package/cli/pillars-write-guard.js +4 -1
- package/cli/postinstall.js +22 -19
- package/cli/project-detector.js +60 -35
- package/cli/project-markers.js +42 -0
- package/cli/project-scope.js +20 -0
- package/cli/read-revision.js +70 -0
- package/cli/reader-cards-gate.js +29 -0
- package/cli/reader-cards.js +153 -0
- package/cli/reader-cli.js +45 -18
- package/cli/reader-format.js +48 -0
- package/cli/reader-logic.js +128 -250
- package/cli/reader.js +211 -170
- package/cli/request-context.js +9 -0
- package/cli/result-status.js +23 -0
- package/cli/rules.js +81 -0
- package/cli/scaffold.js +80 -51
- package/cli/scan-ignore.js +12 -0
- package/cli/search-args.js +102 -0
- package/cli/search-ast-module.js +103 -0
- package/cli/search-ast.js +75 -112
- package/cli/search-commands-blast.js +70 -0
- package/cli/search-commands-graph.js +57 -105
- package/cli/search-commands-hazards.js +105 -0
- package/cli/search-commands-literal.js +102 -0
- package/cli/search-commands-semantic.js +39 -27
- package/cli/search-commands.js +93 -90
- package/cli/search-db.js +52 -243
- package/cli/search-debug.js +13 -0
- package/cli/search-graph-edges.js +112 -0
- package/cli/search-index-meta.js +66 -0
- package/cli/search-index-write.js +153 -0
- package/cli/search-literal-files.js +64 -0
- package/cli/search-literal.js +150 -0
- package/cli/search-output.js +88 -0
- package/cli/search-queries-graph.js +120 -193
- package/cli/search-queries-semantic.js +41 -14
- package/cli/search-queries-similar.js +2 -1
- package/cli/search-queries.js +46 -21
- package/cli/search-query-view.js +67 -0
- package/cli/search-rank.js +54 -0
- package/cli/search-replace-blocks.js +120 -0
- package/cli/search-resolve.js +52 -0
- package/cli/search-root.js +78 -0
- package/cli/search-scan.js +102 -0
- package/cli/search-schema-ddl.js +172 -0
- package/cli/search-schema.js +134 -206
- package/cli/search-session.js +11 -0
- package/cli/search-sync-paths.js +78 -0
- package/cli/search-sync-plan.js +63 -0
- package/cli/search-sync-rows.js +96 -0
- package/cli/search-sync.js +128 -0
- package/cli/search-tokenizer.js +8 -4
- package/cli/search.d.ts +26 -5
- package/cli/search.js +165 -418
- package/cli/sfc/component-resolver.js +96 -0
- package/cli/sfc/import-coverage.js +24 -0
- package/cli/sfc/module-aliases.js +102 -0
- package/cli/sfc/script-asts.js +51 -0
- package/cli/sfc/sfc-metadata.js +104 -0
- package/cli/sfc/sfc-parse.js +101 -0
- package/cli/sfc/svelte-parse.js +46 -0
- package/cli/sfc/template-walk.js +78 -0
- package/cli/sfc-scripts.js +60 -0
- package/cli/share-consent.js +49 -0
- package/cli/share-outcome.js +57 -0
- package/cli/silence-warnings.js +2 -1
- package/cli/source-parse.js +130 -0
- package/cli/spec-isolated-home.js +17 -0
- package/cli/spec-support/import-trace.mjs +22 -0
- package/cli/spec-support/run-cli.js +58 -0
- package/cli/sqlite-memory.js +47 -0
- package/cli/status-command.js +107 -0
- package/cli/symbol-locator.js +121 -0
- package/cli/team/agent-identity.js +58 -0
- package/cli/team/audit-run-adoption.js +117 -0
- package/cli/team/audit-run-bypass.js +177 -0
- package/cli/team/audit-run-calls.js +108 -0
- package/cli/team/audit-run-db.js +181 -0
- package/cli/team/audit-run-identity.js +80 -0
- package/cli/team/audit-run-invocations.js +130 -0
- package/cli/team/audit-run-protocol.js +258 -0
- package/cli/team/audit-run-render.js +107 -0
- package/cli/team/audit-run-shas.js +179 -0
- package/cli/team/audit-run.js +203 -0
- package/cli/team/claim-ignore-deps.js +16 -0
- package/cli/team/coordination-busy.js +164 -0
- package/cli/team/coordination-db.js +85 -0
- package/cli/team/coordination-fixture.js +53 -0
- package/cli/team/coordination-repos.js +72 -0
- package/cli/team/coordination-root.js +161 -0
- package/cli/team/coordination-target.js +114 -0
- package/cli/team/dispatch-templates/dispatch-v1.js +228 -0
- package/cli/team/edit-shas.js +45 -0
- package/cli/team/lease-activity.js +130 -0
- package/cli/team/lease-cap.js +67 -0
- package/cli/team/lease-contention.js +30 -0
- package/cli/team/lease-key.js +46 -0
- package/cli/team/lease-lapse.js +83 -0
- package/cli/team/lease-reacquire.js +99 -0
- package/cli/team/lease-renew.js +97 -0
- package/cli/team/lease-roots.js +30 -0
- package/cli/team/lease-waiter-notice.js +48 -0
- package/cli/team/staged-leases.js +64 -0
- package/cli/team/task-completion-output.js +78 -0
- package/cli/team/task-detail-sections.js +86 -0
- package/cli/team/task-list-view.js +10 -1
- package/cli/team/task-ref.js +73 -0
- package/cli/team/task-target.js +53 -0
- package/cli/team/task-tier.js +17 -0
- package/cli/team/team-brief.js +78 -0
- package/cli/team/team-commands-board.js +118 -0
- package/cli/team/team-commands-dispatch.js +85 -0
- package/cli/team/team-commands-lock-staged.js +87 -0
- package/cli/team/team-commands-lock-views.js +144 -0
- package/cli/team/team-commands-lock.js +115 -26
- package/cli/team/team-commands-migrate.js +171 -0
- package/cli/team/team-commands-profile.js +44 -0
- package/cli/team/team-commands-repo.js +114 -0
- package/cli/team/team-commands-task.js +312 -0
- package/cli/team/team-commands-tokens.js +57 -0
- package/cli/team/team-commands-triage.js +43 -0
- package/cli/team/team-commands-vds.js +2 -1
- package/cli/team/team-commands.js +108 -463
- package/cli/team/team-db-agents.js +12 -6
- package/cli/team/team-db-feed.js +25 -13
- package/cli/team/team-db-lock-promotion.js +95 -51
- package/cli/team/team-db-locks.js +167 -35
- package/cli/team/team-db-mailbox.js +15 -8
- package/cli/team/team-db-readonly.js +76 -0
- package/cli/team/team-db-task-helpers.js +68 -19
- package/cli/team/team-db-tasks.js +21 -9
- package/cli/team/team-db-transaction.js +20 -5
- package/cli/team/team-db.js +11 -4
- package/cli/team/team-dispatch-batches.js +271 -0
- package/cli/team/team-dispatch-prompts.js +152 -0
- package/cli/team/team-dispatch-render.js +154 -0
- package/cli/team/team-dispatch-run-cli.js +154 -0
- package/cli/team/team-dispatch-runs.js +155 -0
- package/cli/team/team-dispatch-script.js +67 -0
- package/cli/team/team-dispatch-select.js +220 -0
- package/cli/team/team-dispatch-v2-fixture.js +62 -0
- package/cli/team/team-dispatch-v2.js +207 -0
- package/cli/team/team-dispatch.js +229 -0
- package/cli/team/team-dispatcher-authority.js +43 -0
- package/cli/team/team-flags.js +222 -48
- package/cli/team/team-format.js +80 -26
- package/cli/team/team-handoff-hint.js +9 -0
- package/cli/team/team-migrate-agents.js +52 -0
- package/cli/team/team-migrate-apply.js +178 -0
- package/cli/team/team-migrate-junk.js +55 -0
- package/cli/team/team-migrate-metadata.js +80 -0
- package/cli/team/team-migrate-paths.js +50 -0
- package/cli/team/team-migrate-plan.js +85 -0
- package/cli/team/team-migrate-report.js +89 -0
- package/cli/team/team-migrate-tables.js +85 -0
- package/cli/team/team-migrate.js +193 -0
- package/cli/team/team-needs.js +99 -0
- package/cli/team/team-profile-format.js +126 -0
- package/cli/team/team-profile.js +144 -0
- package/cli/team/team-projects-coordinator.js +54 -33
- package/cli/team/team-projects-format.js +8 -4
- package/cli/team/team-projects-memory.js +6 -3
- package/cli/team/team-projects.js +2 -1
- package/cli/team/team-release-train.js +2 -1
- package/cli/team/team-route.js +132 -0
- package/cli/team/team-schema-repo.js +48 -0
- package/cli/team/team-schema-usage.js +25 -0
- package/cli/team/team-schema-vds.js +7 -3
- package/cli/team/team-schema.js +24 -4
- package/cli/team/team-task-close.js +132 -0
- package/cli/team/team-task-guard.js +24 -0
- package/cli/team/team-task-handoff.js +122 -0
- package/cli/team/team-task-ownership.js +74 -0
- package/cli/team/team-task-rules.js +21 -0
- package/cli/team/team-task-uncommitted.js +49 -0
- package/cli/team/team-telemetry.js +44 -32
- package/cli/team/team-tokens.js +4 -1
- package/cli/team/team-triage-generate.js +212 -0
- package/cli/team/team-triage-log.js +11 -0
- package/cli/team/team-triage-verify.js +153 -0
- package/cli/team/team-triage.js +92 -339
- package/cli/team/team-vds.js +2 -1
- package/cli/team/usage-compute.js +70 -0
- package/cli/team/usage-pricing.js +62 -0
- package/cli/team/usage-reader.js +106 -0
- package/cli/team/usage-render.js +72 -0
- package/cli/team/usage-store.js +56 -0
- package/cli/team/usage-transcript.js +127 -0
- package/cli/team/write-lock-guard.js +48 -0
- package/cli/telemetry/call-ledger.js +264 -0
- package/cli/telemetry/call-schema.js +53 -0
- package/cli/telemetry/savings-dbs.js +111 -0
- package/cli/telemetry/savings-render.js +68 -0
- package/cli/telemetry/savings-report.js +101 -0
- package/cli/telemetry/savings-routing.js +66 -0
- package/cli/telemetry/savings-tooling.js +140 -0
- package/cli/terminal.js +38 -40
- package/cli/tesseract-manifesto.js +2 -17
- package/cli/tesseract.js +8 -21
- package/cli/test-audit.js +218 -0
- package/cli/test-changes.js +60 -0
- package/cli/test-command.js +201 -0
- package/cli/test-depth.js +43 -0
- package/cli/test-failures.js +170 -0
- package/cli/test-graph-open.js +150 -0
- package/cli/test-graph.js +188 -0
- package/cli/test-lanes.js +117 -0
- package/cli/test-output.js +155 -0
- package/cli/test-paths.js +51 -0
- package/cli/test-profile.js +64 -0
- package/cli/test-report.js +112 -0
- package/cli/test-run.js +53 -0
- package/cli/test-scope.js +55 -0
- package/cli/test-select.js +107 -0
- package/cli/test-slots.js +276 -0
- package/cli/test-workers.js +45 -0
- package/cli/test-workspace.js +83 -0
- package/cli/theme.js +6 -3
- package/cli/timers.js +6 -0
- package/cli/trend.js +10 -5
- package/cli/tsconfig-shape.js +20 -0
- package/cli/tty-banner.js +11 -0
- package/cli/typecheck-audit.js +146 -0
- package/cli/typecheck-command.js +94 -0
- package/cli/typecheck-sandbox.js +93 -0
- package/cli/ui-actions-codebase.js +20 -7
- package/cli/ui-actions-helpers.js +9 -0
- package/cli/ui-actions-studio.js +11 -7
- package/cli/ui-actions-tasks.js +3 -2
- package/cli/ui-actions-vds.js +2 -1
- package/cli/ui-actions.js +4 -2
- package/cli/ui-attention.js +28 -12
- package/cli/ui-auth-hosts.js +46 -0
- package/cli/ui-auth.js +89 -0
- package/cli/ui-client-cert.js +2 -1
- package/cli/ui-client-filetree.js +2 -2
- package/cli/ui-db-studio.js +23 -33
- package/cli/ui-dev-watcher.js +2 -1
- package/cli/ui-forum-data.js +45 -46
- package/cli/ui-forum-topics.js +6 -3
- package/cli/ui-fresh-index.js +11 -0
- package/cli/ui-handlers.js +6 -6
- package/cli/ui-html.js +6 -12
- package/cli/ui-index.html +3 -3
- package/cli/ui-route-helpers.js +10 -0
- package/cli/ui-server-routes.js +15 -17
- package/cli/ui-server.js +49 -50
- package/cli/ui-sql-guard.js +76 -0
- package/cli/ui-sql-mask.js +61 -0
- package/cli/ui-sse.js +5 -4
- package/cli/ui-template-filetree.js +4 -4
- package/cli/ui-template-kanban.js +4 -7
- package/cli/verify-changed.js +43 -0
- package/cli/verify-helpers.js +21 -207
- package/cli/verify-lint.js +54 -20
- package/cli/verify-report.js +117 -0
- package/cli/verify-steps.js +71 -0
- package/cli/verify.js +111 -372
- package/cli/wait-command.js +147 -0
- package/cli/workspace-run.js +153 -0
- package/cli/workspace.js +147 -0
- package/cli/write-append.js +28 -0
- package/library/node-js/is-path-inside/entry.json +57 -0
- package/library/node-js/is-path-inside/negative/path-scope.js.txt +13 -0
- package/library/node-js/is-path-inside/piece.js +15 -0
- package/library/node-js/is-path-inside/piece.spec.js +38 -0
- package/library/node-js/read-json-or/entry.json +70 -0
- package/library/node-js/read-json-or/negative/ratchet.js.txt +14 -0
- package/library/node-js/read-json-or/negative/workspace.js.txt +8 -0
- package/library/node-js/read-json-or/piece.js +17 -0
- package/library/node-js/read-json-or/piece.spec.js +36 -0
- package/library/vue-ts/nullable-timer-handle/ambient.d.ts +5 -0
- package/library/vue-ts/nullable-timer-handle/entry.json +84 -0
- package/library/vue-ts/nullable-timer-handle/negative/const-alias.ts.txt +17 -0
- package/library/vue-ts/nullable-timer-handle/negative/inline-guard.ts.txt +15 -0
- package/library/vue-ts/nullable-timer-handle/piece.spec.js +48 -0
- package/library/vue-ts/nullable-timer-handle/piece.ts +41 -0
- package/package.json +10 -3
- package/scripts/check-framework-generation.mjs +32 -12
- package/scripts/direct-run.mjs +9 -0
- package/scripts/pre-commit.sh +48 -74
- package/scripts/publish-both.mjs +24 -16
- package/scripts/publish-summary.mjs +14 -0
- package/scripts/postinstall.mjs +0 -27
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chemical X Protocol: read-only access to a project's team tables.
|
|
3
|
+
* Briefs and profiles open .chemx/index.db read-only (the edit-locks.js readLeases pattern), so a
|
|
4
|
+
* read never creates, migrates or cleans a database. Missing tables or columns read as empty.
|
|
5
|
+
* Both openers refuse what coordination-root.js refuses (#2581): a db at the temp dir or the
|
|
6
|
+
* filesystem root, and any db outside the temp dir from a spec process. A refused open is null.
|
|
7
|
+
*/
|
|
8
|
+
import '../silence-warnings.js';
|
|
9
|
+
import fs from 'node:fs';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import { teamDbRefusal } from './coordination-root.js';
|
|
12
|
+
|
|
13
|
+
const loadSqlite = async () => {
|
|
14
|
+
try {
|
|
15
|
+
return (await import('node:sqlite')).DatabaseSync;
|
|
16
|
+
} catch (err) {
|
|
17
|
+
const isDebug = Boolean(process.env.CHEMX_DEBUG);
|
|
18
|
+
if (isDebug) process.stderr.write(`[team-db-readonly] node:sqlite unavailable: ${err.message}\n`);
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const DatabaseSync = await loadSqlite();
|
|
23
|
+
|
|
24
|
+
export const teamDbPath = (root) => path.join(root, '.chemx', 'index.db');
|
|
25
|
+
|
|
26
|
+
const mayOpen = (root, dbPath) => Boolean(DatabaseSync) && !teamDbRefusal(root) && fs.existsSync(dbPath);
|
|
27
|
+
|
|
28
|
+
/** @returns {import('node:sqlite').DatabaseSync | null} null when sqlite or the db file is missing, or the open is refused. */
|
|
29
|
+
export const openTeamDbReadOnly = (root) => {
|
|
30
|
+
const dbPath = teamDbPath(root);
|
|
31
|
+
const canOpen = mayOpen(root, dbPath);
|
|
32
|
+
if (!canOpen) return null;
|
|
33
|
+
try {
|
|
34
|
+
return new DatabaseSync(dbPath, { readOnly: true });
|
|
35
|
+
} catch (err) {
|
|
36
|
+
const isDebug = Boolean(process.env.CHEMX_DEBUG);
|
|
37
|
+
if (isDebug) process.stderr.write(`[team-db-readonly] open skipped: ${err.message}\n`);
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// Writable open of an EXISTING db only (never creates one); for cheap presence writes from hooks.
|
|
43
|
+
export const openExistingTeamDb = (root) => {
|
|
44
|
+
const dbPath = teamDbPath(root);
|
|
45
|
+
const canOpen = mayOpen(root, dbPath);
|
|
46
|
+
if (!canOpen) return null;
|
|
47
|
+
try {
|
|
48
|
+
const db = new DatabaseSync(dbPath);
|
|
49
|
+
db.exec('PRAGMA busy_timeout = 500');
|
|
50
|
+
return db;
|
|
51
|
+
} catch (err) {
|
|
52
|
+
const isDebug = Boolean(process.env.CHEMX_DEBUG);
|
|
53
|
+
if (isDebug) process.stderr.write(`[team-db-readonly] writable open skipped: ${err.message}\n`);
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export const closeQuietly = (db) => {
|
|
59
|
+
try {
|
|
60
|
+
const isOpen = Boolean(db?.isOpen);
|
|
61
|
+
if (isOpen) db.close();
|
|
62
|
+
} catch {
|
|
63
|
+
// chemx-allow: best-effort closing a finished handle cannot lose data
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/** Runs a read query; a missing table or column returns [] instead of throwing. */
|
|
68
|
+
export const safeAll = (db, sql, params = []) => {
|
|
69
|
+
try {
|
|
70
|
+
return db.prepare(sql).all(...params);
|
|
71
|
+
} catch {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export const safeGet = (db, sql, params = []) => safeAll(db, sql, params)[0] ?? null;
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { parseNeedsInput } from './team-needs.js';
|
|
2
|
+
import { buildHandoffHint } from './team-handoff-hint.js';
|
|
3
|
+
|
|
1
4
|
export const normalizeAgentId = (id) => {
|
|
2
5
|
if (!id) return null;
|
|
3
6
|
return id.startsWith('@') ? id : `@${id}`;
|
|
@@ -17,6 +20,7 @@ export const parseTaskRow = (row) => {
|
|
|
17
20
|
vds_status: row.vds_status || 'ready',
|
|
18
21
|
task_url: row.task_url || '',
|
|
19
22
|
sprint_tag: row.sprint_tag || '',
|
|
23
|
+
needs: row.needs ?? null,
|
|
20
24
|
dependencies: parseJson(row.dependencies, []),
|
|
21
25
|
result_payload: parseJson(row.result_payload, {}),
|
|
22
26
|
violation_snapshot: parseJson(row.violation_snapshot, {}),
|
|
@@ -24,6 +28,9 @@ export const parseTaskRow = (row) => {
|
|
|
24
28
|
};
|
|
25
29
|
};
|
|
26
30
|
|
|
31
|
+
// Terminal states that satisfy a dependency: done, plus tasks closed as duplicate or cancelled (#2575).
|
|
32
|
+
const SATISFIED_DEPENDENCY_STATUSES = ['done', 'duplicate', 'cancelled'];
|
|
33
|
+
|
|
27
34
|
export const checkDependenciesMet = (db, taskId, getTask) => {
|
|
28
35
|
const task = getTask(db, taskId);
|
|
29
36
|
if (!task) return true;
|
|
@@ -31,18 +38,28 @@ export const checkDependenciesMet = (db, taskId, getTask) => {
|
|
|
31
38
|
if (!hasDeps) return true;
|
|
32
39
|
|
|
33
40
|
const placeholders = task.dependencies.map(() => '?').join(',');
|
|
34
|
-
const query = `SELECT COUNT(*) as unfinished FROM agent_tasks WHERE id IN (${placeholders}) AND status
|
|
41
|
+
const query = `SELECT COUNT(*) as unfinished FROM agent_tasks WHERE id IN (${placeholders}) AND status NOT IN (${SATISFIED_DEPENDENCY_STATUSES.map((s) => `'${s}'`).join(',')})`;
|
|
35
42
|
const res = db.prepare(query).get(...task.dependencies);
|
|
36
43
|
return Number(res?.unfinished || 0) === 0;
|
|
37
44
|
};
|
|
38
45
|
|
|
39
|
-
|
|
46
|
+
// Records why unmet dependencies were bypassed, on the task's result_payload (#2589).
|
|
47
|
+
export const recordDepsOverride = (db, task, cleanId, reason) => {
|
|
48
|
+
const payload = { ...(task.result_payload || {}), deps_override: { by: cleanId, reason, unmet: task.dependencies, at: Date.now() } };
|
|
49
|
+
db.prepare('UPDATE agent_tasks SET result_payload = ? WHERE id = ?').run(JSON.stringify(payload), Number(task.id));
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// ignoreDepsReason: a non-empty string bypasses the dependency check only; a claim held by another handle is still refused.
|
|
53
|
+
export const evaluateClaim = (task, cleanId, isDepsMet, ignoreDepsReason = '') => {
|
|
40
54
|
if (!task) return { allowed: false, reason: 'task_not_found' };
|
|
41
55
|
const isClaimedByOther = task.status === 'in_progress' && Boolean(task.assigned_agent_id) && task.assigned_agent_id !== cleanId;
|
|
42
56
|
if (isClaimedByOther) {
|
|
43
|
-
|
|
57
|
+
const message = `Task #${task.id} is already claimed by ${task.assigned_agent_id}; ${buildHandoffHint(task.id, task.assigned_agent_id, cleanId)}`;
|
|
58
|
+
return { allowed: false, reason: 'already_claimed', claimedBy: task.assigned_agent_id, message };
|
|
44
59
|
}
|
|
45
|
-
|
|
60
|
+
const isOverridden = typeof ignoreDepsReason === 'string' && ignoreDepsReason.trim() !== '';
|
|
61
|
+
const isBlockedByDeps = !isDepsMet && !isOverridden;
|
|
62
|
+
if (isBlockedByDeps) {
|
|
46
63
|
return { allowed: false, reason: 'dependencies_unmet', dependencies: task.dependencies };
|
|
47
64
|
}
|
|
48
65
|
return { allowed: true };
|
|
@@ -58,12 +75,17 @@ export const executeTaskClaim = (db, taskId, cleanId) => {
|
|
|
58
75
|
|
|
59
76
|
export const executeStatusUpdate = (db, taskId, status, options, task) => {
|
|
60
77
|
const now = Date.now();
|
|
61
|
-
|
|
78
|
+
// A replacing resultPayload must not drop the deps_override record (#2589).
|
|
79
|
+
const keptOverride = task.result_payload?.deps_override;
|
|
80
|
+
const basePayload = options.resultPayload || task.result_payload || {};
|
|
81
|
+
const mergedPayload = keptOverride && !basePayload.deps_override ? { ...basePayload, deps_override: keptOverride } : basePayload;
|
|
82
|
+
const payloadStr = JSON.stringify(mergedPayload);
|
|
62
83
|
const receiptObj = options.diffReceipt || options.resultPayload?.receipt || task.diff_receipt || {};
|
|
63
84
|
db.prepare('UPDATE agent_tasks SET status = ?, blocked_reason = ?, result_payload = ?, diff_receipt = ?, updated_at = ? WHERE id = ?')
|
|
64
85
|
.run(status, options.blockedReason || '', payloadStr, JSON.stringify(receiptObj), now, Number(taskId));
|
|
65
86
|
|
|
66
|
-
|
|
87
|
+
const shouldReleaseAgent = Boolean(['done', 'failed', 'queued'].includes(status) && task.assigned_agent_id);
|
|
88
|
+
if (shouldReleaseAgent) {
|
|
67
89
|
db.prepare('UPDATE agents SET current_task_id = NULL, status = ? WHERE id = ?')
|
|
68
90
|
.run('idle', task.assigned_agent_id);
|
|
69
91
|
}
|
|
@@ -73,15 +95,18 @@ export const buildTaskListQuery = (filter = {}) => {
|
|
|
73
95
|
let query = 'SELECT * FROM agent_tasks';
|
|
74
96
|
const conditions = [];
|
|
75
97
|
const params = [];
|
|
76
|
-
|
|
98
|
+
const hasStatusFilter = Boolean(filter.status);
|
|
99
|
+
if (hasStatusFilter) {
|
|
77
100
|
conditions.push('status = ?');
|
|
78
101
|
params.push(filter.status);
|
|
79
102
|
}
|
|
80
|
-
|
|
103
|
+
const hasAgentFilter = Boolean(filter.assigned_agent_id);
|
|
104
|
+
if (hasAgentFilter) {
|
|
81
105
|
conditions.push('assigned_agent_id = ?');
|
|
82
106
|
params.push(normalizeAgentId(filter.assigned_agent_id));
|
|
83
107
|
}
|
|
84
|
-
|
|
108
|
+
const hasTargetPathFilter = Boolean(filter.target_path);
|
|
109
|
+
if (hasTargetPathFilter) {
|
|
85
110
|
conditions.push('target_path = ?');
|
|
86
111
|
params.push(filter.target_path);
|
|
87
112
|
}
|
|
@@ -106,25 +131,48 @@ export const buildTaskListQuery = (filter = {}) => {
|
|
|
106
131
|
conditions.push('priority = ?');
|
|
107
132
|
params.push(Number(filter.priority));
|
|
108
133
|
}
|
|
109
|
-
|
|
134
|
+
const hasMoscowFilter = Boolean(filter.moscow);
|
|
135
|
+
if (hasMoscowFilter) {
|
|
110
136
|
conditions.push('moscow = ?');
|
|
111
137
|
params.push(filter.moscow);
|
|
112
138
|
}
|
|
113
|
-
|
|
139
|
+
const hasVdsPriorityFilter = Boolean(filter.vds_priority);
|
|
140
|
+
if (hasVdsPriorityFilter) {
|
|
114
141
|
conditions.push('vds_priority = ?');
|
|
115
142
|
params.push(filter.vds_priority);
|
|
116
143
|
}
|
|
117
|
-
|
|
144
|
+
const needsFilter = parseNeedsInput(filter.needs);
|
|
145
|
+
const hasNeedsFilter = needsFilter !== null;
|
|
146
|
+
if (hasNeedsFilter) {
|
|
147
|
+
conditions.push('needs = ?');
|
|
148
|
+
params.push(needsFilter);
|
|
149
|
+
}
|
|
150
|
+
// repo: one owning package ('.' = the coordination root); absent means every repo.
|
|
151
|
+
const hasRepoFilter = typeof filter.repo === 'string' && filter.repo !== '';
|
|
152
|
+
if (hasRepoFilter) {
|
|
153
|
+
conditions.push('repo = ?');
|
|
154
|
+
params.push(filter.repo);
|
|
155
|
+
}
|
|
156
|
+
const hasSprintTagFilter = Boolean(filter.sprint_tag);
|
|
157
|
+
if (hasSprintTagFilter) {
|
|
118
158
|
conditions.push('sprint_tag = ?');
|
|
119
159
|
params.push(filter.sprint_tag);
|
|
120
160
|
}
|
|
121
|
-
|
|
161
|
+
const hasConditions = conditions.length > 0;
|
|
162
|
+
if (hasConditions) query += ` WHERE ${conditions.join(' AND ')}`;
|
|
122
163
|
query += ' ORDER BY priority ASC, id ASC';
|
|
123
164
|
return { query, params };
|
|
124
165
|
};
|
|
125
166
|
|
|
126
|
-
|
|
167
|
+
// options.schema names where agent_tasks lives on this connection ('main', or an ATTACHed team db);
|
|
168
|
+
// options.repo limits the open-task match to one repo; options.insideOnly skips ../ and absolute paths.
|
|
169
|
+
export const queryUnassignedHazards = (db, options = {}) => {
|
|
127
170
|
if (!db) return [];
|
|
171
|
+
const tasks = `${options.schema || 'main'}.agent_tasks`;
|
|
172
|
+
const hasRepo = typeof options.repo === 'string';
|
|
173
|
+
const repoClause = hasRepo ? 'AND t.repo = ?' : '';
|
|
174
|
+
const vInside = options.insideOnly ? "AND v.file_path NOT LIKE '../%' AND substr(v.file_path, 1, 1) != '/'" : '';
|
|
175
|
+
const fInside = options.insideOnly ? "AND f.path NOT LIKE '../%' AND substr(f.path, 1, 1) != '/'" : '';
|
|
128
176
|
const query = `
|
|
129
177
|
SELECT
|
|
130
178
|
COALESCE(v.file_path, f.path) as path,
|
|
@@ -136,8 +184,8 @@ export const queryUnassignedHazards = (db) => {
|
|
|
136
184
|
GROUP_CONCAT(DISTINCT v.rule) as rules_summary
|
|
137
185
|
FROM violations v
|
|
138
186
|
LEFT JOIN files f ON f.path = v.file_path
|
|
139
|
-
LEFT JOIN
|
|
140
|
-
WHERE t.id IS NULL
|
|
187
|
+
LEFT JOIN ${tasks} t ON t.target_path = v.file_path AND t.status IN ('queued', 'in_progress', 'review') ${repoClause}
|
|
188
|
+
WHERE t.id IS NULL ${vInside}
|
|
141
189
|
GROUP BY v.file_path
|
|
142
190
|
UNION
|
|
143
191
|
SELECT
|
|
@@ -149,15 +197,16 @@ export const queryUnassignedHazards = (db) => {
|
|
|
149
197
|
f.hazard_count as violation_count,
|
|
150
198
|
'ARCHITECTURAL_HAZARD' as rules_summary
|
|
151
199
|
FROM files f
|
|
152
|
-
LEFT JOIN
|
|
200
|
+
LEFT JOIN ${tasks} t ON t.target_path = f.path AND t.status IN ('queued', 'in_progress', 'review') ${repoClause}
|
|
153
201
|
WHERE (f.health_score < 90 OR f.hazard_count > 0)
|
|
154
|
-
AND t.id IS NULL
|
|
202
|
+
AND t.id IS NULL ${fInside}
|
|
155
203
|
AND f.path NOT IN (SELECT file_path FROM violations)
|
|
156
204
|
GROUP BY f.path
|
|
157
205
|
ORDER BY health_score ASC, hazard_count DESC
|
|
158
206
|
`;
|
|
207
|
+
const params = hasRepo ? [options.repo, options.repo] : [];
|
|
159
208
|
try {
|
|
160
|
-
return db.prepare(query).all();
|
|
209
|
+
return db.prepare(query).all(...params);
|
|
161
210
|
} catch {
|
|
162
211
|
return [];
|
|
163
212
|
}
|
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
import {
|
|
7
7
|
normalizeAgentId, parseTaskRow, checkDependenciesMet,
|
|
8
|
-
evaluateClaim, executeStatusUpdate, buildTaskListQuery
|
|
8
|
+
evaluateClaim, executeStatusUpdate, buildTaskListQuery, recordDepsOverride
|
|
9
9
|
} from './team-db-task-helpers.js';
|
|
10
10
|
import { withImmediateTransaction } from './team-db-transaction.js';
|
|
11
11
|
import { generateTaskPermalink } from './team-vds.js';
|
|
12
|
+
import { parseNeedsInput } from './team-needs.js';
|
|
12
13
|
|
|
13
14
|
export const getTask = (db, taskId) => {
|
|
14
15
|
const canGet = Boolean(db) && Boolean(taskId);
|
|
@@ -23,12 +24,13 @@ export const createTask = (db, taskData) => {
|
|
|
23
24
|
const canCreate = Boolean(db) && Boolean(taskData?.title);
|
|
24
25
|
if (!canCreate) return null;
|
|
25
26
|
|
|
27
|
+
const needs = parseNeedsInput(taskData.needs);
|
|
26
28
|
const now = Date.now();
|
|
27
29
|
const sql = `INSERT INTO agent_tasks (
|
|
28
30
|
title, description, tier, target_path, target_symbol, status, priority, assigned_agent_id,
|
|
29
31
|
blocked_reason, parent_id, dependencies, created_at, updated_at, result_payload, origin_type,
|
|
30
|
-
rule_id, violation_snapshot, diff_receipt, moscow, vds_priority, vds_phase, vds_status, task_url, sprint_tag
|
|
31
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;
|
|
32
|
+
rule_id, violation_snapshot, diff_receipt, moscow, vds_priority, vds_phase, vds_status, task_url, sprint_tag, needs, repo, extra_files
|
|
33
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;
|
|
32
34
|
const info = db.prepare(sql).run(
|
|
33
35
|
taskData.title, taskData.description || '', taskData.tier || '',
|
|
34
36
|
taskData.target_path || null, taskData.target_symbol || '', taskData.status || 'queued',
|
|
@@ -41,16 +43,19 @@ export const createTask = (db, taskData) => {
|
|
|
41
43
|
JSON.stringify(taskData.diff_receipt || {}),
|
|
42
44
|
taskData.moscow || 'must', taskData.vds_priority || 'medium',
|
|
43
45
|
taskData.vds_phase || 'planning', taskData.vds_status || 'ready',
|
|
44
|
-
taskData.task_url || '', taskData.sprint_tag || ''
|
|
46
|
+
taskData.task_url || '', taskData.sprint_tag || '', needs, taskData.repo || '.',
|
|
47
|
+
JSON.stringify(Array.isArray(taskData.extra_files) ? taskData.extra_files : [])
|
|
45
48
|
);
|
|
46
49
|
const createdId = info.lastInsertRowid;
|
|
47
|
-
|
|
50
|
+
const isTaskUrlMissing = !taskData.task_url;
|
|
51
|
+
if (isTaskUrlMissing) {
|
|
48
52
|
db.prepare('UPDATE agent_tasks SET task_url = ? WHERE id = ?').run(generateTaskPermalink(createdId), createdId);
|
|
49
53
|
}
|
|
50
54
|
return getTask(db, createdId);
|
|
51
55
|
};
|
|
52
56
|
|
|
53
|
-
|
|
57
|
+
// options.ignoreDeps: a reason string; claims despite unmet dependencies and records the reason on the task.
|
|
58
|
+
export const claimTask = (db, taskId, agentId, options = {}) => {
|
|
54
59
|
const canClaim = Boolean(db) && Boolean(taskId) && Boolean(agentId);
|
|
55
60
|
if (!canClaim) return { success: false, reason: 'missing_args' };
|
|
56
61
|
|
|
@@ -58,8 +63,9 @@ export const claimTask = (db, taskId, agentId) => {
|
|
|
58
63
|
return withImmediateTransaction(db, () => {
|
|
59
64
|
const task = getTask(db, taskId);
|
|
60
65
|
const depsMet = areTaskDependenciesMet(db, taskId);
|
|
61
|
-
const claimCheck = evaluateClaim(task, cleanId, depsMet);
|
|
62
|
-
|
|
66
|
+
const claimCheck = evaluateClaim(task, cleanId, depsMet, options.ignoreDeps);
|
|
67
|
+
const isClaimDenied = !claimCheck.allowed;
|
|
68
|
+
if (isClaimDenied) {
|
|
63
69
|
const { allowed, ...failDetails } = claimCheck;
|
|
64
70
|
return { success: false, ...failDetails };
|
|
65
71
|
}
|
|
@@ -67,8 +73,11 @@ export const claimTask = (db, taskId, agentId) => {
|
|
|
67
73
|
const now = Date.now();
|
|
68
74
|
const sql = "UPDATE agent_tasks SET assigned_agent_id = ?, status = 'in_progress', updated_at = ? WHERE id = ? AND status = 'queued' AND (assigned_agent_id IS NULL OR assigned_agent_id = ?);";
|
|
69
75
|
const info = db.prepare(sql).run(cleanId, now, Number(taskId), cleanId);
|
|
70
|
-
|
|
76
|
+
const isAlreadyClaimed = info.changes !== 1;
|
|
77
|
+
if (isAlreadyClaimed) return { success: false, reason: 'already_claimed' };
|
|
71
78
|
db.prepare("UPDATE agents SET current_task_id = ?, status = 'busy' WHERE id = ?").run(Number(taskId), cleanId);
|
|
79
|
+
const wasOverridden = !depsMet;
|
|
80
|
+
if (wasOverridden) recordDepsOverride(db, task, cleanId, String(options.ignoreDeps).trim());
|
|
72
81
|
return { success: true, task: getTask(db, taskId) };
|
|
73
82
|
});
|
|
74
83
|
};
|
|
@@ -80,6 +89,9 @@ export const updateTaskStatus = (db, taskId, status, options = {}) => {
|
|
|
80
89
|
return withImmediateTransaction(db, () => {
|
|
81
90
|
const task = getTask(db, taskId);
|
|
82
91
|
if (!task) return null;
|
|
92
|
+
// options.guard re-checks preconditions on the locked row; a returned value aborts the write.
|
|
93
|
+
const veto = typeof options.guard === 'function' ? options.guard(task) : null;
|
|
94
|
+
if (veto) return veto;
|
|
83
95
|
executeStatusUpdate(db, taskId, status, options, task);
|
|
84
96
|
return getTask(db, taskId);
|
|
85
97
|
});
|
|
@@ -10,6 +10,24 @@ export const isPidAlive = (pid) => {
|
|
|
10
10
|
}
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
+
const SQLITE_BUSY = 5;
|
|
14
|
+
const SQLITE_LOCKED = 6;
|
|
15
|
+
const BUSY_CODES = new Set(['SQLITE_BUSY', 'SQLITE_LOCKED']);
|
|
16
|
+
|
|
17
|
+
// node:sqlite reports contention as { code: 'ERR_SQLITE_ERROR', errcode: 5, message: 'database is locked' };
|
|
18
|
+
// errcode may be an extended code (517 BUSY_SNAPSHOT, 261 BUSY_RECOVERY), so compare the primary byte.
|
|
19
|
+
export const isSqliteBusyError = (err) => {
|
|
20
|
+
const hasError = Boolean(err);
|
|
21
|
+
if (!hasError) return false;
|
|
22
|
+
const primaryCode = typeof err.errcode === 'number' ? err.errcode & 0xff : null;
|
|
23
|
+
const isBusyCode = primaryCode === SQLITE_BUSY || primaryCode === SQLITE_LOCKED || BUSY_CODES.has(err.code);
|
|
24
|
+
return isBusyCode || /database is locked|database is busy|SQLITE_BUSY/i.test(String(err.message || ''));
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const sleepSync = (ms) => {
|
|
28
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
29
|
+
};
|
|
30
|
+
|
|
13
31
|
export const withImmediateTransaction = (db, callback, maxRetries = 5) => {
|
|
14
32
|
const hasDb = Boolean(db);
|
|
15
33
|
const isFunction = typeof callback === 'function';
|
|
@@ -36,14 +54,11 @@ export const withImmediateTransaction = (db, callback, maxRetries = 5) => {
|
|
|
36
54
|
process.stderr.write(`[SWARM] Transaction rollback failed: ${rollbackNotice}\n`);
|
|
37
55
|
}
|
|
38
56
|
}
|
|
39
|
-
const isSqliteBusy = err && (err.code === 'SQLITE_BUSY' || String(err.message).includes('busy'));
|
|
40
57
|
const hasRetriesLeft = attempts < maxRetries;
|
|
41
|
-
const canRetry =
|
|
58
|
+
const canRetry = isSqliteBusyError(err) && hasRetriesLeft;
|
|
42
59
|
|
|
43
60
|
if (canRetry) {
|
|
44
|
-
|
|
45
|
-
const start = Date.now();
|
|
46
|
-
while (Date.now() - start < sleepMs) {}
|
|
61
|
+
sleepSync(Math.floor(10 * attempts + Math.random() * 20 * attempts));
|
|
47
62
|
continue;
|
|
48
63
|
}
|
|
49
64
|
throw err;
|
package/cli/team/team-db.js
CHANGED
|
@@ -32,12 +32,14 @@ export {
|
|
|
32
32
|
promoteNextWaiter
|
|
33
33
|
} from './team-db-locks.js';
|
|
34
34
|
|
|
35
|
-
import {
|
|
35
|
+
import { describeLease } from './team-db-locks.js';
|
|
36
36
|
import { queryFeed } from './team-db-feed.js';
|
|
37
37
|
|
|
38
|
+
const RECENT_FEED_LIMIT = 4;
|
|
39
|
+
|
|
40
|
+
// Read-only: dashboards and SSE refreshes never delete leases (see cleanExpiredLeases for the write path).
|
|
38
41
|
export const getSwarmStatus = (db) => {
|
|
39
42
|
if (!db) return null;
|
|
40
|
-
cleanExpiredLeases(db);
|
|
41
43
|
|
|
42
44
|
const agents = db.prepare('SELECT status, COUNT(*) as count FROM agents GROUP BY status').all();
|
|
43
45
|
const agentSummary = { total: 0, idle: 0, busy: 0, offline: 0 };
|
|
@@ -53,7 +55,9 @@ export const getSwarmStatus = (db) => {
|
|
|
53
55
|
taskSummary.total += t.count;
|
|
54
56
|
}
|
|
55
57
|
|
|
56
|
-
const
|
|
58
|
+
const leaseStates = db.prepare('SELECT file_path, locked_by, expires_at, pid FROM file_leases').all().map((lease) => describeLease(lease));
|
|
59
|
+
const activeLocks = leaseStates.filter((lease) => lease.active).map(({ file_path, locked_by, expires_at }) => ({ file_path, locked_by, expires_at }));
|
|
60
|
+
const expiredLocks = leaseStates.length - activeLocks.length;
|
|
57
61
|
const waitingLocks = db.prepare("SELECT COUNT(*) as count FROM file_lock_queue WHERE status = 'waiting'").get();
|
|
58
62
|
|
|
59
63
|
const blockedTasks = db.prepare(`
|
|
@@ -75,13 +79,16 @@ export const getSwarmStatus = (db) => {
|
|
|
75
79
|
cost_usd: Number(Number(tokenRow.cost).toFixed(6))
|
|
76
80
|
};
|
|
77
81
|
|
|
78
|
-
|
|
82
|
+
// Latest mode: the newest rows in chronological order. Four matches what the status card prints
|
|
83
|
+
// (formatSwarmStatusCard takes slice(0, 4)), so the card never drops the newest event.
|
|
84
|
+
const recentFeed = queryFeed(db, { limit: RECENT_FEED_LIMIT });
|
|
79
85
|
|
|
80
86
|
return {
|
|
81
87
|
agents: agentSummary,
|
|
82
88
|
tasks: taskSummary,
|
|
83
89
|
locks: {
|
|
84
90
|
active: activeLocks.length,
|
|
91
|
+
expired: expiredLocks,
|
|
85
92
|
waiting: waitingLocks?.count || 0,
|
|
86
93
|
leases: activeLocks
|
|
87
94
|
},
|