Merge branch 'main' into watchers

* main:
  Fix add card not working in the cards screen
  Submit and refresh results as you type terms
  Fix: When expanding filters, submitting filters should keep the filters expanded
  Invalidate cache when filter changes
  Switch to gpt-5-chat
  Handle filter toggles with JS
  Prevent glitch where you see the filter bar expanded when you clear it
  Remove unused templates
  Fix: all collections link not working after moving to turbo frame
  Restore cache I deleted by mistake
  Speed up filter expansion with turbo stream
  Fix: filtering collections not working after moving menu to turbo frame
  Respect params when loading the menu or they won't be reflected!
  Add HTTP cache for the menu
  Load main menu lazily with a turbo frame
  Inline :has(&) as it's REALLY slow in Safari
  Extract helper method
  Remove transition that is making Safari choke when navigating to Fizzy menus
  Reduce page size to reduce load for processing local times on initial page load
  Avoid having to parse strings

# Conflicts:
#	app/views/cards/index/_add_card_button.html.erb
#	test/vcr_cassettes/period_highlight_test-test_don_t_generate_highlights_for_existing_periods.yml
#	test/vcr_cassettes/period_highlight_test-test_generate_period_highlights.yml
#	test/vcr_cassettes/user/highlights_test-test_don_t_generate_highlights_for_existing_periods.yml
#	test/vcr_cassettes/user/highlights_test-test_generate_weekly_highlights.yml
This commit is contained in:
Jorge Manrubia
2025-09-12 18:52:17 +02:00
45 changed files with 571 additions and 701 deletions
+13 -17
View File
@@ -92,29 +92,25 @@
display: none;
}
.card__background {
.card:has(& img:not([src=""])) {
.card__content,
.card__meta,
.workflow-stage:not(.workflow-stage--current) {
opacity: 0;
transition: opacity 0.2s ease-in-out;
.card:has(.card__background img:not([src=""])) {
.card__content,
.card__meta,
.workflow-stage:not(.workflow-stage--current) {
opacity: 0;
transition: opacity 0.2s ease-in-out;
@media (any-hover: hover) {
.card:hover & {
@media (any-hover: hover) {
.card:hover & {
opacity: 1;
}
}
}
}
}
@media (any-hover: hover) {
.card:hover & {
img:not([src=""]) {
filter: blur(3px) brightness(1.2);
opacity: 0.2;
}
}
@media (any-hover: hover) {
.card:has(.card__background img:not([src=""])):hover .card__background img:not([src=""]) {
filter: blur(3px) brightness(1.2);
opacity: 0.2;
}
}
+4 -4
View File
@@ -308,11 +308,11 @@
position: absolute;
rotate: 5deg;
transform-origin: top right;
}
.card:has(&),
.card-perma:has(&) {
--card-color: var(--color-card-complete) !important;
}
.card:has(.card__closed),
.card-perma:has(.card__closed) {
--card-color: var(--color-card-complete) !important;
}
.card__closed-title {
+19 -4
View File
@@ -3,11 +3,14 @@
position: relative;
view-transition-name: "filters";
z-index: var(--z-popup);
}
#header:has(&) {
position: relative;
z-index: var(--z-popup);
}
#header:has(.filters) {
position: relative;
z-index: var(--z-popup);
}
.filters {
.btn {
--btn-border-color: var(--color-ink-medium);
@@ -114,5 +117,17 @@
display: none;
}
}
.filters:not(.filters--expanded) {
.quick-filter:not([data-filter-show=true]) {
display: none;
}
}
.filters.filters--expanded {
.quick-filter {
display: block;
}
}
}
-1
View File
@@ -14,7 +14,6 @@
"actions-start title actions-end";
max-inline-size: 100dvw;
padding: calc(var(--block-space-half) + env(safe-area-inset-top)) var(--main-padding);
view-transition-name: header;
/* Change the grid size depending on how many buttons are present */
&:has(.header__actions > *:nth-child(1)) { --header-button-count: 1; }
+4 -6
View File
@@ -60,13 +60,11 @@
cursor: pointer;
opacity: 0;
}
}
&:focus,
&:focus-visible {
.input--file:has(&) {
outline: 0.15rem solid var(--color-selected-dark);
}
}
&:has(input[type="file"]:focus),
&:has(input[type="file"]:focus-visible) {
outline: 0.15rem solid var(--color-selected-dark);
}
&:is(.avatar) {
+5 -5
View File
@@ -31,16 +31,16 @@
--panel-padding: var(--block-space) var(--block-space) 0 var(--block-space);
}
#header:has(&) {
position: relative;
z-index: var(--z-nav);
}
.card & {
inline-size: 260px;
}
}
#header:has(.popup) {
position: relative;
z-index: var(--z-nav);
}
.popup__footer {
background-color: var(--color-canvas);
border-block-start: 1px solid var(--color-ink-lighter);
+5 -4
View File
@@ -50,11 +50,12 @@
margin-inline: auto;
max-block-size: 32rem;
object-fit: contain;
}
/* Links should hug media contained within */
a:has(&) {
display: inline-block;
}
/* Links should hug media contained within */
a:has(img),
a:has(video) {
display: inline-block;
}
/* Avoid extra space due to empty paragraphs */
+2 -2
View File
@@ -8,7 +8,7 @@ class CardsController < ApplicationController
enable_collection_filtering only: :index
PAGE_SIZE = 50
PAGE_SIZE = 25
def index
@considering = page_and_filter_for @filter.with(engagement_status: "considering"), per_page: PAGE_SIZE
@@ -17,7 +17,7 @@ class CardsController < ApplicationController
@closed = page_and_filter_for_closed_cards
@cache_key = [ @considering, @on_deck, @doing, @closed ].collect { it.page.records }.including([ Workflow.all ])
fresh_when etag: @cache_key
fresh_when etag: [ @cache_key, @user_filtering ]
end
def create
+5 -1
View File
@@ -24,7 +24,11 @@ module FilterScoped
end
def set_user_filtering
@user_filtering = User::Filtering.new(Current.user, @filter, expanded: params[:expand_all])
@user_filtering = User::Filtering.new(Current.user, @filter, expanded: expanded_param)
end
def expanded_param
ActiveRecord::Type::Boolean.new.cast(params[:expand_all])
end
def enable_collection_filtering
+7
View File
@@ -0,0 +1,7 @@
class My::MenusController < ApplicationController
include FilterScoped
def show
fresh_when @user_filtering
end
end
+1 -1
View File
@@ -1,6 +1,6 @@
module TimeHelper
def local_datetime_tag(datetime, style: :time, **attributes)
# Render empty space to ensure it takes height until the local time is loaded via JS
tag.time "&nbsp;".html_safe, **attributes, datetime: datetime.iso8601, data: { local_time_target: style, action: "turbo:morph-element->local-time#refreshTarget" }
tag.time "&nbsp;".html_safe, **attributes, datetime: datetime.to_i, data: { local_time_target: style, action: "turbo:morph-element->local-time#refreshTarget" }
end
end
@@ -1,12 +1,30 @@
import { Controller } from "@hotwired/stimulus"
import { debounce } from "helpers/timing_helpers";
export default class extends Controller {
static targets = [ "cancel" ]
static values = {
debounceTimeout: { type: Number, default: 300 }
}
initialize() {
this.debouncedSubmit = debounce(this.debouncedSubmit.bind(this), this.debounceTimeoutValue)
}
submit() {
this.element.requestSubmit()
}
debouncedSubmit(event) {
this.submit(event)
}
submitToTopTarget(event) {
this.element.setAttribute("data-turbo-frame", "_top")
this.submit()
}
cancel() {
this.cancelTarget?.click()
}
@@ -1,5 +1,5 @@
import { Controller } from "@hotwired/stimulus"
import { differenceInDays } from "helpers/date_helpers"
import { differenceInDays, secondsToDate } from "helpers/date_helpers"
const DEFAULT_LOCALE = "en-US"
@@ -89,7 +89,7 @@ export default class extends Controller {
}
#formatTime(formatter, target) {
const dt = new Date(target.getAttribute("datetime"))
const dt = secondsToDate(parseInt(target.getAttribute("datetime")))
target.innerHTML = formatter.format(dt)
target.title = this.datetimeFormatter.format(dt)
}
@@ -0,0 +1,11 @@
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = [ "element" ]
toggle() {
this.elementTargets.forEach((element) => {
element.toggleAttribute("disabled")
})
}
}
+4
View File
@@ -9,3 +9,7 @@ export function signedDifferenceInDays(fromDate, toDate) {
export function beginningOfDay(date) {
return new Date(date.getFullYear(), date.getMonth(), date.getDate())
}
export function secondsToDate(seconds) {
return new Date(seconds * 1000)
}
+1 -1
View File
@@ -4,7 +4,7 @@ class Event::Summarizer
attr_reader :events
LLM_MODEL = "chatgpt-4o-latest"
LLM_MODEL = "gpt-5-chat-latest"
PROMPT = <<~PROMPT
Help me make sense of the weeks activity in a news style format with bold headlines and short summaries.
+1 -1
View File
@@ -34,7 +34,7 @@ class Filter < ApplicationRecord
result = result.closed_at_window(closure_window) if closure_window
result = result.closed_by(closers) if closers.present?
result = terms.reduce(result) do |result, term|
result.similar_to(term)
result.mentioning(term)
end
result
+4
View File
@@ -47,6 +47,10 @@ module Filter::Fields
def terms
Array(super)
end
def terms=(value)
super(Array(value).filter(&:present?))
end
end
def with(**fields)
+6 -6
View File
@@ -47,28 +47,28 @@ class User::Filtering
end
def show_indexed_by?
expanded? || !filter.indexed_by.all?
!filter.indexed_by.all?
end
def show_sorted_by?
expanded? || !filter.sorted_by.latest?
!filter.sorted_by.latest?
end
def show_tags?
return unless Tag.any?
expanded? || filter.tags.any?
filter.tags.any?
end
def show_assignees?
expanded? || filter.assignees.any?
filter.assignees.any?
end
def show_creators?
expanded? || filter.creators.any?
filter.creators.any?
end
def show_closers?
expanded? || filter.closers.any?
filter.closers.any?
end
def enable_collection_filtering(&block)
+1
View File
@@ -1,4 +1,5 @@
<% @page_title = @user_filtering.selected_collections_label %>
<% turbo_exempts_page_from_cache %>
<%= render "filters/broadcasts", filter: @filter %>
@@ -1,10 +1,10 @@
<% if collection = user_filtering.single_collection %>
<div class="card card--new flex flex-column gap-half">
<%= button_to collection_cards_path(collection), method: :post, class: "btn btn--link" do %>
<div class="card card--new">
<%= button_to collection_cards_path(collection), method: :post, class: "btn", form: { data: { turbo_frame: "_top" } } do %>
<%= icon_tag "add" %>
<span>Add a card</span>
<% end %>
<hr class="separator--horizontal full-width" aria-hidden="true">
<footer class="flex flex-column gap-half">
@@ -1,52 +0,0 @@
<%= form_with url: cards_path, method: :get, class: "display-contents",
data: { controller: "form" } do |form| %>
<% filter.as_params.except(:collection_ids).each do |key, value| %>
<%= filter_hidden_field_tag key, value %>
<% end %>
<% if Current.user.collections.one? %>
<%= link_to cards_path(filter.as_params.except(:collection_ids)), class: "popup__group", id: "filter-collection-init", data: { filter_target: "item", navigable_list_target: "item" } do %>
<%= tag.div class: "popup__item btn" do %>
<span class="overflow-ellipsis"><%= Current.user.collections.first.name %></span>
<span class="txt-ink translucent flex-item-no-shrink flex-item-justify-end"><span class="txt-x-small txt-uppercase">GO TO</span> </span>
<% end %>
<% end %>
<% elsif Current.user.collections.many? %>
<%= link_to cards_path(filter.as_params.except(:collection_ids)), class: "popup__group", id: "filter-collections-all", data: { filter_target: "item", navigable_list_target: "item" } do %>
<label class="popup__radio btn txt-xx-small flex-item-no-shrink">
<input type="checkbox" <%= "checked" if filter.collection_ids.empty? %>>
<span class="for-screen-reader">
See everything in all collections
</span>
<%= icon_tag "check", size: 18, class: "checked" %>
</label>
<%= tag.div class: "popup__item btn" do %>
<span class="overflow-ellipsis">All collections</span>
<span class="txt-ink translucent flex-item-no-shrink flex-item-justify-end"><span class="txt-x-small txt-uppercase">GO TO</span> </span>
<% end %>
<% end %>
<% Current.user.collections.ordered_by_recently_accessed.each do |collection| %>
<li class="popup__group" data-filter-target="item" data-navigable-list-target="item" id="<%= "filter-collection-#{collection.id}" %>">
<label class="popup__radio btn txt-xx-small flex-item-no-shrink">
<%= form.check_box "collection_ids[]", {
checked: filter.collections.include?(collection),
data: { action: "change->form#submit" },
include_hidden: false,
}, collection.id %>
<span class="for-screen-reader">
Toggle filter for <%= collection.name %>
</span>
<%= icon_tag "check", size: 18, class: "checked" %>
</label>
<%= link_to cards_path(collection_ids: [ collection ]), class: "popup__item btn" do %>
<span class="overflow-ellipsis"><%= collection.name %></span>
<span class="translucent flex-item-no-shrink flex-item-justify-end"> </span>
<% end %>
</li>
<% end %>
<% end %>
<% end %>
+10 -8
View File
@@ -1,11 +1,13 @@
<% cache @cache_key do %>
<div class="card-columns" data-controller="related-element" data-related-element-highlight-class="cards--related">
<% unless user_filtering.only_closed? %>
<%= render "cards/index/engagement/on_deck", user_filtering: user_filtering, **on_deck.to_h %>
<%= render "cards/index/engagement/considering", user_filtering: user_filtering, **considering.to_h %>
<%= render "cards/index/engagement/doing", user_filtering: user_filtering, **doing.to_h %>
<% end %>
</div>
<%= turbo_frame_tag :card_columns do %>
<div class="card-columns" data-controller="related-element" data-related-element-highlight-class="cards--related">
<% unless user_filtering.only_closed? %>
<%= render "cards/index/engagement/on_deck", user_filtering: user_filtering, **on_deck.to_h %>
<%= render "cards/index/engagement/considering", user_filtering: user_filtering, **considering.to_h %>
<%= render "cards/index/engagement/doing", user_filtering: user_filtering, **doing.to_h %>
<% end %>
</div>
<%= render "cards/index/engagement/closed", user_filtering: user_filtering, **closed.to_h %>
<%= render "cards/index/engagement/closed", user_filtering: user_filtering, **closed.to_h %>
<% end %>
<% end %>
@@ -1,51 +0,0 @@
<li class="popup__group-title">Collections</li>
<%= form_with url: cards_path, method: :get, class: "display-contents",
data: { controller: "form" } do |form| %>
<% if Current.user.collections.one? %>
<%= link_to cards_path, class: "popup__group", data: { filter_target: "item", navigable_list_target: "item" } do %>
<%= tag.div class: "popup__item btn" do %>
<span class="overflow-ellipsis"><%= Current.user.collections.first.name %></span>
<span class="txt-ink translucent flex-item-no-shrink flex-item-justify-end"><span class="txt-x-small txt-uppercase">GO TO</span> </span>
<% end %>
<% end %>
<% elsif Current.user.collections.many? %>
<li>
<%= link_to cards_path, class: "popup__group", data: { filter_target: "item", navigable_list_target: "item" } do %>
<label class="btn txt-xx-small flex-item-no-shrink">
<input type="checkbox">
<span class="for-screen-reader">
See everything in all collections
</span>
<%= icon_tag "check", size: 18, class: "checked" %>
</label>
<%= tag.div class: "popup__item btn" do %>
<span class="overflow-ellipsis">All collections</span>
<span class="txt-ink translucent flex-item-no-shrink flex-item-justify-end"><span class="txt-x-small txt-uppercase">GO TO</span> </span>
<% end %>
<% end %>
</li>
<% Current.user.collections.ordered_by_recently_accessed.each do |collection| %>
<li class="popup__group" data-filter-target="item" data-navigable-list-target="item">
<label class="btn txt-xx-small flex-item-no-shrink">
<%= form.check_box "collection_ids[]", {
checked: collection == @collection,
data: { action: "change->form#submit" },
include_hidden: false,
}, collection.id %>
<span class="for-screen-reader">
Toggle filter for <%= collection.name %>
</span>
<%= icon_tag "check", size: 18, class: "checked" %>
</label>
<%= link_to cards_path(collection_ids: [ collection ]), class: "popup__item btn" do %>
<span class="overflow-ellipsis"><%= collection.name %></span>
<span class="translucent flex-item-no-shrink flex-item-justify-end"> </span>
<% end %>
</li>
<% end %>
<% end %>
<% end %>
+12 -42
View File
@@ -1,43 +1,13 @@
<% cache user_filtering do %>
<nav data-controller="dialog" data-action="keydown.esc->dialog#close click@document->dialog#closeOnClickOutside">
<%= render "filters/menu/button" %>
<nav data-controller="dialog" data-action="keydown.esc->dialog#close click@document->dialog#closeOnClickOutside">
<%= render "filters/menu/button" %>
<%= tag.dialog class: "fizzy-menu filter popup popup--animated panel margin-block-start-half",
data: {
action: "turbo:before-cache@document->dialog#close keydown->navigable-list#navigate filter:changed->navigable-list#reset toggle->filter#filter",
controller: "filter navigable-list",
dialog_target: "dialog",
navigable_list_focus_on_selection_value: false,
navigable_list_actionable_items_value: true } do %>
<div class="flex gap">
<%= text_field_tag :search, nil,
type: "search",
role: "combobox",
placeholder: "Filter…",
class: "input input--transparent txt-small",
autofocus: true,
autocorrect: "off",
autocomplete: "off",
aria: { activedescendant: "" },
data: {
"1p-ignore": "true",
filter_target: "input",
navigable_list_target: "input",
action: "input->filter#filter" } %>
<button class="fizzy-menu__close btn borderless txt-small" data-action="dialog#close">
<%= icon_tag "close" %>
<span class="for-screen-reader">Close menu</span>
</button>
</div>
<%= render "filters/menu/hotkeys" %>
<%= render "filters/menu/custom", user_filtering: user_filtering %>
<%= render "filters/menu/collections", user_filtering: user_filtering %>
<%= render "filters/menu/tags", user_filtering: user_filtering %>
<%= render "filters/menu/users", user_filtering: user_filtering %>
<%= render "filters/menu/places", user_filtering: user_filtering %>
<%= render "filters/menu/shortcut_notice" %>
<% end %>
</nav>
<% end %>
<%= tag.dialog class: "fizzy-menu filter popup popup--animated panel margin-block-start-half",
data: {
action: "turbo:before-cache@document->dialog#close keydown->navigable-list#navigate filter:changed->navigable-list#reset toggle->filter#filter",
controller: "filter navigable-list",
dialog_target: "dialog",
navigable_list_focus_on_selection_value: false,
navigable_list_actionable_items_value: true } do %>
<%= turbo_frame_tag "my_menu", src: my_menu_path(**user_filtering.filter.as_params), target: "_top" %>
<% end %>
</nav>
+8 -12
View File
@@ -1,17 +1,13 @@
<% cache user_filtering do %>
<aside class="filters flex align-center gap-half justify-center center margin-block-end">
<div class="flex-inline center align-center gap-half">
<%= tag.aside id: "filter-settings",
class: class_names("filters flex align-center gap-half justify-center center margin-block-end", { "filters--expanded": user_filtering.expanded? }),
data: { controller: "toggle-class", toggle_class_toggle_class: "filters--expanded" } do %>
<div class="flex-inline center align-center gap-half" data-controller="toggle-enable">
<%= render "filters/settings/terms", user_filtering: user_filtering %>
<%= render "filters/settings/sorted_by", user_filtering: user_filtering %>
<%= render "filters/settings/indexed_by", user_filtering: user_filtering %>
<%= render "filters/settings/tags", user_filtering: user_filtering %>
<%= render "filters/settings/assignees", user_filtering: user_filtering %>
<%= render "filters/settings/creators", user_filtering: user_filtering %>
<%= render "filters/settings/closers", user_filtering: user_filtering %>
<%= render "filters/settings/time_window", user_filtering: user_filtering, name: :creation, label: "Created" %>
<%= render "filters/settings/time_window", user_filtering: user_filtering, name: :closure, label: "Closed" %>
<%= render "filters/settings/toggle", user_filtering: user_filtering %>
<%= render "filters/settings/controls", user_filtering: user_filtering %>
<%= render "filters/settings/toggle", user_filtering: user_filtering %>
<%= render "filters/settings/manage", user_filtering: user_filtering %>
</div>
</aside>
<% end %>
<% end %>
+2 -2
View File
@@ -1,7 +1,7 @@
<%= form_with url: user_filtering.self_filter_path, method: :get, class: "display-contents",
<% # Using method: :get inside Turbo frame triggers some special Turbo handling where the script_name is lost %>
<%= form_with url: user_filtering.self_filter_path(script_name: Account.sole.slug), method: :get, class: "display-contents",
data: { controller: "form" } do |form| %>
<% if user_filtering.collections.any? %>
<ul class="popup__list">
<li class="popup__group-title">Collections</li>
<%= render "filters/menu/collections/all_option", form: form, user_filtering: user_filtering %>
@@ -1,4 +1,4 @@
<% clear_url_path = user_filtering.self_filter_path(user_filtering.as_params.except(:collection_ids)) %>
<% clear_url_path = user_filtering.self_filter_path(user_filtering.as_params.except(:collection_ids), script_name: request.script_name) %>
<% if Current.user.collections.many? %>
<li class="popup__group" data-filter-target="item" data-navigable-list-target="item" id="filter-collection-all">
@@ -1,6 +1,6 @@
<% filter = user_filtering.filter %>
<% if user_filtering.show_assignees? %>
<div class="quick-filter position-relative" data-controller="dialog" data-action="keydown.esc->dialog#close click@document->dialog#closeOnClickOutside">
<%= tag.div class: "quick-filter position-relative",
data: { controller: "dialog", action: "keydown.esc->dialog#close click@document->dialog#closeOnClickOutside", filter_show: user_filtering.show_assignees? } do %>
<button class="btn input input--select flex-inline txt-x-small" data-action="click->dialog#open:stop">
<span class="overflow-ellipsis">
<% if filter.assignment_status.unassigned? %>
@@ -32,9 +32,7 @@
<%= hidden_field_tag :assignment_status, "unassigned" %>
<% end %>
<% if user_filtering.expanded? %>
<%= hidden_field_tag :expand_all, user_filtering.expanded? %>
<% end %>
<%= hidden_field_tag :expand_all, true, disabled: !user_filtering.expanded?, data: { toggle_enable_target: "element" } %>
<%= form.button type: "submit", class: "popup__item btn" do %>
<span class="overflow-ellipsis flex-item-grow">No one</span>
@@ -61,9 +59,7 @@
<%= hidden_field_tag "assignee_ids[]", user.id %>
<% end %>
<% if user_filtering.expanded? %>
<%= hidden_field_tag :expand_all, user_filtering.expanded? %>
<% end %>
<%= hidden_field_tag :expand_all, true, disabled: !user_filtering.expanded?, data: { toggle_enable_target: "element" } %>
<%= form.button type: "submit", class: "popup__item btn" do %>
<span class="overflow-ellipsis flex-item-grow"><%= user.name %></span>
@@ -76,5 +72,4 @@
<% end %>
</ul>
<% end %>
</div>
<% end %>
+3 -7
View File
@@ -1,8 +1,7 @@
<% filter = user_filtering.filter %>
<% if user_filtering.show_closers? %>
<div class="quick-filter position-relative" data-controller="dialog"
data-action="keydown.esc->dialog#close click@document->dialog#closeOnClickOutside">
<%= tag.div class: "quick-filter position-relative",
data: { controller: "dialog", action: "keydown.esc->dialog#close click@document->dialog#closeOnClickOutside", filter_show: user_filtering.show_closers? } do %>
<button class="btn input input--select flex-inline txt-x-small" data-action="click->dialog#open:stop">
<span class="overflow-ellipsis">
<% if filter.closers.any? %>
@@ -39,9 +38,7 @@
<%= hidden_field_tag "closer_ids[]", user.id %>
<% end %>
<% if user_filtering.expanded? %>
<%= hidden_field_tag :expand_all, user_filtering.expanded? %>
<% end %>
<%= hidden_field_tag :expand_all, true, disabled: !user_filtering.expanded?, data: { toggle_enable_target: "element" } %>
<%= form.button type: "submit", class: "popup__item btn" do %>
<span class="overflow-ellipsis flex-item-grow"><%= user.name %></span>
@@ -54,5 +51,4 @@
<% end %>
</ul>
<% end %>
</div>
<% end %>
+6 -21
View File
@@ -1,21 +1,6 @@
<% filter = user_filtering.filter %>
<% if user_filtering.any? %>
<% if filter.persisted? %>
<%= button_to filter_path(filter), method: :delete, class: "btn txt-x-small btn--reversed", form_class: "inline" do %>
<%= icon_tag "bookmark-outline" %>
<span class="for-screen-reader">Remove saved filter</span>
<% end %>
<% else %>
<% filter_params = filter.as_params.transform_values { |v| v.respond_to?(:to_str) ? v.to_str : v } %>
<%= button_to filters_path, method: :post, params: filter_params, class: "btn txt-x-small", form_class: "inline" do %>
<%= icon_tag "bookmark-outline" %>
<span class="for-screen-reader">Save filter</span>
<% end %>
<% end %>
<%= link_to cards_path(filter.as_params.except(:assignee_ids, :assignment_status, :card_ids, :creator_ids, :closer_ids, :stage_ids, :tag_ids, :terms, :indexed_by, :sorted_by, :creation, :closure)), class: "btn btn--remove txt-x-small" do %>
<%= icon_tag "close" %>
<span class="for-screen-reader">Clear all</span>
<% end %>
<% end %>
<%= render "filters/settings/sorted_by", user_filtering: user_filtering %>
<%= render "filters/settings/indexed_by", user_filtering: user_filtering %>
<%= render "filters/settings/tags", user_filtering: user_filtering %>
<%= render "filters/settings/assignees", user_filtering: user_filtering %>
<%= render "filters/settings/creators", user_filtering: user_filtering %>
<%= render "filters/settings/closers", user_filtering: user_filtering %>
@@ -1,8 +1,7 @@
<% filter = user_filtering.filter %>
<% if user_filtering.show_creators? %>
<div class="quick-filter position-relative" data-controller="dialog"
data-action="keydown.esc->dialog#close click@document->dialog#closeOnClickOutside">
<%= tag.div class: "quick-filter position-relative",
data: { controller: "dialog", action: "keydown.esc->dialog#close click@document->dialog#closeOnClickOutside", filter_show: user_filtering.show_creators? } do %>
<button class="btn input input--select flex-inline txt-x-small" data-action="click->dialog#open:stop">
<span class="overflow-ellipsis">
<% if filter.creators.any? %>
@@ -39,9 +38,7 @@
<%= hidden_field_tag "creator_ids[]", user.id %>
<% end %>
<% if user_filtering.expanded? %>
<%= hidden_field_tag :expand_all, user_filtering.expanded? %>
<% end %>
<%= hidden_field_tag :expand_all, true, disabled: !user_filtering.expanded?, data: { toggle_enable_target: "element" } %>
<%= form.button type: "submit", class: "popup__item btn" do %>
<span class="overflow-ellipsis flex-item-grow"><%= user.name %></span>
@@ -54,5 +51,4 @@
<% end %>
</ul>
<% end %>
</div>
<% end %>
@@ -1,7 +1,7 @@
<% filter = user_filtering.filter %>
<% if user_filtering.show_indexed_by? %>
<div class="quick-filter position-relative <%= "default-value" if filter.indexed_by.all? %>" data-controller="dialog" data-action="keydown.esc->dialog#close click@document->dialog#closeOnClickOutside">
<%= tag.div class: class_names("quick-filter position-relative", "default-value": filter.indexed_by.all?),
data: { controller: "dialog", action: "keydown.esc->dialog#close click@document->dialog#closeOnClickOutside", filter_show: user_filtering.show_indexed_by? } do %>
<button class="btn input input--select flex-inline txt-x-small" data-action="click->dialog#open:stop">
<span class="overflow-ellipsis">
<%= filter.indexed_by == "all" ? "Status" : filter.indexed_by.humanize %>
@@ -21,9 +21,7 @@
<%= hidden_field_tag :indexed_by, index %>
<% if user_filtering.expanded? %>
<%= hidden_field_tag :expand_all, user_filtering.expanded? %>
<% end %>
<%= hidden_field_tag :expand_all, true, disabled: !user_filtering.expanded?, data: { toggle_enable_target: "element" } %>
<%= form.button type: "submit", class: "popup__item btn" do %>
<span class="overflow-ellipsis flex-item-grow"><%= index.humanize %></span>
@@ -36,5 +34,4 @@
<% end %>
</ul>
<% end %>
</div>
<% end %>
@@ -0,0 +1,21 @@
<% filter = user_filtering.filter %>
<% if user_filtering.any? %>
<% if filter.persisted? %>
<%= button_to filter_path(filter), method: :delete, class: "btn txt-x-small btn--reversed", form_class: "inline" do %>
<%= icon_tag "bookmark-outline" %>
<span class="for-screen-reader">Remove saved filter</span>
<% end %>
<% else %>
<% filter_params = filter.as_params.transform_values { |v| v.respond_to?(:to_str) ? v.to_str : v } %>
<%= button_to filters_path, method: :post, params: filter_params, class: "btn txt-x-small", form_class: "inline" do %>
<%= icon_tag "bookmark-outline" %>
<span class="for-screen-reader">Save filter</span>
<% end %>
<% end %>
<%= link_to cards_path(filter.as_params.except(:assignee_ids, :assignment_status, :card_ids, :creator_ids, :closer_ids, :stage_ids, :tag_ids, :terms, :indexed_by, :sorted_by, :creation, :closure)), class: "btn btn--remove txt-x-small" do %>
<%= icon_tag "close" %>
<span class="for-screen-reader">Clear all</span>
<% end %>
<% end %>
@@ -1,7 +1,7 @@
<% filter = user_filtering.filter %>
<% if user_filtering.show_sorted_by? %>
<div class="quick-filter position-relative <%= "default-value" if filter.sorted_by.latest? %>" data-controller="dialog" data-action="keydown.esc->dialog#close click@document->dialog#closeOnClickOutside">
<%= tag.div class: class_names("quick-filter position-relative", "default-value": filter.sorted_by.latest?),
data: { controller: "dialog", action: "keydown.esc->dialog#close click@document->dialog#closeOnClickOutside", filter_show: user_filtering.show_sorted_by? } do %>
<button class="btn input input--select flex-inline txt-x-small" data-action="click->dialog#open:stop">
<span class="overflow-ellipsis">
<%= sorted_by_label(filter.sorted_by) %>
@@ -21,9 +21,7 @@
<%= hidden_field_tag :sorted_by, sort %>
<% if user_filtering.expanded? %>
<%= hidden_field_tag :expand_all, user_filtering.expanded? %>
<% end %>
<%= hidden_field_tag :expand_all, true, disabled: !user_filtering.expanded?, data: { toggle_enable_target: "element" } %>
<%= form.button type: "submit", class: "popup__item btn" do %>
<span class="overflow-ellipsis flex-item-grow"><%= sorted_by_label(sort) %></span>
@@ -36,5 +34,4 @@
<% end %>
</ul>
<% end %>
</div>
<% end %>
+3 -6
View File
@@ -1,7 +1,7 @@
<% filter = user_filtering.filter %>
<% if user_filtering.show_tags? %>
<div class="quick-filter position-relative" data-controller="dialog" data-action="keydown.esc->dialog#close click@document->dialog#closeOnClickOutside">
<%= tag.div class: "quick-filter position-relative",
data: { controller: "dialog", action: "keydown.esc->dialog#close click@document->dialog#closeOnClickOutside", filter_show: user_filtering.show_tags? } do %>
<button class="btn input input--select flex-inline txt-x-small" data-action="click->dialog#open:stop">
<span class="overflow-ellipsis">
<% if filter.tags.any? %>
@@ -38,9 +38,7 @@
<%= hidden_field_tag "tag_ids[]", tag.id %>
<% end %>
<% if user_filtering.expanded? %>
<%= hidden_field_tag :expand_all, user_filtering.expanded? %>
<% end %>
<%= hidden_field_tag :expand_all, true, disabled: !user_filtering.expanded?, data: { toggle_enable_target: "element" } %>
<%= form.button type: "submit", class: "popup__item btn" do %>
<span class="overflow-ellipsis flex-item-grow"><%= tag.hashtag %></span>
@@ -53,5 +51,4 @@
<% end %>
</ul>
<% end %>
</div>
<% end %>
+3 -3
View File
@@ -1,5 +1,5 @@
<% filter = user_filtering.filter %>
<%= form_with url: cards_path, method: :get, class: "", data: { controller: "form" } do |form| %>
<%= form_with url: cards_path, method: :get, class: "", data: { controller: "form", turbo_frame: "card_columns", action: "input->form#debouncedSubmit" } do |form| %>
<% filter.as_params.except(:terms).each do |key, value| %>
<%= filter_hidden_field_tag key, value %>
<% end %>
@@ -12,8 +12,8 @@
<%= hidden_field_tag :expand_all, user_filtering.expanded? %>
<% end %>
<%= form.text_field "terms[]", placeholder: "Filter these cards…", class: "input txt-x-small filter__terms",
autofocus: false, autocomplete: :off, autocorrect: "off", data: { "1p-ignore": "true" } %>
<%= form.text_field "terms[]", placeholder: "Filter these cards…", class: "input txt-x-small filter__terms",
autofocus: false, autocomplete: :off, autocorrect: "off", data: { "1p-ignore": "true", action: "keydown.enter->form#submitToTopTarget" } %>
<% end %>
<% if filter.terms.present? %>
@@ -1,6 +1,6 @@
<% filter = user_filtering.filter %>
<% if filter.public_send("#{name}_window").present? %>
<div class="quick-filter position-relative" data-controller="dialog" data-action="keydown.esc->dialog#close click@document->dialog#closeOnClickOutside">
<%= tag.div class: "quick-filter position-relative",
data: { controller: "dialog", action: "keydown.esc->dialog#close click@document->dialog#closeOnClickOutside", filter_show: filter.public_send("#{name}_window").present? } do %>
<button class="btn input input--select flex-inline txt-x-small" data-action="click->dialog#open:stop">
<span class="overflow-ellipsis">
<%= "#{label} #{TimeWindowParser.human_name_for(filter.public_send(name))&.downcase}" %>
@@ -29,5 +29,4 @@
<% end %>
<% end %>
</dialog>
</div>
<% end %>
+4 -6
View File
@@ -1,13 +1,11 @@
<% filter = user_filtering.filter %>
<% if user_filtering.expanded? %>
<%= link_to cards_path(filter.as_params), class: "btn txt-x-small btn--reversed", aria: { selected: true } do %>
<button type="button" class="btn txt-x-small btn--reversed" aria-selected="true" aria-label="Close filter options" data-action="toggle-class#toggle toggle-enable#toggle">
<%= icon_tag "filter" %>
<span class="for-screen-reader">Close filter options</span>
<% end %>
</button>
<% else %>
<%= link_to cards_path(filter.as_params.merge(expand_all: true)), class: "btn txt-x-small" do %>
<button type="button" class="btn txt-x-small" aria-label="Expand filter options" data-action="toggle-class#toggle toggle-enable#toggle">
<%= icon_tag "filter" %>
<span class="for-screen-reader">Expand filter options</span>
<% end %>
</button>
<% end %>
+31
View File
@@ -0,0 +1,31 @@
<%= turbo_frame_tag "my_menu", target: "_top" do %>
<div class="flex gap">
<%= text_field_tag :search, nil,
type: "search",
role: "combobox",
placeholder: "Filter…",
class: "input input--transparent txt-small",
autofocus: true,
autocorrect: "off",
autocomplete: "off",
aria: { activedescendant: "" },
data: {
"1p-ignore": "true",
filter_target: "input",
navigable_list_target: "input",
action: "input->filter#filter" } %>
<button class="fizzy-menu__close btn borderless txt-small" data-action="dialog#close">
<%= icon_tag "close" %>
<span class="for-screen-reader">Close menu</span>
</button>
</div>
<%= render "filters/menu/hotkeys" %>
<%= render "filters/menu/custom", user_filtering: @user_filtering %>
<%= render "filters/menu/collections", user_filtering: @user_filtering %>
<%= render "filters/menu/tags", user_filtering: @user_filtering %>
<%= render "filters/menu/users", user_filtering: @user_filtering %>
<%= render "filters/menu/places", user_filtering: @user_filtering %>
<%= render "filters/menu/shortcut_notice" %>
<% end %>
+1
View File
@@ -124,6 +124,7 @@ Rails.application.routes.draw do
namespace :my do
resources :pins
resource :timezone
resource :menu
end
namespace :prompts do
@@ -1729,7 +1729,7 @@ http_interactions:
body:
encoding: UTF-8
base64_string: |
eyJtb2RlbCI6ImNoYXRncHQtNG8tbGF0ZXN0IiwibWVzc2FnZXMiOlt7InJv
eyJtb2RlbCI6ImdwdC01LWNoYXQtbGF0ZXN0IiwibWVzc2FnZXMiOlt7InJv
bGUiOiJkZXZlbG9wZXIiLCJjb250ZW50IjoiSGVscCBtZSBtYWtlIHNlbnNl
IG9mIHRoZSB3ZWVr4oCZcyBhY3Rpdml0eSBpbiBhIG5ld3Mgc3R5bGUgZm9y
bWF0IHdpdGggYm9sZCBoZWFkbGluZXMgYW5kIHNob3J0IHN1bW1hcmllcy5c
@@ -1859,44 +1859,32 @@ http_interactions:
ZWF0ZWQgYnk6IERhdmlkfVxuKiBDcmVhdGVkIGF0OiA8VElNRT59XG4qIFBh
dGg6IC83MzU0NjQ3ODUvY2FyZHMvOTc2OTA3MjM0I2NvbW1lbnRfODI3NDUw
Njg0XG5FTkQgT0YgQ09NTUVOVCA4Mjc0NTA2ODRcblxuRU5EIE9GIEVWRU5U
IDY1NDQ3NDk3M1xuXG5cbkJFR0lOIE9GIEVWRU5UIDY4NTg4OTI5M1xuIyMg
RXZlbnQgY2FyZF9hc3NpZ25lZCAoQ2FyZCA2MTMzMjUzMzQpKVxuXG4qIENy
ZWF0ZWQgYXQ6IDxUSU1FPlxuKiBDcmVhdGVkIGJ5OiBEYXZpZFxuXG5CRUdJ
TiBPRiBDQVJEIDYxMzMyNTMzNFxuXG4qKlRpdGxlOioqIFRoZSBsb2dvIGlz
bid0IGJpZyBlbm91Z2hcbioqRGVzY3JpcHRpb246KipcblxuXG5cbiMjIyMg
TWV0YWRhdGFcblxuKiBJZDogNjEzMzI1MzM0XG4qIENyZWF0ZWQgYnk6IERh
dmlkfVxuKiBBc3NpZ25lZCB0bzogS2V2aW4sIEpafVxuKiBXb3JrZmxvdyBz
dGFnZTogVHJpYWdlXG4qIENyZWF0ZWQgYXQ6IDxUSU1FPn1cbiogQ2xvc2Vk
OiBmYWxzZVxuKiBDbG9zZWQgYnk6IFxuKiBDbG9zZWQgYXQ6IFxuKiBDb2xs
IDY1NDQ3NDk3M1xuXG5cbkJFR0lOIE9GIEVWRU5UIDc4NDkzNzI0OFxuIyMg
RXZlbnQgY2FyZF9wdWJsaXNoZWQgKENhcmQgNzU2ODE1NjUyKSlcblxuKiBD
cmVhdGVkIGF0OiA8VElNRT5cbiogQ3JlYXRlZCBieTogS2V2aW5cblxuQkVH
SU4gT0YgQ0FSRCA3NTY4MTU2NTJcblxuKipUaXRsZToqKiBXZSBuZWVkIHRv
IHNoaXAgdGhlIGFwcFxuKipEZXNjcmlwdGlvbjoqKlxuXG5cblxuIyMjIyBN
ZXRhZGF0YVxuXG4qIElkOiA3NTY4MTU2NTJcbiogQ3JlYXRlZCBieTogS2V2
aW59XG4qIEFzc2lnbmVkIHRvOiB9XG4qIFdvcmtmbG93IHN0YWdlOiBUcmlh
Z2VcbiogQ3JlYXRlZCBhdDogPFRJTUU+fVxuKiBDbG9zZWQ6IHRydWVcbiog
Q2xvc2VkIGJ5OiBLZXZpblxuKiBDbG9zZWQgYXQ6IDxUSU1FPlxuKiBDb2xs
ZWN0aW9uIGlkOiA2OTMxNjk4NDBcbiogQ29sbGVjdGlvbiBuYW1lOiBXcml0
ZWJvb2tcbiogTnVtYmVyIG9mIGNvbW1lbnRzOiA1XG4qIFBhdGg6IC83MzU0
NjQ3ODUvY2FyZHMvNjEzMzI1MzM0XG5cbkVORCBPRiBDQVJEIDYxMzMyNTMz
NFxuXG5FTkQgT0YgRVZFTlQgNjg1ODg5MjkzXG5cblxuQkVHSU4gT0YgRVZF
TlQgNzg0OTM3MjQ4XG4jIyBFdmVudCBjYXJkX3B1Ymxpc2hlZCAoQ2FyZCA3
NTY4MTU2NTIpKVxuXG4qIENyZWF0ZWQgYXQ6IDxUSU1FPlxuKiBDcmVhdGVk
IGJ5OiBLZXZpblxuXG5CRUdJTiBPRiBDQVJEIDc1NjgxNTY1MlxuXG4qKlRp
dGxlOioqIFdlIG5lZWQgdG8gc2hpcCB0aGUgYXBwXG4qKkRlc2NyaXB0aW9u
OioqXG5cblxuXG4jIyMjIE1ldGFkYXRhXG5cbiogSWQ6IDc1NjgxNTY1Mlxu
KiBDcmVhdGVkIGJ5OiBLZXZpbn1cbiogQXNzaWduZWQgdG86IH1cbiogV29y
a2Zsb3cgc3RhZ2U6IFRyaWFnZVxuKiBDcmVhdGVkIGF0OiA8VElNRT59XG4q
IENsb3NlZDogdHJ1ZVxuKiBDbG9zZWQgYnk6IEtldmluXG4qIENsb3NlZCBh
dDogPFRJTUU+XG4qIENvbGxlY3Rpb24gaWQ6IDY5MzE2OTg0MFxuKiBDb2xs
ZWN0aW9uIG5hbWU6IFdyaXRlYm9va1xuKiBOdW1iZXIgb2YgY29tbWVudHM6
IDFcbiogUGF0aDogLzczNTQ2NDc4NS9jYXJkcy83NTY4MTU2NTJcblxuRU5E
IE9GIENBUkQgNzU2ODE1NjUyXG5cbkVORCBPRiBFVkVOVCA3ODQ5MzcyNDhc
blxuXG5CRUdJTiBPRiBFVkVOVCA3OTg4NTMyOTFcbiMjIEV2ZW50IGNhcmRf
Y2xvc2VkIChDYXJkIDc1NjgxNTY1MikpXG5cbiogQ3JlYXRlZCBhdDogPFRJ
TUU+XG4qIENyZWF0ZWQgYnk6IEtldmluXG5cbkJFR0lOIE9GIENBUkQgNzU2
ODE1NjUyXG5cbioqVGl0bGU6KiogV2UgbmVlZCB0byBzaGlwIHRoZSBhcHBc
bioqRGVzY3JpcHRpb246KipcblxuXG5cbiMjIyMgTWV0YWRhdGFcblxuKiBJ
ZDogNzU2ODE1NjUyXG4qIENyZWF0ZWQgYnk6IEtldmlufVxuKiBBc3NpZ25l
ZCB0bzogfVxuKiBXb3JrZmxvdyBzdGFnZTogVHJpYWdlXG4qIENyZWF0ZWQg
YXQ6IDxUSU1FPn1cbiogQ2xvc2VkOiB0cnVlXG4qIENsb3NlZCBieTogS2V2
aW5cbiogQ2xvc2VkIGF0OiA8VElNRT5cbiogQ29sbGVjdGlvbiBpZDogNjkz
MTY5ODQwXG4qIENvbGxlY3Rpb24gbmFtZTogV3JpdGVib29rXG4qIE51bWJl
ciBvZiBjb21tZW50czogMVxuKiBQYXRoOiAvNzM1NDY0Nzg1L2NhcmRzLzc1
NjgxNTY1MlxuXG5FTkQgT0YgQ0FSRCA3NTY4MTU2NTJcblxuRU5EIE9GIEVW
RU5UIDc5ODg1MzI5MVxuIn1dLCJzdHJlYW0iOmZhbHNlfQ==
ZWJvb2tcbiogTnVtYmVyIG9mIGNvbW1lbnRzOiAxXG4qIFBhdGg6IC83MzU0
NjQ3ODUvY2FyZHMvNzU2ODE1NjUyXG5cbkVORCBPRiBDQVJEIDc1NjgxNTY1
MlxuXG5FTkQgT0YgRVZFTlQgNzg0OTM3MjQ4XG5cblxuQkVHSU4gT0YgRVZF
TlQgNzk4ODUzMjkxXG4jIyBFdmVudCBjYXJkX2Nsb3NlZCAoQ2FyZCA3NTY4
MTU2NTIpKVxuXG4qIENyZWF0ZWQgYXQ6IDxUSU1FPlxuKiBDcmVhdGVkIGJ5
OiBLZXZpblxuXG5CRUdJTiBPRiBDQVJEIDc1NjgxNTY1MlxuXG4qKlRpdGxl
OioqIFdlIG5lZWQgdG8gc2hpcCB0aGUgYXBwXG4qKkRlc2NyaXB0aW9uOioq
XG5cblxuXG4jIyMjIE1ldGFkYXRhXG5cbiogSWQ6IDc1NjgxNTY1MlxuKiBD
cmVhdGVkIGJ5OiBLZXZpbn1cbiogQXNzaWduZWQgdG86IH1cbiogV29ya2Zs
b3cgc3RhZ2U6IFRyaWFnZVxuKiBDcmVhdGVkIGF0OiA8VElNRT59XG4qIENs
b3NlZDogdHJ1ZVxuKiBDbG9zZWQgYnk6IEtldmluXG4qIENsb3NlZCBhdDog
PFRJTUU+XG4qIENvbGxlY3Rpb24gaWQ6IDY5MzE2OTg0MFxuKiBDb2xsZWN0
aW9uIG5hbWU6IFdyaXRlYm9va1xuKiBOdW1iZXIgb2YgY29tbWVudHM6IDFc
biogUGF0aDogLzczNTQ2NDc4NS9jYXJkcy83NTY4MTU2NTJcblxuRU5EIE9G
IENBUkQgNzU2ODE1NjUyXG5cbkVORCBPRiBFVkVOVCA3OTg4NTMyOTFcbiJ9
XSwic3RyZWFtIjpmYWxzZSwidGVtcGVyYXR1cmUiOjEuMH0=
headers:
User-Agent:
- Faraday v2.13.4
@@ -1914,7 +1902,7 @@ http_interactions:
message: OK
headers:
Date:
- Fri, 12 Sep 2025 03:30:59 GMT
- Fri, 12 Sep 2025 14:15:49 GMT
Content-Type:
- application/json
Transfer-Encoding:
@@ -1926,13 +1914,13 @@ http_interactions:
Openai-Organization:
- 37signals-u7qhwk
Openai-Processing-Ms:
- '3987'
- '8045'
Openai-Project:
- proj_M0FFIqFFeNEpzhhgv64oFzt1
Openai-Version:
- '2020-10-01'
X-Envoy-Upstream-Service-Time:
- '4209'
- '8283'
X-Ratelimit-Limit-Requests:
- '10000'
X-Ratelimit-Limit-Tokens:
@@ -1940,22 +1928,22 @@ http_interactions:
X-Ratelimit-Remaining-Requests:
- '9999'
X-Ratelimit-Remaining-Tokens:
- '1998136'
- '1998276'
X-Ratelimit-Reset-Requests:
- 6ms
X-Ratelimit-Reset-Tokens:
- 55ms
- 51ms
X-Request-Id:
- req_439b083d1b744f54b72242b78b9d9695
- req_9fcc0274981d444589a747269119a800
X-Openai-Proxy-Wasm:
- v0.1
Cf-Cache-Status:
- DYNAMIC
Set-Cookie:
- __cf_bm=dqB827yhmb3VqYo2CoYzbd9.eR8aDji.EVwvmFly6ck-1757647859-1.0.1.1-xrLw_6BGAGnsW478L5k5CSCFLe2SHtjGABV6_BBARfUtlW2OTBVI.fCGbxudDK0a8_PB.jJ79VBkH6GykYJyNsGznDc1YPES2.UWH2abfps;
path=/; expires=Fri, 12-Sep-25 04:00:59 GMT; domain=.api.openai.com; HttpOnly;
- __cf_bm=hqyao17fea43HoXZnu1jLz1F_uakUl3i.84V5Qsw5gk-1757686549-1.0.1.1-o.86mq2_fjAY3YLZ5Eqv3QTfMDt0VFUYA3JlEz6vCAqU2rSnNfsQXe.q_zGWOy_vvmm.0rjO7zj3ilhp2NULoB_Jop_M5qSV4PiI3OSIOOM;
path=/; expires=Fri, 12-Sep-25 14:45:49 GMT; domain=.api.openai.com; HttpOnly;
Secure; SameSite=None
- _cfuvid=mJPvZzCW9K1WvBeZvXdGHDeFd.FJVGTpKMGZDMJXbsk-1757647859091-0.0.1.1-604800000;
- _cfuvid=E4gVEEVIiMLP.RMQBqJU0db1MKBKZeOwWFcbJ4jSGsM-1757686549860-0.0.1.1-604800000;
path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None
Strict-Transport-Security:
- max-age=31536000; includeSubDomains; preload
@@ -1964,78 +1952,71 @@ http_interactions:
Server:
- cloudflare
Cf-Ray:
- 97dc54349a08c871-DFW
- 97e004b01e01471a-MAD
Alt-Svc:
- h3=":443"; ma=86400
body:
encoding: ASCII-8BIT
base64_string: |
ewogICJpZCI6ICJjaGF0Y21wbC1DRW9tdElsQThqWEVwRHZYd2F5dHVnUjRy
eTUwTiIsCiAgIm9iamVjdCI6ICJjaGF0LmNvbXBsZXRpb24iLAogICJjcmVh
dGVkIjogMTc1NzY0Nzg1NSwKICAibW9kZWwiOiAiY2hhdGdwdC00by1sYXRl
ewogICJpZCI6ICJjaGF0Y21wbC1DRXlxcmRLckkyekxKSVZvSUN3Ym12ZFJ0
UUtLUSIsCiAgIm9iamVjdCI6ICJjaGF0LmNvbXBsZXRpb24iLAogICJjcmVh
dGVkIjogMTc1NzY4NjU0MSwKICAibW9kZWwiOiAiZ3B0LTUtY2hhdC1sYXRl
c3QiLAogICJjaG9pY2VzIjogWwogICAgewogICAgICAiaW5kZXgiOiAwLAog
ICAgICAibWVzc2FnZSI6IHsKICAgICAgICAicm9sZSI6ICJhc3Npc3RhbnQi
LAogICAgICAgICJjb250ZW50IjogIiMjIyBWaXN1YWwgVHJvdWJsZXMgVGFr
ZSBDZW50ZXIgU3RhZ2VcblxuVGhpcyB3ZWVrIGluIHRoZSBXcml0ZWJvb2sg
Y29sbGVjdGlvbiwgYSBmbHVycnkgb2YgdmlzdWFsIGlzc3VlcyBzdG9sZSB0
aGUgc3BvdGxpZ2h0IOKAlCBmcm9tIGxvZ29zIGJlaW5nIHRvbyBzbWFsbCB0
byB0ZXh0IG92ZXJmbG93aW5nIGNvbnRhaW5lcnMuIEEgaGFuZGZ1bCBvZiBk
ZXNpZ24tcmVsYXRlZCBidWdzIHdlcmUgZmxhZ2dlZCwgYXNzaWduZWQsIGFu
ZCBkaXNjdXNzZWQsIHBvaW50aW5nIHRvIGEgcHVzaCB0b3dhcmQgaW50ZXJm
YWNlIHBvbGlzaC4gTWVhbndoaWxlLCBvbmUga2V5IGRlbGl2ZXJhYmxlIHdh
cyBjbG9zZWQgb3V0OiBzaGlwcGluZyB0aGUgYXBwLlxuXG4jIyMjIFwiVGhl
IGxvZ28gaXNuJ3QgYmlnIGVub3VnaFwiIGtlZXBzIGNpcmN1bGF0aW5nXG5E
YXZpZCBwdWJsaXNoZWQgYW5kIHJlcGVhdGVkbHkgcmVhc3NpZ25lZCB0aGUg
W2xvZ28gc2l6aW5nIGlzc3VlXSgvNzM1NDY0Nzg1L2NhcmRzLzYxMzMyNTMz
NCkgdG8gYm90aCBLZXZpbiBhbmQgSlogYWNyb3NzIG11bHRpcGxlIGRheXMu
IERlc3BpdGUgc2V2ZXJhbCBjb21tZW50cyBhbmQgdG91Y2hlcywgaXQgcmVt
YWlucyBvcGVuIGluIHRyaWFnZSDigJQgc3VnZ2VzdGluZyBhbiB1bnJlc29s
dmVkIGhvdCBwb3RhdG8uXG5cbiMjIyMgTGF5b3V0IHdvZXMgcmFpc2VkIGFu
ZCB1bmRlciByZXZpZXdcbkRhdmlkIGZsYWdnZWQgdGhlIFtsYXlvdXQgYnVn
XSgvNzM1NDY0Nzg1L2NhcmRzLzk3NjkwNzIzNCkgYW5kIGxhdGVyIG5vdGVk
IHRoYXQgXCJ0aGUgdGV4dCBpcyBvdmVyZmxvd2luZyB0aGUgY29udGFpbmVy
LlwiIEl0J3MgY3VycmVudGx5IGFzc2lnbmVkIHRvIEpaIGFuZCByZW1haW5z
IG9wZW4gZm9yIG5vdywgYnV0IGl04oCZcyBjbGVhcmx5IG9uIHRoZSByYWRh
ciB3aXRoIHR3byBjb21tZW50cyBhbmQgRGF2aWTigJlzIGxhdGVzdCBudWRn
ZS5cblxuIyMjIyBGb250IHNpemUgY29uY2VybnMgYWRkZWQgdG8gdGhlIG1p
eFxuS2V2aW4gY29udHJpYnV0ZWQgYSBjb25jZXJuIG9mIGhpcyBvd24gd2l0
aCBhIG5ldyBjYXJkIHN0YXRpbmcgW+KAnHRoZSB0ZXh0IGlzIHRvbyBzbWFs
bOKAnV0oLzczNTQ2NDc4NS9jYXJkcy85OTkwMDgxOTkpLiBUaG91Z2ggdGhl
cmXigJlzIGJlZW4gbGl0dGxlIGFjdGl2aXR5IHNpbmNlIGNyZWF0aW9uLCBp
dOKAmXMgbWFya2VkIGFzIOKAnGluIHByb2dyZXNz4oCdIOKAlCBhIHBvc3Np
YmxlIGluZGljYXRpb24gdGhhdCBzb21lb25l4oCZcyBhbHJlYWR5IHdvcmtp
bmcgb24gdGhlIGZpeC5cblxuIyMjIyBUaGUgYXBwIGlzIHJlYWR5IHRvIGdv
XG5BIG1pbGVzdG9uZSB3YXMgaGl0IHRoaXMgd2VlayB3aGVuIEtldmluIGNs
b3NlZCB0aGUgY2FyZCBzYXlpbmcgW+KAnFdlIG5lZWQgdG8gc2hpcCB0aGUg
YXBw4oCdXSgvNzM1NDY0Nzg1L2NhcmRzLzc1NjgxNTY1MikuIEl0IHdhcyBv
cmlnaW5hbGx5IGNyZWF0ZWQgb24gdGhlIDV0aCBhbmQgbWFya2VkIGNvbXBs
ZXRlIGp1c3QgYSB3ZWVrIGxhdGVyIOKAlCBzb2xpZCBleGVjdXRpb24gb24g
YSBjcml0aWNhbCBnb2FsLlxuXG4jIyMjIFB1Ymxpc2hlZCBjYXJkcyBoaWdo
bGlnaHQgdmlzdWFsIFFBIHB1c2hcbkluIHRvdGFsLCBmb3VyIG5ldyBjYXJk
cyB3ZXJlIFtwdWJsaXNoZWQgaW4gdGhlIFdyaXRlYm9vayBjb2xsZWN0aW9u
XSgvNzM1NDY0Nzg1L2NhcmRzP2NvbGxlY3Rpb25faWRzW109NjkzMTY5ODQw
KSwgYW5kIGFsbCBvZiB0aGVtIHdlcmUgYWJvdXQgZGVzaWduLXJlbGF0ZWQg
aXNzdWVzIG9yIGZyb250ZW5kIGJsb2NraW5nIHRhc2tzLiBJdOKAmXMgY2xl
YXIgdGhlIHRlYW0gaXMgaGVhZHMtZG93biBvbiBVSSBjbGVhbnVwLlxuXG4j
IyMjIFJlYXNzaWdubWVudHMgc2hvdyBpbmRlY2lzaW9uIChvciBhY3RpdmUg
cmViYWxhbmNpbmcpXG5BIHN1cnByaXNpbmcgbnVtYmVyIG9mIHJlYXNzaWdu
bWVudHMgaGFwcGVuZWQgb24gdGhlIHNhbWUgb3BlbiBpc3N1ZXMg4oCUIHBh
cnRpY3VsYXJseSB0aGUgbG9nbyBzaXppbmcgb25lLiBJdCBtaWdodCBzaWdu
YWwgYW4gb3duZXJzaGlwIGdhcCBvciBqdXN0IGZpbmUtdHVuaW5nIHJlc291
cmNpbmcgYWNyb3NzIEtldmluIGFuZCBKWi4gRWl0aGVyIHdheSwgdGhlc2Ug
dGFza3MgYXJlbuKAmXQgZ29pbmcgcXVpZXRseS4iLAogICAgICAgICJyZWZ1
c2FsIjogbnVsbCwKICAgICAgICAiYW5ub3RhdGlvbnMiOiBbXQogICAgICB9
LAogICAgICAibG9ncHJvYnMiOiBudWxsLAogICAgICAiZmluaXNoX3JlYXNv
biI6ICJzdG9wIgogICAgfQogIF0sCiAgInVzYWdlIjogewogICAgInByb21w
dF90b2tlbnMiOiAyMzAwLAogICAgImNvbXBsZXRpb25fdG9rZW5zIjogNDU4
LAogICAgInRvdGFsX3Rva2VucyI6IDI3NTgsCiAgICAicHJvbXB0X3Rva2Vu
c19kZXRhaWxzIjogewogICAgICAiY2FjaGVkX3Rva2VucyI6IDAsCiAgICAg
ICJhdWRpb190b2tlbnMiOiAwCiAgICB9LAogICAgImNvbXBsZXRpb25fdG9r
ZW5zX2RldGFpbHMiOiB7CiAgICAgICJyZWFzb25pbmdfdG9rZW5zIjogMCwK
ICAgICAgImF1ZGlvX3Rva2VucyI6IDAsCiAgICAgICJhY2NlcHRlZF9wcmVk
aWN0aW9uX3Rva2VucyI6IDAsCiAgICAgICJyZWplY3RlZF9wcmVkaWN0aW9u
X3Rva2VucyI6IDAKICAgIH0KICB9LAogICJzZXJ2aWNlX3RpZXIiOiAiZGVm
YXVsdCIsCiAgInN5c3RlbV9maW5nZXJwcmludCI6ICJmcF9kM2EwODM4ZmI4
Igp9Cg==
recorded_at: Fri, 12 Sep 2025 03:30:59 GMT
LAogICAgICAgICJjb250ZW50IjogIiMjIyBWaXN1YWwgRml4ZXMgVGFrZSB0
aGUgU3BvdGxpZ2h0ICBcblRoaXMgd2Vla+KAmXMgYWN0aXZpdHkgcmV2b2x2
ZWQgYXJvdW5kIGRlc2lnbiBkZXRhaWxz4oCUbG9nb3MsIHRleHQgc2l6aW5n
LCBhbmQgbGF5b3V0IGlzc3VlcyBkb21pbmF0ZWQgdGhlIGNvbnZlcnNhdGlv
biwgd2hpbGUgb25lIGJpZyBtaWxlc3RvbmUgc3Rvb2Qgb3V0OiBhY3R1YWxs
eSBjbG9zaW5nIHRoZSDigJxzaGlwIHRoZSBhcHDigJ0gdGFzay4gSXQgZmVl
bHMgbGlrZSBldmVyeW9uZeKAmXMgYmVlbiBjaXJjbGluZyBhcm91bmQgcG9s
aXNoaW5nIHRoZSBwcmVzZW50YXRpb24gd2hpbGUgbnVkZ2luZyBjb3JlIHBy
b2dyZXNzIGZvcndhcmQuICBcblxuIyMjIyBMb2dvIERlYmF0ZSBHZXRzIEFz
c2lnbm1lbnRzICBcbkRhdmlkIHJhaXNlZCBb4oCcVGhlIGxvZ28gaXNu4oCZ
dCBiaWcgZW5vdWdo4oCdXSgvNzM1NDY0Nzg1L2NhcmRzLzYxMzMyNTMzNCks
IGFuZCBpdCBxdWlja2x5IGRyZXcgYXR0ZW50aW9uLCBiZWluZyBhc3NpZ25l
ZCB0byBib3RoIEtldmluIGFuZCBKWi4gV2l0aCBmaXZlIGNvbW1lbnRzIGFs
cmVhZHksIGl04oCZcyBzaGFwaW5nIHVwIHRvIGJlIGEgbGl2ZWx5IGJhY2st
YW5kLWZvcnRoLiAgXG5cbiMjIyMgTGF5b3V0IFRyb3VibGUgU3ByZWFkcyBE
aXNjdXNzaW9uICBcblRoZSBb4oCcTGF5b3V0IGlzIGJyb2tlbuKAnV0oLzcz
NTQ2NDc4NS9jYXJkcy85NzY5MDcyMzQpIGlzc3VlIGFsc28gbWFkZSBub2lz
ZSB0aGlzIHdlZWsuIEFzc2lnbmVkIHRvIEpaIGFuZCBhY2NvbXBhbmllZCBi
eSBhIGNvbW1lbnQgcG9pbnRpbmcgb3V0IHRleHQgb3ZlcmZsb3csIGl0IGhp
Z2hsaWdodHMgdGhhdCBkZXNpZ24gYnVncyBhcmUgc3RhY2tpbmcgdXAuICBc
blxuIyMjIyBUZXh0IFNpemUgQ29uY2VybnMgUmFpc2VkICBcbktldmluIGZs
YWdnZWQgW+KAnFRoZSB0ZXh0IGlzIHRvbyBzbWFsbOKAnV0oLzczNTQ2NDc4
NS9jYXJkcy85OTkwMDgxOTkpLCB3aGljaCBzaXRzIGluIOKAnEluIHByb2dy
ZXNzLuKAnSBJdCBkaWRu4oCZdCBzdGlyIG11Y2ggY29udmVyc2F0aW9uIHll
dCwgYnV0IGl04oCZcyBhbm90aGVyIGV4YW1wbGUgb2YgdGhlIG92ZXJhbGwg
dGhlbWU6IHZpc3VhbHMgbmVlZCBmaW5lLXR1bmluZy4gIFxuXG4jIyMjIFBh
cmFsbGVsIEFzc2lnbm1lbnRzIG9uIExvZ28gSXNzdWUgIFxuRGF2aWQgYXNz
aWduZWQgdGhlIGxvZ28gaXNzdWUgdHdpY2Ugb3ZlciB0aGUgd2Vlaywgc3Vn
Z2VzdGluZyBzb21lIHVuY2VydGFpbnR5IG9yIGV4dHJhIHVyZ2VuY3kgaW4g
bWFraW5nIHN1cmUgYm90aCBLZXZpbiBhbmQgSlogdGFja2xlIGl0LiAgXG5c
biMjIyMgU2hpcHBpbmcgTWlsZXN0b25lIENsb3NlZCBPdXQgIFxuQW1vbmcg
YWxsIHRoZSBuaXRwaWNraW5nIG92ZXIgZGVzaWduLCBhIGJpZ2dlciB0YXNr
IHdyYXBwZWQgdXDigJRLZXZpbiBvcGVuZWQgYW5kIHRoZW4gY2xvc2VkIFvi
gJxXZSBuZWVkIHRvIHNoaXAgdGhlIGFwcOKAnV0oLzczNTQ2NDc4NS9jYXJk
cy83NTY4MTU2NTIpLiBUaGF04oCZcyBhIGNvbmNyZXRlIG1pbGVzdG9uZSwg
ZXZlbiBpZiB0aGUgcG9saXNoIHN0aWxsIGxhZ3MuICBcblxuIyMjIyBDb21t
ZW50cyBQaW5wb2ludCBTcGVjaWZpYyBQcm9ibGVtcyAgXG5UaGUgc3RhbmRv
dXQgY29tbWVudCB0aGlzIHdlZWsgY2FtZSBvbiB0aGUgbGF5b3V0IGNhcmQs
IG5vdGluZyB0ZXh0IG92ZXJmbG93LiBDb21iaW5lZCB3aXRoIHRoZSBsb2dv
IGFuZCB0ZXh0IHNpemUgY29tcGxhaW50cywgaXQgdW5kZXJzY29yZXMgYSB0
aGVtZTogdGhlIGRlc2lnbiBmcmFtZXdvcmsgbWlnaHQgbmVlZCBicm9hZGVy
IHRpZ2h0ZW5pbmcsIG5vdCBqdXN0IHBpZWNlbWVhbCBmaXhlcy4gICIsCiAg
ICAgICAgInJlZnVzYWwiOiBudWxsLAogICAgICAgICJhbm5vdGF0aW9ucyI6
IFtdCiAgICAgIH0sCiAgICAgICJsb2dwcm9icyI6IG51bGwsCiAgICAgICJm
aW5pc2hfcmVhc29uIjogInN0b3AiCiAgICB9CiAgXSwKICAidXNhZ2UiOiB7
CiAgICAicHJvbXB0X3Rva2VucyI6IDIxMTQsCiAgICAiY29tcGxldGlvbl90
b2tlbnMiOiAzOTcsCiAgICAidG90YWxfdG9rZW5zIjogMjUxMSwKICAgICJw
cm9tcHRfdG9rZW5zX2RldGFpbHMiOiB7CiAgICAgICJjYWNoZWRfdG9rZW5z
IjogMjA0OCwKICAgICAgImF1ZGlvX3Rva2VucyI6IDAKICAgIH0sCiAgICAi
Y29tcGxldGlvbl90b2tlbnNfZGV0YWlscyI6IHsKICAgICAgInJlYXNvbmlu
Z190b2tlbnMiOiAwLAogICAgICAiYXVkaW9fdG9rZW5zIjogMCwKICAgICAg
ImFjY2VwdGVkX3ByZWRpY3Rpb25fdG9rZW5zIjogMCwKICAgICAgInJlamVj
dGVkX3ByZWRpY3Rpb25fdG9rZW5zIjogMAogICAgfQogIH0sCiAgInNlcnZp
Y2VfdGllciI6ICJkZWZhdWx0IiwKICAic3lzdGVtX2ZpbmdlcnByaW50Ijog
ImZwXzllODIyZDUyMWQiCn0K
recorded_at: Fri, 12 Sep 2025 14:15:49 GMT
recorded_with: VCR 6.3.1
@@ -1608,7 +1608,7 @@ http_interactions:
body:
encoding: UTF-8
base64_string: |
eyJtb2RlbCI6ImNoYXRncHQtNG8tbGF0ZXN0IiwibWVzc2FnZXMiOlt7InJv
eyJtb2RlbCI6ImdwdC01LWNoYXQtbGF0ZXN0IiwibWVzc2FnZXMiOlt7InJv
bGUiOiJkZXZlbG9wZXIiLCJjb250ZW50IjoiSGVscCBtZSBtYWtlIHNlbnNl
IG9mIHRoZSB3ZWVr4oCZcyBhY3Rpdml0eSBpbiBhIG5ld3Mgc3R5bGUgZm9y
bWF0IHdpdGggYm9sZCBoZWFkbGluZXMgYW5kIHNob3J0IHN1bW1hcmllcy5c
@@ -1738,44 +1738,32 @@ http_interactions:
ZWF0ZWQgYnk6IERhdmlkfVxuKiBDcmVhdGVkIGF0OiA8VElNRT59XG4qIFBh
dGg6IC83MzU0NjQ3ODUvY2FyZHMvOTc2OTA3MjM0I2NvbW1lbnRfODI3NDUw
Njg0XG5FTkQgT0YgQ09NTUVOVCA4Mjc0NTA2ODRcblxuRU5EIE9GIEVWRU5U
IDY1NDQ3NDk3M1xuXG5cbkJFR0lOIE9GIEVWRU5UIDY4NTg4OTI5M1xuIyMg
RXZlbnQgY2FyZF9hc3NpZ25lZCAoQ2FyZCA2MTMzMjUzMzQpKVxuXG4qIENy
ZWF0ZWQgYXQ6IDxUSU1FPlxuKiBDcmVhdGVkIGJ5OiBEYXZpZFxuXG5CRUdJ
TiBPRiBDQVJEIDYxMzMyNTMzNFxuXG4qKlRpdGxlOioqIFRoZSBsb2dvIGlz
bid0IGJpZyBlbm91Z2hcbioqRGVzY3JpcHRpb246KipcblxuXG5cbiMjIyMg
TWV0YWRhdGFcblxuKiBJZDogNjEzMzI1MzM0XG4qIENyZWF0ZWQgYnk6IERh
dmlkfVxuKiBBc3NpZ25lZCB0bzogS2V2aW4sIEpafVxuKiBXb3JrZmxvdyBz
dGFnZTogVHJpYWdlXG4qIENyZWF0ZWQgYXQ6IDxUSU1FPn1cbiogQ2xvc2Vk
OiBmYWxzZVxuKiBDbG9zZWQgYnk6IFxuKiBDbG9zZWQgYXQ6IFxuKiBDb2xs
IDY1NDQ3NDk3M1xuXG5cbkJFR0lOIE9GIEVWRU5UIDc4NDkzNzI0OFxuIyMg
RXZlbnQgY2FyZF9wdWJsaXNoZWQgKENhcmQgNzU2ODE1NjUyKSlcblxuKiBD
cmVhdGVkIGF0OiA8VElNRT5cbiogQ3JlYXRlZCBieTogS2V2aW5cblxuQkVH
SU4gT0YgQ0FSRCA3NTY4MTU2NTJcblxuKipUaXRsZToqKiBXZSBuZWVkIHRv
IHNoaXAgdGhlIGFwcFxuKipEZXNjcmlwdGlvbjoqKlxuXG5cblxuIyMjIyBN
ZXRhZGF0YVxuXG4qIElkOiA3NTY4MTU2NTJcbiogQ3JlYXRlZCBieTogS2V2
aW59XG4qIEFzc2lnbmVkIHRvOiB9XG4qIFdvcmtmbG93IHN0YWdlOiBUcmlh
Z2VcbiogQ3JlYXRlZCBhdDogPFRJTUU+fVxuKiBDbG9zZWQ6IHRydWVcbiog
Q2xvc2VkIGJ5OiBLZXZpblxuKiBDbG9zZWQgYXQ6IDxUSU1FPlxuKiBDb2xs
ZWN0aW9uIGlkOiA2OTMxNjk4NDBcbiogQ29sbGVjdGlvbiBuYW1lOiBXcml0
ZWJvb2tcbiogTnVtYmVyIG9mIGNvbW1lbnRzOiA1XG4qIFBhdGg6IC83MzU0
NjQ3ODUvY2FyZHMvNjEzMzI1MzM0XG5cbkVORCBPRiBDQVJEIDYxMzMyNTMz
NFxuXG5FTkQgT0YgRVZFTlQgNjg1ODg5MjkzXG5cblxuQkVHSU4gT0YgRVZF
TlQgNzg0OTM3MjQ4XG4jIyBFdmVudCBjYXJkX3B1Ymxpc2hlZCAoQ2FyZCA3
NTY4MTU2NTIpKVxuXG4qIENyZWF0ZWQgYXQ6IDxUSU1FPlxuKiBDcmVhdGVk
IGJ5OiBLZXZpblxuXG5CRUdJTiBPRiBDQVJEIDc1NjgxNTY1MlxuXG4qKlRp
dGxlOioqIFdlIG5lZWQgdG8gc2hpcCB0aGUgYXBwXG4qKkRlc2NyaXB0aW9u
OioqXG5cblxuXG4jIyMjIE1ldGFkYXRhXG5cbiogSWQ6IDc1NjgxNTY1Mlxu
KiBDcmVhdGVkIGJ5OiBLZXZpbn1cbiogQXNzaWduZWQgdG86IH1cbiogV29y
a2Zsb3cgc3RhZ2U6IFRyaWFnZVxuKiBDcmVhdGVkIGF0OiA8VElNRT59XG4q
IENsb3NlZDogdHJ1ZVxuKiBDbG9zZWQgYnk6IEtldmluXG4qIENsb3NlZCBh
dDogPFRJTUU+XG4qIENvbGxlY3Rpb24gaWQ6IDY5MzE2OTg0MFxuKiBDb2xs
ZWN0aW9uIG5hbWU6IFdyaXRlYm9va1xuKiBOdW1iZXIgb2YgY29tbWVudHM6
IDFcbiogUGF0aDogLzczNTQ2NDc4NS9jYXJkcy83NTY4MTU2NTJcblxuRU5E
IE9GIENBUkQgNzU2ODE1NjUyXG5cbkVORCBPRiBFVkVOVCA3ODQ5MzcyNDhc
blxuXG5CRUdJTiBPRiBFVkVOVCA3OTg4NTMyOTFcbiMjIEV2ZW50IGNhcmRf
Y2xvc2VkIChDYXJkIDc1NjgxNTY1MikpXG5cbiogQ3JlYXRlZCBhdDogPFRJ
TUU+XG4qIENyZWF0ZWQgYnk6IEtldmluXG5cbkJFR0lOIE9GIENBUkQgNzU2
ODE1NjUyXG5cbioqVGl0bGU6KiogV2UgbmVlZCB0byBzaGlwIHRoZSBhcHBc
bioqRGVzY3JpcHRpb246KipcblxuXG5cbiMjIyMgTWV0YWRhdGFcblxuKiBJ
ZDogNzU2ODE1NjUyXG4qIENyZWF0ZWQgYnk6IEtldmlufVxuKiBBc3NpZ25l
ZCB0bzogfVxuKiBXb3JrZmxvdyBzdGFnZTogVHJpYWdlXG4qIENyZWF0ZWQg
YXQ6IDxUSU1FPn1cbiogQ2xvc2VkOiB0cnVlXG4qIENsb3NlZCBieTogS2V2
aW5cbiogQ2xvc2VkIGF0OiA8VElNRT5cbiogQ29sbGVjdGlvbiBpZDogNjkz
MTY5ODQwXG4qIENvbGxlY3Rpb24gbmFtZTogV3JpdGVib29rXG4qIE51bWJl
ciBvZiBjb21tZW50czogMVxuKiBQYXRoOiAvNzM1NDY0Nzg1L2NhcmRzLzc1
NjgxNTY1MlxuXG5FTkQgT0YgQ0FSRCA3NTY4MTU2NTJcblxuRU5EIE9GIEVW
RU5UIDc5ODg1MzI5MVxuIn1dLCJzdHJlYW0iOmZhbHNlfQ==
ZWJvb2tcbiogTnVtYmVyIG9mIGNvbW1lbnRzOiAxXG4qIFBhdGg6IC83MzU0
NjQ3ODUvY2FyZHMvNzU2ODE1NjUyXG5cbkVORCBPRiBDQVJEIDc1NjgxNTY1
MlxuXG5FTkQgT0YgRVZFTlQgNzg0OTM3MjQ4XG5cblxuQkVHSU4gT0YgRVZF
TlQgNzk4ODUzMjkxXG4jIyBFdmVudCBjYXJkX2Nsb3NlZCAoQ2FyZCA3NTY4
MTU2NTIpKVxuXG4qIENyZWF0ZWQgYXQ6IDxUSU1FPlxuKiBDcmVhdGVkIGJ5
OiBLZXZpblxuXG5CRUdJTiBPRiBDQVJEIDc1NjgxNTY1MlxuXG4qKlRpdGxl
OioqIFdlIG5lZWQgdG8gc2hpcCB0aGUgYXBwXG4qKkRlc2NyaXB0aW9uOioq
XG5cblxuXG4jIyMjIE1ldGFkYXRhXG5cbiogSWQ6IDc1NjgxNTY1MlxuKiBD
cmVhdGVkIGJ5OiBLZXZpbn1cbiogQXNzaWduZWQgdG86IH1cbiogV29ya2Zs
b3cgc3RhZ2U6IFRyaWFnZVxuKiBDcmVhdGVkIGF0OiA8VElNRT59XG4qIENs
b3NlZDogdHJ1ZVxuKiBDbG9zZWQgYnk6IEtldmluXG4qIENsb3NlZCBhdDog
PFRJTUU+XG4qIENvbGxlY3Rpb24gaWQ6IDY5MzE2OTg0MFxuKiBDb2xsZWN0
aW9uIG5hbWU6IFdyaXRlYm9va1xuKiBOdW1iZXIgb2YgY29tbWVudHM6IDFc
biogUGF0aDogLzczNTQ2NDc4NS9jYXJkcy83NTY4MTU2NTJcblxuRU5EIE9G
IENBUkQgNzU2ODE1NjUyXG5cbkVORCBPRiBFVkVOVCA3OTg4NTMyOTFcbiJ9
XSwic3RyZWFtIjpmYWxzZSwidGVtcGVyYXR1cmUiOjEuMH0=
headers:
User-Agent:
- Faraday v2.13.4
@@ -1793,7 +1781,7 @@ http_interactions:
message: OK
headers:
Date:
- Fri, 12 Sep 2025 03:30:59 GMT
- Fri, 12 Sep 2025 14:15:40 GMT
Content-Type:
- application/json
Transfer-Encoding:
@@ -1805,13 +1793,13 @@ http_interactions:
Openai-Organization:
- 37signals-u7qhwk
Openai-Processing-Ms:
- '4127'
- '7940'
Openai-Project:
- proj_M0FFIqFFeNEpzhhgv64oFzt1
Openai-Version:
- '2020-10-01'
X-Envoy-Upstream-Service-Time:
- '4355'
- '8196'
X-Ratelimit-Limit-Requests:
- '10000'
X-Ratelimit-Limit-Tokens:
@@ -1819,22 +1807,22 @@ http_interactions:
X-Ratelimit-Remaining-Requests:
- '9999'
X-Ratelimit-Remaining-Tokens:
- '1998136'
- '1998276'
X-Ratelimit-Reset-Requests:
- 6ms
X-Ratelimit-Reset-Tokens:
- 55ms
- 51ms
X-Request-Id:
- req_a96db76abf5d4bae8d61be277be021fc
- req_e4fa40158c654e6f9e6987d420cd1eef
X-Openai-Proxy-Wasm:
- v0.1
Cf-Cache-Status:
- DYNAMIC
Set-Cookie:
- __cf_bm=vphLhSEoO.71N.lO5FW19vtPVb76tRrhIVGAkFkRK.4-1757647859-1.0.1.1-SPWXOII58dZ4IYqUi4jJr9GC8q3rCs.PCljbniZOBB4ZGdMDcBWrGo9DTRIXwOuHwp8GAw3Jcw67h.6nY01_zQCRp6N0j6TSSj8hnSGuWAU;
path=/; expires=Fri, 12-Sep-25 04:00:59 GMT; domain=.api.openai.com; HttpOnly;
- __cf_bm=d_8BwjbWxlEIHLGNvNQBvL3WUrGLvA9yaeQrw1uQZyo-1757686540-1.0.1.1-J_1h8XjRpPtbLg5YNx_q2N9wPuGqpCnr6wvZFJUCPAsROH.3DCp5xrsQLSU018NGrGW_H7.x91aaDaFQfMJyBUP2oS6yS5liGfZDSJxrlg0;
path=/; expires=Fri, 12-Sep-25 14:45:40 GMT; domain=.api.openai.com; HttpOnly;
Secure; SameSite=None
- _cfuvid=hna6lLPtRbdVddwHHFWyJQ9v47NK3WOSiw3FQde3IMQ-1757647859285-0.0.1.1-604800000;
- _cfuvid=mtLqK4ZBEPLuGeUVwUrNmva92jyw5pEHp0WwZxeL6Z8-1757686540707-0.0.1.1-604800000;
path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None
Strict-Transport-Security:
- max-age=31536000; includeSubDomains; preload
@@ -1843,77 +1831,72 @@ http_interactions:
Server:
- cloudflare
Cf-Ray:
- 97dc5434dd7e7d5d-DFW
- 97e00474e9fbf781-MAD
Alt-Svc:
- h3=":443"; ma=86400
body:
encoding: ASCII-8BIT
base64_string: |
ewogICJpZCI6ICJjaGF0Y21wbC1DRW9tdEVnNmFNcmJlRVViWU5tMXlORGpU
ZU9ZWiIsCiAgIm9iamVjdCI6ICJjaGF0LmNvbXBsZXRpb24iLAogICJjcmVh
dGVkIjogMTc1NzY0Nzg1NSwKICAibW9kZWwiOiAiY2hhdGdwdC00by1sYXRl
ewogICJpZCI6ICJjaGF0Y21wbC1DRXlxaWVXR25la0JlZHV4ODJiUVN5UXFw
VHhQRSIsCiAgIm9iamVjdCI6ICJjaGF0LmNvbXBsZXRpb24iLAogICJjcmVh
dGVkIjogMTc1NzY4NjUzMiwKICAibW9kZWwiOiAiZ3B0LTUtY2hhdC1sYXRl
c3QiLAogICJjaG9pY2VzIjogWwogICAgewogICAgICAiaW5kZXgiOiAwLAog
ICAgICAibWVzc2FnZSI6IHsKICAgICAgICAicm9sZSI6ICJhc3Npc3RhbnQi
LAogICAgICAgICJjb250ZW50IjogIiMjIyBXcml0ZWJvb2sgR2V0cyBhIERl
c2lnbiBSZWFsaXR5IENoZWNrXG5cblRoaXMgd2Vla+KAmXMgYWN0aXZpdHkg
aW4gdGhlIFdyaXRlYm9vayBjb2xsZWN0aW9uIHJldmVhbGVkIGEgY29tbW9u
IHRoZW1lOiBVSSBpc3N1ZXMgYXJlIHN0YWNraW5nIHVwLCBhbmQgdGhlIHRl
YW0gaXMgYXNzaWduaW5nIHRoZW0gbGVmdCBhbmQgcmlnaHQuIFdoaWxlIGJ1
Z3MgYWJvdXQgc2l6aW5nIGFuZCBsYXlvdXQgYXJlIGJlaW5nIGxvZ2dlZCBh
bmQgcmVhc3NpZ25lZCwgb25lIGtleSBjYXJkIHBvaW50cyB0byBhIG1ham9y
IG1pbGVzdG9uZSDigJQgdGhlIGFwcCBpcyBvZmZpY2lhbGx5IG1hcmtlZCBy
ZWFkeSB0byBzaGlwLlxuXG4jIyMjIEEgU21hbGwgTG9nbyBTcGFya3MgYSBC
aWcgUHVzaFxuXG5EYXZpZCBmbGFnZ2VkIGEgZGVzaWduIGNvbmNlcm4g4oCU
IFvigJxUaGUgbG9nbyBpc24ndCBiaWcgZW5vdWdo4oCdXSgvNzM1NDY0Nzg1
L2NhcmRzLzYxMzMyNTMzNCkg4oCUIGFuZCB0aGUgY2FyZCBnYWluZWQgYXR0
ZW50aW9uIHF1aWNrbHkuIEl0IHdhcyBwdWJsaXNoZWQgYW5kIHJlYXNzaWdu
ZWQgbXVsdGlwbGUgdGltZXMgb3ZlciB0aGUgd2VlaywgbGFuZGluZyB3aXRo
IGJvdGggS2V2aW4gYW5kIEpaIGFzIGFzc2lnbmVlcy4gSXTigJlzIHN0aWxs
IG9wZW4sIGFuZCBoYXMgc3RpcnJlZCBxdWl0ZSBhIGJpdCBvZiBjb252ZXJz
YXRpb24gd2l0aCBmaXZlIGNvbW1lbnRzIHNvIGZhci5cblxuIyMjIyBCcm9r
ZW4gTGF5b3V0IERyYXdzIGEgQ2xvc2VyIExvb2tcblxuQW5vdGhlciB2aXN1
YWwgaXNzdWUgd2FzIHJhaXNlZCB3aGVuIERhdmlkIG9wZW5lZCBb4oCcTGF5
b3V0IGlzIGJyb2tlbuKAnV0oLzczNTQ2NDc4NS9jYXJkcy85NzY5MDcyMzQp
LiBKWiB3YXMgYXNzaWduZWQgdG8gdGFja2xlIGl0LCBhbmQgYSBmb2xsb3ct
dXAgY29tbWVudCBwb2ludGVkIG91dCB0aGUgdGV4dCB3YXMg4oCcb3ZlcmZs
b3dpbmcgdGhlIGNvbnRhaW5lcuKAnSDigJQgYSBjbGVhciBzaWduIHRoaXMg
b25l4oCZcyBtb3JlIHRoYW4ganVzdCBhIG5pdHBpY2suXG5cbiMjIyMgVGlu
eSBUZXh0IE1ha2VzIHRoZSBMaXN0XG5cbktldmluIGFkZGVkIFvigJxUaGUg
dGV4dCBpcyB0b28gc21hbGzigJ1dKC83MzU0NjQ3ODUvY2FyZHMvOTk5MDA4
MTk5KSwgd2hpY2gganVtcGVkIHJpZ2h0IGludG8gdGhlIOKAnEluIHByb2dy
ZXNz4oCdIGxhbmUuIEl04oCZcyBvbmUgb2YgdGhlIGZldyBjYXJkcyB3aXRo
IGFuIGFzc2lnbmVkIHdvcmtmbG93IHN0YWdlIGZyb20gdGhlIGp1bXAsIHN1
Z2dlc3RpbmcgaXQgbWlnaHQgYmUgYWN0aXZlbHkgdW5kZXIgZml4LlxuXG4j
IyMjIFRoZSBBcHAgSXMgUmVhZHkgdG8gU2hpcCAoUmVhbGx5KVxuXG5UaGUg
YmlnZ2VzdCBtaWxlc3RvbmUgb2YgdGhlIHdlZWs6IEtldmluIGNyZWF0ZWQg
YW5kIGNsb3NlZCBhIGNhcmQgdGl0bGVkIFvigJxXZSBuZWVkIHRvIHNoaXAg
dGhlIGFwcOKAnV0oLzczNTQ2NDc4NS9jYXJkcy83NTY4MTU2NTIpLiBUaGF0
IGJsdW50bHkgdGl0bGVkIHRhc2sgd2FzIHF1aWV0bHkgbWFya2VkIGRvbmUg
b24gdGhlIDEydGgg4oCUIHNpZ25hbGluZyB0aGUgdGVhbSBzZWVzIHRoZSBs
YXVuY2ggYXMgYSBnby5cblxuIyMjIyBUaHJlYWRzIEFyZSBBY3RpdmUsIEV2
ZW4gQmVmb3JlIHRoZSBGaXhcblxuV2hpbGUgbm9uZSBvZiB0aGUgVUktY2Vu
dHJpYyBjYXJkcyB3ZXJlIGNsb3NlZCB0aGlzIHdlZWssIGNvbnZlcnNhdGlv
bnMgYXJlIGhhcHBlbmluZy4gVGhlIGNvbW1lbnRzIG9uIHRoZSBsYXlvdXQg
YW5kIGxvZ28gaXNzdWVzIHN1Z2dlc3QgcmV2aWV3ZXJzIGFyZSBpZGVudGlm
eWluZyBzcGVjaWZpYyBidWdzIHF1aWNrbHksIHdoaWNoIG1heSBzaG9ydGVu
IHR1cm5hcm91bmQgdGltZXMgb25jZSBmaXhlcyBiZWdpbi5cblxuIyMjIyBB
c3NpZ25tZW50cyBSZXBlYXQg4oCUIEJ1dCBBY3Rpb25zIEFyZSBQZW5kaW5n
XG5cbkNhcmRzIGxpa2UgdGhlIGxvZ28gY29tcGxhaW50IHdlcmUgYXNzaWdu
ZWQgYW5kIHJlLWFzc2lnbmVkIHRvIHRoZSBzYW1lIHBlb3BsZSBtdWx0aXBs
ZSB0aW1lcywgcG9zc2libHkgdG8gcmVzZXQgYXR0ZW50aW9uIG9yIGluZGlj
YXRlIHJlbmV3ZWQgdXJnZW5jeS4gQnV0IGZvciBub3csIG5vIHJlc29sdXRp
b24geWV0LiIsCiAgICAgICAgInJlZnVzYWwiOiBudWxsLAogICAgICAgICJh
bm5vdGF0aW9ucyI6IFtdCiAgICAgIH0sCiAgICAgICJsb2dwcm9icyI6IG51
bGwsCiAgICAgICJmaW5pc2hfcmVhc29uIjogInN0b3AiCiAgICB9CiAgXSwK
ICAidXNhZ2UiOiB7CiAgICAicHJvbXB0X3Rva2VucyI6IDIzMDAsCiAgICAi
Y29tcGxldGlvbl90b2tlbnMiOiA0NTYsCiAgICAidG90YWxfdG9rZW5zIjog
Mjc1NiwKICAgICJwcm9tcHRfdG9rZW5zX2RldGFpbHMiOiB7CiAgICAgICJj
YWNoZWRfdG9rZW5zIjogMCwKICAgICAgImF1ZGlvX3Rva2VucyI6IDAKICAg
IH0sCiAgICAiY29tcGxldGlvbl90b2tlbnNfZGV0YWlscyI6IHsKICAgICAg
InJlYXNvbmluZ190b2tlbnMiOiAwLAogICAgICAiYXVkaW9fdG9rZW5zIjog
MCwKICAgICAgImFjY2VwdGVkX3ByZWRpY3Rpb25fdG9rZW5zIjogMCwKICAg
ICAgInJlamVjdGVkX3ByZWRpY3Rpb25fdG9rZW5zIjogMAogICAgfQogIH0s
CiAgInNlcnZpY2VfdGllciI6ICJkZWZhdWx0IiwKICAic3lzdGVtX2Zpbmdl
cnByaW50IjogImZwX2QzYTA4MzhmYjgiCn0K
recorded_at: Fri, 12 Sep 2025 03:30:59 GMT
LAogICAgICAgICJjb250ZW50IjogIiMjIyBWaXN1YWwgRml4ZXMgYW5kIFNo
aXBwaW5nIE1pbGVzdG9uZXMgRG9taW5hdGUgdGhlIFdlZWsgIFxuSXQgd2Fz
IGEgYnVzeSBzdHJldGNoIGZvciB0aGUgV3JpdGVib29rIHByb2plY3QsIHdp
dGggdGhlIHNwb3RsaWdodCBvbiB2aXN1YWwgZGVzaWduIHR3ZWFrcywgbGF5
b3V0IGJ1Z3MsIGFuZCB0aGUgbG9uZy1hd2FpdGVkIHB1c2ggdG8gc2hpcCB0
aGUgYXBwLiBBc3NpZ25tZW50cyBzaGlmdGVkIGFyb3VuZCwgZmVlZGJhY2sg
cm9sbGVkIGluLCBhbmQgb25lIG1ham9yIG1pbGVzdG9uZeKAlGNsb3Npbmcg
dGhlIFwic2hpcCBpdFwiIHRhc2vigJRzdG9vZCBvdXQuICBcblxuIyMjIyBM
b2dvIFNpemUgU3BhcmtzIERlYmF0ZSAgXG5EYXZpZCByYWlzZWQgdGhlIFts
b2dvIGlzc3VlXSgvNzM1NDY0Nzg1L2NhcmRzLzYxMzMyNTMzNCksIGFuZCBp
dCBrZXB0IGF0dGVudGlvbiB0aHJvdWdob3V0IHRoZSB3ZWVrLCBsYW5kaW5n
IG9uIHRoZSBwbGF0ZXMgb2YgS2V2aW4gYW5kIEpaLiBXaXRoIGZpdmUgY29t
bWVudHMgYWxyZWFkeSwgdGhpcyBuaXRwaWNreSBidXQgcGVyc2lzdGVudCBk
ZXRhaWwgcmVmdXNlcyB0byBzZXR0bGUgZG93bi4gIFxuXG4jIyMjIExheW91
dCBUcm91YmxlIElkZW50aWZpZWQgYW5kIEFzc2lnbmVkICBcblRoZSBbbGF5
b3V0IGJ1Z10oLzczNTQ2NDc4NS9jYXJkcy85NzY5MDcyMzQpIGVtZXJnZWQg
YXMgYW5vdGhlciBzdGlja2luZyBwb2ludC4gSlogd2FzIG9mZmljaWFsbHkg
dGFza2VkIHdpdGggaXQsIGFuZCBEYXZpZCBhZGRlZCBhIGNsYXJpZnlpbmcg
bm90ZSB0aGF0IHRleHQgd2FzIG92ZXJmbG93aW5nIGl0cyBjb250YWluZXIs
IHNpZ25hbGluZyB0aGlzIG9uZSBtaWdodCB0YWtlIG1vcmUgdGhhbiBhIHF1
aWNrIGZpeC4gIFxuXG4jIyMjIFRpbnkgVGV4dCBUYWtlcyB0aGUgU3RhZ2Ug
IFxuS2V2aW4gb3BlbmVkIGEgZnJlc2ggdGlja2V0IGFib3V0IFt0ZXh0IHNp
emUgcHJvYmxlbXNdKC83MzU0NjQ3ODUvY2FyZHMvOTk5MDA4MTk5KS4gQ3Vy
cmVudGx5IG1hcmtlZCBcImluIHByb2dyZXNzLFwiIGl0IGhpZ2hsaWdodHMg
dGhhdCB0aGUgZGVzaWduIGNyaXRpcXVlcyBhcmVu4oCZdCBqdXN0IGFib3V0
IGdyYXBoaWNz4oCUcmVhZGFiaWxpdHkgaXMgZmlybWx5IGluIHRoZSBtaXgg
dG9vLiAgXG5cbiMjIyMgQmlnIFB1c2ggdG8gU2hpcCAgXG5LZXZpbiBjcmVh
dGVkIHRoZSBoaWdoLXN0YWtlcyBb4oCcV2UgbmVlZCB0byBzaGlwIHRoZSBh
cHDigJ1dKC83MzU0NjQ3ODUvY2FyZHMvNzU2ODE1NjUyKSBjYXJkLiBJdCB3
YXMgdGhlIGFuY2hvciBwb2ludCBvZiB0aGUgd2Vlaywgc2VlaW5nIHF1aWNr
IG1vdmVtZW50IGZyb20gdHJpYWdlIHRvIGNsb3N1cmUuIEJ5IHdlZWvigJlz
IGVuZCwgS2V2aW4gY2xvc2VkIGl0LCBtYXJraW5nIGEgbWFqb3IgcHJvamVj
dCBtaWxlc3RvbmUuICBcblxuIyMjIyBNdWx0aXBsZSBBc3NpZ25tZW50cyBL
ZWVwIEpaIEJ1c3kgIFxuQmV0d2VlbiB0aGUgbG9nbyBpc3N1ZSBhbmQgbGF5
b3V0IHRyb3VibGVzLCBKWuKAmXMgcGxhdGUgZmlsbGVkIHVwIGZhc3QuIFRo
ZSB3ZWVr4oCZcyBhY3Rpdml0eSBzaWduYWxzIHRoYXQgSlogaXMgdGhlIGdv
LXRvIGZvciB1bnRhbmdsaW5nIGJvdGggZGVzaWduIGFuZCB0ZWNobmljYWwg
YmxvY2tlcnMuICBcblxuIyMjIyBQYXR0ZXJuIHRvIFdhdGNoOiBEZXNpZ24g
UG9saXNoIE1lZXRzIERlbGl2ZXJ5ICBcblRoZSBjb21tb24gdGhyZWFkPyBB
dHRlbnRpb24gaXMgc3BsaXQgYmV0d2VlbiBzbWFsbC1idXQtdmlzaWJsZSBk
ZXNpZ24gdHdlYWtzIChsb2dvLCB0ZXh0IHNpemUsIGxheW91dCkgYW5kIHRo
ZSBsYXJnZXIgZ29hbCBvZiBzaGlwcGluZyB0aGUgYXBwLCBzdWdnZXN0aW5n
IHRoZSB0ZWFtIGlzIHRpZ2h0ZW5pbmcgdXAgZGV0YWlscyBhcyB0aGV5IG1h
cmNoIHRvd2FyZCByZWxlYXNlLiAgIiwKICAgICAgICAicmVmdXNhbCI6IG51
bGwsCiAgICAgICAgImFubm90YXRpb25zIjogW10KICAgICAgfSwKICAgICAg
ImxvZ3Byb2JzIjogbnVsbCwKICAgICAgImZpbmlzaF9yZWFzb24iOiAic3Rv
cCIKICAgIH0KICBdLAogICJ1c2FnZSI6IHsKICAgICJwcm9tcHRfdG9rZW5z
IjogMjExNCwKICAgICJjb21wbGV0aW9uX3Rva2VucyI6IDQxOSwKICAgICJ0
b3RhbF90b2tlbnMiOiAyNTMzLAogICAgInByb21wdF90b2tlbnNfZGV0YWls
cyI6IHsKICAgICAgImNhY2hlZF90b2tlbnMiOiAwLAogICAgICAiYXVkaW9f
dG9rZW5zIjogMAogICAgfSwKICAgICJjb21wbGV0aW9uX3Rva2Vuc19kZXRh
aWxzIjogewogICAgICAicmVhc29uaW5nX3Rva2VucyI6IDAsCiAgICAgICJh
dWRpb190b2tlbnMiOiAwLAogICAgICAiYWNjZXB0ZWRfcHJlZGljdGlvbl90
b2tlbnMiOiAwLAogICAgICAicmVqZWN0ZWRfcHJlZGljdGlvbl90b2tlbnMi
OiAwCiAgICB9CiAgfSwKICAic2VydmljZV90aWVyIjogImRlZmF1bHQiLAog
ICJzeXN0ZW1fZmluZ2VycHJpbnQiOiAiZnBfOWU4MjJkNTIxZCIKfQo=
recorded_at: Fri, 12 Sep 2025 14:15:40 GMT
recorded_with: VCR 6.3.1
@@ -2669,7 +2669,7 @@ http_interactions:
body:
encoding: UTF-8
base64_string: |
eyJtb2RlbCI6ImNoYXRncHQtNG8tbGF0ZXN0IiwibWVzc2FnZXMiOlt7InJv
eyJtb2RlbCI6ImdwdC01LWNoYXQtbGF0ZXN0IiwibWVzc2FnZXMiOlt7InJv
bGUiOiJkZXZlbG9wZXIiLCJjb250ZW50IjoiSGVscCBtZSBtYWtlIHNlbnNl
IG9mIHRoZSB3ZWVr4oCZcyBhY3Rpdml0eSBpbiBhIG5ld3Mgc3R5bGUgZm9y
bWF0IHdpdGggYm9sZCBoZWFkbGluZXMgYW5kIHNob3J0IHN1bW1hcmllcy5c
@@ -2775,32 +2775,20 @@ http_interactions:
KiBDcmVhdGVkIGF0OiA8VElNRT59XG4qIFBhdGg6IC83MzU0NjQ3ODUvY2Fy
ZHMvOTc2OTA3MjM0I2NvbW1lbnRfODI3NDUwNjg0XG5FTkQgT0YgQ09NTUVO
VCA4Mjc0NTA2ODRcblxuRU5EIE9GIEVWRU5UIDY1NDQ3NDk3M1xuXG5cbkJF
R0lOIE9GIEVWRU5UIDY4NTg4OTI5M1xuIyMgRXZlbnQgY2FyZF9hc3NpZ25l
ZCAoQ2FyZCA2MTMzMjUzMzQpKVxuXG4qIENyZWF0ZWQgYXQ6IDxUSU1FPlxu
KiBDcmVhdGVkIGJ5OiBEYXZpZFxuXG5CRUdJTiBPRiBDQVJEIDYxMzMyNTMz
NFxuXG4qKlRpdGxlOioqIFRoZSBsb2dvIGlzbid0IGJpZyBlbm91Z2hcbioq
RGVzY3JpcHRpb246KipcblxuXG5cbiMjIyMgTWV0YWRhdGFcblxuKiBJZDog
NjEzMzI1MzM0XG4qIENyZWF0ZWQgYnk6IERhdmlkfVxuKiBBc3NpZ25lZCB0
bzogS2V2aW4sIEpafVxuKiBXb3JrZmxvdyBzdGFnZTogVHJpYWdlXG4qIENy
ZWF0ZWQgYXQ6IDxUSU1FPn1cbiogQ2xvc2VkOiBmYWxzZVxuKiBDbG9zZWQg
Ynk6IFxuKiBDbG9zZWQgYXQ6IFxuKiBDb2xsZWN0aW9uIGlkOiA2OTMxNjk4
R0lOIE9GIEVWRU5UIDc4NDkzNzI0OFxuIyMgRXZlbnQgY2FyZF9wdWJsaXNo
ZWQgKENhcmQgNzU2ODE1NjUyKSlcblxuKiBDcmVhdGVkIGF0OiA8VElNRT5c
biogQ3JlYXRlZCBieTogS2V2aW5cblxuQkVHSU4gT0YgQ0FSRCA3NTY4MTU2
NTJcblxuKipUaXRsZToqKiBXZSBuZWVkIHRvIHNoaXAgdGhlIGFwcFxuKipE
ZXNjcmlwdGlvbjoqKlxuXG5cblxuIyMjIyBNZXRhZGF0YVxuXG4qIElkOiA3
NTY4MTU2NTJcbiogQ3JlYXRlZCBieTogS2V2aW59XG4qIEFzc2lnbmVkIHRv
OiB9XG4qIFdvcmtmbG93IHN0YWdlOiBUcmlhZ2VcbiogQ3JlYXRlZCBhdDog
PFRJTUU+fVxuKiBDbG9zZWQ6IHRydWVcbiogQ2xvc2VkIGJ5OiBLZXZpblxu
KiBDbG9zZWQgYXQ6IDxUSU1FPlxuKiBDb2xsZWN0aW9uIGlkOiA2OTMxNjk4
NDBcbiogQ29sbGVjdGlvbiBuYW1lOiBXcml0ZWJvb2tcbiogTnVtYmVyIG9m
IGNvbW1lbnRzOiA1XG4qIFBhdGg6IC83MzU0NjQ3ODUvY2FyZHMvNjEzMzI1
MzM0XG5cbkVORCBPRiBDQVJEIDYxMzMyNTMzNFxuXG5FTkQgT0YgRVZFTlQg
Njg1ODg5MjkzXG5cblxuQkVHSU4gT0YgRVZFTlQgNzg0OTM3MjQ4XG4jIyBF
dmVudCBjYXJkX3B1Ymxpc2hlZCAoQ2FyZCA3NTY4MTU2NTIpKVxuXG4qIENy
ZWF0ZWQgYXQ6IDxUSU1FPlxuKiBDcmVhdGVkIGJ5OiBLZXZpblxuXG5CRUdJ
TiBPRiBDQVJEIDc1NjgxNTY1MlxuXG4qKlRpdGxlOioqIFdlIG5lZWQgdG8g
c2hpcCB0aGUgYXBwXG4qKkRlc2NyaXB0aW9uOioqXG5cblxuXG4jIyMjIE1l
dGFkYXRhXG5cbiogSWQ6IDc1NjgxNTY1MlxuKiBDcmVhdGVkIGJ5OiBLZXZp
bn1cbiogQXNzaWduZWQgdG86IH1cbiogV29ya2Zsb3cgc3RhZ2U6IFRyaWFn
ZVxuKiBDcmVhdGVkIGF0OiA8VElNRT59XG4qIENsb3NlZDogdHJ1ZVxuKiBD
bG9zZWQgYnk6IEtldmluXG4qIENsb3NlZCBhdDogPFRJTUU+XG4qIENvbGxl
Y3Rpb24gaWQ6IDY5MzE2OTg0MFxuKiBDb2xsZWN0aW9uIG5hbWU6IFdyaXRl
Ym9va1xuKiBOdW1iZXIgb2YgY29tbWVudHM6IDFcbiogUGF0aDogLzczNTQ2
NDc4NS9jYXJkcy83NTY4MTU2NTJcblxuRU5EIE9GIENBUkQgNzU2ODE1NjUy
XG5cbkVORCBPRiBFVkVOVCA3ODQ5MzcyNDhcbiJ9XSwic3RyZWFtIjpmYWxz
ZX0=
IGNvbW1lbnRzOiAxXG4qIFBhdGg6IC83MzU0NjQ3ODUvY2FyZHMvNzU2ODE1
NjUyXG5cbkVORCBPRiBDQVJEIDc1NjgxNTY1MlxuXG5FTkQgT0YgRVZFTlQg
Nzg0OTM3MjQ4XG4ifV0sInN0cmVhbSI6ZmFsc2UsInRlbXBlcmF0dXJlIjox
LjB9
headers:
User-Agent:
- Faraday v2.13.4
@@ -2818,7 +2806,7 @@ http_interactions:
message: OK
headers:
Date:
- Fri, 12 Sep 2025 03:30:51 GMT
- Fri, 12 Sep 2025 14:15:17 GMT
Content-Type:
- application/json
Transfer-Encoding:
@@ -2830,13 +2818,13 @@ http_interactions:
Openai-Organization:
- 37signals-u7qhwk
Openai-Processing-Ms:
- '2620'
- '6329'
Openai-Project:
- proj_M0FFIqFFeNEpzhhgv64oFzt1
Openai-Version:
- '2020-10-01'
X-Envoy-Upstream-Service-Time:
- '2772'
- '6500'
X-Ratelimit-Limit-Requests:
- '10000'
X-Ratelimit-Limit-Tokens:
@@ -2844,22 +2832,22 @@ http_interactions:
X-Ratelimit-Remaining-Requests:
- '9999'
X-Ratelimit-Remaining-Tokens:
- '1998554'
- '1998694'
X-Ratelimit-Reset-Requests:
- 6ms
X-Ratelimit-Reset-Tokens:
- 43ms
- 39ms
X-Request-Id:
- req_6f22a137f84d4ba5a51a7e67d090da89
- req_d81b830ea31e44e885eac97fa22bff90
X-Openai-Proxy-Wasm:
- v0.1
Cf-Cache-Status:
- DYNAMIC
Set-Cookie:
- __cf_bm=qJ46BCoTdvOBRolJJ3yMikPeCof.lWFY5I6qx96XzPM-1757647851-1.0.1.1-nh2TbczsWDlg406ysRN6kLDkMXtZUR2SRR_KjBE10yNMsaeXpYZkE4_nb0GMiAoFxRVZPQ8yguKF.9inuTUhbgFNoQfX2m6jj8bUAVdld_M;
path=/; expires=Fri, 12-Sep-25 04:00:51 GMT; domain=.api.openai.com; HttpOnly;
- __cf_bm=SliAP.EKb6FUuBhLU72A69_ucmQ1JiDp_YJ2qX.AUqI-1757686517-1.0.1.1-bv_MkaaWmt.pomokgc4zFEDXBB.bCbPh.NzXYaqbYw4h4nt3ZOvAUc8eQfn.rBj2uiMVQOnnE82xbIcHxGyMpQdG3czAO09ltSl2YIpNwa8;
path=/; expires=Fri, 12-Sep-25 14:45:17 GMT; domain=.api.openai.com; HttpOnly;
Secure; SameSite=None
- _cfuvid=GJw2M1yksZaioayc3d.Omi55WSc0R0tVj2mbh3X_6cY-1757647851573-0.0.1.1-604800000;
- _cfuvid=VYuigE21Cym9AZ1iGZsIOBqgq_.dLGN8OWGy7F.IUmQ-1757686517510-0.0.1.1-604800000;
path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None
Strict-Transport-Security:
- max-age=31536000; includeSubDomains; preload
@@ -2868,61 +2856,64 @@ http_interactions:
Server:
- cloudflare
Cf-Ray:
- 97dc540e8c8beac5-DFW
- 97e003f30e081ba7-MAD
Alt-Svc:
- h3=":443"; ma=86400
body:
encoding: ASCII-8BIT
base64_string: |
ewogICJpZCI6ICJjaGF0Y21wbC1DRW9tbWl2SDFwRFR5RlRpMUdCRWxhd3lN
V0U1ViIsCiAgIm9iamVjdCI6ICJjaGF0LmNvbXBsZXRpb24iLAogICJjcmVh
dGVkIjogMTc1NzY0Nzg0OCwKICAibW9kZWwiOiAiY2hhdGdwdC00by1sYXRl
ewogICJpZCI6ICJjaGF0Y21wbC1DRXlxTmxCcVNKWFhJNVp2WlZKTUtEZmU3
cGZ5SSIsCiAgIm9iamVjdCI6ICJjaGF0LmNvbXBsZXRpb24iLAogICJjcmVh
dGVkIjogMTc1NzY4NjUxMSwKICAibW9kZWwiOiAiZ3B0LTUtY2hhdC1sYXRl
c3QiLAogICJjaG9pY2VzIjogWwogICAgewogICAgICAiaW5kZXgiOiAwLAog
ICAgICAibWVzc2FnZSI6IHsKICAgICAgICAicm9sZSI6ICJhc3Npc3RhbnQi
LAogICAgICAgICJjb250ZW50IjogIiMjIyBDb25zaXN0ZW5jeSBDcmFja3Mg
YW5kIENsZWFudXAgaW4gV3JpdGVib29rXG5cbkEgaGFuZGZ1bCBvZiBuZXcg
ZGVzaWduIGNvbmNlcm5zIGJ1YmJsZWQgdXAgaW4gdGhlIFdyaXRlYm9vayBj
b2xsZWN0aW9uIHRoaXMgd2VlaywgbW9zdCBvZiB0aGVtIGFyb3VuZCB2aXN1
YWwgcG9saXNo4oCUdGhpbmsgbG9nb3MsIGxheW91dCwgYW5kIHR5cG9ncmFw
aHkuIE1lYW53aGlsZSwgb25lIG1ham9yIHRhc2sgbWFkZSBpdCB0byB0aGUg
ZmluaXNoIGxpbmUsIHByb3ZpZGluZyBhdCBsZWFzdCBvbmUgc29saWQgbWls
ZXN0b25lIGFtaWQgdGhlIHRyaWFnZSBub2lzZS5cblxuIyMjIyBUaGUgTG9n
b+KAmXMgVG9vIFNtYWxs4oCUQW5kIEl04oCZcyBCdWdnaW5nIFBlb3BsZSAg
XG5EYXZpZCBvcGVuZWQgYSBjYXJkIGFib3V0IHRoZSBsb2dvIG5vdCBiZWlu
ZyBsYXJnZSBlbm91Z2ggYW5kIGFzc2lnbmVkIGl0IHRvIGJvdGggS2V2aW4g
YW5kIEpaLiBXaXRoIFs1IGNvbW1lbnRzIG9uIHRoZSB0aHJlYWRdKC83MzU0
NjQ3ODUvY2FyZHMvNjEzMzI1MzM0KSwgaXTigJlzIGNsZWFybHkgc3Bhcmtl
ZCBzb21lIGRpc2N1c3Npb24sIHRob3VnaCBpdCByZW1haW5zIG9wZW4gaW4g
dHJpYWdlIGZvciBub3cuXG5cbiMjIyMgTGF5b3V0IElzIEJyb2tlbiwgV2l0
aCBPdmVyZmxvd2luZyBUZXh0ICBcblRoZSBsYXlvdXTigJlzIGxvb2tpbmcg
cm91Z2ggdG9v4oCURGF2aWQgcmVwb3J0ZWQgdGhhdCBbdGV4dCBpcyBzcGls
bGluZyBvdXQgb2YgaXRzIGNvbnRhaW5lcl0oLzczNTQ2NDc4NS9jYXJkcy85
NzY5MDcyMzQjY29tbWVudF84Mjc0NTA2ODQpLCBzdWdnZXN0aW5nIGEgQ1NT
IG9yIHJlc3BvbnNpdmUgZGVzaWduIGlzc3VlLiBKWiBpcyBvbiB0aGUgY2Fz
ZSwgYnV0IHRoZSBjYXJk4oCZcyBzdGlsbCBzdHVjayBpbiB0cmlhZ2UuXG5c
biMjIyMgVHlwb2dyYXBoeSBUcm91YmxlcyBDb250aW51ZSAgXG5LZXZpbiBm
bGFnZ2VkIGFub3RoZXIgdmlzdWFsIG5pdDogW3RoZSB0ZXh0IGlzIHRvbyBz
bWFsbF0oLzczNTQ2NDc4NS9jYXJkcy85OTkwMDgxOTkpLiBFdmVuIHRob3Vn
aCBpdOKAmXMgbWFya2VkIGFzIFwiSW4gcHJvZ3Jlc3MsXCIgdGhlcmXigJlz
IGJlZW4gbWluaW1hbCBkaXNjdXNzaW9uIHNvIGZhci5cblxuIyMjIyBUaGUg
QXBwIFNoaXBtZW50IENhcmQgQ3Jvc3NlcyB0aGUgRmluaXNoIExpbmUgIFxu
SW4gYSBwb3NpdGl2ZSB0dXJuLCBLZXZpbiBjbG9zZWQgb3V0IGEgaGlnaGVy
LWxldmVsIHByaW9yaXR5OiBb4oCcV2UgbmVlZCB0byBzaGlwIHRoZSBhcHDi
gJ1dKC83MzU0NjQ3ODUvY2FyZHMvNzU2ODE1NjUyKS4gSXQgd2FzIGNyZWF0
ZWQgYW5kIGNvbXBsZXRlZCB3aXRoaW4gYSB3ZWVr4oCUYW4gZW5jb3VyYWdp
bmcgc2lnbiBvZiBmb3J3YXJkIG1vbWVudHVtIGFtaWQgdGhlIGRlc2lnbiBk
aXN0cmFjdGlvbnMuIiwKICAgICAgICAicmVmdXNhbCI6IG51bGwsCiAgICAg
ICAgImFubm90YXRpb25zIjogW10KICAgICAgfSwKICAgICAgImxvZ3Byb2Jz
IjogbnVsbCwKICAgICAgImZpbmlzaF9yZWFzb24iOiAic3RvcCIKICAgIH0K
ICBdLAogICJ1c2FnZSI6IHsKICAgICJwcm9tcHRfdG9rZW5zIjogMTczNSwK
ICAgICJjb21wbGV0aW9uX3Rva2VucyI6IDMxNiwKICAgICJ0b3RhbF90b2tl
bnMiOiAyMDUxLAogICAgInByb21wdF90b2tlbnNfZGV0YWlscyI6IHsKICAg
ICAgImNhY2hlZF90b2tlbnMiOiAwLAogICAgICAiYXVkaW9fdG9rZW5zIjog
MAogICAgfSwKICAgICJjb21wbGV0aW9uX3Rva2Vuc19kZXRhaWxzIjogewog
ICAgICAicmVhc29uaW5nX3Rva2VucyI6IDAsCiAgICAgICJhdWRpb190b2tl
bnMiOiAwLAogICAgICAiYWNjZXB0ZWRfcHJlZGljdGlvbl90b2tlbnMiOiAw
LAogICAgICAicmVqZWN0ZWRfcHJlZGljdGlvbl90b2tlbnMiOiAwCiAgICB9
CiAgfSwKICAic2VydmljZV90aWVyIjogImRlZmF1bHQiLAogICJzeXN0ZW1f
ZmluZ2VycHJpbnQiOiAiZnBfZDNhMDgzOGZiOCIKfQo=
recorded_at: Sun, 07 Sep 2025 03:30:48 GMT
LAogICAgICAgICJjb250ZW50IjogIiMjIyBEZXNpZ24gRGV0YWlscyBUYWtl
IENlbnRlciBTdGFnZSAgXG5UaGlzIHdlZWvigJlzIGFjdGl2aXR5IHdhcyBh
bGwgYWJvdXQgdmlzdWFscyBhbmQgdXNhYmlsaXR54oCUbG9nb3MsIGxheW91
dHMsIGFuZCB0ZXh0IHNpemVzIHdlcmUgZmxhZ2dlZCwgc2hvd2luZyB0aGUg
dGVhbSBpcyBkZWVwIGluIHRoZSB3ZWVkcyBvZiBmaW5l4oCRdHVuaW5nIHRo
ZSB1c2VyIGV4cGVyaWVuY2Ugd2hpbGUgYWxzbyBrZWVwaW5nIGFuIGV5ZSBv
biB0aGUgYmlnIG1pbGVzdG9uZTogc2hpcHBpbmcgdGhlIGFwcC4gIFxuXG4j
IyMjIFRoZSBMb2dvIERlYmF0ZSBLaWNrcyBPZmYgIFxuRGF2aWQgb3BlbmVk
IHRoZSBkaXNjdXNzaW9uIHdpdGggW2EgbmV3IGlzc3VlXSggLzczNTQ2NDc4
NS9jYXJkcy82MTMzMjUzMzQpIGFib3V0IHRoZSBsb2dvIGJlaW5nIHRvbyBz
bWFsbCwgYW5kIGJvdGggS2V2aW4gYW5kIEpaIHdlcmUgYnJvdWdodCBpbiB0
byB3ZWlnaCBpbi4gV2l0aCBmaXZlIGNvbW1lbnRzIGFscmVhZHksIGl04oCZ
cyBzaGFwaW5nIHVwIHRvIGJlIGEgbGl2ZWx5IGJhY2vigJFhbmTigJFmb3J0
aC4gIFxuXG4jIyMjIEJyb2tlbiBMYXlvdXQgR2V0cyBBdHRlbnRpb24gIFxu
QSBtYWpvciBjb25jZXJuIHN1cmZhY2VkIHdpdGggW3RoZSBsYXlvdXQgaXNz
dWVdKCAvNzM1NDY0Nzg1L2NhcmRzLzk3NjkwNzIzNCksIHJlcG9ydGVkIGJ5
IERhdmlkIGFuZCBhc3NpZ25lZCB0byBKWi4gRGF2aWQgbGF0ZXIgYWRkZWQg
YSBjb21tZW50IG5vdGluZyB0aGF0IHRleHQgb3ZlcmZsb3cgd2FzIG1lc3Np
bmcgd2l0aCB0aGUgY29udGFpbmVyLCBoaWdobGlnaHRpbmcgdGhlIHNjYWxl
IG9mIGNsZWFudXAgbmVlZGVkLiAgXG5cbiMjIyMgVGV4dCBTaXplIFNwYXJr
cyBBbm90aGVyIElzc3VlICBcbktldmluIHB1Ymxpc2hlZCBbYSBjYXJkXSgg
LzczNTQ2NDc4NS9jYXJkcy85OTkwMDgxOTkpIHBvaW50aW5nIG91dCB0aGF0
IHRleHQgaXMgdG9vIHNtYWxsLiBUaGlzIG9uZSBtb3ZlZCBzdHJhaWdodCB0
byDigJxJbiBwcm9ncmVzcyzigJ0gc3VnZ2VzdGluZyBpdOKAmXMgYmVpbmcg
dGFja2xlZCBxdWlja2x5LiAgXG5cbiMjIyMgQXNzaWdubWVudCBCcmluZ3Mg
TW9yZSBFeWVzIHRvIHRoZSBMb2dvICBcblRoZSBsb2dvIGlzc3VlIGhlYXRl
ZCB1cCBmdXJ0aGVyIHdoZW4gaXQgd2FzIGZvcm1hbGx5IGFzc2lnbmVkIHRv
IEtldmluIGFuZCBKWiwgc2lnbmFsaW5nIHRoYXQgaXTigJlzIG5vdCBqdXN0
IGEgcGFzc2luZyBjb21tZW50IGJ1dCBzb21ldGhpbmcgdGhlIHRlYW0gd2Fu
dHMgc29sdmVkLiAgXG5cbiMjIyMgQSBQdXNoIFRvd2FyZCBTaGlwcGluZyAg
XG5LZXZpbiBsb2dnZWQgdGhlIHVsdGltYXRlIHJlbWluZGVy4oCUW2EgY2Fy
ZCBhYm91dCBzaGlwcGluZyB0aGUgYXBwXSggLzczNTQ2NDc4NS9jYXJkcy83
NTY4MTU2NTIpLiBIZSBsYXRlciBjbG9zZWQgaXQgaGltc2VsZiwgbWFya2lu
ZyBhbiBvZmZpY2lhbCBtaWxlc3RvbmUgYW5kIHVuZGVyc2NvcmluZyB0aGUg
dGVhbeKAmXMgZm9yd2FyZCBtb21lbnR1bSBldmVuIGFtaWQgZGVzaWduIHR3
ZWFrcy4gICIsCiAgICAgICAgInJlZnVzYWwiOiBudWxsLAogICAgICAgICJh
bm5vdGF0aW9ucyI6IFtdCiAgICAgIH0sCiAgICAgICJsb2dwcm9icyI6IG51
bGwsCiAgICAgICJmaW5pc2hfcmVhc29uIjogInN0b3AiCiAgICB9CiAgXSwK
ICAidXNhZ2UiOiB7CiAgICAicHJvbXB0X3Rva2VucyI6IDE1NDksCiAgICAi
Y29tcGxldGlvbl90b2tlbnMiOiAzMzMsCiAgICAidG90YWxfdG9rZW5zIjog
MTg4MiwKICAgICJwcm9tcHRfdG9rZW5zX2RldGFpbHMiOiB7CiAgICAgICJj
YWNoZWRfdG9rZW5zIjogMCwKICAgICAgImF1ZGlvX3Rva2VucyI6IDAKICAg
IH0sCiAgICAiY29tcGxldGlvbl90b2tlbnNfZGV0YWlscyI6IHsKICAgICAg
InJlYXNvbmluZ190b2tlbnMiOiAwLAogICAgICAiYXVkaW9fdG9rZW5zIjog
MCwKICAgICAgImFjY2VwdGVkX3ByZWRpY3Rpb25fdG9rZW5zIjogMCwKICAg
ICAgInJlamVjdGVkX3ByZWRpY3Rpb25fdG9rZW5zIjogMAogICAgfQogIH0s
CiAgInNlcnZpY2VfdGllciI6ICJkZWZhdWx0IiwKICAic3lzdGVtX2Zpbmdl
cnByaW50IjogImZwXzllODIyZDUyMWQiCn0K
recorded_at: Sun, 07 Sep 2025 14:15:10 GMT
recorded_with: VCR 6.3.1
@@ -4064,7 +4064,7 @@ http_interactions:
body:
encoding: UTF-8
base64_string: |
eyJtb2RlbCI6ImNoYXRncHQtNG8tbGF0ZXN0IiwibWVzc2FnZXMiOlt7InJv
eyJtb2RlbCI6ImdwdC01LWNoYXQtbGF0ZXN0IiwibWVzc2FnZXMiOlt7InJv
bGUiOiJkZXZlbG9wZXIiLCJjb250ZW50IjoiSGVscCBtZSBtYWtlIHNlbnNl
IG9mIHRoZSB3ZWVr4oCZcyBhY3Rpdml0eSBpbiBhIG5ld3Mgc3R5bGUgZm9y
bWF0IHdpdGggYm9sZCBoZWFkbGluZXMgYW5kIHNob3J0IHN1bW1hcmllcy5c
@@ -4170,32 +4170,20 @@ http_interactions:
KiBDcmVhdGVkIGF0OiA8VElNRT59XG4qIFBhdGg6IC83MzU0NjQ3ODUvY2Fy
ZHMvOTc2OTA3MjM0I2NvbW1lbnRfODI3NDUwNjg0XG5FTkQgT0YgQ09NTUVO
VCA4Mjc0NTA2ODRcblxuRU5EIE9GIEVWRU5UIDY1NDQ3NDk3M1xuXG5cbkJF
R0lOIE9GIEVWRU5UIDY4NTg4OTI5M1xuIyMgRXZlbnQgY2FyZF9hc3NpZ25l
ZCAoQ2FyZCA2MTMzMjUzMzQpKVxuXG4qIENyZWF0ZWQgYXQ6IDxUSU1FPlxu
KiBDcmVhdGVkIGJ5OiBEYXZpZFxuXG5CRUdJTiBPRiBDQVJEIDYxMzMyNTMz
NFxuXG4qKlRpdGxlOioqIFRoZSBsb2dvIGlzbid0IGJpZyBlbm91Z2hcbioq
RGVzY3JpcHRpb246KipcblxuXG5cbiMjIyMgTWV0YWRhdGFcblxuKiBJZDog
NjEzMzI1MzM0XG4qIENyZWF0ZWQgYnk6IERhdmlkfVxuKiBBc3NpZ25lZCB0
bzogS2V2aW4sIEpafVxuKiBXb3JrZmxvdyBzdGFnZTogVHJpYWdlXG4qIENy
ZWF0ZWQgYXQ6IDxUSU1FPn1cbiogQ2xvc2VkOiBmYWxzZVxuKiBDbG9zZWQg
Ynk6IFxuKiBDbG9zZWQgYXQ6IFxuKiBDb2xsZWN0aW9uIGlkOiA2OTMxNjk4
R0lOIE9GIEVWRU5UIDc4NDkzNzI0OFxuIyMgRXZlbnQgY2FyZF9wdWJsaXNo
ZWQgKENhcmQgNzU2ODE1NjUyKSlcblxuKiBDcmVhdGVkIGF0OiA8VElNRT5c
biogQ3JlYXRlZCBieTogS2V2aW5cblxuQkVHSU4gT0YgQ0FSRCA3NTY4MTU2
NTJcblxuKipUaXRsZToqKiBXZSBuZWVkIHRvIHNoaXAgdGhlIGFwcFxuKipE
ZXNjcmlwdGlvbjoqKlxuXG5cblxuIyMjIyBNZXRhZGF0YVxuXG4qIElkOiA3
NTY4MTU2NTJcbiogQ3JlYXRlZCBieTogS2V2aW59XG4qIEFzc2lnbmVkIHRv
OiB9XG4qIFdvcmtmbG93IHN0YWdlOiBUcmlhZ2VcbiogQ3JlYXRlZCBhdDog
PFRJTUU+fVxuKiBDbG9zZWQ6IHRydWVcbiogQ2xvc2VkIGJ5OiBLZXZpblxu
KiBDbG9zZWQgYXQ6IDxUSU1FPlxuKiBDb2xsZWN0aW9uIGlkOiA2OTMxNjk4
NDBcbiogQ29sbGVjdGlvbiBuYW1lOiBXcml0ZWJvb2tcbiogTnVtYmVyIG9m
IGNvbW1lbnRzOiA1XG4qIFBhdGg6IC83MzU0NjQ3ODUvY2FyZHMvNjEzMzI1
MzM0XG5cbkVORCBPRiBDQVJEIDYxMzMyNTMzNFxuXG5FTkQgT0YgRVZFTlQg
Njg1ODg5MjkzXG5cblxuQkVHSU4gT0YgRVZFTlQgNzg0OTM3MjQ4XG4jIyBF
dmVudCBjYXJkX3B1Ymxpc2hlZCAoQ2FyZCA3NTY4MTU2NTIpKVxuXG4qIENy
ZWF0ZWQgYXQ6IDxUSU1FPlxuKiBDcmVhdGVkIGJ5OiBLZXZpblxuXG5CRUdJ
TiBPRiBDQVJEIDc1NjgxNTY1MlxuXG4qKlRpdGxlOioqIFdlIG5lZWQgdG8g
c2hpcCB0aGUgYXBwXG4qKkRlc2NyaXB0aW9uOioqXG5cblxuXG4jIyMjIE1l
dGFkYXRhXG5cbiogSWQ6IDc1NjgxNTY1MlxuKiBDcmVhdGVkIGJ5OiBLZXZp
bn1cbiogQXNzaWduZWQgdG86IH1cbiogV29ya2Zsb3cgc3RhZ2U6IFRyaWFn
ZVxuKiBDcmVhdGVkIGF0OiA8VElNRT59XG4qIENsb3NlZDogdHJ1ZVxuKiBD
bG9zZWQgYnk6IEtldmluXG4qIENsb3NlZCBhdDogPFRJTUU+XG4qIENvbGxl
Y3Rpb24gaWQ6IDY5MzE2OTg0MFxuKiBDb2xsZWN0aW9uIG5hbWU6IFdyaXRl
Ym9va1xuKiBOdW1iZXIgb2YgY29tbWVudHM6IDFcbiogUGF0aDogLzczNTQ2
NDc4NS9jYXJkcy83NTY4MTU2NTJcblxuRU5EIE9GIENBUkQgNzU2ODE1NjUy
XG5cbkVORCBPRiBFVkVOVCA3ODQ5MzcyNDhcbiJ9XSwic3RyZWFtIjpmYWxz
ZX0=
IGNvbW1lbnRzOiAxXG4qIFBhdGg6IC83MzU0NjQ3ODUvY2FyZHMvNzU2ODE1
NjUyXG5cbkVORCBPRiBDQVJEIDc1NjgxNTY1MlxuXG5FTkQgT0YgRVZFTlQg
Nzg0OTM3MjQ4XG4ifV0sInN0cmVhbSI6ZmFsc2UsInRlbXBlcmF0dXJlIjox
LjB9
headers:
User-Agent:
- Faraday v2.13.4
@@ -4213,7 +4201,7 @@ http_interactions:
message: OK
headers:
Date:
- Fri, 12 Sep 2025 03:30:52 GMT
- Fri, 12 Sep 2025 14:15:22 GMT
Content-Type:
- application/json
Transfer-Encoding:
@@ -4225,13 +4213,13 @@ http_interactions:
Openai-Organization:
- 37signals-u7qhwk
Openai-Processing-Ms:
- '3079'
- '4602'
Openai-Project:
- proj_M0FFIqFFeNEpzhhgv64oFzt1
Openai-Version:
- '2020-10-01'
X-Envoy-Upstream-Service-Time:
- '3283'
- '4630'
X-Ratelimit-Limit-Requests:
- '10000'
X-Ratelimit-Limit-Tokens:
@@ -4239,22 +4227,22 @@ http_interactions:
X-Ratelimit-Remaining-Requests:
- '9999'
X-Ratelimit-Remaining-Tokens:
- '1998554'
- '1998694'
X-Ratelimit-Reset-Requests:
- 6ms
X-Ratelimit-Reset-Tokens:
- 43ms
- 39ms
X-Request-Id:
- req_35acb8c0c6ca477e8e6c8dfb2f12c311
- req_193226cb60ae4c94b1eb0a0f277dcd59
X-Openai-Proxy-Wasm:
- v0.1
Cf-Cache-Status:
- DYNAMIC
Set-Cookie:
- __cf_bm=uKfiCPJgPzTn2NZMt_j0V1yHkrNEH9aCM0m9WTqmJHY-1757647852-1.0.1.1-EmBZRm4TRGVQ4Rvi_DNBvOdjvIQXToQ.dzinPTOhcA29nb7fxsLX2AC_HAaIQpn7kizSgQeBDxDBlO6rXnWyhvU0J2uocU1ASAGaASAuHSg;
path=/; expires=Fri, 12-Sep-25 04:00:52 GMT; domain=.api.openai.com; HttpOnly;
- __cf_bm=BH06e9X0SanXAez8pYyzcVuh7sIKejq64.lvN46Q5_8-1757686522-1.0.1.1-LAsg71RlEXqEdvJ28hzeSBFntevEvP.061y.UOmCSob427TvmYfdlJCJzh7IR8GCMfBb1oMU0PwUM5Fa37xQLqXxXTkkdEcpIOlescBvXCU;
path=/; expires=Fri, 12-Sep-25 14:45:22 GMT; domain=.api.openai.com; HttpOnly;
Secure; SameSite=None
- _cfuvid=MUwczv5Or06sHlllf2C_b2MXAI2.mn2XytA5K6FZKNE-1757647852074-0.0.1.1-604800000;
- _cfuvid=lILIQ8LtDl5q7SUdbESututLzgDWbz8TUylL2wEzJu8-1757686522402-0.0.1.1-604800000;
path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None
Strict-Transport-Security:
- max-age=31536000; includeSubDomains; preload
@@ -4263,65 +4251,56 @@ http_interactions:
Server:
- cloudflare
Cf-Ray:
- 97dc540e7f9a6c49-DFW
- 97e0041f1a05c90a-MAD
Alt-Svc:
- h3=":443"; ma=86400
body:
encoding: ASCII-8BIT
base64_string: |
ewogICJpZCI6ICJjaGF0Y21wbC1DRW9tbm9EaUhRTzFSZ1M3NGcyOW5RcHA5
TEtQTiIsCiAgIm9iamVjdCI6ICJjaGF0LmNvbXBsZXRpb24iLAogICJjcmVh
dGVkIjogMTc1NzY0Nzg0OSwKICAibW9kZWwiOiAiY2hhdGdwdC00by1sYXRl
ewogICJpZCI6ICJjaGF0Y21wbC1DRXlxVGoyd2hnRFJ0ZXJZcG9icnFUM2pF
bk5qbyIsCiAgIm9iamVjdCI6ICJjaGF0LmNvbXBsZXRpb24iLAogICJjcmVh
dGVkIjogMTc1NzY4NjUxNywKICAibW9kZWwiOiAiZ3B0LTUtY2hhdC1sYXRl
c3QiLAogICJjaG9pY2VzIjogWwogICAgewogICAgICAiaW5kZXgiOiAwLAog
ICAgICAibWVzc2FnZSI6IHsKICAgICAgICAicm9sZSI6ICJhc3Npc3RhbnQi
LAogICAgICAgICJjb250ZW50IjogIiMjIyBWaXN1YWwgVHdlYWtzIGFuZCBT
aGlwLVJlYWRpbmVzcyBEb21pbmF0ZSB0aGUgV2VlayAgXG5Gcm9tIGZpbmUt
dHVuaW5nIGZvbnQgc2l6ZXMgdG8gZmxhZ2dpbmcgYnJva2VuIGxheW91dHMs
IHRoaXMgd2VlayByZXZvbHZlZCBhcm91bmQgdmlzdWFsIHBvbGlzaCBhbmQg
YSBiaWctcGljdHVyZSBwdXNoIHRvIG1vdmUgdGhlIGFwcCBjbG9zZXIgdG8g
bGF1bmNoLiBBIGhhbmRmdWwgb2YgbmV3IGlzc3VlcyBvcGVuZWQgdGhlIGRv
b3IgdG8ga2V5IFVJIGFkanVzdG1lbnRzLCB3aGlsZSBvbmUgdGFzayBtYWRl
IGl0IGFsbCB0aGUgd2F5IHRvIHRoZSBmaW5pc2ggbGluZS5cblxuIyMjIyBU
d28gRXllcyBvbiB0aGUgTG9nbyAgXG5BIGNvbmNlcm4gdGhhdCBb4oCcVGhl
IGxvZ28gaXNuJ3QgYmlnIGVub3VnaOKAnV0oLzczNTQ2NDc4NS9jYXJkcy82
MTMzMjUzMzQpIHdhcyByYWlzZWQgYnkgRGF2aWQgYW5kIHF1aWNrbHkgZ3Jh
YmJlZCBhdHRlbnRpb24uIEJvdGggS2V2aW4gYW5kIEpaIHdlcmUgYXNzaWdu
ZWQgdG8gdGFrZSBhIGxvb2ssIHNpZ25hbGluZyB0aGF0IGl04oCZcyBhIHNo
YXJlZCBwcmlvcml0eS4gSXQgcmVtYWlucyBpbiB0cmlhZ2UgZm9yIG5vdywg
d2l0aCBzZXZlcmFsIGNvbW1lbnRzIGFscmVhZHkgYXR0YWNoZWQuXG5cbiMj
IyMgTGF5b3V0IElzc3VlcyBTdXJmYWNlICBcbkEgbmV3IGNhcmQgdGl0bGVk
IFvigJxMYXlvdXQgaXMgYnJva2Vu4oCdXSgvNzM1NDY0Nzg1L2NhcmRzLzk3
NjkwNzIzNCkgc3VnZ2VzdHMgc29tZSB2aXN1YWwgZGlzYXJyYXkgaW4gdGhl
IFVJLiBEYXZpZCBub3RlZCBpbiBhIGNvbW1lbnQgdGhhdCBcInRoZSB0ZXh0
IGlzIG92ZXJmbG93aW5nIHRoZSBjb250YWluZXJcIiDigJQgYSBjbGVhciBz
aWduIHNvbWV0aGluZydzIG1pc2FsaWduZWQuIFRoaXMgb25l4oCZcyBhbHNv
IGluIHRyaWFnZSBhbmQgYXNzaWduZWQgdG8gSlogZm9yIGZvbGxvdy11cC5c
blxuIyMjIyBUaGUgVGV4dCBJcyBDcmFtcGVkICBcbk1lYW53aGlsZSwgS2V2
aW4gZmxhZ2dlZCBhIHNlcGFyYXRlIHJlYWRhYmlsaXR5IGlzc3VlOiBb4oCc
VGhlIHRleHQgaXMgdG9vIHNtYWxs4oCdXSgvNzM1NDY0Nzg1L2NhcmRzLzk5
OTAwODE5OSkuIFRoYXQgY2FyZCBza2lwcGVkIHN0cmFpZ2h0IHRvIFwiSW4g
cHJvZ3Jlc3MsXCIgaW5kaWNhdGluZyBpdOKAmXMgYWxyZWFkeSBiZWluZyB0
YWNrbGVkLiBObyBmb3JtYWwgYXNzaWduZWVzIHlldCwgYnV0IHNvbWVvbmXi
gJlzIGdvdCBhbiBleWUgb24gZml4aW5nIGl0LlxuXG4jIyMjIFRoZSBGaW5h
bCBQdXNoIEdvdCBDbG9zZWQgIFxuT25lIGltcG9ydGFudCB0YXNrIHNhdyBj
bG9zdXJlIHRoaXMgd2VlazogW+KAnFdlIG5lZWQgdG8gc2hpcCB0aGUgYXBw
4oCdXSgvNzM1NDY0Nzg1L2NhcmRzLzc1NjgxNTY1Mikgd2FzIG9wZW5lZCBh
bmQgdGhlbiB3cmFwcGVkIHVwIGJ5IEtldmluLCBzdWdnZXN0aW5nIGEgYnJv
YWRlciByZWFkaW5lc3MgbWlsZXN0b25lLiBUaGF0IGNsb3N1cmUgaGludHMg
d2UgbWlnaHQgYmUganVzdCBhYm91dCB0aGVyZeKAlG9yIGF0IGxlYXN0IHRo
aW5raW5nIHNlcmlvdXNseSBhYm91dCBsYXVuY2ggdGltaW5nLiIsCiAgICAg
ICAgInJlZnVzYWwiOiBudWxsLAogICAgICAgICJhbm5vdGF0aW9ucyI6IFtd
CiAgICAgIH0sCiAgICAgICJsb2dwcm9icyI6IG51bGwsCiAgICAgICJmaW5p
c2hfcmVhc29uIjogInN0b3AiCiAgICB9CiAgXSwKICAidXNhZ2UiOiB7CiAg
ICAicHJvbXB0X3Rva2VucyI6IDE3MzUsCiAgICAiY29tcGxldGlvbl90b2tl
bnMiOiAzNTQsCiAgICAidG90YWxfdG9rZW5zIjogMjA4OSwKICAgICJwcm9t
cHRfdG9rZW5zX2RldGFpbHMiOiB7CiAgICAgICJjYWNoZWRfdG9rZW5zIjog
MCwKICAgICAgImF1ZGlvX3Rva2VucyI6IDAKICAgIH0sCiAgICAiY29tcGxl
dGlvbl90b2tlbnNfZGV0YWlscyI6IHsKICAgICAgInJlYXNvbmluZ190b2tl
bnMiOiAwLAogICAgICAiYXVkaW9fdG9rZW5zIjogMCwKICAgICAgImFjY2Vw
dGVkX3ByZWRpY3Rpb25fdG9rZW5zIjogMCwKICAgICAgInJlamVjdGVkX3By
ZWRpY3Rpb25fdG9rZW5zIjogMAogICAgfQogIH0sCiAgInNlcnZpY2VfdGll
ciI6ICJkZWZhdWx0IiwKICAic3lzdGVtX2ZpbmdlcnByaW50IjogImZwX2Qz
YTA4MzhmYjgiCn0K
recorded_at: Sun, 07 Sep 2025 03:30:48 GMT
LAogICAgICAgICJjb250ZW50IjogIiMjIyBEZXNpZ24gRGV0YWlscyBUYWtl
IENlbnRlciBTdGFnZSAgXG5UaGlzIHdlZWsgd2FzIGFsbCBhYm91dCB0aGUg
bGl0dGxlIHRoaW5ncyBhZGRpbmcgdXDigJRsb2dvcywgdGV4dCBzaXplcywg
YW5kIGxheW91dHMgYWxsIHNwYXJrZWQgbmV3IGRpc2N1c3Npb25zIGFuZCB0
YXNrcywgd2hpbGUgYSBwdXNoIHRvIGFjdHVhbGx5IHNoaXAgdGhlIGFwcCBm
aW5hbGx5IHNhdyBtb3ZlbWVudC5cblxuIyMjIyBMb2dvIEdldHMgQXR0ZW50
aW9uICBcbkRhdmlkIHJhaXNlZCBhIHZpc3VhbCBjb25jZXJuIHdpdGggW+KA
nFRoZSBsb2dvIGlzbid0IGJpZyBlbm91Z2jigJ1dKC83MzU0NjQ3ODUvY2Fy
ZHMvNjEzMzI1MzM0KSwgYXNzaWduaW5nIGJvdGggS2V2aW4gYW5kIEpaIHRv
IHRha2UgYSBsb29rLiBUaGUgY2FyZCBxdWlja2x5IGJlY2FtZSBhIGJ1c3kg
dGhyZWFkIHdpdGggbXVsdGlwbGUgY29tbWVudHMuXG5cbiMjIyMgTGF5b3V0
IFByb2JsZW1zIFN1cmZhY2UgIFxuQW5vdGhlciB0aWNrZXQgZnJvbSBEYXZp
ZCBmbGFnZ2VkIHRoYXQgdGhlIFvigJxMYXlvdXQgaXMgYnJva2Vu4oCdXSgv
NzM1NDY0Nzg1L2NhcmRzLzk3NjkwNzIzNCkuIEpaIHRvb2sgb3duZXJzaGlw
LCBhbmQgY29udmVyc2F0aW9uIGZvbGxvd2VkIHdoZW4gRGF2aWQgbm90ZWQg
dGhhdCB0ZXh0IHdhcyBvdmVyZmxvd2luZyBpdHMgY29udGFpbmVyLlxuXG4j
IyMjIFRleHQgU2l6ZSBGZWVscyBPZmYgIFxuS2V2aW4gY2hpbWVkIGluIHdp
dGggaGlzIG93biBkZXNpZ24gY3JpdGlxdWUsIG9wZW5pbmcgW+KAnFRoZSB0
ZXh0IGlzIHRvbyBzbWFsbOKAnV0oLzczNTQ2NDc4NS9jYXJkcy85OTkwMDgx
OTkpLiBUaGlzIG9uZSBpcyBhbHJlYWR5IG1hcmtlZCAqaW4gcHJvZ3Jlc3Mq
LCBzbyBmaXhlcyBtYXkgYmUgb24gdGhlIHdheSBzb29uLlxuXG4jIyMjIFNo
aXBwaW5nIEJlY29tZXMgYSBQcmlvcml0eSAgXG5LZXZpbiBhbHNvIHB1Ymxp
c2hlZCBb4oCcV2UgbmVlZCB0byBzaGlwIHRoZSBhcHDigJ1dKC83MzU0NjQ3
ODUvY2FyZHMvNzU2ODE1NjUyKS4gVW5saWtlIHRoZSBkZXNpZ24gbml0cGlj
a3MsIHRoaXMgb25lIGN1dCB0byB0aGUgY2hhc2XigJRpdCB3YXMgcXVpY2ts
eSBjbG9zZWQgYnkgS2V2aW4gYSB3ZWVrIGxhdGVyLCBzaWduYWxpbmcgYXQg
bGVhc3Qgc29tZSBkZWNpc2l2ZSBtb3ZlbWVudCBvbiByZWxlYXNlLiIsCiAg
ICAgICAgInJlZnVzYWwiOiBudWxsLAogICAgICAgICJhbm5vdGF0aW9ucyI6
IFtdCiAgICAgIH0sCiAgICAgICJsb2dwcm9icyI6IG51bGwsCiAgICAgICJm
aW5pc2hfcmVhc29uIjogInN0b3AiCiAgICB9CiAgXSwKICAidXNhZ2UiOiB7
CiAgICAicHJvbXB0X3Rva2VucyI6IDE1NDksCiAgICAiY29tcGxldGlvbl90
b2tlbnMiOiAyNjAsCiAgICAidG90YWxfdG9rZW5zIjogMTgwOSwKICAgICJw
cm9tcHRfdG9rZW5zX2RldGFpbHMiOiB7CiAgICAgICJjYWNoZWRfdG9rZW5z
IjogMTUzNiwKICAgICAgImF1ZGlvX3Rva2VucyI6IDAKICAgIH0sCiAgICAi
Y29tcGxldGlvbl90b2tlbnNfZGV0YWlscyI6IHsKICAgICAgInJlYXNvbmlu
Z190b2tlbnMiOiAwLAogICAgICAiYXVkaW9fdG9rZW5zIjogMCwKICAgICAg
ImFjY2VwdGVkX3ByZWRpY3Rpb25fdG9rZW5zIjogMCwKICAgICAgInJlamVj
dGVkX3ByZWRpY3Rpb25fdG9rZW5zIjogMAogICAgfQogIH0sCiAgInNlcnZp
Y2VfdGllciI6ICJkZWZhdWx0IiwKICAic3lzdGVtX2ZpbmdlcnByaW50Ijog
ImZwXzllODIyZDUyMWQiCn0K
recorded_at: Sun, 07 Sep 2025 14:15:17 GMT
recorded_with: VCR 6.3.1