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.
- package/CAPABILITIES.md +13 -1
- package/dist/adapters/llm/AnthropicProvider.js +10 -111
- package/dist/adapters/llm/AnthropicProvider.js.map +1 -1
- package/dist/adapters/llm/BedrockProvider.js +11 -4
- package/dist/adapters/llm/BedrockProvider.js.map +1 -1
- package/dist/adapters/llm/InvokeModelGatewayProvider.js +167 -35
- package/dist/adapters/llm/InvokeModelGatewayProvider.js.map +1 -1
- package/dist/adapters/llm/OpenAIProvider.js +5 -0
- package/dist/adapters/llm/OpenAIProvider.js.map +1 -1
- package/dist/adapters/llm/anthropicMessagesWire.js +20 -6
- package/dist/adapters/llm/anthropicMessagesWire.js.map +1 -1
- package/dist/adapters/llm/retryAfter.js +61 -0
- package/dist/adapters/llm/retryAfter.js.map +1 -0
- package/dist/adapters/types.js.map +1 -1
- package/dist/artifacts/datasetResult.js +2 -2
- package/dist/artifacts/datasetResult.js.map +1 -1
- package/dist/artifacts/index.js +10 -8
- package/dist/artifacts/index.js.map +1 -1
- package/dist/artifacts/minting.js +2 -2
- package/dist/artifacts/minting.js.map +1 -1
- package/dist/core/Agent.js +229 -5
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/agent/AgentBuilder.js +75 -1
- package/dist/core/agent/AgentBuilder.js.map +1 -1
- package/dist/core/agent/arguments/ask.js +356 -14
- package/dist/core/agent/arguments/ask.js.map +1 -1
- package/dist/core/agent/arguments/declare.js +260 -45
- package/dist/core/agent/arguments/declare.js.map +1 -1
- package/dist/core/agent/arguments/dispatch.js +25 -1
- package/dist/core/agent/arguments/dispatch.js.map +1 -1
- package/dist/core/agent/arguments/resolve.js +239 -6
- package/dist/core/agent/arguments/resolve.js.map +1 -1
- package/dist/core/agent/arguments/rows.js +37 -2
- package/dist/core/agent/arguments/rows.js.map +1 -1
- package/dist/core/agent/arguments/serve.js +332 -4
- package/dist/core/agent/arguments/serve.js.map +1 -1
- package/dist/core/agent/arguments/subflow.js +46 -7
- package/dist/core/agent/arguments/subflow.js.map +1 -1
- package/dist/core/agent/assessment/assess.js +45 -6
- package/dist/core/agent/assessment/assess.js.map +1 -1
- package/dist/core/agent/assessment/compose.js +3 -0
- package/dist/core/agent/assessment/compose.js.map +1 -1
- package/dist/core/agent/assessment/reasons.js +18 -0
- package/dist/core/agent/assessment/reasons.js.map +1 -1
- package/dist/core/agent/buildAgentChart.js +31 -1
- package/dist/core/agent/buildAgentChart.js.map +1 -1
- package/dist/core/agent/buildDynamicAgentChart.js +9 -0
- package/dist/core/agent/buildDynamicAgentChart.js.map +1 -1
- package/dist/core/agent/coverage/answer.js +24 -7
- package/dist/core/agent/coverage/answer.js.map +1 -1
- package/dist/core/agent/coverage/period.js +110 -69
- package/dist/core/agent/coverage/period.js.map +1 -1
- package/dist/core/agent/coverage/timeLimitFacts.js +70 -0
- package/dist/core/agent/coverage/timeLimitFacts.js.map +1 -0
- package/dist/core/agent/coverage/timeLimits.js +72 -0
- package/dist/core/agent/coverage/timeLimits.js.map +1 -0
- package/dist/core/agent/evidence/evidenceIndex.js +48 -7
- package/dist/core/agent/evidence/evidenceIndex.js.map +1 -1
- package/dist/core/agent/evidence/gate.js +9 -4
- package/dist/core/agent/evidence/gate.js.map +1 -1
- package/dist/core/agent/evidence/normalize.js +1 -105
- package/dist/core/agent/evidence/normalize.js.map +1 -1
- package/dist/core/agent/findings/ledger.js +14 -0
- package/dist/core/agent/findings/ledger.js.map +1 -1
- package/dist/core/agent/findings/types.js.map +1 -1
- package/dist/core/agent/honesty/mounts.js +105 -4
- package/dist/core/agent/honesty/mounts.js.map +1 -1
- package/dist/core/agent/results/subflow.js +43 -11
- package/dist/core/agent/results/subflow.js.map +1 -1
- package/dist/core/agent/stages/argumentAsk.js +85 -6
- package/dist/core/agent/stages/argumentAsk.js.map +1 -1
- package/dist/core/agent/stages/callLLM.js +16 -0
- package/dist/core/agent/stages/callLLM.js.map +1 -1
- package/dist/core/agent/stages/prepareFinal.js +61 -8
- package/dist/core/agent/stages/prepareFinal.js.map +1 -1
- package/dist/core/agent/stages/route.js +64 -6
- package/dist/core/agent/stages/route.js.map +1 -1
- package/dist/core/agent/stages/seed.js +29 -6
- package/dist/core/agent/stages/seed.js.map +1 -1
- package/dist/core/agent/stages/timeLayer.js +201 -0
- package/dist/core/agent/stages/timeLayer.js.map +1 -0
- package/dist/core/agent/stages/timeLineage.js +61 -0
- package/dist/core/agent/stages/timeLineage.js.map +1 -0
- package/dist/core/agent/stages/toolCalls.js +70 -0
- package/dist/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/core/inputRequest.js +132 -5
- package/dist/core/inputRequest.js.map +1 -1
- package/dist/core/messageFrom.js +5 -2
- package/dist/core/messageFrom.js.map +1 -1
- package/dist/core/runCheckpoint.js +17 -2
- package/dist/core/runCheckpoint.js.map +1 -1
- package/dist/core/slots/buildToolsSlot.js +30 -2
- package/dist/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/core/time/ask.js +239 -0
- package/dist/core/time/ask.js.map +1 -0
- package/dist/core/time/axis.js +469 -0
- package/dist/core/time/axis.js.map +1 -0
- package/dist/core/time/bind.js +235 -0
- package/dist/core/time/bind.js.map +1 -0
- package/dist/core/time/check.js +261 -0
- package/dist/core/time/check.js.map +1 -0
- package/dist/core/time/checkRecord.js +97 -0
- package/dist/core/time/checkRecord.js.map +1 -0
- package/dist/core/time/clock.js +260 -0
- package/dist/core/time/clock.js.map +1 -0
- package/dist/core/time/convert.js +634 -0
- package/dist/core/time/convert.js.map +1 -0
- package/dist/core/time/drift.js +96 -0
- package/dist/core/time/drift.js.map +1 -0
- package/dist/core/time/duration.js +125 -0
- package/dist/core/time/duration.js.map +1 -0
- package/dist/core/time/forms.js +273 -0
- package/dist/core/time/forms.js.map +1 -0
- package/dist/core/time/instant.js +141 -0
- package/dist/core/time/instant.js.map +1 -0
- package/dist/core/time/periodForm.js +392 -0
- package/dist/core/time/periodForm.js.map +1 -0
- package/dist/core/time/present.js +312 -0
- package/dist/core/time/present.js.map +1 -0
- package/dist/core/time/range.js +267 -0
- package/dist/core/time/range.js.map +1 -0
- package/dist/core/time/reader.js +209 -0
- package/dist/core/time/reader.js.map +1 -0
- package/dist/core/time/readers/english.js +576 -0
- package/dist/core/time/readers/english.js.map +1 -0
- package/dist/core/time/readingAsk.js +94 -0
- package/dist/core/time/readingAsk.js.map +1 -0
- package/dist/core/time/resolve.js +694 -0
- package/dist/core/time/resolve.js.map +1 -0
- package/dist/core/time/resolveRecord.js +164 -0
- package/dist/core/time/resolveRecord.js.map +1 -0
- package/dist/core/time/rows.js +412 -0
- package/dist/core/time/rows.js.map +1 -0
- package/dist/core/time/rowsBuild.js +193 -0
- package/dist/core/time/rowsBuild.js.map +1 -0
- package/dist/core/time/textForms.js +133 -0
- package/dist/core/time/textForms.js.map +1 -0
- package/dist/core/time/windows.js +172 -0
- package/dist/core/time/windows.js.map +1 -0
- package/dist/core/time/wire.js +86 -0
- package/dist/core/time/wire.js.map +1 -0
- package/dist/core/time/zone.js +253 -0
- package/dist/core/time/zone.js.map +1 -0
- package/dist/core/tools.js.map +1 -1
- package/dist/esm/adapters/llm/AnthropicProvider.js +8 -109
- package/dist/esm/adapters/llm/AnthropicProvider.js.map +1 -1
- package/dist/esm/adapters/llm/BedrockProvider.js +11 -4
- package/dist/esm/adapters/llm/BedrockProvider.js.map +1 -1
- package/dist/esm/adapters/llm/InvokeModelGatewayProvider.d.ts +38 -4
- package/dist/esm/adapters/llm/InvokeModelGatewayProvider.js +167 -35
- package/dist/esm/adapters/llm/InvokeModelGatewayProvider.js.map +1 -1
- package/dist/esm/adapters/llm/OpenAIProvider.js +5 -0
- package/dist/esm/adapters/llm/OpenAIProvider.js.map +1 -1
- package/dist/esm/adapters/llm/anthropicMessagesWire.d.ts +6 -1
- package/dist/esm/adapters/llm/anthropicMessagesWire.js +20 -6
- package/dist/esm/adapters/llm/anthropicMessagesWire.js.map +1 -1
- package/dist/esm/adapters/llm/retryAfter.d.ts +27 -0
- package/dist/esm/adapters/llm/retryAfter.js +56 -0
- package/dist/esm/adapters/llm/retryAfter.js.map +1 -0
- package/dist/esm/adapters/types.d.ts +9 -0
- package/dist/esm/adapters/types.js.map +1 -1
- package/dist/esm/artifacts/datasetResult.js +1 -1
- package/dist/esm/artifacts/datasetResult.js.map +1 -1
- package/dist/esm/artifacts/index.d.ts +1 -1
- package/dist/esm/artifacts/index.js +3 -2
- package/dist/esm/artifacts/index.js.map +1 -1
- package/dist/esm/artifacts/minting.js +1 -1
- package/dist/esm/artifacts/minting.js.map +1 -1
- package/dist/esm/artifacts/types.d.ts +2 -2
- package/dist/esm/core/Agent.d.ts +64 -0
- package/dist/esm/core/Agent.js +230 -6
- package/dist/esm/core/Agent.js.map +1 -1
- package/dist/esm/core/agent/AgentBuilder.d.ts +60 -0
- package/dist/esm/core/agent/AgentBuilder.js +75 -1
- package/dist/esm/core/agent/AgentBuilder.js.map +1 -1
- package/dist/esm/core/agent/arguments/ask.d.ts +88 -5
- package/dist/esm/core/agent/arguments/ask.js +349 -8
- package/dist/esm/core/agent/arguments/ask.js.map +1 -1
- package/dist/esm/core/agent/arguments/checks.d.ts +1 -1
- package/dist/esm/core/agent/arguments/declare.d.ts +76 -15
- package/dist/esm/core/agent/arguments/declare.js +255 -44
- package/dist/esm/core/agent/arguments/declare.js.map +1 -1
- package/dist/esm/core/agent/arguments/dispatch.js +25 -1
- package/dist/esm/core/agent/arguments/dispatch.js.map +1 -1
- package/dist/esm/core/agent/arguments/resolve.d.ts +77 -7
- package/dist/esm/core/agent/arguments/resolve.js +239 -8
- package/dist/esm/core/agent/arguments/resolve.js.map +1 -1
- package/dist/esm/core/agent/arguments/rows.d.ts +31 -2
- package/dist/esm/core/agent/arguments/rows.js +35 -1
- package/dist/esm/core/agent/arguments/rows.js.map +1 -1
- package/dist/esm/core/agent/arguments/serve.d.ts +133 -4
- package/dist/esm/core/agent/arguments/serve.js +328 -4
- package/dist/esm/core/agent/arguments/serve.js.map +1 -1
- package/dist/esm/core/agent/arguments/subflow.d.ts +28 -0
- package/dist/esm/core/agent/arguments/subflow.js +47 -8
- package/dist/esm/core/agent/arguments/subflow.js.map +1 -1
- package/dist/esm/core/agent/assessment/assess.js +45 -6
- package/dist/esm/core/agent/assessment/assess.js.map +1 -1
- package/dist/esm/core/agent/assessment/compose.js +3 -0
- package/dist/esm/core/agent/assessment/compose.js.map +1 -1
- package/dist/esm/core/agent/assessment/reasons.js +18 -0
- package/dist/esm/core/agent/assessment/reasons.js.map +1 -1
- package/dist/esm/core/agent/assessment/types.d.ts +15 -1
- package/dist/esm/core/agent/buildAgentChart.d.ts +41 -0
- package/dist/esm/core/agent/buildAgentChart.js +28 -0
- package/dist/esm/core/agent/buildAgentChart.js.map +1 -1
- package/dist/esm/core/agent/buildDynamicAgentChart.d.ts +1 -1
- package/dist/esm/core/agent/buildDynamicAgentChart.js +9 -0
- package/dist/esm/core/agent/buildDynamicAgentChart.js.map +1 -1
- package/dist/esm/core/agent/coverage/answer.d.ts +20 -1
- package/dist/esm/core/agent/coverage/answer.js +23 -6
- package/dist/esm/core/agent/coverage/answer.js.map +1 -1
- package/dist/esm/core/agent/coverage/period.d.ts +49 -3
- package/dist/esm/core/agent/coverage/period.js +107 -68
- package/dist/esm/core/agent/coverage/period.js.map +1 -1
- package/dist/esm/core/agent/coverage/timeLimitFacts.d.ts +56 -0
- package/dist/esm/core/agent/coverage/timeLimitFacts.js +65 -0
- package/dist/esm/core/agent/coverage/timeLimitFacts.js.map +1 -0
- package/dist/esm/core/agent/coverage/timeLimits.d.ts +46 -0
- package/dist/esm/core/agent/coverage/timeLimits.js +67 -0
- package/dist/esm/core/agent/coverage/timeLimits.js.map +1 -0
- package/dist/esm/core/agent/evidence/evidenceIndex.d.ts +25 -2
- package/dist/esm/core/agent/evidence/evidenceIndex.js +47 -7
- package/dist/esm/core/agent/evidence/evidenceIndex.js.map +1 -1
- package/dist/esm/core/agent/evidence/gate.d.ts +7 -0
- package/dist/esm/core/agent/evidence/gate.js +9 -4
- package/dist/esm/core/agent/evidence/gate.js.map +1 -1
- package/dist/esm/core/agent/evidence/normalize.d.ts +0 -34
- package/dist/esm/core/agent/evidence/normalize.js +0 -103
- package/dist/esm/core/agent/evidence/normalize.js.map +1 -1
- package/dist/esm/core/agent/evidence/types.d.ts +12 -1
- package/dist/esm/core/agent/findings/ledger.js +14 -0
- package/dist/esm/core/agent/findings/ledger.js.map +1 -1
- package/dist/esm/core/agent/findings/types.d.ts +2 -1
- package/dist/esm/core/agent/findings/types.js.map +1 -1
- package/dist/esm/core/agent/honesty/mounts.d.ts +25 -0
- package/dist/esm/core/agent/honesty/mounts.js +104 -4
- package/dist/esm/core/agent/honesty/mounts.js.map +1 -1
- package/dist/esm/core/agent/results/subflow.d.ts +34 -2
- package/dist/esm/core/agent/results/subflow.js +43 -11
- package/dist/esm/core/agent/results/subflow.js.map +1 -1
- package/dist/esm/core/agent/stages/argumentAsk.d.ts +19 -0
- package/dist/esm/core/agent/stages/argumentAsk.js +85 -6
- package/dist/esm/core/agent/stages/argumentAsk.js.map +1 -1
- package/dist/esm/core/agent/stages/callLLM.d.ts +6 -0
- package/dist/esm/core/agent/stages/callLLM.js +16 -0
- package/dist/esm/core/agent/stages/callLLM.js.map +1 -1
- package/dist/esm/core/agent/stages/prepareFinal.d.ts +13 -1
- package/dist/esm/core/agent/stages/prepareFinal.js +59 -7
- package/dist/esm/core/agent/stages/prepareFinal.js.map +1 -1
- package/dist/esm/core/agent/stages/route.d.ts +29 -1
- package/dist/esm/core/agent/stages/route.js +64 -7
- package/dist/esm/core/agent/stages/route.js.map +1 -1
- package/dist/esm/core/agent/stages/seed.d.ts +23 -0
- package/dist/esm/core/agent/stages/seed.js +29 -6
- package/dist/esm/core/agent/stages/seed.js.map +1 -1
- package/dist/esm/core/agent/stages/timeLayer.d.ts +94 -0
- package/dist/esm/core/agent/stages/timeLayer.js +193 -0
- package/dist/esm/core/agent/stages/timeLayer.js.map +1 -0
- package/dist/esm/core/agent/stages/timeLineage.d.ts +31 -0
- package/dist/esm/core/agent/stages/timeLineage.js +57 -0
- package/dist/esm/core/agent/stages/timeLineage.js.map +1 -0
- package/dist/esm/core/agent/stages/toolCalls.d.ts +32 -0
- package/dist/esm/core/agent/stages/toolCalls.js +70 -0
- package/dist/esm/core/agent/stages/toolCalls.js.map +1 -1
- package/dist/esm/core/agent/types.d.ts +37 -0
- package/dist/esm/core/inputRequest.d.ts +50 -6
- package/dist/esm/core/inputRequest.js +132 -5
- package/dist/esm/core/inputRequest.js.map +1 -1
- package/dist/esm/core/messageFrom.d.ts +5 -2
- package/dist/esm/core/messageFrom.js +5 -2
- package/dist/esm/core/messageFrom.js.map +1 -1
- package/dist/esm/core/runCheckpoint.js +17 -2
- package/dist/esm/core/runCheckpoint.js.map +1 -1
- package/dist/esm/core/slots/buildToolsSlot.d.ts +29 -0
- package/dist/esm/core/slots/buildToolsSlot.js +30 -2
- package/dist/esm/core/slots/buildToolsSlot.js.map +1 -1
- package/dist/esm/core/time/ask.d.ts +126 -0
- package/dist/esm/core/time/ask.js +230 -0
- package/dist/esm/core/time/ask.js.map +1 -0
- package/dist/esm/core/time/axis.d.ts +224 -0
- package/dist/esm/core/time/axis.js +462 -0
- package/dist/esm/core/time/axis.js.map +1 -0
- package/dist/esm/core/time/bind.d.ts +143 -0
- package/dist/esm/core/time/bind.js +227 -0
- package/dist/esm/core/time/bind.js.map +1 -0
- package/dist/esm/core/time/check.d.ts +113 -0
- package/dist/esm/core/time/check.js +252 -0
- package/dist/esm/core/time/check.js.map +1 -0
- package/dist/esm/core/time/checkRecord.d.ts +74 -0
- package/dist/esm/core/time/checkRecord.js +90 -0
- package/dist/esm/core/time/checkRecord.js.map +1 -0
- package/dist/esm/core/time/clock.d.ts +183 -0
- package/dist/esm/core/time/clock.js +252 -0
- package/dist/esm/core/time/clock.js.map +1 -0
- package/dist/esm/core/time/convert.d.ts +178 -0
- package/dist/esm/core/time/convert.js +609 -0
- package/dist/esm/core/time/convert.js.map +1 -0
- package/dist/esm/core/time/drift.d.ts +85 -0
- package/dist/esm/core/time/drift.js +91 -0
- package/dist/esm/core/time/drift.js.map +1 -0
- package/dist/esm/core/time/duration.d.ts +71 -0
- package/dist/esm/core/time/duration.js +117 -0
- package/dist/esm/core/time/duration.js.map +1 -0
- package/dist/esm/core/time/forms.d.ts +84 -0
- package/dist/esm/core/time/forms.js +268 -0
- package/dist/esm/core/time/forms.js.map +1 -0
- package/dist/esm/core/time/instant.d.ts +75 -0
- package/dist/esm/core/time/instant.js +131 -0
- package/dist/esm/core/time/instant.js.map +1 -0
- package/dist/esm/core/time/periodForm.d.ts +184 -0
- package/dist/esm/core/time/periodForm.js +376 -0
- package/dist/esm/core/time/periodForm.js.map +1 -0
- package/dist/esm/core/time/present.d.ts +107 -0
- package/dist/esm/core/time/present.js +305 -0
- package/dist/esm/core/time/present.js.map +1 -0
- package/dist/esm/core/time/range.d.ts +127 -0
- package/dist/esm/core/time/range.js +249 -0
- package/dist/esm/core/time/range.js.map +1 -0
- package/dist/esm/core/time/reader.d.ts +162 -0
- package/dist/esm/core/time/reader.js +203 -0
- package/dist/esm/core/time/reader.js.map +1 -0
- package/dist/esm/core/time/readers/english.d.ts +99 -0
- package/dist/esm/core/time/readers/english.js +572 -0
- package/dist/esm/core/time/readers/english.js.map +1 -0
- package/dist/esm/core/time/readingAsk.d.ts +45 -0
- package/dist/esm/core/time/readingAsk.js +90 -0
- package/dist/esm/core/time/readingAsk.js.map +1 -0
- package/dist/esm/core/time/resolve.d.ts +103 -0
- package/dist/esm/core/time/resolve.js +684 -0
- package/dist/esm/core/time/resolve.js.map +1 -0
- package/dist/esm/core/time/resolveRecord.d.ts +160 -0
- package/dist/esm/core/time/resolveRecord.js +158 -0
- package/dist/esm/core/time/resolveRecord.js.map +1 -0
- package/dist/esm/core/time/rows.d.ts +297 -0
- package/dist/esm/core/time/rows.js +397 -0
- package/dist/esm/core/time/rows.js.map +1 -0
- package/dist/esm/core/time/rowsBuild.d.ts +82 -0
- package/dist/esm/core/time/rowsBuild.js +185 -0
- package/dist/esm/core/time/rowsBuild.js.map +1 -0
- package/dist/esm/core/time/textForms.d.ts +53 -0
- package/dist/esm/core/time/textForms.js +126 -0
- package/dist/esm/core/time/textForms.js.map +1 -0
- package/dist/esm/core/time/windows.d.ts +113 -0
- package/dist/esm/core/time/windows.js +166 -0
- package/dist/esm/core/time/windows.js.map +1 -0
- package/dist/esm/core/time/wire.d.ts +63 -0
- package/dist/esm/core/time/wire.js +81 -0
- package/dist/esm/core/time/wire.js.map +1 -0
- package/dist/esm/core/time/zone.d.ts +115 -0
- package/dist/esm/core/time/zone.js +242 -0
- package/dist/esm/core/time/zone.js.map +1 -0
- package/dist/esm/core/tools.d.ts +26 -4
- package/dist/esm/core/tools.js.map +1 -1
- package/dist/esm/events/payloads.d.ts +16 -2
- package/dist/esm/index.d.ts +13 -1
- package/dist/esm/index.js +6 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/answer-account/facts/howSure.js +7 -0
- package/dist/esm/lib/answer-account/facts/howSure.js.map +1 -1
- package/dist/esm/lib/answer-account/templates.d.ts +3 -0
- package/dist/esm/lib/answer-account/templates.js +4 -0
- package/dist/esm/lib/answer-account/templates.js.map +1 -1
- package/dist/esm/lib/mcp/elicitation.d.ts +84 -0
- package/dist/esm/lib/mcp/elicitation.js +181 -0
- package/dist/esm/lib/mcp/elicitation.js.map +1 -0
- package/dist/esm/lib/mcp/mcpClient.js +9 -3
- package/dist/esm/lib/mcp/mcpClient.js.map +1 -1
- package/dist/esm/lib/mcp/mcpServe.js +6 -2
- package/dist/esm/lib/mcp/mcpServe.js.map +1 -1
- package/dist/esm/lib/mcp/mockMcpClient.d.ts +9 -1
- package/dist/esm/lib/mcp/mockMcpClient.js +5 -3
- package/dist/esm/lib/mcp/mockMcpClient.js.map +1 -1
- package/dist/esm/lib/mcp/toolExtras.d.ts +21 -2
- package/dist/esm/lib/mcp/toolExtras.js +22 -0
- package/dist/esm/lib/mcp/toolExtras.js.map +1 -1
- package/dist/esm/lib/mcp/types.d.ts +8 -0
- package/dist/esm/lib/time-travel/receipt.d.ts +1 -1
- package/dist/esm/lib/time-travel/servedView.d.ts +1 -1
- package/dist/esm/lib/time-travel/servedView.js +9 -0
- package/dist/esm/lib/time-travel/servedView.js.map +1 -1
- package/dist/esm/locales/index.d.ts +6 -0
- package/dist/esm/locales/index.js +6 -0
- package/dist/esm/locales/index.js.map +1 -1
- package/dist/esm/locales/timeAsk.d.ts +29 -0
- package/dist/esm/locales/timeAsk.js +44 -0
- package/dist/esm/locales/timeAsk.js.map +1 -0
- package/dist/esm/recorders/core/resilienceHooks.js +1 -0
- package/dist/esm/recorders/core/resilienceHooks.js.map +1 -1
- package/dist/esm/resilience/statedWait.d.ts +22 -0
- package/dist/esm/resilience/statedWait.js +35 -0
- package/dist/esm/resilience/statedWait.js.map +1 -0
- package/dist/esm/resilience/withRetry.d.ts +13 -2
- package/dist/esm/resilience/withRetry.js +16 -1
- package/dist/esm/resilience/withRetry.js.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/answer-account/facts/howSure.js +7 -0
- package/dist/lib/answer-account/facts/howSure.js.map +1 -1
- package/dist/lib/answer-account/templates.js +4 -0
- package/dist/lib/answer-account/templates.js.map +1 -1
- package/dist/lib/mcp/elicitation.js +186 -0
- package/dist/lib/mcp/elicitation.js.map +1 -0
- package/dist/lib/mcp/mcpClient.js +8 -2
- package/dist/lib/mcp/mcpClient.js.map +1 -1
- package/dist/lib/mcp/mcpServe.js +5 -1
- package/dist/lib/mcp/mcpServe.js.map +1 -1
- package/dist/lib/mcp/mockMcpClient.js +4 -2
- package/dist/lib/mcp/mockMcpClient.js.map +1 -1
- package/dist/lib/mcp/toolExtras.js +25 -1
- package/dist/lib/mcp/toolExtras.js.map +1 -1
- package/dist/lib/time-travel/servedView.js +9 -0
- package/dist/lib/time-travel/servedView.js.map +1 -1
- package/dist/locales/index.js +8 -1
- package/dist/locales/index.js.map +1 -1
- package/dist/locales/timeAsk.js +47 -0
- package/dist/locales/timeAsk.js.map +1 -0
- package/dist/recorders/core/resilienceHooks.js +1 -0
- package/dist/recorders/core/resilienceHooks.js.map +1 -1
- package/dist/resilience/statedWait.js +39 -0
- package/dist/resilience/statedWait.js.map +1 -0
- package/dist/resilience/withRetry.js +16 -1
- package/dist/resilience/withRetry.js.map +1 -1
- package/dist/types/adapters/llm/AnthropicProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/BedrockProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/InvokeModelGatewayProvider.d.ts +38 -4
- package/dist/types/adapters/llm/InvokeModelGatewayProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/OpenAIProvider.d.ts.map +1 -1
- package/dist/types/adapters/llm/anthropicMessagesWire.d.ts +6 -1
- package/dist/types/adapters/llm/anthropicMessagesWire.d.ts.map +1 -1
- package/dist/types/adapters/llm/retryAfter.d.ts +28 -0
- package/dist/types/adapters/llm/retryAfter.d.ts.map +1 -0
- package/dist/types/adapters/types.d.ts +9 -0
- package/dist/types/adapters/types.d.ts.map +1 -1
- package/dist/types/artifacts/index.d.ts +1 -1
- package/dist/types/artifacts/index.d.ts.map +1 -1
- package/dist/types/artifacts/types.d.ts +2 -2
- package/dist/types/artifacts/types.d.ts.map +1 -1
- package/dist/types/core/Agent.d.ts +64 -0
- package/dist/types/core/Agent.d.ts.map +1 -1
- package/dist/types/core/agent/AgentBuilder.d.ts +60 -0
- package/dist/types/core/agent/AgentBuilder.d.ts.map +1 -1
- package/dist/types/core/agent/arguments/ask.d.ts +88 -5
- package/dist/types/core/agent/arguments/ask.d.ts.map +1 -1
- package/dist/types/core/agent/arguments/checks.d.ts +1 -1
- package/dist/types/core/agent/arguments/checks.d.ts.map +1 -1
- package/dist/types/core/agent/arguments/declare.d.ts +76 -15
- package/dist/types/core/agent/arguments/declare.d.ts.map +1 -1
- package/dist/types/core/agent/arguments/dispatch.d.ts.map +1 -1
- package/dist/types/core/agent/arguments/resolve.d.ts +77 -7
- package/dist/types/core/agent/arguments/resolve.d.ts.map +1 -1
- package/dist/types/core/agent/arguments/rows.d.ts +31 -2
- package/dist/types/core/agent/arguments/rows.d.ts.map +1 -1
- package/dist/types/core/agent/arguments/serve.d.ts +133 -4
- package/dist/types/core/agent/arguments/serve.d.ts.map +1 -1
- package/dist/types/core/agent/arguments/subflow.d.ts +28 -0
- package/dist/types/core/agent/arguments/subflow.d.ts.map +1 -1
- package/dist/types/core/agent/assessment/assess.d.ts.map +1 -1
- package/dist/types/core/agent/assessment/compose.d.ts.map +1 -1
- package/dist/types/core/agent/assessment/reasons.d.ts.map +1 -1
- package/dist/types/core/agent/assessment/types.d.ts +15 -1
- package/dist/types/core/agent/assessment/types.d.ts.map +1 -1
- package/dist/types/core/agent/buildAgentChart.d.ts +41 -0
- package/dist/types/core/agent/buildAgentChart.d.ts.map +1 -1
- package/dist/types/core/agent/buildDynamicAgentChart.d.ts +1 -1
- package/dist/types/core/agent/buildDynamicAgentChart.d.ts.map +1 -1
- package/dist/types/core/agent/coverage/answer.d.ts +20 -1
- package/dist/types/core/agent/coverage/answer.d.ts.map +1 -1
- package/dist/types/core/agent/coverage/period.d.ts +49 -3
- package/dist/types/core/agent/coverage/period.d.ts.map +1 -1
- package/dist/types/core/agent/coverage/timeLimitFacts.d.ts +57 -0
- package/dist/types/core/agent/coverage/timeLimitFacts.d.ts.map +1 -0
- package/dist/types/core/agent/coverage/timeLimits.d.ts +47 -0
- package/dist/types/core/agent/coverage/timeLimits.d.ts.map +1 -0
- package/dist/types/core/agent/evidence/evidenceIndex.d.ts +25 -2
- package/dist/types/core/agent/evidence/evidenceIndex.d.ts.map +1 -1
- package/dist/types/core/agent/evidence/gate.d.ts +7 -0
- package/dist/types/core/agent/evidence/gate.d.ts.map +1 -1
- package/dist/types/core/agent/evidence/normalize.d.ts +0 -34
- package/dist/types/core/agent/evidence/normalize.d.ts.map +1 -1
- package/dist/types/core/agent/evidence/types.d.ts +12 -1
- package/dist/types/core/agent/evidence/types.d.ts.map +1 -1
- package/dist/types/core/agent/findings/ledger.d.ts.map +1 -1
- package/dist/types/core/agent/findings/types.d.ts +2 -1
- package/dist/types/core/agent/findings/types.d.ts.map +1 -1
- package/dist/types/core/agent/honesty/mounts.d.ts +25 -0
- package/dist/types/core/agent/honesty/mounts.d.ts.map +1 -1
- package/dist/types/core/agent/results/subflow.d.ts +34 -2
- package/dist/types/core/agent/results/subflow.d.ts.map +1 -1
- package/dist/types/core/agent/stages/argumentAsk.d.ts +19 -0
- package/dist/types/core/agent/stages/argumentAsk.d.ts.map +1 -1
- package/dist/types/core/agent/stages/callLLM.d.ts +6 -0
- package/dist/types/core/agent/stages/callLLM.d.ts.map +1 -1
- package/dist/types/core/agent/stages/prepareFinal.d.ts +13 -1
- package/dist/types/core/agent/stages/prepareFinal.d.ts.map +1 -1
- package/dist/types/core/agent/stages/route.d.ts +29 -1
- package/dist/types/core/agent/stages/route.d.ts.map +1 -1
- package/dist/types/core/agent/stages/seed.d.ts +23 -0
- package/dist/types/core/agent/stages/seed.d.ts.map +1 -1
- package/dist/types/core/agent/stages/timeLayer.d.ts +95 -0
- package/dist/types/core/agent/stages/timeLayer.d.ts.map +1 -0
- package/dist/types/core/agent/stages/timeLineage.d.ts +32 -0
- package/dist/types/core/agent/stages/timeLineage.d.ts.map +1 -0
- package/dist/types/core/agent/stages/toolCalls.d.ts +32 -0
- package/dist/types/core/agent/stages/toolCalls.d.ts.map +1 -1
- package/dist/types/core/agent/types.d.ts +37 -0
- package/dist/types/core/agent/types.d.ts.map +1 -1
- package/dist/types/core/inputRequest.d.ts +50 -6
- package/dist/types/core/inputRequest.d.ts.map +1 -1
- package/dist/types/core/messageFrom.d.ts +5 -2
- package/dist/types/core/messageFrom.d.ts.map +1 -1
- package/dist/types/core/runCheckpoint.d.ts.map +1 -1
- package/dist/types/core/slots/buildToolsSlot.d.ts +29 -0
- package/dist/types/core/slots/buildToolsSlot.d.ts.map +1 -1
- package/dist/types/core/time/ask.d.ts +127 -0
- package/dist/types/core/time/ask.d.ts.map +1 -0
- package/dist/types/core/time/axis.d.ts +225 -0
- package/dist/types/core/time/axis.d.ts.map +1 -0
- package/dist/types/core/time/bind.d.ts +144 -0
- package/dist/types/core/time/bind.d.ts.map +1 -0
- package/dist/types/core/time/check.d.ts +114 -0
- package/dist/types/core/time/check.d.ts.map +1 -0
- package/dist/types/core/time/checkRecord.d.ts +75 -0
- package/dist/types/core/time/checkRecord.d.ts.map +1 -0
- package/dist/types/core/time/clock.d.ts +184 -0
- package/dist/types/core/time/clock.d.ts.map +1 -0
- package/dist/types/core/time/convert.d.ts +179 -0
- package/dist/types/core/time/convert.d.ts.map +1 -0
- package/dist/types/core/time/drift.d.ts +86 -0
- package/dist/types/core/time/drift.d.ts.map +1 -0
- package/dist/types/core/time/duration.d.ts +72 -0
- package/dist/types/core/time/duration.d.ts.map +1 -0
- package/dist/types/core/time/forms.d.ts +85 -0
- package/dist/types/core/time/forms.d.ts.map +1 -0
- package/dist/types/core/time/instant.d.ts +76 -0
- package/dist/types/core/time/instant.d.ts.map +1 -0
- package/dist/types/core/time/periodForm.d.ts +185 -0
- package/dist/types/core/time/periodForm.d.ts.map +1 -0
- package/dist/types/core/time/present.d.ts +108 -0
- package/dist/types/core/time/present.d.ts.map +1 -0
- package/dist/types/core/time/range.d.ts +128 -0
- package/dist/types/core/time/range.d.ts.map +1 -0
- package/dist/types/core/time/reader.d.ts +163 -0
- package/dist/types/core/time/reader.d.ts.map +1 -0
- package/dist/types/core/time/readers/english.d.ts +100 -0
- package/dist/types/core/time/readers/english.d.ts.map +1 -0
- package/dist/types/core/time/readingAsk.d.ts +46 -0
- package/dist/types/core/time/readingAsk.d.ts.map +1 -0
- package/dist/types/core/time/resolve.d.ts +104 -0
- package/dist/types/core/time/resolve.d.ts.map +1 -0
- package/dist/types/core/time/resolveRecord.d.ts +161 -0
- package/dist/types/core/time/resolveRecord.d.ts.map +1 -0
- package/dist/types/core/time/rows.d.ts +298 -0
- package/dist/types/core/time/rows.d.ts.map +1 -0
- package/dist/types/core/time/rowsBuild.d.ts +83 -0
- package/dist/types/core/time/rowsBuild.d.ts.map +1 -0
- package/dist/types/core/time/textForms.d.ts +54 -0
- package/dist/types/core/time/textForms.d.ts.map +1 -0
- package/dist/types/core/time/windows.d.ts +114 -0
- package/dist/types/core/time/windows.d.ts.map +1 -0
- package/dist/types/core/time/wire.d.ts +64 -0
- package/dist/types/core/time/wire.d.ts.map +1 -0
- package/dist/types/core/time/zone.d.ts +116 -0
- package/dist/types/core/time/zone.d.ts.map +1 -0
- package/dist/types/core/tools.d.ts +26 -4
- package/dist/types/core/tools.d.ts.map +1 -1
- package/dist/types/events/payloads.d.ts +16 -2
- package/dist/types/events/payloads.d.ts.map +1 -1
- package/dist/types/index.d.ts +13 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lib/answer-account/facts/howSure.d.ts.map +1 -1
- package/dist/types/lib/answer-account/templates.d.ts +3 -0
- package/dist/types/lib/answer-account/templates.d.ts.map +1 -1
- package/dist/types/lib/mcp/elicitation.d.ts +85 -0
- package/dist/types/lib/mcp/elicitation.d.ts.map +1 -0
- package/dist/types/lib/mcp/mcpServe.d.ts.map +1 -1
- package/dist/types/lib/mcp/mockMcpClient.d.ts +9 -1
- package/dist/types/lib/mcp/mockMcpClient.d.ts.map +1 -1
- package/dist/types/lib/mcp/toolExtras.d.ts +21 -2
- package/dist/types/lib/mcp/toolExtras.d.ts.map +1 -1
- package/dist/types/lib/mcp/types.d.ts +8 -0
- package/dist/types/lib/mcp/types.d.ts.map +1 -1
- package/dist/types/lib/time-travel/receipt.d.ts +1 -1
- package/dist/types/lib/time-travel/receipt.d.ts.map +1 -1
- package/dist/types/lib/time-travel/servedView.d.ts +1 -1
- package/dist/types/lib/time-travel/servedView.d.ts.map +1 -1
- package/dist/types/locales/index.d.ts +6 -0
- package/dist/types/locales/index.d.ts.map +1 -1
- package/dist/types/locales/timeAsk.d.ts +30 -0
- package/dist/types/locales/timeAsk.d.ts.map +1 -0
- package/dist/types/recorders/core/resilienceHooks.d.ts.map +1 -1
- package/dist/types/resilience/statedWait.d.ts +23 -0
- package/dist/types/resilience/statedWait.d.ts.map +1 -0
- package/dist/types/resilience/withRetry.d.ts +13 -2
- package/dist/types/resilience/withRetry.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/artifacts/timeAxis.js +0 -218
- package/dist/artifacts/timeAxis.js.map +0 -1
- package/dist/esm/artifacts/timeAxis.d.ts +0 -114
- package/dist/esm/artifacts/timeAxis.js +0 -212
- package/dist/esm/artifacts/timeAxis.js.map +0 -1
- package/dist/types/artifacts/timeAxis.d.ts +0 -115
- 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
|