diff --git a/docs/delivery/CURRENT_STATUS.md b/docs/delivery/CURRENT_STATUS.md index 2eff2c9..a532728 100644 --- a/docs/delivery/CURRENT_STATUS.md +++ b/docs/delivery/CURRENT_STATUS.md @@ -1,22 +1,23 @@ # Текущее состояние по репозиториям -Дата среза: 26 сентября 2026 года. Этот файл обновляется после проверенного локального этапа или мержа, +Дата среза: 4 октября 2026 года. Этот файл обновляется после проверенного локального этапа или мержа, а не после незавершённого эксперимента. | Репа | Что меняем или добавляем | Ожидаемый результат | Фактический результат | Следующий шаг | |---|---|---|---|---| | `.github` | Общие workflows и правила | Одинаковый CI/CD для всех сервисов | Java, Python, Node, docs, security и container workflows работают; чистый Trivy runner исправлен | Подключать правила к каждой новой репе | -| `contracts` | Версионируемые внешние и внутренние API | Один проверяемый источник сетевых DTO | Release `2.5.0` опубликован с checksum и provenance; общий MessageContext устраняет циклические OpenAPI-ссылки | Использовать release во всех новых адаптерах | -| `action-service` | Подтверждение и надёжное выполнение | `AWAITING_APPROVAL → APPROVED → EXECUTING → SUCCEEDED/FAILED` | jOOQ, outbox, Temporal worker и вызов MCP Gateway работают; решение приходит через Channel Gateway | Оставить источником истины для решения и статуса | -| `calendar-mcp` | `create_event` | Идемпотентное создание fake-события | Fake Calendar, OIDC и защита от дублей работают в общем сценарии | Добавить Google provider после trusted execution context и Connection Service | +| `contracts` | Версионируемые внешние и внутренние API | Один проверяемый источник сетевых DTO | Release `3.0.0` опубликован; в контракт добавлены trusted execution context, Connection API и Google Calendar connector | Проверять совместимость следующих составных планов | +| `action-service` | Подтверждение и надёжное выполнение | `AWAITING_APPROVAL → APPROVED → EXECUTING → SUCCEEDED/FAILED` | jOOQ, outbox и Temporal работают; workflow имеет типизированные input/output, Search Attributes и стратегию вызова по `ActionKind` | Оставить источником истины для решения и статуса; подготовить границу составного плана | +| `calendar-mcp` | `create_event` | Один MCP-контракт для fake и Google | Fake и Google providers, trusted owner, OIDC и защита от дублей реализованы | Провести ручной Google sandbox N2N | | `mcp-gateway` | OIDC, allowlist и MCP client | Безопасный stateless-маршрутизатор | Foundation смержен и проверен вызовом Calendar MCP | Добавлять коннекторы только по контракту | -| `deploy` | Приложения в локальном Compose | Одна команда поднимает вертикальный backend-срез | Реальный Telegram и opt-in Ollama/Qwen профиль работают отдельными командами | Подключить Connection Service и Google stub | -| `test-lab` | Календарный acceptance-тест | Один JWT и один контракт на всём пути | Fake E2E проверяет 19 условий; opt-in AI E2E понимает обычную русскую фразу | Добавить Google OAuth и Calendar API stub | -| `agent-runtime` | Текст в предложение действия | Типизированное предложение встречи без скрытого выполнения | `IntentModel`, demo и OpenAI-compatible provider работают; Qwen 7B проверена локально | Добавить уточнение при неполных данных | +| `connection-service` | Подключения внешних аккаунтов | OAuth и токены не принадлежат каналу или MCP | Google OAuth, зашифрованные подключения, public API и internal token API реализованы | Проверить обновление токена в ручном Google sandbox N2N | +| `deploy` | Приложения в локальном Compose | Одна команда поднимает вертикальный backend-срез | Все девять pin'ов совпадают с актуальными `main`; real Telegram, opt-in Qwen, Connection Service и observability profile подключены | Выполнить локальный reset старой Temporal history и ручной Google N2N | +| `test-lab` | Календарный acceptance-тест | Один JWT и один контракт на всём пути | Fake E2E и opt-in AI E2E работают; 4 октября полный `Agent → Calendar` acceptance прошёл на актуальных pin'ах | Добавить отдельный Google API stub и сценарий обновления токена | +| `agent-runtime` | Текст в предложение действия | Типизированное предложение встречи без скрытого выполнения | `IntentModel`, demo и OpenAI-compatible provider работают; runtime выбирает `google-calendar`, когда он доступен, и fake как fallback | Добавить уточнение при неполных данных и затем составной план | | `channel-gateway` | Общий вход каналов | Web и Telegram используют один контракт | Сообщение идёт через Conversation; решение канала — через Gateway в Action | Проверить Telegram в общем Compose-сценарии | | `conversation-service` | Состояние диалога и прикладная оркестрация | Повтор сообщения не создаёт второе действие | PostgreSQL, lease, Agent → Action, карточка и сохранение offset проверены общим E2E | Оставить владельцем диалога при подключении адаптера | | `widget-sdk` | Карточка подтверждения | Один UI-контракт для разных каналов | Renderer-neutral core создаёт проверенную decision command; Telegram использует тот же сетевой контракт | Добавить готовые helpers для следующих UI-каналов | -| `telegram-adapter` | Telegram как сменный канал | Telegram identity привязывается только после входа через Keycloak | Настоящий бот и webhook проверены; Device Flow завершает привязку, refresh token зашифрован | Проверить естественную фразу и реальный календарь | +| `telegram-adapter` | Telegram как сменный канал | Telegram identity привязывается только после входа через Keycloak | Настоящий бот и webhook проверены; Device Flow завершает привязку, сообщение объясняет автоматическую подстановку кода | Проверить естественную фразу с реальным Google Calendar | ## Что уже проверено @@ -33,8 +34,11 @@ ``` Проверка запускает реальные контейнеры отдельных репозиториев по закреплённым commit SHA. Последний -GitHub acceptance для `deploy` прошёл 25 сентября 2026 года после явного checkout Conversation Service. -Telegram Adapter отдельно проверен unit-, contract- и PostgreSQL integration-тестами и production build. +GitHub acceptance для `deploy` прошёл 4 октября 2026 года. Он использовал актуальные `main` всех девяти +сервисов и Test Lab. Автономный CI намеренно остаётся на fake-провайдере и не требует внешнего аккаунта. + +Отдельно реализованы Google OAuth, выдача короткоживущего access token и Google provider в Calendar MCP. +Их общий ручной sandbox N2N после обновления Temporal history ещё должен быть повторно проверен. ## Текущий порядок @@ -62,8 +66,11 @@ Telegram Adapter отдельно проверен unit-, contract- и PostgreSQ -> [готово] настоящий Telegram bot, webhook и Device Flow -> [готово] естественный язык через OpenAI-compatible provider и локальную Qwen -> [решено] Google OAuth принадлежит Connection Service, а не каналу или MCP - -> [следом] trusted execution context и каркас Connection Service - -> [затем] Google Calendar provider и OAuth stub + -> [готово] trusted execution context и Connection Service + -> [готово] Google Calendar provider и выбор provider в Agent Runtime + -> [готово] типизированный Action Workflow и понятные поля в Temporal UI + -> [следом] ручной Telegram → Google Calendar sandbox N2N + -> [затем] RFC составного плана: несколько последовательных действий из одного сообщения -> [после real N2N] trace в Tempo и связанные логи в Loki/Grafana ``` diff --git a/docs/delivery/MVP_ROADMAP.md b/docs/delivery/MVP_ROADMAP.md index b93b73b..0f0dc9b 100644 --- a/docs/delivery/MVP_ROADMAP.md +++ b/docs/delivery/MVP_ROADMAP.md @@ -11,8 +11,10 @@ Правила первого сценария подтверждены. Начинаем с `fake-calendar`; обязательны название, начало, конец и часовой пояс; создание всегда требует явного подтверждения. Описание и участники необязательны. Fake-сценарий и настоящий Telegram уже доказали транспортный путь. Естественная русская фраза проверена -через локальную Qwen с typed structured output. Следующий продуктовый этап — Connection Service и -настоящий Google Calendar. Speech-to-text остаётся следующим адаптером того же текстового сценария. +через локальную Qwen с typed structured output. Connection Service, Google OAuth и Google Calendar +provider реализованы. Следующий проверяемый рубеж — повторный ручной sandbox N2N на актуальной Temporal +history. После него проектируется составной план нескольких действий. Speech-to-text остаётся следующим +адаптером того же текстового сценария. Переводы денег не входят в MVP. До отдельного threat model они доступны только как будущие `read-only` или `simulation` сценарии. @@ -68,6 +70,8 @@ Fake-сценарий и настоящий Telegram уже доказали т ### 1. Естественный язык вместо технического формата +Состояние: основной полный запрос работает; уточняющий диалог при неполных данных остаётся задачей. + - принять фразы вроде «Поставь завтра в 19:00 созвон с Колей на полчаса»; - учитывать часовой пояс пользователя, относительные даты и длительность; - задавать короткий уточняющий вопрос при неоднозначности или нехватке данных; @@ -80,6 +84,9 @@ Fake-сценарий и настоящий Telegram уже доказали т ### 2. Настоящий календарь +Состояние: код и контракты готовы; автономный fake acceptance зелёный; ручной Google sandbox N2N нужно +повторить на актуальных версиях. + - сохранить единый `calendar-mcp`, а провайдеры выбирать через стратегию `fake`/`google`; - добавить Google OAuth connection flow и хранить refresh token только в зашифрованном виде; - использовать тот же `calendar.create_event`, `requestKey` и защиту от дублей, что и у fake-провайдера; @@ -93,6 +100,18 @@ Connection Service, а Calendar MCP получает только коротко Результат: подтверждённая команда из Telegram создаёт реальное событие Google Calendar, а тесты не требуют внешнего аккаунта. +### 2.1 Составной план действий + +- принять одно сообщение с несколькими намерениями; +- вернуть из Agent Runtime упорядоченный типизированный план; +- хранить отдельные input, output и статус каждого шага; +- передавать output предыдущего шага только по явному mapping-контракту; +- определить остановку, повтор и компенсацию до добавления второго реального коннектора; +- проверить первый сценарий `Google Calendar → Notion` сначала на fake-провайдерах. + +Результат: одно подтверждение запускает понятную последовательность, а Temporal UI показывает каждый шаг +и его параметры без чтения внутренних логов. + ### 3. Сквозная наблюдаемость после real N2N - передавать W3C `traceparent` через Telegram Adapter, Gateway, Conversation, Agent, Action, Temporal и MCP; diff --git a/docs/delivery/WORK_PLAN.md b/docs/delivery/WORK_PLAN.md index 114d00c..2c6bc3d 100644 --- a/docs/delivery/WORK_PLAN.md +++ b/docs/delivery/WORK_PLAN.md @@ -76,8 +76,9 @@ ### 5.1 Платформа разработки -Состояние: локальный Compose и первый сквозной smoke готовы. Preview-окружения, полная наблюдаемость и -проверки отказов остаются следующими инженерными пакетами. +Состояние: локальный Compose, общий Helm chart, preview-каркас и сквозной smoke готовы. Все версии +сервисов закреплены полными Git SHA. Полная наблюдаемость и проверки отказов остаются следующими +инженерными пакетами. - локальные зависимости через Compose без секретов в Git; - общий Helm chart и GitOps-каталог окружений; @@ -88,12 +89,27 @@ ### 6. Первый продуктовый срез -Состояние: backend-срез, общий текстовый вход и renderer-neutral Widget SDK готовы. Conversation -Service, адаптер и реальный календарь ещё не реализованы. +Состояние: backend-срез, Conversation Service, Telegram Adapter, renderer-neutral Widget SDK, +Connection Service и Google Calendar provider реализованы. Автоматический acceptance на fake-провайдере +проходит на актуальных версиях всех сервисов. Ручной Google sandbox N2N требуется повторить после +обновления локальной Temporal history. Выбран сценарий создания события календаря с явным подтверждением. Обязательны название, начало, -конец и часовой пояс. Сначала пишется сквозной acceptance-тест с `fake-calendar`, и только затем -добавляется настоящая интеграция. +конец и часовой пояс. `fake-calendar` остаётся обязательным автономным CI-провайдером. Google использует +тот же контракт и выбирается только при доступном подключении пользователя. + +### 7. Следующий продуктовый срез + +Состояние: требуется RFC до изменения контрактов. + +- одно пользовательское сообщение может содержать несколько действий; +- Agent Runtime возвращает типизированный упорядоченный план, а не выполняет его; +- каждое действие сохраняет собственные input, output, статус и идемпотентный ключ; +- Temporal показывает понятное имя плана и результаты каждого шага; +- политика остановки, повтора и компенсации согласуется отдельно; +- первый пример: событие Google Calendar, затем запись в Notion. + +До RFC не создаётся Notion MCP и не расширяется Action API случайными полями. ## Что смотреть на ревью diff --git a/docs/product/CALENDAR_EVENT_MVP.md b/docs/product/CALENDAR_EVENT_MVP.md index d7dedf6..dc51f53 100644 --- a/docs/product/CALENDAR_EVENT_MVP.md +++ b/docs/product/CALENDAR_EVENT_MVP.md @@ -1,6 +1,6 @@ # MVP: создание встречи -Статус: правила подтверждены владельцем продукта. +Статус: правила подтверждены владельцем продукта; fake acceptance проходит, Google provider реализован. ## Результат для пользователя @@ -8,7 +8,7 @@ карточку с точными аргументами. Встреча создаётся только после явного подтверждения. Первый исполнитель — `fake-calendar`. Он позволяет проверить весь путь без внешнего аккаунта. Реальный -календарь позже подключается за тем же контрактом. +Google Calendar подключается за тем же контрактом только при доступном подключении пользователя. ## Правила первой версии @@ -35,7 +35,7 @@ sequenceDiagram participant Action as Action Service participant Widget as Виджет participant Flow as Temporal - participant Calendar as Fake Calendar + participant Calendar as Calendar MCP User->>Channel: Создай встречу завтра в 12:00 на 30 минут Channel->>Talk: Нормализованный текст и часовой пояс @@ -49,7 +49,7 @@ sequenceDiagram Widget->>Channel: CONFIRM + payloadHash Channel->>Action: Та же команда решения Action->>Flow: Выполнить сохранённое действие - Flow->>Calendar: Создать событие с requestKey + Flow->>Calendar: Создать событие с requestKey через выбранный provider Calendar-->>Flow: eventId Flow-->>Action: SUCCEEDED Action-->>User: Встреча создана @@ -82,7 +82,7 @@ stateDiagram-v2 ## Не входит в первый инкремент -- Google OAuth и настоящий календарь; +- новые календарные providers кроме уже реализованных fake и Google; - голосовое распознавание; - изменение и удаление встреч; - повторяющиеся события; diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml index 5bea1fd..a66872c 100644 --- a/website/pnpm-lock.yaml +++ b/website/pnpm-lock.yaml @@ -8,6 +8,11 @@ overrides: js-yaml: 4.3.2 serialize-javascript: 7.0.3 image-size: 2.0.3 + brace-expansion@1.1.18: 1.1.20 + fast-uri@3.1.6: 3.1.7 + http-cache-semantics@4.2.0: 4.3.0 + joi@17.13.6: 17.13.7 + webpack-dev-middleware@7.4.5: 7.4.6 importers: @@ -2105,8 +2110,8 @@ packages: resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} engines: {node: '>=14.16'} - brace-expansion@1.1.18: - resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} + brace-expansion@1.1.20: + resolution: {integrity: sha512-5/qk29RyvatwgzNMrvGjkIhKYzpJ0OUnPK+9TU+zS/CMJqzmb+UD0irWu42JfpUvO636fxd8IstgiydZRM/76A==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -2985,8 +2990,8 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-uri@3.1.6: - resolution: {integrity: sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==} + fast-uri@3.1.7: + resolution: {integrity: sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==} fastdom@1.0.12: resolution: {integrity: sha512-LB+xjSTEbjHE1cWsxu+tN2Xqr1kpi+V9aADI7sVM5ZMaXyYGPHULQMzpJMYqOTULK/73pUkWVzzObFRBkPr+hg==} @@ -3237,8 +3242,8 @@ packages: htmlparser2@8.0.2: resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - http-cache-semantics@4.2.0: - resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + http-cache-semantics@4.3.0: + resolution: {integrity: sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA==} http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} @@ -3506,8 +3511,8 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - joi@17.13.6: - resolution: {integrity: sha512-ImNZaq/LSysofih+xIGYfR0WUXMA9GLUNB//YTCSrZptoRmVgaNAdJyi6K1kXi9pkLEoSkoI8I4UwtNiu/D7nw==} + joi@17.13.7: + resolution: {integrity: sha512-MF80Dm5Y2veNy8QWVx9Bj3ui4mo7+VPSPsR1M+oaHXV0Gx6zGX9a2F+OZG3Blby9tOlzU9Rs5FUimlEhbKtfnQ==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -5386,8 +5391,8 @@ packages: engines: {node: '>= 10.13.0'} hasBin: true - webpack-dev-middleware@7.4.5: - resolution: {integrity: sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==} + webpack-dev-middleware@7.4.6: + resolution: {integrity: sha512-yBWCMvIfUmuhAE8vdqUKzH0vg9kuWN0KeG4vBnqRplUFHRU7lMQjkiJWxVQzvo2BTewqhPhDlMB41rAt2jVA9A==} engines: {node: '>= 18.12.0'} peerDependencies: webpack: ^5.0.0 @@ -7589,7 +7594,7 @@ snapshots: '@types/mdast': 4.0.4 '@types/react': 19.2.18 commander: 5.1.0 - joi: 17.13.6 + joi: 17.13.7 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)' @@ -7640,7 +7645,7 @@ snapshots: '@docusaurus/utils': 3.10.2(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(html-minifier-terser@7.2.0)(postcss@8.5.26)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@8.1.1) '@docusaurus/utils-common': 3.10.2(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(html-minifier-terser@7.2.0)(postcss@8.5.26)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@8.1.1) fs-extra: 11.4.0 - joi: 17.13.6 + joi: 17.13.7 js-yaml: 4.3.2 lodash: 4.18.1 tslib: 2.8.1 @@ -8589,7 +8594,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.6 + fast-uri: 3.1.7 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -8764,7 +8769,7 @@ snapshots: widest-line: 4.0.1 wrap-ansi: 8.1.0 - brace-expansion@1.1.18: + brace-expansion@1.1.20: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 @@ -8799,7 +8804,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.2.0 get-stream: 6.0.1 - http-cache-semantics: 4.2.0 + http-cache-semantics: 4.3.0 keyv: 4.5.4 mimic-response: 4.0.0 normalize-url: 8.1.1 @@ -9709,7 +9714,7 @@ snapshots: fast-json-stable-stringify@2.1.0: {} - fast-uri@3.1.6: {} + fast-uri@3.1.7: {} fastdom@1.0.12: dependencies: @@ -10057,7 +10062,7 @@ snapshots: domutils: 3.2.2 entities: 4.5.0 - http-cache-semantics@4.2.0: {} + http-cache-semantics@4.3.0: {} http-deceiver@1.2.7: {} @@ -10275,7 +10280,7 @@ snapshots: jiti@1.21.7: {} - joi@17.13.6: + joi@17.13.7: dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 @@ -10964,7 +10969,7 @@ snapshots: minimatch@3.1.5: dependencies: - brace-expansion: 1.1.18 + brace-expansion: 1.1.20 minimist@1.2.8: {} @@ -12548,7 +12553,7 @@ snapshots: - bufferutil - utf-8-validate - webpack-dev-middleware@7.4.5(webpack@5.109.2(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(html-minifier-terser@7.2.0)(postcss@8.5.26)): + webpack-dev-middleware@7.4.6(webpack@5.109.2(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(html-minifier-terser@7.2.0)(postcss@8.5.26)): dependencies: colorette: 2.0.20 memfs: 4.68.1 @@ -12587,7 +12592,7 @@ snapshots: serve-index: 1.9.2(supports-color@8.1.1) sockjs: 0.3.24 spdy: 4.0.2(supports-color@8.1.1) - webpack-dev-middleware: 7.4.5(webpack@5.109.2(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(html-minifier-terser@7.2.0)(postcss@8.5.26)) + webpack-dev-middleware: 7.4.6(webpack@5.109.2(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(html-minifier-terser@7.2.0)(postcss@8.5.26)) ws: 8.21.3 optionalDependencies: webpack: 5.109.2(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.26))(csso@5.0.5)(html-minifier-terser@7.2.0)(postcss@8.5.26) diff --git a/website/pnpm-workspace.yaml b/website/pnpm-workspace.yaml index 885b97f..e86219f 100644 --- a/website/pnpm-workspace.yaml +++ b/website/pnpm-workspace.yaml @@ -1,6 +1,13 @@ allowBuilds: core-js: true +minimumReleaseAgeExclude: + - http-cache-semantics@4.3.0 overrides: js-yaml: 4.3.2 serialize-javascript: 7.0.3 image-size: 2.0.3 + brace-expansion@1.1.18: 1.1.20 + fast-uri@3.1.6: 3.1.7 + http-cache-semantics@4.2.0: 4.3.0 + joi@17.13.6: 17.13.7 + webpack-dev-middleware@7.4.5: 7.4.6