@cleocode/cleo 2026.3.37 → 2026.3.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +565 -0
- package/bin/postinstall.js +0 -0
- package/completions/bash-completion.sh +0 -0
- package/completions/zsh-completion.zsh +0 -0
- package/dist/cli/index.js +3507 -3631
- package/dist/cli/index.js.map +4 -4
- package/dist/mcp/index.js +3311 -3215
- package/dist/mcp/index.js.map +4 -4
- package/migrations/drizzle-brain/20260318205549_initial/migration.sql +0 -0
- package/migrations/drizzle-brain/20260318205549_initial/snapshot.json +0 -0
- package/migrations/drizzle-nexus/20260318205558_initial/migration.sql +0 -0
- package/migrations/drizzle-nexus/20260318205558_initial/snapshot.json +0 -0
- package/migrations/drizzle-tasks/20260318205539_initial/migration.sql +0 -0
- package/migrations/drizzle-tasks/20260318205539_initial/snapshot.json +0 -0
- package/package.json +17 -12
- package/dist/cli/commander-shim.d.ts +0 -108
- package/dist/cli/commander-shim.d.ts.map +0 -1
- package/dist/cli/commander-shim.js +0 -229
- 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 -92
- 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 -385
- package/dist/cli/commands/detect-drift.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 -170
- 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/extract.d.ts +0 -16
- package/dist/cli/commands/extract.d.ts.map +0 -1
- package/dist/cli/commands/extract.js +0 -43
- package/dist/cli/commands/extract.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 -16
- 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 -94
- 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 -54
- 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 -225
- 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 -332
- 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/sync.d.ts +0 -13
- package/dist/cli/commands/sync.d.ts.map +0 -1
- package/dist/cli/commands/sync.js +0 -48
- package/dist/cli/commands/sync.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 -74
- 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 -12
- 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 -308
- 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 -27
- package/dist/dispatch/domains/admin.d.ts.map +0 -1
- package/dist/dispatch/domains/admin.js +0 -672
- package/dist/dispatch/domains/admin.js.map +0 -1
- package/dist/dispatch/domains/check.d.ts +0 -24
- package/dist/dispatch/domains/check.d.ts.map +0 -1
- package/dist/dispatch/domains/check.js +0 -281
- 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 -24
- package/dist/dispatch/domains/memory.d.ts.map +0 -1
- package/dist/dispatch/domains/memory.js +0 -305
- package/dist/dispatch/domains/memory.js.map +0 -1
- package/dist/dispatch/domains/nexus.d.ts +0 -24
- package/dist/dispatch/domains/nexus.d.ts.map +0 -1
- package/dist/dispatch/domains/nexus.js +0 -252
- package/dist/dispatch/domains/nexus.js.map +0 -1
- package/dist/dispatch/domains/orchestrate.d.ts +0 -21
- package/dist/dispatch/domains/orchestrate.d.ts.map +0 -1
- package/dist/dispatch/domains/orchestrate.js +0 -261
- package/dist/dispatch/domains/orchestrate.js.map +0 -1
- package/dist/dispatch/domains/pipeline.d.ts +0 -36
- package/dist/dispatch/domains/pipeline.d.ts.map +0 -1
- package/dist/dispatch/domains/pipeline.js +0 -554
- package/dist/dispatch/domains/pipeline.js.map +0 -1
- package/dist/dispatch/domains/session.d.ts +0 -24
- package/dist/dispatch/domains/session.d.ts.map +0 -1
- package/dist/dispatch/domains/session.js +0 -257
- package/dist/dispatch/domains/session.js.map +0 -1
- package/dist/dispatch/domains/sticky.d.ts +0 -22
- package/dist/dispatch/domains/sticky.d.ts.map +0 -1
- package/dist/dispatch/domains/sticky.js +0 -166
- package/dist/dispatch/domains/sticky.js.map +0 -1
- package/dist/dispatch/domains/tasks.d.ts +0 -26
- package/dist/dispatch/domains/tasks.d.ts.map +0 -1
- package/dist/dispatch/domains/tasks.js +0 -352
- package/dist/dispatch/domains/tasks.js.map +0 -1
- package/dist/dispatch/domains/tools.d.ts +0 -40
- package/dist/dispatch/domains/tools.d.ts.map +0 -1
- package/dist/dispatch/domains/tools.js +0 -497
- 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 -159
- package/dist/dispatch/engines/nexus-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/nexus-engine.js +0 -329
- 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 -770
- 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 -192
- 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 -670
- package/dist/dispatch/engines/release-engine.js.map +0 -1
- package/dist/dispatch/engines/session-engine.d.ts +0 -326
- package/dist/dispatch/engines/session-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/session-engine.js +0 -869
- 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 -980
- package/dist/dispatch/engines/system-engine.js.map +0 -1
- package/dist/dispatch/engines/task-engine.d.ts +0 -584
- package/dist/dispatch/engines/task-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/task-engine.js +0 -881
- 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 -285
- package/dist/dispatch/engines/tools-engine.d.ts.map +0 -1
- package/dist/dispatch/engines/tools-engine.js +0 -676
- 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 -527
- 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 -12
- 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 -2693
- 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/exit-codes.d.ts +0 -197
- package/dist/mcp/lib/exit-codes.d.ts.map +0 -1
- package/dist/mcp/lib/exit-codes.js +0 -1016
- package/dist/mcp/lib/exit-codes.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 -361
- 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
|
@@ -1,869 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Session Engine — thin wrapper layer.
|
|
3
|
-
*
|
|
4
|
-
* Delegates all business logic to src/core/sessions/ and src/core/task-work/.
|
|
5
|
-
* Each function catches errors from core and wraps them into EngineResult.
|
|
6
|
-
*
|
|
7
|
-
* @task T4782
|
|
8
|
-
* @epic T4654
|
|
9
|
-
*/
|
|
10
|
-
import { archiveSessions, CleoError, cleanupSessions, computeBriefing, computeDebrief, computeHandoff, currentTask, findSessions, generateSessionId, getContextDrift, getDecisionLog, getLastHandoff, getSessionHistory, getSessionStats, getTaskHistory, injectContext, paginate, parseScope, persistHandoff, recordAssumption, recordDecision, showSession, startTask, stopTask, suspendSession, switchSession, } from '@cleocode/core/internal';
|
|
11
|
-
// ... existing imports ...
|
|
12
|
-
import { getAccessor } from '@cleocode/core/internal';
|
|
13
|
-
import { getExitCodeName } from '@cleocode/contracts';
|
|
14
|
-
import { engineError } from './_error.js';
|
|
15
|
-
/**
|
|
16
|
-
* Get current session status.
|
|
17
|
-
* @task T4782
|
|
18
|
-
*/
|
|
19
|
-
export async function sessionStatus(projectRoot) {
|
|
20
|
-
try {
|
|
21
|
-
const accessor = await getAccessor(projectRoot);
|
|
22
|
-
const focusState = await accessor.getMetaValue('focus_state');
|
|
23
|
-
const sessions = await accessor.loadSessions();
|
|
24
|
-
const active = sessions.find((s) => s.status === 'active');
|
|
25
|
-
return {
|
|
26
|
-
success: true,
|
|
27
|
-
data: {
|
|
28
|
-
hasActiveSession: !!active,
|
|
29
|
-
session: active || null,
|
|
30
|
-
taskWork: focusState || null,
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
catch {
|
|
35
|
-
return engineError('E_NOT_INITIALIZED', 'Task database not initialized');
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
/** Default limit for sessionList when none is provided. @task T5121 */
|
|
39
|
-
const SESSION_LIST_DEFAULT_LIMIT = 10;
|
|
40
|
-
/**
|
|
41
|
-
* List sessions with budget enforcement.
|
|
42
|
-
*
|
|
43
|
-
* When a limit is applied (explicit or default), the response includes
|
|
44
|
-
* `_meta.truncated` and `_meta.total` so agents know the result set
|
|
45
|
-
* was capped.
|
|
46
|
-
*
|
|
47
|
-
* @task T4782
|
|
48
|
-
* @task T5120 - budget enforcement metadata
|
|
49
|
-
* @task T5121 - default limit=10
|
|
50
|
-
*/
|
|
51
|
-
export async function sessionList(projectRoot, params) {
|
|
52
|
-
try {
|
|
53
|
-
const accessor = await getAccessor(projectRoot);
|
|
54
|
-
const sessions = await accessor.loadSessions();
|
|
55
|
-
let result = sessions;
|
|
56
|
-
if (params?.status) {
|
|
57
|
-
result = result.filter((s) => s.status === params.status);
|
|
58
|
-
}
|
|
59
|
-
else if (params?.active === true) {
|
|
60
|
-
result = result.filter((s) => s.status === 'active');
|
|
61
|
-
}
|
|
62
|
-
else if (params?.active === false) {
|
|
63
|
-
result = result.filter((s) => s.status !== 'active');
|
|
64
|
-
}
|
|
65
|
-
const total = sessions.length;
|
|
66
|
-
const filtered = result.length;
|
|
67
|
-
const limit = params?.limit && params.limit > 0 ? params.limit : SESSION_LIST_DEFAULT_LIMIT;
|
|
68
|
-
const offset = typeof params?.offset === 'number' && params.offset > 0 ? params.offset : 0;
|
|
69
|
-
const pageResult = paginate(result, limit, offset);
|
|
70
|
-
const truncated = filtered !== pageResult.items.length || offset > 0;
|
|
71
|
-
return {
|
|
72
|
-
success: true,
|
|
73
|
-
data: {
|
|
74
|
-
sessions: pageResult.items,
|
|
75
|
-
total,
|
|
76
|
-
filtered,
|
|
77
|
-
_meta: { truncated, total: filtered },
|
|
78
|
-
},
|
|
79
|
-
page: pageResult.page,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
catch {
|
|
83
|
-
return engineError('E_NOT_INITIALIZED', 'Task database not initialized');
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Lightweight session discovery — returns minimal session records.
|
|
88
|
-
*
|
|
89
|
-
* @task T5119
|
|
90
|
-
*/
|
|
91
|
-
export async function sessionFind(projectRoot, params) {
|
|
92
|
-
try {
|
|
93
|
-
const accessor = await getAccessor(projectRoot);
|
|
94
|
-
const result = await findSessions(accessor, params);
|
|
95
|
-
return { success: true, data: result };
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
return engineError('E_NOT_INITIALIZED', 'Task database not initialized');
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Show a specific session.
|
|
103
|
-
* @task T4782
|
|
104
|
-
*/
|
|
105
|
-
export async function sessionShow(projectRoot, sessionId) {
|
|
106
|
-
try {
|
|
107
|
-
const result = await showSession(projectRoot, sessionId);
|
|
108
|
-
return { success: true, data: result };
|
|
109
|
-
}
|
|
110
|
-
catch (err) {
|
|
111
|
-
const message = err.message;
|
|
112
|
-
const code = message.includes('not found') ? 'E_NOT_FOUND' : 'E_NOT_INITIALIZED';
|
|
113
|
-
return engineError(code, message);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Get current task being worked on.
|
|
118
|
-
* Delegates to core/task-work/currentTask.
|
|
119
|
-
* @task T4782
|
|
120
|
-
*/
|
|
121
|
-
export async function taskCurrentGet(projectRoot) {
|
|
122
|
-
try {
|
|
123
|
-
const accessor = await getAccessor(projectRoot);
|
|
124
|
-
const result = await currentTask(undefined, accessor);
|
|
125
|
-
return {
|
|
126
|
-
success: true,
|
|
127
|
-
data: {
|
|
128
|
-
currentTask: result.currentTask,
|
|
129
|
-
currentPhase: result.currentPhase,
|
|
130
|
-
},
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
catch {
|
|
134
|
-
return engineError('E_NOT_INITIALIZED', 'Task database not initialized');
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Start working on a specific task.
|
|
139
|
-
* Delegates to core/task-work/startTask.
|
|
140
|
-
* @task T4782
|
|
141
|
-
*/
|
|
142
|
-
export async function taskStart(projectRoot, taskId) {
|
|
143
|
-
try {
|
|
144
|
-
const accessor = await getAccessor(projectRoot);
|
|
145
|
-
const result = await startTask(taskId, undefined, accessor);
|
|
146
|
-
return {
|
|
147
|
-
success: true,
|
|
148
|
-
data: { taskId: result.taskId, previousTask: result.previousTask },
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
catch (err) {
|
|
152
|
-
if (err instanceof CleoError) {
|
|
153
|
-
const stringCode = `E_${getExitCodeName(err.code)}`;
|
|
154
|
-
return engineError(stringCode, err.message, {
|
|
155
|
-
...(err.fix && { fix: err.fix }),
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
const message = err.message;
|
|
159
|
-
const code = message.includes('not found') ? 'E_NOT_FOUND' : 'E_NOT_INITIALIZED';
|
|
160
|
-
return engineError(code, message);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Stop working on the current task.
|
|
165
|
-
* Delegates to core/task-work/stopTask.
|
|
166
|
-
* @task T4782
|
|
167
|
-
*/
|
|
168
|
-
export async function taskStop(projectRoot) {
|
|
169
|
-
try {
|
|
170
|
-
const accessor = await getAccessor(projectRoot);
|
|
171
|
-
const result = await stopTask(undefined, accessor);
|
|
172
|
-
return {
|
|
173
|
-
success: true,
|
|
174
|
-
data: { cleared: true, previousTask: result.previousTask },
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
catch {
|
|
178
|
-
return engineError('E_NOT_INITIALIZED', 'Task database not initialized');
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Get task work history from session notes.
|
|
183
|
-
* @task T5323
|
|
184
|
-
*/
|
|
185
|
-
export async function taskWorkHistory(projectRoot) {
|
|
186
|
-
try {
|
|
187
|
-
const accessor = await getAccessor(projectRoot);
|
|
188
|
-
const history = await getTaskHistory(undefined, accessor);
|
|
189
|
-
return {
|
|
190
|
-
success: true,
|
|
191
|
-
data: { history, count: history.length },
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
catch {
|
|
195
|
-
return engineError('E_NOT_INITIALIZED', 'Task database not initialized');
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Start a new session.
|
|
200
|
-
* Note: This function has engine-specific logic for task file focus management
|
|
201
|
-
* and session store updates, so it remains in the engine layer.
|
|
202
|
-
* @task T4782
|
|
203
|
-
*/
|
|
204
|
-
export async function sessionStart(projectRoot, params) {
|
|
205
|
-
try {
|
|
206
|
-
let accessor = await getAccessor(projectRoot);
|
|
207
|
-
// Validate scope BEFORE auto-ending active session (prevents data loss on invalid input)
|
|
208
|
-
let scope;
|
|
209
|
-
try {
|
|
210
|
-
scope = parseScope(params.scope);
|
|
211
|
-
}
|
|
212
|
-
catch (err) {
|
|
213
|
-
return engineError('E_INVALID_INPUT', err instanceof Error ? err.message : 'Invalid scope');
|
|
214
|
-
}
|
|
215
|
-
// For non-global scopes, verify root task exists before auto-ending
|
|
216
|
-
if (scope.type !== 'global') {
|
|
217
|
-
const rootTask = await accessor.loadSingleTask(scope.rootTaskId);
|
|
218
|
-
if (!rootTask) {
|
|
219
|
-
return engineError('E_NOT_FOUND', `Root task '${scope.rootTaskId}' not found`);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
// Auto-end any active session before starting a new one
|
|
223
|
-
const existingActive = await accessor.getActiveSession();
|
|
224
|
-
if (existingActive) {
|
|
225
|
-
await sessionEnd(projectRoot);
|
|
226
|
-
// Reload after auto-end
|
|
227
|
-
accessor = await getAccessor(projectRoot);
|
|
228
|
-
}
|
|
229
|
-
const now = new Date().toISOString();
|
|
230
|
-
const sessionId = generateSessionId();
|
|
231
|
-
// T4959: Chain linking — find most recent ended session for same scope
|
|
232
|
-
let previousSessionId = null;
|
|
233
|
-
{
|
|
234
|
-
const sessions = await accessor.loadSessions();
|
|
235
|
-
const sameScope = sessions
|
|
236
|
-
.filter((s) => s.status === 'ended' &&
|
|
237
|
-
s.endedAt &&
|
|
238
|
-
s.scope?.type === scope.type &&
|
|
239
|
-
(scope.type === 'global' || s.scope?.rootTaskId === scope.rootTaskId))
|
|
240
|
-
.sort((a, b) => new Date(b.endedAt).getTime() - new Date(a.endedAt).getTime());
|
|
241
|
-
if (sameScope.length > 0) {
|
|
242
|
-
previousSessionId = sameScope[0].id;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
// Resolve agent identifier from params or env
|
|
246
|
-
const agentIdentifier = params.agentIdentifier ??
|
|
247
|
-
process.env.CLEO_AGENT_ID ??
|
|
248
|
-
null;
|
|
249
|
-
const rootTaskId = scope.type !== 'global' ? scope.rootTaskId : undefined;
|
|
250
|
-
const startingTaskId = params.startTask || (params.autoStart && rootTaskId ? rootTaskId : null);
|
|
251
|
-
const newSession = {
|
|
252
|
-
id: sessionId,
|
|
253
|
-
status: 'active',
|
|
254
|
-
name: params.name || `session-${sessionId}`,
|
|
255
|
-
scope: scope.type === 'global'
|
|
256
|
-
? { type: 'global' }
|
|
257
|
-
: { type: scope.type, rootTaskId: scope.rootTaskId, includeDescendants: true },
|
|
258
|
-
taskWork: {
|
|
259
|
-
taskId: startingTaskId,
|
|
260
|
-
setAt: now,
|
|
261
|
-
},
|
|
262
|
-
startedAt: now,
|
|
263
|
-
resumeCount: 0,
|
|
264
|
-
...(params.grade ? { gradeMode: true } : {}),
|
|
265
|
-
stats: {
|
|
266
|
-
tasksCompleted: 0,
|
|
267
|
-
tasksCreated: 0,
|
|
268
|
-
tasksUpdated: 0,
|
|
269
|
-
focusChanges: 0,
|
|
270
|
-
totalActiveMinutes: 0,
|
|
271
|
-
suspendCount: 0,
|
|
272
|
-
},
|
|
273
|
-
};
|
|
274
|
-
// Update focus state via metadata
|
|
275
|
-
const existingFocus = await accessor.getMetaValue('focus_state') ?? {
|
|
276
|
-
currentTask: null,
|
|
277
|
-
currentPhase: null,
|
|
278
|
-
blockedUntil: null,
|
|
279
|
-
sessionNote: null,
|
|
280
|
-
sessionNotes: [],
|
|
281
|
-
nextAction: null,
|
|
282
|
-
primarySession: null,
|
|
283
|
-
};
|
|
284
|
-
const startingTask = params.startTask;
|
|
285
|
-
if (startingTask) {
|
|
286
|
-
existingFocus.currentTask = startingTask;
|
|
287
|
-
}
|
|
288
|
-
else if (params.autoStart && rootTaskId) {
|
|
289
|
-
existingFocus.currentTask = rootTaskId;
|
|
290
|
-
}
|
|
291
|
-
await accessor.setMetaValue('focus_state', existingFocus);
|
|
292
|
-
// Update file meta (activeSession no longer stored — session.status is source of truth)
|
|
293
|
-
const currentMeta = await accessor.getMetaValue('file_meta') ?? {};
|
|
294
|
-
currentMeta.lastSessionId = sessionId;
|
|
295
|
-
currentMeta.generation = (currentMeta.generation || 0) + 1;
|
|
296
|
-
await accessor.setMetaValue('file_meta', currentMeta);
|
|
297
|
-
// Write to sessions store so resume/suspend can find the session.
|
|
298
|
-
{
|
|
299
|
-
// T4959: Set chain fields on new session
|
|
300
|
-
if (previousSessionId) {
|
|
301
|
-
newSession.previousSessionId = previousSessionId;
|
|
302
|
-
// Update predecessor's nextSessionId
|
|
303
|
-
const sessions = await accessor.loadSessions();
|
|
304
|
-
const pred = sessions.find((s) => s.id === previousSessionId);
|
|
305
|
-
if (pred) {
|
|
306
|
-
pred.nextSessionId = sessionId;
|
|
307
|
-
await accessor.upsertSingleSession(pred);
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
if (agentIdentifier) {
|
|
311
|
-
newSession.agentIdentifier = agentIdentifier;
|
|
312
|
-
}
|
|
313
|
-
await accessor.upsertSingleSession(newSession);
|
|
314
|
-
}
|
|
315
|
-
// Enable grade mode: set env vars so audit middleware logs queries too
|
|
316
|
-
if (params.grade) {
|
|
317
|
-
process.env.CLEO_SESSION_GRADE = 'true';
|
|
318
|
-
process.env.CLEO_SESSION_ID = sessionId;
|
|
319
|
-
process.env.CLEO_SESSION_GRADE_ID = sessionId;
|
|
320
|
-
}
|
|
321
|
-
// T4959: Auto-briefing — enrich response with briefing + predecessor debrief
|
|
322
|
-
let briefing = null;
|
|
323
|
-
let previousDebrief = null;
|
|
324
|
-
try {
|
|
325
|
-
briefing = await computeBriefing(projectRoot, { scope: params.scope });
|
|
326
|
-
}
|
|
327
|
-
catch {
|
|
328
|
-
// Best-effort — briefing failure should not fail session start
|
|
329
|
-
}
|
|
330
|
-
// 5B: Load predecessor debrief/handoff and mark consumed
|
|
331
|
-
let previousHandoff = null;
|
|
332
|
-
if (previousSessionId) {
|
|
333
|
-
try {
|
|
334
|
-
const sessions2 = await accessor.loadSessions();
|
|
335
|
-
const pred = sessions2.find((s) => s.id === previousSessionId);
|
|
336
|
-
if (pred) {
|
|
337
|
-
// Try debriefJson first (rich data), then handoffJson (basic)
|
|
338
|
-
if (pred.debriefJson) {
|
|
339
|
-
previousDebrief = JSON.parse(pred.debriefJson);
|
|
340
|
-
}
|
|
341
|
-
else if (pred.handoffJson) {
|
|
342
|
-
previousHandoff = JSON.parse(pred.handoffJson);
|
|
343
|
-
}
|
|
344
|
-
// Always mark consumed regardless of debrief vs handoff
|
|
345
|
-
pred.handoffConsumedAt = new Date().toISOString();
|
|
346
|
-
pred.handoffConsumedBy = sessionId;
|
|
347
|
-
await accessor.upsertSingleSession(pred);
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
catch {
|
|
351
|
-
// Best-effort
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
const enrichedSession = {
|
|
355
|
-
...newSession,
|
|
356
|
-
...(briefing && { briefing }),
|
|
357
|
-
...(previousDebrief && { previousDebrief }),
|
|
358
|
-
...(previousHandoff && { previousHandoff }),
|
|
359
|
-
};
|
|
360
|
-
return { success: true, data: enrichedSession };
|
|
361
|
-
}
|
|
362
|
-
catch {
|
|
363
|
-
return engineError('E_NOT_INITIALIZED', 'Task database not initialized');
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
/**
|
|
367
|
-
* End the current session.
|
|
368
|
-
* Note: This function has engine-specific logic for task file focus management
|
|
369
|
-
* and session store management, so it remains in the engine layer.
|
|
370
|
-
* @task T4782
|
|
371
|
-
*/
|
|
372
|
-
export async function sessionEnd(projectRoot, notes) {
|
|
373
|
-
try {
|
|
374
|
-
const accessor = await getAccessor(projectRoot);
|
|
375
|
-
const activeSession = await accessor.getActiveSession();
|
|
376
|
-
const sessionId = activeSession?.id;
|
|
377
|
-
if (!sessionId) {
|
|
378
|
-
return engineError('E_SESSION_NOT_FOUND', 'No active session to end', {
|
|
379
|
-
fix: 'Start a session first with: session start --scope <scope> --name <name>',
|
|
380
|
-
});
|
|
381
|
-
}
|
|
382
|
-
const now = new Date().toISOString();
|
|
383
|
-
// NOTE: Do NOT clear grade mode env vars here — gradeSession() needs them
|
|
384
|
-
// to query audit entries after the session ends. The caller (admin.grade handler)
|
|
385
|
-
// is responsible for cleanup after evaluation completes.
|
|
386
|
-
// Clear focus
|
|
387
|
-
const focusEnd = await accessor.getMetaValue('focus_state');
|
|
388
|
-
if (focusEnd) {
|
|
389
|
-
focusEnd.currentTask = null;
|
|
390
|
-
if (notes) {
|
|
391
|
-
if (!focusEnd.sessionNotes)
|
|
392
|
-
focusEnd.sessionNotes = [];
|
|
393
|
-
focusEnd.sessionNotes.push({ timestamp: now, note: notes });
|
|
394
|
-
}
|
|
395
|
-
await accessor.setMetaValue('focus_state', focusEnd);
|
|
396
|
-
}
|
|
397
|
-
// Bump file_meta generation (activeSession no longer stored here)
|
|
398
|
-
const fileMetaEnd = await accessor.getMetaValue('file_meta');
|
|
399
|
-
if (fileMetaEnd) {
|
|
400
|
-
fileMetaEnd.generation = (fileMetaEnd.generation || 0) + 1;
|
|
401
|
-
await accessor.setMetaValue('file_meta', fileMetaEnd);
|
|
402
|
-
}
|
|
403
|
-
// Update session record — status is the source of truth
|
|
404
|
-
if (sessionId !== 'default') {
|
|
405
|
-
activeSession.status = 'ended';
|
|
406
|
-
activeSession.endedAt = now;
|
|
407
|
-
await accessor.upsertSingleSession(activeSession);
|
|
408
|
-
}
|
|
409
|
-
return { success: true, data: { sessionId, ended: true } };
|
|
410
|
-
}
|
|
411
|
-
catch {
|
|
412
|
-
return engineError('E_NOT_INITIALIZED', 'Task database not initialized');
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
/**
|
|
416
|
-
* Resume an ended or suspended session.
|
|
417
|
-
* Note: This function has engine-specific logic for task file focus sync,
|
|
418
|
-
* so it remains in the engine layer.
|
|
419
|
-
* @task T4782
|
|
420
|
-
*/
|
|
421
|
-
export async function sessionResume(projectRoot, sessionId) {
|
|
422
|
-
try {
|
|
423
|
-
const accessor = await getAccessor(projectRoot);
|
|
424
|
-
// Look up sessions from the store.
|
|
425
|
-
const sessions = await accessor.loadSessions();
|
|
426
|
-
// Look in sessions list
|
|
427
|
-
const session = sessions.find((s) => s.id === sessionId);
|
|
428
|
-
if (!session) {
|
|
429
|
-
return engineError('E_NOT_FOUND', `Session '${sessionId}' not found`);
|
|
430
|
-
}
|
|
431
|
-
if (session.status === 'active') {
|
|
432
|
-
return { success: true, data: session };
|
|
433
|
-
}
|
|
434
|
-
if (session.status === 'archived') {
|
|
435
|
-
return engineError('E_INVALID_INPUT', `Session '${sessionId}' is archived and cannot be resumed`);
|
|
436
|
-
}
|
|
437
|
-
session.status = 'active';
|
|
438
|
-
session.endedAt = undefined;
|
|
439
|
-
session.resumeCount = (session.resumeCount || 0) + 1;
|
|
440
|
-
// Bump file_meta generation (activeSession no longer stored — status is source of truth)
|
|
441
|
-
const resumeMeta = await accessor.getMetaValue('file_meta') ?? {};
|
|
442
|
-
resumeMeta.generation = (resumeMeta.generation || 0) + 1;
|
|
443
|
-
await accessor.setMetaValue('file_meta', resumeMeta);
|
|
444
|
-
// Restore focus from session task work
|
|
445
|
-
if (session.taskWork?.taskId) {
|
|
446
|
-
const resumeFocus = await accessor.getMetaValue('focus_state');
|
|
447
|
-
if (resumeFocus) {
|
|
448
|
-
resumeFocus.currentTask = session.taskWork.taskId;
|
|
449
|
-
await accessor.setMetaValue('focus_state', resumeFocus);
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
await accessor.upsertSingleSession(session);
|
|
453
|
-
// Wave 3B: Enrich resumed session with brain memory context (best-effort)
|
|
454
|
-
let memoryContext;
|
|
455
|
-
try {
|
|
456
|
-
const { getSessionMemoryContext } = await import('@cleocode/core/internal');
|
|
457
|
-
const scopeType = session.scope?.type;
|
|
458
|
-
const rootTaskId = session.scope?.rootTaskId;
|
|
459
|
-
memoryContext = await getSessionMemoryContext(projectRoot, {
|
|
460
|
-
type: scopeType ?? 'global',
|
|
461
|
-
rootTaskId,
|
|
462
|
-
epicId: rootTaskId,
|
|
463
|
-
});
|
|
464
|
-
}
|
|
465
|
-
catch {
|
|
466
|
-
// Best-effort -- memory context failure should not fail resume
|
|
467
|
-
}
|
|
468
|
-
const enrichedSession = {
|
|
469
|
-
...session,
|
|
470
|
-
...(memoryContext && { memoryContext }),
|
|
471
|
-
};
|
|
472
|
-
return { success: true, data: enrichedSession };
|
|
473
|
-
}
|
|
474
|
-
catch {
|
|
475
|
-
return engineError('E_NOT_INITIALIZED', 'Task database not initialized');
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
/**
|
|
479
|
-
* Garbage collect old sessions.
|
|
480
|
-
* @task T4782
|
|
481
|
-
*/
|
|
482
|
-
export async function sessionGc(projectRoot, maxAgeDays = 1) {
|
|
483
|
-
try {
|
|
484
|
-
const accessor = await getAccessor(projectRoot);
|
|
485
|
-
const sessions = await accessor.loadSessions();
|
|
486
|
-
const now = Date.now();
|
|
487
|
-
const maxAgeMs = maxAgeDays * 24 * 60 * 60 * 1000;
|
|
488
|
-
const thirtyDaysMs = 30 * 24 * 60 * 60 * 1000;
|
|
489
|
-
const orphaned = [];
|
|
490
|
-
const removed = [];
|
|
491
|
-
// Mark stale active sessions as orphaned
|
|
492
|
-
for (const session of sessions) {
|
|
493
|
-
if (session.status === 'active') {
|
|
494
|
-
const lastActive = new Date(session.endedAt || session.startedAt).getTime();
|
|
495
|
-
if (now - lastActive > maxAgeMs) {
|
|
496
|
-
session.status = 'ended';
|
|
497
|
-
session.endedAt = new Date().toISOString();
|
|
498
|
-
orphaned.push(session.id);
|
|
499
|
-
await accessor.upsertSingleSession(session);
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
// Remove very old ended sessions
|
|
504
|
-
for (const s of sessions) {
|
|
505
|
-
if (s.status === 'active')
|
|
506
|
-
continue;
|
|
507
|
-
const endedAt = s.endedAt ? new Date(s.endedAt).getTime() : new Date(s.startedAt).getTime();
|
|
508
|
-
if (now - endedAt > thirtyDaysMs) {
|
|
509
|
-
removed.push(s.id);
|
|
510
|
-
await accessor.removeSingleSession(s.id);
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
return { success: true, data: { orphaned, removed } };
|
|
514
|
-
}
|
|
515
|
-
catch {
|
|
516
|
-
return engineError('E_NOT_INITIALIZED', 'Task database not initialized');
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
/**
|
|
520
|
-
* Suspend an active session.
|
|
521
|
-
* @task T4782
|
|
522
|
-
*/
|
|
523
|
-
export async function sessionSuspend(projectRoot, sessionId, reason) {
|
|
524
|
-
try {
|
|
525
|
-
const result = await suspendSession(projectRoot, sessionId, reason);
|
|
526
|
-
return { success: true, data: result };
|
|
527
|
-
}
|
|
528
|
-
catch (err) {
|
|
529
|
-
const message = err.message;
|
|
530
|
-
const code = message.includes('not found')
|
|
531
|
-
? 'E_NOT_FOUND'
|
|
532
|
-
: message.includes('not active')
|
|
533
|
-
? 'E_INVALID_STATE'
|
|
534
|
-
: 'E_NOT_INITIALIZED';
|
|
535
|
-
return engineError(code, message);
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
/**
|
|
539
|
-
* List session history with focus changes and completed tasks.
|
|
540
|
-
* @task T4782
|
|
541
|
-
*/
|
|
542
|
-
export async function sessionHistory(projectRoot, params) {
|
|
543
|
-
try {
|
|
544
|
-
const result = await getSessionHistory(projectRoot, params);
|
|
545
|
-
return { success: true, data: result };
|
|
546
|
-
}
|
|
547
|
-
catch {
|
|
548
|
-
return engineError('E_NOT_INITIALIZED', 'Task database not initialized');
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
/**
|
|
552
|
-
* Remove orphaned sessions and clean up stale data.
|
|
553
|
-
* @task T4782
|
|
554
|
-
*/
|
|
555
|
-
export async function sessionCleanup(projectRoot) {
|
|
556
|
-
try {
|
|
557
|
-
const result = await cleanupSessions(projectRoot);
|
|
558
|
-
return { success: true, data: result };
|
|
559
|
-
}
|
|
560
|
-
catch {
|
|
561
|
-
return engineError('E_NOT_INITIALIZED', 'Task database not initialized');
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
/**
|
|
565
|
-
* Record a decision to the audit trail.
|
|
566
|
-
* @task T4782
|
|
567
|
-
*/
|
|
568
|
-
export async function sessionRecordDecision(projectRoot, params) {
|
|
569
|
-
try {
|
|
570
|
-
const result = await recordDecision(projectRoot, params);
|
|
571
|
-
return { success: true, data: result };
|
|
572
|
-
}
|
|
573
|
-
catch (err) {
|
|
574
|
-
const message = err.message;
|
|
575
|
-
return engineError('E_INVALID_INPUT', message);
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
/**
|
|
579
|
-
* Read the decision log, optionally filtered by sessionId and/or taskId.
|
|
580
|
-
* @task T4782
|
|
581
|
-
*/
|
|
582
|
-
export async function sessionDecisionLog(projectRoot, params) {
|
|
583
|
-
try {
|
|
584
|
-
const result = await getDecisionLog(projectRoot, params);
|
|
585
|
-
return { success: true, data: result };
|
|
586
|
-
}
|
|
587
|
-
catch {
|
|
588
|
-
return { success: true, data: [] };
|
|
589
|
-
}
|
|
590
|
-
}
|
|
591
|
-
/**
|
|
592
|
-
* Compute context drift score for the current session.
|
|
593
|
-
* @task T4782
|
|
594
|
-
*/
|
|
595
|
-
export async function sessionContextDrift(projectRoot, params) {
|
|
596
|
-
try {
|
|
597
|
-
const result = await getContextDrift(projectRoot, params);
|
|
598
|
-
return { success: true, data: result };
|
|
599
|
-
}
|
|
600
|
-
catch (err) {
|
|
601
|
-
const message = err.message;
|
|
602
|
-
const code = message.includes('not found') ? 'E_NOT_FOUND' : 'E_NOT_INITIALIZED';
|
|
603
|
-
return engineError(code, message);
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
/**
|
|
607
|
-
* Record an assumption made during a session.
|
|
608
|
-
* @task T4782
|
|
609
|
-
*/
|
|
610
|
-
export async function sessionRecordAssumption(projectRoot, params) {
|
|
611
|
-
try {
|
|
612
|
-
const result = await recordAssumption(projectRoot, params);
|
|
613
|
-
return { success: true, data: result };
|
|
614
|
-
}
|
|
615
|
-
catch (err) {
|
|
616
|
-
const message = err.message;
|
|
617
|
-
const code = message.includes('required') || message.includes('must be')
|
|
618
|
-
? 'E_INVALID_INPUT'
|
|
619
|
-
: 'E_NOT_INITIALIZED';
|
|
620
|
-
return engineError(code, message);
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
/**
|
|
624
|
-
* Compute session statistics, optionally for a specific session.
|
|
625
|
-
* @task T4782
|
|
626
|
-
*/
|
|
627
|
-
export async function sessionStats(projectRoot, sessionId) {
|
|
628
|
-
try {
|
|
629
|
-
const result = await getSessionStats(projectRoot, sessionId);
|
|
630
|
-
return { success: true, data: result };
|
|
631
|
-
}
|
|
632
|
-
catch (err) {
|
|
633
|
-
const message = err.message;
|
|
634
|
-
const code = message.includes('not found') ? 'E_NOT_FOUND' : 'E_NOT_INITIALIZED';
|
|
635
|
-
return engineError(code, message);
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
/**
|
|
639
|
-
* Switch to a different session.
|
|
640
|
-
* @task T4782
|
|
641
|
-
*/
|
|
642
|
-
export async function sessionSwitch(projectRoot, sessionId) {
|
|
643
|
-
try {
|
|
644
|
-
const result = await switchSession(projectRoot, sessionId);
|
|
645
|
-
return { success: true, data: result };
|
|
646
|
-
}
|
|
647
|
-
catch (err) {
|
|
648
|
-
const message = err.message;
|
|
649
|
-
const code = message.includes('not found')
|
|
650
|
-
? 'E_NOT_FOUND'
|
|
651
|
-
: message.includes('archived')
|
|
652
|
-
? 'E_INVALID_STATE'
|
|
653
|
-
: 'E_NOT_INITIALIZED';
|
|
654
|
-
return engineError(code, message);
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
/**
|
|
658
|
-
* Archive old/ended sessions.
|
|
659
|
-
* @task T4782
|
|
660
|
-
*/
|
|
661
|
-
export async function sessionArchive(projectRoot, olderThan) {
|
|
662
|
-
try {
|
|
663
|
-
const result = await archiveSessions(projectRoot, olderThan);
|
|
664
|
-
return { success: true, data: result };
|
|
665
|
-
}
|
|
666
|
-
catch {
|
|
667
|
-
return engineError('E_NOT_INITIALIZED', 'Task database not initialized');
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
/**
|
|
671
|
-
* Get handoff data for the most recent ended session.
|
|
672
|
-
* @task T4915, T5123
|
|
673
|
-
*/
|
|
674
|
-
export async function sessionHandoff(projectRoot, scope) {
|
|
675
|
-
try {
|
|
676
|
-
const result = await getLastHandoff(projectRoot, scope);
|
|
677
|
-
return { success: true, data: result };
|
|
678
|
-
}
|
|
679
|
-
catch (err) {
|
|
680
|
-
if (err instanceof CleoError) {
|
|
681
|
-
const stringCode = `E_${getExitCodeName(err.code)}`;
|
|
682
|
-
return engineError(stringCode, err.message, {
|
|
683
|
-
...(err.fix && { fix: err.fix }),
|
|
684
|
-
});
|
|
685
|
-
}
|
|
686
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
687
|
-
return engineError('E_GENERAL', message);
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
/**
|
|
691
|
-
* Compute and persist handoff data for a session.
|
|
692
|
-
* @task T4915
|
|
693
|
-
*/
|
|
694
|
-
export async function sessionComputeHandoff(projectRoot, sessionId, options) {
|
|
695
|
-
try {
|
|
696
|
-
const handoff = await computeHandoff(projectRoot, {
|
|
697
|
-
sessionId,
|
|
698
|
-
note: options?.note,
|
|
699
|
-
nextAction: options?.nextAction,
|
|
700
|
-
});
|
|
701
|
-
await persistHandoff(projectRoot, sessionId, handoff);
|
|
702
|
-
return { success: true, data: handoff };
|
|
703
|
-
}
|
|
704
|
-
catch (err) {
|
|
705
|
-
const message = err.message;
|
|
706
|
-
return engineError(message.includes('not found') ? 'E_NOT_FOUND' : 'E_INTERNAL', message);
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
/**
|
|
710
|
-
* Compute session briefing - composite view for session start.
|
|
711
|
-
* Aggregates data from handoff, current focus, next tasks, bugs, blockers, and epics.
|
|
712
|
-
* @task T4916
|
|
713
|
-
*/
|
|
714
|
-
export async function sessionBriefing(projectRoot, options) {
|
|
715
|
-
try {
|
|
716
|
-
const briefing = await computeBriefing(projectRoot, options);
|
|
717
|
-
return { success: true, data: briefing };
|
|
718
|
-
}
|
|
719
|
-
catch (err) {
|
|
720
|
-
const message = err.message;
|
|
721
|
-
return engineError(message.includes('not found') ? 'E_NOT_FOUND' : 'E_INTERNAL', message);
|
|
722
|
-
}
|
|
723
|
-
}
|
|
724
|
-
// =============================================================================
|
|
725
|
-
// RICH DEBRIEF + CHAIN OPERATIONS (T4959)
|
|
726
|
-
// =============================================================================
|
|
727
|
-
/**
|
|
728
|
-
* Compute and persist rich debrief data for a session.
|
|
729
|
-
* Persists as both handoffJson (backward compat) and debriefJson (rich data).
|
|
730
|
-
* @epic T4959
|
|
731
|
-
*/
|
|
732
|
-
export async function sessionComputeDebrief(projectRoot, sessionId, options) {
|
|
733
|
-
try {
|
|
734
|
-
const accessor = await getAccessor(projectRoot);
|
|
735
|
-
const sessions = await accessor.loadSessions();
|
|
736
|
-
const session = sessions.find((s) => s.id === sessionId);
|
|
737
|
-
const debrief = await computeDebrief(projectRoot, {
|
|
738
|
-
sessionId,
|
|
739
|
-
note: options?.note,
|
|
740
|
-
nextAction: options?.nextAction,
|
|
741
|
-
agentIdentifier: session?.agentIdentifier ?? null,
|
|
742
|
-
startedAt: session?.startedAt,
|
|
743
|
-
endedAt: session?.endedAt ?? new Date().toISOString(),
|
|
744
|
-
});
|
|
745
|
-
// Persist both handoffJson and debriefJson
|
|
746
|
-
const { persistHandoff: corePersistHandoff } = await import('@cleocode/core/internal');
|
|
747
|
-
await corePersistHandoff(projectRoot, sessionId, debrief.handoff);
|
|
748
|
-
// Persist debriefJson via session update
|
|
749
|
-
if (session) {
|
|
750
|
-
session.debriefJson = JSON.stringify(debrief);
|
|
751
|
-
await accessor.upsertSingleSession(session);
|
|
752
|
-
}
|
|
753
|
-
return { success: true, data: debrief };
|
|
754
|
-
}
|
|
755
|
-
catch (err) {
|
|
756
|
-
const message = err.message;
|
|
757
|
-
return engineError(message.includes('not found') ? 'E_NOT_FOUND' : 'E_INTERNAL', message);
|
|
758
|
-
}
|
|
759
|
-
}
|
|
760
|
-
/**
|
|
761
|
-
* Read a session's debrief data.
|
|
762
|
-
* Falls back to handoff data if no debrief is available.
|
|
763
|
-
* @epic T4959
|
|
764
|
-
*/
|
|
765
|
-
export async function sessionDebriefShow(projectRoot, sessionId) {
|
|
766
|
-
try {
|
|
767
|
-
const accessor = await getAccessor(projectRoot);
|
|
768
|
-
const sessions = await accessor.loadSessions();
|
|
769
|
-
const session = sessions.find((s) => s.id === sessionId);
|
|
770
|
-
if (!session) {
|
|
771
|
-
return engineError('E_NOT_FOUND', `Session '${sessionId}' not found`);
|
|
772
|
-
}
|
|
773
|
-
// Try debriefJson first
|
|
774
|
-
if (session.debriefJson) {
|
|
775
|
-
try {
|
|
776
|
-
const debrief = JSON.parse(session.debriefJson);
|
|
777
|
-
return { success: true, data: debrief };
|
|
778
|
-
}
|
|
779
|
-
catch {
|
|
780
|
-
// Fall through to handoff
|
|
781
|
-
}
|
|
782
|
-
}
|
|
783
|
-
// Fall back to handoffJson
|
|
784
|
-
if (typeof session.handoffJson === 'string') {
|
|
785
|
-
try {
|
|
786
|
-
const handoff = JSON.parse(session.handoffJson);
|
|
787
|
-
return { success: true, data: { handoff, fallback: true } };
|
|
788
|
-
}
|
|
789
|
-
catch {
|
|
790
|
-
// No data available
|
|
791
|
-
}
|
|
792
|
-
}
|
|
793
|
-
return { success: true, data: null };
|
|
794
|
-
}
|
|
795
|
-
catch (err) {
|
|
796
|
-
const message = err.message;
|
|
797
|
-
return engineError(message.includes('not found') ? 'E_NOT_FOUND' : 'E_INTERNAL', message);
|
|
798
|
-
}
|
|
799
|
-
}
|
|
800
|
-
/**
|
|
801
|
-
* Show the session chain for a given session.
|
|
802
|
-
* Returns ordered list of sessions linked via previousSessionId/nextSessionId.
|
|
803
|
-
* @epic T4959
|
|
804
|
-
*/
|
|
805
|
-
export async function sessionChainShow(projectRoot, sessionId) {
|
|
806
|
-
try {
|
|
807
|
-
const accessor = await getAccessor(projectRoot);
|
|
808
|
-
const sessions = await accessor.loadSessions();
|
|
809
|
-
const sessionMap = new Map(sessions.map((s) => [s.id, s]));
|
|
810
|
-
const target = sessionMap.get(sessionId);
|
|
811
|
-
if (!target) {
|
|
812
|
-
return engineError('E_NOT_FOUND', `Session '${sessionId}' not found`);
|
|
813
|
-
}
|
|
814
|
-
// Walk backward to chain start
|
|
815
|
-
const chain = [sessionId];
|
|
816
|
-
const visited = new Set([sessionId]);
|
|
817
|
-
let current = target.previousSessionId;
|
|
818
|
-
while (current && !visited.has(current)) {
|
|
819
|
-
chain.unshift(current);
|
|
820
|
-
visited.add(current);
|
|
821
|
-
const s = sessionMap.get(current);
|
|
822
|
-
current = s?.previousSessionId ?? undefined;
|
|
823
|
-
}
|
|
824
|
-
// Walk forward from target
|
|
825
|
-
current = target.nextSessionId;
|
|
826
|
-
while (current && !visited.has(current)) {
|
|
827
|
-
chain.push(current);
|
|
828
|
-
visited.add(current);
|
|
829
|
-
const s = sessionMap.get(current);
|
|
830
|
-
current = s?.nextSessionId ?? undefined;
|
|
831
|
-
}
|
|
832
|
-
const result = chain.map((id, idx) => {
|
|
833
|
-
const s = sessionMap.get(id);
|
|
834
|
-
return {
|
|
835
|
-
id,
|
|
836
|
-
status: s?.status ?? 'unknown',
|
|
837
|
-
startedAt: s?.startedAt ?? '',
|
|
838
|
-
endedAt: s?.endedAt ?? null,
|
|
839
|
-
agentIdentifier: s?.agentIdentifier ?? null,
|
|
840
|
-
position: idx + 1,
|
|
841
|
-
};
|
|
842
|
-
});
|
|
843
|
-
return { success: true, data: result };
|
|
844
|
-
}
|
|
845
|
-
catch (err) {
|
|
846
|
-
const message = err.message;
|
|
847
|
-
return engineError('E_INTERNAL', message);
|
|
848
|
-
}
|
|
849
|
-
}
|
|
850
|
-
/**
|
|
851
|
-
* Inject context protocol content.
|
|
852
|
-
* @task T5673
|
|
853
|
-
*/
|
|
854
|
-
export function sessionContextInject(protocolType, params, projectRoot) {
|
|
855
|
-
try {
|
|
856
|
-
const result = injectContext(protocolType, params, projectRoot);
|
|
857
|
-
return { success: true, data: result };
|
|
858
|
-
}
|
|
859
|
-
catch (err) {
|
|
860
|
-
const message = err.message;
|
|
861
|
-
const code = message.includes('required')
|
|
862
|
-
? 'E_INVALID_INPUT'
|
|
863
|
-
: message.includes('not found')
|
|
864
|
-
? 'E_NOT_FOUND'
|
|
865
|
-
: 'E_INTERNAL';
|
|
866
|
-
return engineError(code, message);
|
|
867
|
-
}
|
|
868
|
-
}
|
|
869
|
-
//# sourceMappingURL=session-engine.js.map
|