prjct-cli 1.22.0 → 1.24.0
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/CHANGELOG.md +230 -0
- package/bin/prjct +30 -13
- package/dist/bin/prjct-core.mjs +1748 -0
- package/dist/bin/prjct.mjs +17 -36672
- package/dist/cli/linear.mjs +14 -0
- package/dist/daemon/entry.mjs +1429 -0
- package/dist/templates.json +1 -0
- package/package.json +4 -5
- package/bin/prjct.ts +0 -342
- package/core/__tests__/agentic/analysis-injection.test.ts +0 -377
- package/core/__tests__/agentic/cache-eviction.test.ts +0 -294
- package/core/__tests__/agentic/command-context.test.ts +0 -281
- package/core/__tests__/agentic/command-executor.test.ts +0 -659
- package/core/__tests__/agentic/domain-classifier.test.ts +0 -330
- package/core/__tests__/agentic/injection-validator.test.ts +0 -255
- package/core/__tests__/agentic/memory-system.test.ts +0 -281
- package/core/__tests__/agentic/plan-mode.test.ts +0 -386
- package/core/__tests__/agentic/prompt-assembly.test.ts +0 -298
- package/core/__tests__/agentic/prompt-builder.test.ts +0 -243
- package/core/__tests__/agentic/response-validator.test.ts +0 -263
- package/core/__tests__/agentic/semantic-matching.test.ts +0 -131
- package/core/__tests__/agentic/smart-context.test.ts +0 -372
- package/core/__tests__/agentic/tech-normalizer.test.ts +0 -136
- package/core/__tests__/agentic/token-budget.test.ts +0 -294
- package/core/__tests__/ai-tools/formatters.test.ts +0 -476
- package/core/__tests__/domain/bm25.test.ts +0 -225
- package/core/__tests__/domain/change-propagator.test.ts +0 -100
- package/core/__tests__/domain/fibonacci.test.ts +0 -113
- package/core/__tests__/domain/file-hasher.test.ts +0 -146
- package/core/__tests__/domain/file-ranker.test.ts +0 -169
- package/core/__tests__/domain/git-cochange.test.ts +0 -121
- package/core/__tests__/domain/import-graph.test.ts +0 -156
- package/core/__tests__/domain/velocity.test.ts +0 -623
- package/core/__tests__/infrastructure/performance-tracker.test.ts +0 -328
- package/core/__tests__/schemas/model.test.ts +0 -272
- package/core/__tests__/services/dependency-validator.test.ts +0 -175
- package/core/__tests__/services/hierarchical-agent-resolver.test.ts +0 -359
- package/core/__tests__/services/nested-context-resolver.test.ts +0 -443
- package/core/__tests__/services/project-index.test.ts +0 -355
- package/core/__tests__/services/staleness-checker.test.ts +0 -204
- package/core/__tests__/storage/analysis-storage.test.ts +0 -641
- package/core/__tests__/storage/archive-storage.test.ts +0 -455
- package/core/__tests__/storage/safe-reader.test.ts +0 -262
- package/core/__tests__/storage/sqlite-migration.test.ts +0 -1016
- package/core/__tests__/storage/state-storage-feedback.test.ts +0 -463
- package/core/__tests__/storage/state-storage-history.test.ts +0 -469
- package/core/__tests__/storage/storage-manager.test.ts +0 -383
- package/core/__tests__/storage/subtask-handoff.test.ts +0 -237
- package/core/__tests__/types/fs.test.ts +0 -125
- package/core/__tests__/utils/date-helper.test.ts +0 -449
- package/core/__tests__/utils/output.test.ts +0 -278
- package/core/__tests__/utils/preserve-sections.test.ts +0 -216
- package/core/__tests__/utils/project-commands.test.ts +0 -71
- package/core/__tests__/utils/retry.test.ts +0 -381
- package/core/__tests__/workflow/state-machine.test.ts +0 -216
- package/core/agentic/agent-router.ts +0 -150
- package/core/agentic/anti-hallucination.ts +0 -141
- package/core/agentic/chain-of-thought.ts +0 -234
- package/core/agentic/command-classifier.ts +0 -141
- package/core/agentic/command-context.ts +0 -168
- package/core/agentic/command-executor.ts +0 -471
- package/core/agentic/context-builder.ts +0 -285
- package/core/agentic/domain-classifier.ts +0 -525
- package/core/agentic/environment-block.ts +0 -102
- package/core/agentic/ground-truth.ts +0 -706
- package/core/agentic/index.ts +0 -193
- package/core/agentic/injection-validator.ts +0 -208
- package/core/agentic/loop-detector.ts +0 -451
- package/core/agentic/memory-system.ts +0 -1547
- package/core/agentic/orchestrator-executor.ts +0 -579
- package/core/agentic/plan-mode.ts +0 -525
- package/core/agentic/prompt-builder.ts +0 -1069
- package/core/agentic/response-validator.ts +0 -98
- package/core/agentic/services.ts +0 -167
- package/core/agentic/skill-loader.ts +0 -106
- package/core/agentic/smart-context.ts +0 -393
- package/core/agentic/tech-normalizer.ts +0 -167
- package/core/agentic/template-executor.ts +0 -272
- package/core/agentic/template-loader.ts +0 -109
- package/core/agentic/token-budget.ts +0 -226
- package/core/agentic/tool-registry.ts +0 -146
- package/core/agents/index.ts +0 -28
- package/core/agents/performance.ts +0 -429
- package/core/ai-tools/formatters.ts +0 -341
- package/core/ai-tools/generator.ts +0 -144
- package/core/ai-tools/index.ts +0 -15
- package/core/ai-tools/registry.ts +0 -201
- package/core/bus/bus.ts +0 -314
- package/core/bus/index.ts +0 -8
- package/core/cli/linear.ts +0 -500
- package/core/cli/lint-meta-commentary.ts +0 -177
- package/core/cli/start.ts +0 -386
- package/core/commands/analysis.ts +0 -1274
- package/core/commands/analytics.ts +0 -342
- package/core/commands/base.ts +0 -118
- package/core/commands/cleanup.ts +0 -157
- package/core/commands/command-data.ts +0 -463
- package/core/commands/commands.ts +0 -306
- package/core/commands/context.ts +0 -238
- package/core/commands/design.ts +0 -77
- package/core/commands/index.ts +0 -19
- package/core/commands/maintenance.ts +0 -77
- package/core/commands/performance.ts +0 -114
- package/core/commands/planning.ts +0 -662
- package/core/commands/register.ts +0 -127
- package/core/commands/registry.ts +0 -444
- package/core/commands/setup.ts +0 -280
- package/core/commands/shipping.ts +0 -267
- package/core/commands/snapshots.ts +0 -297
- package/core/commands/uninstall.ts +0 -542
- package/core/commands/velocity.ts +0 -149
- package/core/commands/workflow.ts +0 -505
- package/core/config/command-context.config.json +0 -66
- package/core/constants/index.ts +0 -379
- package/core/context/generator.ts +0 -368
- package/core/context-tools/files-tool.ts +0 -577
- package/core/context-tools/imports-tool.ts +0 -400
- package/core/context-tools/index.ts +0 -434
- package/core/context-tools/recent-tool.ts +0 -301
- package/core/context-tools/signatures-tool.ts +0 -495
- package/core/context-tools/summary-tool.ts +0 -301
- package/core/context-tools/token-counter.ts +0 -273
- package/core/context-tools/types.ts +0 -253
- package/core/domain/agent-generator.ts +0 -186
- package/core/domain/agent-loader.ts +0 -419
- package/core/domain/analyzer.ts +0 -387
- package/core/domain/architecture-generator.ts +0 -108
- package/core/domain/bm25.ts +0 -525
- package/core/domain/change-propagator.ts +0 -162
- package/core/domain/context-estimator.ts +0 -175
- package/core/domain/fibonacci.ts +0 -128
- package/core/domain/file-hasher.ts +0 -296
- package/core/domain/file-ranker.ts +0 -151
- package/core/domain/git-cochange.ts +0 -250
- package/core/domain/import-graph.ts +0 -315
- package/core/domain/snapshot-manager.ts +0 -415
- package/core/domain/task-stack.ts +0 -578
- package/core/domain/velocity.ts +0 -470
- package/core/errors.ts +0 -335
- package/core/events/events.ts +0 -85
- package/core/events/index.ts +0 -8
- package/core/index.ts +0 -481
- package/core/infrastructure/agent-detector.ts +0 -135
- package/core/infrastructure/ai-provider.ts +0 -578
- package/core/infrastructure/author-detector.ts +0 -133
- package/core/infrastructure/capability-installer.ts +0 -76
- package/core/infrastructure/claude-agent.ts +0 -297
- package/core/infrastructure/command-installer.ts +0 -752
- package/core/infrastructure/config-manager.ts +0 -364
- package/core/infrastructure/editors-config.ts +0 -172
- package/core/infrastructure/path-manager.ts +0 -571
- package/core/infrastructure/performance-tracker.ts +0 -326
- package/core/infrastructure/permission-manager.ts +0 -289
- package/core/infrastructure/setup.ts +0 -1061
- package/core/infrastructure/update-checker.ts +0 -246
- package/core/integrations/issue-tracker/enricher.ts +0 -271
- package/core/integrations/issue-tracker/index.ts +0 -8
- package/core/integrations/issue-tracker/manager.ts +0 -286
- package/core/integrations/issue-tracker/types.ts +0 -310
- package/core/integrations/jira/cache.ts +0 -57
- package/core/integrations/jira/client.ts +0 -688
- package/core/integrations/jira/index.ts +0 -23
- package/core/integrations/jira/service.ts +0 -244
- package/core/integrations/linear/cache.ts +0 -68
- package/core/integrations/linear/client.ts +0 -436
- package/core/integrations/linear/index.ts +0 -20
- package/core/integrations/linear/service.ts +0 -260
- package/core/integrations/linear/sync.ts +0 -314
- package/core/outcomes/analyzer.ts +0 -286
- package/core/outcomes/index.ts +0 -34
- package/core/outcomes/recorder.ts +0 -195
- package/core/plugin/builtin/webhook.ts +0 -148
- package/core/plugin/hooks.ts +0 -315
- package/core/plugin/index.ts +0 -50
- package/core/plugin/loader.ts +0 -354
- package/core/plugin/registry.ts +0 -326
- package/core/schemas/agents.ts +0 -27
- package/core/schemas/analysis.ts +0 -530
- package/core/schemas/classification.ts +0 -91
- package/core/schemas/command-context.ts +0 -29
- package/core/schemas/enriched-task.ts +0 -291
- package/core/schemas/ideas.ts +0 -114
- package/core/schemas/index.ts +0 -53
- package/core/schemas/issues.ts +0 -159
- package/core/schemas/llm-output.ts +0 -170
- package/core/schemas/metrics.ts +0 -143
- package/core/schemas/model.ts +0 -153
- package/core/schemas/outcomes.ts +0 -487
- package/core/schemas/performance.ts +0 -128
- package/core/schemas/permissions.ts +0 -180
- package/core/schemas/prd.ts +0 -450
- package/core/schemas/project.ts +0 -57
- package/core/schemas/roadmap.ts +0 -322
- package/core/schemas/schemas.ts +0 -38
- package/core/schemas/shipped.ts +0 -109
- package/core/schemas/state.ts +0 -284
- package/core/schemas/velocity.ts +0 -103
- package/core/server/index.ts +0 -21
- package/core/server/routes-extended.ts +0 -566
- package/core/server/routes.ts +0 -176
- package/core/server/server.ts +0 -149
- package/core/server/sse.ts +0 -192
- package/core/services/agent-generator.ts +0 -385
- package/core/services/agent-service.ts +0 -168
- package/core/services/breakdown-service.ts +0 -124
- package/core/services/context-generator.ts +0 -445
- package/core/services/context-selector.ts +0 -429
- package/core/services/dependency-validator.ts +0 -318
- package/core/services/diff-generator.ts +0 -313
- package/core/services/doctor-service.ts +0 -423
- package/core/services/file-categorizer.ts +0 -448
- package/core/services/file-scorer.ts +0 -270
- package/core/services/git-analyzer.ts +0 -293
- package/core/services/hierarchical-agent-resolver.ts +0 -236
- package/core/services/hooks-service.ts +0 -685
- package/core/services/index.ts +0 -46
- package/core/services/local-state-generator.ts +0 -158
- package/core/services/memory-service.ts +0 -181
- package/core/services/nested-context-resolver.ts +0 -842
- package/core/services/project-index.ts +0 -911
- package/core/services/project-service.ts +0 -155
- package/core/services/session-tracker.ts +0 -287
- package/core/services/skill-installer.ts +0 -447
- package/core/services/skill-lock.ts +0 -132
- package/core/services/skill-service.ts +0 -306
- package/core/services/stack-detector.ts +0 -229
- package/core/services/staleness-checker.ts +0 -327
- package/core/services/sync-service.ts +0 -1515
- package/core/services/sync-verifier.ts +0 -253
- package/core/services/watch-service.ts +0 -312
- package/core/session/compaction.ts +0 -248
- package/core/session/index.ts +0 -35
- package/core/session/log-migration.ts +0 -88
- package/core/session/metrics.ts +0 -323
- package/core/session/session-log-manager.ts +0 -307
- package/core/session/task-session-manager.ts +0 -404
- package/core/session/utils.ts +0 -51
- package/core/storage/analysis-storage.ts +0 -373
- package/core/storage/archive-storage.ts +0 -205
- package/core/storage/database.ts +0 -575
- package/core/storage/ideas-storage.ts +0 -298
- package/core/storage/index-storage.ts +0 -523
- package/core/storage/index.ts +0 -79
- package/core/storage/metrics-storage.ts +0 -321
- package/core/storage/migrate-json.ts +0 -720
- package/core/storage/queue-storage.ts +0 -336
- package/core/storage/safe-reader.ts +0 -105
- package/core/storage/shipped-storage.ts +0 -253
- package/core/storage/state-storage.ts +0 -1035
- package/core/storage/storage-manager.ts +0 -205
- package/core/storage/storage.ts +0 -177
- package/core/storage/velocity-storage.ts +0 -149
- package/core/sync/auth-config.ts +0 -138
- package/core/sync/index.ts +0 -31
- package/core/sync/oauth-handler.ts +0 -143
- package/core/sync/sync-client.ts +0 -251
- package/core/sync/sync-manager.ts +0 -327
- package/core/tsconfig.json +0 -22
- package/core/types/agentic.ts +0 -760
- package/core/types/agents.ts +0 -150
- package/core/types/bus.ts +0 -193
- package/core/types/citations.ts +0 -22
- package/core/types/commands.ts +0 -399
- package/core/types/config.ts +0 -92
- package/core/types/core.ts +0 -96
- package/core/types/diff.ts +0 -41
- package/core/types/domain.ts +0 -71
- package/core/types/errors.ts +0 -111
- package/core/types/events.ts +0 -42
- package/core/types/fs.ts +0 -72
- package/core/types/index.ts +0 -510
- package/core/types/infrastructure.ts +0 -210
- package/core/types/integrations.ts +0 -31
- package/core/types/jira.ts +0 -51
- package/core/types/logger.ts +0 -17
- package/core/types/memory.ts +0 -313
- package/core/types/outcomes.ts +0 -190
- package/core/types/output.ts +0 -47
- package/core/types/plugin.ts +0 -25
- package/core/types/project-sync.ts +0 -129
- package/core/types/provider.ts +0 -163
- package/core/types/server.ts +0 -71
- package/core/types/services.ts +0 -84
- package/core/types/session.ts +0 -135
- package/core/types/stack.ts +0 -19
- package/core/types/storage.ts +0 -318
- package/core/types/sync-verifier.ts +0 -33
- package/core/types/sync.ts +0 -121
- package/core/types/task.ts +0 -72
- package/core/types/template.ts +0 -24
- package/core/types/utils.ts +0 -92
- package/core/types/workflow.ts +0 -23
- package/core/utils/agent-stream.ts +0 -140
- package/core/utils/animations.ts +0 -251
- package/core/utils/branding.ts +0 -88
- package/core/utils/cache.ts +0 -187
- package/core/utils/citations.ts +0 -39
- package/core/utils/collection-filters.ts +0 -209
- package/core/utils/date-helper.ts +0 -176
- package/core/utils/error-messages.ts +0 -38
- package/core/utils/file-helper.ts +0 -277
- package/core/utils/fs-helpers.ts +0 -14
- package/core/utils/help.ts +0 -314
- package/core/utils/jsonl-helper.ts +0 -290
- package/core/utils/keychain.ts +0 -127
- package/core/utils/logger.ts +0 -77
- package/core/utils/markdown-builder.ts +0 -280
- package/core/utils/next-steps.ts +0 -95
- package/core/utils/output.ts +0 -403
- package/core/utils/preserve-sections.ts +0 -218
- package/core/utils/project-commands.ts +0 -126
- package/core/utils/project-credentials.ts +0 -143
- package/core/utils/provider-cache.ts +0 -49
- package/core/utils/retry.ts +0 -318
- package/core/utils/runtime.ts +0 -108
- package/core/utils/session-helper.ts +0 -278
- package/core/utils/subtask-table.ts +0 -227
- package/core/utils/version.ts +0 -128
- package/core/wizard/index.ts +0 -13
- package/core/wizard/onboarding.ts +0 -633
- package/core/workflow/index.ts +0 -7
- package/core/workflow/state-machine.ts +0 -198
- package/core/workflow/workflow-preferences.ts +0 -294
- package/dist/core/infrastructure/command-installer.js +0 -1141
- package/dist/core/infrastructure/editors-config.js +0 -177
- package/dist/core/infrastructure/setup.js +0 -2244
- package/dist/core/utils/version.js +0 -141
- package/templates/agentic/agent-routing.md +0 -45
- package/templates/agentic/agents/uxui.md +0 -63
- package/templates/agentic/checklist-routing.md +0 -98
- package/templates/agentic/orchestrator.md +0 -68
- package/templates/agentic/task-fragmentation.md +0 -89
- package/templates/agents/AGENTS.md +0 -68
- package/templates/analysis/analyze.md +0 -84
- package/templates/analysis/patterns.md +0 -60
- package/templates/antigravity/SKILL.md +0 -39
- package/templates/architect/discovery.md +0 -67
- package/templates/architect/phases.md +0 -59
- package/templates/checklists/architecture.md +0 -28
- package/templates/checklists/code-quality.md +0 -28
- package/templates/checklists/data.md +0 -33
- package/templates/checklists/documentation.md +0 -33
- package/templates/checklists/infrastructure.md +0 -33
- package/templates/checklists/performance.md +0 -33
- package/templates/checklists/security.md +0 -33
- package/templates/checklists/testing.md +0 -33
- package/templates/checklists/ux-ui.md +0 -37
- package/templates/commands/analyze.md +0 -56
- package/templates/commands/auth.md +0 -234
- package/templates/commands/bug.md +0 -163
- package/templates/commands/cleanup.md +0 -19
- package/templates/commands/dash.md +0 -99
- package/templates/commands/design.md +0 -15
- package/templates/commands/done.md +0 -291
- package/templates/commands/enrich.md +0 -174
- package/templates/commands/git.md +0 -295
- package/templates/commands/history.md +0 -389
- package/templates/commands/idea.md +0 -88
- package/templates/commands/impact.md +0 -864
- package/templates/commands/init.md +0 -54
- package/templates/commands/jira.md +0 -278
- package/templates/commands/linear.md +0 -288
- package/templates/commands/merge.md +0 -206
- package/templates/commands/next.md +0 -80
- package/templates/commands/p.md +0 -67
- package/templates/commands/p.toml +0 -37
- package/templates/commands/pause.md +0 -136
- package/templates/commands/plan.md +0 -696
- package/templates/commands/prd.md +0 -356
- package/templates/commands/resume.md +0 -171
- package/templates/commands/review.md +0 -276
- package/templates/commands/serve.md +0 -118
- package/templates/commands/setup.md +0 -91
- package/templates/commands/ship.md +0 -475
- package/templates/commands/skill.md +0 -259
- package/templates/commands/spec.md +0 -218
- package/templates/commands/status.md +0 -207
- package/templates/commands/sync.md +0 -104
- package/templates/commands/task.md +0 -312
- package/templates/commands/test.md +0 -93
- package/templates/commands/update.md +0 -63
- package/templates/commands/verify.md +0 -204
- package/templates/commands/workflow.md +0 -150
- package/templates/config/skill-mappings.json +0 -82
- package/templates/context/dashboard.md +0 -256
- package/templates/context/roadmap.md +0 -221
- package/templates/cursor/commands/bug.md +0 -8
- package/templates/cursor/commands/done.md +0 -4
- package/templates/cursor/commands/pause.md +0 -6
- package/templates/cursor/commands/resume.md +0 -4
- package/templates/cursor/commands/ship.md +0 -8
- package/templates/cursor/commands/sync.md +0 -4
- package/templates/cursor/commands/task.md +0 -8
- package/templates/cursor/p.md +0 -29
- package/templates/cursor/router.mdc +0 -28
- package/templates/design/api.md +0 -95
- package/templates/design/architecture.md +0 -77
- package/templates/design/component.md +0 -89
- package/templates/design/database.md +0 -78
- package/templates/design/flow.md +0 -94
- package/templates/global/ANTIGRAVITY.md +0 -254
- package/templates/global/CLAUDE.md +0 -497
- package/templates/global/CURSOR.mdc +0 -266
- package/templates/global/GEMINI.md +0 -293
- package/templates/global/STORAGE-SPEC.md +0 -391
- package/templates/global/WINDSURF.md +0 -266
- package/templates/global/modules/CLAUDE-commands.md +0 -70
- package/templates/global/modules/CLAUDE-core.md +0 -105
- package/templates/global/modules/CLAUDE-git.md +0 -50
- package/templates/global/modules/CLAUDE-intelligence.md +0 -92
- package/templates/global/modules/CLAUDE-storage.md +0 -50
- package/templates/global/modules/module-config.json +0 -36
- package/templates/mcp-config.json +0 -19
- package/templates/permissions/default.jsonc +0 -60
- package/templates/permissions/permissive.jsonc +0 -49
- package/templates/permissions/strict.jsonc +0 -58
- package/templates/planning-methodology.md +0 -195
- package/templates/skills/code-review.md +0 -47
- package/templates/skills/debug.md +0 -61
- package/templates/skills/refactor.md +0 -47
- package/templates/subagents/agent-base.md +0 -20
- package/templates/subagents/domain/backend.md +0 -109
- package/templates/subagents/domain/database.md +0 -121
- package/templates/subagents/domain/devops.md +0 -152
- package/templates/subagents/domain/frontend.md +0 -103
- package/templates/subagents/domain/testing.md +0 -169
- package/templates/subagents/pm-expert.md +0 -366
- package/templates/subagents/workflow/chief-architect.md +0 -657
- package/templates/subagents/workflow/prjct-planner.md +0 -159
- package/templates/subagents/workflow/prjct-shipper.md +0 -188
- package/templates/subagents/workflow/prjct-workflow.md +0 -98
- package/templates/tools/bash.txt +0 -22
- package/templates/tools/edit.txt +0 -18
- package/templates/tools/glob.txt +0 -19
- package/templates/tools/grep.txt +0 -21
- package/templates/tools/read.txt +0 -14
- package/templates/tools/task.txt +0 -20
- package/templates/tools/webfetch.txt +0 -16
- package/templates/tools/websearch.txt +0 -18
- package/templates/tools/write.txt +0 -17
- package/templates/windsurf/router.md +0 -28
- package/templates/windsurf/workflows/bug.md +0 -8
- package/templates/windsurf/workflows/done.md +0 -4
- package/templates/windsurf/workflows/pause.md +0 -4
- package/templates/windsurf/workflows/resume.md +0 -4
- package/templates/windsurf/workflows/ship.md +0 -8
- package/templates/windsurf/workflows/sync.md +0 -4
- package/templates/windsurf/workflows/task.md +0 -8
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Token Budget Coordinator Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for:
|
|
5
|
-
* - Budget calculation from model context windows
|
|
6
|
-
* - Priority-based allocation (state > injection > files)
|
|
7
|
-
* - Token request/record tracking
|
|
8
|
-
* - Overflow detection and prevention
|
|
9
|
-
* - Different model allocations
|
|
10
|
-
*
|
|
11
|
-
* @see PRJ-266
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { describe, expect, it } from 'bun:test'
|
|
15
|
-
import { budgetsFromCoordinator } from '../../agentic/injection-validator'
|
|
16
|
-
import {
|
|
17
|
-
calculateInputBudget,
|
|
18
|
-
calculateOutputReserve,
|
|
19
|
-
getContextWindow,
|
|
20
|
-
INPUT_RATIO,
|
|
21
|
-
MODEL_CONTEXT_WINDOWS,
|
|
22
|
-
TokenBudgetCoordinator,
|
|
23
|
-
} from '../../agentic/token-budget'
|
|
24
|
-
|
|
25
|
-
// =============================================================================
|
|
26
|
-
// getContextWindow
|
|
27
|
-
// =============================================================================
|
|
28
|
-
|
|
29
|
-
describe('getContextWindow', () => {
|
|
30
|
-
it('should return 200K for Claude models', () => {
|
|
31
|
-
expect(getContextWindow('opus')).toBe(200_000)
|
|
32
|
-
expect(getContextWindow('sonnet')).toBe(200_000)
|
|
33
|
-
expect(getContextWindow('haiku')).toBe(200_000)
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
it('should return 1M for Gemini models', () => {
|
|
37
|
-
expect(getContextWindow('2.5-pro')).toBe(1_000_000)
|
|
38
|
-
expect(getContextWindow('2.5-flash')).toBe(1_000_000)
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
it('should return default for unknown models', () => {
|
|
42
|
-
expect(getContextWindow('unknown-model')).toBe(MODEL_CONTEXT_WINDOWS.default)
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
it('should return default when no model specified', () => {
|
|
46
|
-
expect(getContextWindow()).toBe(MODEL_CONTEXT_WINDOWS.default)
|
|
47
|
-
expect(getContextWindow(undefined)).toBe(MODEL_CONTEXT_WINDOWS.default)
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
it('should support full model IDs', () => {
|
|
51
|
-
expect(getContextWindow('claude-opus-4-6')).toBe(200_000)
|
|
52
|
-
expect(getContextWindow('claude-sonnet-4.5')).toBe(200_000)
|
|
53
|
-
})
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
// =============================================================================
|
|
57
|
-
// calculateInputBudget / calculateOutputReserve
|
|
58
|
-
// =============================================================================
|
|
59
|
-
|
|
60
|
-
describe('calculateInputBudget', () => {
|
|
61
|
-
it('should return 65% of context window', () => {
|
|
62
|
-
const budget = calculateInputBudget('sonnet')
|
|
63
|
-
expect(budget).toBe(Math.floor(200_000 * INPUT_RATIO))
|
|
64
|
-
expect(budget).toBe(130_000)
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
it('should return larger budget for Gemini models', () => {
|
|
68
|
-
const budget = calculateInputBudget('2.5-pro')
|
|
69
|
-
expect(budget).toBe(Math.floor(1_000_000 * INPUT_RATIO))
|
|
70
|
-
expect(budget).toBe(650_000)
|
|
71
|
-
})
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
describe('calculateOutputReserve', () => {
|
|
75
|
-
it('should reserve 35% for output', () => {
|
|
76
|
-
const reserve = calculateOutputReserve('sonnet')
|
|
77
|
-
expect(reserve).toBe(200_000 - 130_000)
|
|
78
|
-
expect(reserve).toBe(70_000)
|
|
79
|
-
})
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
// =============================================================================
|
|
83
|
-
// TokenBudgetCoordinator — Allocation
|
|
84
|
-
// =============================================================================
|
|
85
|
-
|
|
86
|
-
describe('TokenBudgetCoordinator allocation', () => {
|
|
87
|
-
it('should create coordinator with default model', () => {
|
|
88
|
-
const coordinator = new TokenBudgetCoordinator()
|
|
89
|
-
const allocation = coordinator.getAllocation()
|
|
90
|
-
|
|
91
|
-
expect(allocation.contextWindow).toBe(200_000)
|
|
92
|
-
expect(allocation.inputBudget).toBe(130_000)
|
|
93
|
-
expect(allocation.outputReserve).toBe(70_000)
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
it('should distribute budget across three categories', () => {
|
|
97
|
-
const coordinator = new TokenBudgetCoordinator('sonnet')
|
|
98
|
-
const allocation = coordinator.getAllocation()
|
|
99
|
-
|
|
100
|
-
expect(allocation.state).toBeGreaterThan(0)
|
|
101
|
-
expect(allocation.injection).toBeGreaterThan(0)
|
|
102
|
-
expect(allocation.files).toBeGreaterThan(0)
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
it('should allocate all input budget (no waste)', () => {
|
|
106
|
-
const coordinator = new TokenBudgetCoordinator('sonnet')
|
|
107
|
-
const allocation = coordinator.getAllocation()
|
|
108
|
-
|
|
109
|
-
const totalAllocated = allocation.state + allocation.injection + allocation.files
|
|
110
|
-
expect(totalAllocated).toBe(allocation.inputBudget)
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
it('should give files the largest allocation', () => {
|
|
114
|
-
const coordinator = new TokenBudgetCoordinator('sonnet')
|
|
115
|
-
const allocation = coordinator.getAllocation()
|
|
116
|
-
|
|
117
|
-
expect(allocation.files).toBeGreaterThan(allocation.state)
|
|
118
|
-
expect(allocation.files).toBeGreaterThan(allocation.injection)
|
|
119
|
-
})
|
|
120
|
-
|
|
121
|
-
it('should give state minimum 1500 tokens', () => {
|
|
122
|
-
const coordinator = new TokenBudgetCoordinator('sonnet')
|
|
123
|
-
const allocation = coordinator.getAllocation()
|
|
124
|
-
|
|
125
|
-
expect(allocation.state).toBeGreaterThanOrEqual(1_500)
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
it('should give injection minimum 8000 tokens', () => {
|
|
129
|
-
const coordinator = new TokenBudgetCoordinator('sonnet')
|
|
130
|
-
const allocation = coordinator.getAllocation()
|
|
131
|
-
|
|
132
|
-
expect(allocation.injection).toBeGreaterThanOrEqual(8_000)
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
it('should give larger allocations for Gemini models', () => {
|
|
136
|
-
const claudeCoord = new TokenBudgetCoordinator('sonnet')
|
|
137
|
-
const geminiCoord = new TokenBudgetCoordinator('2.5-pro')
|
|
138
|
-
|
|
139
|
-
const claudeAlloc = claudeCoord.getAllocation()
|
|
140
|
-
const geminiAlloc = geminiCoord.getAllocation()
|
|
141
|
-
|
|
142
|
-
expect(geminiAlloc.files).toBeGreaterThan(claudeAlloc.files)
|
|
143
|
-
expect(geminiAlloc.inputBudget).toBeGreaterThan(claudeAlloc.inputBudget)
|
|
144
|
-
})
|
|
145
|
-
})
|
|
146
|
-
|
|
147
|
-
// =============================================================================
|
|
148
|
-
// TokenBudgetCoordinator — Request/Record
|
|
149
|
-
// =============================================================================
|
|
150
|
-
|
|
151
|
-
describe('TokenBudgetCoordinator request/record', () => {
|
|
152
|
-
it('should grant tokens up to allocation', () => {
|
|
153
|
-
const coordinator = new TokenBudgetCoordinator('sonnet')
|
|
154
|
-
const stateAlloc = coordinator.getAllocationFor('state')
|
|
155
|
-
|
|
156
|
-
const granted = coordinator.request('state', 500)
|
|
157
|
-
expect(granted).toBe(500)
|
|
158
|
-
|
|
159
|
-
const usage = coordinator.getUsage('state')
|
|
160
|
-
expect(usage.used).toBe(500)
|
|
161
|
-
expect(usage.remaining).toBe(stateAlloc - 500)
|
|
162
|
-
})
|
|
163
|
-
|
|
164
|
-
it('should cap grants at available budget', () => {
|
|
165
|
-
const coordinator = new TokenBudgetCoordinator('sonnet')
|
|
166
|
-
const stateAlloc = coordinator.getAllocationFor('state')
|
|
167
|
-
|
|
168
|
-
// Request more than allocated
|
|
169
|
-
const granted = coordinator.request('state', stateAlloc + 1000)
|
|
170
|
-
expect(granted).toBe(stateAlloc)
|
|
171
|
-
})
|
|
172
|
-
|
|
173
|
-
it('should track cumulative usage', () => {
|
|
174
|
-
const coordinator = new TokenBudgetCoordinator('sonnet')
|
|
175
|
-
|
|
176
|
-
coordinator.request('state', 500)
|
|
177
|
-
coordinator.request('state', 300)
|
|
178
|
-
|
|
179
|
-
const usage = coordinator.getUsage('state')
|
|
180
|
-
expect(usage.used).toBe(800)
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
it('should return 0 when budget exhausted', () => {
|
|
184
|
-
const coordinator = new TokenBudgetCoordinator('sonnet')
|
|
185
|
-
const stateAlloc = coordinator.getAllocationFor('state')
|
|
186
|
-
|
|
187
|
-
coordinator.request('state', stateAlloc)
|
|
188
|
-
const granted = coordinator.request('state', 100)
|
|
189
|
-
expect(granted).toBe(0)
|
|
190
|
-
})
|
|
191
|
-
|
|
192
|
-
it('should record usage independently', () => {
|
|
193
|
-
const coordinator = new TokenBudgetCoordinator('sonnet')
|
|
194
|
-
|
|
195
|
-
coordinator.record('files', 5000)
|
|
196
|
-
const usage = coordinator.getUsage('files')
|
|
197
|
-
expect(usage.used).toBe(5000)
|
|
198
|
-
})
|
|
199
|
-
|
|
200
|
-
it('should track total remaining across categories', () => {
|
|
201
|
-
const coordinator = new TokenBudgetCoordinator('sonnet')
|
|
202
|
-
const inputBudget = coordinator.inputBudget
|
|
203
|
-
|
|
204
|
-
coordinator.request('state', 500)
|
|
205
|
-
coordinator.request('injection', 2000)
|
|
206
|
-
coordinator.request('files', 10000)
|
|
207
|
-
|
|
208
|
-
expect(coordinator.totalRemaining).toBe(inputBudget - 500 - 2000 - 10000)
|
|
209
|
-
})
|
|
210
|
-
})
|
|
211
|
-
|
|
212
|
-
// =============================================================================
|
|
213
|
-
// TokenBudgetCoordinator — Overflow Detection
|
|
214
|
-
// =============================================================================
|
|
215
|
-
|
|
216
|
-
describe('TokenBudgetCoordinator overflow detection', () => {
|
|
217
|
-
it('should not be over budget initially', () => {
|
|
218
|
-
const coordinator = new TokenBudgetCoordinator('sonnet')
|
|
219
|
-
expect(coordinator.isOverBudget).toBe(false)
|
|
220
|
-
})
|
|
221
|
-
|
|
222
|
-
it('should detect overflow when usage exceeds input budget', () => {
|
|
223
|
-
const coordinator = new TokenBudgetCoordinator('sonnet')
|
|
224
|
-
const inputBudget = coordinator.inputBudget
|
|
225
|
-
|
|
226
|
-
// Force overflow via record (bypasses allocation cap)
|
|
227
|
-
coordinator.record('files', inputBudget + 1)
|
|
228
|
-
expect(coordinator.isOverBudget).toBe(true)
|
|
229
|
-
})
|
|
230
|
-
|
|
231
|
-
it('should prevent overflow via request mechanism', () => {
|
|
232
|
-
const coordinator = new TokenBudgetCoordinator('sonnet')
|
|
233
|
-
|
|
234
|
-
// Exhaust state budget
|
|
235
|
-
const stateAlloc = coordinator.getAllocationFor('state')
|
|
236
|
-
const granted = coordinator.request('state', stateAlloc + 50000)
|
|
237
|
-
|
|
238
|
-
// Should only get what was allocated
|
|
239
|
-
expect(granted).toBe(stateAlloc)
|
|
240
|
-
expect(coordinator.isOverBudget).toBe(false)
|
|
241
|
-
})
|
|
242
|
-
})
|
|
243
|
-
|
|
244
|
-
// =============================================================================
|
|
245
|
-
// budgetsFromCoordinator integration
|
|
246
|
-
// =============================================================================
|
|
247
|
-
|
|
248
|
-
describe('budgetsFromCoordinator', () => {
|
|
249
|
-
it('should create injection budgets from coordinator', () => {
|
|
250
|
-
const coordinator = new TokenBudgetCoordinator('sonnet')
|
|
251
|
-
const budgets = budgetsFromCoordinator(coordinator)
|
|
252
|
-
|
|
253
|
-
expect(budgets.totalPrompt).toBe(coordinator.getAllocationFor('injection'))
|
|
254
|
-
// Per-section budgets remain at defaults
|
|
255
|
-
expect(budgets.autoContext).toBe(500)
|
|
256
|
-
expect(budgets.agentContent).toBe(400)
|
|
257
|
-
expect(budgets.skillContent).toBe(500)
|
|
258
|
-
expect(budgets.stateData).toBe(1000)
|
|
259
|
-
expect(budgets.memories).toBe(600)
|
|
260
|
-
})
|
|
261
|
-
|
|
262
|
-
it('should give larger injection budget for Gemini models', () => {
|
|
263
|
-
const claudeBudgets = budgetsFromCoordinator(new TokenBudgetCoordinator('sonnet'))
|
|
264
|
-
const geminiBudgets = budgetsFromCoordinator(new TokenBudgetCoordinator('2.5-pro'))
|
|
265
|
-
|
|
266
|
-
expect(geminiBudgets.totalPrompt).toBeGreaterThan(claudeBudgets.totalPrompt)
|
|
267
|
-
})
|
|
268
|
-
})
|
|
269
|
-
|
|
270
|
-
// =============================================================================
|
|
271
|
-
// Different models get different allocations
|
|
272
|
-
// =============================================================================
|
|
273
|
-
|
|
274
|
-
describe('model-specific allocations', () => {
|
|
275
|
-
it('should give Gemini 5x the file budget of Claude', () => {
|
|
276
|
-
const claude = new TokenBudgetCoordinator('sonnet')
|
|
277
|
-
const gemini = new TokenBudgetCoordinator('2.5-pro')
|
|
278
|
-
|
|
279
|
-
const claudeFiles = claude.getAllocationFor('files')
|
|
280
|
-
const geminiFiles = gemini.getAllocationFor('files')
|
|
281
|
-
|
|
282
|
-
// Gemini has 1M context vs Claude 200K = 5x
|
|
283
|
-
expect(geminiFiles / claudeFiles).toBeCloseTo(5, 0)
|
|
284
|
-
})
|
|
285
|
-
|
|
286
|
-
it('should maintain 65/35 split across all models', () => {
|
|
287
|
-
for (const model of ['opus', 'sonnet', 'haiku', '2.5-pro', '2.5-flash']) {
|
|
288
|
-
const coordinator = new TokenBudgetCoordinator(model)
|
|
289
|
-
const allocation = coordinator.getAllocation()
|
|
290
|
-
const ratio = allocation.inputBudget / allocation.contextWindow
|
|
291
|
-
expect(ratio).toBeCloseTo(INPUT_RATIO, 2)
|
|
292
|
-
}
|
|
293
|
-
})
|
|
294
|
-
})
|