Move non-interactive tests to cli/, interactive tests to interactive/.
Add cron-interactive.test.ts wrapping terminal-capture E2E in vitest.
Update npm scripts and release workflow for new directory layout.
- Add scheduled-tasks.md with comprehensive guide on using /loop and CronCreate/CronList/CronDelete tools
- Update _meta.ts sidebar to include new Scheduled Tasks page in documentation navigation
This provides users with complete documentation for session-scoped scheduled tasks, including interval syntax, one-time reminders, task management, and scheduling behavior details.
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- Update cron scheduler with separate jitter strategies for recurring (up to 10% of period, capped at 15 min) and one-shot jobs (up to 90s early for :00/:30 minute marks)
- Accept 7 as valid day-of-week value (Sunday) and normalize to 0 in parser
- Implement vixie-cron day matching: OR logic when both dom and dow are constrained, AND logic when only one is constrained
- Update tests to use every-minute cron expressions for faster execution and add coverage for new day matching behavior
This improves cron job reliability by using smarter jitter calculation based on job type and fixes day-of-week matching to follow standard vixie-cron behavior where either day field can trigger execution when both are specified.
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- Add list and clear subcommands to loop skill
- Create human-readable cron display utility for common patterns
- Update tool descriptions and return displays for better UX
- Separate LLM content from user-facing display in cron tools
This enhances the loop skill with convenient subcommands while making cron job displays more readable by converting common cron expressions into natural language (e.g., 'Every 5 minutes' instead of '*/5 * * * *').
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- Add getScreenText() to TerminalCapture for reading rendered xterm.js screen
- Add E2E tests for in-session cron: inline firing, user priority, error resilience
- Fix cron prompts not processing by adding cronTrigger state dependency
This ensures cron-injected prompts are processed immediately when fired,
not just when streaming state changes, and provides comprehensive test
coverage for the in-session cron feature.
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- Update cron-create to validate cron expression before scheduling and improve success messages with clearer session-lifetime guidance
- Simplify cron-delete messages from 'deleted' to 'cancelled' for better clarity
- Streamline cron-list output to single-line format per job (ID — expression (type) [session-only]: prompt)
- Remove unused nextFireTime calculations from cron tools
- Update corresponding tests to match new output formats
This makes cron tool responses more concise and user-friendly while providing clearer information about session-only job lifetime.
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- Add detailed parsing priority order (leading token, trailing "every" clause, default)
- Include concrete examples for each parsing rule
- Clarify interval-to-cron conversion table with edge cases
- Document rounding behavior for non-divisible intervals
- Specify immediate execution after scheduling first cron fire
- Update action steps with clearer confirmation requirements
This enhances the /loop skill documentation to make interval parsing behavior more predictable and provides better guidance for handling edge cases.
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- Rename cron_expression parameter to cron for brevity across CronCreateTool
- Expand tool description with comprehensive usage guidance for one-shot and recurring tasks
- Add best practices for avoiding :00/:30 minute marks to reduce API load spikes
- Document 3-day auto-expiration for recurring jobs and session-only lifetime
- Add additionalProperties: false to all cron tool schemas for stricter validation
- Update integration tests and loop SKILL to use renamed parameter
This improves the developer experience with clearer parameter names and provides users with detailed guidance on scheduling patterns and runtime behavior.
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Change cron/loop tools from opt-out to opt-in. Cron tools are now
disabled by default and can be enabled via:
- settings.json: { "experimental": { "cron": true } }
- Environment variable: QWEN_CODE_ENABLE_CRON=1
This ensures experimental features are explicitly enabled by users
who want to try them.
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- Test cron_create, cron_list, cron_delete tool registration
- Test create-list-delete workflow in single turn
- Test one-shot (non-recurring) job creation
This validates the cron scheduler tool functionality end-to-end.
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Add session-scoped recurring jobs that fire while you work. Jobs live
inside the current Qwen Code process and are gone when you exit.
New tools:
- cron_create: schedule a prompt to run on a cron expression
- cron_list: list active cron jobs
- cron_delete: cancel a scheduled job
Components:
- CronScheduler service for in-process job management
- cronParser utility for 5-field cron expressions
- /loop skill for natural language scheduling
- Non-interactive mode integration to keep process alive
Constraints:
- Max 50 jobs per session
- 3-day expiry for recurring jobs
- Jitter to prevent thundering herd
- No catch-up for missed fire times
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- Changed all instances of "Bailian Coding Plan" to "ModelStudio Coding Plan" in README.md and related documentation.
- Updated localization files for multiple languages to reflect the new branding.
- Ensured consistency across all references to the API key and subscription requirements for the ModelStudio Coding Plan.
- Changed all instances of "Alibaba Cloud Standard API Key" to "Alibaba Cloud ModelStudio Standard API Key" in AuthDialog and related tests.
- Added documentation links for ModelStudio Standard API Key based on region selection.
- Enhanced user feedback messages to reflect the new API key terminology.
Support both 'declined' and 'denied' variants for permission denied messages in tool control tests.
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- Updated AuthDialog to handle multiple model IDs, allowing users to input and submit a comma-separated list.
- Adjusted related functions to process and validate multiple model IDs.
- Enhanced user feedback messages to reflect the changes in model ID handling.
When building diff content for edit-type permission requests, use
confirmation.filePath (full path) when available, falling back to
confirmation.fileName. This aligns with the test expectation and
ensures SubAgentTracker sends the correct file path in ACP permission
dialogs.
Verify that when PermissionManager.isToolEnabled resolves to false the
tool is never executed and no permission dialog is opened. This guards
against the async-await regression fixed in the previous commit.
PermissionManager.isToolEnabled was changed to async in this PR but the
call site in Session.runTool was not updated, causing the Promise to be
evaluated as a truthy value and the L1 tool-enablement check to always
pass — effectively disabling permission denial in the ACP session path.
- Use includePartialMessages and isSDKPartialAssistantMessage for more reliable abort triggering
- Remove flaky tool name assertions that could fail when tools aren't registered (issue #2653)
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
- glob: compute relativePaths relative to projectRoot (config.getTargetDir())
instead of searchDir so that FileDiscoveryService evaluates .gitignore /
.qwenignore rules against the correct paths when path option is used or
when searching across multiple workspace directories
- grep: deduplicate rawMatches by filePath:lineNumber key when searching
multiple workspace directories to prevent duplicate results from
overlapping search roots (e.g. parent dir + child dir in workspace)
- ripGrep: deduplicate output lines by filepath:linenum prefix when
searching multiple workspace paths to handle the same edge case
- tests: add regression tests covering
- glob ignores files matching .gitignore/.qwenignore when path option
points to a subdirectory
- grep deduplication with parent+child overlapping workspace dirs
- ripgrep deduplication when raw output contains duplicate lines