@cleocode/cleo 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/cli/index.js +1218 -605
- package/dist/cli/index.js.map +4 -4
- package/dist/mcp/index.js +1061 -604
- package/dist/mcp/index.js.map +4 -4
- package/package.json +3 -3
- package/dist/cli/commander-shim.d.ts +0 -112
- package/dist/cli/commander-shim.d.ts.map +0 -1
- package/dist/cli/commander-shim.js +0 -233
- package/dist/cli/commander-shim.js.map +0 -1
- package/dist/cli/commands/add.d.ts +0 -12
- package/dist/cli/commands/add.d.ts.map +0 -1
- package/dist/cli/commands/add.js +0 -91
- package/dist/cli/commands/add.js.map +0 -1
- package/dist/cli/commands/adr.d.ts +0 -27
- package/dist/cli/commands/adr.d.ts.map +0 -1
- package/dist/cli/commands/adr.js +0 -79
- package/dist/cli/commands/adr.js.map +0 -1
- package/dist/cli/commands/analyze.d.ts +0 -12
- package/dist/cli/commands/analyze.d.ts.map +0 -1
- package/dist/cli/commands/analyze.js +0 -20
- package/dist/cli/commands/analyze.js.map +0 -1
- package/dist/cli/commands/archive-stats.d.ts +0 -18
- package/dist/cli/commands/archive-stats.d.ts.map +0 -1
- package/dist/cli/commands/archive-stats.js +0 -49
- package/dist/cli/commands/archive-stats.js.map +0 -1
- package/dist/cli/commands/archive.d.ts +0 -12
- package/dist/cli/commands/archive.d.ts.map +0 -1
- package/dist/cli/commands/archive.js +0 -32
- package/dist/cli/commands/archive.js.map +0 -1
- package/dist/cli/commands/backup.d.ts +0 -8
- package/dist/cli/commands/backup.d.ts.map +0 -1
- package/dist/cli/commands/backup.js +0 -35
- package/dist/cli/commands/backup.js.map +0 -1
- package/dist/cli/commands/blockers.d.ts +0 -7
- package/dist/cli/commands/blockers.d.ts.map +0 -1
- package/dist/cli/commands/blockers.js +0 -16
- package/dist/cli/commands/blockers.js.map +0 -1
- package/dist/cli/commands/briefing.d.ts +0 -22
- package/dist/cli/commands/briefing.d.ts.map +0 -1
- package/dist/cli/commands/briefing.js +0 -45
- package/dist/cli/commands/briefing.js.map +0 -1
- package/dist/cli/commands/bug.d.ts +0 -12
- package/dist/cli/commands/bug.d.ts.map +0 -1
- package/dist/cli/commands/bug.js +0 -81
- package/dist/cli/commands/bug.js.map +0 -1
- package/dist/cli/commands/checkpoint.d.ts +0 -15
- package/dist/cli/commands/checkpoint.d.ts.map +0 -1
- package/dist/cli/commands/checkpoint.js +0 -91
- package/dist/cli/commands/checkpoint.js.map +0 -1
- package/dist/cli/commands/commands.d.ts +0 -13
- package/dist/cli/commands/commands.d.ts.map +0 -1
- package/dist/cli/commands/commands.js +0 -30
- package/dist/cli/commands/commands.js.map +0 -1
- package/dist/cli/commands/complete.d.ts +0 -12
- package/dist/cli/commands/complete.d.ts.map +0 -1
- package/dist/cli/commands/complete.js +0 -43
- package/dist/cli/commands/complete.js.map +0 -1
- package/dist/cli/commands/compliance.d.ts +0 -8
- package/dist/cli/commands/compliance.d.ts.map +0 -1
- package/dist/cli/commands/compliance.js +0 -85
- package/dist/cli/commands/compliance.js.map +0 -1
- package/dist/cli/commands/config.d.ts +0 -9
- package/dist/cli/commands/config.d.ts.map +0 -1
- package/dist/cli/commands/config.js +0 -43
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/consensus.d.ts +0 -13
- package/dist/cli/commands/consensus.d.ts.map +0 -1
- package/dist/cli/commands/consensus.js +0 -45
- package/dist/cli/commands/consensus.js.map +0 -1
- package/dist/cli/commands/context.d.ts +0 -8
- package/dist/cli/commands/context.d.ts.map +0 -1
- package/dist/cli/commands/context.js +0 -40
- package/dist/cli/commands/context.js.map +0 -1
- package/dist/cli/commands/contribution.d.ts +0 -13
- package/dist/cli/commands/contribution.d.ts.map +0 -1
- package/dist/cli/commands/contribution.js +0 -41
- package/dist/cli/commands/contribution.js.map +0 -1
- package/dist/cli/commands/current.d.ts +0 -13
- package/dist/cli/commands/current.d.ts.map +0 -1
- package/dist/cli/commands/current.js +0 -20
- package/dist/cli/commands/current.js.map +0 -1
- package/dist/cli/commands/dash.d.ts +0 -12
- package/dist/cli/commands/dash.d.ts.map +0 -1
- package/dist/cli/commands/dash.js +0 -24
- package/dist/cli/commands/dash.js.map +0 -1
- package/dist/cli/commands/decomposition.d.ts +0 -13
- package/dist/cli/commands/decomposition.d.ts.map +0 -1
- package/dist/cli/commands/decomposition.js +0 -45
- package/dist/cli/commands/decomposition.js.map +0 -1
- package/dist/cli/commands/delete.d.ts +0 -12
- package/dist/cli/commands/delete.d.ts.map +0 -1
- package/dist/cli/commands/delete.js +0 -37
- package/dist/cli/commands/delete.js.map +0 -1
- package/dist/cli/commands/deps.d.ts +0 -9
- package/dist/cli/commands/deps.d.ts.map +0 -1
- package/dist/cli/commands/deps.js +0 -73
- package/dist/cli/commands/deps.js.map +0 -1
- package/dist/cli/commands/detect-drift.d.ts +0 -15
- package/dist/cli/commands/detect-drift.d.ts.map +0 -1
- package/dist/cli/commands/detect-drift.js +0 -386
- package/dist/cli/commands/detect-drift.js.map +0 -1
- package/dist/cli/commands/detect.d.ts +0 -10
- package/dist/cli/commands/detect.d.ts.map +0 -1
- package/dist/cli/commands/detect.js +0 -24
- package/dist/cli/commands/detect.js.map +0 -1
- package/dist/cli/commands/docs.d.ts +0 -13
- package/dist/cli/commands/docs.d.ts.map +0 -1
- package/dist/cli/commands/docs.js +0 -169
- package/dist/cli/commands/docs.js.map +0 -1
- package/dist/cli/commands/doctor.d.ts +0 -11
- package/dist/cli/commands/doctor.d.ts.map +0 -1
- package/dist/cli/commands/doctor.js +0 -54
- package/dist/cli/commands/doctor.js.map +0 -1
- package/dist/cli/commands/dynamic.d.ts +0 -24
- package/dist/cli/commands/dynamic.d.ts.map +0 -1
- package/dist/cli/commands/dynamic.js +0 -27
- package/dist/cli/commands/dynamic.js.map +0 -1
- package/dist/cli/commands/env.d.ts +0 -12
- package/dist/cli/commands/env.d.ts.map +0 -1
- package/dist/cli/commands/env.js +0 -44
- package/dist/cli/commands/env.js.map +0 -1
- package/dist/cli/commands/exists.d.ts +0 -7
- package/dist/cli/commands/exists.d.ts.map +0 -1
- package/dist/cli/commands/exists.js +0 -33
- package/dist/cli/commands/exists.js.map +0 -1
- package/dist/cli/commands/export-tasks.d.ts +0 -10
- package/dist/cli/commands/export-tasks.d.ts.map +0 -1
- package/dist/cli/commands/export-tasks.js +0 -47
- package/dist/cli/commands/export-tasks.js.map +0 -1
- package/dist/cli/commands/export.d.ts +0 -9
- package/dist/cli/commands/export.d.ts.map +0 -1
- package/dist/cli/commands/export.js +0 -46
- package/dist/cli/commands/export.js.map +0 -1
- package/dist/cli/commands/find.d.ts +0 -14
- package/dist/cli/commands/find.d.ts.map +0 -1
- package/dist/cli/commands/find.js +0 -70
- package/dist/cli/commands/find.js.map +0 -1
- package/dist/cli/commands/generate-changelog.d.ts +0 -14
- package/dist/cli/commands/generate-changelog.d.ts.map +0 -1
- package/dist/cli/commands/generate-changelog.js +0 -252
- package/dist/cli/commands/generate-changelog.js.map +0 -1
- package/dist/cli/commands/grade.d.ts +0 -13
- package/dist/cli/commands/grade.d.ts.map +0 -1
- package/dist/cli/commands/grade.js +0 -26
- package/dist/cli/commands/grade.js.map +0 -1
- package/dist/cli/commands/history.d.ts +0 -9
- package/dist/cli/commands/history.d.ts.map +0 -1
- package/dist/cli/commands/history.js +0 -30
- package/dist/cli/commands/history.js.map +0 -1
- package/dist/cli/commands/implementation.d.ts +0 -13
- package/dist/cli/commands/implementation.d.ts.map +0 -1
- package/dist/cli/commands/implementation.js +0 -41
- package/dist/cli/commands/implementation.js.map +0 -1
- package/dist/cli/commands/import-tasks.d.ts +0 -10
- package/dist/cli/commands/import-tasks.d.ts.map +0 -1
- package/dist/cli/commands/import-tasks.js +0 -38
- package/dist/cli/commands/import-tasks.js.map +0 -1
- package/dist/cli/commands/import.d.ts +0 -9
- package/dist/cli/commands/import.d.ts.map +0 -1
- package/dist/cli/commands/import.js +0 -28
- package/dist/cli/commands/import.js.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -34
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/init.js +0 -89
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/inject.d.ts +0 -8
- package/dist/cli/commands/inject.d.ts.map +0 -1
- package/dist/cli/commands/inject.js +0 -28
- package/dist/cli/commands/inject.js.map +0 -1
- package/dist/cli/commands/install-global.d.ts +0 -19
- package/dist/cli/commands/install-global.d.ts.map +0 -1
- package/dist/cli/commands/install-global.js +0 -50
- package/dist/cli/commands/install-global.js.map +0 -1
- package/dist/cli/commands/issue.d.ts +0 -14
- package/dist/cli/commands/issue.d.ts.map +0 -1
- package/dist/cli/commands/issue.js +0 -105
- package/dist/cli/commands/issue.js.map +0 -1
- package/dist/cli/commands/labels.d.ts +0 -13
- package/dist/cli/commands/labels.d.ts.map +0 -1
- package/dist/cli/commands/labels.js +0 -44
- package/dist/cli/commands/labels.js.map +0 -1
- package/dist/cli/commands/lifecycle.d.ts +0 -8
- package/dist/cli/commands/lifecycle.d.ts.map +0 -1
- package/dist/cli/commands/lifecycle.js +0 -72
- package/dist/cli/commands/lifecycle.js.map +0 -1
- package/dist/cli/commands/list.d.ts +0 -14
- package/dist/cli/commands/list.d.ts.map +0 -1
- package/dist/cli/commands/list.js +0 -71
- package/dist/cli/commands/list.js.map +0 -1
- package/dist/cli/commands/log.d.ts +0 -12
- package/dist/cli/commands/log.d.ts.map +0 -1
- package/dist/cli/commands/log.js +0 -30
- package/dist/cli/commands/log.js.map +0 -1
- package/dist/cli/commands/map.d.ts +0 -10
- package/dist/cli/commands/map.d.ts.map +0 -1
- package/dist/cli/commands/map.js +0 -23
- package/dist/cli/commands/map.js.map +0 -1
- package/dist/cli/commands/mcp-install.d.ts +0 -17
- package/dist/cli/commands/mcp-install.d.ts.map +0 -1
- package/dist/cli/commands/mcp-install.js +0 -128
- package/dist/cli/commands/mcp-install.js.map +0 -1
- package/dist/cli/commands/memory-brain.d.ts +0 -14
- package/dist/cli/commands/memory-brain.d.ts.map +0 -1
- package/dist/cli/commands/memory-brain.js +0 -151
- package/dist/cli/commands/memory-brain.js.map +0 -1
- package/dist/cli/commands/migrate-claude-mem.d.ts +0 -18
- package/dist/cli/commands/migrate-claude-mem.d.ts.map +0 -1
- package/dist/cli/commands/migrate-claude-mem.js +0 -60
- package/dist/cli/commands/migrate-claude-mem.js.map +0 -1
- package/dist/cli/commands/next.d.ts +0 -9
- package/dist/cli/commands/next.d.ts.map +0 -1
- package/dist/cli/commands/next.js +0 -20
- package/dist/cli/commands/next.js.map +0 -1
- package/dist/cli/commands/nexus.d.ts +0 -16
- package/dist/cli/commands/nexus.d.ts.map +0 -1
- package/dist/cli/commands/nexus.js +0 -155
- package/dist/cli/commands/nexus.js.map +0 -1
- package/dist/cli/commands/observe.d.ts +0 -9
- package/dist/cli/commands/observe.d.ts.map +0 -1
- package/dist/cli/commands/observe.js +0 -39
- package/dist/cli/commands/observe.js.map +0 -1
- package/dist/cli/commands/ops.d.ts +0 -10
- package/dist/cli/commands/ops.d.ts.map +0 -1
- package/dist/cli/commands/ops.js +0 -19
- package/dist/cli/commands/ops.js.map +0 -1
- package/dist/cli/commands/orchestrate.d.ts +0 -8
- package/dist/cli/commands/orchestrate.d.ts.map +0 -1
- package/dist/cli/commands/orchestrate.js +0 -58
- package/dist/cli/commands/orchestrate.js.map +0 -1
- package/dist/cli/commands/otel.d.ts +0 -12
- package/dist/cli/commands/otel.d.ts.map +0 -1
- package/dist/cli/commands/otel.js +0 -128
- package/dist/cli/commands/otel.js.map +0 -1
- package/dist/cli/commands/phase.d.ts +0 -12
- package/dist/cli/commands/phase.d.ts.map +0 -1
- package/dist/cli/commands/phase.js +0 -88
- package/dist/cli/commands/phase.js.map +0 -1
- package/dist/cli/commands/phases.d.ts +0 -12
- package/dist/cli/commands/phases.d.ts.map +0 -1
- package/dist/cli/commands/phases.js +0 -37
- package/dist/cli/commands/phases.js.map +0 -1
- package/dist/cli/commands/plan.d.ts +0 -8
- package/dist/cli/commands/plan.d.ts.map +0 -1
- package/dist/cli/commands/plan.js +0 -15
- package/dist/cli/commands/plan.js.map +0 -1
- package/dist/cli/commands/promote.d.ts +0 -7
- package/dist/cli/commands/promote.d.ts.map +0 -1
- package/dist/cli/commands/promote.js +0 -15
- package/dist/cli/commands/promote.js.map +0 -1
- package/dist/cli/commands/refresh-memory.d.ts +0 -9
- package/dist/cli/commands/refresh-memory.d.ts.map +0 -1
- package/dist/cli/commands/refresh-memory.js +0 -24
- package/dist/cli/commands/refresh-memory.js.map +0 -1
- package/dist/cli/commands/relates.d.ts +0 -12
- package/dist/cli/commands/relates.d.ts.map +0 -1
- package/dist/cli/commands/relates.js +0 -53
- package/dist/cli/commands/relates.js.map +0 -1
- package/dist/cli/commands/release.d.ts +0 -8
- package/dist/cli/commands/release.d.ts.map +0 -1
- package/dist/cli/commands/release.js +0 -72
- package/dist/cli/commands/release.js.map +0 -1
- package/dist/cli/commands/remote.d.ts +0 -12
- package/dist/cli/commands/remote.d.ts.map +0 -1
- package/dist/cli/commands/remote.js +0 -207
- package/dist/cli/commands/remote.js.map +0 -1
- package/dist/cli/commands/reorder.d.ts +0 -7
- package/dist/cli/commands/reorder.d.ts.map +0 -1
- package/dist/cli/commands/reorder.js +0 -20
- package/dist/cli/commands/reorder.js.map +0 -1
- package/dist/cli/commands/reparent.d.ts +0 -10
- package/dist/cli/commands/reparent.d.ts.map +0 -1
- package/dist/cli/commands/reparent.js +0 -19
- package/dist/cli/commands/reparent.js.map +0 -1
- package/dist/cli/commands/research.d.ts +0 -8
- package/dist/cli/commands/research.d.ts.map +0 -1
- package/dist/cli/commands/research.js +0 -129
- package/dist/cli/commands/research.js.map +0 -1
- package/dist/cli/commands/restore.d.ts +0 -11
- package/dist/cli/commands/restore.d.ts.map +0 -1
- package/dist/cli/commands/restore.js +0 -224
- package/dist/cli/commands/restore.js.map +0 -1
- package/dist/cli/commands/roadmap.d.ts +0 -8
- package/dist/cli/commands/roadmap.d.ts.map +0 -1
- package/dist/cli/commands/roadmap.js +0 -21
- package/dist/cli/commands/roadmap.js.map +0 -1
- package/dist/cli/commands/safestop.d.ts +0 -14
- package/dist/cli/commands/safestop.d.ts.map +0 -1
- package/dist/cli/commands/safestop.js +0 -32
- package/dist/cli/commands/safestop.js.map +0 -1
- package/dist/cli/commands/self-update.d.ts +0 -15
- package/dist/cli/commands/self-update.d.ts.map +0 -1
- package/dist/cli/commands/self-update.js +0 -329
- package/dist/cli/commands/self-update.js.map +0 -1
- package/dist/cli/commands/sequence.d.ts +0 -8
- package/dist/cli/commands/sequence.d.ts.map +0 -1
- package/dist/cli/commands/sequence.js +0 -30
- package/dist/cli/commands/sequence.js.map +0 -1
- package/dist/cli/commands/session.d.ts +0 -12
- package/dist/cli/commands/session.d.ts.map +0 -1
- package/dist/cli/commands/session.js +0 -160
- package/dist/cli/commands/session.js.map +0 -1
- package/dist/cli/commands/show.d.ts +0 -13
- package/dist/cli/commands/show.d.ts.map +0 -1
- package/dist/cli/commands/show.js +0 -20
- package/dist/cli/commands/show.js.map +0 -1
- package/dist/cli/commands/skills.d.ts +0 -13
- package/dist/cli/commands/skills.d.ts.map +0 -1
- package/dist/cli/commands/skills.js +0 -131
- package/dist/cli/commands/skills.js.map +0 -1
- package/dist/cli/commands/snapshot.d.ts +0 -9
- package/dist/cli/commands/snapshot.d.ts.map +0 -1
- package/dist/cli/commands/snapshot.js +0 -50
- package/dist/cli/commands/snapshot.js.map +0 -1
- package/dist/cli/commands/specification.d.ts +0 -13
- package/dist/cli/commands/specification.d.ts.map +0 -1
- package/dist/cli/commands/specification.js +0 -45
- package/dist/cli/commands/specification.js.map +0 -1
- package/dist/cli/commands/start.d.ts +0 -13
- package/dist/cli/commands/start.d.ts.map +0 -1
- package/dist/cli/commands/start.js +0 -20
- package/dist/cli/commands/start.js.map +0 -1
- package/dist/cli/commands/stats.d.ts +0 -12
- package/dist/cli/commands/stats.d.ts.map +0 -1
- package/dist/cli/commands/stats.js +0 -23
- package/dist/cli/commands/stats.js.map +0 -1
- package/dist/cli/commands/sticky.d.ts +0 -16
- package/dist/cli/commands/sticky.d.ts.map +0 -1
- package/dist/cli/commands/sticky.js +0 -211
- package/dist/cli/commands/sticky.js.map +0 -1
- package/dist/cli/commands/stop.d.ts +0 -13
- package/dist/cli/commands/stop.d.ts.map +0 -1
- package/dist/cli/commands/stop.js +0 -20
- package/dist/cli/commands/stop.js.map +0 -1
- package/dist/cli/commands/testing.d.ts +0 -13
- package/dist/cli/commands/testing.d.ts.map +0 -1
- package/dist/cli/commands/testing.js +0 -64
- package/dist/cli/commands/testing.js.map +0 -1
- package/dist/cli/commands/token.d.ts +0 -10
- package/dist/cli/commands/token.d.ts.map +0 -1
- package/dist/cli/commands/token.js +0 -135
- package/dist/cli/commands/token.js.map +0 -1
- package/dist/cli/commands/update.d.ts +0 -12
- package/dist/cli/commands/update.d.ts.map +0 -1
- package/dist/cli/commands/update.js +0 -77
- package/dist/cli/commands/update.js.map +0 -1
- package/dist/cli/commands/upgrade.d.ts +0 -16
- package/dist/cli/commands/upgrade.d.ts.map +0 -1
- package/dist/cli/commands/upgrade.js +0 -83
- package/dist/cli/commands/upgrade.js.map +0 -1
- package/dist/cli/commands/validate.d.ts +0 -12
- package/dist/cli/commands/validate.d.ts.map +0 -1
- package/dist/cli/commands/validate.js +0 -23
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/commands/verify.d.ts +0 -8
- package/dist/cli/commands/verify.d.ts.map +0 -1
- package/dist/cli/commands/verify.js +0 -28
- package/dist/cli/commands/verify.js.map +0 -1
- package/dist/cli/commands/web.d.ts +0 -13
- package/dist/cli/commands/web.d.ts.map +0 -1
- package/dist/cli/commands/web.js +0 -264
- package/dist/cli/commands/web.js.map +0 -1
- package/dist/cli/field-context.d.ts +0 -32
- package/dist/cli/field-context.d.ts.map +0 -1
- package/dist/cli/field-context.js +0 -47
- package/dist/cli/field-context.js.map +0 -1
- package/dist/cli/format-context.d.ts +0 -32
- package/dist/cli/format-context.d.ts.map +0 -1
- package/dist/cli/format-context.js +0 -50
- package/dist/cli/format-context.js.map +0 -1
- package/dist/cli/index.d.ts +0 -9
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/logger-bootstrap.d.ts +0 -6
- package/dist/cli/logger-bootstrap.d.ts.map +0 -1
- package/dist/cli/logger-bootstrap.js +0 -10
- package/dist/cli/logger-bootstrap.js.map +0 -1
- package/dist/cli/middleware/output-format.d.ts +0 -30
- package/dist/cli/middleware/output-format.d.ts.map +0 -1
- package/dist/cli/middleware/output-format.js +0 -35
- package/dist/cli/middleware/output-format.js.map +0 -1
- package/dist/cli/progress.d.ts +0 -84
- package/dist/cli/progress.d.ts.map +0 -1
- package/dist/cli/progress.js +0 -169
- package/dist/cli/progress.js.map +0 -1
- package/dist/cli/renderers/colors.d.ts +0 -32
- package/dist/cli/renderers/colors.d.ts.map +0 -1
- package/dist/cli/renderers/colors.js +0 -141
- package/dist/cli/renderers/colors.js.map +0 -1
- package/dist/cli/renderers/error.d.ts +0 -13
- package/dist/cli/renderers/error.d.ts.map +0 -1
- package/dist/cli/renderers/error.js +0 -42
- package/dist/cli/renderers/error.js.map +0 -1
- package/dist/cli/renderers/index.d.ts +0 -59
- package/dist/cli/renderers/index.d.ts.map +0 -1
- package/dist/cli/renderers/index.js +0 -184
- package/dist/cli/renderers/index.js.map +0 -1
- package/dist/cli/renderers/normalizer.d.ts +0 -21
- package/dist/cli/renderers/normalizer.d.ts.map +0 -1
- package/dist/cli/renderers/normalizer.js +0 -106
- package/dist/cli/renderers/normalizer.js.map +0 -1
- package/dist/cli/renderers/system.d.ts +0 -25
- package/dist/cli/renderers/system.d.ts.map +0 -1
- package/dist/cli/renderers/system.js +0 -416
- package/dist/cli/renderers/system.js.map +0 -1
- package/dist/cli/renderers/tasks.d.ts +0 -28
- package/dist/cli/renderers/tasks.d.ts.map +0 -1
- package/dist/cli/renderers/tasks.js +0 -306
- package/dist/cli/renderers/tasks.js.map +0 -1
- package/dist/dispatch/adapters/cli.d.ts +0 -67
- package/dist/dispatch/adapters/cli.d.ts.map +0 -1
- package/dist/dispatch/adapters/cli.js +0 -205
- package/dist/dispatch/adapters/cli.js.map +0 -1
- package/dist/dispatch/adapters/mcp.d.ts +0 -37
- package/dist/dispatch/adapters/mcp.d.ts.map +0 -1
- package/dist/dispatch/adapters/mcp.js +0 -122
- package/dist/dispatch/adapters/mcp.js.map +0 -1
- package/dist/dispatch/context/session-context.d.ts +0 -54
- package/dist/dispatch/context/session-context.d.ts.map +0 -1
- package/dist/dispatch/context/session-context.js +0 -61
- package/dist/dispatch/context/session-context.js.map +0 -1
- package/dist/dispatch/dispatcher.d.ts +0 -23
- package/dist/dispatch/dispatcher.d.ts.map +0 -1
- package/dist/dispatch/dispatcher.js +0 -84
- package/dist/dispatch/dispatcher.js.map +0 -1
- package/dist/dispatch/domains/_base.d.ts +0 -59
- package/dist/dispatch/domains/_base.d.ts.map +0 -1
- package/dist/dispatch/domains/_base.js +0 -77
- package/dist/dispatch/domains/_base.js.map +0 -1
- package/dist/dispatch/domains/_meta.d.ts +0 -23
- package/dist/dispatch/domains/_meta.d.ts.map +0 -1
- package/dist/dispatch/domains/_meta.js +0 -25
- package/dist/dispatch/domains/_meta.js.map +0 -1
- package/dist/dispatch/domains/_routing.d.ts +0 -8
- package/dist/dispatch/domains/_routing.d.ts.map +0 -1
- package/dist/dispatch/domains/_routing.js +0 -20
- package/dist/dispatch/domains/_routing.js.map +0 -1
- package/dist/dispatch/domains/admin.d.ts +0 -25
- package/dist/dispatch/domains/admin.d.ts.map +0 -1
- package/dist/dispatch/domains/admin.js +0 -670
- package/dist/dispatch/domains/admin.js.map +0 -1
- package/dist/dispatch/domains/check.d.ts +0 -22
- package/dist/dispatch/domains/check.d.ts.map +0 -1
- package/dist/dispatch/domains/check.js +0 -279
- package/dist/dispatch/domains/check.js.map +0 -1
- package/dist/dispatch/domains/index.d.ts +0 -26
- package/dist/dispatch/domains/index.d.ts.map +0 -1
- package/dist/dispatch/domains/index.js +0 -38
- package/dist/dispatch/domains/index.js.map +0 -1
- package/dist/dispatch/domains/memory.d.ts +0 -22
- package/dist/dispatch/domains/memory.d.ts.map +0 -1
- package/dist/dispatch/domains/memory.js +0 -303
- package/dist/dispatch/domains/memory.js.map +0 -1
- package/dist/dispatch/domains/nexus.d.ts +0 -22
- package/dist/dispatch/domains/nexus.d.ts.map +0 -1
- package/dist/dispatch/domains/nexus.js +0 -286
- package/dist/dispatch/domains/nexus.js.map +0 -1
- package/dist/dispatch/domains/orchestrate.d.ts +0 -19
- package/dist/dispatch/domains/orchestrate.d.ts.map +0 -1
- package/dist/dispatch/domains/orchestrate.js +0 -259
- package/dist/dispatch/domains/orchestrate.js.map +0 -1
- package/dist/dispatch/domains/pipeline.d.ts +0 -35
- package/dist/dispatch/domains/pipeline.d.ts.map +0 -1
- package/dist/dispatch/domains/pipeline.js +0 -553
- package/dist/dispatch/domains/pipeline.js.map +0 -1
- package/dist/dispatch/domains/session.d.ts +0 -22
- package/dist/dispatch/domains/session.d.ts.map +0 -1
- package/dist/dispatch/domains/session.js +0 -255
- package/dist/dispatch/domains/session.js.map +0 -1
- package/dist/dispatch/domains/sticky.d.ts +0 -20
- package/dist/dispatch/domains/sticky.d.ts.map +0 -1
- package/dist/dispatch/domains/sticky.js +0 -164
- package/dist/dispatch/domains/sticky.js.map +0 -1
- package/dist/dispatch/domains/tasks.d.ts +0 -25
- package/dist/dispatch/domains/tasks.d.ts.map +0 -1
- package/dist/dispatch/domains/tasks.js +0 -323
- package/dist/dispatch/domains/tasks.js.map +0 -1
- package/dist/dispatch/domains/tools.d.ts +0 -36
- package/dist/dispatch/domains/tools.d.ts.map +0 -1
- package/dist/dispatch/domains/tools.js +0 -451
- package/dist/dispatch/domains/tools.js.map +0 -1
- package/dist/dispatch/engines/_error.d.ts +0 -42
- package/dist/dispatch/engines/_error.d.ts.map +0 -1
- package/dist/dispatch/engines/_error.js +0 -201
- package/dist/dispatch/engines/_error.js.map +0 -1
- package/dist/dispatch/engines/codebase-map-engine.d.ts +0 -17
- package/dist/dispatch/engines/codebase-map-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/codebase-map-engine.js +0 -29
- package/dist/dispatch/engines/codebase-map-engine.js.map +0 -1
- package/dist/dispatch/engines/config-engine.d.ts +0 -21
- package/dist/dispatch/engines/config-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/config-engine.js +0 -45
- package/dist/dispatch/engines/config-engine.js.map +0 -1
- package/dist/dispatch/engines/hooks-engine.d.ts +0 -47
- package/dist/dispatch/engines/hooks-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/hooks-engine.js +0 -57
- package/dist/dispatch/engines/hooks-engine.js.map +0 -1
- package/dist/dispatch/engines/init-engine.d.ts +0 -43
- package/dist/dispatch/engines/init-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/init-engine.js +0 -73
- package/dist/dispatch/engines/init-engine.js.map +0 -1
- package/dist/dispatch/engines/lifecycle-engine.d.ts +0 -66
- package/dist/dispatch/engines/lifecycle-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/lifecycle-engine.js +0 -213
- package/dist/dispatch/engines/lifecycle-engine.js.map +0 -1
- package/dist/dispatch/engines/memory-engine.d.ts +0 -10
- package/dist/dispatch/engines/memory-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/memory-engine.js +0 -10
- package/dist/dispatch/engines/memory-engine.js.map +0 -1
- package/dist/dispatch/engines/nexus-engine.d.ts +0 -167
- package/dist/dispatch/engines/nexus-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/nexus-engine.js +0 -356
- package/dist/dispatch/engines/nexus-engine.js.map +0 -1
- package/dist/dispatch/engines/orchestrate-engine.d.ts +0 -133
- package/dist/dispatch/engines/orchestrate-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/orchestrate-engine.js +0 -769
- package/dist/dispatch/engines/orchestrate-engine.js.map +0 -1
- package/dist/dispatch/engines/pipeline-engine.d.ts +0 -51
- package/dist/dispatch/engines/pipeline-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/pipeline-engine.js +0 -191
- package/dist/dispatch/engines/pipeline-engine.js.map +0 -1
- package/dist/dispatch/engines/release-engine.d.ts +0 -94
- package/dist/dispatch/engines/release-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/release-engine.js +0 -669
- package/dist/dispatch/engines/release-engine.js.map +0 -1
- package/dist/dispatch/engines/session-engine.d.ts +0 -323
- package/dist/dispatch/engines/session-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/session-engine.js +0 -865
- package/dist/dispatch/engines/session-engine.js.map +0 -1
- package/dist/dispatch/engines/sticky-engine.d.ts +0 -100
- package/dist/dispatch/engines/sticky-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/sticky-engine.js +0 -181
- package/dist/dispatch/engines/sticky-engine.js.map +0 -1
- package/dist/dispatch/engines/system-engine.d.ts +0 -377
- package/dist/dispatch/engines/system-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/system-engine.js +0 -979
- package/dist/dispatch/engines/system-engine.js.map +0 -1
- package/dist/dispatch/engines/task-engine.d.ts +0 -612
- package/dist/dispatch/engines/task-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/task-engine.js +0 -950
- package/dist/dispatch/engines/task-engine.js.map +0 -1
- package/dist/dispatch/engines/template-parser.d.ts +0 -34
- package/dist/dispatch/engines/template-parser.d.ts.map +0 -1
- package/dist/dispatch/engines/template-parser.js +0 -57
- package/dist/dispatch/engines/template-parser.js.map +0 -1
- package/dist/dispatch/engines/tools-engine.d.ts +0 -270
- package/dist/dispatch/engines/tools-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/tools-engine.js +0 -636
- package/dist/dispatch/engines/tools-engine.js.map +0 -1
- package/dist/dispatch/engines/validate-engine.d.ts +0 -154
- package/dist/dispatch/engines/validate-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/validate-engine.js +0 -524
- package/dist/dispatch/engines/validate-engine.js.map +0 -1
- package/dist/dispatch/index.d.ts +0 -20
- package/dist/dispatch/index.d.ts.map +0 -1
- package/dist/dispatch/index.js +0 -19
- package/dist/dispatch/index.js.map +0 -1
- package/dist/dispatch/lib/capability-matrix.d.ts +0 -11
- package/dist/dispatch/lib/capability-matrix.d.ts.map +0 -1
- package/dist/dispatch/lib/capability-matrix.js +0 -10
- package/dist/dispatch/lib/capability-matrix.js.map +0 -1
- package/dist/dispatch/lib/config.d.ts +0 -16
- package/dist/dispatch/lib/config.d.ts.map +0 -1
- package/dist/dispatch/lib/config.js +0 -15
- package/dist/dispatch/lib/config.js.map +0 -1
- package/dist/dispatch/lib/engine.d.ts +0 -25
- package/dist/dispatch/lib/engine.d.ts.map +0 -1
- package/dist/dispatch/lib/engine.js +0 -44
- package/dist/dispatch/lib/engine.js.map +0 -1
- package/dist/dispatch/lib/meta.d.ts +0 -26
- package/dist/dispatch/lib/meta.d.ts.map +0 -1
- package/dist/dispatch/lib/meta.js +0 -37
- package/dist/dispatch/lib/meta.js.map +0 -1
- package/dist/dispatch/lib/param-utils.d.ts +0 -11
- package/dist/dispatch/lib/param-utils.d.ts.map +0 -1
- package/dist/dispatch/lib/param-utils.js +0 -10
- package/dist/dispatch/lib/param-utils.js.map +0 -1
- package/dist/dispatch/lib/projections.d.ts +0 -23
- package/dist/dispatch/lib/projections.d.ts.map +0 -1
- package/dist/dispatch/lib/projections.js +0 -48
- package/dist/dispatch/lib/projections.js.map +0 -1
- package/dist/dispatch/lib/schema-utils.d.ts +0 -42
- package/dist/dispatch/lib/schema-utils.d.ts.map +0 -1
- package/dist/dispatch/lib/schema-utils.js +0 -93
- package/dist/dispatch/lib/schema-utils.js.map +0 -1
- package/dist/dispatch/lib/security.d.ts +0 -11
- package/dist/dispatch/lib/security.d.ts.map +0 -1
- package/dist/dispatch/lib/security.js +0 -10
- package/dist/dispatch/lib/security.js.map +0 -1
- package/dist/dispatch/middleware/audit.d.ts +0 -23
- package/dist/dispatch/middleware/audit.d.ts.map +0 -1
- package/dist/dispatch/middleware/audit.js +0 -169
- package/dist/dispatch/middleware/audit.js.map +0 -1
- package/dist/dispatch/middleware/field-filter.d.ts +0 -24
- package/dist/dispatch/middleware/field-filter.d.ts.map +0 -1
- package/dist/dispatch/middleware/field-filter.js +0 -65
- package/dist/dispatch/middleware/field-filter.js.map +0 -1
- package/dist/dispatch/middleware/pipeline.d.ts +0 -20
- package/dist/dispatch/middleware/pipeline.d.ts.map +0 -1
- package/dist/dispatch/middleware/pipeline.js +0 -47
- package/dist/dispatch/middleware/pipeline.js.map +0 -1
- package/dist/dispatch/middleware/projection.d.ts +0 -35
- package/dist/dispatch/middleware/projection.d.ts.map +0 -1
- package/dist/dispatch/middleware/projection.js +0 -145
- package/dist/dispatch/middleware/projection.js.map +0 -1
- package/dist/dispatch/middleware/protocol-enforcement.d.ts +0 -12
- package/dist/dispatch/middleware/protocol-enforcement.d.ts.map +0 -1
- package/dist/dispatch/middleware/protocol-enforcement.js +0 -30
- package/dist/dispatch/middleware/protocol-enforcement.js.map +0 -1
- package/dist/dispatch/middleware/rate-limiter.d.ts +0 -30
- package/dist/dispatch/middleware/rate-limiter.d.ts.map +0 -1
- package/dist/dispatch/middleware/rate-limiter.js +0 -101
- package/dist/dispatch/middleware/rate-limiter.js.map +0 -1
- package/dist/dispatch/middleware/sanitizer.d.ts +0 -10
- package/dist/dispatch/middleware/sanitizer.d.ts.map +0 -1
- package/dist/dispatch/middleware/sanitizer.js +0 -42
- package/dist/dispatch/middleware/sanitizer.js.map +0 -1
- package/dist/dispatch/middleware/session-resolver.d.ts +0 -26
- package/dist/dispatch/middleware/session-resolver.d.ts.map +0 -1
- package/dist/dispatch/middleware/session-resolver.js +0 -65
- package/dist/dispatch/middleware/session-resolver.js.map +0 -1
- package/dist/dispatch/middleware/verification-gates.d.ts +0 -3
- package/dist/dispatch/middleware/verification-gates.d.ts.map +0 -1
- package/dist/dispatch/middleware/verification-gates.js +0 -40
- package/dist/dispatch/middleware/verification-gates.js.map +0 -1
- package/dist/dispatch/registry.d.ts +0 -91
- package/dist/dispatch/registry.d.ts.map +0 -1
- package/dist/dispatch/registry.js +0 -2833
- package/dist/dispatch/registry.js.map +0 -1
- package/dist/dispatch/types.d.ts +0 -218
- package/dist/dispatch/types.d.ts.map +0 -1
- package/dist/dispatch/types.js +0 -25
- package/dist/dispatch/types.js.map +0 -1
- package/dist/mcp/gateways/mutate.d.ts +0 -146
- package/dist/mcp/gateways/mutate.d.ts.map +0 -1
- package/dist/mcp/gateways/mutate.js +0 -1016
- package/dist/mcp/gateways/mutate.js.map +0 -1
- package/dist/mcp/gateways/query.d.ts +0 -138
- package/dist/mcp/gateways/query.d.ts.map +0 -1
- package/dist/mcp/gateways/query.js +0 -186
- package/dist/mcp/gateways/query.js.map +0 -1
- package/dist/mcp/index.d.ts +0 -16
- package/dist/mcp/index.d.ts.map +0 -1
- package/dist/mcp/lib/background-jobs.d.ts +0 -86
- package/dist/mcp/lib/background-jobs.d.ts.map +0 -1
- package/dist/mcp/lib/background-jobs.js +0 -183
- package/dist/mcp/lib/background-jobs.js.map +0 -1
- package/dist/mcp/lib/budget.d.ts +0 -35
- package/dist/mcp/lib/budget.d.ts.map +0 -1
- package/dist/mcp/lib/budget.js +0 -102
- package/dist/mcp/lib/budget.js.map +0 -1
- package/dist/mcp/lib/cache.d.ts +0 -78
- package/dist/mcp/lib/cache.d.ts.map +0 -1
- package/dist/mcp/lib/cache.js +0 -207
- package/dist/mcp/lib/cache.js.map +0 -1
- package/dist/mcp/lib/config.d.ts +0 -42
- package/dist/mcp/lib/config.d.ts.map +0 -1
- package/dist/mcp/lib/config.js +0 -241
- package/dist/mcp/lib/config.js.map +0 -1
- package/dist/mcp/lib/defaults.d.ts +0 -115
- package/dist/mcp/lib/defaults.d.ts.map +0 -1
- package/dist/mcp/lib/defaults.js +0 -61
- package/dist/mcp/lib/defaults.js.map +0 -1
- package/dist/mcp/lib/gate-validators.d.ts +0 -13
- package/dist/mcp/lib/gate-validators.d.ts.map +0 -1
- package/dist/mcp/lib/gate-validators.js +0 -13
- package/dist/mcp/lib/gate-validators.js.map +0 -1
- package/dist/mcp/lib/gateway-meta.d.ts +0 -37
- package/dist/mcp/lib/gateway-meta.d.ts.map +0 -1
- package/dist/mcp/lib/gateway-meta.js +0 -50
- package/dist/mcp/lib/gateway-meta.js.map +0 -1
- package/dist/mcp/lib/job-manager-accessor.d.ts +0 -10
- package/dist/mcp/lib/job-manager-accessor.d.ts.map +0 -1
- package/dist/mcp/lib/job-manager-accessor.js +0 -14
- package/dist/mcp/lib/job-manager-accessor.js.map +0 -1
- package/dist/mcp/lib/protocol-enforcement.d.ts +0 -12
- package/dist/mcp/lib/protocol-enforcement.d.ts.map +0 -1
- package/dist/mcp/lib/protocol-enforcement.js +0 -12
- package/dist/mcp/lib/protocol-enforcement.js.map +0 -1
- package/dist/mcp/lib/protocol-rules.d.ts +0 -12
- package/dist/mcp/lib/protocol-rules.d.ts.map +0 -1
- package/dist/mcp/lib/protocol-rules.js +0 -12
- package/dist/mcp/lib/protocol-rules.js.map +0 -1
- package/dist/mcp/lib/rate-limiter.d.ts +0 -110
- package/dist/mcp/lib/rate-limiter.d.ts.map +0 -1
- package/dist/mcp/lib/rate-limiter.js +0 -208
- package/dist/mcp/lib/rate-limiter.js.map +0 -1
- package/dist/mcp/lib/router.d.ts +0 -58
- package/dist/mcp/lib/router.d.ts.map +0 -1
- package/dist/mcp/lib/router.js +0 -12
- package/dist/mcp/lib/router.js.map +0 -1
- package/dist/mcp/lib/security.d.ts +0 -161
- package/dist/mcp/lib/security.d.ts.map +0 -1
- package/dist/mcp/lib/security.js +0 -360
- package/dist/mcp/lib/security.js.map +0 -1
- package/dist/mcp/lib/verification-gates.d.ts +0 -13
- package/dist/mcp/lib/verification-gates.d.ts.map +0 -1
- package/dist/mcp/lib/verification-gates.js +0 -12
- package/dist/mcp/lib/verification-gates.js.map +0 -1
- package/dist/mcp/resources/budget.d.ts +0 -22
- package/dist/mcp/resources/budget.d.ts.map +0 -1
- package/dist/mcp/resources/budget.js +0 -46
- package/dist/mcp/resources/budget.js.map +0 -1
- package/dist/mcp/resources/index.d.ts +0 -53
- package/dist/mcp/resources/index.d.ts.map +0 -1
- package/dist/mcp/resources/index.js +0 -278
- package/dist/mcp/resources/index.js.map +0 -1
package/dist/cli/index.js
CHANGED
|
@@ -13163,9 +13163,9 @@ async function readSequenceFromDb(cwd, accessor) {
|
|
|
13163
13163
|
return isValidSequenceState(value) ? value : null;
|
|
13164
13164
|
}
|
|
13165
13165
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
13166
|
-
const { eq:
|
|
13166
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
13167
13167
|
const db = await getDb4(cwd);
|
|
13168
|
-
const rows = await db.select().from(schemaMeta).where(
|
|
13168
|
+
const rows = await db.select().from(schemaMeta).where(eq17(schemaMeta.key, SEQUENCE_META_KEY)).all();
|
|
13169
13169
|
const raw = rows[0]?.value;
|
|
13170
13170
|
if (!raw) return null;
|
|
13171
13171
|
try {
|
|
@@ -15276,7 +15276,7 @@ async function linkPipelineAdr(projectRoot, taskId) {
|
|
|
15276
15276
|
return result;
|
|
15277
15277
|
}
|
|
15278
15278
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
15279
|
-
const { and:
|
|
15279
|
+
const { and: and12, eq: eq17 } = await import("drizzle-orm");
|
|
15280
15280
|
const db = await getDb4(projectRoot);
|
|
15281
15281
|
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
15282
15282
|
for (const filePath of matchingFiles) {
|
|
@@ -15286,7 +15286,7 @@ async function linkPipelineAdr(projectRoot, taskId) {
|
|
|
15286
15286
|
const fm = record2.frontmatter;
|
|
15287
15287
|
const content = readFileSync5(filePath, "utf-8");
|
|
15288
15288
|
const relativePath = `.cleo/adrs/${filename}`;
|
|
15289
|
-
const existing = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(
|
|
15289
|
+
const existing = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(eq17(architectureDecisions.id, record2.id)).all();
|
|
15290
15290
|
const rowBase = {
|
|
15291
15291
|
id: record2.id,
|
|
15292
15292
|
title: record2.title,
|
|
@@ -15306,19 +15306,19 @@ async function linkPipelineAdr(projectRoot, taskId) {
|
|
|
15306
15306
|
updatedAt: now2
|
|
15307
15307
|
};
|
|
15308
15308
|
if (existing.length > 0) {
|
|
15309
|
-
await db.update(architectureDecisions).set(rowBase).where(
|
|
15309
|
+
await db.update(architectureDecisions).set(rowBase).where(eq17(architectureDecisions.id, record2.id));
|
|
15310
15310
|
} else {
|
|
15311
15311
|
await db.insert(architectureDecisions).values({ ...rowBase, createdAt: now2 });
|
|
15312
15312
|
}
|
|
15313
15313
|
result.synced++;
|
|
15314
|
-
await db.delete(adrTaskLinks).where(
|
|
15314
|
+
await db.delete(adrTaskLinks).where(and12(eq17(adrTaskLinks.adrId, record2.id), eq17(adrTaskLinks.taskId, taskId)));
|
|
15315
15315
|
await db.insert(adrTaskLinks).values({ adrId: record2.id, taskId, linkType: "implements" });
|
|
15316
15316
|
result.linked.push({ adrId: record2.id, taskId });
|
|
15317
15317
|
if (fm["Related ADRs"]) {
|
|
15318
15318
|
const relatedIds = fm["Related ADRs"].split(",").map((r) => r.trim()).filter((r) => /^ADR-\d+$/.test(r));
|
|
15319
15319
|
for (const toId of relatedIds) {
|
|
15320
15320
|
try {
|
|
15321
|
-
const targetExists = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(
|
|
15321
|
+
const targetExists = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(eq17(architectureDecisions.id, toId)).all();
|
|
15322
15322
|
if (targetExists.length > 0) {
|
|
15323
15323
|
await db.insert(adrRelations).values({ fromAdrId: record2.id, toAdrId: toId, relationType: "related" }).onConflictDoNothing();
|
|
15324
15324
|
}
|
|
@@ -15479,7 +15479,7 @@ async function syncAdrsToDb(projectRoot) {
|
|
|
15479
15479
|
return result;
|
|
15480
15480
|
}
|
|
15481
15481
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
15482
|
-
const { eq:
|
|
15482
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
15483
15483
|
const db = await getDb4(projectRoot);
|
|
15484
15484
|
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
15485
15485
|
const allFiles = collectAdrFiles(adrsDir);
|
|
@@ -15513,15 +15513,15 @@ async function syncAdrsToDb(projectRoot) {
|
|
|
15513
15513
|
topics: fm.Topics ?? null,
|
|
15514
15514
|
updatedAt: now2
|
|
15515
15515
|
};
|
|
15516
|
-
const existing = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(
|
|
15516
|
+
const existing = await db.select({ id: architectureDecisions.id }).from(architectureDecisions).where(eq17(architectureDecisions.id, record2.id)).all();
|
|
15517
15517
|
if (existing.length > 0) {
|
|
15518
|
-
await db.update(architectureDecisions).set(rowBase).where(
|
|
15518
|
+
await db.update(architectureDecisions).set(rowBase).where(eq17(architectureDecisions.id, record2.id));
|
|
15519
15519
|
result.updated++;
|
|
15520
15520
|
} else {
|
|
15521
15521
|
await db.insert(architectureDecisions).values({ ...rowBase, createdAt: now2 });
|
|
15522
15522
|
result.inserted++;
|
|
15523
15523
|
}
|
|
15524
|
-
await db.delete(adrTaskLinks).where(
|
|
15524
|
+
await db.delete(adrTaskLinks).where(eq17(adrTaskLinks.adrId, record2.id));
|
|
15525
15525
|
if (fm["Related Tasks"]) {
|
|
15526
15526
|
for (const taskId of parseTaskIds2(fm["Related Tasks"])) {
|
|
15527
15527
|
await db.insert(adrTaskLinks).values({ adrId: record2.id, taskId, linkType: "related" });
|
|
@@ -15657,310 +15657,8 @@ var init_adrs = __esm({
|
|
|
15657
15657
|
}
|
|
15658
15658
|
});
|
|
15659
15659
|
|
|
15660
|
-
// packages/core/src/agents/registry.ts
|
|
15661
|
-
var registry_exports2 = {};
|
|
15662
|
-
__export(registry_exports2, {
|
|
15663
|
-
checkAgentHealth: () => checkAgentHealth,
|
|
15664
|
-
classifyError: () => classifyError,
|
|
15665
|
-
deregisterAgent: () => deregisterAgent,
|
|
15666
|
-
generateAgentId: () => generateAgentId,
|
|
15667
|
-
getAgentErrorHistory: () => getAgentErrorHistory,
|
|
15668
|
-
getAgentInstance: () => getAgentInstance,
|
|
15669
|
-
getHealthReport: () => getHealthReport,
|
|
15670
|
-
heartbeat: () => heartbeat,
|
|
15671
|
-
incrementTasksCompleted: () => incrementTasksCompleted,
|
|
15672
|
-
listAgentInstances: () => listAgentInstances,
|
|
15673
|
-
markCrashed: () => markCrashed,
|
|
15674
|
-
registerAgent: () => registerAgent,
|
|
15675
|
-
updateAgentStatus: () => updateAgentStatus
|
|
15676
|
-
});
|
|
15677
|
-
import { randomBytes } from "node:crypto";
|
|
15678
|
-
import { and as and3, eq as eq5, inArray as inArray4, lt as lt2, sql as sql8 } from "drizzle-orm";
|
|
15679
|
-
function generateAgentId() {
|
|
15680
|
-
const now2 = /* @__PURE__ */ new Date();
|
|
15681
|
-
const ts = now2.toISOString().replace(/[-:T]/g, "").substring(0, 14);
|
|
15682
|
-
const hex = randomBytes(3).toString("hex");
|
|
15683
|
-
return `agt_${ts}_${hex}`;
|
|
15684
|
-
}
|
|
15685
|
-
async function registerAgent(opts, cwd) {
|
|
15686
|
-
const db = await getDb(cwd);
|
|
15687
|
-
const id = generateAgentId();
|
|
15688
|
-
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
15689
|
-
const row = {
|
|
15690
|
-
id,
|
|
15691
|
-
agentType: opts.agentType,
|
|
15692
|
-
status: "starting",
|
|
15693
|
-
sessionId: opts.sessionId ?? null,
|
|
15694
|
-
taskId: opts.taskId ?? null,
|
|
15695
|
-
startedAt: now2,
|
|
15696
|
-
lastHeartbeat: now2,
|
|
15697
|
-
stoppedAt: null,
|
|
15698
|
-
errorCount: 0,
|
|
15699
|
-
totalTasksCompleted: 0,
|
|
15700
|
-
capacity: "1.0",
|
|
15701
|
-
metadataJson: opts.metadata ? JSON.stringify(opts.metadata) : "{}",
|
|
15702
|
-
parentAgentId: opts.parentAgentId ?? null
|
|
15703
|
-
};
|
|
15704
|
-
await db.insert(agentInstances).values(row);
|
|
15705
|
-
return row;
|
|
15706
|
-
}
|
|
15707
|
-
async function deregisterAgent(id, cwd) {
|
|
15708
|
-
const db = await getDb(cwd);
|
|
15709
|
-
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
15710
|
-
const existing = await db.select().from(agentInstances).where(eq5(agentInstances.id, id)).get();
|
|
15711
|
-
if (!existing) return null;
|
|
15712
|
-
if (existing.status === "stopped") return existing;
|
|
15713
|
-
await db.update(agentInstances).set({ status: "stopped", stoppedAt: now2 }).where(eq5(agentInstances.id, id));
|
|
15714
|
-
return { ...existing, status: "stopped", stoppedAt: now2 };
|
|
15715
|
-
}
|
|
15716
|
-
async function heartbeat(id, cwd) {
|
|
15717
|
-
const db = await getDb(cwd);
|
|
15718
|
-
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
15719
|
-
const existing = await db.select().from(agentInstances).where(eq5(agentInstances.id, id)).get();
|
|
15720
|
-
if (!existing) return null;
|
|
15721
|
-
if (existing.status === "stopped" || existing.status === "crashed") {
|
|
15722
|
-
return existing.status;
|
|
15723
|
-
}
|
|
15724
|
-
await db.update(agentInstances).set({ lastHeartbeat: now2 }).where(eq5(agentInstances.id, id));
|
|
15725
|
-
return existing.status;
|
|
15726
|
-
}
|
|
15727
|
-
async function updateAgentStatus(id, opts, cwd) {
|
|
15728
|
-
const db = await getDb(cwd);
|
|
15729
|
-
const existing = await db.select().from(agentInstances).where(eq5(agentInstances.id, id)).get();
|
|
15730
|
-
if (!existing) return null;
|
|
15731
|
-
const updates = {
|
|
15732
|
-
status: opts.status
|
|
15733
|
-
};
|
|
15734
|
-
if (opts.taskId !== void 0) {
|
|
15735
|
-
updates.taskId = opts.taskId;
|
|
15736
|
-
}
|
|
15737
|
-
if (opts.status === "active") {
|
|
15738
|
-
updates.lastHeartbeat = (/* @__PURE__ */ new Date()).toISOString();
|
|
15739
|
-
}
|
|
15740
|
-
if (opts.status === "error" || opts.status === "crashed") {
|
|
15741
|
-
updates.errorCount = existing.errorCount + 1;
|
|
15742
|
-
if (opts.error) {
|
|
15743
|
-
const errorType = classifyError(new Error(opts.error));
|
|
15744
|
-
await db.insert(agentErrorLog).values({
|
|
15745
|
-
agentId: id,
|
|
15746
|
-
errorType,
|
|
15747
|
-
message: opts.error,
|
|
15748
|
-
occurredAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
15749
|
-
});
|
|
15750
|
-
}
|
|
15751
|
-
}
|
|
15752
|
-
if (opts.status === "stopped") {
|
|
15753
|
-
updates.stoppedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
15754
|
-
}
|
|
15755
|
-
await db.update(agentInstances).set(updates).where(eq5(agentInstances.id, id));
|
|
15756
|
-
return { ...existing, ...updates };
|
|
15757
|
-
}
|
|
15758
|
-
async function incrementTasksCompleted(id, cwd) {
|
|
15759
|
-
const db = await getDb(cwd);
|
|
15760
|
-
await db.update(agentInstances).set({ totalTasksCompleted: sql8`${agentInstances.totalTasksCompleted} + 1` }).where(eq5(agentInstances.id, id));
|
|
15761
|
-
}
|
|
15762
|
-
async function listAgentInstances(filters, cwd) {
|
|
15763
|
-
const db = await getDb(cwd);
|
|
15764
|
-
const conditions = [];
|
|
15765
|
-
if (filters?.status) {
|
|
15766
|
-
const statuses = Array.isArray(filters.status) ? filters.status : [filters.status];
|
|
15767
|
-
conditions.push(inArray4(agentInstances.status, statuses));
|
|
15768
|
-
}
|
|
15769
|
-
if (filters?.agentType) {
|
|
15770
|
-
const types = Array.isArray(filters.agentType) ? filters.agentType : [filters.agentType];
|
|
15771
|
-
conditions.push(inArray4(agentInstances.agentType, types));
|
|
15772
|
-
}
|
|
15773
|
-
if (filters?.sessionId) {
|
|
15774
|
-
conditions.push(eq5(agentInstances.sessionId, filters.sessionId));
|
|
15775
|
-
}
|
|
15776
|
-
if (filters?.parentAgentId) {
|
|
15777
|
-
conditions.push(eq5(agentInstances.parentAgentId, filters.parentAgentId));
|
|
15778
|
-
}
|
|
15779
|
-
if (conditions.length === 0) {
|
|
15780
|
-
return db.select().from(agentInstances).all();
|
|
15781
|
-
}
|
|
15782
|
-
return db.select().from(agentInstances).where(and3(...conditions)).all();
|
|
15783
|
-
}
|
|
15784
|
-
async function getAgentInstance(id, cwd) {
|
|
15785
|
-
const db = await getDb(cwd);
|
|
15786
|
-
const row = await db.select().from(agentInstances).where(eq5(agentInstances.id, id)).get();
|
|
15787
|
-
return row ?? null;
|
|
15788
|
-
}
|
|
15789
|
-
function classifyError(error40) {
|
|
15790
|
-
const message = error40 instanceof Error ? error40.message : String(error40);
|
|
15791
|
-
for (const pattern of RETRIABLE_PATTERNS) {
|
|
15792
|
-
if (pattern.test(message)) return "retriable";
|
|
15793
|
-
}
|
|
15794
|
-
for (const pattern of PERMANENT_PATTERNS) {
|
|
15795
|
-
if (pattern.test(message)) return "permanent";
|
|
15796
|
-
}
|
|
15797
|
-
return "unknown";
|
|
15798
|
-
}
|
|
15799
|
-
async function getAgentErrorHistory(agentId, cwd) {
|
|
15800
|
-
const db = await getDb(cwd);
|
|
15801
|
-
return db.select().from(agentErrorLog).where(eq5(agentErrorLog.agentId, agentId)).all();
|
|
15802
|
-
}
|
|
15803
|
-
async function checkAgentHealth(thresholdMs = 3e4, cwd) {
|
|
15804
|
-
const db = await getDb(cwd);
|
|
15805
|
-
const cutoff = new Date(Date.now() - thresholdMs).toISOString();
|
|
15806
|
-
return db.select().from(agentInstances).where(
|
|
15807
|
-
and3(
|
|
15808
|
-
inArray4(agentInstances.status, ["active", "idle", "starting"]),
|
|
15809
|
-
lt2(agentInstances.lastHeartbeat, cutoff)
|
|
15810
|
-
)
|
|
15811
|
-
).all();
|
|
15812
|
-
}
|
|
15813
|
-
async function markCrashed(id, reason, cwd) {
|
|
15814
|
-
return updateAgentStatus(
|
|
15815
|
-
id,
|
|
15816
|
-
{ status: "crashed", error: reason ?? "Heartbeat timeout \u2014 agent presumed crashed" },
|
|
15817
|
-
cwd
|
|
15818
|
-
);
|
|
15819
|
-
}
|
|
15820
|
-
async function getHealthReport(thresholdMs = 3e4, cwd) {
|
|
15821
|
-
const allAgents = await listAgentInstances(void 0, cwd);
|
|
15822
|
-
const staleAgents = await checkAgentHealth(thresholdMs, cwd);
|
|
15823
|
-
const report = {
|
|
15824
|
-
total: allAgents.length,
|
|
15825
|
-
active: 0,
|
|
15826
|
-
idle: 0,
|
|
15827
|
-
starting: 0,
|
|
15828
|
-
error: 0,
|
|
15829
|
-
crashed: 0,
|
|
15830
|
-
stopped: 0,
|
|
15831
|
-
totalErrors: 0,
|
|
15832
|
-
staleAgents
|
|
15833
|
-
};
|
|
15834
|
-
for (const agent of allAgents) {
|
|
15835
|
-
switch (agent.status) {
|
|
15836
|
-
case "active":
|
|
15837
|
-
report.active++;
|
|
15838
|
-
break;
|
|
15839
|
-
case "idle":
|
|
15840
|
-
report.idle++;
|
|
15841
|
-
break;
|
|
15842
|
-
case "starting":
|
|
15843
|
-
report.starting++;
|
|
15844
|
-
break;
|
|
15845
|
-
case "error":
|
|
15846
|
-
report.error++;
|
|
15847
|
-
break;
|
|
15848
|
-
case "crashed":
|
|
15849
|
-
report.crashed++;
|
|
15850
|
-
break;
|
|
15851
|
-
case "stopped":
|
|
15852
|
-
report.stopped++;
|
|
15853
|
-
break;
|
|
15854
|
-
}
|
|
15855
|
-
report.totalErrors += agent.errorCount;
|
|
15856
|
-
}
|
|
15857
|
-
return report;
|
|
15858
|
-
}
|
|
15859
|
-
var RETRIABLE_PATTERNS, PERMANENT_PATTERNS;
|
|
15860
|
-
var init_registry2 = __esm({
|
|
15861
|
-
"packages/core/src/agents/registry.ts"() {
|
|
15862
|
-
"use strict";
|
|
15863
|
-
init_sqlite2();
|
|
15864
|
-
init_agent_schema();
|
|
15865
|
-
RETRIABLE_PATTERNS = [
|
|
15866
|
-
/timeout/i,
|
|
15867
|
-
/ECONNREFUSED/,
|
|
15868
|
-
/ECONNRESET/,
|
|
15869
|
-
/EPIPE/,
|
|
15870
|
-
/ETIMEDOUT/,
|
|
15871
|
-
/rate.?limit/i,
|
|
15872
|
-
/429/,
|
|
15873
|
-
/503/,
|
|
15874
|
-
/502/,
|
|
15875
|
-
/SQLITE_BUSY/i,
|
|
15876
|
-
/database is locked/i,
|
|
15877
|
-
/temporarily unavailable/i,
|
|
15878
|
-
/too many requests/i,
|
|
15879
|
-
/network/i,
|
|
15880
|
-
/socket hang up/i
|
|
15881
|
-
];
|
|
15882
|
-
PERMANENT_PATTERNS = [
|
|
15883
|
-
/permission denied/i,
|
|
15884
|
-
/EACCES/,
|
|
15885
|
-
/authentication/i,
|
|
15886
|
-
/unauthorized/i,
|
|
15887
|
-
/401/,
|
|
15888
|
-
/403/,
|
|
15889
|
-
/404/,
|
|
15890
|
-
/not found/i,
|
|
15891
|
-
/invalid.*token/i,
|
|
15892
|
-
/SQLITE_CONSTRAINT/i,
|
|
15893
|
-
/syntax error/i,
|
|
15894
|
-
/type error/i,
|
|
15895
|
-
/reference error/i
|
|
15896
|
-
];
|
|
15897
|
-
}
|
|
15898
|
-
});
|
|
15899
|
-
|
|
15900
|
-
// packages/core/src/agents/capacity.ts
|
|
15901
|
-
import { eq as eq6 } from "drizzle-orm";
|
|
15902
|
-
async function updateCapacity(id, capacity, cwd) {
|
|
15903
|
-
if (capacity < 0 || capacity > 1) {
|
|
15904
|
-
throw new Error(`Capacity must be between 0.0 and 1.0, got ${capacity}`);
|
|
15905
|
-
}
|
|
15906
|
-
const db = await getDb(cwd);
|
|
15907
|
-
const existing = await db.select().from(agentInstances).where(eq6(agentInstances.id, id)).get();
|
|
15908
|
-
if (!existing) return null;
|
|
15909
|
-
const capacityStr = capacity.toFixed(4);
|
|
15910
|
-
await db.update(agentInstances).set({ capacity: capacityStr }).where(eq6(agentInstances.id, id));
|
|
15911
|
-
return { ...existing, capacity: capacityStr };
|
|
15912
|
-
}
|
|
15913
|
-
async function getAvailableCapacity(cwd) {
|
|
15914
|
-
const agents = await listAgentInstances({ status: ["active", "idle"] }, cwd);
|
|
15915
|
-
return agents.reduce((sum, agent) => sum + parseCapacity(agent.capacity), 0);
|
|
15916
|
-
}
|
|
15917
|
-
async function findLeastLoadedAgent(agentType, cwd) {
|
|
15918
|
-
const filters = agentType ? { status: ["active", "idle"], agentType } : { status: ["active", "idle"] };
|
|
15919
|
-
const agents = await listAgentInstances(filters, cwd);
|
|
15920
|
-
if (agents.length === 0) return null;
|
|
15921
|
-
let best = agents[0];
|
|
15922
|
-
let bestCapacity = parseCapacity(best.capacity);
|
|
15923
|
-
for (let i = 1; i < agents.length; i++) {
|
|
15924
|
-
const cap = parseCapacity(agents[i].capacity);
|
|
15925
|
-
if (cap > bestCapacity) {
|
|
15926
|
-
best = agents[i];
|
|
15927
|
-
bestCapacity = cap;
|
|
15928
|
-
}
|
|
15929
|
-
}
|
|
15930
|
-
return best;
|
|
15931
|
-
}
|
|
15932
|
-
async function isOverloaded(threshold = 0.1, cwd) {
|
|
15933
|
-
const capacity = await getAvailableCapacity(cwd);
|
|
15934
|
-
return capacity < threshold;
|
|
15935
|
-
}
|
|
15936
|
-
async function getCapacitySummary(threshold = 0.1, cwd) {
|
|
15937
|
-
const agents = await listAgentInstances({ status: ["active", "idle"] }, cwd);
|
|
15938
|
-
const totalCapacity = agents.reduce((sum, a) => sum + parseCapacity(a.capacity), 0);
|
|
15939
|
-
const activeAgentCount = agents.length;
|
|
15940
|
-
return {
|
|
15941
|
-
totalCapacity,
|
|
15942
|
-
activeAgentCount,
|
|
15943
|
-
averageCapacity: activeAgentCount > 0 ? totalCapacity / activeAgentCount : 0,
|
|
15944
|
-
overloaded: totalCapacity < threshold,
|
|
15945
|
-
threshold
|
|
15946
|
-
};
|
|
15947
|
-
}
|
|
15948
|
-
function parseCapacity(value) {
|
|
15949
|
-
if (!value) return 0;
|
|
15950
|
-
const parsed = parseFloat(value);
|
|
15951
|
-
return Number.isNaN(parsed) ? 0 : Math.max(0, Math.min(1, parsed));
|
|
15952
|
-
}
|
|
15953
|
-
var init_capacity = __esm({
|
|
15954
|
-
"packages/core/src/agents/capacity.ts"() {
|
|
15955
|
-
"use strict";
|
|
15956
|
-
init_sqlite2();
|
|
15957
|
-
init_agent_schema();
|
|
15958
|
-
init_registry2();
|
|
15959
|
-
}
|
|
15960
|
-
});
|
|
15961
|
-
|
|
15962
15660
|
// packages/core/src/store/brain-accessor.ts
|
|
15963
|
-
import { and as
|
|
15661
|
+
import { and as and3, asc as asc2, desc as desc2, eq as eq5, gte as gte2, or as or3 } from "drizzle-orm";
|
|
15964
15662
|
async function getBrainAccessor(cwd) {
|
|
15965
15663
|
const db = await getBrainDb(cwd);
|
|
15966
15664
|
return new BrainDataAccessor(db);
|
|
@@ -15980,30 +15678,30 @@ var init_brain_accessor = __esm({
|
|
|
15980
15678
|
// =========================================================================
|
|
15981
15679
|
async addDecision(row) {
|
|
15982
15680
|
await this.db.insert(brainDecisions).values(row);
|
|
15983
|
-
const result = await this.db.select().from(brainDecisions).where(
|
|
15681
|
+
const result = await this.db.select().from(brainDecisions).where(eq5(brainDecisions.id, row.id));
|
|
15984
15682
|
return result[0];
|
|
15985
15683
|
}
|
|
15986
15684
|
async getDecision(id) {
|
|
15987
|
-
const result = await this.db.select().from(brainDecisions).where(
|
|
15685
|
+
const result = await this.db.select().from(brainDecisions).where(eq5(brainDecisions.id, id));
|
|
15988
15686
|
return result[0] ?? null;
|
|
15989
15687
|
}
|
|
15990
15688
|
async findDecisions(params = {}) {
|
|
15991
15689
|
const conditions = [];
|
|
15992
15690
|
if (params.type) {
|
|
15993
|
-
conditions.push(
|
|
15691
|
+
conditions.push(eq5(brainDecisions.type, params.type));
|
|
15994
15692
|
}
|
|
15995
15693
|
if (params.confidence) {
|
|
15996
|
-
conditions.push(
|
|
15694
|
+
conditions.push(eq5(brainDecisions.confidence, params.confidence));
|
|
15997
15695
|
}
|
|
15998
15696
|
if (params.outcome) {
|
|
15999
|
-
conditions.push(
|
|
15697
|
+
conditions.push(eq5(brainDecisions.outcome, params.outcome));
|
|
16000
15698
|
}
|
|
16001
15699
|
if (params.contextTaskId) {
|
|
16002
|
-
conditions.push(
|
|
15700
|
+
conditions.push(eq5(brainDecisions.contextTaskId, params.contextTaskId));
|
|
16003
15701
|
}
|
|
16004
15702
|
let query = this.db.select().from(brainDecisions).orderBy(desc2(brainDecisions.createdAt));
|
|
16005
15703
|
if (conditions.length > 0) {
|
|
16006
|
-
query = query.where(
|
|
15704
|
+
query = query.where(and3(...conditions));
|
|
16007
15705
|
}
|
|
16008
15706
|
if (params.limit) {
|
|
16009
15707
|
query = query.limit(params.limit);
|
|
@@ -16011,34 +15709,34 @@ var init_brain_accessor = __esm({
|
|
|
16011
15709
|
return query;
|
|
16012
15710
|
}
|
|
16013
15711
|
async updateDecision(id, updates) {
|
|
16014
|
-
await this.db.update(brainDecisions).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(
|
|
15712
|
+
await this.db.update(brainDecisions).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq5(brainDecisions.id, id));
|
|
16015
15713
|
}
|
|
16016
15714
|
// =========================================================================
|
|
16017
15715
|
// Patterns CRUD
|
|
16018
15716
|
// =========================================================================
|
|
16019
15717
|
async addPattern(row) {
|
|
16020
15718
|
await this.db.insert(brainPatterns).values(row);
|
|
16021
|
-
const result = await this.db.select().from(brainPatterns).where(
|
|
15719
|
+
const result = await this.db.select().from(brainPatterns).where(eq5(brainPatterns.id, row.id));
|
|
16022
15720
|
return result[0];
|
|
16023
15721
|
}
|
|
16024
15722
|
async getPattern(id) {
|
|
16025
|
-
const result = await this.db.select().from(brainPatterns).where(
|
|
15723
|
+
const result = await this.db.select().from(brainPatterns).where(eq5(brainPatterns.id, id));
|
|
16026
15724
|
return result[0] ?? null;
|
|
16027
15725
|
}
|
|
16028
15726
|
async findPatterns(params = {}) {
|
|
16029
15727
|
const conditions = [];
|
|
16030
15728
|
if (params.type) {
|
|
16031
|
-
conditions.push(
|
|
15729
|
+
conditions.push(eq5(brainPatterns.type, params.type));
|
|
16032
15730
|
}
|
|
16033
15731
|
if (params.impact) {
|
|
16034
|
-
conditions.push(
|
|
15732
|
+
conditions.push(eq5(brainPatterns.impact, params.impact));
|
|
16035
15733
|
}
|
|
16036
15734
|
if (params.minFrequency !== void 0) {
|
|
16037
15735
|
conditions.push(gte2(brainPatterns.frequency, params.minFrequency));
|
|
16038
15736
|
}
|
|
16039
15737
|
let query = this.db.select().from(brainPatterns).orderBy(desc2(brainPatterns.frequency));
|
|
16040
15738
|
if (conditions.length > 0) {
|
|
16041
|
-
query = query.where(
|
|
15739
|
+
query = query.where(and3(...conditions));
|
|
16042
15740
|
}
|
|
16043
15741
|
if (params.limit) {
|
|
16044
15742
|
query = query.limit(params.limit);
|
|
@@ -16046,18 +15744,18 @@ var init_brain_accessor = __esm({
|
|
|
16046
15744
|
return query;
|
|
16047
15745
|
}
|
|
16048
15746
|
async updatePattern(id, updates) {
|
|
16049
|
-
await this.db.update(brainPatterns).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(
|
|
15747
|
+
await this.db.update(brainPatterns).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq5(brainPatterns.id, id));
|
|
16050
15748
|
}
|
|
16051
15749
|
// =========================================================================
|
|
16052
15750
|
// Learnings CRUD
|
|
16053
15751
|
// =========================================================================
|
|
16054
15752
|
async addLearning(row) {
|
|
16055
15753
|
await this.db.insert(brainLearnings).values(row);
|
|
16056
|
-
const result = await this.db.select().from(brainLearnings).where(
|
|
15754
|
+
const result = await this.db.select().from(brainLearnings).where(eq5(brainLearnings.id, row.id));
|
|
16057
15755
|
return result[0];
|
|
16058
15756
|
}
|
|
16059
15757
|
async getLearning(id) {
|
|
16060
|
-
const result = await this.db.select().from(brainLearnings).where(
|
|
15758
|
+
const result = await this.db.select().from(brainLearnings).where(eq5(brainLearnings.id, id));
|
|
16061
15759
|
return result[0] ?? null;
|
|
16062
15760
|
}
|
|
16063
15761
|
async findLearnings(params = {}) {
|
|
@@ -16066,11 +15764,11 @@ var init_brain_accessor = __esm({
|
|
|
16066
15764
|
conditions.push(gte2(brainLearnings.confidence, params.minConfidence));
|
|
16067
15765
|
}
|
|
16068
15766
|
if (params.actionable !== void 0) {
|
|
16069
|
-
conditions.push(
|
|
15767
|
+
conditions.push(eq5(brainLearnings.actionable, params.actionable));
|
|
16070
15768
|
}
|
|
16071
15769
|
let query = this.db.select().from(brainLearnings).orderBy(desc2(brainLearnings.confidence));
|
|
16072
15770
|
if (conditions.length > 0) {
|
|
16073
|
-
query = query.where(
|
|
15771
|
+
query = query.where(and3(...conditions));
|
|
16074
15772
|
}
|
|
16075
15773
|
if (params.limit) {
|
|
16076
15774
|
query = query.limit(params.limit);
|
|
@@ -16078,37 +15776,37 @@ var init_brain_accessor = __esm({
|
|
|
16078
15776
|
return query;
|
|
16079
15777
|
}
|
|
16080
15778
|
async updateLearning(id, updates) {
|
|
16081
|
-
await this.db.update(brainLearnings).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(
|
|
15779
|
+
await this.db.update(brainLearnings).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq5(brainLearnings.id, id));
|
|
16082
15780
|
}
|
|
16083
15781
|
// =========================================================================
|
|
16084
15782
|
// Observations CRUD
|
|
16085
15783
|
// =========================================================================
|
|
16086
15784
|
async addObservation(row) {
|
|
16087
15785
|
await this.db.insert(brainObservations).values(row);
|
|
16088
|
-
const result = await this.db.select().from(brainObservations).where(
|
|
15786
|
+
const result = await this.db.select().from(brainObservations).where(eq5(brainObservations.id, row.id));
|
|
16089
15787
|
return result[0];
|
|
16090
15788
|
}
|
|
16091
15789
|
async getObservation(id) {
|
|
16092
|
-
const result = await this.db.select().from(brainObservations).where(
|
|
15790
|
+
const result = await this.db.select().from(brainObservations).where(eq5(brainObservations.id, id));
|
|
16093
15791
|
return result[0] ?? null;
|
|
16094
15792
|
}
|
|
16095
15793
|
async findObservations(params = {}) {
|
|
16096
15794
|
const conditions = [];
|
|
16097
15795
|
if (params.type) {
|
|
16098
|
-
conditions.push(
|
|
15796
|
+
conditions.push(eq5(brainObservations.type, params.type));
|
|
16099
15797
|
}
|
|
16100
15798
|
if (params.project) {
|
|
16101
|
-
conditions.push(
|
|
15799
|
+
conditions.push(eq5(brainObservations.project, params.project));
|
|
16102
15800
|
}
|
|
16103
15801
|
if (params.sourceType) {
|
|
16104
|
-
conditions.push(
|
|
15802
|
+
conditions.push(eq5(brainObservations.sourceType, params.sourceType));
|
|
16105
15803
|
}
|
|
16106
15804
|
if (params.sourceSessionId) {
|
|
16107
|
-
conditions.push(
|
|
15805
|
+
conditions.push(eq5(brainObservations.sourceSessionId, params.sourceSessionId));
|
|
16108
15806
|
}
|
|
16109
15807
|
let query = this.db.select().from(brainObservations).orderBy(desc2(brainObservations.createdAt));
|
|
16110
15808
|
if (conditions.length > 0) {
|
|
16111
|
-
query = query.where(
|
|
15809
|
+
query = query.where(and3(...conditions));
|
|
16112
15810
|
}
|
|
16113
15811
|
if (params.limit) {
|
|
16114
15812
|
query = query.limit(params.limit);
|
|
@@ -16116,7 +15814,7 @@ var init_brain_accessor = __esm({
|
|
|
16116
15814
|
return query;
|
|
16117
15815
|
}
|
|
16118
15816
|
async updateObservation(id, updates) {
|
|
16119
|
-
await this.db.update(brainObservations).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(
|
|
15817
|
+
await this.db.update(brainObservations).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq5(brainObservations.id, id));
|
|
16120
15818
|
}
|
|
16121
15819
|
// =========================================================================
|
|
16122
15820
|
// Memory Links CRUD
|
|
@@ -16126,22 +15824,22 @@ var init_brain_accessor = __esm({
|
|
|
16126
15824
|
}
|
|
16127
15825
|
async getLinksForMemory(memoryType, memoryId) {
|
|
16128
15826
|
return this.db.select().from(brainMemoryLinks).where(
|
|
16129
|
-
|
|
16130
|
-
|
|
16131
|
-
|
|
15827
|
+
and3(
|
|
15828
|
+
eq5(brainMemoryLinks.memoryType, memoryType),
|
|
15829
|
+
eq5(brainMemoryLinks.memoryId, memoryId)
|
|
16132
15830
|
)
|
|
16133
15831
|
).orderBy(asc2(brainMemoryLinks.createdAt));
|
|
16134
15832
|
}
|
|
16135
15833
|
async getLinksForTask(taskId) {
|
|
16136
|
-
return this.db.select().from(brainMemoryLinks).where(
|
|
15834
|
+
return this.db.select().from(brainMemoryLinks).where(eq5(brainMemoryLinks.taskId, taskId)).orderBy(asc2(brainMemoryLinks.createdAt));
|
|
16137
15835
|
}
|
|
16138
15836
|
async removeLink(memoryType, memoryId, taskId, linkType) {
|
|
16139
15837
|
await this.db.delete(brainMemoryLinks).where(
|
|
16140
|
-
|
|
16141
|
-
|
|
16142
|
-
|
|
16143
|
-
|
|
16144
|
-
|
|
15838
|
+
and3(
|
|
15839
|
+
eq5(brainMemoryLinks.memoryType, memoryType),
|
|
15840
|
+
eq5(brainMemoryLinks.memoryId, memoryId),
|
|
15841
|
+
eq5(brainMemoryLinks.taskId, taskId),
|
|
15842
|
+
eq5(brainMemoryLinks.linkType, linkType)
|
|
16145
15843
|
)
|
|
16146
15844
|
);
|
|
16147
15845
|
}
|
|
@@ -16150,27 +15848,27 @@ var init_brain_accessor = __esm({
|
|
|
16150
15848
|
// =========================================================================
|
|
16151
15849
|
async addStickyNote(row) {
|
|
16152
15850
|
await this.db.insert(brainStickyNotes).values(row);
|
|
16153
|
-
const result = await this.db.select().from(brainStickyNotes).where(
|
|
15851
|
+
const result = await this.db.select().from(brainStickyNotes).where(eq5(brainStickyNotes.id, row.id));
|
|
16154
15852
|
return result[0];
|
|
16155
15853
|
}
|
|
16156
15854
|
async getStickyNote(id) {
|
|
16157
|
-
const result = await this.db.select().from(brainStickyNotes).where(
|
|
15855
|
+
const result = await this.db.select().from(brainStickyNotes).where(eq5(brainStickyNotes.id, id));
|
|
16158
15856
|
return result[0] ?? null;
|
|
16159
15857
|
}
|
|
16160
15858
|
async findStickyNotes(params = {}) {
|
|
16161
15859
|
const conditions = [];
|
|
16162
15860
|
if (params.status) {
|
|
16163
|
-
conditions.push(
|
|
15861
|
+
conditions.push(eq5(brainStickyNotes.status, params.status));
|
|
16164
15862
|
}
|
|
16165
15863
|
if (params.color) {
|
|
16166
|
-
conditions.push(
|
|
15864
|
+
conditions.push(eq5(brainStickyNotes.color, params.color));
|
|
16167
15865
|
}
|
|
16168
15866
|
if (params.priority) {
|
|
16169
|
-
conditions.push(
|
|
15867
|
+
conditions.push(eq5(brainStickyNotes.priority, params.priority));
|
|
16170
15868
|
}
|
|
16171
15869
|
let query = this.db.select().from(brainStickyNotes).orderBy(desc2(brainStickyNotes.createdAt));
|
|
16172
15870
|
if (conditions.length > 0) {
|
|
16173
|
-
query = query.where(
|
|
15871
|
+
query = query.where(and3(...conditions));
|
|
16174
15872
|
}
|
|
16175
15873
|
if (params.limit) {
|
|
16176
15874
|
query = query.limit(params.limit);
|
|
@@ -16178,31 +15876,31 @@ var init_brain_accessor = __esm({
|
|
|
16178
15876
|
return query;
|
|
16179
15877
|
}
|
|
16180
15878
|
async updateStickyNote(id, updates) {
|
|
16181
|
-
await this.db.update(brainStickyNotes).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(
|
|
15879
|
+
await this.db.update(brainStickyNotes).set({ ...updates, updatedAt: (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19) }).where(eq5(brainStickyNotes.id, id));
|
|
16182
15880
|
}
|
|
16183
15881
|
async deleteStickyNote(id) {
|
|
16184
|
-
await this.db.delete(brainStickyNotes).where(
|
|
15882
|
+
await this.db.delete(brainStickyNotes).where(eq5(brainStickyNotes.id, id));
|
|
16185
15883
|
}
|
|
16186
15884
|
// =========================================================================
|
|
16187
15885
|
// PageIndex Node CRUD (T5383)
|
|
16188
15886
|
// =========================================================================
|
|
16189
15887
|
async addPageNode(node) {
|
|
16190
15888
|
await this.db.insert(brainPageNodes).values(node);
|
|
16191
|
-
const result = await this.db.select().from(brainPageNodes).where(
|
|
15889
|
+
const result = await this.db.select().from(brainPageNodes).where(eq5(brainPageNodes.id, node.id));
|
|
16192
15890
|
return result[0];
|
|
16193
15891
|
}
|
|
16194
15892
|
async getPageNode(id) {
|
|
16195
|
-
const result = await this.db.select().from(brainPageNodes).where(
|
|
15893
|
+
const result = await this.db.select().from(brainPageNodes).where(eq5(brainPageNodes.id, id));
|
|
16196
15894
|
return result[0] ?? null;
|
|
16197
15895
|
}
|
|
16198
15896
|
async findPageNodes(params = {}) {
|
|
16199
15897
|
const conditions = [];
|
|
16200
15898
|
if (params.nodeType) {
|
|
16201
|
-
conditions.push(
|
|
15899
|
+
conditions.push(eq5(brainPageNodes.nodeType, params.nodeType));
|
|
16202
15900
|
}
|
|
16203
15901
|
let query = this.db.select().from(brainPageNodes).orderBy(desc2(brainPageNodes.createdAt));
|
|
16204
15902
|
if (conditions.length > 0) {
|
|
16205
|
-
query = query.where(
|
|
15903
|
+
query = query.where(and3(...conditions));
|
|
16206
15904
|
}
|
|
16207
15905
|
if (params.limit) {
|
|
16208
15906
|
query = query.limit(params.limit);
|
|
@@ -16211,9 +15909,9 @@ var init_brain_accessor = __esm({
|
|
|
16211
15909
|
}
|
|
16212
15910
|
async removePageNode(id) {
|
|
16213
15911
|
await this.db.delete(brainPageEdges).where(
|
|
16214
|
-
or3(
|
|
15912
|
+
or3(eq5(brainPageEdges.fromId, id), eq5(brainPageEdges.toId, id))
|
|
16215
15913
|
);
|
|
16216
|
-
await this.db.delete(brainPageNodes).where(
|
|
15914
|
+
await this.db.delete(brainPageNodes).where(eq5(brainPageNodes.id, id));
|
|
16217
15915
|
}
|
|
16218
15916
|
// =========================================================================
|
|
16219
15917
|
// PageIndex Edge CRUD (T5383)
|
|
@@ -16221,34 +15919,34 @@ var init_brain_accessor = __esm({
|
|
|
16221
15919
|
async addPageEdge(edge) {
|
|
16222
15920
|
await this.db.insert(brainPageEdges).values(edge);
|
|
16223
15921
|
const result = await this.db.select().from(brainPageEdges).where(
|
|
16224
|
-
|
|
16225
|
-
|
|
16226
|
-
|
|
16227
|
-
|
|
15922
|
+
and3(
|
|
15923
|
+
eq5(brainPageEdges.fromId, edge.fromId),
|
|
15924
|
+
eq5(brainPageEdges.toId, edge.toId),
|
|
15925
|
+
eq5(brainPageEdges.edgeType, edge.edgeType)
|
|
16228
15926
|
)
|
|
16229
15927
|
);
|
|
16230
15928
|
return result[0];
|
|
16231
15929
|
}
|
|
16232
15930
|
async getPageEdges(nodeId, direction = "both") {
|
|
16233
15931
|
if (direction === "out") {
|
|
16234
|
-
return this.db.select().from(brainPageEdges).where(
|
|
15932
|
+
return this.db.select().from(brainPageEdges).where(eq5(brainPageEdges.fromId, nodeId)).orderBy(asc2(brainPageEdges.createdAt));
|
|
16235
15933
|
}
|
|
16236
15934
|
if (direction === "in") {
|
|
16237
|
-
return this.db.select().from(brainPageEdges).where(
|
|
15935
|
+
return this.db.select().from(brainPageEdges).where(eq5(brainPageEdges.toId, nodeId)).orderBy(asc2(brainPageEdges.createdAt));
|
|
16238
15936
|
}
|
|
16239
15937
|
return this.db.select().from(brainPageEdges).where(
|
|
16240
15938
|
or3(
|
|
16241
|
-
|
|
16242
|
-
|
|
15939
|
+
eq5(brainPageEdges.fromId, nodeId),
|
|
15940
|
+
eq5(brainPageEdges.toId, nodeId)
|
|
16243
15941
|
)
|
|
16244
15942
|
).orderBy(asc2(brainPageEdges.createdAt));
|
|
16245
15943
|
}
|
|
16246
15944
|
async getNeighbors(nodeId, edgeType) {
|
|
16247
|
-
const conditions = [
|
|
15945
|
+
const conditions = [eq5(brainPageEdges.fromId, nodeId)];
|
|
16248
15946
|
if (edgeType) {
|
|
16249
|
-
conditions.push(
|
|
15947
|
+
conditions.push(eq5(brainPageEdges.edgeType, edgeType));
|
|
16250
15948
|
}
|
|
16251
|
-
const edges = await this.db.select().from(brainPageEdges).where(
|
|
15949
|
+
const edges = await this.db.select().from(brainPageEdges).where(and3(...conditions));
|
|
16252
15950
|
if (edges.length === 0) return [];
|
|
16253
15951
|
const neighborIds = edges.map((e) => e.toId);
|
|
16254
15952
|
const nodes = [];
|
|
@@ -16260,10 +15958,10 @@ var init_brain_accessor = __esm({
|
|
|
16260
15958
|
}
|
|
16261
15959
|
async removePageEdge(fromId, toId, edgeType) {
|
|
16262
15960
|
await this.db.delete(brainPageEdges).where(
|
|
16263
|
-
|
|
16264
|
-
|
|
16265
|
-
|
|
16266
|
-
|
|
15961
|
+
and3(
|
|
15962
|
+
eq5(brainPageEdges.fromId, fromId),
|
|
15963
|
+
eq5(brainPageEdges.toId, toId),
|
|
15964
|
+
eq5(brainPageEdges.edgeType, edgeType)
|
|
16267
15965
|
)
|
|
16268
15966
|
);
|
|
16269
15967
|
}
|
|
@@ -16272,15 +15970,15 @@ var init_brain_accessor = __esm({
|
|
|
16272
15970
|
});
|
|
16273
15971
|
|
|
16274
15972
|
// packages/core/src/agents/execution-learning.ts
|
|
16275
|
-
import { randomBytes
|
|
15973
|
+
import { randomBytes } from "node:crypto";
|
|
16276
15974
|
function generateDecisionId() {
|
|
16277
|
-
return `AGT-${
|
|
15975
|
+
return `AGT-${randomBytes(5).toString("hex")}`;
|
|
16278
15976
|
}
|
|
16279
15977
|
function generatePatternId() {
|
|
16280
|
-
return `P-agt-${
|
|
15978
|
+
return `P-agt-${randomBytes(4).toString("hex")}`;
|
|
16281
15979
|
}
|
|
16282
15980
|
function generateObservationId() {
|
|
16283
|
-
return `O-agt-${
|
|
15981
|
+
return `O-agt-${randomBytes(4).toString("hex")}`;
|
|
16284
15982
|
}
|
|
16285
15983
|
function nowSql() {
|
|
16286
15984
|
return (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19);
|
|
@@ -16563,6 +16261,473 @@ var init_execution_learning = __esm({
|
|
|
16563
16261
|
}
|
|
16564
16262
|
});
|
|
16565
16263
|
|
|
16264
|
+
// packages/core/src/agents/registry.ts
|
|
16265
|
+
var registry_exports2 = {};
|
|
16266
|
+
__export(registry_exports2, {
|
|
16267
|
+
checkAgentHealth: () => checkAgentHealth,
|
|
16268
|
+
classifyError: () => classifyError,
|
|
16269
|
+
deregisterAgent: () => deregisterAgent,
|
|
16270
|
+
generateAgentId: () => generateAgentId,
|
|
16271
|
+
getAgentErrorHistory: () => getAgentErrorHistory,
|
|
16272
|
+
getAgentInstance: () => getAgentInstance,
|
|
16273
|
+
getHealthReport: () => getHealthReport,
|
|
16274
|
+
heartbeat: () => heartbeat,
|
|
16275
|
+
incrementTasksCompleted: () => incrementTasksCompleted,
|
|
16276
|
+
listAgentInstances: () => listAgentInstances,
|
|
16277
|
+
markCrashed: () => markCrashed,
|
|
16278
|
+
registerAgent: () => registerAgent,
|
|
16279
|
+
updateAgentStatus: () => updateAgentStatus
|
|
16280
|
+
});
|
|
16281
|
+
import { randomBytes as randomBytes2 } from "node:crypto";
|
|
16282
|
+
import { and as and4, eq as eq6, inArray as inArray4, lt as lt2, sql as sql8 } from "drizzle-orm";
|
|
16283
|
+
function generateAgentId() {
|
|
16284
|
+
const now2 = /* @__PURE__ */ new Date();
|
|
16285
|
+
const ts = now2.toISOString().replace(/[-:T]/g, "").substring(0, 14);
|
|
16286
|
+
const hex = randomBytes2(3).toString("hex");
|
|
16287
|
+
return `agt_${ts}_${hex}`;
|
|
16288
|
+
}
|
|
16289
|
+
async function registerAgent(opts, cwd) {
|
|
16290
|
+
const db = await getDb(cwd);
|
|
16291
|
+
const id = generateAgentId();
|
|
16292
|
+
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
16293
|
+
const row = {
|
|
16294
|
+
id,
|
|
16295
|
+
agentType: opts.agentType,
|
|
16296
|
+
status: "starting",
|
|
16297
|
+
sessionId: opts.sessionId ?? null,
|
|
16298
|
+
taskId: opts.taskId ?? null,
|
|
16299
|
+
startedAt: now2,
|
|
16300
|
+
lastHeartbeat: now2,
|
|
16301
|
+
stoppedAt: null,
|
|
16302
|
+
errorCount: 0,
|
|
16303
|
+
totalTasksCompleted: 0,
|
|
16304
|
+
capacity: "1.0",
|
|
16305
|
+
metadataJson: opts.metadata ? JSON.stringify(opts.metadata) : "{}",
|
|
16306
|
+
parentAgentId: opts.parentAgentId ?? null
|
|
16307
|
+
};
|
|
16308
|
+
await db.insert(agentInstances).values(row);
|
|
16309
|
+
return row;
|
|
16310
|
+
}
|
|
16311
|
+
async function deregisterAgent(id, cwd) {
|
|
16312
|
+
const db = await getDb(cwd);
|
|
16313
|
+
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
16314
|
+
const existing = await db.select().from(agentInstances).where(eq6(agentInstances.id, id)).get();
|
|
16315
|
+
if (!existing) return null;
|
|
16316
|
+
if (existing.status === "stopped") return existing;
|
|
16317
|
+
await db.update(agentInstances).set({ status: "stopped", stoppedAt: now2 }).where(eq6(agentInstances.id, id));
|
|
16318
|
+
return { ...existing, status: "stopped", stoppedAt: now2 };
|
|
16319
|
+
}
|
|
16320
|
+
async function heartbeat(id, cwd) {
|
|
16321
|
+
const db = await getDb(cwd);
|
|
16322
|
+
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
16323
|
+
const existing = await db.select().from(agentInstances).where(eq6(agentInstances.id, id)).get();
|
|
16324
|
+
if (!existing) return null;
|
|
16325
|
+
if (existing.status === "stopped" || existing.status === "crashed") {
|
|
16326
|
+
return existing.status;
|
|
16327
|
+
}
|
|
16328
|
+
await db.update(agentInstances).set({ lastHeartbeat: now2 }).where(eq6(agentInstances.id, id));
|
|
16329
|
+
return existing.status;
|
|
16330
|
+
}
|
|
16331
|
+
async function updateAgentStatus(id, opts, cwd) {
|
|
16332
|
+
const db = await getDb(cwd);
|
|
16333
|
+
const existing = await db.select().from(agentInstances).where(eq6(agentInstances.id, id)).get();
|
|
16334
|
+
if (!existing) return null;
|
|
16335
|
+
const updates = {
|
|
16336
|
+
status: opts.status
|
|
16337
|
+
};
|
|
16338
|
+
if (opts.taskId !== void 0) {
|
|
16339
|
+
updates.taskId = opts.taskId;
|
|
16340
|
+
}
|
|
16341
|
+
if (opts.status === "active") {
|
|
16342
|
+
updates.lastHeartbeat = (/* @__PURE__ */ new Date()).toISOString();
|
|
16343
|
+
}
|
|
16344
|
+
if (opts.status === "error" || opts.status === "crashed") {
|
|
16345
|
+
updates.errorCount = existing.errorCount + 1;
|
|
16346
|
+
if (opts.error) {
|
|
16347
|
+
const errorType = classifyError(new Error(opts.error));
|
|
16348
|
+
await db.insert(agentErrorLog).values({
|
|
16349
|
+
agentId: id,
|
|
16350
|
+
errorType,
|
|
16351
|
+
message: opts.error,
|
|
16352
|
+
occurredAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
16353
|
+
});
|
|
16354
|
+
}
|
|
16355
|
+
}
|
|
16356
|
+
if (opts.status === "stopped") {
|
|
16357
|
+
updates.stoppedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
16358
|
+
}
|
|
16359
|
+
await db.update(agentInstances).set(updates).where(eq6(agentInstances.id, id));
|
|
16360
|
+
return { ...existing, ...updates };
|
|
16361
|
+
}
|
|
16362
|
+
async function incrementTasksCompleted(id, cwd) {
|
|
16363
|
+
const db = await getDb(cwd);
|
|
16364
|
+
await db.update(agentInstances).set({ totalTasksCompleted: sql8`${agentInstances.totalTasksCompleted} + 1` }).where(eq6(agentInstances.id, id));
|
|
16365
|
+
}
|
|
16366
|
+
async function listAgentInstances(filters, cwd) {
|
|
16367
|
+
const db = await getDb(cwd);
|
|
16368
|
+
const conditions = [];
|
|
16369
|
+
if (filters?.status) {
|
|
16370
|
+
const statuses = Array.isArray(filters.status) ? filters.status : [filters.status];
|
|
16371
|
+
conditions.push(inArray4(agentInstances.status, statuses));
|
|
16372
|
+
}
|
|
16373
|
+
if (filters?.agentType) {
|
|
16374
|
+
const types = Array.isArray(filters.agentType) ? filters.agentType : [filters.agentType];
|
|
16375
|
+
conditions.push(inArray4(agentInstances.agentType, types));
|
|
16376
|
+
}
|
|
16377
|
+
if (filters?.sessionId) {
|
|
16378
|
+
conditions.push(eq6(agentInstances.sessionId, filters.sessionId));
|
|
16379
|
+
}
|
|
16380
|
+
if (filters?.parentAgentId) {
|
|
16381
|
+
conditions.push(eq6(agentInstances.parentAgentId, filters.parentAgentId));
|
|
16382
|
+
}
|
|
16383
|
+
if (conditions.length === 0) {
|
|
16384
|
+
return db.select().from(agentInstances).all();
|
|
16385
|
+
}
|
|
16386
|
+
return db.select().from(agentInstances).where(and4(...conditions)).all();
|
|
16387
|
+
}
|
|
16388
|
+
async function getAgentInstance(id, cwd) {
|
|
16389
|
+
const db = await getDb(cwd);
|
|
16390
|
+
const row = await db.select().from(agentInstances).where(eq6(agentInstances.id, id)).get();
|
|
16391
|
+
return row ?? null;
|
|
16392
|
+
}
|
|
16393
|
+
function classifyError(error40) {
|
|
16394
|
+
const message = error40 instanceof Error ? error40.message : String(error40);
|
|
16395
|
+
for (const pattern of RETRIABLE_PATTERNS) {
|
|
16396
|
+
if (pattern.test(message)) return "retriable";
|
|
16397
|
+
}
|
|
16398
|
+
for (const pattern of PERMANENT_PATTERNS) {
|
|
16399
|
+
if (pattern.test(message)) return "permanent";
|
|
16400
|
+
}
|
|
16401
|
+
return "unknown";
|
|
16402
|
+
}
|
|
16403
|
+
async function getAgentErrorHistory(agentId, cwd) {
|
|
16404
|
+
const db = await getDb(cwd);
|
|
16405
|
+
return db.select().from(agentErrorLog).where(eq6(agentErrorLog.agentId, agentId)).all();
|
|
16406
|
+
}
|
|
16407
|
+
async function checkAgentHealth(thresholdMs = 3e4, cwd) {
|
|
16408
|
+
const db = await getDb(cwd);
|
|
16409
|
+
const cutoff = new Date(Date.now() - thresholdMs).toISOString();
|
|
16410
|
+
return db.select().from(agentInstances).where(
|
|
16411
|
+
and4(
|
|
16412
|
+
inArray4(agentInstances.status, ["active", "idle", "starting"]),
|
|
16413
|
+
lt2(agentInstances.lastHeartbeat, cutoff)
|
|
16414
|
+
)
|
|
16415
|
+
).all();
|
|
16416
|
+
}
|
|
16417
|
+
async function markCrashed(id, reason, cwd) {
|
|
16418
|
+
return updateAgentStatus(
|
|
16419
|
+
id,
|
|
16420
|
+
{ status: "crashed", error: reason ?? "Heartbeat timeout \u2014 agent presumed crashed" },
|
|
16421
|
+
cwd
|
|
16422
|
+
);
|
|
16423
|
+
}
|
|
16424
|
+
async function getHealthReport(thresholdMs = 3e4, cwd) {
|
|
16425
|
+
const allAgents = await listAgentInstances(void 0, cwd);
|
|
16426
|
+
const staleAgents = await checkAgentHealth(thresholdMs, cwd);
|
|
16427
|
+
const report = {
|
|
16428
|
+
total: allAgents.length,
|
|
16429
|
+
active: 0,
|
|
16430
|
+
idle: 0,
|
|
16431
|
+
starting: 0,
|
|
16432
|
+
error: 0,
|
|
16433
|
+
crashed: 0,
|
|
16434
|
+
stopped: 0,
|
|
16435
|
+
totalErrors: 0,
|
|
16436
|
+
staleAgents
|
|
16437
|
+
};
|
|
16438
|
+
for (const agent of allAgents) {
|
|
16439
|
+
switch (agent.status) {
|
|
16440
|
+
case "active":
|
|
16441
|
+
report.active++;
|
|
16442
|
+
break;
|
|
16443
|
+
case "idle":
|
|
16444
|
+
report.idle++;
|
|
16445
|
+
break;
|
|
16446
|
+
case "starting":
|
|
16447
|
+
report.starting++;
|
|
16448
|
+
break;
|
|
16449
|
+
case "error":
|
|
16450
|
+
report.error++;
|
|
16451
|
+
break;
|
|
16452
|
+
case "crashed":
|
|
16453
|
+
report.crashed++;
|
|
16454
|
+
break;
|
|
16455
|
+
case "stopped":
|
|
16456
|
+
report.stopped++;
|
|
16457
|
+
break;
|
|
16458
|
+
}
|
|
16459
|
+
report.totalErrors += agent.errorCount;
|
|
16460
|
+
}
|
|
16461
|
+
return report;
|
|
16462
|
+
}
|
|
16463
|
+
var RETRIABLE_PATTERNS, PERMANENT_PATTERNS;
|
|
16464
|
+
var init_registry2 = __esm({
|
|
16465
|
+
"packages/core/src/agents/registry.ts"() {
|
|
16466
|
+
"use strict";
|
|
16467
|
+
init_sqlite2();
|
|
16468
|
+
init_agent_schema();
|
|
16469
|
+
RETRIABLE_PATTERNS = [
|
|
16470
|
+
/timeout/i,
|
|
16471
|
+
/ECONNREFUSED/,
|
|
16472
|
+
/ECONNRESET/,
|
|
16473
|
+
/EPIPE/,
|
|
16474
|
+
/ETIMEDOUT/,
|
|
16475
|
+
/rate.?limit/i,
|
|
16476
|
+
/429/,
|
|
16477
|
+
/503/,
|
|
16478
|
+
/502/,
|
|
16479
|
+
/SQLITE_BUSY/i,
|
|
16480
|
+
/database is locked/i,
|
|
16481
|
+
/temporarily unavailable/i,
|
|
16482
|
+
/too many requests/i,
|
|
16483
|
+
/network/i,
|
|
16484
|
+
/socket hang up/i
|
|
16485
|
+
];
|
|
16486
|
+
PERMANENT_PATTERNS = [
|
|
16487
|
+
/permission denied/i,
|
|
16488
|
+
/EACCES/,
|
|
16489
|
+
/authentication/i,
|
|
16490
|
+
/unauthorized/i,
|
|
16491
|
+
/401/,
|
|
16492
|
+
/403/,
|
|
16493
|
+
/404/,
|
|
16494
|
+
/not found/i,
|
|
16495
|
+
/invalid.*token/i,
|
|
16496
|
+
/SQLITE_CONSTRAINT/i,
|
|
16497
|
+
/syntax error/i,
|
|
16498
|
+
/type error/i,
|
|
16499
|
+
/reference error/i
|
|
16500
|
+
];
|
|
16501
|
+
}
|
|
16502
|
+
});
|
|
16503
|
+
|
|
16504
|
+
// packages/core/src/agents/agent-registry.ts
|
|
16505
|
+
import { and as and5, eq as eq7, inArray as inArray5 } from "drizzle-orm";
|
|
16506
|
+
async function getAgentCapacity(agentId, cwd) {
|
|
16507
|
+
const db = await getDb(cwd);
|
|
16508
|
+
const agent = await db.select().from(agentInstances).where(eq7(agentInstances.id, agentId)).get();
|
|
16509
|
+
if (!agent) return null;
|
|
16510
|
+
const isTerminal = agent.status === "stopped" || agent.status === "crashed";
|
|
16511
|
+
if (isTerminal) {
|
|
16512
|
+
return {
|
|
16513
|
+
agentId: agent.id,
|
|
16514
|
+
agentType: agent.agentType,
|
|
16515
|
+
status: agent.status,
|
|
16516
|
+
activeTasks: 0,
|
|
16517
|
+
remainingCapacity: 0,
|
|
16518
|
+
maxCapacity: MAX_TASKS_PER_AGENT,
|
|
16519
|
+
available: false
|
|
16520
|
+
};
|
|
16521
|
+
}
|
|
16522
|
+
const children = await db.select({ id: agentInstances.id }).from(agentInstances).where(
|
|
16523
|
+
and5(
|
|
16524
|
+
eq7(agentInstances.parentAgentId, agentId),
|
|
16525
|
+
inArray5(agentInstances.status, ["starting", "active", "idle", "error"])
|
|
16526
|
+
)
|
|
16527
|
+
).all();
|
|
16528
|
+
const selfTask = agent.taskId != null ? 1 : 0;
|
|
16529
|
+
const activeTasks = selfTask + children.length;
|
|
16530
|
+
const remainingCapacity = Math.max(0, MAX_TASKS_PER_AGENT - activeTasks);
|
|
16531
|
+
return {
|
|
16532
|
+
agentId: agent.id,
|
|
16533
|
+
agentType: agent.agentType,
|
|
16534
|
+
status: agent.status,
|
|
16535
|
+
activeTasks,
|
|
16536
|
+
remainingCapacity,
|
|
16537
|
+
maxCapacity: MAX_TASKS_PER_AGENT,
|
|
16538
|
+
available: remainingCapacity > 0
|
|
16539
|
+
};
|
|
16540
|
+
}
|
|
16541
|
+
async function getAgentsByCapacity(agentType, cwd) {
|
|
16542
|
+
const filters = agentType ? { status: ["active", "idle"], agentType } : { status: ["active", "idle"] };
|
|
16543
|
+
const activeAgents = await listAgentInstances(filters, cwd);
|
|
16544
|
+
const capacities = await Promise.all(
|
|
16545
|
+
activeAgents.map((agent) => getAgentCapacity(agent.id, cwd))
|
|
16546
|
+
);
|
|
16547
|
+
return capacities.filter((c) => c !== null).sort((a, b) => b.remainingCapacity - a.remainingCapacity);
|
|
16548
|
+
}
|
|
16549
|
+
async function getAgentSpecializations(agentId, cwd) {
|
|
16550
|
+
const db = await getDb(cwd);
|
|
16551
|
+
const agent = await db.select({ metadataJson: agentInstances.metadataJson }).from(agentInstances).where(eq7(agentInstances.id, agentId)).get();
|
|
16552
|
+
if (!agent) return [];
|
|
16553
|
+
try {
|
|
16554
|
+
const meta = JSON.parse(agent.metadataJson ?? "{}");
|
|
16555
|
+
const specs = meta.specializations;
|
|
16556
|
+
if (!Array.isArray(specs)) return [];
|
|
16557
|
+
return specs.filter((s) => typeof s === "string");
|
|
16558
|
+
} catch {
|
|
16559
|
+
return [];
|
|
16560
|
+
}
|
|
16561
|
+
}
|
|
16562
|
+
async function updateAgentSpecializations(agentId, specializations, cwd) {
|
|
16563
|
+
const db = await getDb(cwd);
|
|
16564
|
+
const agent = await db.select({ metadataJson: agentInstances.metadataJson }).from(agentInstances).where(eq7(agentInstances.id, agentId)).get();
|
|
16565
|
+
if (!agent) return null;
|
|
16566
|
+
let existing = {};
|
|
16567
|
+
try {
|
|
16568
|
+
existing = JSON.parse(agent.metadataJson ?? "{}");
|
|
16569
|
+
} catch {
|
|
16570
|
+
}
|
|
16571
|
+
const updated = { ...existing, specializations };
|
|
16572
|
+
await db.update(agentInstances).set({ metadataJson: JSON.stringify(updated) }).where(eq7(agentInstances.id, agentId));
|
|
16573
|
+
return specializations;
|
|
16574
|
+
}
|
|
16575
|
+
async function recordAgentPerformance(agentId, metrics, cwd) {
|
|
16576
|
+
const db = await getDb(cwd);
|
|
16577
|
+
const agent = await db.select({ agentType: agentInstances.agentType, sessionId: agentInstances.sessionId }).from(agentInstances).where(eq7(agentInstances.id, agentId)).get();
|
|
16578
|
+
if (!agent) return null;
|
|
16579
|
+
const event = {
|
|
16580
|
+
agentId,
|
|
16581
|
+
agentType: agent.agentType,
|
|
16582
|
+
taskId: metrics.taskId,
|
|
16583
|
+
taskType: metrics.taskType,
|
|
16584
|
+
outcome: metrics.outcome,
|
|
16585
|
+
taskLabels: metrics.taskLabels,
|
|
16586
|
+
sessionId: metrics.sessionId ?? agent.sessionId ?? void 0,
|
|
16587
|
+
durationMs: metrics.durationMs,
|
|
16588
|
+
errorMessage: metrics.errorMessage,
|
|
16589
|
+
errorType: metrics.errorType
|
|
16590
|
+
};
|
|
16591
|
+
const decision = await recordAgentExecution(event, cwd);
|
|
16592
|
+
return decision?.id ?? null;
|
|
16593
|
+
}
|
|
16594
|
+
var MAX_TASKS_PER_AGENT;
|
|
16595
|
+
var init_agent_registry = __esm({
|
|
16596
|
+
"packages/core/src/agents/agent-registry.ts"() {
|
|
16597
|
+
"use strict";
|
|
16598
|
+
init_sqlite2();
|
|
16599
|
+
init_agent_schema();
|
|
16600
|
+
init_execution_learning();
|
|
16601
|
+
init_registry2();
|
|
16602
|
+
MAX_TASKS_PER_AGENT = 5;
|
|
16603
|
+
}
|
|
16604
|
+
});
|
|
16605
|
+
|
|
16606
|
+
// packages/core/src/agents/capacity.ts
|
|
16607
|
+
import { eq as eq8 } from "drizzle-orm";
|
|
16608
|
+
async function updateCapacity(id, capacity, cwd) {
|
|
16609
|
+
if (capacity < 0 || capacity > 1) {
|
|
16610
|
+
throw new Error(`Capacity must be between 0.0 and 1.0, got ${capacity}`);
|
|
16611
|
+
}
|
|
16612
|
+
const db = await getDb(cwd);
|
|
16613
|
+
const existing = await db.select().from(agentInstances).where(eq8(agentInstances.id, id)).get();
|
|
16614
|
+
if (!existing) return null;
|
|
16615
|
+
const capacityStr = capacity.toFixed(4);
|
|
16616
|
+
await db.update(agentInstances).set({ capacity: capacityStr }).where(eq8(agentInstances.id, id));
|
|
16617
|
+
return { ...existing, capacity: capacityStr };
|
|
16618
|
+
}
|
|
16619
|
+
async function getAvailableCapacity(cwd) {
|
|
16620
|
+
const agents = await listAgentInstances({ status: ["active", "idle"] }, cwd);
|
|
16621
|
+
return agents.reduce((sum, agent) => sum + parseCapacity(agent.capacity), 0);
|
|
16622
|
+
}
|
|
16623
|
+
async function findLeastLoadedAgent(agentType, cwd) {
|
|
16624
|
+
const filters = agentType ? { status: ["active", "idle"], agentType } : { status: ["active", "idle"] };
|
|
16625
|
+
const agents = await listAgentInstances(filters, cwd);
|
|
16626
|
+
if (agents.length === 0) return null;
|
|
16627
|
+
let best = agents[0];
|
|
16628
|
+
let bestCapacity = parseCapacity(best.capacity);
|
|
16629
|
+
for (let i = 1; i < agents.length; i++) {
|
|
16630
|
+
const cap = parseCapacity(agents[i].capacity);
|
|
16631
|
+
if (cap > bestCapacity) {
|
|
16632
|
+
best = agents[i];
|
|
16633
|
+
bestCapacity = cap;
|
|
16634
|
+
}
|
|
16635
|
+
}
|
|
16636
|
+
return best;
|
|
16637
|
+
}
|
|
16638
|
+
async function isOverloaded(threshold = 0.1, cwd) {
|
|
16639
|
+
const capacity = await getAvailableCapacity(cwd);
|
|
16640
|
+
return capacity < threshold;
|
|
16641
|
+
}
|
|
16642
|
+
async function getCapacitySummary(threshold = 0.1, cwd) {
|
|
16643
|
+
const agents = await listAgentInstances({ status: ["active", "idle"] }, cwd);
|
|
16644
|
+
const totalCapacity = agents.reduce((sum, a) => sum + parseCapacity(a.capacity), 0);
|
|
16645
|
+
const activeAgentCount = agents.length;
|
|
16646
|
+
return {
|
|
16647
|
+
totalCapacity,
|
|
16648
|
+
activeAgentCount,
|
|
16649
|
+
averageCapacity: activeAgentCount > 0 ? totalCapacity / activeAgentCount : 0,
|
|
16650
|
+
overloaded: totalCapacity < threshold,
|
|
16651
|
+
threshold
|
|
16652
|
+
};
|
|
16653
|
+
}
|
|
16654
|
+
function parseCapacity(value) {
|
|
16655
|
+
if (!value) return 0;
|
|
16656
|
+
const parsed = parseFloat(value);
|
|
16657
|
+
return Number.isNaN(parsed) ? 0 : Math.max(0, Math.min(1, parsed));
|
|
16658
|
+
}
|
|
16659
|
+
var init_capacity = __esm({
|
|
16660
|
+
"packages/core/src/agents/capacity.ts"() {
|
|
16661
|
+
"use strict";
|
|
16662
|
+
init_sqlite2();
|
|
16663
|
+
init_agent_schema();
|
|
16664
|
+
init_registry2();
|
|
16665
|
+
}
|
|
16666
|
+
});
|
|
16667
|
+
|
|
16668
|
+
// packages/core/src/agents/health-monitor.ts
|
|
16669
|
+
async function recordHeartbeat(agentId, cwd) {
|
|
16670
|
+
return heartbeat(agentId, cwd);
|
|
16671
|
+
}
|
|
16672
|
+
async function checkAgentHealth2(agentId, thresholdMs = STALE_THRESHOLD_MS, cwd) {
|
|
16673
|
+
const all = await listAgentInstances(void 0, cwd);
|
|
16674
|
+
const agent = all.find((a) => a.id === agentId);
|
|
16675
|
+
if (!agent) return null;
|
|
16676
|
+
return buildHealthStatus(agent, thresholdMs);
|
|
16677
|
+
}
|
|
16678
|
+
async function detectStaleAgents(thresholdMs = STALE_THRESHOLD_MS, cwd) {
|
|
16679
|
+
const agents = await listAgentInstances({ status: ALIVE_STATUSES }, cwd);
|
|
16680
|
+
return agents.map((a) => buildHealthStatus(a, thresholdMs)).filter((s) => s.stale).sort((a, b) => b.heartbeatAgeMs - a.heartbeatAgeMs);
|
|
16681
|
+
}
|
|
16682
|
+
async function detectCrashedAgents(thresholdMs = STALE_THRESHOLD_MS, cwd) {
|
|
16683
|
+
const activeAgents = await listAgentInstances({ status: "active" }, cwd);
|
|
16684
|
+
const cutoff = new Date(Date.now() - thresholdMs).toISOString();
|
|
16685
|
+
const crashed = [];
|
|
16686
|
+
for (const agent of activeAgents) {
|
|
16687
|
+
if (agent.lastHeartbeat < cutoff) {
|
|
16688
|
+
const updated = await markCrashed(
|
|
16689
|
+
agent.id,
|
|
16690
|
+
`Heartbeat timeout \u2014 no heartbeat for >${Math.round(thresholdMs / 1e3)}s`,
|
|
16691
|
+
cwd
|
|
16692
|
+
);
|
|
16693
|
+
if (updated) {
|
|
16694
|
+
crashed.push(updated);
|
|
16695
|
+
}
|
|
16696
|
+
}
|
|
16697
|
+
}
|
|
16698
|
+
crashed.sort((a, b) => {
|
|
16699
|
+
const aHb = a.lastHeartbeat ?? "";
|
|
16700
|
+
const bHb = b.lastHeartbeat ?? "";
|
|
16701
|
+
return aHb < bHb ? -1 : aHb > bHb ? 1 : 0;
|
|
16702
|
+
});
|
|
16703
|
+
return crashed;
|
|
16704
|
+
}
|
|
16705
|
+
function buildHealthStatus(agent, thresholdMs) {
|
|
16706
|
+
const lastHeartbeatMs = new Date(agent.lastHeartbeat).getTime();
|
|
16707
|
+
const heartbeatAgeMs = Date.now() - lastHeartbeatMs;
|
|
16708
|
+
const stale = ALIVE_STATUSES.includes(agent.status) ? heartbeatAgeMs > thresholdMs : false;
|
|
16709
|
+
const healthy = !stale && ALIVE_STATUSES.includes(agent.status);
|
|
16710
|
+
return {
|
|
16711
|
+
agentId: agent.id,
|
|
16712
|
+
status: agent.status,
|
|
16713
|
+
lastHeartbeat: agent.lastHeartbeat,
|
|
16714
|
+
heartbeatAgeMs,
|
|
16715
|
+
healthy,
|
|
16716
|
+
stale,
|
|
16717
|
+
thresholdMs
|
|
16718
|
+
};
|
|
16719
|
+
}
|
|
16720
|
+
var HEARTBEAT_INTERVAL_MS, STALE_THRESHOLD_MS, ALIVE_STATUSES;
|
|
16721
|
+
var init_health_monitor = __esm({
|
|
16722
|
+
"packages/core/src/agents/health-monitor.ts"() {
|
|
16723
|
+
"use strict";
|
|
16724
|
+
init_registry2();
|
|
16725
|
+
HEARTBEAT_INTERVAL_MS = 3e4;
|
|
16726
|
+
STALE_THRESHOLD_MS = 3 * 6e4;
|
|
16727
|
+
ALIVE_STATUSES = ["starting", "active", "idle"];
|
|
16728
|
+
}
|
|
16729
|
+
});
|
|
16730
|
+
|
|
16566
16731
|
// packages/core/src/agents/retry.ts
|
|
16567
16732
|
function createRetryPolicy(overrides) {
|
|
16568
16733
|
return { ...DEFAULT_RETRY_POLICY, ...overrides };
|
|
@@ -16689,18 +16854,27 @@ __export(agents_exports, {
|
|
|
16689
16854
|
AGENT_INSTANCE_STATUSES: () => AGENT_INSTANCE_STATUSES,
|
|
16690
16855
|
AGENT_TYPES: () => AGENT_TYPES,
|
|
16691
16856
|
DEFAULT_RETRY_POLICY: () => DEFAULT_RETRY_POLICY,
|
|
16857
|
+
HEARTBEAT_INTERVAL_MS: () => HEARTBEAT_INTERVAL_MS,
|
|
16858
|
+
MAX_TASKS_PER_AGENT: () => MAX_TASKS_PER_AGENT,
|
|
16859
|
+
STALE_THRESHOLD_MS: () => STALE_THRESHOLD_MS,
|
|
16692
16860
|
agentErrorLog: () => agentErrorLog,
|
|
16693
16861
|
agentInstances: () => agentInstances,
|
|
16694
16862
|
calculateDelay: () => calculateDelay,
|
|
16695
|
-
checkAgentHealth: () =>
|
|
16863
|
+
checkAgentHealth: () => checkAgentHealth2,
|
|
16696
16864
|
classifyError: () => classifyError,
|
|
16697
16865
|
createRetryPolicy: () => createRetryPolicy,
|
|
16698
16866
|
deregisterAgent: () => deregisterAgent,
|
|
16867
|
+
detectCrashedAgents: () => detectCrashedAgents,
|
|
16868
|
+
detectStaleAgents: () => detectStaleAgents,
|
|
16699
16869
|
findLeastLoadedAgent: () => findLeastLoadedAgent,
|
|
16870
|
+
findStaleAgentRows: () => checkAgentHealth,
|
|
16700
16871
|
generateAgentId: () => generateAgentId,
|
|
16872
|
+
getAgentCapacity: () => getAgentCapacity,
|
|
16701
16873
|
getAgentErrorHistory: () => getAgentErrorHistory,
|
|
16702
16874
|
getAgentInstance: () => getAgentInstance,
|
|
16703
16875
|
getAgentPerformanceHistory: () => getAgentPerformanceHistory,
|
|
16876
|
+
getAgentSpecializations: () => getAgentSpecializations,
|
|
16877
|
+
getAgentsByCapacity: () => getAgentsByCapacity,
|
|
16704
16878
|
getAvailableCapacity: () => getAvailableCapacity,
|
|
16705
16879
|
getCapacitySummary: () => getCapacitySummary,
|
|
16706
16880
|
getHealthReport: () => getHealthReport,
|
|
@@ -16712,11 +16886,14 @@ __export(agents_exports, {
|
|
|
16712
16886
|
markCrashed: () => markCrashed,
|
|
16713
16887
|
processAgentLifecycleEvent: () => processAgentLifecycleEvent,
|
|
16714
16888
|
recordAgentExecution: () => recordAgentExecution,
|
|
16889
|
+
recordAgentPerformance: () => recordAgentPerformance,
|
|
16715
16890
|
recordFailurePattern: () => recordFailurePattern,
|
|
16891
|
+
recordHeartbeat: () => recordHeartbeat,
|
|
16716
16892
|
recoverCrashedAgents: () => recoverCrashedAgents,
|
|
16717
16893
|
registerAgent: () => registerAgent,
|
|
16718
16894
|
shouldRetry: () => shouldRetry,
|
|
16719
16895
|
storeHealingStrategy: () => storeHealingStrategy,
|
|
16896
|
+
updateAgentSpecializations: () => updateAgentSpecializations,
|
|
16720
16897
|
updateAgentStatus: () => updateAgentStatus,
|
|
16721
16898
|
updateCapacity: () => updateCapacity,
|
|
16722
16899
|
withRetry: () => withRetry
|
|
@@ -16724,9 +16901,11 @@ __export(agents_exports, {
|
|
|
16724
16901
|
var init_agents = __esm({
|
|
16725
16902
|
"packages/core/src/agents/index.ts"() {
|
|
16726
16903
|
"use strict";
|
|
16904
|
+
init_agent_registry();
|
|
16727
16905
|
init_agent_schema();
|
|
16728
16906
|
init_capacity();
|
|
16729
16907
|
init_execution_learning();
|
|
16908
|
+
init_health_monitor();
|
|
16730
16909
|
init_registry2();
|
|
16731
16910
|
init_retry();
|
|
16732
16911
|
}
|
|
@@ -20598,19 +20777,19 @@ async function queryAudit(options) {
|
|
|
20598
20777
|
try {
|
|
20599
20778
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
20600
20779
|
const { auditLog: auditLog2 } = await Promise.resolve().then(() => (init_tasks_schema(), tasks_schema_exports));
|
|
20601
|
-
const { and:
|
|
20780
|
+
const { and: and12, eq: eq17, gte: gte4, or: or6 } = await import("drizzle-orm");
|
|
20602
20781
|
const db = await getDb4(process.cwd());
|
|
20603
20782
|
const conditions = [];
|
|
20604
|
-
if (options?.sessionId) conditions.push(
|
|
20605
|
-
if (options?.domain) conditions.push(
|
|
20783
|
+
if (options?.sessionId) conditions.push(eq17(auditLog2.sessionId, options.sessionId));
|
|
20784
|
+
if (options?.domain) conditions.push(eq17(auditLog2.domain, options.domain));
|
|
20606
20785
|
if (options?.operation)
|
|
20607
20786
|
conditions.push(
|
|
20608
|
-
or6(
|
|
20787
|
+
or6(eq17(auditLog2.operation, options.operation), eq17(auditLog2.action, options.operation))
|
|
20609
20788
|
);
|
|
20610
|
-
if (options?.taskId) conditions.push(
|
|
20789
|
+
if (options?.taskId) conditions.push(eq17(auditLog2.taskId, options.taskId));
|
|
20611
20790
|
if (options?.since) conditions.push(gte4(auditLog2.timestamp, options.since));
|
|
20612
20791
|
const limit = options?.limit ?? 1e3;
|
|
20613
|
-
const rows = await db.select().from(auditLog2).where(conditions.length > 0 ?
|
|
20792
|
+
const rows = await db.select().from(auditLog2).where(conditions.length > 0 ? and12(...conditions) : void 0).orderBy(auditLog2.timestamp).limit(limit);
|
|
20614
20793
|
return rows.map((row) => ({
|
|
20615
20794
|
timestamp: row.timestamp,
|
|
20616
20795
|
sessionId: row.sessionId,
|
|
@@ -34355,6 +34534,116 @@ function generateRecommendation2(changeType, affectedCount, cascadeDepth, taskId
|
|
|
34355
34534
|
return `${severity} impact: reprioritizing ${taskId} may reorder ${affectedCount} downstream task(s) across ${cascadeDepth} level(s) of dependencies.`;
|
|
34356
34535
|
}
|
|
34357
34536
|
}
|
|
34537
|
+
function scoreTaskMatch(change, task) {
|
|
34538
|
+
const STOP_WORDS3 = /* @__PURE__ */ new Set([
|
|
34539
|
+
"a",
|
|
34540
|
+
"an",
|
|
34541
|
+
"the",
|
|
34542
|
+
"and",
|
|
34543
|
+
"or",
|
|
34544
|
+
"in",
|
|
34545
|
+
"of",
|
|
34546
|
+
"to",
|
|
34547
|
+
"for",
|
|
34548
|
+
"with",
|
|
34549
|
+
"on",
|
|
34550
|
+
"at",
|
|
34551
|
+
"by",
|
|
34552
|
+
"is",
|
|
34553
|
+
"it",
|
|
34554
|
+
"be",
|
|
34555
|
+
"as",
|
|
34556
|
+
"if",
|
|
34557
|
+
"do",
|
|
34558
|
+
"not"
|
|
34559
|
+
]);
|
|
34560
|
+
const tokenise = (text3) => text3.toLowerCase().split(/\W+/).filter((t) => t.length > 2 && !STOP_WORDS3.has(t));
|
|
34561
|
+
const changeTokens = new Set(tokenise(change));
|
|
34562
|
+
if (changeTokens.size === 0) return 0;
|
|
34563
|
+
const taskText = `${task.title ?? ""} ${task.description ?? ""}`;
|
|
34564
|
+
const taskTokens = new Set(tokenise(taskText));
|
|
34565
|
+
let matches = 0;
|
|
34566
|
+
for (const token of changeTokens) {
|
|
34567
|
+
if (taskTokens.has(token)) matches++;
|
|
34568
|
+
}
|
|
34569
|
+
return matches / changeTokens.size;
|
|
34570
|
+
}
|
|
34571
|
+
async function predictImpact(change, cwd, accessor, matchLimit = 5) {
|
|
34572
|
+
const acc = accessor ?? await getAccessor(cwd);
|
|
34573
|
+
const tasks2 = await loadAllTasks2(acc);
|
|
34574
|
+
const taskMap = new Map(tasks2.map((t) => [t.id, t]));
|
|
34575
|
+
const dependentsMap = buildDependentsMap(tasks2);
|
|
34576
|
+
const scored = tasks2.map((t) => ({ task: t, score: scoreTaskMatch(change, t) })).filter(({ score }) => score > 0).sort((a, b) => b.score - a.score);
|
|
34577
|
+
const seeds = scored.slice(0, matchLimit).map(({ task }) => task);
|
|
34578
|
+
if (seeds.length === 0) {
|
|
34579
|
+
return {
|
|
34580
|
+
change,
|
|
34581
|
+
matchedTasks: [],
|
|
34582
|
+
affectedTasks: [],
|
|
34583
|
+
totalAffected: 0,
|
|
34584
|
+
summary: `No tasks matched the change description "${change}".`
|
|
34585
|
+
};
|
|
34586
|
+
}
|
|
34587
|
+
const directMatchIds = new Set(seeds.map((t) => t.id));
|
|
34588
|
+
const exposureMap = /* @__PURE__ */ new Map();
|
|
34589
|
+
for (const id of directMatchIds) {
|
|
34590
|
+
exposureMap.set(id, "direct");
|
|
34591
|
+
}
|
|
34592
|
+
for (const seed of seeds) {
|
|
34593
|
+
const transitive = collectTransitiveDependents(seed.id, dependentsMap);
|
|
34594
|
+
for (const depId of transitive) {
|
|
34595
|
+
if (!exposureMap.has(depId)) {
|
|
34596
|
+
const isDirectDependent = (dependentsMap.get(seed.id) ?? /* @__PURE__ */ new Set()).has(depId);
|
|
34597
|
+
exposureMap.set(depId, isDirectDependent ? "dependent" : "transitive");
|
|
34598
|
+
}
|
|
34599
|
+
}
|
|
34600
|
+
}
|
|
34601
|
+
const EXPOSURE_ORDER = {
|
|
34602
|
+
direct: 0,
|
|
34603
|
+
dependent: 1,
|
|
34604
|
+
transitive: 2
|
|
34605
|
+
};
|
|
34606
|
+
const affectedTasks = [];
|
|
34607
|
+
for (const [id, exposure] of exposureMap) {
|
|
34608
|
+
const task = taskMap.get(id);
|
|
34609
|
+
if (!task) continue;
|
|
34610
|
+
const downstreamTransitive = collectTransitiveDependents(id, dependentsMap);
|
|
34611
|
+
const downstreamCount = downstreamTransitive.size;
|
|
34612
|
+
let reason;
|
|
34613
|
+
if (exposure === "direct") {
|
|
34614
|
+
reason = `Task title/description matched "${change}".`;
|
|
34615
|
+
} else if (exposure === "dependent") {
|
|
34616
|
+
const seedNames = seeds.filter((s) => (dependentsMap.get(s.id) ?? /* @__PURE__ */ new Set()).has(id)).map((s) => s.id).join(", ");
|
|
34617
|
+
reason = `Directly depends on matched task(s): ${seedNames}.`;
|
|
34618
|
+
} else {
|
|
34619
|
+
reason = "Downstream of a matched task via transitive dependency chain.";
|
|
34620
|
+
}
|
|
34621
|
+
affectedTasks.push({
|
|
34622
|
+
id,
|
|
34623
|
+
title: task.title,
|
|
34624
|
+
status: task.status,
|
|
34625
|
+
priority: task.priority,
|
|
34626
|
+
exposure,
|
|
34627
|
+
downstreamCount,
|
|
34628
|
+
reason
|
|
34629
|
+
});
|
|
34630
|
+
}
|
|
34631
|
+
affectedTasks.sort((a, b) => {
|
|
34632
|
+
const expDiff = EXPOSURE_ORDER[a.exposure] - EXPOSURE_ORDER[b.exposure];
|
|
34633
|
+
if (expDiff !== 0) return expDiff;
|
|
34634
|
+
return b.downstreamCount - a.downstreamCount;
|
|
34635
|
+
});
|
|
34636
|
+
const matchedTasks = affectedTasks.filter((t) => t.exposure === "direct");
|
|
34637
|
+
const totalAffected = affectedTasks.length;
|
|
34638
|
+
const summary = matchedTasks.length === 0 ? `No tasks matched "${change}".` : `${matchedTasks.length} task(s) matched "${change}"; ${totalAffected} total task(s) affected (including downstream).`;
|
|
34639
|
+
return {
|
|
34640
|
+
change,
|
|
34641
|
+
matchedTasks,
|
|
34642
|
+
affectedTasks,
|
|
34643
|
+
totalAffected,
|
|
34644
|
+
summary
|
|
34645
|
+
};
|
|
34646
|
+
}
|
|
34358
34647
|
var init_impact = __esm({
|
|
34359
34648
|
"packages/core/src/intelligence/impact.ts"() {
|
|
34360
34649
|
"use strict";
|
|
@@ -34758,6 +35047,7 @@ __export(intelligence_exports, {
|
|
|
34758
35047
|
gatherLearningContext: () => gatherLearningContext,
|
|
34759
35048
|
matchPatterns: () => matchPatterns,
|
|
34760
35049
|
predictAndStore: () => predictAndStore,
|
|
35050
|
+
predictImpact: () => predictImpact,
|
|
34761
35051
|
predictValidationOutcome: () => predictValidationOutcome,
|
|
34762
35052
|
scoreVerificationConfidence: () => scoreVerificationConfidence,
|
|
34763
35053
|
storeDetectedPattern: () => storeDetectedPattern,
|
|
@@ -36506,13 +36796,13 @@ function extractYamlArray(content, field) {
|
|
|
36506
36796
|
}
|
|
36507
36797
|
const lines = content.split("\n");
|
|
36508
36798
|
const items = [];
|
|
36509
|
-
let
|
|
36799
|
+
let inArray7 = false;
|
|
36510
36800
|
for (const line2 of lines) {
|
|
36511
36801
|
if (line2.match(new RegExp(`^${field}:`))) {
|
|
36512
|
-
|
|
36802
|
+
inArray7 = true;
|
|
36513
36803
|
continue;
|
|
36514
36804
|
}
|
|
36515
|
-
if (
|
|
36805
|
+
if (inArray7) {
|
|
36516
36806
|
const itemMatch = line2.match(/^\s+-\s+["']?(.+?)["']?\s*$/);
|
|
36517
36807
|
if (itemMatch) {
|
|
36518
36808
|
items.push(itemMatch[1].trim());
|
|
@@ -36808,6 +37098,71 @@ var init_issue = __esm({
|
|
|
36808
37098
|
}
|
|
36809
37099
|
});
|
|
36810
37100
|
|
|
37101
|
+
// packages/core/src/lib/retry.ts
|
|
37102
|
+
async function withRetry2(fn, options) {
|
|
37103
|
+
const maxAttempts = options?.maxAttempts ?? 3;
|
|
37104
|
+
const baseDelayMs = options?.baseDelayMs ?? 2e3;
|
|
37105
|
+
const maxDelayMs = options?.maxDelayMs ?? 3e4;
|
|
37106
|
+
const retryableErrors = options?.retryableErrors;
|
|
37107
|
+
let lastError;
|
|
37108
|
+
let totalDelayMs = 0;
|
|
37109
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
37110
|
+
try {
|
|
37111
|
+
return await fn();
|
|
37112
|
+
} catch (err) {
|
|
37113
|
+
lastError = err;
|
|
37114
|
+
const isLastAttempt = attempt === maxAttempts;
|
|
37115
|
+
if (isLastAttempt) break;
|
|
37116
|
+
if (retryableErrors !== void 0 && !isRetryable(err, retryableErrors)) break;
|
|
37117
|
+
const delay = computeDelay(attempt, baseDelayMs, maxDelayMs);
|
|
37118
|
+
totalDelayMs += delay;
|
|
37119
|
+
await sleep2(delay);
|
|
37120
|
+
}
|
|
37121
|
+
}
|
|
37122
|
+
const context = { attempts: maxAttempts, totalDelayMs };
|
|
37123
|
+
augmentError(lastError, context);
|
|
37124
|
+
throw lastError;
|
|
37125
|
+
}
|
|
37126
|
+
function computeDelay(attempt, baseDelayMs, maxDelayMs) {
|
|
37127
|
+
const exponential = baseDelayMs * 2 ** (attempt - 1);
|
|
37128
|
+
return Math.min(exponential, maxDelayMs);
|
|
37129
|
+
}
|
|
37130
|
+
function isRetryable(err, predicates) {
|
|
37131
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
37132
|
+
return predicates.some((predicate) => {
|
|
37133
|
+
if (predicate instanceof RegExp) return predicate.test(message);
|
|
37134
|
+
return predicate(err);
|
|
37135
|
+
});
|
|
37136
|
+
}
|
|
37137
|
+
function augmentError(err, context) {
|
|
37138
|
+
if (err instanceof Error) {
|
|
37139
|
+
const mutableErr = err;
|
|
37140
|
+
mutableErr.attempts = context.attempts;
|
|
37141
|
+
mutableErr.totalDelayMs = context.totalDelayMs;
|
|
37142
|
+
}
|
|
37143
|
+
}
|
|
37144
|
+
function sleep2(ms) {
|
|
37145
|
+
return new Promise((resolve13) => setTimeout(resolve13, ms));
|
|
37146
|
+
}
|
|
37147
|
+
var init_retry2 = __esm({
|
|
37148
|
+
"packages/core/src/lib/retry.ts"() {
|
|
37149
|
+
"use strict";
|
|
37150
|
+
}
|
|
37151
|
+
});
|
|
37152
|
+
|
|
37153
|
+
// packages/core/src/lib/index.ts
|
|
37154
|
+
var lib_exports = {};
|
|
37155
|
+
__export(lib_exports, {
|
|
37156
|
+
computeDelay: () => computeDelay,
|
|
37157
|
+
withRetry: () => withRetry2
|
|
37158
|
+
});
|
|
37159
|
+
var init_lib = __esm({
|
|
37160
|
+
"packages/core/src/lib/index.ts"() {
|
|
37161
|
+
"use strict";
|
|
37162
|
+
init_retry2();
|
|
37163
|
+
}
|
|
37164
|
+
});
|
|
37165
|
+
|
|
36811
37166
|
// packages/core/src/lifecycle/evidence.ts
|
|
36812
37167
|
import { basename as basename5, relative as relative2 } from "node:path";
|
|
36813
37168
|
async function recordEvidence(epicId, stage, uri, type, options) {
|
|
@@ -37647,12 +38002,12 @@ async function getEnforcementMode(cwd) {
|
|
|
37647
38002
|
}
|
|
37648
38003
|
async function getLifecycleStatus(epicId, cwd) {
|
|
37649
38004
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
37650
|
-
const { eq:
|
|
38005
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
37651
38006
|
const db = await getDb4(cwd);
|
|
37652
38007
|
const pipelineResult = await db.select({
|
|
37653
38008
|
pipeline: lifecyclePipelines,
|
|
37654
38009
|
task: tasks
|
|
37655
|
-
}).from(lifecyclePipelines).innerJoin(tasks,
|
|
38010
|
+
}).from(lifecyclePipelines).innerJoin(tasks, eq17(lifecyclePipelines.taskId, tasks.id)).where(eq17(lifecyclePipelines.taskId, epicId)).limit(1);
|
|
37656
38011
|
if (pipelineResult.length === 0) {
|
|
37657
38012
|
return {
|
|
37658
38013
|
epicId,
|
|
@@ -37665,7 +38020,7 @@ async function getLifecycleStatus(epicId, cwd) {
|
|
|
37665
38020
|
}
|
|
37666
38021
|
const task = pipelineResult[0].task;
|
|
37667
38022
|
const pipelineId = `pipeline-${epicId}`;
|
|
37668
|
-
const stageRows = await db.select().from(lifecycleStages).where(
|
|
38023
|
+
const stageRows = await db.select().from(lifecycleStages).where(eq17(lifecycleStages.pipelineId, pipelineId)).orderBy(lifecycleStages.sequence);
|
|
37669
38024
|
const stageDataMap = /* @__PURE__ */ new Map();
|
|
37670
38025
|
for (const row of stageRows) {
|
|
37671
38026
|
let parsedChain;
|
|
@@ -37734,10 +38089,10 @@ async function getLifecycleStatus(epicId, cwd) {
|
|
|
37734
38089
|
}
|
|
37735
38090
|
async function getLifecycleHistory(epicId, cwd) {
|
|
37736
38091
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
37737
|
-
const { eq:
|
|
38092
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
37738
38093
|
const db = await getDb4(cwd);
|
|
37739
38094
|
const pipelineId = `pipeline-${epicId}`;
|
|
37740
|
-
const stages = await db.select().from(lifecycleStages).where(
|
|
38095
|
+
const stages = await db.select().from(lifecycleStages).where(eq17(lifecycleStages.pipelineId, pipelineId));
|
|
37741
38096
|
if (stages.length === 0) {
|
|
37742
38097
|
return { epicId, history: [] };
|
|
37743
38098
|
}
|
|
@@ -37767,7 +38122,7 @@ async function getLifecycleHistory(epicId, cwd) {
|
|
|
37767
38122
|
}
|
|
37768
38123
|
const stageIds = stages.map((s) => s.id);
|
|
37769
38124
|
if (stageIds.length > 0) {
|
|
37770
|
-
const gateResults = await db.select().from(lifecycleGateResults).where(
|
|
38125
|
+
const gateResults = await db.select().from(lifecycleGateResults).where(eq17(lifecycleGateResults.stageId, stageIds[0]));
|
|
37771
38126
|
for (const gate of gateResults) {
|
|
37772
38127
|
const stageName = stageIdToName.get(gate.stageId);
|
|
37773
38128
|
if (stageName) {
|
|
@@ -37780,7 +38135,7 @@ async function getLifecycleHistory(epicId, cwd) {
|
|
|
37780
38135
|
}
|
|
37781
38136
|
}
|
|
37782
38137
|
for (let i = 1; i < stageIds.length; i++) {
|
|
37783
|
-
const additionalGates = await db.select().from(lifecycleGateResults).where(
|
|
38138
|
+
const additionalGates = await db.select().from(lifecycleGateResults).where(eq17(lifecycleGateResults.stageId, stageIds[i]));
|
|
37784
38139
|
for (const gate of additionalGates) {
|
|
37785
38140
|
const stageName = stageIdToName.get(gate.stageId);
|
|
37786
38141
|
if (stageName) {
|
|
@@ -37799,16 +38154,16 @@ async function getLifecycleHistory(epicId, cwd) {
|
|
|
37799
38154
|
}
|
|
37800
38155
|
async function getLifecycleGates(epicId, cwd) {
|
|
37801
38156
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
37802
|
-
const { eq:
|
|
38157
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
37803
38158
|
const db = await getDb4(cwd);
|
|
37804
38159
|
const pipelineId = `pipeline-${epicId}`;
|
|
37805
|
-
const stages = await db.select().from(lifecycleStages).where(
|
|
38160
|
+
const stages = await db.select().from(lifecycleStages).where(eq17(lifecycleStages.pipelineId, pipelineId));
|
|
37806
38161
|
if (stages.length === 0) {
|
|
37807
38162
|
return {};
|
|
37808
38163
|
}
|
|
37809
38164
|
const gates = {};
|
|
37810
38165
|
for (const stage of stages) {
|
|
37811
|
-
const gateRows = await db.select().from(lifecycleGateResults).where(
|
|
38166
|
+
const gateRows = await db.select().from(lifecycleGateResults).where(eq17(lifecycleGateResults.stageId, stage.id));
|
|
37812
38167
|
if (gateRows.length > 0) {
|
|
37813
38168
|
gates[stage.stageName] = {};
|
|
37814
38169
|
for (const gateRow of gateRows) {
|
|
@@ -37872,7 +38227,7 @@ async function checkStagePrerequisites(epicId, targetStage, cwd) {
|
|
|
37872
38227
|
}
|
|
37873
38228
|
async function ensureLifecycleContext(epicId, stageName, cwd, options) {
|
|
37874
38229
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
37875
|
-
const { eq:
|
|
38230
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
37876
38231
|
const db = await getDb4(cwd);
|
|
37877
38232
|
const pipelineId = `pipeline-${epicId}`;
|
|
37878
38233
|
const stageId = `stage-${epicId}-${stageName}`;
|
|
@@ -37880,7 +38235,7 @@ async function ensureLifecycleContext(epicId, stageName, cwd, options) {
|
|
|
37880
38235
|
getNativeDb3().prepare(
|
|
37881
38236
|
`INSERT OR IGNORE INTO tasks (id, title, status, priority, created_at) VALUES (?, ?, 'pending', 'medium', datetime('now'))`
|
|
37882
38237
|
).run(epicId, `Task ${epicId}`);
|
|
37883
|
-
const existingPipeline = await db.select().from(lifecyclePipelines).where(
|
|
38238
|
+
const existingPipeline = await db.select().from(lifecyclePipelines).where(eq17(lifecyclePipelines.id, pipelineId)).limit(1).all();
|
|
37884
38239
|
if (existingPipeline.length === 0) {
|
|
37885
38240
|
await db.insert(lifecyclePipelines).values({
|
|
37886
38241
|
id: pipelineId,
|
|
@@ -37890,7 +38245,7 @@ async function ensureLifecycleContext(epicId, stageName, cwd, options) {
|
|
|
37890
38245
|
startedAt: options.now
|
|
37891
38246
|
}).run();
|
|
37892
38247
|
}
|
|
37893
|
-
const existingStage = await db.select().from(lifecycleStages).where(
|
|
38248
|
+
const existingStage = await db.select().from(lifecycleStages).where(eq17(lifecycleStages.id, stageId)).limit(1).all();
|
|
37894
38249
|
if (existingStage.length === 0) {
|
|
37895
38250
|
const sequence = isValidStage(stageName) ? STAGE_ORDER[stageName] : 0;
|
|
37896
38251
|
await db.insert(lifecycleStages).values({
|
|
@@ -37903,7 +38258,7 @@ async function ensureLifecycleContext(epicId, stageName, cwd, options) {
|
|
|
37903
38258
|
}).run();
|
|
37904
38259
|
}
|
|
37905
38260
|
if (options.updateCurrentStage) {
|
|
37906
|
-
await db.update(lifecyclePipelines).set({ currentStageId: stageId }).where(
|
|
38261
|
+
await db.update(lifecyclePipelines).set({ currentStageId: stageId }).where(eq17(lifecyclePipelines.id, pipelineId)).run();
|
|
37907
38262
|
}
|
|
37908
38263
|
return { db, pipelineId, stageId };
|
|
37909
38264
|
}
|
|
@@ -37918,7 +38273,7 @@ async function recordStageProgress(epicId, stage, status, notes, cwd) {
|
|
|
37918
38273
|
`Invalid status: ${status}. Valid: ${validStatuses.join(", ")}`
|
|
37919
38274
|
);
|
|
37920
38275
|
}
|
|
37921
|
-
const { eq:
|
|
38276
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
37922
38277
|
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
37923
38278
|
const stageName = stage;
|
|
37924
38279
|
const { db, stageId, pipelineId } = await ensureLifecycleContext(epicId, stage, cwd, {
|
|
@@ -37934,7 +38289,7 @@ async function recordStageProgress(epicId, stage, status, notes, cwd) {
|
|
|
37934
38289
|
status,
|
|
37935
38290
|
related: artifact.related
|
|
37936
38291
|
};
|
|
37937
|
-
const existingStage = await db.select().from(lifecycleStages).where(
|
|
38292
|
+
const existingStage = await db.select().from(lifecycleStages).where(eq17(lifecycleStages.id, stageId)).limit(1).all();
|
|
37938
38293
|
const sequence = STAGE_ORDER[stage];
|
|
37939
38294
|
const stageValues = {
|
|
37940
38295
|
status,
|
|
@@ -37961,7 +38316,7 @@ async function recordStageProgress(epicId, stage, status, notes, cwd) {
|
|
|
37961
38316
|
provenanceChainJson: JSON.stringify(provenanceChain)
|
|
37962
38317
|
}).run();
|
|
37963
38318
|
} else {
|
|
37964
|
-
await db.update(lifecycleStages).set(stageValues).where(
|
|
38319
|
+
await db.update(lifecycleStages).set(stageValues).where(eq17(lifecycleStages.id, stageId)).run();
|
|
37965
38320
|
}
|
|
37966
38321
|
if (status === "completed") {
|
|
37967
38322
|
await linkProvenance(epicId, stageName, artifact.absolutePath, cwd);
|
|
@@ -37981,7 +38336,7 @@ async function resetStage(epicId, stage, reason, cwd) {
|
|
|
37981
38336
|
if (!PIPELINE_STAGES.includes(stage)) {
|
|
37982
38337
|
throw new CleoError(2 /* INVALID_INPUT */, `Invalid stage: ${stage}`);
|
|
37983
38338
|
}
|
|
37984
|
-
const { eq:
|
|
38339
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
37985
38340
|
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
37986
38341
|
const { db, stageId } = await ensureLifecycleContext(epicId, stage, cwd, {
|
|
37987
38342
|
now: now2,
|
|
@@ -37994,11 +38349,11 @@ async function resetStage(epicId, stage, reason, cwd) {
|
|
|
37994
38349
|
skippedAt: null,
|
|
37995
38350
|
skipReason: null,
|
|
37996
38351
|
notesJson: JSON.stringify([`Reset: ${reason}`])
|
|
37997
|
-
}).where(
|
|
38352
|
+
}).where(eq17(lifecycleStages.id, stageId)).run();
|
|
37998
38353
|
return { epicId, stage, reason };
|
|
37999
38354
|
}
|
|
38000
38355
|
async function passGate(epicId, gateName, agent, notes, cwd) {
|
|
38001
|
-
const { eq:
|
|
38356
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
38002
38357
|
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
38003
38358
|
const stageName = gateName.split("-")[0];
|
|
38004
38359
|
const gateId = `gate-${epicId}-${stageName}-${gateName}`;
|
|
@@ -38007,7 +38362,7 @@ async function passGate(epicId, gateName, agent, notes, cwd) {
|
|
|
38007
38362
|
stageStatusOnCreate: "in_progress",
|
|
38008
38363
|
updateCurrentStage: true
|
|
38009
38364
|
});
|
|
38010
|
-
const existingGate = await db.select().from(lifecycleGateResults).where(
|
|
38365
|
+
const existingGate = await db.select().from(lifecycleGateResults).where(eq17(lifecycleGateResults.id, gateId)).limit(1).all();
|
|
38011
38366
|
const gateValues = {
|
|
38012
38367
|
id: gateId,
|
|
38013
38368
|
stageId,
|
|
@@ -38019,14 +38374,14 @@ async function passGate(epicId, gateName, agent, notes, cwd) {
|
|
|
38019
38374
|
reason: null
|
|
38020
38375
|
};
|
|
38021
38376
|
if (existingGate.length > 0) {
|
|
38022
|
-
await db.update(lifecycleGateResults).set(gateValues).where(
|
|
38377
|
+
await db.update(lifecycleGateResults).set(gateValues).where(eq17(lifecycleGateResults.id, gateId)).run();
|
|
38023
38378
|
} else {
|
|
38024
38379
|
await db.insert(lifecycleGateResults).values(gateValues).run();
|
|
38025
38380
|
}
|
|
38026
38381
|
return { epicId, gateName, timestamp: now2 };
|
|
38027
38382
|
}
|
|
38028
38383
|
async function failGate(epicId, gateName, reason, cwd) {
|
|
38029
|
-
const { eq:
|
|
38384
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
38030
38385
|
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
38031
38386
|
const stageName = gateName.split("-")[0];
|
|
38032
38387
|
const gateId = `gate-${epicId}-${stageName}-${gateName}`;
|
|
@@ -38035,7 +38390,7 @@ async function failGate(epicId, gateName, reason, cwd) {
|
|
|
38035
38390
|
stageStatusOnCreate: "in_progress",
|
|
38036
38391
|
updateCurrentStage: true
|
|
38037
38392
|
});
|
|
38038
|
-
const existingGate = await db.select().from(lifecycleGateResults).where(
|
|
38393
|
+
const existingGate = await db.select().from(lifecycleGateResults).where(eq17(lifecycleGateResults.id, gateId)).limit(1).all();
|
|
38039
38394
|
const gateValues = {
|
|
38040
38395
|
id: gateId,
|
|
38041
38396
|
stageId,
|
|
@@ -38047,7 +38402,7 @@ async function failGate(epicId, gateName, reason, cwd) {
|
|
|
38047
38402
|
reason: reason ?? null
|
|
38048
38403
|
};
|
|
38049
38404
|
if (existingGate.length > 0) {
|
|
38050
|
-
await db.update(lifecycleGateResults).set(gateValues).where(
|
|
38405
|
+
await db.update(lifecycleGateResults).set(gateValues).where(eq17(lifecycleGateResults.id, gateId)).run();
|
|
38051
38406
|
} else {
|
|
38052
38407
|
await db.insert(lifecycleGateResults).values(gateValues).run();
|
|
38053
38408
|
}
|
|
@@ -38121,8 +38476,8 @@ function detectEnvMode() {
|
|
|
38121
38476
|
const devKv = {};
|
|
38122
38477
|
const devLines = devContent.trim().split("\n");
|
|
38123
38478
|
for (let i = 1; i < devLines.length; i++) {
|
|
38124
|
-
const
|
|
38125
|
-
if (
|
|
38479
|
+
const eq17 = devLines[i].indexOf("=");
|
|
38480
|
+
if (eq17 > 0) devKv[devLines[i].slice(0, eq17).trim()] = devLines[i].slice(eq17 + 1).trim();
|
|
38126
38481
|
}
|
|
38127
38482
|
if (devKv["mode"] === "dev-ts" && devKv["source"]) {
|
|
38128
38483
|
const devSource = devKv["source"].replace(/\\/g, "/");
|
|
@@ -38435,7 +38790,7 @@ var init_config = __esm({
|
|
|
38435
38790
|
"session.autoStart": false,
|
|
38436
38791
|
"session.requireNotes": true,
|
|
38437
38792
|
"session.multiSession": false,
|
|
38438
|
-
"
|
|
38793
|
+
"enforcement.acceptance.mode": "block",
|
|
38439
38794
|
"lifecycle.mode": "strict"
|
|
38440
38795
|
}
|
|
38441
38796
|
},
|
|
@@ -38445,7 +38800,7 @@ var init_config = __esm({
|
|
|
38445
38800
|
"session.autoStart": false,
|
|
38446
38801
|
"session.requireNotes": false,
|
|
38447
38802
|
"session.multiSession": true,
|
|
38448
|
-
"
|
|
38803
|
+
"enforcement.acceptance.mode": "warn",
|
|
38449
38804
|
"lifecycle.mode": "advisory"
|
|
38450
38805
|
}
|
|
38451
38806
|
},
|
|
@@ -38455,7 +38810,7 @@ var init_config = __esm({
|
|
|
38455
38810
|
"session.autoStart": false,
|
|
38456
38811
|
"session.requireNotes": false,
|
|
38457
38812
|
"session.multiSession": true,
|
|
38458
|
-
"
|
|
38813
|
+
"enforcement.acceptance.mode": "off",
|
|
38459
38814
|
"lifecycle.mode": "off"
|
|
38460
38815
|
}
|
|
38461
38816
|
}
|
|
@@ -38834,13 +39189,13 @@ __export(pipeline_exports, {
|
|
|
38834
39189
|
listPipelines: () => listPipelines,
|
|
38835
39190
|
pipelineExists: () => pipelineExists
|
|
38836
39191
|
});
|
|
38837
|
-
import { and as
|
|
39192
|
+
import { and as and6, asc as asc3, desc as desc3, eq as eq9, sql as sql9 } from "drizzle-orm";
|
|
38838
39193
|
async function initializePipeline(taskId, options = {}) {
|
|
38839
39194
|
const db = await getDb();
|
|
38840
39195
|
const now2 = /* @__PURE__ */ new Date();
|
|
38841
39196
|
const startStage2 = options.startStage || "research";
|
|
38842
39197
|
const initialStatus = options.initialStatus || "active";
|
|
38843
|
-
const existing = await db.select().from(lifecyclePipelines).where(
|
|
39198
|
+
const existing = await db.select().from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
|
|
38844
39199
|
if (existing.length > 0) {
|
|
38845
39200
|
throw new CleoError(101 /* ALREADY_EXISTS */, `Pipeline already exists for task ${taskId}`);
|
|
38846
39201
|
}
|
|
@@ -38889,13 +39244,13 @@ async function initializePipeline(taskId, options = {}) {
|
|
|
38889
39244
|
}
|
|
38890
39245
|
async function getPipeline(taskId) {
|
|
38891
39246
|
const db = await getDb();
|
|
38892
|
-
const result = await db.select().from(lifecyclePipelines).where(
|
|
39247
|
+
const result = await db.select().from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
|
|
38893
39248
|
if (result.length === 0) {
|
|
38894
39249
|
return null;
|
|
38895
39250
|
}
|
|
38896
39251
|
const row = result[0];
|
|
38897
39252
|
const isActive = row.status === "active";
|
|
38898
|
-
const transitionResult = await db.select({ count: sql9`count(*)` }).from(lifecycleTransitions).where(
|
|
39253
|
+
const transitionResult = await db.select({ count: sql9`count(*)` }).from(lifecycleTransitions).where(eq9(lifecycleTransitions.pipelineId, row.id)).all();
|
|
38899
39254
|
const transitionCount = Number(transitionResult[0]?.count || 0);
|
|
38900
39255
|
return {
|
|
38901
39256
|
id: taskId,
|
|
@@ -38918,7 +39273,7 @@ async function advanceStage(taskId, options) {
|
|
|
38918
39273
|
if (!options.initiatedBy) {
|
|
38919
39274
|
throw new CleoError(2 /* INVALID_INPUT */, "advanceStage() requires initiatedBy agent/user");
|
|
38920
39275
|
}
|
|
38921
|
-
const pipelineResult = await db.select().from(lifecyclePipelines).where(
|
|
39276
|
+
const pipelineResult = await db.select().from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
|
|
38922
39277
|
if (pipelineResult.length === 0) {
|
|
38923
39278
|
throw new CleoError(4 /* NOT_FOUND */, `No pipeline found for task ${taskId}`);
|
|
38924
39279
|
}
|
|
@@ -38926,9 +39281,9 @@ async function advanceStage(taskId, options) {
|
|
|
38926
39281
|
const fromStage = pipeline2.currentStageId;
|
|
38927
39282
|
const toStage = options.toStage;
|
|
38928
39283
|
const currentStageResult = await db.select().from(lifecycleStages).where(
|
|
38929
|
-
|
|
38930
|
-
|
|
38931
|
-
|
|
39284
|
+
and6(
|
|
39285
|
+
eq9(lifecycleStages.pipelineId, pipeline2.id),
|
|
39286
|
+
eq9(lifecycleStages.stageName, fromStage)
|
|
38932
39287
|
)
|
|
38933
39288
|
).limit(1).all();
|
|
38934
39289
|
if (currentStageResult.length === 0) {
|
|
@@ -38939,9 +39294,9 @@ async function advanceStage(taskId, options) {
|
|
|
38939
39294
|
}
|
|
38940
39295
|
const currentStageRecord = currentStageResult[0];
|
|
38941
39296
|
const targetStageResult = await db.select().from(lifecycleStages).where(
|
|
38942
|
-
|
|
38943
|
-
|
|
38944
|
-
|
|
39297
|
+
and6(
|
|
39298
|
+
eq9(lifecycleStages.pipelineId, pipeline2.id),
|
|
39299
|
+
eq9(lifecycleStages.stageName, toStage)
|
|
38945
39300
|
)
|
|
38946
39301
|
).limit(1).all();
|
|
38947
39302
|
if (targetStageResult.length === 0) {
|
|
@@ -38954,14 +39309,14 @@ async function advanceStage(taskId, options) {
|
|
|
38954
39309
|
await db.update(lifecycleStages).set({
|
|
38955
39310
|
status: "completed",
|
|
38956
39311
|
completedAt: now2.toISOString()
|
|
38957
|
-
}).where(
|
|
39312
|
+
}).where(eq9(lifecycleStages.id, currentStageRecord.id)).run();
|
|
38958
39313
|
await db.update(lifecycleStages).set({
|
|
38959
39314
|
status: "in_progress",
|
|
38960
39315
|
startedAt: now2.toISOString()
|
|
38961
|
-
}).where(
|
|
39316
|
+
}).where(eq9(lifecycleStages.id, targetStageRecord.id)).run();
|
|
38962
39317
|
await db.update(lifecyclePipelines).set({
|
|
38963
39318
|
currentStageId: toStage
|
|
38964
|
-
}).where(
|
|
39319
|
+
}).where(eq9(lifecyclePipelines.id, pipeline2.id)).run();
|
|
38965
39320
|
await db.insert(lifecycleTransitions).values({
|
|
38966
39321
|
id: `${pipeline2.id}_${now2.getTime()}_${Math.random().toString(36).slice(2, 7)}`,
|
|
38967
39322
|
pipelineId: pipeline2.id,
|
|
@@ -38978,7 +39333,7 @@ async function advanceStage(taskId, options) {
|
|
|
38978
39333
|
}
|
|
38979
39334
|
async function getCurrentStage(taskId) {
|
|
38980
39335
|
const db = await getDb();
|
|
38981
|
-
const result = await db.select({ currentStageId: lifecyclePipelines.currentStageId }).from(lifecyclePipelines).where(
|
|
39336
|
+
const result = await db.select({ currentStageId: lifecyclePipelines.currentStageId }).from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
|
|
38982
39337
|
if (result.length === 0) {
|
|
38983
39338
|
throw new CleoError(4 /* NOT_FOUND */, `No pipeline found for task ${taskId}`);
|
|
38984
39339
|
}
|
|
@@ -38990,43 +39345,43 @@ async function listPipelines(options = {}) {
|
|
|
38990
39345
|
const conditions = [];
|
|
38991
39346
|
if (options.status) {
|
|
38992
39347
|
conditions.push(
|
|
38993
|
-
|
|
39348
|
+
eq9(
|
|
38994
39349
|
lifecyclePipelines.status,
|
|
38995
39350
|
options.status
|
|
38996
39351
|
)
|
|
38997
39352
|
);
|
|
38998
39353
|
}
|
|
38999
39354
|
if (options.currentStage) {
|
|
39000
|
-
conditions.push(
|
|
39355
|
+
conditions.push(eq9(lifecyclePipelines.currentStageId, options.currentStage));
|
|
39001
39356
|
}
|
|
39002
39357
|
if (conditions.length > 0) {
|
|
39003
|
-
const whereClause = conditions.length === 1 ? conditions[0] :
|
|
39358
|
+
const whereClause = conditions.length === 1 ? conditions[0] : and6(...conditions);
|
|
39004
39359
|
query = db.select().from(lifecyclePipelines).where(whereClause);
|
|
39005
39360
|
}
|
|
39006
39361
|
if (options.orderBy) {
|
|
39007
39362
|
const order = options.order === "asc" ? asc3 : desc3;
|
|
39008
39363
|
switch (options.orderBy) {
|
|
39009
39364
|
case "createdAt":
|
|
39010
|
-
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ?
|
|
39365
|
+
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and6(...conditions) : void 0).orderBy(order(lifecyclePipelines.startedAt));
|
|
39011
39366
|
break;
|
|
39012
39367
|
case "currentStage":
|
|
39013
|
-
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ?
|
|
39368
|
+
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and6(...conditions) : void 0).orderBy(order(lifecyclePipelines.currentStageId));
|
|
39014
39369
|
break;
|
|
39015
39370
|
}
|
|
39016
39371
|
} else {
|
|
39017
|
-
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ?
|
|
39372
|
+
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and6(...conditions) : void 0).orderBy(desc3(lifecyclePipelines.startedAt));
|
|
39018
39373
|
}
|
|
39019
39374
|
if (options.limit) {
|
|
39020
|
-
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ?
|
|
39375
|
+
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and6(...conditions) : void 0).orderBy(desc3(lifecyclePipelines.startedAt)).limit(options.limit);
|
|
39021
39376
|
}
|
|
39022
39377
|
if (options.offset) {
|
|
39023
|
-
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ?
|
|
39378
|
+
query = db.select().from(lifecyclePipelines).where(conditions.length > 0 ? and6(...conditions) : void 0).orderBy(desc3(lifecyclePipelines.startedAt)).limit(options.limit || 100).offset(options.offset);
|
|
39024
39379
|
}
|
|
39025
39380
|
const results = await query.all();
|
|
39026
39381
|
return Promise.all(
|
|
39027
39382
|
results.map(async (row) => {
|
|
39028
39383
|
const isActive = row.status === "active";
|
|
39029
|
-
const transitionResult = await db.select({ count: sql9`count(*)` }).from(lifecycleTransitions).where(
|
|
39384
|
+
const transitionResult = await db.select({ count: sql9`count(*)` }).from(lifecycleTransitions).where(eq9(lifecycleTransitions.pipelineId, row.id)).all();
|
|
39030
39385
|
const transitionCount = Number(transitionResult[0]?.count || 0);
|
|
39031
39386
|
return {
|
|
39032
39387
|
id: row.taskId,
|
|
@@ -39045,7 +39400,7 @@ async function listPipelines(options = {}) {
|
|
|
39045
39400
|
async function completePipeline(taskId, reason) {
|
|
39046
39401
|
const db = await getDb();
|
|
39047
39402
|
const now2 = /* @__PURE__ */ new Date();
|
|
39048
|
-
const pipelineResult = await db.select().from(lifecyclePipelines).where(
|
|
39403
|
+
const pipelineResult = await db.select().from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
|
|
39049
39404
|
if (pipelineResult.length === 0) {
|
|
39050
39405
|
throw new CleoError(4 /* NOT_FOUND */, `No pipeline found for task ${taskId}`);
|
|
39051
39406
|
}
|
|
@@ -39060,21 +39415,21 @@ async function completePipeline(taskId, reason) {
|
|
|
39060
39415
|
stageUpdate.metadataJson = JSON.stringify({ completionReason: reason });
|
|
39061
39416
|
}
|
|
39062
39417
|
await db.update(lifecycleStages).set(stageUpdate).where(
|
|
39063
|
-
|
|
39064
|
-
|
|
39065
|
-
|
|
39418
|
+
and6(
|
|
39419
|
+
eq9(lifecycleStages.pipelineId, pipeline2.id),
|
|
39420
|
+
eq9(lifecycleStages.stageName, pipeline2.currentStageId)
|
|
39066
39421
|
)
|
|
39067
39422
|
).run();
|
|
39068
39423
|
}
|
|
39069
39424
|
await db.update(lifecyclePipelines).set({
|
|
39070
39425
|
status: "completed",
|
|
39071
39426
|
completedAt: now2.toISOString()
|
|
39072
|
-
}).where(
|
|
39427
|
+
}).where(eq9(lifecyclePipelines.id, pipeline2.id)).run();
|
|
39073
39428
|
}
|
|
39074
39429
|
async function cancelPipeline(taskId, reason) {
|
|
39075
39430
|
const db = await getDb();
|
|
39076
39431
|
const now2 = /* @__PURE__ */ new Date();
|
|
39077
|
-
const pipelineResult = await db.select().from(lifecyclePipelines).where(
|
|
39432
|
+
const pipelineResult = await db.select().from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
|
|
39078
39433
|
if (pipelineResult.length === 0) {
|
|
39079
39434
|
throw new CleoError(4 /* NOT_FOUND */, `No pipeline found for task ${taskId}`);
|
|
39080
39435
|
}
|
|
@@ -39091,20 +39446,20 @@ async function cancelPipeline(taskId, reason) {
|
|
|
39091
39446
|
blockedAt: now2.toISOString(),
|
|
39092
39447
|
blockReason: `Pipeline cancelled: ${reason}`
|
|
39093
39448
|
}).where(
|
|
39094
|
-
|
|
39095
|
-
|
|
39096
|
-
|
|
39449
|
+
and6(
|
|
39450
|
+
eq9(lifecycleStages.pipelineId, pipeline2.id),
|
|
39451
|
+
eq9(lifecycleStages.stageName, pipeline2.currentStageId)
|
|
39097
39452
|
)
|
|
39098
39453
|
).run();
|
|
39099
39454
|
}
|
|
39100
39455
|
await db.update(lifecyclePipelines).set({
|
|
39101
39456
|
status: "cancelled",
|
|
39102
39457
|
completedAt: now2.toISOString()
|
|
39103
|
-
}).where(
|
|
39458
|
+
}).where(eq9(lifecyclePipelines.id, pipeline2.id)).run();
|
|
39104
39459
|
}
|
|
39105
39460
|
async function pipelineExists(taskId) {
|
|
39106
39461
|
const db = await getDb();
|
|
39107
|
-
const result = await db.select({ count: sql9`count(*)` }).from(lifecyclePipelines).where(
|
|
39462
|
+
const result = await db.select({ count: sql9`count(*)` }).from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).all();
|
|
39108
39463
|
return (result[0]?.count || 0) > 0;
|
|
39109
39464
|
}
|
|
39110
39465
|
async function getPipelineStatistics() {
|
|
@@ -39148,12 +39503,12 @@ async function getPipelineStatistics() {
|
|
|
39148
39503
|
}
|
|
39149
39504
|
async function getPipelineStages(taskId) {
|
|
39150
39505
|
const db = await getDb();
|
|
39151
|
-
const pipelineResult = await db.select({ id: lifecyclePipelines.id }).from(lifecyclePipelines).where(
|
|
39506
|
+
const pipelineResult = await db.select({ id: lifecyclePipelines.id }).from(lifecyclePipelines).where(eq9(lifecyclePipelines.taskId, taskId)).limit(1).all();
|
|
39152
39507
|
if (pipelineResult.length === 0) {
|
|
39153
39508
|
throw new CleoError(4 /* NOT_FOUND */, `No pipeline found for task ${taskId}`);
|
|
39154
39509
|
}
|
|
39155
39510
|
const pipelineId = pipelineResult[0].id;
|
|
39156
|
-
const stages = await db.select().from(lifecycleStages).where(
|
|
39511
|
+
const stages = await db.select().from(lifecycleStages).where(eq9(lifecycleStages.pipelineId, pipelineId)).orderBy(asc3(lifecycleStages.sequence)).all();
|
|
39157
39512
|
return stages.map((stage) => ({
|
|
39158
39513
|
id: stage.id,
|
|
39159
39514
|
pipelineId: stage.pipelineId,
|
|
@@ -45454,9 +45809,9 @@ async function nexusRegister(projectPath, name2, permissions = "read") {
|
|
|
45454
45809
|
const projectHash = generateProjectHash(projectPath);
|
|
45455
45810
|
await nexusInit();
|
|
45456
45811
|
const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
|
|
45457
|
-
const { eq:
|
|
45812
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
45458
45813
|
const db = await getNexusDb2();
|
|
45459
|
-
const existingRows = await db.select().from(projectRegistry).where(
|
|
45814
|
+
const existingRows = await db.select().from(projectRegistry).where(eq17(projectRegistry.projectHash, projectHash));
|
|
45460
45815
|
const existing = existingRows[0];
|
|
45461
45816
|
if (existing?.permissions) {
|
|
45462
45817
|
throw new CleoError(
|
|
@@ -45465,7 +45820,7 @@ async function nexusRegister(projectPath, name2, permissions = "read") {
|
|
|
45465
45820
|
);
|
|
45466
45821
|
}
|
|
45467
45822
|
if (!existing) {
|
|
45468
|
-
const nameConflictRows = await db.select().from(projectRegistry).where(
|
|
45823
|
+
const nameConflictRows = await db.select().from(projectRegistry).where(eq17(projectRegistry.name, projectName));
|
|
45469
45824
|
if (nameConflictRows.length > 0) {
|
|
45470
45825
|
throw new CleoError(
|
|
45471
45826
|
6 /* VALIDATION_ERROR */,
|
|
@@ -45483,7 +45838,7 @@ async function nexusRegister(projectPath, name2, permissions = "read") {
|
|
|
45483
45838
|
taskCount: meta.taskCount,
|
|
45484
45839
|
labelsJson: JSON.stringify(meta.labels),
|
|
45485
45840
|
lastSeen: now2
|
|
45486
|
-
}).where(
|
|
45841
|
+
}).where(eq17(projectRegistry.projectHash, projectHash));
|
|
45487
45842
|
} else {
|
|
45488
45843
|
if (!projectId) {
|
|
45489
45844
|
projectId = randomUUID3();
|
|
@@ -45521,9 +45876,9 @@ async function nexusUnregister(nameOrHash) {
|
|
|
45521
45876
|
throw new CleoError(4 /* NOT_FOUND */, `Project not found in registry: ${nameOrHash}`);
|
|
45522
45877
|
}
|
|
45523
45878
|
const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
|
|
45524
|
-
const { eq:
|
|
45879
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
45525
45880
|
const db = await getNexusDb2();
|
|
45526
|
-
await db.delete(projectRegistry).where(
|
|
45881
|
+
await db.delete(projectRegistry).where(eq17(projectRegistry.projectHash, project.hash));
|
|
45527
45882
|
await writeNexusAudit({
|
|
45528
45883
|
action: "unregister",
|
|
45529
45884
|
projectHash: project.hash,
|
|
@@ -45545,9 +45900,9 @@ async function nexusList() {
|
|
|
45545
45900
|
async function nexusGetProject(nameOrHash) {
|
|
45546
45901
|
try {
|
|
45547
45902
|
const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
|
|
45548
|
-
const { eq:
|
|
45903
|
+
const { eq: eq17, or: or6 } = await import("drizzle-orm");
|
|
45549
45904
|
const db = await getNexusDb2();
|
|
45550
|
-
const rows = await db.select().from(projectRegistry).where(or6(
|
|
45905
|
+
const rows = await db.select().from(projectRegistry).where(or6(eq17(projectRegistry.projectHash, nameOrHash), eq17(projectRegistry.name, nameOrHash)));
|
|
45551
45906
|
const row = rows[0];
|
|
45552
45907
|
if (!row) return null;
|
|
45553
45908
|
return rowToProject(row);
|
|
@@ -45570,14 +45925,14 @@ async function nexusSync(nameOrHash) {
|
|
|
45570
45925
|
const meta = await readProjectMeta(project.path);
|
|
45571
45926
|
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
45572
45927
|
const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
|
|
45573
|
-
const { eq:
|
|
45928
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
45574
45929
|
const db = await getNexusDb2();
|
|
45575
45930
|
await db.update(projectRegistry).set({
|
|
45576
45931
|
taskCount: meta.taskCount,
|
|
45577
45932
|
labelsJson: JSON.stringify(meta.labels),
|
|
45578
45933
|
lastSync: now2,
|
|
45579
45934
|
lastSeen: now2
|
|
45580
|
-
}).where(
|
|
45935
|
+
}).where(eq17(projectRegistry.projectHash, project.hash));
|
|
45581
45936
|
await writeNexusAudit({
|
|
45582
45937
|
action: "sync",
|
|
45583
45938
|
projectHash: project.hash,
|
|
@@ -45591,7 +45946,7 @@ async function nexusSyncAll() {
|
|
|
45591
45946
|
let synced = 0;
|
|
45592
45947
|
let failed = 0;
|
|
45593
45948
|
const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
|
|
45594
|
-
const { eq:
|
|
45949
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
45595
45950
|
const db = await getNexusDb2();
|
|
45596
45951
|
for (const project of projects) {
|
|
45597
45952
|
try {
|
|
@@ -45602,7 +45957,7 @@ async function nexusSyncAll() {
|
|
|
45602
45957
|
labelsJson: JSON.stringify(meta.labels),
|
|
45603
45958
|
lastSync: now2,
|
|
45604
45959
|
lastSeen: now2
|
|
45605
|
-
}).where(
|
|
45960
|
+
}).where(eq17(projectRegistry.projectHash, project.hash));
|
|
45606
45961
|
synced++;
|
|
45607
45962
|
} catch {
|
|
45608
45963
|
failed++;
|
|
@@ -45622,9 +45977,9 @@ async function nexusSetPermission(nameOrHash, permission) {
|
|
|
45622
45977
|
throw new CleoError(4 /* NOT_FOUND */, `Project not found in registry: ${nameOrHash}`);
|
|
45623
45978
|
}
|
|
45624
45979
|
const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
|
|
45625
|
-
const { eq:
|
|
45980
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
45626
45981
|
const db = await getNexusDb2();
|
|
45627
|
-
await db.update(projectRegistry).set({ permissions: permission }).where(
|
|
45982
|
+
await db.update(projectRegistry).set({ permissions: permission }).where(eq17(projectRegistry.projectHash, project.hash));
|
|
45628
45983
|
await writeNexusAudit({
|
|
45629
45984
|
action: "set-permission",
|
|
45630
45985
|
projectHash: project.hash,
|
|
@@ -45640,12 +45995,12 @@ async function nexusReconcile(projectRoot) {
|
|
|
45640
45995
|
}
|
|
45641
45996
|
await nexusInit();
|
|
45642
45997
|
const { getNexusDb: getNexusDb2 } = await Promise.resolve().then(() => (init_nexus_sqlite(), nexus_sqlite_exports));
|
|
45643
|
-
const { eq:
|
|
45998
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
45644
45999
|
const db = await getNexusDb2();
|
|
45645
46000
|
const projectId = await readProjectId(projectRoot);
|
|
45646
46001
|
const currentHash = generateProjectHash(projectRoot);
|
|
45647
46002
|
if (projectId) {
|
|
45648
|
-
const hashRows2 = await db.select().from(projectRegistry).where(
|
|
46003
|
+
const hashRows2 = await db.select().from(projectRegistry).where(eq17(projectRegistry.projectHash, currentHash));
|
|
45649
46004
|
const hashMatch2 = hashRows2[0];
|
|
45650
46005
|
if (hashMatch2 && hashMatch2.projectId !== projectId) {
|
|
45651
46006
|
await writeNexusAudit({
|
|
@@ -45664,12 +46019,12 @@ async function nexusReconcile(projectRoot) {
|
|
|
45664
46019
|
}
|
|
45665
46020
|
}
|
|
45666
46021
|
if (projectId) {
|
|
45667
|
-
const idRows = await db.select().from(projectRegistry).where(
|
|
46022
|
+
const idRows = await db.select().from(projectRegistry).where(eq17(projectRegistry.projectId, projectId));
|
|
45668
46023
|
const existing = idRows[0];
|
|
45669
46024
|
if (existing) {
|
|
45670
46025
|
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
45671
46026
|
if (existing.projectPath === projectRoot) {
|
|
45672
|
-
await db.update(projectRegistry).set({ lastSeen: now2 }).where(
|
|
46027
|
+
await db.update(projectRegistry).set({ lastSeen: now2 }).where(eq17(projectRegistry.projectId, projectId));
|
|
45673
46028
|
await writeNexusAudit({
|
|
45674
46029
|
action: "reconcile",
|
|
45675
46030
|
projectHash: currentHash,
|
|
@@ -45685,7 +46040,7 @@ async function nexusReconcile(projectRoot) {
|
|
|
45685
46040
|
projectPath: projectRoot,
|
|
45686
46041
|
projectHash: currentHash,
|
|
45687
46042
|
lastSeen: now2
|
|
45688
|
-
}).where(
|
|
46043
|
+
}).where(eq17(projectRegistry.projectId, projectId));
|
|
45689
46044
|
await writeNexusAudit({
|
|
45690
46045
|
action: "reconcile",
|
|
45691
46046
|
projectHash: currentHash,
|
|
@@ -45697,11 +46052,11 @@ async function nexusReconcile(projectRoot) {
|
|
|
45697
46052
|
return { status: "path_updated", oldPath, newPath: projectRoot };
|
|
45698
46053
|
}
|
|
45699
46054
|
}
|
|
45700
|
-
const hashRows = await db.select().from(projectRegistry).where(
|
|
46055
|
+
const hashRows = await db.select().from(projectRegistry).where(eq17(projectRegistry.projectHash, currentHash));
|
|
45701
46056
|
const hashMatch = hashRows[0];
|
|
45702
46057
|
if (hashMatch) {
|
|
45703
46058
|
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
45704
|
-
await db.update(projectRegistry).set({ lastSeen: now2 }).where(
|
|
46059
|
+
await db.update(projectRegistry).set({ lastSeen: now2 }).where(eq17(projectRegistry.projectHash, currentHash));
|
|
45705
46060
|
await writeNexusAudit({
|
|
45706
46061
|
action: "reconcile",
|
|
45707
46062
|
projectHash: currentHash,
|
|
@@ -46556,6 +46911,30 @@ function collectCleoFiles(cleoDir) {
|
|
|
46556
46911
|
walk(cleoDir);
|
|
46557
46912
|
return files.sort();
|
|
46558
46913
|
}
|
|
46914
|
+
async function getCleoGitRemotes(cleoDir) {
|
|
46915
|
+
const result = await cleoGitCommand(["remote"], cleoDir);
|
|
46916
|
+
if (!result.success || !result.stdout) return [];
|
|
46917
|
+
return result.stdout.split("\n").map((r) => r.trim()).filter(Boolean);
|
|
46918
|
+
}
|
|
46919
|
+
async function hasCleoGitPendingChanges(cleoDir) {
|
|
46920
|
+
const result = await cleoGitCommand(["status", "--porcelain"], cleoDir);
|
|
46921
|
+
if (!result.success) return false;
|
|
46922
|
+
return result.stdout.length > 0;
|
|
46923
|
+
}
|
|
46924
|
+
async function getLastSyncTimestamp(cleoDir) {
|
|
46925
|
+
const result = await cleoGitCommand(["reflog", "--format=%gs %ci", "HEAD"], cleoDir);
|
|
46926
|
+
if (!result.success || !result.stdout) return null;
|
|
46927
|
+
for (const line2 of result.stdout.split("\n")) {
|
|
46928
|
+
const trimmed = line2.trim();
|
|
46929
|
+
if (/^(fetch|push|pull)\b/i.test(trimmed)) {
|
|
46930
|
+
const isoMatch = trimmed.match(/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} [+-]\d{4})$/);
|
|
46931
|
+
if (isoMatch?.[1]) {
|
|
46932
|
+
return new Date(isoMatch[1]).toISOString();
|
|
46933
|
+
}
|
|
46934
|
+
}
|
|
46935
|
+
}
|
|
46936
|
+
return null;
|
|
46937
|
+
}
|
|
46559
46938
|
async function getSharingStatus(cwd) {
|
|
46560
46939
|
const config2 = await loadConfig(cwd);
|
|
46561
46940
|
const sharing = config2.sharing;
|
|
@@ -46572,12 +46951,27 @@ async function getSharingStatus(cwd) {
|
|
|
46572
46951
|
ignored.push(file2);
|
|
46573
46952
|
}
|
|
46574
46953
|
}
|
|
46954
|
+
const hasGit = isCleoGitInitialized(cleoDir);
|
|
46955
|
+
let remotes = [];
|
|
46956
|
+
let pendingChanges = false;
|
|
46957
|
+
let lastSync = null;
|
|
46958
|
+
if (hasGit) {
|
|
46959
|
+
[remotes, pendingChanges, lastSync] = await Promise.all([
|
|
46960
|
+
getCleoGitRemotes(cleoDir),
|
|
46961
|
+
hasCleoGitPendingChanges(cleoDir),
|
|
46962
|
+
getLastSyncTimestamp(cleoDir)
|
|
46963
|
+
]);
|
|
46964
|
+
}
|
|
46575
46965
|
return {
|
|
46576
46966
|
mode: sharing.mode,
|
|
46577
46967
|
allowlist: sharing.commitAllowlist,
|
|
46578
46968
|
denylist: sharing.denylist,
|
|
46579
46969
|
tracked,
|
|
46580
|
-
ignored
|
|
46970
|
+
ignored,
|
|
46971
|
+
hasGit,
|
|
46972
|
+
remotes,
|
|
46973
|
+
pendingChanges,
|
|
46974
|
+
lastSync
|
|
46581
46975
|
};
|
|
46582
46976
|
}
|
|
46583
46977
|
function generateGitignoreEntries(sharing) {
|
|
@@ -46629,6 +47023,7 @@ var init_sharing = __esm({
|
|
|
46629
47023
|
"use strict";
|
|
46630
47024
|
init_config();
|
|
46631
47025
|
init_paths();
|
|
47026
|
+
init_git_checkpoint();
|
|
46632
47027
|
GITIGNORE_START = "# CLEO:SHARING:START - Auto-managed by cleo sharing sync";
|
|
46633
47028
|
GITIGNORE_END = "# CLEO:SHARING:END";
|
|
46634
47029
|
}
|
|
@@ -46636,25 +47031,25 @@ var init_sharing = __esm({
|
|
|
46636
47031
|
|
|
46637
47032
|
// packages/core/src/reconciliation/link-store.ts
|
|
46638
47033
|
import { randomUUID as randomUUID4 } from "node:crypto";
|
|
46639
|
-
import { and as
|
|
47034
|
+
import { and as and7, eq as eq10 } from "drizzle-orm";
|
|
46640
47035
|
async function getLinksByProvider(providerId, cwd) {
|
|
46641
47036
|
const db = await getDb(cwd);
|
|
46642
|
-
const rows = await db.select().from(externalTaskLinks).where(
|
|
47037
|
+
const rows = await db.select().from(externalTaskLinks).where(eq10(externalTaskLinks.providerId, providerId));
|
|
46643
47038
|
return rows.map(rowToLink);
|
|
46644
47039
|
}
|
|
46645
47040
|
async function getLinkByExternalId(providerId, externalId, cwd) {
|
|
46646
47041
|
const db = await getDb(cwd);
|
|
46647
47042
|
const rows = await db.select().from(externalTaskLinks).where(
|
|
46648
|
-
|
|
46649
|
-
|
|
46650
|
-
|
|
47043
|
+
and7(
|
|
47044
|
+
eq10(externalTaskLinks.providerId, providerId),
|
|
47045
|
+
eq10(externalTaskLinks.externalId, externalId)
|
|
46651
47046
|
)
|
|
46652
47047
|
);
|
|
46653
47048
|
return rows.length > 0 ? rowToLink(rows[0]) : null;
|
|
46654
47049
|
}
|
|
46655
47050
|
async function getLinksByTaskId(taskId, cwd) {
|
|
46656
47051
|
const db = await getDb(cwd);
|
|
46657
|
-
const rows = await db.select().from(externalTaskLinks).where(
|
|
47052
|
+
const rows = await db.select().from(externalTaskLinks).where(eq10(externalTaskLinks.taskId, taskId));
|
|
46658
47053
|
return rows.map(rowToLink);
|
|
46659
47054
|
}
|
|
46660
47055
|
async function createLink(params, cwd) {
|
|
@@ -46698,11 +47093,11 @@ async function touchLink(linkId, updates, cwd) {
|
|
|
46698
47093
|
if (updates?.metadata !== void 0) {
|
|
46699
47094
|
values.metadataJson = JSON.stringify(updates.metadata);
|
|
46700
47095
|
}
|
|
46701
|
-
await db.update(externalTaskLinks).set(values).where(
|
|
47096
|
+
await db.update(externalTaskLinks).set(values).where(eq10(externalTaskLinks.id, linkId));
|
|
46702
47097
|
}
|
|
46703
47098
|
async function removeLinksByProvider(providerId, cwd) {
|
|
46704
47099
|
const db = await getDb(cwd);
|
|
46705
|
-
const result = await db.delete(externalTaskLinks).where(
|
|
47100
|
+
const result = await db.delete(externalTaskLinks).where(eq10(externalTaskLinks.providerId, providerId));
|
|
46706
47101
|
return Number(result.changes);
|
|
46707
47102
|
}
|
|
46708
47103
|
function rowToLink(row) {
|
|
@@ -50656,7 +51051,7 @@ import { execFileSync as execFileSync7 } from "node:child_process";
|
|
|
50656
51051
|
import { existsSync as existsSync64, renameSync as renameSync5 } from "node:fs";
|
|
50657
51052
|
import { readFile as readFile12 } from "node:fs/promises";
|
|
50658
51053
|
import { join as join67 } from "node:path";
|
|
50659
|
-
import { and as
|
|
51054
|
+
import { and as and8, count, desc as desc4, eq as eq11 } from "drizzle-orm";
|
|
50660
51055
|
async function getDb2(cwd) {
|
|
50661
51056
|
const { getDb: _getDb } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
50662
51057
|
return _getDb(cwd);
|
|
@@ -50725,7 +51120,7 @@ function rowToManifest(row) {
|
|
|
50725
51120
|
}
|
|
50726
51121
|
async function findLatestPushedVersion(cwd) {
|
|
50727
51122
|
const db = await getDb2(cwd);
|
|
50728
|
-
const rows = await db.select({ version: releaseManifests.version }).from(releaseManifests).where(
|
|
51123
|
+
const rows = await db.select({ version: releaseManifests.version }).from(releaseManifests).where(eq11(releaseManifests.status, "pushed")).orderBy(desc4(releaseManifests.pushedAt)).limit(1).all();
|
|
50729
51124
|
return rows[0]?.version;
|
|
50730
51125
|
}
|
|
50731
51126
|
async function prepareRelease(version2, tasks2, notes, loadTasksFn, cwd) {
|
|
@@ -50737,7 +51132,7 @@ async function prepareRelease(version2, tasks2, notes, loadTasksFn, cwd) {
|
|
|
50737
51132
|
}
|
|
50738
51133
|
const normalizedVersion = normalizeVersion(version2);
|
|
50739
51134
|
const db = await getDb2(cwd);
|
|
50740
|
-
const existing = await db.select().from(releaseManifests).where(
|
|
51135
|
+
const existing = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
|
|
50741
51136
|
if (existing.length > 0) {
|
|
50742
51137
|
throw new Error(`Release ${normalizedVersion} already exists (status: ${existing[0].status})`);
|
|
50743
51138
|
}
|
|
@@ -50777,7 +51172,7 @@ async function generateReleaseChangelog(version2, loadTasksFn, cwd) {
|
|
|
50777
51172
|
}
|
|
50778
51173
|
const normalizedVersion = normalizeVersion(version2);
|
|
50779
51174
|
const db = await getDb2(cwd);
|
|
50780
|
-
const rows = await db.select().from(releaseManifests).where(
|
|
51175
|
+
const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
|
|
50781
51176
|
if (rows.length === 0) {
|
|
50782
51177
|
throw new Error(`Release ${normalizedVersion} not found`);
|
|
50783
51178
|
}
|
|
@@ -50914,7 +51309,7 @@ async function generateReleaseChangelog(version2, loadTasksFn, cwd) {
|
|
|
50914
51309
|
sections.push("");
|
|
50915
51310
|
}
|
|
50916
51311
|
const changelog = sections.join("\n");
|
|
50917
|
-
await db.update(releaseManifests).set({ changelog }).where(
|
|
51312
|
+
await db.update(releaseManifests).set({ changelog }).where(eq11(releaseManifests.version, normalizedVersion)).run();
|
|
50918
51313
|
const changelogPath = join67(cwd ?? process.cwd(), "CHANGELOG.md");
|
|
50919
51314
|
let existingChangelogContent = "";
|
|
50920
51315
|
try {
|
|
@@ -50952,8 +51347,8 @@ async function listManifestReleases(optionsOrCwd, cwd) {
|
|
|
50952
51347
|
const db = await getDb2(effectiveCwd);
|
|
50953
51348
|
const totalRow = await db.select({ count: count() }).from(releaseManifests).get();
|
|
50954
51349
|
const total = totalRow?.count ?? 0;
|
|
50955
|
-
const conditions = options.status ? [
|
|
50956
|
-
const whereClause = conditions.length > 0 ?
|
|
51350
|
+
const conditions = options.status ? [eq11(releaseManifests.status, options.status)] : [];
|
|
51351
|
+
const whereClause = conditions.length > 0 ? and8(...conditions) : void 0;
|
|
50957
51352
|
const filteredRow = await db.select({ count: count() }).from(releaseManifests).where(whereClause).get();
|
|
50958
51353
|
const filtered = filteredRow?.count ?? 0;
|
|
50959
51354
|
let query = db.select().from(releaseManifests).where(whereClause).orderBy(desc4(releaseManifests.createdAt));
|
|
@@ -50984,7 +51379,7 @@ async function showManifestRelease(version2, cwd) {
|
|
|
50984
51379
|
}
|
|
50985
51380
|
const normalizedVersion = normalizeVersion(version2);
|
|
50986
51381
|
const db = await getDb2(cwd);
|
|
50987
|
-
const rows = await db.select().from(releaseManifests).where(
|
|
51382
|
+
const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
|
|
50988
51383
|
if (rows.length === 0) {
|
|
50989
51384
|
throw new Error(`Release ${normalizedVersion} not found`);
|
|
50990
51385
|
}
|
|
@@ -50996,7 +51391,7 @@ async function commitRelease(version2, cwd) {
|
|
|
50996
51391
|
}
|
|
50997
51392
|
const normalizedVersion = normalizeVersion(version2);
|
|
50998
51393
|
const db = await getDb2(cwd);
|
|
50999
|
-
const rows = await db.select().from(releaseManifests).where(
|
|
51394
|
+
const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
|
|
51000
51395
|
if (rows.length === 0) {
|
|
51001
51396
|
throw new Error(`Release ${normalizedVersion} not found`);
|
|
51002
51397
|
}
|
|
@@ -51006,7 +51401,7 @@ async function commitRelease(version2, cwd) {
|
|
|
51006
51401
|
);
|
|
51007
51402
|
}
|
|
51008
51403
|
const committedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
51009
|
-
await db.update(releaseManifests).set({ status: "committed", committedAt }).where(
|
|
51404
|
+
await db.update(releaseManifests).set({ status: "committed", committedAt }).where(eq11(releaseManifests.version, normalizedVersion)).run();
|
|
51010
51405
|
return { version: normalizedVersion, status: "committed", committedAt };
|
|
51011
51406
|
}
|
|
51012
51407
|
async function tagRelease(version2, cwd) {
|
|
@@ -51015,12 +51410,12 @@ async function tagRelease(version2, cwd) {
|
|
|
51015
51410
|
}
|
|
51016
51411
|
const normalizedVersion = normalizeVersion(version2);
|
|
51017
51412
|
const db = await getDb2(cwd);
|
|
51018
|
-
const rows = await db.select().from(releaseManifests).where(
|
|
51413
|
+
const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
|
|
51019
51414
|
if (rows.length === 0) {
|
|
51020
51415
|
throw new Error(`Release ${normalizedVersion} not found`);
|
|
51021
51416
|
}
|
|
51022
51417
|
const taggedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
51023
|
-
await db.update(releaseManifests).set({ status: "tagged", taggedAt }).where(
|
|
51418
|
+
await db.update(releaseManifests).set({ status: "tagged", taggedAt }).where(eq11(releaseManifests.version, normalizedVersion)).run();
|
|
51024
51419
|
return { version: normalizedVersion, status: "tagged", taggedAt };
|
|
51025
51420
|
}
|
|
51026
51421
|
async function runReleaseGates(version2, loadTasksFn, cwd, opts) {
|
|
@@ -51029,7 +51424,7 @@ async function runReleaseGates(version2, loadTasksFn, cwd, opts) {
|
|
|
51029
51424
|
}
|
|
51030
51425
|
const normalizedVersion = normalizeVersion(version2);
|
|
51031
51426
|
const db = await getDb2(cwd);
|
|
51032
|
-
const rows = await db.select().from(releaseManifests).where(
|
|
51427
|
+
const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
|
|
51033
51428
|
if (rows.length === 0) {
|
|
51034
51429
|
throw new Error(`Release ${normalizedVersion} not found`);
|
|
51035
51430
|
}
|
|
@@ -51177,7 +51572,7 @@ async function cancelRelease(version2, projectRoot) {
|
|
|
51177
51572
|
}
|
|
51178
51573
|
const normalizedVersion = normalizeVersion(version2);
|
|
51179
51574
|
const db = await getDb2(projectRoot);
|
|
51180
|
-
const rows = await db.select().from(releaseManifests).where(
|
|
51575
|
+
const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
|
|
51181
51576
|
if (rows.length === 0) {
|
|
51182
51577
|
return {
|
|
51183
51578
|
success: false,
|
|
@@ -51194,7 +51589,7 @@ async function cancelRelease(version2, projectRoot) {
|
|
|
51194
51589
|
version: normalizedVersion
|
|
51195
51590
|
};
|
|
51196
51591
|
}
|
|
51197
|
-
await db.delete(releaseManifests).where(
|
|
51592
|
+
await db.delete(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).run();
|
|
51198
51593
|
return {
|
|
51199
51594
|
success: true,
|
|
51200
51595
|
message: `Release ${normalizedVersion} cancelled and removed`,
|
|
@@ -51207,12 +51602,12 @@ async function rollbackRelease(version2, reason, cwd) {
|
|
|
51207
51602
|
}
|
|
51208
51603
|
const normalizedVersion = normalizeVersion(version2);
|
|
51209
51604
|
const db = await getDb2(cwd);
|
|
51210
|
-
const rows = await db.select().from(releaseManifests).where(
|
|
51605
|
+
const rows = await db.select().from(releaseManifests).where(eq11(releaseManifests.version, normalizedVersion)).limit(1).all();
|
|
51211
51606
|
if (rows.length === 0) {
|
|
51212
51607
|
throw new Error(`Release ${normalizedVersion} not found`);
|
|
51213
51608
|
}
|
|
51214
51609
|
const previousStatus = rows[0].status;
|
|
51215
|
-
await db.update(releaseManifests).set({ status: "rolled_back" }).where(
|
|
51610
|
+
await db.update(releaseManifests).set({ status: "rolled_back" }).where(eq11(releaseManifests.version, normalizedVersion)).run();
|
|
51216
51611
|
return {
|
|
51217
51612
|
version: normalizedVersion,
|
|
51218
51613
|
previousStatus,
|
|
@@ -51322,7 +51717,7 @@ async function markReleasePushed(version2, pushedAt, cwd, provenance) {
|
|
|
51322
51717
|
pushedAt,
|
|
51323
51718
|
...provenance?.commitSha != null ? { commitSha: provenance.commitSha } : {},
|
|
51324
51719
|
...provenance?.gitTag != null ? { gitTag: provenance.gitTag } : {}
|
|
51325
|
-
}).where(
|
|
51720
|
+
}).where(eq11(releaseManifests.version, normalizedVersion)).run();
|
|
51326
51721
|
}
|
|
51327
51722
|
async function migrateReleasesJsonToSqlite(projectRoot) {
|
|
51328
51723
|
const releasesPath = join67(getCleoDirAbsolute(projectRoot), "releases.json");
|
|
@@ -51342,7 +51737,7 @@ async function migrateReleasesJsonToSqlite(projectRoot) {
|
|
|
51342
51737
|
const db = await getDb2(projectRoot);
|
|
51343
51738
|
let migrated = 0;
|
|
51344
51739
|
for (const r of raw.releases) {
|
|
51345
|
-
const existing = await db.select({ id: releaseManifests.id }).from(releaseManifests).where(
|
|
51740
|
+
const existing = await db.select({ id: releaseManifests.id }).from(releaseManifests).where(eq11(releaseManifests.version, r.version)).limit(1).all();
|
|
51346
51741
|
if (existing.length > 0) continue;
|
|
51347
51742
|
const id = `rel-${r.version.replace(/[^a-z0-9]/gi, "-")}`;
|
|
51348
51743
|
await db.insert(releaseManifests).values({
|
|
@@ -57098,7 +57493,7 @@ async function queryTasks(cwd, since) {
|
|
|
57098
57493
|
try {
|
|
57099
57494
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
57100
57495
|
const { tasks: tasks2 } = await Promise.resolve().then(() => (init_tasks_schema(), tasks_schema_exports));
|
|
57101
|
-
const { and:
|
|
57496
|
+
const { and: and12, gte: gte4 } = await import("drizzle-orm");
|
|
57102
57497
|
const db = await getDb4(cwd);
|
|
57103
57498
|
const conditions = [];
|
|
57104
57499
|
if (since) {
|
|
@@ -57112,7 +57507,7 @@ async function queryTasks(cwd, since) {
|
|
|
57112
57507
|
sessionId: tasks2.sessionId,
|
|
57113
57508
|
completedAt: tasks2.completedAt,
|
|
57114
57509
|
createdAt: tasks2.createdAt
|
|
57115
|
-
}).from(tasks2).where(conditions.length > 0 ?
|
|
57510
|
+
}).from(tasks2).where(conditions.length > 0 ? and12(...conditions) : void 0).all();
|
|
57116
57511
|
return rows;
|
|
57117
57512
|
} catch (err) {
|
|
57118
57513
|
log7.warn({ err }, "Failed to query tasks for workflow telemetry");
|
|
@@ -57123,7 +57518,7 @@ async function queryCompletionAuditRows(cwd, since) {
|
|
|
57123
57518
|
try {
|
|
57124
57519
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
57125
57520
|
const { auditLog: auditLog2 } = await Promise.resolve().then(() => (init_tasks_schema(), tasks_schema_exports));
|
|
57126
|
-
const { and:
|
|
57521
|
+
const { and: and12, gte: gte4 } = await import("drizzle-orm");
|
|
57127
57522
|
const db = await getDb4(cwd);
|
|
57128
57523
|
const conditions = [];
|
|
57129
57524
|
if (since) conditions.push(gte4(auditLog2.timestamp, since));
|
|
@@ -57135,7 +57530,7 @@ async function queryCompletionAuditRows(cwd, since) {
|
|
|
57135
57530
|
afterJson: auditLog2.afterJson,
|
|
57136
57531
|
operation: auditLog2.operation,
|
|
57137
57532
|
domain: auditLog2.domain
|
|
57138
|
-
}).from(auditLog2).where(conditions.length > 0 ?
|
|
57533
|
+
}).from(auditLog2).where(conditions.length > 0 ? and12(...conditions) : void 0).orderBy(auditLog2.timestamp).all();
|
|
57139
57534
|
return allRows.filter((row) => {
|
|
57140
57535
|
const isComplete = row.action === "task_completed" || row.action === "complete" || row.operation === "complete" && row.domain === "tasks";
|
|
57141
57536
|
if (!isComplete && row.afterJson) {
|
|
@@ -67191,6 +67586,7 @@ __export(src_exports, {
|
|
|
67191
67586
|
isSuccessCode: () => isSuccessCode,
|
|
67192
67587
|
isValidStatus: () => isValidStatus,
|
|
67193
67588
|
issue: () => issue_exports,
|
|
67589
|
+
lib: () => lib_exports,
|
|
67194
67590
|
lifecycle: () => lifecycle_exports,
|
|
67195
67591
|
lifecycleEvidenceTypeSchema: () => lifecycleEvidenceTypeSchema,
|
|
67196
67592
|
lifecycleGateResultSchema: () => lifecycleGateResultSchema,
|
|
@@ -67292,6 +67688,7 @@ var init_src2 = __esm({
|
|
|
67292
67688
|
init_inject();
|
|
67293
67689
|
init_intelligence();
|
|
67294
67690
|
init_issue();
|
|
67691
|
+
init_lib();
|
|
67295
67692
|
init_lifecycle2();
|
|
67296
67693
|
init_mcp();
|
|
67297
67694
|
init_memory();
|
|
@@ -68681,9 +69078,9 @@ async function addChain(chain, projectRoot) {
|
|
|
68681
69078
|
}
|
|
68682
69079
|
async function showChain(id, projectRoot) {
|
|
68683
69080
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
68684
|
-
const { eq:
|
|
69081
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
68685
69082
|
const db = await getDb4(projectRoot);
|
|
68686
|
-
const rows = await db.select().from(warpChains).where(
|
|
69083
|
+
const rows = await db.select().from(warpChains).where(eq17(warpChains.id, id));
|
|
68687
69084
|
if (rows.length === 0) return null;
|
|
68688
69085
|
return JSON.parse(rows[0].definition);
|
|
68689
69086
|
}
|
|
@@ -68730,9 +69127,9 @@ async function createInstance(params, projectRoot) {
|
|
|
68730
69127
|
}
|
|
68731
69128
|
async function showInstance(id, projectRoot) {
|
|
68732
69129
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
68733
|
-
const { eq:
|
|
69130
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
68734
69131
|
const db = await getDb4(projectRoot);
|
|
68735
|
-
const rows = await db.select().from(warpChainInstances).where(
|
|
69132
|
+
const rows = await db.select().from(warpChainInstances).where(eq17(warpChainInstances.id, id));
|
|
68736
69133
|
if (rows.length === 0) return null;
|
|
68737
69134
|
const row = rows[0];
|
|
68738
69135
|
return {
|
|
@@ -68778,11 +69175,11 @@ async function advanceInstance(id, nextStage, gateResults, projectRoot) {
|
|
|
68778
69175
|
}
|
|
68779
69176
|
}
|
|
68780
69177
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
68781
|
-
const { eq:
|
|
69178
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
68782
69179
|
const db = await getDb4(projectRoot);
|
|
68783
69180
|
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
68784
69181
|
const existingResults = [];
|
|
68785
|
-
const row = (await db.select().from(warpChainInstances).where(
|
|
69182
|
+
const row = (await db.select().from(warpChainInstances).where(eq17(warpChainInstances.id, id)))[0];
|
|
68786
69183
|
if (row?.gateResults) {
|
|
68787
69184
|
existingResults.push(...JSON.parse(row.gateResults));
|
|
68788
69185
|
}
|
|
@@ -68792,7 +69189,7 @@ async function advanceInstance(id, nextStage, gateResults, projectRoot) {
|
|
|
68792
69189
|
gateResults: JSON.stringify(allResults),
|
|
68793
69190
|
status: "active",
|
|
68794
69191
|
updatedAt: now2
|
|
68795
|
-
}).where(
|
|
69192
|
+
}).where(eq17(warpChainInstances.id, id));
|
|
68796
69193
|
return {
|
|
68797
69194
|
...instance,
|
|
68798
69195
|
currentStage: nextStage,
|
|
@@ -70484,7 +70881,7 @@ var init_engine_compat = __esm({
|
|
|
70484
70881
|
import { createHash as createHash12 } from "node:crypto";
|
|
70485
70882
|
import { existsSync as existsSync106, readFileSync as readFileSync78, renameSync as renameSync7 } from "node:fs";
|
|
70486
70883
|
import { join as join105 } from "node:path";
|
|
70487
|
-
import { and as
|
|
70884
|
+
import { and as and9, count as count2, desc as desc5, eq as eq12, gte as gte3, isNull as isNull3, like as like3, lte as lte2, or as or4 } from "drizzle-orm";
|
|
70488
70885
|
async function getDb3(cwd) {
|
|
70489
70886
|
const { getDb: _getDb } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
70490
70887
|
return _getDb(cwd);
|
|
@@ -70506,10 +70903,10 @@ function buildManifestSqlFilters(filter) {
|
|
|
70506
70903
|
const conditions = [isNull3(pipelineManifest.archivedAt)];
|
|
70507
70904
|
if (filter.status) {
|
|
70508
70905
|
const storedStatus = filter.status === "completed" ? "active" : filter.status;
|
|
70509
|
-
conditions.push(
|
|
70906
|
+
conditions.push(eq12(pipelineManifest.status, storedStatus));
|
|
70510
70907
|
}
|
|
70511
70908
|
if (filter.agent_type) {
|
|
70512
|
-
conditions.push(
|
|
70909
|
+
conditions.push(eq12(pipelineManifest.type, filter.agent_type));
|
|
70513
70910
|
}
|
|
70514
70911
|
if (filter.dateAfter) {
|
|
70515
70912
|
conditions.push(gte3(pipelineManifest.createdAt, `${filter.dateAfter} 00:00:00`));
|
|
@@ -70602,7 +70999,7 @@ async function pipelineManifestShow(researchId, projectRoot) {
|
|
|
70602
70999
|
}
|
|
70603
71000
|
try {
|
|
70604
71001
|
const db = await getDb3(projectRoot);
|
|
70605
|
-
const rows = await db.select().from(pipelineManifest).where(
|
|
71002
|
+
const rows = await db.select().from(pipelineManifest).where(eq12(pipelineManifest.id, researchId)).limit(1);
|
|
70606
71003
|
if (rows.length === 0) {
|
|
70607
71004
|
return {
|
|
70608
71005
|
success: false,
|
|
@@ -70644,7 +71041,7 @@ async function pipelineManifestList(params, projectRoot) {
|
|
|
70644
71041
|
const offset = normalizeOffset2(params.offset);
|
|
70645
71042
|
const pageLimit = effectivePageLimit2(limit, offset);
|
|
70646
71043
|
const { conditions, requiresInMemoryFiltering } = buildManifestSqlFilters(filter);
|
|
70647
|
-
const whereClause =
|
|
71044
|
+
const whereClause = and9(...conditions);
|
|
70648
71045
|
const totalRow = await db.select({ count: count2() }).from(pipelineManifest).where(isNull3(pipelineManifest.archivedAt)).get();
|
|
70649
71046
|
const total = totalRow?.count ?? 0;
|
|
70650
71047
|
if (!requiresInMemoryFiltering) {
|
|
@@ -70692,7 +71089,7 @@ async function pipelineManifestFind(query, options, projectRoot) {
|
|
|
70692
71089
|
const db = await getDb3(projectRoot);
|
|
70693
71090
|
const likePattern = `%${query}%`;
|
|
70694
71091
|
const rows = await db.select().from(pipelineManifest).where(
|
|
70695
|
-
|
|
71092
|
+
and9(
|
|
70696
71093
|
isNull3(pipelineManifest.archivedAt),
|
|
70697
71094
|
or4(like3(pipelineManifest.content, likePattern), like3(pipelineManifest.type, likePattern))
|
|
70698
71095
|
)
|
|
@@ -70885,7 +71282,7 @@ async function pipelineManifestArchive(beforeDate, projectRoot) {
|
|
|
70885
71282
|
}
|
|
70886
71283
|
const archivedAt = now();
|
|
70887
71284
|
for (const row of toArchive) {
|
|
70888
|
-
await db.update(pipelineManifest).set({ archivedAt }).where(
|
|
71285
|
+
await db.update(pipelineManifest).set({ archivedAt }).where(eq12(pipelineManifest.id, row.id));
|
|
70889
71286
|
}
|
|
70890
71287
|
const remaining = rows.length - toArchive.length;
|
|
70891
71288
|
return { success: true, data: { archived: toArchive.length, remaining } };
|
|
@@ -71234,25 +71631,25 @@ async function measureTokenExchange(input) {
|
|
|
71234
71631
|
);
|
|
71235
71632
|
}
|
|
71236
71633
|
async function whereClauses(filters) {
|
|
71237
|
-
const { eq:
|
|
71634
|
+
const { eq: eq17, gte: gte4, lte: lte3 } = await import("drizzle-orm");
|
|
71238
71635
|
const clauses = [];
|
|
71239
|
-
if (filters.provider) clauses.push(
|
|
71240
|
-
if (filters.transport) clauses.push(
|
|
71241
|
-
if (filters.gateway) clauses.push(
|
|
71242
|
-
if (filters.domain) clauses.push(
|
|
71243
|
-
if (filters.operation) clauses.push(
|
|
71244
|
-
if (filters.sessionId) clauses.push(
|
|
71245
|
-
if (filters.taskId) clauses.push(
|
|
71246
|
-
if (filters.method) clauses.push(
|
|
71247
|
-
if (filters.confidence) clauses.push(
|
|
71248
|
-
if (filters.requestId) clauses.push(
|
|
71636
|
+
if (filters.provider) clauses.push(eq17(tokenUsage.provider, filters.provider));
|
|
71637
|
+
if (filters.transport) clauses.push(eq17(tokenUsage.transport, filters.transport));
|
|
71638
|
+
if (filters.gateway) clauses.push(eq17(tokenUsage.gateway, filters.gateway));
|
|
71639
|
+
if (filters.domain) clauses.push(eq17(tokenUsage.domain, filters.domain));
|
|
71640
|
+
if (filters.operation) clauses.push(eq17(tokenUsage.operation, filters.operation));
|
|
71641
|
+
if (filters.sessionId) clauses.push(eq17(tokenUsage.sessionId, filters.sessionId));
|
|
71642
|
+
if (filters.taskId) clauses.push(eq17(tokenUsage.taskId, filters.taskId));
|
|
71643
|
+
if (filters.method) clauses.push(eq17(tokenUsage.method, filters.method));
|
|
71644
|
+
if (filters.confidence) clauses.push(eq17(tokenUsage.confidence, filters.confidence));
|
|
71645
|
+
if (filters.requestId) clauses.push(eq17(tokenUsage.requestId, filters.requestId));
|
|
71249
71646
|
if (filters.since) clauses.push(gte4(tokenUsage.createdAt, filters.since));
|
|
71250
71647
|
if (filters.until) clauses.push(lte3(tokenUsage.createdAt, filters.until));
|
|
71251
71648
|
return clauses;
|
|
71252
71649
|
}
|
|
71253
71650
|
async function recordTokenExchange(input) {
|
|
71254
71651
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
71255
|
-
const { eq:
|
|
71652
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
71256
71653
|
const measurement = await measureTokenExchange(input);
|
|
71257
71654
|
const db = await getDb4(input.cwd);
|
|
71258
71655
|
const row = {
|
|
@@ -71281,22 +71678,22 @@ async function recordTokenExchange(input) {
|
|
|
71281
71678
|
})
|
|
71282
71679
|
};
|
|
71283
71680
|
await db.insert(tokenUsage).values(row);
|
|
71284
|
-
const inserted = await db.select().from(tokenUsage).where(
|
|
71681
|
+
const inserted = await db.select().from(tokenUsage).where(eq17(tokenUsage.id, row.id)).limit(1);
|
|
71285
71682
|
return inserted[0];
|
|
71286
71683
|
}
|
|
71287
71684
|
async function showTokenUsage(id, cwd) {
|
|
71288
71685
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
71289
|
-
const { eq:
|
|
71686
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
71290
71687
|
const db = await getDb4(cwd);
|
|
71291
|
-
const rows = await db.select().from(tokenUsage).where(
|
|
71688
|
+
const rows = await db.select().from(tokenUsage).where(eq17(tokenUsage.id, id)).limit(1);
|
|
71292
71689
|
return rows[0] ?? null;
|
|
71293
71690
|
}
|
|
71294
71691
|
async function listTokenUsage(filters = {}, cwd) {
|
|
71295
71692
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
71296
|
-
const { and:
|
|
71693
|
+
const { and: and12, count: count4, desc: desc7 } = await import("drizzle-orm");
|
|
71297
71694
|
const db = await getDb4(cwd);
|
|
71298
71695
|
const clauses = await whereClauses(filters);
|
|
71299
|
-
const where = clauses.length > 0 ?
|
|
71696
|
+
const where = clauses.length > 0 ? and12(...clauses) : void 0;
|
|
71300
71697
|
const totalRows = await db.select({ count: count4() }).from(tokenUsage);
|
|
71301
71698
|
const filteredRows = await db.select({ count: count4() }).from(tokenUsage).where(where);
|
|
71302
71699
|
let query = db.select().from(tokenUsage).orderBy(desc7(tokenUsage.createdAt));
|
|
@@ -71312,10 +71709,10 @@ async function listTokenUsage(filters = {}, cwd) {
|
|
|
71312
71709
|
}
|
|
71313
71710
|
async function summarizeTokenUsage(filters = {}, cwd) {
|
|
71314
71711
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
71315
|
-
const { and:
|
|
71712
|
+
const { and: and12, desc: desc7 } = await import("drizzle-orm");
|
|
71316
71713
|
const db = await getDb4(cwd);
|
|
71317
71714
|
const clauses = await whereClauses(filters);
|
|
71318
|
-
const where = clauses.length > 0 ?
|
|
71715
|
+
const where = clauses.length > 0 ? and12(...clauses) : void 0;
|
|
71319
71716
|
const rows = await db.select().from(tokenUsage).where(where).orderBy(desc7(tokenUsage.createdAt));
|
|
71320
71717
|
const byMethod = /* @__PURE__ */ new Map();
|
|
71321
71718
|
const byTransport = /* @__PURE__ */ new Map();
|
|
@@ -71356,17 +71753,17 @@ async function summarizeTokenUsage(filters = {}, cwd) {
|
|
|
71356
71753
|
}
|
|
71357
71754
|
async function deleteTokenUsage(id, cwd) {
|
|
71358
71755
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
71359
|
-
const { eq:
|
|
71756
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
71360
71757
|
const db = await getDb4(cwd);
|
|
71361
|
-
await db.delete(tokenUsage).where(
|
|
71758
|
+
await db.delete(tokenUsage).where(eq17(tokenUsage.id, id));
|
|
71362
71759
|
return { deleted: true, id };
|
|
71363
71760
|
}
|
|
71364
71761
|
async function clearTokenUsage(filters = {}, cwd) {
|
|
71365
71762
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
71366
|
-
const { and:
|
|
71763
|
+
const { and: and12, count: count4 } = await import("drizzle-orm");
|
|
71367
71764
|
const db = await getDb4(cwd);
|
|
71368
71765
|
const clauses = await whereClauses(filters);
|
|
71369
|
-
const where = clauses.length > 0 ?
|
|
71766
|
+
const where = clauses.length > 0 ? and12(...clauses) : void 0;
|
|
71370
71767
|
const countRows = await db.select({ count: count4() }).from(tokenUsage).where(where);
|
|
71371
71768
|
await db.delete(tokenUsage).where(where);
|
|
71372
71769
|
return { deleted: countRows[0]?.count ?? 0 };
|
|
@@ -71777,7 +72174,7 @@ __export(session_store_exports, {
|
|
|
71777
72174
|
updateSession: () => updateSession,
|
|
71778
72175
|
workHistory: () => workHistory
|
|
71779
72176
|
});
|
|
71780
|
-
import { and as
|
|
72177
|
+
import { and as and10, desc as desc6, eq as eq13, isNull as isNull4 } from "drizzle-orm";
|
|
71781
72178
|
async function createSession(session, cwd) {
|
|
71782
72179
|
const db = await getDb(cwd);
|
|
71783
72180
|
const tw = session.taskWork;
|
|
@@ -71799,7 +72196,7 @@ async function createSession(session, cwd) {
|
|
|
71799
72196
|
}
|
|
71800
72197
|
async function getSession(sessionId, cwd) {
|
|
71801
72198
|
const db = await getDb(cwd);
|
|
71802
|
-
const rows = await db.select().from(sessions).where(
|
|
72199
|
+
const rows = await db.select().from(sessions).where(eq13(sessions.id, sessionId)).all();
|
|
71803
72200
|
if (rows.length === 0) return null;
|
|
71804
72201
|
return rowToSession(rows[0]);
|
|
71805
72202
|
}
|
|
@@ -71828,16 +72225,16 @@ async function updateSession(sessionId, updates, cwd) {
|
|
|
71828
72225
|
updateRow.handoffConsumedBy = updates.handoffConsumedBy;
|
|
71829
72226
|
if (updates.debriefJson !== void 0) updateRow.debriefJson = updates.debriefJson;
|
|
71830
72227
|
if (updates.handoffJson !== void 0) updateRow.handoffJson = updates.handoffJson;
|
|
71831
|
-
db.update(sessions).set(updateRow).where(
|
|
72228
|
+
db.update(sessions).set(updateRow).where(eq13(sessions.id, sessionId)).run();
|
|
71832
72229
|
return getSession(sessionId, cwd);
|
|
71833
72230
|
}
|
|
71834
72231
|
async function listSessions2(filters, cwd) {
|
|
71835
72232
|
const db = await getDb(cwd);
|
|
71836
72233
|
const conditions = [];
|
|
71837
72234
|
if (filters?.active) {
|
|
71838
|
-
conditions.push(
|
|
72235
|
+
conditions.push(eq13(sessions.status, "active"));
|
|
71839
72236
|
}
|
|
71840
|
-
const query = db.select().from(sessions).where(conditions.length > 0 ?
|
|
72237
|
+
const query = db.select().from(sessions).where(conditions.length > 0 ? and10(...conditions) : void 0).orderBy(desc6(sessions.startedAt));
|
|
71841
72238
|
const rows = filters?.limit ? await query.limit(filters.limit).all() : await query.all();
|
|
71842
72239
|
return rows.map(rowToSession);
|
|
71843
72240
|
}
|
|
@@ -71859,20 +72256,20 @@ async function startTask2(sessionId, taskId, cwd) {
|
|
|
71859
72256
|
const db = await getDb(cwd);
|
|
71860
72257
|
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
71861
72258
|
db.update(taskWorkHistory).set({ clearedAt: now2 }).where(
|
|
71862
|
-
|
|
71863
|
-
|
|
72259
|
+
and10(
|
|
72260
|
+
eq13(taskWorkHistory.sessionId, sessionId),
|
|
71864
72261
|
isNull4(taskWorkHistory.clearedAt)
|
|
71865
72262
|
)
|
|
71866
72263
|
).run();
|
|
71867
72264
|
db.insert(taskWorkHistory).values({ sessionId, taskId, setAt: now2 }).run();
|
|
71868
|
-
db.update(sessions).set({ currentTask: taskId, taskStartedAt: now2 }).where(
|
|
72265
|
+
db.update(sessions).set({ currentTask: taskId, taskStartedAt: now2 }).where(eq13(sessions.id, sessionId)).run();
|
|
71869
72266
|
}
|
|
71870
72267
|
async function getCurrentTask(sessionId, cwd) {
|
|
71871
72268
|
const db = await getDb(cwd);
|
|
71872
72269
|
const rows = await db.select({
|
|
71873
72270
|
currentTask: sessions.currentTask,
|
|
71874
72271
|
taskStartedAt: sessions.taskStartedAt
|
|
71875
|
-
}).from(sessions).where(
|
|
72272
|
+
}).from(sessions).where(eq13(sessions.id, sessionId)).all();
|
|
71876
72273
|
if (rows.length === 0) return { taskId: null, since: null };
|
|
71877
72274
|
return { taskId: rows[0].currentTask, since: rows[0].taskStartedAt };
|
|
71878
72275
|
}
|
|
@@ -71880,16 +72277,16 @@ async function stopTask2(sessionId, cwd) {
|
|
|
71880
72277
|
const db = await getDb(cwd);
|
|
71881
72278
|
const now2 = (/* @__PURE__ */ new Date()).toISOString();
|
|
71882
72279
|
db.update(taskWorkHistory).set({ clearedAt: now2 }).where(
|
|
71883
|
-
|
|
71884
|
-
|
|
72280
|
+
and10(
|
|
72281
|
+
eq13(taskWorkHistory.sessionId, sessionId),
|
|
71885
72282
|
isNull4(taskWorkHistory.clearedAt)
|
|
71886
72283
|
)
|
|
71887
72284
|
).run();
|
|
71888
|
-
db.update(sessions).set({ currentTask: null, taskStartedAt: null }).where(
|
|
72285
|
+
db.update(sessions).set({ currentTask: null, taskStartedAt: null }).where(eq13(sessions.id, sessionId)).run();
|
|
71889
72286
|
}
|
|
71890
72287
|
async function workHistory(sessionId, limit = 50, cwd) {
|
|
71891
72288
|
const db = await getDb(cwd);
|
|
71892
|
-
const rows = await db.select().from(taskWorkHistory).where(
|
|
72289
|
+
const rows = await db.select().from(taskWorkHistory).where(eq13(taskWorkHistory.sessionId, sessionId)).orderBy(desc6(taskWorkHistory.setAt), desc6(taskWorkHistory.id)).limit(limit).all();
|
|
71893
72290
|
return rows.map((r) => ({
|
|
71894
72291
|
taskId: r.taskId,
|
|
71895
72292
|
setAt: r.setAt,
|
|
@@ -71900,16 +72297,16 @@ async function gcSessions2(maxAgeDays = 30, cwd) {
|
|
|
71900
72297
|
const db = await getDb(cwd);
|
|
71901
72298
|
const threshold = /* @__PURE__ */ new Date();
|
|
71902
72299
|
threshold.setDate(threshold.getDate() - maxAgeDays);
|
|
71903
|
-
const before = await db.select({ id: sessions.id }).from(sessions).where(
|
|
72300
|
+
const before = await db.select({ id: sessions.id }).from(sessions).where(and10(eq13(sessions.status, "ended"))).all();
|
|
71904
72301
|
const toUpdate = before;
|
|
71905
72302
|
if (toUpdate.length > 0) {
|
|
71906
|
-
db.update(sessions).set({ status: "orphaned" }).where(
|
|
72303
|
+
db.update(sessions).set({ status: "orphaned" }).where(eq13(sessions.status, "ended")).run();
|
|
71907
72304
|
}
|
|
71908
72305
|
return toUpdate.length;
|
|
71909
72306
|
}
|
|
71910
72307
|
async function getActiveSession(cwd) {
|
|
71911
72308
|
const db = await getDb(cwd);
|
|
71912
|
-
const rows = await db.select().from(sessions).where(
|
|
72309
|
+
const rows = await db.select().from(sessions).where(eq13(sessions.status, "active")).orderBy(desc6(sessions.startedAt)).limit(1).all();
|
|
71913
72310
|
if (rows.length === 0) return null;
|
|
71914
72311
|
return rowToSession(rows[0]);
|
|
71915
72312
|
}
|
|
@@ -71923,7 +72320,7 @@ var init_session_store = __esm({
|
|
|
71923
72320
|
});
|
|
71924
72321
|
|
|
71925
72322
|
// packages/core/src/store/cross-db-cleanup.ts
|
|
71926
|
-
import { eq as
|
|
72323
|
+
import { eq as eq14, or as or5 } from "drizzle-orm";
|
|
71927
72324
|
async function cleanupBrainRefsOnTaskDelete(taskId, cwd) {
|
|
71928
72325
|
let brainDb = null;
|
|
71929
72326
|
try {
|
|
@@ -71933,16 +72330,16 @@ async function cleanupBrainRefsOnTaskDelete(taskId, cwd) {
|
|
|
71933
72330
|
}
|
|
71934
72331
|
const nodeId = `task:${taskId}`;
|
|
71935
72332
|
try {
|
|
71936
|
-
await brainDb.update(brainDecisions).set({ contextEpicId: null }).where(
|
|
71937
|
-
await brainDb.update(brainDecisions).set({ contextTaskId: null }).where(
|
|
71938
|
-
await brainDb.delete(brainMemoryLinks).where(
|
|
72333
|
+
await brainDb.update(brainDecisions).set({ contextEpicId: null }).where(eq14(brainDecisions.contextEpicId, taskId));
|
|
72334
|
+
await brainDb.update(brainDecisions).set({ contextTaskId: null }).where(eq14(brainDecisions.contextTaskId, taskId));
|
|
72335
|
+
await brainDb.delete(brainMemoryLinks).where(eq14(brainMemoryLinks.taskId, taskId));
|
|
71939
72336
|
await brainDb.delete(brainPageEdges).where(
|
|
71940
72337
|
or5(
|
|
71941
|
-
|
|
71942
|
-
|
|
72338
|
+
eq14(brainPageEdges.fromId, nodeId),
|
|
72339
|
+
eq14(brainPageEdges.toId, nodeId)
|
|
71943
72340
|
)
|
|
71944
72341
|
);
|
|
71945
|
-
await brainDb.delete(brainPageNodes).where(
|
|
72342
|
+
await brainDb.delete(brainPageNodes).where(eq14(brainPageNodes.id, nodeId));
|
|
71946
72343
|
} catch {
|
|
71947
72344
|
}
|
|
71948
72345
|
}
|
|
@@ -71955,12 +72352,12 @@ var init_cross_db_cleanup = __esm({
|
|
|
71955
72352
|
});
|
|
71956
72353
|
|
|
71957
72354
|
// packages/core/src/store/data-safety.ts
|
|
71958
|
-
import { eq as
|
|
72355
|
+
import { eq as eq15 } from "drizzle-orm";
|
|
71959
72356
|
async function checkTaskExists(taskId, cwd, config2 = {}) {
|
|
71960
72357
|
const cfg = { ...DEFAULT_CONFIG2, ...config2 };
|
|
71961
72358
|
if (!cfg.detectCollisions) return false;
|
|
71962
72359
|
const db = await getDb(cwd);
|
|
71963
|
-
const existing = await db.select().from(tasks).where(
|
|
72360
|
+
const existing = await db.select().from(tasks).where(eq15(tasks.id, taskId)).all();
|
|
71964
72361
|
const exists2 = existing.length > 0;
|
|
71965
72362
|
if (exists2 && cfg.strictMode) {
|
|
71966
72363
|
throw new SafetyError(
|
|
@@ -72108,7 +72505,7 @@ __export(task_store_exports, {
|
|
|
72108
72505
|
updateTask: () => updateTask2,
|
|
72109
72506
|
updateTaskSafe: () => updateTaskSafe
|
|
72110
72507
|
});
|
|
72111
|
-
import { and as
|
|
72508
|
+
import { and as and11, asc as asc4, count as count3, eq as eq16, inArray as inArray6, isNull as isNull5, ne as ne3, sql as sql11 } from "drizzle-orm";
|
|
72112
72509
|
async function insertTaskRow(task, cwd) {
|
|
72113
72510
|
const db = await getDb(cwd);
|
|
72114
72511
|
const row = taskToRow(task);
|
|
@@ -72122,10 +72519,10 @@ async function insertTaskRow(task, cwd) {
|
|
|
72122
72519
|
}
|
|
72123
72520
|
async function getTask(taskId, cwd) {
|
|
72124
72521
|
const db = await getDb(cwd);
|
|
72125
|
-
const rows = await db.select().from(tasks).where(
|
|
72522
|
+
const rows = await db.select().from(tasks).where(eq16(tasks.id, taskId)).all();
|
|
72126
72523
|
if (rows.length === 0) return null;
|
|
72127
72524
|
const task = rowToTask(rows[0]);
|
|
72128
|
-
const deps = await db.select().from(taskDependencies).where(
|
|
72525
|
+
const deps = await db.select().from(taskDependencies).where(eq16(taskDependencies.taskId, taskId)).all();
|
|
72129
72526
|
if (deps.length > 0) {
|
|
72130
72527
|
task.depends = deps.map((d) => d.dependsOn);
|
|
72131
72528
|
}
|
|
@@ -72161,9 +72558,9 @@ async function updateTask2(taskId, updates, cwd) {
|
|
|
72161
72558
|
updateRow.cancellationReason = updates.cancellationReason;
|
|
72162
72559
|
if (updates.verification !== void 0)
|
|
72163
72560
|
updateRow.verificationJson = JSON.stringify(updates.verification);
|
|
72164
|
-
db.update(tasks).set(updateRow).where(
|
|
72561
|
+
db.update(tasks).set(updateRow).where(eq16(tasks.id, taskId)).run();
|
|
72165
72562
|
if (updates.depends !== void 0) {
|
|
72166
|
-
db.delete(taskDependencies).where(
|
|
72563
|
+
db.delete(taskDependencies).where(eq16(taskDependencies.taskId, taskId)).run();
|
|
72167
72564
|
for (const depId of updates.depends) {
|
|
72168
72565
|
db.insert(taskDependencies).values({ taskId, dependsOn: depId }).run();
|
|
72169
72566
|
}
|
|
@@ -72172,9 +72569,9 @@ async function updateTask2(taskId, updates, cwd) {
|
|
|
72172
72569
|
}
|
|
72173
72570
|
async function deleteTask2(taskId, cwd) {
|
|
72174
72571
|
const db = await getDb(cwd);
|
|
72175
|
-
const existing = await db.select({ id: tasks.id }).from(tasks).where(
|
|
72572
|
+
const existing = await db.select({ id: tasks.id }).from(tasks).where(eq16(tasks.id, taskId)).all();
|
|
72176
72573
|
if (existing.length === 0) return false;
|
|
72177
|
-
db.delete(tasks).where(
|
|
72574
|
+
db.delete(tasks).where(eq16(tasks.id, taskId)).run();
|
|
72178
72575
|
void cleanupBrainRefsOnTaskDelete(taskId, cwd);
|
|
72179
72576
|
return true;
|
|
72180
72577
|
}
|
|
@@ -72182,17 +72579,17 @@ async function listTasks2(filters, cwd) {
|
|
|
72182
72579
|
const db = await getDb(cwd);
|
|
72183
72580
|
const conditions = [];
|
|
72184
72581
|
conditions.push(ne3(tasks.status, "archived"));
|
|
72185
|
-
if (filters?.status) conditions.push(
|
|
72582
|
+
if (filters?.status) conditions.push(eq16(tasks.status, filters.status));
|
|
72186
72583
|
if (filters?.parentId !== void 0) {
|
|
72187
72584
|
if (filters.parentId === null) {
|
|
72188
72585
|
conditions.push(isNull5(tasks.parentId));
|
|
72189
72586
|
} else {
|
|
72190
|
-
conditions.push(
|
|
72587
|
+
conditions.push(eq16(tasks.parentId, filters.parentId));
|
|
72191
72588
|
}
|
|
72192
72589
|
}
|
|
72193
|
-
if (filters?.type) conditions.push(
|
|
72194
|
-
if (filters?.phase) conditions.push(
|
|
72195
|
-
const query = db.select().from(tasks).where(conditions.length > 0 ?
|
|
72590
|
+
if (filters?.type) conditions.push(eq16(tasks.type, filters.type));
|
|
72591
|
+
if (filters?.phase) conditions.push(eq16(tasks.phase, filters.phase));
|
|
72592
|
+
const query = db.select().from(tasks).where(conditions.length > 0 ? and11(...conditions) : void 0).orderBy(asc4(tasks.position), asc4(tasks.createdAt));
|
|
72196
72593
|
const rows = filters?.limit ? await query.limit(filters.limit).all() : await query.all();
|
|
72197
72594
|
const tasks2 = rows.map(rowToTask);
|
|
72198
72595
|
await loadDependencies(tasks2, cwd);
|
|
@@ -72202,7 +72599,7 @@ async function findTasks2(query, limit = 20, cwd) {
|
|
|
72202
72599
|
const db = await getDb(cwd);
|
|
72203
72600
|
const pattern = `%${query}%`;
|
|
72204
72601
|
const rows = await db.select().from(tasks).where(
|
|
72205
|
-
|
|
72602
|
+
and11(
|
|
72206
72603
|
ne3(tasks.status, "archived"),
|
|
72207
72604
|
sql11`(${tasks.id} LIKE ${pattern} OR ${tasks.title} LIKE ${pattern} OR ${tasks.description} LIKE ${pattern})`
|
|
72208
72605
|
)
|
|
@@ -72221,14 +72618,14 @@ async function archiveTask(taskId, reason, cwd) {
|
|
|
72221
72618
|
archiveReason: reason ?? "completed",
|
|
72222
72619
|
cycleTimeDays: cycleTime,
|
|
72223
72620
|
updatedAt: now2
|
|
72224
|
-
}).where(
|
|
72621
|
+
}).where(eq16(tasks.id, taskId)).run();
|
|
72225
72622
|
return true;
|
|
72226
72623
|
}
|
|
72227
72624
|
async function loadDependencies(tasks2, cwd) {
|
|
72228
72625
|
if (tasks2.length === 0) return;
|
|
72229
72626
|
const db = await getDb(cwd);
|
|
72230
72627
|
const taskIds = tasks2.map((t) => t.id);
|
|
72231
|
-
const deps = await db.select().from(taskDependencies).where(
|
|
72628
|
+
const deps = await db.select().from(taskDependencies).where(inArray6(taskDependencies.taskId, taskIds)).all();
|
|
72232
72629
|
const depMap = /* @__PURE__ */ new Map();
|
|
72233
72630
|
for (const dep of deps) {
|
|
72234
72631
|
if (!depMap.has(dep.taskId)) depMap.set(dep.taskId, []);
|
|
@@ -72248,9 +72645,9 @@ async function addDependency(taskId, dependsOn, cwd) {
|
|
|
72248
72645
|
async function removeDependency(taskId, dependsOn, cwd) {
|
|
72249
72646
|
const db = await getDb(cwd);
|
|
72250
72647
|
db.delete(taskDependencies).where(
|
|
72251
|
-
|
|
72252
|
-
|
|
72253
|
-
|
|
72648
|
+
and11(
|
|
72649
|
+
eq16(taskDependencies.taskId, taskId),
|
|
72650
|
+
eq16(taskDependencies.dependsOn, dependsOn)
|
|
72254
72651
|
)
|
|
72255
72652
|
).run();
|
|
72256
72653
|
}
|
|
@@ -72260,7 +72657,7 @@ async function addRelation(taskId, relatedTo, relationType = "related", cwd, rea
|
|
|
72260
72657
|
}
|
|
72261
72658
|
async function getRelations(taskId, cwd) {
|
|
72262
72659
|
const db = await getDb(cwd);
|
|
72263
|
-
const rows = await db.select().from(taskRelations).where(
|
|
72660
|
+
const rows = await db.select().from(taskRelations).where(eq16(taskRelations.taskId, taskId)).all();
|
|
72264
72661
|
return rows.map((r) => ({
|
|
72265
72662
|
relatedTo: r.relatedTo,
|
|
72266
72663
|
type: r.relationType,
|
|
@@ -72284,7 +72681,7 @@ async function getBlockerChain(taskId, cwd) {
|
|
|
72284
72681
|
}
|
|
72285
72682
|
async function getChildren2(parentId, cwd) {
|
|
72286
72683
|
const db = await getDb(cwd);
|
|
72287
|
-
const rows = await db.select().from(tasks).where(
|
|
72684
|
+
const rows = await db.select().from(tasks).where(eq16(tasks.parentId, parentId)).orderBy(asc4(tasks.position), asc4(tasks.createdAt)).all();
|
|
72288
72685
|
return rows.map(rowToTask);
|
|
72289
72686
|
}
|
|
72290
72687
|
async function getSubtree(rootId, cwd) {
|
|
@@ -73889,10 +74286,10 @@ async function migrateJsonToSqlite2(cwd, options) {
|
|
|
73889
74286
|
const jsonCounts = countJsonRecords(cleoDir);
|
|
73890
74287
|
result.jsonCounts = jsonCounts;
|
|
73891
74288
|
if (dbExists(cwd)) {
|
|
73892
|
-
const { ne: ne4, eq:
|
|
74289
|
+
const { ne: ne4, eq: eq17, count: count4 } = await import("drizzle-orm");
|
|
73893
74290
|
const db2 = await getDb(cwd);
|
|
73894
74291
|
const tasksResult = await db2.select({ count: count4() }).from(tasks).where(ne4(tasks.status, "archived")).get();
|
|
73895
|
-
const archivedResult = await db2.select({ count: count4() }).from(tasks).where(
|
|
74292
|
+
const archivedResult = await db2.select({ count: count4() }).from(tasks).where(eq17(tasks.status, "archived")).get();
|
|
73896
74293
|
const sessionsResult = await db2.select({ count: count4() }).from(sessions).get();
|
|
73897
74294
|
const existingCounts = {
|
|
73898
74295
|
tasks: tasksResult?.count ?? 0,
|
|
@@ -74076,10 +74473,10 @@ async function migrateJsonToSqlite2(cwd, options) {
|
|
|
74076
74473
|
async function exportToJson(cwd) {
|
|
74077
74474
|
const { listTasks: listTasks3 } = await Promise.resolve().then(() => (init_task_store(), task_store_exports));
|
|
74078
74475
|
const { listSessions: listSessions3 } = await Promise.resolve().then(() => (init_session_store(), session_store_exports));
|
|
74079
|
-
const { eq:
|
|
74476
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
74080
74477
|
const tasks2 = await listTasks3(void 0, cwd);
|
|
74081
74478
|
const db = await getDb(cwd);
|
|
74082
|
-
const archivedRows = await db.select().from(tasks).where(
|
|
74479
|
+
const archivedRows = await db.select().from(tasks).where(eq17(tasks.status, "archived")).all();
|
|
74083
74480
|
const archived = archivedRows.map((row) => ({
|
|
74084
74481
|
id: row.id,
|
|
74085
74482
|
title: row.title,
|
|
@@ -76663,7 +77060,7 @@ async function validateSqliteRows(type, projectRoot) {
|
|
|
76663
77060
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_sqlite2(), sqlite_exports));
|
|
76664
77061
|
const schemaTable = await Promise.resolve().then(() => (init_tasks_schema(), tasks_schema_exports));
|
|
76665
77062
|
const zodSchemas = await Promise.resolve().then(() => (init_validation_schemas(), validation_schemas_exports));
|
|
76666
|
-
const { ne: ne4, eq:
|
|
77063
|
+
const { ne: ne4, eq: eq17 } = await import("drizzle-orm");
|
|
76667
77064
|
const db = await getDb4(projectRoot);
|
|
76668
77065
|
const errors = [];
|
|
76669
77066
|
switch (type) {
|
|
@@ -76675,7 +77072,7 @@ async function validateSqliteRows(type, projectRoot) {
|
|
|
76675
77072
|
break;
|
|
76676
77073
|
}
|
|
76677
77074
|
case "archive": {
|
|
76678
|
-
const rows = await db.select().from(schemaTable.tasks).where(
|
|
77075
|
+
const rows = await db.select().from(schemaTable.tasks).where(eq17(schemaTable.tasks.status, "archived"));
|
|
76679
77076
|
for (const row of rows) {
|
|
76680
77077
|
errors.push(...collectZodErrors(zodSchemas.selectTaskSchema.safeParse(row), row.id));
|
|
76681
77078
|
}
|
|
@@ -77751,6 +78148,7 @@ __export(internal_exports, {
|
|
|
77751
78148
|
GATE_VALIDATION_RULES: () => GATE_VALIDATION_RULES,
|
|
77752
78149
|
GateLayer: () => GateLayer,
|
|
77753
78150
|
GateStatus: () => GateStatus,
|
|
78151
|
+
HEARTBEAT_INTERVAL_MS: () => HEARTBEAT_INTERVAL_MS,
|
|
77754
78152
|
HookRegistry: () => HookRegistry,
|
|
77755
78153
|
LIFECYCLE_PIPELINE_STATUSES: () => LIFECYCLE_PIPELINE_STATUSES,
|
|
77756
78154
|
LIFECYCLE_STAGE_STATUSES: () => LIFECYCLE_STAGE_STATUSES,
|
|
@@ -77764,6 +78162,7 @@ __export(internal_exports, {
|
|
|
77764
78162
|
RateLimiter: () => RateLimiter,
|
|
77765
78163
|
SESSION_STATUSES: () => SESSION_STATUSES,
|
|
77766
78164
|
STAGE_STATUS_ICONS: () => STAGE_STATUS_ICONS,
|
|
78165
|
+
STALE_THRESHOLD_MS: () => STALE_THRESHOLD_MS,
|
|
77767
78166
|
STATUS_REGISTRY: () => STATUS_REGISTRY,
|
|
77768
78167
|
STRICTNESS_PRESETS: () => STRICTNESS_PRESETS,
|
|
77769
78168
|
SecurityError: () => SecurityError,
|
|
@@ -77843,7 +78242,7 @@ __export(internal_exports, {
|
|
|
77843
78242
|
canRunNatively: () => canRunNatively,
|
|
77844
78243
|
cancelRelease: () => cancelRelease,
|
|
77845
78244
|
channelToDistTag: () => channelToDistTag,
|
|
77846
|
-
checkAgentHealth: () =>
|
|
78245
|
+
checkAgentHealth: () => checkAgentHealth2,
|
|
77847
78246
|
checkConsensusManifest: () => checkConsensusManifest,
|
|
77848
78247
|
checkContributionManifest: () => checkContributionManifest,
|
|
77849
78248
|
checkDecompositionManifest: () => checkDecompositionManifest,
|
|
@@ -77875,6 +78274,7 @@ __export(internal_exports, {
|
|
|
77875
78274
|
computeBriefing: () => computeBriefing,
|
|
77876
78275
|
computeChecksum: () => computeChecksum,
|
|
77877
78276
|
computeDebrief: () => computeDebrief,
|
|
78277
|
+
computeDelay: () => computeDelay,
|
|
77878
78278
|
computeEpicStatus: () => computeEpicStatus,
|
|
77879
78279
|
computeHandoff: () => computeHandoff,
|
|
77880
78280
|
computeHelp: () => computeHelp,
|
|
@@ -77947,9 +78347,11 @@ __export(internal_exports, {
|
|
|
77947
78347
|
deleteTokenUsage: () => deleteTokenUsage,
|
|
77948
78348
|
deregisterAgent: () => deregisterAgent,
|
|
77949
78349
|
describeChannel: () => describeChannel,
|
|
78350
|
+
detectCrashedAgents: () => detectCrashedAgents,
|
|
77950
78351
|
detectEnvMode: () => detectEnvMode,
|
|
77951
78352
|
detectPlatform: () => detectPlatform,
|
|
77952
78353
|
detectProjectType: () => detectProjectType,
|
|
78354
|
+
detectStaleAgents: () => detectStaleAgents,
|
|
77953
78355
|
detectVersion: () => detectVersion,
|
|
77954
78356
|
determineInstallationTargets: () => determineInstallationTargets,
|
|
77955
78357
|
discoverRelated: () => discoverRelated2,
|
|
@@ -77979,6 +78381,7 @@ __export(internal_exports, {
|
|
|
77979
78381
|
findAdrs: () => findAdrs,
|
|
77980
78382
|
findLeastLoadedAgent: () => findLeastLoadedAgent,
|
|
77981
78383
|
findSessions: () => findSessions,
|
|
78384
|
+
findStaleAgentRows: () => checkAgentHealth,
|
|
77982
78385
|
findTasks: () => findTasks,
|
|
77983
78386
|
formatError: () => formatError3,
|
|
77984
78387
|
formatOutput: () => formatOutput,
|
|
@@ -78138,6 +78541,7 @@ __export(internal_exports, {
|
|
|
78138
78541
|
isValidStatus: () => isValidStatus,
|
|
78139
78542
|
isValidWorkflowGateName: () => isValidWorkflowGateName,
|
|
78140
78543
|
issue: () => issue_exports,
|
|
78544
|
+
lib: () => lib_exports,
|
|
78141
78545
|
lifecycle: () => lifecycle_exports,
|
|
78142
78546
|
lifecycleEvidenceTypeSchema: () => lifecycleEvidenceTypeSchema,
|
|
78143
78547
|
lifecycleGateResultSchema: () => lifecycleGateResultSchema,
|
|
@@ -78238,6 +78642,7 @@ __export(internal_exports, {
|
|
|
78238
78642
|
pipelineManifestPending: () => pipelineManifestPending,
|
|
78239
78643
|
pipelineManifestShow: () => pipelineManifestShow,
|
|
78240
78644
|
pipelineManifestStats: () => pipelineManifestStats,
|
|
78645
|
+
predictImpact: () => predictImpact,
|
|
78241
78646
|
predictValidationOutcome: () => predictValidationOutcome,
|
|
78242
78647
|
prepareRelease: () => prepareRelease,
|
|
78243
78648
|
prepareSpawn: () => prepareSpawn,
|
|
@@ -78262,6 +78667,7 @@ __export(internal_exports, {
|
|
|
78262
78667
|
recordAssumption: () => recordAssumption,
|
|
78263
78668
|
recordDecision: () => recordDecision,
|
|
78264
78669
|
recordFailurePattern: () => recordFailurePattern,
|
|
78670
|
+
recordHeartbeat: () => recordHeartbeat,
|
|
78265
78671
|
recordStageProgress: () => recordStageProgress,
|
|
78266
78672
|
recordTokenExchange: () => recordTokenExchange,
|
|
78267
78673
|
recoverCrashedAgents: () => recoverCrashedAgents,
|
|
@@ -78398,6 +78804,7 @@ __export(internal_exports, {
|
|
|
78398
78804
|
validateWorkflowGateUpdate: () => validateWorkflowGateUpdate,
|
|
78399
78805
|
validation: () => validation_exports,
|
|
78400
78806
|
withRetry: () => withRetry,
|
|
78807
|
+
withRetryShared: () => withRetry2,
|
|
78401
78808
|
writeMemoryBridge: () => writeMemoryBridge,
|
|
78402
78809
|
writeSnapshot: () => writeSnapshot
|
|
78403
78810
|
});
|
|
@@ -78422,6 +78829,7 @@ var init_internal = __esm({
|
|
|
78422
78829
|
init_patterns2();
|
|
78423
78830
|
init_prediction();
|
|
78424
78831
|
init_diagnostics();
|
|
78832
|
+
init_retry2();
|
|
78425
78833
|
init_chain_store();
|
|
78426
78834
|
init_lifecycle2();
|
|
78427
78835
|
init_tessera_engine();
|
|
@@ -80441,6 +80849,30 @@ var OPERATIONS = [
|
|
|
80441
80849
|
sessionRequired: false,
|
|
80442
80850
|
requiredParams: []
|
|
80443
80851
|
},
|
|
80852
|
+
{
|
|
80853
|
+
gateway: "query",
|
|
80854
|
+
domain: "tasks",
|
|
80855
|
+
operation: "impact",
|
|
80856
|
+
description: "tasks.impact (query) \u2014 predict downstream effects of a free-text change description using keyword matching and reverse dependency graph traversal",
|
|
80857
|
+
tier: 1,
|
|
80858
|
+
idempotent: true,
|
|
80859
|
+
sessionRequired: false,
|
|
80860
|
+
requiredParams: ["change"],
|
|
80861
|
+
params: [
|
|
80862
|
+
{
|
|
80863
|
+
name: "change",
|
|
80864
|
+
type: "string",
|
|
80865
|
+
required: true,
|
|
80866
|
+
description: 'Free-text description of the proposed change (e.g. "Modify authentication flow")'
|
|
80867
|
+
},
|
|
80868
|
+
{
|
|
80869
|
+
name: "matchLimit",
|
|
80870
|
+
type: "number",
|
|
80871
|
+
required: false,
|
|
80872
|
+
description: "Maximum number of seed tasks to match by keyword (default: 5)"
|
|
80873
|
+
}
|
|
80874
|
+
]
|
|
80875
|
+
},
|
|
80444
80876
|
{
|
|
80445
80877
|
gateway: "query",
|
|
80446
80878
|
domain: "tasks",
|
|
@@ -84781,10 +85213,10 @@ async function releaseShip(params, projectRoot) {
|
|
|
84781
85213
|
);
|
|
84782
85214
|
const { getDb: getDb4 } = await Promise.resolve().then(() => (init_internal(), internal_exports));
|
|
84783
85215
|
const { releaseManifests: releaseManifests2 } = await Promise.resolve().then(() => (init_internal(), internal_exports));
|
|
84784
|
-
const { eq:
|
|
85216
|
+
const { eq: eq17 } = await import("drizzle-orm");
|
|
84785
85217
|
const normalizedVer = version2.startsWith("v") ? version2 : `v${version2}`;
|
|
84786
85218
|
const db = await getDb4(cwd);
|
|
84787
|
-
await db.update(releaseManifests2).set({ epicId }).where(
|
|
85219
|
+
await db.update(releaseManifests2).set({ epicId }).where(eq17(releaseManifests2.version, normalizedVer)).run();
|
|
84788
85220
|
await generateReleaseChangelog(version2, () => loadTasks2(projectRoot), cwd);
|
|
84789
85221
|
}
|
|
84790
85222
|
logStep(0, 8, "Auto-prepare release record", true);
|
|
@@ -86016,6 +86448,15 @@ async function taskAnalyze(projectRoot, taskId, params) {
|
|
|
86016
86448
|
return engineError("E_GENERAL", `Task analysis failed: ${message}`);
|
|
86017
86449
|
}
|
|
86018
86450
|
}
|
|
86451
|
+
async function taskImpact(projectRoot, change, matchLimit) {
|
|
86452
|
+
try {
|
|
86453
|
+
const result = await predictImpact(change, projectRoot, void 0, matchLimit);
|
|
86454
|
+
return { success: true, data: result };
|
|
86455
|
+
} catch (err) {
|
|
86456
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
86457
|
+
return engineError("E_GENERAL", `Impact prediction failed: ${message}`);
|
|
86458
|
+
}
|
|
86459
|
+
}
|
|
86019
86460
|
async function taskRestore(projectRoot, taskId, params) {
|
|
86020
86461
|
try {
|
|
86021
86462
|
const result = await coreTaskRestore(projectRoot, taskId, params);
|
|
@@ -90914,6 +91355,22 @@ var TasksHandler = class {
|
|
|
90914
91355
|
const result = await taskAnalyze(projectRoot, taskId, { tierLimit });
|
|
90915
91356
|
return wrapResult(result, "query", "tasks", operation, startTime);
|
|
90916
91357
|
}
|
|
91358
|
+
case "impact": {
|
|
91359
|
+
const change = params?.change;
|
|
91360
|
+
if (!change) {
|
|
91361
|
+
return errorResult(
|
|
91362
|
+
"query",
|
|
91363
|
+
"tasks",
|
|
91364
|
+
operation,
|
|
91365
|
+
"E_INVALID_INPUT",
|
|
91366
|
+
"change is required (free-text description of the proposed change)",
|
|
91367
|
+
startTime
|
|
91368
|
+
);
|
|
91369
|
+
}
|
|
91370
|
+
const matchLimit = params?.matchLimit;
|
|
91371
|
+
const result = await taskImpact(projectRoot, change, matchLimit);
|
|
91372
|
+
return wrapResult(result, "query", "tasks", operation, startTime);
|
|
91373
|
+
}
|
|
90917
91374
|
case "next": {
|
|
90918
91375
|
const result = await taskNext(
|
|
90919
91376
|
projectRoot,
|
|
@@ -91162,6 +91619,7 @@ var TasksHandler = class {
|
|
|
91162
91619
|
"blockers",
|
|
91163
91620
|
"depends",
|
|
91164
91621
|
"analyze",
|
|
91622
|
+
"impact",
|
|
91165
91623
|
"next",
|
|
91166
91624
|
"plan",
|
|
91167
91625
|
"relates",
|
|
@@ -92884,6 +93342,87 @@ function registerAdrCommand(program) {
|
|
|
92884
93342
|
});
|
|
92885
93343
|
}
|
|
92886
93344
|
|
|
93345
|
+
// packages/cleo/src/cli/commands/agents.ts
|
|
93346
|
+
init_internal();
|
|
93347
|
+
init_renderers();
|
|
93348
|
+
function registerAgentsCommand(program) {
|
|
93349
|
+
const agents = program.command("agents").description("Agent management and health monitoring");
|
|
93350
|
+
agents.command("health").description("Check agent health and detect stale or crashed agents").option("--id <agentId>", "Check health for a specific agent ID").option(
|
|
93351
|
+
"--threshold <ms>",
|
|
93352
|
+
"Staleness threshold in milliseconds (default: 180000 = 3 minutes)",
|
|
93353
|
+
String(STALE_THRESHOLD_MS)
|
|
93354
|
+
).option("--detect-crashed", "Detect and mark crashed agents (write operation \u2014 updates DB)").action(async (opts) => {
|
|
93355
|
+
const thresholdMs = typeof opts["threshold"] === "string" ? Number(opts["threshold"]) : STALE_THRESHOLD_MS;
|
|
93356
|
+
const agentId = opts["id"];
|
|
93357
|
+
const detectCrashed = Boolean(opts["detectCrashed"]);
|
|
93358
|
+
if (agentId) {
|
|
93359
|
+
const health = await checkAgentHealth2(agentId, thresholdMs);
|
|
93360
|
+
if (!health) {
|
|
93361
|
+
cliOutput(
|
|
93362
|
+
{
|
|
93363
|
+
success: false,
|
|
93364
|
+
error: { code: "E_NOT_FOUND", message: `Agent not found: ${agentId}` }
|
|
93365
|
+
},
|
|
93366
|
+
{ command: "agents health" }
|
|
93367
|
+
);
|
|
93368
|
+
process.exitCode = 4;
|
|
93369
|
+
return;
|
|
93370
|
+
}
|
|
93371
|
+
cliOutput({ success: true, data: health }, { command: "agents health" });
|
|
93372
|
+
return;
|
|
93373
|
+
}
|
|
93374
|
+
if (detectCrashed) {
|
|
93375
|
+
const crashed = await detectCrashedAgents(thresholdMs);
|
|
93376
|
+
cliOutput(
|
|
93377
|
+
{
|
|
93378
|
+
success: true,
|
|
93379
|
+
data: {
|
|
93380
|
+
detectedCrashed: crashed.length,
|
|
93381
|
+
agents: crashed.map((a) => ({
|
|
93382
|
+
id: a.id,
|
|
93383
|
+
agentType: a.agentType,
|
|
93384
|
+
lastHeartbeat: a.lastHeartbeat,
|
|
93385
|
+
status: a.status
|
|
93386
|
+
}))
|
|
93387
|
+
}
|
|
93388
|
+
},
|
|
93389
|
+
{ command: "agents health" }
|
|
93390
|
+
);
|
|
93391
|
+
return;
|
|
93392
|
+
}
|
|
93393
|
+
const [report, stale] = await Promise.all([
|
|
93394
|
+
getHealthReport(thresholdMs),
|
|
93395
|
+
detectStaleAgents(thresholdMs)
|
|
93396
|
+
]);
|
|
93397
|
+
cliOutput(
|
|
93398
|
+
{
|
|
93399
|
+
success: true,
|
|
93400
|
+
data: {
|
|
93401
|
+
summary: {
|
|
93402
|
+
total: report.total,
|
|
93403
|
+
active: report.active,
|
|
93404
|
+
idle: report.idle,
|
|
93405
|
+
starting: report.starting,
|
|
93406
|
+
error: report.error,
|
|
93407
|
+
crashed: report.crashed,
|
|
93408
|
+
stopped: report.stopped,
|
|
93409
|
+
totalErrors: report.totalErrors
|
|
93410
|
+
},
|
|
93411
|
+
staleAgents: stale.map((s) => ({
|
|
93412
|
+
id: s.agentId,
|
|
93413
|
+
status: s.status,
|
|
93414
|
+
heartbeatAgeMs: s.heartbeatAgeMs,
|
|
93415
|
+
lastHeartbeat: s.lastHeartbeat,
|
|
93416
|
+
thresholdMs: s.thresholdMs
|
|
93417
|
+
})),
|
|
93418
|
+
thresholdMs
|
|
93419
|
+
}
|
|
93420
|
+
},
|
|
93421
|
+
{ command: "agents health" }
|
|
93422
|
+
);
|
|
93423
|
+
});
|
|
93424
|
+
}
|
|
93425
|
+
|
|
92887
93426
|
// packages/cleo/src/cli/commands/analyze.ts
|
|
92888
93427
|
function registerAnalyzeCommand(program) {
|
|
92889
93428
|
program.command("analyze").description("Task triage with leverage scoring and bottleneck detection").option("--auto-start", "Automatically start working on recommended task").action(async () => {
|
|
@@ -92940,7 +93479,7 @@ function registerBackfillCommand(program) {
|
|
|
92940
93479
|
const root = getProjectRoot();
|
|
92941
93480
|
const dryRun = !!opts.dryRun;
|
|
92942
93481
|
const rollback = !!opts.rollback;
|
|
92943
|
-
const taskIds = opts.tasks
|
|
93482
|
+
const taskIds = opts.tasks?.trim() ? opts.tasks.split(",").map((s) => s.trim()).filter(Boolean) : void 0;
|
|
92944
93483
|
if (dryRun) {
|
|
92945
93484
|
console.log("[dry run] No changes will be made.\n");
|
|
92946
93485
|
}
|
|
@@ -95812,6 +96351,78 @@ function registerPromoteCommand(program) {
|
|
|
95812
96351
|
});
|
|
95813
96352
|
}
|
|
95814
96353
|
|
|
96354
|
+
// packages/cleo/src/cli/commands/reason.ts
|
|
96355
|
+
function registerReasonCommand(program) {
|
|
96356
|
+
const reason = program.command("reason").description("Reasoning and intelligence operations (why, similar, impact, timeline)");
|
|
96357
|
+
reason.command("why <taskId>").description("Explain why a task exists via causal trace through dependency chains").option("--json", "Output raw JSON envelope").action(async (taskId) => {
|
|
96358
|
+
await dispatchFromCli(
|
|
96359
|
+
"query",
|
|
96360
|
+
"memory",
|
|
96361
|
+
"reason.why",
|
|
96362
|
+
{ taskId },
|
|
96363
|
+
{ command: "reason", operation: "memory.reason.why" }
|
|
96364
|
+
);
|
|
96365
|
+
});
|
|
96366
|
+
reason.command("similar <taskId>").description("Find BRAIN entries semantically similar to a task or observation ID").option("--limit <n>", "Maximum number of results to return", parseInt).option("--json", "Output raw JSON envelope").action(async (taskId, opts) => {
|
|
96367
|
+
await dispatchFromCli(
|
|
96368
|
+
"query",
|
|
96369
|
+
"memory",
|
|
96370
|
+
"reason.similar",
|
|
96371
|
+
{
|
|
96372
|
+
entryId: taskId,
|
|
96373
|
+
limit: opts["limit"]
|
|
96374
|
+
},
|
|
96375
|
+
{ command: "reason", operation: "memory.reason.similar" }
|
|
96376
|
+
);
|
|
96377
|
+
});
|
|
96378
|
+
reason.command("impact [taskId]").description(
|
|
96379
|
+
"Predict impact of a change. Use --change for free-text prediction, or pass a taskId for graph-based analysis."
|
|
96380
|
+
).option("--change <description>", "Free-text description of the proposed change (T043)").option("--limit <n>", "Maximum seed tasks to match when using --change (default: 5)", "5").option("--depth <n>", "Maximum traversal depth when using taskId (default: 10)", "10").option("--json", "Output raw JSON envelope").action(async (taskId, opts) => {
|
|
96381
|
+
const change = opts["change"];
|
|
96382
|
+
if (change) {
|
|
96383
|
+
await dispatchFromCli(
|
|
96384
|
+
"query",
|
|
96385
|
+
"tasks",
|
|
96386
|
+
"impact",
|
|
96387
|
+
{
|
|
96388
|
+
change,
|
|
96389
|
+
matchLimit: parseInt(opts["limit"], 10)
|
|
96390
|
+
},
|
|
96391
|
+
{ command: "reason", operation: "tasks.impact" }
|
|
96392
|
+
);
|
|
96393
|
+
} else if (taskId) {
|
|
96394
|
+
await dispatchFromCli(
|
|
96395
|
+
"query",
|
|
96396
|
+
"tasks",
|
|
96397
|
+
"depends",
|
|
96398
|
+
{
|
|
96399
|
+
taskId,
|
|
96400
|
+
action: "impact",
|
|
96401
|
+
depth: parseInt(opts["depth"], 10)
|
|
96402
|
+
},
|
|
96403
|
+
{ command: "reason", operation: "tasks.depends" }
|
|
96404
|
+
);
|
|
96405
|
+
} else {
|
|
96406
|
+
process.stderr.write(
|
|
96407
|
+
"Error: reason impact requires either --change <description> or a <taskId>\n"
|
|
96408
|
+
);
|
|
96409
|
+
process.exit(1);
|
|
96410
|
+
}
|
|
96411
|
+
});
|
|
96412
|
+
reason.command("timeline <taskId>").description("Show history and audit trail for a task").option("--limit <n>", "Maximum number of history entries", parseInt).option("--json", "Output raw JSON envelope").action(async (taskId, opts) => {
|
|
96413
|
+
await dispatchFromCli(
|
|
96414
|
+
"query",
|
|
96415
|
+
"tasks",
|
|
96416
|
+
"history",
|
|
96417
|
+
{
|
|
96418
|
+
taskId,
|
|
96419
|
+
limit: opts["limit"]
|
|
96420
|
+
},
|
|
96421
|
+
{ command: "reason", operation: "tasks.history" }
|
|
96422
|
+
);
|
|
96423
|
+
});
|
|
96424
|
+
}
|
|
96425
|
+
|
|
95815
96426
|
// packages/cleo/src/cli/commands/refresh-memory.ts
|
|
95816
96427
|
init_src2();
|
|
95817
96428
|
function registerRefreshMemoryCommand(program) {
|
|
@@ -97984,6 +98595,7 @@ function getPackageVersion() {
|
|
|
97984
98595
|
}
|
|
97985
98596
|
var CLI_VERSION = getPackageVersion();
|
|
97986
98597
|
var rootShim = new ShimCommand();
|
|
98598
|
+
registerAgentsCommand(rootShim);
|
|
97987
98599
|
registerAddCommand(rootShim);
|
|
97988
98600
|
registerListCommand(rootShim);
|
|
97989
98601
|
registerShowCommand(rootShim);
|
|
@@ -98070,6 +98682,7 @@ registerBackfillCommand(rootShim);
|
|
|
98070
98682
|
registerMemoryBrainCommand(rootShim);
|
|
98071
98683
|
registerMigrateClaudeMemCommand(rootShim);
|
|
98072
98684
|
registerStickyCommand(rootShim);
|
|
98685
|
+
registerReasonCommand(rootShim);
|
|
98073
98686
|
registerRefreshMemoryCommand(rootShim);
|
|
98074
98687
|
registerObserveCommand(rootShim);
|
|
98075
98688
|
function shimToCitty(shim) {
|