cognitive-core 0.2.0 → 0.2.2
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/.claude/settings.json +111 -2
- package/.sessionlog/settings.json +4 -0
- package/dist/atlas.d.ts +10 -0
- package/dist/atlas.d.ts.map +1 -1
- package/dist/atlas.js +65 -0
- package/dist/atlas.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/learning/index.d.ts +1 -1
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js.map +1 -1
- package/dist/learning/pipeline.d.ts +4 -31
- package/dist/learning/pipeline.d.ts.map +1 -1
- package/dist/learning/pipeline.js +12 -64
- package/dist/learning/pipeline.js.map +1 -1
- package/dist/learning/unified-pipeline.d.ts +30 -0
- package/dist/learning/unified-pipeline.d.ts.map +1 -1
- package/dist/learning/unified-pipeline.js +207 -0
- package/dist/learning/unified-pipeline.js.map +1 -1
- package/dist/memory/candidate-retrieval.d.ts.map +1 -1
- package/dist/memory/candidate-retrieval.js +3 -1
- package/dist/memory/candidate-retrieval.js.map +1 -1
- package/dist/memory/curated-loader.d.ts +21 -4
- package/dist/memory/curated-loader.d.ts.map +1 -1
- package/dist/memory/curated-loader.js +53 -16
- package/dist/memory/curated-loader.js.map +1 -1
- package/dist/memory/index.d.ts +2 -1
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +3 -1
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/playbook.d.ts +6 -0
- package/dist/memory/playbook.d.ts.map +1 -1
- package/dist/memory/playbook.js +15 -0
- package/dist/memory/playbook.js.map +1 -1
- package/dist/memory/source-resolver.d.ts +120 -0
- package/dist/memory/source-resolver.d.ts.map +1 -0
- package/dist/memory/source-resolver.js +300 -0
- package/dist/memory/source-resolver.js.map +1 -0
- package/dist/types/config.d.ts +141 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +40 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/error-classifier.js +8 -8
- package/dist/utils/error-classifier.js.map +1 -1
- package/dist/workspace/efficacy-toolkit.d.ts +164 -0
- package/dist/workspace/efficacy-toolkit.d.ts.map +1 -0
- package/dist/workspace/efficacy-toolkit.js +281 -0
- package/dist/workspace/efficacy-toolkit.js.map +1 -0
- package/dist/workspace/index.d.ts +2 -1
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js +3 -1
- package/dist/workspace/index.js.map +1 -1
- package/dist/workspace/templates/index.d.ts +3 -0
- package/dist/workspace/templates/index.d.ts.map +1 -1
- package/dist/workspace/templates/index.js +6 -0
- package/dist/workspace/templates/index.js.map +1 -1
- package/dist/workspace/templates/playbook-decay-detection.d.ts +46 -0
- package/dist/workspace/templates/playbook-decay-detection.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-decay-detection.js +197 -0
- package/dist/workspace/templates/playbook-decay-detection.js.map +1 -0
- package/dist/workspace/templates/playbook-efficacy-audit.d.ts +46 -0
- package/dist/workspace/templates/playbook-efficacy-audit.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-efficacy-audit.js +160 -0
- package/dist/workspace/templates/playbook-efficacy-audit.js.map +1 -0
- package/dist/workspace/templates/playbook-lifecycle-review.d.ts +51 -0
- package/dist/workspace/templates/playbook-lifecycle-review.d.ts.map +1 -0
- package/dist/workspace/templates/playbook-lifecycle-review.js +187 -0
- package/dist/workspace/templates/playbook-lifecycle-review.js.map +1 -0
- package/dist/workspace/types.d.ts +12 -54
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/types.js.map +1 -1
- package/package.json +8 -2
- package/playbooks/compound-engineering/adversarial-review.json +51 -0
- package/playbooks/compound-engineering/agent-native-architecture.json +59 -0
- package/playbooks/compound-engineering/agent-native-review.json +54 -0
- package/playbooks/compound-engineering/api-contract-review.json +52 -0
- package/playbooks/compound-engineering/brainstorm-requirements.json +55 -0
- package/playbooks/compound-engineering/bug-reproduction.json +62 -0
- package/playbooks/compound-engineering/confidence-calibration.json +49 -0
- package/playbooks/compound-engineering/correctness-review.json +49 -0
- package/playbooks/compound-engineering/data-migration-safety.json +59 -0
- package/playbooks/compound-engineering/deployment-verification.json +63 -0
- package/playbooks/compound-engineering/error-recovery-patterns.json +53 -0
- package/playbooks/compound-engineering/implementation-planning.json +64 -0
- package/playbooks/compound-engineering/issue-pattern-analysis.json +53 -0
- package/playbooks/compound-engineering/knowledge-compounding.json +63 -0
- package/playbooks/compound-engineering/learnings-research.json +54 -0
- package/playbooks/compound-engineering/maintainability-review.json +49 -0
- package/playbooks/compound-engineering/performance-review.json +54 -0
- package/playbooks/compound-engineering/plan-adversarial-review.json +56 -0
- package/playbooks/compound-engineering/plan-feasibility-review.json +56 -0
- package/playbooks/compound-engineering/project-standards-review.json +52 -0
- package/playbooks/compound-engineering/reliability-review.json +53 -0
- package/playbooks/compound-engineering/review-orchestration.json +64 -0
- package/playbooks/compound-engineering/security-review.json +54 -0
- package/playbooks/compound-engineering/systematic-execution.json +64 -0
- package/playbooks/compound-engineering/testing-review.json +50 -0
- package/src/atlas.ts +96 -0
- package/src/index.ts +27 -0
- package/src/learning/index.ts +1 -0
- package/src/learning/unified-pipeline.ts +271 -1
- package/src/memory/candidate-retrieval.ts +2 -1
- package/src/memory/curated-loader.ts +69 -16
- package/src/memory/index.ts +16 -0
- package/src/memory/playbook.ts +19 -0
- package/src/memory/source-resolver.ts +422 -0
- package/src/types/config.ts +46 -0
- package/src/types/index.ts +4 -0
- package/src/utils/error-classifier.ts +8 -8
- package/src/workspace/efficacy-toolkit.ts +496 -0
- package/src/workspace/index.ts +29 -0
- package/src/workspace/templates/index.ts +24 -0
- package/src/workspace/templates/playbook-decay-detection.ts +272 -0
- package/src/workspace/templates/playbook-efficacy-audit.ts +246 -0
- package/src/workspace/templates/playbook-lifecycle-review.ts +274 -0
- package/src/workspace/types.ts +22 -78
- package/tests/fixtures/behavioral-trajectories.ts +210 -0
- package/tests/integration/curated-sources-e2e.test.ts +502 -0
- package/tests/integration/pipeline-data-correctness.test.ts +794 -0
- package/tests/learning/meta-learner.test.ts +418 -0
- package/tests/learning/pipeline-memory-updates.test.ts +721 -0
- package/tests/learning/unified-pipeline-efficacy.test.ts +232 -0
- package/tests/memory/candidate-retrieval.test.ts +167 -0
- package/tests/memory/compound-engineering-seed.test.ts +338 -0
- package/tests/memory/curated-loader-extended.test.ts +225 -0
- package/tests/memory/meta.test.ts +399 -0
- package/tests/memory/playbook-quality-validation.test.ts +430 -0
- package/tests/memory/source-resolver.test.ts +700 -0
- package/tests/search/evaluator.test.ts +257 -0
- package/tests/search/verification-runner.test.ts +357 -0
- package/tests/utils/error-classifier.test.ts +149 -0
- package/tests/utils/trajectory-helpers.test.ts +163 -0
- package/tests/workspace/efficacy-toolkit.test.ts +404 -0
- package/tests/workspace/templates/playbook-efficacy.test.ts +377 -0
- package/.claude/settings.local.json +0 -11
- package/dist/learning/llm-extractor.d.ts +0 -88
- package/dist/learning/llm-extractor.d.ts.map +0 -1
- package/dist/learning/llm-extractor.js +0 -372
- package/dist/learning/llm-extractor.js.map +0 -1
- package/dist/learning/loop-coordinator.d.ts +0 -61
- package/dist/learning/loop-coordinator.d.ts.map +0 -1
- package/dist/learning/loop-coordinator.js +0 -96
- package/dist/learning/loop-coordinator.js.map +0 -1
- package/references/agent-workspace/CLAUDE.md +0 -74
- package/references/agent-workspace/README.md +0 -587
- package/references/agent-workspace/media/banner.png +0 -0
- package/references/agent-workspace/package-lock.json +0 -2061
- package/references/agent-workspace/package.json +0 -54
- package/references/agent-workspace/src/handle.ts +0 -122
- package/references/agent-workspace/src/index.ts +0 -32
- package/references/agent-workspace/src/manager.ts +0 -102
- package/references/agent-workspace/src/readers/json.ts +0 -71
- package/references/agent-workspace/src/readers/markdown.ts +0 -37
- package/references/agent-workspace/src/readers/raw.ts +0 -27
- package/references/agent-workspace/src/types.ts +0 -68
- package/references/agent-workspace/src/validation.ts +0 -93
- package/references/agent-workspace/src/writers/json.ts +0 -17
- package/references/agent-workspace/src/writers/markdown.ts +0 -27
- package/references/agent-workspace/src/writers/raw.ts +0 -22
- package/references/agent-workspace/tests/errors.test.ts +0 -652
- package/references/agent-workspace/tests/handle.test.ts +0 -144
- package/references/agent-workspace/tests/manager.test.ts +0 -124
- package/references/agent-workspace/tests/readers.test.ts +0 -205
- package/references/agent-workspace/tests/validation.test.ts +0 -196
- package/references/agent-workspace/tests/writers.test.ts +0 -108
- package/references/agent-workspace/tsconfig.json +0 -20
- package/references/agent-workspace/tsup.config.ts +0 -9
- package/references/minimem/.claude/settings.json +0 -7
- package/references/minimem/.sudocode/issues.jsonl +0 -18
- package/references/minimem/.sudocode/specs.jsonl +0 -1
- package/references/minimem/CLAUDE.md +0 -310
- package/references/minimem/README.md +0 -556
- package/references/minimem/claude-plugin/.claude-plugin/plugin.json +0 -10
- package/references/minimem/claude-plugin/.mcp.json +0 -7
- package/references/minimem/claude-plugin/README.md +0 -158
- package/references/minimem/claude-plugin/commands/recall.md +0 -47
- package/references/minimem/claude-plugin/commands/remember.md +0 -41
- package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +0 -272
- package/references/minimem/claude-plugin/hooks/hooks.json +0 -27
- package/references/minimem/claude-plugin/hooks/session-end.sh +0 -86
- package/references/minimem/claude-plugin/hooks/session-start.sh +0 -85
- package/references/minimem/claude-plugin/skills/memory/SKILL.md +0 -108
- package/references/minimem/package-lock.json +0 -5373
- package/references/minimem/package.json +0 -60
- package/references/minimem/scripts/postbuild.js +0 -35
- package/references/minimem/src/__tests__/edge-cases.test.ts +0 -371
- package/references/minimem/src/__tests__/errors.test.ts +0 -265
- package/references/minimem/src/__tests__/helpers.ts +0 -199
- package/references/minimem/src/__tests__/internal.test.ts +0 -407
- package/references/minimem/src/__tests__/knowledge.test.ts +0 -287
- package/references/minimem/src/__tests__/minimem.integration.test.ts +0 -1127
- package/references/minimem/src/__tests__/session.test.ts +0 -190
- package/references/minimem/src/cli/__tests__/commands.test.ts +0 -759
- package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +0 -141
- package/references/minimem/src/cli/commands/append.ts +0 -76
- package/references/minimem/src/cli/commands/config.ts +0 -262
- package/references/minimem/src/cli/commands/conflicts.ts +0 -413
- package/references/minimem/src/cli/commands/daemon.ts +0 -169
- package/references/minimem/src/cli/commands/index.ts +0 -12
- package/references/minimem/src/cli/commands/init.ts +0 -88
- package/references/minimem/src/cli/commands/mcp.ts +0 -177
- package/references/minimem/src/cli/commands/push-pull.ts +0 -213
- package/references/minimem/src/cli/commands/search.ts +0 -158
- package/references/minimem/src/cli/commands/status.ts +0 -84
- package/references/minimem/src/cli/commands/sync-init.ts +0 -290
- package/references/minimem/src/cli/commands/sync.ts +0 -70
- package/references/minimem/src/cli/commands/upsert.ts +0 -197
- package/references/minimem/src/cli/config.ts +0 -584
- package/references/minimem/src/cli/index.ts +0 -264
- package/references/minimem/src/cli/shared.ts +0 -161
- package/references/minimem/src/cli/sync/__tests__/central.test.ts +0 -152
- package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +0 -209
- package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +0 -118
- package/references/minimem/src/cli/sync/__tests__/detection.test.ts +0 -207
- package/references/minimem/src/cli/sync/__tests__/integration.test.ts +0 -476
- package/references/minimem/src/cli/sync/__tests__/registry.test.ts +0 -363
- package/references/minimem/src/cli/sync/__tests__/state.test.ts +0 -255
- package/references/minimem/src/cli/sync/__tests__/validation.test.ts +0 -193
- package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +0 -178
- package/references/minimem/src/cli/sync/central.ts +0 -292
- package/references/minimem/src/cli/sync/conflicts.ts +0 -204
- package/references/minimem/src/cli/sync/daemon.ts +0 -407
- package/references/minimem/src/cli/sync/detection.ts +0 -138
- package/references/minimem/src/cli/sync/index.ts +0 -107
- package/references/minimem/src/cli/sync/operations.ts +0 -373
- package/references/minimem/src/cli/sync/registry.ts +0 -279
- package/references/minimem/src/cli/sync/state.ts +0 -355
- package/references/minimem/src/cli/sync/validation.ts +0 -206
- package/references/minimem/src/cli/sync/watcher.ts +0 -234
- package/references/minimem/src/cli/version.ts +0 -34
- package/references/minimem/src/core/index.ts +0 -9
- package/references/minimem/src/core/indexer.ts +0 -628
- package/references/minimem/src/core/searcher.ts +0 -221
- package/references/minimem/src/db/schema.ts +0 -183
- package/references/minimem/src/db/sqlite-vec.ts +0 -24
- package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +0 -431
- package/references/minimem/src/embeddings/batch-gemini.ts +0 -392
- package/references/minimem/src/embeddings/batch-openai.ts +0 -409
- package/references/minimem/src/embeddings/embeddings.ts +0 -434
- package/references/minimem/src/index.ts +0 -109
- package/references/minimem/src/internal.ts +0 -299
- package/references/minimem/src/minimem.ts +0 -1276
- package/references/minimem/src/search/__tests__/hybrid.test.ts +0 -247
- package/references/minimem/src/search/graph.ts +0 -234
- package/references/minimem/src/search/hybrid.ts +0 -151
- package/references/minimem/src/search/search.ts +0 -256
- package/references/minimem/src/server/__tests__/mcp.test.ts +0 -341
- package/references/minimem/src/server/__tests__/tools.test.ts +0 -364
- package/references/minimem/src/server/mcp.ts +0 -326
- package/references/minimem/src/server/tools.ts +0 -720
- package/references/minimem/src/session.ts +0 -460
- package/references/minimem/tsconfig.json +0 -19
- package/references/minimem/tsup.config.ts +0 -26
- package/references/minimem/vitest.config.ts +0 -24
- package/references/sessionlog/.husky/pre-commit +0 -1
- package/references/sessionlog/.lintstagedrc.json +0 -4
- package/references/sessionlog/.prettierignore +0 -4
- package/references/sessionlog/.prettierrc.json +0 -11
- package/references/sessionlog/LICENSE +0 -21
- package/references/sessionlog/README.md +0 -453
- package/references/sessionlog/eslint.config.js +0 -58
- package/references/sessionlog/package-lock.json +0 -3672
- package/references/sessionlog/package.json +0 -65
- package/references/sessionlog/src/__tests__/agent-hooks.test.ts +0 -570
- package/references/sessionlog/src/__tests__/agent-registry.test.ts +0 -127
- package/references/sessionlog/src/__tests__/claude-code-hooks.test.ts +0 -225
- package/references/sessionlog/src/__tests__/claude-generator.test.ts +0 -46
- package/references/sessionlog/src/__tests__/commit-msg.test.ts +0 -86
- package/references/sessionlog/src/__tests__/cursor-agent.test.ts +0 -224
- package/references/sessionlog/src/__tests__/e2e-live.test.ts +0 -890
- package/references/sessionlog/src/__tests__/event-log.test.ts +0 -183
- package/references/sessionlog/src/__tests__/flush-sentinel.test.ts +0 -105
- package/references/sessionlog/src/__tests__/gemini-agent.test.ts +0 -375
- package/references/sessionlog/src/__tests__/git-hooks.test.ts +0 -78
- package/references/sessionlog/src/__tests__/hook-managers.test.ts +0 -121
- package/references/sessionlog/src/__tests__/lifecycle-tasks.test.ts +0 -759
- package/references/sessionlog/src/__tests__/opencode-agent.test.ts +0 -338
- package/references/sessionlog/src/__tests__/redaction.test.ts +0 -136
- package/references/sessionlog/src/__tests__/session-repo.test.ts +0 -353
- package/references/sessionlog/src/__tests__/session-store.test.ts +0 -166
- package/references/sessionlog/src/__tests__/setup-ccweb.test.ts +0 -466
- package/references/sessionlog/src/__tests__/skill-live.test.ts +0 -461
- package/references/sessionlog/src/__tests__/summarize.test.ts +0 -348
- package/references/sessionlog/src/__tests__/task-plan-e2e.test.ts +0 -610
- package/references/sessionlog/src/__tests__/task-plan-live.test.ts +0 -632
- package/references/sessionlog/src/__tests__/transcript-timestamp.test.ts +0 -121
- package/references/sessionlog/src/__tests__/types.test.ts +0 -166
- package/references/sessionlog/src/__tests__/utils.test.ts +0 -333
- package/references/sessionlog/src/__tests__/validation.test.ts +0 -103
- package/references/sessionlog/src/__tests__/worktree.test.ts +0 -57
- package/references/sessionlog/src/agent/agents/claude-code.ts +0 -1089
- package/references/sessionlog/src/agent/agents/cursor.ts +0 -361
- package/references/sessionlog/src/agent/agents/gemini-cli.ts +0 -632
- package/references/sessionlog/src/agent/agents/opencode.ts +0 -540
- package/references/sessionlog/src/agent/registry.ts +0 -143
- package/references/sessionlog/src/agent/session-types.ts +0 -113
- package/references/sessionlog/src/agent/types.ts +0 -220
- package/references/sessionlog/src/cli.ts +0 -597
- package/references/sessionlog/src/commands/clean.ts +0 -133
- package/references/sessionlog/src/commands/disable.ts +0 -84
- package/references/sessionlog/src/commands/doctor.ts +0 -145
- package/references/sessionlog/src/commands/enable.ts +0 -202
- package/references/sessionlog/src/commands/explain.ts +0 -261
- package/references/sessionlog/src/commands/reset.ts +0 -105
- package/references/sessionlog/src/commands/resume.ts +0 -180
- package/references/sessionlog/src/commands/rewind.ts +0 -195
- package/references/sessionlog/src/commands/setup-ccweb.ts +0 -275
- package/references/sessionlog/src/commands/status.ts +0 -172
- package/references/sessionlog/src/config.ts +0 -165
- package/references/sessionlog/src/events/event-log.ts +0 -126
- package/references/sessionlog/src/git-operations.ts +0 -558
- package/references/sessionlog/src/hooks/git-hooks.ts +0 -165
- package/references/sessionlog/src/hooks/lifecycle.ts +0 -391
- package/references/sessionlog/src/index.ts +0 -650
- package/references/sessionlog/src/security/redaction.ts +0 -283
- package/references/sessionlog/src/session/state-machine.ts +0 -452
- package/references/sessionlog/src/store/checkpoint-store.ts +0 -509
- package/references/sessionlog/src/store/native-store.ts +0 -173
- package/references/sessionlog/src/store/provider-types.ts +0 -99
- package/references/sessionlog/src/store/session-store.ts +0 -266
- package/references/sessionlog/src/strategy/attribution.ts +0 -296
- package/references/sessionlog/src/strategy/common.ts +0 -207
- package/references/sessionlog/src/strategy/content-overlap.ts +0 -228
- package/references/sessionlog/src/strategy/manual-commit.ts +0 -988
- package/references/sessionlog/src/strategy/types.ts +0 -279
- package/references/sessionlog/src/summarize/claude-generator.ts +0 -115
- package/references/sessionlog/src/summarize/summarize.ts +0 -432
- package/references/sessionlog/src/types.ts +0 -508
- package/references/sessionlog/src/utils/chunk-files.ts +0 -49
- package/references/sessionlog/src/utils/commit-message.ts +0 -65
- package/references/sessionlog/src/utils/detect-agent.ts +0 -36
- package/references/sessionlog/src/utils/hook-managers.ts +0 -125
- package/references/sessionlog/src/utils/ide-tags.ts +0 -32
- package/references/sessionlog/src/utils/paths.ts +0 -79
- package/references/sessionlog/src/utils/preview-rewind.ts +0 -80
- package/references/sessionlog/src/utils/rewind-conflict.ts +0 -121
- package/references/sessionlog/src/utils/shadow-branch.ts +0 -109
- package/references/sessionlog/src/utils/string-utils.ts +0 -46
- package/references/sessionlog/src/utils/todo-extract.ts +0 -188
- package/references/sessionlog/src/utils/trailers.ts +0 -187
- package/references/sessionlog/src/utils/transcript-parse.ts +0 -177
- package/references/sessionlog/src/utils/transcript-timestamp.ts +0 -59
- package/references/sessionlog/src/utils/tree-ops.ts +0 -219
- package/references/sessionlog/src/utils/tty.ts +0 -72
- package/references/sessionlog/src/utils/validation.ts +0 -65
- package/references/sessionlog/src/utils/worktree.ts +0 -58
- package/references/sessionlog/src/wire-types.ts +0 -59
- package/references/sessionlog/templates/setup-env.sh +0 -153
- package/references/sessionlog/tsconfig.json +0 -18
- package/references/sessionlog/vitest.config.ts +0 -12
- package/references/skill-tree/.claude/settings.json +0 -6
- package/references/skill-tree/.sudocode/issues.jsonl +0 -19
- package/references/skill-tree/.sudocode/specs.jsonl +0 -3
- package/references/skill-tree/CLAUDE.md +0 -126
- package/references/skill-tree/README.md +0 -372
- package/references/skill-tree/docs/GAPS_v1.md +0 -221
- package/references/skill-tree/docs/INTEGRATION_PLAN.md +0 -467
- package/references/skill-tree/docs/TODOS.md +0 -91
- package/references/skill-tree/docs/anthropic_skill_guide.md +0 -1364
- package/references/skill-tree/docs/design/federated-skill-trees.md +0 -524
- package/references/skill-tree/docs/design/multi-agent-sync.md +0 -759
- package/references/skill-tree/docs/scraper/BRAINSTORM.md +0 -583
- package/references/skill-tree/docs/scraper/POC_PLAN.md +0 -420
- package/references/skill-tree/docs/scraper/README.md +0 -170
- package/references/skill-tree/examples/basic-usage.ts +0 -164
- package/references/skill-tree/package-lock.json +0 -1852
- package/references/skill-tree/package.json +0 -66
- package/references/skill-tree/scraper/README.md +0 -123
- package/references/skill-tree/scraper/docs/DESIGN.md +0 -683
- package/references/skill-tree/scraper/docs/PLAN.md +0 -336
- package/references/skill-tree/scraper/drizzle.config.ts +0 -10
- package/references/skill-tree/scraper/package-lock.json +0 -6329
- package/references/skill-tree/scraper/package.json +0 -68
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +0 -7
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +0 -7
- package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +0 -27
- package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +0 -21
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +0 -54
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +0 -24
- package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +0 -93
- package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +0 -22
- package/references/skill-tree/scraper/tsup.config.ts +0 -14
- package/references/skill-tree/scraper/vitest.config.ts +0 -17
- package/references/skill-tree/scripts/convert-to-vitest.ts +0 -166
- package/references/skill-tree/skills/skill-writer/SKILL.md +0 -339
- package/references/skill-tree/skills/skill-writer/references/examples.md +0 -326
- package/references/skill-tree/skills/skill-writer/references/patterns.md +0 -210
- package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +0 -123
- package/references/skill-tree/test/run-all.ts +0 -106
- package/references/skill-tree/test/utils.ts +0 -128
- package/references/skill-tree/vitest.config.ts +0 -16
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Git Hooks
|
|
3
|
-
*
|
|
4
|
-
* Installation and management of git hooks (prepare-commit-msg,
|
|
5
|
-
* commit-msg, post-commit, pre-push) that integrate Sessionlog into the git workflow.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import * as fs from 'node:fs';
|
|
9
|
-
import * as path from 'node:path';
|
|
10
|
-
import { getGitDir } from '../git-operations.js';
|
|
11
|
-
|
|
12
|
-
// ============================================================================
|
|
13
|
-
// Constants
|
|
14
|
-
// ============================================================================
|
|
15
|
-
|
|
16
|
-
const HOOK_MARKER = '# Sessionlog CLI hook';
|
|
17
|
-
const HOOK_NAMES = ['prepare-commit-msg', 'commit-msg', 'post-commit', 'pre-push'] as const;
|
|
18
|
-
|
|
19
|
-
export type GitHookName = (typeof HOOK_NAMES)[number];
|
|
20
|
-
|
|
21
|
-
// ============================================================================
|
|
22
|
-
// Git Hook Installation
|
|
23
|
-
// ============================================================================
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Install git hooks for Sessionlog into a repository
|
|
27
|
-
*/
|
|
28
|
-
export async function installGitHooks(
|
|
29
|
-
repoPath: string,
|
|
30
|
-
sessionlogExecutable = 'sessionlog',
|
|
31
|
-
): Promise<number> {
|
|
32
|
-
const gitDir = await getGitDir(repoPath);
|
|
33
|
-
const hooksDir = path.resolve(repoPath, gitDir, 'hooks');
|
|
34
|
-
|
|
35
|
-
await fs.promises.mkdir(hooksDir, { recursive: true });
|
|
36
|
-
|
|
37
|
-
let installed = 0;
|
|
38
|
-
|
|
39
|
-
for (const hookName of HOOK_NAMES) {
|
|
40
|
-
const hookPath = path.join(hooksDir, hookName);
|
|
41
|
-
const hookScript = generateHookScript(hookName, sessionlogExecutable);
|
|
42
|
-
|
|
43
|
-
// Read existing content if any
|
|
44
|
-
let existingContent = '';
|
|
45
|
-
try {
|
|
46
|
-
existingContent = await fs.promises.readFile(hookPath, 'utf-8');
|
|
47
|
-
} catch {
|
|
48
|
-
// File doesn't exist
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Check if Sessionlog hook already installed
|
|
52
|
-
if (existingContent.includes(HOOK_MARKER)) {
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Append or create
|
|
57
|
-
if (existingContent) {
|
|
58
|
-
// Append to existing hook
|
|
59
|
-
const newContent = existingContent.trimEnd() + '\n\n' + hookScript + '\n';
|
|
60
|
-
await fs.promises.writeFile(hookPath, newContent);
|
|
61
|
-
} else {
|
|
62
|
-
// Create new hook
|
|
63
|
-
await fs.promises.writeFile(hookPath, '#!/bin/sh\n\n' + hookScript + '\n');
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Make executable
|
|
67
|
-
await fs.promises.chmod(hookPath, 0o755);
|
|
68
|
-
installed++;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return installed;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Uninstall git hooks for Sessionlog from a repository
|
|
76
|
-
*/
|
|
77
|
-
export async function uninstallGitHooks(repoPath: string): Promise<void> {
|
|
78
|
-
const gitDir = await getGitDir(repoPath);
|
|
79
|
-
const hooksDir = path.resolve(repoPath, gitDir, 'hooks');
|
|
80
|
-
|
|
81
|
-
for (const hookName of HOOK_NAMES) {
|
|
82
|
-
const hookPath = path.join(hooksDir, hookName);
|
|
83
|
-
|
|
84
|
-
try {
|
|
85
|
-
const content = await fs.promises.readFile(hookPath, 'utf-8');
|
|
86
|
-
|
|
87
|
-
// Remove Sessionlog section
|
|
88
|
-
const lines = content.split('\n');
|
|
89
|
-
const filtered: string[] = [];
|
|
90
|
-
let inSessionlogSection = false;
|
|
91
|
-
|
|
92
|
-
for (const line of lines) {
|
|
93
|
-
if (line.includes(HOOK_MARKER)) {
|
|
94
|
-
inSessionlogSection = true;
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
if (inSessionlogSection && line.trim() === '') {
|
|
98
|
-
inSessionlogSection = false;
|
|
99
|
-
continue;
|
|
100
|
-
}
|
|
101
|
-
if (!inSessionlogSection) {
|
|
102
|
-
filtered.push(line);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const newContent = filtered.join('\n').trim();
|
|
107
|
-
|
|
108
|
-
if (newContent === '#!/bin/sh' || newContent === '') {
|
|
109
|
-
// Hook is now empty, remove it
|
|
110
|
-
await fs.promises.unlink(hookPath);
|
|
111
|
-
} else {
|
|
112
|
-
await fs.promises.writeFile(hookPath, newContent + '\n');
|
|
113
|
-
}
|
|
114
|
-
} catch {
|
|
115
|
-
// Hook doesn't exist
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Check if git hooks are installed
|
|
122
|
-
*/
|
|
123
|
-
export async function areGitHooksInstalled(repoPath: string): Promise<boolean> {
|
|
124
|
-
const gitDir = await getGitDir(repoPath);
|
|
125
|
-
const hooksDir = path.resolve(repoPath, gitDir, 'hooks');
|
|
126
|
-
|
|
127
|
-
for (const hookName of HOOK_NAMES) {
|
|
128
|
-
const hookPath = path.join(hooksDir, hookName);
|
|
129
|
-
try {
|
|
130
|
-
const content = await fs.promises.readFile(hookPath, 'utf-8');
|
|
131
|
-
if (content.includes(HOOK_MARKER)) return true;
|
|
132
|
-
} catch {
|
|
133
|
-
// Hook doesn't exist
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return false;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// ============================================================================
|
|
141
|
-
// Hook Script Generation
|
|
142
|
-
// ============================================================================
|
|
143
|
-
|
|
144
|
-
function generateHookScript(hookName: GitHookName, executable: string): string {
|
|
145
|
-
switch (hookName) {
|
|
146
|
-
case 'prepare-commit-msg':
|
|
147
|
-
return [
|
|
148
|
-
HOOK_MARKER,
|
|
149
|
-
`${executable} hooks git prepare-commit-msg "$@" 2>/dev/null || true`,
|
|
150
|
-
].join('\n');
|
|
151
|
-
|
|
152
|
-
case 'commit-msg':
|
|
153
|
-
return [
|
|
154
|
-
HOOK_MARKER,
|
|
155
|
-
'# Commit-msg hook: strip trailer if no user content (allows aborting empty commits)',
|
|
156
|
-
`${executable} hooks git commit-msg "$1" || exit 1`,
|
|
157
|
-
].join('\n');
|
|
158
|
-
|
|
159
|
-
case 'post-commit':
|
|
160
|
-
return [HOOK_MARKER, `${executable} hooks git post-commit 2>/dev/null || true`].join('\n');
|
|
161
|
-
|
|
162
|
-
case 'pre-push':
|
|
163
|
-
return [HOOK_MARKER, `${executable} hooks git pre-push "$@" 2>/dev/null || true`].join('\n');
|
|
164
|
-
}
|
|
165
|
-
}
|
|
@@ -1,391 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Lifecycle Management
|
|
3
|
-
*
|
|
4
|
-
* Dispatches normalized agent events through the session state machine.
|
|
5
|
-
* This is the orchestration layer between agent hooks and checkpoint operations.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import * as crypto from 'node:crypto';
|
|
9
|
-
import * as path from 'node:path';
|
|
10
|
-
import { readFile } from 'node:fs/promises';
|
|
11
|
-
import type { Event, SessionState } from '../types.js';
|
|
12
|
-
import { EventType, addTokenUsage } from '../types.js';
|
|
13
|
-
import type { SessionStore } from '../store/session-store.js';
|
|
14
|
-
import type { CheckpointStore } from '../store/checkpoint-store.js';
|
|
15
|
-
import type { Agent } from '../agent/types.js';
|
|
16
|
-
import { hasTranscriptAnalyzer, hasTokenCalculator } from '../agent/types.js';
|
|
17
|
-
import { getHead, getCurrentBranch, getUntrackedFiles, getGitAuthor } from '../git-operations.js';
|
|
18
|
-
import { normalizeStoredPath } from '../utils/paths.js';
|
|
19
|
-
|
|
20
|
-
// ============================================================================
|
|
21
|
-
// Types
|
|
22
|
-
// ============================================================================
|
|
23
|
-
|
|
24
|
-
export interface LifecycleConfig {
|
|
25
|
-
sessionStore: SessionStore;
|
|
26
|
-
checkpointStore: CheckpointStore;
|
|
27
|
-
cwd?: string;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface LifecycleHandler {
|
|
31
|
-
/** Dispatch an event through the lifecycle state machine */
|
|
32
|
-
dispatch(agent: Agent, event: Event): Promise<void>;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// ============================================================================
|
|
36
|
-
// Implementation
|
|
37
|
-
// ============================================================================
|
|
38
|
-
|
|
39
|
-
export function createLifecycleHandler(config: LifecycleConfig): LifecycleHandler {
|
|
40
|
-
const { sessionStore, cwd } = config;
|
|
41
|
-
|
|
42
|
-
return {
|
|
43
|
-
async dispatch(agent: Agent, event: Event): Promise<void> {
|
|
44
|
-
switch (event.type) {
|
|
45
|
-
case EventType.SessionStart:
|
|
46
|
-
await handleSessionStart(agent, event);
|
|
47
|
-
break;
|
|
48
|
-
case EventType.TurnStart:
|
|
49
|
-
await handleTurnStart(agent, event);
|
|
50
|
-
break;
|
|
51
|
-
case EventType.TurnEnd:
|
|
52
|
-
await handleTurnEnd(agent, event);
|
|
53
|
-
break;
|
|
54
|
-
case EventType.SessionEnd:
|
|
55
|
-
await handleSessionEnd(agent, event);
|
|
56
|
-
break;
|
|
57
|
-
case EventType.Compaction:
|
|
58
|
-
await handleCompaction(agent, event);
|
|
59
|
-
break;
|
|
60
|
-
case EventType.SubagentStart:
|
|
61
|
-
await handleSubagentStart(agent, event);
|
|
62
|
-
break;
|
|
63
|
-
case EventType.SubagentEnd:
|
|
64
|
-
await handleSubagentEnd(agent, event);
|
|
65
|
-
break;
|
|
66
|
-
case EventType.TaskCreate:
|
|
67
|
-
await handleTaskCreate(agent, event);
|
|
68
|
-
break;
|
|
69
|
-
case EventType.TaskUpdate:
|
|
70
|
-
await handleTaskUpdate(agent, event);
|
|
71
|
-
break;
|
|
72
|
-
case EventType.PlanModeEnter:
|
|
73
|
-
await handlePlanModeEnter(agent, event);
|
|
74
|
-
break;
|
|
75
|
-
case EventType.PlanModeExit:
|
|
76
|
-
await handlePlanModeExit(agent, event);
|
|
77
|
-
break;
|
|
78
|
-
case EventType.SkillUse:
|
|
79
|
-
await handleSkillUse(agent, event);
|
|
80
|
-
break;
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
async function handleSessionStart(agent: Agent, event: Event): Promise<void> {
|
|
86
|
-
// Check if session already exists
|
|
87
|
-
const existing = await sessionStore.load(event.sessionID);
|
|
88
|
-
if (existing && existing.phase !== 'ended') {
|
|
89
|
-
// Session already active, update interaction time
|
|
90
|
-
existing.lastInteractionTime = new Date().toISOString();
|
|
91
|
-
await sessionStore.save(existing);
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Create new session state
|
|
96
|
-
const head = await getHead(cwd);
|
|
97
|
-
const _branch = await getCurrentBranch(cwd);
|
|
98
|
-
const untrackedFiles = await getUntrackedFiles(cwd);
|
|
99
|
-
|
|
100
|
-
const state: SessionState = {
|
|
101
|
-
sessionID: event.sessionID,
|
|
102
|
-
baseCommit: head,
|
|
103
|
-
attributionBaseCommit: head,
|
|
104
|
-
startedAt: new Date().toISOString(),
|
|
105
|
-
phase: 'idle',
|
|
106
|
-
turnCheckpointIDs: [],
|
|
107
|
-
stepCount: 0,
|
|
108
|
-
checkpointTranscriptStart: 0,
|
|
109
|
-
untrackedFilesAtStart: untrackedFiles,
|
|
110
|
-
filesTouched: [],
|
|
111
|
-
agentType: agent.type,
|
|
112
|
-
transcriptPath: event.sessionRef,
|
|
113
|
-
worktreePath: cwd,
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
await sessionStore.save(state);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
async function handleTurnStart(agent: Agent, event: Event): Promise<void> {
|
|
120
|
-
let state = await sessionStore.load(event.sessionID);
|
|
121
|
-
|
|
122
|
-
if (!state) {
|
|
123
|
-
// Auto-create session on first turn
|
|
124
|
-
await handleSessionStart(agent, {
|
|
125
|
-
...event,
|
|
126
|
-
type: EventType.SessionStart,
|
|
127
|
-
});
|
|
128
|
-
state = await sessionStore.load(event.sessionID);
|
|
129
|
-
if (!state) return;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Generate a new turn ID
|
|
133
|
-
state.turnID = crypto.randomUUID().slice(0, 8);
|
|
134
|
-
state.phase = 'active';
|
|
135
|
-
state.lastInteractionTime = new Date().toISOString();
|
|
136
|
-
state.transcriptPath = event.sessionRef;
|
|
137
|
-
|
|
138
|
-
if (event.prompt && !state.firstPrompt) {
|
|
139
|
-
state.firstPrompt = event.prompt.slice(0, 500);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Capture pre-prompt transcript position
|
|
143
|
-
if (hasTranscriptAnalyzer(agent) && event.sessionRef) {
|
|
144
|
-
try {
|
|
145
|
-
state.checkpointTranscriptStart = await agent.getTranscriptPosition(event.sessionRef);
|
|
146
|
-
state.transcriptIdentifierAtStart = event.sessionRef;
|
|
147
|
-
} catch {
|
|
148
|
-
// Ignore transcript position errors
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
await sessionStore.save(state);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
async function handleTurnEnd(agent: Agent, event: Event): Promise<void> {
|
|
156
|
-
const state = await sessionStore.load(event.sessionID);
|
|
157
|
-
if (!state) return;
|
|
158
|
-
|
|
159
|
-
state.lastInteractionTime = new Date().toISOString();
|
|
160
|
-
|
|
161
|
-
// Extract modified files from transcript
|
|
162
|
-
if (hasTranscriptAnalyzer(agent) && state.transcriptPath) {
|
|
163
|
-
try {
|
|
164
|
-
const { files } = await agent.extractModifiedFilesFromOffset(
|
|
165
|
-
state.transcriptPath,
|
|
166
|
-
state.checkpointTranscriptStart,
|
|
167
|
-
);
|
|
168
|
-
|
|
169
|
-
// Merge new files into filesTouched
|
|
170
|
-
const fileSet = new Set(state.filesTouched);
|
|
171
|
-
for (const file of files) fileSet.add(file);
|
|
172
|
-
state.filesTouched = Array.from(fileSet);
|
|
173
|
-
} catch {
|
|
174
|
-
// Ignore extraction errors
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
// Create shadow branch checkpoint so prepareCommitMsg can detect overlap
|
|
179
|
-
if (state.filesTouched.length > 0) {
|
|
180
|
-
try {
|
|
181
|
-
const { name: authorName, email: authorEmail } = await getGitAuthor(cwd);
|
|
182
|
-
// Use flat name (no slashes) — mergeMetadataIntoTree can't handle nested paths
|
|
183
|
-
const metadataDir = `sessionlog-${state.sessionID}`;
|
|
184
|
-
const metadataDirAbs = path.resolve(cwd ?? '.', metadataDir);
|
|
185
|
-
|
|
186
|
-
const result = await config.checkpointStore.writeTemporary({
|
|
187
|
-
sessionID: state.sessionID,
|
|
188
|
-
baseCommit: state.baseCommit,
|
|
189
|
-
worktreeID: state.worktreeID,
|
|
190
|
-
modifiedFiles: state.filesTouched,
|
|
191
|
-
newFiles: [],
|
|
192
|
-
deletedFiles: [],
|
|
193
|
-
metadataDir,
|
|
194
|
-
metadataDirAbs,
|
|
195
|
-
commitMessage: `Checkpoint: ${state.filesTouched.length} file(s)\n\nSession: ${state.sessionID}`,
|
|
196
|
-
authorName,
|
|
197
|
-
authorEmail,
|
|
198
|
-
isFirstCheckpoint: state.stepCount === 0,
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
if (!result.skipped) {
|
|
202
|
-
state.stepCount++;
|
|
203
|
-
}
|
|
204
|
-
} catch (err) {
|
|
205
|
-
// Non-fatal: shadow branch creation failure shouldn't break lifecycle
|
|
206
|
-
|
|
207
|
-
if (process.env.SESSIONLOG_DEBUG) console.error('[sessionlog] shadow branch error:', err);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// Calculate token usage
|
|
212
|
-
if (hasTokenCalculator(agent) && state.transcriptPath) {
|
|
213
|
-
try {
|
|
214
|
-
const transcript = await agent.readTranscript(state.transcriptPath);
|
|
215
|
-
const usage = await agent.calculateTokenUsage(transcript, state.checkpointTranscriptStart);
|
|
216
|
-
state.tokenUsage = state.tokenUsage ? addTokenUsage(state.tokenUsage, usage) : usage;
|
|
217
|
-
} catch {
|
|
218
|
-
// Ignore token calculation errors
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
// Transition to idle
|
|
223
|
-
state.phase = 'idle';
|
|
224
|
-
await sessionStore.save(state);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
async function handleSessionEnd(agent: Agent, event: Event): Promise<void> {
|
|
228
|
-
const state = await sessionStore.load(event.sessionID);
|
|
229
|
-
if (!state) return;
|
|
230
|
-
|
|
231
|
-
state.phase = 'ended';
|
|
232
|
-
state.endedAt = new Date().toISOString();
|
|
233
|
-
state.lastInteractionTime = new Date().toISOString();
|
|
234
|
-
|
|
235
|
-
await sessionStore.save(state);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
async function handleCompaction(agent: Agent, event: Event): Promise<void> {
|
|
239
|
-
const state = await sessionStore.load(event.sessionID);
|
|
240
|
-
if (!state) return;
|
|
241
|
-
|
|
242
|
-
// Update transcript offset for next checkpoint
|
|
243
|
-
if (hasTranscriptAnalyzer(agent) && state.transcriptPath) {
|
|
244
|
-
try {
|
|
245
|
-
state.checkpointTranscriptStart = await agent.getTranscriptPosition(state.transcriptPath);
|
|
246
|
-
} catch {
|
|
247
|
-
// Ignore
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
state.lastInteractionTime = new Date().toISOString();
|
|
252
|
-
await sessionStore.save(state);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
async function handleSubagentStart(_agent: Agent, event: Event): Promise<void> {
|
|
256
|
-
const state = await sessionStore.load(event.sessionID);
|
|
257
|
-
if (!state) return;
|
|
258
|
-
|
|
259
|
-
state.lastInteractionTime = new Date().toISOString();
|
|
260
|
-
await sessionStore.save(state);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
async function handleSubagentEnd(_agent: Agent, event: Event): Promise<void> {
|
|
264
|
-
const state = await sessionStore.load(event.sessionID);
|
|
265
|
-
if (!state) return;
|
|
266
|
-
|
|
267
|
-
state.lastInteractionTime = new Date().toISOString();
|
|
268
|
-
await sessionStore.save(state);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
async function handleTaskCreate(_agent: Agent, event: Event): Promise<void> {
|
|
272
|
-
const state = await sessionStore.load(event.sessionID);
|
|
273
|
-
if (!state) return;
|
|
274
|
-
|
|
275
|
-
if (!state.tasks) state.tasks = {};
|
|
276
|
-
|
|
277
|
-
const taskID = event.taskID || event.toolUseID || '';
|
|
278
|
-
if (taskID) {
|
|
279
|
-
state.tasks[taskID] = {
|
|
280
|
-
id: taskID,
|
|
281
|
-
subject: event.taskSubject ?? '',
|
|
282
|
-
description: event.taskDescription,
|
|
283
|
-
status: 'pending',
|
|
284
|
-
activeForm: event.taskActiveForm,
|
|
285
|
-
createdAt: new Date().toISOString(),
|
|
286
|
-
updatedAt: new Date().toISOString(),
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
state.lastInteractionTime = new Date().toISOString();
|
|
291
|
-
await sessionStore.save(state);
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
async function handleTaskUpdate(_agent: Agent, event: Event): Promise<void> {
|
|
295
|
-
const state = await sessionStore.load(event.sessionID);
|
|
296
|
-
if (!state) return;
|
|
297
|
-
|
|
298
|
-
if (!state.tasks) state.tasks = {};
|
|
299
|
-
|
|
300
|
-
const taskID = event.taskID ?? '';
|
|
301
|
-
if (taskID) {
|
|
302
|
-
if (state.tasks[taskID]) {
|
|
303
|
-
if (event.taskStatus) state.tasks[taskID].status = event.taskStatus;
|
|
304
|
-
if (event.taskSubject) state.tasks[taskID].subject = event.taskSubject;
|
|
305
|
-
if (event.taskDescription) state.tasks[taskID].description = event.taskDescription;
|
|
306
|
-
state.tasks[taskID].updatedAt = new Date().toISOString();
|
|
307
|
-
} else {
|
|
308
|
-
// Task not previously tracked
|
|
309
|
-
state.tasks[taskID] = {
|
|
310
|
-
id: taskID,
|
|
311
|
-
subject: event.taskSubject ?? '',
|
|
312
|
-
description: event.taskDescription,
|
|
313
|
-
status: event.taskStatus ?? 'pending',
|
|
314
|
-
createdAt: new Date().toISOString(),
|
|
315
|
-
updatedAt: new Date().toISOString(),
|
|
316
|
-
};
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
state.lastInteractionTime = new Date().toISOString();
|
|
321
|
-
await sessionStore.save(state);
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
async function handlePlanModeEnter(_agent: Agent, event: Event): Promise<void> {
|
|
325
|
-
const state = await sessionStore.load(event.sessionID);
|
|
326
|
-
if (!state) return;
|
|
327
|
-
|
|
328
|
-
state.inPlanMode = true;
|
|
329
|
-
state.planModeEntries = (state.planModeEntries ?? 0) + 1;
|
|
330
|
-
|
|
331
|
-
// Push a new plan entry (will be completed on exit)
|
|
332
|
-
if (!state.planEntries) state.planEntries = [];
|
|
333
|
-
state.planEntries.push({
|
|
334
|
-
enteredAt: new Date().toISOString(),
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
state.lastInteractionTime = new Date().toISOString();
|
|
338
|
-
await sessionStore.save(state);
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
async function handlePlanModeExit(_agent: Agent, event: Event): Promise<void> {
|
|
342
|
-
const state = await sessionStore.load(event.sessionID);
|
|
343
|
-
if (!state) return;
|
|
344
|
-
|
|
345
|
-
state.inPlanMode = false;
|
|
346
|
-
|
|
347
|
-
// Complete the last plan entry
|
|
348
|
-
const lastEntry = (state.planEntries ?? []).at(-1);
|
|
349
|
-
if (lastEntry && !lastEntry.exitedAt) {
|
|
350
|
-
lastEntry.exitedAt = new Date().toISOString();
|
|
351
|
-
|
|
352
|
-
if (event.planFilePath) {
|
|
353
|
-
lastEntry.filePath = cwd
|
|
354
|
-
? normalizeStoredPath(event.planFilePath, cwd)
|
|
355
|
-
: event.planFilePath;
|
|
356
|
-
try {
|
|
357
|
-
// Always read from the original absolute path
|
|
358
|
-
const content = await readFile(event.planFilePath, 'utf-8');
|
|
359
|
-
lastEntry.content = content;
|
|
360
|
-
} catch {
|
|
361
|
-
// File may have been cleaned up already — store path only
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
if (event.planAllowedPrompts) {
|
|
366
|
-
lastEntry.allowedPrompts = event.planAllowedPrompts;
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
state.lastInteractionTime = new Date().toISOString();
|
|
371
|
-
await sessionStore.save(state);
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
async function handleSkillUse(_agent: Agent, event: Event): Promise<void> {
|
|
375
|
-
const state = await sessionStore.load(event.sessionID);
|
|
376
|
-
if (!state) return;
|
|
377
|
-
|
|
378
|
-
if (!state.skillsUsed) state.skillsUsed = [];
|
|
379
|
-
|
|
380
|
-
if (event.skillName) {
|
|
381
|
-
state.skillsUsed.push({
|
|
382
|
-
name: event.skillName,
|
|
383
|
-
args: event.skillArgs,
|
|
384
|
-
usedAt: new Date().toISOString(),
|
|
385
|
-
});
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
state.lastInteractionTime = new Date().toISOString();
|
|
389
|
-
await sessionStore.save(state);
|
|
390
|
-
}
|
|
391
|
-
}
|