specmem-hardwicksoftware 3.5.99

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 (1473) hide show
  1. package/CHANGELOG.md +299 -0
  2. package/LICENSE.md +6406 -0
  3. package/README.md +539 -0
  4. package/bin/AegisTheme.cjs +1022 -0
  5. package/bin/AnsiRenderer.cjs +1055 -0
  6. package/bin/BoxRenderer.cjs +605 -0
  7. package/bin/ClaudeLiveScreen.cjs +1299 -0
  8. package/bin/DashboardModules.cjs +733 -0
  9. package/bin/LiveScreenCapture.cjs +1012 -0
  10. package/bin/MemoryBrowserScreen.cjs +1595 -0
  11. package/bin/TabManager.cjs +1414 -0
  12. package/bin/checkAgentStatus-fix.patch +30 -0
  13. package/bin/mcp-socket-client.cjs +462 -0
  14. package/bin/screen-utils.cjs +106 -0
  15. package/bin/specmem-autoclaude.cjs +663 -0
  16. package/bin/specmem-cleanup.cjs +421 -0
  17. package/bin/specmem-cli.cjs +794 -0
  18. package/bin/specmem-console-teamcomms-class.cjs +428 -0
  19. package/bin/specmem-console.cjs +8104 -0
  20. package/bin/specmem-statusbar.cjs +530 -0
  21. package/bootstrap.cjs +5065 -0
  22. package/claude-hooks/agent-chooser-hook.js +179 -0
  23. package/claude-hooks/agent-chooser-inject.js +121 -0
  24. package/claude-hooks/agent-loading-hook.js +990 -0
  25. package/claude-hooks/agent-output-fader.cjs +542 -0
  26. package/claude-hooks/agent-output-interceptor.js +193 -0
  27. package/claude-hooks/agent-type-matcher.js +419 -0
  28. package/claude-hooks/auto-bypass.py +74 -0
  29. package/claude-hooks/background-completion-silencer.js +134 -0
  30. package/claude-hooks/bash-auto-background.js +182 -0
  31. package/claude-hooks/build-cedict-dictionary.mjs +167 -0
  32. package/claude-hooks/bullshit-radar.cjs +323 -0
  33. package/claude-hooks/cedict-codes.json +270 -0
  34. package/claude-hooks/cedict-extracted.json +22632 -0
  35. package/claude-hooks/claude-watchdog.sh +401 -0
  36. package/claude-hooks/context-dedup.cjs +144 -0
  37. package/claude-hooks/context-yeeter.cjs +244 -0
  38. package/claude-hooks/debug-suffix.cjs +15 -0
  39. package/claude-hooks/debug2.cjs +7 -0
  40. package/claude-hooks/drilldown-enforcer.js +242 -0
  41. package/claude-hooks/english-morphology-standalone.cjs +149 -0
  42. package/claude-hooks/english-morphology.cjs +152 -0
  43. package/claude-hooks/extract-translations.mjs +193 -0
  44. package/claude-hooks/file-claim-enforcer.cjs +293 -0
  45. package/claude-hooks/file-claim-enforcer.js +293 -0
  46. package/claude-hooks/find-collisions.cjs +39 -0
  47. package/claude-hooks/fix-abbreviations.cjs +60 -0
  48. package/claude-hooks/fix-collisions.cjs +60 -0
  49. package/claude-hooks/fix-decompressor.cjs +79 -0
  50. package/claude-hooks/fix-suffixes.cjs +66 -0
  51. package/claude-hooks/grammar-engine.cjs +159 -0
  52. package/claude-hooks/input-aware-improver.js +231 -0
  53. package/claude-hooks/is-agent.cjs +64 -0
  54. package/claude-hooks/mega-test.cjs +213 -0
  55. package/claude-hooks/merge-dictionaries.mjs +207 -0
  56. package/claude-hooks/merged-codes.cjs +22675 -0
  57. package/claude-hooks/merged-codes.json +22676 -0
  58. package/claude-hooks/output-cleaner.cjs +388 -0
  59. package/claude-hooks/post-write-memory-hook.cjs +430 -0
  60. package/claude-hooks/quick-test.cjs +24 -0
  61. package/claude-hooks/quick-test2.cjs +24 -0
  62. package/claude-hooks/remove-bad-codes.cjs +23 -0
  63. package/claude-hooks/search-reminder-hook.js +90 -0
  64. package/claude-hooks/semantic-test.cjs +93 -0
  65. package/claude-hooks/settings.json +445 -0
  66. package/claude-hooks/smart-context-hook.cjs +547 -0
  67. package/claude-hooks/smart-context-hook.js +539 -0
  68. package/claude-hooks/smart-search-interceptor.js +364 -0
  69. package/claude-hooks/socket-connect-helper.cjs +235 -0
  70. package/claude-hooks/specmem/sockets/session-start.lock +1 -0
  71. package/claude-hooks/specmem-context-hook.cjs +357 -0
  72. package/claude-hooks/specmem-context-hook.js +357 -0
  73. package/claude-hooks/specmem-drilldown-hook.cjs +480 -0
  74. package/claude-hooks/specmem-drilldown-hook.js +480 -0
  75. package/claude-hooks/specmem-drilldown-setter.js +210 -0
  76. package/claude-hooks/specmem-paths.cjs +213 -0
  77. package/claude-hooks/specmem-precompact.js +183 -0
  78. package/claude-hooks/specmem-session-init.sh +33 -0
  79. package/claude-hooks/specmem-session-start.cjs +498 -0
  80. package/claude-hooks/specmem-stop-hook.cjs +73 -0
  81. package/claude-hooks/specmem-stop-hook.js +5 -0
  82. package/claude-hooks/specmem-team-comms.cjs +434 -0
  83. package/claude-hooks/specmem-team-member-inject.js +271 -0
  84. package/claude-hooks/specmem-unified-hook.py +670 -0
  85. package/claude-hooks/subagent-loading-hook.js +194 -0
  86. package/claude-hooks/sysprompt-squisher.cjs +167 -0
  87. package/claude-hooks/task-progress-hook.js +204 -0
  88. package/claude-hooks/team-comms-enforcer.cjs +585 -0
  89. package/claude-hooks/test-accuracy.cjs +27 -0
  90. package/claude-hooks/test-big.cjs +28 -0
  91. package/claude-hooks/test-inflectors.cjs +39 -0
  92. package/claude-hooks/test-pluralize.cjs +37 -0
  93. package/claude-hooks/test-quick.cjs +8 -0
  94. package/claude-hooks/test-wink.cjs +20 -0
  95. package/claude-hooks/token-compressor.cjs +940 -0
  96. package/claude-hooks/use-code-pointers.cjs +279 -0
  97. package/commands/COMMAND_TOOL_MAP.md +299 -0
  98. package/commands/specmem-agents.md +412 -0
  99. package/commands/specmem-autoclaude.md +295 -0
  100. package/commands/specmem-changes.md +247 -0
  101. package/commands/specmem-code.md +103 -0
  102. package/commands/specmem-configteammembercomms.md +322 -0
  103. package/commands/specmem-drilldown.md +208 -0
  104. package/commands/specmem-find.md +195 -0
  105. package/commands/specmem-getdashboard.md +243 -0
  106. package/commands/specmem-hooks.md +219 -0
  107. package/commands/specmem-pointers.md +149 -0
  108. package/commands/specmem-progress.md +287 -0
  109. package/commands/specmem-remember.md +123 -0
  110. package/commands/specmem-service.md +349 -0
  111. package/commands/specmem-stats.md +189 -0
  112. package/commands/specmem-team-member.md +409 -0
  113. package/commands/specmem-webdev.md +583 -0
  114. package/commands/specmem.md +363 -0
  115. package/dist/autoStart/index.d.ts +214 -0
  116. package/dist/autoStart/index.d.ts.map +1 -0
  117. package/dist/autoStart/index.js +883 -0
  118. package/dist/autoStart/index.js.map +1 -0
  119. package/dist/claude-sessions/contextRestorationParser.d.ts +74 -0
  120. package/dist/claude-sessions/contextRestorationParser.d.ts.map +1 -0
  121. package/dist/claude-sessions/contextRestorationParser.js +570 -0
  122. package/dist/claude-sessions/contextRestorationParser.js.map +1 -0
  123. package/dist/claude-sessions/index.d.ts +13 -0
  124. package/dist/claude-sessions/index.d.ts.map +1 -0
  125. package/dist/claude-sessions/index.js +11 -0
  126. package/dist/claude-sessions/index.js.map +1 -0
  127. package/dist/claude-sessions/sessionIntegration.d.ts +48 -0
  128. package/dist/claude-sessions/sessionIntegration.d.ts.map +1 -0
  129. package/dist/claude-sessions/sessionIntegration.js +146 -0
  130. package/dist/claude-sessions/sessionIntegration.js.map +1 -0
  131. package/dist/claude-sessions/sessionParser.d.ts +293 -0
  132. package/dist/claude-sessions/sessionParser.d.ts.map +1 -0
  133. package/dist/claude-sessions/sessionParser.js +1028 -0
  134. package/dist/claude-sessions/sessionParser.js.map +1 -0
  135. package/dist/claude-sessions/sessionWatcher.d.ts +139 -0
  136. package/dist/claude-sessions/sessionWatcher.d.ts.map +1 -0
  137. package/dist/claude-sessions/sessionWatcher.js +722 -0
  138. package/dist/claude-sessions/sessionWatcher.js.map +1 -0
  139. package/dist/cli/deploy-to-claude.d.ts +56 -0
  140. package/dist/cli/deploy-to-claude.d.ts.map +1 -0
  141. package/dist/cli/deploy-to-claude.js +576 -0
  142. package/dist/cli/deploy-to-claude.js.map +1 -0
  143. package/dist/code-explanations/explainCode.d.ts +86 -0
  144. package/dist/code-explanations/explainCode.d.ts.map +1 -0
  145. package/dist/code-explanations/explainCode.js +286 -0
  146. package/dist/code-explanations/explainCode.js.map +1 -0
  147. package/dist/code-explanations/feedback.d.ts +87 -0
  148. package/dist/code-explanations/feedback.d.ts.map +1 -0
  149. package/dist/code-explanations/feedback.js +212 -0
  150. package/dist/code-explanations/feedback.js.map +1 -0
  151. package/dist/code-explanations/getRelatedCode.d.ts +80 -0
  152. package/dist/code-explanations/getRelatedCode.d.ts.map +1 -0
  153. package/dist/code-explanations/getRelatedCode.js +262 -0
  154. package/dist/code-explanations/getRelatedCode.js.map +1 -0
  155. package/dist/code-explanations/index.d.ts +284 -0
  156. package/dist/code-explanations/index.d.ts.map +1 -0
  157. package/dist/code-explanations/index.js +249 -0
  158. package/dist/code-explanations/index.js.map +1 -0
  159. package/dist/code-explanations/linkCodeToPrompt.d.ts +79 -0
  160. package/dist/code-explanations/linkCodeToPrompt.d.ts.map +1 -0
  161. package/dist/code-explanations/linkCodeToPrompt.js +213 -0
  162. package/dist/code-explanations/linkCodeToPrompt.js.map +1 -0
  163. package/dist/code-explanations/recallExplanation.d.ts +88 -0
  164. package/dist/code-explanations/recallExplanation.d.ts.map +1 -0
  165. package/dist/code-explanations/recallExplanation.js +218 -0
  166. package/dist/code-explanations/recallExplanation.js.map +1 -0
  167. package/dist/code-explanations/schema.d.ts +32 -0
  168. package/dist/code-explanations/schema.d.ts.map +1 -0
  169. package/dist/code-explanations/schema.js +221 -0
  170. package/dist/code-explanations/schema.js.map +1 -0
  171. package/dist/code-explanations/semanticSearch.d.ts +75 -0
  172. package/dist/code-explanations/semanticSearch.d.ts.map +1 -0
  173. package/dist/code-explanations/semanticSearch.js +203 -0
  174. package/dist/code-explanations/semanticSearch.js.map +1 -0
  175. package/dist/code-explanations/types.d.ts +328 -0
  176. package/dist/code-explanations/types.d.ts.map +1 -0
  177. package/dist/code-explanations/types.js +122 -0
  178. package/dist/code-explanations/types.js.map +1 -0
  179. package/dist/codebase/codeAnalyzer.d.ts +272 -0
  180. package/dist/codebase/codeAnalyzer.d.ts.map +1 -0
  181. package/dist/codebase/codeAnalyzer.js +1353 -0
  182. package/dist/codebase/codeAnalyzer.js.map +1 -0
  183. package/dist/codebase/codebaseIndexer.d.ts +360 -0
  184. package/dist/codebase/codebaseIndexer.d.ts.map +1 -0
  185. package/dist/codebase/codebaseIndexer.js +1735 -0
  186. package/dist/codebase/codebaseIndexer.js.map +1 -0
  187. package/dist/codebase/codebaseTools.d.ts +853 -0
  188. package/dist/codebase/codebaseTools.d.ts.map +1 -0
  189. package/dist/codebase/codebaseTools.js +1279 -0
  190. package/dist/codebase/codebaseTools.js.map +1 -0
  191. package/dist/codebase/exclusions.d.ts +111 -0
  192. package/dist/codebase/exclusions.d.ts.map +1 -0
  193. package/dist/codebase/exclusions.js +771 -0
  194. package/dist/codebase/exclusions.js.map +1 -0
  195. package/dist/codebase/fileWatcher.d.ts +135 -0
  196. package/dist/codebase/fileWatcher.d.ts.map +1 -0
  197. package/dist/codebase/fileWatcher.js +309 -0
  198. package/dist/codebase/fileWatcher.js.map +1 -0
  199. package/dist/codebase/index.d.ts +33 -0
  200. package/dist/codebase/index.d.ts.map +1 -0
  201. package/dist/codebase/index.js +77 -0
  202. package/dist/codebase/index.js.map +1 -0
  203. package/dist/codebase/ingestion.d.ts +177 -0
  204. package/dist/codebase/ingestion.d.ts.map +1 -0
  205. package/dist/codebase/ingestion.js +690 -0
  206. package/dist/codebase/ingestion.js.map +1 -0
  207. package/dist/codebase/languageDetection.d.ts +75 -0
  208. package/dist/codebase/languageDetection.d.ts.map +1 -0
  209. package/dist/codebase/languageDetection.js +768 -0
  210. package/dist/codebase/languageDetection.js.map +1 -0
  211. package/dist/commands/codebaseCommands.d.ts +101 -0
  212. package/dist/commands/codebaseCommands.d.ts.map +1 -0
  213. package/dist/commands/codebaseCommands.js +911 -0
  214. package/dist/commands/codebaseCommands.js.map +1 -0
  215. package/dist/commands/commandHandler.d.ts +126 -0
  216. package/dist/commands/commandHandler.d.ts.map +1 -0
  217. package/dist/commands/commandHandler.js +296 -0
  218. package/dist/commands/commandHandler.js.map +1 -0
  219. package/dist/commands/commandLoader.d.ts +103 -0
  220. package/dist/commands/commandLoader.d.ts.map +1 -0
  221. package/dist/commands/commandLoader.js +223 -0
  222. package/dist/commands/commandLoader.js.map +1 -0
  223. package/dist/commands/contextCommands.d.ts +83 -0
  224. package/dist/commands/contextCommands.d.ts.map +1 -0
  225. package/dist/commands/contextCommands.js +512 -0
  226. package/dist/commands/contextCommands.js.map +1 -0
  227. package/dist/commands/index.d.ts +24 -0
  228. package/dist/commands/index.d.ts.map +1 -0
  229. package/dist/commands/index.js +28 -0
  230. package/dist/commands/index.js.map +1 -0
  231. package/dist/commands/mcpResources.d.ts +50 -0
  232. package/dist/commands/mcpResources.d.ts.map +1 -0
  233. package/dist/commands/mcpResources.js +372 -0
  234. package/dist/commands/mcpResources.js.map +1 -0
  235. package/dist/commands/memoryCommands.d.ts +74 -0
  236. package/dist/commands/memoryCommands.d.ts.map +1 -0
  237. package/dist/commands/memoryCommands.js +609 -0
  238. package/dist/commands/memoryCommands.js.map +1 -0
  239. package/dist/commands/promptCommands.d.ts +91 -0
  240. package/dist/commands/promptCommands.d.ts.map +1 -0
  241. package/dist/commands/promptCommands.js +801 -0
  242. package/dist/commands/promptCommands.js.map +1 -0
  243. package/dist/commands/teamMemberCommands.d.ts +21 -0
  244. package/dist/commands/teamMemberCommands.d.ts.map +1 -0
  245. package/dist/commands/teamMemberCommands.js +137 -0
  246. package/dist/commands/teamMemberCommands.js.map +1 -0
  247. package/dist/comms/fileCommsTransport.d.ts +91 -0
  248. package/dist/comms/fileCommsTransport.d.ts.map +1 -0
  249. package/dist/comms/fileCommsTransport.js +244 -0
  250. package/dist/comms/fileCommsTransport.js.map +1 -0
  251. package/dist/comms/index.d.ts +7 -0
  252. package/dist/comms/index.d.ts.map +1 -0
  253. package/dist/comms/index.js +7 -0
  254. package/dist/comms/index.js.map +1 -0
  255. package/dist/config/apiKeyDetection.d.ts +41 -0
  256. package/dist/config/apiKeyDetection.d.ts.map +1 -0
  257. package/dist/config/apiKeyDetection.js +211 -0
  258. package/dist/config/apiKeyDetection.js.map +1 -0
  259. package/dist/config/autoConfig.d.ts +188 -0
  260. package/dist/config/autoConfig.d.ts.map +1 -0
  261. package/dist/config/autoConfig.js +850 -0
  262. package/dist/config/autoConfig.js.map +1 -0
  263. package/dist/config/configSync.d.ts +119 -0
  264. package/dist/config/configSync.d.ts.map +1 -0
  265. package/dist/config/configSync.js +878 -0
  266. package/dist/config/configSync.js.map +1 -0
  267. package/dist/config/embeddingTimeouts.d.ts +145 -0
  268. package/dist/config/embeddingTimeouts.d.ts.map +1 -0
  269. package/dist/config/embeddingTimeouts.js +255 -0
  270. package/dist/config/embeddingTimeouts.js.map +1 -0
  271. package/dist/config/index.d.ts +5 -0
  272. package/dist/config/index.d.ts.map +1 -0
  273. package/dist/config/index.js +7 -0
  274. package/dist/config/index.js.map +1 -0
  275. package/dist/config/languageConfig.d.ts +68 -0
  276. package/dist/config/languageConfig.d.ts.map +1 -0
  277. package/dist/config/languageConfig.js +473 -0
  278. package/dist/config/languageConfig.js.map +1 -0
  279. package/dist/config/password.d.ts +145 -0
  280. package/dist/config/password.d.ts.map +1 -0
  281. package/dist/config/password.js +428 -0
  282. package/dist/config/password.js.map +1 -0
  283. package/dist/config.d.ts +338 -0
  284. package/dist/config.d.ts.map +1 -0
  285. package/dist/config.js +1177 -0
  286. package/dist/config.js.map +1 -0
  287. package/dist/consolidation.d.ts +44 -0
  288. package/dist/consolidation.d.ts.map +1 -0
  289. package/dist/consolidation.js +447 -0
  290. package/dist/consolidation.js.map +1 -0
  291. package/dist/constants.d.ts +371 -0
  292. package/dist/constants.d.ts.map +1 -0
  293. package/dist/constants.js +552 -0
  294. package/dist/constants.js.map +1 -0
  295. package/dist/coordination/TeamMemberRegistry.d.ts +192 -0
  296. package/dist/coordination/TeamMemberRegistry.d.ts.map +1 -0
  297. package/dist/coordination/TeamMemberRegistry.js +415 -0
  298. package/dist/coordination/TeamMemberRegistry.js.map +1 -0
  299. package/dist/coordination/events.d.ts +369 -0
  300. package/dist/coordination/events.d.ts.map +1 -0
  301. package/dist/coordination/events.js +232 -0
  302. package/dist/coordination/events.js.map +1 -0
  303. package/dist/coordination/handlers.d.ts +116 -0
  304. package/dist/coordination/handlers.d.ts.map +1 -0
  305. package/dist/coordination/handlers.js +400 -0
  306. package/dist/coordination/handlers.js.map +1 -0
  307. package/dist/coordination/index.d.ts +14 -0
  308. package/dist/coordination/index.d.ts.map +1 -0
  309. package/dist/coordination/index.js +31 -0
  310. package/dist/coordination/index.js.map +1 -0
  311. package/dist/coordination/integration.d.ts +260 -0
  312. package/dist/coordination/integration.d.ts.map +1 -0
  313. package/dist/coordination/integration.js +472 -0
  314. package/dist/coordination/integration.js.map +1 -0
  315. package/dist/coordination/server.d.ts +266 -0
  316. package/dist/coordination/server.d.ts.map +1 -0
  317. package/dist/coordination/server.js +995 -0
  318. package/dist/coordination/server.js.map +1 -0
  319. package/dist/coordination/serviceProvider.d.ts +70 -0
  320. package/dist/coordination/serviceProvider.d.ts.map +1 -0
  321. package/dist/coordination/serviceProvider.js +273 -0
  322. package/dist/coordination/serviceProvider.js.map +1 -0
  323. package/dist/dashboard/api/claudeControl.d.ts +44 -0
  324. package/dist/dashboard/api/claudeControl.d.ts.map +1 -0
  325. package/dist/dashboard/api/claudeControl.js +650 -0
  326. package/dist/dashboard/api/claudeControl.js.map +1 -0
  327. package/dist/dashboard/api/claudeHistory.d.ts +4 -0
  328. package/dist/dashboard/api/claudeHistory.d.ts.map +1 -0
  329. package/dist/dashboard/api/claudeHistory.js +319 -0
  330. package/dist/dashboard/api/claudeHistory.js.map +1 -0
  331. package/dist/dashboard/api/dataExport.d.ts +23 -0
  332. package/dist/dashboard/api/dataExport.d.ts.map +1 -0
  333. package/dist/dashboard/api/dataExport.js +509 -0
  334. package/dist/dashboard/api/dataExport.js.map +1 -0
  335. package/dist/dashboard/api/fileManager.d.ts +39 -0
  336. package/dist/dashboard/api/fileManager.d.ts.map +1 -0
  337. package/dist/dashboard/api/fileManager.js +814 -0
  338. package/dist/dashboard/api/fileManager.js.map +1 -0
  339. package/dist/dashboard/api/hooks.d.ts +16 -0
  340. package/dist/dashboard/api/hooks.d.ts.map +1 -0
  341. package/dist/dashboard/api/hooks.js +342 -0
  342. package/dist/dashboard/api/hooks.js.map +1 -0
  343. package/dist/dashboard/api/hotReload.d.ts +14 -0
  344. package/dist/dashboard/api/hotReload.d.ts.map +1 -0
  345. package/dist/dashboard/api/hotReload.js +219 -0
  346. package/dist/dashboard/api/hotReload.js.map +1 -0
  347. package/dist/dashboard/api/liveSessionStream.d.ts +19 -0
  348. package/dist/dashboard/api/liveSessionStream.d.ts.map +1 -0
  349. package/dist/dashboard/api/liveSessionStream.js +430 -0
  350. package/dist/dashboard/api/liveSessionStream.js.map +1 -0
  351. package/dist/dashboard/api/memoryRecall.d.ts +20 -0
  352. package/dist/dashboard/api/memoryRecall.d.ts.map +1 -0
  353. package/dist/dashboard/api/memoryRecall.js +524 -0
  354. package/dist/dashboard/api/memoryRecall.js.map +1 -0
  355. package/dist/dashboard/api/promptSend.d.ts +33 -0
  356. package/dist/dashboard/api/promptSend.d.ts.map +1 -0
  357. package/dist/dashboard/api/promptSend.js +544 -0
  358. package/dist/dashboard/api/promptSend.js.map +1 -0
  359. package/dist/dashboard/api/settings.d.ts +10 -0
  360. package/dist/dashboard/api/settings.d.ts.map +1 -0
  361. package/dist/dashboard/api/settings.js +656 -0
  362. package/dist/dashboard/api/settings.js.map +1 -0
  363. package/dist/dashboard/api/setup.d.ts +21 -0
  364. package/dist/dashboard/api/setup.d.ts.map +1 -0
  365. package/dist/dashboard/api/setup.js +663 -0
  366. package/dist/dashboard/api/setup.js.map +1 -0
  367. package/dist/dashboard/api/specmemTools.d.ts +14 -0
  368. package/dist/dashboard/api/specmemTools.d.ts.map +1 -0
  369. package/dist/dashboard/api/specmemTools.js +1059 -0
  370. package/dist/dashboard/api/specmemTools.js.map +1 -0
  371. package/dist/dashboard/api/taskTeamMembers.d.ts +8 -0
  372. package/dist/dashboard/api/taskTeamMembers.d.ts.map +1 -0
  373. package/dist/dashboard/api/taskTeamMembers.js +136 -0
  374. package/dist/dashboard/api/taskTeamMembers.js.map +1 -0
  375. package/dist/dashboard/api/teamMemberDeploy.d.ts +15 -0
  376. package/dist/dashboard/api/teamMemberDeploy.d.ts.map +1 -0
  377. package/dist/dashboard/api/teamMemberDeploy.js +421 -0
  378. package/dist/dashboard/api/teamMemberDeploy.js.map +1 -0
  379. package/dist/dashboard/api/teamMemberHistory.d.ts +38 -0
  380. package/dist/dashboard/api/teamMemberHistory.d.ts.map +1 -0
  381. package/dist/dashboard/api/teamMemberHistory.js +583 -0
  382. package/dist/dashboard/api/teamMemberHistory.js.map +1 -0
  383. package/dist/dashboard/api/terminal.d.ts +12 -0
  384. package/dist/dashboard/api/terminal.d.ts.map +1 -0
  385. package/dist/dashboard/api/terminal.js +344 -0
  386. package/dist/dashboard/api/terminal.js.map +1 -0
  387. package/dist/dashboard/api/terminalInject.d.ts +17 -0
  388. package/dist/dashboard/api/terminalInject.d.ts.map +1 -0
  389. package/dist/dashboard/api/terminalInject.js +322 -0
  390. package/dist/dashboard/api/terminalInject.js.map +1 -0
  391. package/dist/dashboard/api/terminalStream.d.ts +12 -0
  392. package/dist/dashboard/api/terminalStream.d.ts.map +1 -0
  393. package/dist/dashboard/api/terminalStream.js +482 -0
  394. package/dist/dashboard/api/terminalStream.js.map +1 -0
  395. package/dist/dashboard/index.d.ts +7 -0
  396. package/dist/dashboard/index.d.ts.map +1 -0
  397. package/dist/dashboard/index.js +7 -0
  398. package/dist/dashboard/index.js.map +1 -0
  399. package/dist/dashboard/ptyStreamer.d.ts +173 -0
  400. package/dist/dashboard/ptyStreamer.d.ts.map +1 -0
  401. package/dist/dashboard/ptyStreamer.js +661 -0
  402. package/dist/dashboard/ptyStreamer.js.map +1 -0
  403. package/dist/dashboard/public/DASHBOARD-README.md +378 -0
  404. package/dist/dashboard/public/INTEGRATION-GUIDE.md +395 -0
  405. package/dist/dashboard/public/codebase-config.html +1247 -0
  406. package/dist/dashboard/public/dashboard-v2.html +1942 -0
  407. package/dist/dashboard/public/data-export.html +819 -0
  408. package/dist/dashboard/public/example-page.html +164 -0
  409. package/dist/dashboard/public/file-explorer.html +1023 -0
  410. package/dist/dashboard/public/hooks.html +1103 -0
  411. package/dist/dashboard/public/index-improvements.css +499 -0
  412. package/dist/dashboard/public/index.html +5534 -0
  413. package/dist/dashboard/public/memory-controls.html +1959 -0
  414. package/dist/dashboard/public/memory-recall.html +1495 -0
  415. package/dist/dashboard/public/previews/skeleton-memory-graph.html +361 -0
  416. package/dist/dashboard/public/previews/skeleton-memory-list.html +366 -0
  417. package/dist/dashboard/public/previews/skeleton-search-results.html +609 -0
  418. package/dist/dashboard/public/previews/skeleton-stats-dashboard.html +556 -0
  419. package/dist/dashboard/public/prompt-console.html +2763 -0
  420. package/dist/dashboard/public/react-dist/assets/index-CkjobT5B.js +871 -0
  421. package/dist/dashboard/public/react-dist/assets/index-iRclxMst.css +1 -0
  422. package/dist/dashboard/public/react-dist/index.html +16 -0
  423. package/dist/dashboard/public/shared-header.js +325 -0
  424. package/dist/dashboard/public/shared-language-selector.js +626 -0
  425. package/dist/dashboard/public/shared-logger.js +66 -0
  426. package/dist/dashboard/public/shared-nav.js +325 -0
  427. package/dist/dashboard/public/shared-theme-blue.css +331 -0
  428. package/dist/dashboard/public/shared-theme.css +813 -0
  429. package/dist/dashboard/public/shared-toast.js +415 -0
  430. package/dist/dashboard/public/team-member-history.html +1291 -0
  431. package/dist/dashboard/public/team-member-spy.html +1199 -0
  432. package/dist/dashboard/public/team-members.html +3756 -0
  433. package/dist/dashboard/public/terminal-output.html +1013 -0
  434. package/dist/dashboard/public/terminal.html +372 -0
  435. package/dist/dashboard/sessionStore.d.ts +86 -0
  436. package/dist/dashboard/sessionStore.d.ts.map +1 -0
  437. package/dist/dashboard/sessionStore.js +262 -0
  438. package/dist/dashboard/sessionStore.js.map +1 -0
  439. package/dist/dashboard/standalone.d.ts +27 -0
  440. package/dist/dashboard/standalone.d.ts.map +1 -0
  441. package/dist/dashboard/standalone.js +380 -0
  442. package/dist/dashboard/standalone.js.map +1 -0
  443. package/dist/dashboard/webServer.d.ts +390 -0
  444. package/dist/dashboard/webServer.d.ts.map +1 -0
  445. package/dist/dashboard/webServer.js +4297 -0
  446. package/dist/dashboard/webServer.js.map +1 -0
  447. package/dist/dashboard/websocket/teamMemberStream.d.ts +87 -0
  448. package/dist/dashboard/websocket/teamMemberStream.d.ts.map +1 -0
  449. package/dist/dashboard/websocket/teamMemberStream.js +366 -0
  450. package/dist/dashboard/websocket/teamMemberStream.js.map +1 -0
  451. package/dist/dashboard/websocket/terminalStream.d.ts +130 -0
  452. package/dist/dashboard/websocket/terminalStream.d.ts.map +1 -0
  453. package/dist/dashboard/websocket/terminalStream.js +456 -0
  454. package/dist/dashboard/websocket/terminalStream.js.map +1 -0
  455. package/dist/database/embeddedPostgres.d.ts +187 -0
  456. package/dist/database/embeddedPostgres.d.ts.map +1 -0
  457. package/dist/database/embeddedPostgres.js +763 -0
  458. package/dist/database/embeddedPostgres.js.map +1 -0
  459. package/dist/database/index.d.ts +12 -0
  460. package/dist/database/index.d.ts.map +1 -0
  461. package/dist/database/index.js +20 -0
  462. package/dist/database/index.js.map +1 -0
  463. package/dist/database/initEmbeddedPostgres.d.ts +124 -0
  464. package/dist/database/initEmbeddedPostgres.d.ts.map +1 -0
  465. package/dist/database/initEmbeddedPostgres.js +855 -0
  466. package/dist/database/initEmbeddedPostgres.js.map +1 -0
  467. package/dist/database.d.ts +256 -0
  468. package/dist/database.d.ts.map +1 -0
  469. package/dist/database.js +1209 -0
  470. package/dist/database.js.map +1 -0
  471. package/dist/db/apiDataManager.d.ts +334 -0
  472. package/dist/db/apiDataManager.d.ts.map +1 -0
  473. package/dist/db/apiDataManager.js +631 -0
  474. package/dist/db/apiDataManager.js.map +1 -0
  475. package/dist/db/batchOperations.d.ts +154 -0
  476. package/dist/db/batchOperations.d.ts.map +1 -0
  477. package/dist/db/batchOperations.js +564 -0
  478. package/dist/db/batchOperations.js.map +1 -0
  479. package/dist/db/bigBrainMigrations.d.ts +48 -0
  480. package/dist/db/bigBrainMigrations.d.ts.map +1 -0
  481. package/dist/db/bigBrainMigrations.js +4266 -0
  482. package/dist/db/bigBrainMigrations.js.map +1 -0
  483. package/dist/db/connectionPoolGoBrrr.d.ts +94 -0
  484. package/dist/db/connectionPoolGoBrrr.d.ts.map +1 -0
  485. package/dist/db/connectionPoolGoBrrr.js +548 -0
  486. package/dist/db/connectionPoolGoBrrr.js.map +1 -0
  487. package/dist/db/dashboardQueries.d.ts +182 -0
  488. package/dist/db/dashboardQueries.d.ts.map +1 -0
  489. package/dist/db/dashboardQueries.js +821 -0
  490. package/dist/db/dashboardQueries.js.map +1 -0
  491. package/dist/db/deploymentBootstrap.d.ts +43 -0
  492. package/dist/db/deploymentBootstrap.d.ts.map +1 -0
  493. package/dist/db/deploymentBootstrap.js +329 -0
  494. package/dist/db/deploymentBootstrap.js.map +1 -0
  495. package/dist/db/dimensionService.d.ts +140 -0
  496. package/dist/db/dimensionService.d.ts.map +1 -0
  497. package/dist/db/dimensionService.js +261 -0
  498. package/dist/db/dimensionService.js.map +1 -0
  499. package/dist/db/embeddingOverflow.d.ts +69 -0
  500. package/dist/db/embeddingOverflow.d.ts.map +1 -0
  501. package/dist/db/embeddingOverflow.js +332 -0
  502. package/dist/db/embeddingOverflow.js.map +1 -0
  503. package/dist/db/embeddingOverflow.sql +221 -0
  504. package/dist/db/findThatShit.d.ts +145 -0
  505. package/dist/db/findThatShit.d.ts.map +1 -0
  506. package/dist/db/findThatShit.js +782 -0
  507. package/dist/db/findThatShit.js.map +1 -0
  508. package/dist/db/hotPathManager.d.ts +187 -0
  509. package/dist/db/hotPathManager.d.ts.map +1 -0
  510. package/dist/db/hotPathManager.js +504 -0
  511. package/dist/db/hotPathManager.js.map +1 -0
  512. package/dist/db/index.d.ts +85 -0
  513. package/dist/db/index.d.ts.map +1 -0
  514. package/dist/db/index.js +219 -0
  515. package/dist/db/index.js.map +1 -0
  516. package/dist/db/memoryDrilldown.sql +99 -0
  517. package/dist/db/migrate.d.ts +3 -0
  518. package/dist/db/migrate.d.ts.map +1 -0
  519. package/dist/db/migrate.js +97 -0
  520. package/dist/db/migrate.js.map +1 -0
  521. package/dist/db/migrateJsonToPostgres.d.ts +43 -0
  522. package/dist/db/migrateJsonToPostgres.d.ts.map +1 -0
  523. package/dist/db/migrateJsonToPostgres.js +465 -0
  524. package/dist/db/migrateJsonToPostgres.js.map +1 -0
  525. package/dist/db/nukeFromOrbit.d.ts +63 -0
  526. package/dist/db/nukeFromOrbit.d.ts.map +1 -0
  527. package/dist/db/nukeFromOrbit.js +499 -0
  528. package/dist/db/nukeFromOrbit.js.map +1 -0
  529. package/dist/db/processedTraining.sql +60 -0
  530. package/dist/db/projectNamespacing.d.ts +258 -0
  531. package/dist/db/projectNamespacing.d.ts.map +1 -0
  532. package/dist/db/projectNamespacing.js +920 -0
  533. package/dist/db/projectNamespacing.js.map +1 -0
  534. package/dist/db/projectNamespacing.sql +374 -0
  535. package/dist/db/projectSchemaInit.sql +271 -0
  536. package/dist/db/spatialMemory.d.ts +296 -0
  537. package/dist/db/spatialMemory.d.ts.map +1 -0
  538. package/dist/db/spatialMemory.js +818 -0
  539. package/dist/db/spatialMemory.js.map +1 -0
  540. package/dist/db/streamingQuery.d.ts +143 -0
  541. package/dist/db/streamingQuery.d.ts.map +1 -0
  542. package/dist/db/streamingQuery.js +350 -0
  543. package/dist/db/streamingQuery.js.map +1 -0
  544. package/dist/db/teamComms.sql +224 -0
  545. package/dist/db/yeetStuffInDb.d.ts +72 -0
  546. package/dist/db/yeetStuffInDb.d.ts.map +1 -0
  547. package/dist/db/yeetStuffInDb.js +473 -0
  548. package/dist/db/yeetStuffInDb.js.map +1 -0
  549. package/dist/embedding-providers/index.d.ts +10 -0
  550. package/dist/embedding-providers/index.d.ts.map +1 -0
  551. package/dist/embedding-providers/index.js +12 -0
  552. package/dist/embedding-providers/index.js.map +1 -0
  553. package/dist/embeddings/projectionLayer.d.ts +114 -0
  554. package/dist/embeddings/projectionLayer.d.ts.map +1 -0
  555. package/dist/embeddings/projectionLayer.js +345 -0
  556. package/dist/embeddings/projectionLayer.js.map +1 -0
  557. package/dist/events/Publisher.d.ts +193 -0
  558. package/dist/events/Publisher.d.ts.map +1 -0
  559. package/dist/events/Publisher.js +439 -0
  560. package/dist/events/Publisher.js.map +1 -0
  561. package/dist/events/config.d.ts +139 -0
  562. package/dist/events/config.d.ts.map +1 -0
  563. package/dist/events/config.js +266 -0
  564. package/dist/events/config.js.map +1 -0
  565. package/dist/events/index.d.ts +19 -0
  566. package/dist/events/index.d.ts.map +1 -0
  567. package/dist/events/index.js +31 -0
  568. package/dist/events/index.js.map +1 -0
  569. package/dist/events/integration.d.ts +206 -0
  570. package/dist/events/integration.d.ts.map +1 -0
  571. package/dist/events/integration.js +348 -0
  572. package/dist/events/integration.js.map +1 -0
  573. package/dist/events/metrics.d.ts +147 -0
  574. package/dist/events/metrics.d.ts.map +1 -0
  575. package/dist/events/metrics.js +343 -0
  576. package/dist/events/metrics.js.map +1 -0
  577. package/dist/hooks/cli.d.ts +28 -0
  578. package/dist/hooks/cli.d.ts.map +1 -0
  579. package/dist/hooks/cli.js +118 -0
  580. package/dist/hooks/cli.js.map +1 -0
  581. package/dist/hooks/contextInjectionHook.d.ts +60 -0
  582. package/dist/hooks/contextInjectionHook.d.ts.map +1 -0
  583. package/dist/hooks/contextInjectionHook.js +294 -0
  584. package/dist/hooks/contextInjectionHook.js.map +1 -0
  585. package/dist/hooks/drilldownHook.d.ts +125 -0
  586. package/dist/hooks/drilldownHook.d.ts.map +1 -0
  587. package/dist/hooks/drilldownHook.js +181 -0
  588. package/dist/hooks/drilldownHook.js.map +1 -0
  589. package/dist/hooks/hookManager.d.ts +180 -0
  590. package/dist/hooks/hookManager.d.ts.map +1 -0
  591. package/dist/hooks/hookManager.js +782 -0
  592. package/dist/hooks/hookManager.js.map +1 -0
  593. package/dist/hooks/index.d.ts +62 -0
  594. package/dist/hooks/index.d.ts.map +1 -0
  595. package/dist/hooks/index.js +66 -0
  596. package/dist/hooks/index.js.map +1 -0
  597. package/dist/hooks/lowContextHook.d.ts +71 -0
  598. package/dist/hooks/lowContextHook.d.ts.map +1 -0
  599. package/dist/hooks/lowContextHook.js +258 -0
  600. package/dist/hooks/lowContextHook.js.map +1 -0
  601. package/dist/hooks/simpleContextHook.d.ts +65 -0
  602. package/dist/hooks/simpleContextHook.d.ts.map +1 -0
  603. package/dist/hooks/simpleContextHook.js +194 -0
  604. package/dist/hooks/simpleContextHook.js.map +1 -0
  605. package/dist/hooks/teamFramingCli.d.ts +56 -0
  606. package/dist/hooks/teamFramingCli.d.ts.map +1 -0
  607. package/dist/hooks/teamFramingCli.js +264 -0
  608. package/dist/hooks/teamFramingCli.js.map +1 -0
  609. package/dist/hooks/teamMemberPrepromptHook.d.ts +150 -0
  610. package/dist/hooks/teamMemberPrepromptHook.d.ts.map +1 -0
  611. package/dist/hooks/teamMemberPrepromptHook.js +308 -0
  612. package/dist/hooks/teamMemberPrepromptHook.js.map +1 -0
  613. package/dist/index.d.ts +42 -0
  614. package/dist/index.d.ts.map +1 -0
  615. package/dist/index.js +4433 -0
  616. package/dist/index.js.map +1 -0
  617. package/dist/init/claudeConfigInjector.d.ts +116 -0
  618. package/dist/init/claudeConfigInjector.d.ts.map +1 -0
  619. package/dist/init/claudeConfigInjector.js +1154 -0
  620. package/dist/init/claudeConfigInjector.js.map +1 -0
  621. package/dist/installer/autoInstall.d.ts +72 -0
  622. package/dist/installer/autoInstall.d.ts.map +1 -0
  623. package/dist/installer/autoInstall.js +617 -0
  624. package/dist/installer/autoInstall.js.map +1 -0
  625. package/dist/installer/dbSetup.d.ts +84 -0
  626. package/dist/installer/dbSetup.d.ts.map +1 -0
  627. package/dist/installer/dbSetup.js +350 -0
  628. package/dist/installer/dbSetup.js.map +1 -0
  629. package/dist/installer/firstRun.d.ts +49 -0
  630. package/dist/installer/firstRun.d.ts.map +1 -0
  631. package/dist/installer/firstRun.js +207 -0
  632. package/dist/installer/firstRun.js.map +1 -0
  633. package/dist/installer/index.d.ts +10 -0
  634. package/dist/installer/index.d.ts.map +1 -0
  635. package/dist/installer/index.js +10 -0
  636. package/dist/installer/index.js.map +1 -0
  637. package/dist/installer/silentAutoInstall.d.ts +99 -0
  638. package/dist/installer/silentAutoInstall.d.ts.map +1 -0
  639. package/dist/installer/silentAutoInstall.js +491 -0
  640. package/dist/installer/silentAutoInstall.js.map +1 -0
  641. package/dist/installer/systemDeps.d.ts +54 -0
  642. package/dist/installer/systemDeps.d.ts.map +1 -0
  643. package/dist/installer/systemDeps.js +322 -0
  644. package/dist/installer/systemDeps.js.map +1 -0
  645. package/dist/mcp/cliNotifications.d.ts +133 -0
  646. package/dist/mcp/cliNotifications.d.ts.map +1 -0
  647. package/dist/mcp/cliNotifications.js +289 -0
  648. package/dist/mcp/cliNotifications.js.map +1 -0
  649. package/dist/mcp/embeddingServerManager.d.ts +307 -0
  650. package/dist/mcp/embeddingServerManager.d.ts.map +1 -0
  651. package/dist/mcp/embeddingServerManager.js +2081 -0
  652. package/dist/mcp/embeddingServerManager.js.map +1 -0
  653. package/dist/mcp/healthMonitor.d.ts +196 -0
  654. package/dist/mcp/healthMonitor.d.ts.map +1 -0
  655. package/dist/mcp/healthMonitor.js +685 -0
  656. package/dist/mcp/healthMonitor.js.map +1 -0
  657. package/dist/mcp/hotReloadManager.d.ts +101 -0
  658. package/dist/mcp/hotReloadManager.d.ts.map +1 -0
  659. package/dist/mcp/hotReloadManager.js +251 -0
  660. package/dist/mcp/hotReloadManager.js.map +1 -0
  661. package/dist/mcp/index.d.ts +16 -0
  662. package/dist/mcp/index.d.ts.map +1 -0
  663. package/dist/mcp/index.js +22 -0
  664. package/dist/mcp/index.js.map +1 -0
  665. package/dist/mcp/mcpProtocolHandler.d.ts +64 -0
  666. package/dist/mcp/mcpProtocolHandler.d.ts.map +1 -0
  667. package/dist/mcp/mcpProtocolHandler.js +253 -0
  668. package/dist/mcp/mcpProtocolHandler.js.map +1 -0
  669. package/dist/mcp/miniCOTServerManager.d.ts +336 -0
  670. package/dist/mcp/miniCOTServerManager.d.ts.map +1 -0
  671. package/dist/mcp/miniCOTServerManager.js +1384 -0
  672. package/dist/mcp/miniCOTServerManager.js.map +1 -0
  673. package/dist/mcp/promptExecutor.d.ts +188 -0
  674. package/dist/mcp/promptExecutor.d.ts.map +1 -0
  675. package/dist/mcp/promptExecutor.js +469 -0
  676. package/dist/mcp/promptExecutor.js.map +1 -0
  677. package/dist/mcp/reloadBroadcast.d.ts +127 -0
  678. package/dist/mcp/reloadBroadcast.d.ts.map +1 -0
  679. package/dist/mcp/reloadBroadcast.js +275 -0
  680. package/dist/mcp/reloadBroadcast.js.map +1 -0
  681. package/dist/mcp/resilientTransport.d.ts +249 -0
  682. package/dist/mcp/resilientTransport.d.ts.map +1 -0
  683. package/dist/mcp/resilientTransport.js +931 -0
  684. package/dist/mcp/resilientTransport.js.map +1 -0
  685. package/dist/mcp/samplingHandler.d.ts +129 -0
  686. package/dist/mcp/samplingHandler.d.ts.map +1 -0
  687. package/dist/mcp/samplingHandler.js +276 -0
  688. package/dist/mcp/samplingHandler.js.map +1 -0
  689. package/dist/mcp/specMemServer.d.ts +305 -0
  690. package/dist/mcp/specMemServer.d.ts.map +1 -0
  691. package/dist/mcp/specMemServer.js +2048 -0
  692. package/dist/mcp/specMemServer.js.map +1 -0
  693. package/dist/mcp/toolRegistry.d.ts +122 -0
  694. package/dist/mcp/toolRegistry.d.ts.map +1 -0
  695. package/dist/mcp/toolRegistry.js +609 -0
  696. package/dist/mcp/toolRegistry.js.map +1 -0
  697. package/dist/mcp/tools/embeddingControl.d.ts +114 -0
  698. package/dist/mcp/tools/embeddingControl.d.ts.map +1 -0
  699. package/dist/mcp/tools/embeddingControl.js +222 -0
  700. package/dist/mcp/tools/embeddingControl.js.map +1 -0
  701. package/dist/mcp/tools/index.d.ts +10 -0
  702. package/dist/mcp/tools/index.d.ts.map +1 -0
  703. package/dist/mcp/tools/index.js +17 -0
  704. package/dist/mcp/tools/index.js.map +1 -0
  705. package/dist/mcp/tools/teamComms.d.ts +444 -0
  706. package/dist/mcp/tools/teamComms.d.ts.map +1 -0
  707. package/dist/mcp/tools/teamComms.js +1953 -0
  708. package/dist/mcp/tools/teamComms.js.map +1 -0
  709. package/dist/mcp/triggerSystem.d.ts +129 -0
  710. package/dist/mcp/triggerSystem.d.ts.map +1 -0
  711. package/dist/mcp/triggerSystem.js +363 -0
  712. package/dist/mcp/triggerSystem.js.map +1 -0
  713. package/dist/mcp/watcherIntegration.d.ts +77 -0
  714. package/dist/mcp/watcherIntegration.d.ts.map +1 -0
  715. package/dist/mcp/watcherIntegration.js +428 -0
  716. package/dist/mcp/watcherIntegration.js.map +1 -0
  717. package/dist/mcp/watcherToolWrappers.d.ts +89 -0
  718. package/dist/mcp/watcherToolWrappers.d.ts.map +1 -0
  719. package/dist/mcp/watcherToolWrappers.js +91 -0
  720. package/dist/mcp/watcherToolWrappers.js.map +1 -0
  721. package/dist/memorization/claudeCodeMigration.d.ts +34 -0
  722. package/dist/memorization/claudeCodeMigration.d.ts.map +1 -0
  723. package/dist/memorization/claudeCodeMigration.js +210 -0
  724. package/dist/memorization/claudeCodeMigration.js.map +1 -0
  725. package/dist/memorization/claudeCodeTracker.d.ts +147 -0
  726. package/dist/memorization/claudeCodeTracker.d.ts.map +1 -0
  727. package/dist/memorization/claudeCodeTracker.js +424 -0
  728. package/dist/memorization/claudeCodeTracker.js.map +1 -0
  729. package/dist/memorization/codeMemorizer.d.ts +158 -0
  730. package/dist/memorization/codeMemorizer.d.ts.map +1 -0
  731. package/dist/memorization/codeMemorizer.js +357 -0
  732. package/dist/memorization/codeMemorizer.js.map +1 -0
  733. package/dist/memorization/codeRecall.d.ts +156 -0
  734. package/dist/memorization/codeRecall.d.ts.map +1 -0
  735. package/dist/memorization/codeRecall.js +499 -0
  736. package/dist/memorization/codeRecall.js.map +1 -0
  737. package/dist/memorization/index.d.ts +55 -0
  738. package/dist/memorization/index.d.ts.map +1 -0
  739. package/dist/memorization/index.js +64 -0
  740. package/dist/memorization/index.js.map +1 -0
  741. package/dist/memorization/memorizationTools.d.ts +413 -0
  742. package/dist/memorization/memorizationTools.d.ts.map +1 -0
  743. package/dist/memorization/memorizationTools.js +513 -0
  744. package/dist/memorization/memorizationTools.js.map +1 -0
  745. package/dist/memorization/watcherIntegration.d.ts +100 -0
  746. package/dist/memorization/watcherIntegration.d.ts.map +1 -0
  747. package/dist/memorization/watcherIntegration.js +196 -0
  748. package/dist/memorization/watcherIntegration.js.map +1 -0
  749. package/dist/memory/humanLikeMemory.d.ts +206 -0
  750. package/dist/memory/humanLikeMemory.d.ts.map +1 -0
  751. package/dist/memory/humanLikeMemory.js +603 -0
  752. package/dist/memory/humanLikeMemory.js.map +1 -0
  753. package/dist/memory/index.d.ts +22 -0
  754. package/dist/memory/index.d.ts.map +1 -0
  755. package/dist/memory/index.js +24 -0
  756. package/dist/memory/index.js.map +1 -0
  757. package/dist/memory/memoryEvolutionMigration.d.ts +36 -0
  758. package/dist/memory/memoryEvolutionMigration.d.ts.map +1 -0
  759. package/dist/memory/memoryEvolutionMigration.js +371 -0
  760. package/dist/memory/memoryEvolutionMigration.js.map +1 -0
  761. package/dist/memory/quadrantSearch.d.ts +221 -0
  762. package/dist/memory/quadrantSearch.d.ts.map +1 -0
  763. package/dist/memory/quadrantSearch.js +897 -0
  764. package/dist/memory/quadrantSearch.js.map +1 -0
  765. package/dist/middleware/apiVersioning.d.ts +83 -0
  766. package/dist/middleware/apiVersioning.d.ts.map +1 -0
  767. package/dist/middleware/apiVersioning.js +152 -0
  768. package/dist/middleware/apiVersioning.js.map +1 -0
  769. package/dist/middleware/compression.d.ts +48 -0
  770. package/dist/middleware/compression.d.ts.map +1 -0
  771. package/dist/middleware/compression.js +240 -0
  772. package/dist/middleware/compression.js.map +1 -0
  773. package/dist/middleware/csrf.d.ts +118 -0
  774. package/dist/middleware/csrf.d.ts.map +1 -0
  775. package/dist/middleware/csrf.js +300 -0
  776. package/dist/middleware/csrf.js.map +1 -0
  777. package/dist/middleware/index.d.ts +13 -0
  778. package/dist/middleware/index.d.ts.map +1 -0
  779. package/dist/middleware/index.js +17 -0
  780. package/dist/middleware/index.js.map +1 -0
  781. package/dist/middleware/wsRateLimiter.d.ts +129 -0
  782. package/dist/middleware/wsRateLimiter.d.ts.map +1 -0
  783. package/dist/middleware/wsRateLimiter.js +279 -0
  784. package/dist/middleware/wsRateLimiter.js.map +1 -0
  785. package/dist/migrations/run.d.ts +2 -0
  786. package/dist/migrations/run.d.ts.map +1 -0
  787. package/dist/migrations/run.js +25 -0
  788. package/dist/migrations/run.js.map +1 -0
  789. package/dist/migrations/syncDimensions.d.ts +24 -0
  790. package/dist/migrations/syncDimensions.d.ts.map +1 -0
  791. package/dist/migrations/syncDimensions.js +140 -0
  792. package/dist/migrations/syncDimensions.js.map +1 -0
  793. package/dist/migrations/teamComms.d.ts +16 -0
  794. package/dist/migrations/teamComms.d.ts.map +1 -0
  795. package/dist/migrations/teamComms.js +210 -0
  796. package/dist/migrations/teamComms.js.map +1 -0
  797. package/dist/openapi/index.d.ts +10 -0
  798. package/dist/openapi/index.d.ts.map +1 -0
  799. package/dist/openapi/index.js +10 -0
  800. package/dist/openapi/index.js.map +1 -0
  801. package/dist/openapi/spec.d.ts +902 -0
  802. package/dist/openapi/spec.d.ts.map +1 -0
  803. package/dist/openapi/spec.js +733 -0
  804. package/dist/openapi/spec.js.map +1 -0
  805. package/dist/packages/dependencyHistory.d.ts +113 -0
  806. package/dist/packages/dependencyHistory.d.ts.map +1 -0
  807. package/dist/packages/dependencyHistory.js +360 -0
  808. package/dist/packages/dependencyHistory.js.map +1 -0
  809. package/dist/packages/index.d.ts +30 -0
  810. package/dist/packages/index.d.ts.map +1 -0
  811. package/dist/packages/index.js +65 -0
  812. package/dist/packages/index.js.map +1 -0
  813. package/dist/packages/packageTools.d.ts +255 -0
  814. package/dist/packages/packageTools.d.ts.map +1 -0
  815. package/dist/packages/packageTools.js +242 -0
  816. package/dist/packages/packageTools.js.map +1 -0
  817. package/dist/packages/packageTracker.d.ts +98 -0
  818. package/dist/packages/packageTracker.d.ts.map +1 -0
  819. package/dist/packages/packageTracker.js +268 -0
  820. package/dist/packages/packageTracker.js.map +1 -0
  821. package/dist/packages/packageWatcher.d.ts +62 -0
  822. package/dist/packages/packageWatcher.d.ts.map +1 -0
  823. package/dist/packages/packageWatcher.js +146 -0
  824. package/dist/packages/packageWatcher.js.map +1 -0
  825. package/dist/providers/MiniCOTProvider.d.ts +48 -0
  826. package/dist/providers/MiniCOTProvider.d.ts.map +1 -0
  827. package/dist/providers/MiniCOTProvider.js +98 -0
  828. package/dist/providers/MiniCOTProvider.js.map +1 -0
  829. package/dist/reminders/index.d.ts +5 -0
  830. package/dist/reminders/index.d.ts.map +1 -0
  831. package/dist/reminders/index.js +5 -0
  832. package/dist/reminders/index.js.map +1 -0
  833. package/dist/reminders/skillReminder.d.ts +131 -0
  834. package/dist/reminders/skillReminder.d.ts.map +1 -0
  835. package/dist/reminders/skillReminder.js +386 -0
  836. package/dist/reminders/skillReminder.js.map +1 -0
  837. package/dist/search.d.ts +35 -0
  838. package/dist/search.d.ts.map +1 -0
  839. package/dist/search.js +574 -0
  840. package/dist/search.js.map +1 -0
  841. package/dist/security/localhostOnly.d.ts +36 -0
  842. package/dist/security/localhostOnly.d.ts.map +1 -0
  843. package/dist/security/localhostOnly.js +101 -0
  844. package/dist/security/localhostOnly.js.map +1 -0
  845. package/dist/services/CameraZoomSearch.d.ts +206 -0
  846. package/dist/services/CameraZoomSearch.d.ts.map +1 -0
  847. package/dist/services/CameraZoomSearch.js +669 -0
  848. package/dist/services/CameraZoomSearch.js.map +1 -0
  849. package/dist/services/DataFlowPipeline.d.ts +111 -0
  850. package/dist/services/DataFlowPipeline.d.ts.map +1 -0
  851. package/dist/services/DataFlowPipeline.js +379 -0
  852. package/dist/services/DataFlowPipeline.js.map +1 -0
  853. package/dist/services/DimensionAdapter.d.ts +194 -0
  854. package/dist/services/DimensionAdapter.d.ts.map +1 -0
  855. package/dist/services/DimensionAdapter.js +566 -0
  856. package/dist/services/DimensionAdapter.js.map +1 -0
  857. package/dist/services/DimensionService.d.ts +252 -0
  858. package/dist/services/DimensionService.d.ts.map +1 -0
  859. package/dist/services/DimensionService.js +564 -0
  860. package/dist/services/DimensionService.js.map +1 -0
  861. package/dist/services/EmbeddingQueue.d.ts +71 -0
  862. package/dist/services/EmbeddingQueue.d.ts.map +1 -0
  863. package/dist/services/EmbeddingQueue.js +258 -0
  864. package/dist/services/EmbeddingQueue.js.map +1 -0
  865. package/dist/services/MemoryDrilldown.d.ts +226 -0
  866. package/dist/services/MemoryDrilldown.d.ts.map +1 -0
  867. package/dist/services/MemoryDrilldown.js +479 -0
  868. package/dist/services/MemoryDrilldown.js.map +1 -0
  869. package/dist/services/MiniCOTScorer.d.ts +140 -0
  870. package/dist/services/MiniCOTScorer.d.ts.map +1 -0
  871. package/dist/services/MiniCOTScorer.js +292 -0
  872. package/dist/services/MiniCOTScorer.js.map +1 -0
  873. package/dist/services/ProjectContext.d.ts +342 -0
  874. package/dist/services/ProjectContext.d.ts.map +1 -0
  875. package/dist/services/ProjectContext.js +667 -0
  876. package/dist/services/ProjectContext.js.map +1 -0
  877. package/dist/services/ResponseCompactor.d.ts +135 -0
  878. package/dist/services/ResponseCompactor.d.ts.map +1 -0
  879. package/dist/services/ResponseCompactor.js +501 -0
  880. package/dist/services/ResponseCompactor.js.map +1 -0
  881. package/dist/services/TeamCommsDbService.d.ts +202 -0
  882. package/dist/services/TeamCommsDbService.d.ts.map +1 -0
  883. package/dist/services/TeamCommsDbService.js +526 -0
  884. package/dist/services/TeamCommsDbService.js.map +1 -0
  885. package/dist/services/UnifiedPasswordService.d.ts +166 -0
  886. package/dist/services/UnifiedPasswordService.d.ts.map +1 -0
  887. package/dist/services/UnifiedPasswordService.js +587 -0
  888. package/dist/services/UnifiedPasswordService.js.map +1 -0
  889. package/dist/services/adaptiveSearchConfig.d.ts +64 -0
  890. package/dist/services/adaptiveSearchConfig.d.ts.map +1 -0
  891. package/dist/services/adaptiveSearchConfig.js +187 -0
  892. package/dist/services/adaptiveSearchConfig.js.map +1 -0
  893. package/dist/skills/index.d.ts +8 -0
  894. package/dist/skills/index.d.ts.map +1 -0
  895. package/dist/skills/index.js +8 -0
  896. package/dist/skills/index.js.map +1 -0
  897. package/dist/skills/skillScanner.d.ts +203 -0
  898. package/dist/skills/skillScanner.d.ts.map +1 -0
  899. package/dist/skills/skillScanner.js +559 -0
  900. package/dist/skills/skillScanner.js.map +1 -0
  901. package/dist/skills/skillsResource.d.ts +69 -0
  902. package/dist/skills/skillsResource.d.ts.map +1 -0
  903. package/dist/skills/skillsResource.js +257 -0
  904. package/dist/skills/skillsResource.js.map +1 -0
  905. package/dist/startup/index.d.ts +9 -0
  906. package/dist/startup/index.d.ts.map +1 -0
  907. package/dist/startup/index.js +12 -0
  908. package/dist/startup/index.js.map +1 -0
  909. package/dist/startup/startupIndexing.d.ts +80 -0
  910. package/dist/startup/startupIndexing.d.ts.map +1 -0
  911. package/dist/startup/startupIndexing.js +463 -0
  912. package/dist/startup/startupIndexing.js.map +1 -0
  913. package/dist/startup/validation.d.ts +89 -0
  914. package/dist/startup/validation.d.ts.map +1 -0
  915. package/dist/startup/validation.js +590 -0
  916. package/dist/startup/validation.js.map +1 -0
  917. package/dist/storage/index.d.ts +4 -0
  918. package/dist/storage/index.d.ts.map +1 -0
  919. package/dist/storage/index.js +4 -0
  920. package/dist/storage/index.js.map +1 -0
  921. package/dist/storage/overflowManager.d.ts +80 -0
  922. package/dist/storage/overflowManager.d.ts.map +1 -0
  923. package/dist/storage/overflowManager.js +317 -0
  924. package/dist/storage/overflowManager.js.map +1 -0
  925. package/dist/storage/overflowStorage.d.ts +69 -0
  926. package/dist/storage/overflowStorage.d.ts.map +1 -0
  927. package/dist/storage/overflowStorage.js +379 -0
  928. package/dist/storage/overflowStorage.js.map +1 -0
  929. package/dist/storage/toonFormat.d.ts +50 -0
  930. package/dist/storage/toonFormat.d.ts.map +1 -0
  931. package/dist/storage/toonFormat.js +224 -0
  932. package/dist/storage/toonFormat.js.map +1 -0
  933. package/dist/team-members/communication.d.ts +237 -0
  934. package/dist/team-members/communication.d.ts.map +1 -0
  935. package/dist/team-members/communication.js +650 -0
  936. package/dist/team-members/communication.js.map +1 -0
  937. package/dist/team-members/index.d.ts +14 -0
  938. package/dist/team-members/index.d.ts.map +1 -0
  939. package/dist/team-members/index.js +22 -0
  940. package/dist/team-members/index.js.map +1 -0
  941. package/dist/team-members/taskOrchestrator.d.ts +224 -0
  942. package/dist/team-members/taskOrchestrator.d.ts.map +1 -0
  943. package/dist/team-members/taskOrchestrator.js +574 -0
  944. package/dist/team-members/taskOrchestrator.js.map +1 -0
  945. package/dist/team-members/taskTeamMemberLogger.d.ts +157 -0
  946. package/dist/team-members/taskTeamMemberLogger.d.ts.map +1 -0
  947. package/dist/team-members/taskTeamMemberLogger.js +478 -0
  948. package/dist/team-members/taskTeamMemberLogger.js.map +1 -0
  949. package/dist/team-members/teamCommsService.d.ts +221 -0
  950. package/dist/team-members/teamCommsService.d.ts.map +1 -0
  951. package/dist/team-members/teamCommsService.js +628 -0
  952. package/dist/team-members/teamCommsService.js.map +1 -0
  953. package/dist/team-members/teamMemberChannels.d.ts +217 -0
  954. package/dist/team-members/teamMemberChannels.d.ts.map +1 -0
  955. package/dist/team-members/teamMemberChannels.js +687 -0
  956. package/dist/team-members/teamMemberChannels.js.map +1 -0
  957. package/dist/team-members/teamMemberDashboard.d.ts +222 -0
  958. package/dist/team-members/teamMemberDashboard.d.ts.map +1 -0
  959. package/dist/team-members/teamMemberDashboard.js +610 -0
  960. package/dist/team-members/teamMemberDashboard.js.map +1 -0
  961. package/dist/team-members/teamMemberDeployment.d.ts +60 -0
  962. package/dist/team-members/teamMemberDeployment.d.ts.map +1 -0
  963. package/dist/team-members/teamMemberDeployment.js +429 -0
  964. package/dist/team-members/teamMemberDeployment.js.map +1 -0
  965. package/dist/team-members/teamMemberDiscovery.d.ts +178 -0
  966. package/dist/team-members/teamMemberDiscovery.d.ts.map +1 -0
  967. package/dist/team-members/teamMemberDiscovery.js +446 -0
  968. package/dist/team-members/teamMemberDiscovery.js.map +1 -0
  969. package/dist/team-members/teamMemberHistory.d.ts +80 -0
  970. package/dist/team-members/teamMemberHistory.d.ts.map +1 -0
  971. package/dist/team-members/teamMemberHistory.js +426 -0
  972. package/dist/team-members/teamMemberHistory.js.map +1 -0
  973. package/dist/team-members/teamMemberLimits.d.ts +66 -0
  974. package/dist/team-members/teamMemberLimits.d.ts.map +1 -0
  975. package/dist/team-members/teamMemberLimits.js +259 -0
  976. package/dist/team-members/teamMemberLimits.js.map +1 -0
  977. package/dist/team-members/teamMemberRegistry.d.ts +199 -0
  978. package/dist/team-members/teamMemberRegistry.d.ts.map +1 -0
  979. package/dist/team-members/teamMemberRegistry.js +572 -0
  980. package/dist/team-members/teamMemberRegistry.js.map +1 -0
  981. package/dist/team-members/teamMemberTracker.d.ts +148 -0
  982. package/dist/team-members/teamMemberTracker.d.ts.map +1 -0
  983. package/dist/team-members/teamMemberTracker.js +828 -0
  984. package/dist/team-members/teamMemberTracker.js.map +1 -0
  985. package/dist/team-members/workers/aiWorker.d.ts +53 -0
  986. package/dist/team-members/workers/aiWorker.d.ts.map +1 -0
  987. package/dist/team-members/workers/aiWorker.js +322 -0
  988. package/dist/team-members/workers/aiWorker.js.map +1 -0
  989. package/dist/team-members/workers/baseWorker.d.ts +101 -0
  990. package/dist/team-members/workers/baseWorker.d.ts.map +1 -0
  991. package/dist/team-members/workers/baseWorker.js +179 -0
  992. package/dist/team-members/workers/baseWorker.js.map +1 -0
  993. package/dist/team-members/workers/codeReviewWorker.d.ts +3 -0
  994. package/dist/team-members/workers/codeReviewWorker.d.ts.map +1 -0
  995. package/dist/team-members/workers/codeReviewWorker.js +144 -0
  996. package/dist/team-members/workers/codeReviewWorker.js.map +1 -0
  997. package/dist/team-members/workers/index.d.ts +7 -0
  998. package/dist/team-members/workers/index.d.ts.map +1 -0
  999. package/dist/team-members/workers/index.js +7 -0
  1000. package/dist/team-members/workers/index.js.map +1 -0
  1001. package/dist/team-members/workers/repairWorker.d.ts +9 -0
  1002. package/dist/team-members/workers/repairWorker.d.ts.map +1 -0
  1003. package/dist/team-members/workers/repairWorker.js +102 -0
  1004. package/dist/team-members/workers/repairWorker.js.map +1 -0
  1005. package/dist/team-members/workers/sendToTeamMemberB.d.ts +9 -0
  1006. package/dist/team-members/workers/sendToTeamMemberB.d.ts.map +1 -0
  1007. package/dist/team-members/workers/sendToTeamMemberB.js +105 -0
  1008. package/dist/team-members/workers/sendToTeamMemberB.js.map +1 -0
  1009. package/dist/team-members/workers/specmemClient.d.ts +179 -0
  1010. package/dist/team-members/workers/specmemClient.d.ts.map +1 -0
  1011. package/dist/team-members/workers/specmemClient.js +421 -0
  1012. package/dist/team-members/workers/specmemClient.js.map +1 -0
  1013. package/dist/team-members/workers/testCommunication.d.ts +8 -0
  1014. package/dist/team-members/workers/testCommunication.d.ts.map +1 -0
  1015. package/dist/team-members/workers/testCommunication.js +136 -0
  1016. package/dist/team-members/workers/testCommunication.js.map +1 -0
  1017. package/dist/team-members/workers/testCommunicationSuite.d.ts +26 -0
  1018. package/dist/team-members/workers/testCommunicationSuite.d.ts.map +1 -0
  1019. package/dist/team-members/workers/testCommunicationSuite.js +415 -0
  1020. package/dist/team-members/workers/testCommunicationSuite.js.map +1 -0
  1021. package/dist/team-members/workers/testWorker.d.ts +9 -0
  1022. package/dist/team-members/workers/testWorker.d.ts.map +1 -0
  1023. package/dist/team-members/workers/testWorker.js +107 -0
  1024. package/dist/team-members/workers/testWorker.js.map +1 -0
  1025. package/dist/tools/agentDefinitions.d.ts +30 -0
  1026. package/dist/tools/agentDefinitions.d.ts.map +1 -0
  1027. package/dist/tools/agentDefinitions.js +166 -0
  1028. package/dist/tools/agentDefinitions.js.map +1 -0
  1029. package/dist/tools/goofy/checkSyncStatus.d.ts +68 -0
  1030. package/dist/tools/goofy/checkSyncStatus.d.ts.map +1 -0
  1031. package/dist/tools/goofy/checkSyncStatus.js +112 -0
  1032. package/dist/tools/goofy/checkSyncStatus.js.map +1 -0
  1033. package/dist/tools/goofy/codeMemoryLink.d.ts +82 -0
  1034. package/dist/tools/goofy/codeMemoryLink.d.ts.map +1 -0
  1035. package/dist/tools/goofy/codeMemoryLink.js +212 -0
  1036. package/dist/tools/goofy/codeMemoryLink.js.map +1 -0
  1037. package/dist/tools/goofy/compareInstanceMemory.d.ts +97 -0
  1038. package/dist/tools/goofy/compareInstanceMemory.d.ts.map +1 -0
  1039. package/dist/tools/goofy/compareInstanceMemory.js +218 -0
  1040. package/dist/tools/goofy/compareInstanceMemory.js.map +1 -0
  1041. package/dist/tools/goofy/createReasoningChain.d.ts +135 -0
  1042. package/dist/tools/goofy/createReasoningChain.d.ts.map +1 -0
  1043. package/dist/tools/goofy/createReasoningChain.js +257 -0
  1044. package/dist/tools/goofy/createReasoningChain.js.map +1 -0
  1045. package/dist/tools/goofy/deployTeamMember.d.ts +63 -0
  1046. package/dist/tools/goofy/deployTeamMember.d.ts.map +1 -0
  1047. package/dist/tools/goofy/deployTeamMember.js +103 -0
  1048. package/dist/tools/goofy/deployTeamMember.js.map +1 -0
  1049. package/dist/tools/goofy/drillDown.d.ts +143 -0
  1050. package/dist/tools/goofy/drillDown.d.ts.map +1 -0
  1051. package/dist/tools/goofy/drillDown.js +288 -0
  1052. package/dist/tools/goofy/drillDown.js.map +1 -0
  1053. package/dist/tools/goofy/extractClaudeSessions.d.ts +90 -0
  1054. package/dist/tools/goofy/extractClaudeSessions.d.ts.map +1 -0
  1055. package/dist/tools/goofy/extractClaudeSessions.js +277 -0
  1056. package/dist/tools/goofy/extractClaudeSessions.js.map +1 -0
  1057. package/dist/tools/goofy/extractContextRestorations.d.ts +70 -0
  1058. package/dist/tools/goofy/extractContextRestorations.d.ts.map +1 -0
  1059. package/dist/tools/goofy/extractContextRestorations.js +100 -0
  1060. package/dist/tools/goofy/extractContextRestorations.js.map +1 -0
  1061. package/dist/tools/goofy/findCodePointers.d.ts +364 -0
  1062. package/dist/tools/goofy/findCodePointers.d.ts.map +1 -0
  1063. package/dist/tools/goofy/findCodePointers.js +1764 -0
  1064. package/dist/tools/goofy/findCodePointers.js.map +1 -0
  1065. package/dist/tools/goofy/findMemoryGallery.d.ts +40 -0
  1066. package/dist/tools/goofy/findMemoryGallery.d.ts.map +1 -0
  1067. package/dist/tools/goofy/findMemoryGallery.js +66 -0
  1068. package/dist/tools/goofy/findMemoryGallery.js.map +1 -0
  1069. package/dist/tools/goofy/findWhatISaid.d.ts +300 -0
  1070. package/dist/tools/goofy/findWhatISaid.d.ts.map +1 -0
  1071. package/dist/tools/goofy/findWhatISaid.js +2547 -0
  1072. package/dist/tools/goofy/findWhatISaid.js.map +1 -0
  1073. package/dist/tools/goofy/forceResync.d.ts +57 -0
  1074. package/dist/tools/goofy/forceResync.d.ts.map +1 -0
  1075. package/dist/tools/goofy/forceResync.js +100 -0
  1076. package/dist/tools/goofy/forceResync.js.map +1 -0
  1077. package/dist/tools/goofy/getActiveTeamMembers.d.ts +48 -0
  1078. package/dist/tools/goofy/getActiveTeamMembers.d.ts.map +1 -0
  1079. package/dist/tools/goofy/getActiveTeamMembers.js +136 -0
  1080. package/dist/tools/goofy/getActiveTeamMembers.js.map +1 -0
  1081. package/dist/tools/goofy/getMemoryFull.d.ts +34 -0
  1082. package/dist/tools/goofy/getMemoryFull.d.ts.map +1 -0
  1083. package/dist/tools/goofy/getMemoryFull.js +58 -0
  1084. package/dist/tools/goofy/getMemoryFull.js.map +1 -0
  1085. package/dist/tools/goofy/getSessionWatcherStatus.d.ts +43 -0
  1086. package/dist/tools/goofy/getSessionWatcherStatus.d.ts.map +1 -0
  1087. package/dist/tools/goofy/getSessionWatcherStatus.js +92 -0
  1088. package/dist/tools/goofy/getSessionWatcherStatus.js.map +1 -0
  1089. package/dist/tools/goofy/getTeamMemberOutput.d.ts +35 -0
  1090. package/dist/tools/goofy/getTeamMemberOutput.d.ts.map +1 -0
  1091. package/dist/tools/goofy/getTeamMemberOutput.js +62 -0
  1092. package/dist/tools/goofy/getTeamMemberOutput.js.map +1 -0
  1093. package/dist/tools/goofy/getTeamMemberScreen.d.ts +28 -0
  1094. package/dist/tools/goofy/getTeamMemberScreen.d.ts.map +1 -0
  1095. package/dist/tools/goofy/getTeamMemberScreen.js +59 -0
  1096. package/dist/tools/goofy/getTeamMemberScreen.js.map +1 -0
  1097. package/dist/tools/goofy/getTeamMemberStatus.d.ts +33 -0
  1098. package/dist/tools/goofy/getTeamMemberStatus.d.ts.map +1 -0
  1099. package/dist/tools/goofy/getTeamMemberStatus.js +56 -0
  1100. package/dist/tools/goofy/getTeamMemberStatus.js.map +1 -0
  1101. package/dist/tools/goofy/index.d.ts +39 -0
  1102. package/dist/tools/goofy/index.d.ts.map +1 -0
  1103. package/dist/tools/goofy/index.js +51 -0
  1104. package/dist/tools/goofy/index.js.map +1 -0
  1105. package/dist/tools/goofy/interveneTeamMember.d.ts +33 -0
  1106. package/dist/tools/goofy/interveneTeamMember.d.ts.map +1 -0
  1107. package/dist/tools/goofy/interveneTeamMember.js +69 -0
  1108. package/dist/tools/goofy/interveneTeamMember.js.map +1 -0
  1109. package/dist/tools/goofy/killDeployedTeamMember.d.ts +29 -0
  1110. package/dist/tools/goofy/killDeployedTeamMember.d.ts.map +1 -0
  1111. package/dist/tools/goofy/killDeployedTeamMember.js +56 -0
  1112. package/dist/tools/goofy/killDeployedTeamMember.js.map +1 -0
  1113. package/dist/tools/goofy/linkTheVibes.d.ts +125 -0
  1114. package/dist/tools/goofy/linkTheVibes.d.ts.map +1 -0
  1115. package/dist/tools/goofy/linkTheVibes.js +354 -0
  1116. package/dist/tools/goofy/linkTheVibes.js.map +1 -0
  1117. package/dist/tools/goofy/listDeployedTeamMembers.d.ts +26 -0
  1118. package/dist/tools/goofy/listDeployedTeamMembers.d.ts.map +1 -0
  1119. package/dist/tools/goofy/listDeployedTeamMembers.js +52 -0
  1120. package/dist/tools/goofy/listDeployedTeamMembers.js.map +1 -0
  1121. package/dist/tools/goofy/listenForMessages.d.ts +56 -0
  1122. package/dist/tools/goofy/listenForMessages.d.ts.map +1 -0
  1123. package/dist/tools/goofy/listenForMessages.js +122 -0
  1124. package/dist/tools/goofy/listenForMessages.js.map +1 -0
  1125. package/dist/tools/goofy/memoryHealthCheck.d.ts +159 -0
  1126. package/dist/tools/goofy/memoryHealthCheck.d.ts.map +1 -0
  1127. package/dist/tools/goofy/memoryHealthCheck.js +443 -0
  1128. package/dist/tools/goofy/memoryHealthCheck.js.map +1 -0
  1129. package/dist/tools/goofy/rememberThisShit.d.ts +103 -0
  1130. package/dist/tools/goofy/rememberThisShit.d.ts.map +1 -0
  1131. package/dist/tools/goofy/rememberThisShit.js +291 -0
  1132. package/dist/tools/goofy/rememberThisShit.js.map +1 -0
  1133. package/dist/tools/goofy/sayToTeamMember.d.ts +55 -0
  1134. package/dist/tools/goofy/sayToTeamMember.d.ts.map +1 -0
  1135. package/dist/tools/goofy/sayToTeamMember.js +116 -0
  1136. package/dist/tools/goofy/sayToTeamMember.js.map +1 -0
  1137. package/dist/tools/goofy/selfMessage.d.ts +54 -0
  1138. package/dist/tools/goofy/selfMessage.d.ts.map +1 -0
  1139. package/dist/tools/goofy/selfMessage.js +111 -0
  1140. package/dist/tools/goofy/selfMessage.js.map +1 -0
  1141. package/dist/tools/goofy/sendHeartbeat.d.ts +53 -0
  1142. package/dist/tools/goofy/sendHeartbeat.d.ts.map +1 -0
  1143. package/dist/tools/goofy/sendHeartbeat.js +119 -0
  1144. package/dist/tools/goofy/sendHeartbeat.js.map +1 -0
  1145. package/dist/tools/goofy/showMeTheStats.d.ts +216 -0
  1146. package/dist/tools/goofy/showMeTheStats.d.ts.map +1 -0
  1147. package/dist/tools/goofy/showMeTheStats.js +535 -0
  1148. package/dist/tools/goofy/showMeTheStats.js.map +1 -0
  1149. package/dist/tools/goofy/smartRecall.d.ts +136 -0
  1150. package/dist/tools/goofy/smartRecall.d.ts.map +1 -0
  1151. package/dist/tools/goofy/smartRecall.js +286 -0
  1152. package/dist/tools/goofy/smartRecall.js.map +1 -0
  1153. package/dist/tools/goofy/smartSearch.d.ts +64 -0
  1154. package/dist/tools/goofy/smartSearch.d.ts.map +1 -0
  1155. package/dist/tools/goofy/smartSearch.js +89 -0
  1156. package/dist/tools/goofy/smartSearch.js.map +1 -0
  1157. package/dist/tools/goofy/smushMemoriesTogether.d.ts +128 -0
  1158. package/dist/tools/goofy/smushMemoriesTogether.d.ts.map +1 -0
  1159. package/dist/tools/goofy/smushMemoriesTogether.js +536 -0
  1160. package/dist/tools/goofy/smushMemoriesTogether.js.map +1 -0
  1161. package/dist/tools/goofy/spatialSearch.d.ts +198 -0
  1162. package/dist/tools/goofy/spatialSearch.d.ts.map +1 -0
  1163. package/dist/tools/goofy/spatialSearch.js +551 -0
  1164. package/dist/tools/goofy/spatialSearch.js.map +1 -0
  1165. package/dist/tools/goofy/spawnResearchTeamMember.d.ts +104 -0
  1166. package/dist/tools/goofy/spawnResearchTeamMember.d.ts.map +1 -0
  1167. package/dist/tools/goofy/spawnResearchTeamMember.js +290 -0
  1168. package/dist/tools/goofy/spawnResearchTeamMember.js.map +1 -0
  1169. package/dist/tools/goofy/spawnResearchTeamMemberTool.d.ts +121 -0
  1170. package/dist/tools/goofy/spawnResearchTeamMemberTool.d.ts.map +1 -0
  1171. package/dist/tools/goofy/spawnResearchTeamMemberTool.js +215 -0
  1172. package/dist/tools/goofy/spawnResearchTeamMemberTool.js.map +1 -0
  1173. package/dist/tools/goofy/startWatchingTheFiles.d.ts +81 -0
  1174. package/dist/tools/goofy/startWatchingTheFiles.d.ts.map +1 -0
  1175. package/dist/tools/goofy/startWatchingTheFiles.js +161 -0
  1176. package/dist/tools/goofy/startWatchingTheFiles.js.map +1 -0
  1177. package/dist/tools/goofy/stopWatchingTheFiles.d.ts +50 -0
  1178. package/dist/tools/goofy/stopWatchingTheFiles.d.ts.map +1 -0
  1179. package/dist/tools/goofy/stopWatchingTheFiles.js +81 -0
  1180. package/dist/tools/goofy/stopWatchingTheFiles.js.map +1 -0
  1181. package/dist/tools/goofy/whatDidIMean.d.ts +113 -0
  1182. package/dist/tools/goofy/whatDidIMean.d.ts.map +1 -0
  1183. package/dist/tools/goofy/whatDidIMean.js +401 -0
  1184. package/dist/tools/goofy/whatDidIMean.js.map +1 -0
  1185. package/dist/tools/goofy/yeahNahDeleteThat.d.ts +109 -0
  1186. package/dist/tools/goofy/yeahNahDeleteThat.d.ts.map +1 -0
  1187. package/dist/tools/goofy/yeahNahDeleteThat.js +319 -0
  1188. package/dist/tools/goofy/yeahNahDeleteThat.js.map +1 -0
  1189. package/dist/tools/index.d.ts +9 -0
  1190. package/dist/tools/index.d.ts.map +1 -0
  1191. package/dist/tools/index.js +9 -0
  1192. package/dist/tools/index.js.map +1 -0
  1193. package/dist/tools/teamMemberDeployer.d.ts +117 -0
  1194. package/dist/tools/teamMemberDeployer.d.ts.map +1 -0
  1195. package/dist/tools/teamMemberDeployer.js +613 -0
  1196. package/dist/tools/teamMemberDeployer.js.map +1 -0
  1197. package/dist/trace/index.d.ts +14 -0
  1198. package/dist/trace/index.d.ts.map +1 -0
  1199. package/dist/trace/index.js +16 -0
  1200. package/dist/trace/index.js.map +1 -0
  1201. package/dist/trace/tools/analyzeImpact.d.ts +90 -0
  1202. package/dist/trace/tools/analyzeImpact.d.ts.map +1 -0
  1203. package/dist/trace/tools/analyzeImpact.js +240 -0
  1204. package/dist/trace/tools/analyzeImpact.js.map +1 -0
  1205. package/dist/trace/tools/exploreDependencies.d.ts +81 -0
  1206. package/dist/trace/tools/exploreDependencies.d.ts.map +1 -0
  1207. package/dist/trace/tools/exploreDependencies.js +161 -0
  1208. package/dist/trace/tools/exploreDependencies.js.map +1 -0
  1209. package/dist/trace/tools/findSimilarBugs.d.ts +112 -0
  1210. package/dist/trace/tools/findSimilarBugs.d.ts.map +1 -0
  1211. package/dist/trace/tools/findSimilarBugs.js +216 -0
  1212. package/dist/trace/tools/findSimilarBugs.js.map +1 -0
  1213. package/dist/trace/tools/index.d.ts +22 -0
  1214. package/dist/trace/tools/index.d.ts.map +1 -0
  1215. package/dist/trace/tools/index.js +39 -0
  1216. package/dist/trace/tools/index.js.map +1 -0
  1217. package/dist/trace/tools/smartExplore.d.ts +126 -0
  1218. package/dist/trace/tools/smartExplore.d.ts.map +1 -0
  1219. package/dist/trace/tools/smartExplore.js +303 -0
  1220. package/dist/trace/tools/smartExplore.js.map +1 -0
  1221. package/dist/trace/tools/traceError.d.ts +101 -0
  1222. package/dist/trace/tools/traceError.d.ts.map +1 -0
  1223. package/dist/trace/tools/traceError.js +175 -0
  1224. package/dist/trace/tools/traceError.js.map +1 -0
  1225. package/dist/trace/traceExploreSystem.d.ts +271 -0
  1226. package/dist/trace/traceExploreSystem.d.ts.map +1 -0
  1227. package/dist/trace/traceExploreSystem.js +789 -0
  1228. package/dist/trace/traceExploreSystem.js.map +1 -0
  1229. package/dist/types/index.d.ts +421 -0
  1230. package/dist/types/index.d.ts.map +1 -0
  1231. package/dist/types/index.js +118 -0
  1232. package/dist/types/index.js.map +1 -0
  1233. package/dist/utils/circuitBreaker.d.ts +195 -0
  1234. package/dist/utils/circuitBreaker.d.ts.map +1 -0
  1235. package/dist/utils/circuitBreaker.js +374 -0
  1236. package/dist/utils/circuitBreaker.js.map +1 -0
  1237. package/dist/utils/cleanupHandler.d.ts +108 -0
  1238. package/dist/utils/cleanupHandler.d.ts.map +1 -0
  1239. package/dist/utils/cleanupHandler.js +203 -0
  1240. package/dist/utils/cleanupHandler.js.map +1 -0
  1241. package/dist/utils/compactXmlResponse.d.ts +60 -0
  1242. package/dist/utils/compactXmlResponse.d.ts.map +1 -0
  1243. package/dist/utils/compactXmlResponse.js +209 -0
  1244. package/dist/utils/compactXmlResponse.js.map +1 -0
  1245. package/dist/utils/cotBroadcast.d.ts +56 -0
  1246. package/dist/utils/cotBroadcast.d.ts.map +1 -0
  1247. package/dist/utils/cotBroadcast.js +157 -0
  1248. package/dist/utils/cotBroadcast.js.map +1 -0
  1249. package/dist/utils/debugLogger.d.ts +95 -0
  1250. package/dist/utils/debugLogger.d.ts.map +1 -0
  1251. package/dist/utils/debugLogger.js +610 -0
  1252. package/dist/utils/debugLogger.js.map +1 -0
  1253. package/dist/utils/fileProcessingQueue.d.ts +259 -0
  1254. package/dist/utils/fileProcessingQueue.d.ts.map +1 -0
  1255. package/dist/utils/fileProcessingQueue.js +714 -0
  1256. package/dist/utils/fileProcessingQueue.js.map +1 -0
  1257. package/dist/utils/humanReadableOutput.d.ts +124 -0
  1258. package/dist/utils/humanReadableOutput.d.ts.map +1 -0
  1259. package/dist/utils/humanReadableOutput.js +340 -0
  1260. package/dist/utils/humanReadableOutput.js.map +1 -0
  1261. package/dist/utils/index.d.ts +32 -0
  1262. package/dist/utils/index.d.ts.map +1 -0
  1263. package/dist/utils/index.js +71 -0
  1264. package/dist/utils/index.js.map +1 -0
  1265. package/dist/utils/instanceManager.d.ts +530 -0
  1266. package/dist/utils/instanceManager.d.ts.map +1 -0
  1267. package/dist/utils/instanceManager.js +1784 -0
  1268. package/dist/utils/instanceManager.js.map +1 -0
  1269. package/dist/utils/logger.d.ts +6 -0
  1270. package/dist/utils/logger.d.ts.map +1 -0
  1271. package/dist/utils/logger.js +49 -0
  1272. package/dist/utils/logger.js.map +1 -0
  1273. package/dist/utils/mapCleanup.d.ts +58 -0
  1274. package/dist/utils/mapCleanup.d.ts.map +1 -0
  1275. package/dist/utils/mapCleanup.js +150 -0
  1276. package/dist/utils/mapCleanup.js.map +1 -0
  1277. package/dist/utils/memoryManager.d.ts +349 -0
  1278. package/dist/utils/memoryManager.d.ts.map +1 -0
  1279. package/dist/utils/memoryManager.js +799 -0
  1280. package/dist/utils/memoryManager.js.map +1 -0
  1281. package/dist/utils/metrics.d.ts +160 -0
  1282. package/dist/utils/metrics.d.ts.map +1 -0
  1283. package/dist/utils/metrics.js +558 -0
  1284. package/dist/utils/metrics.js.map +1 -0
  1285. package/dist/utils/pathValidator.d.ts +96 -0
  1286. package/dist/utils/pathValidator.d.ts.map +1 -0
  1287. package/dist/utils/pathValidator.js +320 -0
  1288. package/dist/utils/pathValidator.js.map +1 -0
  1289. package/dist/utils/portAllocator.d.ts +296 -0
  1290. package/dist/utils/portAllocator.d.ts.map +1 -0
  1291. package/dist/utils/portAllocator.js +768 -0
  1292. package/dist/utils/portAllocator.js.map +1 -0
  1293. package/dist/utils/portUtils.d.ts +97 -0
  1294. package/dist/utils/portUtils.d.ts.map +1 -0
  1295. package/dist/utils/portUtils.js +285 -0
  1296. package/dist/utils/portUtils.js.map +1 -0
  1297. package/dist/utils/postgresAutoSetup.d.ts +55 -0
  1298. package/dist/utils/postgresAutoSetup.d.ts.map +1 -0
  1299. package/dist/utils/postgresAutoSetup.js +406 -0
  1300. package/dist/utils/postgresAutoSetup.js.map +1 -0
  1301. package/dist/utils/processHealthCheck.d.ts +61 -0
  1302. package/dist/utils/processHealthCheck.d.ts.map +1 -0
  1303. package/dist/utils/processHealthCheck.js +313 -0
  1304. package/dist/utils/processHealthCheck.js.map +1 -0
  1305. package/dist/utils/progressReporter.d.ts +151 -0
  1306. package/dist/utils/progressReporter.d.ts.map +1 -0
  1307. package/dist/utils/progressReporter.js +345 -0
  1308. package/dist/utils/progressReporter.js.map +1 -0
  1309. package/dist/utils/projectEnv.d.ts +73 -0
  1310. package/dist/utils/projectEnv.d.ts.map +1 -0
  1311. package/dist/utils/projectEnv.js +137 -0
  1312. package/dist/utils/projectEnv.js.map +1 -0
  1313. package/dist/utils/qoms.d.ts +122 -0
  1314. package/dist/utils/qoms.d.ts.map +1 -0
  1315. package/dist/utils/qoms.js +650 -0
  1316. package/dist/utils/qoms.js.map +1 -0
  1317. package/dist/utils/retryHelper.d.ts +122 -0
  1318. package/dist/utils/retryHelper.d.ts.map +1 -0
  1319. package/dist/utils/retryHelper.js +272 -0
  1320. package/dist/utils/retryHelper.js.map +1 -0
  1321. package/dist/utils/safeProcessTermination.d.ts +206 -0
  1322. package/dist/utils/safeProcessTermination.d.ts.map +1 -0
  1323. package/dist/utils/safeProcessTermination.js +552 -0
  1324. package/dist/utils/safeProcessTermination.js.map +1 -0
  1325. package/dist/utils/sessionInjector.d.ts +68 -0
  1326. package/dist/utils/sessionInjector.d.ts.map +1 -0
  1327. package/dist/utils/sessionInjector.js +189 -0
  1328. package/dist/utils/sessionInjector.js.map +1 -0
  1329. package/dist/utils/statsCache.d.ts +134 -0
  1330. package/dist/utils/statsCache.d.ts.map +1 -0
  1331. package/dist/utils/statsCache.js +285 -0
  1332. package/dist/utils/statsCache.js.map +1 -0
  1333. package/dist/utils/timeoutMiddleware.d.ts +81 -0
  1334. package/dist/utils/timeoutMiddleware.d.ts.map +1 -0
  1335. package/dist/utils/timeoutMiddleware.js +155 -0
  1336. package/dist/utils/timeoutMiddleware.js.map +1 -0
  1337. package/dist/utils/timerRegistry.d.ts +91 -0
  1338. package/dist/utils/timerRegistry.d.ts.map +1 -0
  1339. package/dist/utils/timerRegistry.js +187 -0
  1340. package/dist/utils/timerRegistry.js.map +1 -0
  1341. package/dist/utils/tokenCompressor.d.ts +332 -0
  1342. package/dist/utils/tokenCompressor.d.ts.map +1 -0
  1343. package/dist/utils/tokenCompressor.js +1306 -0
  1344. package/dist/utils/tokenCompressor.js.map +1 -0
  1345. package/dist/utils/tracing.d.ts +236 -0
  1346. package/dist/utils/tracing.d.ts.map +1 -0
  1347. package/dist/utils/tracing.js +378 -0
  1348. package/dist/utils/tracing.js.map +1 -0
  1349. package/dist/watcher/changeHandler.d.ts +123 -0
  1350. package/dist/watcher/changeHandler.d.ts.map +1 -0
  1351. package/dist/watcher/changeHandler.js +623 -0
  1352. package/dist/watcher/changeHandler.js.map +1 -0
  1353. package/dist/watcher/changeQueue.d.ts +133 -0
  1354. package/dist/watcher/changeQueue.d.ts.map +1 -0
  1355. package/dist/watcher/changeQueue.js +355 -0
  1356. package/dist/watcher/changeQueue.js.map +1 -0
  1357. package/dist/watcher/fileWatcher.d.ts +121 -0
  1358. package/dist/watcher/fileWatcher.d.ts.map +1 -0
  1359. package/dist/watcher/fileWatcher.js +531 -0
  1360. package/dist/watcher/fileWatcher.js.map +1 -0
  1361. package/dist/watcher/index.d.ts +94 -0
  1362. package/dist/watcher/index.d.ts.map +1 -0
  1363. package/dist/watcher/index.js +235 -0
  1364. package/dist/watcher/index.js.map +1 -0
  1365. package/dist/watcher/syncChecker.d.ts +93 -0
  1366. package/dist/watcher/syncChecker.d.ts.map +1 -0
  1367. package/dist/watcher/syncChecker.js +401 -0
  1368. package/dist/watcher/syncChecker.js.map +1 -0
  1369. package/dist/watcher/tsCompiler.d.ts +88 -0
  1370. package/dist/watcher/tsCompiler.d.ts.map +1 -0
  1371. package/dist/watcher/tsCompiler.js +212 -0
  1372. package/dist/watcher/tsCompiler.js.map +1 -0
  1373. package/embedding-sandbox/Dockerfile +77 -0
  1374. package/embedding-sandbox/Dockerfile.frankenstein +91 -0
  1375. package/embedding-sandbox/README.md +193 -0
  1376. package/embedding-sandbox/__pycache__/frankenstein-embeddings.cpython-312.pyc +0 -0
  1377. package/embedding-sandbox/__pycache__/frankenstein-embeddings.cpython-313.pyc +0 -0
  1378. package/embedding-sandbox/__pycache__/qqms_v2.cpython-312.pyc +0 -0
  1379. package/embedding-sandbox/__pycache__/qqms_v2.cpython-313.pyc +0 -0
  1380. package/embedding-sandbox/add_js_docs.py +684 -0
  1381. package/embedding-sandbox/build_docs_db.py +239 -0
  1382. package/embedding-sandbox/client.cjs +376 -0
  1383. package/embedding-sandbox/client.ts +913 -0
  1384. package/embedding-sandbox/deploy-frankenstein.sh +240 -0
  1385. package/embedding-sandbox/docker-compose.yml +60 -0
  1386. package/embedding-sandbox/docker-manager.py +325 -0
  1387. package/embedding-sandbox/docs/python_docs.db +0 -0
  1388. package/embedding-sandbox/download-model.mjs +79 -0
  1389. package/embedding-sandbox/download-model.py +28 -0
  1390. package/embedding-sandbox/embedding-supervisor.sh +164 -0
  1391. package/embedding-sandbox/frankenstein-embeddings.py +3940 -0
  1392. package/embedding-sandbox/manage-services.sh +354 -0
  1393. package/embedding-sandbox/overflow_queue.py +345 -0
  1394. package/embedding-sandbox/package.json +17 -0
  1395. package/embedding-sandbox/project_isolation.py +292 -0
  1396. package/embedding-sandbox/qqms_v2.py +967 -0
  1397. package/embedding-sandbox/ram-manager.sh +311 -0
  1398. package/embedding-sandbox/requirements-frankenstein.txt +7 -0
  1399. package/embedding-sandbox/run_js_docs.py +59 -0
  1400. package/embedding-sandbox/seed_docs.py +885 -0
  1401. package/embedding-sandbox/server-batch.mjs +228 -0
  1402. package/embedding-sandbox/server.mjs +389 -0
  1403. package/embedding-sandbox/specmem/sockets/claude-input-state.json +1 -0
  1404. package/embedding-sandbox/specmem/sockets/embedding-death-reason.txt +3 -0
  1405. package/embedding-sandbox/specmem/sockets/seen-sessions.json +1 -0
  1406. package/embedding-sandbox/specmem/sockets/session-start.lock +1 -0
  1407. package/embedding-sandbox/specmem/sockets/session-stops.log +7 -0
  1408. package/embedding-sandbox/start-frankenstein-throttled.sh +98 -0
  1409. package/embedding-sandbox/start-on-demand.sh +116 -0
  1410. package/embedding-sandbox/start-sandbox.sh +237 -0
  1411. package/embedding-sandbox/start-supervised.sh +11 -0
  1412. package/embedding-sandbox/stop-sandbox.sh +51 -0
  1413. package/embedding-sandbox/test-socket.mjs +61 -0
  1414. package/embedding-sandbox/warm-start.sh +353 -0
  1415. package/embedding-sandbox/warm_start_feeder.py +660 -0
  1416. package/legal/README.md +31 -0
  1417. package/legal/anthropic-privacy-center-screenshot-2026-01-30.png +0 -0
  1418. package/legal/anthropic-tos-screenshot-2026-01-30.png +0 -0
  1419. package/lib/codebase-bridge.cjs +308 -0
  1420. package/package.json +136 -0
  1421. package/plugins/specmem-agents/agents/bug-hunter.md +79 -0
  1422. package/plugins/specmem-agents/agents/memory-explorer.md +57 -0
  1423. package/plugins/specmem-agents/agents/team-coordinator.md +82 -0
  1424. package/scripts/auto-updater.cjs +399 -0
  1425. package/scripts/backfill-code-definition-embeddings.ts +440 -0
  1426. package/scripts/backfill-code-embeddings.ts +206 -0
  1427. package/scripts/capture-tos-screenshots.cjs +94 -0
  1428. package/scripts/check-global-install.cjs +67 -0
  1429. package/scripts/cleanup-embedding-servers.sh +25 -0
  1430. package/scripts/dashboard-standalone.sh +369 -0
  1431. package/scripts/deploy-hooks.cjs +1451 -0
  1432. package/scripts/deploy.sh +106 -0
  1433. package/scripts/docker-project-down.sh +83 -0
  1434. package/scripts/docker-project-list.sh +40 -0
  1435. package/scripts/docker-project-up.sh +79 -0
  1436. package/scripts/fast-backfill-embeddings.ts +173 -0
  1437. package/scripts/fast-batch-embedder.cjs +334 -0
  1438. package/scripts/first-run-model-setup.cjs +849 -0
  1439. package/scripts/global-postinstall.cjs +1957 -0
  1440. package/scripts/index-codebase.js +72 -0
  1441. package/scripts/migrate-fix-embeddings.py +110 -0
  1442. package/scripts/migrate-to-project-schemas.ts +525 -0
  1443. package/scripts/optimize-embedding-model.py +324 -0
  1444. package/scripts/optimize-instructions.cjs +530 -0
  1445. package/scripts/pack-docker-images.sh +68 -0
  1446. package/scripts/pack-for-testing.sh +130 -0
  1447. package/scripts/postinstall.cjs +54 -0
  1448. package/scripts/project-env.sh +51 -0
  1449. package/scripts/reset-db.sh +30 -0
  1450. package/scripts/run-indexer.ts +69 -0
  1451. package/scripts/run-migrations.js +47 -0
  1452. package/scripts/setup-db.sh +34 -0
  1453. package/scripts/setup-minimal-schema.sql +143 -0
  1454. package/scripts/skills/code-review.md +44 -0
  1455. package/scripts/skills/debugging.md +56 -0
  1456. package/scripts/skills/specmem-deployteam.md +239 -0
  1457. package/scripts/skills/teammemberskills/EFFICIENT_GREP.md +171 -0
  1458. package/scripts/skills/teammemberskills/task-planning.md +67 -0
  1459. package/scripts/specmem/sockets/session-start.lock +1 -0
  1460. package/scripts/specmem/sockets/session-stops.log +1 -0
  1461. package/scripts/specmem-health.sh +382 -0
  1462. package/scripts/specmem-init.cjs +6935 -0
  1463. package/scripts/strip-debug-logs.cjs +43 -0
  1464. package/scripts/test-mcp-standalone.sh +365 -0
  1465. package/scripts/test-optimized-models.py +166 -0
  1466. package/scripts/verify-embedding-fix.sh +148 -0
  1467. package/skills/code-review.md +44 -0
  1468. package/skills/debugging.md +56 -0
  1469. package/skills/specmem-deployteam.md +239 -0
  1470. package/skills/teammemberskills/EFFICIENT_GREP.md +171 -0
  1471. package/skills/teammemberskills/task-planning.md +67 -0
  1472. package/specmem-health.cjs +522 -0
  1473. package/specmem.env +216 -0
@@ -0,0 +1,3756 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>SPECMEM // TEAM MEMBER OPERATIONS</title>
7
+ <style>
8
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap');
9
+
10
+ * { margin: 0; padding: 0; box-sizing: border-box; }
11
+
12
+ :root {
13
+ /* Modern Color Palette */
14
+ --primary: #0EA5E9;
15
+ --primary-dark: #0284C7;
16
+ --primary-glow: rgba(14, 165, 233, 0.4);
17
+ --accent: #8B5CF6;
18
+ --accent-light: #A78BFA;
19
+ --success: #10B981;
20
+ --warning: #F59E0B;
21
+ --error: #F43F5E;
22
+ --info: #06B6D4;
23
+
24
+ /* Backgrounds */
25
+ --bg-primary: #0A0A0A;
26
+ --bg-secondary: #141414;
27
+ --bg-tertiary: #1A1A1A;
28
+ --bg-elevated: #1F1F1F;
29
+ --bg-overlay: rgba(0, 0, 0, 0.85);
30
+
31
+ /* Text */
32
+ --text-primary: #F3F4F6;
33
+ --text-secondary: #D1D5DB;
34
+ --text-tertiary: #9CA3AF;
35
+ --text-dim: #6B7280;
36
+
37
+ /* Borders */
38
+ --border-primary: #2A2A2A;
39
+ --border-secondary: #333333;
40
+ --border-accent: #3F3F3F;
41
+
42
+ /* Legacy compatibility */
43
+ --csgo-yellow: var(--primary);
44
+ --csgo-yellow-dark: var(--primary-dark);
45
+ --csgo-yellow-glow: var(--primary-glow);
46
+ --csgo-black: var(--bg-primary);
47
+ --csgo-dark: var(--bg-secondary);
48
+ --csgo-darker: var(--bg-primary);
49
+ --csgo-gray: var(--bg-tertiary);
50
+ --csgo-gray-light: var(--bg-elevated);
51
+ --csgo-text: var(--text-primary);
52
+ --csgo-text-dim: var(--text-dim);
53
+ --csgo-success: var(--success);
54
+ --csgo-error: var(--error);
55
+ --csgo-warning: var(--warning);
56
+ --csgo-border: var(--border-primary);
57
+ }
58
+
59
+ body {
60
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
61
+ background: var(--bg-primary);
62
+ color: var(--text-primary);
63
+ min-height: 100vh;
64
+ position: relative;
65
+ }
66
+
67
+ body::before {
68
+ content: '';
69
+ position: fixed;
70
+ top: 0; left: 0;
71
+ width: 100%; height: 100%;
72
+ background:
73
+ radial-gradient(circle at 20% 50%, rgba(14, 165, 233, 0.08) 0%, transparent 50%),
74
+ radial-gradient(circle at 80% 80%, rgba(139, 92, 246, 0.06) 0%, transparent 50%),
75
+ linear-gradient(90deg, rgba(14, 165, 233, 0.02) 1px, transparent 1px),
76
+ linear-gradient(rgba(14, 165, 233, 0.02) 1px, transparent 1px);
77
+ background-size: 100% 100%, 100% 100%, 40px 40px, 40px 40px;
78
+ pointer-events: none;
79
+ z-index: 0;
80
+ }
81
+
82
+ .header {
83
+ position: fixed;
84
+ top: 0; left: 0; right: 0;
85
+ height: 64px;
86
+ background: rgba(20, 20, 20, 0.8);
87
+ backdrop-filter: blur(12px);
88
+ -webkit-backdrop-filter: blur(12px);
89
+ border-bottom: 1px solid var(--border-secondary);
90
+ display: flex;
91
+ align-items: center;
92
+ justify-content: space-between;
93
+ padding: 0 24px;
94
+ z-index: 1000;
95
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3), 0 0 1px rgba(14, 165, 233, 0.2);
96
+ }
97
+
98
+ .logo {
99
+ font-family: 'JetBrains Mono', monospace;
100
+ font-size: 18px;
101
+ font-weight: 700;
102
+ background: linear-gradient(135deg, var(--primary) 0%, var(--accent) 100%);
103
+ -webkit-background-clip: text;
104
+ -webkit-text-fill-color: transparent;
105
+ background-clip: text;
106
+ letter-spacing: 1px;
107
+ position: relative;
108
+ }
109
+
110
+ .logo::after {
111
+ content: '';
112
+ position: absolute;
113
+ bottom: -2px;
114
+ left: 0;
115
+ width: 40%;
116
+ height: 2px;
117
+ background: linear-gradient(90deg, var(--primary), transparent);
118
+ }
119
+
120
+ .header-stats {
121
+ display: flex;
122
+ gap: 30px;
123
+ font-size: 14px;
124
+ }
125
+
126
+ .stat-item {
127
+ display: flex;
128
+ flex-direction: column;
129
+ align-items: center;
130
+ }
131
+
132
+ .stat-value {
133
+ font-family: 'JetBrains Mono', monospace;
134
+ font-size: 20px;
135
+ font-weight: 600;
136
+ color: var(--primary);
137
+ }
138
+
139
+ .stat-label {
140
+ font-size: 11px;
141
+ color: var(--text-dim);
142
+ text-transform: uppercase;
143
+ letter-spacing: 0.5px;
144
+ margin-top: 2px;
145
+ }
146
+
147
+ .main-container {
148
+ display: grid;
149
+ grid-template-columns: 300px 1fr 360px;
150
+ gap: 20px;
151
+ padding: 84px 24px 24px;
152
+ min-height: 100vh;
153
+ position: relative;
154
+ z-index: 1;
155
+ }
156
+
157
+ .panel {
158
+ background: rgba(26, 26, 26, 0.6);
159
+ backdrop-filter: blur(8px);
160
+ -webkit-backdrop-filter: blur(8px);
161
+ border: 1px solid var(--border-primary);
162
+ border-radius: 12px;
163
+ overflow: hidden;
164
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
165
+ transition: all 0.3s ease;
166
+ }
167
+
168
+ .panel:hover {
169
+ border-color: var(--border-secondary);
170
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
171
+ }
172
+
173
+ .panel-header {
174
+ background: linear-gradient(135deg, rgba(14, 165, 233, 0.12) 0%, rgba(139, 92, 246, 0.08) 100%);
175
+ color: var(--text-primary);
176
+ padding: 14px 18px;
177
+ font-family: 'Inter', sans-serif;
178
+ font-size: 13px;
179
+ font-weight: 600;
180
+ text-transform: uppercase;
181
+ letter-spacing: 1px;
182
+ display: flex;
183
+ justify-content: space-between;
184
+ align-items: center;
185
+ border-bottom: 1px solid var(--border-primary);
186
+ }
187
+
188
+ .panel-body {
189
+ padding: 16px;
190
+ max-height: calc(100vh - 180px);
191
+ overflow-y: auto;
192
+ }
193
+
194
+ .panel-body::-webkit-scrollbar { width: 6px; }
195
+ .panel-body::-webkit-scrollbar-track { background: var(--bg-primary); border-radius: 3px; }
196
+ .panel-body::-webkit-scrollbar-thumb {
197
+ background: linear-gradient(180deg, var(--primary) 0%, var(--accent) 100%);
198
+ border-radius: 3px;
199
+ }
200
+ .panel-body::-webkit-scrollbar-thumb:hover { opacity: 0.8; }
201
+
202
+ .team-member-card {
203
+ background: rgba(31, 31, 31, 0.6);
204
+ border: 1px solid var(--border-primary);
205
+ border-radius: 10px;
206
+ padding: 14px;
207
+ margin-bottom: 12px;
208
+ cursor: pointer;
209
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
210
+ position: relative;
211
+ overflow: hidden;
212
+ }
213
+
214
+ .team-member-card::before {
215
+ content: '';
216
+ position: absolute;
217
+ top: 0;
218
+ left: 0;
219
+ width: 3px;
220
+ height: 100%;
221
+ background: linear-gradient(180deg, var(--primary) 0%, var(--accent) 100%);
222
+ opacity: 0;
223
+ transition: opacity 0.3s ease;
224
+ }
225
+
226
+ .team-member-card:hover {
227
+ border-color: var(--border-accent);
228
+ background: rgba(31, 31, 31, 0.9);
229
+ transform: translateX(2px);
230
+ box-shadow: 0 4px 20px rgba(14, 165, 233, 0.15);
231
+ }
232
+
233
+ .team-member-card:hover::before {
234
+ opacity: 1;
235
+ }
236
+
237
+ .team-member-card.selected {
238
+ border-color: var(--primary);
239
+ background: rgba(14, 165, 233, 0.08);
240
+ box-shadow: 0 0 0 1px var(--primary), 0 4px 20px rgba(14, 165, 233, 0.2);
241
+ }
242
+
243
+ .team-member-card.selected::before {
244
+ opacity: 1;
245
+ }
246
+
247
+ .team-member-card-header {
248
+ display: flex;
249
+ justify-content: space-between;
250
+ align-items: center;
251
+ margin-bottom: 8px;
252
+ }
253
+
254
+ .team-member-name {
255
+ font-weight: 600;
256
+ font-size: 14px;
257
+ color: var(--csgo-text);
258
+ }
259
+
260
+ .team-member-type {
261
+ font-size: 10px;
262
+ padding: 4px 10px;
263
+ border-radius: 12px;
264
+ text-transform: uppercase;
265
+ letter-spacing: 0.5px;
266
+ font-weight: 600;
267
+ }
268
+
269
+ .team-member-type.worker {
270
+ background: rgba(16, 185, 129, 0.15);
271
+ color: var(--success);
272
+ border: 1px solid rgba(16, 185, 129, 0.3);
273
+ }
274
+ .team-member-type.overseer {
275
+ background: rgba(14, 165, 233, 0.15);
276
+ color: var(--primary);
277
+ border: 1px solid rgba(14, 165, 233, 0.3);
278
+ }
279
+ .team-member-type.qa {
280
+ background: rgba(244, 63, 94, 0.15);
281
+ color: var(--error);
282
+ border: 1px solid rgba(244, 63, 94, 0.3);
283
+ }
284
+
285
+ .status-badge {
286
+ display: inline-flex;
287
+ align-items: center;
288
+ gap: 6px;
289
+ font-size: 10px;
290
+ padding: 5px 12px;
291
+ border-radius: 14px;
292
+ text-transform: uppercase;
293
+ font-weight: 600;
294
+ letter-spacing: 0.3px;
295
+ }
296
+
297
+ .status-badge.running {
298
+ background: rgba(16, 185, 129, 0.15);
299
+ color: var(--success);
300
+ border: 1px solid rgba(16, 185, 129, 0.3);
301
+ }
302
+ .status-badge.pending {
303
+ background: rgba(245, 158, 11, 0.15);
304
+ color: var(--warning);
305
+ border: 1px solid rgba(245, 158, 11, 0.3);
306
+ }
307
+ .status-badge.completed {
308
+ background: rgba(6, 182, 212, 0.15);
309
+ color: var(--info);
310
+ border: 1px solid rgba(6, 182, 212, 0.3);
311
+ }
312
+ .status-badge.failed {
313
+ background: rgba(244, 63, 94, 0.15);
314
+ color: var(--error);
315
+ border: 1px solid rgba(244, 63, 94, 0.3);
316
+ }
317
+ .status-badge.stopped {
318
+ background: rgba(107, 114, 128, 0.15);
319
+ color: var(--text-dim);
320
+ border: 1px solid rgba(107, 114, 128, 0.3);
321
+ }
322
+
323
+ .status-dot {
324
+ width: 6px;
325
+ height: 6px;
326
+ border-radius: 50%;
327
+ background: currentColor;
328
+ }
329
+
330
+ .status-badge.running .status-dot { animation: pulse 1.5s infinite; }
331
+
332
+ @keyframes pulse {
333
+ 0%, 100% { opacity: 1; }
334
+ 50% { opacity: 0.4; }
335
+ }
336
+
337
+ .progress-bar {
338
+ height: 6px;
339
+ background: var(--bg-secondary);
340
+ border-radius: 6px;
341
+ margin-top: 10px;
342
+ overflow: hidden;
343
+ position: relative;
344
+ }
345
+
346
+ .progress-fill {
347
+ height: 100%;
348
+ background: linear-gradient(90deg, var(--primary) 0%, var(--accent) 100%);
349
+ transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);
350
+ border-radius: 6px;
351
+ position: relative;
352
+ overflow: hidden;
353
+ }
354
+
355
+ .progress-fill::after {
356
+ content: '';
357
+ position: absolute;
358
+ top: 0;
359
+ left: 0;
360
+ right: 0;
361
+ bottom: 0;
362
+ background: linear-gradient(90deg,
363
+ transparent,
364
+ rgba(255, 255, 255, 0.2),
365
+ transparent
366
+ );
367
+ animation: shimmer 2s infinite;
368
+ }
369
+
370
+ @keyframes shimmer {
371
+ 0% { transform: translateX(-100%); }
372
+ 100% { transform: translateX(100%); }
373
+ }
374
+
375
+ .token-info {
376
+ display: flex;
377
+ justify-content: space-between;
378
+ font-size: 11px;
379
+ color: var(--text-tertiary);
380
+ margin-top: 10px;
381
+ }
382
+
383
+ .token-value {
384
+ color: var(--primary);
385
+ font-family: 'JetBrains Mono', monospace;
386
+ font-weight: 600;
387
+ }
388
+
389
+ .detail-section {
390
+ margin-bottom: 20px;
391
+ }
392
+
393
+ .detail-title {
394
+ font-size: 11px;
395
+ text-transform: uppercase;
396
+ letter-spacing: 1px;
397
+ color: var(--csgo-text-dim);
398
+ margin-bottom: 8px;
399
+ padding-bottom: 5px;
400
+ border-bottom: 1px solid var(--csgo-border);
401
+ }
402
+
403
+ .detail-row {
404
+ display: flex;
405
+ justify-content: space-between;
406
+ padding: 6px 0;
407
+ font-size: 13px;
408
+ }
409
+
410
+ .detail-label { color: var(--csgo-text-dim); }
411
+ .detail-value { color: var(--csgo-text); font-family: 'Orbitron', monospace; font-size: 12px; }
412
+
413
+ .log-container {
414
+ background: var(--csgo-darker);
415
+ border: 1px solid var(--csgo-border);
416
+ border-radius: 4px;
417
+ height: 300px;
418
+ overflow-y: auto;
419
+ font-family: 'Courier New', monospace;
420
+ font-size: 11px;
421
+ padding: 10px;
422
+ }
423
+
424
+ .log-entry {
425
+ padding: 4px 0;
426
+ border-bottom: 1px solid rgba(255, 255, 255, 0.05);
427
+ }
428
+
429
+ .log-entry.info { color: var(--csgo-text); }
430
+ .log-entry.warn { color: var(--csgo-warning); }
431
+ .log-entry.error { color: var(--csgo-error); }
432
+ .log-entry.debug { color: var(--csgo-text-dim); }
433
+
434
+ .log-timestamp {
435
+ color: var(--csgo-text-dim);
436
+ margin-right: 8px;
437
+ }
438
+
439
+ .btn {
440
+ background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%);
441
+ color: white;
442
+ border: none;
443
+ padding: 10px 20px;
444
+ font-family: 'Inter', sans-serif;
445
+ font-weight: 600;
446
+ font-size: 13px;
447
+ text-transform: uppercase;
448
+ letter-spacing: 0.5px;
449
+ border-radius: 8px;
450
+ cursor: pointer;
451
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
452
+ position: relative;
453
+ overflow: hidden;
454
+ }
455
+
456
+ .btn::before {
457
+ content: '';
458
+ position: absolute;
459
+ top: 50%;
460
+ left: 50%;
461
+ width: 0;
462
+ height: 0;
463
+ border-radius: 50%;
464
+ background: rgba(255, 255, 255, 0.2);
465
+ transform: translate(-50%, -50%);
466
+ transition: width 0.6s, height 0.6s;
467
+ }
468
+
469
+ .btn:hover::before {
470
+ width: 300px;
471
+ height: 300px;
472
+ }
473
+
474
+ .btn:hover {
475
+ box-shadow: 0 8px 24px rgba(14, 165, 233, 0.4);
476
+ transform: translateY(-2px);
477
+ }
478
+
479
+ .btn:active {
480
+ transform: translateY(0);
481
+ }
482
+
483
+ .btn-danger {
484
+ background: linear-gradient(135deg, var(--error) 0%, #DC2626 100%);
485
+ }
486
+
487
+ .btn-danger:hover {
488
+ box-shadow: 0 8px 24px rgba(244, 63, 94, 0.4);
489
+ }
490
+
491
+ .btn-secondary {
492
+ background: var(--bg-elevated);
493
+ color: var(--text-secondary);
494
+ border: 1px solid var(--border-secondary);
495
+ }
496
+
497
+ .btn-secondary:hover {
498
+ background: var(--bg-tertiary);
499
+ border-color: var(--border-accent);
500
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
501
+ }
502
+
503
+ .btn-small {
504
+ padding: 6px 12px;
505
+ font-size: 11px;
506
+ }
507
+
508
+ .action-bar {
509
+ display: flex;
510
+ gap: 8px;
511
+ margin-top: 15px;
512
+ }
513
+
514
+ .deploy-form {
515
+ display: grid;
516
+ gap: 12px;
517
+ }
518
+
519
+ .form-group label {
520
+ display: block;
521
+ font-size: 11px;
522
+ text-transform: uppercase;
523
+ letter-spacing: 1px;
524
+ color: var(--csgo-text-dim);
525
+ margin-bottom: 5px;
526
+ }
527
+
528
+ .form-group input,
529
+ .form-group select {
530
+ width: 100%;
531
+ background: var(--bg-secondary);
532
+ border: 1px solid var(--border-primary);
533
+ border-radius: 8px;
534
+ padding: 12px 14px;
535
+ color: var(--text-primary);
536
+ font-family: 'Inter', sans-serif;
537
+ font-size: 14px;
538
+ transition: all 0.3s ease;
539
+ }
540
+
541
+ .form-group input:focus,
542
+ .form-group select:focus {
543
+ outline: none;
544
+ border-color: var(--primary);
545
+ background: var(--bg-tertiary);
546
+ box-shadow: 0 0 0 3px rgba(14, 165, 233, 0.1);
547
+ }
548
+
549
+ .form-group input::placeholder {
550
+ color: var(--text-dim);
551
+ }
552
+
553
+ .no-team-members {
554
+ text-align: center;
555
+ padding: 30px;
556
+ color: var(--csgo-text-dim);
557
+ }
558
+
559
+ .no-team-members-icon {
560
+ font-size: 48px;
561
+ margin-bottom: 10px;
562
+ opacity: 0.3;
563
+ }
564
+
565
+ .ws-status {
566
+ display: flex;
567
+ align-items: center;
568
+ gap: 8px;
569
+ font-size: 11px;
570
+ }
571
+
572
+ .ws-dot {
573
+ width: 8px;
574
+ height: 8px;
575
+ border-radius: 50%;
576
+ background: var(--csgo-error);
577
+ }
578
+
579
+ .ws-dot.connected { background: var(--csgo-success); }
580
+
581
+ .filter-bar {
582
+ display: flex;
583
+ gap: 8px;
584
+ margin-bottom: 10px;
585
+ }
586
+
587
+ .filter-btn {
588
+ padding: 6px 14px;
589
+ font-size: 11px;
590
+ font-weight: 600;
591
+ background: var(--bg-tertiary);
592
+ border: 1px solid var(--border-primary);
593
+ color: var(--text-tertiary);
594
+ border-radius: 16px;
595
+ cursor: pointer;
596
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
597
+ }
598
+
599
+ .filter-btn:hover {
600
+ background: var(--bg-elevated);
601
+ border-color: var(--border-secondary);
602
+ color: var(--text-secondary);
603
+ }
604
+
605
+ .filter-btn.active {
606
+ background: linear-gradient(135deg, var(--primary) 0%, var(--accent) 100%);
607
+ color: white;
608
+ border-color: transparent;
609
+ box-shadow: 0 4px 12px rgba(14, 165, 233, 0.3);
610
+ }
611
+
612
+ .log-filters {
613
+ display: flex;
614
+ gap: 5px;
615
+ margin-bottom: 8px;
616
+ }
617
+
618
+ .hidden { display: none !important; }
619
+
620
+ .tab-container {
621
+ display: flex;
622
+ border-bottom: 2px solid var(--csgo-border);
623
+ margin-bottom: 15px;
624
+ }
625
+
626
+ .tab-btn {
627
+ padding: 12px 24px;
628
+ background: transparent;
629
+ border: none;
630
+ color: var(--text-dim);
631
+ font-family: 'Inter', sans-serif;
632
+ font-size: 12px;
633
+ font-weight: 600;
634
+ text-transform: uppercase;
635
+ letter-spacing: 0.5px;
636
+ cursor: pointer;
637
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
638
+ position: relative;
639
+ }
640
+
641
+ .tab-btn::before {
642
+ content: '';
643
+ position: absolute;
644
+ bottom: 0;
645
+ left: 50%;
646
+ width: 0;
647
+ height: 2px;
648
+ background: linear-gradient(90deg, var(--primary), var(--accent));
649
+ transform: translateX(-50%);
650
+ transition: width 0.3s ease;
651
+ }
652
+
653
+ .tab-btn:hover {
654
+ color: var(--text-secondary);
655
+ }
656
+
657
+ .tab-btn:hover::before {
658
+ width: 60%;
659
+ }
660
+
661
+ .tab-btn.active {
662
+ color: var(--primary);
663
+ }
664
+
665
+ .tab-btn.active::before {
666
+ width: 100%;
667
+ }
668
+
669
+ .tab-btn.tab-disabled {
670
+ color: var(--csgo-gray);
671
+ opacity: 0.5;
672
+ cursor: not-allowed;
673
+ }
674
+
675
+ .tab-btn.tab-disabled:hover {
676
+ color: var(--csgo-gray);
677
+ }
678
+
679
+ .task-team-member-notice {
680
+ width: 100%;
681
+ }
682
+
683
+ .tab-badge {
684
+ display: inline-flex;
685
+ align-items: center;
686
+ justify-content: center;
687
+ min-width: 18px;
688
+ height: 18px;
689
+ padding: 0 5px;
690
+ border-radius: 9px;
691
+ background: var(--csgo-error);
692
+ color: white;
693
+ font-size: 10px;
694
+ margin-left: 5px;
695
+ }
696
+
697
+ .tab-content {
698
+ display: none;
699
+ }
700
+
701
+ .tab-content.active {
702
+ display: block;
703
+ }
704
+
705
+ .code-card {
706
+ background: rgba(31, 31, 31, 0.6);
707
+ border: 1px solid var(--border-primary);
708
+ border-radius: 10px;
709
+ margin-bottom: 14px;
710
+ overflow: hidden;
711
+ transition: all 0.3s ease;
712
+ }
713
+
714
+ .code-card:hover {
715
+ border-color: var(--border-secondary);
716
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
717
+ }
718
+
719
+ .code-card-header {
720
+ padding: 14px;
721
+ border-bottom: 1px solid var(--border-primary);
722
+ display: flex;
723
+ justify-content: space-between;
724
+ align-items: flex-start;
725
+ }
726
+
727
+ .code-title {
728
+ font-weight: 600;
729
+ font-size: 14px;
730
+ color: var(--primary);
731
+ margin-bottom: 4px;
732
+ }
733
+
734
+ .code-meta {
735
+ font-size: 11px;
736
+ color: var(--csgo-text-dim);
737
+ }
738
+
739
+ .code-tags {
740
+ display: flex;
741
+ gap: 5px;
742
+ flex-wrap: wrap;
743
+ margin-top: 5px;
744
+ }
745
+
746
+ .code-tag {
747
+ font-size: 9px;
748
+ padding: 3px 8px;
749
+ background: rgba(14, 165, 233, 0.12);
750
+ border: 1px solid rgba(14, 165, 233, 0.3);
751
+ border-radius: 10px;
752
+ color: var(--primary);
753
+ font-weight: 600;
754
+ }
755
+
756
+ .code-preview {
757
+ background: var(--csgo-darker);
758
+ padding: 12px;
759
+ font-family: 'Courier New', monospace;
760
+ font-size: 11px;
761
+ max-height: 200px;
762
+ overflow-y: auto;
763
+ white-space: pre-wrap;
764
+ color: var(--csgo-text);
765
+ border-top: 1px solid var(--csgo-border);
766
+ }
767
+
768
+ .code-actions {
769
+ display: flex;
770
+ gap: 8px;
771
+ padding: 10px 12px;
772
+ border-top: 1px solid var(--csgo-border);
773
+ background: var(--csgo-gray-light);
774
+ }
775
+
776
+ .feedback-btn {
777
+ display: flex;
778
+ align-items: center;
779
+ gap: 4px;
780
+ padding: 5px 10px;
781
+ font-size: 10px;
782
+ background: var(--csgo-gray);
783
+ border: 1px solid var(--csgo-border);
784
+ color: var(--csgo-text);
785
+ border-radius: 2px;
786
+ cursor: pointer;
787
+ transition: all 0.2s;
788
+ }
789
+
790
+ .feedback-btn:hover {
791
+ border-color: var(--csgo-yellow);
792
+ }
793
+
794
+ .feedback-btn.positive:hover { border-color: var(--csgo-success); color: var(--csgo-success); }
795
+ .feedback-btn.negative:hover { border-color: var(--csgo-error); color: var(--csgo-error); }
796
+ .feedback-btn.question:hover { border-color: #2196F3; color: #2196F3; }
797
+ .feedback-btn.critique:hover { border-color: var(--csgo-warning); color: var(--csgo-warning); }
798
+
799
+ .feedback-count {
800
+ font-family: 'Orbitron', monospace;
801
+ font-size: 10px;
802
+ color: var(--csgo-text-dim);
803
+ }
804
+
805
+ .feedback-list {
806
+ padding: 10px 12px;
807
+ border-top: 1px solid var(--csgo-border);
808
+ }
809
+
810
+ .feedback-item {
811
+ padding: 8px;
812
+ background: var(--csgo-darker);
813
+ border-radius: 4px;
814
+ margin-bottom: 8px;
815
+ font-size: 12px;
816
+ }
817
+
818
+ .feedback-item-header {
819
+ display: flex;
820
+ justify-content: space-between;
821
+ margin-bottom: 5px;
822
+ }
823
+
824
+ .feedback-type {
825
+ font-size: 9px;
826
+ padding: 2px 6px;
827
+ border-radius: 2px;
828
+ text-transform: uppercase;
829
+ }
830
+
831
+ .feedback-type.positive { background: rgba(76, 175, 80, 0.2); color: var(--csgo-success); }
832
+ .feedback-type.negative { background: rgba(244, 67, 54, 0.2); color: var(--csgo-error); }
833
+ .feedback-type.question { background: rgba(33, 150, 243, 0.2); color: #2196F3; }
834
+ .feedback-type.critique { background: rgba(255, 152, 0, 0.2); color: var(--csgo-warning); }
835
+
836
+ .message-container {
837
+ background: var(--csgo-darker);
838
+ border: 1px solid var(--csgo-border);
839
+ border-radius: 4px;
840
+ height: 350px;
841
+ overflow-y: auto;
842
+ padding: 10px;
843
+ }
844
+
845
+ .message-item {
846
+ padding: 12px;
847
+ background: rgba(31, 31, 31, 0.6);
848
+ border-radius: 10px;
849
+ margin-bottom: 12px;
850
+ border-left: 3px solid transparent;
851
+ transition: all 0.3s ease;
852
+ }
853
+
854
+ .message-item:hover {
855
+ background: rgba(31, 31, 31, 0.9);
856
+ transform: translateX(2px);
857
+ }
858
+
859
+ .message-item.sent {
860
+ background: rgba(14, 165, 233, 0.1);
861
+ border-left-color: var(--primary);
862
+ }
863
+
864
+ .message-item.received {
865
+ background: rgba(31, 31, 31, 0.6);
866
+ border-left-color: var(--text-dim);
867
+ }
868
+
869
+ .message-item.unread {
870
+ border-left-color: var(--success);
871
+ background: rgba(16, 185, 129, 0.08);
872
+ }
873
+
874
+ .message-header {
875
+ display: flex;
876
+ justify-content: space-between;
877
+ margin-bottom: 5px;
878
+ font-size: 11px;
879
+ }
880
+
881
+ .message-from {
882
+ color: var(--primary);
883
+ font-weight: 600;
884
+ }
885
+
886
+ .message-time {
887
+ color: var(--csgo-text-dim);
888
+ }
889
+
890
+ .message-text {
891
+ font-size: 13px;
892
+ color: var(--csgo-text);
893
+ }
894
+
895
+ .message-input-container {
896
+ display: flex;
897
+ gap: 10px;
898
+ margin-top: 10px;
899
+ }
900
+
901
+ .message-input-container input,
902
+ .message-input-container select {
903
+ flex: 1;
904
+ background: var(--csgo-darker);
905
+ border: 1px solid var(--csgo-border);
906
+ border-radius: 2px;
907
+ padding: 10px;
908
+ color: var(--csgo-text);
909
+ font-family: 'Rajdhani', sans-serif;
910
+ }
911
+
912
+ .message-input-container select {
913
+ max-width: 150px;
914
+ }
915
+
916
+ .encouragement-banner {
917
+ background: linear-gradient(135deg, rgba(14, 165, 233, 0.12) 0%, rgba(139, 92, 246, 0.08) 100%);
918
+ border: 1px solid rgba(14, 165, 233, 0.3);
919
+ border-radius: 12px;
920
+ padding: 16px;
921
+ margin-bottom: 16px;
922
+ display: flex;
923
+ align-items: center;
924
+ gap: 16px;
925
+ transition: all 0.3s ease;
926
+ }
927
+
928
+ .encouragement-banner:hover {
929
+ border-color: rgba(14, 165, 233, 0.5);
930
+ box-shadow: 0 4px 16px rgba(14, 165, 233, 0.15);
931
+ }
932
+
933
+ .encouragement-icon {
934
+ font-size: 28px;
935
+ filter: drop-shadow(0 0 8px rgba(14, 165, 233, 0.5));
936
+ }
937
+
938
+ .encouragement-text {
939
+ flex: 1;
940
+ }
941
+
942
+ .encouragement-text h4 {
943
+ color: var(--primary);
944
+ margin-bottom: 6px;
945
+ font-size: 14px;
946
+ font-weight: 600;
947
+ }
948
+
949
+ .encouragement-text p {
950
+ color: var(--text-tertiary);
951
+ font-size: 12px;
952
+ line-height: 1.5;
953
+ }
954
+
955
+ .collab-stats {
956
+ display: grid;
957
+ grid-template-columns: repeat(4, 1fr);
958
+ gap: 10px;
959
+ margin-bottom: 15px;
960
+ }
961
+
962
+ .collab-stat {
963
+ background: var(--csgo-gray);
964
+ border: 1px solid var(--csgo-border);
965
+ border-radius: 4px;
966
+ padding: 12px;
967
+ text-align: center;
968
+ }
969
+
970
+ .collab-stat-value {
971
+ font-family: 'Orbitron', monospace;
972
+ font-size: 20px;
973
+ color: var(--csgo-yellow);
974
+ }
975
+
976
+ .collab-stat-label {
977
+ font-size: 10px;
978
+ color: var(--csgo-text-dim);
979
+ text-transform: uppercase;
980
+ margin-top: 5px;
981
+ }
982
+
983
+ .share-code-form {
984
+ background: var(--csgo-gray);
985
+ border: 1px solid var(--csgo-border);
986
+ border-radius: 4px;
987
+ padding: 15px;
988
+ margin-bottom: 15px;
989
+ }
990
+
991
+ .share-code-form textarea {
992
+ width: 100%;
993
+ background: var(--csgo-darker);
994
+ border: 1px solid var(--csgo-border);
995
+ border-radius: 2px;
996
+ padding: 10px;
997
+ color: var(--csgo-text);
998
+ font-family: 'Courier New', monospace;
999
+ font-size: 12px;
1000
+ min-height: 100px;
1001
+ resize: vertical;
1002
+ }
1003
+
1004
+ .modal-overlay {
1005
+ position: fixed;
1006
+ top: 0;
1007
+ left: 0;
1008
+ right: 0;
1009
+ bottom: 0;
1010
+ background: rgba(0, 0, 0, 0.85);
1011
+ backdrop-filter: blur(8px);
1012
+ -webkit-backdrop-filter: blur(8px);
1013
+ display: flex;
1014
+ align-items: center;
1015
+ justify-content: center;
1016
+ z-index: 2000;
1017
+ animation: modalFadeIn 0.3s ease;
1018
+ }
1019
+
1020
+ .modal-content {
1021
+ max-width: 640px;
1022
+ max-height: 85vh;
1023
+ overflow-y: auto;
1024
+ animation: modalSlideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1025
+ }
1026
+
1027
+ @keyframes modalFadeIn {
1028
+ from { opacity: 0; }
1029
+ to { opacity: 1; }
1030
+ }
1031
+
1032
+ @keyframes modalSlideIn {
1033
+ from {
1034
+ opacity: 0;
1035
+ transform: translateY(-30px) scale(0.95);
1036
+ }
1037
+ to {
1038
+ opacity: 1;
1039
+ transform: translateY(0) scale(1);
1040
+ }
1041
+ }
1042
+
1043
+ /* Limit Gauges */
1044
+ .limit-gauges {
1045
+ display: grid;
1046
+ grid-template-columns: repeat(2, 1fr);
1047
+ gap: 12px;
1048
+ margin-bottom: 15px;
1049
+ }
1050
+
1051
+ .limit-gauge {
1052
+ background: var(--csgo-gray);
1053
+ border: 1px solid var(--csgo-border);
1054
+ border-radius: 4px;
1055
+ padding: 12px;
1056
+ position: relative;
1057
+ }
1058
+
1059
+ .limit-gauge-header {
1060
+ display: flex;
1061
+ justify-content: space-between;
1062
+ align-items: center;
1063
+ margin-bottom: 8px;
1064
+ }
1065
+
1066
+ .limit-gauge-title {
1067
+ font-size: 11px;
1068
+ text-transform: uppercase;
1069
+ letter-spacing: 1px;
1070
+ color: var(--csgo-text-dim);
1071
+ }
1072
+
1073
+ .limit-gauge-badge {
1074
+ font-size: 9px;
1075
+ padding: 2px 6px;
1076
+ border-radius: 2px;
1077
+ text-transform: uppercase;
1078
+ font-weight: 600;
1079
+ }
1080
+
1081
+ .limit-gauge-badge.ok { display: none; }
1082
+ .limit-gauge-badge.warning { background: rgba(255, 152, 0, 0.3); color: var(--csgo-warning); border: 1px solid var(--csgo-warning); }
1083
+ .limit-gauge-badge.critical { background: rgba(244, 67, 54, 0.3); color: var(--csgo-error); border: 1px solid var(--csgo-error); animation: pulse 1s infinite; }
1084
+ .limit-gauge-badge.exceeded { background: var(--csgo-error); color: white; border: 1px solid var(--csgo-error); animation: pulse 0.5s infinite; }
1085
+
1086
+ .limit-gauge-bar {
1087
+ height: 8px;
1088
+ background: var(--csgo-darker);
1089
+ border-radius: 4px;
1090
+ overflow: hidden;
1091
+ position: relative;
1092
+ }
1093
+
1094
+ .limit-gauge-fill {
1095
+ height: 100%;
1096
+ border-radius: 4px;
1097
+ transition: width 0.3s ease, background 0.3s ease;
1098
+ }
1099
+
1100
+ .limit-gauge-fill.ok { background: linear-gradient(90deg, var(--csgo-success) 0%, #2E7D32 100%); }
1101
+ .limit-gauge-fill.warning { background: linear-gradient(90deg, var(--csgo-warning) 0%, #F57C00 100%); }
1102
+ .limit-gauge-fill.critical { background: linear-gradient(90deg, var(--csgo-error) 0%, #C62828 100%); }
1103
+ .limit-gauge-fill.exceeded { background: linear-gradient(90deg, #D32F2F 0%, #B71C1C 100%); }
1104
+
1105
+ .limit-gauge-info {
1106
+ display: flex;
1107
+ justify-content: space-between;
1108
+ margin-top: 6px;
1109
+ font-size: 10px;
1110
+ }
1111
+
1112
+ .limit-gauge-value {
1113
+ font-family: 'Orbitron', monospace;
1114
+ color: var(--csgo-yellow);
1115
+ }
1116
+
1117
+ .limit-gauge-percent {
1118
+ color: var(--csgo-text-dim);
1119
+ }
1120
+
1121
+ .limit-gauge[data-level="warning"] {
1122
+ border-color: var(--csgo-warning);
1123
+ }
1124
+
1125
+ .limit-gauge[data-level="critical"],
1126
+ .limit-gauge[data-level="exceeded"] {
1127
+ border-color: var(--csgo-error);
1128
+ box-shadow: 0 0 10px rgba(244, 67, 54, 0.3);
1129
+ }
1130
+
1131
+ .limit-suggestion {
1132
+ font-size: 10px;
1133
+ color: var(--csgo-text-dim);
1134
+ margin-top: 4px;
1135
+ font-style: italic;
1136
+ display: none;
1137
+ }
1138
+
1139
+ .limit-gauge[data-level="warning"] .limit-suggestion,
1140
+ .limit-gauge[data-level="critical"] .limit-suggestion,
1141
+ .limit-gauge[data-level="exceeded"] .limit-suggestion {
1142
+ display: block;
1143
+ }
1144
+
1145
+ .limit-ack-list {
1146
+ margin-top: 10px;
1147
+ padding: 8px;
1148
+ background: var(--csgo-darker);
1149
+ border-radius: 4px;
1150
+ max-height: 100px;
1151
+ overflow-y: auto;
1152
+ }
1153
+
1154
+ .limit-ack-item {
1155
+ font-size: 10px;
1156
+ color: var(--csgo-text-dim);
1157
+ padding: 4px 0;
1158
+ border-bottom: 1px solid var(--csgo-border);
1159
+ }
1160
+
1161
+ .limit-ack-item:last-child {
1162
+ border-bottom: none;
1163
+ }
1164
+
1165
+ .limit-ack-type {
1166
+ color: var(--csgo-yellow);
1167
+ text-transform: uppercase;
1168
+ margin-right: 5px;
1169
+ }
1170
+
1171
+ .limit-warning-alert {
1172
+ background: linear-gradient(135deg, rgba(244, 67, 54, 0.2) 0%, rgba(244, 67, 54, 0.1) 100%);
1173
+ border: 1px solid var(--csgo-error);
1174
+ border-radius: 4px;
1175
+ padding: 12px;
1176
+ margin-bottom: 15px;
1177
+ display: flex;
1178
+ align-items: center;
1179
+ gap: 10px;
1180
+ }
1181
+
1182
+ .limit-warning-alert.hidden {
1183
+ display: none;
1184
+ }
1185
+
1186
+ .limit-warning-icon {
1187
+ font-size: 20px;
1188
+ color: var(--csgo-error);
1189
+ }
1190
+
1191
+ .limit-warning-text {
1192
+ flex: 1;
1193
+ }
1194
+
1195
+ .limit-warning-text h4 {
1196
+ color: var(--csgo-error);
1197
+ font-size: 12px;
1198
+ margin-bottom: 3px;
1199
+ }
1200
+
1201
+ .limit-warning-text p {
1202
+ color: var(--csgo-text-dim);
1203
+ font-size: 11px;
1204
+ }
1205
+
1206
+ .history-panel {
1207
+ position: fixed;
1208
+ top: 40px;
1209
+ left: 40px;
1210
+ right: 40px;
1211
+ bottom: 40px;
1212
+ background: rgba(20, 20, 20, 0.95);
1213
+ backdrop-filter: blur(20px);
1214
+ -webkit-backdrop-filter: blur(20px);
1215
+ border: 1px solid var(--border-secondary);
1216
+ border-radius: 16px;
1217
+ display: flex;
1218
+ flex-direction: column;
1219
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
1220
+ animation: modalSlideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1221
+ }
1222
+ .history-header {
1223
+ display: flex;
1224
+ justify-content: space-between;
1225
+ align-items: center;
1226
+ padding: 20px 24px;
1227
+ background: linear-gradient(135deg, rgba(14, 165, 233, 0.15) 0%, rgba(139, 92, 246, 0.1) 100%);
1228
+ border-bottom: 1px solid var(--border-primary);
1229
+ }
1230
+ .history-title {
1231
+ font-family: 'JetBrains Mono', monospace;
1232
+ font-size: 16px;
1233
+ font-weight: 700;
1234
+ background: linear-gradient(135deg, var(--primary) 0%, var(--accent) 100%);
1235
+ -webkit-background-clip: text;
1236
+ -webkit-text-fill-color: transparent;
1237
+ background-clip: text;
1238
+ letter-spacing: 1px;
1239
+ }
1240
+ .history-close {
1241
+ background: rgba(244, 63, 94, 0.15);
1242
+ border: 1px solid rgba(244, 63, 94, 0.3);
1243
+ color: var(--error);
1244
+ font-size: 20px;
1245
+ width: 36px;
1246
+ height: 36px;
1247
+ border-radius: 8px;
1248
+ cursor: pointer;
1249
+ font-weight: 700;
1250
+ transition: all 0.3s ease;
1251
+ display: flex;
1252
+ align-items: center;
1253
+ justify-content: center;
1254
+ }
1255
+ .history-close:hover {
1256
+ background: rgba(244, 63, 94, 0.25);
1257
+ transform: scale(1.05);
1258
+ box-shadow: 0 4px 12px rgba(244, 63, 94, 0.3);
1259
+ }
1260
+ .history-body {
1261
+ flex: 1;
1262
+ display: grid;
1263
+ grid-template-columns: 280px 1fr;
1264
+ overflow: hidden;
1265
+ }
1266
+ .history-teamMembers-panel, .history-sessions-panel {
1267
+ display: flex;
1268
+ flex-direction: column;
1269
+ border-right: 1px solid var(--csgo-border);
1270
+ overflow: hidden;
1271
+ }
1272
+ .history-sessions-panel { border-right: none; }
1273
+ .history-panel-title {
1274
+ padding: 12px 15px;
1275
+ font-family: 'Orbitron', monospace;
1276
+ font-size: 11px;
1277
+ font-weight: 600;
1278
+ color: var(--csgo-yellow);
1279
+ background: var(--csgo-darker);
1280
+ border-bottom: 1px solid var(--csgo-border);
1281
+ letter-spacing: 2px;
1282
+ }
1283
+ .history-list {
1284
+ flex: 1;
1285
+ overflow-y: auto;
1286
+ padding: 10px;
1287
+ }
1288
+ .history-list::-webkit-scrollbar { width: 6px; }
1289
+ .history-list::-webkit-scrollbar-track { background: var(--csgo-darker); }
1290
+ .history-list::-webkit-scrollbar-thumb { background: var(--csgo-yellow); border-radius: 3px; }
1291
+ .history-loading, .history-empty {
1292
+ text-align: center;
1293
+ padding: 30px;
1294
+ color: var(--csgo-text-dim);
1295
+ font-size: 13px;
1296
+ }
1297
+ .history-team-member-item {
1298
+ padding: 12px;
1299
+ background: var(--csgo-gray);
1300
+ border: 1px solid var(--csgo-border);
1301
+ border-radius: 4px;
1302
+ margin-bottom: 8px;
1303
+ cursor: pointer;
1304
+ transition: all 0.2s;
1305
+ }
1306
+ .history-team-member-item:hover { border-color: var(--csgo-yellow); }
1307
+ .history-team-member-item.selected {
1308
+ border-color: var(--csgo-yellow);
1309
+ background: var(--csgo-gray-light);
1310
+ box-shadow: 0 0 10px rgba(255, 215, 0, 0.2);
1311
+ }
1312
+ .history-team-member-name {
1313
+ display: flex;
1314
+ align-items: center;
1315
+ gap: 8px;
1316
+ font-size: 14px;
1317
+ font-weight: 600;
1318
+ color: var(--csgo-text);
1319
+ margin-bottom: 6px;
1320
+ }
1321
+ .history-team-member-expand {
1322
+ color: var(--csgo-yellow);
1323
+ font-size: 12px;
1324
+ transition: transform 0.2s;
1325
+ }
1326
+ .history-team-member-item.selected .history-team-member-expand { transform: rotate(90deg); }
1327
+ .history-team-member-meta {
1328
+ display: flex;
1329
+ justify-content: space-between;
1330
+ font-size: 11px;
1331
+ color: var(--csgo-text-dim);
1332
+ }
1333
+ .history-session-count {
1334
+ color: var(--csgo-yellow);
1335
+ font-family: 'Orbitron', monospace;
1336
+ }
1337
+ .session-card {
1338
+ background: rgba(31, 31, 31, 0.6);
1339
+ border: 1px solid var(--border-primary);
1340
+ border-radius: 10px;
1341
+ margin-bottom: 12px;
1342
+ overflow: hidden;
1343
+ transition: all 0.3s ease;
1344
+ }
1345
+ .session-card:hover {
1346
+ border-color: var(--border-secondary);
1347
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
1348
+ }
1349
+ .session-card-header {
1350
+ padding: 14px 16px;
1351
+ display: flex;
1352
+ justify-content: space-between;
1353
+ align-items: flex-start;
1354
+ cursor: pointer;
1355
+ transition: all 0.2s ease;
1356
+ }
1357
+ .session-card-header:hover {
1358
+ background: rgba(14, 165, 233, 0.05);
1359
+ }
1360
+ .session-date {
1361
+ font-size: 13px;
1362
+ color: var(--csgo-text);
1363
+ margin-bottom: 5px;
1364
+ }
1365
+ .session-time-range {
1366
+ font-size: 11px;
1367
+ color: var(--csgo-text-dim);
1368
+ font-family: 'Orbitron', monospace;
1369
+ }
1370
+ .session-stats {
1371
+ display: flex;
1372
+ gap: 15px;
1373
+ margin-top: 8px;
1374
+ font-size: 11px;
1375
+ }
1376
+ .session-stat {
1377
+ display: flex;
1378
+ align-items: center;
1379
+ gap: 4px;
1380
+ color: var(--csgo-text-dim);
1381
+ }
1382
+ .session-stat-value {
1383
+ color: var(--csgo-yellow);
1384
+ font-family: 'Orbitron', monospace;
1385
+ }
1386
+ .session-status {
1387
+ padding: 3px 8px;
1388
+ border-radius: 2px;
1389
+ font-size: 10px;
1390
+ font-weight: 600;
1391
+ text-transform: uppercase;
1392
+ letter-spacing: 1px;
1393
+ }
1394
+ .session-status.completed { background: rgba(76, 175, 80, 0.2); color: var(--csgo-success); }
1395
+ .session-status.failed { background: rgba(244, 67, 54, 0.2); color: var(--csgo-error); }
1396
+ .session-status.interrupted { background: rgba(255, 152, 0, 0.2); color: var(--csgo-warning); }
1397
+ .session-status.running { background: rgba(33, 150, 243, 0.2); color: #2196F3; }
1398
+ .session-detail-panel {
1399
+ position: fixed;
1400
+ top: 60px;
1401
+ left: 60px;
1402
+ right: 60px;
1403
+ bottom: 60px;
1404
+ background: rgba(20, 20, 20, 0.95);
1405
+ backdrop-filter: blur(20px);
1406
+ -webkit-backdrop-filter: blur(20px);
1407
+ border: 1px solid var(--border-secondary);
1408
+ border-radius: 16px;
1409
+ display: flex;
1410
+ flex-direction: column;
1411
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);
1412
+ animation: modalSlideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1413
+ }
1414
+ .session-detail-body {
1415
+ flex: 1;
1416
+ padding: 20px;
1417
+ overflow-y: auto;
1418
+ }
1419
+ .session-detail-section { margin-bottom: 25px; }
1420
+ .session-detail-title {
1421
+ font-family: 'Orbitron', monospace;
1422
+ font-size: 12px;
1423
+ font-weight: 600;
1424
+ color: var(--csgo-yellow);
1425
+ letter-spacing: 2px;
1426
+ margin-bottom: 12px;
1427
+ padding-bottom: 8px;
1428
+ border-bottom: 1px solid var(--csgo-border);
1429
+ }
1430
+ .session-info-grid {
1431
+ display: grid;
1432
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
1433
+ gap: 15px;
1434
+ }
1435
+ .session-info-item {
1436
+ background: var(--csgo-gray);
1437
+ padding: 12px;
1438
+ border-radius: 4px;
1439
+ border: 1px solid var(--csgo-border);
1440
+ }
1441
+ .session-info-label {
1442
+ font-size: 10px;
1443
+ color: var(--csgo-text-dim);
1444
+ text-transform: uppercase;
1445
+ letter-spacing: 1px;
1446
+ margin-bottom: 5px;
1447
+ }
1448
+ .session-info-value {
1449
+ font-family: 'Orbitron', monospace;
1450
+ font-size: 14px;
1451
+ color: var(--csgo-yellow);
1452
+ }
1453
+ .task-list { list-style: none; }
1454
+ .task-item {
1455
+ display: flex;
1456
+ align-items: center;
1457
+ gap: 10px;
1458
+ padding: 10px 12px;
1459
+ background: var(--csgo-gray);
1460
+ border: 1px solid var(--csgo-border);
1461
+ border-radius: 4px;
1462
+ margin-bottom: 8px;
1463
+ }
1464
+ .task-check {
1465
+ width: 16px;
1466
+ height: 16px;
1467
+ border-radius: 50%;
1468
+ display: flex;
1469
+ align-items: center;
1470
+ justify-content: center;
1471
+ font-size: 10px;
1472
+ }
1473
+ .task-check.completed { background: var(--csgo-success); color: white; }
1474
+ .task-check.failed { background: var(--csgo-error); color: white; }
1475
+ .task-check.pending { background: var(--csgo-text-dim); color: white; }
1476
+ .task-name { flex: 1; font-size: 13px; color: var(--csgo-text); }
1477
+ .task-status { font-size: 10px; color: var(--csgo-text-dim); }
1478
+ .session-log-container {
1479
+ background: var(--csgo-darker);
1480
+ border: 1px solid var(--csgo-border);
1481
+ border-radius: 4px;
1482
+ font-family: 'Courier New', monospace;
1483
+ font-size: 11px;
1484
+ max-height: 300px;
1485
+ overflow-y: auto;
1486
+ }
1487
+ .session-log-entry {
1488
+ padding: 6px 12px;
1489
+ border-bottom: 1px solid rgba(255, 255, 255, 0.05);
1490
+ }
1491
+ .session-log-entry.info { color: var(--csgo-text); }
1492
+ .session-log-entry.warn { color: var(--csgo-warning); }
1493
+ .session-log-entry.error { color: var(--csgo-error); }
1494
+ .session-log-entry.debug { color: var(--csgo-text-dim); }
1495
+ .session-log-timestamp { color: var(--csgo-text-dim); margin-right: 10px; }
1496
+ .log-pagination {
1497
+ display: flex;
1498
+ justify-content: space-between;
1499
+ align-items: center;
1500
+ padding: 10px;
1501
+ background: var(--csgo-gray);
1502
+ border-top: 1px solid var(--csgo-border);
1503
+ }
1504
+ .log-pagination-info { font-size: 11px; color: var(--csgo-text-dim); }
1505
+ .log-pagination-btns { display: flex; gap: 8px; }
1506
+ .id-list { display: flex; flex-wrap: wrap; gap: 6px; }
1507
+ .id-chip {
1508
+ padding: 4px 8px;
1509
+ background: rgba(255, 215, 0, 0.1);
1510
+ border: 1px solid var(--csgo-yellow);
1511
+ border-radius: 2px;
1512
+ font-size: 10px;
1513
+ color: var(--csgo-yellow);
1514
+ font-family: 'Courier New', monospace;
1515
+ }
1516
+
1517
+ /* Live Status Panel */
1518
+ .live-status-panel {
1519
+ background: var(--csgo-gray);
1520
+ border: 1px solid var(--csgo-border);
1521
+ border-radius: 4px;
1522
+ padding: 15px;
1523
+ }
1524
+ .live-stat-box {
1525
+ background: var(--csgo-darker);
1526
+ border: 1px solid var(--csgo-border);
1527
+ border-radius: 4px;
1528
+ padding: 10px;
1529
+ }
1530
+ .live-stat-label {
1531
+ font-size: 9px;
1532
+ text-transform: uppercase;
1533
+ letter-spacing: 1px;
1534
+ color: var(--csgo-text-dim);
1535
+ margin-bottom: 4px;
1536
+ }
1537
+ .live-stat-value {
1538
+ font-family: 'Orbitron', monospace;
1539
+ font-size: 14px;
1540
+ color: var(--csgo-yellow);
1541
+ white-space: nowrap;
1542
+ overflow: hidden;
1543
+ text-overflow: ellipsis;
1544
+ }
1545
+ .heartbeat-dot {
1546
+ width: 12px;
1547
+ height: 12px;
1548
+ border-radius: 50%;
1549
+ background: var(--csgo-error);
1550
+ transition: background 0.3s;
1551
+ }
1552
+ .heartbeat-dot.alive {
1553
+ background: var(--csgo-success);
1554
+ animation: heartbeat 1s infinite;
1555
+ }
1556
+ .heartbeat-dot.dead {
1557
+ background: var(--csgo-error);
1558
+ }
1559
+ @keyframes heartbeat {
1560
+ 0%, 100% { transform: scale(1); opacity: 1; }
1561
+ 50% { transform: scale(1.2); opacity: 0.7; }
1562
+ }
1563
+
1564
+ /* Communicator Chat */
1565
+ .communicator-chat {
1566
+ background: var(--csgo-darker);
1567
+ border: 1px solid var(--csgo-border);
1568
+ border-radius: 4px;
1569
+ height: 280px;
1570
+ overflow-y: auto;
1571
+ padding: 10px;
1572
+ font-family: 'Courier New', monospace;
1573
+ font-size: 12px;
1574
+ }
1575
+ .comm-message {
1576
+ padding: 8px 10px;
1577
+ margin-bottom: 8px;
1578
+ border-radius: 4px;
1579
+ animation: fadeIn 0.2s ease;
1580
+ }
1581
+ @keyframes fadeIn {
1582
+ from { opacity: 0; transform: translateY(5px); }
1583
+ to { opacity: 1; transform: translateY(0); }
1584
+ }
1585
+ .comm-message.sent {
1586
+ background: rgba(255, 215, 0, 0.15);
1587
+ border-left: 3px solid var(--csgo-yellow);
1588
+ }
1589
+ .comm-message.received {
1590
+ background: var(--csgo-gray);
1591
+ border-left: 3px solid var(--csgo-success);
1592
+ }
1593
+ .comm-message.error {
1594
+ background: rgba(244, 67, 54, 0.15);
1595
+ border-left: 3px solid var(--csgo-error);
1596
+ }
1597
+ .comm-message.system {
1598
+ background: rgba(33, 150, 243, 0.15);
1599
+ border-left: 3px solid #2196F3;
1600
+ font-style: italic;
1601
+ }
1602
+ .comm-message-header {
1603
+ display: flex;
1604
+ justify-content: space-between;
1605
+ margin-bottom: 4px;
1606
+ font-size: 10px;
1607
+ }
1608
+ .comm-message-from {
1609
+ color: var(--csgo-yellow);
1610
+ font-weight: 600;
1611
+ }
1612
+ .comm-message-time {
1613
+ color: var(--csgo-text-dim);
1614
+ }
1615
+ .comm-message-content {
1616
+ color: var(--csgo-text);
1617
+ word-break: break-word;
1618
+ }
1619
+ .communicator-input-container {
1620
+ display: flex;
1621
+ gap: 10px;
1622
+ margin-top: 10px;
1623
+ }
1624
+ .communicator-input-container input:focus,
1625
+ .communicator-input-container select:focus {
1626
+ outline: none;
1627
+ border-color: var(--csgo-yellow);
1628
+ }
1629
+
1630
+ /* Deploy Modal Animations */
1631
+ .modal-overlay {
1632
+ animation: modalFadeIn 0.2s ease;
1633
+ }
1634
+ @keyframes modalFadeIn {
1635
+ from { opacity: 0; }
1636
+ to { opacity: 1; }
1637
+ }
1638
+ .modal-overlay .panel {
1639
+ animation: modalSlideIn 0.3s ease;
1640
+ }
1641
+ @keyframes modalSlideIn {
1642
+ from { opacity: 0; transform: translateY(-20px); }
1643
+ to { opacity: 1; transform: translateY(0); }
1644
+ }
1645
+ </style>
1646
+ <script src="/shared-logger.js"></script>
1647
+ </head>
1648
+ <body>
1649
+ <header class="header">
1650
+ <div class="logo">SPECMEM // TEAM MEMBER OPS
1651
+ <a href="/" style="color: var(--csgo-text-dim); text-decoration: none; font-size: 12px; font-family: Rajdhani; margin-left: 15px;">Dashboard</a>
1652
+ <a href="/team-member-history.html" style="color: var(--csgo-text-dim); text-decoration: none; font-size: 12px; font-family: Rajdhani; margin-left: 10px;">History</a>
1653
+ <a href="/memory-recall.html" style="color: var(--csgo-text-dim); text-decoration: none; font-size: 12px; font-family: Rajdhani; margin-left: 10px;">Memory</a>
1654
+ </div>
1655
+ <div class="header-stats">
1656
+ <div class="stat-item">
1657
+ <div class="stat-value" id="stat-total">0</div>
1658
+ <div class="stat-label">Total TeamMembers</div>
1659
+ </div>
1660
+ <div class="stat-item">
1661
+ <div class="stat-value" id="stat-running">0</div>
1662
+ <div class="stat-label">Running</div>
1663
+ </div>
1664
+ <div class="stat-item">
1665
+ <div class="stat-value" id="stat-tokens">0</div>
1666
+ <div class="stat-label">Tokens Used</div>
1667
+ </div>
1668
+ </div>
1669
+ <div id="language-selector-container" style="margin: 0 12px;"></div>
1670
+ <div class="ws-status">
1671
+ <div class="ws-dot" id="ws-indicator"></div>
1672
+ <span id="ws-status-text">Disconnected</span>
1673
+ <button class="btn btn-small btn-secondary" onclick="showHistoryModal()">History</button>
1674
+ <a href="/prompt" class="btn" style="padding:10px 20px;font-size:13px;margin-left:10px;">Go to Console</a>
1675
+ <a href="/" class="btn btn-small btn-secondary">Dashboard</a>
1676
+ </div>
1677
+ </header>
1678
+
1679
+ <div class="main-container">
1680
+ <div class="panel">
1681
+ <div class="panel-header">
1682
+ <span>TeamMember List</span>
1683
+ <button class="btn btn-small" onclick="showDeployModal()">+ Deploy</button>
1684
+ </div>
1685
+ <div class="panel-body">
1686
+ <div class="filter-bar">
1687
+ <button class="filter-btn active" data-filter="all">All</button>
1688
+ <button class="filter-btn" data-filter="running">Running</button>
1689
+ <button class="filter-btn" data-filter="completed">Done</button>
1690
+ <button class="filter-btn" data-filter="failed">Failed</button>
1691
+ </div>
1692
+ <div id="team-member-list">
1693
+ <div class="no-team-members">
1694
+ <div class="no-team-members-icon">&#128640;</div>
1695
+ <p>No team members deployed yet</p>
1696
+ </div>
1697
+ </div>
1698
+ </div>
1699
+ </div>
1700
+
1701
+ <div class="panel" style="grid-column: span 2;">
1702
+ <div class="panel-header">
1703
+ <span>TeamMember Collaboration</span>
1704
+ <div style="display: flex; gap: 10px;">
1705
+ <span id="collab-pending-badge" class="tab-badge hidden">0</span>
1706
+ </div>
1707
+ </div>
1708
+ <div class="panel-body">
1709
+ <div class="tab-container">
1710
+ <button class="tab-btn active" data-tab="details">Details</button>
1711
+ <button class="tab-btn" data-tab="communicator">Communicator</button>
1712
+ <button class="tab-btn" data-tab="shared-code">Shared Code <span id="shared-code-count" class="tab-badge hidden">0</span></button>
1713
+ <button class="tab-btn" data-tab="messages">Messages <span id="unread-count" class="tab-badge hidden">0</span></button>
1714
+ <button class="tab-btn" data-tab="logs">Logs</button>
1715
+ </div>
1716
+
1717
+ <div id="tab-details" class="tab-content active">
1718
+ <div id="team-member-details">
1719
+ <div class="no-team-members">
1720
+ <p>Select a team member to view details</p>
1721
+ </div>
1722
+ </div>
1723
+ </div>
1724
+
1725
+ <div id="tab-communicator" class="tab-content">
1726
+ <div id="communicator-no-team-member" class="no-team-members">
1727
+ <p>Select a team member to use the communicator</p>
1728
+ </div>
1729
+ <div id="communicator-panel" class="hidden">
1730
+ <div class="live-status-panel" style="margin-bottom:15px;">
1731
+ <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;">
1732
+ <div style="display:flex;align-items:center;gap:10px;">
1733
+ <div id="heartbeat-indicator" class="heartbeat-dot dead"></div>
1734
+ <span style="font-family:'Orbitron',monospace;font-size:12px;color:var(--csgo-yellow);">LIVE STATUS</span>
1735
+ </div>
1736
+ <span id="live-team-member-name" style="font-size:13px;color:var(--csgo-text);">-</span>
1737
+ </div>
1738
+ <div style="display:grid;grid-template-columns:repeat(4,1fr);gap:10px;">
1739
+ <div class="live-stat-box">
1740
+ <div class="live-stat-label">Current Task</div>
1741
+ <div class="live-stat-value" id="live-task">Idle</div>
1742
+ <div class="progress-bar" style="margin-top:6px;"><div class="progress-fill" id="live-task-progress" style="width:0%"></div></div>
1743
+ </div>
1744
+ <div class="live-stat-box">
1745
+ <div class="live-stat-label">Tokens</div>
1746
+ <div class="live-stat-value" id="live-tokens">0</div>
1747
+ <div class="progress-bar" style="margin-top:6px;"><div class="progress-fill" id="live-tokens-progress" style="width:0%"></div></div>
1748
+ </div>
1749
+ <div class="live-stat-box">
1750
+ <div class="live-stat-label">Memory</div>
1751
+ <div class="live-stat-value" id="live-memory">0 MB</div>
1752
+ <div class="progress-bar" style="margin-top:6px;"><div class="progress-fill" id="live-memory-progress" style="width:0%"></div></div>
1753
+ </div>
1754
+ <div class="live-stat-box">
1755
+ <div class="live-stat-label">Files</div>
1756
+ <div class="live-stat-value" id="live-files">0</div>
1757
+ <div class="progress-bar" style="margin-top:6px;"><div class="progress-fill" id="live-files-progress" style="width:0%"></div></div>
1758
+ </div>
1759
+ </div>
1760
+ </div>
1761
+ <div class="detail-title" style="margin-bottom:10px;">TEAM MEMBER COMMUNICATOR</div>
1762
+ <div id="communicator-chat" class="communicator-chat"></div>
1763
+ <div class="communicator-input-container">
1764
+ <select id="comm-command-type" style="max-width:140px;background:var(--csgo-darker);border:1px solid var(--csgo-border);padding:10px;color:var(--csgo-text);">
1765
+ <option value="message">Message</option>
1766
+ <option value="task">Assign Task</option>
1767
+ <option value="query">Query Status</option>
1768
+ <option value="stop">Stop TeamMember</option>
1769
+ <option value="custom">Custom JSON</option>
1770
+ </select>
1771
+ <input type="text" id="comm-input" placeholder="Type command or message..." style="flex:1;background:var(--csgo-darker);border:1px solid var(--csgo-border);padding:10px;color:var(--csgo-text);">
1772
+ <button class="btn" onclick="sendTeamMemberCommand()">SEND</button>
1773
+ </div>
1774
+ </div>
1775
+ </div>
1776
+
1777
+ <div id="tab-shared-code" class="tab-content">
1778
+ <div class="collab-stats" id="collab-stats">
1779
+ <div class="collab-stat">
1780
+ <div class="collab-stat-value" id="stat-shared">0</div>
1781
+ <div class="collab-stat-label">Shared Code</div>
1782
+ </div>
1783
+ <div class="collab-stat">
1784
+ <div class="collab-stat-value" id="stat-feedback">0</div>
1785
+ <div class="collab-stat-label">Feedback</div>
1786
+ </div>
1787
+ <div class="collab-stat">
1788
+ <div class="collab-stat-value" id="stat-messages">0</div>
1789
+ <div class="collab-stat-label">Messages</div>
1790
+ </div>
1791
+ <div class="collab-stat">
1792
+ <div class="collab-stat-value" id="stat-positive">0%</div>
1793
+ <div class="collab-stat-label">Positive Rate</div>
1794
+ </div>
1795
+ </div>
1796
+
1797
+ <div id="encouragement-banner" class="encouragement-banner hidden">
1798
+ <div class="encouragement-icon">&#128161;</div>
1799
+ <div class="encouragement-text">
1800
+ <h4>Share Your Work!</h4>
1801
+ <p id="encouragement-message">Your team member just completed a task. Consider sharing the code for review!</p>
1802
+ </div>
1803
+ <button class="btn btn-small" onclick="showShareCodeModal()">Share Now</button>
1804
+ </div>
1805
+
1806
+ <div id="shared-code-list">
1807
+ <div class="no-team-members">
1808
+ <p>No shared code yet. Be the first to share!</p>
1809
+ </div>
1810
+ </div>
1811
+ </div>
1812
+
1813
+ <div id="tab-messages" class="tab-content">
1814
+ <div class="message-container" id="message-container">
1815
+ <div class="no-team-members">
1816
+ <p>No messages yet</p>
1817
+ </div>
1818
+ </div>
1819
+ <div class="message-input-container">
1820
+ <select id="message-to-team-member">
1821
+ <option value="">All TeamMembers (Broadcast)</option>
1822
+ </select>
1823
+ <select id="message-priority" style="max-width:100px;">
1824
+ <option value="low">Low</option>
1825
+ <option value="medium" selected>Medium</option>
1826
+ <option value="high">High</option>
1827
+ <option value="critical">Critical</option>
1828
+ </select>
1829
+ <input type="text" id="message-input" placeholder="Type a message to send to team members...">
1830
+ <button class="btn" onclick="sendMessage()">Send</button>
1831
+ </div>
1832
+ </div>
1833
+
1834
+ <div id="tab-logs" class="tab-content">
1835
+ <div class="log-filters">
1836
+ <button class="filter-btn active" data-log="all">All</button>
1837
+ <button class="filter-btn" data-log="info">Info</button>
1838
+ <button class="filter-btn" data-log="warn">Warn</button>
1839
+ <button class="filter-btn" data-log="error">Error</button>
1840
+ </div>
1841
+ <div class="log-container" id="log-container">
1842
+ <div class="log-entry info">Select a team member to view logs</div>
1843
+ </div>
1844
+ </div>
1845
+ </div>
1846
+ </div>
1847
+ </div>
1848
+
1849
+ <!-- TeamMember deployment modal removed - use Console tab instead -->
1850
+
1851
+ <div id="share-code-modal" class="modal-overlay hidden">
1852
+ <div class="panel modal-content" style="width: 500px;">
1853
+ <div class="panel-header">
1854
+ <span>Share Code</span>
1855
+ <button onclick="hideShareCodeModal()" style="background:none;border:none;color:#000;font-size:18px;cursor:pointer;">&times;</button>
1856
+ </div>
1857
+ <div class="panel-body">
1858
+ <form class="deploy-form" onsubmit="shareCode(event)">
1859
+ <div class="form-group">
1860
+ <label>Title</label>
1861
+ <input type="text" id="share-title" placeholder="Bug fix for auth module" required>
1862
+ </div>
1863
+ <div class="form-group">
1864
+ <label>Description</label>
1865
+ <input type="text" id="share-description" placeholder="Fixed the session timeout issue">
1866
+ </div>
1867
+ <div class="form-group">
1868
+ <label>File Path (optional)</label>
1869
+ <input type="text" id="share-filepath" placeholder="src/auth/session.ts">
1870
+ </div>
1871
+ <div class="form-group">
1872
+ <label>Language</label>
1873
+ <select id="share-language">
1874
+ <option value="typescript">TypeScript</option>
1875
+ <option value="javascript">JavaScript</option>
1876
+ <option value="python">Python</option>
1877
+ <option value="rust">Rust</option>
1878
+ <option value="go">Go</option>
1879
+ <option value="sql">SQL</option>
1880
+ <option value="bash">Bash</option>
1881
+ <option value="text">Text</option>
1882
+ </select>
1883
+ </div>
1884
+ <div class="form-group">
1885
+ <label>Tags (comma separated)</label>
1886
+ <input type="text" id="share-tags" placeholder="bugfix, auth, session">
1887
+ </div>
1888
+ <div class="form-group">
1889
+ <label>Code</label>
1890
+ <textarea id="share-code" placeholder="Paste your code here..." required></textarea>
1891
+ </div>
1892
+ <button type="submit" class="btn" style="width:100%;">Share Code</button>
1893
+ </form>
1894
+ </div>
1895
+ </div>
1896
+ </div>
1897
+
1898
+ <div id="feedback-modal" class="modal-overlay hidden">
1899
+ <div class="panel modal-content" style="width: 400px;">
1900
+ <div class="panel-header">
1901
+ <span>Give Feedback</span>
1902
+ <button onclick="hideFeedbackModal()" style="background:none;border:none;color:#000;font-size:18px;cursor:pointer;">&times;</button>
1903
+ </div>
1904
+ <div class="panel-body">
1905
+ <form class="deploy-form" onsubmit="submitFeedback(event)">
1906
+ <input type="hidden" id="feedback-code-id">
1907
+ <div class="form-group">
1908
+ <label>Feedback Type</label>
1909
+ <div style="display: flex; gap: 10px; flex-wrap: wrap;">
1910
+ <label style="display: flex; align-items: center; gap: 5px; cursor: pointer;">
1911
+ <input type="radio" name="feedback-type" value="positive" checked> Positive
1912
+ </label>
1913
+ <label style="display: flex; align-items: center; gap: 5px; cursor: pointer;">
1914
+ <input type="radio" name="feedback-type" value="critique"> Critique
1915
+ </label>
1916
+ <label style="display: flex; align-items: center; gap: 5px; cursor: pointer;">
1917
+ <input type="radio" name="feedback-type" value="question"> Question
1918
+ </label>
1919
+ <label style="display: flex; align-items: center; gap: 5px; cursor: pointer;">
1920
+ <input type="radio" name="feedback-type" value="negative"> Negative
1921
+ </label>
1922
+ </div>
1923
+ </div>
1924
+ <div class="form-group">
1925
+ <label>Message</label>
1926
+ <textarea id="feedback-message" placeholder="Your feedback..." required style="min-height: 80px;"></textarea>
1927
+ </div>
1928
+ <button type="submit" class="btn" style="width:100%;">Submit Feedback</button>
1929
+ </form>
1930
+ </div>
1931
+ </div>
1932
+ </div>
1933
+
1934
+ <div id="history-modal" class="modal-overlay hidden">
1935
+ <div class="history-panel">
1936
+ <div class="history-header">
1937
+ <span class="history-title">TEAM MEMBER HISTORY</span>
1938
+ <button onclick="hideHistoryModal()" class="history-close">&times;</button>
1939
+ </div>
1940
+ <div class="history-body">
1941
+ <div class="history-teamMembers-panel">
1942
+ <div class="history-panel-title">AGENTS</div>
1943
+ <div id="history-team-member-list" class="history-list">
1944
+ <div class="history-loading">Loading team members...</div>
1945
+ </div>
1946
+ </div>
1947
+ <div class="history-sessions-panel">
1948
+ <div class="history-panel-title">SESSIONS</div>
1949
+ <div id="history-sessions-list" class="history-list">
1950
+ <div class="history-empty">Select a team member to view sessions</div>
1951
+ </div>
1952
+ </div>
1953
+ </div>
1954
+ </div>
1955
+ </div>
1956
+
1957
+ <div id="session-detail-modal" class="modal-overlay hidden">
1958
+ <div class="session-detail-panel">
1959
+ <div class="history-header">
1960
+ <span class="history-title">SESSION DETAILS</span>
1961
+ <button onclick="hideSessionDetailModal()" class="history-close">&times;</button>
1962
+ </div>
1963
+ <div class="session-detail-body" id="session-detail-content">
1964
+ </div>
1965
+ </div>
1966
+ </div>
1967
+
1968
+ <script>
1969
+ // ============================================================================
1970
+ // SPECMEM Team Member Dashboard - Complete Implementation
1971
+ // Uses SPECMEM HTTP API endpoints for real team member data
1972
+ // ============================================================================
1973
+
1974
+ let ws = null;
1975
+ let teamMembers = new Map();
1976
+ let selectedTeamMemberId = null;
1977
+ let currentFilter = 'all';
1978
+ let currentLogFilter = 'all';
1979
+ let teamMemberLogs = new Map();
1980
+ let historyTeamMembers = [];
1981
+ let selectedHistoryTeamMemberId = null;
1982
+ let historySessions = [];
1983
+ let currentSessionLogs = [];
1984
+ let currentLogOffset = 0;
1985
+ let currentLogLimit = 100;
1986
+ let totalLogCount = 0;
1987
+ let isAuthenticated = false;
1988
+ let allMessages = [];
1989
+ let autoRefreshInterval = null;
1990
+
1991
+ // ============================================================================
1992
+ // AUTHENTICATION - Must login first!
1993
+ // ============================================================================
1994
+ async function authenticate() {
1995
+ try {
1996
+ const res = await fetch('/api/login', {
1997
+ method: 'POST',
1998
+ headers: { 'Content-Type': 'application/json' },
1999
+ body: JSON.stringify({ password: 'specmem_westayunprofessional' }),
2000
+ credentials: 'include'
2001
+ });
2002
+ const data = await res.json();
2003
+ if (data.success || res.ok) {
2004
+ isAuthenticated = true;
2005
+ console.log('SPECMEM: Authenticated successfully');
2006
+ return true;
2007
+ }
2008
+ console.error('SPECMEM: Authentication failed', data);
2009
+ serverLog('error', 'Authentication failed', { data });
2010
+ return false;
2011
+ } catch (err) {
2012
+ console.error('SPECMEM: Authentication error', err);
2013
+ serverLog('error', 'Authentication error', { error: err.message });
2014
+ return false;
2015
+ }
2016
+ }
2017
+
2018
+ // ============================================================================
2019
+ // WEBSOCKET CONNECTION - Real-time updates
2020
+ // ============================================================================
2021
+ function connectWebSocket() {
2022
+ try {
2023
+ const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';
2024
+ // Try the team members-specific WebSocket first, fall back to general
2025
+ const wsUrl = `${protocol}//${location.host}/ws/team-members/live`;
2026
+ console.log('SPECMEM: Connecting to WebSocket:', wsUrl);
2027
+ ws = new WebSocket(wsUrl);
2028
+
2029
+ ws.onopen = () => {
2030
+ document.getElementById('ws-indicator').classList.add('connected');
2031
+ document.getElementById('ws-status-text').textContent = 'Connected (Live)';
2032
+ console.log('SPECMEM: WebSocket connected');
2033
+ // Subscribe to all team member updates
2034
+ if (ws.readyState === WebSocket.OPEN) {
2035
+ ws.send(JSON.stringify({ type: 'subscribe', channel: 'team-members' }));
2036
+ }
2037
+ };
2038
+
2039
+ ws.onclose = () => {
2040
+ document.getElementById('ws-indicator').classList.remove('connected');
2041
+ document.getElementById('ws-status-text').textContent = 'Disconnected';
2042
+ console.log('SPECMEM: WebSocket disconnected, reconnecting in 3s...');
2043
+ setTimeout(connectWebSocket, 3000);
2044
+ };
2045
+
2046
+ ws.onerror = (err) => {
2047
+ console.log('SPECMEM: WebSocket error, will retry');
2048
+ // Try fallback to general /ws endpoint
2049
+ setTimeout(() => {
2050
+ if (ws.readyState !== WebSocket.OPEN) {
2051
+ connectFallbackWebSocket();
2052
+ }
2053
+ }, 1000);
2054
+ };
2055
+
2056
+ ws.onmessage = (event) => {
2057
+ try {
2058
+ const data = JSON.parse(event.data);
2059
+ handleWSMessage(data);
2060
+ } catch (e) {
2061
+ console.log('SPECMEM: Non-JSON WebSocket message:', event.data);
2062
+ }
2063
+ };
2064
+ } catch (err) {
2065
+ console.error('SPECMEM: WebSocket connection failed', err);
2066
+ serverLog('error', 'WebSocket connection failed', { error: err.message });
2067
+ setTimeout(connectWebSocket, 5000);
2068
+ }
2069
+ }
2070
+
2071
+ function connectFallbackWebSocket() {
2072
+ try {
2073
+ const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';
2074
+ ws = new WebSocket(`${protocol}//${location.host}/ws`);
2075
+ ws.onopen = () => {
2076
+ document.getElementById('ws-indicator').classList.add('connected');
2077
+ document.getElementById('ws-status-text').textContent = 'Connected';
2078
+ };
2079
+ ws.onclose = () => {
2080
+ document.getElementById('ws-indicator').classList.remove('connected');
2081
+ document.getElementById('ws-status-text').textContent = 'Disconnected';
2082
+ setTimeout(connectWebSocket, 3000);
2083
+ };
2084
+ ws.onmessage = (event) => {
2085
+ try {
2086
+ const data = JSON.parse(event.data);
2087
+ handleWSMessage(data);
2088
+ } catch (e) {}
2089
+ };
2090
+ } catch (err) {
2091
+ setTimeout(connectWebSocket, 5000);
2092
+ }
2093
+ }
2094
+
2095
+ // BUG FIX: Added null checks to prevent undefined property access errors
2096
+ function handleWSMessage(data) {
2097
+ if (!data || !data.type) return;
2098
+
2099
+ switch (data.type) {
2100
+ case 'team member:registered':
2101
+ case 'team member:status':
2102
+ if (data.team-member && data.team-member.id) {
2103
+ team members.set(data.team-member.id, data.team-member);
2104
+ renderTeamMemberList();
2105
+ if (selectedTeamMemberId === data.team-member.id) renderTeamMemberDetails(data.team-member);
2106
+ }
2107
+ break;
2108
+ case 'team member:log':
2109
+ if (data.log && data.log.teamMemberId) {
2110
+ if (!teamMemberLogs.has(data.log.teamMemberId)) team memberLogs.set(data.log.teamMemberId, []);
2111
+ team memberLogs.get(data.log.teamMemberId).push(data.log);
2112
+ if (selectedTeamMemberId === data.log.teamMemberId) appendLog(data.log);
2113
+ }
2114
+ break;
2115
+ case 'team member:tokens':
2116
+ if (data.teamMemberId && team members.has(data.teamMemberId)) {
2117
+ team members.get(data.teamMemberId).tokensUsed = data.tokensUsed || 0;
2118
+ renderTeamMemberList();
2119
+ if (selectedTeamMemberId === data.teamMemberId) {
2120
+ renderTeamMemberDetails(teamMembers.get(data.teamMemberId));
2121
+ loadTeamMemberLimits(data.teamMemberId);
2122
+ }
2123
+ }
2124
+ break;
2125
+ case 'team member:task':
2126
+ if (data.teamMemberId && team members.has(data.teamMemberId)) {
2127
+ team members.get(data.teamMemberId).currentTask = data.task;
2128
+ renderTeamMemberList();
2129
+ if (selectedTeamMemberId === data.teamMemberId) renderTeamMemberDetails(teamMembers.get(data.teamMemberId));
2130
+ }
2131
+ break;
2132
+ case 'team member:limit_warning':
2133
+ if (data.teamMemberId && data.warning) {
2134
+ handleLimitWarning(data.teamMemberId, data.warning);
2135
+ if (selectedTeamMemberId === data.teamMemberId) {
2136
+ loadTeamMemberLimits(data.teamMemberId);
2137
+ }
2138
+ }
2139
+ break;
2140
+ case 'team member:limit_acknowledged':
2141
+ if (data.teamMemberId && selectedTeamMemberId === data.teamMemberId) {
2142
+ loadTeamMemberLimits(data.teamMemberId);
2143
+ }
2144
+ break;
2145
+ }
2146
+ updateStats();
2147
+ }
2148
+
2149
+ // BUG FIX: Added null safety for warning object properties
2150
+ function handleLimitWarning(teamMemberId, warning) {
2151
+ const banner = document.getElementById('limit-warning-banner');
2152
+ const title = document.getElementById('limit-warning-title');
2153
+ const message = document.getElementById('limit-warning-message');
2154
+
2155
+ if (banner && title && message && selectedTeamMemberId === teamMemberId && warning) {
2156
+ const warningType = (warning.type || 'unknown').toUpperCase();
2157
+ const warningLevel = warning.level || 'warning';
2158
+ const warningMsg = warning.message || 'Resource limit reached';
2159
+ const warningSuggestion = warning.suggestion || 'Consider reducing resource usage';
2160
+
2161
+ title.textContent = `${warningType} Limit ${warningLevel}`;
2162
+ message.textContent = `${warningMsg} - ${warningSuggestion}`;
2163
+ banner.classList.remove('hidden');
2164
+
2165
+ setTimeout(() => {
2166
+ banner.classList.add('hidden');
2167
+ }, 10000);
2168
+ }
2169
+ }
2170
+
2171
+ // ============================================================================
2172
+ // LOAD ACTIVE AGENTS - Uses SPECMEM API
2173
+ // GET /api/specmem/team-member/active?withinSeconds=300
2174
+ // ============================================================================
2175
+ async function loadTeamMembers() {
2176
+ try {
2177
+ // Fetch active team members from SPECMEM API (active within last 5 minutes)
2178
+ const res = await fetch('/api/specmem/team-member/active?withinSeconds=300', {
2179
+ credentials: 'include'
2180
+ });
2181
+ const data = await res.json();
2182
+
2183
+ if (data.success && data.team-members) {
2184
+ team members.clear();
2185
+ data.team-members.forEach(team member => {
2186
+ // Map SPECMEM team member data to dashboard format
2187
+ const mappedTeamMember = {
2188
+ id: team member.teamMemberId,
2189
+ name: team member.teamMemberName || team member.teamMemberId,
2190
+ type: team member.teamMemberType || 'worker',
2191
+ status: mapTeamMemberStatus(teamMember.status, team member.secondsAgo),
2192
+ tokensUsed: team member.metadata?.tokensUsed || 0,
2193
+ tokensLimit: team member.metadata?.tokensLimit || 100000,
2194
+ createdAt: team member.metadata?.createdAt || new Date().toISOString(),
2195
+ lastHeartbeat: team member.lastHeartbeat,
2196
+ secondsAgo: team member.secondsAgo,
2197
+ currentTask: team member.metadata?.currentTask || null,
2198
+ metadata: team member.metadata || {}
2199
+ };
2200
+ team members.set(teamMember.teamMemberId, mappedTeamMember);
2201
+ });
2202
+ renderTeamMemberList();
2203
+ updateStats();
2204
+ updateMessageTeamMemberSelect();
2205
+ console.log(`SPECMEM: Loaded ${data.team-members.length} active team members`);
2206
+ } else {
2207
+ console.log('SPECMEM: No active team members or API returned empty');
2208
+ renderTeamMemberList();
2209
+ updateStats();
2210
+ }
2211
+ } catch (err) {
2212
+ console.error('SPECMEM: Failed to load team members:', err);
2213
+ serverLog('error', 'Failed to load team members', { error: err.message });
2214
+ // Show error in UI
2215
+ const container = document.getElementById('team-member-list');
2216
+ if (container) {
2217
+ container.innerHTML = `<div class="no-team-members"><div class="no-team-members-icon">&#9888;</div><p>Error loading team members. Check API connection.</p></div>`;
2218
+ }
2219
+ }
2220
+ }
2221
+
2222
+ // Map team member status based on last heartbeat
2223
+ function mapTeamMemberStatus(status, secondsAgo) {
2224
+ if (status === 'completed' || status === 'failed' || status === 'stopped') {
2225
+ return status;
2226
+ }
2227
+ // If no heartbeat in 2 minutes, consider it pending/stale
2228
+ if (secondsAgo > 120) {
2229
+ return 'pending';
2230
+ }
2231
+ // Active heartbeat = running
2232
+ return status === 'active' ? 'running' : (status || 'running');
2233
+ }
2234
+
2235
+ function renderTeamMemberList() {
2236
+ const container = document.getElementById('team-member-list');
2237
+ const filtered = Array.from(teamMembers.values()).filter(a => currentFilter === 'all' || a.status === currentFilter);
2238
+
2239
+ if (filtered.length === 0) {
2240
+ container.innerHTML = `<div class="no-team-members"><div class="no-team-members-icon">&#128640;</div><p>No team members found</p><p style="font-size:11px;color:var(--csgo-text-dim);margin-top:10px;">TeamMembers must send heartbeats to appear here.<br/>Check /api/specmem/team-member/active endpoint.</p></div>`;
2241
+ return;
2242
+ }
2243
+
2244
+ container.innerHTML = filtered.map(a => `
2245
+ <div class="team-member-card ${selectedTeamMemberId === a.id ? 'selected' : ''}" onclick="selectTeamMember('${a.id}')">
2246
+ <div class="team-member-card-header">
2247
+ <span class="team-member-name">${escapeHtml(a.name)}</span>
2248
+ <span class="team-member-type ${a.type}">${a.type}</span>
2249
+ </div>
2250
+ <div style="display:flex;align-items:center;gap:8px;margin-bottom:6px;">
2251
+ <div class="status-badge ${a.status}">
2252
+ <span class="status-dot"></span>
2253
+ ${a.status}
2254
+ </div>
2255
+ ${a.secondsAgo !== undefined ? `<span style="font-size:10px;color:var(--csgo-text-dim);">${formatSecondsAgo(a.secondsAgo)}</span>` : ''}
2256
+ </div>
2257
+ ${a.lastHeartbeat ? `<div style="font-size:10px;color:var(--csgo-text-dim);margin-bottom:6px;">Last heartbeat: ${formatTime(a.lastHeartbeat)}</div>` : ''}
2258
+ ${a.currentTask ? `
2259
+ <div class="progress-bar">
2260
+ <div class="progress-fill" style="width: ${a.currentTask.progress || 0}%"></div>
2261
+ </div>
2262
+ ` : ''}
2263
+ <div class="token-info">
2264
+ <span>Tokens</span>
2265
+ <span><span class="token-value">${formatNumber(a.tokensUsed || 0)}</span> / ${formatNumber(a.tokensLimit || 100000)}</span>
2266
+ </div>
2267
+ </div>
2268
+ `).join('');
2269
+ }
2270
+
2271
+ function formatSecondsAgo(seconds) {
2272
+ if (seconds < 60) return `${Math.round(seconds)}s ago`;
2273
+ if (seconds < 3600) return `${Math.round(seconds / 60)}m ago`;
2274
+ return `${Math.round(seconds / 3600)}h ago`;
2275
+ }
2276
+
2277
+ let teamMemberLimitsCache = new Map();
2278
+
2279
+ // Check if team member is a Task team member (from Claude Code via team_member_sessions)
2280
+ function isTaskTeamMember(teamMember) {
2281
+ if (!teamMember) return false;
2282
+ // Task team members have source: 'task-team-member' in their metadata
2283
+ return teamMember.metadata?.source === 'task-team-member';
2284
+ }
2285
+
2286
+ // Update tabs visibility based on team member type
2287
+ function updateTabsForTeamMemberType(teamMember) {
2288
+ const isTask = isTaskTeamMember(teamMember);
2289
+ const communicatorTab = document.querySelector('[data-tab="communicator"]');
2290
+ const sharedCodeTab = document.querySelector('[data-tab="shared-code"]');
2291
+ const messagesTab = document.querySelector('[data-tab="messages"]');
2292
+
2293
+ // For Task team members, disable certain tabs visually but keep them clickable to show message
2294
+ if (isTask) {
2295
+ if (communicatorTab) communicatorTab.classList.add('tab-disabled');
2296
+ if (sharedCodeTab) sharedCodeTab.classList.add('tab-disabled');
2297
+ if (messagesTab) messagesTab.classList.add('tab-disabled');
2298
+ } else {
2299
+ if (communicatorTab) communicatorTab.classList.remove('tab-disabled');
2300
+ if (sharedCodeTab) sharedCodeTab.classList.remove('tab-disabled');
2301
+ if (messagesTab) messagesTab.classList.remove('tab-disabled');
2302
+ }
2303
+
2304
+ // Update content in disabled tabs for Task team members
2305
+ if (isTask) {
2306
+ const sharedCodeContent = document.getElementById('tab-shared-code');
2307
+ const messagesContent = document.getElementById('tab-messages');
2308
+ const communicatorContent = document.getElementById('tab-communicator');
2309
+
2310
+ if (sharedCodeContent) {
2311
+ const existingNotice = sharedCodeContent.querySelector('.task-team-member-notice');
2312
+ if (!existingNotice) {
2313
+ const notice = document.createElement('div');
2314
+ notice.className = 'task-team-member-notice';
2315
+ notice.innerHTML = `
2316
+ <div class="no-team-members" style="padding: 40px;">
2317
+ <div class="no-team-members-icon">&#128295;</div>
2318
+ <p><strong>Not Available for Task Team Members</strong></p>
2319
+ <p style="font-size: 12px; color: var(--csgo-gray); margin-top: 8px;">
2320
+ Task team members (Claude Code) don't use the shared code collaboration system.
2321
+ <br>View the <strong>Logs</strong> tab to see team member activity.
2322
+ </p>
2323
+ </div>
2324
+ `;
2325
+ sharedCodeContent.innerHTML = '';
2326
+ sharedCodeContent.appendChild(notice);
2327
+ }
2328
+ }
2329
+
2330
+ if (messagesContent) {
2331
+ const existingNotice = messagesContent.querySelector('.task-team-member-notice');
2332
+ if (!existingNotice) {
2333
+ const notice = document.createElement('div');
2334
+ notice.className = 'task-team-member-notice';
2335
+ notice.innerHTML = `
2336
+ <div class="no-team-members" style="padding: 40px;">
2337
+ <div class="no-team-members-icon">&#128172;</div>
2338
+ <p><strong>Not Available for Task Team Members</strong></p>
2339
+ <p style="font-size: 12px; color: var(--csgo-gray); margin-top: 8px;">
2340
+ Task team members run autonomously and don't use the inter-team-member messaging system.
2341
+ <br>View the <strong>Logs</strong> tab to see team member activity.
2342
+ </p>
2343
+ </div>
2344
+ `;
2345
+ messagesContent.querySelector('.message-container').innerHTML = notice.innerHTML;
2346
+ }
2347
+ }
2348
+
2349
+ if (communicatorContent) {
2350
+ const panel = communicatorContent.querySelector('#communicator-panel');
2351
+ const noTeamMember = communicatorContent.querySelector('#communicator-no-team-member');
2352
+ if (panel) panel.classList.add('hidden');
2353
+ if (noTeamMember) {
2354
+ noTeamMember.innerHTML = `
2355
+ <div class="no-team-members-icon">&#128295;</div>
2356
+ <p><strong>Not Available for Task Team Members</strong></p>
2357
+ <p style="font-size: 12px; color: var(--csgo-gray); margin-top: 8px;">
2358
+ Task team members don't support real-time communication.
2359
+ <br>They execute autonomously based on their initial prompt.
2360
+ </p>
2361
+ `;
2362
+ noTeamMember.classList.remove('hidden');
2363
+ }
2364
+ }
2365
+ }
2366
+ }
2367
+
2368
+ function selectTeamMember(id) {
2369
+ selectedTeamMemberId = id;
2370
+ renderTeamMemberList();
2371
+ const teamMember = team members.get(id);
2372
+ if (teamMember) {
2373
+ // Update tabs first based on team member type
2374
+ updateTabsForTeamMemberType(teamMember);
2375
+
2376
+ // Render details with Task team member awareness
2377
+ renderTeamMemberDetails(teamMember);
2378
+ loadTeamMemberLogs(id);
2379
+
2380
+ // Only load limits for non-Task team members (they don't have limit tracking)
2381
+ if (!isTaskTeamMember(teamMember)) {
2382
+ loadTeamMemberLimits(id);
2383
+ }
2384
+ }
2385
+ }
2386
+
2387
+ async function loadTeamMemberLimits(teamMemberId) {
2388
+ // NOTE: SPECMEM team members don't have a separate limits endpoint
2389
+ // Use metadata from the team member itself if available
2390
+ const teamMember = team members.get(teamMemberId);
2391
+ if (team member && team member.metadata) {
2392
+ // Create synthetic limits from metadata if available
2393
+ const limits = {
2394
+ tokens_used: team member.tokensUsed || 0,
2395
+ tokens_limit: team member.tokensLimit || 100000,
2396
+ memory_used: team member.metadata.memoryUsed || 0,
2397
+ memory_limit: team member.metadata.memoryLimit || 50 * 1024 * 1024,
2398
+ files_processed: team member.metadata.filesProcessed || 0,
2399
+ files_limit: team member.metadata.filesLimit || 1000,
2400
+ output_size: team member.metadata.outputSize || 0,
2401
+ output_limit: team member.metadata.outputLimit || 10 * 1024 * 1024
2402
+ };
2403
+ const status = [
2404
+ { type: 'token', level: 'ok', percentage: (limits.tokens_used / limits.tokens_limit) * 100 },
2405
+ { type: 'memory', level: 'ok', percentage: (limits.memory_used / limits.memory_limit) * 100 },
2406
+ { type: 'file', level: 'ok', percentage: (limits.files_processed / limits.files_limit) * 100 },
2407
+ { type: 'output', level: 'ok', percentage: (limits.output_size / limits.output_limit) * 100 }
2408
+ ];
2409
+ teamMemberLimitsCache.set(teamMemberId, { limits, status });
2410
+ renderLimitGauges(teamMemberId);
2411
+ }
2412
+ }
2413
+
2414
+ const LIMIT_SUGGESTIONS = {
2415
+ token: 'Consider chunking your analysis into smaller tasks',
2416
+ memory: 'Flush logs to database, reduce in-memory caching',
2417
+ file: 'Process files in batches of 10',
2418
+ output: 'Stream output instead of buffering'
2419
+ };
2420
+
2421
+ function renderLimitGauges(teamMemberId) {
2422
+ const cached = teamMemberLimitsCache.get(teamMemberId);
2423
+ if (!cached) return;
2424
+
2425
+ const { limits, status } = cached;
2426
+ const container = document.getElementById('limit-gauges-container');
2427
+ if (!container) return;
2428
+
2429
+ const gauges = [
2430
+ { type: 'token', label: 'Tokens', current: limits.tokens_used, limit: limits.tokens_limit, unit: '' },
2431
+ { type: 'memory', label: 'Memory', current: limits.memory_used, limit: limits.memory_limit, unit: 'B' },
2432
+ { type: 'file', label: 'Files', current: limits.files_processed, limit: limits.files_limit, unit: '' },
2433
+ { type: 'output', label: 'Output', current: limits.output_size, limit: limits.output_limit, unit: 'B' }
2434
+ ];
2435
+
2436
+ container.innerHTML = gauges.map(g => {
2437
+ const statusItem = status.find(s => s.type === g.type) || { level: 'ok', percentage: 0 };
2438
+ const percentage = Math.min(statusItem.percentage, 100);
2439
+ const level = statusItem.level;
2440
+ const suggestion = LIMIT_SUGGESTIONS[g.type];
2441
+
2442
+ return `
2443
+ <div class="limit-gauge" data-level="${level}" title="${suggestion}">
2444
+ <div class="limit-gauge-header">
2445
+ <span class="limit-gauge-title">${g.label}</span>
2446
+ <span class="limit-gauge-badge ${level}">${level === 'ok' ? '' : level}</span>
2447
+ </div>
2448
+ <div class="limit-gauge-bar">
2449
+ <div class="limit-gauge-fill ${level}" style="width: ${percentage}%"></div>
2450
+ </div>
2451
+ <div class="limit-gauge-info">
2452
+ <span class="limit-gauge-value">${formatBytes(g.current, g.unit)} / ${formatBytes(g.limit, g.unit)}</span>
2453
+ <span class="limit-gauge-percent">${percentage.toFixed(1)}%</span>
2454
+ </div>
2455
+ <div class="limit-suggestion">${suggestion}</div>
2456
+ </div>
2457
+ `;
2458
+ }).join('');
2459
+ }
2460
+
2461
+ // BUG FIX: Handle both usage patterns - with unit param (for limit gauges) and without (for shared code)
2462
+ function formatBytes(bytes, unit) {
2463
+ // If unit is provided and not 'B', use formatNumber for non-byte values
2464
+ if (unit !== undefined && unit !== 'B') return formatNumber(bytes);
2465
+ // Default byte formatting
2466
+ if (bytes < 1024) return bytes + ' B';
2467
+ if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';
2468
+ return (bytes / (1024 * 1024)).toFixed(1) + ' MB';
2469
+ }
2470
+
2471
+ function renderTeamMemberDetails(teamMember) {
2472
+ const container = document.getElementById('team-member-details');
2473
+ const task = team member.currentTask;
2474
+ const isTask = isTaskTeamMember(teamMember);
2475
+
2476
+ // For Task team members, render a different view
2477
+ if (isTask) {
2478
+ container.innerHTML = `
2479
+ <div class="detail-section" style="background: linear-gradient(135deg, rgba(255,214,0,0.1) 0%, rgba(0,0,0,0) 50%); border-left: 3px solid var(--csgo-yellow); padding-left: 15px;">
2480
+ <div class="detail-title" style="color: var(--csgo-yellow);">Task Team Member (Claude Code)</div>
2481
+ <div class="detail-row"><span class="detail-label">TeamMember ID</span><span class="detail-value" style="font-family: monospace; font-size: 11px;">${teamMember.id}</span></div>
2482
+ <div class="detail-row"><span class="detail-label">Name</span><span class="detail-value">${escapeHtml(teamMember.name)}</span></div>
2483
+ <div class="detail-row"><span class="detail-label">Type</span><span class="detail-value">${teamMember.type || 'task-team-member'}</span></div>
2484
+ <div class="detail-row"><span class="detail-label">Status</span><span class="status-badge ${teamMember.status}"><span class="status-dot"></span>${teamMember.status}</span></div>
2485
+ </div>
2486
+
2487
+ <div class="detail-section">
2488
+ <div class="detail-title">Session Info</div>
2489
+ <div class="detail-row"><span class="detail-label">Started</span><span class="detail-value">${formatDate(teamMember.createdAt)}</span></div>
2490
+ ${teamMember.lastHeartbeat ? `<div class="detail-row"><span class="detail-label">Last Activity</span><span class="detail-value">${formatDate(teamMember.lastHeartbeat)}</span></div>` : ''}
2491
+ <div class="detail-row"><span class="detail-label">Tokens Used</span><span class="detail-value token-value">${formatNumber(teamMember.tokensUsed || 0)}</span></div>
2492
+ </div>
2493
+
2494
+ ${task ? `
2495
+ <div class="detail-section">
2496
+ <div class="detail-title">Current Task</div>
2497
+ <div class="detail-row"><span class="detail-label">Task</span><span class="detail-value">${escapeHtml(task.name)}</span></div>
2498
+ ${task.progress !== undefined ? `
2499
+ <div class="detail-row"><span class="detail-label">Progress</span><span class="detail-value">${task.progress}%</span></div>
2500
+ <div class="progress-bar">
2501
+ <div class="progress-fill" style="width: ${task.progress}%"></div>
2502
+ </div>
2503
+ ` : ''}
2504
+ </div>
2505
+ ` : ''}
2506
+
2507
+ ${teamMember.metadata?.prompt ? `
2508
+ <div class="detail-section">
2509
+ <div class="detail-title">Task Description</div>
2510
+ <div style="background: var(--csgo-darker); padding: 12px; border-radius: 4px; font-size: 12px; line-height: 1.5; color: var(--csgo-text); max-height: 150px; overflow-y: auto;">
2511
+ ${escapeHtml(teamMember.metadata.prompt).substring(0, 500)}${teamMember.metadata.prompt.length > 500 ? '...' : ''}
2512
+ </div>
2513
+ </div>
2514
+ ` : ''}
2515
+
2516
+ ${teamMember.metadata?.workingDirectory ? `
2517
+ <div class="detail-section">
2518
+ <div class="detail-title">Environment</div>
2519
+ <div class="detail-row"><span class="detail-label">Working Dir</span><span class="detail-value" style="font-family: monospace; font-size: 11px;">${escapeHtml(teamMember.metadata.workingDirectory)}</span></div>
2520
+ </div>
2521
+ ` : ''}
2522
+
2523
+ <div class="detail-section" style="margin-top: 15px; padding: 12px; background: rgba(255,214,0,0.05); border-radius: 4px;">
2524
+ <p style="font-size: 11px; color: var(--csgo-gray); margin: 0;">
2525
+ <strong>Note:</strong> Task team members are autonomous Claude Code instances.
2526
+ They don't support real-time communication or shared code features.
2527
+ Check the <strong>Logs</strong> tab for activity history.
2528
+ </p>
2529
+ </div>
2530
+ `;
2531
+ return;
2532
+ }
2533
+
2534
+ // Standard team member details (non-Task team members)
2535
+ container.innerHTML = `
2536
+ <div id="limit-warning-banner" class="limit-warning-alert hidden">
2537
+ <div class="limit-warning-icon">!</div>
2538
+ <div class="limit-warning-text">
2539
+ <h4 id="limit-warning-title">Limit Warning</h4>
2540
+ <p id="limit-warning-message">A team member has reached a limit threshold</p>
2541
+ </div>
2542
+ </div>
2543
+
2544
+ <div class="detail-section">
2545
+ <div class="detail-title">Resource Limits</div>
2546
+ <div id="limit-gauges-container" class="limit-gauges">
2547
+ <div class="limit-gauge">
2548
+ <div class="limit-gauge-header"><span class="limit-gauge-title">Loading...</span></div>
2549
+ </div>
2550
+ </div>
2551
+ </div>
2552
+
2553
+ <div class="detail-section">
2554
+ <div class="detail-title">TeamMember Info (SPECMEM)</div>
2555
+ <div class="detail-row"><span class="detail-label">TeamMember ID</span><span class="detail-value" style="font-family:monospace;font-size:11px;">${escapeHtml(teamMember.id)}</span></div>
2556
+ <div class="detail-row"><span class="detail-label">Name</span><span class="detail-value">${escapeHtml(teamMember.name)}</span></div>
2557
+ <div class="detail-row"><span class="detail-label">Type</span><span class="detail-value">${teamMember.type}</span></div>
2558
+ <div class="detail-row"><span class="detail-label">Status</span><span class="status-badge ${teamMember.status}"><span class="status-dot"></span>${teamMember.status}</span></div>
2559
+ ${teamMember.lastHeartbeat ? `<div class="detail-row"><span class="detail-label">Last Heartbeat</span><span class="detail-value">${formatDate(teamMember.lastHeartbeat)}</span></div>` : ''}
2560
+ ${teamMember.secondsAgo !== undefined ? `<div class="detail-row"><span class="detail-label">Time Since Heartbeat</span><span class="detail-value">${formatSecondsAgo(teamMember.secondsAgo)}</span></div>` : ''}
2561
+ <div class="detail-row"><span class="detail-label">Created</span><span class="detail-value">${formatDate(teamMember.createdAt)}</span></div>
2562
+ </div>
2563
+
2564
+ ${task ? `
2565
+ <div class="detail-section">
2566
+ <div class="detail-title">Current Task</div>
2567
+ <div class="detail-row"><span class="detail-label">Task</span><span class="detail-value">${escapeHtml(task.name)}</span></div>
2568
+ <div class="detail-row"><span class="detail-label">Progress</span><span class="detail-value">${task.progress}%</span></div>
2569
+ <div class="detail-row"><span class="detail-label">Status</span><span class="status-badge ${task.status}"><span class="status-dot"></span>${task.status}</span></div>
2570
+ <div class="progress-bar">
2571
+ <div class="progress-fill" style="width: ${task.progress}%"></div>
2572
+ </div>
2573
+ </div>
2574
+ ` : ''}
2575
+
2576
+ <div class="action-bar">
2577
+ ${teamMember.status === 'running' ? `
2578
+ <button class="btn btn-danger btn-small" onclick="stopTeamMember('${teamMember.id}')">Stop</button>
2579
+ <button class="btn btn-secondary btn-small" onclick="restartTeamMember('${teamMember.id}')">Restart</button>
2580
+ ` : teamMember.status === 'failed' || teamMember.status === 'stopped' ? `
2581
+ <button class="btn btn-small" onclick="restartTeamMember('${teamMember.id}')">Restart</button>
2582
+ ` : ''}
2583
+ </div>
2584
+ `;
2585
+
2586
+ if (teamMemberLimitsCache.has(teamMember.id)) {
2587
+ renderLimitGauges(teamMember.id);
2588
+ }
2589
+ }
2590
+
2591
+ async function loadTeamMemberLogs(teamMemberId) {
2592
+ // NOTE: SPECMEM doesn't have per-team member logs endpoint
2593
+ // Show placeholder message for now
2594
+ const container = document.getElementById('log-container');
2595
+ if (container) {
2596
+ const teamMember = team members.get(teamMemberId);
2597
+ container.innerHTML = `
2598
+ <div class="log-entry info">
2599
+ <span class="log-timestamp">${formatTime(new Date())}</span>
2600
+ TeamMember logs for SPECMEM team members are stored in the database.
2601
+ </div>
2602
+ <div class="log-entry info">
2603
+ <span class="log-timestamp">${formatTime(new Date())}</span>
2604
+ Team Member: ${teamMember?.name || teamMemberId} | Status: ${teamMember?.status || 'unknown'}
2605
+ </div>
2606
+ ${teamMember?.lastHeartbeat ? `
2607
+ <div class="log-entry info">
2608
+ <span class="log-timestamp">${formatTime(teamMember.lastHeartbeat)}</span>
2609
+ Last heartbeat received
2610
+ </div>
2611
+ ` : ''}
2612
+ `;
2613
+ }
2614
+ }
2615
+
2616
+ function renderLogs(logs) {
2617
+ const container = document.getElementById('log-container');
2618
+ const filtered = logs.filter(l => currentLogFilter === 'all' || l.level === currentLogFilter);
2619
+ container.innerHTML = filtered.map(l => `
2620
+ <div class="log-entry ${l.level}">
2621
+ <span class="log-timestamp">${formatTime(l.timestamp)}</span>
2622
+ ${escapeHtml(l.message)}
2623
+ </div>
2624
+ `).join('') || '<div class="log-entry info">No logs yet</div>';
2625
+ container.scrollTop = container.scrollHeight;
2626
+ }
2627
+
2628
+ function appendLog(log) {
2629
+ if (currentLogFilter !== 'all' && log.level !== currentLogFilter) return;
2630
+ const container = document.getElementById('log-container');
2631
+ const entry = document.createElement('div');
2632
+ entry.className = `log-entry ${log.level}`;
2633
+ entry.innerHTML = `<span class="log-timestamp">${formatTime(log.timestamp)}</span>${escapeHtml(log.message)}`;
2634
+ container.appendChild(entry);
2635
+ container.scrollTop = container.scrollHeight;
2636
+ }
2637
+
2638
+ function updateStats() {
2639
+ const all = Array.from(teamMembers.values());
2640
+ document.getElementById('stat-total').textContent = all.length;
2641
+ document.getElementById('stat-running').textContent = all.filter(a => a.status === 'running').length;
2642
+ // BUG FIX: Guard against undefined tokensUsed
2643
+ document.getElementById('stat-tokens').textContent = formatNumber(all.reduce((s, a) => s + (a.tokensUsed || 0), 0));
2644
+ }
2645
+
2646
+ // BUG FIX: Deploy modal was removed - redirect to console instead
2647
+ function showDeployModal() {
2648
+ // The deploy modal HTML was removed, redirect to console for deployment
2649
+ window.location.href = '/prompt';
2650
+ }
2651
+ function hideDeployModal() {
2652
+ // No-op since modal was removed
2653
+ }
2654
+
2655
+ // BUG FIX: These functions reference removed deploy modal elements - make them no-ops
2656
+ function updateWorkerTypeVisibility() {
2657
+ // No-op - deploy modal was removed
2658
+ }
2659
+
2660
+ function updateCommandPlaceholder() {
2661
+ // No-op - deploy modal was removed
2662
+ }
2663
+
2664
+ // BUG FIX: Deploy modal was removed - this function now redirects to console
2665
+ async function deployTeamMember(e) {
2666
+ if (e) e.preventDefault();
2667
+ // Redirect to console for deployment since modal was removed
2668
+ window.location.href = '/prompt';
2669
+ }
2670
+
2671
+ async function stopTeamMember(id) {
2672
+ // SPECMEM: Send a stop command message to the team member
2673
+ try {
2674
+ const res = await fetch('/api/specmem/team-member/message', {
2675
+ method: 'POST',
2676
+ headers: { 'Content-Type': 'application/json' },
2677
+ credentials: 'include',
2678
+ body: JSON.stringify({
2679
+ from: 'dashboard',
2680
+ to: id,
2681
+ message: JSON.stringify({ type: 'command', action: 'stop' }),
2682
+ priority: 'high'
2683
+ })
2684
+ });
2685
+ if (res.ok) {
2686
+ alert('Stop command sent to team member');
2687
+ loadTeamMembers();
2688
+ }
2689
+ } catch (err) {
2690
+ console.error('SPECMEM: Stop command failed:', err);
2691
+ alert('Failed to send stop command');
2692
+ }
2693
+ }
2694
+
2695
+ async function restartTeamMember(id) {
2696
+ // SPECMEM: Send a restart command message to the team member
2697
+ try {
2698
+ const res = await fetch('/api/specmem/team-member/message', {
2699
+ method: 'POST',
2700
+ headers: { 'Content-Type': 'application/json' },
2701
+ credentials: 'include',
2702
+ body: JSON.stringify({
2703
+ from: 'dashboard',
2704
+ to: id,
2705
+ message: JSON.stringify({ type: 'command', action: 'restart' }),
2706
+ priority: 'high'
2707
+ })
2708
+ });
2709
+ if (res.ok) {
2710
+ alert('Restart command sent to team member');
2711
+ loadTeamMembers();
2712
+ }
2713
+ } catch (err) {
2714
+ console.error('SPECMEM: Restart command failed:', err);
2715
+ alert('Failed to send restart command');
2716
+ }
2717
+ }
2718
+
2719
+ document.querySelectorAll('.filter-btn[data-filter]').forEach(btn => {
2720
+ btn.addEventListener('click', () => {
2721
+ document.querySelectorAll('.filter-btn[data-filter]').forEach(b => b.classList.remove('active'));
2722
+ btn.classList.add('active');
2723
+ currentFilter = btn.dataset.filter;
2724
+ renderTeamMemberList();
2725
+ });
2726
+ });
2727
+
2728
+ document.querySelectorAll('.filter-btn[data-log]').forEach(btn => {
2729
+ btn.addEventListener('click', () => {
2730
+ document.querySelectorAll('.filter-btn[data-log]').forEach(b => b.classList.remove('active'));
2731
+ btn.classList.add('active');
2732
+ currentLogFilter = btn.dataset.log;
2733
+ if (selectedTeamMemberId && team memberLogs.has(selectedTeamMemberId)) {
2734
+ renderLogs(teamMemberLogs.get(selectedTeamMemberId));
2735
+ }
2736
+ });
2737
+ });
2738
+
2739
+ function escapeHtml(str) {
2740
+ return String(str).replace(/[&<>"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c]));
2741
+ }
2742
+
2743
+ function formatNumber(n) {
2744
+ if (n >= 1000000) return (n / 1000000).toFixed(1) + 'M';
2745
+ if (n >= 1000) return (n / 1000).toFixed(1) + 'K';
2746
+ return n.toString();
2747
+ }
2748
+
2749
+ function formatDate(d) {
2750
+ return new Date(d).toLocaleString();
2751
+ }
2752
+
2753
+ function formatTime(d) {
2754
+ return new Date(d).toLocaleTimeString();
2755
+ }
2756
+
2757
+ let sharedCodeList = [];
2758
+ let teamMemberMessages = [];
2759
+ let collabStats = { totalSharedCode: 0, totalFeedback: 0, totalMessages: 0, positiveRatio: 0 };
2760
+ let currentTab = 'details';
2761
+
2762
+ document.querySelectorAll('.tab-btn').forEach(btn => {
2763
+ btn.addEventListener('click', () => {
2764
+ document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
2765
+ btn.classList.add('active');
2766
+ currentTab = btn.dataset.tab;
2767
+ document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active'));
2768
+ document.getElementById(`tab-${currentTab}`).classList.add('active');
2769
+ if (currentTab === 'shared-code') loadSharedCode();
2770
+ // Load all messages regardless of selected team member (spy mode)
2771
+ if (currentTab === 'messages') loadAllMessages();
2772
+ });
2773
+ });
2774
+
2775
+ async function loadSharedCode() {
2776
+ try {
2777
+ const res = await fetch('/api/team-members/shared-code?limit=50');
2778
+ const data = await res.json();
2779
+ if (data.success) {
2780
+ sharedCodeList = data.sharedCode;
2781
+ renderSharedCode();
2782
+ }
2783
+ await loadCollabStats();
2784
+ } catch (err) {
2785
+ console.error('Failed to load shared code:', err);
2786
+ }
2787
+ }
2788
+
2789
+ async function loadCollabStats() {
2790
+ try {
2791
+ // Try SPECMEM spy stats endpoint
2792
+ const res = await fetch('/api/specmem/team-member/spy/stats?sinceHours=24', {
2793
+ credentials: 'include'
2794
+ });
2795
+ const data = await res.json();
2796
+ if (data.success && data.stats) {
2797
+ document.getElementById('stat-shared').textContent = '0'; // Not used in SPECMEM
2798
+ document.getElementById('stat-feedback').textContent = '0'; // Not used in SPECMEM
2799
+ document.getElementById('stat-messages').textContent = data.stats.totalMessages || 0;
2800
+ document.getElementById('stat-positive').textContent = `${data.stats.activeTeamMembers || 0} active`;
2801
+ }
2802
+ } catch (err) {
2803
+ // Silently fail - stats are not critical
2804
+ console.log('SPECMEM: Could not load collab stats (optional)');
2805
+ }
2806
+ }
2807
+
2808
+ // NOTE: formatBytes function is defined earlier in the file
2809
+
2810
+ function renderSharedCode() {
2811
+ const container = document.getElementById('shared-code-list');
2812
+ if (sharedCodeList.length === 0) {
2813
+ container.innerHTML = '<div class="no-team-members"><p>No shared code yet. Be the first to share!</p></div>';
2814
+ return;
2815
+ }
2816
+ container.innerHTML = sharedCodeList.map(code => {
2817
+ const teamMember = team members.get(code.teamMemberId);
2818
+ const teamMemberName = team member ? team member.name : 'Unknown';
2819
+ const codeContent = code.code || code.codePreview || '';
2820
+ const isChunked = code.isChunked || false;
2821
+ const codeSize = code.codeSize || 0;
2822
+ const totalChunks = code.totalChunks || 0;
2823
+ return `
2824
+ <div class="code-card" data-code-id="${code.id}">
2825
+ <div class="code-card-header">
2826
+ <div>
2827
+ <div class="code-title">${escapeHtml(code.title)}${isChunked ? ' <span class="code-tag" style="background: rgba(255, 152, 0, 0.2); border-color: #ff9800; color: #ff9800;">LARGE FILE (CHUNKED)</span>' : ''}</div>
2828
+ <div class="code-meta">
2829
+ By ${escapeHtml(teamMemberName)} | ${code.language} | ${formatDate(code.createdAt)}${codeSize ? ' | ' + formatBytes(codeSize) : ''}${isChunked ? ' | ' + totalChunks + ' chunks' : ''}
2830
+ </div>
2831
+ ${code.tags && code.tags.length ? `
2832
+ <div class="code-tags">
2833
+ ${code.tags.map(t => `<span class="code-tag">${escapeHtml(t)}</span>`).join('')}
2834
+ </div>
2835
+ ` : ''}
2836
+ </div>
2837
+ </div>
2838
+ ${code.description ? `<div class="code-meta" style="padding: 8px 12px;">${escapeHtml(code.description)}</div>` : ''}
2839
+ <div class="code-preview" id="code-preview-${code.id}">${escapeHtml(codeContent)}${isChunked ? '\n\n... [Preview only - click Load More or Download Full Code]' : ''}</div>
2840
+ ${isChunked ? `
2841
+ <div class="chunk-progress" id="chunk-progress-${code.id}" style="padding: 8px 12px; font-size: 11px; color: var(--csgo-text-dim); background: var(--csgo-gray);">
2842
+ Showing preview (1 KB) of ${formatBytes(codeSize)} | Chunks: 0/${totalChunks} loaded
2843
+ </div>
2844
+ ` : ''}
2845
+ <div class="code-actions">
2846
+ ${isChunked ? `
2847
+ <button class="feedback-btn" onclick="loadMoreChunks('${code.id}')" id="load-more-${code.id}">Load More</button>
2848
+ <button class="feedback-btn" onclick="downloadFullCode('${code.id}')" style="border-color: var(--csgo-yellow); color: var(--csgo-yellow);">Download Full</button>
2849
+ ` : ''}
2850
+ <button class="feedback-btn positive" onclick="showFeedbackModal('${code.id}', 'positive')">+ Good</button>
2851
+ <button class="feedback-btn critique" onclick="showFeedbackModal('${code.id}', 'critique')">Critique</button>
2852
+ <button class="feedback-btn question" onclick="showFeedbackModal('${code.id}', 'question')">? Question</button>
2853
+ <button class="feedback-btn negative" onclick="showFeedbackModal('${code.id}', 'negative')">- Issue</button>
2854
+ <button class="feedback-btn" onclick="toggleFeedback('${code.id}')">View Feedback</button>
2855
+ </div>
2856
+ <div id="feedback-${code.id}" class="feedback-list hidden"></div>
2857
+ </div>
2858
+ `;
2859
+ }).join('');
2860
+ }
2861
+
2862
+ const loadedChunks = new Map();
2863
+
2864
+ async function loadMoreChunks(codeId) {
2865
+ const code = sharedCodeList.find(c => c.id === codeId);
2866
+ if (!code || !code.isChunked) return;
2867
+
2868
+ const loaded = loadedChunks.get(codeId) || 0;
2869
+ const totalChunks = code.totalChunks || 0;
2870
+ if (loaded >= totalChunks) {
2871
+ alert('All chunks loaded');
2872
+ return;
2873
+ }
2874
+
2875
+ const loadBtn = document.getElementById(`load-more-${codeId}`);
2876
+ if (loadBtn) loadBtn.textContent = 'Loading...';
2877
+
2878
+ try {
2879
+ const res = await fetch(`/api/team-members/shared-code/${codeId}/chunk/${loaded}`);
2880
+ const data = await res.json();
2881
+ if (data.success && data.chunk) {
2882
+ const preview = document.getElementById(`code-preview-${codeId}`);
2883
+ if (preview) {
2884
+ const currentText = preview.textContent.replace(/\n\n\.\.\. \[Preview only.*\]$/, '');
2885
+ preview.textContent = currentText + data.chunk.data;
2886
+ }
2887
+ loadedChunks.set(codeId, loaded + 1);
2888
+ const progress = document.getElementById(`chunk-progress-${codeId}`);
2889
+ if (progress) {
2890
+ const newLoaded = loaded + 1;
2891
+ progress.textContent = `Chunks: ${newLoaded}/${totalChunks} loaded | ${formatBytes(newLoaded * 50 * 1024)} of ${formatBytes(code.codeSize)}`;
2892
+ }
2893
+ if (loaded + 1 >= totalChunks) {
2894
+ if (loadBtn) loadBtn.textContent = 'All Loaded';
2895
+ loadBtn.disabled = true;
2896
+ }
2897
+ }
2898
+ } catch (err) {
2899
+ console.error('Failed to load chunk:', err);
2900
+ alert('Failed to load chunk');
2901
+ } finally {
2902
+ if (loadBtn && loadBtn.textContent === 'Loading...') loadBtn.textContent = 'Load More';
2903
+ }
2904
+ }
2905
+
2906
+ async function downloadFullCode(codeId) {
2907
+ window.open(`/api/team-members/shared-code/${codeId}/download`, '_blank');
2908
+ }
2909
+
2910
+ async function toggleFeedback(codeId) {
2911
+ const container = document.getElementById(`feedback-${codeId}`);
2912
+ if (!container.classList.contains('hidden')) {
2913
+ container.classList.add('hidden');
2914
+ return;
2915
+ }
2916
+ try {
2917
+ const res = await fetch(`/api/team-members/shared-code/${codeId}/feedback`);
2918
+ const data = await res.json();
2919
+ if (data.success && data.feedback.length > 0) {
2920
+ container.innerHTML = data.feedback.map(fb => {
2921
+ const teamMember = team members.get(fb.fromTeamMemberId);
2922
+ const teamMemberName = team member ? team member.name : 'Unknown';
2923
+ return `
2924
+ <div class="feedback-item">
2925
+ <div class="feedback-item-header">
2926
+ <span class="feedback-type ${fb.feedbackType}">${fb.feedbackType}</span>
2927
+ <span style="color: var(--csgo-text-dim); font-size: 10px;">${formatDate(fb.createdAt)}</span>
2928
+ </div>
2929
+ <div style="margin-bottom: 5px; font-size: 11px; color: var(--csgo-yellow);">${escapeHtml(teamMemberName)}</div>
2930
+ <div>${escapeHtml(fb.message)}</div>
2931
+ </div>
2932
+ `;
2933
+ }).join('');
2934
+ } else {
2935
+ container.innerHTML = '<div style="text-align: center; color: var(--csgo-text-dim); padding: 10px;">No feedback yet</div>';
2936
+ }
2937
+ container.classList.remove('hidden');
2938
+ } catch (err) {
2939
+ console.error('Failed to load feedback:', err);
2940
+ }
2941
+ }
2942
+
2943
+ function showShareCodeModal() { document.getElementById('share-code-modal').classList.remove('hidden'); }
2944
+ function hideShareCodeModal() { document.getElementById('share-code-modal').classList.add('hidden'); }
2945
+
2946
+ async function shareCode(e) {
2947
+ e.preventDefault();
2948
+ if (!selectedTeamMemberId) {
2949
+ alert('Select a team member first');
2950
+ return;
2951
+ }
2952
+ const payload = {
2953
+ title: document.getElementById('share-title').value,
2954
+ description: document.getElementById('share-description').value,
2955
+ filePath: document.getElementById('share-filepath').value,
2956
+ language: document.getElementById('share-language').value,
2957
+ tags: document.getElementById('share-tags').value.split(',').map(t => t.trim()).filter(t => t),
2958
+ code: document.getElementById('share-code').value
2959
+ };
2960
+ try {
2961
+ const res = await fetch(`/api/team-members/${selectedTeamMemberId}/share-code`, {
2962
+ method: 'POST',
2963
+ headers: { 'Content-Type': 'application/json' },
2964
+ body: JSON.stringify(payload)
2965
+ });
2966
+ const data = await res.json();
2967
+ if (data.success) {
2968
+ hideShareCodeModal();
2969
+ document.getElementById('share-title').value = '';
2970
+ document.getElementById('share-description').value = '';
2971
+ document.getElementById('share-filepath').value = '';
2972
+ document.getElementById('share-tags').value = '';
2973
+ document.getElementById('share-code').value = '';
2974
+ loadSharedCode();
2975
+ }
2976
+ } catch (err) {
2977
+ console.error('Failed to share code:', err);
2978
+ }
2979
+ }
2980
+
2981
+ function showFeedbackModal(codeId, feedbackType) {
2982
+ document.getElementById('feedback-code-id').value = codeId;
2983
+ document.querySelector(`input[name="feedback-type"][value="${feedbackType}"]`).checked = true;
2984
+ document.getElementById('feedback-modal').classList.remove('hidden');
2985
+ }
2986
+ function hideFeedbackModal() { document.getElementById('feedback-modal').classList.add('hidden'); }
2987
+
2988
+ async function submitFeedback(e) {
2989
+ e.preventDefault();
2990
+ if (!selectedTeamMemberId) {
2991
+ alert('Select a team member first');
2992
+ return;
2993
+ }
2994
+ const codeId = document.getElementById('feedback-code-id').value;
2995
+ const feedbackType = document.querySelector('input[name="feedback-type"]:checked').value;
2996
+ const message = document.getElementById('feedback-message').value;
2997
+ try {
2998
+ const res = await fetch(`/api/team-members/shared-code/${codeId}/feedback`, {
2999
+ method: 'POST',
3000
+ headers: { 'Content-Type': 'application/json' },
3001
+ body: JSON.stringify({ fromTeamMemberId: selectedTeamMemberId, feedbackType, message })
3002
+ });
3003
+ const data = await res.json();
3004
+ if (data.success) {
3005
+ hideFeedbackModal();
3006
+ document.getElementById('feedback-message').value = '';
3007
+ loadCollabStats();
3008
+ toggleFeedback(codeId);
3009
+ }
3010
+ } catch (err) {
3011
+ console.error('Failed to submit feedback:', err);
3012
+ }
3013
+ }
3014
+
3015
+ // ============================================================================
3016
+ // LOAD MESSAGES - Uses SPECMEM API
3017
+ // GET /api/specmem/team-member/spy/all-messages?limit=100
3018
+ // ============================================================================
3019
+ async function loadMessages(teamMemberId) {
3020
+ try {
3021
+ // Load ALL messages for spy view
3022
+ const res = await fetch('/api/specmem/team-member/spy/all-messages?limit=100&sinceMinutes=1440', {
3023
+ credentials: 'include'
3024
+ });
3025
+ const data = await res.json();
3026
+ if (data.success && data.messages) {
3027
+ // Transform to dashboard format
3028
+ team memberMessages = data.messages.map(msg => ({
3029
+ id: msg.id,
3030
+ fromTeamMemberId: msg.from,
3031
+ toTeamMemberId: msg.to,
3032
+ message: msg.message,
3033
+ priority: msg.priority,
3034
+ createdAt: msg.timestamp,
3035
+ read: true // All spied messages are "read"
3036
+ }));
3037
+ renderMessages();
3038
+ console.log(`SPECMEM: Loaded ${data.messages.length} messages`);
3039
+ } else {
3040
+ team memberMessages = [];
3041
+ renderMessages();
3042
+ }
3043
+ updateMessageTeamMemberSelect();
3044
+ } catch (err) {
3045
+ console.error('SPECMEM: Failed to load messages:', err);
3046
+ }
3047
+ }
3048
+
3049
+ // Load all messages regardless of selected team-member
3050
+ async function loadAllMessages() {
3051
+ try {
3052
+ const res = await fetch('/api/specmem/team-member/spy/all-messages?limit=100&sinceMinutes=1440', {
3053
+ credentials: 'include'
3054
+ });
3055
+ const data = await res.json();
3056
+ if (data.success && data.messages) {
3057
+ allMessages = data.messages;
3058
+ team memberMessages = data.messages.map(msg => ({
3059
+ id: msg.id,
3060
+ fromTeamMemberId: msg.from,
3061
+ toTeamMemberId: msg.to,
3062
+ message: msg.message,
3063
+ priority: msg.priority,
3064
+ createdAt: msg.timestamp,
3065
+ read: true
3066
+ }));
3067
+ renderMessages();
3068
+ }
3069
+ } catch (err) {
3070
+ console.error('SPECMEM: Failed to load all messages:', err);
3071
+ }
3072
+ }
3073
+
3074
+ function renderMessages() {
3075
+ const container = document.getElementById('message-container');
3076
+ if (agentMessages.length === 0) {
3077
+ container.innerHTML = '<div class="no-team-members"><p>No messages yet</p><p style="font-size:11px;color:var(--csgo-text-dim);margin-top:10px;">Messages sent via POST /api/specmem/team-member/message will appear here.</p></div>';
3078
+ return;
3079
+ }
3080
+ container.innerHTML = team memberMessages.map(msg => {
3081
+ const fromTeamMember = team members.get(msg.fromTeamMemberId);
3082
+ const toTeamMember = team members.get(msg.toTeamMemberId);
3083
+ const isSent = msg.fromTeamMemberId === selectedTeamMemberId || msg.fromTeamMemberId === 'dashboard';
3084
+ const priorityColor = getPriorityColor(msg.priority);
3085
+ const toDisplay = msg.toTeamMemberId === 'all' ? 'ALL' : (toTeamMember?.name || msg.toTeamMemberId || 'Unknown');
3086
+ return `
3087
+ <div class="message-item ${isSent ? 'sent' : 'received'}" style="border-left-color: ${priorityColor};">
3088
+ <div class="message-header">
3089
+ <span class="message-from" style="color: var(--csgo-yellow);">
3090
+ ${escapeHtml(fromTeamMember?.name || msg.fromTeamMemberId || 'Unknown')}
3091
+ <span style="color: var(--csgo-text-dim);"> -> </span>
3092
+ ${escapeHtml(toDisplay)}
3093
+ </span>
3094
+ <span style="display:flex;align-items:center;gap:8px;">
3095
+ <span class="status-badge" style="background:${priorityColor}20;color:${priorityColor};font-size:9px;padding:2px 5px;">${(msg.priority || 'medium').toUpperCase()}</span>
3096
+ <span class="message-time">${formatTime(msg.createdAt)}</span>
3097
+ </span>
3098
+ </div>
3099
+ <div class="message-text">${escapeHtml(msg.message)}</div>
3100
+ </div>
3101
+ `;
3102
+ }).join('');
3103
+ container.scrollTop = container.scrollHeight;
3104
+ }
3105
+
3106
+ function getPriorityColor(priority) {
3107
+ switch (priority) {
3108
+ case 'critical': return '#f44336';
3109
+ case 'high': return '#ff9800';
3110
+ case 'medium': return '#FFD700';
3111
+ case 'low': return '#4CAF50';
3112
+ default: return '#888888';
3113
+ }
3114
+ }
3115
+
3116
+ function updateMessageTeamMemberSelect() {
3117
+ const select = document.getElementById('message-to-team-member');
3118
+ if (!select) return;
3119
+ const options = ['<option value="">All TeamMembers (Broadcast)</option>'];
3120
+ team members.forEach((a, id) => {
3121
+ options.push(`<option value="${id}">${escapeHtml(a.name)} (${a.type})</option>`);
3122
+ });
3123
+ select.innerHTML = options.join('');
3124
+ }
3125
+
3126
+ // ============================================================================
3127
+ // SEND MESSAGE - Uses SPECMEM API
3128
+ // POST /api/specmem/team-member/message
3129
+ // ============================================================================
3130
+ async function sendMessage() {
3131
+ const toTeamMemberId = document.getElementById('message-to-team-member').value;
3132
+ const message = document.getElementById('message-input').value;
3133
+ const prioritySelect = document.getElementById('message-priority');
3134
+ const priority = prioritySelect ? prioritySelect.value : 'medium';
3135
+
3136
+ if (!message) {
3137
+ alert('Enter a message');
3138
+ return;
3139
+ }
3140
+
3141
+ try {
3142
+ const res = await fetch('/api/specmem/team-member/message', {
3143
+ method: 'POST',
3144
+ headers: { 'Content-Type': 'application/json' },
3145
+ credentials: 'include',
3146
+ body: JSON.stringify({
3147
+ from: 'dashboard',
3148
+ to: toTeamMemberId || 'all', // If no team member selected, broadcast to all
3149
+ message: message,
3150
+ priority: priority
3151
+ })
3152
+ });
3153
+ const data = await res.json();
3154
+ if (data.success) {
3155
+ document.getElementById('message-input').value = '';
3156
+ console.log('SPECMEM: Message sent successfully', data);
3157
+ // Reload messages to show the new one
3158
+ setTimeout(() => loadAllMessages(), 500);
3159
+ } else {
3160
+ alert('Failed to send message: ' + (data.error || 'Unknown error'));
3161
+ }
3162
+ } catch (err) {
3163
+ console.error('SPECMEM: Failed to send message:', err);
3164
+ alert('Failed to send message');
3165
+ }
3166
+ }
3167
+
3168
+ function showEncouragement(message) {
3169
+ document.getElementById('encouragement-message').textContent = message;
3170
+ document.getElementById('encouragement-banner').classList.remove('hidden');
3171
+ setTimeout(() => {
3172
+ document.getElementById('encouragement-banner').classList.add('hidden');
3173
+ }, 15000);
3174
+ }
3175
+
3176
+ const originalHandleWSMessage = handleWSMessage;
3177
+ handleWSMessage = function(data) {
3178
+ originalHandleWSMessage(data);
3179
+ if (data.type === 'code:shared') {
3180
+ loadSharedCode();
3181
+ if (data.data && data.data.teamMemberId !== selectedTeamMemberId) {
3182
+ showEncouragement('New code was shared! Check it out and provide feedback.');
3183
+ }
3184
+ }
3185
+ if (data.type === 'feedback:given') {
3186
+ loadCollabStats();
3187
+ }
3188
+ if (data.type === 'message:sent') {
3189
+ if (data.data && (data.data.toTeamMemberId === selectedTeamMemberId || data.data.fromTeamMemberId === selectedTeamMemberId)) {
3190
+ loadMessages(selectedTeamMemberId);
3191
+ }
3192
+ }
3193
+ if (data.type === 'team member:status' && data.team-member?.status === 'completed') {
3194
+ showEncouragement('Your team member completed a task! Share your code for peer review.');
3195
+ }
3196
+ };
3197
+
3198
+ document.getElementById('message-input').addEventListener('keypress', (e) => {
3199
+ if (e.key === 'Enter') sendMessage();
3200
+ });
3201
+
3202
+ function showHistoryModal() {
3203
+ document.getElementById('history-modal').classList.remove('hidden');
3204
+ loadHistoryTeamMembers();
3205
+ }
3206
+
3207
+ function hideHistoryModal() {
3208
+ document.getElementById('history-modal').classList.add('hidden');
3209
+ }
3210
+
3211
+ function hideSessionDetailModal() {
3212
+ document.getElementById('session-detail-modal').classList.add('hidden');
3213
+ }
3214
+
3215
+ // ============================================================================
3216
+ // LOAD TEAM MEMBER HISTORY - Uses SPECMEM API
3217
+ // GET /api/specmem/team-member/spy/history?sinceHours=24
3218
+ // ============================================================================
3219
+ async function loadHistoryTeamMembers() {
3220
+ const container = document.getElementById('history-team-member-list');
3221
+ container.innerHTML = '<div class="history-loading">Loading team member history...</div>';
3222
+ try {
3223
+ const res = await fetch('/api/specmem/team-member/spy/history?sinceHours=24', {
3224
+ credentials: 'include'
3225
+ });
3226
+ const data = await res.json();
3227
+ if (data.success && data.team-members && data.team-members.length > 0) {
3228
+ // Transform SPECMEM history data to dashboard format
3229
+ historyTeamMembers = data.team-members.map(team member => ({
3230
+ id: team member.teamMemberId,
3231
+ name: team member.teamMemberName || team member.teamMemberId,
3232
+ type: team member.teamMemberType || 'worker',
3233
+ sessionCount: 1, // SPECMEM tracks individual sessions
3234
+ lastSessionDate: team member.lastHeartbeat,
3235
+ isActive: team member.isActive,
3236
+ status: teamMember.status,
3237
+ metadata: team member.metadata
3238
+ }));
3239
+ renderHistoryTeamMembers();
3240
+ console.log(`SPECMEM: Loaded ${data.team-members.length} team members from history`);
3241
+ } else {
3242
+ container.innerHTML = '<div class="history-empty">No team member history found in last 24 hours</div>';
3243
+ }
3244
+ } catch (err) {
3245
+ console.error('SPECMEM: Failed to load history team members:', err);
3246
+ container.innerHTML = '<div class="history-empty">Error loading team member history</div>';
3247
+ }
3248
+ }
3249
+
3250
+ function renderHistoryTeamMembers() {
3251
+ const container = document.getElementById('history-team-member-list');
3252
+ container.innerHTML = historyTeamMembers.map(team member => `
3253
+ <div class="history-team-member-item ${selectedHistoryTeamMemberId === team member.id ? 'selected' : ''}"
3254
+ onclick="selectHistoryTeamMember('${teamMember.id}')">
3255
+ <div class="history-team-member-name">
3256
+ <span class="history-team-member-expand">&gt;</span>
3257
+ ${escapeHtml(teamMember.name)}
3258
+ ${teamMember.isActive ? '<span style="display:inline-block;width:8px;height:8px;background:var(--csgo-success);border-radius:50%;margin-left:8px;animation:pulse 1.5s infinite;"></span>' : ''}
3259
+ </div>
3260
+ <div class="history-team-member-meta">
3261
+ <span>${teamMember.type}</span>
3262
+ <span class="status-badge ${teamMember.isActive ? 'running' : 'stopped'}" style="font-size:9px;padding:2px 5px;">
3263
+ ${teamMember.isActive ? 'ACTIVE' : teamMember.status || 'INACTIVE'}
3264
+ </span>
3265
+ </div>
3266
+ ${teamMember.lastSessionDate ? `<div style="font-size: 10px; color: var(--csgo-text-dim); margin-top: 4px;">Last heartbeat: ${formatDate(teamMember.lastSessionDate)}</div>` : ''}
3267
+ </div>
3268
+ `).join('');
3269
+ }
3270
+
3271
+ async function selectHistoryTeamMember(teamMemberId) {
3272
+ selectedHistoryTeamMemberId = teamMemberId;
3273
+ renderHistoryTeamMembers();
3274
+ const container = document.getElementById('history-sessions-list');
3275
+ container.innerHTML = '<div class="history-loading">Loading sessions...</div>';
3276
+ try {
3277
+ const res = await fetch(`/api/team-members/${teamMemberId}/sessions?limit=20`);
3278
+ const data = await res.json();
3279
+ if (data.success && data.sessions.length > 0) {
3280
+ historySessions = data.sessions;
3281
+ renderHistorySessions();
3282
+ } else {
3283
+ container.innerHTML = '<div class="history-empty">No sessions found for this team member</div>';
3284
+ }
3285
+ } catch (err) {
3286
+ console.error('Failed to load sessions:', err);
3287
+ container.innerHTML = '<div class="history-empty">Error loading sessions</div>';
3288
+ }
3289
+ }
3290
+
3291
+ function renderHistorySessions() {
3292
+ const container = document.getElementById('history-sessions-list');
3293
+ container.innerHTML = historySessions.map(session => {
3294
+ const startDate = new Date(session.sessionStart);
3295
+ const endDate = session.sessionEnd ? new Date(session.sessionEnd) : null;
3296
+ const duration = endDate ? Math.round((endDate - startDate) / 1000) : 0;
3297
+ return `
3298
+ <div class="session-card">
3299
+ <div class="session-card-header" onclick="viewSessionDetails('${session.id}')">
3300
+ <div>
3301
+ <div class="session-date">${startDate.toLocaleDateString()}</div>
3302
+ <div class="session-time-range">${startDate.toLocaleTimeString()}${endDate ? ' - ' + endDate.toLocaleTimeString() : ' (ongoing)'}</div>
3303
+ <div class="session-stats">
3304
+ <div class="session-stat">Tasks: <span class="session-stat-value">${session.taskCount}</span></div>
3305
+ <div class="session-stat">Code: <span class="session-stat-value">${session.codeCount}</span></div>
3306
+ <div class="session-stat">Tokens: <span class="session-stat-value">${formatNumber(session.tokensUsed)}</span></div>
3307
+ </div>
3308
+ </div>
3309
+ <span class="session-status ${session.status}">${session.status}</span>
3310
+ </div>
3311
+ </div>
3312
+ `;
3313
+ }).join('');
3314
+ }
3315
+
3316
+ async function viewSessionDetails(sessionId) {
3317
+ document.getElementById('session-detail-modal').classList.remove('hidden');
3318
+ const container = document.getElementById('session-detail-content');
3319
+ container.innerHTML = '<div class="history-loading">Loading session details...</div>';
3320
+ try {
3321
+ const res = await fetch(`/api/team-members/sessions/${sessionId}`);
3322
+ const data = await res.json();
3323
+ if (data.success) {
3324
+ renderSessionDetails(data.session, sessionId);
3325
+ } else {
3326
+ container.innerHTML = '<div class="history-empty">Session not found</div>';
3327
+ }
3328
+ } catch (err) {
3329
+ console.error('Failed to load session details:', err);
3330
+ container.innerHTML = '<div class="history-empty">Error loading session details</div>';
3331
+ }
3332
+ }
3333
+
3334
+ function renderSessionDetails(session, sessionId) {
3335
+ const container = document.getElementById('session-detail-content');
3336
+ const startDate = new Date(session.sessionStart);
3337
+ const endDate = session.sessionEnd ? new Date(session.sessionEnd) : null;
3338
+ const duration = endDate ? Math.round((endDate - startDate) / 1000) : 0;
3339
+
3340
+ let tasksHtml = '';
3341
+ if (session.tasksCompleted && session.tasksCompleted.length > 0) {
3342
+ tasksHtml = `
3343
+ <div class="session-detail-section">
3344
+ <div class="session-detail-title">TASKS (${session.tasksCompleted.length})</div>
3345
+ <div class="task-list">
3346
+ ${session.tasksCompleted.map(task => `
3347
+ <div class="task-item">
3348
+ <div class="task-check ${task.status}">${task.status === 'completed' ? '&#10003;' : task.status === 'failed' ? '&#10007;' : '?'}</div>
3349
+ <span class="task-name">${escapeHtml(task.name || 'Unnamed Task')}</span>
3350
+ <span class="task-status">${task.status}</span>
3351
+ </div>
3352
+ `).join('')}
3353
+ </div>
3354
+ </div>
3355
+ `;
3356
+ }
3357
+
3358
+ let codeIdsHtml = '';
3359
+ if (session.codeSharedIds && session.codeSharedIds.length > 0) {
3360
+ codeIdsHtml = `
3361
+ <div class="session-detail-section">
3362
+ <div class="session-detail-title">SHARED CODE (${session.codeSharedIds.length})</div>
3363
+ <div class="id-list">
3364
+ ${session.codeSharedIds.map(id => `<span class="id-chip">${id.substring(0, 8)}...</span>`).join('')}
3365
+ </div>
3366
+ </div>
3367
+ `;
3368
+ }
3369
+
3370
+ let feedbackIdsHtml = '';
3371
+ if (session.feedbackGivenIds && session.feedbackGivenIds.length > 0) {
3372
+ feedbackIdsHtml = `
3373
+ <div class="session-detail-section">
3374
+ <div class="session-detail-title">FEEDBACK GIVEN (${session.feedbackGivenIds.length})</div>
3375
+ <div class="id-list">
3376
+ ${session.feedbackGivenIds.map(id => `<span class="id-chip">${id.substring(0, 8)}...</span>`).join('')}
3377
+ </div>
3378
+ </div>
3379
+ `;
3380
+ }
3381
+
3382
+ let messagesIdsHtml = '';
3383
+ if (session.messagesSentIds && session.messagesSentIds.length > 0) {
3384
+ messagesIdsHtml = `
3385
+ <div class="session-detail-section">
3386
+ <div class="session-detail-title">MESSAGES SENT (${session.messagesSentIds.length})</div>
3387
+ <div class="id-list">
3388
+ ${session.messagesSentIds.map(id => `<span class="id-chip">${id.substring(0, 8)}...</span>`).join('')}
3389
+ </div>
3390
+ </div>
3391
+ `;
3392
+ }
3393
+
3394
+ container.innerHTML = `
3395
+ <div class="session-detail-section">
3396
+ <div class="session-detail-title">SESSION OVERVIEW</div>
3397
+ <div class="session-info-grid">
3398
+ <div class="session-info-item">
3399
+ <div class="session-info-label">TeamMember</div>
3400
+ <div class="session-info-value">${escapeHtml(session.teamMemberName)}</div>
3401
+ </div>
3402
+ <div class="session-info-item">
3403
+ <div class="session-info-label">Type</div>
3404
+ <div class="session-info-value">${session.teamMemberType}</div>
3405
+ </div>
3406
+ <div class="session-info-item">
3407
+ <div class="session-info-label">Status</div>
3408
+ <div class="session-info-value"><span class="session-status ${session.status}">${session.status}</span></div>
3409
+ </div>
3410
+ <div class="session-info-item">
3411
+ <div class="session-info-label">Duration</div>
3412
+ <div class="session-info-value">${duration}s</div>
3413
+ </div>
3414
+ <div class="session-info-item">
3415
+ <div class="session-info-label">Tokens</div>
3416
+ <div class="session-info-value">${formatNumber(session.tokensUsed)}</div>
3417
+ </div>
3418
+ <div class="session-info-item">
3419
+ <div class="session-info-label">Started</div>
3420
+ <div class="session-info-value" style="font-size: 11px;">${startDate.toLocaleString()}</div>
3421
+ </div>
3422
+ </div>
3423
+ ${session.summary ? `<div style="margin-top: 15px; font-size: 12px; color: var(--csgo-text-dim);">${escapeHtml(session.summary)}</div>` : ''}
3424
+ </div>
3425
+
3426
+ ${tasksHtml}
3427
+ ${codeIdsHtml}
3428
+ ${feedbackIdsHtml}
3429
+ ${messagesIdsHtml}
3430
+
3431
+ <div class="session-detail-section">
3432
+ <div class="session-detail-title">OUTPUT LOGS</div>
3433
+ <div id="session-logs-container" class="session-log-container">
3434
+ <div class="history-loading">Loading logs...</div>
3435
+ </div>
3436
+ <div class="log-pagination">
3437
+ <span class="log-pagination-info" id="log-pagination-info">Loading...</span>
3438
+ <div class="log-pagination-btns">
3439
+ <button class="btn btn-small btn-secondary" onclick="loadPrevLogs('${sessionId}')" id="prev-logs-btn" disabled>Prev</button>
3440
+ <button class="btn btn-small btn-secondary" onclick="loadNextLogs('${sessionId}')" id="next-logs-btn" disabled>Next</button>
3441
+ </div>
3442
+ </div>
3443
+ </div>
3444
+ `;
3445
+
3446
+ currentLogOffset = 0;
3447
+ loadSessionLogs(sessionId);
3448
+ }
3449
+
3450
+ async function loadSessionLogs(sessionId) {
3451
+ const container = document.getElementById('session-logs-container');
3452
+ try {
3453
+ const res = await fetch(`/api/team-members/sessions/${sessionId}/logs?limit=${currentLogLimit}&offset=${currentLogOffset}`);
3454
+ const data = await res.json();
3455
+ if (data.success) {
3456
+ currentSessionLogs = data.logs;
3457
+ totalLogCount = data.totalCount;
3458
+ renderSessionLogs();
3459
+ updateLogPagination(sessionId);
3460
+ } else {
3461
+ container.innerHTML = '<div class="session-log-entry info">No logs available</div>';
3462
+ }
3463
+ } catch (err) {
3464
+ console.error('Failed to load session logs:', err);
3465
+ container.innerHTML = '<div class="session-log-entry error">Error loading logs</div>';
3466
+ }
3467
+ }
3468
+
3469
+ function renderSessionLogs() {
3470
+ const container = document.getElementById('session-logs-container');
3471
+ if (currentSessionLogs.length === 0) {
3472
+ container.innerHTML = '<div class="session-log-entry info">No logs available</div>';
3473
+ return;
3474
+ }
3475
+ container.innerHTML = currentSessionLogs.map(log => `
3476
+ <div class="session-log-entry ${log.level || 'info'}">
3477
+ <span class="session-log-timestamp">${formatTime(log.timestamp)}</span>
3478
+ ${escapeHtml(log.message)}
3479
+ </div>
3480
+ `).join('');
3481
+ }
3482
+
3483
+ function updateLogPagination(sessionId) {
3484
+ const info = document.getElementById('log-pagination-info');
3485
+ const prevBtn = document.getElementById('prev-logs-btn');
3486
+ const nextBtn = document.getElementById('next-logs-btn');
3487
+
3488
+ const start = currentLogOffset + 1;
3489
+ const end = Math.min(currentLogOffset + currentSessionLogs.length, totalLogCount);
3490
+ info.textContent = `Showing ${start}-${end} of ${totalLogCount}`;
3491
+
3492
+ prevBtn.disabled = currentLogOffset === 0;
3493
+ nextBtn.disabled = currentLogOffset + currentLogLimit >= totalLogCount;
3494
+
3495
+ prevBtn.onclick = () => loadPrevLogs(sessionId);
3496
+ nextBtn.onclick = () => loadNextLogs(sessionId);
3497
+ }
3498
+
3499
+ function loadPrevLogs(sessionId) {
3500
+ currentLogOffset = Math.max(0, currentLogOffset - currentLogLimit);
3501
+ loadSessionLogs(sessionId);
3502
+ }
3503
+
3504
+ function loadNextLogs(sessionId) {
3505
+ currentLogOffset += currentLogLimit;
3506
+ loadSessionLogs(sessionId);
3507
+ }
3508
+
3509
+ // ============================================================================
3510
+ // Communicator & Live Status Functions
3511
+ // ============================================================================
3512
+
3513
+ let commMessages = [];
3514
+ let lastHeartbeat = 0;
3515
+ let heartbeatInterval = null;
3516
+
3517
+ function updateCommunicatorPanel() {
3518
+ const noTeamMember = document.getElementById('communicator-no-team-member');
3519
+ const panel = document.getElementById('communicator-panel');
3520
+ if (selectedTeamMemberId) {
3521
+ noTeamMember.classList.add('hidden');
3522
+ panel.classList.remove('hidden');
3523
+ const teamMember = team members.get(selectedTeamMemberId);
3524
+ if (teamMember) {
3525
+ document.getElementById('live-team-member-name').textContent = team member.name;
3526
+ updateLiveStatus(teamMember);
3527
+ updateHeartbeat(teamMember.status === 'running');
3528
+ }
3529
+ } else {
3530
+ noTeamMember.classList.remove('hidden');
3531
+ panel.classList.add('hidden');
3532
+ }
3533
+ }
3534
+
3535
+ function updateLiveStatus(teamMember) {
3536
+ const task = team member.currentTask;
3537
+ document.getElementById('live-task').textContent = task ? task.name : 'Idle';
3538
+ document.getElementById('live-task-progress').style.width = task ? task.progress + '%' : '0%';
3539
+
3540
+ const tokensUsed = team member.tokensUsed || 0;
3541
+ const tokensLimit = team member.tokensLimit || 20000;
3542
+ document.getElementById('live-tokens').textContent = formatNumber(tokensUsed);
3543
+ document.getElementById('live-tokens-progress').style.width = Math.min((tokensUsed / tokensLimit) * 100, 100) + '%';
3544
+
3545
+ const cached = teamMemberLimitsCache.get(teamMember.id);
3546
+ if (cached) {
3547
+ const memUsed = cached.limits.memory_used || 0;
3548
+ const memLimit = cached.limits.memory_limit || 50 * 1024 * 1024;
3549
+ document.getElementById('live-memory').textContent = (memUsed / (1024 * 1024)).toFixed(1) + ' MB';
3550
+ document.getElementById('live-memory-progress').style.width = Math.min((memUsed / memLimit) * 100, 100) + '%';
3551
+
3552
+ const filesUsed = cached.limits.files_processed || 0;
3553
+ const filesLimit = cached.limits.files_limit || 1000;
3554
+ document.getElementById('live-files').textContent = formatNumber(filesUsed);
3555
+ document.getElementById('live-files-progress').style.width = Math.min((filesUsed / filesLimit) * 100, 100) + '%';
3556
+ }
3557
+ }
3558
+
3559
+ function updateHeartbeat(isAlive) {
3560
+ const dot = document.getElementById('heartbeat-indicator');
3561
+ if (isAlive) {
3562
+ dot.classList.remove('dead');
3563
+ dot.classList.add('alive');
3564
+ lastHeartbeat = Date.now();
3565
+ } else {
3566
+ dot.classList.remove('alive');
3567
+ dot.classList.add('dead');
3568
+ }
3569
+ }
3570
+
3571
+ function addCommMessage(type, content, from = 'System') {
3572
+ const chat = document.getElementById('communicator-chat');
3573
+ const msg = document.createElement('div');
3574
+ msg.className = 'comm-message ' + type;
3575
+ msg.innerHTML = `
3576
+ <div class="comm-message-header">
3577
+ <span class="comm-message-from">${escapeHtml(from)}</span>
3578
+ <span class="comm-message-time">${formatTime(new Date())}</span>
3579
+ </div>
3580
+ <div class="comm-message-content">${escapeHtml(content)}</div>
3581
+ `;
3582
+ chat.appendChild(msg);
3583
+ chat.scrollTop = chat.scrollHeight;
3584
+ commMessages.push({ type, content, from, time: new Date() });
3585
+ if (commMessages.length > 100) commMessages.shift();
3586
+ }
3587
+
3588
+ async function sendTeamMemberCommand() {
3589
+ if (!selectedTeamMemberId) {
3590
+ addCommMessage('error', 'No team member selected');
3591
+ return;
3592
+ }
3593
+ const cmdType = document.getElementById('comm-command-type').value;
3594
+ const input = document.getElementById('comm-input');
3595
+ const content = input.value.trim();
3596
+ if (!content && cmdType !== 'query' && cmdType !== 'stop') {
3597
+ addCommMessage('error', 'Please enter a command or message');
3598
+ return;
3599
+ }
3600
+
3601
+ let command = {};
3602
+ switch (cmdType) {
3603
+ case 'message':
3604
+ command = { type: 'message', content };
3605
+ break;
3606
+ case 'task':
3607
+ command = { type: 'task', name: content, priority: 'normal' };
3608
+ break;
3609
+ case 'query':
3610
+ command = { type: 'query', what: content || 'status' };
3611
+ break;
3612
+ case 'stop':
3613
+ command = { type: 'stop', reason: content || 'User requested stop' };
3614
+ break;
3615
+ case 'custom':
3616
+ try {
3617
+ command = JSON.parse(content);
3618
+ } catch (e) {
3619
+ addCommMessage('error', 'Invalid JSON: ' + e.message);
3620
+ return;
3621
+ }
3622
+ break;
3623
+ }
3624
+
3625
+ addCommMessage('sent', JSON.stringify(command), 'You');
3626
+ input.value = '';
3627
+
3628
+ try {
3629
+ const res = await fetch(`/api/team-members/${selectedTeamMemberId}/command`, {
3630
+ method: 'POST',
3631
+ headers: { 'Content-Type': 'application/json' },
3632
+ body: JSON.stringify({ command })
3633
+ });
3634
+ const data = await res.json();
3635
+ if (data.success) {
3636
+ if (data.response) {
3637
+ addCommMessage('received', JSON.stringify(data.response), team members.get(selectedTeamMemberId)?.name || 'Team Member');
3638
+ } else {
3639
+ addCommMessage('system', 'Command sent successfully');
3640
+ }
3641
+ } else {
3642
+ addCommMessage('error', 'Failed: ' + (data.error || 'Unknown error'));
3643
+ }
3644
+ } catch (err) {
3645
+ addCommMessage('error', 'Error: ' + err.message);
3646
+ }
3647
+ }
3648
+
3649
+ // Override selectTeamMember to update communicator
3650
+ const originalSelectTeamMember = selectTeamMember;
3651
+ selectTeamMember = function(id) {
3652
+ originalSelectTeamMember(id);
3653
+ updateCommunicatorPanel();
3654
+ };
3655
+
3656
+ // Handle communicator tab switch
3657
+ const origTabHandler = document.querySelectorAll('.tab-btn')[0].onclick;
3658
+ document.querySelectorAll('.tab-btn').forEach(btn => {
3659
+ btn.addEventListener('click', () => {
3660
+ if (btn.dataset.tab === 'communicator') {
3661
+ updateCommunicatorPanel();
3662
+ }
3663
+ });
3664
+ });
3665
+
3666
+ // Listen for Enter key in communicator input
3667
+ document.getElementById('comm-input')?.addEventListener('keypress', (e) => {
3668
+ if (e.key === 'Enter') sendTeamMemberCommand();
3669
+ });
3670
+
3671
+ // Handle WebSocket messages for live updates
3672
+ const origWSHandler = handleWSMessage;
3673
+ handleWSMessage = function(data) {
3674
+ origWSHandler(data);
3675
+ if (data.type === 'team member:status' && data.team-member?.id === selectedTeamMemberId) {
3676
+ updateLiveStatus(data.team-member);
3677
+ updateHeartbeat(data.team-member.status === 'running');
3678
+ }
3679
+ if (data.type === 'team member:tokens' && data.teamMemberId === selectedTeamMemberId) {
3680
+ const teamMember = team members.get(selectedTeamMemberId);
3681
+ if (teamMember) updateLiveStatus(teamMember);
3682
+ }
3683
+ if (data.type === 'team member:task' && data.teamMemberId === selectedTeamMemberId) {
3684
+ const teamMember = team members.get(selectedTeamMemberId);
3685
+ if (teamMember) updateLiveStatus(teamMember);
3686
+ }
3687
+ if (data.type === 'team member:response' && data.teamMemberId === selectedTeamMemberId) {
3688
+ addCommMessage('received', JSON.stringify(data.response), team members.get(selectedTeamMemberId)?.name || 'Team Member');
3689
+ }
3690
+ if (data.type === 'team member:heartbeat' && data.teamMemberId === selectedTeamMemberId) {
3691
+ updateHeartbeat(true);
3692
+ }
3693
+ };
3694
+
3695
+ // Periodic heartbeat check
3696
+ setInterval(() => {
3697
+ if (selectedTeamMemberId && Date.now() - lastHeartbeat > 10000) {
3698
+ const teamMember = team members.get(selectedTeamMemberId);
3699
+ if (team member && teamMember.status === 'running') {
3700
+ updateHeartbeat(false);
3701
+ }
3702
+ }
3703
+ }, 5000);
3704
+
3705
+ // ============================================================================
3706
+ // INITIALIZATION - Authenticate first, then start everything
3707
+ // ============================================================================
3708
+ async function initDashboard() {
3709
+ console.log('SPECMEM: Initializing Team Member Dashboard...');
3710
+
3711
+ // Step 1: Authenticate
3712
+ const authenticated = await authenticate();
3713
+ if (!authenticated) {
3714
+ console.error('SPECMEM: Authentication failed - some features may not work');
3715
+ // Continue anyway, some endpoints might work without auth
3716
+ }
3717
+
3718
+ // Step 2: Connect WebSocket for real-time updates
3719
+ connectWebSocket();
3720
+
3721
+ // Step 3: Load initial data
3722
+ await loadTeamMembers();
3723
+ await loadAllMessages();
3724
+
3725
+ // Step 4: Set up auto-refresh every 5 seconds for active team members
3726
+ autoRefreshInterval = setInterval(async () => {
3727
+ await loadTeamMembers();
3728
+ updateStats();
3729
+ }, 5000);
3730
+
3731
+ // Also refresh messages periodically (every 10 seconds)
3732
+ setInterval(loadAllMessages, 10000);
3733
+
3734
+ // Load collab stats periodically
3735
+ setInterval(loadCollabStats, 60000);
3736
+
3737
+ console.log('SPECMEM: Team Member Dashboard initialized!');
3738
+ }
3739
+
3740
+ // Start the dashboard when page loads
3741
+ initDashboard();
3742
+ </script>
3743
+
3744
+ <!-- Language Selector Component -->
3745
+ <script src="/shared-language-selector.js"></script>
3746
+ <script>
3747
+ // Initialize language selector
3748
+ const langSelector = new SpecMemLanguageSelector({
3749
+ containerId: 'language-selector-container',
3750
+ onLanguageChange: (langCode, langInfo) => {
3751
+ console.log('Language changed to:', langCode, langInfo.name);
3752
+ }
3753
+ });
3754
+ </script>
3755
+ </body>
3756
+ </html>