aiur-cli-linux-arm64 0.0.5 → 0.0.7

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 (1487) hide show
  1. package/package.json +1 -1
  2. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentBuildGuard.beam +0 -0
  3. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentChat.beam +0 -0
  4. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentCommandInstaller.beam +0 -0
  5. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentContextPresentation.beam +0 -0
  6. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentControlCLI.beam +0 -0
  7. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentEnvironment.beam +0 -0
  8. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentEvents.beam +0 -0
  9. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentGitHubGuard.beam +0 -0
  10. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentList.Renderer.Chrome.beam +0 -0
  11. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentList.Renderer.Layout.beam +0 -0
  12. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentList.Renderer.Table.beam +0 -0
  13. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentQueueItem.beam +0 -0
  14. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentQueueStore.beam +0 -0
  15. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentRunner.CheckpointDelivery.beam +0 -0
  16. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentRunner.CommentContext.beam +0 -0
  17. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentRunner.MessageHandler.beam +0 -0
  18. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentRunner.ModelLabelRefresh.beam +0 -0
  19. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentRunner.QueueDrain.beam +0 -0
  20. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentRunner.SessionLifecycle.beam +0 -0
  21. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentRunner.ToolExecutor.beam +0 -0
  22. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentRunner.TurnAlerts.beam +0 -0
  23. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentRunner.TurnCallbacks.beam +0 -0
  24. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentRunner.TurnLoop.beam +0 -0
  25. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentRunner.TurnProgress.beam +0 -0
  26. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentRunner.TurnPrompt.beam +0 -0
  27. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentRunner.beam +0 -0
  28. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentSkills.beam +0 -0
  29. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentTools.Catalog.beam +0 -0
  30. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentTools.MCP.Router.beam +0 -0
  31. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AgentTools.MCP.beam +0 -0
  32. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AlertFeed.beam +0 -0
  33. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AlertLedger.beam +0 -0
  34. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Alerts.beam +0 -0
  35. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AppServer.Adapter.beam +0 -0
  36. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AppServer.Messages.beam +0 -0
  37. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AppServer.Rpc.Await.beam +0 -0
  38. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AppServer.Rpc.Stream.beam +0 -0
  39. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AppServer.Rpc.StreamDiagnostics.beam +0 -0
  40. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AppServer.Rpc.beam +0 -0
  41. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.AppServer.TurnLoop.beam +0 -0
  42. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Application.beam +0 -0
  43. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.BuildOrder.Bounded.beam +0 -0
  44. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.BuildOrder.Cadence.beam +0 -0
  45. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.BuildOrder.CatalogStore.beam +0 -0
  46. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.BuildOrder.Dependency.beam +0 -0
  47. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.BuildOrder.GitHubGraph.Queries.beam +0 -0
  48. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.BuildOrder.GitHubGraph.Reconciliation.beam +0 -0
  49. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.BuildOrder.GraphProjection.Configuration.beam +0 -0
  50. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.BuildOrder.GraphProjection.Options.beam +0 -0
  51. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.BuildOrder.GraphProjection.Policy.beam +0 -0
  52. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.BuildOrder.GraphProjection.Snapshot.beam +0 -0
  53. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.BuildOrder.GraphProjection.beam +0 -0
  54. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.BuildOrder.Member.beam +0 -0
  55. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.BuildOrder.ProgressRenderer.beam +0 -0
  56. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.BuildOrder.TicketDetail.Repository.beam +0 -0
  57. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.BuildOrdersCLI.beam +0 -0
  58. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.CIApprovalStore.beam +0 -0
  59. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.CLI.beam +0 -0
  60. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Claude.CodingAgent.beam +0 -0
  61. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Claude.NotificationPolicy.beam +0 -0
  62. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Claude.Repl.Launcher.beam +0 -0
  63. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Claude.Repl.Reaper.beam +0 -0
  64. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Claude.ResetTime.beam +0 -0
  65. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Claude.Telemetry.beam +0 -0
  66. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Claude.UsageApi.beam +0 -0
  67. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Codex.AccountGeneration.beam +0 -0
  68. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Codex.CodingAgent.beam +0 -0
  69. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Codex.DynamicTool.EmitEvent.beam +0 -0
  70. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Codex.DynamicTool.Errors.beam +0 -0
  71. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Codex.DynamicTool.TicketState.beam +0 -0
  72. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Codex.DynamicTool.beam +0 -0
  73. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Codex.ExhaustedReset.beam +0 -0
  74. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Codex.NotificationPolicy.beam +0 -0
  75. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Codex.Notifications.beam +0 -0
  76. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Codex.ResetTime.beam +0 -0
  77. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Codex.StartupFailure.beam +0 -0
  78. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Codex.TurnLoop.beam +0 -0
  79. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.CodingAgent.ModelLabel.beam +0 -0
  80. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.CodingAgent.Models.beam +0 -0
  81. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.CodingAgent.Providers.Claude.beam +0 -0
  82. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.CodingAgent.Providers.Codex.beam +0 -0
  83. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.CodingAgent.Providers.Fake.beam +0 -0
  84. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.CodingAgent.Providers.Muse.beam +0 -0
  85. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.CodingAgent.Registry.beam +0 -0
  86. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.CodingAgent.beam +0 -0
  87. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Config.Paths.beam +0 -0
  88. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Config.Schema.Agent.beam +0 -0
  89. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Config.Schema.BuildOrder.beam +0 -0
  90. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Config.Schema.Claude.beam +0 -0
  91. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Config.Schema.Codex.beam +0 -0
  92. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Config.Schema.Github.beam +0 -0
  93. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Config.Schema.Linear.beam +0 -0
  94. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Config.Schema.MuseBackend.beam +0 -0
  95. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Config.Schema.Rtk.beam +0 -0
  96. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Config.Schema.Tracker.beam +0 -0
  97. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Config.Schema.beam +0 -0
  98. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Config.beam +0 -0
  99. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.CurrentRunMembership.Reconciler.Snapshot.beam +0 -0
  100. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Decision.beam +0 -0
  101. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.DecisionApi.PublicLifecycleProjection.beam +0 -0
  102. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.DecisionAttentionSignals.beam +0 -0
  103. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.DecisionDispatch.beam +0 -0
  104. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.DecisionEvent.beam +0 -0
  105. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.DecisionHistory.beam +0 -0
  106. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.DecisionProjection.beam +0 -0
  107. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.DecisionPubSub.beam +0 -0
  108. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.DecisionSanitizer.beam +0 -0
  109. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.DecisionStore.beam +0 -0
  110. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Env.Schema.beam +0 -0
  111. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Env.beam +0 -0
  112. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.EventPublicationLog.beam +0 -0
  113. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Events.GithubCommentsPoller.beam +0 -0
  114. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Events.GithubKeys.beam +0 -0
  115. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Events.GithubReviewThreadIdentity.beam +0 -0
  116. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Events.GithubWebhook.Deposit.beam +0 -0
  117. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Events.GithubWebhook.Normalizer.beam +0 -0
  118. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Events.GithubWebhook.beam +0 -0
  119. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Events.IdGenerator.beam +0 -0
  120. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Events.PrCommandScanner.beam +0 -0
  121. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Events.Publisher.beam +0 -0
  122. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Events.Sanitizer.beam +0 -0
  123. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Events.SubscriptionStore.beam +0 -0
  124. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Executor.Claims.beam +0 -0
  125. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Executor.Principal.beam +0 -0
  126. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.ExecutorCommandCLI.beam +0 -0
  127. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.ExecutorWakeInbox.beam +0 -0
  128. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.AgentMarker.beam +0 -0
  129. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.AuthPreflight.beam +0 -0
  130. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.BoundedBlockedBy.beam +0 -0
  131. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.BrokerTimeout.beam +0 -0
  132. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.Budget.beam +0 -0
  133. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.BudgetLedger.beam +0 -0
  134. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.CiReadiness.beam +0 -0
  135. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.Client.beam +0 -0
  136. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.CommentPollBatch.beam +0 -0
  137. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.Comments.beam +0 -0
  138. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.Config.beam +0 -0
  139. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.Credential.beam +0 -0
  140. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.CredentialSelector.beam +0 -0
  141. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.DependenciesApi.beam +0 -0
  142. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.DispatchAuthorization.beam +0 -0
  143. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.Issues.beam +0 -0
  144. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.Labels.beam +0 -0
  145. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.LocalHold.beam +0 -0
  146. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.OpenIssueSnapshot.beam +0 -0
  147. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.PullRequests.beam +0 -0
  148. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.ReadCache.Metrics.beam +0 -0
  149. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.ReadCache.Policy.beam +0 -0
  150. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.ReadCache.beam +0 -0
  151. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.ResourceEvents.beam +0 -0
  152. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.ResourceStore.beam +0 -0
  153. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.Tracker.beam +0 -0
  154. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHub.WriteThrough.beam +0 -0
  155. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GitHubCostCLI.beam +0 -0
  156. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.GlobalConfigStartup.beam +0 -0
  157. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Init.AgentCli.beam +0 -0
  158. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Init.BackendConfigs.beam +0 -0
  159. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Init.BotAccount.beam +0 -0
  160. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Init.GitHub.beam +0 -0
  161. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Init.GitHubApp.beam +0 -0
  162. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Init.Labels.beam +0 -0
  163. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Init.Questions.beam +0 -0
  164. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Init.Runtime.beam +0 -0
  165. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Init.Templates.beam +0 -0
  166. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Init.beam +0 -0
  167. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.IssueLog.beam +0 -0
  168. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.LaunchStateAdoption.beam +0 -0
  169. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.LauncherWatchdog.beam +0 -0
  170. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Linear.Tracker.beam +0 -0
  171. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Memory.Tracker.beam +0 -0
  172. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.ModelAvailability.beam +0 -0
  173. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.ModelCatalog.beam +0 -0
  174. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.ModelDiscovery.beam +0 -0
  175. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.Approvals.beam +0 -0
  176. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.CodingAgent.beam +0 -0
  177. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.Defaults.beam +0 -0
  178. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.EventNormalizer.beam +0 -0
  179. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.Init.beam +0 -0
  180. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.MeterProbe.beam +0 -0
  181. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.Meters.beam +0 -0
  182. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.ModelCatalog.beam +0 -0
  183. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.Protocol.beam +0 -0
  184. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.Session.beam +0 -0
  185. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.SessionRecovery.beam +0 -0
  186. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.Transcript.beam +0 -0
  187. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.Transport.beam +0 -0
  188. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.Turn.beam +0 -0
  189. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.TurnControl.beam +0 -0
  190. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.TurnLoop.beam +0 -0
  191. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.Usage.beam +0 -0
  192. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Muse.View.beam +0 -0
  193. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.OpenAICompat.CommandRunner.beam +0 -0
  194. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.OpenAICompat.ProviderMeterProbe.beam +0 -0
  195. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Opencode.ChatCompletions.DeltaRenderer.beam +0 -0
  196. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Opencode.ChatCompletions.InputIdentity.beam +0 -0
  197. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Opencode.ChatCompletions.OperatorDispatch.beam +0 -0
  198. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Opencode.ChatCompletions.TurnRequest.beam +0 -0
  199. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Opencode.ChatCompletions.TurnStream.beam +0 -0
  200. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Opencode.ChatCompletions.beam +0 -0
  201. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Opencode.Slot.ServeLifecycle.beam +0 -0
  202. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Opencode.WorkspaceSetup.beam +0 -0
  203. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.AutoSubscriptions.beam +0 -0
  204. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.CapacityBinding.beam +0 -0
  205. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.CiLifecycle.beam +0 -0
  206. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.CommentPolling.TargetSelection.beam +0 -0
  207. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.CommentPolling.beam +0 -0
  208. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.CommentWake.beam +0 -0
  209. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.ControlLifecycleStore.beam +0 -0
  210. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.DispatchPolicy.beam +0 -0
  211. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.Dispatcher.beam +0 -0
  212. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.EventTopics.beam +0 -0
  213. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.IssueSync.beam +0 -0
  214. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.Lifecycle.beam +0 -0
  215. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.LifecycleFence.beam +0 -0
  216. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.OperatorMessages.DeliveryPolicy.beam +0 -0
  217. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.OperatorMessages.beam +0 -0
  218. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.OrphanedWorkers.beam +0 -0
  219. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.PauseResume.beam +0 -0
  220. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.RateLimitFallback.beam +0 -0
  221. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.ReadyForReviewTransitions.beam +0 -0
  222. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.RetryEngine.beam +0 -0
  223. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.ReworkGate.beam +0 -0
  224. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.State.beam +0 -0
  225. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.StatusReason.beam +0 -0
  226. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.StatusReport.beam +0 -0
  227. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.TokenAccounting.Payloads.beam +0 -0
  228. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.TokenAccounting.beam +0 -0
  229. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.TrackerHealth.beam +0 -0
  230. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.WaitingReason.beam +0 -0
  231. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.WorkspaceCleanup.beam +0 -0
  232. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Orchestrator.beam +0 -0
  233. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.PrReadyLedgerStore.beam +0 -0
  234. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.PromptBuilder.beam +0 -0
  235. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.ProviderMeterProbe.beam +0 -0
  236. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.ProviderMeterProjection.beam +0 -0
  237. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.ProviderMeterSnapshot.beam +0 -0
  238. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.ProviderMeters.CLI.beam +0 -0
  239. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.ProviderMeters.HostObservations.beam +0 -0
  240. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.ProviderMeters.HostSnapshot.beam +0 -0
  241. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.ProviderMeters.Input.beam +0 -0
  242. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.ProviderMeters.Text.beam +0 -0
  243. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.PubSub.Boot.beam +0 -0
  244. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.RecentMerge.beam +0 -0
  245. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Rtk.beam +0 -0
  246. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.RunTelemetry.Dataset.beam +0 -0
  247. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.RunTelemetry.Lifecycle.beam +0 -0
  248. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.RunTelemetry.Procfs.beam +0 -0
  249. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.RunTelemetry.Writer.beam +0 -0
  250. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.SessionHandle.beam +0 -0
  251. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Shutdown.beam +0 -0
  252. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.TestReset.beam +0 -0
  253. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.TestShard.beam +0 -0
  254. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.TestTicketScope.beam +0 -0
  255. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Tracker.beam +0 -0
  256. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Usage.Headless.Muse.SessionUsage.beam +0 -0
  257. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Usage.PriceTable.Validator.beam +0 -0
  258. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.UsageAggregate.Key.beam +0 -0
  259. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.UsageEnvelope.RelationshipRegistry.beam +0 -0
  260. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.UsageEnvelope.beam +0 -0
  261. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Webhooks.DeliveryModeEvents.beam +0 -0
  262. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Webhooks.EventKey.beam +0 -0
  263. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Webhooks.ModeRegistry.beam +0 -0
  264. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Webhooks.ModeTable.beam +0 -0
  265. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Workflow.beam +0 -0
  266. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.WorkflowStore.beam +0 -0
  267. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Workspace.Checkout.beam +0 -0
  268. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Workspace.DirtyGuard.beam +0 -0
  269. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Workspace.HostBoot.beam +0 -0
  270. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Workspace.HostLock.beam +0 -0
  271. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Workspace.Layout.beam +0 -0
  272. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Workspace.Materialize.beam +0 -0
  273. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Workspace.Ownership.Guardian.beam +0 -0
  274. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Workspace.Ownership.HoldStatus.beam +0 -0
  275. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Workspace.Ownership.Store.beam +0 -0
  276. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Workspace.Ownership.beam +0 -0
  277. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Workspace.Provisioner.beam +0 -0
  278. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Workspace.Reconstruction.beam +0 -0
  279. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Workspace.Refresh.beam +0 -0
  280. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Workspace.Remove.beam +0 -0
  281. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Workspace.beam +0 -0
  282. package/release/lib/aiur-0.0.7/ebin/Elixir.Aiur.Yaml.beam +0 -0
  283. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.AnalyticsLive.beam +0 -0
  284. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.BuildOrder.ContextRuntime.beam +0 -0
  285. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.BuildOrder.DataSource.beam +0 -0
  286. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.BuildOrder.PlanningSource.beam +0 -0
  287. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.BuildOrder.SourceRuntime.beam +0 -0
  288. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.BuildOrder.TicketContextPresenter.beam +0 -0
  289. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.BuildOrderLive.beam +0 -0
  290. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.BuildOrderPresenter.beam +0 -0
  291. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.DashboardLive.beam +0 -0
  292. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.Endpoint.beam +0 -0
  293. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.FinancialData.ChangeBridge.beam +0 -0
  294. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.FinancialDataAccess.Proof.beam +0 -0
  295. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.GithubWebhookController.beam +0 -0
  296. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.ObservabilityApiController.beam +0 -0
  297. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.AddAgentModal.beam +0 -0
  298. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.AddAgentSubmission.beam +0 -0
  299. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.AgentLogModal.beam +0 -0
  300. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.AgentRoutingPreview.beam +0 -0
  301. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.Analytics.Charts.beam +0 -0
  302. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.Analytics.Styles.beam +0 -0
  303. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderAnalytics.beam +0 -0
  304. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderBreakdown.beam +0 -0
  305. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderCatalog.beam +0 -0
  306. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderGraph.beam +0 -0
  307. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderGridModel.beam +0 -0
  308. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderSelected.beam +0 -0
  309. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderStatus.beam +0 -0
  310. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderTicketContext.beam +0 -0
  311. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.ConversationDrawer.beam +0 -0
  312. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.CurrentRunOutcomes.beam +0 -0
  313. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.DashboardShell.beam +0 -0
  314. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.DecisionAction.beam +0 -0
  315. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.DecisionCard.beam +0 -0
  316. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.DecisionDetail.beam +0 -0
  317. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.DecisionInbox.beam +0 -0
  318. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.DecisionLatency.beam +0 -0
  319. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.DecisionRevisionAction.beam +0 -0
  320. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.FleetTable.beam +0 -0
  321. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.History.beam +0 -0
  322. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.LifecycleComponents.beam +0 -0
  323. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.Money.beam +0 -0
  324. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.Overview.beam +0 -0
  325. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.ProviderMeters.beam +0 -0
  326. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.ProviderMetersPresenter.beam +0 -0
  327. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.RecentOutcomes.beam +0 -0
  328. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.RouteRegistry.beam +0 -0
  329. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.RunSummaryStrip.beam +0 -0
  330. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.TicketContext.beam +0 -0
  331. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.TicketDetailModal.beam +0 -0
  332. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.TicketsPanel.beam +0 -0
  333. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsFilters.beam +0 -0
  334. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsPresentation.beam +0 -0
  335. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsRow.Projection.beam +0 -0
  336. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsTable.beam +0 -0
  337. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.UsageSummary.beam +0 -0
  338. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.OperatorControlCenter.UsageSummaryPresenter.beam +0 -0
  339. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.Presenter.beam +0 -0
  340. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.Router.Helpers.beam +0 -0
  341. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.Router.beam +0 -0
  342. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.StaticAssets.beam +0 -0
  343. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.StreamdeckChannel.beam +0 -0
  344. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.StreamdeckLive.beam +0 -0
  345. package/release/lib/aiur-0.0.7/ebin/Elixir.AiurWeb.StreamdeckStrip.beam +0 -0
  346. package/release/lib/aiur-0.0.7/ebin/Elixir.Mix.Tasks.Aiur.TestShard.beam +0 -0
  347. package/release/lib/aiur-0.0.7/ebin/aiur.app +1056 -0
  348. package/release/lib/aiur-0.0.7/priv/build_gate.bash +1912 -0
  349. package/release/lib/aiur-0.0.7/priv/build_gate_command_wrapper.bash +292 -0
  350. package/release/lib/aiur-0.0.7/priv/github_budget.py +919 -0
  351. package/release/lib/aiur-0.0.7/priv/github_quota_guard.sh +3403 -0
  352. package/release/lib/aiur-0.0.7/priv/opencode_plugins/input-identity.mjs +37 -0
  353. package/release/lib/aiur-0.0.7/priv/static/dashboard.css +10294 -0
  354. package/release/lib/aiur-0.0.7/priv/static/muse.svg +6 -0
  355. package/release/lib/bandit-1.12.4/ebin/Elixir.Bandit.beam +0 -0
  356. package/release/lib/decimal-3.1.1/ebin/Elixir.Decimal.beam +0 -0
  357. package/release/lib/phoenix_live_view-1.1.33/ebin/Elixir.Phoenix.Component.beam +0 -0
  358. package/release/lib/tz-0.28.2/ebin/Elixir.Tz.PeriodsProvider.beam +0 -0
  359. package/release/releases/0.0.7/aiur.rel +49 -0
  360. package/release/releases/0.0.7/start.boot +0 -0
  361. package/release/releases/0.0.7/start.script +4751 -0
  362. package/release/releases/0.0.7/start_clean.boot +0 -0
  363. package/release/releases/0.0.7/start_clean.script +4708 -0
  364. package/release/releases/COOKIE +1 -1
  365. package/release/releases/start_erl.data +1 -1
  366. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentBuildGuard.beam +0 -0
  367. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentChat.beam +0 -0
  368. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentCommandInstaller.beam +0 -0
  369. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentControlCLI.beam +0 -0
  370. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentEnvironment.beam +0 -0
  371. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentEvents.beam +0 -0
  372. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentGitHubGuard.beam +0 -0
  373. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentList.Renderer.Chrome.beam +0 -0
  374. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentList.Renderer.Layout.beam +0 -0
  375. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentList.Renderer.Table.beam +0 -0
  376. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentQueueItem.beam +0 -0
  377. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentQueueStore.beam +0 -0
  378. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentRunner.CheckpointDelivery.beam +0 -0
  379. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentRunner.CommentContext.beam +0 -0
  380. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentRunner.MessageHandler.beam +0 -0
  381. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentRunner.QueueDrain.beam +0 -0
  382. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentRunner.SessionLifecycle.beam +0 -0
  383. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentRunner.ToolExecutor.beam +0 -0
  384. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentRunner.TurnAlerts.beam +0 -0
  385. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentRunner.TurnCallbacks.beam +0 -0
  386. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentRunner.TurnLoop.beam +0 -0
  387. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentRunner.TurnPrompt.beam +0 -0
  388. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentRunner.beam +0 -0
  389. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AgentSkills.beam +0 -0
  390. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AlertFeed.beam +0 -0
  391. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AlertLedger.beam +0 -0
  392. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Alerts.beam +0 -0
  393. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AppServer.Adapter.beam +0 -0
  394. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AppServer.Messages.beam +0 -0
  395. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AppServer.Rpc.Await.beam +0 -0
  396. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AppServer.Rpc.Stream.beam +0 -0
  397. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AppServer.Rpc.beam +0 -0
  398. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.AppServer.TurnLoop.beam +0 -0
  399. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Application.beam +0 -0
  400. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.BuildOrder.Bounded.beam +0 -0
  401. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.BuildOrder.Cadence.beam +0 -0
  402. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.BuildOrder.Dependency.beam +0 -0
  403. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.BuildOrder.GitHubGraph.Queries.beam +0 -0
  404. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.BuildOrder.GraphProjection.Configuration.beam +0 -0
  405. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.BuildOrder.GraphProjection.Options.beam +0 -0
  406. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.BuildOrder.GraphProjection.Policy.beam +0 -0
  407. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.BuildOrder.GraphProjection.Snapshot.beam +0 -0
  408. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.BuildOrder.GraphProjection.StoreCatalog.beam +0 -0
  409. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.BuildOrder.GraphProjection.beam +0 -0
  410. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.BuildOrder.Member.beam +0 -0
  411. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.BuildOrder.ProgressRenderer.beam +0 -0
  412. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.BuildOrder.TicketDetail.Repository.beam +0 -0
  413. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.BuildOrdersCLI.beam +0 -0
  414. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.CIApprovalStore.beam +0 -0
  415. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.CLI.beam +0 -0
  416. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Claude.CodingAgent.beam +0 -0
  417. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Claude.NotificationPolicy.beam +0 -0
  418. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Claude.Repl.Launcher.beam +0 -0
  419. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Claude.Repl.Reaper.beam +0 -0
  420. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Claude.Telemetry.beam +0 -0
  421. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Claude.UsageApi.beam +0 -0
  422. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Codex.AccountGeneration.beam +0 -0
  423. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Codex.CodingAgent.beam +0 -0
  424. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Codex.DynamicTool.EmitEvent.beam +0 -0
  425. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Codex.DynamicTool.Errors.beam +0 -0
  426. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Codex.DynamicTool.beam +0 -0
  427. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Codex.NotificationPolicy.beam +0 -0
  428. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Codex.Notifications.beam +0 -0
  429. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Codex.TurnLoop.beam +0 -0
  430. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.CodingAgent.Models.beam +0 -0
  431. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.CodingAgent.beam +0 -0
  432. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Config.Paths.beam +0 -0
  433. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Config.Schema.Agent.beam +0 -0
  434. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Config.Schema.BuildOrder.beam +0 -0
  435. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Config.Schema.Claude.beam +0 -0
  436. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Config.Schema.Codex.beam +0 -0
  437. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Config.Schema.Github.beam +0 -0
  438. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Config.Schema.Linear.beam +0 -0
  439. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Config.Schema.Tracker.beam +0 -0
  440. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Config.Schema.beam +0 -0
  441. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Config.beam +0 -0
  442. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.CurrentRunMembership.Reconciler.Snapshot.beam +0 -0
  443. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Decision.beam +0 -0
  444. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.DecisionApi.PublicLifecycleProjection.beam +0 -0
  445. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.DecisionAttentionSignals.beam +0 -0
  446. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.DecisionDispatch.beam +0 -0
  447. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.DecisionEvent.beam +0 -0
  448. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.DecisionHistory.beam +0 -0
  449. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.DecisionProjection.beam +0 -0
  450. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.DecisionPubSub.beam +0 -0
  451. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.DecisionSanitizer.beam +0 -0
  452. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.DecisionStore.beam +0 -0
  453. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Env.Schema.beam +0 -0
  454. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Env.beam +0 -0
  455. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.EventPublicationLog.beam +0 -0
  456. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Events.GithubCommentsPoller.beam +0 -0
  457. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Events.GithubKeys.beam +0 -0
  458. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Events.GithubWebhook.Deposit.beam +0 -0
  459. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Events.GithubWebhook.Normalizer.beam +0 -0
  460. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Events.GithubWebhook.beam +0 -0
  461. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Events.IdGenerator.beam +0 -0
  462. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Events.PrCommandScanner.beam +0 -0
  463. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Events.Publisher.beam +0 -0
  464. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Events.Sanitizer.beam +0 -0
  465. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Events.SubscriptionStore.beam +0 -0
  466. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Executor.Claims.beam +0 -0
  467. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.ExecutorCommandCLI.beam +0 -0
  468. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.ExecutorWakeInbox.beam +0 -0
  469. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.AgentCacheMetrics.beam +0 -0
  470. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.AuthPreflight.beam +0 -0
  471. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.Budget.beam +0 -0
  472. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.BudgetLedger.beam +0 -0
  473. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.BudgetMap.beam +0 -0
  474. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.CacheHistory.beam +0 -0
  475. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.CacheInspector.Entry.beam +0 -0
  476. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.CacheInspector.Events.beam +0 -0
  477. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.CacheInspector.Redactor.beam +0 -0
  478. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.CacheInspector.ResourceStoreSource.beam +0 -0
  479. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.CacheInspector.Source.beam +0 -0
  480. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.CacheInspector.beam +0 -0
  481. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.CiReadiness.beam +0 -0
  482. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.Client.beam +0 -0
  483. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.CommentPollBatch.beam +0 -0
  484. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.Comments.beam +0 -0
  485. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.Config.beam +0 -0
  486. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.Credential.beam +0 -0
  487. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.CredentialSelector.beam +0 -0
  488. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.DependenciesApi.beam +0 -0
  489. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.DispatchAuthorization.beam +0 -0
  490. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.Issues.beam +0 -0
  491. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.Labels.beam +0 -0
  492. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.LocalHold.beam +0 -0
  493. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.PullRequests.beam +0 -0
  494. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.QuotaHistory.beam +0 -0
  495. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.QuotaUsage.beam +0 -0
  496. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.ReadCache.Metrics.beam +0 -0
  497. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.ReadCache.Policy.beam +0 -0
  498. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.ReadCache.beam +0 -0
  499. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.ResourceEvents.beam +0 -0
  500. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.ResourceStore.beam +0 -0
  501. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.Tracker.beam +0 -0
  502. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHub.WriteThrough.beam +0 -0
  503. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.GitHubCostCLI.beam +0 -0
  504. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Init.AgentCli.beam +0 -0
  505. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Init.BotAccount.beam +0 -0
  506. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Init.GitHub.beam +0 -0
  507. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Init.Labels.beam +0 -0
  508. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Init.Questions.beam +0 -0
  509. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Init.Runtime.beam +0 -0
  510. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Init.Templates.beam +0 -0
  511. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Init.beam +0 -0
  512. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.IssueLog.beam +0 -0
  513. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.LauncherWatchdog.beam +0 -0
  514. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Linear.Tracker.beam +0 -0
  515. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Memory.Tracker.beam +0 -0
  516. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.ModelAvailability.beam +0 -0
  517. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.ModelCatalog.beam +0 -0
  518. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.ModelDiscovery.beam +0 -0
  519. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.OpenAICompat.CommandRunner.beam +0 -0
  520. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.OpenAICompat.ProviderMeterProbe.beam +0 -0
  521. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Opencode.ChatCompletions.DeltaRenderer.beam +0 -0
  522. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Opencode.ChatCompletions.OperatorDispatch.beam +0 -0
  523. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Opencode.ChatCompletions.TurnRequest.beam +0 -0
  524. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Opencode.ChatCompletions.TurnStream.beam +0 -0
  525. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Opencode.ChatCompletions.beam +0 -0
  526. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Opencode.Slot.ServeLifecycle.beam +0 -0
  527. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Opencode.WorkspaceSetup.beam +0 -0
  528. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.AutoSubscriptions.beam +0 -0
  529. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.CapacityBinding.beam +0 -0
  530. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.CiLifecycle.beam +0 -0
  531. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.CommentPolling.TargetSelection.beam +0 -0
  532. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.CommentPolling.beam +0 -0
  533. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.CommentWake.beam +0 -0
  534. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.ControlLifecycleStore.beam +0 -0
  535. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.DispatchPolicy.beam +0 -0
  536. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.Dispatcher.beam +0 -0
  537. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.EventTopics.beam +0 -0
  538. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.IssueSync.beam +0 -0
  539. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.Lifecycle.beam +0 -0
  540. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.LifecycleFence.beam +0 -0
  541. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.OperatorMessages.DeliveryPolicy.beam +0 -0
  542. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.OperatorMessages.beam +0 -0
  543. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.PauseResume.beam +0 -0
  544. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.RateLimitFallback.beam +0 -0
  545. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.RetryEngine.beam +0 -0
  546. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.ReworkGate.beam +0 -0
  547. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.State.beam +0 -0
  548. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.StatusReason.beam +0 -0
  549. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.StatusReport.beam +0 -0
  550. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.TokenAccounting.Payloads.beam +0 -0
  551. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.TokenAccounting.beam +0 -0
  552. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.TrackerHealth.beam +0 -0
  553. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.WaitingReason.beam +0 -0
  554. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.WorkspaceCleanup.beam +0 -0
  555. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Orchestrator.beam +0 -0
  556. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.PromptBuilder.beam +0 -0
  557. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.ProviderMeterProbe.beam +0 -0
  558. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.ProviderMeterProjection.beam +0 -0
  559. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.ProviderMeterSnapshot.beam +0 -0
  560. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.ProviderMeters.Input.beam +0 -0
  561. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.RecentMerge.beam +0 -0
  562. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.RunTelemetry.Dataset.beam +0 -0
  563. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.RunTelemetry.Lifecycle.beam +0 -0
  564. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.RunTelemetry.Procfs.beam +0 -0
  565. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.RunTelemetry.Writer.beam +0 -0
  566. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.SessionHandle.beam +0 -0
  567. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Shutdown.beam +0 -0
  568. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.TestReset.beam +0 -0
  569. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Tracker.beam +0 -0
  570. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Usage.PriceTable.Validator.beam +0 -0
  571. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.UsageAggregate.Key.beam +0 -0
  572. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.UsageEnvelope.RelationshipRegistry.beam +0 -0
  573. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.UsageEnvelope.beam +0 -0
  574. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Webhooks.EventKey.beam +0 -0
  575. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Webhooks.ModeRegistry.beam +0 -0
  576. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Webhooks.ModeTable.beam +0 -0
  577. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Workflow.beam +0 -0
  578. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.WorkflowStore.beam +0 -0
  579. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Workspace.Checkout.beam +0 -0
  580. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Workspace.Layout.beam +0 -0
  581. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Workspace.Materialize.beam +0 -0
  582. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Workspace.Ownership.Guardian.beam +0 -0
  583. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Workspace.Ownership.Store.beam +0 -0
  584. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Workspace.Ownership.beam +0 -0
  585. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Workspace.Provisioner.beam +0 -0
  586. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Workspace.Reconstruction.beam +0 -0
  587. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Workspace.Refresh.beam +0 -0
  588. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Workspace.Remove.beam +0 -0
  589. package/release/lib/aiur-0.0.5/ebin/Elixir.Aiur.Workspace.beam +0 -0
  590. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.AnalyticsLive.beam +0 -0
  591. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.BuildOrder.ContextRuntime.beam +0 -0
  592. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.BuildOrder.DataSource.beam +0 -0
  593. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.BuildOrder.PlanningSource.beam +0 -0
  594. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.BuildOrder.SourceRuntime.beam +0 -0
  595. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.BuildOrder.TicketContextPresenter.beam +0 -0
  596. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.BuildOrderLive.beam +0 -0
  597. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.BuildOrderPresenter.beam +0 -0
  598. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.DashboardLive.beam +0 -0
  599. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.Endpoint.beam +0 -0
  600. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.FinancialData.ChangeBridge.beam +0 -0
  601. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.FinancialDataAccess.Proof.beam +0 -0
  602. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.GithubCacheLive.beam +0 -0
  603. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.GithubWebhookController.beam +0 -0
  604. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.ObservabilityApiController.beam +0 -0
  605. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.AddAgentModal.beam +0 -0
  606. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.AgentLogModal.beam +0 -0
  607. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.AgentRoutingPreview.beam +0 -0
  608. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.Analytics.Charts.beam +0 -0
  609. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.Analytics.Styles.beam +0 -0
  610. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderAnalytics.beam +0 -0
  611. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderBreakdown.beam +0 -0
  612. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderCatalog.beam +0 -0
  613. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderGraph.beam +0 -0
  614. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderGridModel.beam +0 -0
  615. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderSelected.beam +0 -0
  616. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderStatus.beam +0 -0
  617. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderTicketContext.beam +0 -0
  618. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.ConversationDrawer.beam +0 -0
  619. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.CurrentRunOutcomes.beam +0 -0
  620. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.DashboardShell.beam +0 -0
  621. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.DecisionAction.beam +0 -0
  622. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.DecisionCard.beam +0 -0
  623. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.DecisionDetail.beam +0 -0
  624. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.DecisionInbox.beam +0 -0
  625. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.DecisionLatency.beam +0 -0
  626. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.DecisionRevisionAction.beam +0 -0
  627. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.FleetTable.beam +0 -0
  628. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.GithubCache.Charts.beam +0 -0
  629. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.GithubCache.Styles.beam +0 -0
  630. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.History.beam +0 -0
  631. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.LifecycleComponents.beam +0 -0
  632. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.Overview.beam +0 -0
  633. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.ProviderMeters.beam +0 -0
  634. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.ProviderMetersPresenter.beam +0 -0
  635. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.RecentOutcomes.beam +0 -0
  636. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.RouteRegistry.beam +0 -0
  637. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.RunSummaryStrip.beam +0 -0
  638. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.TicketContext.beam +0 -0
  639. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.TicketDetailModal.beam +0 -0
  640. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.TicketsPanel.beam +0 -0
  641. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsFilters.beam +0 -0
  642. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsPresentation.beam +0 -0
  643. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsRow.Projection.beam +0 -0
  644. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsTable.beam +0 -0
  645. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.UsageSummary.beam +0 -0
  646. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.OperatorControlCenter.UsageSummaryPresenter.beam +0 -0
  647. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.Presenter.beam +0 -0
  648. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.Router.Helpers.beam +0 -0
  649. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.Router.beam +0 -0
  650. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.StaticAssets.beam +0 -0
  651. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.StreamdeckChannel.beam +0 -0
  652. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.StreamdeckLive.beam +0 -0
  653. package/release/lib/aiur-0.0.5/ebin/Elixir.AiurWeb.StreamdeckStrip.beam +0 -0
  654. package/release/lib/aiur-0.0.5/ebin/aiur.app +0 -1006
  655. package/release/lib/aiur-0.0.5/priv/build_gate.bash +0 -1874
  656. package/release/lib/aiur-0.0.5/priv/build_gate_command_wrapper.bash +0 -214
  657. package/release/lib/aiur-0.0.5/priv/github_budget.py +0 -898
  658. package/release/lib/aiur-0.0.5/priv/github_quota_guard.sh +0 -3233
  659. package/release/lib/aiur-0.0.5/priv/static/dashboard.css +0 -10159
  660. package/release/releases/0.0.5/aiur.rel +0 -49
  661. package/release/releases/0.0.5/start.boot +0 -0
  662. package/release/releases/0.0.5/start.script +0 -4660
  663. package/release/releases/0.0.5/start_clean.boot +0 -0
  664. package/release/releases/0.0.5/start_clean.script +0 -4617
  665. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AffectedTests.beam +0 -0
  666. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentConfig.beam +0 -0
  667. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentDirectory.beam +0 -0
  668. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentEventFeed.beam +0 -0
  669. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentEventLog.beam +0 -0
  670. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.Activation.beam +0 -0
  671. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.ActivityIntake.beam +0 -0
  672. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.App.beam +0 -0
  673. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.Controls.beam +0 -0
  674. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.EventIntake.beam +0 -0
  675. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.Input.beam +0 -0
  676. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.PerfIntake.beam +0 -0
  677. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.RcPaneBorders.beam +0 -0
  678. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.RenderState.beam +0 -0
  679. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.Renderer.Cells.beam +0 -0
  680. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.Renderer.EventLine.beam +0 -0
  681. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.Renderer.EventPhrases.beam +0 -0
  682. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.Renderer.EventsBlock.beam +0 -0
  683. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.Renderer.Help.beam +0 -0
  684. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.Renderer.Links.beam +0 -0
  685. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.Renderer.Markers.beam +0 -0
  686. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.Renderer.Model.beam +0 -0
  687. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.Renderer.Style.beam +0 -0
  688. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.Renderer.Text.beam +0 -0
  689. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.Renderer.beam +0 -0
  690. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.Roster.beam +0 -0
  691. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.Selection.beam +0 -0
  692. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.State.beam +0 -0
  693. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.Summaries.beam +0 -0
  694. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentList.WarmthIntake.beam +0 -0
  695. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentLog.beam +0 -0
  696. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentProcessLog.beam +0 -0
  697. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentPubSub.beam +0 -0
  698. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentQueue.beam +0 -0
  699. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentResourceGuard.beam +0 -0
  700. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentRunner.BootstrapDigest.beam +0 -0
  701. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentRunner.CodexUpdateRelay.beam +0 -0
  702. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentRunner.EventsDigest.beam +0 -0
  703. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentRunner.SessionResume.beam +0 -0
  704. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentRunner.TurnStreams.beam +0 -0
  705. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AgentScratch.beam +0 -0
  706. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AlertFeed.Backfill.beam +0 -0
  707. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AlertLedger.Tail.beam +0 -0
  708. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AlertTopic.beam +0 -0
  709. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AnalyticsCLI.beam +0 -0
  710. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AppServer.InterruptHandshake.beam +0 -0
  711. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AppServer.Interrupts.beam +0 -0
  712. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AppServer.OperatorDelivery.beam +0 -0
  713. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AppServer.ProviderTurnLedger.beam +0 -0
  714. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AppServer.Rpc.SensitiveResponses.beam +0 -0
  715. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AppServer.ToolCallIdentity.beam +0 -0
  716. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AppServer.ToolCallLedger.Storage.beam +0 -0
  717. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AppServer.ToolCallLedger.beam +0 -0
  718. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AppServer.ToolResultSpill.beam +0 -0
  719. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AppServer.TurnState.beam +0 -0
  720. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Asks.Store.beam +0 -0
  721. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Asks.beam +0 -0
  722. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.AsksCLI.beam +0 -0
  723. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Boot.beam +0 -0
  724. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildGate.beam +0 -0
  725. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildGateHoldMonitor.State.beam +0 -0
  726. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildGateHoldMonitor.beam +0 -0
  727. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.Activity.beam +0 -0
  728. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.AdHocSource.Snapshot.beam +0 -0
  729. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.AdHocSource.beam +0 -0
  730. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.Catalog.beam +0 -0
  731. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.DependencyChain.beam +0 -0
  732. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.Diagnostic.beam +0 -0
  733. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.EdgeState.beam +0 -0
  734. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.GitHubGraph.Connection.beam +0 -0
  735. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.GitHubGraph.Dependencies.beam +0 -0
  736. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.GitHubGraph.Endpoint.beam +0 -0
  737. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.GitHubGraph.Normalizer.beam +0 -0
  738. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.GitHubGraph.Pager.beam +0 -0
  739. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.GitHubGraph.Request.beam +0 -0
  740. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.GitHubGraph.Result.beam +0 -0
  741. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.GitHubGraph.Settings.Paging.beam +0 -0
  742. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.GitHubGraph.Settings.beam +0 -0
  743. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.GitHubGraph.beam +0 -0
  744. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.Graph.beam +0 -0
  745. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.GraphAnalysis.beam +0 -0
  746. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.GraphProjection.Failure.beam +0 -0
  747. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.GraphProjection.TaskLifecycle.beam +0 -0
  748. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.Icon.beam +0 -0
  749. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.Lifecycle.beam +0 -0
  750. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.Marker.beam +0 -0
  751. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.Metadata.beam +0 -0
  752. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.PackPaths.beam +0 -0
  753. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.PackStatus.beam +0 -0
  754. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.ProviderHealth.beam +0 -0
  755. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.ProviderResult.beam +0 -0
  756. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.Readiness.beam +0 -0
  757. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.RootSummary.beam +0 -0
  758. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.SelectedRoot.beam +0 -0
  759. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketDetail.DestinationNormalizer.beam +0 -0
  760. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketDetail.Destinations.beam +0 -0
  761. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketDetail.Failure.beam +0 -0
  762. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketDetail.IssueDestination.beam +0 -0
  763. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketDetail.Normalizer.beam +0 -0
  764. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketDetail.PullRequestDestination.beam +0 -0
  765. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketDetail.Sanitizer.beam +0 -0
  766. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketDetail.Snapshot.beam +0 -0
  767. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketDetail.State.beam +0 -0
  768. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketDetail.beam +0 -0
  769. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketDetailCoordinator.Configuration.beam +0 -0
  770. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketDetailCoordinator.Options.beam +0 -0
  771. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketDetailCoordinator.Policy.beam +0 -0
  772. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketDetailCoordinator.TaskLifecycle.beam +0 -0
  773. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketDetailCoordinator.beam +0 -0
  774. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketHistory.Entry.beam +0 -0
  775. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketHistory.Failure.beam +0 -0
  776. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketHistory.Normalizer.beam +0 -0
  777. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketHistory.Snapshot.beam +0 -0
  778. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketHistoryProvider.Options.beam +0 -0
  779. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.BuildOrder.TicketHistoryProvider.beam +0 -0
  780. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.AccountGeneration.Context.beam +0 -0
  781. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.AccountGeneration.beam +0 -0
  782. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.AccountMeters.beam +0 -0
  783. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.Config.beam +0 -0
  784. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.DisplayTailer.beam +0 -0
  785. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.EventHumanizer.beam +0 -0
  786. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.HookEvents.beam +0 -0
  787. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.HookSettings.beam +0 -0
  788. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.RateLimitAdapter.beam +0 -0
  789. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.RemoteControl.beam +0 -0
  790. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.Repl.Command.beam +0 -0
  791. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.Repl.HookTurn.beam +0 -0
  792. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.Repl.OperatorInject.beam +0 -0
  793. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.Repl.PromptSubmit.beam +0 -0
  794. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.Repl.RcAttach.beam +0 -0
  795. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.Repl.TranscriptTurn.beam +0 -0
  796. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.Repl.TurnEvents.beam +0 -0
  797. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.ReplAgent.beam +0 -0
  798. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.Telemetry.Contract.beam +0 -0
  799. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.Telemetry.Event.beam +0 -0
  800. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.Telemetry.Receiver.beam +0 -0
  801. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.Telemetry.UsageAdapter.Relationship.beam +0 -0
  802. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.Telemetry.UsageAdapter.Validation.beam +0 -0
  803. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.Telemetry.UsageAdapter.beam +0 -0
  804. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.Transcript.beam +0 -0
  805. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Claude.TranscriptTailer.beam +0 -0
  806. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codeowners.Edit.beam +0 -0
  807. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codeowners.beam +0 -0
  808. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.AccountGeneration.Context.beam +0 -0
  809. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.AppServerPort.beam +0 -0
  810. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.Approvals.beam +0 -0
  811. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.Config.beam +0 -0
  812. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.DynamicTool.Args.beam +0 -0
  813. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.DynamicTool.Blockers.beam +0 -0
  814. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.DynamicTool.EmitAlert.beam +0 -0
  815. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.DynamicTool.Handler.beam +0 -0
  816. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.DynamicTool.LinearGraphQL.beam +0 -0
  817. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.DynamicTool.Response.beam +0 -0
  818. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.DynamicTool.ReviewThreads.beam +0 -0
  819. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.DynamicTool.Subscriptions.beam +0 -0
  820. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.EventHumanizer.beam +0 -0
  821. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.EventNormalizer.beam +0 -0
  822. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.Frames.beam +0 -0
  823. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.Handshake.beam +0 -0
  824. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.Interrupts.beam +0 -0
  825. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.OperatorDelivery.beam +0 -0
  826. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.RateLimitAdapter.beam +0 -0
  827. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.RateLimits.beam +0 -0
  828. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.Rpc.beam +0 -0
  829. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.SessionLifecycle.beam +0 -0
  830. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.SessionRecovery.beam +0 -0
  831. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.Transcript.beam +0 -0
  832. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.TurnEvents.beam +0 -0
  833. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Codex.UserInputAnswers.beam +0 -0
  834. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CodingAgent.Backend.beam +0 -0
  835. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CodingAgent.RouteCredentials.beam +0 -0
  836. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CodingAgent.RouteFailure.beam +0 -0
  837. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CommandsCLI.beam +0 -0
  838. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.CodexSandboxPolicy.beam +0 -0
  839. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.EnvRef.beam +0 -0
  840. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.RoutingValue.beam +0 -0
  841. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.AgentValidation.beam +0 -0
  842. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.Alerts.beam +0 -0
  843. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.Attrs.beam +0 -0
  844. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.Decisions.beam +0 -0
  845. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.ElevenLabs.beam +0 -0
  846. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.EnvResolver.beam +0 -0
  847. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.Errors.beam +0 -0
  848. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.Events.beam +0 -0
  849. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.GithubApp.beam +0 -0
  850. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.GithubCredential.beam +0 -0
  851. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.Hooks.beam +0 -0
  852. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.Observability.beam +0 -0
  853. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.Opencode.beam +0 -0
  854. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.Polling.beam +0 -0
  855. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.PrHealth.beam +0 -0
  856. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.PrWatch.beam +0 -0
  857. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.Prewarm.beam +0 -0
  858. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.PricingPolicy.beam +0 -0
  859. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.Server.beam +0 -0
  860. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.StringOrMap.beam +0 -0
  861. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.Upgrade.beam +0 -0
  862. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.Webhooks.beam +0 -0
  863. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.Worker.beam +0 -0
  864. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Config.Schema.Workspace.beam +0 -0
  865. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Conversations.beam +0 -0
  866. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CoordinationTasks.beam +0 -0
  867. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunMembership.Event.Codec.beam +0 -0
  868. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunMembership.Event.beam +0 -0
  869. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunMembership.Projection.Member.beam +0 -0
  870. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunMembership.Projection.beam +0 -0
  871. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunMembership.Reconciler.beam +0 -0
  872. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunMembership.Store.Checkpoint.beam +0 -0
  873. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunMembership.Store.FileOps.beam +0 -0
  874. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunMembership.Store.Marker.beam +0 -0
  875. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunMembership.Store.Paths.beam +0 -0
  876. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunMembership.Store.Recovery.beam +0 -0
  877. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunMembership.Store.Runtime.beam +0 -0
  878. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunMembership.Store.TerminalVerification.beam +0 -0
  879. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunMembership.Store.beam +0 -0
  880. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunMembership.beam +0 -0
  881. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunOutcomeSnapshot.MembershipIndex.beam +0 -0
  882. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunOutcomeSnapshot.Outcomes.beam +0 -0
  883. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunOutcomeSnapshot.Projection.beam +0 -0
  884. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunOutcomeSnapshot.SourceState.beam +0 -0
  885. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunOutcomeSnapshot.beam +0 -0
  886. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunProjection.Value.beam +0 -0
  887. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunProjections.Checkpoint.beam +0 -0
  888. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunProjections.CheckpointPersistence.beam +0 -0
  889. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunProjections.Finalizer.beam +0 -0
  890. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunProjections.MembershipCache.beam +0 -0
  891. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunProjections.Projector.beam +0 -0
  892. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunProjections.Refresh.beam +0 -0
  893. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunProjections.SourceAdapter.beam +0 -0
  894. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunProjections.SourceCollector.beam +0 -0
  895. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunProjections.SourceFallback.beam +0 -0
  896. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunProjections.State.beam +0 -0
  897. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunProjections.UnitsBuilder.beam +0 -0
  898. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunProjections.WeightFacts.beam +0 -0
  899. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunProjections.beam +0 -0
  900. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunSummary.Facts.beam +0 -0
  901. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunSummary.Progress.beam +0 -0
  902. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunSummary.Projection.beam +0 -0
  903. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunSummary.Status.beam +0 -0
  904. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.CurrentRunSummary.beam +0 -0
  905. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DaemonLifecycle.beam +0 -0
  906. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionAnswer.beam +0 -0
  907. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionApi.LegacyPagination.beam +0 -0
  908. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionApi.PublicProjection.beam +0 -0
  909. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionApi.beam +0 -0
  910. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionArtifact.beam +0 -0
  911. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionAttention.beam +0 -0
  912. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionAuthority.beam +0 -0
  913. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionCommandType.beam +0 -0
  914. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionDelegation.beam +0 -0
  915. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionDispatchTasks.Owner.beam +0 -0
  916. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionDispatchTasks.Queue.beam +0 -0
  917. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionDispatchTasks.Saturation.beam +0 -0
  918. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionDispatchTasks.Worker.beam +0 -0
  919. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionDispatchTasks.beam +0 -0
  920. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionEnrichment.beam +0 -0
  921. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionEvent.Unrecognized.beam +0 -0
  922. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionExpiry.beam +0 -0
  923. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionLog.beam +0 -0
  924. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionMetrics.Bootstrap.beam +0 -0
  925. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionMetrics.Canonical.beam +0 -0
  926. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionMetrics.Collector.beam +0 -0
  927. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionMetrics.Event.Fields.beam +0 -0
  928. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionMetrics.Event.beam +0 -0
  929. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionMetrics.Log.beam +0 -0
  930. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionMetrics.Options.beam +0 -0
  931. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionMetrics.Sample.beam +0 -0
  932. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionMetrics.Window.beam +0 -0
  933. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionMetrics.Writer.Persistence.beam +0 -0
  934. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionMetrics.Writer.beam +0 -0
  935. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionMetrics.beam +0 -0
  936. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionProvenance.beam +0 -0
  937. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionQuery.Cursor.beam +0 -0
  938. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionQuery.Params.beam +0 -0
  939. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionQuery.StoreReader.beam +0 -0
  940. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionQuery.beam +0 -0
  941. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionRevision.beam +0 -0
  942. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionRevisionDispatch.beam +0 -0
  943. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionStore.RetainedIndex.beam +0 -0
  944. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionStore.RetainedSnapshot.LegacyPage.beam +0 -0
  945. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionStore.RetainedSnapshot.Query.beam +0 -0
  946. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionStore.RetainedSnapshot.QueryPlan.beam +0 -0
  947. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionStore.RetainedSnapshot.beam +0 -0
  948. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DecisionValidation.beam +0 -0
  949. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.DispatchBudgetStore.beam +0 -0
  950. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Distribution.beam +0 -0
  951. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ElevenLabs.Quota.beam +0 -0
  952. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ElevenLabs.Realtime.MintSocket.beam +0 -0
  953. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ElevenLabs.Realtime.MintTransport.beam +0 -0
  954. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ElevenLabs.Realtime.Transport.beam +0 -0
  955. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ElevenLabs.Realtime.beam +0 -0
  956. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ElevenLabs.TTS.beam +0 -0
  957. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Env.Types.beam +0 -0
  958. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.EventHumanizer.beam +0 -0
  959. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.EventHumanizerHelpers.beam +0 -0
  960. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Events.AgentSubscriptionPolicy.beam +0 -0
  961. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Events.BranchRefStore.beam +0 -0
  962. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Events.CommentFilter.beam +0 -0
  963. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Events.DebugLog.beam +0 -0
  964. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Events.Exchange.beam +0 -0
  965. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Events.GithubCIPoller.beam +0 -0
  966. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Events.GithubFirehose.beam +0 -0
  967. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Events.GithubWebhook.ThreadResolver.beam +0 -0
  968. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Events.LsRemoteTicker.beam +0 -0
  969. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Events.SubscriptionStoreSupervisor.beam +0 -0
  970. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Events.Topic.beam +0 -0
  971. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Events.UniversalSubscriptions.beam +0 -0
  972. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Executor.Handoff.beam +0 -0
  973. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Executor.Roster.beam +0 -0
  974. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Executor.StatePaths.beam +0 -0
  975. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Executor.TakeoverAlert.Monitor.beam +0 -0
  976. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Executor.TakeoverAlert.Snapshot.beam +0 -0
  977. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Executor.TakeoverAlert.Store.beam +0 -0
  978. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Executor.TakeoverAlert.beam +0 -0
  979. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ExecutorBindings.beam +0 -0
  980. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ExecutorCommandAttention.beam +0 -0
  981. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ExecutorEvents.beam +0 -0
  982. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ExecutorListener.beam +0 -0
  983. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ExecutorWakeProjection.beam +0 -0
  984. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ExternalContent.beam +0 -0
  985. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Findings.beam +0 -0
  986. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.FindingsCLI.beam +0 -0
  987. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Fs.beam +0 -0
  988. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Git.beam +0 -0
  989. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.AgentCache.beam +0 -0
  990. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.AgentCacheBridge.beam +0 -0
  991. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.AppCredentials.beam +0 -0
  992. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.AppToken.beam +0 -0
  993. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.AppTokenRefresher.beam +0 -0
  994. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.BotIdentity.beam +0 -0
  995. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.CIPollBatch.beam +0 -0
  996. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.CodeOwners.beam +0 -0
  997. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.Connectivity.beam +0 -0
  998. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.CredentialHeadroom.beam +0 -0
  999. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.CredentialRegistry.beam +0 -0
  1000. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.CredentialUsage.beam +0 -0
  1001. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.CycleFetchCache.beam +0 -0
  1002. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.DeliveredPullRequest.beam +0 -0
  1003. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.EndpointPolicy.beam +0 -0
  1004. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.Errors.beam +0 -0
  1005. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.GraphQLCost.beam +0 -0
  1006. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.GraphQLErrors.beam +0 -0
  1007. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.HostCommand.beam +0 -0
  1008. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.HumanReviewGate.beam +0 -0
  1009. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.IssueDependencies.beam +0 -0
  1010. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.IssueRelationships.beam +0 -0
  1011. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.IssueState.beam +0 -0
  1012. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.MergeQueue.beam +0 -0
  1013. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.PollSnapshots.beam +0 -0
  1014. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.Quota.beam +0 -0
  1015. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.ReadCache.Identity.beam +0 -0
  1016. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.RepoEvents.beam +0 -0
  1017. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.RequestLog.beam +0 -0
  1018. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.RequestOrigin.beam +0 -0
  1019. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.ResourceFetch.beam +0 -0
  1020. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.ReviewThreads.Reply.beam +0 -0
  1021. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.ReviewThreads.Resolution.beam +0 -0
  1022. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.ReviewThreads.ResolutionPolicy.beam +0 -0
  1023. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.ReviewThreads.beam +0 -0
  1024. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.StatePolicy.beam +0 -0
  1025. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.Teams.beam +0 -0
  1026. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.Transport.beam +0 -0
  1027. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.ViewStateDemand.beam +0 -0
  1028. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHub.ViewStateSweep.beam +0 -0
  1029. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.GitHubUsageCLI.beam +0 -0
  1030. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.HttpServer.beam +0 -0
  1031. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Init.Alerts.beam +0 -0
  1032. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Init.Codeowners.beam +0 -0
  1033. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Init.Dotenv.beam +0 -0
  1034. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Init.ElevenLabs.beam +0 -0
  1035. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Init.Format.beam +0 -0
  1036. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Init.Prewarm.Failure.beam +0 -0
  1037. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Init.Prewarm.beam +0 -0
  1038. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Init.Prompt.beam +0 -0
  1039. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Init.Resume.beam +0 -0
  1040. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Init.Scaffold.beam +0 -0
  1041. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Issue.beam +0 -0
  1042. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.IssueContext.beam +0 -0
  1043. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.JSONSafe.beam +0 -0
  1044. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.JsonStore.beam +0 -0
  1045. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Jsonl.beam +0 -0
  1046. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Linear.Client.beam +0 -0
  1047. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Linear.Config.beam +0 -0
  1048. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.LiveConversation.Compactor.beam +0 -0
  1049. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.LiveConversation.Normalizer.beam +0 -0
  1050. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.LiveConversation.Retention.beam +0 -0
  1051. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.LiveConversation.Source.beam +0 -0
  1052. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.LiveConversation.beam +0 -0
  1053. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.LogFile.beam +0 -0
  1054. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Logs.Retention.beam +0 -0
  1055. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Memory.Config.beam +0 -0
  1056. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Metrics.beam +0 -0
  1057. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ModelDiscovery.Source.Anthropic.beam +0 -0
  1058. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ModelDiscovery.Source.OpenAI.beam +0 -0
  1059. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ModelDiscovery.Source.OpenRouter.beam +0 -0
  1060. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ModelDiscovery.Source.beam +0 -0
  1061. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpaqueIdentifier.beam +0 -0
  1062. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.AccountGeneration.beam +0 -0
  1063. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.BalanceBaseline.beam +0 -0
  1064. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.BoundedGlob.beam +0 -0
  1065. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.Checkpoint.beam +0 -0
  1066. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.CodingAgent.beam +0 -0
  1067. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.Concurrency.beam +0 -0
  1068. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.Config.beam +0 -0
  1069. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.Conversation.beam +0 -0
  1070. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.MeterAdapter.beam +0 -0
  1071. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.MeterWindows.beam +0 -0
  1072. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.Registry.beam +0 -0
  1073. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.Session.beam +0 -0
  1074. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.ToolCallParser.beam +0 -0
  1075. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.ToolSpec.beam +0 -0
  1076. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.Tools.beam +0 -0
  1077. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.Transcript.beam +0 -0
  1078. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.Transport.beam +0 -0
  1079. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenAICompat.WorkspacePath.beam +0 -0
  1080. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenTicketSource.Snapshot.beam +0 -0
  1081. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpenTicketSource.beam +0 -0
  1082. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.ActiveTurns.beam +0 -0
  1083. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.ApiClient.beam +0 -0
  1084. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.AttachPool.beam +0 -0
  1085. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.Bridge.beam +0 -0
  1086. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.BridgePort.beam +0 -0
  1087. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.BridgeSupervisor.beam +0 -0
  1088. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.ChatCompletions.Caller.beam +0 -0
  1089. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.ChatCompletions.Replay.beam +0 -0
  1090. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.ChatCompletions.Sse.beam +0 -0
  1091. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.ChatCompletions.StreamPolicy.beam +0 -0
  1092. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.Config.beam +0 -0
  1093. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.Db.beam +0 -0
  1094. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.EventConsumer.beam +0 -0
  1095. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.EventRow.beam +0 -0
  1096. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.HiddenWindow.beam +0 -0
  1097. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.OperatorText.beam +0 -0
  1098. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.PaneSupervisor.beam +0 -0
  1099. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.PrewarmSupervisor.beam +0 -0
  1100. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.Protocol.beam +0 -0
  1101. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.Server.beam +0 -0
  1102. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.SessionGC.beam +0 -0
  1103. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.SessionSupervisor.beam +0 -0
  1104. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.SessionWriter.beam +0 -0
  1105. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.SessionWriterRegistry.beam +0 -0
  1106. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.Slot.AttachPane.beam +0 -0
  1107. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.Slot.Events.beam +0 -0
  1108. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.Slot.Sessions.beam +0 -0
  1109. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.Slot.State.beam +0 -0
  1110. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.Slot.beam +0 -0
  1111. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.SlotPolicy.beam +0 -0
  1112. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.SlotRegistry.beam +0 -0
  1113. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.SlotSupervisor.beam +0 -0
  1114. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.Style.beam +0 -0
  1115. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.TokenRegistry.beam +0 -0
  1116. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.TurnMarkers.beam +0 -0
  1117. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Opencode.WarmthReport.beam +0 -0
  1118. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OpencodeTheme.beam +0 -0
  1119. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.OperatorWaitLog.beam +0 -0
  1120. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.AgentTeardown.beam +0 -0
  1121. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.AutoResume.beam +0 -0
  1122. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.CommandScan.beam +0 -0
  1123. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.ControlLifecycle.beam +0 -0
  1124. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.DigestCoalescer.beam +0 -0
  1125. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.GithubBudgetPause.beam +0 -0
  1126. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.GlobalPause.beam +0 -0
  1127. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.GlobalPauseStore.beam +0 -0
  1128. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.HumanReview.beam +0 -0
  1129. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.Interrupts.beam +0 -0
  1130. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.MembershipLifecycle.beam +0 -0
  1131. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.MergedTicketReconciler.beam +0 -0
  1132. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.OperatorMessages.Capabilities.beam +0 -0
  1133. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.PRHealthScanner.beam +0 -0
  1134. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.PrAnchored.beam +0 -0
  1135. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.PriorityControl.beam +0 -0
  1136. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.PushRouting.beam +0 -0
  1137. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.Reconciler.beam +0 -0
  1138. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.RemoteControlMode.beam +0 -0
  1139. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.ReviewFreshness.beam +0 -0
  1140. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.ReworkRequeue.beam +0 -0
  1141. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.RuntimeWatchdog.beam +0 -0
  1142. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.Slots.beam +0 -0
  1143. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.SnapshotPublisher.beam +0 -0
  1144. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.SnapshotStore.beam +0 -0
  1145. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.StartupClaimReconciler.BootMarker.beam +0 -0
  1146. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.StartupClaimReconciler.beam +0 -0
  1147. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Orchestrator.TrackedSet.beam +0 -0
  1148. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Os.beam +0 -0
  1149. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.PaneManager.Anchor.beam +0 -0
  1150. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.PaneManager.Close.beam +0 -0
  1151. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.PaneManager.ConvoPaint.beam +0 -0
  1152. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.PaneManager.GenericOpen.beam +0 -0
  1153. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.PaneManager.Layout.beam +0 -0
  1154. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.PaneManager.OpenQueue.beam +0 -0
  1155. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.PaneManager.OpencodeOpen.beam +0 -0
  1156. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.PaneManager.Placeholder.beam +0 -0
  1157. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.PaneManager.Reconcile.beam +0 -0
  1158. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.PaneManager.ScreenGrab.beam +0 -0
  1159. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.PaneManager.SlotAttach.beam +0 -0
  1160. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.PaneManager.State.beam +0 -0
  1161. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.PaneManager.beam +0 -0
  1162. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.PathSafety.beam +0 -0
  1163. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.PauseContainment.beam +0 -0
  1164. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Perf.beam +0 -0
  1165. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.PeriodicWorker.beam +0 -0
  1166. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.PollCadence.beam +0 -0
  1167. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Prewarm.Detect.beam +0 -0
  1168. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProcessIdentity.beam +0 -0
  1169. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProcessReaper.beam +0 -0
  1170. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProgressCheckin.Worker.beam +0 -0
  1171. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProgressRetention.beam +0 -0
  1172. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProgressTracker.beam +0 -0
  1173. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Protocol.MapAccess.beam +0 -0
  1174. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderAccountGeneration.Context.beam +0 -0
  1175. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderAccountGeneration.Continuity.beam +0 -0
  1176. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderAccountGeneration.Events.beam +0 -0
  1177. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderAccountGeneration.Lifecycle.beam +0 -0
  1178. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderAccountGeneration.Monitor.beam +0 -0
  1179. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderAccountGeneration.Owner.beam +0 -0
  1180. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderAccountGeneration.Registry.beam +0 -0
  1181. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderAccountGeneration.Snapshot.beam +0 -0
  1182. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderAccountGeneration.State.beam +0 -0
  1183. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderAccountGeneration.Tombstones.beam +0 -0
  1184. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderAccountGeneration.Validation.beam +0 -0
  1185. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderAccountGeneration.beam +0 -0
  1186. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderMeterRefresh.beam +0 -0
  1187. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderMeters.Events.beam +0 -0
  1188. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderMeters.ProbeCrash.beam +0 -0
  1189. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderMeters.Reconciler.beam +0 -0
  1190. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderMeters.Store.beam +0 -0
  1191. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.ProviderMeters.beam +0 -0
  1192. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.RecentMergeStore.beam +0 -0
  1193. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.RepoBase.beam +0 -0
  1194. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.RunTelemetry.Dashboard.beam +0 -0
  1195. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.RunTelemetry.GitHubEnricher.beam +0 -0
  1196. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.RunTelemetry.Retention.beam +0 -0
  1197. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.RunTelemetry.Sampler.beam +0 -0
  1198. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.RunTelemetry.Summaries.beam +0 -0
  1199. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.RunTelemetry.Supervisor.beam +0 -0
  1200. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.RunTelemetry.Timeline.beam +0 -0
  1201. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.RunTelemetry.beam +0 -0
  1202. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.SSH.beam +0 -0
  1203. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Sandbox.EventFlowDemo.beam +0 -0
  1204. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Sandbox.EventFlowUnrelated1.beam +0 -0
  1205. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Sandbox.EventFlowUnrelated2.beam +0 -0
  1206. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Sandbox.EventFlowUnrelated3.beam +0 -0
  1207. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.SaturationSentinel.State.beam +0 -0
  1208. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.SaturationSentinel.beam +0 -0
  1209. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.SecretRedactor.beam +0 -0
  1210. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Shell.beam +0 -0
  1211. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.SpecsCheck.beam +0 -0
  1212. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.SupervisionHealth.Formatter.beam +0 -0
  1213. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.SupervisionHealth.Tree.beam +0 -0
  1214. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.SupervisionHealth.beam +0 -0
  1215. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.SupervisorToken.beam +0 -0
  1216. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.SystemCpu.beam +0 -0
  1217. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.SystemFileDescriptors.beam +0 -0
  1218. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.SystemLoad.beam +0 -0
  1219. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.SystemMemory.beam +0 -0
  1220. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.TicketActivity.Projection.beam +0 -0
  1221. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.TicketActivity.Reducer.beam +0 -0
  1222. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.TicketActivity.beam +0 -0
  1223. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.TicketBranch.beam +0 -0
  1224. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.TicketObservation.beam +0 -0
  1225. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Tmux.Exec.beam +0 -0
  1226. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Tmux.Input.beam +0 -0
  1227. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Tmux.Layout.beam +0 -0
  1228. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Tmux.MockTransport.beam +0 -0
  1229. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Tmux.Protocol.beam +0 -0
  1230. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Tmux.Query.beam +0 -0
  1231. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Tmux.Style.beam +0 -0
  1232. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Tmux.beam +0 -0
  1233. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.TokenUsage.beam +0 -0
  1234. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.TrackerConfig.beam +0 -0
  1235. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.TrackerIdentity.beam +0 -0
  1236. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UnitsCLI.beam +0 -0
  1237. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Upgrade.Notice.beam +0 -0
  1238. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Upgrade.Registry.Transport.Req.beam +0 -0
  1239. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Upgrade.Registry.Transport.beam +0 -0
  1240. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Upgrade.Registry.beam +0 -0
  1241. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Upgrade.State.beam +0 -0
  1242. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Upgrade.Version.beam +0 -0
  1243. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Upgrade.beam +0 -0
  1244. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.GroupedScopes.PriceAdapter.beam +0 -0
  1245. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.GroupedScopes.Scope.beam +0 -0
  1246. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.GroupedScopes.beam +0 -0
  1247. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Headless.Adapter.beam +0 -0
  1248. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Headless.Catalog.beam +0 -0
  1249. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Headless.Claude.RequestUsage.beam +0 -0
  1250. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Headless.Codex.ThreadUsage.beam +0 -0
  1251. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Headless.Codex.Tokens.beam +0 -0
  1252. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Headless.Codex.TurnUsage.beam +0 -0
  1253. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Headless.Compatibility.beam +0 -0
  1254. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Headless.Context.beam +0 -0
  1255. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Headless.DeepSeek.RequestUsage.beam +0 -0
  1256. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Headless.Emitter.beam +0 -0
  1257. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Headless.Kimi.RequestUsage.beam +0 -0
  1258. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Headless.Normalizer.beam +0 -0
  1259. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Headless.OpenAICompat.RequestUsage.beam +0 -0
  1260. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Headless.OpenRouter.RequestUsage.beam +0 -0
  1261. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.PriceTable.Data.beam +0 -0
  1262. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.PriceTable.ProviderDimensions.beam +0 -0
  1263. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.PriceTable.Window.beam +0 -0
  1264. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.PriceTable.beam +0 -0
  1265. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Pricing.Components.beam +0 -0
  1266. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Pricing.Dimensions.beam +0 -0
  1267. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Pricing.Result.beam +0 -0
  1268. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Usage.Pricing.beam +0 -0
  1269. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageAggregate.Checkpoint.beam +0 -0
  1270. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageAggregate.Paths.beam +0 -0
  1271. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageAggregate.Projection.beam +0 -0
  1272. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageAggregate.Query.beam +0 -0
  1273. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageAggregate.Recovery.beam +0 -0
  1274. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageAggregate.Store.beam +0 -0
  1275. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageAggregate.beam +0 -0
  1276. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageCompaction.Block.beam +0 -0
  1277. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageCompaction.Coordinator.beam +0 -0
  1278. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageCompaction.Floor.beam +0 -0
  1279. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageCompaction.Manifest.beam +0 -0
  1280. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageCompaction.Paths.beam +0 -0
  1281. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageCompaction.Policy.beam +0 -0
  1282. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageEnvelope.Codec.beam +0 -0
  1283. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageEnvelope.ExactMoney.beam +0 -0
  1284. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageLedger.Checkpoint.beam +0 -0
  1285. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageLedger.CounterPolicy.beam +0 -0
  1286. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageLedger.Paths.beam +0 -0
  1287. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageLedger.Record.beam +0 -0
  1288. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageLedger.Recovery.beam +0 -0
  1289. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageLedger.RetiredFloor.beam +0 -0
  1290. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageLedger.Store.beam +0 -0
  1291. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.UsageLedger.beam +0 -0
  1292. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Webhooks.DeliveryLog.beam +0 -0
  1293. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Webhooks.DeliveryMode.beam +0 -0
  1294. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Webhooks.EventSource.Polling.beam +0 -0
  1295. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Webhooks.EventSource.Webhook.beam +0 -0
  1296. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Webhooks.EventSource.beam +0 -0
  1297. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Webhooks.Ingest.beam +0 -0
  1298. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Webhooks.IntervalPolicy.beam +0 -0
  1299. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Webhooks.LabelState.beam +0 -0
  1300. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Webhooks.ModePresenter.beam +0 -0
  1301. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Webhooks.beam +0 -0
  1302. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.WorkflowStore.Cache.beam +0 -0
  1303. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.WorkflowStore.State.beam +0 -0
  1304. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Workspace.BootstrapImage.beam +0 -0
  1305. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Workspace.Context.beam +0 -0
  1306. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Workspace.GitMetadata.beam +0 -0
  1307. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Workspace.Hooks.beam +0 -0
  1308. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Workspace.Ownership.Reconciler.beam +0 -0
  1309. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Workspace.Ownership.Waiter.beam +0 -0
  1310. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.Workspace.Remote.beam +0 -0
  1311. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Aiur.beam +0 -0
  1312. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrder.AnalyticsRuntime.beam +0 -0
  1313. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrder.AnalyticsScope.beam +0 -0
  1314. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrder.RouteState.beam +0 -0
  1315. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrder.Runtime.beam +0 -0
  1316. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrder.TicketContextAdapter.Relationship.beam +0 -0
  1317. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrder.TicketContextAdapter.View.beam +0 -0
  1318. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrder.TicketContextAdapter.beam +0 -0
  1319. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrder.TicketContextPresenter.Capability.beam +0 -0
  1320. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrder.TicketContextPresenter.LogEntry.beam +0 -0
  1321. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrder.TicketContextPresenter.View.beam +0 -0
  1322. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrder.TicketContextSelection.beam +0 -0
  1323. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrder.UsageRuntime.beam +0 -0
  1324. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrder.UsageScope.beam +0 -0
  1325. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrderViewModel.Capability.beam +0 -0
  1326. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrderViewModel.Edge.beam +0 -0
  1327. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrderViewModel.Group.beam +0 -0
  1328. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrderViewModel.Node.beam +0 -0
  1329. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrderViewModel.Relationships.beam +0 -0
  1330. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.BuildOrderViewModel.beam +0 -0
  1331. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.CommandsRedirectController.beam +0 -0
  1332. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.ControlCenterCache.beam +0 -0
  1333. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.ControlCenterPresenter.beam +0 -0
  1334. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.DecisionApiController.beam +0 -0
  1335. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.ErrorHTML.beam +0 -0
  1336. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.ErrorJSON.beam +0 -0
  1337. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.FinancialData.Cache.Pending.beam +0 -0
  1338. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.FinancialData.Cache.beam +0 -0
  1339. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.FinancialData.SubscriptionAuthority.beam +0 -0
  1340. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.FinancialData.Supervisor.beam +0 -0
  1341. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.FinancialData.beam +0 -0
  1342. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.FinancialDataAccess.Context.beam +0 -0
  1343. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.FinancialDataAccess.Generation.beam +0 -0
  1344. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.FinancialDataAccess.beam +0 -0
  1345. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.GithubWebhook.Auth.beam +0 -0
  1346. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.GithubWebhook.BodyReader.beam +0 -0
  1347. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.GithubWebhook.Signature.beam +0 -0
  1348. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.GithubWebhook.beam +0 -0
  1349. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.Layouts.beam +0 -0
  1350. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.Markdown.beam +0 -0
  1351. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.ObservabilityPubSub.beam +0 -0
  1352. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.Analytics.LatestRun.beam +0 -0
  1353. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.Analytics.Presenter.beam +0 -0
  1354. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.Analytics.ScopeResolver.beam +0 -0
  1355. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.AwaitingCommands.beam +0 -0
  1356. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderEpicIcon.beam +0 -0
  1357. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderIcon.beam +0 -0
  1358. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.BuildOrderUsage.beam +0 -0
  1359. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.CapacityControl.beam +0 -0
  1360. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.CapacityPresenter.beam +0 -0
  1361. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.ConversationDrawer.Presenter.beam +0 -0
  1362. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.CurrentRunOutcomesPresenter.beam +0 -0
  1363. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.DecisionCommands.beam +0 -0
  1364. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.DecisionEvents.beam +0 -0
  1365. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.DecisionPath.beam +0 -0
  1366. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.DecisionPresenter.beam +0 -0
  1367. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.DecisionProvider.beam +0 -0
  1368. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.FleetFilters.beam +0 -0
  1369. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.NavState.beam +0 -0
  1370. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.PayloadLoader.beam +0 -0
  1371. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.ProviderMeterSource.beam +0 -0
  1372. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.RevisionCommands.beam +0 -0
  1373. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.RowToken.beam +0 -0
  1374. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.RunSummary.beam +0 -0
  1375. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.RunSummaryPresenter.beam +0 -0
  1376. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.TicketSearch.beam +0 -0
  1377. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.TicketsPresenter.beam +0 -0
  1378. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.TimeFormat.beam +0 -0
  1379. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsControlPolicy.beam +0 -0
  1380. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsPolicy.beam +0 -0
  1381. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsPresenter.beam +0 -0
  1382. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsRow.Fields.beam +0 -0
  1383. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsRow.ResumeReason.beam +0 -0
  1384. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsRow.Sources.beam +0 -0
  1385. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsRow.URL.beam +0 -0
  1386. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsRow.Value.beam +0 -0
  1387. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsRow.beam +0 -0
  1388. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.OperatorControlCenter.UnitsURL.beam +0 -0
  1389. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.StaticAssetController.beam +0 -0
  1390. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.StreamDeckGrid.beam +0 -0
  1391. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.StreamdeckAuth.beam +0 -0
  1392. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.StreamdeckCommands.beam +0 -0
  1393. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.StreamdeckKeyFaceContract.beam +0 -0
  1394. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.StreamdeckLogs.beam +0 -0
  1395. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.StreamdeckProjection.beam +0 -0
  1396. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.StreamdeckSessionController.beam +0 -0
  1397. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.StreamdeckSocket.beam +0 -0
  1398. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.StreamdeckTranscriptRelay.beam +0 -0
  1399. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.SupervisorAuth.beam +0 -0
  1400. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.VoiceChannel.beam +0 -0
  1401. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.VoiceSessionLimiter.beam +0 -0
  1402. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.AiurWeb.VoiceSocket.beam +0 -0
  1403. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Jason.Encoder.Aiur.TicketObservation.beam +0 -0
  1404. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Jason.Encoder.Aiur.TrackerIdentity.beam +0 -0
  1405. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Mix.Tasks.Aiur.AffectedTests.beam +0 -0
  1406. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Mix.Tasks.Aiur.CostReport.beam +0 -0
  1407. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Mix.Tasks.Aiur.Env.Example.beam +0 -0
  1408. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Mix.Tasks.Aiur.PricingWindow.beam +0 -0
  1409. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Mix.Tasks.Aiur.Telemetry.Dashboard.beam +0 -0
  1410. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Mix.Tasks.Aiur.Test.Reset.beam +0 -0
  1411. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Mix.Tasks.Lint.beam +0 -0
  1412. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Mix.Tasks.PrBody.Check.beam +0 -0
  1413. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Mix.Tasks.Specs.Check.beam +0 -0
  1414. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/ebin/Elixir.Mix.Tasks.Workspace.BeforeRemove.beam +0 -0
  1415. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/build_gate_holder.py +0 -0
  1416. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/build_orders/README.md +0 -0
  1417. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/build_orders/aiur-build-order.json +0 -0
  1418. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/build_orders/analytics-optimizations.json +0 -0
  1419. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/build_orders/croptracker-demo.json +0 -0
  1420. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/github_push_guard.sh +0 -0
  1421. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/opencode_themes/aiur.json +0 -0
  1422. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/pidfd_reap.py +0 -0
  1423. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/aiur-dom-svg-layout/interaction-policy.js +0 -0
  1424. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/aiur-dom-svg-layout/interaction.js +0 -0
  1425. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/aiur-dom-svg-layout/lifecycle.js +0 -0
  1426. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/aiur-dom-svg-layout/measurement.js +0 -0
  1427. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/aiur-dom-svg-layout/protocol.js +0 -0
  1428. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/aiur-dom-svg-layout/renderer.js +0 -0
  1429. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/aiur-dom-svg-layout-adapter.js +0 -0
  1430. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/aiur-dom-svg-layout-loader.js +0 -0
  1431. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/aiur-logo.png +0 -0
  1432. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/build-order-grid-hook.js +0 -0
  1433. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/bungee.woff2 +0 -0
  1434. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/claude-symbol.svg +0 -0
  1435. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/claude-token.svg +0 -0
  1436. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/codex-color.svg +0 -0
  1437. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/codex-token.svg +0 -0
  1438. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/conversation-drawer-hook.js +0 -0
  1439. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/conversation-voice-controller.js +0 -0
  1440. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/deepseek-token.svg +0 -0
  1441. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/deepseek.svg +0 -0
  1442. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/elevenlabs-symbol.svg +0 -0
  1443. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/images/github-mark.svg +0 -0
  1444. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/kimi-token.svg +0 -0
  1445. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/kimi.svg +0 -0
  1446. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/openrouter-token.svg +0 -0
  1447. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/openrouter.svg +0 -0
  1448. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/sortable-table-hook.js +0 -0
  1449. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/streamdeck-emulator-hook.js +0 -0
  1450. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/ticket-context-dialog-hook.js +0 -0
  1451. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/time-brush-hook.js +0 -0
  1452. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/vendor/elk/0.11.1/LICENSE.md +0 -0
  1453. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/vendor/elk/0.11.1/PROVENANCE.md +0 -0
  1454. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/vendor/elk/0.11.1/SOURCE.md +0 -0
  1455. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/vendor/elk/0.11.1/aiur-layout-client.js +0 -0
  1456. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/vendor/elk/0.11.1/aiur-layout-worker.js +0 -0
  1457. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/vendor/elk/0.11.1/elk-worker.min.js +0 -0
  1458. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/vendor/elk/0.11.1/manifest.json +0 -0
  1459. /package/release/lib/{aiur-0.0.5 → aiur-0.0.7}/priv/static/voice-capture-worklet.js +0 -0
  1460. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.Bandit.HTTP2.Frame.Serializable.beam +0 -0
  1461. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.Bandit.HTTPTransport.beam +0 -0
  1462. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.Bandit.WebSocket.Frame.Serializable.beam +0 -0
  1463. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.Bandit.WebSocket.Socket.beam +0 -0
  1464. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.Collectable.beam +0 -0
  1465. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.DBConnection.Query.beam +0 -0
  1466. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.Ecto.Queryable.beam +0 -0
  1467. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.Enumerable.beam +0 -0
  1468. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.IEx.Info.beam +0 -0
  1469. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.Inspect.beam +0 -0
  1470. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.JSON.Encoder.beam +0 -0
  1471. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.Jason.Encoder.beam +0 -0
  1472. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.List.Chars.beam +0 -0
  1473. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.Phoenix.HTML.FormData.beam +0 -0
  1474. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.Phoenix.HTML.Safe.beam +0 -0
  1475. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.Phoenix.Param.beam +0 -0
  1476. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.Plug.Exception.beam +0 -0
  1477. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.Solid.Block.beam +0 -0
  1478. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.Solid.Matcher.beam +0 -0
  1479. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.Solid.Renderable.beam +0 -0
  1480. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.String.Chars.beam +0 -0
  1481. /package/release/releases/{0.0.5 → 0.0.7}/consolidated/Elixir.Ymlr.Encoder.beam +0 -0
  1482. /package/release/releases/{0.0.5 → 0.0.7}/elixir +0 -0
  1483. /package/release/releases/{0.0.5 → 0.0.7}/env.sh +0 -0
  1484. /package/release/releases/{0.0.5 → 0.0.7}/iex +0 -0
  1485. /package/release/releases/{0.0.5 → 0.0.7}/remote.vm.args +0 -0
  1486. /package/release/releases/{0.0.5 → 0.0.7}/sys.config +0 -0
  1487. /package/release/releases/{0.0.5 → 0.0.7}/vm.args +0 -0
@@ -0,0 +1,3403 @@
1
+ #!/bin/sh
2
+
3
+ # Fleet guard for agent-launched `gh` calls. The daemon prepends this wrapper's
4
+ # directory to agent PATH and supplies the real executable separately.
5
+ # #1793: a ticket filed without a dispatch disposition is undispatchable and
6
+ # invisible. The repo PreToolUse hook and the agent-suite tests invoke this
7
+ # wrapper in validate-only mode to check a `gh` issue command's disposition
8
+ # without requiring a real gh executable or touching any quota/budget state.
9
+ validate_only=0
10
+ if [ "${1:-}" = --validate-issue-command ]; then
11
+ validate_only=1
12
+ shift
13
+ fi
14
+
15
+ dispatch_prefix=${AIUR_GITHUB_LABEL_PREFIX:-agent}
16
+ direct_issue_api=0
17
+
18
+ real_gh=${AIUR_REAL_GH:-}
19
+ is_guard_gh() {
20
+ case "$1" in
21
+ "$HOME/.aiur/bin/gh"|"$HOME/.aiur/github-budget/bin/gh"|*/.aiur-runtime/bin/gh) return 0 ;;
22
+ *) return 1 ;;
23
+ esac
24
+ }
25
+ if [ -n "$real_gh" ] && is_guard_gh "$real_gh"; then real_gh=; fi
26
+ if [ -z "$real_gh" ]; then
27
+ guard_dir=$(CDPATH= cd "$(dirname "$0")" && pwd)
28
+ guard_path=${PATH:-}
29
+ guard_old_ifs=$IFS
30
+ IFS=:
31
+ for guard_entry in $guard_path; do
32
+ [ -n "$guard_entry" ] || guard_entry=.
33
+ [ "$guard_entry" = "$guard_dir" ] && continue
34
+ guard_candidate=$guard_entry/gh
35
+ is_guard_gh "$guard_candidate" && continue
36
+ if [ -x "$guard_candidate" ]; then real_gh=$guard_candidate; break; fi
37
+ done
38
+ IFS=$guard_old_ifs
39
+ unset guard_dir guard_path guard_old_ifs guard_entry guard_candidate
40
+ fi
41
+ if [ "$validate_only" -eq 0 ] && { [ -z "$real_gh" ] || [ ! -x "$real_gh" ]; }; then
42
+ printf '%s\n' 'aiur: real gh executable is unavailable' >&2
43
+ exit 127
44
+ fi
45
+
46
+ state_root=${AIUR_REPO_STATE_PATH:-}
47
+ quota_dir=
48
+ agent_quota_dir=${AIUR_AGENT_QUOTA_STATE_PATH:-}
49
+ events_file=
50
+ budget_root=${AIUR_GITHUB_BUDGET_ROOT:-"$HOME/.aiur/github-budget"}
51
+ budget_key=${AIUR_GITHUB_BUDGET_KEY:-}
52
+ budget_identity_key=${AIUR_GITHUB_BUDGET_IDENTITY_KEY:-}
53
+ budget_broker=${AIUR_GITHUB_BUDGET_BROKER:-"$(dirname "$0")/aiur-github-budget"}
54
+ budget_requested=${AIUR_GITHUB_BUDGET_ENABLED:-1}
55
+ budget_db=
56
+ budget_enabled=0
57
+ budget_required=0
58
+ budget_unavailable_reason=
59
+ budget_recovery="budget root $budget_root; repair ownership/permissions and redispatch (current runtimes derive this grant); stale runtimes must add $budget_root to agent.codex.turn_sandbox_policy.writableRoots"
60
+ budget_lease=
61
+ budget_renewal_pid=
62
+ budget_lease_ttl_ms=${AIUR_GITHUB_LEASE_TTL_MS:-35000}
63
+ budget_ignore_token_cooldown=0
64
+ # Seconds a failed identity derivation stays cached before the next admitted
65
+ # call retries it. Bounds an outage to one `gh api user` per credential per
66
+ # window instead of one per call (`budget_derive_identity`, #2353 review).
67
+ budget_identity_retry_ttl=300
68
+ budget_consumer=${AIUR_GITHUB_BUDGET_CONSUMER:-"executor:${PPID:-$$}"}
69
+ budget_consumer_key=
70
+ # Set when THIS wrapper resolved the credential key from a token rather than
71
+ # receiving `AIUR_GITHUB_BUDGET_KEY` from a caller. Only then does it derive the
72
+ # credential's stable identity — a caller that already picked the key has made
73
+ # the identity decision itself (#2353).
74
+ budget_key_derived=0
75
+
76
+ case "$budget_requested" in
77
+ 0|false|FALSE|no|NO|off|OFF) budget_required=0 ;;
78
+ *) [ -n "$budget_root" ] && budget_required=1 ;;
79
+ esac
80
+ unset budget_requested
81
+
82
+ # #2356: agents carry no GITHUB_TOKEN/GH_TOKEN (Aiur.AgentEnvironment scrubs
83
+ # them). The credential comes from the file the daemon wrote and is injected
84
+ # only into the real `gh` child of THIS governed call, never the agent env or
85
+ # this wrapper's other children. The env fallback keeps host/Executor working.
86
+ guard_token=
87
+ if [ -n "${AIUR_GITHUB_CREDENTIAL_FILE:-}" ] && [ -f "$AIUR_GITHUB_CREDENTIAL_FILE" ]; then
88
+ guard_token=$(sed -n '1p' "$AIUR_GITHUB_CREDENTIAL_FILE" 2>/dev/null || true)
89
+ fi
90
+ [ -n "$guard_token" ] || guard_token=${GH_TOKEN:-${GITHUB_TOKEN:-}}
91
+ run_gh() {
92
+ if [ -n "${guard_token:-}" ]; then GH_TOKEN="$guard_token" GITHUB_TOKEN= "$real_gh" "$@"
93
+ else GITHUB_TOKEN= GH_TOKEN= "$real_gh" "$@"; fi
94
+ }
95
+
96
+ fingerprint_value() {
97
+ if command -v shasum >/dev/null 2>&1; then
98
+ printf '%s' "$1" | shasum -a 256 2>/dev/null | awk '{print $1}'
99
+ elif command -v sha256sum >/dev/null 2>&1; then
100
+ printf '%s' "$1" | sha256sum 2>/dev/null | awk '{print $1}'
101
+ else
102
+ return 1
103
+ fi
104
+ }
105
+
106
+ # The broker's stable one-way identity for a credential, domain-separated
107
+ # exactly as `Aiur.GitHub.Budget.identity_key/1` computes it for a machine
108
+ # user: sha256 of `aiur-github-credential-v1<NUL>machine_user:primary:<login>`.
109
+ # `\000` is the clear spelling of a NUL byte for POSIX printf, which treats `\0`
110
+ # as the start of an octal escape — so `\0` and `\000` produce the identical NUL
111
+ # and the hashed input is byte-identical to the Elixir side's
112
+ # `aiur-github-credential-v1\0machine_user:primary:<login>` either way.
113
+ identity_fingerprint() {
114
+ if command -v shasum >/dev/null 2>&1; then
115
+ printf 'aiur-github-credential-v1\000machine_user:primary:%s' "$1" | shasum -a 256 2>/dev/null | awk '{print $1}'
116
+ elif command -v sha256sum >/dev/null 2>&1; then
117
+ printf 'aiur-github-credential-v1\000machine_user:primary:%s' "$1" | sha256sum 2>/dev/null | awk '{print $1}'
118
+ else
119
+ return 1
120
+ fi
121
+ }
122
+
123
+ # Derives the credential's stable identity key for a host (non-agent) run that
124
+ # resolved its own token. `gh api user` reports the login of whichever
125
+ # credential the wrapper resolved (the bot's GITHUB_TOKEN, or the operator's
126
+ # keyring account), so the binding matches the token's identity. The derivation
127
+ # costs one Core request per new credential and is cached by token key under
128
+ # the budget root, so subsequent host calls reuse it.
129
+ #
130
+ # The derivation runs only for a call that is about to be admitted against a
131
+ # metered pool. A local credential read (`auth token`, `config`) must not pay a
132
+ # GitHub network round trip just to learn its own identity — the boot gate that
133
+ # consults `Config.keyring_token/0` would otherwise block offline, and the
134
+ # derivation's own request is unadmitted (#2353 review). A failed derivation is
135
+ # cached for `budget_identity_retry_ttl` seconds so an outage is not re-paid per
136
+ # call; within the window the call degrades to no identity key — the raw token
137
+ # hash is recorded, exactly as today — never to a wrong identity.
138
+ budget_derive_identity() {
139
+ [ -n "$budget_key" ] || return 0
140
+ [ -z "$budget_identity_key" ] || return 0
141
+ [ "$budget_key_derived" -eq 1 ] || return 0
142
+ [ "$budget_enabled" -eq 1 ] || return 0
143
+ [ "$admission_required" -eq 1 ] || return 0
144
+ [ "$resource" != none ] || return 0
145
+
146
+ identity_cache="$budget_root/identity-$budget_key"
147
+ budget_cached=
148
+ if [ -f "$identity_cache" ]; then
149
+ budget_cached=$(sed -n '1p' "$identity_cache" 2>/dev/null || true)
150
+ fi
151
+
152
+ case "$budget_cached" in
153
+ "failed "*)
154
+ # A failed derivation is cached so an outage costs one `gh api user` per
155
+ # credential per window, not one per call. Once the window ages out, the
156
+ # next admitted call tries again, so a credential that was briefly
157
+ # offline still gets bound once GitHub is reachable.
158
+ budget_failed_at=${budget_cached#failed }
159
+ budget_now=$(date -u +%s 2>/dev/null || printf '')
160
+ if [ -n "$budget_failed_at" ] && [ -n "$budget_now" ] &&
161
+ [ "$budget_failed_at" -ge 0 ] 2>/dev/null && [ "$budget_now" -ge 0 ] 2>/dev/null &&
162
+ [ $((budget_now - budget_failed_at)) -lt $budget_identity_retry_ttl ]; then
163
+ unset budget_cached budget_failed_at budget_now
164
+ return 0
165
+ fi
166
+ unset budget_failed_at budget_now
167
+ ;;
168
+ ''|*[!0-9a-f]*)
169
+ : ;; # no cache, or a value that is not a hex identity key — re-derive
170
+ *)
171
+ budget_identity_key=$budget_cached
172
+ unset budget_cached
173
+ return 0
174
+ ;;
175
+ esac
176
+ unset budget_cached
177
+
178
+ # Routed through `run_gh` (#2356): agents carry no GITHUB_TOKEN/GH_TOKEN, so a
179
+ # direct `$real_gh` call here would go out unauthenticated and derive an empty
180
+ # login, splitting one credential's usage across two identities.
181
+ budget_login=$(run_gh api user --jq .login 2>/dev/null || true)
182
+ # `Aiur.GitHub.Credential.stable_identity/1` downcases every identity part,
183
+ # so the shell derivation must too, or a login with any uppercase character
184
+ # would hash to a different identity key here than on the daemon side and
185
+ # split one credential across two identities in the usage report.
186
+ if command -v tr >/dev/null 2>&1; then
187
+ budget_login=$(printf '%s' "$budget_login" | tr '[:upper:]' '[:lower:]')
188
+ fi
189
+ case "$budget_login" in
190
+ ''|*[!A-Za-z0-9_-]*)
191
+ budget_failed_at=$(date -u +%s 2>/dev/null || printf '')
192
+ case "$budget_failed_at" in
193
+ ''|*[!0-9]*) : ;;
194
+ *) printf 'failed %s\n' "$budget_failed_at" > "$identity_cache" 2>/dev/null || true ;;
195
+ esac
196
+ unset budget_failed_at
197
+ return 0
198
+ ;;
199
+ *)
200
+ budget_identity_key=$(identity_fingerprint "$budget_login") || budget_identity_key=
201
+ if [ -n "$budget_identity_key" ]; then
202
+ printf '%s\n' "$budget_identity_key" > "$identity_cache" 2>/dev/null || true
203
+ fi
204
+ ;;
205
+ esac
206
+ unset budget_login
207
+ return 0
208
+ }
209
+
210
+ if [ -n "$state_root" ]; then
211
+ quota_dir=$state_root/github-quota
212
+ mkdir -p "$quota_dir" 2>/dev/null || true
213
+ fi
214
+
215
+ if [ -z "$agent_quota_dir" ]; then agent_quota_dir=$quota_dir; fi
216
+ if [ -n "$agent_quota_dir" ]; then
217
+ events_file=$agent_quota_dir/agent-requests.tsv
218
+ mkdir -p "$agent_quota_dir" 2>/dev/null || true
219
+ fi
220
+
221
+ if [ "$budget_required" -eq 1 ]; then
222
+ if [ -z "$budget_broker" ] || [ ! -x "$budget_broker" ]; then
223
+ budget_unavailable_reason='broker executable is unavailable'
224
+ elif ! command -v python3 >/dev/null 2>&1; then
225
+ budget_unavailable_reason='python3 is unavailable'
226
+ elif ! mkdir -p "$budget_root" 2>/dev/null; then
227
+ budget_unavailable_reason='state directory is unavailable'
228
+ else
229
+ if [ -z "$budget_key" ]; then
230
+ # `guard_token` is the file credential (agents) or the inherited env
231
+ # token (host/Executor); the keyring read below feeds both too.
232
+ budget_token=$guard_token
233
+ if [ -z "$budget_token" ]; then
234
+ budget_token=$(GITHUB_TOKEN= GH_TOKEN= "$real_gh" auth token --hostname github.com 2>/dev/null || true)
235
+ [ -n "$budget_token" ] && guard_token=$budget_token
236
+ fi
237
+
238
+ if [ -z "$budget_token" ]; then
239
+ budget_unavailable_reason='GitHub credential is unavailable'
240
+ else
241
+ budget_key=$(fingerprint_value "$budget_token") || budget_key=
242
+ [ -n "$budget_key" ] || budget_unavailable_reason='credential fingerprint is unavailable'
243
+ budget_key_derived=1
244
+ fi
245
+ unset budget_token
246
+ fi
247
+
248
+ if [ -z "$budget_unavailable_reason" ]; then
249
+ budget_db=$budget_root/budget.sqlite3
250
+ budget_enabled=1
251
+ fi
252
+ fi
253
+ fi
254
+
255
+ if [ "$budget_enabled" -eq 1 ]; then
256
+ budget_consumer_key=$(fingerprint_value "$budget_consumer") || budget_consumer_key=
257
+ [ -n "$budget_consumer_key" ] || budget_consumer_key=shared
258
+ fi
259
+ # The raw identity is the human-readable actor label for the usage report; the
260
+ # consumer key above stays a fingerprint. Preserved separately so `usage` can
261
+ # name this caller even when AIUR_GITHUB_BUDGET_CONSUMER is not exported.
262
+ budget_consumer_label=${AIUR_GITHUB_BUDGET_CONSUMER:-"executor:${PPID:-$$}"}
263
+ unset budget_consumer
264
+
265
+ direction=read
266
+ track=1
267
+ resource=unknown
268
+ admission_required=1
269
+ admission_resource=unknown
270
+ endpoint_family=rest
271
+ api_paginated=0
272
+ # High-level (non-`gh api`) budgeted commands run with `GH_DEBUG=api` so this
273
+ # wrapper can observe the HTTP response status. `gh` keeps the status internal
274
+ # for those commands, which left every 304 from `pr view`/`issue view`/`search`
275
+ # billed as if it had cost quota (#2353). The debug transcript is consumed for
276
+ # the reconcile and then stripped, so the caller's stderr is unchanged.
277
+ high_level_debug=0
278
+
279
+ api_command_endpoint() {
280
+ shift
281
+ api_options=1
282
+ api_value_expected=0
283
+
284
+ for api_argument in "$@"; do
285
+ if [ "$api_options" -eq 0 ]; then
286
+ printf '%s\n' "$api_argument"
287
+ unset api_options api_value_expected api_argument
288
+ return 0
289
+ fi
290
+
291
+ if [ "$api_value_expected" -eq 1 ]; then
292
+ api_value_expected=0
293
+ continue
294
+ fi
295
+
296
+ case "$api_argument" in
297
+ --) api_options=0 ;;
298
+ --cache|-F|--field|-f|--raw-field|-H|--header|--hostname|--input|-q|--jq|-X|--method|-p|--preview|-t|--template) api_value_expected=1 ;;
299
+ --cache=*|--field=*|--raw-field=*|--header=*|--hostname=*|--input=*|--jq=*|--method=*|--preview=*|--template=*|-F*|-f*|-H*|-q*|-X*|-p*|-t*) : ;;
300
+ --*) : ;;
301
+ -*) : ;;
302
+ *)
303
+ printf '%s\n' "$api_argument"
304
+ unset api_options api_value_expected api_argument
305
+ return 0
306
+ ;;
307
+ esac
308
+ done
309
+
310
+ unset api_options api_value_expected api_argument
311
+ return 1
312
+ }
313
+
314
+ case "${1:-} ${2:-}" in
315
+ # `/rate_limit` is accepted with or without its leading slash — the same
316
+ # spelling tolerance the GraphQL arm below has — so the free endpoint is
317
+ # never misbooked to `rest`/core (#2353).
318
+ "api rate_limit"|"api /rate_limit") resource=none; endpoint_family=rate_limit ;;
319
+ "api graphql"|"api /graphql")
320
+ resource=graphql
321
+ endpoint_family=graphql
322
+ api_options=1
323
+ for arg in "$@"; do
324
+ if [ "$api_options" -eq 1 ] && [ "$arg" = -- ]; then
325
+ api_options=0
326
+ continue
327
+ fi
328
+ [ "$api_options" -eq 1 ] || continue
329
+ case "$arg" in
330
+ *mutation*|*Mutation*) direction=write ;;
331
+ --paginate|--paginate=true) api_paginated=1 ;;
332
+ esac
333
+ done
334
+ unset api_options
335
+ ;;
336
+ "api "*)
337
+ resource=core
338
+ endpoint=${2#/}
339
+ endpoint=${endpoint#repos/}
340
+ endpoint=${endpoint%%\?*}
341
+ endpoint=${endpoint%%\#*}
342
+ case "$endpoint" in
343
+ */*/*) endpoint_family=$(printf '%s' "$endpoint" | cut -d/ -f3) ;;
344
+ *) endpoint_family=rest ;;
345
+ esac
346
+ prior=
347
+ api_options=1
348
+ for arg in "$@"; do
349
+ if [ "$api_options" -eq 1 ] && [ "$arg" = -- ]; then
350
+ api_options=0
351
+ continue
352
+ fi
353
+ [ "$api_options" -eq 1 ] || continue
354
+ if [ "$prior" = -X ] || [ "$prior" = --method ]; then
355
+ case "$arg" in GET|get) ;; *) direction=write ;; esac
356
+ fi
357
+ case "$arg" in
358
+ -XPOST|-XPATCH|-XPUT|-XDELETE|--method=POST|--method=PATCH|--method=PUT|--method=DELETE|-f|-F|--field|--raw-field|--field=*|--raw-field=*) direction=write ;;
359
+ --paginate|--paginate=true) api_paginated=1 ;;
360
+ esac
361
+ prior=$arg
362
+ done
363
+ unset api_options
364
+ ;;
365
+ # `gh pr view|list|status|checks`, `gh issue view|list|status`, and
366
+ # `gh search *` speak GraphQL on the wire, so they book to the graphql
367
+ # resource — not core. They KEEP their descriptive families (pulls / issues /
368
+ # search): `endpoint_family` is also the lease-pool key and the audit
369
+ # histogram, so collapsing every GraphQL arm onto one family would merge four
370
+ # in-flight pools into one. The broker's hourly accounting buckets on the
371
+ # booked `resource`, not the family. `pr diff` is REST and stays in the pulls
372
+ # family with resource=core (it must not inherit the graphql booking from its
373
+ # read-arm sibling).
374
+ "pr view"|"pr list"|"pr status"|"pr checks") resource=graphql; endpoint_family=pulls ;;
375
+ "pr diff") resource=core; endpoint_family=pulls ;;
376
+ "issue view"|"issue list"|"issue status") resource=graphql; endpoint_family=issues ;;
377
+ "run view"|"run list"|"run watch") endpoint_family=actions ;;
378
+ # `gh search` splits across two wire transports (measured with GH_DEBUG=api):
379
+ # `search issues|prs` are GraphQL (`X-Ratelimit-Resource: graphql`); `search
380
+ # code|commits|repos|users` hit REST `/search/*`, metered against a third pool,
381
+ # `search` (~30 req/min). The `search` pool is its own resource so something
382
+ # paces against it; booking it to core or graphql mis-states the spend and
383
+ # protects the wrong window.
384
+ "search issues"|"search prs") resource=graphql; endpoint_family=search ;;
385
+ "search code"|"search commits"|"search repos"|"search users") resource=search; endpoint_family=search ;;
386
+ "search "*) resource=search; endpoint_family=search ;;
387
+ # The `pr`/`issue` write subcommands are a GraphQL/REST mix and must be
388
+ # classified per subcommand rather than as one bucket: `pr create|merge|review`
389
+ # and `issue create` mutate through GraphQL; the rest (close, reopen, comment,
390
+ # edit, ready, lock/unlock, update-branch, transfer, ...) are REST. Each keeps
391
+ # its descriptive pulls/issues family for the lease pool and books the resource
392
+ # its wire traffic actually consumes.
393
+ "pr create"|"pr merge"|"pr review") resource=graphql; endpoint_family=pulls; direction=write ;;
394
+ "pr "*) resource=core; endpoint_family=pulls; direction=write ;;
395
+ "issue create") resource=graphql; endpoint_family=issues; direction=write ;;
396
+ "issue "*) resource=core; endpoint_family=issues; direction=write ;;
397
+ "run rerun"|"run cancel"|"run delete") endpoint_family=actions; direction=write ;;
398
+ "label create"|"label delete"|"label edit") endpoint_family=labels; direction=write ;;
399
+ # Commands that change repository state without touching an issue or a pull
400
+ # request. Left classified as reads they invalidated nothing, so
401
+ # `gh repo edit --default-branch` or a release could change what a stored
402
+ # answer says while every agent kept replaying the old one.
403
+ "repo edit"|"repo rename"|"repo archive"|"repo unarchive"|"repo delete"|\
404
+ "release create"|"release edit"|"release delete"|"release upload"|\
405
+ "secret set"|"secret delete"|"variable set"|"variable delete"|\
406
+ "gist create"|"gist edit"|"gist delete"|"cache delete") resource=core; direction=write ;;
407
+ "config "*|"alias "*|"completion "*|"help "*|"version "*) track=0; resource=none; admission_required=0 ;;
408
+ "auth token") track=0; resource=none; admission_required=0 ;;
409
+ "auth "*|"extension "*) track=0 ;;
410
+ esac
411
+
412
+ # `gh api` accepts options before its endpoint. Derive the resource family from
413
+ # that actual endpoint so a paginated `gh api -X GET repos/.../issues` uses the
414
+ # same per-endpoint ceiling as its unflagged form.
415
+ if [ "${1:-}" = api ]; then
416
+ resolved_api_endpoint=$(api_command_endpoint "$@") || resolved_api_endpoint=
417
+
418
+ case "$resolved_api_endpoint" in
419
+ rate_limit|/rate_limit)
420
+ resource=none
421
+ endpoint_family=rate_limit
422
+ ;;
423
+ graphql|/graphql)
424
+ resource=graphql
425
+ endpoint_family=graphql
426
+ ;;
427
+ *)
428
+ resource=core
429
+ resolved_endpoint=${resolved_api_endpoint#/}
430
+ resolved_endpoint=${resolved_endpoint#repos/}
431
+ resolved_endpoint=${resolved_endpoint%%\?*}
432
+ resolved_endpoint=${resolved_endpoint%%\#*}
433
+ case "$resolved_endpoint" in
434
+ */*/*) endpoint_family=$(printf '%s' "$resolved_endpoint" | cut -d/ -f3) ;;
435
+ *) endpoint_family=rest ;;
436
+ esac
437
+ unset resolved_endpoint
438
+ ;;
439
+ esac
440
+
441
+ unset resolved_api_endpoint
442
+ fi
443
+
444
+ # Fields imply POST only when the caller did not explicitly select a method.
445
+ # Recompute this after locating the endpoint so `gh api -X GET ... -f q=...`
446
+ # remains a budgeted read instead of being rejected as a paginated write.
447
+ if [ "${1:-}" = api ]; then
448
+ api_options=1
449
+ api_method=
450
+ api_payload=0
451
+ api_mutation=0
452
+ api_method_expected=0
453
+
454
+ for api_argument in "$@"; do
455
+ [ "$api_options" -eq 1 ] || continue
456
+
457
+ if [ "$api_method_expected" -eq 1 ]; then
458
+ api_method=$api_argument
459
+ api_method_expected=0
460
+ continue
461
+ fi
462
+
463
+ case "$api_argument" in
464
+ --) api_options=0 ;;
465
+ -X|--method) api_method_expected=1 ;;
466
+ -X*) api_method=${api_argument#-X} ;;
467
+ --method=*) api_method=${api_argument#--method=} ;;
468
+ -F|-f|--field|--raw-field|--input|--input=*) api_payload=1 ;;
469
+ -F*|-f*|--field=*|--raw-field=*) api_payload=1 ;;
470
+ *mutation*|*Mutation*) api_mutation=1 ;;
471
+ esac
472
+ done
473
+
474
+ case "$resource" in
475
+ graphql)
476
+ [ "$api_mutation" -eq 1 ] && direction=write || direction=read
477
+ ;;
478
+ *)
479
+ case "$api_method" in
480
+ GET|get) direction=read ;;
481
+ '') [ "$api_payload" -eq 1 ] && direction=write || direction=read ;;
482
+ *) direction=write ;;
483
+ esac
484
+ ;;
485
+ esac
486
+
487
+ unset api_options api_method api_payload api_mutation api_method_expected api_argument
488
+ fi
489
+
490
+ # #1793: direct GitHub issue API creation bypasses the `issue create`
491
+ # disposition enforcement below, so refuse it outright and point at the
492
+ # sanctioned path. Detect both REST issue endpoints and GraphQL `createIssue`
493
+ # mutations, including file- and stdin-backed GraphQL bodies. Paginated calls
494
+ # are owned by the pagination guard below, which already refuses every
495
+ # paginated write and non-replayable body, so leave those to it.
496
+ if [ "${1:-}" = api ] && [ "$api_paginated" -eq 0 ]; then
497
+ for direct_arg in "$@"; do
498
+ case "$direct_arg" in
499
+ *createIssue*|*CreateIssue*) direct_issue_api=1 ;;
500
+ esac
501
+ done
502
+
503
+ if [ "$direct_issue_api" -eq 0 ]; then
504
+ direct_endpoint=$(api_command_endpoint "$@") || direct_endpoint=
505
+ case "$direct_endpoint" in
506
+ # The collection endpoint, optionally with a trailing slash, query string,
507
+ # or fragment. `?` is escaped so it matches a literal `?`: unescaped it is
508
+ # a glob wildcard, which made this arm claim every issue *subresource*
509
+ # too — `issues/comments/<id>` most visibly, so an agent could not PATCH
510
+ # its own workpad comment. The #1793 guard is about creating issues, not
511
+ # editing one.
512
+ *repos/*/*/issues|*repos/*/*/issues/|\
513
+ *repos/*/*/issues\?*|*repos/*/*/issues/\?*|\
514
+ *repos/*/*/issues#*|*repos/*/*/issues/#*)
515
+ direct_method=
516
+ direct_payload=0
517
+ direct_method_expected=0
518
+ for direct_arg in "$@"; do
519
+ [ "$direct_method_expected" -eq 1 ] && { direct_method=$direct_arg; direct_method_expected=0; continue; }
520
+ case "$direct_arg" in
521
+ --) break ;;
522
+ -X|--method) direct_method_expected=1 ;;
523
+ -XGET|-X=GET|--method=GET|-Xget|-X=get|--method=get) direct_method=get ;;
524
+ -XPOST|-X=POST|--method=POST|-Xpost|-X=post|--method=post) direct_method=post ;;
525
+ -X*) direct_method=${direct_arg#-X} ;;
526
+ --method=*) direct_method=${direct_arg#--method=} ;;
527
+ -F|-f|--field|--raw-field|--input|--input=*) direct_payload=1 ;;
528
+ -F*|-f*|--field=*|--raw-field=*) direct_payload=1 ;;
529
+ esac
530
+ done
531
+ case "$direct_method" in
532
+ =*) direct_method=${direct_method#=} ;;
533
+ esac
534
+ case "$direct_method" in
535
+ GET|get) ;;
536
+ '') [ "$direct_payload" -eq 1 ] && direct_issue_api=1 ;;
537
+ *) direct_issue_api=1 ;;
538
+ esac
539
+ ;;
540
+ esac
541
+ fi
542
+
543
+ # File- and stdin-backed GraphQL bodies are opaque to the argv scan above.
544
+ if [ "$direct_issue_api" -eq 0 ]; then
545
+ direct_graphql_file=
546
+ direct_prior=
547
+ for direct_arg in "$@"; do
548
+ case "$direct_prior" in
549
+ --input) direct_graphql_file=$direct_arg ;;
550
+ esac
551
+ case "$direct_arg" in
552
+ --input=*) direct_graphql_file=${direct_arg#--input=} ;;
553
+ query=@*|-Fquery=@*|-F=query=@*|-fquery=@*|-f=query=@*|--field=query=@*|--raw-field=query=@*) direct_graphql_file=${direct_arg#*@} ;;
554
+ esac
555
+ direct_prior=$direct_arg
556
+ done
557
+ if [ -n "$direct_graphql_file" ]; then
558
+ case "$direct_graphql_file" in
559
+ @*) direct_graphql_file=${direct_graphql_file#@} ;;
560
+ esac
561
+ # Only a body this process can read AND prove creates an issue is
562
+ # claimed by the #1793 guard. A stdin, unreadable, or otherwise opaque
563
+ # body cannot be confirmed as issue creation, so it is left to the
564
+ # pre-existing merge gate, which denies every unreadable GraphQL body
565
+ # because it cannot rule out a merge — claiming an opaque body here
566
+ # would mislabel a possible merge as issue creation.
567
+ if [ -f "$direct_graphql_file" ] && grep -q 'createIssue' "$direct_graphql_file" 2>/dev/null; then
568
+ direct_issue_api=1
569
+ fi
570
+ fi
571
+ fi
572
+ fi
573
+
574
+ if [ "$direct_issue_api" -eq 1 ]; then
575
+ printf '%s\n' 'aiur: refusing direct GitHub issue API creation (#1793).' >&2
576
+ printf '%s\n' 'aiur: use `gh issue create --label ...` so the dispatch disposition is explicit and enforceable.' >&2
577
+ exit 78
578
+ fi
579
+
580
+ dispatch_disposition() {
581
+ label=$1
582
+ case "$label" in
583
+ "$dispatch_prefix:todo"|human:todo|needs-triage|build-order|epic) return 0 ;;
584
+ *) return 1 ;;
585
+ esac
586
+ }
587
+
588
+ # #1793: a ticket created without a lifecycle label is undispatchable AND
589
+ # invisible — no agent can claim it and it appears in no state-scoped view, so
590
+ # it reads to the operator as "no work left" (29 accumulated in one run). The
591
+ # skills tell every filing path to set the disposition in the same request;
592
+ # this refuses the call that does not, because an unlabelled issue cannot be
593
+ # un-filed. Deliberately non-runnable hierarchy (Build Order roots, epics) and
594
+ # parked work still pass by naming their own disposition.
595
+ command_name=
596
+ subcommand_name=
597
+ # The third positional word, where `gh pr view 2073` and its siblings put the
598
+ # resource number. The shared-state cache reads the identity from exactly this
599
+ # position and nowhere else, so a rarer spelling such as
600
+ # `gh pr view --json body 2073` resolves to no identity and is simply not
601
+ # cached. Guessing a position instead would risk keying a response under the
602
+ # wrong number, and a wrong cached shape is worse than a cache miss.
603
+ positional_three=
604
+ positional_count=0
605
+ skip_root_value=0
606
+ for arg in "$@"; do
607
+ if [ "$skip_root_value" -eq 1 ]; then
608
+ skip_root_value=0
609
+ continue
610
+ fi
611
+ case "$arg" in
612
+ -R|--repo|--hostname) skip_root_value=1; continue ;;
613
+ -R?*|--repo=*|--hostname=*) continue ;;
614
+ esac
615
+ positional_count=$((positional_count + 1))
616
+ case "$positional_count" in
617
+ 1) command_name=$arg ;;
618
+ 2) subcommand_name=$arg ;;
619
+ *) positional_three=$arg; break ;;
620
+ esac
621
+ done
622
+ unset positional_count
623
+ command_key="$command_name $subcommand_name"
624
+
625
+ # Single-account provenance marker (#2501).
626
+ #
627
+ # When agents and the human operator share one GitHub login, the author of a
628
+ # comment no longer says who wrote it, so the daemon reads authorship from a
629
+ # marker in the body instead. This is the only place that marker can be applied
630
+ # to an agent's comment: the body is composed inside the agent process and
631
+ # reaches GitHub through `gh` without ever passing through the daemon.
632
+ #
633
+ # `AIUR_AGENT_COMMENT_MARKER` is exported only on a single-account install, so
634
+ # an unset variable — a separate-account install, an older workspace, a `gh`
635
+ # invoked outside an agent environment — leaves argv untouched byte for byte.
636
+ #
637
+ # The inline `--body`/`-b`/`--body=` forms are rewritten in argv. The
638
+ # `--body-file`/`--body-file=`/`-F` forms are stamped by copying the agent's
639
+ # file to a marked temp copy and passing that path on — the agent's own file is
640
+ # never edited, because it may be read again after the call. Stdin (`-F -`) is
641
+ # the one form that genuinely cannot be rewritten without buffering an unbounded
642
+ # stream, so it stays unmarked. An unstamped comment is read as human by
643
+ # `Aiur.Events.Publisher`, so the cost of skipping stdin is a redundant agent
644
+ # wake, never a swallowed instruction.
645
+ marker_tmp_files=
646
+ if [ -n "${AIUR_AGENT_COMMENT_MARKER:-}" ]; then
647
+ case "$command_key" in
648
+ "issue comment"|"pr comment"|"pr review")
649
+ # Rotate argv exactly $# times: shift each argument off the front and
650
+ # append it (rewritten or not) to the back, leaving "$@" in its original
651
+ # order with the body value replaced in place.
652
+ marker_count=$#
653
+ marker_index=0
654
+ marker_prior=
655
+ while [ "$marker_index" -lt "$marker_count" ]; do
656
+ arg=$1
657
+ shift
658
+ marker_stamp=0
659
+ marker_stamp_file=0
660
+ case "$marker_prior" in
661
+ --body|-b) marker_stamp=1 ;;
662
+ --body-file|-F) marker_stamp_file=1 ;;
663
+ esac
664
+ # Quoted so the body-file policy scan (which flags any line starting
665
+ # with a bare `--body=`) reads this as the pattern match it is rather
666
+ # than as a `gh` invocation passing a body inline. Same match in sh.
667
+ case "$arg" in
668
+ "--body="*) marker_stamp=1 ;;
669
+ "--body-file="*) marker_stamp_file=1 ;;
670
+ esac
671
+ # Recorded before any rewrite, so the next iteration compares against
672
+ # the flag the caller actually passed.
673
+ marker_prior=$arg
674
+ if [ "$marker_stamp" -eq 1 ]; then
675
+ # Idempotent: a body that already carries the marker is passed through
676
+ # untouched, so a re-run or an agent that stamped its own body does not
677
+ # accumulate copies.
678
+ case "$arg" in
679
+ *"$AIUR_AGENT_COMMENT_MARKER"*) ;;
680
+ *) arg="$arg
681
+
682
+ $AIUR_AGENT_COMMENT_MARKER" ;;
683
+ esac
684
+ fi
685
+ # `--body-file` is the spelling Aiur's own skills tell agents to use
686
+ # (the inline-body policy in `Aiur.GitHubBodyFilePolicyTest` requires
687
+ # it), so leaving it unstamped would mean the common agent comment is
688
+ # never marked and every agent wakes on its own reply. The file is
689
+ # copied — never edited in place — because it belongs to the agent and
690
+ # may be read again after the call.
691
+ if [ "$marker_stamp_file" -eq 1 ]; then
692
+ marker_src=$arg
693
+ case "$arg" in
694
+ "--body-file="*) marker_src=${arg#--body-file=} ;;
695
+ esac
696
+ # `-` is stdin, which cannot be rewritten without buffering an
697
+ # unbounded stream; it stays unstamped and reads as human.
698
+ if [ "$marker_src" != "-" ] && [ -f "$marker_src" ] &&
699
+ ! grep -qF "$AIUR_AGENT_COMMENT_MARKER" "$marker_src" 2>/dev/null; then
700
+ marker_tmp=${TMPDIR:-/tmp}/aiur-marked-body.$$.$marker_index
701
+ if cat "$marker_src" > "$marker_tmp" 2>/dev/null &&
702
+ printf '\n\n%s\n' "$AIUR_AGENT_COMMENT_MARKER" >> "$marker_tmp" 2>/dev/null; then
703
+ marker_tmp_files="$marker_tmp_files $marker_tmp"
704
+ case "$arg" in
705
+ "--body-file="*) arg="--body-file=$marker_tmp" ;;
706
+ *) arg=$marker_tmp ;;
707
+ esac
708
+ else
709
+ # A copy that did not complete must not be passed to `gh`: a
710
+ # truncated body is worse than an unstamped one.
711
+ rm -f "$marker_tmp" 2>/dev/null || true
712
+ fi
713
+ fi
714
+ unset marker_src marker_tmp
715
+ fi
716
+ set -- "$@" "$arg"
717
+ marker_index=$((marker_index + 1))
718
+ done
719
+ unset marker_count marker_index marker_prior marker_stamp marker_stamp_file
720
+ ;;
721
+ esac
722
+ fi
723
+
724
+ # Marked copies of an agent's `--body-file` (#2501) live only for the duration
725
+ # of the call that sends them. The trap is armed here, immediately after the
726
+ # copies can first exist, rather than alongside the budget traps far below:
727
+ # every `exit` in between (the agent refusals, the budget-unavailable refusal,
728
+ # the validate-only and cache-hit successes) would otherwise leak one file per
729
+ # call into TMPDIR. `rm -f` on an unset/empty list is a no-op, so this is
730
+ # harmless when the marker block did not run at all — separate-account mode, a
731
+ # non-comment command, or a `-` stdin invocation where no copy is made.
732
+ marker_cleanup() {
733
+ [ -n "${marker_tmp_files:-}" ] || return 0
734
+ rm -f $marker_tmp_files 2>/dev/null || true
735
+ marker_tmp_files=
736
+ }
737
+
738
+ # `budget_release` is not defined yet at this point in the script, so these
739
+ # traps clean up the marker only. They are replaced below — once the budget
740
+ # helpers exist — by traps that do both.
741
+ trap 'marker_cleanup; exit 143' HUP INT TERM
742
+ trap 'marker_cleanup' 0
743
+
744
+ if [ "$command_key" = "issue create" ]; then
745
+ disposition=0
746
+ prior=
747
+ for arg in "$@"; do
748
+ label_value=
749
+ case "$arg" in
750
+ --label=*) label_value=${arg#--label=} ;;
751
+ -l?*) label_value=${arg#-l} ;;
752
+ *)
753
+ case "$prior" in
754
+ --label|-l) label_value=$arg ;;
755
+ esac
756
+ ;;
757
+ esac
758
+ prior=$arg
759
+ [ -n "$label_value" ] || continue
760
+ # `gh` accepts repeated flags and comma-separated lists in one flag.
761
+ old_ifs=$IFS
762
+ IFS=,
763
+ for label in $label_value; do
764
+ if dispatch_disposition "$label"; then disposition=1; fi
765
+ done
766
+ IFS=$old_ifs
767
+ done
768
+
769
+ if [ "$disposition" -eq 0 ]; then
770
+ printf '%s\n' 'aiur: refusing `gh issue create` with no dispatch disposition (#1793).' >&2
771
+ printf '%s\n' 'aiur: an unlabelled ticket is undispatchable and invisible, so it reads as no work left.' >&2
772
+ printf 'aiur: pass --label %s:todo for executable work, or --label needs-triage / human:todo\n' "$dispatch_prefix" >&2
773
+ printf '%s\n' 'aiur: to park it deliberately, or --label build-order / epic for a non-runnable container.' >&2
774
+ exit 78
775
+ fi
776
+ fi
777
+
778
+ if [ "$validate_only" -eq 1 ]; then exit 0; fi
779
+
780
+ admission_resource=$resource
781
+ # Identity derivation needs the command's admission decision (resource /
782
+ # admission_required), which the classification above just made — so it runs
783
+ # here, not at the top of the script, and only for a call that is about to be
784
+ # admitted against a metered pool (`budget_derive_identity` re-checks the same
785
+ # gates). A local `auth token`/`config` read never pays a GitHub round trip.
786
+ budget_derive_identity
787
+ # `none` is the shared EndpointPolicy table's pool for endpoints GitHub does
788
+ # not meter (`/rate_limit`). They are admitted for ordering but their ledger
789
+ # row keeps `resource: none` — the same row the daemon's Budget path writes —
790
+ # rather than being booked onto the core bucket, so the guard and the daemon
791
+ # cannot disagree about what rate-limit probes cost (#2353). No `none`->core
792
+ # mapping is applied: the only admitted `none`-resource command is `api
793
+ # rate_limit`, and non-admitted `none` commands (config/auth token) never
794
+ # reach the broker.
795
+
796
+ # ---------------------------------------------------------------------------
797
+ # SECURITY INVARIANT — agents never approve or merge a pull request.
798
+ #
799
+ # The human merge gate is the last irreversible-action control in Aiur: an agent
800
+ # that can approve and merge its own PR removes every human from the loop, and
801
+ # prompt injection from a public issue body is enough to make it try.
802
+ #
803
+ # Two facts make this check work where an env-var switch would not:
804
+ #
805
+ # 1. Agent context is decided by WHERE THIS SCRIPT LIVES, not by an env var.
806
+ # The daemon installs an identical copy at `<workspace>/.aiur-runtime/bin/gh`
807
+ # for agents and at `~/.aiur/bin/gh` for the Executor. `$0` cannot be
808
+ # cleared with `env -u`, so `env -u AIUR_AGENT_WORKSPACE gh pr merge` still
809
+ # lands here as an agent.
810
+ # 2. It is paired with a per-agent `GH_CONFIG_DIR` (see
811
+ # `Aiur.AgentGitHubGuard.gh_config_dir/1`), which stops the documented
812
+ # bypass `env -u GITHUB_TOKEN -u GH_TOKEN gh pr review --approve`: with no
813
+ # keyring entry to fall back to, `gh` cannot reach the operator identity in
814
+ # the branch-protection `bypass_actors` list — even when the real `gh` is
815
+ # invoked by absolute path, because it is process environment, not a wrapper.
816
+ #
817
+ # Reads stay allowed: an agent must still inspect review state and whether a PR
818
+ # merged. Only the writes are refused.
819
+ # ---------------------------------------------------------------------------
820
+ # The redirect belongs to `cd`, not `pwd`: a missing directory must fail this
821
+ # command substitution silently instead of writing a shell error to the agent's
822
+ # stderr, where it would look like output from the command the agent ran.
823
+ guard_self_dir=$(CDPATH= cd "$(dirname "$0")" 2>/dev/null && pwd) || guard_self_dir=
824
+ agent_guard=0
825
+ case "$guard_self_dir" in
826
+ */.aiur-runtime/bin) agent_guard=1 ;;
827
+ esac
828
+ [ -z "${AIUR_AGENT_WORKSPACE:-}" ] || agent_guard=1
829
+ unset guard_self_dir
830
+
831
+ # `--approve` is not a single spelling. gh accepts `--approve=true`, the short
832
+ # `-a`, and short clusters such as `-ab body`, so an exact-literal comparison
833
+ # refuses only the most obvious form. The scan must also skip the VALUES of
834
+ # value-taking flags, or `gh pr review --comment --body --approve` — a comment
835
+ # whose text happens to be `--approve` — is refused as an approval.
836
+ approve_flag_in_arguments() {
837
+ approve_options=1
838
+ approve_expect_value=0
839
+
840
+ for approve_argument in "$@"; do
841
+ [ "$approve_options" -eq 1 ] || continue
842
+
843
+ if [ "$approve_expect_value" -eq 1 ]; then
844
+ approve_expect_value=0
845
+ continue
846
+ fi
847
+
848
+ case "$approve_argument" in
849
+ --) approve_options=0 ;;
850
+ --approve|--approve=*)
851
+ unset approve_options approve_expect_value approve_argument approve_cluster
852
+ return 0
853
+ ;;
854
+ --body|--body-file|--repo) approve_expect_value=1 ;;
855
+ --*) : ;;
856
+ -?*)
857
+ # Walk the cluster one letter at a time. A value-taking letter consumes
858
+ # the remainder of the cluster as its inline value (`-Rowner/aiur`), so
859
+ # stop there instead of reading that value as more flags.
860
+ approve_cluster=${approve_argument#-}
861
+ while [ -n "$approve_cluster" ]; do
862
+ case "$approve_cluster" in
863
+ a*)
864
+ unset approve_options approve_expect_value approve_argument approve_cluster
865
+ return 0
866
+ ;;
867
+ b*|F*|R*)
868
+ approve_cluster=${approve_cluster#?}
869
+ [ -n "$approve_cluster" ] || approve_expect_value=1
870
+ approve_cluster=
871
+ ;;
872
+ *) approve_cluster=${approve_cluster#?} ;;
873
+ esac
874
+ done
875
+ ;;
876
+ esac
877
+ done
878
+
879
+ unset approve_options approve_expect_value approve_argument approve_cluster
880
+ return 1
881
+ }
882
+
883
+ # gh reads a GraphQL document from a file or standard input as readily as from
884
+ # argv. When it does, this process never sees the document, so the mutation-name
885
+ # scan below has nothing to match and would admit `addPullRequestReview` with
886
+ # the agent's PAT — an approval branch protection does not stop. The guard can
887
+ # only permit what it can read, so an unreadable body is a denial.
888
+ graphql_body_is_hidden() {
889
+ for deny_argument in "$@"; do
890
+ case "$deny_argument" in
891
+ --input|--input=*|-|query=@*|-Fquery=@*|-F=query=@*|-fquery=@*|-f=query=@*|--field=query=@*|--raw-field=query=@*)
892
+ unset deny_argument
893
+ return 0
894
+ ;;
895
+ esac
896
+ done
897
+ unset deny_argument
898
+ return 1
899
+ }
900
+
901
+ merge_or_approve_command() {
902
+ case "${1:-} ${2:-}" in
903
+ "pr merge") return 0 ;;
904
+ "pr review") approve_flag_in_arguments "$@" && return 0 ;;
905
+ # A manually dispatched workflow runs with `GITHUB_TOKEN` and whatever
906
+ # permissions its YAML claims, entirely outside this guard — including
907
+ # `contents: write`. Dispatching one is a way to ask GitHub to perform the
908
+ # merge on the agent's behalf, so it is the same act as merging.
909
+ "workflow run") return 0 ;;
910
+ esac
911
+
912
+ [ "${1:-}" = api ] || return 1
913
+
914
+ if [ "$resource" = graphql ]; then
915
+ # This check precedes the read/write gate on purpose: a hidden body makes
916
+ # `direction` unknowable, and it is computed as `read` by default, so
917
+ # gating on it here would skip the denial entirely.
918
+ graphql_body_is_hidden "$@" && return 0
919
+ [ "$direction" = write ] || return 1
920
+
921
+ for deny_argument in "$@"; do
922
+ case "$deny_argument" in
923
+ *mergePullRequest*|*addPullRequestReview*|*submitPullRequestReview*|*enablePullRequestAutoMerge*)
924
+ unset deny_argument
925
+ return 0
926
+ ;;
927
+ esac
928
+ done
929
+ unset deny_argument
930
+ return 1
931
+ fi
932
+
933
+ # A GET of `.../pulls/N/reviews` is how an agent checks whether review
934
+ # happened; only the write forms are the gate bypass.
935
+ [ "$direction" = write ] || return 1
936
+
937
+ deny_endpoint=$(api_command_endpoint "$@") || deny_endpoint=
938
+ deny_endpoint=${deny_endpoint%%\?*}
939
+ deny_endpoint=${deny_endpoint%%\#*}
940
+ deny_endpoint=${deny_endpoint%/}
941
+ case "$deny_endpoint" in
942
+ # `pulls/N/merge` and `pulls/N/reviews` are the direct forms. The rest reach
943
+ # the same result without a pull request at all: `merges` commits a merge
944
+ # onto a branch, a write to `git/refs` moves the protected branch to any
945
+ # commit, and `update-branch` writes to the PR's base-tracking ref.
946
+ */pulls/*/merge|*/pulls/*/reviews|*/pulls/*/reviews/*|*/pulls/*/update-branch|*/merges|*/git/refs|*/git/refs/*)
947
+ unset deny_endpoint
948
+ return 0
949
+ ;;
950
+ # Disarming the gate is as good as passing it. Branch protection and
951
+ # rulesets are what make an agent's bot PAT unable to merge in the first
952
+ # place, so an agent that can rewrite them has removed the control every
953
+ # other denial here depends on.
954
+ */branches/*/protection|*/branches/*/protection/*|*/rulesets|*/rulesets/*)
955
+ unset deny_endpoint
956
+ return 0
957
+ ;;
958
+ # The REST forms of the workflow dispatch denied above, plus
959
+ # `repos/{o}/{r}/dispatches`, which triggers a `repository_dispatch`
960
+ # workflow the same way.
961
+ */actions/workflows/*/dispatches|*/dispatches)
962
+ unset deny_endpoint
963
+ return 0
964
+ ;;
965
+ esac
966
+ unset deny_endpoint
967
+ return 1
968
+ }
969
+
970
+ # The denylist keys on the command name, so anything that renames a command
971
+ # defeats it: `gh alias set zz "pr merge"` followed by `gh zz 7` arrives here as
972
+ # `zz`, matches nothing, and is admitted. The per-workspace `GH_CONFIG_DIR` that
973
+ # closes the keyring bypass also hands the agent a writable place to store that
974
+ # alias: refusing alias mutation removes the write half; refusing an unknown
975
+ # command name removes the read half — an unrecognised name is not one this
976
+ # guard has decided is safe, but one it cannot decide about at all.
977
+ undecidable_agent_command() {
978
+ case "${1:-} ${2:-}" in
979
+ "alias set"|"alias delete"|"alias import") return 0 ;;
980
+ esac
981
+
982
+ case "${1:-}" in
983
+ # Bare `gh` and its top-level flags print local help; no command is run.
984
+ ''|-*) return 1 ;;
985
+ accessibility|alias|api|attestation|auth|browse|cache|codespace|completion) return 1 ;;
986
+ config|extension|gist|gpg-key|help|issue|label|org|pr|preview|project) return 1 ;;
987
+ release|repo|ruleset|run|search|secret|ssh-key|status|variable|version|workflow) return 1 ;;
988
+ *) return 0 ;;
989
+ esac
990
+ }
991
+
992
+ if [ "$agent_guard" -eq 1 ] && merge_or_approve_command "$@"; then
993
+ printf '%s\n' 'aiur: agents cannot approve or merge pull requests; a human reviewer holds the merge gate' >&2
994
+ exit 77
995
+ fi
996
+
997
+ if [ "$agent_guard" -eq 1 ] && undecidable_agent_command "$@"; then
998
+ printf '%s\n' 'aiur: agents cannot rename or hide gh commands from the merge gate; refusing a command this guard cannot inspect' >&2
999
+ exit 77
1000
+ fi
1001
+
1002
+ if [ "$admission_required" -eq 1 ] && [ "$budget_required" -eq 1 ] && [ "$budget_enabled" -ne 1 ]; then
1003
+ printf 'aiur: GitHub shared budget unavailable (%s; %s); refusing uncoordinated request\n' "$budget_unavailable_reason" "$budget_recovery" >&2
1004
+ exit 75
1005
+ fi
1006
+
1007
+ consumer=unattributed
1008
+ if [ -n "${AIUR_AGENT_WORKSPACE:-}" ]; then
1009
+ ticket=$(basename "$AIUR_AGENT_WORKSPACE")
1010
+ case "$ticket" in
1011
+ ''|*[!0-9]*) ;;
1012
+ *) consumer=ticket:$ticket ;;
1013
+ esac
1014
+ fi
1015
+
1016
+ # ---------------------------------------------------------------------------
1017
+ # SHARED GITHUB STATE CACHE (#2073 U6)
1018
+ #
1019
+ # The broker rations permission but stores no answers; this section serves each
1020
+ # answer once from a store every agent on the host shares. Three rules govern it:
1021
+ #
1022
+ # 1. REPLAY BYTES, NEVER RECONSTRUCT THEM. A hit returns the exact stdout the
1023
+ # real `gh` produced for an invocation whose output-affecting arguments
1024
+ # (`--json`, `--jq`, `--template`, tty) hash identically.
1025
+ #
1026
+ # 2. KEYED BY RESOURCE IDENTITY; THE SHAPE ONLY NAMES THE FILE.
1027
+ # `<owner>/<repo>/<kind>/<id>/<shape>` — one marker invalidates every shape.
1028
+ #
1029
+ # 3. ANY DOUBT FALLS THROUGH: an unrecognised command, unknown repository,
1030
+ # missing store, unparseable entry or non-zero exit leaves `$cache_body`
1031
+ # empty and the call proceeds as today. The cache may cost throughput when
1032
+ # it fails, never correctness.
1033
+ #
1034
+ # WHAT THIS IS NOT. Every agent runs as the SAME OS user and can write here,
1035
+ # exactly as beside the shared budget database; real containment needs a
1036
+ # separate UID per agent.
1037
+ #
1038
+ # CONDITIONAL REQUESTS (#2299): `gh api` reads revalidate with If-None-Match
1039
+ # against a stored ETag and a served 304 is reconciled free; high-level reads
1040
+ # are GraphQL with no validator and stay TTL-only — see apis/github.md.
1041
+ # ---------------------------------------------------------------------------
1042
+ # The store sits beside the budget broker's database, the one directory every
1043
+ # agent on a host shares. It derives from the RAW env var rather than
1044
+ # `$budget_root` (which defaults to `$HOME/.aiur/github-budget` when unset), so
1045
+ # a harness that clears the budget root does not get a live cache in the
1046
+ # operator's home directory.
1047
+ cache_root=${AIUR_GITHUB_STATE_CACHE_ROOT:-}
1048
+ if [ -z "$cache_root" ] && [ -n "${AIUR_GITHUB_BUDGET_ROOT:-}" ]; then
1049
+ cache_root=${AIUR_GITHUB_BUDGET_ROOT%/}/state-cache
1050
+ fi
1051
+ case "$cache_root" in
1052
+ /*) ;;
1053
+ *) cache_root= ;;
1054
+ esac
1055
+ # Whether THIS call reads and writes entries. Kept separate from the store's
1056
+ # existence on purpose: the store is shared by every agent on the host, so a
1057
+ # process opting out of reading must still retire what it changes. Gating
1058
+ # invalidation on the same switch would let one agent's `--json`-free shell or
1059
+ # one test harness leave every OTHER agent serving a stale answer for the rest
1060
+ # of the window.
1061
+ cache_reads=1
1062
+ case "${AIUR_GITHUB_STATE_CACHE_ENABLED:-1}" in
1063
+ 0|false|FALSE|no|NO|off|OFF) cache_reads=0 ;;
1064
+ esac
1065
+
1066
+ # R10's strict-freshness bypass. A caller that must not be served stale — a
1067
+ # merge decision, a CI verdict — sets this and pays for the round trip. Writes
1068
+ # still invalidate, so the bypass never leaves a stale entry behind it.
1069
+ cache_bypass=0
1070
+ case "${AIUR_GITHUB_STATE_CACHE_BYPASS:-0}" in
1071
+ 1|true|TRUE|yes|YES|on|ON) cache_bypass=1 ;;
1072
+ esac
1073
+
1074
+ # Seconds, because that is the resolution `date` gives without a subprocess per
1075
+ # comparison. A sub-second value rounds to zero, which still serves an entry
1076
+ # written in the same second, so the setting is documented in whole seconds and
1077
+ # a sub-second value is treated as "off" rather than pretending to a precision
1078
+ # the entry stamps do not carry.
1079
+ cache_ttl=${AIUR_GITHUB_STATE_CACHE_TTL_MS:-60000}
1080
+ case "$cache_ttl" in ''|*[!0-9]*) cache_ttl=60000 ;; esac
1081
+ if [ "$cache_ttl" -lt 1000 ]; then
1082
+ cache_reads=0
1083
+ cache_ttl=0
1084
+ else
1085
+ cache_ttl=$((cache_ttl / 1000))
1086
+ fi
1087
+ cache_max_bytes=${AIUR_GITHUB_STATE_CACHE_MAX_BYTES:-1048576}
1088
+ case "$cache_max_bytes" in ''|*[!0-9]*) cache_max_bytes=1048576 ;; esac
1089
+
1090
+ cache_owner=
1091
+ cache_repo_name=
1092
+ cache_kind=
1093
+ cache_id=
1094
+ cache_write_id=
1095
+ cache_collection=0
1096
+ cache_repo_dir=
1097
+ cache_entry_dir=
1098
+ cache_body=
1099
+ cache_meta=
1100
+ cache_stage=
1101
+ cache_started_at=
1102
+ cache_events_file=
1103
+ cache_shape=
1104
+
1105
+ # `shasum`/`sha256sum` are how a shape becomes a filename. Without one there is
1106
+ # no cache at all, which is the same safe no-op as an unset root.
1107
+ cache_fingerprint() {
1108
+ if command -v shasum >/dev/null 2>&1; then
1109
+ shasum -a 256 2>/dev/null | cut -d' ' -f1
1110
+ elif command -v sha256sum >/dev/null 2>&1; then
1111
+ sha256sum 2>/dev/null | cut -d' ' -f1
1112
+ else
1113
+ return 1
1114
+ fi
1115
+ }
1116
+
1117
+ cache_valid_digest() {
1118
+ case "$1" in
1119
+ ''|*[!0-9a-f]*) return 1 ;;
1120
+ esac
1121
+ [ "${#1}" -eq 64 ]
1122
+ }
1123
+
1124
+ # Every argument is length-prefixed so no two argument vectors can serialise to
1125
+ # the same bytes — `["a b"]` and `["a", "b"]` must not share an entry. The
1126
+ # terminal and colour variables join them because `gh` renders differently on a
1127
+ # TTY, and an entry written by a piped agent must never be replayed to an
1128
+ # interactive Executor shell as if it were the same request.
1129
+ #
1130
+ # `cache_tty` is sampled at the top level because this function's own stdout is
1131
+ # the fingerprint pipe, where `[ -t 1 ]` is false for every caller.
1132
+ cache_tty=0
1133
+ [ -t 1 ] && cache_tty=1
1134
+
1135
+ cache_material() {
1136
+ printf 'aiur-gh-cache/v2\n%s\n' "$cache_tty"
1137
+ # The credential the answer was fetched with. Everything else the broker keeps
1138
+ # — budgets, leases, cooldowns — is already keyed by this fingerprint, and a
1139
+ # response body is more identity-dependent than any of them: a private repo one
1140
+ # token cannot see, the `permissions` object, a collaborator list. Two
1141
+ # identities sharing one store must not share one answer.
1142
+ printf '%s\n' "${budget_key:-unkeyed}"
1143
+ printf '%s\n%s\n%s\n%s\n%s\n' "${NO_COLOR-}" "${CLICOLOR-}" "${CLICOLOR_FORCE-}" "${GH_FORCE_TTY-}" "${COLUMNS-}"
1144
+ printf '%s\n%s\n%s\n' "${GH_HOST-}" "${GH_REPO-}" "$#"
1145
+ for cache_arg in "$@"; do
1146
+ printf '%s\n%s\n' "${#cache_arg}" "$cache_arg"
1147
+ done
1148
+ unset cache_tty cache_arg
1149
+ }
1150
+
1151
+ cache_valid_slug() {
1152
+ case "$1" in
1153
+ *[!A-Za-z0-9./_-]*|*..*|.*|*/) return 1 ;;
1154
+ */*/*) return 1 ;;
1155
+ ?*/?*) return 0 ;;
1156
+ esac
1157
+ return 1
1158
+ }
1159
+
1160
+ cache_numeric() {
1161
+ case "$1" in
1162
+ ''|*[!0-9]*) return 1 ;;
1163
+ esac
1164
+ [ "${#1}" -le 12 ]
1165
+ }
1166
+
1167
+ # `https://github.com/OWNER/REPO/pull/2073` names its repository and its number
1168
+ # outright, so it is a stronger identity than the inferred slug below and
1169
+ # overrides it. Parsed with parameter expansion only — no subprocess.
1170
+ cache_read_url_identity() {
1171
+ case "$1" in
1172
+ https://github.com/*/*/pull/*|https://github.com/*/*/pulls/*|https://github.com/*/*/issues/*) ;;
1173
+ *) return 1 ;;
1174
+ esac
1175
+
1176
+ cache_url_rest=${1#https://github.com/}
1177
+ cache_url_owner=${cache_url_rest%%/*}
1178
+ cache_url_rest=${cache_url_rest#*/}
1179
+ cache_url_repo=${cache_url_rest%%/*}
1180
+ cache_url_rest=${cache_url_rest#*/}
1181
+ cache_url_type=${cache_url_rest%%/*}
1182
+ cache_url_number=${cache_url_rest#*/}
1183
+ cache_url_number=${cache_url_number%%/*}
1184
+ cache_url_number=${cache_url_number%%\?*}
1185
+ cache_url_number=${cache_url_number%%\#*}
1186
+
1187
+ if cache_valid_slug "$cache_url_owner/$cache_url_repo" && cache_numeric "$cache_url_number"; then
1188
+ cache_owner=$cache_url_owner
1189
+ cache_repo_name=$cache_url_repo
1190
+ cache_id=$cache_url_number
1191
+ case "$cache_url_type" in
1192
+ issues) cache_kind=issue ;;
1193
+ *) cache_kind=pr ;;
1194
+ esac
1195
+ unset cache_url_rest cache_url_owner cache_url_repo cache_url_type cache_url_number
1196
+ return 0
1197
+ fi
1198
+
1199
+ unset cache_url_rest cache_url_owner cache_url_repo cache_url_type cache_url_number
1200
+ return 1
1201
+ }
1202
+
1203
+ if [ -n "$cache_root" ]; then
1204
+ # `--hostname` and `GH_HOST` move the request to another GitHub deployment
1205
+ # whose numbering is unrelated, so nothing is cached and — because entries of
1206
+ # THIS host must not be retired by a write against a different one — nothing
1207
+ # is invalidated either. A flag that names github.com explicitly is not a
1208
+ # different deployment, so it is compared rather than merely detected.
1209
+ cache_hostname_override=0
1210
+ cache_hostname_expected=0
1211
+ for cache_arg in "$@"; do
1212
+ if [ "$cache_hostname_expected" -eq 1 ]; then
1213
+ cache_hostname_expected=0
1214
+ case "$cache_arg" in
1215
+ github.com) ;;
1216
+ *) cache_hostname_override=1 ;;
1217
+ esac
1218
+ continue
1219
+ fi
1220
+
1221
+ case "$cache_arg" in
1222
+ --hostname) cache_hostname_expected=1 ;;
1223
+ --hostname=github.com) ;;
1224
+ --hostname=*) cache_hostname_override=1 ;;
1225
+ esac
1226
+ done
1227
+ unset cache_hostname_expected
1228
+ case "${GH_HOST:-github.com}" in
1229
+ github.com) ;;
1230
+ *) cache_hostname_override=1 ;;
1231
+ esac
1232
+ [ "$cache_hostname_override" -eq 0 ] || cache_root=
1233
+ unset cache_hostname_override cache_arg
1234
+ fi
1235
+
1236
+ if [ -n "$cache_root" ]; then
1237
+ # Repository identity, most explicit source first. The workspace anchor is
1238
+ # the subtle one: `AIUR_GITHUB_REPO` is the repo the daemon dispatched this
1239
+ # agent against, and `gh` resolves the repo from the working directory, so the
1240
+ # two only agree while the agent is inside its own workspace. An agent that
1241
+ # cloned something else and ran `gh pr view 5` there would have its answer
1242
+ # filed under the wrong repository — so that case resolves to no identity
1243
+ # and is not cached.
1244
+ cache_flag_repo=
1245
+ cache_prior=
1246
+ for cache_arg in "$@"; do
1247
+ case "$cache_prior" in
1248
+ -R|--repo) cache_flag_repo=$cache_arg ;;
1249
+ esac
1250
+ case "$cache_arg" in
1251
+ -R?*) cache_flag_repo=${cache_arg#-R} ;;
1252
+ --repo=*) cache_flag_repo=${cache_arg#--repo=} ;;
1253
+ esac
1254
+ cache_prior=$cache_arg
1255
+ done
1256
+
1257
+ cache_slug=
1258
+ if [ -n "$cache_flag_repo" ]; then
1259
+ cache_slug=$cache_flag_repo
1260
+ elif [ -n "${GH_REPO:-}" ]; then
1261
+ cache_slug=$GH_REPO
1262
+ elif [ -n "${AIUR_GITHUB_REPO:-}" ] && [ -n "${AIUR_AGENT_WORKSPACE:-}" ]; then
1263
+ case "${PWD:-}" in
1264
+ "$AIUR_AGENT_WORKSPACE"|"$AIUR_AGENT_WORKSPACE"/*) cache_slug=$AIUR_GITHUB_REPO ;;
1265
+ esac
1266
+ fi
1267
+
1268
+ if cache_valid_slug "$cache_slug"; then
1269
+ cache_owner=${cache_slug%%/*}
1270
+ cache_repo_name=${cache_slug#*/}
1271
+ fi
1272
+
1273
+ unset cache_flag_repo cache_prior cache_arg cache_slug
1274
+ fi
1275
+
1276
+ # The `--json` fields whose value is a verdict rather than a fact: CI state, and
1277
+ # whether a pull request can be merged. `gh pr checks` is excluded for the same
1278
+ # reason — and would have been unsafe in a second way: it exits 1 for failure
1279
+ # and 8 for pending while only a zero-status response is ever stored, so the
1280
+ # only verdict it could ever replay is "everything passed".
1281
+ cache_volatile_fields() {
1282
+ case ",$1," in
1283
+ *,statusCheckRollup,*|*,mergeable,*|*,mergeStateStatus,*|*,mergeCommit,*|\
1284
+ *,reviewDecision,*|*,latestReviews,*|*,reviews,*|*,state,*|*,merged,*|*,mergedAt,*|\
1285
+ *,closed,*|*,closedAt,*|*,headRefOid,*|*,commits,*) return 0 ;;
1286
+ esac
1287
+ return 1
1288
+ }
1289
+
1290
+ # REST equivalents of the verdict and merge-gating fields above: a caller
1291
+ # spelling the same read as `gh api` must not acquire a stale answer merely by
1292
+ # bypassing `gh pr view`. The pull-request resource itself is included because
1293
+ # its default document carries `mergeable`, `mergeable_state`, `merged` and
1294
+ # `state` — the exact fields `gh pr view --json ...` refuses — and nothing that
1295
+ # changes them passes through this wrapper, so a `pulls/<n>/comments` read filed
1296
+ # under that PR can never be retired by the write that would stale it.
1297
+ #
1298
+ # Deliberate divergence from `Aiur.GitHub.ReadCache.Policy`: the daemon refuses
1299
+ # every `/actions` path wholesale; this wrapper keeps stable workflow metadata
1300
+ # (`actions/workflows`) cacheable and refuses only run and job state — a
1301
+ # workflow definition changes when its YAML is edited, a run's status is a
1302
+ # verdict nothing retires.
1303
+ cache_unsafe_rest_endpoint() {
1304
+ case "/${1#/}" in
1305
+ */check-runs|*/check-runs/*|*/check-suites|*/check-suites/*|\
1306
+ */status|*/status/*|*/statuses|*/statuses/*|\
1307
+ */pulls|*/pulls/*|*/merge|*/merge/*|*/requested_reviewers|*/requested_reviewers/*|\
1308
+ */reviews|*/reviews/*|*/actions/runs|*/actions/runs/*|\
1309
+ */actions/jobs|*/actions/jobs/*|*/actions/workflows/*/runs|\
1310
+ */actions/workflows/*/runs/*|*/actions/workflows/*/workflow_runs|\
1311
+ */actions/workflows/*/workflow_runs/*) return 0 ;;
1312
+ *) return 1 ;;
1313
+ esac
1314
+ }
1315
+
1316
+ # The output shapes this guard serves. Everything absent from this list — a
1317
+ # bare `gh pr view` with no number, `gh pr diff`, `gh api graphql`, every write
1318
+ # — falls through to the real `gh` untouched.
1319
+ #
1320
+ # `--json` is required for the high-level commands on purpose: without it `gh`
1321
+ # prints a human table with relative timestamps and terminal-width layout,
1322
+ # which is neither stable across agents nor meaningful to replay.
1323
+ if [ -n "$cache_root" ]; then
1324
+ cache_has_json=0
1325
+ cache_has_web=0
1326
+ cache_has_payload=0
1327
+ cache_volatile=0
1328
+ cache_options=1
1329
+ cache_expect_value=0
1330
+ cache_json_expected=0
1331
+
1332
+ for cache_arg in "$@"; do
1333
+ [ "$cache_options" -eq 1 ] || break
1334
+
1335
+ if [ "$cache_json_expected" -eq 1 ]; then
1336
+ cache_json_expected=0
1337
+ cache_expect_value=0
1338
+ cache_volatile_fields "$cache_arg" && cache_volatile=1
1339
+ continue
1340
+ fi
1341
+
1342
+ if [ "$cache_expect_value" -eq 1 ]; then
1343
+ cache_expect_value=0
1344
+ continue
1345
+ fi
1346
+
1347
+ case "$cache_arg" in
1348
+ --) cache_options=0 ;;
1349
+ --json|--jq|-q|--template|-t|--repo|-R|--hostname|--interval|-i|--limit|-L|--label|-l|\
1350
+ --assignee|-a|--author|-A|--search|-S|--state|-s|--base|-B|--head|-H|--milestone|-m|\
1351
+ --app|--mention|--cache|--header|--method|-X|--preview|-p)
1352
+ case "$cache_arg" in
1353
+ --json) cache_has_json=1; cache_json_expected=1 ;;
1354
+ esac
1355
+ cache_expect_value=1
1356
+ ;;
1357
+ --json=*)
1358
+ cache_has_json=1
1359
+ cache_volatile_fields "${cache_arg#--json=}" && cache_volatile=1
1360
+ ;;
1361
+ --web|-w) cache_has_web=1 ;;
1362
+ -F|-f|--field|--raw-field|--input) cache_has_payload=1; cache_expect_value=1 ;;
1363
+ -F*|-f*|--field=*|--raw-field=*|--input=*|*=@*|-) cache_has_payload=1 ;;
1364
+ esac
1365
+ done
1366
+
1367
+ # R10. A merge decision and a CI verdict may not be served stale, ever, and
1368
+ # neither may be repaired after the fact: an agent that reads "all green" for a
1369
+ # commit CI has not seen, or "mergeable" for a branch that has moved, has
1370
+ # already acted on it. Nothing invalidates these — `git push` and a check run
1371
+ # completing never pass through this wrapper — so the freshness window is the
1372
+ # ONLY thing standing between the read and a wrong answer. These field names
1373
+ # are refused outright, never given a short window.
1374
+ [ "$cache_volatile" -eq 0 ] || cache_reads=0
1375
+
1376
+ case "$command_key" in
1377
+ "pr view"|"issue view")
1378
+ if [ "$cache_has_json" -eq 1 ] && [ "$cache_has_web" -eq 0 ] && [ -n "$positional_three" ]; then
1379
+ if cache_numeric "$positional_three"; then
1380
+ cache_id=$positional_three
1381
+ case "$command_name" in
1382
+ pr) cache_kind=pr ;;
1383
+ *) cache_kind=issue ;;
1384
+ esac
1385
+ else
1386
+ cache_read_url_identity "$positional_three" || cache_id=
1387
+ fi
1388
+ fi
1389
+ ;;
1390
+ "pr list"|"issue list")
1391
+ if [ "$cache_has_json" -eq 1 ] && [ "$cache_has_web" -eq 0 ]; then
1392
+ cache_id=list
1393
+ cache_collection=1
1394
+ case "$command_name" in
1395
+ pr) cache_kind=pr ;;
1396
+ *) cache_kind=issue ;;
1397
+ esac
1398
+ fi
1399
+ ;;
1400
+ "api "*|"api")
1401
+ # REST GETs of a repository-scoped endpoint only. GraphQL is excluded:
1402
+ # its identity is an arbitrary document rather than a resource, so an
1403
+ # entry could not be invalidated by the resource writers above. Paginated
1404
+ # reads are excluded here and cached one page at a time, because the
1405
+ # pagination path re-enters this guard per page.
1406
+ if [ "$direction" = read ] && [ "$resource" = core ] && [ "$api_paginated" -eq 0 ] && [ "$cache_has_payload" -eq 0 ]; then
1407
+ cache_endpoint=$(api_command_endpoint "$@") || cache_endpoint=
1408
+ cache_endpoint=${cache_endpoint#/}
1409
+ # The query string is part of the SHAPE, which every argument is hashed
1410
+ # into anyway — it is not part of the resource's identity. Left on, a
1411
+ # `?per_page=1` moved the entry out of its resource's directory and into
1412
+ # a digest of the URL, where the resource's own writers cannot reach it.
1413
+ cache_endpoint=${cache_endpoint%%\?*}
1414
+ cache_endpoint=${cache_endpoint%%\#*}
1415
+ if cache_unsafe_rest_endpoint "$cache_endpoint"; then cache_reads=0; fi
1416
+ case "$cache_endpoint" in
1417
+ repos/*/*/*|repos/*/*)
1418
+ cache_api_rest=${cache_endpoint#repos/}
1419
+ cache_api_owner=${cache_api_rest%%/*}
1420
+ cache_api_rest=${cache_api_rest#*/}
1421
+ cache_api_repo=${cache_api_rest%%/*}
1422
+ if cache_valid_slug "$cache_api_owner/$cache_api_repo"; then
1423
+ cache_owner=$cache_api_owner
1424
+ cache_repo_name=$cache_api_repo
1425
+
1426
+ # An endpoint that NAMES a resource is filed under that resource,
1427
+ # not under the endpoint. `repos/o/r/pulls/1670` and
1428
+ # `gh pr view 1670 --json body` are the same pull request, so a
1429
+ # writer retiring pull request 1670 must retire both — and it
1430
+ # cannot if one is filed under a URL digest the writer has never
1431
+ # seen. The endpoint still separates the two entries via the
1432
+ # hashed shape.
1433
+ cache_api_number=
1434
+ case "$cache_api_rest" in
1435
+ */issues/*|*/pulls/*)
1436
+ cache_api_tail=${cache_api_rest#*/}
1437
+ case "$cache_api_tail" in
1438
+ issues/*) cache_api_kind=issue; cache_api_tail=${cache_api_tail#issues/} ;;
1439
+ pulls/*) cache_api_kind=pr; cache_api_tail=${cache_api_tail#pulls/} ;;
1440
+ *) cache_api_kind= ;;
1441
+ esac
1442
+ cache_api_number=${cache_api_tail%%/*}
1443
+ if [ -n "$cache_api_kind" ] && cache_numeric "$cache_api_number"; then
1444
+ cache_kind=$cache_api_kind
1445
+ cache_id=$cache_api_number
1446
+ fi
1447
+ unset cache_api_tail cache_api_kind
1448
+ ;;
1449
+ esac
1450
+
1451
+ if [ -z "$cache_id" ]; then
1452
+ # An endpoint naming no single resource — a list, a search, a
1453
+ # repository-level read. Filed under the endpoint and treated as a
1454
+ # collection, so a write anywhere in the repository retires it.
1455
+ cache_kind=api
1456
+ cache_collection=1
1457
+ cache_id=$(printf '%s' "$cache_endpoint" | cache_fingerprint) || cache_id=
1458
+ cache_valid_digest "$cache_id" || cache_id=
1459
+ fi
1460
+ unset cache_api_number
1461
+ fi
1462
+ unset cache_api_rest cache_api_owner cache_api_repo
1463
+ ;;
1464
+ esac
1465
+ unset cache_endpoint
1466
+ fi
1467
+ ;;
1468
+ esac
1469
+
1470
+ unset cache_has_json cache_has_web cache_has_payload cache_volatile cache_options cache_expect_value \
1471
+ cache_json_expected cache_arg
1472
+ fi
1473
+
1474
+ # The number a write mutates. Pull requests and issues share one number space on
1475
+ # GitHub, so a comment posted through `gh issue comment 2073` changes what
1476
+ # `gh pr view 2073 --json comments` would answer. Both directories are marked.
1477
+ case "$command_key" in
1478
+ "pr create"|"issue create") cache_write_id=collection ;;
1479
+ "pr "*|"issue "*)
1480
+ if cache_numeric "$positional_three"; then cache_write_id=$positional_three; fi
1481
+ ;;
1482
+ esac
1483
+
1484
+ if [ -n "$cache_root" ] && [ "$direction" = write ] && [ "${1:-}" = api ] && [ -z "$cache_write_id" ]; then
1485
+ cache_write_endpoint=$(api_command_endpoint "$@") || cache_write_endpoint=
1486
+ cache_write_endpoint=${cache_write_endpoint#/}
1487
+ cache_write_endpoint=${cache_write_endpoint%%\?*}
1488
+ case "$cache_write_endpoint" in
1489
+ repos/*/*/issues/*|repos/*/*/pulls/*)
1490
+ cache_write_rest=${cache_write_endpoint#repos/}
1491
+ cache_write_owner=${cache_write_rest%%/*}
1492
+ cache_write_rest=${cache_write_rest#*/}
1493
+ cache_write_repo=${cache_write_rest%%/*}
1494
+ cache_write_rest=${cache_write_rest#*/}
1495
+ cache_write_rest=${cache_write_rest#*/}
1496
+ cache_write_number=${cache_write_rest%%/*}
1497
+ if cache_valid_slug "$cache_write_owner/$cache_write_repo"; then
1498
+ cache_owner=$cache_write_owner
1499
+ cache_repo_name=$cache_write_repo
1500
+
1501
+ if cache_numeric "$cache_write_number"; then
1502
+ cache_write_id=$cache_write_number
1503
+ else
1504
+ # `issues/comments/<id>`, `pulls/comments/<id>`, `issues/events/<id>`:
1505
+ # a subresource whose own id is not an issue or pull request number.
1506
+ # The agent workpad is edited through exactly this shape.
1507
+ cache_write_id=subresource
1508
+ fi
1509
+ fi
1510
+ unset cache_write_rest cache_write_owner cache_write_repo cache_write_number
1511
+ ;;
1512
+ repos/*/*/issues|repos/*/*/pulls)
1513
+ cache_write_rest=${cache_write_endpoint#repos/}
1514
+ cache_write_owner=${cache_write_rest%%/*}
1515
+ cache_write_rest=${cache_write_rest#*/}
1516
+ cache_write_repo=${cache_write_rest%%/*}
1517
+ if cache_valid_slug "$cache_write_owner/$cache_write_repo"; then
1518
+ cache_owner=$cache_write_owner
1519
+ cache_repo_name=$cache_write_repo
1520
+ cache_write_id=collection
1521
+ fi
1522
+ unset cache_write_rest cache_write_owner cache_write_repo
1523
+ ;;
1524
+ esac
1525
+ unset cache_write_endpoint
1526
+ fi
1527
+
1528
+ if [ -n "$cache_root" ]; then
1529
+ cache_started_at=$(date -u +%s 2>/dev/null || printf '')
1530
+ case "$cache_started_at" in
1531
+ ''|*[!0-9]*) cache_root= ;;
1532
+ esac
1533
+ fi
1534
+
1535
+ # `cache_now` is what freshness is measured against. It starts equal to the
1536
+ # process's start and is re-sampled only by a coalesced follower, which is the
1537
+ # one caller for whom "now" has genuinely moved since it started.
1538
+ cache_now=${cache_started_at:-0}
1539
+
1540
+ if [ -n "$cache_root" ] && [ -n "$cache_owner" ] && [ -n "$cache_repo_name" ]; then
1541
+ # Down-cased, exactly as `Aiur.GitHub.ResourceStore.key/4` does, because the
1542
+ # daemon and this wrapper must name one repository one way. `-R AIUR-Team/Aiur`
1543
+ # and a webhook's `aiur-team/aiur` are the same repository; filed apart, the
1544
+ # daemon would retire entries no agent reads while agents keep serving the
1545
+ # ones it meant to retire — wrong in the one direction a cache may not be.
1546
+ if command -v tr >/dev/null 2>&1; then
1547
+ cache_identity=$(printf '%s/%s' "$cache_owner" "$cache_repo_name" | tr '[:upper:]' '[:lower:]')
1548
+ case "$cache_identity" in
1549
+ ?*/?*)
1550
+ cache_owner=${cache_identity%%/*}
1551
+ cache_repo_name=${cache_identity#*/}
1552
+ ;;
1553
+ *) cache_root= ;;
1554
+ esac
1555
+ unset cache_identity
1556
+ else
1557
+ # No `tr`, no way to guarantee one spelling. Caching nothing is the safe
1558
+ # answer; a half-shared store is worse than none.
1559
+ cache_root=
1560
+ fi
1561
+ fi
1562
+
1563
+ if [ -n "$cache_root" ] && [ -n "$cache_owner" ] && [ -n "$cache_repo_name" ]; then
1564
+ cache_repo_dir=$cache_root/v1/$cache_owner/$cache_repo_name
1565
+ fi
1566
+
1567
+ if [ "$cache_reads" -eq 1 ] && [ -n "$cache_repo_dir" ] && [ -n "$cache_kind" ] && [ -n "$cache_id" ]; then
1568
+ cache_shape=$(cache_material "$@" | cache_fingerprint) || cache_shape=
1569
+ if cache_valid_digest "$cache_shape"; then
1570
+ cache_entry_dir=$cache_repo_dir/$cache_kind/$cache_id
1571
+ cache_body=$cache_entry_dir/$cache_shape.body
1572
+ cache_meta=$cache_entry_dir/$cache_shape.meta
1573
+ else
1574
+ cache_shape=
1575
+ fi
1576
+ fi
1577
+
1578
+ if [ -n "$agent_quota_dir" ]; then cache_events_file=$agent_quota_dir/agent-cache.tsv; fi
1579
+
1580
+ # U8 attribution and U9's debug page read this: one row per cacheable
1581
+ # invocation, so agent-side effectiveness is a counted fact rather than an
1582
+ # inference from falling request rates.
1583
+ cache_record() {
1584
+ [ -n "$cache_events_file" ] || return 0
1585
+
1586
+ cache_events_size=0
1587
+ if [ -f "$cache_events_file" ]; then
1588
+ cache_events_size=$(wc -c < "$cache_events_file" 2>/dev/null || printf '0')
1589
+ fi
1590
+ case "$cache_events_size" in
1591
+ ''|*[!0-9]*) cache_events_size=0 ;;
1592
+ esac
1593
+ if [ "$cache_events_size" -gt 1048576 ]; then
1594
+ # Timestamped rotations retain the complete 24-hour measurement window.
1595
+ # The pid keeps simultaneous writers from replacing one another's archive;
1596
+ # row timestamps, not filenames, decide which samples enter the ratio.
1597
+ mv -f "$cache_events_file" "$cache_events_file.$cache_started_at.$$" 2>/dev/null || true
1598
+
1599
+ # Pruning is outside the call's output descriptors and keeps a one-hour
1600
+ # safety margin beyond the reader's window. `-mmin` and `-delete` are
1601
+ # non-POSIX, so this is gated exactly as `cache_prune` gates its own use of
1602
+ # them: on a host without GNU/BSD find the prune is a no-op rather than a
1603
+ # silent failure that lets archives accumulate.
1604
+ if command -v find >/dev/null 2>&1; then
1605
+ (
1606
+ find "$agent_quota_dir" -type f -name 'agent-cache.tsv.*' -mmin +1500 -delete || true
1607
+ ) >/dev/null 2>&1 &
1608
+ fi
1609
+ fi
1610
+
1611
+ # Sixth column: the miss reason, written on every miss (#2299). Hits, stores
1612
+ # and coalesced replays are 5-column rows by design.
1613
+ if [ -n "${2:-}" ]; then
1614
+ printf '%s\t%s\t%s\t%s\t%s\t%s\n' "$cache_started_at" "$consumer" "$1" "${cache_kind:-unknown}" "${cache_id:-unknown}" "$2" \
1615
+ >> "$cache_events_file" 2>/dev/null || true
1616
+ else
1617
+ printf '%s\t%s\t%s\t%s\t%s\n' "$cache_started_at" "$consumer" "$1" "${cache_kind:-unknown}" "${cache_id:-unknown}" \
1618
+ >> "$cache_events_file" 2>/dev/null || true
1619
+ fi
1620
+ unset cache_events_size
1621
+ return 0
1622
+ }
1623
+
1624
+ # Reads use the shell's own `read` rather than `sed` so a hit spends no
1625
+ # subprocess on freshness at all. #1984 measures the broker at 250-450ms and
1626
+ # two `python3` spawns per call; a cache that added its own spawns to every
1627
+ # lookup would hand back what it saved.
1628
+ cache_marker_at() {
1629
+ [ -f "$1" ] || return 0
1630
+
1631
+ cache_marker_value=
1632
+ IFS= read -r cache_marker_value < "$1" 2>/dev/null || cache_marker_value=
1633
+ case "$cache_marker_value" in
1634
+ ''|*[!0-9]*) cache_marker_value=0 ;;
1635
+ esac
1636
+ if [ "$cache_marker_value" -gt "$cache_invalidated_at" ]; then cache_invalidated_at=$cache_marker_value; fi
1637
+ unset cache_marker_value
1638
+ return 0
1639
+ }
1640
+
1641
+ cache_lookup() {
1642
+ cache_miss_reason=absent
1643
+ [ -n "$cache_body" ] || return 1
1644
+ if [ "$cache_bypass" -ne 0 ]; then cache_miss_reason=bypassed; return 1; fi
1645
+ [ -f "$cache_meta" ] || return 1
1646
+ # A meta that survived but whose body did not is a torn entry, not a cold
1647
+ # read: `cache_prune` or a partial disk-full write left the stamp behind.
1648
+ # Recorded as `absent` it reads on the dashboard as a cold cache with diverse
1649
+ # shapes and store-integrity failures go unseen — the misdiagnosis #2207
1650
+ # exists to prevent. It is a distinct cause from `corrupt` (present but
1651
+ # unreadable) and from `absent` (nothing was ever stored).
1652
+ [ -f "$cache_body" ] || { cache_miss_reason=torn; return 1; }
1653
+ if [ ! -r "$cache_body" ]; then cache_miss_reason=corrupt; return 1; fi
1654
+
1655
+ cache_fetched_at=
1656
+ IFS= read -r cache_fetched_at < "$cache_meta" 2>/dev/null || { cache_miss_reason=corrupt; return 1; }
1657
+ case "$cache_fetched_at" in
1658
+ ''|*[!0-9]*) cache_miss_reason=corrupt; return 1 ;;
1659
+ esac
1660
+
1661
+ # A clock that moved backwards, or an entry stamped in the future, is not
1662
+ # something to reason about — treat it as a miss and re-fetch.
1663
+ #
1664
+ # Compared against `$cache_now` rather than this process's start: a coalesced
1665
+ # follower looks again after waiting, and measured from its start an entry the
1666
+ # leader wrote one second later would read as stamped in the future and be
1667
+ # refused — precisely the duplicate fetch the wait existed to avoid.
1668
+ if [ "$cache_fetched_at" -gt "$cache_now" ]; then cache_miss_reason=clock-skewed; return 1; fi
1669
+ if [ $((cache_now - cache_fetched_at)) -gt "$cache_ttl" ]; then cache_miss_reason=expired; return 1; fi
1670
+
1671
+ cache_invalidated_at=0
1672
+ cache_marker_at "$cache_root/v1/.invalidated"
1673
+ cache_marker_at "$cache_repo_dir/.invalidated"
1674
+ [ "$cache_collection" -eq 0 ] || cache_marker_at "$cache_repo_dir/.collections-invalidated"
1675
+ cache_marker_at "$cache_entry_dir/.invalidated"
1676
+
1677
+ if [ "$cache_fetched_at" -le "$cache_invalidated_at" ]; then cache_miss_reason=invalidated; return 1; fi
1678
+ cache_miss_reason=
1679
+ return 0
1680
+ }
1681
+
1682
+ cache_write_file() {
1683
+ cache_write_target=$1
1684
+ cache_write_tmp=$1.$$.tmp
1685
+
1686
+ case "$cache_write_target" in
1687
+ */*) mkdir -p "${cache_write_target%/*}" 2>/dev/null || { unset cache_write_target cache_write_tmp; return 1; } ;;
1688
+ esac
1689
+
1690
+ if printf '%s\n' "$2" > "$cache_write_tmp" 2>/dev/null &&
1691
+ mv -f "$cache_write_tmp" "$cache_write_target" 2>/dev/null; then
1692
+ unset cache_write_target cache_write_tmp
1693
+ return 0
1694
+ fi
1695
+
1696
+ rm -f "$cache_write_tmp" 2>/dev/null || true
1697
+ unset cache_write_target cache_write_tmp
1698
+ return 1
1699
+ }
1700
+
1701
+ # Marked with the moment the mutation FINISHED, and entries with the moment
1702
+ # their read STARTED. Both choices are load-bearing:
1703
+ #
1704
+ # * A read that began before the write completed is retired even if its
1705
+ # response arrived afterwards, because its stamp predates the marker.
1706
+ # Stamping the marker at the mutation's start would leave that read — which
1707
+ # cannot contain the change — looking newer than the change, and an agent
1708
+ # would be unable to see the comment it had just posted for the whole
1709
+ # window.
1710
+ # * The error runs one way only: a read that genuinely postdates the write is
1711
+ # also retired when it began within the same second, costing one re-fetch.
1712
+ # Over-invalidation is the only acceptable direction here.
1713
+ cache_invalidate_writes() {
1714
+ [ -n "$cache_root" ] || return 0
1715
+ [ "$direction" = write ] || return 0
1716
+
1717
+ cache_finished_at=$(date -u +%s 2>/dev/null || printf '')
1718
+ case "$cache_finished_at" in ''|*[!0-9]*) cache_finished_at=$cache_started_at ;; esac
1719
+ case "$cache_finished_at" in ''|*[!0-9]*) return 0 ;; esac
1720
+
1721
+ if [ -z "$cache_repo_dir" ]; then
1722
+ # A write whose repository could not be identified may have changed
1723
+ # anything, so nothing may be trusted. This is deliberately blunt: a rare
1724
+ # over-invalidation costs one re-fetch, while a missed one serves a stale
1725
+ # answer for the whole freshness window.
1726
+ cache_write_file "$cache_root/v1/.invalidated" "$cache_finished_at" || true
1727
+ unset cache_finished_at
1728
+ return 0
1729
+ fi
1730
+
1731
+ cache_write_file "$cache_repo_dir/.collections-invalidated" "$cache_finished_at" || true
1732
+
1733
+ case "$cache_write_id" in
1734
+ # A write whose subject is a SUBRESOURCE — a comment id, a review id — names
1735
+ # a number that is not an issue or pull request number, and the parent it
1736
+ # belongs to is not derivable from it. Retiring the repository for it would
1737
+ # be correct and ruinous: agents rewrite their workpad comment every few
1738
+ # minutes, so every edit would flush the whole store and the sharing this
1739
+ # exists for would never happen. The collections marker is the honest scope.
1740
+ collection|subresource) ;;
1741
+ ''|*[!0-9]*) cache_write_file "$cache_repo_dir/.invalidated" "$cache_finished_at" || true ;;
1742
+ *)
1743
+ cache_write_file "$cache_repo_dir/pr/$cache_write_id/.invalidated" "$cache_finished_at" || true
1744
+ cache_write_file "$cache_repo_dir/issue/$cache_write_id/.invalidated" "$cache_finished_at" || true
1745
+ ;;
1746
+ esac
1747
+
1748
+ unset cache_finished_at
1749
+ return 0
1750
+ }
1751
+
1752
+ cache_store() {
1753
+ [ -n "$cache_body" ] || return 0
1754
+ [ -n "$cache_stage" ] && [ -f "$cache_stage" ] || return 0
1755
+ [ "${status:-1}" -eq 0 ] || return 0
1756
+
1757
+ cache_size=$(wc -c < "$cache_stage" 2>/dev/null || printf '')
1758
+ case "$cache_size" in
1759
+ ''|*[!0-9]*) unset cache_size; return 0 ;;
1760
+ esac
1761
+ if [ "$cache_size" -gt "$cache_max_bytes" ]; then unset cache_size; return 0; fi
1762
+ unset cache_size
1763
+
1764
+ mkdir -p "$cache_entry_dir" 2>/dev/null || return 0
1765
+
1766
+ cache_body_tmp=$cache_body.$$.tmp
1767
+ if cat "$cache_stage" > "$cache_body_tmp" 2>/dev/null && mv -f "$cache_body_tmp" "$cache_body" 2>/dev/null; then
1768
+ # The body lands first and the stamp commits the entry, so a reader that
1769
+ # finds a readable stamp always finds a complete body behind it. Line 1 of
1770
+ # the meta stays the fetched-at stamp (the only line `cache_lookup` reads);
1771
+ # line 2, when present, is the response ETag a later re-read validates
1772
+ # against (#2307 conditional reads). No other reader touches line 2.
1773
+ cache_meta_body=$cache_started_at
1774
+ if [ -n "$cache_response_etag" ]; then cache_meta_body="$cache_started_at
1775
+ $cache_response_etag"; fi
1776
+ cache_write_file "$cache_meta" "$cache_meta_body" || rm -f "$cache_body" 2>/dev/null || true
1777
+ cache_record store
1778
+ unset cache_meta_body
1779
+ else
1780
+ rm -f "$cache_body_tmp" 2>/dev/null || true
1781
+ fi
1782
+
1783
+ unset cache_body_tmp
1784
+ return 0
1785
+ }
1786
+
1787
+ # Entries are never read after their window closes, so retention exists only to
1788
+ # stop the store growing without bound. Backgrounded and rate-limited to once an
1789
+ # hour so it never appears in the latency of a call.
1790
+ cache_prune() {
1791
+ [ -n "$cache_root" ] || return 0
1792
+ [ -d "$cache_root/v1" ] || return 0
1793
+ command -v find >/dev/null 2>&1 || return 0
1794
+
1795
+ cache_pruned_at=0
1796
+ if [ -f "$cache_root/v1/.pruned" ]; then
1797
+ IFS= read -r cache_pruned_at < "$cache_root/v1/.pruned" 2>/dev/null || cache_pruned_at=0
1798
+ case "$cache_pruned_at" in
1799
+ ''|*[!0-9]*) cache_pruned_at=0 ;;
1800
+ esac
1801
+ fi
1802
+
1803
+ if [ $((cache_started_at - cache_pruned_at)) -lt 3600 ]; then unset cache_pruned_at; return 0; fi
1804
+ unset cache_pruned_at
1805
+ cache_write_file "$cache_root/v1/.pruned" "$cache_started_at" || return 0
1806
+
1807
+ # The subshell's own descriptors are redirected, not just the `find`'s: a
1808
+ # background job keeping a copy of this script's stdout holds the pipe open,
1809
+ # and `$(gh pr view ...)` blocks on EOF — so an unredirected sweep would stall
1810
+ # the very command it was meant to be invisible to.
1811
+ (
1812
+ find "$cache_root/v1" -type f \( -name '*.body' -o -name '*.meta' \) -mmin +120 -delete || true
1813
+ ) >/dev/null 2>&1 &
1814
+
1815
+ return 0
1816
+ }
1817
+
1818
+ # Answers with the stored bytes, or refuses. `cat` is checked because the entry
1819
+ # can go away between the readability test and the read, and an unchecked `cat`
1820
+ # would hand the agent empty stdout with exit 0, which `out=$(gh pr view N
1821
+ # --json body -q .body)` reads as "the body is empty". A refusal here falls
1822
+ # through to the real `gh`, the same answer every other doubt in this file
1823
+ # produces.
1824
+ cache_serve() {
1825
+ if ! cat "$cache_body"; then
1826
+ # Body vanished between lookup and read — the miss is `corrupt`, not `absent`.
1827
+ cache_miss_reason=corrupt
1828
+ return 1
1829
+ fi
1830
+ cache_record "$1"
1831
+ return 0
1832
+ }
1833
+
1834
+ # A second look, with the clock re-sampled. Between a caller's own lookup and
1835
+ # the moment it is admitted to spend, another agent's identical fetch can land —
1836
+ # so every point where this call is about to reach GitHub asks once more first.
1837
+ # One `date` and a handful of stats against a network round trip.
1838
+ cache_recheck() {
1839
+ [ -n "$cache_body" ] || return 1
1840
+
1841
+ cache_now=$(date -u +%s 2>/dev/null || printf '%s' "$cache_started_at")
1842
+ case "$cache_now" in ''|*[!0-9]*) cache_now=$cache_started_at ;; esac
1843
+
1844
+ cache_lookup
1845
+ }
1846
+
1847
+ if cache_lookup && cache_serve hit; then
1848
+ exit 0
1849
+ fi
1850
+
1851
+ [ -z "$cache_body" ] || cache_record miss "${cache_miss_reason:-absent}"
1852
+
1853
+ # COALESCING (#2073 U6). A hit above costs no `python3` and no network, so the
1854
+ # store already removes the second and later reads of a resource. It cannot
1855
+ # remove the SIMULTANEOUS ones: agents that all look before any answers all
1856
+ # miss and all pay. So the miss path names the shape it is about to fetch, and
1857
+ # the broker — the one place every agent on the host meets under a transaction —
1858
+ # admits one fetcher per shape and tells the rest to wait, look again, and find
1859
+ # the leader's answer. The claim is bounded by its own TTL and the waiter's
1860
+ # patience, so a leader that dies costs one duplicate fetch, never a stall. A
1861
+ # caller demanding strict freshness refuses stored answers by definition, so it
1862
+ # takes no part in this.
1863
+ #
1864
+ # The key's members are all constrained: owner and repo pass `cache_valid_slug`
1865
+ # (`[A-Za-z0-9./_-]`, no `..`), the kind is a literal, the id is digits, `list`
1866
+ # or a hex digest, and the shape is a 64-character hex digest. That is what makes
1867
+ # the unquoted expansion into the broker's argument list below safe; relax
1868
+ # `cache_valid_slug` and this becomes argument injection.
1869
+ cache_claim_key=
1870
+ if [ -n "$cache_body" ] && [ -n "$cache_shape" ] && [ "$cache_bypass" -eq 0 ]; then
1871
+ cache_claim_key=$cache_owner/$cache_repo_name/$cache_kind/$cache_id/$cache_shape
1872
+ fi
1873
+
1874
+ # How long a follower waits for the leader before deciding it is not coming and
1875
+ # fetching for itself. Bounded on purpose: a wait that could outlast the call it
1876
+ # replaces would turn a saving into a hang. Measured against the CLOCK, not the
1877
+ # sleeps the broker advertised — each iteration also pays a `python3` start and
1878
+ # a SQLite write transaction, so counting only the advertised sleep understated
1879
+ # the real wait by more than 2x.
1880
+ cache_claim_wait_budget_ms=${AIUR_GITHUB_STATE_CACHE_WAIT_MS:-15000}
1881
+ case "$cache_claim_wait_budget_ms" in ''|*[!0-9]*) cache_claim_wait_budget_ms=15000 ;; esac
1882
+ cache_claim_wait_budget=$(( (cache_claim_wait_budget_ms + 999) / 1000 ))
1883
+ cache_claim_waited_ms=0
1884
+ cache_claim_overtake=0
1885
+ cache_served=0
1886
+
1887
+ budget_command() {
1888
+ if [ -n "$budget_identity_key" ]; then
1889
+ python3 "$budget_broker" "$@" --db "$budget_db" --token-key "$budget_key" --identity-key "$budget_identity_key"
1890
+ else
1891
+ python3 "$budget_broker" "$@" --db "$budget_db" --token-key "$budget_key"
1892
+ fi
1893
+ }
1894
+
1895
+ budget_sleep_ms() {
1896
+ budget_delay=$1
1897
+ case "$budget_delay" in ''|0|*[!0-9]*) return 1 ;; esac
1898
+ budget_seconds=$(awk "BEGIN { printf \"%.3f\", $budget_delay / 1000 }")
1899
+ sleep "$budget_seconds"
1900
+ }
1901
+
1902
+ # The broker's captured stdout+stderr, folded into one bounded line fit for an
1903
+ # error message. A traceback is several lines and a SQLite message can be long,
1904
+ # and this text is read out of a CI log and an ExUnit failure, so it is squeezed
1905
+ # to single spaces and truncated. Empty output is itself a diagnosis — a
1906
+ # subprocess that died on a signal says nothing — so it is named rather than
1907
+ # left as an empty parenthesis.
1908
+ budget_diagnostic_line() {
1909
+ budget_diagnostic=$(printf '%s\n' "$1" | tr '\n\t' ' ' | sed -e 's/ */ /g' -e 's/^ //' -e 's/ $//' | cut -c1-400)
1910
+ if [ -n "$budget_diagnostic" ]; then
1911
+ printf '%s' "$budget_diagnostic"
1912
+ else
1913
+ printf '%s' 'broker exited non-zero without output'
1914
+ fi
1915
+ unset budget_diagnostic
1916
+ }
1917
+
1918
+ # Whether the broker's own diagnostic says it could not reach its storage. Only
1919
+ # then is the ownership/permissions/writableRoots recovery text the right advice:
1920
+ # it IS the fix for a budget root the sandbox never granted, and it is noise for
1921
+ # a broker that opened the ledger fine and aborted on something else. Matching on
1922
+ # what the broker actually reported is what keeps this from becoming the blanket
1923
+ # misdiagnosis it replaced (#2499).
1924
+ budget_storage_failure() {
1925
+ case "$1" in
1926
+ *"unable to open database file"*|*"readonly database"*|*"read-only database"*) return 0 ;;
1927
+ *"Permission denied"*|*"permission denied"*|*"Errno 13"*|*"disk I/O error"*) return 0 ;;
1928
+ esac
1929
+ return 1
1930
+ }
1931
+
1932
+ valid_budget_lease() {
1933
+ case "$1" in ''|*[!0-9abcdef]*) return 1 ;; esac
1934
+ [ "${#1}" -eq 32 ]
1935
+ }
1936
+
1937
+ valid_budget_hold_reset() {
1938
+ case "$1" in ''|*[!0-9]*) return 1 ;; esac
1939
+
1940
+ python3 - "$1" <<'PY'
1941
+ import sys
1942
+ import time
1943
+
1944
+ # Mirrors the Elixir-side bounded window in `GithubBudgetPause.parse/3`: a
1945
+ # reset no more than 24h in the future or 5 minutes in the past is a live
1946
+ # hold; anything older in the past is a stale or forged value and must not be
1947
+ # accepted as a typed hold (which would clamp to a zero delay and re-pause
1948
+ # immediately).
1949
+ reset_at_ms = int(sys.argv[1])
1950
+ now_ms = time.time_ns() // 1_000_000
1951
+ sys.exit(0 if now_ms - 300_000 <= reset_at_ms <= now_ms + 86_400_000 else 1)
1952
+ PY
1953
+ }
1954
+
1955
+ budget_acquire() {
1956
+ [ "$budget_enabled" -eq 1 ] || return 0
1957
+
1958
+ # Free endpoints (the shared EndpointPolicy table marks only `rate_limit`
1959
+ # non-billable) are still admitted and leased for ordering, but their
1960
+ # admission row must be recorded non-billable so the ledger never reports
1961
+ # them as spend — the same `--billable 0` the daemon's Budget path passes
1962
+ # (#2353). The broker defaults to `1`, so omitting this would bill every
1963
+ # `/rate_limit` probe as core spend.
1964
+ budget_billable_flag=
1965
+ [ "$endpoint_family" = rate_limit ] && budget_billable_flag="--billable 0"
1966
+
1967
+ while :; do
1968
+ # Whatever this loop last waited for — a hold, a full lease table, another
1969
+ # agent's identical fetch — the answer may have arrived meanwhile. Looking
1970
+ # again is a stat and a `read`, so it is cheaper than any of the reasons the
1971
+ # loop is here.
1972
+ if [ "$cache_claim_waited_ms" -gt 0 ] && cache_recheck && cache_serve coalesced; then
1973
+ cache_served=1
1974
+ return 66
1975
+ fi
1976
+
1977
+ budget_ignore_flag=
1978
+ [ "$budget_ignore_token_cooldown" -eq 1 ] && budget_ignore_flag=--ignore-token-cooldown
1979
+ budget_cache_flags=
1980
+ if [ -n "$cache_claim_key" ]; then
1981
+ budget_cache_flags="--cache-key $cache_claim_key --cache-claim-ttl-ms $budget_lease_ttl_ms"
1982
+ [ "$cache_claim_overtake" -eq 1 ] && budget_cache_flags="$budget_cache_flags --cache-ignore-claim"
1983
+ fi
1984
+ if ! budget_result=$(budget_command acquire --resource "$admission_resource" --consumer-key "$budget_consumer_key" --consumer-label "$budget_consumer_label" --endpoint-family "$endpoint_family" \
1985
+ $budget_ignore_flag $budget_cache_flags $budget_billable_flag \
1986
+ --max-inflight "${AIUR_GITHUB_MAX_INFLIGHT:-4}" \
1987
+ --max-inflight-per-endpoint "${AIUR_GITHUB_MAX_INFLIGHT_PER_ENDPOINT:-2}" \
1988
+ --requests-per-minute "${AIUR_GITHUB_REQUESTS_PER_MINUTE:-120}" \
1989
+ --stagger-ms "${AIUR_GITHUB_STAGGER_MS:-75}" --lease-ttl-ms "$budget_lease_ttl_ms" \
1990
+ --core-limit "${AIUR_GITHUB_CORE_LIMIT_PER_HOUR:-0}" \
1991
+ --graphql-limit "${AIUR_GITHUB_GRAPHQL_LIMIT_PER_HOUR:-0}" \
1992
+ --search-limit "${AIUR_GITHUB_SEARCH_LIMIT_PER_HOUR:-0}" 2>&1); then
1993
+ # A broker that predates the ledger schema (the trigger refuses its
1994
+ # lease-less admission INSERT) or the ledger's version stamp cannot be
1995
+ # admitted to this ledger. That is exactly the stale-broker population
1996
+ # #2307 exists for, and failing closed here would turn a working-but-
1997
+ # over-billing workspace into a hard `gh` outage with zero alerts: acquire
1998
+ # aborts before a lease exists, so the reconcile marker machinery would
1999
+ # never run. Fail OPEN instead — the request proceeds uncoordinated, just
2000
+ # as the stale broker behaved before the ledger was versioned — and write
2001
+ # the marker once so the daemon raises a fleet alert.
2002
+ if budget_stale_abort "$budget_result"; then
2003
+ budget_mark_stale_broker acquire
2004
+ return 0
2005
+ fi
2006
+ # The broker told us why it failed; say that instead of guessing. This
2007
+ # message used to print only `$budget_recovery`, which names ownership,
2008
+ # permissions and `writableRoots` as the cause. For a broker subprocess
2009
+ # that aborted on its own — a SQLite error, a Python traceback — that is a
2010
+ # confident misdiagnosis, and it sent readers to repair a directory the
2011
+ # caller had just created successfully (#2499). The captured output is the
2012
+ # evidence; the root is a locator, not a diagnosis. The recovery text is
2013
+ # kept for the one case it actually diagnoses — a broker that could not
2014
+ # reach its storage — so a genuinely ungranted budget root still tells the
2015
+ # operator how to repair it.
2016
+ budget_failure=$(budget_diagnostic_line "$budget_result")
2017
+ if budget_storage_failure "$budget_failure"; then
2018
+ printf 'aiur: GitHub budget broker unavailable (%s; %s); refusing uncoordinated request\n' \
2019
+ "$budget_failure" "$budget_recovery" >&2
2020
+ else
2021
+ printf 'aiur: GitHub budget broker unavailable (%s; budget root %s); refusing uncoordinated request\n' \
2022
+ "$budget_failure" "$budget_root" >&2
2023
+ fi
2024
+ unset budget_failure
2025
+ return 75
2026
+ fi
2027
+ unset budget_ignore_flag budget_cache_flags
2028
+
2029
+ # The broker's response is the last non-empty line of its output. Stderr is
2030
+ # merged into $budget_result above (2>&1) so a stale-broker abort's trigger
2031
+ # or stamp message reaches budget_stale_abort, but a HEALTHY broker's stderr
2032
+ # — a Python DeprecationWarning, a wrapper notice, a locale complaint —
2033
+ # must not corrupt the protocol parse. The response is single-line, so take
2034
+ # the last non-empty line and match on that, not on the merged stream
2035
+ # (#2307 review: the 2>&1 change had re-opened an outage on healthy brokers
2036
+ # whose prefix-matched grant was buried under stderr noise).
2037
+ budget_result=$(printf '%s\n' "$budget_result" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' -e '/^$/d' | tail -n 1)
2038
+
2039
+ case "$budget_result" in
2040
+ "granted "*)
2041
+ budget_lease=${budget_result#granted }
2042
+ if valid_budget_lease "$budget_lease"; then
2043
+ # Admitted, and therefore about to spend. A grant is proof this
2044
+ # workspace's broker is current for the ledger, so any stale-broker
2045
+ # marker left by an earlier structural failure is cleared here as well
2046
+ # as by the reconcile path — a refreshed workspace that never happens
2047
+ # to see a 304 must not keep alerting (#2307 review).
2048
+ budget_clear_stale_broker acquire
2049
+ # The window between this
2050
+ # call's own lookup and this grant is exactly where a simultaneous
2051
+ # reader's answer lands, and it is not covered by the claim: a caller
2052
+ # arriving after the leader released has no claim to wait behind and
2053
+ # would fetch a resource that is already in the store.
2054
+ if [ -n "$cache_claim_key" ] && cache_recheck && cache_serve coalesced; then
2055
+ cache_served=1
2056
+ budget_release
2057
+ return 66
2058
+ fi
2059
+
2060
+ return 0
2061
+ fi
2062
+ printf '%s\n' 'aiur: GitHub budget broker returned an invalid admission response' >&2
2063
+ return 75
2064
+ ;;
2065
+ "hold shared "*)
2066
+ budget_hold=${budget_result#hold shared }
2067
+ budget_hold_resource=${budget_hold%% *}
2068
+ budget_hold_reset_at_ms=${budget_hold#* }
2069
+ case "$budget_hold_resource:$budget_hold_reset_at_ms" in
2070
+ core:*|graphql:*)
2071
+ if valid_budget_hold_reset "$budget_hold_reset_at_ms"; then
2072
+ printf 'aiur: github budget hold resource=%s reset_at_ms=%s\n' \
2073
+ "$budget_hold_resource" "$budget_hold_reset_at_ms" >&2
2074
+ return 75
2075
+ fi
2076
+ ;;
2077
+ esac
2078
+ printf '%s\n' 'aiur: GitHub budget broker returned an invalid shared hold response' >&2
2079
+ return 75
2080
+ ;;
2081
+ "wait "*)
2082
+ budget_wait_ms=${budget_result#wait }
2083
+ # An actor-ceiling hold is `wait actor <ms>`; the `actor` token is the
2084
+ # Elixir side's cue for the hold reason and is not part of the delay.
2085
+ budget_wait_ms=${budget_wait_ms#actor }
2086
+ if ! budget_sleep_ms "$budget_wait_ms"; then
2087
+ printf '%s\n' 'aiur: GitHub budget broker returned an invalid or unusable wait response' >&2
2088
+ return 75
2089
+ fi
2090
+ case "$budget_wait_ms" in
2091
+ ''|*[!0-9]*) ;;
2092
+ *) cache_claim_waited_ms=$((cache_claim_waited_ms + budget_wait_ms)) ;;
2093
+ esac
2094
+ # Patience spent. The leader may have died between claiming the resource
2095
+ # and answering for it, and a follower that waits forever on a dead
2096
+ # leader has been made worse off by the optimisation. Overtake the claim
2097
+ # and fetch; the cost is the one call this was trying to save.
2098
+ if [ -n "$cache_claim_key" ] && [ "$cache_claim_overtake" -eq 0 ]; then
2099
+ cache_waited=$(date -u +%s 2>/dev/null || printf '')
2100
+ case "$cache_waited" in
2101
+ ''|*[!0-9]*) ;;
2102
+ *)
2103
+ if [ $((cache_waited - cache_started_at)) -ge "$cache_claim_wait_budget" ]; then
2104
+ cache_claim_overtake=1
2105
+ fi
2106
+ ;;
2107
+ esac
2108
+ unset cache_waited
2109
+ fi
2110
+ unset budget_wait_ms
2111
+ ;;
2112
+ *)
2113
+ printf '%s\n' 'aiur: GitHub budget broker returned an invalid admission response' >&2
2114
+ return 75
2115
+ ;;
2116
+ esac
2117
+ done
2118
+ }
2119
+
2120
+ budget_release() {
2121
+ if [ -n "$budget_renewal_pid" ]; then
2122
+ kill "$budget_renewal_pid" 2>/dev/null || true
2123
+ budget_renewal_pid=
2124
+ fi
2125
+ [ -n "$budget_lease" ] || return 0
2126
+ budget_command release --lease-id "$budget_lease" >/dev/null 2>&1 || true
2127
+ budget_lease=
2128
+ }
2129
+
2130
+ # A stale-broker acquire abort: the ledger's schema trigger refused this
2131
+ # broker's lease-less admission INSERT, or the version stamp refused the write.
2132
+ # Both strings are this project's own (the trigger and `_ensure_writable`), so
2133
+ # this is not coupled to argparse or Python wording. Every other acquire failure
2134
+ # stays fail-closed exactly as before.
2135
+ budget_stale_abort() {
2136
+ case "$1" in
2137
+ *"refusing admission without a lease_id"*|*"refusing to write: ledger is stamped"*)
2138
+ return 0
2139
+ ;;
2140
+ esac
2141
+ return 1
2142
+ }
2143
+
2144
+ # The marker write and the one-time stderr are the same event: the first
2145
+ # structural stale-broker failure in a period surfaces once, and every later
2146
+ # failure in that period (while the marker still stands) stays quiet so a fleet
2147
+ # of 304s does not become per-request noise (#2307). The daemon's quota reader
2148
+ # turns the marker into one fleet alert per workspace and rearms it when the
2149
+ # marker disappears (a refreshed broker self-heals). Line 1 is the consumer
2150
+ # label the daemon reads; line 2 records WHY the marker was written so the
2151
+ # guard can decide which recovery signal may clear it (#2307 review).
2152
+ budget_mark_stale_broker() {
2153
+ budget_stale_reason=$1
2154
+ if [ -n "$agent_quota_dir" ] && [ ! -f "$agent_quota_dir/broker-reconcile-stale" ]; then
2155
+ printf '%s\n%s\n' "$budget_consumer_label" "$budget_stale_reason" > "$agent_quota_dir/broker-reconcile-stale" 2>/dev/null || true
2156
+ printf '%s\n' 'aiur: GitHub budget broker is stale for this ledger (missing reconcile subcommand, or predates the ledger schema/version stamp); budget accounting for this workspace is disabled until the current broker is installed' >&2
2157
+ fi
2158
+ unset budget_stale_reason
2159
+ }
2160
+
2161
+ # Which recovery signal may clear the marker depends on why it was written.
2162
+ # acquire marker: the broker could not even be admitted to the ledger. The
2163
+ # first successful grant is proof the workspace now runs a broker
2164
+ # the daemon's release accepts, so it clears the marker even if
2165
+ # the workspace never happens to see a 304 (#2307 review).
2166
+ # reconcile marker: the broker IS admitted but cannot reconcile 304s. A later
2167
+ # grant does not prove reconcile works, so clearing on every grant
2168
+ # would re-alert on the next 304 — exactly the per-request noise
2169
+ # #2307 forbids. Only a successful reconcile clears it.
2170
+ # unknown (a marker written before this rework, single line): conservative —
2171
+ # cleared only by a successful reconcile, same as before.
2172
+ budget_clear_stale_broker() {
2173
+ budget_stale_signal=$1
2174
+ [ -n "$agent_quota_dir" ] && [ -f "$agent_quota_dir/broker-reconcile-stale" ] || { unset budget_stale_signal; return 0; }
2175
+ budget_marker_reason=$(sed -n '2p' "$agent_quota_dir/broker-reconcile-stale" 2>/dev/null || printf '')
2176
+ case "$budget_stale_signal:$budget_marker_reason" in
2177
+ reconcile:*|acquire:acquire)
2178
+ rm -f "$agent_quota_dir/broker-reconcile-stale" 2>/dev/null || true
2179
+ ;;
2180
+ esac
2181
+ unset budget_stale_signal budget_marker_reason
2182
+ }
2183
+
2184
+ # A reconcile failure is structural — broker predates the `reconcile`
2185
+ # subcommand, is older than the ledger's version stamp, cannot write to the
2186
+ # ledger, or cannot run at all — unless it is a transient SQLite lock that can
2187
+ # succeed on the next attempt. Distinguish by content, not by exit code: every
2188
+ # structural case must be surfaced once rather than silently swallowed on every
2189
+ # 304, and the argparse "invalid choice" wording is deliberately not matched
2190
+ # (it is not a stability contract across Python versions; the trigger and stamp
2191
+ # messages above are this project's own).
2192
+ budget_reconcile_transient() {
2193
+ # $1 is the broker's merged output, $2 its exit status. A SLOW broker is not a
2194
+ # STALE one, and only staleness may raise the fleet alert: a `reconcile`-reason
2195
+ # marker is cleared by nothing but a later successful reconcile, so misreading
2196
+ # one transient fault as structural latches a permanent alert on a healthy
2197
+ # workspace. Death by signal (128+N — an OOM kill, a supervisor SIGKILL, a
2198
+ # SIGTERM at shutdown) and a non-zero exit with no output at all are both the
2199
+ # shape of an interrupted broker, not one that predates the ledger schema.
2200
+ # #2457 shows those faults are live: 28 broker timeouts in ten minutes after a
2201
+ # single daemon restart. Every structural failure still prints something —
2202
+ # argparse usage, the trigger/stamp refusal, `python3: not found`, a traceback
2203
+ # — so it stays on the loud path.
2204
+ case "$2" in
2205
+ 12[89]|1[3-9][0-9]|2[0-9][0-9])
2206
+ return 0
2207
+ ;;
2208
+ esac
2209
+ [ -n "$1" ] || return 0
2210
+ case "$1" in
2211
+ *"database is locked"*|*"database table is locked"*)
2212
+ return 0
2213
+ ;;
2214
+ esac
2215
+ return 1
2216
+ }
2217
+
2218
+ budget_reconcile_response() {
2219
+ [ "$budget_enabled" -eq 1 ] || return 0
2220
+ [ -n "$budget_lease" ] || return 0
2221
+ [ -n "$output_file" ] && [ -f "$output_file" ] || return 0
2222
+
2223
+ if awk '/^HTTP\/[^[:space:]]+[[:space:]]+[0-9][0-9][0-9]/ { status = $2 } END { exit status == 304 ? 0 : 1 }' "$output_file"; then
2224
+ if budget_reconcile_output=$(budget_command reconcile --lease-id "$budget_lease" --status 304 2>&1); then
2225
+ # Reconcile succeeded: a refreshed broker has recovered, so clear any
2226
+ # stale-broker marker left by an earlier structural failure.
2227
+ budget_clear_stale_broker reconcile
2228
+ else
2229
+ budget_reconcile_status=$?
2230
+
2231
+ if ! budget_reconcile_transient "$budget_reconcile_output" "$budget_reconcile_status"; then
2232
+ budget_mark_stale_broker reconcile
2233
+ fi
2234
+ fi
2235
+ fi
2236
+ unset budget_reconcile_output budget_reconcile_status
2237
+ }
2238
+
2239
+ # 304 reconciliation for high-level commands. `gh` only exposes the HTTP status
2240
+ # under `GH_DEBUG=api`, so the guarded run above captured it in `$error_file` as
2241
+ # `< HTTP/... <status>` lines. A high-level command can issue several HTTP
2242
+ # requests under one lease (`gh pr view` resolves the repo through git
2243
+ # subprocesses and then makes one or more API requests), so the reconcile fires
2244
+ # only when EVERY observed status is 304 — a single 304 among 200s must not
2245
+ # mark the whole lease free, which under-reported spend whenever a 200 preceded
2246
+ # a 304 (#2353 review). Then the whole debug transcript is stripped so every
2247
+ # later consumer (rate-limit classification, stderr replay) sees only the real
2248
+ # stderr. A command that produced no debug (budget disabled, no request, a
2249
+ # caller that already set its own debug) is a no-op here.
2250
+ budget_reconcile_debug() {
2251
+ [ "$budget_enabled" -eq 1 ] || return 0
2252
+ [ -n "$budget_lease" ] || return 0
2253
+ [ -n "$error_file" ] && [ -f "$error_file" ] || return 0
2254
+
2255
+ debug_statuses=$(sed -n -E 's/^< HTTP\/[^[:space:]]+[[:space:]]+([0-9]{3}).*/\1/p' "$error_file")
2256
+ all_304=1
2257
+ case "$debug_statuses" in
2258
+ '') all_304=0 ;;
2259
+ *)
2260
+ for debug_status in $debug_statuses; do
2261
+ case "$debug_status" in
2262
+ 304) ;;
2263
+ *) all_304=0; break ;;
2264
+ esac
2265
+ done
2266
+ ;;
2267
+ esac
2268
+ if [ "$all_304" -eq 1 ]; then
2269
+ budget_command reconcile --lease-id "$budget_lease" --status 304 >/dev/null 2>&1 || true
2270
+ fi
2271
+ unset all_304 debug_statuses debug_status
2272
+
2273
+ strip_gh_debug "$error_file"
2274
+ return 0
2275
+ }
2276
+
2277
+ # Drops `GH_DEBUG=api`'s transcript from a stderr capture, keeping only what
2278
+ # gh printed outside it (pre-request warnings and post-request errors). The
2279
+ # transcript is contiguous: every debug line between the request's start and
2280
+ # its `Request took` marker — request headers, request body, response headers,
2281
+ # response body — is removed, and the `[git ...]` subprocess lines `gh` prints
2282
+ # BEFORE the first request marker are dropped too (they are part of the debug
2283
+ # transcript, not caller-facing stderr), so the caller's stderr and the error
2284
+ # classifiers see exactly what they saw before high-level debug was enabled.
2285
+ strip_gh_debug() {
2286
+ [ -f "$1" ] || return 0
2287
+ strip_tmp="$1.dbg.$$"
2288
+ if awk '
2289
+ /^\* Request at / { in_debug = 1; next }
2290
+ in_debug && /^\* Request took / { in_debug = 0; next }
2291
+ !in_debug && /^\[git / { next }
2292
+ !in_debug { print }
2293
+ ' "$1" > "$strip_tmp" 2>/dev/null; then
2294
+ mv -f "$strip_tmp" "$1" 2>/dev/null || rm -f "$strip_tmp" 2>/dev/null || true
2295
+ else
2296
+ rm -f "$strip_tmp" 2>/dev/null || true
2297
+ fi
2298
+ unset strip_tmp
2299
+ return 0
2300
+ }
2301
+
2302
+ budget_start_renewal() {
2303
+ [ -n "$budget_lease" ] || return 0
2304
+ budget_renew_interval=$((budget_lease_ttl_ms / 3 / 1000))
2305
+ [ "$budget_renew_interval" -gt 0 ] || budget_renew_interval=1
2306
+
2307
+ (
2308
+ while sleep "$budget_renew_interval"; do
2309
+ budget_command renew --lease-id "$budget_lease" --lease-ttl-ms "$budget_lease_ttl_ms" >/dev/null 2>&1 || exit 0
2310
+ done
2311
+ ) >/dev/null 2>&1 &
2312
+ budget_renewal_pid=$!
2313
+ unset budget_renew_interval
2314
+ }
2315
+
2316
+ budget_hold() {
2317
+ budget_scope=$1
2318
+ budget_delay=$2
2319
+ budget_resource=${3:-$resource}
2320
+ [ "$budget_enabled" -eq 1 ] || return 0
2321
+ budget_command hold --scope "$budget_scope" --resource "$budget_resource" --delay-ms "$budget_delay" >/dev/null 2>&1 || true
2322
+ }
2323
+
2324
+ # `gh api --paginate` normally makes its follow-up requests inside one gh
2325
+ # process. Re-enter this guard for each REST page instead, so every network
2326
+ # request obtains and releases its own shared broker lease. The child is also
2327
+ # responsible for response observation and quota tracking; it has no
2328
+ # `--paginate` flag, so it follows the ordinary single-request path.
2329
+ run_budgeted_paginated_api() {
2330
+ AIUR_GITHUB_PAGINATION_WRAPPER="$0" AIUR_GITHUB_PAGINATION_REAL_GH="$real_gh" AIUR_GITHUB_PAGINATION_DIRECTION="$direction" python3 - "$@" <<'PY'
2331
+ import http.server
2332
+ import json
2333
+ import os
2334
+ import re
2335
+ import shutil
2336
+ import subprocess
2337
+ import sys
2338
+ import threading
2339
+ from urllib.parse import urlsplit
2340
+
2341
+
2342
+ def split_response(output):
2343
+ match = re.search(br"\r?\n\r?\n", output)
2344
+ if match is None:
2345
+ return b"", output
2346
+ return output[: match.start()], output[match.end() :]
2347
+
2348
+
2349
+ def next_endpoint(headers):
2350
+ for line in headers.decode("utf-8", "replace").splitlines():
2351
+ if not line.lower().startswith("link:"):
2352
+ continue
2353
+ match = re.search(r'<([^>]+)>;\s*rel="next"', line, re.IGNORECASE)
2354
+ if match is None:
2355
+ continue
2356
+ parsed = urlsplit(match.group(1))
2357
+ endpoint = parsed.path or "/"
2358
+ return f"{endpoint}?{parsed.query}" if parsed.query else endpoint
2359
+ return None
2360
+
2361
+
2362
+ def next_cursor(body):
2363
+ try:
2364
+ response = json.loads(body)
2365
+ except json.JSONDecodeError:
2366
+ print("aiur: gh api GraphQL pagination returned a non-JSON page", file=sys.stderr)
2367
+ raise SystemExit(1)
2368
+
2369
+ stack = [response]
2370
+ while stack:
2371
+ value = stack.pop()
2372
+ if isinstance(value, dict):
2373
+ if {"hasNextPage", "endCursor"} <= value.keys():
2374
+ if not value["hasNextPage"]:
2375
+ return None
2376
+ cursor = value["endCursor"]
2377
+ if isinstance(cursor, str) and cursor:
2378
+ return cursor
2379
+ print("aiur: gh api GraphQL pagination returned an invalid endCursor", file=sys.stderr)
2380
+ raise SystemExit(1)
2381
+ stack.extend(value.values())
2382
+ elif isinstance(value, list):
2383
+ stack.extend(value)
2384
+
2385
+ print("aiur: gh api GraphQL pagination response is missing pageInfo", file=sys.stderr)
2386
+ raise SystemExit(1)
2387
+
2388
+
2389
+ def endpoint_index(args):
2390
+ value_flags = {
2391
+ "--cache", "-F", "--field", "-f", "--raw-field", "-H", "--header",
2392
+ "--hostname", "--input", "-q", "--jq", "-X", "--method", "-p",
2393
+ "--preview", "-t", "--template",
2394
+ }
2395
+ awaiting_value = False
2396
+
2397
+ for index, arg in enumerate(args[1:], start=1):
2398
+ if awaiting_value:
2399
+ awaiting_value = False
2400
+ continue
2401
+ if arg == "--":
2402
+ return index + 1 if index + 1 < len(args) else None
2403
+ if arg in value_flags:
2404
+ awaiting_value = True
2405
+ continue
2406
+ if arg in {"--include", "-i", "--silent", "--verbose"}:
2407
+ continue
2408
+ if arg.startswith("--"):
2409
+ continue
2410
+ if arg.startswith("-"):
2411
+ if arg[:2] in {"-F", "-f", "-H", "-q", "-X", "-p", "-t"} and len(arg) > 2:
2412
+ continue
2413
+ return None
2414
+ return index
2415
+
2416
+ return None
2417
+
2418
+
2419
+ def active_flag(args, *values):
2420
+ options = True
2421
+
2422
+ for arg in args:
2423
+ if options and arg == "--":
2424
+ options = False
2425
+ elif options and (arg in values or any(value.startswith("--") and arg == f"{value}=true" for value in values)):
2426
+ return True
2427
+
2428
+ return False
2429
+
2430
+
2431
+ def without_pagination_flags(args):
2432
+ page_args = []
2433
+ options = True
2434
+
2435
+ for arg in args:
2436
+ if options and arg == "--":
2437
+ options = False
2438
+ if options and arg in {"--paginate", "--paginate=true", "--slurp", "--slurp=true"}:
2439
+ continue
2440
+ page_args.append(arg)
2441
+
2442
+ return page_args
2443
+
2444
+
2445
+ def extract_output_formatter(args):
2446
+ """Keep one unformatted request per page and retain gh's formatter args."""
2447
+
2448
+ page_args = []
2449
+ formatter = None
2450
+ index = 0
2451
+ options = True
2452
+
2453
+ while index < len(args):
2454
+ arg = args[index]
2455
+ if options and arg == "--":
2456
+ options = False
2457
+ page_args.extend(args[index:])
2458
+ break
2459
+
2460
+ kind = None
2461
+ expression = None
2462
+ if options and arg in {"-q", "--jq", "-t", "--template"}:
2463
+ if index + 1 >= len(args):
2464
+ print(f"aiur: {arg} requires an output expression", file=sys.stderr)
2465
+ raise SystemExit(64)
2466
+ kind = "jq" if arg in {"-q", "--jq"} else "template"
2467
+ expression = args[index + 1]
2468
+ index += 2
2469
+ elif options and arg.startswith("--jq="):
2470
+ kind, expression = "jq", arg.split("=", 1)[1]
2471
+ index += 1
2472
+ elif options and arg.startswith("--template="):
2473
+ kind, expression = "template", arg.split("=", 1)[1]
2474
+ index += 1
2475
+ elif options and arg.startswith("-q") and len(arg) > 2:
2476
+ kind, expression = "jq", arg[2:]
2477
+ index += 1
2478
+ elif options and arg.startswith("-t") and len(arg) > 2:
2479
+ kind, expression = "template", arg[2:]
2480
+ index += 1
2481
+ else:
2482
+ page_args.append(arg)
2483
+ index += 1
2484
+ continue
2485
+
2486
+ if formatter is not None:
2487
+ print("aiur: gh api accepts only one output formatter", file=sys.stderr)
2488
+ raise SystemExit(64)
2489
+ formatter = (kind, expression)
2490
+
2491
+ return page_args, formatter
2492
+
2493
+
2494
+ def paginated_request_uses_input(args):
2495
+ value_flags = {"-F", "--field", "-f", "--raw-field"}
2496
+
2497
+ for index, arg in enumerate(args):
2498
+ if arg == "--input" or arg.startswith("--input="):
2499
+ return True
2500
+ if arg in value_flags and index + 1 < len(args):
2501
+ value = args[index + 1]
2502
+ if "=@" in value:
2503
+ return True
2504
+ if "=@" in arg and (
2505
+ arg.startswith(("-F", "-f")) or arg.startswith(("--field=", "--raw-field="))
2506
+ ):
2507
+ return True
2508
+
2509
+ return False
2510
+
2511
+
2512
+ def add_include(args):
2513
+ if active_flag(args, "--include", "-i"):
2514
+ return args
2515
+
2516
+ page_args = args.copy()
2517
+ try:
2518
+ page_args.insert(page_args.index("--"), "--include")
2519
+ except ValueError:
2520
+ page_args.append("--include")
2521
+ return page_args
2522
+
2523
+
2524
+ def formatter_arguments(formatter):
2525
+ kind, expression = formatter
2526
+ return ["--jq" if kind == "jq" else "--template", expression]
2527
+
2528
+
2529
+ def response_status(headers):
2530
+ match = re.search(br"^HTTP/[^\s]+\s+(\d{3})", headers)
2531
+ return int(match.group(1)) if match else 200
2532
+
2533
+
2534
+ def response_headers(headers):
2535
+ for line in headers.splitlines()[1:]:
2536
+ if b":" not in line:
2537
+ continue
2538
+ name, value = line.split(b":", 1)
2539
+ name = name.decode("latin-1")
2540
+ if name.lower() in {"connection", "content-length", "link", "transfer-encoding"}:
2541
+ continue
2542
+ yield name, value.decode("latin-1").strip()
2543
+
2544
+
2545
+ def response_header_values(headers, name):
2546
+ prefix = name.lower().encode("ascii") + b":"
2547
+ return [line for line in headers.splitlines()[1:] if line.lower().startswith(prefix)]
2548
+
2549
+
2550
+ def linux_process_owns_connection(pid, client_port, server_port):
2551
+ """Verify the renderer owns the client side of this loopback connection."""
2552
+
2553
+ inode = None
2554
+ try:
2555
+ with open("/proc/net/tcp", encoding="ascii") as connections:
2556
+ for line in connections.readlines()[1:]:
2557
+ fields = line.split()
2558
+ local_port = int(fields[1].rsplit(":", 1)[1], 16)
2559
+ remote_port = int(fields[2].rsplit(":", 1)[1], 16)
2560
+ if fields[3] == "01" and local_port == client_port and remote_port == server_port:
2561
+ inode = fields[9]
2562
+ break
2563
+ except (FileNotFoundError, OSError, ValueError, IndexError):
2564
+ return False
2565
+
2566
+ if inode is None:
2567
+ return False
2568
+
2569
+ expected = f"socket:[{inode}]"
2570
+ try:
2571
+ file_descriptors = os.listdir(f"/proc/{pid}/fd")
2572
+ except (FileNotFoundError, OSError):
2573
+ return False
2574
+
2575
+ for fd in file_descriptors:
2576
+ try:
2577
+ if os.readlink(f"/proc/{pid}/fd/{fd}") == expected:
2578
+ return True
2579
+ except (FileNotFoundError, OSError):
2580
+ continue
2581
+ return False
2582
+
2583
+
2584
+ def darwin_process_owns_connection(pid, client_port, server_port):
2585
+ """Use macOS's system lsof to bind the replay to the renderer process."""
2586
+
2587
+ lsof = shutil.which("lsof")
2588
+ if lsof is None and os.path.isfile("/usr/sbin/lsof"):
2589
+ lsof = "/usr/sbin/lsof"
2590
+ if lsof is None:
2591
+ return False
2592
+
2593
+ try:
2594
+ result = subprocess.run(
2595
+ [lsof, "-nP", "-a", "-p", str(pid), "-iTCP"],
2596
+ stdout=subprocess.PIPE,
2597
+ stderr=subprocess.DEVNULL,
2598
+ text=True,
2599
+ timeout=5,
2600
+ )
2601
+ except (OSError, subprocess.TimeoutExpired):
2602
+ return False
2603
+ connection = f"127.0.0.1:{client_port}->127.0.0.1:{server_port}"
2604
+ return result.returncode == 0 and connection in result.stdout
2605
+
2606
+
2607
+ def process_owns_connection(pid, client_port, server_port):
2608
+ if sys.platform.startswith("linux"):
2609
+ return linux_process_owns_connection(pid, client_port, server_port)
2610
+ if sys.platform == "darwin":
2611
+ return darwin_process_owns_connection(pid, client_port, server_port)
2612
+ return False
2613
+
2614
+
2615
+ def render_with_native_gh(formatter, captured_pages, slurp, include_headers):
2616
+ """Replay admitted responses locally and let gh render them unchanged.
2617
+
2618
+ Calling gh once more against GitHub would bypass the captured page's lease.
2619
+ A loopback replay keeps the formatter in gh itself (including its embedded
2620
+ jq, Go-template helpers, and table state) without another GitHub request.
2621
+ """
2622
+
2623
+ if slurp:
2624
+ try:
2625
+ payload = json.dumps([json.loads(body) for _headers, body in captured_pages]).encode("utf-8")
2626
+ except json.JSONDecodeError:
2627
+ print("aiur: gh api --paginate --slurp returned a non-JSON page", file=sys.stderr)
2628
+ raise SystemExit(1)
2629
+ replay_pages = [(b"", payload)]
2630
+ paginate = False
2631
+ else:
2632
+ replay_pages = captured_pages
2633
+ paginate = True
2634
+
2635
+ class ReplayHandler(http.server.BaseHTTPRequestHandler):
2636
+ protocol_version = "HTTP/1.1"
2637
+
2638
+ def do_GET(self):
2639
+ self.server.renderer_ready.wait(timeout=5)
2640
+ renderer_pid = self.server.renderer_pid
2641
+ if renderer_pid is None or not process_owns_connection(
2642
+ renderer_pid, self.client_address[1], self.server.server_port
2643
+ ):
2644
+ self.send_error(403)
2645
+ return
2646
+
2647
+ match = re.fullmatch(r"/(\d+)", self.path.split("?", 1)[0])
2648
+ page = int(match.group(1)) if match else -1
2649
+ if not 0 <= page < len(replay_pages):
2650
+ self.send_error(404)
2651
+ return
2652
+
2653
+ headers, body = replay_pages[page]
2654
+ self.send_response(response_status(headers))
2655
+ content_type = False
2656
+ for name, value in response_headers(headers):
2657
+ content_type = content_type or name.lower() == "content-type"
2658
+ self.send_header(name, value)
2659
+ if not content_type:
2660
+ self.send_header("Content-Type", "application/json")
2661
+ if page + 1 < len(replay_pages):
2662
+ self.send_header("Link", f"<http://127.0.0.1:{self.server.server_port}/{page + 1}>; rel=\"next\"")
2663
+ self.send_header("Content-Length", str(len(body)))
2664
+ self.end_headers()
2665
+ self.wfile.write(body)
2666
+
2667
+ def send_response(self, code, message=None):
2668
+ # Preserve captured response headers instead of adding the replay
2669
+ # server's own Server and Date headers to --include output.
2670
+ self.send_response_only(code, message)
2671
+
2672
+ def log_message(self, _format, *_args):
2673
+ pass
2674
+
2675
+ server = http.server.ThreadingHTTPServer(("127.0.0.1", 0), ReplayHandler)
2676
+ server.daemon_threads = True
2677
+ server.block_on_close = False
2678
+ server.renderer_pid = None
2679
+ server.renderer_ready = threading.Event()
2680
+ thread = threading.Thread(target=server.serve_forever, daemon=True)
2681
+ thread.start()
2682
+ try:
2683
+ command = [os.environ["AIUR_GITHUB_PAGINATION_REAL_GH"], "api", f"http://127.0.0.1:{server.server_port}/0"]
2684
+ if paginate:
2685
+ command.append("--paginate")
2686
+ if include_headers:
2687
+ command.append("--include")
2688
+ command.extend(formatter_arguments(formatter))
2689
+ environment = os.environ.copy()
2690
+ for name in ("GH_TOKEN", "GITHUB_TOKEN", "GH_ENTERPRISE_TOKEN", "GITHUB_ENTERPRISE_TOKEN"):
2691
+ environment.pop(name, None)
2692
+ # gh requires an authentication source before it will issue even an
2693
+ # absolute loopback request. Replace inherited credentials with a
2694
+ # fixed non-secret accepted only by this renderer-bound local server.
2695
+ environment["GH_TOKEN"] = "aiur-local-replay"
2696
+ environment["NO_PROXY"] = "127.0.0.1,localhost"
2697
+ environment["no_proxy"] = "127.0.0.1,localhost"
2698
+ capture_headers = include_headers and paginate
2699
+ process = subprocess.Popen(command, env=environment, stdout=subprocess.PIPE if capture_headers else None)
2700
+ server.renderer_pid = process.pid
2701
+ server.renderer_ready.set()
2702
+ rendered, _stderr = process.communicate()
2703
+
2704
+ if capture_headers:
2705
+ for page, (headers, _body) in enumerate(replay_pages[:-1]):
2706
+ local = f'Link: <http://127.0.0.1:{server.server_port}/{page + 1}>; rel="next"'.encode("ascii")
2707
+ original = b"\n".join(response_header_values(headers, "Link"))
2708
+ rendered = rendered.replace(local, original)
2709
+ sys.stdout.buffer.write(rendered)
2710
+
2711
+ return process.returncode
2712
+ finally:
2713
+ server.shutdown()
2714
+ thread.join()
2715
+ server.server_close()
2716
+
2717
+
2718
+ args = sys.argv[1:]
2719
+ include_headers = active_flag(args, "--include", "-i")
2720
+ slurp = active_flag(args, "--slurp")
2721
+ silent = active_flag(args, "--silent")
2722
+ verbose = active_flag(args, "--verbose")
2723
+ display_args = without_pagination_flags(args)
2724
+ raw_args, formatter = extract_output_formatter(display_args)
2725
+
2726
+ if formatter and (silent or verbose):
2727
+ print("only one of `--template`, `--jq`, `--silent`, or `--verbose` may be used", file=sys.stderr)
2728
+ raise SystemExit(1)
2729
+
2730
+ raw_args = add_include(raw_args)
2731
+ raw_endpoint_index = endpoint_index(raw_args)
2732
+
2733
+ if raw_endpoint_index is None or raw_args[0] != "api":
2734
+ print("aiur: cannot budget malformed gh api pagination command", file=sys.stderr)
2735
+ raise SystemExit(64)
2736
+
2737
+ if paginated_request_uses_input(raw_args):
2738
+ print("aiur: cannot budget gh api --paginate commands that use an input body or standard input", file=sys.stderr)
2739
+ raise SystemExit(64)
2740
+
2741
+ if os.environ.get("AIUR_GITHUB_PAGINATION_DIRECTION") == "write":
2742
+ print("aiur: cannot budget a paginated write", file=sys.stderr)
2743
+ raise SystemExit(64)
2744
+
2745
+ wrapper = os.environ["AIUR_GITHUB_PAGINATION_WRAPPER"]
2746
+ pages = []
2747
+ captured_pages = []
2748
+ graphql = raw_args[raw_endpoint_index] in {"graphql", "/graphql"}
2749
+
2750
+ raw_cursor_arg_index = next(
2751
+ (
2752
+ index
2753
+ for index, arg in enumerate(raw_args)
2754
+ if index > 0
2755
+ and arg.startswith("endCursor=")
2756
+ and raw_args[index - 1] in {"-F", "--field", "-f", "--raw-field"}
2757
+ ),
2758
+ None,
2759
+ )
2760
+
2761
+ while True:
2762
+ result = subprocess.run([wrapper, *raw_args], stdout=subprocess.PIPE)
2763
+ headers, body = split_response(result.stdout)
2764
+
2765
+ if result.returncode:
2766
+ if not silent:
2767
+ if include_headers:
2768
+ sys.stdout.buffer.write(headers)
2769
+ if headers:
2770
+ sys.stdout.buffer.write(b"\n\n")
2771
+ sys.stdout.buffer.write(body)
2772
+ raise SystemExit(result.returncode)
2773
+
2774
+ if silent:
2775
+ pass
2776
+ elif formatter:
2777
+ captured_pages.append((headers, body))
2778
+ elif slurp:
2779
+ try:
2780
+ pages.append(json.loads(body))
2781
+ except json.JSONDecodeError:
2782
+ print("aiur: gh api --paginate --slurp returned a non-JSON page", file=sys.stderr)
2783
+ raise SystemExit(1)
2784
+ else:
2785
+ if include_headers:
2786
+ sys.stdout.buffer.write(headers)
2787
+ if headers:
2788
+ sys.stdout.buffer.write(b"\n\n")
2789
+ sys.stdout.buffer.write(body)
2790
+
2791
+ if graphql:
2792
+ cursor = next_cursor(body)
2793
+ if cursor is None:
2794
+ break
2795
+ if raw_cursor_arg_index is None:
2796
+ raw_args.extend(["-F", f"endCursor={cursor}"])
2797
+ raw_cursor_arg_index = len(raw_args) - 1
2798
+ else:
2799
+ raw_args[raw_cursor_arg_index] = f"endCursor={cursor}"
2800
+ else:
2801
+ endpoint = next_endpoint(headers)
2802
+ if endpoint is None:
2803
+ break
2804
+ raw_args[raw_endpoint_index] = endpoint
2805
+
2806
+ if formatter:
2807
+ raise SystemExit(render_with_native_gh(formatter, captured_pages, slurp, include_headers))
2808
+
2809
+ if slurp:
2810
+ payload = json.dumps(pages).encode("utf-8")
2811
+ if not silent:
2812
+ sys.stdout.buffer.write(payload)
2813
+ sys.stdout.buffer.write(b"\n")
2814
+ PY
2815
+ }
2816
+
2817
+ # `marker_cleanup` is defined and armed beside the marker block itself, so the
2818
+ # early refusal exits do not leak a temp copy. Now that `budget_release` exists,
2819
+ # widen the same traps to release the budget lease as well.
2820
+ trap 'marker_cleanup; budget_release; exit 143' HUP INT TERM
2821
+ trap 'marker_cleanup; budget_release' 0
2822
+
2823
+ secondary_delay_ms() {
2824
+ retry_after=
2825
+ for retry_source in "$@"; do
2826
+ [ -n "$retry_source" ] && [ -f "$retry_source" ] || continue
2827
+ retry_after=$(sed -n -E 's/^[[:space:]]*[Rr][Ee][Tt][Rr][Yy]-[Aa][Ff][Tt][Ee][Rr]:[[:space:]]*([0-9]+).*/\1/p' "$retry_source" | sed -n '1p')
2828
+ [ -n "$retry_after" ] && break
2829
+ done
2830
+
2831
+ case "$retry_after" in
2832
+ ''|0|*[!0-9]*) printf '%s\n' 60000 ;;
2833
+ *)
2834
+ if [ "$retry_after" -gt 3600 ]; then retry_after=3600; fi
2835
+ printf '%s\n' $((retry_after * 1000))
2836
+ ;;
2837
+ esac
2838
+ }
2839
+
2840
+ # Reuse the timestamp the cache section already sampled rather than forking
2841
+ # `date` a second time; they are the same instant for every purpose here.
2842
+ now=${cache_started_at:-}
2843
+ case "$now" in
2844
+ ''|*[!0-9]*) now=$(date -u +%s) ;;
2845
+ esac
2846
+ hold_until=0
2847
+
2848
+ # A truncating `>` redirect leaves the hold file empty between truncate and
2849
+ # write. A concurrent reader sampling it in that gap sees no hold, `consider_hold`
2850
+ # bails, and the call goes out during an exhausted window. Writing to a sibling
2851
+ # temp file and renaming makes the hold appear in one step — the same reason the
2852
+ # Elixir side uses temp+rename in `Aiur.AgentGitHubGuard.write_hold_file/3`.
2853
+ write_hold() {
2854
+ write_hold_tmp="$1.tmp.$$"
2855
+
2856
+ if printf '%s\n' "$2" > "$write_hold_tmp" 2>/dev/null; then
2857
+ mv -f "$write_hold_tmp" "$1" 2>/dev/null || rm -f "$write_hold_tmp" 2>/dev/null || true
2858
+ else
2859
+ rm -f "$write_hold_tmp" 2>/dev/null || true
2860
+ fi
2861
+
2862
+ return 0
2863
+ }
2864
+
2865
+ # Exhaustion an agent discovers first is fleet-wide news, but holds used to be
2866
+ # written only to the per-workspace dir no other agent and not the daemon reads
2867
+ # — so everyone else rediscovered it on the daemon's next `/rate_limit` probe.
2868
+ # Reads already consult both dirs (`consider_resource_holds` below), so writes
2869
+ # publish to both too; an unwritable shared dir fails quietly and leaves the
2870
+ # workspace hold in place.
2871
+ publish_hold() {
2872
+ if [ -n "$agent_quota_dir" ]; then write_hold "$agent_quota_dir/$1" "$2"; fi
2873
+
2874
+ if [ -n "$quota_dir" ] && [ "$quota_dir" != "$agent_quota_dir" ]; then
2875
+ write_hold "$quota_dir/$1" "$2"
2876
+ fi
2877
+
2878
+ return 0
2879
+ }
2880
+
2881
+ consider_hold() {
2882
+ candidate=$(sed -n '1p' "$1" 2>/dev/null)
2883
+ case "$candidate" in
2884
+ ''|*[!0-9]*) return ;;
2885
+ esac
2886
+
2887
+ if [ "$candidate" -gt "$now" ]; then
2888
+ if [ "$candidate" -gt "$hold_until" ]; then hold_until=$candidate; fi
2889
+ else
2890
+ rm -f "$1" 2>/dev/null || true
2891
+ fi
2892
+ }
2893
+
2894
+ # Both hold kinds gate a call: `-hold` is the exhausted primary window, and
2895
+ # `-secondary-hold` is a secondary/abuse-limit backoff, which GitHub raises
2896
+ # while the primary window still reads healthy.
2897
+ consider_resource_holds() {
2898
+ case "$2" in
2899
+ core|graphql|search)
2900
+ consider_hold "$1/$2-hold"
2901
+ consider_hold "$1/$2-secondary-hold"
2902
+ ;;
2903
+ *)
2904
+ consider_hold "$1/core-hold"
2905
+ consider_hold "$1/core-secondary-hold"
2906
+ consider_hold "$1/graphql-hold"
2907
+ consider_hold "$1/graphql-secondary-hold"
2908
+ ;;
2909
+ esac
2910
+ }
2911
+
2912
+ # The high-level list commands keep their own pagination loop inside one `gh`
2913
+ # process. A shell guard cannot admit those hidden HTTP pages individually, so
2914
+ # never let an invocation request more than one GitHub page under one lease.
2915
+ # `gh api --paginate` is handled above and remains the supported path for
2916
+ # callers that need more than GitHub's maximum 100-item page.
2917
+ native_page_limit_exceeds_single_request() {
2918
+ [ "${1:-}" != api ] || return 1
2919
+
2920
+ native_limit=
2921
+ native_expect_limit=0
2922
+ native_options=1
2923
+
2924
+ for native_argument in "$@"; do
2925
+ [ "$native_options" -eq 1 ] || continue
2926
+
2927
+ if [ "$native_expect_limit" -eq 1 ]; then
2928
+ native_limit=$native_argument
2929
+ native_expect_limit=0
2930
+ continue
2931
+ fi
2932
+
2933
+ case "$native_argument" in
2934
+ --) native_options=0 ;;
2935
+ --limit|-L) native_expect_limit=1 ;;
2936
+ --limit=*) native_limit=${native_argument#--limit=} ;;
2937
+ -L*) native_limit=${native_argument#-L} ;;
2938
+ esac
2939
+ done
2940
+
2941
+ case "$native_limit" in
2942
+ ''|*[!0-9]*) return 1 ;;
2943
+ esac
2944
+
2945
+ [ "$native_limit" -gt "${AIUR_GITHUB_NATIVE_PAGE_SIZE:-100}" ]
2946
+ }
2947
+
2948
+ if [ "$resource" != none ] && [ "$budget_enabled" -eq 1 ] && native_page_limit_exceeds_single_request "$@"; then
2949
+ printf '%s\n' 'aiur: guarded high-level gh commands cannot fetch more than one page; use gh api --paginate for budgeted multi-page reads' >&2
2950
+ exit 64
2951
+ fi
2952
+
2953
+ if [ "$resource" != none ] && [ -n "$quota_dir" ]; then
2954
+ consider_resource_holds "$quota_dir" "$resource"
2955
+ fi
2956
+
2957
+ if [ "$resource" != none ] && [ -n "$agent_quota_dir" ] && [ "$agent_quota_dir" != "$quota_dir" ]; then
2958
+ consider_resource_holds "$agent_quota_dir" "$resource"
2959
+ fi
2960
+
2961
+ if [ "$hold_until" -gt "$now" ]; then
2962
+ delay=$((hold_until - now))
2963
+ printf 'aiur: GitHub quota backoff; waiting %ss until %s\n' "$delay" "$(date -u -d "@$hold_until" '+%Y-%m-%dT%H:%M:%SZ' 2>/dev/null || printf '%s' "$hold_until")" >&2
2964
+ sleep "$delay"
2965
+ now=$(date -u +%s)
2966
+ fi
2967
+
2968
+ if [ "$admission_required" -eq 1 ]; then
2969
+ if [ "$api_paginated" -eq 1 ] && [ "$budget_enabled" -eq 1 ]; then
2970
+ run_budgeted_paginated_api "$@"
2971
+ exit $?
2972
+ fi
2973
+ budget_acquire
2974
+ budget_admission=$?
2975
+ if [ "$budget_admission" -eq 0 ]; then
2976
+ budget_start_renewal
2977
+ elif [ "$cache_served" -eq 1 ]; then
2978
+ # Another agent's identical fetch answered this one while it waited. The
2979
+ # answer is already on stdout and no request was made.
2980
+ exit 0
2981
+ else
2982
+ exit "$budget_admission"
2983
+ fi
2984
+ unset budget_admission
2985
+ fi
2986
+
2987
+ if [ "$track" -eq 1 ] && [ -n "$events_file" ]; then
2988
+ size=0
2989
+ if [ -f "$events_file" ]; then size=$(wc -c < "$events_file" 2>/dev/null || printf '0'); fi
2990
+ case "$size" in
2991
+ ''|*[!0-9]*) size=0 ;;
2992
+ esac
2993
+ # Retention (#2255): keep the previous two generations so the agent-side
2994
+ # request record survives the whole detection latency of a budget anomaly
2995
+ # (hours), not just the rolling hour the broker's `admissions` table keeps.
2996
+ if [ "$size" -gt 1048576 ]; then
2997
+ if [ -f "$events_file.1" ]; then mv -f "$events_file.1" "$events_file.2" 2>/dev/null || true; fi
2998
+ mv -f "$events_file" "$events_file.1" 2>/dev/null || true
2999
+ fi
3000
+
3001
+ # The resource column tells the daemon which budget the call was billed to.
3002
+ # Without it every agent call was counted against core, and a GraphQL query —
3003
+ # billed in points against a separate budget — landed in the wrong window.
3004
+ track_resource=$resource
3005
+ case "$track_resource" in
3006
+ core|graphql|search) ;;
3007
+ *) track_resource=core ;;
3008
+ esac
3009
+
3010
+ # Call-site column: allowlisted subcommand, never raw argv (falls back safe).
3011
+ case "$command_name" in
3012
+ ''|*[!a-zA-Z0-9-_]*) command_name= ;;
3013
+ esac
3014
+ case "$subcommand_name" in
3015
+ ''|*[!a-zA-Z0-9-_]*) subcommand_name= ;;
3016
+ esac
3017
+ call_site=${command_name:-gh}
3018
+ case "$command_name" in
3019
+ api)
3020
+ case "$resource" in
3021
+ graphql) call_site="api graphql" ;;
3022
+ *) call_site=api ;;
3023
+ esac
3024
+ ;;
3025
+ pr|issue|run|search|label)
3026
+ case "$subcommand_name" in
3027
+ view|list|status|checks|diff|create|merge|review|close|reopen|edit|ready|delete|comment|update-branch|lock|unlock|pin|unpin|transfer|watch|rerun|cancel|issues|prs|repos|code|commits|users) call_site="$command_name $subcommand_name" ;;
3028
+ esac
3029
+ ;;
3030
+ esac
3031
+
3032
+ # The token fingerprint (never the token) answers "which pool did this bill"
3033
+ # without a live /proc sweep, and the wrapper pid lets the daemon correlate
3034
+ # the call with the subprocess-spawn log of the ticket that made it (#2255).
3035
+ # Both are best-effort: an empty fingerprint (budget disabled) or a blank
3036
+ # column degrades to an unattributed row, never a refused call. The call-site
3037
+ # column sits between the resource and the fingerprint (#2299).
3038
+ printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' "$now" "$consumer" "$direction" "$track_resource" "$call_site" "${budget_key:-}" "$$" >> "$events_file" 2>/dev/null || true
3039
+ fi
3040
+
3041
+ error_file=
3042
+ status_file=
3043
+ output_file=
3044
+ api_capture=0
3045
+ api_requested_include=0
3046
+ stderr_streamed=0
3047
+ cache_served_304=0
3048
+ cache_response_etag=
3049
+ cache_conditional_etag=
3050
+
3051
+ # A 304 "Not Modified" is detected from the response status line, never from
3052
+ # gh's exit code: gh exits 1 on a 304, but a served 304 is a SUCCESS that
3053
+ # answers from the cache (#2307 agent conditional reads). Reads the HTTP status
3054
+ # line that `--include` puts at the top of `output_file`.
3055
+ response_status_is_304() {
3056
+ [ -n "$output_file" ] && [ -f "$output_file" ] || return 1
3057
+ awk '/^HTTP\/[^[:space:]]+[[:space:]]+[0-9][0-9][0-9]/ { status = $2 } END { exit status == 304 ? 0 : 1 }' "$output_file"
3058
+ }
3059
+
3060
+ # `gh api` is always run with `--include` so the rate-limit headers can be read,
3061
+ # then the headers are stripped again unless the caller asked for them. The
3062
+ # bytes this prints are what the caller sees, so they are also exactly what the
3063
+ # cache must store. On a served 304 the response carried no body, so the answer
3064
+ # is the cached body — which for an `--include` entry is already the correct
3065
+ # include-shaped bytes (headers and body), and for a plain entry the body alone,
3066
+ # exactly as a fresh cache hit serves the same entry. A 304 means "what you hold
3067
+ # is current" (#2307), so serving the cached body to an `--include` caller must
3068
+ # not be replaced by the bare 304 status line the response actually carried.
3069
+ emit_api_output() {
3070
+ if [ "$cache_served_304" -eq 1 ] && [ -n "$cache_body" ] && [ -f "$cache_body" ]; then
3071
+ cat "$cache_body"
3072
+ elif [ "$api_requested_include" -eq 1 ]; then
3073
+ cat "$output_file"
3074
+ elif sed -n '1p' "$output_file" | grep -Eq '^HTTP/'; then
3075
+ sed '1,/^[[:space:]]*$/d' "$output_file"
3076
+ else
3077
+ cat "$output_file"
3078
+ fi
3079
+ }
3080
+ if [ "$resource" != none ]; then
3081
+ old_umask=$(umask)
3082
+ umask 077
3083
+ error_file=$(mktemp "${TMPDIR:-/tmp}/aiur-gh-stderr.XXXXXX" 2>/dev/null || true)
3084
+ status_file=$(mktemp "${TMPDIR:-/tmp}/aiur-gh-status.XXXXXX" 2>/dev/null || true)
3085
+ umask "$old_umask"
3086
+ fi
3087
+
3088
+ # High-level budgeted commands (anything but `gh api`, which already captures
3089
+ # its status through `--include`) run under `GH_DEBUG=api` so the wrapper can
3090
+ # see whether the response was a free 304. `gh` prints the status line only in
3091
+ # that transcript; without it every `pr view`/`issue view`/`search` 304 is
3092
+ # billed as if it had cost quota (#2353). `run watch` is the one interactive
3093
+ # streamer and is deliberately excluded: its stderr must stay live, and a debug
3094
+ # transcript interleaved with its progress would be worse than the accounting
3095
+ # gap. Every other high-level command is buffered (below) so the transcript is
3096
+ # consumed for reconciliation and then stripped before the caller sees stderr.
3097
+ if [ "$budget_enabled" -eq 1 ] && [ "$resource" != none ] && [ "${1:-}" != api ]; then
3098
+ case "${1:-} ${2:-}" in
3099
+ "run watch") : ;;
3100
+ *) high_level_debug=1 ;;
3101
+ esac
3102
+ fi
3103
+
3104
+ if [ -n "$error_file" ]; then
3105
+ if [ "${1:-}" = api ]; then
3106
+ for api_arg in "$@"; do
3107
+ case "$api_arg" in
3108
+ --include|--include=true|-i) api_requested_include=1 ;;
3109
+ --paginate) : ;;
3110
+ esac
3111
+ done
3112
+
3113
+ if [ "$api_paginated" -eq 0 ]; then
3114
+ old_umask=$(umask)
3115
+ umask 077
3116
+ output_file=$(mktemp "${TMPDIR:-/tmp}/aiur-gh-stdout.XXXXXX" 2>/dev/null || true)
3117
+ umask "$old_umask"
3118
+ [ -n "$output_file" ] && api_capture=1
3119
+ fi
3120
+ fi
3121
+
3122
+ # A cacheable read is captured so its exact bytes can be stored. Only the
3123
+ # shapes classified above reach this branch, and all of them are short,
3124
+ # one-shot, machine-readable reads — nothing that streams progress or prompts,
3125
+ # which is why the `tee` branch below still exists for everything else.
3126
+ if [ -n "$cache_body" ] && [ "$api_capture" -eq 0 ]; then
3127
+ old_umask=$(umask)
3128
+ umask 077
3129
+ cache_stage=$(mktemp "${TMPDIR:-/tmp}/aiur-gh-cache.XXXXXX" 2>/dev/null || true)
3130
+ umask "$old_umask"
3131
+ fi
3132
+
3133
+ if [ "$api_capture" -eq 1 ]; then
3134
+ # stdout is already being captured for header parsing, so there is no live
3135
+ # output to interleave with; buffering stderr here costs nothing.
3136
+ #
3137
+ # Conditional re-read (#2307): when the store holds a body AND a validator
3138
+ # for this resource, the re-fetch sends If-None-Match so an unchanged
3139
+ # answer comes back 304 and is reconciled free instead of billed again. The
3140
+ # validator is only ever offered while a body is held — a 304 with no body
3141
+ # would spend a request and learn nothing (the same contract as the
3142
+ # daemon's ResourceStore). gh exits 1 on a 304, which is not a failure
3143
+ # here: the 304 is detected from the status line below and the cached body
3144
+ # answers the call.
3145
+ cache_conditional_etag=
3146
+ if [ -n "$cache_body" ] && [ -f "$cache_body" ] && [ -f "$cache_meta" ]; then
3147
+ cache_conditional_etag=$(sed -n '2p' "$cache_meta" 2>/dev/null || printf '')
3148
+ fi
3149
+ if [ -n "$cache_conditional_etag" ]; then
3150
+ if [ "$api_requested_include" -eq 1 ]; then
3151
+ run_gh "$@" -H "If-None-Match: $cache_conditional_etag" > "$output_file" 2> "$error_file"
3152
+ else
3153
+ run_gh "$@" -H "If-None-Match: $cache_conditional_etag" --include > "$output_file" 2> "$error_file"
3154
+ fi
3155
+ elif [ "$api_requested_include" -eq 1 ]; then
3156
+ run_gh "$@" > "$output_file" 2> "$error_file"
3157
+ else
3158
+ run_gh "$@" --include > "$output_file" 2> "$error_file"
3159
+ fi
3160
+ status=$?
3161
+
3162
+ # The response's own ETag is what a later re-read validates against. On a
3163
+ # served 304 the response carries the same validator, so capturing it here
3164
+ # also keeps the entry's validator in place. `tr` is gated because an
3165
+ # isolated `PATH` (the test harness, a hardened shell) may lack it; without
3166
+ # it a trailing CR is left on the stored validator, which only costs a
3167
+ # later 304 match, never correctness.
3168
+ if [ -n "$output_file" ] && [ -f "$output_file" ]; then
3169
+ cache_response_etag=$(sed -n -E 's/^[[:space:]]*[Ee][Tt][Aa][Gg]:[[:space:]]*(.*)$/\1/p' "$output_file" | tail -n 1)
3170
+ if command -v tr >/dev/null 2>&1; then
3171
+ cache_response_etag=$(printf '%s\n' "$cache_response_etag" | tr -d '\r')
3172
+ fi
3173
+ fi
3174
+
3175
+ if response_status_is_304 && [ -n "$cache_body" ] && [ -f "$cache_body" ]; then
3176
+ cache_served_304=1
3177
+ status=0
3178
+ fi
3179
+ elif [ -n "$cache_stage" ]; then
3180
+ if [ "$high_level_debug" -eq 1 ]; then
3181
+ ( GH_DEBUG=api; export GH_DEBUG; run_gh "$@" ) > "$cache_stage" 2> "$error_file"
3182
+ else
3183
+ run_gh "$@" > "$cache_stage" 2> "$error_file"
3184
+ fi
3185
+ status=$?
3186
+ cat "$cache_stage"
3187
+ elif [ -n "$status_file" ] && command -v tee > /dev/null 2>&1 && [ "$high_level_debug" -eq 0 ]; then
3188
+ # Pass stderr through `tee` so it reaches the terminal as it is written
3189
+ # while still being captured for the rate-limit classification below.
3190
+ # Replaying a buffered copy after exit stalls `gh run watch` progress — an
3191
+ # allowlisted read — and swallows interactive prompts. `tee` ends the
3192
+ # pipeline, so the real exit status travels via `status_file`.
3193
+ { { run_gh "$@"; printf '%s\n' "$?" > "$status_file"; } 2>&1 1>&3 | tee "$error_file" >&2; } 3>&1
3194
+ stderr_streamed=1
3195
+ # An unreadable or non-numeric status means the real exit code could not be
3196
+ # confirmed. Reporting 0 there would turn a failed `gh` into an apparent
3197
+ # success for every caller, so this fails closed instead.
3198
+ status=$(sed -n '1p' "$status_file" 2>/dev/null)
3199
+ case "$status" in
3200
+ ''|*[!0-9]*) status=1 ;;
3201
+ esac
3202
+ else
3203
+ if [ "$high_level_debug" -eq 1 ]; then
3204
+ ( GH_DEBUG=api; export GH_DEBUG; run_gh "$@" ) 2> "$error_file"
3205
+ else
3206
+ run_gh "$@" 2> "$error_file"
3207
+ fi
3208
+ status=$?
3209
+ fi
3210
+
3211
+ if [ "$api_capture" -eq 1 ]; then
3212
+ emit_api_output
3213
+
3214
+ # The cache copy is produced by a SECOND pass rather than by redirecting the
3215
+ # first. The agent's stdout must not depend on the cache being writable.
3216
+ # On a served 304 the response carried no body, so nothing is re-stored —
3217
+ # the existing body stays and the entry's stamp is refreshed below.
3218
+ if [ "$cache_served_304" -eq 0 ] && [ -n "$cache_body" ] && [ "$status" -eq 0 ]; then
3219
+ old_umask=$(umask)
3220
+ umask 077
3221
+ cache_stage=$(mktemp "${TMPDIR:-/tmp}/aiur-gh-cache.XXXXXX" 2>/dev/null || true)
3222
+ umask "$old_umask"
3223
+ if [ -n "$cache_stage" ]; then emit_api_output > "$cache_stage" 2>/dev/null || cache_stage=; fi
3224
+ fi
3225
+ fi
3226
+
3227
+ # High-level 304s reconcile here, before the transcript would otherwise leak:
3228
+ # the status is read for reconciliation and then the debug is stripped so the
3229
+ # replay below is exactly the stderr the caller would have seen without it.
3230
+ if [ "$high_level_debug" -eq 1 ]; then
3231
+ budget_reconcile_debug
3232
+ fi
3233
+
3234
+ if [ "$stderr_streamed" -eq 0 ]; then
3235
+ while IFS= read -r line || [ -n "$line" ]; do
3236
+ # gh prints `gh: HTTP 304` on stderr for a served 304 — noise that would
3237
+ # read as a failure. A 304 is a success answered from the cache.
3238
+ if [ "$cache_served_304" -eq 1 ] && printf '%s\n' "$line" | grep -Eiq '^gh: HTTP 304'; then
3239
+ continue
3240
+ fi
3241
+ printf '%s\n' "$line" >&2
3242
+ done < "$error_file"
3243
+ fi
3244
+ else
3245
+ run_gh "$@"
3246
+ status=$?
3247
+ fi
3248
+
3249
+ probe_rate_limit() {
3250
+ original_resource=$resource
3251
+ original_admission_resource=$admission_resource
3252
+ original_family=$endpoint_family
3253
+ # The probe is a different request against a different resource. Claiming the
3254
+ # original read's shape for it would make every follower wait on an answer this
3255
+ # call is never going to write — and, worse, admission is re-entered here AFTER
3256
+ # the real `gh` has already failed, so a cached body found during the probe
3257
+ # would be printed onto the stdout of a call about to exit non-zero
3258
+ # (`$(gh ... --json ...)` would read that as success). Both the claim and the
3259
+ # ability to serve are withdrawn for the duration.
3260
+ original_claim_key=$cache_claim_key
3261
+ original_cache_body=$cache_body
3262
+ cache_claim_key=
3263
+ cache_body=
3264
+ immediate_cooldown=$(secondary_delay_ms "$error_file" "$output_file")
3265
+ budget_hold token "$immediate_cooldown"
3266
+ budget_release
3267
+ resource=core
3268
+ admission_resource=core
3269
+ endpoint_family=rate_limit
3270
+ budget_ignore_token_cooldown=1
3271
+ if budget_acquire; then
3272
+ budget_start_renewal
3273
+ rate_limit_observation=$(run_gh api rate_limit --template '{{.resources.core.remaining}} {{.resources.core.reset}} {{.resources.graphql.remaining}} {{.resources.graphql.reset}}' 2>/dev/null || true)
3274
+ else
3275
+ rate_limit_observation=
3276
+ fi
3277
+ budget_ignore_token_cooldown=0
3278
+ budget_release
3279
+ resource=$original_resource
3280
+ admission_resource=$original_admission_resource
3281
+ endpoint_family=$original_family
3282
+ cache_claim_key=$original_claim_key
3283
+ cache_body=$original_cache_body
3284
+ unset original_resource original_admission_resource original_family original_claim_key original_cache_body \
3285
+ immediate_cooldown
3286
+ }
3287
+
3288
+ rate_limited_response() {
3289
+ grep -Eiq 'rate.?limit|rate_limit' "$error_file" && return 0
3290
+ [ -n "$output_file" ] && grep -Eiq 'rate.?limit|rate_limit' "$output_file" && return 0
3291
+ [ -n "$output_file" ] && grep -Eq '^HTTP/[0-9.]+[[:space:]]+(403|429)' "$output_file" && grep -Eiq '^[Rr]etry-[Aa]fter:' "$output_file"
3292
+ }
3293
+
3294
+ record_successful_budget_hold() {
3295
+ [ "$status" -eq 0 ] || return 0
3296
+ [ -n "$output_file" ] && [ -f "$output_file" ] || return 0
3297
+
3298
+ response_remaining=$(sed -n -E 's/^[[:space:]]*[Xx]-[Rr][Aa][Tt][Ee][Ll][Ii][Mm][Ii][Tt]-[Rr][Ee][Mm][Aa][Ii][Nn][Ii][Nn][Gg]:[[:space:]]*([0-9]+).*/\1/p' "$output_file" | tail -n 1)
3299
+ response_reset=$(sed -n -E 's/^[[:space:]]*[Xx]-[Rr][Aa][Tt][Ee][Ll][Ii][Mm][Ii][Tt]-[Rr][Ee][Ss][Ee][Tt]:[[:space:]]*([0-9]+).*/\1/p' "$output_file" | tail -n 1)
3300
+
3301
+ case "$response_remaining:$response_reset" in
3302
+ 0:[0-9]*)
3303
+ response_delay=$(( (response_reset - $(date -u +%s)) * 1000 ))
3304
+ if [ "$response_delay" -gt 0 ]; then
3305
+ publish_hold "$resource-hold" "$response_reset"
3306
+ budget_hold resource "$response_delay" "$resource"
3307
+ fi
3308
+ ;;
3309
+ esac
3310
+
3311
+ unset response_remaining response_reset response_delay
3312
+ }
3313
+
3314
+ record_successful_budget_hold
3315
+ budget_reconcile_response
3316
+
3317
+ # A mutation invalidates before its response is stored, so an agent that edits a
3318
+ # pull request and immediately reads it back can never be answered from the copy
3319
+ # it just superseded. Invalidation runs whatever the exit status was: a write
3320
+ # that failed late may still have landed.
3321
+ if [ -n "$cache_root" ]; then
3322
+ cache_old_umask=$(umask)
3323
+ umask 077
3324
+ fi
3325
+ cache_invalidate_writes
3326
+ cache_store
3327
+ # A served 304 confirmed the cached body is current: refresh the fetched-at
3328
+ # stamp so the entry stays warm (the re-validated answer is as fresh as a 200)
3329
+ # while keeping the stored body — the 304 carried no bytes to store.
3330
+ if [ "$cache_served_304" -eq 1 ] && [ -n "$cache_meta" ]; then
3331
+ cache_meta_body=$cache_started_at
3332
+ if [ -n "$cache_conditional_etag" ]; then cache_meta_body="$cache_started_at
3333
+ $cache_conditional_etag"; fi
3334
+ cache_write_file "$cache_meta" "$cache_meta_body" || true
3335
+ unset cache_meta_body
3336
+ fi
3337
+ cache_prune
3338
+ if [ -n "$cache_root" ]; then umask "$cache_old_umask"; fi
3339
+ if [ -n "$cache_stage" ]; then rm -f "$cache_stage" 2>/dev/null || true; fi
3340
+
3341
+ if [ "$status" -ne 0 ] && [ -n "$error_file" ] && rate_limited_response && { [ -n "$agent_quota_dir" ] || [ "$budget_enabled" -eq 1 ]; }; then
3342
+ probe_rate_limit
3343
+ observation=$rate_limit_observation
3344
+ unset rate_limit_observation
3345
+ set -- $observation
3346
+ exhausted=0
3347
+
3348
+ if [ "$#" -eq 4 ]; then
3349
+ core_remaining=$1
3350
+ core_reset=$2
3351
+ graphql_remaining=$3
3352
+ graphql_reset=$4
3353
+
3354
+ case "$core_remaining:$core_reset" in
3355
+ 0:[0-9]*)
3356
+ publish_hold "core-hold" "$core_reset"
3357
+ budget_delay=$(( (core_reset - $(date -u +%s)) * 1000 ))
3358
+ if [ "$budget_delay" -gt 0 ]; then budget_hold resource "$budget_delay" core; fi
3359
+ exhausted=1
3360
+ ;;
3361
+ esac
3362
+ case "$graphql_remaining:$graphql_reset" in
3363
+ 0:[0-9]*)
3364
+ publish_hold "graphql-hold" "$graphql_reset"
3365
+ budget_delay=$(( (graphql_reset - $(date -u +%s)) * 1000 ))
3366
+ if [ "$budget_delay" -gt 0 ]; then budget_hold resource "$budget_delay" graphql; fi
3367
+ exhausted=1
3368
+ ;;
3369
+ esac
3370
+
3371
+ if [ "$exhausted" -eq 1 ]; then
3372
+ printf '%s\n' 'aiur: GitHub quota exhausted; exact reset backoff recorded' >&2
3373
+ fi
3374
+ fi
3375
+
3376
+ # A rate-limit refusal while both primary windows still read healthy is a
3377
+ # secondary (abuse) limit. Nothing in the primary windows records it, so
3378
+ # without its own backoff the next call retries straight into another
3379
+ # rejection. Honour Retry-After when gh exposes it, with GitHub's 60-second
3380
+ # guidance as the fallback.
3381
+ if [ "$exhausted" -eq 0 ]; then
3382
+ secondary_delay=$(secondary_delay_ms "$error_file" "$output_file")
3383
+ secondary_wait_seconds=$(( (secondary_delay + 999) / 1000 ))
3384
+ secondary_until=$(( $(date -u +%s) + secondary_wait_seconds ))
3385
+
3386
+ case "$resource" in
3387
+ core|graphql) publish_hold "$resource-secondary-hold" "$secondary_until" ;;
3388
+ *)
3389
+ publish_hold "core-secondary-hold" "$secondary_until"
3390
+ publish_hold "graphql-secondary-hold" "$secondary_until"
3391
+ ;;
3392
+ esac
3393
+
3394
+ printf 'aiur: GitHub secondary rate limit; backing off %ss before the next call\n' "$secondary_wait_seconds" >&2
3395
+ budget_hold token "$secondary_delay"
3396
+ fi
3397
+ fi
3398
+
3399
+ budget_release
3400
+ if [ -n "$error_file" ]; then rm -f "$error_file" 2>/dev/null || true; fi
3401
+ if [ -n "$status_file" ]; then rm -f "$status_file" 2>/dev/null || true; fi
3402
+ if [ -n "$output_file" ]; then rm -f "$output_file" 2>/dev/null || true; fi
3403
+ exit "$status"