@omnizap-system/omnizap 2.6.1 → 2.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +54 -9
- package/.github/workflows/ci.yml +3 -3
- package/.github/workflows/security-runner-hardening.yml +1 -1
- package/.github/workflows/security-zap-full-scan.yml +1 -0
- package/app/config/index.js +2 -0
- package/app/configParts/adminIdentity.js +5 -5
- package/app/configParts/baileysConfig.js +226 -55
- package/app/configParts/groupUtils.js +5 -0
- package/app/configParts/messagePersistenceService.js +143 -3
- package/app/configParts/sessionConfig.js +157 -0
- package/app/connection/baileysCompatibility.test.js +1 -1
- package/app/connection/groupOwnerWriteStateResolver.js +109 -0
- package/app/connection/socketController.js +625 -124
- package/app/connection/socketController.multiSession.test.js +108 -0
- package/app/controllers/messageController.js +1 -1
- package/app/controllers/messagePipeline/commandMiddleware.js +12 -10
- package/app/controllers/messagePipeline/conversationMiddleware.js +2 -1
- package/app/controllers/messagePipeline/messagePipelineMiddlewares.test.js +104 -0
- package/app/controllers/messagePipeline/preProcessingMiddlewares.js +80 -2
- package/app/controllers/messageProcessingPipeline.js +88 -9
- package/app/controllers/messageProcessingPipeline.test.js +200 -0
- package/app/modules/adminModule/AGENT.md +1 -1
- package/app/modules/adminModule/commandConfig.json +3318 -1347
- package/app/modules/adminModule/groupCommandHandlers.js +856 -14
- package/app/modules/adminModule/groupCommandHandlers.test.js +375 -9
- package/app/modules/adminModule/groupWarningRepository.js +152 -0
- package/app/modules/aiModule/AGENT.md +47 -30
- package/app/modules/aiModule/aiConfigRuntime.js +1 -0
- package/app/modules/aiModule/catCommand.js +132 -25
- package/app/modules/aiModule/commandConfig.json +114 -28
- package/app/modules/analyticsModule/messageAnalysisEventRepository.js +54 -6
- package/app/modules/gameModule/AGENT.md +1 -1
- package/app/modules/gameModule/commandConfig.json +29 -0
- package/app/modules/menuModule/AGENT.md +1 -1
- package/app/modules/menuModule/commandConfig.json +45 -10
- package/app/modules/menuModule/menuCatalogService.js +190 -0
- package/app/modules/menuModule/menuCommandUsageRepository.js +109 -0
- package/app/modules/menuModule/menuDynamicService.js +511 -0
- package/app/modules/menuModule/menuDynamicService.test.js +141 -0
- package/app/modules/menuModule/menus.js +36 -5
- package/app/modules/playModule/AGENT.md +10 -5
- package/app/modules/playModule/commandConfig.json +74 -16
- package/app/modules/playModule/playCommandConstants.js +13 -7
- package/app/modules/playModule/playCommandCore.js +4 -6
- package/app/modules/playModule/{playCommandYtDlpClient.js → playCommandMediaClient.js} +684 -332
- package/app/modules/playModule/playConfigRuntime.js +5 -6
- package/app/modules/playModule/playModuleCriticalFlows.test.js +44 -59
- package/app/modules/quoteModule/AGENT.md +1 -1
- package/app/modules/quoteModule/commandConfig.json +29 -0
- package/app/modules/rpgPokemonModule/AGENT.md +1 -1
- package/app/modules/rpgPokemonModule/commandConfig.json +29 -0
- package/app/modules/statsModule/AGENT.md +1 -1
- package/app/modules/statsModule/commandConfig.json +58 -0
- package/app/modules/stickerModule/AGENT.md +1 -1
- package/app/modules/stickerModule/commandConfig.json +145 -0
- package/app/modules/stickerPackModule/AGENT.md +1 -1
- package/app/modules/stickerPackModule/autoPackCollectorService.js +5 -1
- package/app/modules/stickerPackModule/commandConfig.json +29 -0
- package/app/modules/stickerPackModule/stickerAutoPackByTagsRuntime.js +1 -1
- package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +78 -57
- package/app/modules/stickerPackModule/stickerPackService.js +13 -6
- package/app/modules/systemMetricsModule/AGENT.md +1 -1
- package/app/modules/systemMetricsModule/commandConfig.json +29 -0
- package/app/modules/tiktokModule/AGENT.md +1 -1
- package/app/modules/tiktokModule/commandConfig.json +29 -0
- package/app/modules/userModule/AGENT.md +1 -1
- package/app/modules/userModule/commandConfig.json +29 -0
- package/app/modules/waifuPicsModule/AGENT.md +57 -27
- package/app/modules/waifuPicsModule/commandConfig.json +87 -0
- package/app/observability/metrics.js +136 -0
- package/app/services/ai/commandConfigEnrichmentService.js +229 -47
- package/app/services/ai/geminiService.js +131 -7
- package/app/services/ai/geminiService.test.js +59 -2
- package/app/services/ai/moduleAiHelpCoreService.js +33 -4
- package/app/services/group/groupMetadataService.js +24 -1
- package/app/services/infra/dbWriteQueue.js +51 -21
- package/app/services/messaging/newsBroadcastService.js +843 -27
- package/app/services/multiSession/assignmentBalancerService.js +457 -0
- package/app/services/multiSession/groupOwnershipRepository.js +381 -0
- package/app/services/multiSession/groupOwnershipService.js +890 -0
- package/app/services/multiSession/groupOwnershipService.test.js +309 -0
- package/app/services/multiSession/sessionRegistryService.js +293 -0
- package/app/store/aiPromptStore.js +36 -19
- package/app/store/groupConfigStore.js +41 -5
- package/app/store/premiumUserStore.js +21 -7
- package/app/utils/antiLink/antiLinkModule.js +352 -16
- package/app/workers/aiHelperContinuousLearningWorker.js +512 -0
- package/database/index.js +6 -0
- package/database/migrations/20260307_d0_hardening_down.sql +1 -1
- package/database/migrations/20260314_d7_canonical_sender_down.sql +1 -1
- package/database/migrations/20260406_d30_security_analytics_down.sql +1 -1
- package/database/migrations/20260411_d35_group_community_metadata_down.sql +59 -0
- package/database/migrations/20260411_d35_group_community_metadata_up.sql +62 -0
- package/database/migrations/20260412_d36_system_config_tables_down.sql +32 -0
- package/database/migrations/20260412_d36_system_config_tables_up.sql +66 -0
- package/database/migrations/20260413_d37_group_user_warnings_down.sql +11 -0
- package/database/migrations/20260413_d37_group_user_warnings_up.sql +24 -0
- package/database/migrations/20260414_d38_multi_session_foundation_down.sql +72 -0
- package/database/migrations/20260414_d38_multi_session_foundation_up.sql +125 -0
- package/database/migrations/20260414_d39_multi_session_cutover_down.sql +103 -0
- package/database/migrations/20260414_d39_multi_session_cutover_up.sql +83 -0
- package/database/schema.sql +102 -1
- package/docker-compose.yml +4 -1
- package/docs/compliance/acceptable-use-policy-2026-03-07.md +1 -1
- package/docs/compliance/privacy-policy-2026-03-07.md +2 -2
- package/docs/security/dsar-lgpd-runbook-2026-03-07.md +1 -1
- package/docs/security/network-hardening-runbook-2026-03-07.md +53 -0
- package/docs/security/omnizap-static-security-headers.conf +25 -0
- package/ecosystem.prod.config.cjs +31 -11
- package/index.js +52 -18
- package/observability/alert-rules.yml +20 -0
- package/observability/grafana/dashboards/omnizap-system-admin.json +229 -0
- package/observability/mysql-setup.sql +4 -4
- package/observability/system-admin-observability.md +26 -0
- package/package.json +12 -5
- package/public/comandos/commands-catalog.json +2253 -78
- package/public/js/apps/commandsReactApp.js +267 -87
- package/public/js/apps/createPackApp.js +3 -3
- package/public/js/apps/stickersApp.js +255 -103
- package/public/js/apps/termsReactApp.js +57 -8
- package/public/js/apps/userPasswordResetReactApp.js +406 -0
- package/public/js/apps/userReactApp.js +96 -47
- package/public/js/apps/userSystemAdmReactApp.js +1506 -0
- package/public/pages/politica-de-privacidade.html +1 -1
- package/public/pages/stickers.html +5 -5
- package/public/pages/termos-de-uso-texto-integral.html +1 -1
- package/public/pages/termos-de-uso.html +1 -1
- package/public/pages/user-password-reset.html +3 -4
- package/public/pages/user-systemadm.html +8 -462
- package/public/pages/user.html +1 -1
- package/scripts/clear-whatsapp-session.sh +123 -0
- package/scripts/core-ai-mode.mjs +163 -0
- package/scripts/deploy.sh +10 -0
- package/scripts/enrich-command-config-ux-openai.mjs +492 -0
- package/scripts/generate-commands-catalog.mjs +155 -0
- package/scripts/new-whatsapp-session.sh +317 -0
- package/scripts/security-web-surface-check.mjs +218 -0
- package/server/controllers/admin/adminPanelHandlers.js +253 -3
- package/server/controllers/admin/systemAdminController.js +267 -0
- package/server/controllers/sticker/stickerCatalogController.js +9 -23
- package/server/controllers/system/contactController.js +9 -17
- package/server/controllers/system/stickerCatalogSystemContext.js +27 -6
- package/server/controllers/system/systemController.js +254 -1
- package/server/controllers/userController.js +6 -0
- package/server/email/emailTemplateService.js +3 -2
- package/server/http/httpServer.js +8 -4
- package/server/middleware/securityHeaders.js +20 -1
- package/server/routes/admin/systemAdminRouter.js +6 -0
- package/server/routes/indexRouter.js +30 -6
- package/server/routes/observability/grafanaProxyRouter.js +254 -0
- package/server/routes/static/staticPageRouter.js +27 -1
- package/server/utils/publicContact.js +31 -0
- package/utils/whatsapp/contactEnv.js +39 -0
- package/vite.config.mjs +2 -1
- package/app/modules/playModule/local/installYtDlp.js +0 -25
- package/app/modules/playModule/local/ytDlpInstaller.js +0 -28
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
5
|
+
ENV_FILE="${ENV_FILE:-$PROJECT_ROOT/.env}"
|
|
6
|
+
SESSION_ID_OVERRIDE=""
|
|
7
|
+
CLEAR_AUTH_FILES=0
|
|
8
|
+
|
|
9
|
+
log() {
|
|
10
|
+
printf '[clear-whatsapp-session] %s\n' "$*"
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
fail() {
|
|
14
|
+
printf '[clear-whatsapp-session] erro: %s\n' "$*" >&2
|
|
15
|
+
exit 1
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
require_cmd() {
|
|
19
|
+
if ! command -v "$1" >/dev/null 2>&1; then
|
|
20
|
+
fail "comando ausente: $1"
|
|
21
|
+
fi
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
resolve_db_name() {
|
|
25
|
+
local base_name="$1"
|
|
26
|
+
local node_env="${2:-development}"
|
|
27
|
+
|
|
28
|
+
if [[ "$base_name" == *_dev || "$base_name" == *_prod ]]; then
|
|
29
|
+
printf '%s' "$base_name"
|
|
30
|
+
return 0
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
if [[ "$node_env" == "production" ]]; then
|
|
34
|
+
printf '%s_prod' "$base_name"
|
|
35
|
+
else
|
|
36
|
+
printf '%s_dev' "$base_name"
|
|
37
|
+
fi
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
usage() {
|
|
41
|
+
cat <<'EOF'
|
|
42
|
+
Uso:
|
|
43
|
+
bash scripts/clear-whatsapp-session.sh [opcoes]
|
|
44
|
+
|
|
45
|
+
Opcoes:
|
|
46
|
+
--session <id> Forca um session_id especifico (padrao: BAILEYS_AUTH_SESSION_ID ou "default")
|
|
47
|
+
--clear-auth-files Remove app/connection/auth/*.json tambem (evita rebootstrap da sessao antiga)
|
|
48
|
+
-h, --help Mostra esta ajuda
|
|
49
|
+
EOF
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
while [[ $# -gt 0 ]]; do
|
|
53
|
+
case "$1" in
|
|
54
|
+
--session)
|
|
55
|
+
[[ $# -ge 2 ]] || fail "faltou valor para --session"
|
|
56
|
+
SESSION_ID_OVERRIDE="$2"
|
|
57
|
+
shift 2
|
|
58
|
+
;;
|
|
59
|
+
--clear-auth-files)
|
|
60
|
+
CLEAR_AUTH_FILES=1
|
|
61
|
+
shift
|
|
62
|
+
;;
|
|
63
|
+
-h|--help)
|
|
64
|
+
usage
|
|
65
|
+
exit 0
|
|
66
|
+
;;
|
|
67
|
+
*)
|
|
68
|
+
fail "opcao invalida: $1 (use --help)"
|
|
69
|
+
;;
|
|
70
|
+
esac
|
|
71
|
+
done
|
|
72
|
+
|
|
73
|
+
require_cmd mysql
|
|
74
|
+
require_cmd base64
|
|
75
|
+
|
|
76
|
+
if [[ ! -f "$ENV_FILE" ]]; then
|
|
77
|
+
fail "arquivo .env nao encontrado em: $ENV_FILE"
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
set -a
|
|
81
|
+
# shellcheck disable=SC1090
|
|
82
|
+
source "$ENV_FILE"
|
|
83
|
+
set +a
|
|
84
|
+
|
|
85
|
+
DB_HOST="${DB_HOST:-}"
|
|
86
|
+
DB_USER="${DB_USER:-}"
|
|
87
|
+
DB_PASSWORD="${DB_PASSWORD:-}"
|
|
88
|
+
DB_NAME="${DB_NAME:-}"
|
|
89
|
+
NODE_ENV_VALUE="${NODE_ENV:-development}"
|
|
90
|
+
SESSION_ID="${SESSION_ID_OVERRIDE:-${BAILEYS_AUTH_SESSION_ID:-default}}"
|
|
91
|
+
|
|
92
|
+
[[ -n "$DB_HOST" ]] || fail "DB_HOST nao definido no .env"
|
|
93
|
+
[[ -n "$DB_USER" ]] || fail "DB_USER nao definido no .env"
|
|
94
|
+
[[ -n "$DB_PASSWORD" ]] || fail "DB_PASSWORD nao definido no .env"
|
|
95
|
+
[[ -n "$DB_NAME" ]] || fail "DB_NAME nao definido no .env"
|
|
96
|
+
[[ -n "$SESSION_ID" ]] || SESSION_ID="default"
|
|
97
|
+
|
|
98
|
+
DB_REAL_NAME="$(resolve_db_name "$DB_NAME" "$NODE_ENV_VALUE")"
|
|
99
|
+
SESSION_ID_B64="$(printf '%s' "$SESSION_ID" | base64 -w0)"
|
|
100
|
+
|
|
101
|
+
log "Limpando sessao '$SESSION_ID' na tabela baileys_auth_state (database: $DB_REAL_NAME)..."
|
|
102
|
+
|
|
103
|
+
mysql -h "$DB_HOST" -u "$DB_USER" "-p$DB_PASSWORD" "$DB_REAL_NAME" <<SQL
|
|
104
|
+
SET @sid = CONVERT(FROM_BASE64('${SESSION_ID_B64}') USING utf8mb4);
|
|
105
|
+
DELETE FROM baileys_auth_state WHERE session_id = @sid;
|
|
106
|
+
SELECT ROW_COUNT() AS removed_rows, @sid AS session_id;
|
|
107
|
+
SQL
|
|
108
|
+
|
|
109
|
+
if [[ "$CLEAR_AUTH_FILES" == "1" ]]; then
|
|
110
|
+
AUTH_DIR="$PROJECT_ROOT/app/connection/auth"
|
|
111
|
+
if compgen -G "$AUTH_DIR/*.json" >/dev/null 2>&1; then
|
|
112
|
+
rm -f "$AUTH_DIR"/*.json
|
|
113
|
+
log "Arquivos legados removidos em: $AUTH_DIR/*.json"
|
|
114
|
+
else
|
|
115
|
+
log "Nenhum arquivo legado encontrado em: $AUTH_DIR"
|
|
116
|
+
fi
|
|
117
|
+
fi
|
|
118
|
+
|
|
119
|
+
if [[ "${BAILEYS_AUTH_BOOTSTRAP_FROM_FILES:-true}" == "true" && "$CLEAR_AUTH_FILES" != "1" ]]; then
|
|
120
|
+
log "Aviso: BAILEYS_AUTH_BOOTSTRAP_FROM_FILES=true. Considere usar --clear-auth-files para evitar restaurar sessao antiga."
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
log "Concluido. Reinicie o bot para gerar novo QR Code."
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import fs from 'node:fs/promises';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { spawnSync } from 'node:child_process';
|
|
6
|
+
|
|
7
|
+
const ENV_PATH = path.resolve(process.cwd(), '.env');
|
|
8
|
+
const MANAGED_BLOCK_START = '# >>> CORE_AI_MODE_MANAGED >>>';
|
|
9
|
+
const MANAGED_BLOCK_END = '# <<< CORE_AI_MODE_MANAGED <<<';
|
|
10
|
+
|
|
11
|
+
const CORE_AI_FLAGS = ['AI_LEARNING_WORKER_ENABLED', 'AI_HELP_CONTINUOUS_LEARNING_ENABLED', 'COMMAND_CONFIG_ENRICHMENT_WORKER_ENABLED', 'GLOBAL_HELP_ENABLE_WRAPPER_LLM_FALLBACK', 'MODULE_AI_HELP_ENABLE_LLM', 'ADMIN_AI_HELP_ENABLE_LLM', 'AI_AI_HELP_ENABLE_LLM', 'GAME_AI_HELP_ENABLE_LLM', 'MENU_AI_HELP_ENABLE_LLM', 'PLAY_AI_HELP_ENABLE_LLM', 'QUOTE_AI_HELP_ENABLE_LLM', 'RPG_POKEMON_AI_HELP_ENABLE_LLM', 'STATS_AI_HELP_ENABLE_LLM', 'STICKER_AI_HELP_ENABLE_LLM', 'STICKER_PACK_AI_HELP_ENABLE_LLM', 'SYSTEM_METRICS_AI_HELP_ENABLE_LLM', 'TIKTOK_AI_HELP_ENABLE_LLM', 'USER_AI_HELP_ENABLE_LLM', 'WAIFUPICS_AI_HELP_ENABLE_LLM'];
|
|
12
|
+
|
|
13
|
+
const parseArgs = (argv = []) => {
|
|
14
|
+
const args = [...argv];
|
|
15
|
+
let mode = 'status';
|
|
16
|
+
let restart = true;
|
|
17
|
+
let pm2Name = process.env.CORE_AI_PM2_NAME || 'omnizap-system-production';
|
|
18
|
+
|
|
19
|
+
if (args[0] && !args[0].startsWith('--')) {
|
|
20
|
+
mode = String(args.shift()).trim().toLowerCase();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
for (const arg of args) {
|
|
24
|
+
if (arg === '--no-restart') {
|
|
25
|
+
restart = false;
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (arg.startsWith('--pm2-name=')) {
|
|
29
|
+
const value = String(arg.split('=').slice(1).join('=')).trim();
|
|
30
|
+
if (value) pm2Name = value;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
mode,
|
|
36
|
+
restart,
|
|
37
|
+
pm2Name,
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const parseDotEnvEffectiveMap = (content) => {
|
|
42
|
+
const map = new Map();
|
|
43
|
+
const lines = String(content || '').split(/\r?\n/);
|
|
44
|
+
const keyRegex = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/;
|
|
45
|
+
|
|
46
|
+
for (const line of lines) {
|
|
47
|
+
const trimmed = line.trim();
|
|
48
|
+
if (!trimmed || trimmed.startsWith('#')) continue;
|
|
49
|
+
const match = line.match(keyRegex);
|
|
50
|
+
if (!match) continue;
|
|
51
|
+
map.set(match[1], String(match[2] || '').trim());
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return map;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const removeManagedBlock = (content) => {
|
|
58
|
+
const lines = String(content || '').split(/\r?\n/);
|
|
59
|
+
const startIndex = lines.findIndex((line) => line.trim() === MANAGED_BLOCK_START);
|
|
60
|
+
if (startIndex < 0) return content;
|
|
61
|
+
const endIndex = lines.findIndex((line, index) => index > startIndex && line.trim() === MANAGED_BLOCK_END);
|
|
62
|
+
if (endIndex < 0) {
|
|
63
|
+
return `${lines.slice(0, startIndex).join('\n').trimEnd()}\n`;
|
|
64
|
+
}
|
|
65
|
+
const nextLines = [...lines.slice(0, startIndex), ...lines.slice(endIndex + 1)];
|
|
66
|
+
return `${nextLines.join('\n').trimEnd()}\n`;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const buildManagedBlock = (value) => {
|
|
70
|
+
const lines = [MANAGED_BLOCK_START, '# Gerenciado por scripts/core-ai-mode.mjs', ...CORE_AI_FLAGS.map((key) => `${key}=${value}`), MANAGED_BLOCK_END];
|
|
71
|
+
return `${lines.join('\n')}\n`;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const writeModeToEnv = async (modeValue) => {
|
|
75
|
+
const current = await fs.readFile(ENV_PATH, 'utf8');
|
|
76
|
+
const withoutManaged = removeManagedBlock(current);
|
|
77
|
+
const next = withoutManaged.trimEnd().length > 0 ? `${withoutManaged.trimEnd()}\n\n${buildManagedBlock(modeValue)}` : `${buildManagedBlock(modeValue)}`;
|
|
78
|
+
await fs.writeFile(ENV_PATH, next, 'utf8');
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const computeStatus = async () => {
|
|
82
|
+
const content = await fs.readFile(ENV_PATH, 'utf8');
|
|
83
|
+
const map = parseDotEnvEffectiveMap(content);
|
|
84
|
+
const values = CORE_AI_FLAGS.map((key) => {
|
|
85
|
+
const raw = String(map.get(key) ?? '')
|
|
86
|
+
.trim()
|
|
87
|
+
.toLowerCase();
|
|
88
|
+
return {
|
|
89
|
+
key,
|
|
90
|
+
raw: raw || '(unset)',
|
|
91
|
+
bool: raw === 'true' || raw === '1' || raw === 'yes' || raw === 'on',
|
|
92
|
+
isSet: raw.length > 0,
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
const allFalse = values.every((item) => item.isSet && item.bool === false);
|
|
97
|
+
const allTrue = values.every((item) => item.isSet && item.bool === true);
|
|
98
|
+
const mode = allFalse ? 'deterministic_on' : allTrue ? 'ai_on' : 'custom';
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
mode,
|
|
102
|
+
values,
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const restartPm2Process = ({ pm2Name, modeValue }) => {
|
|
107
|
+
const envOverrides = Object.fromEntries(CORE_AI_FLAGS.map((key) => [key, modeValue]));
|
|
108
|
+
const result = spawnSync('pm2', ['restart', pm2Name, '--update-env'], {
|
|
109
|
+
env: {
|
|
110
|
+
...process.env,
|
|
111
|
+
...envOverrides,
|
|
112
|
+
},
|
|
113
|
+
encoding: 'utf8',
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
if (result.error) {
|
|
117
|
+
throw result.error;
|
|
118
|
+
}
|
|
119
|
+
if (result.status !== 0) {
|
|
120
|
+
throw new Error((result.stderr || result.stdout || `Falha ao reiniciar processo PM2: ${pm2Name}`).trim());
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
const printStatus = ({ mode, values }) => {
|
|
125
|
+
console.log(`core_ai_mode=${mode}`);
|
|
126
|
+
for (const item of values) {
|
|
127
|
+
console.log(`${item.key}=${item.raw}`);
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
const run = async () => {
|
|
132
|
+
const { mode, restart, pm2Name } = parseArgs(process.argv.slice(2));
|
|
133
|
+
|
|
134
|
+
if (!['on', 'off', 'status'].includes(mode)) {
|
|
135
|
+
console.error('Uso: npm run core:ai -- <on|off|status> [--no-restart] [--pm2-name=<processo>]');
|
|
136
|
+
process.exitCode = 1;
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (mode === 'status') {
|
|
141
|
+
const status = await computeStatus();
|
|
142
|
+
printStatus(status);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const modeValue = mode === 'on' ? 'false' : 'true';
|
|
147
|
+
await writeModeToEnv(modeValue);
|
|
148
|
+
|
|
149
|
+
if (restart) {
|
|
150
|
+
restartPm2Process({ pm2Name, modeValue });
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const status = await computeStatus();
|
|
154
|
+
console.log(`core_ai_mode_updated=${mode}`);
|
|
155
|
+
console.log(`pm2_restart=${restart ? 'executed' : 'skipped'}`);
|
|
156
|
+
console.log(`pm2_process=${pm2Name}`);
|
|
157
|
+
printStatus(status);
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
run().catch((error) => {
|
|
161
|
+
console.error(`Erro ao alternar modo do core AI: ${error?.message || error}`);
|
|
162
|
+
process.exitCode = 1;
|
|
163
|
+
});
|
package/scripts/deploy.sh
CHANGED
|
@@ -11,6 +11,9 @@ RESTART_PM2="${DEPLOY_RESTART_PM2:-1}"
|
|
|
11
11
|
PM2_APP_NAME="${DEPLOY_PM2_APP_NAME:-omnizap-production}"
|
|
12
12
|
BUILD_ID="${DEPLOY_BUILD_ID:-$(date -u +%Y%m%d%H%M%S)}"
|
|
13
13
|
VERIFY_URL="${DEPLOY_VERIFY_URL:-https://omnizap.shop/}"
|
|
14
|
+
WEB_SURFACE_VERIFY_ENABLED="${DEPLOY_VERIFY_WEB_SECURITY_SURFACE:-1}"
|
|
15
|
+
WEB_SURFACE_VERIFY_BASE_URL="${DEPLOY_VERIFY_WEB_SECURITY_SURFACE_BASE_URL:-$VERIFY_URL}"
|
|
16
|
+
WEB_SURFACE_VERIFY_REPORT_PATH="${DEPLOY_VERIFY_WEB_SECURITY_SURFACE_REPORT_PATH:-$PROJECT_ROOT/temp/security-web-surface-report.json}"
|
|
14
17
|
DRY_RUN="${DEPLOY_DRY_RUN:-0}"
|
|
15
18
|
GITHUB_NOTIFY="${DEPLOY_GITHUB_NOTIFY:-1}"
|
|
16
19
|
GITHUB_ENVIRONMENT="${DEPLOY_GITHUB_ENVIRONMENT:-production}"
|
|
@@ -920,4 +923,11 @@ if command -v curl >/dev/null 2>&1; then
|
|
|
920
923
|
fi
|
|
921
924
|
fi
|
|
922
925
|
|
|
926
|
+
if [ "$WEB_SURFACE_VERIFY_ENABLED" = "1" ]; then
|
|
927
|
+
log "Executando validacao web de seguranca em $WEB_SURFACE_VERIFY_BASE_URL"
|
|
928
|
+
SECURITY_WEB_SURFACE_BASE_URL="$WEB_SURFACE_VERIFY_BASE_URL" \
|
|
929
|
+
SECURITY_WEB_SURFACE_REPORT_PATH="$WEB_SURFACE_VERIFY_REPORT_PATH" \
|
|
930
|
+
node "$PROJECT_ROOT/scripts/security-web-surface-check.mjs"
|
|
931
|
+
fi
|
|
932
|
+
|
|
923
933
|
log "Deploy concluído com sucesso."
|