Repository navigation
Releases: GooDAnDReaDY/dsh-cron
Releases · GooDAnDReaDY/dsh-cron
Release list
v0.3.22 [DSH v0.2.1-rc.3]
Release v0.3.22: Complete Chinese Localization (zh) & ctx.effect Registration
English
- Complete Chinese Dictionary (#382, GH #19, by @rowancy66): Expanded
STRINGS.zhinlib/client-src/10-locales.jsfrom 1 key to all 399 keys, matching canonical English 1:1 with correct placeholder preservation, resolving the fallback to English on hosts running with Chinese locale. - Owned Registration via
ctx.effect(#382, GH #19): Wrappedctx.locale.register(NS, STRINGS)intoctx.effect(() => ctx.locale.register(NS, STRINGS), 'dsh-cron: locale dictionaries')with safe fallback for hosts withouteffectface. Re-applying the plugin on HMR/reload safely cleans up the registration via disposer instead of throwingalready has localeinto a swallowed catch. - Synchronized
lib/locales.json(#382, GH #19): Aligned the server locales route dictionary with client strings (purged 47 obsolete keys, added 113 missing keys) and fixed a wording typo intransfer.imported. - Architectural Formatting & Parity Verification (#382): Compacted Chinese dictionary entries in source fragments to maintain compliance with the 600-line limit per file invariant (484 lines), verified bundle size under 256 KiB limit (237,345 B), and added regression test for dictionary parity.
中文
- 完整中文本地化词典 (#382, GH #19, 由 @rowancy66 贡献):
lib/client-src/10-locales.js中的STRINGS.zh词典扩充至全部 399 条键值,与英文词典 1:1 完全对应并校验占位符一致性,彻底解决中文宿主环境下界面全部回落至英文的问题。 - 使用
ctx.effect托管注册生命周期 (#382, GH #19): 改用ctx.effect(() => ctx.locale.register(NS, STRINGS), 'dsh-cron: locale dictionaries')进行拥有所有权的注册,并保留无ctx.effect宿主的平替兜底。在模块重载或 HMR 时由 disposer 释放旧注册,避免静默捕获异常导致旧词典残留。 - 同步
lib/locales.json(#382, GH #19): 服务端词典文件与客户端界面词典完全对齐(清理 47 条已废弃键,补齐 113 条缺失键),顺手修正transfer.imported导入成功提示文案。 - 源码结构与自动化回归测试 (#382): 针对分段源码按每行双键格式化以满足单文件 <= 600 行的架构规范约束(484 行),验证构建产物大小符合商店 256 KiB 上限要求(237,345 字节),并添加词典对齐与注册方式的自动化回归测试。
Русский
- Полная китайская локализация (zh) (#382, GH #19, вклад @rowancy66): в
lib/client-src/10-locales.jsсловарьzhрасширен с 1 до 399 ключей с полным соответствием английским ключам 1:1 и сохранением переменных-плейсхолдеров, устраняя откат UI на английский язык на хостах с китайской локалью. - Регистрация словарей через
ctx.effect(#382, GH #19): регистрация вlib/client-src/90-close.jsпереведена наctx.effect(() => ctx.locale.register(NS, STRINGS), 'dsh-cron: locale dictionaries')с безопасным fallback. При HMR или перезагрузке плагина регистрация корректно выгружается disposer-функцией, предотвращая накопление устаревших копий и ошибки дубликата namespace. - Синхронизация
lib/locales.json(#382, GH #19): серверный файл локализации полностью синхронизирован со словарем клиента (удалены 47 устаревших, добавлены 113 актуальных ключей), исправлена опечатка вtransfer.imported. - Архитектурная декомпозиция и автотесты (#382): ключи
zhсгруппированы по 2 на строку для соблюдения ограничения <= 600 строк на фрагмент (484 строки), бандл укладывается в лимит 256 КиБ (237 345 байт), добавлен автоматический тест паритета локализации вtest/i18n-compliance.test.mjs.
Metadata
- NPM:
@goodandready/dsh-cron@0.3.22 - Gitea:
419f1aabc72a07abb3ee4dd9463dc959c138c59a - GitHub mirror:
e761130bc2fce92b7b0c76990b769535fbdba295
v0.3.21 [DSH v0.2.1-rc.3]
Release v0.3.21: Bounded Git Diff Capture, History Archive Protection & SandboxMode Mapping
English
Bug Fixes (#379, #380, GH #17, GH #18)
- Scoped Git Diff Capture (#379, GH #17):
- Automatic git diff capture is now strictly scoped to tasks running with
worktree: trueor explicitcaptureGitDiff: true. Non-worktree tasks ignore repository diffs by default, eliminating uncontrolled JSON accumulation (which previously bloatedtasks.jsonand archives up to 680MB and stalled the host event loop on boot for 68+ seconds).
- Automatic git diff capture is now strictly scoped to tasks running with
- Archive Byte Budget & Temp File Cleanup (#379, GH #17):
TaskStore.init()automatically prunes orphaned*.tmp.*atomic write files older than 10 minutes from aborted or crashed writes.TaskStore._archiveHistoryRuns()replaces raw 256KiB diff blobs with lightweightdiffExcerptstrings and enforces a 15MB total archive ceiling across tasks.- In active history, older runs (>10) have raw diff text truncated to 2,000 characters.
- Host SandboxMode Mapping for Presets (#380, GH #18):
permissionPreset: "full"is automatically mapped to hostdanger-full-accessSandboxModebefore callingpresets.set().danger-full-accessis officially supported in all schemas and validators (cron-tool.js,task-create.js,api-collection.js,task-patch.js, client UI) while preserving backwards compatibility with"full".- Preset application errors are logged cleanly with task identifiers rather than silently swallowed.
- Unattended Approval Pinning (#380, GH #18):
- Isolated background agent sessions pin host approval policy to
nevervia theapprovalservice, preventing unattended tasks onworkspace-writefrom stalling for 10-15 minutes waiting for interactive user escalation.
- Isolated background agent sessions pin host approval policy to
Quality Gate & Verification
- Unit & Integration Test Suite: 604 / 604 PASS (100%).
- CI Preflight: PASS (0 failures, client bundle 215,817 bytes < 262,144 ceiling, ESLint clean, 0 leaks).
Provenance
- Gitea commit:
2b97759 - GitHub mirror commit:
082106ea264bf133d4c00f7508da220075a44a5f - npm package:
@goodandready/dsh-cron@0.3.21 - Gitea PR: #381 (Closes #379, #380, Refs: GH #17, GH #18)
中文
缺陷修复 (#379, #380, GH #17, GH #18)
- 限制 Git Diff 自动捕获 (#379, GH #17):
- 自动差异捕获现仅对
worktree: true或显式启用captureGitDiff: true的任务生效。普通非 worktree 任务默认不再记录工作区 Diff,杜绝历史文件异常膨胀导致事件循环阻塞与启动超时(此前在脏工作区中曾膨胀至 680MB JSON 并导致 68秒+ 启动卡顿)。
- 自动差异捕获现仅对
- 归档字节预算与临时文件清理 (#379, GH #17):
TaskStore.init()启动时自动扫描并清理超过 10 分钟的孤立*.tmp.*临时写入文件。- 归档历史任务时剥离完整 Diff 大文本并替换为精简摘要(
diffExcerpt限制 500 字符,archived: true),同时对归档文件设置 15MB 字节上限预算。 - 活跃历史记录中超过 10 次的旧运行记录也进行 Diff 截断以控制内存与文件大小。
- 权限预设映射至宿主 SandboxMode (#380, GH #18):
permissionPreset: "full"自动映射至 DSH 宿主规范的danger-full-access模式。- 模式校验、表单与 API 全面支持
danger-full-access,同时保持对现有"full"别名的完全向后兼容。 - 预设设置失败时记录详细告警日志,不再无声吞没错误。
- 后台任务审批自动解除 (#380, GH #18):
- 后台无人值守会话强制将审批策略置为
never,彻底解决未配置完整提权时任务因等待用户交互确认而卡死 10-15 分钟的问题。
- 后台无人值守会话强制将审批策略置为
质量门禁与验证
- 单元与集成测试:604 / 604 全部通过 (100%)。
- CI Preflight:通过(0 错误,打包体积 215,817 字节 < 262,144 限制,ESLint 通过,无凭据泄漏)。
Русский
Исправление ошибок (#379, #380, GH #17, GH #18)
- Ограничение захвата Git diff (#379, GH #17):
- Автоматический захват diff переведён в строго ограниченный режим (только задачи с
worktree: trueлибо с явнымcaptureGitDiff: true). Для не-worktree задач по умолчанию захват отключен, предотвращая лавинообразный рост истории и блокировку event loop (в GH #17 архив разрастался до 680 МБ, вызывая остановку event loop на 68+ секунд).
- Автоматический захват diff переведён в строго ограниченный режим (только задачи с
- Защита архива и очистка временных файлов (#379, GH #17):
- В
TaskStore.init()добавлена автоматическая очистка осиротевших*.tmp.*файлов атомарной записи (старше 10 минут). - В
TaskStore._archiveHistoryRuns()сырой 256KiB текст diff заменяется на компактныйdiffExcerpt(до 500 символов,archived: true), и установлен общий лимит размера файла архива (макс 15 МБ). В активной истории сырой diff усекается для записей старше 10.
- В
- Поддержка SandboxMode
danger-full-access(#380, GH #18):- Пресет
permissionPreset: 'full'автоматически маппится в канонический хостовыйSandboxModedanger-full-access. - В схемы и валидаторы (
cron-tool.js,task-create.js,api-collection.js,task-patch.js, UI) добавлена поддержкаdanger-full-accessс сохранением обратной совместимости дляfull. - Ошибки применения пресета логируются с указанием идентификатора задачи, а не проглатываются молча.
- Пресет
- Устранение зависания фоновых агентских задач (#380, GH #18):
- Для фоновых изолированных сессий агентских задач политика подтверждений (
approval) принудительно переводится вnever, устраняя зависание фоновых задач на 10-15 минут на интерактивных запросах подтверждения прав.
- Для фоновых изолированных сессий агентских задач политика подтверждений (
Quality Gate и проверки
- Полный набор тестов: 604 / 604 PASS (100%).
- Preflight: PASS (0 ошибок, упакованный размер 215,817 байт < 262,144 байт, ESLint чист, 0 утечек секретов).
v0.3.20 [DSH v0.2.1-rc.2]
Release v0.3.20: Cron Panel Dismissal Lifecycle & CSS Visibility Fix
English
Bug Fixes (#377, GH #16)
- Overlay Teardown on Close:
- Introduced
teardownPanel()inmountCronScreen(lib/client-src/90-close.js) to unmount the React root (root.unmount()) and remove the container from the DOM when closing the cron screen.
- Introduced
- Gated
ensure()& MutationObserver Guard:- Gated
ensure()ontoggle.isOpen(). When!toggle.isOpen(),ensure()immediately tears down the panel and returns, preventing unconditional mounting on page load and blocking resurrection via the DOMMutationObserver.
- Gated
- CSS Attribute Selector Resolution:
- Fixed unexpanded
${VIEW_ATTR}and${ACTIVE_ATTR}literals inlib/client.cssto proper CSS selectors[data-dsh-cron-view]andhtml[data-dsh-cron-active]. When the panel is inactive,[data-dsh-cron-view]is properly hidden (display: none) and conversation columns are restored.
- Fixed unexpanded
- Reliable Toggle Event Notification:
- Updated
createToggle().set(v)inlib/client-src/30-utils.jsto notify listeners even on identical values, ensuring that repeated clicks on "Back to chat" or sidebar session rows reliably re-assert teardown and DOM removal.
- Updated
- Defensive Component Bail-out:
- Added an
isOpensubscription hook inCronScreen(lib/client-src/50-cron-screen-state.js) returningnullwhen the panel is closed.
- Added an
Quality Gate & Verification
- Unit & Integration Test Suite: 597 / 597 PASS (100%).
- CI Preflight: PASS (0 failures, client bundle 215,107 bytes < 230,000 ceiling, ESLint clean, 0 leaks).
Provenance
- Gitea commit:
4984eb5 - GitHub mirror commit:
c0b19d917b6921ed890166cf48eadda26b93b8d4 - npm package:
@goodandready/dsh-cron@0.3.20 - Gitea PR: #378 (Closes #377, Refs: GH #16)
中文
缺陷修复 (#377, GH #16)
- 面板关闭彻底卸载与 DOM 移除:
- 在
mountCronScreen(lib/client-src/90-close.js) 中增加teardownPanel(),在关闭定时任务面板时执行root.unmount()并彻底从 DOM 树中移除容器元素。
- 在
ensure()状态门禁与 MutationObserver 防御:- 在
ensure()挂载逻辑前增加if (!toggle.isOpen()) { teardownPanel(); return; }门禁,彻底杜绝初始化时未开启即挂载的问题,并防止MutationObserver在关闭状态下因任何 DOM 变动而意外重新挂载。
- 在
- CSS 属性选择器修复:
- 修复
lib/client.css中未展开的模板字面量${VIEW_ATTR}与${ACTIVE_ATTR},恢复为正式属性选择器[data-dsh-cron-view]与html[data-dsh-cron-active],确保面板关闭时 CSS 正确隐藏视图并完整恢复聊天界面显示。
- 修复
- 开关事件防丢与幂等性保障:
- 改进
createToggle().set(v)(lib/client-src/30-utils.js),在重复传入相同值时依然向所有监听器广播,确保连续点击「Back to chat」或侧栏会话行能够坚固执行卸载。
- 改进
- 组件级防御渲染:
- 在
CronScreen(lib/client-src/50-cron-screen-state.js)内部接入isOpen状态感知,非激活状态下直接返回null,避免遮挡聊天界面。
- 在
质量门禁与验证
- 单元与集成测试:597 / 597 全部通过 (100%)。
- CI Preflight:通过(0 错误,打包体积 215,107 字节,ESLint 通过,无凭据泄漏)。
Русский
Исправление ошибок (#377, GH #16)
- Полная выгрузка и удаление оверлея при закрытии:
- В
mountCronScreen(lib/client-src/90-close.js) добавлена функцияteardownPanel(), вызывающаяroot.unmount()и физически удаляющая DOM-контейнер при закрытии панели.
- В
- Гейт
toggle.isOpen()вensure()и блокировка MutationObserver:- В начало
ensure()добавлена проверкаif (!toggle.isOpen()) { teardownPanel(); return; }. Панель больше не монтируется при инициализации без команды открытия, аMutationObserverне перемонтирует оверлей при закрытом состоянии.
- В начало
- Исправление CSS-селекторов атрибутов:
- В
lib/client.cssзаменены нераскрытые строковые литералы${VIEW_ATTR}и${ACTIVE_ATTR}на канонические селекторы[data-dsh-cron-view]иhtml[data-dsh-cron-active]. При неактивном состоянии оверлей корректно скрывается правиломdisplay: none, а интерфейс чата восстанавливается.
- В
- Надёжная доставка событий переключателя:
- В
createToggle().set(v)(lib/client-src/30-utils.js) снято раннее подавление повторных значений, гарантируя вызов подписчиков и повторное принудительное применениеteardownPanel()при повторных кликах «Back to chat» или выборе сессий.
- В
- Защитный хук в компоненте
CronScreen:- В
CronScreen(lib/client-src/50-cron-screen-state.js) добавлен хук состоянияisOpenс немедленным возвратомnullпри закрытом состоянии панели.
- В
Quality Gate и проверки
- Полный набор тестов: 597 / 597 PASS (100%).
- Preflight: PASS (0 ошибок, упакованный размер 215,107 байт < 230,000 байт, ESLint чист, 0 утечек секретов).
v0.3.19 [DSH v0.2.0-rc.2]
Release v0.3.19: Security Gates, Durable Storage Barrier & Package Size Optimization
English
Security Hardening (#371)
- Fail-Closed Origin & Source Gate:
- Implemented fail-closed source verification for all mutating HTTP endpoints (
POST,PUT,DELETE,PATCH) and sensitive reads (GET /tasksfrom LAN/external hosts). - External networks or Tailscale endpoints without proper authorization tokens or valid
Origin/Refererheaders are rejected with 401/403. - Hardened
/chat/startwith strict JSON body validation, properly returning 400 Bad Request on malformed payloads.
- Implemented fail-closed source verification for all mutating HTTP endpoints (
Bug Fixes & Reliability (#372)
- Async Store Disk Flush Barrier:
- Resolved race condition in
await saveAsync()where promises could resolve prematurely if interrupted by debounced/scheduled saves. - Implemented
_waitForDiskVersionbarrier ensuring callers only resolve once data is fully synchronized and written to disk.
- Resolved race condition in
Package & Developer Hygiene (#373, #374, #375)
- Clean Clone Test Environment (#373):
- Declared missing core development dependencies (
cordis,@cordisjs/core) indevDependencies, ensuringnpm testpasses 100% on fresh checkouts.
- Declared missing core development dependencies (
- Client Bundle Size Optimization (#374):
- Extracted CSS styling to
lib/client.cssand locale dictionary tolib/locales.json. - Client bundle size reduced to 214.5 KiB (well below the 230 KiB ceiling and 256 KiB store limit).
- Added automated pack size verification (
scripts/check-pack-size.mjs) tonpm test.
- Extracted CSS styling to
- Dead Code Cleanup (#375):
- Removed obsolete alias
formatDigestTelegram. - Wired standalone helpers (
topologicalSort,isCredentialUri,isTrustedRequest) to active production library paths.
- Removed obsolete alias
Quality Gate & Verification
- Unit & Integration Test Suite: 595 / 595 PASS (100%).
- CI Preflight: PASS (0 failures, client bundle 214,544 bytes < 230,000 ceiling, clean ESLint, 0 leaks).
Provenance
- Gitea commit:
79f5a3a - GitHub mirror commit:
c28beccefb4df8f59491a33a917cc13e1816df90 - npm package:
@goodandready/dsh-cron@0.3.19 - Gitea PR: #376 (Closes #371, #372, #373, #374, #375)
中文
安全强化 (#371)
- 源校验与请求隔离门禁:
- 对所有写入/变更接口(
POST,PUT,DELETE,PATCH)及局域网下的敏感读取接口(GET /tasks)执行强制 Fail-Closed 验证。 - 来自局域网或 Tailscale 未附带有效 Token 或合法
Origin/Referer的请求将被直接拦截(401/403)。 /chat/start增加严格的 JSON 请求体校验,非法或畸形 JSON 规范返回 400。
- 对所有写入/变更接口(
缺陷修复与可靠性 (#372)
- 持久化存储落盘等待屏障:
- 修复
await saveAsync()在遇到被防抖延迟保存打断时过早 resolve 的竞态问题。 - 增加
_waitForDiskVersion屏障机制,确保调用方只有在数据真正刷写到磁盘后才返回。
- 修复
工程与依赖治理 (#373, #374, #375)
- 干净检出环境测试通过 (#373):
- 在
devDependencies中补齐cordis等核心依赖,确保干净克隆环境下npm test零报错通过。
- 在
- 客户端体积深度压缩 (#374):
- 提取 CSS 独立为
lib/client.css,词条提取为lib/locales.json。 lib/client.js体积降至 214.5 KiB(远低于 230 KiB 上限与 256 KiB 商店红线)。- 在
npm test中接入自动化打包大小检查scripts/check-pack-size.mjs。
- 提取 CSS 独立为
- 冗余代码清理 (#375):
- 移除废弃别名
formatDigestTelegram。 - 将孤立辅助函数接入正式导出路径。
- 移除废弃别名
质量门禁与验证
- 单元与集成测试:595 / 595 全部通过 (100%)。
- CI Preflight:通过(0 错误,打包体积 214,544 字节,ESLint 通过,无凭据泄漏)。
Русский
Безопасность и изоляция (#371)
- Fail-Closed проверка Origin и источника запросов:
- Реализована строгая проверка источника запросов для всех мутирующих маршрутов (
POST,PUT,DELETE,PATCH) и для чтения/tasksиз LAN/Tailscale. - Внешние подключения без валидного API-токена или заголовка
Origin/Refererотклоняются с кодами 401/403. - Маршрут
/chat/startзащищён строгой валидацией входящего JSON с возвратом HTTP 400 при некорректном теле запроса.
- Реализована строгая проверка источника запросов для всех мутирующих маршрутов (
Исправление ошибок (#372)
- Барьер гарантированной записи на диск в
saveAsync:- Устранено состояние гонки, при котором
await saveAsync()мог завершаться до фактической синхронизации с диском при наложении отложенных сохранений. - Добавлен барьер
_waitForDiskVersion, гарантирующий возврат управления вызывающему коду строго после завершения физической записи.
- Устранено состояние гонки, при котором
Чистота зависимостей и оптимизация (#373, #374, #375)
- Прохождение тестов на чистом клоне (#373):
- Недостающие зависимости ядра объявлены в
devDependencies, обеспечивая 100% успешный запускnpm testиз коробки.
- Недостающие зависимости ядра объявлены в
- Оптимизация размера клиентского бандла (#374):
- Стили вынесены в
lib/client.css, локализации — вlib/locales.json. - Размер
lib/client.jsуменьшен до 214.5 КиБ (запас более 15 КиБ до целевого порога 230 КиБ и 47 КиБ до лимита магазина 256 КиБ). - Проверка размера пакета
scripts/check-pack-size.mjsинтегрирована вnpm test.
- Стили вынесены в
- Удаление мёртвого кода (#375):
- Удалён неиспользуемый псевдоним
formatDigestTelegram. - Вспомогательные функции (
topologicalSort,isCredentialUri,isTrustedRequest) подключены к активным модулям библиотеки.
- Удалён неиспользуемый псевдоним
Quality Gate и проверки
- Полный набор тестов: 595 / 595 PASS (100%).
- Preflight: PASS (0 ошибок, упакованный размер 214,544 байт < 230,000 байт, ESLint чист, 0 утечек секретов).
v0.3.18 [DSH v0.2.0-rc.2]
Release v0.3.18: Client Scope Safety & Dynamic Session Titles
English
Bug Fixes (#368, GH #14)
- Safe Element Creator Alias in Client Bundle:
- The client bundle build script rewrote
React.createElementtohglobally without lexical scope analysis. In62-modal-task-form-tail.js:122(promptHistory.map((h) => ...)) and48-timeline-heatmap-view.js:127(Array.from(..., (_, h) => ...)), the callback parameterhshadowed the top-level helper, causingTypeError: h is not a functionwhen opening the task edit modal or rendering the timeline heatmap. - Renamed history parameters to
(rev)and hour parameter to(_, hour). - Migrated build alias to
_hand added build-time guard verifying that_his never shadowed in client-src callbacks or variable declarations.
- The client bundle build script rewrote
Features & Improvements (#369, GH #15)
- Identifiable Agent Run Sessions with
sessionTitle:- Exposed
sessionTitleincronToolParametersinlib/cron-tool.jsso agents can configure custom session names via tool actions (create,update). - Added "Session Title Template" (
form.sessionTitleLabel) input field to the GUI task modal with full EN, ZH, and RU localization. _nameSession()inlib/runner.jsnow interpolates the{{date}}variable intoYYYY-MM-DD.- Scheduled agent tasks with empty
sessionTitlenow default to<YYYY-MM-DD> <task.title>instead of leaving sessions untitled, while retaining bracketed conventions (e.g.[W] ...) and preserving resumed session titles.
- Exposed
Quality Gate & Verification
- Unit & Integration Test Suite: 590 / 590 PASS (100%).
- CI Preflight: PASS (0 failures, client bundle 259,209 bytes < 256 KiB limit, ESLint clean, 0 empty catches, 0 leaks).
Provenance
- Gitea commit:
d436c0e - GitHub mirror commit:
13f87c8505a092cbdb00acb0e016984a33b31ff8 - npm package:
@goodandready/dsh-cron@0.3.18 - Gitea PR: #370 (Closes #368, Closes #369, Refs: GH #14, GH #15)
中文
缺陷修复 (#368, GH #14)
- 客户端构建 createElement 别名作用域安全修复:
- 构建脚本将
React.createElement全局替换为h时未做作用域分析,导致62-modal-task-form-tail.js:122中的promptHistory.map((h) => ...)与48-timeline-heatmap-view.js:127中的小时遍历参数遮蔽了外层别名,在打开已有任务编辑模态框及渲染热力图时抛出TypeError: h is not a function。 - 源码参数重命名为
(rev)和(_, hour);构建别名改为_h并增加严格的构建期防遮蔽断言。
- 构建脚本将
新增功能 (#369, GH #15)
- 可识别的会话标题与动态日期插值:
- 在
lib/cron-tool.js的cronToolParameters中暴露sessionTitle,支持模型智能体直接读写该字段。 - Web UI 任务模态框新增「会话标题模板」输入控件(完整支持中/英/俄多语言)。
lib/runner.js的_nameSession()支持将{{date}}解析为YYYY-MM-DD;默认未配置时自动格式化为<YYYY-MM-DD> <任务名>,彻底消除会话未命名问题,同时保持对已恢复会话及方括号命名的兼容。
- 在
质量门禁与验证
- 单元与集成测试:590 / 590 全部通过 (100%)。
- CI Preflight:通过(0 错误,打包体积 259,209 字节严格低于 256 KiB 限制,ESLint 通过,0 空 catch 块,无凭据泄漏)。
Русский
Исправление ошибок (#368, GH #14)
- Безопасность скоупа createElement в клиентском бандле:
- Скрипт сборки заменял
React.createElementнаhбез учёта лексической области видимости. В62-modal-task-form-tail.js:122(promptHistory.map((h) => ...)) и48-timeline-heatmap-view.js:127(Array.from(..., (_, h) => ...)) параметры колбэков затеняли хелпер, вызываяTypeError: h is not a functionпри открытии редактирования задачи и при отрисовке хитмапа. - Параметры переименованы в
(rev)и(_, hour), псевдоним переведён на_hс добавлением билд-тайм проверки от повторных затенений.
- Скрипт сборки заменял
Новые возможности (#369, GH #15)
- Идентифицируемые сессии агентов с шаблоном
sessionTitleи датой запуска:- Параметр
sessionTitleдобавлен в схему инструментаcronToolParametersвlib/cron-tool.js. - В интерфейс задачи (модальное окно) добавлено поле "Шаблон заголовка сессии" с мультиязычной локализацией (EN, ZH, RU).
- В
lib/runner.jsдобавлена поддержка подстановки переменной{{date}}в дату форматаГГГГ-ММ-ДД. При пустом шаблоне сессии автоматически назначается читаемое имя<ГГГГ-ММ-ДД> <название задачи>.
- Параметр
Quality Gate и проверки
- Полный набор тестов: 590 / 590 PASS (100%).
- Preflight: PASS (0 ошибок, упакованный размер 259,209 байт < 256 КиБ лимита, ESLint чист, 0 пустых catch, 0 утечек секретов).
v0.3.17 [DSH v0.2.0-rc.2]
Release v0.3.17: Host Context Connection Inject Hotfix
English
Bug Fixes (#366, GH #13)
- Safe Host Context Access in
getConnection(ctx):- In
lib/http-utils.js,getConnection(ctx)accessedReflect.get(ctx, 'connection') || ctx.connection. - On the DSH host runtime,
ctxis wrapped in a Cordis Context proxy whereconnectionis a client-side service not declared in the host plugin'sinjectarray. Reading undeclared properties throwsError: cannot get property "connection" without inject. - This caused
rejectCrossOrigin(req, res, { apiToken, ctx })to crash with HTTP 500 on every/dsh-cron/*request. - Wrapped
getConnection(ctx)in defensivetry / catch (_err)returningnullwith graceful degradation, adhering to project security standards.
- In
- Unit & Security Tests:
- Added unit test in
test/http-security-hardening.test.mjsreproducing Cordis Context proxy throwing without inject, verifyinggetConnection,getDshConnection, andrejectCrossOrigingracefully admit or reject without 500 errors.
- Added unit test in
Quality Gate & Verification
- Unit & Integration Test Suite: 586 / 586 PASS (100%).
- CI Preflight: PASS (0 failures, packed size 294,112 bytes, ESLint clean, 0 empty catches, 0 leaks).
Provenance
- Gitea commit:
1b5e9ef - GitHub mirror commit:
942f15f5e1d04e9eb451305fc2269773ee19cc07 - npm package:
@goodandready/dsh-cron@0.3.17 - Gitea PR: #367 (Closes #366, Refs: GH #13)
中文
缺陷修复 (#366, GH #13)
getConnection(ctx)宿主上下文防御性降级:- 在
lib/http-utils.js中,getConnection(ctx)读取Reflect.get(ctx, 'connection') || ctx.connection。 - 在 DSH 宿主端运行时,
ctx被 Cordis Context 代理包裹,而connection为客户端服务,未声明在宿主插件的inject依赖数组中。访问未声明属性会抛出Error: cannot get property "connection" without inject。 - 该异常导致所有
/dsh-cron/*HTTP 路由在执行rejectCrossOrigin时发生 500 崩溃,前端页面无法加载。 - 将
getConnection(ctx)封装在防御性try / catch中,捕获 Cordis 代理异常并安全返回null,确保跨域与权限检查平滑回退。
- 在
- 单元与安全测试:
- 在
test/http-security-hardening.test.mjs中添加针对 Cordis 代理异常的测试用例,验证getConnection、getDshConnection及rejectCrossOrigin在异常情况下正常工作且不抛出 500。
- 在
质量门禁与验证
- 单元与集成测试:586 / 586 全部通过 (100%)。
- CI Preflight:通过(0 错误,打包体积 294,112 字节,ESLint 通过,0 空 catch 块,无凭据泄漏)。
Русский
Исправление ошибок (#366, GH #13)
- Безопасный доступ к контексту хоста в
getConnection(ctx):- В
lib/http-utils.jsфункцияgetConnection(ctx)вызывалаReflect.get(ctx, 'connection') || ctx.connection. - На хосте DSH контекст
ctxобёрнут в Cordis Context proxy, а службаconnectionявляется клиентской и отсутствует в серверном спискеinject. Попытка чтения свойства безinjectприводила к падению с ошибкой:Error: cannot get property "connection" without inject. - Из-за этого вызов
rejectCrossOrigin(req, res, { apiToken, ctx })падал с кодом 500 на всех маршрутах/dsh-cron/*, блокируя GUI плагина. - Чтение свойства защищено блоком
try / catch (_err)с безопасным возвратомnullи плавной деградацией.
- В
- Модульные и интеграционные тесты:
- В
test/http-security-hardening.test.mjsдобавлен модульный тест с моком Cordis Context Proxy, выбрасывающим исключение безinject. Проверено корректное поведениеgetConnection,getDshConnectionиrejectCrossOrigin.
- В
Quality Gate и проверки
- Полный набор тестов: 586 / 586 PASS (100%).
- Preflight: PASS (0 ошибок, упакованный размер 294,112 байт, ESLint чист, 0 пустых catch, 0 утечек секретов).
v0.3.16 [DSH v0.2.0-rc.2]
Release v0.3.16: Architecture Modularization & Core Decomposition
English
Architecture & Refactoring (#362)
- Domain Decomposition of
lib/api.js:lib/api.jswas 913 lines; decomposed into focused submodules with a clean entry-point facade:lib/api-collection.js(249 lines): task collection CRUD, listing filters, ETag computation,buildTaskRecord, andmergeExecutionFields.lib/api-actions.js(317 lines): task actions dispatching (git diff revert/apply, doctor diagnosis/fix, prompt rollback, delivery retries, approval proposals, task duplication, execution toggle).lib/api-item.js(190 lines): single task item inspection, field patching, and deletion.lib/api.js(178 lines): route matching facade and external authenticated API requests.
- Domain Decomposition of
lib/scheduler-execution.js:lib/scheduler-execution.jswas 1068 lines; decomposed into specialized execution domains:lib/scheduler-preflight.js(195 lines): preflight environment checks (HTTP, disk, shell command), agent task definitions, and fallback model resolution.lib/scheduler-assists.js(142 lines): automated failure inspection, silent rule evaluation, model assist pipelines, and channel notifications.lib/scheduler-completion.js(413 lines): complete run lifecycle handling, outcome verification, conditional decision nodes (IF/ELSE), checkpoints, and durable journal persistence.lib/scheduler-execution.js(360 lines): execution loop lifecycle (beginRun,executeTask,finishRun) and clean re-exports.
- Architectural Constraints & Standards:
- Every hand-written source file strictly satisfies the project rule of ≤ 600 lines (all new modules are under 420 lines).
- 100% backward compatibility preserved for all public and internal exports.
Quality Gate & Verification
- Unit & Integration Test Suite: 585 / 585 PASS (100%).
- CI Preflight: PASS (0 failures, client bundle 257,242 bytes < 256 KiB limit, ESLint clean, 0 leaks).
Provenance
- Gitea commit:
45ea41695e1e12933be32c5253ceeb9bc2bb4757 - GitHub mirror commit:
1623dbf9e6f5b594e2bbbc719c8bcc8de1ac32a3 - npm package:
@goodandready/dsh-cron@0.3.16 - Gitea PR: #365 (Closes #362)
中文
架构与重构 (#362)
lib/api.js领域模块化拆分:- 原文件 913 行;拆分为专注的子领域模块,并保留简洁的顶层门面:
lib/api-collection.js(249 行):任务集合 CRUD、列表过滤、ETag 计算、buildTaskRecord与mergeExecutionFields。lib/api-actions.js(317 行):任务操作分发(Git Diff 撤销/应用、Doctor 诊断/自愈、提示词回滚、投递重试、审批提案、任务复制与启停切换)。lib/api-item.js(190 行):单任务详情检查、字段补丁更新与删除。lib/api.js(178 行):路由匹配门面与外部鉴权 API 入口。
- 原文件 913 行;拆分为专注的子领域模块,并保留简洁的顶层门面:
lib/scheduler-execution.js领域模块化拆分:- 原文件 1068 行;拆分为专用的执行子模块:
lib/scheduler-preflight.js(195 行):执行前置检查(HTTP/磁盘/命令门禁)、智能体类型定义与 Fallback 模型回退。lib/scheduler-assists.js(142 行):失败诊断分析、静默规则裁决、模型辅助流程与多通道通知。lib/scheduler-completion.js(413 行):运行完成生命周期管理、声明式校验、IF/ELSE 决策分支、检查点与持久日志存储。lib/scheduler-execution.js(360 行):调度执行循环生命周期(beginRun/executeTask/finishRun)与完整导出保持。
- 原文件 1068 行;拆分为专用的执行子模块:
- 架构规范与标准:
- 所有手写源码文件严格符合 ≤ 600 行 的项目约束(所有新模块均在 420 行以内)。
- 100% 保持所有对外与内部导出的兼容性,无任何破坏性变动。
质量门禁与验证
- 单元与集成测试:585 / 585 全部通过 (100%)。
- CI Preflight:通过(0 错误,打包体积 257,242 字节低于 256 KiB 限制,ESLint 通过,无凭据泄漏)。
Русский
Архитектура и рефакторинг (#362)
- Доменная декомпозиция
lib/api.js:- Исходный файл (913 строк) превышал норматив и декомпозирован на доменные субмодули с сохранением входного фасада:
lib/api-collection.js(249 строк): операции со списком задач, фильтрация, вычисление ETag,buildTaskRecord,mergeExecutionFields.lib/api-actions.js(317 строк): диспетчеризация действий (git-diff revert/apply, doctor diagnose/fix/revert, откат промпта, повтор доставки, одобрение предложений, дублирование, toggle).lib/api-item.js(190 строк): обработка запросов к конкретной задаче,patchTask,deleteTask.lib/api.js(178 строк): компактный фасадный роутер и обработчик внешних API-запросов.
- Исходный файл (913 строк) превышал норматив и декомпозирован на доменные субмодули с сохранением входного фасада:
- Доменная декомпозиция
lib/scheduler-execution.js:- Исходный файл (1068 строк) декомпозирован на специализированные модули:
lib/scheduler-preflight.js(195 строк): pre-flight проверки (команды, HTTP, диск), fallback моделей, изолированное выполнение.lib/scheduler-assists.js(142 строки): инспекция падений, применение silent rules, ассистенты, доставка в каналы.lib/scheduler-completion.js(413 строк): завершение рана, валидация результатов, развилки (IF/ELSE), чекпоинты и durable journal.lib/scheduler-execution.js(360 строк): фасад жизненного цикла ранов (beginRun,executeTask,finishRun) и реэкспорт функций.
- Исходный файл (1068 строк) декомпозирован на специализированные модули:
- Стандарты и ограничения:
- Все рукописные файлы кодовой базы строго ≤ 600 строк (каждый новый модуль < 420 строк).
- 100% обратная совместимость всех внутренних и внешних интерфейсов без единой регрессии.
Quality Gate и проверки
- Полный набор тестов: 585 / 585 PASS (100%).
- Preflight: PASS (0 ошибок, бандл 257,242 байт < 256 КиБ лимита, ESLint чист, 0 утечек секретов).
v0.3.15 [DSH v0.2.0-rc.2]
Release v0.3.15: Workspace Registry Lookup Fix
English
Bug Fixes
- Workspace Id Resolution via
workspaceRegistry(#363, GH #12):- Fixed an issue where any task configured with
workspaceId(and emptycwd) failed immediately withWorkspace "<workspaceId>" requested by task could not be resolved. - Injected the missing host service
'workspaceRegistry'inlib/index.js(export const inject = [...]), granting proper access under Cordis context. - Updated
resolveCwd(task, ctx)inlib/runner-worktree.jsto look upworkspaceRegistryviactx.get('workspaceRegistry')orctx.workspaceRegistry, retrieving the directory path viaregistry.get(id).path. - Added support for path/title matching in
registry.list(), and direct filesystem directory existence check when an absolute path is provided in the workspace field. - Preserved backward compatibility with legacy
workspacesservice and maintained strict fail-closed security guarantees (#231).
- Fixed an issue where any task configured with
Quality Gate & Verification
- Unit & Integration Test Suite: 585 / 585 PASS (100%) (including dedicated test suite
test/workspace-registry.test.mjs). - Preflight: PASS (0 failures, client bundle 257,242 bytes < 256 KiB limit, ESLint clean, 0 leaks).
Provenance
- Gitea commit:
49998b96839f708ba06332b94d0c8f5fd4ec76a6 - GitHub mirror commit:
9248f0cff0d31a6528d000925e884e6124171f33 - npm package:
@goodandready/dsh-cron@0.3.15 - Gitea PR: #364 (Closes #363, Refs: #12)
中文
缺陷修复
- 通过
workspaceRegistry正确解析工作区路径 (#363, GH #12):- 修复配置了
workspaceId的任务立即崩溃并报错Workspace "<workspaceId>" requested by task could not be resolved的问题。 - 在
lib/index.js的export const inject中注册缺失的宿主服务'workspaceRegistry',满足 Cordis 依赖注入访问规则。 - 优化
lib/runner-worktree.js中的resolveCwd(task, ctx):优先通过ctx.get('workspaceRegistry')或ctx.workspaceRegistry查询实体,并提取registry.get(id).path。 - 支持通过
registry.list()进行路径/标题匹配,并在输入直接目录绝对路径时提供本地文件系统验证支持。 - 完整保留对旧版
workspaces服务的向后兼容性与严格的 Fail-Closed 安全防护保证 (#231)。
- 修复配置了
质量门禁与验证
- 单元与集成测试:585 / 585 全部通过 (100%)。
- CI Preflight:通过(0 错误,打包体积 257,242 字节低于 256 KiB 限制,ESLint 通过,无凭据泄漏)。
Русский
Исправления
- Разрешение
workspaceIdчерез службу хостаworkspaceRegistry(#363, GH #12):- Устранена ошибка немедленного падения задач с указанным
workspaceId:Workspace "<workspaceId>" requested by task could not be resolved. - Внедрен сервис
'workspaceRegistry'в списокinjectвlib/index.js, обеспечивая легитимный доступ в контексте Cordis. - В
lib/runner-worktree.js:resolveCwd()реализовано обращение кworkspaceRegistryс извлечением пути.pathнайденного рабочего пространства. - Поддержан поиск совпадений по путям в
registry.list()и fallback на существующую директорию на диске при вводе прямого пути в поле рабочего пространства. - Сохранена обратная совместимость с
workspacesи fail-closed защита (#231).
- Устранена ошибка немедленного падения задач с указанным
Верификация и Quality Gate
- Полный набор тестов: 585 / 585 PASS (100%).
- Preflight: PASS (0 ошибок, бандл 257,242 байт < 256 КиБ лимита, ESLint чист, 0 утечек секретов).
v0.3.14 [DSH v0.2.0-rc.2]
Release v0.3.14: Swarm Delegation & Git Diff Patch Review
English
New Features & Capabilities
-
Swarm Delegation & Parallel Multi-Agent Execution (#350):
- Controlled Concurrency: Support for
type: 'swarm'tasks executing a decomposed list of independent subtasks under a strictconcurrencyLimit(1..10, default 3). - Fault-Tolerant Decomposition: Subtask errors are isolated within individual workers; failed workers do not crash the parent swarm or abort other subtasks.
- Automated Synthesis: Aggregation of subtask outputs into structured Markdown reports (
synthesizeSwarmResults) or dynamic model-driven synthesis (synthesizer). - Swarm Metrics & Audit: Run history captures comprehensive execution stats (
swarmStats.total,succeeded,failed,durationMs) and individual worker logs inrun.subtaskRuns. - UI Badge:
🐝 Swarm (x/y)displayed across task cards and execution logs.
- Controlled Concurrency: Support for
-
Git Diff & Interactive Patch Review (#351):
- Automatic Diff Capture: Seamlessly inspects git status, stat summaries, and unified diffs (up to 256 KiB) on task completion for worktrees and git-based tasks.
- Dedicated REST API:
GET /dsh-cron/tasks/:id/git-diffPOST /dsh-cron/tasks/:id/git-diff/discardPOST /dsh-cron/tasks/:id/git-diff/apply
- Interactive UI Preview: Color-coded unified diff viewer inside the execution history drawer.
- 1-Click Actions: Discard uncommitted changes safely (
git reset --hard HEAD && git clean -fd) or re-apply previously captured diffs (git apply --whitespace=fix).
Quality Gate & Verification
- Unit & Integration Test Suite: 578 / 578 PASS (100%) (including dedicated test suites
test/swarm.test.mjs,test/git-diff.test.mjs,test/pack27-verification.test.mjs). - Preflight: PASS (0 failures, client bundle 256,814 bytes < 256 KiB limit, ESLint clean, 0 leaks).
Provenance
- Gitea commit:
83fdbee38421174e8b1fa0482e0f8324af543fba - GitHub mirror commit:
5c1e55a499dc90e28f5538326f0e1ce484414060 - npm package:
@goodandready/dsh-cron@0.3.14 - Gitea PR: #361 (Closes #350, #351)
中文
新功能与特性
-
群蚁协同委托与多智能体并行执行 (Swarm Delegation) (#350):
- 并发受控执行:新增
type: 'swarm'任务类型,支持配置concurrencyLimit(1..10,默认 3)受控并发执行多项独立子任务。 - 高容错隔离机制:单个子任务异常完全隔离,不会造成父任务崩溃,群体自动聚合所有成功输出。
- 智能结果汇编:支持将所有子任务输出汇编为结构化 Markdown 报告或交由综合模型提炼总结。
- 完整指标留存:运行历史完整记录群体运行状态 (
swarmStats.total,succeeded,failed,durationMs) 及各子节点的详细输出。 - 直观 UI 标识:任务卡片与运行历史抽屉直观展示
🐝 Swarm (x/y)状态。
- 并发受控执行:新增
-
Git Diff 变更查看与交互式补丁审查 (#351):
- 自动 Diff 捕获:在 Git 工作区或脚本执行后自动捕获修改文件列表、状态统计及完整 Unified Diff(最高 256 KiB)。
- 专属 REST API 接口:
GET /dsh-cron/tasks/:id/git-diffPOST /dsh-cron/tasks/:id/git-diff/discardPOST /dsh-cron/tasks/:id/git-diff/apply
- 交互式审阅面板:在运行详情抽屉中直接查看带有高亮色彩区分的 Diff 变更对比。
- 一键快捷操作:支持一键丢弃改动重置工作区(
git reset --hard HEAD && git clean -fd)或重新应用补丁(git apply --whitespace=fix)。
质量门禁与验证
- 单元与集成测试:578 / 578 全部通过 (100%)。
- CI Preflight:通过(0 错误,打包体积 256,814 字节低于 256 KiB 限制,ESLint 通过,无凭据泄漏)。
Русский
Новый функционал
-
Роевая декомпозиция задач и мультиагентный запуск (Swarm Delegation) (#350):
- Управляемый пул воркеров: Поддержка задач типа
type: 'swarm'с настраиваемым пулом воркеров (concurrencyLimitот 1 до 10, по умолчанию 3). - Отказоустойчивая декомпозиция: Ошибки отдельных воркеров изолированы; рой объединяет успешные результаты и корректно фиксирует частичные сбои без падения всей задачи.
- Автоматический синтез: Сведение результатов всех воркеров в структурированный Markdown-дайджест или через выделенную модель-синтезатор.
- Метрики и история роя: Сохранение счетчиков (
swarmStats.total,succeeded,failed,durationMs) и детальных логов каждого воркера в истории запусков. - UI Бейдж: Отображение индикатора
🐝 Swarm (x/y)в карточках задач и истории выполнения.
- Управляемый пул воркеров: Поддержка задач типа
-
Просмотр Git Diff и интерактивное подтверждение патчей (Patch Review) (#351):
- Автоматический захват диффов: Задачи в Git-каталогах автоматически сохраняют список файлов (
git status), сводку изменений (git diff --stat) и унифицированный diff (до 256 КиБ). - Выделенный REST API:
GET /dsh-cron/tasks/:id/git-diffPOST /dsh-cron/tasks/:id/git-diff/discardPOST /dsh-cron/tasks/:id/git-diff/apply
- Интерактивный просмотр: Цветовая подсветка строк diff в карточке истории запусков.
- 1-Click Действия: Безопасный сброс рабочего каталога («🗑️ Discard Diff») или повторное наложение патча («✅ Apply Diff»).
- Автоматический захват диффов: Задачи в Git-каталогах автоматически сохраняют список файлов (
Верификация и Quality Gate
- Полный набор тестов: 578 / 578 PASS (100%).
- Preflight: PASS (0 ошибок, бандл 256,814 байт < 256 КиБ лимита, ESLint чист, 0 утечек секретов).
v0.3.13 [DSH v0.2.0-rc.2]
Release v0.3.13: Decision Nodes (IF/ELSE) & Autonomous Self-Healing Doctor
English
New Features & Capabilities
-
Decision Nodes & Conditional Branching IF/ELSE (#352):
- Dynamic Routing: Tasks can define
branchRulesevaluating execution outcomes (exitCode,output,output.json.<path>,status,error) against standard operators (equals,notequals,contains,notcontains,gt,gte,lt,lte,regex,exists,notexists). - Fallback Else: Optional
elseTasktriggers when no branch rules match. - Deadlock-Free Barrier Synchronization: Untriggered branch tasks are safely marked as
status: 'skipped'(skippedReason: 'condition not met') inchainCheckpointManager, unblocking downstream join barriers (joinPolicy: 'all_success'). - DAG Cycle Validation:
validateDAGchecks incoming and outgoing dependencies across all branch rules and fallback tasks. - Graph UI Visualization: Interactive DAG View renders decision badges (
🔀 Decision) and condition labels on connecting edges.
- Dynamic Routing: Tasks can define
-
Autonomous Self-Healing Doctor for Scripts & Prompts (#353):
- Failure Classification: Automatic detection of 8 failure categories:
syntax_error,dependency_missing,rate_limit,auth_failed,schema_change,timeout,network_error,runtime_error. - Unified Diff: Clean Git-like line-by-line diff generation for proposed code repairs.
- 1-Click Apply & Revert: Dedicated
/doctor/applyand/doctor/revertendpoints with full revision backup (up to 10 versions preserved intask.revisions). - Guarded Autonomous Auto-Healing: When
autoHeal: true, high-confidence fixes are applied automatically with a strict 24-hour rate limit (lastPatchedAt) to prevent repair loops.
- Failure Classification: Automatic detection of 8 failure categories:
Quality Gate & Verification
- Unit & Integration Test Suite: 570 / 570 PASS (100%) (including dedicated test suites
test/decision-nodes.test.mjs,test/self-healing-doctor.test.mjs,test/pack26-verification.test.mjs). - Preflight: PASS (0 failures, client bundle 253,892 bytes < 256 KiB limit, ESLint clean, 0 leaks).
Provenance
- Gitea commit:
bc6ee0ed9e0c710010ebd87e68148ba486ef2ba4 - GitHub mirror commit:
30911166af92b1aeee38993d9ed297bb9c683b0d - npm package:
@goodandready/dsh-cron@0.3.13 - Gitea PR: #360 (Closes #352, #353)
中文
新功能与特性
-
决策节点与条件分支 IF/ELSE (#352):
- 动态路由:支持任务配置
branchRules(评估exitCode、output、output.json.<path>等字段),支持equals、notequals、contains、gt、lt、regex等操作符。 - 回退分支:若无匹配规则,自动执行
elseTask。 - 死锁防护:未触发的分支自动标记为
skipped,确保后续汇聚栅栏(joinPolicy: 'all_success')正常通过。 - DAG 周期校验:
validateDAG与拓扑排序自动检测分支回路。 - DAG 可视化:图谱界面直观展示决策标识(
🔀 Decision)与连线判断条件。
- 动态路由:支持任务配置
-
自愈医生(Self-Healing Doctor)(#353):
- 故障诊断分类:自动分类 8 类运行故障(语法错误、缺少依赖、频率限制、认证失效、架构变更、超时、网络错误、运行时异常)。
- 统一代码差分:生成直观的标准 Unified Diff 对比。
- 一键应用与回滚:提供
/doctor/apply与/doctor/revert接口,自动保留多达 10 个历史版本(task.revisions)。 - 受控自主修复:启用
autoHeal: true时,高可信度(high)修复自动生效,且强制 24 小时频次限制防止死循环。
质量门禁与验证
- 单元与集成测试:570 / 570 全部通过 (100%)。
- CI Preflight:通过(0 错误,打包体积 253,892 字节严格低于 256 KiB 限制,ESLint 通过,无凭据泄漏)。
Русский
Новый функционал
-
Решающие узлы и условные развилки IF/ELSE (#352):
- Маршрутизация по условию: Задачи могут задавать
branchRulesдля проверки результата (exitCode,output,output.json.<path>,status) через операторы (equals,notequals,contains,gt,gte,lt,lte,regex,exists). - Ветка Else: Резервная задача
elseTaskзапускается, если ни одно из правил не совпало. - Защита от взаимных блокировок: Невыбранные ветви автоматически регистрируются со статусом
skipped: condition not met, предотвращая зависание барьеров синхронизации (joinPolicy: 'all_success'). - Проверка циклов DAG:
validateDAGвалидирует ветви и предотвращает циклические зависимости. - Визуализация в графе: DAG Graph View отображает бейджи решающих узлов (
🔀 Decision) и условия на соединительных линиях.
- Маршрутизация по условию: Задачи могут задавать
-
Автономный Доктор самовосстановления (Self-Healing Doctor) (#353):
- Классификация сбоев: Автоматическое распознавание 8 типов ошибок (
syntax_error,dependency_missing,rate_limit,auth_failed,schema_change,timeout,network_error,runtime_error). - Unified Diff: Наглядный просмотр диффа предлагаемого исправления до его применения.
- 1-Click применение и откат: API эндпоинты
/doctor/applyи/doctor/revertс сохранением до 10 ревизий вtask.revisions. - Безопасная авто-починка: При включённом
autoHeal: trueпатчи с высокой уверенностью (high) применяются автоматически с лимитом не чаще 1 раза в сутки.
- Классификация сбоев: Автоматическое распознавание 8 типов ошибок (
Верификация и Quality Gate
- Полный набор тестов: 570 / 570 PASS (100%).
- Preflight: PASS (0 ошибок, бандл 253,892 байт < 256 КиБ лимита, ESLint чист, 0 утечек секретов).