hammoc 1.5.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 (197) hide show
  1. package/README.md +8 -2
  2. package/package.json +2 -2
  3. package/packages/client/dist/assets/{agentExampleHighlight-BgwTm15v.js → agentExampleHighlight-ltj9ce0U.js} +1 -1
  4. package/packages/client/dist/assets/{commandTokenHighlight-BljHwnrK.js → commandTokenHighlight-ji_ViMb4.js} +1 -1
  5. package/packages/client/dist/assets/{index-D3LxqW3f.js → index-B-DiRGuz.js} +1 -1
  6. package/packages/client/dist/assets/index-B09doO8H.js +139 -0
  7. package/packages/client/dist/assets/{index-NqJdhlek.js → index-BT4RIi0U.js} +535 -510
  8. package/packages/client/dist/assets/index-DyNJ5jEW.css +32 -0
  9. package/packages/client/dist/assets/{snippetTokenHighlight-DWsaQXX0.js → snippetTokenHighlight-CP3v4o2g.js} +1 -1
  10. package/packages/client/dist/index.html +2 -2
  11. package/packages/client/dist/sw.js +1 -1
  12. package/packages/server/dist/controllers/bmadCoreConfigController.d.ts +41 -0
  13. package/packages/server/dist/controllers/bmadCoreConfigController.d.ts.map +1 -0
  14. package/packages/server/dist/controllers/bmadCoreConfigController.js +172 -0
  15. package/packages/server/dist/controllers/bmadCoreConfigController.js.map +1 -0
  16. package/packages/server/dist/controllers/contextBuilderController.d.ts +43 -0
  17. package/packages/server/dist/controllers/contextBuilderController.d.ts.map +1 -0
  18. package/packages/server/dist/controllers/contextBuilderController.js +159 -0
  19. package/packages/server/dist/controllers/contextBuilderController.js.map +1 -0
  20. package/packages/server/dist/controllers/harnessAgentController.d.ts +7 -0
  21. package/packages/server/dist/controllers/harnessAgentController.d.ts.map +1 -1
  22. package/packages/server/dist/controllers/harnessAgentController.js +33 -0
  23. package/packages/server/dist/controllers/harnessAgentController.js.map +1 -1
  24. package/packages/server/dist/controllers/harnessBundleController.d.ts +37 -0
  25. package/packages/server/dist/controllers/harnessBundleController.d.ts.map +1 -0
  26. package/packages/server/dist/controllers/harnessBundleController.js +312 -0
  27. package/packages/server/dist/controllers/harnessBundleController.js.map +1 -0
  28. package/packages/server/dist/controllers/harnessCommandController.d.ts +7 -0
  29. package/packages/server/dist/controllers/harnessCommandController.d.ts.map +1 -1
  30. package/packages/server/dist/controllers/harnessCommandController.js +33 -0
  31. package/packages/server/dist/controllers/harnessCommandController.js.map +1 -1
  32. package/packages/server/dist/controllers/harnessHookController.d.ts.map +1 -1
  33. package/packages/server/dist/controllers/harnessHookController.js +44 -1
  34. package/packages/server/dist/controllers/harnessHookController.js.map +1 -1
  35. package/packages/server/dist/controllers/harnessMcpController.d.ts.map +1 -1
  36. package/packages/server/dist/controllers/harnessMcpController.js +62 -1
  37. package/packages/server/dist/controllers/harnessMcpController.js.map +1 -1
  38. package/packages/server/dist/controllers/harnessShareScopeController.d.ts +9 -0
  39. package/packages/server/dist/controllers/harnessShareScopeController.d.ts.map +1 -1
  40. package/packages/server/dist/controllers/harnessShareScopeController.js +48 -1
  41. package/packages/server/dist/controllers/harnessShareScopeController.js.map +1 -1
  42. package/packages/server/dist/controllers/marketplaceController.d.ts +19 -0
  43. package/packages/server/dist/controllers/marketplaceController.d.ts.map +1 -0
  44. package/packages/server/dist/controllers/marketplaceController.js +74 -0
  45. package/packages/server/dist/controllers/marketplaceController.js.map +1 -0
  46. package/packages/server/dist/controllers/observabilityController.d.ts +32 -0
  47. package/packages/server/dist/controllers/observabilityController.d.ts.map +1 -0
  48. package/packages/server/dist/controllers/observabilityController.js +148 -0
  49. package/packages/server/dist/controllers/observabilityController.js.map +1 -0
  50. package/packages/server/dist/handlers/streamCallbacks.d.ts +8 -0
  51. package/packages/server/dist/handlers/streamCallbacks.d.ts.map +1 -1
  52. package/packages/server/dist/handlers/streamCallbacks.js +8 -0
  53. package/packages/server/dist/handlers/streamCallbacks.js.map +1 -1
  54. package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
  55. package/packages/server/dist/handlers/websocket.js +24 -2
  56. package/packages/server/dist/handlers/websocket.js.map +1 -1
  57. package/packages/server/dist/routes/harness.d.ts.map +1 -1
  58. package/packages/server/dist/routes/harness.js +58 -0
  59. package/packages/server/dist/routes/harness.js.map +1 -1
  60. package/packages/server/dist/services/bmadCoreConfigService.d.ts +86 -0
  61. package/packages/server/dist/services/bmadCoreConfigService.d.ts.map +1 -0
  62. package/packages/server/dist/services/bmadCoreConfigService.js +175 -0
  63. package/packages/server/dist/services/bmadCoreConfigService.js.map +1 -0
  64. package/packages/server/dist/services/bmadStatusService.d.ts +9 -0
  65. package/packages/server/dist/services/bmadStatusService.d.ts.map +1 -1
  66. package/packages/server/dist/services/bmadStatusService.js +59 -6
  67. package/packages/server/dist/services/bmadStatusService.js.map +1 -1
  68. package/packages/server/dist/services/chatService.js +1 -1
  69. package/packages/server/dist/services/chatService.js.map +1 -1
  70. package/packages/server/dist/services/contextBuilderScriptTemplate.d.ts +24 -0
  71. package/packages/server/dist/services/contextBuilderScriptTemplate.d.ts.map +1 -0
  72. package/packages/server/dist/services/contextBuilderScriptTemplate.js +181 -0
  73. package/packages/server/dist/services/contextBuilderScriptTemplate.js.map +1 -0
  74. package/packages/server/dist/services/contextBuilderService.d.ts +68 -0
  75. package/packages/server/dist/services/contextBuilderService.d.ts.map +1 -0
  76. package/packages/server/dist/services/contextBuilderService.js +345 -0
  77. package/packages/server/dist/services/contextBuilderService.js.map +1 -0
  78. package/packages/server/dist/services/fileWatcherService.d.ts.map +1 -1
  79. package/packages/server/dist/services/fileWatcherService.js +40 -0
  80. package/packages/server/dist/services/fileWatcherService.js.map +1 -1
  81. package/packages/server/dist/services/harnessAgentService.d.ts +18 -0
  82. package/packages/server/dist/services/harnessAgentService.d.ts.map +1 -1
  83. package/packages/server/dist/services/harnessAgentService.js +55 -0
  84. package/packages/server/dist/services/harnessAgentService.js.map +1 -1
  85. package/packages/server/dist/services/harnessBundleService.d.ts +145 -0
  86. package/packages/server/dist/services/harnessBundleService.d.ts.map +1 -0
  87. package/packages/server/dist/services/harnessBundleService.js +1318 -0
  88. package/packages/server/dist/services/harnessBundleService.js.map +1 -0
  89. package/packages/server/dist/services/harnessCommandService.d.ts +21 -0
  90. package/packages/server/dist/services/harnessCommandService.d.ts.map +1 -1
  91. package/packages/server/dist/services/harnessCommandService.js +64 -0
  92. package/packages/server/dist/services/harnessCommandService.js.map +1 -1
  93. package/packages/server/dist/services/harnessHookService.d.ts +27 -0
  94. package/packages/server/dist/services/harnessHookService.d.ts.map +1 -1
  95. package/packages/server/dist/services/harnessHookService.js +52 -0
  96. package/packages/server/dist/services/harnessHookService.js.map +1 -1
  97. package/packages/server/dist/services/harnessMcpService.d.ts +24 -1
  98. package/packages/server/dist/services/harnessMcpService.d.ts.map +1 -1
  99. package/packages/server/dist/services/harnessMcpService.js +70 -0
  100. package/packages/server/dist/services/harnessMcpService.js.map +1 -1
  101. package/packages/server/dist/services/harnessShareScopeService.d.ts +19 -0
  102. package/packages/server/dist/services/harnessShareScopeService.d.ts.map +1 -1
  103. package/packages/server/dist/services/harnessShareScopeService.js +65 -0
  104. package/packages/server/dist/services/harnessShareScopeService.js.map +1 -1
  105. package/packages/server/dist/services/issueService.d.ts.map +1 -1
  106. package/packages/server/dist/services/issueService.js +1 -0
  107. package/packages/server/dist/services/issueService.js.map +1 -1
  108. package/packages/server/dist/services/marketplaceService.d.ts +50 -0
  109. package/packages/server/dist/services/marketplaceService.d.ts.map +1 -0
  110. package/packages/server/dist/services/marketplaceService.js +326 -0
  111. package/packages/server/dist/services/marketplaceService.js.map +1 -0
  112. package/packages/server/dist/services/observabilityService.d.ts +87 -0
  113. package/packages/server/dist/services/observabilityService.d.ts.map +1 -0
  114. package/packages/server/dist/services/observabilityService.js +0 -0
  115. package/packages/server/dist/services/observabilityService.js.map +1 -0
  116. package/packages/server/dist/services/queueService.d.ts.map +1 -1
  117. package/packages/server/dist/services/queueService.js +3 -0
  118. package/packages/server/dist/services/queueService.js.map +1 -1
  119. package/packages/server/dist/services/sessionService.d.ts +16 -0
  120. package/packages/server/dist/services/sessionService.d.ts.map +1 -1
  121. package/packages/server/dist/services/sessionService.js +125 -0
  122. package/packages/server/dist/services/sessionService.js.map +1 -1
  123. package/packages/server/dist/services/tokenCountService.d.ts +71 -0
  124. package/packages/server/dist/services/tokenCountService.d.ts.map +1 -0
  125. package/packages/server/dist/services/tokenCountService.js +313 -0
  126. package/packages/server/dist/services/tokenCountService.js.map +1 -0
  127. package/packages/server/dist/snippets/apply-qa-fixes +7 -5
  128. package/packages/server/dist/snippets/qa-review +5 -1
  129. package/packages/server/dist/utils/assertSafeBundlePath.d.ts +29 -0
  130. package/packages/server/dist/utils/assertSafeBundlePath.d.ts.map +1 -0
  131. package/packages/server/dist/utils/assertSafeBundlePath.js +53 -0
  132. package/packages/server/dist/utils/assertSafeBundlePath.js.map +1 -0
  133. package/packages/server/dist/utils/bundledBinaryModelSupport.d.ts +7 -0
  134. package/packages/server/dist/utils/bundledBinaryModelSupport.d.ts.map +1 -0
  135. package/packages/server/dist/utils/bundledBinaryModelSupport.js +107 -0
  136. package/packages/server/dist/utils/bundledBinaryModelSupport.js.map +1 -0
  137. package/packages/server/dist/utils/effortUtils.d.ts +2 -2
  138. package/packages/server/dist/utils/effortUtils.js +5 -5
  139. package/packages/server/dist/utils/effortUtils.js.map +1 -1
  140. package/packages/server/dist/utils/errors.d.ts +1 -0
  141. package/packages/server/dist/utils/errors.d.ts.map +1 -1
  142. package/packages/server/dist/utils/errors.js +17 -0
  143. package/packages/server/dist/utils/errors.js.map +1 -1
  144. package/packages/server/dist/utils/harnessBundleSchema.d.ts +14 -12
  145. package/packages/server/dist/utils/harnessBundleSchema.d.ts.map +1 -1
  146. package/packages/server/dist/utils/harnessBundleSchema.js +11 -1
  147. package/packages/server/dist/utils/harnessBundleSchema.js.map +1 -1
  148. package/packages/server/dist/utils/harnessPaths.d.ts +40 -0
  149. package/packages/server/dist/utils/harnessPaths.d.ts.map +1 -1
  150. package/packages/server/dist/utils/harnessPaths.js +123 -0
  151. package/packages/server/dist/utils/harnessPaths.js.map +1 -1
  152. package/packages/server/package.json +2 -1
  153. package/packages/server/resources/internals/INDEX.md +3 -1
  154. package/packages/server/resources/internals/bmad-qa-fix-marker.md +32 -0
  155. package/packages/server/resources/internals/harness-files.md +22 -0
  156. package/packages/server/resources/internals/observability-storage.md +23 -0
  157. package/packages/server/resources/manual/02-chat.md +2 -2
  158. package/packages/server/resources/manual/05-projects.md +3 -1
  159. package/packages/server/resources/manual/10-project-board.md +4 -3
  160. package/packages/server/resources/manual/11-bmad-method-integration.md +10 -8
  161. package/packages/server/resources/manual/12-harness-workbench.md +82 -1
  162. package/packages/server/resources/manual/13-settings.md +4 -4
  163. package/packages/shared/dist/index.d.ts +4 -0
  164. package/packages/shared/dist/index.d.ts.map +1 -1
  165. package/packages/shared/dist/index.js +8 -0
  166. package/packages/shared/dist/index.js.map +1 -1
  167. package/packages/shared/dist/types/bmadCoreConfig.d.ts +71 -0
  168. package/packages/shared/dist/types/bmadCoreConfig.d.ts.map +1 -0
  169. package/packages/shared/dist/types/bmadCoreConfig.js +30 -0
  170. package/packages/shared/dist/types/bmadCoreConfig.js.map +1 -0
  171. package/packages/shared/dist/types/bmadStatus.d.ts +10 -0
  172. package/packages/shared/dist/types/bmadStatus.d.ts.map +1 -1
  173. package/packages/shared/dist/types/bmadStatus.js.map +1 -1
  174. package/packages/shared/dist/types/board.d.ts +6 -0
  175. package/packages/shared/dist/types/board.d.ts.map +1 -1
  176. package/packages/shared/dist/types/contextBuilder.d.ts +102 -0
  177. package/packages/shared/dist/types/contextBuilder.d.ts.map +1 -0
  178. package/packages/shared/dist/types/contextBuilder.js +55 -0
  179. package/packages/shared/dist/types/contextBuilder.js.map +1 -0
  180. package/packages/shared/dist/types/harnessBundle.d.ts +35 -0
  181. package/packages/shared/dist/types/harnessBundle.d.ts.map +1 -1
  182. package/packages/shared/dist/types/marketplace.d.ts +83 -0
  183. package/packages/shared/dist/types/marketplace.d.ts.map +1 -0
  184. package/packages/shared/dist/types/marketplace.js +18 -0
  185. package/packages/shared/dist/types/marketplace.js.map +1 -0
  186. package/packages/shared/dist/types/observability.d.ts +148 -0
  187. package/packages/shared/dist/types/observability.d.ts.map +1 -0
  188. package/packages/shared/dist/types/observability.js +24 -0
  189. package/packages/shared/dist/types/observability.js.map +1 -0
  190. package/packages/shared/dist/types/preferences.d.ts +2 -0
  191. package/packages/shared/dist/types/preferences.d.ts.map +1 -1
  192. package/packages/shared/dist/types/preferences.js.map +1 -1
  193. package/packages/shared/dist/types/sdk.d.ts +1 -1
  194. package/packages/shared/dist/types/sdk.d.ts.map +1 -1
  195. package/packages/shared/dist/types/sdk.js +1 -1
  196. package/packages/shared/dist/types/sdk.js.map +1 -1
  197. package/packages/client/dist/assets/index-CjyjnXB8.css +0 -32
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Story 31.4: Plugin marketplace catalog controller (read-only).
3
+ *
4
+ * Thin Express handler on top of `marketplaceService`. Mirrors the inline
5
+ * `HARNESS_ERRORS` envelope mapping used by `harnessPluginController` — there
6
+ * is no global Express error middleware, so the handler catches and maps to
7
+ * the common `{ error: { code, message } }` envelope.
8
+ *
9
+ * Only a single GET endpoint exists: the catalog is read-only. Direct
10
+ * install / marketplace-add automation was dropped after Story 31.4 spike #2
11
+ * (negative) — installs are guided via copy-only command blocks, so there are
12
+ * no POST routes here. (See sdk-upstream-issues.md §18.)
13
+ */
14
+ import { z } from 'zod';
15
+ import { HARNESS_ERRORS } from '@hammoc/shared';
16
+ import { marketplaceService } from '../services/marketplaceService.js';
17
+ const projectSlugParam = z.object({
18
+ projectSlug: z.string().min(1),
19
+ });
20
+ const MAPPED_CODES = [
21
+ 'HARNESS_PATH_DENIED',
22
+ 'HARNESS_FORBIDDEN',
23
+ 'HARNESS_FILE_NOT_FOUND',
24
+ 'HARNESS_ROOT_MISSING',
25
+ 'HARNESS_PARSE_ERROR',
26
+ ];
27
+ const MESSAGE_KEY = {
28
+ HARNESS_PATH_DENIED: 'harness.error.pathDenied',
29
+ HARNESS_FORBIDDEN: 'harness.error.forbidden',
30
+ HARNESS_FILE_NOT_FOUND: 'harness.error.fileNotFound',
31
+ HARNESS_ROOT_MISSING: 'harness.error.rootMissing',
32
+ HARNESS_PARSE_ERROR: 'harness.error.parseError',
33
+ };
34
+ function handleError(req, res, error) {
35
+ const nodeError = error;
36
+ for (const key of MAPPED_CODES) {
37
+ const entry = HARNESS_ERRORS[key];
38
+ if (nodeError.code === entry.code) {
39
+ res.status(entry.httpStatus).json({
40
+ error: {
41
+ code: entry.code,
42
+ message: req.t ? req.t(MESSAGE_KEY[key]) : entry.code,
43
+ },
44
+ });
45
+ return;
46
+ }
47
+ }
48
+ res.status(HARNESS_ERRORS.HARNESS_WRITE_ERROR.httpStatus).json({
49
+ error: {
50
+ code: HARNESS_ERRORS.HARNESS_WRITE_ERROR.code,
51
+ message: req.t ? req.t('harness.error.writeError') : HARNESS_ERRORS.HARNESS_WRITE_ERROR.code,
52
+ },
53
+ });
54
+ }
55
+ export const marketplaceController = {
56
+ /** GET /api/harness/marketplace/:projectSlug/catalog */
57
+ async catalog(req, res) {
58
+ const parsed = projectSlugParam.safeParse(req.params);
59
+ if (!parsed.success) {
60
+ res.status(400).json({
61
+ error: { code: 'INVALID_REQUEST', message: parsed.error.issues[0]?.message ?? 'invalid params' },
62
+ });
63
+ return;
64
+ }
65
+ try {
66
+ const result = await marketplaceService.listCatalog(parsed.data.projectSlug);
67
+ res.json(result);
68
+ }
69
+ catch (error) {
70
+ handleError(req, res, error);
71
+ }
72
+ },
73
+ };
74
+ //# sourceMappingURL=marketplaceController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplaceController.js","sourceRoot":"","sources":["../../src/controllers/marketplaceController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAEvE,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC/B,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG;IACnB,qBAAqB;IACrB,mBAAmB;IACnB,wBAAwB;IACxB,sBAAsB;IACtB,qBAAqB;CACb,CAAC;AAEX,MAAM,WAAW,GAAgD;IAC/D,mBAAmB,EAAE,0BAA0B;IAC/C,iBAAiB,EAAE,yBAAyB;IAC5C,sBAAsB,EAAE,4BAA4B;IACpD,oBAAoB,EAAE,2BAA2B;IACjD,mBAAmB,EAAE,0BAA0B;CAChD,CAAC;AAEF,SAAS,WAAW,CAAC,GAAY,EAAE,GAAa,EAAE,KAAc;IAC9D,MAAM,SAAS,GAAG,KAA8B,CAAC;IACjD,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;YAClC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;gBAChC,KAAK,EAAE;oBACL,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;iBACtD;aACF,CAAC,CAAC;YACH,OAAO;QACT,CAAC;IACH,CAAC;IACD,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;QAC7D,KAAK,EAAE;YACL,IAAI,EAAE,cAAc,CAAC,mBAAmB,CAAC,IAAI;YAC7C,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,mBAAmB,CAAC,IAAI;SAC7F;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,wDAAwD;IACxD,KAAK,CAAC,OAAO,CAAC,GAAY,EAAE,GAAa;QACvC,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,gBAAgB,EAAE;aACjG,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC7E,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Story 31.3 (Task A.6): Observability controller (Epic 31).
3
+ *
4
+ * Mounts at:
5
+ * GET /api/harness/observability/:projectSlug/mcp-calls → aggregates + timeline (AC-A1/A2)
6
+ * GET /api/harness/observability/:projectSlug/token-attribution → element sizes (AC-B1)
7
+ * POST /api/harness/observability/:projectSlug/exact-count → count_tokens proxy (AC-B3)
8
+ * GET /api/harness/observability/tokenizer-pref → global tokenizer pref (AC-B4)
9
+ * PUT /api/harness/observability/tokenizer-pref → set it (AC-B4)
10
+ *
11
+ * Mirrors `contextBuilderController` (Story 31.2): success responses are the raw
12
+ * result object; failures are `{ error: { code, message } }` with the message
13
+ * resolved through `req.t!()`. There is no global Express error middleware —
14
+ * codes map to HTTP statuses inline.
15
+ *
16
+ * MCP log itself has NO write endpoint — records are appended by the
17
+ * `streamCallbacks` recorder (read-only collection); only exact-count is a POST.
18
+ */
19
+ import { Request, Response } from 'express';
20
+ export declare const observabilityController: {
21
+ /** GET …/:projectSlug/mcp-calls — filtered aggregates + recent timeline. */
22
+ mcpCalls(req: Request, res: Response): Promise<void>;
23
+ /** GET …/:projectSlug/token-attribution — measured harness element sizes. */
24
+ tokenAttribution(req: Request, res: Response): Promise<void>;
25
+ /** POST …/:projectSlug/exact-count — official count_tokens (cached, non-blocking). */
26
+ exactCount(req: Request, res: Response): Promise<void>;
27
+ /** GET …/tokenizer-pref — current global approximation tokenizer (AC-B4). */
28
+ getTokenizerPref(req: Request, res: Response): Promise<void>;
29
+ /** PUT …/tokenizer-pref — persist the global tokenizer preference (AC-B4). */
30
+ setTokenizerPref(req: Request, res: Response): Promise<void>;
31
+ };
32
+ //# sourceMappingURL=observabilityController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observabilityController.d.ts","sourceRoot":"","sources":["../../src/controllers/observabilityController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AA0D5C,eAAO,MAAM,uBAAuB;IAClC,4EAA4E;kBACxD,OAAO,OAAO,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB1D,6EAA6E;0BACjD,OAAO,OAAO,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlE,sFAAsF;oBAChE,OAAO,OAAO,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB5D,6EAA6E;0BACjD,OAAO,OAAO,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlE,8EAA8E;0BAClD,OAAO,OAAO,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAenE,CAAC"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Story 31.3 (Task A.6): Observability controller (Epic 31).
3
+ *
4
+ * Mounts at:
5
+ * GET /api/harness/observability/:projectSlug/mcp-calls → aggregates + timeline (AC-A1/A2)
6
+ * GET /api/harness/observability/:projectSlug/token-attribution → element sizes (AC-B1)
7
+ * POST /api/harness/observability/:projectSlug/exact-count → count_tokens proxy (AC-B3)
8
+ * GET /api/harness/observability/tokenizer-pref → global tokenizer pref (AC-B4)
9
+ * PUT /api/harness/observability/tokenizer-pref → set it (AC-B4)
10
+ *
11
+ * Mirrors `contextBuilderController` (Story 31.2): success responses are the raw
12
+ * result object; failures are `{ error: { code, message } }` with the message
13
+ * resolved through `req.t!()`. There is no global Express error middleware —
14
+ * codes map to HTTP statuses inline.
15
+ *
16
+ * MCP log itself has NO write endpoint — records are appended by the
17
+ * `streamCallbacks` recorder (read-only collection); only exact-count is a POST.
18
+ */
19
+ import { z } from 'zod';
20
+ import { OBSERVABILITY_TOKENIZER_DEFAULT, OBSERVABILITY_TOKENIZER_OPTIONS, } from '@hammoc/shared';
21
+ import { observabilityService } from '../services/observabilityService.js';
22
+ import { tokenCountService } from '../services/tokenCountService.js';
23
+ import { preferencesService } from '../services/preferencesService.js';
24
+ const projectSlugSchema = z.string().min(1, 'projectSlug is required');
25
+ const mcpCallsQuerySchema = z.object({
26
+ server: z.string().optional(),
27
+ tool: z.string().optional(),
28
+ sessionId: z.string().optional(),
29
+ sinceDays: z.coerce.number().int().positive().optional(),
30
+ });
31
+ const exactCountBodySchema = z.object({
32
+ kind: z.enum(['claudeMd-project', 'claudeMd-global', 'skill', 'contextBuilder']),
33
+ path: z.string().optional(),
34
+ contentHash: z.string(),
35
+ });
36
+ const tokenizerPrefBodySchema = z.object({
37
+ // Only the active options (spike #1 — size/4) are accepted; the toggle still
38
+ // renders any reserved tier disabled (AC-B4.b) but cannot be persisted.
39
+ tokenizer: z.enum(OBSERVABILITY_TOKENIZER_OPTIONS),
40
+ });
41
+ function parseSlug(req, res) {
42
+ const parsed = projectSlugSchema.safeParse(req.params.projectSlug);
43
+ if (!parsed.success) {
44
+ res.status(400).json({
45
+ error: { code: 'INVALID_REQUEST', message: parsed.error.issues[0]?.message ?? 'invalid projectSlug' },
46
+ });
47
+ return null;
48
+ }
49
+ return parsed.data;
50
+ }
51
+ function handleError(req, res, error) {
52
+ const code = error?.code;
53
+ if (code === 'PROJECT_NOT_FOUND') {
54
+ res.status(404).json({ error: { code: 'PROJECT_NOT_FOUND', message: req.t('harness.error.rootMissing') } });
55
+ return;
56
+ }
57
+ if (code === 'EACCES') {
58
+ res.status(403).json({ error: { code: 'HARNESS_FORBIDDEN', message: req.t('harness.error.forbidden') } });
59
+ return;
60
+ }
61
+ res.status(500).json({ error: { code: 'OBSERVABILITY_ERROR', message: req.t('harness.error.writeError') } });
62
+ }
63
+ export const observabilityController = {
64
+ /** GET …/:projectSlug/mcp-calls — filtered aggregates + recent timeline. */
65
+ async mcpCalls(req, res) {
66
+ const projectSlug = parseSlug(req, res);
67
+ if (!projectSlug)
68
+ return;
69
+ const parsed = mcpCallsQuerySchema.safeParse(req.query);
70
+ if (!parsed.success) {
71
+ res.status(400).json({
72
+ error: { code: 'INVALID_REQUEST', message: parsed.error.issues[0]?.message ?? 'invalid query' },
73
+ });
74
+ return;
75
+ }
76
+ try {
77
+ const result = await observabilityService.query(projectSlug, parsed.data);
78
+ res.json(result);
79
+ }
80
+ catch (error) {
81
+ handleError(req, res, error);
82
+ }
83
+ },
84
+ /** GET …/:projectSlug/token-attribution — measured harness element sizes. */
85
+ async tokenAttribution(req, res) {
86
+ const projectSlug = parseSlug(req, res);
87
+ if (!projectSlug)
88
+ return;
89
+ try {
90
+ const items = await tokenCountService.listTokenAttribution(projectSlug);
91
+ res.json({ items });
92
+ }
93
+ catch (error) {
94
+ handleError(req, res, error);
95
+ }
96
+ },
97
+ /** POST …/:projectSlug/exact-count — official count_tokens (cached, non-blocking). */
98
+ async exactCount(req, res) {
99
+ const projectSlug = parseSlug(req, res);
100
+ if (!projectSlug)
101
+ return;
102
+ const parsed = exactCountBodySchema.safeParse(req.body ?? {});
103
+ if (!parsed.success) {
104
+ res.status(400).json({
105
+ error: { code: 'INVALID_REQUEST', message: parsed.error.issues[0]?.message ?? 'invalid body' },
106
+ });
107
+ return;
108
+ }
109
+ try {
110
+ const result = await tokenCountService.exactCount(projectSlug, parsed.data);
111
+ res.json(result);
112
+ }
113
+ catch (error) {
114
+ handleError(req, res, error);
115
+ }
116
+ },
117
+ /** GET …/tokenizer-pref — current global approximation tokenizer (AC-B4). */
118
+ async getTokenizerPref(req, res) {
119
+ try {
120
+ const prefs = await preferencesService.readPreferences();
121
+ res.json({
122
+ tokenizer: prefs.observabilityTokenizer ?? OBSERVABILITY_TOKENIZER_DEFAULT,
123
+ options: [...OBSERVABILITY_TOKENIZER_OPTIONS],
124
+ });
125
+ }
126
+ catch (error) {
127
+ handleError(req, res, error);
128
+ }
129
+ },
130
+ /** PUT …/tokenizer-pref — persist the global tokenizer preference (AC-B4). */
131
+ async setTokenizerPref(req, res) {
132
+ const parsed = tokenizerPrefBodySchema.safeParse(req.body ?? {});
133
+ if (!parsed.success) {
134
+ res.status(400).json({
135
+ error: { code: 'INVALID_REQUEST', message: parsed.error.issues[0]?.message ?? 'invalid body' },
136
+ });
137
+ return;
138
+ }
139
+ try {
140
+ await preferencesService.writePreferences({ observabilityTokenizer: parsed.data.tokenizer });
141
+ res.json({ tokenizer: parsed.data.tokenizer, options: [...OBSERVABILITY_TOKENIZER_OPTIONS] });
142
+ }
143
+ catch (error) {
144
+ handleError(req, res, error);
145
+ }
146
+ },
147
+ };
148
+ //# sourceMappingURL=observabilityController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observabilityController.js","sourceRoot":"","sources":["../../src/controllers/observabilityController.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@
6
6
  * they differ fundamentally between browser and queue paths.
7
7
  */
8
8
  import type { StreamCallbacks, StreamChunk } from '@hammoc/shared';
9
+ import type { McpCallRecorder } from '../services/observabilityService.js';
9
10
  export interface StreamRef {
10
11
  sessionId: string;
11
12
  sockets: {
@@ -36,6 +37,13 @@ export interface CallbackBuilderDeps {
36
37
  getQueueProgress?: () => QueueProgress | undefined;
37
38
  /** Story 25.11: when true, emit 'session:forked' instead of 'session:created'/'session:resumed' */
38
39
  isFork?: boolean;
40
+ /**
41
+ * Story 31.3: optional MCP-call recorder (read-only observability collection).
42
+ * When present, tool-use/result callbacks feed it; the body of args/results is
43
+ * never passed through — only sizes are persisted. Absent on paths that opt
44
+ * out (no behavior change when undefined).
45
+ */
46
+ mcpRecorder?: McpCallRecorder;
39
47
  }
40
48
  export interface CallbackBuilderHooks {
41
49
  /** Called after SDK resolves session ID. Browser: disk write. Queue: state update. */
@@ -1 +1 @@
1
- {"version":3,"file":"streamCallbacks.d.ts","sourceRoot":"","sources":["../../src/handlers/streamCallbacks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EAOZ,MAAM,gBAAgB,CAAC;AAOxB,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3C,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7F,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACrD;AAID,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,qBAAqB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACpE,mBAAmB,EAAE,eAAe,CAAC;IACrC,+FAA+F;IAC/F,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mGAAmG;IACnG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,aAAa,GAAG,SAAS,CAAC;IACnD,mGAAmG;IACnG,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,sFAAsF;IACtF,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,oFAAoF;IACpF,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACnD,6EAA6E;IAC7E,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,eAAe,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,mBAAmB,EACzB,KAAK,CAAC,EAAE,oBAAoB,GAC3B,WAAW,CAyHb"}
1
+ {"version":3,"file":"streamCallbacks.d.ts","sourceRoot":"","sources":["../../src/handlers/streamCallbacks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EAOZ,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAO3E,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3C,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7F,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACrD;AAID,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,qBAAqB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACpE,mBAAmB,EAAE,eAAe,CAAC;IACrC,+FAA+F;IAC/F,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mGAAmG;IACnG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,aAAa,GAAG,SAAS,CAAC;IACnD,mGAAmG;IACnG,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,sFAAsF;IACtF,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,oFAAoF;IACpF,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACnD,6EAA6E;IAC7E,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,eAAe,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,mBAAmB,EACzB,KAAK,CAAC,EAAE,oBAAoB,GAC3B,WAAW,CAkIb"}
@@ -54,6 +54,8 @@ export function buildStreamCallbacks(deps, hooks) {
54
54
  input: toolCall.input,
55
55
  startedAt: Date.now(),
56
56
  });
57
+ // Story 31.3 — buffer start info (size only, body discarded).
58
+ deps.mcpRecorder?.onToolUse(toolCall.id, toolCall.name, toolCall.input);
57
59
  },
58
60
  onToolInputUpdate: (toolCallId, input) => {
59
61
  activity?.('onToolInputUpdate');
@@ -63,6 +65,8 @@ export function buildStreamCallbacks(deps, hooks) {
63
65
  activity?.('onToolResult');
64
66
  log.debug(`onToolResult: id=${toolCallId}, success=${result.success}`);
65
67
  emit('tool:result', { toolCallId, result });
68
+ // Story 31.3 — append the completed record (size only, body discarded).
69
+ deps.mcpRecorder?.onToolResult(toolCallId, result, sessionIdRef.current);
66
70
  },
67
71
  onCompact: (metadata) => {
68
72
  activity?.('onCompact');
@@ -88,6 +92,8 @@ export function buildStreamCallbacks(deps, hooks) {
88
92
  },
89
93
  onResultError: (data) => {
90
94
  emit('result:error', data);
95
+ // Story 31.3 — flush any orphan (started-never-returned) calls on error end.
96
+ deps.mcpRecorder?.onTurnEnd(sessionIdRef.current);
91
97
  },
92
98
  onComplete: (response) => {
93
99
  emit('message:complete', {
@@ -104,6 +110,8 @@ export function buildStreamCallbacks(deps, hooks) {
104
110
  if (notificationService.shouldNotify(stream.sockets.size)) {
105
111
  notificationService.notifyComplete(stream.sessionId, response.content, deps.getQueueProgress?.());
106
112
  }
113
+ // Story 31.3 — flush any orphan (started-never-returned) calls at turn end.
114
+ deps.mcpRecorder?.onTurnEnd(sessionIdRef.current);
107
115
  },
108
116
  // onError: intentionally omitted — callers provide their own
109
117
  // onActivity: intentionally omitted — browser-only
@@ -1 +1 @@
1
- {"version":3,"file":"streamCallbacks.js","sourceRoot":"","sources":["../../src/handlers/streamCallbacks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"streamCallbacks.js","sourceRoot":"","sources":["../../src/handlers/streamCallbacks.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/handlers/websocket.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/handlers/websocket.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAG7D,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,UAAU,EAMV,SAAS,EACV,MAAM,gBAAgB,CAAC;AAQxB,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAuGzD,KAAK,UAAU,GAAG,MAAM,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC;AAEpG,UAAU,iBAAiB;IACzB,OAAO,EAAE,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;IACnH,eAAe,EAAE,YAAY,GAAG,UAAU,CAAC;CAC5C;AAED,UAAU,YAAY;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACnD,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mFAAmF;IACnF,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAmCD,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAMpF;AAsSD,8DAA8D;AAC9D,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAIpD;AAED,sFAAsF;AACtF,wBAAgB,+BAA+B,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAUrE;AAED,8DAA8D;AAC9D,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAG7D;AAED,8EAA8E;AAC9E,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAU7E;AAsID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,eAAe,EAChC,WAAW,CAAC,EAAE,MAAM,GACnB;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC9C,CAmCA;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAyB5E;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BrE;AAuBD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAO9E;AAoBD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,cAAc,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC,CAg9CpG;AAED;;;;GAIG;AACH,wBAAgB,KAAK,IAAI,cAAc,CACrC,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,UAAU,CACX,CAKA;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CACxC,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD"}
@@ -22,7 +22,9 @@ import { preferencesService } from '../services/preferencesService.js';
22
22
  import { getOrCreateQueueService, getQueueInstances } from '../controllers/queueController.js';
23
23
  import { createLogger } from '../utils/logger.js';
24
24
  import { clampEffortForModel, supportsAdaptiveThinking } from '../utils/effortUtils.js';
25
+ import { modelMissingNative1MSupport } from '../utils/bundledBinaryModelSupport.js';
25
26
  import { buildStreamCallbacks } from './streamCallbacks.js';
27
+ import { createMcpCallRecorder } from '../services/observabilityService.js';
26
28
  import { rateLimitProbeService } from '../services/rateLimitProbeService.js';
27
29
  import { ptyService } from '../services/ptyService.js';
28
30
  import { projectService } from '../services/projectService.js';
@@ -37,6 +39,8 @@ import { isSnippetRef, resolveSnippet, listSnippets, SnippetError } from '../uti
37
39
  const log = createLogger('websocket');
38
40
  // Alias for concise usage in guards
39
41
  const queueInstances = getQueueInstances;
42
+ // Defense B: models already warned about a stale-binary 1M fallback (warn once per model per process)
43
+ const warnedMissing1M = new Set();
40
44
  // Socket-to-terminal mapping: socket.id → Set of terminalIds (Story 17.1)
41
45
  const socketTerminals = new Map();
42
46
  // Story 20.1: Session-to-project mapping for dashboard triggers
@@ -2385,7 +2389,7 @@ async function handleChatSend(stream, data, abortController, lang) {
2385
2389
  // Load preferences early for advanced settings + timeout
2386
2390
  const effectivePrefs = await preferencesService.getEffectivePreferences();
2387
2391
  const effectiveEffort = clampEffortForModel(effort ?? effectivePrefs.defaultEffort, model);
2388
- // Opus 4.7 flipped `thinking.display` default to 'omitted' — ThinkingBlock UI stays blank
2392
+ // Opus 4.7+ flipped `thinking.display` default to 'omitted' — ThinkingBlock UI stays blank
2389
2393
  // unless we explicitly opt in. For adaptive-thinking models, forward an explicit `thinking`
2390
2394
  // config based on the user's showThinkingBlocks preference (Hammoc default: true).
2391
2395
  // Legacy models (Sonnet 4.5, Opus 4.5, Haiku, Sonnet 4) keep the `maxThinkingTokens` path
@@ -2403,7 +2407,7 @@ async function handleChatSend(stream, data, abortController, lang) {
2403
2407
  // Advanced settings from preferences
2404
2408
  customSystemPrompt: effectivePrefs.customSystemPrompt,
2405
2409
  // maxThinkingTokens: legacy path; SDK docs say it takes precedence for backward-compat,
2406
- // which conflicts with adaptive mode on Opus 4.7 (rejects enabled+budget). Skip on
2410
+ // which conflicts with adaptive mode on Opus 4.7+ (rejects enabled+budget). Skip on
2407
2411
  // adaptive-capable models so the explicit `thinking` field governs.
2408
2412
  ...(!adaptiveCapable && { maxThinkingTokens: effectivePrefs.maxThinkingTokens }),
2409
2413
  ...(thinkingConfig && { thinking: thinkingConfig }),
@@ -2518,6 +2522,10 @@ async function handleChatSend(stream, data, abortController, lang) {
2518
2522
  rekeyStream: (sid) => rekeyStream(stream, sid),
2519
2523
  broadcastStreamChange,
2520
2524
  notificationService,
2525
+ // Story 31.3 — browser path resolves projectSlug from the working dir
2526
+ // (async; memoized by the recorder). append is read-only so the lazy
2527
+ // slug resolution cannot disrupt the stream.
2528
+ mcpRecorder: createMcpCallRecorder(() => projectService.findProjectByPath(workingDirectory).then((p) => p?.projectSlug)),
2521
2529
  }, {
2522
2530
  onCallbackActivity: (source) => resetTimeout(source),
2523
2531
  onSessionIdResolved: (sid) => {
@@ -2611,6 +2619,20 @@ async function handleChatSend(stream, data, abortController, lang) {
2611
2619
  origOnError?.(error);
2612
2620
  };
2613
2621
  }
2622
+ // Defense B: if the bundled engine doesn't recognize this native-1M model, its
2623
+ // 1M context silently falls back to ~200K (long sessions then compact early and
2624
+ // can break on resume). Warn once per model so the fallback isn't invisible.
2625
+ // Non-blocking: the binary scan must not delay the query.
2626
+ const warnModel = model;
2627
+ if (warnModel && !warnedMissing1M.has(warnModel)) {
2628
+ void modelMissingNative1MSupport(warnModel).then((missing) => {
2629
+ if (missing && !warnedMissing1M.has(warnModel)) {
2630
+ warnedMissing1M.add(warnModel);
2631
+ log.warn(`Bundled Claude Code engine does not recognize model "${warnModel}" — native 1M context will not apply (falls back to ~200K). Update @anthropic-ai/claude-agent-sdk.`);
2632
+ emit('system:info', { message: `⚠️ "${warnModel}" 1M context is not active — the bundled engine doesn't recognize this model yet, so it's limited to ~200K. Update @anthropic-ai/claude-agent-sdk to enable the full 1M window.` });
2633
+ }
2634
+ }).catch(() => { });
2635
+ }
2614
2636
  try {
2615
2637
  const sendResult = await chatService.sendMessageWithCallbacks(content, callbacks, chatOptions, canUseTool, (messageType) => {
2616
2638
  resetTimeout(`raw:${messageType}`);