@kubbisec/ai-linux-arm64 0.1.8 → 0.1.10
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/bin/kubbisec +0 -0
- package/bundled/assets/terminal/wordmark-inline.ansi +1 -0
- package/bundled/assets/terminal/wordmark.ansi +4 -0
- package/bundled/assets/terminal/wordmark.png +0 -0
- package/bundled/clarify/clarify-gate-state.d.ts +3 -0
- package/bundled/clarify/clarify-gate-state.d.ts.map +1 -0
- package/bundled/clarify/clarify-gate-state.js +9 -0
- package/bundled/clarify/clarify-gate-state.js.map +1 -0
- package/bundled/clarify/clarify-gate.d.ts +2 -1
- package/bundled/clarify/clarify-gate.d.ts.map +1 -1
- package/bundled/clarify/clarify-gate.js +17 -4
- package/bundled/clarify/clarify-gate.js.map +1 -1
- package/bundled/clarify/clarify-select-panel.d.ts +14 -0
- package/bundled/clarify/clarify-select-panel.d.ts.map +1 -0
- package/bundled/clarify/clarify-select-panel.js +82 -0
- package/bundled/clarify/clarify-select-panel.js.map +1 -0
- package/bundled/clarify/clarify-ui-state.d.ts +10 -1
- package/bundled/clarify/clarify-ui-state.d.ts.map +1 -1
- package/bundled/clarify/clarify-ui-state.js +24 -3
- package/bundled/clarify/clarify-ui-state.js.map +1 -1
- package/bundled/clarify/parse-clarify-answer.d.ts +6 -1
- package/bundled/clarify/parse-clarify-answer.d.ts.map +1 -1
- package/bundled/clarify/parse-clarify-answer.js +35 -2
- package/bundled/clarify/parse-clarify-answer.js.map +1 -1
- package/bundled/clarify/question-format.d.ts +7 -4
- package/bundled/clarify/question-format.d.ts.map +1 -1
- package/bundled/clarify/question-format.js +26 -33
- package/bundled/clarify/question-format.js.map +1 -1
- package/bundled/clarify/questionnaire-tool.d.ts.map +1 -1
- package/bundled/clarify/questionnaire-tool.js +16 -9
- package/bundled/clarify/questionnaire-tool.js.map +1 -1
- package/bundled/clarify/scope-discovery.d.ts +10 -0
- package/bundled/clarify/scope-discovery.d.ts.map +1 -0
- package/bundled/clarify/scope-discovery.js +130 -0
- package/bundled/clarify/scope-discovery.js.map +1 -0
- package/bundled/clarify/session-questionnaire.d.ts +4 -1
- package/bundled/clarify/session-questionnaire.d.ts.map +1 -1
- package/bundled/clarify/session-questionnaire.js +59 -4
- package/bundled/clarify/session-questionnaire.js.map +1 -1
- package/bundled/clarify/session-questionnaire.types.d.ts +2 -0
- package/bundled/clarify/session-questionnaire.types.d.ts.map +1 -1
- package/bundled/clarify/session-questionnaire.types.js.map +1 -1
- package/bundled/config/detect-local-llm-providers.d.ts +33 -0
- package/bundled/config/detect-local-llm-providers.d.ts.map +1 -0
- package/bundled/config/detect-local-llm-providers.js +173 -0
- package/bundled/config/detect-local-llm-providers.js.map +1 -0
- package/bundled/config/ensure-kubbisec-project-settings.d.ts +8 -0
- package/bundled/config/ensure-kubbisec-project-settings.d.ts.map +1 -1
- package/bundled/config/ensure-kubbisec-project-settings.js +31 -0
- package/bundled/config/ensure-kubbisec-project-settings.js.map +1 -1
- package/bundled/config/extended-context.d.ts +12 -0
- package/bundled/config/extended-context.d.ts.map +1 -0
- package/bundled/config/extended-context.js +37 -0
- package/bundled/config/extended-context.js.map +1 -0
- package/bundled/config/format-kubbisec-footer-status.d.ts.map +1 -1
- package/bundled/config/format-kubbisec-footer-status.js +10 -1
- package/bundled/config/format-kubbisec-footer-status.js.map +1 -1
- package/bundled/config/kubbisec-extension-manifest.d.ts +3 -0
- package/bundled/config/kubbisec-extension-manifest.d.ts.map +1 -0
- package/bundled/config/kubbisec-extension-manifest.js +23 -0
- package/bundled/config/kubbisec-extension-manifest.js.map +1 -0
- package/bundled/config/llm-config-mutations.d.ts +38 -0
- package/bundled/config/llm-config-mutations.d.ts.map +1 -0
- package/bundled/config/llm-config-mutations.js +207 -0
- package/bundled/config/llm-config-mutations.js.map +1 -0
- package/bundled/config/llm-config.d.ts +64 -0
- package/bundled/config/llm-config.d.ts.map +1 -0
- package/bundled/config/llm-config.js +236 -0
- package/bundled/config/llm-config.js.map +1 -0
- package/bundled/config/llm-provider-catalog.d.ts +22 -0
- package/bundled/config/llm-provider-catalog.d.ts.map +1 -0
- package/bundled/config/llm-provider-catalog.js +42 -0
- package/bundled/config/llm-provider-catalog.js.map +1 -0
- package/bundled/config/materialize-kubbisec-pi-resources.d.ts +13 -0
- package/bundled/config/materialize-kubbisec-pi-resources.d.ts.map +1 -0
- package/bundled/config/materialize-kubbisec-pi-resources.js +171 -0
- package/bundled/config/materialize-kubbisec-pi-resources.js.map +1 -0
- package/bundled/config/register-custom-llm-providers.d.ts +13 -0
- package/bundled/config/register-custom-llm-providers.d.ts.map +1 -0
- package/bundled/config/register-custom-llm-providers.js +21 -0
- package/bundled/config/register-custom-llm-providers.js.map +1 -0
- package/bundled/config/register-kubbisec-llm-provider.d.ts +14 -0
- package/bundled/config/register-kubbisec-llm-provider.d.ts.map +1 -0
- package/bundled/config/register-kubbisec-llm-provider.js +53 -0
- package/bundled/config/register-kubbisec-llm-provider.js.map +1 -0
- package/bundled/config/sync-kubbisec-pi-models.d.ts +12 -0
- package/bundled/config/sync-kubbisec-pi-models.d.ts.map +1 -0
- package/bundled/config/sync-kubbisec-pi-models.js +80 -0
- package/bundled/config/sync-kubbisec-pi-models.js.map +1 -0
- package/bundled/copy/cli-reference-index.d.ts +6 -0
- package/bundled/copy/cli-reference-index.d.ts.map +1 -0
- package/bundled/copy/cli-reference-index.js +42 -0
- package/bundled/copy/cli-reference-index.js.map +1 -0
- package/bundled/copy/kubbisec-shell-copy.d.ts +15 -2
- package/bundled/copy/kubbisec-shell-copy.d.ts.map +1 -1
- package/bundled/copy/kubbisec-shell-copy.js +15 -2
- package/bundled/copy/kubbisec-shell-copy.js.map +1 -1
- package/bundled/extensions/cli-local-shared.d.ts +31 -11
- package/bundled/extensions/cli-local-shared.d.ts.map +1 -1
- package/bundled/extensions/cli-local-shared.js +56 -10
- package/bundled/extensions/cli-local-shared.js.map +1 -1
- package/bundled/extensions/kubbisec-aspm-local.extension.d.ts +1 -0
- package/bundled/extensions/kubbisec-aspm-local.extension.d.ts.map +1 -1
- package/bundled/extensions/kubbisec-aspm-local.extension.js +32 -44
- package/bundled/extensions/kubbisec-aspm-local.extension.js.map +1 -1
- package/bundled/extensions/kubbisec-brand.extension.d.ts +2 -19
- package/bundled/extensions/kubbisec-brand.extension.d.ts.map +1 -1
- package/bundled/extensions/kubbisec-brand.extension.js +21 -73
- package/bundled/extensions/kubbisec-brand.extension.js.map +1 -1
- package/bundled/extensions/kubbisec-byok-provider.extension.d.ts +3 -27
- package/bundled/extensions/kubbisec-byok-provider.extension.d.ts.map +1 -1
- package/bundled/extensions/kubbisec-byok-provider.extension.js +2 -48
- package/bundled/extensions/kubbisec-byok-provider.extension.js.map +1 -1
- package/bundled/extensions/kubbisec-clarify.extension.d.ts +6 -1
- package/bundled/extensions/kubbisec-clarify.extension.d.ts.map +1 -1
- package/bundled/extensions/kubbisec-clarify.extension.js +124 -68
- package/bundled/extensions/kubbisec-clarify.extension.js.map +1 -1
- package/bundled/extensions/kubbisec-exit.extension.d.ts +3 -0
- package/bundled/extensions/kubbisec-exit.extension.d.ts.map +1 -0
- package/bundled/extensions/kubbisec-exit.extension.js +38 -0
- package/bundled/extensions/kubbisec-exit.extension.js.map +1 -0
- package/bundled/extensions/kubbisec-extended-context.extension.d.ts +6 -0
- package/bundled/extensions/kubbisec-extended-context.extension.d.ts.map +1 -0
- package/bundled/extensions/kubbisec-extended-context.extension.js +50 -0
- package/bundled/extensions/kubbisec-extended-context.extension.js.map +1 -0
- package/bundled/extensions/kubbisec-footer.extension.d.ts +16 -61
- package/bundled/extensions/kubbisec-footer.extension.d.ts.map +1 -1
- package/bundled/extensions/kubbisec-footer.extension.js +143 -74
- package/bundled/extensions/kubbisec-footer.extension.js.map +1 -1
- package/bundled/extensions/kubbisec-github-local.extension.d.ts.map +1 -1
- package/bundled/extensions/kubbisec-github-local.extension.js +52 -22
- package/bundled/extensions/kubbisec-github-local.extension.js.map +1 -1
- package/bundled/extensions/kubbisec-llm-config.extension.d.ts +3 -0
- package/bundled/extensions/kubbisec-llm-config.extension.d.ts.map +1 -0
- package/bundled/extensions/kubbisec-llm-config.extension.js +211 -0
- package/bundled/extensions/kubbisec-llm-config.extension.js.map +1 -0
- package/bundled/extensions/kubbisec-naus-local.extension.d.ts +1 -0
- package/bundled/extensions/kubbisec-naus-local.extension.d.ts.map +1 -1
- package/bundled/extensions/kubbisec-naus-local.extension.js +54 -58
- package/bundled/extensions/kubbisec-naus-local.extension.js.map +1 -1
- package/bundled/extensions/kubbisec-platform-tools.extension.d.ts.map +1 -1
- package/bundled/extensions/kubbisec-platform-tools.extension.js +57 -16
- package/bundled/extensions/kubbisec-platform-tools.extension.js.map +1 -1
- package/bundled/extensions/kubbisec-skill-mentions.extension.d.ts +1 -0
- package/bundled/extensions/kubbisec-skill-mentions.extension.d.ts.map +1 -1
- package/bundled/extensions/kubbisec-skill-mentions.extension.js +24 -8
- package/bundled/extensions/kubbisec-skill-mentions.extension.js.map +1 -1
- package/bundled/extensions/kubbisec-theme-lock.extension.d.ts +6 -0
- package/bundled/extensions/kubbisec-theme-lock.extension.d.ts.map +1 -0
- package/bundled/extensions/kubbisec-theme-lock.extension.js +43 -0
- package/bundled/extensions/kubbisec-theme-lock.extension.js.map +1 -0
- package/bundled/extensions/kubbisec-ui.extension.d.ts +1 -1
- package/bundled/extensions/kubbisec-ui.extension.d.ts.map +1 -1
- package/bundled/extensions/kubbisec-ui.extension.js +98 -82
- package/bundled/extensions/kubbisec-ui.extension.js.map +1 -1
- package/bundled/extensions/kubbisec-workflow.extension.d.ts.map +1 -1
- package/bundled/extensions/kubbisec-workflow.extension.js +31 -21
- package/bundled/extensions/kubbisec-workflow.extension.js.map +1 -1
- package/bundled/skills/aspm-platform/SKILL.md +55 -25
- package/bundled/skills/at-path-mentions.d.ts +7 -0
- package/bundled/skills/at-path-mentions.d.ts.map +1 -0
- package/bundled/skills/at-path-mentions.js +186 -0
- package/bundled/skills/at-path-mentions.js.map +1 -0
- package/bundled/skills/at-path-mentions.test.ts +64 -0
- package/bundled/skills/at-path-mentions.ts +211 -0
- package/bundled/skills/chat-mention-render.d.ts.map +1 -1
- package/bundled/skills/chat-mention-render.js +69 -31
- package/bundled/skills/chat-mention-render.js.map +1 -1
- package/bundled/skills/chat-mention-render.test.ts +24 -1
- package/bundled/skills/chat-mention-render.ts +87 -34
- package/bundled/skills/chat-mentions.d.ts +3 -2
- package/bundled/skills/chat-mentions.d.ts.map +1 -1
- package/bundled/skills/chat-mentions.js +9 -3
- package/bundled/skills/chat-mentions.js.map +1 -1
- package/bundled/skills/chat-mentions.test.ts +12 -5
- package/bundled/skills/chat-mentions.ts +12 -3
- package/bundled/skills/naus-pipelines/SKILL.md +111 -16
- package/bundled/skills/sec-clarify/SKILL.md +8 -23
- package/bundled/skills/sec-using-skills/SKILL.md +2 -0
- package/bundled/theme/clear-terminal.d.ts +3 -0
- package/bundled/theme/clear-terminal.d.ts.map +1 -0
- package/bundled/theme/clear-terminal.js +7 -0
- package/bundled/theme/clear-terminal.js.map +1 -0
- package/bundled/theme/footer-render-hook.d.ts +3 -0
- package/bundled/theme/footer-render-hook.d.ts.map +1 -0
- package/bundled/theme/footer-render-hook.js +8 -0
- package/bundled/theme/footer-render-hook.js.map +1 -0
- package/bundled/theme/kubbisec-brand-fg.d.ts +4 -0
- package/bundled/theme/kubbisec-brand-fg.d.ts.map +1 -0
- package/bundled/theme/kubbisec-brand-fg.js +7 -0
- package/bundled/theme/kubbisec-brand-fg.js.map +1 -0
- package/bundled/theme/kubbisec-menu-themes.d.ts +16 -0
- package/bundled/theme/kubbisec-menu-themes.d.ts.map +1 -0
- package/bundled/theme/kubbisec-menu-themes.js +47 -0
- package/bundled/theme/kubbisec-menu-themes.js.map +1 -0
- package/bundled/theme/kubbisec-theme-name.d.ts +2 -0
- package/bundled/theme/kubbisec-theme-name.d.ts.map +1 -0
- package/bundled/theme/kubbisec-theme-name.js +2 -0
- package/bundled/theme/kubbisec-theme-name.js.map +1 -0
- package/bundled/theme/patch-pi-settings-theme.runtime.d.ts +3 -0
- package/bundled/theme/patch-pi-settings-theme.runtime.d.ts.map +1 -0
- package/bundled/theme/patch-pi-settings-theme.runtime.js +16 -0
- package/bundled/theme/patch-pi-settings-theme.runtime.js.map +1 -0
- package/bundled/theme/render-compact-header.d.ts +21 -0
- package/bundled/theme/render-compact-header.d.ts.map +1 -0
- package/bundled/theme/render-compact-header.js +198 -0
- package/bundled/theme/render-compact-header.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,27 +1,29 @@
|
|
|
1
|
-
const OPTION_IDS = ["A", "B", "C"
|
|
2
|
-
|
|
1
|
+
const OPTION_IDS = ["A", "B", "C"];
|
|
2
|
+
const OTHER_OPTION_ID = "D";
|
|
3
|
+
const MULTI_SELECT_FIELDS = new Set(["severityMin", "scanners", "findingTypes"]);
|
|
4
|
+
/** Build a compact structured question (max 3 choices + Outro). */
|
|
3
5
|
export function formatClarifyQuestionMarkdown(input) {
|
|
4
6
|
const lines = [input.question.trim(), ""];
|
|
5
|
-
for (const opt of input.options.slice(0,
|
|
7
|
+
for (const opt of input.options.slice(0, 3)) {
|
|
6
8
|
lines.push(`${opt.id}) ${opt.label}`);
|
|
7
9
|
}
|
|
8
|
-
const otherLabel = input.language === "en"
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
? "Reply with a letter (A–E) or describe in free text."
|
|
13
|
-
: "Responda com a letra (A–E) ou descreva em texto livre.";
|
|
14
|
-
lines.push(footer);
|
|
10
|
+
const otherLabel = input.language === "en"
|
|
11
|
+
? "Other — type below"
|
|
12
|
+
: "Outro — escreva abaixo";
|
|
13
|
+
lines.push(`${OTHER_OPTION_ID}) ${otherLabel}`);
|
|
15
14
|
return lines.join("\n");
|
|
16
15
|
}
|
|
17
16
|
export function buildOptionsFromLabels(labels) {
|
|
18
|
-
return labels.slice(0,
|
|
19
|
-
id: OPTION_IDS[index] ?? "
|
|
17
|
+
return labels.slice(0, 3).map((label, index) => ({
|
|
18
|
+
id: OPTION_IDS[index] ?? "C",
|
|
20
19
|
label: label.trim(),
|
|
21
20
|
}));
|
|
22
21
|
}
|
|
22
|
+
export function selectionModeForField(field) {
|
|
23
|
+
return MULTI_SELECT_FIELDS.has(field) ? "multi" : "single";
|
|
24
|
+
}
|
|
23
25
|
export function resolveOptionLabel(optionId, optionLabels) {
|
|
24
|
-
if (optionId === "E")
|
|
26
|
+
if (optionId === "D" || optionId === "E")
|
|
25
27
|
return null;
|
|
26
28
|
const index = OPTION_IDS.indexOf(optionId);
|
|
27
29
|
if (index < 0 || index >= optionLabels.length)
|
|
@@ -48,29 +50,19 @@ const SCENARIO_HINTS = {
|
|
|
48
50
|
field: "projectIds",
|
|
49
51
|
purpose: "Projeto/asset alvo",
|
|
50
52
|
exampleQuestion: "Qual projeto KubbiSec devemos remediar?",
|
|
51
|
-
exampleOptions: [
|
|
52
|
-
"Projeto padrão da sessão",
|
|
53
|
-
"Outro projeto",
|
|
54
|
-
"Vários projetos",
|
|
55
|
-
"Listar opções",
|
|
56
|
-
],
|
|
53
|
+
exampleOptions: ["Projeto padrão da sessão", "Outro projeto", "Listar opções"],
|
|
57
54
|
},
|
|
58
55
|
{
|
|
59
56
|
field: "severityMin",
|
|
60
57
|
purpose: "Severidade mínima no escopo",
|
|
61
58
|
exampleQuestion: "Qual severidade mínima entra no escopo?",
|
|
62
|
-
exampleOptions: ["CRITICAL", "HIGH", "MEDIUM"
|
|
59
|
+
exampleOptions: ["CRITICAL", "HIGH", "MEDIUM"],
|
|
63
60
|
},
|
|
64
61
|
{
|
|
65
62
|
field: "remediationMode",
|
|
66
63
|
purpose: "Modo de remediação",
|
|
67
64
|
exampleQuestion: "Como devemos remediar?",
|
|
68
|
-
exampleOptions: [
|
|
69
|
-
"Automático (PR/patch)",
|
|
70
|
-
"Só sugestões",
|
|
71
|
-
"Híbrido",
|
|
72
|
-
"Ainda não definido",
|
|
73
|
-
],
|
|
65
|
+
exampleOptions: ["Automático (PR/patch)", "Só sugestões", "Híbrido"],
|
|
74
66
|
},
|
|
75
67
|
],
|
|
76
68
|
plan: [
|
|
@@ -78,13 +70,13 @@ const SCENARIO_HINTS = {
|
|
|
78
70
|
field: "projectIds",
|
|
79
71
|
purpose: "Projeto/asset",
|
|
80
72
|
exampleQuestion: "Para qual projeto é este plano?",
|
|
81
|
-
exampleOptions: ["Sessão atual", "Outro projeto", "Monorepo"
|
|
73
|
+
exampleOptions: ["Sessão atual", "Outro projeto", "Monorepo"],
|
|
82
74
|
},
|
|
83
75
|
{
|
|
84
76
|
field: "customNotes",
|
|
85
77
|
purpose: "Objetivo do plano",
|
|
86
78
|
exampleQuestion: "Qual é o objetivo principal deste plano?",
|
|
87
|
-
exampleOptions: ["Correção CVE", "Pipeline NAUS", "Hardening"
|
|
79
|
+
exampleOptions: ["Correção CVE", "Pipeline NAUS", "Hardening"],
|
|
88
80
|
},
|
|
89
81
|
],
|
|
90
82
|
explore: [
|
|
@@ -92,7 +84,7 @@ const SCENARIO_HINTS = {
|
|
|
92
84
|
field: "projectIds",
|
|
93
85
|
purpose: "Contexto do projeto",
|
|
94
86
|
exampleQuestion: "Sobre qual projeto quer explorar findings?",
|
|
95
|
-
exampleOptions: ["Padrão", "Outro", "Organização inteira"
|
|
87
|
+
exampleOptions: ["Padrão", "Outro", "Organização inteira"],
|
|
96
88
|
},
|
|
97
89
|
],
|
|
98
90
|
review: [
|
|
@@ -100,7 +92,7 @@ const SCENARIO_HINTS = {
|
|
|
100
92
|
field: "projectIds",
|
|
101
93
|
purpose: "Projeto em revisão",
|
|
102
94
|
exampleQuestion: "Qual projeto estamos a rever?",
|
|
103
|
-
exampleOptions: ["Atual", "Outro", "PR específico"
|
|
95
|
+
exampleOptions: ["Atual", "Outro", "PR específico"],
|
|
104
96
|
},
|
|
105
97
|
],
|
|
106
98
|
};
|
|
@@ -122,7 +114,7 @@ function isFieldFilled(fields, field) {
|
|
|
122
114
|
return Boolean(fields.extras[field]?.trim());
|
|
123
115
|
}
|
|
124
116
|
}
|
|
125
|
-
/** Scenario-aware hints — suggestions only; agent
|
|
117
|
+
/** Scenario-aware hints — suggestions only; agent or auto-ask uses these. */
|
|
126
118
|
export function suggestScenarioFields(scenario, fields) {
|
|
127
119
|
const hints = SCENARIO_HINTS[scenario] ?? SCENARIO_HINTS.remediation;
|
|
128
120
|
const missingFields = hints.map((h) => h.field).filter((field) => !isFieldFilled(fields, field));
|
|
@@ -139,12 +131,13 @@ export function inferScenarioFromMessage(message) {
|
|
|
139
131
|
return "remediation";
|
|
140
132
|
}
|
|
141
133
|
export function formatQuestionFromInput(input) {
|
|
142
|
-
const optionLabels = input.options.map((o) => o.trim()).filter(Boolean).slice(0,
|
|
134
|
+
const optionLabels = input.options.map((o) => o.trim()).filter(Boolean).slice(0, 3);
|
|
143
135
|
const markdown = formatClarifyQuestionMarkdown({
|
|
144
136
|
question: input.question,
|
|
145
137
|
options: buildOptionsFromLabels(optionLabels),
|
|
146
138
|
language: input.language,
|
|
147
139
|
});
|
|
148
|
-
|
|
140
|
+
const selectionMode = input.field ? selectionModeForField(input.field) : "single";
|
|
141
|
+
return { markdown, optionLabels, selectionMode };
|
|
149
142
|
}
|
|
150
143
|
//# sourceMappingURL=question-format.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"question-format.js","sourceRoot":"","sources":["../../src/clarify/question-format.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"question-format.js","sourceRoot":"","sources":["../../src/clarify/question-format.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"questionnaire-tool.d.ts","sourceRoot":"","sources":["../../src/clarify/questionnaire-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"questionnaire-tool.d.ts","sourceRoot":"","sources":["../../src/clarify/questionnaire-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAO7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAQ/D,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,EAC3B,MAAM,kCAAkC,CAAC;AAE1C,MAAM,MAAM,uBAAuB,GAAG,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE/E,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvE,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,uBAAuB,CAAC;IAChC,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,oBAAoB,CAAC;CACrC,CAAC;AAEF,wBAAgB,wBAAwB,CACtC,aAAa,EAAE,oBAAoB,EACnC,KAAK,EAAE,sBAAsB,EAC7B,WAAW,CAAC,EAAE,MAAM,GACnB,uBAAuB,CAoJzB;AAED,wBAAgB,iCAAiC,IAAI,UAAU,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,CAiClF;AAED,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,oBAAoB,EACnC,MAAM,EAAE,aAAa,GACpB,oBAAoB,CAGtB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Type } from "@earendil-works/pi-ai";
|
|
2
|
+
import { syncExtendedContextFromFields } from "../config/extended-context.js";
|
|
2
3
|
import { formatQuestionFromInput, inferScenarioFromMessage, suggestScenarioFields, } from "./question-format.js";
|
|
3
4
|
import { askQuestion, applyPendingAnswer, completeQuestionnaire, hasMinimumRemediationScope, mergeRecordedFields, } from "./session-questionnaire.js";
|
|
4
5
|
export function executeQuestionnaireTool(questionnaire, input, userMessage) {
|
|
@@ -29,7 +30,11 @@ export function executeQuestionnaireTool(questionnaire, input, userMessage) {
|
|
|
29
30
|
};
|
|
30
31
|
}
|
|
31
32
|
if (action === "complete") {
|
|
32
|
-
const
|
|
33
|
+
const mergedFields = input.fields
|
|
34
|
+
? mergeRecordedFields(questionnaire.fields, input.fields)
|
|
35
|
+
: questionnaire.fields;
|
|
36
|
+
syncExtendedContextFromFields(mergedFields);
|
|
37
|
+
const next = completeQuestionnaire(input.fields ? { ...questionnaire, fields: mergedFields } : questionnaire);
|
|
33
38
|
return {
|
|
34
39
|
ok: true,
|
|
35
40
|
action,
|
|
@@ -49,6 +54,7 @@ export function executeQuestionnaireTool(questionnaire, input, userMessage) {
|
|
|
49
54
|
};
|
|
50
55
|
}
|
|
51
56
|
const merged = mergeRecordedFields(questionnaire.fields, input.fields);
|
|
57
|
+
syncExtendedContextFromFields(merged);
|
|
52
58
|
let next = {
|
|
53
59
|
...questionnaire,
|
|
54
60
|
fields: merged,
|
|
@@ -87,16 +93,18 @@ export function executeQuestionnaireTool(questionnaire, input, userMessage) {
|
|
|
87
93
|
questionnaire,
|
|
88
94
|
};
|
|
89
95
|
}
|
|
90
|
-
const { markdown, optionLabels } = formatQuestionFromInput({
|
|
96
|
+
const { markdown, optionLabels, selectionMode } = formatQuestionFromInput({
|
|
91
97
|
question,
|
|
92
98
|
options,
|
|
93
99
|
language: input.language,
|
|
100
|
+
field,
|
|
94
101
|
});
|
|
95
102
|
const next = askQuestion(questionnaire, {
|
|
96
103
|
field,
|
|
97
104
|
questionMarkdown: markdown,
|
|
98
105
|
optionLabels,
|
|
99
106
|
scenario,
|
|
107
|
+
selectionMode,
|
|
100
108
|
});
|
|
101
109
|
return {
|
|
102
110
|
ok: true,
|
|
@@ -105,11 +113,10 @@ export function executeQuestionnaireTool(questionnaire, input, userMessage) {
|
|
|
105
113
|
formattedQuestion: markdown,
|
|
106
114
|
message: [
|
|
107
115
|
`Question queued for field "${field}".`,
|
|
108
|
-
"
|
|
109
|
-
"
|
|
110
|
-
"",
|
|
111
|
-
|
|
112
|
-
].join("\n"),
|
|
116
|
+
"Options are shown in the KubbiSec panel only.",
|
|
117
|
+
"Reply to the user with one short line (e.g. ask them to pick A–E in the panel).",
|
|
118
|
+
"Do not list options or repeat the question body in chat.",
|
|
119
|
+
].join(" "),
|
|
113
120
|
questionnaire: next,
|
|
114
121
|
};
|
|
115
122
|
}
|
|
@@ -132,9 +139,9 @@ export function questionnaireToolParametersSchema() {
|
|
|
132
139
|
field: Type.Optional(Type.String({ description: "Scope field key, e.g. projectIds, severityMin" })),
|
|
133
140
|
question: Type.Optional(Type.String({ description: "Question text tailored to the scenario" })),
|
|
134
141
|
options: Type.Optional(Type.Array(Type.String(), {
|
|
135
|
-
description: "2–
|
|
142
|
+
description: "2–3 short option labels (tool assigns A–C; D is always Other)",
|
|
136
143
|
minItems: 2,
|
|
137
|
-
maxItems:
|
|
144
|
+
maxItems: 3,
|
|
138
145
|
})),
|
|
139
146
|
scenario: Type.Optional(Type.Union([
|
|
140
147
|
Type.Literal("remediation"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"questionnaire-tool.js","sourceRoot":"","sources":["../../src/clarify/questionnaire-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AA4BpC,MAAM,UAAU,wBAAwB,CACtC,aAAmC,EACnC,KAA6B,EAC7B,WAAoB;IAEpB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAE5B,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,QAAQ,GACZ,KAAK,CAAC,QAAQ;YACd,aAAa,CAAC,QAAQ;YACtB,wBAAwB,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG;YACZ,WAAW,aAAa,CAAC,MAAM,EAAE;YACjC,aAAa,QAAQ,EAAE;YACvB,oBAAoB,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;YACrE,YAAY,aAAa,CAAC,OAAO,CAAC,MAAM,YAAY;YACpD,UAAU,CAAC,aAAa,CAAC,MAAM;gBAC7B,CAAC,CAAC,kBAAkB,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACzD,CAAC,CAAC,6CAA6C;SAClD,CAAC;QACF,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CACR,EAAE,EACF,yBAAyB,UAAU,CAAC,QAAQ,CAAC,KAAK,KAAK,UAAU,CAAC,QAAQ,CAAC,OAAO,GAAG,EACrF,qBAAqB,UAAU,CAAC,QAAQ,CAAC,eAAe,EAAE,EAC1D,oBAAoB,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CACrE,CAAC;QACJ,CAAC;QACD,OAAO;YACL,EAAE,EAAE,IAAI;YACR,MAAM;YACN,MAAM,EAAE,aAAa,CAAC,MAAM;YAC5B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB,aAAa;SACd,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,MAAM,
|
|
1
|
+
{"version":3,"file":"questionnaire-tool.js","sourceRoot":"","sources":["../../src/clarify/questionnaire-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { QuestionnaireScenario } from "./session-questionnaire.types.js";
|
|
2
|
+
import type { SessionQuestionnaireFields } from "./session-questionnaire.types.js";
|
|
3
|
+
export type ScopeDiscoveryResult = {
|
|
4
|
+
scenario: QuestionnaireScenario;
|
|
5
|
+
fields: Partial<SessionQuestionnaireFields> & Record<string, unknown>;
|
|
6
|
+
notes: string[];
|
|
7
|
+
};
|
|
8
|
+
/** Discover scope from env, workspace, and user message before asking questions. */
|
|
9
|
+
export declare function discoverScopeHints(cwd: string, userMessage: string): ScopeDiscoveryResult;
|
|
10
|
+
//# sourceMappingURL=scope-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-discovery.d.ts","sourceRoot":"","sources":["../../src/clarify/scope-discovery.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAInF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,qBAAqB,CAAC;IAChC,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAgEF,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,oBAAoB,CAkEzF"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { KUBBISEC_CONTEXT_DIR, KUBBISEC_PROJECT_CONFIG_DIR, } from "../config/ensure-kubbisec-project-settings.js";
|
|
4
|
+
import { inferScenarioFromMessage } from "./question-format.js";
|
|
5
|
+
import { readDefaultProjectId } from "./session-questionnaire.js";
|
|
6
|
+
const PROJECT_IN_MESSAGE = /\b(project[:\s]+([\w-]+)|projeto[:\s]+([\w-]+))\b/i;
|
|
7
|
+
const SEVERITY_IN_MESSAGE = /\b(severity|severidade|critical|critico|crítico|high|alto|medium|medio|médio)\b/i;
|
|
8
|
+
const REMEDIATION_MODE_IN_MESSAGE = /\b(auto|automático|automatico|suggestion|sugestão|sugestao|manual|híbrido|hibrido)\b/i;
|
|
9
|
+
function readLocalSettings(cwd) {
|
|
10
|
+
const settingsPath = path.join(cwd, KUBBISEC_PROJECT_CONFIG_DIR, "settings.json");
|
|
11
|
+
try {
|
|
12
|
+
return JSON.parse(fs.readFileSync(settingsPath, "utf8"));
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function readPackageName(cwd) {
|
|
19
|
+
try {
|
|
20
|
+
const raw = fs.readFileSync(path.join(cwd, "package.json"), "utf8");
|
|
21
|
+
const parsed = JSON.parse(raw);
|
|
22
|
+
return typeof parsed.name === "string" ? parsed.name.trim() : undefined;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function readGitRemote(cwd) {
|
|
29
|
+
try {
|
|
30
|
+
const raw = fs.readFileSync(path.join(cwd, ".git", "config"), "utf8");
|
|
31
|
+
const match = raw.match(/url\s*=\s*(.+)/);
|
|
32
|
+
return match?.[1]?.trim();
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function severityFromMessage(message) {
|
|
39
|
+
const upper = message.toUpperCase();
|
|
40
|
+
if (/\bCRITICAL|CRÍTICO|CRITICO\b/.test(upper))
|
|
41
|
+
return "CRITICAL";
|
|
42
|
+
if (/\bHIGH|ALTO\b/.test(upper))
|
|
43
|
+
return "HIGH";
|
|
44
|
+
if (/\bMEDIUM|MÉDIO|MEDIO\b/.test(upper))
|
|
45
|
+
return "MEDIUM";
|
|
46
|
+
if (/\bALL|TODAS\b/.test(upper))
|
|
47
|
+
return "ALL";
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
function remediationModeFromMessage(message) {
|
|
51
|
+
if (/\b(sugest|suggest|manual|híbrido|hibrido|plano)\b/i.test(message))
|
|
52
|
+
return "suggestion";
|
|
53
|
+
if (/\b(auto|automático|automatico|pr|patch)\b/i.test(message))
|
|
54
|
+
return "auto";
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
function objectiveFromMessage(message) {
|
|
58
|
+
const trimmed = message.trim();
|
|
59
|
+
if (trimmed.length < 12)
|
|
60
|
+
return undefined;
|
|
61
|
+
if (/^@plan\b/i.test(trimmed)) {
|
|
62
|
+
return trimmed.replace(/^@plan\b\s*/i, "").trim() || undefined;
|
|
63
|
+
}
|
|
64
|
+
if (/^@planejar\b/i.test(trimmed)) {
|
|
65
|
+
return trimmed.replace(/^@planejar\b\s*/i, "").trim() || undefined;
|
|
66
|
+
}
|
|
67
|
+
return trimmed;
|
|
68
|
+
}
|
|
69
|
+
/** Discover scope from env, workspace, and user message before asking questions. */
|
|
70
|
+
export function discoverScopeHints(cwd, userMessage) {
|
|
71
|
+
const scenario = inferScenarioFromMessage(userMessage);
|
|
72
|
+
const fields = {};
|
|
73
|
+
const extras = {};
|
|
74
|
+
const notes = [];
|
|
75
|
+
const defaultProject = readDefaultProjectId();
|
|
76
|
+
if (defaultProject) {
|
|
77
|
+
fields.projectIds = [defaultProject];
|
|
78
|
+
notes.push("default project from config");
|
|
79
|
+
}
|
|
80
|
+
const projectMatch = PROJECT_IN_MESSAGE.exec(userMessage);
|
|
81
|
+
const projectFromMsg = projectMatch?.[2] ?? projectMatch?.[3];
|
|
82
|
+
if (projectFromMsg) {
|
|
83
|
+
fields.projectIds = [projectFromMsg];
|
|
84
|
+
notes.push("project from message");
|
|
85
|
+
}
|
|
86
|
+
const severity = severityFromMessage(userMessage);
|
|
87
|
+
if (severity) {
|
|
88
|
+
fields.severityMin = severity;
|
|
89
|
+
notes.push("severity from message");
|
|
90
|
+
}
|
|
91
|
+
else if (SEVERITY_IN_MESSAGE.test(userMessage)) {
|
|
92
|
+
notes.push("severity cue in message");
|
|
93
|
+
}
|
|
94
|
+
const remediationMode = remediationModeFromMessage(userMessage);
|
|
95
|
+
if (remediationMode) {
|
|
96
|
+
fields.remediationMode = remediationMode;
|
|
97
|
+
notes.push("remediation mode from message");
|
|
98
|
+
}
|
|
99
|
+
else if (REMEDIATION_MODE_IN_MESSAGE.test(userMessage)) {
|
|
100
|
+
notes.push("remediation mode cue in message");
|
|
101
|
+
}
|
|
102
|
+
const objective = objectiveFromMessage(userMessage);
|
|
103
|
+
if (objective && scenario === "plan") {
|
|
104
|
+
fields.customNotes = objective;
|
|
105
|
+
notes.push("plan objective from message");
|
|
106
|
+
}
|
|
107
|
+
const pkg = readPackageName(cwd);
|
|
108
|
+
if (pkg)
|
|
109
|
+
extras.stack = pkg;
|
|
110
|
+
const remote = readGitRemote(cwd);
|
|
111
|
+
if (remote)
|
|
112
|
+
extras.gitRemote = remote;
|
|
113
|
+
const settings = readLocalSettings(cwd);
|
|
114
|
+
if (settings && typeof settings.defaultProject === "string" && settings.defaultProject.trim()) {
|
|
115
|
+
if (!fields.projectIds?.length) {
|
|
116
|
+
fields.projectIds = [settings.defaultProject.trim()];
|
|
117
|
+
notes.push("project from .kubbisec/settings.json");
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const contextDir = path.join(cwd, KUBBISEC_PROJECT_CONFIG_DIR, KUBBISEC_CONTEXT_DIR);
|
|
121
|
+
if (fs.existsSync(contextDir)) {
|
|
122
|
+
extras.workspaceContext = "present";
|
|
123
|
+
notes.push("local .kubbisec/context");
|
|
124
|
+
}
|
|
125
|
+
if (Object.keys(extras).length > 0) {
|
|
126
|
+
fields.extras = extras;
|
|
127
|
+
}
|
|
128
|
+
return { scenario, fields, notes };
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=scope-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-discovery.js","sourceRoot":"","sources":["../../src/clarify/scope-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ClarifyAnswer } from "./parse-clarify-answer.js";
|
|
2
|
-
import type { QuestionnaireScenario, SessionQuestionnaire, SessionQuestionnaireFields } from "./session-questionnaire.types.js";
|
|
2
|
+
import type { PendingQuestion, QuestionnaireScenario, SessionQuestionnaire, SessionQuestionnaireFields } from "./session-questionnaire.types.js";
|
|
3
3
|
export declare const SESSION_QUESTIONNAIRE_FILENAME = "session-questionnaire.json";
|
|
4
4
|
export declare function resolveSessionQuestionnairePath(cwd: string): string;
|
|
5
5
|
export declare function readDefaultProjectId(): string | undefined;
|
|
@@ -7,6 +7,8 @@ export declare function createCollectingQuestionnaire(sessionId: string): Sessio
|
|
|
7
7
|
export declare function readSessionQuestionnaire(cwd: string, sessionIdFallback: string): SessionQuestionnaire;
|
|
8
8
|
export declare function writeSessionQuestionnaire(cwd: string, questionnaire: SessionQuestionnaire): void;
|
|
9
9
|
export declare function hasMinimumRemediationScope(fields: SessionQuestionnaireFields): boolean;
|
|
10
|
+
export declare function hasMinimumPlanScope(fields: SessionQuestionnaireFields): boolean;
|
|
11
|
+
export declare function hasMinimumScopeForScenario(scenario: QuestionnaireScenario | null, fields: SessionQuestionnaireFields): boolean;
|
|
10
12
|
export declare function setFieldValue(fields: SessionQuestionnaireFields, field: string, value: string): SessionQuestionnaireFields;
|
|
11
13
|
export declare function mergeRecordedFields(fields: SessionQuestionnaireFields, partial: Partial<SessionQuestionnaireFields> & Record<string, unknown>): SessionQuestionnaireFields;
|
|
12
14
|
export declare function askQuestion(questionnaire: SessionQuestionnaire, input: {
|
|
@@ -14,6 +16,7 @@ export declare function askQuestion(questionnaire: SessionQuestionnaire, input:
|
|
|
14
16
|
questionMarkdown: string;
|
|
15
17
|
optionLabels: string[];
|
|
16
18
|
scenario?: QuestionnaireScenario | null;
|
|
19
|
+
selectionMode?: PendingQuestion["selectionMode"];
|
|
17
20
|
}): SessionQuestionnaire;
|
|
18
21
|
export declare function completeQuestionnaire(questionnaire: SessionQuestionnaire): SessionQuestionnaire;
|
|
19
22
|
export declare function shouldAcceptClarifyAnswer(questionnaire: SessionQuestionnaire, parsed: ClarifyAnswer): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-questionnaire.d.ts","sourceRoot":"","sources":["../../src/clarify/session-questionnaire.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"session-questionnaire.d.ts","sourceRoot":"","sources":["../../src/clarify/session-questionnaire.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAU/D,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,0BAA0B,EAC3B,MAAM,kCAAkC,CAAC;AAS1C,eAAO,MAAM,8BAA8B,+BAA+B,CAAC;AAE3E,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOnE;AAED,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAUzD;AA8ED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG,oBAAoB,CAarF;AAED,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,EACX,iBAAiB,EAAE,MAAM,GACxB,oBAAoB,CAoBtB;AAED,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,oBAAoB,GAClC,IAAI,CAeN;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAMtF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAE/E;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,EACtC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAWT;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,0BAA0B,EAClC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,0BAA0B,CAkC5B;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,0BAA0B,EAClC,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrE,0BAA0B,CA8B5B;AAED,wBAAgB,WAAW,CACzB,aAAa,EAAE,oBAAoB,EACnC,KAAK,EAAE;IACL,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;CAClD,GACA,oBAAoB,CAetB;AAED,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,oBAAoB,GAClC,oBAAoB,CAQtB;AAID,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,oBAAoB,EACnC,MAAM,EAAE,aAAa,GACpB,OAAO,CAaT;AAED,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,oBAAoB,EACnC,MAAM,EAAE,aAAa,GACpB,oBAAoB,CAwFtB;AAED,wBAAgB,iCAAiC,CAC/C,aAAa,EAAE,oBAAoB,EACnC,SAAS,EAAE,MAAM,GAChB,oBAAoB,CAUtB;AAED,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,oBAAoB,GAAG,MAAM,CAIrF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { resolveOptionLabel, severityFromOptionLabel, } from "./question-format.js";
|
|
2
2
|
import { KUBBISEC_CONTEXT_DIR, KUBBISEC_PROJECT_CONFIG_DIR, } from "../config/ensure-kubbisec-project-settings.js";
|
|
3
|
+
import { syncExtendedContextFromFields } from "../config/extended-context.js";
|
|
3
4
|
import { SESSION_QUESTIONNAIRE_SCHEMA, createEmptyFields, } from "./session-questionnaire.types.js";
|
|
4
5
|
import * as fs from "node:fs";
|
|
5
6
|
import * as path from "node:path";
|
|
@@ -66,7 +67,8 @@ function parsePending(raw) {
|
|
|
66
67
|
const optionLabels = Array.isArray(raw.optionLabels)
|
|
67
68
|
? raw.optionLabels.filter((v) => typeof v === "string")
|
|
68
69
|
: [];
|
|
69
|
-
|
|
70
|
+
const selectionMode = raw.selectionMode === "multi" ? "multi" : "single";
|
|
71
|
+
return { field: raw.field, questionMarkdown: raw.questionMarkdown, optionLabels, selectionMode };
|
|
70
72
|
}
|
|
71
73
|
function parseQuestionnaire(raw, sessionIdFallback) {
|
|
72
74
|
if (!isRecord(raw))
|
|
@@ -117,6 +119,9 @@ export function readSessionQuestionnaire(cwd, sessionIdFallback) {
|
|
|
117
119
|
const parsed = parseQuestionnaire(JSON.parse(raw), sessionIdFallback);
|
|
118
120
|
if (parsed) {
|
|
119
121
|
if (parsed.sessionId !== sessionIdFallback) {
|
|
122
|
+
if (parsed.status === "collecting" && parsed.awaitingUserAnswer && parsed.pending) {
|
|
123
|
+
return { ...parsed, sessionId: sessionIdFallback };
|
|
124
|
+
}
|
|
120
125
|
return createCollectingQuestionnaire(sessionIdFallback);
|
|
121
126
|
}
|
|
122
127
|
return parsed;
|
|
@@ -148,6 +153,21 @@ export function hasMinimumRemediationScope(fields) {
|
|
|
148
153
|
Boolean(fields.severityMin) &&
|
|
149
154
|
Boolean(fields.remediationMode));
|
|
150
155
|
}
|
|
156
|
+
export function hasMinimumPlanScope(fields) {
|
|
157
|
+
return fields.projectIds.length > 0 && Boolean(fields.customNotes?.trim());
|
|
158
|
+
}
|
|
159
|
+
export function hasMinimumScopeForScenario(scenario, fields) {
|
|
160
|
+
switch (scenario) {
|
|
161
|
+
case "plan":
|
|
162
|
+
return hasMinimumPlanScope(fields);
|
|
163
|
+
case "explore":
|
|
164
|
+
case "review":
|
|
165
|
+
return fields.projectIds.length > 0;
|
|
166
|
+
case "remediation":
|
|
167
|
+
default:
|
|
168
|
+
return hasMinimumRemediationScope(fields);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
151
171
|
export function setFieldValue(fields, field, value) {
|
|
152
172
|
const next = {
|
|
153
173
|
...fields,
|
|
@@ -223,6 +243,7 @@ export function askQuestion(questionnaire, input) {
|
|
|
223
243
|
field: input.field,
|
|
224
244
|
questionMarkdown: input.questionMarkdown,
|
|
225
245
|
optionLabels: input.optionLabels,
|
|
246
|
+
selectionMode: input.selectionMode ?? "single",
|
|
226
247
|
},
|
|
227
248
|
updatedAt: now,
|
|
228
249
|
};
|
|
@@ -236,15 +257,21 @@ export function completeQuestionnaire(questionnaire) {
|
|
|
236
257
|
updatedAt: new Date().toISOString(),
|
|
237
258
|
};
|
|
238
259
|
}
|
|
260
|
+
const MIN_CUSTOM_ANSWER_LENGTH = 3;
|
|
239
261
|
export function shouldAcceptClarifyAnswer(questionnaire, parsed) {
|
|
240
262
|
if (parsed.kind === "invalid")
|
|
241
263
|
return false;
|
|
242
264
|
if (parsed.kind === "ready")
|
|
243
265
|
return true;
|
|
244
266
|
if (questionnaire.awaitingUserAnswer && questionnaire.pending) {
|
|
245
|
-
|
|
267
|
+
if (parsed.kind === "option" || parsed.kind === "multi")
|
|
268
|
+
return true;
|
|
269
|
+
if (parsed.kind === "custom") {
|
|
270
|
+
return parsed.text.trim().length >= MIN_CUSTOM_ANSWER_LENGTH;
|
|
271
|
+
}
|
|
272
|
+
return false;
|
|
246
273
|
}
|
|
247
|
-
return parsed.kind === "option";
|
|
274
|
+
return parsed.kind === "option" || parsed.kind === "multi";
|
|
248
275
|
}
|
|
249
276
|
export function applyPendingAnswer(questionnaire, answer) {
|
|
250
277
|
const pending = questionnaire.pending;
|
|
@@ -260,6 +287,32 @@ export function applyPendingAnswer(questionnaire, answer) {
|
|
|
260
287
|
if (answer.kind === "invalid") {
|
|
261
288
|
return { ...questionnaire, updatedAt: now };
|
|
262
289
|
}
|
|
290
|
+
if (answer.kind === "multi") {
|
|
291
|
+
const labels = answer.optionIds
|
|
292
|
+
.map((id) => resolveOptionLabel(id, pending.optionLabels))
|
|
293
|
+
.filter((label) => Boolean(label));
|
|
294
|
+
const value = labels.length > 0 ? labels.join(", ") : answer.optionIds.join(",");
|
|
295
|
+
const fields = setFieldValue(questionnaire.fields, pending.field, value);
|
|
296
|
+
const history = [
|
|
297
|
+
...questionnaire.history,
|
|
298
|
+
{
|
|
299
|
+
field: pending.field,
|
|
300
|
+
question: pending.questionMarkdown.split("\n")[0] ?? pending.field,
|
|
301
|
+
askedAt: now,
|
|
302
|
+
answer: { kind: "custom", text: value },
|
|
303
|
+
},
|
|
304
|
+
];
|
|
305
|
+
const multiNext = {
|
|
306
|
+
...questionnaire,
|
|
307
|
+
fields,
|
|
308
|
+
history,
|
|
309
|
+
awaitingUserAnswer: false,
|
|
310
|
+
pending: null,
|
|
311
|
+
updatedAt: now,
|
|
312
|
+
};
|
|
313
|
+
syncExtendedContextFromFields(multiNext.fields);
|
|
314
|
+
return multiNext;
|
|
315
|
+
}
|
|
263
316
|
let value = answer.kind === "custom"
|
|
264
317
|
? answer.text
|
|
265
318
|
: answer.detail ??
|
|
@@ -290,7 +343,7 @@ export function applyPendingAnswer(questionnaire, answer) {
|
|
|
290
343
|
: { kind: "custom", text: answer.text },
|
|
291
344
|
},
|
|
292
345
|
];
|
|
293
|
-
|
|
346
|
+
const next = {
|
|
294
347
|
...questionnaire,
|
|
295
348
|
fields,
|
|
296
349
|
history,
|
|
@@ -298,6 +351,8 @@ export function applyPendingAnswer(questionnaire, answer) {
|
|
|
298
351
|
pending: null,
|
|
299
352
|
updatedAt: now,
|
|
300
353
|
};
|
|
354
|
+
syncExtendedContextFromFields(next.fields);
|
|
355
|
+
return next;
|
|
301
356
|
}
|
|
302
357
|
export function finalizeQuestionnaireAtRoundLimit(questionnaire, maxRounds) {
|
|
303
358
|
if (questionnaire.history.length < maxRounds)
|