Skip to content

Releases: GooDAnDReaDY/dsh-cron

v0.3.22 [DSH v0.2.1-rc.3]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 27 Oct 13:54

Release v0.3.22: Complete Chinese Localization (zh) & ctx.effect Registration

English

  • Complete Chinese Dictionary (#382, GH #19, by @rowancy66): Expanded STRINGS.zh in lib/client-src/10-locales.js from 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): Wrapped ctx.locale.register(NS, STRINGS) into ctx.effect(() => ctx.locale.register(NS, STRINGS), 'dsh-cron: locale dictionaries') with safe fallback for hosts without effect face. Re-applying the plugin on HMR/reload safely cleans up the registration via disposer instead of throwing already has locale into 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 in transfer.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]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 26 Oct 08:11

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: true or explicit captureGitDiff: true. Non-worktree tasks ignore repository diffs by default, eliminating uncontrolled JSON accumulation (which previously bloated tasks.json and archives up to 680MB and stalled the host event loop on boot for 68+ seconds).
  • 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 lightweight diffExcerpt strings 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 host danger-full-access SandboxMode before calling presets.set().
    • danger-full-access is 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 never via the approval service, preventing unattended tasks on workspace-write from stalling for 10-15 minutes waiting for interactive user escalation.

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+ секунд).
  • Защита архива и очистка временных файлов (#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' автоматически маппится в канонический хостовый SandboxMode danger-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]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 23 Oct 09:00

Release v0.3.20: Cron Panel Dismissal Lifecycle & CSS Visibility Fix

English

Bug Fixes (#377, GH #16)

  • Overlay Teardown on Close:
    • Introduced teardownPanel() in mountCronScreen (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.
  • Gated ensure() & MutationObserver Guard:
    • Gated ensure() on toggle.isOpen(). When !toggle.isOpen(), ensure() immediately tears down the panel and returns, preventing unconditional mounting on page load and blocking resurrection via the DOM MutationObserver.
  • CSS Attribute Selector Resolution:
    • Fixed unexpanded ${VIEW_ATTR} and ${ACTIVE_ATTR} literals in lib/client.css to proper CSS selectors [data-dsh-cron-view] and html[data-dsh-cron-active]. When the panel is inactive, [data-dsh-cron-view] is properly hidden (display: none) and conversation columns are restored.
  • Reliable Toggle Event Notification:
    • Updated createToggle().set(v) in lib/client-src/30-utils.js to 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.
  • Defensive Component Bail-out:
    • Added an isOpen subscription hook in CronScreen (lib/client-src/50-cron-screen-state.js) returning null when the panel is closed.

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]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 22 Oct 17:18

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 /tasks from LAN/external hosts).
    • External networks or Tailscale endpoints without proper authorization tokens or valid Origin/Referer headers are rejected with 401/403.
    • Hardened /chat/start with strict JSON body validation, properly returning 400 Bad Request on malformed payloads.

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 _waitForDiskVersion barrier ensuring callers only resolve once data is fully synchronized and written to disk.

Package & Developer Hygiene (#373, #374, #375)

  • Clean Clone Test Environment (#373):
    • Declared missing core development dependencies (cordis, @cordisjs/core) in devDependencies, ensuring npm test passes 100% on fresh checkouts.
  • Client Bundle Size Optimization (#374):
    • Extracted CSS styling to lib/client.css and locale dictionary to lib/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) to npm test.
  • Dead Code Cleanup (#375):
    • Removed obsolete alias formatDigestTelegram.
    • Wired standalone helpers (topologicalSort, isCredentialUri, isTrustedRequest) to active production library paths.

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。
  • 冗余代码清理 (#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]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 22 Oct 11:02

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.createElement to h globally without lexical scope analysis. In 62-modal-task-form-tail.js:122 (promptHistory.map((h) => ...)) and 48-timeline-heatmap-view.js:127 (Array.from(..., (_, h) => ...)), the callback parameter h shadowed the top-level helper, causing TypeError: h is not a function when opening the task edit modal or rendering the timeline heatmap.
    • Renamed history parameters to (rev) and hour parameter to (_, hour).
    • Migrated build alias to _h and added build-time guard verifying that _h is never shadowed in client-src callbacks or variable declarations.

Features & Improvements (#369, GH #15)

  • Identifiable Agent Run Sessions with sessionTitle:
    • Exposed sessionTitle in cronToolParameters in lib/cron-tool.js so 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() in lib/runner.js now interpolates the {{date}} variable into YYYY-MM-DD.
    • Scheduled agent tasks with empty sessionTitle now default to <YYYY-MM-DD> <task.title> instead of leaving sessions untitled, while retaining bracketed conventions (e.g. [W] ...) and preserving resumed session titles.

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]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 21 Oct 07:54

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) accessed Reflect.get(ctx, 'connection') || ctx.connection.
    • On the DSH host runtime, ctx is wrapped in a Cordis Context proxy where connection is a client-side service not declared in the host plugin's inject array. Reading undeclared properties throws Error: 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 defensive try / catch (_err) returning null with graceful degradation, adhering to project security standards.
  • Unit & Security Tests:
    • Added unit test in test/http-security-hardening.test.mjs reproducing Cordis Context proxy throwing without inject, verifying getConnection, getDshConnection, and rejectCrossOrigin gracefully admit or reject without 500 errors.

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]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 20 Oct 12:51

Release v0.3.16: Architecture Modularization & Core Decomposition

English

Architecture & Refactoring (#362)

  • Domain Decomposition of lib/api.js:
    • lib/api.js was 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, and mergeExecutionFields.
      • 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.js was 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 入口。
  • 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)与完整导出保持。
  • 架构规范与标准:
    • 所有手写源码文件严格符合 ≤ 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-запросов.
  • Доменная декомпозиция 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) и реэкспорт функций.
  • Стандарты и ограничения:
    • Все рукописные файлы кодовой базы строго ≤ 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]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 20 Oct 10:26

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 empty cwd) failed immediately with Workspace "<workspaceId>" requested by task could not be resolved.
    • Injected the missing host service 'workspaceRegistry' in lib/index.js (export const inject = [...]), granting proper access under Cordis context.
    • Updated resolveCwd(task, ctx) in lib/runner-worktree.js to look up workspaceRegistry via ctx.get('workspaceRegistry') or ctx.workspaceRegistry, retrieving the directory path via registry.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 workspaces service and maintained strict fail-closed security guarantees (#231).

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]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 19 Oct 16:05

Release v0.3.14: Swarm Delegation & Git Diff Patch Review

English

New Features & Capabilities

  1. Swarm Delegation & Parallel Multi-Agent Execution (#350):

    • Controlled Concurrency: Support for type: 'swarm' tasks executing a decomposed list of independent subtasks under a strict concurrencyLimit (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 in run.subtaskRuns.
    • UI Badge: 🐝 Swarm (x/y) displayed across task cards and execution logs.
  2. 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-diff
      • POST /dsh-cron/tasks/:id/git-diff/discard
      • POST /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)

中文

新功能与特性

  1. 群蚁协同委托与多智能体并行执行 (Swarm Delegation) (#350):

    • 并发受控执行:新增 type: 'swarm' 任务类型,支持配置 concurrencyLimit(1..10,默认 3)受控并发执行多项独立子任务。
    • 高容错隔离机制:单个子任务异常完全隔离,不会造成父任务崩溃,群体自动聚合所有成功输出。
    • 智能结果汇编:支持将所有子任务输出汇编为结构化 Markdown 报告或交由综合模型提炼总结。
    • 完整指标留存:运行历史完整记录群体运行状态 (swarmStats.total, succeeded, failed, durationMs) 及各子节点的详细输出。
    • 直观 UI 标识:任务卡片与运行历史抽屉直观展示 🐝 Swarm (x/y) 状态。
  2. Git Diff 变更查看与交互式补丁审查 (#351):

    • 自动 Diff 捕获:在 Git 工作区或脚本执行后自动捕获修改文件列表、状态统计及完整 Unified Diff(最高 256 KiB)。
    • 专属 REST API 接口:
      • GET /dsh-cron/tasks/:id/git-diff
      • POST /dsh-cron/tasks/:id/git-diff/discard
      • POST /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 通过,无凭据泄漏)。

Русский

Новый функционал

  1. Роевая декомпозиция задач и мультиагентный запуск (Swarm Delegation) (#350):

    • Управляемый пул воркеров: Поддержка задач типа type: 'swarm' с настраиваемым пулом воркеров (concurrencyLimit от 1 до 10, по умолчанию 3).
    • Отказоустойчивая декомпозиция: Ошибки отдельных воркеров изолированы; рой объединяет успешные результаты и корректно фиксирует частичные сбои без падения всей задачи.
    • Автоматический синтез: Сведение результатов всех воркеров в структурированный Markdown-дайджест или через выделенную модель-синтезатор.
    • Метрики и история роя: Сохранение счетчиков (swarmStats.total, succeeded, failed, durationMs) и детальных логов каждого воркера в истории запусков.
    • UI Бейдж: Отображение индикатора 🐝 Swarm (x/y) в карточках задач и истории выполнения.
  2. Просмотр Git Diff и интерактивное подтверждение патчей (Patch Review) (#351):

    • Автоматический захват диффов: Задачи в Git-каталогах автоматически сохраняют список файлов (git status), сводку изменений (git diff --stat) и унифицированный diff (до 256 КиБ).
    • Выделенный REST API:
      • GET /dsh-cron/tasks/:id/git-diff
      • POST /dsh-cron/tasks/:id/git-diff/discard
      • POST /dsh-cron/tasks/:id/git-diff/apply
    • Интерактивный просмотр: Цветовая подсветка строк diff в карточке истории запусков.
    • 1-Click Действия: Безопасный сброс рабочего каталога («🗑️ Discard Diff») или повторное наложение патча («✅ Apply Diff»).

Верификация и Quality Gate

  • Полный набор тестов: 578 / 578 PASS (100%).
  • Preflight: PASS (0 ошибок, бандл 256,814 байт < 256 КиБ лимита, ESLint чист, 0 утечек секретов).

v0.3.13 [DSH v0.2.0-rc.2]

Choose a tag to compare

@GooDAnDReaDY GooDAnDReaDY released this 19 Oct 15:04

Release v0.3.13: Decision Nodes (IF/ELSE) & Autonomous Self-Healing Doctor

English

New Features & Capabilities

  1. Decision Nodes & Conditional Branching IF/ELSE (#352):

    • Dynamic Routing: Tasks can define branchRules evaluating 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 elseTask triggers when no branch rules match.
    • Deadlock-Free Barrier Synchronization: Untriggered branch tasks are safely marked as status: 'skipped' (skippedReason: 'condition not met') in chainCheckpointManager, unblocking downstream join barriers (joinPolicy: 'all_success').
    • DAG Cycle Validation: validateDAG checks 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.
  2. 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/apply and /doctor/revert endpoints with full revision backup (up to 10 versions preserved in task.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.

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)

中文

新功能与特性

  1. 决策节点与条件分支 IF/ELSE (#352):

    • 动态路由:支持任务配置 branchRules(评估 exitCode、output、output.json.<path> 等字段),支持 equals、notequals、contains、gt、lt、regex 等操作符。
    • 回退分支:若无匹配规则,自动执行 elseTask。
    • 死锁防护:未触发的分支自动标记为 skipped,确保后续汇聚栅栏(joinPolicy: 'all_success')正常通过。
    • DAG 周期校验:validateDAG 与拓扑排序自动检测分支回路。
    • DAG 可视化:图谱界面直观展示决策标识(🔀 Decision)与连线判断条件。
  2. 自愈医生(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 通过,无凭据泄漏)。

Русский

Новый функционал

  1. Решающие узлы и условные развилки 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) и условия на соединительных линиях.
  2. Автономный Доктор самовосстановления (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 раза в сутки.

Верификация и Quality Gate

  • Полный набор тестов: 570 / 570 PASS (100%).
  • Preflight: PASS (0 ошибок, бандл 253,892 байт < 256 КиБ лимита, ESLint чист, 0 утечек секретов).