effect 4.0.7 → 4.1.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 (679) hide show
  1. package/README.md +1 -1
  2. package/dist/BigDecimal.d.ts.map +1 -1
  3. package/dist/BigDecimal.js +3 -0
  4. package/dist/BigDecimal.js.map +1 -1
  5. package/dist/Channel.d.ts +12 -6
  6. package/dist/Channel.d.ts.map +1 -1
  7. package/dist/Channel.js +9 -3
  8. package/dist/Channel.js.map +1 -1
  9. package/dist/Config.d.ts +7 -1
  10. package/dist/Config.d.ts.map +1 -1
  11. package/dist/Config.js.map +1 -1
  12. package/dist/Context.d.ts +18 -1
  13. package/dist/Context.d.ts.map +1 -1
  14. package/dist/Context.js +27 -8
  15. package/dist/Context.js.map +1 -1
  16. package/dist/Cron.d.ts +81 -11
  17. package/dist/Cron.d.ts.map +1 -1
  18. package/dist/Cron.js +101 -26
  19. package/dist/Cron.js.map +1 -1
  20. package/dist/Duration.d.ts +78 -0
  21. package/dist/Duration.d.ts.map +1 -1
  22. package/dist/Duration.js +123 -0
  23. package/dist/Duration.js.map +1 -1
  24. package/dist/Effect.d.ts +164 -7
  25. package/dist/Effect.d.ts.map +1 -1
  26. package/dist/Effect.js +11 -1
  27. package/dist/Effect.js.map +1 -1
  28. package/dist/FileSystem.d.ts +59 -4
  29. package/dist/FileSystem.d.ts.map +1 -1
  30. package/dist/FileSystem.js +9 -2
  31. package/dist/FileSystem.js.map +1 -1
  32. package/dist/Glob.d.ts +165 -0
  33. package/dist/Glob.d.ts.map +1 -0
  34. package/dist/Glob.js +127 -0
  35. package/dist/Glob.js.map +1 -0
  36. package/dist/Match.d.ts +86 -0
  37. package/dist/Match.d.ts.map +1 -1
  38. package/dist/Match.js +72 -0
  39. package/dist/Match.js.map +1 -1
  40. package/dist/Pool.d.ts +51 -0
  41. package/dist/Pool.d.ts.map +1 -1
  42. package/dist/Pool.js +59 -9
  43. package/dist/Pool.js.map +1 -1
  44. package/dist/Random.d.ts.map +1 -1
  45. package/dist/Random.js +3 -3
  46. package/dist/Random.js.map +1 -1
  47. package/dist/RcMap.d.ts.map +1 -1
  48. package/dist/RcMap.js +8 -2
  49. package/dist/RcMap.js.map +1 -1
  50. package/dist/Schedule.d.ts +18 -1
  51. package/dist/Schedule.d.ts.map +1 -1
  52. package/dist/Schedule.js +7 -2
  53. package/dist/Schedule.js.map +1 -1
  54. package/dist/Schema.d.ts +666 -41
  55. package/dist/Schema.d.ts.map +1 -1
  56. package/dist/Schema.js +650 -0
  57. package/dist/Schema.js.map +1 -1
  58. package/dist/SchemaGetter.d.ts +6 -1
  59. package/dist/SchemaGetter.d.ts.map +1 -1
  60. package/dist/SchemaGetter.js +22 -11
  61. package/dist/SchemaGetter.js.map +1 -1
  62. package/dist/SchemaRepresentation.d.ts +14 -0
  63. package/dist/SchemaRepresentation.d.ts.map +1 -1
  64. package/dist/SchemaRepresentation.js +16 -0
  65. package/dist/SchemaRepresentation.js.map +1 -1
  66. package/dist/SchemaTransformation.d.ts +8 -3
  67. package/dist/SchemaTransformation.d.ts.map +1 -1
  68. package/dist/SchemaTransformation.js +6 -3
  69. package/dist/SchemaTransformation.js.map +1 -1
  70. package/dist/ScopedCache.d.ts.map +1 -1
  71. package/dist/ScopedCache.js +5 -7
  72. package/dist/ScopedCache.js.map +1 -1
  73. package/dist/Semaphore.d.ts +130 -0
  74. package/dist/Semaphore.d.ts.map +1 -1
  75. package/dist/Semaphore.js +40 -0
  76. package/dist/Semaphore.js.map +1 -1
  77. package/dist/Stream.d.ts +13 -4
  78. package/dist/Stream.d.ts.map +1 -1
  79. package/dist/Stream.js +9 -0
  80. package/dist/Stream.js.map +1 -1
  81. package/dist/Terminal.d.ts +18 -1
  82. package/dist/Terminal.d.ts.map +1 -1
  83. package/dist/Terminal.js +1 -1
  84. package/dist/Terminal.js.map +1 -1
  85. package/dist/ai/AiError.d.ts +43 -116
  86. package/dist/ai/AiError.d.ts.map +1 -1
  87. package/dist/ai/AiError.js +53 -72
  88. package/dist/ai/AiError.js.map +1 -1
  89. package/dist/ai/Decision.d.ts +196 -15
  90. package/dist/ai/Decision.d.ts.map +1 -1
  91. package/dist/ai/Decision.js +130 -0
  92. package/dist/ai/Decision.js.map +1 -1
  93. package/dist/ai/DecisionModel.d.ts +54 -13
  94. package/dist/ai/DecisionModel.d.ts.map +1 -1
  95. package/dist/ai/DecisionModel.js +123 -12
  96. package/dist/ai/DecisionModel.js.map +1 -1
  97. package/dist/ai/McpServer.d.ts +630 -29
  98. package/dist/ai/McpServer.d.ts.map +1 -1
  99. package/dist/ai/McpServer.js +562 -116
  100. package/dist/ai/McpServer.js.map +1 -1
  101. package/dist/ai/McpTest.d.ts +130 -0
  102. package/dist/ai/McpTest.d.ts.map +1 -0
  103. package/dist/ai/McpTest.js +237 -0
  104. package/dist/ai/McpTest.js.map +1 -0
  105. package/dist/ai/Response.d.ts +1 -25
  106. package/dist/ai/Response.d.ts.map +1 -1
  107. package/dist/ai/Response.js +1 -10
  108. package/dist/ai/Response.js.map +1 -1
  109. package/dist/ai/Tool.d.ts +19 -1
  110. package/dist/ai/Tool.d.ts.map +1 -1
  111. package/dist/ai/Tool.js.map +1 -1
  112. package/dist/ai/index.d.ts +5 -0
  113. package/dist/ai/index.d.ts.map +1 -1
  114. package/dist/ai/index.js +5 -0
  115. package/dist/ai/index.js.map +1 -1
  116. package/dist/ai/internal/mcpCore.js +17 -12
  117. package/dist/ai/internal/mcpCore.js.map +1 -1
  118. package/dist/ai/internal/mcpProtocol/v2024_11_05.js +4 -5
  119. package/dist/ai/internal/mcpProtocol/v2024_11_05.js.map +1 -1
  120. package/dist/ai/internal/mcpProtocol/v2025_03_26.js +4 -5
  121. package/dist/ai/internal/mcpProtocol/v2025_03_26.js.map +1 -1
  122. package/dist/ai/internal/mcpProtocol/v2025_06_18.js +4 -5
  123. package/dist/ai/internal/mcpProtocol/v2025_06_18.js.map +1 -1
  124. package/dist/ai/internal/mcpProtocol/v2025_11_25.js +4 -5
  125. package/dist/ai/internal/mcpProtocol/v2025_11_25.js.map +1 -1
  126. package/dist/ai/internal/mcpProtocol/v2026_07_28.js +18 -10
  127. package/dist/ai/internal/mcpProtocol/v2026_07_28.js.map +1 -1
  128. package/dist/ai/internal/mcpProtocol.js +13 -0
  129. package/dist/ai/internal/mcpProtocol.js.map +1 -1
  130. package/dist/ai/internal/mcpRuntime.js +5 -3
  131. package/dist/ai/internal/mcpRuntime.js.map +1 -1
  132. package/dist/ai/internal/mcpStatefulRuntime.js +6 -1
  133. package/dist/ai/internal/mcpStatefulRuntime.js.map +1 -1
  134. package/dist/cli/Argument.d.ts +6 -0
  135. package/dist/cli/Argument.d.ts.map +1 -1
  136. package/dist/cli/Argument.js +2 -0
  137. package/dist/cli/Argument.js.map +1 -1
  138. package/dist/cli/CliOutput.d.ts +65 -1
  139. package/dist/cli/CliOutput.d.ts.map +1 -1
  140. package/dist/cli/CliOutput.js +94 -37
  141. package/dist/cli/CliOutput.js.map +1 -1
  142. package/dist/cli/Command.d.ts +23 -0
  143. package/dist/cli/Command.d.ts.map +1 -1
  144. package/dist/cli/Command.js +8 -0
  145. package/dist/cli/Command.js.map +1 -1
  146. package/dist/cli/Flag.d.ts +107 -0
  147. package/dist/cli/Flag.d.ts.map +1 -1
  148. package/dist/cli/Flag.js +37 -0
  149. package/dist/cli/Flag.js.map +1 -1
  150. package/dist/cli/HelpDoc.d.ts +15 -1
  151. package/dist/cli/HelpDoc.d.ts.map +1 -1
  152. package/dist/cli/Param.d.ts +6 -0
  153. package/dist/cli/Param.d.ts.map +1 -1
  154. package/dist/cli/Param.js +2 -0
  155. package/dist/cli/Param.js.map +1 -1
  156. package/dist/cli/Primitive.d.ts +14 -0
  157. package/dist/cli/Primitive.d.ts.map +1 -1
  158. package/dist/cli/Primitive.js +15 -1
  159. package/dist/cli/Primitive.js.map +1 -1
  160. package/dist/cli/Prompt.d.ts +1 -0
  161. package/dist/cli/Prompt.d.ts.map +1 -1
  162. package/dist/cli/Prompt.js +1 -0
  163. package/dist/cli/Prompt.js.map +1 -1
  164. package/dist/cli/internal/help.d.ts.map +1 -1
  165. package/dist/cli/internal/help.js +17 -10
  166. package/dist/cli/internal/help.js.map +1 -1
  167. package/dist/cluster/Sharding.d.ts.map +1 -1
  168. package/dist/cluster/Sharding.js +90 -28
  169. package/dist/cluster/Sharding.js.map +1 -1
  170. package/dist/cluster/ShardingConfig.d.ts +72 -6
  171. package/dist/cluster/ShardingConfig.d.ts.map +1 -1
  172. package/dist/cluster/ShardingConfig.js +4 -0
  173. package/dist/cluster/ShardingConfig.js.map +1 -1
  174. package/dist/cluster/SingleRunner.d.ts +3 -3
  175. package/dist/cluster/SingleRunner.d.ts.map +1 -1
  176. package/dist/cluster/SingleRunner.js +1 -1
  177. package/dist/cluster/SqlMessageStorage.d.ts +37 -6
  178. package/dist/cluster/SqlMessageStorage.d.ts.map +1 -1
  179. package/dist/cluster/SqlMessageStorage.js +34 -7
  180. package/dist/cluster/SqlMessageStorage.js.map +1 -1
  181. package/dist/cluster/SqlRunnerStorage.d.ts.map +1 -1
  182. package/dist/cluster/SqlRunnerStorage.js +23 -8
  183. package/dist/cluster/SqlRunnerStorage.js.map +1 -1
  184. package/dist/crypto/Aead.d.ts +322 -0
  185. package/dist/crypto/Aead.d.ts.map +1 -0
  186. package/dist/crypto/Aead.js +331 -0
  187. package/dist/crypto/Aead.js.map +1 -0
  188. package/dist/crypto/Cipher.d.ts +235 -0
  189. package/dist/crypto/Cipher.d.ts.map +1 -0
  190. package/dist/crypto/Cipher.js +233 -0
  191. package/dist/crypto/Cipher.js.map +1 -0
  192. package/dist/crypto/CryptoError.d.ts +212 -0
  193. package/dist/crypto/CryptoError.d.ts.map +1 -0
  194. package/dist/crypto/CryptoError.js +202 -0
  195. package/dist/crypto/CryptoError.js.map +1 -0
  196. package/dist/crypto/Digest.d.ts +143 -0
  197. package/dist/crypto/Digest.d.ts.map +1 -0
  198. package/dist/crypto/Digest.js +146 -0
  199. package/dist/crypto/Digest.js.map +1 -0
  200. package/dist/crypto/Kdf.d.ts +220 -0
  201. package/dist/crypto/Kdf.d.ts.map +1 -0
  202. package/dist/crypto/Kdf.js +212 -0
  203. package/dist/crypto/Kdf.js.map +1 -0
  204. package/dist/crypto/KeyAgreement.d.ts +323 -0
  205. package/dist/crypto/KeyAgreement.d.ts.map +1 -0
  206. package/dist/crypto/KeyAgreement.js +303 -0
  207. package/dist/crypto/KeyAgreement.js.map +1 -0
  208. package/dist/crypto/KeyFormat.d.ts +309 -0
  209. package/dist/crypto/KeyFormat.d.ts.map +1 -0
  210. package/dist/crypto/KeyFormat.js +556 -0
  211. package/dist/crypto/KeyFormat.js.map +1 -0
  212. package/dist/crypto/KeyWrap.d.ts +389 -0
  213. package/dist/crypto/KeyWrap.d.ts.map +1 -0
  214. package/dist/crypto/KeyWrap.js +381 -0
  215. package/dist/crypto/KeyWrap.js.map +1 -0
  216. package/dist/crypto/Mac.d.ts +277 -0
  217. package/dist/crypto/Mac.d.ts.map +1 -0
  218. package/dist/crypto/Mac.js +288 -0
  219. package/dist/crypto/Mac.js.map +1 -0
  220. package/dist/crypto/SecureRandom.d.ts +340 -0
  221. package/dist/crypto/SecureRandom.d.ts.map +1 -0
  222. package/dist/crypto/SecureRandom.js +257 -0
  223. package/dist/crypto/SecureRandom.js.map +1 -0
  224. package/dist/crypto/Signature.d.ts +448 -0
  225. package/dist/crypto/Signature.d.ts.map +1 -0
  226. package/dist/crypto/Signature.js +484 -0
  227. package/dist/crypto/Signature.js.map +1 -0
  228. package/dist/crypto/WebCrypto.d.ts +61 -0
  229. package/dist/crypto/WebCrypto.d.ts.map +1 -0
  230. package/dist/crypto/WebCrypto.js +63 -0
  231. package/dist/crypto/WebCrypto.js.map +1 -0
  232. package/dist/crypto/index.d.ts +65 -0
  233. package/dist/crypto/index.d.ts.map +1 -0
  234. package/dist/crypto/index.js +66 -0
  235. package/dist/crypto/index.js.map +1 -0
  236. package/dist/crypto/internal/asymmetric.d.ts +2 -0
  237. package/dist/crypto/internal/asymmetric.d.ts.map +1 -0
  238. package/dist/crypto/internal/asymmetric.js +210 -0
  239. package/dist/crypto/internal/asymmetric.js.map +1 -0
  240. package/dist/crypto/internal/chacha.d.ts +46 -0
  241. package/dist/crypto/internal/chacha.d.ts.map +1 -0
  242. package/dist/crypto/internal/chacha.js +885 -0
  243. package/dist/crypto/internal/chacha.js.map +1 -0
  244. package/dist/crypto/internal/der.d.ts +6 -0
  245. package/dist/crypto/internal/der.d.ts.map +1 -0
  246. package/dist/crypto/internal/der.js +86 -0
  247. package/dist/crypto/internal/der.js.map +1 -0
  248. package/dist/crypto/internal/digest.d.ts +2 -0
  249. package/dist/crypto/internal/digest.d.ts.map +1 -0
  250. package/dist/crypto/internal/digest.js +15 -0
  251. package/dist/crypto/internal/digest.js.map +1 -0
  252. package/dist/crypto/internal/key.d.ts +2 -0
  253. package/dist/crypto/internal/key.d.ts.map +1 -0
  254. package/dist/crypto/internal/key.js +170 -0
  255. package/dist/crypto/internal/key.js.map +1 -0
  256. package/dist/crypto/internal/md5.d.ts +39 -0
  257. package/dist/crypto/internal/md5.d.ts.map +1 -0
  258. package/dist/crypto/internal/md5.js +179 -0
  259. package/dist/crypto/internal/md5.js.map +1 -0
  260. package/dist/crypto/internal/webCrypto.d.ts +2 -0
  261. package/dist/crypto/internal/webCrypto.d.ts.map +1 -0
  262. package/dist/crypto/internal/webCrypto.js +111 -0
  263. package/dist/crypto/internal/webCrypto.js.map +1 -0
  264. package/dist/encoding/Base64Url.d.ts.map +1 -1
  265. package/dist/encoding/Base64Url.js +3 -2
  266. package/dist/encoding/Base64Url.js.map +1 -1
  267. package/dist/encoding/Csv.d.ts +608 -0
  268. package/dist/encoding/Csv.d.ts.map +1 -0
  269. package/dist/encoding/Csv.js +718 -0
  270. package/dist/encoding/Csv.js.map +1 -0
  271. package/dist/encoding/Hex.d.ts +3 -2
  272. package/dist/encoding/Hex.d.ts.map +1 -1
  273. package/dist/encoding/Hex.js +3 -2
  274. package/dist/encoding/Hex.js.map +1 -1
  275. package/dist/encoding/SchemaBinary.d.ts.map +1 -1
  276. package/dist/encoding/SchemaBinary.js +42 -4
  277. package/dist/encoding/SchemaBinary.js.map +1 -1
  278. package/dist/encoding/Toml.d.ts +17 -3
  279. package/dist/encoding/Toml.d.ts.map +1 -1
  280. package/dist/encoding/Toml.js +104 -16
  281. package/dist/encoding/Toml.js.map +1 -1
  282. package/dist/encoding/Yaml.d.ts +8 -1
  283. package/dist/encoding/Yaml.d.ts.map +1 -1
  284. package/dist/encoding/Yaml.js +54 -18
  285. package/dist/encoding/Yaml.js.map +1 -1
  286. package/dist/encoding/index.d.ts +5 -0
  287. package/dist/encoding/index.d.ts.map +1 -1
  288. package/dist/encoding/index.js +5 -0
  289. package/dist/encoding/index.js.map +1 -1
  290. package/dist/eventlog/EventJournal.d.ts.map +1 -1
  291. package/dist/eventlog/EventJournal.js +6 -3
  292. package/dist/eventlog/EventJournal.js.map +1 -1
  293. package/dist/eventlog/EventLog.d.ts +119 -4
  294. package/dist/eventlog/EventLog.d.ts.map +1 -1
  295. package/dist/eventlog/EventLog.js +200 -12
  296. package/dist/eventlog/EventLog.js.map +1 -1
  297. package/dist/eventlog/EventLogEncryption.d.ts +41 -4
  298. package/dist/eventlog/EventLogEncryption.d.ts.map +1 -1
  299. package/dist/eventlog/EventLogEncryption.js +83 -64
  300. package/dist/eventlog/EventLogEncryption.js.map +1 -1
  301. package/dist/eventlog/EventLogMessage.d.ts +279 -0
  302. package/dist/eventlog/EventLogMessage.d.ts.map +1 -1
  303. package/dist/eventlog/EventLogMessage.js +217 -1
  304. package/dist/eventlog/EventLogMessage.js.map +1 -1
  305. package/dist/eventlog/EventLogRemote.d.ts +200 -28
  306. package/dist/eventlog/EventLogRemote.d.ts.map +1 -1
  307. package/dist/eventlog/EventLogRemote.js +186 -16
  308. package/dist/eventlog/EventLogRemote.js.map +1 -1
  309. package/dist/eventlog/EventLogServer.d.ts +3 -0
  310. package/dist/eventlog/EventLogServer.d.ts.map +1 -1
  311. package/dist/eventlog/EventLogServer.js +18 -10
  312. package/dist/eventlog/EventLogServer.js.map +1 -1
  313. package/dist/eventlog/EventLogServerEncrypted.d.ts +326 -5
  314. package/dist/eventlog/EventLogServerEncrypted.d.ts.map +1 -1
  315. package/dist/eventlog/EventLogServerEncrypted.js +769 -14
  316. package/dist/eventlog/EventLogServerEncrypted.js.map +1 -1
  317. package/dist/eventlog/EventLogSessionAuth.d.ts +5 -3
  318. package/dist/eventlog/EventLogSessionAuth.d.ts.map +1 -1
  319. package/dist/eventlog/EventLogSessionAuth.js +41 -64
  320. package/dist/eventlog/EventLogSessionAuth.js.map +1 -1
  321. package/dist/eventlog/EventRow.d.ts +4 -0
  322. package/dist/eventlog/EventRow.d.ts.map +1 -1
  323. package/dist/eventlog/EventRow.js +12 -2
  324. package/dist/eventlog/EventRow.js.map +1 -1
  325. package/dist/eventlog/SqlEventJournal.js +2 -2
  326. package/dist/eventlog/SqlEventJournal.js.map +1 -1
  327. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts +21 -5
  328. package/dist/eventlog/SqlEventLogServerEncrypted.d.ts.map +1 -1
  329. package/dist/eventlog/SqlEventLogServerEncrypted.js +1048 -113
  330. package/dist/eventlog/SqlEventLogServerEncrypted.js.map +1 -1
  331. package/dist/eventlog/SqlEventLogServerUnencrypted.js +2 -2
  332. package/dist/eventlog/SqlEventLogServerUnencrypted.js.map +1 -1
  333. package/dist/eventlog/internal/batches.d.ts +12 -0
  334. package/dist/eventlog/internal/batches.d.ts.map +1 -0
  335. package/dist/eventlog/internal/batches.js +26 -0
  336. package/dist/eventlog/internal/batches.js.map +1 -0
  337. package/dist/eventlog/internal/compaction.d.ts +38 -0
  338. package/dist/eventlog/internal/compaction.d.ts.map +1 -0
  339. package/dist/eventlog/internal/compaction.js +33 -0
  340. package/dist/eventlog/internal/compaction.js.map +1 -0
  341. package/dist/eventlog/internal/identityRootSecretDerivation.js +66 -67
  342. package/dist/eventlog/internal/identityRootSecretDerivation.js.map +1 -1
  343. package/dist/eventlog/internal/remoteCompaction.d.ts +31 -0
  344. package/dist/eventlog/internal/remoteCompaction.d.ts.map +1 -0
  345. package/dist/eventlog/internal/remoteCompaction.js +76 -0
  346. package/dist/eventlog/internal/remoteCompaction.js.map +1 -0
  347. package/dist/http/Cookies.d.ts +172 -0
  348. package/dist/http/Cookies.d.ts.map +1 -1
  349. package/dist/http/Cookies.js +143 -1
  350. package/dist/http/Cookies.js.map +1 -1
  351. package/dist/http/FetchHttpClient.d.ts +26 -2
  352. package/dist/http/FetchHttpClient.d.ts.map +1 -1
  353. package/dist/http/FetchHttpClient.js +78 -15
  354. package/dist/http/FetchHttpClient.js.map +1 -1
  355. package/dist/http/HttpClient.d.ts +79 -8
  356. package/dist/http/HttpClient.d.ts.map +1 -1
  357. package/dist/http/HttpClient.js +65 -5
  358. package/dist/http/HttpClient.js.map +1 -1
  359. package/dist/http/HttpClientRequest.d.ts +9 -5
  360. package/dist/http/HttpClientRequest.d.ts.map +1 -1
  361. package/dist/http/HttpClientRequest.js +2 -3
  362. package/dist/http/HttpClientRequest.js.map +1 -1
  363. package/dist/http/HttpClientResponse.d.ts.map +1 -1
  364. package/dist/http/HttpClientResponse.js +3 -2
  365. package/dist/http/HttpClientResponse.js.map +1 -1
  366. package/dist/http/HttpMethod.d.ts +7 -1
  367. package/dist/http/HttpMethod.d.ts.map +1 -1
  368. package/dist/http/HttpMethod.js +3 -8
  369. package/dist/http/HttpMethod.js.map +1 -1
  370. package/dist/http/HttpServerRequest.d.ts +5 -2
  371. package/dist/http/HttpServerRequest.d.ts.map +1 -1
  372. package/dist/http/HttpServerRequest.js +6 -17
  373. package/dist/http/HttpServerRequest.js.map +1 -1
  374. package/dist/http/HttpServerResponse.d.ts.map +1 -1
  375. package/dist/http/HttpServerResponse.js +3 -2
  376. package/dist/http/HttpServerResponse.js.map +1 -1
  377. package/dist/http/HttpTraceContext.d.ts +2 -1
  378. package/dist/http/HttpTraceContext.d.ts.map +1 -1
  379. package/dist/http/HttpTraceContext.js +7 -5
  380. package/dist/http/HttpTraceContext.js.map +1 -1
  381. package/dist/http/ProblemDetails.d.ts +96 -0
  382. package/dist/http/ProblemDetails.d.ts.map +1 -0
  383. package/dist/http/ProblemDetails.js +98 -0
  384. package/dist/http/ProblemDetails.js.map +1 -0
  385. package/dist/http/index.d.ts +5 -0
  386. package/dist/http/index.d.ts.map +1 -1
  387. package/dist/http/index.js +5 -0
  388. package/dist/http/index.js.map +1 -1
  389. package/dist/http/internal/decompression.js +3 -2
  390. package/dist/http/internal/decompression.js.map +1 -1
  391. package/dist/http/internal/urlParams.js +8 -0
  392. package/dist/http/internal/urlParams.js.map +1 -1
  393. package/dist/http-api/HttpApiBuilder.js +19 -5
  394. package/dist/http-api/HttpApiBuilder.js.map +1 -1
  395. package/dist/http-api/HttpApiClient.d.ts +63 -0
  396. package/dist/http-api/HttpApiClient.d.ts.map +1 -1
  397. package/dist/http-api/HttpApiClient.js +51 -0
  398. package/dist/http-api/HttpApiClient.js.map +1 -1
  399. package/dist/http-api/HttpApiEndpoint.d.ts.map +1 -1
  400. package/dist/http-api/HttpApiEndpoint.js +14 -5
  401. package/dist/http-api/HttpApiEndpoint.js.map +1 -1
  402. package/dist/http-api/HttpApiError.d.ts +185 -13
  403. package/dist/http-api/HttpApiError.d.ts.map +1 -1
  404. package/dist/http-api/HttpApiError.js +128 -0
  405. package/dist/http-api/HttpApiError.js.map +1 -1
  406. package/dist/http-api/HttpApiMiddleware.d.ts +64 -17
  407. package/dist/http-api/HttpApiMiddleware.d.ts.map +1 -1
  408. package/dist/http-api/HttpApiMiddleware.js +85 -1
  409. package/dist/http-api/HttpApiMiddleware.js.map +1 -1
  410. package/dist/http-api/HttpApiSchema.d.ts +76 -14
  411. package/dist/http-api/HttpApiSchema.d.ts.map +1 -1
  412. package/dist/http-api/HttpApiSchema.js +53 -0
  413. package/dist/http-api/HttpApiSchema.js.map +1 -1
  414. package/dist/index.d.ts +5 -5
  415. package/dist/index.d.ts.map +1 -1
  416. package/dist/index.js +5 -5
  417. package/dist/index.js.map +1 -1
  418. package/dist/internal/effect.js +25 -14
  419. package/dist/internal/effect.js.map +1 -1
  420. package/dist/internal/glob.d.ts +2 -0
  421. package/dist/internal/glob.d.ts.map +1 -0
  422. package/dist/internal/glob.js +630 -0
  423. package/dist/internal/glob.js.map +1 -0
  424. package/dist/internal/matcher.js +10 -0
  425. package/dist/internal/matcher.js.map +1 -1
  426. package/dist/internal/persistence.js +9 -0
  427. package/dist/internal/persistence.js.map +1 -1
  428. package/dist/internal/rcRef.js +4 -1
  429. package/dist/internal/rcRef.js.map +1 -1
  430. package/dist/internal/schema/toCodeDocument.js +6 -3
  431. package/dist/internal/schema/toCodeDocument.js.map +1 -1
  432. package/dist/internal/trie.js +42 -13
  433. package/dist/internal/trie.js.map +1 -1
  434. package/dist/internal/ulid.js +41 -0
  435. package/dist/internal/ulid.js.map +1 -1
  436. package/dist/internal/uuid.js +52 -8
  437. package/dist/internal/uuid.js.map +1 -1
  438. package/dist/internal/version.js +1 -1
  439. package/dist/observability/Otlp.d.ts +15 -4
  440. package/dist/observability/Otlp.d.ts.map +1 -1
  441. package/dist/observability/Otlp.js +10 -0
  442. package/dist/observability/Otlp.js.map +1 -1
  443. package/dist/observability/OtlpResource.d.ts +7 -0
  444. package/dist/observability/OtlpResource.d.ts.map +1 -1
  445. package/dist/observability/OtlpResource.js +11 -1
  446. package/dist/observability/OtlpResource.js.map +1 -1
  447. package/dist/persistence/KeyValueStore.d.ts +47 -2
  448. package/dist/persistence/KeyValueStore.d.ts.map +1 -1
  449. package/dist/persistence/KeyValueStore.js +129 -18
  450. package/dist/persistence/KeyValueStore.js.map +1 -1
  451. package/dist/persistence/PersistedQueue.d.ts +9 -0
  452. package/dist/persistence/PersistedQueue.d.ts.map +1 -1
  453. package/dist/persistence/PersistedQueue.js +94 -52
  454. package/dist/persistence/PersistedQueue.js.map +1 -1
  455. package/dist/persistence/Persistence.d.ts +10 -4
  456. package/dist/persistence/Persistence.d.ts.map +1 -1
  457. package/dist/persistence/Persistence.js +18 -11
  458. package/dist/persistence/Persistence.js.map +1 -1
  459. package/dist/process/ChildProcess.d.ts +207 -67
  460. package/dist/process/ChildProcess.d.ts.map +1 -1
  461. package/dist/process/ChildProcess.js +56 -158
  462. package/dist/process/ChildProcess.js.map +1 -1
  463. package/dist/process/ChildProcessSpawner.d.ts +5 -0
  464. package/dist/process/ChildProcessSpawner.d.ts.map +1 -1
  465. package/dist/process/ChildProcessSpawner.js.map +1 -1
  466. package/dist/process/CommandLine.d.ts +294 -0
  467. package/dist/process/CommandLine.d.ts.map +1 -0
  468. package/dist/process/CommandLine.js +481 -0
  469. package/dist/process/CommandLine.js.map +1 -0
  470. package/dist/process/index.d.ts +5 -0
  471. package/dist/process/index.d.ts.map +1 -1
  472. package/dist/process/index.js +5 -0
  473. package/dist/process/index.js.map +1 -1
  474. package/dist/reactivity/Atom.d.ts +2 -1
  475. package/dist/reactivity/Atom.d.ts.map +1 -1
  476. package/dist/reactivity/Atom.js +3 -4
  477. package/dist/reactivity/Atom.js.map +1 -1
  478. package/dist/reactivity/AtomRegistry.js.map +1 -1
  479. package/dist/rpc/RpcClient.d.ts +16 -1
  480. package/dist/rpc/RpcClient.d.ts.map +1 -1
  481. package/dist/rpc/RpcClient.js +50 -16
  482. package/dist/rpc/RpcClient.js.map +1 -1
  483. package/dist/rpc/RpcMessage.d.ts +10 -1
  484. package/dist/rpc/RpcMessage.d.ts.map +1 -1
  485. package/dist/rpc/RpcMessage.js +1 -0
  486. package/dist/rpc/RpcMessage.js.map +1 -1
  487. package/dist/rpc/RpcSerialization.d.ts.map +1 -1
  488. package/dist/rpc/RpcSerialization.js +6 -0
  489. package/dist/rpc/RpcSerialization.js.map +1 -1
  490. package/dist/rpc/RpcServer.d.ts +31 -0
  491. package/dist/rpc/RpcServer.d.ts.map +1 -1
  492. package/dist/rpc/RpcServer.js +139 -66
  493. package/dist/rpc/RpcServer.js.map +1 -1
  494. package/dist/schema/Model.d.ts +14 -0
  495. package/dist/schema/Model.d.ts.map +1 -1
  496. package/dist/schema/Model.js +18 -3
  497. package/dist/schema/Model.js.map +1 -1
  498. package/dist/sql/Migrator.d.ts +0 -19
  499. package/dist/sql/Migrator.d.ts.map +1 -1
  500. package/dist/sql/Migrator.js +3 -48
  501. package/dist/sql/Migrator.js.map +1 -1
  502. package/dist/sql/MigratorFileSystem.d.ts +21 -0
  503. package/dist/sql/MigratorFileSystem.d.ts.map +1 -0
  504. package/dist/sql/MigratorFileSystem.js +57 -0
  505. package/dist/sql/MigratorFileSystem.js.map +1 -0
  506. package/dist/sql/SqlClient.d.ts.map +1 -1
  507. package/dist/sql/SqlClient.js +5 -9
  508. package/dist/sql/SqlClient.js.map +1 -1
  509. package/dist/sql/Statement.d.ts +20 -6
  510. package/dist/sql/Statement.d.ts.map +1 -1
  511. package/dist/sql/Statement.js +0 -13
  512. package/dist/sql/Statement.js.map +1 -1
  513. package/dist/sql/index.js +1 -1
  514. package/dist/testing/index.d.ts +0 -5
  515. package/dist/testing/index.d.ts.map +1 -1
  516. package/dist/testing/index.js +0 -5
  517. package/dist/testing/index.js.map +1 -1
  518. package/dist/workflow/internal/crypto.js +9 -8
  519. package/dist/workflow/internal/crypto.js.map +1 -1
  520. package/package.json +3 -1
  521. package/src/BigDecimal.ts +3 -0
  522. package/src/Channel.ts +17 -11
  523. package/src/Config.ts +7 -1
  524. package/src/Context.ts +34 -10
  525. package/src/Cron.ts +178 -29
  526. package/src/Duration.ts +140 -0
  527. package/src/Effect.ts +914 -85
  528. package/src/FileSystem.ts +65 -4
  529. package/src/Glob.ts +205 -0
  530. package/src/Match.ts +127 -0
  531. package/src/Pool.ts +73 -15
  532. package/src/Random.ts +3 -3
  533. package/src/RcMap.ts +5 -1
  534. package/src/Schedule.ts +26 -3
  535. package/src/Schema.ts +1189 -62
  536. package/src/SchemaGetter.ts +27 -11
  537. package/src/SchemaRepresentation.ts +19 -0
  538. package/src/SchemaTransformation.ts +8 -3
  539. package/src/ScopedCache.ts +5 -9
  540. package/src/Semaphore.ts +141 -0
  541. package/src/Stream.ts +15 -6
  542. package/src/Terminal.ts +19 -1
  543. package/src/ai/AiError.ts +56 -80
  544. package/src/ai/Decision.ts +257 -6
  545. package/src/ai/DecisionModel.ts +171 -28
  546. package/src/ai/McpServer.ts +1269 -286
  547. package/src/ai/McpTest.ts +380 -0
  548. package/src/ai/Response.ts +2 -22
  549. package/src/ai/Tool.ts +27 -8
  550. package/src/ai/index.ts +6 -0
  551. package/src/ai/internal/mcpCore.ts +78 -44
  552. package/src/ai/internal/mcpProtocol/v2024_11_05.ts +4 -7
  553. package/src/ai/internal/mcpProtocol/v2025_03_26.ts +4 -7
  554. package/src/ai/internal/mcpProtocol/v2025_06_18.ts +4 -7
  555. package/src/ai/internal/mcpProtocol/v2025_11_25.ts +4 -7
  556. package/src/ai/internal/mcpProtocol/v2026_07_28.ts +15 -10
  557. package/src/ai/internal/mcpProtocol.ts +29 -0
  558. package/src/ai/internal/mcpRuntime.ts +9 -5
  559. package/src/ai/internal/mcpStatefulRuntime.ts +14 -2
  560. package/src/cli/Argument.ts +6 -0
  561. package/src/cli/CliOutput.ts +117 -49
  562. package/src/cli/Command.ts +23 -0
  563. package/src/cli/Flag.ts +107 -0
  564. package/src/cli/HelpDoc.ts +18 -1
  565. package/src/cli/Param.ts +6 -0
  566. package/src/cli/Primitive.ts +16 -1
  567. package/src/cli/Prompt.ts +1 -0
  568. package/src/cli/internal/help.ts +21 -9
  569. package/src/cluster/Sharding.ts +93 -26
  570. package/src/cluster/ShardingConfig.ts +41 -3
  571. package/src/cluster/SingleRunner.ts +3 -3
  572. package/src/cluster/SqlMessageStorage.ts +49 -17
  573. package/src/cluster/SqlRunnerStorage.ts +37 -27
  574. package/src/crypto/Aead.ts +517 -0
  575. package/src/crypto/Cipher.ts +326 -0
  576. package/src/crypto/CryptoError.ts +242 -0
  577. package/src/crypto/Digest.ts +167 -0
  578. package/src/crypto/Kdf.ts +315 -0
  579. package/src/crypto/KeyAgreement.ts +489 -0
  580. package/src/crypto/KeyFormat.ts +712 -0
  581. package/src/crypto/KeyWrap.ts +639 -0
  582. package/src/crypto/Mac.ts +386 -0
  583. package/src/crypto/SecureRandom.ts +459 -0
  584. package/src/crypto/Signature.ts +673 -0
  585. package/src/crypto/WebCrypto.ts +64 -0
  586. package/src/crypto/index.ts +78 -0
  587. package/src/crypto/internal/asymmetric.ts +329 -0
  588. package/src/crypto/internal/chacha.ts +1088 -0
  589. package/src/crypto/internal/der.ts +110 -0
  590. package/src/crypto/internal/digest.ts +16 -0
  591. package/src/crypto/internal/key.ts +235 -0
  592. package/src/crypto/internal/md5.ts +170 -0
  593. package/src/crypto/internal/webCrypto.ts +150 -0
  594. package/src/encoding/Base64Url.ts +5 -2
  595. package/src/encoding/Csv.ts +1298 -0
  596. package/src/encoding/Hex.ts +3 -2
  597. package/src/encoding/SchemaBinary.ts +40 -4
  598. package/src/encoding/Toml.ts +85 -20
  599. package/src/encoding/Yaml.ts +61 -18
  600. package/src/encoding/index.ts +6 -0
  601. package/src/eventlog/EventJournal.ts +4 -3
  602. package/src/eventlog/EventLog.ts +340 -15
  603. package/src/eventlog/EventLogEncryption.ts +118 -110
  604. package/src/eventlog/EventLogMessage.ts +273 -1
  605. package/src/eventlog/EventLogRemote.ts +367 -23
  606. package/src/eventlog/EventLogServer.ts +23 -8
  607. package/src/eventlog/EventLogServerEncrypted.ts +1130 -67
  608. package/src/eventlog/EventLogSessionAuth.ts +56 -70
  609. package/src/eventlog/EventRow.ts +12 -3
  610. package/src/eventlog/SqlEventJournal.ts +2 -2
  611. package/src/eventlog/SqlEventLogServerEncrypted.ts +1244 -136
  612. package/src/eventlog/SqlEventLogServerUnencrypted.ts +2 -2
  613. package/src/eventlog/internal/batches.ts +30 -0
  614. package/src/eventlog/internal/compaction.ts +64 -0
  615. package/src/eventlog/internal/identityRootSecretDerivation.ts +93 -123
  616. package/src/eventlog/internal/remoteCompaction.ts +92 -0
  617. package/src/http/Cookies.ts +281 -1
  618. package/src/http/FetchHttpClient.ts +88 -16
  619. package/src/http/HttpClient.ts +89 -22
  620. package/src/http/HttpClientRequest.ts +12 -9
  621. package/src/http/HttpClientResponse.ts +3 -2
  622. package/src/http/HttpMethod.ts +10 -2
  623. package/src/http/HttpServerRequest.ts +15 -30
  624. package/src/http/HttpServerResponse.ts +3 -2
  625. package/src/http/HttpTraceContext.ts +7 -4
  626. package/src/http/ProblemDetails.ts +149 -0
  627. package/src/http/index.ts +6 -0
  628. package/src/http/internal/decompression.ts +4 -4
  629. package/src/http/internal/urlParams.ts +8 -0
  630. package/src/http-api/HttpApiBuilder.ts +24 -12
  631. package/src/http-api/HttpApiClient.ts +67 -1
  632. package/src/http-api/HttpApiEndpoint.ts +14 -5
  633. package/src/http-api/HttpApiError.ts +250 -0
  634. package/src/http-api/HttpApiMiddleware.ts +95 -1
  635. package/src/http-api/HttpApiSchema.ts +105 -14
  636. package/src/index.ts +6 -6
  637. package/src/internal/effect.ts +34 -18
  638. package/src/internal/glob.ts +736 -0
  639. package/src/internal/matcher.ts +17 -0
  640. package/src/internal/persistence.ts +11 -0
  641. package/src/internal/rcRef.ts +4 -1
  642. package/src/internal/schema/toCodeDocument.ts +7 -3
  643. package/src/internal/trie.ts +43 -14
  644. package/src/internal/ulid.ts +44 -0
  645. package/src/internal/uuid.ts +57 -16
  646. package/src/internal/version.ts +1 -1
  647. package/src/observability/Otlp.ts +21 -4
  648. package/src/observability/OtlpResource.ts +9 -1
  649. package/src/persistence/KeyValueStore.ts +219 -22
  650. package/src/persistence/PersistedQueue.ts +128 -59
  651. package/src/persistence/Persistence.ts +20 -13
  652. package/src/process/ChildProcess.ts +255 -260
  653. package/src/process/ChildProcessSpawner.ts +5 -0
  654. package/src/process/CommandLine.ts +630 -0
  655. package/src/process/index.ts +6 -0
  656. package/src/reactivity/Atom.ts +5 -5
  657. package/src/reactivity/AtomRegistry.ts +1 -1
  658. package/src/rpc/RpcClient.ts +62 -26
  659. package/src/rpc/RpcMessage.ts +10 -1
  660. package/src/rpc/RpcSerialization.ts +3 -0
  661. package/src/rpc/RpcServer.ts +176 -78
  662. package/src/schema/Model.ts +26 -3
  663. package/src/sql/Migrator.ts +4 -63
  664. package/src/sql/MigratorFileSystem.ts +71 -0
  665. package/src/sql/SqlClient.ts +2 -16
  666. package/src/sql/Statement.ts +8 -7
  667. package/src/sql/index.ts +1 -1
  668. package/src/testing/index.ts +0 -6
  669. package/src/workflow/internal/crypto.ts +15 -11
  670. package/dist/Crypto.d.ts +0 -244
  671. package/dist/Crypto.d.ts.map +0 -1
  672. package/dist/Crypto.js +0 -139
  673. package/dist/Crypto.js.map +0 -1
  674. package/dist/testing/TestCrypto.d.ts +0 -73
  675. package/dist/testing/TestCrypto.d.ts.map +0 -1
  676. package/dist/testing/TestCrypto.js +0 -87
  677. package/dist/testing/TestCrypto.js.map +0 -1
  678. package/src/Crypto.ts +0 -347
  679. package/src/testing/TestCrypto.ts +0 -94
@@ -1,16 +1,20 @@
1
1
  /**
2
2
  * Defines decisions that a `DecisionModel` answers over a single input.
3
- * Pair an input schema with named classification, rating, or probability
4
- * decisions using `make`, then answer them with `DecisionModel.decide`, or
5
- * with `DecisionModel.decideSettled` to keep valid answers when others fail.
3
+ * Pair an input schema with named classification, rating, probability, or
4
+ * locate decisions using `make`, then answer them with `DecisionModel.decide`,
5
+ * or with `DecisionModel.decideSettled` to keep valid answers when others fail.
6
6
  *
7
7
  * @see {@link make} for building a definition from an input schema and decisions
8
8
  *
9
9
  * @stability unstable
10
10
  * @since 4.0.0
11
11
  */
12
+ import * as Base64 from "../encoding/Base64.ts"
13
+ import * as Predicate from "../Predicate.ts"
12
14
  import type * as Result from "../Result.ts"
13
- import type * as Schema from "../Schema.ts"
15
+ import * as Schema from "../Schema.ts"
16
+ import * as SchemaTransformation from "../SchemaTransformation.ts"
17
+ import type * as DecisionModel from "./DecisionModel.ts"
14
18
 
15
19
  /**
16
20
  * Brand type for decision definitions.
@@ -100,6 +104,162 @@ export interface Probability {
100
104
  } | undefined
101
105
  }
102
106
 
107
+ /**
108
+ * Decision that finds one target in an image field of the input.
109
+ * `image` is the field's path in the encoded input, such as `"photo"` or
110
+ * `"frames[2].frame"`. The answer is a bounding box around the target.
111
+ *
112
+ * @see {@link locate} for the constructor
113
+ * @see {@link LocateAnswer} for the answer produced by this decision
114
+ *
115
+ * @stability unstable
116
+ * @category models
117
+ * @since 4.1.0
118
+ */
119
+ export interface Locate<Field extends string = string> {
120
+ readonly _tag: "Locate"
121
+ readonly image: Field
122
+ readonly instructions: string
123
+ }
124
+
125
+ /**
126
+ * Key that marks an encoded {@link Image}.
127
+ *
128
+ * @stability unstable
129
+ * @category models
130
+ * @since 4.1.0
131
+ */
132
+ export const ImageKey = "~effect/ai/Decision/Image"
133
+
134
+ /**
135
+ * JSON encoding of an {@link Image}: base64 data or a URL with its media type,
136
+ * under {@link ImageKey}.
137
+ *
138
+ * @stability unstable
139
+ * @category models
140
+ * @since 4.1.0
141
+ */
142
+ export interface ImageEncoded {
143
+ readonly [ImageKey]: {
144
+ readonly mediaType: string
145
+ readonly base64: string
146
+ } | {
147
+ readonly mediaType: string
148
+ readonly url: string
149
+ }
150
+ }
151
+
152
+ const isImage = (u: unknown): u is DecisionModel.Image =>
153
+ Predicate.isObject(u) && Predicate.isString(u.mediaType) &&
154
+ (Predicate.isString(u.data) || u.data instanceof globalThis.Uint8Array || u.data instanceof globalThis.URL)
155
+
156
+ /**
157
+ * Type-level representation of the {@link Image} schema.
158
+ *
159
+ * @stability unstable
160
+ * @category models
161
+ * @since 4.1.0
162
+ */
163
+ export interface Image extends
164
+ Schema.decodeTo<
165
+ Schema.declare<DecisionModel.Image>,
166
+ Schema.Struct<{
167
+ readonly [ImageKey]: Schema.Union<
168
+ readonly [
169
+ Schema.Struct<{ readonly mediaType: Schema.String; readonly base64: Schema.String }>,
170
+ Schema.Struct<{ readonly mediaType: Schema.String; readonly url: Schema.URLFromString }>
171
+ ]
172
+ >
173
+ }>
174
+ >
175
+ {
176
+ readonly "Rebuild": Image
177
+ }
178
+
179
+ /**
180
+ * Schema for an image input field. Its type is `DecisionModel.Image`: a
181
+ * media type with base64 data, bytes, or a URL. Decisions refer to the image
182
+ * by the field's path, like any other field.
183
+ *
184
+ * **Details**
185
+ *
186
+ * The field encodes to an {@link ImageEncoded} object. `DecisionModel.decide`
187
+ * replaces each one in the encoded input with a reference string and sends the
188
+ * images to the provider separately; an image used in several fields is sent
189
+ * once. The encoded shape also appears in JSON Schema generated from the input.
190
+ *
191
+ * **Example** (Declaring an image field)
192
+ *
193
+ * ```ts
194
+ * import { Schema } from "effect"
195
+ * import { Decision } from "effect/ai"
196
+ *
197
+ * const Listing = Schema.Struct({
198
+ * title: Schema.String,
199
+ * photo: Decision.Image
200
+ * })
201
+ * ```
202
+ *
203
+ * @stability unstable
204
+ * @category schemas
205
+ * @since 4.1.0
206
+ */
207
+ export const Image: Image = Schema.Struct({
208
+ [ImageKey]: Schema.Union([
209
+ Schema.Struct({ mediaType: Schema.String, base64: Schema.String }),
210
+ Schema.Struct({ mediaType: Schema.String, url: Schema.URLFromString })
211
+ ])
212
+ }).pipe(
213
+ Schema.decodeTo(
214
+ Schema.declare(isImage, { expected: "DecisionModel.Image" }),
215
+ SchemaTransformation.transform({
216
+ decode: ({ [ImageKey]: image }): DecisionModel.Image => ({
217
+ mediaType: image.mediaType,
218
+ data: "base64" in image ? image.base64 : image.url
219
+ }),
220
+ encode: ({ mediaType, data }) => ({
221
+ [ImageKey]: data instanceof globalThis.URL
222
+ ? { mediaType, url: data }
223
+ : { mediaType, base64: typeof data === "string" ? data : Base64.encode(data) }
224
+ })
225
+ })
226
+ )
227
+ )
228
+
229
+ type PrevDepth = [never, 0, 1, 2, 3, 4]
230
+
231
+ type ImagePathSuffixes<A, Depth extends number> = [Depth] extends [never] ? never
232
+ : A extends ImageEncoded ? ""
233
+ : A extends ReadonlyArray<unknown> ?
234
+ number extends A["length"] ? `[${number}]${ImagePathSuffixes<A[number], PrevDepth[Depth]>}`
235
+ : {
236
+ [K in keyof A & `${number}`]: `[${K}]${ImagePathSuffixes<A[K], PrevDepth[Depth]>}`
237
+ }[keyof A & `${number}`]
238
+ : A extends object ? {
239
+ [K in keyof A & string]-?: K extends `${string}.${string}` | `${string}[${string}` ? never
240
+ : {} extends Pick<A, K> ? never
241
+ : `.${K}${ImagePathSuffixes<A[K], PrevDepth[Depth]>}`
242
+ }[keyof A & string]
243
+ : never
244
+
245
+ /**
246
+ * Paths to the required {@link Image} fields of an encoded input type, as
247
+ * accepted by {@link locate}. Object keys are joined with `.`, and array
248
+ * elements use `[index]`: exact indices for tuples, any number for arrays.
249
+ *
250
+ * **Details**
251
+ *
252
+ * Paths reach four levels deep. Optional fields and keys containing `.` or
253
+ * `[` are excluded.
254
+ *
255
+ * @stability unstable
256
+ * @category utility types
257
+ * @since 4.1.0
258
+ */
259
+ export type ImagePaths<A> = ImagePathSuffixes<A, 4> extends infer Path extends string ?
260
+ Path extends "" ? never : Path extends `.${infer Rest}` ? Rest : Path :
261
+ never
262
+
103
263
  /**
104
264
  * Union of every decision kind.
105
265
  *
@@ -107,7 +267,7 @@ export interface Probability {
107
267
  * @category models
108
268
  * @since 4.0.0
109
269
  */
110
- export type Any = Classify<string> | Rate<string> | Probability
270
+ export type Any = Classify<string> | Rate<string> | Probability | Locate
111
271
 
112
272
  /**
113
273
  * Answer to a {@link Classify} decision.
@@ -154,6 +314,38 @@ export interface ProbabilityAnswer {
154
314
  readonly probability: number
155
315
  }
156
316
 
317
+ /**
318
+ * Smallest rectangle that contains a located target. Each edge is a fraction
319
+ * of the image's size measured from the top-left corner: `left` and `right`
320
+ * of its width, `top` and `bottom` of its height. Edges are in `[0, 1]`, with
321
+ * `left <= right` and `top <= bottom`.
322
+ *
323
+ * @stability unstable
324
+ * @category models
325
+ * @since 4.1.0
326
+ */
327
+ export interface BoundingBox {
328
+ readonly left: number
329
+ readonly top: number
330
+ readonly right: number
331
+ readonly bottom: number
332
+ }
333
+
334
+ /**
335
+ * Answer to a {@link Locate} decision.
336
+ * There is no "not found" answer: a target absent from the image still gets a
337
+ * box. Pair the decision with a {@link Probability} that the target is present.
338
+ * `confidence` is an optional, provider-defined measure in `[0, 1]`.
339
+ *
340
+ * @stability unstable
341
+ * @category models
342
+ * @since 4.1.0
343
+ */
344
+ export interface LocateAnswer {
345
+ readonly box: BoundingBox
346
+ readonly confidence?: number | undefined
347
+ }
348
+
157
349
  /**
158
350
  * Answer type for a single decision.
159
351
  *
@@ -164,6 +356,7 @@ export interface ProbabilityAnswer {
164
356
  export type Answer<D extends Any> = D extends Classify<infer Label> ? ClassifyAnswer<Label>
165
357
  : D extends Rate<infer Level> ? RateAnswer<Level>
166
358
  : D extends Probability ? ProbabilityAnswer
359
+ : D extends Locate ? LocateAnswer
167
360
  : never
168
361
 
169
362
  /**
@@ -395,6 +588,58 @@ export const probability = (options: {
395
588
  criteria: options.criteria
396
589
  })
397
590
 
591
+ /**
592
+ * Creates a decision that finds one target in an image field of the input.
593
+ * `image` is the field's path in the encoded input: keys joined with `.` and
594
+ * array indices in brackets, such as `"frames[2].frame"`. The model must be
595
+ * created with `supportsLocate: true`.
596
+ *
597
+ * **Details**
598
+ *
599
+ * Paths use encoded key names, so a key renamed with `Schema.encodeKeys` is
600
+ * targeted by its encoded name. `make` accepts only paths to required
601
+ * {@link Image} fields, and `DecisionModel.decide` fails with
602
+ * `AiError.InvalidUserInputError` when the path holds no image, such as an
603
+ * index past the end of an array.
604
+ *
605
+ * The answer is always one box, even when the target is absent. Pair the
606
+ * decision with a {@link probability} decision that the target is present.
607
+ *
608
+ * **Gotchas**
609
+ *
610
+ * - For a generic input schema, the compiler error for an invalid path names
611
+ * the whole decision type rather than the path.
612
+ *
613
+ * **Example** (Finding a mug in a photo)
614
+ *
615
+ * ```ts
616
+ * import { Schema } from "effect"
617
+ * import { Decision } from "effect/ai"
618
+ *
619
+ * const FindMug = Decision.make({
620
+ * input: Schema.Struct({ photo: Decision.Image }),
621
+ * decisions: {
622
+ * present: Decision.probability({ instructions: "`photo` shows a coffee mug" }),
623
+ * mug: Decision.locate({ image: "photo", instructions: "the coffee mug" })
624
+ * }
625
+ * })
626
+ * ```
627
+ *
628
+ * @see {@link LocateAnswer} for the answer
629
+ *
630
+ * @stability unstable
631
+ * @category constructors
632
+ * @since 4.1.0
633
+ */
634
+ export const locate = <const Field extends string>(options: {
635
+ readonly image: Field
636
+ readonly instructions: string
637
+ }): Locate<Field> => ({
638
+ _tag: "Locate",
639
+ image: options.image,
640
+ instructions: options.instructions
641
+ })
642
+
398
643
  /**
399
644
  * Creates a decision definition from an input schema and named decisions.
400
645
  * `DecisionModel.decide` encodes the input with `Schema.toCodecJson` before
@@ -433,7 +678,13 @@ export const probability = (options: {
433
678
  * @category constructors
434
679
  * @since 4.0.0
435
680
  */
436
- export const make = <Input extends Schema.Constraint, Decisions extends Record<string, Any>>(options: {
681
+ export const make = <
682
+ Input extends Schema.Constraint,
683
+ Decisions extends Record<
684
+ string,
685
+ Classify<string> | Rate<string> | Probability | Locate<ImagePaths<Input["Encoded"]>>
686
+ >
687
+ >(options: {
437
688
  readonly input: Input
438
689
  readonly decisions: Decisions
439
690
  }): Definition<Input, Decisions> => {
@@ -9,11 +9,13 @@
9
9
  */
10
10
  import * as Context from "../Context.ts"
11
11
  import * as Effect from "../Effect.ts"
12
+ import * as Uuid from "../internal/uuid.ts"
12
13
  import * as Predicate from "../Predicate.ts"
14
+ import * as Random from "../Random.ts"
13
15
  import * as Result from "../Result.ts"
14
16
  import * as Schema from "../Schema.ts"
15
17
  import * as AiError from "./AiError.ts"
16
- import type * as Decision from "./Decision.ts"
18
+ import * as Decision from "./Decision.ts"
17
19
  import type * as Response from "./Response.ts"
18
20
 
19
21
  /**
@@ -71,14 +73,10 @@ export class DecisionUsage extends Schema.Class<DecisionUsage>(
71
73
  */
72
74
  export interface DecideOptions<Input extends Schema.Constraint> {
73
75
  readonly input: Input["Type"]
74
- /**
75
- * Images to include with the input.
76
- */
77
- readonly images?: ReadonlyArray<Image> | undefined
78
76
  }
79
77
 
80
78
  /**
81
- * An image sent to the provider with the encoded input.
79
+ * An image in the input, declared with a `Decision.Image` field.
82
80
  * `data` is a base64 string, a byte array, or a URL.
83
81
  *
84
82
  * @stability unstable
@@ -90,6 +88,24 @@ export interface Image {
90
88
  readonly data: string | Uint8Array | URL
91
89
  }
92
90
 
91
+ /**
92
+ * An image extracted from the encoded input. `state` holds `reference` where
93
+ * the image was, and `path` is where it was first found. `data` is a base64
94
+ * string or a URL.
95
+ *
96
+ * @stability unstable
97
+ * @category models
98
+ * @since 4.1.0
99
+ */
100
+ export interface ProviderImage {
101
+ readonly reference: string
102
+ readonly path: ReadonlyArray<string | number>
103
+ readonly image: {
104
+ readonly mediaType: string
105
+ readonly data: string | URL
106
+ }
107
+ }
108
+
93
109
  /**
94
110
  * Provider-specific response metadata keyed by provider name. Provider
95
111
  * packages augment this interface.
@@ -155,16 +171,18 @@ export interface DecideSettledResponse<Decisions extends Record<string, Decision
155
171
  * Provider input options for a decision request.
156
172
  * `state` is encoded with `Schema.toCodecJson`, not stringified.
157
173
  * All `decisions` must be answered in one call.
158
- * `images` is omitted when no images are supplied.
174
+ * `images` holds the `Decision.Image` values found in the input and is omitted
175
+ * when there are none.
176
+ * `Decisions` is the union of decision kinds the provider receives.
159
177
  *
160
178
  * @stability unstable
161
179
  * @category options
162
180
  * @since 4.0.0
163
181
  */
164
- export interface ProviderOptions {
182
+ export interface ProviderOptions<Decisions extends Decision.Any = Decision.Any> {
165
183
  readonly state: Schema.Json
166
- readonly decisions: Record<string, Decision.Any>
167
- readonly images?: ReadonlyArray<Image> | undefined
184
+ readonly decisions: Record<string, Decisions>
185
+ readonly images?: ReadonlyArray<ProviderImage> | undefined
168
186
  }
169
187
 
170
188
  /**
@@ -219,6 +237,19 @@ export interface ProviderRefusalAnswer {
219
237
  readonly _tag: "Refusal"
220
238
  }
221
239
 
240
+ /**
241
+ * Provider answer for a locate decision.
242
+ *
243
+ * @stability unstable
244
+ * @category models
245
+ * @since 4.1.0
246
+ */
247
+ export interface ProviderLocateAnswer {
248
+ readonly _tag: "Locate"
249
+ readonly box: Decision.BoundingBox
250
+ readonly confidence?: number | undefined
251
+ }
252
+
222
253
  /**
223
254
  * Provider answer for any decision kind.
224
255
  *
@@ -231,6 +262,7 @@ export type ProviderAnswer =
231
262
  | ProviderRateAnswer
232
263
  | ProviderProbabilityAnswer
233
264
  | ProviderRefusalAnswer
265
+ | ProviderLocateAnswer
234
266
 
235
267
  /**
236
268
  * Provider response for a decision request.
@@ -283,6 +315,70 @@ const invalid = (description: string) => unanswered("Invalid", description)
283
315
  const aiError = (method: "decide" | "decideSettled", reason: AiError.AiErrorReason): AiError.AiError =>
284
316
  AiError.make({ module: "DecisionModel", method, reason })
285
317
 
318
+ const invalidUserInput = (method: "decide" | "decideSettled", description: string): AiError.AiError =>
319
+ aiError(method, new AiError.InvalidUserInputError({ description }))
320
+
321
+ const toProviderImage = (value: unknown): ProviderImage["image"] | undefined => {
322
+ if (!Predicate.isObject(value) || Object.keys(value).length !== 1) return undefined
323
+ const image = value[Decision.ImageKey]
324
+ if (!Predicate.isObject(image) || Object.keys(image).length !== 2 || !Predicate.isString(image.mediaType)) {
325
+ return undefined
326
+ }
327
+ if (Predicate.isString(image.base64)) return { mediaType: image.mediaType, data: image.base64 }
328
+ if (Predicate.isString(image.url) && URL.canParse(image.url)) {
329
+ return { mediaType: image.mediaType, data: new URL(image.url) }
330
+ }
331
+ return undefined
332
+ }
333
+
334
+ const formatPath = (path: ReadonlyArray<string | number>): string =>
335
+ path.map((segment, index) => typeof segment === "number" ? `[${segment}]` : index === 0 ? segment : `.${segment}`)
336
+ .join("")
337
+
338
+ const randomUuid = (random: Random.Random): string => {
339
+ const bytes = new Uint8Array(16)
340
+ for (let index = 0; index < bytes.length; index++) {
341
+ bytes[index] = Math.floor(random.nextDoubleUnsafe() * 256)
342
+ }
343
+ return Uuid.v4String(bytes)
344
+ }
345
+
346
+ /**
347
+ * Replaces each encoded `Decision.Image` in `state` with a reference. Equal
348
+ * images share one reference. `paths` holds every path where an image was found.
349
+ */
350
+ const extractImages = (state: Schema.Json, random: Random.Random) => {
351
+ const images: Array<ProviderImage> = []
352
+ const references = new Map<string, string>()
353
+ const paths = new Set<string>()
354
+ const walk = (value: Schema.Json, path: ReadonlyArray<string | number>): Schema.Json => {
355
+ const image = toProviderImage(value)
356
+ if (image !== undefined) {
357
+ paths.add(formatPath(path))
358
+ const key = `${image.mediaType}\n${
359
+ typeof image.data === "string" ? `base64:${image.data}` : `url:${image.data.href}`
360
+ }`
361
+ let reference = references.get(key)
362
+ if (reference === undefined) {
363
+ reference = randomUuid(random)
364
+ references.set(key, reference)
365
+ images.push({ reference, path, image })
366
+ }
367
+ return reference
368
+ }
369
+ if (Array.isArray(value)) {
370
+ return value.map((item, index) => walk(item, [...path, index]))
371
+ }
372
+ if (Predicate.isObject(value)) {
373
+ return Object.fromEntries(
374
+ Object.entries(value).map(([key, item]) => [key, walk(item as Schema.Json, [...path, key])])
375
+ )
376
+ }
377
+ return value
378
+ }
379
+ return { state: walk(state, []), images, paths }
380
+ }
381
+
286
382
  const isFiniteNumber = (value: unknown): value is number => Predicate.isNumber(value) && Number.isFinite(value)
287
383
 
288
384
  const isUnitInterval = (value: unknown): value is number => isFiniteNumber(value) && value >= 0 && value <= 1
@@ -390,6 +486,23 @@ const validateAnswer = (
390
486
  }
391
487
  return Result.succeed({ probability: answer.probability })
392
488
  }
489
+ case "Locate": {
490
+ const box = answer.box
491
+ if (
492
+ !Predicate.isObject(box) || !isUnitInterval(box.left) || !isUnitInterval(box.top) ||
493
+ !isUnitInterval(box.right) || !isUnitInterval(box.bottom)
494
+ ) {
495
+ return invalid(`Provider returned a box with edges outside [0, 1] for decision "${key}"`)
496
+ }
497
+ if (box.left > box.right || box.top > box.bottom) {
498
+ return invalid(`Provider returned a box with crossed edges for decision "${key}"`)
499
+ }
500
+ const bounds = { left: box.left, top: box.top, right: box.right, bottom: box.bottom }
501
+ return Result.map(validateConfidence(key, answer), (confidence) => ({
502
+ box: bounds,
503
+ ...(confidence === undefined ? undefined : { confidence })
504
+ }))
505
+ }
393
506
  }
394
507
  }
395
508
 
@@ -436,16 +549,24 @@ const requireAnswers = <Decisions extends Record<string, Decision.Any>>(
436
549
  * Creates a `DecisionModel` that encodes inputs as JSON and validates provider answers.
437
550
  * Answers must cover every decision and use its labels. Distributions must
438
551
  * sum to 1 within `1e-6`, optional confidence must be in `[0, 1]`, and ratings must be
439
- * in `[0, criteria.length - 1]`. With `decide`, refused decisions fail with
552
+ * in `[0, criteria.length - 1]`, and boxes must have edges in `[0, 1]` that do
553
+ * not cross. With `decide`, refused decisions fail with
440
554
  * `AiError.ContentPolicyError` and other unanswered decisions fail with
441
555
  * `AiError.InvalidOutputError`; `decideSettled` reports them per decision
442
556
  * instead. Encoding failures use `AiError.InvalidUserInputError`.
443
557
  *
444
558
  * **Details**
445
559
  *
446
- * Set `supportsImages: true` to accept images. Otherwise, nonempty image input
560
+ * After encoding, each `Decision.Image` in the input is replaced with a
561
+ * reference string, and the provider receives the images in `images`. Set
562
+ * `supportsImages: true` to accept images. Otherwise, an input with images
447
563
  * fails with `AiError.InvalidUserInputError`.
448
564
  *
565
+ * Set `supportsLocate: true` to accept locate decisions; only then does
566
+ * `decide` receive them. Otherwise, a definition with a locate decision fails
567
+ * with `AiError.InvalidUserInputError`, as does a locate decision whose path
568
+ * holds no image.
569
+ *
449
570
  * Providers that round each probability to `probabilityPrecision` decimal
450
571
  * places may return distributions whose sum drifts from 1 by up to half a unit
451
572
  * of the last place per label. Setting `probabilityPrecision` accepts that
@@ -459,11 +580,21 @@ const requireAnswers = <Decisions extends Record<string, Decision.Any>>(
459
580
  * @category constructors
460
581
  * @since 4.0.0
461
582
  */
462
- export const make = (params: {
463
- readonly decide: (options: ProviderOptions) => Effect.Effect<ProviderResponse, AiError.AiError>
464
- readonly probabilityPrecision?: number | undefined
465
- readonly supportsImages?: boolean | undefined
466
- }): Effect.Effect<DecisionModel> =>
583
+ export const make = (
584
+ params: {
585
+ readonly decide: (
586
+ options: ProviderOptions<Exclude<Decision.Any, Decision.Locate>>
587
+ ) => Effect.Effect<ProviderResponse, AiError.AiError>
588
+ readonly probabilityPrecision?: number | undefined
589
+ readonly supportsImages?: boolean | undefined
590
+ readonly supportsLocate?: false | undefined
591
+ } | {
592
+ readonly decide: (options: ProviderOptions) => Effect.Effect<ProviderResponse, AiError.AiError>
593
+ readonly probabilityPrecision?: number | undefined
594
+ readonly supportsImages?: boolean | undefined
595
+ readonly supportsLocate: true
596
+ }
597
+ ): Effect.Effect<DecisionModel> =>
467
598
  Effect.sync(() => {
468
599
  const roundingError = params.probabilityPrecision === undefined ? 0 : 0.5 * 10 ** -params.probabilityPrecision
469
600
  const settle = <Input extends Schema.Constraint, Decisions extends Record<string, Decision.Any>>(
@@ -472,21 +603,33 @@ export const make = (params: {
472
603
  options: DecideOptions<Input>
473
604
  ): Effect.Effect<DecideSettledResponse<Decisions>, AiError.AiError, Input["EncodingServices"]> =>
474
605
  Schema.encodeEffect(Schema.toCodecJson(definition.input))(options.input).pipe(
475
- Effect.mapError((error) => aiError(method, new AiError.InvalidUserInputError({ description: error.message }))),
476
- Effect.flatMap((state) => {
477
- const images = options.images?.length ? options.images : undefined
478
- if (images !== undefined && params.supportsImages !== true) {
479
- return Effect.fail(
480
- aiError(
481
- method,
482
- new AiError.InvalidUserInputError({ description: "This decision model does not accept images" })
606
+ Effect.mapError((error) => invalidUserInput(method, error.message)),
607
+ Effect.flatMap((encoded) =>
608
+ Effect.withFiber((fiber) => Effect.succeed(extractImages(encoded, fiber.getRef(Random.Random))))
609
+ ),
610
+ Effect.flatMap(({ state, images, paths }) => {
611
+ if (images.length > 0 && params.supportsImages !== true) {
612
+ return Effect.fail(invalidUserInput(method, "This decision model does not accept images"))
613
+ }
614
+ for (const [key, decision] of Object.entries(definition.decisions)) {
615
+ if (decision._tag !== "Locate") continue
616
+ if (params.supportsLocate !== true) {
617
+ return Effect.fail(invalidUserInput(method, "This decision model does not support locate decisions"))
618
+ }
619
+ if (!paths.has(decision.image)) {
620
+ return Effect.fail(
621
+ invalidUserInput(method, `Locate decision "${key}" targets "${decision.image}", which holds no image`)
483
622
  )
484
- )
623
+ }
485
624
  }
486
- return params.decide({
625
+ // Locate decisions were rejected above unless `supportsLocate` is true.
626
+ const decide = params.decide as (
627
+ options: ProviderOptions
628
+ ) => Effect.Effect<ProviderResponse, AiError.AiError>
629
+ return decide({
487
630
  state,
488
631
  decisions: definition.decisions,
489
- ...(images === undefined ? undefined : { images })
632
+ ...(images.length === 0 ? undefined : { images })
490
633
  })
491
634
  }),
492
635
  Effect.map((response): DecideSettledResponse<Decisions> => ({