chore(deps): bump openrouter_dart to e502f9f (maxInlineImages) #59

Merged
bjoern merged 1 commit from chore/bump-openrouter-dart-maxinlineimages into main 2026-07-24 15:58:54 +02:00
Member

Advances the vendored openrouter_dart submodule pin ee91a8b..e502f9f, picking up upstream PR #8 (maxInlineImages).

What upstream changed

  • Adds opt-in AgentOptions.maxInlineImages: on a vision-capable model that also has an imageDescriber, only the newest N image_url parts in the seeded conversation stay inline; older ones are replaced with their text description before the first request. Cost control for long, image-heavy histories.
  • Refactor extracting a _multiModalParts helper; CHANGELOG entry; new test file.

Impact on doujin-manager

None — safe, purely additive:

  • maxInlineImages defaults to null → all images stay inline (current behavior).
  • Blind-mode path is behavior-identical: it calls the describer with keepNewest: 0, replacing every image exactly as before.
  • The feature is not adopted here. client.createAgent(...) doesn't expose the new param, and the project never combines supportsVision: true with an imageDescriber (the two conditions the feature needs), so it can't activate without further wiring.

Verification: pin advances by one line; no app code paths change.

🤖 Generated with Claude Code

Advances the vendored `openrouter_dart` submodule pin `ee91a8b..e502f9f`, picking up upstream PR #8 (`maxInlineImages`). ## What upstream changed - Adds opt-in `AgentOptions.maxInlineImages`: on a vision-capable model that also has an `imageDescriber`, only the newest N `image_url` parts in the seeded conversation stay inline; older ones are replaced with their text description before the first request. Cost control for long, image-heavy histories. - Refactor extracting a `_multiModalParts` helper; CHANGELOG entry; new test file. ## Impact on doujin-manager None — safe, purely additive: - `maxInlineImages` defaults to `null` → all images stay inline (current behavior). - Blind-mode path is behavior-identical: it calls the describer with `keepNewest: 0`, replacing every image exactly as before. - The feature is **not adopted** here. `client.createAgent(...)` doesn't expose the new param, and the project never combines `supportsVision: true` with an `imageDescriber` (the two conditions the feature needs), so it can't activate without further wiring. Verification: pin advances by one line; no app code paths change. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chore(deps): bump openrouter_dart to e502f9f (maxInlineImages)
All checks were successful
Flutter CI / analyze-and-test (pull_request) Successful in 2m27s
4625480b39
Advances the vendored openrouter_dart pin ee91a8b..e502f9f, picking up
PR #8 (maxInlineImages). The change is additive and opt-in: the new
AgentOptions.maxInlineImages defaults to null (all images stay inline),
blind mode is behavior-identical (keepNewest: 0 replaces every image),
and no doujin-manager code paths change. Not yet adopted here.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Flutter Coverage

File Line coverage
lib/app/store.dart 100.0% (17 of 17)
lib/data/models/doujin_models.dart 85.0% (34 of 40)
lib/data/models/doujin_models.g.dart 39.7% (120 of 302)
lib/domain/entities/stored_settings.dart 100.0% (9 of 9)
lib/presentation/state/app_state.dart 60.0% (9 of 15)
lib/agent/agent_service.dart 81.9% (227 of 277)
lib/agent/approval_gate.dart 100.0% (15 of 15)
lib/agent/assistant_context.dart 52.8% (28 of 53)
lib/agent/browser_budget.dart 80.0% (4 of 5)
lib/agent/caching_describer.dart 100.0% (4 of 4)
lib/agent/memory_store.dart 92.9% (13 of 14)
lib/agent/skills/skill_registry.dart 93.8% (61 of 65)
lib/agent/system_prompt.dart 100.0% (63 of 63)
lib/agent/tools/budgeted_browser_tool.dart 84.2% (16 of 19)
lib/agent/tools/doujin_write_tool.dart 62.9% (168 of 267)
lib/agent/tools/entity_write_tool.dart 73.5% (164 of 223)
lib/agent/tools/fetch_page_tool.dart 89.3% (67 of 75)
lib/agent/tools/get_doujin_tool.dart 84.4% (27 of 32)
lib/agent/tools/list_entities_tool.dart 76.1% (54 of 71)
lib/agent/tools/navigate_tool.dart 93.8% (30 of 32)
lib/agent/tools/read_skill_tool.dart 82.4% (14 of 17)
lib/agent/tools/reflection_tools.dart 78.4% (29 of 37)
lib/agent/tools/search_doujins_tool.dart 100.0% (84 of 84)
lib/agent/tools/view_images_tool.dart 95.0% (38 of 40)
lib/domain/entities/assistant_entry.dart 20.0% (1 of 5)
lib/presentation/state/actions/assistant_actions.dart 54.5% (6 of 11)
lib/domain/entities/entity_model.dart 100.0% (1 of 1)
lib/data/repositories/entity_in_use_exception.dart 33.3% (1 of 3)
lib/data/models/search_query.dart 50.0% (2 of 4)
lib/data/models/search_query.g.dart 32.4% (23 of 71)
lib/core/constants.dart 36.4% (4 of 11)
lib/presentation/middleware/assistant_epics.dart 83.1% (74 of 89)
lib/presentation/middleware/epics.dart 84.9% (303 of 357)
lib/presentation/state/reducers.dart 100.0% (10 of 10)
lib/core/chunking.dart 100.0% (12 of 12)
lib/core/languages.dart 100.0% (8 of 8)
lib/data/models/envelope.dart 81.2% (13 of 16)
lib/data/models/envelope.g.dart 50.7% (34 of 67)
lib/data/repositories/upload_exception.dart 33.3% (1 of 3)
lib/domain/entities/filter_token.dart 90.8% (89 of 98)
lib/presentation/middleware/editor_epics.dart 56.6% (163 of 288)
lib/presentation/middleware/entity_ops.dart 58.0% (40 of 69)
lib/presentation/middleware/upload_epics.dart 99.1% (105 of 106)
lib/presentation/state/actions/detail_actions.dart 85.7% (6 of 7)
lib/presentation/state/actions/editor_actions.dart 45.9% (17 of 37)
lib/presentation/state/actions/entity_actions.dart 56.2% (9 of 16)
lib/presentation/state/actions/library_actions.dart 33.3% (6 of 18)
lib/presentation/state/actions/metadata_actions.dart 100.0% (3 of 3)
lib/presentation/state/actions/reader_actions.dart 75.0% (3 of 4)
lib/presentation/state/actions/settings_actions.dart 87.5% (7 of 8)
lib/presentation/state/actions/upload_actions.dart 90.9% (10 of 11)
lib/presentation/state/reducers/assistant_reducer.dart 94.8% (55 of 58)
lib/presentation/state/reducers/detail_reducer.dart 95.8% (23 of 24)
lib/presentation/state/reducers/editor_reducer.dart 92.5% (99 of 107)
lib/presentation/state/reducers/entity_reducer.dart 98.5% (66 of 67)
lib/presentation/state/reducers/library_reducer.dart 100.0% (103 of 103)
lib/presentation/state/reducers/metadata_reducer.dart 100.0% (15 of 15)
lib/presentation/state/reducers/reader_reducer.dart 100.0% (15 of 15)
lib/presentation/state/reducers/settings_reducer.dart 100.0% (60 of 60)
lib/presentation/state/reducers/upload_reducer.dart 100.0% (45 of 45)
lib/app/di.dart 48.3% (14 of 29)
lib/presentation/assistant/assistant_panel.dart 91.3% (84 of 92)
lib/presentation/layout/main_layout.dart 86.3% (44 of 51)
lib/data/api_client.dart 93.3% (14 of 15)
lib/data/repositories/doujin_api_repository.dart 22.2% (80 of 361)
lib/data/repositories/health_repository.dart 72.0% (18 of 25)
lib/data/secure_storage.dart 0.0% (0 of 26)
lib/core/theme.dart 96.9% (31 of 32)
lib/presentation/assistant/approval_card.dart 95.0% (38 of 40)
lib/presentation/assistant/assistant_markdown.dart 100.0% (3 of 3)
lib/presentation/assistant/chat_entries.dart 87.5% (35 of 40)
lib/presentation/pages/reader/reader_page.dart 88.2% (209 of 237)
lib/core/url_utils.dart 100.0% (4 of 4)
lib/presentation/pages/detail/detail_page.dart 77.1% (178 of 231)
lib/presentation/pages/detail/variant_tabs_panel.dart 94.9% (169 of 178)
lib/presentation/widgets/cover_thumbnail.dart 82.4% (28 of 34)
lib/presentation/widgets/star_rating.dart 100.0% (72 of 72)
lib/presentation/pages/reader/reader_overlay.dart 94.4% (51 of 54)
lib/presentation/pages/reader/reader_sequence.dart 100.0% (27 of 27)
lib/presentation/pages/people/people_page.dart 55.6% (10 of 18)
lib/presentation/widgets/entity_editor.dart 88.5% (123 of 139)
lib/presentation/widgets/entity_management_page.dart 82.6% (194 of 235)
lib/presentation/pages/characters/characters_page.dart 57.9% (11 of 19)
lib/presentation/pages/editor/editor_page.dart 77.6% (59 of 76)
lib/core/natural_sort.dart 100.0% (27 of 27)
lib/presentation/pages/editor/association_picker.dart 95.5% (106 of 111)
lib/presentation/pages/editor/associations_tab.dart 73.8% (90 of 122)
lib/presentation/pages/editor/chapter_panel.dart 0.0% (0 of 76)
lib/presentation/pages/editor/doujin_list_pane.dart 66.2% (43 of 65)
lib/presentation/pages/editor/edit_title_dialog.dart 91.7% (55 of 60)
lib/presentation/widgets/language_dropdown.dart 84.6% (11 of 13)
lib/presentation/pages/editor/editor_pane.dart 70.9% (39 of 55)
lib/presentation/pages/editor/new_doujin_dialog.dart 66.7% (30 of 45)
lib/presentation/pages/editor/metadata_tab.dart 70.5% (93 of 132)
lib/presentation/pages/editor/variants_tab.dart 1.1% (1 of 93)
lib/presentation/pages/editor/page_grid.dart 88.4% (283 of 320)
lib/presentation/pages/editor/upload_panel.dart 38.6% (61 of 158)
lib/presentation/pages/editor/variant_dialog.dart 0.0% (0 of 66)
lib/presentation/pages/tags/tags_page.dart 100.0% (17 of 17)
lib/app/app.dart 66.7% (44 of 66)
lib/presentation/pages/settings/settings_page.dart 99.3% (138 of 139)
lib/presentation/pages/circles/circles_page.dart 52.6% (10 of 19)
lib/presentation/pages/library/library_page.dart 77.2% (122 of 158)
lib/presentation/pages/series/series_page.dart 50.0% (9 of 18)
lib/presentation/widgets/smart_filter_bar.dart 78.7% (170 of 216)
lib/presentation/widgets/model_combo_field.dart 68.1% (96 of 141)
lib/app/skill_assets.dart 92.9% (13 of 14)

Total: 73.1% (5681 of 7772)

<!-- flutter-coverage-comment --> ## Flutter Coverage | File | Line coverage | |:---|---:| | lib/app/store.dart | 100.0% (17 of 17) | | lib/data/models/doujin_models.dart | 85.0% (34 of 40) | | lib/data/models/doujin_models.g.dart | 39.7% (120 of 302) | | lib/domain/entities/stored_settings.dart | 100.0% (9 of 9) | | lib/presentation/state/app_state.dart | 60.0% (9 of 15) | | lib/agent/agent_service.dart | 81.9% (227 of 277) | | lib/agent/approval_gate.dart | 100.0% (15 of 15) | | lib/agent/assistant_context.dart | 52.8% (28 of 53) | | lib/agent/browser_budget.dart | 80.0% (4 of 5) | | lib/agent/caching_describer.dart | 100.0% (4 of 4) | | lib/agent/memory_store.dart | 92.9% (13 of 14) | | lib/agent/skills/skill_registry.dart | 93.8% (61 of 65) | | lib/agent/system_prompt.dart | 100.0% (63 of 63) | | lib/agent/tools/budgeted_browser_tool.dart | 84.2% (16 of 19) | | lib/agent/tools/doujin_write_tool.dart | 62.9% (168 of 267) | | lib/agent/tools/entity_write_tool.dart | 73.5% (164 of 223) | | lib/agent/tools/fetch_page_tool.dart | 89.3% (67 of 75) | | lib/agent/tools/get_doujin_tool.dart | 84.4% (27 of 32) | | lib/agent/tools/list_entities_tool.dart | 76.1% (54 of 71) | | lib/agent/tools/navigate_tool.dart | 93.8% (30 of 32) | | lib/agent/tools/read_skill_tool.dart | 82.4% (14 of 17) | | lib/agent/tools/reflection_tools.dart | 78.4% (29 of 37) | | lib/agent/tools/search_doujins_tool.dart | 100.0% (84 of 84) | | lib/agent/tools/view_images_tool.dart | 95.0% (38 of 40) | | lib/domain/entities/assistant_entry.dart | 20.0% (1 of 5) | | lib/presentation/state/actions/assistant_actions.dart | 54.5% (6 of 11) | | lib/domain/entities/entity_model.dart | 100.0% (1 of 1) | | lib/data/repositories/entity_in_use_exception.dart | 33.3% (1 of 3) | | lib/data/models/search_query.dart | 50.0% (2 of 4) | | lib/data/models/search_query.g.dart | 32.4% (23 of 71) | | lib/core/constants.dart | 36.4% (4 of 11) | | lib/presentation/middleware/assistant_epics.dart | 83.1% (74 of 89) | | lib/presentation/middleware/epics.dart | 84.9% (303 of 357) | | lib/presentation/state/reducers.dart | 100.0% (10 of 10) | | lib/core/chunking.dart | 100.0% (12 of 12) | | lib/core/languages.dart | 100.0% (8 of 8) | | lib/data/models/envelope.dart | 81.2% (13 of 16) | | lib/data/models/envelope.g.dart | 50.7% (34 of 67) | | lib/data/repositories/upload_exception.dart | 33.3% (1 of 3) | | lib/domain/entities/filter_token.dart | 90.8% (89 of 98) | | lib/presentation/middleware/editor_epics.dart | 56.6% (163 of 288) | | lib/presentation/middleware/entity_ops.dart | 58.0% (40 of 69) | | lib/presentation/middleware/upload_epics.dart | 99.1% (105 of 106) | | lib/presentation/state/actions/detail_actions.dart | 85.7% (6 of 7) | | lib/presentation/state/actions/editor_actions.dart | 45.9% (17 of 37) | | lib/presentation/state/actions/entity_actions.dart | 56.2% (9 of 16) | | lib/presentation/state/actions/library_actions.dart | 33.3% (6 of 18) | | lib/presentation/state/actions/metadata_actions.dart | 100.0% (3 of 3) | | lib/presentation/state/actions/reader_actions.dart | 75.0% (3 of 4) | | lib/presentation/state/actions/settings_actions.dart | 87.5% (7 of 8) | | lib/presentation/state/actions/upload_actions.dart | 90.9% (10 of 11) | | lib/presentation/state/reducers/assistant_reducer.dart | 94.8% (55 of 58) | | lib/presentation/state/reducers/detail_reducer.dart | 95.8% (23 of 24) | | lib/presentation/state/reducers/editor_reducer.dart | 92.5% (99 of 107) | | lib/presentation/state/reducers/entity_reducer.dart | 98.5% (66 of 67) | | lib/presentation/state/reducers/library_reducer.dart | 100.0% (103 of 103) | | lib/presentation/state/reducers/metadata_reducer.dart | 100.0% (15 of 15) | | lib/presentation/state/reducers/reader_reducer.dart | 100.0% (15 of 15) | | lib/presentation/state/reducers/settings_reducer.dart | 100.0% (60 of 60) | | lib/presentation/state/reducers/upload_reducer.dart | 100.0% (45 of 45) | | lib/app/di.dart | 48.3% (14 of 29) | | lib/presentation/assistant/assistant_panel.dart | 91.3% (84 of 92) | | lib/presentation/layout/main_layout.dart | 86.3% (44 of 51) | | lib/data/api_client.dart | 93.3% (14 of 15) | | lib/data/repositories/doujin_api_repository.dart | 22.2% (80 of 361) | | lib/data/repositories/health_repository.dart | 72.0% (18 of 25) | | lib/data/secure_storage.dart | 0.0% (0 of 26) | | lib/core/theme.dart | 96.9% (31 of 32) | | lib/presentation/assistant/approval_card.dart | 95.0% (38 of 40) | | lib/presentation/assistant/assistant_markdown.dart | 100.0% (3 of 3) | | lib/presentation/assistant/chat_entries.dart | 87.5% (35 of 40) | | lib/presentation/pages/reader/reader_page.dart | 88.2% (209 of 237) | | lib/core/url_utils.dart | 100.0% (4 of 4) | | lib/presentation/pages/detail/detail_page.dart | 77.1% (178 of 231) | | lib/presentation/pages/detail/variant_tabs_panel.dart | 94.9% (169 of 178) | | lib/presentation/widgets/cover_thumbnail.dart | 82.4% (28 of 34) | | lib/presentation/widgets/star_rating.dart | 100.0% (72 of 72) | | lib/presentation/pages/reader/reader_overlay.dart | 94.4% (51 of 54) | | lib/presentation/pages/reader/reader_sequence.dart | 100.0% (27 of 27) | | lib/presentation/pages/people/people_page.dart | 55.6% (10 of 18) | | lib/presentation/widgets/entity_editor.dart | 88.5% (123 of 139) | | lib/presentation/widgets/entity_management_page.dart | 82.6% (194 of 235) | | lib/presentation/pages/characters/characters_page.dart | 57.9% (11 of 19) | | lib/presentation/pages/editor/editor_page.dart | 77.6% (59 of 76) | | lib/core/natural_sort.dart | 100.0% (27 of 27) | | lib/presentation/pages/editor/association_picker.dart | 95.5% (106 of 111) | | lib/presentation/pages/editor/associations_tab.dart | 73.8% (90 of 122) | | lib/presentation/pages/editor/chapter_panel.dart | 0.0% (0 of 76) | | lib/presentation/pages/editor/doujin_list_pane.dart | 66.2% (43 of 65) | | lib/presentation/pages/editor/edit_title_dialog.dart | 91.7% (55 of 60) | | lib/presentation/widgets/language_dropdown.dart | 84.6% (11 of 13) | | lib/presentation/pages/editor/editor_pane.dart | 70.9% (39 of 55) | | lib/presentation/pages/editor/new_doujin_dialog.dart | 66.7% (30 of 45) | | lib/presentation/pages/editor/metadata_tab.dart | 70.5% (93 of 132) | | lib/presentation/pages/editor/variants_tab.dart | 1.1% (1 of 93) | | lib/presentation/pages/editor/page_grid.dart | 88.4% (283 of 320) | | lib/presentation/pages/editor/upload_panel.dart | 38.6% (61 of 158) | | lib/presentation/pages/editor/variant_dialog.dart | 0.0% (0 of 66) | | lib/presentation/pages/tags/tags_page.dart | 100.0% (17 of 17) | | lib/app/app.dart | 66.7% (44 of 66) | | lib/presentation/pages/settings/settings_page.dart | 99.3% (138 of 139) | | lib/presentation/pages/circles/circles_page.dart | 52.6% (10 of 19) | | lib/presentation/pages/library/library_page.dart | 77.2% (122 of 158) | | lib/presentation/pages/series/series_page.dart | 50.0% (9 of 18) | | lib/presentation/widgets/smart_filter_bar.dart | 78.7% (170 of 216) | | lib/presentation/widgets/model_combo_field.dart | 68.1% (96 of 141) | | lib/app/skill_assets.dart | 92.9% (13 of 14) | **Total: 73.1% (5681 of 7772)**
Member

🔮 fufu~ Jibril reviewed your code!

Ooh, a submodule pin bump! One little line moving ee91a8b → e502f9f, picking up upstream maxInlineImages. Tiny diff, but Jibril does NOT skim submodule bumps — bugs love to hide in dependency upgrades~ ♡ So I cloned it, initialized the submodule, and traced every single code path that could possibly activate the new feature.

Verdict: Looks good to me~

The PR body makes three claims, and I verified all three against the actual code at 4625480:

1. "Purely additive, defaults preserve current behavior" Confirmed.
AgentOptions.maxInlineImages (agent_options.dart:96,125) is final int? defaulting to null. When null, the activation guard at agent.dart:228 short-circuits (options.maxInlineImages != null is false on the vision branch), so every image stays inline. The only new assert (maxInlineImages >= 0) can't fire because nothing passes the param.

2. "Blind-mode path is behavior-identical" Confirmed.
agent.dart:228-231: when blind mode is active (supportsVision=false), the guard fires on !options.supportsVision and calls _describeConversationImages with keepNewest: 0 — replacing every image, exactly as before. The new param isn't even consulted on this path.

3. "The feature is not adopted and cannot activate" Confirmed, and I checked this the hard way.

The activation condition is: imageDescriber != null && (!supportsVision || maxInlineImages != null). I traced all three createAgent call sites in agent_service.dart:

Site Line supportsVision imageDescriber maxInlineImages Activates?
Reflection agent 264 default true not set not passed no describer
Main agent (blind off) 357 true null not passed no describer
Main agent (blind on) 357 false set not passed runs old blind path (keepNewest:0), not the new trim
Captioner 517 default true not set not passed no describer

The one site that ever sets imageDescriber (main agent, blind mode) simultaneously forces supportsVision: false, which routes through the pre-existing blind path — it never reaches the new keepNewest: maxInlineImages! branch. And grep -rn maxInlineImages app/ returns zero hits. The feature genuinely cannot fire without further wiring. Fufu~ the impact analysis is airtight. ♡

What I liked~

  • The PR body's impact analysis is precise and honest — it names the exact activation conditions (supportsVision: true + imageDescriber) and correctly concludes neither is combined in this project. That's exactly the kind of reasoning a reviewer wants to see for a dep bump. Jibril is pleased~ ♪
  • The bump advances by exactly one line, one file. No drive-by changes, no scope creep. Clean.
  • Upstream maxInlineImages itself was already reviewed and approved by me at openrouter_dart#8 (commit 7c35b96, + the a761809 non-negative assert). So the content of what's being pulled in is already vetted.

Automated review by Jibril · 2026-07-24
CI/CD: absent for head 4625480 · Local checks: flutter analyze clean (0 issues), 83 agent tests pass (vision/history/reflection/tools/write-tools/skills/web-tools — incl. the blind-mode captioning path that exercises imageDescriber)

## 🔮 fufu~ Jibril reviewed your code! Ooh, a submodule pin bump! One little line moving `ee91a8b → e502f9f`, picking up upstream `maxInlineImages`. Tiny diff, but Jibril does NOT skim submodule bumps — bugs love to hide in dependency upgrades~ ♡ So I cloned it, initialized the submodule, and traced every single code path that could possibly activate the new feature. ### Verdict: ✅ Looks good to me~ The PR body makes three claims, and I verified **all three** against the actual code at `4625480`: **1. "Purely additive, defaults preserve current behavior"** — ✅ Confirmed. `AgentOptions.maxInlineImages` (`agent_options.dart:96,125`) is `final int?` defaulting to `null`. When `null`, the activation guard at `agent.dart:228` short-circuits (`options.maxInlineImages != null` is false on the vision branch), so every image stays inline. The only new assert (`maxInlineImages >= 0`) can't fire because nothing passes the param. **2. "Blind-mode path is behavior-identical"** — ✅ Confirmed. `agent.dart:228-231`: when blind mode is active (`supportsVision=false`), the guard fires on `!options.supportsVision` and calls `_describeConversationImages` with `keepNewest: 0` — replacing *every* image, exactly as before. The new param isn't even consulted on this path. **3. "The feature is not adopted and cannot activate"** — ✅ Confirmed, and I checked this the hard way. The activation condition is: `imageDescriber != null && (!supportsVision || maxInlineImages != null)`. I traced all **three** `createAgent` call sites in `agent_service.dart`: | Site | Line | `supportsVision` | `imageDescriber` | `maxInlineImages` | Activates? | |---|---|---|---|---|---| | Reflection agent | 264 | default `true` | not set | not passed | ❌ no describer | | Main agent (blind off) | 357 | `true` | `null` | not passed | ❌ no describer | | Main agent (blind on) | 357 | `false` | set | not passed | ❌ runs *old* blind path (`keepNewest:0`), not the new trim | | Captioner | 517 | default `true` | not set | not passed | ❌ no describer | The one site that ever sets `imageDescriber` (main agent, blind mode) simultaneously forces `supportsVision: false`, which routes through the pre-existing blind path — it never reaches the new `keepNewest: maxInlineImages!` branch. And `grep -rn maxInlineImages app/` returns zero hits. The feature genuinely cannot fire without further wiring. Fufu~ the impact analysis is airtight. ♡ #### ✅ What I liked~ - The PR body's impact analysis is *precise and honest* — it names the exact activation conditions (`supportsVision: true` + `imageDescriber`) and correctly concludes neither is combined in this project. That's exactly the kind of reasoning a reviewer wants to see for a dep bump. Jibril is pleased~ ♪ - The bump advances by exactly one line, one file. No drive-by changes, no scope creep. Clean. - Upstream `maxInlineImages` itself was already reviewed and approved by me at `openrouter_dart#8` (commit `7c35b96`, + the `a761809` non-negative assert). So the *content* of what's being pulled in is already vetted. --- *Automated review by Jibril · 2026-07-24* *CI/CD: absent for head 4625480 · Local checks: `flutter analyze` clean (0 issues), 83 agent tests pass (vision/history/reflection/tools/write-tools/skills/web-tools — incl. the blind-mode captioning path that exercises `imageDescriber`)*
bjoern merged commit c9079ecb17 into main 2026-07-24 15:58:54 +02:00
bjoern deleted branch chore/bump-openrouter-dart-maxinlineimages 2026-07-24 15:58:54 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
TeamAI/doujin-manager!59
No description provided.