Compare commits

...

1699 commits

Author SHA1 Message Date
Rodrigo Rodriguez (Pragmatismo)
b5bf44fd70 Update SystemKeywords.ts
Some checks failed
GBCI / build (push) Has been cancelled
2025-08-25 19:46:19 -03:00
Rodrigo Rodriguez (Pragmatismo)
864107fca0 Update SystemKeywords.ts
Some checks are pending
GBCI / build (push) Waiting to run
2025-08-25 19:33:51 -03:00
Rodrigo Rodriguez (Pragmatismo)
2695b54460 Refactor code formatting and adjust minor syntax errors
Some checks are pending
GBCI / build (push) Waiting to run
2025-08-25 19:32:31 -03:00
Rodrigo Rodriguez (Pragmatismo)
27dde0f4f0 Merge branch 'main' of https://alm.pragmatismo.com.br/GeneralBots/botserver
Some checks failed
GBCI / build (push) Failing after 18m55s
2025-08-23 21:40:54 -03:00
Rodrigo Rodriguez (Pragmatismo)
e6ec0d2e9e - Logo fix. 2025-08-23 21:39:03 -03:00
300b5dc258 Update templates/edu.gbai/edu.gbdialog/enrollment.bas
Some checks failed
GBCI / build (push) Failing after 24m25s
2025-08-10 20:59:06 +00:00
Rodrigo Rodriguez (Pragmatismo)
9201d7a262 refactor(SystemKeywords): comment out unused ID column logic for clarity
Some checks failed
GBCI / build (push) Failing after 12m30s
2025-08-05 14:17:38 -03:00
Rodrigo Rodriguez (Pragmatismo)
fb24bbd98e refactor(SystemKeywords): comment out unused ID column logic for clarity
Some checks are pending
GBCI / build (push) Waiting to run
2025-08-05 14:03:17 -03:00
Rodrigo Rodriguez (Pragmatismo)
58ebbe880c - TS updates.
Some checks failed
GBCI / build (push) Has been cancelled
2025-07-22 18:04:15 -03:00
Rodrigo Rodriguez (Pragmatismo)
d21b1747d6 refactor(SystemKeywords): comment out unused ID column logic for clarity
Some checks failed
GBCI / build (push) Failing after 11m21s
2025-07-19 22:48:11 -03:00
Rodrigo Rodriguez (Pragmatismo)
26eb714e2c refactor(SystemKeywords): comment out unused ID column logic for clarity
Some checks failed
GBCI / build (push) Failing after 10m30s
2025-07-19 22:27:47 -03:00
Rodrigo Rodriguez (Pragmatismo)
5c3b24dadd refactor(SystemKeywords): comment out unused ID column logic for clarity
Some checks failed
GBCI / build (push) Has been cancelled
2025-07-02 20:38:26 -03:00
Rodrigo Rodriguez (Pragmatismo)
a33ed106f7 refactor(SystemKeywords): comment out unused ID column logic for clarity
Some checks failed
GBCI / build (push) Failing after 8m12s
2025-06-27 15:37:04 -03:00
Rodrigo Rodriguez (Pragmatismo)
afe9e6c7ab refactor(SystemKeywords): comment out unused ID column logic for clarity
Some checks failed
GBCI / build (push) Has been cancelled
2025-06-27 15:31:11 -03:00
Rodrigo Rodriguez (Pragmatismo)
3afdbb1ddb fix(GBSSR): update packagePath logic to handle non-static URLs correctly
Some checks failed
GBCI / build (push) Failing after 8m30s
2025-06-27 13:31:32 -03:00
Rodrigo Rodriguez (Pragmatismo)
f245de43b2 fix: update Puppeteer launch options to use environment variables for headless mode and enhance enrollment confirmation messages
Some checks failed
GBCI / build (push) Failing after 8m24s
2025-06-27 12:46:15 -03:00
Rodrigo Rodriguez (Pragmatismo)
619a0e11b9 fix(WhatsappDirectLine): update sendFileToDevice to default isViewOnce to true and clean up header example
Some checks failed
GBCI / build (push) Failing after 7m41s
2025-06-24 14:54:28 -03:00
Rodrigo Rodriguez (Pragmatismo)
f71c803f2c fix(WhatsappDirectLine): update sendFileToDevice to default isViewOnce to true and clean up header example
Some checks failed
GBCI / build (push) Failing after 8m0s
2025-06-24 11:43:00 -03:00
Rodrigo Rodriguez (Pragmatismo)
3d5c30a3b0 fix(WhatsappDirectLine): update sendFileToDevice to default isViewOnce to true and clean up header example
Some checks failed
GBCI / build (push) Failing after 9m6s
2025-06-24 08:43:17 -03:00
Rodrigo Rodriguez (Pragmatismo)
9d95e4f8c1 fix(WhatsappDirectLine): update sendFileToDevice to default isViewOnce to true and clean up header example
Some checks failed
GBCI / build (push) Has been cancelled
2025-06-15 19:23:39 -03:00
Rodrigo Rodriguez (Pragmatismo)
cbdf3664bb fix(WhatsappDirectLine): update sendFileToDevice to default isViewOnce to true and clean up header example
Some checks are pending
GBCI / build (push) Waiting to run
2025-06-15 19:17:50 -03:00
Rodrigo Rodriguez (Pragmatismo)
0d5a4aee3c fix(WhatsappDirectLine): update sendFileToDevice to default isViewOnce to true and clean up header example
Some checks are pending
GBCI / build (push) Waiting to run
2025-06-15 19:00:45 -03:00
Rodrigo Rodriguez (Pragmatismo)
1d20dd83b0 fix(WhatsappDirectLine): streamline media handling and improve template creation
Some checks failed
GBCI / build (push) Has been cancelled
2025-06-12 11:50:14 -03:00
Rodrigo Rodriguez (Pragmatismo)
2e42c36ecb fix(WhatsappDirectLine): streamline media handling and improve template creation
Some checks are pending
GBCI / build (push) Waiting to run
2025-06-12 11:31:33 -03:00
Rodrigo Rodriguez (Pragmatismo)
2da1e99c0d fix(WhatsappDirectLine): comment out unused header component in message structure
Some checks are pending
GBCI / build (push) Waiting to run
2025-06-12 11:20:00 -03:00
Rodrigo Rodriguez (Pragmatismo)
30fa9ec5db fix(WhatsappDirectLine): comment out unused header component in message structure
Some checks are pending
GBCI / build (push) Waiting to run
2025-06-11 12:05:57 -03:00
Rodrigo Rodriguez (Pragmatismo)
e68eccffd4 fix(WhatsappDirectLine): comment out unused header component in message structure
Some checks are pending
GBCI / build (push) Waiting to run
2025-06-11 11:47:59 -03:00
Rodrigo Rodriguez (Pragmatismo)
910d78765a fix(WhatsappDirectLine): comment out unused header component in message structure
Some checks are pending
GBCI / build (push) Waiting to run
2025-06-11 11:08:15 -03:00
Rodrigo Rodriguez (Pragmatismo)
e17ad407ff fix(WhatsappDirectLine): comment out unused header component in message structure
Some checks are pending
GBCI / build (push) Waiting to run
2025-06-11 11:05:48 -03:00
Rodrigo Rodriguez (Pragmatismo)
75b0e0a9c8 fix(WhatsappDirectLine): add missing closing brace for header object in message structure
Some checks are pending
GBCI / build (push) Waiting to run
2025-06-11 10:28:13 -03:00
Rodrigo Rodriguez (Pragmatismo)
0b748d68fb fix(WhatsappDirectLine): add missing closing brace for header object in message structure
Some checks are pending
GBCI / build (push) Waiting to run
2025-06-11 10:05:39 -03:00
Rodrigo Rodriguez (Pragmatismo)
215bd1b699 fix(WhatsappDirectLine): refactor server status check and improve large file upload process with chunked uploads
Some checks are pending
GBCI / build (push) Waiting to run
2025-06-11 09:53:10 -03:00
Rodrigo Rodriguez (Pragmatismo)
aa606c0d90 fix(GBConversationalService, WhatsappDirectLine): update component structure to include header type and format
Some checks are pending
GBCI / build (push) Waiting to run
2025-06-11 09:40:58 -03:00
Rodrigo Rodriguez (Pragmatismo)
b0517c9c94 fix(WhatsappDirectLine): refactor large file upload process to improve error handling and add public URL registration
Some checks are pending
GBCI / build (push) Waiting to run
2025-06-11 09:33:34 -03:00
Rodrigo Rodriguez (Pragmatismo)
51831d2f24 fix(WhatsappDirectLine): refactor large file upload process to improve error handling and add public URL registration
Some checks are pending
GBCI / build (push) Waiting to run
2025-06-11 09:19:16 -03:00
Rodrigo Rodriguez (Pragmatismo)
25e688aed9 fix(WhatsappDirectLine): improve large file upload handling and error messages
Some checks are pending
GBCI / build (push) Waiting to run
2025-06-10 20:27:02 -03:00
Rodrigo Rodriguez (Pragmatismo)
f232bdbaac fix(KBService): update Puppeteer configuration for headless mode and executable path
Some checks failed
GBCI / build (push) Failing after 8s
fix(node.yaml): correct deployment paths and improve Node.js setup
fix(.gitignore): add 'botpoc' to ignored files
fix(SystemKeywords): enhance PDF conversion and image processing logic
fix(DialogKeywords): adjust Puppeteer launch options for better performance
fix(KeywordsExpressions): fix syntax error in PDF assignment
2025-06-09 19:51:05 -03:00
Rodrigo Rodriguez (Pragmatismo)
43242cb433 fix(KBService): update Puppeteer configuration for headless mode and executable path
fix(node.yaml): correct deployment paths and improve Node.js setup
fix(.gitignore): add 'botpoc' to ignored files
fix(SystemKeywords): enhance PDF conversion and image processing logic
fix(DialogKeywords): adjust Puppeteer launch options for better performance
fix(KeywordsExpressions): fix syntax error in PDF assignment
2025-06-09 19:48:24 -03:00
Rodrigo Rodriguez (Pragmatismo)
2b2ab3a42e fix(KBService): standardize formatting and improve code readability
All checks were successful
GBCI / build (push) Successful in 1m13s
2025-05-22 20:32:30 -03:00
Rodrigo Rodriguez (Pragmatismo)
e2382ccddc fix(KBService): standardize formatting and improve code readability
All checks were successful
GBCI / build (push) Successful in 1m1s
2025-05-22 18:56:30 -03:00
Rodrigo Rodriguez (Pragmatismo)
53710da2a7 fix(KBService): reduce timeout and max documents for crawling logic
All checks were successful
GBCI / build (push) Successful in 41s
2025-05-22 12:16:05 -03:00
Rodrigo Rodriguez (Pragmatismo)
4e6e34e978 fix(KBService): remove unnecessary skip variable in file processing logic
All checks were successful
GBCI / build (push) Successful in 3m22s
2025-05-22 11:14:10 -03:00
Rodrigo Rodriguez (Pragmatismo)
3abbec63a7 fix(KBService): remove unnecessary skip variable in file processing logic
All checks were successful
GBCI / build (push) Successful in 33s
2025-05-22 11:00:16 -03:00
Rodrigo Rodriguez (Pragmatismo)
b6ba7d5a3d fix(KBService): remove unnecessary skip variable in file processing logic
All checks were successful
GBCI / build (push) Successful in 38s
2025-05-22 10:55:32 -03:00
Rodrigo Rodriguez (Pragmatismo)
2f605f101c fix(KBService): remove unnecessary skip variable in file processing logic
All checks were successful
GBCI / build (push) Successful in 49s
2025-05-22 10:46:11 -03:00
Rodrigo Rodriguez (Pragmatismo)
2ee0f0f7ec fix(KBService): remove unnecessary skip variable in file processing logic
All checks were successful
GBCI / build (push) Successful in 1m30s
2025-05-22 10:41:43 -03:00
Rodrigo Rodriguez (Pragmatismo)
8d83dc214a fix(KBService): remove unnecessary skip variable in file processing logic
All checks were successful
GBCI / build (push) Successful in 50s
2025-05-13 23:10:42 -03:00
Rodrigo Rodriguez (Pragmatismo)
4c28404578 fix(KBService): update file processing logic to include additional file types
All checks were successful
GBCI / build (push) Successful in 1m13s
2025-05-13 22:43:47 -03:00
Rodrigo Rodriguez (Pragmatismo)
0f0f8d610e fix(KBService): skip processing of files in gbdata path
All checks were successful
GBCI / build (push) Successful in 47s
2025-05-13 22:33:29 -03:00
Rodrigo Rodriguez (Pragmatismo)
5e492d590e fix(KBService): enable concatenation of files from gbdata path
All checks were successful
GBCI / build (push) Successful in 1m13s
2025-05-13 22:19:18 -03:00
Rodrigo Rodriguez (Pragmatismo)
24d2b10afb feat(ChatServices): specify model as 'gpt-4' for improved performance
All checks were successful
GBCI / build (push) Successful in 1m26s
2025-05-12 09:20:28 -03:00
Rodrigo Rodriguez (Pragmatismo)
bb05685767 feat(ChatServices): specify model as 'gpt-4' for improved performance
All checks were successful
GBCI / build (push) Successful in 56s
2025-05-11 23:19:44 -03:00
Rodrigo Rodriguez (Pragmatismo)
83107fbf91 refactor(workflows): remove unnecessary .env file copy in deployment script
All checks were successful
GBCI / build (push) Successful in 57s
2025-05-11 22:44:30 -03:00
Rodrigo Rodriguez (Pragmatismo)
1ca61954a4 refactor(GBDeployer): simplify file type checks for downloading text files
Some checks failed
GBCI / build (push) Failing after 12s
2025-05-11 22:41:54 -03:00
Rodrigo Rodriguez (Pragmatismo)
c5f522d7d7 refactor(GBDeployer): simplify file type checks for downloading text files
All checks were successful
GBCI / build (push) Successful in 44s
2025-05-11 21:21:25 -03:00
Rodrigo Rodriguez (Pragmatismo)
f078881b0d feat(KeywordsExpressions, DialogKeywords, AdminDialog, GBDeployer, KBService): enhance functionality and improve file handling
All checks were successful
GBCI / build (push) Successful in 1m20s
2025-05-11 10:09:32 -03:00
Rodrigo Rodriguez (Pragmatismo)
1ef6cbb032 feat(KeywordsExpressions): add support for posting to Instagram with parameters
All checks were successful
GBCI / build (push) Successful in 2m2s
refactor(GBAdminService): improve folder name extraction logic
refactor(ImageProcessingServices): clean up whitespace and enhance image generation options
refactor(SystemKeywords): simplify rewrite prompt and logging
fix(ChatServices): correct spacing in model invocation
delete(marketing.gbai): remove outdated marketing poster template
add(marketing.gbai): create new marketing poster template with Instagram posting functionality
2025-05-09 21:19:14 -03:00
Rodrigo Rodriguez (Pragmatismo)
e3992b34af refactor(GBOService): remove unused imports for cleaner code
All checks were successful
GBCI / build (push) Successful in 50s
2025-04-30 14:19:00 -03:00
Rodrigo Rodriguez (Pragmatismo)
525703052d fix(DialogKeywords): comment out unused email headers in mail options
Some checks failed
GBCI / build (push) Has been cancelled
2025-04-30 14:18:32 -03:00
Rodrigo Rodriguez (Pragmatismo)
f34a4f25d0 feat(DialogKeywords): integrate Nodemailer for email sending functionality
All checks were successful
GBCI / build (push) Successful in 5m2s
2025-04-30 13:50:47 -03:00
Rodrigo Rodriguez (Pragmatismo)
7ababd7a80 feat(DialogKeywords): integrate Nodemailer for email sending functionality
Some checks failed
GBCI / build (push) Failing after 1m56s
2025-04-30 13:45:49 -03:00
Rodrigo Rodriguez (Pragmatismo)
320e401cad fix(GBMinService): update CORS origin to use HTTPS for improved security
All checks were successful
GBCI / build (push) Successful in 1m2s
2025-04-27 19:00:54 -03:00
Rodrigo Rodriguez (Pragmatismo)
2a61c07cd1 fix(GBMinService): update CORS origin to specific subdomain
All checks were successful
GBCI / build (push) Successful in 44s
2025-04-27 18:46:43 -03:00
Rodrigo Rodriguez (Pragmatismo)
b5034f9167 fix(GBMinService): add logging for meeting token requests and definition
All checks were successful
GBCI / build (push) Successful in 59s
2025-04-27 18:02:00 -03:00
Rodrigo Rodriguez (Pragmatismo)
c200456e38 fix(GBMinService): add logging for meeting token requests and definition
All checks were successful
GBCI / build (push) Successful in 1m15s
2025-04-26 21:44:02 -03:00
Rodrigo Rodriguez (Pragmatismo)
3ce1d1e152 fix(GBMinService): await token.toJwt() for proper JWT generation
All checks were successful
GBCI / build (push) Successful in 29s
2025-04-26 17:27:29 -03:00
Rodrigo Rodriguez (Pragmatismo)
b7f9c07faf fix(GBMinService): await token.toJwt() for proper JWT generation
All checks were successful
GBCI / build (push) Successful in 31s
2025-04-26 17:17:28 -03:00
Rodrigo Rodriguez (Pragmatismo)
7f7397b192 fix(dependencies): remove duplicate super-strong-password-generator entries in package.json
All checks were successful
GBCI / build (push) Successful in 2m36s
2025-04-26 17:01:02 -03:00
Rodrigo Rodriguez (Pragmatismo)
4db5e10b15 fix(workflow): clean up node_modules before installing production dependencies in BotServer
Some checks failed
GBCI / build (push) Failing after 2m32s
2025-04-26 16:56:38 -03:00
Rodrigo Rodriguez (Pragmatismo)
32183519d2 fix(workflow): enable npm ci command for production build in BotServer
Some checks failed
GBCI / build (push) Failing after 2m39s
2025-04-26 16:47:02 -03:00
Rodrigo Rodriguez (Pragmatismo)
a6e3722a2a fix(workflow): enable npm ci command for production build in BotServer
Some checks failed
GBCI / build (push) Failing after 2m56s
2025-04-26 16:40:42 -03:00
Rodrigo Rodriguez (Pragmatismo)
1b65edc213 feat(GBMinService): update dependencies to include livekit-server-sdk and AccessToken import
Some checks failed
GBCI / build (push) Failing after 37s
2025-04-26 16:14:53 -03:00
Rodrigo Rodriguez (Pragmatismo)
6f6dfca9c2 feat(GBMinService): add CORS header to meeting token endpoint
All checks were successful
GBCI / build (push) Successful in 37s
2025-04-26 15:25:35 -03:00
Rodrigo Rodriguez (Pragmatismo)
7175ab550b feat(GBMinService): add endpoint for generating meeting tokens with LiveKit
All checks were successful
GBCI / build (push) Successful in 1m29s
2025-04-26 15:15:57 -03:00
Rodrigo Rodriguez (Pragmatismo)
30460100d9 chore: remove deprecated files including deployment scripts, localization, and CI configurations
All checks were successful
GBCI / build (push) Successful in 1m4s
2025-04-25 02:24:52 -03:00
Rodrigo Rodriguez (Pragmatismo)
c6ddaa8ec9 chore: remove deprecated files including deployment scripts, localization, and CI configurations 2025-04-25 02:20:32 -03:00
Rodrigo Rodriguez (Pragmatismo)
4d850362d2 chore: remove unused image assets and update API URL in configuration 2025-04-25 01:46:35 -03:00
Rodrigo Rodriguez (Pragmatismo)
0cb49684e6 feat(GBMinService, MainService): integrate Stripe payment success handling and update dialog flow 2025-04-24 20:02:50 -03:00
Rodrigo Rodriguez (Pragmatismo)
feb7939387 feat(GBMinService, MainService): integrate Stripe payment success handling and update dialog flow 2025-04-24 19:52:06 -03:00
Rodrigo Rodriguez (Pragmatismo)
ec8b0d44df feat(GBMinService, MainService): integrate Stripe payment success handling and update dialog flow
All checks were successful
GBCI / build (push) Successful in 1m18s
2025-04-24 01:18:30 -03:00
Rodrigo Rodriguez (Pragmatismo)
e3ac4f58b3 refactor(GBOService, MainModel): clean up code and enhance model structure for better clarity and maintainability
All checks were successful
GBCI / build (push) Successful in 1m30s
2025-04-21 22:29:26 -03:00
Rodrigo Rodriguez (Pragmatismo)
9e08cb5e64 fix(SystemKeywords): enhance save method to support CSV files and improve row update logic
All checks were successful
GBCI / build (push) Successful in 1m5s
2025-04-19 22:34:42 -03:00
Rodrigo Rodriguez (Pragmatismo)
d4ad69c4b0 fix(DialogKeywords): modify file naming convention for improved clarity
All checks were successful
GBCI / build (push) Successful in 30s
2025-04-19 14:44:40 -03:00
Rodrigo Rodriguez (Pragmatismo)
b5369ad15c fix(DialogKeywords): update file writing method and adjust WhatsApp file sending logic
All checks were successful
GBCI / build (push) Successful in 39s
2025-04-19 14:39:21 -03:00
Rodrigo Rodriguez (Pragmatismo)
4f8067108f fix(DialogKeywords): update file writing method and adjust WhatsApp file sending logic
All checks were successful
GBCI / build (push) Successful in 29s
2025-04-19 14:36:48 -03:00
Rodrigo Rodriguez (Pragmatismo)
a003f5297c fix(DialogKeywords): update file writing method and adjust WhatsApp file sending logic
All checks were successful
GBCI / build (push) Successful in 46s
2025-04-19 14:33:58 -03:00
Rodrigo Rodriguez (Pragmatismo)
638534e31f fix(DialogKeywords): update file writing method and adjust WhatsApp file sending logic
All checks were successful
GBCI / build (push) Successful in 37s
2025-04-19 14:27:23 -03:00
Rodrigo Rodriguez (Pragmatismo)
7c05a95054 fix(DialogKeywords): update file writing method and adjust WhatsApp file sending logic
All checks were successful
GBCI / build (push) Successful in 28s
2025-04-19 14:20:15 -03:00
Rodrigo Rodriguez (Pragmatismo)
47e3c7648b fix(DialogKeywords): update file writing method and adjust WhatsApp file sending logic
All checks were successful
GBCI / build (push) Successful in 35s
2025-04-19 14:13:53 -03:00
Rodrigo Rodriguez (Pragmatismo)
d55a16aa80 fix(workflow): add logging for file copying in node.yaml
All checks were successful
GBCI / build (push) Successful in 1m3s
2025-04-19 14:05:43 -03:00
Rodrigo Rodriguez (Pragmatismo)
2feee016ca fix(workflow): add logging for file copying in node.yaml
All checks were successful
GBCI / build (push) Successful in 28s
2025-04-19 13:37:55 -03:00
Rodrigo Rodriguez (Pragmatismo)
9fe9444c69 fix(workflow): comment out Node.js setup and adjust build commands in node.yaml
All checks were successful
GBCI / build (push) Successful in 30s
2025-04-19 13:36:07 -03:00
Rodrigo Rodriguez (Pragmatismo)
84f2b7bd9b fix(ChatServices): update prompt message for clarity on tool results
All checks were successful
GBCI / build (push) Successful in 2m28s
2025-04-19 13:32:53 -03:00
Rodrigo Rodriguez (Pragmatismo)
449774c2d2 fix(ChatServices): update prompt message for clarity on tool results
All checks were successful
GBCI / build (push) Successful in 8m37s
2025-04-19 13:21:41 -03:00
Rodrigo Rodriguez (Pragmatismo)
827b4451a8 fix(ChatServices): enhance logging and clarify response instructions
All checks were successful
GBCI / build (push) Successful in 8m22s
2025-04-19 12:39:25 -03:00
Rodrigo Rodriguez (Pragmatismo)
46176fe2f3 fix(workflow): streamline botserver restart process in node.yaml
All checks were successful
GBCI / build (push) Successful in 8m35s
2025-04-19 12:14:18 -03:00
Rodrigo Rodriguez (Pragmatismo)
c599932c10 fix(workflow): ensure BotServer directory is created before copying files
Some checks failed
GBCI / build (push) Has been cancelled
2025-04-19 11:48:09 -03:00
Rodrigo Rodriguez (Pragmatismo)
b6be0b5418 fix(workflow): ensure BotServer directory is created before copying files
Some checks failed
GBCI / build (push) Has been cancelled
2025-04-19 11:36:07 -03:00
Rodrigo Rodriguez (Pragmatismo)
bc5e18c4f0 fix(workflow): ensure BotServer directory is created before copying files
Some checks failed
GBCI / build (push) Has been cancelled
2025-04-19 11:14:26 -03:00
Rodrigo Rodriguez (Pragmatismo)
380f2ce83a fix(workflow): ensure BotServer directory is created before copying files
All checks were successful
GBCI / build (push) Successful in 6m33s
2025-04-19 01:42:51 -03:00
Rodrigo Rodriguez (Pragmatismo)
8e58038295 fix(workflow): ensure BotServer directory is created before copying files
All checks were successful
GBCI / build (push) Successful in 8m8s
2025-04-19 01:12:54 -03:00
Rodrigo Rodriguez (Pragmatismo)
79ca7e1da0 fix(workflow): update node.yaml to correctly copy .env file to deployment location
Some checks failed
GBCI / build (push) Failing after 18s
2025-04-19 01:09:16 -03:00
Rodrigo Rodriguez (Pragmatismo)
0364526fc6 fix(workflow): update node.yaml to run npm start in the background
Some checks failed
GBCI / build (push) Failing after 1m3s
2025-04-19 00:24:43 -03:00
Rodrigo Rodriguez (Pragmatismo)
ce78abdceb fix(workflow): update node.yaml to run npm start in the background
Some checks failed
GBCI / build (push) Failing after 3m19s
2025-04-18 23:48:26 -03:00
Rodrigo Rodriguez (Pragmatismo)
bc0aa7627e feat: update dependencies and improve file handling in GBVMService
Some checks failed
GBCI / build (push) Failing after 3m57s
2025-04-18 22:20:33 -03:00
Rodrigo Rodriguez (Pragmatismo)
ea224b4937 feat: add bcrypt for password hashing and comparison utilities
Some checks failed
GBCI / build (push) Failing after 3m46s
2025-04-17 21:45:46 -03:00
Rodrigo Rodriguez (Pragmatismo)
31b7d5d59e fix(GBMinService): comment out file writing to prevent overwriting bot manifest
Some checks failed
GBCI / build (push) Failing after 1h26m41s
2025-04-17 16:21:02 -03:00
Rodrigo Rodriguez (Pragmatismo)
87802e4249 fix(SystemKeywords): update file writing to use Uint8Array for buffer consistency
Some checks failed
GBCI / build (push) Has been cancelled
2025-04-17 16:15:27 -03:00
Rodrigo Rodriguez (Pragmatismo)
eb9ddb7ead feat(SystemKeywords): integrate MinIO client for file retrieval in gbcluster mode
Some checks failed
GBCI / build (push) Failing after 4m47s
2025-04-17 15:05:09 -03:00
Rodrigo Rodriguez (Pragmatismo)
d2851aabd6 feat(DialogKeywords): integrate MinIO client for file handling in gbcluster mode
Some checks failed
GBCI / build (push) Failing after 3h14m23s
2025-04-15 13:56:56 -03:00
Rodrigo Rodriguez (Pragmatismo)
7035c6799f feat(DialogKeywords): integrate MinIO client for file handling in gbcluster mode
Some checks failed
GBCI / build (push) Failing after 4m4s
2025-04-15 13:46:02 -03:00
Rodrigo Rodriguez (Pragmatismo)
0a69ff1d8b feat(DialogKeywords): integrate MinIO client for file handling in gbcluster mode
Some checks failed
GBCI / build (push) Has been cancelled
2025-04-15 13:30:42 -03:00
Rodrigo Rodriguez (Pragmatismo)
ffdea65c59 feat(DialogKeywords): integrate MinIO client for file handling in gbcluster mode
Some checks failed
GBCI / build (push) Failing after 4m16s
2025-04-15 13:19:51 -03:00
Rodrigo Rodriguez (Pragmatismo)
6d75b4997b fix: update URLs and email addresses to reflect new domain 2025-04-15 12:49:05 -03:00
Rodrigo Rodriguez (Pragmatismo)
6e141e25a7 fix(app): comment out boot instance creation and saving in legacy mode
Some checks failed
GBCI / build (push) Failing after 2h8m50s
2025-04-04 19:11:12 -03:00
Rodrigo Rodriguez (Pragmatismo)
70c2d7c0d5 fix(app): comment out boot instance creation and saving in legacy mode
Some checks failed
GBCI / build (push) Has been cancelled
2025-04-04 18:34:57 -03:00
Rodrigo Rodriguez (Pragmatismo)
8ffc62ed67 fix(app): comment out boot instance creation and saving in legacy mode
Some checks failed
GBCI / build (push) Has been cancelled
2025-04-04 18:27:39 -03:00
Rodrigo Rodriguez (Pragmatismo)
97862e54a5 fix(app): comment out boot instance creation and saving in legacy mode
All checks were successful
GBCI / build (push) Successful in 6m44s
2025-04-04 16:14:08 -03:00
Rodrigo Rodriguez (Pragmatismo)
7594cea1e0 fix(services): add ordering to GuaribasInstance query in GBCoreService
Some checks failed
GBCI / build (push) Failing after 3h10m7s
2025-04-03 14:53:05 -03:00
Rodrigo Rodriguez (Pragmatismo)
56504beea3 fix(services): add ordering to GuaribasInstance query in GBCoreService
Some checks failed
GBCI / build (push) Failing after 7m1s
2025-04-03 14:20:08 -03:00
Rodrigo Rodriguez (Pragmatismo)
081cd8a8b6 fix(services): add ordering to GuaribasInstance query in GBCoreService
Some checks failed
GBCI / build (push) Failing after 1h49m6s
2025-03-30 00:20:44 -03:00
Rodrigo Rodriguez (Pragmatismo)
e300fcda60 fix(services): change script file extension from .docx to .vbs in KBService
Some checks failed
GBCI / build (push) Failing after 8m50s
2025-03-30 00:07:05 -03:00
Rodrigo Rodriguez (Pragmatismo)
2617409867 fix(services): add ordering to GuaribasInstance query in GBCoreService
Some checks failed
GBCI / build (push) Has been cancelled
2025-03-29 23:12:53 -03:00
Rodrigo Rodriguez (Pragmatismo)
905dc5642e fix(services): add ordering to GuaribasInstance query in GBCoreService
Some checks failed
GBCI / build (push) Has been cancelled
2025-03-29 22:11:57 -03:00
Rodrigo Rodriguez (Pragmatismo)
0d89750a57 fix(services): update condition in GBMinService to simplify WhatsApp Direct Line setup
Some checks failed
GBCI / build (push) Has been cancelled
2025-03-29 20:38:55 -03:00
Rodrigo Rodriguez (Pragmatismo)
ba750a289f fix(services): refactor GBOService instantiation and update template listing logic
Some checks failed
GBCI / build (push) Has been cancelled
2025-03-29 20:27:22 -03:00
Rodrigo Rodriguez (Pragmatismo)
0e74502cc1 fix(services): refactor GBOService instantiation and update template listing logic 2025-03-29 11:03:46 -03:00
Rodrigo Rodriguez (Pragmatismo)
61d8cfe93c fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
Some checks failed
GBCI / build (push) Failing after 3h13m32s
2025-03-28 10:24:41 -03:00
Rodrigo Rodriguez (Pragmatismo)
dbc1611b74 fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
Some checks failed
GBCI / build (push) Has been cancelled
2025-03-28 09:27:15 -03:00
Rodrigo Rodriguez (Pragmatismo)
e7241cde67 fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
All checks were successful
GBCI / build (push) Successful in 0s
2025-03-28 09:20:12 -03:00
Rodrigo Rodriguez (Pragmatismo)
a8f4643d9c fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
Some checks failed
GBCI / build (push) Failing after 0s
2025-03-28 09:19:10 -03:00
Rodrigo Rodriguez (Pragmatismo)
d3c62ba406 fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
Some checks failed
GBCI / build (push) Failing after 0s
2025-03-28 09:18:37 -03:00
Rodrigo Rodriguez (Pragmatismo)
dd14d83f98 fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
Some checks failed
GBCI / build (push) Failing after 0s
2025-03-28 09:18:08 -03:00
Rodrigo Rodriguez (Pragmatismo)
3ab6b9c8e7 fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
All checks were successful
GBCI / build (push) Successful in 5s
2025-03-28 09:17:08 -03:00
Rodrigo Rodriguez (Pragmatismo)
5f2472ced2 fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
Some checks failed
GBCI / build (push) Failing after 19s
2025-03-28 09:16:14 -03:00
Rodrigo Rodriguez (Pragmatismo)
c07fd1cbd8 fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
All checks were successful
GBCI / build (push) Successful in 0s
2025-03-28 09:15:50 -03:00
Rodrigo Rodriguez (Pragmatismo)
672d8b905f fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
All checks were successful
GBCI / build (push) Successful in 0s
2025-03-28 09:14:55 -03:00
Rodrigo Rodriguez (Pragmatismo)
277ce61619 fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
All checks were successful
GBCI / build (push) Successful in 0s
2025-03-28 09:13:15 -03:00
Rodrigo Rodriguez (Pragmatismo)
337848b241 fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
All checks were successful
GBCI / build (push) Successful in 4s
2025-03-28 09:11:28 -03:00
Rodrigo Rodriguez (Pragmatismo)
00ed68281e fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
All checks were successful
GBCI / build (push) Successful in 0s
2025-03-28 09:09:08 -03:00
Rodrigo Rodriguez (Pragmatismo)
9d44b7f3f5 fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
All checks were successful
GBCI / build (push) Successful in 0s
2025-03-28 09:08:37 -03:00
Rodrigo Rodriguez (Pragmatismo)
7835a8ede8 fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
All checks were successful
GBCI / build (push) Successful in 1s
2025-03-28 09:01:06 -03:00
Rodrigo Rodriguez (Pragmatismo)
8742c736a4 fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
All checks were successful
GBCI / build (push) Successful in 0s
2025-03-28 08:59:25 -03:00
Rodrigo Rodriguez (Pragmatismo)
935503400d fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
All checks were successful
GBCI / build (push) Successful in 1s
2025-03-28 08:57:41 -03:00
Rodrigo Rodriguez (Pragmatismo)
d30ec7e85b fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
All checks were successful
GBCI / build (push) Successful in 0s
2025-03-28 08:49:06 -03:00
Rodrigo Rodriguez (Pragmatismo)
83bd0f5b13 fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
All checks were successful
GBCI / build (push) Successful in 0s
2025-03-28 08:45:50 -03:00
Rodrigo Rodriguez (Pragmatismo)
60d4028cf5 fix(workflows): clean up node.yaml by removing unnecessary commented-out commands
Some checks failed
GBCI / build (push) Failing after 2m29s
2025-03-28 08:42:24 -03:00
Rodrigo Rodriguez (Pragmatismo)
a533e1fbd9 fix(services): remove unnecessary comments and improve URL configuration in GBCoreService and GBMinService
Some checks failed
GBCI / build (push) Failing after 0s
2025-03-28 08:40:46 -03:00
Rodrigo Rodriguez (Pragmatismo)
42b718a4b3 fix(services): remove unnecessary comments and improve URL configuration in GBCoreService and GBMinService
All checks were successful
GBCI / build (push) Successful in 0s
2025-03-28 08:39:06 -03:00
Rodrigo Rodriguez (Pragmatismo)
759caba765 fix(services): remove unnecessary comments and improve URL configuration in GBCoreService and GBMinService
All checks were successful
GBCI / build (push) Successful in 6m13s
2025-03-28 08:03:30 -03:00
Rodrigo Rodriguez (Pragmatismo)
1b6dcb061b fix(services): remove unnecessary comments and improve URL configuration in GBCoreService and GBMinService
All checks were successful
GBCI / build (push) Successful in 5m13s
2025-03-28 07:48:50 -03:00
Rodrigo Rodriguez (Pragmatismo)
98e6badbb2 fix(workflows): clean up node.yaml by removing unnecessary whitespace
All checks were successful
GBCI / build (push) Successful in 5m56s
2025-03-28 07:35:45 -03:00
Rodrigo Rodriguez (Pragmatismo)
8584e43cc7 fix(workflows): clean up node.yaml by removing unnecessary whitespace
All checks were successful
GBCI / build (push) Successful in 6m4s
2025-03-28 07:14:35 -03:00
Rodrigo Rodriguez (Pragmatismo)
49203c3abb fix(workflows): clean up node.yaml by removing unnecessary whitespace
All checks were successful
GBCI / build (push) Successful in 4m53s
2025-03-26 23:39:06 -03:00
Rodrigo Rodriguez (Pragmatismo)
1421600cc5 fix(workflows): clean up node.yaml by removing unnecessary whitespace
Some checks failed
GBCI / build (push) Failing after 4m14s
2025-03-26 23:33:23 -03:00
Rodrigo Rodriguez (Pragmatismo)
294efd42f1 fix(workflows): clean up node.yaml by removing unnecessary whitespace
Some checks failed
GBCI / build (push) Failing after 3m41s
2025-03-26 23:24:58 -03:00
Rodrigo Rodriguez (Pragmatismo)
d921be4435 fix(workflows): clean up node.yaml by removing unnecessary whitespace
Some checks failed
GBCI / build (push) Failing after 7m32s
2025-03-26 22:56:02 -03:00
Rodrigo Rodriguez (Pragmatismo)
195ac0e411 fix(workflows): clean up node.yaml by removing unnecessary whitespace
Some checks failed
GBCI / build (push) Failing after 9s
2025-03-26 22:41:47 -03:00
Rodrigo Rodriguez (Pragmatismo)
296365ea3f fix(workflows): clean up node.yaml by removing unnecessary whitespace
Some checks failed
GBCI / build (push) Failing after 17s
2025-03-26 22:36:40 -03:00
Rodrigo Rodriguez (Pragmatismo)
3a1af21e6f fix(workflows): clean up node.yaml by removing unnecessary whitespace
Some checks failed
GBCI / build (push) Failing after 27s
2025-03-26 21:43:49 -03:00
Rodrigo Rodriguez (Pragmatismo)
7326727540 fix(workflows): clean up node.yaml by removing unnecessary whitespace
Some checks failed
GBCI / build (push) Failing after 31s
2025-03-26 21:36:37 -03:00
Rodrigo Rodriguez (Pragmatismo)
f2bf5bc047 fix(workflows): clean up node.yaml by removing unnecessary whitespace
Some checks failed
GBCI / build (push) Failing after 38s
2025-03-26 21:29:00 -03:00
Rodrigo Rodriguez (Pragmatismo)
b7c34446da fix(workflows): clean up node.yaml by removing unnecessary whitespace 2025-03-26 20:56:10 -03:00
Rodrigo Rodriguez (Pragmatismo)
337f93848f fix(workflows): change build runner from CI to gbo 2025-03-26 20:35:27 -03:00
Rodrigo Rodriguez (Pragmatismo)
c3ea648279 fix(workflows): change build runner from CI to gbo 2025-03-26 20:34:11 -03:00
Rodrigo Rodriguez (Pragmatismo)
d83bb86af3 fix(workflows): change build runner from CI to gbo 2025-03-26 20:29:33 -03:00
Rodrigo Rodriguez (Pragmatismo)
47debcf2e7 fix(workflows): change build runner from CI to gbo
Some checks failed
GBCI / build (push) Failing after 1m26s
2025-03-26 19:50:42 -03:00
Rodrigo Rodriguez (Pragmatismo)
dbdb75c4d6 delete: Remove issue and pull request templates
Some checks are pending
GBCI / build (push) Waiting to run
2025-03-26 19:49:41 -03:00
Rodrigo Rodriguez (Pragmatismo)
c80eabb066 delete: Remove issue and pull request templates
Some checks are pending
GBCI / build (push) Waiting to run
2025-03-26 19:46:19 -03:00
Rodrigo Rodriguez (Pragmatismo)
5fe45a04f7 new(all): Removal of OneDrive dependencies. 2025-03-05 22:09:05 -03:00
Rodrigo Rodriguez
e557eaa24f new(whatsapp.gblib): FB Analytics. 2025-02-16 21:47:03 -03:00
Rodrigo Rodriguez
8cdc814199 new(whatsapp.gblib): FB Analytics. 2025-02-16 21:41:38 -03:00
Rodrigo Rodriguez
beffc53463 new(whatsapp.gblib): FB Analytics. 2025-02-16 21:01:10 -03:00
Rodrigo Rodriguez
4521f6c342 new(whatsapp.gblib): FB Analytics. 2025-02-16 20:56:01 -03:00
Rodrigo Rodriguez
bb3a6a7a84 new(whatsapp.gblib): FB Analytics. 2025-02-16 20:53:04 -03:00
Rodrigo Rodriguez
592c25492d new(whatsapp.gblib): FB Analytics. 2025-02-16 20:47:16 -03:00
Rodrigo Rodriguez
23ed6f8932 new(whatsapp.gblib): FB Analytics. 2025-02-16 20:34:54 -03:00
Rodrigo Rodriguez
0f2f369a2b new(whatsapp.gblib): FB Analytics. 2025-02-16 20:26:09 -03:00
Rodrigo Rodriguez
d5d0f235a7 new(whatsapp.gblib): FB Analytics. 2025-02-16 19:29:53 -03:00
Rodrigo Rodriguez
091c9825bf new(whatsapp.gblib): FB Analytics. 2025-02-16 19:27:57 -03:00
Rodrigo Rodriguez
5183a2bdca new(whatsapp.gblib): FB Analytics. 2025-02-16 19:23:18 -03:00
Rodrigo Rodriguez
be3ba92429 new(whatsapp.gblib): FB Analytics. 2025-02-16 19:21:09 -03:00
Rodrigo Rodriguez
fe1f5d5150 new(whatsapp.gblib): FB Analytics. 2025-02-16 19:13:10 -03:00
Rodrigo Rodriguez
760cb807cc new(whatsapp.gblib): FB Analytics. 2025-02-16 19:08:26 -03:00
Rodrigo Rodriguez
b9db5840c9 new(whatsapp.gblib): FB Analytics. 2025-02-16 19:04:10 -03:00
Rodrigo Rodriguez
b8a9740792 new(whatsapp.gblib): FB Analytics. 2025-02-16 18:56:07 -03:00
Rodrigo Rodriguez
8a8884da64 new(whatsapp.gblib): FB Analytics. 2025-02-16 18:42:16 -03:00
Rodrigo Rodriguez
9978e35f33 new(whatsapp.gblib): FB Analytics. 2025-02-16 18:28:09 -03:00
Rodrigo Rodriguez
ffd7b52ade new(whatsapp.gblib): FB Analytics. 2025-02-16 18:24:08 -03:00
Rodrigo Rodriguez
a693265cb1 new(whatsapp.gblib): FB Analytics. 2025-02-16 18:22:14 -03:00
Rodrigo Rodriguez
614539a0b4 new(whatsapp.gblib): FB Analytics. 2025-02-16 18:16:14 -03:00
Rodrigo Rodriguez
292d396eeb new(whatsapp.gblib): FB Analytics. 2025-02-16 18:09:46 -03:00
Rodrigo Rodriguez
36667b5c4b new(whatsapp.gblib): FB Analytics. 2025-02-16 18:05:06 -03:00
Rodrigo Rodriguez
61e72cd186 new(whatsapp.gblib): FB Analytics. 2025-02-16 17:57:01 -03:00
Rodrigo Rodriguez
52dbc5a109 new(whatsapp.gblib): FB Analytics. 2025-02-16 10:54:42 -03:00
Rodrigo Rodriguez
4010fca0cf fix(whatsapp.gblib): Fixed audio with IBM Watson. 2025-02-02 18:42:45 -03:00
Rodrigo Rodriguez
f5a383dd1a fix(whatsapp.gblib): Fixed audio with IBM Watson. 2025-02-02 18:29:58 -03:00
Rodrigo Rodriguez
a6d3ec38b3 fix(whatsapp.gblib): Fixed audio with IBM Watson. 2025-02-02 17:44:25 -03:00
Rodrigo Rodriguez
54b2b6a56e fix(whatsapp.gblib): Fixed audio with IBM Watson. 2025-02-02 17:06:43 -03:00
Rodrigo Rodriguez
a654b9a35c fix(whatsapp.gblib): Fixed check status. 2025-01-27 11:37:41 -03:00
Rodrigo Rodriguez
e17f4c8800 fix(whatsapp.gblib): Fixed check status. 2025-01-27 10:57:47 -03:00
Rodrigo Rodriguez
8aff53ef86 fix(whatsapp.gblib): Fixed check status. 2025-01-27 10:55:04 -03:00
Rodrigo Rodriguez
8028c821cb fix(whatsapp.gblib): Fixed check status. 2025-01-27 10:49:57 -03:00
Rodrigo Rodriguez
fb5aeca78c fix(kb.gblib): Fixed crawler. 2025-01-19 16:06:43 -03:00
Rodrigo Rodriguez
8ae34432b9 new(kb.gblib): added postgres. 2025-01-17 16:48:45 -03:00
Rodrigo Rodriguez
fbedd78c74 new(kb.gblib): added postgres. 2025-01-17 16:28:40 -03:00
Rodrigo Rodriguez
d3ae8dd487 new(kb.gblib): added postgres. 2025-01-16 05:47:28 -03:00
Rodrigo Rodriguez
ded9026e91 new(kb.gblib): added postgres. 2025-01-16 05:42:50 -03:00
Rodrigo Rodriguez
4298303ea4 new(kb.gblib): added postgres. 2025-01-16 05:29:53 -03:00
Rodrigo Rodriguez
632010310b new(kb.gblib): added postgres. 2025-01-16 05:22:48 -03:00
Rodrigo Rodriguez
f6a1cf2820 new(kb.gblib): added postgres. 2025-01-16 05:12:08 -03:00
Rodrigo Rodriguez
41803803d5 new(kb.gblib): added postgres. 2025-01-16 05:07:35 -03:00
Rodrigo Rodriguez
745819b732 new(kb.gblib): added postgres. 2025-01-16 04:59:22 -03:00
Rodrigo Rodriguez
57b83aba2b new(kb.gblib): added postgres. 2025-01-16 04:53:05 -03:00
Rodrigo Rodriguez
c97a6ec0bf new(kb.gblib): added postgres. 2025-01-16 04:48:12 -03:00
Rodrigo Rodriguez
b751dbb418 new(kb.gblib): added postgres. 2025-01-16 04:34:43 -03:00
Rodrigo Rodriguez
fc7c4c5be1 new(kb.gblib): added postgres. 2025-01-16 02:52:59 -03:00
Rodrigo Rodriguez
76a4656ad6 new(kb.gblib): added postgres. 2025-01-16 02:51:30 -03:00
Rodrigo Rodriguez
e32261ec1d new(kb.gblib): added postgres. 2025-01-16 02:38:18 -03:00
Rodrigo Rodriguez
5817f5ead6 new(kb.gblib): added postgres. 2025-01-16 02:31:07 -03:00
Rodrigo Rodriguez
31301e29bc new(kb.gblib): added postgres. 2025-01-16 02:23:52 -03:00
Rodrigo Rodriguez
4be13899f5 new(kb.gblib): added postgres. 2025-01-16 02:11:12 -03:00
Rodrigo Rodriguez
284cdac428 Merge branch 'main' of https://github.com/GeneralBots/BotServer into main 2025-01-01 21:33:57 -03:00
Rodrigo Rodriguez
d39200568b fix(kb.gblib): fix in crawler. 2025-01-01 21:33:56 -03:00
Rodrigo Rodriguez
6d7e8ff909
Update README.md 2024-12-22 14:45:07 -03:00
Rodrigo Rodriguez
c83fa6d74b
Update README.md 2024-12-22 14:41:43 -03:00
Rodrigo Rodriguez
3bd3d72b48
Update README.md 2024-12-22 14:41:19 -03:00
Rodrigo Rodriguez
2275f34291
Merge pull request #437 from GeneralBots/rodrigorodriguez-patch-6
Update README.md
2024-12-22 14:34:40 -03:00
Rodrigo Rodriguez
ab54059d2b
Update README.md 2024-12-22 14:34:16 -03:00
Rodrigo Rodriguez
996caba2df
Add files via upload 2024-12-22 14:32:30 -03:00
Rodrigo Rodriguez
50cfc07966
Merge pull request #436 from GeneralBots/rodrigorodriguez-patch-5
Update README.md
2024-12-22 14:31:28 -03:00
Rodrigo Rodriguez
484027377a
Update README.md 2024-12-22 14:31:05 -03:00
Rodrigo Rodriguez
5be2294893
Merge pull request #435 from GeneralBots/rodrigorodriguez-patch-4
Update README.md
2024-12-22 14:28:14 -03:00
Rodrigo Rodriguez
ac8ae2ecdd
Update README.md 2024-12-22 14:27:55 -03:00
Rodrigo Rodriguez
3981777a05 new(online.gbui): UI OK. 2024-12-21 20:23:44 -03:00
Rodrigo Rodriguez
d694038532 fix(kb.gbapp): HTML crawler improved. 2024-12-15 16:27:40 -03:00
Rodrigo Rodriguez
5d0a58ee6d new(kb.gbapp): Avif format added. 2024-12-15 10:27:46 -03:00
Rodrigo Rodriguez
81f0a188ad new(kb.gbapp): Avif format added. 2024-12-15 10:17:22 -03:00
Rodrigo Rodriguez
1b40778d5e fix(llm.gblib): Talk to data local db use fix. 2024-12-12 09:55:51 -03:00
Rodrigo Rodriguez
9cebd81a37 fix(llm.gblib): Talk to data local db use fix. 2024-12-12 09:46:31 -03:00
Rodrigo Rodriguez
173d473166 fix(llm.gblib): Talk to data local db use fix. 2024-12-10 15:57:21 -03:00
Rodrigo Rodriguez
36411f4243 fix(llm.gblib): Talk to data local db use fix. 2024-12-10 15:46:18 -03:00
Rodrigo Rodriguez
f9f7e0c955 fix(llm.gblib): Talk to data local db use fix. 2024-12-10 15:43:28 -03:00
Rodrigo Rodriguez
a71d8983b1 fix(llm.gblib): Fix in doc. publishing. 2024-12-10 15:40:52 -03:00
Rodrigo Rodriguez
93c6c51f3a fix(llm.gblib): Fix in doc. publishing. 2024-12-09 08:07:34 -03:00
Rodrigo Rodriguez
619d094886 fix(llm.gblib): Fix in doc. publishing. 2024-12-03 22:09:27 -03:00
Rodrigo Rodriguez
6168275d92 fix(llm.gblib): Fix in doc. publishing. 2024-12-03 21:43:28 -03:00
Rodrigo Rodriguez
a443927d36 fix(llm.gblib): Fix in doc. publishing. 2024-12-03 19:56:39 -03:00
Rodrigo Rodriguez
e7ad6e84ca fix(llm.gblib): Fix in doc. publishing. 2024-11-30 12:11:39 -03:00
Rodrigo Rodriguez
46248d4eef fix(llm.gblib): Fix in doc. publishing. 2024-11-30 12:10:57 -03:00
Rodrigo Rodriguez
5cd29131fa fix(llm.gblib): Fix in doc. publishing. 2024-11-30 11:58:40 -03:00
Rodrigo Rodriguez
afc72c5d55 fix(llm.gblib): Talk to data local db use fix. 2024-11-29 21:49:35 -03:00
Rodrigo Rodriguez
420543768b fix(llm.gblib): Talk to data local db use fix. 2024-11-29 21:19:42 -03:00
Rodrigo Rodriguez
5e8e3cbea3 fix(llm.gblib): Talk to data local db use fix. 2024-11-28 11:13:01 -03:00
Rodrigo Rodriguez
c62db78e48 fix(basic.gblib): Refresh data source. 2024-11-27 19:17:35 -03:00
Rodrigo Rodriguez
2b847cba4c fix(basic.gblib): Refresh data source. 2024-11-27 17:23:46 -03:00
Rodrigo Rodriguez
0b94bf4b0a fix(basic.gblib): Refresh data source. 2024-11-27 08:50:02 -03:00
Rodrigo Rodriguez
878f10245f fix(kb.gbapp): Auto Logo generation fixed. 2024-11-26 09:35:15 -03:00
Rodrigo Rodriguez
9c2c1bc204 fix(llm.gblib): Talk to data local db use fix. 2024-11-24 13:17:18 -03:00
Rodrigo Rodriguez
6e46bcf4ce fix(llm.gblib): Talk to data local db use fix. 2024-11-24 13:07:16 -03:00
Rodrigo Rodriguez
29ddb89d2a fix(llm.gblib): Talk to data local db use fix. 2024-11-24 12:57:14 -03:00
Rodrigo Rodriguez
5b69a12d74 fix(llm.gblib): Talk to data local db use fix. 2024-11-24 12:43:58 -03:00
Rodrigo Rodriguez
ba320489f6 fix(llm.gblib): MultiURL player type fixed. 2024-11-24 10:25:58 -03:00
Rodrigo Rodriguez
cde7ecc66a fix(llm.gblib): MultiURL player type fixed. 2024-11-24 10:03:23 -03:00
Rodrigo Rodriguez
4292464fbc fix(llm.gblib): Fix in doc. publishing. 2024-11-22 14:37:34 -03:00
Rodrigo Rodriguez
0b238ab99d fix(llm.gblib): Fix in doc. publishing. 2024-11-22 14:28:31 -03:00
Rodrigo Rodriguez
1f74549963 fix(llm.gblib): Fix in doc. publishing. 2024-11-22 14:27:45 -03:00
Rodrigo Rodriguez
a23ba24055 fix(kb.gbapp): Cleaning vector store before indexing. 2024-11-14 07:32:43 -03:00
Rodrigo Rodriguez
eca5b4e81f fix(kb.gbapp): Cleaning vector store before indexing. 2024-11-13 10:38:59 -03:00
me@rodrigorodriguez.com
26e7b4eec9 fix(llm.gblib): Vector store fixed in /publish. 2024-11-08 11:49:12 -03:00
me@rodrigorodriguez.com
749d7e7bdb new(llm.gblib): Added Claude. 2024-11-08 06:49:30 -03:00
me@rodrigorodriguez.com
94a7fa0267 new(all): Adobe Illustrator CONVERT keyword support. 2024-11-06 18:19:16 -03:00
me@rodrigorodriguez.com
e7f377c887 fix(all): LLM templates on production. 2024-10-30 20:00:01 -03:00
me@rodrigorodriguez.com
082b18a750 fix(all): LLM templates on production. 2024-10-30 15:35:11 -03:00
me@rodrigorodriguez.com
6a5d6b37c2 fix(all): LLM JSON. 2024-10-28 13:48:13 -03:00
me@rodrigorodriguez.com
cada29fd6d fix(all): LLM JSON. 2024-10-28 12:42:37 -03:00
me@rodrigorodriguez.com
d19552814f fix(all): JSON LLM. 2024-10-28 12:33:52 -03:00
me@rodrigorodriguez.com
2eba4218c0 fix(all): LLM json OK. 2024-10-28 12:07:53 -03:00
me@rodrigorodriguez.com
2cc6a63121 fix(all): Back router. 2024-10-28 10:11:49 -03:00
me@rodrigorodriguez.com
5590460000 fix(all): Removed router. 2024-10-28 09:43:02 -03:00
me@rodrigorodriguez.com
9b17ebeecf new(all); ROUTER. 2024-10-24 11:09:24 -03:00
me@rodrigorodriguez.com
5798463e5f new(all); ROUTER. 2024-10-24 10:44:05 -03:00
me@rodrigorodriguez.com
21e5415f2b new(all); ROUTER. 2024-10-24 10:39:58 -03:00
me@rodrigorodriguez.com
65f824a8cf new(all); ROUTER. 2024-10-23 16:47:15 -03:00
me@rodrigorodriguez.com
8fe977bf2d new(all); 2024-10-20 08:01:58 -03:00
me@rodrigorodriguez.com
bd26fdc0bf new(all); 2024-10-20 00:21:14 -03:00
me@rodrigorodriguez.com
4331258cba new(all); 2024-10-19 23:56:04 -03:00
me@rodrigorodriguez.com
6a8acee69a new(all); ROUTER. 2024-10-19 23:36:02 -03:00
me@rodrigorodriguez.com
a3d557712f new(all); ROUTER. 2024-10-19 13:55:57 -03:00
me@rodrigorodriguez.com
1a687b7270 new(all); ROUTER. 2024-10-19 13:01:53 -03:00
me@rodrigorodriguez.com
2367fe22ff new(all); 2024-10-19 12:52:57 -03:00
me@rodrigorodriguez.com
f135156dd0 new(core.gbapp): LLM alerts for data. 2024-10-17 17:19:37 -03:00
me@rodrigorodriguez.com
21aa30796d new(core.gbapp): LLM alerts for data. 2024-10-17 17:07:27 -03:00
me@rodrigorodriguez.com
44e3ecc077 new(core.gbapp): LLM alerts for data. 2024-10-17 16:52:04 -03:00
me@rodrigorodriguez.com
5bae484af0 new(core.gbapp): LLM alerts for data. 2024-10-17 16:46:39 -03:00
me@rodrigorodriguez.com
bf51e3375c new(core.gbapp): LLM alerts for data. 2024-10-17 16:33:43 -03:00
me@rodrigorodriguez.com
02cecf6faa new(core.gbapp): LLM alerts for data. 2024-10-17 14:58:29 -03:00
me@rodrigorodriguez.com
de2afefad1 new(core.gbapp): LLM alerts for data. 2024-10-17 14:52:48 -03:00
me@rodrigorodriguez.com
02a32ed9d8 new(core.gbapp): LLM alerts for data. 2024-10-17 14:50:25 -03:00
me@rodrigorodriguez.com
36f7a7fbd1 new(core.gbapp): LLM alerts for data. 2024-10-17 14:45:30 -03:00
me@rodrigorodriguez.com
caf1601567 new(core.gbapp): LLM alerts for data. 2024-10-17 14:40:32 -03:00
me@rodrigorodriguez.com
2abb498158 new(core.gbapp): LLM alerts for data. 2024-10-17 14:34:20 -03:00
me@rodrigorodriguez.com
0c1c8788b8 new(core.gbapp): LLM alerts for data. 2024-10-17 14:00:42 -03:00
me@rodrigorodriguez.com
64c26632dd new(core.gbapp): LLM alerts for data. 2024-10-17 13:47:18 -03:00
me@rodrigorodriguez.com
06ae13ba4f new(core.gbapp): LLM alerts for data. 2024-10-17 10:35:48 -03:00
me@rodrigorodriguez.com
efeb75410a new(core.gbapp): LLM alerts for data. 2024-10-17 09:07:41 -03:00
me@rodrigorodriguez.com
c41d6bfdd0 new(core.gbapp): LLM alerts for data. 2024-10-17 08:47:01 -03:00
me@rodrigorodriguez.com
7df5ab0244 new(core.gbapp): LLM alerts for data. 2024-10-16 12:56:28 -03:00
me@rodrigorodriguez.com
2a279d27ca new(core.gbapp): LLM alerts for data. 2024-10-16 12:56:09 -03:00
me@rodrigorodriguez.com
789fd79777 new(core.gbapp): LLM alerts for data. 2024-10-16 02:50:24 -03:00
me@rodrigorodriguez.com
52f416076e new(core.gbapp): LLM alerts for data. 2024-10-15 16:09:48 -03:00
me@rodrigorodriguez.com
0832f9d769 new(core.gbapp): Timestamp fields are now default. 2024-10-15 15:05:43 -03:00
me@rodrigorodriguez.com
7becf2980d new(core.gbapp): Timestamp fields are now default. 2024-10-15 10:55:10 -03:00
me@rodrigorodriguez.com
d3a2d55a7d new(core.gbapp): Timestamp fields are now default. 2024-10-15 10:49:06 -03:00
me@rodrigorodriguez.com
3e96f1d74e new(core.gbapp): Timestamp fields are now default. 2024-10-15 09:35:05 -03:00
me@rodrigorodriguez.com
cc67e84697 new(core.gbapp): Timestamp fields are now default. 2024-10-15 09:28:11 -03:00
me@rodrigorodriguez.com
bd85f1e8f3 new(core.gbapp): Timestamp fields are now default. 2024-10-15 09:08:53 -03:00
me@rodrigorodriguez.com
29712b9528 fix(core.gbapp): Themes optional package. 2024-10-13 23:11:11 -03:00
me@rodrigorodriguez.com
22384ed299 new(basic.gblib): SEND FILE pdf as temporary images ViewOnce. 2024-10-12 20:12:18 -03:00
me@rodrigorodriguez.com
45684c4d61 new(basic.gblib): SEND FILE pdf as temporary images ViewOnce. 2024-10-12 18:13:11 -03:00
me@rodrigorodriguez.com
51da32aa57 new(basic.gblib): SEND FILE pdf as temporary images ViewOnce. 2024-10-12 17:56:09 -03:00
me@rodrigorodriguez.com
b8424b9bbc new(basic.gblib): SEND FILE pdf as temporary images ViewOnce. 2024-10-12 16:59:23 -03:00
me@rodrigorodriguez.com
db746f06fe new(basic.gblib): SEND FILE pdf as temporary images ViewOnce. 2024-10-12 16:35:50 -03:00
me@rodrigorodriguez.com
24c8d5c625 new(basic.gblib): SEND FILE pdf as temporary images ViewOnce. 2024-10-12 16:28:33 -03:00
me@rodrigorodriguez.com
d5cb4bd559 new(basic.gblib): SEND FILE pdf as temporary images ViewOnce. 2024-10-07 22:26:50 -03:00
me@rodrigorodriguez.com
4c4fc3016c new(basic.gblib): SEND FILE pdf as temporary images ViewOnce. 2024-10-07 22:25:22 -03:00
me@rodrigorodriguez.com
d68feec33b new(basic.gblib): SEND FILE pdf as temporary images ViewOnce. 2024-10-06 15:49:07 -03:00
me@rodrigorodriguez.com
ac6e7bc28c new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-04 01:53:34 -03:00
me@rodrigorodriguez.com
dc4fa86ab3 new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-04 01:48:12 -03:00
me@rodrigorodriguez.com
8025db485e new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-04 01:40:28 -03:00
me@rodrigorodriguez.com
0b10992f3e new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-04 01:32:51 -03:00
me@rodrigorodriguez.com
25245a010e new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-04 00:55:10 -03:00
me@rodrigorodriguez.com
975d4961a4 new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-03 23:57:49 -03:00
me@rodrigorodriguez.com
007493628d new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-03 20:48:03 -03:00
me@rodrigorodriguez.com
f63f1c31ce new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-03 20:44:58 -03:00
me@rodrigorodriguez.com
37913735cb new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-03 20:42:24 -03:00
me@rodrigorodriguez.com
2cffae858c new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-03 20:11:50 -03:00
me@rodrigorodriguez.com
8590607aa9 new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-03 19:36:18 -03:00
me@rodrigorodriguez.com
4656e1d57d new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-03 16:43:31 -03:00
me@rodrigorodriguez.com
c9d2499e31 new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-03 14:44:48 -03:00
me@rodrigorodriguez.com
16aae3f6e6 new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-03 13:16:22 -03:00
me@rodrigorodriguez.com
7ed8979c73 new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-03 13:07:51 -03:00
me@rodrigorodriguez.com
31215d8421 new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-03 12:39:52 -03:00
me@rodrigorodriguez.com
f2fbbc5f80 new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-03 10:38:31 -03:00
me@rodrigorodriguez.com
6c0d3ac311 new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-02 19:04:20 -03:00
me@rodrigorodriguez.com
7013d168df new(basic.gblib): SEND FILE pdf as temporary images. 2024-10-02 18:39:25 -03:00
me@rodrigorodriguez.com
53e0558593 new(basic.gblib): HEAR AS QRCODE. 2024-10-02 10:12:03 -03:00
me@rodrigorodriguez.com
8327b710ba fix(all): Templates OK. 2024-09-29 22:15:39 -03:00
me@rodrigorodriguez.com
80e766430e fix(all): Templates OK. 2024-09-29 22:08:08 -03:00
me@rodrigorodriguez.com
9a9722f494 fix(all): Templates OK. 2024-09-29 22:01:56 -03:00
me@rodrigorodriguez.com
c76c46ede7 fix(all): Templates OK. 2024-09-29 21:52:07 -03:00
me@rodrigorodriguez.com
d62c227431 fix(all): Templates OK. 2024-09-29 21:37:41 -03:00
me@rodrigorodriguez.com
2a245f9530 fix(all): Templates OK. 2024-09-29 20:33:39 -03:00
me@rodrigorodriguez.com
110083e1c1 fix(all): Templates OK. 2024-09-29 20:23:13 -03:00
me@rodrigorodriguez.com
b9dbf11f61 fix(core.gbapp): SaaS missing in PROD. 2024-09-26 14:57:26 -03:00
me@rodrigorodriguez.com
e9e1bf7df3 fix(core.gbapp): SaaS missing in PROD. 2024-09-26 14:53:16 -03:00
me@rodrigorodriguez.com
fda88d34d5 fix(core.gbapp): SaaS missing in PROD. 2024-09-26 14:46:49 -03:00
me@rodrigorodriguez.com
fa66786a7c fix(core.gbapp): SaaS missing in PROD. 2024-09-26 14:08:41 -03:00
me@rodrigorodriguez.com
63e908fbd0 fix(core.gbapp): SaaS missing in PROD. 2024-09-26 14:03:29 -03:00
me@rodrigorodriguez.com
f847c09c89 fix(core.gbapp): SaaS missing in PROD. 2024-09-26 13:58:24 -03:00
me@rodrigorodriguez.com
6eb08cf798 fix(core.gbapp): SaaS missing in PROD. 2024-09-26 13:29:42 -03:00
me@rodrigorodriguez.com
fe9548ccc8 fix(core.gbapp): SaaS missing in PROD. 2024-09-26 13:11:09 -03:00
me@rodrigorodriguez.com
bb456cae11 fix(core.gbapp): Themes missing in PROD. 2024-09-26 12:36:08 -03:00
me@rodrigorodriguez.com
bdf5786aa5 fix(all): Templates OK. 2024-09-25 17:30:32 -03:00
me@rodrigorodriguez.com
3af58df5a1 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2024-09-25 17:01:56 -03:00
me@rodrigorodriguez.com
dae7bc086c fix(all): LLM tools OK. 2024-09-25 17:00:48 -03:00
me@rodrigorodriguez.com
df88778bc6 fix(all): LLM tools OK. 2024-09-25 16:54:52 -03:00
Rodrigo Rodriguez
f7ee497f3e
Update README.md 2024-09-24 21:09:11 -03:00
Rodrigo Rodriguez
d399cc9955
Update README.md 2024-09-24 21:01:49 -03:00
me@rodrigorodriguez.com
ad3f006eed new(all): Node.js v22 and ts-node. 2024-09-24 20:32:38 -03:00
me@rodrigorodriguez.com
a99430e5df new(all): Node.js v22 and ts-node. 2024-09-24 17:13:23 -03:00
me@rodrigorodriguez.com
40dc1f5946 new(all): Node.js v22 and ts-node. 2024-09-24 17:03:37 -03:00
me@rodrigorodriguez.com
2bbeac175c new(all): Node.js v22 and ts-node. 2024-09-24 16:44:03 -03:00
me@rodrigorodriguez.com
d5884636cc new(all): Node.js v22 and ts-node. 2024-09-24 14:38:34 -03:00
me@rodrigorodriguez.com
30994a3a28 new(all): Node.js v22 and ts-node. 2024-09-24 14:30:01 -03:00
Rodrigo Rodriguez
441dea2c22 fix (templates): ai-search OK. Image by AI. 2024-09-19 23:01:45 -03:00
Rodrigo Rodriguez
146cedff22 fix (templates): ai-search OK. Fix themes. 2024-09-19 22:52:28 -03:00
Rodrigo Rodriguez
e8f12f3a8a fix (templates): ai-search OK. Fix themes. 2024-09-19 22:45:21 -03:00
Rodrigo Rodriguez
dda9e7cc2c fix (templates): ai-search OK. Fix themes. 2024-09-19 22:40:04 -03:00
Rodrigo Rodriguez
fcf72d5faf fix (templates): ai-search OK. Fix themes. 2024-09-19 20:50:05 -03:00
Rodrigo Rodriguez
b159b99aa4 fix (templates): ai-search OK. Fix themes. 2024-09-19 17:46:43 -03:00
Rodrigo Rodriguez
1bae1ed5e9 fix (templates): ai-search OK. Image by AI. 2024-09-19 09:17:30 -03:00
Rodrigo Rodriguez
22fcf8b541 fix (templates): ai-search OK. 2024-09-18 18:43:19 -03:00
Rodrigo Rodriguez
67c9ef5f26 fix (templates): ai-search OK. 2024-09-18 14:46:39 -03:00
Rodrigo Rodriguez
7de0f3aa94 fix (templates): ai-search OK. 2024-09-18 13:45:33 -03:00
Rodrigo Rodriguez
2c2ed2f824 fix (templates): ai-search OK. 2024-09-18 13:21:21 -03:00
Rodrigo Rodriguez
be53fd2200 fix (templates): ai-search OK. 2024-09-17 19:27:06 -03:00
Rodrigo Rodriguez
8f00b4648b fix (core.gbapp): Download folder on server azure. 2024-09-17 15:36:43 -03:00
Rodrigo Rodriguez
d94cb4d41d fix (core.gbapp): Download folder on server azure. 2024-09-17 15:05:17 -03:00
Rodrigo Rodriguez
eaf36ee7ca fix (core.gbapp): Download folder on server azure. 2024-09-16 19:22:55 -03:00
Rodrigo Rodriguez
ae20d0fa2e fix (core.gbapp): Download folder on server azure. 2024-09-16 19:12:58 -03:00
Rodrigo Rodriguez
f8af6c4bd5 fix (core.gbapp): Download folder on server azure. 2024-09-16 19:04:33 -03:00
Rodrigo Rodriguez
214a6472ef fix (core.gbapp): Download folder on server azure. 2024-09-16 18:47:12 -03:00
Rodrigo Rodriguez
b76c5ae227 fix (core.gbapp): Download folder on server azure. 2024-09-16 18:42:18 -03:00
Rodrigo Rodriguez
52d766667a fix (templates): llm-server OK. 2024-09-15 18:32:20 -03:00
Rodrigo Rodriguez
cbcb1ae95b fix (templates): llm-server OK. 2024-09-15 18:30:08 -03:00
Rodrigo Rodriguez
55e3334cc3 fix (templates): llm-server almost OK. 2024-09-15 16:30:03 -03:00
Rodrigo Rodriguez
25882854f8 fix (templates): llm-server almost OK. 2024-09-15 14:41:56 -03:00
Rodrigo Rodriguez
93ff7a418e fix (templates): llm-server almost OK. 2024-09-14 21:26:54 -03:00
Rodrigo Rodriguez
bf9886e763 fix (templates): llm-server almost OK. 2024-09-14 10:45:54 -03:00
Rodrigo Rodriguez
22141095f0 fix (templates): llm-server almost OK. 2024-09-13 16:56:04 -03:00
Rodrigo Rodriguez
210ad2f885 fix (templates): llm-server OK. 2024-09-12 15:05:32 -03:00
Rodrigo Rodriguez
d78fc1bbbb fix (templates): llm-tools OK. 2024-09-11 21:11:38 -03:00
Rodrigo Rodriguez
7d8d4e4d6b fix (templates): tal-to-data OK. 2024-09-11 21:02:19 -03:00
Rodrigo Rodriguez
393c73c217 fix (templates): ai-search OK. 2024-09-11 18:39:37 -03:00
Rodrigo Rodriguez
6cdce1b9ee fix (templates): edu OK. 2024-09-11 17:18:03 -03:00
Rodrigo Rodriguez
d43a0796b6 fix (templates): law OK. 2024-09-11 14:41:24 -03:00
Rodrigo Rodriguez
98ef0213ac new (basic.gblib): auto-publish. 2024-09-11 00:33:17 -03:00
Rodrigo Rodriguez
31ea62d526 fix (all): path and fs normalization. 2024-09-10 23:25:07 -03:00
Rodrigo Rodriguez
49deb3e487 fix (all): path and fs normalization. 2024-09-09 19:14:43 -03:00
Rodrigo Rodriguez
2eb6137f80 fix (all): path and fs normalization. 2024-09-09 17:54:25 -03:00
Rodrigo Rodriguez
271ab87dce fix (all): path and fs normalization. 2024-09-09 10:28:38 -03:00
Rodrigo Rodriguez
145406cab3 fix (all): path and fs normalization. 2024-09-08 16:48:26 -03:00
Rodrigo Rodriguez
fb348599cf fix (all): path and fs normalization. 2024-09-07 18:13:36 -03:00
Rodrigo Rodriguez
27ebf35579 fix (all): path and fs normalization. 2024-09-07 00:08:23 -03:00
Rodrigo Rodriguez
698df5a830 fix (all): path and fs normalization. 2024-09-06 15:30:03 -03:00
Rodrigo Rodriguez
c1ac3f183b new(basic.gblib): Crawler can index all now. 2024-09-06 15:15:42 -03:00
Rodrigo Rodriguez
2b09b58d4b new(basic.gblib): Video in WPP templates. 2024-09-05 15:28:21 -03:00
Rodrigo Rodriguez
b09222ca0c new(basic.gblib): Video in WPP templates. 2024-09-05 15:15:15 -03:00
Rodrigo Rodriguez
f137579013 new(basic.gblib): Video in WPP templates. 2024-09-05 15:08:26 -03:00
Rodrigo Rodriguez
72a0950fdb new(basic.gblib): Video in WPP templates. 2024-09-05 15:03:38 -03:00
Rodrigo Rodriguez
14b833a580 new(basic.gblib): CHART PROMPT and chart mode. 2024-09-05 14:53:21 -03:00
Rodrigo Rodriguez
c51ceb649c new(basic.gblib): CHART PROMPT and chart mode. 2024-09-05 14:26:08 -03:00
Rodrigo Rodriguez
58b7127491 new(basic.gblib): CHART PROMPT and chart mode. 2024-09-05 01:23:49 -03:00
Rodrigo Rodriguez
9be5315c36 fix(llm.gblib): More templates working: law. 2024-09-04 16:48:08 -03:00
Rodrigo Rodriguez
db532569f1 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2024-09-04 15:24:00 -03:00
Rodrigo Rodriguez
a7887fad93 fix(llm.gblib): Tool fix. 2024-09-04 15:23:56 -03:00
bafeda98a6 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2024-09-04 15:22:59 -03:00
a4995e7f03 new(basic.gblib): Facebook added. 2024-09-04 14:58:11 -03:00
Rodrigo Rodriguez
63efa588a8 fix(llm.gblib): Tool fix. 2024-09-04 00:18:19 -03:00
Rodrigo Rodriguez
66ad2d3ee1 fix(all): Packages updated. 2024-09-03 11:20:13 -03:00
Rodrigo Rodriguez
6d814c0c1d fix(llm.gblib): Tool fix. More templates. 2024-09-02 20:16:56 -03:00
Rodrigo Rodriguez
6aaae55a61 fix(llm.gblib): Tool fix. More templates. 2024-09-01 21:46:55 -03:00
Rodrigo Rodriguez
95458a658d new(all): WebDav support for all bots. 2024-09-01 18:21:34 -03:00
Rodrigo Rodriguez
b7bcd4f4c8 new(all): WebDav support for all bots. 2024-09-01 10:08:56 -03:00
Rodrigo Rodriguez
222a4f3201 new(all): WebDav support for all bots. 2024-08-31 16:26:54 -03:00
Rodrigo Rodriguez
2ae256d036 new(all): WebDav support for all bots. 2024-08-31 15:35:32 -03:00
Rodrigo Rodriguez
3670324d99 new(all): WebDav support for all bots. 2024-08-31 04:33:51 -03:00
Rodrigo Rodriguez
8e2c747723 new(all): WebDav support for all bots. 2024-08-31 04:02:17 -03:00
Rodrigo Rodriguez
009263d309 new(all): WebDav support for all bots. 2024-08-31 03:52:37 -03:00
Rodrigo Rodriguez
7e1fda84bb new(all): WebDav support for all bots. 2024-08-30 19:22:56 -03:00
Rodrigo Rodriguez
053ff4c8f6 new(all): WebDav support for all bots. 2024-08-30 14:15:02 -03:00
Rodrigo Rodriguez
3952724f7a fix(all): TRUE multicloud. 2024-08-29 22:10:52 -03:00
Rodrigo Rodriguez
7d459d5579 fix(all): TRUE multicloud. 2024-08-29 19:53:56 -03:00
Rodrigo Rodriguez
21ed20dcf0 fix(all): TRUE multicloud. 2024-08-28 19:42:12 -03:00
Rodrigo Rodriguez
c2bdbbe140 fix(all): TRUE multicloud. 2024-08-27 19:07:13 -03:00
Rodrigo Rodriguez
1765e8f50e fix(all): TRUE multicloud. 2024-08-27 16:15:08 -03:00
Rodrigo Rodriguez
442def7fbb fix(all): TRUE multicloud. 2024-08-27 15:32:03 -03:00
Rodrigo Rodriguez
0b5a7f0863 fix(all): TRUE multicloud. 2024-08-26 23:04:24 -03:00
Rodrigo Rodriguez
385e22b062 fix(all): TRUE multicloud. 2024-08-26 22:47:00 -03:00
Rodrigo Rodriguez
4ee52c90b2 fix(all): TRUE multicloud. 2024-08-26 22:42:07 -03:00
Rodrigo Rodriguez
b9be666d00 fix(all): TRUE multicloud. 2024-08-26 22:30:28 -03:00
Rodrigo Rodriguez
49f0f98cac fix(all): TRUE multicloud. 2024-08-26 22:25:14 -03:00
Rodrigo Rodriguez
829cacdf35 fix(all): TRUE multicloud. 2024-08-26 21:47:57 -03:00
Rodrigo Rodriguez
a1d6cfaf45 fix(all): TRUE multicloud. 2024-08-26 21:16:20 -03:00
Rodrigo Rodriguez
0ef823c259 fix(all): TRUE multicloud. 2024-08-26 20:04:12 -03:00
Rodrigo Rodriguez
45eb9fab3c fix(all): TRUE multicloud. 2024-08-26 20:01:49 -03:00
Rodrigo Rodriguez
ba6e9c2767 fix(all): TRUE multicloud. 2024-08-26 19:55:16 -03:00
Rodrigo Rodriguez
cc22f3963d fix(all): TRUE multicloud. 2024-08-26 19:31:26 -03:00
Rodrigo Rodriguez
a7be4850b7 fix(all): TRUE multicloud. 2024-08-26 19:03:46 -03:00
Rodrigo Rodriguez
e5eb64b11d fix(all): TRUE multicloud. 2024-08-25 13:31:18 -03:00
Rodrigo Rodriguez
71c8fab53e fix(all): TRUE multicloud. 2024-08-25 13:17:15 -03:00
Rodrigo Rodriguez
666b1cb327 fix(all): TRUE multicloud. 2024-08-25 13:05:26 -03:00
Rodrigo Rodriguez
1a9abb1148 fix(all): TRUE multicloud. 2024-08-24 17:30:00 -03:00
Rodrigo Rodriguez
c4b336dcd7 fix(all): New templates. 2024-08-24 15:52:23 -03:00
Rodrigo Rodriguez
0cfdd951b5 fix(all): New templates. 2024-08-24 11:51:41 -03:00
Rodrigo Rodriguez
54fafdf0e8 fix(all): New templates. 2024-08-24 11:35:22 -03:00
Rodrigo Rodriguez
56ce112479 fix(all): New templates. 2024-08-24 01:15:28 -03:00
Rodrigo Rodriguez
512e100ac3 fix(all): New templates. 2024-08-24 01:10:36 -03:00
Rodrigo Rodriguez
7d80c259aa fix(all): New templates. 2024-08-24 00:50:32 -03:00
Rodrigo Rodriguez
3335d5d8a4 fix(all): New templates. 2024-08-24 00:22:34 -03:00
Rodrigo Rodriguez
1d783c303e fix(all): New templates. 2024-08-24 00:13:07 -03:00
Rodrigo Rodriguez
01628fdd0e fix(all): New templates. 2024-08-24 00:12:50 -03:00
Rodrigo Rodriguez
7d0047221f fix(all): New templates. 2024-08-23 23:41:53 -03:00
Rodrigo Rodriguez
457541bdb9 fix(all): New templates. 2024-08-23 23:40:02 -03:00
Rodrigo Rodriguez
ed9412f74c fix(all): New templates. 2024-08-23 23:38:37 -03:00
Rodrigo Rodriguez
12418bd1b8 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2024-08-23 23:36:22 -03:00
Rodrigo Rodriguez
03cc74ade6 fix(all): New templates. 2024-08-23 23:36:20 -03:00
76cb157319 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2024-08-23 18:14:10 -03:00
Rodrigo Rodriguez
26f5fcec7c fix(all): New templates. 2024-08-23 17:54:47 -03:00
Rodrigo Rodriguez
2a93f0886f fix(all): New templates. 2024-08-23 17:23:22 -03:00
d319782679 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2024-08-23 17:21:53 -03:00
d518d224db fix(all): Image generation fixing. 2024-08-23 17:18:42 -03:00
Rodrigo Rodriguez
760d262842 fix(all): New templates. 2024-08-23 00:00:04 -03:00
Rodrigo Rodriguez
d3f6ce2799 fix(all): TRUE multicloud. 2024-08-21 17:03:33 -03:00
Rodrigo Rodriguez
babde3fa6c fix(all): TRUE multicloud. 2024-08-21 15:40:08 -03:00
Rodrigo Rodriguez
85fab5bbc1 fix(all): TRUE multicloud. 2024-08-21 13:26:40 -03:00
Rodrigo Rodriguez
a98323dfd1 fix(all): TRUE multicloud. 2024-08-21 13:09:50 -03:00
Rodrigo Rodriguez
d5e47de73e new(all): TRUE multicloud. 2024-08-21 07:56:14 -03:00
Rodrigo Rodriguez
6e105ea765 new(all): TRUE multicloud. 2024-08-21 07:28:42 -03:00
Rodrigo Rodriguez
3018918707 new(all): TRUE multicloud. 2024-08-20 23:04:33 -03:00
Rodrigo Rodriguez
88c370dbdf new(all): TRUE multicloud. 2024-08-20 19:12:57 -03:00
Rodrigo Rodriguez
a44ae4885b new(all): TRUE multicloud. 2024-08-20 16:18:01 -03:00
Rodrigo Rodriguez
1f6cb6ed03 new(all): TRUE multicloud. 2024-08-20 16:12:30 -03:00
Rodrigo Rodriguez
6302ade0fe new(all): TRUE multicloud. 2024-08-20 15:49:28 -03:00
Rodrigo Rodriguez
5df0ed0180 new(all): TRUE multicloud. 2024-08-20 15:44:28 -03:00
Rodrigo Rodriguez
76b09e8c03 new(all): TRUE multicloud. 2024-08-20 15:35:03 -03:00
Rodrigo Rodriguez
079e16b85a new(all): TRUE multicloud. 2024-08-20 15:32:18 -03:00
Rodrigo Rodriguez
6bc15e1a74 new(all): TRUE multicloud. 2024-08-20 15:30:47 -03:00
Rodrigo Rodriguez
367e45f5f5 new(all): TRUE multicloud. 2024-08-20 15:26:07 -03:00
Rodrigo Rodriguez
3d1624ac23 new(all): TRUE multicloud. 2024-08-20 15:18:44 -03:00
Rodrigo Rodriguez
016abf7aac new(all): TRUE multicloud. 2024-08-20 15:13:43 -03:00
Rodrigo Rodriguez
b004f8b4b5 new(all): TRUE multicloud. 2024-08-19 23:03:58 -03:00
Rodrigo Rodriguez
3ebf79c7b5 new(all): TRUE multicloud. 2024-08-19 17:09:23 -03:00
Rodrigo Rodriguez
5880355349 new(all): TRUE multicloud. 2024-08-19 16:12:23 -03:00
Rodrigo Rodriguez
3299683268 new(all): TRUE multicloud. 2024-08-18 17:51:03 -03:00
Rodrigo Rodriguez
3f9e3b040e new(all): Unit tests infra. 2024-08-17 21:35:09 -03:00
Rodrigo Rodriguez
dcf20934cb fix(all): Formatting code and unit test. 2024-08-17 20:30:00 -03:00
Rodrigo Rodriguez
faa21438fa new(basic.gblib): New batch features. 2024-08-16 14:04:17 -03:00
Rodrigo Rodriguez
c86934e646 new(basic.gblib): New batch features. 2024-08-16 13:02:27 -03:00
Rodrigo Rodriguez
6ff24f7fcb new(basic.gblib): New batch features. 2024-08-16 13:00:33 -03:00
Rodrigo Rodriguez
61cc9e2878 new(basic.gblib): New batch features. 2024-08-16 12:28:05 -03:00
Rodrigo Rodriguez
3249da0c93 new(basic.gblib): New batch features. 2024-08-16 12:20:27 -03:00
Rodrigo Rodriguez
f321ed6731 new(basic.gblib): New batch features. 2024-08-16 10:43:15 -03:00
Rodrigo Rodriguez
7b7b6330fb new(basic.gblib): New batch features. 2024-08-13 21:20:33 -03:00
Rodrigo Rodriguez
1af8cb99bf new(basic.gblib): New batch features. 2024-08-13 21:16:01 -03:00
Rodrigo Rodriguez
3b03cf4bcd new(basic.gblib): New batch features. 2024-08-13 21:12:58 -03:00
Rodrigo Rodriguez
139b28337e new(basic.gblib): New batch features. 2024-08-13 21:09:59 -03:00
Rodrigo Rodriguez
b2520cb082 new(basic.gblib): New batch features. 2024-08-13 21:03:36 -03:00
Rodrigo Rodriguez
b87f19e9d3 new(basic.gblib): New batch features. 2024-08-13 21:00:08 -03:00
Rodrigo Rodriguez
7b9d7446da new(whatsapp.gblib): LLM SQL. 2024-08-13 20:48:53 -03:00
Rodrigo Rodriguez
681f398f14 new(whatsapp.gblib): LLM SQL. 2024-08-13 20:36:57 -03:00
Rodrigo Rodriguez
fa6fe752cc new(whatsapp.gblib): LLM SQL. 2024-08-13 20:26:40 -03:00
Rodrigo Rodriguez
9d82774544 new(whatsapp.gblib): LLM SQL. 2024-08-13 19:42:48 -03:00
Rodrigo Rodriguez
e090b62246 new(whatsapp.gblib): LLM SQL. 2024-08-13 19:27:04 -03:00
Rodrigo Rodriguez
9c53ae24bc new(whatsapp.gblib): LLM SQL. 2024-08-13 18:45:45 -03:00
Rodrigo Rodriguez
f8f419f810 new(whatsapp.gblib): LLM SQL. 2024-08-11 17:02:39 -03:00
Rodrigo Rodriguez
36de9a5120 new(whatsapp.gblib): LLM SQL. 2024-08-11 16:47:12 -03:00
Rodrigo Rodriguez
067163afa6 new(whatsapp.gblib): LLM SQL. 2024-08-11 16:44:10 -03:00
Rodrigo Rodriguez
8dd7ac5597 new(whatsapp.gblib): LLM SQL. 2024-08-10 21:01:15 -03:00
Rodrigo Rodriguez
5965cb1e35 new(whatsapp.gblib): Auto-create WhatsApp templates from articles in .docx. 2024-08-10 14:14:41 -03:00
Rodrigo Rodriguez
51cfa56f85 new(whatsapp.gblib): Auto-create WhatsApp templates from articles in .docx. 2024-08-10 13:35:34 -03:00
Rodrigo Rodriguez
fe8b797454 new(whatsapp.gblib): Auto-create WhatsApp templates from articles in .docx. 2024-08-10 12:29:32 -03:00
Rodrigo Rodriguez
400ec2b706 new(whatsapp.gblib): Auto-create WhatsApp templates from articles in .docx. 2024-08-10 12:25:21 -03:00
Rodrigo Rodriguez
faa5140450 new(whatsapp.gblib): Auto-create WhatsApp templates from articles in .docx. 2024-08-10 11:57:53 -03:00
Rodrigo Rodriguez
b0aeb83d2e new(whatsapp.gblib): Auto-create WhatsApp templates from articles in .docx. 2024-08-10 11:40:36 -03:00
Rodrigo Rodriguez
cff60cddac new(whatsapp.gblib): Auto-create WhatsApp templates from articles in .docx. 2024-08-09 18:46:45 -03:00
Rodrigo Rodriguez
ca29e2df6c new(whatsapp.gblib): Auto-create WhatsApp templates from articles in .docx. 2024-08-06 08:36:42 -03:00
Rodrigo Rodriguez
e8d0317f82 new(whatsapp.gblib): Auto-create WhatsApp templates from articles in .docx. 2024-08-04 17:16:04 -03:00
Rodrigo Rodriguez
1bb297f68b fix(whatsapp.gblib): Fix broadcasts. 2024-07-12 11:13:47 -03:00
Rodrigo Rodriguez
33f317b97a fix(whatsapp.gblib): Fix broadcasts. 2024-07-09 16:47:36 -03:00
Rodrigo Rodriguez
32c5c004f3 fix(whatsapp.gblib): Fix broadcasts. 2024-07-09 16:42:38 -03:00
Rodrigo Rodriguez
7b2c9238d3 fix(whatsapp.gblib): Fix broadcasts. 2024-07-09 16:38:35 -03:00
Rodrigo Rodriguez
e63ff1482e fix(whatsapp.gblib): Fix broadcasts. 2024-07-09 16:33:09 -03:00
Rodrigo Rodriguez
453b663394 fix(whatsapp.gblib): Fix broadcasts. 2024-07-02 10:47:40 -03:00
Rodrigo Rodriguez
b43e179172 fix(whatsapp.gblib): Fix broadcasts. 2024-06-29 09:09:50 -03:00
Rodrigo Rodriguez
0e2586ba0c new(basic.gblib): SET CONTEXT new keyword. 2024-06-27 19:25:21 -03:00
Rodrigo Rodriguez
e8051f59ad new(basic.gblib): SET CONTEXT new keyword. 2024-06-27 19:19:43 -03:00
Rodrigo Rodriguez
a481e696dc new(basic.gblib): SET CONTEXT new keyword. 2024-06-27 19:16:31 -03:00
Rodrigo Rodriguez
b6e8a054ad new(basic.gblib): SET CONTEXT new keyword. 2024-06-27 19:14:01 -03:00
Rodrigo Rodriguez
81258046c0 new(basic.gblib): SET CONTEXT new keyword. 2024-06-27 19:09:54 -03:00
Rodrigo Rodriguez
15c47af5cf new(basic.gblib): SET CONTEXT new keyword. 2024-06-27 18:45:33 -03:00
Rodrigo Rodriguez
66e3295f1f new(kb.gbapp): New option for website depth during Vector Retrieval. 2024-06-26 21:41:32 -03:00
Rodrigo Rodriguez
ee1fc0afc9 new(kb.gbapp): New option for website depth during Vector Retrieval. 2024-06-26 21:12:51 -03:00
Rodrigo Rodriguez
515155e92f fix(whatsapp.gblib): Fix in version of webVersionCache. 2024-06-23 14:52:04 -03:00
Rodrigo Rodriguez
aa35354a2b new(basic.gblib): New batch features. 2024-06-15 22:40:50 -03:00
Rodrigo Rodriguez
515aae801b new(basic.gblib): New batch features. 2024-06-15 20:51:07 -03:00
Rodrigo Rodriguez
8b8ccab773 new(basic.gblib): New batch features. 2024-06-15 20:39:53 -03:00
Rodrigo Rodriguez
ccc8fdd2d7 new(basic.gblib): New batch features. 2024-06-13 22:24:36 -03:00
Rodrigo Rodriguez
14b3ff1fe1 new(basic.gblib): New batch features. 2024-06-11 23:24:29 -03:00
Rodrigo Rodriguez
fb3325bbb7 new(basic.gblib): New batch features. 2024-06-10 18:35:45 -03:00
Rodrigo Rodriguez
c1b03e429d new(basic.gblib): New batch features. 2024-06-09 13:55:33 -03:00
Rodrigo Rodriguez
af1e991596 new(basic.gblib): New batch features. 2024-06-09 11:16:55 -03:00
Rodrigo Rodriguez
baaa3df66e new(basic.gblib): New batch features. 2024-06-09 10:54:14 -03:00
Rodrigo Rodriguez
0177717f6e new(basic.gblib): New batch features. 2024-06-09 10:32:49 -03:00
Rodrigo Rodriguez
77da28e980 fix(whatsapp.lib): Sending of images in official. 2024-06-01 18:52:03 -03:00
Rodrigo Rodriguez
7bd264c82a fix(whatsapp.lib): Sending of images in official. 2024-05-30 21:05:58 -03:00
Rodrigo Rodriguez
215d9aba4d fix(whatsapp.lib): Sending of images in official. 2024-05-30 21:00:43 -03:00
Rodrigo Rodriguez
ee98efaf92 fix(whatsapp.lib): Sending of images in official. 2024-05-29 12:43:03 -03:00
Rodrigo Rodriguez
a763c25f8f fix(whatsapp.lib): Sending of images in official. 2024-05-29 12:42:31 -03:00
Rodrigo Rodriguez
abee86f162 fix(whatsapp.lib): Sending of images in official. 2024-05-29 11:06:00 -03:00
Rodrigo Rodriguez
e25b30f793 fix(whatsapp.lib): Sending of images in official. 2024-05-29 10:53:03 -03:00
Rodrigo Rodriguez
dc9d7e96b9 fix(whatsapp.lib): Sending of images in official. 2024-05-28 18:21:30 -03:00
Rodrigo Rodriguez
1d4a794fb9 fix(whatsapp.lib): Sending of images in official. 2024-05-28 14:06:41 -03:00
Rodrigo Rodriguez
cebb6b4e1f fix(all): Libraries update. 2024-05-27 17:21:56 -03:00
Rodrigo Rodriguez
1173233971 fix(all): Libraries update. 2024-05-26 20:13:56 -03:00
Rodrigo Rodriguez
699ff27e14 fix(all): Libraries update. 2024-05-26 10:23:43 -03:00
Rodrigo Rodriguez
f4419fe71c fix(all): Libraries update. 2024-05-26 10:18:20 -03:00
Rodrigo Rodriguez
7665ae55a6 fix(all): Libraries update. 2024-05-25 22:00:57 -03:00
Rodrigo Rodriguez
9d3d29d0c1 fix(all): Libraries update. 2024-05-25 21:53:21 -03:00
Rodrigo Rodriguez
2dcde51c95 fix(all): Libraries update. 2024-05-25 19:11:01 -03:00
Rodrigo Rodriguez
9a82d2de01 new(all): Azure OpenAI added as new LLM provider. 2024-05-25 12:48:12 -03:00
Rodrigo Rodriguez
742aa53f88 new(all): Azure OpenAI added as new LLM provider. 2024-05-25 10:41:33 -03:00
Rodrigo Rodriguez
665b4b28e8 new(all): Azure OpenAI added as new LLM provider. 2024-05-25 10:25:20 -03:00
Rodrigo Rodriguez
47120be1ce new(all): Azure OpenAI added as new LLM provider. 2024-05-25 10:20:56 -03:00
Rodrigo Rodriguez
14ff832c58 new(all): Azure OpenAI added as new LLM provider. 2024-05-25 10:08:39 -03:00
Rodrigo Rodriguez
b3e5a265cf new(all): Azure OpenAI added as new LLM provider. 2024-05-25 09:58:30 -03:00
Rodrigo Rodriguez
d564ee4546 new(all): Azure OpenAI added as new LLM provider. 2024-05-24 21:59:45 -03:00
Rodrigo Rodriguez
64e167b08d new(all): Azure OpenAI added as new LLM provider. 2024-05-24 21:47:13 -03:00
Rodrigo Rodriguez
81be5c144e new(all): Azure OpenAI added as new LLM provider. 2024-05-24 21:22:16 -03:00
Rodrigo Rodriguez
1a9917ed63 new(all): Azure OpenAI added as new LLM provider. 2024-05-24 21:15:01 -03:00
Rodrigo Rodriguez
4d90187484 new(all): Azure OpenAI added as new LLM provider. 2024-05-24 20:57:48 -03:00
Rodrigo Rodriguez
52f9bcbce0 new(all): Azure OpenAI added as new LLM provider. 2024-05-24 20:34:12 -03:00
Rodrigo Rodriguez
d119c18651 new(all): Auto import for logo, colors and website content. 2024-05-24 18:41:16 -03:00
Rodrigo Rodriguez
a857ca6287 new(all): Auto import for logo, colors and website content. 2024-05-24 18:39:46 -03:00
Rodrigo Rodriguez
3ab47179ae new(all): Auto import for logo, colors and website content. 2024-05-24 18:31:07 -03:00
Rodrigo Rodriguez
9adeeb8d08 new(all): Auto import for logo, colors and website content. 2024-05-24 17:11:45 -03:00
Rodrigo Rodriguez
082651e316 new(all): Auto import for logo, colors and website content. 2024-05-24 14:52:46 -03:00
Rodrigo Rodriguez
4335dfc1c0 new(all): Auto import for logo, colors and website content. 2024-05-24 14:50:05 -03:00
Rodrigo Rodriguez
69ae924937 new(all): Auto import for logo, colors and website content. 2024-05-24 11:29:52 -03:00
Rodrigo Rodriguez
533fefe0da new(all): Auto import for logo, colors and website content. 2024-05-23 23:45:45 -03:00
Rodrigo Rodriguez
5d32eedba9 new(all): Auto import for logo, colors and website content. 2024-05-23 14:42:04 -03:00
Rodrigo Rodriguez
fc1bfa8e18 new(all): Auto import for logo, colors and website content. 2024-05-23 14:11:33 -03:00
Rodrigo Rodriguez
f42e42c5e2 new(all): Auto import for logo, colors and website content. 2024-05-22 22:42:52 -03:00
Rodrigo Rodriguez
d3e9e62d25 new(all): Auto import for logo, colors and website content. 2024-05-22 19:45:09 -03:00
Rodrigo Rodriguez
4fb5402987 new(all): Auto import for logo, colors and website content. 2024-05-22 19:26:00 -03:00
Rodrigo Rodriguez
1e12c39acb new(all): Auto import for logo, colors and website content. 2024-05-22 19:09:34 -03:00
Rodrigo Rodriguez
039805de05 new(all): Auto import for logo, colors and website content. 2024-05-22 18:43:57 -03:00
Rodrigo Rodriguez
e18094fd5e new(all): Auto import for logo, colors and website content. 2024-05-22 14:43:09 -03:00
Rodrigo Rodriguez
d6578de4fd new(all): Auto import for logo, colors and website content. 2024-05-22 14:26:38 -03:00
Rodrigo Rodriguez
6942f0d03b new(all): Auto import for logo, colors and website content. 2024-05-22 13:33:13 -03:00
Rodrigo Rodriguez
b9d1eb2a48 new(all): Auto import for logo, colors and website content. 2024-05-22 13:23:36 -03:00
Rodrigo Rodriguez
c374f27567 new(all): Auto import for logo, colors and website content. 2024-05-22 13:21:29 -03:00
Rodrigo Rodriguez
7e6b2807a1 new(all): Auto import for logo, colors and website content. 2024-05-22 11:14:10 -03:00
Rodrigo Rodriguez
a3798397e2 new(all): Auto import for logo, colors and website content. 2024-05-22 08:42:17 -03:00
Rodrigo Rodriguez
9f2982dbc0 new(all): Auto import for logo, colors and website content. 2024-05-22 08:37:37 -03:00
Rodrigo Rodriguez
5e88eff5ae new(all): Auto import for logo, colors and website content. 2024-05-22 07:37:22 -03:00
Rodrigo Rodriguez
e052ddc28b new(all): Auto import for logo, colors and website content. 2024-05-21 20:27:24 -03:00
Rodrigo Rodriguez
4a4a69790e new(all): Auto import for logo, colors and website content. 2024-05-21 18:28:37 -03:00
Rodrigo Rodriguez
d0a860db7f new(all): Auto import for logo, colors and website content. 2024-05-21 18:11:33 -03:00
Rodrigo Rodriguez
56c8f3ce5c new(all): Auto import for logo, colors and website content. 2024-05-21 14:42:30 -03:00
Rodrigo Rodriguez
2f570244b6 new(all): Auto import for logo, colors and website content. 2024-05-21 13:54:52 -03:00
Rodrigo Rodriguez
e91c3a4e06 new(all): Auto import for logo, colors and website content. 2024-05-21 13:17:42 -03:00
Rodrigo Rodriguez
7fe50d95c4 new(all): Sharp multiplatform. 2024-05-19 16:23:24 -03:00
Rodrigo Rodriguez
3baf96b5b3 new(all): Sharp multiplatform. 2024-05-19 16:14:58 -03:00
Rodrigo Rodriguez
d73bf50a2d new(all): Website indexing. 2024-05-17 19:19:58 -03:00
Rodrigo Rodriguez
c620473fbf fix(all): Packages updated. 2024-05-17 08:24:42 -03:00
Rodrigo Rodriguez
b22c3425fa fix(whatsapp.gblib): Fix PRIVACY_STORE_MESSAGES param. 2024-05-14 19:23:12 -03:00
Rodrigo Rodriguez
61e5e9c434 fix(whatsapp.gblib): Fix PRIVACY_STORE_MESSAGES param. 2024-05-12 19:07:47 -03:00
Rodrigo Rodriguez
7b802a9485 fix(whatsapp.gblib): Fix PRIVACY_STORE_MESSAGES param. 2024-05-12 18:24:56 -03:00
Rodrigo Rodriguez
99b5b8ba8b fix(whatsapp.gblib): Fix PRIVACY_STORE_MESSAGES param. 2024-05-11 17:32:45 -03:00
Rodrigo Rodriguez
b301b238ff new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-05-06 18:26:37 -03:00
Rodrigo Rodriguez
dac6a8f8ec new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-05-06 18:21:18 -03:00
Rodrigo Rodriguez
d07feba899 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-05-06 18:07:34 -03:00
Rodrigo Rodriguez
6130f01565 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-05-06 17:52:08 -03:00
Rodrigo Rodriguez
a8099c5f97 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-05-06 17:35:46 -03:00
Rodrigo Rodriguez
b028c8e9aa new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-05-03 15:07:04 -03:00
Rodrigo Rodriguez
6518c9ca12 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-05-03 14:23:48 -03:00
Rodrigo Rodriguez
645af9acd4 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-05-03 14:18:16 -03:00
Rodrigo Rodriguez
bb6c202a1b new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-30 20:23:23 -03:00
Rodrigo Rodriguez
bed18dce6f new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-30 20:13:09 -03:00
Rodrigo Rodriguez
5f54859790 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-30 20:12:11 -03:00
Rodrigo Rodriguez
6059c60c06 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-30 20:08:59 -03:00
Rodrigo Rodriguez
3dd4956d9f new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-30 20:07:50 -03:00
Rodrigo Rodriguez
cf432b0152 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-30 15:08:24 -03:00
Rodrigo Rodriguez
3ec96d7bdd new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-30 15:05:31 -03:00
Rodrigo Rodriguez
db80d556c1 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-30 01:10:09 -03:00
Rodrigo Rodriguez
6b73c48e28 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-30 00:58:57 -03:00
Rodrigo Rodriguez
307d5fc405 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-30 00:56:24 -03:00
Rodrigo Rodriguez
8d04829ea5 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-30 00:42:28 -03:00
Rodrigo Rodriguez
43bcb2ce15 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-30 00:29:24 -03:00
Rodrigo Rodriguez
3cf8f8d138 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-30 00:22:02 -03:00
Rodrigo Rodriguez
23265ce488 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-29 14:41:18 -03:00
Rodrigo Rodriguez
1cf54c28c3 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-29 13:57:31 -03:00
Rodrigo Rodriguez
3672b46876 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-28 23:43:02 -03:00
Rodrigo Rodriguez
20e77ef3a2 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-28 23:34:58 -03:00
Rodrigo Rodriguez
913da03813 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-28 23:28:07 -03:00
Rodrigo Rodriguez
51845b45d7 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-28 19:18:47 -03:00
Rodrigo Rodriguez
bac90cbff8 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-28 16:17:00 -03:00
Rodrigo Rodriguez
37d9028f98 new(whatsapp.gblib): New WhatsApp provider: Meta. 2024-04-28 00:28:47 -03:00
Rodrigo Rodriguez
3e9170d446 new(all): GBLogEx published. 2024-04-27 17:47:06 -03:00
Rodrigo Rodriguez
d392c0082d new(all): GBLogEx published. 2024-04-27 17:04:54 -03:00
Rodrigo Rodriguez
76c3783ff9 new(all): GBLogEx published. 2024-04-21 23:39:39 -03:00
Rodrigo Rodriguez
ade7ee18b1 new(all): Domain update. 2024-04-20 17:24:00 -03:00
Rodrigo Rodriguez
1507509066 new(core.gbapp): New API endpoint. 2024-04-17 16:38:26 -03:00
Rodrigo Rodriguez
e3614d65bc new(core.gbapp): New API endpoint. 2024-04-17 16:32:48 -03:00
Rodrigo Rodriguez
5655605d29 new(core.gbapp): New API endpoint. 2024-04-17 16:07:19 -03:00
Rodrigo Rodriguez
cafebf6fe2 new(core.gbapp): New API endpoint. 2024-04-17 15:49:37 -03:00
Rodrigo Rodriguez
43feb52788 new(core.gbapp): New API endpoint. 2024-04-17 15:36:08 -03:00
Rodrigo Rodriguez
df41f1c55b new(core.gbapp): New API endpoint. 2024-04-17 15:07:53 -03:00
Rodrigo Rodriguez
63cbf7e733 new(core.gbapp): New API endpoint. 2024-04-17 14:56:31 -03:00
Rodrigo Rodriguez
8fd54d5ee0 new(core.gbapp): New API endpoint. 2024-04-17 14:48:30 -03:00
Rodrigo Rodriguez
dab7239f32 new(core.gbapp): New API endpoint. 2024-04-17 13:24:55 -03:00
Rodrigo Rodriguez
367d9ead7e new(core.gbapp): New API endpoint. 2024-04-17 13:12:04 -03:00
Rodrigo Rodriguez
8568f62bdc new(core.gbapp): New API endpoint. 2024-04-17 12:39:50 -03:00
Rodrigo Rodriguez
edb50e3b13 new(core.gbapp): New API endpoint. 2024-04-17 12:36:03 -03:00
Rodrigo Rodriguez
7c208954f3 new(core.gbapp): New API endpoint. 2024-04-17 12:27:00 -03:00
Rodrigo Rodriguez
0537e6f173 new(core.gbapp): New API endpoint. 2024-04-17 12:02:56 -03:00
Rodrigo Rodriguez
f830b01ac9 new(core.gbapp): New API endpoint. 2024-04-17 10:54:59 -03:00
Rodrigo Rodriguez
4ced6b667c new(core.gbapp): New API endpoint. 2024-04-17 10:50:33 -03:00
Rodrigo Rodriguez
4342c6d3e5 new(gpt.gblib): PDF opener. 2024-04-14 23:17:37 -03:00
Rodrigo Rodriguez
51107fcd76 new(gpt.gblib): PDF opener. 2024-04-14 12:37:07 -03:00
Rodrigo Rodriguez
462297dc75 new(WhatsApp.gblib): Warning of QRCode. 2024-04-13 17:08:10 -03:00
Rodrigo Rodriguez
61d31379eb new(WhatsApp.gblib): Warning of QRCode. 2024-04-13 14:14:03 -03:00
Rodrigo Rodriguez
a8dd58e7bf new(WhatsApp.gblib): Warning of QRCode. 2024-04-13 13:42:17 -03:00
Rodrigo Rodriguez
1ddffb359f new(WhatsApp.gblib): Warning of QRCode. 2024-04-13 13:42:04 -03:00
Rodrigo Rodriguez
ccd019d86a new(WhatsApp.gblib): Warning of QRCode. 2024-04-13 13:23:31 -03:00
Rodrigo Rodriguez
cd0fffb6a0 new(WhatsApp.gblib): Warning of QRCode. 2024-04-13 12:24:08 -03:00
Rodrigo Rodriguez
9b59146034 fix(basic.gblib): SEND EMAIL body is now optional. 2024-04-02 17:52:17 -03:00
Rodrigo Rodriguez
f52f52d716 fix(basic.gblib): #412 neutralization. 2024-04-01 13:00:47 -03:00
Rodrigo Rodriguez
9b1ba47ad9 fix(basic.gblib): #411 neutralization. 2024-04-01 12:54:43 -03:00
Rodrigo Rodriguez
70600569fc fix(basic.gblib): #411 neutralization. 2024-04-01 12:48:39 -03:00
Rodrigo Rodriguez
afb9844553 fix(basic.gblib): #411 neutralization. 2024-04-01 12:31:02 -03:00
Rodrigo Rodriguez
d5d6bb40a4 fix(basic.gblib): #411 neutralization. 2024-04-01 11:55:45 -03:00
Rodrigo Rodriguez
6e59db6cf2 fix(azuredeployer.gblib): #406, fixing. 2024-03-30 18:44:28 -03:00
Rodrigo Rodriguez
fef4e67c43 new(gpt.gblib): PDF opener. 2024-03-22 22:58:12 -03:00
Rodrigo Rodriguez
4fa02a625b new(gpt.gblib): PDF opener. 2024-03-22 22:51:36 -03:00
Rodrigo Rodriguez
81237bd787 fix(basic.gblib): FUNCTION GPT. 2024-03-22 19:18:17 -03:00
Rodrigo Rodriguez
3ff59514ae fix(basic.gblib): FUNCTION GPT. 2024-03-22 19:02:19 -03:00
Rodrigo Rodriguez
9019eb497d fix(basic.gblib): FUNCTION GPT. 2024-03-22 18:29:54 -03:00
Rodrigo Rodriguez
b14b55f6cd fix(basic.gblib): FUNCTION GPT. 2024-03-22 18:14:03 -03:00
Rodrigo Rodriguez
fdfc83220c fix(basic.gblib): FUNCTION GPT. 2024-03-21 23:59:10 -03:00
Rodrigo Rodriguez
a91e533306 fix(basic.gblib): FUNCTION GPT. 2024-03-21 23:49:32 -03:00
Rodrigo Rodriguez
44dc1f625a fix(basic.gblib): FUNCTION GPT. 2024-03-21 23:41:33 -03:00
Rodrigo Rodriguez
ba0adc57af new(gpt.gblib): Wikipedia feature. 2024-03-21 17:35:09 -03:00
Rodrigo Rodriguez
14b172187e fix(core.gbapp): Fix deployer group. 2024-03-20 00:42:44 -03:00
Rodrigo Rodriguez
063c149b94 fix(core.gbapp): Fix deployer group. 2024-03-19 11:45:21 -03:00
Rodrigo Rodriguez
ed67da171c fix(core.gbapp): Fix deployer group. 2024-03-17 20:32:10 -03:00
Rodrigo Rodriguez
f24eb63082 fix(core.gbapp): Fix deployer group. 2024-03-17 12:05:33 -03:00
Rodrigo Rodriguez
36a9a8eb1d new(security.gblib): SMS Auth. 2024-03-16 23:06:15 -03:00
Rodrigo Rodriguez
1a5f76f2ac fix(basic.gblib): Fix Scheduling. 2024-03-16 22:50:30 -03:00
Rodrigo Rodriguez
0451c4ca31 fix(basic.gblib): Fix Scheduling. 2024-03-16 22:42:24 -03:00
Rodrigo Rodriguez
8805996934 fix(basic.gblib): Fix Scheduling. 2024-03-16 22:36:32 -03:00
Rodrigo Rodriguez
bb9d8c91e6 fix(basic.gblib): Fix Scheduling. 2024-03-16 21:36:03 -03:00
359c1beb02 new(gpt.gblib): GPT Tools and .gbdialog. 2024-03-15 07:14:21 -03:00
a0c3481c7d new(gpt.gblib): GPT Tools and .gbdialog. 2024-03-13 20:26:13 -03:00
ce36ac476e new(gpt.gblib): GPT Tools and .gbdialog. 2024-03-13 20:12:05 -03:00
Rodrigo Rodriguez
e4a4c127c9 new(security.gblib): SMS Auth. 2024-03-13 09:04:30 -03:00
Rodrigo Rodriguez
eb260b54f9 new(security.gblib): SMS Auth. 2024-03-12 19:00:27 -03:00
Rodrigo Rodriguez
60db7b830a new(security.gblib): SMS Auth. 2024-03-12 18:58:43 -03:00
Rodrigo Rodriguez
8656f3538e new(security.gblib): SMS Auth. 2024-03-12 18:46:56 -03:00
Rodrigo Rodriguez
8e64f7af71 new(security.gblib): SMS Auth. 2024-03-11 15:11:15 -03:00
Rodrigo Rodriguez
c5c3101642 new(security.gblib): SMS Auth. 2024-03-11 15:07:38 -03:00
Rodrigo Rodriguez
40feb37297 new(security.gblib): SMS Auth. 2024-03-11 15:06:50 -03:00
Rodrigo Rodriguez
4cd64f8a90 new(security.gblib): SMS Auth. 2024-03-11 15:05:07 -03:00
Rodrigo Rodriguez
6112ce9a1c new(security.gblib): SMS Auth. 2024-03-11 15:03:53 -03:00
Rodrigo Rodriguez
27cdb25322 new(security.gblib): SMS Auth. 2024-03-11 13:45:20 -03:00
Rodrigo Rodriguez
a7f345592a new(security.gblib): SMS Auth. 2024-03-11 13:30:11 -03:00
Rodrigo Rodriguez
158c1603c9 fix(basic.gblib): FUNCTION GPT. 2024-03-10 00:16:24 -03:00
Rodrigo Rodriguez
ac0b3f150e new(WhatsApp.gblib): Official Twilio driver. 2024-03-09 14:02:17 -03:00
Rodrigo Rodriguez
cae8408b59 new(WhatsApp.gblib): Official Twilio driver. 2024-03-08 17:10:13 -03:00
Rodrigo Rodriguez
6217d3f8cd fix(basic.gblib): FUNCTION GPT. 2024-03-06 23:59:32 -03:00
Rodrigo Rodriguez
5cc5ba98a4 fix(basic.gblib): FUNCTION GPT. 2024-03-06 16:22:26 -03:00
Rodrigo Rodriguez
c6cd7cd5b8 fix(basic.gblib): FUNCTION GPT. 2024-03-06 14:38:37 -03:00
Rodrigo Rodriguez
49af4cfab7 fix(basic.gblib): FUNCTION GPT. 2024-03-04 20:05:56 -03:00
Rodrigo Rodriguez
26b05aa394 fix(basic.gblib): FUNCTION GPT. 2024-03-03 16:20:50 -03:00
Rodrigo Rodriguez
842e70d725 fix(basic.gblib): SET LANGUAGE fix. 2024-02-28 21:09:57 -03:00
Rodrigo Rodriguez
cff2107270 fix(basic.gblib): SET LANGUAGE fix. 2024-02-28 12:35:02 -03:00
Rodrigo Rodriguez
282f285788 fix(basic.gblib): SET LANGUAGE fix. 2024-02-28 12:15:30 -03:00
Rodrigo Rodriguez
7332dba36e fix(basic.gblib): ALLOW ROLE return people. 2024-02-25 21:07:58 -03:00
Rodrigo Rodriguez
64cd2d6d11 fix(basic.gblib): ALLOW ROLE return people. 2024-02-25 21:00:23 -03:00
Rodrigo Rodriguez
0e7775cef6 fix(basic.gblib): ALLOW ROLE return people. 2024-02-25 20:58:36 -03:00
Rodrigo Rodriguez
81ec80b516 fix(basic.gblib): ALLOW ROLE return people. 2024-02-25 20:01:07 -03:00
Rodrigo Rodriguez
7893cabf85 fix(basic.gblib): ALLOW ROLE return people. 2024-02-25 19:49:46 -03:00
Rodrigo Rodriguez
f8bc950514 fix(basic.gblib): ALLOW ROLE return people. 2024-02-24 18:53:01 -03:00
Rodrigo Rodriguez
0701bd7a8b fix(basic.gblib): ALLOW ROLE return people. 2024-02-24 18:01:28 -03:00
Rodrigo Rodriguez
d00553380e fix(basic.gblib): ALLOW ROLE return people. 2024-02-24 17:48:41 -03:00
Rodrigo Rodriguez
e08a02bec0 fix(basic.gblib): SEND FILE fix for sub directories. 2024-02-24 15:39:16 -03:00
Rodrigo Rodriguez
df0addc69b fix(basic.gblib): SEND FILE fix for sub directories. 2024-02-24 15:02:36 -03:00
Rodrigo Rodriguez
36e950ca52 fix(basic.gblib): SET SCHEDULE bug. @othonlima 2024-02-22 14:13:42 -03:00
Rodrigo Rodriguez
b02e2bd7c5 fix(basic.gblib): SET SCHEDULE bug. @othonlima 2024-02-22 13:54:54 -03:00
Rodrigo Rodriguez
630f824e9b new(basic.gblib): REPORT AND RESET REPORT new keywords @othonlima 2024-02-22 11:38:39 -03:00
Rodrigo Rodriguez
08d2e107e6 new(basic.gblib): REPORT AND RESET REPORT new keywords @othonlima 2024-02-22 11:31:25 -03:00
Rodrigo Rodriguez
1013fb65b8 new(basic.gblib): REPORT AND RESET REPORT new keywords @othonlima 2024-02-22 11:21:12 -03:00
Rodrigo Rodriguez
119e648310 new(basic.gblib): REPORT AND RESET REPORT new keywords @othonlima 2024-02-22 11:15:34 -03:00
Rodrigo Rodriguez
8d7b7cb956 new(basic.gblib): REPORT AND RESET REPORT new keywords @othonlima 2024-02-22 08:23:45 -03:00
Rodrigo Rodriguez
078eb21a8c new(basic.gblib): REPORT AND RESET REPORT new keywords @othonlima 2024-02-21 22:21:55 -03:00
Rodrigo Rodriguez
67bc886335 fix(basic.gblib): POST/PUT bug fix. @othonlima 2024-02-20 23:00:16 -03:00
Rodrigo Rodriguez
57a33f8461 fix(basic.gblib): POST/PUT bug fix. @othonlima 2024-02-20 22:51:31 -03:00
Rodrigo Rodriguez
de37389b41 fix(basic.gblib): POST/PUT bug fix. @othonlima 2024-02-20 22:37:16 -03:00
Rodrigo Rodriguez
83b10ee072 fix(basic.gblib): Allow FIND keyword in storage #386. @othonlima 2024-02-18 23:32:44 -03:00
Rodrigo Rodriguez
2305f81b28 fix(all): Locale in Audio is dynamic. 2024-02-18 11:04:07 -03:00
Rodrigo Rodriguez
03f94d0931 fix(all): Locale in Audio is dynamic. 2024-02-18 01:15:47 -03:00
Rodrigo Rodriguez
fb6e57b19a fix(all): Locale in Audio is dynamic. 2024-02-17 22:21:40 -03:00
Rodrigo Rodriguez
d1c4c23fa1 fix(all): Locale in Audio is dynamic. 2024-02-17 21:42:45 -03:00
Rodrigo Rodriguez
e0980bc480 fix(all): Locale in Audio is dynamic. 2024-02-17 20:33:08 -03:00
Rodrigo Rodriguez
3717f8b1fe fix(all): Locale in Audio is dynamic. 2024-02-17 17:32:42 -03:00
Rodrigo Rodriguez
843052a2e9 fix(all): Locale in Audio is dynamic. 2024-02-17 17:31:51 -03:00
Rodrigo Rodriguez
6b4efe3110 new(all): Unit test infra added again. 2024-02-17 17:27:53 -03:00
Rodrigo Rodriguez
e1ec6e0f05 new(all): Unit test infra added again. 2024-02-17 17:20:13 -03:00
Rodrigo Rodriguez
bbc930407a fix(all): Locale in Audio is dynamic. 2024-02-17 11:57:49 -03:00
Rodrigo Rodriguez
2bbbe502e6 fix(all): Translator and spelling and audio. 2024-02-16 21:26:11 -03:00
Rodrigo Rodriguez
6bad713630 fix(all): Translator and spelling. 2024-02-16 17:35:13 -03:00
Rodrigo Rodriguez
9c8fff3629 fix(all): Working with no Azure Search. 2024-02-15 20:50:17 -03:00
Rodrigo Rodriguez
972b0f9bfd fix(basic.gblib): Allow MERGE keyword in storage #386. @othonlima 2024-02-11 02:07:25 -03:00
Rodrigo Rodriguez
d5bcf5f303 fix(basic.gblib): Allow MERGE keyword in storage #386. @othonlima 2024-02-11 02:00:28 -03:00
Rodrigo Rodriguez
015bfb74e8 fix(basic.gblib): Allow MERGE keyword in storage #386. @othonlima 2024-02-08 15:27:33 -03:00
Rodrigo Rodriguez
57ef966340 fix(basic.gblib): Allow MERGE keyword in storage #386. @othonlima 2024-02-08 15:09:05 -03:00
Rodrigo Rodriguez
d18f72e9c5 fix(basic.gblib): Allow MERGE keyword in storage #386. @othonlima 2024-02-08 15:02:01 -03:00
Rodrigo Rodriguez
fe4e1a38f0 fix(basic.gblib): Allow MERGE keyword in storage #386. @othonlima 2024-02-08 14:40:58 -03:00
Rodrigo Rodriguez
04f1baa470 fix(basic.gblib): Allow MERGE keyword in storage #386. @othonlima 2024-02-08 14:19:59 -03:00
Rodrigo Rodriguez
f0b256f728 fix(basic.gblib): Allow MERGE keyword in storage #386. @othonlima 2024-02-08 13:56:44 -03:00
Rodrigo Rodriguez
796ad85fb7 new(basic.gblib): GPT replacing ALLEN NLP Reading Comp. 2024-02-06 22:44:34 -03:00
Rodrigo Rodriguez
070605bf4f new(basic.gblib): GPT replacing ALLEN NLP Reading Comp. 2024-02-05 13:10:47 -03:00
Rodrigo Rodriguez
681d20c5fe new(basic.gblib): GPT replacing ALLEN NLP Reading Comp. 2024-02-05 12:36:20 -03:00
Rodrigo Rodriguez
218bcd1b3e fix(basic.gblib): Allow MERGE keyword in storage #386. @othonlima 2024-02-01 21:33:36 -03:00
Rodrigo Rodriguez
2e13ea0f6d new(basic.gblib): GPT replacing ALLEN NLP Reading Comp. 2024-01-31 16:02:11 -03:00
Rodrigo Rodriguez
7ac1cb4ab7 new(basic.gblib): GPT replacing ALLEN NLP Reading Comp. 2024-01-31 15:24:21 -03:00
Rodrigo Rodriguez
2a3e0f5782 new(basic.gblib): GPT replacing ALLEN NLP Reading Comp. 2024-01-30 19:21:04 -03:00
Rodrigo Rodriguez
3ddeabdf19 new(basic.gblib): GPT replacing ALLEN NLP Reading Comp. 2024-01-29 23:03:56 -03:00
Rodrigo Rodriguez
ff6adacf9b new(basic.gblib): GPT replacing ALLEN NLP Reading Comp. 2024-01-29 21:04:53 -03:00
Rodrigo Rodriguez
4d8061db60 fix(basic.gblib): Fixes #395 talk with no quotes. 2024-01-21 22:54:38 -03:00
Rodrigo Rodriguez
5ed835afdb new(basic.gblib): API online for GB. 2024-01-18 09:41:17 -03:00
Rodrigo Rodriguez
adac385b5a new(basic.gblib): API online for GB. 2024-01-16 23:32:04 -03:00
Rodrigo Rodriguez
f520c69f3f fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2024-01-14 22:23:53 -03:00
Rodrigo Rodriguez
aa80f485c7 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2024-01-14 13:58:59 -03:00
Rodrigo Rodriguez
86313b7684 fix(basic.gblib): DELETE keyword in storage #400. @othonlima 2024-01-13 14:23:04 -03:00
Rodrigo Rodriguez
d23524b7b8 new(basic.gblib): FORMAT function, @othonlima. 2024-01-11 14:42:00 -03:00
Rodrigo Rodriguez
c844613c98 fix(core.gbapp): Fixes #391 ignore case during params object access. 2024-01-10 15:43:07 -03:00
Rodrigo Rodriguez
99da0001d7 fix(all): Unified sleep functions in util.ts. 2024-01-10 15:01:02 -03:00
Rodrigo Rodriguez
f83c3577bc fix(all): Logo change. 2024-01-10 14:52:01 -03:00
Rodrigo Rodriguez
df8e4be4e9 fix(all): Logo change. 2024-01-09 17:41:41 -03:00
Rodrigo Rodriguez
10b4a5d33d fix(all): Logo change. 2024-01-09 17:40:48 -03:00
Rodrigo Rodriguez
2713a120ac fix(basic.gblib): Fixes #395 talk with no quotes. 2024-01-09 17:18:26 -03:00
Rodrigo Rodriguez
02d9411671 fix(basic.gblib): Allow MERGE keyword in storage #386. @othonlima 2024-01-09 16:17:49 -03:00
Rodrigo Rodriguez
f31b96d541 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2024-01-08 20:09:02 -03:00
Rodrigo Rodriguez
de5b0a7acd fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2024-01-06 22:21:11 -03:00
Rodrigo Rodriguez
c726947d2a new(basic.gblib): Databases. #392 @othonlima. 2024-01-06 19:33:21 -03:00
Rodrigo Rodriguez
1abb3d4cca fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2024-01-04 11:20:05 -03:00
Rodrigo Rodriguez
656f7ccd2b fix(all): Fixes in bot creation. 2024-01-03 14:37:28 -03:00
Rodrigo Rodriguez
0b4532c883 fix(all): Fixes #399 tabs missing from JS output. 2024-01-01 11:20:10 -03:00
Rodrigo Rodriguez
c23f025d6a fix(all): Fixes #399 tabs missing from JS output. 2023-12-29 21:43:48 -03:00
Rodrigo Rodriguez
2dc6e327e8 fix(all): Fixes in bot creation. 2023-12-29 19:14:48 -03:00
Rodrigo Rodriguez
e45c25cf3e fix(all): Fixes in bot creation. 2023-12-29 17:25:07 -03:00
Rodrigo Rodriguez
1e0e60d37a fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima @christopherdecastilho. 2023-12-28 17:19:38 -03:00
Rodrigo Rodriguez
91034dab77 fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima @christopherdecastilho. 2023-12-28 10:37:28 -03:00
Rodrigo Rodriguez
c855934fdf fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima @christopherdecastilho. 2023-12-28 10:32:47 -03:00
Rodrigo Rodriguez
03586868ec fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima @christopherdecastilho. 2023-12-28 08:21:16 -03:00
Rodrigo Rodriguez
84858db975 fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima @christopherdecastilho. 2023-12-28 07:56:55 -03:00
Rodrigo Rodriguez
4bd2340613 fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima. 2023-12-26 21:52:37 -03:00
Rodrigo Rodriguez
8a7dcb5198 fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima. 2023-12-26 21:43:23 -03:00
Rodrigo Rodriguez
9d1ba4ee8f fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima. 2023-12-26 15:19:55 -03:00
Rodrigo Rodriguez
c2ed3f65ce fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima. 2023-12-26 11:45:36 -03:00
Rodrigo Rodriguez
145cb47724 fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima. 2023-12-26 11:35:42 -03:00
Rodrigo Rodriguez
40d07a43c0 fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima. 2023-12-26 11:32:52 -03:00
Rodrigo Rodriguez
efa5e0fd03 fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima. 2023-12-26 11:28:06 -03:00
Rodrigo Rodriguez
2f29287a96 fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima. 2023-12-25 19:48:32 -03:00
Rodrigo Rodriguez
255a10bdc3 fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima. 2023-12-25 18:42:23 -03:00
Rodrigo Rodriguez
c6076c32ef fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima. 2023-12-25 18:37:36 -03:00
Rodrigo Rodriguez
ca7e24ee5a fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima. 2023-12-25 18:28:37 -03:00
Rodrigo Rodriguez
b0163b6096 fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima. 2023-12-25 17:47:23 -03:00
Rodrigo Rodriguez
be0abaf6c7 fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima. 2023-12-24 10:45:12 -03:00
Rodrigo Rodriguez
f6557df78e fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima. 2023-12-24 10:33:20 -03:00
Rodrigo Rodriguez
dbf0d965cd fix(all): WhatsApp mp4 sending OK with Chrome. 2023-12-22 20:21:31 -03:00
Rodrigo Rodriguez
c42843c190 fix(all): Fixes in bot creation. 2023-12-20 18:07:09 -03:00
Rodrigo Rodriguez
811a6e320b fix(basic.gblib): HEAR AS now shows domain items to user when validation fails. 2023-12-19 18:19:36 -03:00
Rodrigo Rodriguez
d20c2f7742 fix(basic.gblib): HEAR AS now shows domain items to user when validation fails. 2023-12-19 18:16:30 -03:00
Rodrigo Rodriguez
1517f4f0c3 fix(basic.gblib): SEND FILE TO extension adjusted according to file type. 2023-12-19 16:55:49 -03:00
Rodrigo Rodriguez
d1cb8b4f01 fix(basic.gblib): SEND FILE TO extension adjusted according to file type. 2023-12-19 16:52:23 -03:00
Rodrigo Rodriguez
00d78efa30 fix(basic.gblib): SEND FILE TO extension adjusted according to file type. 2023-12-19 16:48:28 -03:00
Rodrigo Rodriguez
7c9c78e3c3 fix(basic.gblib): SEND FILE TO extension adjusted according to file type. 2023-12-19 16:41:41 -03:00
Rodrigo Rodriguez
872471c13f fix(basic.gblib): #395 TALK with no quotes. 2023-12-19 07:16:20 -03:00
Rodrigo Rodriguez
825d6c1a0f fix(basic.gblib): #394 UPLOAD keyword. 2023-12-18 11:14:38 -03:00
Rodrigo Rodriguez
0dc09db4e7 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-17 16:34:03 -03:00
Rodrigo Rodriguez
6c5c28286c fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-17 15:43:09 -03:00
Rodrigo Rodriguez
a81f86db9e fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-17 01:03:04 -03:00
Rodrigo Rodriguez
1bf2f01f8f fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-17 00:52:16 -03:00
Rodrigo Rodriguez
7d33971a91 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-17 00:51:43 -03:00
Rodrigo Rodriguez
c1cad3573d fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-17 00:41:44 -03:00
Rodrigo Rodriguez
b4ba7df585 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-16 23:34:06 -03:00
Rodrigo Rodriguez
9e6ae42a5d fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-16 22:37:34 -03:00
Rodrigo Rodriguez
595cf3f1c7 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-16 22:28:55 -03:00
Rodrigo Rodriguez
972536b03e fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-16 22:17:21 -03:00
Rodrigo Rodriguez
3c7a1d1e8e fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-16 21:55:23 -03:00
Rodrigo Rodriguez
57bb89a73e fix(basic.gblib): #394 UPLOAD keyword. 2023-12-15 11:59:24 -03:00
Rodrigo Rodriguez
df7300a68c fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-14 13:05:37 -03:00
Rodrigo Rodriguez
a9bb5e517e fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-14 12:44:01 -03:00
Rodrigo Rodriguez
919b703b4d fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-14 12:42:21 -03:00
Rodrigo Rodriguez
f5f64fd09b fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-14 12:34:41 -03:00
Rodrigo Rodriguez
a7308ef1e8 fix(basic.gblib): #394 UPLOAD keyword. 2023-12-13 15:33:00 -03:00
Rodrigo Rodriguez
bd3fd5d6af fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-13 10:56:44 -03:00
Rodrigo Rodriguez
fddb2289d3 new(basic.gblib): #394 UPLOAD keyword. 2023-12-13 00:37:36 -03:00
Rodrigo Rodriguez
10871af6ca new(basic.gblib): #394 UPLOAD keyword. 2023-12-12 23:47:19 -03:00
Rodrigo Rodriguez
3fa89851d2 new(basic.gblib): #393 DIR keyword. 2023-12-12 23:23:50 -03:00
Rodrigo Rodriguez
4b4205a599 new(core.gbapp): Save to Azure Blob. 2023-12-12 19:53:05 -03:00
Rodrigo Rodriguez
46265b31d5 fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima. 2023-12-12 15:07:49 -03:00
Rodrigo Rodriguez
ab87996d60 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-12 13:51:11 -03:00
Rodrigo Rodriguez
6d022b4023 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-12 13:47:07 -03:00
Rodrigo Rodriguez
dee0c8cca7 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-11 22:13:36 -03:00
Rodrigo Rodriguez
0c2e91fcaf fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-11 15:46:53 -03:00
Rodrigo Rodriguez
676fe1fc6c fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-10 21:09:50 -03:00
Rodrigo Rodriguez
2c42fa5ace fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-10 21:08:27 -03:00
Rodrigo Rodriguez
f81bbc6207 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-10 21:00:00 -03:00
Rodrigo Rodriguez
4c48639b71 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-10 20:43:54 -03:00
Rodrigo Rodriguez
e5a42a8566 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-10 20:33:53 -03:00
Rodrigo Rodriguez
555babcb23 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-10 20:24:48 -03:00
Rodrigo Rodriguez
d298e0b148 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-10 20:03:00 -03:00
Rodrigo Rodriguez
84cc7b85cb fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-10 12:21:28 -03:00
Rodrigo Rodriguez
f2da1f8810 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-07 17:10:57 -03:00
Rodrigo Rodriguez
df76d1de65 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-03 11:26:44 -03:00
Rodrigo Rodriguez
5e5684e367 new(basic.gblib): Retry in GET 401 version. 2023-12-02 19:26:14 -03:00
Rodrigo Rodriguez
540e275d65 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-02 12:25:43 -03:00
Rodrigo Rodriguez
4ff3cbafd5 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-12-02 10:21:12 -03:00
Rodrigo Rodriguez
d79221a7ff fix(basic.gblib): Databases. #392 @othonlima. 2023-12-01 22:17:13 -03:00
Rodrigo Rodriguez
165619960d fix(basic.gblib): Databases. #392 @othonlima. 2023-12-01 22:02:37 -03:00
Rodrigo Rodriguez
77a3a9a7a6 fix(basic.gblib): Databases. #392 @othonlima. 2023-11-30 22:42:01 -03:00
Rodrigo Rodriguez
4d8b6da2a0 fix(basic.gblib): Databases. #392 @othonlima. 2023-11-30 22:31:45 -03:00
Rodrigo Rodriguez
2e458fd896 fix(basic.gblib): Databases. #392 @othonlima. 2023-11-30 22:30:12 -03:00
Rodrigo Rodriguez
a728746d8c fix(basic.gblib): Databases. #392 @othonlima. 2023-11-30 16:59:32 -03:00
Rodrigo Rodriguez
99a729b7f5 fix(basic.gblib): Databases. #392 @othonlima. 2023-11-30 15:47:47 -03:00
Rodrigo Rodriguez
4c64bddea9 fix(basic.gblib): Databases. #392 @othonlima. 2023-11-30 13:47:04 -03:00
Rodrigo Rodriguez
4352cc88a1 fix(basic.gblib): Databases. #392 @othonlima. 2023-11-29 22:46:38 -03:00
Rodrigo Rodriguez
94b294d388 fix(basic.gblib): Databases. #392 @othonlima. 2023-11-29 20:31:12 -03:00
Rodrigo Rodriguez
0897210df8 fix(basic.gblib): Databases. #392 @othonlima. 2023-11-29 20:00:58 -03:00
Rodrigo Rodriguez
1e9809f678 fix(basic.gblib): Databases. #392 @othonlima. 2023-11-29 19:06:41 -03:00
Rodrigo Rodriguez
5dd2cc3a29 fix(basic.gblib): Databases. #392 @othonlima. 2023-11-29 18:46:02 -03:00
Rodrigo Rodriguez
d8de3b8778 fix(basic.gblib): Databases. #392 @othonlima. 2023-11-29 13:20:26 -03:00
Rodrigo Rodriguez
2cd4d64bd1 new(basic.gblib): Databases. #392 @othonlima. 2023-11-29 00:58:44 -03:00
Rodrigo Rodriguez
6a8beecc14 new(basic.gblib): Databases! #392. 2023-11-28 14:13:44 -03:00
Rodrigo Rodriguez
bacbb9c772 fix(basic.gblib): Fix in SEND FILE version. 2023-11-27 14:52:50 -03:00
Rodrigo Rodriguez
3f266f1262 fix(basic.gblib): Fix in SEND FILE version. 2023-11-27 14:40:08 -03:00
Rodrigo Rodriguez
66ea211dd5 new(basic.gblib): Fix in SAVE xlsx version. 2023-11-27 13:24:15 -03:00
Rodrigo Rodriguez
8a61d1f0a1 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-11-26 17:56:02 -03:00
Rodrigo Rodriguez
60a9e2f7e5 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-11-26 16:59:13 -03:00
Rodrigo Rodriguez
dbdeecca50 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-11-25 14:14:17 -03:00
Rodrigo Rodriguez
30e6bf9b3b fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-11-25 10:07:13 -03:00
Rodrigo Rodriguez
f3205594f0 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-11-24 21:02:32 -03:00
Rodrigo Rodriguez
1447f31fb6 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-11-23 19:55:56 -03:00
Rodrigo Rodriguez
a5722b95a2 fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-11-23 19:53:38 -03:00
Rodrigo Rodriguez
0c9d7a40ae fix(basic.gblib): Allow MERGE keyword in storage #380. @othonlima 2023-11-20 14:47:24 -03:00
Rodrigo Rodriguez
42a9a8c402 fix(core.gbapp): #387 adding /setupSecurity multiple tokens. Refresh token fix. @othonlima. 2023-11-20 11:29:36 -03:00
Rodrigo Rodriguez
6483f589ea fix(core.gbapp): #387 adding /setupSecurity multiple tokens. @othonlima. 2023-11-19 17:56:13 -03:00
Rodrigo Rodriguez
863591741d new(core.gbapp): #387 adding /setupSecurity multiple tokens. 2023-11-17 15:24:05 -03:00
Rodrigo Rodriguez
db21ad6574 new(core.gbapp): #387 adding /setupSecurity multiple tokens. 2023-11-17 14:27:12 -03:00
Rodrigo Rodriguez
ff76a2f963 fix(all): Create bot OK. 2023-11-12 10:09:21 -03:00
Rodrigo Rodriguez
5bf81735e8 fix(all): Create bot OK. 2023-11-12 10:08:08 -03:00
Rodrigo Rodriguez
777762d58b fix(all): URLs for MSTeams. 2023-11-11 18:59:17 -03:00
Rodrigo Rodriguez
4adf036918 fix(all): URLs for MSTeams. 2023-11-10 07:51:59 -03:00
Rodrigo Rodriguez
316b5262ee fix(whatsapp.gblib): Applied WhatsApp-web-js patch. 2023-11-03 11:39:50 -03:00
Rodrigo Rodriguez
693e12300d fix(azuredeployer.gbapp): Fix webchat keys. 2023-11-03 10:34:56 -03:00
Rodrigo Rodriguez
438fc33f25 fix(azuredeployer.gbapp): Fix webchat keys. 2023-11-02 13:31:46 -03:00
Rodrigo Rodriguez
bc9b31fba7 fix(azuredeployer.gbapp): Fix webchat keys. 2023-11-02 13:20:51 -03:00
Rodrigo Rodriguez
bfcaf84188 fix(basic.gblib): SSR error. 2023-10-30 13:44:52 -03:00
Rodrigo Rodriguez
afdb3c86b1 fix(basic.gblib): SET PAGED keyword #377. 2023-10-26 09:51:23 -03:00
Rodrigo Rodriguez
d18ae6c511 fix(basic.gblib): SET PAGED keyword #377. 2023-10-26 07:52:57 -03:00
Rodrigo Rodriguez
488ef9d0f8 fix(basic.gblib): SET PAGED keyword #377. 2023-10-21 14:47:30 -03:00
Rodrigo Rodriguez
1575bf2661 fix(basic.gblib): Allow MERGE keyword in storage #380. 2023-10-21 12:09:37 -03:00
Rodrigo Rodriguez
1dd7b2aa99 fix(basic.gblib): Allow MERGE keyword in storage #380. 2023-10-20 17:35:03 -03:00
Rodrigo Rodriguez
6e1c01e6fe fix(basic.gblib): Allow TABLE keyword multiple times per file #383. 2023-10-20 13:39:34 -03:00
Rodrigo Rodriguez
cb311832a4 new(basic.gblib): Allow TABLE keyword multiple times per file #383. 2023-10-13 16:15:17 -03:00
Rodrigo Rodriguez
8616d60691 new(basic.gblib): Allow TABLE keyword multiple times per file #383. 2023-10-13 16:14:50 -03:00
Rodrigo Rodriguez
568c6724da new(basic.gblib): Allow TABLE keyword multiple times per file #383. 2023-10-13 16:08:42 -03:00
Rodrigo Rodriguez
16b140a21c new(basic.gblib): Allow TABLE keyword multiple times per file #383. 2023-10-13 16:00:05 -03:00
Rodrigo Rodriguez
292d4b918c new(basic.gblib): Allow TABLE keyword multiple times per file #383. 2023-10-13 14:53:36 -03:00
Rodrigo Rodriguez
2f99a2d548 new(basic.gblib): Allow TABLE keyword multiple times per file #383. 2023-10-10 13:51:27 -03:00
Rodrigo Rodriguez
15b6d9ebc0 new(basic.gblib): Allow TABLE keyword multiple times per file #383. 2023-10-10 12:48:52 -03:00
Rodrigo Rodriguez
989a45890d new(basic.gblib): Allow TABLE keyword multiple times per file #383. 2023-10-09 19:21:34 -03:00
Rodrigo Rodriguez
41f7eea81a new(basic.gblib): Allow relationships in TABLE keywod #381. 2023-10-08 16:03:33 -03:00
Rodrigo Rodriguez
0212ed6e21 new(basic.gblib): guid data type for TABLE keyword and as replacement for Interger Id #382. 2023-10-08 15:21:26 -03:00
Rodrigo Rodriguez
f163204c15 new(basic.gblib): Allow MERGE keyword in storage #380. 2023-10-07 18:40:10 -03:00
Rodrigo Rodriguez
5f751cfbe7 new(basic.gblib): TABLE keyword #375 fixes. 2023-10-05 17:15:57 -03:00
Rodrigo Rodriguez
b14ff889b2 new(basic.gblib): TABLE keyword #375 fixes. 2023-10-05 11:28:23 -03:00
Rodrigo Rodriguez
7163c077fe new(basic.gblib): TABLE keyword #375 fixes. 2023-10-05 10:06:03 -03:00
Rodrigo Rodriguez
90e0688cd6 new(basic.gblib): aadToken reserved word #378. 2023-10-04 15:39:03 -03:00
Rodrigo Rodriguez
f9cfb37b29 new(basic.gblib): Auto variables for .gbot params #374. 2023-10-04 15:30:29 -03:00
Rodrigo Rodriguez
4c46ffd885 new(basic.gblib): SET PAGED keyword #377. 2023-10-04 15:21:51 -03:00
Rodrigo Rodriguez
dbe430c623 new(basic.gblib): SET PAGED keyword #377. 2023-10-04 09:48:54 -03:00
Rodrigo Rodriguez
1a3a6e0d01 new(basic.gblib): TABLE keyword #375. 2023-10-02 16:39:13 -03:00
Rodrigo Rodriguez
0012fd0f89 new(basic.gblib): TABLE keyword #375. 2023-10-02 16:22:51 -03:00
Rodrigo Rodriguez
0385cad21f Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-09-30 20:43:40 -03:00
Rodrigo Rodriguez
c1c3d2d913 new(basic.gblib): TABLE keyword #375. 2023-09-30 20:43:39 -03:00
edd0fe9fea Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-09-29 19:04:38 -03:00
4f410c1c3d fix(azuredeployer.gblib): Removal of invalid provider 2023-09-29 19:03:37 -03:00
Rodrigo Rodriguez
6ad8dfc343 fix(core.gbapp): #372 fix. 2023-09-29 17:23:02 -03:00
Rodrigo Rodriguez
05fd0ea54e fix(core.gbapp): #372 fix. 2023-09-29 16:15:43 -03:00
Rodrigo Rodriguez
dfd6981907 fix(core.gbapp): #372 fix. 2023-09-29 15:55:35 -03:00
Rodrigo Rodriguez
49d47f6e6c fix(core.gbapp): #372 fix. 2023-09-29 15:38:41 -03:00
Rodrigo Rodriguez
9dfd3412ba fix(core.gbapp): #373 fix. 2023-09-29 15:18:50 -03:00
Rodrigo Rodriguez
fff1504a00 fix(core.gbapp): #372 fix. 2023-09-29 13:24:24 -03:00
Rodrigo Rodriguez
532d9a54c6 fix(whatsapp.gblib): Fix in sending numbers with plus sign. 2023-09-21 11:24:08 -03:00
Rodrigo Rodriguez
cf723fbf99 fix(whatsapp.gblib): Fix in sending numbers with plus sign. 2023-09-21 11:20:54 -03:00
Rodrigo Rodriguez
54612054cc fix(whatsapp.gblib): Fix in sending numbers with plus sign. 2023-09-21 11:15:09 -03:00
Rodrigo Rodriguez
edd800f36e fix(kb.gbapp): #361 GPT functions in Word. 2023-09-20 15:25:44 -03:00
Rodrigo Rodriguez
d7cb00f4ce fix(kb.gbapp): #361 GPT functions in Word. 2023-09-19 19:36:05 -03:00
Rodrigo Rodriguez
722e86c47d fix(kb.gbapp): #361 GPT functions in Word. 2023-09-17 21:40:34 -03:00
Rodrigo Rodriguez
853de9df17 fix(kb.gbapp): API after new Bot #370. 2023-09-16 17:54:47 -03:00
Rodrigo Rodriguez
aa725c71b3 fix(kb.gbapp): API after new Bot #370. 2023-09-16 17:49:16 -03:00
Rodrigo Rodriguez
b7ac946fe7 fix(kb.gbapp): API after new Bot #370. 2023-09-16 17:41:36 -03:00
Rodrigo Rodriguez
4ecc78e298 fix(kb.gbapp): Fix importing packages. 2023-09-16 09:41:31 -03:00
Rodrigo Rodriguez
67c3495f80 fix(kb.gbapp): Fix importing packages. 2023-09-14 12:10:47 -03:00
Rodrigo Rodriguez
e39c33b8f7 fix(kb.gbapp): Fix importing packages. 2023-09-14 12:02:53 -03:00
Rodrigo Rodriguez
ac865497f0 fix(kb.gbapp): Fix importing packages. 2023-09-14 00:19:33 -03:00
Rodrigo Rodriguez
f980d54761 fix(kb.gbapp): Fix importing packages. 2023-09-14 00:09:31 -03:00
Rodrigo Rodriguez
e436c6e896 fix(kb.gbapp): Fix importing packages. 2023-09-13 21:02:33 -03:00
Rodrigo Rodriguez
917c8ac58e fix(kb.gbapp): Fix importing packages. 2023-09-13 19:42:45 -03:00
Rodrigo Rodriguez
0fc3d714c0 fix(kb.gbapp): Fix importing packages. 2023-09-13 19:37:04 -03:00
Rodrigo Rodriguez
4b4c24ac5e fix(kb.gbapp): Fix importing packages. 2023-09-13 19:34:38 -03:00
Rodrigo Rodriguez
cbc3ca9fbf fix(kb.gbapp): Fix importing packages. 2023-09-13 18:53:45 -03:00
Rodrigo Rodriguez
e7a7b41531 fix(all): Fix search on others bots than boot. 2023-09-13 18:39:36 -03:00
Rodrigo Rodriguez
5812b59bb4 fix(all): Fix search on others bots than boot. 2023-09-11 13:47:36 -03:00
Rodrigo Rodriguez
d2bd039d32 fix(all): Fix search on others bots than boot. 2023-09-11 13:39:11 -03:00
Rodrigo Rodriguez
436d9d28b8 fix(all): Fix search on others bots than boot. 2023-09-11 10:51:43 -03:00
Rodrigo Rodriguez
6f9459ce0b fix(all): Fix search on others bots than boot. 2023-09-11 10:47:47 -03:00
Rodrigo Rodriguez
6a7c49f827 fix(all): Fix search on others bots than boot. 2023-09-10 22:42:32 -03:00
Rodrigo Rodriguez
f86f711774 fix(all): Fix search on others bots than boot. 2023-09-10 22:36:39 -03:00
Rodrigo Rodriguez
19ae7e1cae fix(all): Fix search on others bots than boot. 2023-09-10 22:18:05 -03:00
Rodrigo Rodriguez
2c0d8a84e8 fix(all): Fix search on others bots than boot. 2023-09-10 20:53:15 -03:00
Rodrigo Rodriguez
b619cdc219 fix(all): Fix search on others bots than boot. 2023-09-10 20:40:42 -03:00
Rodrigo Rodriguez
c8ae34bc71 fix(all): Fix search on others bots than boot. 2023-09-10 17:37:13 -03:00
Rodrigo Rodriguez
741b40c77b fix(all): Fix search on others bots than boot. 2023-09-10 17:23:32 -03:00
Rodrigo Rodriguez
32601d2460 fix(all): Fix search on others bots than boot. 2023-09-10 13:39:07 -03:00
Rodrigo Rodriguez
73a9ffefdb fix(all): Fix search on others bots than boot. 2023-09-10 13:33:20 -03:00
Rodrigo Rodriguez
77920f640d fix(all): Fix user switching on a single chip. 2023-09-09 22:33:06 -03:00
Rodrigo Rodriguez
bdee92f128 fix(all): Fix user switching on a single chip. 2023-09-09 21:57:26 -03:00
Rodrigo Rodriguez
ae4f7c52df fix(all): Fix user switching on a single chip. 2023-09-09 21:36:00 -03:00
Rodrigo Rodriguez
12899170fd fix(all): Fix user switching on a single chip. 2023-09-09 16:44:53 -03:00
Rodrigo Rodriguez
934bafb71e fix(all): Fix user switching on a single chip. 2023-09-09 16:38:47 -03:00
Rodrigo Rodriguez
9ab41597af fix(all): Fix user switching on a single chip. 2023-09-09 16:19:17 -03:00
Rodrigo Rodriguez
b69ffa91d9 fix(all): Fix user switching on a single chip. 2023-09-09 14:29:01 -03:00
Rodrigo Rodriguez
700e18006a fix(all): Fix user switching on a single chip. 2023-09-09 14:16:54 -03:00
Rodrigo Rodriguez
f553260b56 fix(all): Fix user switching on a single chip. 2023-09-09 14:13:22 -03:00
Rodrigo Rodriguez
69e4062146 fix(all): Fix user switching on a single chip. 2023-09-09 14:07:05 -03:00
Rodrigo Rodriguez
d261ea371b fix(all): Fix user switching on a single chip. 2023-09-09 13:59:14 -03:00
Rodrigo Rodriguez
ed964247da fix(all): Fix user switching on a single chip. 2023-09-09 13:09:49 -03:00
Rodrigo Rodriguez
da02804ac9 fix(all): Fix user switching on a single chip. 2023-09-09 13:04:20 -03:00
Rodrigo Rodriguez
c577b64369 fix(all): Fix user switching on a single chip. 2023-09-09 12:50:45 -03:00
Rodrigo Rodriguez
1a0acaa575 fix(all): Fix user switching on a single chip. 2023-09-09 12:37:53 -03:00
Rodrigo Rodriguez
1c41c9b915 fix(all): Fix in bot proxy outdated columns. 2023-09-05 12:26:23 -03:00
Rodrigo Rodriguez
841588ca95 fix(all): Fix in bot proxy outdated columns. 2023-09-04 16:10:08 -03:00
Rodrigo Rodriguez
51caf5f575 fix(whatsapp.gblib): Fix in bot switching. 2023-09-03 16:46:40 -03:00
Rodrigo Rodriguez
99e6cbc742 fix(whatsapp.gblib): Fix in bot switching. 2023-09-03 16:38:40 -03:00
Rodrigo Rodriguez
8e87b24190 fix(whatsapp.gblib): Fix in bot switching. 2023-09-03 16:34:16 -03:00
Rodrigo Rodriguez
55d718c05c fix(whatsapp.gblib): Fix in bot switching. 2023-09-03 16:33:08 -03:00
Rodrigo Rodriguez
fb96a3f7c5 fix(whatsapp.gblib): Fix in bot switching. 2023-09-03 16:25:22 -03:00
Rodrigo Rodriguez
d7e00a2154 fix(whatsapp.gblib): Fix in bot switching. 2023-09-03 16:22:03 -03:00
Rodrigo Rodriguez
1e8b66f9b4 fix(whatsapp.gblib): Fix in bot switching. 2023-09-03 16:13:28 -03:00
Rodrigo Rodriguez
69cd2e0188 fix(whatsapp.gblib): Fix in bot switching. 2023-09-03 16:03:22 -03:00
Rodrigo Rodriguez
929b36d578 fix(whatsapp.gblib): Fix in bot switching. 2023-09-03 14:48:05 -03:00
Rodrigo Rodriguez
6c4a546202 fix(all): Updating ngrok. 2023-09-03 12:40:25 -03:00
Rodrigo Rodriguez
d326f4205d fix(all): Updating ngrok. 2023-09-02 21:04:46 -03:00
Rodrigo Rodriguez
342f30d041 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-09-02 20:09:57 -03:00
Rodrigo Rodriguez
5fd39bc7ea fix(azuredeployer.gbapp): Fix in bot booting. 2023-09-02 20:09:55 -03:00
646fb4a1fa Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-08-31 17:48:09 -03:00
70ec61c88c fix(azuredeployer.gbapp): Fix in bot booting. 2023-08-31 17:48:06 -03:00
Rodrigo Rodriguez
756dd8e712 fix(azuredeployer.gbapp): Fix in bot booting. 2023-08-31 17:44:10 -03:00
Rodrigo Rodriguez
fe86deff96 fix(azuredeployer.gbapp): Fix in bot booting. 2023-08-31 17:36:44 -03:00
Rodrigo Rodriguez
fe5d56ff69 fix(azuredeployer.gbapp): Fix in bot booting. 2023-08-31 17:27:05 -03:00
Rodrigo Rodriguez
577eea45dd new (basic.gbapp): ALLOW ROLE keyword. 2023-08-25 19:13:54 -03:00
Rodrigo Rodriguez
7a148aafaa new (basic.gbapp): ALLOW ROLE keyword. 2023-08-25 19:09:03 -03:00
Rodrigo Rodriguez
c71b616f60 new (basic.gbapp): ALLOW ROLE keyword. 2023-08-25 18:55:49 -03:00
Rodrigo Rodriguez
6e5d025ba6 new (basic.gbapp): ALLOW ROLE keyword. 2023-08-25 18:43:50 -03:00
Rodrigo Rodriguez
1f9ea89ab9 new (basic.gbapp): ALLOW ROLE keyword. 2023-08-25 18:39:12 -03:00
Rodrigo Rodriguez
e8d057cb39 new (basic.gbapp): ALLOW ROLE keyword. 2023-08-25 18:13:10 -03:00
Rodrigo Rodriguez
a2689c7ce2 new (basic.gbapp): ALLOW ROLE keyword. 2023-08-25 18:07:38 -03:00
Rodrigo Rodriguez
8b1ffb9e14 new (basic.gbapp): ALLOW ROLE keyword. 2023-08-23 21:50:25 -03:00
Rodrigo Rodriguez
8e7e4c279a new (basic.gbapp): ALLOW ROLE keyword. 2023-08-23 21:33:57 -03:00
Rodrigo Rodriguez
572b724096 new (basic.gbapp): ALLOW ROLE keyword. 2023-08-23 20:41:22 -03:00
Rodrigo Rodriguez
3a8be1b536 new (basic.gbapp): ALLOW ROLE keyword. 2023-08-23 11:24:48 -03:00
Rodrigo Rodriguez
fb94d6cf8a new (basic.gbapp): NOTE keyword. 2023-08-22 11:03:46 -03:00
Rodrigo Rodriguez
543b572c34 new (basic.gbapp): NOTE keyword. 2023-08-22 11:01:25 -03:00
Rodrigo Rodriguez
8f9bde6417 new (basic.gbapp): NOTE keyword. 2023-08-22 10:01:15 -03:00
Rodrigo Rodriguez
6bcd3c0187 new (basic.gbapp): NOTE keyword. 2023-08-21 18:02:06 -03:00
Rodrigo Rodriguez
880e0f42b7 new (basic.gbapp): NOTE keyword. 2023-08-21 17:58:45 -03:00
Rodrigo Rodriguez
bd4d36bc68 new (basic.gbapp): NOTE keyword. 2023-08-21 17:45:26 -03:00
Rodrigo Rodriguez
fb429717dc new (basic.gbapp): NOTE keyword. 2023-08-21 15:54:35 -03:00
Rodrigo Rodriguez
250bd043a9 new (basic.gbapp): NOTE keyword. 2023-08-21 13:29:51 -03:00
Rodrigo Rodriguez
8022980438 new (basic.gbapp): NOTE keyword. 2023-08-21 13:21:49 -03:00
Rodrigo Rodriguez
527aa3af86 new (basic.gbapp): NOTE keyword. 2023-08-21 12:50:55 -03:00
Rodrigo Rodriguez
545ceaec40 new (basic.gbapp): NOTE keyword. 2023-08-21 12:42:59 -03:00
Rodrigo Rodriguez
a2615dd85a fix(basic.gbapp): FIND now return case insensitive BASIC objects. 2023-08-20 19:34:11 -03:00
Rodrigo Rodriguez
701bbae2f2 fix(basic.gbapp): FIND now return case insensitive BASIC objects. 2023-08-20 19:21:35 -03:00
Rodrigo Rodriguez
81c7fc3972 fix(basic.gbapp): FIND now return case insensitive BASIC objects. 2023-08-20 18:09:29 -03:00
Rodrigo Rodriguez
ba8cb1e4e1 fix(basic.gbapp): AS IMAGE testing. 2023-08-20 16:12:36 -03:00
Rodrigo Rodriguez
8e1289adb9 fix(basic.gbapp): AS IMAGE testing. 2023-08-20 16:09:29 -03:00
Rodrigo Rodriguez
d5bee8f721 fix(basic.gbapp): AS IMAGE testing. 2023-08-14 09:06:18 -03:00
Rodrigo Rodriguez
50a2dcbffc fix(basic.gbapp): AS IMAGE testing. 2023-08-13 19:47:39 -03:00
Rodrigo Rodriguez
c16b9acbab fix(basic.gbapp): AS IMAGE testing. 2023-08-13 18:46:47 -03:00
Rodrigo Rodriguez
28c3ef83a3 fix(basic.gbapp): AS IMAGE testing. 2023-08-13 18:43:01 -03:00
Rodrigo Rodriguez
3fb4d814dd fix(basic.gbapp): AS IMAGE testing. 2023-08-13 18:42:50 -03:00
Rodrigo Rodriguez
e841d80dc3 fix(basic.gbapp): AS IMAGE testing. 2023-08-13 18:36:54 -03:00
Rodrigo Rodriguez
fe01c11d2f fix(basic.gbapp): AS IMAGE testing. 2023-08-13 18:23:47 -03:00
Rodrigo Rodriguez
fa156750b4 fix(basic.gbapp): AS IMAGE testing. 2023-08-13 17:42:16 -03:00
Rodrigo Rodriguez
c4d7bdfc05 fix(basic.gbapp): AS IMAGE testing. 2023-08-13 17:15:22 -03:00
Rodrigo Rodriguez
003d66a662 fix(basic.gbapp): AS IMAGE testing. 2023-08-13 17:08:04 -03:00
Rodrigo Rodriguez
7d00bf17de fix(basic.gbapp): AS IMAGE testing. 2023-08-13 17:05:28 -03:00
Rodrigo Rodriguez
e42140eba7 fix(basic.gbapp): AS IMAGE testing. 2023-08-13 16:33:13 -03:00
Rodrigo Rodriguez
0f92f5f273 fix(basic.gbapp): AS IMAGE testing. 2023-08-13 16:16:26 -03:00
Rodrigo Rodriguez
91490d7ac8 fix(basic.gbapp): AS IMAGE testing. 2023-08-12 20:15:52 -03:00
Rodrigo Rodriguez
37ffacf5b3 fix(basic.gbapp): AS IMAGE testing. 2023-08-12 20:10:37 -03:00
Rodrigo Rodriguez
c182d5000a fix(basic.gbapp): AS IMAGE testing. 2023-08-12 10:35:45 -03:00
Rodrigo Rodriguez
78837ac001 fix(basic.gbapp): AS IMAGE testing. 2023-08-12 09:29:03 -03:00
Rodrigo Rodriguez
d48cb03c32 new(admin.gbapp): Remove /publish confirmation. 2023-08-11 21:35:06 -03:00
Rodrigo Rodriguez
2c6f67af37 new(admin.gbapp): Remove /publish confirmation. 2023-08-11 11:37:41 -03:00
Rodrigo Rodriguez
e5de297586 fix(basic.gblib): New AUTO SAVE keyword. 2023-08-10 22:28:59 -03:00
Rodrigo Rodriguez
43f88e83e4 new(basic.gblib): New AUTO SAVE keyword. #359 2023-08-09 11:05:30 -03:00
Rodrigo Rodriguez
7007d3e6ea new(basic.gblib): New AUTO SAVE keyword. #359 2023-08-09 11:04:50 -03:00
Rodrigo Rodriguez
c97678159e new(basic.gblib): New AUTO SAVE keyword. #359 2023-08-08 11:00:16 -03:00
Rodrigo Rodriguez
b943704607 new(basic.gblib): New AUTO SAVE keyword. #359 2023-08-08 10:51:11 -03:00
Rodrigo Rodriguez
243512e768 new(basic.gblib): New AUTO SAVE keyword. #359 2023-08-08 09:05:38 -03:00
Rodrigo Rodriguez
1d3a44c7c4 new(basic.gblib): New AUTO SAVE keyword. 2023-08-07 19:12:25 -03:00
Rodrigo Rodriguez
85f6449ca4 new(basic.gblib): New REWRITE keyword. 2023-08-03 15:15:13 -03:00
Rodrigo Rodriguez
20c13c1a4a new(whatsapp.gblib): Let GPT help call centers... 2023-08-02 14:27:15 -03:00
Rodrigo Rodriguez
a67e1457aa new(whatsapp.gblib): Let GPT help call centers... 2023-08-02 14:04:10 -03:00
Rodrigo Rodriguez
bf33fd92a5 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-08-02 13:58:14 -03:00
Rodrigo Rodriguez
4c26cdf9db new(whatsapp.gblib): Let GPT help call centers... 2023-08-02 13:58:11 -03:00
Rodrigo
1afd2060b1 chore(release): 2.4.42 [skip ci]
## [2.4.42](https://github.com/GeneralBots/BotServer/compare/2.4.41...2.4.42) (2023-08-01)

### Bug Fixes

* **whatsapp.gblib:** Now using e-mail instead of Teams ID. ([5860000](58600001c9))
2023-08-01 16:10:21 +00:00
Rodrigo Rodriguez
ef42aed4a3 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-08-01 13:03:21 -03:00
Rodrigo Rodriguez
58600001c9 fix(whatsapp.gblib): Now using e-mail instead of Teams ID. 2023-08-01 13:03:19 -03:00
Rodrigo
967b59f99f chore(release): 2.4.41 [skip ci]
## [2.4.41](https://github.com/GeneralBots/BotServer/compare/2.4.40...2.4.41) (2023-08-01)

### Bug Fixes

* **all:** Minor changes in PROD. ([76c1efd](76c1efd12d))
2023-08-01 14:37:34 +00:00
Rodrigo Rodriguez
4ce0ef1a66 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-08-01 11:31:07 -03:00
Rodrigo Rodriguez
76c1efd12d fix(all): Minor changes in PROD. 2023-08-01 11:26:34 -03:00
Rodrigo
959c78f642 chore(release): 2.4.40 [skip ci]
## [2.4.40](https://github.com/GeneralBots/BotServer/compare/2.4.39...2.4.40) (2023-07-31)

### Bug Fixes

* **all:** Minor changes in PROD. ([9b88c33](9b88c330c6))
2023-07-31 21:58:20 +00:00
Rodrigo Rodriguez
4f89800e5a Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-31 18:52:14 -03:00
Rodrigo Rodriguez
9b88c330c6 fix(all): Minor changes in PROD. 2023-07-31 18:52:11 -03:00
Rodrigo
445d9f0e12 chore(release): 2.4.39 [skip ci]
## [2.4.39](https://github.com/GeneralBots/BotServer/compare/2.4.38...2.4.39) (2023-07-31)

### Bug Fixes

* **all:** Minor changes in PROD. ([e5f41bc](e5f41bca78))
2023-07-31 21:12:46 +00:00
Rodrigo Rodriguez
e5f41bca78 fix(all): Minor changes in PROD. 2023-07-31 18:07:24 -03:00
Rodrigo Rodriguez
2c91e65c51 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-31 15:07:23 -03:00
Rodrigo Rodriguez
85b48c7a63 new(payment.gblib): #354 QRcode for payments. 2023-07-31 15:06:47 -03:00
Rodrigo
1aa772a63f chore(release): 2.4.38 [skip ci]
## [2.4.38](https://github.com/GeneralBots/BotServer/compare/2.4.37...2.4.38) (2023-07-29)

### Bug Fixes

* **all:** Minor changes in PROD. ([245e491](245e491a25))
2023-07-29 00:03:35 +00:00
Rodrigo Rodriguez
b94942ce4f Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-28 20:56:42 -03:00
Rodrigo Rodriguez
245e491a25 fix(all): Minor changes in PROD. 2023-07-28 20:56:38 -03:00
Rodrigo
461ba78a02 chore(release): 2.4.37 [skip ci]
## [2.4.37](https://github.com/GeneralBots/BotServer/compare/2.4.36...2.4.37) (2023-07-28)

### Bug Fixes

* **all:** Minor changes in PROD. ([e829f37](e829f3725a))
2023-07-28 23:37:51 +00:00
Rodrigo Rodriguez
fda66b8420 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-28 20:30:52 -03:00
Rodrigo
e3323ffc98 chore(release): 2.4.36 [skip ci]
## [2.4.36](https://github.com/GeneralBots/BotServer/compare/2.4.35...2.4.36) (2023-07-28)

### Bug Fixes

* **all:** Minor changes in PROD. ([e415bb0](e415bb01ca))
2023-07-28 23:29:42 +00:00
Rodrigo Rodriguez
e829f3725a fix(all): Minor changes in PROD. 2023-07-28 20:28:43 -03:00
Rodrigo Rodriguez
8426eb4d1f Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-28 20:22:47 -03:00
Rodrigo Rodriguez
e415bb01ca fix(all): Minor changes in PROD. 2023-07-28 20:22:45 -03:00
Rodrigo
5d65b3c130 chore(release): 2.4.35 [skip ci]
## [2.4.35](https://github.com/GeneralBots/BotServer/compare/2.4.34...2.4.35) (2023-07-28)

### Bug Fixes

* **core.gbapp:** FIX SSR errors and setOption impersonated. ([a585cf5](a585cf51ea))
2023-07-28 13:28:10 +00:00
Rodrigo Rodriguez
44bc37c2e6 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-28 10:21:58 -03:00
Rodrigo Rodriguez
a585cf51ea fix(core.gbapp): FIX SSR errors and setOption impersonated. 2023-07-28 10:21:55 -03:00
Rodrigo
d5f0a0b551 chore(release): 2.4.34 [skip ci]
## [2.4.34](https://github.com/GeneralBots/BotServer/compare/2.4.33...2.4.34) (2023-07-26)

### Bug Fixes

* **core.gbapp:** FIX SSR errors and setOption impersonated. ([5589095](5589095f86))
2023-07-26 21:13:48 +00:00
Rodrigo Rodriguez
979687f20a Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-26 18:07:17 -03:00
Rodrigo Rodriguez
5589095f86 fix(core.gbapp): FIX SSR errors and setOption impersonated. 2023-07-26 18:07:15 -03:00
Rodrigo
20a01fca91 chore(release): 2.4.33 [skip ci]
## [2.4.33](https://github.com/GeneralBots/BotServer/compare/2.4.32...2.4.33) (2023-07-26)

### Bug Fixes

* **core.gbapp:** FIX SSR errors and setOption impersonated. ([e5f5121](e5f5121037))
2023-07-26 21:06:29 +00:00
Rodrigo Rodriguez
f4b22ce747 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-26 17:59:42 -03:00
Rodrigo Rodriguez
e5f5121037 fix(core.gbapp): FIX SSR errors and setOption impersonated. 2023-07-26 17:59:40 -03:00
Rodrigo
ed970ba20b chore(release): 2.4.32 [skip ci]
## [2.4.32](https://github.com/GeneralBots/BotServer/compare/2.4.31...2.4.32) (2023-07-26)

### Bug Fixes

* **core.gbapp:** FIX SSR errors and setOption impersonated. ([ed96440](ed9644089e))
2023-07-26 20:10:12 +00:00
Rodrigo Rodriguez
ed9644089e fix(core.gbapp): FIX SSR errors and setOption impersonated. 2023-07-26 17:03:30 -03:00
Rodrigo
14b4aa0052 chore(release): 2.4.31 [skip ci]
## [2.4.31](https://github.com/GeneralBots/BotServer/compare/2.4.30...2.4.31) (2023-07-26)

### Bug Fixes

* **core.gbapp:** FIX SSR errors and setOption impersonated. ([0fe2bdb](0fe2bdbe6f))
2023-07-26 18:12:01 +00:00
Rodrigo Rodriguez
99e640353a Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-26 15:05:56 -03:00
Rodrigo Rodriguez
0fe2bdbe6f fix(core.gbapp): FIX SSR errors and setOption impersonated. 2023-07-26 15:05:53 -03:00
Rodrigo
046024bbf6 chore(release): 2.4.30 [skip ci]
## [2.4.30](https://github.com/GeneralBots/BotServer/compare/2.4.29...2.4.30) (2023-07-26)

### Bug Fixes

* **core.gbapp:** FIX SSR errors and setOption impersonated. ([a652873](a65287338a))
2023-07-26 17:17:02 +00:00
Rodrigo Rodriguez
23973e3aef Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-26 14:10:44 -03:00
Rodrigo Rodriguez
a65287338a fix(core.gbapp): FIX SSR errors and setOption impersonated. 2023-07-26 14:10:41 -03:00
Rodrigo
8ef7c77246 chore(release): 2.4.29 [skip ci]
## [2.4.29](https://github.com/GeneralBots/BotServer/compare/2.4.28...2.4.29) (2023-07-26)

### Bug Fixes

* **core.gbapp:** FIX SSR errors and setOption impersonated. ([7a6d14c](7a6d14cf3a))
2023-07-26 16:35:25 +00:00
Rodrigo Rodriguez
25b122a1ce Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-26 13:27:18 -03:00
Rodrigo Rodriguez
7a6d14cf3a fix(core.gbapp): FIX SSR errors and setOption impersonated. 2023-07-26 13:27:15 -03:00
Rodrigo
29cdff4d41 chore(release): 2.4.28 [skip ci]
## [2.4.28](https://github.com/GeneralBots/BotServer/compare/2.4.27...2.4.28) (2023-07-26)

### Bug Fixes

* **core.gbapp:** FIX SSR errors and setOption impersonated. ([e596f31](e596f31de6))
2023-07-26 15:53:28 +00:00
Rodrigo Rodriguez
e596f31de6 fix(core.gbapp): FIX SSR errors and setOption impersonated. 2023-07-26 12:47:13 -03:00
Rodrigo
19e1292693 chore(release): 2.4.27 [skip ci]
## [2.4.27](https://github.com/GeneralBots/BotServer/compare/2.4.26...2.4.27) (2023-07-25)

### Bug Fixes

* **all:** Fix answers with dialog id working again. ([f34c7b1](f34c7b1ac5))
* **all:** Fix answers with dialog id working again. ([a24648c](a24648cc9f))
* **all:** Fix answers with dialog id working again. ([6b832c4](6b832c42b6))
2023-07-25 11:38:04 +00:00
Rodrigo Rodriguez
f34c7b1ac5 fix(all): Fix answers with dialog id working again. 2023-07-25 08:32:48 -03:00
Rodrigo Rodriguez
a24648cc9f fix(all): Fix answers with dialog id working again. 2023-07-25 08:31:39 -03:00
Rodrigo Rodriguez
6b832c42b6 fix(all): Fix answers with dialog id working again. 2023-07-25 08:26:15 -03:00
Rodrigo
fd5f22b5af chore(release): 2.4.26 [skip ci]
## [2.4.26](https://github.com/GeneralBots/BotServer/compare/2.4.25...2.4.26) (2023-07-25)

### Bug Fixes

* **all:** Fix answers with dialog id working again. ([2a6f64f](2a6f64f238))
* **all:** Fix answers with dialog id working again. ([ec172b0](ec172b0554))
2023-07-25 11:14:43 +00:00
Rodrigo Rodriguez
2a6f64f238 fix(all): Fix answers with dialog id working again. 2023-07-25 08:04:34 -03:00
Rodrigo Rodriguez
8c098c8dee Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-25 08:00:46 -03:00
Rodrigo Rodriguez
ec172b0554 fix(all): Fix answers with dialog id working again. 2023-07-25 08:00:43 -03:00
Rodrigo
9965351d20 chore(release): 2.4.25 [skip ci]
## [2.4.25](https://github.com/GeneralBots/BotServer/compare/2.4.24...2.4.25) (2023-07-23)

### Bug Fixes

* **all:** Fix in AS IMAGE generation of single row. ([a9256d8](a9256d8ecb))
* **all:** Fix in AS IMAGE generation of single row. ([576e73b](576e73b625))
* **all:** Fix in AS IMAGE generation of single row. ([4c5ccb2](4c5ccb2fac))
2023-07-23 21:12:04 +00:00
Rodrigo Rodriguez
a9256d8ecb fix(all): Fix in AS IMAGE generation of single row. 2023-07-23 18:05:59 -03:00
Rodrigo Rodriguez
576e73b625 fix(all): Fix in AS IMAGE generation of single row. 2023-07-23 18:02:10 -03:00
Rodrigo Rodriguez
312db227b3 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-23 17:56:20 -03:00
Rodrigo Rodriguez
4c5ccb2fac fix(all): Fix in AS IMAGE generation of single row. 2023-07-23 17:56:18 -03:00
Rodrigo
2e6782fff6 chore(release): 2.4.24 [skip ci]
## [2.4.24](https://github.com/GeneralBots/BotServer/compare/2.4.23...2.4.24) (2023-07-23)

### Bug Fixes

* **all:** Fix in AS IMAGE generation of single row. ([c646b2d](c646b2d27b))
* **all:** Fix in AS IMAGE generation of single row. ([5827286](5827286406))
2023-07-23 20:53:38 +00:00
Rodrigo Rodriguez
c646b2d27b fix(all): Fix in AS IMAGE generation of single row. 2023-07-23 17:47:36 -03:00
Rodrigo Rodriguez
c2549aff08 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-23 17:41:03 -03:00
Rodrigo Rodriguez
5827286406 fix(all): Fix in AS IMAGE generation of single row. 2023-07-23 17:41:01 -03:00
Rodrigo
d34b42529a chore(release): 2.4.23 [skip ci]
## [2.4.23](https://github.com/GeneralBots/BotServer/compare/2.4.22...2.4.23) (2023-07-23)

### Bug Fixes

* **all:** Fix in AS IMAGE generation of single row. ([618ff5a](618ff5a296))
2023-07-23 20:40:16 +00:00
Rodrigo Rodriguez
272d64720f Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-23 17:33:16 -03:00
Rodrigo Rodriguez
618ff5a296 fix(all): Fix in AS IMAGE generation of single row. 2023-07-23 17:33:13 -03:00
Rodrigo
86dbda8bd0 chore(release): 2.4.22 [skip ci]
## [2.4.22](https://github.com/GeneralBots/BotServer/compare/2.4.21...2.4.22) (2023-07-23)

### Bug Fixes

* **all:** Fix in AS IMAGE generation of single row. ([ee56768](ee567681f1))
2023-07-23 20:02:24 +00:00
Rodrigo Rodriguez
e77b583ff1 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-23 16:55:33 -03:00
Rodrigo Rodriguez
ee567681f1 fix(all): Fix in AS IMAGE generation of single row. 2023-07-23 16:55:31 -03:00
Rodrigo
2c24bdb676 chore(release): 2.4.21 [skip ci]
## [2.4.21](https://github.com/GeneralBots/BotServer/compare/2.4.20...2.4.21) (2023-07-23)

### Bug Fixes

* **all:** Fix in AS IMAGE generation of single row. ([6874869](6874869ef8))
2023-07-23 19:51:42 +00:00
Rodrigo Rodriguez
10197566da Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-23 16:44:45 -03:00
Rodrigo Rodriguez
6874869ef8 fix(all): Fix in AS IMAGE generation of single row. 2023-07-23 16:44:42 -03:00
Rodrigo
d335f8634c chore(release): 2.4.20 [skip ci]
## [2.4.20](https://github.com/GeneralBots/BotServer/compare/2.4.19...2.4.20) (2023-07-23)

### Bug Fixes

* **all:** Fix in AS IMAGE generation of single row. ([ee6356d](ee6356d83b))
2023-07-23 19:44:19 +00:00
Rodrigo Rodriguez
e1bfc3758c Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-23 16:37:23 -03:00
Rodrigo Rodriguez
ee6356d83b fix(all): Fix in AS IMAGE generation of single row. 2023-07-23 16:37:21 -03:00
Rodrigo
ba26790009 chore(release): 2.4.19 [skip ci]
## [2.4.19](https://github.com/GeneralBots/BotServer/compare/2.4.18...2.4.19) (2023-07-23)

### Bug Fixes

* **all:** Fix in DATE filter. ([ad47305](ad47305a02))
2023-07-23 19:03:30 +00:00
Rodrigo Rodriguez
ad47305a02 fix(all): Fix in DATE filter. 2023-07-23 15:57:28 -03:00
Rodrigo Rodriguez
661a9c0350 BREAKING CHANGE: General Bots is now 3.0. 2023-07-23 15:39:05 -03:00
Rodrigo Rodriguez
d6a4d6282e Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-23 11:00:02 -03:00
Rodrigo Rodriguez
5f00e4da3e new(all): Open AI official channel. 2023-07-23 10:59:59 -03:00
Rodrigo
43df151f75 chore(release): 2.4.18 [skip ci]
## [2.4.18](https://github.com/GeneralBots/BotServer/compare/2.4.17...2.4.18) (2023-07-19)

### Bug Fixes

* **all:** Create bot working again. ([ed74c5b](ed74c5b003))
* **all:** Create bot working again. ([9852fa8](9852fa8cb2))
2023-07-19 13:28:28 +00:00
Rodrigo Rodriguez
ed74c5b003 fix(all): Create bot working again. 2023-07-19 10:21:38 -03:00
Rodrigo Rodriguez
fc28eb9ec0 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-19 10:20:56 -03:00
Rodrigo Rodriguez
9852fa8cb2 fix(all): Create bot working again. 2023-07-19 10:20:53 -03:00
Rodrigo
61b2d02009 chore(release): 2.4.17 [skip ci]
## [2.4.17](https://github.com/GeneralBots/BotServer/compare/2.4.16...2.4.17) (2023-07-19)

### Bug Fixes

* **all:** Create bot working again. ([b779f29](b779f29212))
2023-07-19 13:07:12 +00:00
Rodrigo Rodriguez
eebc921fbf Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-19 10:00:16 -03:00
Rodrigo Rodriguez
b779f29212 fix(all): Create bot working again. 2023-07-19 10:00:14 -03:00
Rodrigo
529041b44c chore(release): 2.4.16 [skip ci]
## [2.4.16](https://github.com/GeneralBots/BotServer/compare/2.4.15...2.4.16) (2023-07-19)

### Bug Fixes

* **all:** Create bot working again. ([3bbd732](3bbd732fd4))
* **all:** Create bot working again. ([3fa53d0](3fa53d072b))
* **all:** Minor changes in PROD. ([abe5f03](abe5f03801))
2023-07-19 11:10:46 +00:00
Rodrigo Rodriguez
3bbd732fd4 fix(all): Create bot working again. 2023-07-19 08:03:39 -03:00
Rodrigo Rodriguez
2d4b735724 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-19 07:53:46 -03:00
Rodrigo Rodriguez
3fa53d072b fix(all): Create bot working again. 2023-07-19 07:53:44 -03:00
Rodrigo Rodriguez
bfdc401d75 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-19 07:53:05 -03:00
Rodrigo Rodriguez
abe5f03801 fix(all): Minor changes in PROD. 2023-07-19 07:53:02 -03:00
Rodrigo
794e0260fb chore(release): 2.4.15 [skip ci]
## [2.4.15](https://github.com/GeneralBots/BotServer/compare/2.4.14...2.4.15) (2023-07-19)

### Bug Fixes

* **all:** Create bot working again. ([4eecd5a](4eecd5acec))
2023-07-19 09:48:28 +00:00
Rodrigo Rodriguez
182d6c4ac8 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-19 06:41:34 -03:00
Rodrigo Rodriguez
4eecd5acec fix(all): Create bot working again. 2023-07-19 06:41:32 -03:00
Rodrigo
49f66c8349 chore(release): 2.4.14 [skip ci]
## [2.4.14](https://github.com/GeneralBots/BotServer/compare/2.4.13...2.4.14) (2023-07-18)

### Bug Fixes

* **all:** Create bot working again. ([fbc2416](fbc2416a55))
2023-07-18 20:20:12 +00:00
Rodrigo Rodriguez
a7745985ec Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-18 17:09:06 -03:00
Rodrigo Rodriguez
fbc2416a55 fix(all): Create bot working again. 2023-07-18 17:09:04 -03:00
Rodrigo
572db73152 chore(release): 2.4.13 [skip ci]
## [2.4.13](https://github.com/GeneralBots/BotServer/compare/2.4.12...2.4.13) (2023-07-18)

### Bug Fixes

* **all:** Create bot working again. ([c4f8d0a](c4f8d0a064))
2023-07-18 16:48:37 +00:00
Rodrigo Rodriguez
45b84574e2 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-18 13:42:03 -03:00
Rodrigo Rodriguez
c4f8d0a064 fix(all): Create bot working again. 2023-07-18 13:41:49 -03:00
Rodrigo
8ef26b7b37 chore(release): 2.4.12 [skip ci]
## [2.4.12](https://github.com/GeneralBots/BotServer/compare/2.4.11...2.4.12) (2023-07-18)

### Bug Fixes

* **all:** Create bot working again. ([0ed3dce](0ed3dce1d2))
2023-07-18 16:40:40 +00:00
Rodrigo Rodriguez
53a055c3e8 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-18 13:33:32 -03:00
Rodrigo Rodriguez
0ed3dce1d2 fix(all): Create bot working again. 2023-07-18 13:33:30 -03:00
Rodrigo
6c240bf1f6 chore(release): 2.4.11 [skip ci]
## [2.4.11](https://github.com/GeneralBots/BotServer/compare/2.4.10...2.4.11) (2023-07-18)

### Bug Fixes

* **all:** Create bot working again. ([3fd3213](3fd3213740))
* **all:** Create bot working again. ([88c8a29](88c8a29998))
* **all:** Create bot working again. ([91db185](91db185b54))
2023-07-18 16:16:21 +00:00
Rodrigo Rodriguez
3fd3213740 fix(all): Create bot working again. 2023-07-18 13:09:17 -03:00
Rodrigo Rodriguez
6e6ca3a21f Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-18 13:03:06 -03:00
Rodrigo Rodriguez
88c8a29998 fix(all): Create bot working again. 2023-07-18 13:02:58 -03:00
Rodrigo Rodriguez
91db185b54 fix(all): Create bot working again. 2023-07-18 12:58:51 -03:00
Rodrigo
dc2222a878 chore(release): 2.4.10 [skip ci]
## [2.4.10](https://github.com/GeneralBots/BotServer/compare/2.4.9...2.4.10) (2023-07-18)

### Bug Fixes

* **all:** Create bot working again. ([c3e6a3d](c3e6a3da7a))
2023-07-18 15:54:03 +00:00
Rodrigo Rodriguez
5cb5307287 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-18 12:46:55 -03:00
Rodrigo Rodriguez
c3e6a3da7a fix(all): Create bot working again. 2023-07-18 12:46:50 -03:00
Rodrigo
fffe21b6b1 chore(release): 2.4.9 [skip ci]
## [2.4.9](https://github.com/GeneralBots/BotServer/compare/2.4.8...2.4.9) (2023-07-17)

### Bug Fixes

* **all:**   [#123](https://github.com/GeneralBots/BotServer/issues/123) done. ([899696d](899696d7e5))
2023-07-17 18:44:38 +00:00
Rodrigo Rodriguez
74f6ecccde Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-17 15:38:01 -03:00
Rodrigo Rodriguez
899696d7e5 fix(all): #123 done. 2023-07-17 15:37:58 -03:00
Rodrigo
32c77171fe chore(release): 2.4.8 [skip ci]
## [2.4.8](https://github.com/GeneralBots/BotServer/compare/2.4.7...2.4.8) (2023-07-17)

### Bug Fixes

* **all:**   [#123](https://github.com/GeneralBots/BotServer/issues/123) done. ([2d1efeb](2d1efeb0cc))
2023-07-17 18:03:06 +00:00
Rodrigo Rodriguez
14fcde3622 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-17 14:55:20 -03:00
Rodrigo Rodriguez
2d1efeb0cc fix(all): #123 done. 2023-07-17 14:55:17 -03:00
Rodrigo
7e71f07781 chore(release): 2.4.7 [skip ci]
## [2.4.7](https://github.com/GeneralBots/BotServer/compare/2.4.6...2.4.7) (2023-07-15)

### Bug Fixes

* **all:** Create bot working again. ([46bbe87](46bbe87bb4))
2023-07-15 22:25:15 +00:00
Rodrigo Rodriguez
7e3ee7dc52 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-15 19:19:06 -03:00
Rodrigo Rodriguez
46bbe87bb4 fix(all): Create bot working again. 2023-07-15 19:19:04 -03:00
Rodrigo
797ed488f7 chore(release): 2.4.6 [skip ci]
## [2.4.6](https://github.com/GeneralBots/BotServer/compare/2.4.5...2.4.6) (2023-07-15)

### Bug Fixes

* **all:** Create bot working again. ([9e49895](9e498956f8))
2023-07-15 13:41:37 +00:00
Rodrigo Rodriguez
e265d839f2 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-15 10:34:37 -03:00
Rodrigo Rodriguez
9e498956f8 fix(all): Create bot working again. 2023-07-15 10:34:36 -03:00
Rodrigo
ee69aa69ad chore(release): 2.4.5 [skip ci]
## [2.4.5](https://github.com/GeneralBots/BotServer/compare/2.4.4...2.4.5) (2023-07-14)

### Bug Fixes

* **all:** Create bot working again. ([0f1acf6](0f1acf6646))
* **all:** Create bot working again. ([f4ab703](f4ab70396a))
* **all:** Create bot working again. ([b92fbca](b92fbca72a))
2023-07-14 21:58:39 +00:00
Rodrigo Rodriguez
0f1acf6646 fix(all): Create bot working again. 2023-07-14 18:52:34 -03:00
Rodrigo Rodriguez
f4ab70396a fix(all): Create bot working again. 2023-07-14 18:51:36 -03:00
Rodrigo Rodriguez
b92fbca72a fix(all): Create bot working again. 2023-07-14 18:45:17 -03:00
Rodrigo
e9717302e0 chore(release): 2.4.4 [skip ci]
## [2.4.4](https://github.com/GeneralBots/BotServer/compare/2.4.3...2.4.4) (2023-07-13)

### Bug Fixes

* **all:** Minor changes in PROD. ([671fe0c](671fe0cc3e))
2023-07-13 17:20:25 +00:00
Rodrigo Rodriguez
671fe0cc3e fix(all): Minor changes in PROD. 2023-07-13 14:13:48 -03:00
Rodrigo
b7f78d936f chore(release): 2.4.3 [skip ci]
## [2.4.3](https://github.com/GeneralBots/BotServer/compare/2.4.2...2.4.3) (2023-07-09)

### Bug Fixes

* **all:** Minor changes in PROD. ([c67ec3e](c67ec3e696))
2023-07-09 23:29:46 +00:00
Rodrigo Rodriguez
c67ec3e696 fix(all): Minor changes in PROD.
BREAKING CHANGE.
2023-07-09 20:24:24 -03:00
Rodrigo Rodriguez
74ca05e6f8 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-09 20:09:57 -03:00
Rodrigo Rodriguez
c79d226aff BREAKING CHANGE: General Bots is now 3.0. 2023-07-09 20:09:55 -03:00
Rodrigo
18cb741330 chore(release): 2.4.2 [skip ci]
## [2.4.2](https://github.com/GeneralBots/BotServer/compare/2.4.1...2.4.2) (2023-07-09)

### Bug Fixes

* **all:** Minor changes in PROD. ([77d5b4e](77d5b4ee68))
2023-07-09 23:07:06 +00:00
Rodrigo Rodriguez
1497119904 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-09 20:00:07 -03:00
Rodrigo Rodriguez
77d5b4ee68 fix(all): Minor changes in PROD. 2023-07-09 20:00:05 -03:00
Rodrigo
a2960289a3 chore(release): 2.4.1 [skip ci]
## [2.4.1](https://github.com/GeneralBots/BotServer/compare/2.4.0...2.4.1) (2023-07-09)

### Bug Fixes

* **all:** Minor changes in PROD. ([8a04ad2](8a04ad2354))
2023-07-09 20:17:11 +00:00
Rodrigo Rodriguez
45f7aed5f6 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-09 17:10:06 -03:00
Rodrigo Rodriguez
8a04ad2354 fix(all): Minor changes in PROD. 2023-07-09 17:09:32 -03:00
Rodrigo
48049cd041 chore(release): 2.4.0 [skip ci]
# [2.4.0](https://github.com/GeneralBots/BotServer/compare/2.3.9...2.4.0) (2023-07-09)

### Bug Fixes

* **all:** CWD in Windows now working. ([6721c3d](6721c3dcc3))
* **all:** Fixes in production. ([56b6877](56b687792b))
* **all:** HTTP handler added. ([7c6a175](7c6a1753b3))
* **all:** Minor changes in PROD. ([f69b3f0](f69b3f004c))
* **all:** Minor changes in PROD. ([0b5fa3e](0b5fa3eec2))
* **all:** Minor changes in PROD. ([904691c](904691ca81))
* **all:** Minor changes in PROD. ([d7a5ef5](d7a5ef5ef2))
* **all:** Minor changes in PROD. ([892025e](892025e5b2))
* **all:** Minor changes in PROD. ([76df151](76df151507))
* **all:** Minor changes in PROD. ([f20b5f6](f20b5f6293))
* **all:** Minor changes in PROD. ([a60581b](a60581bd32))
* **app.ts:** Preparing to use 4 or more SSL certificates. ([72b645f](72b645fd2a))
* **azuredeployer.gbapp:** Adding Resource Providers (.Web/.Sql) ([6c9d124](6c9d124524))
* **azuredeployer.gbapp:** Create DB with basic cost. ([0ed600e](0ed600edc3))
* **azuredeployer.gblib:**  FREE flag for database. ([1074ef7](1074ef7240))
* **basic.gblib:**   [#196](https://github.com/GeneralBots/BotServer/issues/196) Spellchecker in groups now working. ([45ad0c3](45ad0c3894))
* **basic.gblib:**   [#269](https://github.com/GeneralBots/BotServer/issues/269) Fixing of group autostart behaviour. ([de77227](de77227945))
* **basic.gblib:**   [#286](https://github.com/GeneralBots/BotServer/issues/286) fix token replaacement. ([a679786](a679786217))
* **basic.gblib:**   [#286](https://github.com/GeneralBots/BotServer/issues/286) fix token replaacement. ([0e9c2e9](0e9c2e9ebf))
* **basic.gblib:**   Debugger improvements. ([3e68858](3e68858bb0))
* **basic.gblib:**  Fixes in WebAutomation. ([d4cf165](d4cf165165))
* **basic.gblib:**  Fixes in WebAutomation. ([b576b6f](b576b6f54d))
* **basic.gblib:**  Fixes in WebAutomation. ([d1b9da2](d1b9da21ba))
* **basic.gblib:**  GBAI automatic retrieval. ([0ef0fc0](0ef0fc01f5))
* **basic.gblib:**  GBAI automatic retrieval. ([04e69b9](04e69b9d99))
* **basic.gblib:**  GBAI automatic retrieval. ([6992bf0](6992bf0ae5))
* **basic.gblib:** [#170](https://github.com/GeneralBots/BotServer/issues/170)  Fixing DATEDIFF. ([4314a37](4314a37916))
* **basic.gblib:** [#226](https://github.com/GeneralBots/BotServer/issues/226) testing. ([97df425](97df425566))
* **basic.gblib:** [#226](https://github.com/GeneralBots/BotServer/issues/226) testing. ([4c037a7](4c037a7205))
* **basic.gblib:** [#227](https://github.com/GeneralBots/BotServer/issues/227) - HEAR AS FILE and GET/SET PARAM. ([bc5c1b0](bc5c1b0ced))
* **basic.gblib:** [#227](https://github.com/GeneralBots/BotServer/issues/227) - HEAR AS FILE and GET/SET PARAM. ([2521117](2521117a80))
* **basic.gblib:** [#227](https://github.com/GeneralBots/BotServer/issues/227) - HEAR AS FILE and GET/SET PARAM. ([ceded7f](ceded7fd55))
* **basic.gblib:** [#227](https://github.com/GeneralBots/BotServer/issues/227) - HEAR AS FILE defining where to save, per bot. ([b64a42f](b64a42feac))
* **basic.gblib:** [#227](https://github.com/GeneralBots/BotServer/issues/227) - HEAR AS FILE defining where to save, per bot. ([473cd98](473cd9871d))
* **basic.gblib:** [#227](https://github.com/GeneralBots/BotServer/issues/227) - HEAR AS FILE. ([c5290b9](c5290b91aa))
* **basic.gblib:** [#227](https://github.com/GeneralBots/BotServer/issues/227) - HEAR AS FILE. ([42dbba4](42dbba4084))
* **basic.gblib:** [#282](https://github.com/GeneralBots/BotServer/issues/282) Fix SSR for Bots 3.0. ([866b361](866b361292))
* **basic.gblib:** [#282](https://github.com/GeneralBots/BotServer/issues/282) Fix SSR for Bots 3.0. ([7f3bd7d](7f3bd7d8fe))
* **basic.gblib:** [#307](https://github.com/GeneralBots/BotServer/issues/307) - Fixed user context in API. ([cbce44f](cbce44f20d))
* **basic.gblib:** [#307](https://github.com/GeneralBots/BotServer/issues/307) - Fixed user context in API. ([4496cef](4496cefa18))
* **basic.gblib:** Adjustment in package version. ([e66c481](e66c481761))
* **basic.gblib:** Correct web automation 'date' use. ([4809fec](4809fec457))
* **basic.gblib:** Correcting the position of Parentheses ([a925c8e](a925c8e8bf))
* **basic.gblib:** FILL keyword can now template images and AS IMAGE can convert a DOCX to a PNG. ([41ceedf](41ceedfc00))
* **basic.gblib:** FILL keyword can now template images and AS IMAGE can convert a DOCX to a PNG. ([16bdab6](16bdab6bcc))
* **basic.gblib:** fix dynamic parameter generation. ([11b0ea2](11b0ea24e6))
* **basic.gblib:** Fix getNow return. ([f288987](f2889879a6))
* **basic.gblib:** Fix getNow return. ([5631ce9](5631ce9610))
* **basic.gblib:** Fix getToday return. ([0e33c97](0e33c97851))
* **basic.gblib:** Return the last information with getTextOf ([ececb0d](ececb0d2ea))
* **basic.gblib:** Upgrade to https://github.com/vasyas/push-rpc from WS to HTTPS. ([5534b41](5534b416da))
* **basic.gblib:** Upgrade to https://github.com/vasyas/push-rpc from WS to HTTPS. ([f3c756b](f3c756b015))
* **basic.gblib:** Upgrade to https://github.com/vasyas/push-rpc. ([f3b7c1d](f3b7c1d77e))
* **basic.gblib:** WA page bug removal. ([d902e14](d902e14f78))
* **core.gbapp:** [#195](https://github.com/GeneralBots/BotServer/issues/195) bind call to provide min context for uploads. ([b12a462](b12a462e3e))
* **core.gbapp:** [#195](https://github.com/GeneralBots/BotServer/issues/195) bind call to provide min context for uploads. ([b2f2c73](b2f2c732aa))
* **core.gbapp:** [#336](https://github.com/GeneralBots/BotServer/issues/336) timeout in API fixed. ([0c44361](0c443618a6))
* **core.gbapp:** [#336](https://github.com/GeneralBots/BotServer/issues/336) timeout in API fixed. ([eb6800e](eb6800edce))
* **core.gbapp:** [#341](https://github.com/GeneralBots/BotServer/issues/341) fix regarding COPY files. ([a292b77](a292b77116))
* **core.gbapp:** [#344](https://github.com/GeneralBots/BotServer/issues/344) fix regarding SET FILTER keyword. ([db7ed36](db7ed36707))
* **core.gbapp:** /logs working again. ([d08e11f](d08e11fef4))
* **core.gbapp:** fixed the use of GBLogEx to create GuaribasLog. ([2cb866b](2cb866bc2f))
* **core.gbapp:** Upload now saves the file in correct folder. ([e31cd4d](e31cd4d819))
* **core.gblib:**  SSR fixing about botId. ([799715a](799715a9ee))
* **default.gbui:** [#153](https://github.com/GeneralBots/BotServer/issues/153) fix. ([b6f6a50](b6f6a50f13))
* **default.gbui:** [#263](https://github.com/GeneralBots/BotServer/issues/263) Loads menu.xlsx as subject.json alternative. ([00434bd](00434bd788))
* **default.gbui:** [#263](https://github.com/GeneralBots/BotServer/issues/263) Loads menu.xlsx as subject.json alternative. ([241596b](241596b51f))
* **dependencies:**  Whatsapp-web.js to "1.20.0". ([1857b51](1857b51cf2))
* **gbapp\AskDialog:** Supress Echo Nothing_else ([4ee3012](4ee30120b7))
* **gbapp\AskDialog.ts:** Supress anything_else ([6d8feca](6d8feca871))
* **kb.gbapp:** [#276](https://github.com/GeneralBots/BotServer/issues/276) use of NLP.js upgrade to v4. ([ec1c38f](ec1c38f378))
* **kb.gbapp:** [#276](https://github.com/GeneralBots/BotServer/issues/276) use of NLP.js upgrade to v4. ([5c48d39](5c48d39620))
* **kb.gbapp:** [#297](https://github.com/GeneralBots/BotServer/issues/297) Spellchecker fixed after MSFT changes in service. ([80853f0](80853f014c))
* **kb.gbapp:** [#298](https://github.com/GeneralBots/BotServer/issues/298) search fix and params. ([78778da](78778da3a7))
* **kb.gbapp:** [#332](https://github.com/GeneralBots/BotServer/issues/332) fix STS. ([01cf280](01cf2803a0))
* **kb.gbapp:** /publish review, error handling improved and clean up. ([c94228c](c94228cd8d))
* **kb.gbapp:** Dialog now are finished OK. ([a969abb](a969abbcc4))
* **kb.gbapp:** Dialog now are finished OK. ([a7a1d47](a7a1d47c24))
* **kb.gbapp:** Download only if not in cache optimization. ([b30e016](b30e0160c4))
* **security.gblib:** Params support in users. ([82a9ba9](82a9ba983e))
* **whatsapp.gblib:** [#262](https://github.com/GeneralBots/BotServer/issues/262) wrong key value. ([565ad4a](565ad4ab6d))
* **whatsapp.gblib:** [#288](https://github.com/GeneralBots/BotServer/issues/288) fix list and buttons. ([6f62453](6f62453f4e))
* **whatsapp.gblib:** [#288](https://github.com/GeneralBots/BotServer/issues/288) unify puppteer params with GBSSR. ([b96a78e](b96a78e810))
* **whatsapp.gblib:** [#309](https://github.com/GeneralBots/BotServer/issues/309) unify channel detection. ([cfe3ab3](cfe3ab30f4))
* **Whatsapp.gblib:** fix "whatsapp-web.js" compatibility issues. ([cd97189](cd97189477))

### Features

* **whatsapp.gblib:** add 'graphapi' option. ([ce84053](ce84053d95))
2023-07-09 19:37:44 +00:00
Rodrigo Rodriguez
f69b3f004c fix(all): Minor changes in PROD. 2023-07-09 16:29:30 -03:00
Rodrigo Rodriguez
0b5fa3eec2 fix(all): Minor changes in PROD. 2023-07-09 16:27:45 -03:00
Rodrigo Rodriguez
904691ca81 fix(all): Minor changes in PROD. 2023-07-09 15:57:09 -03:00
Rodrigo Rodriguez
d7a5ef5ef2 fix(all): Minor changes in PROD. 2023-07-09 14:51:46 -03:00
Rodrigo Rodriguez
892025e5b2 fix(all): Minor changes in PROD. 2023-07-09 13:09:28 -03:00
Rodrigo Rodriguez
76df151507 fix(all): Minor changes in PROD. 2023-07-09 12:59:12 -03:00
Rodrigo Rodriguez
f20b5f6293 fix(all): Minor changes in PROD. 2023-07-09 10:36:38 -03:00
Rodrigo Rodriguez
7c6a1753b3 fix(all): HTTP handler added. 2023-07-09 08:46:45 -03:00
Rodrigo Rodriguez
4823f02bbc Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-07-09 06:52:16 -03:00
Rodrigo Rodriguez
a60581bd32 fix(all): Minor changes in PROD. 2023-07-09 06:51:10 -03:00
Rodrigo Rodriguez
3973938729
Update README.md 2023-05-30 08:40:00 -03:00
Alan
72b645fd2a fix(app.ts): Preparing to use 4 or more SSL certificates. 2023-05-25 21:20:40 -03:00
rodrigorodriguez
a969abbcc4 fix(kb.gbapp): Dialog now are finished OK. 2023-05-25 11:17:43 -03:00
rodrigorodriguez
a7a1d47c24 fix(kb.gbapp): Dialog now are finished OK. 2023-05-25 11:14:08 -03:00
Alan
1857b51cf2 fix(dependencies): Whatsapp-web.js to "1.20.0". 2023-05-23 11:15:17 -03:00
AlanPerdomo
e115275ed0
Update web.config 2023-05-23 11:02:23 -03:00
Matheus C
4ee30120b7 fix(gbapp\AskDialog): Supress Echo Nothing_else 2023-05-22 22:14:31 -03:00
Matheus C
2069f9dc07 Testing 1st Commit 2023-05-22 22:13:41 -03:00
Matheus C
6d8feca871 fix(gbapp\AskDialog.ts): Supress anything_else 2023-05-22 22:04:57 -03:00
Rodrigo Rodriguez
a4d0facbf0
Update CODE_OF_CONDUCT-pt-br.md
Added harassment, bullying and mobbing items.
2023-05-19 10:17:18 -03:00
Rodrigo Rodriguez
114d6095d9
Update CODE_OF_CONDUCT.md
Added mobbing (group bullying or gang stalking).
2023-05-19 10:15:04 -03:00
phpussente
a925c8e8bf fix(basic.gblib): Correcting the position of Parentheses 2023-05-15 16:55:01 -03:00
phpussente
ececb0d2ea fix(basic.gblib): Return the last information with getTextOf 2023-05-15 15:18:19 -03:00
phpussente
a03a7c7ba0 new(basic.gblib): Command TEXT OF 2023-05-09 11:20:40 -03:00
phpussente
b87a0c397c new(basic.gblib): Command CLICK BUTTON 2023-05-04 14:43:19 -03:00
Alan
e31cd4d819 fix(core.gbapp): Upload now saves the file in correct folder. 2023-04-29 14:18:10 -03:00
rodrigorodriguez
0c1c02e07a BREAKING CHANGE: 3.0 arrived. 2023-04-21 07:03:42 -03:00
Alan
2cb866bc2f fix(core.gbapp): fixed the use of GBLogEx to create GuaribasLog. 2023-04-20 22:41:58 -03:00
rodrigorodriguez
97df425566 fix(basic.gblib): #226 testing. 2023-04-11 18:27:30 -03:00
rodrigorodriguez
4c037a7205 fix(basic.gblib): #226 testing. 2023-04-11 18:08:50 -03:00
rodrigorodriguez
ca4a5e06be Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-04-09 19:21:51 -03:00
rodrigorodriguez
a9ce03b353 new(basic.gblib): GPT-3 automatically dialog generation. 2023-04-09 19:20:15 -03:00
AlanPerdomo
ae6aab7c64 Fix(core.gbapp): Schedule enabled. 2023-04-06 11:09:49 -03:00
Alan Perdomo
4809fec457 fix(basic.gblib): Correct web automation 'date' use. 2023-04-05 12:29:23 -03:00
rodrigorodriguez
db7ed36707 fix(core.gbapp): #344 fix regarding SET FILTER keyword. 2023-04-01 10:42:44 -03:00
rodrigorodriguez
f2d6bbe47a Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-04-01 08:01:11 -03:00
rodrigorodriguez
a292b77116 fix(core.gbapp): #341 fix regarding COPY files. 2023-04-01 08:01:10 -03:00
AlanPerdomo
11b0ea24e6 fix(basic.gblib): fix dynamic parameter generation. 2023-03-31 10:47:03 -03:00
Alan Perdomo
f2889879a6 fix(basic.gblib): Fix getNow return. 2023-03-27 18:20:21 -03:00
Alan Perdomo
5631ce9610 fix(basic.gblib): Fix getNow return. 2023-03-27 17:38:31 -03:00
Alan Perdomo
0e33c97851 fix(basic.gblib): Fix getToday return. 2023-03-27 16:42:17 -03:00
rodrigorodriguez
d08e11fef4 fix(core.gbapp): /logs working again. 2023-03-27 10:07:28 -03:00
rodrigorodriguez
0c443618a6 fix(core.gbapp): #336 timeout in API fixed. 2023-03-26 19:33:58 -03:00
rodrigorodriguez
7bdc57a4a1 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-03-24 19:19:47 -03:00
rodrigorodriguez
eb6800edce fix(core.gbapp): #336 timeout in API fixed. 2023-03-24 19:19:25 -03:00
Alan Perdomo
0ed600edc3 fix(azuredeployer.gbapp): Create DB with basic cost. 2023-03-21 18:09:11 -03:00
phpussente
6c9d124524 fix(azuredeployer.gbapp): Adding Resource Providers (.Web/.Sql) 2023-03-21 16:06:02 -03:00
Rodrigo Rodriguez
2fe293ec8b Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-03-21 13:32:32 -03:00
Rodrigo Rodriguez
1074ef7240 fix(azuredeployer.gblib): FREE flag for database. 2023-03-21 13:32:27 -03:00
Zuilho Segundo
cd0187f051 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-03-20 16:35:10 -03:00
Zuilho Segundo
df3bcd5f6c fix(core.gbapp:using direct prop from singleton) 2023-03-20 16:35:01 -03:00
Rodrigo Rodriguez
799715a9ee fix(core.gblib): SSR fixing about botId. 2023-03-20 16:14:58 -03:00
rodrigorodriguez
56b687792b fix(all): Fixes in production. 2023-03-19 20:09:54 -03:00
rodrigorodriguez
3e68858bb0 fix(basic.gblib): Debugger improvements. 2023-03-13 14:20:18 -03:00
rodrigorodriguez
2de41ee250 new(basic.gblib): DEV_GBAI introduced to share a .gbdata among dev. team. 2023-03-10 15:49:30 -03:00
Rodrigo Rodriguez
0ef0fc01f5 fix(basic.gblib): GBAI automatic retrieval. 2023-03-09 18:56:55 -03:00
Rodrigo Rodriguez
04e69b9d99 fix(basic.gblib): GBAI automatic retrieval. 2023-03-09 17:46:34 -03:00
Rodrigo Rodriguez
6992bf0ae5 fix(basic.gblib): GBAI automatic retrieval. 2023-03-09 17:45:59 -03:00
rodrigorodriguez
335120f1d7 new(basic.gblib): GBDIALOG_GBDATABOT introduced to share a .gbdata among dev. team. 2023-03-09 09:49:37 -03:00
rodrigorodriguez
a679786217 fix(basic.gblib): #286 fix token replaacement. 2023-03-08 22:10:43 -03:00
rodrigorodriguez
7c42e3a1c5 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-03-08 22:10:28 -03:00
rodrigorodriguez
0e9c2e9ebf fix(basic.gblib): #286 fix token replaacement. 2023-03-08 22:10:27 -03:00
Rodrigo Rodriguez
451ff5f9e5
Update CODE_OF_CONDUCT-pt-br.md 2023-03-08 13:19:52 -03:00
Rodrigo Rodriguez
c14497d215
Update CODE_OF_CONDUCT.md 2023-03-08 13:19:22 -03:00
Rodrigo Rodriguez
40e6b19826
Update CODE_OF_CONDUCT-pt-br.md 2023-03-08 13:17:55 -03:00
Rodrigo Rodriguez
62eb271dde
Update CODE_OF_CONDUCT.md 2023-03-08 13:16:06 -03:00
Rodrigo Rodriguez
fa39e36fbb
Including more behaviours and stalking/bullying. 2023-03-08 13:15:05 -03:00
rodrigorodriguez
de77227945 fix(basic.gblib): #269 Fixing of group autostart behaviour. 2023-03-08 12:01:02 -03:00
rodrigorodriguez
45ad0c3894 fix(basic.gblib): #196 Spellchecker in groups now working. 2023-03-08 11:17:04 -03:00
phpussente
3affd82c6d docs(basic.glib): CLICK command update. 2023-03-07 17:56:10 -03:00
Rodrigo Rodriguez
e66c481761 fix(basic.gblib): Adjustment in package version. 2023-03-07 15:29:50 -03:00
rodrigorodriguez
d4cf165165 fix(basic.gblib): Fixes in WebAutomation. 2023-03-07 12:29:02 -03:00
rodrigorodriguez
b576b6f54d fix(basic.gblib): Fixes in WebAutomation. 2023-03-07 12:28:45 -03:00
rodrigorodriguez
d1b9da21ba fix(basic.gblib): Fixes in WebAutomation. 2023-03-07 12:06:15 -03:00
rodrigorodriguez
cfe3ab30f4 fix(whatsapp.gblib): #309 unify channel detection. 2023-03-07 10:01:36 -03:00
rodrigorodriguez
565ad4ab6d fix(whatsapp.gblib): #262 wrong key value. 2023-03-07 07:49:00 -03:00
rodrigorodriguez
6f62453f4e fix(whatsapp.gblib): #288 fix list and buttons. 2023-03-06 20:36:27 -03:00
rodrigorodriguez
b96a78e810 fix(whatsapp.gblib): #288 unify puppteer params with GBSSR. 2023-03-06 11:45:56 -03:00
rodrigorodriguez
0d5931dde1 new(basic.gblib): #334 QRCODE new keyword introduced. 2023-03-06 09:09:31 -03:00
rodrigorodriguez
295bdb9ff5 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-03-06 08:50:47 -03:00
rodrigorodriguez
b6f6a50f13 fix(default.gbui): #153 fix. 2023-03-06 08:50:43 -03:00
Rodrigo Rodriguez
fa50487b33
Add files via upload 2023-03-06 07:31:28 -03:00
Rodrigo Rodriguez
db5ac7cde5
Add files via upload 2023-03-06 07:28:03 -03:00
rodrigorodriguez
e392759d45 new(basic.gblib): #300 FIND custom SET FILTER TYPE new keyword. 2023-03-06 07:09:24 -03:00
rodrigorodriguez
5534b416da fix(basic.gblib): Upgrade to https://github.com/vasyas/push-rpc from WS to HTTPS. 2023-03-05 16:59:48 -03:00
rodrigorodriguez
f3c756b015 fix(basic.gblib): Upgrade to https://github.com/vasyas/push-rpc from WS to HTTPS. 2023-03-05 11:09:36 -03:00
rodrigorodriguez
39f1907291 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-03-04 16:28:30 -03:00
rodrigorodriguez
f3b7c1d77e fix(basic.gblib): Upgrade to https://github.com/vasyas/push-rpc. 2023-03-04 16:27:25 -03:00
Rodrigo Rodriguez
025cf0c988 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-03-03 19:10:34 -03:00
Rodrigo Rodriguez
d902e14f78 fix(basic.gblib): WA page bug removal. 2023-03-03 19:10:31 -03:00
AlanPerdomo
692016d725 new(all): #171 HEAR AS qrcode. 2023-03-02 17:46:45 -03:00
rodrigorodriguez
4314a37916 fix(basic.gblib): #170 Fixing DATEDIFF. 2023-03-02 14:24:51 -03:00
rodrigorodriguez
8a89ae4e44 new(basic.gblib): #306
Ignore acents during FIND filter 3.0 requirement.
2023-03-02 07:51:42 -03:00
rodrigorodriguez
80853f014c fix(kb.gbapp): #297 Spellchecker fixed after MSFT changes in service. 2023-03-01 10:54:44 -03:00
rodrigorodriguez
ec1c38f378 fix(kb.gbapp): #276 use of NLP.js upgrade to v4. 2023-02-27 19:17:52 -03:00
rodrigorodriguez
5c48d39620 fix(kb.gbapp): #276 use of NLP.js upgrade to v4. 2023-02-27 14:34:38 -03:00
rodrigorodriguez
01cf2803a0 fix(kb.gbapp): #332 fix STS. 2023-02-26 18:15:22 -03:00
rodrigorodriguez
c94228cd8d fix(kb.gbapp): /publish review, error handling improved and clean up. 2023-02-26 15:03:24 -03:00
rodrigorodriguez
b30e0160c4 fix(kb.gbapp): Download only if not in cache optimization. 2023-02-26 06:48:47 -03:00
rodrigorodriguez
68de407d63 new(all): #156 and node update. 2023-02-26 06:05:57 -03:00
rodrigorodriguez
62a1ed36e2 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-02-24 23:05:55 -03:00
rodrigorodriguez
aaf5938642 new(all): #156 and logo enhancement. 2023-02-24 23:05:52 -03:00
Rodrigo Rodriguez
6721c3dcc3 fix(all): CWD in Windows now working. 2023-02-24 19:26:09 -03:00
phpussente
b96cde81d7 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-02-24 16:50:05 -03:00
phpussente
1ec4c83277 new(basic.glib): #331 CREAD LEAD 2023-02-24 16:50:03 -03:00
rodrigorodriguez
74d794afe9 new(all): #156 and logo enhancement. 2023-02-24 13:37:06 -03:00
rodrigorodriguez
6fcd009fb2 new(all): #156 and logo enhancement. 2023-02-24 13:31:40 -03:00
rodrigorodriguez
2f9d07908f new(all): Review order of boot.mjs and imports calls from compiled js #302 and new boot logo. 2023-02-24 10:18:04 -03:00
rodrigorodriguez
a0211ff441 new(basic.gblib): #256 coding for loading sheet file and HEAR param processing. 2023-02-23 17:41:29 -03:00
rodrigorodriguez
cc15b7cc3a new(core.gbapp): Start of #321, https for every custom bot domain. 2023-02-23 16:44:56 -03:00
rodrigorodriguez
00434bd788 fix(default.gbui): #263 Loads menu.xlsx as subject.json alternative. 2023-02-23 11:52:14 -03:00
rodrigorodriguez
241596b51f fix(default.gbui): #263 Loads menu.xlsx as subject.json alternative. 2023-02-23 11:51:59 -03:00
rodrigorodriguez
01fa276eb0 new(default.gbui): Load time reduced for web page display. 2023-02-23 08:11:09 -03:00
rodrigorodriguez
a0648b3d42 new(kb.gbapp): #259 BASIC from cell import done, no need a /basic. 2023-02-23 06:14:40 -03:00
rodrigorodriguez
78778da3a7 fix(kb.gbapp): #298 search fix and params. 2023-02-23 05:47:05 -03:00
rodrigorodriguez
2313006aed new(kb.gbapp): #259 BASIC from cell import done, fixing User. 2023-02-22 16:15:05 -03:00
rodrigorodriguez
6168fd0c75 new(kb.gbapp): #322 more user context for VM. 2023-02-22 16:06:57 -03:00
rodrigorodriguez
7268103831 new(kb.gbapp): #259 BASIC from cell import done - second part. 2023-02-22 13:18:16 -03:00
rodrigorodriguez
5d112db576 new(kb.gbapp): #259 .docx import done - first part. 2023-02-22 11:30:51 -03:00
rodrigorodriguez
fc55dda78c Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-02-21 18:23:48 -03:00
rodrigorodriguez
da8c7cc863 new(kb.gbapp): #259 add several kinds of direct information import. 2023-02-21 18:22:22 -03:00
rodrigorodriguez
9cf2ea6175 new(kb.gbapp): #259 add several kinds of direct information import. 2023-02-21 18:21:36 -03:00
rodrigorodriguez
866b361292 fix(basic.gblib): #282 Fix SSR for Bots 3.0. 2023-02-20 10:29:04 -03:00
rodrigorodriguez
7f3bd7d8fe fix(basic.gblib): #282 Fix SSR for Bots 3.0. 2023-02-18 16:48:40 -03:00
rodrigorodriguez
bc85f714ca new(all): #327 OPEN AS web automation. 2023-02-17 15:34:29 -03:00
rodrigorodriguez
4d30d5988c new(all): #327 OPEN AS web automation. 2023-02-17 06:32:30 -03:00
rodrigorodriguez
de84283b5d new(all): #327 OPEN AS web automation. 2023-02-16 18:12:21 -03:00
rodrigorodriguez
649e08d7f2 new(all): #327 OPEN AS web automation. 2023-02-16 10:27:18 -03:00
rodrigorodriguez
4c813ce02d Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-02-15 22:12:25 -03:00
rodrigorodriguez
ea99337079 new(all): #327 OPEN AS web automation. 2023-02-15 22:12:24 -03:00
Alan
afb10f785a Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-02-14 14:11:53 -03:00
Alan
d5ca7afe2f Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-02-14 14:11:52 -03:00
Alan
b35df48b86 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-02-14 13:58:18 -03:00
Alan
cd97189477 fix(Whatsapp.gblib): fix "whatsapp-web.js" compatibility issues. 2023-02-14 13:58:17 -03:00
rodrigorodriguez
be5cf3f190 new(all): #329 MERGE keyword added. 2023-02-13 17:31:38 -03:00
rodrigorodriguez
3d500051fa new(all): Log per bot started. #299. 2023-02-12 14:31:21 -03:00
rodrigorodriguez
b7cad9a67f new(basic.gblib): Power Platform integration. 2023-02-10 08:52:04 -03:00
Alan
ce84053d95 feat(whatsapp.gblib): add 'graphapi' option. 2023-02-09 19:40:16 -03:00
rodrigorodriguez
41ceedfc00 fix(basic.gblib): FILL keyword can now template images and AS IMAGE can convert a DOCX to a PNG. 2023-02-09 11:31:11 -03:00
rodrigorodriguez
16bdab6bcc fix(basic.gblib): FILL keyword can now template images and AS IMAGE can convert a DOCX to a PNG. 2023-02-08 07:14:02 -03:00
rodrigorodriguez
9f8349f0f9 docs(all): WARNING messages. 2023-02-07 10:50:40 -03:00
rodrigorodriguez
74e7a6e795 new(basic.gblib): FILL keyword can now template images and AS IMAGE can convert a DOCX to a PNG. 2023-02-06 18:14:48 -03:00
rodrigorodriguez
0fa7a828a3 new(basic.gblib): FILL keyword can now template images and AS IMAGE can convert a DOCX to a PNG. 2023-02-06 12:48:41 -03:00
rodrigorodriguez
8a5bdf3934 new(basic.gblib): FILL keyword can now template images and AS IMAGE can convert a DOCX to a PNG. 2023-02-05 18:19:39 -03:00
rodrigorodriguez
d4845dc062 new(basic.gblib): FILL keyword can now template images and AS IMAGE can convert a DOCX to a PNG. 2023-02-05 14:41:33 -03:00
rodrigorodriguez
1c62edcfe6 new(basic.gblib): FILL keyword can now template images and AS IMAGE can convert a DOCX to a PNG. 2023-02-05 11:57:02 -03:00
rodrigorodriguez
a071a10ee9 refactor(basic.gblib): Renaming ImageProcessing. 2023-02-04 10:58:00 -03:00
rodrigorodriguez
cf36adfab7 refactor(basic.gblib): Renaming WA. 2023-02-04 10:57:05 -03:00
rodrigorodriguez
1914d377ab new(basic.gblib): BLUR keyword introduced. 2023-02-04 10:48:13 -03:00
rodrigorodriguez
06149126e9 refactor(basic.gblib): Moving keywords to an isolated file. 2023-02-04 10:45:30 -03:00
rodrigorodriguez
b64a42feac fix(basic.gblib): #227 - HEAR AS FILE defining where to save, per bot. 2023-02-03 12:08:23 -03:00
rodrigorodriguez
473cd9871d fix(basic.gblib): #227 - HEAR AS FILE defining where to save, per bot. 2023-02-03 10:25:58 -03:00
rodrigorodriguez
bc5c1b0ced fix(basic.gblib): #227 - HEAR AS FILE and GET/SET PARAM. 2023-02-01 12:23:47 -03:00
rodrigorodriguez
33a5efa17b Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-02-01 12:23:31 -03:00
rodrigorodriguez
2521117a80 fix(basic.gblib): #227 - HEAR AS FILE and GET/SET PARAM. 2023-02-01 12:18:07 -03:00
rodrigorodriguez
ceded7fd55 fix(basic.gblib): #227 - HEAR AS FILE and GET/SET PARAM. 2023-02-01 11:15:58 -03:00
rodrigorodriguez
82a9ba983e fix(security.gblib): Params support in users. 2023-01-31 23:11:06 -03:00
Rodrigo Rodriguez
dc0fdc0564 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-01-31 19:23:09 -03:00
Rodrigo Rodriguez
b12a462e3e fix(core.gbapp): #195 bind call to provide min context for uploads. 2023-01-31 19:22:58 -03:00
Rodrigo Rodriguez
b2f2c732aa fix(core.gbapp): #195 bind call to provide min context for uploads. 2023-01-31 19:07:39 -03:00
rodrigorodriguez
c5290b91aa fix(basic.gblib): #227 - HEAR AS FILE. 2023-01-31 14:07:23 -03:00
rodrigorodriguez
42dbba4084 fix(basic.gblib): #227 - HEAR AS FILE. 2023-01-31 14:06:50 -03:00
rodrigorodriguez
5a07638d8a Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-01-31 11:53:08 -03:00
rodrigorodriguez
cbce44f20d fix(basic.gblib): #307 - Fixed user context in API. 2023-01-31 11:53:01 -03:00
rodrigorodriguez
4496cefa18 fix(basic.gblib): #307 - Fixed user context in API. 2023-01-31 11:46:37 -03:00
rodrigorodriguez
20911af3d7 new(security.gblib): Params support in users. 2023-01-31 10:08:48 -03:00
Rodrigo
99e7619494 chore(release): 2.3.9 [skip ci]
## [2.3.9](https://github.com/GeneralBots/BotServer/compare/2.3.8...2.3.9) (2023-01-29)

### Bug Fixes

* **basic.gblib:** [#326](https://github.com/GeneralBots/BotServer/issues/326) align JS and BASIC map file. ([b572cc9](b572cc9b8d))
2023-01-29 20:27:11 +00:00
rodrigorodriguez
b572cc9b8d fix(basic.gblib): #326 align JS and BASIC map file. 2023-01-29 17:20:38 -03:00
rodrigorodriguez
3d6bc56eca new(basic.gblib): VBS to JS directly now and minor fixes. 2023-01-29 12:02:14 -03:00
rodrigorodriguez
786fc7ea1c new(basic.gblib): Swagger specification draft. 2023-01-27 15:36:42 -03:00
Rodrigo
f0a25fcecc chore(release): 2.3.8 [skip ci]
## [2.3.8](https://github.com/GeneralBots/BotServer/compare/2.3.7...2.3.8) (2023-01-26)

### Bug Fixes

* **basic.gblib:** OPEN keyword fix. Magic number removal. ([e1c389c](e1c389cbd0))
* **basic.gblib:** OPEN keyword fix. Magic number removal. ([fe2af84](fe2af84b21))
2023-01-26 15:53:53 +00:00
Alan
e1c389cbd0 fix(basic.gblib): OPEN keyword fix. Magic number removal. 2023-01-26 12:47:37 -03:00
Alan
fe2af84b21 fix(basic.gblib): OPEN keyword fix. Magic number removal. 2023-01-26 12:47:17 -03:00
Rodrigo
482904672f chore(release): 2.3.7 [skip ci]
## [2.3.7](https://github.com/GeneralBots/BotServer/compare/2.3.6...2.3.7) (2023-01-25)

### Bug Fixes

* **systemkeywords.ts:** injected security context inside systemkeywords.ts ([8a895d3](8a895d3da1))
2023-01-25 14:07:37 +00:00
Alan
346f88b826 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-01-25 11:02:11 -03:00
Alan
8a895d3da1 fix(systemkeywords.ts): injected security context inside systemkeywords.ts 2023-01-25 11:02:10 -03:00
Rodrigo
66d3dcedf0 chore(release): 2.3.6 [skip ci]
## [2.3.6](https://github.com/GeneralBots/BotServer/compare/2.3.5...2.3.6) (2023-01-25)

### Bug Fixes

* **dialogkeywords.ts:** injected security context inside DialogKeywords ([81953d7](81953d7d9f))
2023-01-25 13:54:58 +00:00
Alan
81953d7d9f fix(dialogkeywords.ts): injected security context inside DialogKeywords 2023-01-25 10:49:00 -03:00
Rodrigo
dea972f233 chore(release): 2.3.5 [skip ci]
## [2.3.5](https://github.com/GeneralBots/BotServer/compare/2.3.4...2.3.5) (2023-01-19)

### Bug Fixes

* **basic.gblib:** executionid and changed to pid and security context for HEAR([#322](https://github.com/GeneralBots/BotServer/issues/322)). ([9820bb3](9820bb3f7a))
2023-01-19 13:54:01 +00:00
Alan Perdomo
b797f4fe7b Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-01-19 10:47:53 -03:00
Alan Perdomo
9820bb3f7a fix(basic.gblib): executionid and changed to pid and security context for HEAR(#322). 2023-01-19 10:47:47 -03:00
Rodrigo
f8775c48d4 chore(release): 2.3.4 [skip ci]
## [2.3.4](https://github.com/GeneralBots/BotServer/compare/2.3.3...2.3.4) (2023-01-19)

### Bug Fixes

* **basic.gblib:** executionid and changed to pid and security context for HEAR. ([1063739](1063739cbe))
2023-01-19 13:45:21 +00:00
Alan Perdomo
1063739cbe fix(basic.gblib): executionid and changed to pid and security context for HEAR. 2023-01-19 10:39:37 -03:00
Rodrigo
ff8ba02d67 chore(release): 2.3.3 [skip ci]
## [2.3.3](https://github.com/GeneralBots/BotServer/compare/2.3.2...2.3.3) (2023-01-17)

### Bug Fixes

* **basic.gblib:** Refactoring processInfo into all methods. ([50d3fcc](50d3fccd0d))
2023-01-17 14:10:19 +00:00
Daniel Lima
50d3fccd0d fix(basic.gblib): Refactoring processInfo into all methods. 2023-01-17 11:03:25 -03:00
Rodrigo
5166db205e chore(release): 2.3.2 [skip ci]
## [2.3.2](https://github.com/GeneralBots/BotServer/compare/2.3.1...2.3.2) (2023-01-13)

### Bug Fixes

* **systemkeywords.ts:** executionid, and changed to pid ([274db0d](274db0d389))
2023-01-13 19:18:16 +00:00
Alan Perdomo
274db0d389 fix(systemkeywords.ts): executionid, and changed to pid 2023-01-13 16:09:45 -03:00
Rodrigo
b2cae7f21f chore(release): 2.3.1 [skip ci]
## [2.3.1](https://github.com/GeneralBots/BotServer/compare/2.3.0...2.3.1) (2023-01-13)

### Bug Fixes

* **gbminservice.ts:** swagger-client migration from 2.0 to 3.0 ([552e8b1](552e8b14c4))
2023-01-13 16:36:40 +00:00
Alan Perdomo
552e8b14c4 fix(gbminservice.ts): swagger-client migration from 2.0 to 3.0 2023-01-13 13:30:18 -03:00
Rodrigo
ba96798c77 chore(release): 2.3.0 [skip ci]
# [2.3.0](https://github.com/GeneralBots/BotServer/compare/2.2.0...2.3.0) (2023-01-10)

### Features

* **systemkeywords.ts:** introducing executionid feature in api ([a65a82d](a65a82dd8a))
2023-01-10 15:09:59 +00:00
Alan Perdomo
a65a82dd8a feat(systemkeywords.ts): introducing executionid feature in api 2023-01-10 12:06:14 -03:00
Rodrigo
cfee19edda chore(release): 2.2.0 [skip ci]
# [2.2.0](https://github.com/GeneralBots/BotServer/compare/2.1.5...2.2.0) (2023-01-10)

### Features

* **systemkeywords.ts:** introducing executionid feature in api ([52dea44](52dea442d5))
2023-01-10 12:58:57 +00:00
Alan Perdomo
52dea442d5 feat(systemkeywords.ts): introducing executionid feature in api 2023-01-10 09:55:30 -03:00
Rodrigo
0b746670cb chore(release): 2.1.5 [skip ci]
## [2.1.5](https://github.com/GeneralBots/BotServer/compare/2.1.4...2.1.5) (2023-01-05)

### Bug Fixes

* **gbvmservices.ts:** Update ([c62d372](c62d372ec6))
2023-01-05 13:52:15 +00:00
Alan Perdomo
c62d372ec6 fix(gbvmservices.ts): Update 2023-01-05 10:47:40 -03:00
Rodrigo
d26464f4f2 chore(release): 2.1.4 [skip ci]
## [2.1.4](https://github.com/GeneralBots/BotServer/compare/2.1.3...2.1.4) (2023-01-05)

### Bug Fixes

* **tscompiler.ts:** Update typescript import. ([f4209eb](f4209eb4f0))
2023-01-05 01:17:08 +00:00
Alan Perdomo
58cd190d55 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-01-04 22:11:45 -03:00
Alan Perdomo
f4209eb4f0 fix(tscompiler.ts): Update typescript import. 2023-01-04 22:11:30 -03:00
Rodrigo
2ec4987853 chore(release): 2.1.3 [skip ci]
## [2.1.3](https://github.com/GeneralBots/BotServer/compare/2.1.2...2.1.3) (2023-01-04)

### Bug Fixes

* **AzureDeployerService:** accessToken ([07d9cf6](07d9cf67db))
* **azuredeployerservice.gbapp:** Update of password generator libs. ([57461ee](57461ee006))
* **basic.gblib:** Threat multiple spaces as one. ([0721a3f](0721a3fa78))
* **basic.gblib:** Threat multiple spaces as one. ([ac5911e](ac5911ee02))
2023-01-04 19:50:29 +00:00
Alan Perdomo
351db828e1 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2023-01-04 16:46:36 -03:00
rodrigorodriguez
0721a3fa78 fix(basic.gblib): Threat multiple spaces as one. 2023-01-04 16:36:18 -03:00
rodrigorodriguez
ac5911ee02 fix(basic.gblib): Threat multiple spaces as one. 2023-01-04 16:26:18 -03:00
Alan Perdomo
57461ee006 fix(azuredeployerservice.gbapp): Update of password generator libs. 2023-01-03 11:24:08 -03:00
Rodrigo Rodriguez
32c7d58f2c
Merge pull request #319 from AlanPerdomo/main
fix(AzureDeployerService): accessToken
2023-01-02 16:35:32 -03:00
Alan Perdomo
07d9cf67db fix(AzureDeployerService): accessToken 2023-01-02 16:31:28 -03:00
Rodrigo
ff2076c4a3 chore(release): 2.1.2 [skip ci]
## [2.1.2](https://github.com/GeneralBots/BotServer/compare/2.1.1...2.1.2) (2023-01-02)

### Bug Fixes

* **azuredeployer.gbapp:** createInstance free ([1b41551](1b41551ac5))
2023-01-02 14:34:59 +00:00
phpussente
6c20e64047
Merge pull request #318 from AlanPerdomo/main
fix(azuredeployer.gbapp): createInstance as free plan
2023-01-02 11:28:06 -03:00
Alan Perdomo
1b41551ac5 fix(azuredeployer.gbapp): createInstance free 2023-01-02 11:22:57 -03:00
Rodrigo
0ba0874eb4 chore(release): 2.1.1 [skip ci]
## [2.1.1](https://github.com/GeneralBots/BotServer/compare/2.1.0...2.1.1) (2023-01-01)

### Bug Fixes

* **admin.gbapp:** Fixing token generation  issues. ([8fb35c2](8fb35c2c2d))
* **admin.gbapp:** Fixing token generation  issues. ([2a848f4](2a848f4ea6))
* **admin.gbapp:** Fixing token generation  issues. ([3de3bd6](3de3bd6c01))
* **all:** Finishing renaming to main branch. ([16d2101](16d21019a0))
* **all:** Finishing renaming to main branch. ([cac92cc](cac92cca22))
* **all:** Finishing renaming to main branch. ([bff8bcf](bff8bcf7e5))
* **all:** Finishing renaming to main branch. ([07f173e](07f173ec73))
* **all:** Fixing bugs of 3.0 ([39eff93](39eff93528))
* **all:** TODO items removed or moved to ALM. ([7348c54](7348c54894))
* **basic.gblib:** Renaming branch to main. ([c6d9662](c6d9662145))
* **basic.gblib:** Renaming branch to main. ([203416c](203416c477))
* **basic.gblib:** TODO removal. ([2b08965](2b0896521e))
* **basic.gblib:** TODO removal. ([c0133a8](c0133a8960))
* **basic.gblib:** TODO removal. ([9ad1d56](9ad1d5693e))
2023-01-01 20:18:03 +00:00
rodrigorodriguez
16d21019a0 fix(all): Finishing renaming to main branch. 2023-01-01 16:36:16 -03:00
rodrigorodriguez
cac92cca22 fix(all): Finishing renaming to main branch. 2023-01-01 14:58:58 -03:00
rodrigorodriguez
bff8bcf7e5 fix(all): Finishing renaming to main branch. 2023-01-01 14:55:44 -03:00
rodrigorodriguez
07f173ec73 fix(all): Finishing renaming to main branch. 2023-01-01 14:53:07 -03:00
rodrigorodriguez
7348c54894 fix(all): TODO items removed or moved to ALM. 2023-01-01 14:24:53 -03:00
phpussente
7344a8e7dd
Merge pull request #316 from AlanPerdomo/master
Removal of start-up bugs
2022-12-29 19:58:46 -03:00
Alan Perdomo
943644313d Merge branch 'master' of https://github.com/AlanPerdomo/BotServer 2022-12-29 14:47:26 -03:00
Alan Perdomo
060f7a285f fix(all):Updating imports settings. 2022-12-29 14:47:19 -03:00
Daniel Lima
39eff93528 fix(all): Fixing bugs of 3.0 2022-12-27 12:55:22 -03:00
rodrigorodriguez
8fb35c2c2d fix(admin.gbapp): Fixing token generation issues. 2022-12-27 12:19:43 -03:00
rodrigorodriguez
2a848f4ea6 fix(admin.gbapp): Fixing token generation issues. 2022-12-27 12:18:07 -03:00
rodrigorodriguez
3de3bd6c01 fix(admin.gbapp): Fixing token generation issues. 2022-12-27 11:59:14 -03:00
rodrigorodriguez
c6d9662145 fix(basic.gblib): Renaming branch to main. 2022-12-26 13:49:46 -03:00
rodrigorodriguez
203416c477 fix(basic.gblib): Renaming branch to main. 2022-12-26 13:43:15 -03:00
rodrigorodriguez
2b0896521e fix(basic.gblib): TODO removal. 2022-12-26 13:37:11 -03:00
rodrigorodriguez
dc94816e47 Merge branch 'main' of https://github.com/GeneralBots/BotServer 2022-12-26 07:53:04 -03:00
rodrigorodriguez
c0133a8960 fix(basic.gblib): TODO removal. 2022-12-26 07:53:00 -03:00
rodrigorodriguez
9ad1d5693e fix(basic.gblib): TODO removal. 2022-12-26 07:51:41 -03:00
Rodrigo
87241dffdd chore(release): 2.1.0 [skip ci]
# [2.1.0](https://github.com/GeneralBots/BotServer/compare/2.0.182...2.1.0) (2022-12-23)

### Features

* **all:** Cleaning package manager files. ([0cb406a](0cb406ab79))
* **all:** Token retrieve optimized. ([6eb9d6c](6eb9d6cbf4))
2022-12-23 11:39:18 +00:00
rodrigorodriguez
0cb406ab79 feat(all): Cleaning package manager files. 2022-12-23 08:32:28 -03:00
rodrigorodriguez
e5ab2e31eb Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-12-23 08:23:11 -03:00
rodrigorodriguez
6eb9d6cbf4 feat(all): Token retrieve optimized. 2022-12-23 08:23:08 -03:00
Rodrigo
e720420ea9 chore(release): 2.0.182 [skip ci]
## [2.0.182](https://github.com/GeneralBots/BotServer/compare/2.0.181...2.0.182) (2022-12-23)

### Bug Fixes

* **all:** Node version info retrieval automated. ([9cbd8c1](9cbd8c17de))
2022-12-23 11:17:41 +00:00
rodrigorodriguez
5fbaaddbcb Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-12-22 20:55:53 -03:00
rodrigorodriguez
9cbd8c17de fix(all): Node version info retrieval automated. 2022-12-22 20:55:49 -03:00
Rodrigo
d44a9941d5 chore(release): 2.0.181 [skip ci]
## [2.0.181](https://github.com/GeneralBots/BotServer/compare/2.0.180...2.0.181) (2022-12-22)

### Bug Fixes

* **admin.gbapp:** .gbapp List param added to .gbot. ([48a1aa4](48a1aa4d46))
2022-12-22 14:37:53 +00:00
rodrigorodriguez
59512dff81 Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-12-22 11:31:41 -03:00
rodrigorodriguez
48a1aa4d46 fix(admin.gbapp): .gbapp List param added to .gbot. 2022-12-22 11:31:37 -03:00
Rodrigo
2ac6f8d766 chore(release): 2.0.180 [skip ci]
## [2.0.180](https://github.com/GeneralBots/BotServer/compare/2.0.179...2.0.180) (2022-12-16)

### Bug Fixes

* **all:** CI fixing. ([e4fc246](e4fc246b25))
* **all:** CI fixing. ([fa32b51](fa32b510d9))
* **all:** fetch calls replaces request packages. ([ea6c721](ea6c721cb5))
* **all:** Fixing [#294](https://github.com/GeneralBots/BotServer/issues/294). ([25ce766](25ce766820))
* **all:** Fixing bugs of 3.0 ([d09265e](d09265e023))
* **all:** Fixing bugs of 3.0 ([6cad39d](6cad39d8c7))
* **all:** Fixing bugs of 3.0. ([d180753](d180753253))
* **all:** Fixing bugs of 3.0. ([83d98c7](83d98c794f))
* **all:** Fixing bugs of 3.0. ([bf705c7](bf705c730b))
* **all:** Fixing CI integration bugs. ([0ce6bc5](0ce6bc5d8c))
* **all:** Fixing CI integration bugs. ([9c44e38](9c44e38560))
* **all:** Fixing CI integration bugs. ([9acb055](9acb05567a))
* **all:** Fixing CI integration bugs. ([c323f5a](c323f5a3e8))
* **all:** Fixing CI integration bugs. ([b2c1dda](b2c1dda2b2))
* **all:** Fixing CI integration bugs. ([ae29dda](ae29dda0fa))
* **all:** Fixing CI integration bugs. ([0ecac1a](0ecac1a4b5))
* **all:** Fixing CI integration bugs. ([9f88210](9f8821089a))
* **all:** Removal of warnings and erros after pkg update. ([663c85e](663c85e7c5))
* **all:** Update of arm packages and token usage. ([179b20a](179b20a248))
* **core.gbapp:** Lint of all. ([4a2f8b7](4a2f8b7b43))
* **core.gbapp:** Update of all packages and nodejs to 19.1.0. ([f8d2cd8](f8d2cd895a))
* **core.gbapp:** Update of all packages and nodejs to 19.1.0. ([a315d21](a315d21cfe))
* **core.gbapp:** Update of properties modifier with declare. ([21df92e](21df92e280))
* **core.gbapp:** WARNINGS.md ([f35a2ac](f35a2aceba))
2022-12-16 15:09:14 +00:00
rodrigorodriguez
0ce6bc5d8c fix(all): Fixing CI integration bugs. 2022-12-16 12:00:59 -03:00
rodrigorodriguez
9c44e38560 fix(all): Fixing CI integration bugs. 2022-12-16 11:27:36 -03:00
rodrigorodriguez
9acb05567a fix(all): Fixing CI integration bugs. 2022-12-16 10:59:38 -03:00
rodrigorodriguez
c323f5a3e8 fix(all): Fixing CI integration bugs. 2022-12-16 10:54:34 -03:00
rodrigorodriguez
b2c1dda2b2 fix(all): Fixing CI integration bugs. 2022-12-16 10:36:09 -03:00
rodrigorodriguez
ae29dda0fa fix(all): Fixing CI integration bugs. 2022-12-16 09:46:24 -03:00
rodrigorodriguez
0ecac1a4b5 fix(all): Fixing CI integration bugs. 2022-12-16 09:46:15 -03:00
rodrigorodriguez
48bba12416 Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-12-16 09:39:58 -03:00
rodrigorodriguez
9f8821089a fix(all): Fixing CI integration bugs. 2022-12-16 09:39:55 -03:00
Rodrigo Rodriguez
ad65f6fd1d
Update README.md 2022-12-16 09:37:54 -03:00
rodrigorodriguez
d180753253 fix(all): Fixing bugs of 3.0. 2022-12-16 09:35:57 -03:00
rodrigorodriguez
83d98c794f fix(all): Fixing bugs of 3.0. 2022-12-16 09:31:43 -03:00
rodrigorodriguez
b75d9cf793 new(all): ChatGPT integration. 2022-12-15 23:03:20 -03:00
rodrigorodriguez
179b20a248 fix(all): Update of arm packages and token usage. 2022-12-15 10:56:27 -03:00
rodrigorodriguez
e83dc02f77 Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-12-14 08:31:27 -03:00
rodrigorodriguez
bf705c730b fix(all): Fixing bugs of 3.0. 2022-12-14 08:23:39 -03:00
Daniel Lima
d09265e023 fix(all): Fixing bugs of 3.0 2022-12-12 16:10:17 -03:00
Daniel Lima
6cad39d8c7 fix(all): Fixing bugs of 3.0 2022-12-12 16:09:49 -03:00
Daniel Lima
d9f8cbd8a9 fix(all):fixing dependencies and boot. 2022-12-07 12:08:55 -03:00
Rodrigo Rodriguez
aee02caa84
Rename launch.json.template to launch.json 2022-12-07 11:05:46 -03:00
rodrigorodriguez
ea6c721cb5 fix(all): fetch calls replaces request packages. 2022-11-30 09:40:09 -03:00
rodrigorodriguez
e4fc246b25 fix(all): CI fixing. 2022-11-29 21:51:53 -03:00
rodrigorodriguez
fa32b510d9 fix(all): CI fixing. 2022-11-29 21:43:28 -03:00
rodrigorodriguez
fe066f6365 fix(all): 2022-11-29 21:39:58 -03:00
Rodrigo Rodriguez
2e9c9f8695
Merge pull request #295 from GeneralBots/vm3-alpha-debugger
Vm3 alpha debugger
2022-11-29 19:05:09 -03:00
Rodrigo Rodriguez
1d04f071fe
Merge branch 'master' into vm3-alpha-debugger 2022-11-29 19:04:55 -03:00
rodrigorodriguez
25ce766820 fix(all): Fixing #294. 2022-11-29 18:01:23 -03:00
rodrigorodriguez
21df92e280 fix(core.gbapp): Update of properties modifier with declare. 2022-11-22 11:09:14 -03:00
Rodrigo Rodriguez
663c85e7c5 fix(all): Removal of warnings and erros after pkg update. 2022-11-21 20:11:27 -03:00
rodrigorodriguez
f35a2aceba fix(core.gbapp): WARNINGS.md 2022-11-21 13:51:07 -03:00
rodrigorodriguez
4a2f8b7b43 fix(core.gbapp): Lint of all. 2022-11-19 23:34:58 -03:00
rodrigorodriguez
f8d2cd895a fix(core.gbapp): Update of all packages and nodejs to 19.1.0. 2022-11-19 19:50:19 -03:00
rodrigorodriguez
a315d21cfe fix(core.gbapp): Update of all packages and nodejs to 19.1.0. 2022-11-18 22:39:14 -03:00
rodrigorodriguez
9393081e58 new(all): Alpha Word Debugger for 3.0. 2022-11-14 16:09:05 -03:00
rodrigorodriguez
76c28edaa7 new(all): Alpha Word Debugger for 3.0. 2022-11-13 23:38:04 -03:00
rodrigorodriguez
48644060da new(all): Alpha Word Debugger for 3.0. 2022-11-13 23:11:52 -03:00
rodrigorodriguez
b5da93b5cf new(all): Alpha Word Debugger for 3.0. 2022-11-13 22:56:09 -03:00
rodrigorodriguez
24af00cff6 new(all): Alpha Word Debugger for 3.0. 2022-11-12 23:26:47 -03:00
rodrigorodriguez
301de1f73c new(all): Alpha Word Debugger for 3.0. 2022-11-12 21:33:45 -03:00
rodrigorodriguez
79f77b528d new(all): Alpha Word Debugger for 3.0. 2022-11-12 17:17:14 -03:00
rodrigorodriguez
c954786efb new(all): Alpha Word Debugger for 3.0. 2022-11-11 21:35:05 -03:00
rodrigorodriguez
f21c699b54 new(all): Vm isolated working with IPC BASIC 3.0; 2022-11-11 10:01:18 -03:00
rodrigorodriguez
80da54f789 new(all): Vm isolated working with IPC BASIC 3.0; 2022-11-10 10:39:05 -03:00
rodrigorodriguez
3bc100e37e new(all): Vm isolated working with IPC BASIC 3.0; 2022-11-09 21:02:14 -03:00
rodrigorodriguez
2e073ce5a9 new(all): Vm isolated working with IPC BASIC 3.0; 2022-11-08 18:13:41 -03:00
rodrigorodriguez
6c072fb070 new(all): Vm isolated working with IPC BASIC 3.0; 2022-11-06 21:28:59 -03:00
rodrigorodriguez
25230816b0 new(all): Vm isolated working with IPC BASIC 3.0; 2022-11-06 20:19:05 -03:00
rodrigorodriguez
fa0324dc06 new(all): Vm isolated working with IPC BASIC 3.0; 2022-11-05 17:59:41 -03:00
rodrigorodriguez
5076e254fd new(all): Vm isolated working with IPC BASIC 3.0; 2022-11-04 14:28:02 -03:00
rodrigorodriguez
a7a86175e1 new(all): Vm isolated working with IPC BASIC 3.0; 2022-11-03 11:06:26 -03:00
rodrigorodriguez
4bbd384501 new(all): Vm isolated working with IPC BASIC 3.0; 2022-11-02 19:40:59 -03:00
rodrigorodriguez
45f4a48f88 new(all): Vm isolated working with IPC BASIC 3.0; 2022-11-02 16:03:25 -03:00
rodrigorodriguez
a26d659e29 new(all): Vm isolated working with IPC BASIC 3.0; 2022-11-01 00:59:35 -03:00
rodrigorodriguez
765b3eddbc new(all) General Bots Auto Tester 1.0; Unlimited conditionals after-code BASIC 3.0; 2022-10-28 23:17:35 -03:00
Rodrigo
24cd4284ce chore(release): 2.0.179 [skip ci]
## [2.0.179](https://github.com/GeneralBots/BotServer/compare/2.0.178...2.0.179) (2022-10-22)

### Bug Fixes

* **whatsapp.gblib:** FIX on HEAR ON after provider change. ([c66f9bf](c66f9bfe04))
* **whatsapp.gblib:** FIX on HEAR ON after provider change. ([1d8e7e1](1d8e7e1763))
* **whatsapp.gblib:** FIX on HEAR ON after provider change. ([916794f](916794fc15))
2022-10-22 16:34:42 +00:00
rodrigorodriguez
30c93526c0 new(all) General Bots Auto Tester 1.0; Unlimited conditionals after-code BASIC 3.0; 2022-10-22 13:23:32 -03:00
rodrigorodriguez
c66f9bfe04 fix(whatsapp.gblib): FIX on HEAR ON after provider change. 2022-10-16 14:46:41 -03:00
rodrigorodriguez
1d8e7e1763 fix(whatsapp.gblib): FIX on HEAR ON after provider change. 2022-10-16 12:02:17 -03:00
rodrigorodriguez
916794fc15 fix(whatsapp.gblib): FIX on HEAR ON after provider change. 2022-10-16 10:29:59 -03:00
rodrigorodriguez
e01bc57119 new(whatsapp.gblib): Native provider works in groups now. 2022-10-15 17:04:46 -03:00
rodrigorodriguez
cbec1a41b5 new(whatsapp.gblib): Native provider works in groups now. 2022-10-14 12:17:56 -03:00
rodrigorodriguez
8df8ed5f91 new(whatsapp.gblib): Native provider works in groups now. 2022-10-14 11:54:31 -03:00
rodrigorodriguez
a748cb274d new(whatsapp.gblib): Native provider works in groups now. 2022-10-14 11:22:08 -03:00
rodrigorodriguez
592e9acb55 new(whatsapp.gblib): Native provider works in groups now. 2022-10-13 23:12:27 -03:00
rodrigorodriguez
2df29f689c new(whatsapp.gblib): Native provider works in groups now. 2022-10-13 15:26:59 -03:00
rodrigorodriguez
9a211fc6a9 new(whatsapp.gblib): Native provider works in groups now. 2022-10-13 11:54:38 -03:00
rodrigorodriguez
39a881e61e new(whatsapp.gblib): Native provider works in groups now. 2022-10-13 11:47:04 -03:00
rodrigorodriguez
2d787485e6 new(whatsapp.gblib): Native provider works in groups now. 2022-10-13 11:45:17 -03:00
rodrigorodriguez
13b19bb4ed new(whatsapp.gblib): Native provider works in groups now. 2022-10-13 11:25:29 -03:00
rodrigorodriguez
f0b996fd68 new(whatsapp.gblib): Native provider works in groups now. 2022-10-13 11:24:21 -03:00
rodrigorodriguez
34414f65ac new(whatsapp.gblib): Native provider works in groups now. 2022-10-12 21:21:50 -03:00
rodrigorodriguez
2c28eff318 new(whatsapp.gblib): Native provider works in groups now. 2022-10-12 20:45:41 -03:00
rodrigorodriguez
60b3536d8b new(whatsapp.gblib): Native provider works in groups now. 2022-10-12 20:38:35 -03:00
rodrigorodriguez
b23111dfad new(basic.gblib): WhatsApp buttons. 2022-10-12 15:08:53 -03:00
rodrigorodriguez
8b84a9201a new(whatsapp.gblib): Native provider works in groups now. 2022-10-12 03:13:46 -03:00
rodrigorodriguez
431987e72d new(whatsapp.gblib): Native provider works in groups now. 2022-10-12 02:37:48 -03:00
rodrigorodriguez
64d77b4b43 new(whatsapp.gblib): Native provider works in groups now. 2022-10-12 02:05:26 -03:00
rodrigorodriguez
9e84298ab0 new(whatsapp.gblib): Native provider works in groups now. 2022-10-12 01:27:49 -03:00
rodrigorodriguez
76308153b3 new(whatsapp.gblib): Native provider works in groups now. 2022-10-12 00:30:34 -03:00
rodrigorodriguez
633a7cb0ea new(all): Paralel bot loading. 2022-10-11 20:18:12 -03:00
rodrigorodriguez
6d21bd1803 new(all): Paralel bot loading. 2022-10-10 01:51:54 -03:00
rodrigorodriguez
907a47cc68 new(all): Paralel bot loading. 2022-10-10 01:49:43 -03:00
rodrigorodriguez
9fa736918f new(all): Paralel bot loading. 2022-10-10 01:42:22 -03:00
rodrigorodriguez
ba65eaf201 new(all): Paralel bot loading. 2022-10-10 01:40:20 -03:00
rodrigorodriguez
80a8a3c3a6 new(all): Paralel bot loading. 2022-10-10 01:31:50 -03:00
rodrigorodriguez
55533b6b80 new(all): Paralel bot loading. 2022-10-10 01:18:41 -03:00
rodrigorodriguez
43c05ad135 new(all): Paralel bot loading. 2022-10-10 01:11:24 -03:00
rodrigorodriguez
1d1a7cc98f new(all): Paralel bot loading. 2022-10-10 01:07:22 -03:00
rodrigorodriguez
1db979ddbf new(all): Paralel bot loading. 2022-10-10 00:58:48 -03:00
rodrigorodriguez
24a3af5051 new(all): Paralel bot loading. 2022-10-10 00:48:52 -03:00
rodrigorodriguez
9c81db77c9 new(all): Paralel bot loading. 2022-10-10 00:38:45 -03:00
rodrigorodriguez
73300310b7 new(all): Paralel bot loading. 2022-10-10 00:08:29 -03:00
rodrigorodriguez
e53cead532 new(all): Paralel bot loading. 2022-10-10 00:02:22 -03:00
rodrigorodriguez
c7e51335d5 new(all): Paralel bot loading. 2022-10-10 00:01:34 -03:00
rodrigorodriguez
16801fcb6c new(all): Paralel bot loading. 2022-10-10 00:00:30 -03:00
rodrigorodriguez
73f20825e7 new(all): Custom Domain support per bot. 2022-10-09 23:41:37 -03:00
rodrigorodriguez
6a7c2eb0f5 new(all): Custom Domain support per bot. 2022-10-09 23:35:13 -03:00
rodrigorodriguez
4cc95e8dbe new(all): Custom Domain support per bot. 2022-10-09 23:31:37 -03:00
rodrigorodriguez
8dbcb4ef27 new(all): Custom Domain support per bot. 2022-10-09 23:28:07 -03:00
rodrigorodriguez
b50735236d new(all): Custom Domain support per bot. 2022-10-09 23:22:03 -03:00
rodrigorodriguez
5a81d15359 new(all): Custom Domain support per bot. 2022-10-09 23:10:57 -03:00
rodrigorodriguez
be40a46013 new(all): Custom Domain support per bot. 2022-10-09 21:30:14 -03:00
rodrigorodriguez
cda4959501 new(all): Custom Domain support per bot. 2022-10-09 20:46:17 -03:00
rodrigorodriguez
dfd89ec5e7 new(all): Custom Domain support per bot. 2022-10-09 17:53:21 -03:00
rodrigorodriguez
12fb0daeee new(all): Custom Domain support per bot. 2022-10-09 17:47:38 -03:00
rodrigorodriguez
a12c3383a1 new(all): Custom Domain support per bot. 2022-10-09 17:28:46 -03:00
rodrigorodriguez
25342e90fe Merge branch 'master' of 2022-10-09 17:23:04 -03:00
rodrigorodriguez
64066ed2ff new(all): Custom Domain support per bot. 2022-10-09 17:05:31 -03:00
Rodrigo
7fec2c3499 chore(release): 2.0.178 [skip ci]
## [2.0.178](https://github.com/GeneralBots/BotServer/compare/2.0.177...2.0.178) (2022-10-09)

### Bug Fixes

* **whatsapp.gblib:** SEND FILE and WPP providers. ([3f7e024](3f7e024b58))
2022-10-09 17:29:40 +00:00
Rodrigo Rodriguez
3f7e024b58 fix(whatsapp.gblib): SEND FILE and WPP providers. 2022-10-09 14:21:40 -03:00
rodrigorodriguez
08d8570af1 new(all): Custom Domain support per bot. 2022-10-04 18:34:15 -03:00
rodrigorodriguez
8687a4258b Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-10-04 16:03:15 -03:00
rodrigorodriguez
1144d0f640 new(all): Custom Domain support per bot. 2022-10-04 16:03:12 -03:00
Rodrigo
a8cde404d5 chore(release): 2.0.177 [skip ci]
## [2.0.177](https://github.com/GeneralBots/BotServer/compare/2.0.176...2.0.177) (2022-10-04)

### Bug Fixes

* **whatsapp.gblib:** SEND FILE and WPP providers. ([c6de0f0](c6de0f0fa1))
2022-10-04 19:00:17 +00:00
rodrigorodriguez
bbf40cba72 new(all): Custom Domain support per bot. 2022-10-04 15:51:09 -03:00
rodrigorodriguez
ad5744aa7d new(all): Custom Domain support per bot. 2022-10-04 15:44:57 -03:00
Rodrigo Rodriguez
c6de0f0fa1 fix(whatsapp.gblib): SEND FILE and WPP providers. 2022-10-04 15:42:34 -03:00
rodrigorodriguez
d563c0f5ed new(all): Custom Domain support per bot. 2022-10-02 15:27:53 -03:00
rodrigorodriguez
dab35ac77f new(all): Custom Domain support per bot. 2022-10-02 15:12:52 -03:00
rodrigorodriguez
212eb825aa new(all): Custom Domain support per bot. 2022-10-02 15:12:44 -03:00
rodrigorodriguez
1d6ecfb9bc new(all): Custom Domain support per bot. 2022-10-02 14:47:00 -03:00
rodrigorodriguez
0aa358aa98 new(all): Custom Domain support per bot. 2022-10-02 14:25:11 -03:00
rodrigorodriguez
c29efe794c new(all): Custom Domain support per bot. 2022-10-02 14:19:15 -03:00
rodrigorodriguez
e8be1c29b4 new(all): Custom Domain support per bot. 2022-10-02 14:12:36 -03:00
rodrigorodriguez
4c26cc0985 new(all): Custom Domain support per bot. 2022-10-02 13:41:50 -03:00
rodrigorodriguez
8909834b82 new(all): Custom Domain support per bot. 2022-10-02 13:37:37 -03:00
Rodrigo Rodriguez
be63b71fd9 new(all): Twitter API. 2022-10-01 08:44:14 -03:00
Rodrigo Rodriguez
f326142f1e new(all): Twitter API. 2022-09-26 19:45:30 -03:00
Rodrigo Rodriguez
9be9b4184d Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-09-24 12:51:50 -03:00
Rodrigo Rodriguez
2cd56801c3 new(all): Twitter API. 2022-09-24 12:51:47 -03:00
Rodrigo
1d535480d7 chore(release): 2.0.176 [skip ci]
## [2.0.176](https://github.com/GeneralBots/BotServer/compare/2.0.175...2.0.176) (2022-09-12)

### Bug Fixes

* **basic.gblib:** SCREENSHOT keyword. ([0f1ee22](0f1ee22467))
2022-09-12 12:41:29 +00:00
Rodrigo Rodriguez
6a1e454afd Merge branech 'master' of https://github.com/GeneralBots/BotServer 2022-09-12 09:32:38 -03:00
Rodrigo Rodriguez
0f1ee22467 fix(basic.gblib): SCREENSHOT keyword. 2022-09-12 08:52:51 -03:00
Rodrigo Rodriguez
cbfae96c99
Update and rename CODE_OF_CONDUCT.md to CODE_OF_CONDUCT-pt-br.md 2022-09-05 11:36:29 -03:00
Rodrigo
d27cc0cffc chore(release): 2.0.175 [skip ci]
## [2.0.175](https://github.com/GeneralBots/BotServer/compare/2.0.174...2.0.175) (2022-09-04)

### Bug Fixes

* **whatsapp.gblib:** SEND FILE and WPP providers. ([05260c0](05260c0ee5))
* **whatsapp.gblib:** SEND FILE and WPP providers. ([5261691](5261691ba9))
2022-09-04 22:00:19 +00:00
Rodrigo Rodriguez
05260c0ee5 fix(whatsapp.gblib): SEND FILE and WPP providers. 2022-09-04 18:51:59 -03:00
Rodrigo Rodriguez
5261691ba9 fix(whatsapp.gblib): SEND FILE and WPP providers. 2022-09-04 18:50:36 -03:00
Rodrigo
faccecf76e chore(release): 2.0.174 [skip ci]
## [2.0.174](https://github.com/GeneralBots/BotServer/compare/2.0.173...2.0.174) (2022-09-02)

### Bug Fixes

* **whatsapp.gblib:** .gbapp message subprocessing. ([c14a766](c14a766047))
2022-09-02 13:40:28 +00:00
Rodrigo Rodriguez
c3eb1dd0eb Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-09-02 10:32:10 -03:00
Rodrigo Rodriguez
c14a766047 fix(whatsapp.gblib): .gbapp message subprocessing. 2022-09-02 10:32:07 -03:00
Rodrigo
8b2b36196d chore(release): 2.0.173 [skip ci]
## [2.0.173](https://github.com/GeneralBots/BotServer/compare/2.0.172...2.0.173) (2022-09-01)

### Bug Fixes

* **whatsapp.gblib:** .gbapp message subprocessing. ([e72b030](e72b030e95))
* **whatsapp.gblib:** .gbapp message subprocessing. ([9c00ddd](9c00dddd78))
2022-09-01 11:58:31 +00:00
Rodrigo Rodriguez
e72b030e95 fix(whatsapp.gblib): .gbapp message subprocessing. 2022-09-01 08:50:04 -03:00
Rodrigo Rodriguez
7e899a96f1 Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-09-01 08:46:32 -03:00
Rodrigo Rodriguez
9c00dddd78 fix(whatsapp.gblib): .gbapp message subprocessing. 2022-09-01 08:46:29 -03:00
Rodrigo
ee5c4afe00 chore(release): 2.0.172 [skip ci]
## [2.0.172](https://github.com/GeneralBots/BotServer/compare/2.0.171...2.0.172) (2022-09-01)

### Bug Fixes

* **whatsapp.gblib:** .gbapp message subprocessing. ([aeaaddc](aeaaddc8ab))
2022-09-01 02:37:43 +00:00
Rodrigo Rodriguez
ec7a7c9f33 Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-08-31 23:29:16 -03:00
Rodrigo Rodriguez
aeaaddc8ab fix(whatsapp.gblib): .gbapp message subprocessing. 2022-08-31 23:29:14 -03:00
Rodrigo
041cb7bb2a chore(release): 2.0.171 [skip ci]
## [2.0.171](https://github.com/GeneralBots/BotServer/compare/2.0.170...2.0.171) (2022-09-01)

### Bug Fixes

* **whatsapp.gblib:** .gbapp message subprocessing. ([a5073e0](a5073e020e))
2022-09-01 01:51:38 +00:00
Rodrigo Rodriguez
30bc3c4de2 Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-08-31 22:43:14 -03:00
Rodrigo Rodriguez
a5073e020e fix(whatsapp.gblib): .gbapp message subprocessing. 2022-08-31 22:43:09 -03:00
Rodrigo
0a56b09615 chore(release): 2.0.170 [skip ci]
## [2.0.170](https://github.com/GeneralBots/BotServer/compare/2.0.169...2.0.170) (2022-08-29)

### Bug Fixes

* **basic.gblib:** Impersonated SET MAX LINES. ([e9211d9](e9211d92ac))
2022-08-29 00:01:35 +00:00
Rodrigo Rodriguez
e9211d92ac fix(basic.gblib): Impersonated SET MAX LINES. 2022-08-28 20:52:43 -03:00
Rodrigo
2aa4eea8fc chore(release): 2.0.169 [skip ci]
## [2.0.169](https://github.com/GeneralBots/BotServer/compare/2.0.168...2.0.169) (2022-08-28)

### Bug Fixes

* **basic.gblib:** Impersonated SET MAX LINES. ([f058a4a](f058a4a0c6))
* **basic.gblib:** Impersonated SET MAX LINES. ([8f373f3](8f373f3691))
2022-08-28 21:54:06 +00:00
Rodrigo Rodriguez
f058a4a0c6 fix(basic.gblib): Impersonated SET MAX LINES. 2022-08-28 18:45:25 -03:00
Rodrigo Rodriguez
eacd346713 Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-08-28 18:38:09 -03:00
Rodrigo Rodriguez
8f373f3691 fix(basic.gblib): Impersonated SET MAX LINES. 2022-08-28 18:38:02 -03:00
Rodrigo
039dd7372e chore(release): 2.0.168 [skip ci]
## [2.0.168](https://github.com/GeneralBots/BotServer/compare/2.0.167...2.0.168) (2022-08-28)

### Bug Fixes

* **core.gbapp:** More information on bot creation. ([7e7fb27](7e7fb277d7))
* **core.gbapp:** More information on bot creation. ([e07152b](e07152bc07))
2022-08-28 10:17:27 +00:00
Rodrigo Rodriguez
7e7fb277d7 fix(core.gbapp): More information on bot creation. 2022-08-28 07:07:41 -03:00
Rodrigo Rodriguez
761caa0c61 Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-08-28 07:01:26 -03:00
Rodrigo Rodriguez
e07152bc07 fix(core.gbapp): More information on bot creation. 2022-08-28 07:01:23 -03:00
Rodrigo
1a5d178b19 chore(release): 2.0.167 [skip ci]
## [2.0.167](https://github.com/GeneralBots/BotServer/compare/2.0.166...2.0.167) (2022-08-26)

### Bug Fixes

* **kb.gbapp:** Skips blank answers lines. ([004cc8f](004cc8fef5))
2022-08-26 21:45:46 +00:00
Rodrigo Rodriguez
3dee5efc3a Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-08-26 18:37:45 -03:00
Rodrigo Rodriguez
004cc8fef5 fix(kb.gbapp): Skips blank answers lines. 2022-08-26 18:37:35 -03:00
Rodrigo
383895e542 chore(release): 2.0.166 [skip ci]
## [2.0.166](https://github.com/GeneralBots/BotServer/compare/2.0.165...2.0.166) (2022-08-26)

### Bug Fixes

* **kb.gbapp:** Skips blank answers lines. ([796a412](796a412e32))
2022-08-26 21:16:23 +00:00
Rodrigo Rodriguez
4ab4476645 Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-08-26 18:08:00 -03:00
Rodrigo Rodriguez
796a412e32 fix(kb.gbapp): Skips blank answers lines. 2022-08-26 18:07:58 -03:00
Rodrigo
b6be2db35e chore(release): 2.0.165 [skip ci]
## [2.0.165](https://github.com/GeneralBots/BotServer/compare/2.0.164...2.0.165) (2022-08-26)

### Bug Fixes

* **kb.gbapp:** Skips blank answers lines. ([143e425](143e425bfc))
2022-08-26 19:23:38 +00:00
Rodrigo Rodriguez
bc06f4df5c Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-08-26 16:15:09 -03:00
Rodrigo Rodriguez
143e425bfc fix(kb.gbapp): Skips blank answers lines. 2022-08-26 16:14:59 -03:00
Rodrigo
0583996611 chore(release): 2.0.164 [skip ci]
## [2.0.164](https://github.com/GeneralBots/BotServer/compare/2.0.163...2.0.164) (2022-08-26)

### Bug Fixes

* **kb.gbapp:** Skips blank answers lines. ([fa63a3e](fa63a3eb6f))
2022-08-26 17:05:03 +00:00
Rodrigo Rodriguez
6af3054a97 Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-08-26 13:57:08 -03:00
Rodrigo Rodriguez
fa63a3eb6f fix(kb.gbapp): Skips blank answers lines. 2022-08-26 13:57:05 -03:00
Rodrigo
8086f4183d chore(release): 2.0.163 [skip ci]
## [2.0.163](https://github.com/GeneralBots/BotServer/compare/2.0.162...2.0.163) (2022-08-26)

### Bug Fixes

* **kb.gbapp:** Skips blank answers lines. ([46fb424](46fb4244c7))
2022-08-26 16:12:38 +00:00
Rodrigo Rodriguez
4922c448fa Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-08-26 13:04:10 -03:00
Rodrigo Rodriguez
46fb4244c7 fix(kb.gbapp): Skips blank answers lines. 2022-08-26 13:04:08 -03:00
Rodrigo
b5a623649d chore(release): 2.0.162 [skip ci]
## [2.0.162](https://github.com/GeneralBots/BotServer/compare/2.0.161...2.0.162) (2022-08-26)

### Bug Fixes

* **core.gbapp:** Translator off for two char phrases. ([bd20312](bd20312bad))
2022-08-26 15:02:22 +00:00
Rodrigo Rodriguez
bd20312bad fix(core.gbapp): Translator off for two char phrases. 2022-08-26 11:53:47 -03:00
Rodrigo Rodriguez
f5826e1f0d new(basic.gblib): WEb Automation HOVER and LINK BY TEXT keywords. 2022-08-26 09:53:00 -03:00
Rodrigo Rodriguez
ee5b9a7567 new(basic.gblib): New keyword MERGE. 2022-08-07 23:54:19 -03:00
Rodrigo Rodriguez
c508019ca0 new(all): Web log. 2022-08-07 11:05:20 -03:00
Rodrigo Rodriguez
28a6f33700 Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-08-06 19:38:17 -03:00
Rodrigo Rodriguez
2a83e1e631 new(all): Web log. 2022-08-06 19:38:13 -03:00
Rodrigo Rodriguez
baad3e7563 new(all): Web log. 2022-08-06 19:37:58 -03:00
Rodrigo
1b958890d7 chore(release): 2.0.161 [skip ci]
## [2.0.161](https://github.com/GeneralBots/BotServer/compare/2.0.160...2.0.161) (2022-08-06)

### Bug Fixes

* **whatsapp.gblib:** SEND FILE sending bug. ([7eeadfa](7eeadfa92d))
2022-08-06 19:09:04 +00:00
Rodrigo Rodriguez
31f262e83e Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-08-06 16:00:03 -03:00
Rodrigo Rodriguez
7eeadfa92d fix(whatsapp.gblib): SEND FILE sending bug. 2022-08-06 15:59:59 -03:00
Rodrigo
80dbb2612b chore(release): 2.0.160 [skip ci]
## [2.0.160](https://github.com/GeneralBots/BotServer/compare/2.0.159...2.0.160) (2022-08-06)

### Bug Fixes

* **whatsapp.gblib:** SEND FILE sending bug. ([08607e4](08607e49bb))
* **whatsapp.gblib:** SEND FILE sending bug. ([61183a3](61183a3654))
* **whatsapp.gblib:** SEND FILE sending bug. ([ae96a4f](ae96a4f123))
2022-08-06 00:56:26 +00:00
Rodrigo Rodriguez
08607e49bb fix(whatsapp.gblib): SEND FILE sending bug. 2022-08-05 21:48:28 -03:00
Rodrigo Rodriguez
61183a3654 fix(whatsapp.gblib): SEND FILE sending bug. 2022-08-05 21:38:57 -03:00
Rodrigo Rodriguez
9211cd84eb Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-08-05 21:38:07 -03:00
Rodrigo Rodriguez
ae96a4f123 fix(whatsapp.gblib): SEND FILE sending bug. 2022-08-05 21:38:04 -03:00
Rodrigo
aa9f7a04b9 chore(release): 2.0.159 [skip ci]
## [2.0.159](https://github.com/GeneralBots/BotServer/compare/2.0.158...2.0.159) (2022-08-06)

### Bug Fixes

* **whatsapp.gblib:** SEND FILE sending bug. ([9cb2852](9cb285214c))
2022-08-06 00:34:53 +00:00
Rodrigo Rodriguez
3020cd100a Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-08-05 21:26:26 -03:00
Rodrigo Rodriguez
9cb285214c fix(whatsapp.gblib): SEND FILE sending bug. 2022-08-05 21:26:23 -03:00
Rodrigo
e325f67c61 chore(release): 2.0.158 [skip ci]
## [2.0.158](https://github.com/GeneralBots/BotServer/compare/2.0.157...2.0.158) (2022-08-05)

### Bug Fixes

* **whatsapp.gblib:** SEND FILE sending bug. ([bcc14de](bcc14def98))
2022-08-05 23:47:40 +00:00
Rodrigo Rodriguez
c0ab88eb0f Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-08-05 20:40:32 -03:00
Rodrigo Rodriguez
bcc14def98 fix(whatsapp.gblib): SEND FILE sending bug. 2022-08-05 20:40:29 -03:00
Rodrigo
440fb08aab chore(release): 2.0.157 [skip ci]
## [2.0.157](https://github.com/GeneralBots/BotServer/compare/2.0.156...2.0.157) (2022-08-05)

### Bug Fixes

* **whatsapp.gblib:** SEND FILE sending bug. ([8194c79](8194c79828))
2022-08-05 23:39:17 +00:00
Rodrigo Rodriguez
8194c79828 fix(whatsapp.gblib): SEND FILE sending bug. 2022-08-05 20:30:57 -03:00
Rodrigo Rodriguez
955843363c new(basic.gblib): PUT keyword. 2022-08-05 19:35:19 -03:00
Rodrigo Rodriguez
4e53537228 new(basic.gblib): PUT keyword. 2022-08-05 19:23:17 -03:00
Rodrigo Rodriguez
619e6ab196 new(basic.gblib): PUT keyword. 2022-08-05 19:19:30 -03:00
Rodrigo Rodriguez
d3769e5bf3 new(basic.gblib): PUT keyword. 2022-08-05 00:10:23 -03:00
Rodrigo Rodriguez
29b1975dab new(basic.gblib): CALL keyword to start another VM. 2022-08-01 20:36:38 -03:00
Rodrigo Rodriguez
c408bb4a3c new(basic.gblib): CALL keyword to start another VM. 2022-08-01 18:36:45 -03:00
Rodrigo Rodriguez
845b9578b9 new(whatsapp.gblib): General Bots WhatsApp provider. 2022-07-21 17:25:02 -03:00
Rodrigo Rodriguez
aaebc1c81d new(whatsapp.gblib): General Bots WhatsApp provider. 2022-07-21 15:36:41 -03:00
Rodrigo Rodriguez
28847adad4 Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-07-21 15:33:37 -03:00
Rodrigo Rodriguez
6891b8c8c4 new(whatsapp.gblib): General Bots WhatsApp provider. 2022-07-21 15:33:33 -03:00
Rodrigo Rodriguez
c982fc3a2d
Update README.md 2022-07-19 16:56:48 -03:00
Rodrigo Rodriguez
7ea1801c19
Update README.md 2022-07-19 16:54:38 -03:00
Rodrigo Rodriguez
b84d1a6983 new(whatsapp.gblib): General Bots WhatsApp provider. 2022-07-19 16:51:48 -03:00
Rodrigo Rodriguez
0e24f30c23 new(whatsapp.gblib): General Bots WhatsApp provider. 2022-07-19 10:10:14 -03:00
Rodrigo Rodriguez
cbef720873 new(whatsapp.gblib): General Bots WhatsApp provider. 2022-07-17 13:37:41 -03:00
Rodrigo Rodriguez
d898f962d1 new(whatsapp.gblib): General Bots WhatsApp provider. 2022-07-17 13:22:05 -03:00
Rodrigo Rodriguez
e3eeaf1e57 new(whatsapp.gblib): General Bots WhatsApp provider. 2022-07-16 09:56:17 -03:00
Rodrigo Rodriguez
6aa86a17c2 Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-07-15 09:05:22 -03:00
Rodrigo Rodriguez
963202a31a new(whatsapp.gblib): New providers. 2022-07-15 09:05:16 -03:00
Rodrigo Rodriguez
2eea15438e new(whatsapp.gblib): General Bots WhatsApp provider. 2022-07-13 09:38:13 -03:00
Rodrigo Rodriguez
9e82beaf19 new(whatsapp.gblib): General Bots WhatsApp provider. 2022-07-12 13:30:12 -03:00
Rodrigo Rodriguez
844004fa01 new(whatsapp.gblib): Multiple providers can be loaded at once. 2022-07-09 11:24:06 -03:00
Rodrigo Rodriguez
cad03e145e new(whatsapp.gblib): Multiple providers can be loaded at once. 2022-07-09 11:20:00 -03:00
Rodrigo Rodriguez
6c0ce4fa10 new(whatsapp.gblib): Multiple providers can be loaded at once. 2022-07-09 02:04:17 -03:00
Rodrigo Rodriguez
76b862cbde new(whatsapp.gblib): Multiple providers can be loaded at once. 2022-07-09 01:18:36 -03:00
Rodrigo Rodriguez
423cf368ca new(whatsapp.gblib): Multiple providers can be loaded at once. 2022-07-09 01:14:24 -03:00
Rodrigo Rodriguez
4f93b626d1 new(whatsapp.gblib): Multiple providers can be loaded at once. 2022-07-08 13:22:23 -03:00
Rodrigo Rodriguez
975e7a1d89 new(whatsapp.gblib): Multiple providers can be loaded at once. 2022-07-07 12:36:08 -03:00
Rodrigo Rodriguez
2eb9057473 new(whatsapp.gblib): Multiple providers can be loaded at once. 2022-07-07 12:29:12 -03:00
Rodrigo Rodriguez
50f395d6b1 Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-07-07 11:14:07 -03:00
Rodrigo Rodriguez
a6c3d7db6a new(whatsapp.gblib): Multiple providers can be loaded at once. 2022-07-07 11:14:02 -03:00
Rodrigo
9ffeb7f9fd chore(release): 2.0.156 [skip ci]
## [2.0.156](https://github.com/GeneralBots/BotServer/compare/2.0.155...2.0.156) (2022-07-06)

### Bug Fixes

* **all:** CHART and IMAGE from GET HTTP calls. ([a3e99bb](a3e99bb553))
2022-07-06 18:11:55 +00:00
Rodrigo Rodriguez
17616c636e Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-07-06 15:04:10 -03:00
Rodrigo Rodriguez
a3e99bb553 fix(all): CHART and IMAGE from GET HTTP calls. 2022-07-06 15:01:58 -03:00
Rodrigo
64451d6336 chore(release): 2.0.155 [skip ci]
## [2.0.155](https://github.com/GeneralBots/BotServer/compare/2.0.154...2.0.155) (2022-07-06)

### Bug Fixes

* **all:** CHART and IMAGE from GET HTTP calls. ([cf62b10](cf62b10196))
2022-07-06 15:45:03 +00:00
Rodrigo Rodriguez
1de4683541 Merge branch 'master' of https://github.com/GeneralBots/BotServer 2022-07-06 12:36:54 -03:00
Rodrigo Rodriguez
cf62b10196 fix(all): CHART and IMAGE from GET HTTP calls. 2022-07-06 12:36:51 -03:00
335 changed files with 737071 additions and 76373 deletions

View file

@ -1,2 +0,0 @@
[config]
command = bash ./deploy.sh

View file

@ -0,0 +1,46 @@
name: GBCI
run: git config --global http.sslVerify false
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: gbo
steps:
- name: Disable SSL verification (temporary)
run: git config --global http.sslVerify false
- uses: actions/checkout@v4
# - name: Setup Node.js
# uses: actions/setup-node@v4
# with:
# node-version: '20'
# cache: 'npm'
- name: Copy files to deployment location
run: |
echo "[General Bots Deployer] Copying files to deploy location..."
sudo rm -rf /opt/gbo/bin/bot/botserver/dist
sudo cp -r ./* /opt/gbo/bin/bot/botserver
- name: Building BotServer
run: |
echo "[General Bots Deployer] Building BotServer..."
# rm -rf /opt/gbo/bin/bot/botserver/node_modules
cd /opt/gbo/bin/bot/botserver
sudo npm ci --production
npm run build-server
npm run build-gbui
- name: Restart Bots Deployer
run: |
echo "[General Bots Deployer] Restarting..."
lxc restart pragmatismo-bot

View file

@ -1,9 +0,0 @@
<!-- File a GitHub issue only for bugs or feature requests related to the code **in this repository**. For other topics you can get more information in the README file. -->
### Observed Results:
<!-- This could be a description, error output, steps to reproduce, a feature missed, etc. -->
### Expected behavior:
<!-- What did you expect to happen? -->

View file

@ -1,35 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.

View file

@ -1,7 +0,0 @@
---
name: Custom issue template
about: Describe this issue template's purpose here.
---

View file

@ -1,17 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View file

@ -1,2 +0,0 @@
**Description**
A clear and concise description of what the requirement is.

View file

@ -1,16 +0,0 @@
### Changes description
<!-- Describe results, user mentions, screenshots, screencast (gif) -->
### Checklist
Please check if your PR fulfills the following specifications:
- [ ] Tests for the changes have been added
- [ ] Docs have been added/updated
### References
<!-- issues related (for reference or to be closed) and/or links of discuss -->
Closes #N/A

View file

@ -1,3 +0,0 @@
isOutside: true
# Team Name
team: contributors

44
.github/settings.yml vendored
View file

@ -1,44 +0,0 @@
repository:
name: botserver
description: botserver
homepage: http://pragmatismo.io/general-bots
topics: node-module
private: false
has_issues: true
has_wiki: false
has_downloads: true
default_branch: develop
allow_squash_merge: true
allow_merge_commit: false
allow_rebase_merge: true
labels:
- name: bug
color: f44336
- name: build
color: 795548
- name: ci
color: fbca04
- name: documentation
color: 607d8b
- name: duplicate
color: 9e9e9e
- name: feature
color: 3f51b5
- name: invalid
color: cddc39
- name: performance
color: 009688
- name: question
color: ff5722
- name: refactor
color: 9c27b0
- name: style
color: 2196f3
- name: test
color: 8bc34a
- name: wontfix
color: ffffff
- name: help wanted
color: 33aa3f
- name: good first issue
color: 7057ff

View file

@ -1,56 +0,0 @@
# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
# More GitHub Actions for Azure: https://github.com/Azure/actions
name: Build and deploy Node.js app to Azure Web App - PROD-GeneralBotsLinux
on:
push:
branches:
- master
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Node.js version
uses: actions/setup-node@v1
with:
node-version: '14.x'
- name: npm install, build, and test
run: |
npm install
npm run build --if-present
npm run test --if-present
- name: Upload artifact for deployment job
uses: actions/upload-artifact@v2
with:
name: node-app
path: .
deploy:
runs-on: ubuntu-latest
needs: build
environment:
name: 'Production'
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v2
with:
name: node-app
- name: 'Deploy to Azure Web App'
id: deploy-to-webapp
uses: azure/webapps-deploy@v2
with:
app-name: 'PROD-GeneralBotsLinux'
slot-name: 'Production'
publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_E69900EF774D49ABBAB41426E12289F3 }}
package: .

View file

@ -1,56 +0,0 @@
# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
# More GitHub Actions for Azure: https://github.com/Azure/actions
name: Build and deploy Node.js app to Azure Web App - PROD-OppBotLinux
on:
push:
branches:
- master
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Node.js version
uses: actions/setup-node@v1
with:
node-version: '14.x'
- name: npm install, build, and test
run: |
npm install
npm run build --if-present
npm run test --if-present
- name: Upload artifact for deployment job
uses: actions/upload-artifact@v2
with:
name: node-app
path: .
deploy:
runs-on: ubuntu-latest
needs: build
environment:
name: 'Production'
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v2
with:
name: node-app
- name: 'Deploy to Azure Web App'
id: deploy-to-webapp
uses: azure/webapps-deploy@v2
with:
app-name: 'PROD-OppBotLinux'
slot-name: 'Production'
publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_456A1EF9536A491F90BAED7CCC1233DB }}
package: .

14
.gitignore vendored
View file

@ -11,6 +11,8 @@
/packages/default.gbui/build /packages/default.gbui/build
/packages/default.gbui/.env /packages/default.gbui/.env
/packages/default.gbui/node_modules /packages/default.gbui/node_modules
/packages/default.gbui/package-lock.json
/packages/default.gbui/yarn-lock.json
/work /work
*.vbs.compiled *.vbs.compiled
*.vbs.js *.vbs.js
@ -18,3 +20,15 @@
.env .env
*.env *.env
.vscode/launch.json .vscode/launch.json
.wwebjs_auth
GB.log
gb.log
GB.log.json
yarn-error.log
yarn-lock.json
logo.svg
screenshot.png
data.db
.wwebjs_cache
*doula*
*botpoc*

9
.hintrc Normal file
View file

@ -0,0 +1,9 @@
{
"extends": [
"development"
],
"hints": {
"typescript-config/strict": "off",
"typescript-config/consistent-casing": "off"
}
}

View file

@ -5,4 +5,4 @@
"arrowParens": "avoid", "arrowParens": "avoid",
"semi": true, "semi": true,
"singleQuote": true "singleQuote": true
} }

47
.test-init.ts Normal file
View file

@ -0,0 +1,47 @@
import { expect, test } from 'vitest';
import { GBServer } from './src/app';
import { RootData } from './src/RootData';
import { GBMinInstance } from 'botlib';
import { Mutex } from 'async-mutex';
export default function init() {
const min = {
packages: null,
appPackages: null,
botId: 'gbtest',
instance: {botId: 'gbtest'},
core: {},
conversationalService: {},
kbService: {},
adminService: {},
deployService: {},
textServices: {},
bot: {},
dialogs: {},
userState: {},
userProfile: {},
whatsAppDirectLine: {},
cbMap: {},
scriptMap: {},
sandBoxMap: {},
gbappServices: {}
}
GBServer.globals = new RootData();
GBServer.globals.server = null;
GBServer.globals.httpsServer = null;
GBServer.globals.webSessions = {};
GBServer.globals.processes = [0, { pid: 1, proc: {step: {}}}];
GBServer.globals.files = {};
GBServer.globals.appPackages = [];
GBServer.globals.sysPackages = [];
GBServer.globals.minInstances = [min];
GBServer.globals.minBoot = min;
GBServer.globals.wwwroot = null;
GBServer.globals.entryPointDialog = null;
GBServer.globals.debuggers = [];
GBServer.globals.indexSemaphore = new Mutex();
GBServer.globals.users = {1: {userId: 1}};
}

View file

@ -1,31 +0,0 @@
language: node_js
node_js:
- lts/*
notifications:
email: false
before_script:
- npm run build
branches:
only:
- master
- /^greenkeeper/.*$/
except:
- /^v\d+\.\d+\.\d+$/
after_success:
- npm run travis-deploy-once "npm run semantic-release"
- npm pack
deploy:
- provider: pages
skip_cleanup: true
local_dir: docs/reference
github_token: $GITHUB_TOKEN
on:
tags: false
branch: master

View file

@ -1,26 +0,0 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"sourceMaps": true,
"name": "Debug Program",
"program": "${workspaceRoot}/boot.js",
"cwd": "${workspaceRoot}",
"env": {
"NODE_ENV": "development"
},
"args": [
"--no-deprecation"
],
"skipFiles": [
"node_modules/**/*.js"
],
"outFiles": [
"${workspaceRoot}/dist/**/*.js"],
"stopOnEntry": false,
"console": "integratedTerminal"
}
]
}

View file

@ -1,3 +0,0 @@
{
"git.ignoreLimitWarning": true
}

30
.vscode/tasks.json vendored
View file

@ -1,30 +0,0 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"type": "typescript",
"tsconfig": "tsconfig.json",
"option": "watch",
"problemMatcher": [
"$tsc-watch"
],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"type": "typescript",
"tsconfig": "tsconfig.json",
"problemMatcher": [
"$tsc"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}

View file

@ -1,3 +1,770 @@
## [2.4.42](https://github.com/GeneralBots/BotServer/compare/2.4.41...2.4.42) (2023-08-01)
### Bug Fixes
* **whatsapp.gblib:** Now using e-mail instead of Teams ID. ([5860000](https://github.com/GeneralBots/BotServer/commit/58600001c9b7c229ff1ccf3c66ed935a8eaf1986))
## [2.4.41](https://github.com/GeneralBots/BotServer/compare/2.4.40...2.4.41) (2023-08-01)
### Bug Fixes
* **all:** Minor changes in PROD. ([76c1efd](https://github.com/GeneralBots/BotServer/commit/76c1efd12d525381d77d12200d397afb644ce3ac))
## [2.4.40](https://github.com/GeneralBots/BotServer/compare/2.4.39...2.4.40) (2023-07-31)
### Bug Fixes
* **all:** Minor changes in PROD. ([9b88c33](https://github.com/GeneralBots/BotServer/commit/9b88c330c60e9646d72e1215f14d0c8ba3462cd2))
## [2.4.39](https://github.com/GeneralBots/BotServer/compare/2.4.38...2.4.39) (2023-07-31)
### Bug Fixes
* **all:** Minor changes in PROD. ([e5f41bc](https://github.com/GeneralBots/BotServer/commit/e5f41bca786f1637d1c3d35d5542b062c2372a44))
## [2.4.38](https://github.com/GeneralBots/BotServer/compare/2.4.37...2.4.38) (2023-07-29)
### Bug Fixes
* **all:** Minor changes in PROD. ([245e491](https://github.com/GeneralBots/BotServer/commit/245e491a25ebc94565854e5a02e2cd1d3ca95836))
## [2.4.37](https://github.com/GeneralBots/BotServer/compare/2.4.36...2.4.37) (2023-07-28)
### Bug Fixes
* **all:** Minor changes in PROD. ([e829f37](https://github.com/GeneralBots/BotServer/commit/e829f3725a69efc7e4a041f4f9e94936baf61649))
## [2.4.36](https://github.com/GeneralBots/BotServer/compare/2.4.35...2.4.36) (2023-07-28)
### Bug Fixes
* **all:** Minor changes in PROD. ([e415bb0](https://github.com/GeneralBots/BotServer/commit/e415bb01ca3d1e79b18b2e978a12b38cd541d01b))
## [2.4.35](https://github.com/GeneralBots/BotServer/compare/2.4.34...2.4.35) (2023-07-28)
### Bug Fixes
* **core.gbapp:** FIX SSR errors and setOption impersonated. ([a585cf5](https://github.com/GeneralBots/BotServer/commit/a585cf51eaded13dcd5cddb3120a7f1e77ae6e25))
## [2.4.34](https://github.com/GeneralBots/BotServer/compare/2.4.33...2.4.34) (2023-07-26)
### Bug Fixes
* **core.gbapp:** FIX SSR errors and setOption impersonated. ([5589095](https://github.com/GeneralBots/BotServer/commit/5589095f861bba6b5b19b70d5f4ca35247255c52))
## [2.4.33](https://github.com/GeneralBots/BotServer/compare/2.4.32...2.4.33) (2023-07-26)
### Bug Fixes
* **core.gbapp:** FIX SSR errors and setOption impersonated. ([e5f5121](https://github.com/GeneralBots/BotServer/commit/e5f51210379c16427e784dbf829f175053cca3f8))
## [2.4.32](https://github.com/GeneralBots/BotServer/compare/2.4.31...2.4.32) (2023-07-26)
### Bug Fixes
* **core.gbapp:** FIX SSR errors and setOption impersonated. ([ed96440](https://github.com/GeneralBots/BotServer/commit/ed9644089e481834b309f63bfe227ec5e5b0d854))
## [2.4.31](https://github.com/GeneralBots/BotServer/compare/2.4.30...2.4.31) (2023-07-26)
### Bug Fixes
* **core.gbapp:** FIX SSR errors and setOption impersonated. ([0fe2bdb](https://github.com/GeneralBots/BotServer/commit/0fe2bdbe6fa3cc30355acbadab38747e800e050b))
## [2.4.30](https://github.com/GeneralBots/BotServer/compare/2.4.29...2.4.30) (2023-07-26)
### Bug Fixes
* **core.gbapp:** FIX SSR errors and setOption impersonated. ([a652873](https://github.com/GeneralBots/BotServer/commit/a65287338a765b0293cb24af5335fe32bcafbecc))
## [2.4.29](https://github.com/GeneralBots/BotServer/compare/2.4.28...2.4.29) (2023-07-26)
### Bug Fixes
* **core.gbapp:** FIX SSR errors and setOption impersonated. ([7a6d14c](https://github.com/GeneralBots/BotServer/commit/7a6d14cf3aa28aadea4a0e1d1905f96046a45cc0))
## [2.4.28](https://github.com/GeneralBots/BotServer/compare/2.4.27...2.4.28) (2023-07-26)
### Bug Fixes
* **core.gbapp:** FIX SSR errors and setOption impersonated. ([e596f31](https://github.com/GeneralBots/BotServer/commit/e596f31de64c477a913416ede1488da2cf0688e2))
## [2.4.27](https://github.com/GeneralBots/BotServer/compare/2.4.26...2.4.27) (2023-07-25)
### Bug Fixes
* **all:** Fix answers with dialog id working again. ([f34c7b1](https://github.com/GeneralBots/BotServer/commit/f34c7b1ac5227f27d2fae3b55810e38c493d52e6))
* **all:** Fix answers with dialog id working again. ([a24648c](https://github.com/GeneralBots/BotServer/commit/a24648cc9f7c3ad3ab740096f60b4581b595936b))
* **all:** Fix answers with dialog id working again. ([6b832c4](https://github.com/GeneralBots/BotServer/commit/6b832c42b6442178b68954cb6241b1b79dcf3285))
## [2.4.26](https://github.com/GeneralBots/BotServer/compare/2.4.25...2.4.26) (2023-07-25)
### Bug Fixes
* **all:** Fix answers with dialog id working again. ([2a6f64f](https://github.com/GeneralBots/BotServer/commit/2a6f64f238b6f7088c4a925e0dcd68b705c0e3e8))
* **all:** Fix answers with dialog id working again. ([ec172b0](https://github.com/GeneralBots/BotServer/commit/ec172b0554bd28ff447c5f8436bb81a9a20ad703))
## [2.4.25](https://github.com/GeneralBots/BotServer/compare/2.4.24...2.4.25) (2023-07-23)
### Bug Fixes
* **all:** Fix in AS IMAGE generation of single row. ([a9256d8](https://github.com/GeneralBots/BotServer/commit/a9256d8ecb2a82c47ccb2765cc2ea66b4a83d30c))
* **all:** Fix in AS IMAGE generation of single row. ([576e73b](https://github.com/GeneralBots/BotServer/commit/576e73b6258b313962136823b8753f2d10f3a30e))
* **all:** Fix in AS IMAGE generation of single row. ([4c5ccb2](https://github.com/GeneralBots/BotServer/commit/4c5ccb2fac5d25b95fe4fb1aca08a39d647ecb23))
## [2.4.24](https://github.com/GeneralBots/BotServer/compare/2.4.23...2.4.24) (2023-07-23)
### Bug Fixes
* **all:** Fix in AS IMAGE generation of single row. ([c646b2d](https://github.com/GeneralBots/BotServer/commit/c646b2d27bfaec15ffe65efe081362bc23125a27))
* **all:** Fix in AS IMAGE generation of single row. ([5827286](https://github.com/GeneralBots/BotServer/commit/5827286406fd1bdeb93ee2fe62ca8bc59e9ecec9))
## [2.4.23](https://github.com/GeneralBots/BotServer/compare/2.4.22...2.4.23) (2023-07-23)
### Bug Fixes
* **all:** Fix in AS IMAGE generation of single row. ([618ff5a](https://github.com/GeneralBots/BotServer/commit/618ff5a296f476f341a8e7ff82444406fa4eebc9))
## [2.4.22](https://github.com/GeneralBots/BotServer/compare/2.4.21...2.4.22) (2023-07-23)
### Bug Fixes
* **all:** Fix in AS IMAGE generation of single row. ([ee56768](https://github.com/GeneralBots/BotServer/commit/ee567681f122d94760270b904fb9782a0f13741b))
## [2.4.21](https://github.com/GeneralBots/BotServer/compare/2.4.20...2.4.21) (2023-07-23)
### Bug Fixes
* **all:** Fix in AS IMAGE generation of single row. ([6874869](https://github.com/GeneralBots/BotServer/commit/6874869ef8ce404b1bbef2980e5aef7efbf4a71a))
## [2.4.20](https://github.com/GeneralBots/BotServer/compare/2.4.19...2.4.20) (2023-07-23)
### Bug Fixes
* **all:** Fix in AS IMAGE generation of single row. ([ee6356d](https://github.com/GeneralBots/BotServer/commit/ee6356d83b256a61aa0a974f5802a727923ab4f8))
## [2.4.19](https://github.com/GeneralBots/BotServer/compare/2.4.18...2.4.19) (2023-07-23)
### Bug Fixes
* **all:** Fix in DATE filter. ([ad47305](https://github.com/GeneralBots/BotServer/commit/ad47305a025d97e0df77f9995ac44451da21f0e1))
## [2.4.18](https://github.com/GeneralBots/BotServer/compare/2.4.17...2.4.18) (2023-07-19)
### Bug Fixes
* **all:** Create bot working again. ([ed74c5b](https://github.com/GeneralBots/BotServer/commit/ed74c5b0039a6ad2a578382a4204824258bdbb54))
* **all:** Create bot working again. ([9852fa8](https://github.com/GeneralBots/BotServer/commit/9852fa8cb2867b9f141b77ee44c3e7bdbc99d8ec))
## [2.4.17](https://github.com/GeneralBots/BotServer/compare/2.4.16...2.4.17) (2023-07-19)
### Bug Fixes
* **all:** Create bot working again. ([b779f29](https://github.com/GeneralBots/BotServer/commit/b779f292129f94422075d03fa4e74a8534134832))
## [2.4.16](https://github.com/GeneralBots/BotServer/compare/2.4.15...2.4.16) (2023-07-19)
### Bug Fixes
* **all:** Create bot working again. ([3bbd732](https://github.com/GeneralBots/BotServer/commit/3bbd732fd44d47b90b28402de567d23443a412c9))
* **all:** Create bot working again. ([3fa53d0](https://github.com/GeneralBots/BotServer/commit/3fa53d072b5ce1291128aa486f8465b1a28ff50e))
* **all:** Minor changes in PROD. ([abe5f03](https://github.com/GeneralBots/BotServer/commit/abe5f0380187bc4da498f15a13c8b4ae741bf8ec))
## [2.4.15](https://github.com/GeneralBots/BotServer/compare/2.4.14...2.4.15) (2023-07-19)
### Bug Fixes
* **all:** Create bot working again. ([4eecd5a](https://github.com/GeneralBots/BotServer/commit/4eecd5acec56547e5b5ab064f52dc81eb451e1a4))
## [2.4.14](https://github.com/GeneralBots/BotServer/compare/2.4.13...2.4.14) (2023-07-18)
### Bug Fixes
* **all:** Create bot working again. ([fbc2416](https://github.com/GeneralBots/BotServer/commit/fbc2416a550148b4e9195b59d044ba6f59c0c0e2))
## [2.4.13](https://github.com/GeneralBots/BotServer/compare/2.4.12...2.4.13) (2023-07-18)
### Bug Fixes
* **all:** Create bot working again. ([c4f8d0a](https://github.com/GeneralBots/BotServer/commit/c4f8d0a064343e790c819da43f8f3d7df7551f5c))
## [2.4.12](https://github.com/GeneralBots/BotServer/compare/2.4.11...2.4.12) (2023-07-18)
### Bug Fixes
* **all:** Create bot working again. ([0ed3dce](https://github.com/GeneralBots/BotServer/commit/0ed3dce1d275d61ddb03d914e636cc7ce53407fa))
## [2.4.11](https://github.com/GeneralBots/BotServer/compare/2.4.10...2.4.11) (2023-07-18)
### Bug Fixes
* **all:** Create bot working again. ([3fd3213](https://github.com/GeneralBots/BotServer/commit/3fd3213740e766da510c37461d23877dc34e6cff))
* **all:** Create bot working again. ([88c8a29](https://github.com/GeneralBots/BotServer/commit/88c8a2999867e6c8d707a02c0d194aeda511930d))
* **all:** Create bot working again. ([91db185](https://github.com/GeneralBots/BotServer/commit/91db185b54713cc7dad2835cab6592a8b0e278c1))
## [2.4.10](https://github.com/GeneralBots/BotServer/compare/2.4.9...2.4.10) (2023-07-18)
### Bug Fixes
* **all:** Create bot working again. ([c3e6a3d](https://github.com/GeneralBots/BotServer/commit/c3e6a3da7a2395c68126d38dc24616bdf4353214))
## [2.4.9](https://github.com/GeneralBots/BotServer/compare/2.4.8...2.4.9) (2023-07-17)
### Bug Fixes
* **all:** [#123](https://github.com/GeneralBots/BotServer/issues/123) done. ([899696d](https://github.com/GeneralBots/BotServer/commit/899696d7e59fbb90964852c3838695ed52815040))
## [2.4.8](https://github.com/GeneralBots/BotServer/compare/2.4.7...2.4.8) (2023-07-17)
### Bug Fixes
* **all:** [#123](https://github.com/GeneralBots/BotServer/issues/123) done. ([2d1efeb](https://github.com/GeneralBots/BotServer/commit/2d1efeb0cce3da5ff73116139e64f693eda59ed9))
## [2.4.7](https://github.com/GeneralBots/BotServer/compare/2.4.6...2.4.7) (2023-07-15)
### Bug Fixes
* **all:** Create bot working again. ([46bbe87](https://github.com/GeneralBots/BotServer/commit/46bbe87bb4d5fc3ff83aac664c486f53178f4df2))
## [2.4.6](https://github.com/GeneralBots/BotServer/compare/2.4.5...2.4.6) (2023-07-15)
### Bug Fixes
* **all:** Create bot working again. ([9e49895](https://github.com/GeneralBots/BotServer/commit/9e498956f8b35e379f853f1a5f8a8a59ec712e2c))
## [2.4.5](https://github.com/GeneralBots/BotServer/compare/2.4.4...2.4.5) (2023-07-14)
### Bug Fixes
* **all:** Create bot working again. ([0f1acf6](https://github.com/GeneralBots/BotServer/commit/0f1acf66462861aa709c153435ad5d785ebab951))
* **all:** Create bot working again. ([f4ab703](https://github.com/GeneralBots/BotServer/commit/f4ab70396a6dc67c8cac2f53aa2e0c802dadbe72))
* **all:** Create bot working again. ([b92fbca](https://github.com/GeneralBots/BotServer/commit/b92fbca72ae819d2b7b417231d8b35d23ef7ec34))
## [2.4.4](https://github.com/GeneralBots/BotServer/compare/2.4.3...2.4.4) (2023-07-13)
### Bug Fixes
* **all:** Minor changes in PROD. ([671fe0c](https://github.com/GeneralBots/BotServer/commit/671fe0cc3e8a3a8cbc0f3f8675fe6c9d9d460b84))
## [2.4.3](https://github.com/GeneralBots/BotServer/compare/2.4.2...2.4.3) (2023-07-09)
### Bug Fixes
* **all:** Minor changes in PROD. ([c67ec3e](https://github.com/GeneralBots/BotServer/commit/c67ec3e696eea622e1cf171ce74ae98c52a3ebd1))
## [2.4.2](https://github.com/GeneralBots/BotServer/compare/2.4.1...2.4.2) (2023-07-09)
### Bug Fixes
* **all:** Minor changes in PROD. ([77d5b4e](https://github.com/GeneralBots/BotServer/commit/77d5b4ee68b079c1e84f76e06b888bfaff67d39c))
## [2.4.1](https://github.com/GeneralBots/BotServer/compare/2.4.0...2.4.1) (2023-07-09)
### Bug Fixes
* **all:** Minor changes in PROD. ([8a04ad2](https://github.com/GeneralBots/BotServer/commit/8a04ad2354f7242296ac8d90bfddb52081fef1d8))
# [2.4.0](https://github.com/GeneralBots/BotServer/compare/2.3.9...2.4.0) (2023-07-09)
### Bug Fixes
* **all:** CWD in Windows now working. ([6721c3d](https://github.com/GeneralBots/BotServer/commit/6721c3dcc31d604923f6c3ca0b7100c76f61d14d))
* **all:** Fixes in production. ([56b6877](https://github.com/GeneralBots/BotServer/commit/56b687792b6fa230f67adcd047011cfa536006cc))
* **all:** HTTP handler added. ([7c6a175](https://github.com/GeneralBots/BotServer/commit/7c6a1753b3944b0b1f95c7a7faa1556a60e8d0ad))
* **all:** Minor changes in PROD. ([f69b3f0](https://github.com/GeneralBots/BotServer/commit/f69b3f004cd87844b2339458cfe75bb6aef8662a))
* **all:** Minor changes in PROD. ([0b5fa3e](https://github.com/GeneralBots/BotServer/commit/0b5fa3eec28948ddb47e19b1a84f5fdcb64d0782))
* **all:** Minor changes in PROD. ([904691c](https://github.com/GeneralBots/BotServer/commit/904691ca8149b141855dc1d4098f486472ea473a))
* **all:** Minor changes in PROD. ([d7a5ef5](https://github.com/GeneralBots/BotServer/commit/d7a5ef5ef2cc662a9fab0ab95ddd90995ffc013b))
* **all:** Minor changes in PROD. ([892025e](https://github.com/GeneralBots/BotServer/commit/892025e5b2f7c3d861060f04880dd2fbca23aed6))
* **all:** Minor changes in PROD. ([76df151](https://github.com/GeneralBots/BotServer/commit/76df151507a66352d04de9dfcbf05599614a00cb))
* **all:** Minor changes in PROD. ([f20b5f6](https://github.com/GeneralBots/BotServer/commit/f20b5f6293377c906d1a2277bb7c1fc4197f6f5f))
* **all:** Minor changes in PROD. ([a60581b](https://github.com/GeneralBots/BotServer/commit/a60581bd320bdfa7abac5a7d8c27bc84cfa87cf5))
* **app.ts:** Preparing to use 4 or more SSL certificates. ([72b645f](https://github.com/GeneralBots/BotServer/commit/72b645fd2adbd221a74f9fd87d89c984aea78b8d))
* **azuredeployer.gbapp:** Adding Resource Providers (.Web/.Sql) ([6c9d124](https://github.com/GeneralBots/BotServer/commit/6c9d12452407faa0ad3eb6c0e8e61abd87331020))
* **azuredeployer.gbapp:** Create DB with basic cost. ([0ed600e](https://github.com/GeneralBots/BotServer/commit/0ed600edc3709a6a17ffe2072d22c1ff4b83782a))
* **azuredeployer.gblib:** FREE flag for database. ([1074ef7](https://github.com/GeneralBots/BotServer/commit/1074ef7240879007a2838ec814192b7bf727c0ce))
* **basic.gblib:** [#196](https://github.com/GeneralBots/BotServer/issues/196) Spellchecker in groups now working. ([45ad0c3](https://github.com/GeneralBots/BotServer/commit/45ad0c389495624adae04f9e47f9a75214548ec4))
* **basic.gblib:** [#269](https://github.com/GeneralBots/BotServer/issues/269) Fixing of group autostart behaviour. ([de77227](https://github.com/GeneralBots/BotServer/commit/de772279456591b2a94c206430788ecf8cabb7f3))
* **basic.gblib:** [#286](https://github.com/GeneralBots/BotServer/issues/286) fix token replaacement. ([a679786](https://github.com/GeneralBots/BotServer/commit/a67978621769abab001851609f6a5e3db7c65e3c))
* **basic.gblib:** [#286](https://github.com/GeneralBots/BotServer/issues/286) fix token replaacement. ([0e9c2e9](https://github.com/GeneralBots/BotServer/commit/0e9c2e9ebf9a0a9bf130e3d91268c009c3ad1fc0))
* **basic.gblib:** Debugger improvements. ([3e68858](https://github.com/GeneralBots/BotServer/commit/3e68858bb09d7d5b09a2f7cfbfe6e6c964950fd1))
* **basic.gblib:** Fixes in WebAutomation. ([d4cf165](https://github.com/GeneralBots/BotServer/commit/d4cf165165a82587041776c6e4c8aa7065df1fc1))
* **basic.gblib:** Fixes in WebAutomation. ([b576b6f](https://github.com/GeneralBots/BotServer/commit/b576b6f54deec2dfb779c8c3018af2da001d4196))
* **basic.gblib:** Fixes in WebAutomation. ([d1b9da2](https://github.com/GeneralBots/BotServer/commit/d1b9da21bae4a7c6c1d9fae69e1063d705ae0b38))
* **basic.gblib:** GBAI automatic retrieval. ([0ef0fc0](https://github.com/GeneralBots/BotServer/commit/0ef0fc01f57e9aaa3b4bc3ccf7093b7ad0cf6548))
* **basic.gblib:** GBAI automatic retrieval. ([04e69b9](https://github.com/GeneralBots/BotServer/commit/04e69b9d99f02c285d8082f7a41ee6283ac9e8e1))
* **basic.gblib:** GBAI automatic retrieval. ([6992bf0](https://github.com/GeneralBots/BotServer/commit/6992bf0ae5e83118a05a267c4f55636f8d081dbb))
* **basic.gblib:** [#170](https://github.com/GeneralBots/BotServer/issues/170) Fixing DATEDIFF. ([4314a37](https://github.com/GeneralBots/BotServer/commit/4314a37916ae475a248a2074c89145cecf184a95))
* **basic.gblib:** [#226](https://github.com/GeneralBots/BotServer/issues/226) testing. ([97df425](https://github.com/GeneralBots/BotServer/commit/97df425566f67a836427fdda8c2a9f8011d13c89))
* **basic.gblib:** [#226](https://github.com/GeneralBots/BotServer/issues/226) testing. ([4c037a7](https://github.com/GeneralBots/BotServer/commit/4c037a72053edeeeb81491e23f2a863a05d69ef9))
* **basic.gblib:** [#227](https://github.com/GeneralBots/BotServer/issues/227) - HEAR AS FILE and GET/SET PARAM. ([bc5c1b0](https://github.com/GeneralBots/BotServer/commit/bc5c1b0ced7971109642f86bb3055d81388d9b18))
* **basic.gblib:** [#227](https://github.com/GeneralBots/BotServer/issues/227) - HEAR AS FILE and GET/SET PARAM. ([2521117](https://github.com/GeneralBots/BotServer/commit/2521117a80f84e0d7c509579355b254b39df4823))
* **basic.gblib:** [#227](https://github.com/GeneralBots/BotServer/issues/227) - HEAR AS FILE and GET/SET PARAM. ([ceded7f](https://github.com/GeneralBots/BotServer/commit/ceded7fd5532e0c66758e73d3477d258d7d03017))
* **basic.gblib:** [#227](https://github.com/GeneralBots/BotServer/issues/227) - HEAR AS FILE defining where to save, per bot. ([b64a42f](https://github.com/GeneralBots/BotServer/commit/b64a42feaccf278b463fc1bc1ad106af72531292))
* **basic.gblib:** [#227](https://github.com/GeneralBots/BotServer/issues/227) - HEAR AS FILE defining where to save, per bot. ([473cd98](https://github.com/GeneralBots/BotServer/commit/473cd9871d82238532469ba32726be34027489fc))
* **basic.gblib:** [#227](https://github.com/GeneralBots/BotServer/issues/227) - HEAR AS FILE. ([c5290b9](https://github.com/GeneralBots/BotServer/commit/c5290b91aa1b8f35a82f0a3602c9f2d1cf06bcb0))
* **basic.gblib:** [#227](https://github.com/GeneralBots/BotServer/issues/227) - HEAR AS FILE. ([42dbba4](https://github.com/GeneralBots/BotServer/commit/42dbba40845f5a2232e35218825d5bd058c6f9e1))
* **basic.gblib:** [#282](https://github.com/GeneralBots/BotServer/issues/282) Fix SSR for Bots 3.0. ([866b361](https://github.com/GeneralBots/BotServer/commit/866b361292bd7775ee8f391052721c3fba123823))
* **basic.gblib:** [#282](https://github.com/GeneralBots/BotServer/issues/282) Fix SSR for Bots 3.0. ([7f3bd7d](https://github.com/GeneralBots/BotServer/commit/7f3bd7d8fec2a3e103253f60072873b2d40e91dd))
* **basic.gblib:** [#307](https://github.com/GeneralBots/BotServer/issues/307) - Fixed user context in API. ([cbce44f](https://github.com/GeneralBots/BotServer/commit/cbce44f20d7df70743057381e63229d015da3ad7))
* **basic.gblib:** [#307](https://github.com/GeneralBots/BotServer/issues/307) - Fixed user context in API. ([4496cef](https://github.com/GeneralBots/BotServer/commit/4496cefa18ed7f909f7284aacd90b975d74e2180))
* **basic.gblib:** Adjustment in package version. ([e66c481](https://github.com/GeneralBots/BotServer/commit/e66c4817612c270c637e2323248d947784dabe1f))
* **basic.gblib:** Correct web automation 'date' use. ([4809fec](https://github.com/GeneralBots/BotServer/commit/4809fec457b29af597bc48fa5ba3d05f21cb2abf))
* **basic.gblib:** Correcting the position of Parentheses ([a925c8e](https://github.com/GeneralBots/BotServer/commit/a925c8e8bf8c2bbb166d0ece4343c56d15ceef97))
* **basic.gblib:** FILL keyword can now template images and AS IMAGE can convert a DOCX to a PNG. ([41ceedf](https://github.com/GeneralBots/BotServer/commit/41ceedfc003d142bc8bf085dc9488d61328e6743))
* **basic.gblib:** FILL keyword can now template images and AS IMAGE can convert a DOCX to a PNG. ([16bdab6](https://github.com/GeneralBots/BotServer/commit/16bdab6bcc3cb1f13de549a825ef96aaf889a9d4))
* **basic.gblib:** fix dynamic parameter generation. ([11b0ea2](https://github.com/GeneralBots/BotServer/commit/11b0ea24e696d51990d04651f1f1bfd2a785d4d9))
* **basic.gblib:** Fix getNow return. ([f288987](https://github.com/GeneralBots/BotServer/commit/f2889879a623e585b62fe22d7ee52028876186c1))
* **basic.gblib:** Fix getNow return. ([5631ce9](https://github.com/GeneralBots/BotServer/commit/5631ce961017960f20bb5c9334f254f15e88c7c2))
* **basic.gblib:** Fix getToday return. ([0e33c97](https://github.com/GeneralBots/BotServer/commit/0e33c9785196ceac5cfa2ac6cb6d1c83ab4ef478))
* **basic.gblib:** Return the last information with getTextOf ([ececb0d](https://github.com/GeneralBots/BotServer/commit/ececb0d2ea89a9ed021fc1d2d8dea9688b3bedee))
* **basic.gblib:** Upgrade to https://github.com/vasyas/push-rpc from WS to HTTPS. ([5534b41](https://github.com/GeneralBots/BotServer/commit/5534b416da906be8953ff18ba52807964163760a))
* **basic.gblib:** Upgrade to https://github.com/vasyas/push-rpc from WS to HTTPS. ([f3c756b](https://github.com/GeneralBots/BotServer/commit/f3c756b01576ebbe5266ed9699e6c06ed3c05263))
* **basic.gblib:** Upgrade to https://github.com/vasyas/push-rpc. ([f3b7c1d](https://github.com/GeneralBots/BotServer/commit/f3b7c1d77e72fa9deb173b47777ed2cbf5bae2fc))
* **basic.gblib:** WA page bug removal. ([d902e14](https://github.com/GeneralBots/BotServer/commit/d902e14f78913626d3f8ac758a3b98776d1589b5))
* **core.gbapp:** [#195](https://github.com/GeneralBots/BotServer/issues/195) bind call to provide min context for uploads. ([b12a462](https://github.com/GeneralBots/BotServer/commit/b12a462e3e789e63691dcc80d83002e2fe18ed74))
* **core.gbapp:** [#195](https://github.com/GeneralBots/BotServer/issues/195) bind call to provide min context for uploads. ([b2f2c73](https://github.com/GeneralBots/BotServer/commit/b2f2c732aa1a5887a163fd510539e1d0c5223667))
* **core.gbapp:** [#336](https://github.com/GeneralBots/BotServer/issues/336) timeout in API fixed. ([0c44361](https://github.com/GeneralBots/BotServer/commit/0c443618a6551f35af1a0ea6e9fc5c560815e188))
* **core.gbapp:** [#336](https://github.com/GeneralBots/BotServer/issues/336) timeout in API fixed. ([eb6800e](https://github.com/GeneralBots/BotServer/commit/eb6800edce75bb0687fa446fb515a508a1b053f6))
* **core.gbapp:** [#341](https://github.com/GeneralBots/BotServer/issues/341) fix regarding COPY files. ([a292b77](https://github.com/GeneralBots/BotServer/commit/a292b7711668fa66875bc6eb7d9c6f74943ebabf))
* **core.gbapp:** [#344](https://github.com/GeneralBots/BotServer/issues/344) fix regarding SET FILTER keyword. ([db7ed36](https://github.com/GeneralBots/BotServer/commit/db7ed36707e567fa6801c748d4a28ebca76549c4))
* **core.gbapp:** /logs working again. ([d08e11f](https://github.com/GeneralBots/BotServer/commit/d08e11fef43275d78cbf339508256acd46f2055f))
* **core.gbapp:** fixed the use of GBLogEx to create GuaribasLog. ([2cb866b](https://github.com/GeneralBots/BotServer/commit/2cb866bc2f1f8a5157eddfdecf974e3a31f1280d))
* **core.gbapp:** Upload now saves the file in correct folder. ([e31cd4d](https://github.com/GeneralBots/BotServer/commit/e31cd4d819e5084a7cbbdb76ab5b4f59563ac822))
* **core.gblib:** SSR fixing about botId. ([799715a](https://github.com/GeneralBots/BotServer/commit/799715a9ee77606afcbcaf72a545d0ce473bd5e9))
* **default.gbui:** [#153](https://github.com/GeneralBots/BotServer/issues/153) fix. ([b6f6a50](https://github.com/GeneralBots/BotServer/commit/b6f6a50f136617948add923e0517988f67bfab31))
* **default.gbui:** [#263](https://github.com/GeneralBots/BotServer/issues/263) Loads menu.xlsx as subject.json alternative. ([00434bd](https://github.com/GeneralBots/BotServer/commit/00434bd788fc7ac6a09ed07844120dfb4b871e24))
* **default.gbui:** [#263](https://github.com/GeneralBots/BotServer/issues/263) Loads menu.xlsx as subject.json alternative. ([241596b](https://github.com/GeneralBots/BotServer/commit/241596b51f542b17ceb0b6b465e71a0b86c7f39c))
* **dependencies:** Whatsapp-web.js to "1.20.0". ([1857b51](https://github.com/GeneralBots/BotServer/commit/1857b51cf272120d6b7fbb04ca23cde455be2361))
* **gbapp\AskDialog:** Supress Echo Nothing_else ([4ee3012](https://github.com/GeneralBots/BotServer/commit/4ee30120b79d2bd8dd933accc1d2326a7b16d013))
* **gbapp\AskDialog.ts:** Supress anything_else ([6d8feca](https://github.com/GeneralBots/BotServer/commit/6d8feca8719874179a3a98ba4cbf976c2d3361f7))
* **kb.gbapp:** [#276](https://github.com/GeneralBots/BotServer/issues/276) use of NLP.js upgrade to v4. ([ec1c38f](https://github.com/GeneralBots/BotServer/commit/ec1c38f3783da8a67958c28c815948799f757d1f))
* **kb.gbapp:** [#276](https://github.com/GeneralBots/BotServer/issues/276) use of NLP.js upgrade to v4. ([5c48d39](https://github.com/GeneralBots/BotServer/commit/5c48d396207fae7ca74abc490250d6b7bac310da))
* **kb.gbapp:** [#297](https://github.com/GeneralBots/BotServer/issues/297) Spellchecker fixed after MSFT changes in service. ([80853f0](https://github.com/GeneralBots/BotServer/commit/80853f014c1e3a1c8c0cd1a8cdb1685f98f738b9))
* **kb.gbapp:** [#298](https://github.com/GeneralBots/BotServer/issues/298) search fix and params. ([78778da](https://github.com/GeneralBots/BotServer/commit/78778da3a7ca8e4045ec4367ac03678166c52d18))
* **kb.gbapp:** [#332](https://github.com/GeneralBots/BotServer/issues/332) fix STS. ([01cf280](https://github.com/GeneralBots/BotServer/commit/01cf2803a0f3a68528cb5cfd6750621056d5ad7e))
* **kb.gbapp:** /publish review, error handling improved and clean up. ([c94228c](https://github.com/GeneralBots/BotServer/commit/c94228cd8db9ac4e9a0b5df1f1acdb31b168c768))
* **kb.gbapp:** Dialog now are finished OK. ([a969abb](https://github.com/GeneralBots/BotServer/commit/a969abbcc44ca93fb2fb349e4ca67043f5c43f5f))
* **kb.gbapp:** Dialog now are finished OK. ([a7a1d47](https://github.com/GeneralBots/BotServer/commit/a7a1d47c24b4af4c0b1a62b4b06eaba23386faed))
* **kb.gbapp:** Download only if not in cache optimization. ([b30e016](https://github.com/GeneralBots/BotServer/commit/b30e0160c434ac5fb45425d9a80a45020c7955f5))
* **security.gblib:** Params support in users. ([82a9ba9](https://github.com/GeneralBots/BotServer/commit/82a9ba983ecc603f67a23775385e070b92881ddd))
* **whatsapp.gblib:** [#262](https://github.com/GeneralBots/BotServer/issues/262) wrong key value. ([565ad4a](https://github.com/GeneralBots/BotServer/commit/565ad4ab6d008454a7e008c568a0a78af06fd7e0))
* **whatsapp.gblib:** [#288](https://github.com/GeneralBots/BotServer/issues/288) fix list and buttons. ([6f62453](https://github.com/GeneralBots/BotServer/commit/6f62453f4e1f813e4686bece6419f42b6b73bf18))
* **whatsapp.gblib:** [#288](https://github.com/GeneralBots/BotServer/issues/288) unify puppteer params with GBSSR. ([b96a78e](https://github.com/GeneralBots/BotServer/commit/b96a78e810da07871dc91d6a6a017c21cb1440be))
* **whatsapp.gblib:** [#309](https://github.com/GeneralBots/BotServer/issues/309) unify channel detection. ([cfe3ab3](https://github.com/GeneralBots/BotServer/commit/cfe3ab30f47af4f5c058c1de4c7707140fbc2312))
* **Whatsapp.gblib:** fix "whatsapp-web.js" compatibility issues. ([cd97189](https://github.com/GeneralBots/BotServer/commit/cd97189477c452d44e9584f0152950b2aff23b88))
### Features
* **whatsapp.gblib:** add 'graphapi' option. ([ce84053](https://github.com/GeneralBots/BotServer/commit/ce84053d95b8ff69d0175a1da70ec89921493459))
## [2.3.9](https://github.com/GeneralBots/BotServer/compare/2.3.8...2.3.9) (2023-01-29)
### Bug Fixes
* **basic.gblib:** [#326](https://github.com/GeneralBots/BotServer/issues/326) align JS and BASIC map file. ([b572cc9](https://github.com/GeneralBots/BotServer/commit/b572cc9b8db624f4d686a9cb934cb5bbd8e41cc1))
## [2.3.8](https://github.com/GeneralBots/BotServer/compare/2.3.7...2.3.8) (2023-01-26)
### Bug Fixes
* **basic.gblib:** OPEN keyword fix. Magic number removal. ([e1c389c](https://github.com/GeneralBots/BotServer/commit/e1c389cbd03b1245deb1d2f37a415e371ed67481))
* **basic.gblib:** OPEN keyword fix. Magic number removal. ([fe2af84](https://github.com/GeneralBots/BotServer/commit/fe2af84b21d49e2d87247dd4cb0b078371c3dfa1))
## [2.3.7](https://github.com/GeneralBots/BotServer/compare/2.3.6...2.3.7) (2023-01-25)
### Bug Fixes
* **systemkeywords.ts:** injected security context inside systemkeywords.ts ([8a895d3](https://github.com/GeneralBots/BotServer/commit/8a895d3da1f9a2cfee680f09e79ea999cdf3db8d))
## [2.3.6](https://github.com/GeneralBots/BotServer/compare/2.3.5...2.3.6) (2023-01-25)
### Bug Fixes
* **dialogkeywords.ts:** injected security context inside DialogKeywords ([81953d7](https://github.com/GeneralBots/BotServer/commit/81953d7d9f48407968e2d35e686347f6f6005a0d))
## [2.3.5](https://github.com/GeneralBots/BotServer/compare/2.3.4...2.3.5) (2023-01-19)
### Bug Fixes
* **basic.gblib:** executionid and changed to pid and security context for HEAR([#322](https://github.com/GeneralBots/BotServer/issues/322)). ([9820bb3](https://github.com/GeneralBots/BotServer/commit/9820bb3f7a4905de34eb1d3fa002c8a4b098027c))
## [2.3.4](https://github.com/GeneralBots/BotServer/compare/2.3.3...2.3.4) (2023-01-19)
### Bug Fixes
* **basic.gblib:** executionid and changed to pid and security context for HEAR. ([1063739](https://github.com/GeneralBots/BotServer/commit/1063739cbeab3ebbc1210b1962f6275d619debdd))
## [2.3.3](https://github.com/GeneralBots/BotServer/compare/2.3.2...2.3.3) (2023-01-17)
### Bug Fixes
* **basic.gblib:** Refactoring processInfo into all methods. ([50d3fcc](https://github.com/GeneralBots/BotServer/commit/50d3fccd0dcb593662649d5cc1443017eb11227f))
## [2.3.2](https://github.com/GeneralBots/BotServer/compare/2.3.1...2.3.2) (2023-01-13)
### Bug Fixes
* **systemkeywords.ts:** executionid, and changed to pid ([274db0d](https://github.com/GeneralBots/BotServer/commit/274db0d389f6d145355ca38d9143da4b1b1694fa))
## [2.3.1](https://github.com/GeneralBots/BotServer/compare/2.3.0...2.3.1) (2023-01-13)
### Bug Fixes
* **gbminservice.ts:** swagger-client migration from 2.0 to 3.0 ([552e8b1](https://github.com/GeneralBots/BotServer/commit/552e8b14c41aa01c538e9eda1bb6666adb098b38))
# [2.3.0](https://github.com/GeneralBots/BotServer/compare/2.2.0...2.3.0) (2023-01-10)
### Features
* **systemkeywords.ts:** introducing executionid feature in api ([a65a82d](https://github.com/GeneralBots/BotServer/commit/a65a82dd8a8805a4e90dfb6d7b72a49fcc611419))
# [2.2.0](https://github.com/GeneralBots/BotServer/compare/2.1.5...2.2.0) (2023-01-10)
### Features
* **systemkeywords.ts:** introducing executionid feature in api ([52dea44](https://github.com/GeneralBots/BotServer/commit/52dea442d5fc00cebcc50ca0cb28ee4f8c12c4db))
## [2.1.5](https://github.com/GeneralBots/BotServer/compare/2.1.4...2.1.5) (2023-01-05)
### Bug Fixes
* **gbvmservices.ts:** Update ([c62d372](https://github.com/GeneralBots/BotServer/commit/c62d372ec6fdfd46bd7b1c48f9d3212f58d8c5e6))
## [2.1.4](https://github.com/GeneralBots/BotServer/compare/2.1.3...2.1.4) (2023-01-05)
### Bug Fixes
* **tscompiler.ts:** Update typescript import. ([f4209eb](https://github.com/GeneralBots/BotServer/commit/f4209eb4f0b89905fa463dbfe7354532b58a933e))
## [2.1.3](https://github.com/GeneralBots/BotServer/compare/2.1.2...2.1.3) (2023-01-04)
### Bug Fixes
* **AzureDeployerService:** accessToken ([07d9cf6](https://github.com/GeneralBots/BotServer/commit/07d9cf67dbf96afe1b6811dc80c20c34e43794b7))
* **azuredeployerservice.gbapp:** Update of password generator libs. ([57461ee](https://github.com/GeneralBots/BotServer/commit/57461ee0060e9e4224d674f07e96008419ff57b6))
* **basic.gblib:** Threat multiple spaces as one. ([0721a3f](https://github.com/GeneralBots/BotServer/commit/0721a3fa78776259f7b238d180ee55c823787237))
* **basic.gblib:** Threat multiple spaces as one. ([ac5911e](https://github.com/GeneralBots/BotServer/commit/ac5911ee02cc6e844d7a35788e962b8cef7a037e))
## [2.1.2](https://github.com/GeneralBots/BotServer/compare/2.1.1...2.1.2) (2023-01-02)
### Bug Fixes
* **azuredeployer.gbapp:** createInstance free ([1b41551](https://github.com/GeneralBots/BotServer/commit/1b41551ac553f7340f29a3f17214499084752296))
## [2.1.1](https://github.com/GeneralBots/BotServer/compare/2.1.0...2.1.1) (2023-01-01)
### Bug Fixes
* **admin.gbapp:** Fixing token generation issues. ([8fb35c2](https://github.com/GeneralBots/BotServer/commit/8fb35c2c2d4798b819e38bdf7c12ec5fe59d7f64))
* **admin.gbapp:** Fixing token generation issues. ([2a848f4](https://github.com/GeneralBots/BotServer/commit/2a848f4ea6b7fb3359bd0f9db9a9bdf167544cab))
* **admin.gbapp:** Fixing token generation issues. ([3de3bd6](https://github.com/GeneralBots/BotServer/commit/3de3bd6c01aaa80e38b57cdef63f80bf67fb785d))
* **all:** Finishing renaming to main branch. ([16d2101](https://github.com/GeneralBots/BotServer/commit/16d21019a081151db21e4726cb5c2eac3326336d))
* **all:** Finishing renaming to main branch. ([cac92cc](https://github.com/GeneralBots/BotServer/commit/cac92cca22a03b67326993f42e528900fa55a263))
* **all:** Finishing renaming to main branch. ([bff8bcf](https://github.com/GeneralBots/BotServer/commit/bff8bcf7e5fef6499f180d1a1bc9e57f131d6299))
* **all:** Finishing renaming to main branch. ([07f173e](https://github.com/GeneralBots/BotServer/commit/07f173ec7302a77945abc0bcd772af5ccd6c0761))
* **all:** Fixing bugs of 3.0 ([39eff93](https://github.com/GeneralBots/BotServer/commit/39eff935283883dcbdfcb5a38c599bd3d7153cd5))
* **all:** TODO items removed or moved to ALM. ([7348c54](https://github.com/GeneralBots/BotServer/commit/7348c5489433eb82a44af12b4a8f4e76f01998b4))
* **basic.gblib:** Renaming branch to main. ([c6d9662](https://github.com/GeneralBots/BotServer/commit/c6d96621455039a822f19746a1d8664c79e7ca28))
* **basic.gblib:** Renaming branch to main. ([203416c](https://github.com/GeneralBots/BotServer/commit/203416c47737c1a4cfb5e5110b4878a6534ecdcf))
* **basic.gblib:** TODO removal. ([2b08965](https://github.com/GeneralBots/BotServer/commit/2b0896521e537e22858d9d43b019bc95079af6b5))
* **basic.gblib:** TODO removal. ([c0133a8](https://github.com/GeneralBots/BotServer/commit/c0133a89606336824b93e453b60fce2630815c67))
* **basic.gblib:** TODO removal. ([9ad1d56](https://github.com/GeneralBots/BotServer/commit/9ad1d5693e954e88675c7e0605b6f64f2900f9d7))
# [2.1.0](https://github.com/GeneralBots/BotServer/compare/2.0.182...2.1.0) (2022-12-23)
### Features
* **all:** Cleaning package manager files. ([0cb406a](https://github.com/GeneralBots/BotServer/commit/0cb406ab7923761ad7476ef694d5079af059244c))
* **all:** Token retrieve optimized. ([6eb9d6c](https://github.com/GeneralBots/BotServer/commit/6eb9d6cbf466a18283285d6775e08aa488632762))
## [2.0.182](https://github.com/GeneralBots/BotServer/compare/2.0.181...2.0.182) (2022-12-23)
### Bug Fixes
* **all:** Node version info retrieval automated. ([9cbd8c1](https://github.com/GeneralBots/BotServer/commit/9cbd8c17de674547ed24a189084e8b99588ac69b))
## [2.0.181](https://github.com/GeneralBots/BotServer/compare/2.0.180...2.0.181) (2022-12-22)
### Bug Fixes
* **admin.gbapp:** .gbapp List param added to .gbot. ([48a1aa4](https://github.com/GeneralBots/BotServer/commit/48a1aa4d4695b480b6724f6c59830cfe3fa45f8c))
## [2.0.180](https://github.com/GeneralBots/BotServer/compare/2.0.179...2.0.180) (2022-12-16)
### Bug Fixes
* **all:** CI fixing. ([e4fc246](https://github.com/GeneralBots/BotServer/commit/e4fc246b252aaebd8da25b9fa6c642ad9d8d278d))
* **all:** CI fixing. ([fa32b51](https://github.com/GeneralBots/BotServer/commit/fa32b510d94a94a687a23cb72e74aeca8e122d54))
* **all:** fetch calls replaces request packages. ([ea6c721](https://github.com/GeneralBots/BotServer/commit/ea6c721cb53f1eaa4ab8f4b4a10ecf7329a473d6))
* **all:** Fixing [#294](https://github.com/GeneralBots/BotServer/issues/294). ([25ce766](https://github.com/GeneralBots/BotServer/commit/25ce766820ecd2a98e2fca9e1648ac41fbe76d38))
* **all:** Fixing bugs of 3.0 ([d09265e](https://github.com/GeneralBots/BotServer/commit/d09265e023b8b3ac746ba623cc0613c311f4c49c))
* **all:** Fixing bugs of 3.0 ([6cad39d](https://github.com/GeneralBots/BotServer/commit/6cad39d8c70e9827c41ea4afedefe8fa330c0295))
* **all:** Fixing bugs of 3.0. ([d180753](https://github.com/GeneralBots/BotServer/commit/d180753253a249958340dbdfeef94a1442e58675))
* **all:** Fixing bugs of 3.0. ([83d98c7](https://github.com/GeneralBots/BotServer/commit/83d98c794fe24c420949e355b438aab9f2f46fad))
* **all:** Fixing bugs of 3.0. ([bf705c7](https://github.com/GeneralBots/BotServer/commit/bf705c730b2bf7565e43003d4299513d1819ef38))
* **all:** Fixing CI integration bugs. ([0ce6bc5](https://github.com/GeneralBots/BotServer/commit/0ce6bc5d8c0b68f4079b64bf6b8916bb426a1b52))
* **all:** Fixing CI integration bugs. ([9c44e38](https://github.com/GeneralBots/BotServer/commit/9c44e385605ced77185f9b96c6f2cefb61559465))
* **all:** Fixing CI integration bugs. ([9acb055](https://github.com/GeneralBots/BotServer/commit/9acb05567a6991334c6586db4dad888cfb84b050))
* **all:** Fixing CI integration bugs. ([c323f5a](https://github.com/GeneralBots/BotServer/commit/c323f5a3e875448819b3d61e60c9f5b20d79aabd))
* **all:** Fixing CI integration bugs. ([b2c1dda](https://github.com/GeneralBots/BotServer/commit/b2c1dda2b2635ef808976593ec4df542fa292bb2))
* **all:** Fixing CI integration bugs. ([ae29dda](https://github.com/GeneralBots/BotServer/commit/ae29dda0fa027a9c59c3b6ffe57a2e9752c016ec))
* **all:** Fixing CI integration bugs. ([0ecac1a](https://github.com/GeneralBots/BotServer/commit/0ecac1a4b52c3dbafb1cfb943be1b6f77c1fc058))
* **all:** Fixing CI integration bugs. ([9f88210](https://github.com/GeneralBots/BotServer/commit/9f8821089a1a6f22505539ae95af3b378dfe59ae))
* **all:** Removal of warnings and erros after pkg update. ([663c85e](https://github.com/GeneralBots/BotServer/commit/663c85e7c51ce0e2d3f31e8cbe62fcb4039ca8f6))
* **all:** Update of arm packages and token usage. ([179b20a](https://github.com/GeneralBots/BotServer/commit/179b20a248c245e7b85635c4b3080b34ffa7c02b))
* **core.gbapp:** Lint of all. ([4a2f8b7](https://github.com/GeneralBots/BotServer/commit/4a2f8b7b43cb7550d11965719459d3fb336739ca))
* **core.gbapp:** Update of all packages and nodejs to 19.1.0. ([f8d2cd8](https://github.com/GeneralBots/BotServer/commit/f8d2cd895a31c41b7cdc4f688dd8dcbec6f56317))
* **core.gbapp:** Update of all packages and nodejs to 19.1.0. ([a315d21](https://github.com/GeneralBots/BotServer/commit/a315d21cfe3775de745910764bf60bff76043053))
* **core.gbapp:** Update of properties modifier with declare. ([21df92e](https://github.com/GeneralBots/BotServer/commit/21df92e280186b87c457e226b6f92d80bd0efa34))
* **core.gbapp:** WARNINGS.md ([f35a2ac](https://github.com/GeneralBots/BotServer/commit/f35a2aceba957339c607d22743c02f7690bd3a97))
## [2.0.179](https://github.com/GeneralBots/BotServer/compare/2.0.178...2.0.179) (2022-10-22)
### Bug Fixes
* **whatsapp.gblib:** FIX on HEAR ON after provider change. ([c66f9bf](https://github.com/GeneralBots/BotServer/commit/c66f9bfe041875bd2a528aef8eae884616de2e6b))
* **whatsapp.gblib:** FIX on HEAR ON after provider change. ([1d8e7e1](https://github.com/GeneralBots/BotServer/commit/1d8e7e1763c6fce6e7bad83f6ae036f17f3141f9))
* **whatsapp.gblib:** FIX on HEAR ON after provider change. ([916794f](https://github.com/GeneralBots/BotServer/commit/916794fc154cc16e1dce2dd7d7c523b25699e8d8))
## [2.0.178](https://github.com/GeneralBots/BotServer/compare/2.0.177...2.0.178) (2022-10-09)
### Bug Fixes
* **whatsapp.gblib:** SEND FILE and WPP providers. ([3f7e024](https://github.com/GeneralBots/BotServer/commit/3f7e024b58660d0be0734dc5f3a3cd7884df3727))
## [2.0.177](https://github.com/GeneralBots/BotServer/compare/2.0.176...2.0.177) (2022-10-04)
### Bug Fixes
* **whatsapp.gblib:** SEND FILE and WPP providers. ([c6de0f0](https://github.com/GeneralBots/BotServer/commit/c6de0f0fa1cf626bbe7ec86615b7283fafe2c946))
## [2.0.176](https://github.com/GeneralBots/BotServer/compare/2.0.175...2.0.176) (2022-09-12)
### Bug Fixes
* **basic.gblib:** SCREENSHOT keyword. ([0f1ee22](https://github.com/GeneralBots/BotServer/commit/0f1ee22467577c4237992d5d7bd3af8efd1ca300))
## [2.0.175](https://github.com/GeneralBots/BotServer/compare/2.0.174...2.0.175) (2022-09-04)
### Bug Fixes
* **whatsapp.gblib:** SEND FILE and WPP providers. ([05260c0](https://github.com/GeneralBots/BotServer/commit/05260c0ee5cada86bae5dd30db48e8c65c3ed53e))
* **whatsapp.gblib:** SEND FILE and WPP providers. ([5261691](https://github.com/GeneralBots/BotServer/commit/5261691ba94708a9d75d9155898a13cf55137733))
## [2.0.174](https://github.com/GeneralBots/BotServer/compare/2.0.173...2.0.174) (2022-09-02)
### Bug Fixes
* **whatsapp.gblib:** .gbapp message subprocessing. ([c14a766](https://github.com/GeneralBots/BotServer/commit/c14a766047ec1cad9e52104a52a10afb93b8fd71))
## [2.0.173](https://github.com/GeneralBots/BotServer/compare/2.0.172...2.0.173) (2022-09-01)
### Bug Fixes
* **whatsapp.gblib:** .gbapp message subprocessing. ([e72b030](https://github.com/GeneralBots/BotServer/commit/e72b030e9554c6d442de643f73e9a3f19460973f))
* **whatsapp.gblib:** .gbapp message subprocessing. ([9c00ddd](https://github.com/GeneralBots/BotServer/commit/9c00dddd78eeebe6ef8b156f3cc9a044c7756b1c))
## [2.0.172](https://github.com/GeneralBots/BotServer/compare/2.0.171...2.0.172) (2022-09-01)
### Bug Fixes
* **whatsapp.gblib:** .gbapp message subprocessing. ([aeaaddc](https://github.com/GeneralBots/BotServer/commit/aeaaddc8ab53ae313c3aca687ada2fd5504398c5))
## [2.0.171](https://github.com/GeneralBots/BotServer/compare/2.0.170...2.0.171) (2022-09-01)
### Bug Fixes
* **whatsapp.gblib:** .gbapp message subprocessing. ([a5073e0](https://github.com/GeneralBots/BotServer/commit/a5073e020eba72c3b3057d4e154e9b89b26e0cf0))
## [2.0.170](https://github.com/GeneralBots/BotServer/compare/2.0.169...2.0.170) (2022-08-29)
### Bug Fixes
* **basic.gblib:** Impersonated SET MAX LINES. ([e9211d9](https://github.com/GeneralBots/BotServer/commit/e9211d92ac774bfdda383bb404eb0f1d4794ae6b))
## [2.0.169](https://github.com/GeneralBots/BotServer/compare/2.0.168...2.0.169) (2022-08-28)
### Bug Fixes
* **basic.gblib:** Impersonated SET MAX LINES. ([f058a4a](https://github.com/GeneralBots/BotServer/commit/f058a4a0c6cbdc63a6c1ba3b857ccd4c1f7db8a2))
* **basic.gblib:** Impersonated SET MAX LINES. ([8f373f3](https://github.com/GeneralBots/BotServer/commit/8f373f3691e029e415f280b81aa780a50dfc5b91))
## [2.0.168](https://github.com/GeneralBots/BotServer/compare/2.0.167...2.0.168) (2022-08-28)
### Bug Fixes
* **core.gbapp:** More information on bot creation. ([7e7fb27](https://github.com/GeneralBots/BotServer/commit/7e7fb277d7d530026e1df9df78dfc02f3b43a418))
* **core.gbapp:** More information on bot creation. ([e07152b](https://github.com/GeneralBots/BotServer/commit/e07152bc07beae48cc1217832951923fc6f0bc12))
## [2.0.167](https://github.com/GeneralBots/BotServer/compare/2.0.166...2.0.167) (2022-08-26)
### Bug Fixes
* **kb.gbapp:** Skips blank answers lines. ([004cc8f](https://github.com/GeneralBots/BotServer/commit/004cc8fef586c81de55181689b29a502fd0784a1))
## [2.0.166](https://github.com/GeneralBots/BotServer/compare/2.0.165...2.0.166) (2022-08-26)
### Bug Fixes
* **kb.gbapp:** Skips blank answers lines. ([796a412](https://github.com/GeneralBots/BotServer/commit/796a412e326982cd463863319931621301358079))
## [2.0.165](https://github.com/GeneralBots/BotServer/compare/2.0.164...2.0.165) (2022-08-26)
### Bug Fixes
* **kb.gbapp:** Skips blank answers lines. ([143e425](https://github.com/GeneralBots/BotServer/commit/143e425bfc649478e72ad6d80ccddb7e1c70f56b))
## [2.0.164](https://github.com/GeneralBots/BotServer/compare/2.0.163...2.0.164) (2022-08-26)
### Bug Fixes
* **kb.gbapp:** Skips blank answers lines. ([fa63a3e](https://github.com/GeneralBots/BotServer/commit/fa63a3eb6fc01e903ce42bf70f07ee41fa841ed6))
## [2.0.163](https://github.com/GeneralBots/BotServer/compare/2.0.162...2.0.163) (2022-08-26)
### Bug Fixes
* **kb.gbapp:** Skips blank answers lines. ([46fb424](https://github.com/GeneralBots/BotServer/commit/46fb4244c71c982bebcc9c32ae42ff04405672db))
## [2.0.162](https://github.com/GeneralBots/BotServer/compare/2.0.161...2.0.162) (2022-08-26)
### Bug Fixes
* **core.gbapp:** Translator off for two char phrases. ([bd20312](https://github.com/GeneralBots/BotServer/commit/bd20312bad29c10dbdb9ecebddd69fa845af1892))
## [2.0.161](https://github.com/GeneralBots/BotServer/compare/2.0.160...2.0.161) (2022-08-06)
### Bug Fixes
* **whatsapp.gblib:** SEND FILE sending bug. ([7eeadfa](https://github.com/GeneralBots/BotServer/commit/7eeadfa92deea7e61c277c7a75c1d0b49d7dca5c))
## [2.0.160](https://github.com/GeneralBots/BotServer/compare/2.0.159...2.0.160) (2022-08-06)
### Bug Fixes
* **whatsapp.gblib:** SEND FILE sending bug. ([08607e4](https://github.com/GeneralBots/BotServer/commit/08607e49bb41643f98e49759d20b33699be47251))
* **whatsapp.gblib:** SEND FILE sending bug. ([61183a3](https://github.com/GeneralBots/BotServer/commit/61183a365440c183a46620b8a1921937182c29e2))
* **whatsapp.gblib:** SEND FILE sending bug. ([ae96a4f](https://github.com/GeneralBots/BotServer/commit/ae96a4f1235dfab29ee7c21ddab9997cbbe7e90f))
## [2.0.159](https://github.com/GeneralBots/BotServer/compare/2.0.158...2.0.159) (2022-08-06)
### Bug Fixes
* **whatsapp.gblib:** SEND FILE sending bug. ([9cb2852](https://github.com/GeneralBots/BotServer/commit/9cb285214c37e44bacc01b6a60d0847b8d545e3a))
## [2.0.158](https://github.com/GeneralBots/BotServer/compare/2.0.157...2.0.158) (2022-08-05)
### Bug Fixes
* **whatsapp.gblib:** SEND FILE sending bug. ([bcc14de](https://github.com/GeneralBots/BotServer/commit/bcc14def9866ce23ac7cdced793ba5d784a37a4b))
## [2.0.157](https://github.com/GeneralBots/BotServer/compare/2.0.156...2.0.157) (2022-08-05)
### Bug Fixes
* **whatsapp.gblib:** SEND FILE sending bug. ([8194c79](https://github.com/GeneralBots/BotServer/commit/8194c798281d6d8b80e4d1f04dcf47ba4a6538fc))
## [2.0.156](https://github.com/GeneralBots/BotServer/compare/2.0.155...2.0.156) (2022-07-06)
### Bug Fixes
* **all:** CHART and IMAGE from GET HTTP calls. ([a3e99bb](https://github.com/GeneralBots/BotServer/commit/a3e99bb5533fb07f613e2fe1264045ff10880f3e))
## [2.0.155](https://github.com/GeneralBots/BotServer/compare/2.0.154...2.0.155) (2022-07-06)
### Bug Fixes
* **all:** CHART and IMAGE from GET HTTP calls. ([cf62b10](https://github.com/GeneralBots/BotServer/commit/cf62b101969bdb7dc9c816b45b43e8e55b8287ee))
## [2.0.154](https://github.com/GeneralBots/BotServer/compare/2.0.153...2.0.154) (2022-07-01) ## [2.0.154](https://github.com/GeneralBots/BotServer/compare/2.0.153...2.0.154) (2022-07-01)

48
CODE_OF_CONDUCT-pt-br.md Normal file
View file

@ -0,0 +1,48 @@
# Código de Conduta do Convênio do Colaborador
## Nosso Compromisso
No interesse de promover um ambiente aberto e acolhedor, nós, como colaboradores e mantenedores, nos comprometemos a tornar a participação em nosso projeto e em nossa comunidade uma experiência livre de assédio para todos, independentemente de idade, raça, etnia, origem nacional, ascendência, sexo, sexo identidade ou apresentação, orientação sexual, aparência física, afiliação religiosa, credo, estado civil ou familiar, não tolerará abuso ou assédio discriminatório ou sexual contra qualquer pessoa durante quaisquer atividades relacionadas à conferência, incluindo, entre outros, envio, revisão, tutoriais, oficinas ou eventos sociais. O abuso inclui qualquer ação dirigida a um indivíduo que (a) interfira substancialmente na participação dessa pessoa ou (b) faça com que essa pessoa tema por sua segurança pessoal. Isso inclui ameaças, intimidação, intimidação, perseguição ou outros tipos de abuso. Assédio discriminatório inclui qualquer conduta que discrimine ou denigra um indivíduo com base em idade, raça, etnia, nacionalidade, ascendência, gênero, identidade ou apresentação de gênero, orientação sexual, aparência física, afiliação religiosa, credo, estado civil ou familiar, deficiência , características pessoais ou quaisquer outros fatores diferenciadores, bem como qualquer outra característica protegida por lei no local onde ocorre a atividade da conferência. Assédio sexual inclui (mas não se limita a) investidas sexuais indesejadas repetidas, pedidos de favores sexuais ou outra conduta verbal ou física de natureza sexual, deficiência, características pessoais ou quaisquer outros fatores de diferenciação, bem como qualquer outra característica protegida por lei no local onde a atividade ocorre.
## Nossos Padrões
Exemplos de comportamento que contribuem para criar um ambiente positivo incluem:
* Usando linguagem padrão (sem expressões idiomáticas), acolhedora e inclusiva
* Ser respeitoso com os diferentes pontos de vista e experiências
* Aceitar graciosamente críticas construtivas
* Focar no que é melhor para a comunidade
* Mostrar empatia para com outros membros da comunidade
* Escrever trechos gerais de código para que possam ser amplamente utilizados.
Exemplos de comportamento inaceitável por parte dos participantes incluem:
* O uso de linguagem ou imagens sexualizadas e atenção ou avanços sexuais indesejados
* Trolling, comentários insultuosos/depreciativos e ataques pessoais ou políticos
* Assédio (harassment) público ou privado / perseguição (stalking) / intimidação (bullying) / mobbing (group bullying or gang stalking)
* Publicar informações privadas de outras pessoas, como endereço físico ou eletrônico, sem permissão explícita
* Outra conduta que possa ser razoavelmente considerada inadequada em um ambiente profissional
* Chamar uma pessoa de nome diferente do declarado pela pessoa
## Nossas responsabilidades
Os mantenedores do projeto são responsáveis por esclarecer os padrões de comportamento aceitável e devem tomar ações corretivas apropriadas e justas em resposta a quaisquer instâncias de comportamento inaceitável.
Os mantenedores do projeto têm o direito e a responsabilidade de remover, editar ou rejeitar comentários, confirmações, códigos, edições wiki, problemas e outras contribuições que não estejam alinhadas com este Código de Conduta, ou banir temporária ou permanentemente qualquer colaborador por outros comportamentos que eles considerem inapropriado, ameaçador, ofensivo ou prejudicial.
## Escopo
Este Código de Conduta se aplica tanto em espaços do projeto quanto em espaços públicos quando um indivíduo representa o projeto ou sua comunidade. Exemplos de representação de um projeto ou comunidade incluem o uso de um endereço de e-mail oficial do projeto, postagem por meio de uma conta de mídia social oficial ou atuação como um representante nomeado em um evento online ou offline. A representação de um projeto pode ser posteriormente definida e esclarecida pelos mantenedores do projeto.
## Aplicação
Instâncias de comportamento abusivo, de assédio ou inaceitável podem ser relatadas entrando em contato com a equipe de segurança da Pragmatismo em c. A equipe do projeto analisará e investigará todas as reclamações e responderá da maneira que julgar apropriada às circunstâncias. A equipe do projeto é obrigada a manter a confidencialidade em relação ao relator de um incidente. Mais detalhes sobre políticas de execução específicas podem ser publicados separadamente.
Os mantenedores do projeto que não seguirem ou aplicarem o Código de Conduta de boa fé podem enfrentar repercussões temporárias ou permanentes conforme determinado por outros membros da liderança do projeto.
## Atribuição
Este Código de Conduta foi adaptado do [Acordo do Colaborador][homepage], versão 1.4, disponível em [http://contributor-covenant.org/version/1/4][version] e Código de Conduta ICAPS.
[página inicial]: http://contributor-covenant.org
[versão]: http://contributor-covenant.org/version/1/4/

View file

@ -2,7 +2,7 @@
## Our Pledge ## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, race, ethnicity, national origin, ancestry, gender, gender identity or presentation, sexual orientation, physical appearance, religious affiliation, creed, marital or familial status, will not tolerate abuse or discriminatory or sexual harassment toward any person during any conference-related activities, including but not limited to submission, reviewing, tutorials, workshops, or social events. Abuse includes any action directed at an individual that (a) interferes substantially with that persons participation or (b) causes that person to fear for their personal safety. This includes threats, intimidation, bullying, stalking, or other types of abuse. Discriminatory harassment includes any conduct that discriminates or denigrates an individual on the basis of age, race, ethnicity, national origin, ancestry, gender, gender identity or presentation, sexual orientation, physical appearance, religious affiliation, creed, marital or familial status, disability, personal characteristics, or any other differentiating factors, as well as any other characteristic protected by law in the location where conference activity takes place. Sexual harassment includes (but is not limited to) repeated unwelcome sexual advances, requests for sexual favors, or other verbal or physical conduct of a sexual nature, disability, personal characteristics, or any other differentiating factors, as well as any other characteristic protected by law in the location where activity takes place.
## Our Standards ## Our Standards
@ -19,7 +19,7 @@ Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances * The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks * Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment * Public or private harassment / stalking / bullying / mobbing (group bullying or gang stalking)
* Publishing others' private information, such as a physical or electronic address, without explicit permission * Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting * Other conduct which could reasonably be considered inappropriate in a professional setting
* Call a person other name than that declared by the person * Call a person other name than that declared by the person
@ -36,13 +36,14 @@ This Code of Conduct applies both within project spaces and in public spaces whe
## Enforcement ## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the Pragmatismo.io security team at security@pragmatismo.io. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the Pragmatismo security team at c. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution ## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] and ICAPS Code of Conduct.
[homepage]: http://contributor-covenant.org [homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/ [version]: http://contributor-covenant.org/version/1/4/

View file

@ -32,7 +32,7 @@ In general, things we find useful when reviewing suggestions are:
## Contributing bug fixes ## Contributing bug fixes
General Bots is current in early preview. We're still accepting contributions in the form of bug fixes. General Bots is current in early preview. We're still accepting contributions in the form of bug fixes.
A bug must have an issue tracking it in the issue tracker that has been approved by the Pragmatismo.io team. Your pull request should include a link to the bug that you are fixing. If you've submitted a PR for a bug, please post a comment in the bug to avoid duplication of effort. A bug must have an issue tracking it in the issue tracker that has been approved by the pragmatismo.com.br team. Your pull request should include a link to the bug that you are fixing. If you've submitted a PR for a bug, please post a comment in the bug to avoid duplication of effort.
## Contributing features ## Contributing features
@ -40,7 +40,7 @@ Please open an issue with the `Schema` label to get a discussion started.
## Legal ## Legal
We appreciate community contributions to code repositories open sourced by Pragmatismo.io. By signing a contributor license agreement, we ensure that the community is free to use your contributions. We appreciate community contributions to code repositories open sourced by pragmatismo.com.br. By signing a contributor license agreement, we ensure that the community is free to use your contributions.
## Housekeeping ## Housekeeping

View file

@ -136,3 +136,13 @@ CREATE TABLE [dbo].[GuaribasSchedule]
[updatedAt] [datetimeoffset](7) NULL [updatedAt] [datetimeoffset](7) NULL
GO GO
ALTER TABLE dbo.GuaribasInstance ADD botKey nvarchar(64) NULL;
# 2.3.9
GO
ALTER TABLE dbo.GuaribasUser ADD
params nvarchar(4000) NULL
GO

View file

@ -1,8 +0,0 @@
# General Bots Features
| Feature | BF | GB |
|----------------------------------------------------------------------------|----|----|
| Use of conversational administration to manage bot packages (Talk to admin | - | X |
| F5 to run on VSCode | - | X |
| Isolated code on packages | - | X |
| Breaking changes protected | - | X |

View file

@ -1,5 +1,5 @@
General Bots is licensed under a dual license. To check which license General Bots is licensed under a dual license. To check which license
edition of General bots you have installed, please ask info@pragmatismo.io edition of General bots you have installed, please ask info@pragmatismo.com.br
informing your Customer ID. informing your Customer ID.
If you modify this Program, or any covered work, by combining it If you modify this Program, or any covered work, by combining it

View file

@ -1,7 +0,0 @@
# Localization in General Bots
## .gbapp
The localization is done by adding a strings.ts file to the root of the .gbapp package.

151
README.md
View file

@ -1,20 +1,36 @@
### Key Facts
- LLM Orchestrator AGPL licensed (to use as custom-label SaaS, contributing back)
- True community governance
- No single corporate control
- 5+ years of stability
- Never changed license
- Enterprise-grad
- Hosted locally or Multicloud
## Contributors
<a href="https://github.com/generalbots/botserver/graphs/contributors">
<img src="https://contrib.rocks/image?repo=generalbots/botserver" />
</a>
## Overview
| Area | Status | | Area | Status |
|------------------------------|----------------------------------------------------------------------------------------------------| |------------------------------|----------------------------------------------------------------------------------------------------|
| Releases | [![General Bots](https://img.shields.io/npm/dt/botserver.svg?logo=npm&label=botserver)](https://www.npmjs.com/package/botserver/) [![.gbapp lib](https://img.shields.io/npm/dt/botlib.svg?logo=npm&label=botlib)](https://www.npmjs.com/package/botlib/) [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)| | Releases | [![General Bots](https://img.shields.io/npm/dt/botserver.svg?logo=npm&label=botserver)](https://www.npmjs.com/package/botserver/) [![.gbapp lib](https://img.shields.io/npm/dt/botlib.svg?logo=npm&label=botlib)](https://www.npmjs.com/package/botlib/) [![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)|
| Community | [![StackExchange](https://img.shields.io/stackexchange/stackoverflow/t/generalbots.svg)](https://stackoverflow.com/questions/tagged/generalbots) [![Open-source](https://badges.frapsoft.com/os/v2/open-source.svg)](https://badges.frapsoft.com) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![License](https://img.shields.io/badge/license-AGPL-blue.svg)](https://github.com/GeneralBots/BotServer/blob/master/LICENSE.txt)| | Community | [![StackExchange](https://img.shields.io/stackexchange/stackoverflow/t/generalbots.svg)](https://stackoverflow.com/questions/tagged/generalbots) [![Open-source](https://badges.frapsoft.com/os/v2/open-source.svg)](https://badges.frapsoft.com) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![License](https://img.shields.io/badge/license-AGPL-blue.svg)](https://github.com/GeneralBots/BotServer/blob/master/LICENSE.txt)|
| Management | [![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://gitHub.com/GeneralBots/BotServer/graphs/commit-activity) | | Management | [![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://gitHub.com/GeneralBots/BotServer/graphs/commit-activity) |
| Security | [![Known Vulnerabilities](https://snyk.io/test/github/GeneralBots/BotServer/badge.svg)](https://snyk.io/test/github/GeneralBots/BotServer) | | Security | [![Known Vulnerabilities](https://snyk.io/test/github/GeneralBots/BotServer/badge.svg)](https://snyk.io/test/github/GeneralBots/BotServer) |
| Building & Quality | [![Build Status](https://travis-ci.com/GeneralBots/BotServer.svg?branch=master)](https://travis-ci.com/GeneralBots/BotServer) [![Coverage Status](https://coveralls.io/repos/github/GeneralBots/BotServer/badge.svg)](https://coveralls.io/github/GeneralBots/BotServer) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) | | Building & Quality | [![Coverage Status](https://coveralls.io/repos/github/GeneralBots/BotServer/badge.svg)](https://coveralls.io/github/GeneralBots/BotServer) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) |
| Packaging | [![forthebadge](https://badge.fury.io/js/botserver.svg)](https://badge.fury.io) [![ZipFile](https://camo.githubusercontent.com/0150c0f148d50fe9750ebc5d313581da699a8c50/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7a69702d646f776e6c6f61642d626c75652e737667)](https://github.com/GeneralBots/BotServer/releases/latest) [![Dependencies](https://david-dm.org/GeneralBots/botserver.svg)](https://david-dm.org) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) | | Packaging | [![forthebadge](https://badge.fury.io/js/botserver.svg)](https://badge.fury.io) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) |
| Samples | [VBA](https://github.com/GeneralBots/BotServer/tree/master/packages/default.gbdialog) or [![TypeScript](https://badges.frapsoft.com/typescript/code/typescript.svg?v=101)](https://github.com/GeneralBots/AzureADPasswordReset.gbapp) | Samples | [BASIC](https://github.com/GeneralBots/BotServer/tree/master/packages/default.gbdialog) or [![TypeScript](https://badges.frapsoft.com/typescript/code/typescript.svg?v=101)](https://github.com/GeneralBots/AzureADPasswordReset.gbapp)
| [Docker Image](https://github.com/lpicanco/docker-botserver) | ![Docker Automated build](https://img.shields.io/docker/automated/lpicanco/botserver.svg) ![Docker Build Status](https://img.shields.io/docker/build/lpicanco/botserver.svg) ![MicroBadger Size](https://img.shields.io/microbadger/image-size/lpicanco/botserver.svg) ![MicroBadger Layers](https://img.shields.io/microbadger/layers/lpicanco/botserver.svg) ![Docker Pulls](https://img.shields.io/docker/pulls/lpicanco/botserver.svg) <br/> *Provided by [@lpicanco](https://github.com/lpicanco/docker-botserver)* | | [Docker Image](https://github.com/lpicanco/docker-botserver) ![Docker Pulls](https://img.shields.io/docker/pulls/lpicanco/botserver.svg) <br/> *Provided by [@lpicanco](https://github.com/lpicanco/docker-botserver)* |
General Bots # General Bots
------------------
![General Bot Logo](https://raw.githubusercontent.com/pragmatismo-io/BotServer/master/logo.png) ![General Bot Logo](https://github.com/GeneralBots/BotServer/blob/main/logo.png?raw=true))
General Bot is a strongly typed package based chat bot server focused in convention over configuration and code-less approaches, which brings software packages and application server concepts to help parallel bot development. General Bot is a strongly typed LLM conversational platform package based chat bot server focused in convention over configuration and code-less approaches, which brings software packages and application server concepts to help parallel bot development.
## What is a Bot Server? ## What is a Bot Server?
@ -28,28 +44,115 @@ advanced fashion writing custom code in editors like Visual Studio Code, Atom or
Everyone can create bots by just copying and pasting some files and using their Everyone can create bots by just copying and pasting some files and using their
favorite tools from Office (or any text editor) or Photoshop (or any image favorite tools from Office (or any text editor) or Photoshop (or any image
editor). BASIC can be used to build custom dialogs so Bot can be extended just like VBA for Excel (currently in alpha). editor). LLM and BASIC can be mixed used to build custom dialogs so Bot can be extended just like VBA for Excel.
![General Bot Reference Architecture](https://raw.githubusercontent.com/GeneralBots/BotBook/master/images/general-bots-reference-architecture.png) ## Getting Started
### Prerequisites
Before you embark on your General Bots journey, ensure you have the following tools installed:
- **Node.js (version 20 or later)**: General Bots leverages the latest features of Node.js to provide a robust and efficient runtime environment. Download it from [nodejs.org](https://nodejs.org/en/download/).
- **Git (latest stable version)**: Essential for version control and collaborating on bot projects. Get it from [git-scm.com](https://git-scm.com/downloads).
### Quick Start Guide
Follow these steps to get your General Bots server up and running:
1. Clone the repository:
```bash
git clone https://github.com/GeneralBots/BotServer
```
This command creates a local copy of the General Bots server repository on your machine.
2. Navigate to the project directory:
```bash
cd BotServer
```
This changes your current directory to the newly cloned BotServer folder.
3. Install dependencies and start the server:
```bash
npm install
npm run start
```
The `npm install` command installs all necessary dependencies for the project. `npm run start` builds your bot server locally and serves it through a development server.
### Accessing Your Bot
Once the server is running, you can access your bot at `http://localhost:4242/`. This local server allows you to interact with your bot and test its functionality in real-time. If you want to publish
without password, define [ADMIN_OPEN_PUBLISH](https://github.com/GeneralBots/BotBook/master/docs/chapter-07-gbot-reference#enviroment-variables-reference) as true in BotServer .env file.
To publish bot packages and initiate a conversation with the bot, use the command:
```
/publish
```
This command prepares your bot packages for use and allows you to start interacting with your bot immediately.
## Development Workflow
### 1. Project Structure
The General Bots server follows a modular architecture designed for flexibility and scalability. Here's an overview of the main directories:
```
BotServer/
├── packages/
│ ├── core.gbapp/ # Core bot functionality
│ ├── kb.gbapp/ # Knowledge base packages
├── src / # Main entry point
└── package.json # Project configuration
```
This structure allows for easy navigation and management of different aspects of your bot project.
### 2. Creating Custom Packages
One of the strengths of General Bots is its extensibility. You can create custom packages to enhance your bot's capabilities:
- **.gbkb (Knowledge Base packages)**: Store and manage your bot's knowledge and responses.
- **.gbtheme (Theme packages)**: Customize the visual appearance of your bot interface.
- **.gbapp (Application packages)**: Add new features and functionalities to your bot.
Each package type has its own structure and purpose, which we'll explore in depth in their respective chapters.
## Samples ## Samples
Several samples, including a Bot for AD Password Reset, are avaiable on the [repository list](https://github.com/GeneralBots). Several samples, including a Bot for AD Password Reset, are avaiable on the [repository list](https://github.com/GeneralBots).
### Using complete General Bots Conversational Data Analytics
![](https://user-images.githubusercontent.com/14840374/178154826-8188029e-b4f4-48aa-bc0d-126307ce5121.png)
```
TALK "General Bots Labs presents FISCAL DATA SHOW BY BASIC"
TALK "Gift Contributions to Reduce the Public Debt API (https://fiscaldata.treasury.gov/datasets/gift-contributions-reduce-debt-held-by-public/gift-contributions-to-reduce-the-public-debt)"
result = GET "https://api.fiscaldata.treasury.gov/services/api/fiscal_service/v2/accounting/od/gift_contributions?page[size]=500"
data = result.data
data = SELECT YEAR(record_date) as Yr, SUM(CAST(contribution_amt AS NUMBER)) AS Amount FROM data GROUP BY YEAR(record_date)
TALK "Demonstration of Gift Contributions with AS IMAGE keyword"
SET THEME dark
png = data as IMAGE
SEND FILE png
DELAY 5
TALK " Demonstration of Gift Contributions CHART keyword"
img = CHART "bar", data
SEND FILE img
```
## Guide ## Guide
[Read the General Bots BotBook Guide](https://github.com/GeneralBots/BotBook/tree/master/book). [Read the General Bots BotBook Guide](https://docs.pragmatismo.com.br)
# Videos # Videos
Now with the General Bots server you can press F5 on Visual Studio to get a bot factory on your environment* published on November 10th, 2018. 7 AI General Bots LLM Templates for Goodness
[https://www.youtube.com/watch?v=KJgvUPXi3Fw](https://www.youtube.com/watch?v=KJgvUPXi3Fw)
[![General Bot Video](https://raw.githubusercontent.com/pragmatismo-io/BotServer/master/docs/images/video-01-thumb.jpg)](https://www.youtube.com/watch?v=AfKTwljoMOs)
See how easy is to use 'hear' and 'talk' to build Microsoft BOT Framework v4 logic with plain BASIC * published on December 3rd, 2018.
[![See how easy is to use 'hear' and 'talk' to build Microsoft BOT Framework v4 logic with plain BASIC](https://raw.githubusercontent.com/pragmatismo-io/BotServer/master/docs/images/video-02-thumb.jpg)](https://www.youtube.com/watch?v=yX1sF9n9628)
# Contributing # Contributing
@ -58,14 +161,14 @@ See our [Contribution Guidelines](https://github.com/pragmatismo-io/BotServer/bl
# Reporting Security Issues # Reporting Security Issues
Security issues and bugs should be reported privately, via email, to the Pragmatismo.io Security Security issues and bugs should be reported privately, via email, to the pragmatismo.com.br Security
team at [security@pragmatismo.io](mailto:security@pragmatismo.io). You should team at [security@pragmatismo.com.br](mailto:security@pragmatismo.com.br). You should
receive a response within 24 hours. If for some reason you do not, please follow up via receive a response within 24 hours. If for some reason you do not, please follow up via
email to ensure we received your original message. email to ensure we received your original message.
# License & Warranty # License & Warranty
General Bot Copyright (c) Pragmatismo.io. All rights reserved. General Bot Copyright (c) pragmatismo.com.br. All rights reserved.
Licensed under the AGPL-3.0. Licensed under the AGPL-3.0.
According to our dual licensing model, this program can be used either According to our dual licensing model, this program can be used either
@ -81,12 +184,12 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. GNU Affero General Public License for more details.
"General Bot" is a registered trademark of Pragmatismo.io. "General Bot" is a registered trademark of pragmatismo.com.br.
The licensing of the program under the AGPLv3 does not imply a The licensing of the program under the AGPLv3 does not imply a
trademark license. Therefore any rights, title and interest in trademark license. Therefore any rights, title and interest in
our trademarks remain entirely with us. our trademarks remain entirely with us.
<a href="https://stackoverflow.com/questions/ask?tags=generalbots">:speech_balloon: Ask a question</a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://github.com/GeneralBots/BotBook">:book: Read the Docs</a> <a href="https://stackoverflow.com/questions/ask?tags=generalbots">:speech_balloon: Ask a question</a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://github.com/GeneralBots/BotBook">:book: Read the Docs</a>
Team pictures made with [contrib.rocks](https://contrib.rocks).
General Bots Code Name is [Guaribas](https://en.wikipedia.org/wiki/Guaribas), the name of a city in Brazil, state of Piaui. General Bots Code Name is [Guaribas](https://en.wikipedia.org/wiki/Guaribas), the name of a city in Brazil, state of Piaui.
[Roberto Mangabeira Unger](http://www.robertounger.com/en/): "No one should have to do work that can be done by a machine". [Roberto Mangabeira Unger](http://www.robertounger.com/en/): "No one should have to do work that can be done by a machine".

View file

@ -1,6 +0,0 @@
# Roadmap
| Title | Priority | Release | Status |
|-------------------------------|------------------------------------------------------------------------------------------------------------|---------|--------|
| Isolation of .gbapp per .gbot | Today .gbapp loaded is shared across all bot instances and must be associated to one or more individually. | Medium | 2019Q4 |
| Python based .gbapps | Write conversational login in Python | Low | - |

View file

@ -1,7 +0,0 @@
# General Bots Server Samples
| Sample | Description |
|--------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|
| [IntranetBotQuickStart-gbai](https://github.com/pragmatismo-io/IntranetBotQuickStart.gbai) | Free modules from General Bots Intranet based bot. |
| [AzureADPasswordReset-gbapp](https://github.com/pragmatismo-io/AzureADPasswordReset.gbapp) | Custom General Bot App (gbapp) for resetting an user password in Azure Active Directory, Office 365, Dynamics 365 or any app published through Azure AD. |
| [ProjectOnline.gbkb](https://github.com/pragmatismo-io/ProjectOnline.gbkb) | The .gbkb file demonstring a Knowledge Base for Pragmatismo.io KBot for Microsoft Project. |

View file

@ -14,14 +14,13 @@ Request your free IT security evaluation
This IT security policy helps us: This IT security policy helps us:
• Rodrigo Rodriguez is the director with overall responsibility for IT security strategy. • Rodrigo Rodriguez is the director with overall responsibility for IT security strategy.
• Dário Vieira has day-to-day operational responsibility for implementing this policy.
• Microsoft is the IT partner organisation we use to help with our planning and support. • Microsoft is the IT partner organisation we use to help with our planning and support.
• Microsoft is the data protection officer to advise on data protection laws and best practices • Microsoft is the data protection officer to advise on data protection laws and best practices
Review process Review process
We will review this policy yearly. We will review this policy yearly.
In the meantime, if you have any questions, suggestions In the meantime, if you have any questions, suggestions
or feedback, please contact security@pragmatismo.io or feedback, please contact security@pragmatismo.com.br
We will only classify information which is necessary for the completion of our duties. We will also limit We will only classify information which is necessary for the completion of our duties. We will also limit
@ -59,4 +58,4 @@ any other tasks that could result in a conflict of interest.
## Reporting a Vulnerability ## Reporting a Vulnerability
You can expect to get an update on a reported vulnerability in a day or two. You can expect to get an update on a reported vulnerability in a day or two.
security@pragmatismo.io security@pragmatismo.com.br

79
WARNINGS.md Normal file
View file

@ -0,0 +1,79 @@
# default.gbui
https://github.com/microsoft/BotFramework-WebChat/pull/4524
warning botframework-directlinejs > core-js@3.15.2: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.
warning botframework-webchat > botframework-webchat-component > @emotion/css > @emotion/babel-plugin > @babel/plugin-syntax-jsx@7.18.6" has unmet peer dependency "@babel/core@^7.0.0-0".
warning botframework-webchat > botframework-webchat-component > @emotion/css > @emotion/babel-plugin@11.10.5" has unmet peer dependency "@babel/core@^7.0.0".
warning botframework-webchat > botframework-webchat-component > react-film > core-js@3.12.1: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.
warning botframework-webchat > botframework-webchat-component > react-scroll-to-bottom > core-js@3.18.3: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.
warning botframework-webchat > botframework-webchat-core > redux-devtools-extension@2.13.9: Package moved to @redux-devtools/extension.
warning botframework-webchat > microsoft-cognitiveservices-speech-sdk > asn1.js-rfc2560@5.0.1" has unmet peer dependency "asn1.js@^5.0.0".
warning botframework-webchat > web-speech-cognitive-services@7.1.2" has incorrect peer dependency "microsoft-cognitiveservices-speech-sdk@~1.17.0".
https://github.com/microsoft/powerbi-client-react
warning react-powerbi@0.9.1" has incorrect peer dependency "react@^16.8.0".
warning react-scripts > @svgr/webpack > @svgr/plugin-svgo > svgo > stable@0.1.8: Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility
warning react-scripts > @svgr/webpack > @svgr/plugin-svgo > svgo@1.3.2: This SVGO version is no longer supported. Upgrade to v2.x.x.
warning react-scripts > css-minimizer-webpack-plugin > cssnano > cssnano-preset-default > postcss-svgo > svgo > stable@0.1.8: Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility
warning react-scripts > eslint-config-react-app > @typescript-eslint/eslint-plugin > tsutils@3.21.0" has unmet peer dependency "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta".
warning react-scripts > eslint-config-react-app > eslint-plugin-flowtype@8.0.3" has unmet peer dependency "@babel/plugin-syntax-flow@^7.14.5".
warning react-scripts > eslint-config-react-app > eslint-plugin-flowtype@8.0.3" has unmet peer dependency "@babel/plugin-transform-react-jsx@^7.14.9".
warning react-scripts > jest > @jest/core > jest-config > jest-environment-jsdom > jsdom > w3c-hr-time@1.0.2: Use your platform's native performance.now() and performance.timeOrigin.
warning react-scripts > react-dev-utils > fork-ts-checker-webpack-plugin@6.5.2" has unmet peer dependency "typescript@>= 2.7".
# BotServer
docxtemplater is not working in more modern versions. Stay with 3.9.7.
nodejs/node-gyp#2756
warning npm > node-gyp > make-fetch-happen > cacache > @npmcli/move-file@2.0.1: This functionality has been moved to @npmcli/fs
vasyas/typescript-rest-rpc#20
warning typescript-rest-rpc > ts-morph > globby > fast-glob > micromatch > snapdragon > source-map-resolve@0.5.3: See https://github.com/lydell/source-map-resolve#deprecated
#279
warning tslint@6.1.3: TSLint has been deprecated in favor of ESLint. Please see palantir/tslint#4534 for more information.
AlaSQL/alasql#1541
warning alasql > request@2.88.2: request has been deprecated, see request/request#3142
#281
warning c3-chart-maker > data-forge > promised-mongo > mongodb-core > bson@0.4.23: Fixed a critical issue with BSON serialization documented in CVE-2019-2391, see https://bit.ly/2KcpXdo for more details
#280
warning swagger-client > url > querystring@0.2.0: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
bahmutov/ggit#157
warning ban-sensitive-files > ggit > debug@3.2.6: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (debug-js/debug#797)
#283
warning nexmo > uuid@2.0.3: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
https://github.com/microsoft/botbuilder-js/issues/4370
warning botbuilder-ai > @azure/cognitiveservices-luis-runtime > @azure/ms-rest-js > uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
https://github.com/Azure/azure-sdk-for-node/issues/5221
warning ms-rest-azure > request@2.88.2: request has been deprecated, see request/request#3142
https://github.com/MontassarLaribi/ssr-for-bots/issues/1
warning ssr-for-bots > tslint@6.1.3: TSLint has been deprecated in favor of ESLint. Please see palantir/tslint#4534 for more information.
https://github.com/vasyas/typescript-rest-rpc/issues/20
warning typescript-rest-rpc > ts-morph > globby > fast-glob > micromatch > snapdragon > source-map-resolve > urix@0.1.0: Please see https://github.com/lydell/urix#deprecated
https://github.com/ash-developer/winston-logs-display/issues/8
warning winston-logs-display > jade > transformers@2.1.0: Deprecated, use jstransformer
https://github.com/softwarescales/git-issues/issues/29
warning git-issues > request@2.88.2: request has been deprecated, see request/request#3142
https://github.com/GeneralBots/BotServer/issues/284
warning license-checker > read-installed > readdir-scoped-modules@1.1.0: This functionality has been moved to @npmcli/fs
https://github.com/semantic-release/semantic-release/issues/1260
warning semantic-release > @semantic-release/npm > npm > readdir-scoped-modules@1.1.0: This functionality has been moved to @npmcli/fs
https://github.com/GeneralBots/BotServer/issues/277
warning travis-deploy-once@3.3.0: We recommend to use Travis Build Stages instead

14
api-template.json Normal file
View file

@ -0,0 +1,14 @@
{
"openapi": "3.0.0",
"info": {
"title": "General Bots API",
"description": "General Bots API description in Swagger format",
"version": "1.0"
},
"servers": [
{
"url": "https://generalbots.online/api",
"description": "General Bots Online"
}
]
}

BIN
blank.docx Normal file

Binary file not shown.

BIN
blank.xlsx Normal file

Binary file not shown.

65
boot.js
View file

@ -1,65 +0,0 @@
#!/usr/bin/env node
const Fs = require('fs');
const Path = require('path');
const { exec } = require('child_process');
var pjson = require('./package.json');
// Displays version of Node JS being used at runtime and others attributes.
console.log(`[GB Runtime] BotServer = v${pjson.version}`);
console.log(`[GB Runtime] BotLib = v${pjson.dependencies.botlib}`);
console.log(`[GB Runtime] BotBuilder (MS) = v${pjson.dependencies.botbuilder}`);
console.log(`[GB Runtime] NodeJS = ${process.version}`);
console.log(`[GB Runtime] platform = ${process.platform}`);
console.log(`[GB Runtime] architecture = ${process.arch}`);
console.log(`[GB Runtime] argv = ${process.argv}`);
console.log(`[GB Runtime] debugPort = ${process.debugPort}`);
var now = () => {
return (new Date()).toISOString().replace(/T/, ' ').replace(/\..+/, '') + ' UTC';
}
try {
var run = () => {
console.log(`[GB Runtime] Initializing General Bots (BotServer)...`);
const GBServer = require("./dist/src/app").GBServer
console.log(`[GB Runtime] ${now()} - Running '${GBServer.name}' on '${__dirname}' directory`);
process.env.PWD = __dirname;
GBServer.run();
}
var processDist = () => {
if (!Fs.existsSync('dist')) {
console.log(`${now()} - Compiling...`);
exec(Path.join(__dirname, 'node_modules/.bin/tsc'), (err, stdout, stderr) => {
if (err) {
console.error(err);
return;
}
run();
});
}
else {
run();
}
};
// Installing modules if it has not been done yet.
if (!Fs.existsSync('node_modules')) {
console.log(`${now()} - Installing modules for the first time, please wait...`);
exec('npm install', (err, stdout, stderr) => {
if (err) {
console.error(err);
return;
}
processDist();
});
}
else {
processDist();
}
} catch (e) {
console.log(e);
}

57
boot.mjs Normal file
View file

@ -0,0 +1,57 @@
#!/usr/bin/env node
process.stdout.write(`General Bots 5 VM: node@${process.version.replace('v', '')}, ${process.platform} ${process.arch} `);
import fs from 'fs/promises';
import os from 'node:os';
import path from 'path';
import { exec } from 'child_process';
import {GBUtil} from './dist/src/util.js'
// Displays version of Node JS being used at runtime and others attributes.
console.log(`\nLoading General Bots VM...`);
var __dirname = process.env.PWD || process.cwd();
try {
var run = async () => {
import('./dist/src/app.js').then(async (gb)=> {
await gb.GBServer.run()
});
};
var processDist = async () => {
if (!await GBUtil.exists('dist')) {
console.log(`\n`);
console.log(`General Bots: Compiling...`);
exec(path.join(__dirname, 'node_modules/.bin/tsc'), async (err, stdout, stderr) => {
if (err) {
console.error(err);
return;
}
await run();
});
} else {
await run();
}
};
// Installing modules if it has not been done yet.
if (!await GBUtil.exists('node_modules')) {
console.log(`\n`);
console.log(`General Bots: Installing modules for the first time, please wait...`);
exec('npm install', async (err, stdout, stderr) => {
if (err) {
console.error(err);
return;
}
await processDist();
});
} else {
await processDist();
}
} catch (e) {
console.log(e);
}

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 280 KiB

After

Width:  |  Height:  |  Size: 261 KiB

382
extensions.json Normal file
View file

@ -0,0 +1,382 @@
[
{
"extension": "aac",
"description": "AAC audio",
"category": "Music"
},
{
"extension": "abw",
"description": "AbiWord document",
"category": "Document"
},
{
"extension": "arc",
"description": "Archive document (multiple files embedded)",
"category": "Document"
},
{
"extension": "avif",
"description": "AVIF image",
"category": "Image"
},
{
"extension": "avi",
"description": "AVI: Audio Video Interleave",
"category": "Movie"
},
{
"extension": "azw",
"description": "Amazon Kindle eBook format",
"category": "Document"
},
{
"extension": "bin",
"description": "Any kind of binary data",
"category": "Other"
},
{
"extension": "bmp",
"description": "Windows OS/2 Bitmap Graphics",
"category": "Image"
},
{
"extension": "bz",
"description": "BZip archive",
"category": "Other"
},
{
"extension": "bz2",
"description": "BZip2 archive",
"category": "Other"
},
{
"extension": "cda",
"description": "CD audio",
"category": "Music"
},
{
"extension": "csh",
"description": "C-Shell script",
"category": "Executable"
},
{
"extension": "css",
"description": "Cascading Style Sheets (CSS)",
"category": "Other"
},
{
"extension": "csv",
"description": "Comma-separated values (CSV)",
"category": "Document"
},
{
"extension": "doc",
"description": "Microsoft Word",
"category": "Document"
},
{
"extension": "docx",
"description": "Microsoft Word (OpenXML)",
"category": "Document"
},
{
"extension": "eot",
"description": "MS Embedded OpenType fonts",
"category": "Other"
},
{
"extension": "epub",
"description": "Electronic publication (EPUB)",
"category": "Document"
},
{
"extension": "gz",
"description": "GZip Compressed Archive",
"category": "Other"
},
{
"extension": "gif",
"description": "Graphics Interchange Format (GIF)",
"category": "Image"
},
{
"extension": "htm",
"description": "HyperText Markup Language (HTML)",
"category": "Other"
},
{
"extension": "html",
"description": "HyperText Markup Language (HTML)",
"category": "Other"
},
{
"extension": "ico",
"description": "Icon format",
"category": "Image"
},
{
"extension": "ics",
"description": "iCalendar format",
"category": "Document"
},
{
"extension": "jar",
"description": "Java Archive (JAR)",
"category": "Executable"
},
{
"extension": "jpeg",
"description": "JPEG images",
"category": "Image"
},
{
"extension": "jpg",
"description": "JPEG images",
"category": "Image"
},
{
"extension": "js",
"description": "JavaScript",
"category": "Other"
},
{
"extension": "json",
"description": "JSON format",
"category": "Other"
},
{
"extension": "jsonld",
"description": "JSON-LD format",
"category": "Other"
},
{
"extension": "mid",
"description": "Musical Instrument Digital Interface (MIDI)",
"category": "Music"
},
{
"extension": "midi",
"description": "Musical Instrument Digital Interface (MIDI)",
"category": "Music"
},
{
"extension": "mjs",
"description": "JavaScript module",
"category": "Other"
},
{
"extension": "mp3",
"description": "MP3 audio",
"category": "Music"
},
{
"extension": "mp4",
"description": "MP4 video",
"category": "Movie"
},
{
"extension": "mpeg",
"description": "MPEG Video",
"category": "Movie"
},
{
"extension": "mpkg",
"description": "Apple Installer Package",
"category": "Application"
},
{
"extension": "odp",
"description": "OpenDocument presentation document",
"category": "Presentation"
},
{
"extension": "ods",
"description": "OpenDocument spreadsheet document",
"category": "Document"
},
{
"extension": "odt",
"description": "OpenDocument text document",
"category": "Document"
},
{
"extension": "oga",
"description": "OGG audio",
"category": "Music"
},
{
"extension": "ogv",
"description": "OGG video",
"category": "Movie"
},
{
"extension": "ogx",
"description": "OGG",
"category": "Other"
},
{
"extension": "opus",
"description": "Opus audio",
"category": "Music"
},
{
"extension": "otf",
"description": "OpenType font",
"category": "Other"
},
{
"extension": "png",
"description": "Portable Network Graphics",
"category": "Image"
},
{
"extension": "pdf",
"description": "Adobe Portable Document Format (PDF)",
"category": "PDF"
},
{
"extension": "php",
"description": "Hypertext Preprocessor (Personal Home Page)",
"category": "Other"
},
{
"extension": "ppt",
"description": "Microsoft PowerPoint",
"category": "Presentation"
},
{
"extension": "pptx",
"description": "Microsoft PowerPoint (OpenXML)",
"category": "Presentation"
},
{
"extension": "rar",
"description": "RAR archive",
"category": "Other"
},
{
"extension": "rtf",
"description": "Rich Text Format (RTF)",
"category": "Document"
},
{
"extension": "sh",
"description": "Bourne shell script",
"category": "Executable"
},
{
"extension": "svg",
"description": "Scalable Vector Graphics (SVG)",
"category": "Image"
},
{
"extension": "tar",
"description": "Tape Archive (TAR)",
"category": "Other"
},
{
"extension": "tif",
"description": "Tagged Image File Format (TIFF)",
"category": "Image"
},
{
"extension": "tiff",
"description": "Tagged Image File Format (TIFF)",
"category": "Image"
},
{
"extension": "ts",
"description": "MPEG transport stream",
"category": "Movie"
},
{
"extension": "ttf",
"description": "TrueType Font",
"category": "Other"
},
{
"extension": "txt",
"description": "Text, (generally ASCII or ISO 8859-n)",
"category": "Text"
},
{
"extension": "vsd",
"description": "Microsoft Visio",
"category": "Application"
},
{
"extension": "wav",
"description": "Waveform Audio Format",
"category": "Music"
},
{
"extension": "weba",
"description": "WEBM audio",
"category": "Music"
},
{
"extension": "webm",
"description": "WEBM video",
"category": "Movie"
},
{
"extension": "webp",
"description": "WEBP image",
"category": "Image"
},
{
"extension": "woff",
"description": "Web Open Font Format (WOFF)",
"category": "Other"
},
{
"extension": "woff2",
"description": "Web Open Font Format (WOFF)",
"category": "Other"
},
{
"extension": "xhtml",
"description": "XHTML",
"category": "Other"
},
{
"extension": "xls",
"description": "Microsoft Excel",
"category": "Document"
},
{
"extension": "xlsx",
"description": "Microsoft Excel (OpenXML)",
"category": "Document"
},
{
"extension": "xml",
"description": "XML",
"category": "Document"
},
{
"extension": "xul",
"description": "XUL",
"category": "Application"
},
{
"extension": "zip",
"description": "ZIP archive",
"category": "Application"
},
{
"extension": "3gp",
"description": "3GPP audio/video container",
"category": "Movie"
},
{
"extension": "3g2",
"description": "3GPP2 audio/video container",
"category": "Movie"
},
{
"extension": "7z",
"description": "7-zip archive",
"category": "Application"
}
]

View file

@ -3,13 +3,13 @@
ECHO General Bots Command Line ECHO General Bots Command Line
IF EXIST node_modules goto COMPILE IF EXIST node_modules goto COMPILE
ECHO Installing Packages for the first time use... ECHO Installing Packages for the first time use (it may take several minutes)...
CALL npm install --silent CALL npm install --silent
:COMPILE :COMPILE
IF EXIST dist goto ALLSET IF EXIST dist goto ALLSET
ECHO Compiling... ECHO Compiling...
CALL node_modules\.bin\tsc npm run build
:ALLSET :ALLSET
node boot.js npm run start

2
gbot.sh Executable file
View file

@ -0,0 +1,2 @@
echo Starting General Bots...
npm run start

View file

@ -1,11 +0,0 @@
{
"groups": {
"default": {
"packages": [
"package.json",
"packages/default.gbtheme/package.json",
"packages/default.gbui/package.json"
]
}
}
}

BIN
logo.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

After

Width:  |  Height:  |  Size: 25 KiB

68893
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,9 @@
{ {
"name": "botserver", "name": "botserver",
"version": "2.0.154", "version": "5.0.0",
"description": "General Bot Community Edition open-core server.", "description": "General Bot Community Edition open-core server.",
"main": "./boot.js", "main": "./boot.mjs",
"type": "module",
"bugs": "https://github.com/pragmatismo-io/BotServer/issues", "bugs": "https://github.com/pragmatismo-io/BotServer/issues",
"homepage": "https://github.com/pragmatismo-io/BotServer/#readme", "homepage": "https://github.com/pragmatismo-io/BotServer/#readme",
"contributors": [ "contributors": [
@ -10,30 +11,36 @@
"João Ferreira <joao.parana@gmail.com>", "João Ferreira <joao.parana@gmail.com>",
"Jorge Ramos <jramos@pobox.com>", "Jorge Ramos <jramos@pobox.com>",
"PH <ph.an@outlook.com>", "PH <ph.an@outlook.com>",
"Dário Vieira <dario.junior3@gmail.com>" "Dário Vieira <dario.junior3@gmail.com>",
"Alan Perdomo <alanperdomo@hotmail.com>"
], ],
"opencv4nodejs": {
"disableAutoBuild": "1"
},
"engines": { "engines": {
"node": "=14.10.1" "node": "=22.9.0"
}, },
"license": "AGPL-3.0", "license": "AGPL-3.0",
"preferGlobal": true, "preferGlobal": true,
"private": false, "private": false,
"bin": { "bin": {
"gbot": "./boot.js" "gbot": "./boot.mjs"
}, },
"readme": "README.md",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/GeneralBots/BotServer.git" "url": "https://github.com/GeneralBots/BotServer.git"
}, },
"scripts": { "scripts": {
"clean": "shx rm -rf node_modules/ dist/ docs/reference", "clean": "shx rm -rf node_modules/ dist/ docs/reference",
"tslint": "tslint --fix ./src/*.ts ./packages/**/*.ts -t verbose -e ./packages/default.gbui/**/* -e ./packages/**/*.gbdialog/**/*", "tslint": "tslint --fix ./src/*.ts ./packages/**/*.ts -t verbose",
"build": "npm install && npm run build-server && npm run build-gbui", "build": "npm install && npm run build-server && npm run build-gbui",
"build-server": "tsc", "build-server": "tsc",
"build-gbui": "cd packages/default.gbui && echo SKIP_PREFLIGHT_CHECK=true >.env && npm install && npm run build", "build-gbui": "cd packages/default.gbui && echo SKIP_PREFLIGHT_CHECK=true >.env && npm install && npm run build",
"build-docs": "typedoc --options typedoc.json src/", "build-docs": "typedoc --options typedoc.json src/",
"test": "node test.js", "test": "vitest",
"start": "node ./boot.js", "start": "NODE_NO_WARNINGS=1 node ./boot.mjs --loader ts-node/esm --require ./suppress-node-warnings.cjs",
"debug": "NODE_NO_WARNINGS=1 node ./boot.mjs --loader ts-node/esm --require ./suppress-node-warnings.cjs --inspect",
"reverse-proxy": "node_modules/.bin/ngrok http 4242", "reverse-proxy": "node_modules/.bin/ngrok http 4242",
"watch:build": "tsc --watch", "watch:build": "tsc --watch",
"posttypedoc": "shx cp .nojekyll docs/reference/.nojekyll", "posttypedoc": "shx cp .nojekyll docs/reference/.nojekyll",
@ -48,113 +55,226 @@
"semantic-release": "semantic-release", "semantic-release": "semantic-release",
"commit": "git-cz" "commit": "git-cz"
}, },
"jest": {
"workerIdleMemoryLimit": "4096MB",
"transform": {
".+\\.tsx?$": "ts-jest"
},
"moduleFileExtensions": [
"ts",
"tsx",
"js",
"jsx",
"json"
]
},
"dependencies": { "dependencies": {
"@azure/cognitiveservices-computervision": "8.1.0", "@azure/arm-appservice": "15.0.0",
"@azure/ms-rest-js": "2.5.1", "@azure/arm-cognitiveservices": "7.5.0",
"@google-cloud/pubsub": "2.13.0", "@azure/arm-resources": "5.2.0",
"@google-cloud/translate": "6.2.6", "@azure/arm-search": "3.2.0",
"@hubspot/api-client": "5.0.0", "@azure/arm-sql": "10.0.0",
"@microsoft/microsoft-graph-client": "2.2.1", "@azure/arm-subscriptions": "5.1.0",
"@semantic-release/changelog": "5.0.1", "@azure/cognitiveservices-computervision": "8.2.0",
"@semantic-release/exec": "5.0.0", "@azure/keyvault-keys": "4.8.0",
"@semantic-release/git": "9.0.0", "@azure/ms-rest-js": "2.7.0",
"@sendgrid/mail": "7.4.4", "@azure/msal-node": "2.13.1",
"@types/validator": "13.1.4", "@azure/openai": "2.0.0-beta.1",
"adal-node": "0.2.2", "@azure/search-documents": "12.1.0",
"adm-zip": "0.5.6", "@azure/storage-blob": "12.24.0",
"alasql": "^1.7.3", "@google-cloud/pubsub": "4.7.0",
"@google-cloud/translate": "8.5.0",
"@hubspot/api-client": "11.2.0",
"@koa/cors": "5.0.0",
"@langchain/anthropic": "^0.3.7",
"@langchain/community": "0.2.31",
"@langchain/core": "^0.3.17",
"@langchain/openai": "0.2.8",
"@microsoft/microsoft-graph-client": "3.0.7",
"@nlpjs/basic": "4.27.0",
"@nosferatu500/textract": "3.1.3",
"@push-rpc/core": "1.9.0",
"@push-rpc/http": "1.9.0",
"@push-rpc/openapi": "1.9.0",
"@push-rpc/websocket": "1.9.0",
"@semantic-release/changelog": "6.0.3",
"@semantic-release/exec": "6.0.3",
"@semantic-release/git": "10.0.1",
"@sendgrid/mail": "8.1.3",
"@sequelize/core": "7.0.0-alpha.37",
"@sequelize/postgres": "^7.0.0-alpha.43",
"@types/validator": "13.12.1",
"adm-zip": "0.5.16",
"ai2html": "^0.121.1",
"alasql": "4.5.1",
"any-shell-escape": "0.1.1", "any-shell-escape": "0.1.1",
"arraybuffer-to-buffer": "0.0.7",
"async-mutex": "0.5.0",
"async-promises": "0.2.3", "async-promises": "0.2.3",
"azure-arm-cognitiveservices": "3.0.0", "async-retry": "1.3.3",
"azure-arm-resource": "7.4.0", "basic-auth": "2.0.1",
"azure-arm-search": "1.3.0-preview", "bcrypt": "^5.1.1",
"azure-arm-sql": "5.7.0", "billboard.js": "3.13.0",
"azure-arm-website": "5.7.0",
"azure-search-client": "3.1.5",
"billboard.js": "^3.4.1",
"bluebird": "3.7.2", "bluebird": "3.7.2",
"body-parser": "1.19.0", "body-parser": "1.20.2",
"botbuilder": "4.11.0", "botbuilder": "4.23.0",
"botbuilder-adapter-facebook": "1.0.11", "botbuilder-adapter-facebook": "1.0.12",
"botbuilder-ai": "4.11.0", "botbuilder-ai": "4.23.0",
"botbuilder-dialogs": "4.11.0", "botbuilder-dialogs": "4.23.0",
"botframework-connector": "4.11.0", "botframework-connector": "4.23.0",
"botlib": "1.10.1", "botlib": "5.0.0",
"c3-chart-maker": "^0.2.8", "c3-chart-maker": "0.2.8",
"cd": "0.3.3",
"chalk-animation": "2.0.3",
"chatgpt": "5.2.5",
"chrome-remote-interface": "0.33.2",
"cli-progress": "3.12.0",
"cli-spinner": "0.2.10", "cli-spinner": "0.2.10",
"core-js": "3.14.0", "core-js": "3.38.1",
"data-forge": "^1.9.5", "cors": "2.8.5",
"date-diff": "0.2.2", "csv-database": "0.9.2",
"data-forge": "1.10.2",
"date-diff": "1.0.2",
"docximager": "0.0.4",
"docxtemplater": "3.50.0",
"dotenv-extended": "2.9.0", "dotenv-extended": "2.9.0",
"exceljs": "4.2.1", "electron": "32.0.1",
"express": "4.17.1", "exceljs": "4.4.0",
"express": "4.19.2",
"express-remove-route": "1.0.0", "express-remove-route": "1.0.0",
"ffmpeg-static": "4.3.0", "facebook-nodejs-business-sdk": "^20.0.2",
"google-libphonenumber": "3.2.21", "ffmpeg-static": "5.2.0",
"googleapis": "75.0.0", "formidable": "^3.5.1",
"ibm-watson": "6.1.1", "get-image-colors": "4.0.1",
"js-beautify": "1.13.13", "glob": "^11.0.0",
"luxon": "2.0.2", "google-libphonenumber": "3.2.38",
"marked": "2.0.7", "googleapis": "143.0.0",
"momentjs": "2.0.0", "hnswlib-node": "3.0.0",
"ms-rest-azure": "3.0.0", "html-to-md": "0.8.6",
"http-proxy": "1.18.1",
"ibm-watson": "9.1.0",
"icojs": "^0.19.4",
"instagram-private-api": "1.46.1",
"iso-639-1": "3.1.3",
"isomorphic-fetch": "3.0.0",
"jimp": "1.6.0",
"js-md5": "0.8.3",
"json-schema-to-zod": "2.4.0",
"jsqr": "^1.4.0",
"just-indent": "0.0.1",
"keyv": "5.0.1",
"koa": "2.15.3",
"koa-body": "6.0.1",
"koa-ratelimit": "5.1.0",
"koa-router": "12.0.1",
"langchain": "0.2.17",
"language-tags": "1.0.9",
"line-replace": "2.0.1",
"livekit-server-sdk": "^2.12.0",
"lodash": "4.17.21",
"luxon": "3.5.0",
"mammoth": "1.8.0",
"mariadb": "3.3.1",
"mime-types": "2.1.35",
"minio": "^8.0.4",
"moment": "2.30.1",
"ms-rest-azure": "3.0.2",
"mysql": "^2.18.1",
"nexmo": "2.9.1", "nexmo": "2.9.1",
"node-cron": "3.0.0", "ngrok": "5.0.0-beta.2",
"node-nlp": "^3.10.2", "node-cron": "3.0.3",
"node-tesseract-ocr": "^2.2.1", "node-html-parser": "6.1.13",
"npm": "7.21.0", "node-nlp": "4.27.0",
"opn": "6.0.0", "node-tesseract-ocr": "2.2.1",
"nodemailer": "6.10.1",
"nodemon": "^3.1.7",
"npm": "10.8.3",
"open": "10.1.0",
"open-docxtemplater-image-module": "1.0.3",
"openai": "4.57.0",
"pdf-extraction": "1.0.2", "pdf-extraction": "1.0.2",
"pdfkit": "^0.13.0", "pdf-parse": "1.1.1",
"phone": "2.4.21", "pdf-to-png-converter": "3.3.0",
"pragmatismo-io-framework": "1.0.20", "pdfjs-dist": "4.6.82",
"prism-media": "1.3.1", "pg": "^8.13.1",
"public-ip": "4.0.4", "phone": "3.1.50",
"puppeteer": "13.7.0", "pizzip": "3.1.7",
"pptxtemplater": "1.0.5",
"pragmatismo-io-framework": "1.1.1",
"prism-media": "1.3.5",
"public-ip": "7.0.1",
"punycode": "2.3.1",
"puppeteer": "23.2.2",
"puppeteer-extra": "3.3.6",
"puppeteer-extra-plugin-minmax": "1.1.2",
"puppeteer-extra-plugin-stealth": "2.11.2",
"qr-scanner": "1.4.2",
"qrcode": "1.5.4",
"qrcode-reader": "^1.0.4",
"qrcode-terminal": "0.12.0",
"readline": "1.3.0", "readline": "1.3.0",
"reflect-metadata": "0.1.13", "reflect-metadata": "0.2.2",
"request-promise": "4.2.5", "rimraf": "6.0.1",
"request-promise-native": "1.0.8",
"rimraf": "3.0.2",
"safe-buffer": "5.2.1", "safe-buffer": "5.2.1",
"scanf": "1.1.2", "scanf": "1.2.0",
"sequelize": "6.5.0", "sequelize": "6.37.3",
"sequelize-cli": "6.2.0", "sequelize-cli": "6.6.2",
"sequelize-typescript": "2.1.0", "sequelize-typescript": "2.1.6",
"simple-git": "2.39.1", "simple-git": "3.26.0",
"speakingurl": "14.0.1", "speakingurl": "14.0.1",
"sppull": "2.7.0", "sqlite3": "5.1.7",
"ssr-for-bots": "1.0.1-c", "ssr-for-bots": "1.0.1-c",
"strict-password-generator": "1.1.2", "strict-password-generator": "1.1.2",
"swagger-client": "2.1.18", "stripe": "^18.0.0",
"tabulator-tables": "^5.2.6", "super-strong-password-generator": "2.0.2",
"tedious": "14.0.0", "super-strong-password-generator-es": "2.0.2",
"svg2img": "^1.0.0-beta.2",
"swagger-client": "3.29.2",
"swagger-ui-dist": "5.17.14",
"tabulator-tables": "6.2.5",
"tedious": "18.6.1",
"textract": "2.5.0", "textract": "2.5.0",
"typescript": "3.6.4", "twilio": "5.2.3",
"url-join": "4.0.1", "twitter-api-v2": "1.17.2",
"vbscript-to-typescript": "1.0.8", "typeorm": "0.3.20",
"typescript": "5.5.4",
"url-join": "5.0.0",
"vhost": "3.0.2",
"vm2": "3.9.19",
"vm2-process": "2.1.5",
"walk-promise": "0.2.0", "walk-promise": "0.2.0",
"washyourmouthoutwithsoap": "1.0.2" "washyourmouthoutwithsoap": "1.0.2",
"webdav-server": "2.6.2",
"webp-converter": "^2.3.3",
"whatsapp-cloud-api": "0.3.1",
"whatsapp-web.js": "1.26.1-alpha.1",
"winston": "3.14.2",
"ws": "8.18.0",
"yaml": "2.5.0",
"yarn": "1.22.22",
"zod-to-json-schema": "3.23.2"
}, },
"devDependencies": { "devDependencies": {
"@types/puppeteer": "5.4.6", "@types/lodash": "^4.17.20",
"@types/url-join": "4.0.0", "@types/node": "^24.1.0",
"@types/winston": "2.4.4", "@types/node-fetch": "^2.6.12",
"ban-sensitive-files": "1.9.15", "@types/qrcode": "1.5.5",
"commitizen": "4.2.4", "@types/url-join": "4.0.3",
"@typescript-eslint/eslint-plugin": "8.4.0",
"@typescript-eslint/parser": "8.4.0",
"ban-sensitive-files": "1.10.5",
"commitizen": "4.3.0",
"cz-conventional-changelog": "3.3.0", "cz-conventional-changelog": "3.3.0",
"dependency-check": "4.1.0", "dependency-check": "4.1.0",
"git-issues": "1.3.1", "git-issues": "1.3.1",
"license-checker": "25.0.1", "license-checker": "25.0.1",
"ngrok": "4.0.1",
"nsp": "3.2.1",
"prettier-standard": "16.4.1", "prettier-standard": "16.4.1",
"semantic-release": "17.4.3", "semantic-release": "24.1.0",
"simple-commit-message": "4.1.2", "simple-commit-message": "4.1.3",
"travis-deploy-once": "5.0.11", "travis-deploy-once": "5.0.11",
"ts-node": "10.0.0", "tslint": "6.1.3",
"tslint": "6.1.2", "tsx": "^4.19.1",
"typedoc": "^0.22.17" "vitest": "2.0.5"
}, },
"eslintConfig": { "eslintConfig": {
"env": { "env": {
@ -204,6 +324,9 @@
"release": { "release": {
"tagFormat": "${version}", "tagFormat": "${version}",
"debug": true, "debug": true,
"branches": [
"main"
],
"verifyConditions": [ "verifyConditions": [
"@semantic-release/github" "@semantic-release/github"
], ],

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -19,11 +17,11 @@
| in the LICENSE file you have received along with this program. | | in the LICENSE file you have received along with this program. |
| | | |
| This program is distributed in the hope that it will be useful, | | This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY without even the implied warranty of | | but WITHOUT ANY WARRANTY without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -36,20 +34,23 @@
'use strict'; 'use strict';
const crypto = require('crypto'); import crypto from 'crypto';
import urlJoin from 'url-join';
import { WaterfallDialog } from 'botbuilder-dialogs'; import { WaterfallDialog } from 'botbuilder-dialogs';
import { GBMinInstance, IGBDialog, GBLog, IGBPackage } from 'botlib'; import { GBMinInstance, IGBDialog } from 'botlib';
const urlJoin = require('url-join'); import { GBDeployer } from '../../core.gbapp/services/GBDeployer.js';
import { GBDeployer } from '../../core.gbapp/services/GBDeployer'; import { GBImporter } from '../../core.gbapp/services/GBImporterService.js';
import { GBImporter } from '../../core.gbapp/services/GBImporterService'; import { Messages } from '../strings.js';
import { Messages } from '../strings'; import { GBAdminService } from '../services/GBAdminService.js';
import { GBAdminService } from '../services/GBAdminService';
import { CollectionUtil } from 'pragmatismo-io-framework'; import { CollectionUtil } from 'pragmatismo-io-framework';
import { SecService } from '../../security.gbapp/services/SecService.js';
import { GBConfigService } from '../../core.gbapp/services/GBConfigService.js';
import { GBServer } from '../../../src/app.js';
import { GBLogEx } from '../../core.gbapp/services/GBLogEx.js';
import { GBUtil } from '../../../src/util.js';
/**
* Dialogs for administration tasks. class AdminDialog extends IGBDialog {
*/
export class AdminDialog extends IGBDialog {
public static isIntentYes(locale, utterance) { public static isIntentYes(locale, utterance) {
return utterance.toLowerCase().match(Messages[locale].affirmative_sentences); return utterance.toLowerCase().match(Messages[locale].affirmative_sentences);
} }
@ -58,15 +59,7 @@ export class AdminDialog extends IGBDialog {
return utterance.toLowerCase().match(Messages[locale].negative_sentences); return utterance.toLowerCase().match(Messages[locale].negative_sentences);
} }
/**
* Setup dialogs flows and define services call.
*
* @param bot The bot adapter.
* @param min The minimal bot instance data.
*/
public static setup(min: GBMinInstance) { public static setup(min: GBMinInstance) {
// Setup services.
const importer = new GBImporter(min.core); const importer = new GBImporter(min.core);
const deployer = new GBDeployer(min.core, importer); const deployer = new GBDeployer(min.core, importer);
@ -75,24 +68,26 @@ export class AdminDialog extends IGBDialog {
min.dialogs.add( min.dialogs.add(
new WaterfallDialog('/admin-auth', [ new WaterfallDialog('/admin-auth', [
async step => { async step => {
min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) { if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) {
return await step.beginDialog('/auth'); return await step.beginDialog('/auth');
} } else {
else {
return await step.next(step.options); return await step.next(step.options);
} }
}, },
async step => { async step => {
min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
const locale = step.context.activity.locale; const locale = step.context.activity.locale;
const prompt = Messages[locale].authenticate; const prompt = Messages[locale].authenticate;
return await min.conversationalService.prompt(min, step, prompt); return await min.conversationalService.prompt(min, step, prompt);
}, },
async step => { async step => {
min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
const locale = step.context.activity.locale; const locale = step.context.activity.locale;
const sensitive = step.context.activity['originalText']; const sensitive = step.context.activity['originalText'];
if (sensitive === min.instance.adminPass) { if (await GBUtil.comparePassword( sensitive, min.instance.adminPass)) {
await min.conversationalService.sendText(min, step, Messages[locale].welcome); await min.conversationalService.sendText(min, step, Messages[locale].welcome);
return await step.endDialog(true); return await step.endDialog(true);
@ -107,24 +102,26 @@ export class AdminDialog extends IGBDialog {
min.dialogs.add( min.dialogs.add(
new WaterfallDialog('/admin', [ new WaterfallDialog('/admin', [
async step => { async step => {
min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) { if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) {
return await step.beginDialog('/auth'); return await step.beginDialog('/auth');
} } else {
else {
return await step.next(step.options); return await step.next(step.options);
} }
}, },
async step => { async step => {
min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
const locale = step.context.activity.locale; const locale = step.context.activity.locale;
const prompt = Messages[locale].authenticate; const prompt = Messages[locale].authenticate;
return await min.conversationalService.prompt(min, step, prompt); return await min.conversationalService.prompt(min, step, prompt);
}, },
async step => { async step => {
min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
const locale = step.context.activity.locale; const locale = step.context.activity.locale;
const sensitive = step.result; const sensitive = step.context.activity['originalText'];
if (sensitive === min.instance.adminPass) { if (await GBUtil.comparePassword( sensitive, min.instance.adminPass)) {
await min.conversationalService.sendText(min, step, Messages[locale].welcome); await min.conversationalService.sendText(min, step, Messages[locale].welcome);
return await min.conversationalService.prompt(min, step, Messages[locale].which_task); return await min.conversationalService.prompt(min, step, Messages[locale].which_task);
@ -135,8 +132,8 @@ export class AdminDialog extends IGBDialog {
} }
}, },
async step => { async step => {
min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
const locale: string = step.context.activity.locale; const locale: string = step.context.activity.locale;
// tslint:disable-next-line:no-unsafe-any
const text: string = step.context.activity['originalText']; const text: string = step.context.activity['originalText'];
const cmdName = text.split(' ')[0]; const cmdName = text.split(' ')[0];
@ -146,36 +143,6 @@ export class AdminDialog extends IGBDialog {
try { try {
if (text === 'quit') { if (text === 'quit') {
return await step.replaceDialog('/'); return await step.replaceDialog('/');
} else if (cmdName === 'deployPackage' || cmdName === 'dp') {
await GBAdminService.deployPackageCommand(min, text, deployer);
return await step.replaceDialog('/admin', { firstRun: false });
} else if (cmdName === 'redeployPackage' || cmdName === 'rp') {
await min.conversationalService.sendText(min, step, 'The package is being *unloaded*...');
await GBAdminService.undeployPackageCommand(text, min);
await min.conversationalService.sendText(min, step, 'Now, *deploying* package...');
await GBAdminService.deployPackageCommand(min, text, deployer);
await min.conversationalService.sendText(
min,
step,
'Package deployed. Just need to rebuild the index... Doing it right now.'
);
await GBAdminService.rebuildIndexPackageCommand(min, deployer);
await min.conversationalService.sendText(min, step, 'Finished importing of that .gbkb package. Thanks.');
return await step.replaceDialog('/admin', { firstRun: false });
} else if (cmdName === 'undeployPackage' || cmdName === 'up') {
await min.conversationalService.sendText(min, step, 'The package is being *undeployed*...');
await GBAdminService.undeployPackageCommand(text, min);
await min.conversationalService.sendText(min, step, 'Package *undeployed*.');
return await step.replaceDialog('/admin', { firstRun: false });
} else if (cmdName === 'rebuildIndex' || cmdName === 'ri' || cmdName === 'Ri') {
await GBAdminService.rebuildIndexPackageCommand(min, deployer);
return await step.replaceDialog('/admin', { firstRun: false });
} else if (cmdName === 'syncBotServer') {
await GBAdminService.syncBotServerCommand(min, deployer);
return await step.replaceDialog('/admin', { firstRun: false });
} else if (cmdName === 'setupSecurity') { } else if (cmdName === 'setupSecurity') {
return await step.beginDialog('/setupSecurity'); return await step.beginDialog('/setupSecurity');
} else { } else {
@ -198,14 +165,15 @@ export class AdminDialog extends IGBDialog {
min.dialogs.add( min.dialogs.add(
new WaterfallDialog('/install', [ new WaterfallDialog('/install', [
async step => { async step => {
min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) { if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) {
return await step.beginDialog('/auth'); return await step.beginDialog('/auth');
} } else {
else {
return await step.next(step.options); return await step.next(step.options);
} }
}, },
async step => { async step => {
min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
step.activeDialog.state.options.args = (step.options as any).args; step.activeDialog.state.options.args = (step.options as any).args;
if (step.activeDialog.state.options.confirm) { if (step.activeDialog.state.options.confirm) {
return await step.next('sim'); return await step.next('sim');
@ -215,17 +183,23 @@ export class AdminDialog extends IGBDialog {
} }
}, },
async step => { async step => {
min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
const locale = step.context.activity.locale; const locale = step.context.activity.locale;
// If the user says yes, starts publishing.
if (AdminDialog.isIntentYes(locale, step.result)) { if (AdminDialog.isIntentYes(locale, step.result)) {
const list = min.core.getParam(min.instance, '.gbapp List', null);
const items = list ? list.split(';') : [];
step.activeDialog.state.options.args; step.activeDialog.state.options.args;
for (let index = 0; index < min.appPackages.length; index++) { for (let i = 0; i < items.length; i++) {
const element = min.appPackages[index]; for (let j = 0; j < min.appPackages.length; j++) {
await element.onExchangeData(min, 'install', null); if (items[i] === min.appPackages[j]['name']) {
// TODO: Filter just to the .gbapp being installed. const element = min.appPackages[i];
await element.onExchangeData(min, 'install', null);
break;
}
}
} }
} else { } else {
await min.conversationalService.sendText(min, step, Messages[locale].publish_canceled); await min.conversationalService.sendText(min, step, Messages[locale].publish_canceled);
@ -235,19 +209,37 @@ export class AdminDialog extends IGBDialog {
); );
min.dialogs.add( min.dialogs.add(
new WaterfallDialog('/publish', [ new WaterfallDialog('/logs', [
async step => { async step => {
min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) { if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) {
return await step.beginDialog('/auth'); return await step.beginDialog('/auth');
} } else {
else {
return await step.next(step.options); return await step.next(step.options);
} }
}, },
async step => { async step => {
if (step.activeDialog.state.options.confirm || process.env.ADMIN_OPEN_PUBLISH === "true") { min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
const logs = await min.core['getLatestLogs']();
await min.conversationalService.sendText(min, step, logs);
return await step.replaceDialog('/ask', { isReturning: true });
}
]));
min.dialogs.add(
new WaterfallDialog('/publish', [
async step => {
min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) {
return await step.beginDialog('/auth');
} else {
return await step.next(step.options);
}
},
async step => {
min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
step.activeDialog.state.options.confirm = true;
if (step.activeDialog.state.options.confirm || process.env.ADMIN_OPEN_PUBLISH === 'true') {
return await step.next('sim'); return await step.next('sim');
} else { } else {
const locale = step.context.activity.locale; const locale = step.context.activity.locale;
@ -255,10 +247,9 @@ export class AdminDialog extends IGBDialog {
} }
}, },
async step => { async step => {
min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
const locale = step.context.activity.locale; const locale = step.context.activity.locale;
// If the user says yes, starts publishing.
if (AdminDialog.isIntentYes(locale, step.result)) { if (AdminDialog.isIntentYes(locale, step.result)) {
let from = step.context.activity.from.id; let from = step.context.activity.from.id;
@ -266,7 +257,7 @@ export class AdminDialog extends IGBDialog {
if (step.activeDialog.state.options.firstTime) { if (step.activeDialog.state.options.firstTime) {
canPublish = true; canPublish = true;
} else { } else {
canPublish = AdminDialog.canPublish(min, from) || process.env.ADMIN_OPEN_PUBLISH === "true"; canPublish = AdminDialog.canPublish(min, from) || process.env.ADMIN_OPEN_PUBLISH === 'true';
} }
if (!canPublish) { if (!canPublish) {
@ -279,6 +270,7 @@ export class AdminDialog extends IGBDialog {
} }
}, },
async step => { async step => {
min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
const locale = step.context.activity.locale; const locale = step.context.activity.locale;
if (!step.result) { if (!step.result) {
await min.conversationalService.sendText(min, step, Messages[locale].publish_must_be_admin); await min.conversationalService.sendText(min, step, Messages[locale].publish_must_be_admin);
@ -297,44 +289,70 @@ export class AdminDialog extends IGBDialog {
const packages = []; const packages = [];
let skipError = false; let skipError = false;
if (filename === null || filename === '') { if (!filename || filename === '') {
await min.conversationalService.sendText(min, step, `Starting publishing for ${botId} packages...`); await min.conversationalService.sendText(min, step, `Starting publishing for ${botId} packages...`);
packages.push(`${botId}.gbkb`);
packages.push(`${botId}.gbtheme`);
packages.push(`${botId}.gbdialog`);
packages.push(`${botId}.gbot`); packages.push(`${botId}.gbot`);
packages.push(`${botId}.gbtheme`);
packages.push(`${botId}.gbdrive`);
packages.push(`${botId}.gbdata`);
packages.push(`${botId}.gbkb`);
packages.push(`${botId}.gbdialog`);
skipError = true; skipError = true;
} else { } else {
await min.conversationalService.sendText(min, step, `Starting publishing for ${filename}...`);
packages.push(filename); packages.push(filename);
} }
await CollectionUtil.asyncForEach(packages, async packageName => { await CollectionUtil.asyncForEach(packages, async packageName => {
try { let cmd1;
let cmd1;
if (packageName.indexOf('.') !== -1) {
cmd1 = `deployPackage ${process.env.STORAGE_SITE} /${process.env.STORAGE_LIBRARY}/${botId}.gbai/${packageName}`;
} else {
cmd1 = `deployPackage ${packageName}`;
}
if ((await (deployer as any).getStoragePackageByName(min.instance.instanceId, packageName)) !== null &&
!process.env.DONT_DOWNLOAD
) {
const cmd2 = `undeployPackage ${packageName}`;
await GBAdminService.undeployPackageCommand(cmd2, min);
}
await GBAdminService.deployPackageCommand(min, cmd1, deployer);
await min.conversationalService.sendText(min, step, `Finished publishing ${packageName}.`);
} catch (error) {
GBLog.error(error);
if (!skipError) {
await min.conversationalService.sendText(min, step, `ERROR: ${error}`);
return await step.replaceDialog('/ask', { isReturning: true }); if (
} packageName.toLowerCase() === 'gbdialog' ||
packageName.toLowerCase() === 'gbdrive' ||
packageName.toLowerCase() === 'gbdata' ||
packageName.toLowerCase() === 'gbkb' ||
packageName.toLowerCase() === 'gbot' ||
packageName.toLowerCase() === 'gbtheme'
) {
packageName = `${min.botId}.${packageName}`;
} }
if (packageName.indexOf('.') !== -1) {
cmd1 = `deployPackage ${process.env.STORAGE_SITE} /${GBConfigService.get('STORAGE_LIBRARY')}/${botId}.gbai/${packageName}`;
} else {
cmd1 = `deployPackage ${packageName}`;
}
if (
(await (deployer as any).getStoragePackageByName(min.instance.instanceId, packageName)) !== null &&
!process.env.DONT_DOWNLOAD
) {
const cmd2 = `undeployPackage ${packageName}`;
await GBAdminService.undeployPackageCommand(cmd2, min);
}
let sec = new SecService();
const member = step.context.activity.from;
const user = await sec.ensureUser(
min,
member.id,
member.name,
'',
'web',
member.name,
null
);
await GBAdminService.deployPackageCommand(min, user, cmd1, deployer);
// .gbot updates severals keys in instantece, so min must be updated.
const activeMin = GBServer.globals.minInstances.find(p=> p.botId === min.botId);
if (activeMin){
min = activeMin;
}
}); });
await min.conversationalService.sendText(min, step, Messages[locale].publish_success); await min.conversationalService.sendText(min, step, `Training is finished.`);
if (!step.activeDialog.state.options.confirm) { if (!step.activeDialog.state.options.confirm) {
return await step.replaceDialog('/ask', { isReturning: true }); return await step.replaceDialog('/ask', { isReturning: true });
} else { } else {
@ -345,17 +363,11 @@ export class AdminDialog extends IGBDialog {
); );
} }
/**
* Check if the specified phone can receive a message by running
* the /broadcast command with specific phone numbers.
* @param phone Phone number to check (eg.: +5521900002233)
*/
public static canPublish(min: GBMinInstance, phone: string): Boolean { public static canPublish(min: GBMinInstance, phone: string): Boolean {
if (process.env.SECURITY_CAN_PUBLISH !== undefined) { if (process.env.SECURITY_CAN_PUBLISH !== undefined) {
let list = process.env.SECURITY_CAN_PUBLISH.split(';'); let list = process.env.SECURITY_CAN_PUBLISH.split(';');
const canPublish = const canPublish = min.core.getParam(min.instance, 'Can Publish', null);
min.core.getParam(min.instance, 'Can Publish', null);
if (canPublish) { if (canPublish) {
list = list.concat(canPublish.split(';')); list = list.concat(canPublish.split(';'));
} }
@ -364,7 +376,9 @@ export class AdminDialog extends IGBDialog {
if (!result && min.instance.params) { if (!result && min.instance.params) {
const params = JSON.parse(min.instance.params); const params = JSON.parse(min.instance.params);
return list.includes(params['Can Publish']); if (params) {
return list.includes(params['Can Publish']);
}
} }
return result; return result;
} }
@ -374,56 +388,72 @@ export class AdminDialog extends IGBDialog {
min.dialogs.add( min.dialogs.add(
new WaterfallDialog('/setupSecurity', [ new WaterfallDialog('/setupSecurity', [
async step => { async step => {
min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
const tokenName = step.activeDialog.state.tokenName = step.options['args'];
if (tokenName) {
step.activeDialog.state.clientId = min.core.getParam<string>(min.instance, `${tokenName} Client ID`, null),
step.activeDialog.state.host = min.core.getParam<string>(min.instance, `${tokenName} Host`, null),
step.activeDialog.state.tenant = min.core.getParam<string>(min.instance, `${tokenName} Tenant`, null)
}
if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) { if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) {
return await step.beginDialog('/auth'); return await step.beginDialog('/auth');
} } else {
else {
return await step.next(step.options); return await step.next(step.options);
} }
}, },
async step => { async step => {
min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
if (step.activeDialog.state.tokenName) {
return await step.next(step.options);
}
const locale = step.context.activity.locale; const locale = step.context.activity.locale;
const prompt = Messages[locale].enter_authenticator_tenant; const prompt = Messages[locale].enter_authenticator_tenant;
return await min.conversationalService.prompt(min, step, prompt); return await min.conversationalService.prompt(min, step, prompt);
}, },
async step => { async step => {
step.activeDialog.state.authenticatorTenant = step.result; min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
if (step.activeDialog.state.tokenName) {
return await step.next(step.options);
}
step.activeDialog.state.authenticatorTenant = step.context.activity['originalText'];
const locale = step.context.activity.locale; const locale = step.context.activity.locale;
const prompt = Messages[locale].enter_authenticator_authority_host_url; const prompt = Messages[locale].enter_authenticator_authority_host_url;
return await min.conversationalService.prompt(min, step, prompt); return await min.conversationalService.prompt(min, step, prompt);
}, },
async step => { async step => {
step.activeDialog.state.authenticatorAuthorityHostUrl = step.result; min = GBServer.globals.minInstances.find(p => p.botId === min.botId);
step.activeDialog.state.authenticatorAuthorityHostUrl = step.context.activity['originalText'];
min.instance.authenticatorTenant = const tokenName = step.activeDialog.state.tokenName;
step.activeDialog.state.authenticatorTenant;
min.instance.authenticatorAuthorityHostUrl =
step.activeDialog.state.authenticatorAuthorityHostUrl;
await min.adminService.updateSecurityInfo( if (!tokenName) {
min.instance.instanceId, min.instance.authenticatorAuthorityHostUrl = step.activeDialog.state.authenticatorAuthorityHostUrl;
step.activeDialog.state.authenticatorTenant, min.instance.authenticatorTenant = step.activeDialog.state.authenticatorTenant;
step.activeDialog.state.authenticatorAuthorityHostUrl
);
await min.adminService.updateSecurityInfo(
min.instance.instanceId,
tokenName ? step.activeDialog.state.tenant : step.activeDialog.state.authenticatorTenant,
tokenName ? step.activeDialog.state.host : step.activeDialog.state.authenticatorAuthorityHostUrl
);
}
const locale = step.context.activity.locale; const locale = step.context.activity.locale;
const buf = Buffer.alloc(16); const buf = Buffer.alloc(16);
const state = `${min.instance.instanceId}${crypto.randomFillSync(buf).toString('hex')}`; const state = `${min.instance.instanceId}${crypto.randomFillSync(buf).toString('hex')}`;
min.adminService.setValue(min.instance.instanceId, 'AntiCSRFAttackState', state); min.adminService.setValue(min.instance.instanceId, `${tokenName}AntiCSRFAttackState`, state);
const redirectUri = urlJoin( const redirectUri = urlJoin(process.env.BOT_URL, min.instance.botId,
min.instance.botEndpoint, tokenName ? `/token?value=${tokenName}` : '/token');
min.instance.botId, const scope = tokenName ? '' : 'https://graph.microsoft.com/.default';
'/token' const host = tokenName ? step.activeDialog.state.host : 'https://login.microsoftonline.com'
); const tenant = tokenName ? step.activeDialog.state.tenant : min.instance.authenticatorTenant;
const url = `https://login.microsoftonline.com/${step.activeDialog.state.authenticatorTenant const clientId = tokenName ? step.activeDialog.state.clientId : (min.instance.marketplaceId ?
}/oauth2/authorize?client_id=${min.instance.marketplaceId min.instance.marketplaceId : GBConfigService.get('MARKETPLACE_ID'));
}&response_type=code&redirect_uri=${redirectUri const oauth2 = tokenName ? 'oauth' : 'oauth2';
}&scope=https://graph.microsoft.com/.default&state=${state}&response_mode=query`; const url = `${host}/${tenant}/${oauth2}/authorize?client_id=${clientId}&response_type=code&redirect_uri=${redirectUri}&scope=${scope}&state=${state}&response_mode=query`;
await min.conversationalService.sendText(min, step, Messages[locale].consent(url)); await min.conversationalService.sendText(min, step, Messages[locale].consent(url));
@ -433,3 +463,5 @@ export class AdminDialog extends IGBDialog {
); );
} }
} }
export { AdminDialog };

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -38,8 +36,10 @@
import { GBDialogStep, GBLog, GBMinInstance, IGBCoreService, IGBPackage } from 'botlib'; import { GBDialogStep, GBLog, GBMinInstance, IGBCoreService, IGBPackage } from 'botlib';
import { Sequelize } from 'sequelize-typescript'; import { Sequelize } from 'sequelize-typescript';
import { AdminDialog } from './dialogs/AdminDialog'; import { AdminDialog } from './dialogs/AdminDialog.js';
import { GuaribasAdmin } from './models/AdminModel'; import { GuaribasAdmin } from './models/AdminModel.js';
import { GBLogEx } from '../core.gbapp/services/GBLogEx.js';
/** /**
* The package for admin.gbapp. * The package for admin.gbapp.
@ -47,28 +47,27 @@ import { GuaribasAdmin } from './models/AdminModel';
export class GBAdminPackage implements IGBPackage { export class GBAdminPackage implements IGBPackage {
public sysPackages: IGBPackage[]; public sysPackages: IGBPackage[];
public async getDialogs(min: GBMinInstance) { public async getDialogs (min: GBMinInstance) {
GBLog.verbose(`getDialogs called.`); GBLogEx.verbose(min,`getDialogs called.`);
} }
public async unloadPackage(core: IGBCoreService): Promise<void> { public async unloadPackage (core: IGBCoreService): Promise<void> {
GBLog.verbose(`unloadPackage called.`); GBLog.verbose(`unloadPackage called.`);
} }
public async unloadBot(min: GBMinInstance): Promise<void> { public async unloadBot (min: GBMinInstance): Promise<void> {
GBLog.verbose(`unloadBot called.`); GBLogEx.verbose(min,`unloadBot called.`);
} }
public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise<void> { public async onNewSession (min: GBMinInstance, step: GBDialogStep): Promise<void> {
GBLog.verbose(`onNewSession called.`); GBLogEx.verbose(min, `onNewSession called.`);
} }
public async onExchangeData(min: GBMinInstance, kind: string, data: any) { public async onExchangeData (min: GBMinInstance, kind: string, data: any) {
GBLog.verbose(`onExchangeData called.`); GBLogEx.verbose(min,`onExchangeData called.`);
} }
public async loadPackage(core: IGBCoreService, sequelize: Sequelize): Promise<void> { public async loadPackage (core: IGBCoreService, sequelize: Sequelize): Promise<void> {
core.sequelize.addModels([GuaribasAdmin]); core.sequelize.addModels([GuaribasAdmin]);
} }
public async loadBot(min: GBMinInstance): Promise<void> { public async loadBot (min: GBMinInstance): Promise<void> {
AdminDialog.setup(min); AdminDialog.setup(min);
} }
} }

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -36,36 +34,27 @@
'use strict'; 'use strict';
import { import { Column, CreatedAt, DataType, Model, Table, UpdatedAt } from 'sequelize-typescript';
Column,
CreatedAt,
DataType,
Model,
Table,
UpdatedAt
} from 'sequelize-typescript';
/** /**
* General settings store. * General settings store.
*/ */
@Table @Table
export class GuaribasAdmin extends Model<GuaribasAdmin> { export class GuaribasAdmin extends Model<GuaribasAdmin> {
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public instanceId: number; declare instanceId: number;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public key: string; declare key: string;
@Column(DataType.STRING(4000)) @Column(DataType.STRING(4000))
public value: string; declare value: string;
@Column(DataType.DATE) @Column(DataType.DATE)
@CreatedAt @CreatedAt
public createdAt: Date; declare createdAt: Date;
@Column(DataType.DATE) @Column(DataType.DATE)
@UpdatedAt @UpdatedAt
public updatedAt: Date; declare updatedAt: Date;
} }

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -37,20 +35,26 @@
'use strict'; 'use strict';
import { AuthenticationContext, TokenResponse } from 'adal-node'; import { AuthenticationContext, TokenResponse } from 'adal-node';
import { GBLog, GBMinInstance, IGBAdminService, IGBCoreService, IGBDeployer, IGBInstance } from 'botlib'; import { GBError, GBLog, GBMinInstance, IGBAdminService, IGBCoreService, IGBDeployer, IGBInstance } from 'botlib';
import { FindOptions } from 'sequelize/types'; import { FindOptions } from 'sequelize/types';
const urlJoin = require('url-join'); import urlJoin from 'url-join';
import { AzureDeployerService } from '../../azuredeployer.gbapp/services/AzureDeployerService'; import { AzureDeployerService } from '../../azuredeployer.gbapp/services/AzureDeployerService.js';
import { GuaribasInstance } from '../../core.gbapp/models/GBModel'; import { GuaribasInstance } from '../../core.gbapp/models/GBModel.js';
import { GBConfigService } from '../../core.gbapp/services/GBConfigService'; import { GBConfigService } from '../../core.gbapp/services/GBConfigService.js';
import { GBDeployer } from '../../core.gbapp/services/GBDeployer'; import { GBDeployer } from '../../core.gbapp/services/GBDeployer.js';
import { GBImporter } from '../../core.gbapp/services/GBImporterService'; import { GBImporter } from '../../core.gbapp/services/GBImporterService.js';
import { GBSharePointService } from '../../sharepoint.gblib/services/SharePointService'; import { GBSharePointService } from '../../sharepoint.gblib/services/SharePointService.js';
import { GuaribasAdmin } from '../models/AdminModel'; import { GuaribasAdmin } from '../models/AdminModel.js';
const Path = require('path'); import msRestAzure from 'ms-rest-azure';
const msRestAzure = require('ms-rest-azure'); import path from 'path';
const PasswordGenerator = require('strict-password-generator').default; import { caseSensitive_Numbs_SpecialCharacters_PW, lowercase_PW } from 'super-strong-password-generator';
const crypto = require("crypto"); import crypto from 'crypto';
import fs from 'fs/promises';
import { GBServer } from '../../../src/app.js';
import { GuaribasUser } from '../../security.gbapp/models/index.js';
import { DialogKeywords } from '../../basic.gblib/services/DialogKeywords.js';
import { GBLogEx } from '../../core.gbapp/services/GBLogEx.js';
import { GBUtil } from '../../../src/util.js';
/** /**
* Services for server administration. * Services for server administration.
@ -68,21 +72,19 @@ export class GBAdminService implements IGBAdminService {
} }
public static generateUuid(): string { public static generateUuid(): string {
return msRestAzure.generateUuid(); return crypto.randomUUID();
} }
public static getNodeVersion() { public static async getNodeVersion() {
const packageJson = urlJoin(process.cwd(), 'package.json'); const packageJson = urlJoin(process.cwd(), 'package.json');
// tslint:disable-next-line: non-literal-require const pkg = JSON.parse(await fs.readFile(packageJson, 'utf8'));
const pjson = require(packageJson); return pkg.engines.node.replace('=', '');
return pjson.engines.node.replace('=', '');
} }
public static async getADALTokenFromUsername(username: string, password: string) { public static async getADALTokenFromUsername(username: string, password: string) {
const credentials = await GBAdminService.getADALCredentialsFromUsername(username, password); const credentials = await GBAdminService.getADALCredentialsFromUsername(username, password);
return credentials.tokenCache._entries[0].accessToken; return (credentials as any).tokenCache._entries[0].accessToken;
} }
public static async getADALCredentialsFromUsername(username: string, password: string) { public static async getADALCredentialsFromUsername(username: string, password: string) {
@ -90,68 +92,52 @@ export class GBAdminService implements IGBAdminService {
} }
public static getMobileCode() { public static getMobileCode() {
const passwordGenerator = new PasswordGenerator(); return this.getNumberIdentifier(6);
const options = {
upperCaseAlpha: false,
lowerCaseAlpha: false,
number: true,
specialCharacter: false,
minimumLength: 6,
maximumLength: 6
};
return passwordGenerator.generatePassword(options);
} }
public static getRndPassword(): string { public static getRndPassword(): string {
const passwordGenerator = new PasswordGenerator(); let password = caseSensitive_Numbs_SpecialCharacters_PW(15);
const options = {
upperCaseAlpha: true,
lowerCaseAlpha: true,
number: true,
specialCharacter: true,
minimumLength: 14,
maximumLength: 14
};
let password = passwordGenerator.generatePassword(options);
password = password.replace(/[\@\[\=\:\;\?\"\'\#]/gi, '*'); password = password.replace(/[\@\[\=\:\;\?\"\'\#]/gi, '*');
return password; const removeRepeatedChars = (s, r) => {
} let res = '',
last = null,
public static getRndReadableIdentifier() { counter = 0;
const passwordGenerator = new PasswordGenerator(); s.split('').forEach(char => {
const options = { if (char == last) counter++;
upperCaseAlpha: false, else {
lowerCaseAlpha: true, counter = 0;
number: false, last = char;
specialCharacter: false, }
minimumLength: 14, if (counter < r) res += char;
maximumLength: 14 });
return res;
}; };
return passwordGenerator.generatePassword(options); return removeRepeatedChars(password, 1);
} }
public static getNumberIdentifier() { public static getRndReadableIdentifier(): string {
const passwordGenerator = new PasswordGenerator(); return lowercase_PW(14);
const options = { }
upperCaseAlpha: false,
lowerCaseAlpha: false,
number: true,
specialCharacter: false,
minimumLength: 14,
maximumLength: 14
};
return passwordGenerator.generatePassword(options); public static getNumberIdentifier(digits: number = 14): string {
if (digits <= 0) {
throw new Error('Number of digits should be greater than 0.');
}
const min = 10 ** (digits - 1);
const max = 10 ** digits - 1;
const randomNumber = Math.floor(Math.random() * (max - min + 1)) + min;
return randomNumber.toString();
} }
/** /**
* @see https://stackoverflow.com/a/52171480 * @see https://stackoverflow.com/a/52171480
*/ */
public static getHash(str, seed = 0) { public static getHash(str: string, seed = 0) {
let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed; let h1 = 0xdeadbeef ^ seed,
h2 = 0x41c6ce57 ^ seed;
for (let i = 0, ch; i < str.length; i++) { for (let i = 0, ch; i < str.length; i++) {
ch = str.charCodeAt(i); ch = str.charCodeAt(i);
h1 = Math.imul(h1 ^ ch, 2654435761); h1 = Math.imul(h1 ^ ch, 2654435761);
@ -162,48 +148,40 @@ export class GBAdminService implements IGBAdminService {
return 4294967296 * (2097151 & h2) + (h1 >>> 0); return 4294967296 * (2097151 & h2) + (h1 >>> 0);
} }
public static async undeployPackageCommand(text: any, min: GBMinInstance) { public static async undeployPackageCommand(text: string, min: GBMinInstance) {
const packageName = text.split(' ')[1]; const packageName = text.split(' ')[1];
const importer = new GBImporter(min.core); const importer = new GBImporter(min.core);
const deployer = new GBDeployer(min.core, importer); const deployer = new GBDeployer(min.core, importer);
const localFolder = Path.join('work', `${min.instance.botId}.gbai`, Path.basename(packageName)); const packagePath = GBUtil.getGBAIPath(min.botId, null, packageName);
const localFolder = path.join('work', packagePath);
await deployer.undeployPackageFromLocalPath(min.instance, localFolder); await deployer.undeployPackageFromLocalPath(min.instance, localFolder);
} }
public static isSharePointPath(path: string) { public static isSharePointPath(path: string) {
return path.indexOf('sharepoint.com') !== -1; return path.indexOf('sharepoint.com') !== -1;
} }
public static async deployPackageCommand(min: GBMinInstance, text: string, deployer: IGBDeployer) { public static async deployPackageCommand(
min: GBMinInstance,
user: GuaribasUser,
text: string,
deployer: IGBDeployer
) {
const packageName = text.split(' ')[1]; const packageName = text.split(' ')[1];
if (!this.isSharePointPath(packageName)) { const folderName = text.substring(text.indexOf(packageName) + packageName.length + 1);
const additionalPath = GBConfigService.get('ADDITIONAL_DEPLOY_PATH'); const packageType = path.extname(folderName).substr(1);
if (additionalPath === undefined) { const gbaiPath = GBUtil.getGBAIPath(min.instance.botId, packageType, null);
throw new Error('ADDITIONAL_DEPLOY_PATH is not set and deployPackage was called.'); const localFolder = path.join('work', gbaiPath);
}
await deployer.deployPackage(min, urlJoin(additionalPath, packageName));
} else {
const siteName = text.split(' ')[1];
const folderName = text.split(' ')[2];
const s = new GBSharePointService(); await deployer['deployPackage2'](min, user, localFolder, true);
const localFolder = Path.join('work', `${min.instance.botId}.gbai`, Path.basename(folderName));
// .gbot packages are handled using storage API, so no download
// of local resources is required.
await deployer['downloadFolder'](min,
Path.join('work', `${min.instance.botId}.gbai`),
Path.basename(folderName));
await deployer.deployPackage(min, localFolder);
}
} }
public static async rebuildIndexPackageCommand(min: GBMinInstance, deployer: IGBDeployer) { public static async rebuildIndexPackageCommand(min: GBMinInstance, deployer: GBDeployer) {
await deployer.rebuildIndex( const service = await AzureDeployerService.createInstance(deployer);
min.instance, const searchIndex = min.instance.searchIndex
new AzureDeployerService(deployer).getKBSearchSchema(min.instance.searchIndex) ? min.instance.searchIndex
); : GBServer.globals.minBoot.instance.searchIndex;
await deployer.rebuildIndex(min.instance, service.getKBSearchSchema(searchIndex));
} }
public static async syncBotServerCommand(min: GBMinInstance, deployer: GBDeployer) { public static async syncBotServerCommand(min: GBMinInstance, deployer: GBDeployer) {
@ -214,7 +192,7 @@ export class GBAdminService implements IGBAdminService {
public async setValue(instanceId: number, key: string, value: string) { public async setValue(instanceId: number, key: string, value: string) {
const options = <FindOptions>{ where: {} }; const options = <FindOptions>{ where: {} };
options.where = { key: key }; options.where = { key: key, instanceId: instanceId };
let admin = await GuaribasAdmin.findOne(options); let admin = await GuaribasAdmin.findOne(options);
if (admin === null) { if (admin === null) {
admin = new GuaribasAdmin(); admin = new GuaribasAdmin();
@ -243,58 +221,117 @@ export class GBAdminService implements IGBAdminService {
const options = <FindOptions>{ where: {} }; const options = <FindOptions>{ where: {} };
options.where = { key: key, instanceId: instanceId }; options.where = { key: key, instanceId: instanceId };
const obj = await GuaribasAdmin.findOne(options); const obj = await GuaribasAdmin.findOne(options);
return obj.value; return obj.value;
} }
public async acquireElevatedToken(instanceId: number): Promise<string> { public async acquireElevatedToken(
// TODO: Use boot bot as base for authentication. instanceId: number,
root: boolean = false,
tokenName: string = '',
clientId: string = null,
clientSecret: string = null,
host: string = null,
tenant: string = null
): Promise<string> {
if (root) {
const minBoot = GBServer.globals.minBoot;
instanceId = minBoot.instance.instanceId;
}
GBLogEx.info(instanceId, `Acquiring token for instanceId: ${instanceId} ${tokenName} (root: ${root}).`);
const botId = GBConfigService.get('BOT_ID'); let expiresOnV;
instanceId = (await this.core.loadInstanceByBotId(botId)).instanceId; try {
expiresOnV = await this.getValue(instanceId, `${tokenName}expiresOn`);
} catch (error) {
throw new Error(`/setupSecurity is required before running /publish.`);
}
return new Promise<string>(async (resolve, reject) => { return new Promise<string>(async (resolve, reject) => {
const instance = await this.core.loadInstanceById(instanceId); const instance = await this.core.loadInstanceById(instanceId);
const expiresOn = new Date(await this.getValue(instanceId, 'expiresOn')); const expiresOn = new Date(expiresOnV);
if (expiresOn.getTime() > new Date().getTime()) { if (expiresOn.getTime() > new Date().getTime()) {
const accessToken = await this.getValue(instanceId, 'accessToken'); const accessToken = await this.getValue(instanceId, `${tokenName}accessToken`);
resolve(accessToken); resolve(accessToken);
} else { } else {
const authorizationUrl = urlJoin( if (tokenName && !root) {
instance.authenticatorAuthorityHostUrl, const refreshToken = await this.getValue(instanceId, `${tokenName}refreshToken`);
instance.authenticatorTenant,
'/oauth2/authorize'
);
const refreshToken = await this.getValue(instanceId, 'refreshToken'); let url = urlJoin(host, tenant, 'oauth/token');
const resource = 'https://graph.microsoft.com'; let buff = new Buffer(`${clientId}:${clientSecret}`);
const authenticationContext = new AuthenticationContext(authorizationUrl); const base64 = buff.toString('base64');
authenticationContext.acquireTokenWithRefreshToken( const options = {
refreshToken, method: 'POST',
instance.marketplaceId, headers: {
instance.marketplacePassword, Accept: '1.0',
resource, Authorization: `Basic ${base64}`,
async (err, res) => { 'Content-Type': 'application/x-www-form-urlencoded'
if (err !== null) { },
reject(err); body: new URLSearchParams({
} else { grant_type: 'refresh_token',
const token = res as TokenResponse; refresh_token: refreshToken
try { })
await this.setValue(instanceId, 'accessToken', token.accessToken); };
await this.setValue(instanceId, 'refreshToken', token.refreshToken); const result = await fetch(url, options);
await this.setValue(instanceId, 'expiresOn', token.expiresOn.toString());
resolve(token.accessToken); if (result.status != 200) {
} catch (error) { const text = await result.text();
throw new Error(`acquireElevatedToken refreshing token: ${result.status}: ${result.statusText} ${text}.`);
}
const text = await result.text();
const token = JSON.parse(text);
// Saves token to the database.
await this.setValue(instanceId, `${tokenName}accessToken`, token['access_token']);
await this.setValue(instanceId, `${tokenName}refreshToken`, token['refresh_token']);
await this.setValue(
instanceId,
`${tokenName}expiresOn`,
new Date(Date.now() + token['expires_in'] * 1000).toString()
);
await this.setValue(instanceId, `${tokenName}AntiCSRFAttackState`, null);
resolve(token['access_token']);
} else {
const oauth2 = tokenName ? 'oauth' : 'oauth2';
const authorizationUrl = urlJoin(
tokenName ? host : instance.authenticatorAuthorityHostUrl,
tokenName ? tenant : instance.authenticatorTenant,
`/${oauth2}/authorize`
);
const refreshToken = await this.getValue(instanceId, `${tokenName}refreshToken`);
const resource = tokenName ? '' : 'https://graph.microsoft.com';
const authenticationContext = new AuthenticationContext(authorizationUrl);
authenticationContext.acquireTokenWithRefreshToken(
refreshToken,
tokenName ? clientId : instance.marketplaceId,
tokenName ? clientSecret : instance.marketplacePassword,
resource,
async (err, res) => {
if (err !== null) {
reject(err); reject(err);
} else {
const token = res as TokenResponse;
try {
await this.setValue(instanceId, `${tokenName}accessToken`, token.accessToken);
await this.setValue(instanceId, `${tokenName}refreshToken`, token.refreshToken);
await this.setValue(instanceId, `${tokenName}expiresOn`, token.expiresOn.toString());
resolve(token.accessToken);
} catch (error) {
reject(err);
}
} }
} }
} );
); }
} }
}); });
} }
public async publish(min: GBMinInstance, packageName: string, republish: boolean): Promise<void> { } public async publish(min: GBMinInstance, packageName: string, republish: boolean): Promise<void> {}
} }

View file

@ -1,9 +1,9 @@
export const Messages = { export const Messages = {
'en-US': { 'en-US': {
authenticate: 'Please, authenticate:', authenticate: 'Please, authenticate:',
welcome: 'Welcome to Pragmatismo.io GeneralBots Administration.', welcome: 'Welcome to pragmatismo.com.br GeneralBots Administration.',
which_task: 'Which task do you wanna run now?', which_task: 'Which task do you wanna run now?',
working: (command) => `I'm working on ${command}...`, working: command => `I'm working on ${command}...`,
finished_working: 'Done.', finished_working: 'Done.',
unknown_command: text => unknown_command: text =>
`Well, but ${text} is not a administrative General Bots command, I will try to search for it.`, `Well, but ${text} is not a administrative General Bots command, I will try to search for it.`,
@ -12,7 +12,7 @@ export const Messages = {
deployPackage: text => `Deploying package ${text}...`, deployPackage: text => `Deploying package ${text}...`,
redeployPackage: text => `Redeploying package ${text}...`, redeployPackage: text => `Redeploying package ${text}...`,
packageUndeployed: text => `√ Package ${text} undeployed...`, packageUndeployed: text => `√ Package ${text} undeployed...`,
consent: (url) => `Please, consent access to this app at: [Microsoft Online](${url}).`, consent: url => `Please, consent access to this app at: [Microsoft Online](${url}).`,
wrong_password: 'Sorry, wrong password. Please, try again.', wrong_password: 'Sorry, wrong password. Please, try again.',
enter_authenticator_tenant: 'Enter the Authenticator Tenant (eg.: domain.onmicrosoft.com):', enter_authenticator_tenant: 'Enter the Authenticator Tenant (eg.: domain.onmicrosoft.com):',
enter_authenticator_authority_host_url: 'Enter the Authority Host URL (eg.: https://login.microsoftonline.com): ', enter_authenticator_authority_host_url: 'Enter the Authority Host URL (eg.: https://login.microsoftonline.com): ',
@ -26,9 +26,9 @@ export const Messages = {
}, },
'pt-BR': { 'pt-BR': {
authenticate: 'Please, authenticate:', authenticate: 'Please, authenticate:',
welcome: 'Welcome to Pragmatismo.io GeneralBots Administration.', welcome: 'Welcome to pragmatismo.com.br GeneralBots Administration.',
which_task: 'Which task do you wanna run now?', which_task: 'Which task do you wanna run now?',
working: (command) => `I'm working on ${command}...`, working: command => `I'm working on ${command}...`,
finished_working: 'Done.', finished_working: 'Done.',
unknown_command: text => unknown_command: text =>
`Well, but ${text} is not a administrative General Bots command, I will try to search for it.`, `Well, but ${text} is not a administrative General Bots command, I will try to search for it.`,
@ -37,7 +37,7 @@ export const Messages = {
deployPackage: text => `Deploying package ${text}...`, deployPackage: text => `Deploying package ${text}...`,
redeployPackage: text => `Redeploying package ${text}...`, redeployPackage: text => `Redeploying package ${text}...`,
packageUndeployed: text => `Package ${text} undeployed...`, packageUndeployed: text => `Package ${text} undeployed...`,
consent: (url) => `Please, consent access to this app at: [Microsoft Online](${url}).`, consent: url => `Please, consent access to this app at: [Microsoft Online](${url}).`,
wrong_password: 'Sorry, wrong password. Please, try again.', wrong_password: 'Sorry, wrong password. Please, try again.',
enter_authenticator_tenant: 'Enter the Authenticator Tenant (eg.: domain.onmicrosoft.com):', enter_authenticator_tenant: 'Enter the Authenticator Tenant (eg.: domain.onmicrosoft.com):',
enter_authenticator_authority_host_url: 'Enter the Authority Host URL (eg.: https://login.microsoftonline.com): ', enter_authenticator_authority_host_url: 'Enter the Authority Host URL (eg.: https://login.microsoftonline.com): ',

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -38,35 +36,33 @@
import { GBDialogStep, GBLog, GBMinInstance, IGBCoreService, IGBPackage } from 'botlib'; import { GBDialogStep, GBLog, GBMinInstance, IGBCoreService, IGBPackage } from 'botlib';
import { Sequelize } from 'sequelize-typescript'; import { Sequelize } from 'sequelize-typescript';
import { GuaribasConversation, GuaribasConversationMessage } from './models'; import { GuaribasConversation, GuaribasConversationMessage } from './models/index.js';
/** /**
* .gblib Package handler. * .gblib Package handler.
*/ */
export class GBAnalyticsPackage implements IGBPackage { export class GBAnalyticsPackage implements IGBPackage {
public sysPackages: IGBPackage[]; public sysPackages: IGBPackage[];
public async getDialogs(min: GBMinInstance) { public async getDialogs (min: GBMinInstance) {
GBLog.verbose(`getDialogs called.`); GBLog.verbose(`getDialogs called.`);
} }
public async loadPackage(core: IGBCoreService, sequelize: Sequelize): Promise<void> { public async loadPackage (core: IGBCoreService, sequelize: Sequelize): Promise<void> {
GBLog.verbose(`loadPackage called.`); GBLog.verbose(`loadPackage called.`);
core.sequelize.addModels([GuaribasConversation, GuaribasConversationMessage]); core.sequelize.addModels([GuaribasConversation, GuaribasConversationMessage]);
} }
public async unloadPackage(core: IGBCoreService): Promise<void> { public async unloadPackage (core: IGBCoreService): Promise<void> {
GBLog.verbose(`unloadPackage called.`); GBLog.verbose(`unloadPackage called.`);
} }
public async loadBot(min: GBMinInstance): Promise<void> { public async loadBot (min: GBMinInstance): Promise<void> {
GBLog.verbose(`loadBot called.`); GBLog.verbose(`loadBot called.`);
} }
public async unloadBot(min: GBMinInstance): Promise<void> { public async unloadBot (min: GBMinInstance): Promise<void> {
GBLog.verbose(`unloadBot called.`); GBLog.verbose(`unloadBot called.`);
} }
public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise<void> { public async onNewSession (min: GBMinInstance, step: GBDialogStep): Promise<void> {
GBLog.verbose(`onNewSession called.`); GBLog.verbose(`onNewSession called.`);
} }
public async onExchangeData(min: GBMinInstance, kind: string, data: any) { public async onExchangeData (min: GBMinInstance, kind: string, data: any) {
GBLog.verbose(`onExchangeData called.`); GBLog.verbose(`onExchangeData called.`);
} }
} }

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -54,58 +52,61 @@ import {
UpdatedAt UpdatedAt
} from 'sequelize-typescript'; } from 'sequelize-typescript';
import { GuaribasChannel, GuaribasInstance } from '../../core.gbapp/models/GBModel'; import { GuaribasChannel, GuaribasInstance } from '../../core.gbapp/models/GBModel.js';
import { GuaribasSubject } from '../../kb.gbapp/models'; import { GuaribasSubject } from '../../kb.gbapp/models/index.js';
import { GuaribasUser } from '../../security.gbapp/models'; import { GuaribasUser } from '../../security.gbapp/models/index.js';
/** /**
* A conversation that groups many messages. * A conversation that groups many messages.
*/ */
@Table @Table
export class GuaribasConversation extends Model<GuaribasConversation> { export class GuaribasConversation extends Model<GuaribasConversation> {
@PrimaryKey @PrimaryKey
@AutoIncrement @AutoIncrement
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public conversationId: number; declare conversationId: number;
@ForeignKey(() => GuaribasInstance) @ForeignKey(() => GuaribasInstance)
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public instanceId: number; declare instanceId: number;
@ForeignKey(() => GuaribasSubject) @ForeignKey(() => GuaribasSubject)
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public startSubjectId: number; declare startSubjectId: number;
@BelongsTo(() => GuaribasSubject) @BelongsTo(() => GuaribasSubject)
public startSubject: GuaribasSubject; declare startSubject: GuaribasSubject;
@ForeignKey(() => GuaribasChannel) @ForeignKey(() => GuaribasChannel)
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public channelId: string; declare channelId: string;
@Column(DataType.DATE) @Column(DataType.DATE)
public rateDate: Date; declare rateDate: Date;
@Column(DataType.FLOAT) @Column(DataType.FLOAT)
public rate: number; declare rate: number;
@Column(DataType.STRING(512)) @Column(DataType.STRING(512))
public feedback: string; declare feedback: string;
@CreatedAt @CreatedAt
@Column(DataType.DATE) @Column(DataType.DATE)
public createdAt: Date; declare createdAt: Date;
@Column(DataType.DATE)
@UpdatedAt
declare updatedAt: Date;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public text: string; declare text: string;
@ForeignKey(() => GuaribasUser) @ForeignKey(() => GuaribasUser)
@Column(DataType.STRING(255)) @Column(DataType.INTEGER)
public startedByUserId: number; declare startedByUserId: number;
@BelongsTo(() => GuaribasUser) @BelongsTo(() => GuaribasUser)
public startedBy: GuaribasUser; declare startedBy: GuaribasUser;
} }
/** /**
@ -113,45 +114,43 @@ export class GuaribasConversation extends Model<GuaribasConversation> {
*/ */
@Table @Table
export class GuaribasConversationMessage extends Model<GuaribasConversationMessage> { export class GuaribasConversationMessage extends Model<GuaribasConversationMessage> {
@PrimaryKey @PrimaryKey
@AutoIncrement @AutoIncrement
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public conversationMessageId: number; declare conversationMessageId: number;
@ForeignKey(() => GuaribasSubject) @ForeignKey(() => GuaribasSubject)
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public subjectId: number; declare subjectId: number;
@Column(DataType.TEXT) @Column(DataType.TEXT)
public content: string; declare content: string;
@Column(DataType.DATE) @Column(DataType.DATE)
@CreatedAt @CreatedAt
public createdAt: Date; declare createdAt: Date;
@Column(DataType.DATE) @Column(DataType.DATE)
@UpdatedAt @UpdatedAt
public updatedAt: Date; declare updatedAt: Date;
//tslint:disable-next-line:no-use-before-declare //tslint:disable-next-line:no-use-before-declare
@ForeignKey(() => GuaribasConversation) @ForeignKey(() => GuaribasConversation)
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public conversationId: number; declare conversationId: number;
//tslint:disable-next-line:no-use-before-declare //tslint:disable-next-line:no-use-before-declare
@BelongsTo(() => GuaribasConversation) @BelongsTo(() => GuaribasConversation)
public conversation: GuaribasConversation; declare conversation: GuaribasConversation;
@ForeignKey(() => GuaribasInstance) @ForeignKey(() => GuaribasInstance)
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public instanceId: number; declare instanceId: number;
@ForeignKey(() => GuaribasUser) @ForeignKey(() => GuaribasUser)
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public userId: number; declare userId: number;
@BelongsTo(() => GuaribasUser) @BelongsTo(() => GuaribasUser)
public user: GuaribasUser; declare user: GuaribasUser;
} }

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -36,18 +34,15 @@
import { AzureText } from 'pragmatismo-io-framework'; import { AzureText } from 'pragmatismo-io-framework';
import { FindOptions } from 'sequelize/types'; import { FindOptions } from 'sequelize/types';
import { GBServer } from '../../../src/app'; import { GBServer } from '../../../src/app.js';
import { GuaribasUser } from '../../security.gbapp/models'; import { GuaribasUser } from '../../security.gbapp/models/index.js';
import { GuaribasConversation, GuaribasConversationMessage } from '../models'; import { GuaribasConversation, GuaribasConversationMessage } from '../models/index.js';
/** /**
* Base services for Bot Analytics. * Base services for Bot Analytics.
*/ */
export class AnalyticsService { export class AnalyticsService {
public async createConversation (user: GuaribasUser): Promise<GuaribasConversation> {
public async createConversation(
user: GuaribasUser
): Promise<GuaribasConversation> {
const conversation = new GuaribasConversation(); const conversation = new GuaribasConversation();
conversation.startedBy = user; conversation.startedBy = user;
conversation.startedByUserId = user.userId; conversation.startedByUserId = user.userId;
@ -56,21 +51,24 @@ export class AnalyticsService {
return await conversation.save(); return await conversation.save();
} }
public async updateConversationSuggestion(instanceId: number, public async updateConversationSuggestion (
conversationId: string, feedback: string, locale: string): Promise<number> { instanceId: number,
conversationId: string,
feedback: string,
locale: string
): Promise<number> {
const minBoot = GBServer.globals.minBoot as any; const minBoot = GBServer.globals.minBoot as any;
const rate = await AzureText.getSentiment( const rate = await AzureText.getSentiment(
minBoot.instance.textAnalyticsKey ? minBoot.instance.textAnalyticsKey : minBoot.instance.textAnalyticsKey ? minBoot.instance.textAnalyticsKey : minBoot.instance.textAnalyticsKey,
minBoot.instance.textAnalyticsKey, minBoot.instance.textAnalyticsEndpoint
minBoot.instance.textAnalyticsEndpoint ? minBoot.instance.textAnalyticsEndpoint : ? minBoot.instance.textAnalyticsEndpoint
minBoot.instance.textAnalyticsEndpoint, : minBoot.instance.textAnalyticsEndpoint,
locale, locale,
feedback feedback
); );
const options = <FindOptions>{ where: { } }; const options = <FindOptions>{ where: {} };
options.where = { conversationId: conversationId, instanceId: instanceId }; options.where = { conversationId: conversationId, instanceId: instanceId };
const item = await GuaribasConversation.findOne(options); const item = await GuaribasConversation.findOne(options);
item.feedback = feedback; item.feedback = feedback;
@ -79,21 +77,20 @@ export class AnalyticsService {
await item.save(); await item.save();
return rate; return rate;
} }
public async createMessage( public async createMessage (
instanceId: number, instanceId: number,
conversation: GuaribasConversation, conversationId: number,
userId: number, userId: number,
content: string content: string
): Promise<GuaribasConversationMessage> { ): Promise<GuaribasConversationMessage> {
const message = GuaribasConversationMessage.build(); const message = GuaribasConversationMessage.build();
message.content = content; message.content = typeof content === 'object' ? JSON.stringify(content) : content;
message.instanceId = instanceId; message.instanceId = instanceId;
message.userId = userId; message.userId = userId;
message.conversationId = conversation.conversationId; message.conversationId = conversationId;
return await message.save(); return await message.save();
} }

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -37,19 +35,22 @@
'use strict'; 'use strict';
import { GBLog, IGBInstallationDeployer, IGBInstance } from 'botlib'; import { GBLog, IGBInstallationDeployer, IGBInstance } from 'botlib';
import * as fs from 'fs'; import fs from 'fs/promises';
import { GBAdminService } from '../../../packages/admin.gbapp/services/GBAdminService'; import { GBAdminService } from '../../../packages/admin.gbapp/services/GBAdminService.js';
import { GBConfigService } from '../../../packages/core.gbapp/services/GBConfigService'; import { GBConfigService } from '../../../packages/core.gbapp/services/GBConfigService.js';
const scanf = require('scanf'); import scanf from 'scanf';
import { AzureDeployerService } from '../services/AzureDeployerService.js';
import { GBLogEx } from '../../core.gbapp/services/GBLogEx.js';
import { GBUtil } from '../../../src/util.js';
/** /**
* Handles command-line dialog for getting info for Boot Bot. * Handles command-line dialog for getting info for Boot Bot.
*/ */
export class StartDialog { export class StartDialog {
public static async createBaseInstance(installationDeployer: IGBInstallationDeployer) { public static async createBaseInstance (deployer, freeTier) {
// No .env so asks for cloud credentials to start a new farm. // No .env so asks for cloud credentials to start a new farm.
if (!fs.existsSync(`.env`)) { if (!await GBUtil.exists(`.env`)) {
process.stdout.write( process.stdout.write(
'A empty enviroment is detected. To start automatic deploy, please enter some information:\n' 'A empty enviroment is detected. To start automatic deploy, please enter some information:\n'
); );
@ -73,13 +74,16 @@ export class StartDialog {
// Connects to the cloud and retrieves subscriptions. // Connects to the cloud and retrieves subscriptions.
const credentials = await GBAdminService.getADALCredentialsFromUsername(username, password); const credentials = await GBAdminService.getADALCredentialsFromUsername(username, password);
const list = await installationDeployer.getSubscriptions(credentials);
let subscriptionId: string; let subscriptionId: string;
while (subscriptionId === undefined) { while (subscriptionId === undefined) {
const list = await (new AzureDeployerService()).getSubscriptions(credentials);
subscriptionId = this.retrieveSubscriptionId(list); subscriptionId = this.retrieveSubscriptionId(list);
} }
const installationDeployer = await AzureDeployerService.createInstanceWithADALCredentials(
deployer, freeTier, subscriptionId, credentials);
let location: string; let location: string;
while (location === undefined) { while (location === undefined) {
location = this.retrieveLocation(); location = this.retrieveLocation();
@ -96,6 +100,7 @@ export class StartDialog {
} }
// Prepares the first instance on bot farm. // Prepares the first instance on bot farm.
const instance = <IGBInstance>{}; const instance = <IGBInstance>{};
instance.botId = botId; instance.botId = botId;
@ -106,12 +111,12 @@ export class StartDialog {
instance.cloudLocation = location; instance.cloudLocation = location;
instance.marketplaceId = appId; instance.marketplaceId = appId;
instance.marketplacePassword = appPassword; instance.marketplacePassword = appPassword;
instance.adminPass = GBAdminService.getRndPassword(); instance.adminPass = await GBUtil.hashPassword(GBAdminService.getRndPassword());
return { instance, credentials, subscriptionId }; return { instance, credentials, subscriptionId , installationDeployer};
} }
private static retrieveUsername() { private static retrieveUsername () {
let value = GBConfigService.get('CLOUD_USERNAME'); let value = GBConfigService.get('CLOUD_USERNAME');
if (value === undefined) { if (value === undefined) {
process.stdout.write(`${GBAdminService.GB_PROMPT}CLOUD_USERNAME:`); process.stdout.write(`${GBAdminService.GB_PROMPT}CLOUD_USERNAME:`);
@ -121,7 +126,7 @@ export class StartDialog {
return value; return value;
} }
private static retrievePassword() { private static retrievePassword () {
let password = GBConfigService.get('CLOUD_PASSWORD'); let password = GBConfigService.get('CLOUD_PASSWORD');
if (password === undefined) { if (password === undefined) {
process.stdout.write(`${GBAdminService.GB_PROMPT}CLOUD_PASSWORD:`); process.stdout.write(`${GBAdminService.GB_PROMPT}CLOUD_PASSWORD:`);
@ -131,7 +136,7 @@ export class StartDialog {
return password; return password;
} }
private static retrieveBotId() { private static retrieveBotId () {
let botId = GBConfigService.get('BOT_ID'); let botId = GBConfigService.get('BOT_ID');
if (botId === undefined) { if (botId === undefined) {
process.stdout.write( process.stdout.write(
@ -146,12 +151,11 @@ cannot start or end with or contain consecutive dashes and having 4 to 42 charac
return botId; return botId;
} }
/** /**
* *
* Update Manifest in Azure: "signInAudience": "AzureADandPersonalMicrosoftAccount" and "accessTokenAcceptedVersion": 2. * Update Manifest in Azure: "signInAudience": "AzureADandPersonalMicrosoftAccount" and "accessTokenAcceptedVersion": 2.
*/ */
private static retrieveAppId() { private static retrieveAppId () {
let appId = GBConfigService.get('MARKETPLACE_ID'); let appId = GBConfigService.get('MARKETPLACE_ID');
if (appId === undefined) { if (appId === undefined) {
process.stdout.write( process.stdout.write(
@ -167,7 +171,7 @@ generate manually an App ID and App Secret.\n`
return appId; return appId;
} }
private static retrieveAppPassword() { private static retrieveAppPassword () {
let appPassword = GBConfigService.get('MARKETPLACE_SECRET'); let appPassword = GBConfigService.get('MARKETPLACE_SECRET');
if (appPassword === undefined) { if (appPassword === undefined) {
process.stdout.write('Generated Password (MARKETPLACE_SECRET):'); process.stdout.write('Generated Password (MARKETPLACE_SECRET):');
@ -177,12 +181,16 @@ generate manually an App ID and App Secret.\n`
return appPassword; return appPassword;
} }
private static retrieveSubscriptionId(list) { private static retrieveSubscriptionId (list) {
let subscriptionId = GBConfigService.get('CLOUD_SUBSCRIPTIONID'); let subscriptionId = GBConfigService.get('CLOUD_SUBSCRIPTIONID');
if (subscriptionId){
return subscriptionId;
}
const map = {}; const map = {};
let index = 1; let index = 1;
list.forEach(element => { list.forEach(element => {
GBLog.info(`${index}: ${element.displayName} (${element.subscriptionId})`); GBLogEx.info(0, `${index}: ${element.displayName} (${element.subscriptionId})`);
map[index++] = element; map[index++] = element;
}); });
let subscriptionIndex; let subscriptionIndex;
@ -195,7 +203,7 @@ generate manually an App ID and App Secret.\n`
return subscriptionId; return subscriptionId;
} }
private static retrieveLocation() { private static retrieveLocation () {
let location = GBConfigService.get('CLOUD_LOCATION'); let location = GBConfigService.get('CLOUD_LOCATION');
if (location === undefined) { if (location === undefined) {
process.stdout.write('CLOUD_LOCATION (eg. westus):'); process.stdout.write('CLOUD_LOCATION (eg. westus):');

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -43,27 +41,26 @@ import { Sequelize } from 'sequelize-typescript';
* Package for Azure Deployer. * Package for Azure Deployer.
*/ */
export class GBAzureDeployerPackage implements IGBPackage { export class GBAzureDeployerPackage implements IGBPackage {
public sysPackages: IGBPackage[]; public sysPackages: IGBPackage[];
public async getDialogs(min: GBMinInstance) { public async getDialogs (min: GBMinInstance) {
GBLog.verbose(`getDialogs called.`); GBLog.verbose(`getDialogs called.`);
} }
public async loadPackage(core: IGBCoreService, sequelize: Sequelize): Promise<void> { public async loadPackage (core: IGBCoreService, sequelize: Sequelize): Promise<void> {
GBLog.verbose(`loadPackage called.`); GBLog.verbose(`loadPackage called.`);
} }
public async unloadPackage(core: IGBCoreService): Promise<void> { public async unloadPackage (core: IGBCoreService): Promise<void> {
GBLog.verbose(`unloadPackage called.`); GBLog.verbose(`unloadPackage called.`);
} }
public async loadBot(min: GBMinInstance): Promise<void> { public async loadBot (min: GBMinInstance): Promise<void> {
GBLog.verbose(`loadBot called.`); GBLog.verbose(`loadBot called.`);
} }
public async unloadBot(min: GBMinInstance): Promise<void> { public async unloadBot (min: GBMinInstance): Promise<void> {
GBLog.verbose(`unloadBot called.`); GBLog.verbose(`unloadBot called.`);
} }
public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise<void> { public async onNewSession (min: GBMinInstance, step: GBDialogStep): Promise<void> {
GBLog.verbose(`onNewSession called.`); GBLog.verbose(`onNewSession called.`);
} }
public async onExchangeData(min: GBMinInstance, kind: string, data: any) { public async onExchangeData (min: GBMinInstance, kind: string, data: any) {
GBLog.verbose(`onExchangeData called.`); GBLog.verbose(`onExchangeData called.`);
} }
} }

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -36,33 +34,30 @@
'use strict'; 'use strict';
import { HttpHeaders, HttpMethods, ServiceClient, WebResource } from '@azure/ms-rest-js'; import urlJoin from 'url-join';
import { CognitiveServicesManagementClient } from 'azure-arm-cognitiveservices'; import { HttpMethods, ServiceClient, TokenCredentials, WebResource } from '@azure/ms-rest-js';
import { ResourceManagementClient, SubscriptionClient } from 'azure-arm-resource'; import { CognitiveServicesManagementClient } from '@azure/arm-cognitiveservices';
import { SearchManagementClient } from 'azure-arm-search'; import { ResourceManagementClient } from '@azure/arm-resources';
import { SqlManagementClient } from 'azure-arm-sql'; import { SubscriptionClient } from '@azure/arm-subscriptions';
import { WebSiteManagementClient } from 'azure-arm-website'; import { SearchManagementClient } from '@azure/arm-search';
//tslint:disable-next-line:no-submodule-imports import { Server, SqlManagementClient } from '@azure/arm-sql';
import { AppServicePlan, Site, SiteConfigResource, SiteLogsConfig, SiteSourceControl } from 'azure-arm-website/lib/models'; import { WebSiteManagementClient } from '@azure/arm-appservice';
import { AppServicePlan, Site, SiteLogsConfig, SiteSourceControl } from '@azure/arm-appservice';
import { GBLog, IGBInstallationDeployer, IGBInstance, IGBDeployer, IGBCoreService } from 'botlib'; import { GBLog, IGBInstallationDeployer, IGBInstance, IGBDeployer, IGBCoreService } from 'botlib';
import { GBAdminService } from '../../../packages/admin.gbapp/services/GBAdminService'; import { GBAdminService } from '../../../packages/admin.gbapp/services/GBAdminService.js';
import { GBCorePackage } from '../../../packages/core.gbapp'; import { GBCorePackage } from '../../../packages/core.gbapp/index.js';
import { GBConfigService } from '../../../packages/core.gbapp/services/GBConfigService'; import { GBConfigService } from '../../../packages/core.gbapp/services/GBConfigService.js';
import { GBDeployer } from '../../../packages/core.gbapp/services/GBDeployer'; import { GBDeployer } from '../../../packages/core.gbapp/services/GBDeployer.js';
const MicrosoftGraph = require("@microsoft/microsoft-graph-client"); import { Account } from '@azure/arm-cognitiveservices';
import MicrosoftGraph from '@microsoft/microsoft-graph-client';
import { Spinner } from 'cli-spinner';
import * as publicIp from 'public-ip';
import { AccessToken, TokenCredential } from '@azure/core-auth';
import { GBUtil } from '../../../src/util.js';
import { GBLogEx } from '../../core.gbapp/services/GBLogEx.js';
const Spinner = require('cli-spinner').Spinner;
// tslint:disable-next-line: no-submodule-imports
import * as simplegit from 'simple-git/promise';
const git = simplegit();
// tslint:disable-next-line:no-submodule-imports
import { CognitiveServicesAccount } from 'azure-arm-cognitiveservices/lib/models';
const urlJoin = require('url-join');
const iconUrl = 'https://github.com/pragmatismo-io/BotServer/blob/master/docs/images/generalbots-logo-squared.png';
const publicIp = require('public-ip');
const WebSiteResponseTimeout = 900; const WebSiteResponseTimeout = 900;
const iconUrl = 'https://github.com/pragmatismo-io/BotServer/blob/master/docs/images/generalbots-logo-squared.png';
/** /**
* Deployer for Microsoft cloud. * Deployer for Microsoft cloud.
*/ */
@ -70,13 +65,13 @@ export class AzureDeployerService implements IGBInstallationDeployer {
public apiVersion = '2017-12-01'; public apiVersion = '2017-12-01';
public defaultEndPoint = 'http://localhost:4242'; public defaultEndPoint = 'http://localhost:4242';
public instance: IGBInstance; public instance: IGBInstance;
public cloud: ResourceManagementClient.ResourceManagementClient; public cloud: ResourceManagementClient;
public webSiteClient: WebSiteManagementClient; public webSiteClient: WebSiteManagementClient;
public storageClient: SqlManagementClient; public storageClient: SqlManagementClient;
public cognitiveClient: CognitiveServicesManagementClient; public cognitiveClient: CognitiveServicesManagementClient;
public searchClient: SearchManagementClient; public searchClient: SearchManagementClient;
public provider = 'Microsoft.BotService'; public provider = 'Microsoft.BotService';
public subscriptionClient: SubscriptionClient.SubscriptionClient; public subscriptionClient: SubscriptionClient;
public accessToken: string; public accessToken: string;
public location: string; public location: string;
public subscriptionId: string; public subscriptionId: string;
@ -85,29 +80,39 @@ export class AzureDeployerService implements IGBInstallationDeployer {
public core: IGBCoreService; public core: IGBCoreService;
private freeTier: boolean; private freeTier: boolean;
constructor(deployer: IGBDeployer, freeTier: boolean = true) {
this.deployer = deployer;
this.freeTier = freeTier;
}
public async runSearch(instance: IGBInstance) { public async runSearch(instance: IGBInstance) {
await this.deployer.rebuildIndex(instance, this.getKBSearchSchema(instance.searchIndex)); await this.deployer.rebuildIndex(instance, this.getKBSearchSchema(instance.searchIndex));
} }
public static async createInstance(deployer: GBDeployer): Promise<AzureDeployerService> {
public static async createInstance(deployer: GBDeployer, freeTier: boolean = true): Promise<AzureDeployerService> {
const username = GBConfigService.get('CLOUD_USERNAME'); const username = GBConfigService.get('CLOUD_USERNAME');
const password = GBConfigService.get('CLOUD_PASSWORD'); const password = GBConfigService.get('CLOUD_PASSWORD');
const credentials = await GBAdminService.getADALCredentialsFromUsername(username, password);
const subscriptionId = GBConfigService.get('CLOUD_SUBSCRIPTIONID'); const subscriptionId = GBConfigService.get('CLOUD_SUBSCRIPTIONID');
return await this.createInstanceWithCredentials(deployer, freeTier, subscriptionId, username, password);
}
public static async createInstanceWithADALCredentials(deployer: GBDeployer, freeTier: boolean = true,
subscriptionId: string, credentials): Promise<AzureDeployerService> {
const service = new AzureDeployerService();
const service = new AzureDeployerService(deployer);
service.core = deployer.core; service.core = deployer.core;
service.initServices(credentials, subscriptionId); service.deployer = deployer;
service.freeTier = freeTier;
const token = credentials['tokenCache']._entries[0];
await service.initServices(token.accessToken, token.expiresOn, subscriptionId);
return service; return service;
} }
public static async createInstanceWithCredentials(deployer: GBDeployer, freeTier: boolean = true,
subscriptionId: string, username: string, password: string): Promise<AzureDeployerService> {
const credentials = await GBAdminService.getADALCredentialsFromUsername(username, password);
return await this.createInstanceWithADALCredentials(deployer, freeTier, subscriptionId, credentials);
}
private static createRequestObject(url: string, accessToken: string, verb: HttpMethods, body: string) { private static createRequestObject(url: string, accessToken: string, verb: HttpMethods, body: string) {
const req = new WebResource(); const req = new WebResource();
req.method = verb; req.method = verb;
@ -121,12 +126,12 @@ export class AzureDeployerService implements IGBInstallationDeployer {
} }
public async getSubscriptions(credentials) { public async getSubscriptions(credentials) {
const subscriptionClient = new SubscriptionClient.default(credentials); const subscriptionClient = new SubscriptionClient(credentials);
return subscriptionClient.subscriptions.list(); return subscriptionClient.subscriptions.list();
} }
public getKBSearchSchema(indexName) { public getKBSearchSchema(indexName: any) {
return { return {
name: indexName, name: indexName,
fields: [ fields: [
@ -237,23 +242,20 @@ export class AzureDeployerService implements IGBInstallationDeployer {
}; };
} }
public async botExists(botId) { public async botExists(botId: string) {
const baseUrl = `https://management.azure.com/`; const baseUrl = `https://management.azure.com/`;
const username = GBConfigService.get('CLOUD_USERNAME'); const username = GBConfigService.get('CLOUD_USERNAME');
const password = GBConfigService.get('CLOUD_PASSWORD'); const password = GBConfigService.get('CLOUD_PASSWORD');
const accessToken = await GBAdminService.getADALTokenFromUsername(username, password); const accessToken = await GBAdminService.getADALTokenFromUsername(username, password);
const httpClient = new ServiceClient(); const httpClient = new ServiceClient();
const query = `providers/${this.provider const query = `providers/${this.provider}/checkNameAvailability/Action?api-version=${this.apiVersion}`;
}/checkNameAvailability/Action?api-version=${this.apiVersion}`;
const url = urlJoin(baseUrl, query); const url = urlJoin(baseUrl, query);
const body = { const body = {
name: botId, name: botId,
type: "botServices" type: 'botServices'
}; };
const req = AzureDeployerService.createRequestObject(url, accessToken, 'POST', JSON.stringify(body)); const req = AzureDeployerService.createRequestObject(url, accessToken, 'POST', JSON.stringify(body));
@ -262,7 +264,12 @@ export class AzureDeployerService implements IGBInstallationDeployer {
return !res.parsedBody.valid; return !res.parsedBody.valid;
} }
public async updateBotProxy(botId, group, endpoint) { public async updateBotProxy(botId: string, group: string, endpoint: string) {
if (!await this.botExists(botId)) {
GBLog.error(`Bot ${botId} does not exist on cloud.`);
return;
}
const baseUrl = `https://management.azure.com/`; const baseUrl = `https://management.azure.com/`;
const username = GBConfigService.get('CLOUD_USERNAME'); const username = GBConfigService.get('CLOUD_USERNAME');
const password = GBConfigService.get('CLOUD_PASSWORD'); const password = GBConfigService.get('CLOUD_PASSWORD');
@ -277,8 +284,7 @@ export class AzureDeployerService implements IGBInstallationDeployer {
} }
}; };
const query = `subscriptions/${subscriptionId}/resourceGroups/${group}/providers/${this.provider const query = `subscriptions/${subscriptionId}/resourceGroups/${group}/providers/${this.provider}/botServices/${botId}?api-version=${this.apiVersion}`;
}/botServices/${botId}?api-version=${this.apiVersion}`;
const url = urlJoin(baseUrl, query); const url = urlJoin(baseUrl, query);
const req = AzureDeployerService.createRequestObject(url, accessToken, 'PATCH', JSON.stringify(parameters)); const req = AzureDeployerService.createRequestObject(url, accessToken, 'PATCH', JSON.stringify(parameters));
const res = await httpClient.sendRequest(req); const res = await httpClient.sendRequest(req);
@ -286,11 +292,10 @@ export class AzureDeployerService implements IGBInstallationDeployer {
if (!JSON.parse(res.bodyAsText).id) { if (!JSON.parse(res.bodyAsText).id) {
throw res.bodyAsText; throw res.bodyAsText;
} }
GBLog.info(`Bot proxy updated at: ${endpoint}.`); GBLogEx.info(0, `Bot proxy updated at: ${endpoint}.`);
} }
public async updateBot(botId: string, group: string, name: string, public async updateBot(botId: string, group: string, name: string, description: string, endpoint: string) {
description: string, endpoint: string) {
const baseUrl = `https://management.azure.com/`; const baseUrl = `https://management.azure.com/`;
const username = GBConfigService.get('CLOUD_USERNAME'); const username = GBConfigService.get('CLOUD_USERNAME');
const password = GBConfigService.get('CLOUD_PASSWORD'); const password = GBConfigService.get('CLOUD_PASSWORD');
@ -308,8 +313,7 @@ export class AzureDeployerService implements IGBInstallationDeployer {
} }
}; };
const query = `subscriptions/${subscriptionId}/resourceGroups/${group}/providers/${this.provider const query = `subscriptions/${subscriptionId}/resourceGroups/${group}/providers/${this.provider}/botServices/${botId}?api-version=${this.apiVersion}`;
}/botServices/${botId}?api-version=${this.apiVersion}`;
const url = urlJoin(baseUrl, query); const url = urlJoin(baseUrl, query);
const req = AzureDeployerService.createRequestObject(url, accessToken, 'PATCH', JSON.stringify(parameters)); const req = AzureDeployerService.createRequestObject(url, accessToken, 'PATCH', JSON.stringify(parameters));
const res = await httpClient.sendRequest(req); const res = await httpClient.sendRequest(req);
@ -317,10 +321,10 @@ export class AzureDeployerService implements IGBInstallationDeployer {
if (!JSON.parse(res.bodyAsText).id) { if (!JSON.parse(res.bodyAsText).id) {
throw res.bodyAsText; throw res.bodyAsText;
} }
GBLog.info(`Bot updated at: ${endpoint}.`); GBLogEx.info(0, `Bot updated at: ${endpoint}.`);
} }
public async deleteBot(botId: string, group) { public async deleteBot(botId: string, group: string) {
const baseUrl = `https://management.azure.com/`; const baseUrl = `https://management.azure.com/`;
const username = GBConfigService.get('CLOUD_USERNAME'); const username = GBConfigService.get('CLOUD_USERNAME');
const password = GBConfigService.get('CLOUD_PASSWORD'); const password = GBConfigService.get('CLOUD_PASSWORD');
@ -329,70 +333,91 @@ export class AzureDeployerService implements IGBInstallationDeployer {
const accessToken = await GBAdminService.getADALTokenFromUsername(username, password); const accessToken = await GBAdminService.getADALTokenFromUsername(username, password);
const httpClient = new ServiceClient(); const httpClient = new ServiceClient();
const query = `subscriptions/${subscriptionId}/resourceGroups/${group}/providers/${this.provider const query = `subscriptions/${subscriptionId}/resourceGroups/${group}/providers/${this.provider}/botServices/${botId}?api-version=${this.apiVersion}`;
}/botServices/${botId}?api-version=${this.apiVersion}`;
const url = urlJoin(baseUrl, query); const url = urlJoin(baseUrl, query);
const req = AzureDeployerService.createRequestObject(url, accessToken, 'DELETE', undefined); const req = AzureDeployerService.createRequestObject(url, accessToken, 'DELETE', undefined);
const res = await httpClient.sendRequest(req); const res = await httpClient.sendRequest(req);
if (res.bodyAsText !== "") { if (res.bodyAsText !== '') {
throw res.bodyAsText; throw res.bodyAsText;
} }
GBLog.info(`Bot ${botId} was deleted from the provider.`); GBLogEx.info(0, `Bot ${botId} was deleted from the provider.`);
} }
public async openStorageFirewall(groupName, serverName) { public async openStorageFirewall(groupName: string, serverName: string) {
const username = GBConfigService.get('CLOUD_USERNAME');
const password = GBConfigService.get('CLOUD_PASSWORD');
const subscriptionId = GBConfigService.get('CLOUD_SUBSCRIPTIONID'); const subscriptionId = GBConfigService.get('CLOUD_SUBSCRIPTIONID');
const credentials = await GBAdminService.getADALCredentialsFromUsername(username, password); const ip = await publicIp.publicIpv4();
const storageClient = new SqlManagementClient(credentials, subscriptionId);
const ip = await publicIp.v4();
let params = { let params = {
startIpAddress: ip, startIpAddress: ip,
endIpAddress: ip endIpAddress: ip
}; };
await storageClient.firewallRules.createOrUpdate(groupName, serverName, 'gb', params); await this.storageClient.firewallRules.createOrUpdate(groupName, serverName, 'gb', params);
} }
public async deployFarm( public async deployFarm(
proxyAddress: string, proxyAddress: string,
instance: IGBInstance, instance: IGBInstance,
credentials, credentials: any,
subscriptionId: string subscriptionId: string
): Promise<IGBInstance> { ): Promise<IGBInstance> {
return await this.deployFarm2(proxyAddress,
instance,
credentials,
subscriptionId);
}
public async deployFarm2(
proxyAddress: string,
instance: IGBInstance,
credentials: any,
subscriptionId: string
) {
const culture = 'en-us'; const culture = 'en-us';
this.initServices(credentials, subscriptionId); const token = credentials['tokenCache']._entries[0];
await this.initServices(token.accessToken, token.expiresOn, subscriptionId);
const spinner = new Spinner('%s'); const spinner = new Spinner('%s');
spinner.start(); spinner.start();
spinner.setSpinnerString('|/-\\'); spinner.setSpinnerString('|/-\\');
let keys: any; let keys: any;
const name = instance.botId; const name = instance.botId;
GBLogEx.info(0, `Enabling resource providers...`);
GBLog.info(`Enabling resource providers...`); await this.enableResourceProviders('Microsoft.CognitiveServices');
await this.enableResourceProviders('Microsoft.BotService'); await this.enableResourceProviders('Microsoft.BotService');
await this.enableResourceProviders('Microsoft.Search');
await this.enableResourceProviders('Microsoft.Web');
await this.enableResourceProviders('Microsoft.Sql');
GBLogEx.info(0, `Deploying Deploy Group (It may take a few minutes)...`);
GBLog.info(`Deploying Deploy Group (It may take a few minutes)...`);
await this.createDeployGroup(name, instance.cloudLocation); await this.createDeployGroup(name, instance.cloudLocation);
GBLog.info(`Deploying Bot Server...`); let serverFarm;
const serverFarm = await this.createHostingPlan(name, `${name}-server-plan`, instance.cloudLocation); let serverName;
const serverName = `${name}-server`;
await this.createServer(serverFarm.id, name, serverName, instance.cloudLocation);
GBLog.info(`Deploying Bot Storage...`); if (process.env.DEPLOY_WEB) {
GBLogEx.info(0, `Deploying Bot Server...`);
serverFarm = await this.createHostingPlan(name, `${name}-server-plan`, instance.cloudLocation);
serverName = `${name}-server`;
await this.createServer(serverFarm.id, name, serverName, instance.cloudLocation);
}
GBLogEx.info(0, `Deploying Bot Storage...`);
const administratorLogin = `sa${GBAdminService.getRndReadableIdentifier()}`; const administratorLogin = `sa${GBAdminService.getRndReadableIdentifier()}`;
const administratorPassword = GBAdminService.getRndPassword(); const administratorPassword = GBAdminService.getRndPassword();
const storageServer = `${name.toLowerCase()}-storage-server`; const storageServer = `${name.toLowerCase()}-storage-server`;
const storageName = `${name}-storage`; const storageName = `${name}-storage`;
await this.createStorageServer(name, storageServer, administratorLogin, await this.createStorageServer(
administratorPassword, storageServer, instance.cloudLocation name,
storageServer,
administratorLogin,
administratorPassword,
storageServer,
instance.cloudLocation
); );
await this.createStorage(name, storageServer, storageName, instance.cloudLocation); await this.createStorage(name, storageServer, storageName, instance.cloudLocation);
instance.storageUsername = administratorLogin; instance.storageUsername = administratorLogin;
@ -401,70 +426,73 @@ export class AzureDeployerService implements IGBInstallationDeployer {
instance.storageDialect = 'mssql'; instance.storageDialect = 'mssql';
instance.storageServer = `${storageServer}.database.windows.net`; instance.storageServer = `${storageServer}.database.windows.net`;
GBLog.info(`Deploying Search...`); // TODO: Enable in .env
const searchName = `${name}-search`.toLowerCase(); // GBLogEx.info(min, `Deploying Search...`);
await this.createSearch(name, searchName, instance.cloudLocation); // const searchName = `${name}-search`.toLowerCase();
const searchKeys = await this.searchClient.adminKeys.get(name, searchName); // await this.createSearch(name, searchName, instance.cloudLocation);
instance.searchHost = `${searchName}.search.windows.net`; // const searchKeys = await this.searchClient.adminKeys.get(name, searchName);
instance.searchIndex = 'azuresql-index'; // instance.searchHost = `${searchName}.search.windows.net`;
instance.searchIndexer = 'azuresql-indexer'; // instance.searchIndex = 'azuresql-index';
instance.searchKey = searchKeys.primaryKey; // instance.searchIndexer = 'azuresql-indexer';
// instance.searchKey = searchKeys.primaryKey;
GBLog.info(`Deploying Speech...`); // GBLogEx.info(min, `Deploying Speech...`);
const speech = await this.createSpeech(name, `${name}speech`, instance.cloudLocation); // const speech = await this.createSpeech(name, `${name}speech`, instance.cloudLocation);
keys = await this.cognitiveClient.accounts.listKeys(name, speech.name); // keys = await this.cognitiveClient.accounts.listKeys(name, speech.name);
instance.speechEndpoint = speech.endpoint; // instance.speechEndpoint = speech.properties.endpoint;
instance.speechKey = keys.key1; // instance.speechKey = keys.key1;
GBLog.info(`Deploying Text Analytics...`); // GBLogEx.info(min, `Deploying Text Analytics...`);
const textAnalytics = await this.createTextAnalytics(name, `${name}-textanalytics`, instance.cloudLocation); // const textAnalytics = await this.createTextAnalytics(name, `${name}-textanalytics`, instance.cloudLocation);
instance.textAnalyticsEndpoint = textAnalytics.endpoint.replace(`/text/analytics/v2.0`, ''); // instance.textAnalyticsEndpoint = textAnalytics.properties.endpoint.replace(`/text/analytics/v2.0`, '');
GBLog.info(`Deploying SpellChecker...`); GBLogEx.info(0, `Deploying SpellChecker...`);
const spellChecker = await this.createSpellChecker(name, `${name}-spellchecker`); const spellChecker = await this.createSpellChecker(name, `${name}-spellchecker`);
instance.spellcheckerEndpoint = spellChecker.endpoint; instance.spellcheckerEndpoint = spellChecker.properties.endpoint;
GBLog.info(`Deploying NLP...`); // GBLogEx.info(min, `Deploying NLP...`);
const nlp = await this.createNLP(name, `${name}-nlp`, instance.cloudLocation); // const nlp = await this.createNLP(name, `${name}-nlp`, instance.cloudLocation);
const nlpa = await this.createNLPAuthoring(name, `${name}-nlpa`, instance.cloudLocation); // const nlpa = await this.createNLPAuthoring(name, `${name}-nlpa`, instance.cloudLocation);
instance.nlpEndpoint = nlp.endpoint; // instance.nlpEndpoint = nlp.properties.endpoint;
const sleep = ms => {
return new Promise(resolve => {
setTimeout(resolve, ms);
});
};
GBLog.info(`Deploying Bot...`); GBLogEx.info(0, `Deploying Bot...`);
instance.botEndpoint = this.defaultEndPoint; instance.botEndpoint = 'TODO: remove this column.';
instance = await this.internalDeployBot( instance = await this.internalDeployBot(
instance, this.accessToken, name, name, name, 'General BootBot', instance,
`${proxyAddress}/api/messages/${name}`, 'global', this.accessToken,
instance.nlpAppId, instance.nlpKey, instance.marketplaceId, instance.marketplacePassword, name,
name,
name,
'General BootBot',
`${proxyAddress}/api/messages/${name}`,
'global',
instance.nlpAppId,
instance.nlpKey,
instance.marketplaceId,
instance.marketplacePassword,
instance.cloudSubscriptionId instance.cloudSubscriptionId
); );
GBLog.info(`Waiting one minute to finishing NLP service and keys creation...`); GBLogEx.info(0, `Waiting one minute to finish NLP service and keys creation...`);
await sleep(60000); await GBUtil.sleep(60000);
keys = await this.cognitiveClient.accounts.listKeys(name, textAnalytics.name); // keys = await this.cognitiveClient.accounts.listKeys(name, textAnalytics.name);
instance.textAnalyticsKey = keys.key1; // instance.textAnalyticsKey = keys.key1;
keys = await this.cognitiveClient.accounts.listKeys(name, spellChecker.name); keys = await this.cognitiveClient.accounts.listKeys(name, spellChecker.name);
instance.spellcheckerKey = keys.key1; instance.spellcheckerKey = keys.key1;
let authoringKeys = await this.cognitiveClient.accounts.listKeys(name, nlpa.name); // let authoringKeys = await this.cognitiveClient.accounts.listKeys(name, nlpa.name);
keys = await this.cognitiveClient.accounts.listKeys(name, nlp.name); // keys = await this.cognitiveClient.accounts.listKeys(name, nlp.name);
instance.nlpKey = keys.key1; // instance.nlpKey = keys.key1;
instance.nlpAuthoringKey = authoringKeys.key1; // instance.nlpAuthoringKey = authoringKeys.key1;
const nlpAppId = await this.createNLPService(name, name, instance.cloudLocation, culture, instance.nlpAuthoringKey); // const nlpAppId = await this.createNLPService(name, name, instance.cloudLocation, culture, instance.nlpAuthoringKey);
instance.nlpAppId = nlpAppId; // instance.nlpAppId = nlpAppId;
GBLog.info('Updating server environment variables...');
await this.updateWebisteConfig(name, serverName, serverFarm.id, instance);
if (process.env.DEPLOY_WEB) {
GBLogEx.info(0, 'Updating server environment variables...');
await this.updateWebisteConfig(name, serverName, serverFarm.id, instance);
}
spinner.stop(); spinner.stop();
return instance; return instance;
@ -490,12 +518,12 @@ export class AzureDeployerService implements IGBInstallationDeployer {
instance.nlpAuthoringKey = authoringKey; instance.nlpAuthoringKey = authoringKey;
instance.marketplaceId = appId; instance.marketplaceId = appId;
instance.marketplacePassword = appPassword; instance.marketplacePassword = appPassword;
instance.adminPass = GBAdminService.getRndPassword(); instance.adminPass = await GBUtil.hashPassword(GBAdminService.getRndPassword());
const credentials = await GBAdminService.getADALCredentialsFromUsername(username, password); const credentials = await GBAdminService.getADALCredentialsFromUsername(username, password);
// tslint:disable-next-line:no-http-string // tslint:disable-next-line:no-http-string
const url = `https://${instance.botId}.azurewebsites.net`; const url = `https://${instance.botId}.azurewebsites.net`;
this.deployFarm(url, instance, credentials, subscriptionId); return await this.deployFarm(url, instance, credentials, subscriptionId);
} }
/** /**
@ -503,17 +531,17 @@ export class AzureDeployerService implements IGBInstallationDeployer {
*/ */
public async internalDeployBot( public async internalDeployBot(
instance, instance,
accessToken, accessToken: string,
botId, botId: string,
name, name: string,
group, group,
description, description: string,
endpoint, endpoint,
location, location,
nlpAppId, nlpAppId,
nlpKey, nlpKey: string,
appId, appId: string,
appPassword, appPassword: string,
subscriptionId subscriptionId
): Promise<IGBInstance> { ): Promise<IGBInstance> {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
@ -539,15 +567,12 @@ export class AzureDeployerService implements IGBInstallationDeployer {
luisAppIds: [nlpAppId], luisAppIds: [nlpAppId],
luisKey: nlpKey, luisKey: nlpKey,
msaAppId: appId, msaAppId: appId,
msaAppPassword: appPassword, msaAppPassword: appPassword
enabledChannels: ['webchat', "skype"],//, "facebook"],
configuredChannels: ['webchat', "skype"]//, "facebook"]
} }
}; };
const httpClient = new ServiceClient(); const httpClient = new ServiceClient();
let query = `subscriptions/${subscriptionId}/resourceGroups/${group}/providers/${this.provider let query = `subscriptions/${subscriptionId}/resourceGroups/${group}/providers/${this.provider}/botServices/${botId}?api-version=${this.apiVersion}`;
}/botServices/${botId}?api-version=${this.apiVersion}`;
let url = urlJoin(baseUrl, query); let url = urlJoin(baseUrl, query);
let req = AzureDeployerService.createRequestObject(url, accessToken, 'PUT', JSON.stringify(parameters)); let req = AzureDeployerService.createRequestObject(url, accessToken, 'PUT', JSON.stringify(parameters));
const res = await httpClient.sendRequest(req); const res = await httpClient.sendRequest(req);
@ -556,50 +581,87 @@ export class AzureDeployerService implements IGBInstallationDeployer {
return; return;
} }
await GBUtil.sleep(30000);
// MSFT has changed without warnings.
try { try {
//tslint:disable-next-line:max-line-length
query = `subscriptions/${subscriptionId}/resourceGroups/${group}/providers/Microsoft.BotService/botServices/${botId}/channels/WebChatChannel/listChannelWithKeys?api-version=${this.apiVersion //tslint:disable-next-line:max-line-length.
}`;
query = `subscriptions/${subscriptionId}/resourceGroups/${group}/providers/Microsoft.BotService/botServices/${botId}/channels/WebChatChannel/listChannelWithKeys?api-version=${this.apiVersion}`;
url = urlJoin(baseUrl, query); url = urlJoin(baseUrl, query);
req = AzureDeployerService.createRequestObject(url, accessToken, 'POST', JSON.stringify(parameters)); req = AzureDeployerService.createRequestObject(url, accessToken, 'POST', JSON.stringify(parameters));
const resChannel = await httpClient.sendRequest(req); const resChannel = await httpClient.sendRequest(req);
const key = JSON.parse(resChannel.bodyAsText).properties.properties.sites[0].key; const key = JSON.parse(resChannel.bodyAsText).properties.properties.sites[0].key;
instance.webchatKey = key; instance.webchatKey = key;
instance.whatsappBotKey = key;
resolve(instance); resolve(instance);
} catch (error) { } catch (error) {
reject(error); reject(error);
} }
}); });
} }
public async syncBotServerRepository(group, name) { public async syncBotServerRepository(group: string, name: string) {
await this.webSiteClient.webApps.syncRepository(group, name); await this.webSiteClient.webApps.syncRepository(group, name);
} }
public initServices(credentials: any, subscriptionId: string) { public async initServices(accessToken: string, expiresOnTimestamp, subscriptionId: string) {
this.cloud = new ResourceManagementClient.default(credentials, subscriptionId); this.accessToken = accessToken;
this.webSiteClient = new WebSiteManagementClient(credentials, subscriptionId); class AccessToken2 implements AccessToken {
this.storageClient = new SqlManagementClient(credentials, subscriptionId); public expiresOnTimestamp: number;
this.cognitiveClient = new CognitiveServicesManagementClient(credentials, subscriptionId); public token: string;
this.searchClient = new SearchManagementClient(credentials, subscriptionId); }
this.accessToken = credentials.tokenCache._entries[0].accessToken;
class StaticAccessToken implements TokenCredential {
public getToken(): Promise<AccessToken> {
return new Promise<AccessToken>(async (resolve, reject) => {
const t = new AccessToken2();
t.token = accessToken;
t.expiresOnTimestamp = expiresOnTimestamp;
resolve(t);
});
}
}
const token = new StaticAccessToken();
this.cloud = new ResourceManagementClient(token, subscriptionId);
this.webSiteClient = new WebSiteManagementClient(token, subscriptionId);
this.storageClient = new SqlManagementClient(token, subscriptionId);
this.cognitiveClient = new CognitiveServicesManagementClient(token, subscriptionId);
this.searchClient = new SearchManagementClient(token, subscriptionId);
} }
private async createStorageServer(group, name, administratorLogin, administratorPassword, serverName, location) { private async createStorageServer(
group: string,
name: string,
administratorLogin: string,
administratorPassword: string,
serverName: string,
location: string
) {
const params = { const params = {
location: location, location: location,
administratorLogin: administratorLogin, administratorLogin: administratorLogin,
administratorLoginPassword: administratorPassword, administratorLoginPassword: administratorPassword,
fullyQualifiedDomainName: serverName fullyQualifiedDomainName: serverName,
requestOptions: { timeout: 60 * 1000 * 5 }
}; };
const database = await this.storageClient.servers.createOrUpdate(group, name, params); let database: Server;
try {
database = await this.storageClient.servers.beginCreateOrUpdateAndWait(group, name, params);
} catch (error) {
// Try again (MSFT issues).
GBLogEx.info(0, 'Storage (server) creation failed. Retrying...');
database = await this.storageClient.servers.beginCreateOrUpdateAndWait(group, name, params);
}
// AllowAllWindowsAzureIps must be created that way, so the Azure Search can // AllowAllWindowsAzureIps must be created that way, so the Azure Search can
// access SQL Database to index its contents. // access SQL Database to index its contents.
const paramsFirewall = { const paramsFirewall = {
@ -612,25 +674,19 @@ export class AzureDeployerService implements IGBInstallationDeployer {
} }
public async createApplication(token: string, name: string) { public async createApplication(token: string, name: string) {
return new Promise<string>((resolve, reject) => {
let client = MicrosoftGraph.Client.init({ let client = MicrosoftGraph.Client.init({
authProvider: done => { authProvider: done => {
done(null, token); done(null, token);
} }
}); });
const app = { let app:any = {
displayName: name displayName: name,
signInAudience: "AzureADandPersonalMicrosoftAccount",
}; };
client.api(`/applications`).post(app, (err, res) => { const res = await client.api(`/applications`).post(app);
if (err) {
reject(err) return res;
}
else {
resolve(res);
}
});
});
} }
public async createApplicationSecret(token: string, appId: string) { public async createApplicationSecret(token: string, appId: string) {
@ -642,22 +698,21 @@ export class AzureDeployerService implements IGBInstallationDeployer {
}); });
const body = { const body = {
passwordCredential: { passwordCredential: {
displayName: "General Bots Generated" displayName: 'General Bots Generated'
} }
}; };
client.api(`/applications/${appId}/addPassword`).post(body, (err, res) => { client.api(`/applications/${appId}/addPassword`).post(body, (err, res) => {
if (err) { if (err) {
reject(err) reject(err);
} } else {
else {
resolve(res.secretText); resolve(res.secretText);
} }
}); });
}); });
} }
private async registerProviders(subscriptionId, baseUrl, accessToken) { private async registerProviders(subscriptionId: string, baseUrl: string, accessToken: string) {
const query = `subscriptions/${subscriptionId}/providers/${this.provider}/register?api-version=2018-02-01`; const query = `subscriptions/${subscriptionId}/providers/${this.provider}/register?api-version=2018-02-01`;
const requestUrl = urlJoin(baseUrl, query); const requestUrl = urlJoin(baseUrl, query);
@ -688,13 +743,12 @@ export class AzureDeployerService implements IGBInstallationDeployer {
let app = null; let app = null;
if (apps.bodyAsText && apps.bodyAsText !== '[]') { if (apps.bodyAsText && apps.bodyAsText !== '[]') {
const result = JSON.parse(apps.bodyAsText) const result = JSON.parse(apps.bodyAsText);
if (result.error) { if (result.error) {
if (result.error.code !== "401") { if (result.error.code !== '401') {
throw new Error(result.error); throw new Error(result.error);
} }
} } else {
else {
app = result.filter(x => x.name === name)[0]; app = result.filter(x => x.name === name)[0];
} }
} }
@ -728,14 +782,7 @@ export class AzureDeployerService implements IGBInstallationDeployer {
return await httpClient.sendRequest(req); return await httpClient.sendRequest(req);
} }
public async refreshEntityList( public async refreshEntityList(location: string, nlpAppId: string, clEntityId: string, nlpKey: string, data: any) {
location: string,
nlpAppId: string,
clEntityId: string,
nlpKey: string,
data: any,
) {
const req = new WebResource(); const req = new WebResource();
req.method = 'PUT'; req.method = 'PUT';
req.url = `https://${location}.api.cognitive.microsoft.com/luis/api/v2.0/apps/${nlpAppId}/versions/0.1/closedlists/${clEntityId}`; req.url = `https://${location}.api.cognitive.microsoft.com/luis/api/v2.0/apps/${nlpAppId}/versions/0.1/closedlists/${clEntityId}`;
@ -748,12 +795,7 @@ export class AzureDeployerService implements IGBInstallationDeployer {
return await httpClient.sendRequest(req); return await httpClient.sendRequest(req);
} }
public async trainNLP( public async trainNLP(location: string, nlpAppId: string, nlpAuthoringKey: string) {
location: string,
nlpAppId: string,
nlpAuthoringKey: string,
) {
const req = new WebResource(); const req = new WebResource();
req.method = 'POST'; req.method = 'POST';
req.url = `https://${location}.api.cognitive.microsoft.com/luis/api/v2.0/apps/${nlpAppId}/versions/0.1/train`; req.url = `https://${location}.api.cognitive.microsoft.com/luis/api/v2.0/apps/${nlpAppId}/versions/0.1/train`;
@ -765,16 +807,12 @@ export class AzureDeployerService implements IGBInstallationDeployer {
return await httpClient.sendRequest(req); return await httpClient.sendRequest(req);
} }
public async publishNLP( public async publishNLP(location: string, nlpAppId: string, nlpAuthoringKey: string) {
location: string,
nlpAppId: string,
nlpAuthoringKey: string,
) {
const body = { const body = {
versionId: "0.1", versionId: '0.1',
isStaging: false, isStaging: false,
directVersionPublish: false directVersionPublish: false
} };
const req = new WebResource(); const req = new WebResource();
req.method = 'POST'; req.method = 'POST';
req.url = `https://${location}.api.cognitive.microsoft.com/luis/api/v2.0/apps/${nlpAppId}/publish`; req.url = `https://${location}.api.cognitive.microsoft.com/luis/api/v2.0/apps/${nlpAppId}/publish`;
@ -787,29 +825,37 @@ export class AzureDeployerService implements IGBInstallationDeployer {
return await httpClient.sendRequest(req); return await httpClient.sendRequest(req);
} }
private async createSearch(group, name, location) { private async createSearch(group: string, name: string, location: string) {
const params = { const params = {
sku: { sku: {
name: name: this.freeTier ? 'free' : 'standard'
this.freeTier ? 'free' : 'standard'
}, },
location: location location: location
}; };
return await this.searchClient.services.createOrUpdate(group, name, params); return await this.searchClient.services.beginCreateOrUpdateAndWait(group, name, params as any);
} }
private async createStorage(group, serverName, name, location) { private async createStorage(group: string, serverName: string, name: string, location: string) {
const params = { const params = {
sku: { name: this.freeTier ? 'Free' : 'Basic' }, sku: { name: 'Basic' },
createMode: 'Default', createMode: 'Default',
location: location location: location
}; };
return await this.storageClient.databases.createOrUpdate(group, serverName, name, params); let database;
try {
database = await this.storageClient.databases.beginCreateOrUpdateAndWait(group, serverName, name, params);
} catch (error) {
// Try again (MSFT issues).
GBLogEx.info(0, 'Storage (database) creation failed. Retrying...');
database = await this.storageClient.databases.beginCreateOrUpdateAndWait(group, serverName, name, params);
}
return database;
} }
private async createCognitiveServices(group, name, location, kind): Promise<CognitiveServicesAccount> { private async createCognitiveServices(group: string, name: string, location: string, kind: string): Promise<Account> {
const params = { const params = {
sku: { sku: {
name: name name: name
@ -832,43 +878,43 @@ export class AzureDeployerService implements IGBInstallationDeployer {
params.sku.name = this.freeTier ? 'F0' : 'S0'; params.sku.name = this.freeTier ? 'F0' : 'S0';
} }
return await this.cognitiveClient.accounts.create(group, name, params); return await this.cognitiveClient.accounts.beginCreateAndWait(group, name, params);
} }
private async createSpeech(group, name, location): Promise<CognitiveServicesAccount> { private async createSpeech(group: string, name: string, location: string): Promise<Account> {
return await this.createCognitiveServices(group, name, location, 'SpeechServices'); return await this.createCognitiveServices(group, name, location, 'SpeechServices');
} }
private async createNLP(group, name, location): Promise<CognitiveServicesAccount> { private async createNLP(group: string, name: string, location: string): Promise<Account> {
return await this.createCognitiveServices(group, name, location, 'LUIS'); return await this.createCognitiveServices(group, name, location, 'LUIS');
} }
private async createNLPAuthoring(group, name, location): Promise<CognitiveServicesAccount> { private async createNLPAuthoring(group: string, name: string, location: string): Promise<Account> {
return await this.createCognitiveServices(group, name, location, 'LUIS.Authoring'); return await this.createCognitiveServices(group, name, location, 'LUIS.Authoring');
} }
private async createSpellChecker(group, name): Promise<CognitiveServicesAccount> { private async createSpellChecker(group: string, name: string): Promise<Account> {
return await this.createCognitiveServices(group, name, 'westus', 'CognitiveServices'); return await this.createCognitiveServices(group, name, 'westus', 'CognitiveServices');
} }
private async createTextAnalytics(group, name, location): Promise<CognitiveServicesAccount> { private async createTextAnalytics(group: string, name: string, location: string): Promise<Account> {
return await this.createCognitiveServices(group, name, location, 'TextAnalytics'); return await this.createCognitiveServices(group, name, location, 'TextAnalytics');
} }
private async createDeployGroup(name, location) { private async createDeployGroup(name: string, location: string) {
const params = { location: location }; const params = { location: location };
return await this.cloud.resourceGroups.createOrUpdate(name, params); return await this.cloud.resourceGroups.createOrUpdate(name, params);
} }
private async enableResourceProviders(name) { private async enableResourceProviders(name: string) {
const ret = await this.cloud.providers.get(name); const ret = await this.cloud.providers.get(name);
if (ret.registrationState === "NotRegistered") { if (ret.registrationState === 'NotRegistered') {
await this.cloud.providers.register(name); await this.cloud.providers.register(name);
} }
} }
private async createHostingPlan(group, name, location): Promise<AppServicePlan> { private async createHostingPlan(group: string, name: string, location: string): Promise<AppServicePlan> {
const params = { const params = {
serverFarmWithRichSkuName: name, serverFarmWithRichSkuName: name,
location: location, location: location,
@ -879,25 +925,23 @@ export class AzureDeployerService implements IGBInstallationDeployer {
} }
}; };
return await this.webSiteClient.appServicePlans.createOrUpdate(group, name, params); return await this.webSiteClient.appServicePlans.beginCreateOrUpdateAndWait(group, name, params);
} }
private async createServer(farmId, group, name, location) { private async createServer(farmId: string, group: string, name: string, location: string) {
let tryed = false; let tryed = false;
const create = async () => { const create = async () => {
const parameters: Site = { const parameters: Site = {
location: location, location: location,
serverFarmId: farmId, serverFarmId: farmId,
siteConfig: { siteConfig: {
nodeVersion: GBAdminService.getNodeVersion(), nodeVersion: await GBAdminService.getNodeVersion(),
detailedErrorLoggingEnabled: true, detailedErrorLoggingEnabled: true,
requestTracingEnabled: true requestTracingEnabled: true
} }
}; };
const server = await this.webSiteClient.webApps.createOrUpdate(group, name, parameters); const server = await this.webSiteClient.webApps.beginCreateOrUpdateAndWait(group, name, parameters);
const siteLogsConfig: SiteLogsConfig = { const siteLogsConfig: SiteLogsConfig = {
applicationLogs: { applicationLogs: {
@ -914,7 +958,7 @@ export class AzureDeployerService implements IGBInstallationDeployer {
deploymentRollbackEnabled: false deploymentRollbackEnabled: false
}; };
await this.webSiteClient.webApps.createOrUpdateSourceControl(group, name, souceControlConfig); await this.webSiteClient.webApps.beginCreateOrUpdateSourceControlAndWait(group, name, souceControlConfig);
return server; return server;
}; };
@ -923,32 +967,28 @@ export class AzureDeployerService implements IGBInstallationDeployer {
} catch (e) { } catch (e) {
if (!tryed) { if (!tryed) {
tryed = true; tryed = true;
GBLog.info('Retrying Deploying Bot Server...'); GBLogEx.info(0, 'Retrying Deploying Bot Server...');
try { try {
return await create(); return await create();
} catch (error) { } catch (error) {
GBLog.info('Server creation failed at all on MSAzure, stopping...'); GBLogEx.info(0, 'Server creation failed at all on MSAzure, stopping...');
throw error; throw error;
} }
} }
} }
} }
private async updateWebisteConfig(group, name, serverFarmId, instance: IGBInstance) { private async updateWebisteConfig(group: string, name: string, serverFarmId: string, instance: IGBInstance) {
const parameters: Site = { const parameters: Site = {
location: instance.cloudLocation, location: instance.cloudLocation,
serverFarmId: serverFarmId, serverFarmId: serverFarmId,
siteConfig: { siteConfig: {
appSettings: [ appSettings: [
{ name: 'WEBSITES_CONTAINER_START_TIME_LIMIT', value: `${WebSiteResponseTimeout}` }, { name: 'WEBSITES_CONTAINER_START_TIME_LIMIT', value: `${WebSiteResponseTimeout}` },
{ name: 'WEBSITE_NODE_DEFAULT_VERSION', value: GBAdminService.getNodeVersion() }, { name: 'WEBSITE_NODE_DEFAULT_VERSION', value: await GBAdminService.getNodeVersion() },
{ name: 'ADDITIONAL_DEPLOY_PATH', value: `` },
{ name: 'ADMIN_PASS', value: `${instance.adminPass}` },
{ name: 'BOT_ID', value: `${instance.botId}` }, { name: 'BOT_ID', value: `${instance.botId}` },
{ name: 'CLOUD_SUBSCRIPTIONID', value: `${instance.cloudSubscriptionId}` }, { name: 'CLOUD_SUBSCRIPTIONID', value: `${instance.cloudSubscriptionId}` },
{ name: 'CLOUD_LOCATION', value: `${instance.cloudLocation}` }, { name: 'CLOUD_LOCATION', value: `${instance.cloudLocation}` },
{ name: 'CLOUD_GROUP', value: `${instance.botId}` },
{ name: 'CLOUD_USERNAME', value: `${instance.cloudUsername}` }, { name: 'CLOUD_USERNAME', value: `${instance.cloudUsername}` },
{ name: 'CLOUD_PASSWORD', value: `${instance.cloudPassword}` }, { name: 'CLOUD_PASSWORD', value: `${instance.cloudPassword}` },
{ name: 'MARKETPLACE_ID', value: `${instance.marketplaceId}` }, { name: 'MARKETPLACE_ID', value: `${instance.marketplaceId}` },
@ -958,12 +998,11 @@ export class AzureDeployerService implements IGBInstallationDeployer {
{ name: 'STORAGE_NAME', value: `${instance.storageName}` }, { name: 'STORAGE_NAME', value: `${instance.storageName}` },
{ name: 'STORAGE_USERNAME', value: `${instance.storageUsername}` }, { name: 'STORAGE_USERNAME', value: `${instance.storageUsername}` },
{ name: 'STORAGE_PASSWORD', value: `${instance.storagePassword}` }, { name: 'STORAGE_PASSWORD', value: `${instance.storagePassword}` },
{ name: 'STORAGE_SYNC', value: `true` }] { name: 'STORAGE_SYNC', value: `true` }
]
} }
}; };
return await this.webSiteClient.webApps.createOrUpdate(group, name, parameters); return await this.webSiteClient.webApps.beginCreateOrUpdateAndWait(group, name, parameters);
} }
} }

View file

@ -1,6 +1,6 @@
export const Messages = { export const Messages = {
'en-US': { 'en-US': {
about_suggestions: 'Suggestions are welcomed and improve my quality...' about_suggestions: 'Suggestions are welcomed and improve my quality...'
}, },
'pt-BR': { 'pt-BR': {
about_suggestions: 'Sugestões melhoram muito minha qualidade...' about_suggestions: 'Sugestões melhoram muito minha qualidade...'

View file

@ -1,374 +0,0 @@
/*****************************************************************************\
| ( )_ _ |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' |
| | | ( )_) | |
| (_) \___/' |
| |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. |
| Licensed under the AGPL-3.0. |
| |
| According to our dual licensing model, this program can be used either |
| under the terms of the GNU Affero General Public License, version 3, |
| or under a proprietary license. |
| |
| The texts of the GNU Affero General Public License with an additional |
| permission and of our proprietary license can be found at and |
| in the LICENSE file you have received along with this program. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY, without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. |
| |
| "General Bots" is a registered trademark of Pragmatismo.io. |
| The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. |
| |
\*****************************************************************************/
'use strict';
import { WaterfallDialog } from 'botbuilder-dialogs';
import { GBLog } from 'botlib';
import * as fs from 'fs';
import { CollectionUtil } from 'pragmatismo-io-framework';
import * as request from 'request-promise-native';
import { Messages } from '../strings';
import { GBConversationalService } from '../../core.gbapp/services/GBConversationalService';
const Path = require('path');
const phoneUtil = require('google-libphonenumber').PhoneNumberUtil.getInstance();
const phone = require('phone');
//tslint:disable-next-line:no-submodule-imports
/**
* HEAR Bot Framework support.
*/
export class HearDialog {
private static async downloadAttachmentAndWrite(attachment) {
// Retrieve the attachment via the attachment's contentUrl.
const url = attachment.contentUrl;
// Local file path for the bot to save the attachment.
const localFileName = Path.join(__dirname, attachment.name);
try {
// arraybuffer is necessary for images
const options = {
url: url,
method: 'GET',
encoding: 'binary',
};
let response = await request.get(options);
fs.writeFile(localFileName, response, (fsError) => {
if (fsError) {
throw fsError;
}
});
} catch (error) {
console.error(error);
return undefined;
}
// If no error was thrown while writing to disk, return the attachment's name
// and localFilePath for the response back to the user.
return {
fileName: attachment.name,
localPath: localFileName
};
}
public static addHearDialog(min) {
min.dialogs.add(
new WaterfallDialog('/hear', [
async step => {
step.activeDialog.state.options = step.options;
step.activeDialog.state.options.id = (step.options as any).id;
step.activeDialog.state.options.previousResolve = (step.options as any).previousResolve;
if (step.options['args']) {
GBLog.info(`BASIC: Asking for input (HEAR with ${step.options['args'][0]}).`);
}
else {
GBLog.info('BASIC: Asking for input (HEAR).');
}
step.activeDialog.state.options = step.options;
if (step.activeDialog.state.options['kind'] === "login") {
if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) {
GBLog.info('BASIC: Authenticating beforing running General Bots BASIC code.');
return await step.beginDialog('/auth');
}
}
return await step.next(step.options);
},
async step => {
if (step.activeDialog.state.options['kind'] === "login") {
return await step.next(step.options);
} else {
if (step.activeDialog.state.options['kind'] === "file") {
return await step.prompt('attachmentPrompt', {});
}
else{
return await min.conversationalService.prompt(min, step, null);
}
}
},
async step => {
const isIntentYes = (locale, utterance) => {
return utterance.toLowerCase().match(Messages[locale].affirmative_sentences);
}
let result = step.context.activity['originalText'];
if (step.activeDialog.state.options['kind'] === "file") {
// Prepare Promises to download each attachment and then execute each Promise.
const promises = step.context.activity.attachments.map(HearDialog.downloadAttachmentAndWrite);
const successfulSaves = await Promise.all(promises);
async function replyForReceivedAttachments(localAttachmentData) {
if (localAttachmentData) {
// Because the TurnContext was bound to this function, the bot can call
// `TurnContext.sendActivity` via `this.sendActivity`;
await this.sendActivity(`Attachment "${localAttachmentData.fileName}" ` +
`has been received and saved to "${localAttachmentData.localPath}".`);
} else {
await this.sendActivity('Attachment was not successfully saved to disk.');
}
}
// Prepare Promises to reply to the user with information about saved attachments.
// The current TurnContext is bound so `replyForReceivedAttachments` can also send replies.
const replyPromises = successfulSaves.map(replyForReceivedAttachments.bind(step.context));
await Promise.all(replyPromises);
}
else if (step.activeDialog.state.options['kind'] === "boolean") {
if (isIntentYes('pt-BR', step.result)) {
result = true;
}
else {
result = false;
}
}
else if (step.activeDialog.state.options['kind'] === "email") {
const extractEntity = (text) => {
return text.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gi);
}
const value = extractEntity(step.result);
if (value === null) {
await step.context.sendActivity("Por favor, digite um e-mail válido.");
return await step.replaceDialog('/hear', step.activeDialog.state.options);
}
result = value;
}
else if (step.activeDialog.state.options['kind'] === "name") {
const extractEntity = text => {
return text.match(/[_a-zA-Z][_a-zA-Z0-9]{0,16}/gi);
};
const value = extractEntity(step.result);
if (value === null || value.length != 1) {
await step.context.sendActivity("Por favor, digite um nome válido.");
return await step.replaceDialog('/hear', step.activeDialog.state.options);
}
result = value;
}
else if (step.activeDialog.state.options['kind'] === "integer") {
const extractEntity = text => {
return text.match(/\d+/gi);
};
const value = extractEntity(step.result);
if (value === null || value.length != 1) {
await step.context.sendActivity("Por favor, digite um número válido.");
return await step.replaceDialog('/hear', step.activeDialog.state.options);
}
result = value;
}
else if (step.activeDialog.state.options['kind'] === "date") {
const extractEntity = text => {
return text.match(/(^(((0[1-9]|1[0-9]|2[0-8])[\/](0[1-9]|1[012]))|((29|30|31)[\/](0[13578]|1[02]))|((29|30)[\/](0[4,6,9]|11)))[\/](19|[2-9][0-9])\d\d$)|(^29[\/]02[\/](19|[2-9][0-9])(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)$)/gi);
};
const value = extractEntity(step.result);
if (value === null || value.length != 1) {
await step.context.sendActivity("Por favor, digite uma data no formato 12/12/2020.");
return await step.replaceDialog('/hear', step.activeDialog.state.options);
}
result = value;
}
else if (step.activeDialog.state.options['kind'] === "hour") {
const extractEntity = text => {
return text.match(/^([0-1]?[0-9]|2[0-4]):([0-5][0-9])(:[0-5][0-9])?$/gi);
};
const value = extractEntity(step.result);
if (value === null || value.length != 1) {
await step.context.sendActivity("Por favor, digite um horário no formato hh:ss.");
return await step.replaceDialog('/hear', step.activeDialog.state.options);
}
result = value;
}
else if (step.activeDialog.state.options['kind'] === "money") {
const extractEntity = text => {
if (step.context.locale === 'en') { // TODO: Change to user.
return text.match(/(?:\d{1,3},)*\d{1,3}(?:\.\d+)?/gi);
}
else {
return text.match(/(?:\d{1,3}.)*\d{1,3}(?:\,\d+)?/gi);
}
};
const value = extractEntity(step.result);
if (value === null || value.length != 1) {
await step.context.sendActivity("Por favor, digite um valor monetário.");
return await step.replaceDialog('/hear', step.activeDialog.state.options);
}
result = value;
}
else if (step.activeDialog.state.options['kind'] === "mobile") {
const locale = step.context.activity.locale;
let phoneNumber;
try {
phoneNumber = phone(step.result, 'BRA')[0]; // TODO: Use accordingly to the person.
phoneNumber = phoneUtil.parse(phoneNumber);
} catch (error) {
await step.context.sendActivity(Messages[locale].validation_enter_valid_mobile);
return await step.replaceDialog('/profile_mobile', step.activeDialog.state.options);
}
if (!phoneUtil.isPossibleNumber(phoneNumber)) {
await step.context.sendActivity("Por favor, digite um número de telefone válido.");
return await step.replaceDialog('/hear', step.activeDialog.state.options);
}
result = phoneNumber;
}
else if (step.activeDialog.state.options['kind'] === "zipcode") {
const extractEntity = text => {
text = text.replace(/\-/gi, '');
if (step.context.locale === 'en') { // TODO: Change to user.
return text.match(/\d{8}/gi);
}
else {
return text.match(/(?:\d{1,3}.)*\d{1,3}(?:\,\d+)?/gi);
}
};
const value = extractEntity(step.result);
if (value === null || value.length != 1) {
await step.context.sendActivity("Por favor, digite um valor monetário.");
return await step.replaceDialog('/hear', step.activeDialog.state.options);
}
result = value[0];
}
else if (step.activeDialog.state.options['kind'] === "menu") {
const list = step.activeDialog.state.options['args'];
result = null;
await CollectionUtil.asyncForEach(list, async item => {
if (GBConversationalService.kmpSearch(step.result, item) != -1) {
result = item;
}
});
if (result === null) {
await step.context.sendActivity(`Escolha por favor um dos itens sugeridos.`);
return await step.replaceDialog('/hear', step.activeDialog.state.options);
}
}
else if (step.activeDialog.state.options['kind'] === "language") {
result = null;
const list = [
{ name: 'english', code: 'en' },
{ name: 'inglês', code: 'en' },
{ name: 'portuguese', code: 'pt' },
{ name: 'português', code: 'pt' },
{ name: 'français', code: 'fr' },
{ name: 'francês', code: 'fr' },
{ name: 'french', code: 'fr' },
{ name: 'spanish', code: 'es' },
{ name: 'espanõl', code: 'es' },
{ name: 'espanhol', code: 'es' },
{ name: 'german', code: 'de' },
{ name: 'deutsch', code: 'de' },
{ name: 'alemão', code: 'de' }
];
const text = step.context.activity['originalText'];
await CollectionUtil.asyncForEach(list, async item => {
if (GBConversationalService.kmpSearch(text.toLowerCase(), item.name.toLowerCase()) != -1 ||
GBConversationalService.kmpSearch(text.toLowerCase(), item.code.toLowerCase()) != -1) {
result = item.code;
}
});
if (result === null) {
await min.conversationalService.sendText(min, step, `Escolha por favor um dos idiomas sugeridos.`);
return await step.replaceDialog('/hear', step.activeDialog.state.options);
}
}
const id = step.activeDialog.state.options.id;
if (min.cbMap[id]) {
const promise = min.cbMap[id].promise;
delete min.cbMap[id];
try {
const opts = await promise(step, result);
if (opts) {
return await step.replaceDialog('/hear', opts);
}
} catch (error) {
GBLog.error(`Error in BASIC code: ${error}`);
const locale = step.context.activity.locale;
await min.conversationalService.sendText(min, step, Messages[locale].very_sorry_about_error);
}
}
return await step.endDialog();
}
])
);
}
}

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -37,16 +35,62 @@
'use strict'; 'use strict';
import { GBDialogStep, GBLog, GBMinInstance, IGBCoreService, IGBPackage } from 'botlib'; import { GBDialogStep, GBLog, GBMinInstance, IGBCoreService, IGBPackage } from 'botlib';
import { GuaribasSchedule } from '../core.gbapp/models/GBModel'; import { GuaribasSchedule } from '../core.gbapp/models/GBModel.js';
import { Sequelize } from 'sequelize-typescript'; import { Sequelize } from 'sequelize-typescript';
import Koa from 'koa';
import cors from '@koa/cors';
import { createKoaHttpMiddleware } from '@push-rpc/http';
import { GBServer } from '../../src/app.js';
import { SocketServer } from '@push-rpc/core';
import * as koaBody from 'koa-body';
import ratelimit from 'koa-ratelimit';
export function createKoaHttpServer(port: number, getRemoteId: (ctx: Koa.Context) => string, opts: {}): SocketServer {
const { onError, onConnection, middleware } = createKoaHttpMiddleware(getRemoteId);
const app = new Koa();
// Apply the rate-limiting middleware
app.use(
ratelimit({
driver: 'memory', // Use 'memory' for in-memory store
duration: 60000, // 1 minute window
errorMessage: 'Slow down your requests',
id: ctx => ctx.ip, // Identify client by IP address
headers: {
remaining: 'X-RateLimit-Remaining',
reset: 'X-RateLimit-Reset',
total: 'X-RateLimit-Limit'
},
max: 100, // Limit each IP to 100 requests per window
disableHeader: false
})
);
app.use(cors({ origin: '*' }));
app.use(koaBody.koaBody({ jsonLimit: '1024mb', textLimit: '1024mb', formLimit: '1024mb', multipart: true }));
app.use(middleware);
const server = app.listen(port);
const SERVER_TIMEOUT = 60 * 60 * 24 * 1000; // Equals to client RPC set.
server.timeout = SERVER_TIMEOUT;
return {
onError,
onConnection,
close(cb) {
server.close(cb);
}
};
}
/** /**
* Package for core.gbapp. * Package for core.gbapp.
*/ */
export class GBBasicPackage implements IGBPackage { export class GBBasicPackage implements IGBPackage {
public sysPackages: IGBPackage[]; public sysPackages: IGBPackage[];
public CurrentEngineName = "guaribas-1.0.0"; public CurrentEngineName = 'guaribas-1.0.0';
public async loadPackage(core: IGBCoreService, sequelize: Sequelize): Promise<void> { public async loadPackage(core: IGBCoreService, sequelize: Sequelize): Promise<void> {
core.sequelize.addModels([GuaribasSchedule]); core.sequelize.addModels([GuaribasSchedule]);
} }
@ -67,6 +111,14 @@ export class GBBasicPackage implements IGBPackage {
GBLog.verbose(`onExchangeData called.`); GBLog.verbose(`onExchangeData called.`);
} }
public async loadBot(min: GBMinInstance): Promise<void> { public async loadBot(min: GBMinInstance): Promise<void> {
const botId = min.botId;
GBServer.globals.debuggers[botId] = {};
GBServer.globals.debuggers[botId].state = 0;
GBServer.globals.debuggers[botId].breaks = [];
GBServer.globals.debuggers[botId].stateInfo = 'Stopped';
GBServer.globals.debuggers[botId].childProcess = null;
GBServer.globals.debuggers[botId].client = null;
GBServer.globals.debuggers[botId].conversationId = null;
GBServer.globals.debuggers[botId].watermarkMap = {};
} }
} }

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -49,31 +47,29 @@ import {
UpdatedAt UpdatedAt
} from 'sequelize-typescript'; } from 'sequelize-typescript';
import { GuaribasInstance } from '../../core.gbapp/models/GBModel'; import { GuaribasInstance } from '../../core.gbapp/models/GBModel.js';
@Table @Table
//tslint:disable-next-line:max-classes-per-file //tslint:disable-next-line:max-classes-per-file
export class GuaribasSchedule extends Model<GuaribasSchedule> { export class GuaribasSchedule extends Model<GuaribasSchedule> {
@Column(DataType.STRING(255))
name: string;
@Column (DataType.STRING(255)) @Column(DataType.STRING(255))
public name: string; schedule: string;
@Column (DataType.STRING(255))
public schedule: string;
@ForeignKey(() => GuaribasInstance) @ForeignKey(() => GuaribasInstance)
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public instanceId: number; instanceId: number;
@BelongsTo(() => GuaribasInstance) @BelongsTo(() => GuaribasInstance)
public instance: GuaribasInstance; instance: GuaribasInstance;
@Column(DataType.DATE) @Column(DataType.DATE)
@CreatedAt @CreatedAt
public createdAt: Date; declare createdAt: Date;
@Column(DataType.DATE) @Column(DataType.DATE)
@UpdatedAt @UpdatedAt
public updatedAt: Date; declare updatedAt: Date;
} }

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -32,37 +30,32 @@
'use strict'; 'use strict';
const urlJoin = require('url-join'); import { GBSSR }from '../../core.gbapp/services/GBSSR.js';
const DateDiff = require('date-diff');
const puppeteer = require('puppeteer');
const Path = require('path');
import bb from "billboard.js";
export class ChartServices { export class ChartServices {
/**
* Generate chart image screenshot
* @param {object} options billboard.js generation option object
* @param {string} path screenshot image full path with file name
*/
public static async screenshot (args, path) {
const browser = await GBSSR.createBrowser(null);
const page = await browser.newPage();
/** // load billboard.js assets from CDN.
* Generate chart image screenshot await page.addStyleTag({ url: 'https://cdn.jsdelivr.net/npm/billboard.js/dist/theme/datalab.min.css' });
* @param {object} options billboard.js generation option object await page.addScriptTag({ url: 'https://cdn.jsdelivr.net/npm/billboard.js/dist/billboard.pkgd.min.js' });
* @param {string} path screenshot image full path with file name
*/
public static async screenshot(args, path) {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
// load billboard.js assets from CDN.
await page.addStyleTag({ url: "https://cdn.jsdelivr.net/npm/billboard.js/dist/theme/datalab.min.css" });
await page.addScriptTag({ url: "https://cdn.jsdelivr.net/npm/billboard.js/dist/billboard.pkgd.min.js" });
await page.evaluate(`bb.generate(${JSON.stringify(args)});`); await page.evaluate(`bb.generate(${JSON.stringify(args)});`);
const content = await page.$(".bb"); const content = await page.$('.bb');
await content.screenshot({ await content.screenshot({
path, path,
omitBackground: true omitBackground: true
}); });
await page.close(); await page.close();
await browser.close(); await browser.close();
} }
} }

View file

@ -0,0 +1,216 @@
/*****************************************************************************\
| ® |
| |
| |
| |
| |
| |
| General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. |
| |
| According to our dual licensing model, this program can be used either |
| under the terms of the GNU Affero General Public License, version 3, |
| or under a proprietary license. |
| |
| The texts of the GNU Affero General Public License with an additional |
| permission and of our proprietary license can be found at and |
| in the LICENSE file you have received along with this program. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY, without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. |
| |
| "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. |
| |
\*****************************************************************************/
'use strict';
import { GBLog, GBMinInstance } from 'botlib';
import { GBServer } from '../../../src/app.js';
import fs from 'fs/promises';
import SwaggerClient from 'swagger-client';
import { spawn } from 'child_process';
import { CodeServices } from '../../llm.gblib/services/CodeServices.js';
import { GBLogEx } from '../../core.gbapp/services/GBLogEx.js';
import { GBUtil } from '../../../src/util.js';
/**
* Web Automation services of conversation to be called by BASIC.
*/
export class DebuggerService {
public async setBreakpoint({ botId, line }) {
GBLogEx.info(botId, `Enabled breakpoint for ${botId} on ${line}.`);
GBServer.globals.debuggers[botId].breaks.push(Number.parseInt(line));
}
public async refactor({ botId, code, change }) {
const service = new CodeServices();
return await service.refactor(code, change);
}
public async resume({ botId }) {
if (GBServer.globals.debuggers[botId].state === 2) {
const client = GBServer.globals.debuggers[botId].client;
await client.Debugger.resume();
GBServer.globals.debuggers[botId].state = 1;
GBServer.globals.debuggers[botId].stateInfo = 'Running (Debug)';
return { status: 'OK' };
} else {
const error = 'Invalid call to resume and state not being debug(2).';
return { error: error };
}
}
public async stop({ botId }) {
GBServer.globals.debuggers[botId].state = 0;
GBServer.globals.debuggers[botId].stateInfo = 'Stopped';
const kill = ref => {
spawn('sh', ['-c', `pkill -9 -f ${ref}`]);
};
kill(GBServer.globals.debuggers[botId].childProcess);
return { status: 'OK' };
}
public async step({ botId }) {
if (GBServer.globals.debuggers[botId].state === 2) {
GBServer.globals.debuggers[botId].stateInfo = 'Break';
const client = GBServer.globals.debuggers[botId].client;
await client.Debugger.stepOver();
return { status: 'OK' };
} else {
const error = 'Invalid call to stepOver and state not being debug(2).';
return { error: error };
}
}
public async getContext({ botId }) {
const conversationsMap = GBServer.globals.debuggers[botId].conversationsMap;
const watermarkMap = GBServer.globals.debuggers[botId].watermarkMap;
const conversationId = conversationsMap[botId];
let messages = [];
const client = GBServer.globals.debuggers[botId].client;
if (client) {
const response = await client.apis.Conversations.Conversations_GetActivities({
conversationId: conversationId,
watermark: watermarkMap[botId]
});
watermarkMap[botId] = response.obj.watermark;
let activities = response.obj.activites;
if (activities && activities.length) {
activities = activities.filter(m => m.from.id === botId && m.type === 'message');
if (activities.length) {
activities.forEach(activity => {
messages.push({ text: activity.text });
GBLogEx.info(botId, `Debugger sending text to API: ${activity.text}`);
});
}
}
}
let messagesText = messages.join('\n');
return {
status: 'OK',
state: GBServer.globals.debuggers[botId].state,
messages: messagesText,
scope: GBServer.globals.debuggers[botId].scope,
scopeInfo: GBServer.globals.debuggers[botId].stateInfo
};
}
public async start({ botId, botApiKey, scriptName }) {
const conversationsMap = GBServer.globals.debuggers[botId].conversationsMap;
let error;
if (!GBServer.globals.debuggers[botId]) {
GBServer.globals.debuggers[botId] = {};
}
if (!scriptName) {
scriptName = 'start';
}
if (GBServer.globals.debuggers[botId].state === 1) {
error = `Cannot DEBUG an already running process. ${botId}`;
return { error: error };
} else if (GBServer.globals.debuggers[botId].state === 2) {
GBLogEx.info(botId, `Releasing execution ${botId} in DEBUG mode.`);
await this.resume({ botId });
return { status: 'OK' };
} else {
GBLogEx.info(botId, `Running ${botId} in DEBUG mode.`);
GBServer.globals.debuggers[botId].state = 1;
GBServer.globals.debuggers[botId].stateInfo = 'Running (Debug)';
let min: GBMinInstance = GBServer.globals.minInstances.filter(p => p.instance.botId === botId)[0];
const client = await GBUtil.getDirectLineClient(min);
GBServer.globals.debuggers[botId].client = client;
const response = await client.apis.Conversations.Conversations_StartConversation();
const conversationId = response.obj.conversationId;
GBServer.globals.debuggers[botId].conversationId = conversationId;
client.apis.Conversations.Conversations_PostActivity({
conversationId: conversationId,
activity: {
textFormat: 'plain',
text: `/calldbg ${scriptName}`,
type: 'message',
from: {
id: 'word',
name: 'word'
}
}
});
return { status: 'OK' };
}
}
public async sendMessage({ botId, botApiKey, text }) {
const conversationsMap = GBServer.globals.debuggers[botId].conversationsMap;
let error;
if (!GBServer.globals.debuggers[botId]) {
GBServer.globals.debuggers[botId] = {};
}
if (GBServer.globals.debuggers[botId].state != 1) {
error = `Cannot sendMessage to an stopped process. ${botId}`;
return { error: error };
}
let min: GBMinInstance = GBServer.globals.minInstances.filter(p => p.instance.botId === botId)[0];
const client = GBServer.globals.debuggers[botId].client;
const conversationId = GBServer.globals.debuggers[botId].conversationId;
client.apis.Conversations.Conversations_PostActivity({
conversationId: conversationId,
activity: {
textFormat: 'plain',
text: text,
type: 'message',
from: {
id: 'word',
name: 'word'
}
}
});
return { status: 'OK' };
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,182 @@
/*****************************************************************************\
| ® |
| |
| |
| |
| |
| |
| General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. |
| |
| According to our dual licensing model, this program can be used either |
| under the terms of the GNU Affero General Public License, version 3, |
| or under a proprietary license. |
| |
| The texts of the GNU Affero General Public License with an additional |
| permission and of our proprietary license can be found at and |
| in the LICENSE file you have received along with this program. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY, without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. |
| |
| "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. |
| |
\*****************************************************************************/
'use strict';
import path from 'path';
import { GBLog, GBMinInstance } from 'botlib';
import { DialogKeywords } from './DialogKeywords.js';
import { CollectionUtil } from 'pragmatismo-io-framework';
import { GBAdminService } from '../../admin.gbapp/services/GBAdminService.js';
import urlJoin from 'url-join';
import { GBServer } from '../../../src/app.js';
import { GBLogEx } from '../../core.gbapp/services/GBLogEx.js';
import { GBUtil } from '../../../src/util.js';
import fs from 'fs/promises';
import { AzureOpenAI } from 'openai';
import { OpenAIClient } from '@langchain/openai';
/**
* Image processing services of conversation to be called by BASIC.
*/
export class ImageProcessingServices {
/**
* Sharpen the image.
*
* @example file = SHARPEN file
*/
public async sharpen({ pid, file: file }) {
const { min, user } = await DialogKeywords.getProcessInfo(pid);
GBLogEx.info(min, `Image Processing SHARPEN ${file}.`);
const gbfile = DialogKeywords.getFileByHandle(file);
// TODO: sharp.
return;
}
/**
* SET ORIENTATION VERTICAL
*
* file = MERGE file1, file2, file3
*/
public async mergeImage({ pid, files }) {
const { min, user } = await DialogKeywords.getProcessInfo(pid);
let paths = [];
await CollectionUtil.asyncForEach(files, async file => {
const gbfile = DialogKeywords.getFileByHandle(file);
paths.push(gbfile.path);
});
const botId = min.instance.botId;
const packagePath = GBUtil.getGBAIPath(min.botId);
// TODO: const img = await joinImages(paths);
const localName = path.join(
'work',
packagePath,
'cache',
`img-mrg${GBAdminService.getRndReadableIdentifier()}.png`
);
const url = urlJoin(GBServer.globals.publicAddress, min.botId, 'cache', path.basename(localName));
// img.toFile(localName);
return { localName: localName, url: url, data: null };
}
/**
* Sharpen the image.
*
* @example file = BLUR file
*/
public async blur({ pid, file: file }) {
const { min, user } = await DialogKeywords.getProcessInfo(pid);
GBLogEx.info(min, `Image Processing SHARPEN ${file}.`);
const gbfile = DialogKeywords.getFileByHandle(file);
return;
}
public async getImageFromPrompt({ pid, prompt }) {
const { min, user, params } = await DialogKeywords.getProcessInfo(pid);
GBLogEx.info(min, `DALL-E: ${prompt}.`);
const azureOpenAIKey = await min.core.getParam(min.instance, 'Azure Open AI Key', null, true);
const azureOpenAIEndpoint = await min.core.getParam(min.instance, 'Azure Open AI Endpoint', null, true);
const azureOpenAIVersion = await (min.core as any)['getParam'](min.instance, 'Azure Open AI Version', null, true);
const azureOpenAIImageModel = await (min.core as any)['getParam'](min.instance, 'Azure Open AI Image Model', null, true);
if (azureOpenAIKey) {
// Initialize the Azure OpenAI client
const client = new AzureOpenAI({
endpoint: azureOpenAIEndpoint,
deployment: azureOpenAIImageModel,
apiVersion: azureOpenAIVersion,
apiKey: azureOpenAIKey
});
// Make a request to the image generation endpoint
const response = await client.images.generate({
prompt: prompt,
n: 1, // Don't include for DALL-E 3 (always generates 1 image)
style: 'vivid', // optional ('natural' or 'vivid')
size: '1024x1024',
quality: 'standard', // optional
});
const gbaiName = GBUtil.getGBAIPath(min.botId);
const localName = path.join('work', gbaiName, 'cache', `DALL-E${GBAdminService.getRndReadableIdentifier()}.png`);
const url = response.data[0].url;
const res = await fetch(url);
let buf: any = Buffer.from(await res.arrayBuffer());
await fs.writeFile(localName, buf, { encoding: null });
GBLogEx.info(min, `DALL-E: ${url} - ${response.data[0].revised_prompt}.`);
return { localName, url };
}
}
public async getCaptionForImage({ pid, imageUrl }) {
const { min, user, params } = await DialogKeywords.getProcessInfo(pid);
const azureOpenAIKey = await min.core.getParam(min.instance, 'Azure Open AI Key', null);
const azureOpenAITextModel = 'gpt-4'; // Specify GPT-4 model here
const azureOpenAIEndpoint = await min.core.getParam(min.instance, 'Azure Open AI Endpoint', null);
const azureOpenAIVersion = await (min.core as any)['getParam'](min.instance, 'Azure Open AI Version', null, true);
if (azureOpenAIKey && azureOpenAITextModel && imageUrl) {
const client = new AzureOpenAI({
apiVersion: azureOpenAIVersion,
apiKey: azureOpenAIKey,
baseURL: azureOpenAIEndpoint
});
const prompt = `Provide a descriptive caption for the image at the following URL: ${imageUrl}`;
const response = await client.completions.create({
model: azureOpenAITextModel,
prompt: prompt,
max_tokens: 50
});
const caption = response['data'].choices[0].text.trim();
GBLogEx.info(min, `Generated caption: ${caption}`);
return { caption };
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -33,13 +31,13 @@
'use strict'; 'use strict';
import { GBLog, GBMinInstance, GBService } from 'botlib'; import { GBLog, GBMinInstance, GBService } from 'botlib';
import { GBServer } from '../../../src/app'; import { GBServer } from '../../../src/app.js';
import { CollectionUtil } from 'pragmatismo-io-framework'; import { CollectionUtil } from 'pragmatismo-io-framework';
import { GBVMService } from '../../basic.gblib/services/GBVMService'; import { GBVMService } from '../../basic.gblib/services/GBVMService.js';
import { GuaribasSchedule } from '../../core.gbapp/models/GBModel'; import { GuaribasSchedule } from '../../core.gbapp/models/GBModel.js';
import { FindOptions } from 'sequelize/types';
const cron = require('node-cron'); import cron from 'node-cron';
import { GBLogEx } from '../../core.gbapp/services/GBLogEx.js';
/** /**
* @fileoverview Schedule Services. * @fileoverview Schedule Services.
@ -49,36 +47,36 @@ const cron = require('node-cron');
* Basic services for BASIC manipulation. * Basic services for BASIC manipulation.
*/ */
export class ScheduleServices extends GBService { export class ScheduleServices extends GBService {
public async deleteScheduleIfAny(min: GBMinInstance, name: string) { public async deleteScheduleIfAny(min: GBMinInstance, name: string) {
let i = 1;
while (i <= 10) {
const task = min['scheduleMap'] ? min['scheduleMap'][name + i] : null;
const task = min["scheduleMap"] ? min["scheduleMap"][name] : null; if (task) {
task.destroy();
if (task) {
task.destroy();
delete min["scheduleMap"][name];
}
const count = await GuaribasSchedule.destroy({
where: {
instanceId: min.instance.instanceId,
name: name
} }
}); const id = `${name};${i}`;
if (count > 0) { delete min['scheduleMap'][id];
GBLog.info(`BASIC: Removed ${name} SET SCHEDULE and ${count} rows from storage on: ${min.botId}...`); const count = await GuaribasSchedule.destroy({
where: {
instanceId: min.instance.instanceId,
name: id
}
});
if (count > 0) {
GBLogEx.info(min, `Removed ${name} SET SCHEDULE and ${count} rows from storage on: ${min.botId}...`);
}
i++;
} }
} }
/** /**
* Finds and update user agent information to a next available person. * Finds and update user agent information to a next available person.
*/ */
public async createOrUpdateSchedule( public async createOrUpdateSchedule(min: GBMinInstance, schedule: string, name: string): Promise<GuaribasSchedule> {
min: GBMinInstance,
schedule: string,
name: string
): Promise<GuaribasSchedule> {
let record = await GuaribasSchedule.findOne({ let record = await GuaribasSchedule.findOne({
where: { where: {
instanceId: min.instance.instanceId, instanceId: min.instance.instanceId,
@ -102,19 +100,30 @@ export class ScheduleServices extends GBService {
return record; return record;
} }
/** /**
* Load all cached schedule from BASIC SET SCHEDULE keyword. * Load all cached schedule from BASIC SET SCHEDULE keyword.
*/ */
public async loadSchedules(min: GBMinInstance) { public async scheduleAll() {
let schedules; let schedules;
try { try {
const options = <FindOptions>{ where: { instanceId: min.instance.instanceId } }; schedules = await GuaribasSchedule.findAll();
schedules = await GuaribasSchedule.findAll(options); let i = 0;
GBLog.info(`Loading schedules for ${min.instance.botId}...`); let lastName = '';
await CollectionUtil.asyncForEach(schedules, async item => { await CollectionUtil.asyncForEach(schedules, async item => {
this.ScheduleItem(item, min); if (item.name === lastName) {
item.name = item.name + ++i;
} else {
i = 0;
}
let min: GBMinInstance = GBServer.globals.minInstances.filter(
p => p.instance.instanceId === item.instanceId
)[0];
if (min) {
this.ScheduleItem(item, min);
}
}); });
} catch (error) { } catch (error) {
throw new Error(`Cannot schedule: ${error.message}.`); throw new Error(`Cannot schedule: ${error.message}.`);
@ -122,37 +131,41 @@ export class ScheduleServices extends GBService {
return schedules; return schedules;
} }
private ScheduleItem(item: GuaribasSchedule, min: GBMinInstance) { private ScheduleItem(item: GuaribasSchedule, min: GBMinInstance) {
GBLog.info(`Scheduling ${item.name} on ${min.botId}...`); GBLogEx.info(min, `Scheduling ${item.name} on ${min.botId}...`);
try { try {
const options = { const options = {
scheduled: true, scheduled: true,
timezone: 'America/Sao_Paulo' timezone: 'America/Sao_Paulo'
}; };
const task = min["scheduleMap"][item.name]; const task = min['scheduleMap'][item.name];
if (task) { if (task) {
task.stop(); task.stop();
min["scheduleMap"][item.name] = null; min['scheduleMap'][item.name] = null;
} }
min["scheduleMap"][item.name] = cron.schedule( min['scheduleMap'][item.name] = cron.schedule(
item.schedule, item.schedule,
function () { function () {
const finalData = async () => { const finalData = async () => {
let script = item.name; let script = item.name.split(';')[0];
let min: GBMinInstance = GBServer.globals.minInstances.filter( let min: GBMinInstance = GBServer.globals.minInstances.filter(
p => p.instance.instanceId === item.instanceId p => p.instance.instanceId === item.instanceId
)[0]; )[0];
await GBVMService.callVM(script, min, null, null); GBLogEx.info(min, `Running .gbdialog word ${item.name} on:${item.schedule}...`);
const pid = GBVMService.createProcessInfo(null, min, 'batch', null);
await GBVMService.callVM(script, min, null, pid);
}; };
(async () => { (async () => {
await finalData(); await finalData();
})(); })();
}, options },
options
); );
GBLog.info(`Running .gbdialog word ${item.name} on:${item.schedule}...`); } catch (error) {
} catch (error) { } GBLogEx.error(min, `Running .gbdialog word ${item.name} : ${error}...`);
}
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -1,103 +0,0 @@
/*****************************************************************************\
| ( )_ _ |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' |
| | | ( )_) | |
| (_) \___/' |
| |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. |
| Licensed under the AGPL-3.0. |
| |
| According to our dual licensing model, this program can be used either |
| under the terms of the GNU Affero General Public License, version 3, |
| or under a proprietary license. |
| |
| The texts of the GNU Affero General Public License with an additional |
| permission and of our proprietary license can be found at and |
| in the LICENSE file you have received along with this program. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY, without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. |
| |
| "General Bots" is a registered trademark of Pragmatismo.io. |
| The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. |
| |
\*****************************************************************************/
/**
* @fileoverview General Bots server core.
*/
'use strict';
import { GBLog } from 'botlib';
import * as ts from 'typescript';
/**
* Wrapper for a TypeScript compiler.
*/
export class TSCompiler {
private static shouldIgnoreError(diagnostic) {
const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
if (message.indexOf('Cannot find name') >= 0
|| message.indexOf('Cannot find module') >= 0
|| message.indexOf('implicitly has an') >= 0
|| message.indexOf('Cannot invoke an') >= 0
|| message.indexOf('Cannot use imports, exports, or module') >= 0
) {
return true;
}
return false;
}
public compile(
fileNames: string[],
options: ts.CompilerOptions = {
noStrictGenericChecks: true,
noImplicitUseStrict: true,
noEmitOnError: false,
noImplicitAny: true,
target: ts.ScriptTarget.ES5,
module: ts.ModuleKind.None,
moduleResolution: ts.ModuleResolutionKind.Classic,
noEmitHelpers: true,
maxNodeModuleJsDepth: 0,
esModuleInterop: false
}
) {
const program = ts.createProgram(fileNames, options);
const emitResult = program.emit();
const allDiagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics);
allDiagnostics.forEach(diagnostic => {
if (!TSCompiler.shouldIgnoreError(diagnostic)) {
const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n');
if (diagnostic.file !== undefined) {
if (
diagnostic.file.fileName.indexOf('readable-stream') == -1 &&
diagnostic.file.fileName.indexOf('request-promise') == -1
) {
const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
GBLog.error(`BASIC error: ${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`);
}
} else {
GBLog.error(`BASIC error: ${message}`);
}
}
});
return emitResult;
}
}

View file

@ -0,0 +1,504 @@
/*****************************************************************************\
| ® |
| |
| |
| |
| |
| |
| General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. |
| |
| According to our dual licensing model, this program can be used either |
| under the terms of the GNU Affero General Public License, version 3, |
| or under a proprietary license. |
| |
| The texts of the GNU Affero General Public License with an additional |
| permission and of our proprietary license can be found at and |
| in the LICENSE file you have received along with this program. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY, without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. |
| |
| "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. |
| |
\*****************************************************************************/
'use strict';
import urlJoin from 'url-join';
import fs from 'fs/promises';
import path from 'path';
import url from 'url';
import { GBLog } from 'botlib';
import { GBServer } from '../../../src/app.js';
import { GBAdminService } from '../../admin.gbapp/services/GBAdminService.js';
import { GBSSR } from '../../core.gbapp/services/GBSSR.js';
import { DialogKeywords } from './DialogKeywords.js';
import { GBDeployer } from '../../core.gbapp/services/GBDeployer.js';
import { Mutex } from 'async-mutex';
import { GBLogEx } from '../../core.gbapp/services/GBLogEx.js';
import { SystemKeywords } from './SystemKeywords.js';
import { GBUtil } from '../../../src/util.js';
/**
* Web Automation services of conversation to be called by BASIC.
*/
export class WebAutomationServices {
static isSelector(name: any) {
return name.startsWith('.') || name.startsWith('#') || name.startsWith('[');
}
public static cyrb53 ({pid, str, seed = 0}) {
let h1 = 0xdeadbeef ^ seed,
h2 = 0x41c6ce57 ^ seed;
for (let i = 0, ch; i < str.length; i++) {
ch = str.charCodeAt(i);
h1 = Math.imul(h1 ^ ch, 2654435761);
h2 = Math.imul(h2 ^ ch, 1597334677);
}
h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);
h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);
return 4294967296 * (2097151 & h2) + (h1 >>> 0);
};
public async closeHandles({ pid }) {
const { min, user } = await DialogKeywords.getProcessInfo(pid);
await DialogKeywords.setOption({ pid, name: "filter", value: null });
// Releases previous allocated OPEN semaphores.
let keys = Object.keys(GBServer.globals.webSessions);
for (let i = 0; i < keys.length; i++) {
const session = GBServer.globals.webSessions[keys[i]];
if (session.activePid === pid) {
session.semaphore.release();
GBLogEx.info(min, `Release for PID: ${pid} done.`);
}
}
}
/**
* Returns the page object.
*
* @example OPEN "https://wikipedia.org"
*/
public async openPage({ pid, handle, sessionKind, sessionName, url, username, password }) {
const { min, user } = await DialogKeywords.getProcessInfo(pid);
GBLogEx.info(min, `Web Automation OPEN ${sessionName ? sessionName : ''} ${url}.`);
// Try to find an existing handle.
let session;
if (handle) {
session = GBServer.globals.webSessions[handle];
}
else if (sessionName) {
let keys = Object.keys(GBServer.globals.webSessions);
for (let i = 0; i < keys.length; i++) {
if (GBServer.globals.webSessions[keys[i]].sessionName === sessionName) {
session = GBServer.globals.webSessions[keys[i]];
handle = keys[i];
break;
}
}
}
let page;
if (session) {
page = session.page;
// Semaphore logic to block multiple entries on the same session.
if (sessionName) {
GBLogEx.info(min, `Acquiring (1) for PID: ${pid}...`);
const release = await session.semaphore.acquire();
GBLogEx.info(min, `Acquire (1) for PID: ${pid} done.`);
try {
session.activePid = pid;
session.release = release;
} catch {
release();
}
}
}
// Creates the page if it is the first time.
let browser;
if (!page) {
browser = await GBSSR.createBrowser(null);
page = (await browser.pages())[0];
if (username || password) {
await page.authenticate({ pid, username: username, password: password });
}
}
// There is no session yet or it is an unamed session.
if ((!session && sessionKind === 'AS') || !sessionName) {
// A new web session is being created.
handle = WebAutomationServices.cyrb53({pid, str:min.botId + url});
session = {};
session.sessionName = sessionName;
session.page = page;
session.browser = browser;
session.semaphore = new Mutex();
session.activePid = pid;
GBServer.globals.webSessions[handle] = session;
// Only uses semaphore logic in named web sessions.
if (sessionName) {
GBLogEx.info(min, `Acquiring (2) for PID: ${pid}...`);
const release = await session.semaphore.acquire();
session.release = release;
GBLogEx.info(min, `Acquire (2) for PID: ${pid} done.`);
}
}
// WITH is only valid in a previously defined session.
if (!session && sessionKind == 'WITH') {
const error = `NULL session for OPEN WITH #${sessionName}.`;
GBLogEx.error(min, error);
}
await page.goto(url);
return handle;
}
public static getPageByHandle(handle) {
return GBServer.globals.webSessions[handle].page;
}
/**
* Find element on page DOM.
*
* @example GET "selector"
*/
public async getBySelector({ handle, selector, pid }) {
const page = WebAutomationServices.getPageByHandle(handle);
const { min, user } = await DialogKeywords.getProcessInfo(pid);
GBLogEx.info(min, `Web Automation GET element: ${selector}.`);
await page.waitForSelector(selector);
let elements = await page.$$(selector);
if (elements && elements.length > 1) {
return elements;
} else {
const el = elements[0];
el['originalSelector'] = selector;
el['href'] = await page.evaluate(e => e.getAttribute('href'), el);
el['value'] = await page.evaluate(e => e.getAttribute('value'), el);
el['name'] = await page.evaluate(e => e.getAttribute('name'), el);
el['class'] = await page.evaluate(e => e.getAttribute('class'), el);
return el;
}
}
/**
* Find element on page DOM.
*
* @example GET page,"frameSelector,"elementSelector"
*/
public async getByFrame({pid, handle, frame, selector }) {
const { min, user } = await DialogKeywords.getProcessInfo(pid);
const page = WebAutomationServices.getPageByHandle(handle);
GBLogEx.info(min, `Web Automation GET element by frame: ${selector}.`);
await page.waitForSelector(frame);
let frameHandle = await page.$(frame);
const f = await frameHandle.contentFrame();
await f.waitForSelector(selector);
const element = await f.$(selector);
element['originalSelector'] = selector;
element['href'] = await f.evaluate(e => e.getAttribute('href'), element);
element['value'] = await f.evaluate(e => e.getAttribute('value'), element);
element['name'] = await f.evaluate(e => e.getAttribute('name'), element);
element['class'] = await f.evaluate(e => e.getAttribute('class'), element);
element['frame'] = f;
return element;
}
/**
* Simulates a mouse hover an web page element.
*/
public async hover({ pid, handle, selector }) {
const { min, user } = await DialogKeywords.getProcessInfo(pid);
const page = WebAutomationServices.getPageByHandle(handle);
GBLogEx.info(min, `Web Automation HOVER element: ${selector}.`);
await this.getBySelector({ handle, selector: selector, pid });
await page.hover(selector);
await this.debugStepWeb(pid, page);
}
/**
* Clicks on an element in a web page.
*
* @example CLICK "#idElement"
*/
public async click({ pid, handle, frameOrSelector, selector }) {
const { min, user } = await DialogKeywords.getProcessInfo(pid);
const page = WebAutomationServices.getPageByHandle(handle);
GBLogEx.info(min, `Web Automation CLICK element: ${frameOrSelector}.`);
if (selector) {
await page.waitForSelector(frameOrSelector);
let frameHandle = await page.$(frameOrSelector);
const f = await frameHandle.contentFrame();
await f.waitForSelector(selector);
await f.click(selector);
} else {
await page.waitForSelector(frameOrSelector);
await page.click(frameOrSelector);
}
await this.debugStepWeb(pid, page);
}
private async debugStepWeb(pid, page) {
const { min, user } = await DialogKeywords.getProcessInfo(pid);
let debugWeb, lastDebugWeb; // TODO: Add this to pid bag.
let refresh = true;
if (lastDebugWeb) {
refresh = new Date().getTime() - lastDebugWeb.getTime() > 5000;
}
if (debugWeb && refresh) {
const mobile = min.core.getParam(min.instance, 'Bot Admin Number', null);
const filename = page;
if (mobile) {
await new DialogKeywords().sendFileTo({ pid: pid, mobile, filename, caption: 'General Bots Debugger' });
}
lastDebugWeb = new Date();
}
}
/**
* Press ENTER in a web page,useful for logins.
*
* @example PRESS ENTER ON page
*/
public async pressKey({pid, handle, char, frame }) {
const { min, user } = await DialogKeywords.getProcessInfo(pid);
const page = WebAutomationServices.getPageByHandle(handle);
GBLogEx.info(min, `Web Automation PRESS ${char} ON element: ${frame}.`);
if (char.toLowerCase() === 'enter') {
char = '\n';
}
if (frame) {
await page.waitForSelector(frame);
let frameHandle = await page.$(frame);
const f = await frameHandle.contentFrame();
await f.keyboard.press(char);
} else {
await page.keyboard.press(char);
}
}
public async linkByText({ pid, handle, text, index }) {
const { min, user } = await DialogKeywords.getProcessInfo(pid);
const page = WebAutomationServices.getPageByHandle(handle);
GBLogEx.info(min, `Web Automation CLICK LINK TEXT: ${text} ${index}.`);
if (!index) {
index = 1;
}
const els = await page.$x(`//a[contains(.,'${text}')]`);
await els[index - 1].click();
await this.debugStepWeb(pid, page);
}
public async clickButton({ pid, handle, text, index }) {
const { min, user } = await DialogKeywords.getProcessInfo(pid);
const page = WebAutomationServices.getPageByHandle(handle);
GBLogEx.info(min, `Web Automation CLICK BUTTON: ${text} ${index}.`);
if (!index) {
index = 1;
}
const els = await page.$x(`//button[contains(.,'${text}')]`);
await els[index - 1].click();
await this.debugStepWeb(pid, page);
}
/**
* Returns the screenshot of page or element
*
* @example file = SCREENSHOT "#selector"
*/
public async screenshot({ pid, handle, selector }) {
const { min, user } = await DialogKeywords.getProcessInfo(pid);
const page = WebAutomationServices.getPageByHandle(handle);
GBLogEx.info(min, `Web Automation SCREENSHOT ${selector}.`);
const gbaiName = GBUtil.getGBAIPath(min.botId);
const localName = path.join('work', gbaiName, 'cache', `screen-${GBAdminService.getRndReadableIdentifier()}.jpg`);
await page.screenshot({ path: localName });
const url = urlJoin(GBServer.globals.publicAddress, min.botId, 'cache', path.basename(localName));
GBLogEx.info(min, `WebAutomation: Screenshot captured at ${url}.`);
return { data: null, localName: localName, url: url };
}
/**
* Types the text into the text field.
*
* @example SET page,"selector","text"
*/
public async setElementText({ pid, handle, selector, text }) {
const { min, user } = await DialogKeywords.getProcessInfo(pid);
text = `${text}`;
const page = WebAutomationServices.getPageByHandle(handle);
GBLogEx.info(min, `Web Automation TYPE on ${selector}: ${text}.`);
const e = await this.getBySelector({ handle, selector, pid });
await e.click({ clickCount: 3 });
await page.keyboard.press('Backspace');
await e.type(text, { delay: 200 });
await this.debugStepWeb(pid, page);
}
/**
* Performs the download to the .gbdrive Download folder.
*
* @example file = DOWNLOAD element, folder
*/
public async download({ pid, handle, selector, folder }) {
const { min, user } = await DialogKeywords.getProcessInfo(pid);
const page = WebAutomationServices.getPageByHandle(handle);
const element = await this.getBySelector({ handle, selector, pid });
// https://github.com/GeneralBots/BotServer/issues/311
const container = element['_frame'] ? element['_frame'] : element['_page'];
await page.setRequestInterception(true);
await container.click(element.originalSelector);
const xRequest = await new Promise(resolve => {
page.on('request', interceptedRequest => {
interceptedRequest.abort(); //stop intercepting requests
resolve(interceptedRequest);
});
});
const options = {
encoding: null,
method: xRequest['._method'],
uri: xRequest['_url'],
body: xRequest['_postData'],
headers: xRequest['_headers']
};
const cookies = await page.cookies();
options.headers.Cookie = cookies.map(ck => ck.name + '=' + ck.value).join(';');
GBLogEx.info(min, `DOWNLOADING '${options.uri}...'`);
let local;
let filename;
if (options.uri.indexOf('file://') != -1) {
local = url.fileURLToPath(options.uri);
filename = path.basename(local);
} else {
const getBasenameFormUrl = urlStr => {
const url = new URL(urlStr);
return path.basename(url.pathname);
};
filename = getBasenameFormUrl(options.uri);
}
let result: Buffer;
if (local) {
result = await fs.readFile(local);
} else {
const res = await fetch(options.uri, options);
result = Buffer.from(await res.arrayBuffer());
}
let { baseUrl, client } = await GBDeployer.internalGetDriveClient(min);
const botId = min.instance.botId;
// Normalizes all slashes.
folder = folder.replace(/\\/gi, '/');
// Determines full path at source and destination.
const packagePath = GBUtil.getGBAIPath(min.botId, `gbdrive`);
const root = packagePath;
const dstPath = urlJoin(root, folder, filename);
// Checks if the destination contains subfolders that
// need to be created.
folder = await new SystemKeywords().createFolder(folder);
// Performs the conversion operation getting a reference
// to the source and calling /content on drive API.
let file;
try {
file = await client.api(`${baseUrl}/drive/root:/${dstPath}:/content`).put(result);
} catch (error) {
if (error.code === 'nameAlreadyExists') {
GBLogEx.info(min, `DOWNLOAD destination file already exists: ${dstPath}.`);
}
throw error;
}
return file;
}
private async recursiveFindInFrames(inputFrame, selector) {
const frames = inputFrame.childFrames();
const results = await Promise.all(
frames.map(async frame => {
const el = await frame.$(selector);
if (el) return el;
if (frame.childFrames().length > 0) {
return await this.recursiveFindInFrames(frame, selector);
}
return null;
})
);
return results.find(Boolean);
}
public async getTextOf({ pid, handle, frameOrSelector, selector }) {
const { min, user } = await DialogKeywords.getProcessInfo(pid);
const page = WebAutomationServices.getPageByHandle(handle);
GBLogEx.info(min, `Web Automation CLICK element: ${frameOrSelector}.`);
if (frameOrSelector) {
const result = await page.$eval(
frameOrSelector,
(ul) => {
let items = "";
for (let i = 0; i < ul.children.length; i++) {
items = `${ul.children[i].textContent}\n`;
}
return items;
}
)
await this.debugStepWeb(pid, page);
return result;
}
}
}

View file

@ -1,157 +0,0 @@
// Source: https://github.com/uweg/vbscript-to-typescript
"use strict";
exports.__esModule = true;
var fs_1 = require("fs");
var path = require("path");
function convertFile(file) {
var extension = path.extname(file);
var withoutExtension = file.substr(0, file.length - extension.length);
var targetFile = withoutExtension + ".ts";
var baseName = path.basename(file, extension);
var content = fs_1.readFileSync(file, 'utf8');
var result = convert(content, baseName);
console.log("Writing to \"" + targetFile + "\"...");
fs_1.writeFileSync(targetFile, result);
}
exports.convertFile = convertFile;
function convert(input, name) {
var result = convertImports(input, name);
return result;
}
exports.convert = convert;
function convertImports(input, name) {
var items = [];
var result = input.replace(/<!-- #include file="(.*?\/)?(.*?).asp" -->/gi, function (input, group1, group2) {
var path = group1 || './';
var file = "" + path + group2;
items.push({ name: group2, path: file });
return "<%\n" + group2 + "();\n%>";
});
result = convertCode(result);
result = convertExpressions(result);
result = convertStrings(result);
result = "\nexport function " + name + "() {\n" + result + "\n}";
for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
var item = items_1[_i];
result = "import {" + item.name + "} from \"" + item.path + "\"\n" + result;
}
return result;
}
exports.convertImports = convertImports;
function convertCode(input) {
var result = input.replace(/<%([^=][\s\S]*?)%>/gi, function (input, group1) {
var code = group1;
code = convertComments(code);
code = convertIfStatements(code);
code = convertSwitchStatements(code);
code = convertFunctions(code);
code = convertForStatements(code);
code = convertLoops(code);
code = convertPRec(code);
code = convertPLan(code);
return "<%" + code + "%>";
});
return result;
}
exports.convertCode = convertCode;
function convertExpressions(input) {
var result = input.replace(/<%=([\s\S]*?)%>/gi, function (input, group1) {
var content = convertPRec(group1);
content = convertPLan(content);
return "${" + content + "}";
});
return result;
}
exports.convertExpressions = convertExpressions;
function convertStrings(input) {
var result = input.replace(/%>([\s\S]+?)<%/gi, "\nResponse.Write(`$1`);\n");
// Entire document is a string
if (result.indexOf("<%") === -1) {
result = "Response.Write(`" + result + "`);";
}
// Start of the document is a string
var firstIndex = result.indexOf("<%");
if (firstIndex > 0) {
result = "Response.Write(`" + result.substr(0, firstIndex) + "`);\n" + result.substring(firstIndex + 2);
}
result = result.replace(/%>$/, "");
// End of the document is a string
var lastIndex = result.lastIndexOf("%>");
if (lastIndex > -1 && lastIndex < result.length - 2) {
result = result.substr(0, lastIndex) + "\nResponse.Write(`" + result.substr(lastIndex + 3) + "`);";
}
result = result.replace(/^<%/, "");
return result;
}
exports.convertStrings = convertStrings;
function convertComments(input) {
var result = '';
var splitted = input.split(/(".*")/gim);
for (var _i = 0, splitted_1 = splitted; _i < splitted_1.length; _i++) {
var part = splitted_1[_i];
if (part.indexOf("\"") === 0) {
result += part;
}
else {
result += part.replace(/'/gi, "//");
}
}
return result;
}
exports.convertComments = convertComments;
function convertIfStatements(input) {
var result = input.replace(/if +(.*?) +then/gi, function (input, group1) {
var condition = convertConditions(group1);
return "\nif (" + condition + ") {\n";
});
result = result.replace(/end if/gi, "\n}\n");
result = result.replace(/else(?!{)/gi, "\n}\nelse {\n");
return result;
}
exports.convertIfStatements = convertIfStatements;
function convertSwitchStatements(input) {
var result = input.replace(/select case +(.*)/gi, "\nswitch ($1) {\n");
result = result.replace(/end select/gi, "\n}\n");
return result;
}
exports.convertSwitchStatements = convertSwitchStatements;
function convertFunctions(input) {
var result = input.replace(/function +(.*)\((.*)\)/gi, "\n$1 = ($2) => {\n");
result = result.replace(/end function/gi, "\n}\n");
return result;
}
exports.convertFunctions = convertFunctions;
function convertForStatements(input) {
var result = input.replace(/for +(.*to.*)/gi, "\nfor ($1) {\n");
result = result.replace(/^ *next *$/gim, "}\n");
return result;
}
exports.convertForStatements = convertForStatements;
function convertConditions(input) {
var result = input.replace(/ +and +/gi, " && ");
result = result.replace(/ +or +/gi, " || ");
result = result.replace(/ +<> +/gi, " !== ");
result = result.replace(/ += +/gi, " === ");
return result;
}
exports.convertConditions = convertConditions;
function convertLoops(input) {
var result = input.replace(/do while +(.*)/gi, function (input, group1) {
var condition = convertConditions(group1);
return "\nwhile (" + condition + ") {\n";
});
result = result.replace(/^ *loop *$/gim, "}\n");
return result;
}
exports.convertLoops = convertLoops;
function convertPRec(input) {
var result = input.replace(/(p_rec\("\S+?"\))/gi, "$1.Value");
return result;
}
exports.convertPRec = convertPRec;
function convertPLan(input) {
var result = input.replace(/(l_\S+?)\(p_lan\)/gi, "$1[p_lan]");
return result;
}
exports.convertPLan = convertPLan;

View file

@ -0,0 +1,310 @@
import crypto2 from 'crypto';
import { spawn } from 'child_process';
import CDP from 'chrome-remote-interface';
import {} from 'child_process';
import net from 'net';
import { GBLog } from 'botlib';
import { CollectionUtil } from 'pragmatismo-io-framework';
import { GBServer } from '../../../../src/app.js';
import { DebuggerService } from '../DebuggerService.js';
import finalStream from 'final-stream';
import { GBLogEx } from '../../../core.gbapp/services/GBLogEx.js';
const waitUntil = condition => {
if (condition()) {
return Promise.resolve();
}
return new Promise(resolve => {
const interval = setInterval(() => {
if (!condition()) {
return;
}
clearInterval(interval);
resolve(0);
}, 0);
});
};
const systemVariables = [
'AggregateError',
'Array',
'ArrayBuffer',
'Atomics',
'BigInt',
'BigInt64Array',
'BigUint64Array',
'Boolean',
'DataView',
'Date',
'Error',
'EvalError',
'FinalizationRegistry',
'Float32Array',
'Float64Array',
'Function',
'Headers',
'Infinity',
'Int16Array',
'Int32Array',
'Int8Array',
'Intl',
'JSON',
'Map',
'Math',
'NaN',
'Number',
'Object',
'Promise',
'Proxy',
'RangeError',
'ReferenceError',
'Reflect',
'RegExp',
'Request',
'Response',
'Set',
'SharedArrayBuffer',
'String',
'Symbol',
'SyntaxError',
'TypeError',
'URIError',
'Uint16Array',
'Uint32Array',
'Uint8Array',
'Uint8ClampedArray',
'VM2_INTERNAL_STATE_DO_NOT_USE_OR_PROGRAM_WILL_FAIL',
'WeakMap',
'WeakRef',
'WeakSet',
'WebAssembly',
'__defineGetter__',
'__defineSetter__',
'__lookupGetter__',
'__lookupSetter__',
'__proto__',
'clearImmediate',
'clearInterval',
'clearTimeout',
'console',
'constructor',
'decodeURI',
'decodeURIComponent',
'dss',
'encodeURI',
'encodeURIComponent',
'escape',
'eval',
'fetch',
'global',
'globalThis',
'hasOwnProperty',
'isFinite',
'isNaN',
'isPrototypeOf',
'parseFloat',
'parseInt',
'process',
'propertyIsEnumerable',
'setImmediate',
'setInterval',
'setTimeout',
'toLocaleString',
'toString',
'undefined',
'unescape',
'valueOf'
];
export const createVm2Pool = ({ min, max, ...limits }) => {
limits = Object.assign(
{
cpu: 100,
memory: 2000,
time: 4000
},
limits
);
let limitError = null;
const ref = crypto2.randomBytes(20).toString('hex');
const kill = x => {
spawn('sh', ['-c', `pkill -9 -f ${ref}`]);
};
let stderrCache = '';
const run = async (code: any, scope: any) => {
// Configure environment variables
const env = Object.assign({}, process.env, {
NODE_ENV: 'production',
NODE_OPTIONS: '' // Clear NODE_OPTIONS if needed
});
const childProcess = spawn(
'/usr/bin/cpulimit',
[
'-ql',
limits.cpu,
'--',
'node',
`${limits.debug ? '--inspect=' + limits.debuggerPort : ''}`,
`--experimental-fetch`,
`--max-old-space-size=${limits.memory}`,
limits.script,
ref
],
{ cwd: limits.cwd, shell: true, env: env }
);
childProcess.stdout.on('data', data => {
childProcess['socket'] = childProcess['socket'] || data.toString().trim();
});
childProcess.stderr.on('data', data => {
stderrCache = stderrCache + data.toString();
if (stderrCache.includes('failed: address already in use')) {
limitError = stderrCache;
kill(process);
GBServer.globals.debuggers[limits.botId].state = 0;
GBServer.globals.debuggers[limits.botId].stateInfo = stderrCache;
} else if (
stderrCache.includes('FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory')
) {
limitError = 'code execution exceeed allowed memory';
kill(process);
GBServer.globals.debuggers[limits.botId].state = 0;
GBServer.globals.debuggers[limits.botId].stateInfo = 'Fail';
} else if (stderrCache.includes('Debugger attached.')) {
GBLogEx.info(min, `General Bots Debugger attached to Node .gbdialog process for ${limits.botId}.`);
}
});
let socket = null;
await waitUntil(() => childProcess['socket']);
GBServer.globals.debuggers[limits.botId].childProcess = ref;
// Only attach if called by debugger/run.
if (limits.debug) {
const debug = async () => {
return new Promise((resolve, reject) => {
CDP(async client => {
const { Debugger, Runtime } = client;
try {
GBServer.globals.debuggers[limits.botId].client = client;
await client.Debugger.paused(async ({ callFrames, reason, hitBreakpoints }) => {
const frame = callFrames[0];
// Build variable list ignoring system variables of script.
const scopeObjectId = frame.scopeChain[2].object.objectId;
const variables = await Runtime.getProperties({ objectId: scopeObjectId });
let variablesText = '';
if (variables && variables.result) {
await CollectionUtil.asyncForEach(variables.result, async v => {
if (!systemVariables.filter(x => x === v.name)[0]) {
if (v.value.value) {
variablesText = `${variablesText} \n ${v.name}: ${v.value.value}`;
}
}
});
}
GBServer.globals.debuggers[limits.botId].scope = variablesText;
GBLogEx.info(min, `Breakpoint variables: ${variablesText}`); // (zero-based)
// Processes breakpoint hits.
if (hitBreakpoints.length >= 1) {
GBLogEx.info(min, `Break at line ${frame.location.lineNumber + 1}`); // (zero-based)
GBServer.globals.debuggers[limits.botId].state = 2;
GBServer.globals.debuggers[limits.botId].stateInfo = 'Break';
} else {
GBLog.verbose(`Configuring breakpoints if any for ${limits.botId}...`);
// Waits for debugger and setup breakpoints.
await CollectionUtil.asyncForEach(GBServer.globals.debuggers[limits.botId].breaks, async brk => {
try {
const { breakpointId } = await client.Debugger.setBreakpoint({
location: {
scriptId: frame.location.scriptId,
lineNumber: brk
}
});
GBLogEx.info(min, `BASIC break defined ${breakpointId} for ${limits.botId}`);
} catch (error) {
GBLogEx.info(min, `BASIC error defining ${brk} for ${limits.botId}. ${error}`);
}
});
await client.Debugger.resume();
}
});
await client.Runtime.runIfWaitingForDebugger();
await client.Debugger.enable();
await client.Runtime.enable();
resolve(1);
} catch (error) {
GBLog.error(error);
kill(childProcess);
GBServer.globals.debuggers[limits.botId].state = 0;
GBServer.globals.debuggers[limits.botId].stateInfo = 'Stopped';
}
}).on('error', err => {
console.error(err);
kill(childProcess);
GBServer.globals.debuggers[limits.botId].state = 0;
GBServer.globals.debuggers[limits.botId].stateInfo = 'Stopped';
reject(err);
});
});
};
await debug();
}
socket = net.createConnection(childProcess['socket']);
socket.write(JSON.stringify({ code, scope }) + '\n');
const timer = setTimeout(() => {
limitError = 'code execution took too long and was killed';
kill(childProcess);
GBServer.globals.debuggers[limits.botId].state = 0;
GBServer.globals.debuggers[limits.botId].stateInfo = limitError;
}, limits.time);
try {
let data = await finalStream(socket);
data = JSON.parse(data);
if (!data.length) {
return null;
}
if (data.error) {
throw new Error(data.error);
}
return data.result;
} catch (error) {
throw new Error(limitError || error);
} finally {
kill(childProcess);
GBServer.globals.debuggers[limits.botId].state = 0;
GBServer.globals.debuggers[limits.botId].stateInfo = 'Stopped';
clearTimeout(timer);
}
};
return {
run
};
};

View file

@ -0,0 +1,67 @@
import { VMScript, NodeVM } from 'vm2';
import crypto1 from 'crypto';
import net1 from 'net';
const evaluate = async (script, scope) => {
const vm = new NodeVM({
allowAsync: true,
sandbox: {},
console: 'inherit',
wrapper: 'none',
require: {
builtin: ['stream', 'http', 'https', 'url', 'buffer', 'zlib', 'isomorphic-fetch', 'punycode', 'encoding', 'net'],
root: ['./'],
external: true,
context: 'sandbox'
}
});
const s = new VMScript(script, scope);
return await vm.run(script, scope);
};
const socketName = crypto1.randomBytes(20).toString('hex');
const server = net1.createServer(socket => {
const buffer = [];
const sync = async () => {
const request = buffer.join('').toString();
console.log(request);
if (request.includes('\n')) {
try {
const { code, scope } = JSON.parse(request);
const result = await evaluate(code, {
...scope,
module: null
});
console.log(JSON.stringify({ result }));
socket.write(JSON.stringify({ result }) + '\n');
socket.end();
} catch (error) {
console.log(`RUNTIME: ${error.message}, ${error.stack}`);
socket.write(JSON.stringify({ error: error.message }) + '\n');
socket.end();
}
}
};
socket.on('error', err => {
console.log(err);
});
socket.on('data', data => {
buffer.push(data);
sync();
});
});
server.on('listening', () => {
console.log(`/tmp/vm2-${socketName}.sock`);
});
server.listen(`/tmp/vm2-${socketName}.sock`);

View file

@ -1,9 +1,10 @@
export const Messages = { export const Messages = {
'en-US': { 'en-US': {
affirmative_sentences: /^(\bsim\b|\bs\b|\bpositivo\b|\bafirmativo\b|\bclaro\b|\bevidente\b|\bsem dúvida\b|\bconfirmo\b|\bconfirmar\b|\bconfirmado\b|\buhum\b|\bsi\b|\by\b|\byes\b|\bsure\b)/i affirmative_sentences: /^(\bsim\b|\bs\b|\bpositivo\b|\bafirmativo\b|\bclaro\b|\bevidente\b|\bsem dúvida\b|\bconfirmo\b|\bconfirmar\b|\bconfirmado\b|\buhum\b|\bsi\b|\by\b|\byes\b|\bsure\b)/i,
choices: 'Please, select one:'
}, },
'pt-BR': { 'pt-BR': {
affirmative_sentences: /^(\bsim\b|\bs\b|\bpositivo\b|\bafirmativo\b|\bclaro\b|\bevidente\b|\bsem dúvida\b|\bconfirmo\b|\bconfirmar\b|\bconfirmado\b|\buhum\b|\bsi\b|\by\b|\byes\b|\bsure\b)/i affirmative_sentences: /^(\bsim\b|\bs\b|\bpositivo\b|\bafirmativo\b|\bclaro\b|\bevidente\b|\bsem dúvida\b|\bconfirmo\b|\bconfirmar\b|\bconfirmado\b|\buhum\b|\bsi\b|\by\b|\byes\b|\bsure\b)/i,
choices: 'Por favor, selecione:'
} }
}; };

View file

@ -0,0 +1,16 @@
import { expect, test } from 'vitest';
import { DialogKeywords } from '../services/DialogKeywords';
import init from '../../../.test-init'
init();
const dk = new DialogKeywords();
const pid = 1;
test('TOLIST', async () => {
const obj = [{a:1, b:2}, {a:2, b:4}];
expect(await dk.getToLst({ pid, array: obj, member:'a' }))
.toBe("1,2");
});

View file

@ -0,0 +1,43 @@
import { GBVMService } from '../services/GBVMService';
import { expect, test } from 'vitest'
test('Default', () => {
const args = GBVMService.getSetScheduleKeywordArgs(`
SET SCHEDULE "0 0 */1 * * *"
SET SCHEDULE "0 0 */3 * * *"
SET SCHEDULE "0 0 */2 * * *"
SET SCHEDULE "0 0 */2 * * *"
SET SCHEDULE "0 0 */3 * * *"
`);
expect(args.length).toBe(5);
});
test('Compare', () => {
expect(GBVMService.compare(1,1)).toBeTruthy();
expect(GBVMService.compare({a:1},{a:1})).toBeTruthy();
expect(GBVMService.compare({a:1},{a:2})).toBeFalsy();
expect(GBVMService.compare({a:1, b:2},{a:1, b:2})).toBeTruthy();
});
test('Parse Storage Field', async () => {
const s = new GBVMService();
expect(await s.parseField('name STRING(30)')).toStrictEqual({name: 'name', definition: {
allowNull: true,
unique: false, primaryKey: false,
size: 30,
autoIncrement: false,
type:"STRING"
}});
});

View file

@ -0,0 +1,36 @@
import { GBVMService } from '../services/GBVMService';
import { expect, test } from 'vitest';
import { SystemKeywords } from '../services/SystemKeywords';
const s = new SystemKeywords();
const pid = 1;
test('APPEND', async () => {
expect(await s.append({ pid, args: [1, 1, 1, 1] })).toStrictEqual([1, 1, 1, 1]);
expect(await s.append({ pid, args: [1] })).toStrictEqual([1]);
expect(await s.append({ pid, args: [] })).toStrictEqual([]);
expect(await s.append({ pid, args: null })).toStrictEqual([]);
});
test('COMPARE', () => {
expect(GBVMService.compare(1, 1)).toBeTruthy();
expect(GBVMService.compare({ a: 1 }, { a: 1 })).toBeTruthy();
expect(GBVMService.compare({ a: 1 }, { a: 2 })).toBeFalsy();
expect(GBVMService.compare({ a: 1, b: 2 }, { a: 1, b: 2 })).toBeTruthy();
});
test('Parse Storage Field', async () => {
const s = new GBVMService();
expect(await s.parseField('name STRING(30)')).toStrictEqual({
name: 'name',
definition: {
allowNull: true,
unique: false,
primaryKey: false,
size: 30,
autoIncrement: false,
type: 'STRING'
}
});
});

View file

@ -6,7 +6,7 @@
"title": "Default General Bot", "title": "Default General Bot",
"description": "Default General Bot", "description": "Default General Bot",
"whoAmIVideo": "TODO.mp4", "whoAmIVideo": "TODO.mp4",
"author": "pragmatismo.io", "author": "pragmatismo.com.br",
"license": "AGPL", "license": "AGPL",
"engineName": "guaribas-1.0.0" "engineName": "guaribas-1.0.0"
} }

View file

@ -2,7 +2,6 @@
"enabledAdmin": "true", "enabledAdmin": "true",
"searchScore": ".45", "searchScore": ".45",
"nlpScore": ".80", "nlpScore": ".80",
"nlpVsSearch": ".4",
"state":"active", "state":"active",
"autoPackageSync": "gbdialog, gbot, gbtheme" "autoPackageSync": "gbdialog, gbot, gbtheme"
} }

View file

@ -1,176 +0,0 @@
const Swagger = require('swagger-client');
const rp = require('request-promise');
import { GBLog, GBService } from 'botlib';
/**
* Bot simulator in terminal window.
*/
export class ConsoleDirectLine extends GBService {
public pollInterval: number = 1000;
public directLineSecret: string = '';
public directLineClientName: string = 'DirectLineClient';
public directLineSpecUrl: string = 'https://docs.botframework.com/en-us/restapi/directline3/swagger.json';
constructor(directLineSecret: string) {
super();
this.directLineSecret = directLineSecret;
// tslint:disable-next-line:no-unsafe-any
const directLineClient = rp(this.directLineSpecUrl)
.then((spec: string) => {
// tslint:disable-next-line:no-unsafe-any
return new Swagger({
spec: JSON.parse(spec.trim()),
usePromise: true
});
})
.then(client => {
// tslint:disable-next-line:no-unsafe-any
client.clientAuthorizations.add(
'AuthorizationBotConnector',
// tslint:disable-next-line:no-unsafe-any
new Swagger.ApiKeyAuthorization('Authorization', `Bearer ${directLineSecret}`, 'header')
);
return client;
})
.catch(err => {
GBLog.error(`Error initializing DirectLine client ${err}`);
});
const _this_ = this;
// tslint:disable-next-line:no-unsafe-any
directLineClient.then(client => {
// tslint:disable-next-line:no-unsafe-any
client.Conversations.Conversations_StartConversation()
.then(response => {
// tslint:disable-next-line:no-unsafe-any
return response.obj.conversationId;
})
.then(conversationId => {
_this_.sendMessagesFromConsole(client, conversationId);
_this_.pollMessages(client, conversationId);
})
.catch(err => {
GBLog.error(`Error starting conversation ${err}`);
});
});
}
public sendMessagesFromConsole(client, conversationId) {
const _this_ = this;
process.stdin.resume();
const stdin = process.stdin;
process.stdout.write('Command> ');
stdin.addListener('data', e => {
// tslint:disable-next-line:no-unsafe-any
const input: string = e.toString().trim();
if (input !== undefined) {
// exit
if (input.toLowerCase() === 'exit') {
return process.exit();
}
// tslint:disable-next-line:no-unsafe-any
client.Conversations.Conversations_PostActivity({
conversationId: conversationId,
activity: {
textFormat: 'plain',
text: input,
type: 'message',
from: {
id: _this_.directLineClientName,
name: _this_.directLineClientName
}
}
}).catch(err => {
GBLog.error(`Error sending message: ${err}`);
});
process.stdout.write('Command> ');
}
});
}
public pollMessages(client, conversationId) {
const _this_ = this;
GBLog.info(`Starting polling message for conversationId: ${conversationId}`);
let watermark;
setInterval(() => {
// tslint:disable-next-line:no-unsafe-any
client.Conversations.Conversations_GetActivities({ conversationId: conversationId, watermark: watermark })
.then(response => {
// tslint:disable-next-line:no-unsafe-any
watermark = response.obj.watermark;
// tslint:disable-next-line:no-unsafe-any
return response.obj.activities;
})
.then(_this_.printMessages, _this_.directLineClientName);
// tslint:disable-next-line:align
}, this.pollInterval);
}
// tslint:disable:no-unsafe-any
public printMessages(activities, directLineClientName) {
if (activities && activities.length) {
// ignore own messages
activities = activities.filter(m => {
return m.from.id !== directLineClientName;
});
if (activities.length) {
// print other messages
activities.forEach(activity => {
GBLog.info(activity.text);
// tslint:disable-next-line:align
}, this);
process.stdout.write('Command> ');
}
}
}
// tslint:enable:no-unsafe-any
// tslint:disable:no-unsafe-any
public printMessage(activity) {
if (activity.text) {
GBLog.info(activity.text);
}
if (activity.attachments) {
activity.attachments.forEach(attachment => {
switch (attachment.contentType) {
case 'application/vnd.microsoft.card.hero':
this.renderHeroCard(attachment);
break;
case 'image/png':
GBLog.info(`Opening the requested image ${attachment.contentUrl}`);
open(attachment.contentUrl);
break;
default:
GBLog.info(`Unknown contentType: ${attachment.contentType}`);
break;
}
});
}
}
// tslint:enable:no-unsafe-any
// tslint:disable:no-unsafe-any
public renderHeroCard(attachment) {
const width = 70;
const contentLine = content => {
return `${' '.repeat((width - content.length) / 2)}content${' '.repeat((width - content.length) / 2)}`;
};
GBLog.info(`/${'*'.repeat(width + 1)}`);
GBLog.info(`*${contentLine(attachment.content.title)}*`);
GBLog.info(`*${' '.repeat(width)}*`);
GBLog.info(`*${contentLine(attachment.content.text)}*`);
GBLog.info(`${'*'.repeat(width + 1)}/`);
}
// tslint:enable:no-unsafe-any
}

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -39,10 +37,10 @@
import { BotAdapter } from 'botbuilder'; import { BotAdapter } from 'botbuilder';
import { WaterfallDialog } from 'botbuilder-dialogs'; import { WaterfallDialog } from 'botbuilder-dialogs';
import { GBMinInstance, IGBDialog } from 'botlib'; import { GBMinInstance, IGBDialog } from 'botlib';
import { Messages } from '../strings'; import { Messages } from '../strings.js';
import { SecService } from '../../security.gbapp/services/SecService'; import { SecService } from '../../security.gbapp/services/SecService.js';
import { GBServer } from '../../../src/app'; import { GBServer } from '../../../src/app.js';
import { GBConversationalService } from '../services/GBConversationalService'; import { GBConversationalService } from '../services/GBConversationalService.js';
/** /**
* Dialog for the bot explains about itself. * Dialog for the bot explains about itself.
*/ */
@ -53,14 +51,13 @@ export class BroadcastDialog extends IGBDialog {
* @param bot The bot adapter. * @param bot The bot adapter.
* @param min The minimal bot instance data. * @param min The minimal bot instance data.
*/ */
public static setup(bot: BotAdapter, min: GBMinInstance) { public static setup (bot: BotAdapter, min: GBMinInstance) {
min.dialogs.add( min.dialogs.add(
new WaterfallDialog('/gb-broadcast', [ new WaterfallDialog('/gb-broadcast', [
async step => { async step => {
if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) { if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) {
return await step.beginDialog('/auth'); return await step.beginDialog('/auth');
} } else {
else{
return await step.next(step.options); return await step.next(step.options);
} }
}, },

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -39,10 +37,10 @@
import { BotAdapter } from 'botbuilder'; import { BotAdapter } from 'botbuilder';
import { WaterfallDialog } from 'botbuilder-dialogs'; import { WaterfallDialog } from 'botbuilder-dialogs';
import { GBMinInstance, IGBDialog } from 'botlib'; import { GBMinInstance, IGBDialog } from 'botlib';
import { Messages } from '../strings'; import { Messages } from '../strings.js';
import { SecService } from '../../security.gbapp/services/SecService'; import { SecService } from '../../security.gbapp/services/SecService.js';
import { GBServer } from '../../../src/app'; import { GBServer } from '../../../src/app.js';
import { GBConversationalService } from '../services/GBConversationalService'; import { GBConversationalService } from '../services/GBConversationalService.js';
import { CollectionUtil } from 'pragmatismo-io-framework'; import { CollectionUtil } from 'pragmatismo-io-framework';
/** /**
* Dialog for the bot explains about itself. * Dialog for the bot explains about itself.
@ -54,63 +52,62 @@ export class LanguageDialog extends IGBDialog {
* @param bot The bot adapter. * @param bot The bot adapter.
* @param min The minimal bot instance data. * @param min The minimal bot instance data.
*/ */
public static setup(bot: BotAdapter, min: GBMinInstance) { public static setup (bot: BotAdapter, min: GBMinInstance) {
min.dialogs.add(new WaterfallDialog('/language', [ min.dialogs.add(
async step => { new WaterfallDialog('/language', [
if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) { async step => {
return await step.beginDialog('/auth'); if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) {
} return await step.beginDialog('/auth');
else{ } else {
return await step.next(step.options); return await step.next(step.options);
}
},
async step => {
const locale = step.context.activity.locale;
return await min.conversationalService.prompt(min, step,
Messages[locale].which_language);
},
async step => {
const locale = step.context.activity.locale;
const user = await min.userProfile.get(step.context, {});
const list = [
{ name: 'english', code: 'en' },
{ name: 'inglês', code: 'en' },
{ name: 'portuguese', code: 'pt' },
{ name: 'português', code: 'pt' },
{ name: 'français', code: 'fr' },
{ name: 'francês', code: 'fr' },
{ name: 'french', code: 'fr' },
{ name: 'português', code: 'pt' },
{ name: 'spanish', code: 'es' },
{ name: 'espanõl', code: 'es' },
{ name: 'espanhol', code: 'es' },
{ name: 'german', code: 'de' },
{ name: 'deutsch', code: 'de' },
{ name: 'alemão', code: 'de' }
];
let translatorLocale = null;
const text = step.context.activity['originalText'];
await CollectionUtil.asyncForEach(list, async item => {
if (GBConversationalService.kmpSearch(text.toLowerCase(), item.name.toLowerCase()) != -1 ||
GBConversationalService.kmpSearch(text.toLowerCase(), item.code.toLowerCase()) != -1) {
translatorLocale = item.code;
} }
}); },
let sec = new SecService(); async step => {
user.systemUser = await sec.updateUserLocale(user.systemUser.userId, translatorLocale); const locale = step.context.activity.locale;
await min.userProfile.set(step.context, user); return await min.conversationalService.prompt(min, step, Messages[locale].which_language);
await min.conversationalService.sendText(min, step, },
Messages[locale].language_chosen); async step => {
const locale = step.context.activity.locale;
await step.replaceDialog('/ask', { firstTime: true }); const list = [
} { name: 'english', code: 'en' },
])); { name: 'inglês', code: 'en' },
{ name: 'portuguese', code: 'pt' },
{ name: 'português', code: 'pt' },
{ name: 'français', code: 'fr' },
{ name: 'francês', code: 'fr' },
{ name: 'french', code: 'fr' },
{ name: 'português', code: 'pt' },
{ name: 'spanish', code: 'es' },
{ name: 'espanõl', code: 'es' },
{ name: 'espanhol', code: 'es' },
{ name: 'german', code: 'de' },
{ name: 'deutsch', code: 'de' },
{ name: 'alemão', code: 'de' }
];
let translatorLocale = null;
const text = step.context.activity['originalText'];
await CollectionUtil.asyncForEach(list, async item => {
if (
GBConversationalService.kmpSearch(text.toLowerCase(), item.name.toLowerCase()) != -1 ||
GBConversationalService.kmpSearch(text.toLowerCase(), item.code.toLowerCase()) != -1
) {
translatorLocale = item.code;
}
});
let sec = new SecService();
let user = await sec.getUserFromSystemId(step.context.activity.from.id);
user = await sec.updateUserLocale(user.userId, translatorLocale);
await min.conversationalService.sendText(min, step, Messages[locale].language_chosen);
await step.replaceDialog('/ask', { firstTime: true });
}
])
);
} }
} }

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -39,10 +37,10 @@
import { BotAdapter } from 'botbuilder'; import { BotAdapter } from 'botbuilder';
import { WaterfallDialog } from 'botbuilder-dialogs'; import { WaterfallDialog } from 'botbuilder-dialogs';
import { GBMinInstance, IGBDialog } from 'botlib'; import { GBMinInstance, IGBDialog } from 'botlib';
import { GBServer } from '../../../src/app'; import { GBServer } from '../../../src/app.js';
import { SecService } from '../../security.gbapp/services/SecService'; import { SecService } from '../../security.gbapp/services/SecService.js';
import { GBConversationalService } from '../services/GBConversationalService'; import { GBConversationalService } from '../services/GBConversationalService.js';
import { Messages } from '../strings'; import { Messages } from '../strings.js';
/** /**
* Dialog for the bot explains about itself. * Dialog for the bot explains about itself.
*/ */
@ -53,32 +51,33 @@ export class SwitchBotDialog extends IGBDialog {
* @param bot The bot adapter. * @param bot The bot adapter.
* @param min The minimal bot instance data. * @param min The minimal bot instance data.
*/ */
public static setup(bot: BotAdapter, min: GBMinInstance) { public static setup (bot: BotAdapter, min: GBMinInstance) {
min.dialogs.add(new WaterfallDialog('/bot', [ min.dialogs.add(
async step => { new WaterfallDialog('/bot', [
if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) { async step => {
return await step.beginDialog('/auth'); if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) {
return await step.beginDialog('/auth');
} else {
return await step.next(step.options);
}
},
async step => {
const locale = step.context.activity.locale;
return await min.conversationalService.prompt(min, step, 'Qual seria o código de ativação?');
},
async step => {
const sec = new SecService();
const from = step.context.activity.from.id;
const botId = step.result;
const instance = await min.core.loadInstanceByBotId(botId);
await sec.updateUserInstance(from, instance.instanceId);
await min.conversationalService.sendText(min, step, `Opa, vamos lá!`);
return await step.next();
} }
else{ ])
return await step.next(step.options); );
}
},
async step => {
const locale = step.context.activity.locale;
return await min.conversationalService.prompt (min, step, 'Qual seria o código de ativação?');
},
async step => {
const sec = new SecService();
const from = step.context.activity.from.id;
const botId = step.result;
const instance = await min.core.loadInstanceByBotId(botId);
await sec.updateUserInstance(from, instance.instanceId);
await min.conversationalService.sendText(min, step, `Opa, vamos lá!`);
return await step.next();
}
]));
} }
} }

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -38,10 +36,11 @@
import { BotAdapter } from 'botbuilder'; import { BotAdapter } from 'botbuilder';
import { WaterfallDialog } from 'botbuilder-dialogs'; import { WaterfallDialog } from 'botbuilder-dialogs';
import { GBLog, GBMinInstance, IGBDialog } from 'botlib'; import { GBMinInstance, IGBDialog } from 'botlib';
import { GBServer } from '../../../src/app'; import { GBServer } from '../../../src/app.js';
import { GBConversationalService } from '../services/GBConversationalService'; import { Messages } from '../strings.js';
import { Messages } from '../strings'; import { GBLogEx } from '../services/GBLogEx.js';
import { GBConfigService } from '../services/GBConfigService.js';
/** /**
* Dialog for Welcoming people. * Dialog for Welcoming people.
@ -53,57 +52,58 @@ export class WelcomeDialog extends IGBDialog {
* @param bot The bot adapter. * @param bot The bot adapter.
* @param min The minimal bot instance data. * @param min The minimal bot instance data.
*/ */
public static setup(bot: BotAdapter, min: GBMinInstance) { public static setup (bot: BotAdapter, min: GBMinInstance) {
min.dialogs.add(
new WaterfallDialog('/', [
async step => {
if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) {
return await step.beginDialog('/auth');
} else {
return await step.next(step.options);
}
},
async step => {
if (
GBServer.globals.entryPointDialog !== null &&
min.instance.botId === GBConfigService.get('BOT_ID')
) {
return step.replaceDialog(GBServer.globals.entryPointDialog);
}
min.dialogs.add(new WaterfallDialog('/', [ const locale = step.context.activity.locale;
async step => {
if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) {
return await step.beginDialog('/auth');
}
else{
return await step.next(step.options);
}
},
async step => {
if (GBServer.globals.entryPointDialog !== null && if (
min.instance.botId === process.env.BOT_ID && // TODO: https://github.com/GeneralBots/BotServer/issues/9 !user.once &&
step.context.activity.channelId === 'webchat') { step.context.activity.channelId === 'webchat' &&
return step.replaceDialog(GBServer.globals.entryPointDialog); min.core.getParam<boolean>(min.instance, 'HelloGoodX', true) === 'true'
} ) {
// user.once = true;
const user = await min.userProfile.get(step.context, {}); const a = new Date();
const locale = step.context.activity.locale; const date = a.getHours();
const msg =
if (!user.once && step.context.activity.channelId === 'webchat' date < 12
&& min.core.getParam<boolean>(min.instance, 'HelloGoodX', true) === "true") { ? Messages[locale].good_morning
user.once = true; : date < 18
await min.userProfile.set(step.context, user);
const a = new Date();
const date = a.getHours();
const msg =
date < 12
? Messages[locale].good_morning
: date < 18
? Messages[locale].good_evening ? Messages[locale].good_evening
: Messages[locale].good_night; : Messages[locale].good_night;
await min.conversationalService.sendText(min, step, Messages[locale].hi(msg)); await min.conversationalService.sendText(min, step, Messages[locale].hi(msg));
await step.replaceDialog('/ask', { firstTime: true }); await step.replaceDialog('/ask', { firstTime: true });
if ( if (
step.context.activity !== undefined && step.context.activity !== undefined &&
step.context.activity.type === 'message' && step.context.activity.type === 'message' &&
step.context.activity.text !== '' step.context.activity.text !== ''
) { ) {
GBLog.info(`/answer being called from WelcomeDialog.`); GBLogEx.info(min, `/answer being called from WelcomeDialog.`);
await step.replaceDialog('/answer', { query: step.context.activity.text }); await step.replaceDialog('/answer', { query: step.context.activity.text });
}
} }
}
return await step.next(); return await step.next();
} }
])); ])
);
} }
} }

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -39,8 +37,8 @@
import { BotAdapter } from 'botbuilder'; import { BotAdapter } from 'botbuilder';
import { WaterfallDialog } from 'botbuilder-dialogs'; import { WaterfallDialog } from 'botbuilder-dialogs';
import { GBMinInstance, IGBDialog } from 'botlib'; import { GBMinInstance, IGBDialog } from 'botlib';
import { GBConversationalService } from '../services/GBConversationalService'; import { GBConversationalService } from '../services/GBConversationalService.js';
import { Messages } from '../strings'; import { Messages } from '../strings.js';
/** /**
* Dialog for the bot explains about itself. * Dialog for the bot explains about itself.
*/ */
@ -51,33 +49,34 @@ export class WhoAmIDialog extends IGBDialog {
* @param bot The bot adapter. * @param bot The bot adapter.
* @param min The minimal bot instance data. * @param min The minimal bot instance data.
*/ */
public static setup(bot: BotAdapter, min: GBMinInstance) { public static setup (bot: BotAdapter, min: GBMinInstance) {
min.dialogs.add(new WaterfallDialog('/whoAmI', [ min.dialogs.add(
async step => { new WaterfallDialog('/whoAmI', [
if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) { async step => {
return await step.beginDialog('/auth'); if (step.context.activity.channelId !== 'msteams' && process.env.ENABLE_AUTH) {
return await step.beginDialog('/auth');
} else {
return await step.next(step.options);
}
},
async step => {
const locale = step.context.activity.locale;
await min.conversationalService.sendText(min, step, `${min.instance.description}`);
if (min.instance.whoAmIVideo !== undefined) {
await min.conversationalService.sendText(min, step, Messages[locale].show_video);
await min.conversationalService.sendEvent(min, step, 'play', {
playerType: 'video',
data: min.instance.whoAmIVideo.trim()
});
}
await step.replaceDialog('/ask', { isReturning: true });
return await step.next();
} }
else{ ])
return await step.next(step.options); );
}
},
async step => {
const locale = step.context.activity.locale;
await min.conversationalService.sendText(min, step, `${min.instance.description}`);
if (min.instance.whoAmIVideo !== undefined) {
await min.conversationalService.sendText(min, step, Messages[locale].show_video);
await min.conversationalService.sendEvent(min, step, 'play', {
playerType: 'video',
data: min.instance.whoAmIVideo.trim()
});
}
await step.replaceDialog('/ask', { isReturning: true });
return await step.next();
}
]));
} }
} }

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -38,12 +36,12 @@
import { GBDialogStep, GBLog, GBMinInstance, IGBCoreService, IGBPackage } from 'botlib'; import { GBDialogStep, GBLog, GBMinInstance, IGBCoreService, IGBPackage } from 'botlib';
import { Sequelize } from 'sequelize-typescript'; import { Sequelize } from 'sequelize-typescript';
import { BroadcastDialog } from './dialogs/BroadcastDialog'; import { BroadcastDialog } from './dialogs/BroadcastDialog.js';
import { LanguageDialog } from './dialogs/LanguageDialog'; import { LanguageDialog } from './dialogs/LanguageDialog.js';
import { SwitchBotDialog } from './dialogs/SwitchBot'; import { SwitchBotDialog } from './dialogs/SwitchBot.js';
import { WelcomeDialog } from './dialogs/WelcomeDialog'; import { WelcomeDialog } from './dialogs/WelcomeDialog.js';
import { WhoAmIDialog } from './dialogs/WhoAmIDialog'; import { WhoAmIDialog } from './dialogs/WhoAmIDialog.js';
import { GuaribasChannel, GuaribasException, GuaribasInstance, GuaribasPackage } from './models/GBModel'; import { GuaribasApplications, GuaribasChannel, GuaribasInstance, GuaribasLog, GuaribasPackage } from './models/GBModel.js';
/** /**
* Package for core.gbapp. * Package for core.gbapp.
@ -52,27 +50,27 @@ export class GBCorePackage implements IGBPackage {
public sysPackages: IGBPackage[]; public sysPackages: IGBPackage[];
public CurrentEngineName = 'guaribas-1.0.0'; public CurrentEngineName = 'guaribas-1.0.0';
public async loadPackage(core: IGBCoreService, sequelize: Sequelize): Promise<void> { public async loadPackage (core: IGBCoreService, sequelize: Sequelize): Promise<void> {
core.sequelize.addModels([GuaribasInstance, GuaribasPackage, GuaribasChannel, GuaribasException]); core.sequelize.addModels([GuaribasInstance, GuaribasPackage, GuaribasChannel, GuaribasLog, GuaribasApplications]);
} }
public async getDialogs(min: GBMinInstance) { public async getDialogs (min: GBMinInstance) {
GBLog.verbose(`getDialogs called.`); GBLog.verbose(`getDialogs called.`);
} }
public async unloadPackage(core: IGBCoreService): Promise<void> { public async unloadPackage (core: IGBCoreService): Promise<void> {
GBLog.verbose(`unloadPackage called.`); GBLog.verbose(`unloadPackage called.`);
} }
public async unloadBot(min: GBMinInstance): Promise<void> { public async unloadBot (min: GBMinInstance): Promise<void> {
GBLog.verbose(`unloadBot called.`); GBLog.verbose(`unloadBot called.`);
} }
public async onNewSession(min: GBMinInstance, step: GBDialogStep): Promise<void> { public async onNewSession (min: GBMinInstance, step: GBDialogStep): Promise<void> {
GBLog.verbose(`onNewSession called.`); GBLog.verbose(`onNewSession called.`);
} }
public async onExchangeData(min: GBMinInstance, kind: string, data: any) { public async onExchangeData (min: GBMinInstance, kind: string, data: any) {
GBLog.verbose(`onExchangeData called.`); GBLog.verbose(`onExchangeData called.`);
} }
public async loadBot(min: GBMinInstance): Promise<void> { public async loadBot (min: GBMinInstance): Promise<void> {
WelcomeDialog.setup(min.bot, min); WelcomeDialog.setup(min.bot, min);
WhoAmIDialog.setup(min.bot, min); WhoAmIDialog.setup(min.bot, min);
SwitchBotDialog.setup(min.bot, min); SwitchBotDialog.setup(min.bot, min);

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -47,4 +45,4 @@ import {
Table, Table,
UpdatedAt UpdatedAt
} from 'sequelize-typescript'; } from 'sequelize-typescript';
import { GuaribasInstance } from './GBModel'; import { GuaribasInstance } from './GBModel.js';

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -55,218 +53,216 @@ import { IGBInstance } from 'botlib';
* Base instance data for a bot. * Base instance data for a bot.
*/ */
@Table @Table
export class GuaribasInstance extends Model<GuaribasInstance> export class GuaribasInstance extends Model<GuaribasInstance> implements IGBInstance {
implements IGBInstance {
@PrimaryKey @PrimaryKey
@AutoIncrement @AutoIncrement
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public instanceId: number; declare instanceId: number;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public botEndpoint: string; declare botEndpoint: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public whoAmIVideo: string; declare whoAmIVideo: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public botId: string; declare botId: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public title: string; declare title: string;
@Column({ type: DataType.STRING(16) }) @Column({ type: DataType.STRING(16) })
public activationCode: string; declare activationCode: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public description: string; declare description: string;
@Column({ type: DataType.STRING(16) }) @Column({ type: DataType.STRING(16) })
public state: string; declare state: string;
public version: string; declare version: string;
@Column(DataType.STRING(64))
declare botKey: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public enabledAdmin: boolean; declare enabledAdmin: boolean;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public engineName: string; declare engineName: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public marketplaceId: string; declare marketplaceId: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public textAnalyticsKey: string; declare textAnalyticsKey: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public textAnalyticsEndpoint: string; declare textAnalyticsEndpoint: string;
@Column({ type: DataType.STRING(64) }) @Column({ type: DataType.STRING(64) })
public translatorKey: string; declare translatorKey: string;
@Column({ type: DataType.STRING(128) }) @Column({ type: DataType.STRING(128) })
public translatorEndpoint: string; declare translatorEndpoint: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public marketplacePassword: string; declare marketplacePassword: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public webchatKey: string; declare webchatKey: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public authenticatorTenant: string; declare authenticatorTenant: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public authenticatorAuthorityHostUrl: string; declare authenticatorAuthorityHostUrl: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public cloudSubscriptionId: string; declare cloudSubscriptionId: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public cloudUsername: string; declare cloudUsername: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public cloudPassword: string; declare cloudPassword: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public cloudLocation: string; declare cloudLocation: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public googleBotKey: string; declare googleBotKey: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public googleChatApiKey: string; declare googleChatApiKey: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public googleChatSubscriptionName: string; declare googleChatSubscriptionName: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public googleClientEmail: string; declare googleClientEmail: string;
@Column({ type: DataType.STRING(4000) }) @Column({ type: DataType.STRING(4000) })
public googlePrivateKey: string; declare googlePrivateKey: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public googleProjectId: string; declare googleProjectId: string;
@Column({ type: DataType.STRING(255) })
facebookWorkplaceVerifyToken: string;
@Column({ type: DataType.STRING(255) }) @Column({ type: DataType.STRING(255) })
facebookWorkplaceAppSecret: string; declare facebookWorkplaceVerifyToken: string;
@Column({ type: DataType.STRING(255) })
declare facebookWorkplaceAppSecret: string;
@Column({ type: DataType.STRING(512) }) @Column({ type: DataType.STRING(512) })
facebookWorkplaceAccessToken: string; declare facebookWorkplaceAccessToken: string;
@Column(DataType.STRING(255))
public whatsappBotKey: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public whatsappServiceKey: string; declare whatsappBotKey: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public whatsappServiceNumber: string; declare whatsappServiceKey: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public whatsappServiceUrl: string; declare whatsappServiceNumber: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public smsKey: string; declare whatsappServiceUrl: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public smsSecret: string; declare smsKey: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public smsServiceNumber: string; declare smsSecret: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public speechKey: string; declare smsServiceNumber: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public speechEndpoint: string; declare speechKey: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public spellcheckerKey: string; declare speechEndpoint: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public spellcheckerEndpoint: string; declare spellcheckerKey: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public theme: string; declare spellcheckerEndpoint: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public ui: string; declare theme: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public kb: string; declare ui: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public nlpAppId: string; declare kb: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public nlpKey: string; declare nlpAppId: string;
@Column(DataType.STRING(255))
declare nlpKey: string;
@Column({ type: DataType.STRING(512) }) @Column({ type: DataType.STRING(512) })
public nlpEndpoint: string; declare nlpEndpoint: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public nlpAuthoringKey: string; declare nlpAuthoringKey: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public deploymentPaths: string; declare deploymentPaths: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public searchHost: string; declare searchHost: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public searchKey: string; declare searchKey: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public searchIndex: string; declare searchIndex: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public searchIndexer: string; declare searchIndexer: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public storageUsername: string; declare storageUsername: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public storagePassword: string; declare storagePassword: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public storageName: string; declare storageName: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public storageServer: string; declare storageServer: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public storageDialect: string; declare storageDialect: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public storagePath: string; declare storagePath: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public adminPass: string; declare adminPass: string;
@Column(DataType.FLOAT) @Column(DataType.FLOAT)
public nlpVsSearch: number; // TODO: Remove field. declare searchScore: number;
@Column(DataType.FLOAT) @Column(DataType.FLOAT)
public searchScore: number; declare nlpScore: number;
@Column(DataType.FLOAT)
public nlpScore: number;
@Column(DataType.DATE) @Column(DataType.DATE)
@CreatedAt @CreatedAt
public createdAt: Date; declare createdAt: Date;
@Column(DataType.DATE) @Column(DataType.DATE)
@UpdatedAt @UpdatedAt
public updatedAt: Date; declare updatedAt: Date;
@Column(DataType.STRING(4000)) @Column(DataType.STRING(4000))
public params: string; declare params: string;
} }
/** /**
@ -277,28 +273,28 @@ export class GuaribasPackage extends Model<GuaribasPackage> {
@PrimaryKey @PrimaryKey
@AutoIncrement @AutoIncrement
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public packageId: number; declare packageId: number;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public packageName: string; declare packageName: string;
@ForeignKey(() => GuaribasInstance) @ForeignKey(() => GuaribasInstance)
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public instanceId: number; declare instanceId: number;
@BelongsTo(() => GuaribasInstance) @BelongsTo(() => GuaribasInstance)
public instance: GuaribasInstance; declare instance: GuaribasInstance;
@Column(DataType.DATE) @Column(DataType.DATE)
@CreatedAt @CreatedAt
public createdAt: Date; declare createdAt: Date;
@Column(DataType.DATE) @Column(DataType.DATE)
@UpdatedAt @UpdatedAt
public updatedAt: Date; declare updatedAt: Date;
@Column({ type: DataType.STRING(512) }) @Column({ type: DataType.STRING(512) })
public custom: string; declare custom: string;
} }
/** /**
@ -309,18 +305,18 @@ export class GuaribasChannel extends Model<GuaribasChannel> {
@PrimaryKey @PrimaryKey
@AutoIncrement @AutoIncrement
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public channelId: number; declare channelId: number;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public title: string; declare title: string;
@Column(DataType.DATE) @Column(DataType.DATE)
@CreatedAt @CreatedAt
public createdAt: Date; declare createdAt: Date;
@Column(DataType.DATE) @Column(DataType.DATE)
@UpdatedAt @UpdatedAt
public updatedAt: Date; declare updatedAt: Date;
} }
/** /**
@ -328,76 +324,77 @@ export class GuaribasChannel extends Model<GuaribasChannel> {
*/ */
@Table @Table
//tslint:disable-next-line:max-classes-per-file //tslint:disable-next-line:max-classes-per-file
export class GuaribasException extends Model<GuaribasException> { export class GuaribasLog extends Model<GuaribasLog> {
@PrimaryKey @PrimaryKey
@AutoIncrement @AutoIncrement
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public exceptionId: number; declare logId: number;
@Column(DataType.STRING(255)) @Column(DataType.STRING(1024))
public message: string; declare message: string;
@Column(DataType.STRING(1))
declare kind: string;
@ForeignKey(() => GuaribasInstance) @ForeignKey(() => GuaribasInstance)
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public instanceId: number; declare instanceId: number;
@BelongsTo(() => GuaribasInstance) @BelongsTo(() => GuaribasInstance)
public instance: GuaribasInstance; declare instance: GuaribasInstance;
@Column(DataType.DATE) @Column(DataType.DATE)
@CreatedAt @CreatedAt
public createdAt: Date; declare createdAt: Date;
@Column(DataType.DATE) @Column(DataType.DATE)
@UpdatedAt @UpdatedAt
public updatedAt: Date; declare updatedAt: Date;
} }
@Table @Table
//tslint:disable-next-line:max-classes-per-file //tslint:disable-next-line:max-classes-per-file
export class GuaribasApplications extends Model<GuaribasApplications> { export class GuaribasApplications extends Model<GuaribasApplications> {
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public name: string; declare name: string;
@ForeignKey(() => GuaribasInstance) @ForeignKey(() => GuaribasInstance)
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public instanceId: number; declare instanceId: number;
@BelongsTo(() => GuaribasInstance) @BelongsTo(() => GuaribasInstance)
public instance: GuaribasInstance; declare instance: GuaribasInstance;
@Column(DataType.DATE) @Column(DataType.DATE)
@CreatedAt @CreatedAt
public createdAt: Date; declare createdAt: Date;
@Column(DataType.DATE) @Column(DataType.DATE)
@UpdatedAt @UpdatedAt
public updatedAt: Date; declare updatedAt: Date;
} }
@Table @Table
//tslint:disable-next-line:max-classes-per-file //tslint:disable-next-line:max-classes-per-file
export class GuaribasSchedule extends Model<GuaribasSchedule> { export class GuaribasSchedule extends Model<GuaribasSchedule> {
@Column(DataType.STRING(255))
declare name: string;
@Column(DataType.STRING(255)) @Column(DataType.STRING(255))
public name: string; declare schedule: string;
@Column(DataType.STRING(255))
public schedule: string;
@ForeignKey(() => GuaribasInstance) @ForeignKey(() => GuaribasInstance)
@Column(DataType.INTEGER) @Column(DataType.INTEGER)
public instanceId: number; declare instanceId: number;
@BelongsTo(() => GuaribasInstance) @BelongsTo(() => GuaribasInstance)
public instance: GuaribasInstance; declare instance: GuaribasInstance;
@Column(DataType.DATE) @Column(DataType.DATE)
@CreatedAt @CreatedAt
public createdAt: Date; declare createdAt: Date;
@Column(DataType.DATE) @Column(DataType.DATE)
@UpdatedAt @UpdatedAt
public updatedAt: Date; declare updatedAt: Date;
} }

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -33,6 +31,8 @@
'use strict'; 'use strict';
import { GBLog } from 'botlib'; import { GBLog } from 'botlib';
import * as en from 'dotenv-extended';
import path from 'path';
/** /**
* @fileoverview General Bots server core. * @fileoverview General Bots server core.
@ -58,7 +58,7 @@ export class GBConfigService {
public static init(): any { public static init(): any {
try { try {
require('dotenv-extended').load({ en.load({
encoding: 'utf8', encoding: 'utf8',
silent: true, silent: true,
path: '.env', path: '.env',
@ -77,20 +77,39 @@ export class GBConfigService {
} }
} }
public static get(key: string): string | undefined { public static get(key: string) {
let value = GBConfigService.tryGet(key); let value = GBConfigService.tryGet(key);
if (value === undefined) { if (!value) {
switch (key) { switch (key) {
case 'PORT':
value = this.getServerPort();
break;
case 'GBVM':
value = true;
break;
case 'STORAGE_NAME':
value = null;
break;
case 'WEBDAV_USERNAME':
value = null;
break;
case 'WEBDAV_PASSWORD':
value = null;
break;
case 'CLOUD_USERNAME': case 'CLOUD_USERNAME':
value = undefined; value = undefined;
break; break;
case 'BOT_ID':
value = undefined;
break;
case 'CLOUD_PASSWORD': case 'CLOUD_PASSWORD':
value = undefined; value = undefined;
break; break;
case 'STORAGE_LIBRARY':
value = path.join(process.env.PWD, 'templates');
break;
case 'BOT_ID':
value = 'default';
break;
case 'CLOUD_SUBSCRIPTIONID': case 'CLOUD_SUBSCRIPTIONID':
value = undefined; value = undefined;
break; break;
@ -100,14 +119,18 @@ export class GBConfigService {
case 'MARKETPLACE_ID': case 'MARKETPLACE_ID':
value = undefined; value = undefined;
break; break;
case 'LOG_ON_STORAGE':
value = false;
break;
case 'MARKETPLACE_SECRET': case 'MARKETPLACE_SECRET':
value = undefined; value = undefined;
break; break;
case 'STORAGE_DIALECT': case 'STORAGE_DIALECT':
value = undefined; value = 'sqlite';
break; break;
case 'STORAGE_STORAGE': case 'STORAGE_FILE':
value = './guaribas.sqlite'; value = './data.db';
break; break;
case 'GBKB_AUTO_DEPLOY': case 'GBKB_AUTO_DEPLOY':
value = false; value = false;
@ -154,6 +177,18 @@ export class GBConfigService {
case 'ENABLE_SPELLING_CHECKER': case 'ENABLE_SPELLING_CHECKER':
value = false; value = false;
break; break;
case 'DEV_GBAI':
value = undefined;
break;
case 'FREE_TIER':
value = true;
break;
case 'BOT_URL':
value = 'http://localhost:4242';
break;
case 'STORAGE_SERVER':
value = undefined;
break;
default: default:
GBLog.warn(`Invalid key on .env file: '${key}'`); GBLog.warn(`Invalid key on .env file: '${key}'`);
break; break;
@ -169,7 +204,6 @@ export class GBConfigService {
value = process.env[key]; value = process.env[key];
} }
return value; return value;
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ _ _ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/ \ /`\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| |*| |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -36,31 +34,40 @@
'use strict'; 'use strict';
import { GBLog, IGBCoreService, IGBInstallationDeployer, IGBInstance, IGBPackage } from 'botlib'; import { GBLog, GBMinInstance, IGBCoreService, IGBInstallationDeployer, IGBInstance, IGBPackage } from 'botlib';
import * as fs from 'fs'; import fs from 'fs/promises';
import { Sequelize, SequelizeOptions } from 'sequelize-typescript'; import { Sequelize, SequelizeOptions } from 'sequelize-typescript';
import { Op, Dialect } from 'sequelize'; import { Op, Dialect } from 'sequelize';
import { GBServer } from '../../../src/app'; import { GBServer } from '../../../src/app.js';
import { GBAdminPackage } from '../../admin.gbapp/index'; import { GBAdminPackage } from '../../admin.gbapp/index.js';
import { GBAdminService } from '../../admin.gbapp/services/GBAdminService'; import { GBAdminService } from '../../admin.gbapp/services/GBAdminService.js';
import { GBAnalyticsPackage } from '../../analytics.gblib'; import { GBAnalyticsPackage } from '../../analytics.gblib/index.js';
import { StartDialog } from '../../azuredeployer.gbapp/dialogs/StartDialog'; import { StartDialog } from '../../azuredeployer.gbapp/dialogs/StartDialog.js';
import { GBCorePackage } from '../../core.gbapp'; import { GBCorePackage } from '../../core.gbapp/index.js';
import { GBCustomerSatisfactionPackage } from '../../customer-satisfaction.gbapp'; import { GBCustomerSatisfactionPackage } from '../../customer-satisfaction.gbapp/index.js';
import { GBKBPackage } from '../../kb.gbapp'; import { GBKBPackage } from '../../kb.gbapp/index.js';
import { GBSecurityPackage } from '../../security.gbapp'; import { GBSecurityPackage } from '../../security.gbapp/index.js';
import { GBWhatsappPackage } from '../../whatsapp.gblib/index'; import { v2 as webdav } from 'webdav-server';
import { GuaribasInstance } from '../models/GBModel'; import { GBWhatsappPackage } from '../../whatsapp.gblib/index.js';
import { GBConfigService } from './GBConfigService'; import { GuaribasApplications, GuaribasInstance, GuaribasLog } from '../models/GBModel.js';
import { GBAzureDeployerPackage } from '../../azuredeployer.gbapp'; import { GBConfigService } from './GBConfigService.js';
import { GBSharePointPackage } from '../../sharepoint.gblib'; import mkdirp from 'mkdirp';
import { GBAzureDeployerPackage } from '../../azuredeployer.gbapp/index.js';
import { GBSharePointPackage } from '../../sharepoint.gblib/index.js';
import { CollectionUtil } from 'pragmatismo-io-framework'; import { CollectionUtil } from 'pragmatismo-io-framework';
import { GBBasicPackage } from '../../basic.gblib'; import { GBBasicPackage } from '../../basic.gblib/index.js';
import { GBGoogleChatPackage } from '../../google-chat.gblib'; import { GBGoogleChatPackage } from '../../google-chat.gblib/index.js';
import { GBHubSpotPackage } from '../../hubspot.gblib'; import { GBHubSpotPackage } from '../../hubspot.gblib/index.js';
import open from 'open';
const opn = require('opn'); import ngrok from 'ngrok';
const cron = require('node-cron'); import path from 'path';
import { GBUtil } from '../../../src/util.js';
import { GBLogEx } from './GBLogEx.js';
import { GBDeployer } from './GBDeployer.js';
import { SystemKeywords } from '../../basic.gblib/services/SystemKeywords.js';
import csvdb from 'csv-database';
import { SaaSPackage } from '../../saas.gbapp/index.js';
import { Client } from 'minio';
/** /**
* GBCoreService contains main logic for handling storage services related * GBCoreService contains main logic for handling storage services related
@ -101,7 +108,7 @@ export class GBCoreService implements IGBCoreService {
private dialect: string; private dialect: string;
/** /**
* *
*/ */
constructor() { constructor() {
this.adminService = new GBAdminService(this); this.adminService = new GBAdminService(this);
@ -115,63 +122,87 @@ export class GBCoreService implements IGBCoreService {
public async initStorage(): Promise<any> { public async initStorage(): Promise<any> {
this.dialect = GBConfigService.get('STORAGE_DIALECT'); this.dialect = GBConfigService.get('STORAGE_DIALECT');
let port: number | undefined;
let host: string | undefined; let host: string | undefined;
let database: string | undefined; let database: string | undefined;
let username: string | undefined; let username: string | undefined;
let password: string | undefined; let password: string | undefined;
let storage: string | undefined; let storage: string | undefined;
if (this.dialect === 'mssql') {
if (!['mssql', 'postgres', 'sqlite'].includes(this.dialect)) {
throw new Error(`Unknown or unsupported dialect: ${this.dialect}.`);
}
if (this.dialect === 'mssql' || this.dialect === 'postgres') {
host = GBConfigService.get('STORAGE_SERVER'); host = GBConfigService.get('STORAGE_SERVER');
database = GBConfigService.get('STORAGE_NAME'); database = GBConfigService.get('STORAGE_NAME');
username = GBConfigService.get('STORAGE_USERNAME'); username = GBConfigService.get('STORAGE_USERNAME');
password = GBConfigService.get('STORAGE_PASSWORD'); password = GBConfigService.get('STORAGE_PASSWORD');
const portStr = GBConfigService.get('STORAGE_PORT');
port = portStr ? parseInt(portStr, 10) : undefined;
if (!host || !database || !username || !password || !port) {
throw new Error(`Missing required configuration for ${this.dialect}.`);
}
} else if (this.dialect === 'sqlite') { } else if (this.dialect === 'sqlite') {
storage = GBConfigService.get('STORAGE_STORAGE'); storage = GBConfigService.get('STORAGE_FILE');
} else {
throw new Error(`Unknown dialect: ${this.dialect}.`); if (!storage) {
throw new Error('STORAGE_FILE is required for SQLite.');
}
if (!(await GBUtil.exists(storage))) {
process.env.STORAGE_SYNC = 'true';
}
} }
const logging: boolean | Function = const logging: boolean | Function =
GBConfigService.get('STORAGE_LOGGING') === 'true' GBConfigService.get('STORAGE_LOGGING') === 'true'
? (str: string): void => { ? (str: string): void => {
GBLog.info(str); GBLogEx.info(0, str);
} }
: false; : false;
const encrypt: boolean = GBConfigService.get('STORAGE_ENCRYPT') === 'true'; const encrypt: boolean = GBConfigService.get('STORAGE_ENCRYPT') === 'true';
const acquire = parseInt(GBConfigService.get('STORAGE_ACQUIRE_TIMEOUT'));
const acquireStr = GBConfigService.get('STORAGE_ACQUIRE_TIMEOUT');
const acquire = acquireStr ? parseInt(acquireStr, 10) : 10000; // Valor padrão de 10 segundos
const sequelizeOptions: SequelizeOptions = { const sequelizeOptions: SequelizeOptions = {
define: { define: {
freezeTableName: true, freezeTableName: true,
timestamps: false timestamps: false,
}, },
host: host, host: host,
port: port,
logging: logging as boolean, logging: logging as boolean,
dialect: this.dialect as Dialect, dialect: this.dialect as Dialect,
storage: storage, storage: storage,
dialectOptions: { quoteIdentifiers: this.dialect === 'postgres',
dialectOptions: this.dialect === 'mssql' ? {
options: { options: {
trustServerCertificate: true, trustServerCertificate: true,
encrypt: encrypt encrypt: encrypt,
} },
}, } : {},
pool: { pool: {
max: 32, max: 5,
min: 8, min: 0,
idle: 40000, idle: 10000,
evict: 40000, evict: 10000,
acquire: acquire acquire: acquire,
} },
}; };
this.sequelize = new Sequelize(database, username, password, sequelizeOptions); this.sequelize = new Sequelize(database, username, password, sequelizeOptions);
// Specifies custom setup for MSFT...
if (this.dialect === 'mssql') {
}
} }
/** /**
@ -182,7 +213,7 @@ export class GBCoreService implements IGBCoreService {
try { try {
await this.sequelize.authenticate(); await this.sequelize.authenticate();
} catch (error) { } catch (error) {
GBLog.info('Opening storage firewall on infrastructure...'); GBLogEx.info(0, 'Opening storage firewall on infrastructure...');
// tslint:disable:no-unsafe-any // tslint:disable:no-unsafe-any
if (error.parent.code === 'ELOGIN') { if (error.parent.code === 'ELOGIN') {
await this.openStorageFrontier(installationDeployer); await this.openStorageFrontier(installationDeployer);
@ -193,14 +224,13 @@ export class GBCoreService implements IGBCoreService {
} }
} }
/**
/** * Syncronizes structure between model and tables in storage.
* Syncronizes structure between model and tables in storage. */
*/
public async syncDatabaseStructure() { public async syncDatabaseStructure() {
if (GBConfigService.get('STORAGE_SYNC') === 'true') { if (GBConfigService.get('STORAGE_SYNC') === 'true') {
const alter = GBConfigService.get('STORAGE_SYNC_ALTER') === 'true'; const alter = GBConfigService.get('STORAGE_SYNC_ALTER') === 'true';
GBLog.info('Syncing database...'); GBLogEx.info(0, 'Syncing database...');
return await this.sequelize.sync({ return await this.sequelize.sync({
alter: alter, alter: alter,
@ -208,15 +238,36 @@ export class GBCoreService implements IGBCoreService {
}); });
} else { } else {
const msg = `Database synchronization is disabled.`; const msg = `Database synchronization is disabled.`;
GBLog.info(msg); GBLogEx.info(0, msg);
} }
} }
/**
* Loads all items to start several listeners.
*/
public async getLatestLogs(instanceId: number): Promise<string> {
const options = {
where: {
instanceId: instanceId,
state: 'active',
created: {
[Op.gt]: new Date(Date.now() - 60 * 60 * 1000 * 48) // Latest 48 hours.
}
}
};
const list = await GuaribasLog.findAll(options);
let out = 'General Bots Log\n';
await CollectionUtil.asyncForEach(list, async e => {
out = `${out}\n${e.createdAt} - ${e.message}`;
});
return out;
}
/** /**
* Loads all items to start several listeners. * Loads all items to start several listeners.
*/ */
public async loadInstances(): Promise<IGBInstance[]> { public async loadInstances(): Promise<IGBInstance[]> {
if (process.env.LOAD_ONLY !== undefined) { if (process.env.LOAD_ONLY) {
const bots = process.env.LOAD_ONLY.split(`;`); const bots = process.env.LOAD_ONLY.split(`;`);
const and = []; const and = [];
await CollectionUtil.asyncForEach(bots, async e => { await CollectionUtil.asyncForEach(bots, async e => {
@ -226,12 +277,15 @@ export class GBCoreService implements IGBCoreService {
const options = { const options = {
where: { where: {
[Op.or]: and [Op.or]: and
} },
order: [['instanceId', 'ASC']]
}; };
return await GuaribasInstance.findAll(options); return await GuaribasInstance.findAll(options as any);
} else { } else {
const options = { where: { state: 'active' } }; const options = { where: { state: 'active' } ,
return await GuaribasInstance.findAll(options);
order: [['instanceId', 'ASC']]};
return await GuaribasInstance.findAll(options as any);
} }
} }
@ -262,18 +316,16 @@ export class GBCoreService implements IGBCoreService {
} }
/** /**
* Writes .env required to start the full server. Used during * Writes .env required to start the full server. Used during
* first startup, when user is asked some questions to create the * first startup, when user is asked some questions to create the
* full base environment. * full base environment.
*/ */
public async writeEnv(instance: IGBInstance) { public async writeEnv(instance: IGBInstance) {
const env = ` const env = `
ADDITIONAL_DEPLOY_PATH= ADDITIONAL_DEPLOY_PATH=
ADMIN_PASS=${instance.adminPass}
BOT_ID=${instance.botId} BOT_ID=${instance.botId}
CLOUD_SUBSCRIPTIONID=${instance.cloudSubscriptionId} CLOUD_SUBSCRIPTIONID=${instance.cloudSubscriptionId}
CLOUD_LOCATION=${instance.cloudLocation} CLOUD_LOCATION=${instance.cloudLocation}
CLOUD_GROUP=${instance.botId}
CLOUD_USERNAME=${instance.cloudUsername} CLOUD_USERNAME=${instance.cloudUsername}
CLOUD_PASSWORD=${instance.cloudPassword} CLOUD_PASSWORD=${instance.cloudPassword}
MARKETPLACE_ID=${instance.marketplaceId} MARKETPLACE_ID=${instance.marketplaceId}
@ -288,22 +340,23 @@ STORAGE_SYNC_ALTER=true
ENDPOINT_UPDATE=true ENDPOINT_UPDATE=true
`; `;
fs.writeFileSync('.env', env); await fs.writeFile('.env', env);
} }
/**
/**
* Certifies that network servers will reach back the development machine * Certifies that network servers will reach back the development machine
* when calling back from web services. This ensures that reverse proxy is * when calling back from web services. This ensures that reverse proxy is
* established. * established.
*/ */
public async ensureProxy(port): Promise<string> { public async ensureProxy(port): Promise<string> {
try { try {
if (fs.existsSync('node_modules/ngrok/bin/ngrok.exe') || fs.existsSync('node_modules/ngrok/bin/ngrok')) { if (
const ngrok = require('ngrok'); (await GBUtil.exists('node_modules/ngrok/bin/ngrok.exe')) ||
return await ngrok.connect({ port: port }, 10); (await GBUtil.exists('node_modules/.bin/ngrok'))
) {
return await ngrok.connect({ port: port });
} else { } else {
GBLog.warn('ngrok executable not found (only tested on Windows). Check installation or node_modules folder.'); GBLog.warn('ngrok executable not found. Check installation or node_modules folder.');
return 'https://localhost'; return 'https://localhost';
} }
@ -332,7 +385,7 @@ ENDPOINT_UPDATE=true
} }
/** /**
* Defines the entry point dialog to be called whenever a user * Defines the entry point dialog to be called whenever a user
* starts talking to the bot. * starts talking to the bot.
*/ */
public setEntryPointDialog(dialogName: string) { public setEntryPointDialog(dialogName: string) {
@ -372,12 +425,31 @@ ENDPOINT_UPDATE=true
} }
try { try {
instance.params = JSON.stringify(JSON.parse(instance.params)); instance.params = JSON.stringify(JSON.parse(instance.params));
} catch (err) { } catch (error) {
instance.params = JSON.stringify(instance.params); instance.params = JSON.stringify(instance.params);
} }
return await instance.save(); return await instance.save();
} }
/**
* Loads all bot instances from object storage, if it's formatted.
*/
public async getApplicationsByInstanceId(appPackages, instanceId: number) {
const options = { where: { instanceId: instanceId } };
const apps = await GuaribasApplications.findAll(options);
let matchingAppPackages = [];
await CollectionUtil.asyncForEach(appPackages, async appPackage => {
const filenameOnly = path.basename(appPackage.name);
const matchedApp = apps.find(app => app.name === filenameOnly);
if (matchedApp || filenameOnly.endsWith('.gblib')) {
matchingAppPackages.push(appPackage);
}
});
return matchingAppPackages;
}
/** /**
* Loads all bot instances from object storage, if it's formatted. * Loads all bot instances from object storage, if it's formatted.
*/ */
@ -386,22 +458,23 @@ ENDPOINT_UPDATE=true
installationDeployer: IGBInstallationDeployer, installationDeployer: IGBInstallationDeployer,
proxyAddress: string proxyAddress: string
) { ) {
GBLog.info(`Loading instances from storage...`); GBLogEx.info(0, `Loading instances from storage...`);
let instances: IGBInstance[]; let instances: IGBInstance[];
try { try {
instances = await core.loadInstances(); instances = await core.loadInstances();
if (process.env.ENDPOINT_UPDATE === 'true') { if (process.env.ENDPOINT_UPDATE === 'true') {
const group = GBConfigService.get('CLOUD_GROUP') ?? GBConfigService.get('BOT_ID');
await CollectionUtil.asyncForEach(instances, async instance => { await CollectionUtil.asyncForEach(instances, async instance => {
GBLog.info(`Updating bot endpoint for ${instance.botId}...`); GBLogEx.info(instance.instanceId, `Updating bot endpoint for ${instance.botId}...`);
try { try {
await installationDeployer.updateBotProxy( await installationDeployer.updateBotProxy(
instance.botId, instance.botId,
GBConfigService.get('CLOUD_GROUP'), group,
`${proxyAddress}/api/messages/${instance.botId}` `${proxyAddress}/api/messages/${instance.botId}`
); );
} catch (error) { } catch (error) {
if (error.code === 'ResourceNotFound') { if (error.code === 'ResourceNotFound') {
GBLog.warn(`Bot ${instance.botId} not found on resource group ${GBConfigService.get('CLOUD_GROUP')}.`); GBLog.warn(`Bot ${instance.botId} not found on resource group ${GBConfigService.get('BOT_ID')}.`);
} else { } else {
throw new Error(`Error updating bot proxy, details: ${error}.`); throw new Error(`Error updating bot proxy, details: ${error}.`);
} }
@ -421,7 +494,10 @@ ENDPOINT_UPDATE=true
Try setting STORAGE_SYNC to true in .env file. Error: ${error.message}.` Try setting STORAGE_SYNC to true in .env file. Error: ${error.message}.`
); );
} else { } else {
GBLog.info(`Storage is empty. After collecting storage structure from all .gbapps it will get synced.`); GBLogEx.info(
0,
`Storage is empty. After collecting storage structure from all .gbapps it will get synced.`
);
} }
} else { } else {
throw new Error(`Cannot connect to operating storage: ${error.message}.`); throw new Error(`Cannot connect to operating storage: ${error.message}.`);
@ -433,7 +509,7 @@ ENDPOINT_UPDATE=true
} }
/** /**
* Loads all system packages from 'packages' folder. * Loads all system packages from 'packages' folder.
*/ */
public async loadSysPackages(core: GBCoreService): Promise<IGBPackage[]> { public async loadSysPackages(core: GBCoreService): Promise<IGBPackage[]> {
// NOTE: if there is any code before this line a semicolon // NOTE: if there is any code before this line a semicolon
@ -454,10 +530,11 @@ ENDPOINT_UPDATE=true
GBSharePointPackage, GBSharePointPackage,
GBGoogleChatPackage, GBGoogleChatPackage,
GBBasicPackage, GBBasicPackage,
GBHubSpotPackage GBHubSpotPackage,
SaaSPackage
], ],
async e => { async e => {
GBLog.info(`Loading sys package: ${e.name}...`); GBLogEx.info(0, `Loading sys package: ${e.name}...`);
const p = Object.create(e.prototype) as IGBPackage; const p = Object.create(e.prototype) as IGBPackage;
sysPackages.push(p); sysPackages.push(p);
@ -470,34 +547,45 @@ ENDPOINT_UPDATE=true
} }
/** /**
* Verifies that an complex global password has been specified * Verifies that an complex global password has been specified
* before starting the server. * before starting the server.
*/ */
public ensureAdminIsSecured() { public ensureAdminIsSecured() { }
const password = GBConfigService.get('ADMIN_PASS');
if (!GBAdminService.StrongRegex.test(password)) {
throw new Error(
'Please, define a really strong password in ADMIN_PASS environment variable before running the server.'
);
}
}
/**
* Creates the first bot instance (boot instance) used to "boot" the server.
* At least one bot is required to perform conversational administrative tasks.
* So a base main bot is always deployed and will act as root bot for
* configuration tree with three levels: .env > root bot > all other bots.
*/
public async createBootInstance( public async createBootInstance(
core: GBCoreService, core: GBCoreService,
installationDeployer: IGBInstallationDeployer, installationDeployer: IGBInstallationDeployer,
proxyAddress: string proxyAddress: string
) { ) {
GBLog.info(`Deploying cognitive infrastructure (on the cloud / on premises)...`); return await this.createBootInstanceEx(
core,
installationDeployer,
proxyAddress,
null,
GBConfigService.get('FREE_TIER')
);
}
/**
* Creates the first bot instance (boot instance) used to "boot" the server.
* At least one bot is required to perform conversational administrative tasks.
* So a base main bot is always deployed and will act as root bot for
* configuration tree with three levels: .env > root bot > all other bots.
*/
public async createBootInstanceEx(
core: GBCoreService,
installationDeployer: IGBInstallationDeployer,
proxyAddress: string,
deployer,
freeTier
) {
GBLogEx.info(0, `Deploying cognitive infrastructure (on the cloud / on premises)...`);
try { try {
const { instance, credentials, subscriptionId } = await StartDialog.createBaseInstance(installationDeployer); const { instance, credentials, subscriptionId, installationDeployer } = await StartDialog.createBaseInstance(
deployer,
freeTier
);
installationDeployer['core'] = this; installationDeployer['core'] = this;
const changedInstance = await installationDeployer.deployFarm( const changedInstance = await installationDeployer['deployFarm2'](
proxyAddress, proxyAddress,
instance, instance,
credentials, credentials,
@ -505,12 +593,12 @@ ENDPOINT_UPDATE=true
); );
await this.writeEnv(changedInstance); await this.writeEnv(changedInstance);
GBConfigService.init(); GBConfigService.init();
GBLog.info(`File .env written. Preparing storage and search for the first time...`); GBLogEx.info(0, `File .env written. Preparing storage and search for the first time...`);
await this.openStorageFrontier(installationDeployer); await this.openStorageFrontier(installationDeployer);
await this.initStorage(); await this.initStorage();
return changedInstance; return [changedInstance, installationDeployer];
} catch (error) { } catch (error) {
GBLog.warn( GBLog.warn(
`There is an error being thrown, so please cleanup any infrastructure objects `There is an error being thrown, so please cleanup any infrastructure objects
@ -525,7 +613,7 @@ ENDPOINT_UPDATE=true
*/ */
public openBrowserInDevelopment() { public openBrowserInDevelopment() {
if (process.env.NODE_ENV === 'development') { if (process.env.NODE_ENV === 'development') {
opn('http://localhost:4242'); open('http://localhost:4242');
} }
} }
@ -608,45 +696,270 @@ ENDPOINT_UPDATE=true
* Opens storage firewall used by the server when starting to get root bot instance. * Opens storage firewall used by the server when starting to get root bot instance.
*/ */
private async openStorageFrontier(installationDeployer: IGBInstallationDeployer) { private async openStorageFrontier(installationDeployer: IGBInstallationDeployer) {
const group = GBConfigService.get('CLOUD_GROUP'); const group = GBConfigService.get('BOT_ID');
const serverName = GBConfigService.get('STORAGE_SERVER').split('.database.windows.net')[0]; const serverName = GBConfigService.get('STORAGE_SERVER').split('.database.windows.net')[0];
await installationDeployer.openStorageFirewall(group, serverName); await installationDeployer.openStorageFirewall(group, serverName);
} }
public async setConfig(min, name: string, value: any): Promise<any> {
if (GBConfigService.get('GB_MODE') === 'legacy') {
// Handles calls for BASIC persistence on sheet files.
GBLog.info(`Defining Config.xlsx variable ${name}= '${value}'...`);
let { baseUrl, client } = await GBDeployer.internalGetDriveClient(min);
const maxLines = 512;
const file = 'Config.xlsx';
const packagePath = GBUtil.getGBAIPath(min.botId, `gbot`);
let document = await new SystemKeywords().internalGetDocument(client, baseUrl, packagePath, file);
// Creates book session that will be discarded.
let sheets = await client.api(`${baseUrl}/drive/items/${document.id}/workbook/worksheets`).get();
// Get the current rows in column A
let results = await client
.api(`${baseUrl}/drive/items/${document.id}/workbook/worksheets('${sheets.value[0].name}')/range(address='A1:A${maxLines}')`)
.get();
const rows = results.values;
let address = '';
let lastEmptyRow = -1;
let isEdit = false;
// Loop through column A to find the row where name matches, or find the next empty row
for (let i = 7; i <= rows.length; i++) {
let result = rows[i - 1][0];
if (result && result.toLowerCase() === name.toLowerCase()) {
address = `B${i}:B${i}`; // Match found, update value in column B
isEdit = true; // We are in editing mode
break;
} else if (!result && lastEmptyRow === -1) {
lastEmptyRow = i; // Store the first empty row if no match is found
}
}
// If no match was found and there's an empty row, add a new entry
if (!isEdit && lastEmptyRow !== -1) {
address = `A${lastEmptyRow}:B${lastEmptyRow}`; // Add new entry in columns A and B
}
// Prepare the request body based on whether it's an edit or add operation
let body = { values: isEdit ? [[value]] : [[name, value]] };
// Update or add the new value in the found address
await client
.api(`${baseUrl}/drive/items/${document.id}/workbook/worksheets('${sheets.value[0].name}')/range(address='${address}')`)
.patch(body);
}
else if (GBConfigService.get('GB_MODE') === 'local') {
let packagePath = GBUtil.getGBAIPath(min.botId, `gbot`);
const config = path.join(GBConfigService.get('STORAGE_LIBRARY'), packagePath, 'config.csv');
const db = await csvdb(config, ['name', 'value'], ',');
if (await db.get({ name: name })) {
await db.edit({ name: name }, { name, value });
} else {
await db.add({ name, value });
}
}
}
/** /**
* Get a dynamic param from instance. Dynamic params are defined in Config.xlsx * Get a dynamic param from instance. Dynamic params are defined in Config.xlsx
* and loaded into the work folder from /publish command. * and loaded into the work folder from comida command.
* *
* @param name Name of param to get from instance. * @param name Name of param to get from instance.
* @param defaultValue Value returned when no param is defined in Config.xlsx. * @param defaultValue Value returned when no param is defined in Config.xlsx.
*/ */
public getParam<T>(instance: IGBInstance, name: string, defaultValue?: T): any { public getParam<T>(instance: IGBInstance, name: string, defaultValue?: T, platform = false): any {
let value = null; let value = null;
let params;
name = name.trim();
// Gets .gbot Params from specified bot.
if (instance.params) { if (instance.params) {
const params = JSON.parse(instance.params); params = typeof instance.params === 'object' ? instance.params : JSON.parse(instance.params);
params = GBUtil.caseInsensitive(params);
value = params ? params[name] : defaultValue; value = params ? params[name] : defaultValue;
} }
if (typeof defaultValue === 'boolean') {
return new Boolean(value ? value.toString().toLowerCase() === 'true' : defaultValue);
}
if (typeof defaultValue === 'string') {
return value ? value : defaultValue;
}
if (typeof defaultValue === 'number') {
return new Number(value ? value : defaultValue ? defaultValue : 0);
}
if (instance['dataValues'] && !value) { // Gets specified bot instance values.
params = GBUtil.caseInsensitive(instance['dataValues']);
if (params && !value) {
// Retrieves the value from specified bot instance (no params collection).
value = instance['dataValues'][name]; value = instance['dataValues'][name];
if (value === null) {
const minBoot = GBServer.globals.minBoot as any; // If still not found, get from boot bot params.
if (minBoot.instance && minBoot.instance.datavalues) {
value = minBoot.instance.datavalues[name]; const minBoot = GBServer.globals.minBoot as any;
if (minBoot.instance && !value && instance.botId != minBoot.instance.botId) {
instance = minBoot.instance;
if (instance.params) {
params = typeof instance.params === 'object' ? instance.params : JSON.parse(instance.params);
params = GBUtil.caseInsensitive(params);
value = params ? params[name] : defaultValue;
}
// If still did not found in boot bot params, try instance fields.
if (!value) {
value = instance['dataValues'][name];
}
if (!value) {
value = instance[name];
} }
} }
} }
return value; if (value === undefined) {
value = null;
}
if (!value && platform) {
value = process.env[name.replace(/ /g, '_').toUpperCase()];
}
if (value && typeof defaultValue === 'boolean') {
return new Boolean(value ? value.toString().toLowerCase() === 'true' : defaultValue).valueOf();
}
if (value && typeof defaultValue === 'string') {
return value ? value : defaultValue;
}
if (value && typeof defaultValue === 'number') {
return new Number(value ? value : defaultValue ? defaultValue : 0).valueOf();
}
if (typeof value === 'string') {
return value.trim();
}
const ret = value ?? defaultValue;
return ret;
} }
/**
* Finds a dynamic param from instance. *
*/
public async findParam<T>(instance: IGBInstance, criteria: string) {
let params = null;
const list = [];
if (instance.params) {
params = typeof instance.params === 'object' ? instance.params : JSON.parse(instance.params);
}
Object.keys(params).forEach(e => {
if (e.toLowerCase().indexOf(criteria.toLowerCase()) !== -1) {
list.push(e);
}
});
return list;
}
public async ensureFolders(instances, deployer: GBDeployer) {
const storageMode = process.env.GB_MODE;
let libraryPath = GBConfigService.get('STORAGE_LIBRARY');
if (storageMode === 'gbcluster') {
const minioClient = new Client({
endPoint: process.env.DRIVE_SERVER,
port: parseInt(process.env.DRIVE_PORT),
useSSL: process.env.DRIVE_USE_SSL === 'true',
accessKey: process.env.DRIVE_ACCESSKEY,
secretKey: process.env.DRIVE_SECRET,
});
await this.syncBotStorage(instances, 'default', deployer, libraryPath);
const bucketStream = await minioClient.listBuckets();
for await (const bucket of bucketStream) {
if (bucket.name.endsWith('.gbai') && bucket.name.startsWith(process.env.DRIVE_ORG_PREFIX)) {
const botId = bucket.name.replace('.gbai', '').replace(process.env.DRIVE_ORG_PREFIX, '');
await this.syncBotStorage(instances, botId, deployer, libraryPath);
}
}
} else {
if (!(await GBUtil.exists(libraryPath))) {
mkdirp.sync(libraryPath);
}
await this.syncBotStorage(instances, 'default', deployer, libraryPath);
const files = await fs.readdir(libraryPath);
await CollectionUtil.asyncForEach(files, async (file) => {
if (file.trim().toLowerCase() !== 'default.gbai' && file.charAt(0) !== '_') {
let botId = file.replace(/\.gbai/, '');
await this.syncBotStorage(instances, botId, deployer, libraryPath);
}
});
}
}
private async syncBotStorage(instances: any, botId: any, deployer: GBDeployer, libraryPath: string) {
let instance = instances.find(p => p.botId.toLowerCase().trim() === botId.toLowerCase().trim());
if (process.env.GB_MODE === 'local') {
if (!instance) {
GBLog.info(`Importing package ${botId}.gbai...`);
// Creates a bot.
let mobile = null,
email = null;
instance = await deployer.deployBlankBot(botId, mobile, email);
instances.push(instance);
const gbaiPath = path.join(libraryPath, `${botId}.gbai`);
if (!(await GBUtil.exists(gbaiPath))) {
fs.mkdir(gbaiPath, { recursive: true });
}
}
}
return instance;
}
public static async createWebDavServer(minInstances: GBMinInstance[]) {
const userManager = new webdav.SimpleUserManager();
const privilegeManager = new webdav.SimplePathPrivilegeManager();
// Create the WebDAV server
const server = new webdav.WebDAVServer({
port: 1900,
httpAuthentication: new webdav.HTTPDigestAuthentication(userManager, 'Default realm'),
privilegeManager: privilegeManager
});
GBServer.globals.webDavServer = server;
minInstances.forEach(min => {
const user = min.core.getParam(min.instance, 'WebDav Username', GBConfigService.get('WEBDAV_USERNAME'));
const pass = min.core.getParam(min.instance, 'WebDav Password', GBConfigService.get('WEBDAV_PASSWORD'));
if (user && pass) {
const objUser = userManager.addUser(user, pass);
const virtualPath = '/' + min.botId;
let path1 = GBUtil.getGBAIPath(min.botId, null);
const gbaiRoot = path.join(GBConfigService.get('STORAGE_LIBRARY'), path1);
server.setFileSystem(virtualPath, new webdav.PhysicalFileSystem(gbaiRoot), successed => {
GBLogEx.info(min.instance.instanceId, `WebDav online for ${min.botId}...`);
});
privilegeManager.setRights(objUser, virtualPath, ['all']);
}
});
server.start(1900);
}
} }

File diff suppressed because it is too large Load diff

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -38,11 +36,12 @@
import { GBMinInstance, IGBCoreService, IGBInstance } from 'botlib'; import { GBMinInstance, IGBCoreService, IGBInstance } from 'botlib';
import { CreateOptions } from 'sequelize/types'; import { CreateOptions } from 'sequelize/types';
const fs = require('fs'); import fs from 'fs/promises';
const urlJoin = require('url-join'); import urlJoin from 'url-join';
import { GBServer } from '../../../src/app'; import { GBServer } from '../../../src/app.js';
import { GuaribasInstance } from '../models/GBModel'; import { GuaribasInstance } from '../models/GBModel.js';
import { GBConfigService } from './GBConfigService'; import { GBConfigService } from './GBConfigService.js';
import { GBUtil } from '../../../src/util.js';
/** /**
* Handles the importing of packages. * Handles the importing of packages.
@ -50,16 +49,28 @@ import { GBConfigService } from './GBConfigService';
export class GBImporter { export class GBImporter {
public core: IGBCoreService; public core: IGBCoreService;
constructor(core: IGBCoreService) { constructor (core: IGBCoreService) {
this.core = core; this.core = core;
} }
public async importIfNotExistsBotPackage(botId: string, public async importIfNotExistsBotPackage (
packageName: string, localPath: string, additionalInstance: IGBInstance = null) { botId: string,
const settingsJson = JSON.parse(fs.readFileSync(urlJoin(localPath, 'settings.json'), 'utf8')); packageName: string,
if (botId === undefined) { localPath: string,
botId = settingsJson.botId; additionalInstance: IGBInstance = null
) {
const file = urlJoin(localPath, 'settings.json');
let settingsJson = {botId: botId};
if (await GBUtil.exists(file)){
settingsJson = JSON.parse(await fs.readFile(file, 'utf8'));
if (botId === undefined) {
botId = settingsJson.botId;
}
} }
let instance: IGBInstance; let instance: IGBInstance;
if (botId === undefined) { if (botId === undefined) {
botId = GBConfigService.get('BOT_ID'); botId = GBConfigService.get('BOT_ID');
@ -67,7 +78,7 @@ export class GBImporter {
if (!instance) { if (!instance) {
instance = <IGBInstance>{}; instance = <IGBInstance>{};
instance.state = 'active'; instance.state = 'active';
instance.adminPass = GBConfigService.get('ADMIN_PASS'); instance.adminPass = await GBUtil.hashPassword( GBConfigService.get('ADMIN_PASS'));
instance.botId = GBConfigService.get('BOT_ID'); instance.botId = GBConfigService.get('BOT_ID');
instance.cloudSubscriptionId = GBConfigService.get('CLOUD_SUBSCRIPTIONID'); instance.cloudSubscriptionId = GBConfigService.get('CLOUD_SUBSCRIPTIONID');
instance.cloudLocation = GBConfigService.get('CLOUD_LOCATION'); instance.cloudLocation = GBConfigService.get('CLOUD_LOCATION');
@ -85,7 +96,7 @@ export class GBImporter {
instance = await this.core.loadInstanceByBotId(botId); instance = await this.core.loadInstanceByBotId(botId);
} }
if (instance != undefined && instance.botId === null) { if (instance != undefined && !instance.botId) {
console.log(`Null BotId after load instance with botId: ${botId}.`); console.log(`Null BotId after load instance with botId: ${botId}.`);
} else { } else {
instance = additionalInstance; instance = additionalInstance;
@ -94,23 +105,23 @@ export class GBImporter {
return await this.createOrUpdateInstanceInternal(instance, botId, localPath, settingsJson); return await this.createOrUpdateInstanceInternal(instance, botId, localPath, settingsJson);
} }
public async createBotInstance(botId: string) { public async createBotInstance (botId: string) {
const fullSettingsJson=<GuaribasInstance> { ...GBServer.globals.bootInstance }; const fullSettingsJson = <GuaribasInstance>{ };
fullSettingsJson['botId'] = botId; fullSettingsJson['botId'] = botId;
return await GuaribasInstance.create(fullSettingsJson); return await GuaribasInstance.create(fullSettingsJson);
} }
private async createOrUpdateInstanceInternal( private async createOrUpdateInstanceInternal (
instance: IGBInstance, instance: IGBInstance,
botId: string, botId: string,
localPath: string, localPath: string,
settingsJson: any settingsJson: any
) { ) {
const packageJson = JSON.parse(fs.readFileSync(urlJoin(localPath, 'package.json'), 'utf8'));
const servicesJson = JSON.parse(fs.readFileSync(urlJoin(localPath, 'services.json'), 'utf8')); const fullSettingsJson = { ...GBServer.globals.bootInstance, ...settingsJson,
description:"General Bot", title:botId
const fullSettingsJson = { ...GBServer.globals.bootInstance, ...packageJson, ...settingsJson, ...servicesJson }; };
if (botId !== undefined) { if (botId !== undefined) {
fullSettingsJson.botId = botId; fullSettingsJson.botId = botId;

View file

@ -0,0 +1,90 @@
/*****************************************************************************\
| ® |
| |
| |
| |
| |
| |
| General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. |
| |
| According to our dual licensing model, this program can be used either |
| under the terms of the GNU Affero General Public License, version 3, |
| or under a proprietary license. |
| |
| The texts of the GNU Affero General Public License with an additional |
| permission and of our proprietary license can be found at and |
| in the LICENSE file you have received along with this program. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY, without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. |
| |
| "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. |
| |
\*****************************************************************************/
/**
* @fileoverview General Bots server core.
*/
'use strict';
import { GBLog, IGBInstance } from 'botlib';
import { GuaribasLog } from '../models/GBModel.js';
import { GBServer } from '../../../src/app.js';
import { GBConfigService } from './GBConfigService.js';
export class GBLogEx {
private static async logWithLevel(
level: 'error' | 'debug' | 'info' | 'verbose',
minOrInstanceId: any,
message: string
) {
const instanceId = this.normalizeInstanceId(minOrInstanceId);
GBLog[level](`${instanceId}: ${message}`);
await this.log(instanceId, level.charAt(0), message);
}
private static normalizeInstanceId(minOrInstanceId: any): string | number {
if (typeof minOrInstanceId === 'object') {
return minOrInstanceId.instance ? minOrInstanceId.instance.botId : minOrInstanceId.botId;
}
return minOrInstanceId === 0 ? 'default' : minOrInstanceId;
}
public static async error(minOrInstanceId: any, message: string) {
await this.logWithLevel('error', minOrInstanceId, message);
}
public static async debug(minOrInstanceId: any, message: string) {
await this.logWithLevel('debug', minOrInstanceId, message);
}
public static async info(minOrInstanceId: any, message: string) {
await this.logWithLevel('info', minOrInstanceId, message);
}
public static async verbose(minOrInstanceId: any, message: string) {
await this.logWithLevel('verbose', minOrInstanceId, message);
}
/**
* Finds and update user agent information to a next available person.
*/
public static async log(instance, kind: string, message: string): Promise<GuaribasLog> {
if (GBConfigService.get('LOG_ON_STORAGE')) {
message = message ? message.substring(0, 1023) : null;
return await GuaribasLog.create(<GuaribasLog>{
instanceId: instance ? instance : 0,
message: message,
kind: kind
});
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,13 +1,11 @@
/*****************************************************************************\ /*****************************************************************************\
| ( )_ _ | | ® |
| _ _ _ __ _ _ __ ___ ___ _ _ | ,_)(_) ___ ___ _ | | |
| ( '_`\ ( '__)/'_` ) /'_ `\/' _ ` _ `\ /'_` )| | | |/',__)/' v `\ /'_`\ | | |
| | (_) )| | ( (_| |( (_) || ( ) ( ) |( (_| || |_ | |\__, \| (˅) |( (_) ) | | |
| | ,__/'(_) `\__,_)`\__ |(_) (_) (_)`\__,_)`\__)(_)(____/(_) (_)`\___/' | | |
| | | ( )_) | |
| (_) \___/' |
| | | |
| General Bots Copyright (c) Pragmatismo.io. All rights reserved. | | General Bots Copyright (c) pragmatismo.com.br. All rights reserved. |
| Licensed under the AGPL-3.0. | | Licensed under the AGPL-3.0. |
| | | |
| According to our dual licensing model, this program can be used either | | According to our dual licensing model, this program can be used either |
@ -23,7 +21,7 @@
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. | | GNU Affero General Public License for more details. |
| | | |
| "General Bots" is a registered trademark of Pragmatismo.io. | | "General Bots" is a registered trademark of pragmatismo.com.br. |
| The licensing of the program under the AGPLv3 does not imply a | | The licensing of the program under the AGPLv3 does not imply a |
| trademark license. Therefore any rights, title and interest in | | trademark license. Therefore any rights, title and interest in |
| our trademarks remain entirely with us. | | our trademarks remain entirely with us. |
@ -31,294 +29,343 @@
\*****************************************************************************/ \*****************************************************************************/
/** /**
* @fileoverview General Bots SSR support based on https://www.npmjs.com/package/ssr-for-bots. * @fileoverview General Bots SSR support based on https://www.npmjs.com/package/ssr-for-bots.
*/ */
'use strict'; 'use strict';
const Path = require('path'); import { createRequire } from 'module';
const urlJoin = require('url-join'); const require = createRequire(import.meta.url);
const Fs = require('fs');
const express = require('express');
const child_process = require('child_process');
const rimraf = require('rimraf');
const request = require('request-promise-native');
import { GBError, GBLog, GBMinInstance, IGBCoreService, IGBDeployer, IGBInstance, IGBPackage } from 'botlib';
import { CollectionUtil } from 'pragmatismo-io-framework';
const puppeteer = require('puppeteer');
import { NextFunction, Request, Response } from "express";
import path from 'path';
import fs from 'fs/promises';
import { NextFunction, Request, Response } from 'express';
import urljoin from 'url-join';
import { GBMinInstance } from 'botlib';
import { GBServer } from '../../../src/app.js';
import { GBLogEx } from './GBLogEx.js';
import urlJoin from 'url-join';
import { GBDeployer } from './GBDeployer.js';
import { GBMinService } from './GBMinService.js';
import { DialogKeywords } from '../../basic.gblib/services/DialogKeywords.js';
import { GBUtil } from '../../../src/util.js';
const puppeteer = require('puppeteer-extra');
const hidden = require('puppeteer-extra-plugin-stealth');
const { executablePath } = require('puppeteer');
// https://hackernoon.com/tips-and-tricks-for-web-scraping-with-puppeteer-ed391a63d952 export class GBSSR {
// Dont download all resources, we just need the HTML // https://hackernoon.com/tips-and-tricks-for-web-scraping-with-puppeteer-ed391a63d952
// Also, this is huge performance/response time boost // Dont download all resources, we just need the HTML
const blockedResourceTypes = [ // Also, this is huge performance/response time boost
"image", private static blockedResourceTypes = [
"media", 'image',
"font", 'media',
"texttrack", 'font',
"object", 'texttrack',
"beacon", 'object',
"csp_report", 'beacon',
"imageset", 'csp_report',
]; 'imageset'
// const whitelist = ["document", "script", "xhr", "fetch"]; ];
const skippedResources = [
"quantserve",
"adzerk",
"doubleclick",
"adition",
"exelator",
"sharethrough",
"cdn.api.twitter",
"google-analytics",
"googletagmanager",
"google",
"fontawesome",
"facebook",
"analytics",
"optimizely",
"clicktale",
"mixpanel",
"zedo",
"clicksor",
"tiqcdn",
];
const RENDER_CACHE = new Map(); // const whitelist = ["document", "script", "xhr", "fetch"];
private static skippedResources = [
'quantserve',
'adzerk',
'doubleclick',
'adition',
'exelator',
'sharethrough',
'cdn.api.twitter',
'google-analytics',
'googletagmanager',
'google',
'fontawesome',
'facebook',
'analytics',
'optimizely',
'clicktale',
'mixpanel',
'zedo',
'clicksor',
'tiqcdn'
];
async function recursiveFindInFrames(inputFrame, selector) { public static async preparePuppeteer(profilePath) {
const frames = inputFrame.childFrames(); let args = [
const results = await Promise.all( '--check-for-update-interval=2592000',
frames.map(async frame => { '--disable-accelerated-2d-canvas',
const el = await frame.$(selector); '--disable-dev-shm-usage',
if (el) return el; '--disable-features=site-per-process',
if (frame.childFrames().length > 0) { '--disable-gpu',
return await recursiveFindInFrames(frame, selector); '--no-first-run',
} '--no-sandbox',
return null; '--no-default-browser-check'
}) ];
);
return results.find(Boolean);
}
async function findInFrames(page, selector) { if (profilePath) {
const result = await recursiveFindInFrames(page.mainFrame(), selector); args.push(`--user-data-dir=${profilePath}`);
if (!result) {
throw new Error( const preferences = urljoin(profilePath, 'Default', 'Preferences');
`The selector \`${selector}\` could not be found in any child frames.` if (await GBUtil.exists(preferences)) {
); const file = await fs.readFile(preferences, 'utf8');
const data = JSON.parse(file);
data['profile']['exit_type'] = 'none';
await fs.writeFile(preferences, JSON.stringify(data));
}
} }
return result;
} return {
args: args,
ignoreHTTPSErrors: true,
headless: process.env.CHROME_HEADLESS === 'true',
defaultViewport: null,
executablePath: process.env.CHROME_PATH ? process.env.CHROME_PATH : executablePath(),
ignoreDefaultArgs: ['--enable-automation', '--enable-blink-features=IdleDetection']
};
}
public static async createBrowser(profilePath): Promise<any> {
const opts = await this.preparePuppeteer(profilePath);
puppeteer.use(hidden());
puppeteer.use(require("puppeteer-extra-plugin-minmax")());
const browser = await puppeteer.launch(opts);
return browser;
}
/** /**
* https://developers.google.com/web/tools/puppeteer/articles/ssr#reuseinstance * Return the HTML of bot default.gbui.
* @param {string} url URL to prerender. */
*/ public static async getHTML(min: GBMinInstance) {
async function ssr(url: string, useCache: boolean, cacheRefreshRate: number) { const url = urljoin(GBServer.globals.publicAddress, min.botId);
if (RENDER_CACHE.has(url) && useCache) { const browser = await GBSSR.createBrowser(null);
const cached = RENDER_CACHE.get(url);
if (
Date.now() - cached.renderedAt > cacheRefreshRate &&
!(cacheRefreshRate <= 0)
) {
RENDER_CACHE.delete(url);
} else {
return {
html: cached.html,
status: 200,
};
}
}
const browser = await puppeteer.launch({
headless: false,
args: ["--single-process", "--no-zygote", "--no-sandbox", "--disable-features=site-per-process"]
});
// browserWSEndpoint = await browserT.wsEndpoint();
// const browser = await puppeteer.connect({ browserWSEndpoint });
const stylesheetContents = {}; const stylesheetContents = {};
let html;
try { try {
const page = await browser.newPage(); const page = await browser.newPage();
await page.setUserAgent( await page.minimize();
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
);
await page.setRequestInterception(true);
page.on("request", (request) => {
const requestUrl = request.url().split("?")[0].split("#")[0];
if (
blockedResourceTypes.indexOf(request.resourceType()) !== -1 ||
skippedResources.some((resource) => requestUrl.indexOf(resource) !== -1)
) {
request.abort();
} else {
request.continue();
}
});
page.on("response", async (resp) => { await page.setUserAgent(
const responseUrl = resp.url(); 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'
const sameOrigin = new URL(responseUrl).origin === new URL(url).origin; );
const isStylesheet = resp.request().resourceType() === "stylesheet"; await page.setRequestInterception(true);
if (sameOrigin && isStylesheet) { page.on('request', request => {
stylesheetContents[responseUrl] = await resp.text(); const requestUrl = request.url().split('?')[0].split('#')[0];
} if (
}); GBSSR.blockedResourceTypes.indexOf(request.resourceType()) !== -1 ||
GBSSR.skippedResources.some(resource => requestUrl.indexOf(resource) !== -1)
const response = await page.goto(url, { ) {
timeout: 120000, request.abort();
waitUntil: "networkidle0", } else {
}); request.continue();
const sleep = ms => {
return new Promise(resolve => {
setTimeout(resolve, ms);
});
};
await sleep(45000);
// Inject <base> on page to relative resources load properly.
await page.evaluate((url) => {
const base = document.createElement("base");
base.href = url;
// Add to top of head, before all other resources.
document.head.prepend(base);
}, url);
// Remove scripts and html imports. They've already executed.
await page.evaluate(() => {
const elements = document.querySelectorAll('script, link[rel="import"]');
elements.forEach((e) => {
e.remove();
});
});
// Replace stylesheets in the page with their equivalent <style>.
await page.$$eval(
'link[rel="stylesheet"]',
(links, content) => {
links.forEach((link: any) => {
const cssText = content[link.href];
if (cssText) {
const style = document.createElement("style");
style.textContent = cssText;
link.replaceWith(style);
}
});
},
stylesheetContents
);
const html = await page.content();
// Close the page we opened here (not the browser).
await page.close();
if (useCache) {
RENDER_CACHE.set(url, { html, renderedAt: Date.now() });
} }
return { html, status: response!.status() }; });
} catch (e) {
const html = e.toString();
console.warn({ message: `URL: ${url} Failed with message: ${html}` });
return { html, status: 500 };
} finally {
await browser.close();
}
}
function clearCache() { page.on('response', async resp => {
RENDER_CACHE.clear(); const responseUrl = resp.url();
} const sameOrigin = new URL(responseUrl).origin === new URL(url).origin;
const isStylesheet = resp.request().resourceType() === 'stylesheet';
if (sameOrigin && isStylesheet) {
stylesheetContents[responseUrl] = await resp.text();
}
});
interface Options { await page.setExtraHTTPHeaders({
prerender?: Array<string>; 'ngrok-skip-browser-warning': '1'
exclude?: Array<string>; });
useCache?: boolean; const response = await page.goto(url, {
cacheRefreshRate?: number; timeout: 120000,
} waitUntil: 'networkidle0'
});
function ssrForBots( await GBUtil.sleep(6000);
options: Options = {
prerender: [], // Array containing the user-agents that will trigger the ssr service // Inject <base> on page to relative resources load properly.
exclude: [], // Array containing paths and/or extentions that will be excluded from being prerendered by the ssr service
useCache: true, // Variable that determins if we will use page caching or not await page.evaluate(url => {
cacheRefreshRate: 86400 // Seconds of which the cache will be kept alive, pass 0 or negative value for infinite lifespan const base = document.createElement('base');
} base.href = url;
) { // Add to top of head, before all other resources.
let applyOptions = Object.assign( document.head.prepend(base);
{ }, url);
prerender: [], // Array containing the user-agents that will trigger the ssr service
exclude: [], // Array containing paths and/or extentions that will be excluded from being prerendered by the ssr service // Remove scripts and html imports. They've already executed.
useCache: true, // Variable that determins if we will use page caching or not
cacheRefreshRate: 86400 // Seconds of which the cache will be kept alive, pass 0 or negative value for infinite lifespan await page.evaluate(() => {
const elements = document.querySelectorAll('script, link[rel="import"]');
elements.forEach(e => {
e.remove();
});
});
// Replace stylesheets in the page with their equivalent <style>.
await page.$$eval(
'link[rel="stylesheet"]',
(links, content) => {
links.forEach((link: any) => {
const cssText = content[link.href];
if (cssText) {
const style = document.createElement('style');
style.textContent = cssText;
link.replaceWith(style);
}
});
}, },
options stylesheetContents
); );
html = await page.content();
// Close the page we opened here (not the browser).
await page.close();
} catch (e) {
const html = e.toString();
GBLogEx.error(min, `URL: ${url} Failed with message: ${html}`);
} finally {
await browser.close();
}
return html;
}
public static async ssrFilter(req: Request, res: Response, next) {
let applyOptions = {
prerender: [], // Array containing the user-agents that will trigger the ssr service
exclude: [], // Array containing paths and/or extentions that will be excluded from being prerendered by the ssr service
useCache: true, // Variable that determins if we will use page caching or not
cacheRefreshRate: 86400 // Seconds of which the cache will be kept alive, pass 0 or negative value for infinite lifespan
};
// Default user agents // Default user agents
const prerenderArray = [ const prerenderArray = [
"bot", 'bot',
"googlebot", 'googlebot',
"Chrome-Lighthouse", 'Chrome-Lighthouse',
"DuckDuckBot", 'DuckDuckBot',
"ia_archiver", 'ia_archiver',
"bingbot", 'bingbot',
"yandex", 'yandex',
"baiduspider", 'baiduspider',
"Facebot", 'Facebot',
"facebookexternalhit", 'facebookexternalhit',
"facebookexternalhit/1.1", 'facebookexternalhit/1.1',
"twitterbot", 'twitterbot',
"rogerbot", 'rogerbot',
"linkedinbot", 'linkedinbot',
"embedly", 'embedly',
"quora link preview", 'quora link preview',
"showyoubot", 'showyoubot',
"outbrain", 'outbrain',
"pinterest", 'pinterest',
"slackbot", 'slackbot',
"vkShare", 'vkShare',
"W3C_Validator", 'W3C_Validator'
]; ];
// default exclude array // default exclude array
const excludeArray = [".xml", ".ico", ".txt", ".json"]; const excludeArray = ['.xml', '.ico', '.txt', '.json'];
const userAgent: string = req.headers['user-agent'] || '';
const prerender = new RegExp([...prerenderArray, ...applyOptions.prerender].join('|').slice(0, -1), 'i').test(
userAgent
);
const exclude = !new RegExp([...excludeArray, ...applyOptions.exclude].join('|').slice(0, -1)).test(
req.originalUrl
);
function ssrOnDemand(req: Request, res: Response, next: NextFunction) { // Tries to find botId from URL.
Promise.resolve(() => {
return true;
})
.then(async () => {
const userAgent: string = req.headers["user-agent"] || "";
const prerender = new RegExp( const minBoot = GBServer.globals.minBoot;
[...prerenderArray, ...applyOptions.prerender].join("|").slice(0, -1),
"i"
).test(userAgent);
const exclude = !new RegExp( let onlyChars: any = /\/([A-Za-z0-9\-\_]+)\/*/.exec(req.originalUrl);
[...excludeArray, ...applyOptions.exclude].join("|").slice(0, -1) onlyChars = onlyChars ? onlyChars[1] : minBoot.botId;
).test(req.originalUrl);
if (req.originalUrl && prerender && exclude) { let botId =
const { html, status } = await ssr( req.originalUrl && req.originalUrl === '/' ?
req.protocol + "://" + req.get("host") + req.originalUrl, minBoot.botId :
applyOptions.useCache, onlyChars;
applyOptions.cacheRefreshRate
);
return res.status(status).send(html); let min: GBMinInstance =
} else { req.url === '/'
return next(); ? minBoot
} : GBServer.globals.minInstances.filter(p => p.instance.botId.toLowerCase() === botId.toLowerCase())[0];
}) if (!min) {
.catch(next); min = req.url === '/'
? minBoot
: GBServer.globals.minInstances.filter(p =>
p.instance.activationCode ? p.instance.activationCode.toLowerCase() === botId.toLowerCase()
: null)[0];
}
if (!min) {
botId = minBoot.botId;
} }
return ssrOnDemand;
let packagePath = GBUtil.getGBAIPath(botId, `gbui`);
// Checks if the bot has an .gbui published or use default.gbui.
if (!await GBUtil.exists(packagePath)) {
packagePath = path.join(process.env.PWD, 'packages', `default.gbui`, 'build');
}
let parts = req.url.replace(`/${botId}`, '').split('?');
let url = parts[0];
if (min && req.originalUrl && prerender && exclude && await GBUtil.exists(packagePath)) {
// Reads from static HTML when a bot is crawling.
packagePath = path.join(process.env.PWD, 'work', packagePath, 'index.html');
const html = await fs.readFile(packagePath, 'utf8');
res.status(200).send(html);
return true;
} else {
// Servers default.gbui web application.
packagePath = path.join(
process.env.PWD,
GBDeployer.deployFolder,
GBMinService.uiPackage,
'build',
url === '/' || url === '' ? `index.html` : url
);
if (GBServer.globals.wwwroot && url === '/') {
packagePath = GBServer.globals.wwwroot + "/index.html"; // TODO.
}
if (!min && !url.startsWith("/images") && GBServer.globals.wwwroot) {
packagePath = path.join(GBServer.globals.wwwroot, url);
}
if (!min && !url.startsWith("/static") && GBServer.globals.wwwroot) {
packagePath = path.join(GBServer.globals.wwwroot, url);
}
if (await GBUtil.exists(packagePath)) {
if (min) {
let html = await fs.readFile(packagePath, 'utf8');
html = html.replace(/\{p\}/gi, min.botId);
html = html.replace(/\{botId\}/gi, min.botId);
const theme =
`theme-${await (min.core as any)['getParam'](min.instance, 'Theme Color', 'grey')}`;
html = html.replace(/\{themeColor\}/gi, theme);
html = html.replace(/\{theme\}/gi, min.instance.theme ? min.instance.theme :
'default.gbtheme');
html = html.replace(/\{title\}/gi, min.instance.title);
res.send(html).end();
} else {
res.sendFile(packagePath);
}
return true;
} else {
GBLogEx.verbose(min, `HTTP 404: ${req.url}.`);
res.status(404);
res.end();
}
}
}
} }
export { ssr, clearCache, ssrForBots };

View file

@ -0,0 +1,479 @@
import fs from 'fs/promises';
import formidable from 'formidable';
import path from 'path';
import bodyParser from 'body-parser';
import express from 'express';
import fetch from 'isomorphic-fetch';
import moment from 'moment';
import * as uuidv4 from 'uuid';
import { IActivity, IBotData, IConversation, IConversationUpdateActivity, IMessageActivity } from './types';
import { GBConfigService } from '../GBConfigService.js';
import { GBUtil } from '../../../../src/util.js';
import urlJoin from 'url-join';
import { GBServer } from '../../../../src/app.js';
const expiresIn = 1800;
const conversationsCleanupInterval = 10000;
const conversations: { [key: string]: IConversation } = {};
const botDataStore: { [key: string]: IBotData } = {};
export const getRouter = (
serviceUrl: string,
botUrl: string,
conversationInitRequired = true,
botId
): express.Router => {
const router = express.Router();
router.use(bodyParser.json()); // for parsing application/json
router.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
router.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE, PATCH, OPTIONS');
res.header(
'Access-Control-Allow-Headers',
'Origin, X-Requested-With, Content-Type, Accept, Authorization, x-ms-bot-agent'
);
next();
});
// CLIENT ENDPOINT
router.options(`/directline/${botId}/`, (req, res) => {
res.status(200).end();
});
// Creates a conversation
const reqs = (req, res) => {
const conversationId: string = uuidv4.v4().toString();
conversations[conversationId] = {
conversationId,
history: []
};
console.log('Created conversation with conversationId: ' + conversationId);
let userId = req.query?.userSystemId ? req.query?.userSystemId : req.body?.user?.id;
userId = userId ? userId : req.query.userId;
const activity = createConversationUpdateActivity(serviceUrl, conversationId, userId);
fetch(botUrl, {
method: 'POST',
body: JSON.stringify(activity),
headers: {
'Content-Type': 'application/json'
}
}).then(response => {
res.status(response.status).send({
conversationId,
expiresIn
});
});
};
router.post('/v3/directline/conversations/', reqs);
router.post(`/api/messages/${botId}/v3/directline/conversations/`, reqs);
router.post(`/directline/${botId}/conversations/`, reqs);
router.post(`/directline/conversations/`, reqs);
// Reconnect API
const req3 = (req, res) => {
const conversation = getConversation(req.params.conversationId, conversationInitRequired);
if (conversation) {
res.status(200).send(conversation);
} else {
// Conversation was never initialized
res.status(400).send();
}
console.warn('/v3/directline/conversations/:conversationId not implemented');
};
router.get('/v3/directline/conversations/:conversationId', req3);
router.get(`/directline/${botId}/conversations/:conversationId`, req3);
// Gets activities from store (local history array for now)
const req45 = (req, res) => {
const watermark = req.query.watermark && req.query.watermark !== 'null' ? Number(req.query.watermark) : 0;
const conversation = getConversation(req.params.conversationId, conversationInitRequired);
if (conversation) {
// If the bot has pushed anything into the history array
if (conversation.history.length > watermark) {
const activities = conversation.history.slice(watermark);
res.status(200).json({
activities,
watermark: watermark + activities.length
});
} else {
res.status(200).send({
activities: [],
watermark
});
}
} else {
// Conversation was never initialized
res.status(400).send();
}
};
const req34 = (req, res) => {
const watermark = req.query.watermark && req.query.watermark !== 'null' ? Number(req.query.watermark) : 0;
const conversation = getConversation(req.params.conversationId, conversationInitRequired);
if (conversation) {
// If the bot has pushed anything into the history array
if (conversation.history.length > watermark) {
const activities = conversation.history.slice(watermark);
res.status(200).json({
activities,
watermark: watermark + activities.length
});
} else {
res.status(200).send({
activities: [],
watermark
});
}
} else {
// Conversation was never initialized
res.status(400).send();
}
};
router.get(`/directline/${botId}/conversations/:conversationId/activities`, req34);
router.get(`/api/messages/${botId}/v3/directline/conversations/:conversationId/activities`, req34);
// Sends message to bot. Assumes message activities
const res2 = (req, res) => {
const incomingActivity = req.body;
// Make copy of activity. Add required fields
const activity = createMessageActivity(incomingActivity, serviceUrl, req.params.conversationId, req.params['pid']);
const conversation = getConversation(req.params.conversationId, conversationInitRequired);
if (conversation) {
conversation.history.push(activity);
fetch(botUrl, {
method: 'POST',
body: JSON.stringify(activity),
headers: {
'Content-Type': 'application/json'
}
}).then(response => {
res.status(response.status).json({ id: activity.id });
});
} else {
// Conversation was never initialized
res.status(400).send();
}
};
// import { createMessageActivity, getConversation } from './yourModule'; // Update this import as needed
const resupload = async (req, res) => {
// Extract botId from the URL using the pathname
const urlParts = req.url.split('/');
const botId = urlParts[2]; // Assuming the URL is structured like /directline/{botId}/conversations/:conversationId/upload
const conversationId = req.params.conversationId; // Extract conversationId from parameters
const uploadDir = path.join(process.cwd(), 'work', `${botId}.gbai`, 'cache'); // Create upload directory path
// Create the uploads directory if it doesn't exist
await fs.mkdir(uploadDir, { recursive: true });
const form = formidable({
uploadDir, // Use the constructed upload directory
keepExtensions: true, // Keep file extensions
});
form.parse(req, async (err, fields, files) => {
if (err) {
console.log(`Error parsing the file: ${GBUtil.toYAML(err)}.`);
return res.status(400).send('Error parsing the file.');
}
const incomingActivity = fields; // Get incoming activity data
const file = files.file[0]; // Access the uploaded file
const fileName = file['newFilename'];
const fileUrl = urlJoin(GBServer.globals.publicAddress, `${botId}.gbai`,'cache', fileName);
// Create the activity message
let userId = req.query?.userSystemId ? req.query?.userSystemId : req.body?.user?.id;
userId = userId ? userId : req.query?.userId;
const activity = createMessageActivity(incomingActivity, serviceUrl, conversationId, req.params['pid']);
activity.from = { id: userId, name: 'webbot' };
activity.attachments = [{
contentType: 'application/octet-stream', // Adjust as necessary
contentUrl: fileUrl,
name: fileName, // Original filename
}];
const conversation = getConversation(conversationId, conversationInitRequired);
if (conversation) {
// Add the uploaded file info to the activity
activity['fileUrl'] = fileUrl; // Set the file URL
conversation.history.push(activity);
try {
const response = await fetch(botUrl, {
method: 'POST',
body: JSON.stringify(activity),
headers: {
'Content-Type': 'application/json'
}
});
res.status(response.status).json({ id: activity.id });
} catch (fetchError) {
console.error('Error fetching bot:', fetchError);
res.status(500).send('Error processing request.');
}
} else {
// Conversation was never initialized
res.status(400).send('Conversation not initialized.');
}
});
};
router.post(`/api/messages/${botId}/v3/directline/conversations/:conversationId/activities`, res2);
router.post(`/directline/${botId}/conversations/:conversationId/activities`, res2);
router.post(`/directline/${botId}/conversations/:conversationId/upload`, resupload);
router.post('/v3/directline/conversations/:conversationId/upload', (req, res) => {
console.warn('/v3/directline/conversations/:conversationId/upload not implemented');
});
router.get('/v3/directline/conversations/:conversationId/stream', (req, res) => {
console.warn('/v3/directline/conversations/:conversationId/stream not implemented');
});
// BOT CONVERSATION ENDPOINT
router.post('/v3/conversations', (req, res) => {
console.warn('/v3/conversations not implemented');
});
// TODO: Check duplicate. router.post(`/api/messages/${botId}/v3/directline/conversations/:conversationId/activities`, (req, res) => {
// let activity: IActivity;
// activity = req.body;
// const conversation = getConversation(req.params.conversationId, conversationInitRequired);
// if (conversation) {
// conversation.history.push(activity);
// res.status(200).send();
// } else {
// // Conversation was never initialized
// res.status(400).send();
// }
// });
router.post(`/v3/conversations/:conversationId/activities/:activityId`, (req, res) => {
let activity: IActivity;
activity = req.body;
activity.id = uuidv4.v4();
activity.from = { id: 'id', name: 'Bot' };
const conversation = getConversation(req.params.conversationId, conversationInitRequired);
if (conversation) {
conversation.history.push(activity);
res.status(200).send();
} else {
// Conversation was never initialized
res.status(400).send();
}
});
router.get('/v3/conversations/:conversationId/members', (req, res) => {
console.warn('/v3/conversations/:conversationId/members not implemented');
});
router.get('/v3/conversations/:conversationId/activities/:activityId/members', (req, res) => {
console.warn('/v3/conversations/:conversationId/activities/:activityId/members');
});
// BOTSTATE ENDPOINT
router.get('/v3/botstate/:channelId/users/:userId', (req, res) => {
console.log('Called GET user data');
getBotData(req, res);
});
router.get('/v3/botstate/:channelId/conversations/:conversationId', (req, res) => {
console.log('Called GET conversation data');
getBotData(req, res);
});
router.get('/v3/botstate/:channelId/conversations/:conversationId/users/:userId', (req, res) => {
console.log('Called GET private conversation data');
getBotData(req, res);
});
router.post('/v3/botstate/:channelId/users/:userId', (req, res) => {
console.log('Called POST setUserData');
setUserData(req, res);
});
router.post('/v3/botstate/:channelId/conversations/:conversationId', (req, res) => {
console.log('Called POST setConversationData');
setConversationData(req, res);
});
router.post('/v3/botstate/:channelId/conversations/:conversationId/users/:userId', (req, res) => {
setPrivateConversationData(req, res);
});
router.delete('/v3/botstate/:channelId/users/:userId', (req, res) => {
console.log('Called DELETE deleteStateForUser');
deleteStateForUser(req, res);
});
return router;
};
/**
* @param app The express app where your offline-directline endpoint will live
* @param port The port where your offline-directline will be hosted
* @param botUrl The url of the bot (e.g. http://127.0.0.1:3978/api/messages)
* @param conversationInitRequired Requires that a conversation is initialized before it is accessed, returning a 400
* when not the case. If set to false, a new conversation reference is created on the fly. This is true by default.
*/
export const initializeRoutes = (
app: express.Express,
port: number,
botUrl: string,
conversationInitRequired = true,
botId
) => {
conversationsCleanup();
const directLineEndpoint = `http://127.0.0.1:${port}`;
const router = getRouter(directLineEndpoint, botUrl, conversationInitRequired, botId);
app.use(router);
};
const getConversation = (conversationId: string, conversationInitRequired: boolean) => {
// Create conversation on the fly when needed and init not required
if (!conversations[conversationId] && !conversationInitRequired) {
conversations[conversationId] = {
conversationId,
history: []
};
}
return conversations[conversationId];
};
const getBotDataKey = (channelId: string, conversationId: string, userId: string) => {
return `$${channelId || '*'}!${conversationId || '*'}!${userId || '*'}`;
};
const setBotData = (channelId: string, conversationId: string, userId: string, incomingData: IBotData): IBotData => {
const key = getBotDataKey(channelId, conversationId, userId);
const newData: IBotData = {
eTag: new Date().getTime().toString(),
data: incomingData.data
};
if (incomingData) {
botDataStore[key] = newData;
} else {
delete botDataStore[key];
newData.eTag = '*';
}
return newData;
};
const getBotData = (req: express.Request, res: express.Response) => {
const key = getBotDataKey(req.params.channelId, req.params.conversationId, req.params.userId);
console.log('Data key: ' + key);
res.status(200).send(botDataStore[key] || { data: null, eTag: '*' });
};
const setUserData = (req: express.Request, res: express.Response) => {
res.status(200).send(setBotData(req.params.channelId, req.params.conversationId, req.params.userId, req.body));
};
const setConversationData = (req: express.Request, res: express.Response) => {
res.status(200).send(setBotData(req.params.channelId, req.params.conversationId, req.params.userId, req.body));
};
const setPrivateConversationData = (req: express.Request, res: express.Response) => {
res.status(200).send(setBotData(req.params.channelId, req.params.conversationId, req.params.userId, req.body));
};
export const start = (server, botId) => {
const port = GBConfigService.getServerPort();
initializeRoutes(server, Number(port), `http://127.0.0.1:${port}/api/messages/${botId}`, null, botId);
if (botId === 'default') {
initializeRoutes(server, Number(port), `http://127.0.0.1:${port}/api/messages`, null, botId);
}
};
const deleteStateForUser = (req: express.Request, res: express.Response) => {
Object.keys(botDataStore).forEach(key => {
if (key.endsWith(`!{req.query.userId}`)) {
delete botDataStore[key];
}
});
res.status(200).send();
};
// CLIENT ENDPOINT HELPERS
const createMessageActivity = (
incomingActivity: IMessageActivity,
serviceUrl: string,
conversationId: string,
pid
): IMessageActivity => {
const obj = {
...incomingActivity,
channelId: 'api',
serviceUrl,
conversation: { id: conversationId },
id: uuidv4.v4()
};
return obj;
};
const createConversationUpdateActivity = (serviceUrl: string, conversationId: string, userId: any): IConversationUpdateActivity => {
const activity: IConversationUpdateActivity = {
type: 'conversationUpdate',
channelId: 'api',
serviceUrl,
conversation: { id: conversationId },
id: uuidv4.v4(),
membersAdded: [],
membersRemoved: [],
from: { id: userId, name: 'webbot' }
};
return activity;
};
const conversationsCleanup = () => {
setInterval(() => {
const expiresTime = moment().subtract(expiresIn, 'seconds');
Object.keys(conversations).forEach(conversationId => {
if (conversations[conversationId].history.length > 0) {
const lastTime = moment(
conversations[conversationId].history[conversations[conversationId].history.length - 1].localTimestamp
);
if (lastTime < expiresTime) {
delete conversations[conversationId];
console.log('deleted cId: ' + conversationId);
}
}
});
}, conversationsCleanupInterval);
};

Some files were not shown because too many files have changed in this diff Show more