@kubbisec/ai-linux-arm64 0.1.20 → 0.1.22

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 (131) hide show
  1. package/bin/kubbisec +0 -0
  2. package/bundled/clarify/clarify-gate-state.d.ts +1 -1
  3. package/bundled/clarify/clarify-gate-state.js +3 -3
  4. package/bundled/clarify/clarify-gate.d.ts +21 -14
  5. package/bundled/clarify/clarify-gate.js +118 -111
  6. package/bundled/clarify/clarify-select-panel.d.ts +16 -9
  7. package/bundled/clarify/clarify-select-panel.js +65 -67
  8. package/bundled/clarify/clarify-ui-state.d.ts +12 -10
  9. package/bundled/clarify/clarify-ui-state.js +26 -26
  10. package/bundled/clarify/parse-clarify-answer.d.ts +29 -18
  11. package/bundled/clarify/parse-clarify-answer.js +39 -45
  12. package/bundled/clarify/question-format.d.ts +34 -23
  13. package/bundled/clarify/question-format.js +112 -119
  14. package/bundled/clarify/questionnaire-tool.d.ts +28 -17
  15. package/bundled/clarify/questionnaire-tool.js +180 -144
  16. package/bundled/clarify/scope-discovery.d.ts +8 -5
  17. package/bundled/clarify/scope-discovery.js +102 -110
  18. package/bundled/clarify/session-questionnaire.d.ts +48 -13
  19. package/bundled/clarify/session-questionnaire.js +304 -312
  20. package/bundled/clarify/session-questionnaire.types.d.ts +29 -27
  21. package/bundled/clarify/session-questionnaire.types.js +10 -10
  22. package/bundled/components/kubbisec-model-selector.d.ts +47 -34
  23. package/bundled/components/kubbisec-model-selector.js +187 -177
  24. package/bundled/config/config.d.ts +6 -6
  25. package/bundled/config/config.js +55 -55
  26. package/bundled/config/detect-local-llm-providers.d.ts +26 -16
  27. package/bundled/config/detect-local-llm-providers.js +130 -142
  28. package/bundled/config/ensure-kubbisec-project-settings.d.ts +9 -9
  29. package/bundled/config/ensure-kubbisec-project-settings.js +44 -48
  30. package/bundled/config/extended-context.d.ts +5 -6
  31. package/bundled/config/extended-context.js +23 -22
  32. package/bundled/config/feature-flags.d.ts +10 -2
  33. package/bundled/config/feature-flags.js +8 -2
  34. package/bundled/config/format-kubbisec-footer-status.d.ts +1 -1
  35. package/bundled/config/format-kubbisec-footer-status.js +26 -31
  36. package/bundled/config/kubbisec-extension-manifest.d.ts +22 -2
  37. package/bundled/config/kubbisec-extension-manifest.js +20 -20
  38. package/bundled/config/llm-config-mutations.d.ts +51 -25
  39. package/bundled/config/llm-config-mutations.js +173 -182
  40. package/bundled/config/llm-config.d.ts +54 -41
  41. package/bundled/config/llm-config.js +199 -199
  42. package/bundled/config/llm-provider-catalog.d.ts +18 -15
  43. package/bundled/config/llm-provider-catalog.js +45 -46
  44. package/bundled/config/materialize-kubbisec-pi-resources.d.ts +1 -1
  45. package/bundled/config/materialize-kubbisec-pi-resources.js +174 -183
  46. package/bundled/config/register-custom-llm-providers.d.ts +11 -5
  47. package/bundled/config/register-custom-llm-providers.js +17 -15
  48. package/bundled/config/register-kubbisec-llm-provider.d.ts +14 -10
  49. package/bundled/config/register-kubbisec-llm-provider.js +50 -42
  50. package/bundled/config/resolve-agents-context-file.d.ts +1 -1
  51. package/bundled/config/resolve-agents-context-file.js +33 -34
  52. package/bundled/config/resource-budget.d.ts +12 -12
  53. package/bundled/config/resource-budget.js +28 -28
  54. package/bundled/config/sync-kubbisec-pi-models.d.ts +6 -3
  55. package/bundled/config/sync-kubbisec-pi-models.js +58 -58
  56. package/bundled/copy/cli-reference-index.d.ts +3 -2
  57. package/bundled/copy/cli-reference-index.js +1 -1
  58. package/bundled/copy/kubbisec-shell-copy.d.ts +11 -6
  59. package/bundled/copy/kubbisec-shell-copy.js +1 -1
  60. package/bundled/extensions/cli-local-shared.d.ts +45 -26
  61. package/bundled/extensions/cli-local-shared.js +128 -118
  62. package/bundled/extensions/kubbisec-aspm-local.extension.d.ts +18 -15
  63. package/bundled/extensions/kubbisec-aspm-local.extension.js +118 -114
  64. package/bundled/extensions/kubbisec-brand.extension.d.ts +1 -1
  65. package/bundled/extensions/kubbisec-brand.extension.js +25 -25
  66. package/bundled/extensions/kubbisec-byok-provider.extension.d.ts +1 -1
  67. package/bundled/extensions/kubbisec-byok-provider.extension.js +2 -2
  68. package/bundled/extensions/kubbisec-clarify.extension.d.ts +64 -35
  69. package/bundled/extensions/kubbisec-clarify.extension.js +323 -305
  70. package/bundled/extensions/kubbisec-exit.extension.d.ts +1 -1
  71. package/bundled/extensions/kubbisec-exit.extension.js +29 -32
  72. package/bundled/extensions/kubbisec-extended-context.extension.d.ts +1 -1
  73. package/bundled/extensions/kubbisec-extended-context.extension.js +56 -43
  74. package/bundled/extensions/kubbisec-footer.extension.d.ts +14 -14
  75. package/bundled/extensions/kubbisec-footer.extension.js +205 -215
  76. package/bundled/extensions/kubbisec-github-local.extension.d.ts +26 -18
  77. package/bundled/extensions/kubbisec-github-local.extension.js +123 -116
  78. package/bundled/extensions/kubbisec-llm-config.extension.d.ts +1 -1
  79. package/bundled/extensions/kubbisec-llm-config.extension.js +200 -181
  80. package/bundled/extensions/kubbisec-memory.extension.d.ts +9 -7
  81. package/bundled/extensions/kubbisec-memory.extension.js +88 -95
  82. package/bundled/extensions/kubbisec-naus-local.extension.d.ts +18 -15
  83. package/bundled/extensions/kubbisec-naus-local.extension.js +132 -111
  84. package/bundled/extensions/kubbisec-platform-tools.extension.d.ts +31 -21
  85. package/bundled/extensions/kubbisec-platform-tools.extension.js +152 -152
  86. package/bundled/extensions/kubbisec-runtime-status.extension.d.ts +10 -8
  87. package/bundled/extensions/kubbisec-runtime-status.extension.js +15 -13
  88. package/bundled/extensions/kubbisec-scope.extension.d.ts +12 -7
  89. package/bundled/extensions/kubbisec-scope.extension.js +13 -13
  90. package/bundled/extensions/kubbisec-skill-mentions.extension.d.ts +27 -16
  91. package/bundled/extensions/kubbisec-skill-mentions.extension.js +73 -63
  92. package/bundled/extensions/kubbisec-skill-telemetry.extension.d.ts +2 -3
  93. package/bundled/extensions/kubbisec-skill-telemetry.extension.js +59 -64
  94. package/bundled/extensions/kubbisec-theme-lock.extension.d.ts +1 -1
  95. package/bundled/extensions/kubbisec-theme-lock.extension.js +33 -34
  96. package/bundled/extensions/kubbisec-ui.extension.d.ts +1 -1
  97. package/bundled/extensions/kubbisec-ui.extension.js +114 -109
  98. package/bundled/extensions/kubbisec-workflow.extension.d.ts +20 -18
  99. package/bundled/extensions/kubbisec-workflow.extension.js +138 -140
  100. package/bundled/node_modules/@aspm/shared/dist/redaction.test.d.ts +2 -0
  101. package/bundled/node_modules/@aspm/shared/dist/redaction.test.d.ts.map +1 -0
  102. package/bundled/node_modules/@aspm/shared/dist/redaction.test.js +626 -0
  103. package/bundled/node_modules/@aspm/shared/dist/redaction.test.js.map +1 -0
  104. package/bundled/resolve-bundled-dist-root.js +122 -131
  105. package/bundled/skills/at-path-mentions.d.ts +1 -1
  106. package/bundled/skills/at-path-mentions.js +146 -153
  107. package/bundled/skills/chat-mention-render.d.ts +2 -2
  108. package/bundled/skills/chat-mention-render.js +121 -126
  109. package/bundled/skills/chat-mentions.d.ts +17 -8
  110. package/bundled/skills/chat-mentions.js +76 -76
  111. package/bundled/skills/list-bundled-skills.d.ts +3 -3
  112. package/bundled/skills/list-bundled-skills.js +33 -35
  113. package/bundled/skills/skill-mention.d.ts +10 -2
  114. package/bundled/skills/skill-mention.js +10 -2
  115. package/bundled/theme/clear-terminal.d.ts +1 -1
  116. package/bundled/theme/clear-terminal.js +3 -4
  117. package/bundled/theme/footer-render-hook.d.ts +1 -1
  118. package/bundled/theme/footer-render-hook.js +3 -3
  119. package/bundled/theme/kubbisec-brand-fg.d.ts +1 -1
  120. package/bundled/theme/kubbisec-brand-fg.js +2 -2
  121. package/bundled/theme/kubbisec-menu-themes.d.ts +7 -7
  122. package/bundled/theme/kubbisec-menu-themes.js +30 -31
  123. package/bundled/theme/kubbisec-theme-name.d.ts +1 -1
  124. package/bundled/theme/kubbisec-theme-name.js +1 -1
  125. package/bundled/theme/patch-pi-settings-theme.runtime.d.ts +1 -1
  126. package/bundled/theme/patch-pi-settings-theme.runtime.js +11 -10
  127. package/bundled/theme/render-compact-header.d.ts +13 -5
  128. package/bundled/theme/render-compact-header.js +127 -129
  129. package/bundled/workflow/session-workflow-mode.d.ts +1 -1
  130. package/bundled/workflow/session-workflow-mode.js +33 -33
  131. package/package.json +1 -1
@@ -1,161 +1,197 @@
1
1
  import { Type } from "@earendil-works/pi-ai";
2
2
  import { syncExtendedContextFromFields } from "../config/extended-context.js";
3
- import { formatQuestionFromInput, inferScenarioFromMessage, suggestScenarioFields, } from "./question-format.js";
4
- import { applyPendingAnswer, askQuestion, completeQuestionnaire, hasMinimumRemediationScope, mergeRecordedFields, } from "./session-questionnaire.js";
3
+ import {
4
+ formatQuestionFromInput,
5
+ inferScenarioFromMessage,
6
+ suggestScenarioFields,
7
+ } from "./question-format.js";
8
+ import {
9
+ applyPendingAnswer,
10
+ askQuestion,
11
+ completeQuestionnaire,
12
+ hasMinimumRemediationScope,
13
+ mergeRecordedFields,
14
+ } from "./session-questionnaire.js";
5
15
  export function executeQuestionnaireTool(questionnaire, input, userMessage) {
6
- const action = input.action;
7
- if (action === "status") {
8
- const scenario = input.scenario ?? questionnaire.scenario ?? inferScenarioFromMessage(userMessage ?? "");
9
- const suggestion = suggestScenarioFields(scenario, questionnaire.fields);
10
- const lines = [
11
- `Status: ${questionnaire.status}`,
12
- `Scenario: ${scenario}`,
13
- `Awaiting answer: ${questionnaire.awaitingUserAnswer ? "yes" : "no"}`,
14
- `History: ${questionnaire.history.length} answer(s)`,
15
- suggestion.missingFields.length
16
- ? `Missing hints: ${suggestion.missingFields.join(", ")}`
17
- : "No missing hinted fields for this scenario.",
18
- ];
19
- if (suggestion.nextHint) {
20
- lines.push("", `Suggested next field: ${suggestion.nextHint.field} (${suggestion.nextHint.purpose})`, `Example question: ${suggestion.nextHint.exampleQuestion}`, `Example options: ${suggestion.nextHint.exampleOptions.join(" | ")}`);
21
- }
22
- return {
23
- ok: true,
24
- action,
25
- status: questionnaire.status,
26
- message: lines.join("\n"),
27
- questionnaire,
28
- };
16
+ const action = input.action;
17
+ if (action === "status") {
18
+ const scenario =
19
+ input.scenario ?? questionnaire.scenario ?? inferScenarioFromMessage(userMessage ?? "");
20
+ const suggestion = suggestScenarioFields(scenario, questionnaire.fields);
21
+ const lines = [
22
+ `Status: ${questionnaire.status}`,
23
+ `Scenario: ${scenario}`,
24
+ `Awaiting answer: ${questionnaire.awaitingUserAnswer ? "yes" : "no"}`,
25
+ `History: ${questionnaire.history.length} answer(s)`,
26
+ suggestion.missingFields.length
27
+ ? `Missing hints: ${suggestion.missingFields.join(", ")}`
28
+ : "No missing hinted fields for this scenario.",
29
+ ];
30
+ if (suggestion.nextHint) {
31
+ lines.push(
32
+ "",
33
+ `Suggested next field: ${suggestion.nextHint.field} (${suggestion.nextHint.purpose})`,
34
+ `Example question: ${suggestion.nextHint.exampleQuestion}`,
35
+ `Example options: ${suggestion.nextHint.exampleOptions.join(" | ")}`,
36
+ );
29
37
  }
30
- if (action === "complete") {
31
- const mergedFields = input.fields
32
- ? mergeRecordedFields(questionnaire.fields, input.fields)
33
- : questionnaire.fields;
34
- syncExtendedContextFromFields(mergedFields);
35
- const next = completeQuestionnaire(input.fields ? { ...questionnaire, fields: mergedFields } : questionnaire);
36
- return {
37
- ok: true,
38
- action,
39
- status: next.status,
40
- message: "Scope questionnaire marked ready. Mutation tools may proceed when policy allows.",
41
- questionnaire: next,
42
- };
43
- }
44
- if (action === "record") {
45
- if (!input.fields || Object.keys(input.fields).length === 0) {
46
- return {
47
- ok: false,
48
- action,
49
- status: questionnaire.status,
50
- message: "record requires at least one field in `fields`.",
51
- questionnaire,
52
- };
53
- }
54
- const merged = mergeRecordedFields(questionnaire.fields, input.fields);
55
- syncExtendedContextFromFields(merged);
56
- let next = {
57
- ...questionnaire,
58
- fields: merged,
59
- scenario: input.scenario ?? questionnaire.scenario,
60
- updatedAt: new Date().toISOString(),
61
- };
62
- if (hasMinimumRemediationScope(merged) ||
63
- input.scenario === "explore" ||
64
- input.scenario === "review") {
65
- next = completeQuestionnaire(next);
66
- }
67
- return {
68
- ok: true,
69
- action,
70
- status: next.status,
71
- message: next.status === "ready"
72
- ? "Recorded scope fields and marked questionnaire ready."
73
- : "Recorded scope fields. Use ask for any remaining gaps.",
74
- questionnaire: next,
75
- };
38
+ return {
39
+ ok: true,
40
+ action,
41
+ status: questionnaire.status,
42
+ message: lines.join("\n"),
43
+ questionnaire,
44
+ };
45
+ }
46
+ if (action === "complete") {
47
+ const mergedFields = input.fields
48
+ ? mergeRecordedFields(questionnaire.fields, input.fields)
49
+ : questionnaire.fields;
50
+ syncExtendedContextFromFields(mergedFields);
51
+ const next = completeQuestionnaire(
52
+ input.fields ? { ...questionnaire, fields: mergedFields } : questionnaire,
53
+ );
54
+ return {
55
+ ok: true,
56
+ action,
57
+ status: next.status,
58
+ message: "Scope questionnaire marked ready. Mutation tools may proceed when policy allows.",
59
+ questionnaire: next,
60
+ };
61
+ }
62
+ if (action === "record") {
63
+ if (!input.fields || Object.keys(input.fields).length === 0) {
64
+ return {
65
+ ok: false,
66
+ action,
67
+ status: questionnaire.status,
68
+ message: "record requires at least one field in `fields`.",
69
+ questionnaire,
70
+ };
76
71
  }
77
- if (action === "ask") {
78
- const scenario = input.scenario ?? questionnaire.scenario ?? inferScenarioFromMessage(userMessage ?? "");
79
- const field = input.field?.trim() || suggestScenarioFields(scenario, questionnaire.fields).nextHint?.field;
80
- const question = input.question?.trim() ||
81
- suggestScenarioFields(scenario, questionnaire.fields).nextHint?.exampleQuestion;
82
- const options = input.options?.filter(Boolean) ||
83
- suggestScenarioFields(scenario, questionnaire.fields).nextHint?.exampleOptions;
84
- if (!field || !question || !options?.length) {
85
- return {
86
- ok: false,
87
- action,
88
- status: questionnaire.status,
89
- message: "ask requires field + question + options (2–4), or a scenario with remaining hinted fields.",
90
- questionnaire,
91
- };
92
- }
93
- const { markdown, optionLabels, selectionMode } = formatQuestionFromInput({
94
- question,
95
- options,
96
- language: input.language,
97
- field,
98
- });
99
- const next = askQuestion(questionnaire, {
100
- field,
101
- questionMarkdown: markdown,
102
- optionLabels,
103
- scenario,
104
- selectionMode,
105
- });
106
- return {
107
- ok: true,
108
- action,
109
- status: next.status,
110
- formattedQuestion: markdown,
111
- message: [
112
- `Question queued for field "${field}".`,
113
- "Options are shown in the KubbiSec panel only.",
114
- "Reply to the user with one short line (e.g. ask them to pick A–E in the panel).",
115
- "Do not list options or repeat the question body in chat.",
116
- ].join(" "),
117
- questionnaire: next,
118
- };
72
+ const merged = mergeRecordedFields(questionnaire.fields, input.fields);
73
+ syncExtendedContextFromFields(merged);
74
+ let next = {
75
+ ...questionnaire,
76
+ fields: merged,
77
+ scenario: input.scenario ?? questionnaire.scenario,
78
+ updatedAt: new Date().toISOString(),
79
+ };
80
+ if (
81
+ hasMinimumRemediationScope(merged) ||
82
+ input.scenario === "explore" ||
83
+ input.scenario === "review"
84
+ ) {
85
+ next = completeQuestionnaire(next);
119
86
  }
120
87
  return {
88
+ ok: true,
89
+ action,
90
+ status: next.status,
91
+ message:
92
+ next.status === "ready"
93
+ ? "Recorded scope fields and marked questionnaire ready."
94
+ : "Recorded scope fields. Use ask for any remaining gaps.",
95
+ questionnaire: next,
96
+ };
97
+ }
98
+ if (action === "ask") {
99
+ const scenario =
100
+ input.scenario ?? questionnaire.scenario ?? inferScenarioFromMessage(userMessage ?? "");
101
+ const field =
102
+ input.field?.trim() || suggestScenarioFields(scenario, questionnaire.fields).nextHint?.field;
103
+ const question =
104
+ input.question?.trim() ||
105
+ suggestScenarioFields(scenario, questionnaire.fields).nextHint?.exampleQuestion;
106
+ const options =
107
+ input.options?.filter(Boolean) ||
108
+ suggestScenarioFields(scenario, questionnaire.fields).nextHint?.exampleOptions;
109
+ if (!field || !question || !options?.length) {
110
+ return {
121
111
  ok: false,
122
112
  action,
123
113
  status: questionnaire.status,
124
- message: `Unknown action: ${String(action)}`,
114
+ message:
115
+ "ask requires field + question + options (2–4), or a scenario with remaining hinted fields.",
125
116
  questionnaire,
117
+ };
118
+ }
119
+ const { markdown, optionLabels, selectionMode } = formatQuestionFromInput({
120
+ question,
121
+ options,
122
+ language: input.language,
123
+ field,
124
+ });
125
+ const next = askQuestion(questionnaire, {
126
+ field,
127
+ questionMarkdown: markdown,
128
+ optionLabels,
129
+ scenario,
130
+ selectionMode,
131
+ });
132
+ return {
133
+ ok: true,
134
+ action,
135
+ status: next.status,
136
+ formattedQuestion: markdown,
137
+ message: [
138
+ `Question queued for field "${field}".`,
139
+ "Options are shown in the KubbiSec panel only.",
140
+ "Reply to the user with one short line (e.g. ask them to pick A–E in the panel).",
141
+ "Do not list options or repeat the question body in chat.",
142
+ ].join(" "),
143
+ questionnaire: next,
126
144
  };
145
+ }
146
+ return {
147
+ ok: false,
148
+ action,
149
+ status: questionnaire.status,
150
+ message: `Unknown action: ${String(action)}`,
151
+ questionnaire,
152
+ };
127
153
  }
128
154
  export function questionnaireToolParametersSchema() {
129
- return Type.Object({
130
- action: Type.Union([
131
- Type.Literal("ask"),
132
- Type.Literal("record"),
133
- Type.Literal("complete"),
134
- Type.Literal("status"),
135
- ]),
136
- field: Type.Optional(Type.String({ description: "Scope field key, e.g. projectIds, severityMin" })),
137
- question: Type.Optional(Type.String({ description: "Question text tailored to the scenario" })),
138
- options: Type.Optional(Type.Array(Type.String(), {
139
- description: "2–3 short option labels (tool assigns A–C; D is always Other)",
140
- minItems: 2,
141
- maxItems: 3,
142
- })),
143
- scenario: Type.Optional(Type.Union([
144
- Type.Literal("remediation"),
145
- Type.Literal("plan"),
146
- Type.Literal("explore"),
147
- Type.Literal("review"),
148
- ])),
149
- fields: Type.Optional(Type.Object({}, {
150
- description: "Partial scope fields for record/complete",
151
- additionalProperties: true,
152
- })),
153
- language: Type.Optional(Type.Union([Type.Literal("pt"), Type.Literal("en")])),
154
- });
155
+ return Type.Object({
156
+ action: Type.Union([
157
+ Type.Literal("ask"),
158
+ Type.Literal("record"),
159
+ Type.Literal("complete"),
160
+ Type.Literal("status"),
161
+ ]),
162
+ field: Type.Optional(
163
+ Type.String({ description: "Scope field key, e.g. projectIds, severityMin" }),
164
+ ),
165
+ question: Type.Optional(Type.String({ description: "Question text tailored to the scenario" })),
166
+ options: Type.Optional(
167
+ Type.Array(Type.String(), {
168
+ description: "2–3 short option labels (tool assigns A–C; D is always Other)",
169
+ minItems: 2,
170
+ maxItems: 3,
171
+ }),
172
+ ),
173
+ scenario: Type.Optional(
174
+ Type.Union([
175
+ Type.Literal("remediation"),
176
+ Type.Literal("plan"),
177
+ Type.Literal("explore"),
178
+ Type.Literal("review"),
179
+ ]),
180
+ ),
181
+ fields: Type.Optional(
182
+ Type.Object(
183
+ {},
184
+ {
185
+ description: "Partial scope fields for record/complete",
186
+ additionalProperties: true,
187
+ },
188
+ ),
189
+ ),
190
+ language: Type.Optional(Type.Union([Type.Literal("pt"), Type.Literal("en")])),
191
+ });
155
192
  }
156
193
  export function applyParsedUserAnswerIfPending(questionnaire, parsed) {
157
- if (!questionnaire.awaitingUserAnswer || !questionnaire.pending)
158
- return questionnaire;
159
- return applyPendingAnswer(questionnaire, parsed);
194
+ if (!questionnaire.awaitingUserAnswer || !questionnaire.pending) return questionnaire;
195
+ return applyPendingAnswer(questionnaire, parsed);
160
196
  }
161
- //# sourceMappingURL=questionnaire-tool.js.map
197
+ //# sourceMappingURL=questionnaire-tool.js.map
@@ -1,9 +1,12 @@
1
- import type { QuestionnaireScenario, SessionQuestionnaireFields } from "./session-questionnaire.types.js";
1
+ import type {
2
+ QuestionnaireScenario,
3
+ SessionQuestionnaireFields,
4
+ } from "./session-questionnaire.types.js";
2
5
  export type ScopeDiscoveryResult = {
3
- scenario: QuestionnaireScenario;
4
- fields: Partial<SessionQuestionnaireFields> & Record<string, unknown>;
5
- notes: string[];
6
+ scenario: QuestionnaireScenario;
7
+ fields: Partial<SessionQuestionnaireFields> & Record<string, unknown>;
8
+ notes: string[];
6
9
  };
7
10
  /** Discover scope from env, workspace, and user message before asking questions. */
8
11
  export declare function discoverScopeHints(cwd: string, userMessage: string): ScopeDiscoveryResult;
9
- //# sourceMappingURL=scope-discovery.d.ts.map
12
+ //# sourceMappingURL=scope-discovery.d.ts.map
@@ -1,130 +1,122 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
- import { KUBBISEC_CONTEXT_DIR, KUBBISEC_PROJECT_CONFIG_DIR, } from "../config/ensure-kubbisec-project-settings.js";
3
+ import {
4
+ KUBBISEC_CONTEXT_DIR,
5
+ KUBBISEC_PROJECT_CONFIG_DIR,
6
+ } from "../config/ensure-kubbisec-project-settings.js";
4
7
  import { inferScenarioFromMessage } from "./question-format.js";
5
8
  import { readDefaultProjectId } from "./session-questionnaire.js";
9
+
6
10
  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;
11
+ const SEVERITY_IN_MESSAGE =
12
+ /\b(severity|severidade|critical|critico|crítico|high|alto|medium|medio|médio)\b/i;
13
+ const REMEDIATION_MODE_IN_MESSAGE =
14
+ /\b(auto|automático|automatico|suggestion|sugestão|sugestao|manual|híbrido|hibrido)\b/i;
9
15
  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
- }
16
+ const settingsPath = path.join(cwd, KUBBISEC_PROJECT_CONFIG_DIR, "settings.json");
17
+ try {
18
+ return JSON.parse(fs.readFileSync(settingsPath, "utf8"));
19
+ } catch {
20
+ return null;
21
+ }
17
22
  }
18
23
  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
- }
24
+ try {
25
+ const raw = fs.readFileSync(path.join(cwd, "package.json"), "utf8");
26
+ const parsed = JSON.parse(raw);
27
+ return typeof parsed.name === "string" ? parsed.name.trim() : undefined;
28
+ } catch {
29
+ return undefined;
30
+ }
27
31
  }
28
32
  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
- }
33
+ try {
34
+ const raw = fs.readFileSync(path.join(cwd, ".git", "config"), "utf8");
35
+ const match = raw.match(/url\s*=\s*(.+)/);
36
+ return match?.[1]?.trim();
37
+ } catch {
38
+ return undefined;
39
+ }
37
40
  }
38
41
  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;
42
+ const upper = message.toUpperCase();
43
+ if (/\bCRITICAL|CRÍTICO|CRITICO\b/.test(upper)) return "CRITICAL";
44
+ if (/\bHIGH|ALTO\b/.test(upper)) return "HIGH";
45
+ if (/\bMEDIUM|MÉDIO|MEDIO\b/.test(upper)) return "MEDIUM";
46
+ if (/\bALL|TODAS\b/.test(upper)) return "ALL";
47
+ return undefined;
49
48
  }
50
49
  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;
50
+ if (/\b(sugest|suggest|manual|híbrido|hibrido|plano)\b/i.test(message)) return "suggestion";
51
+ if (/\b(auto|automático|automatico|pr|patch)\b/i.test(message)) return "auto";
52
+ return undefined;
56
53
  }
57
54
  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;
55
+ const trimmed = message.trim();
56
+ if (trimmed.length < 12) return undefined;
57
+ if (/^@plan\b/i.test(trimmed)) {
58
+ return trimmed.replace(/^@plan\b\s*/i, "").trim() || undefined;
59
+ }
60
+ if (/^@planejar\b/i.test(trimmed)) {
61
+ return trimmed.replace(/^@planejar\b\s*/i, "").trim() || undefined;
62
+ }
63
+ return trimmed;
68
64
  }
69
65
  /** Discover scope from env, workspace, and user message before asking questions. */
70
66
  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 };
67
+ const scenario = inferScenarioFromMessage(userMessage);
68
+ const fields = {};
69
+ const extras = {};
70
+ const notes = [];
71
+ const defaultProject = readDefaultProjectId();
72
+ if (defaultProject) {
73
+ fields.projectIds = [defaultProject];
74
+ notes.push("default project from config");
75
+ }
76
+ const projectMatch = PROJECT_IN_MESSAGE.exec(userMessage);
77
+ const projectFromMsg = projectMatch?.[2] ?? projectMatch?.[3];
78
+ if (projectFromMsg) {
79
+ fields.projectIds = [projectFromMsg];
80
+ notes.push("project from message");
81
+ }
82
+ const severity = severityFromMessage(userMessage);
83
+ if (severity) {
84
+ fields.severityMin = severity;
85
+ notes.push("severity from message");
86
+ } else if (SEVERITY_IN_MESSAGE.test(userMessage)) {
87
+ notes.push("severity cue in message");
88
+ }
89
+ const remediationMode = remediationModeFromMessage(userMessage);
90
+ if (remediationMode) {
91
+ fields.remediationMode = remediationMode;
92
+ notes.push("remediation mode from message");
93
+ } else if (REMEDIATION_MODE_IN_MESSAGE.test(userMessage)) {
94
+ notes.push("remediation mode cue in message");
95
+ }
96
+ const objective = objectiveFromMessage(userMessage);
97
+ if (objective && scenario === "plan") {
98
+ fields.customNotes = objective;
99
+ notes.push("plan objective from message");
100
+ }
101
+ const pkg = readPackageName(cwd);
102
+ if (pkg) extras.stack = pkg;
103
+ const remote = readGitRemote(cwd);
104
+ if (remote) extras.gitRemote = remote;
105
+ const settings = readLocalSettings(cwd);
106
+ if (settings && typeof settings.defaultProject === "string" && settings.defaultProject.trim()) {
107
+ if (!fields.projectIds?.length) {
108
+ fields.projectIds = [settings.defaultProject.trim()];
109
+ notes.push("project from .kubbisec/settings.json");
110
+ }
111
+ }
112
+ const contextDir = path.join(cwd, KUBBISEC_PROJECT_CONFIG_DIR, KUBBISEC_CONTEXT_DIR);
113
+ if (fs.existsSync(contextDir)) {
114
+ extras.workspaceContext = "present";
115
+ notes.push("local .kubbisec/context");
116
+ }
117
+ if (Object.keys(extras).length > 0) {
118
+ fields.extras = extras;
119
+ }
120
+ return { scenario, fields, notes };
129
121
  }
130
- //# sourceMappingURL=scope-discovery.js.map
122
+ //# sourceMappingURL=scope-discovery.js.map