hammoc 1.4.0 → 1.6.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 (353) hide show
  1. package/README.md +428 -405
  2. package/bin/hammoc.js +0 -6
  3. package/package.json +100 -94
  4. package/packages/client/dist/assets/agentExampleHighlight-ltj9ce0U.js +1 -0
  5. package/packages/client/dist/assets/commandTokenHighlight-ji_ViMb4.js +1 -0
  6. package/packages/client/dist/assets/index-B-DiRGuz.js +2 -0
  7. package/packages/client/dist/assets/index-B09doO8H.js +139 -0
  8. package/packages/client/dist/assets/index-BT4RIi0U.js +1523 -0
  9. package/packages/client/dist/assets/index-DyNJ5jEW.css +32 -0
  10. package/packages/client/dist/assets/snippetTokenHighlight-CP3v4o2g.js +1 -0
  11. package/packages/client/dist/index.html +2 -2
  12. package/packages/client/dist/sw.js +1 -1
  13. package/packages/server/dist/app.d.ts.map +1 -1
  14. package/packages/server/dist/app.js +13 -21
  15. package/packages/server/dist/app.js.map +1 -1
  16. package/packages/server/dist/controllers/bmadCoreConfigController.d.ts +41 -0
  17. package/packages/server/dist/controllers/bmadCoreConfigController.d.ts.map +1 -0
  18. package/packages/server/dist/controllers/bmadCoreConfigController.js +172 -0
  19. package/packages/server/dist/controllers/bmadCoreConfigController.js.map +1 -0
  20. package/packages/server/dist/controllers/claudeMdController.d.ts +26 -0
  21. package/packages/server/dist/controllers/claudeMdController.d.ts.map +1 -0
  22. package/packages/server/dist/controllers/claudeMdController.js +158 -0
  23. package/packages/server/dist/controllers/claudeMdController.js.map +1 -0
  24. package/packages/server/dist/controllers/contextBuilderController.d.ts +43 -0
  25. package/packages/server/dist/controllers/contextBuilderController.d.ts.map +1 -0
  26. package/packages/server/dist/controllers/contextBuilderController.js +159 -0
  27. package/packages/server/dist/controllers/contextBuilderController.js.map +1 -0
  28. package/packages/server/dist/controllers/harnessAgentController.d.ts +35 -0
  29. package/packages/server/dist/controllers/harnessAgentController.d.ts.map +1 -0
  30. package/packages/server/dist/controllers/harnessAgentController.js +372 -0
  31. package/packages/server/dist/controllers/harnessAgentController.js.map +1 -0
  32. package/packages/server/dist/controllers/harnessBundleController.d.ts +37 -0
  33. package/packages/server/dist/controllers/harnessBundleController.d.ts.map +1 -0
  34. package/packages/server/dist/controllers/harnessBundleController.js +312 -0
  35. package/packages/server/dist/controllers/harnessBundleController.js.map +1 -0
  36. package/packages/server/dist/controllers/harnessCommandController.d.ts +35 -0
  37. package/packages/server/dist/controllers/harnessCommandController.d.ts.map +1 -0
  38. package/packages/server/dist/controllers/harnessCommandController.js +415 -0
  39. package/packages/server/dist/controllers/harnessCommandController.js.map +1 -0
  40. package/packages/server/dist/controllers/harnessController.d.ts +21 -0
  41. package/packages/server/dist/controllers/harnessController.d.ts.map +1 -0
  42. package/packages/server/dist/controllers/harnessController.js +176 -0
  43. package/packages/server/dist/controllers/harnessController.js.map +1 -0
  44. package/packages/server/dist/controllers/harnessHookController.d.ts +32 -0
  45. package/packages/server/dist/controllers/harnessHookController.d.ts.map +1 -0
  46. package/packages/server/dist/controllers/harnessHookController.js +406 -0
  47. package/packages/server/dist/controllers/harnessHookController.js.map +1 -0
  48. package/packages/server/dist/controllers/harnessLintController.d.ts +18 -0
  49. package/packages/server/dist/controllers/harnessLintController.d.ts.map +1 -0
  50. package/packages/server/dist/controllers/harnessLintController.js +72 -0
  51. package/packages/server/dist/controllers/harnessLintController.js.map +1 -0
  52. package/packages/server/dist/controllers/harnessMcpController.d.ts +28 -0
  53. package/packages/server/dist/controllers/harnessMcpController.d.ts.map +1 -0
  54. package/packages/server/dist/controllers/harnessMcpController.js +371 -0
  55. package/packages/server/dist/controllers/harnessMcpController.js.map +1 -0
  56. package/packages/server/dist/controllers/harnessPluginController.d.ts +17 -0
  57. package/packages/server/dist/controllers/harnessPluginController.d.ts.map +1 -0
  58. package/packages/server/dist/controllers/harnessPluginController.js +115 -0
  59. package/packages/server/dist/controllers/harnessPluginController.js.map +1 -0
  60. package/packages/server/dist/controllers/harnessShareScopeController.d.ts +24 -0
  61. package/packages/server/dist/controllers/harnessShareScopeController.d.ts.map +1 -0
  62. package/packages/server/dist/controllers/harnessShareScopeController.js +120 -0
  63. package/packages/server/dist/controllers/harnessShareScopeController.js.map +1 -0
  64. package/packages/server/dist/controllers/harnessSkillController.d.ts +32 -0
  65. package/packages/server/dist/controllers/harnessSkillController.d.ts.map +1 -0
  66. package/packages/server/dist/controllers/harnessSkillController.js +453 -0
  67. package/packages/server/dist/controllers/harnessSkillController.js.map +1 -0
  68. package/packages/server/dist/controllers/marketplaceController.d.ts +19 -0
  69. package/packages/server/dist/controllers/marketplaceController.d.ts.map +1 -0
  70. package/packages/server/dist/controllers/marketplaceController.js +74 -0
  71. package/packages/server/dist/controllers/marketplaceController.js.map +1 -0
  72. package/packages/server/dist/controllers/observabilityController.d.ts +32 -0
  73. package/packages/server/dist/controllers/observabilityController.d.ts.map +1 -0
  74. package/packages/server/dist/controllers/observabilityController.js +148 -0
  75. package/packages/server/dist/controllers/observabilityController.js.map +1 -0
  76. package/packages/server/dist/controllers/projectController.d.ts.map +1 -1
  77. package/packages/server/dist/controllers/projectController.js +11 -0
  78. package/packages/server/dist/controllers/projectController.js.map +1 -1
  79. package/packages/server/dist/controllers/snippetController.d.ts +35 -0
  80. package/packages/server/dist/controllers/snippetController.d.ts.map +1 -0
  81. package/packages/server/dist/controllers/snippetController.js +294 -0
  82. package/packages/server/dist/controllers/snippetController.js.map +1 -0
  83. package/packages/server/dist/handlers/streamCallbacks.d.ts +8 -0
  84. package/packages/server/dist/handlers/streamCallbacks.d.ts.map +1 -1
  85. package/packages/server/dist/handlers/streamCallbacks.js +8 -0
  86. package/packages/server/dist/handlers/streamCallbacks.js.map +1 -1
  87. package/packages/server/dist/handlers/websocket.d.ts +15 -0
  88. package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
  89. package/packages/server/dist/handlers/websocket.js +103 -2
  90. package/packages/server/dist/handlers/websocket.js.map +1 -1
  91. package/packages/server/dist/index.js +5 -0
  92. package/packages/server/dist/index.js.map +1 -1
  93. package/packages/server/dist/locales/en/server.json +37 -4
  94. package/packages/server/dist/locales/es/server.json +0 -4
  95. package/packages/server/dist/locales/ja/server.json +0 -4
  96. package/packages/server/dist/locales/ko/server.json +0 -4
  97. package/packages/server/dist/locales/pt/server.json +0 -4
  98. package/packages/server/dist/locales/zh-CN/server.json +0 -4
  99. package/packages/server/dist/routes/harness.d.ts +8 -0
  100. package/packages/server/dist/routes/harness.d.ts.map +1 -0
  101. package/packages/server/dist/routes/harness.js +150 -0
  102. package/packages/server/dist/routes/harness.js.map +1 -0
  103. package/packages/server/dist/routes/projects.d.ts.map +1 -1
  104. package/packages/server/dist/routes/projects.js +5 -60
  105. package/packages/server/dist/routes/projects.js.map +1 -1
  106. package/packages/server/dist/routes/snippets.d.ts +14 -0
  107. package/packages/server/dist/routes/snippets.d.ts.map +1 -0
  108. package/packages/server/dist/routes/snippets.js +27 -0
  109. package/packages/server/dist/routes/snippets.js.map +1 -0
  110. package/packages/server/dist/services/bmadCoreConfigService.d.ts +86 -0
  111. package/packages/server/dist/services/bmadCoreConfigService.d.ts.map +1 -0
  112. package/packages/server/dist/services/bmadCoreConfigService.js +175 -0
  113. package/packages/server/dist/services/bmadCoreConfigService.js.map +1 -0
  114. package/packages/server/dist/services/bmadStatusService.d.ts +15 -2
  115. package/packages/server/dist/services/bmadStatusService.d.ts.map +1 -1
  116. package/packages/server/dist/services/bmadStatusService.js +146 -37
  117. package/packages/server/dist/services/bmadStatusService.js.map +1 -1
  118. package/packages/server/dist/services/chatService.d.ts +3 -0
  119. package/packages/server/dist/services/chatService.d.ts.map +1 -1
  120. package/packages/server/dist/services/chatService.js +28 -7
  121. package/packages/server/dist/services/chatService.js.map +1 -1
  122. package/packages/server/dist/services/claudeMdService.d.ts +48 -0
  123. package/packages/server/dist/services/claudeMdService.d.ts.map +1 -0
  124. package/packages/server/dist/services/claudeMdService.js +240 -0
  125. package/packages/server/dist/services/claudeMdService.js.map +1 -0
  126. package/packages/server/dist/services/commandService.d.ts +10 -0
  127. package/packages/server/dist/services/commandService.d.ts.map +1 -1
  128. package/packages/server/dist/services/commandService.js +129 -4
  129. package/packages/server/dist/services/commandService.js.map +1 -1
  130. package/packages/server/dist/services/contextBuilderScriptTemplate.d.ts +24 -0
  131. package/packages/server/dist/services/contextBuilderScriptTemplate.d.ts.map +1 -0
  132. package/packages/server/dist/services/contextBuilderScriptTemplate.js +181 -0
  133. package/packages/server/dist/services/contextBuilderScriptTemplate.js.map +1 -0
  134. package/packages/server/dist/services/contextBuilderService.d.ts +68 -0
  135. package/packages/server/dist/services/contextBuilderService.d.ts.map +1 -0
  136. package/packages/server/dist/services/contextBuilderService.js +345 -0
  137. package/packages/server/dist/services/contextBuilderService.js.map +1 -0
  138. package/packages/server/dist/services/fileWatcherService.d.ts +24 -0
  139. package/packages/server/dist/services/fileWatcherService.d.ts.map +1 -1
  140. package/packages/server/dist/services/fileWatcherService.js +232 -1
  141. package/packages/server/dist/services/fileWatcherService.js.map +1 -1
  142. package/packages/server/dist/services/harnessAgentService.d.ts +97 -0
  143. package/packages/server/dist/services/harnessAgentService.d.ts.map +1 -0
  144. package/packages/server/dist/services/harnessAgentService.js +988 -0
  145. package/packages/server/dist/services/harnessAgentService.js.map +1 -0
  146. package/packages/server/dist/services/harnessBundleService.d.ts +145 -0
  147. package/packages/server/dist/services/harnessBundleService.d.ts.map +1 -0
  148. package/packages/server/dist/services/harnessBundleService.js +1318 -0
  149. package/packages/server/dist/services/harnessBundleService.js.map +1 -0
  150. package/packages/server/dist/services/harnessCommandService.d.ts +81 -0
  151. package/packages/server/dist/services/harnessCommandService.d.ts.map +1 -0
  152. package/packages/server/dist/services/harnessCommandService.js +917 -0
  153. package/packages/server/dist/services/harnessCommandService.js.map +1 -0
  154. package/packages/server/dist/services/harnessHookService.d.ts +82 -0
  155. package/packages/server/dist/services/harnessHookService.d.ts.map +1 -0
  156. package/packages/server/dist/services/harnessHookService.js +1112 -0
  157. package/packages/server/dist/services/harnessHookService.js.map +1 -0
  158. package/packages/server/dist/services/harnessLintService.d.ts +49 -0
  159. package/packages/server/dist/services/harnessLintService.d.ts.map +1 -0
  160. package/packages/server/dist/services/harnessLintService.js +628 -0
  161. package/packages/server/dist/services/harnessLintService.js.map +1 -0
  162. package/packages/server/dist/services/harnessMcpService.d.ts +100 -0
  163. package/packages/server/dist/services/harnessMcpService.d.ts.map +1 -0
  164. package/packages/server/dist/services/harnessMcpService.js +884 -0
  165. package/packages/server/dist/services/harnessMcpService.js.map +1 -0
  166. package/packages/server/dist/services/harnessPluginService.d.ts +66 -0
  167. package/packages/server/dist/services/harnessPluginService.d.ts.map +1 -0
  168. package/packages/server/dist/services/harnessPluginService.js +559 -0
  169. package/packages/server/dist/services/harnessPluginService.js.map +1 -0
  170. package/packages/server/dist/services/harnessService.d.ts +40 -0
  171. package/packages/server/dist/services/harnessService.d.ts.map +1 -0
  172. package/packages/server/dist/services/harnessService.js +222 -0
  173. package/packages/server/dist/services/harnessService.js.map +1 -0
  174. package/packages/server/dist/services/harnessShareScopeService.d.ts +50 -0
  175. package/packages/server/dist/services/harnessShareScopeService.d.ts.map +1 -0
  176. package/packages/server/dist/services/harnessShareScopeService.js +158 -0
  177. package/packages/server/dist/services/harnessShareScopeService.js.map +1 -0
  178. package/packages/server/dist/services/harnessSkillService.d.ts +70 -0
  179. package/packages/server/dist/services/harnessSkillService.d.ts.map +1 -0
  180. package/packages/server/dist/services/harnessSkillService.js +636 -0
  181. package/packages/server/dist/services/harnessSkillService.js.map +1 -0
  182. package/packages/server/dist/services/issueService.d.ts.map +1 -1
  183. package/packages/server/dist/services/issueService.js +3 -1
  184. package/packages/server/dist/services/issueService.js.map +1 -1
  185. package/packages/server/dist/services/manualSyncService.d.ts +19 -0
  186. package/packages/server/dist/services/manualSyncService.d.ts.map +1 -0
  187. package/packages/server/dist/services/manualSyncService.js +110 -0
  188. package/packages/server/dist/services/manualSyncService.js.map +1 -0
  189. package/packages/server/dist/services/marketplaceService.d.ts +50 -0
  190. package/packages/server/dist/services/marketplaceService.d.ts.map +1 -0
  191. package/packages/server/dist/services/marketplaceService.js +326 -0
  192. package/packages/server/dist/services/marketplaceService.js.map +1 -0
  193. package/packages/server/dist/services/observabilityService.d.ts +87 -0
  194. package/packages/server/dist/services/observabilityService.d.ts.map +1 -0
  195. package/packages/server/dist/services/observabilityService.js +0 -0
  196. package/packages/server/dist/services/observabilityService.js.map +1 -0
  197. package/packages/server/dist/services/queueService.d.ts.map +1 -1
  198. package/packages/server/dist/services/queueService.js +48 -2
  199. package/packages/server/dist/services/queueService.js.map +1 -1
  200. package/packages/server/dist/services/sessionService.d.ts +16 -0
  201. package/packages/server/dist/services/sessionService.d.ts.map +1 -1
  202. package/packages/server/dist/services/sessionService.js +125 -0
  203. package/packages/server/dist/services/sessionService.js.map +1 -1
  204. package/packages/server/dist/services/snippetService.d.ts +54 -0
  205. package/packages/server/dist/services/snippetService.d.ts.map +1 -0
  206. package/packages/server/dist/services/snippetService.js +371 -0
  207. package/packages/server/dist/services/snippetService.js.map +1 -0
  208. package/packages/server/dist/services/tokenCountService.d.ts +71 -0
  209. package/packages/server/dist/services/tokenCountService.d.ts.map +1 -0
  210. package/packages/server/dist/services/tokenCountService.js +313 -0
  211. package/packages/server/dist/services/tokenCountService.js.map +1 -0
  212. package/packages/server/dist/services/utils/applyYamlFrontmatterPatch.d.ts +46 -0
  213. package/packages/server/dist/services/utils/applyYamlFrontmatterPatch.d.ts.map +1 -0
  214. package/packages/server/dist/services/utils/applyYamlFrontmatterPatch.js +125 -0
  215. package/packages/server/dist/services/utils/applyYamlFrontmatterPatch.js.map +1 -0
  216. package/packages/server/dist/snippets/apply-qa-fixes +7 -5
  217. package/packages/server/dist/snippets/qa-review +5 -1
  218. package/packages/server/dist/snippets/split-commit +9 -0
  219. package/packages/server/dist/utils/applySecretsPolicy.d.ts +53 -0
  220. package/packages/server/dist/utils/applySecretsPolicy.d.ts.map +1 -0
  221. package/packages/server/dist/utils/applySecretsPolicy.js +204 -0
  222. package/packages/server/dist/utils/applySecretsPolicy.js.map +1 -0
  223. package/packages/server/dist/utils/assertNoSecretOnShared.d.ts +40 -0
  224. package/packages/server/dist/utils/assertNoSecretOnShared.d.ts.map +1 -0
  225. package/packages/server/dist/utils/assertNoSecretOnShared.js +47 -0
  226. package/packages/server/dist/utils/assertNoSecretOnShared.js.map +1 -0
  227. package/packages/server/dist/utils/assertSafeBundlePath.d.ts +29 -0
  228. package/packages/server/dist/utils/assertSafeBundlePath.d.ts.map +1 -0
  229. package/packages/server/dist/utils/assertSafeBundlePath.js +53 -0
  230. package/packages/server/dist/utils/assertSafeBundlePath.js.map +1 -0
  231. package/packages/server/dist/utils/bundledBinaryModelSupport.d.ts +7 -0
  232. package/packages/server/dist/utils/bundledBinaryModelSupport.d.ts.map +1 -0
  233. package/packages/server/dist/utils/bundledBinaryModelSupport.js +107 -0
  234. package/packages/server/dist/utils/bundledBinaryModelSupport.js.map +1 -0
  235. package/packages/server/dist/utils/effortUtils.d.ts +2 -2
  236. package/packages/server/dist/utils/effortUtils.js +5 -5
  237. package/packages/server/dist/utils/effortUtils.js.map +1 -1
  238. package/packages/server/dist/utils/errors.d.ts +1 -0
  239. package/packages/server/dist/utils/errors.d.ts.map +1 -1
  240. package/packages/server/dist/utils/errors.js +17 -0
  241. package/packages/server/dist/utils/errors.js.map +1 -1
  242. package/packages/server/dist/utils/gitignoreFilter.d.ts +23 -0
  243. package/packages/server/dist/utils/gitignoreFilter.d.ts.map +1 -0
  244. package/packages/server/dist/utils/gitignoreFilter.js +42 -0
  245. package/packages/server/dist/utils/gitignoreFilter.js.map +1 -0
  246. package/packages/server/dist/utils/harnessBundleSchema.d.ts +107 -0
  247. package/packages/server/dist/utils/harnessBundleSchema.d.ts.map +1 -0
  248. package/packages/server/dist/utils/harnessBundleSchema.js +89 -0
  249. package/packages/server/dist/utils/harnessBundleSchema.js.map +1 -0
  250. package/packages/server/dist/utils/harnessPaths.d.ts +74 -0
  251. package/packages/server/dist/utils/harnessPaths.d.ts.map +1 -0
  252. package/packages/server/dist/utils/harnessPaths.js +247 -0
  253. package/packages/server/dist/utils/harnessPaths.js.map +1 -0
  254. package/packages/server/dist/utils/secretHeuristic.d.ts +72 -0
  255. package/packages/server/dist/utils/secretHeuristic.d.ts.map +1 -0
  256. package/packages/server/dist/utils/secretHeuristic.js +163 -0
  257. package/packages/server/dist/utils/secretHeuristic.js.map +1 -0
  258. package/packages/server/dist/utils/secretPlaceholderNamer.d.ts +41 -0
  259. package/packages/server/dist/utils/secretPlaceholderNamer.d.ts.map +1 -0
  260. package/packages/server/dist/utils/secretPlaceholderNamer.js +81 -0
  261. package/packages/server/dist/utils/secretPlaceholderNamer.js.map +1 -0
  262. package/packages/server/dist/utils/serverPathResolver.d.ts +29 -0
  263. package/packages/server/dist/utils/serverPathResolver.d.ts.map +1 -0
  264. package/packages/server/dist/utils/serverPathResolver.js +59 -0
  265. package/packages/server/dist/utils/serverPathResolver.js.map +1 -0
  266. package/packages/server/dist/utils/snippetPaths.d.ts +61 -0
  267. package/packages/server/dist/utils/snippetPaths.d.ts.map +1 -0
  268. package/packages/server/dist/utils/snippetPaths.js +123 -0
  269. package/packages/server/dist/utils/snippetPaths.js.map +1 -0
  270. package/packages/server/dist/utils/structuredEditor.d.ts +34 -0
  271. package/packages/server/dist/utils/structuredEditor.d.ts.map +1 -0
  272. package/packages/server/dist/utils/structuredEditor.js +111 -0
  273. package/packages/server/dist/utils/structuredEditor.js.map +1 -0
  274. package/packages/server/package.json +6 -2
  275. package/packages/server/resources/internals/INDEX.md +25 -0
  276. package/packages/server/resources/internals/bmad-qa-fix-marker.md +32 -0
  277. package/packages/server/resources/internals/harness-files.md +85 -0
  278. package/packages/server/resources/internals/image-storage.md +43 -0
  279. package/packages/server/resources/internals/observability-storage.md +23 -0
  280. package/packages/server/resources/manual/01-getting-started.md +104 -0
  281. package/packages/server/resources/manual/02-chat.md +285 -0
  282. package/packages/server/resources/manual/03-sessions.md +48 -0
  283. package/packages/server/resources/manual/04-slash-commands-favorites.md +152 -0
  284. package/packages/server/resources/manual/05-projects.md +76 -0
  285. package/packages/server/resources/manual/06-file-explorer-editor.md +90 -0
  286. package/packages/server/resources/manual/07-git.md +94 -0
  287. package/packages/server/resources/manual/08-terminal.md +59 -0
  288. package/packages/server/resources/manual/09-queue-runner.md +262 -0
  289. package/packages/server/resources/manual/10-project-board.md +194 -0
  290. package/packages/server/resources/manual/11-bmad-method-integration.md +130 -0
  291. package/packages/server/resources/manual/12-harness-workbench.md +256 -0
  292. package/packages/server/resources/manual/13-settings.md +241 -0
  293. package/packages/server/resources/manual/14-keyboard-shortcuts.md +68 -0
  294. package/packages/server/resources/manual/15-environment-variables.md +28 -0
  295. package/packages/server/resources/manual/16-troubleshooting.md +110 -0
  296. package/packages/server/resources/manual/INDEX.md +60 -0
  297. package/packages/shared/dist/index.d.ts +7 -0
  298. package/packages/shared/dist/index.d.ts.map +1 -1
  299. package/packages/shared/dist/index.js +14 -0
  300. package/packages/shared/dist/index.js.map +1 -1
  301. package/packages/shared/dist/types/bmadCoreConfig.d.ts +71 -0
  302. package/packages/shared/dist/types/bmadCoreConfig.d.ts.map +1 -0
  303. package/packages/shared/dist/types/bmadCoreConfig.js +30 -0
  304. package/packages/shared/dist/types/bmadCoreConfig.js.map +1 -0
  305. package/packages/shared/dist/types/bmadStatus.d.ts +10 -0
  306. package/packages/shared/dist/types/bmadStatus.d.ts.map +1 -1
  307. package/packages/shared/dist/types/bmadStatus.js.map +1 -1
  308. package/packages/shared/dist/types/board.d.ts +6 -0
  309. package/packages/shared/dist/types/board.d.ts.map +1 -1
  310. package/packages/shared/dist/types/command.d.ts +3 -3
  311. package/packages/shared/dist/types/command.d.ts.map +1 -1
  312. package/packages/shared/dist/types/contextBuilder.d.ts +102 -0
  313. package/packages/shared/dist/types/contextBuilder.d.ts.map +1 -0
  314. package/packages/shared/dist/types/contextBuilder.js +55 -0
  315. package/packages/shared/dist/types/contextBuilder.js.map +1 -0
  316. package/packages/shared/dist/types/harness.d.ts +1211 -0
  317. package/packages/shared/dist/types/harness.d.ts.map +1 -0
  318. package/packages/shared/dist/types/harness.js +107 -0
  319. package/packages/shared/dist/types/harness.js.map +1 -0
  320. package/packages/shared/dist/types/harnessBundle.d.ts +205 -0
  321. package/packages/shared/dist/types/harnessBundle.d.ts.map +1 -0
  322. package/packages/shared/dist/types/harnessBundle.js +18 -0
  323. package/packages/shared/dist/types/harnessBundle.js.map +1 -0
  324. package/packages/shared/dist/types/marketplace.d.ts +83 -0
  325. package/packages/shared/dist/types/marketplace.d.ts.map +1 -0
  326. package/packages/shared/dist/types/marketplace.js +18 -0
  327. package/packages/shared/dist/types/marketplace.js.map +1 -0
  328. package/packages/shared/dist/types/observability.d.ts +148 -0
  329. package/packages/shared/dist/types/observability.d.ts.map +1 -0
  330. package/packages/shared/dist/types/observability.js +24 -0
  331. package/packages/shared/dist/types/observability.js.map +1 -0
  332. package/packages/shared/dist/types/preferences.d.ts +4 -0
  333. package/packages/shared/dist/types/preferences.d.ts.map +1 -1
  334. package/packages/shared/dist/types/preferences.js.map +1 -1
  335. package/packages/shared/dist/types/queue.d.ts +9 -0
  336. package/packages/shared/dist/types/queue.d.ts.map +1 -1
  337. package/packages/shared/dist/types/sdk.d.ts +1 -1
  338. package/packages/shared/dist/types/sdk.d.ts.map +1 -1
  339. package/packages/shared/dist/types/sdk.js +1 -1
  340. package/packages/shared/dist/types/sdk.js.map +1 -1
  341. package/packages/shared/dist/types/websocket.d.ts +10 -0
  342. package/packages/shared/dist/types/websocket.d.ts.map +1 -1
  343. package/packages/shared/dist/utils/markdownSections.d.ts +50 -0
  344. package/packages/shared/dist/utils/markdownSections.d.ts.map +1 -0
  345. package/packages/shared/dist/utils/markdownSections.js +111 -0
  346. package/packages/shared/dist/utils/markdownSections.js.map +1 -0
  347. package/packages/shared/dist/utils/queueParser.d.ts.map +1 -1
  348. package/packages/shared/dist/utils/queueParser.js +104 -0
  349. package/packages/shared/dist/utils/queueParser.js.map +1 -1
  350. package/scripts/build-manual-shards.mjs +100 -0
  351. package/packages/client/dist/assets/index-6jREnVYd.js +0 -2
  352. package/packages/client/dist/assets/index-BFF0iqyW.css +0 -32
  353. package/packages/client/dist/assets/index-BcI4y-fU.js +0 -1454
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Story 30.3 (Task 2.2): apply the three `secretsPolicy` modes to a payload
3
+ * before it is written into the bundle.
4
+ *
5
+ * Two operating shapes, mirroring `detectSecretsInValue` / `detectSecretsInText`:
6
+ *
7
+ * 1. `applyPolicyToValue` walks a JSON-like value (mcp config, settings.json
8
+ * hooks block). For `excluded` the matched leaf is deleted from its
9
+ * parent; for `placeholder` it is rewritten as `${ENV_REF_NAME}` using
10
+ * `secretPlaceholderNamer`; for `included-explicit` the value is left
11
+ * untouched.
12
+ *
13
+ * 2. `applyPolicyToText` walks line-oriented text (CLAUDE.md, agent body,
14
+ * command body). For `excluded` the offending line is replaced with the
15
+ * sentinel `<< SECRET REMOVED >>` so line numbers stay stable; for
16
+ * `placeholder` every secret substring on that line is rewritten as
17
+ * `${ENV_REF_NAME}`; for `included-explicit` the text is unchanged.
18
+ *
19
+ * Both return per-call counters that the caller aggregates into the
20
+ * `ImportApplySummary` (well, the export equivalent — same idea: surface to
21
+ * the user how many secrets were affected).
22
+ */
23
+ import { ENV_REF_RE, SECRET_PATTERNS, shannonEntropy, } from './secretHeuristic.js';
24
+ import { namePlaceholder } from './secretPlaceholderNamer.js';
25
+ export const SECRET_REMOVED_TEXT_PLACEHOLDER = '<< SECRET REMOVED >>';
26
+ const BASE64_NON_ALPHA_RE = /[0-9+/=]/;
27
+ function matchPasses(s, pat) {
28
+ if (pat.minEntropy === undefined)
29
+ return true;
30
+ return shannonEntropy(s) >= pat.minEntropy && BASE64_NON_ALPHA_RE.test(s);
31
+ }
32
+ /** Iterate every secret substring inside `text`. */
33
+ function* iterateSecretMatches(text) {
34
+ for (const pat of SECRET_PATTERNS) {
35
+ const re = pat.re.global ? pat.re : new RegExp(pat.re.source, pat.re.flags + 'g');
36
+ re.lastIndex = 0;
37
+ let m;
38
+ while ((m = re.exec(text)) !== null) {
39
+ const raw = m[0];
40
+ if (matchPasses(raw, pat)) {
41
+ yield { start: m.index, end: m.index + raw.length, raw, pat };
42
+ }
43
+ if (m.index === re.lastIndex)
44
+ re.lastIndex += 1;
45
+ }
46
+ }
47
+ }
48
+ function stripEnvRefs(text) {
49
+ return text.replace(ENV_REF_RE, '');
50
+ }
51
+ function containsSecret(text) {
52
+ const stripped = stripEnvRefs(text);
53
+ for (const _ of iterateSecretMatches(stripped)) {
54
+ return true;
55
+ }
56
+ return false;
57
+ }
58
+ /**
59
+ * Replace every secret substring inside `text` with the ENV-ref produced by
60
+ * the namer. Matches on the env-stripped clone first so existing `${FOO}`
61
+ * indirection isn't double-replaced.
62
+ */
63
+ function replaceSecretsInText(text, makeName) {
64
+ // We need the original text positions but the secret-detection regex must
65
+ // not double-count existing ENV refs. Strategy: collect matches against the
66
+ // env-stripped clone, then translate offsets back to the original by
67
+ // walking through both strings in parallel.
68
+ const stripped = stripEnvRefs(text);
69
+ if (stripped === text) {
70
+ return rebuildText(text, makeName);
71
+ }
72
+ // When there were ENV refs, the safest fallback is to scan the original text
73
+ // directly. Existing `${FOO}` snippets won't match `SECRET_PATTERNS` (none of
74
+ // the regexes accept `{` or `}` in the middle), so direct scanning is fine.
75
+ return rebuildText(text, makeName);
76
+ }
77
+ function rebuildText(text, makeName) {
78
+ const matches = [];
79
+ for (const m of iterateSecretMatches(text)) {
80
+ matches.push({ start: m.start, end: m.end, raw: m.raw });
81
+ }
82
+ if (matches.length === 0)
83
+ return { text, replacedCount: 0 };
84
+ // Sort by start ascending, drop overlaps (keep first).
85
+ matches.sort((a, b) => a.start - b.start);
86
+ const nonOverlapping = [];
87
+ let lastEnd = -1;
88
+ for (const m of matches) {
89
+ if (m.start >= lastEnd) {
90
+ nonOverlapping.push(m);
91
+ lastEnd = m.end;
92
+ }
93
+ }
94
+ let out = '';
95
+ let cursor = 0;
96
+ let replaced = 0;
97
+ for (const m of nonOverlapping) {
98
+ out += text.slice(cursor, m.start);
99
+ out += '${' + makeName(m.raw, replaced) + '}';
100
+ cursor = m.end;
101
+ replaced += 1;
102
+ }
103
+ out += text.slice(cursor);
104
+ return { text: out, replacedCount: replaced };
105
+ }
106
+ export function applyPolicyToText(input) {
107
+ const { policy, domain, cardName, hookEvent, text } = input;
108
+ if (policy === 'included-explicit') {
109
+ return { text, removedCount: 0, replacedCount: 0 };
110
+ }
111
+ if (!text) {
112
+ return { text, removedCount: 0, replacedCount: 0 };
113
+ }
114
+ if (policy === 'excluded') {
115
+ // Replace each offending line with the sentinel so line numbers stay
116
+ // stable for downstream tools that index by line.
117
+ const lines = text.split(/\r?\n/);
118
+ let removed = 0;
119
+ for (let i = 0; i < lines.length; i += 1) {
120
+ if (containsSecret(lines[i])) {
121
+ lines[i] = SECRET_REMOVED_TEXT_PLACEHOLDER;
122
+ removed += 1;
123
+ }
124
+ }
125
+ return { text: lines.join('\n'), removedCount: removed, replacedCount: 0 };
126
+ }
127
+ // placeholder
128
+ const seenCounts = new Map();
129
+ const result = replaceSecretsInText(text, (_raw, idx) => {
130
+ const base = {
131
+ domain,
132
+ fieldPath: `body:${idx}`,
133
+ cardName,
134
+ hookEvent,
135
+ };
136
+ const baseName = namePlaceholder(base);
137
+ const count = seenCounts.get(baseName) ?? 0;
138
+ seenCounts.set(baseName, count + 1);
139
+ return count === 0 ? baseName : `${baseName}_${count + 1}`;
140
+ });
141
+ return { text: result.text, removedCount: 0, replacedCount: result.replacedCount };
142
+ }
143
+ export function applyPolicyToValue(input) {
144
+ const { policy, domain, cardName, hookEvent, value } = input;
145
+ if (policy === 'included-explicit') {
146
+ return { value, removedCount: 0, replacedCount: 0 };
147
+ }
148
+ const pathPrefix = input.pathPrefix ?? [];
149
+ let removedCount = 0;
150
+ let replacedCount = 0;
151
+ const seenCounts = new Map();
152
+ const transform = (v, p) => {
153
+ if (typeof v === 'string') {
154
+ const stripped = stripEnvRefs(v);
155
+ if (!stripped || !containsSecret(stripped)) {
156
+ return v;
157
+ }
158
+ if (policy === 'excluded') {
159
+ removedCount += 1;
160
+ // Return a sentinel that the caller (e.g. the mcp/hook config walker)
161
+ // will interpret as "delete this leaf" — strings, by themselves, can't
162
+ // disappear from their parent. We use the literal undefined sentinel
163
+ // and let the array/object handlers filter.
164
+ return SECRET_REMOVED_SENTINEL;
165
+ }
166
+ // placeholder
167
+ const baseName = namePlaceholder({
168
+ domain,
169
+ cardName,
170
+ hookEvent,
171
+ fieldPath: p.join('.'),
172
+ });
173
+ const count = seenCounts.get(baseName) ?? 0;
174
+ seenCounts.set(baseName, count + 1);
175
+ const name = count === 0 ? baseName : `${baseName}_${count + 1}`;
176
+ replacedCount += 1;
177
+ return '${' + name + '}';
178
+ }
179
+ if (Array.isArray(v)) {
180
+ return v
181
+ .map((item, i) => transform(item, [...p, String(i)]))
182
+ .filter((item) => item !== SECRET_REMOVED_SENTINEL);
183
+ }
184
+ if (v && typeof v === 'object') {
185
+ const out = {};
186
+ for (const [k, child] of Object.entries(v)) {
187
+ const next = transform(child, [...p, k]);
188
+ if (next !== SECRET_REMOVED_SENTINEL)
189
+ out[k] = next;
190
+ }
191
+ return out;
192
+ }
193
+ return v;
194
+ };
195
+ const result = transform(value, pathPrefix);
196
+ // Top-level scalar might be the sentinel — flatten to undefined for callers.
197
+ return {
198
+ value: result === SECRET_REMOVED_SENTINEL ? undefined : result,
199
+ removedCount,
200
+ replacedCount,
201
+ };
202
+ }
203
+ const SECRET_REMOVED_SENTINEL = Symbol('secret-removed');
204
+ //# sourceMappingURL=applySecretsPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applySecretsPolicy.js","sourceRoot":"","sources":["../../src/utils/applySecretsPolicy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Story 30.1 (Task 6.2): server-side guard that escalates a secret detection
3
+ * to a hard `HARNESS_SECRET_ON_SHARED` block when the target file is tracked
4
+ * by git (`shared` verdict from `harnessShareScopeService`).
5
+ *
6
+ * Sub-spike 6.2.0 decision: option (b) — distributed at the four domain
7
+ * services (agent / command / hook / mcp). Rationale:
8
+ * - `harnessService.write` IS a single common call site, so option (a)
9
+ * would also work for the raw write path. But AC4.d carves out
10
+ * domain-specific scopes (settings.json values, hook command/prompt
11
+ * fields, agent frontmatter) that the single point cannot meaningfully
12
+ * filter without re-parsing the file. Distributing the helper keeps each
13
+ * domain's existing per-field detection in place and just adds the
14
+ * "shared → block" escalation on top.
15
+ *
16
+ * The helper performs the cheap path-classification round trip
17
+ * (`harnessShareScopeService.evaluate` is a single `.gitignore` load + one
18
+ * `isIgnored()` call). User-scope writes are no-ops (no `.gitignore`
19
+ * involved).
20
+ */
21
+ import { type HarnessScope } from '@hammoc/shared';
22
+ export interface AssertNoSecretOnSharedInput {
23
+ scope: HarnessScope;
24
+ projectSlug?: string;
25
+ /** Project-relative POSIX path of the file being written (e.g. `.claude/agents/dev.md`). */
26
+ relativePath: string;
27
+ /**
28
+ * Pre-computed detection result from the calling service. The helper does
29
+ * not re-run secret detection because each service knows which fields are
30
+ * in-scope per AC4.d.
31
+ */
32
+ secretDetected: boolean;
33
+ /** Optional secret locations (line numbers / dot-paths) to surface in the error. */
34
+ detectedAt?: {
35
+ lines?: number[];
36
+ paths?: string[];
37
+ };
38
+ }
39
+ export declare function assertNoSecretOnShared(input: AssertNoSecretOnSharedInput): Promise<void>;
40
+ //# sourceMappingURL=assertNoSecretOnShared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertNoSecretOnShared.d.ts","sourceRoot":"","sources":["../../src/utils/assertNoSecretOnShared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnE,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4FAA4F;IAC5F,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB,oFAAoF;IACpF,UAAU,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACrD;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Story 30.1 (Task 6.2): server-side guard that escalates a secret detection
3
+ * to a hard `HARNESS_SECRET_ON_SHARED` block when the target file is tracked
4
+ * by git (`shared` verdict from `harnessShareScopeService`).
5
+ *
6
+ * Sub-spike 6.2.0 decision: option (b) — distributed at the four domain
7
+ * services (agent / command / hook / mcp). Rationale:
8
+ * - `harnessService.write` IS a single common call site, so option (a)
9
+ * would also work for the raw write path. But AC4.d carves out
10
+ * domain-specific scopes (settings.json values, hook command/prompt
11
+ * fields, agent frontmatter) that the single point cannot meaningfully
12
+ * filter without re-parsing the file. Distributing the helper keeps each
13
+ * domain's existing per-field detection in place and just adds the
14
+ * "shared → block" escalation on top.
15
+ *
16
+ * The helper performs the cheap path-classification round trip
17
+ * (`harnessShareScopeService.evaluate` is a single `.gitignore` load + one
18
+ * `isIgnored()` call). User-scope writes are no-ops (no `.gitignore`
19
+ * involved).
20
+ */
21
+ import { HARNESS_ERRORS } from '@hammoc/shared';
22
+ import { harnessShareScopeService } from '../services/harnessShareScopeService.js';
23
+ export async function assertNoSecretOnShared(input) {
24
+ if (!input.secretDetected)
25
+ return;
26
+ // User scope (`~/.claude`) is not git-tracked — `.gitignore` does not apply.
27
+ if (input.scope !== 'project' || !input.projectSlug)
28
+ return;
29
+ const result = await harnessShareScopeService.evaluate({
30
+ projectSlug: input.projectSlug,
31
+ relativePaths: [input.relativePath],
32
+ });
33
+ const verdict = result.cards[input.relativePath];
34
+ // Only `shared` triggers the hard block. `local` / `fullyIgnored` keep
35
+ // the existing per-service acknowledgement flow.
36
+ if (verdict !== 'shared')
37
+ return;
38
+ const err = new Error('plaintext secret detected on a git-tracked file');
39
+ err.code = HARNESS_ERRORS.HARNESS_SECRET_ON_SHARED.code;
40
+ err.relativePath = input.relativePath;
41
+ if (input.detectedAt?.lines)
42
+ err.lines = input.detectedAt.lines;
43
+ if (input.detectedAt?.paths)
44
+ err.paths = input.detectedAt.paths;
45
+ throw err;
46
+ }
47
+ //# sourceMappingURL=assertNoSecretOnShared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertNoSecretOnShared.js","sourceRoot":"","sources":["../../src/utils/assertNoSecretOnShared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,cAAc,EAAqB,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AAiBnF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAkC;IAElC,IAAI,CAAC,KAAK,CAAC,cAAc;QAAE,OAAO;IAClC,6EAA6E;IAC7E,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,WAAW;QAAE,OAAO;IAE5D,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,QAAQ,CAAC;QACrD,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,aAAa,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;KACpC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAEjD,uEAAuE;IACvE,iDAAiD;IACjD,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO;IAEjC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,iDAAiD,CACN,CAAC;IAClE,GAAG,CAAC,IAAI,GAAG,cAAc,CAAC,wBAAwB,CAAC,IAAI,CAAC;IACxD,GAAG,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;IACtC,IAAI,KAAK,CAAC,UAAU,EAAE,KAAK;QAAE,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;IAChE,IAAI,KAAK,CAAC,UAAU,EAAE,KAAK;QAAE,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;IAChE,MAAM,GAAG,CAAC;AACZ,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Story 30.5 (AC9): single-source guard against ZIP-slip / path-traversal
3
+ * during harness bundle import.
4
+ *
5
+ * `jszip` does not normalise entry paths — a malicious bundle can ship an
6
+ * entry called `../../etc/passwd` or `C:\Windows\System32\evil.dll` and naive
7
+ * code that joins it to the project root would write outside the target.
8
+ * Every entry path read from an import ZIP must therefore pass through this
9
+ * function before the bundle service touches disk.
10
+ *
11
+ * Rejected shapes:
12
+ * - absolute POSIX (`/etc/...`)
13
+ * - absolute Windows (`C:\...`, `C:/...`)
14
+ * - UNC (`\\server\share`, `//server/share`)
15
+ * - any traversal component (`..` segment anywhere in the path)
16
+ * - embedded null byte (would terminate the path early in fs APIs)
17
+ *
18
+ * Accepted shapes:
19
+ * - POSIX-style relative paths (`skills/foo/SKILL.md`)
20
+ * - Windows-style backslashes are normalised, then validated
21
+ * - the empty string (the zip "/" root) is rejected as it carries no entry
22
+ */
23
+ export declare class UnsafeBundlePathError extends Error {
24
+ readonly code = "HARNESS_BUNDLE_UNSAFE_PATH";
25
+ readonly relativePath: string;
26
+ constructor(relativePath: string, reason: string);
27
+ }
28
+ export declare function assertSafeBundlePath(relativePath: string): void;
29
+ //# sourceMappingURL=assertSafeBundlePath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertSafeBundlePath.d.ts","sourceRoot":"","sources":["../../src/utils/assertSafeBundlePath.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,gCAAgC;IAC7C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAClB,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAIjD;AAED,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAmB/D"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Story 30.5 (AC9): single-source guard against ZIP-slip / path-traversal
3
+ * during harness bundle import.
4
+ *
5
+ * `jszip` does not normalise entry paths — a malicious bundle can ship an
6
+ * entry called `../../etc/passwd` or `C:\Windows\System32\evil.dll` and naive
7
+ * code that joins it to the project root would write outside the target.
8
+ * Every entry path read from an import ZIP must therefore pass through this
9
+ * function before the bundle service touches disk.
10
+ *
11
+ * Rejected shapes:
12
+ * - absolute POSIX (`/etc/...`)
13
+ * - absolute Windows (`C:\...`, `C:/...`)
14
+ * - UNC (`\\server\share`, `//server/share`)
15
+ * - any traversal component (`..` segment anywhere in the path)
16
+ * - embedded null byte (would terminate the path early in fs APIs)
17
+ *
18
+ * Accepted shapes:
19
+ * - POSIX-style relative paths (`skills/foo/SKILL.md`)
20
+ * - Windows-style backslashes are normalised, then validated
21
+ * - the empty string (the zip "/" root) is rejected as it carries no entry
22
+ */
23
+ const ABSOLUTE_WIN_RE = /^[A-Za-z]:[\\/]/;
24
+ const TRAVERSAL_SEGMENT_RE = /(^|[\\/])\.\.([\\/]|$)/;
25
+ export class UnsafeBundlePathError extends Error {
26
+ code = 'HARNESS_BUNDLE_UNSAFE_PATH';
27
+ relativePath;
28
+ constructor(relativePath, reason) {
29
+ super(`unsafe bundle entry "${relativePath}": ${reason}`);
30
+ this.relativePath = relativePath;
31
+ }
32
+ }
33
+ export function assertSafeBundlePath(relativePath) {
34
+ if (typeof relativePath !== 'string' || relativePath.length === 0) {
35
+ throw new UnsafeBundlePathError(String(relativePath), 'empty entry path');
36
+ }
37
+ if (relativePath.includes('\0')) {
38
+ throw new UnsafeBundlePathError(relativePath, 'null byte in entry path');
39
+ }
40
+ if (relativePath.startsWith('/') || relativePath.startsWith('\\')) {
41
+ throw new UnsafeBundlePathError(relativePath, 'absolute path not allowed');
42
+ }
43
+ if (ABSOLUTE_WIN_RE.test(relativePath)) {
44
+ throw new UnsafeBundlePathError(relativePath, 'Windows-absolute path not allowed');
45
+ }
46
+ if (relativePath.startsWith('\\\\') || relativePath.startsWith('//')) {
47
+ throw new UnsafeBundlePathError(relativePath, 'UNC path not allowed');
48
+ }
49
+ if (TRAVERSAL_SEGMENT_RE.test(relativePath)) {
50
+ throw new UnsafeBundlePathError(relativePath, 'parent-directory traversal not allowed');
51
+ }
52
+ }
53
+ //# sourceMappingURL=assertSafeBundlePath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertSafeBundlePath.js","sourceRoot":"","sources":["../../src/utils/assertSafeBundlePath.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAC1C,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AAEtD,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACrC,IAAI,GAAG,4BAA4B,CAAC;IACpC,YAAY,CAAS;IAC9B,YAAY,YAAoB,EAAE,MAAc;QAC9C,KAAK,CAAC,wBAAwB,YAAY,MAAM,MAAM,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;CACF;AAED,MAAM,UAAU,oBAAoB,CAAC,YAAoB;IACvD,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,qBAAqB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,qBAAqB,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,qBAAqB,CAAC,YAAY,EAAE,2BAA2B,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,qBAAqB,CAAC,YAAY,EAAE,mCAAmC,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,qBAAqB,CAAC,YAAY,EAAE,sBAAsB,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,qBAAqB,CAAC,YAAY,EAAE,wCAAwC,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * True when `model` is a known native-1M model but the bundled binary does NOT
3
+ * recognize it — so its 1M context silently falls back to ~200K. Conservative:
4
+ * returns false (no warning) for bare aliases, unreadable binaries, or uncertainty.
5
+ */
6
+ export declare function modelMissingNative1MSupport(model?: string): Promise<boolean>;
7
+ //# sourceMappingURL=bundledBinaryModelSupport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundledBinaryModelSupport.d.ts","sourceRoot":"","sources":["../../src/utils/bundledBinaryModelSupport.ts"],"names":[],"mappings":"AA8EA;;;;GAIG;AACH,wBAAsB,2BAA2B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBlF"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Detects whether the bundled Claude Code engine (the platform binary shipped
3
+ * inside @anthropic-ai/claude-agent-sdk-<platform>-<arch>) actually recognizes a
4
+ * given model id.
5
+ *
6
+ * Native 1M context is opted into via the `[1m]` model suffix, but the binary
7
+ * only honors it for models baked into its own model table. If the selected model
8
+ * is newer than the bundled binary, the suffix is silently ignored and the model
9
+ * falls back to ~200K — which makes long sessions auto-compact far below their
10
+ * real limit and can break resume (thinking-block signature rejection). This util
11
+ * lets the server surface that silent fallback instead of failing mysteriously.
12
+ */
13
+ import fs from 'fs';
14
+ import path from 'path';
15
+ import os from 'os';
16
+ import { createRequire } from 'module';
17
+ import { isNative1MModel } from '@hammoc/shared';
18
+ import { createLogger } from './logger.js';
19
+ const log = createLogger('bundledBinaryModelSupport');
20
+ /** Claude model ids embedded in the binary, e.g. claude-opus-4-8, claude-sonnet-4-6, claude-opus-4-20250514. */
21
+ const MODEL_ID_RE = /claude-(?:opus|sonnet|haiku)-[0-9]+(?:-[0-9]+)*/g;
22
+ let cache = null;
23
+ let scanPromise = null;
24
+ /** Resolve the platform binary path (claude.exe on Windows, claude elsewhere), or null if not installed. */
25
+ function resolveBundledBinaryPath() {
26
+ const pkg = `@anthropic-ai/claude-agent-sdk-${os.platform()}-${os.arch()}`;
27
+ const exe = os.platform() === 'win32' ? 'claude.exe' : 'claude';
28
+ try {
29
+ const require = createRequire(import.meta.url);
30
+ const pkgJsonPath = require.resolve(`${pkg}/package.json`);
31
+ return path.join(path.dirname(pkgJsonPath), exe);
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ /** Stream the (large) binary in chunks and collect every Claude model id it contains. */
38
+ function scanBinaryForModels(binPath) {
39
+ return new Promise((resolve) => {
40
+ const models = new Set();
41
+ let tail = '';
42
+ const stream = fs.createReadStream(binPath, { encoding: 'latin1', highWaterMark: 1 << 22 });
43
+ stream.on('data', (chunk) => {
44
+ const text = tail + chunk;
45
+ const matches = text.match(MODEL_ID_RE);
46
+ if (matches)
47
+ for (const m of matches)
48
+ models.add(m);
49
+ // keep a small overlap so ids straddling a chunk boundary still match
50
+ tail = text.slice(-64);
51
+ });
52
+ stream.on('end', () => resolve(models));
53
+ stream.on('error', (err) => {
54
+ log.warn(`binary model scan failed: ${err instanceof Error ? err.message : String(err)}`);
55
+ resolve(new Set());
56
+ });
57
+ });
58
+ }
59
+ /** Model ids the bundled binary recognizes (memoized by path+mtime). Empty set if unreadable. */
60
+ async function getRecognizedModels() {
61
+ const binPath = resolveBundledBinaryPath();
62
+ if (!binPath)
63
+ return new Set();
64
+ let mtimeMs = 0;
65
+ try {
66
+ mtimeMs = fs.statSync(binPath).mtimeMs;
67
+ }
68
+ catch {
69
+ return new Set();
70
+ }
71
+ if (cache && cache.path === binPath && cache.mtimeMs === mtimeMs)
72
+ return cache.models;
73
+ if (!scanPromise) {
74
+ scanPromise = scanBinaryForModels(binPath).then((models) => {
75
+ cache = { path: binPath, mtimeMs, models };
76
+ scanPromise = null;
77
+ return models;
78
+ });
79
+ }
80
+ return scanPromise;
81
+ }
82
+ /**
83
+ * True when `model` is a known native-1M model but the bundled binary does NOT
84
+ * recognize it — so its 1M context silently falls back to ~200K. Conservative:
85
+ * returns false (no warning) for bare aliases, unreadable binaries, or uncertainty.
86
+ */
87
+ export async function modelMissingNative1MSupport(model) {
88
+ if (!model)
89
+ return false;
90
+ const base = model.replace(/\[1m\]$/i, '');
91
+ // Only fully-versioned ids are checkable against the binary; bare aliases like
92
+ // 'opus'/'sonnet' resolve to a concrete model server-side, so skip them.
93
+ if (!/^claude-(?:opus|sonnet|haiku)-[0-9]/.test(base))
94
+ return false;
95
+ if (!isNative1MModel(base))
96
+ return false;
97
+ const recognized = await getRecognizedModels();
98
+ if (recognized.size === 0)
99
+ return false; // couldn't read the binary → don't false-warn
100
+ for (const r of recognized) {
101
+ // exact, or either is the date-suffixed snapshot of the other (suffix always starts with '-')
102
+ if (r === base || r.startsWith(`${base}-`) || base.startsWith(`${r}-`))
103
+ return false;
104
+ }
105
+ return true;
106
+ }
107
+ //# sourceMappingURL=bundledBinaryModelSupport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundledBinaryModelSupport.js","sourceRoot":"","sources":["../../src/utils/bundledBinaryModelSupport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,GAAG,GAAG,YAAY,CAAC,2BAA2B,CAAC,CAAC;AAEtD,gHAAgH;AAChH,MAAM,WAAW,GAAG,kDAAkD,CAAC;AAEvE,IAAI,KAAK,GAAkE,IAAI,CAAC;AAChF,IAAI,WAAW,GAAgC,IAAI,CAAC;AAEpD,4GAA4G;AAC5G,SAAS,wBAAwB;IAC/B,MAAM,GAAG,GAAG,kCAAkC,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;IAC3E,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,eAAe,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,yFAAyF;AACzF,SAAS,mBAAmB,CAAC,OAAe;IAC1C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5F,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,MAAM,IAAI,GAAG,IAAI,GAAI,KAAgB,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACxC,IAAI,OAAO;gBAAE,KAAK,MAAM,CAAC,IAAI,OAAO;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACpD,sEAAsE;YACtE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,GAAG,CAAC,IAAI,CAAC,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1F,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,iGAAiG;AACjG,KAAK,UAAU,mBAAmB;IAChC,MAAM,OAAO,GAAG,wBAAwB,EAAE,CAAC;IAC3C,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAC/B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,GAAG,EAAE,CAAC;IAAC,CAAC;IAC3E,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IACtF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACzD,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAC3C,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,KAAc;IAC9D,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3C,+EAA+E;IAC/E,yEAAyE;IACzE,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAEzC,MAAM,UAAU,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAC/C,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,8CAA8C;IAEvF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,8FAA8F;QAC9F,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;IACvF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -6,13 +6,13 @@ import type { ThinkingEffort } from '@hammoc/shared';
6
6
  /**
7
7
  * Clamp unsupported effort levels:
8
8
  * · 'max' → 'high' unless model supports it (Opus 4.6+, Sonnet 4.6)
9
- * · 'xhigh' → 'high' unless model supports it (Opus 4.7 only)
9
+ * · 'xhigh' → 'high' unless model supports it (Opus 4.7+)
10
10
  * Other levels pass through unchanged.
11
11
  */
12
12
  export declare function clampEffortForModel(effort: ThinkingEffort | undefined, model: string | undefined): ThinkingEffort | undefined;
13
13
  /**
14
14
  * Whether the model supports Anthropic's adaptive thinking mode
15
- * (`thinking: { type: 'adaptive' }`). Opus 4.7 requires adaptive;
15
+ * (`thinking: { type: 'adaptive' }`). Opus 4.7+ requires adaptive;
16
16
  * Opus 4.6 and Sonnet 4.6 accept adaptive as the recommended mode.
17
17
  * Older models (Sonnet 4.5, Opus 4.5, Haiku, Sonnet 4, etc.) do NOT
18
18
  * support adaptive and must stay on the legacy `maxThinkingTokens` path.
@@ -5,15 +5,15 @@
5
5
  /**
6
6
  * Clamp unsupported effort levels:
7
7
  * · 'max' → 'high' unless model supports it (Opus 4.6+, Sonnet 4.6)
8
- * · 'xhigh' → 'high' unless model supports it (Opus 4.7 only)
8
+ * · 'xhigh' → 'high' unless model supports it (Opus 4.7+)
9
9
  * Other levels pass through unchanged.
10
10
  */
11
11
  export function clampEffortForModel(effort, model) {
12
12
  if (!effort)
13
13
  return effort;
14
14
  const supportsMax = !!model && (model === 'opus' || model === 'sonnet' ||
15
- model.includes('opus-4-6') || model.includes('opus-4-7') || model.includes('sonnet-4-6'));
16
- const supportsXHigh = !!model && (model === 'opus' || model.includes('opus-4-7'));
15
+ model.includes('opus-4-6') || model.includes('opus-4-7') || model.includes('opus-4-8') || model.includes('sonnet-4-6'));
16
+ const supportsXHigh = !!model && (model === 'opus' || model.includes('opus-4-7') || model.includes('opus-4-8'));
17
17
  if (effort === 'max' && !supportsMax)
18
18
  return 'high';
19
19
  if (effort === 'xhigh' && !supportsXHigh)
@@ -22,7 +22,7 @@ export function clampEffortForModel(effort, model) {
22
22
  }
23
23
  /**
24
24
  * Whether the model supports Anthropic's adaptive thinking mode
25
- * (`thinking: { type: 'adaptive' }`). Opus 4.7 requires adaptive;
25
+ * (`thinking: { type: 'adaptive' }`). Opus 4.7+ requires adaptive;
26
26
  * Opus 4.6 and Sonnet 4.6 accept adaptive as the recommended mode.
27
27
  * Older models (Sonnet 4.5, Opus 4.5, Haiku, Sonnet 4, etc.) do NOT
28
28
  * support adaptive and must stay on the legacy `maxThinkingTokens` path.
@@ -31,6 +31,6 @@ export function supportsAdaptiveThinking(model) {
31
31
  if (!model)
32
32
  return false;
33
33
  return (model === 'opus' || model === 'sonnet' ||
34
- model.includes('opus-4-6') || model.includes('opus-4-7') || model.includes('sonnet-4-6'));
34
+ model.includes('opus-4-6') || model.includes('opus-4-7') || model.includes('opus-4-8') || model.includes('sonnet-4-6'));
35
35
  }
36
36
  //# sourceMappingURL=effortUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"effortUtils.js","sourceRoot":"","sources":["../../src/utils/effortUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAkC,EAAE,KAAyB;IAC/F,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,IAAI,CAC7B,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ;QACtC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CACzF,CAAC;IACF,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IAClF,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,WAAW;QAAE,OAAO,MAAM,CAAC;IACpD,IAAI,MAAM,KAAK,OAAO,IAAI,CAAC,aAAa;QAAE,OAAO,MAAM,CAAC;IACxD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAyB;IAChE,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,CACL,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ;QACtC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CACzF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"effortUtils.js","sourceRoot":"","sources":["../../src/utils/effortUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAkC,EAAE,KAAyB;IAC/F,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,IAAI,CAC7B,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ;QACtC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CACvH,CAAC;IACF,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IAChH,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,WAAW;QAAE,OAAO,MAAM,CAAC;IACpD,IAAI,MAAM,KAAK,OAAO,IAAI,CAAC,aAAa;QAAE,OAAO,MAAM,CAAC;IACxD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAyB;IAChE,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,CACL,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ;QACtC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CACvH,CAAC;AACJ,CAAC"}
@@ -12,6 +12,7 @@ export declare enum SDKErrorCode {
12
12
  NETWORK_ERROR = "NETWORK_ERROR",
13
13
  INVALID_REQUEST = "INVALID_REQUEST",
14
14
  CONTEXT_OVERFLOW = "CONTEXT_OVERFLOW",
15
+ RESUME_THINKING_INVALID = "RESUME_THINKING_INVALID",
15
16
  SERVICE_UNAVAILABLE = "SERVICE_UNAVAILABLE",
16
17
  PERMISSION_DENIED = "PERMISSION_DENIED",
17
18
  INVALID_PATH = "INVALID_PATH",
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,oBAAY,YAAY;IACtB,OAAO,YAAY;IACnB,mBAAmB,wBAAwB;IAC3C,oBAAoB,yBAAyB;IAC7C,aAAa,kBAAkB;IAC/B,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IACrC,mBAAmB,wBAAwB;IAC3C,iBAAiB,sBAAsB;IACvC,YAAY,iBAAiB;IAC7B,OAAO,YAAY;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAWzD,CAAC;AAEF;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC;gBAG7B,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,YAAmC,EACzC,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,KAAK,CAAC;KACvB;IAeH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CASlC;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,QAAQ;gBAC9B,UAAU,GAAE,MAAW,EAAE,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM;CAQ7E;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,QAAQ;gBACnC,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM;CAQpD;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,QAAQ;gBAC5B,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM;CAQpD;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,QAAQ;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM;CASlE;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,QAAQ;gBACvC,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM;CAQpD;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,QAAQ;gBAC5B,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM;CAQpD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAsErE"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,oBAAY,YAAY;IACtB,OAAO,YAAY;IACnB,mBAAmB,wBAAwB;IAC3C,oBAAoB,yBAAyB;IAC7C,aAAa,kBAAkB;IAC/B,eAAe,oBAAoB;IACnC,gBAAgB,qBAAqB;IAIrC,uBAAuB,4BAA4B;IACnD,mBAAmB,wBAAwB;IAC3C,iBAAiB,sBAAsB;IACvC,YAAY,iBAAiB;IAC7B,OAAO,YAAY;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAYzD,CAAC;AAEF;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC;gBAG7B,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,YAAmC,EACzC,OAAO,CAAC,EAAE;QACR,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,KAAK,CAAC;KACvB;IAeH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CASlC;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,QAAQ;gBAC9B,UAAU,GAAE,MAAW,EAAE,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM;CAQ7E;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,QAAQ;gBACnC,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM;CAQpD;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,QAAQ;gBAC5B,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM;CAQpD;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,QAAQ;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM;CASlE;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,QAAQ;gBACvC,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM;CAQpD;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,QAAQ;gBAC5B,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM;CAQpD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAqFrE"}