@kubbisec/ai-linux-x64 0.1.3 → 0.1.4

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 (122) hide show
  1. package/bin/kubbisec +0 -0
  2. package/bundled/assets/terminal/banner-compact.ansi +7 -0
  3. package/bundled/assets/terminal/banner-wide.ansi +10 -0
  4. package/bundled/assets/terminal/logotipo-compact-fallback.ansi +7 -0
  5. package/bundled/assets/terminal/logotipo-compact.ansi +1 -0
  6. package/bundled/assets/terminal/logotipo-compact.png +0 -0
  7. package/bundled/assets/terminal/logotipo-wide-fallback.ansi +10 -0
  8. package/bundled/assets/terminal/logotipo-wide.ansi +1 -0
  9. package/bundled/assets/terminal/logotipo-wide.png +0 -0
  10. package/bundled/assets/terminal/mark.ansi +7 -0
  11. package/bundled/edit-format.md +17 -0
  12. package/bundled/extensions/cli-local-shared.d.ts +26 -0
  13. package/bundled/extensions/cli-local-shared.d.ts.map +1 -0
  14. package/bundled/extensions/cli-local-shared.js +97 -0
  15. package/bundled/extensions/cli-local-shared.js.map +1 -0
  16. package/bundled/extensions/kubbisec-aspm-local.extension.d.ts +17 -0
  17. package/bundled/extensions/kubbisec-aspm-local.extension.d.ts.map +1 -0
  18. package/bundled/extensions/kubbisec-aspm-local.extension.js +134 -0
  19. package/bundled/extensions/kubbisec-aspm-local.extension.js.map +1 -0
  20. package/bundled/extensions/kubbisec-brand.extension.d.ts +20 -0
  21. package/bundled/extensions/kubbisec-brand.extension.d.ts.map +1 -0
  22. package/bundled/extensions/kubbisec-brand.extension.js +84 -0
  23. package/bundled/extensions/kubbisec-brand.extension.js.map +1 -0
  24. package/bundled/extensions/kubbisec-byok-provider.extension.d.ts +30 -0
  25. package/bundled/extensions/kubbisec-byok-provider.extension.d.ts.map +1 -0
  26. package/bundled/extensions/kubbisec-byok-provider.extension.js +44 -0
  27. package/bundled/extensions/kubbisec-byok-provider.extension.js.map +1 -0
  28. package/bundled/extensions/kubbisec-clarify.extension.d.ts +45 -0
  29. package/bundled/extensions/kubbisec-clarify.extension.d.ts.map +1 -0
  30. package/bundled/extensions/kubbisec-clarify.extension.js +305 -0
  31. package/bundled/extensions/kubbisec-clarify.extension.js.map +1 -0
  32. package/bundled/extensions/kubbisec-footer.extension.d.ts +64 -0
  33. package/bundled/extensions/kubbisec-footer.extension.d.ts.map +1 -0
  34. package/bundled/extensions/kubbisec-footer.extension.js +187 -0
  35. package/bundled/extensions/kubbisec-footer.extension.js.map +1 -0
  36. package/bundled/extensions/kubbisec-github-local.extension.d.ts +23 -0
  37. package/bundled/extensions/kubbisec-github-local.extension.d.ts.map +1 -0
  38. package/bundled/extensions/kubbisec-github-local.extension.js +105 -0
  39. package/bundled/extensions/kubbisec-github-local.extension.js.map +1 -0
  40. package/bundled/extensions/kubbisec-memory.extension.d.ts +12 -0
  41. package/bundled/extensions/kubbisec-memory.extension.d.ts.map +1 -0
  42. package/bundled/extensions/kubbisec-memory.extension.js +107 -0
  43. package/bundled/extensions/kubbisec-memory.extension.js.map +1 -0
  44. package/bundled/extensions/kubbisec-naus-local.extension.d.ts +17 -0
  45. package/bundled/extensions/kubbisec-naus-local.extension.d.ts.map +1 -0
  46. package/bundled/extensions/kubbisec-naus-local.extension.js +125 -0
  47. package/bundled/extensions/kubbisec-naus-local.extension.js.map +1 -0
  48. package/bundled/extensions/kubbisec-platform-tools.extension.d.ts +27 -0
  49. package/bundled/extensions/kubbisec-platform-tools.extension.d.ts.map +1 -0
  50. package/bundled/extensions/kubbisec-platform-tools.extension.js +144 -0
  51. package/bundled/extensions/kubbisec-platform-tools.extension.js.map +1 -0
  52. package/bundled/extensions/kubbisec-runtime-status.extension.d.ts +13 -0
  53. package/bundled/extensions/kubbisec-runtime-status.extension.d.ts.map +1 -0
  54. package/bundled/extensions/kubbisec-runtime-status.extension.js +18 -0
  55. package/bundled/extensions/kubbisec-runtime-status.extension.js.map +1 -0
  56. package/bundled/extensions/kubbisec-scope.extension.d.ts +14 -0
  57. package/bundled/extensions/kubbisec-scope.extension.d.ts.map +1 -0
  58. package/bundled/extensions/kubbisec-scope.extension.js +14 -0
  59. package/bundled/extensions/kubbisec-scope.extension.js.map +1 -0
  60. package/bundled/extensions/kubbisec-skill-mentions.extension.d.ts +24 -0
  61. package/bundled/extensions/kubbisec-skill-mentions.extension.d.ts.map +1 -0
  62. package/bundled/extensions/kubbisec-skill-mentions.extension.js +54 -0
  63. package/bundled/extensions/kubbisec-skill-mentions.extension.js.map +1 -0
  64. package/bundled/extensions/kubbisec-skill-telemetry.extension.d.ts +6 -0
  65. package/bundled/extensions/kubbisec-skill-telemetry.extension.d.ts.map +1 -0
  66. package/bundled/extensions/kubbisec-skill-telemetry.extension.js +85 -0
  67. package/bundled/extensions/kubbisec-skill-telemetry.extension.js.map +1 -0
  68. package/bundled/extensions/kubbisec-ui.extension.d.ts +6 -0
  69. package/bundled/extensions/kubbisec-ui.extension.d.ts.map +1 -0
  70. package/bundled/extensions/kubbisec-ui.extension.js +116 -0
  71. package/bundled/extensions/kubbisec-ui.extension.js.map +1 -0
  72. package/bundled/extensions/kubbisec-workflow.extension.d.ts +38 -0
  73. package/bundled/extensions/kubbisec-workflow.extension.d.ts.map +1 -0
  74. package/bundled/extensions/kubbisec-workflow.extension.js +169 -0
  75. package/bundled/extensions/kubbisec-workflow.extension.js.map +1 -0
  76. package/bundled/gate-system.md +27 -0
  77. package/bundled/reflect-system.md +31 -0
  78. package/bundled/skills/aspm-platform/SKILL.md +58 -0
  79. package/bundled/skills/chat-mention-render.d.ts +7 -0
  80. package/bundled/skills/chat-mention-render.d.ts.map +1 -0
  81. package/bundled/skills/chat-mention-render.js +122 -0
  82. package/bundled/skills/chat-mention-render.js.map +1 -0
  83. package/bundled/skills/chat-mention-render.test.ts +47 -0
  84. package/bundled/skills/chat-mention-render.ts +141 -0
  85. package/bundled/skills/chat-mentions.d.ts +27 -0
  86. package/bundled/skills/chat-mentions.d.ts.map +1 -0
  87. package/bundled/skills/chat-mentions.js +104 -0
  88. package/bundled/skills/chat-mentions.js.map +1 -0
  89. package/bundled/skills/chat-mentions.test.ts +32 -0
  90. package/bundled/skills/chat-mentions.ts +126 -0
  91. package/bundled/skills/github-local/SKILL.md +16 -0
  92. package/bundled/skills/list-bundled-skills.d.ts +7 -0
  93. package/bundled/skills/list-bundled-skills.d.ts.map +1 -0
  94. package/bundled/skills/list-bundled-skills.js +44 -0
  95. package/bundled/skills/list-bundled-skills.js.map +1 -0
  96. package/bundled/skills/list-bundled-skills.ts +46 -0
  97. package/bundled/skills/naus-pipelines/SKILL.md +31 -0
  98. package/bundled/skills/remediation/SKILL.md +12 -0
  99. package/bundled/skills/scanner-gitleaks/SKILL.md +10 -0
  100. package/bundled/skills/scanner-nmap/SKILL.md +10 -0
  101. package/bundled/skills/scanner-osv/SKILL.md +10 -0
  102. package/bundled/skills/scanner-semgrep/SKILL.md +10 -0
  103. package/bundled/skills/scanner-skipfish/SKILL.md +10 -0
  104. package/bundled/skills/scanner-sonar/SKILL.md +10 -0
  105. package/bundled/skills/scanner-syft/SKILL.md +10 -0
  106. package/bundled/skills/scanner-trivy/SKILL.md +10 -0
  107. package/bundled/skills/sec-brainstorm/SKILL.md +74 -0
  108. package/bundled/skills/sec-clarify/SKILL.md +68 -0
  109. package/bundled/skills/sec-debug/SKILL.md +94 -0
  110. package/bundled/skills/sec-plan/SKILL.md +101 -0
  111. package/bundled/skills/sec-review/SKILL.md +110 -0
  112. package/bundled/skills/sec-review/code-reviewer-sec.md +176 -0
  113. package/bundled/skills/sec-using-skills/SKILL.md +79 -0
  114. package/bundled/skills/sec-verify/SKILL.md +77 -0
  115. package/bundled/skills/skill-mention.d.ts +3 -0
  116. package/bundled/skills/skill-mention.d.ts.map +1 -0
  117. package/bundled/skills/skill-mention.js +3 -0
  118. package/bundled/skills/skill-mention.js.map +1 -0
  119. package/bundled/skills/skill-mention.test.ts +46 -0
  120. package/bundled/skills/skill-mention.ts +10 -0
  121. package/bundled/theme/kubbisec.json +93 -0
  122. package/package.json +3 -2
@@ -0,0 +1,187 @@
1
+ /**
2
+ * KubbiSec AI footer: always shows org model as `(kubbisec) {model_name}` instead of raw provider id.
3
+ */
4
+ import { isAbsolute, relative, resolve, sep } from "node:path";
5
+ import { formatKubbisecFooterStatusLine } from "../config/format-kubbisec-footer-status.js";
6
+ import { KUBBISEC_PROVIDER_LABEL } from "../copy/kubbisec-shell-copy.js";
7
+ function visibleWidth(text) {
8
+ return text.replace(/\x1b\[[0-9;]*m/g, "").length;
9
+ }
10
+ function truncateToWidth(text, width, ellipsis) {
11
+ if (visibleWidth(text) <= width)
12
+ return text;
13
+ const target = Math.max(0, width - visibleWidth(ellipsis));
14
+ let out = "";
15
+ let w = 0;
16
+ let i = 0;
17
+ while (i < text.length && w < target) {
18
+ if (text[i] === "\x1b") {
19
+ const end = text.indexOf("m", i);
20
+ if (end === -1)
21
+ break;
22
+ out += text.slice(i, end + 1);
23
+ i = end + 1;
24
+ continue;
25
+ }
26
+ out += text[i];
27
+ w += 1;
28
+ i += 1;
29
+ }
30
+ return out + ellipsis;
31
+ }
32
+ function formatTokens(count) {
33
+ if (count < 1000)
34
+ return count.toString();
35
+ if (count < 10000)
36
+ return `${(count / 1000).toFixed(1)}k`;
37
+ if (count < 1000000)
38
+ return `${Math.round(count / 1000)}k`;
39
+ if (count < 10000000)
40
+ return `${(count / 1000000).toFixed(1)}M`;
41
+ return `${Math.round(count / 1000000)}M`;
42
+ }
43
+ function truncatePathMiddle(text, maxWidth) {
44
+ if (visibleWidth(text) <= maxWidth)
45
+ return text;
46
+ const branchMatch = text.match(/(\s\([^)]+\))$/);
47
+ const branch = branchMatch?.[1] ?? "";
48
+ const base = branch ? text.slice(0, -branch.length) : text;
49
+ const ellipsis = "…";
50
+ const room = maxWidth - visibleWidth(branch) - visibleWidth(ellipsis);
51
+ if (room < 4)
52
+ return truncateToWidth(text, maxWidth, ellipsis);
53
+ const head = Math.max(2, Math.ceil(room * 0.45));
54
+ const tail = Math.max(2, room - head);
55
+ return base.slice(0, head) + ellipsis + base.slice(-tail) + branch;
56
+ }
57
+ function formatCwdForFooter(cwd, home) {
58
+ if (!home)
59
+ return cwd;
60
+ const resolvedCwd = resolve(cwd);
61
+ const resolvedHome = resolve(home);
62
+ const relativeToHome = relative(resolvedHome, resolvedCwd);
63
+ const isInsideHome = relativeToHome === "" ||
64
+ (relativeToHome !== ".." && !relativeToHome.startsWith(`..${sep}`) && !isAbsolute(relativeToHome));
65
+ if (!isInsideHome)
66
+ return cwd;
67
+ return relativeToHome === "" ? "~" : `~${sep}${relativeToHome}`;
68
+ }
69
+ function resolveKubbisecFooterModelLabel(ctx) {
70
+ return (process.env.KUBBISEC_AI_MODEL_ID?.trim() ||
71
+ process.env.KUBBISEC_AI_MODEL?.trim() ||
72
+ process.env.KUBBISEC_PI_MODEL?.trim() ||
73
+ process.env.NAUS_PI_MODEL?.trim() ||
74
+ ctx.model?.id?.trim() ||
75
+ "no-model");
76
+ }
77
+ function buildFooterComponent(ctx, theme, footerData) {
78
+ return {
79
+ invalidate() { },
80
+ render(width) {
81
+ let totalInput = 0;
82
+ let totalOutput = 0;
83
+ let totalCacheRead = 0;
84
+ let totalCacheWrite = 0;
85
+ let totalCost = 0;
86
+ for (const entry of ctx.sessionManager.getBranch()) {
87
+ if (entry.type !== "message" || !entry.message || entry.message.role !== "assistant") {
88
+ continue;
89
+ }
90
+ const m = entry.message;
91
+ totalInput += m.usage.input;
92
+ totalOutput += m.usage.output;
93
+ totalCacheRead += m.usage.cacheRead;
94
+ totalCacheWrite += m.usage.cacheWrite;
95
+ totalCost += m.usage.cost.total;
96
+ }
97
+ const contextUsage = ctx.getContextUsage();
98
+ const contextWindow = contextUsage?.contextWindow ?? ctx.model?.contextWindow ?? 0;
99
+ const contextPercentValue = contextUsage?.percent ?? 0;
100
+ const contextPercent = contextUsage?.percent !== null ? contextPercentValue.toFixed(1) : "?";
101
+ let pwd = formatCwdForFooter(ctx.sessionManager.getCwd(), process.env.HOME || process.env.USERPROFILE);
102
+ const branch = footerData.getGitBranch();
103
+ if (branch)
104
+ pwd = `${pwd} (${branch})`;
105
+ const sessionName = ctx.sessionManager.getSessionName();
106
+ if (sessionName)
107
+ pwd = `${pwd} • ${sessionName}`;
108
+ const statsParts = [];
109
+ if (totalInput)
110
+ statsParts.push(`↑${formatTokens(totalInput)}`);
111
+ if (totalOutput)
112
+ statsParts.push(`↓${formatTokens(totalOutput)}`);
113
+ if (totalCacheRead)
114
+ statsParts.push(`R${formatTokens(totalCacheRead)}`);
115
+ if (totalCacheWrite)
116
+ statsParts.push(`W${formatTokens(totalCacheWrite)}`);
117
+ if (totalCost)
118
+ statsParts.push(`$${totalCost.toFixed(3)}`);
119
+ const autoIndicator = " (auto)";
120
+ const contextPercentDisplay = contextPercent === "?"
121
+ ? `?/${formatTokens(contextWindow)}${autoIndicator}`
122
+ : `${contextPercent}%/${formatTokens(contextWindow)}${autoIndicator}`;
123
+ if (contextPercentValue > 90) {
124
+ statsParts.push(theme.fg("error", contextPercentDisplay));
125
+ }
126
+ else if (contextPercentValue > 70) {
127
+ statsParts.push(theme.fg("warning", contextPercentDisplay));
128
+ }
129
+ else {
130
+ statsParts.push(contextPercentDisplay);
131
+ }
132
+ let statsLeft = statsParts.join(" ");
133
+ const modelLabel = resolveKubbisecFooterModelLabel(ctx);
134
+ const rightPlain = `(${KUBBISEC_PROVIDER_LABEL}) ${modelLabel}`;
135
+ let statsLeftWidth = visibleWidth(statsLeft);
136
+ if (statsLeftWidth > width) {
137
+ statsLeft = truncateToWidth(statsLeft, width, "...");
138
+ statsLeftWidth = visibleWidth(statsLeft);
139
+ }
140
+ const minPadding = 2;
141
+ let rightPlainShown = rightPlain;
142
+ let rightSideWidth = visibleWidth(rightPlainShown);
143
+ const totalNeeded = statsLeftWidth + minPadding + rightSideWidth;
144
+ if (totalNeeded > width) {
145
+ const availableForRight = Math.max(0, width - statsLeftWidth - minPadding);
146
+ rightPlainShown =
147
+ availableForRight > 0 ? truncateToWidth(rightPlain, availableForRight, "") : "";
148
+ rightSideWidth = visibleWidth(rightPlainShown);
149
+ }
150
+ const padding = Math.max(0, width - statsLeftWidth - rightSideWidth);
151
+ const statsLine = theme.fg("dim", statsLeft) + " ".repeat(padding) + theme.fg("accent", rightPlainShown);
152
+ const pwdLine = truncateToWidth(theme.fg("dim", truncatePathMiddle(pwd, width)), width, theme.fg("dim", "…"));
153
+ const lines = [pwdLine];
154
+ const kubbisecMeta = formatKubbisecFooterStatusLine(footerData.getExtensionStatuses());
155
+ if (kubbisecMeta) {
156
+ lines.push(truncateToWidth(theme.fg("dim", kubbisecMeta), width, theme.fg("dim", "…")));
157
+ }
158
+ lines.push(statsLine);
159
+ return lines;
160
+ },
161
+ };
162
+ }
163
+ export default function kubbisecFooter(api) {
164
+ let requestRender;
165
+ for (const event of ["model_select", "turn_end", "message_end", "session_compact"]) {
166
+ api.on(event, async () => {
167
+ requestRender?.();
168
+ });
169
+ }
170
+ api.on("session_start", async (_event, ctx) => {
171
+ if (!ctx.hasUI)
172
+ return;
173
+ ctx.ui.setFooter((tui, theme, footerData) => {
174
+ requestRender = () => tui.requestRender();
175
+ const unsubBranch = footerData.onBranchChange(() => tui.requestRender());
176
+ const component = buildFooterComponent(ctx, theme, footerData);
177
+ return {
178
+ ...component,
179
+ dispose() {
180
+ unsubBranch();
181
+ requestRender = undefined;
182
+ },
183
+ };
184
+ });
185
+ });
186
+ }
187
+ //# sourceMappingURL=kubbisec-footer.extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kubbisec-footer.extension.js","sourceRoot":"","sources":["../../src/extensions/kubbisec-footer.extension.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,8BAA8B,EAAE,MAAM,4CAA4C,CAAC;AAC5F,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAoEzE,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;AACpD,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,KAAa,EAAE,QAAgB;IACpE,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3D,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACjC,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,MAAM;YACtB,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;YAC9B,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;YACZ,SAAS;QACX,CAAC;QACD,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,CAAC,IAAI,CAAC,CAAC;QACP,CAAC,IAAI,CAAC,CAAC;IACT,CAAC;IACD,OAAO,GAAG,GAAG,QAAQ,CAAC;AACxB,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1C,IAAI,KAAK,GAAG,KAAK;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,IAAI,KAAK,GAAG,OAAO;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC;IAC3D,IAAI,KAAK,GAAG,QAAQ;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAChE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC;AAC3C,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,QAAgB;IACxD,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IAChD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,MAAM,QAAQ,GAAG,GAAG,CAAC;IACrB,MAAM,IAAI,GAAG,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtE,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACrE,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW,EAAE,IAAwB;IAC/D,IAAI,CAAC,IAAI;QAAE,OAAO,GAAG,CAAC;IACtB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,cAAc,GAAG,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAC3D,MAAM,YAAY,GAChB,cAAc,KAAK,EAAE;QACrB,CAAC,cAAc,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;IACrG,IAAI,CAAC,YAAY;QAAE,OAAO,GAAG,CAAC;IAC9B,OAAO,cAAc,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,cAAc,EAAE,CAAC;AAClE,CAAC;AAED,SAAS,+BAA+B,CAAC,GAAqB;IAC5D,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE;QACxC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE;QACjC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE;QACrB,UAAU,CACX,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,GAAqB,EACrB,KAAY,EACZ,UAA8B;IAE9B,OAAO;QACL,UAAU,KAAI,CAAC;QACf,MAAM,CAAC,KAAa;YAClB,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,WAAW,GAAG,CAAC,CAAC;YACpB,IAAI,cAAc,GAAG,CAAC,CAAC;YACvB,IAAI,eAAe,GAAG,CAAC,CAAC;YACxB,IAAI,SAAS,GAAG,CAAC,CAAC;YAElB,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,CAAC;gBACnD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBACrF,SAAS;gBACX,CAAC;gBACD,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;gBACxB,UAAU,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;gBAC5B,WAAW,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC9B,cAAc,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;gBACpC,eAAe,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;gBACtC,SAAS,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YAClC,CAAC;YAED,MAAM,YAAY,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;YAC3C,MAAM,aAAa,GAAG,YAAY,EAAE,aAAa,IAAI,GAAG,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;YACnF,MAAM,mBAAmB,GAAG,YAAY,EAAE,OAAO,IAAI,CAAC,CAAC;YACvD,MAAM,cAAc,GAAG,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAE7F,IAAI,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACvG,MAAM,MAAM,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC;YACzC,IAAI,MAAM;gBAAE,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,GAAG,CAAC;YACvC,MAAM,WAAW,GAAG,GAAG,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;YACxD,IAAI,WAAW;gBAAE,GAAG,GAAG,GAAG,GAAG,MAAM,WAAW,EAAE,CAAC;YAEjD,MAAM,UAAU,GAAa,EAAE,CAAC;YAChC,IAAI,UAAU;gBAAE,UAAU,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAChE,IAAI,WAAW;gBAAE,UAAU,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAClE,IAAI,cAAc;gBAAE,UAAU,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YACxE,IAAI,eAAe;gBAAE,UAAU,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YAC1E,IAAI,SAAS;gBAAE,UAAU,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAE3D,MAAM,aAAa,GAAG,SAAS,CAAC;YAChC,MAAM,qBAAqB,GACzB,cAAc,KAAK,GAAG;gBACpB,CAAC,CAAC,KAAK,YAAY,CAAC,aAAa,CAAC,GAAG,aAAa,EAAE;gBACpD,CAAC,CAAC,GAAG,cAAc,KAAK,YAAY,CAAC,aAAa,CAAC,GAAG,aAAa,EAAE,CAAC;YAC1E,IAAI,mBAAmB,GAAG,EAAE,EAAE,CAAC;gBAC7B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC;YAC5D,CAAC;iBAAM,IAAI,mBAAmB,GAAG,EAAE,EAAE,CAAC;gBACpC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACzC,CAAC;YAED,IAAI,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,UAAU,GAAG,+BAA+B,CAAC,GAAG,CAAC,CAAC;YACxD,MAAM,UAAU,GAAG,IAAI,uBAAuB,KAAK,UAAU,EAAE,CAAC;YAEhE,IAAI,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,cAAc,GAAG,KAAK,EAAE,CAAC;gBAC3B,SAAS,GAAG,eAAe,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBACrD,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,UAAU,GAAG,CAAC,CAAC;YACrB,IAAI,eAAe,GAAG,UAAU,CAAC;YACjC,IAAI,cAAc,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;YACnD,MAAM,WAAW,GAAG,cAAc,GAAG,UAAU,GAAG,cAAc,CAAC;YAEjE,IAAI,WAAW,GAAG,KAAK,EAAE,CAAC;gBACxB,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,cAAc,GAAG,UAAU,CAAC,CAAC;gBAC3E,eAAe;oBACb,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,UAAU,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClF,cAAc,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;YACjD,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,cAAc,GAAG,cAAc,CAAC,CAAC;YACrE,MAAM,SAAS,GACb,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;YAEzF,MAAM,OAAO,GAAG,eAAe,CAC7B,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAC/C,KAAK,EACL,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CACrB,CAAC;YACF,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC;YAExB,MAAM,YAAY,GAAG,8BAA8B,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;YACvF,IAAI,YAAY,EAAE,CAAC;gBACjB,KAAK,CAAC,IAAI,CACR,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAC5E,CAAC;YACJ,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAEtB,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,GAAiB;IACtD,IAAI,aAAuC,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,CAAU,EAAE,CAAC;QAC5F,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;YACvB,aAAa,EAAE,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC5C,IAAI,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO;QAEvB,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YAC1C,aAAa,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAC1C,MAAM,WAAW,GAAG,UAAU,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;YACzE,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YAE/D,OAAO;gBACL,GAAG,SAAS;gBACZ,OAAO;oBACL,WAAW,EAAE,CAAC;oBACd,aAAa,GAAG,SAAS,CAAC;gBAC5B,CAAC;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,23 @@
1
+ type ExtensionApi = {
2
+ on: (event: string, handler: (event: unknown, ctx: ExtensionContext) => void | Promise<void>) => void;
3
+ registerTool: (def: {
4
+ name: string;
5
+ label: string;
6
+ description: string;
7
+ parameters: unknown;
8
+ execute: (toolCallId: string, params: Record<string, unknown>, signal: AbortSignal, onUpdate: unknown, ctx: ExtensionContext) => Promise<{
9
+ content: Array<{
10
+ type: "text";
11
+ text: string;
12
+ }>;
13
+ }>;
14
+ }) => void;
15
+ };
16
+ type ExtensionContext = {
17
+ ui?: {
18
+ notify: (message: string, level: string) => void;
19
+ };
20
+ };
21
+ export default function kubbisecGithubLocal(api: ExtensionApi): void;
22
+ export {};
23
+ //# sourceMappingURL=kubbisec-github-local.extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kubbisec-github-local.extension.d.ts","sourceRoot":"","sources":["../../src/extensions/kubbisec-github-local.extension.ts"],"names":[],"mappings":"AA+CA,KAAK,YAAY,GAAG;IAClB,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IACtG,YAAY,EAAE,CAAC,GAAG,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,CACP,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,OAAO,EACjB,GAAG,EAAE,gBAAgB,KAClB,OAAO,CAAC;YAAE,OAAO,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,CAAC,CAAC;KAClE,KAAK,IAAI,CAAC;CACZ,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,EAAE,CAAC,EAAE;QAAE,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CAC3D,CAAC;AAcF,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CA8DnE"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Local GitHub/gh tools — only when user opted in: KUBBISEC_CHAT_EXTENDED_CONTEXT=1
3
+ */
4
+ import { spawn } from "node:child_process";
5
+ import * as fs from "node:fs";
6
+ import * as path from "node:path";
7
+ import { Type } from "@earendil-works/pi-ai";
8
+ function extendedContextEnabled() {
9
+ return process.env.KUBBISEC_CHAT_EXTENDED_CONTEXT === "1";
10
+ }
11
+ function resolveWorkspace() {
12
+ const fromEnv = process.env.KUBBISEC_LOCAL_WORKSPACE?.trim() ||
13
+ process.env.KUBBISEC_AI_WORKSPACE?.trim();
14
+ return fromEnv ? path.resolve(fromEnv) : process.cwd();
15
+ }
16
+ function execCapture(bin, args, cwd) {
17
+ return new Promise((resolve, reject) => {
18
+ const child = spawn(bin, args, {
19
+ cwd,
20
+ env: {
21
+ ...process.env,
22
+ GIT_TERMINAL_PROMPT: "0",
23
+ GH_PROMPT_DISABLED: "1",
24
+ },
25
+ stdio: ["ignore", "pipe", "pipe"],
26
+ });
27
+ let stdout = "";
28
+ let stderr = "";
29
+ child.stdout?.on("data", (c) => {
30
+ stdout += String(c);
31
+ });
32
+ child.stderr?.on("data", (c) => {
33
+ stderr += String(c);
34
+ });
35
+ child.on("error", reject);
36
+ child.on("close", (code) => resolve({ code: code ?? 1, stdout, stderr }));
37
+ });
38
+ }
39
+ function denyExtended() {
40
+ return {
41
+ content: [
42
+ {
43
+ type: "text",
44
+ text: "Extended local context is disabled. Restart with: kubbisec chat --extended-context [-w <workspace>]",
45
+ },
46
+ ],
47
+ };
48
+ }
49
+ export default function kubbisecGithubLocal(api) {
50
+ api.registerTool({
51
+ name: "github_local_status",
52
+ label: "GitHub local status",
53
+ description: "Reports gh auth and git remote on this machine (requires kubbisec chat --extended-context).",
54
+ parameters: Type.Object({}),
55
+ async execute() {
56
+ if (!extendedContextEnabled())
57
+ return denyExtended();
58
+ const cwd = resolveWorkspace();
59
+ const parts = [`workspace: ${cwd}`];
60
+ try {
61
+ const gh = await execCapture("gh", ["auth", "status"], cwd);
62
+ parts.push(`gh auth status (exit ${gh.code}):\n${gh.stdout}\n${gh.stderr}`.trim());
63
+ }
64
+ catch {
65
+ parts.push("gh: not installed or not on PATH");
66
+ }
67
+ if (fs.existsSync(path.join(cwd, ".git"))) {
68
+ const remote = await execCapture("git", ["remote", "-v"], cwd);
69
+ const branch = await execCapture("git", ["branch", "--show-current"], cwd);
70
+ parts.push(`git remote:\n${remote.stdout.trim() || remote.stderr.trim()}`);
71
+ parts.push(`git branch: ${branch.stdout.trim() || "(detached)"}`);
72
+ }
73
+ else {
74
+ parts.push("git: no .git in workspace (clone via kubsec_github_repository + remediation flow)");
75
+ }
76
+ return { content: [{ type: "text", text: parts.join("\n\n") }] };
77
+ },
78
+ });
79
+ api.registerTool({
80
+ name: "github_local_repo_summary",
81
+ label: "GitHub local repo summary",
82
+ description: "Lists top-level files and recent git log in workspace (requires --extended-context).",
83
+ parameters: Type.Object({}),
84
+ async execute() {
85
+ if (!extendedContextEnabled())
86
+ return denyExtended();
87
+ const cwd = resolveWorkspace();
88
+ const entries = fs.existsSync(cwd)
89
+ ? fs.readdirSync(cwd, { withFileTypes: true }).slice(0, 40).map((e) => (e.isDirectory() ? `${e.name}/` : e.name))
90
+ : [];
91
+ let logOut = "";
92
+ if (fs.existsSync(path.join(cwd, ".git"))) {
93
+ const log = await execCapture("git", ["log", "-5", "--oneline"], cwd);
94
+ logOut = log.stdout.trim() || log.stderr.trim();
95
+ }
96
+ const text = [
97
+ `workspace: ${cwd}`,
98
+ `entries: ${entries.join(", ") || "(empty)"}`,
99
+ logOut ? `recent commits:\n${logOut}` : "no git history",
100
+ ].join("\n\n");
101
+ return { content: [{ type: "text", text }] };
102
+ },
103
+ });
104
+ }
105
+ //# sourceMappingURL=kubbisec-github-local.extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kubbisec-github-local.extension.js","sourceRoot":"","sources":["../../src/extensions/kubbisec-github-local.extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ type ExtensionApi = {
2
+ on: (event: string, handler: (event: unknown, ctx: ExtensionContext) => void | Promise<unknown>) => void;
3
+ };
4
+ type ExtensionContext = {
5
+ hasUI: boolean;
6
+ ui: {
7
+ setStatus: (key: string, text: string | undefined) => void;
8
+ };
9
+ };
10
+ export default function kubbisecMemory(api: ExtensionApi): void;
11
+ export {};
12
+ //# sourceMappingURL=kubbisec-memory.extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kubbisec-memory.extension.d.ts","sourceRoot":"","sources":["../../src/extensions/kubbisec-memory.extension.ts"],"names":[],"mappings":"AAYA,KAAK,YAAY,GAAG;IAClB,EAAE,EAAE,CACF,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KACxE,IAAI,CAAC;CACX,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,EAAE,EAAE;QACF,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;KAC5D,CAAC;CACH,CAAC;AAkDF,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CA2E9D"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * KubbiSec memory extension — recall before turn, remember after turn.
3
+ */
4
+ import { addChatMemoryTurn, buildMemoryInjectBlock, extractRememberCandidates, isMemoryEnabled, searchChatMemory, } from "@kubbisec/chat-memory";
5
+ function resolveMemoryScope() {
6
+ const organizationId = process.env.KUBBISEC_ORG_ID?.trim();
7
+ const userId = process.env.KUBBISEC_USER_ID?.trim() ?? process.env.KUBBISEC_CLIENT_ID?.trim();
8
+ if (!organizationId || !userId)
9
+ return null;
10
+ const projectId = process.env.KUBBISEC_PROJECT_ID?.trim();
11
+ return {
12
+ organizationId,
13
+ userId,
14
+ ...(projectId ? { projectId } : {}),
15
+ };
16
+ }
17
+ function extractTextContent(content) {
18
+ if (typeof content === "string")
19
+ return content;
20
+ if (!Array.isArray(content))
21
+ return "";
22
+ return content
23
+ .filter((block) => typeof block === "object" && block !== null)
24
+ .filter((block) => block.type === "text" && typeof block.text === "string")
25
+ .map((block) => block.text ?? "")
26
+ .join("\n");
27
+ }
28
+ function lastUserMessage(messages) {
29
+ for (let i = messages.length - 1; i >= 0; i -= 1) {
30
+ const msg = messages[i];
31
+ if (msg?.role === "user") {
32
+ return extractTextContent(msg.content);
33
+ }
34
+ }
35
+ return "";
36
+ }
37
+ export default function kubbisecMemory(api) {
38
+ let lastUserPrompt = "";
39
+ api.on("before_agent_start", async (event) => {
40
+ if (!isMemoryEnabled())
41
+ return undefined;
42
+ const scope = resolveMemoryScope();
43
+ if (!scope)
44
+ return undefined;
45
+ const { prompt } = event;
46
+ lastUserPrompt = prompt;
47
+ try {
48
+ const memories = await Promise.race([
49
+ searchChatMemory(scope, prompt, 5),
50
+ new Promise((_, reject) => {
51
+ setTimeout(() => reject(new Error("recall_timeout")), 3000);
52
+ }),
53
+ ]);
54
+ const block = buildMemoryInjectBlock(memories);
55
+ if (!block)
56
+ return undefined;
57
+ return {
58
+ message: {
59
+ customType: "kubbisec-memory-inject",
60
+ content: block,
61
+ display: false,
62
+ },
63
+ };
64
+ }
65
+ catch {
66
+ return undefined;
67
+ }
68
+ });
69
+ api.on("turn_end", async (event, ctx) => {
70
+ if (!isMemoryEnabled())
71
+ return;
72
+ if (!lastUserPrompt || lastUserPrompt.length < 20)
73
+ return;
74
+ const scope = resolveMemoryScope();
75
+ if (!scope)
76
+ return;
77
+ const turn = event;
78
+ if (turn.message.role !== "assistant")
79
+ return;
80
+ const assistantText = extractTextContent(turn.message.content);
81
+ const candidates = extractRememberCandidates(lastUserPrompt, assistantText);
82
+ for (const candidate of candidates) {
83
+ await addChatMemoryTurn(scope, candidate);
84
+ }
85
+ if (ctx.hasUI && candidates.length > 0) {
86
+ ctx.ui.setStatus("kubbisec-memory", `memory · ${candidates.length}`);
87
+ }
88
+ });
89
+ api.on("agent_end", async (event) => {
90
+ if (!isMemoryEnabled())
91
+ return;
92
+ const scope = resolveMemoryScope();
93
+ if (!scope)
94
+ return;
95
+ const agentEnd = event;
96
+ const userText = lastUserMessage(agentEnd.messages);
97
+ const assistantMsg = [...agentEnd.messages].reverse().find((m) => m.role === "assistant");
98
+ const assistantText = assistantMsg ? extractTextContent(assistantMsg.content) : "";
99
+ if (!userText || userText.length < 20)
100
+ return;
101
+ const candidates = extractRememberCandidates(userText, assistantText);
102
+ for (const candidate of candidates) {
103
+ await addChatMemoryTurn(scope, candidate);
104
+ }
105
+ });
106
+ }
107
+ //# sourceMappingURL=kubbisec-memory.extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kubbisec-memory.extension.js","sourceRoot":"","sources":["../../src/extensions/kubbisec-memory.extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ type ExtensionApi = {
2
+ registerTool: (def: {
3
+ name: string;
4
+ label: string;
5
+ description: string;
6
+ parameters: unknown;
7
+ execute: (toolCallId: string, params: Record<string, unknown>, signal: AbortSignal) => Promise<{
8
+ content: Array<{
9
+ type: "text";
10
+ text: string;
11
+ }>;
12
+ }>;
13
+ }) => void;
14
+ };
15
+ export default function kubbisecNausLocal(api: ExtensionApi): void;
16
+ export {};
17
+ //# sourceMappingURL=kubbisec-naus-local.extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kubbisec-naus-local.extension.d.ts","sourceRoot":"","sources":["../../src/extensions/kubbisec-naus-local.extension.ts"],"names":[],"mappings":"AAcA,KAAK,YAAY,GAAG;IAClB,YAAY,EAAE,CAAC,GAAG,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,CACP,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC;YAAE,OAAO,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC,CAAA;SAAE,CAAC,CAAC;KAClE,KAAK,IAAI,CAAC;CACZ,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAsHjE"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Local `naus` CLI tools — only when KUBBISEC_CHAT_EXTENDED_CONTEXT=1
3
+ */
4
+ import { Type } from "@earendil-works/pi-ai";
5
+ import { denyExtendedContextMessage, execCapture, extendedContextEnabled, formatExecResult, NAUS_LOCAL_RUN_TIMEOUT_MS, resolvePathInWorkspace, resolveWorkspace, } from "./cli-local-shared.js";
6
+ export default function kubbisecNausLocal(api) {
7
+ api.registerTool({
8
+ name: "naus_local_status",
9
+ label: "Naus CLI status",
10
+ description: "Checks if `naus` is on PATH and shows help excerpt (requires kubbisec chat --extended-context).",
11
+ parameters: Type.Object({}),
12
+ async execute() {
13
+ if (!extendedContextEnabled())
14
+ return denyExtendedContextMessage();
15
+ const cwd = resolveWorkspace();
16
+ const parts = [`workspace: ${cwd}`];
17
+ try {
18
+ const which = await execCapture("which", ["naus"], cwd);
19
+ parts.push(formatExecResult("which", ["naus"], cwd, which));
20
+ const help = await execCapture("naus", ["--help"], cwd);
21
+ parts.push(formatExecResult("naus", ["--help"], cwd, help));
22
+ }
23
+ catch {
24
+ parts.push("naus: not installed or not on PATH (npm install -g @kubbisec/naus)");
25
+ }
26
+ return { content: [{ type: "text", text: parts.join("\n\n") }] };
27
+ },
28
+ });
29
+ api.registerTool({
30
+ name: "naus_local_validate",
31
+ label: "Naus validate file",
32
+ description: "Runs `naus validate <path>` in the workspace (extended context).",
33
+ parameters: Type.Object({
34
+ path: Type.String({ description: "Pipeline YAML path relative to workspace" }),
35
+ }),
36
+ async execute(_id, params) {
37
+ if (!extendedContextEnabled())
38
+ return denyExtendedContextMessage();
39
+ const cwd = resolveWorkspace();
40
+ const filePath = resolvePathInWorkspace(String(params.path), cwd);
41
+ try {
42
+ const result = await execCapture("naus", ["validate", filePath], cwd);
43
+ return {
44
+ content: [{ type: "text", text: formatExecResult("naus", ["validate", filePath], cwd, result) }],
45
+ };
46
+ }
47
+ catch (err) {
48
+ return {
49
+ content: [
50
+ {
51
+ type: "text",
52
+ text: err instanceof Error ? err.message : String(err),
53
+ },
54
+ ],
55
+ };
56
+ }
57
+ },
58
+ });
59
+ api.registerTool({
60
+ name: "naus_local_plan",
61
+ label: "Naus plan pipeline",
62
+ description: "Runs `naus plan <path>` (optional mermaid format) in the workspace.",
63
+ parameters: Type.Object({
64
+ path: Type.String({ description: "Pipeline YAML path relative to workspace" }),
65
+ format: Type.Optional(Type.Union([Type.Literal("text"), Type.Literal("mermaid")], {
66
+ description: "Output format (default text)",
67
+ })),
68
+ }),
69
+ async execute(_id, params) {
70
+ if (!extendedContextEnabled())
71
+ return denyExtendedContextMessage();
72
+ const cwd = resolveWorkspace();
73
+ const filePath = resolvePathInWorkspace(String(params.path), cwd);
74
+ const fmt = params.format === "mermaid" ? "mermaid" : "text";
75
+ const args = ["plan", filePath, "--format", fmt];
76
+ try {
77
+ const result = await execCapture("naus", args, cwd);
78
+ return {
79
+ content: [{ type: "text", text: formatExecResult("naus", args, cwd, result) }],
80
+ };
81
+ }
82
+ catch (err) {
83
+ return {
84
+ content: [{ type: "text", text: err instanceof Error ? err.message : String(err) }],
85
+ };
86
+ }
87
+ },
88
+ });
89
+ api.registerTool({
90
+ name: "naus_local_run",
91
+ label: "Naus run pipeline locally",
92
+ description: "Runs `naus run <path>` on this machine (up to 15 min). Prefer cloud `trigger_run` for KubbiSec CI.",
93
+ parameters: Type.Object({
94
+ path: Type.String({ description: "Pipeline YAML path relative to workspace" }),
95
+ }),
96
+ async execute(_id, params, signal) {
97
+ if (!extendedContextEnabled())
98
+ return denyExtendedContextMessage();
99
+ const cwd = resolveWorkspace();
100
+ const filePath = resolvePathInWorkspace(String(params.path), cwd);
101
+ const args = ["run", filePath];
102
+ try {
103
+ const result = await execCapture("naus", args, cwd, {
104
+ signal,
105
+ timeoutMs: NAUS_LOCAL_RUN_TIMEOUT_MS,
106
+ });
107
+ const note = "\n\nNote: for KubbiSec-hosted CI use API tool trigger_run after set_pipeline_yaml.";
108
+ return {
109
+ content: [
110
+ {
111
+ type: "text",
112
+ text: formatExecResult("naus", args, cwd, result) + note,
113
+ },
114
+ ],
115
+ };
116
+ }
117
+ catch (err) {
118
+ return {
119
+ content: [{ type: "text", text: err instanceof Error ? err.message : String(err) }],
120
+ };
121
+ }
122
+ },
123
+ });
124
+ }
125
+ //# sourceMappingURL=kubbisec-naus-local.extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kubbisec-naus-local.extension.js","sourceRoot":"","sources":["../../src/extensions/kubbisec-naus-local.extension.ts"],"names":[],"mappings":"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"}