@semacode/cli 2.2.0 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +39 -39
- package/README.md +251 -141
- package/dist/agentContext.d.ts +1 -1
- package/dist/agentContextPack.js +6 -1
- package/dist/agentContextTipos.d.ts +4 -2
- package/dist/agentContextTipos.js +7 -0
- package/dist/agentEntryPoints.js +551 -499
- package/dist/angular-consumer-standalone.d.ts +3 -1
- package/dist/angular-consumer-standalone.js +12 -8
- package/dist/comandos.js +4 -0
- package/dist/discovery/catalog.d.ts +11 -0
- package/dist/discovery/catalog.js +521 -0
- package/dist/discovery/command.d.ts +11 -0
- package/dist/discovery/command.js +226 -0
- package/dist/discovery/index.d.ts +5 -0
- package/dist/discovery/index.js +8 -0
- package/dist/discovery/ranker.d.ts +3 -0
- package/dist/discovery/ranker.js +310 -0
- package/dist/discovery/redaction.d.ts +2 -0
- package/dist/discovery/redaction.js +21 -0
- package/dist/discovery/render.d.ts +2 -0
- package/dist/discovery/render.js +100 -0
- package/dist/discovery/types.d.ts +119 -0
- package/dist/discovery/types.js +13 -0
- package/dist/drift.part01.d.ts +32 -2
- package/dist/drift.part01.js +2 -0
- package/dist/drift.part04.d.ts +3 -2
- package/dist/drift.part04.js +6 -3
- package/dist/drift.part05.d.ts +2 -1
- package/dist/drift.part05.js +4 -3
- package/dist/drift.part06.d.ts +2 -1
- package/dist/drift.part06.js +9 -5
- package/dist/drift.part07.d.ts +11 -10
- package/dist/drift.part07.js +40 -30
- package/dist/drift.part08.d.ts +2 -1
- package/dist/drift.part08.js +4 -3
- package/dist/drift.part11.js +71 -6
- package/dist/drift.part12.js +14 -1
- package/dist/drift.part13.d.ts +42 -7
- package/dist/drift.part13.js +660 -36
- package/dist/driftCache.d.ts +49 -0
- package/dist/driftCache.js +311 -0
- package/dist/driftCacheIncremental.d.ts +98 -0
- package/dist/driftCacheIncremental.js +596 -0
- package/dist/driftCatalogo.d.ts +91 -0
- package/dist/driftCatalogo.js +657 -0
- package/dist/driftCatalogoPersistente.d.ts +8 -0
- package/dist/driftCatalogoPersistente.js +77 -0
- package/dist/driftEscopo.d.ts +23 -0
- package/dist/driftEscopo.js +563 -0
- package/dist/driftEscopoReferencias.d.ts +4 -0
- package/dist/driftEscopoReferencias.js +265 -0
- package/dist/driftOrcamento.d.ts +12 -0
- package/dist/driftOrcamento.js +19 -3
- package/dist/execucoesExternas.js +5 -19
- package/dist/exemplosOficiais.js +29 -8
- package/dist/iaPrompts.d.ts +1 -1
- package/dist/iaPrompts.js +310 -307
- package/dist/index.d.ts +2 -0
- package/dist/index.js +23 -5
- package/dist/index.part01.d.ts +17 -2
- package/dist/index.part01.js +119 -8
- package/dist/index.part02.js +21 -21
- package/dist/index.part03.d.ts +2 -2
- package/dist/index.part03.js +14 -3
- package/dist/index.part04.d.ts +2 -2
- package/dist/index.part04.js +113 -101
- package/dist/index.part05.d.ts +1 -1
- package/dist/index.part05.js +99 -22
- package/dist/index.part06.js +6 -2
- package/dist/index.part07.js +24 -24
- package/dist/index.part08.js +1 -1
- package/dist/init/templates.part01.js +393 -393
- package/dist/init/templates.part02.js +189 -189
- package/dist/initTemplatesBackend.js +73 -73
- package/dist/initTemplatesBase.js +81 -80
- package/dist/initTemplatesFlutter.js +137 -137
- package/dist/initTemplatesRuntime.js +350 -350
- package/dist/initTemplatesWeb.js +309 -309
- package/dist/pipelineConteudo/command.js +1 -36
- package/dist/profileArtefatoValidadores.d.ts +3 -2
- package/dist/profileArtefatoValidadores.js +81 -0
- package/dist/profileAuthorTipos.d.ts +4 -3
- package/dist/profileCatalogo.d.ts +5 -5
- package/dist/profileCatalogo.js +30 -0
- package/dist/profileCommand.d.ts +8 -2
- package/dist/profileCommand.js +15 -5
- package/dist/profileRegras.d.ts +5 -5
- package/dist/profileRegras.js +13 -1
- package/dist/profileRulePacks.js +68 -0
- package/dist/projeto.d.ts +1 -1
- package/dist/projetoCarregar.d.ts +2 -2
- package/dist/projetoCarregar.js +47 -24
- package/dist/projetoCatalogo.d.ts +7 -0
- package/dist/projetoCatalogo.js +125 -0
- package/dist/projetoTipos.d.ts +14 -5
- package/dist/sistemasInterativos/adapterProtocol.d.ts +3 -0
- package/dist/sistemasInterativos/adapterProtocol.js +240 -0
- package/dist/sistemasInterativos/advancedCatalog.d.ts +5 -0
- package/dist/sistemasInterativos/advancedCatalog.js +442 -0
- package/dist/sistemasInterativos/autonomy.d.ts +230 -0
- package/dist/sistemasInterativos/autonomy.js +753 -0
- package/dist/sistemasInterativos/canonical.d.ts +3 -0
- package/dist/sistemasInterativos/canonical.js +43 -0
- package/dist/sistemasInterativos/catalog.d.ts +116 -0
- package/dist/sistemasInterativos/catalog.js +543 -0
- package/dist/sistemasInterativos/command.d.ts +7 -0
- package/dist/sistemasInterativos/command.js +311 -0
- package/dist/sistemasInterativos/controlRun.d.ts +56 -0
- package/dist/sistemasInterativos/controlRun.js +391 -0
- package/dist/sistemasInterativos/evidence.d.ts +5 -0
- package/dist/sistemasInterativos/evidence.js +306 -0
- package/dist/sistemasInterativos/experienceIr.d.ts +12 -0
- package/dist/sistemasInterativos/experienceIr.js +895 -0
- package/dist/sistemasInterativos/experienceIrSemantics.d.ts +30 -0
- package/dist/sistemasInterativos/experienceIrSemantics.js +368 -0
- package/dist/sistemasInterativos/experienceIrTypes.d.ts +370 -0
- package/dist/sistemasInterativos/experienceIrTypes.js +5 -0
- package/dist/sistemasInterativos/extensionCommand.d.ts +391 -0
- package/dist/sistemasInterativos/extensionCommand.js +383 -0
- package/dist/sistemasInterativos/index.d.ts +19 -0
- package/dist/sistemasInterativos/index.js +22 -0
- package/dist/sistemasInterativos/operations.d.ts +40 -0
- package/dist/sistemasInterativos/operations.js +1167 -0
- package/dist/sistemasInterativos/operationsTypes.d.ts +297 -0
- package/dist/sistemasInterativos/operationsTypes.js +11 -0
- package/dist/sistemasInterativos/planner.d.ts +2 -0
- package/dist/sistemasInterativos/planner.js +159 -0
- package/dist/sistemasInterativos/portability.d.ts +164 -0
- package/dist/sistemasInterativos/portability.js +539 -0
- package/dist/sistemasInterativos/render.d.ts +3 -0
- package/dist/sistemasInterativos/render.js +179 -0
- package/dist/sistemasInterativos/temporal.d.ts +183 -0
- package/dist/sistemasInterativos/temporal.js +543 -0
- package/dist/sistemasInterativos/types.d.ts +215 -0
- package/dist/sistemasInterativos/types.js +4 -0
- package/dist/sistemasInterativos/validator.d.ts +2 -0
- package/dist/sistemasInterativos/validator.js +305 -0
- package/dist/sync/index.js +35 -35
- package/docs/README.md +34 -28
- package/docs/ai-onboarding.md +62 -62
- package/docs/ai-workflow.md +9 -4
- package/docs/auth.md +26 -26
- package/docs/cli.md +79 -79
- package/docs/commands.md +47 -2
- package/docs/database.md +15 -15
- package/docs/deploy.md +41 -41
- package/docs/descoberta-capacidades.md +106 -0
- package/docs/documentation.md +39 -39
- package/docs/env.md +16 -16
- package/docs/frontend.md +41 -41
- package/docs/getting-started.md +57 -57
- package/docs/i18n.md +15 -15
- package/docs/pipeline-conteudo.md +246 -246
- package/docs/profiles.md +54 -45
- package/docs/repositories.md +43 -43
- package/docs/rollback.md +31 -31
- package/docs/security.md +32 -32
- package/docs/sistemas-interativos.md +376 -0
- package/docs/support.md +8 -8
- package/docs/testing.md +51 -35
- package/docs/vocabulary.md +29 -29
- package/exemplos/agendamento.sema +1 -1
- package/exemplos/assinatura.sema +1 -1
- package/exemplos/auditoria.sema +1 -1
- package/exemplos/autenticacao.sema +1 -1
- package/exemplos/author_obra_comum.sema +1 -1
- package/exemplos/author_tema_sensivel.sema +1 -1
- package/exemplos/automacao.sema +1 -1
- package/exemplos/cadastro_usuario.sema +1 -1
- package/exemplos/calculadora.sema +1 -1
- package/exemplos/crud_simples.sema +1 -1
- package/exemplos/estoque.sema +1 -1
- package/exemplos/exportacao.sema +1 -1
- package/exemplos/fila.sema +1 -1
- package/exemplos/integracao_externa.sema +1 -1
- package/exemplos/multi_tenant.sema +1 -1
- package/exemplos/notificacao.sema +1 -1
- package/exemplos/operacao_estrategia.sema +132 -132
- package/exemplos/operacao_estrategia_discovery.sema +220 -220
- package/exemplos/operacao_estrategia_fluxo.sema +114 -114
- package/exemplos/operacao_estrategia_gates.sema +106 -106
- package/exemplos/operacao_estrategia_quarentena.sema +133 -133
- package/exemplos/operacao_estrategia_rollout.sema +124 -124
- package/exemplos/pagamento.sema +1 -1
- package/exemplos/pagamento_dominio.sema +1 -1
- package/exemplos/pedido.sema +1 -1
- package/exemplos/permissao.sema +1 -1
- package/exemplos/persistencia_vendor_first.sema +1 -1
- package/exemplos/pipeline-conteudo/README.md +44 -44
- package/exemplos/pipeline-conteudo/alvos.json +23 -23
- package/exemplos/pipeline-conteudo/definicao.json +136 -136
- package/exemplos/profile_conversas.sema +165 -165
- package/exemplos/profile_game.sema +1 -1
- package/exemplos/profile_legal.sema +1 -1
- package/exemplos/profile_ops.sema +1 -1
- package/exemplos/profile_research.sema +1 -1
- package/exemplos/profile_simulation.sema +211 -0
- package/exemplos/profile_software.sema +1 -1
- package/exemplos/profile_workflow_n8n.sema +1 -1
- package/exemplos/relatorio.sema +1 -1
- package/exemplos/replica_analitica_erp.sema +1 -1
- package/exemplos/sistemas-interativos/README.md +100 -0
- package/exemplos/sistemas-interativos/advanced/acceptance-context-evaluate-valid.json +5 -0
- package/exemplos/sistemas-interativos/advanced/acceptance-lock-valid.json +16 -0
- package/exemplos/sistemas-interativos/advanced/asset-provenance-valid.json +32 -0
- package/exemplos/sistemas-interativos/advanced/autonomy-repair-valid.json +93 -0
- package/exemplos/sistemas-interativos/advanced/control-run-definition-valid.json +78 -0
- package/exemplos/sistemas-interativos/advanced/control-run-valid.json +27 -0
- package/exemplos/sistemas-interativos/advanced/distributed-workers-valid.json +79 -0
- package/exemplos/sistemas-interativos/advanced/editor-state-valid.json +42 -0
- package/exemplos/sistemas-interativos/advanced/engine-snapshot-after-valid.json +32 -0
- package/exemplos/sistemas-interativos/advanced/engine-snapshot-before-valid.json +23 -0
- package/exemplos/sistemas-interativos/advanced/job-orchestration-valid.json +39 -0
- package/exemplos/sistemas-interativos/advanced/multimodal-evidence-valid.json +46 -0
- package/exemplos/sistemas-interativos/advanced/multiplayer-authority-valid.json +39 -0
- package/exemplos/sistemas-interativos/advanced/playtest-fuzz-valid.json +37 -0
- package/exemplos/sistemas-interativos/advanced/portability-valid.json +104 -0
- package/exemplos/sistemas-interativos/advanced/temporal-evidence-valid.json +27 -0
- package/exemplos/sistemas-interativos/advanced/temporal-valid.json +118 -0
- package/exemplos/sistemas-interativos/experience-ir-valid.json +459 -0
- package/exemplos/sistemas-interativos/game-2d.json +83 -0
- package/exemplos/sistemas-interativos/game-3d-human.json +81 -0
- package/exemplos/sistemas-interativos/game-pixel-16-bit.json +97 -0
- package/exemplos/sistemas-interativos/game-pixel-8-bit.json +94 -0
- package/exemplos/sistemas-interativos/game-xr-human.json +80 -0
- package/exemplos/sistemas-interativos/hybrid-2-5d.json +108 -0
- package/exemplos/sistemas-interativos/protocol-mutating-rollback-valid.json +75 -0
- package/exemplos/sistemas-interativos/protocol-read-only-valid.json +58 -0
- package/exemplos/sistemas-interativos/simulation-2d-controlled.json +97 -0
- package/exemplos/sistemas-interativos/simulation-3d-calibrated-autonomous.json +141 -0
- package/exemplos/sistemas-interativos/simulation-headless-autonomous-batch.json +112 -0
- package/exemplos/sistemas-interativos/simulation-pixel-16-bit.json +103 -0
- package/exemplos/sistemas-interativos/simulation-text-controlled.json +95 -0
- package/exemplos/testes_embutidos.sema +1 -1
- package/exemplos/tratamento_erro.sema +1 -1
- package/exemplos/upload_arquivo.sema +1 -1
- package/exemplos/webhook.sema +1 -1
- package/node_modules/@sema/gerador-cpp/dist/index.js +176 -176
- package/node_modules/@sema/gerador-cpp/package.json +1 -1
- package/node_modules/@sema/gerador-css/dist/index.part01.js +10 -10
- package/node_modules/@sema/gerador-css/dist/index.part02.js +460 -460
- package/node_modules/@sema/gerador-dotnet/dist/index.js +169 -169
- package/node_modules/@sema/gerador-dotnet/package.json +1 -1
- package/node_modules/@sema/gerador-html/dist/index.js +17 -17
- package/node_modules/@sema/gerador-lua/dist/index.js +76 -47
- package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -1
- package/node_modules/@sema/gerador-php/dist/index.js +113 -113
- package/node_modules/@sema/gerador-python/dist/index.part02.js +3 -3
- package/node_modules/@sema/gerador-typescript/dist/index.part02.js +11 -11
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +42 -42
- package/package.json +3 -3
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
// SEMA-GOVERNED: sema.produto.descoberta_capacidades
|
|
2
|
+
// Descrição: handler da CLI de descoberta; consulta, renderiza e nunca executa templates.
|
|
3
|
+
import { montarCatalogoCapacidades, normalizarDiscoveryKind, obterEntradaDescoberta, } from "./catalog.js";
|
|
4
|
+
import { recomendarCapacidadePorIntencao } from "./ranker.js";
|
|
5
|
+
import { renderizarResultadoDescoberta } from "./render.js";
|
|
6
|
+
import { DISCOVERY_SCHEMA_VERSION, } from "./types.js";
|
|
7
|
+
const EXECUTION_BOUNDARY = {
|
|
8
|
+
executed: false,
|
|
9
|
+
workspaceMutated: false,
|
|
10
|
+
externalCalls: false,
|
|
11
|
+
requiresExplicitRun: true,
|
|
12
|
+
};
|
|
13
|
+
const OPCOES_COM_VALOR = new Set([
|
|
14
|
+
"--tipo",
|
|
15
|
+
"--id",
|
|
16
|
+
"--dominio",
|
|
17
|
+
"--intencao",
|
|
18
|
+
"--limite",
|
|
19
|
+
]);
|
|
20
|
+
function argumentosValidos(args, politica) {
|
|
21
|
+
const vistos = new Set();
|
|
22
|
+
let posicionais = 0;
|
|
23
|
+
for (let indice = 0; indice < args.length; indice += 1) {
|
|
24
|
+
const atual = args[indice];
|
|
25
|
+
if (!atual.startsWith("--")) {
|
|
26
|
+
posicionais += 1;
|
|
27
|
+
if (posicionais > politica.maxPosicionais)
|
|
28
|
+
return false;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (vistos.has(atual))
|
|
32
|
+
return false;
|
|
33
|
+
vistos.add(atual);
|
|
34
|
+
if (politica.flags.has(atual))
|
|
35
|
+
continue;
|
|
36
|
+
if (!politica.opcoesComValor.has(atual))
|
|
37
|
+
return false;
|
|
38
|
+
const valor = args[indice + 1];
|
|
39
|
+
if (!valor || valor.startsWith("--"))
|
|
40
|
+
return false;
|
|
41
|
+
indice += 1;
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
function politicaParaOperacao(operacao) {
|
|
46
|
+
const flags = new Set(["--json"]);
|
|
47
|
+
if (operacao === "catalogo") {
|
|
48
|
+
return { opcoesComValor: new Set(["--tipo", "--id", "--dominio"]), flags, maxPosicionais: 0 };
|
|
49
|
+
}
|
|
50
|
+
if (operacao === "recomendar") {
|
|
51
|
+
return { opcoesComValor: new Set(["--intencao", "--limite"]), flags, maxPosicionais: 0 };
|
|
52
|
+
}
|
|
53
|
+
if (operacao === "explicar" || operacao === "pipeline descrever") {
|
|
54
|
+
return { opcoesComValor: new Set(["--id"]), flags, maxPosicionais: 1 };
|
|
55
|
+
}
|
|
56
|
+
if (operacao === "pipeline listar") {
|
|
57
|
+
return { opcoesComValor: new Set(), flags, maxPosicionais: 0 };
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
function normalizarSubcomando(valor) {
|
|
62
|
+
return (valor ?? "")
|
|
63
|
+
.normalize("NFD")
|
|
64
|
+
.replace(/[\u0300-\u036f]/gu, "")
|
|
65
|
+
.toLowerCase()
|
|
66
|
+
.replace(/[_-]+/gu, " ")
|
|
67
|
+
.trim()
|
|
68
|
+
.replace(/\s+/gu, " ");
|
|
69
|
+
}
|
|
70
|
+
function obterOpcao(args, nome) {
|
|
71
|
+
const indice = args.indexOf(nome);
|
|
72
|
+
if (indice < 0)
|
|
73
|
+
return null;
|
|
74
|
+
const valor = args[indice + 1];
|
|
75
|
+
return valor && !valor.startsWith("--") ? valor : null;
|
|
76
|
+
}
|
|
77
|
+
function obterPosicionais(args) {
|
|
78
|
+
const posicionais = [];
|
|
79
|
+
for (let indice = 0; indice < args.length; indice += 1) {
|
|
80
|
+
const atual = args[indice];
|
|
81
|
+
if (OPCOES_COM_VALOR.has(atual)) {
|
|
82
|
+
indice += 1;
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (atual.startsWith("--"))
|
|
86
|
+
continue;
|
|
87
|
+
posicionais.push(atual);
|
|
88
|
+
}
|
|
89
|
+
return posicionais;
|
|
90
|
+
}
|
|
91
|
+
function erro(code, message, emJson) {
|
|
92
|
+
const payload = {
|
|
93
|
+
schemaVersion: DISCOVERY_SCHEMA_VERSION,
|
|
94
|
+
command: "descobrir",
|
|
95
|
+
success: false,
|
|
96
|
+
mode: "error",
|
|
97
|
+
...EXECUTION_BOUNDARY,
|
|
98
|
+
error: { code, message },
|
|
99
|
+
};
|
|
100
|
+
return {
|
|
101
|
+
exitCode: 2,
|
|
102
|
+
payload,
|
|
103
|
+
text: renderizarResultadoDescoberta(payload),
|
|
104
|
+
outputFormat: emJson ? "json" : "text",
|
|
105
|
+
executed: false,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function sucesso(payload, emJson) {
|
|
109
|
+
return {
|
|
110
|
+
exitCode: 0,
|
|
111
|
+
payload,
|
|
112
|
+
text: renderizarResultadoDescoberta(payload),
|
|
113
|
+
outputFormat: emJson ? "json" : "text",
|
|
114
|
+
executed: false,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function explicar(id, somentePipeline, emJson) {
|
|
118
|
+
if (!id)
|
|
119
|
+
return erro("DISCOVERY_ID_OBRIGATORIO", "Informe um id de capacidade explícito.", emJson);
|
|
120
|
+
const entry = obterEntradaDescoberta(id);
|
|
121
|
+
if (!entry || (somentePipeline && entry.kind !== "ORCHESTRATION_PIPELINE")) {
|
|
122
|
+
return erro(somentePipeline ? "DISCOVERY_PIPELINE_NAO_ENCONTRADO" : "DISCOVERY_ID_NAO_ENCONTRADO", somentePipeline ? "Pipeline não encontrado no catálogo público." : "Capacidade não encontrada no catálogo público.", emJson);
|
|
123
|
+
}
|
|
124
|
+
const payload = {
|
|
125
|
+
schemaVersion: DISCOVERY_SCHEMA_VERSION,
|
|
126
|
+
command: somentePipeline ? "descobrir pipeline descrever" : "descobrir explicar",
|
|
127
|
+
success: true,
|
|
128
|
+
mode: "explain",
|
|
129
|
+
...EXECUTION_BOUNDARY,
|
|
130
|
+
entry,
|
|
131
|
+
};
|
|
132
|
+
return sucesso(payload, emJson);
|
|
133
|
+
}
|
|
134
|
+
export function comandoDescobertaCapacidades(subcomando, argumentos = []) {
|
|
135
|
+
const emJson = argumentos.includes("--json");
|
|
136
|
+
let operacao = normalizarSubcomando(subcomando);
|
|
137
|
+
let args = [...argumentos];
|
|
138
|
+
if (operacao === "pipeline") {
|
|
139
|
+
const posicionais = obterPosicionais(args);
|
|
140
|
+
const alias = normalizarSubcomando(posicionais[0]);
|
|
141
|
+
if (alias !== "listar" && alias !== "descrever") {
|
|
142
|
+
return erro("DISCOVERY_PIPELINE_SUBCOMANDO_INVALIDO", "Use `pipeline listar` ou `pipeline descrever <id>`.", emJson);
|
|
143
|
+
}
|
|
144
|
+
operacao = `pipeline ${alias}`;
|
|
145
|
+
const indiceAlias = args.indexOf(posicionais[0]);
|
|
146
|
+
if (indiceAlias >= 0)
|
|
147
|
+
args.splice(indiceAlias, 1);
|
|
148
|
+
}
|
|
149
|
+
if (operacao === "capabilities")
|
|
150
|
+
operacao = "catalogo";
|
|
151
|
+
const politica = politicaParaOperacao(operacao);
|
|
152
|
+
if (politica && !argumentosValidos(args, politica)) {
|
|
153
|
+
return erro("DISCOVERY_ARGUMENTOS_INVALIDOS", "Use apenas opções conhecidas, uma vez cada e com os valores obrigatórios.", emJson);
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
if (operacao === "catalogo" || operacao === "pipeline listar") {
|
|
157
|
+
const tipoCru = operacao === "pipeline listar" ? "ORCHESTRATION_PIPELINE" : obterOpcao(args, "--tipo");
|
|
158
|
+
const kind = tipoCru ? normalizarDiscoveryKind(tipoCru) : null;
|
|
159
|
+
if (tipoCru && !kind) {
|
|
160
|
+
return erro("DISCOVERY_KIND_INVALIDO", "Tipo de capacidade inválido.", emJson);
|
|
161
|
+
}
|
|
162
|
+
const payloadBase = montarCatalogoCapacidades({
|
|
163
|
+
kind,
|
|
164
|
+
id: obterOpcao(args, "--id"),
|
|
165
|
+
domain: obterOpcao(args, "--dominio"),
|
|
166
|
+
});
|
|
167
|
+
const payload = operacao === "pipeline listar"
|
|
168
|
+
? { ...payloadBase, command: "descobrir pipeline listar" }
|
|
169
|
+
: payloadBase;
|
|
170
|
+
return sucesso(payload, emJson);
|
|
171
|
+
}
|
|
172
|
+
if (operacao === "recomendar") {
|
|
173
|
+
const intencao = obterOpcao(args, "--intencao");
|
|
174
|
+
if (!intencao) {
|
|
175
|
+
return erro("DISCOVERY_INTENCAO_OBRIGATORIA", "Use `--intencao <texto>` para recomendar uma capacidade.", emJson);
|
|
176
|
+
}
|
|
177
|
+
const limiteCru = obterOpcao(args, "--limite");
|
|
178
|
+
const limite = limiteCru === null ? 5 : Number(limiteCru);
|
|
179
|
+
if (!Number.isInteger(limite) || limite < 1 || limite > 10) {
|
|
180
|
+
return erro("DISCOVERY_LIMITE_INVALIDO", "O limite deve ser um inteiro entre 1 e 10.", emJson);
|
|
181
|
+
}
|
|
182
|
+
return sucesso(recomendarCapacidadePorIntencao(intencao, limite), emJson);
|
|
183
|
+
}
|
|
184
|
+
if (operacao === "explicar" || operacao === "pipeline descrever") {
|
|
185
|
+
const id = obterOpcao(args, "--id") ?? obterPosicionais(args)[0] ?? null;
|
|
186
|
+
return explicar(id, operacao === "pipeline descrever", emJson);
|
|
187
|
+
}
|
|
188
|
+
if (!operacao) {
|
|
189
|
+
return erro("DISCOVERY_SUBCOMANDO_OBRIGATORIO", "Use `catalogo`, `recomendar`, `explicar`, `pipeline listar` ou `pipeline descrever`.", emJson);
|
|
190
|
+
}
|
|
191
|
+
return erro("DISCOVERY_SUBCOMANDO_INVALIDO", "Subcomando de descoberta inválido.", emJson);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return erro("DISCOVERY_ARGUMENTOS_INVALIDOS", "Não foi possível aplicar os argumentos de descoberta.", emJson);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function imprimirResultado(resultado, emJson) {
|
|
198
|
+
const saida = emJson ? JSON.stringify(resultado.payload, null, 2) : resultado.text;
|
|
199
|
+
if (resultado.exitCode === 0 || emJson)
|
|
200
|
+
console.log(saida);
|
|
201
|
+
else
|
|
202
|
+
console.error(saida);
|
|
203
|
+
}
|
|
204
|
+
export const comandoDescobrirHandler = async (posicionais, args, emJson) => {
|
|
205
|
+
const subcomando = posicionais[0];
|
|
206
|
+
const argsSemSubcomando = args[0] === subcomando ? args.slice(1) : args;
|
|
207
|
+
const resultado = comandoDescobertaCapacidades(subcomando, argsSemSubcomando);
|
|
208
|
+
imprimirResultado(resultado, emJson);
|
|
209
|
+
return resultado.exitCode;
|
|
210
|
+
};
|
|
211
|
+
export const comandoPipelineDescobertaHandler = async (_posicionais, args, emJson) => {
|
|
212
|
+
const resultado = comandoDescobertaCapacidades("pipeline", args);
|
|
213
|
+
imprimirResultado(resultado, emJson);
|
|
214
|
+
return resultado.exitCode;
|
|
215
|
+
};
|
|
216
|
+
export const comandoCapabilitiesDescobertaHandler = async (_posicionais, args, emJson) => {
|
|
217
|
+
const resultado = comandoDescobertaCapacidades("catalogo", args);
|
|
218
|
+
imprimirResultado(resultado, emJson);
|
|
219
|
+
return resultado.exitCode;
|
|
220
|
+
};
|
|
221
|
+
export const REGISTRO_HANDLERS_DESCOBERTA = {
|
|
222
|
+
descobrir: comandoDescobrirHandler,
|
|
223
|
+
pipeline: comandoPipelineDescobertaHandler,
|
|
224
|
+
capabilities: comandoCapabilitiesDescobertaHandler,
|
|
225
|
+
};
|
|
226
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { criarResumoDescobertaAgentContext, montarCatalogoCapacidades, normalizarDiscoveryKind, obterEntradaDescoberta, } from "./catalog.js";
|
|
2
|
+
export { comandoCapabilitiesDescobertaHandler, comandoDescobertaCapacidades, comandoDescobrirHandler, comandoPipelineDescobertaHandler, REGISTRO_HANDLERS_DESCOBERTA, type DiscoveryCliHandler, } from "./command.js";
|
|
3
|
+
export { normalizarIntencaoDescoberta, recomendarCapacidadePorIntencao, } from "./ranker.js";
|
|
4
|
+
export { renderizarResultadoDescoberta } from "./render.js";
|
|
5
|
+
export * from "./types.js";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// SEMA-GOVERNED: sema.produto.descoberta_capacidades
|
|
2
|
+
// Descrição: superfície única dos módulos puros e handlers de descoberta.
|
|
3
|
+
export { criarResumoDescobertaAgentContext, montarCatalogoCapacidades, normalizarDiscoveryKind, obterEntradaDescoberta, } from "./catalog.js";
|
|
4
|
+
export { comandoCapabilitiesDescobertaHandler, comandoDescobertaCapacidades, comandoDescobrirHandler, comandoPipelineDescobertaHandler, REGISTRO_HANDLERS_DESCOBERTA, } from "./command.js";
|
|
5
|
+
export { normalizarIntencaoDescoberta, recomendarCapacidadePorIntencao, } from "./ranker.js";
|
|
6
|
+
export { renderizarResultadoDescoberta } from "./render.js";
|
|
7
|
+
export * from "./types.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
// SEMA-GOVERNED: sema.produto.descoberta_capacidades
|
|
2
|
+
// Descrição: ranking determinístico, explicável e sem execução por intenção.
|
|
3
|
+
import { montarCatalogoCapacidades } from "./catalog.js";
|
|
4
|
+
import { DISCOVERY_SCHEMA_VERSION, } from "./types.js";
|
|
5
|
+
import { redigirTextoControladoDescoberta } from "./redaction.js";
|
|
6
|
+
const EXECUTION_BOUNDARY = {
|
|
7
|
+
executed: false,
|
|
8
|
+
workspaceMutated: false,
|
|
9
|
+
externalCalls: false,
|
|
10
|
+
requiresExplicitRun: true,
|
|
11
|
+
};
|
|
12
|
+
const TOKEN_EQUIVALENCES = [
|
|
13
|
+
["game", "games", "jogo", "jogos"],
|
|
14
|
+
["simulation", "simulator", "simulacao", "simulacoes", "simulador", "simuladores"],
|
|
15
|
+
["calibrate", "calibrated", "calibration", "calibracao", "calibrar", "calibrado", "calibrada"],
|
|
16
|
+
["autonomous", "autonomo", "autonoma", "autonomia"],
|
|
17
|
+
["realistic", "realista", "realismo"],
|
|
18
|
+
["balance", "balancing", "balanceamento", "balancear"],
|
|
19
|
+
["playtest", "jogabilidade", "jogavel"],
|
|
20
|
+
["workflow", "automacao", "orquestracao"],
|
|
21
|
+
["content", "conteudo", "editorial"],
|
|
22
|
+
["publish", "publishing", "publicar", "publicacao"],
|
|
23
|
+
["author", "autoria", "autoral"],
|
|
24
|
+
["chapter", "chapters", "capitulo", "capitulos"],
|
|
25
|
+
["research", "pesquisa", "pesquisar"],
|
|
26
|
+
["proposal", "proposals", "proposta", "propostas"],
|
|
27
|
+
["conversation", "conversations", "conversa", "conversas"],
|
|
28
|
+
["operation", "operations", "operacao", "operacoes", "ops"],
|
|
29
|
+
["portability", "portable", "portar", "portabilidade", "converter"],
|
|
30
|
+
["migration", "migrate", "migrar", "migracao", "upgrade"],
|
|
31
|
+
["provenance", "proveniencia", "linhagem", "license", "licenca"],
|
|
32
|
+
["evidence", "evidencia", "prova", "evidencias"],
|
|
33
|
+
["timeline", "timebase", "temporal", "4d"],
|
|
34
|
+
["camera", "shot", "cameras", "enquadramento"],
|
|
35
|
+
["physics", "fisica", "colisao", "collision"],
|
|
36
|
+
["worker", "workers", "distribuido", "distribuidos"],
|
|
37
|
+
["checkpoint", "retomar", "retomada", "recovery"],
|
|
38
|
+
];
|
|
39
|
+
const TOKEN_CANONICO = new Map();
|
|
40
|
+
for (const grupo of TOKEN_EQUIVALENCES) {
|
|
41
|
+
const canonico = grupo[0];
|
|
42
|
+
for (const token of grupo)
|
|
43
|
+
TOKEN_CANONICO.set(token, canonico);
|
|
44
|
+
}
|
|
45
|
+
function normalizarBase(valor) {
|
|
46
|
+
return valor
|
|
47
|
+
.normalize("NFD")
|
|
48
|
+
.replace(/[\u0300-\u036f]/gu, "")
|
|
49
|
+
.toLowerCase()
|
|
50
|
+
.replace(/[^a-z0-9]+/gu, " ")
|
|
51
|
+
.trim()
|
|
52
|
+
.replace(/\s+/gu, " ");
|
|
53
|
+
}
|
|
54
|
+
function tokenCanonico(token) {
|
|
55
|
+
return TOKEN_CANONICO.get(token) ?? token;
|
|
56
|
+
}
|
|
57
|
+
export function normalizarIntencaoDescoberta(valor) {
|
|
58
|
+
return normalizarBase(valor)
|
|
59
|
+
.split(" ")
|
|
60
|
+
.filter(Boolean)
|
|
61
|
+
.map(tokenCanonico)
|
|
62
|
+
.join(" ");
|
|
63
|
+
}
|
|
64
|
+
function tokens(valor) {
|
|
65
|
+
const normalizado = normalizarIntencaoDescoberta(valor);
|
|
66
|
+
return normalizado ? normalizado.split(" ") : [];
|
|
67
|
+
}
|
|
68
|
+
function contemSinal(tokensIntencao, sinal) {
|
|
69
|
+
const tokensSinal = tokens(sinal);
|
|
70
|
+
return tokensSinal.length > 0 && tokensSinal.every((token) => tokensIntencao.has(token));
|
|
71
|
+
}
|
|
72
|
+
function possuiAlgum(tokensIntencao, termos) {
|
|
73
|
+
return termos.some((termo) => tokens(termo).some((token) => tokensIntencao.has(token)));
|
|
74
|
+
}
|
|
75
|
+
function adicionarUnico(lista, valor) {
|
|
76
|
+
if (!lista.includes(valor))
|
|
77
|
+
lista.push(valor);
|
|
78
|
+
}
|
|
79
|
+
function comandoLiteral(template) {
|
|
80
|
+
return normalizarIntencaoDescoberta(template.replace(/<[^>]+>/gu, " "));
|
|
81
|
+
}
|
|
82
|
+
function matchExato(entry, intencaoNormalizada) {
|
|
83
|
+
const ids = [entry.id, ...(entry.aliases ?? [])].map(normalizarIntencaoDescoberta);
|
|
84
|
+
if (ids.includes(intencaoNormalizada))
|
|
85
|
+
return true;
|
|
86
|
+
if (!intencaoNormalizada.startsWith("sema "))
|
|
87
|
+
return false;
|
|
88
|
+
return entry.commandTemplates.some((item) => {
|
|
89
|
+
const literal = comandoLiteral(item.command);
|
|
90
|
+
return literal.length > 0 && intencaoNormalizada.startsWith(literal);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
function pontuar(entry, intencao) {
|
|
94
|
+
const intencaoNormalizada = normalizarIntencaoDescoberta(intencao);
|
|
95
|
+
const tokensIntencao = new Set(tokens(intencao));
|
|
96
|
+
if (matchExato(entry, intencaoNormalizada)) {
|
|
97
|
+
return {
|
|
98
|
+
entry,
|
|
99
|
+
score: 100,
|
|
100
|
+
matchedSignals: [entry.id],
|
|
101
|
+
reasons: ["identificador, alias ou namespace de comando corresponde exatamente"],
|
|
102
|
+
exact: true,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
let score = 0;
|
|
106
|
+
const matchedSignals = [];
|
|
107
|
+
const reasons = [];
|
|
108
|
+
let pontosSinais = 0;
|
|
109
|
+
const sinaisCanonicos = new Set();
|
|
110
|
+
for (const sinal of entry.intentSignals) {
|
|
111
|
+
if (!contemSinal(tokensIntencao, sinal))
|
|
112
|
+
continue;
|
|
113
|
+
const sinalCanonico = normalizarIntencaoDescoberta(sinal);
|
|
114
|
+
if (sinaisCanonicos.has(sinalCanonico))
|
|
115
|
+
continue;
|
|
116
|
+
sinaisCanonicos.add(sinalCanonico);
|
|
117
|
+
const quantidade = tokens(sinal).length;
|
|
118
|
+
pontosSinais = Math.min(40, pontosSinais + (quantidade > 1 ? 30 : 10));
|
|
119
|
+
adicionarUnico(matchedSignals, sinal);
|
|
120
|
+
}
|
|
121
|
+
if (pontosSinais > 0) {
|
|
122
|
+
score += pontosSinais;
|
|
123
|
+
reasons.push(`sinais positivos do catálogo: +${pontosSinais}`);
|
|
124
|
+
}
|
|
125
|
+
const alias = (entry.aliases ?? []).find((item) => contemSinal(tokensIntencao, item));
|
|
126
|
+
if (alias) {
|
|
127
|
+
score += 20;
|
|
128
|
+
adicionarUnico(matchedSignals, alias);
|
|
129
|
+
reasons.push("alias explícito da capacidade: +20");
|
|
130
|
+
}
|
|
131
|
+
const domain = entry.domains.find((item) => contemSinal(tokensIntencao, item));
|
|
132
|
+
if (domain) {
|
|
133
|
+
score += 20;
|
|
134
|
+
adicionarUnico(matchedSignals, domain);
|
|
135
|
+
reasons.push("domínio da capacidade corresponde à intenção: +20");
|
|
136
|
+
}
|
|
137
|
+
const modoValidacao = possuiAlgum(tokensIntencao, ["validar", "auditar", "contrato", "artefato", "aderencia"]);
|
|
138
|
+
const modoPipeline = possuiAlgum(tokensIntencao, [
|
|
139
|
+
"pipeline", "estagios", "dag", "multicanal", "multi-formato", "adapters", "ledger", "publicar",
|
|
140
|
+
]);
|
|
141
|
+
if (modoValidacao && entry.kind === "PROFILE_GATE") {
|
|
142
|
+
score += 20;
|
|
143
|
+
reasons.push("intenção pede gate de validação: +20");
|
|
144
|
+
}
|
|
145
|
+
if (modoPipeline && entry.kind === "ORCHESTRATION_PIPELINE") {
|
|
146
|
+
score += 30;
|
|
147
|
+
reasons.push("intenção pede orquestração multietapas: +30");
|
|
148
|
+
}
|
|
149
|
+
if (modoValidacao && !modoPipeline && entry.kind === "ORCHESTRATION_PIPELINE" && !entry.id.startsWith("interactive.")) {
|
|
150
|
+
score -= 20;
|
|
151
|
+
reasons.push("pedido de validação sem estágios explícitos: -20");
|
|
152
|
+
}
|
|
153
|
+
const aplicarModoEspecifico = (id, termos, motivo) => {
|
|
154
|
+
const correspondencias = new Set(termos
|
|
155
|
+
.filter((termo) => contemSinal(tokensIntencao, termo))
|
|
156
|
+
.map(normalizarIntencaoDescoberta)).size;
|
|
157
|
+
if (entry.id === id && correspondencias > 0) {
|
|
158
|
+
const base = entry.id.startsWith("interactive.") ? 60 : 30;
|
|
159
|
+
const pontos = Math.min(80, base + ((correspondencias - 1) * 10));
|
|
160
|
+
score += pontos;
|
|
161
|
+
reasons.push(`${motivo}: +${pontos}`);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
aplicarModoEspecifico("workflow.author", ["romance", "conto", "roteiro", "lore", "capitulos", "continuidade", "personagem"], "workflow narrativo especializado");
|
|
165
|
+
aplicarModoEspecifico("profile.workflow", ["webhook", "cron", "n8n", "fila", "automacao"], "domínio de automação e workflow");
|
|
166
|
+
aplicarModoEspecifico("profile.ops", ["deploy", "rollback", "runbook", "healthcheck", "incidente", "oncall"], "domínio operacional");
|
|
167
|
+
aplicarModoEspecifico("profile.game", ["loop", "jogador", "balanceamento", "playtest", "telemetria", "jogo"], "gate de game design");
|
|
168
|
+
aplicarModoEspecifico("profile.legal", ["lei", "juridico", "lgpd", "compliance", "dpa", "privacidade"], "gate legal");
|
|
169
|
+
aplicarModoEspecifico("profile.research", ["fontes", "evidencia", "metodo", "incerteza", "pesquisa"], "gate de pesquisa");
|
|
170
|
+
aplicarModoEspecifico("profile.redacao", ["seo", "materia", "blog", "editorial", "redacao"], "gate editorial");
|
|
171
|
+
aplicarModoEspecifico("profile.propostas", ["proposta", "orcamento", "cliente", "freela", "marketplace"], "gate comercial");
|
|
172
|
+
aplicarModoEspecifico("profile.conversas", ["atendimento", "chatbot", "objecao", "retencao", "conversa"], "gate conversacional");
|
|
173
|
+
aplicarModoEspecifico("profile.software", ["api", "codigo", "refactor", "security", "persistencia"], "gate de software");
|
|
174
|
+
aplicarModoEspecifico("interactive.experience_ir", ["experience ir", "grafo", "scene", "cena", "content addressed", "ids semanticos"], "grafo portavel de experiencia");
|
|
175
|
+
aplicarModoEspecifico("interactive.observe", ["detect", "probe", "snapshot", "diff", "inspecionar engine"], "observacao read-only de engine");
|
|
176
|
+
aplicarModoEspecifico("interactive.asset_provenance", ["proveniencia", "licenca", "linhagem", "asset"], "proveniencia de assets");
|
|
177
|
+
aplicarModoEspecifico("interactive.editor_state", ["editor state", "nao salvo", "shaders", "imports", "modal"], "estado recuperavel do editor");
|
|
178
|
+
aplicarModoEspecifico("interactive.evidence_capture", ["evidencia", "depth", "normals", "object id", "motion vectors", "telemetria"], "captura multimodal de evidencia");
|
|
179
|
+
aplicarModoEspecifico("interactive.job_recovery", ["lock", "heartbeat", "checkpoint", "retomar", "recovery"], "job com checkpoint e retomada");
|
|
180
|
+
aplicarModoEspecifico("interactive.acceptance_lock", ["aprovou", "aceite", "nao mexa", "regressao"], "aceite humano ligado a hash e intervalo");
|
|
181
|
+
aplicarModoEspecifico("interactive.temporal_validate", ["timeline", "4d", "timebase", "sincronizar", "legenda", "fala", "qa temporal", "validar timeline camera fisica qa"], "contrato temporal multimodal");
|
|
182
|
+
aplicarModoEspecifico("interactive.shot_validate", ["camera", "shot", "enquadramento", "sujeito visivel"], "contrato de camera e shot");
|
|
183
|
+
aplicarModoEspecifico("interactive.physics_validate", ["fisica", "colisao", "attachment", "separacao", "constraint"], "relacoes fisicas verificaveis");
|
|
184
|
+
aplicarModoEspecifico("interactive.temporal_qa", ["flicker", "ghosting", "popping", "exposicao", "jitter"], "QA temporal visual");
|
|
185
|
+
aplicarModoEspecifico("interactive.clean_install_smoke", ["instalacao limpa", "clean install", "pacote", "launch", "smoke"], "instalacao limpa e smoke do pacote");
|
|
186
|
+
aplicarModoEspecifico("interactive.hardware_budget", ["hardware", "fps", "frame time", "ram", "vram", "rtx"], "budget por hardware");
|
|
187
|
+
aplicarModoEspecifico("interactive.autonomous_repair", ["diagnosticar", "propor patch", "simular", "provar", "reparo autonomo"], "reparo autonomo seguro");
|
|
188
|
+
aplicarModoEspecifico("interactive.bot_playtest", ["bot", "bots", "playtest automatico", "seed"], "playtest por bots seeded");
|
|
189
|
+
aplicarModoEspecifico("interactive.state_fuzz", ["fuzz", "save", "load", "corrupcao", "state"], "fuzz bounded de estado");
|
|
190
|
+
aplicarModoEspecifico("interactive.multiplayer_authority", ["autoridade", "replicacao", "server authoritative", "reconnect", "anti replay"], "autoridade multiplayer");
|
|
191
|
+
aplicarModoEspecifico("interactive.engine_migration", ["migrar", "migracao", "upgrade", "versao da engine"], "migracao versionada de engine");
|
|
192
|
+
aplicarModoEspecifico("interactive.portability", ["portar", "portabilidade", "converter entre engines", "perdas", "unreal unity godot"], "portabilidade com perdas declaradas");
|
|
193
|
+
aplicarModoEspecifico("interactive.distributed_jobs", ["workers", "distribuido", "cook", "shaders", "render distribuido"], "workers distribuidos");
|
|
194
|
+
const pedidoCalibracaoDeSimulacao = contemSinal(tokensIntencao, "simulation calibrate");
|
|
195
|
+
if (pedidoCalibracaoDeSimulacao && entry.id === "simulation.calibrate") {
|
|
196
|
+
score += 25;
|
|
197
|
+
reasons.push("calibracao pertence ao pipeline especializado de simulacao: +25");
|
|
198
|
+
}
|
|
199
|
+
else if (pedidoCalibracaoDeSimulacao && entry.id === "interactive.calibrate") {
|
|
200
|
+
score -= 15;
|
|
201
|
+
reasons.push("calibracao transversal perde para simulacao explicitamente declarada: -15");
|
|
202
|
+
}
|
|
203
|
+
if (entry.id === "pipeline.content"
|
|
204
|
+
&& possuiAlgum(tokensIntencao, ["trailer", "thumbnail", "post", "multicanal", "publicar", "conteudo"])) {
|
|
205
|
+
score += 20;
|
|
206
|
+
reasons.push("pipeline de conteúdo: +20");
|
|
207
|
+
}
|
|
208
|
+
const quantidadeFormatosConteudo = ["trailer", "thumbnail", "post", "video", "imagem", "texto"]
|
|
209
|
+
.filter((formato) => possuiAlgum(tokensIntencao, [formato]))
|
|
210
|
+
.length;
|
|
211
|
+
if (quantidadeFormatosConteudo >= 2 && entry.id === "pipeline.content") {
|
|
212
|
+
score += 30;
|
|
213
|
+
reasons.push("múltiplos formatos de conteúdo exigem pipeline: +30");
|
|
214
|
+
}
|
|
215
|
+
else if (quantidadeFormatosConteudo >= 2 && entry.kind === "PROFILE_GATE") {
|
|
216
|
+
score -= 30;
|
|
217
|
+
reasons.push("profile isolado não orquestra múltiplos formatos: -30");
|
|
218
|
+
}
|
|
219
|
+
if (entry.id === "profile.simulation"
|
|
220
|
+
&& possuiAlgum(tokensIntencao, ["calibrar", "batch", "autonomo", "safety", "incerteza"])) {
|
|
221
|
+
score -= 25;
|
|
222
|
+
reasons.push("capacidade específica de simulação disponível: -25");
|
|
223
|
+
}
|
|
224
|
+
if ((entry.kind === "ORCHESTRATION_PIPELINE" || entry.kind === "CAPABILITY_TOKEN")
|
|
225
|
+
&& entry.domains.includes("sistemas-interativos")
|
|
226
|
+
&& possuiAlgum(tokensIntencao, ["simulador", "simulacao", "jogo", "interativo", "autonomo", "multiplayer", "replay"])) {
|
|
227
|
+
score += 25;
|
|
228
|
+
reasons.push("domínio de sistema interativo: +25");
|
|
229
|
+
}
|
|
230
|
+
const pedidoTemporalComposto = ["timeline", "camera", "physics", "qa"]
|
|
231
|
+
.every((token) => tokensIntencao.has(token));
|
|
232
|
+
if (pedidoTemporalComposto
|
|
233
|
+
&& ["interactive.shot_validate", "interactive.physics_validate", "interactive.temporal_qa"].includes(entry.id)) {
|
|
234
|
+
score -= 25;
|
|
235
|
+
reasons.push("subvalidador isolado perde para o contrato temporal composto: -25");
|
|
236
|
+
}
|
|
237
|
+
if (entry.kind === "GENERATOR") {
|
|
238
|
+
const alvo = entry.id.slice("generator.".length);
|
|
239
|
+
if (possuiAlgum(tokensIntencao, ["gerar", "compilar", "codigo"]) && contemSinal(tokensIntencao, alvo)) {
|
|
240
|
+
score += 30;
|
|
241
|
+
reasons.push("geração e alvo foram declarados: +30");
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
let penalidade = 0;
|
|
245
|
+
for (const sinal of entry.negativeSignals) {
|
|
246
|
+
if (!contemSinal(tokensIntencao, sinal))
|
|
247
|
+
continue;
|
|
248
|
+
penalidade += 25;
|
|
249
|
+
adicionarUnico(matchedSignals, `-${sinal}`);
|
|
250
|
+
}
|
|
251
|
+
if (penalidade > 0) {
|
|
252
|
+
score -= penalidade;
|
|
253
|
+
reasons.push(`sinais negativos do catálogo: -${penalidade}`);
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
entry,
|
|
257
|
+
score: Math.max(0, Math.min(100, score)),
|
|
258
|
+
matchedSignals,
|
|
259
|
+
reasons: reasons.length > 0 ? reasons : ["nenhum sinal suficiente encontrado"],
|
|
260
|
+
exact: false,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
export function recomendarCapacidadePorIntencao(intencao, limite = 5) {
|
|
264
|
+
if (typeof intencao !== "string" || intencao.trim().length === 0) {
|
|
265
|
+
throw new TypeError("discovery_intencao_obrigatoria");
|
|
266
|
+
}
|
|
267
|
+
if (!Number.isInteger(limite) || limite < 1 || limite > 10) {
|
|
268
|
+
throw new RangeError("discovery_limite_invalido");
|
|
269
|
+
}
|
|
270
|
+
const pontuadas = montarCatalogoCapacidades().entries
|
|
271
|
+
.map((entry) => pontuar(entry, intencao))
|
|
272
|
+
.sort((a, b) => b.score - a.score || a.entry.id.localeCompare(b.entry.id));
|
|
273
|
+
const exatas = pontuadas.filter((item) => item.exact);
|
|
274
|
+
const ordenadas = exatas.length > 0 ? exatas : pontuadas.filter((item) => item.score > 0);
|
|
275
|
+
const top = ordenadas[0];
|
|
276
|
+
const segunda = ordenadas[1];
|
|
277
|
+
const noMatch = !top || top.score < 60;
|
|
278
|
+
const delta = top && segunda ? top.score - segunda.score : null;
|
|
279
|
+
const ambiguityDetected = !noMatch && delta !== null && delta <= 7;
|
|
280
|
+
const candidatas = ordenadas.slice(0, limite);
|
|
281
|
+
const recommendations = candidatas.map((item, indice) => ({
|
|
282
|
+
rank: indice + 1,
|
|
283
|
+
id: item.entry.id,
|
|
284
|
+
kind: item.entry.kind,
|
|
285
|
+
label: item.entry.label,
|
|
286
|
+
score: item.score,
|
|
287
|
+
matchedSignals: [...item.matchedSignals],
|
|
288
|
+
reasons: [...item.reasons],
|
|
289
|
+
missingInputs: [...item.entry.requiredInputs],
|
|
290
|
+
suggestedCommandTemplate: !noMatch && !ambiguityDetected && indice === 0
|
|
291
|
+
? item.entry.commandTemplates[0]?.command ?? null
|
|
292
|
+
: null,
|
|
293
|
+
}));
|
|
294
|
+
return {
|
|
295
|
+
schemaVersion: DISCOVERY_SCHEMA_VERSION,
|
|
296
|
+
command: "descobrir recomendar",
|
|
297
|
+
success: true,
|
|
298
|
+
mode: "ranking",
|
|
299
|
+
...EXECUTION_BOUNDARY,
|
|
300
|
+
intent: redigirTextoControladoDescoberta(intencao.trim()),
|
|
301
|
+
recommendations,
|
|
302
|
+
ambiguity: {
|
|
303
|
+
detected: ambiguityDetected,
|
|
304
|
+
delta,
|
|
305
|
+
candidates: ambiguityDetected ? ordenadas.slice(0, 2).map((item) => item.entry.id) : [],
|
|
306
|
+
},
|
|
307
|
+
noMatch,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=ranker.js.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// SEMA-GOVERNED: sema.produto.descoberta_capacidades
|
|
2
|
+
// Descrição: redação fail-closed de texto controlado antes de expor payloads públicos de descoberta.
|
|
3
|
+
const MARCADOR_REDAÇÃO = "[REDACTED]";
|
|
4
|
+
const PADRÕES_SENSÍVEIS = [
|
|
5
|
+
/\bBearer\s+\S+/iu,
|
|
6
|
+
/-----BEGIN\s+(?:RSA\s+|EC\s+|OPENSSH\s+)?PRIVATE\s+KEY-----/iu,
|
|
7
|
+
/\b(?:sk|ghp|gho|ghu|ghs|github_pat|xoxb|xoxp|xoxa|xoxr|AIza)[_-][A-Za-z0-9_-]{8,}\b/u,
|
|
8
|
+
/\b(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key|password|senha)\b\s*[:=]\s*\S+/iu,
|
|
9
|
+
/(?:^|\s)[A-Za-z]:[\\/][^\r\n]*/u,
|
|
10
|
+
/(?:^|\s)\\\\[^\\\s]+\\[^\s]+/u,
|
|
11
|
+
/(?:^|\s)\/(?:Users|home|root|var|etc|opt|srv|tmp)\/[^\s]*/u,
|
|
12
|
+
];
|
|
13
|
+
export function contémTextoSensívelDescoberta(valor) {
|
|
14
|
+
return PADRÕES_SENSÍVEIS.some((padrão) => padrão.test(valor));
|
|
15
|
+
}
|
|
16
|
+
export function redigirTextoControladoDescoberta(valor) {
|
|
17
|
+
if (valor === null)
|
|
18
|
+
return null;
|
|
19
|
+
return contémTextoSensívelDescoberta(valor) ? MARCADOR_REDAÇÃO : valor;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=redaction.js.map
|