@kubbisec/ai-win32-x64 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/bin/kubbisec.exe +0 -0
  2. package/bundled/clarify/clarify-gate.d.ts +27 -0
  3. package/bundled/clarify/clarify-gate.d.ts.map +1 -0
  4. package/bundled/clarify/clarify-gate.js +152 -0
  5. package/bundled/clarify/clarify-gate.js.map +1 -0
  6. package/bundled/clarify/clarify-ui-state.d.ts +12 -0
  7. package/bundled/clarify/clarify-ui-state.d.ts.map +1 -0
  8. package/bundled/clarify/clarify-ui-state.js +27 -0
  9. package/bundled/clarify/clarify-ui-state.js.map +1 -0
  10. package/bundled/clarify/parse-clarify-answer.d.ts +16 -0
  11. package/bundled/clarify/parse-clarify-answer.d.ts.map +1 -0
  12. package/bundled/clarify/parse-clarify-answer.js +22 -0
  13. package/bundled/clarify/parse-clarify-answer.js.map +1 -0
  14. package/bundled/clarify/question-format.d.ts +36 -0
  15. package/bundled/clarify/question-format.d.ts.map +1 -0
  16. package/bundled/clarify/question-format.js +150 -0
  17. package/bundled/clarify/question-format.js.map +1 -0
  18. package/bundled/clarify/questionnaire-tool.d.ts +25 -0
  19. package/bundled/clarify/questionnaire-tool.d.ts.map +1 -0
  20. package/bundled/clarify/questionnaire-tool.js +157 -0
  21. package/bundled/clarify/questionnaire-tool.js.map +1 -0
  22. package/bundled/clarify/session-questionnaire.d.ts +23 -0
  23. package/bundled/clarify/session-questionnaire.d.ts.map +1 -0
  24. package/bundled/clarify/session-questionnaire.js +319 -0
  25. package/bundled/clarify/session-questionnaire.js.map +1 -0
  26. package/bundled/clarify/session-questionnaire.types.d.ts +45 -0
  27. package/bundled/clarify/session-questionnaire.types.d.ts.map +1 -0
  28. package/bundled/clarify/session-questionnaire.types.js +13 -0
  29. package/bundled/clarify/session-questionnaire.types.js.map +1 -0
  30. package/bundled/config/config.d.ts +14 -0
  31. package/bundled/config/config.d.ts.map +1 -0
  32. package/bundled/config/config.js +66 -0
  33. package/bundled/config/config.js.map +1 -0
  34. package/bundled/config/ensure-kubbisec-project-settings.d.ts +20 -0
  35. package/bundled/config/ensure-kubbisec-project-settings.d.ts.map +1 -0
  36. package/bundled/config/ensure-kubbisec-project-settings.js +65 -0
  37. package/bundled/config/ensure-kubbisec-project-settings.js.map +1 -0
  38. package/bundled/config/feature-flags.d.ts +2 -0
  39. package/bundled/config/feature-flags.d.ts.map +1 -0
  40. package/bundled/config/feature-flags.js +2 -0
  41. package/bundled/config/feature-flags.js.map +1 -0
  42. package/bundled/config/format-kubbisec-footer-status.d.ts +2 -0
  43. package/bundled/config/format-kubbisec-footer-status.d.ts.map +1 -0
  44. package/bundled/config/format-kubbisec-footer-status.js +21 -0
  45. package/bundled/config/format-kubbisec-footer-status.js.map +1 -0
  46. package/bundled/config/resolve-agents-context-file.d.ts +4 -0
  47. package/bundled/config/resolve-agents-context-file.d.ts.map +1 -0
  48. package/bundled/config/resolve-agents-context-file.js +48 -0
  49. package/bundled/config/resolve-agents-context-file.js.map +1 -0
  50. package/bundled/config/resource-budget.d.ts +17 -0
  51. package/bundled/config/resource-budget.d.ts.map +1 -0
  52. package/bundled/config/resource-budget.js +35 -0
  53. package/bundled/config/resource-budget.js.map +1 -0
  54. package/bundled/copy/kubbisec-shell-copy.d.ts +8 -0
  55. package/bundled/copy/kubbisec-shell-copy.d.ts.map +1 -0
  56. package/bundled/copy/kubbisec-shell-copy.js +8 -0
  57. package/bundled/copy/kubbisec-shell-copy.js.map +1 -0
  58. package/bundled/node_modules/@kubbisec/chat-memory/dist/client.d.ts +20 -0
  59. package/bundled/node_modules/@kubbisec/chat-memory/dist/client.d.ts.map +1 -0
  60. package/bundled/node_modules/@kubbisec/chat-memory/dist/client.js +121 -0
  61. package/bundled/node_modules/@kubbisec/chat-memory/dist/client.js.map +1 -0
  62. package/bundled/node_modules/@kubbisec/chat-memory/dist/feature-flags.d.ts +15 -0
  63. package/bundled/node_modules/@kubbisec/chat-memory/dist/feature-flags.d.ts.map +1 -0
  64. package/bundled/node_modules/@kubbisec/chat-memory/dist/feature-flags.js +34 -0
  65. package/bundled/node_modules/@kubbisec/chat-memory/dist/feature-flags.js.map +1 -0
  66. package/bundled/node_modules/@kubbisec/chat-memory/dist/index.d.ts +12 -0
  67. package/bundled/node_modules/@kubbisec/chat-memory/dist/index.d.ts.map +1 -0
  68. package/bundled/node_modules/@kubbisec/chat-memory/dist/index.js +35 -0
  69. package/bundled/node_modules/@kubbisec/chat-memory/dist/index.js.map +1 -0
  70. package/bundled/node_modules/@kubbisec/chat-memory/dist/sanitizer.d.ts +4 -0
  71. package/bundled/node_modules/@kubbisec/chat-memory/dist/sanitizer.d.ts.map +1 -0
  72. package/bundled/node_modules/@kubbisec/chat-memory/dist/sanitizer.js +89 -0
  73. package/bundled/node_modules/@kubbisec/chat-memory/dist/sanitizer.js.map +1 -0
  74. package/bundled/node_modules/@kubbisec/chat-memory/dist/storage-paths.d.ts +2 -0
  75. package/bundled/node_modules/@kubbisec/chat-memory/dist/storage-paths.d.ts.map +1 -0
  76. package/bundled/node_modules/@kubbisec/chat-memory/dist/storage-paths.js +13 -0
  77. package/bundled/node_modules/@kubbisec/chat-memory/dist/storage-paths.js.map +1 -0
  78. package/bundled/node_modules/@kubbisec/chat-memory/dist/types.d.ts +24 -0
  79. package/bundled/node_modules/@kubbisec/chat-memory/dist/types.d.ts.map +1 -0
  80. package/bundled/node_modules/@kubbisec/chat-memory/dist/types.js +9 -0
  81. package/bundled/node_modules/@kubbisec/chat-memory/dist/types.js.map +1 -0
  82. package/bundled/node_modules/@kubbisec/chat-memory/package.json +32 -0
  83. package/bundled/node_modules/@kubbisec/home/dist/api-url.d.ts +8 -0
  84. package/bundled/node_modules/@kubbisec/home/dist/api-url.d.ts.map +1 -0
  85. package/bundled/node_modules/@kubbisec/home/dist/api-url.js +19 -0
  86. package/bundled/node_modules/@kubbisec/home/dist/api-url.js.map +1 -0
  87. package/bundled/node_modules/@kubbisec/home/dist/cli-auth.types.d.ts +16 -0
  88. package/bundled/node_modules/@kubbisec/home/dist/cli-auth.types.d.ts.map +1 -0
  89. package/bundled/node_modules/@kubbisec/home/dist/cli-auth.types.js +22 -0
  90. package/bundled/node_modules/@kubbisec/home/dist/cli-auth.types.js.map +1 -0
  91. package/bundled/node_modules/@kubbisec/home/dist/index.d.ts +5 -0
  92. package/bundled/node_modules/@kubbisec/home/dist/index.d.ts.map +1 -0
  93. package/bundled/node_modules/@kubbisec/home/dist/index.js +5 -0
  94. package/bundled/node_modules/@kubbisec/home/dist/index.js.map +1 -0
  95. package/bundled/node_modules/@kubbisec/home/dist/migrate.d.ts +10 -0
  96. package/bundled/node_modules/@kubbisec/home/dist/migrate.d.ts.map +1 -0
  97. package/bundled/node_modules/@kubbisec/home/dist/migrate.js +107 -0
  98. package/bundled/node_modules/@kubbisec/home/dist/migrate.js.map +1 -0
  99. package/bundled/node_modules/@kubbisec/home/dist/paths.d.ts +22 -0
  100. package/bundled/node_modules/@kubbisec/home/dist/paths.d.ts.map +1 -0
  101. package/bundled/node_modules/@kubbisec/home/dist/paths.js +69 -0
  102. package/bundled/node_modules/@kubbisec/home/dist/paths.js.map +1 -0
  103. package/bundled/node_modules/@kubbisec/home/package.json +26 -0
  104. package/bundled/resolve-bundled-dist-root.js +165 -0
  105. package/bundled/resolve-bundled-dist-root.js.map +1 -0
  106. package/package.json +1 -1
package/bin/kubbisec.exe CHANGED
Binary file
@@ -0,0 +1,27 @@
1
+ import type { SessionQuestionnaireFields } from "./session-questionnaire.types.js";
2
+ export type ClarifySurface = "chat" | "fix" | "watch" | "task-consumer";
3
+ export type ClarifyIntent = "factual" | "execute" | "ambiguous";
4
+ export type ClarifyGateInput = {
5
+ surface: ClarifySurface;
6
+ userMessage: string;
7
+ hasProjectId: boolean;
8
+ hasVulnerabilityId: boolean;
9
+ hasSeverityFilter: boolean;
10
+ mode?: "plan" | "default";
11
+ questionnaireStatus?: "collecting" | "ready";
12
+ fields?: SessionQuestionnaireFields;
13
+ historyCount?: number;
14
+ clarifyMaxRounds?: number;
15
+ };
16
+ export declare const REQUIRED_FOR_FIX_INTENT: readonly ["projectId", "severityMin", "remediationMode"];
17
+ /** Classify user intent for ClarifyGate (CLAR-001). */
18
+ export declare function classifyIntent(userMessage: string): ClarifyIntent;
19
+ /** Confidence that required execute fields are present (0–1). */
20
+ export declare function computeGateConfidence(input: ClarifyGateInput): number;
21
+ export declare function hasRequiredExecuteFields(input: ClarifyGateInput): boolean;
22
+ /**
23
+ * Whether sec-clarify should run for this turn (CLAR-001).
24
+ * fix/watch/task-consumer surfaces always return false.
25
+ */
26
+ export declare function shouldClarify(input: ClarifyGateInput): boolean;
27
+ //# sourceMappingURL=clarify-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clarify-gate.d.ts","sourceRoot":"","sources":["../../src/clarify/clarify-gate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAGnF,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,eAAe,CAAC;AAExE,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,cAAc,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,mBAAmB,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC;IAC7C,MAAM,CAAC,EAAE,0BAA0B,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,eAAO,MAAM,uBAAuB,0DAI1B,CAAC;AAwBX,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CA+BjE;AA0BD,iEAAiE;AACjE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CA8BrE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAezE;AASD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAoD9D"}
@@ -0,0 +1,152 @@
1
+ import { hasMinimumRemediationScope } from "./session-questionnaire.js";
2
+ export const REQUIRED_FOR_FIX_INTENT = [
3
+ "projectId",
4
+ "severityMin",
5
+ "remediationMode",
6
+ ];
7
+ const FACTUAL_PATTERNS = [
8
+ /^(?:o que (?:é|e)|what is|how does|como funciona|explain|defina|define)(?:\s|[?.!,]|$)/iu,
9
+ /\b(documentação|documentation|docs)\b/iu,
10
+ ];
11
+ const EXECUTE_PATTERNS = [
12
+ /\b(corrige|corrigir|fix|remediate|remediação|remediacao)\b/i,
13
+ /\b(finding|findings|vuln|vulnerability|cve-\d)/i,
14
+ ];
15
+ const AMBIGUOUS_PATTERNS = [
16
+ /\b(melhorar|melhore|improve|harden|reforçar|reforcar)\b.*\b(segurança|seguranca|security)\b/i,
17
+ /@plan\b/i,
18
+ /\/mode:plan\b/i,
19
+ ];
20
+ const PROJECT_IN_MESSAGE = /\b(project[:\s]+[\w-]+|projeto[:\s]+[\w-]+)\b/i;
21
+ const VULN_IN_MESSAGE = /\b(cve-\d{4}-\d+|vuln(?:erability)?[:\s#]*[\w-]+)\b/i;
22
+ const SEVERITY_IN_MESSAGE = /\b(severity|severidade|critical|critico|crítico|high|alto|medium|medio|médio)\b/i;
23
+ /** Classify user intent for ClarifyGate (CLAR-001). */
24
+ export function classifyIntent(userMessage) {
25
+ const msg = userMessage.trim();
26
+ if (!msg)
27
+ return "ambiguous";
28
+ if (FACTUAL_PATTERNS.some((re) => re.test(msg))) {
29
+ return "factual";
30
+ }
31
+ const hasExecuteCue = EXECUTE_PATTERNS.some((re) => re.test(msg));
32
+ const hasScopeCue = PROJECT_IN_MESSAGE.test(msg) ||
33
+ VULN_IN_MESSAGE.test(msg) ||
34
+ SEVERITY_IN_MESSAGE.test(msg);
35
+ if (hasExecuteCue && hasScopeCue) {
36
+ return "execute";
37
+ }
38
+ if (AMBIGUOUS_PATTERNS.some((re) => re.test(msg))) {
39
+ return "ambiguous";
40
+ }
41
+ if (hasExecuteCue) {
42
+ return "execute";
43
+ }
44
+ if (msg.length < 40 && !hasExecuteCue) {
45
+ return "ambiguous";
46
+ }
47
+ return "ambiguous";
48
+ }
49
+ function messageSignalsProject(message) {
50
+ return PROJECT_IN_MESSAGE.test(message);
51
+ }
52
+ function messageSignalsVulnerability(message) {
53
+ return VULN_IN_MESSAGE.test(message);
54
+ }
55
+ function messageSignalsSeverity(message) {
56
+ return SEVERITY_IN_MESSAGE.test(message);
57
+ }
58
+ function fieldsSignalProject(fields) {
59
+ return (fields?.projectIds.length ?? 0) > 0;
60
+ }
61
+ function fieldsSignalSeverity(fields) {
62
+ return Boolean(fields?.severityMin);
63
+ }
64
+ function fieldsSignalRemediation(fields) {
65
+ return Boolean(fields?.remediationMode);
66
+ }
67
+ /** Confidence that required execute fields are present (0–1). */
68
+ export function computeGateConfidence(input) {
69
+ const msg = input.userMessage;
70
+ let score = 0.35;
71
+ if (input.hasProjectId ||
72
+ messageSignalsProject(msg) ||
73
+ fieldsSignalProject(input.fields)) {
74
+ score += 0.25;
75
+ }
76
+ if (input.hasVulnerabilityId ||
77
+ messageSignalsVulnerability(msg)) {
78
+ score += 0.2;
79
+ }
80
+ if (input.hasSeverityFilter ||
81
+ messageSignalsSeverity(msg) ||
82
+ fieldsSignalSeverity(input.fields)) {
83
+ score += 0.2;
84
+ }
85
+ if (classifyIntent(msg) === "factual") {
86
+ return Math.min(score, 0.5);
87
+ }
88
+ return Math.min(score, 1);
89
+ }
90
+ export function hasRequiredExecuteFields(input) {
91
+ const msg = input.userMessage;
92
+ const fields = input.fields;
93
+ const hasProject = input.hasProjectId ||
94
+ messageSignalsProject(msg) ||
95
+ fieldsSignalProject(fields);
96
+ const hasSeverity = input.hasSeverityFilter ||
97
+ messageSignalsSeverity(msg) ||
98
+ fieldsSignalSeverity(fields);
99
+ const hasRemediationMode = fieldsSignalRemediation(fields) ||
100
+ /\b(auto|automático|automatico|suggestion|sugestão|sugestao|manual)\b/i.test(msg);
101
+ return hasProject && hasSeverity && hasRemediationMode;
102
+ }
103
+ function hasClarifyCue(message) {
104
+ return (EXECUTE_PATTERNS.some((re) => re.test(message)) ||
105
+ AMBIGUOUS_PATTERNS.some((re) => re.test(message)));
106
+ }
107
+ /**
108
+ * Whether sec-clarify should run for this turn (CLAR-001).
109
+ * fix/watch/task-consumer surfaces always return false.
110
+ */
111
+ export function shouldClarify(input) {
112
+ if (input.surface !== "chat") {
113
+ return false;
114
+ }
115
+ if (process.env.KUBBISEC_SKIP_CLARIFY === "1") {
116
+ return false;
117
+ }
118
+ if (input.questionnaireStatus === "ready") {
119
+ return false;
120
+ }
121
+ const msg = input.userMessage.trim();
122
+ if (!msg || !hasClarifyCue(msg)) {
123
+ return false;
124
+ }
125
+ const intent = classifyIntent(msg);
126
+ if (intent === "factual") {
127
+ return false;
128
+ }
129
+ const maxRounds = input.clarifyMaxRounds ?? 3;
130
+ if ((input.historyCount ?? 0) >= maxRounds) {
131
+ return false;
132
+ }
133
+ const fields = input.fields;
134
+ if (fields && hasMinimumRemediationScope(fields)) {
135
+ return false;
136
+ }
137
+ const confidence = computeGateConfidence(input);
138
+ if (intent === "execute" && confidence >= 0.85 && hasRequiredExecuteFields(input)) {
139
+ return false;
140
+ }
141
+ if (intent === "execute" && !hasRequiredExecuteFields(input)) {
142
+ return true;
143
+ }
144
+ if (intent === "ambiguous") {
145
+ return true;
146
+ }
147
+ if (input.mode === "plan") {
148
+ return !hasRequiredExecuteFields(input);
149
+ }
150
+ return confidence < 0.85;
151
+ }
152
+ //# sourceMappingURL=clarify-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clarify-gate.js","sourceRoot":"","sources":["../../src/clarify/clarify-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type ClarifyUiPhase = "idle" | "asking" | "ready";
2
+ export type ClarifyUiSnapshot = {
3
+ phase: ClarifyUiPhase;
4
+ progressLabel: string | null;
5
+ questionMarkdown: string | null;
6
+ };
7
+ export declare function setClarifyUiChangeListener(listener: (() => void) | undefined): void;
8
+ export declare function getClarifyUiSnapshot(): ClarifyUiSnapshot;
9
+ export declare function setClarifyUiSnapshot(next: ClarifyUiSnapshot): void;
10
+ export declare function resetClarifyUiSnapshot(): void;
11
+ export declare function isClarifyAsking(): boolean;
12
+ //# sourceMappingURL=clarify-ui-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clarify-ui-state.d.ts","sourceRoot":"","sources":["../../src/clarify/clarify-ui-state.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,cAAc,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,CAAC;AAUF,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI,CAEnF;AAMD,wBAAgB,oBAAoB,IAAI,iBAAiB,CAExD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAGlE;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAG7C;AAED,wBAAgB,eAAe,IAAI,OAAO,CAEzC"}
@@ -0,0 +1,27 @@
1
+ let snapshot = {
2
+ phase: "idle",
3
+ progressLabel: null,
4
+ questionMarkdown: null,
5
+ };
6
+ let onSnapshotChange;
7
+ export function setClarifyUiChangeListener(listener) {
8
+ onSnapshotChange = listener;
9
+ }
10
+ function notifySnapshotChange() {
11
+ onSnapshotChange?.();
12
+ }
13
+ export function getClarifyUiSnapshot() {
14
+ return snapshot;
15
+ }
16
+ export function setClarifyUiSnapshot(next) {
17
+ snapshot = next;
18
+ notifySnapshotChange();
19
+ }
20
+ export function resetClarifyUiSnapshot() {
21
+ snapshot = { phase: "idle", progressLabel: null, questionMarkdown: null };
22
+ notifySnapshotChange();
23
+ }
24
+ export function isClarifyAsking() {
25
+ return snapshot.phase === "asking";
26
+ }
27
+ //# sourceMappingURL=clarify-ui-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clarify-ui-state.js","sourceRoot":"","sources":["../../src/clarify/clarify-ui-state.ts"],"names":[],"mappings":"AAQA,IAAI,QAAQ,GAAsB;IAChC,KAAK,EAAE,MAAM;IACb,aAAa,EAAE,IAAI;IACnB,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF,IAAI,gBAA0C,CAAC;AAE/C,MAAM,UAAU,0BAA0B,CAAC,QAAkC;IAC3E,gBAAgB,GAAG,QAAQ,CAAC;AAC9B,CAAC;AAED,SAAS,oBAAoB;IAC3B,gBAAgB,EAAE,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAuB;IAC1D,QAAQ,GAAG,IAAI,CAAC;IAChB,oBAAoB,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,QAAQ,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;IAC1E,oBAAoB,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC;AACrC,CAAC"}
@@ -0,0 +1,16 @@
1
+ export type ClarifyOptionId = "A" | "B" | "C" | "D" | "E";
2
+ export type ClarifyAnswer = {
3
+ kind: "option";
4
+ optionId: ClarifyOptionId;
5
+ detail?: string;
6
+ } | {
7
+ kind: "custom";
8
+ text: string;
9
+ } | {
10
+ kind: "ready";
11
+ } | {
12
+ kind: "invalid";
13
+ };
14
+ /** Parse a user reply to a sec-clarify multiple-choice question (CLAR-004). */
15
+ export declare function parseClarifyAnswer(text: string): ClarifyAnswer;
16
+ //# sourceMappingURL=parse-clarify-answer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-clarify-answer.d.ts","sourceRoot":"","sources":["../../src/clarify/parse-clarify-answer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAE1D,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAIxB,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAoB9D"}
@@ -0,0 +1,22 @@
1
+ const READY_PHRASE = /^pode\s+executar\b/i;
2
+ /** Parse a user reply to a sec-clarify multiple-choice question (CLAR-004). */
3
+ export function parseClarifyAnswer(text) {
4
+ const trimmed = text.trim();
5
+ if (!trimmed) {
6
+ return { kind: "invalid" };
7
+ }
8
+ if (READY_PHRASE.test(trimmed)) {
9
+ return { kind: "ready" };
10
+ }
11
+ const match = trimmed.match(/^([A-E])\b([\s\S]*)$/i);
12
+ if (match?.[1]) {
13
+ const optionId = match[1].toUpperCase();
14
+ const remainder = (match[2] ?? "").trim().replace(/^[\s:,\-–—]+/, "");
15
+ if (remainder) {
16
+ return { kind: "option", optionId, detail: remainder };
17
+ }
18
+ return { kind: "option", optionId };
19
+ }
20
+ return { kind: "custom", text: trimmed };
21
+ }
22
+ //# sourceMappingURL=parse-clarify-answer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-clarify-answer.js","sourceRoot":"","sources":["../../src/clarify/parse-clarify-answer.ts"],"names":[],"mappings":"AAQA,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAE3C,+EAA+E;AAC/E,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACrD,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAqB,CAAC;QAC3D,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACtE,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACzD,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACtC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { ClarifyOptionId, QuestionnaireScenario, SessionQuestionnaireFields } from "./session-questionnaire.types.js";
2
+ export type ClarifyQuestionOption = {
3
+ id: "A" | "B" | "C" | "D";
4
+ label: string;
5
+ };
6
+ /** Build a single structured question (CLAR-002) from agent-provided copy. */
7
+ export declare function formatClarifyQuestionMarkdown(input: {
8
+ question: string;
9
+ options: ClarifyQuestionOption[];
10
+ language?: "pt" | "en";
11
+ }): string;
12
+ export declare function buildOptionsFromLabels(labels: string[]): ClarifyQuestionOption[];
13
+ export declare function resolveOptionLabel(optionId: ClarifyOptionId, optionLabels: string[]): string | null;
14
+ export declare function severityFromOptionLabel(label: string): string;
15
+ export type ScenarioFieldHint = {
16
+ field: string;
17
+ purpose: string;
18
+ exampleQuestion: string;
19
+ exampleOptions: string[];
20
+ };
21
+ /** Scenario-aware hints — suggestions only; agent writes the final question via the tool. */
22
+ export declare function suggestScenarioFields(scenario: QuestionnaireScenario, fields: SessionQuestionnaireFields): {
23
+ scenario: QuestionnaireScenario;
24
+ missingFields: string[];
25
+ nextHint: ScenarioFieldHint | null;
26
+ };
27
+ export declare function inferScenarioFromMessage(message: string): QuestionnaireScenario;
28
+ export declare function formatQuestionFromInput(input: {
29
+ question: string;
30
+ options: string[];
31
+ language?: "pt" | "en";
32
+ }): {
33
+ markdown: string;
34
+ optionLabels: string[];
35
+ };
36
+ //# sourceMappingURL=question-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"question-format.d.ts","sourceRoot":"","sources":["../../src/clarify/question-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACrB,0BAA0B,EAC3B,MAAM,kCAAkC,CAAC;AAE1C,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAIF,8EAA8E;AAC9E,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB,GAAG,MAAM,CAeT;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,qBAAqB,EAAE,CAKhF;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,eAAe,EACzB,YAAY,EAAE,MAAM,EAAE,GACrB,MAAM,GAAG,IAAI,CAKf;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAoFF,6FAA6F;AAC7F,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,qBAAqB,EAC/B,MAAM,EAAE,0BAA0B,GACjC;IACD,QAAQ,EAAE,qBAAqB,CAAC;IAChC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACpC,CAKA;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAK/E;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAQ/C"}
@@ -0,0 +1,150 @@
1
+ const OPTION_IDS = ["A", "B", "C", "D"];
2
+ /** Build a single structured question (CLAR-002) from agent-provided copy. */
3
+ export function formatClarifyQuestionMarkdown(input) {
4
+ const lines = [input.question.trim(), ""];
5
+ for (const opt of input.options.slice(0, 4)) {
6
+ lines.push(`${opt.id}) ${opt.label}`);
7
+ }
8
+ const otherLabel = input.language === "en" ? "**Other** — describe in your reply" : "**Outro** — descreva na sua resposta";
9
+ lines.push(`E) ${otherLabel}`);
10
+ lines.push("");
11
+ const footer = input.language === "en"
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);
15
+ return lines.join("\n");
16
+ }
17
+ export function buildOptionsFromLabels(labels) {
18
+ return labels.slice(0, 4).map((label, index) => ({
19
+ id: OPTION_IDS[index] ?? "D",
20
+ label: label.trim(),
21
+ }));
22
+ }
23
+ export function resolveOptionLabel(optionId, optionLabels) {
24
+ if (optionId === "E")
25
+ return null;
26
+ const index = OPTION_IDS.indexOf(optionId);
27
+ if (index < 0 || index >= optionLabels.length)
28
+ return null;
29
+ return optionLabels[index] ?? null;
30
+ }
31
+ export function severityFromOptionLabel(label) {
32
+ const upper = label.trim().toUpperCase();
33
+ if (upper.includes("CRITICAL") || upper.includes("CRÍTICO") || upper.includes("CRITICO")) {
34
+ return "CRITICAL";
35
+ }
36
+ if (upper.includes("HIGH") || upper.includes("ALTO"))
37
+ return "HIGH";
38
+ if (upper.includes("MEDIUM") || upper.includes("MÉDIO") || upper.includes("MEDIO")) {
39
+ return "MEDIUM";
40
+ }
41
+ if (upper.includes("TODAS") || upper.includes("ALL"))
42
+ return "ALL";
43
+ return upper;
44
+ }
45
+ const SCENARIO_HINTS = {
46
+ remediation: [
47
+ {
48
+ field: "projectIds",
49
+ purpose: "Projeto/asset alvo",
50
+ 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
+ ],
57
+ },
58
+ {
59
+ field: "severityMin",
60
+ purpose: "Severidade mínima no escopo",
61
+ exampleQuestion: "Qual severidade mínima entra no escopo?",
62
+ exampleOptions: ["CRITICAL", "HIGH", "MEDIUM", "Todas"],
63
+ },
64
+ {
65
+ field: "remediationMode",
66
+ purpose: "Modo de remediação",
67
+ exampleQuestion: "Como devemos remediar?",
68
+ exampleOptions: [
69
+ "Automático (PR/patch)",
70
+ "Só sugestões",
71
+ "Híbrido",
72
+ "Ainda não definido",
73
+ ],
74
+ },
75
+ ],
76
+ plan: [
77
+ {
78
+ field: "projectIds",
79
+ purpose: "Projeto/asset",
80
+ exampleQuestion: "Para qual projeto é este plano?",
81
+ exampleOptions: ["Sessão atual", "Outro projeto", "Monorepo", "Decidir depois"],
82
+ },
83
+ {
84
+ field: "customNotes",
85
+ purpose: "Objetivo do plano",
86
+ exampleQuestion: "Qual é o objetivo principal deste plano?",
87
+ exampleOptions: ["Correção CVE", "Pipeline NAUS", "Hardening", "Outro"],
88
+ },
89
+ ],
90
+ explore: [
91
+ {
92
+ field: "projectIds",
93
+ purpose: "Contexto do projeto",
94
+ exampleQuestion: "Sobre qual projeto quer explorar findings?",
95
+ exampleOptions: ["Padrão", "Outro", "Organização inteira", "Nenhum ainda"],
96
+ },
97
+ ],
98
+ review: [
99
+ {
100
+ field: "projectIds",
101
+ purpose: "Projeto em revisão",
102
+ exampleQuestion: "Qual projeto estamos a rever?",
103
+ exampleOptions: ["Atual", "Outro", "PR específico", "Decidir depois"],
104
+ },
105
+ ],
106
+ };
107
+ function isFieldFilled(fields, field) {
108
+ switch (field) {
109
+ case "projectIds":
110
+ return fields.projectIds.length > 0;
111
+ case "severityMin":
112
+ return Boolean(fields.severityMin);
113
+ case "remediationMode":
114
+ return Boolean(fields.remediationMode);
115
+ case "nausConstraints":
116
+ return fields.nausConstraints != null;
117
+ case "extendedContext":
118
+ return fields.extendedContext != null;
119
+ case "customNotes":
120
+ return Boolean(fields.customNotes?.trim());
121
+ default:
122
+ return Boolean(fields.extras[field]?.trim());
123
+ }
124
+ }
125
+ /** Scenario-aware hints — suggestions only; agent writes the final question via the tool. */
126
+ export function suggestScenarioFields(scenario, fields) {
127
+ const hints = SCENARIO_HINTS[scenario] ?? SCENARIO_HINTS.remediation;
128
+ const missingFields = hints.map((h) => h.field).filter((field) => !isFieldFilled(fields, field));
129
+ const nextHint = hints.find((h) => !isFieldFilled(fields, h.field)) ?? null;
130
+ return { scenario, missingFields, nextHint };
131
+ }
132
+ export function inferScenarioFromMessage(message) {
133
+ if (/@plan\b|\/mode:plan\b|brainstorm|spec\b/i.test(message))
134
+ return "plan";
135
+ if (/\b(review|revisão|revisao|code review)\b/i.test(message))
136
+ return "review";
137
+ if (/\b(o que|explain|explor|listar|mostrar)\b/i.test(message))
138
+ return "explore";
139
+ return "remediation";
140
+ }
141
+ export function formatQuestionFromInput(input) {
142
+ const optionLabels = input.options.map((o) => o.trim()).filter(Boolean).slice(0, 4);
143
+ const markdown = formatClarifyQuestionMarkdown({
144
+ question: input.question,
145
+ options: buildOptionsFromLabels(optionLabels),
146
+ language: input.language,
147
+ });
148
+ return { markdown, optionLabels };
149
+ }
150
+ //# sourceMappingURL=question-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"question-format.js","sourceRoot":"","sources":["../../src/clarify/question-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { Type } from "@earendil-works/pi-ai";
2
+ import type { ClarifyAnswer } from "./parse-clarify-answer.js";
3
+ import type { QuestionnaireScenario, SessionQuestionnaire, SessionQuestionnaireFields } from "./session-questionnaire.types.js";
4
+ export type QuestionnaireToolAction = "ask" | "record" | "complete" | "status";
5
+ export type QuestionnaireToolInput = {
6
+ action: QuestionnaireToolAction;
7
+ field?: string;
8
+ question?: string;
9
+ options?: string[];
10
+ scenario?: QuestionnaireScenario;
11
+ fields?: Partial<SessionQuestionnaireFields> & Record<string, unknown>;
12
+ language?: "pt" | "en";
13
+ };
14
+ export type QuestionnaireToolResult = {
15
+ ok: boolean;
16
+ action: QuestionnaireToolAction;
17
+ status: SessionQuestionnaire["status"];
18
+ message: string;
19
+ formattedQuestion?: string;
20
+ questionnaire: SessionQuestionnaire;
21
+ };
22
+ export declare function executeQuestionnaireTool(questionnaire: SessionQuestionnaire, input: QuestionnaireToolInput, userMessage?: string): QuestionnaireToolResult;
23
+ export declare function questionnaireToolParametersSchema(): ReturnType<typeof Type.Object>;
24
+ export declare function applyParsedUserAnswerIfPending(questionnaire: SessionQuestionnaire, parsed: ClarifyAnswer): SessionQuestionnaire;
25
+ //# sourceMappingURL=questionnaire-tool.d.ts.map
@@ -0,0 +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;AAM7C,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,CA8IzB;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"}