Skip to content

Releases: Rahspide/sffmc

v0.15.3 — Maintenance: post-audit cleanup (25 fixes)

Choose a tag to compare

@Rahspide Rahspide released this 03 Jul 22:21

Install

npm install -g @sffmc/safety @sffmc/memory @sffmc/runtime @sffmc/cognition

What changed (EN)

Maintenance release. No breaking changes. No new dependencies.

25+ fixes covering config gaps, security, health checks, docs drift, and stale references. Recommend upgrade for everyone, especially on multi-user systems (mkdir mode fix) and v0.14.5/v0.14.7/v0.14.8 holdouts.

Configuration gaps (v0.14.5 overstated "21 values configurable")

  • Sandbox pump cadence now reads WorkflowExtendedConfigsandbox.ts had inline const SLOW_MS = 50; const FAST_WINDOW = 50 shadowing getSandboxSlowMs() / getSandboxFastWindow(). Now user YAML overrides take effect.
  • FlushManager debounce reads getFlushDebounceMs() — constructor takes optional debounceMs parameter.
  • WorkflowPersistence fsync reads getFsyncCoalesceMs()scheduleFsync() no longer uses local const.
  • SAFE_REPETITION_LIMIT exported from @sffmc/utilitiessafety/rules.ts imports it (no more duplicate const SAFE_REGEX_LIMIT = 25).

Security

  • All 5 mkdir calls in persistence.ts now use mode: 0o700 — runtime data dir no longer readable by other users on multi-user systems. Brings runtime in line with memory/dream/checkpoint which already do since v0.12.1.
  • migrateLegacyDataPaths() removed — exported but never wired. Canonical path stays uppercase SFFMC/ for backward compatibility.
  • 5 new redaction patternscloud-credential rule expanded: GitHub fine-grained PAT (github_pat_*), GitHub OAuth/user/scope tokens (gho_*/ghu_*/ghs_*/ghr_*), GitLab PAT (glpat-*), Discord bot tokens (d_* prefix), Stripe live keys (sk_live_*, rk_live_*), and JWTs (three base64url segments).
  • redactSecrets() MAX_CONTENT_BYTES = 1 MiB guard — returns unchanged with { oversize: true } so callers can chunk-stream.

Health plugin (v0.15.0 stale-string cleanup)

  • checkCompositeStructure no longer hardcodes "3 composites" — uses expectedComposites.length.
  • checkExtraOptIn refactored — was looking for deleted packages/extra/.
  • checkChangelogCurrency now also verifies CHANGELOG.ru.md (bilingual).

Audit scripts

  • audit-load-order.py: error message expected 14expected 5.
  • check-cleanroom.sh: removed dead EXCLUDE_PATTERNS for deleted packages/compose/, packages/agentic/, shared/ (all dissolved in v0.15.0 P-1).

Docs drift (8 fixes)

  • dynamic-workflow.md: "12 hours wall-clock" → "1 hour" (×3 refs). "Direct MCP bindings planned" → "available since v0.14.0".
  • bin/sffmc (bash) help: "13 packages / 13-check" → "5 / 9-check" (v0.15.1 fixed PowerShell only).
  • CONTRIBUTING.md: v0.15.1 → v0.15.3.
  • docs/install.md: SFFMC_VERSION=v0.15.0v0.15.3 (×2 refs).
  • CHANGELOG.md: stale "v0.14.7" refs → "v0.14.9" (×2; v0.14.7 never released).

Internal hygiene

  • Stale references to internal planning files cleaned up across source files and one utility. No behavior change.

Что изменилось (RU)

Maintenance-релиз. Ломающих изменений нет. Новых зависимостей нет.

25+ исправлений: конфигурационные разрывы, безопасность, health-проверки, дрейф документации, устаревшие ссылки. Рекомендуем обновиться всем, особенно на многопользовательских системах (фикс mkdir mode) и пользователям v0.14.5/v0.14.7/v0.14.8.

Конфигурационные разрывы (v0.14.5 завышал «21 значение настраивается»)

  • Sandbox pump cadence теперь читает WorkflowExtendedConfigsandbox.ts имел inline const SLOW_MS = 50; const FAST_WINDOW = 50, затеняющие getSandboxSlowMs() / getSandboxFastWindow(). YAML-переопределения пользователя вступают в силу.
  • Дебаунс FlushManager читает getFlushDebounceMs() — конструктор принимает необязательный параметр debounceMs.
  • Fsync в WorkflowPersistence читает getFsyncCoalesceMs()scheduleFsync() больше не использует локальную константу.
  • SAFE_REPETITION_LIMIT экспортирован из @sffmc/utilitiessafety/rules.ts импортирует.

Безопасность

  • Все 5 вызовов mkdir в persistence.ts используют mode: 0o700 — runtime data-каталог больше не читаем другими пользователями. Приводит runtime в соответствие с memory/dream/checkpoint с v0.12.1.
  • migrateLegacyDataPaths() удалена — экспортировалась, но никогда не подключалась. Канонический путь остаётся uppercase SFFMC/ для обратной совместимости.
  • 5 новых паттернов редактированияcloud-credential расширен: GitHub fine-grained PAT (github_pat_*), GitHub OAuth/user/scope (gho_*/ghu_*/ghs_*/ghr_*), GitLab PAT (glpat-*), Discord bot-токены (префикс d_*), Stripe live (sk_live_*, rk_live_*) и JWT (три base64url-сегмента).
  • Защита redactSecrets() по MAX_CONTENT_BYTES = 1 МиБ — возвращает неизменённым с { oversize: true }, чтобы вызывающий код мог разделить на чанки.

Health-плагин

  • checkCompositeStructure больше не хардкодит «3 композита».
  • checkExtraOptIn рефакторен — искал удалённый packages/extra/.
  • checkChangelogCurrency теперь проверяет и CHANGELOG.ru.md (билинг).

Audit-скрипты

  • audit-load-order.py: сообщение expected 14expected 5.
  • check-cleanroom.sh: удалены мёртвые EXCLUDE_PATTERNS для packages/compose/, packages/agentic/, shared/.

Дрейф документации

  • dynamic-workflow.md: «12 hours wall-clock» → «1 hour» (×3). «Direct MCP bindings planned» → «available since v0.14.0».
  • bin/sffmc (bash) help: «13 packages / 13-check» → «5 / 9-check».
  • CONTRIBUTING.md: v0.15.1 → v0.15.3.
  • docs/install.md: SFFMC_VERSION=v0.15.0v0.15.3 (×2).
  • CHANGELOG.md: устаревшие «v0.14.7» → «v0.14.9» (×2).

Внутренняя гигиена

  • Устаревшие ссылки на внутренние плановые файлы зачищены в исходниках и одной утилите. Изменений в поведении нет.

See CHANGELOG.md (English) or CHANGELOG.ru.md (Russian) for full release notes.

v0.15.2 — Maintenance: full npm metadata + Russian CHANGELOG

Choose a tag to compare

@Rahspide Rahspide released this 02 Jul 22:21

Install

npm install -g @sffmc/safety @sffmc/memory @sffmc/runtime @sffmc/cognition
{
  "plugins": {
    "@sffmc/safety":    "npm:@sffmc/safety@^0.15.2",
    "@sffmc/memory":    "npm:@sffmc/memory@^0.15.2",
    "@sffmc/runtime":   "npm:@sffmc/runtime@^0.15.2",
    "@sffmc/cognition": "npm:@sffmc/cognition@^0.15.2"
  }
}

What changed (EN)

Maintenance release. No breaking changes. No functional changes from v0.15.1.

Fixed — empty npm package pages

@sffmc/utilities, @sffmc/cognition, @sffmc/runtime shipped in v0.15.0 and v0.15.1 without description, keywords, bugs, or homepage fields in their package.json. The tarball content was complete (21–35 files per package, all working) but the npm registry page rendered as "no description available" for those three. Users browsing npmjs.com had no way to know what those packages did.

This release mirrors the structure that @sffmc/safety and @sffmc/memory already had:

  • @sffmc/utilities — "Shared SDK library for SFFMC plugins — loadConfig, mergeHooks, EventBus, FsOps, redactSecrets. Not a plugin entry; consumed via workspace:* by the other 4 packages."
  • @sffmc/cognition — "Standalone package: max-mode parallel reasoning with judge selection + 18 markdown compose skills + plugin health diagnostics."
  • @sffmc/runtime — "Standalone package: sandboxed JavaScript workflow orchestrator (quickjs-emscripten). Spawns sub-tasks, fans out work in parallel, pipelines multi-step jobs without losing context."

Each also got keyword arrays (5–7 terms each) and a homepage link to the per-package README on GitHub.

Added — Russian CHANGELOG entries

The bilingual documentation promise (README.md + README.ru.md, CHANGELOG.md + CHANGELOG.ru.md) had a gap: the Russian CHANGELOG was last synced at v0.14.x and didn't include v0.15.0 (consolidation), v0.15.1 (Windows CLI fix), or v0.15.2 (this release). All three now have Russian entries.

Version bump

All 6 package.json (root + 5 packages): 0.15.1 → 0.15.2. bun.lock regenerated with 5 version matches.


Что изменилось (RU)

Maintenance-релиз. Ломающих изменений нет. Функциональных изменений с v0.15.1 нет.

Исправлено — пустые страницы npm-пакетов

@sffmc/utilities, @sffmc/cognition, @sffmc/runtime были опубликованы в v0.15.0 и v0.15.1 без полей description, keywords, bugs, homepage в package.json. Содержимое тарболла было полным (21–35 файлов в каждом пакете, всё работало), но страница на npmjs.com отображалась как «описание отсутствует» для этих трёх. Пользователи, просматривающие npmjs.com, не могли понять, что делают эти пакеты.

Этот релиз зеркалит структуру, которая уже была у @sffmc/safety и @sffmc/memory:

  • @sffmc/utilities — «Shared SDK library for SFFMC plugins — loadConfig, mergeHooks, EventBus, FsOps, redactSecrets. Not a plugin entry; consumed via workspace:* by the other 4 packages».
  • @sffmc/cognition — «Standalone package: max-mode parallel reasoning with judge selection + 18 markdown compose skills + plugin health diagnostics».
  • @sffmc/runtime — «Standalone package: sandboxed JavaScript workflow orchestrator (quickjs-emscripten). Spawns sub-tasks, fans out work in parallel, pipelines multi-step jobs without losing context».

Каждый также получил массив ключевых слов (5–7 терминов в каждом) и ссылку на homepage в README пакета на GitHub.

Добавлено — записи CHANGELOG на русском

Promise билинговой документации (README.md + README.ru.md, CHANGELOG.md + CHANGELOG.ru.md) имел разрыв: русский CHANGELOG последний раз синхронизировался на v0.14.x и не включал v0.15.0 (консолидация), v0.15.1 (фикс Windows CLI) или v0.15.2 (этот релиз). Все три теперь имеют записи на русском.

Версия

Все 6 package.json (root + 5 пакетов): 0.15.1 → 0.15.2. bun.lock регенерирован с 5 совпадениями версий.


Recommendation / Рекомендация

EN: If you're on v0.15.1, you don't strictly need to upgrade to v0.15.2 — there's no functional change. But upgrading makes npmjs.com searchability better. npm install @sffmc/<pkg>@latest picks it up automatically.

RU: Если вы на v0.15.1, обновление до v0.15.2 не обязательно — функциональных изменений нет. Но после обновления страницы пакетов на npmjs.com будут информативнее. npm install @sffmc/<pkg>@latest подтянет автоматически.


See CHANGELOG.md (English) or CHANGELOG.ru.md (Russian) for full release notes.

v0.15.1 — Maintenance release: critical Windows CLI fix + docs polish

Choose a tag to compare

@Rahspide Rahspide released this 02 Jul 19:52

Install

npm install -g @sffmc/safety @sffmc/memory @sffmc/runtime @sffmc/cognition
{
  "plugins": {
    "@sffmc/safety":    "npm:@sffmc/safety@^0.15.1",
    "@sffmc/memory":    "npm:@sffmc/memory@^0.15.1",
    "@sffmc/runtime":   "npm:@sffmc/runtime@^0.15.1",
    "@sffmc/cognition": "npm:@sffmc/cognition@^0.15.1"
  }
}

What changed (EN)

Maintenance release. No breaking changes. Recommend upgrade for users on Windows + for anyone who hit the docs drift catalogued in v0.15.0.

Critical

  • bin/sffmc.ps1 functional regression — PowerShell installer has been shipping broken init since v0.15.0: PLUGIN_DIRS still listed 13 paths to deleted packages (agentic, watchdog, rules, auto-max, eos-stripper, log-whitelist, extra, max-mode, workflow, compose, health). sffmc init was silently skipping them with Unknown package: agentic (skipping) warnings instead of adding the 4 valid plugins. Now matches the bash version. Windows users running irm .../install.ps1 | iex get a complete install.

Fixed

  • Stale refs across all v0.15.0 docsdocs/install.md, docs/getting-started.md, docs/drone-ci.md, docs/import-from-mimo.md, docs/migration-from-opencode.md, CONTRIBUTING.md, AGENTS.md, install.sh, .github/ISSUE_TEMPLATE/{bug_report,feature_request}.md, packages/{memory,safety}/* updated to reflect the actual 5-package layout (2 composites + 3 standalones, @sffmc/utilities as library). The line-7 paragraph of getting-started.md that read "@sffmc/safety, @sffmc/safety, @sffmc/safety, @sffmc/safety" (literal copy-paste from the EN source pre-bug) has been rewritten cleanly.

  • Broken documentation linkspackages/memory/README.md linked to the deleted ../extra/README.md; packages/safety/README.md linked to 5 sibling sub-feature paths that no longer existed as top-level packages. All repointed.

  • install.sh help textsffmc init --all install all 13 packages and sffmc doctor run 13-check diagnostic updated to 5 packages and 9-check diagnostic.

  • packages/safety/skills/write-rule.mdbun test packages/rules/bun test packages/safety/src/rules/ (rules is now a sub-folder).

Added

  • Real README content for packages/runtime/README.md, packages/cognition/README.md, packages/utilities/README.md. They were 3-line placeholders auto-generated by the v0.15.0 P-1 migration; this release fills them in.

Что изменилось (RU)

Maintenance-релиз. Ломающих изменений нет. Рекомендуем обновиться пользователям Windows + тем, кто столкнулся с расхождениями в документации v0.15.0.

Критично

  • bin/sffmc.ps1 — PowerShell CLI с v0.15.0 был сломан: PLUGIN_DIRS содержал 13 путей к удалённым пакетам. sffmc init --minimal тихо пропускал agentic warning'ом и регистрировал только 2 из 4 валидных плагинов. PLUGIN_DIRS сокращён до 4 валидных плагинов, PKG_MAP обновлён, help text исправлен.

Исправлено

  • Stale refs в 8 EN-source файлахdocs/install.md, docs/getting-started.md, docs/drone-ci.md, docs/import-from-mimo.md, docs/migration-from-opencode.md, CONTRIBUTING.md, AGENTS.md, install.sh, .github/ISSUE_TEMPLATE/*, packages/{memory,safety}/* обновлены под актуальный 5-пакетный лейаут (2 композита + 3 автономных, @sffmc/utilities как библиотека). Параграф 7 в getting-started.md который читался как «@sffmc/safety, @sffmc/safety, @sffmc/safety, @sffmc/safety» (баг копипаста в английском source) переписан чисто.

  • Сломанные ссылкиpackages/memory/README.md указывал на удалённый ../extra/README.md; packages/safety/README.md указывал на 5 sibling-путей sub-feature, которых больше не существовало. Все перенаправлены.

  • Help text в install.shsffmc init --all install all 13 packages и sffmc doctor run 13-check diagnostic обновлены до 5 packages и 9-check diagnostic.

  • packages/safety/skills/write-rule.mdbun test packages/rules/bun test packages/safety/src/rules/ (rules теперь под-папка).

Добавлено

  • Реальные README для packages/runtime/README.md, packages/cognition/README.md, packages/utilities/README.md. Они были 3-строчными placeholder'ами, сгенерированными автоматически при миграции v0.15.0 P-1; этот релиз их наполняет.

See CHANGELOG.md (English) or CHANGELOG.ru.md (Russian) for full release notes.

v0.15.0 — First public npm release

Choose a tag to compare

@Rahspide Rahspide released this 01 Jul 04:53

Install

npm install -g @sffmc/safety @sffmc/memory @sffmc/runtime @sffmc/cognition
{
  "plugins": {
    "@sffmc/safety":    "npm:@sffmc/safety@^0.15.0",
    "@sffmc/memory":    "npm:@sffmc/memory@^0.15.0",
    "@sffmc/runtime":   "npm:@sffmc/runtime@^0.15.0",
    "@sffmc/cognition": "npm:@sffmc/cognition@^0.15.0"
  }
}

What changed (EN)

First public npm release. No breaking changes for users of the legacy monorepo (the consolidation is internal — every plugin name and API surface was preserved).

Changed (consolidated 13 → 5 packages)

  • Package consolidation — 14 workspace members (13 packages + shared/) consolidated into 5 packages:
    • @sffmc/runtime (was @sffmc/workflow)
    • @sffmc/cognition (was @sffmc/max-mode + @sffmc/compose + @sffmc/health; replaces dissolved @sffmc/agentic)
    • @sffmc/utilities (was shared/) — shipped as a library, not a plugin entry point
    • @sffmc/safety and @sffmc/memory retained as composites; their composes[] is now empty
  • @sffmc/agentic composite dissolved — users must register @sffmc/runtime and @sffmc/cognition explicitly in opencode.json plugins[]
  • Imports updated across all source code@sffmc/{workflow,max-mode,compose,health,rules,watchdog,auto-max,eos-stripper,log-whitelist,extra,agentic,shared}@sffmc/{runtime,cognition,safety,memory,utilities} respectively

Added

  • First public release to npm — all 4 installable packages (safety, memory, runtime, cognition) are now publicly available on the registry. @sffmc/utilities is published as a library.

Migration notes

  • Existing users of the legacy monorepo who pulled individual packages need to migrate to the 5-package layout. See docs/migration-from-opencode.md for the step-by-step.
  • @sffmc/utilities is consumed via workspace:* from the other 4 packages. Do not add it to opencode.json plugins[] — it has no plugin entry point and registering it would cause a double-registration crash.

Что изменилось (RU)

Первый публичный релиз на npm. Ломающих изменений для пользователей старого монорепо нет (консолидация внутренняя — имена плагинов и API сохранены).

Изменено (консолидация 13 → 5 пакетов)

  • Консолидация пакетов — 14 workspace-членов (13 пакетов + shared/) сведены в 5 пакетов:
    • @sffmc/runtime (был @sffmc/workflow)
    • @sffmc/cognition (был @sffmc/max-mode + @sffmc/compose + @sffmc/health; заменяет расформированный @sffmc/agentic)
    • @sffmc/utilities (был shared/) — публикуется как библиотека, не как точка входа плагина
    • @sffmc/safety и @sffmc/memory остаются композитами; их composes[] теперь пуст
  • Композит @sffmc/agentic расформирован — пользователи должны явно зарегистрировать @sffmc/runtime и @sffmc/cognition в массиве plugins[] файла opencode.json
  • Импорты обновлены во всём коде@sffmc/{workflow,max-mode,compose,health,rules,watchdog,auto-max,eos-stripper,log-whitelist,extra,agentic,shared}@sffmc/{runtime,cognition,safety,memory,utilities} соответственно

Добавлено

  • Первый публичный релиз на npm — все 4 устанавливаемых пакета (safety, memory, runtime, cognition) теперь публично доступны в реестре. @sffmc/utilities публикуется как библиотека.

Заметки по миграции

  • Существующие пользователи старого монорепо, которые подтягивали пакеты по отдельности, должны мигрировать на 5-пакетный лейаут. Пошаговая инструкция в docs/migration-from-opencode.md.
  • @sffmc/utilities подтягивается через workspace:* из остальных 4 пакетов. Не добавляйте его в plugins[] файла opencode.json — у него нет точки входа плагина, регистрация приведёт к крашу двойной регистрации.

See CHANGELOG.md (English) or CHANGELOG.ru.md (Russian) for full release notes.

v0.14.9

Choose a tag to compare

@Rahspide Rahspide released this 28 Jun 00:53

v0.14.9 (2026-06-28)

Changed

  • Dropped v1 checkpoint readerspackages/extra/src/checkpoint.ts no longer exposes migrateV1ToV2 or the CheckpointHeaderV1 type. The header parser auto-migrates any v1 file to v2 on read; the migrated file is atomically rewritten as v2 so subsequent reads hit the fast path.

v0.14.9 (2026-06-28)

Изменено

  • Удалены reader'ы формата v1packages/extra/src/checkpoint.ts больше не экспортирует migrateV1ToV2 или тип CheckpointHeaderV1. Парсер заголовка автоматически мигрирует любой файл v1 в v2 при чтении; мигрированный файл атомарно перезаписывается как v2, чтобы последующие чтения шли по быстрому пути.

v0.14.8

Choose a tag to compare

@Rahspide Rahspide released this 28 Jun 00:13

v0.14.8 (2026-06-28)

Changed

  • Documentation split into English + Russian. README.md is now English-only with a language picker banner linking to README.ru.md. CHANGELOG.md is now English-only; Russian translations live in CHANGELOG.ru.md. Both new files contain the same content as the original bilingual inline format, just split for cleaner per-language navigation.

v0.14.8 (2026-06-28)

Изменено

  • Документация разделена на английский + русский. README.md теперь только на английском; переключатель языка в начале ссылается на README.ru.md. CHANGELOG.md теперь только на английском; русские переводы находятся в CHANGELOG.ru.md. Оба новых файла содержат то же содержимое, что и оригинал в билингвальном inline-формате, просто разделены для более удобной навигации по языкам.

v0.14.5

Choose a tag to compare

@Rahspide Rahspide released this 21 Jun 19:27

What's Changed

Changed

  • Checkpoint write batching_flushSession writes all buffered ToolCalls in a single appendFileSync call instead of N separate calls. On-disk file format is byte-identical to prior releases (one JSON-encoded ToolCall per line, terminated with \n); existing readers (readToolCalls, readHeader) are unaffected.

Added

  • packages/extra/bench/checkpoint-flush.bench.ts — synthetic microbenchmark for _flushSession throughput. Drives the tool.execute.after hook for 10/100/1000 calls and reports ops/sec plus file size. Run with bun run packages/extra/bench/checkpoint-flush.bench.ts.

Performance

Benchmarks (bun 1.3.14, default flushThreshold = 50):

Buffer size Throughput File size
10 calls ~10k ops/sec 1062 B
100 calls ~130k ops/sec 9882 B
1000 calls ~350k ops/sec 100782 B

Sub-millisecond measurements are noisy; file sizes are byte-identical across runs, confirming the batched write produces the same content as the prior loop.


Что изменилось

Изменено

  • Батчинг записи в checkpoint_flushSession теперь записывает все буферизованные ToolCall за один вызов appendFileSync вместо N отдельных вызовов. Формат файла на диске побайтно идентичен предыдущим релизам (по одному JSON-сериализованному ToolCall на строку, оканчивающемуся на \n); существующие reader'ы (readToolCalls, readHeader) не затронуты.

Добавлено

  • packages/extra/bench/checkpoint-flush.bench.ts — синтетический микробенчмарк для пропускной способности _flushSession. Прогоняет tool.execute.after hook на 10/100/1000 вызовов и сообщает ops/sec и размер файла. Запуск: bun run packages/extra/bench/checkpoint-flush.bench.ts.

Производительность

Бенчмарки (bun 1.3.14, flushThreshold = 50 по умолчанию):

Размер буфера Пропускная способность Размер файла
10 вызовов ~10k ops/sec 1062 Б
100 вызовов ~130k ops/sec 9882 Б
1000 вызовов ~350k ops/sec 100782 Б

Измерения в субмиллисекундном диапазоне зашумлены; размеры файлов побайтно идентичны между прогонами, что подтверждает: батчированная запись даёт тот же контент, что и старый цикл.


Full Changelog: https://github.com/Rahspide/sffmc/blob/v0.14.5/CHANGELOG.md

SFFMC v0.12.0 — Workflow Resume + hardening + perf

Choose a tag to compare

@Rahspide Rahspide released this 18 Jun 15:12

v0.12.0 (2026-06-18)

Workflow Resume Passthrough + 6 P0 coverage tests + journal/checkpoint performance + per-session state isolation.

Added

  • Workflow Resume Passthrough — when OpenCode restarts mid-workflow, in-flight runs are now marked "paused" (recoverable from journal) instead of "crashed". Use runtime.resume({ runID }) to continue.
  • Health check factory — 13 health checks consolidated behind a single factory pattern, removing duplicated boilerplate.
  • Journal format v1 — journals now include a version header for forward compatibility. Existing v0 journals still parse correctly.
  • workflow:resumed event — emitted when a paused workflow is resumed via runtime.resume({ runID }).
  • 6 P0 coverage tests — race conditions in lock acquisition, agent abort at semaphore, depth-limit enforcement, budget-exceeded detection, debounced counter flush, structural error propagation.

Changed

  • Performance: journal files now stream-parse on load (was full-read into memory). (workflow package)
  • Performance: readToolCalls reads the checkpoint file once instead of twice. (extra package)
  • Performance: appendJournalSync coalesces fsync calls in a 50ms window; explicit flushJournalSync() API for durability. (workflow package)

Fixed

  • Cross-session state leak in auto-max and max-mode: per-session state previously stashed on the shared ctx object could leak across sessions in long-running processes. Moved to per-instance Map<sessionID, …> in plugin state.
  • Inconsistent logger usage: 10 console.* calls in extra/checkpoint.ts and extra/judge.ts migrated to the shared createLogger helper.

Removed

  • 4 dead MemoryConfig fields (reconBudgets.memory, .checkpoint, .taskTree, .agents) — only reconBudgets.tail was actually read.
  • Unused MAX_COMMAND import and dead triggeredLog field in auto-max.
  • Duplicate RichPluginContext re-declarations in extra/dream.ts and extra/judge.ts (now imported from @sffmc/shared).

Hygiene

  • Pinned @types/bun and bun-types from "latest" to "1.3.14". Purged orphaned node_modules (stale better-sqlite3@11.10.0).
  • Test count: 570 passing (was 546).

v0.11.1

Choose a tag to compare

@Rahspide Rahspide released this 16 Jun 23:02

v0.11.1 (2026-06-17)

Post-v0.11.0 cleanup. No API changes.

Changed

  • Path canonicalization: ~/.local/share/SFFMC and ~/.config/SFFMC auto-rename to lowercase sffmc on next plugin load (one-shot, idempotent). All 11 packages updated.
  • Shared logger: 40+ console.warn/console.log calls replaced with a shared createLogger(prefix) helper across 8 packages (auto-max, eos-stripper, extra, log-whitelist, max-mode, safety, watchdog, workflow).
  • Composite workspace imports: safety, agentic, and memory composite packages now use @sffmc/<name> workspace imports instead of relative paths.
  • Test utilities: 4 test helpers added to @sffmc/workflow (makeMockCtx, makeSlowMockCtx, makeCountingMockCtx, makeRuntimeWithMockCtx) in tests/test-utils.ts.

v0.11.0

Choose a tag to compare

@Rahspide Rahspide released this 16 Jun 23:02

v0.11.0 (2026-06-16)

max-mode and workflow onboarded into @sffmc/shared. No API changes for the public @sffmc/workflow surface (v0.10.0 breaking interface preserved).

Added

  • extractErrorType(output) and isToolError(output) in @sffmc/shared — unified error detection across packages. Replaces auto-max's loose regex with strict pattern matching.
  • MAX_COMMAND, MAX_SUBCOMMANDS, MAX_PATTERN, MaxSubcommand in @sffmc/shared — shared /max command handling across max-mode, auto-max, and watchdog. Fixes a bug where watchdog missed /max reset and /max clear.
  • RichPluginContext type in @sffmc/shared — extends PluginContext with optional client.session.message() and usage.totalTokens. Replaces separate interfaces in max-mode and workflow.

Fixed

  • auto-max: false positive error detection for strings containing "failsafe" or "errorless"
  • watchdog: /max reset and /max clear commands were not being recognized

Changed

  • 3 require() calls converted to ES module import (memory, workflow runtime, workflow persistence)
  • Removed redundant yaml dependencies from 4 packages (watchdog, auto-max, eos-stripper, log-whitelist)
  • Timer hygiene: .unref() added to 2 timers to avoid blocking event loop shutdown
  • 5 shared states in @sffmc/extra (checkpoint buffers, dream lock, timers) converted to on-demand factories — backward-compatible, existing imports preserved
  • max-mode and workflow now use @sffmc/shared for shared types

Tests

  • 21 new unit tests in @sffmc/shared (13 error detection, 8 max-command parsing)
  • Total: 510 → 534 tests (+24, includes 3 existing test updates)