sidekick-shared 0.27.6 → 0.28.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 (269) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +58 -18
  3. package/dist/browser.d.ts +13 -2
  4. package/dist/browser.js +30 -2
  5. package/dist/claudePaths.d.ts +11 -0
  6. package/dist/claudePaths.js +61 -0
  7. package/dist/claudeProfiles.d.ts +2 -9
  8. package/dist/claudeProfiles.js +10 -25
  9. package/dist/codexPaths.d.ts +22 -0
  10. package/dist/codexPaths.js +67 -0
  11. package/dist/codexProfiles.d.ts +1 -4
  12. package/dist/codexProfiles.js +5 -43
  13. package/dist/doctor.js +2 -2
  14. package/dist/esm/accountChangeSignal.js +15 -0
  15. package/dist/esm/accountChanges.js +152 -0
  16. package/dist/esm/accountHealth.js +288 -0
  17. package/dist/esm/accountLaunch.js +145 -0
  18. package/dist/esm/accountLease.js +60 -0
  19. package/dist/esm/accountManager.js +606 -0
  20. package/dist/esm/accountRegistry.js +214 -0
  21. package/dist/esm/accountStatus.js +51 -0
  22. package/dist/esm/accountSwitch.js +74 -0
  23. package/dist/esm/accountSync.js +156 -0
  24. package/dist/esm/accountSyncTypes.js +4 -0
  25. package/dist/esm/accounts.js +1291 -0
  26. package/dist/esm/aggregation/EventAggregator.js +2034 -0
  27. package/dist/esm/aggregation/FrequencyTracker.js +69 -0
  28. package/dist/esm/aggregation/HeatmapTracker.js +89 -0
  29. package/dist/esm/aggregation/PatternExtractor.js +168 -0
  30. package/dist/esm/aggregation/costProvenance.js +31 -0
  31. package/dist/esm/aggregation/snapshot.js +161 -0
  32. package/dist/esm/aggregation/types.js +5 -0
  33. package/dist/esm/analytics/codeImpact.js +18 -0
  34. package/dist/esm/analytics/compactionLedger.js +37 -0
  35. package/dist/esm/analytics/qualityScore.js +112 -0
  36. package/dist/esm/autoSwitch.js +185 -0
  37. package/dist/esm/browser.js +34 -0
  38. package/dist/esm/claudeCredentialDoctor.js +239 -0
  39. package/dist/esm/claudeCredentialLedger.js +91 -0
  40. package/dist/esm/claudeCredentials.js +111 -0
  41. package/dist/esm/claudeLiveGuard.js +43 -0
  42. package/dist/esm/claudePaths.js +22 -0
  43. package/dist/esm/claudeProfiles.js +142 -0
  44. package/dist/esm/claudeRefreshLock.js +106 -0
  45. package/dist/esm/codexAuth.js +101 -0
  46. package/dist/esm/codexCredentialDoctor.js +265 -0
  47. package/dist/esm/codexCredentialStore.js +164 -0
  48. package/dist/esm/codexKeepAlive.js +112 -0
  49. package/dist/esm/codexPaths.js +172 -0
  50. package/dist/esm/codexProfiles.js +1251 -0
  51. package/dist/esm/codexQuota.js +564 -0
  52. package/dist/esm/codexQuotaWatcher.js +363 -0
  53. package/dist/esm/context/composer.js +71 -0
  54. package/dist/esm/context/sessionContext.js +546 -0
  55. package/dist/esm/credentialIO.js +283 -0
  56. package/dist/esm/credentials.js +49 -0
  57. package/dist/esm/doctor.js +305 -0
  58. package/dist/esm/ensureDefaultAccounts.js +62 -0
  59. package/dist/esm/errorHistory.js +56 -0
  60. package/dist/esm/extractors/errorTaxonomy.js +43 -0
  61. package/dist/esm/extractors/gatherAssets.js +32 -0
  62. package/dist/esm/extractors/sessionAssets.js +176 -0
  63. package/dist/esm/extractors/sources/claudeAssets.js +158 -0
  64. package/dist/esm/extractors/sources/codexAssets.js +234 -0
  65. package/dist/esm/extractors/tokenUsage.js +41 -0
  66. package/dist/esm/extractors/toolCall.js +142 -0
  67. package/dist/esm/failingTools.js +65 -0
  68. package/dist/esm/fileHead.js +27 -0
  69. package/dist/esm/formatters/eventHighlighter.js +332 -0
  70. package/dist/esm/formatters/noiseClassifier.js +209 -0
  71. package/dist/esm/formatters/sessionDump.js +328 -0
  72. package/dist/esm/formatters/toolSummary.js +226 -0
  73. package/dist/esm/formatting.js +82 -0
  74. package/dist/esm/handoffUrl.js +23 -0
  75. package/dist/esm/historicalStore.js +305 -0
  76. package/dist/esm/humanPrompt.js +88 -0
  77. package/dist/esm/index.js +213 -0
  78. package/dist/esm/keepAlive.js +189 -0
  79. package/dist/esm/liveCredentialGuard.js +33 -0
  80. package/dist/esm/modelAliases.js +51 -0
  81. package/dist/esm/modelCatalog.js +139 -0
  82. package/dist/esm/modelContext.js +280 -0
  83. package/dist/esm/modelInfo.js +832 -0
  84. package/dist/esm/multiProviderQuotaService.js +450 -0
  85. package/dist/esm/node.js +46 -0
  86. package/dist/esm/observedContextWindows.js +165 -0
  87. package/dist/esm/observedSessionCollector.js +939 -0
  88. package/dist/esm/parsers/changelogParser.js +71 -0
  89. package/dist/esm/parsers/codexHistory.js +89 -0
  90. package/dist/esm/parsers/codexParser.js +906 -0
  91. package/dist/esm/parsers/debugLogParser.js +126 -0
  92. package/dist/esm/parsers/jsonl.js +66 -0
  93. package/dist/esm/parsers/mcpToolName.js +28 -0
  94. package/dist/esm/parsers/openCodeParser.js +625 -0
  95. package/dist/esm/parsers/planExtractor.js +335 -0
  96. package/dist/esm/parsers/sessionActivityDetector.js +246 -0
  97. package/dist/esm/parsers/sessionPathResolver.js +713 -0
  98. package/dist/esm/parsers/subagentScanner.js +360 -0
  99. package/dist/esm/parsers/subagentStatsCache.js +45 -0
  100. package/dist/esm/parsers/subagentTraceParser.js +325 -0
  101. package/dist/esm/paths.js +134 -0
  102. package/dist/esm/peakHours.js +194 -0
  103. package/dist/esm/phrases.js +1330 -0
  104. package/dist/esm/pricingCatalog.js +247 -0
  105. package/dist/esm/processDetection.js +200 -0
  106. package/dist/esm/projectMigration.js +59 -0
  107. package/dist/esm/promptHistory.js +1221 -0
  108. package/dist/esm/providerFailure.js +362 -0
  109. package/dist/esm/providerIds.js +6 -0
  110. package/dist/esm/providerQuota.js +1 -0
  111. package/dist/esm/providerServiceStatus.js +145 -0
  112. package/dist/esm/providerServiceStatusTypes.js +1 -0
  113. package/dist/esm/providerStatus.js +117 -0
  114. package/dist/esm/providers/claudeCode.js +575 -0
  115. package/dist/esm/providers/claudeListing.js +121 -0
  116. package/dist/esm/providers/codex.js +1034 -0
  117. package/dist/esm/providers/codexDatabase.js +297 -0
  118. package/dist/esm/providers/codexRollouts.js +215 -0
  119. package/dist/esm/providers/detect.js +185 -0
  120. package/dist/esm/providers/diagnostics.js +83 -0
  121. package/dist/esm/providers/directoryListingCache.js +206 -0
  122. package/dist/esm/providers/factory.js +54 -0
  123. package/dist/esm/providers/openCode.js +2008 -0
  124. package/dist/esm/providers/openCodeDatabase.js +419 -0
  125. package/dist/esm/providers/rolloutWalker.js +252 -0
  126. package/dist/esm/providers/types.js +12 -0
  127. package/dist/esm/quota.js +182 -0
  128. package/dist/esm/quotaHistory.js +364 -0
  129. package/dist/esm/quotaPoller.js +230 -0
  130. package/dist/esm/quotaPresentation.js +97 -0
  131. package/dist/esm/quotaResolver.js +231 -0
  132. package/dist/esm/quotaSnapshots.js +130 -0
  133. package/dist/esm/quotaThresholds.js +85 -0
  134. package/dist/esm/readers/decisions.js +24 -0
  135. package/dist/esm/readers/handoff.js +20 -0
  136. package/dist/esm/readers/helpers.js +27 -0
  137. package/dist/esm/readers/history.js +9 -0
  138. package/dist/esm/readers/notes.js +48 -0
  139. package/dist/esm/readers/plans.js +225 -0
  140. package/dist/esm/readers/tasks.js +19 -0
  141. package/dist/esm/report/htmlHelpers.js +280 -0
  142. package/dist/esm/report/htmlReportGenerator.js +704 -0
  143. package/dist/esm/report/index.js +7 -0
  144. package/dist/esm/report/logo.js +2 -0
  145. package/dist/esm/report/openBrowser.js +19 -0
  146. package/dist/esm/report/sessionReportInputs.js +33 -0
  147. package/dist/esm/report/transcriptParser.js +83 -0
  148. package/dist/esm/report/types.js +4 -0
  149. package/dist/esm/schemas/accountManager.js +204 -0
  150. package/dist/esm/schemas/accountStatus.js +25 -0
  151. package/dist/esm/schemas/assistantTurn.js +74 -0
  152. package/dist/esm/schemas/index.js +25 -0
  153. package/dist/esm/schemas/observedSessionV1.js +77 -0
  154. package/dist/esm/schemas/providerFailure.js +37 -0
  155. package/dist/esm/schemas/quota.js +132 -0
  156. package/dist/esm/schemas/quotaHistory.js +40 -0
  157. package/dist/esm/schemas/sessionEvent.js +216 -0
  158. package/dist/esm/schemas/stateFile.js +75 -0
  159. package/dist/esm/schemas/tokenEstimation.js +7 -0
  160. package/dist/esm/schemas/transcript.js +86 -0
  161. package/dist/esm/schemas/usageNormalization.js +38 -0
  162. package/dist/esm/search/advancedFilter.js +197 -0
  163. package/dist/esm/search/sessionSearch.js +66 -0
  164. package/dist/esm/sessionFingerprint.js +40 -0
  165. package/dist/esm/sessionMonitor.js +198 -0
  166. package/dist/esm/sessionPreviews.js +522 -0
  167. package/dist/esm/sessionPromptHistory.js +254 -0
  168. package/dist/esm/sessionPromptSignals.js +364 -0
  169. package/dist/esm/sessionStats.js +160 -0
  170. package/dist/esm/sessionTokenTotals.js +98 -0
  171. package/dist/esm/sessionTranscripts.js +49 -0
  172. package/dist/esm/stateFile.js +119 -0
  173. package/dist/esm/statusline/BurnRateCalculator.js +40 -0
  174. package/dist/esm/statusline/claudeStatuslinePayload.js +148 -0
  175. package/dist/esm/statusline/formatter.js +122 -0
  176. package/dist/esm/statusline/index.js +8 -0
  177. package/dist/esm/terminalSync.js +95 -0
  178. package/dist/esm/testing/credentialGuard.js +197 -0
  179. package/dist/esm/testing/index.js +12 -0
  180. package/dist/esm/testing/sessionLogFixtures.js +128 -0
  181. package/dist/esm/tokenEstimation.js +67 -0
  182. package/dist/esm/tokenSummary.js +113 -0
  183. package/dist/esm/toolCategory.js +82 -0
  184. package/dist/esm/transcript.js +257 -0
  185. package/dist/esm/turns/assistantTurn.js +373 -0
  186. package/dist/esm/types/codex.js +23 -0
  187. package/dist/esm/types/decisionLog.js +5 -0
  188. package/dist/esm/types/historicalData.js +47 -0
  189. package/dist/esm/types/knowledgeNote.js +15 -0
  190. package/dist/esm/types/observedSessionV1.js +257 -0
  191. package/dist/esm/types/opencode.js +12 -0
  192. package/dist/esm/types/plan.js +7 -0
  193. package/dist/esm/types/sessionEvent.js +10 -0
  194. package/dist/esm/types/taskPersistence.js +12 -0
  195. package/dist/esm/usage/billingBlocks.js +148 -0
  196. package/dist/esm/usage/claudeUsageDedupe.js +189 -0
  197. package/dist/esm/usage/importSessionHistory.js +84 -0
  198. package/dist/esm/usage/subagentUsage.js +18 -0
  199. package/dist/esm/usage/usageEvents.js +402 -0
  200. package/dist/esm/usage/usageReports.js +202 -0
  201. package/dist/esm/usageNormalization.js +95 -0
  202. package/dist/esm/watchers/eventBridge.js +219 -0
  203. package/dist/esm/watchers/factory.js +63 -0
  204. package/dist/esm/watchers/jsonlTail.js +289 -0
  205. package/dist/esm/watchers/jsonlWatcher.js +435 -0
  206. package/dist/esm/watchers/providerReaderWatcher.js +118 -0
  207. package/dist/esm/watchers/sqliteWatcher.js +285 -0
  208. package/dist/esm/watchers/types.js +4 -0
  209. package/dist/esm/workspaceRoots.js +56 -0
  210. package/dist/esm/writers/atomic.js +375 -0
  211. package/dist/esm/writers/decisions.js +51 -0
  212. package/dist/esm/writers/notes.js +46 -0
  213. package/dist/esm/writers/tasks.js +63 -0
  214. package/dist/esm/zaiQuota.js +323 -0
  215. package/dist/esm/zaiQuotaApi.js +271 -0
  216. package/dist/esm/zaiQuotaWatcher.js +265 -0
  217. package/dist/fileHead.d.ts +22 -0
  218. package/dist/fileHead.js +33 -0
  219. package/dist/index.d.ts +16 -7
  220. package/dist/index.js +49 -15
  221. package/dist/node.d.ts +13 -1
  222. package/dist/node.js +43 -2
  223. package/dist/parsers/codexHistory.js +2 -2
  224. package/dist/parsers/codexParser.d.ts +12 -0
  225. package/dist/parsers/codexParser.js +34 -12
  226. package/dist/parsers/debugLogParser.js +2 -2
  227. package/dist/parsers/sessionPathResolver.js +5 -4
  228. package/dist/promptHistory.d.ts +32 -0
  229. package/dist/promptHistory.js +115 -59
  230. package/dist/providerFailure.d.ts +12 -6
  231. package/dist/providerFailure.js +45 -0
  232. package/dist/providers/claudeCode.js +7 -99
  233. package/dist/providers/claudeListing.d.ts +22 -0
  234. package/dist/providers/claudeListing.js +158 -0
  235. package/dist/providers/codex.d.ts +3 -1
  236. package/dist/providers/codex.js +26 -227
  237. package/dist/providers/codexRollouts.d.ts +44 -0
  238. package/dist/providers/codexRollouts.js +261 -0
  239. package/dist/providers/detect.js +4 -4
  240. package/dist/readers/plans.js +3 -3
  241. package/dist/schemas/index.d.ts +2 -0
  242. package/dist/schemas/index.js +7 -2
  243. package/dist/schemas/providerFailure.d.ts +154 -0
  244. package/dist/schemas/providerFailure.js +40 -0
  245. package/dist/sessionPromptHistory.d.ts +12 -7
  246. package/dist/sessionPromptHistory.js +15 -3
  247. package/dist/sessionPromptSignals.d.ts +9 -0
  248. package/dist/sessionPromptSignals.js +13 -0
  249. package/dist/testing/credentialGuard.d.ts +23 -0
  250. package/dist/testing/credentialGuard.js +233 -0
  251. package/dist/testing/index.d.ts +14 -0
  252. package/dist/testing/index.js +22 -0
  253. package/dist/testing/sessionLogFixtures.d.ts +28 -0
  254. package/dist/testing/sessionLogFixtures.js +169 -0
  255. package/dist/tokenEstimation.d.ts +2 -0
  256. package/dist/tokenEstimation.js +21 -11
  257. package/dist/toolCategory.d.ts +18 -0
  258. package/dist/toolCategory.js +86 -0
  259. package/dist/types/codex.d.ts +4 -0
  260. package/dist/usage/usageEvents.d.ts +16 -0
  261. package/dist/usage/usageEvents.js +53 -9
  262. package/dist/watchers/jsonlTail.d.ts +26 -1
  263. package/dist/watchers/jsonlTail.js +136 -28
  264. package/dist/watchers/jsonlWatcher.js +7 -0
  265. package/dist/watchers/providerReaderWatcher.js +1 -0
  266. package/dist/watchers/types.d.ts +6 -0
  267. package/dist/workspaceRoots.d.ts +23 -0
  268. package/dist/workspaceRoots.js +93 -0
  269. package/package.json +22 -2
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Public API for the report module.
3
+ */
4
+ export { parseTranscript, parseTranscriptFromEvents } from './transcriptParser';
5
+ export { generateHtmlReport } from './htmlReportGenerator';
6
+ export { openInBrowser } from './openBrowser';
7
+ export { escapeHtml, simpleMarkdownToHtml, highlightCodeBlock } from './htmlHelpers';
@@ -0,0 +1,2 @@
1
+ /** Sidekick logo as a base64-encoded PNG data URI (64x64). */
2
+ export const SIDEKICK_LOGO_BASE64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABfWlDQ1BpY2MAACiRfZG7S8NQFMa/tkpLrTjYQcQhQ3Wyiy8caxWKUCHUCq06mNz0BU0akhQXR8G14OBjserg4qyrg6sgCD5A/APESdFFSjw3KbSI8cDl/vju+T7uPRfwN6tMNXsSgKpZRiaVFHL5VSH4Ch/CCGEafRIz9TlRTMOzvu6pm+ouzrO8+/6sfqVgMsAnECeYbljEG8Qzm5bOeZ84ysqSQnxOPG7QBYkfuS67/Ma55LCfZ0aNbGaeOEoslLpY7mJWNlTiKeKYomqU78+5rHDe4qxW66x9T/7CSEFbWeY6rRGksIgliBAgo44KqrAQp10jxUSGzpMe/mHHL5JLJlcFjBwLqEGF5PjB/+D3bM3i5ISbFEkCvS+2/TEKBHeBVsO2v49tu3UCBJ6BK63jrzWB2U/SGx0tdgQMbAMX1x1N3gMud4ChJ10yJEcK0PIXi8D7GX1THhi8BcJr7tza5zh9ALI0q/QNcHAIjJUoe93j3aHuuf3b057fD3IOcqa6P55sAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAAGYktHRAAAAAAAAPlDu38AAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfqAQoJBhRqhxPkAAAa80lEQVR42uVbd5wdVb3//s6U2/ZuSzaFtE1IIQTx0QQBSVCiNCGIgCCCSFOe0h4toCCEUAIRFEWitOcDUYyAIN3QREBeqAmkkISUTdtsvX3KOb/3x8yZmbsbCCj/vbOfu/femTPnnF+vl7CDwcy04OI3cr1bq6OUwmjfR6swKGelREpKpSxbWEIQPEd6nqd831U+CZBlCxNMYFJgBbBi5XssWYENiwzPVX64A7J5MyOEENJnXwgSAJgIQkqWSrIKBjiTM1MkSHiO9FiBQSCn6rluTXnpjK1Mk/pTaWNzc1uq40tHj+nfbfoI3hF89FE3Hrh+sVizrDqlWvKPcmtypvTVJDC3MMNmwAAzMRhEIEEEBpgZHOCMQQCBCABD3wTADICI9PfgEAQRfmLSZyKCXitYBCAiEeIsXIzDCaSC6fAMQxRMS6w1bOP5TM56eOyk1ndO/ek0/1Mh4PrTXh7at61yju/yGUrxGCUZ+ryECMrg4fDE4QmDzxzMp4E7MIP19xguEFHwUS9EyUU/5ugJJHK4AFH8MkzRmclaD+RbMrdces9+6z4RAn5y3PMTnYp/i1PxDleKBcUIDzZIPhUeILobkoE5/EeakBTNVwHVwuvhmtslQxJTNPigidsxk1DdusH+ApZtvNbQZJ/30wdnvP6xCJhz0kvtvV2Vu6UvD2YFKCVDQCgCjpIba6qqcI5ILBcih0RwCE0lpRRYBgggokCQ66iYOBzVIzxAbIjoSLwCpEbzRcAZEXNwcHY7bb3X0pY79Yr7DnwjuYfQH+Z//7V8sc+5Xvnq4GCT5EYJbDFHJI8OThwcngNaUQJhem7MFOF9IcJ54UJEdXSOgEd4nePr4QNgxVCKY1EI16AEz4Q4g+f40/q6yzffeMbLI7aLgP5t5ePcmncsq5jdBYk6mUJIsYAjRPROEPVMypoFw4MyAi5JUCpif8TIJiEi4CIgmaFUTH0QSStlvpdKGc+allgXPCwiJAVbiHj9iHsYbs2f0bu1cuYgBNz6w1daqmXne0pKi8GhElN1mjrUuImXAqvgPQm3YgXFIasrNei5WDsGLB8gJ1xfQxq+6vYCA8RIZaw7R45rOWTfmWOPHLJT9jDLor9FuihcQ0oZiIVGWog9VgpO1T/l2u+8sLM+swkA2zYV9/ZctUdCdCOh254i5qSMIaHAWcVfInKEMjlQvmPpiA6pkZ/kpkAFBdeFIdbnWsz5F/123y3h7WWzj3rqFs9zD2RGOiEp0dkjxRxellJOrJTcQwCsjjjAc+QBSnE2Og0rTZ9IimIKavZMaIGIPzUsGkEUOgexItDrqCSFoddOcobmQE4wBfcZBvcmEWnaYgsJ1Bjx85FiIUQwaO5QUsGpuAd98NZmAwDEY3cutXxf7RYcSoFZQUFBsQQjPkT0Iv1C4j3ciBmACsVCgaHCNUOgwaF4hGvX/SmAGCQooDhx3RwwAwrj3Qq+kESAW5UHKcVNgZjovTlGYngGpSQUSyip4Llyl4cXrGwEALFhZSkL0E6hekoQkyL7ytoqCAoPGCrBJCdwgvIRNWO/IDKZkSOV4KHE3EApikEWKND6lC/2VudfcuQTXwaAS494+qxq2b+cVeBAcmKdJNtrpqBIgdNQltwEAGLL+qIlfU7HEzVJKXG4YOHIHEWuLUeMzwiQYhgCwjBigLSp015fYh0K94nmRUIc7h8BpC0Qw3PlLk7FP7jU41tK8QnSV23JE0afKLRNrHcUkWllZrtSdGwAMEt9NUipkBQhINbusdPHUJxUXrGy0tS0UsbbjS3pXzA43d9dm+27ckwAQ+w2a6ct8ikCwxoFElGcUKeN61UOiGnVm/2mUj5FVijpTXPybAmrE64rJaNScgAAwvM9KClDDa5i5RP5+tqzUmAO5hGpCkO5saJSIDBMmxZds3DmPULw88zKBBiC2BVE1SQMFP7Tyk8lzK7eu94Ux4pMCAPNjUOPffa/N/4xbTfspvXPIDOt9U9CAUb6RnFk4oVmzkBOKeKEmDYJipOAnbJfahmWn5VpsC8UhlEM7DgBBGXZ4g0AcGpyGhSGmaZRyLdkL8y3pGaZtvEatFzrYAeBExOEWAl9kThDIG6x5clmcn7Kzo7zXHlIJpXPW7atYt2D+nckYalnI31fDGSP5N2Bzk46Yz0+ZGT+tGsXznx23M4tD5iWWKU1LhF1p9LWUgDwHPkFpdgwDFo2bHT6vhsePfyZ5mHp00ybnq2nEtdZCa1VAm4MzR8xC4M67LS5sKEpdUm+NX1sLm/PzOSMGdkm87CGZvvkdIN5nZ0WLwqTixxRPVa8WvmqBOX1MKlOqhP/Q9XPrCAEVCpr3986PH/Jj/9n+pa7f7zYWPbm1m94nj8pMFEEMsTqxrbsujuv+Gd66Wtb9lSK4XlyyraNtaOfv6fj/oNPG738J8c/+b1CjzPfralvgiHiHRmEwcOyxSo7Zd3V0JR5eNSU5jVnz9nLw0eMW897uaFzQ//epX73NN/lY5TkfL1TpnUbAlMcEtUUQkR2N8klWiMLQ7iprHF726jGq2ffPb3vtvNetFa83fmDatm/WvrcEGzCMEx668JfHlC46oSnJ0ifJzMAKbm5VHBufeLBJdn7r15y17ev+lzH1Sc/e07v1kqvW5WnM8MkBOYVFJtSEuSl0taDja2Za6/+41dWEBFjB+P8nx9YAvDCLT98/pXN6yoPVYvuXM9V0wBt2ZIJh1gUhFYIrMKwNuk/E5czOWtu++Qhl8++e3rfjac/l1n3QemyYsG9zvdVc4RYAqwURfKvFI/QvOR7sqVacW565/UN5y246PX0VffN7G4blbsolTVvFoSaPkwQ2UkQcS2ds64fN3no96958JDlnwT45Ljglwe78x474i/NbekTTVu8pAMxjoAOgzOpQgQkoqikfBKhN5OzLh0+ruGGc287oHrtd/+W39pRuqZUcK6QvsrpQAcMCEG9dkq8DQDSVXsrxbY+EDPge6qhXHTmrFiydfZ1p76YveLeQ0pjJ7Venc6ZV5HgEoeBEwCVzlq3TPr8iOsuuP2LpU8D+MAx50+HLWlqTp9lWbRYMeu8ZASnFgERJRwodnVJMNINxq/mP/312y9eMMO9+yevZPo6K/MqZe8CVioVs1HwjGFifb7VWvuHn71huZ6/5yDXGQwpVbpWdWd3be2/at45r1gX/OrA2uHfmjTfTpu/0erPTpt/HT626aZz5u3j/DvA6zH3kcNWNDSlLjUMbIuVrTaHwRCSZRC6avOhEIayaP3Nxa+nASCds5QQtJUIbt0OoagYhvHuZb+d2b3s9a7h0lO7RGYsETWGgZRLgnpzTSkGgHff6LUBakQQ6XU25FM3XHbn9N5PCN8nGj+997AXLFvcFV+hKCkDRH5AGMRETgNQq/pnrFzaOefn577WeNJl+zhT9tjpulTWuFSY6I8DosBSGKH9r5X9KVLyKJ2iSvryhkE9mbx98S67j57/n9fv5V/1rSeb16/susGt+aeCADttPnrot//j9U8I1yce6Vahso3270xTbKijXehARlYgRA60UVIKdq3qn9+xqqfxxu/9/fLT5+zVde/cxb9e8uqm/mrJv1m6qg1EEISSYdGbACB9tTcYmcjP0cCbYlOuKXXRPoeN++Nx50xTVx7/5LBCjzOvVpEnK8WGEORk8+Yj048fKfUzN5/zj5RT8o7r6ynsp5R6avzUYU/9cP7+H5nevvQbf51gsnVquVTxAfz3rc8es17fO+aMPVbeP/9/n5PSPxUJzxIAhFKqPjOhkxOKIX1pVErOGVs29P/ympOeH/XdK/b2L7pj+n3ZvHW2MGkDABiW2Ng8JLPqH4+tNXyPv6CZTA/TEmvyLZmz5j12+AMh8OP6umsLqmX/FKXYYKUgBHU0NKXfTQK0bWPvkZlM9o5a1f/Pvt7SPR+u2HLARwE/96xH025V3pjL5a8sl51rypXqjb+65KWMvr/vkaOklTL+Hnj1A1xh5cv61Jd+58Bz8j1JtYpzQk9n6a45Jz03eeToJnXzY19/ONdo/YAE+klg6ZlXfqHzpT9/OFz6arfI22KGadG2lmGZ79/wl0MfB4DZxzy+a/fW6j21ij9LKSalFBQDwhTrR+/c3J0EqlqpTVu+dE2uUCjB9/yhvu/v+lEI8GpoKBVKU1Z9sAbVahWS5ed6u8sNyTlC8AfMqhLkO2LvVtTF3hQnEYli8yglo1p2v9a5qfC7y2c9uRcANA5JvWsY6BaExW3teVnoq0zyfTlKBy2KAcM0trW0ZZcAwI+PfWq/Yp//P57HB8dBMYWxFnd+9ZRd6jS/aRvP+NJdDVZs2eY7lmW+9FEI+NIRU3qtlHjUl15NGOTYlvXYmKlDe5JzMnmzXwg4USwQAmrq/Hqc0RmQn4/iAqBWlftKJe+74GuP/qZrY3lPpTA8k0u9CQC1qvd56cucaVKHsMWbTsU/zKlh8obVfdf/1+GPLu/pLJ/ue2pSnBBFmMEBpFLo7q7UAfW5/Sf/891X3z/aKXs7Nzbl3rvhkaNX/+KS5+xUypRnzzko1hXnPmW/9+Zmf8T4luu3rutZxIrETmOHvn7qRfvI5HokwuR9WJTRYmpSIpwckBFFXAiLh+v6u3ie/BkA2LaxpqEltRwApM97B6Gy0TNqfON5m9cX33Uq8sJy0fluFNhEaXEkIjcGmIe/+IcVKQARFk67YhoDeC98AQBWLt08w6uq3S+ctfBBO0XFvp7K7iuXdB7c3Np467w/z+oD8PxHcUm54DcqxanI39GikYwGt5sDTkSwCdIBgQhZlbJ3+uxjn7jG99SMANOCUrZVmPD5oddk89ZFQmCb1guRauT6DVhye+f64nDsYAhTvO15cnJvV+mRzo3Fp72aukFJWn7jwqP7d/QsM00FKBtvr5IiEB+MwxtRPhCBu6hDzKSGdx1vzLaNhSvj/B6BFVuO41mzfz3TW/Tg2gWP3/t2R7ngzvddOYlDuY+SaeFzvs+ji321/QB8+HFA/OLREzsv+eYj59cq1c+DRGs6Zb0/4+Cp63YUL9x5+Wv2269uPESFMQElON2M2RODRCCR1g85pL5kWxdbh7eUUplqxU0BwFeOb1cAHrv4qEc39/dUf+47av9k3j76qNislL3vzD3tucevuOfLhY8DZt7CWRUAr0bfH9oR7YFl73R+0anJL0dlNBHfE1KpRAKCtwNUXKbS4hOnrRIBVMjmUimzWnEtAPA9Jmammx49avGwUfnT0hnj1WTqK5kIcR3/kI3ruk5f/MJqsWOQPvm48oRnRlRK7hVSqtaoQhSaeAAwlVRhLMAhcw4szCcREgdBYadDxAk6EWlApEzTyADAeUc8sLdTq00//9CFpZ6t5YNcT+4c2N/6PgKAYQhhQYorn1jQUXr45jX3HHPRBB//5pj73UUjOjeWfubU/JlKqTjBG0efMTNEldg48x1coeT9RNp8UFE/+O77Cv29FX77oZopXXlMpeTc1Ntdur1ack/0PTUsyTVKMYgIw4ePwJ577I0xoyY0l3q9+a+/tOb6nxz/9Dhm3l6iaIfj17NftC44bOGMjjXdvy8Xa99iNSDjlCz3n33QH4Z6NfUMGHsMXkonzDj5bJhv4whpcTYXAHF385Ds96Urvlqt1U6uuH0ZALCQAyCirCwRoampGe3t4zFy+EjYlgXPc/HB6tXYuKWD8w255aYl/pTKiiebWuzlBxw6vrDvrDFqewAzM/3+xnfttcs6h5f7vL2UL77ZXywdWqs6rQOZOEj18ZZ0zpx+x4snrqSzvvTAUK/GzzDzHsmKHw/8HOXXgi+RRSDU6Q4iSNMy+5TPrQDIU1V4XIVJaRhIQykF27Yxblw72seNh22nQlYkFIoFvLd8CZRUGN42EjXHgetV+33lrWTCMkH8oWmKTs/zepVSbFgi50u0ENNoQWISsdhFkDk6m26wXdfBls6NkFIOgAYAeEu6wZh+x4snrTQZFJm4mMKxA1RnX7jeDsRpawTKMsiuGJ4rh2j+EbBgsB8oWqHQ1taGyRMno7llSGJdoL9UxPvLl6JcKW5oHzf2Rdu0ZhiGOTrtp5s839vH9b19pPTBnoJQhiJmkCeELQQM04BlWUhZaRiGAQKVc9nM3/pK27hUKM/iBC/X9TsAMA1DwA9j+0gPiBBbUW49YO+gHqghpqiKQzr+rcs9aseKIJCCZZsY3z4R49t3Rsq2IcP8I4FQqVaxfOUylEpFt7ElN3f2vfv99o6Ll02pleRhnsOHQpifMwxjKDOb4fZCF21IACSIDcMoWpa51rKMVwxLPNTU1PDy5sLqtlrNGOu7ak/dwBXoL47adsy48hKXkiPgkDSNSegA6LaYqC5YX1oDaTOpkM1lsevU3TByxE4AKGxrCRSq53r4YPVKFPp7YaesRa3D878nmxSAZQCW/e6qFXcUutxxviMn+56a4HtoI4EmZgjLNByQ6hQmrbNT1gcNTekPJ+7e0n3At1q1rlj/w68svLXkV+9kZjvi6bBCDYQNEgOT8lqe62sIcZU4Noehf0BxzjVqo2GAWWLo0KHYbdruaGpsjrJNwbSAe9Z3rENXVycM03Ry+fRdV9wzvZjc9ZSrp1Q0MvAvjJZh6b/WKrX/dR11ANFgo2KS0O6pisIfAHHnlf6XEIeonUkXkrVzpP0CFXDG6FGjsevU3ZDJZOu7SsJzdHV3YeOmDhARrJS5dMiohhf/FSC3NzauK5BlCwwb2dD7gxkPLPQ8dUCy0h2Fw3HjAoLiaLJUhmRDU8QIUXFTU1FFHBMkGoiB9vbx2HWXXWFZVhxohUUEAqFac7D2ww/hez6EINi2WHTpgi91fVYI6NnsGNLnYQA25fKpRU5VbpW+Gq6JCO0IaS8wIo3W6GGNnhN9S1pFKF3HY0BFjg0iK7Hzzjtj2tRpIfAx1pOFyY6ODSgWC7q3z7VT4u+fFfAAUOipoa+rPPKfizqMcROHrLYs472kE6aH0IkQQrJ7U9vEOK8flajDdJKSElJJsJKhOCgIAUyYMAFTI8rHB4qXJvT19WHT5o3RXsKgbdm8veKzRECx4HKl7OcL3TX7R7dMrwiD3tCKO1kYMRH189Rre+2jR0ofAbXrq8kJZDEjm2/ExAmTYFkWlEzUpylWqIoVNm3ZBM/1It0ihOhobWvo/CwR0DokQ54rxxkmvQWgalhiKYiZmYkiggJCCBEBFP8lAUNdvT1ARhwEqajBASgWili2/D04jgMhkiwf+5h9/f3o6e6GELFdFkJs3W3/0RV8hoOEMkhwK5MkALBSxnohRC2CLDySqXS9LAJsoPevh54RK78IGeFiSimsXbcWNcfB1Cm7oqW5FXEDFUFJhU2bNsL3PcSd5QSluPegY0f929Ff3RAqKyweZphBhofA/STIISCDhLibJADFTLErXJ/w0M1LkavEA9BDAwJoArZu3Yz+/l6MGzseY8eMRy6bgxAC/f196OvvjcrVupOHiIbffeU7aQBVfEaDhBgpmNOmLaoA4LjeKCllRvcM6fOaQ9oyvLlSlL7kyOjHRkG3yAzOAiX1peZw7V4CjGq1imUr3sP6DeswcuQojNppLLZu2QrPcwMEKACsIJVCqezsv/gfK074xcV/X9i+a7O78o2ulG1blXN/dqDEvziqZW930xI9nct7+OJZD+3StaV4rvRlioNqNuea0wwAZlObXd2ygfuixiWu0wB1zovO40dIoUSWqI5DEAlaqVzCB6tWYO36tXFAEr4rFSCAWTU6nnnbO6+uP/Pdf27oIyY7l8ucj0RG+NOM2cf9xfrTrxYf4bv+nr6jDvRcOcn3eHxAXAUGFQ3TKAGAuOz2I6pk8JrIvLGMO0ZZxi8lw0ZomejrkUFXKWT4Crs1o09xZ5brVuG4FbheDY5XhevV4EsXzH6ADOk3VMvV/cuFyuHlUuWQQrHwo1vOW5T6VxBQ6C/P7NrUf2RvZ2nXUqH6VafmjQ8aqINTGSZvGNne2AcAgog4nbYWkwgLFeAICN1uVn89vhYFPVF1WYFJ1SWM4jZYhHP1PI5dad0aGyJeKh9Ozf3Oqve7znjwpmXGpwH+4m/8eWqp4MxRSjXXwYLA3JMArJR486L5M6tAmBJL5VIvk8Am7cNHppDiX3bEObxEgzO0TkjohSi7zJGCTHZwArp7VAxot02mLQhKcrbQV5n73BNv/tec057M7wjwl59YKc4/4g9f3LapeKdb8/eM1uRkVhswhCinM9azSJ7oz79ZYv713sV3VErO6eEJkZwQmD29IIehcv2I1OV2egPAsW+hzaa2LkrnE/RpB5hhYZCbztiLGvLpu5uaM69O2n34tlNm7+sRET9z3xJz8Qvr892d5cnFQu3YSsk92fPkSNTpLcTNngBSaeup8VOHHn/1vUcV43MD+MHX7t+zb1v5EenJMcGvQWJqaICT1Z1kcJOAtD5XmKRtAjHJ2lxYehnQkhk+gpgDDSFcwzTWGgatBqFLKuUahtGiJLcrX03wfdmslELi4PFb6IkapuhrbM2ceMezJz9VT7hwnDnj3jOLfbVbWFEuosqgX0ltJ0fIdYYyzrxEc2Nx0CKwvbrjQFTqPer6fvXW0W+HeNCzcXYmjkJJCD+XT127/9d3m3v6JXtFTlddEWLEuPy9qYx1pTCpxFEcUN+3r3vy42pyHCDp0DG+qo8bUz/KMiHRtBT2+Cf4pQ4jsa4ZkKNEJOCxTko8G0T4DBB5qax128j21vlJ4AchDgBu/NGz1qqlm75dKbpXSl+N1wokSoBorEfeTyJwqlu4Xk8kZbEehNilHpR70FtpLkrwTNzWvx1tlPDShCE6M7nUTWMntv36p/ccXsbg2YPH+hX9NO/CJ6ZVi87Z1Yr7denJMawgdOHkIwfXAxQVjwbl2JPAJWoOWkEOBIRjkdB6IZlbGMA3IEFsmmKLaZlP5RpTC/Y4aOLiM3+873a9yo+tvNx21QvGqrc2tZeLzhedmtxDSYyH4kbflUgIWjLBwHEmSYQUIIMAKMVyILFCMSLNT/EvUZiYwTTIksRZqsAaiVC+SQiDWBhUhOB1lm2+k2/MvDp6/NBVl/xypoePGZ+49MTM9ODtS8yVb22wVr+/FYYZVNaFAXiuH/QT+SpINRFgmiYYhNZhGbIsg7Z0FFTyh1G6oGKYFP1gg0jAMg0YFqFa9iAMI1RDcZ+/MIOWHt+XMIUJENA0JEvNrTme9B8jvRPP28s3jU/XXvv/evwf8+R93H8D+6YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAG3RFWHRpY2M6Y29weXJpZ2h0AFB1YmxpYyBEb21haW62kTFbAAAAInRFWHRpY2M6ZGVzY3JpcHRpb24AR0lNUCBidWlsdC1pbiBzUkdCTGdBEwAAABV0RVh0aWNjOm1hbnVmYWN0dXJlcgBHSU1QTJ6QygAAAA50RVh0aWNjOm1vZGVsAHNSR0JbYElDAAAAAElFTkSuQmCC';
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Cross-platform browser opener for HTML report files.
3
+ */
4
+ import { execFile } from 'child_process';
5
+ /** Open a file path in the default system browser. */
6
+ export function openInBrowser(filePath) {
7
+ const url = `file://${filePath}`;
8
+ switch (process.platform) {
9
+ case 'darwin':
10
+ execFile('open', [url]);
11
+ break;
12
+ case 'win32':
13
+ execFile('rundll32.exe', ['url.dll,FileProtocolHandler', url]);
14
+ break;
15
+ default:
16
+ execFile('xdg-open', [url]);
17
+ break;
18
+ }
19
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Everything an HTML session report needs, from one read of the session.
3
+ *
4
+ * `sidekick report`, the CLI dashboard's report action, and the extension used
5
+ * to replay a session through a watcher for metrics and then parse the file a
6
+ * second time for the transcript. This reads the provider's canonical events
7
+ * once and derives both.
8
+ *
9
+ * @module report/sessionReportInputs
10
+ */
11
+ import { EventAggregator } from '../aggregation/EventAggregator';
12
+ import { providerContextSizeFn } from '../sessionStats';
13
+ import { scanSessionSubagents } from '../sessionTokenTotals';
14
+ import { parseTranscriptFromEvents } from './transcriptParser';
15
+ /** Read a session once and build the aggregator metrics and report transcript from it. */
16
+ export function readSessionReportInputs(provider, sessionPath) {
17
+ const reader = provider.createReader(sessionPath);
18
+ const events = reader.readAll();
19
+ reader.flush();
20
+ const aggregator = new EventAggregator({
21
+ providerId: provider.id,
22
+ computeContextSize: providerContextSizeFn(provider),
23
+ });
24
+ for (const event of events)
25
+ aggregator.processEvent(event);
26
+ return {
27
+ sessionPath,
28
+ events,
29
+ metrics: aggregator.getMetrics(),
30
+ transcript: parseTranscriptFromEvents(events),
31
+ subagents: scanSessionSubagents(provider, sessionPath),
32
+ };
33
+ }
@@ -0,0 +1,83 @@
1
+ /** Report compatibility adapters over the canonical transcript projection. */
2
+ import * as fs from 'node:fs';
3
+ import { JsonlParser } from '../parsers/jsonl';
4
+ import { extractSessionEvents } from '../schemas/sessionEvent';
5
+ import { projectSessionTranscript } from '../transcript';
6
+ /** Parse a Claude Code JSONL session through the canonical provider reader. */
7
+ export function parseTranscript(sessionPath) {
8
+ try {
9
+ const events = [];
10
+ const parser = new JsonlParser({
11
+ onEvent: (raw) => events.push(...extractSessionEvents(raw)),
12
+ });
13
+ parser.processChunk(fs.readFileSync(sessionPath, 'utf8'));
14
+ parser.flush();
15
+ return parseTranscriptFromEvents(events);
16
+ }
17
+ catch {
18
+ return [];
19
+ }
20
+ }
21
+ /** Project canonical provider events into the legacy report transcript shape. */
22
+ export function parseTranscriptFromEvents(events) {
23
+ return projectSessionTranscript(events, { fidelity: 'full' }).messages.map((message) => ({
24
+ type: message.role === 'tool' ? 'system' : message.role,
25
+ timestamp: message.timestamp,
26
+ sourceLabel: message.sourceLabel,
27
+ model: message.model,
28
+ usage: message.usage
29
+ ? {
30
+ input_tokens: message.usage.uncachedInputTokens,
31
+ output_tokens: message.usage.outputTokens,
32
+ cache_creation_input_tokens: message.usage.cacheWriteTokens || undefined,
33
+ cache_read_input_tokens: message.usage.cacheReadTokens || undefined,
34
+ }
35
+ : undefined,
36
+ content: message.content.flatMap(toReportBlock),
37
+ }));
38
+ }
39
+ function toReportBlock(block) {
40
+ switch (block.type) {
41
+ case 'text':
42
+ return block.text ? [{ type: 'text', text: block.text }] : [];
43
+ case 'thinking':
44
+ return block.text ? [{ type: 'thinking', text: block.text }] : [];
45
+ case 'tool_use':
46
+ return [
47
+ {
48
+ type: 'tool_use',
49
+ toolName: block.toolName ?? 'unknown',
50
+ toolInput: block.input && typeof block.input === 'object'
51
+ ? block.input
52
+ : {},
53
+ toolUseId: block.toolUseId,
54
+ },
55
+ ];
56
+ case 'tool_result':
57
+ return [
58
+ {
59
+ type: 'tool_result',
60
+ toolUseId: block.toolUseId,
61
+ output: reportToolOutput(block.output),
62
+ isError: block.isError,
63
+ },
64
+ ];
65
+ case 'image':
66
+ return [{ type: 'image', text: block.text ?? '[Image content]' }];
67
+ case 'unknown':
68
+ return [];
69
+ }
70
+ }
71
+ function reportToolOutput(output) {
72
+ if (typeof output === 'string')
73
+ return output;
74
+ if (Array.isArray(output)) {
75
+ return output
76
+ .flatMap((part) => part && typeof part === 'object' && part.type === 'text'
77
+ ? [String(part.text ?? '')]
78
+ : [])
79
+ .filter(Boolean)
80
+ .join('\n');
81
+ }
82
+ return JSON.stringify(output ?? '');
83
+ }
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Report-specific types for HTML session report generation.
3
+ */
4
+ export {};
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Zod schemas for runtime validation of account management payloads.
3
+ *
4
+ * These schemas mirror the TypeScript interfaces in `accounts.ts`,
5
+ * `accountRegistry.ts`, and `accountManager.ts` (keep in sync when those
6
+ * change). They let consumers validate account-management IPC payloads
7
+ * without hand-mirroring the interfaces.
8
+ *
9
+ * @module schemas/accountManager
10
+ */
11
+ import { z } from 'zod';
12
+ import { ACCOUNT_PROVIDER_IDS } from '../providerIds';
13
+ // ── AccountProviderId ──
14
+ export const accountProviderIdSchema = z.enum(ACCOUNT_PROVIDER_IDS);
15
+ // ── AccountManagerResult ──
16
+ export const accountManagerResultSchema = z.object({
17
+ success: z.boolean(),
18
+ error: z.string().optional(),
19
+ warning: z.string().optional(),
20
+ needsLogin: z.boolean().optional(),
21
+ profileId: z.string().optional(),
22
+ codexHome: z.string().optional(),
23
+ });
24
+ // ── BeginAccountLoginResult ──
25
+ const beginAccountLoginSuccessSchema = z.object({
26
+ success: z.literal(true),
27
+ loginId: z.string(),
28
+ alreadyComplete: z.boolean().optional(),
29
+ command: z.string().optional(),
30
+ args: z.array(z.string()).optional(),
31
+ env: z.record(z.string(), z.string()).optional(),
32
+ envUnset: z.array(z.string()).optional(),
33
+ configDir: z.string().optional(),
34
+ existingAccountId: z.string().optional(),
35
+ });
36
+ const beginAccountLoginFailureSchema = z.object({
37
+ success: z.literal(false),
38
+ error: z.string(),
39
+ });
40
+ export const beginAccountLoginResultSchema = z.union([
41
+ beginAccountLoginSuccessSchema,
42
+ beginAccountLoginFailureSchema,
43
+ ]);
44
+ // ── AccountLoginStatus ──
45
+ export const accountLoginStatusSchema = z.object({
46
+ state: z.enum(['pending', 'authenticated', 'failed']),
47
+ email: z.string().optional(),
48
+ error: z.string().optional(),
49
+ });
50
+ // ── AccountEntry ──
51
+ export const accountEntrySchema = z.object({
52
+ uuid: z.string(),
53
+ email: z.string(),
54
+ label: z.string().optional(),
55
+ addedAt: z.string(),
56
+ });
57
+ // ── SavedAccountProfile ──
58
+ const accountIdentityMetadataSchema = z.object({
59
+ email: z.string().optional(),
60
+ workspaceId: z.string().optional(),
61
+ planType: z.string().optional(),
62
+ authMode: z.enum(['chatgpt', 'api-key', 'unknown']).optional(),
63
+ origin: z.enum(['login', 'manual', 'live-sync', 'migration']).optional(),
64
+ });
65
+ export const savedAccountProfileSchema = z.object({
66
+ id: z.string(),
67
+ providerId: accountProviderIdSchema,
68
+ addedAt: z.string(),
69
+ label: z.string().optional(),
70
+ email: z.string().optional(),
71
+ providerAccountId: z.string().optional(),
72
+ metadata: accountIdentityMetadataSchema.optional(),
73
+ });
74
+ // ── ListAllAccountsResult ──
75
+ export const listAllAccountsResultSchema = z.object({
76
+ claude: z.array(accountEntrySchema),
77
+ codex: z.array(savedAccountProfileSchema),
78
+ activeByProvider: z.object({
79
+ 'claude-code': z.string().nullable(),
80
+ codex: z.string().nullable(),
81
+ }),
82
+ });
83
+ // ── Account health ──
84
+ export const accountHealthStateSchema = z.enum([
85
+ 'fresh',
86
+ 'expiring',
87
+ 'expired',
88
+ 'unknown',
89
+ 'missing',
90
+ ]);
91
+ export const accountHealthSourceSchema = z.enum([
92
+ 'live-sync',
93
+ 'login',
94
+ 'switch',
95
+ 'keepalive',
96
+ 'migration',
97
+ ]);
98
+ export const accountHealthSidecarSchema = z.object({
99
+ version: z.literal(1),
100
+ capturedAt: z.number(),
101
+ accessExpiresAt: z.number().optional(),
102
+ refreshExpiresAt: z.number().optional(),
103
+ refreshExpiryEstimated: z.boolean().optional(),
104
+ lastRefreshAt: z.number().optional(),
105
+ hasRefreshToken: z.boolean().optional(),
106
+ authMode: z.enum(['chatgpt', 'api-key', 'oauth']).optional(),
107
+ refreshFp: z.string().optional(),
108
+ source: accountHealthSourceSchema,
109
+ });
110
+ export const accountHealthSchema = z.object({
111
+ providerId: accountProviderIdSchema,
112
+ accountId: z.string(),
113
+ state: accountHealthStateSchema,
114
+ accessExpiresAt: z.number().optional(),
115
+ refreshExpiresAt: z.number().optional(),
116
+ refreshExpiryEstimated: z.boolean().optional(),
117
+ lastRefreshAt: z.number().optional(),
118
+ checkedAt: z.number(),
119
+ isLive: z.boolean(),
120
+ reason: z.string().optional(),
121
+ });
122
+ export const accountViewSchema = z.object({
123
+ id: z.string(),
124
+ providerId: accountProviderIdSchema,
125
+ label: z.string().optional(),
126
+ email: z.string().optional(),
127
+ planType: z.string().optional(),
128
+ isActive: z.boolean(),
129
+ health: accountHealthSchema,
130
+ source: z.enum(['registered', 'learned']),
131
+ addedAt: z.string(),
132
+ });
133
+ // ── Running consumers / switch result ──
134
+ export const runningProcessSchema = z.object({
135
+ pid: z.number(),
136
+ name: z.string(),
137
+ command: z.string(),
138
+ });
139
+ export const accountConsumerKindSchema = z.enum([
140
+ 'claude-cli',
141
+ 'claude-desktop',
142
+ 'codex-cli',
143
+ 'codex-app',
144
+ 'vscode-extension-host',
145
+ ]);
146
+ export const runningAccountConsumerSchema = z.object({
147
+ kind: accountConsumerKindSchema,
148
+ pids: z.array(z.number()),
149
+ switched: z.boolean(),
150
+ reachability: z.string(),
151
+ });
152
+ export const switchAccountResultSchema = accountManagerResultSchema.extend({
153
+ provider: accountProviderIdSchema,
154
+ accountId: z.string(),
155
+ previousAccountId: z.string().nullable(),
156
+ verified: z.boolean(),
157
+ verification: z.enum(['store', 'cli', 'none', 'failed']),
158
+ health: accountHealthSchema.optional(),
159
+ warnings: z.array(z.string()),
160
+ hints: z.array(z.string()),
161
+ runningConsumers: z.array(runningAccountConsumerSchema),
162
+ undoToken: z.string().optional(),
163
+ alreadyActive: z.boolean().optional(),
164
+ email: z.string().optional(),
165
+ });
166
+ export const lastSwitchRecordSchema = z.object({
167
+ token: z.string(),
168
+ provider: accountProviderIdSchema,
169
+ from: z.string().nullable(),
170
+ to: z.string(),
171
+ at: z.string(),
172
+ });
173
+ // ── Sync report ──
174
+ export const providerSyncReportSchema = z.object({
175
+ registered: z.object({ id: z.string(), email: z.string().optional() }).optional(),
176
+ folded: z.string().optional(),
177
+ repointed: z.string().optional(),
178
+ merged: z.array(z.string()).optional(),
179
+ demoted: z.string().optional(),
180
+ repaired: z.string().optional(),
181
+ journal: z.enum(['finished', 'rolled-back', 'cleared']).optional(),
182
+ skipped: z.string().optional(),
183
+ warnings: z.array(z.string()),
184
+ });
185
+ export const syncReportSchema = z.object({
186
+ claude: providerSyncReportSchema,
187
+ codex: providerSyncReportSchema,
188
+ ranAt: z.number(),
189
+ reason: z.enum(['startup', 'watch', 'poll', 'pre-switch', 'manual']),
190
+ });
191
+ // ── Launch env ──
192
+ export const accountLaunchEnvSchema = z.object({
193
+ provider: accountProviderIdSchema,
194
+ accountId: z.string(),
195
+ label: z.string().optional(),
196
+ email: z.string().optional(),
197
+ home: z.string(),
198
+ env: z.record(z.string(), z.string()),
199
+ envUnset: z.array(z.string()),
200
+ command: z.enum(['claude', 'codex']),
201
+ health: accountHealthSchema,
202
+ warnings: z.array(z.string()),
203
+ error: z.string().optional(),
204
+ });
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Zod schemas for runtime validation of active account status.
3
+ *
4
+ * These schemas mirror the TypeScript interfaces in `accountStatus.ts`
5
+ * (keep in sync when those change). They let consumers validate account
6
+ * status payloads at process/IPC boundaries without hand-mirroring the
7
+ * interfaces.
8
+ *
9
+ * @module schemas/accountStatus
10
+ */
11
+ import { z } from 'zod';
12
+ // ── ActiveProviderAccountStatus ──
13
+ export const activeProviderAccountStatusSchema = z.object({
14
+ present: z.boolean(),
15
+ accountId: z.string().optional(),
16
+ email: z.string().optional(),
17
+ label: z.string().optional(),
18
+ });
19
+ // ── ActiveAccountStatus ──
20
+ export const activeAccountStatusSchema = z.object({
21
+ ok: z.boolean(),
22
+ claude: activeProviderAccountStatusSchema,
23
+ codex: activeProviderAccountStatusSchema,
24
+ error: z.string().optional(),
25
+ });
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Zod schemas for browser-safe assistant turn projections.
3
+ *
4
+ * These schemas mirror `turns/assistantTurn.ts` and validate the compact
5
+ * process/answer shape used at UI and IPC boundaries.
6
+ */
7
+ import { z } from 'zod';
8
+ export const assistantTurnEventTypeSchema = z.enum([
9
+ 'text',
10
+ 'thinking',
11
+ 'tool_use',
12
+ 'tool_result',
13
+ 'status',
14
+ 'error',
15
+ 'delta',
16
+ 'progress',
17
+ ]);
18
+ export const assistantTurnEventSchema = z.object({
19
+ eventType: assistantTurnEventTypeSchema,
20
+ content: z.string(),
21
+ deltaKind: z.enum(['text', 'thinking', 'tool_input']).optional(),
22
+ toolName: z.string().optional(),
23
+ toolInput: z.unknown().optional(),
24
+ toolUseId: z.string().optional(),
25
+ });
26
+ export const assistantTurnToolRefSchema = z.object({
27
+ toolName: z.string(),
28
+ toolInput: z.string().optional(),
29
+ toolUseId: z.string().optional(),
30
+ });
31
+ export const assistantTurnNarrationStepSchema = z.object({
32
+ kind: z.literal('narration'),
33
+ text: z.string(),
34
+ });
35
+ export const assistantTurnToolGroupStepSchema = z.object({
36
+ kind: z.literal('toolGroup'),
37
+ tools: z.array(assistantTurnToolRefSchema),
38
+ });
39
+ export const assistantTurnProcessStepSchema = z.discriminatedUnion('kind', [
40
+ assistantTurnNarrationStepSchema,
41
+ assistantTurnToolGroupStepSchema,
42
+ ]);
43
+ export const assistantTurnReasoningTimelineItemSchema = z.object({
44
+ kind: z.literal('reasoning'),
45
+ text: z.string(),
46
+ });
47
+ export const assistantTurnTimelineItemSchema = z.discriminatedUnion('kind', [
48
+ assistantTurnReasoningTimelineItemSchema,
49
+ assistantTurnNarrationStepSchema,
50
+ assistantTurnToolGroupStepSchema,
51
+ ]);
52
+ export const assistantTurnProcessSchema = z.object({
53
+ steps: z.array(assistantTurnProcessStepSchema),
54
+ });
55
+ export const assistantTurnSubagentStatusSchema = z.enum([
56
+ 'running',
57
+ 'completed',
58
+ 'failed',
59
+ ]);
60
+ export const assistantTurnSubagentSchema = z.object({
61
+ id: z.string(),
62
+ label: z.string(),
63
+ agentType: z.string().optional(),
64
+ status: assistantTurnSubagentStatusSchema,
65
+ });
66
+ export const assistantTurnProjectionSchema = z.object({
67
+ schemaVersion: z.literal(2),
68
+ answer: z.string(),
69
+ reasoning: z.string(),
70
+ reasoningBlocks: z.array(z.string()),
71
+ process: assistantTurnProcessSchema,
72
+ timeline: z.array(assistantTurnTimelineItemSchema),
73
+ subagents: z.array(assistantTurnSubagentSchema),
74
+ });
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Schemas entry (`sidekick-shared/schemas`).
3
+ *
4
+ * Pure zod runtime validation for the data shapes that cross process/IPC
5
+ * boundaries: session events, quota state, quota history, account status,
6
+ * and assistant turn projections. No node:fs / node:path — safe to bundle
7
+ * for browser runtimes, and lean enough that importing it does not drag in
8
+ * the rest of the library.
9
+ *
10
+ * The mirrored TypeScript interfaces are re-exported as types so this
11
+ * subpath is self-sufficient for boundary-validation modules.
12
+ */
13
+ export { ACCOUNT_PROVIDER_IDS, QUOTA_PROVIDER_IDS, RUNTIME_QUOTA_PROVIDER_IDS, SESSION_PROVIDER_IDS, } from '../providerIds';
14
+ export { messageUsageSchema, sessionMessageSchema, sessionEventSchema, permissionModeSchema, extractSessionEvents, userSessionEventSchema, assistantSessionEventSchema, summarySessionEventSchema, systemSessionEventSchema, toolUseSessionEventSchema, toolResultSessionEventSchema, } from './sessionEvent';
15
+ export { normalizedUsageSchema, normalizedUsageCostSchema } from './usageNormalization';
16
+ export { tokenEstimateSchema } from './tokenEstimation';
17
+ export { providerAuthenticationEvidenceSchema, providerFailureEvidenceSchema, providerRetryAfterSchema, providerFailureDiagnosisSchema, } from './providerFailure';
18
+ export { transcriptSourceProvenanceSchema, canonicalTranscriptBlockSchema, canonicalToolCallSchema, canonicalTranscriptMessageSchema, canonicalSessionTranscriptSchema, } from './transcript';
19
+ export { observationProvenanceV1Schema, observedAgentSessionV1Schema, observedValueV1Schema, pendingUserRequestV1Schema, providerCapabilitiesV1Schema, providerSessionAdapterV1Schema, sessionEvidenceRefV1Schema, } from './observedSessionV1';
20
+ export { quotaWindowSchema, quotaStateSchema, quotaFailureKindSchema, quotaProviderIdSchema, quotaSourceSchema, codexResetCreditSchema, codexResetCreditsSnapshotSchema, peakHoursStateSchema, quotaFailureDescriptorSchema, runtimeQuotaProviderSchema, providerQuotaStateSchema, claudeProviderQuotaStateSchema, codexProviderQuotaStateSchema, zaiProviderQuotaStateSchema, providerQuotaMapSchema, } from './quota';
21
+ export { quotaHistoryRuntimeProviderSchema, quotaHistorySampleSchema, quotaHistoryDailyBucketSchema, } from './quotaHistory';
22
+ export { activeProviderAccountStatusSchema, activeAccountStatusSchema } from './accountStatus';
23
+ export { accountProviderIdSchema, accountManagerResultSchema, beginAccountLoginResultSchema, accountLoginStatusSchema, accountEntrySchema, savedAccountProfileSchema, listAllAccountsResultSchema, accountHealthStateSchema, accountHealthSourceSchema, accountHealthSidecarSchema, accountHealthSchema, accountViewSchema, runningProcessSchema, accountConsumerKindSchema, runningAccountConsumerSchema, switchAccountResultSchema, lastSwitchRecordSchema, providerSyncReportSchema, syncReportSchema, accountLaunchEnvSchema, } from './accountManager';
24
+ export { assistantTurnEventSchema, assistantTurnEventTypeSchema, assistantTurnNarrationStepSchema, assistantTurnProcessSchema, assistantTurnProcessStepSchema, assistantTurnProjectionSchema, assistantTurnReasoningTimelineItemSchema, assistantTurnSubagentSchema, assistantTurnSubagentStatusSchema, assistantTurnTimelineItemSchema, assistantTurnToolGroupStepSchema, assistantTurnToolRefSchema, } from './assistantTurn';
25
+ export { sidekickStateFileSchema, stateFileAccountSchema, stateFileBillingBlockSchema, stateFileContextSchema, stateFileQuotaSchema, stateFileQuotaWindowSchema, stateFileSessionSchema, stateFileWriterSchema, } from './stateFile';
@@ -0,0 +1,77 @@
1
+ import { z } from 'zod';
2
+ import { SESSION_PROVIDER_IDS } from '../providerIds';
3
+ export const observationProvenanceV1Schema = z.enum(['reported', 'estimated', 'inferred']);
4
+ export const sessionEvidenceRefV1Schema = z.object({
5
+ schemaVersion: z.literal(1),
6
+ provider: z.enum(SESSION_PROVIDER_IDS),
7
+ sessionId: z.string().min(1),
8
+ sourcePath: z.string().optional(),
9
+ eventIndex: z.number().int().nonnegative().optional(),
10
+ eventId: z.string().optional(),
11
+ timestamp: z.string().optional(),
12
+ });
13
+ export const observedValueV1Schema = (value) => z.object({
14
+ value,
15
+ provenance: observationProvenanceV1Schema,
16
+ confidence: z.number().min(0).max(1),
17
+ evidence: z.array(sessionEvidenceRefV1Schema),
18
+ });
19
+ export const pendingUserRequestV1Schema = z.object({
20
+ schemaVersion: z.literal(1),
21
+ id: z.string().min(1),
22
+ provider: z.enum(SESSION_PROVIDER_IDS),
23
+ sessionId: z.string().min(1),
24
+ kind: observedValueV1Schema(z.enum(['prompt_response', 'tool_approval', 'question'])),
25
+ requestedAt: observedValueV1Schema(z.string()),
26
+ prompt: observedValueV1Schema(z.string().nullable()),
27
+ });
28
+ export const observedAgentSessionV1Schema = z.object({
29
+ schemaVersion: z.literal(1),
30
+ identity: z.object({
31
+ provider: z.enum(SESSION_PROVIDER_IDS),
32
+ sessionId: z.string().min(1),
33
+ sourcePath: z.string(),
34
+ }),
35
+ cwd: observedValueV1Schema(z.string()),
36
+ model: observedValueV1Schema(z.string().nullable()),
37
+ activity: observedValueV1Schema(z.enum(['active', 'idle', 'ended', 'unknown'])),
38
+ usage: z.object({
39
+ inputTokens: observedValueV1Schema(z.number().nonnegative()),
40
+ outputTokens: observedValueV1Schema(z.number().nonnegative()),
41
+ cacheReadTokens: observedValueV1Schema(z.number().nonnegative()),
42
+ cacheWriteTokens: observedValueV1Schema(z.number().nonnegative()),
43
+ normalized: observedValueV1Schema(z.object({
44
+ uncachedInputTokens: z.number().finite().nonnegative(),
45
+ cacheReadTokens: z.number().finite().nonnegative(),
46
+ cacheWriteTokens: z.number().finite().nonnegative(),
47
+ outputTokens: z.number().finite().nonnegative(),
48
+ reasoningTokens: z.number().finite().nonnegative(),
49
+ cacheInclusiveInputTokens: z.number().finite().nonnegative(),
50
+ billableOutputTokens: z.number().finite().nonnegative(),
51
+ totalTokens: z.number().finite().nonnegative(),
52
+ })).optional(),
53
+ costUsd: observedValueV1Schema(z.number().nonnegative().nullable()),
54
+ }),
55
+ pendingUserRequest: pendingUserRequestV1Schema.nullable(),
56
+ contentObservedAt: z.string().optional(),
57
+ observedAt: z.string(),
58
+ });
59
+ export const providerCapabilitiesV1Schema = z.object({
60
+ schemaVersion: z.literal(1),
61
+ provider: z.enum(SESSION_PROVIDER_IDS),
62
+ resume: observedValueV1Schema(z.boolean()),
63
+ forkLineage: observedValueV1Schema(z.boolean()),
64
+ quotaSource: observedValueV1Schema(z.enum(['api', 'session', 'mixed', 'none'])),
65
+ assetExtraction: observedValueV1Schema(z.boolean()),
66
+ });
67
+ export const providerSessionAdapterV1Schema = z.custom((value) => {
68
+ if (!value || typeof value !== 'object')
69
+ return false;
70
+ const adapter = value;
71
+ return (adapter.schemaVersion === 1 &&
72
+ typeof adapter.discover === 'function' &&
73
+ typeof adapter.read === 'function' &&
74
+ typeof adapter.watch === 'function' &&
75
+ typeof adapter.dispose === 'function' &&
76
+ providerCapabilitiesV1Schema.safeParse(adapter.capabilities).success);
77
+ }, { message: 'Invalid ProviderSessionAdapterV1 contract' });
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Zod schema for runtime validation of provider-failure diagnoses.
3
+ *
4
+ * The enums are built from the same `as const` arrays that define the
5
+ * TypeScript unions in `providerFailure.ts`, so a new failure code or recovery
6
+ * action reaches the schema without a second edit.
7
+ *
8
+ * @module schemas/providerFailure
9
+ */
10
+ import { z } from 'zod';
11
+ import { ACCOUNT_PROVIDER_IDS } from '../providerIds';
12
+ import { PROVIDER_AUTHENTICATION_SOURCES, PROVIDER_AUTHENTICATION_STATES, PROVIDER_CREDENTIAL_KINDS, PROVIDER_FAILURE_CODES, PROVIDER_FAILURE_EVIDENCE_SOURCES, PROVIDER_RECOVERY_ACTIONS, } from '../providerFailure';
13
+ export const providerAuthenticationEvidenceSchema = z.object({
14
+ credentialKind: z.enum(PROVIDER_CREDENTIAL_KINDS),
15
+ state: z.enum(PROVIDER_AUTHENTICATION_STATES),
16
+ checkedAt: z.string(),
17
+ source: z.enum(PROVIDER_AUTHENTICATION_SOURCES),
18
+ });
19
+ export const providerFailureEvidenceSchema = z.object({
20
+ source: z.enum(PROVIDER_FAILURE_EVIDENCE_SOURCES),
21
+ rule: z.enum(PROVIDER_FAILURE_CODES),
22
+ checkedAt: z.string().optional(),
23
+ });
24
+ export const providerRetryAfterSchema = z.discriminatedUnion('kind', [
25
+ z.object({ kind: z.literal('delay'), delayMs: z.number() }),
26
+ z.object({ kind: z.literal('date'), at: z.string() }),
27
+ ]);
28
+ export const providerFailureDiagnosisSchema = z.object({
29
+ provider: z.enum(ACCOUNT_PROVIDER_IDS),
30
+ credentialKind: z.enum(PROVIDER_CREDENTIAL_KINDS),
31
+ diagnosis: z.enum(PROVIDER_FAILURE_CODES),
32
+ recovery: z.enum(PROVIDER_RECOVERY_ACTIONS),
33
+ evidence: z.array(providerFailureEvidenceSchema),
34
+ authentication: providerAuthenticationEvidenceSchema.optional(),
35
+ httpStatus: z.number().optional(),
36
+ retryAfter: providerRetryAfterSchema.optional(),
37
+ });