nitrostack 1.0.72 → 1.0.74

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 (370) hide show
  1. package/dist/auth/__tests__/api-key.test.d.ts +2 -0
  2. package/dist/auth/__tests__/api-key.test.d.ts.map +1 -0
  3. package/dist/auth/__tests__/api-key.test.js +136 -0
  4. package/dist/auth/__tests__/api-key.test.js.map +1 -0
  5. package/dist/auth/__tests__/middleware.test.d.ts +2 -0
  6. package/dist/auth/__tests__/middleware.test.d.ts.map +1 -0
  7. package/dist/auth/__tests__/middleware.test.js +186 -0
  8. package/dist/auth/__tests__/middleware.test.js.map +1 -0
  9. package/dist/auth/__tests__/pkce.test.d.ts +2 -0
  10. package/dist/auth/__tests__/pkce.test.d.ts.map +1 -0
  11. package/dist/auth/__tests__/pkce.test.js +61 -0
  12. package/dist/auth/__tests__/pkce.test.js.map +1 -0
  13. package/dist/auth/__tests__/secure-secret.test.d.ts +2 -0
  14. package/dist/auth/__tests__/secure-secret.test.d.ts.map +1 -0
  15. package/dist/auth/__tests__/secure-secret.test.js +42 -0
  16. package/dist/auth/__tests__/secure-secret.test.js.map +1 -0
  17. package/dist/auth/__tests__/simple-jwt.test.d.ts +2 -0
  18. package/dist/auth/__tests__/simple-jwt.test.d.ts.map +1 -0
  19. package/dist/auth/__tests__/simple-jwt.test.js +68 -0
  20. package/dist/auth/__tests__/simple-jwt.test.js.map +1 -0
  21. package/dist/auth/__tests__/token-store.test.d.ts +2 -0
  22. package/dist/auth/__tests__/token-store.test.d.ts.map +1 -0
  23. package/dist/auth/__tests__/token-store.test.js +79 -0
  24. package/dist/auth/__tests__/token-store.test.js.map +1 -0
  25. package/dist/auth/__tests__/token-validation.test.d.ts +2 -0
  26. package/dist/auth/__tests__/token-validation.test.d.ts.map +1 -0
  27. package/dist/auth/__tests__/token-validation.test.js +23 -0
  28. package/dist/auth/__tests__/token-validation.test.js.map +1 -0
  29. package/dist/auth/api-key.js.map +1 -1
  30. package/dist/auth/client.js.map +1 -1
  31. package/dist/auth/index.d.ts +2 -1
  32. package/dist/auth/index.d.ts.map +1 -1
  33. package/dist/auth/index.js +3 -0
  34. package/dist/auth/index.js.map +1 -1
  35. package/dist/auth/middleware.d.ts +1 -1
  36. package/dist/auth/middleware.d.ts.map +1 -1
  37. package/dist/auth/middleware.js.map +1 -1
  38. package/dist/auth/secure-secret.d.ts +136 -0
  39. package/dist/auth/secure-secret.d.ts.map +1 -0
  40. package/dist/auth/secure-secret.js +182 -0
  41. package/dist/auth/secure-secret.js.map +1 -0
  42. package/dist/auth/server-metadata.d.ts.map +1 -1
  43. package/dist/auth/server-metadata.js.map +1 -1
  44. package/dist/auth/simple-jwt.d.ts +100 -14
  45. package/dist/auth/simple-jwt.d.ts.map +1 -1
  46. package/dist/auth/simple-jwt.js +19 -9
  47. package/dist/auth/simple-jwt.js.map +1 -1
  48. package/dist/auth/token-store.js +1 -1
  49. package/dist/auth/token-store.js.map +1 -1
  50. package/dist/auth/token-validation.js +1 -1
  51. package/dist/auth/token-validation.js.map +1 -1
  52. package/dist/cli/__tests__/cli-dev.test.d.ts +2 -0
  53. package/dist/cli/__tests__/cli-dev.test.d.ts.map +1 -0
  54. package/dist/cli/__tests__/cli-dev.test.js +83 -0
  55. package/dist/cli/__tests__/cli-dev.test.js.map +1 -0
  56. package/dist/cli/__tests__/cli-start.test.d.ts +2 -0
  57. package/dist/cli/__tests__/cli-start.test.d.ts.map +1 -0
  58. package/dist/cli/__tests__/cli-start.test.js +61 -0
  59. package/dist/cli/__tests__/cli-start.test.js.map +1 -0
  60. package/dist/cli/__tests__/cli.test.d.ts +2 -0
  61. package/dist/cli/__tests__/cli.test.d.ts.map +1 -0
  62. package/dist/cli/__tests__/cli.test.js +73 -0
  63. package/dist/cli/__tests__/cli.test.js.map +1 -0
  64. package/dist/cli/__tests__/commands.test.d.ts +2 -0
  65. package/dist/cli/__tests__/commands.test.d.ts.map +1 -0
  66. package/dist/cli/__tests__/commands.test.js +64 -0
  67. package/dist/cli/__tests__/commands.test.js.map +1 -0
  68. package/dist/cli/commands/build.js +1 -1
  69. package/dist/cli/commands/build.js.map +1 -1
  70. package/dist/cli/commands/generate-types.js +12 -12
  71. package/dist/cli/commands/generate-types.js.map +1 -1
  72. package/dist/cli/commands/generate.d.ts +8 -1
  73. package/dist/cli/commands/generate.d.ts.map +1 -1
  74. package/dist/cli/commands/generate.js +13 -12
  75. package/dist/cli/commands/generate.js.map +1 -1
  76. package/dist/cli/commands/init.js +1 -1
  77. package/dist/cli/commands/init.js.map +1 -1
  78. package/dist/cli/commands/upgrade.d.ts +10 -0
  79. package/dist/cli/commands/upgrade.d.ts.map +1 -0
  80. package/dist/cli/commands/upgrade.js +221 -0
  81. package/dist/cli/commands/upgrade.js.map +1 -0
  82. package/dist/cli/index.d.ts +2 -1
  83. package/dist/cli/index.d.ts.map +1 -1
  84. package/dist/cli/index.js +69 -39
  85. package/dist/cli/index.js.map +1 -1
  86. package/dist/core/__tests__/core-modules.test.d.ts +2 -0
  87. package/dist/core/__tests__/core-modules.test.d.ts.map +1 -0
  88. package/dist/core/__tests__/core-modules.test.js +36 -0
  89. package/dist/core/__tests__/core-modules.test.js.map +1 -0
  90. package/dist/core/__tests__/models.test.d.ts +2 -0
  91. package/dist/core/__tests__/models.test.d.ts.map +1 -0
  92. package/dist/core/__tests__/models.test.js +142 -0
  93. package/dist/core/__tests__/models.test.js.map +1 -0
  94. package/dist/core/__tests__/module.test.d.ts +2 -0
  95. package/dist/core/__tests__/module.test.d.ts.map +1 -0
  96. package/dist/core/__tests__/module.test.js +60 -0
  97. package/dist/core/__tests__/module.test.js.map +1 -0
  98. package/dist/core/__tests__/server.test.d.ts +2 -0
  99. package/dist/core/__tests__/server.test.d.ts.map +1 -0
  100. package/dist/core/__tests__/server.test.js +120 -0
  101. package/dist/core/__tests__/server.test.js.map +1 -0
  102. package/dist/core/__tests__/transports.test.d.ts +2 -0
  103. package/dist/core/__tests__/transports.test.d.ts.map +1 -0
  104. package/dist/core/__tests__/transports.test.js +12 -0
  105. package/dist/core/__tests__/transports.test.js.map +1 -0
  106. package/dist/core/app-decorator.d.ts +4 -3
  107. package/dist/core/app-decorator.d.ts.map +1 -1
  108. package/dist/core/app-decorator.js +67 -28
  109. package/dist/core/app-decorator.js.map +1 -1
  110. package/dist/core/builders.d.ts +19 -7
  111. package/dist/core/builders.d.ts.map +1 -1
  112. package/dist/core/builders.js +15 -8
  113. package/dist/core/builders.js.map +1 -1
  114. package/dist/core/component.d.ts +8 -8
  115. package/dist/core/component.d.ts.map +1 -1
  116. package/dist/core/component.js +3 -2
  117. package/dist/core/component.js.map +1 -1
  118. package/dist/core/config-module.d.ts +11 -4
  119. package/dist/core/config-module.d.ts.map +1 -1
  120. package/dist/core/config-module.js +1 -1
  121. package/dist/core/config-module.js.map +1 -1
  122. package/dist/core/decorators/__tests__/decorators.test.d.ts +2 -0
  123. package/dist/core/decorators/__tests__/decorators.test.d.ts.map +1 -0
  124. package/dist/core/decorators/__tests__/decorators.test.js +103 -0
  125. package/dist/core/decorators/__tests__/decorators.test.js.map +1 -0
  126. package/dist/core/decorators/__tests__/extended-decorators.test.d.ts +2 -0
  127. package/dist/core/decorators/__tests__/extended-decorators.test.d.ts.map +1 -0
  128. package/dist/core/decorators/__tests__/extended-decorators.test.js +194 -0
  129. package/dist/core/decorators/__tests__/extended-decorators.test.js.map +1 -0
  130. package/dist/core/decorators/cache.decorator.d.ts +9 -9
  131. package/dist/core/decorators/cache.decorator.d.ts.map +1 -1
  132. package/dist/core/decorators/cache.decorator.js +3 -3
  133. package/dist/core/decorators/cache.decorator.js.map +1 -1
  134. package/dist/core/decorators/health-check.decorator.d.ts +3 -3
  135. package/dist/core/decorators/health-check.decorator.d.ts.map +1 -1
  136. package/dist/core/decorators/health-check.decorator.js +2 -2
  137. package/dist/core/decorators/health-check.decorator.js.map +1 -1
  138. package/dist/core/decorators/rate-limit.decorator.d.ts +5 -4
  139. package/dist/core/decorators/rate-limit.decorator.d.ts.map +1 -1
  140. package/dist/core/decorators/rate-limit.decorator.js +3 -3
  141. package/dist/core/decorators/rate-limit.decorator.js.map +1 -1
  142. package/dist/core/decorators.d.ts +47 -29
  143. package/dist/core/decorators.d.ts.map +1 -1
  144. package/dist/core/decorators.js +9 -9
  145. package/dist/core/decorators.js.map +1 -1
  146. package/dist/core/di/__tests__/container.test.d.ts +2 -0
  147. package/dist/core/di/__tests__/container.test.d.ts.map +1 -0
  148. package/dist/core/di/__tests__/container.test.js +88 -0
  149. package/dist/core/di/__tests__/container.test.js.map +1 -0
  150. package/dist/core/di/container.d.ts +21 -4
  151. package/dist/core/di/container.d.ts.map +1 -1
  152. package/dist/core/di/container.js +11 -7
  153. package/dist/core/di/container.js.map +1 -1
  154. package/dist/core/di/injectable.decorator.d.ts +5 -3
  155. package/dist/core/di/injectable.decorator.d.ts.map +1 -1
  156. package/dist/core/di/injectable.decorator.js.map +1 -1
  157. package/dist/core/errors.d.ts +4 -4
  158. package/dist/core/errors.d.ts.map +1 -1
  159. package/dist/core/errors.js.map +1 -1
  160. package/dist/core/events/__tests__/events.test.d.ts +2 -0
  161. package/dist/core/events/__tests__/events.test.d.ts.map +1 -0
  162. package/dist/core/events/__tests__/events.test.js +177 -0
  163. package/dist/core/events/__tests__/events.test.js.map +1 -0
  164. package/dist/core/events/event-emitter.d.ts +3 -3
  165. package/dist/core/events/event-emitter.d.ts.map +1 -1
  166. package/dist/core/events/event-emitter.js.map +1 -1
  167. package/dist/core/events/event.decorator.d.ts +5 -5
  168. package/dist/core/events/event.decorator.d.ts.map +1 -1
  169. package/dist/core/events/event.decorator.js +10 -6
  170. package/dist/core/events/event.decorator.js.map +1 -1
  171. package/dist/core/events/log-emitter.d.ts +7 -1
  172. package/dist/core/events/log-emitter.d.ts.map +1 -1
  173. package/dist/core/events/log-emitter.js.map +1 -1
  174. package/dist/core/filters/__tests__/filters.test.d.ts +2 -0
  175. package/dist/core/filters/__tests__/filters.test.d.ts.map +1 -0
  176. package/dist/core/filters/__tests__/filters.test.js +72 -0
  177. package/dist/core/filters/__tests__/filters.test.js.map +1 -0
  178. package/dist/core/filters/exception-filter.decorator.d.ts +5 -5
  179. package/dist/core/filters/exception-filter.decorator.d.ts.map +1 -1
  180. package/dist/core/filters/exception-filter.decorator.js +3 -3
  181. package/dist/core/filters/exception-filter.decorator.js.map +1 -1
  182. package/dist/core/filters/exception-filter.interface.d.ts +14 -5
  183. package/dist/core/filters/exception-filter.interface.d.ts.map +1 -1
  184. package/dist/core/guards/__tests__/guards.test.d.ts +2 -0
  185. package/dist/core/guards/__tests__/guards.test.d.ts.map +1 -0
  186. package/dist/core/guards/__tests__/guards.test.js +55 -0
  187. package/dist/core/guards/__tests__/guards.test.js.map +1 -0
  188. package/dist/core/guards/apikey.guard.d.ts +1 -1
  189. package/dist/core/guards/apikey.guard.d.ts.map +1 -1
  190. package/dist/core/guards/guard.interface.d.ts +1 -1
  191. package/dist/core/guards/guard.interface.d.ts.map +1 -1
  192. package/dist/core/guards/jwt.guard.d.ts +1 -1
  193. package/dist/core/guards/jwt.guard.d.ts.map +1 -1
  194. package/dist/core/guards/oauth.guard.d.ts +1 -1
  195. package/dist/core/guards/oauth.guard.d.ts.map +1 -1
  196. package/dist/core/guards/use-guards.decorator.d.ts +3 -3
  197. package/dist/core/guards/use-guards.decorator.d.ts.map +1 -1
  198. package/dist/core/guards/use-guards.decorator.js +1 -1
  199. package/dist/core/guards/use-guards.decorator.js.map +1 -1
  200. package/dist/core/health/__tests__/health.test.d.ts +2 -0
  201. package/dist/core/health/__tests__/health.test.d.ts.map +1 -0
  202. package/dist/core/health/__tests__/health.test.js +31 -0
  203. package/dist/core/health/__tests__/health.test.js.map +1 -0
  204. package/dist/core/index.d.ts +2 -2
  205. package/dist/core/index.d.ts.map +1 -1
  206. package/dist/core/index.js.map +1 -1
  207. package/dist/core/interceptors/__tests__/interceptors.test.d.ts +2 -0
  208. package/dist/core/interceptors/__tests__/interceptors.test.d.ts.map +1 -0
  209. package/dist/core/interceptors/__tests__/interceptors.test.js +52 -0
  210. package/dist/core/interceptors/__tests__/interceptors.test.js.map +1 -0
  211. package/dist/core/interceptors/interceptor.decorator.d.ts +4 -4
  212. package/dist/core/interceptors/interceptor.decorator.d.ts.map +1 -1
  213. package/dist/core/interceptors/interceptor.decorator.js +2 -2
  214. package/dist/core/interceptors/interceptor.decorator.js.map +1 -1
  215. package/dist/core/interceptors/interceptor.interface.d.ts +3 -3
  216. package/dist/core/interceptors/interceptor.interface.d.ts.map +1 -1
  217. package/dist/core/logger.d.ts.map +1 -1
  218. package/dist/core/logger.js.map +1 -1
  219. package/dist/core/middleware/__tests__/middleware.test.d.ts +2 -0
  220. package/dist/core/middleware/__tests__/middleware.test.d.ts.map +1 -0
  221. package/dist/core/middleware/__tests__/middleware.test.js +105 -0
  222. package/dist/core/middleware/__tests__/middleware.test.js.map +1 -0
  223. package/dist/core/middleware/middleware.decorator.d.ts +4 -4
  224. package/dist/core/middleware/middleware.decorator.d.ts.map +1 -1
  225. package/dist/core/middleware/middleware.decorator.js +2 -2
  226. package/dist/core/middleware/middleware.decorator.js.map +1 -1
  227. package/dist/core/middleware/middleware.interface.d.ts +3 -3
  228. package/dist/core/middleware/middleware.interface.d.ts.map +1 -1
  229. package/dist/core/module.d.ts +33 -14
  230. package/dist/core/module.d.ts.map +1 -1
  231. package/dist/core/module.js +11 -6
  232. package/dist/core/module.js.map +1 -1
  233. package/dist/core/oauth-module.d.ts +9 -3
  234. package/dist/core/oauth-module.d.ts.map +1 -1
  235. package/dist/core/oauth-module.js +4 -3
  236. package/dist/core/oauth-module.js.map +1 -1
  237. package/dist/core/pipes/__tests__/pipes.test.d.ts +2 -0
  238. package/dist/core/pipes/__tests__/pipes.test.d.ts.map +1 -0
  239. package/dist/core/pipes/__tests__/pipes.test.js +52 -0
  240. package/dist/core/pipes/__tests__/pipes.test.js.map +1 -0
  241. package/dist/core/pipes/pipe.decorator.d.ts +14 -5
  242. package/dist/core/pipes/pipe.decorator.d.ts.map +1 -1
  243. package/dist/core/pipes/pipe.decorator.js +2 -2
  244. package/dist/core/pipes/pipe.decorator.js.map +1 -1
  245. package/dist/core/pipes/pipe.interface.d.ts +9 -4
  246. package/dist/core/pipes/pipe.interface.d.ts.map +1 -1
  247. package/dist/core/prompt.d.ts +13 -4
  248. package/dist/core/prompt.d.ts.map +1 -1
  249. package/dist/core/prompt.js +2 -2
  250. package/dist/core/prompt.js.map +1 -1
  251. package/dist/core/resource.d.ts +7 -2
  252. package/dist/core/resource.d.ts.map +1 -1
  253. package/dist/core/resource.js +2 -2
  254. package/dist/core/resource.js.map +1 -1
  255. package/dist/core/server.d.ts +49 -3
  256. package/dist/core/server.d.ts.map +1 -1
  257. package/dist/core/server.js +61 -34
  258. package/dist/core/server.js.map +1 -1
  259. package/dist/core/tool.d.ts +44 -16
  260. package/dist/core/tool.d.ts.map +1 -1
  261. package/dist/core/tool.js +19 -6
  262. package/dist/core/tool.js.map +1 -1
  263. package/dist/core/transports/__tests__/transports.test.d.ts +2 -0
  264. package/dist/core/transports/__tests__/transports.test.d.ts.map +1 -0
  265. package/dist/core/transports/__tests__/transports.test.js +249 -0
  266. package/dist/core/transports/__tests__/transports.test.js.map +1 -0
  267. package/dist/core/transports/discovery-http-server.d.ts +7 -1
  268. package/dist/core/transports/discovery-http-server.d.ts.map +1 -1
  269. package/dist/core/transports/discovery-http-server.js.map +1 -1
  270. package/dist/core/transports/http-server.d.ts +2 -2
  271. package/dist/core/transports/http-server.d.ts.map +1 -1
  272. package/dist/core/transports/http-server.js +1 -1
  273. package/dist/core/transports/http-server.js.map +1 -1
  274. package/dist/core/transports/streamable-http.d.ts +4 -4
  275. package/dist/core/transports/streamable-http.d.ts.map +1 -1
  276. package/dist/core/transports/streamable-http.js +1 -1
  277. package/dist/core/transports/streamable-http.js.map +1 -1
  278. package/dist/core/types.d.ts +87 -15
  279. package/dist/core/types.d.ts.map +1 -1
  280. package/dist/core/widgets/__tests__/registry.test.d.ts +2 -0
  281. package/dist/core/widgets/__tests__/registry.test.d.ts.map +1 -0
  282. package/dist/core/widgets/__tests__/registry.test.js +69 -0
  283. package/dist/core/widgets/__tests__/registry.test.js.map +1 -0
  284. package/dist/core/widgets/widget-registry.d.ts +2 -2
  285. package/dist/core/widgets/widget-registry.d.ts.map +1 -1
  286. package/dist/core/widgets/widget-registry.js +1 -1
  287. package/dist/core/widgets/widget-registry.js.map +1 -1
  288. package/dist/testing/__tests__/testing.test.d.ts +2 -0
  289. package/dist/testing/__tests__/testing.test.d.ts.map +1 -0
  290. package/dist/testing/__tests__/testing.test.js +167 -0
  291. package/dist/testing/__tests__/testing.test.js.map +1 -0
  292. package/dist/testing/index.d.ts +40 -19
  293. package/dist/testing/index.d.ts.map +1 -1
  294. package/dist/testing/index.js +5 -8
  295. package/dist/testing/index.js.map +1 -1
  296. package/dist/ui-next/__tests__/ui-next.test.d.ts +2 -0
  297. package/dist/ui-next/__tests__/ui-next.test.d.ts.map +1 -0
  298. package/dist/ui-next/__tests__/ui-next.test.js +74 -0
  299. package/dist/ui-next/__tests__/ui-next.test.js.map +1 -0
  300. package/dist/ui-next/index.d.ts +1 -1
  301. package/dist/ui-next/index.d.ts.map +1 -1
  302. package/dist/ui-next/index.js.map +1 -1
  303. package/dist/widgets/__tests__/utils.test.d.ts +2 -0
  304. package/dist/widgets/__tests__/utils.test.d.ts.map +1 -0
  305. package/dist/widgets/__tests__/utils.test.js +80 -0
  306. package/dist/widgets/__tests__/utils.test.js.map +1 -0
  307. package/dist/widgets/__tests__/widgets.test.d.ts +2 -0
  308. package/dist/widgets/__tests__/widgets.test.d.ts.map +1 -0
  309. package/dist/widgets/__tests__/widgets.test.js +245 -0
  310. package/dist/widgets/__tests__/widgets.test.js.map +1 -0
  311. package/dist/widgets/hooks/useWidgetSDK.d.ts +5 -5
  312. package/dist/widgets/runtime/WidgetLayout.js.map +1 -1
  313. package/dist/widgets/sdk.d.ts +5 -5
  314. package/dist/widgets/sdk.d.ts.map +1 -1
  315. package/dist/widgets/sdk.js.map +1 -1
  316. package/package.json +1 -1
  317. package/src/studio/app/api/auth/fetch-metadata/route.ts +3 -2
  318. package/src/studio/app/api/auth/register-client/route.ts +3 -2
  319. package/src/studio/app/api/chat/route.ts +31 -17
  320. package/src/studio/app/api/health/checks/route.ts +5 -4
  321. package/src/studio/app/api/init/route.ts +3 -2
  322. package/src/studio/app/api/ping/route.ts +3 -2
  323. package/src/studio/app/api/prompts/[name]/route.ts +4 -3
  324. package/src/studio/app/api/prompts/route.ts +3 -2
  325. package/src/studio/app/api/resources/[...uri]/route.ts +3 -2
  326. package/src/studio/app/api/resources/route.ts +3 -2
  327. package/src/studio/app/api/roots/route.ts +3 -2
  328. package/src/studio/app/api/sampling/route.ts +3 -2
  329. package/src/studio/app/api/tools/[name]/call/route.ts +3 -2
  330. package/src/studio/app/api/tools/route.ts +4 -3
  331. package/src/studio/app/api/widget-examples/route.ts +5 -4
  332. package/src/studio/app/auth/callback/page.tsx +3 -2
  333. package/src/studio/app/chat/page.tsx +481 -105
  334. package/src/studio/app/health/page.tsx +1 -1
  335. package/src/studio/app/logs/page.tsx +2 -2
  336. package/src/studio/app/page.tsx +5 -5
  337. package/src/studio/app/prompts/page.tsx +2 -2
  338. package/src/studio/app/settings/page.tsx +3 -2
  339. package/src/studio/app/tools/page.tsx +3 -3
  340. package/src/studio/components/LogMessage.tsx +1 -1
  341. package/src/studio/components/MarkdownRenderer.tsx +245 -348
  342. package/src/studio/components/Sidebar.tsx +18 -3
  343. package/src/studio/components/VoiceOrbOverlay.tsx +12 -6
  344. package/src/studio/components/WidgetErrorBoundary.tsx +49 -0
  345. package/src/studio/components/WidgetRenderer.tsx +168 -215
  346. package/src/studio/components/ops/OpsCanvas.tsx +748 -0
  347. package/src/studio/components/ops/OpsNodeDetailPanel.tsx +150 -0
  348. package/src/studio/components/ops/OpsSummaryBar.tsx +90 -0
  349. package/src/studio/components/ops/index.ts +6 -0
  350. package/src/studio/components/ops/nodes/BaseNode.tsx +65 -0
  351. package/src/studio/components/ops/nodes/LLMCallNode.tsx +34 -0
  352. package/src/studio/components/ops/nodes/LLMResponseNode.tsx +33 -0
  353. package/src/studio/components/ops/nodes/ToolCallNode.tsx +30 -0
  354. package/src/studio/components/ops/nodes/ToolResultNode.tsx +43 -0
  355. package/src/studio/components/ops/nodes/UserPromptNode.tsx +34 -0
  356. package/src/studio/components/ops/nodes/WidgetRenderNode.tsx +23 -0
  357. package/src/studio/components/ops/nodes/index.ts +9 -0
  358. package/src/studio/components/tools/ToolsCanvas.tsx +2 -2
  359. package/src/studio/lib/api.ts +61 -42
  360. package/src/studio/lib/http-client-transport.ts +2 -2
  361. package/src/studio/lib/llm-service.ts +126 -47
  362. package/src/studio/lib/mcp-client.ts +9 -6
  363. package/src/studio/lib/ops-store.ts +427 -0
  364. package/src/studio/lib/ops-tracker.ts +416 -0
  365. package/src/studio/lib/ops-types.ts +164 -0
  366. package/src/studio/lib/store.ts +8 -11
  367. package/src/studio/lib/types.ts +228 -38
  368. package/src/studio/lib/widget-loader.ts +2 -2
  369. package/templates/typescript-oauth/src/modules/flights/flights.prompts.ts +19 -22
  370. package/dist/cli/build-widgets.mjs +0 -165
@@ -0,0 +1,427 @@
1
+ /**
2
+ * Ops Store - Zustand store for Agent Operations Visualization
3
+ */
4
+
5
+ import { create } from 'zustand';
6
+ import type {
7
+ OpsNode,
8
+ OpsEdge,
9
+ OpsSession,
10
+ OpsSessionSummary,
11
+ OpsNodeType,
12
+ OpsNodeData,
13
+ OpsTurn,
14
+ LLMProvider,
15
+ } from './ops-types';
16
+
17
+ interface OpsState {
18
+ // Current session
19
+ currentSession: OpsSession | null;
20
+
21
+ // Current turn being tracked
22
+ currentTurnId: string | null;
23
+
24
+ // Selected turn for viewing (null = show all)
25
+ selectedTurnId: string | null;
26
+
27
+ // Playback state
28
+ isPlaying: boolean;
29
+ playbackTurnIndex: number;
30
+
31
+ // UI state
32
+ isOpsViewOpen: boolean;
33
+ selectedNodeId: string | null;
34
+
35
+ // History (for replay/comparison)
36
+ sessionHistory: OpsSession[];
37
+
38
+ // Actions
39
+ startSession: () => void;
40
+ endSession: () => void;
41
+ clearSession: () => void;
42
+
43
+ startTurn: (promptPreview: string) => string;
44
+ endTurn: () => void;
45
+
46
+ addNode: (type: OpsNodeType, data: OpsNodeData) => string;
47
+ updateNode: (nodeId: string, updates: Partial<OpsNode>) => void;
48
+ updateNodeData: (nodeId: string, dataUpdates: Partial<OpsNodeData>) => void;
49
+
50
+ addEdge: (source: string, target: string, label?: string) => void;
51
+
52
+ setOpsViewOpen: (open: boolean) => void;
53
+ toggleOpsView: () => void;
54
+ setSelectedNode: (nodeId: string | null) => void;
55
+ setSelectedTurn: (turnId: string | null) => void;
56
+
57
+ // Playback controls
58
+ startPlayback: () => void;
59
+ stopPlayback: () => void;
60
+ nextTurn: () => void;
61
+ prevTurn: () => void;
62
+
63
+ // Computed
64
+ getSummary: () => OpsSessionSummary;
65
+ getNodesForTurn: (turnId: string | null) => OpsNode[];
66
+ getEdgesForTurn: (turnId: string | null) => OpsEdge[];
67
+ }
68
+
69
+ // Generate unique ID
70
+ const generateId = (): string => {
71
+ return `ops_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
72
+ };
73
+
74
+ // Create empty summary
75
+ const createEmptySummary = (): OpsSessionSummary => ({
76
+ totalTokens: 0,
77
+ inputTokens: 0,
78
+ outputTokens: 0,
79
+ estimatedCost: 0,
80
+ totalDuration: 0,
81
+ toolCalls: 0,
82
+ llmCalls: 0,
83
+ widgetRenders: 0,
84
+ errors: 0,
85
+ });
86
+
87
+ export const useOpsStore = create<OpsState>((set, get) => ({
88
+ // Initial state
89
+ currentSession: null,
90
+ currentTurnId: null,
91
+ selectedTurnId: null,
92
+ isPlaying: false,
93
+ playbackTurnIndex: 0,
94
+ isOpsViewOpen: false,
95
+ selectedNodeId: null,
96
+ sessionHistory: [],
97
+
98
+ // Start a new session
99
+ startSession: () => {
100
+ const session: OpsSession = {
101
+ id: generateId(),
102
+ startTime: Date.now(),
103
+ nodes: [],
104
+ edges: [],
105
+ turns: [],
106
+ summary: createEmptySummary(),
107
+ };
108
+ set({ currentSession: session, currentTurnId: null, selectedTurnId: null });
109
+ },
110
+
111
+ // End current session
112
+ endSession: () => {
113
+ const { currentSession, sessionHistory } = get();
114
+ if (currentSession) {
115
+ const endedSession = {
116
+ ...currentSession,
117
+ endTime: Date.now(),
118
+ summary: get().getSummary(),
119
+ };
120
+ set({
121
+ currentSession: null,
122
+ currentTurnId: null,
123
+ sessionHistory: [...sessionHistory, endedSession],
124
+ });
125
+ }
126
+ },
127
+
128
+ // Clear current session
129
+ clearSession: () => {
130
+ set({
131
+ currentSession: null,
132
+ currentTurnId: null,
133
+ selectedTurnId: null,
134
+ selectedNodeId: null,
135
+ isPlaying: false,
136
+ playbackTurnIndex: 0,
137
+ });
138
+ },
139
+
140
+ // Start a new turn/cycle
141
+ startTurn: (promptPreview: string) => {
142
+ const { currentSession } = get();
143
+
144
+ // Auto-start session if not started
145
+ if (!currentSession) {
146
+ get().startSession();
147
+ }
148
+
149
+ const session = get().currentSession;
150
+ if (!session) return '';
151
+
152
+ const turnId = generateId();
153
+ const turn: OpsTurn = {
154
+ id: turnId,
155
+ startTime: Date.now(),
156
+ promptPreview: promptPreview.substring(0, 40) + (promptPreview.length > 40 ? '...' : ''),
157
+ nodeCount: 0,
158
+ hasError: false,
159
+ };
160
+
161
+ set({
162
+ currentTurnId: turnId,
163
+ currentSession: {
164
+ ...session,
165
+ turns: [...session.turns, turn],
166
+ },
167
+ });
168
+
169
+ return turnId;
170
+ },
171
+
172
+ // End current turn
173
+ endTurn: () => {
174
+ const { currentSession, currentTurnId } = get();
175
+ if (!currentSession || !currentTurnId) return;
176
+
177
+ const turnNodes = currentSession.nodes.filter(n => n.turnId === currentTurnId);
178
+ const hasError = turnNodes.some(n => n.data.status === 'error');
179
+
180
+ set({
181
+ currentTurnId: null,
182
+ currentSession: {
183
+ ...currentSession,
184
+ turns: currentSession.turns.map(t =>
185
+ t.id === currentTurnId
186
+ ? { ...t, endTime: Date.now(), nodeCount: turnNodes.length, hasError }
187
+ : t
188
+ ),
189
+ },
190
+ });
191
+ },
192
+
193
+ // Add a node
194
+ addNode: (type: OpsNodeType, data: OpsNodeData): string => {
195
+ const { currentSession, currentTurnId } = get();
196
+
197
+ // Auto-start session if not started
198
+ if (!currentSession) {
199
+ get().startSession();
200
+ }
201
+
202
+ const session = get().currentSession;
203
+ const turnId = get().currentTurnId;
204
+ if (!session) return '';
205
+
206
+ // If no turn is active, create one
207
+ let effectiveTurnId = turnId;
208
+ if (!effectiveTurnId && type === 'user_prompt') {
209
+ const content = (data as { content?: string }).content || 'New conversation';
210
+ effectiveTurnId = get().startTurn(content);
211
+ } else if (!effectiveTurnId) {
212
+ effectiveTurnId = get().startTurn('Continuation');
213
+ }
214
+
215
+ const nodeId = generateId();
216
+
217
+ const newNode: OpsNode = {
218
+ id: nodeId,
219
+ type,
220
+ timestamp: Date.now(),
221
+ data,
222
+ turnId: effectiveTurnId || '',
223
+ };
224
+
225
+ set({
226
+ currentSession: {
227
+ ...session,
228
+ nodes: [...session.nodes, newNode],
229
+ },
230
+ });
231
+
232
+ return nodeId;
233
+ },
234
+
235
+ // Update a node
236
+ updateNode: (nodeId: string, updates: Partial<OpsNode>) => {
237
+ const { currentSession } = get();
238
+ if (!currentSession) return;
239
+
240
+ set({
241
+ currentSession: {
242
+ ...currentSession,
243
+ nodes: currentSession.nodes.map((node) =>
244
+ node.id === nodeId ? { ...node, ...updates } : node
245
+ ),
246
+ },
247
+ });
248
+ },
249
+
250
+ // Update node data
251
+ updateNodeData: (nodeId: string, dataUpdates: Partial<OpsNodeData>) => {
252
+ const { currentSession } = get();
253
+ if (!currentSession) return;
254
+
255
+ set({
256
+ currentSession: {
257
+ ...currentSession,
258
+ nodes: currentSession.nodes.map((node) =>
259
+ node.id === nodeId
260
+ ? { ...node, data: { ...node.data, ...dataUpdates } as OpsNodeData }
261
+ : node
262
+ ),
263
+ },
264
+ });
265
+ },
266
+
267
+ // Add an edge
268
+ addEdge: (source: string, target: string, label?: string) => {
269
+ const { currentSession, currentTurnId } = get();
270
+ if (!currentSession) return;
271
+
272
+ const edgeId = `edge_${source}_${target}`;
273
+
274
+ // Don't add duplicate edges
275
+ if (currentSession.edges.some((e) => e.id === edgeId)) return;
276
+
277
+ // Find the turn from source node
278
+ const sourceNode = currentSession.nodes.find(n => n.id === source);
279
+ const turnId = sourceNode?.turnId || currentTurnId || '';
280
+
281
+ const newEdge: OpsEdge = {
282
+ id: edgeId,
283
+ source,
284
+ target,
285
+ label,
286
+ animated: false,
287
+ turnId,
288
+ };
289
+
290
+ set({
291
+ currentSession: {
292
+ ...currentSession,
293
+ edges: [...currentSession.edges, newEdge],
294
+ },
295
+ });
296
+ },
297
+
298
+ // Toggle ops view
299
+ setOpsViewOpen: (open: boolean) => set({ isOpsViewOpen: open }),
300
+ toggleOpsView: () => set((state) => ({ isOpsViewOpen: !state.isOpsViewOpen })),
301
+
302
+ // Select node
303
+ setSelectedNode: (nodeId: string | null) => set({ selectedNodeId: nodeId }),
304
+
305
+ // Select turn
306
+ setSelectedTurn: (turnId: string | null) => set({
307
+ selectedTurnId: turnId,
308
+ selectedNodeId: null,
309
+ }),
310
+
311
+ // Playback controls
312
+ startPlayback: () => {
313
+ const { currentSession } = get();
314
+ if (!currentSession || currentSession.turns.length === 0) return;
315
+
316
+ set({
317
+ isPlaying: true,
318
+ playbackTurnIndex: 0,
319
+ selectedTurnId: currentSession.turns[0]?.id || null,
320
+ });
321
+ },
322
+
323
+ stopPlayback: () => {
324
+ set({ isPlaying: false });
325
+ },
326
+
327
+ nextTurn: () => {
328
+ const { currentSession, playbackTurnIndex } = get();
329
+ if (!currentSession) return;
330
+
331
+ const nextIndex = playbackTurnIndex + 1;
332
+ if (nextIndex < currentSession.turns.length) {
333
+ set({
334
+ playbackTurnIndex: nextIndex,
335
+ selectedTurnId: currentSession.turns[nextIndex]?.id || null,
336
+ });
337
+ } else {
338
+ // End playback when we reach the end
339
+ set({ isPlaying: false });
340
+ }
341
+ },
342
+
343
+ prevTurn: () => {
344
+ const { currentSession, playbackTurnIndex } = get();
345
+ if (!currentSession) return;
346
+
347
+ const prevIndex = playbackTurnIndex - 1;
348
+ if (prevIndex >= 0) {
349
+ set({
350
+ playbackTurnIndex: prevIndex,
351
+ selectedTurnId: currentSession.turns[prevIndex]?.id || null,
352
+ });
353
+ }
354
+ },
355
+
356
+ // Get nodes for a specific turn (or all if null)
357
+ getNodesForTurn: (turnId: string | null): OpsNode[] => {
358
+ const { currentSession } = get();
359
+ if (!currentSession) return [];
360
+
361
+ if (turnId === null) {
362
+ return currentSession.nodes;
363
+ }
364
+
365
+ return currentSession.nodes.filter(n => n.turnId === turnId);
366
+ },
367
+
368
+ // Get edges for a specific turn (or all if null)
369
+ getEdgesForTurn: (turnId: string | null): OpsEdge[] => {
370
+ const { currentSession } = get();
371
+ if (!currentSession) return [];
372
+
373
+ if (turnId === null) {
374
+ return currentSession.edges;
375
+ }
376
+
377
+ return currentSession.edges.filter(e => e.turnId === turnId);
378
+ },
379
+
380
+ // Calculate summary
381
+ getSummary: (): OpsSessionSummary => {
382
+ const { currentSession, selectedTurnId } = get();
383
+ if (!currentSession) return createEmptySummary();
384
+
385
+ const summary = createEmptySummary();
386
+ const nodes = selectedTurnId
387
+ ? currentSession.nodes.filter(n => n.turnId === selectedTurnId)
388
+ : currentSession.nodes;
389
+
390
+ let totalDuration = 0;
391
+
392
+ for (const node of nodes) {
393
+ if (node.duration) {
394
+ totalDuration += node.duration;
395
+ }
396
+
397
+ switch (node.type) {
398
+ case 'llm_call':
399
+ case 'llm_response': {
400
+ summary.llmCalls++;
401
+ const llmData = node.data as { inputTokens?: number; outputTokens?: number; totalTokens?: number };
402
+ if (llmData.inputTokens) summary.inputTokens += llmData.inputTokens;
403
+ if (llmData.outputTokens) summary.outputTokens += llmData.outputTokens;
404
+ if (llmData.totalTokens) summary.totalTokens += llmData.totalTokens;
405
+ break;
406
+ }
407
+ case 'tool_call':
408
+ summary.toolCalls++;
409
+ break;
410
+ case 'tool_result': {
411
+ const resultData = node.data as { status?: string };
412
+ if (resultData.status === 'error') {
413
+ summary.errors++;
414
+ }
415
+ break;
416
+ }
417
+ case 'widget_render':
418
+ summary.widgetRenders++;
419
+ break;
420
+ }
421
+ }
422
+
423
+ summary.totalDuration = totalDuration;
424
+
425
+ return summary;
426
+ },
427
+ }));