github-issue-tower-defence-management 1.109.1 → 1.110.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +29 -3
  3. package/bin/adapter/entry-points/cli/index.js +10 -10
  4. package/bin/adapter/entry-points/cli/index.js.map +1 -1
  5. package/bin/adapter/entry-points/console/dashboardComposeService.js +7 -6
  6. package/bin/adapter/entry-points/console/dashboardComposeService.js.map +1 -1
  7. package/bin/adapter/entry-points/console/ui-dist/assets/{index-CO-f_j4f.css → index-BPH6W1yn.css} +1 -1
  8. package/bin/adapter/entry-points/console/ui-dist/assets/index-CT3t4Yje.js +101 -0
  9. package/bin/adapter/entry-points/console/ui-dist/index.html +2 -2
  10. package/bin/adapter/entry-points/console/webServer.js +5 -4
  11. package/bin/adapter/entry-points/console/webServer.js.map +1 -1
  12. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +125 -2
  13. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
  14. package/bin/adapter/entry-points/handlers/InTmuxByHumanSessionTokenCountHandler.js +2 -0
  15. package/bin/adapter/entry-points/handlers/InTmuxByHumanSessionTokenCountHandler.js.map +1 -1
  16. package/bin/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.js +2 -0
  17. package/bin/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.js.map +1 -1
  18. package/bin/adapter/entry-points/handlers/OauthTokenSelectHandler.js +2 -0
  19. package/bin/adapter/entry-points/handlers/OauthTokenSelectHandler.js.map +1 -1
  20. package/bin/adapter/entry-points/handlers/notifySilentTmuxSessions.js +62 -0
  21. package/bin/adapter/entry-points/handlers/notifySilentTmuxSessions.js.map +1 -0
  22. package/bin/adapter/entry-points/handlers/tokenStatusWriter.js +88 -3
  23. package/bin/adapter/entry-points/handlers/tokenStatusWriter.js.map +1 -1
  24. package/bin/adapter/proxy/RateLimitCache.js +25 -1
  25. package/bin/adapter/proxy/RateLimitCache.js.map +1 -1
  26. package/bin/adapter/proxy/proxyEntry.js +25 -0
  27. package/bin/adapter/proxy/proxyEntry.js.map +1 -1
  28. package/bin/adapter/repositories/ConfigurableSilentSessionMessageComposer.js +37 -0
  29. package/bin/adapter/repositories/ConfigurableSilentSessionMessageComposer.js.map +1 -0
  30. package/bin/adapter/repositories/FileSystemSessionOutputActivityRepository.js +76 -0
  31. package/bin/adapter/repositories/FileSystemSessionOutputActivityRepository.js.map +1 -0
  32. package/bin/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.js +67 -0
  33. package/bin/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.js.map +1 -0
  34. package/bin/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.js +50 -0
  35. package/bin/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.js.map +1 -0
  36. package/bin/adapter/repositories/NoUnansweredOwnerCallStatusProvider.js +12 -0
  37. package/bin/adapter/repositories/NoUnansweredOwnerCallStatusProvider.js.map +1 -0
  38. package/bin/adapter/repositories/NodeSubAgentProcessLister.js +37 -0
  39. package/bin/adapter/repositories/NodeSubAgentProcessLister.js.map +1 -0
  40. package/bin/adapter/repositories/ProcessListSessionSubAgentActivityRepository.js +48 -0
  41. package/bin/adapter/repositories/ProcessListSessionSubAgentActivityRepository.js.map +1 -0
  42. package/bin/adapter/repositories/RealSleeper.js +17 -0
  43. package/bin/adapter/repositories/RealSleeper.js.map +1 -0
  44. package/bin/adapter/repositories/TmuxSilentSessionNotificationRepository.js +56 -0
  45. package/bin/adapter/repositories/TmuxSilentSessionNotificationRepository.js.map +1 -0
  46. package/bin/adapter/repositories/TranscriptOwnerCallStatusProvider.js +150 -0
  47. package/bin/adapter/repositories/TranscriptOwnerCallStatusProvider.js.map +1 -0
  48. package/bin/adapter/repositories/TranscriptSessionSubAgentActivityRepository.js +152 -0
  49. package/bin/adapter/repositories/TranscriptSessionSubAgentActivityRepository.js.map +1 -0
  50. package/bin/domain/entities/LiveSessionActivitySnapshot.js +3 -0
  51. package/bin/domain/entities/LiveSessionActivitySnapshot.js.map +1 -0
  52. package/bin/domain/entities/LiveSessionOutputActivity.js +3 -0
  53. package/bin/domain/entities/LiveSessionOutputActivity.js.map +1 -0
  54. package/bin/domain/usecases/DefaultSilentSessionMessageComposer.js +35 -0
  55. package/bin/domain/usecases/DefaultSilentSessionMessageComposer.js.map +1 -0
  56. package/bin/domain/usecases/NotifySilentLiveSessionsUseCase.js +113 -0
  57. package/bin/domain/usecases/NotifySilentLiveSessionsUseCase.js.map +1 -0
  58. package/bin/domain/usecases/OauthTokenSelectUseCase.js +8 -2
  59. package/bin/domain/usecases/OauthTokenSelectUseCase.js.map +1 -1
  60. package/bin/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.js +3 -0
  61. package/bin/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.js.map +1 -0
  62. package/bin/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.js +3 -0
  63. package/bin/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.js.map +1 -0
  64. package/bin/domain/usecases/adapter-interfaces/SessionSubAgentActivityRepository.js +3 -0
  65. package/bin/domain/usecases/adapter-interfaces/SessionSubAgentActivityRepository.js.map +1 -0
  66. package/bin/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.js +3 -0
  67. package/bin/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.js.map +1 -0
  68. package/bin/domain/usecases/adapter-interfaces/SilentSessionNotificationRepository.js +3 -0
  69. package/bin/domain/usecases/adapter-interfaces/SilentSessionNotificationRepository.js.map +1 -0
  70. package/bin/domain/usecases/adapter-interfaces/Sleeper.js +3 -0
  71. package/bin/domain/usecases/adapter-interfaces/Sleeper.js.map +1 -0
  72. package/bin/domain/usecases/adapter-interfaces/SubAgentProcessLister.js +3 -0
  73. package/bin/domain/usecases/adapter-interfaces/SubAgentProcessLister.js.map +1 -0
  74. package/bin/domain/usecases/adapter-interfaces/SubAgentSilentSecondsResolver.js +3 -0
  75. package/bin/domain/usecases/adapter-interfaces/SubAgentSilentSecondsResolver.js.map +1 -0
  76. package/bin/domain/usecases/adapter-interfaces/SubAgentTranscriptDirectoryResolver.js +3 -0
  77. package/bin/domain/usecases/adapter-interfaces/SubAgentTranscriptDirectoryResolver.js.map +1 -0
  78. package/bin/domain/usecases/dashboard/DashboardProjectCode.js +19 -0
  79. package/bin/domain/usecases/dashboard/DashboardProjectCode.js.map +1 -0
  80. package/package.json +1 -1
  81. package/src/adapter/entry-points/cli/index.ts +14 -14
  82. package/src/adapter/entry-points/console/dashboardComposeService.test.ts +31 -28
  83. package/src/adapter/entry-points/console/dashboardComposeService.ts +13 -10
  84. package/src/adapter/entry-points/console/dashboardEmitterComposerKey.test.ts +175 -0
  85. package/src/adapter/entry-points/console/ui/e2e/consoleTestHarness.ts +1 -1
  86. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.stories.tsx +24 -0
  87. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.test.tsx +63 -0
  88. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleCopyUrlButton.tsx +51 -0
  89. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.test.tsx +7 -0
  90. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsoleItemDetail.tsx +2 -0
  91. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.test.tsx +18 -0
  92. package/src/adapter/entry-points/console/ui/src/features/console/components/detail/ConsolePullRequestDetail.tsx +2 -0
  93. package/src/adapter/entry-points/console/ui/src/index.css +14 -0
  94. package/src/adapter/entry-points/console/ui-dist/assets/{index-CO-f_j4f.css → index-BPH6W1yn.css} +1 -1
  95. package/src/adapter/entry-points/console/ui-dist/assets/index-CT3t4Yje.js +101 -0
  96. package/src/adapter/entry-points/console/ui-dist/index.html +2 -2
  97. package/src/adapter/entry-points/console/webServer.test.ts +23 -23
  98. package/src/adapter/entry-points/console/webServer.ts +5 -4
  99. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +122 -0
  100. package/src/adapter/entry-points/handlers/InTmuxByHumanSessionTokenCountHandler.ts +2 -0
  101. package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.test.ts +112 -0
  102. package/src/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.ts +2 -0
  103. package/src/adapter/entry-points/handlers/OauthTokenSelectHandler.test.ts +131 -0
  104. package/src/adapter/entry-points/handlers/OauthTokenSelectHandler.ts +2 -0
  105. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.test.ts +338 -0
  106. package/src/adapter/entry-points/handlers/notifySilentTmuxSessions.ts +174 -0
  107. package/src/adapter/entry-points/handlers/tokenStatusWriter.test.ts +79 -0
  108. package/src/adapter/entry-points/handlers/tokenStatusWriter.ts +117 -3
  109. package/src/adapter/proxy/RateLimitCache.test.ts +89 -0
  110. package/src/adapter/proxy/RateLimitCache.ts +31 -0
  111. package/src/adapter/proxy/proxyEntry.test.ts +92 -0
  112. package/src/adapter/proxy/proxyEntry.ts +32 -0
  113. package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.test.ts +77 -0
  114. package/src/adapter/repositories/ConfigurableSilentSessionMessageComposer.ts +51 -0
  115. package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.test.ts +92 -0
  116. package/src/adapter/repositories/FileSystemSessionOutputActivityRepository.ts +48 -0
  117. package/src/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.test.ts +56 -0
  118. package/src/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.ts +32 -0
  119. package/src/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.test.ts +32 -0
  120. package/src/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.ts +17 -0
  121. package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.test.ts +12 -0
  122. package/src/adapter/repositories/NoUnansweredOwnerCallStatusProvider.ts +9 -0
  123. package/src/adapter/repositories/NodeSubAgentProcessLister.test.ts +43 -0
  124. package/src/adapter/repositories/NodeSubAgentProcessLister.ts +40 -0
  125. package/src/adapter/repositories/ProcessListSessionSubAgentActivityRepository.test.ts +109 -0
  126. package/src/adapter/repositories/ProcessListSessionSubAgentActivityRepository.ts +56 -0
  127. package/src/adapter/repositories/RealSleeper.test.ts +19 -0
  128. package/src/adapter/repositories/RealSleeper.ts +12 -0
  129. package/src/adapter/repositories/TmuxSilentSessionNotificationRepository.test.ts +153 -0
  130. package/src/adapter/repositories/TmuxSilentSessionNotificationRepository.ts +83 -0
  131. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.test.ts +220 -0
  132. package/src/adapter/repositories/TranscriptOwnerCallStatusProvider.ts +139 -0
  133. package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.test.ts +217 -0
  134. package/src/adapter/repositories/TranscriptSessionSubAgentActivityRepository.ts +145 -0
  135. package/src/domain/entities/LiveSessionActivitySnapshot.ts +12 -0
  136. package/src/domain/entities/LiveSessionOutputActivity.ts +4 -0
  137. package/src/domain/usecases/DefaultSilentSessionMessageComposer.test.ts +52 -0
  138. package/src/domain/usecases/DefaultSilentSessionMessageComposer.ts +39 -0
  139. package/src/domain/usecases/InTmuxByHumanSessionTokenCountUseCase.test.ts +2 -0
  140. package/src/domain/usecases/LiveSessionOauthTokenSelectUseCase.test.ts +40 -0
  141. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.test.ts +612 -0
  142. package/src/domain/usecases/NotifySilentLiveSessionsUseCase.ts +223 -0
  143. package/src/domain/usecases/OauthTokenSelectUseCase.test.ts +36 -0
  144. package/src/domain/usecases/OauthTokenSelectUseCase.ts +12 -0
  145. package/src/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.ts +5 -0
  146. package/src/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.ts +7 -0
  147. package/src/domain/usecases/adapter-interfaces/SessionSubAgentActivityRepository.ts +7 -0
  148. package/src/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.ts +6 -0
  149. package/src/domain/usecases/adapter-interfaces/SilentSessionNotificationRepository.ts +11 -0
  150. package/src/domain/usecases/adapter-interfaces/Sleeper.ts +3 -0
  151. package/src/domain/usecases/adapter-interfaces/SubAgentProcessLister.ts +8 -0
  152. package/src/domain/usecases/adapter-interfaces/SubAgentSilentSecondsResolver.ts +3 -0
  153. package/src/domain/usecases/adapter-interfaces/SubAgentTranscriptDirectoryResolver.ts +3 -0
  154. package/src/domain/usecases/dashboard/DashboardProjectCode.test.ts +32 -0
  155. package/src/domain/usecases/dashboard/DashboardProjectCode.ts +20 -0
  156. package/types/adapter/entry-points/console/dashboardComposeService.d.ts +1 -1
  157. package/types/adapter/entry-points/console/dashboardComposeService.d.ts.map +1 -1
  158. package/types/adapter/entry-points/console/webServer.d.ts +2 -2
  159. package/types/adapter/entry-points/console/webServer.d.ts.map +1 -1
  160. package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
  161. package/types/adapter/entry-points/handlers/InTmuxByHumanSessionTokenCountHandler.d.ts.map +1 -1
  162. package/types/adapter/entry-points/handlers/LiveSessionOauthTokenSelectHandler.d.ts.map +1 -1
  163. package/types/adapter/entry-points/handlers/OauthTokenSelectHandler.d.ts.map +1 -1
  164. package/types/adapter/entry-points/handlers/notifySilentTmuxSessions.d.ts +34 -0
  165. package/types/adapter/entry-points/handlers/notifySilentTmuxSessions.d.ts.map +1 -0
  166. package/types/adapter/entry-points/handlers/tokenStatusWriter.d.ts +1 -0
  167. package/types/adapter/entry-points/handlers/tokenStatusWriter.d.ts.map +1 -1
  168. package/types/adapter/proxy/RateLimitCache.d.ts +3 -0
  169. package/types/adapter/proxy/RateLimitCache.d.ts.map +1 -1
  170. package/types/adapter/proxy/proxyEntry.d.ts.map +1 -1
  171. package/types/adapter/repositories/ConfigurableSilentSessionMessageComposer.d.ts +15 -0
  172. package/types/adapter/repositories/ConfigurableSilentSessionMessageComposer.d.ts.map +1 -0
  173. package/types/adapter/repositories/FileSystemSessionOutputActivityRepository.d.ts +10 -0
  174. package/types/adapter/repositories/FileSystemSessionOutputActivityRepository.d.ts.map +1 -0
  175. package/types/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.d.ts +9 -0
  176. package/types/adapter/repositories/FileSystemSubAgentSilentSecondsResolver.d.ts.map +1 -0
  177. package/types/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.d.ts +7 -0
  178. package/types/adapter/repositories/FileSystemSubAgentTranscriptDirectoryResolver.d.ts.map +1 -0
  179. package/types/adapter/repositories/NoUnansweredOwnerCallStatusProvider.d.ts +5 -0
  180. package/types/adapter/repositories/NoUnansweredOwnerCallStatusProvider.d.ts.map +1 -0
  181. package/types/adapter/repositories/NodeSubAgentProcessLister.d.ts +8 -0
  182. package/types/adapter/repositories/NodeSubAgentProcessLister.d.ts.map +1 -0
  183. package/types/adapter/repositories/ProcessListSessionSubAgentActivityRepository.d.ts +12 -0
  184. package/types/adapter/repositories/ProcessListSessionSubAgentActivityRepository.d.ts.map +1 -0
  185. package/types/adapter/repositories/RealSleeper.d.ts +5 -0
  186. package/types/adapter/repositories/RealSleeper.d.ts.map +1 -0
  187. package/types/adapter/repositories/TmuxSilentSessionNotificationRepository.d.ts +13 -0
  188. package/types/adapter/repositories/TmuxSilentSessionNotificationRepository.d.ts.map +1 -0
  189. package/types/adapter/repositories/TranscriptOwnerCallStatusProvider.d.ts +10 -0
  190. package/types/adapter/repositories/TranscriptOwnerCallStatusProvider.d.ts.map +1 -0
  191. package/types/adapter/repositories/TranscriptSessionSubAgentActivityRepository.d.ts +12 -0
  192. package/types/adapter/repositories/TranscriptSessionSubAgentActivityRepository.d.ts.map +1 -0
  193. package/types/domain/entities/LiveSessionActivitySnapshot.d.ts +12 -0
  194. package/types/domain/entities/LiveSessionActivitySnapshot.d.ts.map +1 -0
  195. package/types/domain/entities/LiveSessionOutputActivity.d.ts +5 -0
  196. package/types/domain/entities/LiveSessionOutputActivity.d.ts.map +1 -0
  197. package/types/domain/usecases/DefaultSilentSessionMessageComposer.d.ts +7 -0
  198. package/types/domain/usecases/DefaultSilentSessionMessageComposer.d.ts.map +1 -0
  199. package/types/domain/usecases/NotifySilentLiveSessionsUseCase.d.ts +41 -0
  200. package/types/domain/usecases/NotifySilentLiveSessionsUseCase.d.ts.map +1 -0
  201. package/types/domain/usecases/OauthTokenSelectUseCase.d.ts +2 -0
  202. package/types/domain/usecases/OauthTokenSelectUseCase.d.ts.map +1 -1
  203. package/types/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.d.ts +4 -0
  204. package/types/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.d.ts.map +1 -0
  205. package/types/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.d.ts +5 -0
  206. package/types/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.d.ts.map +1 -0
  207. package/types/domain/usecases/adapter-interfaces/SessionSubAgentActivityRepository.d.ts +5 -0
  208. package/types/domain/usecases/adapter-interfaces/SessionSubAgentActivityRepository.d.ts.map +1 -0
  209. package/types/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.d.ts +6 -0
  210. package/types/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.d.ts.map +1 -0
  211. package/types/domain/usecases/adapter-interfaces/SilentSessionNotificationRepository.d.ts +6 -0
  212. package/types/domain/usecases/adapter-interfaces/SilentSessionNotificationRepository.d.ts.map +1 -0
  213. package/types/domain/usecases/adapter-interfaces/Sleeper.d.ts +4 -0
  214. package/types/domain/usecases/adapter-interfaces/Sleeper.d.ts.map +1 -0
  215. package/types/domain/usecases/adapter-interfaces/SubAgentProcessLister.d.ts +8 -0
  216. package/types/domain/usecases/adapter-interfaces/SubAgentProcessLister.d.ts.map +1 -0
  217. package/types/domain/usecases/adapter-interfaces/SubAgentSilentSecondsResolver.d.ts +4 -0
  218. package/types/domain/usecases/adapter-interfaces/SubAgentSilentSecondsResolver.d.ts.map +1 -0
  219. package/types/domain/usecases/adapter-interfaces/SubAgentTranscriptDirectoryResolver.d.ts +4 -0
  220. package/types/domain/usecases/adapter-interfaces/SubAgentTranscriptDirectoryResolver.d.ts.map +1 -0
  221. package/types/domain/usecases/dashboard/DashboardProjectCode.d.ts +4 -0
  222. package/types/domain/usecases/dashboard/DashboardProjectCode.d.ts.map +1 -0
  223. package/bin/adapter/entry-points/console/ui-dist/assets/index-BpccigBS.js +0 -101
  224. package/src/adapter/entry-points/console/ui-dist/assets/index-BpccigBS.js +0 -101
@@ -26,7 +26,7 @@ class OauthTokenSelectUseCase {
26
26
  const fiveHourFreeRatio = this.fiveHourFreeRatio(candidate.snapshot, nowEpochSeconds);
27
27
  const sevenDayFreeRatio = this.sevenDayFreeRatio(candidate.snapshot, nowEpochSeconds);
28
28
  const sevenDayEndEpoch = this.sevenDayEndEpoch(candidate.snapshot, nowEpochSeconds);
29
- const exclusionReason = this.exclusionReason(fiveHourFreeRatio, sevenDayFreeRatio);
29
+ const exclusionReason = this.exclusionReason(candidate.subscriptionDisabled, candidate.unifiedRejected, fiveHourFreeRatio, sevenDayFreeRatio);
30
30
  return {
31
31
  name: candidate.name,
32
32
  fiveHourFreeRatio,
@@ -36,7 +36,13 @@ class OauthTokenSelectUseCase {
36
36
  exclusionReason,
37
37
  };
38
38
  };
39
- this.exclusionReason = (fiveHourFreeRatio, sevenDayFreeRatio) => {
39
+ this.exclusionReason = (subscriptionDisabled, unifiedRejected, fiveHourFreeRatio, sevenDayFreeRatio) => {
40
+ if (subscriptionDisabled) {
41
+ return 'organization has disabled Claude subscription access for Claude Code';
42
+ }
43
+ if (unifiedRejected) {
44
+ return 'token request was rejected (anthropic-ratelimit-unified-status: rejected)';
45
+ }
40
46
  if (fiveHourFreeRatio < exports.FIVE_HOUR_MIN_FREE_RATIO) {
41
47
  return `5h window only ${this.toPercent(fiveHourFreeRatio)}% free (requires >= ${this.toPercent(exports.FIVE_HOUR_MIN_FREE_RATIO)}%)`;
42
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"OauthTokenSelectUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/OauthTokenSelectUseCase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OauthTokenSelectUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/OauthTokenSelectUseCase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=OwnerCallStatusProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OwnerCallStatusProvider.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/OwnerCallStatusProvider.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=SessionOutputActivityRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionOutputActivityRepository.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/SessionOutputActivityRepository.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=SessionSubAgentActivityRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionSubAgentActivityRepository.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/SessionSubAgentActivityRepository.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=SilentSessionMessageComposer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SilentSessionMessageComposer.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/SilentSessionMessageComposer.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=SilentSessionNotificationRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SilentSessionNotificationRepository.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/SilentSessionNotificationRepository.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Sleeper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sleeper.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/Sleeper.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=SubAgentProcessLister.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubAgentProcessLister.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/SubAgentProcessLister.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=SubAgentSilentSecondsResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubAgentSilentSecondsResolver.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/SubAgentSilentSecondsResolver.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=SubAgentTranscriptDirectoryResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubAgentTranscriptDirectoryResolver.js","sourceRoot":"","sources":["../../../../src/domain/usecases/adapter-interfaces/SubAgentTranscriptDirectoryResolver.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toDashboardDisplayLabel = exports.DASHBOARD_PROJECT_NAMES = exports.DASHBOARD_DISPLAY_LABEL_BY_PROJECT_NAME = void 0;
4
+ exports.DASHBOARD_DISPLAY_LABEL_BY_PROJECT_NAME = {
5
+ umino: 'um',
6
+ xmile: 'xm',
7
+ xcare: 'xc',
8
+ utage3: 'ut',
9
+ };
10
+ exports.DASHBOARD_PROJECT_NAMES = Object.keys(exports.DASHBOARD_DISPLAY_LABEL_BY_PROJECT_NAME);
11
+ const toDashboardDisplayLabel = (projectName) => {
12
+ const label = exports.DASHBOARD_DISPLAY_LABEL_BY_PROJECT_NAME[projectName];
13
+ if (label === undefined) {
14
+ throw new Error(`Unknown dashboard project name: ${projectName}. Add it to DASHBOARD_DISPLAY_LABEL_BY_PROJECT_NAME.`);
15
+ }
16
+ return label;
17
+ };
18
+ exports.toDashboardDisplayLabel = toDashboardDisplayLabel;
19
+ //# sourceMappingURL=DashboardProjectCode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardProjectCode.js","sourceRoot":"","sources":["../../../../src/domain/usecases/dashboard/DashboardProjectCode.ts"],"names":[],"mappings":";;;AAAa,QAAA,uCAAuC,GAA2B;IAC7E,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;CACb,CAAC;AAEW,QAAA,uBAAuB,GAAa,MAAM,CAAC,IAAI,CAC1D,+CAAuC,CACxC,CAAC;AAEK,MAAM,uBAAuB,GAAG,CAAC,WAAmB,EAAU,EAAE;IACrE,MAAM,KAAK,GAAG,+CAAuC,CAAC,WAAW,CAAC,CAAC;IACnE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,mCAAmC,WAAW,sDAAsD,CACrG,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AARW,QAAA,uBAAuB,2BAQlC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "1.109.1",
3
+ "version": "1.110.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -33,7 +33,7 @@ import { FetchWebhookRepository } from '../../repositories/FetchWebhookRepositor
33
33
  import { RevertOrphanedPreparationUseCase } from '../../../domain/usecases/RevertOrphanedPreparationUseCase';
34
34
  import * as path from 'path';
35
35
  import {
36
- DEFAULT_DASHBOARD_PROJECT_CODES,
36
+ DEFAULT_DASHBOARD_PROJECT_NAMES,
37
37
  DEFAULT_WEB_PORT,
38
38
  startWebServer,
39
39
  } from '../console/webServer';
@@ -81,7 +81,7 @@ type ServeWebOptions = {
81
81
  inTmuxDataDir?: string;
82
82
  dashboardDir?: string;
83
83
  dashboardDataDir?: string;
84
- dashboardProjectCodes?: string;
84
+ dashboardProjectNames?: string;
85
85
  };
86
86
 
87
87
  const DEFAULT_IN_TMUX_DATA_DIR =
@@ -91,15 +91,15 @@ const DEFAULT_DASHBOARD_DIR = '/home/hiromi/0_workspaces/workspace1/jsonpub';
91
91
 
92
92
  const DEFAULT_DASHBOARD_DATA_DIR: string | null = null;
93
93
 
94
- const parseDashboardProjectCodes = (raw: string | undefined): string[] => {
94
+ const parseDashboardProjectNames = (raw: string | undefined): string[] => {
95
95
  if (raw === undefined) {
96
- return DEFAULT_DASHBOARD_PROJECT_CODES;
96
+ return DEFAULT_DASHBOARD_PROJECT_NAMES;
97
97
  }
98
- const codes = raw
98
+ const names = raw
99
99
  .split(',')
100
- .map((code) => code.trim())
101
- .filter((code) => code.length > 0);
102
- return codes.length > 0 ? codes : DEFAULT_DASHBOARD_PROJECT_CODES;
100
+ .map((name) => name.trim())
101
+ .filter((name) => name.length > 0);
102
+ return names.length > 0 ? names : DEFAULT_DASHBOARD_PROJECT_NAMES;
103
103
  };
104
104
 
105
105
  type SelectOauthTokenOptions = {
@@ -719,8 +719,8 @@ const runServeWeb = async (options: ServeWebOptions): Promise<void> => {
719
719
  const dashboardDir = options.dashboardDir ?? DEFAULT_DASHBOARD_DIR;
720
720
  const dashboardDataDir =
721
721
  options.dashboardDataDir ?? DEFAULT_DASHBOARD_DATA_DIR;
722
- const dashboardProjectCodes = parseDashboardProjectCodes(
723
- options.dashboardProjectCodes,
722
+ const dashboardProjectNames = parseDashboardProjectNames(
723
+ options.dashboardProjectNames,
724
724
  );
725
725
 
726
726
  await startWebServer({
@@ -730,7 +730,7 @@ const runServeWeb = async (options: ServeWebOptions): Promise<void> => {
730
730
  inTmuxDataDir,
731
731
  dashboardDir,
732
732
  dashboardDataDir,
733
- dashboardProjectCodes,
733
+ dashboardProjectNames,
734
734
  githubToken: token,
735
735
  issueRepository,
736
736
  resolveProject,
@@ -764,11 +764,11 @@ const addServeWebOptions = (command: Command): Command =>
764
764
  )
765
765
  .option(
766
766
  '--dashboardDataDir <path>',
767
- 'Directory containing the dashboard data files (projects/<pjcode>.json, machine-status.json, token-status.json); when set and every required file is present the server composes the /tdpm.txt fragment from them at request time, otherwise it falls back to serving the static tdpm.txt from --dashboardDir (unset when not configured)',
767
+ 'Directory containing the dashboard data files (projects/<projectName>.json, machine-status.json, token-status.json); when set and every required file is present the server composes the /tdpm.txt fragment from them at request time, otherwise it falls back to serving the static tdpm.txt from --dashboardDir (unset when not configured)',
768
768
  )
769
769
  .option(
770
- '--dashboardProjectCodes <codes>',
771
- `Comma-separated project codes, in display order, for the dashboard project grid (default: ${DEFAULT_DASHBOARD_PROJECT_CODES.join(',')})`,
770
+ '--dashboardProjectNames <names>',
771
+ `Comma-separated project names, in display order, for the dashboard project grid (default: ${DEFAULT_DASHBOARD_PROJECT_NAMES.join(',')})`,
772
772
  );
773
773
 
774
774
  addServeWebOptions(program.command('serveWeb'))
@@ -22,8 +22,8 @@ describe('buildComposeDashboardInput', () => {
22
22
  it('reads every requested project code in order and yields null for absent files', () => {
23
23
  const dataDir = makeDataDir();
24
24
  try {
25
- writeProject(dataDir, 'um', {
26
- pjcode: 'um',
25
+ writeProject(dataDir, 'umino', {
26
+ pjcode: 'umino',
27
27
  capturedAt: 'x',
28
28
  unread: 3,
29
29
  todo: 1,
@@ -36,7 +36,7 @@ describe('buildComposeDashboardInput', () => {
36
36
  });
37
37
  const input = buildComposeDashboardInput({
38
38
  dashboardDataDir: dataDir,
39
- projectCodes: ['um', 'xc'],
39
+ projectNames: ['umino', 'xcare'],
40
40
  });
41
41
  expect(input.projects).toEqual([
42
42
  {
@@ -62,10 +62,10 @@ describe('buildComposeDashboardInput', () => {
62
62
  it('treats a project file with a missing field as an absent row', () => {
63
63
  const dataDir = makeDataDir();
64
64
  try {
65
- writeProject(dataDir, 'um', { unread: 1, todo: 1 });
65
+ writeProject(dataDir, 'umino', { unread: 1, todo: 1 });
66
66
  const input = buildComposeDashboardInput({
67
67
  dashboardDataDir: dataDir,
68
- projectCodes: ['um'],
68
+ projectNames: ['umino'],
69
69
  });
70
70
  expect(input.projects[0].row).toBeNull();
71
71
  } finally {
@@ -77,10 +77,13 @@ describe('buildComposeDashboardInput', () => {
77
77
  const dataDir = makeDataDir();
78
78
  try {
79
79
  fs.mkdirSync(path.join(dataDir, 'projects'), { recursive: true });
80
- fs.writeFileSync(path.join(dataDir, 'projects', 'um.json'), 'not json');
80
+ fs.writeFileSync(
81
+ path.join(dataDir, 'projects', 'umino.json'),
82
+ 'not json',
83
+ );
81
84
  const input = buildComposeDashboardInput({
82
85
  dashboardDataDir: dataDir,
83
- projectCodes: ['um'],
86
+ projectNames: ['umino'],
84
87
  });
85
88
  expect(input.projects[0].row).toBeNull();
86
89
  } finally {
@@ -104,7 +107,7 @@ describe('buildComposeDashboardInput', () => {
104
107
  );
105
108
  const input = buildComposeDashboardInput({
106
109
  dashboardDataDir: dataDir,
107
- projectCodes: [],
110
+ projectNames: [],
108
111
  });
109
112
  expect(input.machineStatus).toEqual({
110
113
  memPct: 55,
@@ -134,7 +137,7 @@ describe('buildComposeDashboardInput', () => {
134
137
  );
135
138
  const input = buildComposeDashboardInput({
136
139
  dashboardDataDir: dataDir,
137
- projectCodes: [],
140
+ projectNames: [],
138
141
  });
139
142
  expect(input.machineStatus?.cycleMinutes).toBeNull();
140
143
  } finally {
@@ -147,7 +150,7 @@ describe('buildComposeDashboardInput', () => {
147
150
  try {
148
151
  const input = buildComposeDashboardInput({
149
152
  dashboardDataDir: dataDir,
150
- projectCodes: [],
153
+ projectNames: [],
151
154
  });
152
155
  expect(input.machineStatus).toBeNull();
153
156
  } finally {
@@ -179,7 +182,7 @@ describe('buildComposeDashboardInput', () => {
179
182
  );
180
183
  const input = buildComposeDashboardInput({
181
184
  dashboardDataDir: dataDir,
182
- projectCodes: [],
185
+ projectNames: [],
183
186
  });
184
187
  expect(input.tokens).toEqual([
185
188
  {
@@ -221,7 +224,7 @@ describe('buildComposeDashboardInput', () => {
221
224
  );
222
225
  const input = buildComposeDashboardInput({
223
226
  dashboardDataDir: dataDir,
224
- projectCodes: [],
227
+ projectNames: [],
225
228
  });
226
229
  expect(input.tokens[0].color).toBe('Y');
227
230
  expect(input.tokens[0].fiveHourUtilizationPercent).toBeNull();
@@ -235,7 +238,7 @@ describe('buildComposeDashboardInput', () => {
235
238
  try {
236
239
  const input = buildComposeDashboardInput({
237
240
  dashboardDataDir: dataDir,
238
- projectCodes: [],
241
+ projectNames: [],
239
242
  });
240
243
  expect(input.tokens).toEqual([]);
241
244
  } finally {
@@ -248,8 +251,8 @@ describe('composeDashboardText', () => {
248
251
  it('composes the full byte-identical dashboard text from the data files', () => {
249
252
  const dataDir = makeDataDir();
250
253
  try {
251
- writeProject(dataDir, 'um', {
252
- pjcode: 'um',
254
+ writeProject(dataDir, 'umino', {
255
+ pjcode: 'umino',
253
256
  capturedAt: 'x',
254
257
  unread: 3,
255
258
  todo: 1,
@@ -292,7 +295,7 @@ describe('composeDashboardText', () => {
292
295
  expect(
293
296
  composeDashboardText({
294
297
  dashboardDataDir: dataDir,
295
- projectCodes: ['um', 'xc'],
298
+ projectNames: ['umino', 'xcare'],
296
299
  }),
297
300
  ).toBe(
298
301
  '<tt>M55%&nbsp;C62%&nbsp;D89%&nbsp;cy14</tt><br>\n' +
@@ -329,7 +332,7 @@ describe('dashboardComposeFilesPresent', () => {
329
332
  };
330
333
 
331
334
  const minimalProject = {
332
- pjcode: 'um',
335
+ pjcode: 'umino',
333
336
  capturedAt: 'x',
334
337
  unread: 0,
335
338
  todo: 0,
@@ -345,12 +348,12 @@ describe('dashboardComposeFilesPresent', () => {
345
348
  const dataDir = makeDataDir();
346
349
  try {
347
350
  writeMachineAndToken(dataDir);
348
- writeProject(dataDir, 'um', minimalProject);
349
- writeProject(dataDir, 'xc', { ...minimalProject, pjcode: 'xc' });
351
+ writeProject(dataDir, 'umino', minimalProject);
352
+ writeProject(dataDir, 'xcare', { ...minimalProject, pjcode: 'xcare' });
350
353
  expect(
351
354
  dashboardComposeFilesPresent({
352
355
  dashboardDataDir: dataDir,
353
- projectCodes: ['um', 'xc'],
356
+ projectNames: ['umino', 'xcare'],
354
357
  }),
355
358
  ).toBe(true);
356
359
  } finally {
@@ -364,7 +367,7 @@ describe('dashboardComposeFilesPresent', () => {
364
367
  expect(
365
368
  dashboardComposeFilesPresent({
366
369
  dashboardDataDir: dataDir,
367
- projectCodes: ['um'],
370
+ projectNames: ['umino'],
368
371
  }),
369
372
  ).toBe(false);
370
373
  } finally {
@@ -376,11 +379,11 @@ describe('dashboardComposeFilesPresent', () => {
376
379
  const dataDir = makeDataDir();
377
380
  try {
378
381
  writeMachineAndToken(dataDir);
379
- writeProject(dataDir, 'um', minimalProject);
382
+ writeProject(dataDir, 'umino', minimalProject);
380
383
  expect(
381
384
  dashboardComposeFilesPresent({
382
385
  dashboardDataDir: dataDir,
383
- projectCodes: ['um', 'xc'],
386
+ projectNames: ['umino', 'xcare'],
384
387
  }),
385
388
  ).toBe(false);
386
389
  } finally {
@@ -395,11 +398,11 @@ describe('dashboardComposeFilesPresent', () => {
395
398
  path.join(dataDir, 'token-status.json'),
396
399
  JSON.stringify({ tokens: [], capturedAt: 'x' }),
397
400
  );
398
- writeProject(dataDir, 'um', minimalProject);
401
+ writeProject(dataDir, 'umino', minimalProject);
399
402
  expect(
400
403
  dashboardComposeFilesPresent({
401
404
  dashboardDataDir: dataDir,
402
- projectCodes: ['um'],
405
+ projectNames: ['umino'],
403
406
  }),
404
407
  ).toBe(false);
405
408
  } finally {
@@ -421,11 +424,11 @@ describe('dashboardComposeFilesPresent', () => {
421
424
  capturedAt: 'x',
422
425
  }),
423
426
  );
424
- writeProject(dataDir, 'um', minimalProject);
427
+ writeProject(dataDir, 'umino', minimalProject);
425
428
  expect(
426
429
  dashboardComposeFilesPresent({
427
430
  dashboardDataDir: dataDir,
428
- projectCodes: ['um'],
431
+ projectNames: ['umino'],
429
432
  }),
430
433
  ).toBe(false);
431
434
  } finally {
@@ -440,7 +443,7 @@ describe('dashboardComposeFilesPresent', () => {
440
443
  expect(
441
444
  dashboardComposeFilesPresent({
442
445
  dashboardDataDir: dataDir,
443
- projectCodes: [],
446
+ projectNames: [],
444
447
  }),
445
448
  ).toBe(false);
446
449
  } finally {
@@ -6,6 +6,7 @@ import {
6
6
  ComposeDashboardProject,
7
7
  ComposeDashboardUseCase,
8
8
  } from '../../../domain/usecases/dashboard/ComposeDashboardUseCase';
9
+ import { toDashboardDisplayLabel } from '../../../domain/usecases/dashboard/DashboardProjectCode';
9
10
  import { DashboardRow } from '../../../domain/usecases/dashboard/GenerateDashboardRowUseCase';
10
11
  import {
11
12
  TokenStatus,
@@ -14,7 +15,7 @@ import {
14
15
 
15
16
  export type DashboardComposeOptions = {
16
17
  dashboardDataDir: string;
17
- projectCodes: string[];
18
+ projectNames: string[];
18
19
  };
19
20
 
20
21
  const isRecord = (value: unknown): value is Record<string, unknown> =>
@@ -66,10 +67,12 @@ const parseDashboardRow = (value: unknown): DashboardRow | null => {
66
67
 
67
68
  const readProjectRow = (
68
69
  dashboardDataDir: string,
69
- code: string,
70
+ projectName: string,
70
71
  ): DashboardRow | null =>
71
72
  parseDashboardRow(
72
- readJsonFile(path.join(dashboardDataDir, 'projects', `${code}.json`)),
73
+ readJsonFile(
74
+ path.join(dashboardDataDir, 'projects', `${projectName}.json`),
75
+ ),
73
76
  );
74
77
 
75
78
  const parseLoad = (value: unknown): [number, number, number] | null => {
@@ -158,10 +161,10 @@ const readTokenStatuses = (dashboardDataDir: string): TokenStatus[] => {
158
161
  export const buildComposeDashboardInput = (
159
162
  options: DashboardComposeOptions,
160
163
  ): ComposeDashboardInput => {
161
- const projects: ComposeDashboardProject[] = options.projectCodes.map(
162
- (code) => ({
163
- code,
164
- row: readProjectRow(options.dashboardDataDir, code),
164
+ const projects: ComposeDashboardProject[] = options.projectNames.map(
165
+ (projectName) => ({
166
+ code: toDashboardDisplayLabel(projectName),
167
+ row: readProjectRow(options.dashboardDataDir, projectName),
165
168
  }),
166
169
  );
167
170
  return {
@@ -182,14 +185,14 @@ const isExistingFile = (filePath: string): boolean => {
182
185
  export const dashboardComposeFilesPresent = (
183
186
  options: DashboardComposeOptions,
184
187
  ): boolean => {
185
- if (options.projectCodes.length === 0) {
188
+ if (options.projectNames.length === 0) {
186
189
  return false;
187
190
  }
188
191
  const requiredFiles = [
189
192
  path.join(options.dashboardDataDir, 'machine-status.json'),
190
193
  path.join(options.dashboardDataDir, 'token-status.json'),
191
- ...options.projectCodes.map((code) =>
192
- path.join(options.dashboardDataDir, 'projects', `${code}.json`),
194
+ ...options.projectNames.map((projectName) =>
195
+ path.join(options.dashboardDataDir, 'projects', `${projectName}.json`),
193
196
  ),
194
197
  ];
195
198
  return requiredFiles.every((filePath) => isExistingFile(filePath));