Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
e354d54
feat: normalize provider subscription rate limits
ymichael Aug 5, 2026
886393e
feat: add guarded rate limit continuation
ymichael Aug 5, 2026
37cdf53
feat: expose manual rate limit recovery
ymichael Aug 5, 2026
1624317
feat: add provider retry plugin
ymichael Aug 5, 2026
585c56f
feat: add provider rate limit retry commands
ymichael Aug 5, 2026
a90f959
test: register provider retry in plugin catalog
ymichael Aug 5, 2026
792bc50
fix: report provider retry cancellation races
ymichael Aug 5, 2026
7d118f6
fix: make provider retry opt in
ymichael Aug 5, 2026
7f388f1
fix: toggle plugins from settings details
ymichael Aug 5, 2026
d6dbe45
fix: keep plugin settings identity stable
ymichael Aug 5, 2026
ae29226
fix: stabilize plugin settings detail states
ymichael Aug 5, 2026
8d30466
fix: remove redundant plugin settings headings
ymichael Aug 5, 2026
1795dae
fix: trim provider retry scope
ymichael Aug 5, 2026
a5b9018
fix: hide running plugin status pill
ymichael Aug 5, 2026
ff818cf
fix(provider-retry): fail closed before recovery
ymichael Aug 6, 2026
22efde0
fix(agent-runtime): preserve sparse rate limit state
ymichael Aug 6, 2026
a390aa5
fix(provider-retry): harden scheduler state
ymichael Aug 6, 2026
e840b24
fix(app): stabilize plugin settings lifecycle
ymichael Aug 6, 2026
49b6aff
docs(provider-retry): document opt-in recovery
ymichael Aug 6, 2026
587cda5
fix(agent-runtime): hydrate Codex rate limits
ymichael Aug 6, 2026
825ed79
fix(provider-retry): stop retrying continuation failures
ymichael Aug 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 33 additions & 21 deletions apps/app/src/components/plugin/PluginSettingsSections.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,27 +29,39 @@ function PluginSettingsSectionList({
}) {
return (
<div className="space-y-6" data-testid="plugin-settings-sections">
{sections.map((section) => (
<ResourceDetailConfigurationSection
key={`${section.pluginId}/${section.id}/${section.generation}`}
label={section.title ?? "Plugin settings"}
>
<ResourceDetailPanel surface="recessed" className="px-3 py-3">
{section.description !== undefined ? (
<p className="mb-3 text-xs leading-snug text-subtle-foreground/75">
{section.description}
</p>
) : null}
<PluginSlotMount
pluginId={section.pluginId}
slotKind="settingsSection"
slotId={section.id}
>
<section.component />
</PluginSlotMount>
</ResourceDetailPanel>
</ResourceDetailConfigurationSection>
))}
{sections.map((section) => {
const key = `${section.pluginId}/${section.id}/${section.generation}`;
return section.title === undefined ? (
<PluginSettingsSectionPanel key={key} section={section} />
) : (
<ResourceDetailConfigurationSection key={key} label={section.title}>
<PluginSettingsSectionPanel section={section} />
</ResourceDetailConfigurationSection>
);
})}
</div>
);
}

function PluginSettingsSectionPanel({
section,
}: {
section: PluginSettingsSectionSlot;
}) {
return (
<ResourceDetailPanel surface="recessed" className="px-3 py-3">
{section.description !== undefined ? (
<p className="mb-3 text-xs leading-snug text-subtle-foreground/75">
{section.description}
</p>
) : null}
<PluginSlotMount
pluginId={section.pluginId}
slotKind="settingsSection"
slotId={section.id}
>
<section.component />
</PluginSlotMount>
</ResourceDetailPanel>
);
}
Loading
Loading