siclaw 0.1.0 → 0.1.2

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 (270) hide show
  1. package/README.md +75 -114
  2. package/dist/agentbox/gateway-client.d.ts +2 -1
  3. package/dist/agentbox/gateway-client.js +6 -2
  4. package/dist/agentbox/gateway-client.js.map +1 -1
  5. package/dist/agentbox/http-server.js +184 -19
  6. package/dist/agentbox/http-server.js.map +1 -1
  7. package/dist/agentbox/resource-handlers.d.ts +1 -0
  8. package/dist/agentbox/resource-handlers.js +23 -23
  9. package/dist/agentbox/resource-handlers.js.map +1 -1
  10. package/dist/agentbox/session.js +85 -5
  11. package/dist/agentbox/session.js.map +1 -1
  12. package/dist/agentbox-main.d.ts +2 -1
  13. package/dist/agentbox-main.js +65 -18
  14. package/dist/agentbox-main.js.map +1 -1
  15. package/dist/cli-credentials.d.ts +1 -0
  16. package/dist/cli-credentials.js +109 -0
  17. package/dist/cli-credentials.js.map +1 -0
  18. package/dist/cli-first-run.d.ts +11 -0
  19. package/dist/cli-first-run.js +99 -0
  20. package/dist/cli-first-run.js.map +1 -0
  21. package/dist/cli-main.js +33 -11
  22. package/dist/cli-main.js.map +1 -1
  23. package/dist/cli-setup.d.ts +5 -11
  24. package/dist/cli-setup.js +12 -225
  25. package/dist/cli-setup.js.map +1 -1
  26. package/dist/core/agent-factory.d.ts +4 -0
  27. package/dist/core/agent-factory.js +102 -151
  28. package/dist/core/agent-factory.js.map +1 -1
  29. package/dist/core/config.d.ts +10 -3
  30. package/dist/core/config.js +11 -95
  31. package/dist/core/config.js.map +1 -1
  32. package/dist/core/extensions/deep-investigation.d.ts +2 -1
  33. package/dist/core/extensions/deep-investigation.js +144 -24
  34. package/dist/core/extensions/deep-investigation.js.map +1 -1
  35. package/dist/core/extensions/setup.d.ts +8 -0
  36. package/dist/core/extensions/setup.js +669 -0
  37. package/dist/core/extensions/setup.js.map +1 -0
  38. package/dist/core/llm-proxy.js +7 -3
  39. package/dist/core/llm-proxy.js.map +1 -1
  40. package/dist/core/mcp-client.d.ts +0 -10
  41. package/dist/core/mcp-client.js +0 -65
  42. package/dist/core/mcp-client.js.map +1 -1
  43. package/dist/core/prompt.d.ts +1 -1
  44. package/dist/core/prompt.js +42 -5
  45. package/dist/core/prompt.js.map +1 -1
  46. package/dist/core/provider-presets.d.ts +14 -0
  47. package/dist/core/provider-presets.js +81 -0
  48. package/dist/core/provider-presets.js.map +1 -0
  49. package/dist/cron/cron-coordinator.d.ts +2 -0
  50. package/dist/cron/cron-coordinator.js +46 -14
  51. package/dist/cron/cron-coordinator.js.map +1 -1
  52. package/dist/cron/cron-executor.js +33 -8
  53. package/dist/cron/cron-executor.js.map +1 -1
  54. package/dist/cron/cron-scheduler.d.ts +1 -1
  55. package/dist/cron/gateway-client.d.ts +5 -0
  56. package/dist/cron/gateway-client.js +43 -8
  57. package/dist/cron/gateway-client.js.map +1 -1
  58. package/dist/cron-main.js +39 -9
  59. package/dist/cron-main.js.map +1 -1
  60. package/dist/gateway/agentbox/client.d.ts +11 -0
  61. package/dist/gateway/agentbox/client.js +18 -0
  62. package/dist/gateway/agentbox/client.js.map +1 -1
  63. package/dist/gateway/agentbox/k8s-spawner.d.ts +11 -2
  64. package/dist/gateway/agentbox/k8s-spawner.js +95 -52
  65. package/dist/gateway/agentbox/k8s-spawner.js.map +1 -1
  66. package/dist/gateway/agentbox/local-spawner.d.ts +1 -1
  67. package/dist/gateway/agentbox/local-spawner.js +4 -2
  68. package/dist/gateway/agentbox/local-spawner.js.map +1 -1
  69. package/dist/gateway/agentbox/manager.d.ts +0 -10
  70. package/dist/gateway/agentbox/manager.js +11 -30
  71. package/dist/gateway/agentbox/manager.js.map +1 -1
  72. package/dist/gateway/agentbox/types.d.ts +6 -4
  73. package/dist/gateway/cron/cron-service.d.ts +49 -0
  74. package/dist/gateway/cron/cron-service.js +259 -0
  75. package/dist/gateway/cron/cron-service.js.map +1 -0
  76. package/dist/gateway/db/init-schema.js +44 -0
  77. package/dist/gateway/db/init-schema.js.map +1 -1
  78. package/dist/gateway/db/migrate-sqlite.js +73 -4
  79. package/dist/gateway/db/migrate-sqlite.js.map +1 -1
  80. package/dist/gateway/db/repositories/chat-repo.d.ts +56 -2
  81. package/dist/gateway/db/repositories/chat-repo.js +132 -2
  82. package/dist/gateway/db/repositories/chat-repo.js.map +1 -1
  83. package/dist/gateway/db/repositories/config-repo.d.ts +31 -2
  84. package/dist/gateway/db/repositories/config-repo.js +57 -7
  85. package/dist/gateway/db/repositories/config-repo.js.map +1 -1
  86. package/dist/gateway/db/repositories/env-repo.d.ts +14 -0
  87. package/dist/gateway/db/repositories/env-repo.js +15 -2
  88. package/dist/gateway/db/repositories/env-repo.js.map +1 -1
  89. package/dist/gateway/db/repositories/model-config-repo.d.ts +1 -1
  90. package/dist/gateway/db/repositories/model-config-repo.js +26 -12
  91. package/dist/gateway/db/repositories/model-config-repo.js.map +1 -1
  92. package/dist/gateway/db/repositories/skill-repo.d.ts +0 -5
  93. package/dist/gateway/db/repositories/skill-review-repo.d.ts +1 -0
  94. package/dist/gateway/db/repositories/skill-review-repo.js +4 -1
  95. package/dist/gateway/db/repositories/skill-review-repo.js.map +1 -1
  96. package/dist/gateway/db/repositories/skill-version-repo.js +0 -1
  97. package/dist/gateway/db/repositories/skill-version-repo.js.map +1 -1
  98. package/dist/gateway/db/repositories/system-config-repo.d.ts +1 -1
  99. package/dist/gateway/db/repositories/system-config-repo.js +2 -1
  100. package/dist/gateway/db/repositories/system-config-repo.js.map +1 -1
  101. package/dist/gateway/db/repositories/user-env-config-repo.d.ts +13 -0
  102. package/dist/gateway/db/repositories/user-env-config-repo.js +11 -0
  103. package/dist/gateway/db/repositories/user-env-config-repo.js.map +1 -1
  104. package/dist/gateway/db/repositories/workspace-repo.d.ts +3 -2
  105. package/dist/gateway/db/repositories/workspace-repo.js +6 -2
  106. package/dist/gateway/db/repositories/workspace-repo.js.map +1 -1
  107. package/dist/gateway/db/schema-mysql.d.ts +473 -51
  108. package/dist/gateway/db/schema-mysql.js +35 -4
  109. package/dist/gateway/db/schema-mysql.js.map +1 -1
  110. package/dist/gateway/db/schema-sqlite.d.ts +522 -57
  111. package/dist/gateway/db/schema-sqlite.js +38 -6
  112. package/dist/gateway/db/schema-sqlite.js.map +1 -1
  113. package/dist/gateway/db/schema.d.ts +471 -51
  114. package/dist/gateway/db/schema.js +1 -1
  115. package/dist/gateway/db/schema.js.map +1 -1
  116. package/dist/gateway/metrics-aggregator.d.ts +65 -0
  117. package/dist/gateway/metrics-aggregator.js +244 -0
  118. package/dist/gateway/metrics-aggregator.js.map +1 -0
  119. package/dist/gateway/plugins/channel-bridge.d.ts +4 -1
  120. package/dist/gateway/plugins/channel-bridge.js +78 -86
  121. package/dist/gateway/plugins/channel-bridge.js.map +1 -1
  122. package/dist/gateway/rpc-methods.d.ts +4 -2
  123. package/dist/gateway/rpc-methods.js +962 -163
  124. package/dist/gateway/rpc-methods.js.map +1 -1
  125. package/dist/gateway/security/cert-manager.d.ts +2 -2
  126. package/dist/gateway/security/cert-manager.js +4 -2
  127. package/dist/gateway/security/cert-manager.js.map +1 -1
  128. package/dist/gateway/server.d.ts +4 -8
  129. package/dist/gateway/server.js +297 -261
  130. package/dist/gateway/server.js.map +1 -1
  131. package/dist/gateway/skills/file-writer.js +17 -11
  132. package/dist/gateway/skills/file-writer.js.map +1 -1
  133. package/dist/gateway/skills/script-evaluator.js +12 -9
  134. package/dist/gateway/skills/script-evaluator.js.map +1 -1
  135. package/dist/gateway/web/dist/assets/index-0p17ZeTP.js +740 -0
  136. package/dist/gateway/web/dist/assets/index-9eP6nPUq.js +741 -0
  137. package/dist/gateway/web/dist/assets/index-9eP6nPUq.js.map +1 -0
  138. package/dist/gateway/web/dist/assets/index-CAmSY91d.js +675 -0
  139. package/dist/gateway/web/dist/assets/index-DMFEh8Pp.css +1 -0
  140. package/dist/gateway/web/dist/assets/index-DyowBCEj.css +1 -0
  141. package/dist/gateway/web/dist/assets/index-PDK5JJDO.css +1 -0
  142. package/dist/gateway/web/dist/index.html +2 -2
  143. package/dist/gateway-main.js +27 -10
  144. package/dist/gateway-main.js.map +1 -1
  145. package/dist/memory/embeddings.js +5 -4
  146. package/dist/memory/embeddings.js.map +1 -1
  147. package/dist/memory/indexer.d.ts +23 -3
  148. package/dist/memory/indexer.js +235 -23
  149. package/dist/memory/indexer.js.map +1 -1
  150. package/dist/memory/schema.js +15 -1
  151. package/dist/memory/schema.js.map +1 -1
  152. package/dist/memory/types.d.ts +18 -0
  153. package/dist/memory/types.js +6 -1
  154. package/dist/memory/types.js.map +1 -1
  155. package/dist/shared/detect-language.d.ts +12 -0
  156. package/dist/shared/detect-language.js +78 -0
  157. package/dist/shared/detect-language.js.map +1 -0
  158. package/dist/shared/diagnostic-events.d.ts +70 -0
  159. package/dist/shared/diagnostic-events.js +38 -0
  160. package/dist/shared/diagnostic-events.js.map +1 -0
  161. package/dist/shared/local-collector.d.ts +56 -0
  162. package/dist/shared/local-collector.js +284 -0
  163. package/dist/shared/local-collector.js.map +1 -0
  164. package/dist/shared/metrics-types.d.ts +64 -0
  165. package/dist/shared/metrics-types.js +25 -0
  166. package/dist/shared/metrics-types.js.map +1 -0
  167. package/dist/shared/metrics.d.ts +19 -0
  168. package/dist/shared/metrics.js +185 -0
  169. package/dist/shared/metrics.js.map +1 -0
  170. package/dist/shared/path-utils.d.ts +15 -0
  171. package/dist/shared/path-utils.js +23 -0
  172. package/dist/shared/path-utils.js.map +1 -0
  173. package/dist/shared/retry.d.ts +35 -0
  174. package/dist/shared/retry.js +61 -0
  175. package/dist/shared/retry.js.map +1 -0
  176. package/dist/tools/command-sets.d.ts +18 -2
  177. package/dist/tools/command-sets.js +207 -32
  178. package/dist/tools/command-sets.js.map +1 -1
  179. package/dist/tools/command-validator.d.ts +56 -0
  180. package/dist/tools/command-validator.js +357 -0
  181. package/dist/tools/command-validator.js.map +1 -0
  182. package/dist/tools/create-skill.js +26 -1
  183. package/dist/tools/create-skill.js.map +1 -1
  184. package/dist/tools/credential-list.js +1 -23
  185. package/dist/tools/credential-list.js.map +1 -1
  186. package/dist/tools/credential-manager.d.ts +98 -0
  187. package/dist/tools/credential-manager.js +313 -0
  188. package/dist/tools/credential-manager.js.map +1 -0
  189. package/dist/tools/deep-search/engine.js +184 -127
  190. package/dist/tools/deep-search/engine.js.map +1 -1
  191. package/dist/tools/deep-search/prompts.d.ts +10 -2
  192. package/dist/tools/deep-search/prompts.js +37 -36
  193. package/dist/tools/deep-search/prompts.js.map +1 -1
  194. package/dist/tools/deep-search/schemas.d.ts +87 -0
  195. package/dist/tools/deep-search/schemas.js +85 -0
  196. package/dist/tools/deep-search/schemas.js.map +1 -0
  197. package/dist/tools/deep-search/sub-agent.d.ts +21 -0
  198. package/dist/tools/deep-search/sub-agent.js +153 -4
  199. package/dist/tools/deep-search/sub-agent.js.map +1 -1
  200. package/dist/tools/deep-search/tool.js +1 -0
  201. package/dist/tools/deep-search/tool.js.map +1 -1
  202. package/dist/tools/deep-search/types.d.ts +2 -0
  203. package/dist/tools/deep-search/types.js.map +1 -1
  204. package/dist/tools/dp-tools.js +29 -5
  205. package/dist/tools/dp-tools.js.map +1 -1
  206. package/dist/tools/exec-utils.d.ts +85 -0
  207. package/dist/tools/exec-utils.js +294 -0
  208. package/dist/tools/exec-utils.js.map +1 -0
  209. package/dist/tools/fork-skill.js +14 -2
  210. package/dist/tools/fork-skill.js.map +1 -1
  211. package/dist/tools/investigation-feedback.d.ts +3 -0
  212. package/dist/tools/investigation-feedback.js +71 -0
  213. package/dist/tools/investigation-feedback.js.map +1 -0
  214. package/dist/tools/manage-schedule.js +16 -6
  215. package/dist/tools/manage-schedule.js.map +1 -1
  216. package/dist/tools/netns-script.js +27 -281
  217. package/dist/tools/netns-script.js.map +1 -1
  218. package/dist/tools/node-exec.d.ts +2 -14
  219. package/dist/tools/node-exec.js +18 -225
  220. package/dist/tools/node-exec.js.map +1 -1
  221. package/dist/tools/node-script.js +14 -168
  222. package/dist/tools/node-script.js.map +1 -1
  223. package/dist/tools/pod-exec.d.ts +1 -1
  224. package/dist/tools/pod-exec.js +10 -26
  225. package/dist/tools/pod-exec.js.map +1 -1
  226. package/dist/tools/pod-nsenter-exec.js +21 -225
  227. package/dist/tools/pod-nsenter-exec.js.map +1 -1
  228. package/dist/tools/pod-script.js +10 -19
  229. package/dist/tools/pod-script.js.map +1 -1
  230. package/dist/tools/restricted-bash.d.ts +1 -17
  231. package/dist/tools/restricted-bash.js +38 -252
  232. package/dist/tools/restricted-bash.js.map +1 -1
  233. package/dist/tools/run-skill.d.ts +3 -1
  234. package/dist/tools/run-skill.js +21 -1
  235. package/dist/tools/run-skill.js.map +1 -1
  236. package/dist/tools/script-resolver.d.ts +3 -1
  237. package/dist/tools/script-resolver.js +74 -30
  238. package/dist/tools/script-resolver.js.map +1 -1
  239. package/dist/tools/update-skill.js +17 -6
  240. package/dist/tools/update-skill.js.map +1 -1
  241. package/package.json +8 -6
  242. package/siclaw.mjs +10 -1
  243. package/skills/core/cluster-events/SKILL.md +1 -1
  244. package/skills/core/deep-investigation/SKILL.md +11 -0
  245. package/skills/core/deployment-rollout-debug/SKILL.md +1 -1
  246. package/skills/core/dns-debug/SKILL.md +1 -0
  247. package/skills/core/meta.json +12 -1
  248. package/skills/core/networkpolicy-debug/SKILL.md +332 -0
  249. package/skills/core/node-logs/scripts/get-node-logs.sh +19 -9
  250. package/skills/core/pod-pending-debug/SKILL.md +1 -0
  251. package/skills/core/quota-debug/SKILL.md +203 -0
  252. package/skills/core/service-debug/SKILL.md +1 -0
  253. package/skills/core/statefulset-debug/SKILL.md +280 -0
  254. package/skills/core/volcano-diagnose-pod/SKILL.md +196 -0
  255. package/skills/core/volcano-diagnose-pod/scripts/diagnose-pod.sh +175 -0
  256. package/skills/core/volcano-gang-scheduling/SKILL.md +299 -0
  257. package/skills/core/volcano-job-diagnose/SKILL.md +319 -0
  258. package/skills/core/volcano-job-diagnose/scripts/diagnose-job.sh +253 -0
  259. package/skills/core/volcano-node-resources/SKILL.md +334 -0
  260. package/skills/core/volcano-node-resources/scripts/get-node-resources.sh +281 -0
  261. package/skills/core/volcano-queue-diagnose/SKILL.md +294 -0
  262. package/skills/core/volcano-queue-diagnose/scripts/diagnose-queue.sh +283 -0
  263. package/skills/core/volcano-resource-insufficient/SKILL.md +315 -0
  264. package/skills/core/volcano-scheduler-config/SKILL.md +371 -0
  265. package/skills/core/volcano-scheduler-config/scripts/get-scheduler-config.sh +297 -0
  266. package/skills/core/volcano-scheduler-logs/SKILL.md +241 -0
  267. package/skills/core/volcano-scheduler-logs/scripts/get-scheduler-logs.sh +159 -0
  268. package/skills/platform/create-skill/SKILL.md +35 -3
  269. package/skills/platform/manage-skill/SKILL.md +9 -2
  270. package/skills/platform/update-skill/SKILL.md +17 -6
@@ -0,0 +1,313 @@
1
+ /**
2
+ * Generic credential registration, removal, and listing for TUI mode.
3
+ *
4
+ * Writes the same manifest.json + credential files format used by Gateway's
5
+ * buildCredentialPayload(), so credential_list tool works identically.
6
+ */
7
+ import { execFile } from "node:child_process";
8
+ import fs from "node:fs";
9
+ import path from "node:path";
10
+ import yaml from "js-yaml";
11
+ import { resolveUnderDir } from "../shared/path-utils.js";
12
+ // ---------------------------------------------------------------------------
13
+ // Helpers
14
+ // ---------------------------------------------------------------------------
15
+ function safeName(name) {
16
+ const cleaned = name.replace(/[^a-zA-Z0-9_-]/g, "_").replace(/^_+|_+$/g, "");
17
+ if (!cleaned)
18
+ throw new Error("Credential name must contain at least one alphanumeric character");
19
+ return cleaned;
20
+ }
21
+ /** Reject values that could inject SSH config directives (newlines, leading whitespace). */
22
+ function sanitizeSshField(value, fieldName) {
23
+ const trimmed = value.trim();
24
+ if (!trimmed)
25
+ throw new Error(`${fieldName} must not be empty`);
26
+ if (/[\r\n]/.test(trimmed))
27
+ throw new Error(`${fieldName} must not contain newlines`);
28
+ return trimmed;
29
+ }
30
+ function ensureDir(dir) {
31
+ if (!fs.existsSync(dir)) {
32
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
33
+ }
34
+ }
35
+ function readManifest(credentialsDir) {
36
+ const manifestPath = path.join(credentialsDir, "manifest.json");
37
+ if (!fs.existsSync(manifestPath))
38
+ return [];
39
+ try {
40
+ const parsed = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
41
+ return Array.isArray(parsed) ? parsed : [];
42
+ }
43
+ catch {
44
+ return [];
45
+ }
46
+ }
47
+ function writeManifest(credentialsDir, manifest) {
48
+ ensureDir(credentialsDir);
49
+ fs.writeFileSync(path.join(credentialsDir, "manifest.json"), JSON.stringify(manifest, null, 2) + "\n", { mode: 0o600 });
50
+ }
51
+ function writeCredentialFile(credentialsDir, filename, content, mode = 0o600) {
52
+ const filePath = resolveUnderDir(credentialsDir, filename);
53
+ fs.writeFileSync(filePath, content, { mode });
54
+ }
55
+ // ---------------------------------------------------------------------------
56
+ // Kubeconfig probing (extracted from credential-list.ts)
57
+ // ---------------------------------------------------------------------------
58
+ /** Probe a kubeconfig with `kubectl version` (3s timeout, parallel-safe). */
59
+ export function probeKubeconfig(kubeconfigPath) {
60
+ return new Promise((resolve) => {
61
+ execFile("kubectl", ["version", "--output=json", `--kubeconfig=${kubeconfigPath}`, "--request-timeout=3s"], { timeout: 5000 }, (err, stdout) => {
62
+ if (err) {
63
+ const msg = err.message?.includes("timed out")
64
+ ? "connection timeout"
65
+ : err.message?.split("\n")[0] ?? "unknown error";
66
+ resolve({ reachable: false, error: msg });
67
+ return;
68
+ }
69
+ try {
70
+ const info = JSON.parse(stdout);
71
+ const ver = info.serverVersion?.gitVersion ?? "unknown";
72
+ resolve({ reachable: true, version: ver });
73
+ }
74
+ catch {
75
+ resolve({ reachable: true, version: "unknown" });
76
+ }
77
+ });
78
+ });
79
+ }
80
+ export function registerKubeconfig(credentialsDir, opts) {
81
+ let content;
82
+ if (opts.content) {
83
+ content = opts.content;
84
+ }
85
+ else if (opts.sourcePath) {
86
+ const resolvedPath = path.resolve(opts.sourcePath);
87
+ if (!fs.existsSync(resolvedPath)) {
88
+ return { error: `File not found: ${resolvedPath}` };
89
+ }
90
+ content = fs.readFileSync(resolvedPath, "utf-8");
91
+ }
92
+ else {
93
+ return { error: "Either sourcePath or content is required" };
94
+ }
95
+ // Validate YAML
96
+ let metadata;
97
+ try {
98
+ const kc = yaml.load(content);
99
+ if (!kc || typeof kc !== "object") {
100
+ return { error: "Invalid kubeconfig: not a YAML object" };
101
+ }
102
+ const clusters = kc?.clusters ?? [];
103
+ const contexts = kc?.contexts ?? [];
104
+ metadata = {
105
+ clusters: clusters.map((c) => ({ name: c.name, server: c.cluster?.server })),
106
+ contexts: contexts.map((c) => ({
107
+ name: c.name,
108
+ cluster: c.context?.cluster,
109
+ namespace: c.context?.namespace,
110
+ })),
111
+ currentContext: kc?.["current-context"],
112
+ };
113
+ }
114
+ catch (err) {
115
+ return { error: `Invalid kubeconfig YAML: ${err instanceof Error ? err.message : String(err)}` };
116
+ }
117
+ const safe = safeName(opts.name);
118
+ const filename = `${safe}.kubeconfig`;
119
+ ensureDir(credentialsDir);
120
+ writeCredentialFile(credentialsDir, filename, content);
121
+ const entry = {
122
+ name: opts.name,
123
+ type: "kubeconfig",
124
+ description: opts.description ?? null,
125
+ files: [filename],
126
+ ...(metadata ? { metadata } : {}),
127
+ };
128
+ // Update manifest
129
+ const manifest = readManifest(credentialsDir).filter((e) => e.name !== opts.name);
130
+ manifest.push(entry);
131
+ writeManifest(credentialsDir, manifest);
132
+ return { entry };
133
+ }
134
+ export function registerSshPassword(credentialsDir, opts) {
135
+ const safe = safeName(opts.name);
136
+ const fileNames = [];
137
+ ensureDir(credentialsDir);
138
+ // Sanitize SSH fields against config injection
139
+ const host = sanitizeSshField(opts.host, "host");
140
+ const username = sanitizeSshField(opts.username, "username");
141
+ // SSH config
142
+ const sshConfigLines = [`Host ${safe}`];
143
+ sshConfigLines.push(` HostName ${host}`);
144
+ if (opts.port)
145
+ sshConfigLines.push(` Port ${opts.port}`);
146
+ sshConfigLines.push(` User ${username}`);
147
+ sshConfigLines.push(" StrictHostKeyChecking accept-new");
148
+ const sshConfigFile = `${safe}.ssh_config`;
149
+ writeCredentialFile(credentialsDir, sshConfigFile, sshConfigLines.join("\n") + "\n");
150
+ fileNames.push(sshConfigFile);
151
+ // Password file
152
+ const pwFile = `${safe}.password`;
153
+ writeCredentialFile(credentialsDir, pwFile, opts.password, 0o600);
154
+ fileNames.push(pwFile);
155
+ const entry = {
156
+ name: opts.name,
157
+ type: "ssh_password",
158
+ description: opts.description ?? null,
159
+ files: fileNames,
160
+ metadata: {
161
+ host: opts.host,
162
+ ...(opts.port ? { port: opts.port } : {}),
163
+ username: opts.username,
164
+ },
165
+ };
166
+ const manifest = readManifest(credentialsDir).filter((e) => e.name !== opts.name);
167
+ manifest.push(entry);
168
+ writeManifest(credentialsDir, manifest);
169
+ return { entry };
170
+ }
171
+ export function registerSshKey(credentialsDir, opts) {
172
+ const resolvedKeyPath = path.resolve(opts.keyPath);
173
+ if (!fs.existsSync(resolvedKeyPath)) {
174
+ return { error: `Key file not found: ${resolvedKeyPath}` };
175
+ }
176
+ const safe = safeName(opts.name);
177
+ const fileNames = [];
178
+ ensureDir(credentialsDir);
179
+ // Copy private key
180
+ const keyContent = fs.readFileSync(resolvedKeyPath, "utf-8");
181
+ const keyFile = `${safe}.key`;
182
+ writeCredentialFile(credentialsDir, keyFile, keyContent, 0o600);
183
+ fileNames.push(keyFile);
184
+ // Sanitize SSH fields against config injection
185
+ const host = sanitizeSshField(opts.host, "host");
186
+ const username = sanitizeSshField(opts.username, "username");
187
+ // SSH config
188
+ const sshConfigLines = [`Host ${safe}`];
189
+ sshConfigLines.push(` HostName ${host}`);
190
+ if (opts.port)
191
+ sshConfigLines.push(` Port ${opts.port}`);
192
+ sshConfigLines.push(` User ${username}`);
193
+ sshConfigLines.push(` IdentityFile ${path.join(credentialsDir, keyFile)}`);
194
+ sshConfigLines.push(" StrictHostKeyChecking accept-new");
195
+ const sshConfigFile = `${safe}.ssh_config`;
196
+ writeCredentialFile(credentialsDir, sshConfigFile, sshConfigLines.join("\n") + "\n");
197
+ fileNames.push(sshConfigFile);
198
+ const entry = {
199
+ name: opts.name,
200
+ type: "ssh_key",
201
+ description: opts.description ?? null,
202
+ files: fileNames,
203
+ metadata: {
204
+ host: opts.host,
205
+ ...(opts.port ? { port: opts.port } : {}),
206
+ username: opts.username,
207
+ },
208
+ };
209
+ const manifest = readManifest(credentialsDir).filter((e) => e.name !== opts.name);
210
+ manifest.push(entry);
211
+ writeManifest(credentialsDir, manifest);
212
+ return { entry };
213
+ }
214
+ export function registerApiToken(credentialsDir, opts) {
215
+ const safe = safeName(opts.name);
216
+ ensureDir(credentialsDir);
217
+ const tokenData = {};
218
+ if (opts.url)
219
+ tokenData.url = opts.url;
220
+ tokenData.token = opts.token;
221
+ const tokenFile = `${safe}.token`;
222
+ writeCredentialFile(credentialsDir, tokenFile, JSON.stringify(tokenData, null, 2), 0o600);
223
+ const entry = {
224
+ name: opts.name,
225
+ type: "api_token",
226
+ description: opts.description ?? null,
227
+ files: [tokenFile],
228
+ metadata: { ...(opts.url ? { url: opts.url } : {}) },
229
+ };
230
+ const manifest = readManifest(credentialsDir).filter((e) => e.name !== opts.name);
231
+ manifest.push(entry);
232
+ writeManifest(credentialsDir, manifest);
233
+ return { entry };
234
+ }
235
+ export function registerApiBasicAuth(credentialsDir, opts) {
236
+ const safe = safeName(opts.name);
237
+ ensureDir(credentialsDir);
238
+ const authData = {};
239
+ if (opts.url)
240
+ authData.url = opts.url;
241
+ authData.username = opts.username;
242
+ authData.password = opts.password;
243
+ const authFile = `${safe}.auth`;
244
+ writeCredentialFile(credentialsDir, authFile, JSON.stringify(authData, null, 2), 0o600);
245
+ const entry = {
246
+ name: opts.name,
247
+ type: "api_basic_auth",
248
+ description: opts.description ?? null,
249
+ files: [authFile],
250
+ metadata: {
251
+ ...(opts.url ? { url: opts.url } : {}),
252
+ username: opts.username,
253
+ },
254
+ };
255
+ const manifest = readManifest(credentialsDir).filter((e) => e.name !== opts.name);
256
+ manifest.push(entry);
257
+ writeManifest(credentialsDir, manifest);
258
+ return { entry };
259
+ }
260
+ // ---------------------------------------------------------------------------
261
+ // Remove
262
+ // ---------------------------------------------------------------------------
263
+ export function removeCredential(credentialsDir, name) {
264
+ const manifest = readManifest(credentialsDir);
265
+ const entry = manifest.find((e) => e.name === name);
266
+ if (!entry)
267
+ return { removed: false };
268
+ // Delete credential files (with path traversal check)
269
+ for (const file of entry.files) {
270
+ try {
271
+ const filePath = resolveUnderDir(credentialsDir, file);
272
+ fs.unlinkSync(filePath);
273
+ }
274
+ catch { /* file may already be gone or path invalid */ }
275
+ }
276
+ // Update manifest
277
+ const updated = manifest.filter((e) => e.name !== name);
278
+ writeManifest(credentialsDir, updated);
279
+ return { removed: true };
280
+ }
281
+ // ---------------------------------------------------------------------------
282
+ // List
283
+ // ---------------------------------------------------------------------------
284
+ export async function listCredentials(credentialsDir) {
285
+ const manifest = readManifest(credentialsDir);
286
+ // Probe kubeconfigs in parallel
287
+ const entries = manifest.map((e) => ({ ...e }));
288
+ const kubeconfigs = entries.filter((e) => e.type === "kubeconfig");
289
+ if (kubeconfigs.length > 0) {
290
+ const probes = await Promise.all(kubeconfigs.map(async (c) => {
291
+ const kubeconfigFile = c.files.find((f) => f.endsWith(".kubeconfig")) ?? c.files[0];
292
+ const fullPath = path.join(credentialsDir, kubeconfigFile);
293
+ return { name: c.name, probe: await probeKubeconfig(fullPath) };
294
+ }));
295
+ for (const { name, probe } of probes) {
296
+ const cred = entries.find((c) => c.name === name);
297
+ if (cred) {
298
+ cred.reachable = probe.reachable;
299
+ if (probe.version)
300
+ cred.server_version = probe.version;
301
+ if (probe.error)
302
+ cred.probe_error = probe.error;
303
+ }
304
+ }
305
+ }
306
+ return entries;
307
+ }
308
+ // ---------------------------------------------------------------------------
309
+ // Test-only exports (not part of public API)
310
+ // ---------------------------------------------------------------------------
311
+ /** @internal Exposed for unit testing only. */
312
+ export const _testing = { safeName, sanitizeSshField, readManifest };
313
+ //# sourceMappingURL=credential-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-manager.js","sourceRoot":"","sources":["../../src/tools/credential-manager.ts"],"names":[],"mappings":"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"}