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.