@tleblancureta/proto 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/core-web/src/ProtoApp.tsx +163 -0
  2. package/core-web/src/components/Shell.tsx +276 -0
  3. package/core-web/src/components/shell/EmptyState.tsx +33 -0
  4. package/core-web/src/components/shell/FocusView.tsx +55 -0
  5. package/core-web/src/components/shell/Toolbar.tsx +233 -0
  6. package/core-web/src/components/shell/persistence.ts +20 -0
  7. package/core-web/src/components/shell/types.ts +14 -0
  8. package/core-web/src/components/ui/avatar.tsx +18 -0
  9. package/core-web/src/components/ui/badge.tsx +28 -0
  10. package/core-web/src/components/ui/button.tsx +40 -0
  11. package/core-web/src/components/ui/card.tsx +32 -0
  12. package/core-web/src/components/ui/inline-edit.tsx +120 -0
  13. package/core-web/src/components/ui/input.tsx +18 -0
  14. package/core-web/src/components/ui/scroll-area.tsx +12 -0
  15. package/core-web/src/components/ui/separator.tsx +23 -0
  16. package/core-web/src/components/ui/shell-dialog.tsx +79 -0
  17. package/core-web/src/components/ui/skeleton.tsx +9 -0
  18. package/core-web/src/components/ui/textarea.tsx +17 -0
  19. package/core-web/src/components/widgets/agent/Generative.tsx +74 -0
  20. package/core-web/src/components/widgets/agent/Primitives.tsx +225 -0
  21. package/core-web/src/components/widgets/agent/actions.ts +52 -0
  22. package/core-web/src/hooks/useAuth.ts +80 -0
  23. package/core-web/src/hooks/useData.ts +44 -0
  24. package/core-web/src/hooks/useMountEffect.ts +10 -0
  25. package/core-web/src/hooks/useTheme.ts +37 -0
  26. package/core-web/src/index.ts +52 -0
  27. package/core-web/src/lib/api.ts +231 -0
  28. package/core-web/src/lib/config.ts +14 -0
  29. package/core-web/src/lib/define-widget.ts +71 -0
  30. package/core-web/src/lib/drag.ts +45 -0
  31. package/core-web/src/lib/supabase.ts +6 -0
  32. package/core-web/src/lib/utils.ts +6 -0
  33. package/core-web/src/lib/widgetCache.ts +29 -0
  34. package/core-web/src/vite-env.d.ts +1 -0
  35. package/dist/core-mcp/src/app.d.ts +40 -0
  36. package/dist/core-mcp/src/app.d.ts.map +1 -0
  37. package/dist/core-mcp/src/app.js +141 -0
  38. package/dist/core-mcp/src/app.js.map +1 -0
  39. package/dist/core-mcp/src/define-tool.d.ts +70 -0
  40. package/dist/core-mcp/src/define-tool.d.ts.map +1 -0
  41. package/dist/core-mcp/src/define-tool.js +38 -0
  42. package/dist/core-mcp/src/define-tool.js.map +1 -0
  43. package/dist/core-mcp/src/entity-tools.d.ts +27 -0
  44. package/dist/core-mcp/src/entity-tools.d.ts.map +1 -0
  45. package/dist/core-mcp/src/entity-tools.js +99 -0
  46. package/dist/core-mcp/src/entity-tools.js.map +1 -0
  47. package/dist/core-mcp/src/index.d.ts +36 -0
  48. package/dist/core-mcp/src/index.d.ts.map +1 -0
  49. package/dist/core-mcp/src/index.js +116 -0
  50. package/dist/core-mcp/src/index.js.map +1 -0
  51. package/dist/core-mcp/src/supabase.d.ts +7 -0
  52. package/dist/core-mcp/src/supabase.d.ts.map +1 -0
  53. package/dist/core-mcp/src/supabase.js +18 -0
  54. package/dist/core-mcp/src/supabase.js.map +1 -0
  55. package/dist/core-mcp/src/tools/_helpers.d.ts +44 -0
  56. package/dist/core-mcp/src/tools/_helpers.d.ts.map +1 -0
  57. package/dist/core-mcp/src/tools/_helpers.js +23 -0
  58. package/dist/core-mcp/src/tools/_helpers.js.map +1 -0
  59. package/dist/core-mcp/src/tools/ui.d.ts +9 -0
  60. package/dist/core-mcp/src/tools/ui.d.ts.map +1 -0
  61. package/dist/core-mcp/src/tools/ui.js +100 -0
  62. package/dist/core-mcp/src/tools/ui.js.map +1 -0
  63. package/dist/core-mcp/src/workflow-tools.d.ts +41 -0
  64. package/dist/core-mcp/src/workflow-tools.d.ts.map +1 -0
  65. package/dist/core-mcp/src/workflow-tools.js +382 -0
  66. package/dist/core-mcp/src/workflow-tools.js.map +1 -0
  67. package/dist/core-shared/src/define-entity.d.ts +73 -0
  68. package/dist/core-shared/src/define-entity.d.ts.map +1 -0
  69. package/dist/core-shared/src/define-entity.js +47 -0
  70. package/dist/core-shared/src/define-entity.js.map +1 -0
  71. package/dist/core-shared/src/define-workflow.d.ts +111 -0
  72. package/dist/core-shared/src/define-workflow.d.ts.map +1 -0
  73. package/dist/core-shared/src/define-workflow.js +92 -0
  74. package/dist/core-shared/src/define-workflow.js.map +1 -0
  75. package/dist/core-shared/src/index.d.ts +5 -0
  76. package/dist/core-shared/src/index.d.ts.map +1 -0
  77. package/dist/core-shared/src/index.js +7 -0
  78. package/dist/core-shared/src/index.js.map +1 -0
  79. package/dist/core-shared/src/scheduling.d.ts +69 -0
  80. package/dist/core-shared/src/scheduling.d.ts.map +1 -0
  81. package/dist/core-shared/src/scheduling.js +39 -0
  82. package/dist/core-shared/src/scheduling.js.map +1 -0
  83. package/dist/core-shared/src/schemas.d.ts +51 -0
  84. package/dist/core-shared/src/schemas.d.ts.map +1 -0
  85. package/dist/core-shared/src/schemas.js +18 -0
  86. package/dist/core-shared/src/schemas.js.map +1 -0
  87. package/dist/core-web/src/ProtoApp.d.ts +19 -0
  88. package/dist/core-web/src/ProtoApp.d.ts.map +1 -0
  89. package/dist/core-web/src/ProtoApp.js +92 -0
  90. package/dist/core-web/src/ProtoApp.js.map +1 -0
  91. package/dist/core-web/src/components/Shell.d.ts +46 -0
  92. package/dist/core-web/src/components/Shell.d.ts.map +1 -0
  93. package/dist/core-web/src/components/Shell.js +104 -0
  94. package/dist/core-web/src/components/Shell.js.map +1 -0
  95. package/dist/core-web/src/components/shell/EmptyState.d.ts +13 -0
  96. package/dist/core-web/src/components/shell/EmptyState.d.ts.map +1 -0
  97. package/dist/core-web/src/components/shell/EmptyState.js +7 -0
  98. package/dist/core-web/src/components/shell/EmptyState.js.map +1 -0
  99. package/dist/core-web/src/components/shell/FocusView.d.ts +16 -0
  100. package/dist/core-web/src/components/shell/FocusView.d.ts.map +1 -0
  101. package/dist/core-web/src/components/shell/FocusView.js +12 -0
  102. package/dist/core-web/src/components/shell/FocusView.js.map +1 -0
  103. package/dist/core-web/src/components/shell/Toolbar.d.ts +35 -0
  104. package/dist/core-web/src/components/shell/Toolbar.d.ts.map +1 -0
  105. package/dist/core-web/src/components/shell/Toolbar.js +42 -0
  106. package/dist/core-web/src/components/shell/Toolbar.js.map +1 -0
  107. package/dist/core-web/src/components/shell/persistence.d.ts +8 -0
  108. package/dist/core-web/src/components/shell/persistence.d.ts.map +1 -0
  109. package/dist/core-web/src/components/shell/persistence.js +20 -0
  110. package/dist/core-web/src/components/shell/persistence.js.map +1 -0
  111. package/dist/core-web/src/components/shell/types.d.ts +13 -0
  112. package/dist/core-web/src/components/shell/types.d.ts.map +1 -0
  113. package/dist/core-web/src/components/shell/types.js +2 -0
  114. package/dist/core-web/src/components/shell/types.js.map +1 -0
  115. package/dist/core-web/src/components/ui/avatar.d.ts +5 -0
  116. package/dist/core-web/src/components/ui/avatar.d.ts.map +1 -0
  117. package/dist/core-web/src/components/ui/avatar.js +9 -0
  118. package/dist/core-web/src/components/ui/avatar.js.map +1 -0
  119. package/dist/core-web/src/components/ui/badge.d.ts +13 -0
  120. package/dist/core-web/src/components/ui/badge.d.ts.map +1 -0
  121. package/dist/core-web/src/components/ui/badge.js +13 -0
  122. package/dist/core-web/src/components/ui/badge.js.map +1 -0
  123. package/dist/core-web/src/components/ui/button.d.ts +22 -0
  124. package/dist/core-web/src/components/ui/button.d.ts.map +1 -0
  125. package/dist/core-web/src/components/ui/button.js +21 -0
  126. package/dist/core-web/src/components/ui/button.js.map +1 -0
  127. package/dist/core-web/src/components/ui/card.d.ts +7 -0
  128. package/dist/core-web/src/components/ui/card.d.ts.map +1 -0
  129. package/dist/core-web/src/components/ui/card.js +13 -0
  130. package/dist/core-web/src/components/ui/card.js.map +1 -0
  131. package/dist/core-web/src/components/ui/inline-edit.d.ts +20 -0
  132. package/dist/core-web/src/components/ui/inline-edit.d.ts.map +1 -0
  133. package/dist/core-web/src/components/ui/inline-edit.js +63 -0
  134. package/dist/core-web/src/components/ui/inline-edit.js.map +1 -0
  135. package/dist/core-web/src/components/ui/input.d.ts +4 -0
  136. package/dist/core-web/src/components/ui/input.d.ts.map +1 -0
  137. package/dist/core-web/src/components/ui/input.js +7 -0
  138. package/dist/core-web/src/components/ui/input.js.map +1 -0
  139. package/dist/core-web/src/components/ui/scroll-area.d.ts +4 -0
  140. package/dist/core-web/src/components/ui/scroll-area.d.ts.map +1 -0
  141. package/dist/core-web/src/components/ui/scroll-area.js +7 -0
  142. package/dist/core-web/src/components/ui/scroll-area.js.map +1 -0
  143. package/dist/core-web/src/components/ui/separator.d.ts +7 -0
  144. package/dist/core-web/src/components/ui/separator.d.ts.map +1 -0
  145. package/dist/core-web/src/components/ui/separator.js +7 -0
  146. package/dist/core-web/src/components/ui/separator.js.map +1 -0
  147. package/dist/core-web/src/components/ui/shell-dialog.d.ts +16 -0
  148. package/dist/core-web/src/components/ui/shell-dialog.d.ts.map +1 -0
  149. package/dist/core-web/src/components/ui/shell-dialog.js +36 -0
  150. package/dist/core-web/src/components/ui/shell-dialog.js.map +1 -0
  151. package/dist/core-web/src/components/ui/skeleton.d.ts +3 -0
  152. package/dist/core-web/src/components/ui/skeleton.d.ts.map +1 -0
  153. package/dist/core-web/src/components/ui/skeleton.js +7 -0
  154. package/dist/core-web/src/components/ui/skeleton.js.map +1 -0
  155. package/dist/core-web/src/components/ui/textarea.d.ts +4 -0
  156. package/dist/core-web/src/components/ui/textarea.d.ts.map +1 -0
  157. package/dist/core-web/src/components/ui/textarea.js +7 -0
  158. package/dist/core-web/src/components/ui/textarea.js.map +1 -0
  159. package/dist/core-web/src/components/widgets/agent/Generative.d.ts +13 -0
  160. package/dist/core-web/src/components/widgets/agent/Generative.d.ts.map +1 -0
  161. package/dist/core-web/src/components/widgets/agent/Generative.js +42 -0
  162. package/dist/core-web/src/components/widgets/agent/Generative.js.map +1 -0
  163. package/dist/core-web/src/components/widgets/agent/Primitives.d.ts +79 -0
  164. package/dist/core-web/src/components/widgets/agent/Primitives.d.ts.map +1 -0
  165. package/dist/core-web/src/components/widgets/agent/Primitives.js +116 -0
  166. package/dist/core-web/src/components/widgets/agent/Primitives.js.map +1 -0
  167. package/dist/core-web/src/components/widgets/agent/actions.d.ts +3 -0
  168. package/dist/core-web/src/components/widgets/agent/actions.d.ts.map +1 -0
  169. package/dist/core-web/src/components/widgets/agent/actions.js +33 -0
  170. package/dist/core-web/src/components/widgets/agent/actions.js.map +1 -0
  171. package/dist/core-web/src/hooks/useAuth.d.ts +25 -0
  172. package/dist/core-web/src/hooks/useAuth.d.ts.map +1 -0
  173. package/dist/core-web/src/hooks/useAuth.js +53 -0
  174. package/dist/core-web/src/hooks/useAuth.js.map +1 -0
  175. package/dist/core-web/src/hooks/useData.d.ts +10 -0
  176. package/dist/core-web/src/hooks/useData.d.ts.map +1 -0
  177. package/dist/core-web/src/hooks/useData.js +37 -0
  178. package/dist/core-web/src/hooks/useData.js.map +1 -0
  179. package/dist/core-web/src/hooks/useMountEffect.d.ts +6 -0
  180. package/dist/core-web/src/hooks/useMountEffect.d.ts.map +1 -0
  181. package/dist/core-web/src/hooks/useMountEffect.js +10 -0
  182. package/dist/core-web/src/hooks/useMountEffect.js.map +1 -0
  183. package/dist/core-web/src/hooks/useTheme.d.ts +6 -0
  184. package/dist/core-web/src/hooks/useTheme.d.ts.map +1 -0
  185. package/dist/core-web/src/hooks/useTheme.js +31 -0
  186. package/dist/core-web/src/hooks/useTheme.js.map +1 -0
  187. package/dist/core-web/src/index.d.ts +33 -0
  188. package/dist/core-web/src/index.d.ts.map +1 -0
  189. package/dist/core-web/src/index.js +38 -0
  190. package/dist/core-web/src/index.js.map +1 -0
  191. package/dist/core-web/src/lib/api.d.ts +60 -0
  192. package/dist/core-web/src/lib/api.d.ts.map +1 -0
  193. package/dist/core-web/src/lib/api.js +204 -0
  194. package/dist/core-web/src/lib/api.js.map +1 -0
  195. package/dist/core-web/src/lib/config.d.ts +10 -0
  196. package/dist/core-web/src/lib/config.d.ts.map +1 -0
  197. package/dist/core-web/src/lib/config.js +10 -0
  198. package/dist/core-web/src/lib/config.js.map +1 -0
  199. package/dist/core-web/src/lib/define-widget.d.ts +52 -0
  200. package/dist/core-web/src/lib/define-widget.d.ts.map +1 -0
  201. package/dist/core-web/src/lib/define-widget.js +14 -0
  202. package/dist/core-web/src/lib/define-widget.js.map +1 -0
  203. package/dist/core-web/src/lib/drag.d.ts +20 -0
  204. package/dist/core-web/src/lib/drag.d.ts.map +1 -0
  205. package/dist/core-web/src/lib/drag.js +33 -0
  206. package/dist/core-web/src/lib/drag.js.map +1 -0
  207. package/dist/core-web/src/lib/supabase.d.ts +2 -0
  208. package/dist/core-web/src/lib/supabase.d.ts.map +1 -0
  209. package/dist/core-web/src/lib/supabase.js +5 -0
  210. package/dist/core-web/src/lib/supabase.js.map +1 -0
  211. package/dist/core-web/src/lib/utils.d.ts +3 -0
  212. package/dist/core-web/src/lib/utils.d.ts.map +1 -0
  213. package/dist/core-web/src/lib/utils.js +6 -0
  214. package/dist/core-web/src/lib/utils.js.map +1 -0
  215. package/dist/core-web/src/lib/widgetCache.d.ts +18 -0
  216. package/dist/core-web/src/lib/widgetCache.d.ts.map +1 -0
  217. package/dist/core-web/src/lib/widgetCache.js +28 -0
  218. package/dist/core-web/src/lib/widgetCache.js.map +1 -0
  219. package/dist/mcp.d.ts +2 -0
  220. package/dist/mcp.d.ts.map +1 -0
  221. package/dist/mcp.js +2 -0
  222. package/dist/mcp.js.map +1 -0
  223. package/dist/shared.d.ts +2 -0
  224. package/dist/shared.d.ts.map +1 -0
  225. package/dist/shared.js +2 -0
  226. package/dist/shared.js.map +1 -0
  227. package/dist/web.d.ts +2 -0
  228. package/dist/web.d.ts.map +1 -0
  229. package/dist/web.js +2 -0
  230. package/dist/web.js.map +1 -0
  231. package/package.json +62 -0
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Identity helper with type inference. Pass a definition object, get it back
3
+ * unchanged. Use in default exports of app/tools files:
4
+ *
5
+ * export default [defineTool({ ... }), defineTool({ ... })]
6
+ */
7
+ export function defineTool(def) {
8
+ return def;
9
+ }
10
+ /**
11
+ * Register an array of tool definitions on a server instance. Wraps each
12
+ * handler in a try/catch that emits a normalized error response if the tool
13
+ * throws.
14
+ */
15
+ export function registerTools(server, defs) {
16
+ for (const def of defs) {
17
+ server.tool(def.name, def.description, def.schema, async (args) => {
18
+ try {
19
+ return await def.handler(args);
20
+ }
21
+ catch (error) {
22
+ const message = error instanceof Error ? error.message : String(error);
23
+ return {
24
+ content: [
25
+ {
26
+ type: 'text',
27
+ text: JSON.stringify({
28
+ summary: `Error en ${def.name}: ${message}`,
29
+ error: true,
30
+ }),
31
+ },
32
+ ],
33
+ };
34
+ }
35
+ });
36
+ }
37
+ }
38
+ //# sourceMappingURL=define-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-tool.js","sourceRoot":"","sources":["../../../core-mcp/src/define-tool.ts"],"names":[],"mappings":"AA2DA;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CACxB,GAAsB;IAEtB,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAiB,EACjB,IAA+B;IAE/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CACT,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,MAAM,EACV,KAAK,EAAE,IAA6B,EAAE,EAAE;YACtC,IAAI,CAAC;gBACH,OAAO,MAAM,GAAG,CAAC,OAAO,CAAC,IAAa,CAAC,CAAA;YACzC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBACtE,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,OAAO,EAAE,YAAY,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE;gCAC3C,KAAK,EAAE,IAAI;6BACZ,CAAC;yBACH;qBACF;iBACF,CAAA;YACH,CAAC;QACH,CAAC,CACF,CAAA;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * registerEntityTools — generates activate_<name> / deactivate_<name> /
3
+ * get_active_<name> MCP tools from an array of entity definitions.
4
+ *
5
+ * The active state lives in a module-level Map, which is naturally per-process
6
+ * for stdio transport (one subprocess per session) and per-session for HTTP
7
+ * transport (each session builds a fresh server via `buildServer()`).
8
+ *
9
+ * Apps call this from their tools/index.ts:
10
+ *
11
+ * import { registerEntityTools } from 'proto/mcp'
12
+ * import { ENTITIES } from '../entities/index.js'
13
+ *
14
+ * export function registerAppTools(server) {
15
+ * registerUiTools(server)
16
+ * registerTools(server, ALL_APP_TOOLS)
17
+ * registerEntityTools(server, ENTITIES)
18
+ * }
19
+ */
20
+ import { z } from 'zod';
21
+ import type { EntityDefinition } from '../../core-shared/src/index.js';
22
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
23
+ export declare function buildEntityTools(defs: readonly EntityDefinition[]): (import("./define-tool.js").ToolDefinition<{
24
+ [x: string]: z.ZodString;
25
+ }> | import("./define-tool.js").ToolDefinition<{}>)[];
26
+ export declare function registerEntityTools(server: McpServer, defs: readonly EntityDefinition[]): void;
27
+ //# sourceMappingURL=entity-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-tools.d.ts","sourceRoot":"","sources":["../../../core-mcp/src/entity-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAexE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,gBAAgB,EAAE;;sDAwEjE;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,gBAAgB,EAAE,GAChC,IAAI,CAEN"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * registerEntityTools — generates activate_<name> / deactivate_<name> /
3
+ * get_active_<name> MCP tools from an array of entity definitions.
4
+ *
5
+ * The active state lives in a module-level Map, which is naturally per-process
6
+ * for stdio transport (one subprocess per session) and per-session for HTTP
7
+ * transport (each session builds a fresh server via `buildServer()`).
8
+ *
9
+ * Apps call this from their tools/index.ts:
10
+ *
11
+ * import { registerEntityTools } from 'proto/mcp'
12
+ * import { ENTITIES } from '../entities/index.js'
13
+ *
14
+ * export function registerAppTools(server) {
15
+ * registerUiTools(server)
16
+ * registerTools(server, ALL_APP_TOOLS)
17
+ * registerEntityTools(server, ENTITIES)
18
+ * }
19
+ */
20
+ import { z } from 'zod';
21
+ import { defineTool, registerTools } from './define-tool.js';
22
+ import { getSupabase } from './supabase.js';
23
+ import { ok } from './tools/_helpers.js';
24
+ const activeByName = new Map();
25
+ function json(obj) {
26
+ return ok(JSON.stringify(obj, null, 2));
27
+ }
28
+ export function buildEntityTools(defs) {
29
+ return defs.flatMap(def => {
30
+ const idField = `${def.name}_id`;
31
+ const singular = def.displayName || def.name;
32
+ const activateDesc = def.activateDescription
33
+ ?? `Activa un ${singular} como foco del agente. Llama esta tool cuando empieces a trabajar sobre un ${singular} especifico, y cada vez que cambies de ${singular}. El frontend entra en "cockpit mode" con los widgets focalizados y las tools scoped operan sobre este ${singular} sin necesidad de repetir el id en cada llamada.`;
34
+ const deactivateDesc = `Desactiva el ${singular} activo. El frontend vuelve al layout general.`;
35
+ const getActiveDesc = `Devuelve el ${singular} activo actual (si hay).`;
36
+ return [
37
+ defineTool({
38
+ name: `activate_${def.name}`,
39
+ description: activateDesc,
40
+ schema: { [idField]: z.string().describe(`UUID del ${singular} a activar`) },
41
+ handler: async (args) => {
42
+ const id = args[idField];
43
+ const db = getSupabase();
44
+ const { data, error } = await db
45
+ .from(def.table)
46
+ .select('*')
47
+ .eq('id', id)
48
+ .maybeSingle();
49
+ if (error)
50
+ return ok(`Error: ${error.message}`);
51
+ if (!data)
52
+ return ok(`${singular} ${id} no encontrado`);
53
+ activeByName.set(def.name, { id });
54
+ return json({
55
+ ok: true,
56
+ activated: {
57
+ type: def.name,
58
+ id,
59
+ label: data[def.labelField] ?? null,
60
+ },
61
+ entity: data,
62
+ message: `${singular} activado. El cockpit del frontend quedo abierto.`,
63
+ });
64
+ },
65
+ }),
66
+ defineTool({
67
+ name: `deactivate_${def.name}`,
68
+ description: deactivateDesc,
69
+ schema: {},
70
+ handler: async () => {
71
+ const prev = activeByName.get(def.name) ?? null;
72
+ activeByName.set(def.name, null);
73
+ return json({ ok: true, deactivated: prev?.id ?? null });
74
+ },
75
+ }),
76
+ defineTool({
77
+ name: `get_active_${def.name}`,
78
+ description: getActiveDesc,
79
+ schema: {},
80
+ handler: async () => {
81
+ const active = activeByName.get(def.name) ?? null;
82
+ if (!active)
83
+ return json({ active: null });
84
+ const db = getSupabase();
85
+ const { data } = await db
86
+ .from(def.table)
87
+ .select('*')
88
+ .eq('id', active.id)
89
+ .maybeSingle();
90
+ return json({ active, entity: data });
91
+ },
92
+ }),
93
+ ];
94
+ });
95
+ }
96
+ export function registerEntityTools(server, defs) {
97
+ registerTools(server, buildEntityTools(defs));
98
+ }
99
+ //# sourceMappingURL=entity-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-tools.js","sourceRoot":"","sources":["../../../core-mcp/src/entity-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export { getSupabase } from './supabase.js';
3
+ export { ok, json, err, agent, agentErr } from './tools/_helpers.js';
4
+ export { registerUiTools } from './tools/ui.js';
5
+ export { McpServer };
6
+ export { defineTool, registerTools, type ToolDefinition, type ToolHandler, type ToolResult, } from './define-tool.js';
7
+ export { buildEntityTools, registerEntityTools } from './entity-tools.js';
8
+ export { buildWorkflowTools, registerWorkflowTools } from './workflow-tools.js';
9
+ export { createProtoMcp, type ProtoMcpOptions } from './app.js';
10
+ export interface CreateMcpServerOptions {
11
+ name: string;
12
+ version?: string;
13
+ }
14
+ export declare function createMcpServer(opts: CreateMcpServerOptions): McpServer;
15
+ /**
16
+ * Run the given server over stdio. Blocks until the transport closes.
17
+ * Used when the MCP server is spawned as a subprocess by Claude Code CLI.
18
+ */
19
+ export declare function runStdio(server: McpServer): Promise<void>;
20
+ export interface RunHttpOptions {
21
+ port: number;
22
+ /**
23
+ * Factory called per-session to build a fresh McpServer with tools registered.
24
+ * Each Claude Code session gets an isolated server instance so active-order
25
+ * (and other per-session state) doesn't leak between users.
26
+ */
27
+ buildServer: () => McpServer;
28
+ /** Optional display name used in log output. */
29
+ displayName?: string;
30
+ }
31
+ /**
32
+ * Run an HTTP streamable MCP server with session management.
33
+ * Handles /mcp (POST/GET/DELETE) and /health endpoints.
34
+ */
35
+ export declare function runHttp(opts: RunHttpOptions): Promise<void>;
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../core-mcp/src/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAMnE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,CAAA;AACpB,OAAO,EACL,UAAU,EACV,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,UAAU,GAChB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAA;AAI/D,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,sBAAsB,GAAG,SAAS,CAKvE;AAID;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/D;AAID,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,WAAW,EAAE,MAAM,SAAS,CAAA;IAC5B,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAkFjE"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * @proto/core-mcp — MCP server framework library.
3
+ *
4
+ * Provides factory functions to build and run MCP servers over stdio or HTTP,
5
+ * plus shared helpers that app-space tools use to compose responses.
6
+ *
7
+ * Apps consume this as a library:
8
+ *
9
+ * import { createMcpServer, runStdio } from 'proto/mcp'
10
+ * const server = createMcpServer({ name: 'my-app' })
11
+ * registerMyTools(server)
12
+ * await runStdio(server)
13
+ */
14
+ import { createServer as createHttpServer } from 'node:http';
15
+ import { randomUUID } from 'node:crypto';
16
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
17
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
18
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
19
+ // ── Re-exports for app tools ──
20
+ export { getSupabase } from './supabase.js';
21
+ export { ok, json, err, agent, agentErr } from './tools/_helpers.js';
22
+ export { registerUiTools } from './tools/ui.js';
23
+ export { McpServer };
24
+ export { defineTool, registerTools, } from './define-tool.js';
25
+ export { buildEntityTools, registerEntityTools } from './entity-tools.js';
26
+ export { buildWorkflowTools, registerWorkflowTools } from './workflow-tools.js';
27
+ export { createProtoMcp } from './app.js';
28
+ export function createMcpServer(opts) {
29
+ return new McpServer({
30
+ name: opts.name,
31
+ version: opts.version || '0.1.0',
32
+ });
33
+ }
34
+ // ── Stdio transport ──
35
+ /**
36
+ * Run the given server over stdio. Blocks until the transport closes.
37
+ * Used when the MCP server is spawned as a subprocess by Claude Code CLI.
38
+ */
39
+ export async function runStdio(server) {
40
+ const transport = new StdioServerTransport();
41
+ await server.connect(transport);
42
+ }
43
+ /**
44
+ * Run an HTTP streamable MCP server with session management.
45
+ * Handles /mcp (POST/GET/DELETE) and /health endpoints.
46
+ */
47
+ export async function runHttp(opts) {
48
+ const sessions = new Map();
49
+ const name = opts.displayName || 'proto-mcp';
50
+ const httpServer = createHttpServer(async (req, res) => {
51
+ // CORS
52
+ res.setHeader('Access-Control-Allow-Origin', '*');
53
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
54
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, mcp-session-id');
55
+ res.setHeader('Access-Control-Expose-Headers', 'mcp-session-id');
56
+ if (req.method === 'OPTIONS') {
57
+ res.writeHead(204);
58
+ res.end();
59
+ return;
60
+ }
61
+ if (req.url === '/health') {
62
+ res.writeHead(200, { 'Content-Type': 'application/json' });
63
+ res.end(JSON.stringify({ status: 'ok', sessions: sessions.size }));
64
+ return;
65
+ }
66
+ if (req.url !== '/mcp') {
67
+ res.writeHead(404);
68
+ res.end('Not found');
69
+ return;
70
+ }
71
+ const sessionId = req.headers['mcp-session-id'];
72
+ if (req.method === 'GET' || req.method === 'DELETE') {
73
+ if (!sessionId || !sessions.has(sessionId)) {
74
+ res.writeHead(400, { 'Content-Type': 'application/json' });
75
+ res.end(JSON.stringify({ error: 'Invalid or missing session' }));
76
+ return;
77
+ }
78
+ const transport = sessions.get(sessionId);
79
+ await transport.handleRequest(req, res);
80
+ if (req.method === 'DELETE') {
81
+ sessions.delete(sessionId);
82
+ }
83
+ return;
84
+ }
85
+ if (req.method === 'POST') {
86
+ if (sessionId && sessions.has(sessionId)) {
87
+ const transport = sessions.get(sessionId);
88
+ await transport.handleRequest(req, res);
89
+ return;
90
+ }
91
+ const transport = new StreamableHTTPServerTransport({
92
+ sessionIdGenerator: () => randomUUID(),
93
+ });
94
+ const server = opts.buildServer();
95
+ await server.connect(transport);
96
+ transport.onclose = () => {
97
+ if (transport.sessionId)
98
+ sessions.delete(transport.sessionId);
99
+ };
100
+ await transport.handleRequest(req, res);
101
+ if (transport.sessionId) {
102
+ sessions.set(transport.sessionId, transport);
103
+ }
104
+ return;
105
+ }
106
+ res.writeHead(405);
107
+ res.end('Method not allowed');
108
+ });
109
+ return new Promise(resolve => {
110
+ httpServer.listen(opts.port, () => {
111
+ console.log(`${name} MCP server listening on port ${opts.port}`);
112
+ resolve();
113
+ });
114
+ });
115
+ }
116
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../core-mcp/src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { SupabaseClient } from '@supabase/supabase-js';
2
+ /**
3
+ * Get Supabase client initialized with service role key from environment.
4
+ * Service role key bypasses RLS — only used server-side in MCP tools.
5
+ */
6
+ export declare function getSupabase(): SupabaseClient;
7
+ //# sourceMappingURL=supabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../../core-mcp/src/supabase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAIpE;;;GAGG;AACH,wBAAgB,WAAW,IAAI,cAAc,CAY5C"}
@@ -0,0 +1,18 @@
1
+ import { createClient } from '@supabase/supabase-js';
2
+ let client = null;
3
+ /**
4
+ * Get Supabase client initialized with service role key from environment.
5
+ * Service role key bypasses RLS — only used server-side in MCP tools.
6
+ */
7
+ export function getSupabase() {
8
+ if (client)
9
+ return client;
10
+ const url = process.env.SUPABASE_URL;
11
+ const key = process.env.SUPABASE_SERVICE_ROLE_KEY;
12
+ if (!url || !key) {
13
+ throw new Error('SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY must be set');
14
+ }
15
+ client = createClient(url, key);
16
+ return client;
17
+ }
18
+ //# sourceMappingURL=supabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../../core-mcp/src/supabase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkB,MAAM,uBAAuB,CAAA;AAEpE,IAAI,MAAM,GAA0B,IAAI,CAAA;AAExC;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;IACpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAA;IAEjD,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;IAC3E,CAAC;IAED,MAAM,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC/B,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Framework-level tool helpers. Keep this tiny and dependency-free —
3
+ * only reusable primitives live here. Domain-specific helpers live
4
+ * in the app (e.g. examples/hermes/app/tools/_hermes-helpers.ts).
5
+ */
6
+ export declare const ok: (text: string) => {
7
+ content: {
8
+ type: "text";
9
+ text: string;
10
+ }[];
11
+ };
12
+ export declare const json: (obj: unknown) => {
13
+ content: {
14
+ type: "text";
15
+ text: string;
16
+ }[];
17
+ };
18
+ export declare const err: (msg: string) => {
19
+ content: {
20
+ type: "text";
21
+ text: string;
22
+ }[];
23
+ };
24
+ interface AgentResponse {
25
+ summary: string;
26
+ data: Record<string, unknown>;
27
+ hint?: string;
28
+ }
29
+ /** Structured response for the agent: summary + curated data + optional hint. */
30
+ export declare function agent(r: AgentResponse): {
31
+ content: {
32
+ type: "text";
33
+ text: string;
34
+ }[];
35
+ };
36
+ /** Structured error for the agent with optional context. */
37
+ export declare function agentErr(summary: string, details?: Record<string, unknown>): {
38
+ content: {
39
+ type: "text";
40
+ text: string;
41
+ }[];
42
+ };
43
+ export {};
44
+ //# sourceMappingURL=_helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_helpers.d.ts","sourceRoot":"","sources":["../../../../core-mcp/src/tools/_helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,EAAE,GAAI,MAAM,MAAM;;;;;CAAqD,CAAA;AACpF,eAAO,MAAM,IAAI,GAAI,KAAK,OAAO;;;;;CAAqC,CAAA;AACtE,eAAO,MAAM,GAAG,GAAI,KAAK,MAAM;;;;;CAAwB,CAAA;AAIvD,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,iFAAiF;AACjF,wBAAgB,KAAK,CAAC,CAAC,EAAE,aAAa;;;;;EAIrC;AAED,4DAA4D;AAC5D,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;;EAI1E"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Framework-level tool helpers. Keep this tiny and dependency-free —
3
+ * only reusable primitives live here. Domain-specific helpers live
4
+ * in the app (e.g. examples/hermes/app/tools/_hermes-helpers.ts).
5
+ */
6
+ export const ok = (text) => ({ content: [{ type: 'text', text }] });
7
+ export const json = (obj) => ok(JSON.stringify(obj, null, 2));
8
+ export const err = (msg) => ok(`Error: ${msg}`);
9
+ /** Structured response for the agent: summary + curated data + optional hint. */
10
+ export function agent(r) {
11
+ const out = { summary: r.summary, data: r.data };
12
+ if (r.hint)
13
+ out.hint = r.hint;
14
+ return ok(JSON.stringify(out));
15
+ }
16
+ /** Structured error for the agent with optional context. */
17
+ export function agentErr(summary, details) {
18
+ const out = { summary, error: true };
19
+ if (details)
20
+ out.data = details;
21
+ return ok(JSON.stringify(out));
22
+ }
23
+ //# sourceMappingURL=_helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_helpers.js","sourceRoot":"","sources":["../../../../core-mcp/src/tools/_helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;AACpF,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAY,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AACtE,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,CAAA;AAUvD,iFAAiF;AACjF,MAAM,UAAU,KAAK,CAAC,CAAgB;IACpC,MAAM,GAAG,GAA4B,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACzE,IAAI,CAAC,CAAC,IAAI;QAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAA;IAC7B,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;AAChC,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,OAAiC;IACzE,MAAM,GAAG,GAA4B,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IAC7D,IAAI,OAAO;QAAE,GAAG,CAAC,IAAI,GAAG,OAAO,CAAA;IAC/B,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;AAChC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ /**
3
+ * Generative UI: the agent calls `render_ui` to project an interactive
4
+ * component tree into the frontend shell. The tool itself is a no-op on the
5
+ * server — its purpose is to emit a `tool_use` event in the SSE stream that
6
+ * the frontend can intercept and render.
7
+ */
8
+ export declare function registerUiTools(server: McpServer): void;
9
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../../core-mcp/src/tools/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGnE;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,QAgGhD"}
@@ -0,0 +1,100 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Generative UI: the agent calls `render_ui` to project an interactive
4
+ * component tree into the frontend shell. The tool itself is a no-op on the
5
+ * server — its purpose is to emit a `tool_use` event in the SSE stream that
6
+ * the frontend can intercept and render.
7
+ */
8
+ export function registerUiTools(server) {
9
+ server.tool('render_ui', `Project an interactive component tree into the user's shell (right canvas). The other widgets minimize so the user can focus on exploring the generated UI.
10
+
11
+ Use this WHENEVER you have structured data the user should browse visually: supplier search results, product comparisons, timelines, dashboards, tables, etc. Prefer this over large markdown tables in chat.
12
+
13
+ The \`spec\` is a JSON tree of primitives. Each node = { "type": "PrimitiveName", ...props, "children": [...] }.
14
+
15
+ ## Available primitives
16
+
17
+ ### Layout
18
+ - **Stack** { gap?: 1-6, children } — vertical flex column.
19
+ - **Row** { gap?: 1-6, align?: "start"|"center"|"end"|"baseline", children } — horizontal flex.
20
+ - **Grid** { cols: 1|2|3|4, gap?: 1-6, children } — responsive grid.
21
+
22
+ ### Typography
23
+ - **Heading** { text: string, level?: 1|2|3 }
24
+ - **Text** { text: string, muted?: boolean, size?: "xs"|"sm" }
25
+
26
+ ### Content
27
+ - **Image** { src: string, alt?: string, aspect?: "square"|"video"|"auto" (default "square"), fit?: "cover"|"contain" (default "contain" — shows whole image) }
28
+ - **Badge** { text: string, variant?: "default"|"secondary"|"outline"|"success"|"warning" }
29
+ - **Stat** { label: string, value: string, hint?: string, tone?: "default"|"success"|"warning"|"danger" } — big number card.
30
+ - **Rating** { score: number, count?: number } — star rating.
31
+ - **GoldSupplier** { years: number } — Alibaba gold supplier badge.
32
+
33
+ ### Containers
34
+ - **Card** { children } — elevated rounded container. Usually holds Image + CardBody.
35
+ - **CardBody** { children } — padded flex-column inside a Card.
36
+
37
+ ### Interactive
38
+ - **LinkOut** { href: string, label?: string } — external link button.
39
+ - **Button** { label: string, send?: string, action?: string, actionPayload?: object, variant?: "default"|"primary"|"ghost" } — clicking either sends \`send\` as a new chat message OR fires a frontend \`action\` directly (no LLM roundtrip). If \`action\` is set it takes priority. Available actions:
40
+ - \`save_alternative\`: saves an Alibaba supplier to product_alternatives. actionPayload = { company_id (required), product_id?, supplier (required), title?, url?, thumbnail?, price?, moq?, review_score?, review_count?, gold_supplier_years?, country? }. Button shows "✓ <supplier> guardado como alternativa" on success.
41
+
42
+ ### Tabular
43
+ - **Table** { columns: string[], rows: (string|number)[][] } — simple table.
44
+
45
+ ## Example (supplier results)
46
+
47
+ {
48
+ "type": "Stack", "gap": 3, "children": [
49
+ { "type": "Text", "text": "5 proveedores encontrados", "muted": true },
50
+ { "type": "Grid", "cols": 2, "gap": 3, "children": [
51
+ {
52
+ "type": "Card", "children": [
53
+ { "type": "Image", "src": "https://...", "aspect": "video" },
54
+ { "type": "CardBody", "children": [
55
+ { "type": "Text", "text": "Albornoz spa algodon 100%" },
56
+ { "type": "Row", "gap": 2, "children": [
57
+ { "type": "Badge", "text": "USD 6.60-8.80", "variant": "success" },
58
+ { "type": "Badge", "text": "MOQ 50" }
59
+ ]},
60
+ { "type": "Row", "gap": 2, "children": [
61
+ { "type": "Rating", "score": 4.9, "count": 120 },
62
+ { "type": "GoldSupplier", "years": 9 }
63
+ ]},
64
+ { "type": "Text", "text": "Shanghai General Textile", "muted": true, "size": "xs" },
65
+ { "type": "Row", "gap": 1, "children": [
66
+ { "type": "LinkOut", "href": "https://alibaba.com/...", "label": "Ver" },
67
+ { "type": "Button", "label": "Guardar", "send": "Guarda Shanghai General Textile como referencia", "variant": "primary" }
68
+ ]}
69
+ ]}
70
+ ]
71
+ }
72
+ ]}
73
+ ]
74
+ }
75
+
76
+ ## Rules
77
+ - Keep specs compact. Don't duplicate text that's already in chat.
78
+ - Use Grid cols:2 for 4-10 cards, cols:3 for 12+.
79
+ - Always include a Button with a useful follow-up action per card when possible.
80
+ - Unknown primitives render a placeholder — don't invent new types.`, {
81
+ spec: z
82
+ .any()
83
+ .describe('UI tree: { type, ...props, children? } or an array of such nodes.'),
84
+ title: z
85
+ .string()
86
+ .optional()
87
+ .describe('Widget title shown in the header. Keep it short (e.g. "Proveedores").'),
88
+ }, async ({ spec, title }) => {
89
+ // No-op. The value is in the tool_use event itself.
90
+ return {
91
+ content: [
92
+ {
93
+ type: 'text',
94
+ text: JSON.stringify({ rendered: true, title: title || 'Vista generada' }),
95
+ },
96
+ ],
97
+ };
98
+ });
99
+ }
100
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../../core-mcp/src/tools/ui.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,CAAC,IAAI,CACT,WAAW,EACX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oEAuEgE,EAChE;QACE,IAAI,EAAE,CAAC;aACJ,GAAG,EAAE;aACL,QAAQ,CAAC,mEAAmE,CAAC;QAChF,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,uEAAuE,CAAC;KACrF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QACxB,oDAAoD;QACpD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,gBAAgB,EAAE,CAAC;iBAC3E;aACF;SACF,CAAA;IACH,CAAC,CACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * buildWorkflowTools — generates MCP tools from a WorkflowDefinition.
3
+ *
4
+ * Emits 9 tools per workflow (names are configurable via `toolNames`):
5
+ *
6
+ * get_item_state, list_items_by_phase, advance_step,
7
+ * block_item, unblock_item, hold_item, resume_item, cancel_item,
8
+ * request_human_approval
9
+ *
10
+ * Defaults keep the tool names stable so existing skills keep working. If an
11
+ * app has multiple workflows, set `toolNames` on each to avoid collisions.
12
+ */
13
+ import { z } from 'zod';
14
+ import type { WorkflowDefinition } from '../../core-shared/src/index.js';
15
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
16
+ import { type ToolDefinition } from './define-tool.js';
17
+ export declare function buildWorkflowTools(wf: WorkflowDefinition): (ToolDefinition<{
18
+ item_id: z.ZodString;
19
+ }> | ToolDefinition<{
20
+ company_id: z.ZodString;
21
+ phase: z.ZodOptional<z.ZodEnum<[string, ...string[]]>>;
22
+ include_cancelled: z.ZodDefault<z.ZodBoolean>;
23
+ }> | ToolDefinition<{
24
+ item_id: z.ZodString;
25
+ to_phase: z.ZodEnum<[string, ...string[]]>;
26
+ to_step: z.ZodString;
27
+ actor: z.ZodString;
28
+ reason: z.ZodOptional<z.ZodString>;
29
+ evidence: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
30
+ }> | ToolDefinition<{
31
+ item_id: z.ZodString;
32
+ reason: z.ZodString;
33
+ }> | ToolDefinition<{
34
+ item_id: z.ZodString;
35
+ reason: z.ZodOptional<z.ZodString>;
36
+ }> | ToolDefinition<{
37
+ item_id: z.ZodString;
38
+ packet: z.ZodRecord<z.ZodString, z.ZodAny>;
39
+ }>)[];
40
+ export declare function registerWorkflowTools(server: McpServer, wf: WorkflowDefinition): void;
41
+ //# sourceMappingURL=workflow-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-tools.d.ts","sourceRoot":"","sources":["../../../core-mcp/src/workflow-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EACV,kBAAkB,EAEnB,MAAM,gCAAgC,CAAA;AASvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,EAA6B,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAkEjF,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,kBAAkB;;;;;;;;;;;;;;;;;;;;;;MAuTxD;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,kBAAkB,GAAG,IAAI,CAErF"}