agentfootprint 9.128.1 → 9.131.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 (603) hide show
  1. package/CAPABILITIES.md +13 -1
  2. package/dist/adapters/llm/AnthropicProvider.js +10 -111
  3. package/dist/adapters/llm/AnthropicProvider.js.map +1 -1
  4. package/dist/adapters/llm/BedrockProvider.js +11 -4
  5. package/dist/adapters/llm/BedrockProvider.js.map +1 -1
  6. package/dist/adapters/llm/InvokeModelGatewayProvider.js +167 -35
  7. package/dist/adapters/llm/InvokeModelGatewayProvider.js.map +1 -1
  8. package/dist/adapters/llm/OpenAIProvider.js +5 -0
  9. package/dist/adapters/llm/OpenAIProvider.js.map +1 -1
  10. package/dist/adapters/llm/anthropicMessagesWire.js +20 -6
  11. package/dist/adapters/llm/anthropicMessagesWire.js.map +1 -1
  12. package/dist/adapters/llm/retryAfter.js +61 -0
  13. package/dist/adapters/llm/retryAfter.js.map +1 -0
  14. package/dist/adapters/types.js.map +1 -1
  15. package/dist/artifacts/datasetResult.js +2 -2
  16. package/dist/artifacts/datasetResult.js.map +1 -1
  17. package/dist/artifacts/index.js +10 -8
  18. package/dist/artifacts/index.js.map +1 -1
  19. package/dist/artifacts/minting.js +2 -2
  20. package/dist/artifacts/minting.js.map +1 -1
  21. package/dist/core/Agent.js +229 -5
  22. package/dist/core/Agent.js.map +1 -1
  23. package/dist/core/agent/AgentBuilder.js +75 -1
  24. package/dist/core/agent/AgentBuilder.js.map +1 -1
  25. package/dist/core/agent/arguments/ask.js +356 -14
  26. package/dist/core/agent/arguments/ask.js.map +1 -1
  27. package/dist/core/agent/arguments/declare.js +260 -45
  28. package/dist/core/agent/arguments/declare.js.map +1 -1
  29. package/dist/core/agent/arguments/dispatch.js +25 -1
  30. package/dist/core/agent/arguments/dispatch.js.map +1 -1
  31. package/dist/core/agent/arguments/resolve.js +239 -6
  32. package/dist/core/agent/arguments/resolve.js.map +1 -1
  33. package/dist/core/agent/arguments/rows.js +37 -2
  34. package/dist/core/agent/arguments/rows.js.map +1 -1
  35. package/dist/core/agent/arguments/serve.js +332 -4
  36. package/dist/core/agent/arguments/serve.js.map +1 -1
  37. package/dist/core/agent/arguments/subflow.js +46 -7
  38. package/dist/core/agent/arguments/subflow.js.map +1 -1
  39. package/dist/core/agent/assessment/assess.js +45 -6
  40. package/dist/core/agent/assessment/assess.js.map +1 -1
  41. package/dist/core/agent/assessment/compose.js +3 -0
  42. package/dist/core/agent/assessment/compose.js.map +1 -1
  43. package/dist/core/agent/assessment/reasons.js +18 -0
  44. package/dist/core/agent/assessment/reasons.js.map +1 -1
  45. package/dist/core/agent/buildAgentChart.js +31 -1
  46. package/dist/core/agent/buildAgentChart.js.map +1 -1
  47. package/dist/core/agent/buildDynamicAgentChart.js +9 -0
  48. package/dist/core/agent/buildDynamicAgentChart.js.map +1 -1
  49. package/dist/core/agent/coverage/answer.js +24 -7
  50. package/dist/core/agent/coverage/answer.js.map +1 -1
  51. package/dist/core/agent/coverage/period.js +110 -69
  52. package/dist/core/agent/coverage/period.js.map +1 -1
  53. package/dist/core/agent/coverage/timeLimitFacts.js +70 -0
  54. package/dist/core/agent/coverage/timeLimitFacts.js.map +1 -0
  55. package/dist/core/agent/coverage/timeLimits.js +72 -0
  56. package/dist/core/agent/coverage/timeLimits.js.map +1 -0
  57. package/dist/core/agent/evidence/evidenceIndex.js +48 -7
  58. package/dist/core/agent/evidence/evidenceIndex.js.map +1 -1
  59. package/dist/core/agent/evidence/gate.js +9 -4
  60. package/dist/core/agent/evidence/gate.js.map +1 -1
  61. package/dist/core/agent/evidence/normalize.js +1 -105
  62. package/dist/core/agent/evidence/normalize.js.map +1 -1
  63. package/dist/core/agent/findings/ledger.js +14 -0
  64. package/dist/core/agent/findings/ledger.js.map +1 -1
  65. package/dist/core/agent/findings/types.js.map +1 -1
  66. package/dist/core/agent/honesty/mounts.js +105 -4
  67. package/dist/core/agent/honesty/mounts.js.map +1 -1
  68. package/dist/core/agent/results/subflow.js +43 -11
  69. package/dist/core/agent/results/subflow.js.map +1 -1
  70. package/dist/core/agent/stages/argumentAsk.js +85 -6
  71. package/dist/core/agent/stages/argumentAsk.js.map +1 -1
  72. package/dist/core/agent/stages/callLLM.js +16 -0
  73. package/dist/core/agent/stages/callLLM.js.map +1 -1
  74. package/dist/core/agent/stages/prepareFinal.js +61 -8
  75. package/dist/core/agent/stages/prepareFinal.js.map +1 -1
  76. package/dist/core/agent/stages/route.js +64 -6
  77. package/dist/core/agent/stages/route.js.map +1 -1
  78. package/dist/core/agent/stages/seed.js +29 -6
  79. package/dist/core/agent/stages/seed.js.map +1 -1
  80. package/dist/core/agent/stages/timeLayer.js +201 -0
  81. package/dist/core/agent/stages/timeLayer.js.map +1 -0
  82. package/dist/core/agent/stages/timeLineage.js +61 -0
  83. package/dist/core/agent/stages/timeLineage.js.map +1 -0
  84. package/dist/core/agent/stages/toolCalls.js +70 -0
  85. package/dist/core/agent/stages/toolCalls.js.map +1 -1
  86. package/dist/core/inputRequest.js +132 -5
  87. package/dist/core/inputRequest.js.map +1 -1
  88. package/dist/core/messageFrom.js +5 -2
  89. package/dist/core/messageFrom.js.map +1 -1
  90. package/dist/core/runCheckpoint.js +17 -2
  91. package/dist/core/runCheckpoint.js.map +1 -1
  92. package/dist/core/slots/buildToolsSlot.js +30 -2
  93. package/dist/core/slots/buildToolsSlot.js.map +1 -1
  94. package/dist/core/time/ask.js +239 -0
  95. package/dist/core/time/ask.js.map +1 -0
  96. package/dist/core/time/axis.js +469 -0
  97. package/dist/core/time/axis.js.map +1 -0
  98. package/dist/core/time/bind.js +235 -0
  99. package/dist/core/time/bind.js.map +1 -0
  100. package/dist/core/time/check.js +261 -0
  101. package/dist/core/time/check.js.map +1 -0
  102. package/dist/core/time/checkRecord.js +97 -0
  103. package/dist/core/time/checkRecord.js.map +1 -0
  104. package/dist/core/time/clock.js +260 -0
  105. package/dist/core/time/clock.js.map +1 -0
  106. package/dist/core/time/convert.js +634 -0
  107. package/dist/core/time/convert.js.map +1 -0
  108. package/dist/core/time/drift.js +96 -0
  109. package/dist/core/time/drift.js.map +1 -0
  110. package/dist/core/time/duration.js +125 -0
  111. package/dist/core/time/duration.js.map +1 -0
  112. package/dist/core/time/forms.js +273 -0
  113. package/dist/core/time/forms.js.map +1 -0
  114. package/dist/core/time/instant.js +141 -0
  115. package/dist/core/time/instant.js.map +1 -0
  116. package/dist/core/time/periodForm.js +392 -0
  117. package/dist/core/time/periodForm.js.map +1 -0
  118. package/dist/core/time/present.js +312 -0
  119. package/dist/core/time/present.js.map +1 -0
  120. package/dist/core/time/range.js +267 -0
  121. package/dist/core/time/range.js.map +1 -0
  122. package/dist/core/time/reader.js +209 -0
  123. package/dist/core/time/reader.js.map +1 -0
  124. package/dist/core/time/readers/english.js +576 -0
  125. package/dist/core/time/readers/english.js.map +1 -0
  126. package/dist/core/time/readingAsk.js +94 -0
  127. package/dist/core/time/readingAsk.js.map +1 -0
  128. package/dist/core/time/resolve.js +694 -0
  129. package/dist/core/time/resolve.js.map +1 -0
  130. package/dist/core/time/resolveRecord.js +164 -0
  131. package/dist/core/time/resolveRecord.js.map +1 -0
  132. package/dist/core/time/rows.js +412 -0
  133. package/dist/core/time/rows.js.map +1 -0
  134. package/dist/core/time/rowsBuild.js +193 -0
  135. package/dist/core/time/rowsBuild.js.map +1 -0
  136. package/dist/core/time/textForms.js +133 -0
  137. package/dist/core/time/textForms.js.map +1 -0
  138. package/dist/core/time/windows.js +172 -0
  139. package/dist/core/time/windows.js.map +1 -0
  140. package/dist/core/time/wire.js +86 -0
  141. package/dist/core/time/wire.js.map +1 -0
  142. package/dist/core/time/zone.js +253 -0
  143. package/dist/core/time/zone.js.map +1 -0
  144. package/dist/core/tools.js.map +1 -1
  145. package/dist/esm/adapters/llm/AnthropicProvider.js +8 -109
  146. package/dist/esm/adapters/llm/AnthropicProvider.js.map +1 -1
  147. package/dist/esm/adapters/llm/BedrockProvider.js +11 -4
  148. package/dist/esm/adapters/llm/BedrockProvider.js.map +1 -1
  149. package/dist/esm/adapters/llm/InvokeModelGatewayProvider.d.ts +38 -4
  150. package/dist/esm/adapters/llm/InvokeModelGatewayProvider.js +167 -35
  151. package/dist/esm/adapters/llm/InvokeModelGatewayProvider.js.map +1 -1
  152. package/dist/esm/adapters/llm/OpenAIProvider.js +5 -0
  153. package/dist/esm/adapters/llm/OpenAIProvider.js.map +1 -1
  154. package/dist/esm/adapters/llm/anthropicMessagesWire.d.ts +6 -1
  155. package/dist/esm/adapters/llm/anthropicMessagesWire.js +20 -6
  156. package/dist/esm/adapters/llm/anthropicMessagesWire.js.map +1 -1
  157. package/dist/esm/adapters/llm/retryAfter.d.ts +27 -0
  158. package/dist/esm/adapters/llm/retryAfter.js +56 -0
  159. package/dist/esm/adapters/llm/retryAfter.js.map +1 -0
  160. package/dist/esm/adapters/types.d.ts +9 -0
  161. package/dist/esm/adapters/types.js.map +1 -1
  162. package/dist/esm/artifacts/datasetResult.js +1 -1
  163. package/dist/esm/artifacts/datasetResult.js.map +1 -1
  164. package/dist/esm/artifacts/index.d.ts +1 -1
  165. package/dist/esm/artifacts/index.js +3 -2
  166. package/dist/esm/artifacts/index.js.map +1 -1
  167. package/dist/esm/artifacts/minting.js +1 -1
  168. package/dist/esm/artifacts/minting.js.map +1 -1
  169. package/dist/esm/artifacts/types.d.ts +2 -2
  170. package/dist/esm/core/Agent.d.ts +64 -0
  171. package/dist/esm/core/Agent.js +230 -6
  172. package/dist/esm/core/Agent.js.map +1 -1
  173. package/dist/esm/core/agent/AgentBuilder.d.ts +60 -0
  174. package/dist/esm/core/agent/AgentBuilder.js +75 -1
  175. package/dist/esm/core/agent/AgentBuilder.js.map +1 -1
  176. package/dist/esm/core/agent/arguments/ask.d.ts +88 -5
  177. package/dist/esm/core/agent/arguments/ask.js +349 -8
  178. package/dist/esm/core/agent/arguments/ask.js.map +1 -1
  179. package/dist/esm/core/agent/arguments/checks.d.ts +1 -1
  180. package/dist/esm/core/agent/arguments/declare.d.ts +76 -15
  181. package/dist/esm/core/agent/arguments/declare.js +255 -44
  182. package/dist/esm/core/agent/arguments/declare.js.map +1 -1
  183. package/dist/esm/core/agent/arguments/dispatch.js +25 -1
  184. package/dist/esm/core/agent/arguments/dispatch.js.map +1 -1
  185. package/dist/esm/core/agent/arguments/resolve.d.ts +77 -7
  186. package/dist/esm/core/agent/arguments/resolve.js +239 -8
  187. package/dist/esm/core/agent/arguments/resolve.js.map +1 -1
  188. package/dist/esm/core/agent/arguments/rows.d.ts +31 -2
  189. package/dist/esm/core/agent/arguments/rows.js +35 -1
  190. package/dist/esm/core/agent/arguments/rows.js.map +1 -1
  191. package/dist/esm/core/agent/arguments/serve.d.ts +133 -4
  192. package/dist/esm/core/agent/arguments/serve.js +328 -4
  193. package/dist/esm/core/agent/arguments/serve.js.map +1 -1
  194. package/dist/esm/core/agent/arguments/subflow.d.ts +28 -0
  195. package/dist/esm/core/agent/arguments/subflow.js +47 -8
  196. package/dist/esm/core/agent/arguments/subflow.js.map +1 -1
  197. package/dist/esm/core/agent/assessment/assess.js +45 -6
  198. package/dist/esm/core/agent/assessment/assess.js.map +1 -1
  199. package/dist/esm/core/agent/assessment/compose.js +3 -0
  200. package/dist/esm/core/agent/assessment/compose.js.map +1 -1
  201. package/dist/esm/core/agent/assessment/reasons.js +18 -0
  202. package/dist/esm/core/agent/assessment/reasons.js.map +1 -1
  203. package/dist/esm/core/agent/assessment/types.d.ts +15 -1
  204. package/dist/esm/core/agent/buildAgentChart.d.ts +41 -0
  205. package/dist/esm/core/agent/buildAgentChart.js +28 -0
  206. package/dist/esm/core/agent/buildAgentChart.js.map +1 -1
  207. package/dist/esm/core/agent/buildDynamicAgentChart.d.ts +1 -1
  208. package/dist/esm/core/agent/buildDynamicAgentChart.js +9 -0
  209. package/dist/esm/core/agent/buildDynamicAgentChart.js.map +1 -1
  210. package/dist/esm/core/agent/coverage/answer.d.ts +20 -1
  211. package/dist/esm/core/agent/coverage/answer.js +23 -6
  212. package/dist/esm/core/agent/coverage/answer.js.map +1 -1
  213. package/dist/esm/core/agent/coverage/period.d.ts +49 -3
  214. package/dist/esm/core/agent/coverage/period.js +107 -68
  215. package/dist/esm/core/agent/coverage/period.js.map +1 -1
  216. package/dist/esm/core/agent/coverage/timeLimitFacts.d.ts +56 -0
  217. package/dist/esm/core/agent/coverage/timeLimitFacts.js +65 -0
  218. package/dist/esm/core/agent/coverage/timeLimitFacts.js.map +1 -0
  219. package/dist/esm/core/agent/coverage/timeLimits.d.ts +46 -0
  220. package/dist/esm/core/agent/coverage/timeLimits.js +67 -0
  221. package/dist/esm/core/agent/coverage/timeLimits.js.map +1 -0
  222. package/dist/esm/core/agent/evidence/evidenceIndex.d.ts +25 -2
  223. package/dist/esm/core/agent/evidence/evidenceIndex.js +47 -7
  224. package/dist/esm/core/agent/evidence/evidenceIndex.js.map +1 -1
  225. package/dist/esm/core/agent/evidence/gate.d.ts +7 -0
  226. package/dist/esm/core/agent/evidence/gate.js +9 -4
  227. package/dist/esm/core/agent/evidence/gate.js.map +1 -1
  228. package/dist/esm/core/agent/evidence/normalize.d.ts +0 -34
  229. package/dist/esm/core/agent/evidence/normalize.js +0 -103
  230. package/dist/esm/core/agent/evidence/normalize.js.map +1 -1
  231. package/dist/esm/core/agent/evidence/types.d.ts +12 -1
  232. package/dist/esm/core/agent/findings/ledger.js +14 -0
  233. package/dist/esm/core/agent/findings/ledger.js.map +1 -1
  234. package/dist/esm/core/agent/findings/types.d.ts +2 -1
  235. package/dist/esm/core/agent/findings/types.js.map +1 -1
  236. package/dist/esm/core/agent/honesty/mounts.d.ts +25 -0
  237. package/dist/esm/core/agent/honesty/mounts.js +104 -4
  238. package/dist/esm/core/agent/honesty/mounts.js.map +1 -1
  239. package/dist/esm/core/agent/results/subflow.d.ts +34 -2
  240. package/dist/esm/core/agent/results/subflow.js +43 -11
  241. package/dist/esm/core/agent/results/subflow.js.map +1 -1
  242. package/dist/esm/core/agent/stages/argumentAsk.d.ts +19 -0
  243. package/dist/esm/core/agent/stages/argumentAsk.js +85 -6
  244. package/dist/esm/core/agent/stages/argumentAsk.js.map +1 -1
  245. package/dist/esm/core/agent/stages/callLLM.d.ts +6 -0
  246. package/dist/esm/core/agent/stages/callLLM.js +16 -0
  247. package/dist/esm/core/agent/stages/callLLM.js.map +1 -1
  248. package/dist/esm/core/agent/stages/prepareFinal.d.ts +13 -1
  249. package/dist/esm/core/agent/stages/prepareFinal.js +59 -7
  250. package/dist/esm/core/agent/stages/prepareFinal.js.map +1 -1
  251. package/dist/esm/core/agent/stages/route.d.ts +29 -1
  252. package/dist/esm/core/agent/stages/route.js +64 -7
  253. package/dist/esm/core/agent/stages/route.js.map +1 -1
  254. package/dist/esm/core/agent/stages/seed.d.ts +23 -0
  255. package/dist/esm/core/agent/stages/seed.js +29 -6
  256. package/dist/esm/core/agent/stages/seed.js.map +1 -1
  257. package/dist/esm/core/agent/stages/timeLayer.d.ts +94 -0
  258. package/dist/esm/core/agent/stages/timeLayer.js +193 -0
  259. package/dist/esm/core/agent/stages/timeLayer.js.map +1 -0
  260. package/dist/esm/core/agent/stages/timeLineage.d.ts +31 -0
  261. package/dist/esm/core/agent/stages/timeLineage.js +57 -0
  262. package/dist/esm/core/agent/stages/timeLineage.js.map +1 -0
  263. package/dist/esm/core/agent/stages/toolCalls.d.ts +32 -0
  264. package/dist/esm/core/agent/stages/toolCalls.js +70 -0
  265. package/dist/esm/core/agent/stages/toolCalls.js.map +1 -1
  266. package/dist/esm/core/agent/types.d.ts +37 -0
  267. package/dist/esm/core/inputRequest.d.ts +50 -6
  268. package/dist/esm/core/inputRequest.js +132 -5
  269. package/dist/esm/core/inputRequest.js.map +1 -1
  270. package/dist/esm/core/messageFrom.d.ts +5 -2
  271. package/dist/esm/core/messageFrom.js +5 -2
  272. package/dist/esm/core/messageFrom.js.map +1 -1
  273. package/dist/esm/core/runCheckpoint.js +17 -2
  274. package/dist/esm/core/runCheckpoint.js.map +1 -1
  275. package/dist/esm/core/slots/buildToolsSlot.d.ts +29 -0
  276. package/dist/esm/core/slots/buildToolsSlot.js +30 -2
  277. package/dist/esm/core/slots/buildToolsSlot.js.map +1 -1
  278. package/dist/esm/core/time/ask.d.ts +126 -0
  279. package/dist/esm/core/time/ask.js +230 -0
  280. package/dist/esm/core/time/ask.js.map +1 -0
  281. package/dist/esm/core/time/axis.d.ts +224 -0
  282. package/dist/esm/core/time/axis.js +462 -0
  283. package/dist/esm/core/time/axis.js.map +1 -0
  284. package/dist/esm/core/time/bind.d.ts +143 -0
  285. package/dist/esm/core/time/bind.js +227 -0
  286. package/dist/esm/core/time/bind.js.map +1 -0
  287. package/dist/esm/core/time/check.d.ts +113 -0
  288. package/dist/esm/core/time/check.js +252 -0
  289. package/dist/esm/core/time/check.js.map +1 -0
  290. package/dist/esm/core/time/checkRecord.d.ts +74 -0
  291. package/dist/esm/core/time/checkRecord.js +90 -0
  292. package/dist/esm/core/time/checkRecord.js.map +1 -0
  293. package/dist/esm/core/time/clock.d.ts +183 -0
  294. package/dist/esm/core/time/clock.js +252 -0
  295. package/dist/esm/core/time/clock.js.map +1 -0
  296. package/dist/esm/core/time/convert.d.ts +178 -0
  297. package/dist/esm/core/time/convert.js +609 -0
  298. package/dist/esm/core/time/convert.js.map +1 -0
  299. package/dist/esm/core/time/drift.d.ts +85 -0
  300. package/dist/esm/core/time/drift.js +91 -0
  301. package/dist/esm/core/time/drift.js.map +1 -0
  302. package/dist/esm/core/time/duration.d.ts +71 -0
  303. package/dist/esm/core/time/duration.js +117 -0
  304. package/dist/esm/core/time/duration.js.map +1 -0
  305. package/dist/esm/core/time/forms.d.ts +84 -0
  306. package/dist/esm/core/time/forms.js +268 -0
  307. package/dist/esm/core/time/forms.js.map +1 -0
  308. package/dist/esm/core/time/instant.d.ts +75 -0
  309. package/dist/esm/core/time/instant.js +131 -0
  310. package/dist/esm/core/time/instant.js.map +1 -0
  311. package/dist/esm/core/time/periodForm.d.ts +184 -0
  312. package/dist/esm/core/time/periodForm.js +376 -0
  313. package/dist/esm/core/time/periodForm.js.map +1 -0
  314. package/dist/esm/core/time/present.d.ts +107 -0
  315. package/dist/esm/core/time/present.js +305 -0
  316. package/dist/esm/core/time/present.js.map +1 -0
  317. package/dist/esm/core/time/range.d.ts +127 -0
  318. package/dist/esm/core/time/range.js +249 -0
  319. package/dist/esm/core/time/range.js.map +1 -0
  320. package/dist/esm/core/time/reader.d.ts +162 -0
  321. package/dist/esm/core/time/reader.js +203 -0
  322. package/dist/esm/core/time/reader.js.map +1 -0
  323. package/dist/esm/core/time/readers/english.d.ts +99 -0
  324. package/dist/esm/core/time/readers/english.js +572 -0
  325. package/dist/esm/core/time/readers/english.js.map +1 -0
  326. package/dist/esm/core/time/readingAsk.d.ts +45 -0
  327. package/dist/esm/core/time/readingAsk.js +90 -0
  328. package/dist/esm/core/time/readingAsk.js.map +1 -0
  329. package/dist/esm/core/time/resolve.d.ts +103 -0
  330. package/dist/esm/core/time/resolve.js +684 -0
  331. package/dist/esm/core/time/resolve.js.map +1 -0
  332. package/dist/esm/core/time/resolveRecord.d.ts +160 -0
  333. package/dist/esm/core/time/resolveRecord.js +158 -0
  334. package/dist/esm/core/time/resolveRecord.js.map +1 -0
  335. package/dist/esm/core/time/rows.d.ts +297 -0
  336. package/dist/esm/core/time/rows.js +397 -0
  337. package/dist/esm/core/time/rows.js.map +1 -0
  338. package/dist/esm/core/time/rowsBuild.d.ts +82 -0
  339. package/dist/esm/core/time/rowsBuild.js +185 -0
  340. package/dist/esm/core/time/rowsBuild.js.map +1 -0
  341. package/dist/esm/core/time/textForms.d.ts +53 -0
  342. package/dist/esm/core/time/textForms.js +126 -0
  343. package/dist/esm/core/time/textForms.js.map +1 -0
  344. package/dist/esm/core/time/windows.d.ts +113 -0
  345. package/dist/esm/core/time/windows.js +166 -0
  346. package/dist/esm/core/time/windows.js.map +1 -0
  347. package/dist/esm/core/time/wire.d.ts +63 -0
  348. package/dist/esm/core/time/wire.js +81 -0
  349. package/dist/esm/core/time/wire.js.map +1 -0
  350. package/dist/esm/core/time/zone.d.ts +115 -0
  351. package/dist/esm/core/time/zone.js +242 -0
  352. package/dist/esm/core/time/zone.js.map +1 -0
  353. package/dist/esm/core/tools.d.ts +26 -4
  354. package/dist/esm/core/tools.js.map +1 -1
  355. package/dist/esm/events/payloads.d.ts +16 -2
  356. package/dist/esm/index.d.ts +13 -1
  357. package/dist/esm/index.js +6 -1
  358. package/dist/esm/index.js.map +1 -1
  359. package/dist/esm/lib/answer-account/facts/howSure.js +7 -0
  360. package/dist/esm/lib/answer-account/facts/howSure.js.map +1 -1
  361. package/dist/esm/lib/answer-account/templates.d.ts +3 -0
  362. package/dist/esm/lib/answer-account/templates.js +4 -0
  363. package/dist/esm/lib/answer-account/templates.js.map +1 -1
  364. package/dist/esm/lib/mcp/elicitation.d.ts +84 -0
  365. package/dist/esm/lib/mcp/elicitation.js +181 -0
  366. package/dist/esm/lib/mcp/elicitation.js.map +1 -0
  367. package/dist/esm/lib/mcp/mcpClient.js +9 -3
  368. package/dist/esm/lib/mcp/mcpClient.js.map +1 -1
  369. package/dist/esm/lib/mcp/mcpServe.js +6 -2
  370. package/dist/esm/lib/mcp/mcpServe.js.map +1 -1
  371. package/dist/esm/lib/mcp/mockMcpClient.d.ts +9 -1
  372. package/dist/esm/lib/mcp/mockMcpClient.js +5 -3
  373. package/dist/esm/lib/mcp/mockMcpClient.js.map +1 -1
  374. package/dist/esm/lib/mcp/toolExtras.d.ts +21 -2
  375. package/dist/esm/lib/mcp/toolExtras.js +22 -0
  376. package/dist/esm/lib/mcp/toolExtras.js.map +1 -1
  377. package/dist/esm/lib/mcp/types.d.ts +8 -0
  378. package/dist/esm/lib/time-travel/receipt.d.ts +1 -1
  379. package/dist/esm/lib/time-travel/servedView.d.ts +1 -1
  380. package/dist/esm/lib/time-travel/servedView.js +9 -0
  381. package/dist/esm/lib/time-travel/servedView.js.map +1 -1
  382. package/dist/esm/locales/index.d.ts +6 -0
  383. package/dist/esm/locales/index.js +6 -0
  384. package/dist/esm/locales/index.js.map +1 -1
  385. package/dist/esm/locales/timeAsk.d.ts +29 -0
  386. package/dist/esm/locales/timeAsk.js +44 -0
  387. package/dist/esm/locales/timeAsk.js.map +1 -0
  388. package/dist/esm/recorders/core/resilienceHooks.js +1 -0
  389. package/dist/esm/recorders/core/resilienceHooks.js.map +1 -1
  390. package/dist/esm/resilience/statedWait.d.ts +22 -0
  391. package/dist/esm/resilience/statedWait.js +35 -0
  392. package/dist/esm/resilience/statedWait.js.map +1 -0
  393. package/dist/esm/resilience/withRetry.d.ts +13 -2
  394. package/dist/esm/resilience/withRetry.js +16 -1
  395. package/dist/esm/resilience/withRetry.js.map +1 -1
  396. package/dist/index.js +11 -1
  397. package/dist/index.js.map +1 -1
  398. package/dist/lib/answer-account/facts/howSure.js +7 -0
  399. package/dist/lib/answer-account/facts/howSure.js.map +1 -1
  400. package/dist/lib/answer-account/templates.js +4 -0
  401. package/dist/lib/answer-account/templates.js.map +1 -1
  402. package/dist/lib/mcp/elicitation.js +186 -0
  403. package/dist/lib/mcp/elicitation.js.map +1 -0
  404. package/dist/lib/mcp/mcpClient.js +8 -2
  405. package/dist/lib/mcp/mcpClient.js.map +1 -1
  406. package/dist/lib/mcp/mcpServe.js +5 -1
  407. package/dist/lib/mcp/mcpServe.js.map +1 -1
  408. package/dist/lib/mcp/mockMcpClient.js +4 -2
  409. package/dist/lib/mcp/mockMcpClient.js.map +1 -1
  410. package/dist/lib/mcp/toolExtras.js +25 -1
  411. package/dist/lib/mcp/toolExtras.js.map +1 -1
  412. package/dist/lib/time-travel/servedView.js +9 -0
  413. package/dist/lib/time-travel/servedView.js.map +1 -1
  414. package/dist/locales/index.js +8 -1
  415. package/dist/locales/index.js.map +1 -1
  416. package/dist/locales/timeAsk.js +47 -0
  417. package/dist/locales/timeAsk.js.map +1 -0
  418. package/dist/recorders/core/resilienceHooks.js +1 -0
  419. package/dist/recorders/core/resilienceHooks.js.map +1 -1
  420. package/dist/resilience/statedWait.js +39 -0
  421. package/dist/resilience/statedWait.js.map +1 -0
  422. package/dist/resilience/withRetry.js +16 -1
  423. package/dist/resilience/withRetry.js.map +1 -1
  424. package/dist/types/adapters/llm/AnthropicProvider.d.ts.map +1 -1
  425. package/dist/types/adapters/llm/BedrockProvider.d.ts.map +1 -1
  426. package/dist/types/adapters/llm/InvokeModelGatewayProvider.d.ts +38 -4
  427. package/dist/types/adapters/llm/InvokeModelGatewayProvider.d.ts.map +1 -1
  428. package/dist/types/adapters/llm/OpenAIProvider.d.ts.map +1 -1
  429. package/dist/types/adapters/llm/anthropicMessagesWire.d.ts +6 -1
  430. package/dist/types/adapters/llm/anthropicMessagesWire.d.ts.map +1 -1
  431. package/dist/types/adapters/llm/retryAfter.d.ts +28 -0
  432. package/dist/types/adapters/llm/retryAfter.d.ts.map +1 -0
  433. package/dist/types/adapters/types.d.ts +9 -0
  434. package/dist/types/adapters/types.d.ts.map +1 -1
  435. package/dist/types/artifacts/index.d.ts +1 -1
  436. package/dist/types/artifacts/index.d.ts.map +1 -1
  437. package/dist/types/artifacts/types.d.ts +2 -2
  438. package/dist/types/artifacts/types.d.ts.map +1 -1
  439. package/dist/types/core/Agent.d.ts +64 -0
  440. package/dist/types/core/Agent.d.ts.map +1 -1
  441. package/dist/types/core/agent/AgentBuilder.d.ts +60 -0
  442. package/dist/types/core/agent/AgentBuilder.d.ts.map +1 -1
  443. package/dist/types/core/agent/arguments/ask.d.ts +88 -5
  444. package/dist/types/core/agent/arguments/ask.d.ts.map +1 -1
  445. package/dist/types/core/agent/arguments/checks.d.ts +1 -1
  446. package/dist/types/core/agent/arguments/checks.d.ts.map +1 -1
  447. package/dist/types/core/agent/arguments/declare.d.ts +76 -15
  448. package/dist/types/core/agent/arguments/declare.d.ts.map +1 -1
  449. package/dist/types/core/agent/arguments/dispatch.d.ts.map +1 -1
  450. package/dist/types/core/agent/arguments/resolve.d.ts +77 -7
  451. package/dist/types/core/agent/arguments/resolve.d.ts.map +1 -1
  452. package/dist/types/core/agent/arguments/rows.d.ts +31 -2
  453. package/dist/types/core/agent/arguments/rows.d.ts.map +1 -1
  454. package/dist/types/core/agent/arguments/serve.d.ts +133 -4
  455. package/dist/types/core/agent/arguments/serve.d.ts.map +1 -1
  456. package/dist/types/core/agent/arguments/subflow.d.ts +28 -0
  457. package/dist/types/core/agent/arguments/subflow.d.ts.map +1 -1
  458. package/dist/types/core/agent/assessment/assess.d.ts.map +1 -1
  459. package/dist/types/core/agent/assessment/compose.d.ts.map +1 -1
  460. package/dist/types/core/agent/assessment/reasons.d.ts.map +1 -1
  461. package/dist/types/core/agent/assessment/types.d.ts +15 -1
  462. package/dist/types/core/agent/assessment/types.d.ts.map +1 -1
  463. package/dist/types/core/agent/buildAgentChart.d.ts +41 -0
  464. package/dist/types/core/agent/buildAgentChart.d.ts.map +1 -1
  465. package/dist/types/core/agent/buildDynamicAgentChart.d.ts +1 -1
  466. package/dist/types/core/agent/buildDynamicAgentChart.d.ts.map +1 -1
  467. package/dist/types/core/agent/coverage/answer.d.ts +20 -1
  468. package/dist/types/core/agent/coverage/answer.d.ts.map +1 -1
  469. package/dist/types/core/agent/coverage/period.d.ts +49 -3
  470. package/dist/types/core/agent/coverage/period.d.ts.map +1 -1
  471. package/dist/types/core/agent/coverage/timeLimitFacts.d.ts +57 -0
  472. package/dist/types/core/agent/coverage/timeLimitFacts.d.ts.map +1 -0
  473. package/dist/types/core/agent/coverage/timeLimits.d.ts +47 -0
  474. package/dist/types/core/agent/coverage/timeLimits.d.ts.map +1 -0
  475. package/dist/types/core/agent/evidence/evidenceIndex.d.ts +25 -2
  476. package/dist/types/core/agent/evidence/evidenceIndex.d.ts.map +1 -1
  477. package/dist/types/core/agent/evidence/gate.d.ts +7 -0
  478. package/dist/types/core/agent/evidence/gate.d.ts.map +1 -1
  479. package/dist/types/core/agent/evidence/normalize.d.ts +0 -34
  480. package/dist/types/core/agent/evidence/normalize.d.ts.map +1 -1
  481. package/dist/types/core/agent/evidence/types.d.ts +12 -1
  482. package/dist/types/core/agent/evidence/types.d.ts.map +1 -1
  483. package/dist/types/core/agent/findings/ledger.d.ts.map +1 -1
  484. package/dist/types/core/agent/findings/types.d.ts +2 -1
  485. package/dist/types/core/agent/findings/types.d.ts.map +1 -1
  486. package/dist/types/core/agent/honesty/mounts.d.ts +25 -0
  487. package/dist/types/core/agent/honesty/mounts.d.ts.map +1 -1
  488. package/dist/types/core/agent/results/subflow.d.ts +34 -2
  489. package/dist/types/core/agent/results/subflow.d.ts.map +1 -1
  490. package/dist/types/core/agent/stages/argumentAsk.d.ts +19 -0
  491. package/dist/types/core/agent/stages/argumentAsk.d.ts.map +1 -1
  492. package/dist/types/core/agent/stages/callLLM.d.ts +6 -0
  493. package/dist/types/core/agent/stages/callLLM.d.ts.map +1 -1
  494. package/dist/types/core/agent/stages/prepareFinal.d.ts +13 -1
  495. package/dist/types/core/agent/stages/prepareFinal.d.ts.map +1 -1
  496. package/dist/types/core/agent/stages/route.d.ts +29 -1
  497. package/dist/types/core/agent/stages/route.d.ts.map +1 -1
  498. package/dist/types/core/agent/stages/seed.d.ts +23 -0
  499. package/dist/types/core/agent/stages/seed.d.ts.map +1 -1
  500. package/dist/types/core/agent/stages/timeLayer.d.ts +95 -0
  501. package/dist/types/core/agent/stages/timeLayer.d.ts.map +1 -0
  502. package/dist/types/core/agent/stages/timeLineage.d.ts +32 -0
  503. package/dist/types/core/agent/stages/timeLineage.d.ts.map +1 -0
  504. package/dist/types/core/agent/stages/toolCalls.d.ts +32 -0
  505. package/dist/types/core/agent/stages/toolCalls.d.ts.map +1 -1
  506. package/dist/types/core/agent/types.d.ts +37 -0
  507. package/dist/types/core/agent/types.d.ts.map +1 -1
  508. package/dist/types/core/inputRequest.d.ts +50 -6
  509. package/dist/types/core/inputRequest.d.ts.map +1 -1
  510. package/dist/types/core/messageFrom.d.ts +5 -2
  511. package/dist/types/core/messageFrom.d.ts.map +1 -1
  512. package/dist/types/core/runCheckpoint.d.ts.map +1 -1
  513. package/dist/types/core/slots/buildToolsSlot.d.ts +29 -0
  514. package/dist/types/core/slots/buildToolsSlot.d.ts.map +1 -1
  515. package/dist/types/core/time/ask.d.ts +127 -0
  516. package/dist/types/core/time/ask.d.ts.map +1 -0
  517. package/dist/types/core/time/axis.d.ts +225 -0
  518. package/dist/types/core/time/axis.d.ts.map +1 -0
  519. package/dist/types/core/time/bind.d.ts +144 -0
  520. package/dist/types/core/time/bind.d.ts.map +1 -0
  521. package/dist/types/core/time/check.d.ts +114 -0
  522. package/dist/types/core/time/check.d.ts.map +1 -0
  523. package/dist/types/core/time/checkRecord.d.ts +75 -0
  524. package/dist/types/core/time/checkRecord.d.ts.map +1 -0
  525. package/dist/types/core/time/clock.d.ts +184 -0
  526. package/dist/types/core/time/clock.d.ts.map +1 -0
  527. package/dist/types/core/time/convert.d.ts +179 -0
  528. package/dist/types/core/time/convert.d.ts.map +1 -0
  529. package/dist/types/core/time/drift.d.ts +86 -0
  530. package/dist/types/core/time/drift.d.ts.map +1 -0
  531. package/dist/types/core/time/duration.d.ts +72 -0
  532. package/dist/types/core/time/duration.d.ts.map +1 -0
  533. package/dist/types/core/time/forms.d.ts +85 -0
  534. package/dist/types/core/time/forms.d.ts.map +1 -0
  535. package/dist/types/core/time/instant.d.ts +76 -0
  536. package/dist/types/core/time/instant.d.ts.map +1 -0
  537. package/dist/types/core/time/periodForm.d.ts +185 -0
  538. package/dist/types/core/time/periodForm.d.ts.map +1 -0
  539. package/dist/types/core/time/present.d.ts +108 -0
  540. package/dist/types/core/time/present.d.ts.map +1 -0
  541. package/dist/types/core/time/range.d.ts +128 -0
  542. package/dist/types/core/time/range.d.ts.map +1 -0
  543. package/dist/types/core/time/reader.d.ts +163 -0
  544. package/dist/types/core/time/reader.d.ts.map +1 -0
  545. package/dist/types/core/time/readers/english.d.ts +100 -0
  546. package/dist/types/core/time/readers/english.d.ts.map +1 -0
  547. package/dist/types/core/time/readingAsk.d.ts +46 -0
  548. package/dist/types/core/time/readingAsk.d.ts.map +1 -0
  549. package/dist/types/core/time/resolve.d.ts +104 -0
  550. package/dist/types/core/time/resolve.d.ts.map +1 -0
  551. package/dist/types/core/time/resolveRecord.d.ts +161 -0
  552. package/dist/types/core/time/resolveRecord.d.ts.map +1 -0
  553. package/dist/types/core/time/rows.d.ts +298 -0
  554. package/dist/types/core/time/rows.d.ts.map +1 -0
  555. package/dist/types/core/time/rowsBuild.d.ts +83 -0
  556. package/dist/types/core/time/rowsBuild.d.ts.map +1 -0
  557. package/dist/types/core/time/textForms.d.ts +54 -0
  558. package/dist/types/core/time/textForms.d.ts.map +1 -0
  559. package/dist/types/core/time/windows.d.ts +114 -0
  560. package/dist/types/core/time/windows.d.ts.map +1 -0
  561. package/dist/types/core/time/wire.d.ts +64 -0
  562. package/dist/types/core/time/wire.d.ts.map +1 -0
  563. package/dist/types/core/time/zone.d.ts +116 -0
  564. package/dist/types/core/time/zone.d.ts.map +1 -0
  565. package/dist/types/core/tools.d.ts +26 -4
  566. package/dist/types/core/tools.d.ts.map +1 -1
  567. package/dist/types/events/payloads.d.ts +16 -2
  568. package/dist/types/events/payloads.d.ts.map +1 -1
  569. package/dist/types/index.d.ts +13 -1
  570. package/dist/types/index.d.ts.map +1 -1
  571. package/dist/types/lib/answer-account/facts/howSure.d.ts.map +1 -1
  572. package/dist/types/lib/answer-account/templates.d.ts +3 -0
  573. package/dist/types/lib/answer-account/templates.d.ts.map +1 -1
  574. package/dist/types/lib/mcp/elicitation.d.ts +85 -0
  575. package/dist/types/lib/mcp/elicitation.d.ts.map +1 -0
  576. package/dist/types/lib/mcp/mcpServe.d.ts.map +1 -1
  577. package/dist/types/lib/mcp/mockMcpClient.d.ts +9 -1
  578. package/dist/types/lib/mcp/mockMcpClient.d.ts.map +1 -1
  579. package/dist/types/lib/mcp/toolExtras.d.ts +21 -2
  580. package/dist/types/lib/mcp/toolExtras.d.ts.map +1 -1
  581. package/dist/types/lib/mcp/types.d.ts +8 -0
  582. package/dist/types/lib/mcp/types.d.ts.map +1 -1
  583. package/dist/types/lib/time-travel/receipt.d.ts +1 -1
  584. package/dist/types/lib/time-travel/receipt.d.ts.map +1 -1
  585. package/dist/types/lib/time-travel/servedView.d.ts +1 -1
  586. package/dist/types/lib/time-travel/servedView.d.ts.map +1 -1
  587. package/dist/types/locales/index.d.ts +6 -0
  588. package/dist/types/locales/index.d.ts.map +1 -1
  589. package/dist/types/locales/timeAsk.d.ts +30 -0
  590. package/dist/types/locales/timeAsk.d.ts.map +1 -0
  591. package/dist/types/recorders/core/resilienceHooks.d.ts.map +1 -1
  592. package/dist/types/resilience/statedWait.d.ts +23 -0
  593. package/dist/types/resilience/statedWait.d.ts.map +1 -0
  594. package/dist/types/resilience/withRetry.d.ts +13 -2
  595. package/dist/types/resilience/withRetry.d.ts.map +1 -1
  596. package/package.json +1 -1
  597. package/dist/artifacts/timeAxis.js +0 -218
  598. package/dist/artifacts/timeAxis.js.map +0 -1
  599. package/dist/esm/artifacts/timeAxis.d.ts +0 -114
  600. package/dist/esm/artifacts/timeAxis.js +0 -212
  601. package/dist/esm/artifacts/timeAxis.js.map +0 -1
  602. package/dist/types/artifacts/timeAxis.d.ts +0 -115
  603. package/dist/types/artifacts/timeAxis.d.ts.map +0 -1
@@ -0,0 +1,694 @@
1
+ "use strict";
2
+ /**
3
+ * core/time/resolve — parts + clock + policy → every candidate window, and
4
+ * the one rule for which candidate a reading settles on.
5
+ *
6
+ * Pattern: the hard, universal half of reading time, written once (time
7
+ * design § 5.1): a strategy tokenizes (`reader.ts`); this module
8
+ * resolves, the same way for every strategy. It is the one place
9
+ * zone arithmetic meets the person's words.
10
+ * Role: core/ leaf (the time layer). Imports `instant.ts`, `zone.ts`,
11
+ * `range.ts`, `present.ts` (the `Grain` word), `reader.ts` (the
12
+ * parts) and `resolveRecord.ts` (the shapes, the policy and the
13
+ * record's checks — split out for the synchronous doors, and
14
+ * re-exported here). `rowsBuild.ts` · `timeReadingRows` calls it at the
15
+ * seed, which loads it only under `.time()`.
16
+ * Emits: N/A.
17
+ *
18
+ * ## Every candidate, then the policy (§ 5.1, § 11)
19
+ *
20
+ * {@link resolveMention} writes EVERY reading of the parts, each tagged with
21
+ * how it read them ({@link ReadingTags}):
22
+ *
23
+ * | Parts | Candidates |
24
+ * |-------|------------|
25
+ * | a numeric date `10/09/26` | up to three: `MDY`, `DMY`, `YMD` — each checked as a calendar day |
26
+ * | a numeric date of two fields `10/09` | `MDY` and `DMY`, each for the clock's year and the one before |
27
+ * | a date with no year | the clock's year (`current`) and the one before (`previous`) |
28
+ * | a two-digit year `26` | the clock's century, noted `century-implied` |
29
+ * | a clock time with no meridiem, hour 1–12 (`8:40`) | am and pm |
30
+ * | a wall time the clocks go back through (`01:30`) | both instants, each noted `dst-overlap` |
31
+ * | a wall time the clocks skip (`02:30`) | both readings Temporal names, each noted `dst-gap` |
32
+ * | a day word (`{ day, offset: -1 }`) | the calendar day in the zone, anchored on the clock |
33
+ * | a span (`{ minute, count: 40 }`) | a look-back until the clock's `now` |
34
+ * | a range | one per combination of its sides that agree on date order and year, `from` before `to` |
35
+ *
36
+ * The fixed laws: a time is read to the END OF ITS GRAIN ("to 8:40" is
37
+ * `[08:00, 08:41)`, noted `end-of-grain`); a day starts at its first instant
38
+ * (Temporal's `startOfDay`: a midnight the clocks skip starts the day at the
39
+ * first wall time that exists); a zone the person did not say is the clock's;
40
+ * a zone they said is an IANA name or a numeric offset — any other token (an
41
+ * abbreviation such as `PST`) resolves nothing and is ASKED (no map ships in
42
+ * v1). Parts v1 does not resolve — a part of the day, a calendar span other
43
+ * than a day, a window anchored on the previous one — are named
44
+ * `unsupported`, never guessed.
45
+ *
46
+ * {@link chooseReading} then applies the app's policy (`dateOrder`, `year`)
47
+ * and names what is left: one window (`only`, or `policy` when the policy
48
+ * removed a reading — a choice nobody said, recorded), several (`open`, with
49
+ * the questions an ask must settle), or none. A `kind: 'model'` reader's
50
+ * window is never settled by the library: it stays `open` until the person
51
+ * confirms it (§ 5.5), and its candidates carry `said: []`. Since the
52
+ * owner's decision "Always confirm" (time design TQ29) neither is ANY
53
+ * reading the record files: `rowsBuild.ts` · `timeReadingRows` passes
54
+ * `confirm: true` for every reader's reading, so only the person's answer
55
+ * in the time ask settles a window. The `confirm` parameter's default
56
+ * (`kind === 'model'`) is the unit's, for a caller that resolves parts
57
+ * outside the record.
58
+ *
59
+ * @example
60
+ * ```ts
61
+ * const clock = { now: '2026-10-09T15:40:00Z', zone: 'America/Los_Angeles' };
62
+ * const rule = { id: 'fixture', kind: 'rule' as const };
63
+ * const res = resolveMention([{ date: { kind: 'numeric', fields: [10, 9, 26] } }], clock, rule);
64
+ * res.candidates.map((c) => c.reading.dateOrder); // ['MDY', 'DMY', 'YMD']
65
+ * chooseReading(res, DEFAULT_TIME_POLICY, 'rule');
66
+ * // { by: 'open', remaining: [0, 1, 2], open: ['date-order'] }
67
+ * chooseReading(res, { dateOrder: 'DMY', year: 'ask' }, 'rule');
68
+ * // { by: 'policy', candidate: 1, policy: { dateOrder: 'DMY' } }
69
+ * ```
70
+ */
71
+ Object.defineProperty(exports, "__esModule", { value: true });
72
+ exports.chooseReading = exports.resolveMention = exports.withZoneAnswered = exports.readPolicy = exports.DEFAULT_TIME_POLICY = exports.choiceIsWellFormed = exports.candidateIsWellFormed = void 0;
73
+ const instant_js_1 = require("./instant.js");
74
+ const range_js_1 = require("./range.js");
75
+ const zone_js_1 = require("./zone.js");
76
+ const resolveRecord_js_1 = require("./resolveRecord.js");
77
+ var resolveRecord_js_2 = require("./resolveRecord.js");
78
+ Object.defineProperty(exports, "candidateIsWellFormed", { enumerable: true, get: function () { return resolveRecord_js_2.candidateIsWellFormed; } });
79
+ Object.defineProperty(exports, "choiceIsWellFormed", { enumerable: true, get: function () { return resolveRecord_js_2.choiceIsWellFormed; } });
80
+ Object.defineProperty(exports, "DEFAULT_TIME_POLICY", { enumerable: true, get: function () { return resolveRecord_js_2.DEFAULT_TIME_POLICY; } });
81
+ Object.defineProperty(exports, "readPolicy", { enumerable: true, get: function () { return resolveRecord_js_2.readPolicy; } });
82
+ /** `±HH`, `±HHMM`, `±HH:MM` — a colon only between hours and minutes, never trailing. */
83
+ const OFFSET_TOKEN = /^([+-])(\d{2})(?::?(\d{2}))?$/;
84
+ function zoneOf(token, clockZone) {
85
+ if (token === undefined)
86
+ return { kind: 'iana', zone: clockZone, said: false };
87
+ if ((0, zone_js_1.isZoneName)(token))
88
+ return { kind: 'iana', zone: token, said: true };
89
+ if (token === 'Z')
90
+ return { kind: 'offset', minutes: 0, spelled: 'Z' };
91
+ const m = OFFSET_TOKEN.exec(token);
92
+ if (m !== null) {
93
+ const hours = Number(m[2]);
94
+ const minutes = m[3] === undefined ? 0 : Number(m[3]);
95
+ if (hours <= 23 && minutes <= 59) {
96
+ const total = (m[1] === '-' ? -1 : 1) * (hours * 60 + minutes);
97
+ const spelled = `${m[1]}${m[2]}:${m[3] ?? '00'}`;
98
+ return { kind: 'offset', minutes: total === 0 ? 0 : total, spelled };
99
+ }
100
+ }
101
+ return { kind: 'unknown' };
102
+ }
103
+ /**
104
+ * The parts with every zone token this layer cannot read (an abbreviation such
105
+ * as `PST`) replaced by the zone the PERSON named when asked (§ 6.3) — the
106
+ * whole mention's and each range side's. A token it can read is kept.
107
+ *
108
+ * @example
109
+ * ```ts
110
+ * withZoneAnswered([{ wall: { h: 8, meridiem: 'am' }, zoneToken: 'PST' }], 'America/Los_Angeles');
111
+ * // [{ wall: { h: 8, meridiem: 'am' }, zoneToken: 'America/Los_Angeles' }]
112
+ * ```
113
+ */
114
+ function withZoneAnswered(parses, zone) {
115
+ const fix = (parts) => parts.zoneToken !== undefined && zoneOf(parts.zoneToken, zone).kind === 'unknown'
116
+ ? { ...parts, zoneToken: zone }
117
+ : parts;
118
+ return parses.map((parts) => {
119
+ const outer = fix(parts);
120
+ return outer.rangeOf === undefined
121
+ ? outer
122
+ : { ...outer, rangeOf: [fix(outer.rangeOf[0]), fix(outer.rangeOf[1])] };
123
+ });
124
+ }
125
+ exports.withZoneAnswered = withZoneAnswered;
126
+ /** The wall time an instant shows under a zone read. */
127
+ function wallIn(zone, ms) {
128
+ if (zone.kind === 'iana')
129
+ return (0, zone_js_1.wallAt)(zone.zone, ms);
130
+ const d = new Date(ms + (zone.kind === 'offset' ? zone.minutes : 0) * 60_000);
131
+ return {
132
+ year: d.getUTCFullYear(),
133
+ month: d.getUTCMonth() + 1,
134
+ day: d.getUTCDate(),
135
+ hour: d.getUTCHours(),
136
+ minute: d.getUTCMinutes(),
137
+ };
138
+ }
139
+ /** The offset to spell an instant in, minutes east of UTC. */
140
+ function offsetFor(zone, ms) {
141
+ return zone.kind === 'offset' ? zone.minutes : (0, zone_js_1.offsetAt)(zone.zone, ms);
142
+ }
143
+ /** Every instant a wall time names under a zone read (two in a DST overlap or gap). */
144
+ function instantsOf(wall, zone) {
145
+ if (!(0, zone_js_1.isWallTime)(wall))
146
+ return [];
147
+ const utc = (0, instant_js_1.utcWallMs)(wall.year, wall.month, wall.day, wall.hour, wall.minute, wall.second ?? 0);
148
+ if (zone.kind === 'offset')
149
+ return [{ ms: utc - zone.minutes * 60_000 }];
150
+ if (zone.kind !== 'iana')
151
+ return [];
152
+ const reading = (0, zone_js_1.readWall)(wall, zone.zone);
153
+ if (reading.kind === 'unique')
154
+ return [{ ms: reading.ms }];
155
+ const kind = reading.kind === 'overlap' ? 'dst-overlap' : 'dst-gap';
156
+ return [
157
+ { ms: reading.earlier, dst: { kind, which: 'earlier' } },
158
+ { ms: reading.later, dst: { kind, which: 'later' } },
159
+ ];
160
+ }
161
+ /** The first instant of a calendar day in a zone (Temporal's `startOfDay`). */
162
+ function dayStart(y, m, d, zone) {
163
+ const wall = { year: y, month: m, day: d, hour: 0, minute: 0 };
164
+ if (!(0, zone_js_1.isWallTime)(wall))
165
+ return undefined;
166
+ if (zone.kind === 'offset')
167
+ return (0, instant_js_1.utcWallMs)(y, m, d, 0, 0, 0) - zone.minutes * 60_000;
168
+ if (zone.kind !== 'iana')
169
+ return undefined;
170
+ return (0, zone_js_1.wallToInstant)(wall, zone.zone, 'compatible');
171
+ }
172
+ /** The calendar day `days` after `y-m-d`. */
173
+ function addDays(y, m, d, days) {
174
+ const date = new Date((0, instant_js_1.utcWallMs)(y, m, d + days, 0, 0, 0));
175
+ return [date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate()];
176
+ }
177
+ const isDay = (y, m, d) => Number.isInteger(y) &&
178
+ y >= 0 &&
179
+ y <= 9999 &&
180
+ m >= 1 &&
181
+ m <= 12 &&
182
+ d >= 1 &&
183
+ d <= (0, instant_js_1.daysInMonth)(y, m);
184
+ /** A said year value → a full year, or `undefined`; `century` set when the clock's century was used. */
185
+ function fullYear(value, digits, clockYear) {
186
+ const century = Math.floor(clockYear / 100) * 100;
187
+ if (digits === 2)
188
+ return value <= 99 ? { year: century + value, century } : undefined;
189
+ if (digits === 4)
190
+ return value >= 1000 ? { year: value } : undefined;
191
+ return value >= 100 ? { year: value } : { year: century + value, century };
192
+ }
193
+ /** The readings of a date said without a year: the clock's year, and the one before. */
194
+ function yearless(m, d, clockYear, tags) {
195
+ const out = [];
196
+ for (const [year, which] of [
197
+ [clockYear, 'current'],
198
+ [clockYear - 1, 'previous'],
199
+ ]) {
200
+ if (!isDay(year, m, d))
201
+ continue;
202
+ out.push({
203
+ y: year,
204
+ m,
205
+ d,
206
+ tags: { ...tags, year: which },
207
+ said: ['month', 'day'],
208
+ implied: ['year'],
209
+ notes: [],
210
+ anchor: 'none',
211
+ });
212
+ }
213
+ return out;
214
+ }
215
+ const ORDERS3 = [
216
+ // [tag, index of month, index of day, index of year]
217
+ ['MDY', 0, 1, 2],
218
+ ['DMY', 1, 0, 2],
219
+ ['YMD', 1, 2, 0],
220
+ ];
221
+ function numericDates(fields, digits, clockYear) {
222
+ const out = [];
223
+ if (fields.length === 2) {
224
+ const [a, b] = fields;
225
+ out.push(...yearless(a, b, clockYear, { dateOrder: 'MDY' }));
226
+ out.push(...yearless(b, a, clockYear, { dateOrder: 'DMY' }));
227
+ return out;
228
+ }
229
+ for (const [tag, mi, di, yi] of ORDERS3) {
230
+ const full = fullYear(fields[yi], digits, clockYear);
231
+ if (full === undefined)
232
+ continue;
233
+ const m = fields[mi];
234
+ const d = fields[di];
235
+ if (!isDay(full.year, m, d))
236
+ continue;
237
+ out.push({
238
+ y: full.year,
239
+ m,
240
+ d,
241
+ tags: { dateOrder: tag, year: 'said' },
242
+ said: ['year', 'month', 'day'],
243
+ implied: [],
244
+ notes: full.century !== undefined ? [{ kind: 'century-implied', century: full.century }] : [],
245
+ anchor: 'none',
246
+ });
247
+ }
248
+ return out;
249
+ }
250
+ /** Every date reading of the parts, or a part v1 does not resolve. */
251
+ function datesOf(parts, today) {
252
+ const rel = parts.relative;
253
+ if (rel !== undefined) {
254
+ if (parts.date !== undefined)
255
+ return { unsupported: 'a date and a relative day together' };
256
+ if (!('offset' in rel) || rel.unit !== 'day') {
257
+ return { unsupported: `relative ${rel.unit}` };
258
+ }
259
+ const [y, m, d] = addDays(today.year, today.month, today.day, rel.offset);
260
+ return [
261
+ {
262
+ y,
263
+ m,
264
+ d,
265
+ tags: {},
266
+ said: ['day'],
267
+ implied: ['year', 'month'],
268
+ notes: [],
269
+ anchor: 'message',
270
+ },
271
+ ];
272
+ }
273
+ const date = parts.date;
274
+ if (date === undefined) {
275
+ if (parts.wall === undefined)
276
+ return { unsupported: 'no date or time' };
277
+ // A clock time alone is on the clock's day.
278
+ return [
279
+ {
280
+ y: today.year,
281
+ m: today.month,
282
+ d: today.day,
283
+ tags: {},
284
+ said: [],
285
+ implied: ['year', 'month', 'day'],
286
+ notes: [],
287
+ anchor: 'message',
288
+ },
289
+ ];
290
+ }
291
+ if (date.kind === 'numeric')
292
+ return numericDates(date.fields, date.yearDigits, today.year);
293
+ if (date.year === undefined)
294
+ return yearless(date.month, date.day, today.year, {});
295
+ if (!isDay(date.year, date.month, date.day))
296
+ return [];
297
+ return [
298
+ {
299
+ y: date.year,
300
+ m: date.month,
301
+ d: date.day,
302
+ tags: { year: 'said' },
303
+ said: ['year', 'month', 'day'],
304
+ implied: [],
305
+ notes: [],
306
+ anchor: 'none',
307
+ },
308
+ ];
309
+ }
310
+ // ─── Clock times ─────────────────────────────────────────────────────────
311
+ /** The 24-hour readings of a clock time: one, or am and pm when no meridiem settles an hour 1–12. */
312
+ function hoursOf(wall) {
313
+ if (wall.meridiem !== undefined) {
314
+ if (wall.h < 1 || wall.h > 12)
315
+ return [];
316
+ return [{ h: (wall.h % 12) + (wall.meridiem === 'pm' ? 12 : 0) }];
317
+ }
318
+ if (wall.h >= 1 && wall.h <= 12) {
319
+ return [
320
+ { h: wall.h % 12, meridiem: 'am' },
321
+ { h: (wall.h % 12) + 12, meridiem: 'pm' },
322
+ ];
323
+ }
324
+ return [{ h: wall.h }];
325
+ }
326
+ const GRAIN_MS = {
327
+ hour: 3_600_000,
328
+ minute: 60_000,
329
+ second: 1_000,
330
+ };
331
+ function pointsOf(parts, clock, nowMs) {
332
+ if (parts.partOfDay !== undefined)
333
+ return { unsupported: 'a part of the day' };
334
+ if (parts.anchor !== undefined)
335
+ return { unsupported: 'a window anchored on the previous one' };
336
+ const zone = zoneOf(parts.zoneToken, clock.zone);
337
+ if (zone.kind === 'unknown')
338
+ return { needsZone: true };
339
+ const dates = datesOf(parts, wallIn(zone, nowMs));
340
+ if (!Array.isArray(dates))
341
+ return dates;
342
+ const zoneSaid = parts.zoneToken !== undefined ? ['zone'] : [];
343
+ const zoneImplied = parts.zoneToken !== undefined ? [] : ['zone'];
344
+ const offsetNote = zone.kind === 'offset' ? [{ kind: 'offset-said', offset: zone.spelled }] : [];
345
+ const out = [];
346
+ for (const date of dates) {
347
+ const base = {
348
+ zone,
349
+ said: [...date.said, ...zoneSaid],
350
+ implied: [...date.implied, ...zoneImplied],
351
+ anchor: date.anchor,
352
+ };
353
+ const wall = parts.wall;
354
+ if (wall === undefined) {
355
+ const from = dayStart(date.y, date.m, date.d, zone);
356
+ const [ny, nm, nd] = addDays(date.y, date.m, date.d, 1);
357
+ const to = dayStart(ny, nm, nd, zone);
358
+ if (from === undefined || to === undefined)
359
+ continue;
360
+ out.push({
361
+ ...base,
362
+ fromMs: from,
363
+ toMs: to,
364
+ grain: 'day',
365
+ tags: date.tags,
366
+ notes: [...date.notes, ...offsetNote],
367
+ });
368
+ continue;
369
+ }
370
+ const grain = wall.s !== undefined ? 'second' : wall.m !== undefined ? 'minute' : 'hour';
371
+ const wallSaid = [
372
+ 'hour',
373
+ ...(wall.m !== undefined ? ['minute'] : []),
374
+ ...(wall.s !== undefined ? ['second'] : []),
375
+ ...(wall.meridiem !== undefined ? ['meridiem'] : []),
376
+ ];
377
+ for (const hour of hoursOf(wall)) {
378
+ const at = {
379
+ year: date.y,
380
+ month: date.m,
381
+ day: date.d,
382
+ hour: hour.h,
383
+ minute: wall.m ?? 0,
384
+ second: wall.s ?? 0,
385
+ };
386
+ for (const instant of instantsOf(at, zone)) {
387
+ out.push({
388
+ ...base,
389
+ said: [...base.said, ...wallSaid],
390
+ fromMs: instant.ms,
391
+ toMs: instant.ms + GRAIN_MS[grain],
392
+ grain,
393
+ tags: { ...date.tags, ...(hour.meridiem !== undefined && { meridiem: hour.meridiem }) },
394
+ notes: [...date.notes, ...offsetNote],
395
+ ...(instant.dst !== undefined && { dst: instant.dst }),
396
+ });
397
+ }
398
+ }
399
+ }
400
+ return out;
401
+ }
402
+ // ─── Candidates ──────────────────────────────────────────────────────────
403
+ const GRAIN_ORDER = ['year', 'month', 'week', 'day', 'hour', 'minute', 'second'];
404
+ const finer = (a, b) => GRAIN_ORDER.indexOf(a) >= GRAIN_ORDER.indexOf(b) ? a : b;
405
+ const partsIn = (parts) => resolveRecord_js_1.PART_ORDER.filter((p) => parts.includes(p));
406
+ function noteKey(note) {
407
+ return JSON.stringify(note);
408
+ }
409
+ function uniqueNotes(notes) {
410
+ const seen = new Set();
411
+ return notes.filter((n) => {
412
+ const key = noteKey(n);
413
+ if (seen.has(key))
414
+ return false;
415
+ seen.add(key);
416
+ return true;
417
+ });
418
+ }
419
+ function dstNote(dst, end) {
420
+ if (dst === undefined)
421
+ return [];
422
+ return [{ kind: dst.kind, which: dst.which, ...(end !== undefined && { end }) }];
423
+ }
424
+ function spell(ms, zone) {
425
+ return (0, instant_js_1.spellInstant)({ ms, nanos: 0 }, offsetFor(zone, ms));
426
+ }
427
+ function windowZone(zone, clock) {
428
+ return zone.kind === 'iana' ? zone.zone : clock.zone;
429
+ }
430
+ function fromPoint(point, clock) {
431
+ const from = spell(point.fromMs, point.zone);
432
+ const to = spell(point.toMs, point.zone);
433
+ if (from === undefined || to === undefined)
434
+ return undefined;
435
+ const range = { from, to };
436
+ return {
437
+ said: point.said,
438
+ candidate: {
439
+ window: { kind: 'range', range },
440
+ range,
441
+ zone: windowZone(point.zone, clock),
442
+ grain: point.grain,
443
+ implied: partsIn(point.implied),
444
+ anchor: point.anchor,
445
+ notes: uniqueNotes([...point.notes, ...dstNote(point.dst), { kind: 'end-of-grain' }]),
446
+ reading: point.tags,
447
+ },
448
+ };
449
+ }
450
+ function agrees(a, b) {
451
+ const same = (x, y) => x === undefined || y === undefined || x === y;
452
+ return same(a.dateOrder, b.dateOrder) && same(a.year, b.year);
453
+ }
454
+ function fromSides(l, r, clock) {
455
+ if (!agrees(l.tags, r.tags) || !(l.fromMs < r.toMs))
456
+ return undefined;
457
+ const from = spell(l.fromMs, l.zone);
458
+ const to = spell(r.toMs, r.zone);
459
+ if (from === undefined || to === undefined)
460
+ return undefined;
461
+ const range = { from, to };
462
+ const tags = {
463
+ ...((l.tags.dateOrder ?? r.tags.dateOrder) !== undefined && {
464
+ dateOrder: l.tags.dateOrder ?? r.tags.dateOrder,
465
+ }),
466
+ ...(l.tags.meridiem !== undefined && { meridiem: l.tags.meridiem }),
467
+ ...(r.tags.meridiem !== undefined && { endMeridiem: r.tags.meridiem }),
468
+ ...((l.tags.year ?? r.tags.year) !== undefined && { year: l.tags.year ?? r.tags.year }),
469
+ };
470
+ return {
471
+ said: [...l.said, ...r.said],
472
+ candidate: {
473
+ window: { kind: 'range', range },
474
+ range,
475
+ zone: windowZone(l.zone, clock),
476
+ grain: finer(l.grain, r.grain),
477
+ implied: partsIn([...l.implied, ...r.implied]),
478
+ anchor: l.anchor === 'message' || r.anchor === 'message' ? 'message' : 'none',
479
+ notes: uniqueNotes([
480
+ ...l.notes,
481
+ ...r.notes,
482
+ ...dstNote(l.dst, 'from'),
483
+ ...dstNote(r.dst, 'to'),
484
+ { kind: 'end-of-grain' },
485
+ ]),
486
+ reading: tags,
487
+ },
488
+ };
489
+ }
490
+ const LOOKBACK_LETTER = {
491
+ second: 's',
492
+ minute: 'm',
493
+ hour: 'h',
494
+ day: 'd',
495
+ week: 'w',
496
+ };
497
+ function lookbackBuilt(parts, clock) {
498
+ const rel = parts.relative;
499
+ if (rel === undefined || !('count' in rel))
500
+ return undefined;
501
+ const others = Object.keys(parts).filter((k) => k !== 'relative');
502
+ if (others.length > 0)
503
+ return { unsupported: 'a look-back with other parts' };
504
+ const duration = `${rel.count}${LOOKBACK_LETTER[rel.unit]}`;
505
+ let range;
506
+ try {
507
+ range = (0, range_js_1.lookbackRange)(clock.now, duration, 'smhdw');
508
+ }
509
+ catch {
510
+ return { unsupported: 'a look-back past the calendar' };
511
+ }
512
+ return {
513
+ said: ['duration'],
514
+ candidate: {
515
+ window: { kind: 'lookback', duration },
516
+ range,
517
+ zone: clock.zone,
518
+ grain: rel.unit,
519
+ implied: [],
520
+ anchor: 'message',
521
+ notes: [],
522
+ reading: {},
523
+ },
524
+ };
525
+ }
526
+ /** A range side with what it takes from the whole mention and the other side: the day, the zone. */
527
+ function sideOf(side, outer, other) {
528
+ const hasDay = (p) => p.date !== undefined || p.relative !== undefined;
529
+ const day = hasDay(side) ? side : hasDay(outer) ? outer : hasDay(other) ? other : undefined;
530
+ const zoneToken = side.zoneToken ?? outer.zoneToken ?? other.zoneToken;
531
+ return {
532
+ ...(side.wall !== undefined && { wall: side.wall }),
533
+ ...(side.partOfDay !== undefined && { partOfDay: side.partOfDay }),
534
+ ...(side.anchor !== undefined && { anchor: side.anchor }),
535
+ ...(day?.date !== undefined && { date: day.date }),
536
+ ...(day?.relative !== undefined && { relative: day.relative }),
537
+ ...(zoneToken !== undefined && { zoneToken }),
538
+ };
539
+ }
540
+ function builtOf(parts, clock, nowMs) {
541
+ const lookback = lookbackBuilt(parts, clock);
542
+ if (lookback !== undefined)
543
+ return 'candidate' in lookback ? [lookback] : lookback;
544
+ if (parts.rangeOf === undefined) {
545
+ const points = pointsOf(parts, clock, nowMs);
546
+ if (!Array.isArray(points))
547
+ return points;
548
+ return points.map((p) => fromPoint(p, clock)).filter((b) => b !== undefined);
549
+ }
550
+ if (parts.wall !== undefined || parts.partOfDay !== undefined || parts.anchor !== undefined) {
551
+ return { unsupported: 'a range with a time outside its two sides' };
552
+ }
553
+ const [l, r] = parts.rangeOf;
554
+ const left = sideOf(l, parts, r);
555
+ const right = sideOf(r, parts, l);
556
+ if (lookbackBuilt(left, clock) !== undefined || lookbackBuilt(right, clock) !== undefined) {
557
+ return { unsupported: 'a look-back as a range side' };
558
+ }
559
+ const lp = pointsOf(left, clock, nowMs);
560
+ if (!Array.isArray(lp))
561
+ return lp;
562
+ const rp = pointsOf(right, clock, nowMs);
563
+ if (!Array.isArray(rp))
564
+ return rp;
565
+ const out = [];
566
+ for (const a of lp) {
567
+ for (const b of rp) {
568
+ const built = fromSides(a, b, clock);
569
+ if (built !== undefined)
570
+ out.push(built);
571
+ }
572
+ }
573
+ return out;
574
+ }
575
+ /**
576
+ * Every candidate window of one mention's parses, resolved against the
577
+ * clock. A reading the person must confirm (`confirm: true` — every reading
578
+ * the record files, TQ29; a `model` reader's by default) carries `said: []`.
579
+ */
580
+ function resolveMention(parses, clock, reader, confirm = reader.kind === 'model') {
581
+ const now = (0, instant_js_1.instantOf)(clock.now, 'strict');
582
+ if (now === undefined || !(0, zone_js_1.isZoneName)(clock.zone)) {
583
+ throw new TypeError('resolveMention: the clock must carry a strict instant and an IANA zone name.');
584
+ }
585
+ const candidates = [];
586
+ const unsupported = [];
587
+ let needsZone = false;
588
+ parses.forEach((parts, parse) => {
589
+ const built = builtOf(parts, clock, now.ms);
590
+ if (!Array.isArray(built)) {
591
+ if ('needsZone' in built)
592
+ needsZone = true;
593
+ else
594
+ unsupported.push(built.unsupported);
595
+ return;
596
+ }
597
+ for (const b of built) {
598
+ if (!(0, range_js_1.isTimeRange)(b.candidate.range))
599
+ continue;
600
+ candidates.push({
601
+ ...b.candidate,
602
+ said: confirm ? [] : partsIn(b.said),
603
+ reader: { id: reader.id, kind: reader.kind },
604
+ parse,
605
+ });
606
+ }
607
+ });
608
+ return { candidates, needsZone, unsupported };
609
+ }
610
+ exports.resolveMention = resolveMention;
611
+ // ─── Choosing ────────────────────────────────────────────────────────────
612
+ const windowKey = (c) => c.window.kind === 'lookback' ? `lookback:${c.window.duration}` : `${c.range.from}/${c.range.to}`;
613
+ function openQuestions(candidates, confirm) {
614
+ const differs = (read) => new Set(candidates.map((c) => JSON.stringify(read(c) ?? null))).size > 1;
615
+ const open = [];
616
+ if (differs((c) => c.parse))
617
+ open.push('parse');
618
+ if (differs((c) => c.reading.dateOrder))
619
+ open.push('date-order');
620
+ if (differs((c) => c.reading.year))
621
+ open.push('year');
622
+ if (differs((c) => [c.reading.meridiem, c.reading.endMeridiem]))
623
+ open.push('meridiem');
624
+ if (differs((c) => c.notes.filter((n) => n.kind === 'dst-overlap' || n.kind === 'dst-gap'))) {
625
+ open.push('dst');
626
+ }
627
+ if (confirm)
628
+ open.push('confirm');
629
+ return open;
630
+ }
631
+ /**
632
+ * Whether a policy step DECIDED something: it removed a reading whose window
633
+ * none of the kept readings names. A step that removed only same-window
634
+ * readings (`12/12/12` under `DMY` — every order names one day) changed
635
+ * nothing the person would see, so the choice is not recorded as assumed.
636
+ */
637
+ function policyDecided(all, before, kept) {
638
+ if (kept.length === before.length)
639
+ return false;
640
+ const keptWindows = new Set(kept.map((i) => windowKey(all[i])));
641
+ return before.some((i) => !kept.includes(i) && !keptWindows.has(windowKey(all[i])));
642
+ }
643
+ /**
644
+ * How one mention settles under the app's policy (§ 5.1, § 11). The policy
645
+ * only removes readings; it never adds one. A DST choice, a meridiem, a
646
+ * zone the person named that is no zone, and a reading to confirm
647
+ * (`confirm` — every reading the record files, TQ29) are never settled here
648
+ * — they stay `open` for the person.
649
+ */
650
+ function chooseReading(resolution, policy, kind, problem, confirm = kind === 'model') {
651
+ if (problem === 'unreadable')
652
+ return { by: 'none', why: 'unreadable' };
653
+ if (resolution.needsZone && resolution.candidates.length === 0) {
654
+ return { by: 'open', remaining: [], open: ['zone'] };
655
+ }
656
+ const all = resolution.candidates;
657
+ if (all.length === 0) {
658
+ return { by: 'none', why: resolution.unsupported.length > 0 ? 'unsupported' : 'no-candidate' };
659
+ }
660
+ const applied = {};
661
+ let remaining = all.map((_, i) => i);
662
+ if (policy.dateOrder !== 'ask') {
663
+ const kept = remaining.filter((i) => {
664
+ const order = all[i]?.reading.dateOrder;
665
+ return order === undefined || order === policy.dateOrder;
666
+ });
667
+ if (policyDecided(all, remaining, kept))
668
+ applied.dateOrder = policy.dateOrder;
669
+ remaining = kept;
670
+ }
671
+ if (policy.year !== 'ask') {
672
+ const kept = remaining.filter((i) => all[i]?.reading.year !== 'previous');
673
+ if (policyDecided(all, remaining, kept))
674
+ applied.year = policy.year;
675
+ remaining = kept;
676
+ }
677
+ if (remaining.length === 0)
678
+ return { by: 'none', why: 'excluded-by-policy' };
679
+ const usedPolicy = Object.keys(applied).length > 0;
680
+ const left = remaining.map((i) => all[i]);
681
+ const windows = new Set(left.map(windowKey));
682
+ const zoneOpen = resolution.needsZone ? ['zone'] : [];
683
+ if (windows.size === 1 && zoneOpen.length === 0) {
684
+ const candidate = remaining[0];
685
+ if (confirm) {
686
+ return { by: 'open', remaining, open: ['confirm'], ...(usedPolicy && { policy: applied }) };
687
+ }
688
+ return usedPolicy ? { by: 'policy', candidate, policy: applied } : { by: 'only', candidate };
689
+ }
690
+ const open = [...zoneOpen, ...openQuestions(left, confirm)];
691
+ return { by: 'open', remaining, open, ...(usedPolicy && { policy: applied }) };
692
+ }
693
+ exports.chooseReading = chooseReading;
694
+ //# sourceMappingURL=resolve.js.map