context.dev 2.4.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -0
  3. data/README.md +1 -1
  4. data/lib/context_dev/client.rb +4 -0
  5. data/lib/context_dev/models/ai_extract_product_params.rb +9 -1
  6. data/lib/context_dev/models/ai_extract_products_params.rb +18 -2
  7. data/lib/context_dev/models/batch_cancel_params.rb +22 -0
  8. data/lib/context_dev/models/batch_cancel_response.rb +354 -0
  9. data/lib/context_dev/models/batch_get_results_params.rb +42 -0
  10. data/lib/context_dev/models/batch_get_results_response.rb +463 -0
  11. data/lib/context_dev/models/batch_list_params.rb +94 -0
  12. data/lib/context_dev/models/batch_list_response.rb +388 -0
  13. data/lib/context_dev/models/batch_retrieve_params.rb +22 -0
  14. data/lib/context_dev/models/batch_retrieve_response.rb +390 -0
  15. data/lib/context_dev/models/batch_submit_params.rb +56 -0
  16. data/lib/context_dev/models/batch_submit_response.rb +614 -0
  17. data/lib/context_dev/models/brand_retrieve_params.rb +109 -22
  18. data/lib/context_dev/models/brand_retrieve_response.rb +4 -6
  19. data/lib/context_dev/models/brand_retrieve_simplified_params.rb +32 -3
  20. data/lib/context_dev/models/error.rb +26 -0
  21. data/lib/context_dev/models/error_count.rb +26 -0
  22. data/lib/context_dev/models/industry_retrieve_naics_params.rb +11 -1
  23. data/lib/context_dev/models/industry_retrieve_sic_params.rb +11 -1
  24. data/lib/context_dev/models/monitor_create_params.rb +147 -132
  25. data/lib/context_dev/models/monitor_create_response.rb +40 -15
  26. data/lib/context_dev/models/monitor_get_credit_usage_params.rb +30 -0
  27. data/lib/context_dev/models/monitor_get_credit_usage_response.rb +59 -0
  28. data/lib/context_dev/models/monitor_get_limits_params.rb +14 -0
  29. data/lib/context_dev/models/monitor_get_limits_response.rb +52 -0
  30. data/lib/context_dev/models/monitor_list_account_changes_params.rb +16 -7
  31. data/lib/context_dev/models/monitor_list_account_changes_response.rb +2 -1
  32. data/lib/context_dev/models/monitor_list_account_runs_params.rb +7 -10
  33. data/lib/context_dev/models/monitor_list_changes_params.rb +8 -4
  34. data/lib/context_dev/models/monitor_list_changes_response.rb +2 -1
  35. data/lib/context_dev/models/monitor_list_params.rb +18 -19
  36. data/lib/context_dev/models/monitor_list_response.rb +27 -12
  37. data/lib/context_dev/models/monitor_list_runs_params.rb +7 -10
  38. data/lib/context_dev/models/monitor_retrieve_change_response.rb +2 -1
  39. data/lib/context_dev/models/monitor_retrieve_response.rb +27 -12
  40. data/lib/context_dev/models/monitor_update_params.rb +27 -12
  41. data/lib/context_dev/models/monitor_update_response.rb +27 -12
  42. data/lib/context_dev/models/parse_handle_params.rb +199 -33
  43. data/lib/context_dev/models/utility_prefetch_params.rb +9 -1
  44. data/lib/context_dev/models/web_extract_competitors_params.rb +11 -1
  45. data/lib/context_dev/models/web_extract_fonts_params.rb +14 -4
  46. data/lib/context_dev/models/web_extract_params.rb +19 -1
  47. data/lib/context_dev/models/web_extract_styleguide_params.rb +14 -4
  48. data/lib/context_dev/models/web_screenshot_params.rb +69 -18
  49. data/lib/context_dev/models/web_screenshot_response.rb +3 -2
  50. data/lib/context_dev/models/web_search_params.rb +9 -1
  51. data/lib/context_dev/models/web_web_crawl_md_params.rb +34 -1
  52. data/lib/context_dev/models/web_web_scrape_html_params.rb +268 -29
  53. data/lib/context_dev/models/web_web_scrape_html_response.rb +93 -1
  54. data/lib/context_dev/models/web_web_scrape_images_params.rb +208 -19
  55. data/lib/context_dev/models/web_web_scrape_md_params.rb +352 -38
  56. data/lib/context_dev/models/web_web_scrape_md_response.rb +93 -1
  57. data/lib/context_dev/models/web_web_scrape_sitemap_params.rb +45 -1
  58. data/lib/context_dev/models.rb +18 -0
  59. data/lib/context_dev/resources/ai.rb +3 -1
  60. data/lib/context_dev/resources/batch.rb +155 -0
  61. data/lib/context_dev/resources/brand.rb +6 -2
  62. data/lib/context_dev/resources/industry.rb +6 -2
  63. data/lib/context_dev/resources/monitors.rb +75 -37
  64. data/lib/context_dev/resources/parse.rb +15 -11
  65. data/lib/context_dev/resources/utility.rb +3 -1
  66. data/lib/context_dev/resources/web.rb +104 -55
  67. data/lib/context_dev/version.rb +1 -1
  68. data/lib/context_dev.rb +17 -0
  69. data/rbi/context_dev/client.rbi +3 -0
  70. data/rbi/context_dev/models/ai_extract_product_params.rbi +11 -0
  71. data/rbi/context_dev/models/ai_extract_products_params.rbi +22 -0
  72. data/rbi/context_dev/models/batch_cancel_params.rbi +40 -0
  73. data/rbi/context_dev/models/batch_cancel_response.rbi +642 -0
  74. data/rbi/context_dev/models/batch_get_results_params.rbi +70 -0
  75. data/rbi/context_dev/models/batch_get_results_response.rbi +848 -0
  76. data/rbi/context_dev/models/batch_list_params.rbi +166 -0
  77. data/rbi/context_dev/models/batch_list_response.rbi +738 -0
  78. data/rbi/context_dev/models/batch_retrieve_params.rbi +40 -0
  79. data/rbi/context_dev/models/batch_retrieve_response.rbi +707 -0
  80. data/rbi/context_dev/models/batch_submit_params.rbi +105 -0
  81. data/rbi/context_dev/models/batch_submit_response.rbi +1330 -0
  82. data/rbi/context_dev/models/brand_retrieve_params.rbi +175 -64
  83. data/rbi/context_dev/models/brand_retrieve_response.rbi +8 -11
  84. data/rbi/context_dev/models/brand_retrieve_simplified_params.rbi +68 -5
  85. data/rbi/context_dev/models/error.rbi +32 -0
  86. data/rbi/context_dev/models/error_count.rbi +34 -0
  87. data/rbi/context_dev/models/industry_retrieve_naics_params.rbi +15 -0
  88. data/rbi/context_dev/models/industry_retrieve_sic_params.rbi +15 -0
  89. data/rbi/context_dev/models/monitor_create_params.rbi +280 -246
  90. data/rbi/context_dev/models/monitor_create_response.rbi +44 -11
  91. data/rbi/context_dev/models/monitor_get_credit_usage_params.rbi +60 -0
  92. data/rbi/context_dev/models/monitor_get_credit_usage_response.rbi +111 -0
  93. data/rbi/context_dev/models/monitor_get_limits_params.rbi +30 -0
  94. data/rbi/context_dev/models/monitor_get_limits_response.rbi +105 -0
  95. data/rbi/context_dev/models/monitor_list_account_changes_params.rbi +16 -0
  96. data/rbi/context_dev/models/monitor_list_account_changes_response.rbi +2 -0
  97. data/rbi/context_dev/models/monitor_list_account_runs_params.rbi +7 -6
  98. data/rbi/context_dev/models/monitor_list_changes_params.rbi +8 -0
  99. data/rbi/context_dev/models/monitor_list_changes_response.rbi +2 -0
  100. data/rbi/context_dev/models/monitor_list_params.rbi +23 -31
  101. data/rbi/context_dev/models/monitor_list_response.rbi +30 -9
  102. data/rbi/context_dev/models/monitor_list_runs_params.rbi +7 -6
  103. data/rbi/context_dev/models/monitor_retrieve_change_response.rbi +2 -0
  104. data/rbi/context_dev/models/monitor_retrieve_response.rbi +30 -9
  105. data/rbi/context_dev/models/monitor_update_params.rbi +30 -9
  106. data/rbi/context_dev/models/monitor_update_response.rbi +30 -9
  107. data/rbi/context_dev/models/parse_handle_params.rbi +400 -46
  108. data/rbi/context_dev/models/utility_prefetch_params.rbi +11 -0
  109. data/rbi/context_dev/models/web_extract_competitors_params.rbi +15 -0
  110. data/rbi/context_dev/models/web_extract_fonts_params.rbi +19 -7
  111. data/rbi/context_dev/models/web_extract_params.rbi +26 -0
  112. data/rbi/context_dev/models/web_extract_styleguide_params.rbi +19 -7
  113. data/rbi/context_dev/models/web_screenshot_params.rbi +108 -37
  114. data/rbi/context_dev/models/web_screenshot_response.rbi +4 -2
  115. data/rbi/context_dev/models/web_search_params.rbi +11 -0
  116. data/rbi/context_dev/models/web_web_crawl_md_params.rbi +53 -0
  117. data/rbi/context_dev/models/web_web_scrape_html_params.rbi +554 -49
  118. data/rbi/context_dev/models/web_web_scrape_html_response.rbi +182 -0
  119. data/rbi/context_dev/models/web_web_scrape_images_params.rbi +426 -30
  120. data/rbi/context_dev/models/web_web_scrape_md_params.rbi +742 -61
  121. data/rbi/context_dev/models/web_web_scrape_md_response.rbi +180 -0
  122. data/rbi/context_dev/models/web_web_scrape_sitemap_params.rbi +82 -0
  123. data/rbi/context_dev/models.rbi +18 -0
  124. data/rbi/context_dev/resources/ai.rbi +3 -0
  125. data/rbi/context_dev/resources/batch.rbi +120 -0
  126. data/rbi/context_dev/resources/brand.rbi +9 -1
  127. data/rbi/context_dev/resources/industry.rbi +10 -0
  128. data/rbi/context_dev/resources/monitors.rbi +67 -23
  129. data/rbi/context_dev/resources/parse.rbi +46 -19
  130. data/rbi/context_dev/resources/utility.rbi +3 -0
  131. data/rbi/context_dev/resources/web.rbi +224 -48
  132. data/sig/context_dev/client.rbs +2 -0
  133. data/sig/context_dev/models/ai_extract_product_params.rbs +12 -1
  134. data/sig/context_dev/models/ai_extract_products_params.rbs +14 -0
  135. data/sig/context_dev/models/batch_cancel_params.rbs +23 -0
  136. data/sig/context_dev/models/batch_cancel_response.rbs +266 -0
  137. data/sig/context_dev/models/batch_get_results_params.rbs +36 -0
  138. data/sig/context_dev/models/batch_get_results_response.rbs +399 -0
  139. data/sig/context_dev/models/batch_list_params.rbs +94 -0
  140. data/sig/context_dev/models/batch_list_response.rbs +304 -0
  141. data/sig/context_dev/models/batch_retrieve_params.rbs +23 -0
  142. data/sig/context_dev/models/batch_retrieve_response.rbs +290 -0
  143. data/sig/context_dev/models/batch_submit_params.rbs +52 -0
  144. data/sig/context_dev/models/batch_submit_response.rbs +542 -0
  145. data/sig/context_dev/models/brand_retrieve_params.rbs +97 -51
  146. data/sig/context_dev/models/brand_retrieve_response.rbs +2 -2
  147. data/sig/context_dev/models/brand_retrieve_simplified_params.rbs +34 -5
  148. data/sig/context_dev/models/error.rbs +15 -0
  149. data/sig/context_dev/models/error_count.rbs +15 -0
  150. data/sig/context_dev/models/industry_retrieve_naics_params.rbs +7 -0
  151. data/sig/context_dev/models/industry_retrieve_sic_params.rbs +7 -0
  152. data/sig/context_dev/models/monitor_create_params.rbs +117 -97
  153. data/sig/context_dev/models/monitor_create_response.rbs +18 -1
  154. data/sig/context_dev/models/monitor_get_credit_usage_params.rbs +32 -0
  155. data/sig/context_dev/models/monitor_get_credit_usage_response.rbs +52 -0
  156. data/sig/context_dev/models/monitor_get_limits_params.rbs +15 -0
  157. data/sig/context_dev/models/monitor_get_limits_response.rbs +43 -0
  158. data/sig/context_dev/models/monitor_list_params.rbs +8 -14
  159. data/sig/context_dev/models/monitor_list_response.rbs +13 -1
  160. data/sig/context_dev/models/monitor_retrieve_response.rbs +13 -1
  161. data/sig/context_dev/models/monitor_update_params.rbs +13 -1
  162. data/sig/context_dev/models/monitor_update_response.rbs +13 -1
  163. data/sig/context_dev/models/parse_handle_params.rbs +124 -25
  164. data/sig/context_dev/models/utility_prefetch_params.rbs +7 -0
  165. data/sig/context_dev/models/web_extract_competitors_params.rbs +12 -1
  166. data/sig/context_dev/models/web_extract_fonts_params.rbs +10 -5
  167. data/sig/context_dev/models/web_extract_params.rbs +14 -0
  168. data/sig/context_dev/models/web_extract_styleguide_params.rbs +10 -5
  169. data/sig/context_dev/models/web_screenshot_params.rbs +41 -20
  170. data/sig/context_dev/models/web_search_params.rbs +7 -0
  171. data/sig/context_dev/models/web_web_crawl_md_params.rbs +28 -1
  172. data/sig/context_dev/models/web_web_scrape_html_params.rbs +175 -47
  173. data/sig/context_dev/models/web_web_scrape_html_response.rbs +85 -0
  174. data/sig/context_dev/models/web_web_scrape_images_params.rbs +128 -38
  175. data/sig/context_dev/models/web_web_scrape_md_params.rbs +229 -62
  176. data/sig/context_dev/models/web_web_scrape_md_response.rbs +85 -0
  177. data/sig/context_dev/models/web_web_scrape_sitemap_params.rbs +35 -1
  178. data/sig/context_dev/models.rbs +18 -0
  179. data/sig/context_dev/resources/ai.rbs +1 -0
  180. data/sig/context_dev/resources/batch.rbs +41 -0
  181. data/sig/context_dev/resources/brand.rbs +3 -1
  182. data/sig/context_dev/resources/industry.rbs +2 -0
  183. data/sig/context_dev/resources/monitors.rbs +14 -4
  184. data/sig/context_dev/resources/parse.rbs +8 -5
  185. data/sig/context_dev/resources/utility.rbs +1 -0
  186. data/sig/context_dev/resources/web.rbs +47 -26
  187. metadata +53 -2
@@ -11,31 +11,9 @@ module ContextDev
11
11
  T.any(ContextDev::MonitorCreateParams, ContextDev::Internal::AnyHash)
12
12
  end
13
13
 
14
- # Discriminated union describing how changes are detected.
15
- sig do
16
- returns(
17
- T.any(
18
- ContextDev::MonitorCreateParams::ChangeDetection::Exact,
19
- ContextDev::MonitorCreateParams::ChangeDetection::Semantic
20
- )
21
- )
22
- end
23
- attr_accessor :change_detection
24
-
25
14
  sig { returns(String) }
26
15
  attr_accessor :name
27
16
 
28
- # Run the monitor on a fixed interval defined by a frequency and a unit, e.g.
29
- # every 6 hours or every 2 days. The total interval (frequency × unit) must be
30
- # between 10 minutes and 1 year.
31
- sig { returns(ContextDev::MonitorCreateParams::Schedule) }
32
- attr_reader :schedule
33
-
34
- sig do
35
- params(schedule: ContextDev::MonitorCreateParams::Schedule::OrHash).void
36
- end
37
- attr_writer :schedule
38
-
39
17
  # Discriminated union describing what the monitor watches.
40
18
  sig do
41
19
  returns(
@@ -48,6 +26,30 @@ module ContextDev
48
26
  end
49
27
  attr_accessor :target
50
28
 
29
+ # Discriminated union describing how changes are detected.
30
+ sig do
31
+ returns(
32
+ T.nilable(
33
+ T.any(
34
+ ContextDev::MonitorCreateParams::ChangeDetection::Exact,
35
+ ContextDev::MonitorCreateParams::ChangeDetection::Semantic
36
+ )
37
+ )
38
+ )
39
+ end
40
+ attr_reader :change_detection
41
+
42
+ sig do
43
+ params(
44
+ change_detection:
45
+ T.any(
46
+ ContextDev::MonitorCreateParams::ChangeDetection::Exact::OrHash,
47
+ ContextDev::MonitorCreateParams::ChangeDetection::Semantic::OrHash
48
+ )
49
+ ).void
50
+ end
51
+ attr_writer :change_detection
52
+
51
53
  # Top-level monitor category. Always `web` today; the concrete behavior is
52
54
  # described by `target` and `change_detection`.
53
55
  sig do
@@ -58,7 +60,19 @@ module ContextDev
58
60
  sig { params(mode: ContextDev::MonitorCreateParams::Mode::OrSymbol).void }
59
61
  attr_writer :mode
60
62
 
63
+ # Run the monitor on a fixed interval defined by a frequency and a unit, e.g.
64
+ # every 6 hours or every 2 days. The total interval (frequency × unit) must be
65
+ # between 10 minutes and 1 year.
66
+ sig { returns(T.nilable(ContextDev::MonitorCreateParams::Schedule)) }
67
+ attr_reader :schedule
68
+
69
+ sig do
70
+ params(schedule: ContextDev::MonitorCreateParams::Schedule::OrHash).void
71
+ end
72
+ attr_writer :schedule
73
+
61
74
  # User-defined tags for grouping and filtering monitors and their changes.
75
+ # Duplicates are removed.
62
76
  sig { returns(T.nilable(T::Array[String])) }
63
77
  attr_reader :tags
64
78
 
@@ -77,39 +91,40 @@ module ContextDev
77
91
 
78
92
  sig do
79
93
  params(
80
- change_detection:
81
- T.any(
82
- ContextDev::MonitorCreateParams::ChangeDetection::Exact::OrHash,
83
- ContextDev::MonitorCreateParams::ChangeDetection::Semantic::OrHash
84
- ),
85
94
  name: String,
86
- schedule: ContextDev::MonitorCreateParams::Schedule::OrHash,
87
95
  target:
88
96
  T.any(
89
97
  ContextDev::MonitorCreateParams::Target::Page::OrHash,
90
98
  ContextDev::MonitorCreateParams::Target::Sitemap::OrHash,
91
99
  ContextDev::MonitorCreateParams::Target::Extract::OrHash
92
100
  ),
101
+ change_detection:
102
+ T.any(
103
+ ContextDev::MonitorCreateParams::ChangeDetection::Exact::OrHash,
104
+ ContextDev::MonitorCreateParams::ChangeDetection::Semantic::OrHash
105
+ ),
93
106
  mode: ContextDev::MonitorCreateParams::Mode::OrSymbol,
107
+ schedule: ContextDev::MonitorCreateParams::Schedule::OrHash,
94
108
  tags: T::Array[String],
95
109
  webhook: T.nilable(ContextDev::MonitorCreateParams::Webhook::OrHash),
96
110
  request_options: ContextDev::RequestOptions::OrHash
97
111
  ).returns(T.attached_class)
98
112
  end
99
113
  def self.new(
100
- # Discriminated union describing how changes are detected.
101
- change_detection:,
102
114
  name:,
103
- # Run the monitor on a fixed interval defined by a frequency and a unit, e.g.
104
- # every 6 hours or every 2 days. The total interval (frequency × unit) must be
105
- # between 10 minutes and 1 year.
106
- schedule:,
107
115
  # Discriminated union describing what the monitor watches.
108
116
  target:,
117
+ # Discriminated union describing how changes are detected.
118
+ change_detection: nil,
109
119
  # Top-level monitor category. Always `web` today; the concrete behavior is
110
120
  # described by `target` and `change_detection`.
111
121
  mode: nil,
122
+ # Run the monitor on a fixed interval defined by a frequency and a unit, e.g.
123
+ # every 6 hours or every 2 days. The total interval (frequency × unit) must be
124
+ # between 10 minutes and 1 year.
125
+ schedule: nil,
112
126
  # User-defined tags for grouping and filtering monitors and their changes.
127
+ # Duplicates are removed.
113
128
  tags: nil,
114
129
  webhook: nil,
115
130
  request_options: {}
@@ -119,20 +134,20 @@ module ContextDev
119
134
  sig do
120
135
  override.returns(
121
136
  {
122
- change_detection:
123
- T.any(
124
- ContextDev::MonitorCreateParams::ChangeDetection::Exact,
125
- ContextDev::MonitorCreateParams::ChangeDetection::Semantic
126
- ),
127
137
  name: String,
128
- schedule: ContextDev::MonitorCreateParams::Schedule,
129
138
  target:
130
139
  T.any(
131
140
  ContextDev::MonitorCreateParams::Target::Page,
132
141
  ContextDev::MonitorCreateParams::Target::Sitemap,
133
142
  ContextDev::MonitorCreateParams::Target::Extract
134
143
  ),
144
+ change_detection:
145
+ T.any(
146
+ ContextDev::MonitorCreateParams::ChangeDetection::Exact,
147
+ ContextDev::MonitorCreateParams::ChangeDetection::Semantic
148
+ ),
135
149
  mode: ContextDev::MonitorCreateParams::Mode::OrSymbol,
150
+ schedule: ContextDev::MonitorCreateParams::Schedule,
136
151
  tags: T::Array[String],
137
152
  webhook: T.nilable(ContextDev::MonitorCreateParams::Webhook),
138
153
  request_options: ContextDev::RequestOptions
@@ -142,206 +157,6 @@ module ContextDev
142
157
  def to_hash
143
158
  end
144
159
 
145
- # Discriminated union describing how changes are detected.
146
- module ChangeDetection
147
- extend ContextDev::Internal::Type::Union
148
-
149
- Variants =
150
- T.type_alias do
151
- T.any(
152
- ContextDev::MonitorCreateParams::ChangeDetection::Exact,
153
- ContextDev::MonitorCreateParams::ChangeDetection::Semantic
154
- )
155
- end
156
-
157
- class Exact < ContextDev::Internal::Type::BaseModel
158
- OrHash =
159
- T.type_alias do
160
- T.any(
161
- ContextDev::MonitorCreateParams::ChangeDetection::Exact,
162
- ContextDev::Internal::AnyHash
163
- )
164
- end
165
-
166
- sig { returns(Symbol) }
167
- attr_accessor :type
168
-
169
- # Detect exact changes. For page targets, this means visible text diffs. For
170
- # sitemap targets, this means URL additions and removals.
171
- sig { params(type: Symbol).returns(T.attached_class) }
172
- def self.new(type: :exact)
173
- end
174
-
175
- sig { override.returns({ type: Symbol }) }
176
- def to_hash
177
- end
178
- end
179
-
180
- class Semantic < ContextDev::Internal::Type::BaseModel
181
- OrHash =
182
- T.type_alias do
183
- T.any(
184
- ContextDev::MonitorCreateParams::ChangeDetection::Semantic,
185
- ContextDev::Internal::AnyHash
186
- )
187
- end
188
-
189
- sig { returns(Symbol) }
190
- attr_accessor :type
191
-
192
- sig { returns(T.nilable(Float)) }
193
- attr_reader :confidence_threshold
194
-
195
- sig { params(confidence_threshold: Float).void }
196
- attr_writer :confidence_threshold
197
-
198
- # Detect meaning-level changes to tracked page content, ignoring cosmetic or
199
- # paraphrase-only differences. Which changes are meaningful is judged against the
200
- # extract target's `instructions` (and `schema`, when provided).
201
- sig do
202
- params(confidence_threshold: Float, type: Symbol).returns(
203
- T.attached_class
204
- )
205
- end
206
- def self.new(confidence_threshold: nil, type: :semantic)
207
- end
208
-
209
- sig do
210
- override.returns({ type: Symbol, confidence_threshold: Float })
211
- end
212
- def to_hash
213
- end
214
- end
215
-
216
- sig do
217
- override.returns(
218
- T::Array[ContextDev::MonitorCreateParams::ChangeDetection::Variants]
219
- )
220
- end
221
- def self.variants
222
- end
223
- end
224
-
225
- class Schedule < ContextDev::Internal::Type::BaseModel
226
- OrHash =
227
- T.type_alias do
228
- T.any(
229
- ContextDev::MonitorCreateParams::Schedule,
230
- ContextDev::Internal::AnyHash
231
- )
232
- end
233
-
234
- # Number of units between runs. The resulting interval (frequency × unit) must be
235
- # at least 10 minutes and at most 1 year (e.g. minimum 10 when unit is minutes;
236
- # maximum 365 when unit is days).
237
- sig { returns(Integer) }
238
- attr_accessor :frequency
239
-
240
- sig do
241
- returns(ContextDev::MonitorCreateParams::Schedule::Type::OrSymbol)
242
- end
243
- attr_accessor :type
244
-
245
- sig do
246
- returns(ContextDev::MonitorCreateParams::Schedule::Unit::OrSymbol)
247
- end
248
- attr_accessor :unit
249
-
250
- # Run the monitor on a fixed interval defined by a frequency and a unit, e.g.
251
- # every 6 hours or every 2 days. The total interval (frequency × unit) must be
252
- # between 10 minutes and 1 year.
253
- sig do
254
- params(
255
- frequency: Integer,
256
- type: ContextDev::MonitorCreateParams::Schedule::Type::OrSymbol,
257
- unit: ContextDev::MonitorCreateParams::Schedule::Unit::OrSymbol
258
- ).returns(T.attached_class)
259
- end
260
- def self.new(
261
- # Number of units between runs. The resulting interval (frequency × unit) must be
262
- # at least 10 minutes and at most 1 year (e.g. minimum 10 when unit is minutes;
263
- # maximum 365 when unit is days).
264
- frequency:,
265
- type:,
266
- unit:
267
- )
268
- end
269
-
270
- sig do
271
- override.returns(
272
- {
273
- frequency: Integer,
274
- type: ContextDev::MonitorCreateParams::Schedule::Type::OrSymbol,
275
- unit: ContextDev::MonitorCreateParams::Schedule::Unit::OrSymbol
276
- }
277
- )
278
- end
279
- def to_hash
280
- end
281
-
282
- module Type
283
- extend ContextDev::Internal::Type::Enum
284
-
285
- TaggedSymbol =
286
- T.type_alias do
287
- T.all(Symbol, ContextDev::MonitorCreateParams::Schedule::Type)
288
- end
289
- OrSymbol = T.type_alias { T.any(Symbol, String) }
290
-
291
- INTERVAL =
292
- T.let(
293
- :interval,
294
- ContextDev::MonitorCreateParams::Schedule::Type::TaggedSymbol
295
- )
296
-
297
- sig do
298
- override.returns(
299
- T::Array[
300
- ContextDev::MonitorCreateParams::Schedule::Type::TaggedSymbol
301
- ]
302
- )
303
- end
304
- def self.values
305
- end
306
- end
307
-
308
- module Unit
309
- extend ContextDev::Internal::Type::Enum
310
-
311
- TaggedSymbol =
312
- T.type_alias do
313
- T.all(Symbol, ContextDev::MonitorCreateParams::Schedule::Unit)
314
- end
315
- OrSymbol = T.type_alias { T.any(Symbol, String) }
316
-
317
- MINUTES =
318
- T.let(
319
- :minutes,
320
- ContextDev::MonitorCreateParams::Schedule::Unit::TaggedSymbol
321
- )
322
- HOURS =
323
- T.let(
324
- :hours,
325
- ContextDev::MonitorCreateParams::Schedule::Unit::TaggedSymbol
326
- )
327
- DAYS =
328
- T.let(
329
- :days,
330
- ContextDev::MonitorCreateParams::Schedule::Unit::TaggedSymbol
331
- )
332
-
333
- sig do
334
- override.returns(
335
- T::Array[
336
- ContextDev::MonitorCreateParams::Schedule::Unit::TaggedSymbol
337
- ]
338
- )
339
- end
340
- def self.values
341
- end
342
- end
343
- end
344
-
345
160
  # Discriminated union describing what the monitor watches.
346
161
  module Target
347
162
  extend ContextDev::Internal::Type::Union
@@ -370,6 +185,14 @@ module ContextDev
370
185
  sig { returns(String) }
371
186
  attr_accessor :url
372
187
 
188
+ # Plain-language goal describing which page changes matter. When provided without
189
+ # change_detection, semantic detection is inferred.
190
+ sig { returns(T.nilable(String)) }
191
+ attr_reader :instructions
192
+
193
+ sig { params(instructions: String).void }
194
+ attr_writer :instructions
195
+
373
196
  # Normalize whitespace before comparing or analyzing text.
374
197
  sig { returns(T.nilable(T::Boolean)) }
375
198
  attr_reader :normalize_whitespace
@@ -377,16 +200,21 @@ module ContextDev
377
200
  sig { params(normalize_whitespace: T::Boolean).void }
378
201
  attr_writer :normalize_whitespace
379
202
 
380
- # Watch a single web page.
203
+ # Watch a single web page. Exact detection reports visible-text diffs; semantic
204
+ # detection judges confirmed stable diffs against `instructions`.
381
205
  sig do
382
206
  params(
383
207
  url: String,
208
+ instructions: String,
384
209
  normalize_whitespace: T::Boolean,
385
210
  type: Symbol
386
211
  ).returns(T.attached_class)
387
212
  end
388
213
  def self.new(
389
214
  url:,
215
+ # Plain-language goal describing which page changes matter. When provided without
216
+ # change_detection, semantic detection is inferred.
217
+ instructions: nil,
390
218
  # Normalize whitespace before comparing or analyzing text.
391
219
  normalize_whitespace: nil,
392
220
  type: :page
@@ -395,7 +223,12 @@ module ContextDev
395
223
 
396
224
  sig do
397
225
  override.returns(
398
- { type: Symbol, url: String, normalize_whitespace: T::Boolean }
226
+ {
227
+ type: Symbol,
228
+ url: String,
229
+ instructions: String,
230
+ normalize_whitespace: T::Boolean
231
+ }
399
232
  )
400
233
  end
401
234
  def to_hash
@@ -418,14 +251,14 @@ module ContextDev
418
251
  sig { returns(String) }
419
252
  attr_accessor :url
420
253
 
421
- # URL path patterns to exclude.
254
+ # URL path patterns to exclude (max 50).
422
255
  sig { returns(T.nilable(T::Array[String])) }
423
256
  attr_reader :exclude
424
257
 
425
258
  sig { params(exclude: T::Array[String]).void }
426
259
  attr_writer :exclude
427
260
 
428
- # URL path patterns to include.
261
+ # URL path patterns to include (max 50).
429
262
  sig { returns(T.nilable(T::Array[String])) }
430
263
  attr_reader :include
431
264
 
@@ -456,9 +289,9 @@ module ContextDev
456
289
  def self.new(
457
290
  # Sitemap URL to monitor.
458
291
  url:,
459
- # URL path patterns to exclude.
292
+ # URL path patterns to exclude (max 50).
460
293
  exclude: nil,
461
- # URL path patterns to include.
294
+ # URL path patterns to include (max 50).
462
295
  include: nil,
463
296
  # Maximum number of sitemap URLs to track (capped at 10,000).
464
297
  max_urls: nil,
@@ -602,6 +435,87 @@ module ContextDev
602
435
  end
603
436
  end
604
437
 
438
+ # Discriminated union describing how changes are detected.
439
+ module ChangeDetection
440
+ extend ContextDev::Internal::Type::Union
441
+
442
+ Variants =
443
+ T.type_alias do
444
+ T.any(
445
+ ContextDev::MonitorCreateParams::ChangeDetection::Exact,
446
+ ContextDev::MonitorCreateParams::ChangeDetection::Semantic
447
+ )
448
+ end
449
+
450
+ class Exact < ContextDev::Internal::Type::BaseModel
451
+ OrHash =
452
+ T.type_alias do
453
+ T.any(
454
+ ContextDev::MonitorCreateParams::ChangeDetection::Exact,
455
+ ContextDev::Internal::AnyHash
456
+ )
457
+ end
458
+
459
+ sig { returns(Symbol) }
460
+ attr_accessor :type
461
+
462
+ # Detect exact changes. For page targets, this means visible text diffs. For
463
+ # sitemap targets, this means URL additions and removals.
464
+ sig { params(type: Symbol).returns(T.attached_class) }
465
+ def self.new(type: :exact)
466
+ end
467
+
468
+ sig { override.returns({ type: Symbol }) }
469
+ def to_hash
470
+ end
471
+ end
472
+
473
+ class Semantic < ContextDev::Internal::Type::BaseModel
474
+ OrHash =
475
+ T.type_alias do
476
+ T.any(
477
+ ContextDev::MonitorCreateParams::ChangeDetection::Semantic,
478
+ ContextDev::Internal::AnyHash
479
+ )
480
+ end
481
+
482
+ sig { returns(Symbol) }
483
+ attr_accessor :type
484
+
485
+ sig { returns(T.nilable(Float)) }
486
+ attr_reader :confidence_threshold
487
+
488
+ sig { params(confidence_threshold: Float).void }
489
+ attr_writer :confidence_threshold
490
+
491
+ # Detect meaning-level changes to page content, ignoring cosmetic or
492
+ # instruction-irrelevant differences. Which changes are meaningful is judged
493
+ # against the page or extract target's `instructions` (and an extract target's
494
+ # `schema`, when provided).
495
+ sig do
496
+ params(confidence_threshold: Float, type: Symbol).returns(
497
+ T.attached_class
498
+ )
499
+ end
500
+ def self.new(confidence_threshold: nil, type: :semantic)
501
+ end
502
+
503
+ sig do
504
+ override.returns({ type: Symbol, confidence_threshold: Float })
505
+ end
506
+ def to_hash
507
+ end
508
+ end
509
+
510
+ sig do
511
+ override.returns(
512
+ T::Array[ContextDev::MonitorCreateParams::ChangeDetection::Variants]
513
+ )
514
+ end
515
+ def self.variants
516
+ end
517
+ end
518
+
605
519
  # Top-level monitor category. Always `web` today; the concrete behavior is
606
520
  # described by `target` and `change_detection`.
607
521
  module Mode
@@ -622,6 +536,126 @@ module ContextDev
622
536
  end
623
537
  end
624
538
 
539
+ class Schedule < ContextDev::Internal::Type::BaseModel
540
+ OrHash =
541
+ T.type_alias do
542
+ T.any(
543
+ ContextDev::MonitorCreateParams::Schedule,
544
+ ContextDev::Internal::AnyHash
545
+ )
546
+ end
547
+
548
+ # Number of units between runs. The resulting interval (frequency × unit) must be
549
+ # at least 10 minutes and at most 1 year (e.g. minimum 10 when unit is minutes;
550
+ # maximum 365 when unit is days).
551
+ sig { returns(Integer) }
552
+ attr_accessor :frequency
553
+
554
+ sig do
555
+ returns(ContextDev::MonitorCreateParams::Schedule::Type::OrSymbol)
556
+ end
557
+ attr_accessor :type
558
+
559
+ sig do
560
+ returns(ContextDev::MonitorCreateParams::Schedule::Unit::OrSymbol)
561
+ end
562
+ attr_accessor :unit
563
+
564
+ # Run the monitor on a fixed interval defined by a frequency and a unit, e.g.
565
+ # every 6 hours or every 2 days. The total interval (frequency × unit) must be
566
+ # between 10 minutes and 1 year.
567
+ sig do
568
+ params(
569
+ frequency: Integer,
570
+ type: ContextDev::MonitorCreateParams::Schedule::Type::OrSymbol,
571
+ unit: ContextDev::MonitorCreateParams::Schedule::Unit::OrSymbol
572
+ ).returns(T.attached_class)
573
+ end
574
+ def self.new(
575
+ # Number of units between runs. The resulting interval (frequency × unit) must be
576
+ # at least 10 minutes and at most 1 year (e.g. minimum 10 when unit is minutes;
577
+ # maximum 365 when unit is days).
578
+ frequency:,
579
+ type:,
580
+ unit:
581
+ )
582
+ end
583
+
584
+ sig do
585
+ override.returns(
586
+ {
587
+ frequency: Integer,
588
+ type: ContextDev::MonitorCreateParams::Schedule::Type::OrSymbol,
589
+ unit: ContextDev::MonitorCreateParams::Schedule::Unit::OrSymbol
590
+ }
591
+ )
592
+ end
593
+ def to_hash
594
+ end
595
+
596
+ module Type
597
+ extend ContextDev::Internal::Type::Enum
598
+
599
+ TaggedSymbol =
600
+ T.type_alias do
601
+ T.all(Symbol, ContextDev::MonitorCreateParams::Schedule::Type)
602
+ end
603
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
604
+
605
+ INTERVAL =
606
+ T.let(
607
+ :interval,
608
+ ContextDev::MonitorCreateParams::Schedule::Type::TaggedSymbol
609
+ )
610
+
611
+ sig do
612
+ override.returns(
613
+ T::Array[
614
+ ContextDev::MonitorCreateParams::Schedule::Type::TaggedSymbol
615
+ ]
616
+ )
617
+ end
618
+ def self.values
619
+ end
620
+ end
621
+
622
+ module Unit
623
+ extend ContextDev::Internal::Type::Enum
624
+
625
+ TaggedSymbol =
626
+ T.type_alias do
627
+ T.all(Symbol, ContextDev::MonitorCreateParams::Schedule::Unit)
628
+ end
629
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
630
+
631
+ MINUTES =
632
+ T.let(
633
+ :minutes,
634
+ ContextDev::MonitorCreateParams::Schedule::Unit::TaggedSymbol
635
+ )
636
+ HOURS =
637
+ T.let(
638
+ :hours,
639
+ ContextDev::MonitorCreateParams::Schedule::Unit::TaggedSymbol
640
+ )
641
+ DAYS =
642
+ T.let(
643
+ :days,
644
+ ContextDev::MonitorCreateParams::Schedule::Unit::TaggedSymbol
645
+ )
646
+
647
+ sig do
648
+ override.returns(
649
+ T::Array[
650
+ ContextDev::MonitorCreateParams::Schedule::Unit::TaggedSymbol
651
+ ]
652
+ )
653
+ end
654
+ def self.values
655
+ end
656
+ end
657
+ end
658
+
625
659
  class Webhook < ContextDev::Internal::Type::BaseModel
626
660
  OrHash =
627
661
  T.type_alias do