@cleocode/core 2026.3.58 → 2026.3.59
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/agents/agent-registry.d.ts +206 -0
- package/dist/agents/agent-registry.d.ts.map +1 -0
- package/dist/agents/health-monitor.d.ts +161 -0
- package/dist/agents/health-monitor.d.ts.map +1 -0
- package/dist/agents/index.d.ts +3 -1
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/retry.d.ts +57 -4
- package/dist/agents/retry.d.ts.map +1 -1
- package/dist/backfill/index.d.ts +27 -0
- package/dist/backfill/index.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +880 -506
- package/dist/index.js.map +4 -4
- package/dist/intelligence/impact.d.ts +34 -1
- package/dist/intelligence/impact.d.ts.map +1 -1
- package/dist/intelligence/index.d.ts +2 -2
- package/dist/intelligence/index.d.ts.map +1 -1
- package/dist/intelligence/types.d.ts +60 -0
- package/dist/intelligence/types.d.ts.map +1 -1
- package/dist/internal.d.ts +5 -4
- package/dist/internal.d.ts.map +1 -1
- package/dist/lib/index.d.ts +10 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/retry.d.ts +128 -0
- package/dist/lib/retry.d.ts.map +1 -0
- package/dist/nexus/sharing/index.d.ts +48 -2
- package/dist/nexus/sharing/index.d.ts.map +1 -1
- package/dist/stats/workflow-telemetry.d.ts +15 -0
- package/dist/stats/workflow-telemetry.d.ts.map +1 -1
- package/dist/store/cross-db-cleanup.d.ts +35 -0
- package/dist/store/cross-db-cleanup.d.ts.map +1 -1
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/enforcement.d.ts.map +1 -1
- package/dist/tasks/epic-enforcement.d.ts +61 -0
- package/dist/tasks/epic-enforcement.d.ts.map +1 -1
- package/dist/tasks/pipeline-stage.d.ts +70 -1
- package/dist/tasks/pipeline-stage.d.ts.map +1 -1
- package/package.json +5 -5
- package/schemas/config.schema.json +37 -1547
- package/src/__tests__/sharing.test.ts +24 -0
- package/src/agents/__tests__/agent-registry.test.ts +351 -0
- package/src/agents/__tests__/health-monitor.test.ts +332 -0
- package/src/agents/agent-registry.ts +394 -0
- package/src/agents/health-monitor.ts +279 -0
- package/src/agents/index.ts +24 -1
- package/src/agents/retry.ts +57 -4
- package/src/backfill/index.ts +27 -0
- package/src/config.ts +3 -3
- package/src/index.ts +1 -0
- package/src/intelligence/__tests__/impact.test.ts +165 -1
- package/src/intelligence/impact.ts +203 -0
- package/src/intelligence/index.ts +3 -0
- package/src/intelligence/types.ts +76 -0
- package/src/internal.ts +20 -0
- package/src/lib/__tests__/retry.test.ts +321 -0
- package/src/lib/index.ts +16 -0
- package/src/lib/retry.ts +224 -0
- package/src/nexus/sharing/index.ts +142 -2
- package/src/stats/workflow-telemetry.ts +15 -0
- package/src/store/__tests__/session-store.test.ts +43 -7
- package/src/store/__tests__/task-store.test.ts +1 -1
- package/src/store/__tests__/test-db-helper.ts +7 -3
- package/src/store/cross-db-cleanup.ts +35 -0
- package/src/tasks/__tests__/epic-enforcement.test.ts +9 -4
- package/src/tasks/__tests__/minimal-test.test.ts +2 -2
- package/src/tasks/__tests__/update.test.ts +25 -25
- package/src/tasks/complete.ts +11 -6
- package/src/tasks/enforcement.ts +6 -3
- package/src/tasks/epic-enforcement.ts +61 -0
- package/src/tasks/pipeline-stage.ts +70 -1
- package/templates/config.template.json +5 -116
- package/templates/global-config.template.json +2 -44
- package/dist/adapters/adapter-registry.js +0 -64
- package/dist/adapters/adapter-registry.js.map +0 -1
- package/dist/adapters/discovery.js +0 -83
- package/dist/adapters/discovery.js.map +0 -1
- package/dist/adapters/index.js +0 -9
- package/dist/adapters/index.js.map +0 -1
- package/dist/adapters/manager.js +0 -260
- package/dist/adapters/manager.js.map +0 -1
- package/dist/admin/export-tasks.js +0 -171
- package/dist/admin/export-tasks.js.map +0 -1
- package/dist/admin/export.js +0 -103
- package/dist/admin/export.js.map +0 -1
- package/dist/admin/help.js +0 -106
- package/dist/admin/help.js.map +0 -1
- package/dist/admin/import-tasks.js +0 -182
- package/dist/admin/import-tasks.js.map +0 -1
- package/dist/admin/import.js +0 -129
- package/dist/admin/import.js.map +0 -1
- package/dist/admin/index.js +0 -13
- package/dist/admin/index.js.map +0 -1
- package/dist/adrs/find.js +0 -134
- package/dist/adrs/find.js.map +0 -1
- package/dist/adrs/index.js +0 -15
- package/dist/adrs/index.js.map +0 -1
- package/dist/adrs/link-pipeline.js +0 -160
- package/dist/adrs/link-pipeline.js.map +0 -1
- package/dist/adrs/list.js +0 -43
- package/dist/adrs/list.js.map +0 -1
- package/dist/adrs/parse.js +0 -51
- package/dist/adrs/parse.js.map +0 -1
- package/dist/adrs/show.js +0 -22
- package/dist/adrs/show.js.map +0 -1
- package/dist/adrs/sync.js +0 -188
- package/dist/adrs/sync.js.map +0 -1
- package/dist/adrs/types.js +0 -9
- package/dist/adrs/types.js.map +0 -1
- package/dist/adrs/validate.js +0 -57
- package/dist/adrs/validate.js.map +0 -1
- package/dist/agents/agent-schema.js +0 -80
- package/dist/agents/agent-schema.js.map +0 -1
- package/dist/agents/capacity.js +0 -116
- package/dist/agents/capacity.js.map +0 -1
- package/dist/agents/index.js +0 -21
- package/dist/agents/index.js.map +0 -1
- package/dist/agents/registry.js +0 -314
- package/dist/agents/registry.js.map +0 -1
- package/dist/agents/retry.js +0 -176
- package/dist/agents/retry.js.map +0 -1
- package/dist/audit-prune.js +0 -94
- package/dist/audit-prune.js.map +0 -1
- package/dist/audit.js +0 -68
- package/dist/audit.js.map +0 -1
- package/dist/bootstrap.js +0 -260
- package/dist/bootstrap.js.map +0 -1
- package/dist/caamp/adapter.js +0 -434
- package/dist/caamp/adapter.js.map +0 -1
- package/dist/caamp/capability-check.js +0 -38
- package/dist/caamp/capability-check.js.map +0 -1
- package/dist/caamp/index.js +0 -23
- package/dist/caamp/index.js.map +0 -1
- package/dist/caamp-init.js +0 -16
- package/dist/caamp-init.js.map +0 -1
- package/dist/cleo.js +0 -267
- package/dist/cleo.js.map +0 -1
- package/dist/codebase-map/analyzers/architecture.js +0 -130
- package/dist/codebase-map/analyzers/architecture.js.map +0 -1
- package/dist/codebase-map/analyzers/concerns.js +0 -122
- package/dist/codebase-map/analyzers/concerns.js.map +0 -1
- package/dist/codebase-map/analyzers/conventions.js +0 -149
- package/dist/codebase-map/analyzers/conventions.js.map +0 -1
- package/dist/codebase-map/analyzers/integrations.js +0 -108
- package/dist/codebase-map/analyzers/integrations.js.map +0 -1
- package/dist/codebase-map/analyzers/stack.js +0 -117
- package/dist/codebase-map/analyzers/stack.js.map +0 -1
- package/dist/codebase-map/analyzers/structure.js +0 -137
- package/dist/codebase-map/analyzers/structure.js.map +0 -1
- package/dist/codebase-map/analyzers/testing.js +0 -118
- package/dist/codebase-map/analyzers/testing.js.map +0 -1
- package/dist/codebase-map/index.js +0 -57
- package/dist/codebase-map/index.js.map +0 -1
- package/dist/codebase-map/store.js +0 -122
- package/dist/codebase-map/store.js.map +0 -1
- package/dist/codebase-map/summary.js +0 -152
- package/dist/codebase-map/summary.js.map +0 -1
- package/dist/compliance/index.js +0 -288
- package/dist/compliance/index.js.map +0 -1
- package/dist/compliance/protocol-enforcement.js +0 -332
- package/dist/compliance/protocol-enforcement.js.map +0 -1
- package/dist/compliance/protocol-rules.js +0 -786
- package/dist/compliance/protocol-rules.js.map +0 -1
- package/dist/compliance/protocol-types.js +0 -80
- package/dist/compliance/protocol-types.js.map +0 -1
- package/dist/compliance/store.js +0 -53
- package/dist/compliance/store.js.map +0 -1
- package/dist/config/build-config.js +0 -29
- package/dist/config/build-config.js.map +0 -1
- package/dist/config.js +0 -287
- package/dist/config.js.map +0 -1
- package/dist/constants.js +0 -18
- package/dist/constants.js.map +0 -1
- package/dist/context/index.js +0 -137
- package/dist/context/index.js.map +0 -1
- package/dist/engine-result.js +0 -12
- package/dist/engine-result.js.map +0 -1
- package/dist/error-catalog.js +0 -404
- package/dist/error-catalog.js.map +0 -1
- package/dist/error-registry.js +0 -393
- package/dist/error-registry.js.map +0 -1
- package/dist/errors.js +0 -167
- package/dist/errors.js.map +0 -1
- package/dist/hooks/handlers/error-hooks.js +0 -43
- package/dist/hooks/handlers/error-hooks.js.map +0 -1
- package/dist/hooks/handlers/file-hooks.js +0 -80
- package/dist/hooks/handlers/file-hooks.js.map +0 -1
- package/dist/hooks/handlers/index.js +0 -19
- package/dist/hooks/handlers/index.js.map +0 -1
- package/dist/hooks/handlers/mcp-hooks.js +0 -80
- package/dist/hooks/handlers/mcp-hooks.js.map +0 -1
- package/dist/hooks/handlers/session-hooks.js +0 -73
- package/dist/hooks/handlers/session-hooks.js.map +0 -1
- package/dist/hooks/handlers/task-hooks.js +0 -63
- package/dist/hooks/handlers/task-hooks.js.map +0 -1
- package/dist/hooks/index.js +0 -13
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/payload-schemas.js +0 -163
- package/dist/hooks/payload-schemas.js.map +0 -1
- package/dist/hooks/provider-hooks.js +0 -34
- package/dist/hooks/provider-hooks.js.map +0 -1
- package/dist/hooks/registry.js +0 -176
- package/dist/hooks/registry.js.map +0 -1
- package/dist/hooks/types.js +0 -62
- package/dist/hooks/types.js.map +0 -1
- package/dist/hooks.js +0 -136
- package/dist/hooks.js.map +0 -1
- package/dist/init.js +0 -711
- package/dist/init.js.map +0 -1
- package/dist/inject/index.js +0 -82
- package/dist/inject/index.js.map +0 -1
- package/dist/injection.js +0 -343
- package/dist/injection.js.map +0 -1
- package/dist/intelligence/impact.js +0 -499
- package/dist/intelligence/impact.js.map +0 -1
- package/dist/intelligence/index.js +0 -17
- package/dist/intelligence/index.js.map +0 -1
- package/dist/intelligence/patterns.js +0 -492
- package/dist/intelligence/patterns.js.map +0 -1
- package/dist/intelligence/prediction.js +0 -499
- package/dist/intelligence/prediction.js.map +0 -1
- package/dist/intelligence/types.js +0 -13
- package/dist/intelligence/types.js.map +0 -1
- package/dist/internal.js +0 -258
- package/dist/internal.js.map +0 -1
- package/dist/issue/create.js +0 -121
- package/dist/issue/create.js.map +0 -1
- package/dist/issue/diagnostics.js +0 -59
- package/dist/issue/diagnostics.js.map +0 -1
- package/dist/issue/index.js +0 -10
- package/dist/issue/index.js.map +0 -1
- package/dist/issue/template-parser.js +0 -267
- package/dist/issue/template-parser.js.map +0 -1
- package/dist/json-schema-validator.js +0 -76
- package/dist/json-schema-validator.js.map +0 -1
- package/dist/lifecycle/chain-composition.js +0 -152
- package/dist/lifecycle/chain-composition.js.map +0 -1
- package/dist/lifecycle/chain-store.js +0 -246
- package/dist/lifecycle/chain-store.js.map +0 -1
- package/dist/lifecycle/consolidate-rcasd.js +0 -352
- package/dist/lifecycle/consolidate-rcasd.js.map +0 -1
- package/dist/lifecycle/default-chain.js +0 -167
- package/dist/lifecycle/default-chain.js.map +0 -1
- package/dist/lifecycle/evidence.js +0 -180
- package/dist/lifecycle/evidence.js.map +0 -1
- package/dist/lifecycle/frontmatter.js +0 -363
- package/dist/lifecycle/frontmatter.js.map +0 -1
- package/dist/lifecycle/index.js +0 -753
- package/dist/lifecycle/index.js.map +0 -1
- package/dist/lifecycle/pipeline.js +0 -656
- package/dist/lifecycle/pipeline.js.map +0 -1
- package/dist/lifecycle/rcasd-index.js +0 -326
- package/dist/lifecycle/rcasd-index.js.map +0 -1
- package/dist/lifecycle/rcasd-paths.js +0 -220
- package/dist/lifecycle/rcasd-paths.js.map +0 -1
- package/dist/lifecycle/resume.js +0 -864
- package/dist/lifecycle/resume.js.map +0 -1
- package/dist/lifecycle/stage-artifacts.js +0 -94
- package/dist/lifecycle/stage-artifacts.js.map +0 -1
- package/dist/lifecycle/stages.js +0 -534
- package/dist/lifecycle/stages.js.map +0 -1
- package/dist/lifecycle/state-machine.js +0 -516
- package/dist/lifecycle/state-machine.js.map +0 -1
- package/dist/lifecycle/tessera-engine.js +0 -249
- package/dist/lifecycle/tessera-engine.js.map +0 -1
- package/dist/logger.js +0 -140
- package/dist/logger.js.map +0 -1
- package/dist/mcp/index.js +0 -146
- package/dist/mcp/index.js.map +0 -1
- package/dist/memory/auto-extract.js +0 -143
- package/dist/memory/auto-extract.js.map +0 -1
- package/dist/memory/brain-embedding.js +0 -49
- package/dist/memory/brain-embedding.js.map +0 -1
- package/dist/memory/brain-lifecycle.js +0 -298
- package/dist/memory/brain-lifecycle.js.map +0 -1
- package/dist/memory/brain-links.js +0 -148
- package/dist/memory/brain-links.js.map +0 -1
- package/dist/memory/brain-migration.js +0 -149
- package/dist/memory/brain-migration.js.map +0 -1
- package/dist/memory/brain-reasoning.js +0 -215
- package/dist/memory/brain-reasoning.js.map +0 -1
- package/dist/memory/brain-retrieval.js +0 -474
- package/dist/memory/brain-retrieval.js.map +0 -1
- package/dist/memory/brain-row-types.js +0 -10
- package/dist/memory/brain-row-types.js.map +0 -1
- package/dist/memory/brain-search.js +0 -519
- package/dist/memory/brain-search.js.map +0 -1
- package/dist/memory/brain-similarity.js +0 -145
- package/dist/memory/brain-similarity.js.map +0 -1
- package/dist/memory/claude-mem-migration.js +0 -277
- package/dist/memory/claude-mem-migration.js.map +0 -1
- package/dist/memory/decisions.js +0 -148
- package/dist/memory/decisions.js.map +0 -1
- package/dist/memory/engine-compat.js +0 -1030
- package/dist/memory/engine-compat.js.map +0 -1
- package/dist/memory/index.js +0 -773
- package/dist/memory/index.js.map +0 -1
- package/dist/memory/learnings.js +0 -121
- package/dist/memory/learnings.js.map +0 -1
- package/dist/memory/memory-bridge.js +0 -289
- package/dist/memory/memory-bridge.js.map +0 -1
- package/dist/memory/patterns.js +0 -122
- package/dist/memory/patterns.js.map +0 -1
- package/dist/memory/pipeline-manifest-sqlite.js +0 -975
- package/dist/memory/pipeline-manifest-sqlite.js.map +0 -1
- package/dist/memory/session-memory.js +0 -226
- package/dist/memory/session-memory.js.map +0 -1
- package/dist/metrics/ab-test.js +0 -260
- package/dist/metrics/ab-test.js.map +0 -1
- package/dist/metrics/aggregation.js +0 -363
- package/dist/metrics/aggregation.js.map +0 -1
- package/dist/metrics/common.js +0 -64
- package/dist/metrics/common.js.map +0 -1
- package/dist/metrics/enums.js +0 -78
- package/dist/metrics/enums.js.map +0 -1
- package/dist/metrics/index.js +0 -19
- package/dist/metrics/index.js.map +0 -1
- package/dist/metrics/model-provider-registry.js +0 -88
- package/dist/metrics/model-provider-registry.js.map +0 -1
- package/dist/metrics/otel-integration.js +0 -263
- package/dist/metrics/otel-integration.js.map +0 -1
- package/dist/metrics/provider-detection.js +0 -103
- package/dist/metrics/provider-detection.js.map +0 -1
- package/dist/metrics/token-estimation.js +0 -253
- package/dist/metrics/token-estimation.js.map +0 -1
- package/dist/metrics/token-service.js +0 -450
- package/dist/metrics/token-service.js.map +0 -1
- package/dist/migration/agent-outputs.js +0 -316
- package/dist/migration/agent-outputs.js.map +0 -1
- package/dist/migration/checksum.js +0 -92
- package/dist/migration/checksum.js.map +0 -1
- package/dist/migration/index.js +0 -282
- package/dist/migration/index.js.map +0 -1
- package/dist/migration/logger.js +0 -360
- package/dist/migration/logger.js.map +0 -1
- package/dist/migration/preflight.js +0 -9
- package/dist/migration/preflight.js.map +0 -1
- package/dist/migration/state.js +0 -421
- package/dist/migration/state.js.map +0 -1
- package/dist/migration/validate.js +0 -241
- package/dist/migration/validate.js.map +0 -1
- package/dist/nexus/deps.js +0 -375
- package/dist/nexus/deps.js.map +0 -1
- package/dist/nexus/discover.js +0 -288
- package/dist/nexus/discover.js.map +0 -1
- package/dist/nexus/hash.js +0 -10
- package/dist/nexus/hash.js.map +0 -1
- package/dist/nexus/index.js +0 -38
- package/dist/nexus/index.js.map +0 -1
- package/dist/nexus/migrate-json-to-sqlite.js +0 -115
- package/dist/nexus/migrate-json-to-sqlite.js.map +0 -1
- package/dist/nexus/permissions.js +0 -105
- package/dist/nexus/permissions.js.map +0 -1
- package/dist/nexus/query.js +0 -175
- package/dist/nexus/query.js.map +0 -1
- package/dist/nexus/registry.js +0 -584
- package/dist/nexus/registry.js.map +0 -1
- package/dist/nexus/sharing/index.js +0 -179
- package/dist/nexus/sharing/index.js.map +0 -1
- package/dist/nexus/transfer-types.js +0 -8
- package/dist/nexus/transfer-types.js.map +0 -1
- package/dist/nexus/transfer.js +0 -263
- package/dist/nexus/transfer.js.map +0 -1
- package/dist/observability/index.js +0 -103
- package/dist/observability/index.js.map +0 -1
- package/dist/observability/log-filter.js +0 -63
- package/dist/observability/log-filter.js.map +0 -1
- package/dist/observability/log-parser.js +0 -99
- package/dist/observability/log-parser.js.map +0 -1
- package/dist/observability/log-reader.js +0 -139
- package/dist/observability/log-reader.js.map +0 -1
- package/dist/observability/types.js +0 -19
- package/dist/observability/types.js.map +0 -1
- package/dist/orchestration/analyze.js +0 -107
- package/dist/orchestration/analyze.js.map +0 -1
- package/dist/orchestration/bootstrap.js +0 -132
- package/dist/orchestration/bootstrap.js.map +0 -1
- package/dist/orchestration/context.js +0 -56
- package/dist/orchestration/context.js.map +0 -1
- package/dist/orchestration/critical-path.js +0 -100
- package/dist/orchestration/critical-path.js.map +0 -1
- package/dist/orchestration/index.js +0 -286
- package/dist/orchestration/index.js.map +0 -1
- package/dist/orchestration/parallel.js +0 -89
- package/dist/orchestration/parallel.js.map +0 -1
- package/dist/orchestration/protocol-validators.js +0 -524
- package/dist/orchestration/protocol-validators.js.map +0 -1
- package/dist/orchestration/skill-ops.js +0 -98
- package/dist/orchestration/skill-ops.js.map +0 -1
- package/dist/orchestration/status.js +0 -107
- package/dist/orchestration/status.js.map +0 -1
- package/dist/orchestration/unblock.js +0 -103
- package/dist/orchestration/unblock.js.map +0 -1
- package/dist/orchestration/validate-spawn.js +0 -67
- package/dist/orchestration/validate-spawn.js.map +0 -1
- package/dist/orchestration/waves.js +0 -86
- package/dist/orchestration/waves.js.map +0 -1
- package/dist/otel/index.js +0 -163
- package/dist/otel/index.js.map +0 -1
- package/dist/output.js +0 -132
- package/dist/output.js.map +0 -1
- package/dist/pagination.js +0 -61
- package/dist/pagination.js.map +0 -1
- package/dist/paths.js +0 -337
- package/dist/paths.js.map +0 -1
- package/dist/phases/deps.js +0 -369
- package/dist/phases/deps.js.map +0 -1
- package/dist/phases/index.js +0 -349
- package/dist/phases/index.js.map +0 -1
- package/dist/pipeline/index.js +0 -10
- package/dist/pipeline/index.js.map +0 -1
- package/dist/pipeline/phase.js +0 -45
- package/dist/pipeline/phase.js.map +0 -1
- package/dist/platform.js +0 -211
- package/dist/platform.js.map +0 -1
- package/dist/project-info.js +0 -84
- package/dist/project-info.js.map +0 -1
- package/dist/reconciliation/index.js +0 -10
- package/dist/reconciliation/index.js.map +0 -1
- package/dist/reconciliation/link-store.js +0 -129
- package/dist/reconciliation/link-store.js.map +0 -1
- package/dist/reconciliation/reconciliation-engine.js +0 -298
- package/dist/reconciliation/reconciliation-engine.js.map +0 -1
- package/dist/release/artifacts.js +0 -427
- package/dist/release/artifacts.js.map +0 -1
- package/dist/release/changelog-writer.js +0 -151
- package/dist/release/changelog-writer.js.map +0 -1
- package/dist/release/channel.js +0 -144
- package/dist/release/channel.js.map +0 -1
- package/dist/release/ci.js +0 -166
- package/dist/release/ci.js.map +0 -1
- package/dist/release/github-pr.js +0 -225
- package/dist/release/github-pr.js.map +0 -1
- package/dist/release/guards.js +0 -116
- package/dist/release/guards.js.map +0 -1
- package/dist/release/index.js +0 -22
- package/dist/release/index.js.map +0 -1
- package/dist/release/release-config.js +0 -158
- package/dist/release/release-config.js.map +0 -1
- package/dist/release/release-manifest.js +0 -1019
- package/dist/release/release-manifest.js.map +0 -1
- package/dist/release/version-bump.js +0 -255
- package/dist/release/version-bump.js.map +0 -1
- package/dist/remote/index.js +0 -257
- package/dist/remote/index.js.map +0 -1
- package/dist/repair.js +0 -89
- package/dist/repair.js.map +0 -1
- package/dist/research/index.js +0 -2
- package/dist/research/index.js.map +0 -1
- package/dist/roadmap/index.js +0 -59
- package/dist/roadmap/index.js.map +0 -1
- package/dist/routing/capability-matrix.js +0 -1550
- package/dist/routing/capability-matrix.js.map +0 -1
- package/dist/routing/index.js +0 -9
- package/dist/routing/index.js.map +0 -1
- package/dist/scaffold.js +0 -1158
- package/dist/scaffold.js.map +0 -1
- package/dist/schema-management.js +0 -295
- package/dist/schema-management.js.map +0 -1
- package/dist/security/index.js +0 -9
- package/dist/security/index.js.map +0 -1
- package/dist/security/input-sanitization.js +0 -321
- package/dist/security/input-sanitization.js.map +0 -1
- package/dist/sequence/index.js +0 -295
- package/dist/sequence/index.js.map +0 -1
- package/dist/sessions/assumptions.js +0 -54
- package/dist/sessions/assumptions.js.map +0 -1
- package/dist/sessions/briefing.js +0 -377
- package/dist/sessions/briefing.js.map +0 -1
- package/dist/sessions/context-alert.js +0 -222
- package/dist/sessions/context-alert.js.map +0 -1
- package/dist/sessions/context-inject.js +0 -61
- package/dist/sessions/context-inject.js.map +0 -1
- package/dist/sessions/context-monitor.js +0 -98
- package/dist/sessions/context-monitor.js.map +0 -1
- package/dist/sessions/decisions.js +0 -65
- package/dist/sessions/decisions.js.map +0 -1
- package/dist/sessions/find.js +0 -63
- package/dist/sessions/find.js.map +0 -1
- package/dist/sessions/handoff.js +0 -328
- package/dist/sessions/handoff.js.map +0 -1
- package/dist/sessions/hitl-warnings.js +0 -254
- package/dist/sessions/hitl-warnings.js.map +0 -1
- package/dist/sessions/index.js +0 -318
- package/dist/sessions/index.js.map +0 -1
- package/dist/sessions/session-archive.js +0 -40
- package/dist/sessions/session-archive.js.map +0 -1
- package/dist/sessions/session-cleanup.js +0 -59
- package/dist/sessions/session-cleanup.js.map +0 -1
- package/dist/sessions/session-drift.js +0 -134
- package/dist/sessions/session-drift.js.map +0 -1
- package/dist/sessions/session-enforcement.js +0 -140
- package/dist/sessions/session-enforcement.js.map +0 -1
- package/dist/sessions/session-grade.js +0 -253
- package/dist/sessions/session-grade.js.map +0 -1
- package/dist/sessions/session-history.js +0 -42
- package/dist/sessions/session-history.js.map +0 -1
- package/dist/sessions/session-id.js +0 -81
- package/dist/sessions/session-id.js.map +0 -1
- package/dist/sessions/session-memory-bridge.js +0 -52
- package/dist/sessions/session-memory-bridge.js.map +0 -1
- package/dist/sessions/session-show.js +0 -24
- package/dist/sessions/session-show.js.map +0 -1
- package/dist/sessions/session-stats.js +0 -69
- package/dist/sessions/session-stats.js.map +0 -1
- package/dist/sessions/session-suspend.js +0 -39
- package/dist/sessions/session-suspend.js.map +0 -1
- package/dist/sessions/session-switch.js +0 -51
- package/dist/sessions/session-switch.js.map +0 -1
- package/dist/sessions/session-view.js +0 -76
- package/dist/sessions/session-view.js.map +0 -1
- package/dist/sessions/statusline-setup.js +0 -85
- package/dist/sessions/statusline-setup.js.map +0 -1
- package/dist/sessions/types.js +0 -8
- package/dist/sessions/types.js.map +0 -1
- package/dist/signaldock/claude-code-transport.js +0 -107
- package/dist/signaldock/claude-code-transport.js.map +0 -1
- package/dist/signaldock/factory.js +0 -25
- package/dist/signaldock/factory.js.map +0 -1
- package/dist/signaldock/index.js +0 -9
- package/dist/signaldock/index.js.map +0 -1
- package/dist/signaldock/signaldock-transport.js +0 -122
- package/dist/signaldock/signaldock-transport.js.map +0 -1
- package/dist/signaldock/transport.js +0 -11
- package/dist/signaldock/transport.js.map +0 -1
- package/dist/signaldock/types.js +0 -11
- package/dist/signaldock/types.js.map +0 -1
- package/dist/skills/agents/config.js +0 -94
- package/dist/skills/agents/config.js.map +0 -1
- package/dist/skills/agents/install.js +0 -116
- package/dist/skills/agents/install.js.map +0 -1
- package/dist/skills/agents/registry.js +0 -161
- package/dist/skills/agents/registry.js.map +0 -1
- package/dist/skills/discovery.js +0 -333
- package/dist/skills/discovery.js.map +0 -1
- package/dist/skills/dispatch.js +0 -347
- package/dist/skills/dispatch.js.map +0 -1
- package/dist/skills/dynamic-skill-generator.js +0 -100
- package/dist/skills/dynamic-skill-generator.js.map +0 -1
- package/dist/skills/index.js +0 -44
- package/dist/skills/index.js.map +0 -1
- package/dist/skills/injection/subagent.js +0 -195
- package/dist/skills/injection/subagent.js.map +0 -1
- package/dist/skills/injection/token.js +0 -260
- package/dist/skills/injection/token.js.map +0 -1
- package/dist/skills/install.js +0 -40
- package/dist/skills/install.js.map +0 -1
- package/dist/skills/manifests/contribution.js +0 -175
- package/dist/skills/manifests/contribution.js.map +0 -1
- package/dist/skills/manifests/research.js +0 -281
- package/dist/skills/manifests/research.js.map +0 -1
- package/dist/skills/manifests/resolver.js +0 -146
- package/dist/skills/manifests/resolver.js.map +0 -1
- package/dist/skills/marketplace.js +0 -90
- package/dist/skills/marketplace.js.map +0 -1
- package/dist/skills/orchestrator/spawn.js +0 -178
- package/dist/skills/orchestrator/spawn.js.map +0 -1
- package/dist/skills/orchestrator/startup.js +0 -451
- package/dist/skills/orchestrator/startup.js.map +0 -1
- package/dist/skills/orchestrator/validator.js +0 -301
- package/dist/skills/orchestrator/validator.js.map +0 -1
- package/dist/skills/precedence-integration.js +0 -73
- package/dist/skills/precedence-integration.js.map +0 -1
- package/dist/skills/precedence-types.js +0 -16
- package/dist/skills/precedence-types.js.map +0 -1
- package/dist/skills/routing-table.js +0 -63
- package/dist/skills/routing-table.js.map +0 -1
- package/dist/skills/skill-paths.js +0 -220
- package/dist/skills/skill-paths.js.map +0 -1
- package/dist/skills/test-utility.js +0 -55
- package/dist/skills/test-utility.js.map +0 -1
- package/dist/skills/types.js +0 -118
- package/dist/skills/types.js.map +0 -1
- package/dist/skills/validation.js +0 -183
- package/dist/skills/validation.js.map +0 -1
- package/dist/skills/version.js +0 -57
- package/dist/skills/version.js.map +0 -1
- package/dist/snapshot/index.js +0 -188
- package/dist/snapshot/index.js.map +0 -1
- package/dist/spawn/adapter-registry.js +0 -246
- package/dist/spawn/adapter-registry.js.map +0 -1
- package/dist/spawn/index.js +0 -10
- package/dist/spawn/index.js.map +0 -1
- package/dist/stats/index.js +0 -339
- package/dist/stats/index.js.map +0 -1
- package/dist/sticky/archive.js +0 -47
- package/dist/sticky/archive.js.map +0 -1
- package/dist/sticky/convert.js +0 -235
- package/dist/sticky/convert.js.map +0 -1
- package/dist/sticky/create.js +0 -48
- package/dist/sticky/create.js.map +0 -1
- package/dist/sticky/id.js +0 -35
- package/dist/sticky/id.js.map +0 -1
- package/dist/sticky/index.js +0 -16
- package/dist/sticky/index.js.map +0 -1
- package/dist/sticky/list.js +0 -44
- package/dist/sticky/list.js.map +0 -1
- package/dist/sticky/purge.js +0 -45
- package/dist/sticky/purge.js.map +0 -1
- package/dist/sticky/show.js +0 -42
- package/dist/sticky/show.js.map +0 -1
- package/dist/sticky/types.js +0 -10
- package/dist/sticky/types.js.map +0 -1
- package/dist/store/atomic.js +0 -167
- package/dist/store/atomic.js.map +0 -1
- package/dist/store/backup.js +0 -94
- package/dist/store/backup.js.map +0 -1
- package/dist/store/brain-accessor.js +0 -397
- package/dist/store/brain-accessor.js.map +0 -1
- package/dist/store/brain-schema.js +0 -212
- package/dist/store/brain-schema.js.map +0 -1
- package/dist/store/brain-sqlite.js +0 -271
- package/dist/store/brain-sqlite.js.map +0 -1
- package/dist/store/cache.js +0 -168
- package/dist/store/cache.js.map +0 -1
- package/dist/store/chain-schema.js +0 -51
- package/dist/store/chain-schema.js.map +0 -1
- package/dist/store/converters.js +0 -120
- package/dist/store/converters.js.map +0 -1
- package/dist/store/data-accessor.js +0 -26
- package/dist/store/data-accessor.js.map +0 -1
- package/dist/store/data-safety-central.js +0 -269
- package/dist/store/data-safety-central.js.map +0 -1
- package/dist/store/data-safety.js +0 -274
- package/dist/store/data-safety.js.map +0 -1
- package/dist/store/db-helpers.js +0 -221
- package/dist/store/db-helpers.js.map +0 -1
- package/dist/store/export.js +0 -155
- package/dist/store/export.js.map +0 -1
- package/dist/store/file-utils.js +0 -270
- package/dist/store/file-utils.js.map +0 -1
- package/dist/store/git-checkpoint.js +0 -365
- package/dist/store/git-checkpoint.js.map +0 -1
- package/dist/store/import-logging.js +0 -139
- package/dist/store/import-logging.js.map +0 -1
- package/dist/store/import-remap.js +0 -145
- package/dist/store/import-remap.js.map +0 -1
- package/dist/store/import-sort.js +0 -121
- package/dist/store/import-sort.js.map +0 -1
- package/dist/store/index.js +0 -28
- package/dist/store/index.js.map +0 -1
- package/dist/store/json.js +0 -208
- package/dist/store/json.js.map +0 -1
- package/dist/store/lifecycle-store.js +0 -249
- package/dist/store/lifecycle-store.js.map +0 -1
- package/dist/store/lock.js +0 -70
- package/dist/store/lock.js.map +0 -1
- package/dist/store/migration-sqlite.js +0 -671
- package/dist/store/migration-sqlite.js.map +0 -1
- package/dist/store/nexus-schema.js +0 -62
- package/dist/store/nexus-schema.js.map +0 -1
- package/dist/store/nexus-sqlite.js +0 -217
- package/dist/store/nexus-sqlite.js.map +0 -1
- package/dist/store/nexus-validation-schemas.js +0 -40
- package/dist/store/nexus-validation-schemas.js.map +0 -1
- package/dist/store/parsers.js +0 -37
- package/dist/store/parsers.js.map +0 -1
- package/dist/store/project-detect.js +0 -457
- package/dist/store/project-detect.js.map +0 -1
- package/dist/store/provider.js +0 -101
- package/dist/store/provider.js.map +0 -1
- package/dist/store/safety-data-accessor.js +0 -243
- package/dist/store/safety-data-accessor.js.map +0 -1
- package/dist/store/schema.js +0 -7
- package/dist/store/schema.js.map +0 -1
- package/dist/store/session-store.js +0 -219
- package/dist/store/session-store.js.map +0 -1
- package/dist/store/sqlite-backup.js +0 -105
- package/dist/store/sqlite-backup.js.map +0 -1
- package/dist/store/sqlite-data-accessor.js +0 -742
- package/dist/store/sqlite-data-accessor.js.map +0 -1
- package/dist/store/sqlite.js +0 -489
- package/dist/store/sqlite.js.map +0 -1
- package/dist/store/status-registry.js +0 -8
- package/dist/store/status-registry.js.map +0 -1
- package/dist/store/task-store.js +0 -344
- package/dist/store/task-store.js.map +0 -1
- package/dist/store/tasks-schema.js +0 -574
- package/dist/store/tasks-schema.js.map +0 -1
- package/dist/store/typed-query.js +0 -15
- package/dist/store/typed-query.js.map +0 -1
- package/dist/store/validation-schemas.js +0 -278
- package/dist/store/validation-schemas.js.map +0 -1
- package/dist/system/archive-analytics.js +0 -277
- package/dist/system/archive-analytics.js.map +0 -1
- package/dist/system/archive-stats.js +0 -64
- package/dist/system/archive-stats.js.map +0 -1
- package/dist/system/audit.js +0 -145
- package/dist/system/audit.js.map +0 -1
- package/dist/system/backup.js +0 -99
- package/dist/system/backup.js.map +0 -1
- package/dist/system/cleanup.js +0 -134
- package/dist/system/cleanup.js.map +0 -1
- package/dist/system/health.js +0 -1054
- package/dist/system/health.js.map +0 -1
- package/dist/system/index.js +0 -18
- package/dist/system/index.js.map +0 -1
- package/dist/system/inject-generate.js +0 -122
- package/dist/system/inject-generate.js.map +0 -1
- package/dist/system/labels.js +0 -38
- package/dist/system/labels.js.map +0 -1
- package/dist/system/metrics.js +0 -61
- package/dist/system/metrics.js.map +0 -1
- package/dist/system/migrate.js +0 -43
- package/dist/system/migrate.js.map +0 -1
- package/dist/system/platform-paths.js +0 -80
- package/dist/system/platform-paths.js.map +0 -1
- package/dist/system/runtime.js +0 -161
- package/dist/system/runtime.js.map +0 -1
- package/dist/system/safestop.js +0 -99
- package/dist/system/safestop.js.map +0 -1
- package/dist/system/storage-preflight.js +0 -123
- package/dist/system/storage-preflight.js.map +0 -1
- package/dist/task-work/index.js +0 -155
- package/dist/task-work/index.js.map +0 -1
- package/dist/tasks/add.js +0 -510
- package/dist/tasks/add.js.map +0 -1
- package/dist/tasks/analyze.js +0 -85
- package/dist/tasks/analyze.js.map +0 -1
- package/dist/tasks/archive.js +0 -90
- package/dist/tasks/archive.js.map +0 -1
- package/dist/tasks/atomicity.js +0 -83
- package/dist/tasks/atomicity.js.map +0 -1
- package/dist/tasks/cancel-ops.js +0 -83
- package/dist/tasks/cancel-ops.js.map +0 -1
- package/dist/tasks/complete.js +0 -224
- package/dist/tasks/complete.js.map +0 -1
- package/dist/tasks/crossref-extract.js +0 -73
- package/dist/tasks/crossref-extract.js.map +0 -1
- package/dist/tasks/delete-preview.js +0 -192
- package/dist/tasks/delete-preview.js.map +0 -1
- package/dist/tasks/delete.js +0 -120
- package/dist/tasks/delete.js.map +0 -1
- package/dist/tasks/deletion-strategy.js +0 -200
- package/dist/tasks/deletion-strategy.js.map +0 -1
- package/dist/tasks/dependency-check.js +0 -278
- package/dist/tasks/dependency-check.js.map +0 -1
- package/dist/tasks/deps-ready.js +0 -32
- package/dist/tasks/deps-ready.js.map +0 -1
- package/dist/tasks/enforcement.js +0 -82
- package/dist/tasks/enforcement.js.map +0 -1
- package/dist/tasks/find.js +0 -148
- package/dist/tasks/find.js.map +0 -1
- package/dist/tasks/graph-cache.js +0 -127
- package/dist/tasks/graph-cache.js.map +0 -1
- package/dist/tasks/graph-ops.js +0 -171
- package/dist/tasks/graph-ops.js.map +0 -1
- package/dist/tasks/graph-rag.js +0 -328
- package/dist/tasks/graph-rag.js.map +0 -1
- package/dist/tasks/hierarchy-policy.js +0 -149
- package/dist/tasks/hierarchy-policy.js.map +0 -1
- package/dist/tasks/hierarchy.js +0 -185
- package/dist/tasks/hierarchy.js.map +0 -1
- package/dist/tasks/id-generator.js +0 -65
- package/dist/tasks/id-generator.js.map +0 -1
- package/dist/tasks/index.js +0 -14
- package/dist/tasks/index.js.map +0 -1
- package/dist/tasks/labels.js +0 -52
- package/dist/tasks/labels.js.map +0 -1
- package/dist/tasks/list.js +0 -68
- package/dist/tasks/list.js.map +0 -1
- package/dist/tasks/phase-tracking.js +0 -133
- package/dist/tasks/phase-tracking.js.map +0 -1
- package/dist/tasks/plan.js +0 -268
- package/dist/tasks/plan.js.map +0 -1
- package/dist/tasks/relates.js +0 -89
- package/dist/tasks/relates.js.map +0 -1
- package/dist/tasks/reparent.d.ts +0 -38
- package/dist/tasks/reparent.d.ts.map +0 -1
- package/dist/tasks/show.js +0 -78
- package/dist/tasks/show.js.map +0 -1
- package/dist/tasks/size-weighting.js +0 -86
- package/dist/tasks/size-weighting.js.map +0 -1
- package/dist/tasks/staleness.js +0 -86
- package/dist/tasks/staleness.js.map +0 -1
- package/dist/tasks/task-ops.js +0 -1340
- package/dist/tasks/task-ops.js.map +0 -1
- package/dist/tasks/update.js +0 -243
- package/dist/tasks/update.js.map +0 -1
- package/dist/templates/index.js +0 -10
- package/dist/templates/index.js.map +0 -1
- package/dist/templates/parser.js +0 -254
- package/dist/templates/parser.js.map +0 -1
- package/dist/ui/aliases.js +0 -153
- package/dist/ui/aliases.js.map +0 -1
- package/dist/ui/changelog.js +0 -184
- package/dist/ui/changelog.js.map +0 -1
- package/dist/ui/command-registry.js +0 -168
- package/dist/ui/command-registry.js.map +0 -1
- package/dist/ui/flags.js +0 -94
- package/dist/ui/flags.js.map +0 -1
- package/dist/ui/index.js +0 -24
- package/dist/ui/index.js.map +0 -1
- package/dist/ui/injection-legacy.d.ts +0 -26
- package/dist/ui/injection-legacy.d.ts.map +0 -1
- package/dist/ui/injection-legacy.js +0 -42
- package/dist/ui/injection-legacy.js.map +0 -1
- package/dist/upgrade.js +0 -901
- package/dist/upgrade.js.map +0 -1
- package/dist/validation/chain-validation.js +0 -146
- package/dist/validation/chain-validation.js.map +0 -1
- package/dist/validation/compliance.js +0 -155
- package/dist/validation/compliance.js.map +0 -1
- package/dist/validation/docs-sync.js +0 -212
- package/dist/validation/docs-sync.js.map +0 -1
- package/dist/validation/doctor/checks.js +0 -1069
- package/dist/validation/doctor/checks.js.map +0 -1
- package/dist/validation/doctor/index.js +0 -9
- package/dist/validation/doctor/index.js.map +0 -1
- package/dist/validation/doctor/project-cache.js +0 -160
- package/dist/validation/doctor/project-cache.js.map +0 -1
- package/dist/validation/doctor/utils.js +0 -155
- package/dist/validation/doctor/utils.js.map +0 -1
- package/dist/validation/engine.js +0 -902
- package/dist/validation/engine.js.map +0 -1
- package/dist/validation/gap-check.js +0 -175
- package/dist/validation/gap-check.js.map +0 -1
- package/dist/validation/index.js +0 -40
- package/dist/validation/index.js.map +0 -1
- package/dist/validation/manifest.js +0 -237
- package/dist/validation/manifest.js.map +0 -1
- package/dist/validation/operation-gate-validators.js +0 -724
- package/dist/validation/operation-gate-validators.js.map +0 -1
- package/dist/validation/operation-verification-gates.js +0 -532
- package/dist/validation/operation-verification-gates.js.map +0 -1
- package/dist/validation/param-utils.js +0 -139
- package/dist/validation/param-utils.js.map +0 -1
- package/dist/validation/protocol-common.js +0 -300
- package/dist/validation/protocol-common.js.map +0 -1
- package/dist/validation/protocols/consensus.js +0 -71
- package/dist/validation/protocols/consensus.js.map +0 -1
- package/dist/validation/protocols/contribution.js +0 -59
- package/dist/validation/protocols/contribution.js.map +0 -1
- package/dist/validation/protocols/decomposition.js +0 -59
- package/dist/validation/protocols/decomposition.js.map +0 -1
- package/dist/validation/protocols/implementation.js +0 -59
- package/dist/validation/protocols/implementation.js.map +0 -1
- package/dist/validation/protocols/release-protocol.js +0 -60
- package/dist/validation/protocols/release-protocol.js.map +0 -1
- package/dist/validation/protocols/research.js +0 -77
- package/dist/validation/protocols/research.js.map +0 -1
- package/dist/validation/protocols/specification.js +0 -84
- package/dist/validation/protocols/specification.js.map +0 -1
- package/dist/validation/protocols/testing-protocol.js +0 -70
- package/dist/validation/protocols/testing-protocol.js.map +0 -1
- package/dist/validation/protocols/validation-protocol.js +0 -70
- package/dist/validation/protocols/validation-protocol.js.map +0 -1
- package/dist/validation/schema-integrity.js +0 -170
- package/dist/validation/schema-integrity.js.map +0 -1
- package/dist/validation/schema-validator.js +0 -176
- package/dist/validation/schema-validator.js.map +0 -1
- package/dist/validation/validate-ops.js +0 -937
- package/dist/validation/validate-ops.js.map +0 -1
- package/dist/validation/validation-rules.js +0 -226
- package/dist/validation/validation-rules.js.map +0 -1
- package/dist/validation/verification.js +0 -321
- package/dist/validation/verification.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -13159,9 +13159,9 @@ async function readSequenceFromDb(cwd, accessor) {
|
|
|
13159
13159
|
return isValidSequenceState(value) ? value : null;
|
|
13160
13160
|
}
|
|
13161
13161
|
const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
13162
|
-
const { eq:
|
|
13162
|
+
const { eq: eq12 } = await import("drizzle-orm");
|
|
13163
13163
|
const db = await getDb3(cwd);
|
|
13164
|
-
const rows = await db.select().from(schemaMeta).where(
|
|
13164
|
+
const rows = await db.select().from(schemaMeta).where(eq12(schemaMeta.key, SEQUENCE_META_KEY)).all();
|
|
13165
13165
|
const raw = rows[0]?.value;
|
|
13166
13166
|
if (!raw) return null;
|
|
13167
13167
|
try {
|
|
@@ -14207,7 +14207,7 @@ async function linkPipelineAdr(projectRoot, taskId) {
|
|
|
14207
14207
|
return result;
|
|
14208
14208
|
}
|
|
14209
14209
|
const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
14210
|
-
const { and:
|
|
14210
|
+
const { and: and9, eq: eq12 } = await import("drizzle-orm");
|
|
14211
14211
|
const db = await getDb3(projectRoot);
|
|
14212
14212
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
14213
14213
|
for (const filePath of matchingFiles) {
|
|
@@ -14217,7 +14217,7 @@ async function linkPipelineAdr(projectRoot, taskId) {
|
|
|
14217
14217
|
const fm = record2.frontmatter;
|
|
14218
14218
|
const content = readFileSync5(filePath, "utf-8");
|
|
14219
14219
|
const relativePath = `.cleo/adrs/${filename}`;
|
|
14220
|
-
const existing = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(
|
|
14220
|
+
const existing = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(eq12(architectureDecisions.id, record2.id)).all();
|
|
14221
14221
|
const rowBase = {
|
|
14222
14222
|
id: record2.id,
|
|
14223
14223
|
title: record2.title,
|
|
@@ -14237,19 +14237,19 @@ async function linkPipelineAdr(projectRoot, taskId) {
|
|
|
14237
14237
|
updatedAt: now
|
|
14238
14238
|
};
|
|
14239
14239
|
if (existing.length > 0) {
|
|
14240
|
-
await db.update(architectureDecisions).set(rowBase).where(
|
|
14240
|
+
await db.update(architectureDecisions).set(rowBase).where(eq12(architectureDecisions.id, record2.id));
|
|
14241
14241
|
} else {
|
|
14242
14242
|
await db.insert(architectureDecisions).values({ ...rowBase, createdAt: now });
|
|
14243
14243
|
}
|
|
14244
14244
|
result.synced++;
|
|
14245
|
-
await db.delete(adrTaskLinks).where(
|
|
14245
|
+
await db.delete(adrTaskLinks).where(and9(eq12(adrTaskLinks.adrId, record2.id), eq12(adrTaskLinks.taskId, taskId)));
|
|
14246
14246
|
await db.insert(adrTaskLinks).values({ adrId: record2.id, taskId, linkType: "implements" });
|
|
14247
14247
|
result.linked.push({ adrId: record2.id, taskId });
|
|
14248
14248
|
if (fm["Related ADRs"]) {
|
|
14249
14249
|
const relatedIds = fm["Related ADRs"].split(",").map((r) => r.trim()).filter((r) => /^ADR-\d+$/.test(r));
|
|
14250
14250
|
for (const toId of relatedIds) {
|
|
14251
14251
|
try {
|
|
14252
|
-
const targetExists = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(
|
|
14252
|
+
const targetExists = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(eq12(architectureDecisions.id, toId)).all();
|
|
14253
14253
|
if (targetExists.length > 0) {
|
|
14254
14254
|
await db.insert(adrRelations).values({ fromAdrId: record2.id, toAdrId: toId, relationType: "related" }).onConflictDoNothing();
|
|
14255
14255
|
}
|
|
@@ -14272,248 +14272,8 @@ var init_link_pipeline = __esm({
|
|
|
14272
14272
|
}
|
|
14273
14273
|
});
|
|
14274
14274
|
|
|
14275
|
-
// packages/core/src/agents/registry.ts
|
|
14276
|
-
var registry_exports2 = {};
|
|
14277
|
-
__export(registry_exports2, {
|
|
14278
|
-
checkAgentHealth: () => checkAgentHealth,
|
|
14279
|
-
classifyError: () => classifyError,
|
|
14280
|
-
deregisterAgent: () => deregisterAgent,
|
|
14281
|
-
generateAgentId: () => generateAgentId,
|
|
14282
|
-
getAgentErrorHistory: () => getAgentErrorHistory,
|
|
14283
|
-
getAgentInstance: () => getAgentInstance,
|
|
14284
|
-
getHealthReport: () => getHealthReport,
|
|
14285
|
-
heartbeat: () => heartbeat,
|
|
14286
|
-
incrementTasksCompleted: () => incrementTasksCompleted,
|
|
14287
|
-
listAgentInstances: () => listAgentInstances,
|
|
14288
|
-
markCrashed: () => markCrashed,
|
|
14289
|
-
registerAgent: () => registerAgent,
|
|
14290
|
-
updateAgentStatus: () => updateAgentStatus
|
|
14291
|
-
});
|
|
14292
|
-
import { randomBytes } from "node:crypto";
|
|
14293
|
-
import { and as and3, eq as eq5, inArray as inArray4, lt as lt2, sql as sql8 } from "drizzle-orm";
|
|
14294
|
-
function generateAgentId() {
|
|
14295
|
-
const now = /* @__PURE__ */ new Date();
|
|
14296
|
-
const ts = now.toISOString().replace(/[-:T]/g, "").substring(0, 14);
|
|
14297
|
-
const hex = randomBytes(3).toString("hex");
|
|
14298
|
-
return `agt_${ts}_${hex}`;
|
|
14299
|
-
}
|
|
14300
|
-
async function registerAgent(opts, cwd) {
|
|
14301
|
-
const db = await getDb(cwd);
|
|
14302
|
-
const id = generateAgentId();
|
|
14303
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
14304
|
-
const row = {
|
|
14305
|
-
id,
|
|
14306
|
-
agentType: opts.agentType,
|
|
14307
|
-
status: "starting",
|
|
14308
|
-
sessionId: opts.sessionId ?? null,
|
|
14309
|
-
taskId: opts.taskId ?? null,
|
|
14310
|
-
startedAt: now,
|
|
14311
|
-
lastHeartbeat: now,
|
|
14312
|
-
stoppedAt: null,
|
|
14313
|
-
errorCount: 0,
|
|
14314
|
-
totalTasksCompleted: 0,
|
|
14315
|
-
capacity: "1.0",
|
|
14316
|
-
metadataJson: opts.metadata ? JSON.stringify(opts.metadata) : "{}",
|
|
14317
|
-
parentAgentId: opts.parentAgentId ?? null
|
|
14318
|
-
};
|
|
14319
|
-
await db.insert(agentInstances).values(row);
|
|
14320
|
-
return row;
|
|
14321
|
-
}
|
|
14322
|
-
async function deregisterAgent(id, cwd) {
|
|
14323
|
-
const db = await getDb(cwd);
|
|
14324
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
14325
|
-
const existing = await db.select().from(agentInstances).where(eq5(agentInstances.id, id)).get();
|
|
14326
|
-
if (!existing) return null;
|
|
14327
|
-
if (existing.status === "stopped") return existing;
|
|
14328
|
-
await db.update(agentInstances).set({ status: "stopped", stoppedAt: now }).where(eq5(agentInstances.id, id));
|
|
14329
|
-
return { ...existing, status: "stopped", stoppedAt: now };
|
|
14330
|
-
}
|
|
14331
|
-
async function heartbeat(id, cwd) {
|
|
14332
|
-
const db = await getDb(cwd);
|
|
14333
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
14334
|
-
const existing = await db.select().from(agentInstances).where(eq5(agentInstances.id, id)).get();
|
|
14335
|
-
if (!existing) return null;
|
|
14336
|
-
if (existing.status === "stopped" || existing.status === "crashed") {
|
|
14337
|
-
return existing.status;
|
|
14338
|
-
}
|
|
14339
|
-
await db.update(agentInstances).set({ lastHeartbeat: now }).where(eq5(agentInstances.id, id));
|
|
14340
|
-
return existing.status;
|
|
14341
|
-
}
|
|
14342
|
-
async function updateAgentStatus(id, opts, cwd) {
|
|
14343
|
-
const db = await getDb(cwd);
|
|
14344
|
-
const existing = await db.select().from(agentInstances).where(eq5(agentInstances.id, id)).get();
|
|
14345
|
-
if (!existing) return null;
|
|
14346
|
-
const updates = {
|
|
14347
|
-
status: opts.status
|
|
14348
|
-
};
|
|
14349
|
-
if (opts.taskId !== void 0) {
|
|
14350
|
-
updates.taskId = opts.taskId;
|
|
14351
|
-
}
|
|
14352
|
-
if (opts.status === "active") {
|
|
14353
|
-
updates.lastHeartbeat = (/* @__PURE__ */ new Date()).toISOString();
|
|
14354
|
-
}
|
|
14355
|
-
if (opts.status === "error" || opts.status === "crashed") {
|
|
14356
|
-
updates.errorCount = existing.errorCount + 1;
|
|
14357
|
-
if (opts.error) {
|
|
14358
|
-
const errorType = classifyError(new Error(opts.error));
|
|
14359
|
-
await db.insert(agentErrorLog).values({
|
|
14360
|
-
agentId: id,
|
|
14361
|
-
errorType,
|
|
14362
|
-
message: opts.error,
|
|
14363
|
-
occurredAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
14364
|
-
});
|
|
14365
|
-
}
|
|
14366
|
-
}
|
|
14367
|
-
if (opts.status === "stopped") {
|
|
14368
|
-
updates.stoppedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
14369
|
-
}
|
|
14370
|
-
await db.update(agentInstances).set(updates).where(eq5(agentInstances.id, id));
|
|
14371
|
-
return { ...existing, ...updates };
|
|
14372
|
-
}
|
|
14373
|
-
async function incrementTasksCompleted(id, cwd) {
|
|
14374
|
-
const db = await getDb(cwd);
|
|
14375
|
-
await db.update(agentInstances).set({ totalTasksCompleted: sql8`${agentInstances.totalTasksCompleted} + 1` }).where(eq5(agentInstances.id, id));
|
|
14376
|
-
}
|
|
14377
|
-
async function listAgentInstances(filters, cwd) {
|
|
14378
|
-
const db = await getDb(cwd);
|
|
14379
|
-
const conditions = [];
|
|
14380
|
-
if (filters?.status) {
|
|
14381
|
-
const statuses = Array.isArray(filters.status) ? filters.status : [filters.status];
|
|
14382
|
-
conditions.push(inArray4(agentInstances.status, statuses));
|
|
14383
|
-
}
|
|
14384
|
-
if (filters?.agentType) {
|
|
14385
|
-
const types = Array.isArray(filters.agentType) ? filters.agentType : [filters.agentType];
|
|
14386
|
-
conditions.push(inArray4(agentInstances.agentType, types));
|
|
14387
|
-
}
|
|
14388
|
-
if (filters?.sessionId) {
|
|
14389
|
-
conditions.push(eq5(agentInstances.sessionId, filters.sessionId));
|
|
14390
|
-
}
|
|
14391
|
-
if (filters?.parentAgentId) {
|
|
14392
|
-
conditions.push(eq5(agentInstances.parentAgentId, filters.parentAgentId));
|
|
14393
|
-
}
|
|
14394
|
-
if (conditions.length === 0) {
|
|
14395
|
-
return db.select().from(agentInstances).all();
|
|
14396
|
-
}
|
|
14397
|
-
return db.select().from(agentInstances).where(and3(...conditions)).all();
|
|
14398
|
-
}
|
|
14399
|
-
async function getAgentInstance(id, cwd) {
|
|
14400
|
-
const db = await getDb(cwd);
|
|
14401
|
-
const row = await db.select().from(agentInstances).where(eq5(agentInstances.id, id)).get();
|
|
14402
|
-
return row ?? null;
|
|
14403
|
-
}
|
|
14404
|
-
function classifyError(error40) {
|
|
14405
|
-
const message = error40 instanceof Error ? error40.message : String(error40);
|
|
14406
|
-
for (const pattern of RETRIABLE_PATTERNS) {
|
|
14407
|
-
if (pattern.test(message)) return "retriable";
|
|
14408
|
-
}
|
|
14409
|
-
for (const pattern of PERMANENT_PATTERNS) {
|
|
14410
|
-
if (pattern.test(message)) return "permanent";
|
|
14411
|
-
}
|
|
14412
|
-
return "unknown";
|
|
14413
|
-
}
|
|
14414
|
-
async function getAgentErrorHistory(agentId, cwd) {
|
|
14415
|
-
const db = await getDb(cwd);
|
|
14416
|
-
return db.select().from(agentErrorLog).where(eq5(agentErrorLog.agentId, agentId)).all();
|
|
14417
|
-
}
|
|
14418
|
-
async function checkAgentHealth(thresholdMs = 3e4, cwd) {
|
|
14419
|
-
const db = await getDb(cwd);
|
|
14420
|
-
const cutoff = new Date(Date.now() - thresholdMs).toISOString();
|
|
14421
|
-
return db.select().from(agentInstances).where(
|
|
14422
|
-
and3(
|
|
14423
|
-
inArray4(agentInstances.status, ["active", "idle", "starting"]),
|
|
14424
|
-
lt2(agentInstances.lastHeartbeat, cutoff)
|
|
14425
|
-
)
|
|
14426
|
-
).all();
|
|
14427
|
-
}
|
|
14428
|
-
async function markCrashed(id, reason, cwd) {
|
|
14429
|
-
return updateAgentStatus(
|
|
14430
|
-
id,
|
|
14431
|
-
{ status: "crashed", error: reason ?? "Heartbeat timeout \u2014 agent presumed crashed" },
|
|
14432
|
-
cwd
|
|
14433
|
-
);
|
|
14434
|
-
}
|
|
14435
|
-
async function getHealthReport(thresholdMs = 3e4, cwd) {
|
|
14436
|
-
const allAgents = await listAgentInstances(void 0, cwd);
|
|
14437
|
-
const staleAgents = await checkAgentHealth(thresholdMs, cwd);
|
|
14438
|
-
const report = {
|
|
14439
|
-
total: allAgents.length,
|
|
14440
|
-
active: 0,
|
|
14441
|
-
idle: 0,
|
|
14442
|
-
starting: 0,
|
|
14443
|
-
error: 0,
|
|
14444
|
-
crashed: 0,
|
|
14445
|
-
stopped: 0,
|
|
14446
|
-
totalErrors: 0,
|
|
14447
|
-
staleAgents
|
|
14448
|
-
};
|
|
14449
|
-
for (const agent of allAgents) {
|
|
14450
|
-
switch (agent.status) {
|
|
14451
|
-
case "active":
|
|
14452
|
-
report.active++;
|
|
14453
|
-
break;
|
|
14454
|
-
case "idle":
|
|
14455
|
-
report.idle++;
|
|
14456
|
-
break;
|
|
14457
|
-
case "starting":
|
|
14458
|
-
report.starting++;
|
|
14459
|
-
break;
|
|
14460
|
-
case "error":
|
|
14461
|
-
report.error++;
|
|
14462
|
-
break;
|
|
14463
|
-
case "crashed":
|
|
14464
|
-
report.crashed++;
|
|
14465
|
-
break;
|
|
14466
|
-
case "stopped":
|
|
14467
|
-
report.stopped++;
|
|
14468
|
-
break;
|
|
14469
|
-
}
|
|
14470
|
-
report.totalErrors += agent.errorCount;
|
|
14471
|
-
}
|
|
14472
|
-
return report;
|
|
14473
|
-
}
|
|
14474
|
-
var RETRIABLE_PATTERNS, PERMANENT_PATTERNS;
|
|
14475
|
-
var init_registry2 = __esm({
|
|
14476
|
-
"packages/core/src/agents/registry.ts"() {
|
|
14477
|
-
"use strict";
|
|
14478
|
-
init_sqlite2();
|
|
14479
|
-
init_agent_schema();
|
|
14480
|
-
RETRIABLE_PATTERNS = [
|
|
14481
|
-
/timeout/i,
|
|
14482
|
-
/ECONNREFUSED/,
|
|
14483
|
-
/ECONNRESET/,
|
|
14484
|
-
/EPIPE/,
|
|
14485
|
-
/ETIMEDOUT/,
|
|
14486
|
-
/rate.?limit/i,
|
|
14487
|
-
/429/,
|
|
14488
|
-
/503/,
|
|
14489
|
-
/502/,
|
|
14490
|
-
/SQLITE_BUSY/i,
|
|
14491
|
-
/database is locked/i,
|
|
14492
|
-
/temporarily unavailable/i,
|
|
14493
|
-
/too many requests/i,
|
|
14494
|
-
/network/i,
|
|
14495
|
-
/socket hang up/i
|
|
14496
|
-
];
|
|
14497
|
-
PERMANENT_PATTERNS = [
|
|
14498
|
-
/permission denied/i,
|
|
14499
|
-
/EACCES/,
|
|
14500
|
-
/authentication/i,
|
|
14501
|
-
/unauthorized/i,
|
|
14502
|
-
/401/,
|
|
14503
|
-
/403/,
|
|
14504
|
-
/404/,
|
|
14505
|
-
/not found/i,
|
|
14506
|
-
/invalid.*token/i,
|
|
14507
|
-
/SQLITE_CONSTRAINT/i,
|
|
14508
|
-
/syntax error/i,
|
|
14509
|
-
/type error/i,
|
|
14510
|
-
/reference error/i
|
|
14511
|
-
];
|
|
14512
|
-
}
|
|
14513
|
-
});
|
|
14514
|
-
|
|
14515
14275
|
// packages/core/src/store/brain-accessor.ts
|
|
14516
|
-
import { and as
|
|
14276
|
+
import { and as and3, asc as asc2, desc as desc2, eq as eq5, gte as gte2, or as or3 } from "drizzle-orm";
|
|
14517
14277
|
async function getBrainAccessor(cwd) {
|
|
14518
14278
|
const db = await getBrainDb(cwd);
|
|
14519
14279
|
return new BrainDataAccessor(db);
|
|
@@ -14533,30 +14293,30 @@ var init_brain_accessor = __esm({
|
|
|
14533
14293
|
// =========================================================================
|
|
14534
14294
|
async addDecision(row) {
|
|
14535
14295
|
await this.db.insert(brainDecisions).values(row);
|
|
14536
|
-
const result = await this.db.select().from(brainDecisions).where(
|
|
14296
|
+
const result = await this.db.select().from(brainDecisions).where(eq5(brainDecisions.id, row.id));
|
|
14537
14297
|
return result[0];
|
|
14538
14298
|
}
|
|
14539
14299
|
async getDecision(id) {
|
|
14540
|
-
const result = await this.db.select().from(brainDecisions).where(
|
|
14300
|
+
const result = await this.db.select().from(brainDecisions).where(eq5(brainDecisions.id, id));
|
|
14541
14301
|
return result[0] ?? null;
|
|
14542
14302
|
}
|
|
14543
14303
|
async findDecisions(params = {}) {
|
|
14544
14304
|
const conditions = [];
|
|
14545
14305
|
if (params.type) {
|
|
14546
|
-
conditions.push(
|
|
14306
|
+
conditions.push(eq5(brainDecisions.type, params.type));
|
|
14547
14307
|
}
|
|
14548
14308
|
if (params.confidence) {
|
|
14549
|
-
conditions.push(
|
|
14309
|
+
conditions.push(eq5(brainDecisions.confidence, params.confidence));
|
|
14550
14310
|
}
|
|
14551
14311
|
if (params.outcome) {
|
|
14552
|
-
conditions.push(
|
|
14312
|
+
conditions.push(eq5(brainDecisions.outcome, params.outcome));
|
|
14553
14313
|
}
|
|
14554
14314
|
if (params.contextTaskId) {
|
|
14555
|
-
conditions.push(
|
|
14315
|
+
conditions.push(eq5(brainDecisions.contextTaskId, params.contextTaskId));
|
|
14556
14316
|
}
|
|
14557
14317
|
let query = this.db.select().from(brainDecisions).orderBy(desc2(brainDecisions.createdAt));
|
|
14558
14318
|
if (conditions.length > 0) {
|
|
14559
|
-
query = query.where(
|
|
14319
|
+
query = query.where(and3(...conditions));
|
|
14560
14320
|
}
|
|
14561
14321
|
if (params.limit) {
|
|
14562
14322
|
query = query.limit(params.limit);
|
|
@@ -14564,34 +14324,34 @@ var init_brain_accessor = __esm({
|
|
|
14564
14324
|
return query;
|
|
14565
14325
|
}
|
|
14566
14326
|
async updateDecision(id, updates) {
|
|
14567
|
-
await this.db.update(brainDecisions).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(
|
|
14327
|
+
await this.db.update(brainDecisions).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq5(brainDecisions.id, id));
|
|
14568
14328
|
}
|
|
14569
14329
|
// =========================================================================
|
|
14570
14330
|
// Patterns CRUD
|
|
14571
14331
|
// =========================================================================
|
|
14572
14332
|
async addPattern(row) {
|
|
14573
14333
|
await this.db.insert(brainPatterns).values(row);
|
|
14574
|
-
const result = await this.db.select().from(brainPatterns).where(
|
|
14334
|
+
const result = await this.db.select().from(brainPatterns).where(eq5(brainPatterns.id, row.id));
|
|
14575
14335
|
return result[0];
|
|
14576
14336
|
}
|
|
14577
14337
|
async getPattern(id) {
|
|
14578
|
-
const result = await this.db.select().from(brainPatterns).where(
|
|
14338
|
+
const result = await this.db.select().from(brainPatterns).where(eq5(brainPatterns.id, id));
|
|
14579
14339
|
return result[0] ?? null;
|
|
14580
14340
|
}
|
|
14581
14341
|
async findPatterns(params = {}) {
|
|
14582
14342
|
const conditions = [];
|
|
14583
14343
|
if (params.type) {
|
|
14584
|
-
conditions.push(
|
|
14344
|
+
conditions.push(eq5(brainPatterns.type, params.type));
|
|
14585
14345
|
}
|
|
14586
14346
|
if (params.impact) {
|
|
14587
|
-
conditions.push(
|
|
14347
|
+
conditions.push(eq5(brainPatterns.impact, params.impact));
|
|
14588
14348
|
}
|
|
14589
14349
|
if (params.minFrequency !== void 0) {
|
|
14590
14350
|
conditions.push(gte2(brainPatterns.frequency, params.minFrequency));
|
|
14591
14351
|
}
|
|
14592
14352
|
let query = this.db.select().from(brainPatterns).orderBy(desc2(brainPatterns.frequency));
|
|
14593
14353
|
if (conditions.length > 0) {
|
|
14594
|
-
query = query.where(
|
|
14354
|
+
query = query.where(and3(...conditions));
|
|
14595
14355
|
}
|
|
14596
14356
|
if (params.limit) {
|
|
14597
14357
|
query = query.limit(params.limit);
|
|
@@ -14599,18 +14359,18 @@ var init_brain_accessor = __esm({
|
|
|
14599
14359
|
return query;
|
|
14600
14360
|
}
|
|
14601
14361
|
async updatePattern(id, updates) {
|
|
14602
|
-
await this.db.update(brainPatterns).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(
|
|
14362
|
+
await this.db.update(brainPatterns).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq5(brainPatterns.id, id));
|
|
14603
14363
|
}
|
|
14604
14364
|
// =========================================================================
|
|
14605
14365
|
// Learnings CRUD
|
|
14606
14366
|
// =========================================================================
|
|
14607
14367
|
async addLearning(row) {
|
|
14608
14368
|
await this.db.insert(brainLearnings).values(row);
|
|
14609
|
-
const result = await this.db.select().from(brainLearnings).where(
|
|
14369
|
+
const result = await this.db.select().from(brainLearnings).where(eq5(brainLearnings.id, row.id));
|
|
14610
14370
|
return result[0];
|
|
14611
14371
|
}
|
|
14612
14372
|
async getLearning(id) {
|
|
14613
|
-
const result = await this.db.select().from(brainLearnings).where(
|
|
14373
|
+
const result = await this.db.select().from(brainLearnings).where(eq5(brainLearnings.id, id));
|
|
14614
14374
|
return result[0] ?? null;
|
|
14615
14375
|
}
|
|
14616
14376
|
async findLearnings(params = {}) {
|
|
@@ -14619,11 +14379,11 @@ var init_brain_accessor = __esm({
|
|
|
14619
14379
|
conditions.push(gte2(brainLearnings.confidence, params.minConfidence));
|
|
14620
14380
|
}
|
|
14621
14381
|
if (params.actionable !== void 0) {
|
|
14622
|
-
conditions.push(
|
|
14382
|
+
conditions.push(eq5(brainLearnings.actionable, params.actionable));
|
|
14623
14383
|
}
|
|
14624
14384
|
let query = this.db.select().from(brainLearnings).orderBy(desc2(brainLearnings.confidence));
|
|
14625
14385
|
if (conditions.length > 0) {
|
|
14626
|
-
query = query.where(
|
|
14386
|
+
query = query.where(and3(...conditions));
|
|
14627
14387
|
}
|
|
14628
14388
|
if (params.limit) {
|
|
14629
14389
|
query = query.limit(params.limit);
|
|
@@ -14631,37 +14391,37 @@ var init_brain_accessor = __esm({
|
|
|
14631
14391
|
return query;
|
|
14632
14392
|
}
|
|
14633
14393
|
async updateLearning(id, updates) {
|
|
14634
|
-
await this.db.update(brainLearnings).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(
|
|
14394
|
+
await this.db.update(brainLearnings).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq5(brainLearnings.id, id));
|
|
14635
14395
|
}
|
|
14636
14396
|
// =========================================================================
|
|
14637
14397
|
// Observations CRUD
|
|
14638
14398
|
// =========================================================================
|
|
14639
14399
|
async addObservation(row) {
|
|
14640
14400
|
await this.db.insert(brainObservations).values(row);
|
|
14641
|
-
const result = await this.db.select().from(brainObservations).where(
|
|
14401
|
+
const result = await this.db.select().from(brainObservations).where(eq5(brainObservations.id, row.id));
|
|
14642
14402
|
return result[0];
|
|
14643
14403
|
}
|
|
14644
14404
|
async getObservation(id) {
|
|
14645
|
-
const result = await this.db.select().from(brainObservations).where(
|
|
14405
|
+
const result = await this.db.select().from(brainObservations).where(eq5(brainObservations.id, id));
|
|
14646
14406
|
return result[0] ?? null;
|
|
14647
14407
|
}
|
|
14648
14408
|
async findObservations(params = {}) {
|
|
14649
14409
|
const conditions = [];
|
|
14650
14410
|
if (params.type) {
|
|
14651
|
-
conditions.push(
|
|
14411
|
+
conditions.push(eq5(brainObservations.type, params.type));
|
|
14652
14412
|
}
|
|
14653
14413
|
if (params.project) {
|
|
14654
|
-
conditions.push(
|
|
14414
|
+
conditions.push(eq5(brainObservations.project, params.project));
|
|
14655
14415
|
}
|
|
14656
14416
|
if (params.sourceType) {
|
|
14657
|
-
conditions.push(
|
|
14417
|
+
conditions.push(eq5(brainObservations.sourceType, params.sourceType));
|
|
14658
14418
|
}
|
|
14659
14419
|
if (params.sourceSessionId) {
|
|
14660
|
-
conditions.push(
|
|
14420
|
+
conditions.push(eq5(brainObservations.sourceSessionId, params.sourceSessionId));
|
|
14661
14421
|
}
|
|
14662
14422
|
let query = this.db.select().from(brainObservations).orderBy(desc2(brainObservations.createdAt));
|
|
14663
14423
|
if (conditions.length > 0) {
|
|
14664
|
-
query = query.where(
|
|
14424
|
+
query = query.where(and3(...conditions));
|
|
14665
14425
|
}
|
|
14666
14426
|
if (params.limit) {
|
|
14667
14427
|
query = query.limit(params.limit);
|
|
@@ -14669,7 +14429,7 @@ var init_brain_accessor = __esm({
|
|
|
14669
14429
|
return query;
|
|
14670
14430
|
}
|
|
14671
14431
|
async updateObservation(id, updates) {
|
|
14672
|
-
await this.db.update(brainObservations).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(
|
|
14432
|
+
await this.db.update(brainObservations).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq5(brainObservations.id, id));
|
|
14673
14433
|
}
|
|
14674
14434
|
// =========================================================================
|
|
14675
14435
|
// Memory Links CRUD
|
|
@@ -14679,22 +14439,22 @@ var init_brain_accessor = __esm({
|
|
|
14679
14439
|
}
|
|
14680
14440
|
async getLinksForMemory(memoryType, memoryId) {
|
|
14681
14441
|
return this.db.select().from(brainMemoryLinks).where(
|
|
14682
|
-
|
|
14683
|
-
|
|
14684
|
-
|
|
14442
|
+
and3(
|
|
14443
|
+
eq5(brainMemoryLinks.memoryType, memoryType),
|
|
14444
|
+
eq5(brainMemoryLinks.memoryId, memoryId)
|
|
14685
14445
|
)
|
|
14686
14446
|
).orderBy(asc2(brainMemoryLinks.createdAt));
|
|
14687
14447
|
}
|
|
14688
14448
|
async getLinksForTask(taskId) {
|
|
14689
|
-
return this.db.select().from(brainMemoryLinks).where(
|
|
14449
|
+
return this.db.select().from(brainMemoryLinks).where(eq5(brainMemoryLinks.taskId, taskId)).orderBy(asc2(brainMemoryLinks.createdAt));
|
|
14690
14450
|
}
|
|
14691
14451
|
async removeLink(memoryType, memoryId, taskId, linkType) {
|
|
14692
14452
|
await this.db.delete(brainMemoryLinks).where(
|
|
14693
|
-
|
|
14694
|
-
|
|
14695
|
-
|
|
14696
|
-
|
|
14697
|
-
|
|
14453
|
+
and3(
|
|
14454
|
+
eq5(brainMemoryLinks.memoryType, memoryType),
|
|
14455
|
+
eq5(brainMemoryLinks.memoryId, memoryId),
|
|
14456
|
+
eq5(brainMemoryLinks.taskId, taskId),
|
|
14457
|
+
eq5(brainMemoryLinks.linkType, linkType)
|
|
14698
14458
|
)
|
|
14699
14459
|
);
|
|
14700
14460
|
}
|
|
@@ -14703,27 +14463,27 @@ var init_brain_accessor = __esm({
|
|
|
14703
14463
|
// =========================================================================
|
|
14704
14464
|
async addStickyNote(row) {
|
|
14705
14465
|
await this.db.insert(brainStickyNotes).values(row);
|
|
14706
|
-
const result = await this.db.select().from(brainStickyNotes).where(
|
|
14466
|
+
const result = await this.db.select().from(brainStickyNotes).where(eq5(brainStickyNotes.id, row.id));
|
|
14707
14467
|
return result[0];
|
|
14708
14468
|
}
|
|
14709
14469
|
async getStickyNote(id) {
|
|
14710
|
-
const result = await this.db.select().from(brainStickyNotes).where(
|
|
14470
|
+
const result = await this.db.select().from(brainStickyNotes).where(eq5(brainStickyNotes.id, id));
|
|
14711
14471
|
return result[0] ?? null;
|
|
14712
14472
|
}
|
|
14713
14473
|
async findStickyNotes(params = {}) {
|
|
14714
14474
|
const conditions = [];
|
|
14715
14475
|
if (params.status) {
|
|
14716
|
-
conditions.push(
|
|
14476
|
+
conditions.push(eq5(brainStickyNotes.status, params.status));
|
|
14717
14477
|
}
|
|
14718
14478
|
if (params.color) {
|
|
14719
|
-
conditions.push(
|
|
14479
|
+
conditions.push(eq5(brainStickyNotes.color, params.color));
|
|
14720
14480
|
}
|
|
14721
14481
|
if (params.priority) {
|
|
14722
|
-
conditions.push(
|
|
14482
|
+
conditions.push(eq5(brainStickyNotes.priority, params.priority));
|
|
14723
14483
|
}
|
|
14724
14484
|
let query = this.db.select().from(brainStickyNotes).orderBy(desc2(brainStickyNotes.createdAt));
|
|
14725
14485
|
if (conditions.length > 0) {
|
|
14726
|
-
query = query.where(
|
|
14486
|
+
query = query.where(and3(...conditions));
|
|
14727
14487
|
}
|
|
14728
14488
|
if (params.limit) {
|
|
14729
14489
|
query = query.limit(params.limit);
|
|
@@ -14731,31 +14491,31 @@ var init_brain_accessor = __esm({
|
|
|
14731
14491
|
return query;
|
|
14732
14492
|
}
|
|
14733
14493
|
async updateStickyNote(id, updates) {
|
|
14734
|
-
await this.db.update(brainStickyNotes).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(
|
|
14494
|
+
await this.db.update(brainStickyNotes).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq5(brainStickyNotes.id, id));
|
|
14735
14495
|
}
|
|
14736
14496
|
async deleteStickyNote(id) {
|
|
14737
|
-
await this.db.delete(brainStickyNotes).where(
|
|
14497
|
+
await this.db.delete(brainStickyNotes).where(eq5(brainStickyNotes.id, id));
|
|
14738
14498
|
}
|
|
14739
14499
|
// =========================================================================
|
|
14740
14500
|
// PageIndex Node CRUD (T5383)
|
|
14741
14501
|
// =========================================================================
|
|
14742
14502
|
async addPageNode(node) {
|
|
14743
14503
|
await this.db.insert(brainPageNodes).values(node);
|
|
14744
|
-
const result = await this.db.select().from(brainPageNodes).where(
|
|
14504
|
+
const result = await this.db.select().from(brainPageNodes).where(eq5(brainPageNodes.id, node.id));
|
|
14745
14505
|
return result[0];
|
|
14746
14506
|
}
|
|
14747
14507
|
async getPageNode(id) {
|
|
14748
|
-
const result = await this.db.select().from(brainPageNodes).where(
|
|
14508
|
+
const result = await this.db.select().from(brainPageNodes).where(eq5(brainPageNodes.id, id));
|
|
14749
14509
|
return result[0] ?? null;
|
|
14750
14510
|
}
|
|
14751
14511
|
async findPageNodes(params = {}) {
|
|
14752
14512
|
const conditions = [];
|
|
14753
14513
|
if (params.nodeType) {
|
|
14754
|
-
conditions.push(
|
|
14514
|
+
conditions.push(eq5(brainPageNodes.nodeType, params.nodeType));
|
|
14755
14515
|
}
|
|
14756
14516
|
let query = this.db.select().from(brainPageNodes).orderBy(desc2(brainPageNodes.createdAt));
|
|
14757
14517
|
if (conditions.length > 0) {
|
|
14758
|
-
query = query.where(
|
|
14518
|
+
query = query.where(and3(...conditions));
|
|
14759
14519
|
}
|
|
14760
14520
|
if (params.limit) {
|
|
14761
14521
|
query = query.limit(params.limit);
|
|
@@ -14764,9 +14524,9 @@ var init_brain_accessor = __esm({
|
|
|
14764
14524
|
}
|
|
14765
14525
|
async removePageNode(id) {
|
|
14766
14526
|
await this.db.delete(brainPageEdges).where(
|
|
14767
|
-
or3(
|
|
14527
|
+
or3(eq5(brainPageEdges.fromId, id), eq5(brainPageEdges.toId, id))
|
|
14768
14528
|
);
|
|
14769
|
-
await this.db.delete(brainPageNodes).where(
|
|
14529
|
+
await this.db.delete(brainPageNodes).where(eq5(brainPageNodes.id, id));
|
|
14770
14530
|
}
|
|
14771
14531
|
// =========================================================================
|
|
14772
14532
|
// PageIndex Edge CRUD (T5383)
|
|
@@ -14774,34 +14534,34 @@ var init_brain_accessor = __esm({
|
|
|
14774
14534
|
async addPageEdge(edge) {
|
|
14775
14535
|
await this.db.insert(brainPageEdges).values(edge);
|
|
14776
14536
|
const result = await this.db.select().from(brainPageEdges).where(
|
|
14777
|
-
|
|
14778
|
-
|
|
14779
|
-
|
|
14780
|
-
|
|
14537
|
+
and3(
|
|
14538
|
+
eq5(brainPageEdges.fromId, edge.fromId),
|
|
14539
|
+
eq5(brainPageEdges.toId, edge.toId),
|
|
14540
|
+
eq5(brainPageEdges.edgeType, edge.edgeType)
|
|
14781
14541
|
)
|
|
14782
14542
|
);
|
|
14783
14543
|
return result[0];
|
|
14784
14544
|
}
|
|
14785
14545
|
async getPageEdges(nodeId, direction = "both") {
|
|
14786
14546
|
if (direction === "out") {
|
|
14787
|
-
return this.db.select().from(brainPageEdges).where(
|
|
14547
|
+
return this.db.select().from(brainPageEdges).where(eq5(brainPageEdges.fromId, nodeId)).orderBy(asc2(brainPageEdges.createdAt));
|
|
14788
14548
|
}
|
|
14789
14549
|
if (direction === "in") {
|
|
14790
|
-
return this.db.select().from(brainPageEdges).where(
|
|
14550
|
+
return this.db.select().from(brainPageEdges).where(eq5(brainPageEdges.toId, nodeId)).orderBy(asc2(brainPageEdges.createdAt));
|
|
14791
14551
|
}
|
|
14792
14552
|
return this.db.select().from(brainPageEdges).where(
|
|
14793
14553
|
or3(
|
|
14794
|
-
|
|
14795
|
-
|
|
14554
|
+
eq5(brainPageEdges.fromId, nodeId),
|
|
14555
|
+
eq5(brainPageEdges.toId, nodeId)
|
|
14796
14556
|
)
|
|
14797
14557
|
).orderBy(asc2(brainPageEdges.createdAt));
|
|
14798
14558
|
}
|
|
14799
14559
|
async getNeighbors(nodeId, edgeType) {
|
|
14800
|
-
const conditions = [
|
|
14560
|
+
const conditions = [eq5(brainPageEdges.fromId, nodeId)];
|
|
14801
14561
|
if (edgeType) {
|
|
14802
|
-
conditions.push(
|
|
14562
|
+
conditions.push(eq5(brainPageEdges.edgeType, edgeType));
|
|
14803
14563
|
}
|
|
14804
|
-
const edges = await this.db.select().from(brainPageEdges).where(
|
|
14564
|
+
const edges = await this.db.select().from(brainPageEdges).where(and3(...conditions));
|
|
14805
14565
|
if (edges.length === 0) return [];
|
|
14806
14566
|
const neighborIds = edges.map((e) => e.toId);
|
|
14807
14567
|
const nodes = [];
|
|
@@ -14813,10 +14573,10 @@ var init_brain_accessor = __esm({
|
|
|
14813
14573
|
}
|
|
14814
14574
|
async removePageEdge(fromId, toId, edgeType) {
|
|
14815
14575
|
await this.db.delete(brainPageEdges).where(
|
|
14816
|
-
|
|
14817
|
-
|
|
14818
|
-
|
|
14819
|
-
|
|
14576
|
+
and3(
|
|
14577
|
+
eq5(brainPageEdges.fromId, fromId),
|
|
14578
|
+
eq5(brainPageEdges.toId, toId),
|
|
14579
|
+
eq5(brainPageEdges.edgeType, edgeType)
|
|
14820
14580
|
)
|
|
14821
14581
|
);
|
|
14822
14582
|
}
|
|
@@ -14824,6 +14584,246 @@ var init_brain_accessor = __esm({
|
|
|
14824
14584
|
}
|
|
14825
14585
|
});
|
|
14826
14586
|
|
|
14587
|
+
// packages/core/src/agents/registry.ts
|
|
14588
|
+
var registry_exports2 = {};
|
|
14589
|
+
__export(registry_exports2, {
|
|
14590
|
+
checkAgentHealth: () => checkAgentHealth,
|
|
14591
|
+
classifyError: () => classifyError,
|
|
14592
|
+
deregisterAgent: () => deregisterAgent,
|
|
14593
|
+
generateAgentId: () => generateAgentId,
|
|
14594
|
+
getAgentErrorHistory: () => getAgentErrorHistory,
|
|
14595
|
+
getAgentInstance: () => getAgentInstance,
|
|
14596
|
+
getHealthReport: () => getHealthReport,
|
|
14597
|
+
heartbeat: () => heartbeat,
|
|
14598
|
+
incrementTasksCompleted: () => incrementTasksCompleted,
|
|
14599
|
+
listAgentInstances: () => listAgentInstances,
|
|
14600
|
+
markCrashed: () => markCrashed,
|
|
14601
|
+
registerAgent: () => registerAgent,
|
|
14602
|
+
updateAgentStatus: () => updateAgentStatus
|
|
14603
|
+
});
|
|
14604
|
+
import { randomBytes as randomBytes2 } from "node:crypto";
|
|
14605
|
+
import { and as and4, eq as eq6, inArray as inArray4, lt as lt2, sql as sql8 } from "drizzle-orm";
|
|
14606
|
+
function generateAgentId() {
|
|
14607
|
+
const now = /* @__PURE__ */ new Date();
|
|
14608
|
+
const ts = now.toISOString().replace(/[-:T]/g, "").substring(0, 14);
|
|
14609
|
+
const hex = randomBytes2(3).toString("hex");
|
|
14610
|
+
return `agt_${ts}_${hex}`;
|
|
14611
|
+
}
|
|
14612
|
+
async function registerAgent(opts, cwd) {
|
|
14613
|
+
const db = await getDb(cwd);
|
|
14614
|
+
const id = generateAgentId();
|
|
14615
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
14616
|
+
const row = {
|
|
14617
|
+
id,
|
|
14618
|
+
agentType: opts.agentType,
|
|
14619
|
+
status: "starting",
|
|
14620
|
+
sessionId: opts.sessionId ?? null,
|
|
14621
|
+
taskId: opts.taskId ?? null,
|
|
14622
|
+
startedAt: now,
|
|
14623
|
+
lastHeartbeat: now,
|
|
14624
|
+
stoppedAt: null,
|
|
14625
|
+
errorCount: 0,
|
|
14626
|
+
totalTasksCompleted: 0,
|
|
14627
|
+
capacity: "1.0",
|
|
14628
|
+
metadataJson: opts.metadata ? JSON.stringify(opts.metadata) : "{}",
|
|
14629
|
+
parentAgentId: opts.parentAgentId ?? null
|
|
14630
|
+
};
|
|
14631
|
+
await db.insert(agentInstances).values(row);
|
|
14632
|
+
return row;
|
|
14633
|
+
}
|
|
14634
|
+
async function deregisterAgent(id, cwd) {
|
|
14635
|
+
const db = await getDb(cwd);
|
|
14636
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
14637
|
+
const existing = await db.select().from(agentInstances).where(eq6(agentInstances.id, id)).get();
|
|
14638
|
+
if (!existing) return null;
|
|
14639
|
+
if (existing.status === "stopped") return existing;
|
|
14640
|
+
await db.update(agentInstances).set({ status: "stopped", stoppedAt: now }).where(eq6(agentInstances.id, id));
|
|
14641
|
+
return { ...existing, status: "stopped", stoppedAt: now };
|
|
14642
|
+
}
|
|
14643
|
+
async function heartbeat(id, cwd) {
|
|
14644
|
+
const db = await getDb(cwd);
|
|
14645
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
14646
|
+
const existing = await db.select().from(agentInstances).where(eq6(agentInstances.id, id)).get();
|
|
14647
|
+
if (!existing) return null;
|
|
14648
|
+
if (existing.status === "stopped" || existing.status === "crashed") {
|
|
14649
|
+
return existing.status;
|
|
14650
|
+
}
|
|
14651
|
+
await db.update(agentInstances).set({ lastHeartbeat: now }).where(eq6(agentInstances.id, id));
|
|
14652
|
+
return existing.status;
|
|
14653
|
+
}
|
|
14654
|
+
async function updateAgentStatus(id, opts, cwd) {
|
|
14655
|
+
const db = await getDb(cwd);
|
|
14656
|
+
const existing = await db.select().from(agentInstances).where(eq6(agentInstances.id, id)).get();
|
|
14657
|
+
if (!existing) return null;
|
|
14658
|
+
const updates = {
|
|
14659
|
+
status: opts.status
|
|
14660
|
+
};
|
|
14661
|
+
if (opts.taskId !== void 0) {
|
|
14662
|
+
updates.taskId = opts.taskId;
|
|
14663
|
+
}
|
|
14664
|
+
if (opts.status === "active") {
|
|
14665
|
+
updates.lastHeartbeat = (/* @__PURE__ */ new Date()).toISOString();
|
|
14666
|
+
}
|
|
14667
|
+
if (opts.status === "error" || opts.status === "crashed") {
|
|
14668
|
+
updates.errorCount = existing.errorCount + 1;
|
|
14669
|
+
if (opts.error) {
|
|
14670
|
+
const errorType = classifyError(new Error(opts.error));
|
|
14671
|
+
await db.insert(agentErrorLog).values({
|
|
14672
|
+
agentId: id,
|
|
14673
|
+
errorType,
|
|
14674
|
+
message: opts.error,
|
|
14675
|
+
occurredAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
14676
|
+
});
|
|
14677
|
+
}
|
|
14678
|
+
}
|
|
14679
|
+
if (opts.status === "stopped") {
|
|
14680
|
+
updates.stoppedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
14681
|
+
}
|
|
14682
|
+
await db.update(agentInstances).set(updates).where(eq6(agentInstances.id, id));
|
|
14683
|
+
return { ...existing, ...updates };
|
|
14684
|
+
}
|
|
14685
|
+
async function incrementTasksCompleted(id, cwd) {
|
|
14686
|
+
const db = await getDb(cwd);
|
|
14687
|
+
await db.update(agentInstances).set({ totalTasksCompleted: sql8`${agentInstances.totalTasksCompleted} + 1` }).where(eq6(agentInstances.id, id));
|
|
14688
|
+
}
|
|
14689
|
+
async function listAgentInstances(filters, cwd) {
|
|
14690
|
+
const db = await getDb(cwd);
|
|
14691
|
+
const conditions = [];
|
|
14692
|
+
if (filters?.status) {
|
|
14693
|
+
const statuses = Array.isArray(filters.status) ? filters.status : [filters.status];
|
|
14694
|
+
conditions.push(inArray4(agentInstances.status, statuses));
|
|
14695
|
+
}
|
|
14696
|
+
if (filters?.agentType) {
|
|
14697
|
+
const types = Array.isArray(filters.agentType) ? filters.agentType : [filters.agentType];
|
|
14698
|
+
conditions.push(inArray4(agentInstances.agentType, types));
|
|
14699
|
+
}
|
|
14700
|
+
if (filters?.sessionId) {
|
|
14701
|
+
conditions.push(eq6(agentInstances.sessionId, filters.sessionId));
|
|
14702
|
+
}
|
|
14703
|
+
if (filters?.parentAgentId) {
|
|
14704
|
+
conditions.push(eq6(agentInstances.parentAgentId, filters.parentAgentId));
|
|
14705
|
+
}
|
|
14706
|
+
if (conditions.length === 0) {
|
|
14707
|
+
return db.select().from(agentInstances).all();
|
|
14708
|
+
}
|
|
14709
|
+
return db.select().from(agentInstances).where(and4(...conditions)).all();
|
|
14710
|
+
}
|
|
14711
|
+
async function getAgentInstance(id, cwd) {
|
|
14712
|
+
const db = await getDb(cwd);
|
|
14713
|
+
const row = await db.select().from(agentInstances).where(eq6(agentInstances.id, id)).get();
|
|
14714
|
+
return row ?? null;
|
|
14715
|
+
}
|
|
14716
|
+
function classifyError(error40) {
|
|
14717
|
+
const message = error40 instanceof Error ? error40.message : String(error40);
|
|
14718
|
+
for (const pattern of RETRIABLE_PATTERNS) {
|
|
14719
|
+
if (pattern.test(message)) return "retriable";
|
|
14720
|
+
}
|
|
14721
|
+
for (const pattern of PERMANENT_PATTERNS) {
|
|
14722
|
+
if (pattern.test(message)) return "permanent";
|
|
14723
|
+
}
|
|
14724
|
+
return "unknown";
|
|
14725
|
+
}
|
|
14726
|
+
async function getAgentErrorHistory(agentId, cwd) {
|
|
14727
|
+
const db = await getDb(cwd);
|
|
14728
|
+
return db.select().from(agentErrorLog).where(eq6(agentErrorLog.agentId, agentId)).all();
|
|
14729
|
+
}
|
|
14730
|
+
async function checkAgentHealth(thresholdMs = 3e4, cwd) {
|
|
14731
|
+
const db = await getDb(cwd);
|
|
14732
|
+
const cutoff = new Date(Date.now() - thresholdMs).toISOString();
|
|
14733
|
+
return db.select().from(agentInstances).where(
|
|
14734
|
+
and4(
|
|
14735
|
+
inArray4(agentInstances.status, ["active", "idle", "starting"]),
|
|
14736
|
+
lt2(agentInstances.lastHeartbeat, cutoff)
|
|
14737
|
+
)
|
|
14738
|
+
).all();
|
|
14739
|
+
}
|
|
14740
|
+
async function markCrashed(id, reason, cwd) {
|
|
14741
|
+
return updateAgentStatus(
|
|
14742
|
+
id,
|
|
14743
|
+
{ status: "crashed", error: reason ?? "Heartbeat timeout \u2014 agent presumed crashed" },
|
|
14744
|
+
cwd
|
|
14745
|
+
);
|
|
14746
|
+
}
|
|
14747
|
+
async function getHealthReport(thresholdMs = 3e4, cwd) {
|
|
14748
|
+
const allAgents = await listAgentInstances(void 0, cwd);
|
|
14749
|
+
const staleAgents = await checkAgentHealth(thresholdMs, cwd);
|
|
14750
|
+
const report = {
|
|
14751
|
+
total: allAgents.length,
|
|
14752
|
+
active: 0,
|
|
14753
|
+
idle: 0,
|
|
14754
|
+
starting: 0,
|
|
14755
|
+
error: 0,
|
|
14756
|
+
crashed: 0,
|
|
14757
|
+
stopped: 0,
|
|
14758
|
+
totalErrors: 0,
|
|
14759
|
+
staleAgents
|
|
14760
|
+
};
|
|
14761
|
+
for (const agent of allAgents) {
|
|
14762
|
+
switch (agent.status) {
|
|
14763
|
+
case "active":
|
|
14764
|
+
report.active++;
|
|
14765
|
+
break;
|
|
14766
|
+
case "idle":
|
|
14767
|
+
report.idle++;
|
|
14768
|
+
break;
|
|
14769
|
+
case "starting":
|
|
14770
|
+
report.starting++;
|
|
14771
|
+
break;
|
|
14772
|
+
case "error":
|
|
14773
|
+
report.error++;
|
|
14774
|
+
break;
|
|
14775
|
+
case "crashed":
|
|
14776
|
+
report.crashed++;
|
|
14777
|
+
break;
|
|
14778
|
+
case "stopped":
|
|
14779
|
+
report.stopped++;
|
|
14780
|
+
break;
|
|
14781
|
+
}
|
|
14782
|
+
report.totalErrors += agent.errorCount;
|
|
14783
|
+
}
|
|
14784
|
+
return report;
|
|
14785
|
+
}
|
|
14786
|
+
var RETRIABLE_PATTERNS, PERMANENT_PATTERNS;
|
|
14787
|
+
var init_registry2 = __esm({
|
|
14788
|
+
"packages/core/src/agents/registry.ts"() {
|
|
14789
|
+
"use strict";
|
|
14790
|
+
init_sqlite2();
|
|
14791
|
+
init_agent_schema();
|
|
14792
|
+
RETRIABLE_PATTERNS = [
|
|
14793
|
+
/timeout/i,
|
|
14794
|
+
/ECONNREFUSED/,
|
|
14795
|
+
/ECONNRESET/,
|
|
14796
|
+
/EPIPE/,
|
|
14797
|
+
/ETIMEDOUT/,
|
|
14798
|
+
/rate.?limit/i,
|
|
14799
|
+
/429/,
|
|
14800
|
+
/503/,
|
|
14801
|
+
/502/,
|
|
14802
|
+
/SQLITE_BUSY/i,
|
|
14803
|
+
/database is locked/i,
|
|
14804
|
+
/temporarily unavailable/i,
|
|
14805
|
+
/too many requests/i,
|
|
14806
|
+
/network/i,
|
|
14807
|
+
/socket hang up/i
|
|
14808
|
+
];
|
|
14809
|
+
PERMANENT_PATTERNS = [
|
|
14810
|
+
/permission denied/i,
|
|
14811
|
+
/EACCES/,
|
|
14812
|
+
/authentication/i,
|
|
14813
|
+
/unauthorized/i,
|
|
14814
|
+
/401/,
|
|
14815
|
+
/403/,
|
|
14816
|
+
/404/,
|
|
14817
|
+
/not found/i,
|
|
14818
|
+
/invalid.*token/i,
|
|
14819
|
+
/SQLITE_CONSTRAINT/i,
|
|
14820
|
+
/syntax error/i,
|
|
14821
|
+
/type error/i,
|
|
14822
|
+
/reference error/i
|
|
14823
|
+
];
|
|
14824
|
+
}
|
|
14825
|
+
});
|
|
14826
|
+
|
|
14827
14827
|
// packages/core/src/store/project-detect.ts
|
|
14828
14828
|
var project_detect_exports = {};
|
|
14829
14829
|
__export(project_detect_exports, {
|
|
@@ -17866,19 +17866,19 @@ async function queryAudit(options) {
|
|
|
17866
17866
|
try {
|
|
17867
17867
|
const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
17868
17868
|
const { auditLog: auditLog2 } = await Promise.resolve().then(() => (init_tasks_schema(), tasks_schema_exports));
|
|
17869
|
-
const { and:
|
|
17869
|
+
const { and: and9, eq: eq12, gte: gte3, or: or4 } = await import("drizzle-orm");
|
|
17870
17870
|
const db = await getDb3(process.cwd());
|
|
17871
17871
|
const conditions = [];
|
|
17872
|
-
if (options?.sessionId) conditions.push(
|
|
17873
|
-
if (options?.domain) conditions.push(
|
|
17872
|
+
if (options?.sessionId) conditions.push(eq12(auditLog2.sessionId, options.sessionId));
|
|
17873
|
+
if (options?.domain) conditions.push(eq12(auditLog2.domain, options.domain));
|
|
17874
17874
|
if (options?.operation)
|
|
17875
17875
|
conditions.push(
|
|
17876
|
-
or4(
|
|
17876
|
+
or4(eq12(auditLog2.operation, options.operation), eq12(auditLog2.action, options.operation))
|
|
17877
17877
|
);
|
|
17878
|
-
if (options?.taskId) conditions.push(
|
|
17878
|
+
if (options?.taskId) conditions.push(eq12(auditLog2.taskId, options.taskId));
|
|
17879
17879
|
if (options?.since) conditions.push(gte3(auditLog2.timestamp, options.since));
|
|
17880
17880
|
const limit = options?.limit ?? 1e3;
|
|
17881
|
-
const rows = await db.select().from(auditLog2).where(conditions.length > 0 ?
|
|
17881
|
+
const rows = await db.select().from(auditLog2).where(conditions.length > 0 ? and9(...conditions) : void 0).orderBy(auditLog2.timestamp).limit(limit);
|
|
17882
17882
|
return rows.map((row) => ({
|
|
17883
17883
|
timestamp: row.timestamp,
|
|
17884
17884
|
sessionId: row.sessionId,
|
|
@@ -20061,8 +20061,8 @@ function detectEnvMode() {
|
|
|
20061
20061
|
const devKv = {};
|
|
20062
20062
|
const devLines = devContent.trim().split("\n");
|
|
20063
20063
|
for (let i = 1; i < devLines.length; i++) {
|
|
20064
|
-
const
|
|
20065
|
-
if (
|
|
20064
|
+
const eq12 = devLines[i].indexOf("=");
|
|
20065
|
+
if (eq12 > 0) devKv[devLines[i].slice(0, eq12).trim()] = devLines[i].slice(eq12 + 1).trim();
|
|
20066
20066
|
}
|
|
20067
20067
|
if (devKv["mode"] === "dev-ts" && devKv["source"]) {
|
|
20068
20068
|
const devSource = devKv["source"].replace(/\\/g, "/");
|
|
@@ -20375,7 +20375,7 @@ var init_config = __esm({
|
|
|
20375
20375
|
"session.autoStart": false,
|
|
20376
20376
|
"session.requireNotes": true,
|
|
20377
20377
|
"session.multiSession": false,
|
|
20378
|
-
"
|
|
20378
|
+
"enforcement.acceptance.mode": "block",
|
|
20379
20379
|
"lifecycle.mode": "strict"
|
|
20380
20380
|
}
|
|
20381
20381
|
},
|
|
@@ -20385,7 +20385,7 @@ var init_config = __esm({
|
|
|
20385
20385
|
"session.autoStart": false,
|
|
20386
20386
|
"session.requireNotes": false,
|
|
20387
20387
|
"session.multiSession": true,
|
|
20388
|
-
"
|
|
20388
|
+
"enforcement.acceptance.mode": "warn",
|
|
20389
20389
|
"lifecycle.mode": "advisory"
|
|
20390
20390
|
}
|
|
20391
20391
|
},
|
|
@@ -20395,7 +20395,7 @@ var init_config = __esm({
|
|
|
20395
20395
|
"session.autoStart": false,
|
|
20396
20396
|
"session.requireNotes": false,
|
|
20397
20397
|
"session.multiSession": true,
|
|
20398
|
-
"
|
|
20398
|
+
"enforcement.acceptance.mode": "off",
|
|
20399
20399
|
"lifecycle.mode": "off"
|
|
20400
20400
|
}
|
|
20401
20401
|
}
|
|
@@ -20774,13 +20774,13 @@ __export(pipeline_exports, {
|
|
|
20774
20774
|
listPipelines: () => listPipelines,
|
|
20775
20775
|
pipelineExists: () => pipelineExists
|
|
20776
20776
|
});
|
|
20777
|
-
import { and as
|
|
20777
|
+
import { and as and6, asc as asc3, desc as desc3, eq as eq9, sql as sql9 } from "drizzle-orm";
|
|
20778
20778
|
async function initializePipeline(taskId, options = {}) {
|
|
20779
20779
|
const db = await getDb();
|
|
20780
20780
|
const now = /* @__PURE__ */ new Date();
|
|
20781
20781
|
const startStage2 = options.startStage || "research";
|
|
20782
20782
|
const initialStatus = options.initialStatus || "active";
|
|
20783
|
-
const existing = await db.select().from(lifecyclePipelines).where(
|
|
20783
|
+
const existing = await db.select().from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
|
|
20784
20784
|
if (existing.length > 0) {
|
|
20785
20785
|
throw new CleoError(101 /* ALREADY_EXISTS */, `Pipeline already exists for task ${taskId}`);
|
|
20786
20786
|
}
|
|
@@ -20829,13 +20829,13 @@ async function initializePipeline(taskId, options = {}) {
|
|
|
20829
20829
|
}
|
|
20830
20830
|
async function getPipeline(taskId) {
|
|
20831
20831
|
const db = await getDb();
|
|
20832
|
-
const result = await db.select().from(lifecyclePipelines).where(
|
|
20832
|
+
const result = await db.select().from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
|
|
20833
20833
|
if (result.length === 0) {
|
|
20834
20834
|
return null;
|
|
20835
20835
|
}
|
|
20836
20836
|
const row = result[0];
|
|
20837
20837
|
const isActive = row.status === "active";
|
|
20838
|
-
const transitionResult = await db.select({ count: sql9`count(*)` }).from(lifecycleTransitions).where(
|
|
20838
|
+
const transitionResult = await db.select({ count: sql9`count(*)` }).from(lifecycleTransitions).where(eq9(lifecycleTransitions.pipelineId, row.id)).all();
|
|
20839
20839
|
const transitionCount = Number(transitionResult[0]?.count || 0);
|
|
20840
20840
|
return {
|
|
20841
20841
|
id: taskId,
|
|
@@ -20858,7 +20858,7 @@ async function advanceStage(taskId, options) {
|
|
|
20858
20858
|
if (!options.initiatedBy) {
|
|
20859
20859
|
throw new CleoError(2 /* INVALID_INPUT */, "advanceStage() requires initiatedBy agent/user");
|
|
20860
20860
|
}
|
|
20861
|
-
const pipelineResult = await db.select().from(lifecyclePipelines).where(
|
|
20861
|
+
const pipelineResult = await db.select().from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
|
|
20862
20862
|
if (pipelineResult.length === 0) {
|
|
20863
20863
|
throw new CleoError(4 /* NOT_FOUND */, `No pipeline found for task ${taskId}`);
|
|
20864
20864
|
}
|
|
@@ -20866,9 +20866,9 @@ async function advanceStage(taskId, options) {
|
|
|
20866
20866
|
const fromStage = pipeline2.currentStageId;
|
|
20867
20867
|
const toStage = options.toStage;
|
|
20868
20868
|
const currentStageResult = await db.select().from(lifecycleStages).where(
|
|
20869
|
-
|
|
20870
|
-
|
|
20871
|
-
|
|
20869
|
+
and6(
|
|
20870
|
+
eq9(lifecycleStages.pipelineId, pipeline2.id),
|
|
20871
|
+
eq9(lifecycleStages.stageName, fromStage)
|
|
20872
20872
|
)
|
|
20873
20873
|
).limit(1).all();
|
|
20874
20874
|
if (currentStageResult.length === 0) {
|
|
@@ -20879,9 +20879,9 @@ async function advanceStage(taskId, options) {
|
|
|
20879
20879
|
}
|
|
20880
20880
|
const currentStageRecord = currentStageResult[0];
|
|
20881
20881
|
const targetStageResult = await db.select().from(lifecycleStages).where(
|
|
20882
|
-
|
|
20883
|
-
|
|
20884
|
-
|
|
20882
|
+
and6(
|
|
20883
|
+
eq9(lifecycleStages.pipelineId, pipeline2.id),
|
|
20884
|
+
eq9(lifecycleStages.stageName, toStage)
|
|
20885
20885
|
)
|
|
20886
20886
|
).limit(1).all();
|
|
20887
20887
|
if (targetStageResult.length === 0) {
|
|
@@ -20894,14 +20894,14 @@ async function advanceStage(taskId, options) {
|
|
|
20894
20894
|
await db.update(lifecycleStages).set({
|
|
20895
20895
|
status: "completed",
|
|
20896
20896
|
completedAt: now.toISOString()
|
|
20897
|
-
}).where(
|
|
20897
|
+
}).where(eq9(lifecycleStages.id, currentStageRecord.id)).run();
|
|
20898
20898
|
await db.update(lifecycleStages).set({
|
|
20899
20899
|
status: "in_progress",
|
|
20900
20900
|
startedAt: now.toISOString()
|
|
20901
|
-
}).where(
|
|
20901
|
+
}).where(eq9(lifecycleStages.id, targetStageRecord.id)).run();
|
|
20902
20902
|
await db.update(lifecyclePipelines).set({
|
|
20903
20903
|
currentStageId: toStage
|
|
20904
|
-
}).where(
|
|
20904
|
+
}).where(eq9(lifecyclePipelines.id, pipeline2.id)).run();
|
|
20905
20905
|
await db.insert(lifecycleTransitions).values({
|
|
20906
20906
|
id: `${pipeline2.id}_${now.getTime()}_${Math.random().toString(36).slice(2, 7)}`,
|
|
20907
20907
|
pipelineId: pipeline2.id,
|
|
@@ -20918,7 +20918,7 @@ async function advanceStage(taskId, options) {
|
|
|
20918
20918
|
}
|
|
20919
20919
|
async function getCurrentStage(taskId) {
|
|
20920
20920
|
const db = await getDb();
|
|
20921
|
-
const result = await db.select({ currentStageId: lifecyclePipelines.currentStageId }).from(lifecyclePipelines).where(
|
|
20921
|
+
const result = await db.select({ currentStageId: lifecyclePipelines.currentStageId }).from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
|
|
20922
20922
|
if (result.length === 0) {
|
|
20923
20923
|
throw new CleoError(4 /* NOT_FOUND */, `No pipeline found for task ${taskId}`);
|
|
20924
20924
|
}
|
|
@@ -20930,43 +20930,43 @@ async function listPipelines(options = {}) {
|
|
|
20930
20930
|
const conditions = [];
|
|
20931
20931
|
if (options.status) {
|
|
20932
20932
|
conditions.push(
|
|
20933
|
-
|
|
20933
|
+
eq9(
|
|
20934
20934
|
lifecyclePipelines.status,
|
|
20935
20935
|
options.status
|
|
20936
20936
|
)
|
|
20937
20937
|
);
|
|
20938
20938
|
}
|
|
20939
20939
|
if (options.currentStage) {
|
|
20940
|
-
conditions.push(
|
|
20940
|
+
conditions.push(eq9(lifecyclePipelines.currentStageId, options.currentStage));
|
|
20941
20941
|
}
|
|
20942
20942
|
if (conditions.length > 0) {
|
|
20943
|
-
const whereClause = conditions.length === 1 ? conditions[0] :
|
|
20943
|
+
const whereClause = conditions.length === 1 ? conditions[0] : and6(...conditions);
|
|
20944
20944
|
query = db.select().from(lifecyclePipelines).where(whereClause);
|
|
20945
20945
|
}
|
|
20946
20946
|
if (options.orderBy) {
|
|
20947
20947
|
const order = options.order === "asc" ? asc3 : desc3;
|
|
20948
20948
|
switch (options.orderBy) {
|
|
20949
20949
|
case "createdAt":
|
|
20950
|
-
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ?
|
|
20950
|
+
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and6(...conditions) : void 0).orderBy(order(lifecyclePipelines.startedAt));
|
|
20951
20951
|
break;
|
|
20952
20952
|
case "currentStage":
|
|
20953
|
-
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ?
|
|
20953
|
+
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and6(...conditions) : void 0).orderBy(order(lifecyclePipelines.currentStageId));
|
|
20954
20954
|
break;
|
|
20955
20955
|
}
|
|
20956
20956
|
} else {
|
|
20957
|
-
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ?
|
|
20957
|
+
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and6(...conditions) : void 0).orderBy(desc3(lifecyclePipelines.startedAt));
|
|
20958
20958
|
}
|
|
20959
20959
|
if (options.limit) {
|
|
20960
|
-
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ?
|
|
20960
|
+
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and6(...conditions) : void 0).orderBy(desc3(lifecyclePipelines.startedAt)).limit(options.limit);
|
|
20961
20961
|
}
|
|
20962
20962
|
if (options.offset) {
|
|
20963
|
-
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ?
|
|
20963
|
+
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and6(...conditions) : void 0).orderBy(desc3(lifecyclePipelines.startedAt)).limit(options.limit || 100).offset(options.offset);
|
|
20964
20964
|
}
|
|
20965
20965
|
const results = await query.all();
|
|
20966
20966
|
return Promise.all(
|
|
20967
20967
|
results.map(async (row) => {
|
|
20968
20968
|
const isActive = row.status === "active";
|
|
20969
|
-
const transitionResult = await db.select({ count: sql9`count(*)` }).from(lifecycleTransitions).where(
|
|
20969
|
+
const transitionResult = await db.select({ count: sql9`count(*)` }).from(lifecycleTransitions).where(eq9(lifecycleTransitions.pipelineId, row.id)).all();
|
|
20970
20970
|
const transitionCount = Number(transitionResult[0]?.count || 0);
|
|
20971
20971
|
return {
|
|
20972
20972
|
id: row.taskId,
|
|
@@ -20985,7 +20985,7 @@ async function listPipelines(options = {}) {
|
|
|
20985
20985
|
async function completePipeline(taskId, reason) {
|
|
20986
20986
|
const db = await getDb();
|
|
20987
20987
|
const now = /* @__PURE__ */ new Date();
|
|
20988
|
-
const pipelineResult = await db.select().from(lifecyclePipelines).where(
|
|
20988
|
+
const pipelineResult = await db.select().from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
|
|
20989
20989
|
if (pipelineResult.length === 0) {
|
|
20990
20990
|
throw new CleoError(4 /* NOT_FOUND */, `No pipeline found for task ${taskId}`);
|
|
20991
20991
|
}
|
|
@@ -21000,21 +21000,21 @@ async function completePipeline(taskId, reason) {
|
|
|
21000
21000
|
stageUpdate.metadataJson = JSON.stringify({ completionReason: reason });
|
|
21001
21001
|
}
|
|
21002
21002
|
await db.update(lifecycleStages).set(stageUpdate).where(
|
|
21003
|
-
|
|
21004
|
-
|
|
21005
|
-
|
|
21003
|
+
and6(
|
|
21004
|
+
eq9(lifecycleStages.pipelineId, pipeline2.id),
|
|
21005
|
+
eq9(lifecycleStages.stageName, pipeline2.currentStageId)
|
|
21006
21006
|
)
|
|
21007
21007
|
).run();
|
|
21008
21008
|
}
|
|
21009
21009
|
await db.update(lifecyclePipelines).set({
|
|
21010
21010
|
status: "completed",
|
|
21011
21011
|
completedAt: now.toISOString()
|
|
21012
|
-
}).where(
|
|
21012
|
+
}).where(eq9(lifecyclePipelines.id, pipeline2.id)).run();
|
|
21013
21013
|
}
|
|
21014
21014
|
async function cancelPipeline(taskId, reason) {
|
|
21015
21015
|
const db = await getDb();
|
|
21016
21016
|
const now = /* @__PURE__ */ new Date();
|
|
21017
|
-
const pipelineResult = await db.select().from(lifecyclePipelines).where(
|
|
21017
|
+
const pipelineResult = await db.select().from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
|
|
21018
21018
|
if (pipelineResult.length === 0) {
|
|
21019
21019
|
throw new CleoError(4 /* NOT_FOUND */, `No pipeline found for task ${taskId}`);
|
|
21020
21020
|
}
|
|
@@ -21031,20 +21031,20 @@ async function cancelPipeline(taskId, reason) {
|
|
|
21031
21031
|
blockedAt: now.toISOString(),
|
|
21032
21032
|
blockReason: `Pipeline cancelled: ${reason}`
|
|
21033
21033
|
}).where(
|
|
21034
|
-
|
|
21035
|
-
|
|
21036
|
-
|
|
21034
|
+
and6(
|
|
21035
|
+
eq9(lifecycleStages.pipelineId, pipeline2.id),
|
|
21036
|
+
eq9(lifecycleStages.stageName, pipeline2.currentStageId)
|
|
21037
21037
|
)
|
|
21038
21038
|
).run();
|
|
21039
21039
|
}
|
|
21040
21040
|
await db.update(lifecyclePipelines).set({
|
|
21041
21041
|
status: "cancelled",
|
|
21042
21042
|
completedAt: now.toISOString()
|
|
21043
|
-
}).where(
|
|
21043
|
+
}).where(eq9(lifecyclePipelines.id, pipeline2.id)).run();
|
|
21044
21044
|
}
|
|
21045
21045
|
async function pipelineExists(taskId) {
|
|
21046
21046
|
const db = await getDb();
|
|
21047
|
-
const result = await db.select({ count: sql9`count(*)` }).from(lifecyclePipelines).where(
|
|
21047
|
+
const result = await db.select({ count: sql9`count(*)` }).from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).all();
|
|
21048
21048
|
return (result[0]?.count || 0) > 0;
|
|
21049
21049
|
}
|
|
21050
21050
|
async function getPipelineStatistics() {
|
|
@@ -21088,12 +21088,12 @@ async function getPipelineStatistics() {
|
|
|
21088
21088
|
}
|
|
21089
21089
|
async function getPipelineStages(taskId) {
|
|
21090
21090
|
const db = await getDb();
|
|
21091
|
-
const pipelineResult = await db.select({ id: lifecyclePipelines.id }).from(lifecyclePipelines).where(
|
|
21091
|
+
const pipelineResult = await db.select({ id: lifecyclePipelines.id }).from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
|
|
21092
21092
|
if (pipelineResult.length === 0) {
|
|
21093
21093
|
throw new CleoError(4 /* NOT_FOUND */, `No pipeline found for task ${taskId}`);
|
|
21094
21094
|
}
|
|
21095
21095
|
const pipelineId = pipelineResult[0].id;
|
|
21096
|
-
const stages = await db.select().from(lifecycleStages).where(
|
|
21096
|
+
const stages = await db.select().from(lifecycleStages).where(eq9(lifecycleStages.pipelineId, pipelineId)).orderBy(asc3(lifecycleStages.sequence)).all();
|
|
21097
21097
|
return stages.map((stage) => ({
|
|
21098
21098
|
id: stage.id,
|
|
21099
21099
|
pipelineId: stage.pipelineId,
|
|
@@ -23949,9 +23949,9 @@ async function nexusRegister(projectPath, name2, permissions = "read") {
|
|
|
23949
23949
|
const projectHash = generateProjectHash(projectPath);
|
|
23950
23950
|
await nexusInit();
|
|
23951
23951
|
const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
|
|
23952
|
-
const { eq:
|
|
23952
|
+
const { eq: eq12 } = await import("drizzle-orm");
|
|
23953
23953
|
const db = await getNexusDb2();
|
|
23954
|
-
const existingRows = await db.select().from(projectRegistry).where(
|
|
23954
|
+
const existingRows = await db.select().from(projectRegistry).where(eq12(projectRegistry.projectHash, projectHash));
|
|
23955
23955
|
const existing = existingRows[0];
|
|
23956
23956
|
if (existing?.permissions) {
|
|
23957
23957
|
throw new CleoError(
|
|
@@ -23960,7 +23960,7 @@ async function nexusRegister(projectPath, name2, permissions = "read") {
|
|
|
23960
23960
|
);
|
|
23961
23961
|
}
|
|
23962
23962
|
if (!existing) {
|
|
23963
|
-
const nameConflictRows = await db.select().from(projectRegistry).where(
|
|
23963
|
+
const nameConflictRows = await db.select().from(projectRegistry).where(eq12(projectRegistry.name, projectName));
|
|
23964
23964
|
if (nameConflictRows.length > 0) {
|
|
23965
23965
|
throw new CleoError(
|
|
23966
23966
|
6 /* VALIDATION_ERROR */,
|
|
@@ -23978,7 +23978,7 @@ async function nexusRegister(projectPath, name2, permissions = "read") {
|
|
|
23978
23978
|
taskCount: meta.taskCount,
|
|
23979
23979
|
labelsJson: JSON.stringify(meta.labels),
|
|
23980
23980
|
lastSeen: now
|
|
23981
|
-
}).where(
|
|
23981
|
+
}).where(eq12(projectRegistry.projectHash, projectHash));
|
|
23982
23982
|
} else {
|
|
23983
23983
|
if (!projectId) {
|
|
23984
23984
|
projectId = randomUUID3();
|
|
@@ -24016,9 +24016,9 @@ async function nexusUnregister(nameOrHash) {
|
|
|
24016
24016
|
throw new CleoError(4 /* NOT_FOUND */, `Project not found in registry: ${nameOrHash}`);
|
|
24017
24017
|
}
|
|
24018
24018
|
const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
|
|
24019
|
-
const { eq:
|
|
24019
|
+
const { eq: eq12 } = await import("drizzle-orm");
|
|
24020
24020
|
const db = await getNexusDb2();
|
|
24021
|
-
await db.delete(projectRegistry).where(
|
|
24021
|
+
await db.delete(projectRegistry).where(eq12(projectRegistry.projectHash, project.hash));
|
|
24022
24022
|
await writeNexusAudit({
|
|
24023
24023
|
action: "unregister",
|
|
24024
24024
|
projectHash: project.hash,
|
|
@@ -24040,9 +24040,9 @@ async function nexusList() {
|
|
|
24040
24040
|
async function nexusGetProject(nameOrHash) {
|
|
24041
24041
|
try {
|
|
24042
24042
|
const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
|
|
24043
|
-
const { eq:
|
|
24043
|
+
const { eq: eq12, or: or4 } = await import("drizzle-orm");
|
|
24044
24044
|
const db = await getNexusDb2();
|
|
24045
|
-
const rows = await db.select().from(projectRegistry).where(or4(
|
|
24045
|
+
const rows = await db.select().from(projectRegistry).where(or4(eq12(projectRegistry.projectHash, nameOrHash), eq12(projectRegistry.name, nameOrHash)));
|
|
24046
24046
|
const row = rows[0];
|
|
24047
24047
|
if (!row) return null;
|
|
24048
24048
|
return rowToProject(row);
|
|
@@ -24065,14 +24065,14 @@ async function nexusSync(nameOrHash) {
|
|
|
24065
24065
|
const meta = await readProjectMeta(project.path);
|
|
24066
24066
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
24067
24067
|
const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
|
|
24068
|
-
const { eq:
|
|
24068
|
+
const { eq: eq12 } = await import("drizzle-orm");
|
|
24069
24069
|
const db = await getNexusDb2();
|
|
24070
24070
|
await db.update(projectRegistry).set({
|
|
24071
24071
|
taskCount: meta.taskCount,
|
|
24072
24072
|
labelsJson: JSON.stringify(meta.labels),
|
|
24073
24073
|
lastSync: now,
|
|
24074
24074
|
lastSeen: now
|
|
24075
|
-
}).where(
|
|
24075
|
+
}).where(eq12(projectRegistry.projectHash, project.hash));
|
|
24076
24076
|
await writeNexusAudit({
|
|
24077
24077
|
action: "sync",
|
|
24078
24078
|
projectHash: project.hash,
|
|
@@ -24086,7 +24086,7 @@ async function nexusSyncAll() {
|
|
|
24086
24086
|
let synced = 0;
|
|
24087
24087
|
let failed = 0;
|
|
24088
24088
|
const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
|
|
24089
|
-
const { eq:
|
|
24089
|
+
const { eq: eq12 } = await import("drizzle-orm");
|
|
24090
24090
|
const db = await getNexusDb2();
|
|
24091
24091
|
for (const project of projects) {
|
|
24092
24092
|
try {
|
|
@@ -24097,7 +24097,7 @@ async function nexusSyncAll() {
|
|
|
24097
24097
|
labelsJson: JSON.stringify(meta.labels),
|
|
24098
24098
|
lastSync: now,
|
|
24099
24099
|
lastSeen: now
|
|
24100
|
-
}).where(
|
|
24100
|
+
}).where(eq12(projectRegistry.projectHash, project.hash));
|
|
24101
24101
|
synced++;
|
|
24102
24102
|
} catch {
|
|
24103
24103
|
failed++;
|
|
@@ -24117,9 +24117,9 @@ async function nexusSetPermission(nameOrHash, permission) {
|
|
|
24117
24117
|
throw new CleoError(4 /* NOT_FOUND */, `Project not found in registry: ${nameOrHash}`);
|
|
24118
24118
|
}
|
|
24119
24119
|
const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
|
|
24120
|
-
const { eq:
|
|
24120
|
+
const { eq: eq12 } = await import("drizzle-orm");
|
|
24121
24121
|
const db = await getNexusDb2();
|
|
24122
|
-
await db.update(projectRegistry).set({ permissions: permission }).where(
|
|
24122
|
+
await db.update(projectRegistry).set({ permissions: permission }).where(eq12(projectRegistry.projectHash, project.hash));
|
|
24123
24123
|
await writeNexusAudit({
|
|
24124
24124
|
action: "set-permission",
|
|
24125
24125
|
projectHash: project.hash,
|
|
@@ -24135,12 +24135,12 @@ async function nexusReconcile(projectRoot) {
|
|
|
24135
24135
|
}
|
|
24136
24136
|
await nexusInit();
|
|
24137
24137
|
const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
|
|
24138
|
-
const { eq:
|
|
24138
|
+
const { eq: eq12 } = await import("drizzle-orm");
|
|
24139
24139
|
const db = await getNexusDb2();
|
|
24140
24140
|
const projectId = await readProjectId(projectRoot);
|
|
24141
24141
|
const currentHash = generateProjectHash(projectRoot);
|
|
24142
24142
|
if (projectId) {
|
|
24143
|
-
const hashRows2 = await db.select().from(projectRegistry).where(
|
|
24143
|
+
const hashRows2 = await db.select().from(projectRegistry).where(eq12(projectRegistry.projectHash, currentHash));
|
|
24144
24144
|
const hashMatch2 = hashRows2[0];
|
|
24145
24145
|
if (hashMatch2 && hashMatch2.projectId !== projectId) {
|
|
24146
24146
|
await writeNexusAudit({
|
|
@@ -24159,12 +24159,12 @@ async function nexusReconcile(projectRoot) {
|
|
|
24159
24159
|
}
|
|
24160
24160
|
}
|
|
24161
24161
|
if (projectId) {
|
|
24162
|
-
const idRows = await db.select().from(projectRegistry).where(
|
|
24162
|
+
const idRows = await db.select().from(projectRegistry).where(eq12(projectRegistry.projectId, projectId));
|
|
24163
24163
|
const existing = idRows[0];
|
|
24164
24164
|
if (existing) {
|
|
24165
24165
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
24166
24166
|
if (existing.projectPath === projectRoot) {
|
|
24167
|
-
await db.update(projectRegistry).set({ lastSeen: now }).where(
|
|
24167
|
+
await db.update(projectRegistry).set({ lastSeen: now }).where(eq12(projectRegistry.projectId, projectId));
|
|
24168
24168
|
await writeNexusAudit({
|
|
24169
24169
|
action: "reconcile",
|
|
24170
24170
|
projectHash: currentHash,
|
|
@@ -24180,7 +24180,7 @@ async function nexusReconcile(projectRoot) {
|
|
|
24180
24180
|
projectPath: projectRoot,
|
|
24181
24181
|
projectHash: currentHash,
|
|
24182
24182
|
lastSeen: now
|
|
24183
|
-
}).where(
|
|
24183
|
+
}).where(eq12(projectRegistry.projectId, projectId));
|
|
24184
24184
|
await writeNexusAudit({
|
|
24185
24185
|
action: "reconcile",
|
|
24186
24186
|
projectHash: currentHash,
|
|
@@ -24192,11 +24192,11 @@ async function nexusReconcile(projectRoot) {
|
|
|
24192
24192
|
return { status: "path_updated", oldPath, newPath: projectRoot };
|
|
24193
24193
|
}
|
|
24194
24194
|
}
|
|
24195
|
-
const hashRows = await db.select().from(projectRegistry).where(
|
|
24195
|
+
const hashRows = await db.select().from(projectRegistry).where(eq12(projectRegistry.projectHash, currentHash));
|
|
24196
24196
|
const hashMatch = hashRows[0];
|
|
24197
24197
|
if (hashMatch) {
|
|
24198
24198
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
24199
|
-
await db.update(projectRegistry).set({ lastSeen: now }).where(
|
|
24199
|
+
await db.update(projectRegistry).set({ lastSeen: now }).where(eq12(projectRegistry.projectHash, currentHash));
|
|
24200
24200
|
await writeNexusAudit({
|
|
24201
24201
|
action: "reconcile",
|
|
24202
24202
|
projectHash: currentHash,
|
|
@@ -26401,7 +26401,7 @@ async function syncAdrsToDb(projectRoot) {
|
|
|
26401
26401
|
return result;
|
|
26402
26402
|
}
|
|
26403
26403
|
const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
26404
|
-
const { eq:
|
|
26404
|
+
const { eq: eq12 } = await import("drizzle-orm");
|
|
26405
26405
|
const db = await getDb3(projectRoot);
|
|
26406
26406
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
26407
26407
|
const allFiles = collectAdrFiles(adrsDir);
|
|
@@ -26435,15 +26435,15 @@ async function syncAdrsToDb(projectRoot) {
|
|
|
26435
26435
|
topics: fm.Topics ?? null,
|
|
26436
26436
|
updatedAt: now
|
|
26437
26437
|
};
|
|
26438
|
-
const existing = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(
|
|
26438
|
+
const existing = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(eq12(architectureDecisions.id, record2.id)).all();
|
|
26439
26439
|
if (existing.length > 0) {
|
|
26440
|
-
await db.update(architectureDecisions).set(rowBase).where(
|
|
26440
|
+
await db.update(architectureDecisions).set(rowBase).where(eq12(architectureDecisions.id, record2.id));
|
|
26441
26441
|
result.updated++;
|
|
26442
26442
|
} else {
|
|
26443
26443
|
await db.insert(architectureDecisions).values({ ...rowBase, createdAt: now });
|
|
26444
26444
|
result.inserted++;
|
|
26445
26445
|
}
|
|
26446
|
-
await db.delete(adrTaskLinks).where(
|
|
26446
|
+
await db.delete(adrTaskLinks).where(eq12(adrTaskLinks.adrId, record2.id));
|
|
26447
26447
|
if (fm["Related Tasks"]) {
|
|
26448
26448
|
for (const taskId of parseTaskIds2(fm["Related Tasks"])) {
|
|
26449
26449
|
await db.insert(adrTaskLinks).values({ adrId: record2.id, taskId, linkType: "related" });
|
|
@@ -26545,18 +26545,27 @@ __export(agents_exports, {
|
|
|
26545
26545
|
AGENT_INSTANCE_STATUSES: () => AGENT_INSTANCE_STATUSES,
|
|
26546
26546
|
AGENT_TYPES: () => AGENT_TYPES,
|
|
26547
26547
|
DEFAULT_RETRY_POLICY: () => DEFAULT_RETRY_POLICY,
|
|
26548
|
+
HEARTBEAT_INTERVAL_MS: () => HEARTBEAT_INTERVAL_MS,
|
|
26549
|
+
MAX_TASKS_PER_AGENT: () => MAX_TASKS_PER_AGENT,
|
|
26550
|
+
STALE_THRESHOLD_MS: () => STALE_THRESHOLD_MS,
|
|
26548
26551
|
agentErrorLog: () => agentErrorLog,
|
|
26549
26552
|
agentInstances: () => agentInstances,
|
|
26550
26553
|
calculateDelay: () => calculateDelay,
|
|
26551
|
-
checkAgentHealth: () =>
|
|
26554
|
+
checkAgentHealth: () => checkAgentHealth2,
|
|
26552
26555
|
classifyError: () => classifyError,
|
|
26553
26556
|
createRetryPolicy: () => createRetryPolicy,
|
|
26554
26557
|
deregisterAgent: () => deregisterAgent,
|
|
26558
|
+
detectCrashedAgents: () => detectCrashedAgents,
|
|
26559
|
+
detectStaleAgents: () => detectStaleAgents,
|
|
26555
26560
|
findLeastLoadedAgent: () => findLeastLoadedAgent,
|
|
26561
|
+
findStaleAgentRows: () => checkAgentHealth,
|
|
26556
26562
|
generateAgentId: () => generateAgentId,
|
|
26563
|
+
getAgentCapacity: () => getAgentCapacity,
|
|
26557
26564
|
getAgentErrorHistory: () => getAgentErrorHistory,
|
|
26558
26565
|
getAgentInstance: () => getAgentInstance,
|
|
26559
26566
|
getAgentPerformanceHistory: () => getAgentPerformanceHistory,
|
|
26567
|
+
getAgentSpecializations: () => getAgentSpecializations,
|
|
26568
|
+
getAgentsByCapacity: () => getAgentsByCapacity,
|
|
26560
26569
|
getAvailableCapacity: () => getAvailableCapacity,
|
|
26561
26570
|
getCapacitySummary: () => getCapacitySummary,
|
|
26562
26571
|
getHealthReport: () => getHealthReport,
|
|
@@ -26568,85 +26577,35 @@ __export(agents_exports, {
|
|
|
26568
26577
|
markCrashed: () => markCrashed,
|
|
26569
26578
|
processAgentLifecycleEvent: () => processAgentLifecycleEvent,
|
|
26570
26579
|
recordAgentExecution: () => recordAgentExecution,
|
|
26580
|
+
recordAgentPerformance: () => recordAgentPerformance,
|
|
26571
26581
|
recordFailurePattern: () => recordFailurePattern,
|
|
26582
|
+
recordHeartbeat: () => recordHeartbeat,
|
|
26572
26583
|
recoverCrashedAgents: () => recoverCrashedAgents,
|
|
26573
26584
|
registerAgent: () => registerAgent,
|
|
26574
26585
|
shouldRetry: () => shouldRetry,
|
|
26575
26586
|
storeHealingStrategy: () => storeHealingStrategy,
|
|
26587
|
+
updateAgentSpecializations: () => updateAgentSpecializations,
|
|
26576
26588
|
updateAgentStatus: () => updateAgentStatus,
|
|
26577
26589
|
updateCapacity: () => updateCapacity,
|
|
26578
26590
|
withRetry: () => withRetry
|
|
26579
26591
|
});
|
|
26580
|
-
init_agent_schema();
|
|
26581
26592
|
|
|
26582
|
-
// packages/core/src/agents/
|
|
26593
|
+
// packages/core/src/agents/agent-registry.ts
|
|
26583
26594
|
init_sqlite2();
|
|
26584
26595
|
init_agent_schema();
|
|
26585
|
-
|
|
26586
|
-
import { eq as eq6 } from "drizzle-orm";
|
|
26587
|
-
async function updateCapacity(id, capacity, cwd) {
|
|
26588
|
-
if (capacity < 0 || capacity > 1) {
|
|
26589
|
-
throw new Error(`Capacity must be between 0.0 and 1.0, got ${capacity}`);
|
|
26590
|
-
}
|
|
26591
|
-
const db = await getDb(cwd);
|
|
26592
|
-
const existing = await db.select().from(agentInstances).where(eq6(agentInstances.id, id)).get();
|
|
26593
|
-
if (!existing) return null;
|
|
26594
|
-
const capacityStr = capacity.toFixed(4);
|
|
26595
|
-
await db.update(agentInstances).set({ capacity: capacityStr }).where(eq6(agentInstances.id, id));
|
|
26596
|
-
return { ...existing, capacity: capacityStr };
|
|
26597
|
-
}
|
|
26598
|
-
async function getAvailableCapacity(cwd) {
|
|
26599
|
-
const agents = await listAgentInstances({ status: ["active", "idle"] }, cwd);
|
|
26600
|
-
return agents.reduce((sum, agent) => sum + parseCapacity(agent.capacity), 0);
|
|
26601
|
-
}
|
|
26602
|
-
async function findLeastLoadedAgent(agentType, cwd) {
|
|
26603
|
-
const filters = agentType ? { status: ["active", "idle"], agentType } : { status: ["active", "idle"] };
|
|
26604
|
-
const agents = await listAgentInstances(filters, cwd);
|
|
26605
|
-
if (agents.length === 0) return null;
|
|
26606
|
-
let best = agents[0];
|
|
26607
|
-
let bestCapacity = parseCapacity(best.capacity);
|
|
26608
|
-
for (let i = 1; i < agents.length; i++) {
|
|
26609
|
-
const cap = parseCapacity(agents[i].capacity);
|
|
26610
|
-
if (cap > bestCapacity) {
|
|
26611
|
-
best = agents[i];
|
|
26612
|
-
bestCapacity = cap;
|
|
26613
|
-
}
|
|
26614
|
-
}
|
|
26615
|
-
return best;
|
|
26616
|
-
}
|
|
26617
|
-
async function isOverloaded(threshold = 0.1, cwd) {
|
|
26618
|
-
const capacity = await getAvailableCapacity(cwd);
|
|
26619
|
-
return capacity < threshold;
|
|
26620
|
-
}
|
|
26621
|
-
async function getCapacitySummary(threshold = 0.1, cwd) {
|
|
26622
|
-
const agents = await listAgentInstances({ status: ["active", "idle"] }, cwd);
|
|
26623
|
-
const totalCapacity = agents.reduce((sum, a) => sum + parseCapacity(a.capacity), 0);
|
|
26624
|
-
const activeAgentCount = agents.length;
|
|
26625
|
-
return {
|
|
26626
|
-
totalCapacity,
|
|
26627
|
-
activeAgentCount,
|
|
26628
|
-
averageCapacity: activeAgentCount > 0 ? totalCapacity / activeAgentCount : 0,
|
|
26629
|
-
overloaded: totalCapacity < threshold,
|
|
26630
|
-
threshold
|
|
26631
|
-
};
|
|
26632
|
-
}
|
|
26633
|
-
function parseCapacity(value) {
|
|
26634
|
-
if (!value) return 0;
|
|
26635
|
-
const parsed = parseFloat(value);
|
|
26636
|
-
return Number.isNaN(parsed) ? 0 : Math.max(0, Math.min(1, parsed));
|
|
26637
|
-
}
|
|
26596
|
+
import { and as and5, eq as eq7, inArray as inArray5 } from "drizzle-orm";
|
|
26638
26597
|
|
|
26639
26598
|
// packages/core/src/agents/execution-learning.ts
|
|
26640
26599
|
init_brain_accessor();
|
|
26641
|
-
import { randomBytes
|
|
26600
|
+
import { randomBytes } from "node:crypto";
|
|
26642
26601
|
function generateDecisionId() {
|
|
26643
|
-
return `AGT-${
|
|
26602
|
+
return `AGT-${randomBytes(5).toString("hex")}`;
|
|
26644
26603
|
}
|
|
26645
26604
|
function generatePatternId() {
|
|
26646
|
-
return `P-agt-${
|
|
26605
|
+
return `P-agt-${randomBytes(4).toString("hex")}`;
|
|
26647
26606
|
}
|
|
26648
26607
|
function generateObservationId() {
|
|
26649
|
-
return `O-agt-${
|
|
26608
|
+
return `O-agt-${randomBytes(4).toString("hex")}`;
|
|
26650
26609
|
}
|
|
26651
26610
|
function nowSql() {
|
|
26652
26611
|
return (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19);
|
|
@@ -26923,6 +26882,215 @@ function buildHealingSuggestion(agentType, taskType, errorType, frequency) {
|
|
|
26923
26882
|
return `Unknown failure for ${agentType} on ${taskType} tasks (${frequency}x). Check agent logs, retry with fresh context, or reassign to a different agent type.`;
|
|
26924
26883
|
}
|
|
26925
26884
|
|
|
26885
|
+
// packages/core/src/agents/agent-registry.ts
|
|
26886
|
+
init_registry2();
|
|
26887
|
+
var MAX_TASKS_PER_AGENT = 5;
|
|
26888
|
+
async function getAgentCapacity(agentId, cwd) {
|
|
26889
|
+
const db = await getDb(cwd);
|
|
26890
|
+
const agent = await db.select().from(agentInstances).where(eq7(agentInstances.id, agentId)).get();
|
|
26891
|
+
if (!agent) return null;
|
|
26892
|
+
const isTerminal = agent.status === "stopped" || agent.status === "crashed";
|
|
26893
|
+
if (isTerminal) {
|
|
26894
|
+
return {
|
|
26895
|
+
agentId: agent.id,
|
|
26896
|
+
agentType: agent.agentType,
|
|
26897
|
+
status: agent.status,
|
|
26898
|
+
activeTasks: 0,
|
|
26899
|
+
remainingCapacity: 0,
|
|
26900
|
+
maxCapacity: MAX_TASKS_PER_AGENT,
|
|
26901
|
+
available: false
|
|
26902
|
+
};
|
|
26903
|
+
}
|
|
26904
|
+
const children = await db.select({ id: agentInstances.id }).from(agentInstances).where(
|
|
26905
|
+
and5(
|
|
26906
|
+
eq7(agentInstances.parentAgentId, agentId),
|
|
26907
|
+
inArray5(agentInstances.status, ["starting", "active", "idle", "error"])
|
|
26908
|
+
)
|
|
26909
|
+
).all();
|
|
26910
|
+
const selfTask = agent.taskId != null ? 1 : 0;
|
|
26911
|
+
const activeTasks = selfTask + children.length;
|
|
26912
|
+
const remainingCapacity = Math.max(0, MAX_TASKS_PER_AGENT - activeTasks);
|
|
26913
|
+
return {
|
|
26914
|
+
agentId: agent.id,
|
|
26915
|
+
agentType: agent.agentType,
|
|
26916
|
+
status: agent.status,
|
|
26917
|
+
activeTasks,
|
|
26918
|
+
remainingCapacity,
|
|
26919
|
+
maxCapacity: MAX_TASKS_PER_AGENT,
|
|
26920
|
+
available: remainingCapacity > 0
|
|
26921
|
+
};
|
|
26922
|
+
}
|
|
26923
|
+
async function getAgentsByCapacity(agentType, cwd) {
|
|
26924
|
+
const filters = agentType ? { status: ["active", "idle"], agentType } : { status: ["active", "idle"] };
|
|
26925
|
+
const activeAgents = await listAgentInstances(filters, cwd);
|
|
26926
|
+
const capacities = await Promise.all(
|
|
26927
|
+
activeAgents.map((agent) => getAgentCapacity(agent.id, cwd))
|
|
26928
|
+
);
|
|
26929
|
+
return capacities.filter((c) => c !== null).sort((a, b) => b.remainingCapacity - a.remainingCapacity);
|
|
26930
|
+
}
|
|
26931
|
+
async function getAgentSpecializations(agentId, cwd) {
|
|
26932
|
+
const db = await getDb(cwd);
|
|
26933
|
+
const agent = await db.select({ metadataJson: agentInstances.metadataJson }).from(agentInstances).where(eq7(agentInstances.id, agentId)).get();
|
|
26934
|
+
if (!agent) return [];
|
|
26935
|
+
try {
|
|
26936
|
+
const meta = JSON.parse(agent.metadataJson ?? "{}");
|
|
26937
|
+
const specs = meta.specializations;
|
|
26938
|
+
if (!Array.isArray(specs)) return [];
|
|
26939
|
+
return specs.filter((s) => typeof s === "string");
|
|
26940
|
+
} catch {
|
|
26941
|
+
return [];
|
|
26942
|
+
}
|
|
26943
|
+
}
|
|
26944
|
+
async function updateAgentSpecializations(agentId, specializations, cwd) {
|
|
26945
|
+
const db = await getDb(cwd);
|
|
26946
|
+
const agent = await db.select({ metadataJson: agentInstances.metadataJson }).from(agentInstances).where(eq7(agentInstances.id, agentId)).get();
|
|
26947
|
+
if (!agent) return null;
|
|
26948
|
+
let existing = {};
|
|
26949
|
+
try {
|
|
26950
|
+
existing = JSON.parse(agent.metadataJson ?? "{}");
|
|
26951
|
+
} catch {
|
|
26952
|
+
}
|
|
26953
|
+
const updated = { ...existing, specializations };
|
|
26954
|
+
await db.update(agentInstances).set({ metadataJson: JSON.stringify(updated) }).where(eq7(agentInstances.id, agentId));
|
|
26955
|
+
return specializations;
|
|
26956
|
+
}
|
|
26957
|
+
async function recordAgentPerformance(agentId, metrics, cwd) {
|
|
26958
|
+
const db = await getDb(cwd);
|
|
26959
|
+
const agent = await db.select({ agentType: agentInstances.agentType, sessionId: agentInstances.sessionId }).from(agentInstances).where(eq7(agentInstances.id, agentId)).get();
|
|
26960
|
+
if (!agent) return null;
|
|
26961
|
+
const event = {
|
|
26962
|
+
agentId,
|
|
26963
|
+
agentType: agent.agentType,
|
|
26964
|
+
taskId: metrics.taskId,
|
|
26965
|
+
taskType: metrics.taskType,
|
|
26966
|
+
outcome: metrics.outcome,
|
|
26967
|
+
taskLabels: metrics.taskLabels,
|
|
26968
|
+
sessionId: metrics.sessionId ?? agent.sessionId ?? void 0,
|
|
26969
|
+
durationMs: metrics.durationMs,
|
|
26970
|
+
errorMessage: metrics.errorMessage,
|
|
26971
|
+
errorType: metrics.errorType
|
|
26972
|
+
};
|
|
26973
|
+
const decision = await recordAgentExecution(event, cwd);
|
|
26974
|
+
return decision?.id ?? null;
|
|
26975
|
+
}
|
|
26976
|
+
|
|
26977
|
+
// packages/core/src/agents/index.ts
|
|
26978
|
+
init_agent_schema();
|
|
26979
|
+
|
|
26980
|
+
// packages/core/src/agents/capacity.ts
|
|
26981
|
+
init_sqlite2();
|
|
26982
|
+
init_agent_schema();
|
|
26983
|
+
init_registry2();
|
|
26984
|
+
import { eq as eq8 } from "drizzle-orm";
|
|
26985
|
+
async function updateCapacity(id, capacity, cwd) {
|
|
26986
|
+
if (capacity < 0 || capacity > 1) {
|
|
26987
|
+
throw new Error(`Capacity must be between 0.0 and 1.0, got ${capacity}`);
|
|
26988
|
+
}
|
|
26989
|
+
const db = await getDb(cwd);
|
|
26990
|
+
const existing = await db.select().from(agentInstances).where(eq8(agentInstances.id, id)).get();
|
|
26991
|
+
if (!existing) return null;
|
|
26992
|
+
const capacityStr = capacity.toFixed(4);
|
|
26993
|
+
await db.update(agentInstances).set({ capacity: capacityStr }).where(eq8(agentInstances.id, id));
|
|
26994
|
+
return { ...existing, capacity: capacityStr };
|
|
26995
|
+
}
|
|
26996
|
+
async function getAvailableCapacity(cwd) {
|
|
26997
|
+
const agents = await listAgentInstances({ status: ["active", "idle"] }, cwd);
|
|
26998
|
+
return agents.reduce((sum, agent) => sum + parseCapacity(agent.capacity), 0);
|
|
26999
|
+
}
|
|
27000
|
+
async function findLeastLoadedAgent(agentType, cwd) {
|
|
27001
|
+
const filters = agentType ? { status: ["active", "idle"], agentType } : { status: ["active", "idle"] };
|
|
27002
|
+
const agents = await listAgentInstances(filters, cwd);
|
|
27003
|
+
if (agents.length === 0) return null;
|
|
27004
|
+
let best = agents[0];
|
|
27005
|
+
let bestCapacity = parseCapacity(best.capacity);
|
|
27006
|
+
for (let i = 1; i < agents.length; i++) {
|
|
27007
|
+
const cap = parseCapacity(agents[i].capacity);
|
|
27008
|
+
if (cap > bestCapacity) {
|
|
27009
|
+
best = agents[i];
|
|
27010
|
+
bestCapacity = cap;
|
|
27011
|
+
}
|
|
27012
|
+
}
|
|
27013
|
+
return best;
|
|
27014
|
+
}
|
|
27015
|
+
async function isOverloaded(threshold = 0.1, cwd) {
|
|
27016
|
+
const capacity = await getAvailableCapacity(cwd);
|
|
27017
|
+
return capacity < threshold;
|
|
27018
|
+
}
|
|
27019
|
+
async function getCapacitySummary(threshold = 0.1, cwd) {
|
|
27020
|
+
const agents = await listAgentInstances({ status: ["active", "idle"] }, cwd);
|
|
27021
|
+
const totalCapacity = agents.reduce((sum, a) => sum + parseCapacity(a.capacity), 0);
|
|
27022
|
+
const activeAgentCount = agents.length;
|
|
27023
|
+
return {
|
|
27024
|
+
totalCapacity,
|
|
27025
|
+
activeAgentCount,
|
|
27026
|
+
averageCapacity: activeAgentCount > 0 ? totalCapacity / activeAgentCount : 0,
|
|
27027
|
+
overloaded: totalCapacity < threshold,
|
|
27028
|
+
threshold
|
|
27029
|
+
};
|
|
27030
|
+
}
|
|
27031
|
+
function parseCapacity(value) {
|
|
27032
|
+
if (!value) return 0;
|
|
27033
|
+
const parsed = parseFloat(value);
|
|
27034
|
+
return Number.isNaN(parsed) ? 0 : Math.max(0, Math.min(1, parsed));
|
|
27035
|
+
}
|
|
27036
|
+
|
|
27037
|
+
// packages/core/src/agents/health-monitor.ts
|
|
27038
|
+
init_registry2();
|
|
27039
|
+
var HEARTBEAT_INTERVAL_MS = 3e4;
|
|
27040
|
+
var STALE_THRESHOLD_MS = 3 * 6e4;
|
|
27041
|
+
var ALIVE_STATUSES = ["starting", "active", "idle"];
|
|
27042
|
+
async function recordHeartbeat(agentId, cwd) {
|
|
27043
|
+
return heartbeat(agentId, cwd);
|
|
27044
|
+
}
|
|
27045
|
+
async function checkAgentHealth2(agentId, thresholdMs = STALE_THRESHOLD_MS, cwd) {
|
|
27046
|
+
const all = await listAgentInstances(void 0, cwd);
|
|
27047
|
+
const agent = all.find((a) => a.id === agentId);
|
|
27048
|
+
if (!agent) return null;
|
|
27049
|
+
return buildHealthStatus(agent, thresholdMs);
|
|
27050
|
+
}
|
|
27051
|
+
async function detectStaleAgents(thresholdMs = STALE_THRESHOLD_MS, cwd) {
|
|
27052
|
+
const agents = await listAgentInstances({ status: ALIVE_STATUSES }, cwd);
|
|
27053
|
+
return agents.map((a) => buildHealthStatus(a, thresholdMs)).filter((s) => s.stale).sort((a, b) => b.heartbeatAgeMs - a.heartbeatAgeMs);
|
|
27054
|
+
}
|
|
27055
|
+
async function detectCrashedAgents(thresholdMs = STALE_THRESHOLD_MS, cwd) {
|
|
27056
|
+
const activeAgents = await listAgentInstances({ status: "active" }, cwd);
|
|
27057
|
+
const cutoff = new Date(Date.now() - thresholdMs).toISOString();
|
|
27058
|
+
const crashed = [];
|
|
27059
|
+
for (const agent of activeAgents) {
|
|
27060
|
+
if (agent.lastHeartbeat < cutoff) {
|
|
27061
|
+
const updated = await markCrashed(
|
|
27062
|
+
agent.id,
|
|
27063
|
+
`Heartbeat timeout \u2014 no heartbeat for >${Math.round(thresholdMs / 1e3)}s`,
|
|
27064
|
+
cwd
|
|
27065
|
+
);
|
|
27066
|
+
if (updated) {
|
|
27067
|
+
crashed.push(updated);
|
|
27068
|
+
}
|
|
27069
|
+
}
|
|
27070
|
+
}
|
|
27071
|
+
crashed.sort((a, b) => {
|
|
27072
|
+
const aHb = a.lastHeartbeat ?? "";
|
|
27073
|
+
const bHb = b.lastHeartbeat ?? "";
|
|
27074
|
+
return aHb < bHb ? -1 : aHb > bHb ? 1 : 0;
|
|
27075
|
+
});
|
|
27076
|
+
return crashed;
|
|
27077
|
+
}
|
|
27078
|
+
function buildHealthStatus(agent, thresholdMs) {
|
|
27079
|
+
const lastHeartbeatMs = new Date(agent.lastHeartbeat).getTime();
|
|
27080
|
+
const heartbeatAgeMs = Date.now() - lastHeartbeatMs;
|
|
27081
|
+
const stale = ALIVE_STATUSES.includes(agent.status) ? heartbeatAgeMs > thresholdMs : false;
|
|
27082
|
+
const healthy = !stale && ALIVE_STATUSES.includes(agent.status);
|
|
27083
|
+
return {
|
|
27084
|
+
agentId: agent.id,
|
|
27085
|
+
status: agent.status,
|
|
27086
|
+
lastHeartbeat: agent.lastHeartbeat,
|
|
27087
|
+
heartbeatAgeMs,
|
|
27088
|
+
healthy,
|
|
27089
|
+
stale,
|
|
27090
|
+
thresholdMs
|
|
27091
|
+
};
|
|
27092
|
+
}
|
|
27093
|
+
|
|
26926
27094
|
// packages/core/src/agents/index.ts
|
|
26927
27095
|
init_registry2();
|
|
26928
27096
|
|
|
@@ -39185,6 +39353,7 @@ __export(intelligence_exports, {
|
|
|
39185
39353
|
gatherLearningContext: () => gatherLearningContext,
|
|
39186
39354
|
matchPatterns: () => matchPatterns,
|
|
39187
39355
|
predictAndStore: () => predictAndStore,
|
|
39356
|
+
predictImpact: () => predictImpact,
|
|
39188
39357
|
predictValidationOutcome: () => predictValidationOutcome,
|
|
39189
39358
|
scoreVerificationConfidence: () => scoreVerificationConfidence,
|
|
39190
39359
|
storeDetectedPattern: () => storeDetectedPattern,
|
|
@@ -40374,6 +40543,116 @@ function generateRecommendation2(changeType, affectedCount, cascadeDepth, taskId
|
|
|
40374
40543
|
return `${severity} impact: reprioritizing ${taskId} may reorder ${affectedCount} downstream task(s) across ${cascadeDepth} level(s) of dependencies.`;
|
|
40375
40544
|
}
|
|
40376
40545
|
}
|
|
40546
|
+
function scoreTaskMatch(change, task) {
|
|
40547
|
+
const STOP_WORDS3 = /* @__PURE__ */ new Set([
|
|
40548
|
+
"a",
|
|
40549
|
+
"an",
|
|
40550
|
+
"the",
|
|
40551
|
+
"and",
|
|
40552
|
+
"or",
|
|
40553
|
+
"in",
|
|
40554
|
+
"of",
|
|
40555
|
+
"to",
|
|
40556
|
+
"for",
|
|
40557
|
+
"with",
|
|
40558
|
+
"on",
|
|
40559
|
+
"at",
|
|
40560
|
+
"by",
|
|
40561
|
+
"is",
|
|
40562
|
+
"it",
|
|
40563
|
+
"be",
|
|
40564
|
+
"as",
|
|
40565
|
+
"if",
|
|
40566
|
+
"do",
|
|
40567
|
+
"not"
|
|
40568
|
+
]);
|
|
40569
|
+
const tokenise = (text3) => text3.toLowerCase().split(/\W+/).filter((t) => t.length > 2 && !STOP_WORDS3.has(t));
|
|
40570
|
+
const changeTokens = new Set(tokenise(change));
|
|
40571
|
+
if (changeTokens.size === 0) return 0;
|
|
40572
|
+
const taskText = `${task.title ?? ""} ${task.description ?? ""}`;
|
|
40573
|
+
const taskTokens = new Set(tokenise(taskText));
|
|
40574
|
+
let matches = 0;
|
|
40575
|
+
for (const token of changeTokens) {
|
|
40576
|
+
if (taskTokens.has(token)) matches++;
|
|
40577
|
+
}
|
|
40578
|
+
return matches / changeTokens.size;
|
|
40579
|
+
}
|
|
40580
|
+
async function predictImpact(change, cwd, accessor, matchLimit = 5) {
|
|
40581
|
+
const acc = accessor ?? await getAccessor(cwd);
|
|
40582
|
+
const tasks2 = await loadAllTasks2(acc);
|
|
40583
|
+
const taskMap = new Map(tasks2.map((t) => [t.id, t]));
|
|
40584
|
+
const dependentsMap = buildDependentsMap(tasks2);
|
|
40585
|
+
const scored = tasks2.map((t) => ({ task: t, score: scoreTaskMatch(change, t) })).filter(({ score }) => score > 0).sort((a, b) => b.score - a.score);
|
|
40586
|
+
const seeds = scored.slice(0, matchLimit).map(({ task }) => task);
|
|
40587
|
+
if (seeds.length === 0) {
|
|
40588
|
+
return {
|
|
40589
|
+
change,
|
|
40590
|
+
matchedTasks: [],
|
|
40591
|
+
affectedTasks: [],
|
|
40592
|
+
totalAffected: 0,
|
|
40593
|
+
summary: `No tasks matched the change description "${change}".`
|
|
40594
|
+
};
|
|
40595
|
+
}
|
|
40596
|
+
const directMatchIds = new Set(seeds.map((t) => t.id));
|
|
40597
|
+
const exposureMap = /* @__PURE__ */ new Map();
|
|
40598
|
+
for (const id of directMatchIds) {
|
|
40599
|
+
exposureMap.set(id, "direct");
|
|
40600
|
+
}
|
|
40601
|
+
for (const seed of seeds) {
|
|
40602
|
+
const transitive = collectTransitiveDependents(seed.id, dependentsMap);
|
|
40603
|
+
for (const depId of transitive) {
|
|
40604
|
+
if (!exposureMap.has(depId)) {
|
|
40605
|
+
const isDirectDependent = (dependentsMap.get(seed.id) ?? /* @__PURE__ */ new Set()).has(depId);
|
|
40606
|
+
exposureMap.set(depId, isDirectDependent ? "dependent" : "transitive");
|
|
40607
|
+
}
|
|
40608
|
+
}
|
|
40609
|
+
}
|
|
40610
|
+
const EXPOSURE_ORDER = {
|
|
40611
|
+
direct: 0,
|
|
40612
|
+
dependent: 1,
|
|
40613
|
+
transitive: 2
|
|
40614
|
+
};
|
|
40615
|
+
const affectedTasks = [];
|
|
40616
|
+
for (const [id, exposure] of exposureMap) {
|
|
40617
|
+
const task = taskMap.get(id);
|
|
40618
|
+
if (!task) continue;
|
|
40619
|
+
const downstreamTransitive = collectTransitiveDependents(id, dependentsMap);
|
|
40620
|
+
const downstreamCount = downstreamTransitive.size;
|
|
40621
|
+
let reason;
|
|
40622
|
+
if (exposure === "direct") {
|
|
40623
|
+
reason = `Task title/description matched "${change}".`;
|
|
40624
|
+
} else if (exposure === "dependent") {
|
|
40625
|
+
const seedNames = seeds.filter((s) => (dependentsMap.get(s.id) ?? /* @__PURE__ */ new Set()).has(id)).map((s) => s.id).join(", ");
|
|
40626
|
+
reason = `Directly depends on matched task(s): ${seedNames}.`;
|
|
40627
|
+
} else {
|
|
40628
|
+
reason = "Downstream of a matched task via transitive dependency chain.";
|
|
40629
|
+
}
|
|
40630
|
+
affectedTasks.push({
|
|
40631
|
+
id,
|
|
40632
|
+
title: task.title,
|
|
40633
|
+
status: task.status,
|
|
40634
|
+
priority: task.priority,
|
|
40635
|
+
exposure,
|
|
40636
|
+
downstreamCount,
|
|
40637
|
+
reason
|
|
40638
|
+
});
|
|
40639
|
+
}
|
|
40640
|
+
affectedTasks.sort((a, b) => {
|
|
40641
|
+
const expDiff = EXPOSURE_ORDER[a.exposure] - EXPOSURE_ORDER[b.exposure];
|
|
40642
|
+
if (expDiff !== 0) return expDiff;
|
|
40643
|
+
return b.downstreamCount - a.downstreamCount;
|
|
40644
|
+
});
|
|
40645
|
+
const matchedTasks = affectedTasks.filter((t) => t.exposure === "direct");
|
|
40646
|
+
const totalAffected = affectedTasks.length;
|
|
40647
|
+
const summary = matchedTasks.length === 0 ? `No tasks matched "${change}".` : `${matchedTasks.length} task(s) matched "${change}"; ${totalAffected} total task(s) affected (including downstream).`;
|
|
40648
|
+
return {
|
|
40649
|
+
change,
|
|
40650
|
+
matchedTasks,
|
|
40651
|
+
affectedTasks,
|
|
40652
|
+
totalAffected,
|
|
40653
|
+
summary
|
|
40654
|
+
};
|
|
40655
|
+
}
|
|
40377
40656
|
|
|
40378
40657
|
// packages/core/src/intelligence/patterns.ts
|
|
40379
40658
|
import { randomBytes as randomBytes7 } from "node:crypto";
|
|
@@ -40889,13 +41168,13 @@ function extractYamlArray(content, field) {
|
|
|
40889
41168
|
}
|
|
40890
41169
|
const lines = content.split("\n");
|
|
40891
41170
|
const items = [];
|
|
40892
|
-
let
|
|
41171
|
+
let inArray6 = false;
|
|
40893
41172
|
for (const line2 of lines) {
|
|
40894
41173
|
if (line2.match(new RegExp(`^${field}:`))) {
|
|
40895
|
-
|
|
41174
|
+
inArray6 = true;
|
|
40896
41175
|
continue;
|
|
40897
41176
|
}
|
|
40898
|
-
if (
|
|
41177
|
+
if (inArray6) {
|
|
40899
41178
|
const itemMatch = line2.match(/^\s+-\s+["']?(.+?)["']?\s*$/);
|
|
40900
41179
|
if (itemMatch) {
|
|
40901
41180
|
items.push(itemMatch[1].trim());
|
|
@@ -41113,6 +41392,60 @@ function addIssue(params) {
|
|
|
41113
41392
|
};
|
|
41114
41393
|
}
|
|
41115
41394
|
|
|
41395
|
+
// packages/core/src/lib/index.ts
|
|
41396
|
+
var lib_exports = {};
|
|
41397
|
+
__export(lib_exports, {
|
|
41398
|
+
computeDelay: () => computeDelay,
|
|
41399
|
+
withRetry: () => withRetry2
|
|
41400
|
+
});
|
|
41401
|
+
|
|
41402
|
+
// packages/core/src/lib/retry.ts
|
|
41403
|
+
async function withRetry2(fn, options) {
|
|
41404
|
+
const maxAttempts = options?.maxAttempts ?? 3;
|
|
41405
|
+
const baseDelayMs = options?.baseDelayMs ?? 2e3;
|
|
41406
|
+
const maxDelayMs = options?.maxDelayMs ?? 3e4;
|
|
41407
|
+
const retryableErrors = options?.retryableErrors;
|
|
41408
|
+
let lastError;
|
|
41409
|
+
let totalDelayMs = 0;
|
|
41410
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
41411
|
+
try {
|
|
41412
|
+
return await fn();
|
|
41413
|
+
} catch (err) {
|
|
41414
|
+
lastError = err;
|
|
41415
|
+
const isLastAttempt = attempt === maxAttempts;
|
|
41416
|
+
if (isLastAttempt) break;
|
|
41417
|
+
if (retryableErrors !== void 0 && !isRetryable(err, retryableErrors)) break;
|
|
41418
|
+
const delay = computeDelay(attempt, baseDelayMs, maxDelayMs);
|
|
41419
|
+
totalDelayMs += delay;
|
|
41420
|
+
await sleep2(delay);
|
|
41421
|
+
}
|
|
41422
|
+
}
|
|
41423
|
+
const context = { attempts: maxAttempts, totalDelayMs };
|
|
41424
|
+
augmentError(lastError, context);
|
|
41425
|
+
throw lastError;
|
|
41426
|
+
}
|
|
41427
|
+
function computeDelay(attempt, baseDelayMs, maxDelayMs) {
|
|
41428
|
+
const exponential = baseDelayMs * 2 ** (attempt - 1);
|
|
41429
|
+
return Math.min(exponential, maxDelayMs);
|
|
41430
|
+
}
|
|
41431
|
+
function isRetryable(err, predicates) {
|
|
41432
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
41433
|
+
return predicates.some((predicate) => {
|
|
41434
|
+
if (predicate instanceof RegExp) return predicate.test(message);
|
|
41435
|
+
return predicate(err);
|
|
41436
|
+
});
|
|
41437
|
+
}
|
|
41438
|
+
function augmentError(err, context) {
|
|
41439
|
+
if (err instanceof Error) {
|
|
41440
|
+
const mutableErr = err;
|
|
41441
|
+
mutableErr.attempts = context.attempts;
|
|
41442
|
+
mutableErr.totalDelayMs = context.totalDelayMs;
|
|
41443
|
+
}
|
|
41444
|
+
}
|
|
41445
|
+
function sleep2(ms) {
|
|
41446
|
+
return new Promise((resolve10) => setTimeout(resolve10, ms));
|
|
41447
|
+
}
|
|
41448
|
+
|
|
41116
41449
|
// packages/core/src/lifecycle/index.ts
|
|
41117
41450
|
var lifecycle_exports = {};
|
|
41118
41451
|
__export(lifecycle_exports, {
|
|
@@ -41929,12 +42262,12 @@ async function getEnforcementMode(cwd) {
|
|
|
41929
42262
|
}
|
|
41930
42263
|
async function getLifecycleStatus(epicId, cwd) {
|
|
41931
42264
|
const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
41932
|
-
const { eq:
|
|
42265
|
+
const { eq: eq12 } = await import("drizzle-orm");
|
|
41933
42266
|
const db = await getDb3(cwd);
|
|
41934
42267
|
const pipelineResult = await db.select({
|
|
41935
42268
|
pipeline: lifecyclePipelines,
|
|
41936
42269
|
task: tasks
|
|
41937
|
-
}).from(lifecyclePipelines).innerJoin(tasks,
|
|
42270
|
+
}).from(lifecyclePipelines).innerJoin(tasks, eq12(lifecyclePipelines.taskId, tasks.id)).where(eq12(lifecyclePipelines.taskId, epicId)).limit(1);
|
|
41938
42271
|
if (pipelineResult.length === 0) {
|
|
41939
42272
|
return {
|
|
41940
42273
|
epicId,
|
|
@@ -41947,7 +42280,7 @@ async function getLifecycleStatus(epicId, cwd) {
|
|
|
41947
42280
|
}
|
|
41948
42281
|
const task = pipelineResult[0].task;
|
|
41949
42282
|
const pipelineId = `pipeline-${epicId}`;
|
|
41950
|
-
const stageRows = await db.select().from(lifecycleStages).where(
|
|
42283
|
+
const stageRows = await db.select().from(lifecycleStages).where(eq12(lifecycleStages.pipelineId, pipelineId)).orderBy(lifecycleStages.sequence);
|
|
41951
42284
|
const stageDataMap = /* @__PURE__ */ new Map();
|
|
41952
42285
|
for (const row of stageRows) {
|
|
41953
42286
|
let parsedChain;
|
|
@@ -42016,10 +42349,10 @@ async function getLifecycleStatus(epicId, cwd) {
|
|
|
42016
42349
|
}
|
|
42017
42350
|
async function getLifecycleHistory(epicId, cwd) {
|
|
42018
42351
|
const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
42019
|
-
const { eq:
|
|
42352
|
+
const { eq: eq12 } = await import("drizzle-orm");
|
|
42020
42353
|
const db = await getDb3(cwd);
|
|
42021
42354
|
const pipelineId = `pipeline-${epicId}`;
|
|
42022
|
-
const stages = await db.select().from(lifecycleStages).where(
|
|
42355
|
+
const stages = await db.select().from(lifecycleStages).where(eq12(lifecycleStages.pipelineId, pipelineId));
|
|
42023
42356
|
if (stages.length === 0) {
|
|
42024
42357
|
return { epicId, history: [] };
|
|
42025
42358
|
}
|
|
@@ -42049,7 +42382,7 @@ async function getLifecycleHistory(epicId, cwd) {
|
|
|
42049
42382
|
}
|
|
42050
42383
|
const stageIds = stages.map((s) => s.id);
|
|
42051
42384
|
if (stageIds.length > 0) {
|
|
42052
|
-
const gateResults = await db.select().from(lifecycleGateResults).where(
|
|
42385
|
+
const gateResults = await db.select().from(lifecycleGateResults).where(eq12(lifecycleGateResults.stageId, stageIds[0]));
|
|
42053
42386
|
for (const gate of gateResults) {
|
|
42054
42387
|
const stageName = stageIdToName.get(gate.stageId);
|
|
42055
42388
|
if (stageName) {
|
|
@@ -42062,7 +42395,7 @@ async function getLifecycleHistory(epicId, cwd) {
|
|
|
42062
42395
|
}
|
|
42063
42396
|
}
|
|
42064
42397
|
for (let i = 1; i < stageIds.length; i++) {
|
|
42065
|
-
const additionalGates = await db.select().from(lifecycleGateResults).where(
|
|
42398
|
+
const additionalGates = await db.select().from(lifecycleGateResults).where(eq12(lifecycleGateResults.stageId, stageIds[i]));
|
|
42066
42399
|
for (const gate of additionalGates) {
|
|
42067
42400
|
const stageName = stageIdToName.get(gate.stageId);
|
|
42068
42401
|
if (stageName) {
|
|
@@ -42081,16 +42414,16 @@ async function getLifecycleHistory(epicId, cwd) {
|
|
|
42081
42414
|
}
|
|
42082
42415
|
async function getLifecycleGates(epicId, cwd) {
|
|
42083
42416
|
const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
42084
|
-
const { eq:
|
|
42417
|
+
const { eq: eq12 } = await import("drizzle-orm");
|
|
42085
42418
|
const db = await getDb3(cwd);
|
|
42086
42419
|
const pipelineId = `pipeline-${epicId}`;
|
|
42087
|
-
const stages = await db.select().from(lifecycleStages).where(
|
|
42420
|
+
const stages = await db.select().from(lifecycleStages).where(eq12(lifecycleStages.pipelineId, pipelineId));
|
|
42088
42421
|
if (stages.length === 0) {
|
|
42089
42422
|
return {};
|
|
42090
42423
|
}
|
|
42091
42424
|
const gates = {};
|
|
42092
42425
|
for (const stage of stages) {
|
|
42093
|
-
const gateRows = await db.select().from(lifecycleGateResults).where(
|
|
42426
|
+
const gateRows = await db.select().from(lifecycleGateResults).where(eq12(lifecycleGateResults.stageId, stage.id));
|
|
42094
42427
|
if (gateRows.length > 0) {
|
|
42095
42428
|
gates[stage.stageName] = {};
|
|
42096
42429
|
for (const gateRow of gateRows) {
|
|
@@ -42154,7 +42487,7 @@ async function checkStagePrerequisites(epicId, targetStage, cwd) {
|
|
|
42154
42487
|
}
|
|
42155
42488
|
async function ensureLifecycleContext(epicId, stageName, cwd, options) {
|
|
42156
42489
|
const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
42157
|
-
const { eq:
|
|
42490
|
+
const { eq: eq12 } = await import("drizzle-orm");
|
|
42158
42491
|
const db = await getDb3(cwd);
|
|
42159
42492
|
const pipelineId = `pipeline-${epicId}`;
|
|
42160
42493
|
const stageId = `stage-${epicId}-${stageName}`;
|
|
@@ -42162,7 +42495,7 @@ async function ensureLifecycleContext(epicId, stageName, cwd, options) {
|
|
|
42162
42495
|
getNativeDb2().prepare(
|
|
42163
42496
|
`INSERT OR IGNORE INTO tasks (id, title, status, priority, created_at) VALUES (?, ?, 'pending', 'medium', datetime('now'))`
|
|
42164
42497
|
).run(epicId, `Task ${epicId}`);
|
|
42165
|
-
const existingPipeline = await db.select().from(lifecyclePipelines).where(
|
|
42498
|
+
const existingPipeline = await db.select().from(lifecyclePipelines).where(eq12(lifecyclePipelines.id, pipelineId)).limit(1).all();
|
|
42166
42499
|
if (existingPipeline.length === 0) {
|
|
42167
42500
|
await db.insert(lifecyclePipelines).values({
|
|
42168
42501
|
id: pipelineId,
|
|
@@ -42172,7 +42505,7 @@ async function ensureLifecycleContext(epicId, stageName, cwd, options) {
|
|
|
42172
42505
|
startedAt: options.now
|
|
42173
42506
|
}).run();
|
|
42174
42507
|
}
|
|
42175
|
-
const existingStage = await db.select().from(lifecycleStages).where(
|
|
42508
|
+
const existingStage = await db.select().from(lifecycleStages).where(eq12(lifecycleStages.id, stageId)).limit(1).all();
|
|
42176
42509
|
if (existingStage.length === 0) {
|
|
42177
42510
|
const sequence = isValidStage(stageName) ? STAGE_ORDER[stageName] : 0;
|
|
42178
42511
|
await db.insert(lifecycleStages).values({
|
|
@@ -42185,7 +42518,7 @@ async function ensureLifecycleContext(epicId, stageName, cwd, options) {
|
|
|
42185
42518
|
}).run();
|
|
42186
42519
|
}
|
|
42187
42520
|
if (options.updateCurrentStage) {
|
|
42188
|
-
await db.update(lifecyclePipelines).set({ currentStageId: stageId }).where(
|
|
42521
|
+
await db.update(lifecyclePipelines).set({ currentStageId: stageId }).where(eq12(lifecyclePipelines.id, pipelineId)).run();
|
|
42189
42522
|
}
|
|
42190
42523
|
return { db, pipelineId, stageId };
|
|
42191
42524
|
}
|
|
@@ -42200,7 +42533,7 @@ async function recordStageProgress(epicId, stage, status, notes, cwd) {
|
|
|
42200
42533
|
`Invalid status: ${status}. Valid: ${validStatuses.join(", ")}`
|
|
42201
42534
|
);
|
|
42202
42535
|
}
|
|
42203
|
-
const { eq:
|
|
42536
|
+
const { eq: eq12 } = await import("drizzle-orm");
|
|
42204
42537
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
42205
42538
|
const stageName = stage;
|
|
42206
42539
|
const { db, stageId, pipelineId } = await ensureLifecycleContext(epicId, stage, cwd, {
|
|
@@ -42216,7 +42549,7 @@ async function recordStageProgress(epicId, stage, status, notes, cwd) {
|
|
|
42216
42549
|
status,
|
|
42217
42550
|
related: artifact.related
|
|
42218
42551
|
};
|
|
42219
|
-
const existingStage = await db.select().from(lifecycleStages).where(
|
|
42552
|
+
const existingStage = await db.select().from(lifecycleStages).where(eq12(lifecycleStages.id, stageId)).limit(1).all();
|
|
42220
42553
|
const sequence = STAGE_ORDER[stage];
|
|
42221
42554
|
const stageValues = {
|
|
42222
42555
|
status,
|
|
@@ -42243,7 +42576,7 @@ async function recordStageProgress(epicId, stage, status, notes, cwd) {
|
|
|
42243
42576
|
provenanceChainJson: JSON.stringify(provenanceChain)
|
|
42244
42577
|
}).run();
|
|
42245
42578
|
} else {
|
|
42246
|
-
await db.update(lifecycleStages).set(stageValues).where(
|
|
42579
|
+
await db.update(lifecycleStages).set(stageValues).where(eq12(lifecycleStages.id, stageId)).run();
|
|
42247
42580
|
}
|
|
42248
42581
|
if (status === "completed") {
|
|
42249
42582
|
await linkProvenance(epicId, stageName, artifact.absolutePath, cwd);
|
|
@@ -42263,7 +42596,7 @@ async function resetStage(epicId, stage, reason, cwd) {
|
|
|
42263
42596
|
if (!PIPELINE_STAGES.includes(stage)) {
|
|
42264
42597
|
throw new CleoError(2 /* INVALID_INPUT */, `Invalid stage: ${stage}`);
|
|
42265
42598
|
}
|
|
42266
|
-
const { eq:
|
|
42599
|
+
const { eq: eq12 } = await import("drizzle-orm");
|
|
42267
42600
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
42268
42601
|
const { db, stageId } = await ensureLifecycleContext(epicId, stage, cwd, {
|
|
42269
42602
|
now,
|
|
@@ -42276,11 +42609,11 @@ async function resetStage(epicId, stage, reason, cwd) {
|
|
|
42276
42609
|
skippedAt: null,
|
|
42277
42610
|
skipReason: null,
|
|
42278
42611
|
notesJson: JSON.stringify([`Reset: ${reason}`])
|
|
42279
|
-
}).where(
|
|
42612
|
+
}).where(eq12(lifecycleStages.id, stageId)).run();
|
|
42280
42613
|
return { epicId, stage, reason };
|
|
42281
42614
|
}
|
|
42282
42615
|
async function passGate(epicId, gateName, agent, notes, cwd) {
|
|
42283
|
-
const { eq:
|
|
42616
|
+
const { eq: eq12 } = await import("drizzle-orm");
|
|
42284
42617
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
42285
42618
|
const stageName = gateName.split("-")[0];
|
|
42286
42619
|
const gateId = `gate-${epicId}-${stageName}-${gateName}`;
|
|
@@ -42289,7 +42622,7 @@ async function passGate(epicId, gateName, agent, notes, cwd) {
|
|
|
42289
42622
|
stageStatusOnCreate: "in_progress",
|
|
42290
42623
|
updateCurrentStage: true
|
|
42291
42624
|
});
|
|
42292
|
-
const existingGate = await db.select().from(lifecycleGateResults).where(
|
|
42625
|
+
const existingGate = await db.select().from(lifecycleGateResults).where(eq12(lifecycleGateResults.id, gateId)).limit(1).all();
|
|
42293
42626
|
const gateValues = {
|
|
42294
42627
|
id: gateId,
|
|
42295
42628
|
stageId,
|
|
@@ -42301,14 +42634,14 @@ async function passGate(epicId, gateName, agent, notes, cwd) {
|
|
|
42301
42634
|
reason: null
|
|
42302
42635
|
};
|
|
42303
42636
|
if (existingGate.length > 0) {
|
|
42304
|
-
await db.update(lifecycleGateResults).set(gateValues).where(
|
|
42637
|
+
await db.update(lifecycleGateResults).set(gateValues).where(eq12(lifecycleGateResults.id, gateId)).run();
|
|
42305
42638
|
} else {
|
|
42306
42639
|
await db.insert(lifecycleGateResults).values(gateValues).run();
|
|
42307
42640
|
}
|
|
42308
42641
|
return { epicId, gateName, timestamp: now };
|
|
42309
42642
|
}
|
|
42310
42643
|
async function failGate(epicId, gateName, reason, cwd) {
|
|
42311
|
-
const { eq:
|
|
42644
|
+
const { eq: eq12 } = await import("drizzle-orm");
|
|
42312
42645
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
42313
42646
|
const stageName = gateName.split("-")[0];
|
|
42314
42647
|
const gateId = `gate-${epicId}-${stageName}-${gateName}`;
|
|
@@ -42317,7 +42650,7 @@ async function failGate(epicId, gateName, reason, cwd) {
|
|
|
42317
42650
|
stageStatusOnCreate: "in_progress",
|
|
42318
42651
|
updateCurrentStage: true
|
|
42319
42652
|
});
|
|
42320
|
-
const existingGate = await db.select().from(lifecycleGateResults).where(
|
|
42653
|
+
const existingGate = await db.select().from(lifecycleGateResults).where(eq12(lifecycleGateResults.id, gateId)).limit(1).all();
|
|
42321
42654
|
const gateValues = {
|
|
42322
42655
|
id: gateId,
|
|
42323
42656
|
stageId,
|
|
@@ -42329,7 +42662,7 @@ async function failGate(epicId, gateName, reason, cwd) {
|
|
|
42329
42662
|
reason: reason ?? null
|
|
42330
42663
|
};
|
|
42331
42664
|
if (existingGate.length > 0) {
|
|
42332
|
-
await db.update(lifecycleGateResults).set(gateValues).where(
|
|
42665
|
+
await db.update(lifecycleGateResults).set(gateValues).where(eq12(lifecycleGateResults.id, gateId)).run();
|
|
42333
42666
|
} else {
|
|
42334
42667
|
await db.insert(lifecycleGateResults).values(gateValues).run();
|
|
42335
42668
|
}
|
|
@@ -46463,6 +46796,7 @@ init_registry3();
|
|
|
46463
46796
|
// packages/core/src/nexus/sharing/index.ts
|
|
46464
46797
|
init_config();
|
|
46465
46798
|
init_paths();
|
|
46799
|
+
init_git_checkpoint();
|
|
46466
46800
|
import { existsSync as existsSync54, readdirSync as readdirSync22, statSync as statSync15 } from "node:fs";
|
|
46467
46801
|
import { readFile as readFile10, writeFile as writeFile9 } from "node:fs/promises";
|
|
46468
46802
|
import { join as join61, relative as relative5 } from "node:path";
|
|
@@ -46509,6 +46843,30 @@ function collectCleoFiles(cleoDir) {
|
|
|
46509
46843
|
walk(cleoDir);
|
|
46510
46844
|
return files.sort();
|
|
46511
46845
|
}
|
|
46846
|
+
async function getCleoGitRemotes(cleoDir) {
|
|
46847
|
+
const result = await cleoGitCommand(["remote"], cleoDir);
|
|
46848
|
+
if (!result.success || !result.stdout) return [];
|
|
46849
|
+
return result.stdout.split("\n").map((r) => r.trim()).filter(Boolean);
|
|
46850
|
+
}
|
|
46851
|
+
async function hasCleoGitPendingChanges(cleoDir) {
|
|
46852
|
+
const result = await cleoGitCommand(["status", "--porcelain"], cleoDir);
|
|
46853
|
+
if (!result.success) return false;
|
|
46854
|
+
return result.stdout.length > 0;
|
|
46855
|
+
}
|
|
46856
|
+
async function getLastSyncTimestamp(cleoDir) {
|
|
46857
|
+
const result = await cleoGitCommand(["reflog", "--format=%gs %ci", "HEAD"], cleoDir);
|
|
46858
|
+
if (!result.success || !result.stdout) return null;
|
|
46859
|
+
for (const line2 of result.stdout.split("\n")) {
|
|
46860
|
+
const trimmed = line2.trim();
|
|
46861
|
+
if (/^(fetch|push|pull)\b/i.test(trimmed)) {
|
|
46862
|
+
const isoMatch = trimmed.match(/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} [+-]\d{4})$/);
|
|
46863
|
+
if (isoMatch?.[1]) {
|
|
46864
|
+
return new Date(isoMatch[1]).toISOString();
|
|
46865
|
+
}
|
|
46866
|
+
}
|
|
46867
|
+
}
|
|
46868
|
+
return null;
|
|
46869
|
+
}
|
|
46512
46870
|
async function getSharingStatus(cwd) {
|
|
46513
46871
|
const config2 = await loadConfig(cwd);
|
|
46514
46872
|
const sharing = config2.sharing;
|
|
@@ -46525,12 +46883,27 @@ async function getSharingStatus(cwd) {
|
|
|
46525
46883
|
ignored.push(file2);
|
|
46526
46884
|
}
|
|
46527
46885
|
}
|
|
46886
|
+
const hasGit = isCleoGitInitialized(cleoDir);
|
|
46887
|
+
let remotes = [];
|
|
46888
|
+
let pendingChanges = false;
|
|
46889
|
+
let lastSync = null;
|
|
46890
|
+
if (hasGit) {
|
|
46891
|
+
[remotes, pendingChanges, lastSync] = await Promise.all([
|
|
46892
|
+
getCleoGitRemotes(cleoDir),
|
|
46893
|
+
hasCleoGitPendingChanges(cleoDir),
|
|
46894
|
+
getLastSyncTimestamp(cleoDir)
|
|
46895
|
+
]);
|
|
46896
|
+
}
|
|
46528
46897
|
return {
|
|
46529
46898
|
mode: sharing.mode,
|
|
46530
46899
|
allowlist: sharing.commitAllowlist,
|
|
46531
46900
|
denylist: sharing.denylist,
|
|
46532
46901
|
tracked,
|
|
46533
|
-
ignored
|
|
46902
|
+
ignored,
|
|
46903
|
+
hasGit,
|
|
46904
|
+
remotes,
|
|
46905
|
+
pendingChanges,
|
|
46906
|
+
lastSync
|
|
46534
46907
|
};
|
|
46535
46908
|
}
|
|
46536
46909
|
function generateGitignoreEntries(sharing) {
|
|
@@ -46585,25 +46958,25 @@ init_logger();
|
|
|
46585
46958
|
init_sqlite2();
|
|
46586
46959
|
init_tasks_schema();
|
|
46587
46960
|
import { randomUUID as randomUUID4 } from "node:crypto";
|
|
46588
|
-
import { and as
|
|
46961
|
+
import { and as and7, eq as eq10 } from "drizzle-orm";
|
|
46589
46962
|
async function getLinksByProvider(providerId, cwd) {
|
|
46590
46963
|
const db = await getDb(cwd);
|
|
46591
|
-
const rows = await db.select().from(externalTaskLinks).where(
|
|
46964
|
+
const rows = await db.select().from(externalTaskLinks).where(eq10(externalTaskLinks.providerId, providerId));
|
|
46592
46965
|
return rows.map(rowToLink);
|
|
46593
46966
|
}
|
|
46594
46967
|
async function getLinkByExternalId(providerId, externalId, cwd) {
|
|
46595
46968
|
const db = await getDb(cwd);
|
|
46596
46969
|
const rows = await db.select().from(externalTaskLinks).where(
|
|
46597
|
-
|
|
46598
|
-
|
|
46599
|
-
|
|
46970
|
+
and7(
|
|
46971
|
+
eq10(externalTaskLinks.providerId, providerId),
|
|
46972
|
+
eq10(externalTaskLinks.externalId, externalId)
|
|
46600
46973
|
)
|
|
46601
46974
|
);
|
|
46602
46975
|
return rows.length > 0 ? rowToLink(rows[0]) : null;
|
|
46603
46976
|
}
|
|
46604
46977
|
async function getLinksByTaskId(taskId, cwd) {
|
|
46605
46978
|
const db = await getDb(cwd);
|
|
46606
|
-
const rows = await db.select().from(externalTaskLinks).where(
|
|
46979
|
+
const rows = await db.select().from(externalTaskLinks).where(eq10(externalTaskLinks.taskId, taskId));
|
|
46607
46980
|
return rows.map(rowToLink);
|
|
46608
46981
|
}
|
|
46609
46982
|
async function createLink(params, cwd) {
|
|
@@ -46647,11 +47020,11 @@ async function touchLink(linkId, updates, cwd) {
|
|
|
46647
47020
|
if (updates?.metadata !== void 0) {
|
|
46648
47021
|
values.metadataJson = JSON.stringify(updates.metadata);
|
|
46649
47022
|
}
|
|
46650
|
-
await db.update(externalTaskLinks).set(values).where(
|
|
47023
|
+
await db.update(externalTaskLinks).set(values).where(eq10(externalTaskLinks.id, linkId));
|
|
46651
47024
|
}
|
|
46652
47025
|
async function removeLinksByProvider(providerId, cwd) {
|
|
46653
47026
|
const db = await getDb(cwd);
|
|
46654
|
-
const result = await db.delete(externalTaskLinks).where(
|
|
47027
|
+
const result = await db.delete(externalTaskLinks).where(eq10(externalTaskLinks.providerId, providerId));
|
|
46655
47028
|
return Number(result.changes);
|
|
46656
47029
|
}
|
|
46657
47030
|
function rowToLink(row) {
|
|
@@ -49703,7 +50076,7 @@ import { execFileSync as execFileSync7 } from "node:child_process";
|
|
|
49703
50076
|
import { existsSync as existsSync63, renameSync as renameSync5 } from "node:fs";
|
|
49704
50077
|
import { readFile as readFile12 } from "node:fs/promises";
|
|
49705
50078
|
import { join as join67 } from "node:path";
|
|
49706
|
-
import { and as
|
|
50079
|
+
import { and as and8, count, desc as desc4, eq as eq11 } from "drizzle-orm";
|
|
49707
50080
|
init_paths();
|
|
49708
50081
|
init_tasks_schema();
|
|
49709
50082
|
|
|
@@ -50003,7 +50376,7 @@ function rowToManifest(row) {
|
|
|
50003
50376
|
}
|
|
50004
50377
|
async function findLatestPushedVersion(cwd) {
|
|
50005
50378
|
const db = await getDb2(cwd);
|
|
50006
|
-
const rows = await db.select({ version: releaseManifests.version }).from(releaseManifests).where(
|
|
50379
|
+
const rows = await db.select({ version: releaseManifests.version }).from(releaseManifests).where(eq11(releaseManifests.status, "pushed")).orderBy(desc4(releaseManifests.pushedAt)).limit(1).all();
|
|
50007
50380
|
return rows[0]?.version;
|
|
50008
50381
|
}
|
|
50009
50382
|
async function prepareRelease(version2, tasks2, notes, loadTasksFn, cwd) {
|
|
@@ -50015,7 +50388,7 @@ async function prepareRelease(version2, tasks2, notes, loadTasksFn, cwd) {
|
|
|
50015
50388
|
}
|
|
50016
50389
|
const normalizedVersion = normalizeVersion(version2);
|
|
50017
50390
|
const db = await getDb2(cwd);
|
|
50018
|
-
const existing = await db.select().from(releaseManifests).where(
|
|
50391
|
+
const existing = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
|
|
50019
50392
|
if (existing.length > 0) {
|
|
50020
50393
|
throw new Error(`Release ${normalizedVersion} already exists (status: ${existing[0].status})`);
|
|
50021
50394
|
}
|
|
@@ -50055,7 +50428,7 @@ async function generateReleaseChangelog(version2, loadTasksFn, cwd) {
|
|
|
50055
50428
|
}
|
|
50056
50429
|
const normalizedVersion = normalizeVersion(version2);
|
|
50057
50430
|
const db = await getDb2(cwd);
|
|
50058
|
-
const rows = await db.select().from(releaseManifests).where(
|
|
50431
|
+
const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
|
|
50059
50432
|
if (rows.length === 0) {
|
|
50060
50433
|
throw new Error(`Release ${normalizedVersion} not found`);
|
|
50061
50434
|
}
|
|
@@ -50192,7 +50565,7 @@ async function generateReleaseChangelog(version2, loadTasksFn, cwd) {
|
|
|
50192
50565
|
sections.push("");
|
|
50193
50566
|
}
|
|
50194
50567
|
const changelog = sections.join("\n");
|
|
50195
|
-
await db.update(releaseManifests).set({ changelog }).where(
|
|
50568
|
+
await db.update(releaseManifests).set({ changelog }).where(eq11(releaseManifests.version, normalizedVersion)).run();
|
|
50196
50569
|
const changelogPath = join67(cwd ?? process.cwd(), "CHANGELOG.md");
|
|
50197
50570
|
let existingChangelogContent = "";
|
|
50198
50571
|
try {
|
|
@@ -50230,8 +50603,8 @@ async function listManifestReleases(optionsOrCwd, cwd) {
|
|
|
50230
50603
|
const db = await getDb2(effectiveCwd);
|
|
50231
50604
|
const totalRow = await db.select({ count: count() }).from(releaseManifests).get();
|
|
50232
50605
|
const total = totalRow?.count ?? 0;
|
|
50233
|
-
const conditions = options.status ? [
|
|
50234
|
-
const whereClause = conditions.length > 0 ?
|
|
50606
|
+
const conditions = options.status ? [eq11(releaseManifests.status, options.status)] : [];
|
|
50607
|
+
const whereClause = conditions.length > 0 ? and8(...conditions) : void 0;
|
|
50235
50608
|
const filteredRow = await db.select({ count: count() }).from(releaseManifests).where(whereClause).get();
|
|
50236
50609
|
const filtered = filteredRow?.count ?? 0;
|
|
50237
50610
|
let query = db.select().from(releaseManifests).where(whereClause).orderBy(desc4(releaseManifests.createdAt));
|
|
@@ -50262,7 +50635,7 @@ async function showManifestRelease(version2, cwd) {
|
|
|
50262
50635
|
}
|
|
50263
50636
|
const normalizedVersion = normalizeVersion(version2);
|
|
50264
50637
|
const db = await getDb2(cwd);
|
|
50265
|
-
const rows = await db.select().from(releaseManifests).where(
|
|
50638
|
+
const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
|
|
50266
50639
|
if (rows.length === 0) {
|
|
50267
50640
|
throw new Error(`Release ${normalizedVersion} not found`);
|
|
50268
50641
|
}
|
|
@@ -50274,7 +50647,7 @@ async function commitRelease(version2, cwd) {
|
|
|
50274
50647
|
}
|
|
50275
50648
|
const normalizedVersion = normalizeVersion(version2);
|
|
50276
50649
|
const db = await getDb2(cwd);
|
|
50277
|
-
const rows = await db.select().from(releaseManifests).where(
|
|
50650
|
+
const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
|
|
50278
50651
|
if (rows.length === 0) {
|
|
50279
50652
|
throw new Error(`Release ${normalizedVersion} not found`);
|
|
50280
50653
|
}
|
|
@@ -50284,7 +50657,7 @@ async function commitRelease(version2, cwd) {
|
|
|
50284
50657
|
);
|
|
50285
50658
|
}
|
|
50286
50659
|
const committedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
50287
|
-
await db.update(releaseManifests).set({ status: "committed", committedAt }).where(
|
|
50660
|
+
await db.update(releaseManifests).set({ status: "committed", committedAt }).where(eq11(releaseManifests.version, normalizedVersion)).run();
|
|
50288
50661
|
return { version: normalizedVersion, status: "committed", committedAt };
|
|
50289
50662
|
}
|
|
50290
50663
|
async function tagRelease(version2, cwd) {
|
|
@@ -50293,12 +50666,12 @@ async function tagRelease(version2, cwd) {
|
|
|
50293
50666
|
}
|
|
50294
50667
|
const normalizedVersion = normalizeVersion(version2);
|
|
50295
50668
|
const db = await getDb2(cwd);
|
|
50296
|
-
const rows = await db.select().from(releaseManifests).where(
|
|
50669
|
+
const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
|
|
50297
50670
|
if (rows.length === 0) {
|
|
50298
50671
|
throw new Error(`Release ${normalizedVersion} not found`);
|
|
50299
50672
|
}
|
|
50300
50673
|
const taggedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
50301
|
-
await db.update(releaseManifests).set({ status: "tagged", taggedAt }).where(
|
|
50674
|
+
await db.update(releaseManifests).set({ status: "tagged", taggedAt }).where(eq11(releaseManifests.version, normalizedVersion)).run();
|
|
50302
50675
|
return { version: normalizedVersion, status: "tagged", taggedAt };
|
|
50303
50676
|
}
|
|
50304
50677
|
async function runReleaseGates(version2, loadTasksFn, cwd, opts) {
|
|
@@ -50307,7 +50680,7 @@ async function runReleaseGates(version2, loadTasksFn, cwd, opts) {
|
|
|
50307
50680
|
}
|
|
50308
50681
|
const normalizedVersion = normalizeVersion(version2);
|
|
50309
50682
|
const db = await getDb2(cwd);
|
|
50310
|
-
const rows = await db.select().from(releaseManifests).where(
|
|
50683
|
+
const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
|
|
50311
50684
|
if (rows.length === 0) {
|
|
50312
50685
|
throw new Error(`Release ${normalizedVersion} not found`);
|
|
50313
50686
|
}
|
|
@@ -50455,7 +50828,7 @@ async function cancelRelease(version2, projectRoot) {
|
|
|
50455
50828
|
}
|
|
50456
50829
|
const normalizedVersion = normalizeVersion(version2);
|
|
50457
50830
|
const db = await getDb2(projectRoot);
|
|
50458
|
-
const rows = await db.select().from(releaseManifests).where(
|
|
50831
|
+
const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
|
|
50459
50832
|
if (rows.length === 0) {
|
|
50460
50833
|
return {
|
|
50461
50834
|
success: false,
|
|
@@ -50472,7 +50845,7 @@ async function cancelRelease(version2, projectRoot) {
|
|
|
50472
50845
|
version: normalizedVersion
|
|
50473
50846
|
};
|
|
50474
50847
|
}
|
|
50475
|
-
await db.delete(releaseManifests).where(
|
|
50848
|
+
await db.delete(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).run();
|
|
50476
50849
|
return {
|
|
50477
50850
|
success: true,
|
|
50478
50851
|
message: `Release ${normalizedVersion} cancelled and removed`,
|
|
@@ -50485,12 +50858,12 @@ async function rollbackRelease(version2, reason, cwd) {
|
|
|
50485
50858
|
}
|
|
50486
50859
|
const normalizedVersion = normalizeVersion(version2);
|
|
50487
50860
|
const db = await getDb2(cwd);
|
|
50488
|
-
const rows = await db.select().from(releaseManifests).where(
|
|
50861
|
+
const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
|
|
50489
50862
|
if (rows.length === 0) {
|
|
50490
50863
|
throw new Error(`Release ${normalizedVersion} not found`);
|
|
50491
50864
|
}
|
|
50492
50865
|
const previousStatus = rows[0].status;
|
|
50493
|
-
await db.update(releaseManifests).set({ status: "rolled_back" }).where(
|
|
50866
|
+
await db.update(releaseManifests).set({ status: "rolled_back" }).where(eq11(releaseManifests.version, normalizedVersion)).run();
|
|
50494
50867
|
return {
|
|
50495
50868
|
version: normalizedVersion,
|
|
50496
50869
|
previousStatus,
|
|
@@ -50600,7 +50973,7 @@ async function markReleasePushed(version2, pushedAt, cwd, provenance) {
|
|
|
50600
50973
|
pushedAt,
|
|
50601
50974
|
...provenance?.commitSha != null ? { commitSha: provenance.commitSha } : {},
|
|
50602
50975
|
...provenance?.gitTag != null ? { gitTag: provenance.gitTag } : {}
|
|
50603
|
-
}).where(
|
|
50976
|
+
}).where(eq11(releaseManifests.version, normalizedVersion)).run();
|
|
50604
50977
|
}
|
|
50605
50978
|
async function migrateReleasesJsonToSqlite(projectRoot) {
|
|
50606
50979
|
const releasesPath = join67(getCleoDirAbsolute(projectRoot), "releases.json");
|
|
@@ -50620,7 +50993,7 @@ async function migrateReleasesJsonToSqlite(projectRoot) {
|
|
|
50620
50993
|
const db = await getDb2(projectRoot);
|
|
50621
50994
|
let migrated = 0;
|
|
50622
50995
|
for (const r of raw.releases) {
|
|
50623
|
-
const existing = await db.select({ id: releaseManifests.id }).from(releaseManifests).where(
|
|
50996
|
+
const existing = await db.select({ id: releaseManifests.id }).from(releaseManifests).where(eq11(releaseManifests.version, r.version)).limit(1).all();
|
|
50624
50997
|
if (existing.length > 0) continue;
|
|
50625
50998
|
const id = `rel-${r.version.replace(/[^a-z0-9]/gi, "-")}`;
|
|
50626
50999
|
await db.insert(releaseManifests).values({
|
|
@@ -56078,7 +56451,7 @@ async function queryTasks(cwd, since) {
|
|
|
56078
56451
|
try {
|
|
56079
56452
|
const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
56080
56453
|
const { tasks: tasks2 } = await Promise.resolve().then(() => (init_tasks_schema(), tasks_schema_exports));
|
|
56081
|
-
const { and:
|
|
56454
|
+
const { and: and9, gte: gte3 } = await import("drizzle-orm");
|
|
56082
56455
|
const db = await getDb3(cwd);
|
|
56083
56456
|
const conditions = [];
|
|
56084
56457
|
if (since) {
|
|
@@ -56092,7 +56465,7 @@ async function queryTasks(cwd, since) {
|
|
|
56092
56465
|
sessionId: tasks2.sessionId,
|
|
56093
56466
|
completedAt: tasks2.completedAt,
|
|
56094
56467
|
createdAt: tasks2.createdAt
|
|
56095
|
-
}).from(tasks2).where(conditions.length > 0 ?
|
|
56468
|
+
}).from(tasks2).where(conditions.length > 0 ? and9(...conditions) : void 0).all();
|
|
56096
56469
|
return rows;
|
|
56097
56470
|
} catch (err) {
|
|
56098
56471
|
log7.warn({ err }, "Failed to query tasks for workflow telemetry");
|
|
@@ -56103,7 +56476,7 @@ async function queryCompletionAuditRows(cwd, since) {
|
|
|
56103
56476
|
try {
|
|
56104
56477
|
const { getDb: getDb3 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
56105
56478
|
const { auditLog: auditLog2 } = await Promise.resolve().then(() => (init_tasks_schema(), tasks_schema_exports));
|
|
56106
|
-
const { and:
|
|
56479
|
+
const { and: and9, gte: gte3 } = await import("drizzle-orm");
|
|
56107
56480
|
const db = await getDb3(cwd);
|
|
56108
56481
|
const conditions = [];
|
|
56109
56482
|
if (since) conditions.push(gte3(auditLog2.timestamp, since));
|
|
@@ -56115,7 +56488,7 @@ async function queryCompletionAuditRows(cwd, since) {
|
|
|
56115
56488
|
afterJson: auditLog2.afterJson,
|
|
56116
56489
|
operation: auditLog2.operation,
|
|
56117
56490
|
domain: auditLog2.domain
|
|
56118
|
-
}).from(auditLog2).where(conditions.length > 0 ?
|
|
56491
|
+
}).from(auditLog2).where(conditions.length > 0 ? and9(...conditions) : void 0).orderBy(auditLog2.timestamp).all();
|
|
56119
56492
|
return allRows.filter((row) => {
|
|
56120
56493
|
const isComplete = row.action === "task_completed" || row.action === "complete" || row.operation === "complete" && row.domain === "tasks";
|
|
56121
56494
|
if (!isComplete && row.afterJson) {
|
|
@@ -64668,6 +65041,7 @@ export {
|
|
|
64668
65041
|
isSuccessCode,
|
|
64669
65042
|
isValidStatus,
|
|
64670
65043
|
issue_exports as issue,
|
|
65044
|
+
lib_exports as lib,
|
|
64671
65045
|
lifecycle_exports as lifecycle,
|
|
64672
65046
|
lifecycleEvidenceTypeSchema,
|
|
64673
65047
|
lifecycleGateResultSchema,
|