plazbot-cli 0.2.25 → 0.3.1

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 (178) hide show
  1. package/CLAUDE.md +34 -5
  2. package/README.md +21 -0
  3. package/dist/cli.js +32 -20
  4. package/dist/commands/agent/ai-config.js +98 -50
  5. package/dist/commands/agent/chat.js +80 -74
  6. package/dist/commands/agent/copy.js +23 -21
  7. package/dist/commands/agent/create.js +42 -72
  8. package/dist/commands/agent/delete.js +29 -30
  9. package/dist/commands/agent/enable-widget.js +30 -26
  10. package/dist/commands/agent/export.js +90 -77
  11. package/dist/commands/agent/files.js +68 -60
  12. package/dist/commands/agent/get.js +101 -87
  13. package/dist/commands/agent/index.js +53 -39
  14. package/dist/commands/agent/list.js +26 -24
  15. package/dist/commands/agent/monitor.js +91 -86
  16. package/dist/commands/agent/on-message.js +40 -37
  17. package/dist/commands/agent/set.js +62 -59
  18. package/dist/commands/agent/templates.js +109 -108
  19. package/dist/commands/agent/tools.js +64 -65
  20. package/dist/commands/agent/update.js +28 -27
  21. package/dist/commands/agent/validate.js +127 -0
  22. package/dist/commands/agent/wizard.js +152 -159
  23. package/dist/commands/auth/index.js +7 -10
  24. package/dist/commands/auth/login.js +50 -37
  25. package/dist/commands/auth/logout.js +16 -14
  26. package/dist/commands/auth/status.js +19 -16
  27. package/dist/commands/portal/add-agent.js +26 -24
  28. package/dist/commands/portal/add-link.js +21 -17
  29. package/dist/commands/portal/clear-links.js +17 -15
  30. package/dist/commands/portal/create.js +25 -21
  31. package/dist/commands/portal/delete.js +31 -30
  32. package/dist/commands/portal/get.js +33 -31
  33. package/dist/commands/portal/index.js +30 -22
  34. package/dist/commands/portal/list.js +34 -30
  35. package/dist/commands/portal/update.js +41 -33
  36. package/dist/commands/whatsapp/broadcast.js +40 -37
  37. package/dist/commands/whatsapp/channels.js +40 -34
  38. package/dist/commands/whatsapp/chat.js +33 -32
  39. package/dist/commands/whatsapp/connect.js +59 -55
  40. package/dist/commands/whatsapp/delete-webhook.js +19 -17
  41. package/dist/commands/whatsapp/index.js +35 -25
  42. package/dist/commands/whatsapp/register-webhook.js +21 -19
  43. package/dist/commands/whatsapp/send-template.js +39 -31
  44. package/dist/commands/whatsapp/send.js +27 -23
  45. package/dist/commands/whatsapp/widget.js +35 -31
  46. package/dist/commands/workers/deploy.js +49 -44
  47. package/dist/commands/workers/index.js +28 -18
  48. package/dist/commands/workers/list.js +43 -35
  49. package/dist/commands/workers/logs.js +38 -32
  50. package/dist/commands/workers/remove.js +38 -37
  51. package/dist/commands/workers/secret.js +63 -58
  52. package/dist/commands/workers/test.js +44 -36
  53. package/dist/schemas/agent.config.schema.json +569 -0
  54. package/dist/studio/api/sseClient.js +97 -0
  55. package/dist/studio/api/studioApi.js +25 -0
  56. package/dist/studio/api/types.js +16 -0
  57. package/dist/studio/components/AgentPanel.js +35 -0
  58. package/dist/studio/components/App.js +214 -0
  59. package/dist/studio/components/ChatLog.js +59 -0
  60. package/dist/studio/components/Footer.js +11 -0
  61. package/dist/studio/components/Header.js +8 -0
  62. package/dist/studio/components/Input.js +15 -0
  63. package/dist/studio/components/Message.js +56 -0
  64. package/dist/studio/components/Suggestions.js +11 -0
  65. package/dist/studio/components/ToolCall.js +33 -0
  66. package/dist/studio/components/WhatsappConnectCard.js +57 -0
  67. package/dist/studio/index.js +42 -0
  68. package/dist/studio/render/json.js +16 -0
  69. package/dist/studio/render/markdown.js +32 -0
  70. package/dist/studio/render/steps.js +58 -0
  71. package/dist/studio/runOneShot.js +96 -0
  72. package/dist/studio/runRepl.js +52 -0
  73. package/dist/studio/slash/handlers.js +199 -0
  74. package/dist/studio/slash/parser.js +46 -0
  75. package/dist/studio/slash/registry.js +16 -0
  76. package/dist/studio/state/store.js +181 -0
  77. package/dist/studio/whatsapp/api.js +63 -0
  78. package/dist/studio/whatsapp/polling.js +77 -0
  79. package/dist/studio/whatsapp/types.js +31 -0
  80. package/dist/types/agent.js +1 -2
  81. package/dist/types/auth.js +1 -2
  82. package/dist/types/common.js +1 -2
  83. package/dist/types/message.js +1 -2
  84. package/dist/types/portal.js +1 -2
  85. package/dist/types/workers.js +1 -2
  86. package/dist/utils/agent-errors.js +46 -0
  87. package/dist/utils/api.js +8 -9
  88. package/dist/utils/banner.js +33 -34
  89. package/dist/utils/credentials.js +12 -20
  90. package/dist/utils/help.js +44 -0
  91. package/dist/utils/logger.js +13 -19
  92. package/dist/utils/ui.js +35 -49
  93. package/package.json +21 -10
  94. package/src/cli.ts +24 -8
  95. package/src/commands/agent/ai-config.ts +89 -34
  96. package/src/commands/agent/chat.ts +49 -37
  97. package/src/commands/agent/copy.ts +19 -13
  98. package/src/commands/agent/create.ts +32 -22
  99. package/src/commands/agent/delete.ts +24 -18
  100. package/src/commands/agent/enable-widget.ts +31 -23
  101. package/src/commands/agent/export.ts +72 -51
  102. package/src/commands/agent/files.ts +51 -39
  103. package/src/commands/agent/get.ts +86 -66
  104. package/src/commands/agent/index.ts +36 -18
  105. package/src/commands/agent/list.ts +22 -16
  106. package/src/commands/agent/monitor.ts +67 -56
  107. package/src/commands/agent/on-message.ts +36 -27
  108. package/src/commands/agent/set.ts +47 -37
  109. package/src/commands/agent/templates.ts +90 -82
  110. package/src/commands/agent/tools.ts +53 -47
  111. package/src/commands/agent/update.ts +28 -20
  112. package/src/commands/agent/validate.ts +135 -0
  113. package/src/commands/agent/wizard.ts +114 -114
  114. package/src/commands/auth/index.ts +3 -3
  115. package/src/commands/auth/login.ts +44 -29
  116. package/src/commands/auth/logout.ts +16 -10
  117. package/src/commands/auth/status.ts +14 -8
  118. package/src/commands/portal/add-agent.ts +23 -17
  119. package/src/commands/portal/add-link.ts +17 -9
  120. package/src/commands/portal/clear-links.ts +13 -7
  121. package/src/commands/portal/create.ts +20 -12
  122. package/src/commands/portal/delete.ts +28 -20
  123. package/src/commands/portal/get.ts +25 -19
  124. package/src/commands/portal/index.ts +22 -10
  125. package/src/commands/portal/list.ts +27 -19
  126. package/src/commands/portal/update.ts +38 -26
  127. package/src/commands/whatsapp/broadcast.ts +28 -18
  128. package/src/commands/whatsapp/channels.ts +31 -20
  129. package/src/commands/whatsapp/chat.ts +20 -12
  130. package/src/commands/whatsapp/connect.ts +48 -36
  131. package/src/commands/whatsapp/delete-webhook.ts +15 -9
  132. package/src/commands/whatsapp/index.ts +24 -10
  133. package/src/commands/whatsapp/register-webhook.ts +16 -10
  134. package/src/commands/whatsapp/send-template.ts +33 -21
  135. package/src/commands/whatsapp/send.ts +23 -15
  136. package/src/commands/whatsapp/widget.ts +25 -17
  137. package/src/commands/workers/deploy.ts +34 -22
  138. package/src/commands/workers/index.ts +21 -7
  139. package/src/commands/workers/list.ts +31 -19
  140. package/src/commands/workers/logs.ts +30 -20
  141. package/src/commands/workers/remove.ts +30 -22
  142. package/src/commands/workers/secret.ts +46 -34
  143. package/src/commands/workers/test.ts +34 -22
  144. package/src/schemas/agent.config.schema.json +569 -0
  145. package/src/studio/api/sseClient.ts +91 -0
  146. package/src/studio/api/studioApi.ts +27 -0
  147. package/src/studio/api/types.ts +96 -0
  148. package/src/studio/components/App.tsx +266 -0
  149. package/src/studio/components/ChatLog.tsx +95 -0
  150. package/src/studio/components/Footer.tsx +38 -0
  151. package/src/studio/components/Header.tsx +39 -0
  152. package/src/studio/components/Input.tsx +32 -0
  153. package/src/studio/components/Message.tsx +87 -0
  154. package/src/studio/components/Suggestions.tsx +26 -0
  155. package/src/studio/components/ToolCall.tsx +58 -0
  156. package/src/studio/components/WhatsappConnectCard.tsx +139 -0
  157. package/src/studio/index.ts +58 -0
  158. package/src/studio/render/markdown.ts +32 -0
  159. package/src/studio/render/steps.ts +57 -0
  160. package/src/studio/runOneShot.ts +114 -0
  161. package/src/studio/runRepl.tsx +76 -0
  162. package/src/studio/slash/handlers.ts +226 -0
  163. package/src/studio/slash/parser.ts +41 -0
  164. package/src/studio/slash/registry.ts +54 -0
  165. package/src/studio/state/store.ts +273 -0
  166. package/src/studio/whatsapp/api.ts +96 -0
  167. package/src/studio/whatsapp/polling.ts +93 -0
  168. package/src/studio/whatsapp/types.ts +80 -0
  169. package/src/types/agent.ts +1 -1
  170. package/src/types/auth.ts +4 -3
  171. package/src/types/portal.ts +1 -1
  172. package/src/types/workers.ts +1 -1
  173. package/src/utils/agent-errors.ts +67 -0
  174. package/src/utils/api.ts +6 -0
  175. package/src/utils/banner.ts +14 -9
  176. package/src/utils/credentials.ts +6 -5
  177. package/src/utils/help.ts +51 -0
  178. package/tsconfig.json +9 -6
@@ -0,0 +1,135 @@
1
+ import { Command } from 'commander';
2
+ import { readFileSync, existsSync } from 'node:fs';
3
+ import { resolve, dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import Ajv, { ErrorObject } from 'ajv';
6
+ import addFormats from 'ajv-formats';
7
+ import chalk from 'chalk';
8
+ import { logger } from '../../utils/logger.js';
9
+ import { addExamples } from '../../utils/help.js';
10
+
11
+ const __filename = fileURLToPath(import.meta.url);
12
+ const __dirname = dirname(__filename);
13
+
14
+ // El schema se copia a dist/schemas durante el build.
15
+ // Buscar primero en dist/schemas (produccion) y luego en src/schemas (dev/ts-node).
16
+ function loadSchema(): any {
17
+ const candidates = [
18
+ join(__dirname, '..', '..', 'schemas', 'agent.config.schema.json'), // dist/commands/agent -> dist/schemas
19
+ join(__dirname, '..', '..', '..', 'src', 'schemas', 'agent.config.schema.json'), // fallback dev
20
+ ];
21
+ for (const candidate of candidates) {
22
+ if (existsSync(candidate)) {
23
+ return JSON.parse(readFileSync(candidate, 'utf-8'));
24
+ }
25
+ }
26
+ throw new Error('No se encontro el schema agent.config.schema.json. Reinstala el CLI.');
27
+ }
28
+
29
+ // Traduce una ruta de AJV (e.g. "/actions/0/action/2") en migas legibles
30
+ // estilo "acciones -> 0 -> action -> 2".
31
+ function humanizePath(instancePath: string): string {
32
+ if (!instancePath || instancePath === '') return '(raiz)';
33
+ return instancePath
34
+ .replace(/^\//, '')
35
+ .split('/')
36
+ .filter(Boolean)
37
+ .join(' -> ');
38
+ }
39
+
40
+ function formatError(err: ErrorObject): string {
41
+ const path = humanizePath(err.instancePath);
42
+ const keyword = err.keyword;
43
+ let detail = err.message || 'error de validacion';
44
+
45
+ if (keyword === 'required' && err.params && (err.params as any).missingProperty) {
46
+ detail = `debe tener la propiedad requerida '${(err.params as any).missingProperty}'`;
47
+ } else if (keyword === 'enum' && err.params && (err.params as any).allowedValues) {
48
+ const allowed = (err.params as any).allowedValues as string[];
49
+ detail = `debe ser uno de: ${allowed.join(', ')}`;
50
+ } else if (keyword === 'type' && err.params && (err.params as any).type) {
51
+ detail = `debe ser de tipo ${(err.params as any).type}`;
52
+ } else if (keyword === 'minLength') {
53
+ detail = 'no puede estar vacio';
54
+ } else if (keyword === 'pattern') {
55
+ detail = `no cumple el patron ${(err.params as any).pattern}`;
56
+ }
57
+
58
+ return `${path}: ${detail}`;
59
+ }
60
+
61
+ export const validateCommand = new Command('validate')
62
+ .description('Validate an agent JSON file against the official schema')
63
+ .argument('<file>', 'Path to the agent JSON file')
64
+ .option('--strict', 'Fail on additional unknown properties', false)
65
+ .option('--raw', 'Print raw AJV errors as JSON', false)
66
+ .action(async (file: string, options: { strict: boolean; raw: boolean }) => {
67
+ try {
68
+ const filePath = resolve(process.cwd(), file);
69
+ if (!existsSync(filePath)) {
70
+ logger.error(`No existe el archivo: ${filePath}`);
71
+ process.exit(1);
72
+ }
73
+
74
+ let data: unknown;
75
+ try {
76
+ data = JSON.parse(readFileSync(filePath, 'utf-8'));
77
+ } catch (parseErr) {
78
+ const msg = parseErr instanceof Error ? parseErr.message : 'JSON invalido';
79
+ logger.error(`JSON con sintaxis invalida: ${msg}`);
80
+ process.exit(1);
81
+ }
82
+
83
+ const schema = loadSchema();
84
+ const ajv = new (Ajv as any)({
85
+ allErrors: true,
86
+ strict: false,
87
+ strictTypes: false,
88
+ });
89
+ (addFormats as any)(ajv);
90
+
91
+ const validate = ajv.compile(schema);
92
+ const ok = validate(data);
93
+
94
+ if (ok) {
95
+ console.log();
96
+ console.log(chalk.hex('#66BB6A')(' Schema valido'));
97
+ const name = (data as any)?.name ? ` (${(data as any).name})` : '';
98
+ console.log(chalk.gray(` El agente${name} cumple con el schema oficial.`));
99
+ console.log();
100
+ return;
101
+ }
102
+
103
+ // Filtrar errores AJV redundantes generados por allOf/if-then:
104
+ // "must match 'then' schema" siempre acompana a un error real con misma path.
105
+ const rawErrors: ErrorObject[] = validate.errors || [];
106
+ const errors = rawErrors.filter(e => e.keyword !== 'if' && !/match "then" schema/.test(e.message || ''));
107
+
108
+ if (options.raw) {
109
+ console.log(JSON.stringify(errors, null, 2));
110
+ process.exit(1);
111
+ }
112
+
113
+ console.log();
114
+ console.log(chalk.hex('#EF5350')(` Schema invalido (${errors.length} ${errors.length === 1 ? 'error' : 'errores'}):`));
115
+ console.log();
116
+ errors.forEach((err: ErrorObject, i: number) => {
117
+ console.log(chalk.hex('#EF5350')(` ${i + 1}. ${formatError(err)}`));
118
+ });
119
+ console.log();
120
+ console.log(chalk.gray(' Sugerencia: usa --raw para inspeccionar los errores AJV en JSON.'));
121
+ console.log();
122
+ process.exit(1);
123
+ } catch (error) {
124
+ const message = error instanceof Error ? error.message : 'Error desconocido';
125
+ logger.error(message);
126
+ process.exit(1);
127
+ }
128
+ });
129
+
130
+ addExamples(validateCommand, [
131
+ { description: 'Validate an exported agent file against the schema',
132
+ command: 'plazbot agent validate ./agent.json' },
133
+ { description: 'Print raw AJV errors as JSON for tooling',
134
+ command: 'plazbot agent validate ./agent.json --raw' },
135
+ ]);