11 Commits

Author SHA1 Message Date
coopops 92811c258f feat(parser): авто-переподключение к SHiP через ReconnectSupervisor с backoff
CI / Lint (pull_request) Successful in 9m51s
CI / Integration tests (pull_request) Successful in 9m46s
CI / Build (pull_request) Successful in 9m25s
CI / Typecheck (pull_request) Successful in 9m27s
CI / Unit tests (pull_request) Successful in 9m33s
ReconnectSupervisor был написан, протестирован и экспортнут, но НИГДЕ не
подключён к циклу чтения. Parser.start() имел голый for-await без try/catch:
падение ноды → ShipConnectionError наверх → темп переподключений целиком
зависел от внешнего супервизора процесса. Мёртвая нода = рестарт без пауз =
долбёжка ноды без ограничителей.

Что сделано:
- Цикл чтения вынесен в runStreamLoop (core/streamLoop.ts) с инъекцией
  зависимостей — чтобы покрыть reconnect/resume юнит-тестами на фейках, без
  реального Redis и SHiP.
- runStreamLoop оборачивает (пере)подключение в ReconnectSupervisor:
  backoff 1→2→5→15→60с, после maxAttempts без прогресса — process.exit(1)
  (оркестратор перезапустит штатно).
- Позиция возобновления перечитывается из Redis на КАЖДОМ подключении
  (sync-hash пишется после каждого блока) — продолжаем ровно с последнего
  записанного блока, без потерь и дублей.
- ReconnectSupervisor.run теперь передаёт fn callback resetBackoff: каждый
  обработанный блок сбрасывает счётчик попыток, чтобы долгая стабильная сессия
  после редкого разрыва не копила attempt до выхода.
- Штатная остановка (stop закрывает ws) ловится и не вызывает лишний backoff.
- Parser получил структурный логгер (opts.logger) для onAttempt/onGiveUp.

Тесты: +4 runStreamLoop (reconnect+resume, stop без reconnect, give-up на
мёртвой ноде, resetBackoff на прогрессе), +4 ReconnectSupervisor (resetBackoff).
Всего 229 unit. README: секция «Авто-переподключение к SHiP».

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 13:00:11 +00:00
coopops be67debf51 docs(readme): раздел про backpressure-окно со схемой + конфиг в примерах
CI / Typecheck (pull_request) Successful in 9m25s
CI / Integration tests (pull_request) Successful in 9m48s
CI / Build (pull_request) Successful in 9m25s
CI / Lint (pull_request) Successful in 9m51s
CI / Unit tests (pull_request) Successful in 9m32s
Описание окна поглощения writer↔consumer (highWater/lowWater гистерезис, пауза
чтения SHiP по XLEN, антидребезг), ASCII-схема качелей backlog, рекомендация
maxmemory+noeviction. Конфиг backpressure добавлен в оба YAML-примера, строка
Backpr. в арх-диаграмму, актуализированы счётчики тестов (221/54).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 05:43:48 +00:00
claude fce498ce45 feat(events): полный SHiP action_trace в ActionEvent (transaction_id, creator_action_ordinal, receipt.auth_sequence, …) (#1)
CI / Lint (push) Successful in 9m20s
CI / Typecheck (push) Failing after 11m9s
CI / Unit tests (push) Has been skipped
CI / Integration tests (push) Has been skipped
CI / Build (push) Has been skipped
2026-05-26 04:26:33 +00:00
coopops 0c3c3bc002 [549-27][@ant] config: переключить publish обратно на OIDC trusted publishing и синхронизировать URL репозитория coopenomics/parser→coopenomics/parser2 — npm Trusted Publisher теперь настроен на @coopenomics/parser2 через workflow релиза нового имени репо, NPM_TOKEN больше не нужен и sigstore provenance снова включён; bump до 1.0.3 чтобы Lerna опубликовала новую версию и протестировать OIDC-флоу с новой конфигурацией; URL-ы в README/package.json/examples подтянуты под новое имя github-репо parser2 2026-04-23 16:00:32 +00:00
coopops 167c885a70 [549-27][@ant] refactor: вернуть имя parser2 обратно (полный реверт 549-20) — существующий @coopenomics/parser@2026.x в mono-ai живёт в продакшене (dicoop/cooparser всё ещё деплоится), параллельный publish @coopenomics/parser@1.0.x из этого репо создавал коллизию ожиданий у потребителей; раздельные имена parser2/parser устраняют путаницу. Папка packages/parser→parser2, пакет @coopenomics/parser→@coopenomics/parser2, docker image dicoop/parser→dicoop/parser2, Redis prefix parser:→parser2: (ce:parser:, abi, sub, sync, subs, reparse), метрики parser_*→parser2_*, bin parser2. Версия bumpnута до 1.0.2 для нового публичного пакета @coopenomics/parser2 2026-04-23 14:43:22 +00:00
coopops aff8a2451d [549-23][@ant] feat(parser): bump до 1.0.1 и добавить Docker-секцию в root README — проверить npm trusted publishing через GitHub Actions OIDC (на v1.0.0 lerna скипала No unpublished release found), документировать публичный образ dicoop/parser с docker-compose примером Redis+parser и полным parser.config.yaml шаблоном для пользователей 2026-04-22 15:49:38 +00:00
coopops 2f391db4b4 [549-22][@ant] config: поменять Docker Hub namespace coopenomics→dicoop — реальный owner Docker Hub организации для этого проекта dicoop (coopenomics там не существует), иначе docker push падал с insufficient_scope; image теперь публикуется как docker.io/dicoop/parser:<version> 2026-04-22 15:44:33 +00:00
coopops 94dbcb8400 [549-22][@ant] config: переключить Docker push на Docker Hub и npm publish на trusted publishing (OIDC) — Docker Hub доступнее без префикса реестра чем ghcr (docker pull coopenomics/parser), а OIDC-публикация в npm избавляет от ручного обновления NPM_TOKEN который рано или поздно забудется и сломает релиз; release.yml теперь использует DOCKERHUB_USERNAME/DOCKERHUB_TOKEN для docker login и id-token write permission с NPM_CONFIG_PROVENANCE=true для sigstore-подписанной публикации через настроенный npm Trusted Publisher 2026-04-22 15:36:55 +00:00
coopops b023f26a8f [549-21][@ant] config: переименовать root npm-scripts version/publish → release:version/release:publish — имена publish и version зарезервированы как npm lifecycle hooks, Lerna в workspace вызывала сама себя через npm publish трактовав root script как lifecycle handler (@coopenomics/parser@1.0.0 успел, ship-reader упал на рекурсии); ship-reader теперь сможет опубликоваться 2026-04-22 11:03:11 +00:00
coopops b5cf922a7b [549-21][@ant] config: интегрировать Lerna для управления пакетами и регенерировать lockfile — упростить multi-package версионирование и публикацию перед первым релизом в npm; lerna.json с independent versioning + pnpm as npmClient + allowBranch=main, npm-скрипты changed/version/publish/release в root package.json для локального интерактивного bump и dry-run проверок, release.yml переключён на lerna publish from-package --yes (smart skip неизменных версий вместо ручного version-check), попутно регенерирован pnpm-lock.yaml который после rename parser2→parser провалил CI на ERR_PNPM_OUTDATED_LOCKFILE 2026-04-22 10:47:38 +00:00
coopops 3bdd240d8a [549-20][@ant] refactor: переименовать parser2→parser, добавить root README и автопубликацию из main — привести репозиторий к релизной форме под публичным именем @coopenomics/parser до первого npm publish; единое имя папки, Redis key prefix (parser2:→parser:), метрик (parser2_*→parser_*) и комментариев устраняет путаницу в CLI, observability и docs; root README описывает монорепу, архитектурную схему, процесс релиза; ci.yml теперь только на push/PR в main и dev, отдельный release.yml на push в main детектит bump версии, публикует пакеты в npm, тегирует, создаёт GitHub Release через changelogithub и пушит Docker-образ в ghcr 2026-04-22 10:40:35 +00:00