github-issue-tower-defence-management 2.19.1 → 2.19.2

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 (780) hide show
  1. package/bin/adapter/entry-points/cli/index.js +0 -0
  2. package/package.json +5 -1
  3. package/.env.example +0 -7
  4. package/.gitattributes +0 -2
  5. package/.github/CODEOWNERS +0 -6
  6. package/.github/copilot-instructions.md +0 -6
  7. package/.github/dependabot.yml +0 -19
  8. package/.github/instructions/code-review.instructions.md +0 -50
  9. package/.github/workflows/api-created_issue_pr.yml +0 -97
  10. package/.github/workflows/ci-failure-issue-creator.yml +0 -48
  11. package/.github/workflows/close-manual-prs.yml +0 -80
  12. package/.github/workflows/codeql.yml +0 -107
  13. package/.github/workflows/commit-lint.yml +0 -85
  14. package/.github/workflows/configs/commitlint.config.cjs +0 -32
  15. package/.github/workflows/configs/commitlint.config.js +0 -32
  16. package/.github/workflows/console-ui.yml +0 -68
  17. package/.github/workflows/create-pr.yml +0 -116
  18. package/.github/workflows/empty-format-test-job.yml +0 -34
  19. package/.github/workflows/format.yml +0 -28
  20. package/.github/workflows/publish.yml +0 -111
  21. package/.github/workflows/secret-scan.yml +0 -51
  22. package/.github/workflows/test.yml +0 -58
  23. package/.github/workflows/umino-project.yml +0 -207
  24. package/.gitleaks.toml +0 -22
  25. package/.prettierignore +0 -31
  26. package/.prettierrc +0 -5
  27. package/CHANGELOG.md +0 -4162
  28. package/CONTRIBUTING.md +0 -60
  29. package/bin/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.js +0 -12
  30. package/bin/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.js.map +0 -1
  31. package/bin/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.js +0 -125
  32. package/bin/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.js.map +0 -1
  33. package/bin/adapter/repositories/issue/issueTimelineUtils.js +0 -38
  34. package/bin/adapter/repositories/issue/issueTimelineUtils.js.map +0 -1
  35. package/bin/domain/entities/UnansweredOwnerCall.js +0 -3
  36. package/bin/domain/entities/UnansweredOwnerCall.js.map +0 -1
  37. package/bin/domain/entities/WorkingTime.js +0 -3
  38. package/bin/domain/entities/WorkingTime.js.map +0 -1
  39. package/bin/domain/usecases/ChangeStatusLongInReviewIssueUseCase.js +0 -37
  40. package/bin/domain/usecases/ChangeStatusLongInReviewIssueUseCase.js.map +0 -1
  41. package/bin/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.js +0 -118
  42. package/bin/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.js.map +0 -1
  43. package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js +0 -180
  44. package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js.map +0 -1
  45. package/bin/domain/usecases/TriagerApprovalDispatchUseCase.js +0 -160
  46. package/bin/domain/usecases/TriagerApprovalDispatchUseCase.js.map +0 -1
  47. package/bin/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.js +0 -3
  48. package/bin/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.js.map +0 -1
  49. package/bin/domain/usecases/awaitingOwnerApprovalMessage.js +0 -7
  50. package/bin/domain/usecases/awaitingOwnerApprovalMessage.js.map +0 -1
  51. package/bin/domain/usecases/findLastAgentDeclaringReport.js +0 -12
  52. package/bin/domain/usecases/findLastAgentDeclaringReport.js.map +0 -1
  53. package/bin/domain/usecases/isPullRequestDeclaredUnnecessary.js +0 -25
  54. package/bin/domain/usecases/isPullRequestDeclaredUnnecessary.js.map +0 -1
  55. package/bin/domain/usecases/isWaitingForOwnerApproval.js +0 -16
  56. package/bin/domain/usecases/isWaitingForOwnerApproval.js.map +0 -1
  57. package/bin/domain/usecases/returnedToAwaitingWorkspaceMessage.js +0 -7
  58. package/bin/domain/usecases/returnedToAwaitingWorkspaceMessage.js.map +0 -1
  59. package/commitlint.config.js +0 -6
  60. package/eslint.config.mjs +0 -76
  61. package/jest.config.js +0 -84
  62. package/jest.setup.js +0 -1
  63. package/lib/buffer-equal-constant-time-compat/index.js +0 -17
  64. package/lib/buffer-equal-constant-time-compat/index.test.js +0 -54
  65. package/lib/buffer-equal-constant-time-compat/package.json +0 -5
  66. package/lib/typescript-compat/bin/tsc +0 -2
  67. package/lib/typescript-compat/bin/tsserver +0 -2
  68. package/lib/typescript-compat/lib/typescript.js +0 -1
  69. package/lib/typescript-compat/package.json +0 -13
  70. package/renovate.json +0 -46
  71. package/scripts/copyConsoleUiDist.mjs +0 -35
  72. package/scripts/defaultBranchTipVerify.sh +0 -23
  73. package/scripts/testWorkflowRunVerify.sh +0 -47
  74. package/scripts/verifyConsoleUiDist.mjs +0 -96
  75. package/src/adapter/ci/consoleUiWorkflowTimeout.test.ts +0 -61
  76. package/src/adapter/ci/publishTestWorkflowGate.test.ts +0 -653
  77. package/src/adapter/ci/workflowRunCancellation.test.ts +0 -72
  78. package/src/adapter/entry-points/cli/fleetConfig.test.ts +0 -553
  79. package/src/adapter/entry-points/cli/fleetConfig.ts +0 -266
  80. package/src/adapter/entry-points/cli/index.test.ts +0 -2837
  81. package/src/adapter/entry-points/cli/index.ts +0 -1488
  82. package/src/adapter/entry-points/cli/projectConfig.test.ts +0 -342
  83. package/src/adapter/entry-points/cli/projectConfig.ts +0 -500
  84. package/src/adapter/entry-points/console/consoleAirplaneSnapshotApi.test.ts +0 -658
  85. package/src/adapter/entry-points/console/consoleAirplaneSnapshotApi.ts +0 -482
  86. package/src/adapter/entry-points/console/consoleDataDelivery.test.ts +0 -222
  87. package/src/adapter/entry-points/console/consoleDataDelivery.ts +0 -134
  88. package/src/adapter/entry-points/console/consoleDoneStore.test.ts +0 -169
  89. package/src/adapter/entry-points/console/consoleDoneStore.ts +0 -139
  90. package/src/adapter/entry-points/console/consoleGithubTokenResolver.test.ts +0 -275
  91. package/src/adapter/entry-points/console/consoleGithubTokenResolver.ts +0 -113
  92. package/src/adapter/entry-points/console/consoleImageProxy.test.ts +0 -140
  93. package/src/adapter/entry-points/console/consoleImageProxy.ts +0 -111
  94. package/src/adapter/entry-points/console/consoleItemUrlLookup.test.ts +0 -63
  95. package/src/adapter/entry-points/console/consoleItemUrlLookup.ts +0 -66
  96. package/src/adapter/entry-points/console/consoleOperationApi.test.ts +0 -2523
  97. package/src/adapter/entry-points/console/consoleOperationApi.ts +0 -936
  98. package/src/adapter/entry-points/console/consoleProjectResolver.test.ts +0 -246
  99. package/src/adapter/entry-points/console/consoleProjectResolver.ts +0 -111
  100. package/src/adapter/entry-points/console/consoleReadApi.test.ts +0 -714
  101. package/src/adapter/entry-points/console/consoleReadApi.ts +0 -361
  102. package/src/adapter/entry-points/console/consoleTabNames.test.ts +0 -52
  103. package/src/adapter/entry-points/console/consoleTabNames.ts +0 -37
  104. package/src/adapter/entry-points/console/consoleUiDistSync.test.ts +0 -66
  105. package/src/adapter/entry-points/console/dashboardComposeService.test.ts +0 -595
  106. package/src/adapter/entry-points/console/dashboardComposeService.ts +0 -256
  107. package/src/adapter/entry-points/console/dashboardEmitterComposerKey.test.ts +0 -180
  108. package/src/adapter/entry-points/console/ensureConsoleRunning.test.ts +0 -115
  109. package/src/adapter/entry-points/console/ensureConsoleRunning.ts +0 -64
  110. package/src/adapter/entry-points/console/ui/.storybook/main.ts +0 -12
  111. package/src/adapter/entry-points/console/ui/.storybook/preview.ts +0 -15
  112. package/src/adapter/entry-points/console/ui/biome.json +0 -53
  113. package/src/adapter/entry-points/console/ui/components.json +0 -20
  114. package/src/adapter/entry-points/console/ui/e2e/consoleScenario.spec.ts +0 -725
  115. package/src/adapter/entry-points/console/ui/e2e/consoleTestHarness.ts +0 -831
  116. package/src/adapter/entry-points/console/ui/e2e/playwright.config.ts +0 -30
  117. package/src/adapter/entry-points/console/ui/e2e/tsconfig.json +0 -18
  118. package/src/adapter/entry-points/console/ui/index.html +0 -12
  119. package/src/adapter/entry-points/console/ui/jest-globals.cjs +0 -26
  120. package/src/adapter/entry-points/console/ui/jest.setup.ts +0 -1
  121. package/src/adapter/entry-points/console/ui/jest.styleMock.js +0 -1
  122. package/src/adapter/entry-points/console/ui/public/sw.js +0 -60
  123. package/src/adapter/entry-points/console/ui/src/components/ui/badge.stories.tsx +0 -35
  124. package/src/adapter/entry-points/console/ui/src/components/ui/badge.tsx +0 -28
  125. package/src/adapter/entry-points/console/ui/src/components/ui/button.stories.tsx +0 -34
  126. package/src/adapter/entry-points/console/ui/src/components/ui/button.tsx +0 -50
  127. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.stories.tsx +0 -28
  128. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.test.tsx +0 -65
  129. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleCopyCodeButton.tsx +0 -19
  130. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.stories.tsx +0 -61
  131. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.test.tsx +0 -199
  132. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMarkdownContent.tsx +0 -166
  133. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.stories.tsx +0 -22
  134. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.test.tsx +0 -74
  135. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagram.tsx +0 -84
  136. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.stories.tsx +0 -27
  137. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.test.tsx +0 -85
  138. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleMermaidDiagramModalScreen.tsx +0 -97
  139. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.stories.tsx +0 -76
  140. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.test.tsx +0 -56
  141. package/src/adapter/entry-points/console/ui/src/features/console/components/content/ConsoleReferenceLink.tsx +0 -39
  142. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.stories.tsx +0 -32
  143. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.test.tsx +0 -105
  144. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleChangedFileList.tsx +0 -157
  145. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.stories.tsx +0 -68
  146. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.test.tsx +0 -612
  147. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentComposer.tsx +0 -276
  148. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.stories.tsx +0 -33
  149. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.test.tsx +0 -57
  150. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommentList.tsx +0 -76
  151. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.stories.tsx +0 -25
  152. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.test.tsx +0 -55
  153. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCommitList.tsx +0 -49
  154. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.stories.tsx +0 -24
  155. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.test.tsx +0 -63
  156. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.tsx +0 -19
  157. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.stories.tsx +0 -33
  158. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.test.tsx +0 -62
  159. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFetchFailureAlert.tsx +0 -59
  160. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.stories.tsx +0 -38
  161. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.test.tsx +0 -151
  162. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleFileDiff.tsx +0 -245
  163. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.stories.tsx +0 -514
  164. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.test.tsx +0 -727
  165. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.tsx +0 -387
  166. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.stories.tsx +0 -82
  167. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.test.tsx +0 -52
  168. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemIcon.tsx +0 -32
  169. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.stories.tsx +0 -48
  170. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.test.tsx +0 -235
  171. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.tsx +0 -145
  172. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.stories.tsx +0 -29
  173. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.test.tsx +0 -30
  174. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestMergeableChip.tsx +0 -50
  175. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.stories.tsx +0 -38
  176. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.test.tsx +0 -54
  177. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestStatusBadges.tsx +0 -60
  178. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.stories.tsx +0 -56
  179. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.test.tsx +0 -111
  180. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleAirplaneModeButton.tsx +0 -92
  181. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.stories.tsx +0 -51
  182. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.test.tsx +0 -59
  183. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsolePanel.tsx +0 -39
  184. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.stories.tsx +0 -207
  185. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.test.tsx +0 -332
  186. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTabList.tsx +0 -211
  187. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.stories.tsx +0 -49
  188. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.test.tsx +0 -157
  189. package/src/adapter/entry-points/console/ui/src/features/console/components/layout/ConsoleTimerSettingsModalDialog.tsx +0 -118
  190. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.stories.tsx +0 -23
  191. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.test.tsx +0 -40
  192. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleCopyStoryNameButton.tsx +0 -17
  193. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.stories.tsx +0 -101
  194. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.test.tsx +0 -102
  195. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemList.tsx +0 -75
  196. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.stories.tsx +0 -40
  197. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.test.tsx +0 -213
  198. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleItemSummary.tsx +0 -115
  199. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.stories.tsx +0 -50
  200. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.test.tsx +0 -98
  201. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedItemRow.tsx +0 -66
  202. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.stories.tsx +0 -69
  203. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.test.tsx +0 -101
  204. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleQueuedList.tsx +0 -75
  205. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.stories.tsx +0 -137
  206. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.test.tsx +0 -554
  207. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryList.tsx +0 -400
  208. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.stories.tsx +0 -30
  209. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.test.tsx +0 -111
  210. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStoryReorderPanel.tsx +0 -91
  211. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.stories.tsx +0 -27
  212. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.test.tsx +0 -24
  213. package/src/adapter/entry-points/console/ui/src/features/console/components/list/ConsoleStorySummary.tsx +0 -28
  214. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.stories.tsx +0 -14
  215. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.test.tsx +0 -21
  216. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleCloseActions.tsx +0 -26
  217. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.stories.tsx +0 -14
  218. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.test.tsx +0 -40
  219. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleDangerousActions.tsx +0 -37
  220. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleErrorToast.stories.tsx +0 -33
  221. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.stories.tsx +0 -20
  222. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.test.tsx +0 -48
  223. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleNextActionDateActions.tsx +0 -42
  224. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.stories.tsx +0 -115
  225. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.test.tsx +0 -262
  226. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOfflinePendingActionsPanel.tsx +0 -123
  227. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.stories.tsx +0 -65
  228. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.test.tsx +0 -159
  229. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleOperationMenu.tsx +0 -55
  230. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.stories.tsx +0 -20
  231. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.test.tsx +0 -93
  232. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsolePullRequestReviewActions.tsx +0 -45
  233. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.stories.tsx +0 -17
  234. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.test.tsx +0 -49
  235. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleStatusActions.tsx +0 -66
  236. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.stories.tsx +0 -47
  237. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.test.tsx +0 -95
  238. package/src/adapter/entry-points/console/ui/src/features/console/components/operations/ConsoleUndoToast.tsx +0 -62
  239. package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.stories.tsx +0 -32
  240. package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.test.tsx +0 -101
  241. package/src/adapter/entry-points/console/ui/src/features/console/components/shared/ConsoleClipboardCopyButton.tsx +0 -80
  242. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useAirplaneMode.test.ts +0 -304
  243. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useAirplaneMode.ts +0 -167
  244. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleActionQueue.test.ts +0 -498
  245. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleActionQueue.ts +0 -277
  246. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleCaches.test.ts +0 -99
  247. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleCaches.ts +0 -90
  248. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleDetailPrefetch.test.ts +0 -110
  249. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleDetailPrefetch.ts +0 -83
  250. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleFeaturesConfig.test.ts +0 -51
  251. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleFeaturesConfig.ts +0 -39
  252. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleItemDetailData.test.ts +0 -229
  253. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleItemDetailData.ts +0 -194
  254. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleNavigation.test.ts +0 -151
  255. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleNavigation.ts +0 -128
  256. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOperations.test.ts +0 -629
  257. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOperations.ts +0 -417
  258. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOverlay.test.ts +0 -40
  259. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleOverlay.ts +0 -71
  260. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsolePjcode.test.ts +0 -24
  261. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsolePjcode.ts +0 -17
  262. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectList.test.ts +0 -97
  263. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectList.ts +0 -44
  264. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectTimer.test.ts +0 -59
  265. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleProjectTimer.ts +0 -26
  266. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleReferenceLink.test.ts +0 -48
  267. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleReferenceLink.ts +0 -39
  268. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleResource.test.ts +0 -41
  269. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleResource.ts +0 -57
  270. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleSwipeNavigation.test.ts +0 -115
  271. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleSwipeNavigation.ts +0 -115
  272. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.test.ts +0 -546
  273. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTabData.ts +0 -278
  274. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTimerSettings.test.ts +0 -110
  275. package/src/adapter/entry-points/console/ui/src/features/console/hooks/useConsoleTimerSettings.ts +0 -70
  276. package/src/adapter/entry-points/console/ui/src/features/console/lib/airplaneSnapshot.test.ts +0 -387
  277. package/src/adapter/entry-points/console/ui/src/features/console/lib/airplaneSnapshot.ts +0 -407
  278. package/src/adapter/entry-points/console/ui/src/features/console/lib/consoleApi.test.ts +0 -446
  279. package/src/adapter/entry-points/console/ui/src/features/console/lib/consoleApi.ts +0 -533
  280. package/src/adapter/entry-points/console/ui/src/features/console/lib/imageProxy.test.ts +0 -78
  281. package/src/adapter/entry-points/console/ui/src/features/console/lib/imageProxy.ts +0 -34
  282. package/src/adapter/entry-points/console/ui/src/features/console/lib/markdown.test.ts +0 -252
  283. package/src/adapter/entry-points/console/ui/src/features/console/lib/markdown.ts +0 -207
  284. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidLoader.test.ts +0 -27
  285. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidLoader.ts +0 -71
  286. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidZoom.test.ts +0 -88
  287. package/src/adapter/entry-points/console/ui/src/features/console/lib/mermaidZoom.ts +0 -34
  288. package/src/adapter/entry-points/console/ui/src/features/console/lib/navigation.ts +0 -7
  289. package/src/adapter/entry-points/console/ui/src/features/console/lib/resourceCache.test.ts +0 -104
  290. package/src/adapter/entry-points/console/ui/src/features/console/lib/resourceCache.ts +0 -79
  291. package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.test.ts +0 -200
  292. package/src/adapter/entry-points/console/ui/src/features/console/logic/actionToast.ts +0 -122
  293. package/src/adapter/entry-points/console/ui/src/features/console/logic/clipboard.test.ts +0 -90
  294. package/src/adapter/entry-points/console/ui/src/features/console/logic/clipboard.ts +0 -37
  295. package/src/adapter/entry-points/console/ui/src/features/console/logic/colors.test.ts +0 -34
  296. package/src/adapter/entry-points/console/ui/src/features/console/logic/colors.ts +0 -85
  297. package/src/adapter/entry-points/console/ui/src/features/console/logic/diff.test.ts +0 -81
  298. package/src/adapter/entry-points/console/ui/src/features/console/logic/diff.ts +0 -61
  299. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileStatus.test.ts +0 -35
  300. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileStatus.ts +0 -21
  301. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileTree.test.ts +0 -96
  302. package/src/adapter/entry-points/console/ui/src/features/console/logic/fileTree.ts +0 -93
  303. package/src/adapter/entry-points/console/ui/src/features/console/logic/grouping.test.ts +0 -229
  304. package/src/adapter/entry-points/console/ui/src/features/console/logic/grouping.ts +0 -106
  305. package/src/adapter/entry-points/console/ui/src/features/console/logic/imageFile.test.ts +0 -18
  306. package/src/adapter/entry-points/console/ui/src/features/console/logic/imageFile.ts +0 -16
  307. package/src/adapter/entry-points/console/ui/src/features/console/logic/itemIcons.test.ts +0 -97
  308. package/src/adapter/entry-points/console/ui/src/features/console/logic/itemIcons.ts +0 -95
  309. package/src/adapter/entry-points/console/ui/src/features/console/logic/navigation.test.ts +0 -53
  310. package/src/adapter/entry-points/console/ui/src/features/console/logic/navigation.ts +0 -33
  311. package/src/adapter/entry-points/console/ui/src/features/console/logic/operations.test.ts +0 -72
  312. package/src/adapter/entry-points/console/ui/src/features/console/logic/operations.ts +0 -61
  313. package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.test.ts +0 -325
  314. package/src/adapter/entry-points/console/ui/src/features/console/logic/overlay.ts +0 -94
  315. package/src/adapter/entry-points/console/ui/src/features/console/logic/postedComments.test.ts +0 -44
  316. package/src/adapter/entry-points/console/ui/src/features/console/logic/postedComments.ts +0 -17
  317. package/src/adapter/entry-points/console/ui/src/features/console/logic/references.test.ts +0 -103
  318. package/src/adapter/entry-points/console/ui/src/features/console/logic/references.ts +0 -64
  319. package/src/adapter/entry-points/console/ui/src/features/console/logic/relativeTime.test.ts +0 -74
  320. package/src/adapter/entry-points/console/ui/src/features/console/logic/relativeTime.ts +0 -53
  321. package/src/adapter/entry-points/console/ui/src/features/console/logic/swipe.test.ts +0 -34
  322. package/src/adapter/entry-points/console/ui/src/features/console/logic/swipe.ts +0 -28
  323. package/src/adapter/entry-points/console/ui/src/features/console/logic/tabAdvance.test.ts +0 -89
  324. package/src/adapter/entry-points/console/ui/src/features/console/logic/tabAdvance.ts +0 -30
  325. package/src/adapter/entry-points/console/ui/src/features/console/logic/timerSettings.test.ts +0 -61
  326. package/src/adapter/entry-points/console/ui/src/features/console/logic/timerSettings.ts +0 -77
  327. package/src/adapter/entry-points/console/ui/src/features/console/logic/types.ts +0 -173
  328. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.test.tsx +0 -629
  329. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleItemDetailContainer.tsx +0 -351
  330. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.test.tsx +0 -1469
  331. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsolePage.tsx +0 -736
  332. package/src/adapter/entry-points/console/ui/src/features/console/pages/ConsoleReferenceLinkContainer.tsx +0 -25
  333. package/src/adapter/entry-points/console/ui/src/features/console/testing/fixtures.ts +0 -418
  334. package/src/adapter/entry-points/console/ui/src/index.css +0 -1592
  335. package/src/adapter/entry-points/console/ui/src/lib/utils.ts +0 -4
  336. package/src/adapter/entry-points/console/ui/src/main.tsx +0 -21
  337. package/src/adapter/entry-points/console/ui/src/vite-env.d.ts +0 -1
  338. package/src/adapter/entry-points/console/ui/tsconfig.json +0 -26
  339. package/src/adapter/entry-points/console/ui/vite.config.ts +0 -24
  340. package/src/adapter/entry-points/console/ui-dist/assets/index-BYDbK1Fj.js +0 -88
  341. package/src/adapter/entry-points/console/ui-dist/assets/index-KyQISRuQ.css +0 -2
  342. package/src/adapter/entry-points/console/ui-dist/index.html +0 -13
  343. package/src/adapter/entry-points/console/ui-dist/sw.js +0 -60
  344. package/src/adapter/entry-points/console/webServer.test.ts +0 -2945
  345. package/src/adapter/entry-points/console/webServer.ts +0 -940
  346. package/src/adapter/entry-points/function/getStoryObjectMap.ts +0 -3
  347. package/src/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.test.ts +0 -218
  348. package/src/adapter/entry-points/handlers/FileSystemConsoleTabsRepository.ts +0 -113
  349. package/src/adapter/entry-points/handlers/GetStoryObjectMapUseCaseHandler.test.ts +0 -110
  350. package/src/adapter/entry-points/handlers/GetStoryObjectMapUseCaseHandler.ts +0 -116
  351. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.test.ts +0 -859
  352. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +0 -984
  353. package/src/adapter/entry-points/handlers/InTmuxByHumanSessionTokenCountHandler.test.ts +0 -126
  354. package/src/adapter/entry-points/handlers/InTmuxByHumanSessionTokenCountHandler.ts +0 -80
  355. package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.test.ts +0 -491
  356. package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.ts +0 -137
  357. package/src/adapter/entry-points/handlers/OauthTokenSelectHandler.test.ts +0 -508
  358. package/src/adapter/entry-points/handlers/OauthTokenSelectHandler.ts +0 -156
  359. package/src/adapter/entry-points/handlers/consoleListsWriter.test.ts +0 -332
  360. package/src/adapter/entry-points/handlers/consoleListsWriter.ts +0 -60
  361. package/src/adapter/entry-points/handlers/dashboardRowWriter.test.ts +0 -112
  362. package/src/adapter/entry-points/handlers/dashboardRowWriter.ts +0 -51
  363. package/src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.test.ts +0 -285
  364. package/src/adapter/entry-points/handlers/inTmuxByHumanDataWriter.ts +0 -109
  365. package/src/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.test.ts +0 -170
  366. package/src/adapter/entry-points/handlers/inTmuxByHumanSessionReconciler.ts +0 -40
  367. package/src/adapter/entry-points/handlers/machineStatusWriter.test.ts +0 -191
  368. package/src/adapter/entry-points/handlers/machineStatusWriter.ts +0 -110
  369. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.test.ts +0 -548
  370. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.ts +0 -192
  371. package/src/adapter/entry-points/handlers/ownerCallFileCleaner.test.ts +0 -111
  372. package/src/adapter/entry-points/handlers/ownerCallFileCleaner.ts +0 -25
  373. package/src/adapter/entry-points/handlers/ownerCallFileStore.test.ts +0 -286
  374. package/src/adapter/entry-points/handlers/ownerCallFileStore.ts +0 -145
  375. package/src/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.test.ts +0 -55
  376. package/src/adapter/entry-points/handlers/ownerReplyMarkerDirectoryResolve.ts +0 -36
  377. package/src/adapter/entry-points/handlers/resetDegeneratedTmuxSessions.test.ts +0 -72
  378. package/src/adapter/entry-points/handlers/resetDegeneratedTmuxSessions.ts +0 -74
  379. package/src/adapter/entry-points/handlers/rotationOrderFileWriter.test.ts +0 -181
  380. package/src/adapter/entry-points/handlers/rotationOrderFileWriter.ts +0 -18
  381. package/src/adapter/entry-points/handlers/situationFileWriter.test.ts +0 -489
  382. package/src/adapter/entry-points/handlers/situationFileWriter.ts +0 -176
  383. package/src/adapter/entry-points/handlers/staleTmuxSessionCleaner.test.ts +0 -169
  384. package/src/adapter/entry-points/handlers/staleTmuxSessionCleaner.ts +0 -32
  385. package/src/adapter/entry-points/handlers/subscriptionDisabledTokenHandler.ts +0 -41
  386. package/src/adapter/entry-points/handlers/tokenExhaustionHandover.ts +0 -81
  387. package/src/adapter/entry-points/handlers/tokenStatusWriter.test.ts +0 -266
  388. package/src/adapter/entry-points/handlers/tokenStatusWriter.ts +0 -262
  389. package/src/adapter/proxy/ClaudeMessageResponseParser.test.ts +0 -211
  390. package/src/adapter/proxy/ClaudeMessageResponseParser.ts +0 -181
  391. package/src/adapter/proxy/RateLimitCache.test.ts +0 -1077
  392. package/src/adapter/proxy/RateLimitCache.ts +0 -385
  393. package/src/adapter/proxy/TokenListLoader.test.ts +0 -183
  394. package/src/adapter/proxy/TokenListLoader.ts +0 -75
  395. package/src/adapter/proxy/ensureProxyRunning.test.ts +0 -85
  396. package/src/adapter/proxy/ensureProxyRunning.ts +0 -41
  397. package/src/adapter/proxy/proxyEntry.test.ts +0 -552
  398. package/src/adapter/proxy/proxyEntry.ts +0 -214
  399. package/src/adapter/repositories/BaseGitHubRepository.test.ts +0 -26
  400. package/src/adapter/repositories/BaseGitHubRepository.ts +0 -26
  401. package/src/adapter/repositories/BrowserGitHubProjectRepository.test.ts +0 -108
  402. package/src/adapter/repositories/BrowserGitHubProjectRepository.ts +0 -118
  403. package/src/adapter/repositories/CliGitHubGraphqlRateLimitRepository.test.ts +0 -71
  404. package/src/adapter/repositories/CliGitHubGraphqlRateLimitRepository.ts +0 -21
  405. package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.test.ts +0 -324
  406. package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.ts +0 -148
  407. package/src/adapter/repositories/FetchWebhookRepository.ts +0 -8
  408. package/src/adapter/repositories/FileHandoverStateRepository.test.ts +0 -114
  409. package/src/adapter/repositories/FileHandoverStateRepository.ts +0 -73
  410. package/src/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.test.ts +0 -514
  411. package/src/adapter/repositories/FileSystemInteractiveLiveSessionTranscriptResolver.ts +0 -109
  412. package/src/adapter/repositories/FileSystemKevReportWatermarkRepository.test.ts +0 -284
  413. package/src/adapter/repositories/FileSystemKevReportWatermarkRepository.ts +0 -128
  414. package/src/adapter/repositories/FileSystemSessionAssistantTurnsRepository.test.ts +0 -138
  415. package/src/adapter/repositories/FileSystemSessionAssistantTurnsRepository.ts +0 -113
  416. package/src/adapter/repositories/FileSystemSessionDegenerationCooldownStateRepository.test.ts +0 -121
  417. package/src/adapter/repositories/FileSystemSessionDegenerationCooldownStateRepository.ts +0 -103
  418. package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.test.ts +0 -360
  419. package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.ts +0 -77
  420. package/src/adapter/repositories/FileSystemSessionRecordReader.test.ts +0 -59
  421. package/src/adapter/repositories/FileSystemSessionRecordReader.ts +0 -31
  422. package/src/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.test.ts +0 -287
  423. package/src/adapter/repositories/FileSystemSilentSessionCandidateStateRepository.ts +0 -125
  424. package/src/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.test.ts +0 -285
  425. package/src/adapter/repositories/FileSystemSilentSessionHubTaskStatusCacheRepository.ts +0 -119
  426. package/src/adapter/repositories/FileSystemSubAgentLivenessResolver.test.ts +0 -237
  427. package/src/adapter/repositories/FileSystemSubAgentLivenessResolver.ts +0 -57
  428. package/src/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.test.ts +0 -56
  429. package/src/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.ts +0 -32
  430. package/src/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.test.ts +0 -68
  431. package/src/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.ts +0 -23
  432. package/src/adapter/repositories/GitHubIssueCheckpointRepository.test.ts +0 -51
  433. package/src/adapter/repositories/GitHubIssueCheckpointRepository.ts +0 -47
  434. package/src/adapter/repositories/GitHubIssueCommentRepository.test.ts +0 -278
  435. package/src/adapter/repositories/GitHubIssueCommentRepository.ts +0 -109
  436. package/src/adapter/repositories/GoogleSpreadsheetRepository.integration.test.ts +0 -265
  437. package/src/adapter/repositories/GoogleSpreadsheetRepository.test.ts +0 -431
  438. package/src/adapter/repositories/GoogleSpreadsheetRepository.ts +0 -268
  439. package/src/adapter/repositories/GraphqlProjectRepository.diskCache.test.ts +0 -272
  440. package/src/adapter/repositories/GraphqlProjectRepository.errorHandling.test.ts +0 -111
  441. package/src/adapter/repositories/GraphqlProjectRepository.fetchProjectId.test.ts +0 -254
  442. package/src/adapter/repositories/GraphqlProjectRepository.test.ts +0 -209
  443. package/src/adapter/repositories/GraphqlProjectRepository.ts +0 -707
  444. package/src/adapter/repositories/GraphqlProjectRepositoryProjectLocation.test.ts +0 -297
  445. package/src/adapter/repositories/KyHttpRepository.ts +0 -8
  446. package/src/adapter/repositories/KySlackRepository.test.ts +0 -172
  447. package/src/adapter/repositories/KySlackRepository.ts +0 -298
  448. package/src/adapter/repositories/LocalCommandIssueAttachmentRepository.test.ts +0 -193
  449. package/src/adapter/repositories/LocalCommandIssueAttachmentRepository.ts +0 -106
  450. package/src/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.test.ts +0 -190
  451. package/src/adapter/repositories/LocalProcessLiveSessionProcessSnapshotProvider.ts +0 -102
  452. package/src/adapter/repositories/LocalStorageCacheRepository.test.ts +0 -265
  453. package/src/adapter/repositories/LocalStorageCacheRepository.ts +0 -79
  454. package/src/adapter/repositories/LocalStorageRepository.integration.test.ts +0 -142
  455. package/src/adapter/repositories/LocalStorageRepository.test.ts +0 -173
  456. package/src/adapter/repositories/LocalStorageRepository.ts +0 -30
  457. package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.test.ts +0 -15
  458. package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.ts +0 -9
  459. package/src/adapter/repositories/NodeLocalCommandRunner.largeOutput.test.ts +0 -16
  460. package/src/adapter/repositories/NodeLocalCommandRunner.test.ts +0 -118
  461. package/src/adapter/repositories/NodeLocalCommandRunner.ts +0 -66
  462. package/src/adapter/repositories/NodeProcessSignalRepository.test.ts +0 -82
  463. package/src/adapter/repositories/NodeProcessSignalRepository.ts +0 -47
  464. package/src/adapter/repositories/NodeSubAgentProcessLister.test.ts +0 -44
  465. package/src/adapter/repositories/NodeSubAgentProcessLister.ts +0 -40
  466. package/src/adapter/repositories/NodeTmuxSessionRepository.test.ts +0 -546
  467. package/src/adapter/repositories/NodeTmuxSessionRepository.ts +0 -245
  468. package/src/adapter/repositories/OauthAPIClaudeRepository.ts +0 -279
  469. package/src/adapter/repositories/OauthAPIProxyClaudeRepository.test.ts +0 -166
  470. package/src/adapter/repositories/OauthAPIProxyClaudeRepository.ts +0 -32
  471. package/src/adapter/repositories/OauthProxyClaudeRepository.test.ts +0 -428
  472. package/src/adapter/repositories/OauthProxyClaudeRepository.ts +0 -124
  473. package/src/adapter/repositories/ProcClaudeHandoverSessionRepository.test.ts +0 -242
  474. package/src/adapter/repositories/ProcClaudeHandoverSessionRepository.ts +0 -261
  475. package/src/adapter/repositories/ProcClaudeInteractiveSessionRepository.test.ts +0 -184
  476. package/src/adapter/repositories/ProcClaudeInteractiveSessionRepository.ts +0 -138
  477. package/src/adapter/repositories/ProcClaudeLiveSessionRepository.test.ts +0 -208
  478. package/src/adapter/repositories/ProcClaudeLiveSessionRepository.ts +0 -130
  479. package/src/adapter/repositories/ProcFsProcessEnvironReader.test.ts +0 -60
  480. package/src/adapter/repositories/ProcFsProcessEnvironReader.ts +0 -38
  481. package/src/adapter/repositories/ProcHostMetricsRepository.test.ts +0 -207
  482. package/src/adapter/repositories/ProcHostMetricsRepository.ts +0 -181
  483. package/src/adapter/repositories/ProcTakeOwnershipSpawnRepository.test.ts +0 -231
  484. package/src/adapter/repositories/ProcTakeOwnershipSpawnRepository.ts +0 -134
  485. package/src/adapter/repositories/ProcessListSessionSubAgentActivityRepository.test.ts +0 -121
  486. package/src/adapter/repositories/ProcessListSessionSubAgentActivityRepository.ts +0 -58
  487. package/src/adapter/repositories/ProjectIssuesCacheRepository.test.ts +0 -218
  488. package/src/adapter/repositories/ProjectIssuesCacheRepository.ts +0 -141
  489. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.test.ts +0 -1195
  490. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.ts +0 -185
  491. package/src/adapter/repositories/ProxyRateLimitCacheRepository.test.ts +0 -116
  492. package/src/adapter/repositories/ProxyRateLimitCacheRepository.ts +0 -67
  493. package/src/adapter/repositories/RateLimitSnapshotRepository.ts +0 -50
  494. package/src/adapter/repositories/RealSleeper.test.ts +0 -19
  495. package/src/adapter/repositories/RealSleeper.ts +0 -12
  496. package/src/adapter/repositories/RestProjectRepository.test.ts +0 -277
  497. package/src/adapter/repositories/RestProjectRepository.ts +0 -129
  498. package/src/adapter/repositories/SqliteClaudeMessageResponseRepository.test.ts +0 -313
  499. package/src/adapter/repositories/SqliteClaudeMessageResponseRepository.ts +0 -164
  500. package/src/adapter/repositories/SystemDateRepository.test.ts +0 -60
  501. package/src/adapter/repositories/SystemDateRepository.ts +0 -34
  502. package/src/adapter/repositories/TmuxSilentSessionNotificationRepository.test.ts +0 -253
  503. package/src/adapter/repositories/TmuxSilentSessionNotificationRepository.ts +0 -158
  504. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.queuedReply.test.ts +0 -171
  505. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.singleScan.test.ts +0 -86
  506. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.test.ts +0 -996
  507. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts +0 -396
  508. package/src/adapter/repositories/TranscriptRefusalTailStatusProvider.test.ts +0 -208
  509. package/src/adapter/repositories/TranscriptRefusalTailStatusProvider.ts +0 -80
  510. package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.test.ts +0 -1674
  511. package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.ts +0 -459
  512. package/src/adapter/repositories/clSessionScopeUnitName.test.ts +0 -76
  513. package/src/adapter/repositories/clSessionScopeUnitName.ts +0 -5
  514. package/src/adapter/repositories/clSessionScopeUnitNameFromCgroupContent.test.ts +0 -34
  515. package/src/adapter/repositories/clSessionScopeUnitNameFromCgroupContent.ts +0 -8
  516. package/src/adapter/repositories/githubGraphqlClient.test.ts +0 -479
  517. package/src/adapter/repositories/githubGraphqlClient.ts +0 -243
  518. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.test.ts +0 -5182
  519. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +0 -3303
  520. package/src/adapter/repositories/issue/ApiV3IssueRepository.test.ts +0 -46
  521. package/src/adapter/repositories/issue/ApiV3IssueRepository.ts +0 -88
  522. package/src/adapter/repositories/issue/GraphqlProjectItemRepository.test.ts +0 -1776
  523. package/src/adapter/repositories/issue/GraphqlProjectItemRepository.ts +0 -1552
  524. package/src/adapter/repositories/issue/RestIssueRepository.test.ts +0 -393
  525. package/src/adapter/repositories/issue/RestIssueRepository.ts +0 -252
  526. package/src/adapter/repositories/issue/gitHubRawUrl.test.ts +0 -29
  527. package/src/adapter/repositories/issue/gitHubRawUrl.ts +0 -30
  528. package/src/adapter/repositories/issue/githubRateLimitRetry.test.ts +0 -167
  529. package/src/adapter/repositories/issue/githubRateLimitRetry.ts +0 -109
  530. package/src/adapter/repositories/localStorageCacheDirectory.test.ts +0 -81
  531. package/src/adapter/repositories/localStorageCacheDirectory.ts +0 -13
  532. package/src/adapter/repositories/projectFieldDefinition.test.ts +0 -191
  533. package/src/adapter/repositories/projectFieldDefinition.ts +0 -144
  534. package/src/adapter/repositories/utils.test.ts +0 -55
  535. package/src/adapter/repositories/utils.ts +0 -45
  536. package/src/domain/entities/ClaudeHandoverSession.ts +0 -12
  537. package/src/domain/entities/ClaudeMessageResponse.ts +0 -31
  538. package/src/domain/entities/ClaudeTokenUsage.ts +0 -17
  539. package/src/domain/entities/ClaudeWindowUsage.ts +0 -5
  540. package/src/domain/entities/Comment.ts +0 -5
  541. package/src/domain/entities/InteractiveLiveSession.ts +0 -6
  542. package/src/domain/entities/Issue.ts +0 -31
  543. package/src/domain/entities/KevReportWatermark.ts +0 -4
  544. package/src/domain/entities/LiveSessionActivitySnapshot.ts +0 -14
  545. package/src/domain/entities/LiveSessionOutputActivity.ts +0 -4
  546. package/src/domain/entities/LiveSessionProcessSnapshot.ts +0 -18
  547. package/src/domain/entities/LiveTmuxSession.ts +0 -4
  548. package/src/domain/entities/Member.ts +0 -3
  549. package/src/domain/entities/OutputDegeneration.ts +0 -10
  550. package/src/domain/entities/Project.ts +0 -88
  551. package/src/domain/entities/ProjectField.ts +0 -3
  552. package/src/domain/entities/ProjectFieldName.ts +0 -2
  553. package/src/domain/entities/ProjectFieldSingleSelect.ts +0 -8
  554. package/src/domain/entities/ProjectFieldSingleSelectOption.ts +0 -8
  555. package/src/domain/entities/RequiredProjectField.ts +0 -68
  556. package/src/domain/entities/SearchedIssue.ts +0 -11
  557. package/src/domain/entities/StoryObjectMap.ts +0 -12
  558. package/src/domain/entities/TokenExhaustionHandoverState.ts +0 -8
  559. package/src/domain/entities/WorkflowStatus.ts +0 -66
  560. package/src/domain/usecases/ActionAnnouncementUseCase.test.ts +0 -91
  561. package/src/domain/usecases/ActionAnnouncementUseCase.ts +0 -78
  562. package/src/domain/usecases/AgentDesignationLabelAdoptUseCase.test.ts +0 -222
  563. package/src/domain/usecases/AgentDesignationLabelAdoptUseCase.ts +0 -76
  564. package/src/domain/usecases/AnalyzeProblemByIssueUseCase.test.ts +0 -118
  565. package/src/domain/usecases/AnalyzeProblemByIssueUseCase.ts +0 -112
  566. package/src/domain/usecases/AnalyzeStoriesUseCase.test.ts +0 -82
  567. package/src/domain/usecases/AnalyzeStoriesUseCase.ts +0 -296
  568. package/src/domain/usecases/AssignNoAssigneeIssueToManagerUseCase.test.ts +0 -578
  569. package/src/domain/usecases/AssignNoAssigneeIssueToManagerUseCase.ts +0 -137
  570. package/src/domain/usecases/CONTRIBUTING_FOR_TEST.md +0 -259
  571. package/src/domain/usecases/ChangeStatusByStoryColorUseCase.test.ts +0 -437
  572. package/src/domain/usecases/ChangeStatusByStoryColorUseCase.ts +0 -80
  573. package/src/domain/usecases/ChangeTargetPullRequestApprover.test.ts +0 -248
  574. package/src/domain/usecases/ChangeTargetPullRequestApprover.ts +0 -69
  575. package/src/domain/usecases/CheckIssueReviewReadinessUseCase.test.ts +0 -411
  576. package/src/domain/usecases/CheckIssueReviewReadinessUseCase.ts +0 -142
  577. package/src/domain/usecases/ClearDependedIssueURLUseCase.test.ts +0 -1120
  578. package/src/domain/usecases/ClearDependedIssueURLUseCase.ts +0 -161
  579. package/src/domain/usecases/ClearPastNextActionDateHourUseCase.test.ts +0 -345
  580. package/src/domain/usecases/ClearPastNextActionDateHourUseCase.ts +0 -81
  581. package/src/domain/usecases/CliErrorReportUseCase.test.ts +0 -162
  582. package/src/domain/usecases/CliErrorReportUseCase.ts +0 -72
  583. package/src/domain/usecases/ConflictedIssueRevertUseCase.test.ts +0 -886
  584. package/src/domain/usecases/ConflictedIssueRevertUseCase.ts +0 -146
  585. package/src/domain/usecases/CreateEstimationIssueUseCase.test.ts +0 -227
  586. package/src/domain/usecases/CreateEstimationIssueUseCase.ts +0 -205
  587. package/src/domain/usecases/CreateNewStoryByLabelUseCase.test.ts +0 -1084
  588. package/src/domain/usecases/CreateNewStoryByLabelUseCase.ts +0 -146
  589. package/src/domain/usecases/DailySecurityScanUseCase.test.ts +0 -1709
  590. package/src/domain/usecases/DailySecurityScanUseCase.ts +0 -476
  591. package/src/domain/usecases/DefaultSilentSessionMessageComposer.test.ts +0 -533
  592. package/src/domain/usecases/DefaultSilentSessionMessageComposer.ts +0 -122
  593. package/src/domain/usecases/GetStoryObjectMapUseCase.test.ts +0 -330
  594. package/src/domain/usecases/GetStoryObjectMapUseCase.ts +0 -79
  595. package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +0 -1913
  596. package/src/domain/usecases/HandleScheduledEventUseCase.ts +0 -846
  597. package/src/domain/usecases/InTmuxByHumanSessionTokenCountUseCase.test.ts +0 -175
  598. package/src/domain/usecases/InTmuxByHumanSessionTokenCountUseCase.ts +0 -63
  599. package/src/domain/usecases/IssueNoStatusUpdateUseCase.test.ts +0 -165
  600. package/src/domain/usecases/IssueNoStatusUpdateUseCase.ts +0 -44
  601. package/src/domain/usecases/IssueRejectionEvaluator.test.ts +0 -1137
  602. package/src/domain/usecases/IssueRejectionEvaluator.ts +0 -340
  603. package/src/domain/usecases/LiveSessionOauthTokenSelectUseCase.test.ts +0 -679
  604. package/src/domain/usecases/LiveSessionOauthTokenSelectUseCase.ts +0 -178
  605. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +0 -5441
  606. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +0 -891
  607. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.test.ts +0 -2069
  608. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.ts +0 -489
  609. package/src/domain/usecases/OauthTokenSelectUseCase.test.ts +0 -662
  610. package/src/domain/usecases/OauthTokenSelectUseCase.ts +0 -274
  611. package/src/domain/usecases/OutputDegenerationDetector.test.ts +0 -167
  612. package/src/domain/usecases/OutputDegenerationDetector.ts +0 -169
  613. package/src/domain/usecases/ProjectRequiredFieldCreateUseCase.test.ts +0 -711
  614. package/src/domain/usecases/ProjectRequiredFieldCreateUseCase.ts +0 -146
  615. package/src/domain/usecases/QualityCheckAdvanceUseCase.test.ts +0 -421
  616. package/src/domain/usecases/QualityCheckAdvanceUseCase.ts +0 -76
  617. package/src/domain/usecases/ReopenedDoneIssueRevertUseCase.test.ts +0 -188
  618. package/src/domain/usecases/ReopenedDoneIssueRevertUseCase.ts +0 -57
  619. package/src/domain/usecases/ResolveInteractiveLiveSessionsUseCase.test.ts +0 -303
  620. package/src/domain/usecases/ResolveInteractiveLiveSessionsUseCase.ts +0 -155
  621. package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.test.ts +0 -1838
  622. package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.ts +0 -221
  623. package/src/domain/usecases/RevertOrphanedPreparationUseCase.test.ts +0 -2392
  624. package/src/domain/usecases/RevertOrphanedPreparationUseCase.ts +0 -499
  625. package/src/domain/usecases/SessionOutputDegenerationRecoveryUseCase.test.ts +0 -224
  626. package/src/domain/usecases/SessionOutputDegenerationRecoveryUseCase.ts +0 -142
  627. package/src/domain/usecases/SetDependedIssueUrlForOpenTaskPRsUseCase.test.ts +0 -360
  628. package/src/domain/usecases/SetDependedIssueUrlForOpenTaskPRsUseCase.ts +0 -70
  629. package/src/domain/usecases/SetNoStoryIssueToStoryUseCase.test.ts +0 -400
  630. package/src/domain/usecases/SetNoStoryIssueToStoryUseCase.ts +0 -48
  631. package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.test.ts +0 -696
  632. package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.ts +0 -201
  633. package/src/domain/usecases/SetupTowerDefenceProjectUseCase.test.ts +0 -1363
  634. package/src/domain/usecases/SetupTowerDefenceProjectUseCase.ts +0 -215
  635. package/src/domain/usecases/StaleTaskPullRequestCloseUseCase.test.ts +0 -170
  636. package/src/domain/usecases/StaleTaskPullRequestCloseUseCase.ts +0 -38
  637. package/src/domain/usecases/StaleTmuxSessionKillUseCase.test.ts +0 -283
  638. package/src/domain/usecases/StaleTmuxSessionKillUseCase.ts +0 -98
  639. package/src/domain/usecases/StartPreparationUseCase.test.ts +0 -7822
  640. package/src/domain/usecases/StartPreparationUseCase.ts +0 -876
  641. package/src/domain/usecases/SubscriptionDisabledIssueUseCase.test.ts +0 -200
  642. package/src/domain/usecases/SubscriptionDisabledIssueUseCase.ts +0 -74
  643. package/src/domain/usecases/TokenExhaustionHandoverUseCase.test.ts +0 -838
  644. package/src/domain/usecases/TokenExhaustionHandoverUseCase.ts +0 -439
  645. package/src/domain/usecases/UpdateIssueStatusByLabelUseCase.test.ts +0 -306
  646. package/src/domain/usecases/UpdateIssueStatusByLabelUseCase.ts +0 -64
  647. package/src/domain/usecases/UpdateRateLimitCacheUseCase.test.ts +0 -178
  648. package/src/domain/usecases/UpdateRateLimitCacheUseCase.ts +0 -22
  649. package/src/domain/usecases/adapter-interfaces/ClaudeHandoverSessionRepository.ts +0 -5
  650. package/src/domain/usecases/adapter-interfaces/ClaudeInteractiveSessionRepository.ts +0 -9
  651. package/src/domain/usecases/adapter-interfaces/ClaudeLiveSessionRepository.ts +0 -8
  652. package/src/domain/usecases/adapter-interfaces/ClaudeMessageResponseRepository.ts +0 -5
  653. package/src/domain/usecases/adapter-interfaces/ClaudeRepository.ts +0 -6
  654. package/src/domain/usecases/adapter-interfaces/ClaudeTokenUsageRepository.ts +0 -8
  655. package/src/domain/usecases/adapter-interfaces/ConsoleTabsRepository.ts +0 -12
  656. package/src/domain/usecases/adapter-interfaces/CopilotRepository.ts +0 -3
  657. package/src/domain/usecases/adapter-interfaces/DateRepository.ts +0 -7
  658. package/src/domain/usecases/adapter-interfaces/GitHubGraphqlRateLimitRepository.ts +0 -3
  659. package/src/domain/usecases/adapter-interfaces/HttpRepository.ts +0 -3
  660. package/src/domain/usecases/adapter-interfaces/InteractiveLiveSessionTranscriptResolver.ts +0 -7
  661. package/src/domain/usecases/adapter-interfaces/IssueAttachmentRepository.ts +0 -9
  662. package/src/domain/usecases/adapter-interfaces/IssueCheckpointRepository.ts +0 -3
  663. package/src/domain/usecases/adapter-interfaces/IssueCommentRepository.ts +0 -7
  664. package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +0 -229
  665. package/src/domain/usecases/adapter-interfaces/KevReportWatermarkRepository.ts +0 -11
  666. package/src/domain/usecases/adapter-interfaces/LiveSessionProcessSnapshotProvider.ts +0 -5
  667. package/src/domain/usecases/adapter-interfaces/LocalCommandRunner.ts +0 -16
  668. package/src/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.ts +0 -5
  669. package/src/domain/usecases/adapter-interfaces/ProcessEnvironReader.ts +0 -3
  670. package/src/domain/usecases/adapter-interfaces/ProcessSignalRepository.ts +0 -5
  671. package/src/domain/usecases/adapter-interfaces/ProjectRepository.ts +0 -29
  672. package/src/domain/usecases/adapter-interfaces/RateLimitCacheRepository.ts +0 -10
  673. package/src/domain/usecases/adapter-interfaces/RefusalTailStatusProvider.ts +0 -5
  674. package/src/domain/usecases/adapter-interfaces/SessionAssistantTurnsRepository.ts +0 -6
  675. package/src/domain/usecases/adapter-interfaces/SessionDegenerationCooldownStateRepository.ts +0 -4
  676. package/src/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.ts +0 -7
  677. package/src/domain/usecases/adapter-interfaces/SessionRecordReader.ts +0 -3
  678. package/src/domain/usecases/adapter-interfaces/SessionSubAgentActivityRepository.ts +0 -8
  679. package/src/domain/usecases/adapter-interfaces/SilentSessionCandidateStateRepository.ts +0 -10
  680. package/src/domain/usecases/adapter-interfaces/SilentSessionHubTaskStatusCacheRepository.ts +0 -20
  681. package/src/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.ts +0 -18
  682. package/src/domain/usecases/adapter-interfaces/SilentSessionNotificationRepository.ts +0 -6
  683. package/src/domain/usecases/adapter-interfaces/SlackRepository.ts +0 -20
  684. package/src/domain/usecases/adapter-interfaces/Sleeper.ts +0 -3
  685. package/src/domain/usecases/adapter-interfaces/SpreadsheetRepository.ts +0 -18
  686. package/src/domain/usecases/adapter-interfaces/StatusDefaultRepository.ts +0 -5
  687. package/src/domain/usecases/adapter-interfaces/SubAgentLivenessResolver.ts +0 -6
  688. package/src/domain/usecases/adapter-interfaces/SubAgentProcessLister.ts +0 -8
  689. package/src/domain/usecases/adapter-interfaces/SubAgentSilentSecondsResolver.ts +0 -3
  690. package/src/domain/usecases/adapter-interfaces/SubAgentTranscriptDirectoryResolver.ts +0 -6
  691. package/src/domain/usecases/adapter-interfaces/TakeOwnershipSpawnRepository.ts +0 -9
  692. package/src/domain/usecases/adapter-interfaces/TmuxSessionRepository.ts +0 -20
  693. package/src/domain/usecases/adapter-interfaces/TokenExhaustionHandoverStateRepository.ts +0 -6
  694. package/src/domain/usecases/adapter-interfaces/TokenRateLimitSnapshotRepository.ts +0 -22
  695. package/src/domain/usecases/adapter-interfaces/WebhookRepository.ts +0 -3
  696. package/src/domain/usecases/agentReportPrefix.ts +0 -1
  697. package/src/domain/usecases/autoStatusCheckComments.ts +0 -1
  698. package/src/domain/usecases/console/.gitkeep +0 -0
  699. package/src/domain/usecases/console/GenerateConsoleListsUseCase.test.ts +0 -887
  700. package/src/domain/usecases/console/GenerateConsoleListsUseCase.ts +0 -368
  701. package/src/domain/usecases/dashboard/ComposeDashboardUseCase.test.ts +0 -654
  702. package/src/domain/usecases/dashboard/ComposeDashboardUseCase.ts +0 -318
  703. package/src/domain/usecases/dashboard/DashboardProjectCode.test.ts +0 -34
  704. package/src/domain/usecases/dashboard/DashboardProjectCode.ts +0 -27
  705. package/src/domain/usecases/dashboard/GenerateDashboardRowUseCase.test.ts +0 -160
  706. package/src/domain/usecases/dashboard/GenerateDashboardRowUseCase.ts +0 -69
  707. package/src/domain/usecases/dashboard/GenerateTokenStatusUseCase.test.ts +0 -362
  708. package/src/domain/usecases/dashboard/GenerateTokenStatusUseCase.ts +0 -234
  709. package/src/domain/usecases/ensureAgentOptionAndGetId.ts +0 -47
  710. package/src/domain/usecases/extractFencedJsonBlocks.test.ts +0 -40
  711. package/src/domain/usecases/extractFencedJsonBlocks.ts +0 -21
  712. package/src/domain/usecases/extractNextStepAgent.test.ts +0 -58
  713. package/src/domain/usecases/extractNextStepAgent.ts +0 -18
  714. package/src/domain/usecases/extractNextStepAgentFromComments.ts +0 -13
  715. package/src/domain/usecases/findLastAgentReport.test.ts +0 -121
  716. package/src/domain/usecases/findLastAgentReport.ts +0 -14
  717. package/src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.test.ts +0 -339
  718. package/src/domain/usecases/intmux/GenerateInTmuxByHumanDataUseCase.ts +0 -188
  719. package/src/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.test.ts +0 -389
  720. package/src/domain/usecases/intmux/InTmuxByHumanSessionReconcileUseCase.ts +0 -103
  721. package/src/domain/usecases/intmux/OwnerCallFile.test.ts +0 -184
  722. package/src/domain/usecases/intmux/OwnerCallFile.ts +0 -80
  723. package/src/domain/usecases/isAgentReportBody.test.ts +0 -108
  724. package/src/domain/usecases/isAgentReportBody.ts +0 -52
  725. package/src/domain/usecases/isAuthorAuthorizedForAutoStatusCheck.ts +0 -12
  726. package/src/domain/usecases/isHumanComment.test.ts +0 -77
  727. package/src/domain/usecases/isHumanComment.ts +0 -23
  728. package/src/domain/usecases/isRecord.ts +0 -2
  729. package/src/domain/usecases/issueReactivationTriggerIsPending.test.ts +0 -541
  730. package/src/domain/usecases/issueReactivationTriggerIsPending.ts +0 -25
  731. package/src/domain/usecases/nextStepAgentDispatchRepeatedMessage.ts +0 -2
  732. package/src/domain/usecases/normalizeReportBody.test.ts +0 -24
  733. package/src/domain/usecases/normalizeReportBody.ts +0 -2
  734. package/src/domain/usecases/resolveAllowedIssueAuthors.test.ts +0 -51
  735. package/src/domain/usecases/resolveAllowedIssueAuthors.ts +0 -6
  736. package/src/domain/usecases/resolveLabelsAsLlmAgentName.test.ts +0 -42
  737. package/src/domain/usecases/resolveLabelsAsLlmAgentName.ts +0 -6
  738. package/src/domain/usecases/resolveLabelsNotRequiringPullRequest.test.ts +0 -33
  739. package/src/domain/usecases/resolveLabelsNotRequiringPullRequest.ts +0 -7
  740. package/src/domain/usecases/resolveNextStepAgentDispatchRepetition.test.ts +0 -337
  741. package/src/domain/usecases/resolveNextStepAgentDispatchRepetition.ts +0 -133
  742. package/src/domain/usecases/silentSessionReminderSentinel.ts +0 -9
  743. package/src/domain/usecases/triagerAgentName.ts +0 -4
  744. package/src/domain/usecases/utils.test.ts +0 -35
  745. package/src/domain/usecases/utils.ts +0 -6
  746. package/src/index.test.ts +0 -8
  747. package/src/index.ts +0 -10
  748. package/src/releaseConfig.test.ts +0 -40
  749. package/tsconfig.build.json +0 -18
  750. package/tsconfig.json +0 -25
  751. package/types/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.d.ts +0 -13
  752. package/types/adapter/entry-points/handlers/resolveUnansweredOwnerCalls.d.ts.map +0 -1
  753. package/types/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.d.ts +0 -16
  754. package/types/adapter/repositories/FileSystemSilentSessionNotifiedStateRepository.d.ts.map +0 -1
  755. package/types/adapter/repositories/issue/issueTimelineUtils.d.ts +0 -12
  756. package/types/adapter/repositories/issue/issueTimelineUtils.d.ts.map +0 -1
  757. package/types/domain/entities/UnansweredOwnerCall.d.ts +0 -5
  758. package/types/domain/entities/UnansweredOwnerCall.d.ts.map +0 -1
  759. package/types/domain/entities/WorkingTime.d.ts +0 -8
  760. package/types/domain/entities/WorkingTime.d.ts.map +0 -1
  761. package/types/domain/usecases/ChangeStatusLongInReviewIssueUseCase.d.ts +0 -17
  762. package/types/domain/usecases/ChangeStatusLongInReviewIssueUseCase.d.ts.map +0 -1
  763. package/types/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.d.ts +0 -23
  764. package/types/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.d.ts.map +0 -1
  765. package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts +0 -50
  766. package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts.map +0 -1
  767. package/types/domain/usecases/TriagerApprovalDispatchUseCase.d.ts +0 -15
  768. package/types/domain/usecases/TriagerApprovalDispatchUseCase.d.ts.map +0 -1
  769. package/types/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.d.ts +0 -11
  770. package/types/domain/usecases/adapter-interfaces/SilentSessionNotifiedStateRepository.d.ts.map +0 -1
  771. package/types/domain/usecases/awaitingOwnerApprovalMessage.d.ts +0 -3
  772. package/types/domain/usecases/awaitingOwnerApprovalMessage.d.ts.map +0 -1
  773. package/types/domain/usecases/findLastAgentDeclaringReport.d.ts +0 -5
  774. package/types/domain/usecases/findLastAgentDeclaringReport.d.ts.map +0 -1
  775. package/types/domain/usecases/isPullRequestDeclaredUnnecessary.d.ts +0 -5
  776. package/types/domain/usecases/isPullRequestDeclaredUnnecessary.d.ts.map +0 -1
  777. package/types/domain/usecases/isWaitingForOwnerApproval.d.ts +0 -2
  778. package/types/domain/usecases/isWaitingForOwnerApproval.d.ts.map +0 -1
  779. package/types/domain/usecases/returnedToAwaitingWorkspaceMessage.d.ts +0 -3
  780. package/types/domain/usecases/returnedToAwaitingWorkspaceMessage.d.ts.map +0 -1
@@ -1,1077 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as os from 'os';
3
- import * as path from 'path';
4
- import {
5
- cacheDir,
6
- cachePathForToken,
7
- FABLE_LIMIT_TYPE,
8
- hashToken,
9
- HEADERLESS_429_DEFAULT_COOLDOWN_SECONDS,
10
- HEADERLESS_429_MAX_COOLDOWN_SECONDS,
11
- isFableModel,
12
- parseModelRateLimitsFromBody,
13
- parseModelRateLimitsFromHeaders,
14
- parseSevenDayRejection,
15
- PERMISSION_DISABLED_COOLDOWN_SECONDS,
16
- readRateLimit,
17
- writeFableRejection,
18
- writeModelRateLimit,
19
- writeRateLimit,
20
- writeSubscriptionDisabled,
21
- } from './RateLimitCache';
22
- import { OauthTokenSelectUseCase } from '../../domain/usecases/OauthTokenSelectUseCase';
23
-
24
- const isRecord = (v: unknown): v is Record<string, unknown> =>
25
- v !== null && typeof v === 'object' && !Array.isArray(v);
26
-
27
- const writeSubscriptionDisabledEpoch = (
28
- token: string,
29
- epochSeconds: number,
30
- ): void => {
31
- const filePath = cachePathForToken(token);
32
- fs.mkdirSync(path.dirname(filePath), { recursive: true });
33
- fs.writeFileSync(
34
- filePath,
35
- JSON.stringify({ subscriptionDisabledEpoch: epochSeconds }),
36
- );
37
- };
38
-
39
- describe('RateLimitCache', () => {
40
- let tempDir: string;
41
- const originalXdg = process.env.XDG_CACHE_HOME;
42
-
43
- beforeEach(() => {
44
- tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ratelimit-cache-'));
45
- process.env.XDG_CACHE_HOME = tempDir;
46
- });
47
-
48
- afterEach(() => {
49
- if (originalXdg === undefined) {
50
- delete process.env.XDG_CACHE_HOME;
51
- } else {
52
- process.env.XDG_CACHE_HOME = originalXdg;
53
- }
54
- fs.rmSync(tempDir, { recursive: true, force: true });
55
- });
56
-
57
- describe('hashToken', () => {
58
- it('should be deterministic for the same input', () => {
59
- expect(hashToken('token-a')).toBe(hashToken('token-a'));
60
- });
61
-
62
- it('should differ for different inputs', () => {
63
- expect(hashToken('token-a')).not.toBe(hashToken('token-b'));
64
- });
65
-
66
- it('should return a 64-character hex string for sha256', () => {
67
- const hash = hashToken('token-a');
68
- expect(hash).toMatch(/^[0-9a-f]{64}$/);
69
- });
70
- });
71
-
72
- describe('cacheDir', () => {
73
- it('should honor XDG_CACHE_HOME', () => {
74
- expect(cacheDir()).toBe(path.join(tempDir, 'tdpm', 'ratelimit'));
75
- });
76
-
77
- it('should default to ~/.cache when XDG_CACHE_HOME is unset', () => {
78
- delete process.env.XDG_CACHE_HOME;
79
- expect(cacheDir()).toBe(
80
- path.join(os.homedir(), '.cache', 'tdpm', 'ratelimit'),
81
- );
82
- });
83
- });
84
-
85
- describe('cachePathForToken', () => {
86
- it('should place the file under cacheDir with the token hash as filename', () => {
87
- const token = 'token-x';
88
- expect(cachePathForToken(token)).toBe(
89
- path.join(cacheDir(), `${hashToken(token)}.json`),
90
- );
91
- });
92
- });
93
-
94
- describe('writeRateLimit and readRateLimit', () => {
95
- it('should round-trip rate limit headers', () => {
96
- const token = 'roundtrip-token';
97
- writeRateLimit(token, {
98
- 'anthropic-ratelimit-unified-status': 'allowed',
99
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
100
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
101
- 'anthropic-ratelimit-unified-5h-utilization': '42',
102
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
103
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
104
- 'anthropic-ratelimit-unified-7d-utilization': '17',
105
- });
106
- const snapshot = readRateLimit(token);
107
- expect(snapshot).not.toBeNull();
108
- if (snapshot === null) return;
109
- expect(snapshot.fiveHourUtilization).toBe(42);
110
- expect(snapshot.fiveHourReset).toBe(1700000000);
111
- expect(snapshot.sevenDayUtilization).toBe(17);
112
- expect(snapshot.sevenDayReset).toBe(1700100000);
113
- expect(snapshot.blocked).toBe(false);
114
- expect(snapshot.rejected).toBe(false);
115
- });
116
-
117
- it('should mark snapshot as blocked when status header is blocked', () => {
118
- const token = 'blocked-token';
119
- writeRateLimit(token, {
120
- 'anthropic-ratelimit-unified-status': 'blocked',
121
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
122
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
123
- 'anthropic-ratelimit-unified-5h-utilization': '100',
124
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
125
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
126
- 'anthropic-ratelimit-unified-7d-utilization': '99',
127
- });
128
- const snapshot = readRateLimit(token);
129
- expect(snapshot?.blocked).toBe(true);
130
- });
131
-
132
- it('should mark snapshot as rejected when unified status header is rejected', () => {
133
- const token = 'rejected-unified-token';
134
- writeRateLimit(token, {
135
- 'anthropic-ratelimit-unified-status': 'rejected',
136
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
137
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
138
- 'anthropic-ratelimit-unified-5h-utilization': '100',
139
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
140
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
141
- 'anthropic-ratelimit-unified-7d-utilization': '99',
142
- });
143
- const snapshot = readRateLimit(token);
144
- expect(snapshot?.rejected).toBe(true);
145
- expect(snapshot?.blocked).toBe(false);
146
- expect(snapshot?.unifiedRejected).toBe(true);
147
- expect(snapshot?.fiveHourRejected).toBe(false);
148
- expect(snapshot?.sevenDayRejected).toBe(false);
149
- });
150
-
151
- it('should mark snapshot as rejected when 5h status header is rejected', () => {
152
- const token = 'rejected-5h-token';
153
- writeRateLimit(token, {
154
- 'anthropic-ratelimit-unified-status': 'allowed',
155
- 'anthropic-ratelimit-unified-5h-status': 'rejected',
156
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
157
- 'anthropic-ratelimit-unified-5h-utilization': '100',
158
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
159
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
160
- 'anthropic-ratelimit-unified-7d-utilization': '99',
161
- });
162
- const snapshot = readRateLimit(token);
163
- expect(snapshot?.rejected).toBe(true);
164
- expect(snapshot?.fiveHourRejected).toBe(true);
165
- expect(snapshot?.sevenDayRejected).toBe(false);
166
- expect(snapshot?.unifiedRejected).toBe(false);
167
- });
168
-
169
- it('should mark snapshot as rejected when 7d status header is rejected', () => {
170
- const token = 'rejected-7d-token';
171
- writeRateLimit(token, {
172
- 'anthropic-ratelimit-unified-status': 'allowed',
173
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
174
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
175
- 'anthropic-ratelimit-unified-5h-utilization': '50',
176
- 'anthropic-ratelimit-unified-7d-status': 'rejected',
177
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
178
- 'anthropic-ratelimit-unified-7d-utilization': '100',
179
- });
180
- const snapshot = readRateLimit(token);
181
- expect(snapshot?.rejected).toBe(true);
182
- expect(snapshot?.sevenDayRejected).toBe(true);
183
- expect(snapshot?.fiveHourRejected).toBe(false);
184
- expect(snapshot?.unifiedRejected).toBe(false);
185
- });
186
-
187
- it('should not mark snapshot as rejected when no status header is rejected', () => {
188
- const token = 'allowed-token';
189
- writeRateLimit(token, {
190
- 'anthropic-ratelimit-unified-status': 'allowed',
191
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
192
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
193
- 'anthropic-ratelimit-unified-5h-utilization': '50',
194
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
195
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
196
- 'anthropic-ratelimit-unified-7d-utilization': '40',
197
- });
198
- const snapshot = readRateLimit(token);
199
- expect(snapshot?.rejected).toBe(false);
200
- expect(snapshot?.unifiedRejected).toBe(false);
201
- expect(snapshot?.fiveHourRejected).toBe(false);
202
- expect(snapshot?.sevenDayRejected).toBe(false);
203
- });
204
-
205
- it('should surface the raw unified status and overage-disabled reason headers', () => {
206
- const token = 'unified-status-token';
207
- writeRateLimit(token, {
208
- 'anthropic-ratelimit-unified-status': 'allowed_warning',
209
- 'anthropic-ratelimit-unified-overage-disabled-reason': 'out_of_credits',
210
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
211
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
212
- 'anthropic-ratelimit-unified-5h-utilization': '50',
213
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
214
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
215
- 'anthropic-ratelimit-unified-7d-utilization': '40',
216
- });
217
- const snapshot = readRateLimit(token);
218
- expect(snapshot?.unifiedStatus).toBe('allowed_warning');
219
- expect(snapshot?.overageDisabledReason).toBe('out_of_credits');
220
- });
221
-
222
- it('should expose null for the unified status and overage-disabled reason when absent', () => {
223
- const token = 'no-unified-status-token';
224
- writeRateLimit(token, {
225
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
226
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
227
- 'anthropic-ratelimit-unified-5h-utilization': '50',
228
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
229
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
230
- 'anthropic-ratelimit-unified-7d-utilization': '40',
231
- });
232
- const snapshot = readRateLimit(token);
233
- expect(snapshot?.unifiedStatus).toBeNull();
234
- expect(snapshot?.overageDisabledReason).toBeNull();
235
- });
236
-
237
- it('should return null when file does not exist', () => {
238
- expect(readRateLimit('never-written-token')).toBeNull();
239
- });
240
-
241
- it('should return null when file content is malformed JSON', () => {
242
- const token = 'malformed-token';
243
- fs.mkdirSync(cacheDir(), { recursive: true });
244
- fs.writeFileSync(cachePathForToken(token), '{not json');
245
- expect(readRateLimit(token)).toBeNull();
246
- });
247
-
248
- it('should treat array header values as the first element', () => {
249
- const token = 'array-token';
250
- writeRateLimit(token, {
251
- 'anthropic-ratelimit-unified-status': 'allowed',
252
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
253
- 'anthropic-ratelimit-unified-5h-reset': ['1700000000', 'ignored'],
254
- 'anthropic-ratelimit-unified-5h-utilization': ['55', 'ignored'],
255
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
256
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
257
- 'anthropic-ratelimit-unified-7d-utilization': '10',
258
- });
259
- const snapshot = readRateLimit(token);
260
- expect(snapshot?.fiveHourUtilization).toBe(55);
261
- expect(snapshot?.fiveHourReset).toBe(1700000000);
262
- });
263
-
264
- it('should default modelWeeklyLimits to an empty object when none are recorded', () => {
265
- const token = 'no-model-limits-token';
266
- writeRateLimit(token, {
267
- 'anthropic-ratelimit-unified-status': 'allowed',
268
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
269
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
270
- 'anthropic-ratelimit-unified-5h-utilization': '10',
271
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
272
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
273
- 'anthropic-ratelimit-unified-7d-utilization': '5',
274
- });
275
- const snapshot = readRateLimit(token);
276
- expect(snapshot?.modelWeeklyLimits).toEqual({});
277
- });
278
-
279
- it('should expose ts as lastUpdatedEpoch in the snapshot', () => {
280
- const token = 'ts-snapshot-token';
281
- const before = Date.now() / 1000;
282
- writeRateLimit(token, {
283
- 'anthropic-ratelimit-unified-status': 'allowed',
284
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
285
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
286
- 'anthropic-ratelimit-unified-5h-utilization': '10',
287
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
288
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
289
- 'anthropic-ratelimit-unified-7d-utilization': '5',
290
- });
291
- const after = Date.now() / 1000;
292
- const snapshot = readRateLimit(token);
293
- expect(snapshot).not.toBeNull();
294
- if (snapshot === null) return;
295
- expect(snapshot.lastUpdatedEpoch).toBeGreaterThanOrEqual(before);
296
- expect(snapshot.lastUpdatedEpoch).toBeLessThanOrEqual(after);
297
- });
298
-
299
- it('should default lastUpdatedEpoch to 0 when the stored payload has no ts field', () => {
300
- const token = 'no-ts-token';
301
- fs.mkdirSync(cacheDir(), { recursive: true });
302
- fs.writeFileSync(
303
- cachePathForToken(token),
304
- JSON.stringify({
305
- headers: {
306
- 'anthropic-ratelimit-unified-status': 'allowed',
307
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
308
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
309
- 'anthropic-ratelimit-unified-5h-utilization': '10',
310
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
311
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
312
- 'anthropic-ratelimit-unified-7d-utilization': '5',
313
- },
314
- }),
315
- );
316
- const snapshot = readRateLimit(token);
317
- expect(snapshot).not.toBeNull();
318
- if (snapshot === null) return;
319
- expect(snapshot.lastUpdatedEpoch).toBe(0);
320
- });
321
- });
322
-
323
- describe('writeRateLimit stores all anthropic-ratelimit-* headers', () => {
324
- const isRecord = (value: unknown): value is Record<string, unknown> =>
325
- value !== null && typeof value === 'object' && !Array.isArray(value);
326
-
327
- const readStoredHeaders = (token: string): Record<string, unknown> => {
328
- const filePath = cachePathForToken(token);
329
- const raw: unknown = JSON.parse(fs.readFileSync(filePath, 'utf8'));
330
- if (isRecord(raw) && isRecord(raw.headers)) {
331
- return raw.headers;
332
- }
333
- return {};
334
- };
335
-
336
- it('should store any anthropic-ratelimit-* header present in the response', () => {
337
- const token = 'extra-header-token';
338
- writeRateLimit(token, {
339
- 'anthropic-ratelimit-unified-status': 'allowed',
340
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
341
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
342
- 'anthropic-ratelimit-unified-5h-utilization': '10',
343
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
344
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
345
- 'anthropic-ratelimit-unified-7d-utilization': '5',
346
- 'anthropic-ratelimit-unified-reset': '1700000000',
347
- 'anthropic-ratelimit-requests-limit': '100',
348
- 'anthropic-ratelimit-requests-remaining': '99',
349
- 'content-type': 'application/json',
350
- });
351
- const storedHeaders = readStoredHeaders(token);
352
- expect(storedHeaders['anthropic-ratelimit-unified-reset']).toBe(
353
- '1700000000',
354
- );
355
- expect(storedHeaders['anthropic-ratelimit-requests-limit']).toBe('100');
356
- expect(storedHeaders['anthropic-ratelimit-requests-remaining']).toBe(
357
- '99',
358
- );
359
- expect(storedHeaders['content-type']).toBeUndefined();
360
- });
361
-
362
- it('should not store non-anthropic-ratelimit headers', () => {
363
- const token = 'non-ratelimit-header-token';
364
- writeRateLimit(token, {
365
- 'anthropic-ratelimit-unified-status': 'allowed',
366
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
367
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
368
- 'anthropic-ratelimit-unified-5h-utilization': '10',
369
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
370
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
371
- 'anthropic-ratelimit-unified-7d-utilization': '5',
372
- 'x-request-id': 'abc123',
373
- 'content-type': 'application/json',
374
- 'transfer-encoding': 'chunked',
375
- });
376
- const storedHeaders = readStoredHeaders(token);
377
- expect(storedHeaders['x-request-id']).toBeUndefined();
378
- expect(storedHeaders['content-type']).toBeUndefined();
379
- expect(storedHeaders['transfer-encoding']).toBeUndefined();
380
- });
381
- });
382
-
383
- describe('writeRateLimit preserves previous values when response has no anthropic-ratelimit-* headers', () => {
384
- it('should not write any file when no previous cache exists and headers contain no anthropic-ratelimit-*', () => {
385
- const token = '429-no-headers-no-prior-token';
386
- writeRateLimit(token, {
387
- 'content-type': 'application/json',
388
- });
389
- expect(fs.existsSync(cachePathForToken(token))).toBe(false);
390
- expect(readRateLimit(token)).toBeNull();
391
- });
392
-
393
- it('should preserve the previous cache when a later response carries no anthropic-ratelimit-* headers (429 without headers)', () => {
394
- const token = '429-no-headers-with-prior-token';
395
- writeRateLimit(token, {
396
- 'anthropic-ratelimit-unified-status': 'allowed',
397
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
398
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
399
- 'anthropic-ratelimit-unified-5h-utilization': '42',
400
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
401
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
402
- 'anthropic-ratelimit-unified-7d-utilization': '17',
403
- });
404
- const beforeContent = fs.readFileSync(cachePathForToken(token), 'utf8');
405
- writeRateLimit(token, {
406
- 'content-type': 'application/json',
407
- 'anthropic-organization-id': 'org-1',
408
- });
409
- const afterContent = fs.readFileSync(cachePathForToken(token), 'utf8');
410
- expect(afterContent).toBe(beforeContent);
411
- const snapshot = readRateLimit(token);
412
- expect(snapshot?.fiveHourUtilization).toBe(42);
413
- expect(snapshot?.fiveHourReset).toBe(1700000000);
414
- expect(snapshot?.sevenDayUtilization).toBe(17);
415
- expect(snapshot?.sevenDayReset).toBe(1700100000);
416
- expect(snapshot?.unifiedRejected).toBe(false);
417
- expect(snapshot?.fiveHourRejected).toBe(false);
418
- expect(snapshot?.sevenDayRejected).toBe(false);
419
- expect(snapshot?.blocked).toBe(false);
420
- expect(snapshot?.rejected).toBe(false);
421
- });
422
-
423
- it('should overwrite the previous cache when the response carries anthropic-ratelimit-* headers regardless of status code (429 with headers)', () => {
424
- const token = '429-with-headers-token';
425
- writeRateLimit(token, {
426
- 'anthropic-ratelimit-unified-status': 'allowed',
427
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
428
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
429
- 'anthropic-ratelimit-unified-5h-utilization': '42',
430
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
431
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
432
- 'anthropic-ratelimit-unified-7d-utilization': '17',
433
- });
434
- writeRateLimit(token, {
435
- 'anthropic-ratelimit-unified-status': 'rejected',
436
- 'anthropic-ratelimit-unified-5h-status': 'rejected',
437
- 'anthropic-ratelimit-unified-5h-reset': '1700050000',
438
- 'anthropic-ratelimit-unified-5h-utilization': '100',
439
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
440
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
441
- 'anthropic-ratelimit-unified-7d-utilization': '60',
442
- });
443
- const snapshot = readRateLimit(token);
444
- expect(snapshot?.unifiedRejected).toBe(true);
445
- expect(snapshot?.fiveHourRejected).toBe(true);
446
- expect(snapshot?.fiveHourUtilization).toBe(100);
447
- expect(snapshot?.fiveHourReset).toBe(1700050000);
448
- expect(snapshot?.sevenDayUtilization).toBe(60);
449
- });
450
-
451
- it('should overwrite the previous cache when a 200 response carries anthropic-ratelimit-* headers (200 with headers)', () => {
452
- const token = '200-with-headers-token';
453
- writeRateLimit(token, {
454
- 'anthropic-ratelimit-unified-status': 'rejected',
455
- 'anthropic-ratelimit-unified-5h-status': 'rejected',
456
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
457
- 'anthropic-ratelimit-unified-5h-utilization': '100',
458
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
459
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
460
- 'anthropic-ratelimit-unified-7d-utilization': '60',
461
- });
462
- writeRateLimit(token, {
463
- 'anthropic-ratelimit-unified-status': 'allowed',
464
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
465
- 'anthropic-ratelimit-unified-5h-reset': '1700050000',
466
- 'anthropic-ratelimit-unified-5h-utilization': '30',
467
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
468
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
469
- 'anthropic-ratelimit-unified-7d-utilization': '20',
470
- });
471
- const snapshot = readRateLimit(token);
472
- expect(snapshot?.unifiedRejected).toBe(false);
473
- expect(snapshot?.fiveHourRejected).toBe(false);
474
- expect(snapshot?.fiveHourUtilization).toBe(30);
475
- expect(snapshot?.fiveHourReset).toBe(1700050000);
476
- expect(snapshot?.sevenDayUtilization).toBe(20);
477
- expect(snapshot?.rejected).toBe(false);
478
- });
479
-
480
- it('should not modify any header value based on response status code', () => {
481
- const token = 'no-status-based-mutation-token';
482
- const inputHeaders: Record<string, string> = {
483
- 'anthropic-ratelimit-unified-status': 'allowed',
484
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
485
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
486
- 'anthropic-ratelimit-unified-5h-utilization': '42',
487
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
488
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
489
- 'anthropic-ratelimit-unified-7d-utilization': '17',
490
- };
491
- writeRateLimit(token, inputHeaders);
492
- const raw: unknown = JSON.parse(
493
- fs.readFileSync(cachePathForToken(token), 'utf8'),
494
- );
495
- const isRecord = (value: unknown): value is Record<string, unknown> =>
496
- value !== null && typeof value === 'object' && !Array.isArray(value);
497
- if (!isRecord(raw) || !isRecord(raw.headers)) {
498
- throw new Error('expected stored cache to contain headers object');
499
- }
500
- for (const [key, expectedValue] of Object.entries(inputHeaders)) {
501
- expect(raw.headers[key]).toBe(expectedValue);
502
- }
503
- });
504
- });
505
-
506
- describe('writeRateLimit records a cooldown on a 429 with no anthropic-ratelimit-* headers', () => {
507
- it('should set blockedUntilEpoch using the default cooldown when no Retry-After header is present', () => {
508
- const token = '429-no-headers-default-cooldown-token';
509
- const before = Date.now() / 1000;
510
- writeRateLimit(token, { 'content-type': 'application/json' }, 429);
511
- const after = Date.now() / 1000;
512
- const snapshot = readRateLimit(token);
513
- expect(snapshot).not.toBeNull();
514
- expect(snapshot?.blockedUntilEpoch).toBeGreaterThanOrEqual(
515
- before + HEADERLESS_429_DEFAULT_COOLDOWN_SECONDS,
516
- );
517
- expect(snapshot?.blockedUntilEpoch).toBeLessThanOrEqual(
518
- after + HEADERLESS_429_DEFAULT_COOLDOWN_SECONDS,
519
- );
520
- });
521
-
522
- it('should honor the Retry-After header when present', () => {
523
- const token = '429-no-headers-retry-after-token';
524
- const retryAfterSeconds = 120;
525
- const before = Date.now() / 1000;
526
- writeRateLimit(
527
- token,
528
- { 'content-type': 'application/json', 'retry-after': '120' },
529
- 429,
530
- );
531
- const after = Date.now() / 1000;
532
- const snapshot = readRateLimit(token);
533
- expect(snapshot?.blockedUntilEpoch).toBeGreaterThanOrEqual(
534
- before + retryAfterSeconds,
535
- );
536
- expect(snapshot?.blockedUntilEpoch).toBeLessThanOrEqual(
537
- after + retryAfterSeconds,
538
- );
539
- });
540
-
541
- it('should clamp the cooldown to the maximum when Retry-After is very large', () => {
542
- const token = '429-no-headers-clamp-token';
543
- const before = Date.now() / 1000;
544
- writeRateLimit(
545
- token,
546
- { 'content-type': 'application/json', 'retry-after': '99999' },
547
- 429,
548
- );
549
- const after = Date.now() / 1000;
550
- const snapshot = readRateLimit(token);
551
- expect(snapshot?.blockedUntilEpoch).toBeGreaterThanOrEqual(
552
- before + HEADERLESS_429_MAX_COOLDOWN_SECONDS,
553
- );
554
- expect(snapshot?.blockedUntilEpoch).toBeLessThanOrEqual(
555
- after + HEADERLESS_429_MAX_COOLDOWN_SECONDS,
556
- );
557
- });
558
-
559
- it('should preserve the previous last-good snapshot while adding the cooldown', () => {
560
- const token = '429-no-headers-preserve-snapshot-token';
561
- writeRateLimit(token, {
562
- 'anthropic-ratelimit-unified-status': 'allowed',
563
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
564
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
565
- 'anthropic-ratelimit-unified-5h-utilization': '42',
566
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
567
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
568
- 'anthropic-ratelimit-unified-7d-utilization': '17',
569
- });
570
- writeRateLimit(token, { 'content-type': 'application/json' }, 429);
571
- const snapshot = readRateLimit(token);
572
- expect(snapshot?.fiveHourUtilization).toBe(42);
573
- expect(snapshot?.fiveHourReset).toBe(1700000000);
574
- expect(snapshot?.sevenDayUtilization).toBe(17);
575
- expect(snapshot?.sevenDayReset).toBe(1700100000);
576
- expect(snapshot?.rejected).toBe(false);
577
- expect(snapshot?.blocked).toBe(false);
578
- expect(snapshot?.blockedUntilEpoch).toBeGreaterThan(Date.now() / 1000);
579
- });
580
-
581
- it('should clear the cooldown when a later header-bearing response arrives', () => {
582
- const token = '429-then-normal-clears-cooldown-token';
583
- writeRateLimit(token, { 'content-type': 'application/json' }, 429);
584
- expect(readRateLimit(token)?.blockedUntilEpoch).toBeGreaterThan(
585
- Date.now() / 1000,
586
- );
587
- writeRateLimit(token, {
588
- 'anthropic-ratelimit-unified-status': 'allowed',
589
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
590
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
591
- 'anthropic-ratelimit-unified-5h-utilization': '30',
592
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
593
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
594
- 'anthropic-ratelimit-unified-7d-utilization': '20',
595
- });
596
- expect(readRateLimit(token)?.blockedUntilEpoch).toBe(0);
597
- });
598
-
599
- it('should not write any cooldown for a headerless response that is not a 429', () => {
600
- const token = '500-no-headers-no-cooldown-token';
601
- writeRateLimit(token, { 'content-type': 'application/json' }, 500);
602
- expect(fs.existsSync(cachePathForToken(token))).toBe(false);
603
- expect(readRateLimit(token)).toBeNull();
604
- });
605
- });
606
-
607
- describe('parseModelRateLimitsFromBody', () => {
608
- it('should extract a rejected seven_day_sonnet limit from a rate_limit event body', () => {
609
- const body =
610
- 'event: error\n' +
611
- 'data: {"status":"rejected","resetsAt":1779642000,"rateLimitType":"seven_day_sonnet","overageStatus":"rejected"}\n\n';
612
- expect(parseModelRateLimitsFromBody(body)).toEqual({
613
- seven_day_sonnet: { rejected: true, resetsAt: 1779642000 },
614
- });
615
- });
616
-
617
- it('should extract multiple distinct rate limit types', () => {
618
- const body =
619
- 'data: {"status":"rejected","resetsAt":1779642000,"rateLimitType":"seven_day_sonnet"}\n' +
620
- 'data: {"status":"allowed","resetsAt":1779700000,"rateLimitType":"seven_day"}\n';
621
- expect(parseModelRateLimitsFromBody(body)).toEqual({
622
- seven_day_sonnet: { rejected: true, resetsAt: 1779642000 },
623
- seven_day: { rejected: false, resetsAt: 1779700000 },
624
- });
625
- });
626
-
627
- it('should return an empty object when no rate limit information is present', () => {
628
- const body =
629
- 'event: message_start\n' +
630
- 'data: {"type":"message_start","message":{"id":"msg_1"}}\n\n';
631
- expect(parseModelRateLimitsFromBody(body)).toEqual({});
632
- });
633
-
634
- it('should ignore entries that lack a numeric resetsAt', () => {
635
- const body =
636
- 'data: {"status":"rejected","rateLimitType":"seven_day_sonnet"}\n';
637
- expect(parseModelRateLimitsFromBody(body)).toEqual({});
638
- });
639
- });
640
-
641
- describe('writeModelRateLimit', () => {
642
- it('should persist model weekly limits readable by readRateLimit', () => {
643
- const token = 'model-limit-token';
644
- writeRateLimit(token, {
645
- 'anthropic-ratelimit-unified-status': 'allowed',
646
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
647
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
648
- 'anthropic-ratelimit-unified-5h-utilization': '10',
649
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
650
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
651
- 'anthropic-ratelimit-unified-7d-utilization': '5',
652
- });
653
- writeModelRateLimit(token, {
654
- seven_day_sonnet: { rejected: true, resetsAt: 1779642000 },
655
- });
656
- const snapshot = readRateLimit(token);
657
- expect(snapshot?.modelWeeklyLimits).toEqual({
658
- seven_day_sonnet: { rejected: true, resetsAt: 1779642000 },
659
- });
660
- expect(snapshot?.fiveHourUtilization).toBe(10);
661
- });
662
-
663
- it('should preserve previously recorded model limits when headers are rewritten', () => {
664
- const token = 'preserve-token';
665
- writeModelRateLimit(token, {
666
- seven_day_sonnet: { rejected: true, resetsAt: 1779642000 },
667
- });
668
- writeRateLimit(token, {
669
- 'anthropic-ratelimit-unified-status': 'allowed',
670
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
671
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
672
- 'anthropic-ratelimit-unified-5h-utilization': '20',
673
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
674
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
675
- 'anthropic-ratelimit-unified-7d-utilization': '5',
676
- });
677
- const snapshot = readRateLimit(token);
678
- expect(snapshot?.modelWeeklyLimits).toEqual({
679
- seven_day_sonnet: { rejected: true, resetsAt: 1779642000 },
680
- });
681
- expect(snapshot?.fiveHourUtilization).toBe(20);
682
- });
683
-
684
- it('should merge new model limits with existing ones', () => {
685
- const token = 'merge-token';
686
- writeModelRateLimit(token, {
687
- seven_day_sonnet: { rejected: true, resetsAt: 1779642000 },
688
- });
689
- writeModelRateLimit(token, {
690
- seven_day: { rejected: false, resetsAt: 1779700000 },
691
- });
692
- const snapshot = readRateLimit(token);
693
- expect(snapshot?.modelWeeklyLimits).toEqual({
694
- seven_day_sonnet: { rejected: true, resetsAt: 1779642000 },
695
- seven_day: { rejected: false, resetsAt: 1779700000 },
696
- });
697
- });
698
-
699
- it('should not write a file when there are no limits to record', () => {
700
- const token = 'empty-limits-token';
701
- writeModelRateLimit(token, {});
702
- expect(readRateLimit(token)).toBeNull();
703
- });
704
- });
705
-
706
- describe('isFableModel', () => {
707
- it('should return true for the fable model id', () => {
708
- expect(isFableModel('claude-fable-5')).toBe(true);
709
- });
710
-
711
- it('should be case insensitive', () => {
712
- expect(isFableModel('Claude-FABLE-5')).toBe(true);
713
- });
714
-
715
- it('should return false for sonnet and opus models', () => {
716
- expect(isFableModel('claude-sonnet-4-6')).toBe(false);
717
- expect(isFableModel('claude-opus-4-8')).toBe(false);
718
- });
719
-
720
- it('should return false for a null model', () => {
721
- expect(isFableModel(null)).toBe(false);
722
- });
723
- });
724
-
725
- describe('writeFableRejection', () => {
726
- it('should persist a rejected fable weekly limit readable by readRateLimit', () => {
727
- const token = 'fable-rejection-token';
728
- const nowEpochSeconds = Date.now() / 1000;
729
- writeFableRejection(token, 120);
730
- const snapshot = readRateLimit(token);
731
- const fableLimit = snapshot?.modelWeeklyLimits[FABLE_LIMIT_TYPE];
732
- expect(fableLimit?.rejected).toBe(true);
733
- expect(fableLimit?.resetsAt).toBeGreaterThanOrEqual(
734
- nowEpochSeconds + 120,
735
- );
736
- expect(fableLimit?.resetsAt).toBeLessThanOrEqual(
737
- nowEpochSeconds + 120 + 5,
738
- );
739
- });
740
-
741
- it('should cap the reset from an oversized retry-after at the max cooldown', () => {
742
- const token = 'fable-rejection-cap-token';
743
- const nowEpochSeconds = Date.now() / 1000;
744
- writeFableRejection(token, HEADERLESS_429_MAX_COOLDOWN_SECONDS + 10_000);
745
- const fableLimit =
746
- readRateLimit(token)?.modelWeeklyLimits[FABLE_LIMIT_TYPE];
747
- expect(fableLimit?.resetsAt).toBeLessThanOrEqual(
748
- nowEpochSeconds + HEADERLESS_429_MAX_COOLDOWN_SECONDS + 5,
749
- );
750
- });
751
-
752
- it('should use the default cooldown when retry-after is absent', () => {
753
- const token = 'fable-rejection-default-token';
754
- const nowEpochSeconds = Date.now() / 1000;
755
- writeFableRejection(token, null);
756
- const fableLimit =
757
- readRateLimit(token)?.modelWeeklyLimits[FABLE_LIMIT_TYPE];
758
- expect(fableLimit?.resetsAt).toBeGreaterThanOrEqual(
759
- nowEpochSeconds + HEADERLESS_429_DEFAULT_COOLDOWN_SECONDS,
760
- );
761
- expect(fableLimit?.resetsAt).toBeLessThanOrEqual(
762
- nowEpochSeconds + HEADERLESS_429_DEFAULT_COOLDOWN_SECONDS + 5,
763
- );
764
- });
765
-
766
- it('should preserve other model weekly limits already recorded', () => {
767
- const token = 'fable-rejection-merge-token';
768
- writeModelRateLimit(token, {
769
- seven_day_sonnet: { rejected: true, resetsAt: 1779642000 },
770
- });
771
- writeFableRejection(token, 90);
772
- const limits = readRateLimit(token)?.modelWeeklyLimits;
773
- expect(limits?.seven_day_sonnet).toEqual({
774
- rejected: true,
775
- resetsAt: 1779642000,
776
- });
777
- expect(limits?.[FABLE_LIMIT_TYPE]?.rejected).toBe(true);
778
- });
779
-
780
- it('should use the seven-day reset for resetsAt when provided instead of the retry-after cooldown', () => {
781
- const token = 'fable-rejection-sevenday-reset-token';
782
- const sevenDayReset = 1893456000;
783
- writeFableRejection(token, 120, sevenDayReset);
784
- const fableLimit =
785
- readRateLimit(token)?.modelWeeklyLimits[FABLE_LIMIT_TYPE];
786
- expect(fableLimit?.rejected).toBe(true);
787
- expect(fableLimit?.resetsAt).toBe(sevenDayReset);
788
- });
789
-
790
- it('should fall back to the retry-after cooldown when the seven-day reset is null', () => {
791
- const token = 'fable-rejection-null-reset-token';
792
- const nowEpochSeconds = Date.now() / 1000;
793
- writeFableRejection(token, 120, null);
794
- const fableLimit =
795
- readRateLimit(token)?.modelWeeklyLimits[FABLE_LIMIT_TYPE];
796
- expect(fableLimit?.resetsAt).toBeGreaterThanOrEqual(
797
- nowEpochSeconds + 120,
798
- );
799
- expect(fableLimit?.resetsAt).toBeLessThanOrEqual(
800
- nowEpochSeconds + 120 + 5,
801
- );
802
- });
803
- });
804
-
805
- describe('parseSevenDayRejection', () => {
806
- it('should report a rejection and the reset epoch when the 7-day status is rejected', () => {
807
- expect(
808
- parseSevenDayRejection({
809
- 'anthropic-ratelimit-unified-7d-status': 'rejected',
810
- 'anthropic-ratelimit-unified-7d-reset': '1893456000',
811
- }),
812
- ).toEqual({ sevenDayRejected: true, sevenDayReset: 1893456000 });
813
- });
814
-
815
- it('should report no rejection when only the 5-hour status is rejected', () => {
816
- expect(
817
- parseSevenDayRejection({
818
- 'anthropic-ratelimit-unified-5h-status': 'rejected',
819
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
820
- }),
821
- ).toEqual({ sevenDayRejected: false, sevenDayReset: null });
822
- });
823
-
824
- it('should report no rejection when no rate-limit headers are present', () => {
825
- expect(parseSevenDayRejection({})).toEqual({
826
- sevenDayRejected: false,
827
- sevenDayReset: null,
828
- });
829
- });
830
-
831
- it('should return a null reset when the 7-day status is rejected but no reset header is present', () => {
832
- expect(
833
- parseSevenDayRejection({
834
- 'anthropic-ratelimit-unified-7d-status': 'rejected',
835
- }),
836
- ).toEqual({ sevenDayRejected: true, sevenDayReset: null });
837
- });
838
-
839
- it('should pick the first value when a header is an array', () => {
840
- expect(
841
- parseSevenDayRejection({
842
- 'anthropic-ratelimit-unified-7d-status': ['rejected', 'allowed'],
843
- 'anthropic-ratelimit-unified-7d-reset': ['1893456000'],
844
- }),
845
- ).toEqual({ sevenDayRejected: true, sevenDayReset: 1893456000 });
846
- });
847
- });
848
-
849
- describe('parseModelRateLimitsFromHeaders', () => {
850
- it('should extract a rejected seven_day_sonnet limit from the per-model unified headers', () => {
851
- expect(
852
- parseModelRateLimitsFromHeaders({
853
- 'anthropic-ratelimit-unified-7d_sonnet-status': 'rejected',
854
- 'anthropic-ratelimit-unified-7d_sonnet-reset': '1779642000',
855
- }),
856
- ).toEqual({
857
- seven_day_sonnet: { rejected: true, resetsAt: 1779642000 },
858
- });
859
- });
860
-
861
- it('should extract both seven_day_sonnet and seven_day_opus limits with their statuses', () => {
862
- expect(
863
- parseModelRateLimitsFromHeaders({
864
- 'anthropic-ratelimit-unified-7d_sonnet-status': 'rejected',
865
- 'anthropic-ratelimit-unified-7d_sonnet-reset': '1779642000',
866
- 'anthropic-ratelimit-unified-7d_opus-status': 'allowed',
867
- 'anthropic-ratelimit-unified-7d_opus-reset': '1779700000',
868
- }),
869
- ).toEqual({
870
- seven_day_sonnet: { rejected: true, resetsAt: 1779642000 },
871
- seven_day_opus: { rejected: false, resetsAt: 1779700000 },
872
- });
873
- });
874
-
875
- it('should return an empty map when no per-model headers are present', () => {
876
- expect(
877
- parseModelRateLimitsFromHeaders({
878
- 'anthropic-ratelimit-unified-status': 'allowed',
879
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
880
- }),
881
- ).toEqual({});
882
- });
883
-
884
- it('should default resetsAt to 0 when the per-model reset header is missing', () => {
885
- expect(
886
- parseModelRateLimitsFromHeaders({
887
- 'anthropic-ratelimit-unified-7d_opus-status': 'rejected',
888
- }),
889
- ).toEqual({
890
- seven_day_opus: { rejected: true, resetsAt: 0 },
891
- });
892
- });
893
- });
894
-
895
- describe('readRateLimit per-model header population', () => {
896
- it('should populate seven_day_sonnet from the per-model headers when the body carried no rate_limit event', () => {
897
- const token = 'header-only-sonnet-token';
898
- writeRateLimit(token, {
899
- 'anthropic-ratelimit-unified-status': 'rejected',
900
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
901
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
902
- 'anthropic-ratelimit-unified-5h-utilization': '53',
903
- 'anthropic-ratelimit-unified-7d-status': 'allowed_warning',
904
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
905
- 'anthropic-ratelimit-unified-7d-utilization': '88',
906
- 'anthropic-ratelimit-unified-7d_sonnet-status': 'rejected',
907
- 'anthropic-ratelimit-unified-7d_sonnet-reset': '1779642000',
908
- 'anthropic-ratelimit-unified-7d_opus-status': 'allowed',
909
- 'anthropic-ratelimit-unified-7d_opus-reset': '1779700000',
910
- });
911
- const snapshot = readRateLimit(token);
912
- expect(snapshot?.modelWeeklyLimits).toEqual({
913
- seven_day_sonnet: { rejected: true, resetsAt: 1779642000 },
914
- seven_day_opus: { rejected: false, resetsAt: 1779700000 },
915
- });
916
- expect(snapshot?.unifiedRejected).toBe(true);
917
- expect(snapshot?.fiveHourRejected).toBe(false);
918
- });
919
-
920
- it('should let a body-derived model limit override the per-model header value for the same claim', () => {
921
- const token = 'body-overrides-header-token';
922
- writeRateLimit(token, {
923
- 'anthropic-ratelimit-unified-status': 'allowed',
924
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
925
- 'anthropic-ratelimit-unified-5h-reset': '1700000000',
926
- 'anthropic-ratelimit-unified-5h-utilization': '10',
927
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
928
- 'anthropic-ratelimit-unified-7d-reset': '1700100000',
929
- 'anthropic-ratelimit-unified-7d-utilization': '5',
930
- 'anthropic-ratelimit-unified-7d_sonnet-status': 'allowed',
931
- 'anthropic-ratelimit-unified-7d_sonnet-reset': '1700200000',
932
- });
933
- writeModelRateLimit(token, {
934
- seven_day_sonnet: { rejected: true, resetsAt: 1779642000 },
935
- });
936
- const snapshot = readRateLimit(token);
937
- expect(snapshot?.modelWeeklyLimits).toEqual({
938
- seven_day_sonnet: { rejected: true, resetsAt: 1779642000 },
939
- });
940
- });
941
- });
942
-
943
- describe('writeSubscriptionDisabled', () => {
944
- it('should persist subscriptionDisabledEpoch to the cache file', () => {
945
- const token = 'sub-disabled-token';
946
- writeSubscriptionDisabled(token);
947
- const filePath = cachePathForToken(token);
948
- const raw: unknown = JSON.parse(fs.readFileSync(filePath, 'utf8'));
949
- const epoch = isRecord(raw) ? raw.subscriptionDisabledEpoch : undefined;
950
- expect(typeof epoch).toBe('number');
951
- });
952
-
953
- it('should preserve existing cache fields when writing subscriptionDisabledEpoch', () => {
954
- const token = 'sub-disabled-preserve-token';
955
- writeRateLimit(token, {
956
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
957
- 'anthropic-ratelimit-unified-5h-reset': '2000100',
958
- 'anthropic-ratelimit-unified-5h-utilization': '0.1',
959
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
960
- 'anthropic-ratelimit-unified-7d-reset': '2000200',
961
- 'anthropic-ratelimit-unified-7d-utilization': '0.1',
962
- });
963
- writeSubscriptionDisabled(token);
964
- const snapshot = readRateLimit(token);
965
- expect(snapshot?.subscriptionDisabled).toBe(true);
966
- expect(snapshot?.fiveHourReset).toBe(2000100);
967
- });
968
- });
969
-
970
- describe('readRateLimit subscriptionDisabled', () => {
971
- it('returns subscriptionDisabled: true after writeSubscriptionDisabled is called', () => {
972
- const token = 'sub-disabled-read-token';
973
- writeSubscriptionDisabled(token);
974
- const snapshot = readRateLimit(token);
975
- expect(snapshot?.subscriptionDisabled).toBe(true);
976
- });
977
-
978
- it('returns subscriptionDisabled: false when no subscriptionDisabledEpoch is in the cache', () => {
979
- const token = 'sub-not-disabled-token';
980
- writeRateLimit(token, {
981
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
982
- 'anthropic-ratelimit-unified-5h-reset': '2000100',
983
- 'anthropic-ratelimit-unified-5h-utilization': '0.1',
984
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
985
- 'anthropic-ratelimit-unified-7d-reset': '2000200',
986
- 'anthropic-ratelimit-unified-7d-utilization': '0.1',
987
- });
988
- const snapshot = readRateLimit(token);
989
- expect(snapshot?.subscriptionDisabled).toBe(false);
990
- });
991
-
992
- it('returns subscriptionDisabled: true while within the cooldown window', () => {
993
- const token = 'sub-disabled-within-cooldown-token';
994
- const nowEpochSeconds = Date.now() / 1000;
995
- writeSubscriptionDisabledEpoch(
996
- token,
997
- nowEpochSeconds - (PERMISSION_DISABLED_COOLDOWN_SECONDS - 60),
998
- );
999
- const snapshot = readRateLimit(token);
1000
- expect(snapshot?.subscriptionDisabled).toBe(true);
1001
- });
1002
-
1003
- it('returns subscriptionDisabled: false once the cooldown window has elapsed', () => {
1004
- const token = 'sub-disabled-cooldown-elapsed-token';
1005
- const nowEpochSeconds = Date.now() / 1000;
1006
- writeSubscriptionDisabledEpoch(
1007
- token,
1008
- nowEpochSeconds - (PERMISSION_DISABLED_COOLDOWN_SECONDS + 60),
1009
- );
1010
- const snapshot = readRateLimit(token);
1011
- expect(snapshot?.subscriptionDisabled).toBe(false);
1012
- });
1013
- });
1014
-
1015
- describe('writeRateLimit preserves subscriptionDisabledEpoch across header writes', () => {
1016
- const headerBearingResponse: Record<string, string> = {
1017
- 'anthropic-ratelimit-unified-status': 'allowed',
1018
- 'anthropic-ratelimit-unified-5h-status': 'allowed',
1019
- 'anthropic-ratelimit-unified-5h-reset': '2000100',
1020
- 'anthropic-ratelimit-unified-5h-utilization': '0.1',
1021
- 'anthropic-ratelimit-unified-7d-status': 'allowed',
1022
- 'anthropic-ratelimit-unified-7d-reset': '2000200',
1023
- 'anthropic-ratelimit-unified-7d-utilization': '0.1',
1024
- };
1025
-
1026
- it('keeps subscriptionDisabled: true after a later header-bearing 200 response', () => {
1027
- const token = 'sub-disabled-then-200-token';
1028
- writeSubscriptionDisabled(token);
1029
- writeRateLimit(token, headerBearingResponse, 200);
1030
- const snapshot = readRateLimit(token);
1031
- expect(snapshot?.subscriptionDisabled).toBe(true);
1032
- expect(snapshot?.fiveHourReset).toBe(2000100);
1033
- });
1034
-
1035
- it('keeps subscriptionDisabled: true after a later header-bearing 429 response', () => {
1036
- const token = 'sub-disabled-then-429-token';
1037
- writeSubscriptionDisabled(token);
1038
- writeRateLimit(token, headerBearingResponse, 429);
1039
- const snapshot = readRateLimit(token);
1040
- expect(snapshot?.subscriptionDisabled).toBe(true);
1041
- });
1042
-
1043
- it('still excludes the token from selection after a header-bearing response', () => {
1044
- const token = 'sub-disabled-then-200-selection-token';
1045
- writeSubscriptionDisabled(token);
1046
- writeRateLimit(token, headerBearingResponse, 200);
1047
- const snapshot = readRateLimit(token);
1048
- const useCase = new OauthTokenSelectUseCase();
1049
- const result = useCase.run(
1050
- [
1051
- {
1052
- name: 'disabled-token',
1053
- token,
1054
- snapshot:
1055
- snapshot === null
1056
- ? null
1057
- : {
1058
- fiveHourUtilization: snapshot.fiveHourUtilization,
1059
- fiveHourReset: snapshot.fiveHourReset,
1060
- sevenDayUtilization: snapshot.sevenDayUtilization,
1061
- sevenDayReset: snapshot.sevenDayReset,
1062
- },
1063
- subscriptionDisabled: snapshot?.subscriptionDisabled ?? false,
1064
- unifiedRejected: snapshot?.unifiedRejected ?? false,
1065
- fableRejected: false,
1066
- },
1067
- ],
1068
- Date.now() / 1000,
1069
- );
1070
- expect(result.selected).toBeNull();
1071
- expect(result.metrics[0]?.eligible).toBe(false);
1072
- expect(result.metrics[0]?.exclusionReason).toBe(
1073
- 'organization has disabled Claude subscription access for Claude Code',
1074
- );
1075
- });
1076
- });
1077
- });